pax_global_header00006660000000000000000000000064125230033500014503gustar00rootroot0000000000000052 comment=661b7e100c8d971790aee2969110ba8cfbfb8a9d freelan-2.0/000077500000000000000000000000001252300335000127605ustar00rootroot00000000000000freelan-2.0/.gitmodules000066400000000000000000000013221252300335000151330ustar00rootroot00000000000000[submodule "libcryptoplus"] path = libcryptoplus url = ../libcryptoplus.git [submodule "libiconvplus"] path = libiconvplus url = ../libiconvplus.git [submodule "libfscp"] path = libfscp url = ../libfscp.git [submodule "libasiotap"] path = libasiotap url = ../libasiotap.git [submodule "libfreelan"] path = libfreelan url = ../libfreelan.git [submodule "freelan"] path = freelan url = ../freelan.git [submodule "freelan-buildtools"] path = freelan-buildtools url = ../freelan-buildtools.git [submodule "freelan-server"] path = freelan-server url = ../freelan-server.git [submodule "libkfather"] path = libkfather url = ../libkfather.git [submodule "freelan-gui"] path = freelan-gui url = ../freelan-gui freelan-2.0/.party000066400000000000000000000176451252300335000141350ustar00rootroot00000000000000from teapot import * # General settings set_option('cache_root', 'third-party/cache') set_option('sources_root', 'third-party/sources') set_option('builds_root', 'third-party/builds') set_option('prefix', 'third-party/install') # libiconv Attendee('iconv', filter='msvc').add_source('folder://third-party/source/libiconv-msvc') Attendee('iconv').add_build('msvc-x86', environment='system', filter='msvc-x86', prefix='x86') Attendee('iconv').get_build('msvc-x86').commands = [ r'msbuild libiconv.sln /p:Platformtoolset={{msvc_toolset}} /p:Configuration=ReleaseStatic /p:Platform="Win32"', r'msbuild libiconv.sln /p:Platformtoolset={{msvc_toolset}} /p:Configuration=DebugStatic /p:Platform="Win32"', r'md {{prefix}}\Release\lib || echo', r'md {{prefix}}\Release\include || echo', r'md {{prefix}}\Debug\lib || echo', r'md {{prefix}}\Debug\include || echo', r'copy ReleaseStatic_Win32\libiconvStatic.lib {{prefix}}\Release\lib\libiconv.lib', r'copy DebugStatic_Win32\libiconvStaticD.lib {{prefix}}\Debug\lib\libiconvd.lib', r'xcopy include\* {{prefix}}\Release\include\ /S /Y', r'xcopy include\* {{prefix}}\Debug\include\ /S /Y', ] Attendee('iconv').add_build('msvc-x64', environment='system', filter='msvc-x64', prefix='x64') Attendee('iconv').get_build('msvc-x64').commands = [ r'msbuild libiconv.sln /p:Platformtoolset={{msvc_toolset}} /p:Configuration=ReleaseStatic /p:Platform="x64"', r'msbuild libiconv.sln /p:Platformtoolset={{msvc_toolset}} /p:Configuration=DebugStatic /p:Platform="x64"', r'md {{prefix}}\Release\lib || echo', r'md {{prefix}}\Release\include || echo', r'md {{prefix}}\Debug\lib || echo', r'md {{prefix}}\Debug\include || echo', r'copy ReleaseStatic_x64\libiconvStatic.lib {{prefix}}\Release\lib\libiconv.lib', r'copy DebugStatic_x64\libiconvStaticD.lib {{prefix}}\Debug\lib\libiconvd.lib', r'xcopy include\* {{prefix}}\Release\include\ /S /Y', r'xcopy include\* {{prefix}}\Debug\include\ /S /Y', ] # boost Attendee('boost', filter=~f('linux')) Attendee('boost').add_source('http://sourceforge.net/projects/boost/files/boost/1.57.0/boost_1_57_0.tar.bz2/download', filter=~f('windows'), mimetype='application/x-bzip2') Attendee('boost').add_source('http://sourceforge.net/projects/boost/files/boost/1.57.0/boost_1_57_0.zip/download', filter='windows', mimetype='application/zip') Attendee('boost').add_build('osx', environment='system', filter='darwin') Attendee('boost').get_build('osx').commands = [ './bootstrap.sh', './b2 --prefix={{prefix}} --layout=system --without-serialization toolset=clang cxxflags="-std=c++11 -stdlib=libc++" linkflags="-std=c++11 -stdlib=libc++" variant=release link=static threading=multi runtime-link=shared address-model=64 install', 'mkdir -p {{prefix}}/bin', 'cp bjam {{prefix}}/bin/', ] Attendee('boost').add_build('msvc-x86', environment='system', filter='msvc-x86', prefix='x86') Attendee('boost').get_build('msvc-x86').commands = [ r'bootstrap.bat', r'b2 --prefix={{prefix}}\Release --layout=versioned --without-serialization toolset=msvc variant=release link=static threading=multi runtime-link=shared install', r'xcopy bjam.exe {{prefix}}\Release\bin\ /S /Y', r'b2 --prefix={{prefix}}\Debug --layout=versioned --without-serialization toolset=msvc variant=debug link=static threading=multi runtime-link=shared install', r'xcopy bjam.exe {{prefix}}\Debug\bin\ /S /Y', ] Attendee('boost').add_build('msvc-x64', environment='system', filter='msvc-x64', prefix='x64') Attendee('boost').get_build('msvc-x64').commands = [ r'bootstrap.bat', r'b2 --prefix={{prefix}}\Release --layout=versioned --without-serialization toolset=msvc variant=release link=static threading=multi runtime-link=shared address-model=64 install', r'xcopy bjam.exe {{prefix}}\Release\bin\ /S /Y', r'b2 --prefix={{prefix}}\Debug --layout=versioned --without-serialization toolset=msvc variant=debug link=static threading=multi runtime-link=shared address-model=64 install', r'xcopy bjam.exe {{prefix}}\Debug\bin\ /S /Y', ] # OpenSSL Attendee('openssl', filter=~f('linux')) Attendee('openssl').add_source('http://www.openssl.org/source/openssl-1.0.2a.tar.gz') Attendee('openssl').add_build('osx', environment='system', filter='darwin') Attendee('openssl').get_build('osx').commands = [ './Configure no-shared no-asm --prefix={{prefix}} darwin64-x86_64-cc', 'make', 'make install', ] Attendee('openssl').add_post_unpack_command(r'xcopy {{root}}\third-party\patches\openssl1.0.2a\* . /S /Y', filter='windows') Attendee('openssl').add_build('msvc-x86', environment='system', filter='msvc-x86', prefix='x86/Release') Attendee('openssl').get_build('msvc-x86').commands = [ r'perl Configure VC-WIN32 no-asm --prefix={{prefix}}', r'ms\do_ms', r'nmake -f ms\ntdll.mak', r'nmake -f ms\ntdll.mak install', r'xcopy out32dll\libeay32.pdb {{prefix}}\bin\ /S /Y', r'xcopy out32dll\ssleay32.pdb {{prefix}}\bin\ /S /Y', ] Attendee('openssl').add_build('msvc-x86-debug', environment='system', filter='msvc-x86', prefix='x86/Debug') Attendee('openssl').get_build('msvc-x86-debug').commands = [ r'perl Configure debug-VC-WIN32 no-asm --prefix={{prefix}}', r'ms\do_ms', r'nmake -f ms\ntdll.mak', r'nmake -f ms\ntdll.mak install', r'xcopy out32dll.dbg\libeay32.pdb {{prefix}}\bin\ /S /Y', r'xcopy out32dll.dbg\ssleay32.pdb {{prefix}}\bin\ /S /Y', ] Attendee('openssl').add_build('msvc-x64', environment='system', filter='msvc-x64', prefix='x64/Release') Attendee('openssl').get_build('msvc-x64').commands = [ r'perl Configure VC-WIN64A no-asm --prefix={{prefix}}', r'ms\do_win64a', r'nmake -f ms\ntdll.mak', r'nmake -f ms\ntdll.mak install', r'xcopy out32dll\libeay32.pdb {{prefix}}\bin\ /S /Y', r'xcopy out32dll\ssleay32.pdb {{prefix}}\bin\ /S /Y', ] Attendee('openssl').add_build('msvc-x64-debug', environment='system', filter='msvc-x64', prefix='x64/Debug') Attendee('openssl').get_build('msvc-x64-debug').commands = [ r'perl Configure debug-VC-WIN64A no-asm --prefix={{prefix}}', r'ms\do_win64a', r'nmake -f ms\ntdll.mak', r'nmake -f ms\ntdll.mak install', r'xcopy out32dll.dbg\libeay32.pdb {{prefix}}\bin\ /S /Y', r'xcopy out32dll.dbg\ssleay32.pdb {{prefix}}\bin\ /S /Y', ] # cURL Attendee('curl', filter=~f('linux')) Attendee('curl').add_source('http://curl.askapache.com/download/curl-7.41.0.zip', filter='windows', mimetype='application/zip') Attendee('curl').add_source('http://curl.askapache.com/download/curl-7.41.0.tar.bz2', filter=~f('windows'), mimetype='application/x-bzip2') Attendee('curl').depends_on('openssl') Attendee('curl').add_build('osx', environment='system', filter='darwin') Attendee('curl').get_build('osx').commands = [ 'sh configure --enable-static -disable-shared --without-darwinssl --with-ssl={{prefix}} --prefix={{prefix}}', 'make', 'make install', ] Attendee('curl').add_build('msvc-x86', environment='system', filter='msvc-x86', prefix='x86', subdir='winbuild') Attendee('curl').get_build('msvc-x86').commands = [ r'nmake /f Makefile.vc mode=static VC=12 WITH_DEVEL={{prefix}} DEBUG=no GEN_PDB=yes MACHINE=x86', r'xcopy ..\\builds\libcurl-vc12-x86-release-static-ipv6-sspi-winssl {{prefix}}\Release\ /S /Y', r'nmake /f Makefile.vc mode=static VC=12 WITH_DEVEL={{prefix}} DEBUG=yes GEN_PDB=yes MACHINE=x86', r'xcopy ..\\builds\libcurl-vc12-x86-debug-static-ipv6-sspi-winssl {{prefix}}\Debug\ /S /Y', ] Attendee('curl').add_build('msvc-x64', environment='system', filter='msvc-x64', prefix='x64', subdir='winbuild') Attendee('curl').get_build('msvc-x64').commands = [ r'nmake /f Makefile.vc mode=static VC=12 WITH_DEVEL={{prefix}} DEBUG=no GEN_PDB=yes MACHINE=x64', r'xcopy ..\builds\libcurl-vc12-x64-release-static-ipv6-sspi-winssl {{prefix}}\Release\ /S /Y', r'nmake /f Makefile.vc mode=static VC=12 WITH_DEVEL={{prefix}} DEBUG=yes GEN_PDB=yes MACHINE=x64', r'xcopy ..\builds\libcurl-vc12-x64-debug-static-ipv6-sspi-winssl {{prefix}}\Debug\ /S /Y', ] freelan-2.0/.travis.yml000066400000000000000000000004701252300335000150720ustar00rootroot00000000000000language: cpp compiler: - clang script: scons install apps samples branches: only: - none before_install: - sudo apt-get update -qq - sudo apt-get install libboost1.53-all-dev libssl-dev libcurl4-openssl-dev notifications: email: on_success: change on_failure: always freelan-2.0/.valgrind-suppressions000066400000000000000000000004161252300335000173430ustar00rootroot00000000000000{ Enthropy source Memcheck:Cond obj:*libcrypto.so* } { Enthropy source Memcheck:Value8 obj:*libcrypto.so* } { Enthropy source Memcheck:Value8 ... fun:RSA_generate_key } { Enthropy source Memcheck:Cond ... fun:RSA_generate_key } freelan-2.0/BUILD.md000066400000000000000000000047401252300335000141460ustar00rootroot00000000000000Build instructions ================== Third-party libraries --------------------- FreeLAN depends on the following libraries: - libcurl4 - boost - OpenSSL - iconv (Windows) Generally Linux users can just use the binaries provided by their package manager, but other platforms such as Mac OSX or Windows may need to build these libraries explicitely. To build the third-party libraries, you can use [teapot](https://github.com/freelan-developers/teapot). Check its [documentation](http://teapot-builder.readthedocs.org/en/latest/) for details, or just type the following command at the root of FreeLAN's repository: > teapot build This will build everything inside `third-party`. Once that is done, you can proceed with the next steps. ### Debian Linux To install the required dependencies on Debian Linux (Or Ubuntu), type the following command: > sudo apt-get install scons python libssl-dev libcurl4-openssl-dev libboost-system-dev libboost-thread-dev libboost-program-options-dev libboost-filesystem-dev libboost-iostreams-dev Building FreeLAN ---------------- FreeLAN is written in C++11. Make sure your C++ compiler is recent enough and supports this standard. On Linux for instance, you need at least `gcc >= 4.8` for things to go fine. FreeLAN uses [scons](http://www.scons.org/) as its build system on POSIX-like systems (basically everything except Windows). To build the main binary, just type: > scons To build everything in the directory (including samples), type instead: > scons samples To build then install everything into a specific directory, type instead: > scons install prefix=/usr/local/ ### Debugging If the debug-level logging exposed with the `-d` parameter to freelan does not expose enough information to assist development or bug-finding, it is possible to enable additional debug information at build time with: > scons all --mode=debug Be aware that this will produce a significant amount of logging information and is not intended for production use. ### Windows You will need Microsoft Visual Studio 2013 to compile freelan. All projects come with a `.vcxproj` file for all the targets (debug/release and x86/x64). The root directory also contains a solution file (`.sln`) that references all the sub-projects. The resulting binaries will be located in the [install](install) directory. ### Mac OSX On Mac OSX, an additional SCons target exists to build the freelan installation package: > scons package The package will be generated at the root of the repository. freelan-2.0/CONTRIBUTING.md000066400000000000000000000010371252300335000152120ustar00rootroot00000000000000Contributing ============ Contributions to FreeLAN are greatly appreciated. To improve the chances of your pull-requests to be accepted, make sure that: - Your code compiles, on all platforms. - Your changes don't introduce a security weakness or encourage a bad usage. - Your changes are of public utility. - There aren't (too many) spelling or grammar mistakes. Feel free to suggest improvements, ideas or to add new features. Do not hesitate to ask for help on the [mailing-list](http://freelan.org/development.html) if you need some ! freelan-2.0/LICENSE000066400000000000000000000043241252300335000137700ustar00rootroot00000000000000/* * freelan - An open, multi-platform peer-to-peer networking software. * Copyright (C) 2010-2011 Julien Kauffmann * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. */ Certain source files in this program permit linking with the OpenSSL library (http://www.openssl.org), which otherwise wouldn't be allowed under the GPL. For purposes of identifying OpenSSL, most source files giving this permission limit it to versions of OpenSSL having a license identical to that listed in this file (LICENSE.OpenSSL). It is not necessary for the copyright years to match between this file and the OpenSSL version in question. However, note that because this file is an extension of the license statements of these source files, this file may not be changed except with permission from all copyright holders of source files in this program which reference this file. freelan-2.0/Makefile000066400000000000000000000004731252300335000144240ustar00rootroot00000000000000PRODUCT_NAME:=freelan PRODUCT_VERSION:=$(shell git describe) default: install install: # Install the files to ${DESTDIR} (defaults to /) scons install prefix=/ build: scons all samples package: git archive HEAD --prefix=${PRODUCT_NAME}-${PRODUCT_VERSION}/ | gzip > ${PRODUCT_NAME}-${PRODUCT_VERSION}.tar.gz freelan-2.0/Makefile.windows000066400000000000000000000010361252300335000161110ustar00rootroot00000000000000# This Makefile is targeted for nmake.exe (on Windows). # # To compile on Linux or Mac OSX, use `scons` (SConstruct). default: build build: build_x64 build_x86 clean: clean_x64 clean_x86 build_x64: msbuild freelan-all.sln /p:Configuration=Release /p:Platform=x64 /t:Build build_x86: msbuild freelan-all.sln /p:Configuration=Release /p:Platform=Win32 /t:Build clean_x64: msbuild freelan-all.sln /p:Configuration=Release /p:Platform=x64 /t:Clean clean_x86: msbuild freelan-all.sln /p:Configuration=Release /p:Platform=Win32 /t:Clean freelan-2.0/README.md000066400000000000000000000046151252300335000142450ustar00rootroot00000000000000# FreeLAN ### What is FreeLAN? A peer-to-peer, secure, easy-to-setup, multi-platform, open-source, highly-configurable VPN software. ### Installation FreeLAN is available on Windows, Mac OSX and Linux (Debian-based distributions). Check the [official website](http://www.freelan.org) for installers. If your platform is not officially supported, dot not despair and try to build-it yourself ! Check the [build instructions](BUILD.md) for details on how to do that. ### Quick-start FreeLAN can be configured to support any network topology, be it a traditional client-server structure or a full-mesh one. The emulated network can operate at the Ethernet or at the IPv4/IPv6 levels. Security can be achieved through the use of certificates or via a simple shared passphrase. For instance, creating a simple VPN node can be done with: freelan --security.passphrase "my secret" This will start a VPN node, listening for connections on all interfaces on the port UDP:12000. The node will pick the default 9.0.0.1 IPv4 address inside the emulated network. To connect to another node, just specify the `fscp.contact` option, like so: freelan --security.passphrase "my secret" --fscp.contact 1.2.3.4:12000 Each node should have a different virtual IP address: you can specify the IPv4 address to use with the `tap_adapter.ipv4_address_prefix_length` option, like so: freelan --security.passphrase "my secret" --tap_adapter.ipv4_address_prefix_length 9.0.0.2/24 Check out the [configuration file](apps/freelan/config/freelan.cfg) for details ! ### Frequently Asked Questions #### Is there a graphical interface ? A graphical user interface is planned but nothing is made public yet. You will just have to be patient :) #### Can I use FreeLAN to access forbidden websites/websites in other countries with restrictions ? FreeLAN is not a service, it's a software. You can configure it to reach that goal easily, but you'll need an exit-point (a server, a friendly-computer at the right location) on which you can run FreeLAN too. **It will always take a minimum of 2 nodes to create a VPN network**. ### Donations You like FreeLAN and you would like to show your support and help development of next releases ? Check out the [donate page](http://freelan.org/donate.html#) ! ### Contributions Check the [contributions guidelines](CONTRIBUTING.md). ### Packaging Check the [packaging instructions](packaging/README.md). freelan-2.0/SConscript000066400000000000000000000042431252300335000147750ustar00rootroot00000000000000""" A SConscript file. Builds everything. """ import os import sys Import('env') env = env.Clone() dirs = { 'root': Dir('.'), 'include': Dir('include'), 'lib': Dir('lib'), 'bin': Dir('bin'), } env.Append(CPPPATH=[dirs['include']]) env.Append(CXXFLAGS=['-isystem', Dir('third-party/install/include').srcnode()]) env.Append(LIBPATH=[dirs['lib']]) env.Append(LIBPATH=[Dir('third-party/install/lib').srcnode()]) env.GenerateDefines(target=os.path.join('include', env.defines.defines_file_name), source=env.defines.template_file_path) libraries = [] includes = [] for x in Glob('libs/*'): sconscript_path = x.File('SConscript') if sconscript_path.exists(): name = os.path.basename(str(x)) if not sys.platform.startswith('linux'): if name in 'netlinkplus': continue library, library_includes = SConscript(sconscript_path, exports='env dirs name') libraries.extend(library) includes.extend(library_includes) apps = [] configurations = [] for x in Glob('apps/*'): sconscript_path = x.File('SConscript') if sconscript_path.exists(): name = os.path.basename(str(x)) app, configuration = SConscript(sconscript_path, exports='env dirs name') apps.extend(app) configurations.extend(configuration) samples = [] if env.mode != 'retail': for x in Glob('samples/*'): libname = os.path.basename(str(x)) if not sys.platform.startswith('linux'): if libname in 'netlinkplus': continue for y in x.glob('*'): sconscript_path = y.File('SConscript') if sconscript_path.exists(): name = 'sample_%s_%s' % (libname, os.path.basename(str(y))) sample = SConscript(sconscript_path, exports='env dirs name') samples.extend(sample) if env.mode == 'release': samples.extend(env.SymLink(y.File('%sd' % os.path.basename(str(y))).srcnode(), sample)) else: samples.extend(env.SymLink(y.File(os.path.basename(str(y))).srcnode(), sample)) Return('libraries includes apps samples configurations') freelan-2.0/SConstruct000066400000000000000000000125151252300335000150160ustar00rootroot00000000000000""" The SConstruct file. Works on all UNIX-like operating systems. """ import os import sys from fnmatch import fnmatch # This file is local. from defines import Defines AddOption( '--mode', dest='mode', nargs=1, action='store', choices=('all', 'debug', 'release'), default='all', help='The compilation mode.', ) class FreelanEnvironment(Environment): """ A freelan specific environment class. """ def __init__(self, mode, prefix, **kwargs): """ Initialize the environment. :param mode: The compilation mode. :param prefix: The installation prefix. """ super(FreelanEnvironment, self).__init__(**kwargs) # Inherit the environment from the context. self['ENV'] = os.environ self.defines = Defines() self.defines.register_into(self) for flag in [ 'CC', 'CXX', 'AR', 'LINK', ]: if flag in os.environ: self[flag] = os.environ[flag] for flag in [ 'CFLAGS', 'CXXFLAGS', 'CPPFLAGS', 'ARFLAGS', 'LDFLAGS', 'LINKFLAGS', 'LIBS', ]: if flag in os.environ: self[flag] = Split(os.environ[flag]) self.mode = mode self.prefix = prefix self.destdir = self['ENV'].get('DESTDIR', '') if self.destdir: self.install_prefix = os.path.normpath( os.path.abspath(self.destdir), ) + self.prefix else: self.install_prefix = self.prefix if os.path.basename(self['CXX']) == 'clang++': self.Append(CXXFLAGS=['-Qunused-arguments']) self.Append(CXXFLAGS=['-fcolor-diagnostics']) elif os.path.basename(self['CXX']).endswith('g++'): self.Append(CXXFLAGS=['-Wno-missing-field-initializers']) self.Append(CXXFLAGS=['--std=c++11']) self.Append(CXXFLAGS=['-Wall']) self.Append(CXXFLAGS=['-Wextra']) self.Append(CXXFLAGS=['-Werror']) self.Append(CXXFLAGS=['-pedantic']) self.Append(CXXFLAGS=['-Wshadow']) self.Append(LDFLAGS=['--std=c++11']) if sys.platform.startswith('darwin'): self.Append(CXXFLAGS=['-arch', 'x86_64']) self.Append(CXXFLAGS=['-DBOOST_ASIO_DISABLE_KQUEUE']) self.Append(CXXFLAGS=['--stdlib=libc++']) self.Append(LDFLAGS=['--stdlib=libc++']) if self.mode == 'debug': self.Append(CXXFLAGS=['-g']) self.Append(CXXFLAGS='-DFREELAN_DEBUG=1') else: self.Append(CXXFLAGS='-O3') self.Append(CPPDEFINES=r'FREELAN_INSTALL_PREFIX="\"%s\""' % self.prefix) def RGlob(self, path, patterns=None): """ Returns a list of file objects that match the specified patterns. """ path = unicode(path) if isinstance(patterns, basestring): patterns = [patterns] result = [] abspath = Dir(path).srcnode().abspath for root, ds, fs in os.walk(abspath): prefix = os.path.relpath(root, abspath) for f in fs: if not patterns or any(fnmatch(f, pattern) for pattern in patterns): result.append(File(os.path.join(path, prefix, f))) return result def RInstall(self, target, source, patterns=None): """ Install a directory, keeping its structure. """ files = self.RGlob(source, patterns) result = [] for f in files: result.append(self.Install(os.path.join(str(target), os.path.dirname(str(f))), f)) return result def SymLink(self, target, source): def create_symlink(target, source, env): os.symlink(os.path.abspath(str(source[0])), os.path.abspath(str(target[0]))) return self.Command(target, source, create_symlink) mode = GetOption('mode') prefix = os.path.normpath(os.path.abspath(ARGUMENTS.get('prefix', './install'))) if mode in ('all', 'release'): env = FreelanEnvironment(mode='release', prefix=prefix) libraries, includes, apps, samples, configurations = SConscript('SConscript', exports='env', variant_dir=os.path.join('build', env.mode)) install = env.Install(os.path.join(env.install_prefix, 'bin'), apps) install.extend(env.Install(os.path.join(env.install_prefix, 'etc', 'freelan'), configurations)) Alias('install', install) Alias('apps', apps) Alias('samples', samples) Alias('all', install + apps + samples) if mode in ('all', 'debug'): env = FreelanEnvironment(mode='debug', prefix=prefix) libraries, includes, apps, samples, configurations = SConscript('SConscript', exports='env', variant_dir=os.path.join('build', env.mode)) Alias('apps', apps) Alias('samples', samples) Alias('all', apps + samples) if sys.platform.startswith('darwin'): retail_prefix = '/usr/local' env = FreelanEnvironment(mode='retail', prefix=retail_prefix) libraries, includes, apps, samples, configurations = SConscript('SConscript', exports='env', variant_dir=os.path.join('build', env.mode)) package = SConscript('packaging/osx/SConscript', exports='env apps configurations retail_prefix') install_package = env.Install('.', package) Alias('package', install_package) Default('install') freelan-2.0/VERSION000066400000000000000000000000041252300335000140220ustar00rootroot000000000000002.0 freelan-2.0/Vagrantfile000066400000000000000000000032521252300335000151470ustar00rootroot00000000000000# -*- mode: ruby -*- # vi: set ft=ruby : # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.box = "ubuntu14.10_amd64" config.vm.box_url = "https://cloud-images.ubuntu.com/vagrant/utopic/current/utopic-server-cloudimg-amd64-vagrant-disk1.box" config.vm.define 'load-test' do |machine| machine.vm.hostname = 'freelan-load-test' machine.vm.network :private_network, ip: "192.168.10.10" end config.vm.define 'speed-test-a' do |machine| machine.vm.hostname = 'freelan-speed-test-a' machine.vm.network :private_network, ip: "192.168.10.20" end config.vm.define 'speed-test-b' do |machine| machine.vm.hostname = 'freelan-speed-test-b' machine.vm.network :private_network, ip: "192.168.10.21" end config.vm.provider "virtualbox" do |v| v.customize ["modifyvm", :id, "--memory", 2048] end config.vm.provision "ansible" do |ansible| ansible.playbook = "provisioning/playbook.yml" ansible.limit = 'all' # Uncomment the line below to get more output from ansible. #ansible.verbose = "v" # Uncomment the line below to skip tasks that require a connection to the Internet. # # Warning: it is highly recommended not to skip those tasks for at least the initial provisioning. #ansible.skip_tags = "needs_internet_connection" ansible.groups = { "load-test-group" => ["load-test"], "speed-test-group" => ["speed-test-a", "speed-test-b"], } end # If true, then any SSH connections made will enable agent forwarding. # Default value: false config.ssh.forward_agent = true end freelan-2.0/apps/000077500000000000000000000000001252300335000137235ustar00rootroot00000000000000freelan-2.0/apps/freelan/000077500000000000000000000000001252300335000153375ustar00rootroot00000000000000freelan-2.0/apps/freelan/CERTIFICATES.HOWTO.md000066400000000000000000000127171252300335000204350ustar00rootroot00000000000000Certificates generation ======================= FreeLAN provides security trough the use of X509 certificates. You may use any certificate and/or certificate authority(ies) you want, But if you never worked with X509 certificates, this how-to will help you getting started. This documentation assumes the use of OpenSSL for certificate generation. Ensure that you have it installed and that `openssl` is available from the command-line. Terminology ----------- Here are the definitions of some common terms used in this documentation: * certificate: Some data that identifies a host, computer, person. Certificates contains a public key and are *signed* asymmetrically by their **private key**. * private key: Some randomly generated data used to *sign* a certificate or to *cipher* some data. A private key is, as its name indicates, **private** and should **always** be kept secret in a secure location. If your private key is compromised, all the certificates, data, that it signed or ciphered **must** be considered unsafe. * certificate authority: A root certificate that signs other certificates and acts as a trust entity. * intermediate certificate authority: A certificate that is signed by a root or an intermediate certificate and used to sign other certificates. An intermediate certificate can be used to separate different groups of child certificates. * common name: The name indicated in a certificate that identifies the host, computer, person. Common names are case-sensitive. Let's go -------- ### Setting up the certificate authority Note: Everything detailed in this section can be done quickly and safely by calling the `create_ca.sh` script located in the `scripts` directory. The steps here are only provided for completeness. If you don't already have a certificate authority, follow these steps to create one. Choose a directory into which you will setup the certificate authority. This can be any directory: you just have to ensure that it will be readable only by you. In the next step, we assume you chose `/home/ca`: cd /home/ca mkdir crt key crl Next, we create a serial number file. This file just contains an ASN1 number indicating the serial number to use for the next generated certificate. This file acts exactly like a counter: echo '01' > serial Do the same for the `crlnumber` file: echo '01' > crlnumber We also create index files: touch index.txt touch index.txt.attr We must now create a configuration file for OpenSSL. This step is not mandatory since most options can be specified on the OpenSSL command line. However it is really **recommended** that you do not skip it as it simplifies the whole process *a lot*. Copy the template configuration file from `scripts\resources\ca.cnf`: cp /scripts/resources/ca.cnf . Edit the copied file and replace all occurences of `{CA_PATH}` by the real path you used. In our example, this would be `/home/ca`. Congratulations ! You just setup your first certificate authority :) ### Creating the authority certificate and its private key Note: Everything detailed in this section can be done quickly and safely by calling the `generate_ca.sh` script located in the `scripts` directory. The steps here are only provided for completeness. To create the certification authority certificate and its private key, just type: openssl req -new -x509 -extensions v3_ca -keyout key/ca.key -out crt/ca.crt -config ca.cnf ### Creating an intermediate certificate authority Note: Everything detailed in this section can be done quickly and safely by calling the `generate_intermediate_ca.sh` script located in the `scripts` directory. The steps here are only provided for completeness. To create an intermediate certification authority, repeat the same steps described in *Setting up the certificate authority* but change the directory. In this example, we consider that we want to create our intermediate certification authority in the `/home/intermediate_ca`. Create the intermediate certification authority private key file: openssl genrsa -des3 -out /key/ca.key 4096 -config $/home/intermediate_ca/ca.cnf Generate the certificate request: openssl req -new -sha1 -key $/home/intermediate_ca/key/ca.key -out $/home/intermediate_ca/crt/ca.csr -config $/home/intermediate_ca/ca.cnf Sign the certificate request with the root certification authority certificate: openssl ca -extensions v3_ca -out $/home/ca/crt/intermediate_ca.crt -in $/home/intermediate_ca/crt/ca.csr -config $/home/ca/ca.cnf Don't forget to copy the resulting certificate into the intermediate certification authority folder: cp $/home/ca/crt/intermediate_ca.crt $/home/intermediate_ca/crt/ca.crt ### Creating a client certificate Note: Everything detailed in this section can be done quickly and safely by calling the `generate_certificate.sh` script located in the `scripts` directory. The steps here are only provided for completeness. In this section we will create a certificate signed by the certification authority located at `/home/ca`. You may of course use any certification authority (a root or an intermediate one). Create the private key file: openssl genrsa -des3 -out user.key 4096 Generate the certificate request: openssl req -new -sha1 -key user.key -out user.csr Sign the certificate request with the certification authority certificate: openssl ca -out /home/ca/crt/user.crt -in user.csr -config /home/ca/ca.cnf Don't forget to copy the resulting certificate: cp /home/ca/crt/user.crt user.crt freelan-2.0/apps/freelan/README.md000066400000000000000000000016071252300335000166220ustar00rootroot00000000000000# What is FreeLAN? FreeLAN is a cross-platform daemon to establish IPv4/IPv6 peer-to-peer networks. The software supports the following operating systems: - Microsoft Windows (XP, Vista, Seven) - Linux - Mac OSX # Configuration A sample self-documented configuration file can be found in the [`config`](config) folder. If you need to generate a certification chain, read the [`CERTIFICATES.HOWTO.md`](CERTIFICATES.HOWTO.md) file. # Licensing All code is licensed under the GPLv3. See gpl-3.0.txt. If you are interested in using this project under a different license, please [contact me](mailto:julien.kauffmann__AT__freelan.org). I don't bite and I probably won't charge (at least, not much). # Does the project have a website ? Yes, it does. And [here](http://www.freelan.org) it is. You may also find the [git repository](https://github.com/freelan-developers/freelan-all) on github. freelan-2.0/apps/freelan/SConscript000066400000000000000000000016311252300335000173520ustar00rootroot00000000000000import os import sys Import('env dirs name') libraries = [ 'freelan', 'asiotap', 'fscp', 'mongooseplus', 'cryptoplus', 'executeplus', 'kfather', 'iconvplus', 'boost_system', 'boost_thread', 'boost_filesystem', 'boost_date_time', 'boost_program_options', 'boost_iostreams', 'curl', 'ssl', 'crypto', ] if sys.platform.startswith('linux'): libraries.extend([ 'pthread', 'netlinkplus', ]) elif sys.platform.startswith('darwin'): libraries.extend([ 'ldap', 'z', 'iconv', ]) env = env.Clone() env.Prepend(LIBS=libraries) sources = list(sorted(set(env.RGlob('src', '*.cpp')) - set(env.RGlob(os.path.join('src', 'windows'), '*.cpp')))) app = env.Program(target=os.path.join(str(dirs['bin']), name), source=sources) configuration = env.File(env.RGlob('config', '*.cfg')) Return('app configuration') freelan-2.0/apps/freelan/config/000077500000000000000000000000001252300335000166045ustar00rootroot00000000000000freelan-2.0/apps/freelan/config/alice.crt000066400000000000000000000023101252300335000203670ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDWjCCAkICCQCp02w1pasYDjANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJG UjEPMA0GA1UECBMGQWxzYWNlMRMwEQYDVQQHEwpTdHJhc2JvdXJnMRgwFgYDVQQK Ew93d3cuZnJlZWxhbi5vcmcxEDAOBgNVBAsTB2xpYmZzY3AxDjAMBgNVBAMTBWFs aWNlMB4XDTExMDQyODA4MjM0MVoXDTIxMDQyNTA4MjM0MVowbzELMAkGA1UEBhMC RlIxDzANBgNVBAgTBkFsc2FjZTETMBEGA1UEBxMKU3RyYXNib3VyZzEYMBYGA1UE ChMPd3d3LmZyZWVsYW4ub3JnMRAwDgYDVQQLEwdsaWJmc2NwMQ4wDAYDVQQDEwVh bGljZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANibOdleRebXSssm gg++gB/vpuWyJDpHZnN+0ZNC4kfmnH4JZ1ddKtrHonVL6dWNLbb1xjs6LFJHFlhl YvB3e/+AyjuJyWLmPsVPEnCqohwPIUv6I2PxG8xLIkMPDQHOej0C28ylGvXiAJmh SsGDvgLWBBzQU5588/qVdTP3OWLjdYb6LTV22i7vm8ouL8mODOc9vsyM8UrzaGjq 2P/sOchkyUIfTWfUG44ieFUcNZZ7U3Tv4TPvAwU53mO79MonOKcsFdr22YDWMTE4 j/SuHpq7KMDsdqu0keExqx+NJ4bJ/Qk/HeRLL5qqftQaU/UTefYTwwNPGYr35xH7 Hpd56b0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAlTEbe2gCNHA1oRXsHOaF4sm/ +fz9zs6VWDukuZdjggnMK+9ZHBioGTUUWHWI53tbvFVr1GwQ6V+hi/iPqFTkdtir 0QErPDqh32MWXG00AItxSFQIfu87MggMnVpBYNBOEu3kmWHGWu/pmQ59cYzLM4j4 s2kpqPhw02gCReN8H6izO0w483foO78V2PSNOPUlQfkY9bM2CQjYLhReR0X/b+1q MJHdZzY/UyyziXkUplbnuKknRFV0nVwVUdXqGKXgaV6ypfBz1xtDpk30SAx6rn9C C6ZaXlQkDZ+Sfh4FkYf0VUspJCifVt8LWdQOzRhcODH/PsDVhjssXtKkL7HAcg== -----END CERTIFICATE----- freelan-2.0/apps/freelan/config/alice.csr000066400000000000000000000012241252300335000203710ustar00rootroot00000000000000-----BEGIN CERTIFICATE REQUEST----- MIIBrzCCARgCAQAwbzELMAkGA1UEBhMCRlIxDzANBgNVBAgTBkFsc2FjZTETMBEG A1UEBxMKU3RyYXNib3VyZzEYMBYGA1UEChMPd3d3LmZyZWVsYW4ub3JnMRAwDgYD VQQLEwdsaWJmc2NwMQ4wDAYDVQQDEwVhbGljZTCBnzANBgkqhkiG9w0BAQEFAAOB jQAwgYkCgYEAvXDIShJZQjoEAUiTAX9+clIQtauClLUlFV0Z03WPHtNILKGQys6C 0tnzNg6fy+RuQbXkaAnP4tipx0bLNrBdUXl0BWAcdU3B6HGEt1C6o3qmb06bZ2ho cTvn3z9GlvfCckxjCsttdXaIfebXc3xupemI0GQGfo5P9BrFH33psqsCAwEAAaAA MA0GCSqGSIb3DQEBBQUAA4GBAJdGOr2W52GIzyN4zw3kbrq/hTEt778dkdv+o9Nh rAB9eV0jBaVU5S1f0gyKSv9KJdiPHPRg5vgdXYU7f20CxMNF9U86l8aiCC1pfKGa 5yoCVfAbzcgioIVtFQi9ov45KuGocOHQBc1iyepxt6FCj2U83Rv10tTgD+ExXpM2 kjdw -----END CERTIFICATE REQUEST----- freelan-2.0/apps/freelan/config/alice.key000066400000000000000000000032171252300335000203760ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEA2Js52V5F5tdKyyaCD76AH++m5bIkOkdmc37Rk0LiR+acfgln V10q2seidUvp1Y0ttvXGOzosUkcWWGVi8Hd7/4DKO4nJYuY+xU8ScKqiHA8hS/oj Y/EbzEsiQw8NAc56PQLbzKUa9eIAmaFKwYO+AtYEHNBTnnzz+pV1M/c5YuN1hvot NXbaLu+byi4vyY4M5z2+zIzxSvNoaOrY/+w5yGTJQh9NZ9QbjiJ4VRw1lntTdO/h M+8DBTneY7v0yic4pywV2vbZgNYxMTiP9K4emrsowOx2q7SR4TGrH40nhsn9CT8d 5Esvmqp+1BpT9RN59hPDA08ZivfnEfsel3npvQIDAQABAoIBAQCdfcfDD3Od013z dc1Na0K3dcWQ70S+Bxor0cLJ4vCqPLf+QBIeiIRXTJ4H0Sl091CM3gjDGZoOPNe3 cAhPNWE4NklUnuuJeEWdqs+KkdaKtkmMd5Rx32ZJ1TtVLMVVUe65G7H7CvUeYLP1 ADxdlc97OmcFGEgkTVAMG816+j+EcOygE2lND3WaeZ2TWFVhZfYEx9pRgHDT1Hpb nuwg8p3jpKhl9agmJEIIFGmNO41pJsbG/xj05USz6W/bDh+/bUbpF5l6HtS43IbY EtHiPnd1lkiDqMadaAXL1ojqRKKiSIR16aoP0cPTfPXgM0uJpLfzNP99GfS7jikk A7ALKPZ1AoGBAP4PIMbvctkdTkhG+JoOUB/QStu3Th9VsCDr1I43+4tj2abLKob5 PfVwtsJqKVscytNPQDwFQBsk4ZlCFUouLqlHDVt6pmhuN0WlPiiEge4AV6QeW7ti ONBp+Gi/8yjsKFCHNhJTN4zwmKfsWw94vpAHmxrN+agabQ+QJPDvPwqfAoGBANpC 2bAF8Lw2E0kCfLpFQGPLSj89OQFlFQsc9RIQugt6lV/K6QfN6uBBf9ZsM9m/DStd 3a0Z7w9IKmQbJSp5hIO3I6xGcyoRQ/5wMwTB9ye446Nwzf81keTvXWET5ssgTSE+ Dsh1IAPrYK7LSeSRN9tQSstoYT9GWn9NYElERsojAoGBALK/thIBms6DPfbAaF0L wPgBNwoLmF2Xjko7YtuFK+hQomwl+Y/pgNxVJ2D2DI7cXR/7XHheQVJXyppn0k7U 22OiaBV63+YN1bmcn3UmdbwcZY1FBsl6O/r29B3PH6glL+AoobSW9DinduB+/TqP e5QepdRgI01Q+na+th8GVVaFAoGBAM6swsnFtkHiyrw12Lnh3akh1Tqw1IwXlaei UgY7RJCeEVhWIfe7649TNqRqbWbhXK0WA1Vo21CTO2Dzu2vPCcZX4zW8uEy7cLE8 uXLl4Q4CK7yWktn5dh9c8gV8/OyXt7GkvAbhseFEP5cE9QG06TmJfGnEe2GZUxR8 xpJaTtYVAoGAUmVC6w+NUod4VdWBOpcldhFLouQ0XQFApWMWckJrz2D5r+a9cbkl vCdZpnDBhMbYAzAvj3TmU7khREVWjuMW82Fdc82/1qdyP2FfnsY4joU5yyE8Za5H tenGLZmsnq3tpmgkFiOx+SyS6O3X5CYn/nnOImK/eo1EoHD3yxlhcDs= -----END RSA PRIVATE KEY----- freelan-2.0/apps/freelan/config/bob.crt000066400000000000000000000023001252300335000200530ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDVjCCAj4CCQDHTnvDnwaDGjANBgkqhkiG9w0BAQUFADBtMQswCQYDVQQGEwJG UjEPMA0GA1UECBMGQWxzYWNlMRMwEQYDVQQHEwpTdHJhc2JvdXJnMRgwFgYDVQQK Ew93d3cuZnJlZWxhbi5vcmcxEDAOBgNVBAsTB2xpYmZzY3AxDDAKBgNVBAMTA2Jv YjAeFw0xMTA0MjgwODIzNTNaFw0yMTA0MjUwODIzNTNaMG0xCzAJBgNVBAYTAkZS MQ8wDQYDVQQIEwZBbHNhY2UxEzARBgNVBAcTClN0cmFzYm91cmcxGDAWBgNVBAoT D3d3dy5mcmVlbGFuLm9yZzEQMA4GA1UECxMHbGliZnNjcDEMMAoGA1UEAxMDYm9i MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv/b/ZgwsunphuUuRVZ1W e/p/WapsDPGR22SUugTP6/hwdujVLRqkkFZIdKtghbm4kV5k+pjI4XFvulu152YW ENi+XM4tiZDrBQa5BmG9p05a9gLBlSPmdeF/b8VBzcA7+jeByC6gjAWAYvKW1Xoj 8NV/2Sb2wpAd+QjAgg3+pslQAITb1ysgtvn1MAAKKajuSZ0ZxDCb+2bUs4255+// 0WdhzoR9eBXFQBrPUd90MD7WpHoxDPNG2biZQFFRZTQRbqmoTfP1EY4gIepwXiQo UY3UGKAzj+/7/152pkDqZ29av9e0Xm4Q4SPgVKBvErpSm6nh/9V2mLxLGY6TbOr3 IwIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQBDnQA8rurhouurOpSn0puyejdJPTvI 3EH7f8Uxa57CsTDT0vGSZ3R45PeAjljCim2sCtU9FRwHDNNgE1UmEmfy5h7pmbn3 TbaicHWECb/xyZgH2FLGgfCfsLZ13bRbZwEFo7N5PooOC3FhQeRYQ/br0Fu5pQIz NTJ1vRXy52YLwpbv2XiV1UwdtArN+B1g1xJAh9kzzUjeWQWRg+ICC/1FYI2TsVd5 LnFNAAxVDDg/2wageZ9g4LrxJBQFqj5dVV7Naki/2ICS9CbURmd55u3SO4C5ntL0 Wiuu/RgJ3wH+XaCB6+LyWbSTr2zVEPzCzkTuq+p4KyrmpLHvRrZJ9Pwe -----END CERTIFICATE----- freelan-2.0/apps/freelan/config/bob.csr000066400000000000000000000012241252300335000200560ustar00rootroot00000000000000-----BEGIN CERTIFICATE REQUEST----- MIIBrTCCARYCAQAwbTELMAkGA1UEBhMCRlIxDzANBgNVBAgTBkFsc2FjZTETMBEG A1UEBxMKU3RyYXNib3VyZzEYMBYGA1UEChMPd3d3LmZyZWVsYW4ub3JnMRAwDgYD VQQLEwdsaWJmc2NwMQwwCgYDVQQDEwNib2IwgZ8wDQYJKoZIhvcNAQEBBQADgY0A MIGJAoGBAL52fbZGYfRNKO2r7XRDc7eKz+k/1wEqTmuh1qexwL8Sd40I99RT+9gg rvvocTaTg2WsdmBpyQo3X/6/q6b8zS0LLeDNM7tRmpuX0G+G7svFHsyKAsXsbTN/ fFfEBvJPLk/mZ4FAus/WMLmoJMw95AP6vI7AExiDl7zBf2gHjEe9AgMBAAGgADAN BgkqhkiG9w0BAQUFAAOBgQAZUg6SqsRJ1tZ3GZ2IrNB6QZwvtIduxuzKKT7Qemin LZFPN4NWnH8DDWsTrjg3Hjx9/NOGPFmxaLC/nWcMIjZX7hy0VfzhhkbonZ0tP5da io2JbZG5pHXQnC9E4wq0+wx2AIEeap7PLFNiUe+N1chikIIIJGdUokJ1JB2KzyQ+ sA== -----END CERTIFICATE REQUEST----- freelan-2.0/apps/freelan/config/bob.key000066400000000000000000000032131252300335000200570ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAv/b/ZgwsunphuUuRVZ1We/p/WapsDPGR22SUugTP6/hwdujV LRqkkFZIdKtghbm4kV5k+pjI4XFvulu152YWENi+XM4tiZDrBQa5BmG9p05a9gLB lSPmdeF/b8VBzcA7+jeByC6gjAWAYvKW1Xoj8NV/2Sb2wpAd+QjAgg3+pslQAITb 1ysgtvn1MAAKKajuSZ0ZxDCb+2bUs4255+//0WdhzoR9eBXFQBrPUd90MD7WpHox DPNG2biZQFFRZTQRbqmoTfP1EY4gIepwXiQoUY3UGKAzj+/7/152pkDqZ29av9e0 Xm4Q4SPgVKBvErpSm6nh/9V2mLxLGY6TbOr3IwIDAQABAoIBAAsJcHW1jXzLPIMi zSBXA3ntVRUar0uvN+udRM/NJwcyKYUsrdUCCyQhUdkjYVFO9EWnX7boweP0WbAl RbggLnSZgZhkYknegySu1kR/qh/MaX5reiXRApcUd/c9KCNkQg6I0nVn+OMUDeWi fPmZJCfcnpUloFpfXtnKnwbbNyDvqKFtbHCYgePUH3KgJ5n1agNg4RfQi+dbI4Q9 sWN5Zs5CWlgwyzThrM/y8W7Oj1H8+bber8ZGFz+WU7Y6fYWnZKYumcecEzOMZT/M Cbs1/q9a367JdilBRXj8YDIAPrd9I8HjRuyabS9a+m3RQGnY91hJ97BiFABRAyny pTV4IcECgYEA5B6o1wZ4I0BjZSDQ/lUaART6NYAcIQO6VDdEAnOrtnzvQMLGjfu6 deDF4aBzMbJbj0QNoHqPJTB8tg+vNDSJCNkh60O3jaJRu6x6Cvw6UGm3CTb2ARpq XlwDFRYfpqgn9tekxr0S/6uYUgbSr+5vOW9U2B4o3g5pWjCgi2afxB8CgYEA120i R0KA0SSmpVd/4Uq0tBTqVUWZZCVlGuN5tTNl1H7JEr3OAqrEo4IiSW4Gv3cS239g swU4Rjwmd0M8OFtFyBHGyjTGz9EZAlbqCqo4ho6YWkJVnVlMFrDRyges5tKVb+4+ SX56eFuUrK/uenJ3lhk4O7ngefC1oERkCI9xTH0CgYAfFjqGCwCmNSkWZ/FzJ1/C 0/wA/HNY4Gws+9cNynuVA9OK7MAoKyzO0ZHF3Jq2JAssK+b7fpgxRjlIijyjDaG7 DfP8Xp8N8xfWTnvXMWY0/SMPY2kE33etYjadUgWALZw8nEh9ONj09IpuazWc+g44 Mn7KcNm64RXkT4ohVRvimwKBgD47NI/JUlUYdVuGL1bxscnj0N3ZQTqA4vglhl8l /eCoz4Uud3ilxDBHw4fa1PAygawO2+xbMap4bdQ+BANzunDVUcvP+y7FhKf8W5fB HJsiTjikuP6/cQ+M/M2T8gqsAqdW939bnh1ut0A7gnS05H7jwi7ev036jz1BBHTE m0IxAoGBAIofelEamY3n+hvM4brPrJIZ8GBBgpP3g+jz5t4j8uINtIbiHFF3ny2R q++RSb4OGAmHsy0erBHmOS24D59l2HV8PHzblNEn7bQPyP3ROdcXZpuRJJVubu9g OAfyAPkjyBVDLTumjW93ZRKLEXvX9feGObopSv+Pz9O3nvxpcpB1 -----END RSA PRIVATE KEY----- freelan-2.0/apps/freelan/config/freelan.cfg000066400000000000000000000631161252300335000207100ustar00rootroot00000000000000# This is the FreeLAN configuration file # # All file and directory paths are relative to this file. [server] # Whether to use the embedded HTTP(S) server. # # The embedded HTTP(S) server allows one host to sign certificates for other # hosts and to provide them with a centralized configuration. # # Possible values: yes, no # # Default: no #enabled=no # The endpoint to listen on. # # The endpoint can be in both numeric and hostname format, and must always # contain a port specification. # # Hostnames are resolved using the method specified by # network.hostname_resolution_protocol. # # Using a numeric value is recommended. # # Example values: 0.0.0.0:80, [::]:80, localhost:80, 10.0.0.1:80 # Default: 0.0.0.0:443 #listen_on=0.0.0.0:443 # The protocol. # # The protocol to use to contact the server. # # The only reason to specify something else than "https" here is if the # server is hosted behind a proxying web server. # # Note: while freelan's embedded web server is perfectly capable of # serving over https, its configuration options are really limited by # design. If you are serious about serving thousands of users over HTTPS # and/or need a complex certificate setup, switch to HTTP and host freelan's # web server behind a proxying web server that can handle the load (nginx, # apache, IIS). # # Default: https #protocol=https # The web server certificate file to use when in "https" mode. # # If no server certificate is specifed, one is generated using the hostname # guessed from the operating system which may or may not be the correct one. # # Default: #server_certificate_file= # The web server private key file associated to the certificate file. # # Default: #server_private_key_file= # The certificate authority certificate file used for signing. # # This file will be used to sign certificate requests issued by other hosts. # # If no certificate is provided, one will be generated on each run. This means # that the network won't be as robust as is NOT recommended. # # Default: #certification_authority_certificate_file= # The private key associated to the certification authority certificate file. # # This private key must match the specified certification authority certificate # file. # # Default: #certification_authority_private_key_file= # The authentication script to call. # # Every time an user tries to authenticate, this script will be called. # # The script environment will contain the following variables: # - FREELAN_USERNAME: The specified username. # - FREELAN_PASSWORD: The specified password. # - FREELAN_REMOTE_HOST: The hostname/address of the connecting user. # - FREELAN_REMOTE_PORT: The port number of the connecting user. # initiating the authentication request. # # If the script exit status is zero, the authentication is accepted. # If the script exit status is non-zero, the authentication is rejected. # # Warning: failing to specify an authentication_script will cause ALL # authentication requests to be rejected ! # # Default: #authentication_script= [client] # Whether to connect to a freelan server to get client information. # # Possible values: yes, no # # Default: no #enabled=no # The server endpoint to connect to. # # The endpoint can be in both numeric and hostname format, and must always # contain a port specification. # # Hostnames are resolved using the method specified by # network.hostname_resolution_protocol. # # Example values: 127.0.0.1:443, [fe80::1]:443, somehost:443 # Default: 127.0.0.1:443 #server_endpoint=127.0.0.1:443 # The protocol. # # The protocol to use to contact the server. # # Using another value than https completely nullifies security and must NEVER # be used in a production environment ! # # Default: https #protocol=https # Whether to disable peer verification. # # Turn off checks for peer certificate verification. Useful for accepting # self-signed certificates but be aware that this allows an attacker to pretend # he is the server and get your username and password. Should NEVER be used in # a production environment. # # Default: no #disable_peer_verification=no # Whether to disable host verification. # # Turn off checks for host certificate verification. This allows the remote host # to present any certificate, even with a non-matching hostname. This completely # nullifies security and should NEVER be used in production ! # a production environment. # # Default: no #disable_host_verification=no # The username. # # The username to use to connect to the server. # # Default: #username= # The password. # # The password to use to connect to the server. # # Default: #password= # Specify hostnames or IP addresses to advertise. # # You may repeat the public_endpoint option to add several hostnames or IP # addresses. # # Specifying either 0.0.0.0 or :: in an IP address declaration has a special # meaning: the server will replace the IP address with the visible address # of the host as it makes the HTTP(S) request. # # Note: if only :: is specified and the server is contacted using IPv4, then # the address is discarded. Same goes for the reverse situation (0.0.0.0 and # server contacted in IPv6). # # If the port number is omitted, then the currently bound port number will be # used instead before sending public endpoint information to the server. As a # result, specifying an explicit port number is only useful when your client # is behind a NAT-operating device that might change the source port number. # # Examples: 192.168.0.1, [fe80::1]:12000, hostname:1234, 0.0.0.0, :: # Default: public_endpoint=0.0.0.0 [fscp] # The protocol to use for hostname resolution. # # Possible values are: ipv4, ipv6 # # Default: ipv4 #hostname_resolution_protocol=ipv4 # The endpoint to listen on. # # The endpoint can be in both numeric and hostname format, and must always # contain a port specification. # # Hostnames are resolved using the method specified by # network.hostname_resolution_protocol. # # Using a numeric value is recommended. # # Example values: 0.0.0.0:12000, [::]:12000, localhost:12000, 10.0.0.1:12000 # Default: 0.0.0.0:12000 #listen_on=0.0.0.0:12000 # The interface to listen on. # # This options restricts all VPN traffic to the specified interface. This is # useful to avoid VPN death-loops in case the routing table is misconfigured. # # This option is only available on Linux. # # Example values: eth0, eth1, wlan0 # Default: #listen_on_device= # The timeout for hello messages. # # The time to wait for hello responses, in milliseconds. # # Default: 3000 #hello_timeout=3000 # The contact list. # # The list of hosts to connect to. # # You may repeat the contact option to add several hosts. # # Examples: 192.168.0.1, [fe80::1]:12000, hostname:1234, some.other.host.org:1234 # Default: #contact=192.168.0.1:12000 # Whether to accept contact requests. # # If set to yes, freelan will answer to contact requests sent by other hosts. # # It is recommended that this option is set to enhance connectivity. # # Possible values: yes, no # # Default: yes #accept_contact_requests=yes # Whether to accept contacts. # # If set to yes, freelan will accept contacts sent by other hosts and will try # to establish a session with those contacts, just as if there was a "contact=" # option for them. # # It is recommended that this option is set to enhance connectivity. # # To control which hosts are contacted automatically, see the "never_contact" # option. # # Possible values: yes, no # # Default: yes #accept_contacts=yes # Specify certificates for which a dynamic host search must be performed. # # The freelan daemon will periodically send a contact request to his neighbors # for each of these certificates. # # Note: this option can only be used with certificate-based authentication. If # you are using a passphrase there is no way of identifying the peers since # they all share the same secret passhrase. There is no way of implementing the # feature: please don't ask, it just isn't possible. # # This option is only useful if "accept_contacts" is set. # # You may repeat the dynamic_contact option to add several dynamic hosts. # # Default: #dynamic_contact_file= # Specify IP networks that should never be automatically contacted. # # If the freelan deamon receives a contact which belongs to one of the # specified "never_contact" networks, it will not try to establish a session # with it. # # You may repeat the never_contact option to add several IP networks. # # Default: #never_contact=9.0.0.0/24 #never_contact=2aa1::1/8 #never_contact=1.2.3.4 # Specify the cipher suites to use for the sessions. # # The cipher suites must be declared in order of preference. # # If another host doesn't support any of the specified suites, no session # can be established with it. # # You may repeat the cipher_suite_capability option to add several supported # cipher suites. # # Available values: # * ecdhe_rsa_aes256_gcm_sha384 # * ecdhe_rsa_aes128_gcm_sha256 # # Default: ecdhe_rsa_aes256_gcm_sha384, ecdhe_rsa_aes128_gcm_sha256 #cipher_capability=ecdhe_rsa_aes256_gcm_sha384 #cipher_capability=ecdhe_rsa_aes128_gcm_sha256 # Specify the elliptic curves to use for the sessions. # # The elliptic curves must be declared in order of preference. # # If another host doesn't support any of the specified curves, no session # can be established with it. # # You may repeat the elliptic_curve_capability option to add several supported # elliptic curves. # # Available values: # * sect571k1 # * secp384r1 # * secp521r1 # # Default: sect571k1, secp384r1 #elliptic_curve_capability=sect571k1 #elliptic_curve_capability=secp384r1 [tap_adapter] # The tap adapter type. # # The tap adapter type determines the encapsulation layer for VPN frames. Even # if there is no tap adapter enabled, this parameter determines if the freelan # instances runs in switch (layer 2) or router (layer 3) mode. # # Note: If you want to use tun on POSIX systems, make sure you have IP # forwarding enabled. Namely, on Linux make sure that the following command: # # > cat /proc/sys/net/ipv4/ip_forward # # Displays 1. # # Possible values: tap, tun # # Default: tap #type=tap # Whether to use the tap adapter. # # Possible values: yes, no # # Default: yes #enabled=yes # The name of the tap adapter to use or create. # # On Windows, the GUID of an existing tap adapter is expected. It may be found # in the registry: # # HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards # # If no name or an empty name is provided, the first available adapter will be # used. # # On UNIX, it is the name of the tap adapter to create. Depending on your # system, some names might be restricted, and something in the form of tapX # (where X is a positive number) is recommended. # # If no name or an empty name is provided, a tap adapter will be created with # an available name. # # Should you need to know it, you may get that name by specifying an up_script. # # Default: #name= # The Maximum Transmission Unit (MTU) for the tap adapter. # # This value is used to set the MTU on the tap adapter. # # You may specify anything but note that specifying a too small or too big # value can cause performance issues or kernel crashes. # # Also note that changing the MTU of the interface is done in a best effort # manner: there is no guarantee that the setting will stick or will be exactly # as requested. # # Use this at your own risk. # # Possible values: auto, system, # # - auto: The value for the MTU is computed automatically. # - system: The system default value is taken (usually 1500). # - Any strictly positive integer value (eg. 1446). # # Default: auto #mtu=auto # The MSS override. # # If the MSS override is enabled, FreeLAN will hijack outgoing TCP SYN frames # that contain a MSS value higher than the specified treshold and replace its # value. This has the effect of preventing IP fragmentation at the physical # interface level and results in tremendous performance gains for TCP connections. # # Possible values: auto, disabled, # # - auto: Compute the MSS value automatically based on the effective MTU value # (the one read from the interface, which may differ from the one set in the # configuration file). # - disabled: The MSS override is disabled. # - Any strictly positive integer value (eg. 1392). # # Default: auto #mss_override=auto # The metric for the tap adapter. # # This value is used only on Windows and affects routing. # # By default Windows assign a metric to an interface according to its link speed. # Since Win32 TAP Adapters incorrectly report a speed link of 10 Mbits/s, the # default system-assigned metric is high (30) which can cause routes for this # interface not to be chosen. # # Possible values: auto, system, # # - auto: The value for the metric is chosen by freelan so that the VPN network # has precedence over the physical one. # - system: The system default value is taken (usually 30). # - Any positive integer value (eg. 3). # # Default: auto #metric=auto # The tap adapter IPv4 address and prefix length to use. # # The network address must be in numeric format with a netmask suffix. # # On Windows, the prefix length is ignored (but still must be specified) and # the netmask is determined according to the IPv4 class. It is recommended that # you set the network.enable_dhcp_proxy option. # # Commenting out, will result in no IPv4 networking. You cannot supply a blank value. # ipv4_address_prefix_length=9.0.0.1/24 # The tap adapter IPv6 address and prefix length to use. # # The network address must be in numeric format with a netmask suffix. # # Commenting out, will result in no IPv6 networking. You cannot supply a blank value. # ipv6_address_prefix_length=2aa1::1/8 # The remote IPv4 address for tun interfaces. # # Some systems use this address combined with the prefix length specified in # `ipv4_address_prefix_length` to create the route that uses the tun adapter. # # If not specified, the default is the network address associated with # `ipv4_address_prefix_length`. # # For instance, if `ipv4_address_prefix_length` is "9.0.1.5/24", then the # default value of `remote_ipv4_address` will be "9.0.1.0". # # This parameter is ignored in tap mode. # # Default: #remote_ipv4_address=9.0.0.0 # Whether to enable the ARP proxy. # # When the ARP proxy is enabled, all ARP requests are silently rerouted to an # internal ARP server that always replies positively. Remote hosts never # receive any ARP request. # # Warning: Setting this parameter can lead to connectivity issues. It is # provided solely for debugging and testing purposes. # # Default: no #arp_proxy_enabled=no # The ARP proxy fake ethernet address. # # If tap_adapter.arp_proxy_enabled is not set, this option is ignored. # # Default: 00:aa:bb:cc:dd:ee #arp_proxy_fake_ethernet_address=00:aa:bb:cc:dd:ee # Whether to enable the DHCP proxy. # # When the DHCP proxy is enabled, all BOOTP/DHCP requests are silently rerouted # to an internal DHCP server. Remote hosts never receive any DHCP request. # # The TAP interface must be ready to issue DHCP requests if this option is set. # # The use of this option is useful mainly on old Windows version for IPv4 # addresses. On Windows, if this option is set, no attempt to directly set the # IPv4 address will be made. # # Default: yes #dhcp_proxy_enabled=yes # The DHCP proxy server IPv4 address and prefix length to use. # # This value should be different from # network.ipv4_address_prefix_length but within the same network. # # Note that while this option expects a valid host IPv4 address, providing a # network address also works on both Windows and POSIX operating systems. # # Default: 9.0.0.0/24 #dhcp_server_ipv4_address_prefix_length=9.0.0.0/24 # The DHCP proxy server IPv6 address and prefix length to use. # # This value should be different from # network.ipv6_address_prefix_length but within the same network. # # Note that while this option expects a valid host IPv6 address, providing a # network address also works on both Windows and POSIX operating systems. # # Default: 2aa1::/8 #dhcp_server_ipv6_address_prefix_length=2aa1::/8 # The script to call when the tap adapter is up and running. # # The script is called with the tap adapter's name as it's first argument. # # The script exit status is ignored. # # Default: #up_script= # The script to call when the tap adapter is set down. # # The script is called with the tap adapter's name as it's first argument. # # The script exit status is ignored. # # Default: #down_script= [switch] # The routing method for messages. # # Possible values: switch, hub # # - switch: Act like a switch. Messages are only sent to the right host when # its address is known. # - hub: Send all messages to everyone on the network. The memory footprint is # slightly reduced at the cost of much higher bandwitdh usage. Recommended for # 1-to-1 networks only. # # Warning: At any time, if the memory consumption is too high, the # routing_method may be temporarily switched from "switch" to "hub" to prevent # DoS attacks. # # Default: switch #routing_method=switch # Whether to enable the relay mode. # # Possible values: no, yes # # - no: Not relaying frames from one remote host to the other. # - yes: Transmits frames from one host to the other. # # If you enable relay mode, it is recommended that routing_method is set to # switch. # # Default: no #relay_mode_enabled=no [router] # The local IP routes. # # The list of routes to advertise to the other peers. # # Those routes may contain a gateway. # # You may repeat the local_ip_route option to add several routes. # # Examples: # - 192.168.0.0/24 # - 192.168.0.0/24 => 9.0.0.1 # - fe80::1/64 # - fe80::1/64 => fe80::ffff # - 0.0.0.0/0 # - 0.0.0.0/0 => 9.0.0.1 # - ::/0 # - ::/0 => fe80::ffff # - ipv4_proxy # - ipv6_proxy # # `ipv4_proxy` and `ipv4_proxy` are special values that are equivalent to # `0.0.0.0/0 => ` and `::/0 => # `. # # These basically instruct other peers to use this host as a default gateway # and are particularly useful when setting up a VPN proxy. # # Default: #local_ip_route=192.168.0.0/24 # The local DNS servers. # # The list of DNS servers to advertise to the other peers. # # You may repeat the local_dns_server option to add several DNS servers. # # Examples: # - 8.8.8.8 # - 2001:4860:4860::8888 # # Default: #local_dns_server=192.168.0.254 # Whether to enable client routing. # # Possible values: no, yes # # - no: Not relaying IP frames from one remote host to the other. # - yes: Act as an IP router and relay IP frames from one host to the other. # # # Default: yes #client_routing_enabled=yes # Accept or reject routes requests from other peers. # # Disabling this option in tun mode will cause connectivity issues. # # Default: yes #accept_routes_requests=yes # The internal routes acceptance policy. # # Indicates the kind of routes to accept from other hosts. # # The routes will be used internally. # # Possible values: none, unicast_in_network, unicast, subnet, any # # - none: Not accepting any route. Use this to disable the feature. # - unicast_in_network: Accept only unicast routes that belong to the local # interface's network. # - unicast: Accept only unicast routes. # - subnet: Accept only subnet routes that belong to the local interface's # network. # - any: Accept any route. # # Note: this option is ignored in tap mode, as tap does not do internal IP # routing. # # Default: unicast_in_network #internal_route_acceptance_policy=unicast_in_network # The system routes acceptance policy. # # Indicates the kind of routes to accept from other hosts. # # These routes will be added to the system routing table. # # Possible values: none, unicast, any, unicast_with_gateway, any_with_gateway # # - none: Not accepting any route. Use this to disable the feature. # - unicast: Accept only unicast routes. Those that contain a gateway are # rejected. # - any: Accept any route except those that contain a gateway. # - unicast_with_gateway: Accept only unicast routes, even those that contain a # gateway. # - any_with_gateway: Accept any route, even those that contain a gateway. # # Routes that belong to the current interface network are silently ignored as # the system routing table already contains them. # # Note: this option is effective in both tun and tap mode as it affects the # system routing table. # # Note 2: In tun mode, the routes are first filtered by the # internal_route_acceptance_policy. # # Warning: make sure you understand what implications this option can have. # Allowing modifications of the system routing table for other hosts can be # a huge security risk. # # Default: none #system_route_acceptance_policy=none # The maximum count of routes to accept for a given host. # # Possible values: 0, # # - 0: No limit. # - : Only a finite number of routes is accepted from # other hosts. # # Note: the limit is applied to IPv4 and IPv6 addresses separately. Meaning # that a limit of 1 will allow one address of each type. # # Default: 1 #maximum_routes_limit=1 # The DNS servers acceptance policy. # # Indicates the kind of DNS server addresses to accept from other hosts. # # Possible values: none, in_network, any # # - none: Not accepting any DNS servers. Use this to disable the feature. # - in_network: Accept only DNS server addresses which belong to the interface # IP network. # - any: Accept any DNS server address. # # Default: in_network #dns_servers_acceptance_policy=in_network # The script to call when a DNS entry is to be added or removed. # # The script is called with the tap adapter's name as it's first argument. # The second argument is a verb which can be: # - add: A DNS entry must be added. # - remove: A DNS entry must be removed. # The third argument is the DNS server address to add or remove. # # If the script exits with a non-zero value, it is assumed that the addition or # removal of the DNS entry failed. If the addition fails for a given address, # the script won't be called for removal for this same address. # # On Windows, if no script is provided, FreeLAN will add/remove the DNS server # using system calls. # # On Mac OS X and Linux, there is sadly no reliable system call and you MUST # provide a script or DNS settings will simply be ignored. # # Default: #dns_script= [security] # The passphrase used to generate a pre-shared key to use for encryption. # # The PSK is derived using PBKDF2. # # Using a PSK is less secure than using a certificate and should never be a # first choice. It is useful in cases where generating certificates, private # keys is not feasible. # # You can specify a PSK even if you have a certificate, which allows to connect # with certificate-less nodes. # # The passphrase MUST remain secret. # # Default: #passphrase= # The salt to use when deriving the PSK from the passphrase. # # It is recommended that you change this value for your own freelan # installation when using PSKs. It doesn't have to be secret but it should # ideally be unique. # # Default: freelan #passphrase_salt=freelan # The number of iterations to use when deriving the PSK from the passphrase. # # You can increase (or decrease, but please, don't) this number to increase the # time it takes to derive the key from the passphrase and reduces the # likelyhood of brute-force attacks. # # Default: 2000 #passphrase_iterations_count=2000 # The salt to use when deriving the PSK from the passphrase. # # Default: freelan #passphrase_salt=freelan # The X509 certificate file to use for signing. # # Unless client.enabled is set to "yes" or a PSK is specified, this parameter # is mandatory. # # Default: #signature_certificate_file= # The private key file to use for signing. # # Unless client.enabled is set to "yes" or PSK is specified, this parameter is # mandatory. # # This private key must match with the specified signing certificate file. # # Default: #signature_private_key_file= # The certificate validation method to use. # # Possible values are: default, none # # - default: Matches any presented certificate against the specified # certificate authorities. # - none: Disable certificate validation. # # Warning: Think twice before setting "none" here, as this completely disables # certificate validation. If you choose to do so, ensure that you have a robust # certificate validation script set as certificate_validation_script. # # Default: default #certificate_validation_method=default # The certificate validation script to call. # # Every time a external certificate is received and accepted by the specified # certificate_validation_method, the specified script is called with a X509 # certificate filename as its first argument. # # If the script exit status is zero, the certificate is accepted. # If the script exit status is non-zero, the certificate is rejected. # # The certificate validation script is called even if # certificate_validation_method is set to "none". # # Specify an empty validation script path to disable script validation. # # Default: #certificate_validation_script= # The authority certificates. # # You may repeat the authority_certificate_file option to specify several # authority certificates. # # Default: #authority_certificate_file= # The certificate revocation validation method to use. # # Possible values are: last, all, none # # - last: Only the last certificate of the certification chain is checked for # revocation. # - all: All certificates from the certification chain are checked for # revocation. # - none: Certificates are not checked for revocation. # # Default: none #certificate_revocation_validation_method=none # The certificate revocation lists. # # You may repeat the certificate_revocation_list_file option to specify several # certificate revocation lists. # # Default: #certificate_revocation_list_file= freelan-2.0/apps/freelan/freelan.vcxproj000066400000000000000000000474541252300335000204060ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {FCABC429-7FB2-4453-89CB-D1A59A7D59F9} Win32Proj freelan Application true v120 Unicode Application true v120 Unicode Application false v120 true Unicode Application false v120 true Unicode true $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include;$(IncludePath) $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\apps\$(ProjectName)\ $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\lib;$(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib;$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSDK_LibraryPath_x86); ClCompile $(ProjectName) true $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include;$(IncludePath) $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\apps\$(ProjectName)\ $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\lib;$(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib;$(VCInstallDir)lib\amd64;$(VCInstallDir)atlmfc\lib\amd64;$(WindowsSDK_LibraryPath_x64); ClCompile $(ProjectName) false $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include;$(IncludePath) $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\apps\$(ProjectName)\ $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\lib;$(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib;$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSDK_LibraryPath_x86); ClCompile $(ProjectName) false $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include;$(IncludePath) $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\apps\$(ProjectName)\ $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\lib;$(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib;$(VCInstallDir)lib\amd64;$(VCInstallDir)atlmfc\lib\amd64;$(WindowsSDK_LibraryPath_x64); ClCompile $(ProjectName) Level3 Disabled USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;DEBUG;_WIN32_WINNT=0x0501;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true 4345;4996;4267 Console true libiconvd.lib;libeay32.lib;ssleay32.lib;libcurl_a_debug.lib;libboost_date_time-vc120-mt-gd-1_57.lib;libboost_system-vc120-mt-gd-1_57.lib;libboost_thread-vc120-mt-gd-1_57.lib;libboost_program_options-vc120-mt-gd-1_57.lib;libboost_filesystem-vc120-mt-gd-1_57.lib;libiconvplus.lib;libkfather.lib;libexecuteplus.lib;libcryptoplus.lib;libasiotap.lib;libfscp.lib;libmongooseplus.lib;libfreelan.lib;Iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) HighestAvailable python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template xcopy /E /Y $(ProjectDir)\config\*.cfg $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\config\ xcopy /E /Y $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\bin\libeay32.dll $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ xcopy /E /Y $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\bin\ssleay32.dll $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ Copying the configuration files Level3 Disabled USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;DEBUG;_WIN32_WINNT=0x0501;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true 4345;4996;4267 Console true libiconvd.lib;libeay32.lib;ssleay32.lib;libcurl_a_debug.lib;libboost_date_time-vc120-mt-gd-1_57.lib;libboost_system-vc120-mt-gd-1_57.lib;libboost_thread-vc120-mt-gd-1_57.lib;libboost_program_options-vc120-mt-gd-1_57.lib;libboost_filesystem-vc120-mt-gd-1_57.lib;libiconvplus.lib;libkfather.lib;libexecuteplus.lib;libcryptoplus.lib;libasiotap.lib;libfscp.lib;libmongooseplus.lib;libfreelan.lib;Iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) HighestAvailable python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template xcopy /E /Y $(ProjectDir)\config\*.cfg $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\config\ xcopy /E /Y $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\bin\libeay32.dll $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ xcopy /E /Y $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\bin\ssleay32.dll $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ Copying the configuration files Level3 MaxSpeed true true USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;_WIN32_WINNT=0x0501;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true 4345;4996;4267 Console true true true libiconv.lib;libeay32.lib;ssleay32.lib;libcurl_a.lib;libboost_date_time-vc120-mt-1_57.lib;libboost_system-vc120-mt-1_57.lib;libboost_thread-vc120-mt-1_57.lib;libboost_program_options-vc120-mt-1_57.lib;libboost_filesystem-vc120-mt-1_57.lib;libiconvplus.lib;libkfather.lib;libexecuteplus.lib;libcryptoplus.lib;libasiotap.lib;libfscp.lib;libmongooseplus.lib;libfreelan.lib;Iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) HighestAvailable python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template xcopy /E /Y $(ProjectDir)\config\*.cfg $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\config\ xcopy /E /Y $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\bin\libeay32.dll $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ xcopy /E /Y $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\bin\ssleay32.dll $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ Copying the configuration files Level3 MaxSpeed true true USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;_WIN32_WINNT=0x0501;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true 4345;4996;4267 Console true true true libiconv.lib;libeay32.lib;ssleay32.lib;libcurl_a.lib;libboost_date_time-vc120-mt-1_57.lib;libboost_system-vc120-mt-1_57.lib;libboost_thread-vc120-mt-1_57.lib;libboost_program_options-vc120-mt-1_57.lib;libboost_filesystem-vc120-mt-1_57.lib;libiconvplus.lib;libkfather.lib;libexecuteplus.lib;libcryptoplus.lib;libasiotap.lib;libfscp.lib;libmongooseplus.lib;libfreelan.lib;Iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) HighestAvailable python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template xcopy /E /Y $(ProjectDir)\config\*.cfg $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\config\ xcopy /E /Y $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\bin\libeay32.dll $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ xcopy /E /Y $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\bin\ssleay32.dll $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ Copying the configuration files freelan-2.0/apps/freelan/freelan.vcxproj.filters000066400000000000000000000040261252300335000220410ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files Source Files Source Files Source Files Source Files Source Files Header Files Header Files Header Files Header Files Header Files Header Files freelan-2.0/apps/freelan/scripts/000077500000000000000000000000001252300335000170265ustar00rootroot00000000000000freelan-2.0/apps/freelan/scripts/create_ca.sh000077500000000000000000000013461252300335000212770ustar00rootroot00000000000000#!/bin/sh SCRIPT_PATH=`readlink -f $0 | xargs dirname` if [ "$#" -ne 1 ]; then echo "Syntax: $0 " >&2 echo >&2 echo "Create a certification authority at the specified path." >&2 exit 1 fi CA_PATH=`readlink -f $1` if [ -d "$CA_PATH" ]; then echo "Error: Directory \"$CA_PATH\" already exists." >&2 exit 2 fi mkdir -p $CA_PATH cd $CA_PATH mkdir crt key crl echo '01' > serial echo '01' > crlnumber touch index.txt touch index.txt.attr cp $SCRIPT_PATH/resources/ca.cnf . sed -i "s;{CA_PATH};${CA_PATH};g" ca.cnf echo "Default configuration copied. You may now edit it to your needs... (Press enter)" read if ! $EDITOR ca.cnf; then echo "The configuration edition was aborted." rm -rf "$CA_PATH" exit 3 fi echo "Done." freelan-2.0/apps/freelan/scripts/generate_ca.sh000077500000000000000000000007631252300335000216300ustar00rootroot00000000000000#!/bin/sh SCRIPT_PATH=`readlink -f $0 | xargs dirname` if [ "$#" -ne 1 ]; then echo "Syntax: $0 " >&2 echo >&2 echo "Generate a certificate for the CA at the specified path." >&2 exit 1 fi CA_PATH=`readlink -f $1` if [ ! -d "$CA_PATH" ]; then echo "Error: Directory \"$CA_PATH\" does not exists." >&2 exit 2 fi echo "Generating CA certificate and private key:" openssl req -new -x509 -extensions v3_ca -keyout $CA_PATH/key/ca.key -out $CA_PATH/crt/ca.crt -config $CA_PATH/ca.cnf freelan-2.0/apps/freelan/scripts/generate_certificate.sh000077500000000000000000000011701252300335000235200ustar00rootroot00000000000000#!/bin/sh if [ "$#" -ne 2 ]; then echo "Syntax: $0 " >&2 echo >&2 echo "Generate a certificate for the intermediate CA at the specified path." >&2 exit 1 fi CA_PATH=`readlink -f $1` NAME=$2 if [ ! -d "$CA_PATH" ]; then echo "Error: Directory \"$CA_PATH\" does not exists." >&2 exit 2 fi echo "Generating private key:" openssl genrsa -des3 -out $NAME.key 4096 echo "Generating certificate request:" openssl req -new -sha1 -key $NAME.key -out $NAME.csr echo "Signing certificate with the CA:" openssl ca -out $CA_PATH/crt/$NAME.crt -in $NAME.csr -config $CA_PATH/ca.cnf cp $CA_PATH/crt/$NAME.crt $NAME.crt freelan-2.0/apps/freelan/scripts/generate_intermediate_ca.sh000077500000000000000000000016321252300335000243560ustar00rootroot00000000000000#!/bin/sh if [ "$#" -ne 3 ]; then echo "Syntax: $0 " >&2 echo >&2 echo "Generate a certificate for the intermediate CA at the specified path." >&2 exit 1 fi CA_PATH=`readlink -f $1` ROOT_CA_PATH=`readlink -f $2` NAME=$3 if [ ! -d "$CA_PATH" ]; then echo "Error: Directory \"$CA_PATH\" does not exists." >&2 exit 2 fi if [ ! -d "$ROOT_CA_PATH" ]; then echo "Error: Directory \"$ROOT_CA_PATH\" does not exists." >&2 exit 3 fi echo "Generating private key:" openssl genrsa -des3 -out $CA_PATH/key/ca.key 4096 -config $CA_PATH/ca.cnf echo "Generating CA certificate request:" openssl req -new -sha1 -key $CA_PATH/key/ca.key -out $CA_PATH/crt/ca.csr -config $CA_PATH/ca.cnf echo "Signing certificate with root CA:" openssl ca -extensions v3_ca -out $ROOT_CA_PATH/crt/$NAME.crt -in $CA_PATH/crt/ca.csr -config $ROOT_CA_PATH/ca.cnf cp $ROOT_CA_PATH/crt/$NAME.crt $CA_PATH/crt/ca.crt freelan-2.0/apps/freelan/scripts/resources/000077500000000000000000000000001252300335000210405ustar00rootroot00000000000000freelan-2.0/apps/freelan/scripts/resources/ca.cnf000066400000000000000000000217251252300335000221220ustar00rootroot00000000000000# # OpenSSL example configuration file. # This is mostly being used for generation of certificate requests. # # This definition stops the following lines choking if HOME isn't # defined. HOME = . RANDFILE = $ENV::HOME/.rnd # Extra OBJECT IDENTIFIER info: #oid_file = $ENV::HOME/.oid oid_section = new_oids # To use this configuration file with the "-extfile" option of the # "openssl x509" utility, name here the section containing the # X.509v3 extensions to use: # extensions = # (Alternatively, use a configuration file that has only # X.509v3 extensions in its main [= default] section.) [ new_oids ] # We can add new OIDs in here for use by 'ca', 'req' and 'ts'. # Add a simple OID like this: # testoid1=1.2.3.4 # Or use config file substitution like this: # testoid2=${testoid1}.5.6 [ ca ] default_ca = CA_freelan # The default ca section [ CA_freelan ] dir = {CA_PATH} # Where everything is kept certs = $dir/crt # Where the issued certs are kept crl_dir = $dir/crl # Where the issued crl are kept database = $dir/index.txt # database index file. #unique_subject = no # Set to 'no' to allow creation of several ctificates with same subject. new_certs_dir = $dir/crt # default place for new certs. certificate = $dir/crt/ca.crt # The CA certificate serial = $dir/serial # The current serial number crlnumber = $dir/crlnumber # the current crl number. Must be commented out to leave a V1 CRL. crl = $dir/crl/ca.crl # The current CRL private_key = $dir/key/ca.key# The private key RANDFILE = $dir/.rand # private random number file x509_extensions = usr_cert # The extentions to add to the cert # Comment out the following two lines for the "traditional" # (and highly broken) format. name_opt = ca_default # Subject Name options cert_opt = ca_default # Certificate field options # Extension copying option: use with caution. # copy_extensions = copy # Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs # so this is commented out by default to leave a V1 CRL. # crlnumber must also be commented out to leave a V1 CRL. # crl_extensions = crl_ext default_days = 365 # how long to certify for default_crl_days= 30 # how long before next CRL default_md = sha1 # use public key default MD preserve = no # keep passed DN ordering # A few difference way of specifying how similar the request should look # For type CA, the listed attributes must be the same, and the optional # and supplied fields are just that :-) policy = policy_match # For the CA policy [ policy_match ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional # For the 'anything' policy # At this point in time, you must list all acceptable 'object' # types. [ policy_anything ] countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional [ req ] default_bits = 4096 default_keyfile = privkey.pem distinguished_name = req_distinguished_name attributes = req_attributes x509_extensions = v3_ca # The extentions to add to the self signed cert # Passwords for private keys if not present they will be prompted for # input_password = secret # output_password = secret # This sets a mask for permitted string types. There are several options. # default: PrintableString, T61String, BMPString. # pkix : PrintableString, BMPString (PKIX recommendation before 2004) # utf8only: only UTF8Strings (PKIX recommendation after 2004). # nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). # MASK:XXXX a literal mask value. # WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. string_mask = utf8only # req_extensions = v3_req # The extensions to add to a certificate request [ req_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = AU countryName_min = 2 countryName_max = 2 stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = Some-State localityName = Locality Name (eg, city) 0.organizationName = Organization Name (eg, company) 0.organizationName_default = Internet Widgits Pty Ltd # we can do this but it is not needed normally :-) #1.organizationName = Second Organization Name (eg, company) #1.organizationName_default = World Wide Web Pty Ltd organizationalUnitName = Organizational Unit Name (eg, section) #organizationalUnitName_default = commonName = Common Name (eg, YOUR name) commonName_max = 64 emailAddress = Email Address emailAddress_max = 64 # SET-ex3 = SET extension number 3 [ req_attributes ] challengePassword = A challenge password challengePassword_min = 4 challengePassword_max = 20 unstructuredName = An optional company name [ usr_cert ] # These extensions are added when 'ca' signs a request. # This goes against PKIX guidelines but some CAs do it and some software # requires this to avoid interpreting an end user certificate as a CA. basicConstraints=CA:FALSE # Here are some examples of the usage of nsCertType. If it is omitted # the certificate can be used for anything *except* object signing. # This is OK for an SSL server. # nsCertType = server # For an object signing certificate this would be used. # nsCertType = objsign # For normal client use this is typical # nsCertType = client, email # and for everything including object signing: # nsCertType = client, email, objsign # This is typical in keyUsage for a client certificate. # keyUsage = nonRepudiation, digitalSignature, keyEncipherment # This will be displayed in Netscape's comment listbox. nsComment = "OpenSSL Generated Certificate" # PKIX recommendations harmless if included in all certificates. subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer # This stuff is for subjectAltName and issuerAltname. # Import the email address. # subjectAltName=email:copy # An alternative to produce certificates that aren't # deprecated according to PKIX. # subjectAltName=email:move # Copy subject details # issuerAltName=issuer:copy #nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem #nsBaseUrl #nsRevocationUrl #nsRenewalUrl #nsCaPolicyUrl #nsSslServerName # This is required for TSA certificates. # extendedKeyUsage = critical,timeStamping [ v3_req ] # Extensions to add to a certificate request basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment [ v3_ca ] # Extensions for a typical CA # PKIX recommendation. subjectKeyIdentifier=hash authorityKeyIdentifier=keyid:always,issuer # This is what PKIX recommends but some broken software chokes on critical # extensions. #basicConstraints = critical,CA:true # So we do this instead. basicConstraints = CA:true # Key usage: this is typical for a CA certificate. However since it will # prevent it being used as an test self-signed certificate it is best # left out by default. # keyUsage = cRLSign, keyCertSign # Some might want this also # nsCertType = sslCA, emailCA # Include email address in subject alt name: another PKIX recommendation # subjectAltName=email:copy # Copy issuer details # issuerAltName=issuer:copy # DER hex encoding of an extension: beware experts only! # obj=DER:02:03 # Where 'obj' is a standard or added object # You can even override a supported extension: # basicConstraints= critical, DER:30:03:01:01:FF [ crl_ext ] # CRL extensions. # Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. # issuerAltName=issuer:copy authorityKeyIdentifier=keyid:always [ proxy_cert_ext ] # These extensions should be added when creating a proxy certificate # This goes against PKIX guidelines but some CAs do it and some software # requires this to avoid interpreting an end user certificate as a CA. basicConstraints=CA:FALSE # Here are some examples of the usage of nsCertType. If it is omitted # the certificate can be used for anything *except* object signing. # This is OK for an SSL server. # nsCertType = server # For an object signing certificate this would be used. # nsCertType = objsign # For normal client use this is typical # nsCertType = client, email # and for everything including object signing: # nsCertType = client, email, objsign # This is typical in keyUsage for a client certificate. # keyUsage = nonRepudiation, digitalSignature, keyEncipherment # This will be displayed in Netscape's comment listbox. nsComment = "OpenSSL Generated Certificate" # PKIX recommendations harmless if included in all certificates. subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer # This stuff is for subjectAltName and issuerAltname. # Import the email address. # subjectAltName=email:copy # An alternative to produce certificates that aren't # deprecated according to PKIX. # subjectAltName=email:move # Copy subject details # issuerAltName=issuer:copy #nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem #nsBaseUrl #nsRevocationUrl #nsRenewalUrl #nsCaPolicyUrl #nsSslServerName # This really needs to be in place for it to be a proxy certificate. proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo freelan-2.0/apps/freelan/src/000077500000000000000000000000001252300335000161265ustar00rootroot00000000000000freelan-2.0/apps/freelan/src/colors.hpp000066400000000000000000000074101252300335000201420ustar00rootroot00000000000000/* * freelan - An open, multi-platform software to establish peer-to-peer virtual * private networks. * * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of freelan. * * freelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * freelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use freelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file colors.hpp * \author Julien KAUFFMANN * \brief Colors utility functions. */ #ifndef COLORS_HPP #define COLORS_HPP #include #include #include static const std::string COLOR_RESET = "\x1b[0m"; static const std::string COLOR_BOLD = "\x1b[1m"; static const std::string COLOR_DIM = "\x1b[1m"; static const std::string COLOR_UNDERLINE = "\x1b[4m"; static const std::string COLOR_BLINK = "\x1b[5m"; static const std::string COLOR_REVERSE = "\x1b[7m"; static const std::string COLOR_CONCEALED = "\x1b[8m"; static const std::string COLOR_FG_BLACK = "\x1b[30m"; static const std::string COLOR_FG_RED = "\x1b[31m"; static const std::string COLOR_FG_GREEN = "\x1b[32m"; static const std::string COLOR_FG_YELLOW = "\x1b[33m"; static const std::string COLOR_FG_BLUE = "\x1b[34m"; static const std::string COLOR_FG_MAGENTA = "\x1b[35m"; static const std::string COLOR_FG_CYAN = "\x1b[36m"; static const std::string COLOR_FG_WHITE = "\x1b[37m"; static const std::string COLOR_BG_BLACK = "\x1b[40m"; static const std::string COLOR_BG_RED = "\x1b[41m"; static const std::string COLOR_BG_GREEN = "\x1b[42m"; static const std::string COLOR_BG_YELLOW = "\x1b[43m"; static const std::string COLOR_BG_BLUE = "\x1b[44m"; static const std::string COLOR_BG_MAGENTA = "\x1b[45m"; static const std::string COLOR_BG_CYAN = "\x1b[46m"; static const std::string COLOR_BG_WHITE = "\x1b[47m"; inline std::string log_level_to_color(fscp::log_level level) { switch (level) { case fscp::log_level::trace: return COLOR_DIM + COLOR_FG_WHITE; case fscp::log_level::debug: return COLOR_FG_WHITE; case fscp::log_level::information: return COLOR_FG_BLUE; case fscp::log_level::important: return COLOR_BOLD + COLOR_FG_GREEN; case fscp::log_level::warning: return COLOR_FG_YELLOW; case fscp::log_level::error: return COLOR_FG_RED; case fscp::log_level::fatal: return COLOR_BOLD + COLOR_REVERSE + COLOR_FG_RED; } assert(false); return std::string(); } #endif /* COLORS_HPP */ freelan-2.0/apps/freelan/src/configuration_helper.cpp000066400000000000000000000712641252300335000230520ustar00rootroot00000000000000/* * freelan - An open, multi-platform software to establish peer-to-peer virtual * private networks. * * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of freelan. * * freelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * freelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use freelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file configuration_helper.cpp * \author Julien KAUFFMANN * \brief A configuration helper. */ #include "configuration_helper.hpp" #include #include #include #include "configuration_types.hpp" #include #include // This file is generated locally. #include namespace po = boost::program_options; namespace fs = boost::filesystem; namespace fl = freelan; namespace { struct trusted_cert_type { typedef fl::security_configuration::cert_type cert_type; trusted_cert_type() {} trusted_cert_type(cert_type& c) : cert(c) {} operator cert_type() const { return cert; } cert_type cert; }; void from_file(fl::security_configuration::cert_type& value, const cryptoplus::file& file) { value = fl::security_configuration::cert_type::from_certificate(file); } void from_file(cryptoplus::pkey::pkey& value, const cryptoplus::file& file) { value = cryptoplus::pkey::pkey::from_private_key(file); } void from_file(trusted_cert_type& value, const cryptoplus::file& file) { value.cert = fl::security_configuration::cert_type::from_trusted_certificate(file); } void from_file(fl::security_configuration::crl_type& value, const cryptoplus::file& file) { value = fl::security_configuration::crl_type::from_certificate_revocation_list(file); } template bool load_file(const std::string& file_type, ValueType& value, const std::string& name, const fs::path& filename) { try { const cryptoplus::file file = cryptoplus::file::open(filename.native()); from_file(value, file); } catch (const std::exception& ex) { po::error_with_option_name error("in %canonical_option%: unable to load %file_type% at \"%filename%\" (%error%)", name, filename.string()); error.set_substitute("file_type", file_type); error.set_substitute("filename", filename.string()); error.set_substitute("error", ex.what()); throw error; } return true; } template bool load_file(const std::string& file_type, ValueType& value, const std::string& name, const po::variables_map& vm) { if (!vm.count(name)) { return false; } const fs::path path = vm[name].as(); if (path.native().empty()) { return false; } return load_file(file_type, value, name, path); } template bool load_file_list(const std::string& file_type, std::vector& values, const std::string& name, const po::variables_map& vm) { values.clear(); const auto paths = vm[name].as >(); for (auto&& path : paths) { if (path.native().empty()) { continue; } ValueType value; if (load_file(file_type, value, name, path)) { values.push_back(value); } } return !values.empty(); } bool load_certificate(fl::security_configuration::cert_type& value, const std::string& name, const po::variables_map& vm) { return load_file("certificate", value, name, vm); } bool load_private_key(cryptoplus::pkey::pkey& value, const std::string& name, const po::variables_map& vm) { return load_file("private key", value, name, vm); } bool load_trusted_certificate(fl::security_configuration::cert_type& value, const std::string& name, const po::variables_map& vm) { trusted_cert_type xvalue; const bool result = load_file("trusted certificate", xvalue, name, vm); value = xvalue; return result; } bool load_certificate_list(std::vector& value, const std::string& name, const po::variables_map& vm) { return load_file_list("certificate", value, name, vm); } bool load_trusted_certificate_list(std::vector& value, const std::string& name, const po::variables_map& vm) { std::vector xvalue; const bool result = load_file_list("trusted certificate", xvalue, name, vm); value.assign(xvalue.begin(), xvalue.end()); return result; } bool load_crl_list(std::vector& value, const std::string& name, const po::variables_map& vm) { return load_file_list("certificate revocation list", value, name, vm); } void make_path_absolute(const std::string& name, po::variables_map& vm, const fs::path& root) { if (vm.count(name) > 0) { const auto path = vm[name].as(); if (!path.empty()) { vm.at(name).value() = fs::absolute(path, root); } } } void make_path_list_absolute(const std::string& name, po::variables_map& vm, const fs::path& root) { if (vm.count(name) > 0) { const auto paths = vm[name].as >(); std::vector new_paths; for (auto& path : paths) { if (path.empty()) { new_paths.push_back(path); } else { new_paths.push_back(fs::absolute(path, root)); } } vm.at(name).value() = new_paths; } } } po::options_description get_server_options() { po::options_description result("FreeLAN Server options"); result.add_options() ("server.enabled", po::value()->default_value(false, "no"), "Whether to enable the server mechanism.") ("server.listen_on", po::value()->default_value(asiotap::ipv4_endpoint(boost::asio::ip::address_v4::any(), 443)), "The endpoint to listen on.") ("server.protocol", po::value()->default_value(fl::server_configuration::server_protocol_type::https), "The protocol to use for clients to contact the server.") ("server.server_certificate_file", po::value()->default_value(""), "The server certificate file.") ("server.server_private_key_file", po::value()->default_value(""), "The server private key file.") ("server.certification_authority_certificate_file", po::value()->default_value(""), "The certification authority certificate file.") ("server.certification_authority_private_key_file", po::value()->default_value(""), "The certification authority private key file.") ("server.authentication_script", po::value()->default_value(""), "The authentication script to use.") ; return result; } po::options_description get_client_options() { po::options_description result("FreeLAN Client options"); result.add_options() ("client.enabled", po::value()->default_value(false, "no"), "Whether to enable the client mechanism.") ("client.server_endpoint", po::value()->default_value(asiotap::ipv4_endpoint(boost::asio::ip::address_v4::from_string("127.0.0.1"), 443)), "The endpoint to connect to.") ("client.protocol", po::value()->default_value(fl::client_configuration::client_protocol_type::https), "The protocol to use to contact the server.") ("client.disable_peer_verification", po::value()->default_value(false, "no"), "Whether to disable peer verification.") ("client.disable_host_verification", po::value()->default_value(false, "no"), "Whether to disable host verification.") ("client.username", po::value()->default_value(""), "The client username.") ("client.password", po::value()->default_value(""), "The client password.") ("client.public_endpoint", po::value >()->multitoken()->zero_tokens()->default_value(std::vector(), ""), "A hostname or IP address to advertise.") ; return result; } po::options_description get_fscp_options() { po::options_description result("FreeLAN Secure Channel Protocol (FSCP) options"); result.add_options() ("fscp.hostname_resolution_protocol", po::value()->default_value(fl::fscp_configuration::HRP_IPV4), "The hostname resolution protocol to use.") ("fscp.listen_on", po::value()->default_value(asiotap::ipv4_endpoint(boost::asio::ip::address_v4::any(), 12000)), "The endpoint to listen on.") ("fscp.listen_on_device", po::value()->default_value(std::string()), "The endpoint to listen on.") ("fscp.hello_timeout", po::value()->default_value(3000), "The default timeout for HELLO messages, in milliseconds.") ("fscp.contact", po::value >()->multitoken()->zero_tokens()->default_value(std::vector(), ""), "The address of an host to contact.") ("fscp.accept_contact_requests", po::value()->default_value(true, "yes"), "Whether to accept CONTACT-REQUEST messages.") ("fscp.accept_contacts", po::value()->default_value(true, "yes"), "Whether to accept CONTACT messages.") ("fscp.dynamic_contact_file", po::value >()->multitoken()->zero_tokens()->default_value(std::vector(), ""), "The certificate of an host to dynamically contact.") ("fscp.never_contact", po::value >()->multitoken()->zero_tokens()->default_value(std::vector(), ""), "A network address to avoid when dynamically contacting hosts.") ("fscp.cipher_suite_capability", po::value >()->multitoken()->zero_tokens()->default_value(fscp::get_default_cipher_suites(), ""), "A cipher suite to allow.") ("fscp.elliptic_curve_capability", po::value >()->multitoken()->zero_tokens()->default_value(fscp::get_default_elliptic_curves(), ""), "A elliptic curve to allow.") ; return result; } po::options_description get_security_options() { po::options_description result("Security options"); result.add_options() ("security.passphrase", po::value()->default_value(""), "A passphrase to generate the pre - shared key from.") ("security.passphrase_salt", po::value()->default_value("freelan"), "The salt to use during the pre-shared key derivation.") ("security.passphrase_iterations_count", po::value()->default_value(2000, "2000"), "The number of iterations to use during the pre-shared key derivation.") ("security.signature_certificate_file", po::value(), "The certificate file to use for signing.") ("security.signature_private_key_file", po::value(), "The private key file to use for signing.") ("security.certificate_validation_method", po::value()->default_value(fl::security_configuration::CVM_DEFAULT), "The certificate validation method.") ("security.certificate_validation_script", po::value()->default_value(""), "The certificate validation script to use.") ("security.authority_certificate_file", po::value >()->multitoken()->zero_tokens()->default_value(std::vector(), ""), "An authority certificate file to use.") ("security.certificate_revocation_validation_method", po::value()->default_value(fl::security_configuration::CRVM_NONE), "The certificate revocation validation method.") ("security.certificate_revocation_list_file", po::value >()->multitoken()->zero_tokens()->default_value(std::vector(), ""), "A certificate revocation list file to use.") ; return result; } po::options_description get_tap_adapter_options() { po::options_description result("Tap adapter options"); const asiotap::ipv4_network_address default_ipv4_network_address(boost::asio::ip::address_v4::from_string("9.0.0.1"), 24); const asiotap::ipv6_network_address default_ipv6_network_address(boost::asio::ip::address_v6::from_string("fe80::1"), 10); const asiotap::ipv4_network_address default_dhcp_ipv4_network_address(boost::asio::ip::address_v4::from_string("9.0.0.0"), 24); const asiotap::ipv6_network_address default_dhcp_ipv6_network_address(boost::asio::ip::address_v6::from_string("fe80::"), 10); result.add_options() ("tap_adapter.type", po::value()->default_value(fl::tap_adapter_configuration::tap_adapter_type::tap, "tap"), "The TAP adapter type.") ("tap_adapter.enabled", po::value()->default_value(true, "yes"), "Whether to enable the tap adapter.") ("tap_adapter.name", po::value(), "The name of the tap adapter to use or create.") ("tap_adapter.mtu", po::value()->default_value(fl::auto_mtu_type()), "The MTU of the tap adapter.") ("tap_adapter.mss_override", po::value()->default_value(fl::mss_type()), "The MSS override.") ("tap_adapter.metric", po::value()->default_value(fl::auto_metric_type()), "The metric of the tap adapter.") ("tap_adapter.ipv4_address_prefix_length", po::value(), "The tap adapter IPv4 address and prefix length.") ("tap_adapter.ipv6_address_prefix_length", po::value(), "The tap adapter IPv6 address and prefix length.") ("tap_adapter.remote_ipv4_address", po::value(), "The tap adapter IPv4 remote address.") ("tap_adapter.arp_proxy_enabled", po::value()->default_value(false), "Whether to enable the ARP proxy.") ("tap_adapter.arp_proxy_fake_ethernet_address", po::value()->default_value(boost::lexical_cast("00:aa:bb:cc:dd:ee")), "The ARP proxy fake ethernet address.") ("tap_adapter.dhcp_proxy_enabled", po::value()->default_value(true), "Whether to enable the DHCP proxy.") ("tap_adapter.dhcp_server_ipv4_address_prefix_length", po::value()->default_value(default_dhcp_ipv4_network_address), "The DHCP proxy server IPv4 address and prefix length.") ("tap_adapter.dhcp_server_ipv6_address_prefix_length", po::value()->default_value(default_dhcp_ipv6_network_address), "The DHCP proxy server IPv6 address and prefix length.") ("tap_adapter.up_script", po::value()->default_value(""), "The tap adapter up script.") ("tap_adapter.down_script", po::value()->default_value(""), "The tap adapter down script.") ; return result; } po::options_description get_switch_options() { po::options_description result("Switch options"); result.add_options() ("switch.routing_method", po::value()->default_value(fl::switch_configuration::RM_SWITCH), "The routing method for messages.") ("switch.relay_mode_enabled", po::value()->default_value(false, "no"), "Whether to enable the relay mode.") ; return result; } po::options_description get_router_options() { po::options_description result("Router options"); result.add_options() ("router.local_ip_route", po::value >()->multitoken()->zero_tokens()->default_value(std::vector(), ""), "A route to advertise to the other peers.") ("router.local_dns_server", po::value >()->multitoken()->zero_tokens()->default_value(std::vector(), ""), "A DNS server to advertise to the other peers.") ("router.client_routing_enabled", po::value()->default_value(true, "yes"), "Whether to enable client routing.") ("router.accept_routes_requests", po::value()->default_value(true, "yes"), "Whether to accept routes requests.") ("router.internal_route_acceptance_policy", po::value()->default_value(fl::router_configuration::internal_route_scope_type::unicast_in_network), "The internal route acceptance policy.") ("router.system_route_acceptance_policy", po::value()->default_value(fl::router_configuration::system_route_scope_type::none), "The system route acceptance policy.") ("router.maximum_routes_limit", po::value()->default_value(1), "The maximum count of routes to accept for a given host.") ("router.dns_servers_acceptance_policy", po::value()->default_value(fl::router_configuration::dns_servers_scope_type::in_network), "The DNS servers acceptance policy.") ("router.dns_script", po::value()->default_value(""), "The DNS script.") ; return result; } void make_paths_absolute(boost::program_options::variables_map& vm, const boost::filesystem::path& root) { make_path_absolute("server.server_certificate_file", vm, root); make_path_absolute("server.server_private_key_file", vm, root); make_path_absolute("server.certification_authority_certificate_file", vm, root); make_path_absolute("server.certification_authority_private_key_file", vm, root); make_path_absolute("server.authentication_script", vm, root); make_path_list_absolute("fscp.dynamic_contact_file", vm, root); make_path_absolute("security.signature_certificate_file", vm, root); make_path_absolute("security.signature_private_key_file", vm, root); make_path_absolute("security.certificate_validation_script", vm, root); make_path_list_absolute("security.authority_certificate_file", vm, root); make_path_list_absolute("security.certificate_revocation_list_file", vm, root); make_path_absolute("tap_adapter.up_script", vm, root); make_path_absolute("tap_adapter.down_script", vm, root); } void setup_configuration(const fscp::logger& logger, fl::configuration& configuration, const po::variables_map& vm) { typedef fl::security_configuration::cert_type cert_type; typedef cryptoplus::pkey::pkey pkey; // Server options configuration.server.enabled = vm["server.enabled"].as(); configuration.server.listen_on = vm["server.listen_on"].as(); configuration.server.protocol = vm["server.protocol"].as(); if (load_certificate(configuration.server.server_certificate, "server.server_certificate_file", vm)) { logger(fscp::log_level::information) << "Loaded server certificate from: " << vm["server.server_certificate_file"].as(); } if (load_private_key(configuration.server.server_private_key, "server.server_private_key_file", vm)) { logger(fscp::log_level::information) << "Loaded server private key from: " << vm["server.server_private_key_file"].as(); } if (load_trusted_certificate(configuration.server.certification_authority_certificate, "server.certification_authority_certificate_file", vm)) { logger(fscp::log_level::information) << "Loaded server CA certificate from: " << vm["server.certification_authority_certificate_file"].as(); } if (load_private_key(configuration.server.certification_authority_private_key, "server.certification_authority_private_key_file", vm)) { logger(fscp::log_level::information) << "Loaded server CA private key from: " << vm["server.certification_authority_private_key_file"].as(); } configuration.server.authentication_script = vm["server.authentication_script"].as(); // Client options configuration.client.enabled = vm["client.enabled"].as(); configuration.client.server_endpoint = vm["client.server_endpoint"].as(); configuration.client.protocol = vm["client.protocol"].as(); configuration.client.disable_peer_verification = vm["client.disable_peer_verification"].as(); configuration.client.disable_host_verification = vm["client.disable_host_verification"].as(); configuration.client.username = vm["client.username"].as(); configuration.client.password = vm["client.password"].as(); const std::vector public_endpoint = vm["client.public_endpoint"].as >(); configuration.client.public_endpoint_list.insert(public_endpoint.begin(), public_endpoint.end()); // FSCP options configuration.fscp.hostname_resolution_protocol = vm["fscp.hostname_resolution_protocol"].as(); configuration.fscp.listen_on = vm["fscp.listen_on"].as(); configuration.fscp.listen_on_device = vm["fscp.listen_on_device"].as(); configuration.fscp.hello_timeout = vm["fscp.hello_timeout"].as().to_time_duration(); const std::vector contact = vm["fscp.contact"].as >(); configuration.fscp.contact_list.insert(contact.begin(), contact.end()); configuration.fscp.accept_contact_requests = vm["fscp.accept_contact_requests"].as(); configuration.fscp.accept_contacts = vm["fscp.accept_contacts"].as(); if (load_certificate_list(configuration.fscp.dynamic_contact_list, "fscp.dynamic_contact_file", vm)) { for (auto _file : vm["fscp.dynamic_contact_file"].as>()) { logger(fscp::log_level::information) << "Loaded dynamic contact certificate from: " << _file; } } configuration.fscp.never_contact_list = vm["fscp.never_contact"].as>(); configuration.fscp.cipher_suite_capabilities = vm["fscp.cipher_suite_capability"].as>(); configuration.fscp.elliptic_curve_capabilities = vm["fscp.elliptic_curve_capability"].as>(); // Security options const std::string passphrase = vm["security.passphrase"].as(); const std::string passphrase_salt = vm["security.passphrase_salt"].as(); const unsigned int passphrase_iterations_count = vm["security.passphrase_iterations_count"].as(); cryptoplus::buffer pre_shared_key; if (!passphrase.empty()) { logger(fscp::log_level::information) << "Deriving pre-shared key from passphrase..."; const auto mdalg = cryptoplus::hash::message_digest_algorithm(NID_sha256); pre_shared_key = cryptoplus::hash::pbkdf2(&passphrase[0], passphrase.size(), &passphrase_salt[0], passphrase_salt.size(), mdalg, passphrase_iterations_count); } cert_type signature_certificate; pkey signature_private_key; if (load_certificate(signature_certificate, "security.signature_certificate_file", vm)) { logger(fscp::log_level::information) << "Loaded signature certificate from: " << vm["security.signature_certificate_file"].as(); } if (load_private_key(signature_private_key, "security.signature_private_key_file", vm)) { logger(fscp::log_level::information) << "Loaded signature private key from: " << vm["security.signature_private_key_file"].as(); } if ((!!signature_certificate && !!signature_private_key) || !!pre_shared_key) { configuration.security.identity = fscp::identity_store(signature_certificate, signature_private_key, pre_shared_key); } configuration.security.certificate_validation_method = vm["security.certificate_validation_method"].as(); configuration.security.certificate_validation_script = vm["security.certificate_validation_script"].as(); if (load_trusted_certificate_list(configuration.security.certificate_authority_list, "security.authority_certificate_file", vm)) { for (auto _file : vm["security.authority_certificate_file"].as>()) { logger(fscp::log_level::information) << "Loaded authority certificate from: " << _file; } } configuration.security.certificate_revocation_validation_method = vm["security.certificate_revocation_validation_method"].as(); if (load_crl_list(configuration.security.certificate_revocation_list_list, "security.certificate_revocation_list_file", vm)) { for (auto _file : vm["security.certificate_revocation_list_file"].as>()) { logger(fscp::log_level::information) << "Loaded certificate revocation file from: " << _file; } } // Tap adapter options configuration.tap_adapter.type = vm["tap_adapter.type"].as(); configuration.tap_adapter.enabled = vm["tap_adapter.enabled"].as(); if (vm.count("tap_adapter.name")) { configuration.tap_adapter.name = vm["tap_adapter.name"].as(); } configuration.tap_adapter.mtu = vm["tap_adapter.mtu"].as(); configuration.tap_adapter.mss_override = vm["tap_adapter.mss_override"].as(); configuration.tap_adapter.metric = vm["tap_adapter.metric"].as(); if (vm.count("tap_adapter.ipv4_address_prefix_length")) { configuration.tap_adapter.ipv4_address_prefix_length = vm["tap_adapter.ipv4_address_prefix_length"].as(); } if (vm.count("tap_adapter.ipv6_address_prefix_length")) { configuration.tap_adapter.ipv6_address_prefix_length = vm["tap_adapter.ipv6_address_prefix_length"].as(); } if (vm.count("tap_adapter.remote_ipv4_address")) { configuration.tap_adapter.remote_ipv4_address = vm["tap_adapter.remote_ipv4_address"].as().address(); } configuration.tap_adapter.arp_proxy_enabled = vm["tap_adapter.arp_proxy_enabled"].as(); configuration.tap_adapter.arp_proxy_fake_ethernet_address = vm["tap_adapter.arp_proxy_fake_ethernet_address"].as(); configuration.tap_adapter.dhcp_proxy_enabled = vm["tap_adapter.dhcp_proxy_enabled"].as(); configuration.tap_adapter.dhcp_server_ipv4_address_prefix_length = vm["tap_adapter.dhcp_server_ipv4_address_prefix_length"].as(); configuration.tap_adapter.dhcp_server_ipv6_address_prefix_length = vm["tap_adapter.dhcp_server_ipv6_address_prefix_length"].as(); configuration.tap_adapter.up_script = vm["tap_adapter.up_script"].as(); configuration.tap_adapter.down_script = vm["tap_adapter.down_script"].as(); // Switch options configuration.switch_.routing_method = vm["switch.routing_method"].as(); configuration.switch_.relay_mode_enabled = vm["switch.relay_mode_enabled"].as(); // Router const auto local_ip_routes = vm["router.local_ip_route"].as >(); configuration.router.local_ip_routes.insert(local_ip_routes.begin(), local_ip_routes.end()); const auto local_ip_dns_servers = vm["router.local_dns_server"].as >(); configuration.router.local_dns_servers.insert(local_ip_dns_servers.begin(), local_ip_dns_servers.end()); configuration.router.client_routing_enabled = vm["router.client_routing_enabled"].as(); configuration.router.accept_routes_requests = vm["router.accept_routes_requests"].as(); configuration.router.internal_route_acceptance_policy = vm["router.internal_route_acceptance_policy"].as(); configuration.router.system_route_acceptance_policy = vm["router.system_route_acceptance_policy"].as(); configuration.router.maximum_routes_limit = vm["router.maximum_routes_limit"].as(); configuration.router.dns_servers_acceptance_policy = vm["router.dns_servers_acceptance_policy"].as(); configuration.router.dns_script = vm["router.dns_script"].as(); } freelan-2.0/apps/freelan/src/configuration_helper.hpp000066400000000000000000000073631252300335000230560ustar00rootroot00000000000000/* * freelan - An open, multi-platform software to establish peer-to-peer virtual * private networks. * * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of freelan. * * freelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * freelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use freelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file configuration_helper.hpp * \author Julien KAUFFMANN * \brief A configuration helper. */ #ifndef CONFIGURATION_HELPER_HPP #define CONFIGURATION_HELPER_HPP #include #include #include #include /** * \brief Get the server options. * \return The server options. */ boost::program_options::options_description get_server_options(); /** * \brief Get the client options. * \return The client options. */ boost::program_options::options_description get_client_options(); /** * \brief Get the fscp options. * \return The fscp options. */ boost::program_options::options_description get_fscp_options(); /** * \brief Get the security options. * \return The security options. */ boost::program_options::options_description get_security_options(); /** * \brief Get the tap adapter options. * \return The tap adapter options. */ boost::program_options::options_description get_tap_adapter_options(); /** * \brief Get the switch options. * \return The switch options. */ boost::program_options::options_description get_switch_options(); /** * \brief Get the router options. * \return The router options. */ boost::program_options::options_description get_router_options(); /** * \brief Set the paths options relative to the specified root. * \param vm The variables map. * \param root The root directory for relative paths. */ void make_paths_absolute(boost::program_options::variables_map& vm, const boost::filesystem::path& root); /** * \brief Setup a freelan configuration from a variables map. * \param logger The logger to use. * \param configuration The configuration to setup. * \param vm The variables map. * \warning On error, a boost::program_options::error might be thrown. */ void setup_configuration(const fscp::logger& logger, freelan::configuration& configuration, const boost::program_options::variables_map& vm); #endif /* CONFIGURATION_HELPER_HPP */ freelan-2.0/apps/freelan/src/configuration_types.cpp000066400000000000000000000036511252300335000227320ustar00rootroot00000000000000/* * freelan - An open, multi-platform software to establish peer-to-peer virtual * private networks. * * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of freelan. * * freelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * freelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use freelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file configuration_types.cpp * \author Julien KAUFFMANN * \brief Configuration related types. */ #include "configuration_types.hpp" freelan-2.0/apps/freelan/src/configuration_types.hpp000066400000000000000000000111131252300335000227270ustar00rootroot00000000000000/* * freelan - An open, multi-platform software to establish peer-to-peer virtual * private networks. * * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of freelan. * * freelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * freelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use freelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file configuration_types.hpp * \author Julien KAUFFMANN * \brief Configuration related types. */ #ifndef CONFIGURATION_TYPES_HPP #define CONFIGURATION_TYPES_HPP #include #include #include /** * \brief A duration in milliseconds. */ class millisecond_duration { public: /** * \brief Create a null duration. */ millisecond_duration() : m_ms() {} /** * \brief Create a millisecond duration. * \param ms The millisecond count. */ millisecond_duration(unsigned int ms) : m_ms(ms) {} /** * \brief Create a millisecond duration. * \param duration The duration. */ millisecond_duration(const boost::posix_time::time_duration& duration) : m_ms(static_cast(duration.total_milliseconds())) {} /** * \brief Conversion operator. * \return The converted value. */ unsigned int to_int() const { return m_ms; } /** * \brief Conversion operator. * \return The converted value. */ boost::posix_time::time_duration to_time_duration() const { return boost::posix_time::milliseconds(m_ms); } private: unsigned int m_ms; friend std::ostream& operator<<(std::ostream&, const millisecond_duration&); friend std::istream& operator>>(std::istream&, millisecond_duration&); }; inline std::ostream& operator<<(std::ostream& os, const millisecond_duration& value) { return os << std::dec << value.m_ms; } inline std::istream& operator>>(std::istream& is, millisecond_duration& value) { return is >> std::dec >> value.m_ms; } /** * \brief A generic wrapper class. * \tparam Type The type of the object to wrap. Type must be default-constructible. */ template class wrapper { public: /** * \brief The wrapped type. */ typedef Type wrapped_type; /** * \brief Create a default wrapper object. */ wrapper() {} /** * \brief Create a new wrapped object. * \tparam OtherType The other type. * \param value A value. */ template wrapper(OtherType value) : m_object(value) {} /** * \brief Conversion operator. * \tparam OtherType The other type. * \return The converted value. */ template operator OtherType() const { return m_object; } private: Type m_object; template friend std::istream& operator>>(std::istream&, wrapper&); template friend std::ostream& operator<<(std::ostream&, const wrapper&); }; template inline std::istream& operator>>(std::istream& is, wrapper& value) { return is >> value.m_object; } template inline std::ostream& operator<<(std::ostream& os, const wrapper& value) { return os << value.m_object; } #endif /* CONFIGURATION_TYPES_HPP */ freelan-2.0/apps/freelan/src/main.cpp000066400000000000000000000355121252300335000175640ustar00rootroot00000000000000/* * freelan - An open, multi-platform software to establish peer-to-peer virtual * private networks. * * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of freelan. * * freelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * freelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use freelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file main.cpp * \author Julien KAUFFMANN * \brief The main file. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef WINDOWS #include "windows/service.hpp" #else #include "posix/daemon.hpp" #include "posix/locked_pid_file.hpp" #include #endif #include "tools.hpp" #include "system.hpp" #include "configuration_helper.hpp" #include "colors.hpp" // This file is generated locally. #include namespace fs = boost::filesystem; namespace fl = freelan; namespace { boost::mutex log_mutex; } struct cli_configuration { cli_configuration() : fl_configuration(), debug(false), #ifndef WINDOWS thread_count(0), foreground(false), syslog(false), pid_file() #else thread_count(0) #endif {} fl::configuration fl_configuration; bool debug; unsigned int thread_count; #ifndef WINDOWS bool foreground; bool syslog; fs::path pid_file; #endif }; std::vector get_configuration_files() { std::vector configuration_files; configuration_files.push_back(get_home_directory() / "freelan.cfg"); configuration_files.push_back(get_configuration_directory() / "freelan.cfg"); return configuration_files; } static bool DISABLE_COLOR = false; std::string log_level_to_string_extended(fscp::log_level level) { #ifdef WINDOWS // No color support on Windows. return log_level_to_string(level); #else if (!DISABLE_COLOR && ::isatty(STDOUT_FILENO)) { // This is a terminal, we probably have color support. return log_level_to_color(level) + log_level_to_string(level) + COLOR_RESET; } else { return log_level_to_string(level); } #endif } void do_log(fscp::log_level level, const std::string& msg, const boost::posix_time::ptime& timestamp = boost::posix_time::microsec_clock::local_time()) { boost::mutex::scoped_lock lock(log_mutex); std::cout << boost::posix_time::to_iso_extended_string(timestamp) << " [" << log_level_to_string_extended(level) << "] " << msg << std::endl; } void signal_handler(const boost::system::error_code& error, int signal_number, fl::core& core, int& exit_signal) { if (!error) { do_log(fscp::log_level::warning, "Signal caught (" + boost::lexical_cast(signal_number) + "): exiting..."); core.close(); exit_signal = signal_number; } } bool parse_options(fscp::logger& logger, int argc, char** argv, cli_configuration& configuration) { namespace po = boost::program_options; po::options_description visible_options; po::options_description all_options; po::options_description generic_options("Generic options"); generic_options.add_options() ("help,h", "Produce help message.") ("version,v", "Get the program version.") ("debug,d", "Enables debug output.") ("threads,t", po::value(&configuration.thread_count)->default_value(0), "The number of threads to use.") ("configuration_file,c", po::value(), "The configuration file to use.") ; visible_options.add(generic_options); all_options.add(generic_options); po::options_description configuration_options("Configuration"); configuration_options.add(get_server_options()); configuration_options.add(get_client_options()); configuration_options.add(get_fscp_options()); configuration_options.add(get_security_options()); configuration_options.add(get_tap_adapter_options()); configuration_options.add(get_switch_options()); configuration_options.add(get_router_options()); visible_options.add(configuration_options); all_options.add(configuration_options); #ifdef WINDOWS po::options_description service_options("Service"); service_options.add_options() ("install", "Install the service.") ("uninstall", "Uninstall the service.") ("reinstall", "Reinstall the service.") ; visible_options.add(service_options); all_options.add(service_options); #else po::options_description daemon_options("Daemon"); daemon_options.add_options() ("foreground,f", "Do not run as a daemon.") ("syslog,s", "Alwats log to syslog (useful when running with --foreground on OSX with launchd).") ("pid_file,p", po::value(), "A pid file to use.") ; visible_options.add(daemon_options); all_options.add(daemon_options); po::options_description misc_options("Miscellaneous"); misc_options.add_options() ("nocolor", "Disable color output.") ; visible_options.add(misc_options); all_options.add(misc_options); #endif po::variables_map vm; po::store(po::parse_command_line(argc, argv, all_options), vm); make_paths_absolute(vm, fs::current_path()); if (vm.count("help")) { std::cout << visible_options << std::endl; return false; } if (vm.count("version")) { std::cout << FREELAN_NAME << " " << FREELAN_VERSION_STRING << " " << FREELAN_DATE << std::endl; return false; } #ifdef WINDOWS if (vm.count("install")) { if (vm.count("uninstall")) { throw std::runtime_error("Cannot specify both --install and --uninstall options. Use --reinstall instead."); } else { if (windows::install_service()) { logger(fscp::log_level::important) << "Service installed."; } else { logger(fscp::log_level::error) << "The service was already installed."; } return false; } } else if (vm.count("uninstall")) { if (windows::uninstall_service()) { logger(fscp::log_level::important) << "Service uninstalled."; } else { logger(fscp::log_level::error) << "The service has already been deleted."; } return false; } else if (vm.count("reinstall")) { if (windows::uninstall_service()) { logger(fscp::log_level::important) << "Service uninstalled."; } else { logger(fscp::log_level::error) << "The service has already been deleted."; } if (windows::install_service()) { logger(fscp::log_level::important) << "Service installed."; } else { logger(fscp::log_level::error) << "The service was already installed."; } return false; } #else configuration.foreground = (vm.count("foreground") > 0); configuration.syslog = (vm.count("syslog") > 0); if (vm.count("nocolor") > 0) { // This is a global variable. Not really nice but does its job in this case. DISABLE_COLOR = true; } if (vm.count("pid_file")) { configuration.pid_file = fs::absolute(vm["pid_file"].as()); } else { char* val = getenv("FREELAN_PID_FILE"); if (val) { configuration.pid_file = fs::absolute(std::string(val)); } } #endif fs::path configuration_file; if (vm.count("configuration_file")) { configuration_file = fs::absolute(vm["configuration_file"].as()); } else { #ifdef _MSC_VER #ifdef UNICODE std::wstring value(4096, L'\0'); const DWORD value_size = GetEnvironmentVariable(L"FREELAN_CONFIGURATION_FILE", &value[0], static_cast(value.size())); #else std::string value(4096, '\0'); const DWORD value_size = GetEnvironmentVariable("FREELAN_CONFIGURATION_FILE", &value[0], static_cast(value.size())); #endif if (value_size > 0) { value.resize(value_size); configuration_file = fs::absolute(value); } #else const char* val = getenv("FREELAN_CONFIGURATION_FILE"); if (val) { configuration_file = fs::absolute(std::string(val)); } #endif } if (!configuration_file.empty()) { logger(fscp::log_level::information) << "Reading configuration file at: " << configuration_file; fs::basic_ifstream ifs(configuration_file); if (!ifs) { throw po::reading_file(configuration_file.string().c_str()); } po::store(po::parse_config_file(ifs, configuration_options, true), vm); } else { bool configuration_read = false; const std::vector configuration_files = get_configuration_files(); BOOST_FOREACH(const fs::path& conf, configuration_files) { fs::basic_ifstream ifs(conf); if (ifs) { logger(fscp::log_level::information) << "Reading configuration file at: " << conf << std::endl; po::store(po::parse_config_file(ifs, configuration_options, true), vm); configuration_file = fs::absolute(conf); configuration_read = true; break; } } if (!configuration_read) { logger(fscp::log_level::warning) << "Warning ! No configuration file specified and none found in the environment."; logger(fscp::log_level::warning) << "Looked up locations were:"; for (auto&& conf : configuration_files) { logger(fscp::log_level::warning) << "- " << conf; } } } make_paths_absolute(vm, configuration_file.parent_path()); po::notify(vm); configuration.debug = vm.count("debug") > 0; if (configuration.debug) { logger.set_level(fscp::log_level::trace); } setup_configuration(logger, configuration.fl_configuration, vm); return true; } void run(fscp::logger& logger, const cli_configuration& configuration, int& exit_signal) { #ifndef WINDOWS boost::shared_ptr pid_file; if (!configuration.pid_file.empty()) { logger(fscp::log_level::information) << "Creating PID file at: " << configuration.pid_file << std::endl; pid_file.reset(new posix::locked_pid_file(configuration.pid_file)); } #endif freelan::core::log_handler_type log_func = &do_log; #ifndef WINDOWS if (!configuration.foreground) { posix::daemonize(); log_func = &posix::syslog; } else if (configuration.syslog) { log_func = &posix::syslog; } if (pid_file) { pid_file->write_pid(); } #endif boost::asio::io_service io_service; boost::asio::signal_set signals(io_service, SIGINT, SIGTERM); fl::core core(io_service, configuration.fl_configuration); core.set_log_level(logger.level()); core.set_log_callback(log_func); if (!configuration.fl_configuration.tap_adapter.up_script.empty()) { core.set_tap_adapter_up_callback(boost::bind(&execute_tap_adapter_up_script, configuration.fl_configuration.tap_adapter.up_script, logger, _1)); } if (!configuration.fl_configuration.tap_adapter.down_script.empty()) { core.set_tap_adapter_down_callback(boost::bind(&execute_tap_adapter_down_script, configuration.fl_configuration.tap_adapter.down_script, logger, _1)); } if (!configuration.fl_configuration.security.certificate_validation_script.empty()) { core.set_certificate_validation_callback(boost::bind(&execute_certificate_validation_script, configuration.fl_configuration.security.certificate_validation_script, logger, _1)); } if (!configuration.fl_configuration.server.authentication_script.empty()) { core.set_authentication_callback(boost::bind(&execute_authentication_script, configuration.fl_configuration.server.authentication_script, logger, _1, _2, _3, _4)); } if (!configuration.fl_configuration.router.dns_script.empty()) { core.set_dns_callback(boost::bind(&execute_dns_script, configuration.fl_configuration.router.dns_script, logger, _1, _2, _3)); } core.open(); signals.async_wait(boost::bind(signal_handler, _1, _2, boost::ref(core), boost::ref(exit_signal))); boost::thread_group threads; unsigned int thread_count = configuration.thread_count; if (thread_count == 0) { thread_count = boost::thread::hardware_concurrency(); // Some implementation can return 0. if (thread_count == 0) { // We create 2 threads. thread_count = 2; } } logger(fscp::log_level::information) << "Using " << thread_count << " thread(s)."; logger(fscp::log_level::important) << "Execution started."; for (std::size_t i = 0; i < thread_count; ++i) { threads.create_thread([i, &io_service, &core, &logger, &signals](){ logger(fscp::log_level::debug) << "Thread #" << i << " started."; try { io_service.run(); } catch (std::exception& ex) { logger(fscp::log_level::error) << "Fatal exception occured in thread #" << i << ": " << ex.what(); core.close(); signals.cancel(); } logger(fscp::log_level::debug) << "Thread #" << i << " stopped."; }); } threads.join_all(); logger(fscp::log_level::important) << "Execution stopped."; } int main(int argc, char** argv) { #ifdef WINDOWS if (windows::run_service()) { return EXIT_SUCCESS; } #endif int exit_signal = 0; try { cryptoplus::crypto_initializer crypto_initializer; cryptoplus::algorithms_initializer algorithms_initializer; cryptoplus::error::error_strings_initializer error_strings_initializer; freelan::initializer freelan_initializer; cli_configuration configuration; fscp::logger logger(&do_log, fscp::log_level::information); if (parse_options(logger, argc, argv, configuration)) { run(logger, configuration, exit_signal); } } catch (std::exception& ex) { do_log(fscp::log_level::error, ex.what()); return EXIT_FAILURE; } #ifndef WINDOWS if (exit_signal != 0) { do_log(fscp::log_level::error, "Execution aborted because of a signal (" + boost::lexical_cast(exit_signal) + ")."); // We kill ourselves with the signal to ensure the process exits with the proprer state. // // This ensures that the calling process knows about this process being killed. kill(getpid(), exit_signal); } #endif return EXIT_SUCCESS; } freelan-2.0/apps/freelan/src/posix/000077500000000000000000000000001252300335000172705ustar00rootroot00000000000000freelan-2.0/apps/freelan/src/posix/daemon.cpp000066400000000000000000000055241252300335000212450ustar00rootroot00000000000000/* * freelan - An open, multi-platform software to establish peer-to-peer virtual * private networks. * * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of freelan. * * freelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * freelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use freelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file daemon.cpp * \author Julien KAUFFMANN * \brief POSIX related daemon functions. */ #include "daemon.hpp" #include #include #include #include #include "../tools.hpp" namespace posix { void daemonize() { pid_t pid = ::fork(); if (pid < 0) { throw boost::system::system_error(errno, boost::system::system_category(), "Cannot fork the current process."); } if (pid > 0) { exit(EXIT_SUCCESS); } ::openlog("freelan", LOG_PID, LOG_DAEMON); pid_t sid = ::setsid(); if (sid < 0) { ::syslog(LOG_ERR, "setsid():%u:%s", errno, strerror(errno)); exit(EXIT_FAILURE); } if (::chdir("/") < 0) { ::syslog(LOG_ERR, "chdir():%u:%s", errno, strerror(errno)); exit(EXIT_FAILURE); } ::close(STDIN_FILENO); ::close(STDOUT_FILENO); ::close(STDERR_FILENO); } void syslog(fscp::log_level level, const std::string& msg, const boost::posix_time::ptime&) { // We ignore the timestamp. ::syslog(log_level_to_syslog_priority(level), "%s", msg.c_str()); } } freelan-2.0/apps/freelan/src/posix/daemon.hpp000066400000000000000000000044651252300335000212550ustar00rootroot00000000000000/* * freelan - An open, multi-platform software to establish peer-to-peer virtual * private networks. * * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of freelan. * * freelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * freelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use freelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file daemon.hpp * \author Julien KAUFFMANN * \brief POSIX related daemon functions. */ #ifndef POSIX_DAEMON_HPP #define POSIX_DAEMON_HPP #include #include namespace posix { /** * \brief Turn the current process into a daemon. */ void daemonize(); /** * \brief Log a message to syslog. * \param level The freelan level. * \param msg The message to log. */ void syslog(fscp::log_level level, const std::string& msg, const boost::posix_time::ptime&); } #endif /* POSIX_DAEMON_HPP */ freelan-2.0/apps/freelan/src/posix/locked_pid_file.cpp000066400000000000000000000045451252300335000231000ustar00rootroot00000000000000/* * freelan - An open, multi-platform software to establish peer-to-peer virtual * private networks. * * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of freelan. * * freelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * freelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use freelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file locked_pid_file.cpp * \author Julien KAUFFMANN * \brief A flocked PID file handling class. */ #include "locked_pid_file.hpp" #include #include #include namespace posix { locked_pid_file::locked_pid_file(const boost::filesystem::path& path) : pid_file(path) { if (::flock(file_descriptor(), LOCK_EX) != 0) { throw boost::system::system_error(errno, boost::system::system_category(), "Locking on the PID file"); } } locked_pid_file::~locked_pid_file() { ::flock(file_descriptor(), LOCK_UN); } } freelan-2.0/apps/freelan/src/posix/locked_pid_file.hpp000066400000000000000000000045631252300335000231050ustar00rootroot00000000000000/* * freelan - An open, multi-platform software to establish peer-to-peer virtual * private networks. * * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of freelan. * * freelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * freelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use freelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file locked_pid_file.hpp * \author Julien KAUFFMANN * \brief A flocked PID file handling class. */ #ifndef LOCKED_PID_FILE_HPP #define LOCKED_PID_FILE_HPP #include "pid_file.hpp" namespace posix { class locked_pid_file : public pid_file { public: /** * \brief Create a PID file. * \param path The path to the PID file to create. * * If the specified file already exists, creation fails. */ locked_pid_file(const boost::filesystem::path& path); /** * \brief Destroy the PID file. */ ~locked_pid_file(); }; } #endif /* LOCKED_PID_FILE_HPP */ freelan-2.0/apps/freelan/src/posix/pid_file.cpp000066400000000000000000000053611252300335000215540ustar00rootroot00000000000000/* * freelan - An open, multi-platform software to establish peer-to-peer virtual * private networks. * * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of freelan. * * freelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * freelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use freelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file pid_file.cpp * \author Julien KAUFFMANN * \brief A PID file handling class. */ #include "pid_file.hpp" #include #include #include #include #include #include namespace posix { pid_file::pid_file(const boost::filesystem::path& path) : m_file_path(path), m_file_descriptor(::open(path.c_str(), O_CREAT | O_EXCL | O_WRONLY, 0644)) { if (m_file_descriptor < 0) { throw boost::system::system_error(errno, boost::system::system_category(), "Creating PID file"); } } pid_file::~pid_file() { ::unlink(m_file_path.c_str()); ::close(m_file_descriptor); } void pid_file::write_pid() const { const std::string pid = boost::lexical_cast(getpid()) + '\n'; if (::write(m_file_descriptor, pid.c_str(), pid.size()) < 0) { throw boost::system::system_error(errno, boost::system::system_category(), "Writing PID file"); } } } freelan-2.0/apps/freelan/src/posix/pid_file.hpp000066400000000000000000000053301252300335000215550ustar00rootroot00000000000000/* * freelan - An open, multi-platform software to establish peer-to-peer virtual * private networks. * * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of freelan. * * freelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * freelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use freelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file pid_file.hpp * \author Julien KAUFFMANN * \brief A PID file handling class. */ #ifndef PID_FILE_HPP #define PID_FILE_HPP #include namespace posix { class pid_file { public: /** * \brief Create a PID file. * \param path The path to the PID file to create. * * If the specified file already exists, creation fails. */ pid_file(const boost::filesystem::path& path); /** * \brief Destroy the PID file. */ ~pid_file(); /** * \brief Get the associated file descriptor. * \return The associated file descriptor. */ int file_descriptor() const { return m_file_descriptor; } /** * \brief Write the PID to the PID file. */ void write_pid() const; private: pid_file(const pid_file&); pid_file& operator=(const pid_file&); boost::filesystem::path m_file_path; int m_file_descriptor; }; } #endif /* PID_FILE_HPP */ freelan-2.0/apps/freelan/src/system.cpp000066400000000000000000000127431252300335000201650ustar00rootroot00000000000000/* * freelan - An open, multi-platform software to establish peer-to-peer virtual * private networks. * * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of freelan. * * freelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * freelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use freelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file system.cpp * \author Julien KAUFFMANN * \brief System related functions. */ #include "system.hpp" #include #include #include #include // This file is generated locally. #include #ifdef WINDOWS #include #include #include #else #include #endif namespace fs = boost::filesystem; #ifdef WINDOWS fs::path get_module_filename() { TCHAR path[_MAX_PATH + 1]; if (::GetModuleFileName(NULL, path, sizeof(path) / sizeof(path[0])) > 0) { return path; } else { throw boost::system::system_error(::GetLastError(), boost::system::system_category(), "GetModuleFileName()"); } } #endif boost::filesystem::path get_installation_directory() { #ifdef WINDOWS try { asiotap::registry_key installation_key(HKEY_LOCAL_MACHINE, "SOFTWARE\\FreeLAN"); return installation_key.query_path("installation_path"); } catch (const boost::system::system_error&) { return get_module_filename().parent_path().parent_path(); } #else return FREELAN_INSTALL_PREFIX; #endif } fs::path get_home_directory() { #ifdef WINDOWS TCHAR path[MAX_PATH] = {}; HRESULT ret = SHGetFolderPath(0, CSIDL_PROFILE, NULL, SHGFP_TYPE_CURRENT, path); if (FAILED(ret)) { throw std::runtime_error("Unable to determine the home directory"); } #else char* path = getenv("HOME"); if (path == NULL) { throw std::runtime_error("Unable to determine the home directory"); } #endif return fs::path(path) / "." FREELAN_NAME; } fs::path get_data_directory() { #ifdef WINDOWS TCHAR path[MAX_PATH] = {}; HRESULT ret = SHGetFolderPath(0, CSIDL_COMMON_APPDATA, NULL, SHGFP_TYPE_CURRENT, path); if (FAILED(ret)) { throw std::runtime_error("Unable to determine the application directory"); } return fs::path(path) / FREELAN_NAME; #else return FREELAN_INSTALL_PREFIX "/var/" FREELAN_NAME; #endif } fs::path get_configuration_directory() { #ifdef WINDOWS return get_installation_directory() / "/config/"; #else return get_installation_directory() / "/etc/" FREELAN_NAME; #endif } fs::path get_temporary_directory() { #ifdef WINDOWS TCHAR path[MAX_PATH] = {}; HRESULT ret = ::GetTempPath(sizeof(path), path); if (FAILED(ret)) { throw std::runtime_error("Unable to determine the temporary directory"); } return path; #else return "/tmp/"; #endif } #if defined(WINDOWS) && defined(UNICODE) int execute(const fscp::logger& logger, fs::path script, const std::vector& args, const std::map& env) #else int execute(const fscp::logger& logger, fs::path script, const std::vector& args, const std::map& env) #endif { #if defined(WINDOWS) && defined(UNICODE) std::vector real_args = { script.wstring() }; #else std::vector real_args = { script.string() }; #endif real_args.insert(real_args.end(), args.begin(), args.end()); auto new_env = executeplus::get_current_environment(); for (auto&& pair : env) { new_env[pair.first] = pair.second; } logger(fscp::log_level::debug) << "Calling script " << script.string() << "..."; #if defined(WINDOWS) const auto return_code = executeplus::execute(real_args, new_env); #else std::ostringstream oss; const auto return_code = executeplus::execute(real_args, new_env, &oss); #endif const auto log_level = (return_code == 0) ? fscp::log_level::debug : fscp::log_level::warning; logger(log_level) << "Script " << script.string() << " returned " << return_code << "."; #if !defined(WINDOWS) const auto output = oss.str(); if (!output.empty()) { logger(fscp::log_level::debug) << "Output follows:\n" << output; } #endif return return_code; } freelan-2.0/apps/freelan/src/system.hpp000066400000000000000000000071711252300335000201710ustar00rootroot00000000000000/* * freelan - An open, multi-platform software to establish peer-to-peer virtual * private networks. * * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of freelan. * * freelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * freelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use freelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file system.hpp * \author Julien KAUFFMANN * \brief System related functions. */ #ifndef SYSTEM_HPP #define SYSTEM_HPP #include #include #include #include #include #include #ifdef WINDOWS /** * \brief Get the filename of the current module. * \return The current module filename. */ boost::filesystem::path get_module_filename(); #endif /** * \brief Get the installation directory. * \return The installation directory. */ boost::filesystem::path get_installation_directory(); /** * \brief Get the home directory for the current user. * \return The home directory for the current user. */ boost::filesystem::path get_home_directory(); /** * \brief Get the application data directory. * \return The application data directory. */ boost::filesystem::path get_data_directory(); /** * \brief Get the application configuration directory. * \return The application configuration directory. */ boost::filesystem::path get_configuration_directory(); /** * \brief Get the temporary directory. * \return The temporary directory. */ boost::filesystem::path get_temporary_directory(); /** * \brief Execute a script and get the exit status. * \param script The script to execute. * \param args The parameters. * \param env Variables to inject into the environment. * \return The exit status. */ #if defined(WINDOWS) && defined(UNICODE) int execute(const fscp::logger& logger, boost::filesystem::path script, const std::vector& args, const std::map& env = std::map()); #else int execute(const fscp::logger& logger, boost::filesystem::path script, const std::vector& args, const std::map& env = std::map()); #endif #endif /* SYSTEM_HPP */ freelan-2.0/apps/freelan/src/tools.cpp000066400000000000000000000171751252300335000200050ustar00rootroot00000000000000/* * freelan - An open, multi-platform software to establish peer-to-peer virtual * private networks. * * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of freelan. * * freelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * freelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use freelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file tools.cpp * \author Julien KAUFFMANN * \brief Tools. */ #include "tools.hpp" #ifndef WINDOWS #include #endif #include #include #include #include "system.hpp" namespace fs = boost::filesystem; namespace fl = freelan; #ifndef WINDOWS int log_level_to_syslog_priority(fscp::log_level level) { switch (level) { case fscp::log_level::trace: return LOG_DEBUG; case fscp::log_level::debug: return LOG_DEBUG; case fscp::log_level::information: return LOG_INFO; case fscp::log_level::important: return LOG_NOTICE; case fscp::log_level::warning: return LOG_WARNING; case fscp::log_level::error: return LOG_ERR; case fscp::log_level::fatal: return LOG_CRIT; } assert(false); throw std::logic_error("Unsupported enumeration value"); } #else namespace { std::wstring to_wstring(const std::string& str) { iconvplus::iconv_instance iconv("utf-16", ""); iconvplus::converter converter(iconv); std::wostringstream out; std::istringstream in(str); converter.convert(in, out); return out.str(); } } #endif const char* log_level_to_string(fscp::log_level level) { switch (level) { case fscp::log_level::trace: return "TRACE"; case fscp::log_level::debug: return "DEBUG"; case fscp::log_level::information: return "INFORMATION"; case fscp::log_level::important: return "IMPORTANT"; case fscp::log_level::warning: return "WARNING"; case fscp::log_level::error: return "ERROR"; case fscp::log_level::fatal: return "FATAL"; } assert(false); throw std::logic_error("Unsupported enumeration value"); } void execute_tap_adapter_up_script(const boost::filesystem::path& script, const fscp::logger& logger, const asiotap::tap_adapter& tap_adapter) { #if defined(WINDOWS) && defined(UNICODE) int exit_status = execute(logger, script, { to_wstring(tap_adapter.name()) }); #else int exit_status = execute(logger, script, { tap_adapter.name() }); #endif if (exit_status != 0) { logger(fscp::log_level::warning) << "Up script exited with a non-zero exit status: " << exit_status; } } void execute_tap_adapter_down_script(const boost::filesystem::path& script, const fscp::logger& logger, const asiotap::tap_adapter& tap_adapter) { #if defined(WINDOWS) && defined(UNICODE) int exit_status = execute(logger, script, { to_wstring(tap_adapter.name()) }); #else int exit_status = execute(logger, script, { tap_adapter.name() }); #endif if (exit_status != 0) { logger(fscp::log_level::warning) << "Down script exited with a non-zero exit status: " << exit_status; } } bool execute_certificate_validation_script(const fs::path& script, const fscp::logger& logger, fl::security_configuration::cert_type cert) { static boost::mutex mutex; // This prevents two scripts validation to run at the same time. boost::mutex::scoped_lock lock(mutex); try { const fs::path filename = get_temporary_directory() / ("freelan_certificate.crt"); if (logger.level() <= fscp::log_level::debug) { logger(fscp::log_level::debug) << "Writing temporary certificate file at: " << filename; } #ifdef WINDOWS #ifdef UNICODE cert.write_certificate(cryptoplus::file::open(filename.string >(), L"w")); #else cert.write_certificate(cryptoplus::file::open(filename.string >(), "w")); #endif #else cert.write_certificate(cryptoplus::file::open(filename.string >(), "w")); #endif #if defined(WINDOWS) && defined(UNICODE) const int exit_status = execute(logger, script, { filename.wstring() }); #else const int exit_status = execute(logger, script, { filename.string() }); #endif if (logger.level() <= fscp::log_level::debug) { logger(fscp::log_level::debug) << script << " terminated execution with exit status " << exit_status ; } fs::remove(filename); return (exit_status == 0); } catch (std::exception& ex) { logger(fscp::log_level::warning) << "Error while executing certificate validation script (" << script << "): " << ex.what() ; return false; } } bool execute_authentication_script(const boost::filesystem::path& script, const fscp::logger& logger, const std::string& username, const std::string& password, const std::string& remote_host, uint16_t remote_port) { #if defined(WINDOWS) && defined(UNICODE) std::map env; env[L"FREELAN_USERNAME"] = to_wstring(username); env[L"FREELAN_PASSWORD"] = to_wstring(password); env[L"FREELAN_REMOTE_HOST"] = to_wstring(remote_host); env[L"FREELAN_REMOTE_PORT"] = to_wstring(boost::lexical_cast(remote_port)); int exit_status = execute(logger, script, {}, env); #else std::map env; env["FREELAN_USERNAME"] = username; env["FREELAN_PASSWORD"] = password; env["FREELAN_REMOTE_HOST"] = remote_host; env["FREELAN_REMOTE_PORT"] = boost::lexical_cast(remote_port); int exit_status = execute(logger, script, {}, env); #endif if (exit_status != 0) { logger(fscp::log_level::warning) << "Authentication script exited with a non-zero exit status: " << exit_status; } return (exit_status == 0); } bool execute_dns_script(const boost::filesystem::path& script, const fscp::logger& logger, const std::string& tap_adapter, freelan::core::DnsAction action, const boost::asio::ip::address& dns_server) { const std::string str_action = (action == freelan::core::DnsAction::Add) ? "add" : "remove"; #if defined(WINDOWS) && defined(UNICODE) int exit_status = execute(logger, script, { to_wstring(tap_adapter), to_wstring(str_action), to_wstring(dns_server.to_string()) }); #else int exit_status = execute(logger, script, { tap_adapter, str_action, dns_server.to_string() }); #endif if (exit_status != 0) { logger(fscp::log_level::warning) << "DNS script exited with a non-zero exit status: " << exit_status; } return (exit_status == 0); }freelan-2.0/apps/freelan/src/tools.hpp000066400000000000000000000110731252300335000200010ustar00rootroot00000000000000/* * freelan - An open, multi-platform software to establish peer-to-peer virtual * private networks. * * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of freelan. * * freelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * freelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use freelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file tools.hpp * \author Julien KAUFFMANN * \brief Tools. */ #ifndef TOOLS_HPP #define TOOLS_HPP #include #include #include #include #include #include #ifndef WINDOWS /** * \brief Convert the specified log level to its syslog equivalent priority. * \param level The log level. * \return The syslog equivalent priority. */ int log_level_to_syslog_priority(fscp::log_level level); #endif /** * \brief Convert the specified log level to its string representation. * \param level The log level. * \return The string representation of level. */ const char* log_level_to_string(fscp::log_level level); /** * \brief The tap adapter up function. * \param script The script to call. * \param logger The logger instance. * \param tap_adapter The tap_adapter instance. */ void execute_tap_adapter_up_script(const boost::filesystem::path& script, const fscp::logger& logger, const asiotap::tap_adapter& tap_adapter); /** * \brief The tap adapter down function. * \param script The script to call. * \param logger The logger instance. * \param tap_adapter The tap_adapter instance. */ void execute_tap_adapter_down_script(const boost::filesystem::path& script, const fscp::logger& logger, const asiotap::tap_adapter& tap_adapter); /** * \brief The certificate validation function. * \param script The script to call. * \param logger The logger instance. * \param cert The certificate. * \return The execution result of the specified script. */ bool execute_certificate_validation_script(const boost::filesystem::path& script, const fscp::logger& logger, freelan::security_configuration::cert_type cert); /** * \brief The authentication function. * \param script The script to call. * \param logger The logger instance. * \param username The username. * \param password The password. * \param remote_host The remote host. * \param remote_port The remote port. * \return The execution result of the specified script. */ bool execute_authentication_script(const boost::filesystem::path& script, const fscp::logger& logger, const std::string& username, const std::string& password, const std::string& remote_host, uint16_t remote_port); /** * \brief The DNS function. * \param script The script to call. * \param logger The logger instance. * \param tap_adapter The tap_adapter instance. * \param action A flag that indicates the action. * \param dns_server The DNS server address to add or remove. * \return The execution result of the specified script. */ bool execute_dns_script(const boost::filesystem::path& script, const fscp::logger& logger, const std::string& tap_adapter, freelan::core::DnsAction action, const boost::asio::ip::address& dns_server); #endif /* TOOLS_HPP */ freelan-2.0/apps/freelan/src/windows/000077500000000000000000000000001252300335000176205ustar00rootroot00000000000000freelan-2.0/apps/freelan/src/windows/service.cpp000066400000000000000000000413121252300335000217650ustar00rootroot00000000000000/* * freelan - An open, multi-platform software to establish peer-to-peer virtual * private networks. * * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of freelan. * * freelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * freelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use freelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file service.cpp * \author Julien KAUFFMANN * \brief Windows related service functions. */ #include "service.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../tools.hpp" #include "../system.hpp" #include "../configuration_helper.hpp" namespace fs = boost::filesystem; namespace fl = freelan; #ifdef UNICODE #define SERVICE_NAME L"FreeLAN Service" #define SERVICE_DEPENDENCIES L"tap0901\0Dhcp\0" #define SERVICE_START_NAME NULL #else #define SERVICE_NAME "FreeLAN Service" #define SERVICE_DEPENDENCIES "tap0901\0Dhcp\0" #define SERVICE_START_NAME NULL #endif namespace { class SCManager { public: SCManager(DWORD desired_access) : m_handle(::OpenSCManager(NULL, NULL, desired_access)) { if (m_handle == NULL) { DWORD last_error = ::GetLastError(); throw boost::system::system_error(last_error, boost::system::system_category(), "OpenSCManager()"); } } ~SCManager() { ::CloseServiceHandle(m_handle); } SC_HANDLE handle() const { return m_handle; } private: SCManager(const SCManager&); SCManager& operator=(const SCManager&); SC_HANDLE m_handle; }; class Service { public: Service(const SCManager& manager, LPCTSTR service_name, DWORD desired_access) : m_handle(::OpenService(manager.handle(), service_name, desired_access)) { if (m_handle == NULL) { DWORD last_error = ::GetLastError(); throw boost::system::system_error(last_error, boost::system::system_category(), "OpenService()"); } } ~Service() { ::CloseServiceHandle(m_handle); } SC_HANDLE handle() const { return m_handle; } bool delete_service() const { if (::DeleteService(m_handle)) { return true; } else { DWORD last_error = ::GetLastError(); switch (last_error) { case ERROR_SERVICE_MARKED_FOR_DELETE: return false; } throw boost::system::system_error(last_error, boost::system::system_category(), "DeleteService()"); } } private: Service(const Service&); Service& operator=(const Service&); SC_HANDLE m_handle; }; } namespace windows { namespace { /* Local types */ struct service_configuration { service_configuration() : configuration_file(), debug(false), thread_count(0), log_file() { } fs::path configuration_file; bool debug; unsigned int thread_count; fs::path log_file; }; struct service_context { SERVICE_STATUS_HANDLE service_status_handle; SERVICE_STATUS service_status; boost::mutex stop_function_mutex; boost::function stop_function; }; } /* Local functions declarations */ void parse_service_options(int argc, LPTSTR* argv, service_configuration& configuration); fscp::logger create_logger(const service_configuration& configuration); void log_function(boost::shared_ptr os, fscp::log_level level, const std::string& msg, const boost::posix_time::ptime& timestamp); fl::configuration get_freelan_configuration(const fscp::logger& logger, const service_configuration& configuration); DWORD WINAPI handler_ex(DWORD control, DWORD event_type, void* event_data, void* context); VOID WINAPI service_main(DWORD argc, LPTSTR* argv); /* Exposed functions definitions */ bool run_service() { TCHAR service_name[] = SERVICE_NAME; SERVICE_TABLE_ENTRY service_table[] = { {service_name, &service_main}, {NULL, NULL} }; if (!::StartServiceCtrlDispatcher(service_table)) { DWORD last_error = ::GetLastError(); switch (last_error) { case ERROR_FAILED_SERVICE_CONTROLLER_CONNECT: return false; default: throw boost::system::system_error(last_error, boost::system::system_category(), "StartServiceCtrlDispatcher()"); } } return true; } bool install_service() { SCManager service_control_manager(SC_MANAGER_CREATE_SERVICE); const fs::path path = get_module_filename(); SC_HANDLE service = ::CreateService( service_control_manager.handle(), SERVICE_NAME, SERVICE_NAME, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, path.string >().c_str(), NULL, NULL, SERVICE_DEPENDENCIES, SERVICE_START_NAME, NULL ); if (service) { ::CloseServiceHandle(service); return true; } else { DWORD last_error = ::GetLastError(); switch (last_error) { case ERROR_SERVICE_EXISTS: return false; } throw boost::system::system_error(last_error, boost::system::system_category(), "CreateService()"); } } bool uninstall_service() { SCManager service_control_manager(SC_MANAGER_CONNECT); try { Service service( service_control_manager, SERVICE_NAME, SERVICE_QUERY_STATUS | DELETE ); return service.delete_service(); } catch (boost::system::system_error& ex) { if (ex.code().category() == boost::system::system_category()) { if (ex.code().value() == ERROR_SERVICE_DOES_NOT_EXIST) { return false; } } throw; } } /* Local functions definitions */ void parse_service_options(int argc, LPTSTR* argv, service_configuration& configuration) { namespace po = boost::program_options; po::options_description service_options("Service options"); service_options.add_options() ("configuration_file,c", po::value()->default_value((get_configuration_directory() / "freelan.cfg").string()), "The configuration file to use.") ("debug,d", "Enables debug output.") ("threads,t", po::value(&configuration.thread_count)->default_value(0), "The number of threads to use.") ("log_file,l", po::value(), "The log file to use.") ; po::variables_map vm; po::store(po::parse_command_line(argc, argv, service_options), vm); po::notify(vm); const fs::path installation_directory = get_installation_directory(); if (vm.count("configuration_file")) { configuration.configuration_file = fs::absolute(vm["configuration_file"].as(), installation_directory); } configuration.debug = (vm.count("debug") > 0); if (vm.count("log_file")) { configuration.log_file = fs::absolute(vm["log_file"].as(), installation_directory); } else { configuration.log_file = installation_directory / "log" / "freelan.log"; } } fscp::logger create_logger(const service_configuration& configuration) { if (configuration.log_file.empty()) { return fscp::logger(); } else { // Make sure the log directory exists. boost::system::error_code ec; fs::create_directories(configuration.log_file.parent_path(), ec); boost::shared_ptr log_stream = boost::make_shared >(configuration.log_file); return fscp::logger(boost::bind(&log_function, log_stream, _1, _2, _3), configuration.debug ? fscp::log_level::debug : fscp::log_level::information); } } void log_function(boost::shared_ptr os, fscp::log_level level, const std::string& msg, const boost::posix_time::ptime& timestamp = boost::posix_time::microsec_clock::local_time()) { if (os) { (*os) << boost::posix_time::to_iso_extended_string(timestamp) << " [" << log_level_to_string(level) << "] " << msg << std::endl; } } fl::configuration get_freelan_configuration(const fscp::logger& logger, const service_configuration& configuration) { namespace po = boost::program_options; po::options_description configuration_options("Configuration"); configuration_options.add(get_server_options()); configuration_options.add(get_client_options()); configuration_options.add(get_fscp_options()); configuration_options.add(get_security_options()); configuration_options.add(get_tap_adapter_options()); configuration_options.add(get_switch_options()); configuration_options.add(get_router_options()); fl::configuration fl_configuration; po::variables_map vm; const fs::path configuration_file = configuration.configuration_file; const fs::path root_directory = configuration_file.parent_path(); fs::basic_ifstream ifs(configuration_file); if (!ifs) { throw po::reading_file(configuration_file.string().c_str()); } po::store(po::parse_config_file(ifs, configuration_options, true), vm); make_paths_absolute(vm, root_directory); po::notify(vm); setup_configuration(logger, fl_configuration, vm); return fl_configuration; } DWORD WINAPI handler_ex(DWORD control, DWORD event_type, void* event_data, void* context) { (void)control; (void)event_type; (void)event_data; service_context& ctx = *static_cast(context); switch (control) { case SERVICE_CONTROL_INTERROGATE: return NO_ERROR; case SERVICE_CONTROL_SHUTDOWN: case SERVICE_CONTROL_STOP: { boost::lock_guard lock(ctx.stop_function_mutex); if (ctx.stop_function) { ctx.stop_function(); ctx.stop_function = NULL; } ctx.service_status.dwCurrentState = SERVICE_STOP_PENDING; ::SetServiceStatus(ctx.service_status_handle, &ctx.service_status); return NO_ERROR; } case SERVICE_CONTROL_PAUSE: break; case SERVICE_CONTROL_CONTINUE: break; default: if (control >= 128 && control <= 255) { return ERROR_CALL_NOT_IMPLEMENTED; } } return NO_ERROR; } VOID WINAPI service_main(DWORD argc, LPTSTR* argv) { service_configuration configuration; parse_service_options(argc, argv, configuration); const fscp::logger logger = create_logger(configuration); logger(fscp::log_level::information) << "Log starts at " << boost::posix_time::to_simple_string(boost::posix_time::second_clock::local_time()); if (configuration.configuration_file.empty()) { logger(fscp::log_level::warning) << "No configuration specified."; } else { logger(fscp::log_level::information) << "Reading configuration at: " << configuration.configuration_file; } /* Initializations */ cryptoplus::crypto_initializer crypto_initializer; cryptoplus::algorithms_initializer algorithms_initializer; cryptoplus::error::error_strings_initializer error_strings_initializer; freelan::initializer freelan_initializer; service_context ctx; ctx.service_status.dwServiceType = SERVICE_WIN32; ctx.service_status.dwCurrentState = SERVICE_STOPPED; ctx.service_status.dwControlsAccepted = 0; ctx.service_status.dwWin32ExitCode = NO_ERROR; ctx.service_status.dwServiceSpecificExitCode = NO_ERROR; ctx.service_status.dwCheckPoint = 0; ctx.service_status.dwWaitHint = 0; ctx.service_status_handle = ::RegisterServiceCtrlHandlerEx(SERVICE_NAME, &handler_ex, &ctx); if (ctx.service_status_handle != 0) { ctx.service_status.dwCurrentState = SERVICE_START_PENDING; // Start pending ::SetServiceStatus(ctx.service_status_handle, &ctx.service_status); try { boost::asio::io_service io_service; fl::configuration fl_configuration = get_freelan_configuration(logger, configuration); fl::core core(io_service, fl_configuration); core.set_log_level(logger.level()); core.set_log_callback(logger.callback()); if (!fl_configuration.tap_adapter.up_script.empty()) { core.set_tap_adapter_up_callback(boost::bind(&execute_tap_adapter_up_script, fl_configuration.tap_adapter.up_script, logger, _1)); } if (!fl_configuration.tap_adapter.down_script.empty()) { core.set_tap_adapter_down_callback(boost::bind(&execute_tap_adapter_down_script, fl_configuration.tap_adapter.down_script, logger, _1)); } if (!fl_configuration.security.certificate_validation_script.empty()) { core.set_certificate_validation_callback(boost::bind(&execute_certificate_validation_script, fl_configuration.security.certificate_validation_script, logger, _1)); } if (!fl_configuration.server.authentication_script.empty()) { core.set_authentication_callback(boost::bind(&execute_authentication_script, fl_configuration.server.authentication_script, logger, _1, _2, _3, _4)); } if (!fl_configuration.router.dns_script.empty()) { core.set_dns_callback(boost::bind(&execute_dns_script, fl_configuration.router.dns_script, logger, _1, _2, _3)); } core.open(); boost::unique_lock lock(ctx.stop_function_mutex); ctx.stop_function = boost::bind(&fl::core::close, boost::ref(core)); lock.unlock(); // Running ctx.service_status.dwControlsAccepted |= (SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN); ctx.service_status.dwCurrentState = SERVICE_RUNNING; ::SetServiceStatus(ctx.service_status_handle, &ctx.service_status); boost::thread_group threads; unsigned int thread_count = configuration.thread_count; if (thread_count == 0) { thread_count = boost::thread::hardware_concurrency(); // Some implementation can return 0. if (thread_count == 0) { // We create 2 threads. thread_count = 2; } } logger(fscp::log_level::information) << "Using " << thread_count << " thread(s)."; logger(fscp::log_level::information) << "Execution started."; for (std::size_t i = 0; i < thread_count; ++i) { threads.create_thread(boost::bind(&boost::asio::io_service::run, &io_service)); } threads.join_all(); logger(fscp::log_level::information) << "Execution stopped."; lock.lock(); ctx.stop_function = NULL; lock.unlock(); } catch (boost::system::system_error& ex) { ctx.service_status.dwWin32ExitCode = ex.code().value(); ::SetServiceStatus(ctx.service_status_handle, &ctx.service_status); logger(fscp::log_level::error) << "Error: " << ex.code() << ":" << ex.code().message() << ":" << ex.what(); } catch (std::exception& ex) { ctx.service_status.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR; ctx.service_status.dwServiceSpecificExitCode = 1; ::SetServiceStatus(ctx.service_status_handle, &ctx.service_status); logger(fscp::log_level::error) << "Error: " << ex.what(); } // Stop ctx.service_status.dwControlsAccepted &= ~(SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN); ctx.service_status.dwCurrentState = SERVICE_STOPPED; ::SetServiceStatus(ctx.service_status_handle, &ctx.service_status); } logger(fscp::log_level::information) << "Log stops at " << boost::posix_time::to_simple_string(boost::posix_time::second_clock::local_time()); } } freelan-2.0/apps/freelan/src/windows/service.hpp000066400000000000000000000047021252300335000217740ustar00rootroot00000000000000/* * freelan - An open, multi-platform software to establish peer-to-peer virtual * private networks. * * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of freelan. * * freelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * freelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use freelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file service.hpp * \author Julien KAUFFMANN * \brief Windows related service functions. */ #ifndef WIN32_SERVICE_HPP #define WIN32_SERVICE_HPP namespace windows { /** * \brief Try to run the current process as a service. * \return true if the process was run as a service, false if it is run from the command-line interface. */ bool run_service(); /** * \brief Install the service. * \return true if the service was installed, false if it was already installed. */ bool install_service(); /** * \brief Uninstall the service. * \return true if the service was uninstalled, false if it was not installed. */ bool uninstall_service(); } #endif freelan-2.0/artwork/000077500000000000000000000000001252300335000144515ustar00rootroot00000000000000freelan-2.0/artwork/full-size/000077500000000000000000000000001252300335000163635ustar00rootroot00000000000000freelan-2.0/artwork/full-size/freelan-logo.png000066400000000000000000006021671252300335000214570ustar00rootroot00000000000000PNG  IHDRtEXtSoftwareAdobe ImageReadyqe<viTXtXML:com.adobe.xmp IDATx lg]wur@'"΅x\ 4i\ґA@<4m 6"-riApA 5{sIN3k ߏN}NZ޵oCS)E 0b#F 0b#F 0b#F 0b#F 0b#F 0b#F 0b#F 0b`_1ZWqtcRddʹ\^\?[1QNNʅkB%s.#W?ȿb'l#PRM_c# u=Vo?v^[\`b.+^xޝg(tJ;9u; 眼~kIZ=/˨- VسY"Q0 0 n A7_m n8:6x0lZw)HuYN7ֲJah0<w F.]ܿϿrFSFFk5VӞwT}εN?:{;c)ڈ5^a( A|% /W g:2# j:mJ5[fcۚMknS. 0P??O|ip_Y;K)w7k9_9w/c[kܴ~Jׇa( V_JI@\!}GL ظBkaZw/qwQUq}]8U8 t=ZTRֺkm$*0R/|/wYw^"mA߿rW9Cr(8 _ @_5  @`q[MݽR>Oqػ\Q\Q0 <O.Tb'.@pT eTyN=9{io.tڃIA~* *3e]EL/An r=XsiO$Q}& ? Tq\GBL wU c}=+ SEa0 >  0]Lj;9խk~iӹ2%I(, (YWP}5!Z{RAMkεֆ\`0I}) ÏAa_|ҿMvƍ.@F:WM:!ƚf*/:a|(PPMF\`<"` t>XƘ0$\;!& 󲼞+  0] j9gXiWA$B~п)6}~Z90cOM{ަp&0 пIFFLM@?v2s?Ѵ=0a$?:+v.@6:w=m/0\ca'(|_>7/˖+l 0]B;*~XƘU0I#Qח!׹*"]Th-Hc%UܙJei( {r\`wE+k7׺jc ".?0xL嗹*#ڼCF]j}DU7w0|_Vс Ph}RnjunG1Wv^EU|o&W8>tp CX *AS󲬹*#mVc4\$K |d@"L^>܃ukyhӶW+yE-ؼ,pU@`Th}RGuOh!lDCQٗ?\L 0]X~?jmlI*0Q5I8 bj"jzƺ'6mƘu@aP0'畼z~_RO5Vln|n_|,Fyתskզ($?OG&) &%j#Xkشִ$!^/삼0 vap: ønCIPu 壄NLgMg 0]Q( Bj$ :ԋ" . #x U`1%8z0erU0tUݜHE/\|u'^D7JƺmSe@h7'Kw{[eY.@Zї2\Vݹ"X|*[[#í9E  !Q>P;eu.@ ZW/ԟRDgb|b U.G?ŬsZ M k>8/* @`/@@_Z:giͣ-*vp$_uA9!k{8؍FND$b^4:z.@@Z)Xc̓9+2>7'!;bmQW{5 :/˯qEGtzOb?Tu#L$V֣0MhA ÈQX)h^$. @`'@&vop-GFE)r]L6!F A)v ,Ik(]_.@`{OcaQ æʨ>y`g- >}i[.ii^{,`"B{;gCӚ@#6 Wk  =u+A[ W{.@Z{j߽"&w(cd0둂ABY |"~2M*n_ZO>6OmkԦ82>|  ;eC/"rx~i02m\5K1Web7/aӆ۶!4,Mb^EL ʦĦ%#}/٬jm`M[mWE8*iOl\Gjӎ?{i=Bpl &$IIfkcAL Z9{yմ50w-G0PFhA}",en  0](}iƺg,\=)JH?v0$wuӪMSgٟ{+dh&pAX+ޯ{Lk39+$K:~˝zY8, / ,MGo\lGL `? MӞQ~jj/zMDW$nEX'k@B뻯{1&(`=:Pn@c(w$~jsE.@B WTu}g Ibvx*BN54Lޕ/\eI44Z˰kyQUsEvFH^[OnZ <>%[7O 0zmÌZ\a7/J^IM+SM7*PFZKV4d/es4E#Uh+.m媮( U${uF|yyY."EL L>cZc~s"'n&27b=?(#MDvX&_HWd|"(>)_nn91ejB?u(T aN>@o\ TܓirE~5`xaz@q^  0]0PM>:qEOjM?B?ӄa$$q@ 0]00;p %~l&GVM6] A`Ve!Kn3imq<U(S_O8,t@Zw/T4\c.RTߨrM7:|N/ TyY^?@` g]}ˮf)djv &a1@`g s_<5W>Qж'yl҅x̲48~ߕ6/W KֱR'[c~sES|)'KQ+|,p=BL lXFc u}?ȭLæ׍2rQByeE@`` ,r5n~L#G { (|!w 0vVڗ,A\ZK/] )227gǢ0|ּ,"eU ݿE!e;2=Ej( (dg~o%Sh}SnhM"arYO8b/tӃ[QQ2u84_@6 +r"ThcZc^T͝"uW# XOazvOq=Ǘo%Eǡ"c-"!irh}?vحwY( y^j@`Z}֢zWc[7Mܦm eI`T X$_WE%1/n\ (ꂿ~FF6mc [ q=s^.ոut(>X{բ~TeyY~q"YM}Z]|#Ib0jհarݴ૙|dt6nΛX[{[F6 Y,$_y;GL }_K4'/9k@M ~wfZ!tBSu>5t'YB? X~ xez"2M*yYN>"dZ_ʪ1 zs?CJf!S48~q^u Z9EuٔCeh,`䪺F.jag)? 0]&:V=nۗ6M{TETI?rtB{k_;?:k@GayY~v*LL Q[mqyU73Ƥܮ#7^#0dWMa@`VEƘ}S<?p~g(zڼ,?1$Z}NY՗k n/%a\wa p:K_e1# 0]FC[cֻL NzT_р"0 g:g_4sOx9 C?3uˍBZ5M; |ּ,5s":tk̫9kJj_"?Ku=vZAgSE;p>tB;;gZT?=hG(nhԹA^9/˯ <"08֡Ru۾iӧra**M`3֪iTYZ;N;i/:/A8 0]EFʪzdި doG|^hZM pu^Y0 h@@` Fs)[NM}$ӂ%S yx됎.@Wh}s[O圗rg߀=@IY);Wu݅S1˳ .@V1;L|(Vyξ`;/Ff;~?Q$c%@/Z}֢l C?vC1xZA>{^1Ew 5k|.S8<˔lRV2"fi82/#@oZw>gNa':9|[Y0 _4/tltBc^{\8¿?BaSBy~&" rLtبB)4|1&}g*z^.@Sh}U౟MMX@TY<}_Q>u^_qE`# ?n۫=e$L82-xQ G}_xmO1E`OZ}֢zҘϓGoJӂgy 9/.@{֘Vu}SʈǤnrDȧgi8yY~b/tuֱS~6y2MeZpmTe''JL ]Uh}EU=lt_7iyaOWwEL ]S֘Y$c/v nDXeiOqܼ\7;tq3s˪r1%bs bM:U5*j8A J ܕ.@;|ckUuXqgpJb쥦iZw<>l "c ?nl1u|46- e1J4\u']@`B}ٗl-|d*1ujQ&!h7 ٯAyY؉.@'_cYcֿKL Vu۾i3Gؑby4`Jg"p c~vTc86`G&!Mێ0t@/Q 0]nQXTեc;7+&qHCXn`<6y; _nk "p ߚ΋Q3рY|>s^떾.8BOcc d}3ݭG0>O8&giiG|d g_ZTy/ƼS"_M1.@ZX{͢XEU=l,甥w8~UݪE](ќSe06=)Z߷5Gt.S p¤O)}KcZߑnVus1OjBә#3o)}LkJs Z@jZe`" ÙίZTlv)2oQح>kv}N&@jZ~؁ 7n:3lϩlG40v9)}PVjZ?6F1־iQU6ilY'Q>q^_u& vM[~d,,up|SVAjZ/@`|unDQN*f]G>i'Q:tR3H 5 40B3_^V=i"S~OiDm ~Q*}֡Aj%h]`YGujkQ=}#* I_:j5/8Y:+HNMHDkUKJiU`(ʪQVi.y/ ';,p +>Gc4U'9\]v褶Cj Z>@` ִ .7UG4,IҧI!,0lmNC>Cf>mǰK  0P3?u!]~1.Rsv~* S%:v>\<{2˳n8w4T* C{ W>A>^- Rh=sξw.y#R0 wY]h |,hY 0Rh}C$Ar?L},}a$RHB@ cy.yYiY0M>LjQVU#zP՚Cp L%1o;6KXH",*oT@pU7 (RfڟK9@WAGJjYvUp ~*tȺi>4C=,M8+KYC%5.RТ@?=oUmi2s% 3KyJ"52(?@t~ż\\c'n J #4(/l n+zv,Ϙ qkQ)c 4/um |,[Z ؼB9{6K^PC%8RТo U"SXҷ>GjyhQ` 7So7 f:zN>=TRH#- l;!xsQUGvd( hP`H_[>I#@(K=㻳1}Fx?r.}!Gj hM`{my/g,HP7ZHj"hM`{.7Tus!?}0A&Hj$ZT7궑C; F>ѥ.}Hj$hM`oliSE7^>zsHR+IDkEFvfhǞ$ڧszLw>H$5N${]o`}vЎWb LR;I EK/=MڱwMbvDC!Xj'%G0znٚV!,5RRSђ΢vQ]*7,cL>cg_` ;KhZҒ!vA=ߨoX鐎;nװB/0ҷ>uJj,Z¿~Q j(ILFFH痾Hm%5! 3t0vP[&r~QW;K 0$Rc;8 X]e$H_jqZmC 4~&LZ } #lKo@75LvTS$R I&cG#ùx>~g2#~)@jd;ۥ&cCBTuɇt3w7( hD]m 5 C"dRъ#\\7ͻZ*=$=5BT&Lj4Z8ʟw.pu~ӶrA}3=iCGTW3H pLj4hEP.76M{pnUfyJUR;H 1hRIF FrXn30~{GXH !C!lRт#nܳ51GQݰuЀRSHm1RI&5- pq@P9bO*OcqBj 1BjUx.- p#q֘7嘓8ǝBj 5Bj8夦řƘWu}sjs?;Jj 5 夦ڎ!V Tc-¡܈eh~D4 'ƾRIm'5-, Uu`niDŽvt8 Jm'5z @H:g_o1ˍwgR ,|zRт:@LE3Mb(|Rт2@L2]L0Zh=L &k+ʡo[#52Z0U$ Bmx_F!`6׀R z"LdYկzh Ԑ(`R X7훭?MP'ZPjB i=L &ÿ߫nw6m[ x_c fR(5ԆR#z Lc?5;=c+h0H&ԆR#JHa H0z tc[9oˆhhH(ԌƎg7.!o&P xVQjGZcFʀosՋdǻ r? ᄀfQjHZcEҀoZT X`L6PjG!i9iFi7gX `4Xl%i9 F#UAhC@}@jI)i9  FºiZm9Q}J-)5ԖƄߠmMm6 0~ˑyW ԔR[JIa,1 tcUusk-f Hj!NjK1֤0<kY}?(".`zHjSjM9i9  9{բ0 JL2̻֔Vbf:|kQ=Aw FZړVÐbdkEUǹth"5PB@=0TBM۲E{5W<FV*ĞԞRJ-Ja18 ִok+܂e{RJ-*5)!Ġ77Uu7#'_;0PjQI60$ :g_敩Y,e'PRKԤRJJa(f`8EuYߏ32M+ IhI %T}'Ԩ%:\TW84톮Gp̤JjUjUZ C@+oݴop:UKQ?VpJj>UjUYi5IzͿݚ-Mz$UcD XѪw(ԬRj3@͍}>(jӄvXRkIgRJ*5,"Do9guQU1A ,i0aRkI%WI*5,-"D/7'm-g8UN&_}'5ԲShË/8naZKjZVjZZ }C^owlMfcL39ekYGJ-+5Զ gkk32T| ϤVj\Z }AXm>c& ' I`I-&5f}&-O ΟcLۂ>f&j2J+.-> Z߿^oEeE4lfRIgRJKaQִ)KY`RIxvuڗ&bc`ln̕ zFj;K+6㔻bQUg]XSRzJ+50M!F:袪_cF/lRI gRK-La ZdKy~Mj8Jj`&Ű]n}mӴ]5bȺ 5rRRKmLa/p`O9g{j3&#tRRZK3jkQ]c-󔍙`ڮϤ6^!Ğ(u۾(Frvڮ;K,2@]ciz_8}g`Vn#ĮsξdQ$f_RR3ZmUB) # k>Jjfi-&RB;_°;hI'Ԁ}%дv  vk_4}=Y+%4~RRCK-Mka7bW8gz|M?`* RCK-MKa7b:+z|Yt l6Žs iys' o|GjA )RSKmMka'`7X{uU7gMAZjlZ ;;)KzX_M?Hm-56-BQh}QU/`o "5ڴv NC:5^ONM?Yo "5cI-ܴNK}yU =T36ԊR3JGRkKMKD:֢zR_#eTI(c_I-7-AVh}nݶW \spKvs( I4)}<,\SVH(5Ԓ}$RZ88.N-}<(2G|{ԐRKJMGRK-NKxZ߿dvD4H-RKMNKX7ƘG˕ p\ڲ\jsZ ǂ9E]߻ǖif'b`?Kɥ6p,q gHmOUHm)5Ԛ}$ c95ks<>ߘu;CjL5HjsѥVp4qo.UܥƺFZV ĭovZTز4a?YA'RKN+Z>[EJgv5gW{F\vJjvi)@"˫Cmg*MXfڝV-!*tحExlƛR5]jxZ 7GTh}m{9w__J /<-#!M7ZiO7lZ @f5}<ܿu%iPjzqU}q,,MFZoڞVa߳\:֢>3H^UwWV :gƼ6ӹY3RJGRKO+A}IU7gd{t,g`$~ak!(.4׼,H+~5r-H,!LrWफD2hq#VyG/Ҿ,~ d C ۻ<`x H@ ᓰN;}itL`K%+Q=?jTR*BeVe'ϔ[uXe,P9oMyF2Me F_gi8;/&rO[_'wkJ U4dzT:#*>YwM"Y܅wL(7pO?E\_Wɢ 4J|4*xXeFyEjUu\awźZz*pӶ{h_HiKh~1pn<N?5mާ7j4Ʊ`IOXhԙ H'G(W$%ifʪ&㩔Ic~?s ]\eMvۭF27T?hn(UsBUBA6okQGѷIq/46yĎ3^շ/KS 0i257>Ȉ)e? $t B,SzӰK_;˩y|u3-$ ֟Pn6/WR//l0jʶZe[*7)R e꺛Z_Kj5,!U#i8|Gvm.ڧ P9K!D9kUv>gJn[tSxE7fjP2/\fv'+vG=m3`F|0Jȷ o҅UL "\ލ _VEjʶ)~oK5RYs64>`OUs|ߋl1/暈vΦG:\mn֯7Ld-? U<˖߾w02ePY-t;4ϭv]z(Fr`7Jp9ylQ'Yrְھa% ecujS*sBnt`Uw+~M qߏ AvSc|7 gL$N.TrrZgʝ(ce4n.sEn~- ݺ߲V_ ;4`\'ЪCP8趿5.%a N\]Wur9:@[|v̭ied ~?})-4xiS74m[+T3'3Ng}xR:Vi . nwC1ۡ]-껞H4Px\?N]jRu[Ln]_^S4I1/˯B'-="?$UrzӴj.Tc*tR%{ރSo]ͮ>7Pm} (!d5v5]8 a678lç ߴc-\??4q9jqaLHoB*-U}zU_W2=+vn} գ%cHB# 2p /ӧcXT"i 6}_EDJ_%gY3edMn7C}A wXe whݡzJdMv<]N^9H_^p[wK#gԶ:4qh6* k{4-84U7n:p2m^N blآ.qɮd7OI$O%߯2Elthɾu}$X »zpu˯YS7m: BO  ` w"^tj7bseQZOŭA·pV[^1Φ$'TܝQqIN:[03AnLQ 9W;Z/1nrB!+ᢧA IƊUCtE-/̘4#d]_tr<E,~zZ D'%ژ?M9) /P]oS_]ԝ #+{1 "[AL@ }B7ڐ )!((ye _Ippe׮L7P̟7"x>'޹T`%X1A 6`T_nP+_!ٮbM~ъECxEh)5 IL xeiO.Vo>=ORIG7뇔{D[>U6(AsNsfN sހȻzWkOٺ o<*.OVHO &$̟إ^@bŵ QT#HrjMF{ݭ| ݘR] Sz=&PkJI?A | %d^\Ug:lJB}|FZp{M9957  g`G+>6yX1M^FZӵUMvIf r!Xq] unM$'y`bv;n"}1PӅ}mPIH&:IO/ڄcWpyY&Ø?m1-rlBGʟ資>y\\~sfӅU=Xh`A#6B?֢%D|t񄽨D>׫E{.Mϣj 5PZ6BDq8ȑ#yAk3~_Aiw| 3cIhm-r{PlH0M[pN_~G ɉF Q#%7}ŗcĦ ۻz}Nc u/MQ*ϧld˲ 5ݦri!8J$ ý"(oD~GȢ[[49Hqz=&zMB Z)/6m/6Ul?pMOӟKͭ ,Cи ڨ;jy,Qi[l]8:羫k/>e؋jZ>(W'phnZuy0 DMuf v;b/{YȎ[~Ow+N+R?9))ѹ|,c4şfi,V#*9H;c40h?{?s{%|([#tMܣ(Sp4^NEq\_(hc kƺ`" ³i>ꏯ)D *" Gm%hߓvKE4N턿F/?hBGoPh; '^Pyy@K¼,VM'ùsevfE49S{E06JLƷmER;cªEdGh;6+}҈ᵌx30=N-fۗl8i7ÙſD۫IIEۏ{lmD1y//Vhkct ?߸E/F#R3) wݐ3Uvs)9(%: Rbêw%V_F +Iruc10a^P1s"2 2$~liNh B1';1Q=*|[ܜP;4ٛnY AF K҇8~euUq۶lӴqgv~_M͛s3ǢX; ~<`M8O#mDdWநB7vg sk 5G=GG _ڏ}c4t! OʣiE7;iu|GXmKt=-XVF|4RI˳gK1/whSw~sfSW]?j8(+OL Ŗ{߻?i[Ã:ZPu>lЈC7`R_7P<'*,e(DAN)wHv;}K^eY}?wDgnޛ(qrX\ǂ*f?Gμ,f]տ;?g|}=Pc3r vߦxՋn" P"v?Ū^RRW bSv_ڄ4D(2sN[NQSmͬ7P1QO[/Ķ(ȿm=>ڥga TxҙIBG4m~rf θ3rZ)[)h3ezG{_KnPsk3ulɤCUg ѮY`>ó[/+&c7 (AF}'Ka#/bKS^s>Sl/?.ε"nS}} %J:~"Kri;ɨ~sCܡlR+.ocf ̸8beKWƴM$Aj][uߏ%7=}zωQ?AM?),\]!(r%fZHO7*C|~ <sZ` Mԝuuх~|\&O")7lQYah/ak ,;R\v&~mFϼNӛsJ.sZZg`tNJߏi M <ߗ_'>Ewg8\om*O fB,-'xuz )Dѹ`8XEЩX mM@+M&jѹk:Ge!/7`.aɡʮiM~ } 2/wcs=FZZZga_]o6h:JPP~u_Aj% b . ͖ti(Je,2 ')h>e6c m2xD59E'Ʊ_VbK`B6 `, 6*+(GFAumޔ$/*/;hv#@X_Eˌ#d^Y۶+'Y XOE'ozq̙] uX#b*8ϊP'PܧV.H?9Rqi-)iee5%kIyC %˖o()6e{k\~nZ 5Mѕ6]ػlO&L8u;֥J/ʰ Q@->g@j &*@qmnO{c7oP, ]DŽ2hQ~u]U??Nfs^ڛF݈:5/#k'Z t(;a1nbбT0A4Uݽ JkR h5Een:uMͲT^(\`yDQviBbb\LHsz})\G;&ED *fr:F$'iIBPF"(8Pt0 i#uK[njiQl2W'Zg\bo>C+0e9/ef%ͦxJܝ<XaD)ڥAi(%يA`0QV2*I Qݒ<^\wEErPYW$ҔŪ9U/3"^,#؁HwʺfTg"u+/f$<':w(Q:&>&}}kA;/C s&/Ij3 V<- {$-m~.;Ɓ b]k/lϤȿ.V5Z'pX^8:W$MFf/hsw(MQg}9xnpvAZa٫DkY~{O:#b^m;X>3m:؛x[.:kT]G}T}Qh<*=.Ц:APAtBY08xMjtEɦtMCw0{Ò)n_TF-gws-T~۶Q`&"y&~gݚusJo|H+ux "nf_^VKN"IT=&oZ4ECM~5VV Q~9Pq#A-т%Dऑ"u{g,6Th{R3SJw#=fe%GS%w6-XyG~?'8[ $礽EMn .9'+4#44ӵKx]U5FZ=:##E8A6$oct7]L<ۇE_hxG?nVA\d:βsta*uF/Df˖RsQR$tb҄Ò{.ycN*̄gwL/y݆yF"/r,hȽTDH3GQV3g5oT-V8bIW8&E~f?X:&^X?<: mwI^ZgX4NiJE='E?<"Qx;8ԶцxEںu^FO_ /xoJ(;#q`"5M@+:~aBm/IE)EB6(WҦ mP;9eR.hz=/}h#-h#`^7F]7ǰ=Iތ,f SQXGZ5UxD-nspqP#Jo$'ԖiF'JTBo&^(_6QI0 dfQ#(e/iߣufJ8Pݴtz$9<YcuoD}K{c4:47( DdCXWDH3EaCdiÑif/,4)½تvG\pSBiðvoZC1 nض/\(stp??)(T~&z-$ ?Cz!{!:TPeNEoAN# TBUDxxgL)EU{t{ZӬO#ozC+ k ܋pʈ.jOS"]@|;p(x IJgoLGN ̘^ǂE zqE͟<]|xڪ> ǔ?\SR`+x:vu3q(}!MX8O#1Q1k<FSpAm97)5 =c(jU f4X'ϳQf?z䭉O>WTPegv]/*k!TQa_szE%)~H%#}H՟>uRC_bS_qGbk]v5VX_3Hs@{oߤfnc5eWvk~glOH{&wH%`9nd;lJKP/ dC8^wiGw>hOqV]Lmݧۏ?ۻ+ \F_PA?}Mƭs!пV!)iMAʔ7hr0#Dc Q40ѿ LFQܣ}ԻrWnxOuNR>]Dd 6Qv]$$['t'HO{hDQ^S_RU^ӏBp(My#F0$ R2N1i74wCxd~Z њZ n;9!%-޹InSs]Ğ^G옚sBl!z̅F=-;cZ=:G#=~o?ώ}[D,X@}m]Z8X?qe#GLS>=B =֟+ D2W ^,ke{<}T.X; O5Q}RM+:7^TTC:>@=#l^gShcR]rb(Y)<'g<& WmΑםEjMDk#h MU1AQl'#/'4MjzRw/1`"LFZqVkI?oݧf]jC'|o?#| "2hV6<6ZK6v;:7Mk-}yԧpׇ1E*Zł;ȼ,M7c] De13MwI$'-A aEخ"iZ JW =k4sH jqL釫6S0kok!3n\}ܞV1a_zQ  Dk#Z#A˼{WMUhNE?I3~&2c"KRNAD,<R&[RǔpE$/عv0p|& ҆)f"}9;#$l`xG( Gzk#2//yYfM+W x(7jゟs 7wU.IN/yUCQcJo|6o^FZ}Z0S O4mCze F(:){c߈ը@k: ċ.xQ//RO)$ݺ26 aŢ ! l+rp(񨲭8uS:4̋3NI~Ec9GivLϠj|(lG.F:q0a֔sJQ- Pk$oU^ _LVlt2A^?$Zin!r/v ?=2GaHJwA!5  Z~Rll]E0&W ndiӼ1EpA*z_ۇT(@& p2Z+њ ZbK9 0hgHe}U/Vx=47]p;`&7q*:hu|Fj.(d$}Y?HTMisbQBq ndm MoSLZ_F< Z9:.jFo"v mN(#bu|N>%K=:\ސwZ|Ua0S;3gp0(i&23KGs#xB{%M?s%F7Tq$v a^iܔ ¢['tGhdK{>{y/I!L*+g=LBT`"ZZ(@uwF[{UfZ;A<_ >gZ)`,ۂ?iP4{m[ wzhGs0?{im"L>XT/h1 \*6Bܤ+5Ds> Ub{9؛1 *ϑyY~qSUhpDOL>CjrRY.r%^"|sBHzQ> 2b./`B)Vs%6W{4˵ BhD+7MI$FU?G_SJnmZ>%7'-1_5tqI oKHE7OǤDPQuX$u kQ$ON. #Q}]2(q2TH.ҥic s.x>(%n۶ҵ_ xbtݴΌT.t_-DQ;4!.)[ۏi}rxW-wL) 74bh7>l GR?AM3*n(S4% Pk(ZKA< >eyP?]6q*Dw&F}ܩap 0KjmO/QA֑ҚҮ&ݙS^N<%QRy@|>7{_DxbJ/}ȹ!b7lz0%"ɲPH[uRQJ: t?!c:L ~/IHݘ6ҀPo2T^KQ_E<{ >ce5m_@. DO oE wuUQ\-}C5>"AN/-6KY|ZYi1&W_7 t|泭DW4>>'j(mzsBsII>V45ne&(Om )hma hEk.h3AZ]7wư%"Zo'$ E6O1C:sE9D*[~'mo΍ 0VaL @Qoǰ-ӢI?Y09, }`qdvmRҢ@o$Rx_~L犡ڤ8PDdCb&4 YED}BC U j2Y%IeJ@Xkڋ`"O'DPMGq@<F7=3nVs0ݗGIǡу`FR{^Qiׄ5% Ic>%z_R柙"݋Ċ/F@,(b!KGc65ŠU Ouݼ62)Ip<|JIJ*nk.mzAc~eĚMK͢2MʮOה\4W1 jJzAYwV_KkOיtQ ZC1Z:Z h[1lGfQWlVҮ Ybjδ^vc%):VrZjqzR;>/k fN}!..|Jgm h/JDkZ{us$Z'`^? 2)@D3-YBbjҗ¤iMs< sAbA uKuWU>G)INpHWQYoGe;Кd$5ʧ{h$A iJB ^VR}LȖ&T(#nL+ًAZ ɋD#T"NUBz'iȺT>tՙmj{=h!I!!Eyـ)Qݴ5m9xVdQ; WKZ*>)(<ˆMFfVRxES zjA|IWgiRR2L@`Z{$ Pk2ZA|:}jԯM70ǯ3wD#D=JRA0LSǬ}mMHmG4OvIV6w;EvI(`Dɨ_C|: ~JV1lο/dQ9'|ʦ/AMXa(wiOwCg tAb)"S2jgq^t?ISuF^ `h],$&n*JE_i7MiC{%/N6m7M`=eCkZVM-@Ĩ_:B x^tc%q$8xh+IL%L'[kܲN9nu$eڇ>D@#Y>׊CGj4ULT!-؈mYAE*: #u}Lrs)g9H|\l'$ԼWpB?Ĕwe$ˊZDTӛvՋZlwEkuJFm˯vO)ZげIoFcQm<أLS?ͫ/|_eE2!x+ׇ j65E.V 4^ B${wMf zϕmP Dp.uijN ܤo؟F\Y IN孤6M̹&m~tTm*&\Ӻݴ|Qw皔MKyEbݘ%5+F 6V Ƅ$6l|[V0/˟ZV?7m xN(c C~>7 ^uu =t0ubCYjɼDq*l/@j\mڼNļPڠQx1hh<ϏfMLT朱YRVTI;ϴN&$TUip$RV3?X9O$"[fuT'7$>{&VT=.hApF_}SQAe-ku]Vi?9ɚeW⢟䵫⺀{0d:BB"-k{IiDޜÉ*PmJu V}ʞ.ޏirsYA;7H)nt|)\\{|ԟ E?DAˆC o>۝j-8Dͽ=lCGK,6T.is F fSd__hˁ1R1lίRD xWvoKnaE?k>jU7*Sxz@npcDp'T\=R<Ι$|#vG4;29A\M\yl5N-ߤ,U7U!7vEoSI/ ż\$L]d&8QHQnguPN3lY񚊓5>>G(Vn ~T{a\μ,]e R9xc) q\S#ə$6C2f^%:V)O]#廐K0w/X%Q@،z3$˺&w)5'>繉N㙋h(_h?akkB1E񳌤:Rknzt9(?dIM@6UWXV #ѕ)x4%Yvɝ0PK5ABpank"ZuZR2M|I1_uNe5+Y&!ZcFC"Ѫ$29S7ܙQ՝;y9U?Po봡]D0wN>QG217H*̻8^ۍ_SM8YSvDVK /Zn=*x LqP7m4݅D /FGLS9xh׮1WG4pݦ3akR_'PB]4u/bQ{BܤlobyslRP 53DR;wL_-nLHk Ouxsv&b@ zCp.|!G‹/;׸:nf9J M݄ݗWeߤ 41#?<9U5I8?wb f m,j_vr~?r jNO"EQRcw"[lv\ ׍D;@vF}OgHAg Ҁy|$QDwK*O@`䢢vQShOAG$ƃw[$D]G_G?S{ *2Q޽>[g?")9+UvIyQ"l{ MmZ<֜Ψ>YPuB,`5~{*@lvPZ/NuKjR\-f!s>t\TV&ϸ<>G#\N]OP3Mmb } ô&Hd ĢX_4ɾ*L4r$;} 5_PQ^QƂGT;Z6SGe+x zz<7rU#I/\y!/be|}Ud넛PI7$1o9 ޚR3h_ j+ږ/LʰHz!Ѭ<ȸqQ摩,}7"N0?O~$.G50}kX-t1Asd F"q]S;DzCSN2Xy)%SA??|juƼ,X*1Pv߆}nUoV'0^HV-YfM" +Ɇ@~a.@ʓ"Hykr)@m:E^@ڧۮ%;@>F&&}vdžΔT֒EcɆH ߿de>լ*W;p@4557gKC3PV_%ZkY7Hsc oɣXHa&nF+!ba! wiE k@Nޮ(~{ u)ɼF{VH@SWZ%ZWYECtIѮZI&Y\|bAGzQ]~01uJyˉ߄_!B3L ," ]Tk 3-$ԿdB qӆ&}*<3u ;jņ55>ʶh`>Pq4GnR0n^pBA.!Oy!n)(ĜާN@יD⟊^30WO9Gqğl17Zw)?R3jIHga t 31|{^UoG$0^0'@EXEQAqf *uWT` 袯,/׏tS j3qx6 U0p xEzq}/GD&j-Z4c eKyL;?' OIbh?k$>swg{2\qcqppsLwE"|0 ?B) {p!@.2RD}jQu/HܛP #>.r% 6UKZYV?@ oIRJ\vxSCb)H- }pL-ItwiI7 ɦOקiwG3Xf҉{΋E*o*Y{=LǓ"<(^ϐ=vvfqXfg5ˆݱhMkj77g ͑2 ^m&7|zo `VJi;W<`O ) :>ޘTFT8E0p.`,w=ԏ%e>/%yJg5:L d}2ZNA.iư0^"M$ZerYt _;pF~Sne& \/tҩb]ҳvĊ{0ntLDRܲL! _n903#yb<|m R73?j$KƘT5eqѬ!WOS*oP[yI#D z1"w%;:x\sj`!X$Z.wXġs Xn~`迗uP3a.̠dFRje:C_nU"%>{*,{Z՟1/˟ZV_&Ϩ4 鴕27LV"_$+P|3`p MQ8aΫGIFzfhn/ٰ$V}0urBUJgӁFpclre~υpMٽQA_ FWMEMKsjˌ~pAUMYtImUS 0.^þ뿳7nR ZG[]Q,#RzNS<wmG9.G (E=/xda׊l$|>5( ut. չ7 gnӄ M{yB#)Z4jћx4Q0YNB=MQ/A!g?+DCO \kl"FI/Wv}$l^M3eO\Њ~ΝH[i^dq`NTd 2\N^$f괟'ҋIueMntwa *߸AGoWZˈQu건UCO 'z"Lw{^c$]ql| ٺHA*ܮW./%^R%}Tt]w)^'G9uS7O:_>5h{.虗eִo]"a\ɍxP2)`' "ܟK n`#<LoGH@03Ǘ"fTl7&*pC]]˨'e_M i  Кr-z^l)%5WhH5="X1$ u|sǭ3Q*YJ礼 #@ { o.s:R>ɺyJn:_JuU]vh'+_h#( =iֵb(i!"azIkD+L%<ߩ{E帯'HvMDXKC6' Gj0}\Р6 ĮB 7 =h >"θͻ:*̴y7ߣlRqVcvhErYS{P1cP?57 8ړf&;TC|l85(/!V>p#?VOTߨ^ m]ĮR ~ ,]%n~&Q\3CS`\%d[]vyJɷ)6ZdZ@h嬪uۑ)?+ITƅT.ZJ]15 ^8=x8ێt`X037KJK6;sRIcmbkpWYXM[1i0@շݠ>zG '*C 3KhoWHקQ7Ĭ4֧ 'TtMʤ ic<'>__j_$3ҙHmô|_BbpL*Fq ߰^_MU9FP쿯u)ɷi7%3 5ϭuyYguKu_FLJњwfR!Bat ^KS$wv J(VNͦ&D&7Ӝ;3l+YZ}Nm %%ءPQ&!DdS~}yg+'D,d(hsQ_迥 @7,h:r#q V>i=)G&5N6Ԟ9[j +@}5[&&3*.RωUrpeQW>z3"ubWCD1:zƈ:1Yx;ưk6OtdXw,!( St,%E }{wPqd*e v^u6wYsHL چ8W.6ERA$7CsWM\ $YT vI5{!Sgp5`.r{zKcjn0B ׎]iշsQ7a|٘VDiGKRmwD.+ʺC([}HIIR}񴩱'$MC?y7JjtގIV:7D1ky}{LUlZBxQڀ a6{ʹIX]7K*ϟVxw,6U73@P}R2)xu; phȐ ĚaͦH9irwN{!ʽG3R?= ?^vGa̭|?j#BŰaaHCTQy:"G&;;Eȸ[^0C$]sJFtn_S{!YV:>7nPޛ)kTl>ZEגY$;R볉I .Ђߺ13.Hz[-pIͣMtxijvvk8FDSf;éeܭ5؆8S1?׸PG!?{n7Id#wL'qh|Y7bʼn/7mS^я:֏(6/~.sXUC8Fӹ| DU&ݘPVƐF&Po{k\\3b" cVV, m9anL$PAP=OcFѠ ރq%Fvֆ~$;b$`JݾBPvQSZw;D6:mxGO.>Q:5tVJ+ջf+#10iX'N$tAs޴ҺՊ~UӅyoؠ+irk~G/:jNiF~Iż u{FÉIMTMw8^S>X<T(q3ˉ9$.pAZU Z~{_`+(<ʌcړ+Hbӂ~9ڥHbGrwJ{T+jM ޔĽ'::^G:lXd>.$^ ΨA]?DiPB7DH? B\*3"m*_Zotj?:(LцUeLEhou;6tqw *)HsgaD@uEm6_qHbRv!qђLn~1.eV}`xb T4Gͭif"q_:s?ƹ};總:2 BL2^ߧi#VM |"c D@h]U_9@`,H(a`eGe%>MBVAhAYJWR$T; 5O=슮1R#xTGyzME yR\tod!< Ej\fjҋq"#o~#]jassJtsBIݭ9eLɚ䦥˜l_iSk"`-Jg}MZ^V]q&*p8ΕR{"ֺ鍤L**~Gl/4'>ӫnTܘSykN=jr'iRyd3~׊Ҁ}vyzBwhz{L4 Z<6W|?S7WXm5TQ۶DSUɪ5ڤ2rɅ{)%+Ō^ti9ͺ;Wf04P>Ips!v?B]]"ca/ۧ# #]6sa[o -(|]u7 ~=ĎmN;uk,ybNLȦ>AtCͣ%@ZTW(h{ܡJ;+0kE/I|#XEE5O:Y6ސcW0*iځ[eOi>7g}DޛʒYBko|>ӝc1JZUVxAM3 $!^J]Uw8نm{ߛc9[!ss3[V=Ȗ Wׂ_`=}yw*HPUzaJ,eO_yl7w5T:+L2 X1\T4˾N2}Si)Z)[mr|C$?` FO!:E<>{D;|CTԗNmGS=)Q 8nNdɇڷ(C۶ܒ]-[؏PS!+6){L aXUjO8l !TOF TYcWu¨~uP&k}5|v ]5~'Hk}Hq=,WuH'X0yqj;w7|A󝆏'(ߞ`C@{Q_Da.H@Ʋ hQsY3f񜭎Q-> yhc^t=|gꏫv>2V1 (Vgd(iRml;!DHu{gQT5r5 !QU@-X){_mƊ`V?Iw m@HS'lZ"QuMbijBQ/'T]1Q^~h/?5V%E7aUͱ *ӱb%5 당 HОTPW@~0DZAQ[ -!Zj^8JlRhӅY ŧX^3-.^П1|vuu TPYE~vS%pGyi)C%c`?n/q[uRr`0{)8TԿ*p&T*HY{bA. T7>1xAm =J+{u4n<|liT.Tm;@(8J?M2ߞ+?bxtXWg&;|֎eQ?֔œA%yr Poy~(hBc N|:~~5⏴/iBqT+.1 &BϴgHM_0/tĪs~Hiv{_@uq4/ib8zrALr]GLne0 c_8ab02-plE y!K}z9ZĮEJBsIPkVf |g2E覶Gu?T-IoQ v8Ֆh"ꏶѹE#$$qi^iB0lQM$m咇Oζp q $[Ւt6Xe>n˞4bܶ9f!M ʶexYbm5,nͼ0k5 x`|I#f~SIZu BKp@JSwgPOF~:G??7зbtGX<d_TNPK[feo鋓>&#/m!i8j,TsBlSz^ k,j^")!e:HAG kZ%B}sEĊkSrJ(]Bo~ѷNP30E%hl]Ԡ.&`)fIj#$^'.mZ}]O7^s[CxM)[Yⶤm@]"զMtz#R}WY ЭC\Ҷ <8@z*+% |Q- |; :$D>tRtY"+{~}.nPV߬0zw&(v~[ 򳕻GgJ7P@EBElFC^U]@vM\v~ǃuH sDbr޷PG)\"XށCtQ t-Q>=o{>fV.he{#,:ْmFuuM* ]a/;K;"Hk\?=*T (|pXϺFIGPDMʞM4$0sh;)NֻM~` K!\ݞ"AZ5FIMQ}Qa{U k6JSck7FUp;%݆y=ǮU']/xqɊ-BYN `0\?ziD  c9Fk*^X1 -,K^P82H ԉ1~yJOȸ= ;:lDxC6PvG7 l-DIoe薝T-pl* AO((QNg%!\XLQ^g/*4R.CBVa5I  d]]{fLivpT SgT:(qrY!YH% ղ@*Tq!6>;=Ϸ+DDD qoA/<_|tg(8=6Dz&B'F#YgβnE?¾^s`"e`8#{zlU]hDs!eUc {z%8`0Q\/o_N2ČBTuI(HzK-r_0j<:+YYpȂ[CㄚG' +8te }(*em#cdsdpSQ-m; TheT?m? Hqo*IxI0h5 sd@Wتh"nNgT8ue5HQl@w ȮVhC#.F!C#Y{䷦w8g}OxUD^]'r""18s nby~m!:PGĩL&Ǧ-N䨭b:55"%^$x6.d{Qeu~ƫ `Ҩ `ϛ'b@G x#~$ BIhb)r 1>?Aݬr;g!?1(P=cB &.O@Raꏮ12kt#9!9 hyq*6HA`NQ٢ZIZ3csY4[k;} j< b"ҮTDVEyge!-0xri %90U|L gIsφDҳy/><^rj97~r~3 }١n؎|6/e٧v@ye' /l>w!V7c:ؗ6` 1xW1 uY]G/_`0n l a t sMέ{^z| 7*&m]GȮ5rVbbً+S,'i,4j æh*QxQՐnd]IvvEZa;dR>I VuCSx@: 0GI2}pkWl3Eܲ(9Նđ: TH +Z :*A2vUzLR?65x4jnZL $5 ԋ7yf7+z*wo@e!."J\ABE{OG4K l!}k$?=LX̀/~sc^N Hub ѭ*LX+NPW|\D;&'#-f7Eyr/`0 ˫_0z{`Z&"ȢISGX6AJ*ޛUɃ C5.wϞB& &#ATTz+H#/;J7~GkuK,g-n)_JG jAɸID@4c5 %ax cT*|!-#;`5vNdmEy4wl{]O`0 ,(.^! ?8t` nWF_2T!1 y! WS~t1zIֹ[JHկߋDASs; =Tu<‹3&TDe@2uI6ȱa !*Z: {(5ǩ ?k%MmW&Ғw5!H@RZ$DK6wɈ)Mh6}bHu.8^ p!@*Ï}>em1iK|KJ*-2o#&Ȏz{ %zWPE|!ks0]# iIQ!oRb],#$vݔ}|O،_QLa8ʁf4 uޒƴUdNje!l!T596Fiڀ5G]h0eU`0 mrST k ^G!BnHPwen8G4yGp=G͠B5J1!v1VuQ[J9*"~z:iZ]oW>i$OM|6p9Z9-hI5H[e7 UXAQvziDG#""'` A^LBAfJ&m[1i=Ya$-iI%m^f5Շt>o;=w5 )5}5cT ?_btBܖ/o1Y\^n+oa`yucӒv1ǩs~5Մ;[ 퇟` Duۮ#jǤ&#gcy)3TL *Ĥ!. D8O+Ao$ NAaFGh߉ǙDp%PT-ZT:N'DLZjYuD&s$e˅6Bla>a}93JxU* OԛDSe4] -!E@I_- C`1~3,OMu9~w'4 @ /MvQ0׷<̛yȯY8 XsD a6l4'?ne0 b~:Ecڪ>*e!*}#|!r'zS>8*nPC6;''dҖ] %7T1Dg˯yN@Z4qghqЃmtQzXuͰ*H $ERpܫK %"jCEhc.Wc峡҇qf_,QZrb!O.O:|*-UG׆XυD fc>/Kb'ƜTWxpby2u9% Z9)ĻZ 2:@9gWCL@cbrE}e`0 -jz 0N\Y-FrAZY>F#Szό gG,jq>%ҏӷOmQlF:}1Dz)@wSεkR/[4ydUs<GHIRYٶhu*,i(Eَ d]NnA=z%"hR$`搄ox妕uLy *,T* ҪM:P:'ԻuG-Oΐ"VGwo]4E|fi`UTI*Hv,bБ!*Jj̽VrUs'f)܏I Rƞ {(Vqn0)D_K  ƥ8X ׎/DGCC|PdGHn}Hv=}u׷=a5J"y3 qQ4V>ϵumZBt A@G J[qeX/A(#8UXs~7KStL%jnbUT=@~A(P7jU`g 4I7pN9,nA%H[۳mWğ2Q~rξ_#E3NX0KTL'$>%6~ԉOH裘x Do;AUjy @`0TS.Q~6C;ErdQ PS7 i#eR[ۚz9Y;#-/08;;*Cۮ-O-4Ֆ.5eEŧX,nozrIrnR%=C>ңV[an!W و]kjCxZ"!vgaBBP8n'O0-&c8})I"ꬷRzUTɰT(P,.Ԧ9ñ?$$$GcqWk(?lJ.Wa%`0 ].ҖsVT*zaAPֶ`u#ɮ~Q>ITȇFhpnJT`V$m6O 7Ջ$dJlK+2Ϋ 4I1'oJ><w:#fhgK秆,JA)6Bz2,kqQx*K$QI QD'H6/|O s齂{9 \n x sȿ`&&o)9bn jv"HA(D'i8n+.U\Z2= /W\.4hCnS(0~)1ȑ<bJ *RMmWtȢf+,Nybjeq˃#n⚌F!@aDġO9^ ()$Zz'ZGPuƖY `%,o}tÓx؋2X]EDEym:R(=ʷA/Bs8H>Lq)&oc=ܤ/&{Nvw9u#{%9Ŷr (쐎= JAdVSEt&m6'w^4T9q^X(CIj>aTXRȦ8A3?N3d.ޱwu;i9d `0wFS^ 0)4Sꢾ|(?s=fΗ+ 6 par\}|՜ _&;P#jۮIαcx+X{xHX5$/0UE *lq~ Ä$orU e? ijYpbU5%X )I)%^aYhK #|CJU>첔m}b%Vgn.JX&D K)hHxesۻteaH3씴I2VcKPcoG 2_NM^ddCd $vB;*ں} |ucAՌٓ1^hm=KX'JSB"*t{̽nQ\L &:tGNu]C `i` /&AEOp[ G+r% 7DAGC̲TAH}GQ' /n qf7ǘ!P} r5͋ήh~!fML ,?%XX׾^~qֶ U;"Ez YVsiRE\pޥI;A.r-R>^J-mjRh]#- y]*6"=""j~tLY"{*A4s4DVᕚlnZ]"oƏYC Slo6u;'uTo~} gě{@ B+FeW YT*R޵:+z8P)zG#,9˝ `\p @`0<s>^B=ǽ-{(]7- j9ޥWU4~pqO2_`um tkS}1>DoȂJ_DvSbstf\"M./;^ V+?a] z ժU_]+{LCyS3 2d**(r;LVWe!8$Wyp %ΤDOV pU|Stajfy ZE9>ynHڌ_ ;~;ף̨4ld] b( 󺛴rԑ%A~VI݆|9c%aT6\}RA-dGCȿK#M~p'EYfŝv٩UU$  Љ7_^"?Adb qz2ܷɩJȀ\JqHP("o~i_q?G6'QbċzEN^GۃEd_r^vǻc7au3AP^U.WfjM¯TE|G2M޻(:굞4#u&Ju[toSB?n i#DH1MPD )\{L9TPz"=p>[;T&T&z.)&h/'Ta?ZoOy"D. Txaw3ފ5:U˸luĞp5=W~jn>iEù<4w9jCQs?o;{zU8M!`0 =z'ȟ6?@>YK@J9#qL1ᤢr\P{!;HqpiX_yn'; RzoRˉa?:2ħ+lc_9n73,?l MHW+\xjZlan.8 `=4Axl攣>!ѓ(lU"7%s8ǟ;kG('KG u>繶h]L+Y4!Rxb̧ _%6̱t qOR&%/PX_0zDJ'+2ǣNF'9Qf y8*XV})}~Y `0ϯM loJ7Y$!-I4yV&cy1-Aw7L^Ƿ‚ n"omZmyo=Mt^*)IJF5T-/cW%7}X-K$d=[5Iuq.WZ +J6.An ) a4HOZ@1̵ 5 A&n9xS>nh@ģjFG ;\~KxBšK6j Q^_//2Lۋ3,bp[kaD>>;;*In @)1 (#K `R1Z` Ltü5۷EoSjtE.icg\]tđxpH$gf%F?;tWWze?CCb)mۻQib-"D퉮iu%= fp ]45 tR]dۺW($s!J96{q+cw8Dv00%HP8Y-s^l>gF`߷$1=["^A -HEh5sY {ǥTU54[,ʻmLEYwQ @`09b>J}#q2"i{Zh! *EG͢% z2uY<5/N|1onSZZ{bh歁I`!D?EZ ~6̀S~D@MQDN~ovm,6j$}E<ָ7>o:laqvmnIHML$qτQyoX=췭uE邅6\"VbW{.PF ES+ɬ+rnޠCܧoD;-YWPn @(ڒBhM\SAKt_ġ\TjwDsJyWwi9Puț`0 ʐb7_"'FU>#rJZJK b\K%(p?n+t[h?\ `:ByBqD9]Qo]Ԕ@aQ5HzH5!qm^攘KUa[T]~ux5߄("bQtkg%9naBe⬽\ffwp<6&R}$:x/dhyHW%~Bw ۹NYpL"j0D%`*+B(0Aư !m؇#z-EZ9kV@A(fE4>Ynes8HM!M]Ƒu%>xIsxwϋS%H%&uUӝoԔ `X\̐~|CzJ*ܭVjK-Ԉ&]쨯m49D(r|5m~5ˢ- X Z\Ma%D1_$i~%~\?߽GZRCHFl} s I@w:H=WPm[t'molʜx)b_Ttv%I܃-eXW.74 yY#PUWH,vHrۑᤃodXz ";o?f=\/&B-K{;)HB 8Գм[c{fު8\<ضk*PiJ J&=D-QHíֻKH7?3NfT@_`0[~H6?bgn8X@շ~Q^b \w$`[PI(?G"8q2w+E2")&%9 ^hx[ \[JMA-a扈 o׳kŖ/\ ݖ:]{-huQA+Q[Vڐ*L[X~|vjuMdb&mv<56$⪬ a3/hp?(+uIV$G+E* ʢQo}V,ߙmzWh08XVuH_`0oNȽN<O*2yڃrצ\(\}*C,ʟ%Qk&Eh 9 Oٲjq[DkU6A4# Cіzif8(m)qd.B l% 7|xWgcPVNKUSse䋫|pt؃HqkbV@Mry;.~^2#: "IV_&)Thf6lL[ VͱSVZ{~#$ՙ]甌>U8d !x?@Ւ*k .=E)I띰>_֋P KF+t`o/B05@89l(y|^W{K o!Nm7=W^̿Ors»z[U(elu+!%%M AMz_cUxp-euQ~9bq~۷]Iv;h4U|`0 )7?y:C_O?ڤeTGGC#}S ^ Elt ʻ5S cHTpsn]B5cNCVhkv{z?nxvG0ҥ@t Z#I+tdfM BKtk*kD+\ 7698m R#z-H@N.fUChU޺>N'[ #_1}!vof? NJh `0~D_bK?A֗Ni IO-Oľ~%UEĕ>_9ba\y ${u=h)Eu}}<I` yE "oAhwszm9ELOҍ$ys"k2T7o.p/1{uŃO[BF6?W"LEh'pF/BPf3HhοbV PB=GaeIQ`%s-96p't `0~SMq9s0J52v}+ZZkzZыAxRЬ f /<+]T 8BP땎BlY/dp/lU/(@y)6wT mӆ||qX\Ly0;V|;6{S"q^p I祛7g[ŋ*&ɞ}?D%ͻg:&D7,H@bE!X6[[ٖ r]N#`0 oeeS|YN|o<2%uԟ(#!0Mu^G\v0* }4xS=*G"b]BHr4jDbEHEE $)ⲛL4j_?EQ"/EM~g]F{- R7;"Lz1F@&(ai٧ e.|xrsws>9^(+PFhEs.EShiX\myXUJ2`0 o*o>Q\CQyGbD}U@| kR ^DChir0Mۭ#b=)B2pP)E)P8E'v %>Q@e+IBvh͎\KK,Ϯk|\a/q+&kҪȄBڇB6U1j?5;wIU" sط$g0ʷJDtp-\9M3۽m{[YuHӔG%`0:(8'si@x+j%"OvE qQhHE7`h%~Q_bG/~b3n| _(bZU'*E搶wጎB ӦfG [ʛ??_&`츦*-(kB(O̧sqpĿQBr^$O*}ʪ@S;߈Hx 2[¹߷ Եy/v“8`0&/^`y UBRM5+\ndBa%6ymFH}jo$`"L#[SX߭>3}U$c6p.=Gh0/:dY,e`0 tsC>H]b{5| ږ5`TlJ3^#o{Sϧ"P*HXBϩMbԣ Cӵ}U' lIgtO oC7~i͖t>f ƞDR9KͭmHx^*aCYѪyxrx~CNBr6@tK赊";(yne,%xT(vXTijX,ovTUUe;=9`0 7[ט=!q!R٪CdOsq+P-4֙Kz@(XHBOPN9bM t&K&}2}lU"J]+Nf˞ 7?;j4 cSwq0e??˙)-u5 f2QԪu%gޟOU=%jrDq8ӭ]G%E_{%h_mx f{;߀`0 R 38Ɂ >JD bmq,gh~-~Z7P EQS$UݔN%AZ##ELװMU$WuMHNh,P|9K\~~h䪄d kPx9B3GX_x)`u8 @^Uy΋{Dih$ﰖ]e?`0HZ\pW8W/ U jW.ԯ%Z68Ĵ yj?W\"Kn1I=UuՌ}_gPҀ,ZrSu^2U~IR+ۖk?˿zn? Ϊ(g+`UyUH+boWB2^!o=E6'cK_PWD 2ɗ9_hc?r}o|m4uYNi4a`0 n-muF K[I7kkqi%m·Rc-"* ORxsaI jU)ܛmsx(耮0TW;(+Ԭk\tbBXA`ˢ̀RD% ,=Oeۄi 4sH?C:a=FGpeҞgZGr&`V^w<(Gw8Ω5\Ѷ D(w\W@sQV^ջϊ< $Io `-l#l"%r$pA · ]A{VPyQ= C:i6ԣ}wKD:FECT R Y%\`8aqUyfƬFVBV *O!\px<4: cf sTRZJes^$-XHgEs|r0$5ٳqbPhkq`0=98xyd@ vǯjr޲ L5ԪDR43 K $OWV j6S{lC5E"l;0H.za1*  DpڤO3ncVnۺ㫺]~ + `aI6;1bыHQbKT8KRo]SNcil oՁey)Fo<>BRPe~JXyDyK7+L_\ Emӯ%D?.T~ K{&lbu5GȎG(r7 ʪ`K[Q(UJ jur^ 4j]sQ+= ;`0 ƞC:$XZyw>Aq!ﶞtEyV)BS4qF DIV]Jy Z+UD\߈-YAkHՌ Tʓ}M j^|Wn j]|qqK]f-M*D=d;##48NFGاK>\U+D V*g2/1X5'5[,n]mUj?V1 -mCyu3zfi|G<#{؃|Ҷ<܎NV"Igj b4!^AmaT[=-}p Qk _ aYž5o#!.w_-P^q[\p`b qzF,l*~NV{A";k=g#Id3}@6@siHjG"&,#b%a93nc4?mVPww8`0 m tH&di'HqMu^W(哃ms^EDDxM P` ONb 5t:@uU`)%+4rUX y{JyGk >?!NP=5 ȧd_^bmdV$aQOuls]vK t]Z𦿥\夘&P?L `0 6XM^'X^. 8xGC8J} Q^wr+"]"tx&vnFJMvUCN&)!/"4k56l="Kt[`Pq%=C5VX7mid8$p@!B=h6 =ST%ɇs'- y_jD/iivq+(UMbYh-W6VXMw>F5A+ *$6 -A{O#ч'4>ɌÊF& 15k-I0>"l@2LcAEIA KojIۯ\ni5/.?FiнŮT-ksD8#O踅qHs"`3.|4'EaGdD\f]dEQt~gߝ%(H]K^Sg/)&oM r}MiFcVy8r^tB1iAdZdBDs(W8]]'(?[GBmؠh^謞6~rK idyw lM;&T: PQ+ T/c [<~8ziQ;ƞio> tǴ:%W7}oľ:+iGg nyhMO#MO>*YAq/J*ʂdɄ#' ~6'qdF%e(Ҳ':viednFM uMjP}fY傚mC/ ŠThǽSjdH)D7/+Ι~?dtLT/ִ]#'cjȄs/$(/ d&mf/a ֦{uݘL?D??mm~tHADNF49ғǟ<*(:uO&"drǔ7ož`*T,4[+V_۠j^_,M@3lY~7[EMYD'1~H-|d(]90Eo8>36T=:{ m͢a{bWgnp~W0K&)T(`΃qE!㏓"$n `*L 'ͽ ވkKKzɓsu I&!YTUc{:o!L@:_; ;z(@a?oe O#vOi ózmM9ac(_.\$Y}͝wۮ[תUMͫk Iԟý>s 3pX~dv{r!{%w!X# G/M9nzEŢ?GVD0Q]dy Qn UT}pHli;)MnaϘ&3K bf65t[`n&jJ;DLpL>u4G:TZT/S mήI^mI!s^ZS-ضEPFZ?ySZڎ}:Ěqˍwz]x6UfONH!5Ӳ沋Z)-Q84d-bYSPv63p,sUY"Aլ"9!O&y,28i ͞qs?҉&r ܜqJo ct⚪mM$moVxw`%8 IkfT}pD[LǏh;,v{\nRav}lEЋ %R)*^-is~ڌhorԬF5 t`3.I-{/u@Sl&" QC͸ egݰKܨ%X5Z˭Kv/`+x[H'0dsMBl}vLP12K m?<$U߾nn;C#@y^WV]-So7t`OdIPkb'>iIj EX ǡί7=@RDT.ns^8L8慗 ٹ|cK9S1OfRѷzѢczZ؍sfp^:ޟklE[ J֨Vu_}R~ G7lz2/9" nȊwW%t:+kzxk՗I\5#q}5dMLA<{[y8/>p6hG~4cz>Mw7)^#v%ل^*6h~~_׽Ao{rI >ح#*J.2&žqY)gͰ toySƘGRhd>?>W3!%zTP'/DV?{Hi[F $nv9PaA<:_5ܤz AVuWT*0B*L* )&!l71my.]7Lͺi<ܬ]嚶_]PyD;'^Kt,1vAcdhj?9giSϟh;*blgޒ i$7?Ewm;%617N'Q L"˂dU׻aQjU=IgZ+2 'oZ<;'z0FVEHkJ?DA_JqEN}:&W4yzLxgpcjɪ4RԽg3'D4;9bbr&!i6\BFZMZw݇OͶ}@@(S1] >RT D{m+[B0W|O~;l y ұߔH\bӑMqK(s aֶS'?zHWOE(dd&Sʟ7ueA{N>kPDNHZ֪fu})}̽-$&mX&|ϛvMk ǃ \ByMCg$.$7xgBd_dt?ϼ"~ɟ>4Nx~3fONSZI>3O1_DX1(yBa BՖϩ"oiUއcuOT-޿Tӹ8cr*zc[7yV8)+6_SjesDU!ݹ!Ζ*?q4}Y$%M!~0ѿyB'؏HgR'tdm$^R+5;puق&P)*^.h'{fZM՝}ܓ U me5g{]0/%Ο5{X4&& ^,CowLSn@@&]RiJ1 \MZ hVq0"9ŏhCf0ى#>=WOia4sC,? (9?2`.]3/^qbgV~5r/T- ;,)x :mbfExvKw1+grv'Z)*%R81z4~i˜}(¸5NDw ?DӏNh|8#!}:Gcȗ ܅M\r,^qmUi9y x7gͦo ^On/2!KRziIn7t3c֙~LtuGEdXwg$׍-5bvnJāN$ͩ?;u6}]ZS?{Dӟ<g41_F/\L\ ?DS}2Ve i$diq5YijuS\  $ YlZwqnHtOh)m?=ͼ})5<إdbZ{q?{\ˊˆwhu5Yz>|1te00 C+Fx+ؔh} V//iŌIA81;Hl@x [NL4vل E#2 m}U߿WgZz0F(O-~t@\W @=}ʁ)"f&'gZa/^"xW Ds"()N*ۜ^nm_' PP˙`lbsꚖ_tᐓ#HW+]o0r^̉;8VRͣ 4gԬ&K) <84Yy`#/¹Pe_-4Y":6M%2\^bMGhFk7^N?|~ ~ nDL;e"}.ŻHX5gi|߼(+HB#+ZF/Wa|bAi&O;2`/)qlj7RhSt497t^w^>#),JHg/Q͍;2Ƒ㱖gϗP`hV5h5qlz֮3z;˥zSgj.%G㐤 UG4y0K<{|ۿ4}rL||Di{(k1j Ծ*b;A՟_- jxb'v7[ jq `VLAX3_T^!fqVYA8) .B_T7(JcdyIO ^ TNRCC=U_K\.-#h19B+N-Wئ\5TrS`ll;g׬vي}k7u~5r*34M3uЁ;G*%Y Z]f`aoL;!18/5YwjIh:RQqN=IJ}UDgs%lKU}r3Be I뙠ݧ^R,P[T=yzB秴L ׹7u "]BIZ D}vn5xq;U|޿;=k7N%* tNM$izX35BrdnipZm|yAF4 j>8 3X_ .!X ь:*Fę Z]!yIdN^5/hk'P3s B&rINhp'W)8`)H(2ˎa˒-6})K9zlJ1/蝁h7ZÂg/P @=Q;\+" l'n_'Yg 06.M[@_QRdUP5-i}:6p)e^$Գr(Q̸ٹ Oˆ!4JD@2MIq!#:9{@_;qmMC|FS*13Y+IG{EXҕ? >{(]u⏵L4P1IQ04hRlks Gk7Zi>o 1{=8DR`zcvJ* ْR`3v_/ ]sN35k:QFqL\ikU6U~vnjoV^_Jt:HyjVzD{]cQ;_6zIOXtv$r^JNE4oac+muZ?=lyy@V4Y7D˚lIj5W-mVd|n|p;xQ3 '6F5`Dj\R3+iY&k/#>4fK 'd 1Mw^.cje%D g"k.};yIr@EMRzժ&>qAQ7ڐIg=eT_v:p;)hhhtp{&*~4Kjޝ N $ܾI'Ξ/h_zF*3}k8}kX1Xp>ή>A׏Gi7mZI<1[iLRI Ͷ1(3hQI:?9$o;ߣCZ'O$δ /Tى]v"[>S(/$]lj˄͚׳2 ⰲeMbfrv\5Q]-Heo(Jʠ!2_}rڃ1dZ2]OD2BI-1;w5*ffƒ`[.-5hvV/=(}k8ۺ>tZbg)nh3,OD-UX-LIG旓 ռ\+%6bV{Iş.CA+tfs8L6!c1h5SήCDQԙnoGeǓ zFi>h+~71XدR76sŔ%z#)kH^TI2\8 +هHPjCC.I?]Q~|ҋ~^xcOՕRYNzeΒ,70$Mqd6d'p2rJg"$얣ebgf.r @ B\ypz>4ܐ̦Z\}kYob=nbpoȤpmgF|')˭oNՍSAN`05qM_iDzGSJ7f&,]3EO7̂cK܋hTVg&Y2}BgZDN҉uE |mQLOa BAh,ٖJfk"]oKצ#h-gK}kYob~{'EAAERI{7ſzQe6R˺ n[˿/.irql`39H3:wB]$Bg+t?_"݊AAL<^̍ yDNR$ˍ ~S 2ˑ}x9G{xN ѷӷPwnԧ~i (m7$K, g>8{_2zDiFIX$trIyAwg4:9 ޱs =Rwt3Ċ}޽ֈ}ν֊wS+ɏ,@J{ɘn 8(J"Zs&;H$ M_+kL3"obh`("қJj&FW =}k9}kYob*|:=jf{~TPԇi3w_+@0H"Ɠ58 2+BXW!C0t/i3ߝQyU[lt==v.^:^r2F לUVNR':B=}W8/,~&7}VH+E&ccU H UwFvY M軨ˑ&gK|F_{JZֲ5c3O`VTKLu zR4ǥqw`ʎGf,Ք6WaihtWOH)}nL}kRۑ307]lz +0#S[,0^:aUPc6!gZ}xG9(\m9K;$rl?<7Q6暶}Noϑw5a~m@ TFU%Xdz_yf2Dg ƞ7=6W'p`Z_.hkRq!U ''3>{tLNK2w2cq("ɤ.}y1e~!0Jui='.T'+62n}$׮zK߿=' sS_M&0CU/FFRV~Y /&%Rb>wp?isZݗTEz*(o0d'zEgVx?nܝ|jyEEgc! sv@T^6c'=LK])=viri~:BߚNߚ֍egM0|KG$eJ&bw"][dۿ3r`QpuMMCՏHh[ӿ. oxaf.N>5'ؖڲn$7PN7XDIO@aM6ȋi":u(gґ6 _S6&Q47}}pL}Qrf&2XnsMF7~Hi Fqp3qfyG>k#6&˹:nvJG]~9 ]!ǂqE~z}M[x0zZX*]>l.+JiE,^0`B__X^qE(#No_/ba2͠t+~IοL"1.3!ՖikZ|{/55} \>B FգH':#eM}GZG,]xnھXSsחZl#*??( xey3zހ~N~E'g +DBvaWqPqRR{Z7`3Er-!ǜG" 1 .>/i״)ڗ__Q3Zl_(}k:}kZ718p>^-a "9+C<} m&EdPʖf21} (pQuMW_Ư4HU2d SS ;R*'‘3p7xpȔ:(c=%Mde/,_+iߞ#麽n0Q4lKZ7$tN?jE?dtu}䴭A}цx &v QD2š i{3?؍Lz&fIB6QzQ.GŮs HT>s3{@4m};2D㾿(b\{3o^W*'oORWL<I{O4lz"Îk^izAGT|0阸*{]8swFi׉g%Jwӽ.;1!=xi %{(pܷ7']KĿc"vGֶ 2/J?7R&|ѯpw Ȍ&cYp5,}v6)8-戫W -i{ѫ*I)fz/Oe"1ε؊6;PF*|gVhْ_27zgGN>>7!l &10O"i.oM2IYP:iůbq}~]ʹqBŔF'3h|2%u2aEJgkԛsvQSZ#`\ώ\ Μ\C 9ї'꠹~LEY+s1?[]|sA.o3ҷӷfOz46*c$vRFPugԪm2G( >Dd}+0CxoB/TNht4ɘ$qՍgg9>e+9!=S"]Zw 6׈3:[ޒz~MkZ&S]} JOrZ%A BRnHNdBo@f'8TҲ؛ʄ.#w೴ˠ իټ^PQI̊cڞPWT)0l3\zwM} ]G{A:Y_4D(Rֈ嗗_]S}uv9r9e1K @ XLD_K,Xy1vc;k-R~0ĭ&mpRCOWA)^Տܾ(xfg(釙W@1WLG ,l*Kzb\ @ХooˠQ' o*&nx2}VdA 읁{3 )i$Хookx eGD)Uz0`:4 ?߯w+;7 RuSvz" 2_"o0.ZZOx I|끀0$MS[ʧDS<{9_?buؼ\ndZ^#n3 Rk-%&N>{ϙy|nm2^6~)(׊c쟷 d@ 2n/ O97t[~MK`0b>ݴiA=p\o_+ʎ0}n ׈Ԧb'I&;A(J;[TLjQP"ױ]oqbX zP>6O }}Oضϸ3g02s=/w7~|>c1QLz $JncpfqKƻ@:i09y ׽(zֺc1aV6F}Xǵ2t" bɥLtLVq e"9+e,pRl7Qz JIlD<=9鷟`_B@D+n'7ҷӷ֕HAۇp댉d!I:|YnfGu&LЬR5zKZOZW t:RJ/}KXOb@;T;r^6.+w_xô& J`/g*5AYAޭ3d2mG,e+^NrPhE>27QqRp#Zlb ׃ ptLb$לv18{f=?t$/LX) @9qxơaX~"'_3>rAlnS,4K*rV @y80I ԫerL=s>Y"3EK;<*h{فh>Oqq:~ (uDӑ+P+MVY"[O{rx}?7S5b7ҿӯ &Dz`p+娤rV6_jy7K(GJ֨1s VW}G7ӷӷ sC ViE͆In:;:Nt~ܫ|v veCI]Y #G`gۿoج=aU'7wK܂( dJLϚOߚg(%=@y|u).{){;|ָCjѹGI/.W#Ͳ&Rab7ҷ1D3z0pU*u:vAK;}|i0E],݈T2\մ[?pyѢ-~lS7n]f3Bqvk% @f|ռ<5)Ň~6qwC^dxݺ 'e10_ؔ I7ҷӷ~FiMjW >C 091(F`3s^B1/8)x#}k>}k^^=3NeTApYpr8?۲`)8{׈~4XuV",@]E?O5\_.qZF|極ޏEF$g e6.In>%ZFy.n2$DP?xMPn,{ Az$Ge\*#&ޟWP]G'8h1ЖQH'DMC>[, Q`adp5J0<-NgZMwK3[X`AdGsֵ2bDۦ1k?w`` H뭙>[Ol}ü ȶXg_ʂ:dpe7QgӂYE'2w#rW;d+&YJ99^cor(DZb DƂ3׎JޏAG 0]`N#+ȩ=0D{P)Y{d9an łz9 @9{0k:[)TN $Zu&fI7{1ϔM %La*ˆd!1'2ށ|VQir]Pgx'30Hf|ހ Dϔv 0#]̍‰}9[ziT_׶OȾ?Ѵ1 tA6 2Po @ A0Apͦ&JPq@-)љp& wF煮LyY0loaүd:h$iJ6;vlɮPt~g7  (0ϕM4?5N DOڗs Jh:w{`6! b/@ |ʄ[b_} !׃ p+I }Dz% Ts"^x>ᮨ_of՘rd0`;+UjqN~;S 8S;l[S^0uDI1% @烀?[Kiؒ%"{>~$0O_ks:#k7dvȊҭ'w}h}Y ߒ_z_?붝)H4 r SL D!b,izCC&ιf׽Ş:Ю`(<@NVakiu"qM r[K:oTĬ;љХ-D`|[_ߠԽ`hʁ[IP ;ez~xfN wrUl."[Mdd~l&cYTȚ](*-5dl6.ۏMs舉"YpF!gڂa.DgVG 0] a;y[ǬLX3hXFQ5, vbRWM 5d%Ͷ] UiU66W6xelj?Xmi_IB1V|uebsQ/>S=$ @\5~̥׾^*;6lQd癀H Ψ^tᡉӒdA4~86"H-ST$',\~cb&>m&r~/KAJQis!CjaqjiDEVmWEa^('fKH(0qy`]_Dܗ&CH2iOsL޿"EURi|85=tvhL帠)q4dTL$^3Gmܸ 9VU鴴Q¤X2t(ÊDn˼dj]梦yCBg2-_Mu=Xj\ϯX_ia~L#u74#;wo#ٔ&tD總vnJܝ!,{FBR9.ir41>sVD#a^o[&VCb=wGtt˫h9 WŤKUao>:=K4~ZjDΉo7T_믗&jCŊv">?FJW[bz@'DE_1g:\@!M63 xƕ?^|7dDӧ6H*O NԳK.{⟏DGE!˂T3>fc@͖S)J]e\Ȣ}F%8 QF<?Y4:|Mkz~ikӇ%Zø整z'i^p!Һ^#7 q1][}`XDy>CY~iIG5tJ4>.itlzuY.Ld@v _4MLS"bC"gz|֟ | *;\3uWQy6i^oً/'f3ۋٗYMlMϗԬkZ]i}1/#%owqɯio HP2a}͓Y?7E'T*:yI?n}W=(*;U "ܽN=T*$@)?NysGas8,J'TLg*'> f{Kg#ի --MKs<) Ai|ZT `6ȗ\(kym`./CT=ho|81>91UT$gҖJE*:9E|%L %a)%GaOQ$e|){'G.Oþg`kޏDج,xoW?.FhJ#_Lty@JtlA$8K6tDżL/{Ԟfw3,OԮژ =@|F#dDs>g4:hR$ 9@w( &Yx:Nt| +Dd@hr`F[2&/2elCkn%;+1?i=#튮0—^Ҳb/! IXq~apEzԽ>eI"fdFڽژmӻh2 qчT : O*~:cVlRP;eT78B&`]oR*缼'-/MA,D%1@K׹?Kw>U/be~WǴvI_ 0@R QR^fus]/~@=y-8F^$p!zdF?;G3|8&1T}]7%v[s9h#)Mcji7u+1%ߟ)e'1'+g#i%;F(:ޅTNL)=x_!]4!Dxy0 U;&3łk$sA] ы~YypDʃ5߅!{[ļ7J?Ptob\4pFg4~RQ1/ &ҌNRmD7p./Į]wvbwg ԵWw߼R('f9B8I34ҘkoD*ɽ~QQhѣ柏i쀮\şhy%NIi]׏{&SI( N >p=B 033$8}hz<9fN8(˝g!$j'KG/^敲T53`V;4ޗɧ`ϒtBL֙B&%b]}3ea9>&7=#:dWTt__/ŒV6C@|l3.i;{- #7zz;ks3O-EB|Lgt!&GFc,| k\ȋ_}6ҌJxE d*)ڏqaXQO;DŽ -MtnA 'yެB)iل_o/Ҕm+|RL >>E\}|\kBV!7H;)+vCwNBUF <:]W&MYחk\'8?ĞˎFK $m4i$@V(N>=9#ErwܭL|1s:[w I`B%DŹa@e$BXpN@7掿i,Jس,uzQӅd鼩c<&)fPZM_ft/SzWTtcj jZTM3E%vҞBڙ^wJLBYmP Pwɨѯs6ۂH:F:ZT$pT:c+Xzɋ}qʭ3 ~TC) 0<{ى@}4oΉm KiGE{:Zu*.titӛB$ms"d. E|Dt7:=}?>HDh>Ӝ\쵽n^Cǖ#7"y ['~y_z:%"˖/Nǒ z{v3SѰ+e?QNYm&!;M>ҋճ+~yT,[^g3o{rIGcw]'__5#}oק0nmB=k_@)w=:lF' cWJY!vsĎ#oAL Gi q`Oחg qnS+Sr|യ}HE;/tÁM/s؋ eEn":D;UN4> [|6kۋ\1{u/y[܎1~5j\_pE,o+} !p_w4lJš3Ϙ,Ob{;qV@)+!&ZNZQI$>L?Yo3w=w>:ġ7D&H|6i1<ʌV''&;'n%NNVF Szi}?"3h65+E+_2.(/8g""Z_qR{@:P|-ЃxJBB씽f (FE0H!:'IpI #\XW)يą7gOtb[m7sVLžtN^cΊ}_^ΛGPj^N#9+.̑Xd"pYH:Քf?^9 , <kH9+.:i@nf'o5+EͶ!~@1 r\'t9q^I6P|ĮGA(HGBL@$Oguo|.9%ӢdaDIH+<[/+S:?+nkLW"-rsQЉﲪ^WL'"]g^n(dNDғx@M?J꒮_]ܑѤ_ӎD_OT~)'zLs#^Mn5ɪ[@ ܯcYCQW~'Wdy"ez.#xI,۸_H/fqZ"ԃoLi$Qr uɖgBU$J! {$`o>S 9^@|Y"u8f|Y <Ӑb5㣱BP(6QpIT3.Șrq{o`ȶJiKSH Q%`f?BK1 Z $I) hn7 P^9|g^L$||F_o-Y&Jo/!(viajOBw B^.%.'%g~F.{<6N`9_ͨP( [=PO@.ܜ' { ^l/DQkmvVU|( P( *aMPs!7Ba7o_o LSP5Kk%tlCz 3EO~/]؆8ڣLtd Qdr! aĊY%qa_}"D %Iro¢L\gm8Kga|EZ6DF?";B\MP(QPB>+ $A]/q*n;Ф/9Z J) Bbɺw`"xQ^E7aMyQs}!A&g 9J@7HoĨmR!piEj?4$)roE_p|[5`(a'kK #d)oXb %ѱƲ1t z7:m;BoNBXLyh] pWR(YM)lE"cw_r繞BP(W9^lB z#k]ív o]BK8>;Q Shs_H5>Ēb0䊚|il|{/Q]#N8g䱠!J|2am) &A'aHheĂ"Ă %." ـ7khO[8?8 U(i +Zs~ Z`?zįk&zaFb4IP( ~}X;HkgAup:yx [/=;Mb=1Bg9xy̫8bʈSw_.?[o a,^n 9:R/J)p}ZB D$'jK9`HۑQ?I'RJQze}II󎥿ܶ)$7۸CZ8?pBwuZv5m[܍L PՉ㠧 yP̧9fS=- BP(C,% _ƍzgY[:x#G"Z睗2cЖ$[5Pe?is,HGDd_ɫ*8#3c#.i^Q|Ԕy#)GO<7sB"J~aMldHd6:BRɫAnmP} WF`$m˞"!d85~^?6әBP(WY;h6cփ+δ1 ;77@.CTu?hhPLŅ據2DDE!D,jD2dְ@/Oʓ2O&AX8񃚳UC B\#`^Z,e@JILv }k+ĸؗ;.{8P(᳻hW|'sgD OFm;? $arn/-m( Bb)u'axm;߽ )A8nI P ٸ fRQ)DBiϳ#( N0ĸ^>E*U~Dt¬1tT`$iF%IO$j_9% Hk9KSv( d" E JQEWH"Ĕ$;4)@19@;ABx j%c۵? %wٛKd|zx&0BP(+ gk`t}7{_Uea\;}+AU(6D^tip( u Ein'Ie3 @w#,>ph-_c{O~cbUK➉Yȑ6tb3,)N_b^&Ǖ9=B Ȇٖw M9/YP(^r^o:mKbbI*]Z07M1!H aQ(5XP( ~ֽ@e?Wۻ~uP M^|XQd(rIZv"lB8WYjw'A|# :CIQ3b#Cr) ( 8Cw\l ߛXaIvdZ BK M|O )XEVzY ~O ]nu2}oLc_J)>^rr+ q3:>=ُs9roQ( Bq'Ln8^kV'TlÝBLN5S)DW@TR~~yՋ=$1@(g61&'m5"F|#c=# d,n oW=~vqB1qTf߆#@ [RaWBJ y'z.WZ PP.Ka-FLWUk\l/;Ao.7οIsej/soQ( Bqw`^:P(n&[:M/M9u=d&1Hen X}$!i"N%d p{=j8hz&I<uo-$Kd(xM;B]N'㳝& K_8;))M4 y@j#5![zVgd<T(2\RAe̒{Rzs|EEb$ !k}f٢P( Bqeu&ֹ\}dw6`:&1j*@iguڈ9 ` ĎՇB؇|x#9 EG`T. %cN1w!%<rVA޺)j1jH U8԰J>*rp Ks|.I~Zꃈji8JJ]]wDXRƝǵw3 ū[.n 8at'l dR-oI'A<ZvRn BP(3[lp~-ǡ?ݭ>nA횃SnrB(YOG~!5IA$ z}I"JyU; $(!̹"m89 | $t<=MC b1` w G@tjLq!WRPW+Ki]MEK!t#A|_ujr"c P( lvɫzv2<2R!XQd`D\˂CH3LkBP(d X{Nyfrkf2QB{^dLq_ݽInmPa nImihNK0.|%orN 鄏 0bӲ8NɅT[{(SK)~qZ֧3%@c"H&Ry9t- H8iI5m=ՐsǷߪ~P(^IVVE t\pOZBoӇ}aON;.ꄋBP(ߟY' Ϋ}6AcxumyE-7w/Oz^o kX@w.h28>79 e}] {ɺFjH;G$$i=Lߨӆ)(dY$;puP(n|%7{)[*d!L8j|{ZOr BP(nKm7tދA; Z6NiН5|Ox}݇6p4HW)ﲬ%1(Z |1 zs2'rCw(—XuzosRl5&.EK'=Rl%v˓Sľt;y{QZ .R}Da= "ir}+Sm߼(jbB꠲ʘ! -%KJ\,/I>nX{ xFEZOBP(+ByP=~/W_Lc;)@(6"ߊϰJ@J)Qݕ?|*m /b"1tQ6.S^0+hl~H{ϓ^ܠƃ+ Ǯz`<1B&HaHM.V:Lr`/+ϣ)XHsʊc _o^k =ÝlGөBP(WY7d,ރ`J1vō.Js縮B{cKVZH?SYzkl8p!!u%+UJZNw/Ҩ{upD܅cף%qdozȗd#*'KdjQcqIN/WwJr n}:}m  ū].Kn;{hή)>>aveƭSEJMS\[/1BP(WY7%DZ@$ZJAp?DV;x])9Z-C%_ ePJ-QjˌsJ-3~Qee$^v@1xtn9&uOӪxEnWZnM/W#(E&ceR Woh Ai]\305 7+#«_' dLU BP(na#RWG|1\Ew{E%u2LP'"Qgf}:76&f~^֧ϑLHmHėu  0Y*5d Q}d^J M0yVr,_+]a1Y׮|Av Yπ9a*/ s>=3R$>C(EqzeQ. R͗$'R,ӽ71/׏P(W^|dY1龱@:°~R V"U5Y|l ;8<P( p>k|nvbխ[s%tG}[}cHƗZʒK98W OJ~L`$XꃓWA%y"ɁM4,`VVQQ|~91(U'%)7~:rcv6+ɤeJ/rݙ| egV祐6/f-KVtnow$N^I.sUٟ$qɾs$ ߔ<#Nj:iu52Ej锫zuicda+IpӧgJBq5Q= -RW 8qk7~N%f-a6Ɇ|)=p(&EmBP(+r  Z/Uic=~k+~4tJee m.q*<7`Tk` BIDMUzĖ6cK[6CkT,4ˋjsyYɃR.pqtΠW{Cґ49ߋ_'=9) %!m`gvr3-vx@1%+rc"3E޻& Q7nt5ܶeRel lgelX%9VQM l^+LRDIoP)}.p*sPOO'zR BP\1gs6|9$;.l=5bb6gQJ-\.~ ʥs_iv*d)gV'a\ƏTg~O]`|8|Vq&ː/[?A{źomc1;a?@w>-1x('6WKrN!lW@v :I¦Z>eCd4xl;)r@R w n|w' )Z[oj]FD~)[Evgt y7O%A.JaS&y/FLZW^O c|o5X9]'3;ɌUC$IW`z>)mKu`=lCVVǮcpzq8f>W@#4p%b9LԘT?w|[m`tjJp%W v26*+v,_wYPe[lOHqO?&n @ԅ zar8+IBP( |68l x΍w=b+{}8e{M! ޸N8,D9HFEJs-}qzci!R5&=plɣLpzs*t\ޝӒܽ~oom|{;4'QIa@54p~nsk϶/.Q< ^=]4ѻܘbz:уc PP\1~?ϟ7O}!J~sBR#Pn(}cTdΣد|ʘ=Yǿ=h ,)Ol0r͟ `m غ3-t2PK?_=u$CwJ\pG$=oV_HvN|(쿏(:lh;0;tZ BqE0ηMO4$1Hv0u<'\5YvU( BxqKg͸؄cx<3ƬIiBQf`z[h &~'2xD QTS+XYͥH ~ >|W*м?0:^bvoqO>za1{U=pwtѧ# ۅ*pu7ua_.&^Hn@T,"} ,\s|h PȎTvS"і/Q#\sO* Fhˠ \lj2-H#NyOAOUP( ŗUp^p,6Eי<ϷժFtû QSSDO:B0eRvg EChL`bߔbgI^1PYq~gNٵ^%g']nwzIGE86 J?YZf-C0 .]n9RVb9M"mfr՗.Ξ\6. `v 0Y⏑4Xc!!g;p(tş[- BP(c8CCOW?FI0OK(YtK&B&?* Q Wۨ*_yٲ"JwPy5 VjaqcqӟIޱ1 2gӇ{~cw-CLGMd_߅odn_7Ԥ A'+dQ(kADS]KVA!kYw;]mBPlp? J)te&VYTLayP]}QҰ{6~/تT( Bq5um6$2V?_y` [,imҒ2'<$ie/%=P]dť`YWZ$I)N?GG8{z!]{l W0Bdj,JTwOV GBZRz !sDY'*EJC=Ka=~yfsO%iP( ިfl.phJx,lם;nVÓ,5m1J BP(c( ~~$]t R[ o_f>S廡23ȧ_N>S.z oaFtdGRD5S'HWnssYbXiG.%gOn˗xLɰɉ^$ bc/NQsq]߹qluVK[A}R( B*\6 :/]E w.v"4^)~ř|!-]FI"d@Bn`8P98=)}fxC?B/?>{'g8wAYĐy5[ʩjSo4SeBSV"=R`^}] ˄sQL:"IK9z;~ B`GmN2)bE?7Wl!ˀ!LYUPO$ BP(W *\;:Z~~s>Ht *G2O&VN>#VJk"D^NKT!8fr_8}|Z^ r>$ϱ>z7[hmyEByg@<7;R#=$5^1,!/|GB6z |φ8t O>^ hGRPljV?jbɢmx" aq^k_,* 0? Q( Bqus]JO(Su ׾۝3#?I͐HeO  X}_[- VFzz8WN1D:^A_^#->o mүR\e2!5rwϞ.q'8ΰ/0O)g3?ola냎/m06WJe!#ZybPB^C%Sܯ[#/ke p1擙^ bw^ &pGY6$V"!+bU-ғP( p=Ҁ'xt=\5ozW L:`Qi"b'dU+%NEvIZ8xgBMrpV`r4õml$db4wc_/ϵK)Ͻ+IE& $.$W8Sf44und}o{C_ PPlVrc?.#$f:qM>Ih:\HBP(6y)b^ye9Ld}w[Q7Rœ#B e(uv2W/*¯T BPXP8i-SOz AH'6|RxOx3\`t̗%5feGKU$H[Kgы/pE5\*/Kl-cI/۸.LN|V(>Oh3D{H$=<9ĴD5~P! jˡP( Qp[LK@er` _Z@  Amp} R]$؉b|fKß?/pɼ9\m9;B~ W# 쯾<~.A >E#Ⰺ6[=  Ơ3M$5 DD%^ Te^KOBP(+JQ!VsD~M oL @fބ7Kѓ/(H(ȧMJsA \_W`xG~˙mfSS]K6uBYFz9eL&x6[P( "sY7U۟M":_{Zu؛>鍘>W3U([U-O.B xϦR"JHƐgs?gXLJ8 < uDehlH]J>(}/V0,W p>C}ew>% z!95"+P l#撲_݌]궡?BP(/sYg m8 ~t_6A\UR+ rQ^Lɿ⧱)$Eq &x|;}cݻ0-MV(k4ϗz&r zӁ=$ $!'MEh 3.fzR BPX?&Y3o14|M_ of7'+zҸ)\ǟCiC/=~EB3g}/^7H 2`B |PjM-=to\:tB6d W3NRmВL Wn„jaqRo\ BP0;QEy"yˀ{[=ͶޒA.bI.(V/S),.rB(PTM 'zώ0!z$NGGxLƐhG9.:eGrg?('o˿I ~nuuS@ ں:0Yml={TS@h`i3VKOBP(º*8M:&!_}wN"4儙87@vk })[H_|awP[W1>y)OrYec_,Dnuq{[uYk%LnoZ*"3hfTvt G}Ŝ'-53e( Bx!Y7ոO$Z/W\v6Lt'N7;RMQԁgQFe* B jp,9B x5.OqG_ _hǫd? jD\#?8d_ M5r
xٴ_g͖ {b `9 #eͤ\]|<?y:.Xp$MfGPCJ}(HHcSӆ͗J-u`zod}s z*r^H$26Z^ukW$ӌqÙVM 56- BP(4X7nnq6mVv.,%zs ,9$sO]yC(b;=H ,N^s?1'(p<:Sm^|/~ 'L_Ma <(kk]i(+J^^+siw F `MPu7ZVh\@.8N2^8[TOBP(ƺus[MQ%}֋Vv]|eȗ&E8>H!*ҥ'O_Ij _*\.@ ܪChjA ů N7OK3<:> @@%QˑeuQnF" ~ \SRõ,-$oS[;ezBPL /̫ǦϷyd$S( -,I@g 8eP$BP(/s;嶚{xQ'|I$nйL% 'Y=g .@Ɩ@JN!YmR Rb&UUՠWx[ Nʁbݗpm2M%*ܸUvLoFa߫5@e %vY3^Ȑ/ ' ?ZЇčQ,^^huj BP(~ NgmqDp;*zmt"/>z~iO!7av}!7#V2] Οi+Z1=l|*)ɑ)B4GMc:i/}ei/ BjAʁ@zfB 㥰k6n9$ @?'G/OMwsF=lBP(†p:v\6<gVd**׆´!&ex!Mې(PLY'`|$D`Dzkj蟞gϴSTdz 2u%K)BoTD-Љe`xe ⥡xN֪2W57 Hɗj!XڄLm> BPVmmqHgyç,H-Q4/wb~CqDs(S0A$Pāۈ!mv!I8YQ* P{wϏpjpQ,x8R{#%azC>#N'VLdIxmr Kpuc;=F]= %9Y! jMcL';i&Y ,l>mO> BPX?f͜κ9Kkw*3bS;3XuDe?[H" ~X՟ Jp}eՃ/G&_ S]]BV E͞OfP(AO~u_OJE֐ AA#հ8Vr߲M) z;5XPX;[:}pDV?Y{X~mW( Bx19usZa3GD/_1p?@֪"??rKpG7ͧ*G*>߾Is+ ῝l0'?\Tޒ-\$HI.sm=fnN$"aB 0 ;oABP|mI^&/ D>т $=&M0Fsaf BP(/s:k.FV_W,BCڸϕN,t]vv_~k\h9\[6ť8w9!?ծ$KC ʾ9<]R-E:h5 XP Wvh# =}]jZݖBP(/us:.ÆN/׹rdl.7_.qO%_SwDuT$"a 4Ap&UhjžqcMUNLNx#}rE:a 땹h/.#~Rmh>F]G6VWˀ ŗxv 6v~,}]#*zdhAYe( B(Y/i]ME~xU|Ctuz^CɯHe_(*@6O ɀRCR~O~1ӏ4Wb8}|.<#2# [^!kƕ,ui Ҭ?7j-ؿa@ˀ ŗm];V]͖  r' NOTP( wcC/6l$x>dY6]>* ѝUj'Կ0K?ˁby`,Րj;93.4CbXLx).X*@w SUF1K%E%…-^3kWa! B%;)UAck>8$,u(HhaKS( B|)cud|֋lu;2t$ y'=R|¨SğTeLBb)yJ,w |q|VM8yt_c~җa%?"6d}ΘYAH9}-t*/ALߕLg3bҲ#\禩݋BASIB\kuUP( X7n.;Fd䯮yJ}tv[0#'#!FWCO`r<JҐ'`RxY15,ˌ4bv>B({1svj44%vwrVt,;l!W$XGK1atmP&+ ŗC9oCÖ&'S# 7ođHgno8yhN 8BP(kr,XИ26Y^ pmV+djf%,TIN$ u}Y\-c_{}u~29gxsom=TK'5kJz'cpmR~@m)kbΞA = oex/DP(Ee%沞枺&1t+yw]ou d UHaRɑBg@}$,CZj1Yv)NOG<r?'ch ԎsJj ORسV>rT`Na˹(,{:N5cYlۨ+ %]U[}kTᄉNJ¯w#ڝNhQL׵}o_$ Je *뵓 iXR>\o^d%W!`{'Ck/3ow!9>`9Y.09ar4y9IZ~* BJp֟^.y`0ZWTdSJxpP(;"tC$VD$, C5|qWtښ)(L'8} N˗{_izΘZ z;\}>ɒJ X*!⃩~9^^P; BôZ~F7pXZtWjP#xηV$D%rp݇x5٥.RAma} {{C3^{g>J`QBP(֝lqoSE:/[kxK}@zYׄ2(KdQ lRIؗKK\3ws7ćH vYu }vLKw3 PIqvp??NTlşb[ȋyTOƖEAa\!QIOAFo7Z>?ԓPhkmapG"uG>8޿p 5> WZ˄t6${8WJe#*u߈F;LH݋Rc۝i[89ƇS?>+C BPl6Gb hm)]֋Lh V j7u܉2Wκ;FOZC{\+Ñ%ahQjB|YYިI?9f L9MjX{7OKUO*6Y|*Yu@^Vv7;u84}˶_8Oһ#; @I1C`7K0N黰d[/*%FmރE9\JeN>9ΟBC BPrrX N7kW,F>54 lWʿ)&<勜td !dL@yO\@)}AL!) !ZdjDcƺT֨6z7:8|ߞ)%X@BP(6n j&&i\.}ȯ"e[G~v!ϗ KS)^O:90L_GwhoփNjJѲޚʖjFH]~:A2tYU(^5t= JN忛ګ>"IǼD}&9"~R눳gŕnAԘ9^S쎚DO6\r+.Jx`A:1w2|] ?>dDBP(us7|\pX|6]X(Տ+֡:-:U߄_cAo@@dbc&6i  g`)_ ? ŗ^ flםXJΣ)>*a~ Q-k%iwX*KHζA |gTxп*}l.Fqę]Z[/C6*?!͎LT!=pddA&D|'Tjw}NOS~+.p N녫P( nrW'W=X\:|֘CꢽK,#L؝Lτb=Q$&cb8{5/ ~wudb??|BP(/gvhl<^H9WD!! ڎÌ4Ig#e3΋ds2IĶ QlbĶD v1np2(dvBP(^ f%^yG뿘rIEigkvP(;!-ϑa!Oi.$a]Y,Z8IR( 0&l=~f ?} [uOImH|/9؛[an(߲t8RPغݷq/w+}[  9g4N, k=|.4ĞP @7q/[7 |HJS~!!jPICtѓ3TWI3GgeƁŏ.}]`r:r6׋\P(l>tg5^,]Le-VVj[•ʞ-o}PAf(s鿍 VRԏ%I9./s(_6&S̎1 %r'Js|{s4mF?2:I^T7\ s⪡ic.!~$={앀yI@T $toh.%;/B+mE\gPB}QhIee8%G1Vn d"=ČT3:~Ó_bB} B95\`t~Xڇ!Z6 >Dj>;Б{FKϔ@C)M?.H'L1ϡɿX5,gff;?rR%PGIkK?$ '~A.'ST v{\ U([߸·>rO0ozQv d]C0kgH!#b2Mp"Xx))󍹡adчˋ)j'qʩxR8~smntps~G'vrS7 BPjM+3r?4 \TJk໴ѸιLKJ]_و޶d7D=ᴇviɦ2 Zɠ r2Э/t%g<ֻ%t:z2+"w(?4(NVHE=8* 鄝 ɣBn yY cR_ \UD2n}dyDsbN%JFOz؃оAzݏ:8cQ( Ul,gUUs*ZÖe~(鲖]zǥE9Z[}Q{6z KhawoWxܒٱC%{hp0NuK4vʚKM ˺ JPlexlap%ȿ@^CЪ\ckcq^V5~[;~ %VIW i[h :0]uOq/P( j6pg)2ڤ-*\mQ&,Ƚkj9YϫNWպQOV*'$ Wid|B20za@m$\uz+ibRR_|26E `7v-\j>=Ƀs ?8+_52eXD ق-ȅ9l~ 03DlBUi~{ֺTD;-?J-E ã8r\uUxf 8GwS4 %l&1*QCR: rN/GVS:m Gd/0=pt^? ŗv7q{>M%f4> @(طX<9),sslZu%&sN(x$q!줡ᕳ6%)' kP+&m<1Jv+%m+ F]5m;x Q( jr5v~Y]cueLH̏V?F.7<dn.٧iiYKB%;3q^j=\W"ŏl4ʲL[0K|@(CJD✆e䘚DnRAlu_%a77M:v/?As{XM׾/w)M1=gOOMΕ|W( 6}l*?q)ģ?@֜\)Q8Q/EVFvFh\@mo?ٗ.vtIں qF1QDHICKWƭ>:6~sjOQ( r521mm$bQ2˛*%9t}P~R'zJ'ߣ@NNM y#LKa/,=#맥i'! AnNQ7/6%vJ?˼n `l]\_YxMKu3t]L'za(X[7p{[m@;eߏp.t g+O8zy2;Y!V6NBv0`MvJ.DL3޴ٖ[=wҔhʖWGa+ CH$! Яw>PUu*3sA߹}g13+ʵlNwBZݬ"muR4z |K!#F1bZ*+kU݈9 @ПlV^SLz `aU/{,V}pК?;./] L]Hmf\g ,?sdc$rV+H%όzܯM__+t, --3~ݻ YY2Zd|4. Eg ,+etyJ`.QuOXJ P6o@ Z A4 @w桅q(QJ02Xd1Ʋ*!a]J?)W_!z ?SZ crnJ4wxp8F1bMĪ~4nнWA-m^Op̐|%巉]7gO`iS] @ r@ dCuB#b\Ȋ1;_*lY%"ڽϒղ`ҺScN")A=B~oʟSɠbr>ٗhNg^ +[y?!OYudKdisBx2. C2XrliK)Hg:" ~?3`ɡ!=*؄b(uT/[dhZ s^&kR̿; v߸.0J1bĈ#h"Vl-mu6)&f NsN4BDO4x>%'$VЉseDBNb<(tZFwQ~ E?r*#h̻Z.L2e2մpM %unk<1c ɇ{%p쫅xV|c6 o[8| U*ʒ]ЕĆx}3ǐ ղVzltk@[|XZg8oؠu }I8,*Ze,WVjp!Y0wa&>1ρMc0p+4(H-a}dWqYWcĈ#FkUUݔuH?-m:zD $RJp+L[^!4j E-"& ԫeXnqcQb,FYY§|)eRH:oLO7`JmCv~2cz[ e?:;kZ̀o g1, E.x4,4E/UV{w?l qPٵ)v歹8T@aҜ)Qf#!܆ jS?]ɸyt;&JPj tg4a-\ca+Q؜>2:Lj#F0sn$$i-_4DNY`UB;&J[&mHj9M t"+A׋2F̆sMT :9Nwyl. Ret3{ VbeR,jH&ҴV0)A47~ ;Lf=b ENp~'}KbAmoa;MՀ@O'h]}9qִ$/Ǜ/KZ`V39R[\@Hd=w Qh؄!N!H5 0ξ]y- ֤f)E֪b\gw?=Z\8"y#Ũݢ|mg?Z1bĈkb7(0m]euMl5 nO' RjOb,j 1L6Ig bMbl)x t1{ -?zZ&Ng$~z{u"vf.©Lm -WJ."IнDN[Hڄ?5`>.mj`{ J*uC0䪧zz^$3P Ƣ Xwܵsy9W:gעX1%N!A؏QY :V@]-K (`BFޯ},& \> )1bĈ#F/vfP_֠ag$Jd2@sCLDR0! JP0 EbpО#umX1ZIƑ~) +SK{XɦNgY K b&ge*f d)$ۂ 9Z_ ;tga9%O&84DH1bbeo]a HFxj5xa7<&+ޘXMr t;Hm{ WR6OsJiI iٝnAvj@k͈doux}8c[= χjNf$v;]d#d cNj#F1Bd"`×كfΞA:Y;/ ^HeRvPm-Cxuݿ/Қ8*Ss`#qe&^Nbq0mJ>+FtC 㪿rf+C^c\rqEm^Ȕ{ %u}2Lq:\[IB]eX:rUWg@R˳a3L@o 9 Fh]BM{)~s?eO#ƈ#Fԍn7LwآH2TfZɲߪ'  R7f񗜶Z]ZSFI[ ?_ dB[ ErUr2|$\%DPڞ"QKQQst ;a  Y_g$sw?)Dr]ΖejOGX-W;_bl+ S7~nV4hH^W@Ӻ2}7@~WںZL_ ;3bGb= Lh 1kv1v=@J# 93BׇXЮcAH 3(?(OuMN9ok)99y1bĈ㥎6¦nT8Zd>`1-]n Pndx,@(Y+l1f и12X voC08fԒsҚ~.?xQ W'zeQKlֺ/bȬ!@$/u^.|X$%'o;sI;w2=|xmEO8,M1<"s~.^p;KWJ,g}s^ 1YRP%̙ Ì`hXHl,`Eٙ^Ԁ«BͧI{&N ~DDL 6о{{|oOTB1bxcES{}iN5E-5P%nr~lRI+!qfˬ&,5V_VM@blO4*TbBT/ sUD*y5Za~pB\(ee3%(aY^FyX!5uI\ml ш%uK1x3ŭlblp`nj/&x͘ks*JZMB[d}̆3x#F1^zT]&flX1,EnRqqj:\j2 ש`+B^w/Z1ݷX'+-ӂ4#6tMYpJ bX~$h6^Y ѠsĔ{JE~U+ŵW$RP@O^r|fYJ c m{;E$ܽb19/=a9]at2fWi_'v[x>D:(UHF Trz5M_gؗ0W{ yD_eC,W٘,2dsίaxF?2 F/{ I+AMJ'-}cp6˷׭oH.t. j4F.8GW." !s1_wzuq_EI#F/m1EIMn7qIOXwr*'q)/yV !t{*d7hnZH q`D|Z&ňo5}Z^EnUI+R:]p &\%Ն% ,':Sl=U*Q@#TIO~^ i\&€d iт/q4Mʁg[<b,ra|GLΦvbAX%FP=D ﱺz3T0= QjƝNe\QxZ[W$ K=i0&O3$)aldӳEټp9>tFb1Ye*0NޝZF0f)3sP*hgjd% :-BK~⋾ aݓgˤl5X֣p{n<5F1bTQ`1&s 0wn$$俶{dyh4F(|=Ve-䛐zi?'vV]CE$T&J1n=Dw 5 V>;k(mmEWJVu}NN\%jK؇7!!+q q C(>;'86[Xp9 .0>ٰ4I h*c;^ҒCkρN7K4ľCm2*˵:irCSԖcj]2czi MN(%f\dj `ՔROl*ϥ+YfVa sZ-v TR}u  ڥϰN1I{(PrtMn)r♵ocU;F1bx9bJ9aR7.n$OhnBy}b5}5Px'E$&B=Z`-¼HMҩbB%47{D)J2KjNu]W*(ܴMH=7K~) tJgEɲ'.Em[E0c.2]>ogZ},u_hnژ<0ˇOqӋ9%%&co1^hu8z{wC}icn{fOIg,Gf|$>f /N FxX80_g>8+9[r`T3]IWo bFqW^ mMEԦHoaaؘi_mтj`K2nsfu_o}Nqǭ1bĈĶM]i$Y[]]7H>-ɪHRN&gԅ"5bdst#H2iamfIq1{$ $(om潤* Il ē.cg:*CCd5+X~2Ki$'5)ɵG3{wKaPV qFXV> GҐh5_b1/嘐{uẏ g!MMN“>bA1bĈnbFaIwcmW$w\XO7zt%͏S(|h R#m.WLAHXdn`\"FJ}fS+,bٕkPKwFّF6\+Av@_yj m!xe~9MF, +5E%4dEg}̆ N>at\sbwpݒ lGy26*'ܫ'۸?|RT0elX\GcLgxcd2˹ `71|>GS$l.A^ i?0JPcka^ :,v}i,ol83&'֬DH*9 g~ g/i1bx`7$kr@/a`1销[r`fW 8gAIGNHuo\y4Agi$ïb@GL: tBAH|7D Qk!{:{*E]^}吜/CW +kQǰ߽W d-c~1)'rՄc}GC3j~9Vq+e2ą i3Y3<[%O?N19?c{͊:xV\<bpV`t,pX'{MFxaM|ʁ1brJhk00|6Dd*Lj#F58¢nd4n?,+tfK,򄔲͉SU1SZ2hHF_Ёl X ˄Kh7d:l1 jXQɬOA#.َM{'s86z`I4 ZLࠞ[iyyz^dےiݙ'l^qf%ǤҼ쿛?=κOŘ1X O&|brm%c|tp71x= +3 ,d \4D=&%)k}'<殰ժ3y¸0a<Ӌ 7|vY\>Y3޷hIKUR%ʲWhz9^o"5Gh&4TO" {D#F/j,a}X9a8_,{:յt'˸ jHe$@ʐ^,R="ߔ@Hr>]$HihZƁ-ff7ڪ~Fu=) |u0琛@0Cx5CO/')!$&A|F>)$\V~SβzG睡0~7LWYPZ/tx32)}=wDRlY˲Z5re)x(~KD+6Ul,F ,Lj#F. n5h2:/g:E>^'PYX!%ǣfZ/uF=N(lԆ+"&hvB1g č2Pn:\GmbUg}&# J`͂/=~ m"R[1<TDX XK hh5Szg껤hɎ7%qS_ҍltp稅i+ONHWuWX*dm'33ۦ*}]LNDZ8F1bpQ`/-/bIuSMf"I_lǰ24}fsHQP  ?2־먐) &i Ų["O;Dm i/;!V{N :vSV#ڦԣ;$4rTо6C!0pP}"e2+|Yy:HIX0!6!^'/=LMrIdXсK@O{n4(d寽J8`EW/FS e^9M kG8Y?JdS Q<yD]g3;f6tABtA\R8.2|/p. E{yF'CL~0-ˠ};owоר$2n1 DU1-kROPӸb{kA|8cĈ# k SaP76n4OmòZۿ+j&zl%~M&ɧ4# p-DUdi`нASBc II3AyDV2>Dy(6bK*0рX/K[UЦpf_J cF\ICARPd|_= ^|P+go$XE ݂.r]2_L0|6l(B!IX}mI2*?[l0XDY\o|MPOQ9<,N3LO'(/c>>mWZh$z+m.ʖlYX8AlZFrR*g,>Q.B1bĸ$A}q4]V9q,Q-W=sP_3`rZgnQ{8r*iC0oVb<;9H,Vj0AxWسp3 MRPBg%99m|\6CF2ƀlFjL.A` `L7G;oh-ZF;QǙig=~_#\~kv`8|3Llam~㓠V|{ J{ءogkatʒuR >v6Q*T׏SٓO _E`O~twpACJV6yX.'ے-<6o Y."#&t;":ň#F#SAM>d2ZZ~gkpby=tE)>i2\n&;#8@/ز,)pKc|?Yb|Qٽ:HRVQS3[$NN|G{\TBRԈAJ{üOF\/5䘡y]y"Y3^1WK1{ u$Bk $<(uU _08lsnK?,\hY]?耚TRZh]f?Un(vZSt\\ ?Y.'^j_6)b5;c^ZRݺeT=yn., WO4[+1j\b7c~ lF0F1bQ`.h_M7hjgp=t"/_=Ձ` J , selҤ#Asȉ&ZV^ W[ bvK:]K/( TM}J^J!$f>k*8snFy5 VRWY 7n02Q`49;=0מ 3~AGqNݣ0)KâTxZ &% 8b%ǫ=1Ui7q#;+tLB%$[:J 8_ xcq4p~k-$]G%͌֬p;w5 O ō>ufkMk=3[09Ȍ4nWZ;QӋIbĈ#ƍ%*l`>1_,dP' WJ]xmًp3vK=ٌN~4 :-|" 1v=vrɓIsl[!0P%؀m PJJ$UY(IK8IȔt$V= 6cRa]@SŌ,IEjdY>l-(㏳-PT:r}fOuYP%?roW=POV=\;pbr1stӹ ؽw;;͒y^༒ Ё,-pcb&,U'h4F-((ƎEώqqϘf8o]t^i"iKZ'd").4LI0HYR=g^k쿶?c9`1bĸq-Ӎ ~Oi[Xjerۈ(F=YU *WP꜐tX3~5Bٝ57{x'qMXw_ٶImp+p8ukԶ}6y!A(*)<5&Y 1j9=Ԭ%RgUyZS>ۯl?l>$f^^u8(8a؃@{o{'b8v N?Z},X8.f VY]h;.)KٯcM-Ȇ!(~ql '?qeͤ/p6?!8 ,mq@2#ݯk{EUrHم|Juvgƈ#Ft5qÛ~-o<8L.ڭOg:EX-W,"ZRJtDĶGz>O.u憮$*mQ mjrPv 6)wԙ X>UI밝U`qAM |/ aՉFXw:h$ʧF; #Œӛ{Ռ __I0-4TwoϞa91bĈqZ[^n5?-~-_ $)jn\m,h^:nu댟k,9%K 8(mlZd{<]onk56\IQ)N5aH˞ᙂسJT&wU7q-xI%Gk\flηB/q̲'INJy.צ*΄+ ~dExTtZp:a-]p@%Ns Q lj jf{&v^If_.11rPdIsupǽ J7f@1D/Īyw=xˇ VR=9y/Q̿Y.\_&{"M3T6(Gjbb>wbK/0Hs&|`xcfA{w'#\>`1bĸjPaN7?~!hiPPRVC1ќ^LAi>\IJ6&&yKАrZ@@ ohSFQ*7{wI`_@?miMW.3Fݍ}kܬ[3my> (3_WJf2q>%XgH-.( YM ktKIdAW*A,'v&gv 4Si zd 013lHɱkaa5cᘱs;v&7xoYGh JIgPʼnF>zk7'27AN]T蚆a@fFˁ|&շٓ/##KU!/NKmߤ;Fn墎[>\LDoRrO-]Vp>j䬉,:Lj#F.SI9(B,`1YeL{]I}VHrxz,RV \iU=\O,ҔęH2 Ufq>ؗqı<v.Y)}*\5sBU #e R0ʠ?j1#06%{3؟Jϑ}=G~oSs'ӟ [r .&+Mpn2)pkG43GgXm,&dX#~3>vJ4Cm`Mf |f;Qi]oZ$n{{o7Uym[e~@' H[~Jbu/%>/# Ӌ $4 Bȵ^%- [Ѫ w{|Wd KqIJ!\|:˟y;e?6#F1nHKl3Z )($wy 5u*?t՘t 3I#P%.%13/muΣJo>m{m^z`QjT\JDƓ`M^|_B`1 'Aut>-ˬ*g3JwEy#3& :u;dIp8ŕ:4&tI ˛zM.hPPbiؕ{4[ժ7:rcq=GI̼u\PM)q;k8sx's4M.M^GPﭯh$P^3՗%pAvmomp2>83kc;ώRsuVa$,ܠxhÎi$c̫ v`x#cĈ#ƍP[aM/D0 Q/e5h' ͣT$uB`D-ٳp@@F+jD U{HR`;6{] E3±"Mq֠4K0 d\fkgU !Ke"'M&f p17)fn(lOG/pM<5,KR k+$@jaPCƥB{fUA|s,0<ُ6rM=W^k@(W~ &W S J" iIt#F1b\X^$I>ɶWXSzlU KZ#uhڠyHPud `$,uLԔAnb|6y4bl7 [PH}J׼aCaABo)r, c|I:,#d@Ngf 99C/[8ޠ.v+-[VsL-hjP[Dmo8O -hw K?k(K+UDWSYk A6`θH$Lk>xw191b]bpH^Nʳj~b/Ta =Tɖ s/* KJXI0z׍%ЂvhܱW\xTZT[d f  N'8&%H0(Ar .Giu83_L #N}{ae?,K{$^d7Ւ~MH;%j 7mϫ:7{XM<0=];~8 c6\*ݝF] Ħim%4Ϙ}P56zʒ&rgEݿIٳ5p[m9|W =W+'5m=K.bp1bĸ!ƟSq$i_Z{iDx̓T8Ct"oD/:0Jx { ꗘ)"Ru]\%/;w/V`{H}$dlA7'LںZSi+t$IIm0ό;nRe嫄 Ԡ e*a+G]wFWiRub {bU ZV4dLʤ1+p ̬dY8)&8]Cqh[s@jw'-ׅ^b9*Qd.pH@ ebthC=m/'s:EA|4bgRKITbv>7 a.Z3u{\JȚI fE ~r\DǸ9Q8^||y{;l]VA8V)\^U*ɥxfYXJa>D0F1b\Op [zImü1 )=瘜L1}@0 m(IJ^YfEh#bfJ{Lזz}OXLXqDKਏ{, XگL|jf3Ԝ}@WkS>`͂L)zYU9rb Y8rXH2dGC$ W 9b.TKsz CEs`9)ф]b^W.m^9j,.Gk=N3 8wjbm!ۑ)D}6oV3yʘ10zZL| }TO;wIU'nlcBF{3k,8Tc4GϏ1N}cr>ųJtf߉[b'hi%RDc:jbpᓨ#F1WϾ5A^q.\,Whm v,0X\m,O):zTy%yQWAh]6;Q' ~k_^F0/=t>5Jκ@CT {mUFhJ=3 QY7ԃ\2(e* < N tLU':VAྟX2ŭN1)HfVX eRϕ`X! `O+RMb 6`oMQ5!:aO کmnGɝ@Qwoρ)x |j %Oր!%FV?7h @i  S]6C/R붺0x}Cc1S ~ǝbl^[>"f'jBh$Sߴ *Ϭ(nWh@bĈ#z.W[7)0[5df\n3d>Od\&8B_CI:42k%s^`]<4NTc|ؽ{  z>Z&(&Re:hI4}vL.X7^ϼc)l]A3KF`WkA-8 x HAAYwL`?VaVWSZ0Jw}R,.ռӟq 9ZnKDL6\'yӪ昜) 8Ğt'?9;. EUٷe[BJT.9~39g^EFi6ѿ5g[Y#F1$HRo@ kĺ밚/1>`5$"Awu?򘁲*?oi'dgYQ%Au B-?; =\>b|c|F#isULtɚ,y/r\׍bqIls/\SO-TqD  ib6 -ةIf(Y,w}N'8)@ʜ,Ӄ]Ti. X ABbd_r֍ژu'6W=WQfġ#{k~ɲܛC歁]3Q6~s<brQ>kc}&5ɦ1m S"eW+&i;Eӊf 1bĈ㚀YDL)_;FV|֠|}X>F@~/&դ-!J!I ǣ&Ư:PKҹar:E)\h fQ+XÆVM4Lb +VS1g8}ppZ~frQhmmwʭ }#E{00Z;$䛖*JV*%0 i5U^sen}bs`H0?YV@.JXcݬjAn phd]{cArf,5C_P\j \ @`lƅxm&}4M<3jf!RP6߇cj|ŷZnxMh)hh{i=@|)ň.>=4}:FB҂m/ilsCiә[Jyӏp1bĸ>e) ,"x"M+?n %^=`9Eca)2;OJ9 Wei?(H63Htp_A 1i7q7{H}:B5yV8 `L,XvN^#YvRs>d|W# P*#ɿuR2 ˲O_s<+,@n7}vouZ0wy#AN \I^*g҂,&.Xp)McIWJW8N+-v5IDӍ\ie|@ Zs \A5޷7Rͩt)/,w$*x%Q>j S=]<#뾷d}ki?qXXK8TMFhO%Vg^.h$F1bfUXRoXYjs*C;ٮpw;h%6暡KΙ߲ʆub0L*^W\iJ.˹v0>c|6F,a$qﷻe[2JPcrt6AkV* iVFq˖-8J=ɹɮg/p `8?8 tiw)Of^ﴱ0ݥth^" g(I%ƾ&`(j-k/ HS>CFmc Xn`N>;"q(1STn+sـH/5pHʈ C Ycd$*Vo$bD:OW{"Y`n@E>ca%ō i՛{Yj{bzǟcο/b̧s>{ (e&LCe ;%h44#F1v ,)7,FɰnmrD]]~9~|hǭf$E"2@຦so_5-U,fG1 2&P1ֱ{go%ڤ5۟0 [S|5 y|D !ŖS³GXL5Ypr9)@{[8{`iHZޭd%( V&A~ri*̓&%& 'F"}0Fɐ㍇a"16;@Ws .QF(E6zA tJey_vJvf78x;=JW:,40(a3&-PQj F2AHhxY+ەGO"̣pu6$xHJ+P;x5{ZL2/̓CPAGD○I0,NX !GnmbbBM cz>g#CshL?ࠒ:ETҕC)'i`c^wĸ|zG͗8 ';*f4څZV%RN!J@dV9fUӊ)|K tT%vs8|}I$y?Op{)%;?˓C$׃PJ1UA5_C^um1|ݰ }СqM1u|kckV~vz_)gw[БӶdϜE?ys(k[ S`-C_e׍+*=Mdrhg0/xu*$J?wjom1oD>[`1^`;*#TqMMWz'[.3!<䲪nQ2)VT&*1*FgssFeWw?Css̃HLԚ ?ѺQ $e#r;+UzklӌY_1uIh׎(7/z%ӸoaNᾜny; }p'<}b%!,3v塁փ# %R[P0Ni24bμkU;_Rݬ[ӓL?y)X~X2JXZGr!Z۵.$O‚otcLqcSisy짣$49?vIۀܮd>[' *pxʁ},:gZH;"iZ/ƛ#F1l; ^xR$ 8O{~-O~mx)A8bD.Iue82KHZV'+f] num? t{~Vp ,讹뜘S-s5`( بtZ e2P@|r:_j[U,sEX\$D{tܴ]dy ԕs%?{`ڕ =L3m|_Wn$ 9_*fdT K}/K,gK\>c5:@N hSQb_ Tᶥl $hژBj1bfr-:^x(߱ep^gh6^ 0uX's,>~GO_J˳t5Nn0z:8DwƝﵑ$uwR龅Jm.Zy\L~RGRKb_2 nմ(`t#k0/9[E׶4_܊Qo ܑr%Eh͹'%O߫jtznIm2;.>65RoQJ.D"Pޠ$vJ-Gr+5/^`:#%j-!P#xF$=S'c, x 9*'8>;Ҁ;*aeK$֟n^C=;׻Ly1^T\`hNy t -i#O1WzV킦]`.@qNDd'א%՜!y{~jKF .g`rGc;E1µiɐZ LQ_-n/]:,bUyx5ƄjO͵&i F\q=zE9W0Lk 3ƽ.WT Rױl]N u4ul~+qVv.E^,gn:UEI8HJ7d"=A.)|Vu4Nd#>$aKHHVydڽ6aa %!گ '"RhNy%\])0=W^C#F&l(Ȝ}M)NdHUu'O1ny|hV&6=YyC:ive7 b;}4,A9!HF qFO<1{ Ya V?\K-ע Nn1Hs;O-zܓE]LEM lKVԀuB^R2/U(CMw6j?81I2X`yt|,6 G<#5l5{SS vW(E$sى'66N$Eu)Rq}0!hԼF $~_CV>=ߢ. ,2)̸BTQv$@b-RGiA~ w~pg1%%RFgWf |Jݝ&ۯ42t/Y1;H 41'HjJI$-@\G b5Ptlz\My y=JT .Ms#Tl~T5˥s)3%Wg ZzwdGIz,E7a Ks~"꨷j  8F2 Z-J%JcLf*/=q o*˿wbs"$cҍ謝qyiJ2+Qђ&‘xw=S/60<ޱU\\a/,2$D^DZH'WNP8]kB~SiRJf#HTr*Zd~!GQ?''WN4;ͬms:b*V.ZZV:ۄ\؎%hAwK)o'keZ|(}>U3\kސc ؍gjXk=DU(O: #22T䚖9Grb:gciIƬ 4_R{U@9uNs6>k욓r$ --~kt8ƭwOcWbU\WU,r/7$IaXd~6k/42ó h]SؙCb(Z؉E,|_I0-->k?]IWj-!7׏qz  u`ܟ}` vaVן! O SVѿJ<PV@ "푟N}~/=ӏUOqZ!+RRj6rƧ̤b.5`IZL:%*2AV6[% {ߜ=` ˌGSt+뫔#ت]29ͅw1#lsݿ(Ng7N8 `@@@@g.@o-K4i63{8~Zoz*ջ4$H4cvfxA Z@eQaM|4nx\魕&^kx?jZ2gFP=r毹 4U 3ifrG}ӝw))~w~ ĭV4sn7wklht ku\%Lk* $l"IRU}# wq;*NsI{3#ψIü=@S;Ŏ0特>P(C)*_sSy'/W$ >W "oo}tmۻ7°7 cx:7Y"v>\ez)|gsȍEZ뚐&W\A >n休rD)W,|i^tZ;?O&uڀv=jc+$ L $TxO&KʦJ$WzMLζ1Oq߷ ^͕/Rw>cBxCSCeCA>D}ݔT HHȤP{d,ƝGШSip[Ykg ^=+ yaF6-t֛VJ:ZCc-8LsRP$;9>xwّkA6ji%ҫ;qƐRj= Qt޼H3ӶSBSl2j Ay%\E:o-hb) {uNw{rɑv_bk5Q0w̘d0JbJݼE)h:Q6VNt]߅Hm-~_&` 38dDԠrgLνtJE^FU}cS1,Cʿs *ê(C-wn_wNp{a]pDV/XJm|~c\m%ң#ɽf&NʊPT>Vm=>G!87U^{+U ?8{3z ^la2Hr6 j{ YX9ODP?s[; I'h59CsbhAzg;{K?)GƮcT CO$01ǡw11O g5'ʫk*)qi;&Z >Sd TpDKxW׉ K0F}FF~ i \6^g[x>;N:*Ì)+Qu\\lu.tRRxlFd()l:W]JFS+Cwڱ=yN} e:q 8k'XÓm\ L"U6›&*[HT/ V! &% 3D;\V)GL~)Ε\6`yg+/6T% Xa-D˚wxE[J$BXZU$y+`9"ԮُOC>< 3VWv/m{-b[}#bPJQ_!5݌R#t8Tz BY$y>8; 꿋\Bpܟ>n.ޞ9WW\hd7[.է#uB5óq9س:PM;(}ekK?f )Y46KӱuFNRuQ = Ev>[?#5ha&z_:< -Ȉ鈕 [( [\m&3[o EED?ylOLV lie%od=A i477ܩ9ϴU-E' MA(Lm${\Tr&В  ZkxBbӐ|^oW6_ZxѡZ&|Ԥ  /tL?ڛ\{Qh% KY{+Y麟!wC< %g_yK{V\A/__CgkWIt/GφCcevlFB7*4!/FϙZۑ k2ˤ +8+J&%%[e9 e]+WjxfGwO"LBWV7?e?=s0j3ʬ78ΒJ?%09X c-'~V5/#F!z/ {dz/❹J~ϬͮSLG&MmKN4^VaEuyz/X 7C>hD7ZwRnhjetQD\ EkN;/ՊI'[FZO h).N픦4W+ժ qs$W[~v[m<|ǻAy泫x緰::[1Q6H^hҦ+Ke'{! %jA|REWwt¸j`XR2 zp˾JoSGwKMĭKj碬e/MMۇY#R@Mo-_IxAUz )^ܸ1糾y؜-RI5{~ǚӃUwXb] ܏ 0TKh2;VeGjwkgyJzo w&JI2k#X1D[@@@@@|\߂Z:ԗsџjl5s+F ,)^b'UŭDO~H)SK9*/)ZȤ?T^eVlr[*)!䍓p257c½w ٜ>~n ^^(?SEߣh2\zb"yCV*CIHMcJ#̞̏ɭ)y$(a!DX:a.)_՜\Q1;j;qQo3]=sI@'bvGT!Ó^+ޘ!# 1 .;K. 婲5Y 󨚍[f~J %:ɯdUKZ\tِSU2$hBgФ'X8As^8X rZmrB˸f?N|iZ0÷йWZ)3 U'$5\~;Fa^ DGTvN.M'/UqqlcKm[Y8J Z?DZe\^t?#EdjlK $|l}ɑ H3R#|4ؾrdx/ph>e_iZI6VwVhf!;ϯaj;\PojTH^E1{9"S,>ܘQ|l_3) "UFJB|}}BۊG)+;EP+w2S1$ o)/3 rMzO2qC~UK I®u}^R#OrMezY|>mLIƁ7z?2ZDs%$$D8w+h?@c-D'Zl]\U*A\׮ V;,\JmU}֨utxFL׬h3M=l *Alcõ鿂80dDNFKWdX }Aj{qb:noo= #Q\)~^{g'XV+F'z5FT'"t.KW-}Gʁ,/?jtI0+xLZ l}"ozRmbMҠ,zZa¬ vQYNT+Mg[9{24w"\V5v9Dphe;u:V/wm`z^ WȔlD(yɤ&f"}T*T*{Qk5ԣ#g "8ZUR%Tm2~oT.PY|k S)[M8uJ4X'"su7R|1.%!y͜M)M_zV!ffvoȫ*VRQ;f'mq8P*Ɠ$>q{)ǡ̃9\ t7LfP&Ucv6QOAje?)EE@/rʌU 9lrř$@EzQamX^(j[la6o3}AIPuXzWK_kAt"<(/8O ƅJeWbay=N݊TnG1zQ7$l @lMFSq)n4L{qho42j֞ak\Qb*y<씀*5?*ޗ:0Ȟ$TV vg͖P$' B qPr {gʔTk843G:WjVEKVnVd(MzeJBA"ZڡWDe3v46 1^9RȮGc)op|4kK'5jX׾V +P"n AT.1d[aDl{o<F'+}d1$[#rϪM!?-=xVnD;KRIHEw6I'dúQzP)H~y]אM+'zvn˯]bLg5m% , .%EKTNWJO.'!tSd"y L??$<1`>k0# &NkW[J7yڪR:d kJv](.%n;na?TTVZ#? v8Zuĭ88ȆѤ$_P ,\L(64O97L>skZr?~<f'/vأW Ol[R}4ey)]Ek<w#RT K"*<1n"I˷_%U\L$ Cq\y#~;~~lE{;RcE%SGVGcm`3UuXl ]WJ/& a7cs|/("El՞6 5jr ã)p|lƳb9}pA :S vxJ碒㣄(I~]o|D:$$`$Ή2QF"LFz $aꏪU1ԥ_{`!7`yavt>O9|fϴr9jz6&}nn4G>GJX&*97L[={Ś`W gt2E a.X^Pvͯwk7P4'ْ2%@6#ԼXlu4I @V|zq>K@^? ܈xvioBd2c4^‹;6Kh-bK 4֚)4WeUI%"w]ݩX:±BR$=ԲK'K6Efk]О}M1lGNp7 ?Yf$N=)E-6wW ظ+mt/5ZaYy*BR}sU-uR}i˲15d[!FH :Z.OuIky4i>uI,k{'a ;4uul_ZdߧL;LFStۈ۵,ssgs1smCM ڒ Z P'x LTiEAoS J@ Z&+~?J-T?2wx=w l@ǀK~7B6zNKu\ifsM|uB/Hj3is!TDczo# I\9kңREX}<O)1]^7)H IByox -VgvF\  Me}ݴM4K V ^DIc4F/)D@.FҵG9IpAdm}(7n$S# 6 &Q\cx:Aެa2Ίz4Hl3kA[ώ![M4' 5 WA{ICy*J,8O$mPJ]&DU,>n5 'Y89Yd?ZXNF Xy*Ҭ=+4Y7I_’57<4 (JjMBg 鲣KqIg[۵I%43תzUnǦ3ڣA)p  i6{ynp1ܛ`[ QETyy-j̾{D궊db>[4Å?yKG&QlCI5戔{"m)>5^+9ڊ2/݌2u`J"Ɋ,Džk%`U[ϳg|}\z,\-Eb ݾv_At#k+# H(;;.#߷]BIp_nz? ೾^:t ?GKGYsMT(q]H}O8}IOaP<ؑ9zg~]kv-O KJNX0IW\R2Mn=(MmYrt G>gG2fm? RN')Ǔr= dB,1R?0:H05` <.)4iIu\APaȤ[ZȈW&Չ)drzT" ex^ )\ZDCx . 0̛ģiUcWzNjާ&a^ضyjǪ<r}֎7 B!Z "}Hxd{t"g?.kWMrf'oa 8Gyk%qG WbNHW0 `9E۰e\meD@{3Ff/@:mt׌zu {#\Ea\ƹ:]I#@zƟvL$KιH8;8ýa3L ;CM$<J!Hs2X .X{]v9HH镯R,U`JV,|RB^g)YY{oP.l.VAYl,y>V%xH+E|X>ID.T:H܄5 *TBeÊ"s{7pވ[1NO83 ۉ$WͿcf u~i5VBDs+r.)iYgװխetZlM3aLN'H.瀀Da\y#tRn'@Vѯ,v G>ǎXILDnik=OQ:ɛ'5ۢ<(بJ&f~/ |>sbHA*GD 5A%G 3ۏAem]R7lRAebH1-9\[B>I{Vr"/$ I3 `?,U0EPryN YXkfV3+?:WXnjaL lY/"Z7G3Ƅ<){X*k;3F1@\|cQ8ECXV/վފT:;_, O8=ŝ#()? "0b$[z 헴<-t~Qfbd8K%v{wIpd k9:f ܢdd۝-Ǟ{*sۉ琩KyD'> y%؇UlJ'@SWf>f&R_Fo2 `A00&챸dl |3E_h .v5n?WJ(̳T*Tyխ/\f~f|L+i;2ty?*\;MegK*l K?^E+o(6cN 8{{$]ĆE#<2=A$VQ7&xq~6Gw0+۹%7u/&);III9LVѮiKwjyZB͕LhѹD$Dr߬xujUbdIY~l6>pṋI9pDE"lE i;q*@-^3KHʢK,z% GV=NgNOM{ ܬh +aͭZ窒OܵengNŁ*W_j?( iK.yА&Qe.Tu '!$U ヷwx=ЮÒ)(SxR J7 EDa6-~\g$J"TO*J$Ql&/-IU(eE_UogyAw}lӂGR@"b<8'IA.y>.l*5e`TP 9}DTKe@Y+עJR۹rC RAfdn%D穵Ƙ1cp: , pDVsZ/¶\0ǽ0=syUy*YXo =VqPyCD!RtȬ|oS黧(EQ[( oWDJ/2u%K9:omVf?RO)ż~qێjF(*I4HxIw0]sTzan`80.5aST|3ҐV)7hpȞ`ĭ6#]ȳ Py :&ZTNj$`A3l@@@@@E*R&p@~jE؎xrA@RppuG1:`Sp,!rOUߏZ.0JgQ,5E-H+m1{;JUU1qž8Qbj(V*"M!b73MILm-̹D7ٗ Ah2,H]!cC2b@Ed8l5sHQvN;OqG3LDS7?;6^h Sk^eSyŭ$o@?yHZX45Y 4cAjEnHq"5=!$D m PPeh>{p3_p6@ 6m 龑G #$3ύDQY'$hӼMW߬9?m_\!b[Mo$vtBabF\IhHU-w?opѮ1e*@<\\5 W4ʖ@P\g6 Pޤ:^җPoTu"u{'mKh(߶r /^ΖagMڀEQ,BG#h#Za[Ƴ?!g=.XzOUS er&WtF)(Y%`*erPrւT&-<Os5:tWX=_d(&Y{ɾ)vXTf=cHĄUEw پ0g!z=߀hӽ!&BgRI,Wȋ̴IJD"vs`f'sf:a6V/uAQX=I zy/ufV__ݍw47t,F/ IpTx _]@;ggC=5nee$1s>Ov H0g1E$C_@ž~f7G*ڋ9-AA6=KmbK.;Qg׺X  o+F5 .v{tUwC5!Ht@FB/;L5pQI9pD>բu!NɓI6s?<|]#YzZV9<-1'Oh-F3ko2, z4⁄ $dBEe/ ċ,}jT{ u~F}^O:m*t.=2gZ\Ng.l#"97U,Wͫz2r)r1_c54ڍp4:M&:OťqRRRy\"gⳒ[5߂7u/ Z$&Ws ^?y&{#7+-"/նTUyȑ*.Y/H %W /UczboTo] %+ثeY+q.=^ky˜m/Y$}< MQh&%1ٻ_߹[0 tD?bK"ʆ BzKWl^cU[06U\;xjT zH6Yم,*/G*3. Aɵ K4|v8vI(9pD>1zdc?}7N5 (˪ o+`Ȃ(RnIk"TMgMxWd{3s)J{RsS8-_6-_̋ ?"}:kp.0:\ۑmGx.(f P~VG76 fwY.8HXMՄQa;Ҥ'Ub;{p/m YSp-'~_BEnl4T:LRQ}}sfgG@Ŋ}UJY&T{=*m?ۀS$VU<!_dϋsK Ջ:;w0LlO(Ύ85`Ur=$ 9O@?Yf^ `ț+&x66YE-wQk~i]H/MJ*| Yw5R);,}vr ~xL\Ģ. GsQ@h'[9xw}6KJfּ,ڳ}kS%fyɳcE^Z2HþKl[$!}#`~-Zg| bBdX5n?Ji 2C'+;F{On- .Z~x06`)foM UG%̈1!xyKX9sn~s5SZp.;]\uD+h7Ts劣f{HJD aCXP.h-ioo/<ꊱ0꿔I9pT>>X01F'HJp!>g Dč3] l%b؊#KIaQ[ &ݝ~^[(E]{b"' D*1S&m='ʎ iB|mm+r0.n., `I08fir΋y'(w) k H6O + 켼F |qZm7~nX@x(/Ru+u7HF$Sٚt^@@@@c! R."p3|lпEؒ05&1nwGaC<&i*kyY'Jtd>2DUs;SgϺyQFdb%Q0$C0BT]EZcrr|ep抸*"QM&A=w!'0,"l@v("i""3fnm"NUWwg v^@܊7clwZA:ydd쫺k/cUˮ؎1kH/Iz/\D"d߅#떰 ddߝ Fc4_ z{;_\~.Ht7m"8,&+>%tˬX3\Vjc{I俚5J*U"U|CJbS+#Ӆ3#O}"b|lպlۻ͊'C~>(B̮7&^:mQѾxj+Ҝ?a/ OFػOl)iU<_)r7Xu\ ]I|oM/ÐOXگG ? s'*.5덥 nbp4UG"-eBM}"[U'2yރJOk 6Qۦள/|~z<HdAO^Zh-LXG<ܩ7`'{~qۯt:Yu_(eE1F61zd{e>Э`]Ʌx:$CynF{ߩſz()T6>>GrXcAFĪGū2smLkC|w{Yt@@@dg nGVaEpm&>},행#!ERìޯD׀`Իq8 {_Wۀ"DTq=wvz%\ 5gw8 4YᅯI9pTբyϟ8ɘzt`4_1Nw:vFs}V(G2™rU hqpݲaxBЎֻσ d$FK #70 hE*goY "&i:gsdLJ _-+芿qFc|) K8sFuP$V!yhyRfDt 2H:魝W6!0- z^՟YEniڡXݞeVr{M4:œuf<`:O2aO@~bqxnvq鋛IۂXguC^cmef]K~HVF,+>y$ܜ*(8*CEKb}P-ZL k6Kؑ{:ueR[2An?<Ç?x8+'Yq_U>x]n5U͑-N>LF)hYϙ#MY2A1t &?~9c _^C"ue.~,~wK!!^bSj:N78ypb@@@@ i9,zWR.&O@-~E4I}?F' {kc lO56S%fn9< C6_WBLԲD- P2~{lcӟ4칋Wu{Em$*runz):aRW$Xd@'35 AKL{%yS<!# ct tK?@JBeK9ª.)"%T&x {o`ԻW8{pv.XeuF2"}N{=JjL5t`HRLS_?t$kXԢhr0|r'@߿i5l0-q͸ ӽS O8w v+DRUuN7)"3i>T;/ :.Rrnr%-ibS\ZwmIAi+h.ڔPځ6eŹP:g?18|8pzwT/2\S~s{ºM3;{"fEY k ^fQab^ϯa]-PٙʢôCnsI5u08bN'pt8Ȁp<͸E@fD2_.¶@d8v,1x+-+&xV'\{. <$\@QTe]/(Uv/|5e,+ ո i .+p H"qz/~?J2NȿCx{buwL@bFʹYRN4ƙUt1{ ,`0 :G%%FBB`,KBB m `A`-a 1s_}UwG727"Ȫw?S]VU}G5u J|QuC1Eo n<ŽcY}ξ7ӺՖe=֚rջ֝&a:*lȪ {ՙ\jW w1,{} mG=d25!M{ע웫τrc'[2|mm7(%ly,Z>[ ZvN[%Or`\yD[}nÛ.a.斪sϋ-N(U٩s*olE"KJ%6W>~]:"6ʫ.`SyMV>5WPzufDYWR/[s޺͞NX7fδA k,Y|JCk9q|kEuyle*\:jo=zU9{haQk,*fcQgn͋Lbfާ({7Q%˲pNժcf[+,67ok}ۅa炼>O;;vݗ:u@iog%`R}U-jm}lM-wݲPTZ6k$zu*>*lq@{\~r ppj>9nx^^ U%\Ukx#W|I;\[/*ZwVd[O<2K^/\}vPoꑘ>*@ijT_ Ogl+[M4[+v KcqC@;|VPì_~Ua JKpkua/߹![ÍWveO܃*2_z<鷆E*<8m~U7Vݗϕb}H.kk"{5Taf߮iCH Y֛]1 riC=t:z,\01/ b-4ˋbp _μfKg]7 δn~:X,_;-u}gvKVb+ghY:t\xc. lz V1P)Qr8/B+I=+OE5/ ,ΖF,;/'_2(U56RLh(ݗUʨoXoQ[EVGժϣ_:p!y#K<`98'vZN=֒~{u|~o۬qp3#y#:;q()"xfh0¼'yd.SZy c@n %ɳɑɩsYx\ߓdP@\xۺ8o7X ّ+?]y.7v^9ehwէ_h.Z,Nihyxbۄ~c_O|&Zp?2:3G5i PνԞ^UuL_s` E[8KM+~s݄'frcǯJ3z-wvSrm[2|-tk9{rzeX[}uzӜKwۯҺKHJ(Kݑ>Llܹ<8џ3l昬< r4t<ΊsYx̡/^/lt(Pa_}^X\ɻ*oWe@Mw3u<ܧ.4r惭Vݏҝo8+&+nj欫zSfͦR<&j&{/O]%HHV6ȟnDrryۜ :ϟ9OOy@ k);+!D6wON[mٿ-^zCr C_XzmsU0Z/$-C> vhubnV9pq'r7wd }~}@x?_ۇEG`QL}2Eㇾl??#>)B9CGMGUWmtʀh"dWۀ:}CZ۫OYVU v#+q>lKL|*Y2kϚG-Z&jC|t$ކC?GkvܩZX #!hot7ո_{| \y壁l#霣n}&u>,|i|] )jVNA{ꭂW9VgtVM@t@)jU&_؎_d =XpP'[ !Iڇl0.?)/3|hSFgy!/lDMSji'U7аWժC¥CR;6댡&uTVKhhVM*?%˙$sIrDi7ٟH%pV>w=,p^%YZ]C9UڶۄuӤZZVu[O/Y*\^x߮\nWvF<@^ߐEnѩ<kUmVjf47 UK߀;O&Ͽ(6 T~7$iێcuwE81}OV(u~/3+[GXlW*0gnB[6/~w+CF#_U;P.zA kyf_ߘK3ɦl?+ݢN}>߻:W>'3e NQr/c/+oYz]4n G:YVS2\!T~+3rC}5pBg8Ȧ<8**WKy֭U|+P;Wo)XQyun7쎩YZZWgr#7$ڎn]2]d=Vp t2}GA A4?hÞcη3/\`J;< ex.`dp6WR-PЪCU;d9ԝZ1PݕY-⅋ɕ,/>;W*Lv_ݒ>']It)%ur]9Ƒl=?Z8YQa3UN[_8etHqmΞSpC;*߭ez0?8 cl]ȵʍwe̎A=)ygj_Gwl͡yr/Ԫ`P{}W_λ[u[V߀'"OFr‘5͋ Lbf` (gw2zQL&*@"C\pOSun^~v. y&ȗѹAbv`܅* NE07KD9oOvtq4΋BTO]~qBtϼ}-Y%LA^t>oHrc}ɍY>&-I^ O]5zsyXE(Y~ѳd;?-/ȹq#gmmVܴ֭2bSv%ӀIPU"KS7!HaI퍴lޕ̆~](מڐk[y3r C9Ah? TVvhBr`u{>e՝&aUp&"./TsUє&6\Zd}wl9Xl &3\sjsU[#(lŁTwt.ȜU6|O "țD3 6=Iwf2-VMy]5D"܋wN٬ZP88\ϓ7|#uZ6Uc:Ǯf[mC(%&1ֶEd/[q1w{kم^4v&7>3˟ܗW5 9ث3hϼl<4 _dxr`qkK+epkIbw\Sř VpO:>O74^Ykd&8>q{92ߨA_x&){, d?߻¤uuow"t"6yVxfA2 D2Od>I1(q3_l[9{ ϫמݕ3Jx./hVaMknJ]G9,[nT14ko.T+^pdPN1ِ/̥y3g?%g07$'P-}|uNIu<5n,מAT/2]Xl %?OǛǘO&i{:#wb]ٺIkIV՘zSvUU+1S fVP ԭVUaQTY[jZzh'*9#:se덾\L6$vFv_2gRwC])x&ЛHT ~tK\ϑ3$+vA dhtz$x"[oϑ~|(ȑaxκ:-n{ֹ+2@t\a؜xZ 7k.WT jYZj|.^G^YnGVo1g1ga$MG/~YmP'/ƹ@\KNّ*_R݆ }&J&ˬ3+KTNT [} pU&MHevc N'dĄ#ɦPp:2d?l&"Ro3+?8z"|X {v-_-WБ_3- 8ǪoN\g7(L ?4Ri?\vjU_t_-:4솀Yeӱ\6ྲ0q$w"LIxmqCW2x9Mf`fm-* ]&LUz ^WeY^\vmv֕jۊ۷&rDZ{fWlk (gX8?(;kgs)]tEϕ'm6 ;2Z_IJJZgxtޡVWS8VJn}FgAZV };:9?hSKpo? ,3F t8 >L&?(ߎ'|r-GX~YUkúVʏT̽=g~,` ~UⰺsSyWHtd%&3aV<8s]2"|ٽ//}<|\bWmu^u,兘WjcmLu#Y{-U_:[^1noYֺnQz:Oڢ[gXnW~ݕ[@#*|JuV앟6QdiJ9Vj-R Ƭۯk̟Lr~4w\Mfw]^|<;/ή+^WB<Մg suUtdo JZ[UV`}Ū&lrk>K*C}b{n3& -Gu+khZojt_w++ƿb+x5N_&ןnu]`EF~Y9$g_{2 ;d^uyÑ$WI$lU(t D}f0k46j[o+R +UV#veVn])?Zx,~B:[]6us^H[ہU݁*NUMSt.ĵ5z!gL^rk2rwɤ71JAxԻ??ӕۘx/W?yC^ձDf~yV"Α3[EDTkWݽ0~C^ɴVEX'Ͳ·8W2b um|G;]jVsa4ȷJ%E6YeZ1Xޡ#+y[qϣL.}`O^2M&y?w13EqxۯU&;t+Ge6V(&dQsJ7[cx,|3aWI;rV,+ W,[u\ު\H[{SU;뎯_UGeJ-JlyJ7MH M/_Vהfm=?m(>:/Xem ^ 9P)`j믮?g?@|\.o_2}2Vf_C~, {$? ;c]䥏\W>4*߿⶙nηk°Sguk[sVᥭUZ՗$bm+.WuV]W}m3!`g|,1Ӝ3hԭ;*vS {@KKET[4fH%LW3Z3a1Y^=y_iELD3sYݾ,f w.ϋNy%̢&j5o>nV_&ʱp&VqUR#Q\VAdwqީ E~Z JDCUe<.t|o-,;g׫Z"KT+*>4+XYv{үɳLVk>m5FExK}Jo &2po峿xE^D&u\V[h9O *׉-VAU#l 7;ۏUc\|[v[g?{T :K5W֍?eyf_&n_ewNVP9eUclư:ȪYVցbm.hHU~lE=mgv_LUnVphX 4кuw飫k j%+zyjF{Yf)vXi?K_c~hF\nAztդݸzoEUJMzlS˻l^t֏Ь V +֪PkmV5+qS[Q9. \[ݑoWgwpZYe9_+ZWtH\$:/}\21etn4|ދo'\ 7dY/_ߟJ|T&-Vι}"YCyaR*DSW7ho:*{onQ:KV +jb\J[ZhBVK;Tnu1S֢<{F͖_]Xؽ]kRux<2߫/IOx LMߗ(;UNg0qY\l]ؔ O}نg Mw@b˾[Z h5Usԭ7/~},V^!gޗHuyej}GVjҽ3 Z'Y7$h|f"/ed3\<\vǒL] /өlp]&T&<#%(ZZZϩ9HoE`nfXXλݠmUpmMx0J<+[Q!b F"V~S~էYjr{bS[&Kl?9DNo˘6GC & x-9MyoޒSotX}ܬF6l޾]جλmCh:s>g+]G>O-buWnmw%~u&?+W?s]Dol'ǽO\mQsWp8'S_-)Ʌ7o=%|PTͼfe V5vo|NXm>^B 쎺}Inue겳 Zz&afAh_8pEהfEa9řx*!_/?UƷ4g}42`v W |+dz 䅙J8mʙ728ЄbيfNJ޴tVY.bwmvri^q*[좹^~وZl;^Oz},g|bşnN'4Mb-ן4ߎ켼';G#O W](gN J˾q99*L/[77nLJr; -7稲E;M:t^ ׌{,3 eXcNckiM@!ƬM0 JuwoM@nfݔ'720ڗ˟&t&ɔoY河?,wGq3; oC̳IirjcpHL͇FB9_³J<ͨVˉ<&SFVzA#Uc8+3uS6膚UhFT&57"CG!ds Z}ž켺{GC%io3_pwDqy+p?8ӘNmn y4)r⦜{ӦYdՖe~Z%.-liselj_=+~Ztp%G}0~kǿFHxK0I~y_l8 ŊOo e1O7\ZMj}kywfֿ*"Sk'yVvǏez(4\^znփвl*OEi,/l3jz _$Ʊ=:b?evn6/gY֛ms4 `r8"(, OS ?x%j%}]*pvWj~n皖?YtȚ3 Wu3;haӽkO]N'e6d q2qܛ8a%Qٹ9@ 8Nox|ϓxp5yHοl^0ppޑ݌վwqN_ܵvny{"+/S!뱔݈"+~bKpnhq\r"=o$weo.@/ELgi;'72;FHx[ᛓ|П1 ?!@_.lȩ #9H6l=戾t7k\Rw}`ۏET= ~ܵes;uP{S>=\v+_d2=}i?Ѻ ?έuH7?;o<後)N'yQK 7PFgC9PNU݃*Њg-ryy9Jw>OF`&3g gVbg%h7 mHboKoJZq&3)w%ٟ=yk!΋ZOB{kbc80M}:˘a([A{2 e@>!g8E-%WhwbnuCQWmێ#uY}~fܙ4+$7d>}&tw.>+\p==z} [1/{D?gw5/23t{l&c4|SJ5{oυl\ $retޕ(,\Z姭8uxwt 7nnQeyl'+}f*TWRm,^*L XGq:#Vd2@feLֈ :p ztX4 Nl:b˰YSW~MxPf F?L݀dX3\גM2K/L'dfۮ#WV]#tq4+te߄{ϒ$_Gqzerc7_ˢ8~3tw hq~]DCNfm̙'dRd<7 A-xNm`5>6 1*|Kƕ)['~6_X'?3wm\$e+01d&C`/cu^ܧ1pu Lv o\om\l$}k2'a|wO~EW kMzd&3`? O3I'-S}c0K @{4ѷqO 8L�Y3t2 J9{2d+0_ :9O(_  Zr{b5N%48R655Ug`#DK8$M'XMv55%ax?dӢ:GԤqOÿE-~YB Dq9-} lڪ:Ԣ&5iߘgEʭc3Փt"Ԡ55i@T'?:?DZT A#gp3%}yLL2g_?SڝY­▢8~s^nT{5gQ{vgp+(N~j4DZU ?SY(0';S,SkLnjuf ww$˞qT?Lg84fVgp'q'wqlL3-Mij>2љ))@5qldy8Mm,nDqL9>ܻ>gjqSڜ ]˟h:qdycjISSMMLn(Q7DZsTfSCZԔ}djpS3S'QO\Ӿɴ8Apv\#LmjpS3[gS}s_gm4܆ަgpq_8'Aξ<XԌ}Lmjof M)/AdǖeT3ZԌv#Sk"}xsorKY;8`jDS+LmjmSs3[_8{0+}_L`jDS+ML (Q3ßIB(jCS#MLDqԺ5/3D#?? ?1sL1Sj}fj]S2c8j(N~h4/0oLkyfyMVf~25u1 zC) _y9`ִ.Sf}fj[S2c @Fcq1 yydphL fj1SiMmkj\f }A^ɟ _\k]u'b~L08:,=kjYSӚږCw'_\q!0Բe7(N9ߵd2c15WaM-ˌ[eS QJ.-?CMJt2@]<УK'ӷyp 2ip&yMg^p'=헮^{YC_+q(1/Ls& ƚ5V?SԮ?Z{_rtVL;gL#SSX}fjTSYCb-Dq ־3Lyz[25ԨVeְ6e4q&i*qJFwP25UߙԨ FǙR_{>q5N'B=S;R}gjRSú Zɟ`w]cItp)L w55M5@5+! ܂Lw5I5@ aq"?S{Ԣ V"S0 }ֺxA)%S#ZI45(uE6 Bd2cx6ZԜdְru?qfYVN Lw45'uGq:7}|>Ǜ8_ZF}gjLSkú#ı?!_u]cg2NRIs&aj S LmijLSk2s8qlOOy|X3& Y@LMijKSc2s8.qO |L޿Ng8LS>45-9'8vLkAٵx!.8+ҵ SKqCci'?{ƚN*35:05%9G8rzukfLgj5 ajHf (gϮx!`B`-¿dm?S3Ԑ+@ku?28ٺ3M8#ı?_u]uo:X;M7YԊfdpDȟП\wyk^0s6'v(3M$ ĉ?8=/Z&f%`LLbjd]¿&4=8Q'EVlGŶ5 L-hjBS2{8IqDqS0uo™z:o]?Ԃ&dpDʟ1ߵ.1>Yh8KdpRy i]ƻB@Gj% w2{8qbEq882%LMajuޕ2(3F8I|{uݵIԲ,+^ M3)j SS o¿2}LT{t]wmֿkMCB@wXLoe[#0ccqfy6≬k8CLVo~YnC$0Y_%JR2R@ S#Z s8ߟ"pg0Nү?s'[qہSșVX'&a(9@./_3_^*y$' Lm`ju$`'?,w WՒ$]ٜIN S u :aGܣ+iZd"q")! p&X'?Dq.f7}H+ Xp:ITϘD00:)¿0|Y p6͊%Y&kS?Zv&|>h,d$ǐ7g8 & |]Xk-Xx<ǁ7Z_م~8@1HBQK2Huf͵_7&yM4 pIU ֏9vmvq_$2eL$̵7s ~ kq0Lb!1ϙH`kxs-o׍yaE'?Lx@Iu ?r]w즓i%,C0&~vc}o'/_1A<@$Oj>.. tD=f͵_7]<$8IX{dncEװqB`o5V7}w%60Eq~s;WW悂@T~͵^ևb;2GqwyZ@/s_# zg¿2 8I=og_uL s-~0>GMl'/: :\kuk }(b6Eq|_yޥul>8la Gq >@Dq9vǟeYqxP̵6| g\(/1 P'?כCpk9`{c48_63 @/?WA~ 됔 0{]}AJ9_(p_3_Zׯa2] S&\[ku5ߡy@=0>:o_(k]|^\Dk|ƹ]1Z\Sku58Ir^̘U͍щ7oeچ0a{vyy [~8yIh72Cy_8yѺ~ e$ ܆f60'5ݾ]^ ɔs[3,v15 3  cQ'" OrޟULbjf/@{_}5FC88566|.QLbjf7@` ] g0gf{p2kasM615UUwВ+5WH2&`kA& K0 s$1cl`0 K00L !-9 V7TݭoH^H}7wcMZ5+Pݮ{jg   5pCMœ$MwX7=R':s㹀 [`BjPZxH ,>Djp=iѴbȅ)KQ7vVM]~ũ{kxWnL"D/Yefo-]ס(L`2{Zw ,]#⽼FXc\]":_G(.7y#_J`6Զ]/5œXo2eVgsQ-o,ReCMjuaz#&ߐZsV_kiV\<_,K$԰ 5 s0s Y`okkVjݯ=[6juan4Q QްEӾb;t @̦7;>uO8w1#D!﻾̺_FY )yoTzNogE> bFʘ[Gvמ,C:he7e+YyݣG1&,γ'XZ 5T¿0Ws?`7oiǮYy4 N\ Gll.k)9B+900m@ ")v3k95u#`K3Ԟ s@=!x @D37_efh]?ɳLe7n^x14~ȳ{xw7g"f֨Yo5mwé\.3[v A6òG[/&sMea#D̘) 7|Ӭ,?8k  B6Pj0  @D[2f6 {ӦrMJ)a8J&Y7EӉi&q߆]R?;-x4"jۣ2G/T, aB j;+MN暴֋Y^)|U ]mo6mw <0 X pa_-?kd,od:{ļ? . _ qV5nZC6˛ 1ԊfRjPH |=wWLM#.עn:g0ԆF ┄Z>-[wNefj͔kVmyrԂLguYdἿ7k Q#Y1mMpJוggJHBM+ԵE~vߛ/t!w{t]?z`L[BjV5FBk@TPB2)<#kQ7ilPs+`S B.EkRWz["DQs+km{ԯ5ϲe+ž`vu}?řZ't@Ba ;욕/?,/bX=o>P'@SB-jPH+5V2zۿip|@S"8LK[Q7iELga߿c .VN(|t]7㯻YBMjP5԰ @Djj)\/Ŭ̗gjkƺaۉަqԉ۾izE"0Y43k`Y3!@´zѴ2LŮYTOKQ#*3{hr\,007RUm5yv~eaMQ#/seu<(oR S@X!V44e.uu"Dq01J!|eJ} <p;hU\: UOz-/H FKV{E)]zL:a6k5+o@5@[{ZvWJ,c0:}ãY?δ>u^/9!EpU\qK,GvyVgE6 _Zu}r׿kVIJy]7k"EHUfvW7mwԮ}pJr@p1M.W%XS}3z] .@DG2nS0@p4R)ӤT>O t"j81Xk_hۓSU|,! }U|@5@ʘ]NE-A 8ԃ?uH!O1@ ] 6Ke̍sX4]RYY.e|4MckJ=u^_M t"jL1#ھˮ/pK@"˞ouR t"j 1W=)A [5+OR=^?H t"jJ1w}eӶ8lX5I SK eQgSuǁH F66 yRmoRYA k-LjOd:" M>^BKCQ#vuŋy@c\"B)@օsh{+]Kݬ,ߣzμw  .@Dۭ2}/Xk@eCVuߪ9'zO8 .@D;2A OngGA`ADoꌿ]'?EH y]w/#Eb'ۂ_h1ˢzo<#`tܣ,ߧz&}/ .@D1>/E  !b7 ۤ2[2 bO׋0H FXۂv}_1"B(A`lec@@ ] bSsap߳hh3 ]ê@:)6:mZd?f[Tϟ#CQ#D*cNŢiNa4 ۂ p6{-=0+Ok5O3GH FUdB C =ʹS?}}Ǽc@Q#:9qém?gs`` S͗.Y]ˤF"DN*c; u>ﭿl"p*PsN a67n + T))H^4o0"H{+TČ2ֹ,掌/˳}=m!zv̬,?z?hl>@ ] Ueboo݋=9 HJQ(C2&i7<߯̿geZ=W5{ bFuW3۾AcDU@aoX6C"˞秦oZ@5@LEetS3FEX3 vvu_ g@}_{+TOAQ#ԌBh8z 6fU ja_[z0+7J^JGQ#TU:EܗѸdUU4ݻŗ~nVJ`^_a4v .@DSWs{ MsFұ*XwfeoZS"E",ȥA6:]hR{8fEEot"jHIeL}\ܐ9i0"o8$" 8,l482e{_$|뼮I"FQ#A'%rȑa0P{,{󺾈 .@Dا2沃$W#8d0rFC<~/B>3"H F1|< (o~Vf0nڏs\ D$<懘F9RY! yLChG's Q"@ ] p 3"G/4)`@XK_X48V~qH FʘǮϠk$eЯFd:t"j9N!jڌȱ a`h6a{;Vmȿi~y]fDH FʘzմIJ|<304l#<_ ˙~,,.@ ] p*c2!{[랽h[0"g@d<30[$ !w<6׬(ZO ?8>@ ] y*cB:uGܳMsgFdoR[WۄpM<~ڏ曕Ǵ +'uM@ 7TČ1=iaU`Xl"Py~a{oZVa &~ReQVe>I }1#Ve t#5o"¹ cAmgoR6"DQsap/ˈlw*}[%L\rll-[{Cg?ϵk)uF </bFlʘ4!Omz A`VaVU~˭*+LW;u}#"D1vuSM6ݔ[ezj&=c XfeI߇C!kpSFWsxNC#}R˳qp. aq[ص:n}B̳Ɉ"Dx, <#6Vna zwFg?ͳoo|? @ ] sOm{2#lH$Z-6W׻媾p_7ΙřZӸ$GH Fī2&MM=O<BX7 +:濟eGJ*u>k5@ ] ~xEF$a[g8~! e_T<}uRBQ#˸=^ֺSm{[F$.0?r ]ߥw32+hNSH Fʘ8F$"@ʱH\ȶa`:; yAJ*#B$\S f9qlG4  A m-;:V_M=.`Dt"jTƜ< |X_g A6L(ʾa 8o3qߙ .@DqUU7eDr/TʾV^¾u6+/j?@ ] 0}Y}x'2"kRpdDhT.[>ޕ}=x^gzy"Dt'ߴhԸ:0+x<< @  bF`*c>A~ئnȈ`Az^RA$ %Z{c7a_J>UZӥ#@ ] K3v~uM]lJV 1(!$p{ uoa\GKQR) E8\1? #Z5U@BUAahPb `oaUG#gyy] H FhTƄoާaT6By#Rn<"? a aP["Ygv>5kRL .@D9N ڂQ^+ ?j0#Dž11,-<&5ƟvX/ _xm 0/|*1sbs:;IkYaz7#C)3@2D!X7 Aֹij ģ,kQJ.u2*"DĢ2FbMۯ,ZS >9v pxt"jbUse!߲nxpwlǵӗ"D[ {ulc3n}=38@5@2溃og84ugٿ+%-ȼH F`U'VoOvdT`;ZH+Vv3*"Eʘ 1ɺL޹)ȳlcZl/@ ] ) [OZn]:va zPZ?l/5랑v .@D@Jf"7wo{v}cddԐgW,+4BQ#ʘ{[vof"!(F񻈑E$|f">1O7wۮBL_*+FQ#W3OpZgou ÑمZ,?!Ϳtμ 0@5@8z1?]Y~7^9 mJ)g\'ӂ3?׵ct"E; `) wަ12yvVJ#tCQ#76A wnul׸JOH!?_Out"j3*cn4i= .y]>S)1ڼ8@ ] c\)ƹnvU}-!`v)"~ RSRϊUV8l@µ bFqM}Muo {F8:L2'_.g8V@5@X?cZ1L ms7뭻`uiMԗB~ɿtt"j0bAnpS #ʳbԹJ/K)K!l3@ ] aJ|5! 7w޺kXkKFZ7VߕR}M))ė}uCg.X"D1+Ibnbp#5?vɳ"w_r5|?E"D2&)+bz|]sInpW{{]qXEC T]Iq_8_n)H!DbSGQ#lʘ:?.Wb?5]ŹrֹsyJ)ڭ<_JC%wߖR~ۗ?~z 2@DqqAſ* +bKk87\9g, J+eRRb_'RH)~(Gjv\8r@5@Tۑ3Xlj6!@ *~ZIDATxk}]/n$$! `LVq>3}vZLmڊ770*! p17r's|>痠}Ŝ9g}ξ—w>k}r)%tr p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 L& p`@80 \Ĝ] ߙJ{//y]em2V^Os)㿑=_?;]_v>](Ǿ;r[xsGO1\מ6s]zPy}GW嗿Q?>j]EW|[rNnyo-aٺx oisnSOmjwc=rlg{[{_?>p5zꓥS@fds-;.!_`XzVB3v8-:/<58~[=,-)=KHxb-K!+e^R.Uyb}9|.s/_P_sϬuٳUz'kw5o{9>Z3qm/W'᲏k[=o5$`Ś_j[63<-qldpݟhG^p܎-'-^¿.gTxa8 @]SbTRXT 0bV´QS }ఌW@jVmƶ=P*㘶-5i=(:oUfvU|[(us_uɓv/p SuK%+q]Be>R+=~g9_CS_ϟQc?P?vdo<=޵hu;g~OH[p~-K+eޣqr=2Br[\ij@ie%}c_[ ~ܳvT^8, cXXÐ1<7A¸YQ׾Z:,!0xx0/C2t~NU 䶰(sɏ%?/]ĺKq<ׯ~R.%ϞϼVނOԯ{B\ Tク~y{;W_~A~HJ]uOjgK닟Ҿ.{k.yos^ry\&sZQٷIegK oo 2~>mhs+SAm Ru j7Y'؉lTp̐]Æ*jTӔ6<52o0,xaa6{t9SJ :ޥi6.|J7>W?KyY=Kh*$>!V=iiiu׭7OZ/>;KX^*/Y}n~/KyW=oT/ŝ^~F@[*JR[zڍ*~(qYur Z۾fP<9 9NPvڏ./.To_@8& @ 9[hKΐoyx˷u4|aNYZ~^Y}*K;:鿍{p֡ss]f<9,usҞ&4YպY5ڃsNk* wFM3L|e77|S|}-@JsZ2 za3k Pof _ݪp5xRuok_~Nu.HC=d:pX#ƦidߣC t'Փv^6xV}KwO?Y_9] Q:%c9VFpͮAmUu[#/x}CK i]Oz25¸< kU]bmͲnRZcgeimj^e>\˟~%/%Vu޼}/Skys^:>rj{F;lG-*Fyf 宕rsaԧԵ˗*Ke`Io+~.9~^z;[6k_+|Pcp2| HOCq(cClVSF5eY G"UKw287/vݷDr<026cupJ\nuW?^Ib<ƮçYW xY׹6}:'.@Kc?6X e#|P~I] 떿n3u_[9} xӨx̳mrh~!<>yҽr g_`kr M{L! 4\!V}F a Nko.םrZt݅׬g f^|U.+K.~M=i4# %z&zZvvnn.]%-ÁO}x]Jrb+)o>nu_Vz X?=uխ?4v+z'%/KGYn"So/]u؞V=>?>~o#z Y:5rYǠqbutM9(ΣU6_dY~cew_c\&S:,=aS >Z9x{D]em#.|M/j4"щwöwʵ. : OkPu/n]kvMơr\[uHrCasp-xW-Q)=ei,0 3;`mϳaEiUls2*v) .e: !Vdpt {>>c}~U &PRpZFzV,#MP.#_Xs47?IS/lϦ"ܑK3esۤ1WfCP  !92]ÆP 6ىuY0ڜ?]yye4tmY)˰9z759wXrJڀ1 .J Jf+3X m.elfX8_`JKW13b2ƀs=P0\)Q 8-VKeݵJopczé2?.ܺou cc82>D7]ch"SﴇX3-BFcNأ'Z}K8 =6G^i[G/+5]Uޝڎ>~}Vnu*Eu$+TZq̐wg>v z*s}~2&m2$6~>UuŃ뾮.dm+]aZM /rU e3`,šq&C׆EO.%;yrÂCBqOBCņ )9$;)t@^ܾs $nVU/eoȯ+}p݄1lrƷMs_^IU}$rým=\z[UV^ϥר74f۬E暁 ![ r(W]+ZkTnjtIl$S6_`3 >#qJ eJv4k><ߧ>6o7ٮzJPayW}QOҺ~4{CcC= l%א9r nmVU94:Q F%ZjUC0Na.u.^GFr_X7R ^;]PeXvTjߕv -a`L0^3Na7r K Msn%P,_5`R%MSJF8+ 0x&܀[B߲NCTusp#CsN{ozo|l]dEvk}Ybrn!lay?\Cg{U7Օ\_* i0oRƲ;m}FBYFxp}Nó 7ٮ<b xq{xx[ͮn–^cp XUertnln [6\[O?Rޝϳ:+z*:'kl !UJJ:+@,fr%s*$˖)kk.qp C0n8NArTcHs^0$dv=s~!e\e[澻 ~Ϸʡ> Ý۷N |gէv ntѱ!ԗinR#Bյ-Jis ; @'!t a(i\Ű//(LP} +[Տλuq0iiHD aލknŖuښn쇑c,1,۰Q-=} {6eCܾ{ s/QiA\f܃R`_;ӞqIa^oto)]ι}d\ߩ[IHd?G๝#BoP%xePxjXSV|j'.j-4{e֝Di3g}}T[qښqq^%ǴH#Z ֦|Vnc|U͹6GsQ}GߴP7d,!aՈ[(XJK#;xLTíkg @}6}=\"P4Lا{sF1teιw>c84+ge`?kK~9͊ܪrovS(qmV&2:'U^N>4:[Ks)-Dnq 9VA k]ߧ8vSʬ,;QW;GT?zUfb/!c%)&"%tͳMÐ<_姜?Y_?.p}.}b}~{}~z޺^Ϯ?Y9U`˼xTS'xr;z:͉9 ԫa\~Z4q  zs/q.w,sWfw%T^5;p}ߙÂ0y/Lo'ot 2z HB*z*֖og{`؃v;#m{>D6|$o)aC9ȈGUdpLr׆)uKd.&\W|O[7wl!?K׀/}ceNN6.%Ji|ley27-4b'ן}> N1u s;Smǰv~2ޝ[oS!CuՏ {muݧ6ϨvX}?R>>GL.UﭯYOO >^ֿY}̧sοsyb'9%xiTɝA~s<+BsZ&yN{6W %}]]ɺ8oa,C{"KkL=$$Y^ʾg?XHV}*Կ"e]8xjPBl;k7P-3-CI56)Ӻs?P?[/>.^)@/q=ێWC2dQ6yep?GS}Һg\ĺkxJE/|VoF ɽ\6_ 볅}qy #eް=\e.8F&5p~6?;'}]jp{k+Y!Ƽ9vG6Ivf>2ݨk!F[z7S㧔^7cVJ84Rn⼀JW{B`kqHo/U`]u?_+_CYD}*q|qSQsO*s=+~3oގ_WwvmKV{^D½}>;/9! EF4yvO뾮\?ST} 5< 1pym8#8V+N-d9^ä02ߙl%Oukr?qpoۇ0 .wfoasEN*-/?Ϻ2a >;vca,Ȕ.aR0۵1uG޺ﭟxEsrɯu ^9 XȲ%Bs<恜ݢw{antWnjָ#m>ޯ׷u c ]w97:SZ9\m+IB\߇Ǝ>ܶ%wsg=hldiVֹK8>]_k;wOJ+RB5yKuν%$+KAG߾y wݚRW+ ~ylwFmp.N90-`sp4Tkhx Dz^իϥ|V]]B7̼7c6y9ֱҜ/ΉwaІqw-=lɳD/ox+@p?i\YGƖT:7iugo֗]}~m}7_[>15ǣkVZ:Oӝsm{{;%ׯK`duj0w o_kpG*y"J !v3 e9gW7_eNm #H VՂ 0JyRϩk_}"bVdojBY>_G;ǟ/[dF34Kn;pBXX_Ǧ?zvο|u.u.0aj3%E̒hjlk 5 _R~~e~OĊؙT^=Le  !^Hy1Pֹu s'_W\v3J̭+mb._jqVeÝnC?Z^ yF;G^?֞#G{u R)6#܀·RIFl~+'lx|ihuouϭ?cܫnAH=x,RpS\.ï1ûCә;1ai?Op#aVI؛YpW- K-m;q5M/z eRS߿6] {~}=[~i|h@s 5\ <&fƦ2J[8mӿU.Cs~w{KsKn&>{s{9֧w.+>s4qH}>Q yKFwM! wc]?K?%t.av=o;]L7-)rhS;1tv^IHX۲t3nu>\՛7c~S]?P߿*H^s_sxjiiGt͌`nCuo wU#{{(kшdW7C#,C| ӽeۆOO_[9̾n6Ș3o-+aX2ƚݐY 3\>`}sJ|fjZ۱}2-Z7?)8ଐTB}-aՅ)ޝV8El&+?VZp߫n1'rcs/MDvDpOf2+}V!ZkHCΜuOZ]5\MZ͠aHg7ݥόWfC9|V><:æ1o`JsnߨoXܹV³oĨalW|k[F`x CS1hĐ/-x_NlPS?QwMu<i9a ȩ9ܹJ\/¬ [دm)Oo~>d>xs2ƮI C0:S~6ԧ>^վn_ܸ8w+|f U9d "_ʥ|{]D#6zonKZ+לGc9y][07j99ܗ\Z~~upQB  @pf,*ͥ⏖0`V4и8C9w".}(q7.gкNwS^4b _ 3nJ).?^(Lk'SKo9ʧl+춪#q޿6`wM8gZ1;^Vwp̱06?"5s"g{c ưุZfYЭyp<5_]6kE~k]O_޳2r=gSA :ٱvn­Ϭ7* v]\Yx =rQO֩=,w/ %ans.e:]Yn3 }a.y*^9w|ڧsV)Gwַ*`j0G59I |{1DCKb,*!P>K?]F4*sk,=6`Wasdq駲o>1p,ow u=l}-g?W?SE^9f#xܸߔ7Hدҝ=/)y.emȑ13pnqi j­rTWJTɵp1t<>QX_P?sܪr(<-]^j;m*֧Ww},r܆{PZEm`xv[l^ <|mV}V}67n2:?˺ely  ˟/{繵ZهotMӝ|J}s,\uY!`UUJr٭y nEU˿T>2߸gaȥhJm݇nlis=wL%vnܶϨ~G};~\}ᅢ~PqJv!_#i.{r몯*ѓJXz c+{u~W <~w/kp߼Ͷ&!v7_,qY״dn׍ᮣrۣ¹ \CeG=ak}sLos>C(:azl?s܇-SSK} ؜|St}|v}H3H6/]/#"g Ζ/%}s}}wa~}~!qXnZw|.Oy%; s/6ȡ->-d>4xX4] =}woc^p̯X{//yR˨,a4K=P4s}?#NivAi4^QUʥU}qk(|\dS҅iWQxo(ROchq NcXi M%J.c~p,Mv >ȝ71IaH~a2,e~obQ7pe|^*$wud/߿AXx ZϨk9Λzj\ro6?/~G[Vk~kr8wJ;+?UXeXb/!|4]e⨜B]BRzU\Y)ݴn;aç۪]_qJMi\y^s[ZJ,kv^>wv׿s|Ay^P\f([r>݇}ӎgޛ*yf9A`.y3)ȶ۲ ׾8”F8y.ozxW܇cN}G};Nw'6 _PB#K`UjgKZ=!hϩ|C]G: K19 qL ҶMHZQ͖K2ާu9>{=yycÐ(a>lw8g^7M@uy}ο\Qr*3AYxJ 0j]yCiʺW\^V/Yr { Ma/J=m7m|]w[׃}ֲ;_7}.s?{_:-{īWo?"vkp˱::dTZ4"czMBWZ}}uɯ"03\5x{pJ]wosW?yɞU_WR~~IA ay®%vyA}o9[j-vivl_ ?P>s?t8qblyr{0LZךKEfx8Qʲ}޽pi| 11+a%V1ʼ;%.0i'f?s4<ӵ?꽼u-U|=֎֫H S;|72B"|Ww_v6)~א?C]Gp9`}LiFGOq|% *ټ !Y)m6~mdb(v}q ˝ 78sys|EJTvR>Vos]a֮ɽqp,:y沴ji<¾Rz/J)16JpC$Weϫ/PR~A)*n?l^h!§[UVt[7tf1QN-k]KY¾^22ͼ;8|76 w eX#imx}ciA`YȒǵW_Dr+;򎺿o=5xפ}VIWEewCr<ߥuDRJ|1\xE `NPuїv_w?rm>r}T}Dh1.($V. Mk'^?_RYrqGkӕӝ?fPs:Ց+gvK4Vwݨw>~p[\s${tQ%Yzy,en맜gw8 yxujVa%-ÃggGwmJw=Cy=a3"&inYvI8VnABbrQ+c?|/>ܲ=~e9$ǹAQ_zNoJKGLظ\p3rYGyZz ]OJ|e{N?IyVG$Hvl^)k3va zయm(Qߞ.Aҧ.16) ݂6KywNu7o:9/z.aߥ,w kMCՃ_]u]\ =OiN"XvxBZ f;קF}xf虜K@nF ܎WRmJOU$_^s7CU ;O%N7u0ż%V b]xsX>S81\c|>;pƆ!a.͊҇P,"0Owt If(N8r>;֩xxcXrf ,ֲ#矫/.i/p\7_η)U.#lk`JOU#nW?^[_Οk˺e޼{9zYNP_}W}o~g]}=n{rNw~  4+/SՈ5qi-[8o`.mpl u=k籴U#曁v~u_^~{~F:׾QJhE2qU >M}sG$Hk^@}9ߒnxTX~Ȳen{5Ɯ'R#fO7Coq7Kȣ%=V[pF6zgh2{107:}Yك-|0bS3;og{k89d;,oByJj[ކ_S/o^s݀2?#p@_4f:;{/}HJͶ˶$K/c˓; 0 H0w$d2AbO˘Z)QD("E"E'߮S9{5w<ό3XgYY6g5x mȍnZa_:cHE3v>枙d#l`uGJ~u?VtT褯DgNKX95P^##N'H>. Ѳ^R_S|K9oq.l OLj+"RP+qƌ3f̘q*1cƌ3f"h{s 1p=|ї>l91~|X#G%(x2\>~FL=0z| *j9)Fq}sv%iAt`P>F E-ZbuQ(njUvvjΘ1cƌcLpƌ3f̘1(IT\r&ziO"&ҁ4'h[jx[we7 wR{Atcd!6PML1RxRt ;@jՅ87Mv|g=,[`'r4w@6O|l#v~uʽ8O`BP01NGͺ)n7L1cƌ3.Ƙ3f̘1cA;]%)ԍ3CY$Y= mOu^c/ D144Wh0ݧ!#Pk1ۺEzDLtTa (.} EĂGMa lLL#?O59mu+*iWHVhcC.~wRee"R| %9/%j ?:~[cix $o6) USѴƲ ]=c(=?{w$ ce^rx˳,43f̘1c1cƌ3f̀pzd@!2&G)YWVa˶{ȄuǴ#o3qX3ƅ41!m/>9()ט1ח4&i^ueY9':m&e:\bu+NkMoƌ3f̸(c3f̘1cƌ䮺8?[[`:,eN!3n~~mF !x5[&N(j`4È(w>(a[Y@v= x6dᰤ4v`f!$ 4qH0h i.VX]?1)u mpV)GDo_o21cƌ3f|Wg̘1cƌ3 \ojPN G&k }Dr 싻2"Ơn?SVd403WQ[PH8vNJyd؇ I9Y/ȵk Z$FnxB}9/d8W=9$k;ݭۻB_3f̘1cƌ+&8cƌ3f̘AM#^g#G/7hiuړM78{ \2vt$^PJ4 ђҖwr,u7,"x4ٖ4-yD/P@@nϏ鷯uԲ |2 ̀ y=߹ec6..J&,NF4X*ٯ$b*ު#(fbZykf\u}S]7M=`k8 PT?^X?߿ALt$2K[+[auKge3f̘1cE1cƌ3f HLF C *?L(^iy@=Bu^F6ry=i#u­n&#_ve_L=$V<#k[3Z`+) 6:$/A"gZp&~.`&xdΘ1cƌoLpƌ3f̘1ӗk}NDB@ i4a:ye5tQ. |yAO\'+A҂ 7I{MG/lc z+r½v޺кg֌ nЦ{狇ogjoK̅TH'/0PATp>dvz=Ͼ3f̘q|Ϙ1cƌ3f0X^?o`7y%=C۫nOú WƆ!܇)x F`9 PG˪s#⶜5N"PLA^6VA.Xz;wbsI3X(n%nʒ8#r&iZ8{1B#pٲܼ^%1cƌ3.Θ3f̘1c@"t9{|r ?QfӁJ[u*#1Afy_.C|;r©,d/y ,EN ?ƪ܏) y>3~Kd|C4H F?f]Wʆ7Θ1cƌ3.˜3f̘1crD"W2ӵ0-N'M3-8~Oxk3"A 0 (\F%GR-K{{ z1fl{,Ž!-l.w`.e)zlL3PS86S uR}NRfK0cƌ3f\13f̘1c K25ϽE0ElX%f>oG ⬾q Ö_rXuG[Ҵ~oXnJ;*%dC'I?\myeR0$rJeg 5S/㶶/,B@GBiv,!3by` )~41cƌ3.Θ3f̘1cF|7Xn4X]i[cQ2IWn \31[`Q ,Z+]q7Yw|H3 4:Mo`Bq i,ꮹ7@U_ǻ1 C )guO ߲kd70)cM5kқ>|Nn63f̘1c;cƌ3f̘1ccOe'\Af 921~~Z? -F"sm?AP|^4fw2* |PCxR]W%[^yN#3fݧVڌT59.X Y{Yuqga[5o1 R+8TEz ,ēkƌ3f̘]1cƌ3f̨]lի?t]0X 2" ANs}42;Vy9Ѓii+w$:1LBZmBZ՗CRwOc 4cz~R{Z`#m\FW:)3'8cƌ3f\13f̘1c j UDrfͤs$rVT1ϧ ܲM=ond{0׷E$+9s\w;=}rdѹ_`,F"C YiA"/pϺs:eL×dB3`:.5u $38%ocg̘1cƌUqjV3f̘1cFK/]1.*F^`Nq3]6~#_rTJ USzsnN'60 ]4[`;e_bmih&UkOn=XmY:pdN̹h:BR h^!tݴe;H:/~.տtwK}??{oR<]v<r-7+L츘z]sEw_#yJYou8]}Dpֶech.2b&x+~󶟕A| R?cZ%͙6rRKTPԍ.cm ,lʝ%Ub6`P%`Cl~\]B=]ϔcfc/R}lBqJ ?ݏm7a{;g/>4k܃H۝j/"e_:I:ku]m3:6=wuh,O6Zgkt8VZ"4ڀ ׁ:4cn |=PnϱO.`y]㇋ S13f̘1cƌګys6[G;Ȣ;pBռ!2"/Xh+@ CiivGP K {iI, Dջ7D=66 sA;sM/e~ ăqJ~{Vg^ooV٘ `}0\cIʠWE}>;s!u36KZh;VO'jyV|eowDcIp|>qP nxld}x0 U&Ja I& 3S13f̘1c {w?Rˀ$B;_!'7.woX3 Z0e"HF`!CT-in!9ٞjsΖsn[0]LL6 %gN뿕lC紱.fAeHG[(8vp%L)_hLrXjv23>p+8Ty3vPey}!xB+Z%3׌  ˶FL+XGtwNK?oZtu:6x.i:0^i%-əZgZЗthe =ߟXV-}GŸ >{O#\kKs45.u :WUoSZ%؟::oğпS%혹0z9Jꋇ5J.80nH]mgw'$oi$8;1cƌ3fp &8_]_HƝD/w%K;j,g۹S{ kTt3~#Њ3D+t%r& v "ibSRm7M8Y_{zO74@$2κ;B rֹ,p$4%\NZ矙X48+wh%m-rj. n-mW&yN9}'e]tK캮~ 40@Jl>-ga->}om6hōmgEAmIi$ ɉ"9 b!3fMg̘1cƌ3]Ixf/n}[v:G*鏱;A(XE!mdEp.4pI+Nq{p< k9ѝsHwTexo 0=s/3.LR%G. z `KLh*ZgM+~\kj:vӆR IK ^:K4܀kY+/w;]^Mt.o aA1 ʛvԾݪ _iɖ9UW*=seu+QW?|D0mL 2ڤzlǠ{qlf09ݠ%DߌXLpƌ3f̘15+BJE DdzωA\̥˕'9JM1fpm(.3"zֹ-ro ~%#PSOGF AӉy :#3ajp38u28F gc*A]*`Ʊοt &̘q5βګޔ qu qH5`>kӣZ`\+>~N w36t҉1 8Xŵl959?V|4r᠒Cd Pِne!OŽEr~K'KpNݫ|:5 JwwH;+n®߁3f|/u xSM8>.% BsS4Kv]P_/#ҦQ:TJmR폠 <\}xw2ULŴҒY/6"OK&0b1D"] 9ān 7>@.HQ]%|Ŷ;;Cx_apPa`a(N!.oԩ 5C @t]I zNss)I_g6m# YtL4eI<w'N@gj FΘat[!& f3l1`v(d]&y @ f=d"=X^WO^r0?h'iaLCc^ʩ|)rt8%)Qڵٝ3t]ǖh[:šS4F+?k1HFɄc!S6kLn1:ב=kD!JL o^Gvn*_CѫS4K:7;[BK#lƌ Θ1cE'@I'ga렳ur* h- 5uv&nR;}ə`r6)ȯ:IeTC GEËYsN^[ qq|TΤCz_;r~RBMZ;wdA%ַ Z6F&×zد~ ^w4ƃVRKPs (i \׾_iapOF yWVAːUxg_<^aܿxgVN*q!(ʡ_&܉Ȳv cv{_c: Yu)w)wJ{^^Λ#$VU]2@-c+XGz~@s=/2Om Թse;"6t@WZ&*ADLw Θ1cEeNһGcW>sgga8ymr\(XgFS 6` veˆ Ԧy_ח1Gt[ъ!F@PWV[r EQB>!GGF%n'fx !gd@=1蜙AN\2hhb" @9dQ$ :]Nl,9\\Uu6,M 6 @6Dc@'nVWe c6k@,SvֲstbP,pSdgE a0qF6Wv& 6@i9}:ƂB3N5xw0?srעK-@ Za(TK)A3C4 9 >HgF?6jkp?G!`8'BWB`d5I^Yi^2><-W:l36dϸ9,7v<`opoNw C}^7^>"\ִБTq">I0Dn T4tY7\y 9 *"8#8h#޹j#[u ?e#ષ[V_d0 y(4G bJÌ1cƌ)䌻WYlH!H#I)]R(r =J>7Kc9K:dN%,eJ|%[/;hIP@6F1" tYG)±d)zIoo3j/̱ #O)l (401vXeЀn\KW2= ya9kocff^"2!;Wkku|R'ݼ8'!3icCn dBwO(F,t;KcISH(ؕ!bXadVDvNsUrO F ]ƕ1!_=P'w^s%Tc+e!< dߢӮ"ȐXOٕ5QYi6%2s7-E#(6pBX~K ݛsԥڵ 4vOs8Вow t` JBm@݈zf - ҉0pHs]({? ,Iua?0يspZ"o~Vst6 u`K=5pMz- $ЭtPoрȜv3Poal0;:um_:TkZ멼־.!jeKZ͸-'K ͘3f\L`-<A%:YK|`5Sʐ[uY#L=Ƒ$QxM=e0C <nM 2- ih-KRkI3%pF`Q"h}HA8-Uk\AKsʖԡM'PSZ,tCC!;}RRJM0 Nb+MV o?鸂xnuYٽbLVb!b{  AyBqKh8+9۶yv}~u,kZ>hg^A4,$QK^9[f1&q`- mi͙8^kIj2۵]yNY5N}Q[Y4x " 13f̸X?)aj|tfҥЋţqn{e+41< @?,q =5# a2Kx:Rf'(_t5G%ΩK@8u WD6!P.c@f- i(w\ qjwqmSZ y4pd0^Ѝeb+H1C;Nqzn`.9aI"#$'b ..'=MłuKR;\y;6kMX2YJ1 ɬྺ4z%Ј2p ;[Tgҁ%g 6FL=c%Y H賀}+:V=Dx"59*)yHeM uיt}Ûij! 2-Mt$ ŌR{=DgiwNC'~~LNƤES%:+ЮN4c3fLpƌ3.@ag#(R^LؼfenQߕQC _"8rC DOuAa1$ `G=4dV,Ċ$I(fz ҞDWa<7'IF5<`z+C ɵzCg{GƫƐk?nQgc6 :P*G11w5 1Xfu~f?Nr6 Ƞ[R|!2-R{`꘶94;NHuD%A# 1Ɯ:UL#]v/7NoOQcZat{g) ps`*̷P h ѴbUkvNL^EU] i]Z?z=mF`‐$C)Nl67)}-ɯ֍9 SH\D6|0KKX!;R]u eP3q:U081' ;㯁&,'H }D,Вr-]'AcRl29Q[Wg58 46<$t3{rZSUW~} mphPSZ6 !h6Ӎsc,.5q\O|uҎ)F}~x~3ϟ0&$O`10R3D tT13f̸h@g4bkձܰN_"_4%)pt;^惘8{Mܤ^%̕ih4fÏykpG!dġ'D!F0$.I:QIUP7)tgȐΔՔ1'v:q!"J:P]Yy&臙T;P/1p)O;-qn^_N"*Z |0rX[ó]~lG@;}cj|olWP;= 3,i#ܶ+q Ҿ`߂HǶKm %>qYvT#d^QwIH]m4.mj SZOVk]:36V0pTt] C>6ώM00_#-!Mo@9n z*v>YAS,&t50س1$ XoDΡqv%M~ ǭ`Tq]*(gC'1<0\˅&3 ڵ$]ҨŪrwiY~FNXjӕMǷpD=3S`&Ɠ(Ad}G>y88|ehuwAW]\b6#`(rMsFPs{13f̸XA@zRԬ8i!LL:+BFUٱ/1! ҳ1\n()8CI;J.y-΁V5`Ī LXcdm(yz$|B}N]Jp'mOF? ˖D벎qJzrǪ!B >ہ,C&- 4!7$,]d$__ x\'ݘ#K F֦JccyYN[gba |p7WZkw֕ҏt`-u Ogs=oP/Yڮsηv^ni*4y:I%ǵ]DOZ$P:|ЅE@vU! “(=%&,)Cpڮ݋?C{Z͸4SY'oHF9 d`FzJO5ZƷW~M|{ l=`;;i8O.f GjWn@AӬgq}OTa[&rvB+tUv]*-=U |bfAFnĒYa@$0qN\ ] o,d\v w$<3 I4pS%,p-ұ4lkP΁!Ja0j\$Q A/36`vh?0X':O0t,p:K7Y*x͸l%@k< m!t + uF3'kߩ.d`f{@!> t0嬁L 8W u\uY~yx)gLvƋ`A08cokjU-%p=0+%Lcopd1zb!`zx#$'!W 2 Fv.+͜9Ik"/MhZ]@Dο  {7]̑yi PeIu (":Zumm-wüi[ӄux3~ Ykpq pv%3<`%0I,@,_AE6,8J]c۾-DB]<Ψ` <3 PE ! j%sfA-^)w,16YM*QPf5kZEpL6%lxMt.~,^؂:67=Z4- ,HR0'h%s*s1 VŬj-|a?;χr@ 6L13f̸?o// /cq{dd{^ikNN3# [GtH X0+2vuӱMr9oZZW\`d ~~.YB79cA H,s8:l(isL$0-TdN:õx;`mv (lBzuB-'>n~K;ZwDD\v^Ep I3!ߐ\uٔG.Kh/IUMC'@BIC4go% ]I`#Q %f>2ʓ^@;uSBjv=ˁb"8-$  9&$cr\'0ۥ'؈,QZ܁)MAVnz{-͓]kL 2)P`5S TAP. sioNbp]IR tZ?60gW׈g EV'wSS@w]3v7@\""C vKD7p@#NC'yd"V'v.~gf J"DRm݂M>N2dڱkupdeHln"hR]9KW<.в5_@]|s6s)AdCS㝍- mfEt)pI7E"\ƔhO6m *,AR=U4K q}[c>;3m[y)$݂q/{6UAm [ϗzlү]{mK^ `DQ,SaMz&8c3f̘qA/>d,Kvx72 =0xGe'!}UK辴NMjV~[Vm:fB BEdmor&bɽ둻j-͌ќzZi]q RCFulcܝA{h-yZ@RSq?Y5ӔeZeЏG8z_g |v$r ;”= $x@ R&) =K18bL./}.(Ca-Zk6vmmnq'c}2u`1N .F6A]:vN޻V&W?q%l>]WT2ިe]i_h|?e9^ֺyrAcg}L!,Ɋ@*%wlwDBt8\g ] MTexcKfAjl 42hrGOюg]MUPvmߤ YnL{#w)ܴ v"3&8cƌ2S}n2 GG[_+бB Hp -tF"I.$^^| tv>Lץm jqۄDDZr- .-yϑP:}1dуmNBDN䩮tryAA渟j`tߑۘ2 s]I5Eʟ+[+Sq0Qg4Ҍ̶Ki72O/' ׃Y]1{%˒@D;1=8}蛇$yGM)~ PNj#b>QTC$®Ј:(C*pD;yÈ͙0tSbD p`  . HunIO;URz>`Un^o<ޖK]+PUI_mݯ|P'~Fgi_7[p=_RbnGYaKy32x0z ~|x9 i5TvL,9gxcS`$y.QOig.%i$Lk׍l.|/ψqxh6`nHmfL=j2>g Kr%8f¨w(ZܵyX|V罺l.ܧy{VW>۹A]RFlNAV\]v+ܡ,^0 DW"0 Y tHn@Whso#yӬQ%as8cg̘19:Gݬ`ukTS' #9E+``lX.fcv n@s@@AIaˆaTKm;KŕUPx6>nS9ɋhSzp"ɅG:^7lAJh~f 8n2P1UIWo ]j@#>Xô<4.^;:cY5P 4Nd'ϖ;9KAΐ0uedÐNڕS<.?n+O6pީ}_> :}An}`<+꩷X|;w\/?5h/}0"31?9w>V > ~Sg> }Qw)]uk^7N n1Ei *p~%?,UNB;.sso0&ZLۇoYQeEe0iumwhU{7N``x*jQs0Kel] C˜wͅ8/F`VK~, l\зÌ h~L kݼ6(uZ~]uguW*{ZϵzOjq5ZvoW..`NuqRyLY q)]GeWuY2,@'/ @fLpƌ3.F pen#󣴑{wgI Eh'D,O<_*`p~mfp'Z#Pgp`ӆ\ 7[e^鐄NV&E# Xsפ^b{rRm1s)%6rx}ϑ:XrGK/v#A78fijijʮÜ9Fklt{OhLtu Sfd: @tƋ`AOkLwAv݄w)\t:Bܑ )wO.Ux!EL>g.ެvG ֚l0%:m5at7Mdk(ϡ JdgXYM6"sPɐ ߗѳ|ex-+KD`#,)Aܐ}E8L&]ngvheoc@9A2XE<+Dou{J``j0^0'-ZcS~0D k ؒeBhHf3"tw_*Ke]ӫ~mr m!rVju?_߯)g. ~N>~eU%8:8~:1ym,ylK~~eƿ˭ϻG-ݻo8lB3fLpƌ3.k[ =d?"$W|c`jaox^2Bu]'8^nZ*k Kl>ځzz@JY`H+GslQMlh@HG(<57/"'2L_>͜W}R7:" |@WE5uZ;x<rtv M00#c0Y;Yv9 {g"Dot{`~CH\p $7~ ɫ{Z;n7 tL]ʍvh.VgmsH:UX_/!XOV'.,ˡ$N`mR#p,KBjmf;#9M1S D4P%+E "*#i.[ݹOIQW{u:usΣ#%8%KW05&H)%3\,q橨Kz\eK 0Xf~/' "MRL3,%}F5\]j}m?YmG[kajf T6Brˠb_U/'HOd Xt [rAl='ϯU Zt*:̭yqe%LāTsoԿ]M]E9x[d+ZDvƌ Θ1cE 9p"8C{ >~t%G0wL=KpIF*vG dC:%fAG[Pr40lAd@r~OՔ9|2(HteS9ā=|>\C1eつ@4 )6uC LxG;08ѕWfc1`'@v@oRTOs.,=8reܜ׋L,!\l`V{XQ`-bZnZOVߪ_]H\:o5H=mGMW*sLz3$ 8+ _X:ӘKmQhI-rcs@A[ \MY7Gܴ#*LIӶQIُ5sEr8OP1 918sfu<#]t?gזUe I ȳ2t71$AӤ@s/gh|o5yn:tOOLzz ̝F0h_yxw37wXv܎S}̘13fns4דB;<]ftvC@J/< nwfpҎ㘿 2T~XO`3 ף +){4~X4w7qO:u)HJ I|KHc$)l ):y$ً/19Ɇ$Zp[.!/akC沲VCۈ|aI Vxԓ[ypo:6#p44 b7;c /:~JtA"n׍܃aee0Q=|)RFGJ>Y]ivkD4pz#{pQp'1 \rfEp{lZPs:uG!PIe*`УNmrv~"8<6  gbO04a}bt\Ht1emr4N79EwgOv=w( 'y0'$DID5ߜmeCmojY <L"^ݚ|l8vr.y?(ɺf-:>r8! &S'snJ:L#o2B1h~V!M"iyt,ғη~ hvQi@yܱ-PG=\(y_d Z_pd4 0.@C]( Z[} ~V:>-Zڏ&.sq9[; L@b!8+cqQ L6(Al0| YF"κ6ju}LbLٓN .4ʊ͞tϡfDQD贵 ^d{D=OhϫשH)鞱 #yA|]朝α3L"&C-^NyE>0x~i7 {nj_w,2xLnHA v,c]+Z'8jE89qjevfLpƌ3.R2DPz?A#h`S:",0%vd!Wb4%t(ht쥿ezÀcpCyh|]:V< nrDv1\5H셱~$H~k ^xE79׮'dRf$#1ty&44?jzϷv X--wKݪ֩t^H]]~L~Nz^ эzcΌ[YHLЉgKKFb%'<; N:<BAE?K>} :m-2>d0E^j3k; oR F` a[ $a n'ij[v2@ʞK.%o Uްm&#j~~P.-nr's' nP20n4g a#43["zsKjh&`׍aPq0ȊJ~z(xkI*c:tro V 8Lo.G|mZn!__?/#cbp*۴mGrpd1Ve u._tvVտ^ksFzӑV6q3@&n3eZh{'!4s3&8cƌE؋bΈU$UzGGfQ~бΠuȶFFq:\; &h-H !jWp7. e tC.t!"{03 G#쀓W /Js ARzx}(G)9{/.6 gx4J8]uuƒw+ܬѦDs'N՝QGKy,0X0AFwVt8j2.Yx )x$f(~!8D䄲S&n$wSw׷aZ56P^c4M}GfL[$|1Gg _l[ɒL\.X:g2Q+#ͅy2DM* %k5C|ZCJ|\?>ϳ{-9K>zB;c˰5ق2\õN= seYI ;302,_7d$؀-U`/NX-RDqƍո>=nt7mU˽.2],X6=Gc-4*~3O:à3A=Nڨ-q{WeM5r*0K&Hit[uP]0 5̲&7c3f̘qYZê5zȂ6%Ým)ًvwQZZ%$\)%Yj$@{vpcy?i3h' {7VEףm)\Bs{~ӳ~ŜMCJ@HܠD4k$ Ðj֎:Q@a lɬٗ{D=TO~uSߋq{ԁ^cwe"00.Z-]8RRҀwLnLn 9se r5_xFog#Fδ$4sh $Kbk۰}um@Y5WUuLIL:Ƞ3QS '>I4tM'Rb<Ĕ%i62)%ȖjNB$(9pϏm@ܡ\[>k< o>Isn9߷-(ӊ36mc.i`A6͞1`AcYZp? <2 $G7Z^dp6=p%20jf-į,B=G#L6]Xnn.!Qak^]®ߗA43V@ g@x7놼k3z6v|x?1q$V{^'> Ϯg}%.%b ;..\7ݩW~~@󜭻Vm1cƌPN9}RɣoRIX rЭk ;[ t:0]ElJVȦp߬8oB |i>wud/?fT//^Ӏ2[e_Srjs^vLb]aCzz L`I+2B0!|aRr]^(?L#yt rQ%Mxh_,-~z8v5 g pXG9PF# 9Z `thLX,;80Oap=LDWκr'd d6`1u[KMpe"}O_Bu{D #;0u~+g07(KD6(Tt(]mޞϯK'YԲ~ʜ嶛 ^_͉[.7 rCeNX˥?@!3%+f̘3f|ׇPdk ;D*[X BnH@^`oDȸb$u*0;/KJx/7@q$.m(nէrEdi/SJ[\};r 4Wi,6:סlF#H(͑ɘ#C掬L q|!AWө__Wl`3ql m]i?\ !VgTР%l4l`5]zcf0Єl$k:jvMRupvrK3 o6;8_e^!7t%?Z=C0 T  32K vJܴC9I4ϵ%'=[*3 sTTtaĔL-V5m֞|LY]C0GuO|BLdv hxl'Ǵ6L}22"|Rca.9.7] ?_> :< (HBY>g8Zgo񲥈Э f0ػdK;6(Mu:< ov>4U.O jVDdHbjpׁd"ަ-/rOUO.~z.?HES’Q͇&{2<G>!@>t& śYyWm}Sw2{`&๬cbR c?]ޭz0ZMptUZoޯm?\h16a@Nh=> I(/L> XWXwJ'俭:Nęvs7 S4`H~44t?Jz2W8[צidķ Yđ*=DZz9;Gz51 9xX2B}k/ay ޾uj!ut # DC^0.U7H nY+qቔgQ92sdpi^^ ?|E X[A?|%h+?97 ؕ<4̮$ xIE&F00ZʯLSꥁ|țҌ2vny9w? 䄾1]&|PmCq&2+pM._q]s~yQP6lV:EH ұhڠ.P!}u6Tx:ߏoI(2O:HfT d䲠c׃\R\ij ʸff}o,y3sEQ>Uq`p/` [D]7 )^L}ԨsNLIiV;/B /rXHpOLq@:5tݻwjuO!ܙҧ;sGdHBeIDgbR=#~(Gp y1=5VX oן.e6񐹋 +f)Y<:]Rwe**]Qwp~F׽J_ֿl;ڃ:C-6-wtEѹ^Xp vSOgsfAuy2cxdR@Uͺe1|ny!фh+[le+[9 LJ!t,a{3Q)P@mgpv0ב..]߳M#]*m\l)@Tv>8&kҘ$jhS'# Av! kuඥ[302taLSlA"Ll!Xvпk3l}A<lH^xGHn9;օ;t+&!4AQk~k7z9cm/'_Z|pҏ q&yKقXNi@dUgkDV&0LAt Sg1,)SWj1We/i3695h~d2:C<տ?L6kIkQп |N?{G< e([b, R %Ԩ,1-1 췙oLh<(tB_h]w ]]psW8 }K=& ]VY׾Tj_%ROݭ}XL?rEȐ5ǖ@clB=Bv*F@}Kn bˎ 'xd7'.ޙ $20<ƨ3HF3u?5%jeA0& 5ڤ 2g 98q}L۰ ۝ݺ7 hꧯo Scb݈h "M*ZqY3|]2j8֌lel۴ jmq K@T  ή#יn%StuFiLtPtf7I 3xc z#@Ϧ%gMĴ!V|4^u&!(4Ƒ@cA5bK(0 AH%ГkA:KS2L̢5:'Ow1ܥo>KWu+i0 PB8Y k &>r49[6~mǖZIs`@R10=eyYXF+0L] <0 ʌ))Rhex#7O4]wnuyX+ZY*_ճ"Vz~_*`|}}q(Ǵ^'I?j,@餻!4D&+ڄ91Eߘ(?A𜎀P7B!crt&' 5ԀL]ÀE ,r^y(??}D8]c5]s)ӅE{mnM cZ4Bo`4I!Y']jц~!,gh7fv{ևw"m)_Ξzso~=Mi#ԙ;}U╅$,|wR/*NB:C01E |Shݮgg3*dzp?-xR1ܶ?up]%L9rLYT.]y.}BKne+[)Q80 $ ,">\3d˦I qͽm8 -:ւhYьN 9'S c J~^e!fO 3M:ڳ, Gn.}"!Yxj0yz [NRRx&v.|H=&ODfM/8xtE$03 /鏼U~=;A<:#rO 8K^]z\?_X#$A7~o򌾶b"4qhmlLavʶll<[^;(,~qgsmVc>47OvW5ϸn"sn(= -=Tf`Ȧ{WWy> R_U0?QW  ei1ynrtOa^i} 2w5ɢ@*(8|f=&im`}+Gr5(C`(j6@@W.|&DXJ0T%FMWgCBOPIf:[~jZ.1V)9Kc3`B*G`|Cp8 :\׋Ҏ% =Xs9|J~ $jllOugl&(t ]r1 o N1u?xq@:B_oi ׺gSZvןC]qn+ut/s&+(8k2dTd\ow>37 ڎBoe+le+`uKl>#A+Ш;bjUh ep@hTY%v[Ypmٜ1GhF8J4an>9BPi@Z U+[6QrvEv9Ң0ڎ4AkStE 9}#@Pqθd&%=H" `Dn_=S+ ȚHNZRȀi8C]lh5S@0qK ؝]]M&]a6CQ ,.\@tw鶏xI͑w&X>AO-\&*vƖݭ8R?o޸J+rLN8`$l-EO{PKn>.3# 8r30Ow `lZugZ+'d-Mf:@&!Exh)^`a+K>527'͝:( jMϬ/"Gt;mܿlV `tZ6:;6n)]F+%ȱR]`v9NHIh1tFa4'wz5N=v7%1iўe}wMDp1zMCйvF!0s=v**DŽfRؙZ6Mv5#pЍuG> 5K.gӰR:К6`WT7 Rli`R C[9 ZY]̞wd agpthB"1zmd5eSA1_Gn*PWNz}3}!]y"C*ߞQ΅eگ%dLCtbP؉O$xAz \Hi%KQKu8! )[!xP \gUL;3Iy45 _W?5;*>9b"s,%:;pcA,pPwO)i1k`czW˄pcSi(?:/J=NgId2(n)[le+[9?'}0cda  Ht@L)KK^h]Ї@[m_0gUaGHK5!!~.Ap{m^J%8uҘqL$tW;P :둽eG[D_"][Ҏ1 # ]lE9cJ=G^ aF lN_فB?+">Ved'͘2Eqå,gѱTvM ~kRg1KB dlF^@Rݝ7~f! RuQgmA۽Rda >r7xd׫Xte?R oLhu6ԍ!Yk?OW}H1}ZG[J:.N??[\}Ajzi9˞VBA_ٍMUKV N? ҅4eޭCgU9 f& hRsZ;)%vZ"w@; ]e.ݴ;+.7CYOb 9l=dI  phJC8NtJiן]?Kg t*L&'ҁbM;Yݶ㒞^;LSF q v֨/= xb 3n_j;/oii~>ݞn0'/Mk78pr]ʾ (58XSoܨ_tS k+[le+[D`A/%AiΨrZD*Ed%8ԉf#eF̓>l? 9ΜDp4"XM6`ʈЌ řq_B0ǐ`cwHIc!A*P`S_ n@/pbl s֘g5ꑫHb@~l#~p>?ٲnW1Нve; Zsu߽ *h''EL-  ml"EjtƖ3bkgCDzԿз !WW{yl2Y1]m`Vv;3z+̋[[tVۋN")xtӋ@+dHwRބh%g@FhȕCWv-+x f[Js}юFwlþ_Ur^uY}|R)ӝޮ|!@PvTi֯8@0컹gIJ8bfSobrs9žd-GVV }~9 B ;lAUdꥠ>91%&4қ%p=W+5s>L*n&!>#{P¯pH38P\eiL3QYRAzj)ݔH([Y' @px!Ȣz+NDjڂZpc5CF|MdSjA"`aqM୴4s&وncf+]Nk?UR'vD.Pn:3Jp4[{# \Fj)=Uh|DG/^OC,`AbhA=7#sV7^j?Gac jRp.Lۡ78Ոeɴ/Dxէ5 :y~^y*馺|U?FF}-ez]/r1!]e.eu Wk'Ó~]4y{DH@;i&0MRM5Ō:LRYgz~[3W|nސ t\uYuGN='=wf4662&XϨhiҕ+]s]?p.տ\nΦf0Ŋ3; *h<ezx^ûVp7WgpIF8"#I^6M.l'=:⎛[*ϴÝ#0y{_:ߙsXI(Gy=/NnmwlǸjLX0hh"gG]ő5x+[le+[9H3 #?_bqm/'hS+i@ Y2d9Gy\AjBPkэ08@V"ѥtLv\(g2C+db7718P`[zڱ/n:!4MŁ(&%8|g!XhfP [ Gvw^w[d: d ݹ4G_&g ̅ARe!V>VI B4#VQ {^:OupW K= f򓅆sȘ^]yϓ? B:rc( u!7zե{u}[40wxU}u\qW_Y_ K ldnSXlʣ@,]Q( ޯWI`u$G 鍁# "'8q{,ɮR0y" B p[~Y5~h]c~P}c` „T{QͯӽW qU$q0PtEx-$NC'RSkܞp;x*t^ jRK~y;jMϒX9RnL]93Z}.W=  Ӄ9L# _ P; #o+le+MKĜ=Rf~hm s@qs AU:أ2v@Ȉ"O,Hv.43FRda { #,T91Z۴1J(j[|&Z"]kie`) F`Yrns1I~u;1\OBG, N}Z dpzŁ9zMPcnud"j "99x@vu ASi:]&(j Z&skO{]+D(LbfI +|kh} tLPӉZ>G!=ގ~r> N^# 5̍Ȟ}B9?t].Z[׿tutw~\^\w}6BFa  x9) 8oaf@=Wt7gU`pWPRZfy6LdC[Z֮J&zoX^kv]uW?33%=\;u/w/q[DL"eg,wT0 }U[t$p_ uݓyW30\ >LR"ìVji}A?|ۄ1/^B_ F67he0Klj!\ɛj:9|c?c8p<ߡާ8ilV" c^DݽaŜ5&@mߘG L!jќC1H K;'>+xI86(04=9z3ANI:*ሷ; &f f4$,4h , x tc`RtVfhd8f||ƃr<s,:ozLӂ[Gȳӈ-]+Nş^ ZcC9< xƙLדq.(Hx)"ǙԴАQxj-)P_*t OHtW՞uxUE#W@K Fr O(ﱏWO(jHFy3Dt,[}Gt~h! H)Ek68>\ }= tOf+=u 2'7`OtF.' : 4]ɾ15I?,(E)sDsvf>sqq$Owq]޿]k{".λEW0P~[4hyoW %Aƌndd0ɨƠ _p)_v9XLWK:X;Nănlr&=~cHW_@ߧ߾醉iL9 Wj߸խ?ʼn)>-l*x}{i,;]ȎCmSzquVei}QTX3iHKdz3gAmӖQMn)p5;bYtw[WC>miHszu\^gA^?2Tfs"@d=kw7q.AAq) 90wj& ऱP9N[ڑj ОOuwS8]\΋ @&d"Rdqk! wWcca*3WNr~<%ÔOkݓ`ǩGd6or۶ VS  8lvy%,54&1ȹMޥ8!M\1v_Ò0^saH~Cx-'^ yOA.O-s'^ FX'\Y -l60-e_yؾ'^ze`; 1}Aw4@8ێt-"HWƐE&KylWҀ+Kw~3#jt` 3'F;Z9L)A %<@[ v@ ȱS4@K9e_Յ}rȑcٴh@2jc_&[p$.}>]|soLL@܂z$I+?3%g^* bm'cј*&Ll1GcJHz): oG&(QMվbZ>f Zda?ϙF^Y<:я}4p5= |g?(z]zNl @*TfkߡK~0J؜$B2Sh Ig\ٱwPkx(6 1ǎ*F DPYhhjd' /{_雷sû-;)~( :2I&ZO..5%i󼇂eVl+S1uTc'}2k_,m+$Oן{H 8ђ|[W|nybZ./t^++#givP9!OhDے$B!\OeL0t2A@AXldgЍmti f\* wֵi팛gO~?}@>X䄾^SuZ뵒ĵDLžPf3z?cjDO?.A#2aR6W lVY2*˜MXaHBt®z(LEx4#0kv\Cw5IQ>=.Z=r fj$-ͶS"i3`>ad k҅[Z=A6quK?M H[3:"c˕֒}B'mƾfLYGtpɄ MKk0#p}!gt#gg'hhX9Z>0̸-o^[}zE6*@[U#4KGj8&Vw/3`| 0Jp~&2~h#&_`By CfUA߾vk.s$/}-AI [ZѺv._ŋ6\O2u,LNR ?&s-1 +_ȑ<M $`'s@ivLQ6Abc9:in[}6!zA}{F>zvz1NxUAXXCd{~V7붟X}me+le+ 79 `Á酱(?c1Pj43Q"rTP%'՜T5h@_GJ\$1-2;ބ)4INb܍L=Ss絑}QjT- &38TȘeL!6ЧĠУ])įw󑚁C?y]"!qĞeֺ1 to+? &(5V PTu 쵪 .M7 ZW E2;6{Dfz[Y%/u[uE:y畾kD7ͣE}\?B hxb@Gye>K/Fn -*PL#l4o q,O +1xVb =l1)zo9X n٥M ]~ʙ[YmbU[tGgf:>ݲkX>Df Ѧ]7MHFq$5M֦c2$Ǻ,_R+}z|뺳zıD٣vynGŵɛ4ݼxN§K ]L 2Į)Y3{)y`mj)&֢|nݤ♇ɉ՚J`1ظZq7\k{=n 0zH젡~^.hu%^L|q9&x^@ަ/ǜlVB%]8}(=)1x; 1bU@0"G`3 'x6sEuOd*7{I>dن> ltC\ 50h`҂v౶0pwgO6vTSӜKߑ}P[ ;*1hm\Bpm)ꚢu9g.bı *9j'+v"h0Ronտ?Qݩ!hBnHA]NJ5܀n> C]D[_X*8u恤R=tmIwam~3E5<c*Bo4@W@l&a(>@@`"0W?#4f {@`+-ZKmY\J,:OI19u._}v.֕;3_fSZ]RstytN"PdgupRIukSQM"X{iN",܍x> \`2QN2t}X>{:F^;5?[qGtOt!&T{/4S3 9ZrὯq2Y"N%[j /̼p~OsHwc/)& ɥ(v i A|:ݍݢE-Rne+[)TAcW]i;\pj `FMp{ Z:1!r{;+[VAt1'' P],lH.k͵4^}IPw;gcd:s ӕǠE/^ u qO\0%_v'_kg wg:ҧ襁7HHPPА~-Yz+)6y.0&A] Oe C:p__0-e9 ҉m6F7J]_;z|wb\`CQW2[1-[kDHBʹ_7n]Ïw.#1ɠ85 ۯ+s'Ҏk 9%JJ7{yҍ|v3eNv+&TTeBӇXHhL7$O!LH{&(ks4b 3}o`(&+DܳidۭsdwKl B:%"6ݛ0:ZËwKE໴yNwrK׽=|%0bu q1m}Lbviq֓8 hl2r0٧'0^_q(Mlퟟ?/ $bcV6ZiJ u:ڀ<%؆>)=v4_ m S<׆S* B($e nT +ǣo|Fk܄Ua3сn,gZPdaæC[le+[9p?Yƭa22 h_B"A9sPa ۀ="s&Sme0hgӠ 9B[pΒApoUgPd[aY- o&8mx-GMnvX6 XBm1n7vnL9y$8KtQFBp] pwT"ϘFD\`ݒ55zfPʎ`LD Yd%\|%M nрL˔3 `ofPMC0JLӺ@)޿CASo4Zc1ͮOX<|Nb0gz(}8=[[w>oF [le+[9 0r^2{|rA(.>﨓Z,QE(JLk.^'ԩi'Q,k(%iH0ǁ>ZgbaȨǸOX ފ3N* hF``@wV\N|zݢpb;e z=`Lݯ;tE^.6D,ȵD)Sc=vb+u-'7w^ݺs馷 ϰr :˘AelR&yl"VKs{PLncy~vՕ.u}Aw)9>5%Ɇ b=oޯ˿0H g iڲ| D<\Ls>Qd"FdL v~\g zp VS4 1X08ZcI3](odr L\x0\@eO+N ٹ!-:3~hPiNZ\ ΌÓE&+Ik5`3(K>$=yS9[#sBqCהfd.rs%טn'YYL~δh]7'e- B9T{m\-Z7?X RM; &1aǾ;?[Wt&?0\^&!7uV (G2&Ox✉ ѪFvP4"C0h>$d ؕj*DN48{bV;أ=CH&>']s))ÇDtAnT^bsыz']O`rUQdkmFi1:є!Uf!A۳ȐΙoޞX}'uҢNFedg#5ld;gVtC;bn$>m_+4aS,k&`W^`}C_Eإ*+<1HvPW._"lVB`(f^"ZL5dѪv"pG 0$qoքG@(pp }Wh @" YB GD߁sCh1H#fcsqxyAD>!h1}TA010aѱ귨2멵 :x{8.0ȏn€n t"x|]B_~F_?K-$#u$:M,H]U+8gNa7 O\ȾF^ӿuŻyHNC. 0XN8)4 u f݆wE JE E2:g,+s0ݣ(؉< ߟ,pHC jڪ邚+)yP&fm&oQ}3+ga5}k6Xy˱u7خ߆N,3O]=G0gzJmj_z ؃T^QiW/&r&]-硸 uyF#n CnA?u ۳JٟASciyB?P{2~k >NIϵm[1ͽQKr~3U6˘'֩HMSPTpK&KĊ>I5n4Vqb]YǁgY g:u)1ZKI=EK[le+[9EJ#w##b,Nk }>YTIp[Gk4MaH+S Iε'o;3* Q^{rz3a5\u昷B!:[u)Btb^X QdM1:6lPK%cntKw~OW][E"L4szݞ`3 3\ Zhږ9:t]>]מzL?+?Y]w~~ٗ={xeq!˟+nM atּ,ߢuu2)K?tfc ؛f " ">90O~]KӯS˜50-t=| :T\)4+G 1 3Ut܀JT@a9 6jLҮh`k9Jhܕ'i=?U/:=?:|7qٹ_뺗KvLYB[>d!`R9t=[3V)dd c5]TܯRI2 & '5i2lLΈzŒ3'zw'eymg`} dlϠOՐ~帾ޡh &i :n3>樭S.2wl [le+[9 O+8oC-1BEGKL3 s"X30x}gd+@p=,\tkDaPT8HL\= YEBF-DtF LA ZKO70iǩV`P@ /\(m# d Cz402pﵴc<:>e;&[?2L8V[Zu=ggwy'Mxx^3i *ON)ˉJuS}-N軶4Uڞ.RR*Ҏx.?SF GSD49NU?8BcKF1Mߓ~}l,|ϤAAٸɈ 7#^>ܟ- 聲a(ʹOG"JUv itS:M 5CtTg4Rs=YډP*)AJߡ˅%xdzu/lP!0|bT5]L@?מ5L7~2+6bڱyBq5נ\E 6͝WNg-*-M%8_7(ߓ0{䓟pf%4 1Bgvi(e6jŴX& NJCt3{me+le+>TLxة N5F[r 2ġKU>as* :kX>ۅx 7o[9|2XWVM9\u=oASf \Mf_!H_'H3/5 J]ꬹVf+ЏpI3=,S{j2@@\f#܄@!{ `A " c'Pէu?e֩M>a݇fLRxh'"`.z#PJ.-yTl6b^qa7 @p^@jBSH%6+ s^M]EՃ0QuT!&YVTk/V-bne+[ʩv@fk6eo^јn!+ LA&3 ̣A O5(jŠXf3 !uc:}Nb};~iЈe7F` Lܣ[Zţ4l@XY4eMtzɶX80wRy Tt]4hԲ@-ζL^ϓ0* 'zq..OD;oj̞謽 X:H.MvZPŃ2P3L{+LM;0^؍\}Tܢ &), o17' uV%w {Rm^Az][&)/!ȧt1 &5E6#B3qAT+7kUmo4 ݶMє }/t#&7BO[ոC :c+٧{3A :5ݡmNX]K~Maa!h=L{8Nhڼ9 W \21hb-n~R>8O4ߴtw-/-,n/lV6p+[VN"d3(TBlaցEbr:H1 G4^"o zaQ:307/+`<.fYM S3r$Dw }@=Z1׿F=}졘sx ڦý&f&8'NVcoϼs|-2P R+ MCuLPk-h!7QƠ:1LE|u>a9ɻK1x]56y2Y Q3VV`~aẀnC639j{ b6Ð:́->u6(u3IpLi$BFeȘlG7QRc0&$,s[1˸]C{6goO)Ebd>!4bh0Td)$HNtp >5e0SHu/NCutP>[]zhRqQOܢ]POhJR5PIwf`!+: 6 y{#t J"_'g uKЧ1s5ɵr%KsV#4O>i "=ԐeM! _V]u6bjH6Ә9<:P{>Hv$哖jܘvߥ6t21N=8m'OoV6p+[VNVԪi88kT'̂c<f`YLh%⅁$0hRn:y,tax z]b:q4&*'4xxϠׁ8>ڀL/E.+v؞ '80 A nިo Aj0j1`/)x>”d<S%w1 ȕWzz:\UOj\^YCucAJ'.2͵b7HDTAQeGo#}?=/)'BfYYsXOuwQWSA) h1Q#+=^w&Fb\lu'K kC[;,܂T`b~De9*Kz"q'v]}~!=u6+h禺cߤ}t󯥝 P{rVK @}`g6@qڃ:j~ 9As[^@@0tVۿA;T ٭{7fT-fZ ꤟ|^c^&HɎqs@\yGwn|SbFu`G(L7@5DP/R':lelۢ`'#҄YEԏDlE&y'eT(q7F'f"h>h:l<*];5p&,ih3TLNZџOHٝ9$ 1'N 9N8z:0Oܵ4,# p 'gSı9ޥu)]QI]X/DӊwX>݋"WEj)lLQ~9.>!My 7y13@&ǶULt B>=U&뎍=RcGZWPsl)|w;ȨM{@A&dJaRQ= (EPIdFRгa͘D76LSsЃ Dtx+.O N92T !]ꅙMd`Ou:;<ReT |:Mٳ4xg)OHצx._ݚck麻sRa 2]] 4?m `gH@=@80{ыz3ݼbM`2fk^5>Y+mː`˞ia0鵡'/AS4<܇0nF)e80+z :'eZ Cvע[򅋊le+le+ߦ'Xcb3dфC .fn@ed 1҅gjyY݈}vBW93Hu6Ts?ā@#h4m C=yY4Xܥݥv ݾR%g9f6?gA I4V;L"xy1Qfqh,C#HIS$~*E2Xݏe:MҌcWll0zY:#vuwOgץqz} )yHI4:@!X-A>@\]v5]f CZO A]4ZK>(\N(=u]ZP!m# ј6SOG44ԝ4ֶȈĻ{#YXu}tO*8S x'6t³$N&w-ۘN?YVĥgp+)iz09r_1=({g3 L3~.D$OUyq`}f]vk=X$\s܇1itl 8L| t/LjvJѾ>wr5"+3 !zZkI>dvHGS>5JQ[ZyW{ ^5 w+ 8uQᙺE|1mel(Qs*P6Y2\(P|0`4zm=g1nuk1v4͉ qnmh!ې6"A+!J D!R-)-!RL8mR7;vR_$رcs}\s̹S=l=k{5s +mˑY) dL=-%-2`PuAcMfOCbc29sᅣH )'C 6\+_3ñ&`~+qL]ƉfkUBm@`[nsm}k'~k6k3buZa8L/>!\#9D|֜hlE;g;6``ܧedmO1(ci QyN_X#-23Sl" 5՛K 5%1XHiSziԱ#02Sqx]ǀffFidgˠ FfRDz$K8]`Z4g {-0cJ1?klġ%۫([RըڇZnzh,""xx?0^{9wC\ h}Hd` {Gq'ܭ2vW`Ǩm9HoV8cQ擒[E_Z%xHs { ;Qִ4(-l{Jr2'5c^`cJPh^kVI, 4җvgtJt% Eֺcf2IMέˌ(|NMN!FH ʊd~ƻkIvHZTfl<&J SQ_:#jZ(JkoF};+fUo~,:AXP"S]vn!~p(HYJD}05.؅/GeɉI)8@k^0~>|Kg;lg{|p 5KqU&nd79Xh&ɮLJp'\^vԂшU4!{\TյSEf*=aIŮR\f%EvȶDodcXcK>JQg j -ZAvK.wBRX>bFVvoϏ- +c]Y9 qc6pv %1wWsH4MIc<'R@Tm^%hv=G0l^Z e(15Eie68-kNi`RcY.N 鬀`F"ѽо kCՎB &k7hw g Ҭ³ZGᘑ #G @Ml2^=jef t v* |[p:=PC6˰]B~&@.>jL8sdPNlg;V DMLтwtp64hEuֲF:-1<FZS9p TnuW=m"'d&BY;~2ts]ɬRUQJx 2ʦBσglw \MJGMx˳[D]-UMb >}w2~_Y 634wGXv܍>C"7ø$N4*37 S[tf}fZdsN3qFs_/p5/vrFKQ]VݶN5M1پIpjӨ 4yo-z3(\:gscωA39{rd^ NR#CŌ/'(wdcDu++x6{({v_nL;`, 3&EvL|R'HewaM]lFHFW̓zՓ.:GGlL)c gEFa} 6;7zJI"-[sd5X/te5A:|'ˬ3\"wd{6űn{dB}AVvoVnI>|_3 K$yRV-AOTW63p-M+L :J!W* K|CNdGFtrb5Yt=dlg;sk60L$l9JdrLw:4 %5cXF)J8x̮f͸IŰk"h@Ja ^ -"=c/iRia׎/;G::K;p\$ҍ4΢1i1ϥv.]sMAn`,'oA[scN-6#HOې2C(cgT]z*5бk.+JJ8}-&" k{z{?< 7^;>2EXes:X.qikX΁$FS/[E5]q0Q̣﷎Dd5u8FļI36Q(cHx3csewƇ>31f)VU'L ,42uS:9 C?2x{g-^Pt^*o+ퟴvvEG=6]Ysy7ި\|* c\Lh[]`&L]s=ML;KH5ymX̳{C+ƈ]忖TrNATU@8H=j |` H*祁eDtc_A4a|Oh|p5N =\@&Co9{*% %bl?x3dt|t ༦E qKЗ---|rB’ˈO*gn (k *~5r xX< JT^p1c ܝ5r0N_Tc@g qsU)8W o_5^ύC?8^bXX]cNF%/ᵥ98v&k֩dH%ZRw `dtg-p{|YFKZsccl8w\x7{%[0|UvLs \30]j(%Avl-Uf-AGSv~xg.IeVޙX XJUú d9$K% Ұ?ݺfGtIu/ib %懻VĿAc}l,]W{ӹ'i Thm7}xKT޺+F.`Z zk l4Z-s )!- N6Yf!{ǩX(6$~'P>aU+*o[z%a )ªQ*+wlx賝vPvbEw3_4;c1},%BqӭMH?Vz&oעI$|vDw2BN/=ZHj!7,N0™w.+RgKuRkvvo#_NAK5-{pdD6~J MBBWҬz` ;*5?`KO6S".ҖKJ, ǽE,z=/o/qWppZ\ԉ&w߭若 <ŠUI؂ c3Q$x!w7]n1^yƫOr@H`Y`ʥMZ^=7Ͳ=VK]a$I vE;X{6n*+P 0W=.`֓gf湧]P7FHd@p6Ãy x/D:,M@D m,W#1!0:!\mFs֦bɋwg<c}c\>DCUCE4;VH0gJ:.a[vQr_ VKݾTE1Jr/]Q'BHE)UyLjIoQ*+9kZs( >8f̨Uc[/<NЊT=͋M0&{Qsyvg;~ YAb/H}e/I#U[`b&Y2(t̅dX-f,D utQwˬmgȔrZ]؆ɚd"QXyft77"Q%\d.iJCJSU\eXg00{Pac*cZ Crje} E,׻k`е-܁Ej`q.9sh;X6/i9pͮdGâ+0Ĉe VM*~KYb .r2kx1|\(/~ۈk ] ćx%UChe{yq<w_X[Gk;$. n@bd2u3- 4MYltr_䤶D06SáEoN׭ aH vv.z2vg;x4VҎ$+?w`X.uPwvcN[q4ZtuUC:HL{V`gZj! -P12J3fi"-Lw AnrʎבNr%%E89bAr]lRcR4$捝'&9,fAJlە 8csQ_(2M0҉;fm) ^c$퐻um`2kHbǶL1I'_mW`y(7!i0B-9BqtOfQ/b4omwU*7mYS=s30H\u/ %xdם)I@<+1O[iU2+N?VM떱o:Қi]yQR:?J&Kdo92T3IDdX<@Irz29>:v=MMVcaXjcf@zh[xj|{91LfS*K4xnsyW/n_\k$ _ z鹟W-l~UZC ݃n\ymp=pS}<{U *9,VibăkdϏǟC䘭xv=?/y_׹HZ^{Qk["R,ZWȮ _V^!3QT6\&hJ;PX+ ȿ3؁E6!3̼;w`CZD11. p , 6 OC0 .MÉbψH$Ru8Tq@?MfA*H˷(%T9.qB|&Fхx1 _ㅯ/xa|׵C Ŕ >R?cЪ{/HWC˖.b0΄,M)9qe3[جGg~jU\bV)(bW"%zķ36T/Rkw2ctk-Pg۠n ]f\Sgz sX' l63{D6%)(Ʌv5T[_FwY> Vگ`Pxve^?hՆA黹h*hwoso~xƣwIftHB6ð9l&V] m{BOÈlqC2}Y#tTkӿE/c~kZyzY.^?yFJg;lg{@ 3-$%#`Kr{ewHݭaw7>(#ADTHC0&9ˆSՆ/`CBN WKd\l3gaF#z&ɱ'%@a E`ӽYSY@Rc p si. v-mT󜀉M;CEZĤ~0,a~H715Gǯ)WP 8;sa|`<7=sPI<.L+Мcω9X@}!,%$ߞ._1%ѴDI[ڃ1Ɇe>q7irɂ-1klNLRNfLsw~>,]%gjel"1)8<Ǜ(t7۽!&0'w,U~#" \uH4foKQMH,&,-n"Q$iuqF"ރX79x? gЭ#|xk- 2/o6b K2E"U݁?c\,݁bR:n?C59 s' ߐ&s5Jre 56t]X`f4:# Ț_3l}R%pA%]/r9Nlg;ٞJݖShx.nJ(ȖMX_*@fA d+e\rp/ s6gcZ%p12 6àS^ccp49[zc@')tucg7ɺ@ >GLJ_ *C*I`璂Nst!zN0AA{J= :py)#*XQEH_4vb@Ht[^%//11uf eu˓%!/.7&@Ojw]N@Moj:g 3x|)t5r.Q#  .A-P&FM>*e \KTM/͘YuHj]hN@B3TЮ8^Du>yqR'W^οY/vj!Y,]t7x6n%@2&b5NkHFZvi"eJg}uئI6͠҈J3Ѻf *UX^7-> |+z=P_?<`_f 3{'ڥvqjp= TjCTYz7hң>Y`fIV{h)^&'fI / 6e3$!38K7rw+vBN:B,3xp:I(-!DrwvG`^(AF '|ܕ[+54=-`@\θ҈]%¼c\V?.`wꭒ s/K%>n&Jtx KW/݈^mb<αO?5M23v`.3 v strbuqCJ,Մ;g?5i1%M&;Qs(  r;ײ49 _J8ͤ1{f =Xy 6ĹKxxu?7=gqH(4'x2Q`E$J-!{9'fXqoډ?3qBVdu#f.栦Tsyrk[p֙a~`k~; lg;cZZ[#W֗{>-4Xt(S^xRmˇ(4L8@1cDaizjr+@LcɩM"$㭄l-ʔe Q5;!mAcT]..,-^CBw;3g-0PD ew_֛LmRYP:!,nY}CsLgoJ, "q/PĒʂ7x5 y/\A[_w/gH hT*4Qj'@@~)C@'%~e|o| mrcE%@YYSn`XyEm,; 90 Ӛ vT=QϦWW.j,~`}x:T&\5 s)GۥćƓsEW/ÿ0~f뱌Ovsc H0!@n`fvT8& (g5f6qGQȩ9x$Gᮝ"Dq?XySl8Z):@"2 N]A̘nt~`{اku_4֗ӝGj]a'3 @P(yb3?;^2mTW|%rD UoϿlDP'YxQb'[2M᥼T\a;Iz"!$/KӤ4>i:J+~X=Ժ7`V[zv_9/=hsm\}F4g럻ܣ~>'l'xlGkyIaPr6LmlzDDUkk4ʪhK;TId$'i94=@ՃqL)d;מ}ߎxRk s3pJ fʙ bcs=ޭC4j~g#N4egJDwa{ :t^ 5UW"fWq=\~@CޑMA(pȁsFq_wK5;vQ}</N¯7((͐ӗYQe哮ɧϏy~n{v `MCz} t2ʼn!,l 0.D+c\"?fa})se7 7ݵ;\}%&KV8ĹK'$nv獊=Zώ t 5ifPQpLsz1Qm40@&Z,d%t$wُFv|fX`s%lUB|qߘR:ϟclPx9R6_-zwYh*~ѸKcok"%>zI; t!1$%n 츏,pgFI#CB kN}A1|A lzz)}>`acbS=<B`2C/7gt1b<|$4yX÷"94F@x5^y^> p`ݱPv ^=xQL x_]0,#%P-5KZ$ЦΰZ,|x;~} N*fJp@A*O#b+/#ske>Y6锒"AL\%-+80i;($Rmi\᠐"[2jJ#5Hd&B۱O1uǣre9˺AdcTKOIlѪf<{/?`%(+Fӌ 9 Wx^2^&ID<[eDe9JA*JJD آ?T q N e)\jԦ(IQ1k hICD8[4>V6}:7҉C崒DbmّDpE) kJ @!C`=2ո23mm 1+ =ٸs=MEnd7?!W C<33fO&U O%[½Is %p~m+Y lb}/O61`!ZT('f 8ŤY~'0icKי9 AlH (ٺrŝZE>f!fx" ]Mx"HRE¼]c{Xةyx$Bn>^2Pέwّի6(Up)*+\щu;cz ְ=u0Pb{))v acCR஼jE]ʈ50nr"ɖtJ:.2eTx|^4~4v1pIy(5 Gn8]Nlg;N4;_$$ YF1Z6Q7PZb2+NB\VcP@F[Tk8اee]kQ* D9F|opxWp^;Gi!* 2JnP޽Vd ٍ5iv4Ti @a[>ܸVLR\R͑P3w5Dj3c6WrCBݎJ!~Q'p.LOc 8B3^ uH^*^qN4NXndfX&JpsYD D`{iʲ`-gk*7`kY+hEFrAܚ#X/,i'Ɂv0kيKһ* mj~/xxo%I}(D-U,'qfIiB̗cb.>U uSc[f-f& YTPZ2}x_E%F+1|fk}i|M~|S} vn.U'dlsӶ TJMEd]\+}Hh3"M!'\'Ӣ/ڵ?8&6=L`NA(S&%VT._Yg; lg;;rU*1 vTB^@v#l\`R4ęudF"@PQ̥ A}G,1쁁tƌ CvK& nYR^Q rb+MUr oUC}a"tOy?ϑpvg,>+!8-9"`>Q)ӛI1UX$=2XF& GhAdȆ 3)qDcЈ\b{_CɕfL+:t0PV%"^J*Y&& T {ըU<4}<֫emcga),M.A3hfS4^KȽFo-q`#ē[xWޛp:(7M|牤pV]=]hs8vpWMvoR-0/BDnX;rb*JԕUόGxSt 5^dD/ 5$ZSV={/eBѷdC,8tifT5X c6tm><\ZaA4,ǒ*xG@ + ?`V4xόrvqFaXeʲ 95)B .;2+]CN$H 6c/\\-w4\׼BxH(5q:jk.4'ndE4rՀ8+_9w &a?~ DɘLeE焵?owc<0IB`7pu\c01[ Kd:"e(9$~I y܌9]ymyhq `dAC_u:L=gi!:gڿ;~)TLK L>m>:~~r{w@4 =}[Xr F`/^%k#]ws(e*i]2",1 1 wǓr߲RӪ4cgjNB\wǫ7e757ҵPf~7db03{n-v愆K@xlAl;B239JR4.ןY/y_1W qc [grֱg6cZl'xlyY*;"K!D gEPeNCʒ;ҕa6=2 m`__ZVc=8g\zۂX4IYGxL(QP ;@\܈H;%$| x)@ %bD&=X@ SgES`vՒʋ%-ޣmY+}BiB`@QskVnڌd|2~5G4iq G`3 s+C_!}/Uf1=߈B2z5H΀baA,5fNRvjt]fR>"\)} I ne'L FUεSlE_G=t'r}yM&siD5]Rrip_Z1iҘ\,(+ mr*ߜwCI볧':.G>w构n@R)d>׿>+馺Rb6JEQ6jX,V*4N VLMxݵJ@ܞ1\MJSuRb7z9Y.Ʌ{xD^HxiO<~>*E?Nlg;/.9F?Ԃbvd HK =og=tAST\9jzK[zw)ntr^IwkBMp,)[;\,s4w'U'H?# Df" wϱlze/6@rɽo3jfR#PC[O-pZDŽs Pp1I<$mbܚ3H 2pPL Ν dd3Y`/a LbFT% ƾv|qi0݄4T OPr=%~N:?2ry>5[7g9wI݉x**M@#.fP$ z5`D 9AYҳas=H0C9c8FB6'#uS&Ee8,dٮ',疔 \nΩW]ebT,je{o?ڎi!7JCM OW66qW4'%w%̊ZL \k({3md=5%r8{1Hɏeu2BI`2C UmSCvQP]= 4wOWnwBL5xr9-{nc>$Rۊ3m>=dhrq!G lBU gF F+1; 1%xF;e5sKצITYJfoRR4 jcv}v|Ђ3Nggc>;x+;zա MZCx62<7\.q] ˠݜ:O(1@=^z}1~qZ}3H{;ob;,x%Nv= !p8/ mYA)ف_C/d k`Na8Sʀa\(J՗&歩`` L KvwfVgBcPɯjb6>n} m[*&X-=)Xmw;&)r F `;@wTג`P UϹG!HnY& 2r@XQ(囖<ǧa)x2j\ÞXrR$.% 0 0x{xKu1(lg;lg{\6V 2 =WsL︱U}Lt+U5`-fem:E bJi݁2 U hуơ q]bZ[(-@Ov]EmDT ,ȍma;ho7%wHb݁{B"9(6Yj8T)-,ӻPn,QRnt/IIǽys00 4P}p6iAmb;1d Dlozq><>c,|P^d:sYD_s|?1~4ܽvؓfvẶs>}4j E8$% LGh:itM6V:x,$!r%FTBځ7p13%VjtpONObi%1ݠ.f(2%YJnT ةP(nfK*ed|M iA1&ϖ-6x`4 qca RE,}ºJ-s)We0UzFZX_6JA Nv`ǎp 4OygJΘ3R)iRgfg1L3E=/0>7RيUa9ǀ>B7eWApj 7 XJ 7o'ѹςq\"^5ȇt4qVb[ųoG'cx WUze9'Ozpe۹́gy\wnܕp}BZa쾵\.CLv7f7Q3 `mx}uѣlb0&S;A5 SQB-}4\v1(pJ;_טPg`?cDr0r,F@mDiDF%Qg0ڑ#V\⨣1iZ$"}7r_4T]jg/ί؅_BHtwtJ1{""[xnecyN%řzܙOz`uwA`Z"kE -\zay虊pcy3G7޺nk˼x L ]_I=7+lg;lg{&0pERi |m{ k%PC?IJVd̠`.(}A$]&@Ƀ]Tǵ]i/8=;Yl@l}m-^s9M/[ ~ZF"~H%"pV  {w&iKp 4wf0GN7SQ)8gv^D&#DP;rՇǗp|x.Xcw`ǰAЅ&/. MHAPz% I-5 OEd M<71AW*4Tc/ 친8%v}~̌@MfI i.{cN7/w+4x&bF "-ɾ*Ϳ I)egj~9} R|Nn$IjV(ٴWJ,Dc!Ahx{Ɠ|Gϗ+%̮^bj!ܕyU0Zp4*@]I;+)"4>Ւ9L.MI闌oa \N4e&t!O kNlg;ٞԲ[?M.ѱk0NSid. iu i^8")?#ʢt.y?oSdX{>'Hį9d|iPg{rJP1$Z*'F:Ųd]e嚰n_| Ka 0N db:X\# $7bSXL祴\Ok L C7`vwϚ_BH>;b|W!!.?τkj:I.KMy`6lw8 +\ _:!J]Am f";IdhXK$N}̣[d@IV\5 x`ԚN Ѵ{O$DYJC6Q!'%@s#-@F\l\f(m¨3 ɨS]}[5w  ݤ%0Kfcϱʾ.Kc7:#/;竢@v9%~W"&1.,fIhTA %6/p>s[z vOv<>Ikncڃ% Z߱jE7?3`: lg;1:3؀HB.dh/-uKţ f(u-?f bV bD -E=v gf^HK%u vXZa BPL&]Cn#G`^"2 Z?qn nTHqֽK1`OksX✗lb^u :NYuAYG"Eax8| I,Dxaqsl\]:U u@e`-H'@SISq9fqשdZTΌT910RU=QN/aftnх~E.7 X\]N2B_uHvP\`iPXtnw!9ar"FpcV-슚n-og`hs_4<\"&x瓘NVz-dObm./@֏/JRq<3ٟvSf Uc0MK*#XpJZ ̥Rjzj1ڼ.=u\[C\#6j^yb%3Vv$F_c7-t}+ (nZL5y=)8vYXN@~Qs8E&*􌑄Eje 6neuzi CMKxg܅-ԿAwX!O[+-ж=?"e}\uAJBu[,+r0?Nϔ6fqh B߮crNNDfg)Mg'k4 ,~ĺ2LDdJ 18}Oksk(l*w-h" bjh`lZ =3l7m{(=> ݠE(5@J$IZ_lx@?k?ܷ&Si'Ku3ݺ]8vXT4TGLP2@lBGT-Jz޿F&+*wf%p]9t h1g6 L†% f 6x4ZҩB}g *HHffû Gk,z -3@nǚWU5ٶYlkFUV. \JdZkQc =paws%NK_w`%rk,u族׾~< oЖQ H'<6Q_x&cg. o=iQr4~ 3u~5b5@Z)I-~l_y'sKdvh]W= &@9FOvZ\yik\T<عiwǎ.un< ^+RV|arksc]l_,\:v𕙇N@J*(zmZ;ц: NM,PH:Cp~KCHEA=v҇zs߉w?f M&36*V,FTKc/KqFO,gȵf@+塊`r[\hfmTyVGH3ُuY[./zz ؙ͂N u*&*VR}gQ'k~_ bD2sQ*r%H Z~O^alhfuWvi*/N^oP䱯;ڭivube/@h!kLTڃYX*Bo^ M5 %z[lU|vWxcϏc<}5ϩNAs؄Ddr_׎g?+Ɠ<zxi0%Ƣ)|@sJuv1mzȦ#ru/nh%|FokH|^3C(tِ~>=^֏i"w@}{Nlg;lg{5c%AjT}NZuҌɼ+p +)\J .P0D, 5 W"Ym,ϚnG 4xsT2Lp2EN8Gm3HP )AxN.v=L%xˬ5`b &X~̚6Ov=\G/ ,4!Pȋ;)r(Տ zaK`{ J|6 T)KTjtd HĬcb z|%D!usGnaئ$xQ=<1`{lk؀ic6#0z>3NO%DȓR 1 1|axZf/0Md  4ĂN3 7&`nT#`vϬI}kffmBK 8aQl]ako3cccpbS08I"h"iғU=I#UAOT"U 4R iUh6MhIL dccl=3߷W>{uȟ|sョuZJSCF(v+Ȏ+Y,v Me&Mg3/[V AKĩ I`e/ǖ;~\D7a7'q])Y,ތAvmz7^.CĻ4FMk82|]HV#/qxOs5]L*M0OSFŭf"?< U%`΄iAxiU\s>Q4.=̖!"-xi 6]}g EZk`jlw}=+bZ*fAgu5% Ǩ&ƀp`FX4S`EG\f P)`+KysЦǗY`e#KJKѭOdw$bCp%hX-y= P[cSԱ^$I8,'EH,Tf _qg d.?ٽToP}L62z*zjGa:qx-^9.PO1vFatw0ݵNzy03 tVRelqP\KI,r1T'l hH3TZ$R2ξDZ^K3zػ7h{t {'B5$ɪ(bڪQu|ڤGHpAAS=#h$)Jsc0w:d_<{{:NӍCdzFEfK7x1o+n>grV>8?Ep %dekNөB򤞵h+y=ߩ.dߟ~3?>ihto8Z_BH(h[hc;g:9׌s|x5_6&nGЮ5q-h{~-Y ǿarL lw@vN;K; Vm9.hpxk^8$ uTsE4 سCbp3R# ""T(';"7c%iPɍ@Oru,9쎯IV` Ηtm e,4KZD\``\SL`)OP,PPev#1P:c /7S_Cb+h-o]0P2{M_K*sbZ y55(0O̿K` ( =W|7P._C,lrp]tL~DLs܀Z%F[";i,p X˲`1Kvb ֛@xN7;!MIgI}W̅0PW*H%hFV]1*e0ހqKYHz^0{c?5`rrWWtbDZWygx>]dg>{@s:0 }3)48+LtXr!L+\ßCuwSᒰIvi=VM"v ?eYta!Ad`qM$+Rʸj9"h }($PH Z > cEs2 SrQd Ia/VX0 q1ޠ )MVh ҁ 8PZK$;Y[,3ߌG?ޱxf :W %qq!ߌXeaT,u%QɆJbf1â龽ir!L`/9 5a?k11bcH%ࠊnpaJ4kDTbD&թʱ؍a)`TiK"0p(HIOe :5%O$B@x{[Ch9`熠d9A4jZ $ég𑫁[|~FWzܯ3Ը}:;s. |O~ ex ҮRevLͽ^A:s8q7q243uiu$ ~0V!Še^4ɫ.< ǿ{y?-ݢVK.aX?3X(`׏mm}ǻűWfdgX 2&@? H(y+]4Hi񽋻8=I &WS8r k-&j`r6X kckN-a~{L5&vi=&m HRCռc0\hCִǀLA6Jld/Hkn[y!`v.N+|jxMȢZ앴4x-iƃ eJ+kږw Kog+U^|]PKSg"pd .gM 2PлKVAe[\Ѳ?Ԓeyrdq)#"Ҫ-sMrAgwp^c 0nMgZj0E@Q׏ vnJ0'Y=,B  8Tāq DPR-=S4 .䙕r6'`ŬI%Rg4|s3\OxNYɤ~,J9 +^?+4G}hOf>B/.|9= A><fopR1y⮭ٯn&!$c"w_FY_nWʬ{eN;Vݸ\0D)D0zQW O/?W~g|3σb*J%nk]ݯm8?2t :]i C_+Q]Gb!%.e>C5iN;+8_F28hDCS%gPnjJ\eq*hʥ8l}E&]]<۬QQJTu( +#1tlJȗUkY,gDd߯9+ђU k7#ѭu5F9d"~w0\u 5RZ ,; ZLOe0Q]>e櫛B=}`Ib#PnXF_J%@AN@c);Y( ;f1|j-]/U`_o !U} 'Kx F$5w`*C@L@OivyL28c^@^Uc ,@}u#_nH\_m.' o7{)X09gHݨxv弱;W7wZj8;^EF+Nek(E@9xhx;5^u{>Lo'弿?~ytw^@tye_ak+_|6*$hcuc"o-ʃR`n */~G?K̓AwC;vi_kd<. `͂ tՒʩŢ.Qw-O\HXK常^ :e[{m-5cP-F\M9HgR ׉;y+fZ)r  h7{ZE xi[_fQF+=:`$❼fbV. |1W^)H:~)DY<8sszW |82dd~NZt+Yy` twͼb,DpS .( v0s(,T D*Fȸ((ڡ c)#Zf -, t:R@po%s`R}=ki(QmN{= Chkz pM3ѳdd f^Ựm5؎-iS sGo˰!@^BcjI"a4Z"W:ѓ_p=͎}`VhBcGώ߿f%rcd szIHʳ/4!drS}ye@8k|?^y |e{Ruz-$@d,]Hwt ƖF<i$b]1y =Ym],1`´YٟvO;Ӿb^T_1Sx,]L\J4{n;@3RtcA@=HJsSnsZB]Xi(! ,C֊ :~>(WC˞|kc{8-k0:=@ r~7xƙ@zyY4*#Jxx|m ؠd +GVMɠ/SƫX]{t<%%d/_'2H*-3ݍL4l,Z.g=`OH.Α3ַ+pܐ*ވž76ݡX``Uҗn*+J=ZToɹQvΦD:bi%ję1 .R&eg20ڼ pۼ@9 SlG4,msgO OO$ᦉ)QhžV˯yGd!70%bz|Uo4qrblw|Vus2 (&yZ+ S3$7 #ez8Ow6_wZM=$^ACv.ivkBW|L lnࢗR,(B01R4IB' tj)NKr-ׂBhxW)4084RXi!g(DAvîX.`[$.rwJ#MUʹ1r[p6[*:|1Mq:4C؁j5eGxCsk"Y+ qpݎ.w8I1ӎXX|߃}u2OGJ.yZa% zL& ݲh@La !*@ۄq\o"!WsN8_& S \@N`E0\A7n޸oHxAbA!C6گ X#ALAM'exO R6n\!Z^Pj|7ђ>7wھ,j!@[\k N%ʁ tyucd!Y`LaDiqs5YDŽ\M waZmp-uY\몔jI*oo~-kug:ient5^Ta8Nnxi4qXNĵTGzp'ͶPd*F2GX'k 莃 H0f=-s HЋ \ ](qeV`_H{B 3 wAFٮ?g*spA0X⳱-Y-fRx;DeY+8Ӣ9tHR(#B ;@e^w`-б-cΘEcٗCTHK80!KDHWB jH"0 "91$j{gq0&K{hd2zm8e$*෫s+ӯrڿ%^ĂјP'p ,,'7j[GQ;ƏjfÜgqyVtH@P ^=[#E~k%́HY@m>V9;gBYiyXH/p^5.;z:& ;ۖΏb<ϡ_?Ю ?azЖn!Z6wc٥t.m6"1צaVN xp1Tp\D1F/62X<_p|\JUôa-WI3_!cvk|i|3,xu!> Nw}-nky0i9|@i(M`<"-/NVz S 3k, y ٢@IӀx"Y,@%hWh ,@1v` @P=gFG#7c)* qP:3,ݏc'gN牗`5t 9wǑw#TgYS偎w -7Ti΄jBmܫ7u^sw1xnB2.n$\I]f)L;U9,W7ޑ+B_L@ /I d1 xV8`) PėerwbZe/d9\r|ӨCm8p/+ XiL\K-c^4&pX0PfA;2g`B ԓˋ->&pl'_)@W#g >w=3H@}6Fxȶ-e[fc4N^[Λ bGLm"pzL.lOs@Z^M>>kϩx&/-j=~dm`uN;ivc:l+g)@8 :DP< ?CoPmf= MvIA"?0K(e-;Q7w!W&J2 yBXwu@"FNr!"BA0V TR,,Y{qeDr,r>kh`рM@i;1%kyeL5#nACoq᳄*tODt\*LϓA3J̜lܓW9g=~tw;g9'& ࿾ً u<7ҋRJ ؕR#88/MKPAt-E\lp`nN>v0fM%zwyd̰hf|h\G瞋'aW>P۩*峻tI1z(`o|5vtٜj~_z\wI*;/#[4 Ʀs2MEQQFcdl }c~_1鯺0®5.̳+!isUzDHu,EpbK2pJV|ٚʍeml )$k}an~bW.`3IX/"㮇)$vi=FmXCo P*J1u"A-14RQskq%~E#a ]@E-X:XC@)dVS%` %YO B AhZ6@0!郑II@T8;-W9#× GpZ[ rD8dYA2 81Uen8I`^n6Jh)kƔnKl;R|F=^c ,t Y,(~c']Kϕ6EdzCBK?؉Z:L~s[[M暸}+$b ڜ ]H9XZbFٹS^W[򞹆,V\Nx=kkrЛ(ssO ևlr,@& (m0ܘ2Jv;=!Mc ޞuhmg(:-n+W;w༝h,Y1okܣ_2/Nmҡw 6Tt=o=IXsJ̹t@y]]EƯe%bd& | JY fV4SֳzYC8q}|e㼀/sExi5.Hq%38/]e 6Ŏ8&_{S"A &J0|aZTZ9.ئ\6gTx7$18\)É=4ZZ}t3k Y,CP p`P5ʰ}2fߦ,pr]U~u FL]Ys!b{II`}9Vd@(-+6M8.@:VMd[h G1Li缎=Cxo{M.IW5m0F(F\~1A#r qeDgOS/X-.|x=@+FS9Ns%#oi 90ga.K41g{W9*4"/p} ,2XZ1FSpJQ^u)FPF]qf3 zkύdc ( !\]tpA !ӭZtR*x>ȤHj\oύt|G←.c1{.x%P=_LDt{uť-/9KkAC#;"_u62CroUp5d/8`rss۵Y "c%Jӟ>עN;@ n-"t+~ZVH-] IW>q Ipq4K(e0C #yO1bz+ uO'4*P9B=@-f|tbBjlSݑ%IVч%=3*AdDe+l'!dK2:[=NFa];O %1ㅿ1^@ˋi15s_:/O;ivc0tB4:f) $%%=Ǡ]n:& 7"~$DIy\-úMvxD˿08@ )$wfN8vй|,]1ߡ KTbH/lK_^sPW5 {qu'vUlR?a1i]8vA%gõfwZ%7*0xa3T+UR,VQ D˟(s+>-q;cG" ЏtE>=pdY$p3l$ha_f١}i5ɁH` %>EbdzvC<(S\!\<51%1#xٿwD7@iXox-Lmcgx|p^Ϻ+]GRw"bd ;Jelݱ};|le(V,~j\I#Ikx^Ef#e%yASɕDXsVpUU4p$ߏ?LwvqNK~fIe3,b?qAevt;viA2YbZP)NCt "le~,q?E WQ@Q"4BWІk/Q?[Ur<S[Nqށl1xY믍wއ_ 0J5]ݫ__.qk 9'1ų櫊a#h݂Zf:-iDAگ:pSÑk/WbWƱwT, 90,zT8>/1iE; N;ר1R1ZpfOrǏ86x'mbK%w#|g# k,Ӈ5xzp ) RTi3/]c;lE0OwlJ¬[saEu5)-\^Uh y ?Pj`!'NiXAd^Hg! N(̡/;ɡĮD~afMOk?Iر1TRd2rA1U2ܷ}s ft丠L!!C)ZL\y0eGtRd)<5x!"-${ @ACuԛ\ Fa ewZOjCSD,Qrz8?J! aZ>eƁ\NSk6q QajFb,?ewBǘXb߳d*Z3;.\ ܃l@slXYgDf-{t H`qJ?٨_Xh[^ΞIAq:b0bx $V1wOefXĠ_icriv5 $/Q7bu;9cubKmpuiQ|uͺ:N;\u89q1嗰2w1 ImHp0D`ʼn!_Z1i^k}E/*NEdBo*x 6Qir*uT%[,Ac6!JnWN]Y*DBzf[ SfN@ Nn닅OK(i"#N`! 22r= L #sCq-OO}7IAG f dCct(#'wBI ['=5)5ݨ#vʢaW 3,g3PᮏߙcB@۩"zZ+IB9EipfNҀ f4Uh=tϾD۽Ož"Xxudɲ C)⣃ʕx.{քd-#Gz=`.x5 ) "¹U3 %D ݮѼ͝!/z>f-wF \/YsU =q p۽KD@M)( f`LF}m}]oό7>J3!ӄSϯa yQgvp>vi=-:sOrN$ͱh*JP: 4<,/sB D}Ƙxlj\i>ADD/Pৗ#^3ǎ-9#Pf.tߚ400Bz(o#ZEzh6ѨpfS .MGжKׯCj R"ƀ % *lP(;MrDmكp_wge\cm'6u5w_ 12;F2liǗf8bc잘k mF@ A%6 SD?%ZgƟ%tol6wk@'L7G6 gT⠊ک0 cuE; Sew Y=`S-#+~_'zF쐇[N] v1qhd2A=0JB!PNA K'{]Iӧ` ޹>FMﱤ@R&Yh:_t$}m4i,þ}P~hvZ3=/1_z0'S]x$NPpo~0>C^Em _}-vi¥Ou}Nˉr1BQSI0'/Z*g]e"uey VԢov3{[P;[}1sޟ22 hvXijؖz>&]{k]&)%era,; 7c9Ɯw~`{Ƕ߲,YqLoV՜D o \ιxy zlmTk%x'/k"/dQj`ӗ@YuucqO;ߖAeɀi"r4ʇ5ӢCq9T4ȓPDu/9DBN/&%c)S`Z`Xu|OK>V.WGAXE?ey}@6z8@򝼛{$p,H: `)`?SjI1"Ͼy4UgQ*r(_A1 ;vj4~}R.I-U,9ɌNAw{\Z#+8celB.AaccH@;icsd2̦$0g)J@RȩI[\`%!׋qLJ0+!فn!L&J׏6Iys4>V'$L5iAGֳA]zdHv%u#mkycy \̾le#8ۄz+$4>[X>8^٧bW,\cbcr$7<\Yl̾Dd&!TsMo]5ӎΉ(qtgϟ.*rW vw\\{tẞ^B"xO;M4R'Qc΁I\`<\ @3oPC)!{IEyQZēb". @% &N(Nl4%qkL!#!D H HXzlj.@!v:K(c(6/\=eBQJf@d=wtC|v 7wʭDB!^ eaLK9ЭŒN`7\M3"cU_#6R@ǯ\x-g+'H\hca8]*mK :E~.C;x-E  C뇲gvN&#KE/hb`DocY@$j0})dd-B_yX\Q 'Ğcq4!D*ƒzHcF0 V#o /> xʶؾ~sJtw98/Zʕ k#}~F6J(u:+Yׁ}ҫpvi=h` l%_U~̊aV9@$c^ۭs¢P*_>[05.ۀ.ؓeŅQ* T#@Wڱ:V!>r/?9)'Ƶ}u lN%dCOLFmU7H<vi=NĘk2GVN`ܥ](tr3+-MGB/lK"^E&,,{Σ'Q!a5[4L!GF4*H *&XPl!NbD±т1IV:t DVa[Ko  gM.\X&]H܅60>)ŪT30ʈe^D.`jfFǏz<` .iPn*Wnfsxş1:ҸFzDnO]'[t]ƐN=*os WfU[}x,",t~\㕡 PJeffj = AeN*`6:_$0iKc#@Y'Q'\ɞ)(Z$s{pG +v}2QϒOόTиE6g _0T4}e1i*8 \Ņ+@.HZ`WW.@G~vc?b%pU6Es~aoc)s,^I^W3q:>bjgK/^zǫkeSf'K-`xmh1'ɳl{Pr$9vi=6XT(m_~%"b52M*vtk7R ޮrq~XܖV:w@i؁K\|2؊{X:w}PXM`@"ea趨#ɥ`0"0RLP 3þ iImـ%]9c+i3j_ʼn)ƢPz?ş/0^i_@tė > e7GfgGl-]P,7=-#(U2DPϵq3,tp:m2'[q؅2LP+mAriI cF kci %d";XM'PzC$t n-<RH;b(]%ܳ=%Xl,K*_v1gN`j]-IWбxñ_o]m?~;ql<^x=bonb2Q7z@ݺ}Q{-@:I-> pq<1bBw_% wO0ѡ#Aq.DvZu[n|>yxi,屸ƣnG&qmu刲"s] K2_K#}oV>̗?+F,UZz (#X0NcUwܝ/uᷝK^bѤJ mXָFQ_ `+_9W\d;KfyVa* ف]j -1J- @ 7ssT8l؉'k,;,M,b}z>>癳$Gejgt%LdhLw>dLaOK 75uϦz]`. e6w=W=< s…̫_}bl<52`8ό??Ԅ~z{g[Ƶ}ZRZv/L1yt-W}w%^Ϛ f!ٸ?;W|Ok,(F*j~vt}+LnSIJ<vO;< @ X X"{*%z$ߍz$ Z1e@ZV|@vPGg ܃lZ}p,\x(.|fQfz~/0XpM<"{T=&(1ZqʼR/%scӮb1qs fY"p4BHi+haD8b yUG.̿/_ OUsySINOIܹ!P*xn=3dazU* @DJHҪoGo vϋZƁ).gʠť* Jv8!)VYxˁA<ˁo6eR㲜ɕbwce95e혲*'z^Zࡃn=>ߛc `u1)PۃC%>G&)m3UL9(BD;o:d,]%n?7$=9+c ?vaw7g|M}- 64-UwOFY,_zzlٱ6>qtO7>׏O%>'9.*s,hϢ~âsJٳʢH<2xi48yqݯYŢ]ƘУWy % *8y}z%V!txrzA}J5݆+c*'}1DdI*p9I# Kc/JYB0L,mpea.ҥA6X,EOi'#Z0 Ux,Y@)3+"mzlzNٟV}NK"yu|hu)$ߏH6 2+k*eM:@&{r8fx1\([ "aW\%azoWe  1-fjr ip0:Ko.LpD{ds}ΤV +VFQE'yCeDL.ҒU5B,EG *8 +kjlYcM ]ߡlwUC9m/"ʌ"(uZRbS.6όSoc[{OwNw-ws~e\w\9{zޛ~u] Aꓖ'q~O_kIŤ#c_O蟿;6+X_?oDa~09_ۚMlosv5ZIYεNgvi=.V~Mq%S1؈;j`y)܊\6Ԉe,M+ C[㸆-+.x#m#fޫ{H-01|k mI9,bS `?b;Z0 z> emK)ۂc 99fj K_V)+bVs(3`P}uuV!f vH,rLAh:Q(opG#(].b\q7pBFn.S {~gc0ܬ4-x8/ySKg@S,:Yd+`vDMB8wOf_@ /2){.)%&z@M2j{pN>tmhSķ}-u:2!p]E =|Y,na]0=zC.zյV]R|vpmI;]mڳ)n]ϙ! ;NxoXd""swp?4]2~| w=a̅U8~_1Oȗ..υ7]݉>7c;_{_wV><^~dxecs)ۨU^},%X'~* ҖP8Y`{ef/79N;qkAnzry3b֡\pvFWA+W笟1"0IQC ^߁v}һ*A6&m`@a4)N0i R6 bnő܅Zhy $_‚ܘ\@Qlx!gBfw_2~||AsJ E_|yl^ʝ0HȦEY)"[ˠ ֶ@kFPNdhesyH]%`9s\[sB2 (Wwyds[z{ q}(CݶLpyS;7P]G\`݇V;kb"s 3W7וi^jf9U".v<`爾w$}sB̍ ىS\HfF:Xp{L1u`IpHxMأX$ʇ.gIf95]^ݬ j Fiy ۘXz0>;oPo_ʅ/ f߹xcOҏo?Wf'WL75/<7|_l>f=P-fFEs+*rHZ@vi=7`̍X)$7rfJh;7]N+Cx5W]梶\P)zW )Tέ$D눸vX=R~(6尼X61fIZBsT@٦a(.Qg+rhOHuP̒z7 CMd=Ѡ32v9܍aHl1HW`# `3gǯ/^EQ&.zgϣ1Z\[g)h_5~b,.=\@VՉ7$SN`GLߘ#ͅKWQ3HP+mXFNTɲ\I!Iċ}1Z(sNܙE{2:W}`^ ?xf{n|̗Ƨ0;˳+c_;ysW/c!M 59JyEoKtMiLj %~V5}HbbfORd٘OQ5pɖ{ QAQ̋ϮXI8eY&H+1# [2h'Y9Ɍ];}Xn~_?}U՚^._.Y DϷs N;^ /c_JFb̲1fp#8T` $ 4e]?jb5 Đ 7o ž;ʼn ʉK1 /A ]bcEx[vRydDTYBU_\Ř s#:1}:MͶ#YvKei]LF̲-+h=j^׏/7s8ioڋ<טhS֮e1[3gc@?^{@J3=M\@a;smՁ!ɰ4VkJ|2 Da"0!#P+K v &e05 P.i2Kleksܶ\&#y}od&S)w&S7M"œR8oi{8feKc6 m-Kuo4ƁkwN;viE-9kA-0+.~7cezZw* >jq@-9qw}ȉ1砚œ!PR(sEtb)E8|f q o@pt:\vuJv'S`Q|-0eD3s5a) kؾ"cQ΍T A ΖQ goScG҉{ʄLـ;`ʃɴC;dPDQĸ^o$a(iX*XAdvXW~cJe-\ϕnC{fxn?s Qf2Fa@_R(.cK_{ >Mr/o' z lJY[rm\)jV'*0s #k-37ΧfƦ(Pº`1ŧ#,õG,qO;vip 9*!@ j _kD+w/D$GDdp`0 *Y`f*3 p0IIq1phQ\h@$4NBM4#Q:KdTtxY@I21;|`8+] +XDwt ^  50s\LL\*ʊ#|UJ6w_ 0HpMc5*AuD"tZt"?)4) DܣIčn&ZdYfAel y:S 0Q-@Wj;5"9D>! τcWm3>&HDBwAWr)kH"UL8 )*|ɺQUOp6O7wpw(uuK`VveިMLFpnN V\u31EJ(<0#WyFN;viVcnU)P[2Tr\ T%آhx ʹXgWox8)Pr LQ*U$~{BD*OKV%aY(9<)l#@_J?FKwSAÅ>!WPt"}_X6obBe=Fr d+~qVS/c^Y O4` qdfzx(3 FoO. yJx̓.]T7ֱc$+ rxl $P{рb ŹZ>~Y AV +ٹ0q!d%2k&]di)݁M}ZHg?N(Uٌ<%V1ym7)U!{B6,&Jt`5.4ZƯ8pw3yH_t  8-9 7o yvuO=#Qyg.z8EtwZKk88vis[!\ @w`VH @^d3Tb{,e&jaL6[[x9 >cz&a5q?q(N%wiN;2pM^꼣cЍHJM(ᘘ`!V'!8" NπYFILs[òƝӣ`[g.Ep ůwNT- Aj!qffy&%ֲ ȃ̝2>*FhTJ8pgV=wuAD=J?][O.&"ȅQx#%w :e*ŏǕIת ?;XEo(86}VvOK=DE,Tue8m\-hb_ZɅ4{ZUwM:Ѿ )WX2b0{('ZG sy>qV{hD:06PQLPR`r X惕c߆5C,oO#Zܝ=$N;vi@reg;1`=,vbuǮĐ\0Wn;%U,dyp1Upp@\(%'i45^T ipSYPdNr\;1 ijsP?%$& N tG|"Vp 6:-}rNrFEdJ/-, };9.fz RM#g͢>W3hdo< C8u5pFΫ/ߩM3fr8`=5\?ـ+AH:x(uͤXC޶9HT˯FcΥ籨a䊖Y8/hV"xG2`h;C}dm̸rRH>2XsHDH;BOnop,% Bk_fBg0R]NTqi5>c2繉n޳ӥy92R`(pB)fQ3 _uP[ݑ`(#rQrN& U4#:O(:ەk(3sHX1˙~ K9"h3]'R$݅l.Ҹc]M z ~B,D0obv_eF`(8i:AHϜĹQHČP F1a9 䋼XR7/9þUI-"%Ғe ˈC8oʛv',%L)$J@vVgW: {gCZ8roC+hs\e+nÊ ](d9$—8GaJpYލ-ln[+6]>/9ƞ6 ƥ ;N;ivii-AHM;ӗh!2QbcG*V]\\$f_I 'L8+DD@B} sI"E`,:A(w_0cUZ$#*@ UCds<zN8d< 82S3_fzb7 $}"qnSTō#{{bz6l! Lr@Vѱmq3l+<X^/@:$ hGdG<׾OtcP6Ǻ }7ϝGbkLqK9" |ݸ%7k}ֶ &IC+6Š{/h] )pͅnKly0~ux5$H__("(`Q/|h r~db*R\QVTo[wʦO妀ޛXyivN;^@0s},\:yR T, p!,iR{AEt(TWXܘc{O#K|#09!GlI 2X(d RķK>'5vDҴXSwO |R6irG i3F=Wew"i.0\a V,v"_0]mCtVKTswޯ% *17@B:$'CNkx{HIw季G:@,@>_J\q)y y=sϑRD ,{\=Ø#Aze;0?%T{ 햧+W (~\&=Ka2D` {p5Yd1|b2QDE{Y,8%p=eIA x+s.#B`8ah.Ln wa"bgb{iN; 󰕟ذKA93x:5HlԵb[+dWJ}J|b0CvB} Pqyd9?&@8p0nGCNL&Hn3zBF;iM0TP2ˈ`Gq!W;ͱW P9.;V\-s-%$Uq=9mYCV:8.gLBUvhkO@>О _`%"G @dzz*S(ŅEbRIǘh,#6=m<Nr%qXй|R `pc(]9~iP'zR[t`ݷ'ml>8\r7Ddd%B/e/tv[lYbVhxYmam]gaf7e#F8QtY &?.jdna} !s`^?yp!d^.4/8T1Vǎ>AlA-1e;ސv] nrU?Du,VU+7%tpEI&C;ߑ)U9 rR?|fL &a {#d^"ϒd1 Bcթ`oq!s8Y]nbzhυ^.%dܤ}~j] wN;vi&`YM<ΖvG4SlB>Sm Ϳӱ \1JWA镈\(08BJEaT.&D,؈ 8ZDa A^SD*!,}D[oVVP1Dbr$gwt9+xWIUZ$%|!Mj{Tu3nHmqwϯo{&VY35X=DLQs{_ ,}z}ѥ[ y/G8~\p۱eB95Ő _}DHmŁz59܋ Aql'm ېc'Wėm]hU_H9N\-6^+ǏJ WIJ#tn>K`3Dž[<mulTntFqd )F8Bݬ&viN;ΐr>8qY`2PPT@žh: jgӤ\ )W{ `,u[hŏK<ֿ̘NvL(|rATHQ 39= 9I`U!rWԩƌ\dT&}6   U3p%xVWk$>EtI1^ꂣġH@ fS>ZV߼_`ykVrrXѾPKRlfdx=6XDGF8l0*d&`KeN2wlTu VH[c" e*?:x_ oJnX`qqŷBC|!fb3>e)E:=eR#a3fAõ6S`ԫ[ܝyM@Xwlui\?,u`=|}N;viE U+PHi V+T;5tvS17bEoԾ|v8?-Z0M!$FO.l uoKZL Nnsa(WUESz_?t*b 8g'Ю%.eУ~q1B%HPaY μ2mXAKRue`2@>p_ Cۋ>Y\p ԍp||~ }Aޅg=DJ oO YOm`d9a71 ?!lxZ7kIA>% h ׄhMP?ew0f9qx?O1A"吊#[z} PMZt>vI,CJ}8rA7KopY]!{}呣I mEzڠ^1 CpT-h}nkr^'a*驦4HHbG5,()ǝY-G (W$+ʠLOP11s_i5q,/2c~\eQ>–D}^,ұts3, q rw_veM5˺g%6N@<wG|1F,~ gS< @u1xkcjհ|>]{x,cn^ʎ{='>e̢E{ yL{gDZM[c{lDZb, iu a'<( c0w&`3D8RQiᘠ NsIS귌|Qcox%cٺWӋ+R123\OSHvi,{5 )nހHˮ1>~#Nv1!,:b=zד7phnSfS_89Gw⁆; d7JǸCww.BdٚJ l{,@ @- K ߻]LgQXi~cKGon,/$VQ~rA]XHΝ{8m-N$,1ʹ:N;ivO$8/AxL|8. TUj(耉(}~bL =plLBuSnLOQzr0RW*DJJ^$kp'1RG1A bB@aZClH1ݜ 0ɊAta&`u'X1Lki D<> r0FwƄSWJ+ #ڦ6Xާ!E~#G? _y t x&p~ϓQ#"T !&qt%KV`mboXj DfV)iOcXV$ooج>-PC"a tɄ8Œ JDs~χ%(zh'x\U?q|wa.{BfF\&h.I= ۋ>qLE!n fOٱ@ja>7ۅ sC[viREHnhd$!ftbcE~zGn$8 g@-O3hA)p}fH%hE|X$&3KKjj %T1MTZFg3llkXhfp,v\N(@eFqH*{Tp>dq}?aԣb^' @i=3%|BYc@p1f**A16^q\;`݂m*>Z8Lfd2.vzVe.b@k'"\zW}Kv!w'PY]<)RT`~ "M@'X}X&ﭦWjBUyY8AY K4rs1]sxWwYwN;vi-ӖҒp4w1O{O 4z(!tGFL[l?c!7`@G$^ Ř 'jʳƄPZǐVEcG|Fz$ eWs 6m\s6l 9,bvfo \s8?3rD s? [6J|X'op) 限V(ɋofUe?}Ƶ/4Z +\}/}n;B8dAIB ̫>Sm5f<<ְ@.`:73#PгiaaQW tT@dyBB">ɱ.VSsE=9jUB̳4J1xbIC@f%ϰE] P2R^_L{:-墸`2Y^>OiO,~?N;viU58Can%==SH>͕7?pCD152VrI_ŚY ԍ"P(ik.*EGfBk3.|c9aX~v] :F#C|QeL`pdΆgaP*&/mQ"&{cR+mSFX*ʆԝf1{U{+ yCfYC5E {Qx ce߭c⺶{uo4_h74y [{_477 4USg!!$|؛eb"5d}U^"&"vHjX69XXs){7oW9ɵ`bgO$DLIΛ)cLu̻otj?|@\c%rbw@\C z+\l$5hx9>ݷBo!hXk/,pO웃qivN;9)C*>Io Lu [.bnPVn[[|oL6MpLp2`a@HTnQ Ӕ%_Z x 5 °ig@(E2czrN[\[ B)fvے>M=Hҙ!F8G(˂S{jlb*>-誗/x@bȊfǤ`=#тݻ"WAYA#P' oO13YX>mkpy9 ڔJߩd=?1mؼ93@k!zO*]FL\NTJwbp2CU'6Vz\AB&P )`5rubR4wIa3G.ܾ{c)+sKl(5DȤ ;>iZ*.hhIܱ"Hۉxo*N.jBθ5Ugz#uM>.Uޗ?KG~ִ,?|,?6%a,@/3%RG AL,J\Bl]󔪉&r2l9.`;j$M]CV5]@ dd\}5'cj &w.oT:ƴ-`3C*(N;ivi*Ƒ [Nr{(xdE>l/*uB4ˆcޤ^~vD@ &DU˜<1,K(/[* !xo0lR^YA! oA2l$x #Q %&h3TJ^97H"cKH+ïJ@ F`nM`_R2-#(Їw_s2:-;FV?^-(pJHg0 O9c{"Zك 5}bb|,4wpF WGL}_$f\q<N;vi&,'3!%ՇTF9VE^L ٦ΣpaM<߀?p}&zf o\D1y#a-;1i!"/Pcb U`w[,fX| EE@ H_:qOPCvyS+CCmDX? |~7~M>Ny]ʹٯٵ<eDR/}}0"$, 5YgʈjN34HʢN&q~Dd!c(3Q]-tgkwOs~{.t"^X^ڏE 3Aϱ;76 Wռ/NW"a Wߑ|ldz_-EE6ԨlN;xi`kN.9$w wP~ԿM$3P&Sp[I(hT߼\,& EB-nAah{g.DBy& vce]^\T^]Ƴnv_,ҍwI!Khxx?,G}SH9bS.VK7Wy؁rLf*Ӽ_Lj$Xuy ,1-HJQ(P @neVp~}6:Gq_w+r_W__TLX j@Fsf>n7[`UӠf_E$\A|]4[)M0Ӧ bl2 AK:FBb lЛHf|x i 0ܱοc}PV³PK v&6gGvſ{}w6k}fpyv'M?N;ivi%binj#cȕ!y֍T\ ëI1Zh"*!U-K Q0b إ^9Ta,QׂjW@P7F9xf%?qS@AL Hz#X;+b|&:R9)8إL7Rh&`Xuu-2bFQ3; u]DmCI' jCZ|f:RBAFP2{[u]6Q7|r7&~Ir] $Kc}Dpdfc㢈1$=N(M4Yg`' :a\=_Đ\Np`v)iJGd3^_Ǟ9]j `Bʺ'Z?ۗߒ{.c\ކzUi{~0 tלyN;viɪH8ŇhNع ̙C)?.m6|⼼UH&CƹO65^F!%NǘY(²ƞAYѧ~pa9*H{W*.10xXN"jC8) 0 )S _$[2|ǔksN f@WMӇe]OB93-\\pGrZwz:yKg+Ty?$`  DL->'oFY半箯o]6T }޾qdcMN3i1fA=`=|撍.8nn( э),1b)=C;gtHvmB5fpZPjqmpǢT6iװ6wB6z8RiAxIA & 컏Lh^xnL<Ƕ{Ÿ́if~w<O;vi&7 CMKA`kZu!Xda1K 'jj-)u7 o犕%tA DŽ'% PP^K4C|qފ^LQmNx2|M֍JX<"buf*m{ zL"|'v` Q EWR"7+/o`!=AS- <ߟ_ a%g|2jǴ!ѕvXxNxSi ;̠GTF oH{o6SmꂝdJ> UvL2EPEO;Rdљ966>R E!ؓm$$A*ba8@mnXkKV_QAڔXJۤX)]P{ 6W|$EN_@^PI3x "SpJD礐 ra t( }b|}%"'g|fpަ0 |4 h? ~|5\؜>;ۉO|lS*7fޕk! _?|MWBz ǜGjZ{F!}i<<Ď'@C T&䥚tL!VZ \w=K·(b(sV(7Ō h"!ǀ+eE /j'#H[q˰;a;a}Qfz w >εvݰǨ,ؙk<^viN;'*q+eJ2fP:@`֡SYp:WAw>6UUV/XNHCg H$ɥlDY )lM?yu|' 31gޤ\`,(Ba);L!%t~k[ëOFOR?r1dtHS+/|DO쑄K8YUhV\ۄhh!&\- 6 uq!a,u.Pni2cUDkE N;vi($!"_0{kRA&tJBVEL#b_UT_r,+_UvTc!6v z``ְR<ĎhB}1h;gyǐ:ip-Ĥ2R4LLOuq`ɬa%]@.Ap y}酣3D[eAPtmk>X<T%g%y $)s7;rnø4ُxrv։ϒ<[gJd@y(Us7 P*(&L[ c} XfQfە޾fKC&6?$e `L*;Q9`)~=hXo2e{J=ֺ]^xbøN kQ Vd`Wlt%b[b5؍鬱8~YrVjݯN;vi䵴rP"6}PHdߘTcQ2~`~,s&rNf>++(cYX8!S2PavYU$$0<tt (`搒^*1*t'ni)Y`?˴BH]LHD~R͎(*2 EYrWjq1Xx) `+coGct)" |-vpEKRi;u*sL֗]6}*`}.v\AN,665r>v5 ;XEb,D A+! '+;݃U{}s  rWe'~0nD+ȕE|խ>Lb.^pu&gٯ-9f-#$,7tҙHɘIг8:c` $l)e^m6VzN;ivi ' KaYw;l o H>Pi$1TFg<E B~bnt,{gHU[xOtTV @FCs2Jȳ6Xy+N) GpD7Eh Q `tP]O0t]*55{^v|?*LwwZ! f p׼P뿏/Gae) 0' .H-'d!ǭ dK|=} @Hk('S5=z&3t{)tK4$ӝM+ïkM}xM%xq+h?Tˋx3sOHA68|tJ7,~adJbzw(Z8i[OB\bֺx养YaXy$=0w:oN;ivii*,E^ Amϊ2֪tE@bD txYKfiU=[B 6mg X 2,PTmB(Y⏛P o(\*,1h(ԫCG >L$nz1#!mtʛQ>A8f )^_e δ8HJXYH2 [[H9//s:oEF紹3\,N-IQ:aC|v[m<(AM! .7}R5֐ wR+H  }"X"C!B޷w+&X,zn)G}bBv='23Dr uk C4|l(]آ ]5 {!J Hy[ĹМBm,ۂ(Kv$kj-k܅5P>ٝņp e˖$"QqB@N;vi&϶s_]JEjaή|A3tC(."E0$cxF| $6+*asAW]" ۅLپROb* 6im`E}j /GO @GjGL6d޼o|͐Lq]\]V/6#..xB @Z,o>{Fuު `Z XZ)}U^B#5.C&f`j8QV0v#5& YN!&Ŏ2ASxqV@ BR|ݡ0;z8Y_8֤07iL[+rWX]G s.1{|jy>kM@QՋ(k\ۀjk`n%nX) Lj5 n1Hkw槝viro",mZH !z}=DC.jp6gO(1KL79 [;<>uj 4SɩB'Hu k zbyͽ42.^|oi2PT^~ RZPńbߎ{m#E91,%{Kf X .T.Q|&ot?z 6ynI4k|B{~jviq$3(^."8N;vi*QԘ |R*+ m+o\X+nFHMx~;`N5Dd4%F!D4ܚX;=80p$$X91] ɇ0to'RYH}n6,, ׉I >|͡grK&_ \L]kENJƖoߩ UR YhsPs@߻u0e 2@|scM@l,uIإ2Q& ^݅0у|b}ح&0XKMƿ$? %ؔ %+P^N03cs4Q\qb-|N p !C҃`@RF|-qc>db.o\?2dª  2`%h˟_^΅<AW{ θvM.ڜ{crp06|ó-mՠ#t>Mc,؀ (1z"b@S~MVtJe0]Hj<>iȘD5/&! ֝L^d^߫sYzb<7/8DleLKp53 8?U^8Sk]m ͳܡCviN;E,ހxQ@/d`/tqՓw[`U[ŶA)yEAҢDؐ ͕z>=E Ġ0ّ%Ȫ/<B!ԇӲCD2,Jڰ`8Q"Lg?@I0@c_{Oµ6,?9o}M؀@7pzJ|L*ݺTmF0ZNQ#.~ݬ;<,XH;} ?%õ vl̴ O}0>$gB}dTIKcqmDՐ6Yhwe XeJ`d:.u=c^-g^Jcr 6@Lir.E&;iyFgH N;iviW?ޑŢ%"@Ba16(> x46IImCb.i1*]cf䰘>JS3v-xx"kQytm5 dRGƨ Jz"%i@ʀ=/Wō|\79GtV>9>#I2Ly Z$?t @ˬbǺ\UǶ}} 9% {1+P)6_s?^׷?ӀHzM7x2(/p_Cc}q)x Aǿ;NgIaeCL魬#UƣVN%$ <Ɔr1q~R">\IGI s 9PI)+Um@t+NJvpo2&-/ tin:SJ< m{~O*8Ť7 N;ivi%,оqEc{#_,N1\UmGYdDE8-SzJPBT0 U(ʸ|RNL%N<%x9&pJS8/R ^3NtmY}k8/`q's~ӃuFHeBgP4v1Pq.k)M6`oPYr=wx:G=Gʬ, X ܩPPU[K=M1'.eXu-Ra(O<-kƬjoN ~tqi;N멉o"#ZNkq gB(!ÛQO}˙B@s9_X! ¿w)>Irs "ZO /9g( }=j,jsܹ4Q/PivO;N^HqQ"*zr+΢KWԴ`u_űќ"Jc@`Fj.T .>NwI ';qjx7X1 %w{Lلm!񧜚_Ew GY;(5؟5X0LJ0'ط̫V??ChhpR&p!?b`9:X Ia@%v!y76߰!ψ/N!q#4QQ,^2%e!+X.l2mA{g}KF%Bg!99YH_(Y..u.uw7 #3(L;"ܲkD&t!{|TqnR~[z=s;9ĸK*j;/# i`绅{avirԥU 3@/&!:8(\<ˆ ,|0=('$wc("+k-\*F[֩s!M[ `Hǔxمy/npcׄ q!6Y-+ImW h1K^n wog'|On3zo \O-Xy!"4β(8, .և^K[ޔ5,9} nMϋËaɌf|y=ԱiCDR+=':>/v6:g(H _#g0!GDߒӛC Lo}K -\+(5+ŕXu-#9S,z>-@ڋώH0(3;yZ9ncNGjd!ZC} .Y+y"V8Nx] ~j]ɂ{Zyذ 0w-+VY8>N;vim i{ۂ8\ b3Q|%vWM SJĀIc8T7e2yة#8NXx,i>#~uBQ=R<^+`6l yOFIRwJmKfK(آdu\Cf)Gc0 uPQ/laZ@i;ԍ `j^ݸ$@WQ7rTgy޺]T\*Fdkru\Pw#Dl05dr* n*/kcHf@B>(U `?|j5{gSHvi-]L3ii %Uyq"=v"/.v5cWtIѫKR8L9ՀPU h6u3v-7#ܼ}w mW8ѷn[gQ Ca*eۊq!/=R7Xר{˥{+yl㢍\ݲa%?N;ivi7gT|T$tã[{J+ L*1S<=FM|U|61|zEJdg,r8P+"ZVpyQQտ E\22 ]-@b8џ:|^@7ym{{Q D)s,F3#@'Rm cH X衣[>~zK>L[sIP pIJNv}yfY9 lwdf1 ު:̫\|Op"~e@|K}0)oPlGXIBnRN}sX9-p[.p-GQDMXy5$expbG0vfJD]wfufn}.7Im}@-a/gvi!IR (H\!_I{ƿջ)uXhcӸhI"e;zo{&i[|BV hD^5苯\~to7GڦsyM׻}x۟7 t Xh3ZIs+ئ"ȫ$4>0aFnz)VY"|SO/bh*\ƼHc.^o0cuN T fߋH'1ImkS 'xY0wsDvJ%&i|\/l3w*FDOC NW<%؎ku,\BJcx?0 H}#S @`ͤdٮƊ!əqksO?M{- Aw83| Y~v 8Ly "HI N׈%Awھv}rR0V{|a`p0xu/f)fsX 5[6Ye rz~$>/ZofvB>]iİ*E,4x%?Ct<XO^b| WhKe> ivݴ/MBL++dn=QHܸV9[f[$_]]&6܁>;`T|~=?]<xk#u]u?/t[ױzG!׮muN~z߹a?]32dL ΤH0qzj}m)"w(@6&; Zq}%CpPtwǙ/ aaU&j,Y'n$u(2kW4H:A%R2ttXkr rRfWaZ<{aPA3ז"BYwuϠ7Z:=@Ґ/+}l8*Zn̞z]$xtay ի^8V5/s+)WMF}ݮX -p=OO\7B֫ QnsH C/yH4f&y 7P)dPߦGtxN=aw|Bb6;, Ys1kqD;V ECw4bKRsj0/ĠճY r a:`@0Uvf/J16Bsfu?5xvw` 9=Zq_ԧ}Em-`q ZRİHDv7u<ߟˉgv*΃B&n]^ b%,R_ X7paѷfz49x+'{TJ H>3TPi6cYnT8 a=f@>|K9/Ps*qc@aEJDӹ$Iʸa8 '8}ed7mvgVϯy4o 1bX6 Ǖm<]1R3a9civ@WX`:.i8JI^2#5O6BY{BVـS3'h@oT5 7fgF{1,_^_WOkzcotύ70` |]_%_/l :R>:_?{^?|H_[k2^u ϢA(w+N6]0!U3YeϲJwإBU6@UY«UܕsUѱ[xQd4 X輶X @crJ vmlhgaEIu87Ȯ|+&l b BMV b̂Xzyb&'?&N@/G6+5*q+0 e8SJs^}XBܵbJm%QvT,:_lS&I/gA#~.X=mXăjnaQ)7'FclХ3Մ@}?}ds<%iw ^L:U6p6+F J{熍9r߭΋V]M)OYV$^@ՇzׇYR/ƄT[9nc3hщ­#eb{&US:H5FqM2_[OVȈJ1U ]>\%̯Ҥj7,i1|`gZ zN;x_[sλ8Wap҃JֵLtzl7&(t1.҂MA@58nZҡP-$O/fIxq=~]_às{}#Y s Z74 `;||{_q=zOu}ȇ3}={[*lsyUI[A@j^EQC/ɴ`uMxڂ*y .D҈ $Z&B'"cE _SPjpx<´ *UxhHf(I+ SjqcW51 f@㗜~븘֘6Pdk` `-Ȁ0Eڥ{h`;NIwiq˗㕐3cÖkcc3Wyfӟ"^gy >&ޣ`]@l8<}I)o$s=snц"n>:d\`];Hr G5k0^ )އe<9OA8AQ~$J9d}Km3b-Gz8Vx? !|؇EQ9[W+k!"k ^ZaIM7p=%>؋=~^?=߹wW |04~̯6+WMS95{q'-^͐0-b&g.0GP`$qWP!3,=|㰼-_8>OY Mud-?381,_RK|y) я- L4a[ RY R`“3(JV ∏*Ҏ!ʜل,)Lv~NnGnW<3V"N9gDeާtWQXfk.Y`6ڢB'Kˑ;P8l}Y@0xqG7 j.tfZQl"Ƚa19)鍡gnJB\h_Wm|i9tJ*@9e8$շ\.H Oذ^QwL:]8.t~NE ;?7ǽ2{OnqL:kO C l1 :{eDRr)#Ḿ('J=Α£;V䬕ZڛaT[/ ۱GSwc^CGvXȖ#Y+ E椧vi<+r`7œP`4_wOlOs_3?YE.GBfb!u+ɇяGH/^?x=ɿ~_o|cJ/BPēB3x @u6&0"`ӜG_w4V?~]8:VlqLY|lg/MoΘe<..RACٖIˑ!n"/TJ16/Ba<o\R [%"E^ ~뼯)A tI:z|}[,%#cEö0r9X,O3a0e|Uݙ$Db/Xr8_QV^ }}}س4SqN:Fu{nP߀Z/ќyo[yB?ԅcZA[;v|t+Ϊ$hǯs&d9q C' Rsk@_~o#P엯t(ŞqBX߀t6'L/W8cElA0^1Q.mQγx H7~u{mʟ?]ݞ"_}*vZ,/c].O 3 |RsL ෗g 78g]9{qoεi&MӴ4I/4@BT!*._@ $ TTR)"D)AM&`'qwOy^k1\yI~k5c cjNFl#{[>T@ "R' 0PxeI=/n-w8u &ɀB_ڠl^rS =H= )$ P6M`NV>J*:hτ0bT#(&ђWG'p@ؘgyVղ# F,:DTb1~ϗjܱJƽJ;윝 -5#H3u]ѨsZ1'}SO WwEmgNt6j䄱=KTK.: 7vZw' NF_QFn FV@;vzЊ%Pg;ଭ5sҿ\A2v{@65ϰ$֞yck6y7浮]bK-C ݁5sN(>֩]̿kkk,o1l2ԖGrbM 6VPo6}GnZ3l`},twn\v'C^)PE@7܃=vzPzw=%Z-tFP#G3gd}KGW qk}S5n}36XPƍ` ma]+%T1 ]!3gԁa# b& EN3 ce8D5' 0IA uV; !bV}nk20ܬonEЄ`zsj΢G$U VJ⎶יbo'a2qo|5v C9)Sf ZfJ0e:!'.$CJs+(:Y|eVj==I] @突ۖsxg4"Z Y'pڀYzոXrcDa5,@2U @^EaK}%ҍbPFy4W*+C95,rȌz^iVK?(ChmvYo<<Ҕ碤PDaP&|ae0AZK'-ߎu8[[o/I¯۵-Ogq_6,fnzuFT q+ysKI3&a4p%Iӑ[ pfokȯ\| [@^VӈX,X0WQHd`ܓFmsgKik΍$_ݪ:jiC,$xgP0a4QUbPy\gk=.ØExfA\3Ŕy~1s\giB\c# V` c2^POhs!n1AVdXa ΗqSG ݇A-0-F}{{PGh.,X S3$X-6; $7Fڦl.dZW[\9ZcY;s}^8`kn[h~WQ[m<!E-M4F'kD fD# *=yP;`{$IZ|h&3:j7}ao Uc?qZ)L6N /gۤҵkF{N0E|h+ޡQ K@ҷP98d?e1򷺟$0 <Ӳ #r{3@A dC GePY~!8zr< V|Ewv_#A%zw’ }zJ1d}aq@tX3Q/`mdMn,_v!=畃>V @1v&nٺ-LdvtD&!eيcS"/*Ts1ci zG<*`;ٻ̚gD9fTPe*\uD&WmPuME@X9{\ s7XNvS8%Ȭ,M#vǝC Ըwp;=fkkk{Hm z$4Ѕ%Z:224򤏖+T*Ѥ.$Q 啀>Hj''wWχC?W9ҡ=NӂD^I".@~pʉdv A`1h~W+Cz|Svo v 9 aŞZi!`9,cr77<^. | )S5Ma{$ps2ڲİ븅 ,e2Y]0R2:' qP'ٺJ6Mi>6K xndyncÂ?_Jv8o g9{j4O5!C|!cr`eƗoY r!M6:rՀ>5F[u9CXqa,NyVg cbj'fft2Q ?=iܲ.*YU0L ڮ.> \H}7+UaЬ/ia##GRgR82y2n* DP|i7JpJT^ YZL9ER(e!*` +: l8Ci*@woV?Ow" =f|6D/o%G)C -Z/P,RώG9n~6[kC|5?qfCh(pHF`P a@&0ay waKvmx`< +F w8?syDnGL%vc w6ѿuݤKj.F&0U@zҁ"wyie\T3=s1ݙY#bVkC;2Vqο7.k,;5wO"0toG4-Ol8@@EZ 5ިݡ5;1! =zD7+y9 5\M6k2)؆t .jNes1t XFԆ<4C4uBMϽPdF."H `Ҡkkkn)-ANWF+8 78Z1rޤ$I7z(@Y_s7G?w1b(&ћ$1|p3pn+ȡuu Q\=ǀۣ8&1+n_f/ǿ~Cmʿҟ?lQ56[੓ƗV^zaQ %F vrOB6,ZuJ.Zn Ջ# !96poJ#]ɾj]qB@Ɲ܆Enϰ 0|9SQ֢V=lZcdYH`yIW)5>G=Vod7KBt[Ad@K#=0аpdgw?A@:~&<0a9O!d@bO?. u/or[ȣzb:c\`^fhQUUvZ0#БCxMܕxQ @qrjWX+bTs13 '(AHTZԋ:RO t?(LfҐ1 l<fnuč^Xrg&7jU+V7HD4ׯڮ.>CϠ7h?V,~ ٦rj`;]Я R/JZ=Dӿ4[~{KZ2Qָ"FѦ U_ŠGXF""z.ǣ Ht _z.K{MΕm3{۳msf\ERBPZ~_Oos,f&Ʌyd\ŋg'ÆFE:0bgCG)uY(ڟ((HL`&k,# $S ߚ@0 & 61j-bBALJ8\D-@=0<6!`Io.7ƃS]cH A`d. m#nMCK$Q0I?3jm T.VAg`πy^Xí$Vs3>wh'mطL,Zט(/e LD҂A*B'Y aV|䪼uWd* ,`~H94/:ڀ6?ڀvmvmxmo6ZȘ)jڇF.KQX,;Noj@P ~UڜUzǿoWyPesC*ȹMQm%b#Jl1wI.āCK-^^p'`DYvo7Ƶs$E_yqS;?ޟuz8:*{e:&!;}tTJm!/!/_SMCLHl=?@bWgx62Ǹѳ FLwaD(Wp3hA ^l;UpuЇt'%r J@S$Œ&HT2$bVEaƅl.uL"ȯώmqctl'syE&niG$MQDfȁ%gGayi^f^c: a;1́n䀫J3$AU=G%3칼o3WtUn>[$^Ɋx[t)^9Iy|ƺ\(֤]sa's&@A۬.fO(7Al.Zp,xĒLbeX6`KXvhA4YU f&BA&֓yCCWn΄?Z~ zQ-pAe5A*x>mcR3u>Bh x4jR!תbJ R Y)c%޷_@/~. 2]xc .9&vUA6-{Ksa da,Vߣ'h[9ѥLFB8NmSiZôP daƑ%t@ʵ!Ӫh PpW&S`*F U`/ 5յ8)c !n[BA@`TGdkg5d|V_f\ CeTD^Cay6T,ljg.`S_?Ut}4MjG& ò A8ulMSZ9AQ_@)s _z 9S,$òvxȚ!ϰm3̂m`tEu!OS|<^F;qˌ Qkz3(r(l^bG獴dTdV[f)_9PHc@`Xs]۵]^qUM۬2nT;ԛnbVÁqiW\G)+v/xRك}ř.SJݲcBO'P<D1Q8PR׮L=7anОnw V5#䅿{gͿ`oZӚU=?yTÄ.8QAm FƵ qXRоL(rQʰv _.'`Z4?\`e&_hC"6lsu' ; z`P(yhzw|c1vmbLZ΂ilY"V?^8} G rQN`okzvE z8:m% T@ *\+ub-ɉdnM*~{xR؎TztݙtA.COvr ȧ Hx97# ϑ2tC?a?$: 369ɽ#?f0i҂Ven,@~i&V{C0 .X2hyΨ"miL40k/05bbb>C羟ISLUxQլRq8+$:? hhzd`KPb= !< yڮ.>B2+p1ne@庠`,~S_DӚ;`ƒBA Y?}?cV߰Oɽ iۻ)PՌ˱jx#bX\G $7k4w_xP(/ܖAX>H3lSd $Cc f`'$A|Yu0, Fmtz6Md\2 (jJjZ.IŊ>j K R䒛Ħxl@.S 躘AMlnƴd`VpzøE4?1yHA ]`^6)d`s0l`RN4kMu\vmvѤ#%l=Ռ\W EU@͗F̯?~yP>\ 3S;gZwd00\ŷ4ktQձd x46mHS?voo?_ҏ_~_~?{~ Pb3tI"rE`*D GM@[]1gBVɾX&]H܍1Y25ObD{T}e9'2ΐ2%t)HǑT@>gP]s@.8k%΅ ""jHm\IkBh^ KuʀdT7Gm&Fz>DN@@WnwWra_u6{t뜵 ciW6[a-&=PlHzNNc$`k~o 5i-@d:󍳋P4dfz&KFc*٤' &,&ͳh>3~Fn@+X2c"} á:'4t=d<XMi}y:Z\Eݭb#hQ, ]åeq`7NcSk]۵]ൽ[fnb鞸kPv87'~_s#a[栄/R c fAgS dEiK40J`ߛ܇#•)Il?*OaU3Y?N+-b{? }qoDYLD%H9Ck`J!Pg0/"f 6,赨egEvjF(E؎Es|N<2Z 3Y693:qϋoٔ,?~`\@d81K·a+ AeDn#Aۑ8wbF/κKX*$Ksa)zmn&2RRNŘX vC,>x VE4x#4m=ń6L2 1B{1 l!2A}bSqς+ޖvg>k'ye4嬫&bgO&P';y4 ebK?ϚsL!P.OMu०m؝΅KQdmǡHsqc)Du~O¬fuٕ^۵]^5hHƞY<^SV] o]Y)cmU=:7߯|goߚ Z#29[qi i1NG遮c'NɅC0v Kd8 ' [R\TIM#f[+S׸-!krLU@DL_ٟoc2ҴON)%N!mi У:?zvI5"d Deb~T6>Q8x,3//(Sh"-!z `*+M߭0$P^Cr5QY(h=vcZǸ/G=b7?X!SL fFG?˨ۺnD۞b>Cxw/aOKOG\pa>L^ٱ@'X}XĘ['AOUYF<>R`eY1I':d0l1P* :B6ELE9 rsl\`{3q<ʮ@+oJ<Bni0M mΘXm@R4\q^omsܪ2@ :jfP~ |9 " ®pC+ D/@ƣU<$Ъzgx%8'7A6VF֬\]慧v1VYe$]H0&f^ tY<1RPaa:\ F t/>oݏҟq(5Q1DdSþZ#盹7l,^1!}K탖]6lx m^z?g;\$|Ġ-hYGb8m=zMeƑz^Ë́7 vEY=,+E1oJɚM W{O2Xoڮڮ퍃G^ `SD"BZ6-IU NIK?db/^%9p0as`.~/hX`fn5kjDAƯ++4q0G\^7m%4]=\=P-[m̚i0f`x뾺7oX?W~sd:XbVe4^S6!RhRG͹AۀVEkuZ|Fd eb_tkV^|/>ƿ.I^œ~dABDzaX{9H ?ui*C_.UQ!%+w,;#K8@,g>,k=}Qp$4-\̚ eyañ1|2ؑ6wZpUX"tѬn:XSc:ags$r:$rpX˅\B `&m\L4CSAxΣAaۢ8iX8IiOyFBڮڮ3v&&K8}b8:+ qf L<5@}wG!{|VZ"o+"edfd[j  *M d!U$p6.LwYQR& `V LURMc?"} 0Ұ5啅}_)>zd m>so`F/(`V~E +e UHؘ9 \ۣ}ÒLX/R<jI,Dq!VL1w'4PprgpN&g܁I 1J $e7tO-[P@}aVQ/ƣuyP@ OK}N߁7!cL]1!Y 7<_]'*L@:#HPedeh{W-Ω3ϴ%<aQ?S{cj0F+QȒHS燜C$K3PDH:8@|/w2!#ż̑$^@نfglX4oGC:ӈR*@GR0jdO+.~4+̚v?i1S}Aڮڮ FZMP#G& CGJs@q$=>O][}O2JrHƽj`zJ;˞_%-9pu kP@r+I{qQXlJj=9UKf+V`pr@$}r`@~KGQdw"zV{±q˸ixb,A 5Աǁp<3$ +@ h^LĆ Ur؎l852SAoP(ztlV, l~̊bh&bBL'a^(}?2 r XF>*KAFevɀOEeB1ՙZXMen6: &muxy]`h' n\!~㕜_!X@1OVȔMc3>R|6G뗍vHϊ;P m]W+w=1m#Pɡ1fLC',8\I֋fEYyc s eeLr݇^|zP8{hLgmSia샥x9VD#"]Եp>H8@xQ` xkkko=֘ }i0pИr5PX|O'o? duϭiđtU1 (ن#Lz \a+IW3rNj~oRd >qc԰ lghʁ?YZnV/iߵ篌x-p(ʚl]7g bv-vv z1`b0;YVfïM“I+q ySڈ|GrbViYV@N ثw/Z<s[{ 2SSoCUZ5'%XN~ Lq4ۺ<'c5a1p ;4<^1:٤ˬơQ &]K{s,`Wn}_`j!'ԣ^$Z<X+[1߁/#I Ԇ"ɵM(ӱ0_zb xd\Q{1ssy?)A@y]AhA`rtj=u3bY* twd,I}kTH(EvĥSOpyh{#zQ1ܸv C[m7 &\GB"\;-t>Ժ"!XkxO P6mkSN"L[)]~'7XblaE9F ƅIty>7H!8E겶:\Sk&ޮڮ.S5Թ&6QS ͇?s߾r%V}"g)wh`i4Hj'pr8OX9'BP{k" w ]#a@]b9˻@W@SVr\&='ԏƴWЃ& jaZԲ&RӖ5w 5, A30c}jjVY|"4[`-*66 4RbIvkZ`ngRtHm!Zbs&r*^\R^5sB @J„‘VڽOL؛<<Ћ:nc"]=᮸(N"y%c1>}g_~i{ +޳Nvm^㬳)񜁠䳀l6_MLb|60a4V˪mw]Rų26 Aiд/ftf5E-sj<&N@ltE c xq0@18XE䂃#'{&^xW V8*/#ˤ?)*PuFK|1]?nOwko'h3wE4PS<)Qy*&9;uSC Rn,tY54%iի]縸6~=wpJH[+^Ns -1/U:k.LHD}-ursW0=wrW?LFe!&9 c,5ie`;#W_'6bBUg-K-HV>~kkk{71Đ! &ЃPi4eޡaR~oB KdʿhfS**P$N.j{</8;DpۯqoUCS*Ih8r4;A``bݸM(1 h(&mz?qO]D T$YB s┕#X3ndkLs 5UsAM5) NhCvN®pR?c!wuB{q" q0 NU5y-e{'~)H!c0VJk%6GY6S1NϠlAFj0ϯ9o濯qyeźDWWҮ‘úJ$].$ޅ2Kgs .0%8_ @ue O kr)P`.&7]`i̲Kw.$֢,PTj !cR(בĦ5ܫ_r-; C۱i\ ;s`C͈΄:5{Xjt`(>](hm&AKe Ht#y]kv2 #YQ,D/DڮڮWTGG VL9#4v\ o~~^D RΊdj sAJXFM'wh]\2JhNxٕwEXVD2:۴MS T%ܱND"$ԑ(r}v E:%r~:YDWz_ݻmTo:"k` QeV$0hWmUJjq^"k$9}g: yn4++C*XÈ[0iʹUNg\l)}`0(8mw5TB'lk U]3H'.?Ьvn>5ƺTs'Y.83.s!Om-Qz*s:PF`O}z+ޡ|̴tF;k*Dn@{~칒N Ғ.&C4NsjH`#d.-8h:{29VhԶEh -8{<10{ ZP4\kRV90V,&p,BR{b bv-*6T8S~iKKR|3d$,A915 )NDE P~k^۵]۵]ൽq'WEI r dM*?ʎT__&F (`yDMU\F`˪&Q!Ic)u'StIcʳ[1%d1IM ^!KgVb peovbg W`v*8-1 F8wpicD۱syT `~Ӯ VW#םS *;$j9O9fRш&K-#oC>a ~Y-@E`U`&Q{p}U9||@:LJܘ%6{Y*Πb8K2CnrZm yB+ԘGVqVMRb^Պ14ZיhrV4fWk;{b]Q/vmvm!CcL͑uVh=RDb:AF$fD^v$7QeĶ5DKQg%H8lpzg`m$Q4%[EϊM$=Q !nai$p찗 }Dr"eȇ398BBlv Id-w'7tMΠ()>ts#4@b42@q[)pb Zc ,nhg:$b `6سLbU4%N&4Gmp jRf"$16paf}Qy Y*iz" n5OlLX"CXO402ia|mQV,qZx=;Ց4$t1srH`<.49z ~ {}_"ˍ6]Q03% F̶&>Q?}kR'Rk2K@ C~(1hg!"t_uF#N~fk2@8A/ȶ<(d d7 w./ u 9`'6-x\裠u@D9+Y.Ikt`bQ12SN+ =C(sb#Nd|$dF8Z-b)NŬ(骝%Ǡ u)xkkk{67`7o|[CXj-aQ`w/)u!V+AI Bm -:[" L*8XU)AT6 ؃}REM52Cn5QpXܯ߸pP~On.߾Ά,$ GS+9 V0@[qe|&nʼ$]K_lDqO6DhN-ݦ!3 xOǶ}NMЍ;LBV2q&@i6M7OG5=8":<ǴjyX=A)(?@ `D>A2f\an)'q՚)gNH ]y}׏.h}sI'ˋ. 7fe<&-/V8q^ J:dV&?!\\zmZ^O)BOJ56bSk1̗qqluhU{ͫGs\ "i@ T\ǐL–5ݧ Mf,y 'eZw"_ױ)Fsա#S9CGrT4L1*0lCNZ?BPqvmrZlrr@#Ę3%v敍FtfdajFeQPE,9+ k/MvNfkN9V4 G'QP{Sءs9QmE:V +`qIJN`|~+o6]1:߸/ =uxcآC86|qa}y$4@k!,<9OɃ9K '3Na-Rw%Pmsh;@XuItb/bd,d=\I)$W,{\Ur.mPwYr)LeH_g& 梛xz%M:~iMcC-SP[,^OAŶ~~^E؎`9 ޔIx2Ekq\!p,'p '797qa$Zi V& 1AslE|yuuTp}M2ϻH-0G C󅶽{G۰(w8`o.Dfx9AE%33cj%f~eH8S9j7T e{\09ʁڮ.m8N\ۙ6+P(o8iEYhu K_ OŽ$`@0x.ϑmH]ۋXHB@*F$( AeJh`RX9Dz٧iS* ~e&kw2w3̜*A'H}AYK"w9Qh=df=v;'#1C~n$V(4TX9aUI=u@; Ƶ=\CG˰W!bjiu5v|`˝z.o)n9)sVF8&`"8k6cCMiwlw%졋0zlauU5Cڴپr<5)-ȃQYz`A %XOxNXKae˒iX6`~ns>( ڎm _T6 \+:謼x\5mru bBӉ6('YYoa^6b YXpNTBqh ǪEjь/] $+]d/ J5҄l 8؈HjtvaYNzm{@QF&x[tF}X9U$VL%R43תx{rC<6.Wkk]- Վ(: 0Vn̿o폽YwLn\4 \ˡ/j tsG̖&fှlW mFRV`QtlW~Rmhv8#*i5Q%0H(ۡ-@[Ҿ ^hIV fR/_>o_~] @!e7Jzg Z-Lv1Gp1_s_ĴA3`o1L>\2C& obT7G6͚CiI] #m=˩h^ow*(@E^OuTɭjHLD=3NZƢ 4b1c :%FY`r//XkL@!k1=Au8*ԆD!5ArfVq܆śï,Y-ٍ8>WQLaT#Y27,2ݺ ~laz MS}l@Gy<%5mFX>x궩TC43܂8l#+Ѐ6qm~4g&IY‹< tuhBp[<*FӉ.h"FĖGx*6ۀKo6oc/&thBAchBz'RCw '=6 \}lrJ]1Yh{]za&Bj:Vp-"!.IMaGv=T/NT(:"Q@6nF~0m֨ ½l'\P\ *^7>T3a׽|+xB8cqfPw~h߮W~jy]d:>b$=[`kAmf*`9 !չV Ӑ" a/jqVϣ˪9/),%wzJiI^Qb΅r 2?¥VX(3sAGUoy Ġ\E9A^ S{+pn ڮڮv&dN¡5eEkX VM+OwM@wE 5B+j"3Đ@3HFᶋدaslQiw{ж9PTm؅A ןHvZbiXs^%X&K2~vǏ` ~KCϩzH<Hܵ Fn֕ƬOd5#mQQA6Zޕ5ƚv8~-7, !l] 8K] b#}#]̈fdDnfc?#1-Wq9U # 'TAbLxboUegU+[OK:d͹5=;"*(H4H}2-&ͤeKm3IUP^caNStSb^_@?>d7%Kd|U<2XcV!F9VAceSqa_d/;4M؇T9wb3h{=ɐ:'bU+uYc|䒉 ~ں1a96>*^HWItxEi<Y<:NGCn=:r5u١i8zkk Y!APr` d!+tBVI'i:lFpZZ|ֵMSeLt1uwpW&v!icMʈx[0 ι.t27,`IG@%<ᖷ؂0yV`IΫ6 o+T-I7ූ~?}1àpueڑ &b Vwe4尹/QhZ-́3;(y!4vQ1L@p2yYsDXF>`Dyc&-B$.h#KcMuI4FLG,'- <<2A,};'0.LHжzY}͵FQ 5K!,w*eQD:> P*8U@AY  Qj}T GBc"||`&-ls:)`"&&'=;P@_k|ڝ!+3[eUl]LjpK߷}os-$9.aDsXQ}|$׼md\PGv@V)<"Qd/;eU 0&es )L+NC;G p=`ń. GP6}%3O+^amfCH.>cQAI -нwp}AW:x-is+W\DӲ!a$y=Ps󡳑wmvmxmo扝 A ­Ok3nm_=_I]d[w#% 0dt/)|oG"pHSI{2 =" F`sVf蜾&s3rl JcȰ H]`ηk/֍(nh1`|q~[󖻸7Ws u8TZ`~pG hEɢSnUAĻbf B S=mL6 ^?[1@Pn#'Vesb_' `j` gkHN[>괯 C\>B@2cRFsfU%˙"hhdN ڜ-aTj"t}]ok"^@y^ۉT`b1-=$Izs[ZP[OvK0pQ¥&. X.`n(~/ލj>H88 M~!{aj gZe[h@[fe yΊw.o[ZTű>X;OZ4} c=r6п&v)rl.FC+=a\*2Fm<#&+ [ZӭdZڮ.P CuLBc#NE^~o}o%$S],ԆɬEĦиC+ }B4H,I˱H|3yKraW1[ K*->hE aV`1g__0| ?xE+t[Mb})4>'#loK.{QhUggPf)py+'apKEuL3l6qv H\Z#guG5BkƎAx>&x=kG4=@d`];-jLgU~1w[MN\=ФA6f Vzv02`,esfYT35rcPeuܵϮ`7_ڮ|`ڴbF,MQ>ZsFA4k(|VWWJL8MZq^Yvk(V9Tߘ^dGu^oŲɵd0z*8@4%E@1d&R !EKQ:#%ͦaĸFif &u]g6!H_R,#6zfw_ctZM $#`_y_@:Hd5/%Y ,Oҿ5W*IbN˔ 0?*:{83Ffj|oeCHa틧ñ"RίuQ:D5Ƶx+?KxK8PlԴS)@yΝ lccBcU=al Tv#ր10?To?߮ 8q ;9횸1,P 0XդeX]m}v3#C\3Lqo5('A~5Qx;u j9 SP}C&+LEh`2#LT,,PV۱A3a \d3!03DŽT)W;pDwFL_ktfGIc2d<k;PUr.B(|L;j4T")l cn;{ssi`B91_j՜:59?@C%\̔=y>5 <f %i^!sE/\]@UYA;R c3>_jz2k<,3\;/)˗ֵ]۵]}v[ ` fV+) r5Z1b~|s;ìtVOFr%1Jw'*v:Njk-ƟF($Dhl&+mo)?;p?o7rz H(rzܦ^}lhg0{t?awᄂoow7|^/L~W"<-CUB06,`F g= za+'Dw o˪Xn<*m"@1%`IMR$SKT%T$J%eib(DH M4ѯ=su!}/X{{;^k1G^7ǘ ~2hh&` 98H+)8#_jwGXxT >5Aυ4d^d>cR'zФiL6>]] wP9y|g~#֌ Y:?|d5)kh͉}XR 9S$ 8H L & :Y\ 5FVeyf=&ᵓ[9Q3F~}si@BFg*)NI<i5]6ǫy4F˶;9?A&Le7gu6ڵ}ȅ[g!\<-O8ɮhe?_7c{H'w"&..E^WY<081-vh7H1Q9CBˋXܵpq$Y( 8_-/N0=),~H؀&~kk m[m!w]mD(pD{S$D XAO?oKP~V =j.4 ̰B0!Q~iW_E.>F9g$mI2Py3yy[?57ͫn%:/ JmR֎ox cVHU@2G_}=ѩ%B["KJ|%pFB+Z{=DžgGFmsi'g~vBl,$tFY#RQo<d!TXx$ |' @Qhq&4XRjgӐhjbɛQ2Cem$$kZ_`6 G~T(p5|4ĤJc鋦?v/ M]nʈ{f|\8F{TSjp{C4& >Qi}+u9<]Ak|Ɇ\,2^ۦ="P E3as(rڸ@UVD>6}b=9kZ1:wbBAfc}1.G2pZ`y$<@Ge54ǾXH5вk](tLu)G p,ƍ95855T5lp<<&M]ȵ]۵]ൽ4j,VI\L[Cpvba7?/IE'W#LjX) ¦.*8+j !Ƽ4[_͐6JDV ZVuWZ*"8ɺbݔВ?oIO+S_闏}wS#u42r['vZLMEvlhO:\=bq@)xb>?ݚ}?W#K dxe1o 0gU=/R|LgPj2Z *FSwFCeՁۜ3}6TPP}00܋$r48yCAN?z,kfG.+RjX!vǶdbYS <^~ 6:ez*3j?OT}.rHeǷ7z}tc1vod N WM/|驺haAO&)N7ƔKGf5ڮsܧ$|j얀Xa9\ٗC4:@lV@e ;U9,rИ+dKjRWm/Kp5b-h'cƂ_u`hYZWAuCb.;5i5:~s0);|邏qSapgg ڮ.D~jҍom#w+}XUݶĮc'@p9 :(>En$>-/n>ipz>L&j4r7_u%_&Yџ}KM5"ODoXub_pS6 G(}xokl8B=q5H>Y3O^L1ȎAkC}txO>Ds ^3,1xUY?=R&I'+C>JK50zjH 5u_ =~}j<.a}hC`6Aشf% _&5؜D0l-~ۨV.)Rl]ڗp\a@0O"DWLa .9f7}]vv.E$UJUYľL =ݫyX Ii⧖)1Yd'ڒ*0:2#dXFPԂ_ F/>*X1>&" }FV+{8(9ڍol:.O]Mݐv5ʀ <9{(6n',zTNwV&w: Wc?vq6;.T?sˁ =7 d<]\Yڮ.^,0w7`k7[?WAM@ep˂1|}h3-k. 9c}ߴ2j<3V.oOxowI|M߁/b8;Z<,3ݒpZsV…X' _[~jnqmڙ=XDA0KKF|=rTN+Nq Xl&b4qu-\K zN̶8g4"ҍ/&jdv6ƣig"A"]۵]^KPk  u97ST(J+$F\6Ţ`-(hJ-Ni~nnw5ĴR2ͳt{C&@)2Oz<[!Y?h =w9ϵiaUebCZ7D[-MCn#'7U[ qO;ݳgp'8swH qXJLdjeCGt a* Xp}ӧ'$p:ZFb:O*Eώ#poc -hTCI  e!tl1.nBOPhG1P0uy7fҷb+ˊŦ%j}@'v,T_ ‰Ҡ4g4={<EHvkF4nmf[ޚyTw*fGEkpjF*ߊkgzCx2%+ƨ wxZ0=|le~0{V bӪ& P=N;&dLlF ϒ;Kyic$*yתYd/Kߌ xmvmxm/,ֲ|Zss- xAnY^@L SruX9ta JL5/S> O\A kG r e` h eS)&vupq2︹}W;کX94+kPpw]#5 ]J2@ {OVN·ы>S7 owg&/^ЪK5QvrPH峍iL] dr`16WmERD„sOV' Ad9VN+GJ ,eWЖi@X)kPmU# x'xITiu&d\ܜ>~S,и;Ё64[}% ޕOȭ!6 :='ck\@ֻV:xN4x0) irv,s<@C.&4)۞_~i-nbF+=nbVrEz:4-t]\stpt1HO-J<ĹVKsIEOϭ65t{XZѾ-LCLZ_6\z@}U\Z41mĀ'eC ;!܇c3M%:;>O 7N`Q"\D%=L \Qnr2 _QNѿv=?_/x}r€rƥ~Y̯pk:Y1>sjw>V5"-z&?"L'ܪq/hn ͠@-e`qF suL9&G+ }tRy [d8,rϠ$ ,3n/,2O2{H[ C `i?=}tB1uJ.1$I"XY%PkTZn*dYJMnehD迂ˢ#гd]$*%!-;pUb^b)`=[Ayc`̅ڝ1>bq)%u#7KlIs0\ {Р).- Hk f/qsCH6A4y`oG8q7='Or I2+ƍZdqC'X[t=$ ,+sq!B SI `$ J̇ 8ࣚ) 0iޏbXtĚ|̹n5U8{kwЂqCyگ/t )3h'`|/VzӅG뱟`ƺKqikMh%VgmdIl<7\M Vu:,GH+6 G!sRT eA&Zڄx0N [jf H2sAuLiZشؚJSElްZmƶܾ~g{E47^H Q*!G9k 6f;ҹ|:y*?$hb#IiPgP23Ճyc#dz#@XvڡM67庎zl݆e+1b-^jS+^b W1*AU)V+vwb^Ʉ@E'sn]hw n > _PÔȰihq/w/6՘ht-. 2pec"E>ڬ2? ;Z*:q'01Y]5 q㪆6MUfGGi~03=O8L,؊Q0Y9 4I11NA$h. Aqq)~\k6,Fuʆ:Zs?4c^δ#u WCvmvmxm 7Z_o'DŽۼb`%RT&.ԣ 2GɒEwS_ݯ^NKr}T!-c Фau\T\gC -;x6 3 ;G,,}'1~ ΝWbso?~(j/B,KbVK3՟^#/￱? Ħ™4wXFG%"xjS7EҢU ¤QހzZ)&=* $a'QC cRI| yHG ڒJ$UA#hQ#$d \k J8)x8RnL{e| 휰U@8͇Tuj3 I.Yk/WxAA,0@Xqb3h~lS!` P^ *cWА1C=|@?F$$0^YlQx%l}5d|c 'c~ R msn|yY/2.$`,Ԁ[6XgAUlɌe{Ucm`e2F]:1@$tSŢ%O*2sI;B +|jnivmvmAK_ZXkF4c?_?,se(JD5n [n6:lO>yQD0^5Ws[ 2G,azK 5ݰ 8/Wá[@n V+[ϲȮ{{~/n<'F':Z}8NW[lo> Ń?4\NH~wyA4S+腯l2} !"BfAG#2- 5q+@tYbFEe>9vv ~PҐdt$tXI<{s_vPm s|zj7ܲRKԫ5Y@r1ELGΓGT8Ln/U08/b4-&a tӠљ&r?2.XB 1AcO|Iyk9S%/kXbvvmYR)x0?S P\|~'LaQܸYX(!6=Q?t0xG87[`V]۵]^K.jk߱']]tN+#+,6ƕxܮ":{X nkָ>ʻJ+Ҝh:rCЃ4Q zσ6ֱ;qhڔClL5dkkk{Q?*;k`?/ UY;ugoBb3h9uiݩ(MAUF&Kժr~yO~/??'nNXArn\٣;CSW;Ul0fTØs'_.gDBl,!_e[]ng?whIM06F'@c0G/^.|WO>Dÿuy02=G9*w[3 2fĖns<H@&@a?IBEP7Z:f| SJ4(ݏt0h i.B!U]۵]^se}/7W?/€ܪXfX&$nbiD '?w~_/%4)I [-Q j&!_*CfY4`e?_5=[2AS?&W(8/Zrķ\gMbq ۄm37MK\YJs{ݲgaI%0K) ^o/yI'wH+Ӟ'@ jBN3$5}&hv c#@>N Ւ9VF'"ZE;61@,hrPaȜgo܁0[g]>Oe\1ui!9WYtzXFPDJz{Z TS0՜@LʩŠ6}FiVd겊e"oQ\J.:Es;,`X{J8 hLT5lLp.}t948oo\cB$#ݛ90%ZY8tk6L O74l0r NckH p%`Kgd5+ΥB/Gc\ؕ?g=#wqʍu0{kkk)ikʐfobywKDl%5&dXbMW\]M|vcwަdc7"L3ZvSV4Jk|qIA(YBQ#<$ <|[4V!c>o{9p+xkkx &'Flsiy?-eo?H{A\Pg[;$@7~2*@B+[9ֽav?IA (@z`CHKjr+E^cs?dIْ[sM >،:TE#Y'؄KآLI? ʎ1@Yŧ;"v+ r/#՛+Dbju p'eowƚyMKX-Zzu `VRPL$?raB5ɺH ,LAmttULњ VJQ|>B|v|o?n?gJY'X"v<cr.jDkVaWICJ:EL`^p{}B1+y,:ި$kϭ fɝETNkk K"FԴ~O[?B ƒuL,(I p8xb-J<pp ~Uق,Fx`h;Gk*"ʞ`JA*4`ms"ZsE\{ ֙mvL5nǾ;=lUAY/kwhxMB'rk{¸2{ywVR+LTI)_p Oex!mWA 5 &8`t{+),,Qĝ3pC#\nD b ..ڍnX~KC`&$> Z  a5a>AJMP}'Zؑ*s@QRҧDUӭE32 )@eIkݵU֫_mȲRpKs6DL=&y(ş1k 05jkѩ}XIsaCyjN~:q> "&Bϯa P(@ 8pˆxdh5E2o@\`\fGcOzϳMXGQZM }+853jG@̧罓(0b#9%*Mfk1FfXn8axmvmxm/ƕQodK Mqw?I39 {s(kqRM̀[1D# ScD">5Ȍ-~Ut֣]4k.}j$h!h*쏒TX9; 6N6F5dEfQU@MUC ɖk­<6NNq- <,ŦٖjnNfy8{>LPx8ѹwlEhrt:u%||Z"QrL fҌwC 6AjX,RyB6i5 ` M.>wbt*l?bnˠddӍh'8f e1 Mg9wr$]j K^۵]۵]}6vS"x?c*΢ qۊh-ptn8uVЩb58lcſ?wCD"bc9YGZ:(B6!8] 'V)KNZbnUsiV2UW ~&WܚE /p&] *G<2Fc 8uGhGVb!Я>_ +zV-UHÄ9F5ZcnPB@T FVzZJ6Eڮڮ%rGq~ V)-]n]_0hHby/` KGNM~_v(FpL6837"]q ?}Fۧ8jA?^i% ,dD8A|t=G~so=ƫQ{0l]D}~ }ɉ5-BQLĩe^߯?_^2LLF<K]q?Rf:.r0DSk] 6i/M%DX{m#CфA_.U;AZYхqb۱EK#<;&I+.Y,`eqOb$yig&i/ >Xk`f2y@'Ժr&+Tc$!wfJP4N~v8' 1Z$,`@_W (0"t2(p .0׾u).~+ʊpamھ@0g.2t.:X|lTيQf+(J4:Lv酲ҎXqe+#U!1<+W.O[Y*‹3: ^ lQ؂@s! Q\OS(lNeuĆڮڮt'? 3#^('Ӡ#z! TJb%j)0KEu^svo[ BLÞ.h6Z[UCluynTqkq PF_1Bmi6p̹C-.j#c<1¬%m'ӯ?CCWk~9HyDbs*vjzn+ED. cq?7MλH2s"(K,%rW6[ʅ=I[VcU@캨n9kre,ץ:<]'_LȀKu!r$ M5  (C~M.GK@1Z1Y.,u ®~\VI2Ӱ@308o 0h ]6 \e`R[sB$z ̄*$S#,3XklSX/]p٭S il[|<[;$S\XӹĿq,dgQJ$(g)ȑ(|`fmί'<2@V2}y,m4Nv1G~s>GA~b. ~A~Me_p+Ht_]-Ć1V.lG>eHu cy Q$)ϫsb"Ml ڮ.~U[gjDp-k}Ml?i'% 1 /z+qAFN~o v[xd)Pߜ JH q:!R`xBAnbB`Ko\ģ(s/v6߂w˷;& H׆bJsh IˇD^?b[P!e yi~H`'"R֞v tKm*>`}1=̌x}l ȞfSМB6;x\*X1^ n;1`0!l&;M!UZ 6O5'C_0^YcdOAXw VC^ݯ_GjG^@z%Je[fQew< ,c^B#d Z@'!RuBKmzW\{28|cmȓɇ+:Yjsd:k5SM[Dzяkf``*AFm7%:t8u-qڰ3P;0bFLMbq9j^qa̪^EXׯ)uس& ڮ.~]l("y]~׆ S`( UrYtb1uYdrqƨ7_ Qn,BQ'%ՑYW [jЎB MLV+a#`-kQ '&k͗}wO5y Bc|r㚂2^r7`-k_>0`#x̎a4Dffeb(E߶ôOM۵HB!I,R(n`<"hKpMx:='f&yF ablE}fU03$Zq =cŶM+pE5G⍱и|宕Cha0˥ץgTScb^Kz Yz"LʢpwenXށPX4Ip| 8l hSѵC${3ϬG abnR}.^>]62N>ۇs!XrC6LmLa<b>xa򻵋xmvmxm/6'ȹkϽr&Uoi ~{mU Qc]f;%Fu:s5c7DZW-8 j ."#8'";?3VπN|C?؎Q4@L'f-_58=_~+LB`m sr&|ZULbHt5e`3 Dos 쥿'莁teAK(!@XK0֢3< Z1#0aCҒwg ; Ak ^q[0[,uɩеKb"Mrgu;)9z8j)Q s:ɠ۵=WR@kXXuGnX%9r=sΥC_rkkk{ѶKvC_dSjH\QǹqW+{]7Dԙ3 ) ́t7z _KRXd^f!;^j۫9i!`pE 6nKf8V%# A8./A?/_~^q QQ:@#t Y¡ f0nLV +%,0q Nl}=>`#= Jڂ!i g£ծ&O?'~EjW].Cl ɠ,& ,(yrOI0&dxjq4'N2CwJma0KعXllP8bM]{Km23 P[ }ȵr4BӱAFQ ‹pf(&6Rj}͝/W zh |:Yn:oeg*BP:;v];qokjtd6VQmL.g[0e@ypp9ZYSSy)G:HK"~PeAA9ϥ YAbZlBzu.}g0x՚ܪٞ݅PjszZ C6l- j6i*@8i)Nru<ƭT;G#;\M2.&n9`,xᕥwxfXn Yx N  E"^ Jڻ|xQ1?1x1aqm!b6M7@޿~aᑞ~Jb8ǥQ6^5ws,eΊv FZS3%)];goB3mɁ/z&R "q`G>%x lG#PYacbDܥ鼋i~\]۵]ൽ@`nxkÙXg481ZXQL _ѯaڪ춗9{ku'DMF8,jD{rc'`[S&Xn4FRK<*gk@T*^!)ݞ[3Ttѷ/QI߯b93e."&1T>v3h 0XQ JE9;ͩMЫLSOd_90 d%/ZhxQpq. - +a&n]DhoҤ%_gN,in~ƨQU~,MZ Il5T< ">ɳOTѫi=O{NWg Ҷ;>(Zi bʪǜhXBbN-DurZo jFUĂj jߕ][q…} >:E5bLɊl!2blJ:tC#:FE1[1_FG|qO\Bi?> oUM%J %[t ~g蒊dc6"=39vXd80=ڔ0?ݚ^ۉ՘`'eBux={L,&4{eX,Pfk Qy8oJ .  HǜMHPS{TDB0 9|iVp wm{XJ:5{N9-i f+|21w)^ \&SpCy^V\؊ 1'cb',Y$uCWx!DBeOZO wq+O'NS5 Y<#@B5>/T"j>: τV\MODr7Ef9>1|y̸s5&ٴZW%p{Áی91q!xkߏs %C.(cS(@52s)5))/P{<߹]_+:#kЖ`B[EyX7P%9uҌ 6 |}p20žtlj(vmvmxm/ OL &6+$UC-P; O+3F2'_~[LhG"ʬ!`rK]vhJ{oe%MJol 9/OW K2P:1i$GO&K@c5Ȥ>'lfV=GcvݰmrЗolo'G*j\ڠt:􈐝RYg`"w;_)(<2CC֊2e&Wjkf"Y·!0ܦɸk0XZS(O۶b n^2질(_kןFrT+x9&asXZ6"AT1ՄR JV VcyGJBVΘ^Is䚿`iC p6'Sp( :J,&Źk otLZAVڷ+P1klw6tpr$;:Wh1UF 3BQ(e2#lWV$2V+FF<$~yuK 1kkhK:nA 5[̂-uJ{M܊U RsM ^Ї.|f:!H>cϊR@ Yx 3QHBMؽ^18wH.v*(YP@,j|b7!oyҰ0ly; i=|wA:FqzaY y-رlнAb ={mvmv2*e=@H82 Bgu{rv1Jsv]8B#Ɨt6K68# j scj[&HǽHP:VsIcn&`GiMnEԘ0>Cd'obۯMo^pvQ'7=liZF[ J ؼ~1m7[$gF.g`` ^/kp7BY+P=Цx0FGEG`-sZޖl bN؃JW¥s,TBJB/[h1=--#U Wk{,Mھ<@V$#UMo˰5;؛eX|PjO! f U+´":ϐMMh3NmuO_g+22:mIŬ!P%_Y;3&65; +Qv'f^532*|*،; LaǪi Wvr)?BA:wDo<*e$*@<&9鳥u# 4(,SYpOEFqU+KFS")+*źmFa]mV]۵]^D^@uQC>Q 3Cd$Q5 2)̈Y$O䰯'W['}eu,Xgip7e`ڞJ6QJ#G W@9#wsrkRGRp@r{GK9&fk9?QAKK){#8q)- !0b?ws[`mVڬQ {pFnxTgImӗP4Y[eʓ$p ]+éҳBhÍ&ZU"-hEO1xLvei}\;\Fp>Lad#BA!L@qg-86d߂f,AV~0ADO@P81f!݂l ]Q8F@q1+_ãZDsWʔXC2!)ˁeM * yEFsT,Ox0Zq]X1m6}Y㉥t6'6x&>r"t X"\<}'σ4Ճ s }mJFC/ӺP2҂)O2Jr\-vmvc~[/mޞdhEQ;E"zݍyG=m@dg0Ҹ;x:=I8{)ᓁ EL@$a99_> nɁ+ 241o(fH}^@ML#io%Hr&5A,OHxӶsJ_엥Z9("2N{?5$EvBQ8!Κ02B8<4e?ދiBk]^Զ#  uv_q,qLHŌH&Ӂb9@ǖgf6TLŔ:" +p'"m>>)~Qrz_>^ h{۔|Bbr`$v=/[_~z`2US8v 9(\U&sl`N> (AZv6X$i20+ NPboFWooꗯ/ǩld0jܧH(V{@.}|5;ۀ]A>\ 5FbCp"V NmA{8! 2Àͩ'ȤU閲QJZȌYԳPP4aY#\ݷU`\ Uy9jgs&-f.U]JḠ"KC JZ&`Vjچq AAg` ŚXls~c4  7{SϣE2\FI9~f? 躘p.w?|o+d$te9\ X!(%=&]<} 11$^r5ƬL)UxHb Kb 朏^jc˭nsL7 lydxQw-yνyu׸#DQnHQ^GqF>OCAHlƠol,iְȈ2?xք~5y,mkk V/sK\ˁRH,#PQ-?~{|u޹%? h ~IM Q ;b1=ɞ)"o,^`*DMIcő/ ibj[ Z{%{n~~y+M@IprB~xy=9Jw@1<Oz8iVamT}ist>?ou;[n }"e.FL}'W){@[3d[,JmS3ceCB N!=m¹">͜DuD=A%س@: KNąwmS3l2ƺ] V:k42.X&c4:¦$`EQD|F `?hx?[q;-^!0 <ަztl1SaZ^Gf-FgqS1-ԿnyVTq,֡XMMTunP*\f&%rÉM-.eVN0xh.]+s:6Qغl X$t'j@4g{jDs<\%-H7Fwyu1Kų38a,Dkk l;^WJI(Z%8 ,- v1&&8VOㄵRx6G`J}PP3`&VV:[Ns~xV#?>]QנU0VFMeM۵u T@J%Eyyys~W>`(S ֤ c+@u j;t]|{ rr_hR^(y0*V9zq9c01n~y_FP&wEbeC8pNWs;4=X7Hk},fɺeG`c/o KVΖ2u: MD+!1BlвuHYyĕ@z[Fuyji=]/PIZ aQ^? (a]ױcd_u!0Z|fZ9Ze4#b|B7'kk uC!wU3Lgʹ oص*ZШ&xkĸk8U&-)~~W8YOl&j\yӤ=rv X})(!A("Hqݩ{=F*٥V_ڿ.L@\JYde=9O~~ }1?gj~$"L8<>w3w>o)md<.C&V1bY2+ZZ{- Z3I3qI<qTqih@J)j!g[6VBu+'mnMv:Zp!yfd-iK7f!㦺J^,C sXprC[?̶:(M}>^,Aq];YkpaVzP95( omd DyUCd@ [*6̂HX!T>C,`sJ704t*$`ԭp7A2--sY]t%eܭk/vAF;ac^/ٮ9uYOaԇ q>:<UT0O U\N6!KA./rϺS/v } p$H%lZԝnET'z ;_ߵ]۵]ൽW=a~[Ba0]̏հ1BE2 n_-elSn/Է|<#Nt%d&v1\!(?P29ER~Gd8bqe؏4@D|81nL`ACEj=6iNrܽߨ BҖ5D6r/]seFty{i Er^`J2Zpi?>7;0mø$yE״T2РŌ8LCi > m|.RK{Z̄tn7]}Ș -M4n1Ny&>[L~Ws*&[2bV4SX]L[8Y* f\ I:lp1 5 2gJ 0>d{a.wcq2p`uiΏC|jZ"[Qo錾(k qG^= rE`G?G_>~yeYUoPkۛڋ#NR1%7^=s%X8ĂCK((gʵwvv"eEI;و;u`\È3wM'PWplpj3k3$Ju?5rL¬VY\Y']ZGQAC jBAx-ȝF&E S1mKåJ%ńhڨe|HRTS$_[RJ%.b@ bBЈh[ξϽ眵5UKuo{=g^ݕ;TNT_ -$Ma*~NC>MxFQr(f/4Rz|ȉJ^VhPzFUWgRyPbYZ` aL^00}'*U| ǘ:RQ(hT ]2:$-8ut5ò{6Ml<(r5)76EoesH;Β 1'7(EG21*B:L һi[;o;Pg^ K|U[Qbwyȟj_I͞Q ~&r1ưi"q?qq K^T8voo4y&C^塷=9׫=Y-F5W6[̴aP \)Rd[(@%?9v̅Ej &(^ѯñgކ:fu.f,Cx^л3b1J?b$ 0Tռyva_,ig7.7p>E4e6q0 =%d3@9wjb- 1R'\ c2 l%~FWfht3LD)U׉uHO(!,;UXee o-TuxzbHbw3h[GcZ c)_O JJC'A[ʳm ^q |3 [[ǔ cp lRDX|8\BqI+e9 Zvnvn'xn7ŀlD/oz{TK TB`bXSQ^ґȢ_}_{ƴHŒ{5sD8TkNhDʗM stFƖ~`8x5ZzpQGCWǥ%])whnV9 f=?.&lMԝnW~b}e6gu0uu5ؙUQp⏣$`ΊƂg;4FqBE5F۹lB:UyVSL^LwJѸ!yV&ݍSЎWV;eLnƼ4[l*tpF534uE[yrC зT% E+a0R1Jm),M>qn,?WȦlk'?~sqhsrs'+燣18 N0zr%W>W|12 &>COyk1' "u:טק[ f3BX]߉}Pot}0u=$p7,.u kӏ"h1*Rkd qqhђj(yRdX2 >iGCdRâ"QKNؘE(vh=>v۹ 7tѯΗLJ9)a C4FFVBQ1VݹZ,/ѫ y픣hJz4%O{P:=آU WNoAV@UMHfK./ԴU\RUOQ+R#"t@(_Ҏä&jC?# 9QVB[4GA9!˸Zo%qk~٦N0.iͲdl9x ÌD}C{*uK~3&}P`x*A{ehK~`"GDE4x y𠔬\$7%u&YӼmD rO A3٤l_Y-Kv"jaފ;tz+o1/};^?MJ_ wt|YF@(P˔Z3dXUKj'Ҧ-~1i;~ۏqH%p80ƱQa-nFO~^`ZCp%g%dd}0ހdFZ^44JQ! t>(lƶO`BU][v 6?Zu9$=G=e70c}Qq\Gxjl GU$a۵«@_Zu#/t *Z2xY6}ܲ,ʆq ,!PeU=\$`~%XxcKj4~fAZDД*w? ̅Lh!bFFJf`PEA[/C^|%„h/Up GwمGwZ4Lht";=-],SS[ދ%i%J&Qe oF@1* K^ ؏%PѢ =fPf,[vfV8V j 78Y-Td iOLa6Czycp?(Cf Ƅjw^*U%GU)Z}Y =soU)bIlIHUĘ,10.z`b$@L7FByr[)h`Ea*w3~+?k1{/B.7X|[hGFtdB[HmH(;A9"W&};Elw[bcgrΪ0E|>@"uBŌ"vjڵ"]qʥdvѶby,Ӳ5ֲIZ;l4J$B1WAx+|t6$C'a>jRk=3s;s;s+@ryzV=J4$ݰbUpql`p%wi7%7"5,'Rr-~ "0YFǶ*hY~䋎6  $BX( 9e1 [ֈOo֛fYH7w +{mч* 6]di 0駩Z&sQ aMeݧВ 63"hYFc>̯$&Ft@8I:tQzchV`a XH2=4&Z%sؚV'/vi`Ms; zoXXMnpm|2'\(F{l;t >N`2d\ Z ܑ DJ d9{HS `oPwscV0tB_=9sb*jRT( Gl ,+jhFoERIn&{篹De)j2~vȂ>Xר[B3ru|l!v21\^ec/D͸?Sh{Ѝe [[>nɾ_krzZPT'3jh/= :,f4ŗG \6I ;{҇w&v5RRm@I+EM5-rB~ĭ>^ >YGsa#7k~?itl#G nȠBb2~B38]OM'P?2r? ?6 N0cRbw 8 K{^$s~Eu2:NXYsW!p IT )w%Sqbx`g:Z|Uy\}]fٛQ*;4A$d I&™G ޤ*gGPTbTj17l۹۹ݎmŋ|izPW YdZqۢ2 $A•ȏnnBu(P@DFRf%J qߤ I#A&S(X)x[4 k[HD65AmEl,0)TmG~1nդ5.NIC ERf{`.a[uq>][z 4="qbj |5`ov.ARk_blZ]0/Jsd2aFp-(_ĪQWR?<|%>lglr-T$9(nI4N:Om|իhz#Jh .KoJ--Z!JT| MC1K{"kXo{޺mw<YH>ͰĐ(j2ÊTC9eFI饳ʱm!"V4C:[gf/m-c2LsQ;0/X*dMAW 3rQP/mFf`ץ?5(QpnT3x+we2bKڃU ,&C'hZȠ]R“{.V`Mz|̡hZSn5cK¼vvnvv۷PUyWW`dh1L^BuP-PX`Ҿ da{S*@d۫$ا)^5ɺ%RRsZ>h teYEXMFq\zBc7r#'&G4S:-~.W~WxpRlRDL`Z~k+g/"YIHUYl%6˖#K#֤196߷]OTFXUnqe@Kcޢy$9bԚO"Y+LBkj_k݊lòId$n1 e~3 5Eì1@j,ڂ=A8ڼJ@J_ԟҹI$ %, tij#Y]jh01~i^y^Z 6>9.1յrzF1AT5Uۍ =fe2|mmk24nQ $5yϡKjuܭ"쾀)H,ED.Eީr-bŭ1s?8UW .KT_\M". t#UUkM/QNcMebU'0ׅ*3,ڎaI"8a sX/W09s;s;s׸&'[CN`tHjj rk b#@$1r5n?%P%')nJ!EX zmW2"@3%-gv,dd} c R%G9/Ɯp;):.7NTa4`j^$\8<TەҮ5c 7 %[^b}䏷~3y/? 1brQyAn]7v`2Xc"Þ7rjOؽU} eKRŮ\N8brFfCG~%IFYVi ' $teR% UppTQvDD/2W$y F%Zk %w 25b&B"r(؆Fo;o 452xGRrCB@#Qmd-k &jg|LdIȦb")BJӢ] J0xn1`(^`ZDnTZׂF6u5a`3}"̃#]-ÔaL&`ºZJ%zѨSKb1";N^ch / ϕgznvn'xn{e!W;TeFu0rd04<͂1*K-cw#vtƕQ#h(~M!xIreJ )1"1B4dhc0hoHp%1PjH9Q@>$m¯:MaJ#MvN(g8O3"&kɹ۹ 7 +ZtKm2vQIk ^ RyE7k%[[q') (Z[AQO#U-ՁhMGt4;a&r+VpTqἻ$ՏQD?"#aht Fe uA8bÍ!N} -T {`>池?dW~[-6hENbZLf͒ܢ'դ)@WyUhPd)ʮ L?SD J .7#ke@`2 !SYAVdWFZ45ՐhES"3h({lo0яG/ACOWPXfL>WzV񻵓zҲw=!"`(A'l]lտTKҀW-@9BsaSNyl3 x}܀4qfEx9XT>MQmm-4ZUW!3| 2 lc ҇ '&mLgg/CoohMJ8`T.4DhɊy!S{؏ՋhI{d(y 5="0nTzAc//>pEg'f^*2 m5e͇*2E-)Ox,Vr#1n 3rtʁeYg)P,'>8 R6T!*v!0&joƒweV>HAiVN?~ۮ[5Оc9\ɌKp̆Ac>xa,pR:ކ2v"\Co#`66ԉ }?YW ݵ98QV|Ԍh |A)"EЏ(hubM')[tpA4 g>FwM 7:}uqZlȱK.x(BWQk^Ls6A~{/T@`[c(9mTe5.y{Av- a/zUΟi, aK߯$epFK3Y |G1e_t4 Gs%7 y0wTmh! T'.) Ƣi%OɬU O3ou+bTo<'HN4%y:{:Z]m5\y[ 14!2H@pX6[ ]grAYղ}Ac+Ns%9Af/-86gtp[M Paz$M.R=&gTpUEoxպ-SœQ>X?w!k&cy?f C1~1#TQ3P"+)fKWc-]`QVf4QB >LmGԁ&kIaL4/ҤqguT^=ⷿÊ Ֆ˞k*y=2-N%2 E5 WK/&VF@20ۑ68J&^S& vNu :cŚ8[ݏ*R4Z7o`jp9#}nA4#=樽`d!yljQ%>xRyGae6/CKɭH[Ϙ#!鹂knӐm HSs%Vx ^Jjb,̋dK3?qX6EKeJ k*]w߽9 xB]źNj~: jESMv62isєZ B𼄤Nx޺e4#'鵩o6Uj7ԮP\@,&lڄp$A9`DlMQ2IF icqҠK2 R! )!&,IMoѯķNk/P xryMĺ9ldysaEOb amnLaXF`2}Qhwp?B й1:oOx,Ti׌% [GnoyVwCks;HDʖk3ߛ jC؂W^;ظG u]νayb9B`;Ms8RĘkKvk8_*bQ:pq4O+# s^n1oKdƇPuuRҘO!jlj۹ۿIr FP}='umڠ[Z1VpJFG)9M~T BC""K99\-%lԹNlpV?Q֮d&x򽦒~FS~UĤ8쵡W Q7~ClbF$aI6m!6|_k$OY6ؐ I~ڳ% gcO!w1c0k2Wíhϖa@2ȋz2WfQq֌r`v TM?NdqtujG)awIcu%_ž :F,@+ ^i8605EJC6FH lh$WU2OIDs;o(vKmѦ!!KyU`IvoU_:\gel(;F w('D-Bw_ xVYµ['˸(j92^t-FJ΋Ele> >Ơ1c-M*K[Fr ,E$2fFJt25ǾF:%&oC='.Ӡ}'X2f| < AMQӉp_ČIl ,nQjE> 魪}H5p&Y]rvzfr։Z;ٹxҪ}.nbdWUFEdd xyzwcWy/1pi1v Њ>N.cZ .Va *BkWu#(4.U:;&بu@r8b}NA 5 goq[>_W~tsԟCen]~,Ŧl]UnO uE2e?m=r%c|V6L;ƴa5"ɍp8smR9^KmW KbmVؕRBU'q~Y l:wjJItf Y8)Q%5%VCeh. SNn3׮ԯ=^c=Q"A [Qn=Kъ2`%wVVUal?WsԿ<\)ЗR_F& "b]Z˄Q!Z`.6. sZT-+jv[e`P3uZQZxl*!d}\ӫh]pG @̽$)޳҉۹ nl/\ehJ 08"բO P¬?5).b]ڈ! I* <]Tax$Y/Vg\K)E$YJ2j  C4}NagɅlWet_ A~@J *Jxbl`?D@<~swwc~{̯n{ͮmdU =*}&~ܐ b0(k2Ј`Y&Ja /v-@r$bp݀RMu`q]IA6դ7r/_U-D즔 Xٜ֚~Oq&A>K<4̸Qʸwcd"жF`3r,EFCmuYdpp b@J/%m`=tfްhegn lԲl&by1Ck$'"+j(ŶJ<m1_{fE:nÙ; v,Łu(g[zben-]hG"汑 QTt]UY2qTeXtRAw 04Jb0Bg&] d8Wy5v}Th ',Nnv/|k6wA94LT6KcE╖?By0@?s! 5{>BSX^4 T:M\[/t:LZQ p)[f3+Z mdFJjGfh+7uxFDQv_򼹸A{/9A3z09ӯ^Pú[ǘ^GNܾxlwv֊̄.jhіa vhLLJMkHn-0~0Uu T5(ThهF1K6`=#$: e >Q2G'zuhXI|{BE@hh{qȖ}7'e7Ψɔh`Ҝ \kcTDj&Fj J V4s^ 5~?~?iF9 Ψ)թE*&E yn\QvI+&PH 0ZS14QhqL=͏M)xƛzoڻB2c0,/ oŐLIlTj}ܱ!, g̅ͮ@M;ιE~o-X>\Ehdl`'T |Ay}ZE5s@4*%종|!(2bP'i caf;\ k}%f߯nVml ş[yv'r(iMky5("r52 ?ڀM;VQFҨdZkf%c>5dҾ]!SazTX`gh 0)Er`A:Opz~C 65ÒIL`IZK G`diV1B27ass;s;<۱}q~q WU,DUY_Kr4<0*n3(½7Cx ؇jm-)Ncqϐqa RGP-uOO~@EJI9QV@*x !4bЮX wЃ[z?B,luɠ&C} MO$j}BlNKk!#ulfHSsxC _5G&O?Z#O8}_ȟ1|F9T]A,ic@cL},j8)i{kYPQ`졽-Q_!l@ аSJي`o/P\,ܨL6-0QPD'o;xg/ǥ` j-\*砏:i¢*m;6V/šXȩ)i`+֮I7Y>54j1?ҷ/e)h/MlFܯ 9V{_1 R?a6O4>VF$V8N=8 ,_0\&7j%'cnY0Uwwz҆EZ0Rإ^ygڕ1X; )B ݮ& lèXA| g;56~ +<2G;f ,2tgu~Nܾ1.@Q_ן4IhufL" &f#Ѣ@p!8 o\(& f%-`HT2 *qEsoГoFDƥ'8aEat b0~e1i@UKv6 v@5':;ZWñ'- Tl>35W͙so'OC>upV%\le&~ k['jBp 0RWΥZxqZm;aЁ0Vh d,Ła9 h<.6_ ~=5pc F T0<)aO%8oCpEsK*k(@!&EQ!\M]!#>.:mv14AZf/ ^ h+k9;vnvv۷MKƧ}4TZ{F3JC>j Hiu 9o-[)0 ABa:O5VDNr":*h2?hL <.(VccEҥ"pQ)BXQ3$~G eBL]7dOn}5VYK `8~dY1=c @#>]~][o['ُYO'w; e,SР$0qc F#]#Ө%R`&ٙIȆ8ڙa.kkh@k%z3er\seu'đ$xXωHQQE< E3R;ֱhpf :U,d\QxGwUL؊I%@)YM" &0]s7 W%]Sz r/PµٗI@P2 %aNݳ~qe(AkOű Lp7'5Z0yQcb'TAq< :vnvn'xnPcxLR4(5i^1h)c_,ݳFڨZwS`֖w8k@ Sq~Ej]k%ƄA$9¢E:;yS'iƒ!;0%Vbt&fgb3D1V 04j>pBK_Kpv &hړlc}+LOve>O?i?_={B-$avKI? tFpGraUY >Ki taJ fi^s]î~IL6nSho_;դ5݉gڝ5$,0SwSrg>E6ZAonG%˜v T^%ٮL%Z5~m3崔c20(!/f8Q4 vh %= ; D1$ZZь" Z&w]N1vjVvn )@Cc ְakE4^C ~D_o@AEg嘣hPi6)m z8-Y̞p{ocJ%"'H3S*cxd9 \̍++ ¥RohC* Pp~ !0oR9%r֣S $_'cZF*): ۹ _U_bUٱ0XҺ3PBhqI\OnrnYhzw\bGLN\͉hZLP +Y] u 1H ZLZb^c*ki5VYբG\g3Z4%swc[7 @E(0('@4!K:ôY\]YGoS@/4^X_ >/ߔ]g}/w{+"|@WJ8ʮ(7 YQt +ӅU1Imp[:ַ DZֵ6aZp7 UX2P V/k? ,.:I^ Blu<5V.ȲWU>]koGK*Zd/4}\).Q➰O6̊E_ D lcE6cÉ_{; ` qIX4 }ךEۦ(?PE&P56;s ]!o q<Ɣ,bT2@$0Wҁ?8^wBvnvvMP/"1/kzkHb)[e['M6 V?AXm4*Eݍp$~ (Q#Ń {5嚋Γ%(Р'اjώ8I ,]]j(3܅DoJY֚ cĢX%{E;+I ZCn [䶥k+%}T"EQuw컴HxGkvk؀ۿ+ 3i)a^j -OҹfÒ` ˆEgA@B㞜nt[8~/c ^&d|L"2 CA>ĢBOPR1#, Βz&3kH_Mok!ݭB4GŠS,f݁6H0cĨր 0iVcӄXH2`c|]^ih_{` G/(B?32NJ t]KY[S8W?n ?dk-PP(HXG Evg"zPlh:ivZ(b!GK˕ASE6OdSʲo^%"\8(:mSH`*ADBlcņ,C*ĭ `bÛ10@*+̶"|nvnv|. ^VXe$;Sv Y4t~^aBH4{\+['tG_dCJuUgDA^ e+ձq6y6EW`PgQը%fBQJDPRjV 3 Jjpd>21 =Ig5}!05d m$8%Vٕ5mU-M/9VuǷ1x?mcn,P@%r3f4w yk40&jA΢m_pXYms]|>L XFZ\DV>+ %kbTP8 @ krZrJ伟s,aji2w2~J@6BLp4$%EilI2pI;4֟PWBӅ Pw_?GZK&A)Lg[Rp_@ES:ZTDdIgh.,I>MCdN'6P7dw'6I#l2Pr6M`Gx{mf!~Y~?'|<}bg~nkfd%$ DTNapPCaS`@1 =9$%a b7iZO/?uAO>&l@I$`m`h]6&VêC;p_g~/ „QfLQflE'HJjq¶kw q :<@>e,"Px|i,.DZ_\3,9,2|oRwЀ4m+BsON*m- |q5f2Fl\]S^m8\Z <.1lb@?fImzAŶ߸V MU?ut7@tXcAK.bAdg% *{; ZA$ۂ_ кL9@ЩaHާ]ON5~ iAJ i֒=׏fdFLC:Ԍ[ZLzc| 8Xy"Ǜ[jbZ A!rT{O,e\%6qʻj m-ӈJ*2V1|7>ڪ|H8UF}Zfvnvn'xne,۱u h,"6ĝXI&Ml5&7{nkhu<v!Rn* nH,*`vk]3 SI0X$Q1hpf}< ,V ZF ES(,DN'G50[{h?q5ۅ!tLvot"38i@Ó|0F&sTQϢ9&~f~''{9O;m&*p},`Thi/%4}Vۃ4xmhv+ Q8Y"l"{5`;Jebi~en^c{.Ua(qhcFN7:H":Y)p ,q@9i^6Qg\v)+1~Sч 3c*+ۑ`-@&?n{T> dopiV۰Uy8RX18nfzY -gUtʮX[8ٗk|8"qoZЏh(IL?z$KN{U8x'0!cƉ|{f??W؇s>+vgq01 0xGGRl-MџzMJ-N& =~I5HѲ4vy80fuh1?.J->iEN]CosKiAzr-@f=p*4Hcsjd {4@~~>O/?/ sHE^׿/x~6ƹb#3Ychw*(AXTD]>趯~?EeSk&T–h*~dv2k}{H }`h )z-]n?yWm LI/Z8DF5b_XC%륱"%F"|OpuĮaݏV$ &[:*=ZNSβꭂ1Uk> Ө 8mvnvv[#_<*x>ۡLڸU4W-vͣ 'ԀM[IΑHMU sU*q:cK@5l)-ihtnXXe pF|j̆o ;JlHv46a@,U͍VIQFb[$CGYL$./MxrUԙC2;'/?+?q?CI ~(mh4jO 3U)BF- h 'wdўմh*9:?u"Ǵ㲘 <{dAS0Q2<4@˯G~_3^82e0V@Xu8}*2bI80I_c[ğ1jY?Geg=vb@?Dg۹l.v^렀ap3EلTjG5T+ *8nϼG6FXPШ;BEW*Lh;`mh ^KD@&pAΧ:_xDಬ:;U^{ii}Ø0saZL\P?vv;3+~g؟_~?{'7F㛦Qۉ0c[?[;ZwSGAq{J_2ok}">o 0jZBQ0K"K+,RJKP E&:u8berQ( 0hPt>,:yLKӎBc$<pT)ZI$z~KDJn<57z_zF3.H3Xʼ&S\=8 -B$0) U=O߹۹UmGu^8{0l Sɬd}F|YeD":CBLI}~uh$f4 iJF-,² &ƞA41-Hk;eUfRUk" 65)kB8c F0IZUC6vퟹb!XEu[X izI(B;iw!tM@oF$2ۖce As(-j2J莼4L%߱16/- o ]'c_\d[Cê)9,NJTgjscXHp 4aH3sN4Ђh=4šm Y2=6F&Jx_-/)X1ZL+0W,FW% -XD@,Ⱦ&/}ƟivuoCxGvc c?K>F/y`=j|b!"66`XZs,O.kMK}?=_; οh(Yg8 K3Z'_U*jB<=[mu  {/ 좪ͽM} [QmZ +_R24(4{N\Ƃҋ!:Xl,iD9eXP'x8YX !R0 \&q\w121iX!VI$z4=llc0w"m\S3( xnvn'xnۣGO+TaM %Z,LC A{9 2SX"oPb`iav[fkYI>Cp9 @&VZ%Mu}*4XHl)@ W92Ƿ޳f~_2[RٳbM58&65O7t~IfZvsF3qṳT'xϿnO !g'Gイo/M>feWyZRKj5Z!4A3cp]$.W%<%yKR~NP) .l3ɚ@ Z#gAVwu9{[ko9{Naﵾ;=g U_fݘa[X'P5}RQplp~DÓ6E=&8r H.au J+]|.%Ϻfӆs}*Ԇ(N> ]bh) @㑮z~+&Vw43Oc< Z+T'?C}nТ/uϓݷt0:7Xg)Dעd$lksBq_z0a)$vge5JAԮ CJX*Q|/ m>˒, p= tj$3u.qq`Ur() 8h90 #sv1Mzi,` ꢽ=6F-@4LP%] s9s9<fّ  &L4zK/R-jBu=iӍ]Ht<0vEL/jr|O'N׵5َ!q &IBRqa [;TmZ!(~0v.-FNM3d_M@\Uj6lݴnGN `hrh,b6#0$Φ(}Hw`kZTҡܹx\Z*X!}tŭQ@lnLvx $-b _ &S"h27'C!Ma:E4_TɧV"_ލ$jXUZLjCp~x9^m?w7A>v0| mkoL>Ur*ٿ4KQA8Ls RC4LJ.v` "Rd5d|V$ ' ghLwtt6N/4 W_{E~# :#ZX[bg#q~jgkPx,1οn_~+`z#`|5Ѩ%EW*"f"d/Xrū}9յ,"`UkR5H_n&# *7 ,ffDKP ; 0(H,ʨ0k ExZ{=ycQ#mϧE8[F^1GcS! ITsj ۊ8ʦ{st#fPX$&' \\N\Rsׇeg}*bڞ@fLIh,K>ʃGL11VRMG^[Culb]] e2mRA[鿵U\z"6α(IxRH04ak{[phn7 0ob4DC&f8MԐAA-,!MV]6 x7Ǝft\J݀Y+kF$&2LZialXD[(F_G;_f&1? Ke#˭L} [焑%hHPS$4<-\ݏw?Xm`ruDZ[ӧRYope*zfS] bE} a\EٌpT?'k־ڵ`r&I cmi2O6G&Qrq(?_m&"פ!łCLaUt?eњ*(.2Jc«\LY^z)N,e1XybU4crCwK\@JW|ld7: ] *RdSojT^mľ Zx۩ 3Ķ\p5v.+K7)l&af *d`pwb8 ]Z9| |""Յs9s9<d޺suJRDƉ^S>nzE!f}BpuEﲮq:XɾUxJ@A IQ=ZgJiFTCV3K~BGIM%toS!&>vF & FҸIE 3DYo`rV=Aa,W9[ 9vhhtiH"WkChOG'VU!XJGY2td7AJx֜ `8έ˶XB+&?~u/›dMWwIҕD9"TYn'ÏLj7pfvLBCYa SҝæWn5f[!P1w|67 P2@>nXyjm8Agӷ}ſ|3AIlO= @1͠yc+ lH_9"ئM{~NsFu483 `ηT<`QQ@sh-ϣP'ìO^~s+4eOikjRJ$ظ󩊷e=Z]:mxόtK#7aY4ˣd091iH,Z%ִu0Zc`b̒t1֥4nh*[ .Bi+XL)"xԜ>O߹˹| =VX8e CH<@ |PDP[ؗG_> kLִ|D]9N̥ qۂYr}~-ZfgؘxcmS7M3 K1Ôz(CA^wuφ(i4 E1x1e0v R7nc{6k|W~4HN,j,x$/0BwCk,j"-*mXh@;EV`/|o5CO]w؁"ﰝ1!͸#EQ$a~Ccq26b4, sJ(pTF[ᴕ} oUo857tn\!gh5pԫ`^O-1"w tn/|yzS_B:ܘzK|]E8@Zc^}?-z1Ecnl[CquoX 'g* Z@yCqJjۀ%R hF!˕O7ucem;×1~;s<,~na߅ jJ' V BDCXi^\\N\1_Q";` ?p ה 6`(c3n\ةnZgaF; z -s"Bmp0 t9r;qN &`F|B>֍+-cp.6Q~| ++ \/#A3xj8ن{AN`L f 0Vh^mԲˠU%0h%LxW@O$Zomv6VwkvU f`תsr3:QsǢ6DΘBC`bb㩇ݏU\`hHShȘ[Y~WvFƝ%Z}LI?6™? w+heu_=zaHa5$ɰͯ,N@ ~T~7| %f)a#fr~$nqDo]^K}ݟo!a-V ?F.R(M¼nqxx}.nh~mλ@g5Q<>mV('%[c/[nc-#qG&4KlBfYp7+GCQ'cw? uM&&r.r.'x.ز K/)T9^sh)W%ޢ%Yn|< g@@E֑`dOؚ ?,Oe#Ap"@P;t@Rx4$1`m5αoౚ;+s-DW!H OP &4㹥*`Jg53 \QCIMQjMe~=)3o# [p{ڦ%(ڦ0j> MmƧk^qq+Kqu_OIwokn욃wZi "Z &I5 ˉq) E$j4V'K8VM~ Slof_R;pmZaUǬªB`46ػAv64Gs4&PԾQ&.9/33 '!!l2>k [bSd@ + >Z~7Ð'$di_e,j82m N,eZF:ޖO]~6wT8;L;,*&wx& EUKVKӡ  E  \.බ3QbbVZ >5ֻLb'h]8P*i`  ԰uSm]Ar-z (>ip]+ܪ๜˹|IKdלzR8DUgvSd<{&v ujC$="t}12lPZgjz \L3+O 5,~hHFQ"L V I35]Kc[, (tSb{' c Ol~1aLZUs(Cag܂9hByFJfZE H ?,H.[)E,..Tu $" 7v]3JL1X iߴo=?:O6 W?N/`(GR5\L~' f`%jـgUaʦ:L_*񃄨)?oqogSKlߨ<&wc(dx6'~ovz/3pWr  R1b4 q˔V}lUfUc0Wp.znsC'&O^_JϹoE :Z nVUDnPX-.Eg[.yWTP%:p*b9c S/i28in+hjX< -hӓXs]IwVK/ TBW"!+H 07"ͽj>s9s9sRTIۙ$h\Q hlL0!` »| hO}ms~Vo֨-O%hI6*R.̐ ݡGҼN\(rfYT:tOaph 3CюHZMmFj^"d$A#r_DBS 7y"(֑ M-:ي4[RcARɐ`П2@ZbH:pkw=)6( eox}$s[~p%0҈m{׀QwpحUx}\z?Z_-g˺hתE;)HU^c'dJdhm(61v"c !]sJpqbeg&q/,J6T[5:zCxN,tWUQ0 mo~,.\>~eG{0E jPv"Q MԎH`ƶǣruސAjDPzKE7✫}\1kl!k6b)F`.O⊎4.q|,ѭ }4VB e]Ri$i5=Æ.@P5C.*(bn[QJW4DM !Zzc' )0䭁+xޔN-+s2nE 5 _֯ ?`3 `DPX[B:Z܀AxCÂ2m-dkP& Mϻ+Rŀv=$V>Z0c[& Ԟ.[tݔ+CN' S敾xFS}/2a_nͅ/eo{'dG|OX1 jpmDiZQ)6 bϛ LaE]x'D ߬7H5ʍAAOBNC[SQ#}? G,Vq2x;YKAZ JStv)a5qv*B(aV'z1?o݋=.KuHX(<^cJ`,TX'>ZcnonXk(ѾQE%Ng!+n\(3R +V,~*\`TT(b@w2#s5/GLB#N`3>_X zv*mMcKqI e%4bK1p.GXzz˹  >><^PR+VwB'QJ x1@dIZrG@nMMB\1ݎk2 Iw c}wa O|_QAMUJa)t16f(yAKq|\Fc±Dh!}TBpGO9|t,@£EYm4oF镜+#0jMne I,V] v}/VF̻¡E I>P ]^6Aiy'f0N=,ggn-[ _eOa)ƥr-̐%f T%{DhSݺP@bsЭsb4㣷l*?k_~YKX 4U5c. /j[R7X5 xlvwFy+5n!IcLBk^my?~?~Quk6v-;?on9!9"?Js_VQ / Q|Cfh\a8Ɔ{w|hT ys*ZM аEy,[(}߻+_znFV4ic=2~ᘨd(ձͩ H<v:ROZBak,q+$qY&϶gq_=B RhgB(˔ESUX@X( RwßlΖ=^ #b4[bzl̅|m*಍-j2[|m@T$TI_d%TLU;f7! b?+jlZc  f%2O#Z:6ݓ#.+j/s˹ ˗d#rYeHYжYoa2Du\ZpŌEmn[U.,OE#2{NA/HG 3 |BQ*JFHtSC$0Oa_GC-cMdz{Q+bMԱ\Yp2-tcMD(a= o)f7UOXߢE8@7eA4݇p`1)@~ 0kAg=|OEXٟzz ׬74tHt˵zWդh-ޟX  ~o|6'`FT"&6p\,Xl2;:Dc|-!\`Vh6 %öSBHh+֮HN桒ui1˅%h1{W`66# nd 8#f}Zhw p53E6YfW}KñQWƹ˹ uOWRX&;bIч_EG#r%k0K\eF&v40amY@I0@^Ԁ /L^Xup б@66#:FEi7ޟgʮjPKLDY}S0(﬷˃[/BƩKM5 $#5:ёQঠ1mx踸7&3 `v%# LlN-0 0&l*h .s$+hvcbRf51Rh1aFIsH!yH\X"m&"5 5˹˹|Isc}q߂s/D\50RېjeFM R0`$flo 2VhvץըwҲ(ٻXҗ9vlbd rR3xv枍%tChvmrMco7S Uhϻ~7{ODo=IlMťL$>攇S˾ Ƽ.M"vX) +YʼpZ67{;aZt]jʙ[PF*}J9ZͭgµH @2$<Й]ocEMdxPì%^aX]fI :$ ܬ*+dVk1vs|, V'ԟ]Gw.r.r_C.3D>7Z>M}Eʅd64Jl1By[vzTbt©0 -] 1-;d[2멭fAP`ё2sPsxF`zl.@";;hg%I'-jݔuī'"zvJEuhNFɘNn(aZRM4$LA\K^Q8]Jy޲7 _kGTJWtӣKߦE0er9ޑ/h0-Ѧz\e 4:.0JU4] ʠLp_6R3lɨPLt{oMw?/z`;Q ,n;A9XG<%n]lڿ<~56CnWd|'(0ƣ߻EvwhUTL@uO pzO65t1y#af.<-|`s~?ȭwQk׬!5Spg-}=\\N\pw9B6MB2OuvU{eDf01'gL_E i*bȮ3fq|si* })nv^Ie=- SH^ЂM;V& bGhά?I V kiה$f7Ld߁@*=>Z Eb_T:f0w4=8`(0:6=w*n"]'=IK"c7@\ Xo>{wV~C\|Aw`Xz@.LUb,۹aTb61gPlcb,'Q q` oj7x}_$0MgU1tEo^9v. V~ cs 8+ZDKI]%#RDaMc! )AK]9$STCW& ݊ᗫie+j_ Vd2l"!cjb Ylh^~Sb3WxZp5\CTc/\\N\L/??֮IF[T`th`aCUXSz!5t0#o?$a㵦AF@`ch^VN }4 b5Β6X"1 FZ:x1[eIh)O=5<2UQt%5Rtm i]5'fet;t:&e 29IHF°=V :JfқШ67ж]e0w/qG֏$x\M'@&c1/t IH-1Y:]kpҹ/cxiQ&'o>6I`u6% pA۬H+UTQb @$XI=[Y/Ȍ ٣qc3ii D&';NLK[@/=\9ѡK ٜZ((y)5K6 hm18|ܜu/݄E6& 3RPH^XŎk^83\TPB m$tBb+qBNn 1J(` K%F;w }.cdٱPRV"ecc`ŜK7pgcq,\;c/ A<r.r%]4;mwd7QUHdLg!"kmw"<R~>aOcl52rc2I5bKN} 챡YoZ( % (5e>!i%')2ҺɤrlNG! RIoʦ_yJbP;SBZ%U 3+lee)->Zz{|Z6]i:~dR{ 2h]v䓍1sF%78X WjAh[~U_#~%^;':4k&X:?֟Z-~nF?oo+Ԡ%m2i.dͿ p|&l M/2iθAq'A7 |4zlD>;Hf@1,9+4dXؐ+M "@UN$ZU>c|ߓ T-c567æHnyK/s|wsl*U3dӠW; PKPćRfH<}Cj-+F& s@jVʆ9]Dv*h|l90¯Q\VY.k8w{*mv~HQy2 @APEM1EY\]c8sMOs9s9sR9н|nL'G%EYgh&X-fL뉂j$ |b?"f?tYB}0trZiΎn D1^[ۧәWDг֤$@ 2(GVs"vAlPr&3+{礝^ ֬0i^%@i]}Q,RK\Usv [AO:AJ6\RߡG@p&Fl#lv Hb{_ NwmwPޒ3 !RNq%,ǓZ X:/xҵc(h4 Z&k @`0fR(LAۧj]5oGB,E,iM>Q+r0vLK26Xb  !٧mA mN7f r.r.E0M {QqO0LC& $(i >ҬCE ]4g zםvI1W5lk Kf[PӃZD 1A-.gjHL6f`xYƱ3sk}.c3U#4(+VC+k,r?A*xk52/ 1CZE+i~^3:X$88د 6vuϮI`6->Ss~6=1CSM[{KrMqpjzdCx2G`޺t3j=3YkT]8VΘ\˷9^pVwO} ?|_o/sjSE^#HsFyp<gή $zɊMCł@pϽ ?aGq݊׼V3VJkuP]?0iRº X"3i oV(ZUmR-p4VXeU:^&ESvח&fZ:nQURpCXݎ[qK^dGu:O'`Nڷ튢"REXң좥Ύ 9fܪ((m{2ep(I=Vw@48=H8dx`|L=J=qSV$^"H;ip!-t^ 2 ,=SwC(yx9$I =P+KUs2*P+T;c[4\2ƤvԬBO}z|Րy+5.۰9-`^hh,ή[ve!J ͐rU"Θ?,^[K7Cc2OVuZ¡`V;> |?~?kwo[~GM\8F RD qXέړhDϸw160s"08mkt&8MtdO-Vȼˠ ,T=$O9H_ƜB0󭱽 *&FHW#WI.|b RhXD#%Eݴ8_ 5ZoPu~z_. դ&Ef6AjSI%c(M}C<LsAj fk TL :L(؉Z [yڛK6vp zw@HNKd_ѕ 諀!M<6B,p'cJ8jccPb\K<>ۍ@Dv1Z pdUKdԘD59|J4k.:m}HL X ~ С7F.}$ , /m` ]e 4І̊[~;6g64Vrmۅ]>yV|)0Ziӎ6oSr5kΡM1z8Q#]-Gt6o瀓p:у@!][,i2,c1Z pBbgXO$>B !H'95Ⱦ:pιR0rChil7i5%h́Ms7=~{6oKcoأwy'd4\n52-Aɮh,tO..s~}!Ça(`cY8ň"l:[cy\MN\ItVsŨY$R?bJM,OFEJf;r0Y%FsLĈ-:α!񨁮Cp}9 9\}6mE3Vv)SV]XCjб2:W}o ^ĵ-H%Qn}ZKF/~;KkO<_~Cooy>J忇=xc&Ͱh-|z)h*lSlo?~u?V)lJajP0Uhj>U R 6m9Rbl"_Z\Y6;cyE}m|^xYtZUv5`$ēҕ''ɥ_cы;ߤEk%RZvmH6FYP,8E5Q6A+4c$<Jmc^P`&ި/fzi˙f8cc_cljUѡ$S$ Q D`:*Mb@E&eЪҋ9DIcjι˹ t&{|rFk؞r >٦9 -=8`^$R8UmW&XH.ޅU)!?&{ %JԮ,Ap6*fT ˚DklXyL B`!.h *ʰ9Bb'K $ڙ2xMQorɳ;qjꀖM=;ī~A#} %0=ڱnnmڒ GcN{#M%0*"99&:@ TkN 4yµ0ݮ\ 1(60mU9D/$'EXXhol/~W{>o>[}|o_6@i-͘,Ө@.:^|Tb-g5@UoBDtȈ@_֏j~^/Bfe^lj6Q{ hf&&m:kVVXu8ӲI~~? 0V "m̢(qU `VW}^x߽tT:[$K^ݍ؉2M"4QUTf}h2Ll8톓ƬbE? sqڴu YؠQrT-,mQmZ(*S8ϘCjI%`FCGzh G#t8l -cs9s9|1wb-A4%Σk*d=ss9s9syA2i%^(9b6ƪ#:iRvDBR$ĦQz߽_[!ݜ_ւѭŨ!2@m )`Pg2Ai8F@ֆh} FWNYg3i$l(A P=(6M,d/'raRŐ ]:3+[#~$ Gf;",w?~fBnv'w_Rd3?Z|oW(\Z…XRԾ.UVi+ 'd1lJhsl]T`"4 l#{l/[6X`y*rUR%Jf ޿ىۋ5rj`+jJZ2Ƿ3YtE Zs!nSC-zrQjNJ\@A$ovu`.@EyyPVxw7i0?a[rܧ@ԼE6tay"Ng /|$K3ǰF..KJێ97+4c#> oX"(QW/*tY;PX%%D33DJqwem C3ۃRqڂڲ /vk#xXc?qMkJyP`bkKf (#ajc!q.r.r@ڮ67e#Hh!!ĪLg1%7UTv~ΒY)aE l][֓1/p خ4 **^'vmBϱԄ\P5j{TauIo 2TaȠ-2Nʚ:Uz%~ٶG?zawD-$yU k,q"*RBag7@zfQ5;w?_d$~qpݴ3cR6v[GQ`Z)dӒ  %h~}n >NYrifi8,R$sܢvi)APP IvohncWcJJT*.5FQ8F/ #Q@Two8E`|)bum Q֕Qh"|AiihkMp̏]ӏlC9}!Kr"ziqWqlǺr*~(bM|}c+-.E`ZZɹ^ Ѕ#mYn1uuVLA둜T16xf uںxnzq+Zʚ{y/,el9mY8Gji`aҦcrk>E*0Mc#cɺq},fgZQ]eBFm̤We(\Iόyb5Y--q+nU]I]W]!f)6LFLUUڦ}Nqm/>Q;q0=s9s9s.VÐ#~oO[ UtDV ȝ-0 ' @p_şj}|l8d8E3wL$0-IKPZoS!Bl#Xm0u0bo 1Q وL@cPogHDTpTQЪn_q b\jN ǎt2USZ^ia"r -Vs|;tm~տWe7@x?/_?_Gs Uc5"!-jMHيe[cuQۄ)*铩]_jLN+ .^^v$[rLZ!?be,K6Vh ʭovRy.AH\W -1 WEK@*jU=5Lw1k?;~WhQլ zI~{ʑ<_/ڂZ?^=)[dJ8tڡ$'0SKJrրeT p քB[/B_cZm~} i$>[MZ+G~i"\@QTΒSظ%f $m* j: 8pJ̀b/ $*EzY>oeٻsk`e5Mha(LH'!׊$5bH#jm QZb07h-)~dM´hdhNr[CZN1XndzXp` k0o o_S! (k.F!2)1)ZSeX%D n`JFWAZ,Hd C$3֞ɘdwGiivTb؀[V7HZ V:*JBH5V&˖s9s9<jb>r7H0{F0kkZP|EWqjKձI]/?kS"#k,@ mf!?hJr~@jaejvnVII:m wc:R 5+P.l~1Uд1K#7 vqzk?cCgfIX#Z9$W8-j?֖,L &u]4M~߿+7fynxgsU:t5C,S,W5ako @ƤMEXNX8EԒYi] iKy[!lA:c K !ʭD* @xU%&%`q̀߷F!U9,: N$5.t)Nk1n!R-R1&n5;qҎy|GkpXY"A^cZ] kd2S|t0.Cz=m6v5z7cB\F6= *Lޠhގk#7\\F,%Ч,Ame({SanS'ab`(C M}?zOoP IzRrR5]d(n@y:EJSP)M `aI:0̅DIeqhqUS%iýVfQisK',,D>ed\S&Cs)-=e=v||UG522S`CbpoƟuvVw@voc =--A%Ӌ<%dEAq84;dSҮ1pX52}_jə<7{vs֛گ!vb;!xqI[ƀ{@ɡ}PmJ%3jXp-˪&1 إ#~]P@i < F 3MN\d̥Xan_:)Rh5^ xLJCtcq8͘ 5J~xk}^@8M1̏ S<GYG 5tm{ږl}/d&yFS\Z}Vn| fMAh%ta9^tkwg-#L(؈h;YDjT mZ^ ϩZE6-SbP`&Way>_X?S2 5g2WԲ>s9s9sy@|j)Ǣ~ʤCP2,R7)e;8FNu?vۘK*_f-,f,"R1Y6_fZINr*ifv:%2mt8kk^0MYyZhl k\TIK:vd2b1}~o7f4r݅UCk0}s#qpص{/w9I:`*9/@^n_Hd_([^p[`A'TaK4u>Q.'f]oWrbѠd$j {`]c-((U''`" `g\A9 ہ !@V-[RݺGvI۞dqa"$˖-˱x,`jsɾzB|h*U*|WvGm_8͞/kgk%GL}#e5'c\4iKi|fAC)dt!RhrLxȍ:Y%k|I8.Z|AZȘHM-aed!HhpKB7ofywM_s5&&ڀ[Q$,4[э`z@TPFk LnYMiF@*P쒫v)8-#R%<$>@Ơ r1:$q9Ni`k9yw|V-O@nf j [ZcK2 @,PÔ MFT vO6( &s`x) xNo# 5-q]Ee %,C["0?ej PY漱n׮~˹˹(.ː5KQRClﯽMv3,SJeOѐ\jex|,Nj-QsKAq^;q$@g+kNj(?ueZ'JPB>$g)z ZC)6)Le2Q#;jH=::JMYj}`k g;vgoUy-`U~˾Wmt NǁLorDB KH3&?SNx,q܊c_dQ2EɼRFUQ{8d!Z@0J\ ~A[CFK,,~[(nq{]N+F_ol>vKX;nԍ)sPSe͊@*(%epq 0d@vtMfvזs^+Y`]$_Ht%ڙZʢrURUC.}@ʔ(Q~E2 $4GYygjJP0J*qw-$xYCUX!2Ь8@Wni.>YLC5^Z*s w>nw m$L]Q(ž@q@"0aR0:WUics] oز? hQeޣ:bj~- ʱ^3\d_ Тm>Yb\B}~0+nfRkR0el' n`m3 .l'xՆ ~fg7VBJޚ?]/BQs+rf(0Ks\<dOomQ0P!^1%C!MX!bEPL*.,`>VR (scfS++.k(#ZS>-_8r1-Aw /Ȣ%%1CЇӟ*c?z?|o4`U׏}k5(F@BSo9~~{ezG{jm~u?wcdLM#-C,|t/2a#PHsNDTW3: F1HK(ϵе4di.gp?4 +BB c&QyFGjK13In8u/8-=\Ww0rR&an&HT2BݥKb0a586!9.6Tsiʉvm}XHMxYe'1J63g<;G4JW;6R`+S#_L*Uvמ0o.8RVas_ayU!7˃#&uV0wJ;:W"6Q-Kf&tNz@éDVUS'FH,]ą8dɜgv%j`1J4H;}~ eR:> h!,`e5!Axc] 'Ϲηm67Oxyt.4*&*,K\-zF5`^ T7D#Ђ_b.tCyMI`hbY# 'u3lc,n,ax5-[.z2d;!\Y떷uX6@|K 1;*05'G-Di|?w*g|1k|<>#ЧJ Acfk '4 i .+6~NQ=(eL"yb\ F%aRwV$%(GSXc[hN"ؙϟJi Bf*5P4Hp!D!"ʀCIka 0t$o;%&jfGRQZ>]MevBa0os+u8;5I&NkUKU-5r͂Himd K3y@)iWWX֘ zf\U͔l<EPOx2lJ,)> ~!PCG]Z'W:O;/7L7x Q('>4+*Gjv@Z@71}O/ቃ bMxA"5@%lu?:4F#ADLI!>.&bWo #(XȄ$5\4*յm!i@d 01P$,/u:Q3=gؼA0kmcwU\|ٰ0r L. f X-܍u+9(˥jI׉ rNѽ6fpt,|{]틷2wwKVhmɫbCc|۳3PÎ7,9#8B&@,da(⸥ɮ$=SF:e! k=Զ1Zx-18y+T+5 E|lsjXA3 &<.tHĬ $_w+tZ쳡r}Wh*}1&i<#qD$O|Y|6u(1wc_[" Iz!Wy3b6o 7h [,q eEъdU"]6![/,@ٿ6Nr_#=~`vX)SME?LIO"5hb[`aAc:Y\<ZosRH.bbsJp<sX:<2a `wpCiu Z:Lg,8Dc~J{'Ylg;Nlz]D{|eq4!;^tF`C$bB(B"B{= _oA߱Jj"fuN ZQx@p,, /H S↖DƘ4b;EJ@ Ò`AC(w?Wo߾]4+0~谢E}?o,) ¿,QvXyAݶvVYNOaI^9rD XX/j5 ~a7s)j/LF>{~a;|1 Lu!-c AM 8('Eз]huE?E|} Zusp:G23c Lֺ-3q ;V .ע>gg5f1e)!xɆ "͒_i rHĵ@DZ+ QjcL֩q Rk QTPnq|g}k,Pz 'Ɋn/XAF3*sM푾ߏ?}Vp<dJ!!3+H#Ӑ@;db@019>ùW(Y Z(3Y k <f֫O.b1;`(^E,S9UwcXmVVqHm (&Ë:J3A91d9 J6>^qh{1}x[deg >Y.ey - ȧR[t#,\41xxd# } 6&\ P .YX`:’#Zq  P02r\2 62w5ViF5\1f-;ݒ[/\ Г|IEԕKǡMҔ??}?S \Zs֊к!^I.{zg37ڤ ^)T4.8Wi:(bx{;5^$0q@-HKH,%Pt痄_su5`1ri넥WZOȔcF-&xZpcuR,ug>Xwpq%K63&q"\Cm4 U CeAԜ;'c/ӧv<ۃt8Ud7X,Uoow _T8YJbR.X~kŽsQo$ʈP%D_ط'~<wzP0;LAώt܏J)P zԴpEo-&`H%ҏɐdv|yB bHUE)01Ѳ;+~uEe X?;(͌ џ$Y%d(ñjݿ|&ʱC5C1Lkſ-]Eպω/>nB)؀jEi^t2v˲Dbe] EhkĐWe > ϻюn4 )ȼe# Z{IR$Aء"a6l~9|n~ ADoc_l@*`׌Z>qzn.`c,/*^k(.V i]U6=2m l$WXT`u0RKyL>{8K+:s̔)hR]KjHq헓Dp iű%8KZX ;QGte7y~&@MKJ );[bvEqf d@NT`*Kg9Enj3a-G3YLS*>v\E Ū vپMAD7Nn Փk݇e)J'~$  @ 0Kmsl"rmjLaa%Wѵ.Z4f"pT,{r^:ǘ&T!{PD}fo"!!br  Yp-G8#ΝMb(?8$J7TBzXŪC*7߫ H{ԼRW˜ҒI|-P~xmrq }m3yEM)[}+~؟Q/|H!RxB!%lҫx& 4"ETblj{[d W\`AVbG.3b`( bjJf,<ŽDMA4 X8N L[=^qir*#u5w}8#2UarI:,?_۟0q0?,]K&^tE>Ǭh9c[Ά5$IT%TzZ0%4-㊂GSp9Pna]DְLC 4 ,"U=u بɈjKUNWೝl'x6fİxt$߽ŷ}3PDV3D*Q5 R-YHL e5's-n|?&BGsKSW"b7HQ!r7ծ6k.j`~l%jtx,BjP$ X?dUefv^ޘ1[S맰L7-t%Zz2E7 yTWc] 0tkrE'`N.W6щ{v%nɼE=hF>J!nu{ڻ6'[ oM~{^[duMRy?-xA˔20c0*KI0z)X1t+jtw JT)\WܬD"h&OXKUM6}9Զ&e2P˴W[ѹA4=LJ3CԐ)AkeT`2Kv]dr5/CRwmzydw-(hip:H5GRLJ/-~yw-Jdi4#suX5[Z yp*[s Ϣ05gvXU)9 YpCʳ ,:[&8}xg[̞E+-ILi+ruv8h(:QےTh1Fݿ;vgȧLtz ]v)}g^7N0a>fB{@džN=f( fZ_PAeii0>Hg>WϢHeK"h',x!sp R`_NFdpFM(I:?vt>CEP7+牼ЇԁdǯK~ u('} !0 Od=, 4L44cs+Q%ٴ2Tt>-/:̸HXi\D28"%!2K+ + 2kKi"& E$ oLܠ{}o6`.}\^*?Y7zbbeT–XF_<I>щ Y$)v!C\A&NG9baK~Ә@(<x캌 d jMGϼׯj eٚq2Hi$ w=ֵsD3I L vDFHah Qq)rvR`42cH;GܖD@e^߾}~$%*NJ0:yiW5v8|lw&GA_:£8g*͠d5]{ќsT{ɺ관%-.*o ɥY1ܪz%%їOYW*uOh ,\$8hѸ%:ڢFt<AtOkH;tkIo\klg;Nl_ f5Lx}9?zl!b^ZD-)XBPc OClz⟸ ?ʷ=3K/he'V27ߟ];BYNIR$h:A3z(H &KxwYUO͒L&,Lܡ-jaUwi6]vs7a~{^sKꞪ;[Pŗf@`>oYV3^AUBJژq`;C `ƍ\j+Hc@Z-${taYc `Msn~y_ZY&B=ȡ&{/;@ 󼏥rceiRhl=2fDކn9&THLۙRSqCE`jUJeӄhPlNhXdNOhzldq!Ē:+@}\dVZTz컇 zwn]#rKʑܦKU }1Ѷ5Q}F`Ky #-S&#eh,pkj}SWV(4 UA~|'ק&+̯R:PD u 3aA尽1&\!)K5ٕxl(l2˴`CgLoֹl*(Lߩ%3|_I;SF97j!F= G~o%+Do|E;??aOJ*._w2a%}TXhJՇe:DpL#?+iתp,ZTP̓WwBH L ,Sg>JF:wY Oe cj oCHI @&pU__Y*)&\Z ,2ݑMOt=W-j̟4,0P4c<{Ϊ|KGd=EYE01 Ӽçۑi&%I蠴ђi;A"a7 u@.G%,w61P0K5ǑJi+(pqXH'B2}eV]1͊aTw+cTU`C s,>vgR6KH-"hTn>A> ZS:/E@v[Q_'̳ ̴D4e+pȝ. /V'~C66*$ Nl VaXt\ }ɆB0i)#5 ŹR~l tA%Ԏc݅ ؙA\_ fY}rE34k+Q>rw3xQJPf㗁Q[z iԢ\t:2Y[ןShMe2v h_B) 4J- DTP~g3ď3ew.7&VJ?\ծU ++ "f\bJv5aTJ;+p?*Ł}Q@L}(`~%yeiOthQDMHaKd=K4?26JIJLP7]pD'}ĽO4ʊ5$iN-8/]Skl,YF]kt*{ޘ_;j]{(lݚ5fJ>wY.ʺ>CL*ajI ׬kXXѷg[GW\\*SƠkQ^V4qqjށy˘,W;Z&bnMF0$Wesvݨ ے~r!X󹹰%/RwFk#$/}!Rjku*aCUʒ^ S90Ò ? m.v<ۃ2t$C;C(: hg$N~'MX2/C!z){ Qe|@bIww<77? j- Ր:uTTQbfИ`2y5lDA_ 2~ `@Wۧ7߸9Fct:N V`o(BդIkX{rQ E.x( 6)Z^cE0\8DOXX CJeA}oejƼhإt&d}}hj#@Jd(S?XN vox_{fi/yN뫷k߶Ͻ*/qv? 4=~8CU2S?}O.0qӯgT;Zpa4,_WMsA$FK0A.lC#~{UK?gUcWј02#m4UbY*sPV5NGO0I%Vru<~Pse25d5818(R0-F&y.(=恽Kwo ::P3t>%((rMQNU:G!fj bmdRH8 fKӰL 1+3I91t r grI jn+rkq,]h*KɇEe)k&a^bqR"Lg1}_Ai\kU7ȩaLvG cl1xh}x?S Ce Z^3,4yFvpG3+Y4EVjhξ Qʠ_fiq\0-f)I;. Md0$ "!}UC)߁^ y`"KRç|E[{Ϳyh n ZC ÄqCKzyr.ڮyU МFg {`A$ 6%>8D#b(n*MƯ xu Y ڴǖKhSHJt>Ϲ.&[J*ɦUɮ :N37 SMdxl^`lԄEfIY@ڡ/1IUB\6+Da;zMww,hS4:ma\! uy{߿_Jn]1B!!:?ӁkzT?gUCT] ({^[2ڕLi7RiAjk[GR`52dU%z0KqtK KְZtg(KQGR-A3PP91 {?2_jľH\aB1=Co!ŒFI X}}/ٿhs݋Zm 2)gI4xE4CO¦]Q ֢1u53^~c|q H3YM#``wZ?:!3A38" IKSm;ߑM'FpM9*=Z[bN lg]$VfCuWlF j:̆LeD ^ 9HLm"Կi@UJ`F\ e̯xdl?baM5w1SuRx`G55ͤt$5d(舡>̔I.ܡkB+ԃ,J.cF#d?$~XvՓ/L- U~n4mhRa0ϙ|c3j*&Y &mjdfDƒ0_h1˿ azT m6}7"2Ҕ*uw odd-m1(5cxBLQ# m~}'IX RFi4I{I"1h(E.stcOt/O%l:AF387*[Bqc}0ad.S/ɭy ~ ͫGGڵ0YELVS-C)tJr@Ǻl$̨,A;-Y~r4' Re)㒤 ףe$JH5K|8Br'+z0C _+w҂(F&*pl'xٕdcwm ?O=VNB ,?<PJp<!Ŋ,L/E7{ϗ7|jXlP*(h v1Lez,t~Y8, `WnonrJE"j񂭱;F/5h!Ep/ (Z{YjbF㋎Eȍ~?nE@2\5Cvc(Ef L6[4jjey,O’/eEGc1k{-!L@ X=l t2v'ZGF;hEH>{fyccsB?5 <\%R%ci.gTzlN;iK;s(Yd#Bqu#=}|_v?sSl X;L[ܢ46 RCu;ۜ  ¿* HG\Idt4M-5/?{cg ]ރsQ0G~}Tpm~UPiV\|yr|4V[XѬ/چݖpzkz6 0&ކy0K__Y 0zESirS0F$f9& I<+(y.YNE۹U2(ZTdEdr! Dw8b< ~hFd[2р jOg v4#$'d~ix7)HW.=*' H_Ъx.z撹Jt bo߯E?pYUI< M\ kEE,1`iqkn "xSI`τL0&5~4LԻxB3<Yj@@ ]/(I{`4''^0?[f`~5ǀK5JFF)s#fQE&7AL0y='| >5@>1J!&Aha4K 05Ӵ4P~Vcxv_W~{X# ,7Mx 4(CKne> |n M:H sjlMDAJLسh17dPrkb%Ux-(JzZ R? v_0p?ϩh֦ X*cXNwzxL:%?nz)0<f5ir vä]14P/0}uDBec!O.qB:6bei'ԽW8`eDT7#AJz$LR]!9dLX{ӰCBɬ;L?5;&8-AZo߱`3:Qڔ,$5put$l:[;(BlC rǍbP:5@wLY,*'*0g፬jعvVt2l+E?C, =0iW>(C yW)p٧HD.{eE9ðA=q1V64qs\Ai.L.hP\vы7cke6 T ހ%gmtj CzgxaH@@Jrl܁5#pWViأnI"ǵObf4yW/E~< *ecZͦjF"{8Q&&J)t@ o( + aE4FDFMOy3@a/*l :/+7qsJ䩕g2KuXNFb6T!Pr瀃^ ؊6ƍOloVYY3DE}C=R43FCpDuV=I@tܤpTvAgЀ`C"D!`2YXbxw棁Q%3`h\"HXc?Nyd@lg; l3644LSfUԢ:1hC| +ɥr~cn%*ԣzWY]*6 HzƓ|_|?./bzxʱ_Q0K8l c .1=2x?ҟx_4Ku|TwUYr:{R#A? k,i\AXz`ۯi#'!,D.Ţ4i<`_~TY>;2BZ Yo3v,6 eojN!v* aC~EHCЏ Rdޕʹk*|2 S?'nݸ48j,orɭuʷ=?im?SlN7&:889(9kle806Tɧ(rYP^ $@pv4@FCf_\_xɔI rZHōR(Y1'H29IK!\ IXVNlrJ2@Q  }UV*#UL;L[Y:lLp7r}Tʞcsb}DWt=8{A"q?ۜg@o=L XDž|)\QiQjMIh}iq4p pшDad_b? ~{x'Slg; Al'V(No0Ø'ֺmZj ;k( ?[g+V!v̲"&L50j cP(3XTc!f5@g"(G6 RRfhJf ؼ{1uE=YVQ+4~H8," ٹk(ʫι&& E`ᦤڱ2N{h}_$s|/l_y/f7чzXrf!p.v; &m(22M4BCE0bnC~{w?TٵP{i4~0UH zvQ(G^ Xa84Ԟ" 7Z8 CM0#|%qҸ"QHQU1A,a V@@гȵYfF_ɝ}-yvz7 ?u=˷ݬ{i^rkwIPpT+dL9+4RsK:I 1A7Hh 6R)$̮F,"f?(>dѐكoS?u[ >dh7*h-ʖ(!< > >M{+)Ad=u"s ,+sZ2P/qhЂD `z8tK"4r6ҫˀ&zvcƘɟ5@+skZuAK ^G/`0|ű GB,˙y8߸fX*u,h:vFCpMq+}>Z+ir7t43rCb }~VVD[ z^kZtji1َ}(@MMrd=z\^^8[|7׵kgJ"H d,0$JegA%%z\ε=ߟzoծ{x35kXx|`Z1k+T~4@QVDu= (dWLDD#s@ 1;ާ~?MRHă4[0rXC`L-YV`Z@ct]vAyRb#Io *k+8= g9*+F@0Q-J-sr(r5 k0Tߣ  n ֒5^X.`ϭDW."?Ӯ?U~m8k)?j0&W㗀C/{Zb?]߾͟6c*4"`@rhKc&g6'\?d;XٹAMm=HEBepXV/(x-2|w۸fF`G?C$cs;;مk;$@cBUIZϿN`&HO3A60)_,ՑGQ{y*_cqܤ)Bt&,pHZ2syHyNk4}r/H4/R Y !@iNe^N1h 9¼ؘBk2FinYQE"9;v<ʷ*g+ tZ;fCo+|ob %p -PBc@ɤ+ֶݟVp|f:F!&4\s.;!w?u~c^ LV+QJzd?VUW2[2R_ۮB|Cۂ_ UB$.w<` ehK433 |Sh.{i($]WX2)uo#d)82u0W~tGSZ^< 8 , 2h~#L79#Ҹ() 9R-t@h+4W,a-\m4ߙ 5c]2~jlB"j0YmFUIc+ }]f7_{7O~˗g|_+޺ASbN,(ÔHdUWݴT&%r H!*I G^f-A+_^(zڡKkl*m=Ul31!'.ʧ^.z8x̮_Tv0ia=߾1jkR(O?1}o6oxl MN|v冱Q}ZS!bI9I=iw5,p2䇸FCc- @JI5u}Ơe.X }#n6@(C#{d);/0XeC'wtJ. fEe2Y׸]xR%0e; A>Bx>*,6"#Q|=`^ Ex hܛ}|,tD^7 7‰_`w}W"Ey0Vq1oEAc2IבAt*,hMb']/DfcQ/$|Hи?iDwY[=KmJ©/ >xH-z pTxl'x/Vc.tbTx s̒ŁD5ϥl%\*bDXh*;iY?/ءfݑy.XBC Mi13L  ¨A]WRS m6@pӋy)G1Fˇ?g+{CƏn<{o/_cnހ'o0],9VH2R[gq`S˧d ,(Q%a.ѡR խ2Çso#0~:Kv*`&l4a-=iM r&I /CWhw 0f"rǖe2$ ~:]Y̦XiYHtέZ*1HH:ʒm) L1M3X Vv?7o[tEj AQi>dL!ri)3m zcYk8.fY[ lOݟZsp 5%6cu 9|V`6ŖD40.| a5)@ Ѳ6J̒;1Nw%&5ڑ^ZCI `{ {7vV6&:r^fTFcS 1jt2)zH9*v;Mm>5=d+_OzK-ՖL@s*Ui>ar>>z|CY%YnN;- n2 h)]<ča* cbA4+֎9FdbYVBp_!qhNEQA8?Mb(|sJh{+m0 k61bHv?۸FdؔXsJ%Ĉ*X=w[w4 Ad'ڎ 0[wc/3jB vV\+$/%5^NCci“g.űH&((CQHZXk{%j'"#JHd g;ؖ|Pbp%xU1.\Ä1ܷk;U􃥩7tV2#":ϱ db0Ki 3)J0tS$cX$kspxm1㍗<voMi'4 ՟>3rP .8ej)FpwԇAV A[[+pvɲ,sw)}T {ED^(e3. .hu8K&Kq -I^K R2iat㜱Ҁ]6^X/\ ܎޷NdfP6+`-k"1cAvE,3>a7)" ) léFDzYt}Fy:y~8~?zF>,э۪VT`;jȫ,R6v?Z/2%#qcHi5oPVpVF̚Ni9țD QvuQ}A,;zl|R;;6's[("}4h1 mnm#K*&P.9ϋҲjtK:qGc1nj,Vbkd<5q JbXB14\U4CBA2 XS4>[-:)( ZK_kcUct1ŋTW5Njm'pArc$p\cYQgklv 4  J(d*7$_ݽ AH=_Ԇr4cp'xВ "+h3HQ(.U23>Pсig$U2 ED¾Tf"TvTϙF{֦T티5W.m=mfZ榾H4Ԙe۴oWwÜp)@tGZO 6@3Cp}qhZ(Y_/C7P} -km7" p}V-i`I7.+*@܇KO! `vOz"@uW2/%QdU.2Cg1IE$44fjㅂ6?woޏݱtr[^! PwIbTvm%ϰR`Sn|,SqBOXU93t`PC5}oD5JDC.4}n:*W$FԓebLғ{> m`AY4wmCl&dVb5Xp,Gc@, V?U^BLa8Ms+c-w1h6އ6>hi~(kHP 5UXn56.aܺڵ#`1XViI:ЀP:db V?~IZN@ͣv}+D0\P ^bBNz+2ZO&pANA}&:JK_`(.)PŬJAy!V%FηwC'(7"DuBT]Z\抽4F ImieVƖ\fJ[h`D$15X;}O@Ukb%nWeϼUdp6V[ dn0էŠti$Ѭ(y"l[ԝ-Y5G OL&648Ϡ01<vFpZ tr2ZAG&;WѳQ_}쬪Z"DDlGy7VmY@B(- `ȁx^z>3a4>΍2T7J;KK'L54?sPVeBSZfir |,!A{R੍@IWBwAX/~$AٯN6`!ES}#L$ypU[7[.R3MȩtCK%.bپi]_s95ӧ]I _tS;iFl^d$XeP0󪥚ihB_;jWd4{hD(.67P>rxd6+Cu6@du@*i 'M~kT/(MN)!1UB%AgCev,.Że/>vl_d~%Z&+ 8"7 pe2̇ BΖ1o[~?0˞5e5Vv<1e7PAvLZ~H ^bl;Pu qj-$41^TX7+J*Tv"TJrX,v$Ph\`yjZ  R`f*E |헫;b|Fp'Vv&l`YX?پ Ii&s2i֬fu88X֦KV%~4u2JL'@Of O5h+0A5c{{2.#&Y`5&&Ð~L,jGAWaEpYa6$ETyۋ9x  uS}c!iLF%P->%qún_+8vl_!d~4cH52ekWP3Vr zZM ԛu޿ΰ,զF_#C`y]0+,Y!x\Sk脉daםK[M$?c>:wxdfVP*bpShtz;v2~&RK(]$B0i٦ j*׼m8V m4 ;(14rY)B&4'h !پZon迅SY$C)ݱ̲@+{^0@PGN] Pܩ;8U[il}*Shr5JnS1P]Ϗ2o͋Xp{fP=OP5i +!Aroj|{$g;vپ@4ω%0?PYtJیP[ ^ϑ[A:*!5m&nTwcXf S ߫ЎAHFjV})M蒫l8 1Bi~(qw`kAO]&i0i}o^z)9A ^p:44߼RV/gl+zST-qj4hUSmu^gt\;LhH ;m]4ޢ .Yݣ5Pq>W KE{Kb*iIryl`n' O.-B89Za6dL4ȘFrom>|R9Mvlg;}Y6xw%C61r2Pkv.jooZi6nJZ3hۣ`̌Lt1v2C>4]ctG( 1@+i 0 lca2zo_ ~,cT߯4^h؉Ç[XL(m;`lFUd\U]3&VdIvT7_{Ϣ6糧@ijd#ms~L0A)6AZFf=:gO `-C=,*ӌI#~>j@ ian ZX?-1TLKT١(!*A׸;|}.:˱ ΁ #1WDq&Nz*c|OK>;vlg; Kی4)ϒ6'\XiMtoGjw"r;TCRP|}!kT )<`Mf)%nZ{IX4xIT6P^Td(m.Z~HT" <;,F *c{~[v^ 5Lcy1eT+! #Ujg fƙԹz$w]pIJS2~H㑦Lz~{| Df33e7TJǘɼcePddZXljV`xb'-,Ȓ ms(bb[99$IP젯_`_}~~5בr`}3n ZP}'?%lg;v<ۗ/ 8hBT@kTbƜ6ȺſvYf5*&G{"" tRJcrP KdLَA[@ckScUHwGiBF^]LȰBs,Q.t U"x3> (s@) 9ڭsfkN#f5{aeۺbLh<:jHO{qo5|@kpߞBQ:TR'e:vhS3?lvl'x/ /|zjZk Gb 6/ě WzU8RSxEPi\c#l'iuaꀨOd(3)a5'U`VXu>j5J,U76 ԜE˓7 1Iicbف \S5X 6m/,FPծŬ5 go[~ud魽(NCI`z+*bԪZy{}{&e l[k:fZI̲J@ r3f} {QmԍRN%uxrAC뺂䅶rls&Be1+MHఈlZ4":iZߟϭOШB!EyOjP9Ri3.ƚ}SJlg;v<ۗ}4tt 0吋08;XָD6ƔmfG+ri@_.rUŠYg"A\ՙ9],!}Gxall`=ƎJ%gRSr*IUjdRS;qUgIccB]X x\}܄`tKAɟ80+F5#}i'aQ5ՙ:O)x{$=[=ew1Z.y %jr4Ld8xJ$N2on5Ԉ(|%·TM3;00 s't(t_˵S8r@31hk ܗ`SQMlݶlP#)̗_3@D`Y|"[4؉ճݗtX}=뿥>sS9ψ>!wj,.<^>;:H$DKH30R_ DDLL5tH-3Fnz<.ͳxr}61ZdX\vH$é ?IwZٟ)8pڹ_չ^ufiiϪܿvL"IR"}62]LO STk#o#2̠݇zj Qo4zK#o!L{?[S# ٛbCg lBwoߝIbScds{SFUm2 1}Cꕈa C"< @-I R4X@)nd W>m-u!$^bHº0s.sKR=1<4 :w{D"H0qXA+ieOS,fdJ*! dތz~%~- ߂o1pxh[4N"P FqȌ?B(S^Dj利\+ԓ:a3c+fK' 928[:B)Z'2k#ĝh5 EK!9т7x\q~O2Z?@"Ebַ27ºM}֘3xfP&#E$d@DdC kÍzvSfaw;#U; ΅wrޤߴy~ޮOv\o<`ɇ@zo@٭Fv4dH)ڽɹ-^ҀLc^% aA6|7KX^yzݳ;B;hz+~cHߺg MuIY~9/VWh#7?H$DsRM?+v$Ryd/,A;4?iL4zdǿ4i]GDot=:!l(Xw R6i6\ #s#%35*5 s*̖,I ,/ש:\k*=Nxm2ILx]!qPBM:sy~@ N v\:sO0r*xQV^WI`8D{2qDNgJQP"x&[ͅZ9,eM"q9ނ G¨*fEP|0јHf([[HY`!0®1aú@`Z+DZ@A:-Aݗw TM|Pr=rqV64.h *@V]%  (:,0'B3؟S`  7اsPPWW] sO\3u33?x@a2r>/>]~T?>j9z+fvnV~'1=qˁ7$o{8Ad%![}"q1kؽ}P ۈ5r+2XdF*qi- T1։ 0?>jXMGnb?7q6m/ѶWjǨfu4x;}2q h&~vh %\ϓ Xи<|}e1 DW0cw(M$D"`Ģ sT$v+m BhH >Ux5? Ԩ]oWK!ƂuaT-ϮaTȁo%Uy8E@_2KbjOCT[DJK ysY|*R~-99lf/B= 4epT#2-zV'T"q2%(G^v=_ D6t,^Mb^3JP77.]]#_6A]8\y۪Hdp3_˽bDF=x7r{ S^ּgߏhOSqdzF;Ґótgv%K_50?+D"H$I&NPS[ydHxu \2&(NZӨ?#*Aׯo\~ߌrs߁adİM63~)bo݈N-aLǜ{"e5NNLj"am몧\V6Pfw<]VJy{Ks)Eqm]MplӼWr[Lୡ6uҼd@Y}!Td&y5ĊS$'==t,i{ v z ќihkGυkI Z?d/GgX8QjT_I%<OpbGXZpEܮ?#-DEIyy1``@c-/j܅lbk91sxו6?O_HZa xᴩOk(^Bp`/Ԙe vGW>)H$<t{I]B箱P @%2et-70-]:T5"w:< >pD_)VoDW1`rQrC?? m^j ֨_}KD>~q{0!R'}4) `"H$Gx)Ϛ'u}@=tW,>̡I h :#l`/C߯i`XMi n:+K <+P~'X-եA׋A!s}()Z%biit$Y#X)b ܖ}vv|@1ʞ Xt(oeaJ4orBvu~ ITTRGv̦a10q2H}UaF?7+3y=xIgIePDe}oWoFeێSm~x_kth"WJ+A +8\K[nEX$O3A`чF#}^:ΰ׵1pCdntna">yI*j珜H$D"G T@4ɃhYp2V )fM<`|8.=\wk:m,F@j }Iaeq!$.F>9~> ʹCѵ7~磊244HUL@Xy4{  e|NIϣ F\ɠ~ZUPcԝ HBPSp֞Wjbv պG>Z=c13 t~.Ϗx2\dSYIS3P;;Z1Ayv/{..{q*7 ?>éٮs֗Q5H3P-Kucsi<.` $rb`; Eq%k:"|fݽ 4c15h+HL *\o4bqKۋWzrRD"H0qBRs)Ry0G.m/Sdj9T$sX`l r9H}淋NE^͎&;Z4 حJ\&KP_\(D oؘ*` 4 q"ꌓaMVJIk7g98QmyHRt0>O1Z= -&eY_oPWʾH`˫a⤽ {K.>}?3bZpx)D"H$L vqD tv(: @kfMfy4:+\Bbip}C:zNV} z0u.\_ a` P{3zaoqٰT@>Vԇ$ 1;5Fz=UxbO}JVt O?.׺.h#{M؝LiCNPݍR%xcCG˓: UE/L HBbj#C'\G{vu){>Q/B}Ғqj \ѾPm)AO_"H$I&NPxhZ_x&ƆL}Sȉ`وɩddn|DHyS~Kq/w7<_ĵ$4Ra$}`.O~ví }[}.K_JWH$W)6ֈ7_R'Cg"r~`dA.$G o;Kq^I˨[y\ ]{+)F.{5rz_׹ (da$!5Fbv^NbKHu0)K=5vSFdzx@yO7"/vGV*oz;~T\/A6wDZ%`CK ΎT{Q9oiD {U_J ."~)d 5L wz˟jPopgٹIO~7,f-!M(f]vdb)D{>H$$'.AIr6v_7%TYTcW&*w'"(YH A@5_ڨSi<"|߃$cbTV(@7ΟKirDQU)z_"񑬦3&2Yݏ4i8D"H$8Q? z`|e&|7,q 9޳~}UG tNrVIdpȂfX#J QʎOe,ԕw{ecS f@fJHqB[ɅŘz68L3S+ª喝9Vz$X#~lJBcJbDa=3WR)` }>Y"E*.u3;7yD)i7qPǟ9(W]Y 6cpKgxv&N6f#2::GtަZ+)ݠ2bl-ioP7c2>=D/b*J߈Iļ _\P˸kY̟X~2ަw?_nD􅾮ll~s^p;ΘH$D" cz4|J72>@wN#>4!>Cv0]Po)Rn.+dSy,Dzl~ (71M~LnZ9z6|I g=A] /NE]h5Jn,`zcZ J :cyoY+]JMPzfH0<9"{v|PCzۊOX^ش$lzwwkn|~::'y{E{"#u+=:yJRC,K<{$^|w-HZH8]ޤ}NJ_N?9Uc -30QʐLjǵ> o<&D"H$8Q@er&DSxDkTscq:lTRDn4x06P1F}ޟE (*:E4ɯi/ҕq8a"ԃ]9u'Lh6lԅC3*VuRe!fl _ihT%#C_ qSjKY?A,wM4 Ld!r1 ̙G`V&7 疄DzN&-z!:zNsD}5r%\ jٿySأ]fBWD٢BZԮ}ÅVR(F~SŻ`)7y\n~63菣~C`8өWczX[yQ,vi4&ۺڏ& !< Ona-+xDlKJ$D" x )J?2aqn{r$z"QLL

8 cr lz0E&- ңNUK₻ ̇ KQ2S9Btqאn}2j2D,^h3p`n&/] #]A; 4V/ h2^`:%/ Wtdۀ\VG/h!%L֊u\ @a>Xa)qeے(Ğ>M?wI-AGx{[^vup}nOQO1'DmCd1Do Mmnp*xX|Vٻ>8Ƣ]f){cDV9^³pʃg_8ae/6 h_YYduщBLRDb vp0Xʂ ^g\>6Gr C\HK㽩*q9֩R zc|DŅ٠9N[NLJ=s\#aj OsM"M_&YI.( X*kg |QSÚ{NH[{*Z+ֿ/:}_WPJ-^7VUKRAt3/aeVK> M!]|[s@żlmPɖ W&|vc&@;qn6ݗ;y^>`]+lݹ3+cwlwjmWoQ&+C/'җr|`^ T3)ć qB6'` [Op|-nZt>L7uI.j=s\W^wfgٝ;[`/JvI(5TWehKwL 9cDmdžm2KJD٤L;_([0 @`;)3A={)~FX|WwFYF=ޭ*Q';F-(IыJTx A@g`p GVV"%Fae|pi(@Oh[Ռ^t?\kv`fR閖*t LQV 99|vk(V}jEmUccp֡E9=%6}PYeIPx1"? p>@JM@Jр)=&NX2/ Z@e0'I +QaQV\7*xMa!1ʻO8C!=e W Ae&NQtAFWKT`UN@$ƛE6xO .љlYN4pf` jj>~@<}3 e=y:g:+"=[?!<$ Pp NGP&coc=0.pu w)dYtEm2GZ Dh 8ǶhY DǿT 9<'".‘fPG%(py;  \<,dAwIL (ϼ:ಯ@W9I~;0HZ!eū(3Aa(sV G! ޠǮ 8yC":\^)@ bAm AcJԦbQTm']K^ޔ+ Ї"/T;n sp?JMq qCOE0߼u=gL8&+] rIk-Svɜ@[`@`- o]ms6cuIxM(?y[] 9gHWTx-5  NAlрEyxpg}'MH(mC&f]_˅ v#:?<~}_Nvǒk1nܾ : q 4WM=DdL_h[Q_*U}WֈzK=?eZ$#+ =B/kTgM셳 !;Uh Y%m'ߤhM_z/}́"S{= Hk>KXŧV% OBc@%?WdDLT ܌[.>@X~LY;3,O2*iCuSqhGUn/¯q&rʤ(P%Dk&DIn?q~ x'#I*g%o7ut6>")kĨGdlyp .QS S;F$UE!ʁn5Lɖ ָM+#Iuf72 (_%p ­DO&'WtaE*k Ak'?k-FY,ӉSABu 5@`d%T`gb7cSȊJQ_2}j6G@k[*oW7. 2qo=1YS[nM_e-`~4Sep!0^Ӟ(f^>IT~Yu>#oy-7pNzFV~j;Y> |fM[JBKJDA'+}L!]o@7 *ȯ=ǶWHVWg )Նl!ꎡt0P$DwV^2zΗC:}(+LԊ-޽*Qd&i\~"RϳGF2J {{P,fH1?'aRB|n;q~VV J7e ЬPnPS+6+/r U&P {j1RS/ϟJKqk"p0BGAwŕj'j:Ua"|ۉj=i9]Qg^ @l6UYtilTѡ37Q8e*G+Dsh9P>e૱qk&Z!hHZJ'DW;Nڸje%]a*&3va0ʄ@rIT`N.{CiUYMeތ 40# H1:p!՟X \.=Sv| ,hp ꊒ}F2[᎚jygl7DL4 d6(]*G$(?̧?K 4_/8bdS (h;M?PW)J$p_Qy(Ye-Ɩa sAh+sf( _+' _WVF*m=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|OEEIENDB`freelan-2.0/artwork/icons/freelan_logo_backgroundless_favicon.ico000066400000000000000000000021761252300335000255150ustar00rootroot00000000000000 h(  ElElFiGeGfGeGbFi#Eo&CtDrCtEnLFhrH`4GeI[HaH_@GeEoDp]Dq?EokEmGb,I\pJWIYH]IYpIZ7Fj)FkEodEo=GeiH]IYFI]IXJVJU:IWH]GbDH`IZIZIXfIWIYJRKPJVIYI\I[JOJOKN^KLKDPYLy+Mx( Mt"Mv%KCKDKD)KCL='L}1Lz-)Ly+WMv&VMu%Mu%L=L<L>ZL=4L6}L~2IL{-2Mw'IMu$LMu%Mu%L:LRL5AL|0[L|0DL:Mw(Mu%Mu%Mu$Mu%L}1L}1L|/L{.L{.???1?freelan-2.0/artwork/icons/freelan_logo_favicon.ico000066400000000000000000000021761252300335000224270ustar00rootroot00000000000000 h(    C C  8   8 S !!!!!!  R  9 !!!!"!!!! 9  .*2-! !&G8-ZA"7.!!!   C!:,1dE/gI(R>#@5+YB0gI 3,.U;"!!! C ,S8#7-2,7|S*U?#?4,U=1_@&?1!!!!"7+2^>2aA%@2 '&,O7"!!!!  )'+(!!!"#*G1!!!&"'" !!!!! .'2T3 ,%"" +#*<%*:##  C!!!!!*A,#2'2M,'8&"/$'6#(7# C  !!!!%5&+>'&6%!!!   9!!!!!""!!!! 9  R !!!!!!  R 8   8  C C freelan-2.0/artwork/psd/000077500000000000000000000000001252300335000152375ustar00rootroot00000000000000freelan-2.0/artwork/psd/freelan-logo.psd000066400000000000000000222702261252300335000203360ustar00rootroot000000000000008BPS^.8BIMZ%GZ%G8BIM%]tn۾9y\8BIM$9 Adobe Photoshop CC 2014 (Windows) 2015-04-26T18:44:02-04:00 2015-04-27T20:02:17-04:00 2015-04-27T20:02:17-04:00 application/vnd.adobe.photoshop xmp.iid:002870de-9440-9848-8833-67fca24f4e42 xmp.did:d3c1e1f6-b4e7-8442-a33c-aebde74de4ed xmp.did:d3c1e1f6-b4e7-8442-a33c-aebde74de4ed created xmp.iid:d3c1e1f6-b4e7-8442-a33c-aebde74de4ed 2015-04-26T18:44:02-04:00 Adobe Photoshop CC 2014 (Windows) saved xmp.iid:c26f6f34-4d1a-7440-897e-4f3b857fefd2 2015-04-26T19:01:33-04:00 Adobe Photoshop CC 2014 (Windows) / saved xmp.iid:002870de-9440-9848-8833-67fca24f4e42 2015-04-27T20:02:17-04:00 Adobe Photoshop CC 2014 (Windows) / 4 8BIM: printOutputPstSboolInteenumInteClrmprintSixteenBitbool printerNameTEXTprintProofSetupObjcFormat d'preuve proofSetupBltnenum builtinProof proofCMYK8BIM;-printOutputOptionsCptnboolClbrboolRgsMboolCrnCboolCntCboolLblsboolNgtvboolEmlDboolIntrboolBckgObjcRGBCRd doub@oGrn doub@oBl doub@oBrdTUntF#RltBld UntF#RltRsltUntF#Pxl@r vectorDataboolPgPsenumPgPsPgPCLeftUntF#RltTop UntF#RltScl UntF#Prc@YcropWhenPrintingboolcropRectBottomlong cropRectLeftlong cropRectRightlong cropRectToplong8BIM,,8BIM&?8BIM Transparence8BIM Transparence8BIM5d8BIM8BIM 8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM0 8BIM-,8BIM@@-P ((00xxpoPh 8@`@XH8@HX`hP\8BIM8BIMnullbaseNameTEXT UtilisateurboundsObjcRct1Top longLeftlongBtomlongRghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM,8BIM , Adobe_CMAdobed            " ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJIEch%&87}=K%ӐI:k$SKܮIO&H7[3bn/_'c oeοI4_鉅yTkK_< $v'(^r@)!j3;ꅣ:zeecXk@sJ*Q,aS]3.Cqz"]'ZܑW}|z~#Z?_~x?2Al{~"~Iy՟:nKIq{~/{_aw{ƽc-p2<9$2I$RI$TI%)P}sԭgj igK_1ޗ\}?zQ~*5?BYlx7O}KOR9Ӣn63Lg UZS{g׮PpX#n#N?-7{/kW>ʘ5>%H@8 JI$I%)$IJI$S }V8I݈d/ybK?UD COD7tuoKGs?ь}|sRԆn( Y?j>Mt ]鹚춿ο{C}$IOUi{k s䒤n}f=?3bnWRZun0;^4#SC^[:V,hn?-R[=OU`S66;J RI$TI$$6v^[bc]'9ߛ[~&b"˟!%G0lĚMq_NMb` kh_qK=#2;_$"{TI$u}lX  8f[}ޥv9Oo5 !akZdx /?YPOOݕ@4sR?ȫCU֎~}e[Qf05}H?^TS Xi4׬3Uc+ HJI $I)I$JQ୎ } 4OtPc/4>.'lֵuNm6]bŖ %dxwZWuͭy'YmfC6vG[r5踮zvk7D -hn2 5rG$8!szFuv6>9"Aq'k7=DKHFZ~}rYc-BWcKAQi,p}gc۫\4 .b䑵rJpc)qغd=_Y?W-h߳$k?E~^b!|ǐٮ|?!{Nz.6 E6k'u$9UR9~@ AYvּoLF·Dh$vWek5{AI+$\ \?5kIJI$R  $W9U8ZZdVDWA~WUrxKŋ?%$JFU-,[rM3iӏw{~8Ś-n2ĺij@qs*G1V $=֎ҥx#2>]8Doı_/K/۪K?y3}_܈^_ԗz#~#y#+F'0ėQ|meUkz]-ĥYm {? M 쫠Om]΋++5wh:ַw} ۾tgz^-Њ\ h_YVZ췖=C 7b4*5c}s'=wtK-k~ ldw-2uև1E>VGJES*,ebN?>"\^V;w[,{[4q׵ /.%c+u ?X?xیZpЃVAX6;jI-nw'V2,]ߢg½ J1#ARi6}P~t]GIΘ=Z[~6?ctL=]bc I-(䉱z^$I$JRI$G=mѡ(2<|^%=>d[S+lH >u,V RnI;#%g?yC"4DZpOs_˙v~cl-]9JB}{?`Kp?=C܃i?EmOCf?UkF?q O Z/b߰?^oꨜe(,^ Ї}21{1\}F.׬uZ:N=w>gNZӵ^;AUevm8؁_9r:RyG'"mU7豜gD8e`&8$ d*걾w]O;ٹlG5}ZڏdaGѹpZyS)nOL^'V m4[kORpIs4,[k7}.su,MC[H{ ҭ΢!뺆k5/c,=ޘc(2ˎ:𓦿ZbD'.(VCC!.fv>o__q=w#v y0. Iu +ܜ9WX1omMWw1\ֿOwUcva>%([cvyľ?fe$I)I$JE< {Nz_.Eiu乮U~U)F'XKo#g#Us)oh"ѫ?_o@Q{<14A )`=ƅHyV׿vV0K ;G/ywԣ) I$I%)k􏬙]6c>ӈߠ_? !$3!a-ǦFVAQaunԇQ -2\Guio6RL p6+#6I$I$R-~OsR$IJN߭=`:Ұv[#p嘌-z?Iu(ҟ+(:T}z4155@pRETI%4:D{z7nxRv[_ag轋~\_U|%kJr_cT:C{u*Zi=B_O跤`A :}V״ΖHۖѣd `bW?%ϲ?A,I$I%)$IJI$RsкQz֛[{@n:FI V֞0Ep윗 eL?7_'_m~'O=6ә.v{Ӻ? EKt>z{:wMҥ-|~bI$TI%)$IL^=c$yk~>r].4N3?IOg^O,7K?IIn~,YmȭGྜXO'.Km-)I;;3zICxp?5%[Y&nUYk@K}:,#zHR\z0}nGp1@ݢq?ķ@\ܫ ,)[ȭkjtoY~7 sǩ)bK!ؽ6`\ ΑvIw^ž⏥3+u,Å ~W{_]wcƱ c@ h5I$I%)$IO8BIM!]Adobe PhotoshopAdobe Photoshop CC 20148BIM"2MM*bj(1"r2i-'-'Adobe Photoshop CC 2014 (Windows)2015:04:27 20:02:17"*(2HH8BIMmoptLTargetSettingsMttCObjc NativeQuadBl longGrn longRd longTrnsboolembedICCProfilebool fileFormatenum FileFormatPNG24 interlacedbool noMatteColorbooltransparencyDitherAlgorithmenumDitherAlgorithmNonetransparencyDitherAmountlong8BIM-msetnullVersionlong8BIMms4w@l@0nnnnn,8BIMnormH( Background8BIMluni Background8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAON8BIMfxrpnnnnnx8BIMnorm \(Background copie8BIMluni$Background copie8BIMlyid,8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAON8BIMfxrp8BIMnorm0(8BIMluni </Layer group>8BIMlnsrlset8BIMlyid%8BIMlsct8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAON8BIMfxrp@: @Wnyq}u>""""8BIMnorm(B18BIMluniB18BIMlyid'8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAON 8BIMfxrp@G0F @G32 V8BIMnorm(B28BIMluniB28BIMlyid(8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAON#8BIMfxrp@'@ EE g8BIMnorm(B38BIMluniB38BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAON78BIMfxrp@>@x5*@g8BIMnorm(B48BIMluniB48BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAONO8BIMfxrp@L@[N/8BIMnorm((Wires8BIMluniWires8BIMlyid)8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAONf8BIMfxrp@: @Wn8BIMnormT(Nodes8BIMluniNodes8BIMlyid$8BIMclbl8BIMinfx8BIMknko8BIMlsct8BIMpass8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAONz8BIMfxrp@: @Wn8BIMlyvrn F0/Pb8BIMmul (X(Color8BIMlfx2nullScl UntF#Prc@z masterFXSwitchboolDrShObjcDrSh enabboolMd enumBlnMMltpClr ObjcCMYCCyn doub@RGzMgntdoub@PzGYlw doub@PGzBlckdoub@V=p OpctUntF#Prc@RuglgboollaglUntF#Ang@^DstnUntF#PxlCkmtUntF#PxlblurUntF#Pxl@8NoseUntF#PrcAntAboolTrnSObjcShpCNm TEXT LinaireCrv VlLsObjcCrPtHrzndoubVrtcdoubObjcCrPtHrzndoub@oVrtcdoub@o layerConcealsbool8BIMlrFX8BIMcmnS8BIMdsdw3x?QTm18BIMmul ?QTm18BIMisdw3x8BIMmul 8BIMoglw*j8BIMscrnj8BIMiglw+j8BIMscrnj8BIMbevlNx8BIMscrn8BIMmul 8BIMsofi"8BIMnorm8BIMluniColor8BIMlyid&8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMshmdH8BIMcust4metadata layerTimedoubAON8BIMfxrpTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999\80.,*(((&&$$"$$$$$$$"""""$"""""""" "" " "                                    " " "" """"""""$"""""$$$$$$$"$$&&(((*,.08\" &/8BLWblw wlbWLB8/& &4DVkȯkVD4&  &8Ng âgN8&  $9Rq 五qR9$ 0LmmL0 *EiÔiE**Jpլ՞pJ* 9_ťŎ_9  =gןךg= 2[ϙϏ[2 AppA  #J~~J#  "I~~I" >ss>,\\,?ww? M܌M  &VV& $VV$OODD5qq5#YY#=ހ="YY" 5ww5 FFWW%dd%*kk*-qq-.tt.+qٿq+'kϼk' aŹa RRBB00bʮbFF.||.XX66^̡^77[Ȝ[//JJii33KKdގd**::LL]ׅ]mm$||$,,3399?? CC  EE  EE  DD AA;;66//((!!pp__ OO <<--~~ccKK44  ddEE**ooGG++mmEE$$__77{{GٽG   UU )) aa 00ii33kk22 gg -- __ &&RRCڥCxx44 aa   DDtt**PP22XX//PP||))GG mm 6Ί6TTxx7Ӆ7RR tt ..DD__--@@WW pp -->>NN__ ss ""--88DDPP[[ff qq  ||   ""$$''**++..00000000..++**''$$""     || qqff[[PPDD88--"ʿ"  ss__NN>>--Ƿ  ppWW@@--ű__DD..ì  ttRR77ӨxxTT66Τ  mmGG))||PP//XX22PP**ttDD    aa44xxCCڐRR&&  __--  gg22kk33ii00  aa))  UU GG{{77__$$EEmm++GGoo**EEdd  44KKcc~~--<<  OO__pp!!((//66;;AA  DD  EE  EE  CC??9933,,$$||mm]]LL::**ddKK33iiJJ//[[77^^66XX..||FFbb00BBRR aa''kk++qq..tt--qq**kkʿ%%ddWWFF  55wwջ""YY==޹##YY55qqǷDDOO$$VV  &&VV MMܲ??ww,,\\>>ss ""II~~ ##JJ~~ AApp22[[ϫ ==ggת 99__ũ**JJppը**EEiiç 00LLmm$$99RRqq &&88NNggä&&44DDVVkkȣ &&//88BBLLWWbbllwwȢѢ٢٢ѢȢwwllbbWWLLBB88//&& ȣkkVVDD44&&äggNN88&& qqRR99$$mmLL00 çiiEE**ըppJJ**ũ__99 תgg== ϫ[[22ppAA ~~JJ## ~~II"" ss>>\\,,ww??ܲMM VV&&  VV$$OODDǷqq55YY##޹==YY""ջww55  FFWWdd%%ʿkk**qq--tt..qq++kk''aa RRBB00bbFF||..XX66^^77[[//JJii33KKdd**::LL]]mm||$$,,3399??CC  EE  EE  DD  AA;;66//((!!pp__OO  <<--~~ccKK44  ddEE**ooGG++mmEE$$__77{{GG UU  ))aa  00ii33kk22gg  --__  &&RRڐCCxx44aa    DDtt**PP22XX//PP||))GGmm  Τ66TTxxӨ77RRtt  ì..DD__ű--@@WWpp  Ƿ-->>NN__ss  "ʿ"--88RDP[f&q/| 7 ?FOUZ ]"`$d'g*i+l.o0o0o0o0l.i+g*d'`$]"Z UOF?7| /q &f[PRD88--"" ss __NN>>-- pp WW@@--__DD.. tt RR7Ӆ7xxTT6Ί6 mm GG))||PP//XX22PP**ttDD   aa 44xxCڥCRR&& __ -- gg 22kk33ii00 aa )) UU   GٽG{{77__$$EEmm++GGoo**EEdd  44KKcc~~--<< OO __pp!!((//66;;AA DD  EE  EE  CC ??9933,,$||$mm]ׅ]LL::**dގdKK33iiJJ//[Ȝ[77^̡^66XX.||.FFbʮb00BBRR aŹa 'kϼk'+qٿq+.tt.-qq-*kk*%dd%WWFF 5ww5 "YY"=ހ=#YY#5qq5DDOO$VV$ &VV&  M܌M ?ww?,\\,>ss> "I~~I"  #J~~J#  AppA 2[ϙϏ[2 =gןךg=  9_ťŎ_9 *Jpլ՞pJ**EiÔiE* 0LmmL0  $9Rq 五qR9$  &8Ng âgN8& &4DVkȯkVD4&" &/8BLWblw wlbWLB8/& EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEETTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""\80.,*(((&&$$"$$$$$$$"""""$"""""hF>:8:64624000.020000.0,,.........,..,.*,,.,.*,.,*,,**,**,*,((**,****,*(***(,*,(**(,*(,*(*(***(,(*(*(*(&&$&**((*(*((((((*((*(((*((((*((((*((((((&$&$&((((*((((((((((&&((((((((&&(((((&&(&(((&((((&$&((&&((&&(((&&((&&(&&((($((&$((&&&&(($&($&(($(&$&&$""&"$&&&($(($(&$(&&&&&&($(&&($($(($($(&&&&&$(&&&&&&&($($($($($&"$ & $"&&$&$&&&&&&&&$&$($($($$&$($&$&&$&$&&&$$&&&$&&&&$&&$($$&$($$($$($&&$&&$&&$&&$&&$&&$&$&&$&&$$$&$&&$$&$$&&$$($$$($$$($$$($$$($$$($$$&&$$&$$$$&$$$$$$$$&$$&$$&$&$$&$$&$$&$$$$$&$$$$$&$$$$$&$&$$$$$&$&$$$$$$$$&$$$$$$$$$&$$$$$$$$$$$$$&$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&$$$$$$$$$$$$$&$$$$$$$$$&$$$$$$$$&$&$$$$$&$&$$$$$&$$$$$&$$$$$&$$&$$&$$&$&$$&$$&$$$$$$$$&$$$$&$$&&$$$($$$($$$($$$($$$($$$($$&&$$&$$&&$&$$$&&$&&$&$&&$&&$&&$&&$&&$&&$($$($$($&$$($&&$&&&&$&&&$$&&&$&$&&$&$($&$$($($($&$&&&&&&&&$&$&&"$ & $"&$($($($($(&&&&&&&($&&&&&($($(($($(&&($(&&&&&&($&($(($(&&&$"&""$&&$&($((&$(&$((&&&&(($&(($(((&&(&&((&&(((&&((&&((&$&((((&(((&(&&(((((&&((((((((&'((((((((((*((((&$&$&((((((*((((*((((+(((*((*((((((*(*((**&$&&(*(*(*(,(***(*(*,(*,(**(,*,(***(*,****,**((,*,**,**,,*,.,*.,.,,*.,..,.........,,0.000020.00042646:8:>Fh"""""$"""""$$$$$$$"$$&&(((*,.08\" &/8BLWblw wlbWLB8/& &4DVkȯkVD4&  &8Ng âgN8&  $9Rq 五qR9$ 0LmmL0 *EiÔiE**Jpլ՞pJ* 9_ťŎ_9  =gןךg= 2[ϙϏ[2 AppA  #J~~J#  "I~~I" >ss>,\\,?ww? M܌M  &VV& $VV$OODD5qq5#YY#=ހ="YY" 5ww5 FFWW%dd%*kk*-qq-.tt.+qٿ!ɽzpg^UME>70*$  $*07>EMU^gpzq+'kϼų~m\L<,,>)GnnG m::m mm6<<6Ts  sTxBBxyy7JJ7RR tXXt ++.hh.D==D__WW..-rr-@KK@W##W pjjp EE""-nn->LL>N**N_vv_ sVVs 66"jj"-MM-8228DDPkkP[QQ[f77f qq  |yy| aaII44    "kk"$WW$'DD'*22*++..0ww00hh00YY00KK0.==.+11+*##*''$  $"~~" uu lldd\\TT MM  |GG| qCCqf@@f[==[P99PD77D8558-22-"11"1122 55 s77s_99_N==N>@@>-CC-GGMM TT p\\pWddW@ll@-uu-~~  __D##D.11.== KK tYYtRhhR7ww7xxT22T6DD6WW kk mmG  G))44|II|PaaP/yy/X77X2QQ2kkPP*22*MMtjjtDD   66 aVVa4vv4x**xCLLCnnR""R&EE& jj __-##- KK grrg22..kWWk33i==i0hh0  a++a)XX)  UU JJ yyGGBB{ss{7  7<<_mm_$$::EnnEm>>m+tt+GFFG}}oo*RR*E%%E__dd 99 tt44OOKK,,cjjc  ~KK~--++<kk<    OMMO_11_vvpp!^^!(GG(/11/yy66gg;  ;TTAA DD DD 66 EE )) EwwE    CnnC?ff?9``9 3[[3,WW,$TT$||TTmmVV]]YYLL__:  :ff**nndxxd''KK2233??iOOiJ``J/uu/''[<<[7SS7ll^  ^6<<6WWX  Xuu.++.||LLFFpp''bbMM00tt,,BBWWRR== akka%%''kTTk++qBBq.ww.t44t-ll-q**q*ee*k$$k%``%d  d__W  WccF$$F ii 5++5wwpp"33"YY}}AA==SS##YYhh//55qqIIDDgg//OORR$$VxxVCC    &&VnnV:: MhhM44?hh?w77w,qq,\AA\>PP>s!!s "gg"I99I~  ~ #WW#J++J~~ }} RRA''AppVV2--2[[ dd <<==ggzz TT ..99__vvSS//*  *JJppbb@@  **EEii``BB ## 00LLmmssWW;;$$99RRqqggNN55  &&88NNg||gffQQ<<''&&44DDV~~Vkmmk\\LL<<,, &&//88BBLzzLWppWbggbl^^lwUUwMMEE>>7700**$$  $$**0077>>EEMMwUUwl^^lbggbWppWLzzLBB88//&& ,,<<LL\\kmmkV~~VDD44&&''<<QQffg||gNN88&&  55NNggqqRR99$$;;WWssmmLL00 ## BB``iiEE**  @@bbppJJ*  *//SSvv__99.. TT zzgg==<< dd [[2--2VVppA''ARR }} ~~J++J#WW# ~  ~I99I"gg" s!!s>PP>\AA\,qq,w77w?hh?44MhhM ::VnnV&&    CCVxxV$$RROO//ggDDIIqq55//hhYY##SS==AA}}YY"33"ppww5++5 ii F$$FccW  W__d  d%``%k$$k*ee*q**q-ll-t44t.ww.qBBq++kTTk''%%akka ==RRWWBB,,tt00MMbb''ppFFLL||.++.uuX  XWW6<<6^  ^ll7SS7[<<[''/uu/J``JiOOi??3322KK''dxxdnn**ff:  :__LLYY]]VVmmTT||$TT$,WW,3[[3 9``9?ff?CnnC    EwwE )) EE 66 DD DD AATT;  ;gg66yy/11/(GG(!^^!ppvv_11_OMMO    <kk<++--~KK~  cjjc,,KKOO44tt 99 dd__E%%E*RR*oo}}GFFG+tt+m>>mEnnE::$$_mm_<<7  7{ss{BBGGyy JJ UU  )XX)a++a  0hh0i==i33kWWk..22grrg KK -##-__ jj &EE&R""RnnCLLCx**x4vv4aVVa 66   DDtjjtMM*22*PPkk2QQ2X77X/yy/PaaP|II|44))G  Gmm kk WW6DD6T22Txx7ww7RhhRtYYt KK ==.11.D##D__  ~~-uu-@ll@WddWp\\p TT MMGG-CC->@@>N==N_99_s77s 55 2211"11"-22-8558R77D99P==[@@f&CCq/GG| 7MM ?TTF\\OddUllZuu ]~~"`  $d'g##*i11+l==.oKK0oYY0ohh0oww0l.i+g22*dDD'`WW$]kk"Z   UO44FII?aa7yy| /q &77fQQ[kkPRD8228-MM-"jj"66 sVVs _vv_N**N>LL>-nn-""EE pjjp W##W@KK@-rr-..WW__D==D.hh.++ tXXt RR7JJ7yyxBBxTs  sT6<<6mm m::m GnnG)>>)|tt|PFFP/}}/RRX%%X2__299PttP*OO*t,,tDj  jD KK  a++a 4k  k4xMMxC11CvvR^^R&GG& _11_ -yy- gg  gg 2TT2kDDk3663iۂ))i0w  w0 anna )ff) U`  `U  [[ GWWG{TT{7TT7_VV_$YY$E_  _Emffm+nn+Gx''xGoՄ22o*??*EOOEd``d u''u 4׊<<4KSSKcl  lc~Ԉ<<~-W  W-<u++u< OߖLLO _p''p_pݕMMp!t,,t!(WW(/Ƀ==/6k%%k6;ߙTT;AʆBBA Dw44wD  El**lE  Ee$$eE  C`  `C ?ߟ_  _߹?9c$$c93i++i3,p33p,$|}AA}|$mɎSSɫm]תܢh//hܪ]LIIL:ןg//gק:*RR*dޥxC  CxdKעn::nףK3ќh44hѡ3i͛h77h͠iJӢqAAqӞJ/߯P!!Pߜ/[Ȝĕg9  9g[7ޱW++W7^̡Ө}R''R}^6ҨV--V6X۳d<70*$  $*07>EMU^gpzq+.tt.-qq-*kk*%dd%WWFF 5ww5 "YY"=ހ=#YY#5qq5DDOO$VV$ &VV&  M܌M ?ww?,\\,>ss> "I~~I"  #J~~J#  AppA 2[ϙϏ[2 =gןךg=  9_ťŎ_9 *Jpլ՞pJ**EiÔiE* 0LmmL0  $9Rq 五qR9$  &8Ng âgN8& &4DVkȯkVD4&" &/8BLWblw wlbWLB8/&  /:4.% !(1>7.+*'#$"#!"! !!!$! !   !#! "!!"$%"#'%)(++>>1+#(2=.#   ( 5>@EXIpak~vkc{mdafLVM9$8 9)c`~Ӯvrb82- !:YjӷuPG4 ;GðsU3.  =Rv ﷣a> (AhǖuF5 1G Ŭ[5"CņU* ?kuN7HȘj:1v۳~P' OĒU.  LΟ\/Wإ_3[ڭl2G٧i, NU#B%jy8 JY',̘FHr*yJR_&"tЇ>FZ Zy*x< -AI[Oo,dٔ'o/).7 ,O6b :_6Z-S KL@lߦ ^ܣxIҢj*ª a ڼN͛laH3oRw޵G# Kr5\ٻ̘V1 -TμāS Epb1;o5 ho<9s|!9‡8 9udG?,YZGߋ'φ1[M` H/:܅4 -ttiS9Q< ){$rK ] O!&k_Jv`  M,+HFbz?  $@:ikL !,M AI nhR"qWIS T 463p tP@$}\WY%kB-;DgDe~ G26H} Vl ~&m;9=j wN Az21E7[^x|h?(.;?} Zlj9*   e, I5:3aH{feF2 # & T=X8]<%#au lM A/"-'=(zX,iZ5i BgLW4hJ* o2r &z e|Mla=tI9%j0+S/8B7Y.B$K7Q=)O"HD0UH!G*[ 8\59WIE c I7 >*E' g(~&f$`? bP2Ec Bc8MM.nK4C O, xk@TjT( q:]LmE11(hH"W JwA)fM"J I'`9 Lm8n)% Id.ey=Q %`m, qS+H  xt(T9Gz.JgN"I!>r o:i /e-17 a,jKjHSW$"I*nߡ`%dsG9^7Gp]5:Z(Yx< $&3'P C G7`xY0!6g>_svM,s)ZLt6 #r/Q :ARz,VxQ;&9v2[YpJ2 &ŀ20[;Ap+  `imn,J$n UϾBPw$.ZYzؽÅLDb$Ϟq4+ 9P)B꾛aK&2UQTƶĥ~L .@fxi붍jW@  <:g ųgpL9,0  B6\m9. ϨwkkyxST daӢ^*ݥ6)9@1?\AUFb ThSg O];\ G 7 ұ  zRw=\(7%uى'Pl;ٺK"Hy.;F(j̈́( BS#]p2-s?GݮV_j4 l|"'mz@3g2,_pDS~+DŠY$3sصyA V \4 8bcB >[ȟkA%X{ ɾ}o1% 'Hs~ ԷqO- *:i ʱh^"*+5GiƳBJ*%9^ovôiTL"1 9TSenuk}yytmm[Y[5D'$   -2*#  *3</&%&#! ! "!!#""#"''1:2( 02* !% $% $3?Dfcty{lbXR+<$ ) I8pǵrWY5 (]f ɮ|pQ7 !/]z ĢiQ%& 05s ᦙcF" )Ap ՠmF Dh֐i2 5aQ):uɞo?PݸyS#YʎW' RɘN VC;ɻ{09{r1eY@֗A*ig)  GԖ?lx89ذW Yv.nڛ6 (II_[x*+|Өێ62= @>==:OD:413'"|$[{La /LDZ²к7῰wwTWK&D-9%/B1DaScf#(ݺpJE   /8PtM h Ɍz>9 2NfCHɏc< 9n׵cE Kwjhڋf5_F3>*X*F(Qk\՞W ,aSa%s, u|9  7bGW  i, ܈8F~Po1yXTS#l@ @c +65oބ%5c*y 91 k4O00y2U&5!a* RQ;L;\k?~ #l(#7 \FgFl|@2/ mHWa!A7Q= tf{hFw9b{+d++A g }'%LH< c4X@| #l %hv30@0F1@[t~M>[l  '!?V f5W/]0g8G qn |hh KoxF^&=B9$7< .-,4 !HwARxFC~ ,>s,Th?au<>&6 'C-B$.0&%3+B: %CU ez} x _"kc)BDRD[%.e { ++<}ySaf mg S;"3<2GU!$h    /e[O o=8*;Hz hW6@8*v z 6FXxCIFP!$lZ  oH9:7 OUaD8:FxgD} 3Z b|MND;/F>  R74I(ߚ%+ j/9U 6kDDB+D O  e]fOq#U0 @8 I Zi @l- %jZ SX&΅C 9Av7 +x3kޥ],5^m,ٟ[!0r#O۝w4$DxFa紓W: ._tη\! !g~*BR@+!X_M R'ǞpO09 7CLtq tʾ±tkfPOVA8W5d[bss!׾(3@?Jc` xs)ڠ .4, : <ڌ"=̀'0n sSp9 f% R^ 9> #mۑ& DӰk)kۦDEo0d< 9s϶m EАB`޺U8xm <o2@s.@l<8q,oM*L|ȫr=+VwܶB) *NܤD; )W uO%  /@UJ@  Ccf ʻ~x@; )?WOvܬsOP$* $ *!.CNC]wew|ospqniVe:?/#  $05& ,7<-'"!!     ! ")&*95,&9.% (1!MRj=0߰a eяFDe!e> +`%Nև6)vΪZ 8lFo#S2k˥H $zҤR&ۣS$E`O_ ڼkPe:LDIIR<[iltX z(ôpO<* *,2^In λq9* %5p *x"Z_a x?M02ی/4|sz&qGNqfj t_ Wwu!.wbh r ^5)h n0(378m]iJ)\_ ]/|)XLNO '8(g(i J`$ W J'H ]E9O0S~[E& y<> Sc7 eZq!.7N$Y 1Y oX:D&&=~ zO+_Se DF9 P- Y, kY= hU4C:O3g.4i 63~s2* 3I_^RW"^L[ZC"g B$ X(WF$aM0YVXaFM6_; v3.](8L<CLOWHs{ r2fE=! 0VEr %}T$BW61Za -#*_/gnEpU#> \ &D ejU?b7 .!=z ^G]S.i!p3g? U%*$Y\sOf*H2w z1W_ y#U VF_@L#;\\&0%8&,UR1+&:6LVJ@\RAP``{h}#!u'5S:m [l/  g֞M-=1x+eiggMx_(640՚a0Jd9٬f9%JgʂO  8j)xu;%@PC/ ѣ{]A2EqMA%ţ~`DA  :UkjH ǫu~cGR?7;>0PGKe]q JѶg t'$uٟ$g*l6v=v7f3 `~)6t+XtId,B٬_!+ní83ۯs#%w١MIi,#cی/6{סP2]-4nCܯY8@۾טi !2i>('>ͭ`CaA& ;f۠C2<[w ֲeA$ ;d IJwF91(.Cdεgg12&%0OYOvldJ8: 2+4*02+! ! "+2*/8(#%#$   !!!! !%&45+ +.$ ,-7%C:9$"" # JF^tyиqcbD(), 3AYxӱmF0" *5e |Y+/BĐU6Hz\8 >]װ|W+ #:̝n; Uܰm>%J۰m;Uܯl09|ܢ]*,sЙ@Sq# KCg'$f͍;.H  >V  Vc`f"pх1n#q5g /Yڳ4T鲹}^NSB;K$>63ScPw0K&髣\[-  *"Da;8墈Q4   /Fn)!VAiنu5  &W^ݯd5KK  sn%  ED St<S*2J $vn z!JH][ -q+,?Kq߀- .EWs2"mW`u #s,.y #ulu  y22"m#=0&9GilYi5 m\ Q##"R KF;|~ v<@$#t[X U(%rZ)-+iT Y zI-1iD6h4k_3 W* e 'M1>b <)Y U8fm( Q|B7SMSZ<+F Jf R_ }`iyft  |HU1 oOa,pgg)iW, XF0 rj [-h uri!~!T- H,I]*q <h jK/?M=nx8.Q(k5L o.^ %_2rY O #$5h[})^<Y H %wMj@l#<ar:=CY} %jfd<>/8%v ;MobbU> YdJ K <PXK BZMEJg#`t͇8$s1=M:i np& Q$ۓ(0B<u4!Mw`f)E!"]"=:9n. Qt\TI 8Ys eТn2.,W~r ̣wh9 4aĹ~P; &GQ\~ƿef=(& -43N[\jngyijhkYMN+3  #'-/*)!""!&)-*0-*,,,,)-+..1.-),.(&! ## """"#!(+#!# #).38482*""  # !!"! !%))))**+&!!""#% !$!!!!!!!"##""" #&'##$"# !?TI" ٟf3: Dܸo4  ̦aW"c ٲ[/.  ¢jA   Vd2!1 ܨlK*dpG,  d=,%0 ߾gQ;'J ̥jTײ j97  ඼mH"( ̧fY$6촑mBA6“xN ' *ļ ۨ`U- .ٷ ֹlD=!D Ʒ~S!VЯ 박rZ> 8Ϊ ךnH))5 ҥsX.O彔OG arX%0p ٭y_<V ˑCI# O̜}[,2 Ḩzk>  ћHH%r X/$ * Ɯf@ "@P]~ ͨ}ZA1 4VJr ޹Y6 *MMh ˕cI% ,2Nb~ճg+: ))6\| hJ& 5 V ȢVX"  (8o ܮf(9.3Vz {D 9\V ѻWZ) -XBw ӯe?4 ,JW^è ϫF 2YQ cJ5 41U nH (9J| ܨjT/((0bⷍwFF(6U~Ș}E&  0UY ߱ab2.PUl ತr8GH]O ˿M'$7VWvĸ ݽqk0 <5aq ߽o5;$4&Fdشh  $3%` 3U !,MYs" )Kaf¿Mh: %?"]#.-Av8=g-@i_1 9`W! 2Qgiг   $:g`  A;g' A$R'.96p'# $3AnC $' HR Q:c CT 3 lvF*. ɢrq['K ɪ~`k3 [輮W`=O ѦsV<LaSv|XI kl jf@ 27*B7!407.- 2K] JAZiwX [lhbj=5HM8/04"$'Q_F ?\qycwnbre^=/UT5!0!6.& 4 DT08laun p~  a{hh<?Y }U* .0)8, ; I$B58ejqi] cyp]KMxd J ()*<->&8J+<6F_ngt KT}}NV`ya~U15+E"< D;/*0 D g|d LRzzUTzk w]H53%QA"%?&>*/K\aCWS lpw lbB6AN C &#A11+(UR"DC Swaphoe F A!LQ3!$4>046TP: C\pth  zs Vog> ZaU =).1>"01U C"6 C]y sy fVi]FVmO8./6/G#6L)E"*Heome Rrf H` sgO 3u=bG?@6)F.%2-.y /) aO bM: vJ ?ZS; X/$R{r D Λq[2' f<([wA ԫlM)WlB 2U B |sC5  8h*j9 :eG% R> U޳ ՗ZK%  ۥ}d32 ණ~b8 ̎|6B! {Q'V ڵ]c. G ݰj.1G Ŭr; 9 иCG$@ƽ Y+ > ̙re@7ñrC#3 쪊sP.- ȌZ?,, ǡhF  . שWL')s ŭR'  Wh Ɣq\: >mq͘оpE4/ Ⰸ{I" FݔaI0  æa< $ rf>'T֊ָY>  P; . fN,%Tω ͦsK.y u@9* ŒfG & N҈ ˢ`S$  |x^/! 嫥q_7IЇ ė};J"x ƍ}T&ذ\^-B ֳg#0r ЫorA⽵LP&7 ŘX$mљj`:ѶrG++ |yJ.  9Nvú ǽg?0 6@^m ƧlA 8Nxw zZ?(  4[w ظW2 =jm ɔtX9 *I|| žrD-" 0Ix հ~M) 65Ry ΅^@:1VUƟM4ZX' BWiEX^{!,Wb%5\vh   ("`lh@ $?3_Ö $NFj )FYlƾ 2Fmja:Qwj  ;c|s %Djvf4QuB1(C:JF  7bY& 8][   F^z -MlҦ>* "5Lp) ##5[a !9)g> 'F.k%  ,POk[ $Ips.  ,Kwiܬ )^z~{:> +kY 0"KgzN8#Us- 22Gu& 4WP* 5lZ&  ?dj  "Law  (Sf["/HvY  1<`+       !8%#[;L;-9*/2lE/=-0>,`zYP@'0+9Bc]6BX/$/ A>KR&XrbbwRUXVKZ|{gb`bY}RtfWhxci{~B|aOx~_l{bqw41&!/;  R  0  8  )!5)8  "$5. R  #)1+  >8 2!/ . T +)()(C /-- ; -  2.$)< ' 2  2& 2- = "$) I& !(R   !  !,   .C %: .-!   a1  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/0/0/0/0/0/0/00/0//0/0/0//0/0//./././.././ ./..//./.././../.-.-.-.-.-.-.-.-.-.-.--,-,-,,-,-,-,--,,-,-,+,+,+,+,+*++*+*+*++*+*+*+* )**))*)*))*)*)()()()('(('('('('(('('('('('('('('('('('('('(('('('('('('('('('('('('('('('(('('('(('('('((''(('('('()()(()()()()()())()*)*)*))*)*)*)*+*+**+*+*+*+*+,+,+,+,+,-,-,,-,,-,-,-,--,-.-.-.-.-.-.-.-.--.-.-.-.-././../././/./././/././././././././0/0/0//0/00//00/0/0/0/0/0/0//0/0/0/0//0/0/0/0/0/0/0/0//00/0//00/0/0/0//.//././././././../././.-.-..-.-.-.--,-,-,-,,--,--,-,-,+ ,+,++,,+,+,+*+*+*++*+*++*++**)* )*)**)**)*)*)*)()()()()()()('('('('('(('(('('('('('('('('('( '(('('(('('('('('(('('('('('(('('('('(('('('('('('('('('('('('('('('('(('('()()()()())()()()*)*))*)*)*))*)*+*+*+*+*+**+*+,++,++,++,+,+,++,,+,+,,+,-,-,--,-,-,--,-,-.--..-.- .--.-..-.-.-..-.-././.././././../././././0/0/0//0/0//00/0/0/0/0/0/0/0/0//0/0//0/0/0/0/0/0/0/0/00/0/0/0/0/0/0/.//./././././../././.-..-.-.-.-..--..-.-.-.---,-,-,--,--,,-,--,-,-,--,-,+,+,+,,++,,+,+*+*+*+*+*+*+*+**)*)*)**)*)**)*)())()(()()())('('('((''('(('('('('('('('('(('('('('('('('('('('('('('('('('(('('('('('('('('('('('()(()()()()()()*)*)*)*)*)*+*+*+*+*+*+,+,+,+,+,+,-,-,-,-,-,-.-.-.-.-.-..-..-././.././././.././/././0/0/0/0/0/00/0/00/00/00/00//0/0/0/0/0//0/0/0/0/0/0/0/0/0/0/0/0/00/0/0/0/00/0/0//0//0/0/./././././.././../././.-.-..-.-..-.-..--.-.--,-,--,-,--,-,-,+,+,+,+,,+,+,+,++,+*+*+* +*+**+*+*++*+**)*)*)**)*)*)*)()())()()()()()('('('('('(('(('('('(('('('('('('('('('(('('('('('('('('('('(('('(('('('('('('(('()()()()*)*)*)*)*)*+*++*+*+*+*+*++*++*+,+,+,+,++,+,-,,- ,-,-,--,-,--,-.-.--.--.-.-..-.--.././.././.././../././/.././././0/0/0/0/0/0/0/0//0//0/0/0/0/0/0/0/0/0/00/0/00/0/0/0/0/0/0/00/0/0/0/00/0/0/0//00/0//0/0/00/0/././././././././../././.-..-.-.-.-.-.--.-,-,-,,-,+,+, +,,++,+,,++,+*+ *+*+*++*++*+**+**)*)*)*)()()(())()('('('(('('('('('('('(('('('(('(('('('('('('('('('('('((('('('('('(('( )(()(()()(()()()()())()*))*))*))*+*+*++*+*+*+*+++,+,++,+,+,+,-,-,-,-,-.- .-.--.-.-.-.-..-.-../././././././/.././././0/0/0//0/0/0/0/0/0/0/0/00/0/0/00//0/00/00/0/00/0/0/0/0/0/0/0/0/0/0/00//0/0/0/0//0/0/0/0/00//0/0//0/0/0/0/0/0/./././././..//./../.-.-.-.-.--.--.-,-,,-,-,-,-,-,-,+,+,+,+,+,+,++,+,+,+,+*+*+*+*+*+**)*)*)*)*)*)*)()()()())()('('('('(('(('('('('('('((''('(('('('(('('('('('('('('(('(('('('('('('('('( '(('('(('('('('('('(('()()()()()()*)*)*)*)*))*+*+**+*++*++,++,+,+,,+,+,-,-,-,-,-,,-,-,-,-.--.-.-.--.-.-.-.././././.././././.././././0//0/ 0//0//0//00/0/0//0/0/0/0/0/0/0/0/0/0/00/0/0/0/0/0/0/0/0/00//0/0/0/0/0/0/00/0//0/0//0/0/0/00//0//0/0/0/0//0/0/././././ ./..//./../././.-.-.--.-.-.-.-.-,-,-,-,,-,-,,-,+,,++,+,+,+,+,+*+*++*+*++*+*+*)*)*) *))*))**)**)*)()())()()()('('(('(('('('('('('('('('('(('('('('('(('(('('('('('('('('('('('('('('('('('('('(('(('('()()(()()()(()()()()()()*)*))*)*)*)*)**)*)*+*+**+*+**+*+*+*+*++,+,++,+,+,-,-,-,-,-,,-,-.-.- .--..-..-.--.-.-.--.././././.././/././/././/./0/0//0/0/00/00/0/0/0/0/0//0/0/0/0/0//00/00/00/00/0/0/0/0/0/0/0/0/0/0/0/0/0/0//00//0/0/00//0/0/0/0/0/0/0/./././././/././..//./.-.-.-.-..--..-.-.-,-,- ,-,-,,-,-,,--,+,+,+,+,++,,+,+*+*+*+**)*)*)*)**))*)*)()())())()()('('(('('('('('('(('('('('('('(('('('('('('('('('('('('('('(('(('('((''('('('('('('('('('(('()()()())()()()*)*)*)*)*)*+*+*+*+*+*+*++,+,+,,+,+,+,+,-,,-,,-,-,--,,-.-.-.-.-.-.-.-../././././/./././././0/0/0/0/00/00/0//0//0/0/0/00//0/0/0/00/0/0 /0/00/0/00/0/0//0/0/0/0/0/0//0/0/0/00//0//0/00/0/0//0/0/00/0/0/0/././/./././/././..//..//.-..--.-.-.-.-,-,-,-,-,+,+,+,+,,+,+,+*+*+*+*+*+**+*)*)*)*))*)()()()()(()()('('(('('('('(('(('('('('('(('(('('('(('('('('('('('('(('('('('('('('(('('('('('('('('('('(('()()(()()()()()*)*))*)*+*+**+*+*++, +,+,,+,,++,-,-,-,-,-,-.-.--.-.--..-.-.-.-.-./.././././././/./0/0/0/0/0/0/00/0//0/0/0/0/0/01010/0/0/0/0/0/00/0/00/0/0/0/0/ 0/0/0/0/00/0/././././././..//./.-.-.-.-.-.-.-,--,-,-,-,-,,-,+,+,+,++,+,++,++,+*+*+*++*+***)*)*)*)*)*))*)*)()()()()()()('('('('('(('(('('('('('('('(('('('('('('('('('(''(('('('(''('('(('('('('((''('('(('('('('('('('(('()()()()()*)*)*)*)*)*+*+*+*+*+*++*+,++,++,+,+,,++,+,-,-,-,,--,-,-,--,--,-.--.-.--.-.-.-.-.-.-./././../././././/./0/0//0//0/0/0/0/0/0/00/00/0//0/0/0/00/0/0/001010010100101101001010/0/00/00/0/00/0/00//00/0/00/0//00/0//0/0/ .//.././../././/./././.-.-.-.--.-.-..-.-.-.-,-,--, -,-,-,-,-,-,+,+,+,+,+*+*+*+*+*+*+*)*)**))*)*)()(())()()()('('('('((('('('('('('(''('('('('(('('('('('('('('('('('('('('(('(('('('('('('('('('('()())()()()*)*)*)**))**)*+*+*+**++*+*+,++,+,++,+,++,+,-,- ,-,-,--,-,,-,-.-.-.-..--.-. /.././..///./././././0/0/ 0//0//00//00/0/0/0/0 /0//0/00/0/0/0/0/0101010101010101010101010/0/00/0/0/0/0/0/0/0/0/0/0/0/0/./ ./..//..//.././/./././.-...-.-..-.-.-,-,-, +,,+,++,++,+,+,+,+*+*+*+*+*+*+**+*)**))*)*)*)()()()()()(()('('('('('(('('('('((('('('('(''('('('('('('('(('('('('('('('('('(('()()()()()*))*))*)*)*)*)**)*+*+*+*+*+*+*++,+,+,+,++,-,-,--,-,,-,-.-.-.-.-./.././././/././0/0/0/0/00/0/0/0/0/0/0//0//0/0/0/00/0101010101011010101010101011010010101001010100/0/0/0//0/0 /0//00/0//00/0//0/0/././././././././././.-.-.--.-.-.-..--.-,-,-,-,-,+,,+,+,+,,+,,+*+*++**+*+**++*+*+*)*)*)*)*)*))*)()()( )(())()())()('('(('('('(('('('('('('('('('('('('(('('('('('('(('((''('('('('('('('('('('('('( )()(()(()())()()()()*)*)*)*)*)*)*+*+*+*+**+*+*+,+,,+,,+,+,+,-,,-,-,--,-,-,-.-.-. -.--..-..--..-././././././././././0/0/0/0/0/0//0/0/00//00//0/0/0/0/01010101100110101010101010010101010010101010101010100110100110101010100/00/0/0/0/0/0/0/0/0/././/./././..-.-.-.--..-..-.-,-,-,-,-,-,--,+,+,+,,+,+,,+,,+*++*+*+*)*)*)*)()()(()()('('(('('('('('('('('('( '(('('(('('('('('('('('(('('(('('('('('('('('('('('('('('(('((('('(('('('('('('('('('('(( )()())()()()()*)*))**)*))*)*)*+*+*+*+*+*++*+,++,+,+,,++,+,+,-,-,-,,--,-,-,-.-.-.--.--. -..--.-.-.--./././././../././././0/0/0//00/0/0/0/010101010100110101010101010101001010010101010101010101101010101010100/00/0/0//00/0/0/0//0/0/0//0/././././/..//./././.-..-.-..-..--.-..-.-.-..-.-,-,-,--,,--,-,+,+,+,+,+,+*+*+*+*+*+*++*+*+*)*)*)**)*)*)())()()()()(()(()()('((''('(('('('('('('('('(('('('('('('(''('('('('('(('('('('('(('('('('(('('('('('('('('('(()()()()()()()*)*)*)*+*+*+*+*+*+,+,+,, +,+,,++,,+,-,-,-,-,-.-.-.--..-.-.-.-././././../././/..//../0/0/0/0/0/0/0/0/0/0101010101010110110110010101101010100101010101010101010101010110101010100101001101010/0/0/0/0/0//0/0/0/0/0/././/./././/.././..-.-.-..-.-.-,-,-,-,--,-, +,+,,+,,+,+,+,+,+*++*++**++*+*+*+*)**)*)*)*)*)*)*))*)()()()()()('('('('(('('('(('('('('('('('('('('(('('('('('('('('(('('('(('('('('('('('('('('()( )(()()(())(()()()()*)*)*)*)**)*)*)*+*+*+**+*+*+,+,+,,+,+,,+,-,-,-,-,-,,-,-.-.-.-.-. -..-.--..-./././../../../0/0//0/0/0/0/0/0/0/0/01010101010010010101010101010101101010101010101010101010110101010100110110101101100010/0/0/0/0/0/0/0//0/0/0/./././/.//././.-.-.-,-,-,-,--,,-,-,+, +,+,+,++,,+*+*+*+*)*)*)*)()()()(()()('('(('('('('('('(('('('(('('('('('('('(('('('(('('('('('('('('(()()())()()()*)*)*))*)*+*+*+*+*+*+*+,+,+,,+,+,++,+,,+,-,-,-,-,-,-,-,--,-.--..-.-.-.-././/..//.//..//.//././0/ 0/00//0/00//0/00/0/0/0/01010101010101010101010110010110110101101010101010101010101011001010101001010101011001001001001010101101001010/0/0/0/0//00/0//0/./../././..-.--.-.-.-.-.-.-,-,-,-,-,-,-,,-,-,-,+,+,+,+*++*+*+**++*+*)*)*)*)()()()()())()()())()()('('('('('('((''('('(('('('('('('('('('('('('('((('('('('('(('('('('(()()()()())(())()*)*)*)*))*)**)*)*+*+*+*+*+*+,+,+,+,+,+,,+,+,-,-,-,-,--,-,-.-.-.-..-.-.-././.././././././/././0/0/0/0//0/0/0/0/01010101010010101010101010100101001010101010101010101100101010101010110100101010101011001001010101011010/0 /0//00/0/00/0/0/0/././././././.-.-.-.--.-.--.-,--,,-,-,-,-,+,+,+,+,,+,+,+*+*+*+*+* +**+**++**+*)*))*)*)*)*)()()()()()()())('(('(('('('('('('('('('(('('('('('('('(('('('('(('('('('('('('()()()()()()*))*)*)*)*)*))*)*+*+*+*+*+*+,+,+,+,+,,+,-,-,-,-,-,-.-.-.-./..//./../../.././/0//0//0//00/0/00/00/0/0/0/01001010101010100101010 10101100110110101101010101010101010101010101010011001001011011010101010101010010/0/0/0/0/0/0//00/0/./././ .//..//././..-.-. -.-.--.-.--..-,-,-,-,+,+,+,+,+*+++*+*+*+*+*+*+**+*+*)*)*)*)*)**)*)()()(()(()()('('(('('('('('(('('('('('('('((('(('(('('('('('('('('('(('(('('('('('(('((''('(('(('('('('('('()()()())()*)*)*))*))*)*+*+*+**+* +*+*+*+*++*++*+,+,+,,+,+,+,,-,-,-,-,-.--.-.-.-.-.-./././././././/0/0//0/0/0/0/0/0/010101011010101011001010101 0110101010110101101010010101010101010101001011010100110101101010110010/0/00/0/0/0/0/0/0/.//.././././.-.-.-.-.-,-,-,-,--,--,-,+,+,+,++,,++*++*++*+*+*)*)*)()()()()()('(('('('('(('(('('('('('('(('('('('('('(('('(('('('('('('('('('('('('('('((()()()(()(()()*)*)*)*)*)*+* +**++**++*+*+*+,+,+,+,+,,+,-,-,-,-,-,-,-,,-.-.-.-./././/0/0/0/0//0//0/0101010100101001010010101001010101112121210101010101101010011010101010101010/0/0/0/0/0/0//00/0/././././.././.-..-.-.-.-.--.-,-,-,-,,-,-,+, +,,++,++,,+,++*++*++*+*+**++*+*+**+*)*)*))*)*)*)())()()()(()()()('(('(('('('('('('('(('('('('('('('('('(''('(('('('('('('('('('('(('('(('('('('('((''('('(()()()(()*)*)*)**)*)*+*+*+*+*+,++,+,+,+,,-,-,-,-,-,-.-.--.-.-././..//./././/..//./0//0/0/0/0/00//0/010101001101010110100101010110101011212112121121221212121212121121011010101101011001101011010101101010/00/0/0/0/0/0//0/0/./././/.///././/./././.-.-..- .-.-.-.-.-.-,-,-,,--,-,-,+,+,+,+,+,+,++*+*+*+*+*+*+*+*)*)*)*)*)*)*)()(())(()()()('('((('('('('('(''('('('('(('('('('('('('('('('('('('('('(('('('('('('(()(()()()()*) *)**)*)*))* +**+*+*++**+**+*+ ,++,++,+,++,+,,-,-,-,-,--,-,-,-.-.-.--..-.-.-.-..-././../././../././0//0/0/0/00/0101001001010100101010010110101001011212121212121212121212121010101010101010 10100110101010101010110010/0/0/0/0/0/0/././././.-.-.-,--,-,,-,-,-,+,+,+,+,++*++*++**+*)*)*)*)*)*)()()()()()()('('(('('('('(('('('('('('('('('('('(''('('((('('('('(('('('('('('('('(()()()*)*) *)**))*))*))*+*+*+*+,++,,+,+,+,,-,-,--,,--,-,-.-.-.-..-.-././../././0/00//00/0//0/0/0/01010101010010010101 011011010110121211212121221212121211221122121221212112121211212121101010101010100110100110100100110010101010/0/0/00//0/0/0/0/0/0/././/./././/../././.-.-.-.-.-,--,-,-,--,--,+,+,+,+,++,,+++*+*+*+*+*)* )*)*))**)*)*)()()()()('('('('('('('('('('('('('('(('(('('(('('('('('('('('('(('('('('('('('(('('('('('()()(()())()*)*)*)*)*)*)*)*)*+**+**+*+*+**+*+,+,++,+,+,+,,-,-,-,-.--.-.-.-.-./././..//././././0/0/0/0//0/0/0/0/0101010101010101010101212211221212121212121121212121121212121212121212121221212121122121101010101010/0/0/0/0/./././..//.//././.-.-.-.-.-..-,-,-,--,-,-,,--,+,++*+*+*+*)*)*)*)*)*)*)()()(()()()()('(('(('('('('('('('('( '(('('(('('('('('('((''(('('('('('(('('('('('('(('('(('('('('('('('('('('((()()*)*)*)*)*)**)*+*+*+**+*+,+,+,+,+,-,, -,,-,,-,,-,-,-,- .--..-.--.-.-./..//../././..//.././../0/0/0//00/0//0/0/010 10011011010010101010121212121212121212121 2121121211212121212212121212121221121121122112212121122121212121011010101010100101010110/0 /0/00//00/0/0/0/0// .//.././/./././/./.-.-.-..--..-.-,-,-,-,-,-,+, +,+,++,+,,+++,,+*+*+*+*++*+*)**)*)**))*)*)()()()()()(()('((('('('('('('('(('('('('('('('(''('('('('('('(('('('('('('('('('('('('()()()*)*)*)*+*+*+*+*+*+,+,++,+,+,-,-,,-,-,-,- .--..--.-..-. -.-.--..--./././././././0/0/0/0//0/00/0/0/0101010101011010101010121212121 212212212211211212212121211212121212121212121212122121212121122121212121101010101010101010/0/00/0/0 /00//0//0//0//././/././.-.-.-.-..-.- ,-,--,--,-,-,-,+,+,,+,++,+,+*+*++*+*+*)*)*))**)*)**)*)()())()()('(('(('('(('('('('('('('('('('(('(('('('('('('('(('('('('('('('('(('('('(()()()*))**)*)*+*+*+*+*++*+*+,+,,+,+,+,+,+,,+,,+,-,-,--,-,-,-.-.-.-.-.-././. /./../.././././0/ 0//0//0/00/0/0//0/00/0101010101011010101010121212121211211212121221212121212122121212121212121212121212121122122121221221122121212101010101010100101010/0/0/00/00/0/0/0//././././../.-.-.-..--.-.-,-,-,-,-,+,+,,+,,++,+*+*+*+*+*)**)*)*))**))*)*)**)*)()(()())()()('('('('('('(('('('('(('('('('('('('('('('('(('('('('('('(('('('('('('('('('('('('('('('('()()*)*)*))*)*))*)*+**+*+*+,+,+,,+,+,+,+,-,,-,,-,-.-.-..-.-././././././0/0/0/ 0//00//0//0/0/00/00/0101001011001011010101010121212121212121212121221122212212212122121212121212121 212122112112121221212121212122112112112112121212212121112121212101010101010010101010/0//0/0/0//./././././.././.-.-.-.-.-.-.--.-.-.-,--,-,-,-,+,+,+,+,++,,+,+*+*+*+*+*)*)* )*))**)*)**)*)()()()(()()('(('('('('('((''('('(('('('('('('('('('('('(('('('('(('('('('('('('('()()())()*)*)*)*+*+*+*+**+*+*+,+,++,+,-,-,-,,,-,-,-.-.--.-..-.-..--././././/.././0/0//0//0/00/0010101010101010121212121212121212121211212112122121212121212121221121212122121212212121212121211212112121221210101101010101010/0/00/0/0/0/0/0/0///././././././../../.-..--.-.-.-.-,-,-,-,--,-,-, +,+,+,+,+++ ,++,++,,++,+*+**+*++*+**+*+*)*)*)*)*)*)*)*)()()()()()()('(('('('('('('('('('('('('('('('('('('('('('('('(('('('('('('('('('('('('(('(()()()*)*)*)*))*)*)*)*)*)*)*+*+*+*+*+*+,+,++,+,++,+,-,-,--,-.-.-.-.-.-./././0/0//0//0/00/0/0/0/00 10011010110010100101010121121212121211212121212122112212212212212121212121212 122112122122121212122121 2121212112212121010101001101010/0/0/0/00/0/0// ././.././..//.-.-.-.-.-,-,-,-,-,+,+,+,,+,+,+,+,+*+*+*+*++*+* )*))*))*)**)*)*)*)()()()()(()(('('('('(('('('('('('('('('('('('('('('('('('('('(('('('(('('((('(''('('('('('('('('()*)*)*)*)*)*)*+*+*+*+,+,+,+,+,+,+,,-,,-,,-,-,-,-,-.-.-..-.-.-././././././0//00//0/0/0/0/001001010101010101012121212212121221212121221212121221212212212112121212121221211221212121212211221121212210101101010101010/0/0/0/0/0/0/././././.-.-.-..-..-.-,-,-,-,-,,-,+,,+,,+,,+,+*+*+*+*+*)*)*)**)*)*)*)()()(()( )()()(()())('('('('(('(('('('('('('(('('('('('('('('('('('('('('('('('('('('('('('('()*)*)*)*)*)*+*+*+*+,++,++,+,+,-,-,-,-,-,-.-.-.-.-./././././../././0/0/0/0/0/00 10010100110010101001001010121211212112121121211212112121212232323232323212121121211221211212121212121212101010101010011010/0/0/0/0/00/00/00/./././././../.-.-.-.--.-.-,-,- ,--,,-,,--,-,+ ,+,,+,+,++,,+,+*+*+*+*+*)*)*))*)*)*)()()()())()()()('(('('('('('('(('('('('('('('('('(''('(('('(('('('('('('(''('('('(('(('('('('('('()*)*)**)*))*)*)*)*+*+*++*+*+*+*+*+,+,+,+,+,-,,--,-,--,-.- .--.-..--.-.-./. /././..//.//.././0/0/0/0/010010010101101010110121212121221211212121121212122323223232232332323232 32233223232322321212122121212121212112121212101010100101001010/0/0/00/00/00//0/0/./. /./././././././.-.-.-.-.-,-,-,-,-,-,+,+,+,++,+,+,+,+*+*+*+*+*+*)**)*)*)*)*)()()()()()(()(('('('('('(''('('('('('(('('('('('('('(('('('('('('('('('('('()*)*)*)*+*+*+*+*+,+,+,++,,+,+,-,,-,,-,-,-,-,-,,-.-.--.-.-./. /././/./../0/0/0//0/0/0/0/010 101001001100101012112112212112122121212232323232323232323223232323232323232122121212121121212121212212121210101010101010110/0/0/0/0/./././/./.-..-.--.-.-.-,-,-,-,-,-,,+,,+,,+*+*+**+*+*+*)*)*)*)*)())()()()()(('('('('(('('(('(('('('('('('('('('('('(('('('('('('('('('('('()*)*)*)*+*+*+*+*+*+,+,++,,+,+,+, -,--,,--,-,--.-.-.-./..//././0//0/0/ 0/0/0/0/0/0/0101000101001010011012122121212112112121212 12212212122123232323223233232323232322332233232332322332233232322323232322121221212121122122112121212101010110010101010/0/00//0/0/0/.//./../././.-..-.-.-..-..-,-,-,-,-,-,,+,+,+,+*+* +*++*+*+**+*)**)*)*)*)())()()())()(('('('('('('('('('('('(('('('('('('('('('(('(''('('(('('('('('('('('('('('()*)*)*)**)*)*+*+*++**+,+,+,++,+,+,-,-,-,--,,-,,-,--.-.-.-.-..-. /../../.././././/./0//0//0/0/0/0/0/0/010101011010101212121212121212121212212323322332323232323232232323232232323232323232332233232332323233232323232323232232321212121212121010101010 /0/0//00/00/0/0/0/. /./..//././.-.-.-..-.-.--..-,-,,+,+,+*+*++*+*+*++*++*)*)*)*)*)*)()()()()()()((('('('('('('('('( '(('('(('('('('('('('(('('('('('('('('('(('('('('('('('('(('('('('('('('('('(''('()*)*)*)*)*)*+*+*+*+*+,+,+,+,+,+,,+,-,,-,,-,-,--,,-,,-- .--.-.-.--..-.-.-.-././/./././/./0/0/0/0/0/0100100101001001100101012121211212121212121212323232233232323232323232 32323323223232323233232232323232322332232322332323232232323322323212212121212121221212101010101 01001100110/00/00/0/00/0/0/./././/..//./.-.-.-.-.-.-,- ,-,-,,-,--,-,,+,+,+,+,+,+*+*+*+**+**+*)*)**))*)()()()()())(('('('('('('('(('('('('('('('('(('('('('(('('('('('('('()*))*)*)*)*+*+*+,+,+,+,+,-,-,-,-,-,-,--.-.-.-.-..-./././././0//00/0/0/0/0101010110010101212121221212121232323232 323323323322323323 232233223232323232323232323232323232232323232323233222321212121212112121210110101 01001001001010100/0/00//0/0/0/0/0/0/.//./././/././. -.-..-..-.-.-.-,-,--,-,-,,,+,++,+,,+,+,+*+*+*+*)*)*))*)*)*)**)*)()())()(())(('(('('('('('('('('('('(('('('('('('('('('('('(('('('('('('('('('('(('('('()*)*)*)*)*+**+*++**+*+*+,+,+,-,-,-,--,-,-,--.-.-./.././././/././0//0/0/0/0/00/0/0100100101010101010121212121221221212122123232322322323232323232323323232323232323232323323323233233232323223222323212212212121221212121210101101101010100100/0/0/0//0/0/./ .//.././/../.-.-.-.-.-,-,--,--,-,,+,+,++,+,+*+*+*+*+*+*)*) *))*))*))*)**) ()()()()())()()())((('('('(('('('('('(('('('('('('('('('('('(('('('('('(('('('(' *))*))*)*))*)*)*+*+*+*+,+,+,+,+,+,+,-, -,--,-,--,-,-.-.--.-.-.-././././0/0/0/00/0/0/00//010 101011001010121212121211212123232323232323232323233223233233232332323232323 232323323322323233232323233223223232323232322322323232121212121121212121010100101010100/0/0/0/0/0/0/0/././././././.././././.-.-.-.-,-,-,-,-,,--,,,-,+,+,+,+*+*++*+**+**+*+*)*)**)*)*)**)*)*)()())()(()(())('('('((''('('('('('('('('('('('('('('('(('('('('('(''('('('('('()*)*)**)**))*+**++*+*+,+,+,+,+,+,-,-,-,-,,-,-.-..--.-.-././.././././0/0/0/0/0//010101010101212121211212121212323232323232323232322323223232323332232323232332323232323232323 232233223323232323323232323232121221212212121121010101 0101010101100100110/0/00/0/0/0/0//0/.//../././././.-.-.-.-..-.-.-,-,-,-,-,-,,-,,--,+,+,+*+*+*+*+*)*)*)*))*)*)())()()()()(('('('('('('('('(('('('('('('('('(('('('('('('(('(''('('('('((*)*))*)*)*))*)*)*)*+*+*+**+*+*+*+,+,+,+,+,+,-,-,-,-,-.-.-- -..-..--..-././././.././0/00//0/00/0/0/01001010101010112121212121212121232323223232232323232323322332332332332323234343232323323232323232322323232322332323232323232121212121210101011010101010110010 /0//0/0//00/0/././..//./.-.-.-.-.-,-,--,,-,-,,,-,-,+,+,+,+,+,+*+*+*+*+**+*+*)*)*)**))*)*)() ()())()(()(())()()('('(('('('('('('('('('(('('(('('('('('(('('('('('('('(('('('('('('('('('('('('()*)*)*)**)*)*+**+*+*+*+,+,+ ,+,+,+,+,,+,,+, -,-,--,-,,-,-.--.-.-..-.-./../././/../0/0/0/0/0/0/010101 011011010110112121212121212123232232323232332323232332323232332323323232233434343434323232323232332323232332232323232323212121212112112121010101010100110/0/0/./././/././.-.-.-.--.-,-,--,-,-,+,+,+,+,+*+*+*++*+*+*+*)*)**)*)*)()()()())(()('('('(('(('('('('('('(('('('('('('('('('('('('('('('(('('('('('('('(('('(('('('('('(('()*)*)*+*+*+*+*++*+ ,++,,++,,+,+,+,-,-,,-,-,-,-.-.-.-.---.-.-./././././0/ 0//00/0/0/0/0/010101010100101011212121211212121221232323223232232322323232334343434343434343434343432323232323223232232323232323212121221211221121121212101011001010/0/0/0/0//00//0/././/././/./../.-. -..--.--..-.-,-,,-,-,,-,-,-,-,+,+,,+,+,+*+*+*+*)**)*)*)*))*)*)()()())()((()('('('('(('('('('('('('('('(''('(('((''('('('('('('('('('('('('(('('('('()*)*)*)*)*+*+*+*+*+,+,+,+,-,,-,,-,-,-.-.-..-.-./..//./././/.//./0//0//0/0/00/0/0//0/010101011010112122121221121221123232332322323232232323233434334343434344343434343434343433434343434323232323232232323232322332321212112121121212121010110111010101010/0/0/0/0/0/0/0/./././.-.-.-.-.-.-,-,-,-,,-,-,-,-,+,+,+,+,+*+*+*+*)*))*)*)*)*)*)()()())()('('('(''('('('('('('((('('('((''('(('('('('('('('(('(('('('('('('('('('('('('(*)*)*)*+*+*+**+*+,++,+,+,,++,++,,+,+, -,,-,,-,-,,-.--.-.-..-.-. /./././/./.././0/0/0//0/0101010101012112211212121232232233232232332323234343433434343434343443433434344343434343434343434343434343434343232323 2323233223232323232322323212121212121212121010110001010 /0/00//0/0/0/ .//./../../././.-.-.-.-.-,--,,-,+,+,++,+,+,+*+*+*+*+*)*)*)*)*))**) ())()(()()()()()()()()('('('('((('('('('('('('('(('(('('(('(('('('('(('(('('('('('('('(('('('('('()*)*+*+* +*++**+**+**+,+,++,,+,-,,--,-,-.--.--.-.-..-./.././.././0/0/0/0/010101010101012121211212123233233232232322322323232323 2332332323323434343434343443434343434343434434334433443434344343433434343434332323232323232323212211212121211212101010/0/0/0/.//./././/.-.-.-.-.-.-,-,-,-,+,+ ,+,,+,+,++,+*+ *++*++*++**+*)*)*)*))*)*)*)**)()()()()(()('('('('('('('('('('('('('('('('('('('('(('('('('('(('('('(('('('((''(*)*)*+*+*+*+*+*+*+,++,++,+,+,++,+,-,-,,-,-,-.-.-.-.-././././0/0//00//0/0//00/010101010101 0101010110110012121212323232323223232323232332343443344343433343434344343343434343434343434343443434343443434 343343343343433232332323232323232321212121212121211210101 101100110100101010010/0/00/0/0/./././/././/.//.-.--,-,-,+,,+,+,,+,+,++,,+*+*++*+*+*)*)**)*)*)()()())()()('('('('( '(('('(('('('('('('('(('('('('('(('('('('(('('('('('(('('('('('('('('('('('()*)*+*+* +**+*++*++*+*+,++,+,+,-,-,-,-,-.--.-.-..--.-././.././0/0/0/00//0/00//010011010 1001011010101101212112112212121221221232232323232323232343434334434343443434434343434343343434343434343434343434343434343434344334343334343233233232323232121212212121210110101001010/0/0/0/0/0/0/././././././.-. -.-.--.-..-.-,---,-,-,-,-,-,-,+,+,+,+,+,++,++,+*+*+*)*)*)*)())(()(()()('('('('('(('('('('('('('('('('('('('('('('('((('('('('('('('('('('(*)*)*+*+*+*+,+,+,+,-,-,-,-,-.-.-.-.-..-.././././0/0/00/0/0/0/01010101011001212212123232332323232323234343434343443443443443343434 34334433434343434343434343434343434343434343434334343432323232323232232121211221212121211010 101011001101010100//0/0/00/0/00//0/0//00/0/././././.././.-.-..-.-.-,-,,-,--,-,-,+,+,+,+,+*+*+**+*+*+*)*)*)*)**)*))**)()))()(()(()('('('('('('('('(('('('('('('('('('('(('('(('('('('('('('(('((*+*+*+*+*+*+*+,+,+,+,,+,+,+,+,-,--,-,-,-,-,-.-.--..-.-..-..-.-..--..././././././.././0/0/0/0/01010010101011012121221212123232323233233232323323434343343343434343434343434343434343434344344343 43443443343434343434323233232323232322332323212121212112211010100101010/0/00/0/./ ./././..//.-.-..-..-.--,-,-,,-,-,+,+,+,++,+,++,+ *++*+**+**+*+*)*)*)*)*)()(()))()())()()('(('('('('('(('('('('('('('('('('(('('('('('('((*)*+*+*+*+*+,+,+,-,-,-,-,-,-,-.--.-.-.-.--../././././././/./0//00/0/0/00/0 101001010101011012121212121232323232323233223323434343434343434343443343443443443443434343434343434343434343434334343434343343232332332 323232232232322323212121212121122121211010100101010/0/0/0/0/0//0/0/0/0/0/0/./././.-.-.-.-.--..-.--,-,-,-,+,+,++,+,+,+* +*+*++*+*+*++*+*+*+*)*)*)*)*)()()()(())('('((''('('('(('('(('('('('('('('('(('(('('('('('('('('( '(('('(('('('('('('('()*+*+*+**+,+,+,+,++,+,+,+,-,-,,-,-.-.-.-.-.-./././././/././././0/0/0/00/01010101001010101212121212123223232323232343434343434343 43343434434334343443454343343434434343434343434343432323232323232121212122112121211010101011010/0/0/0/0/0/0/././/././.-.-.-.-.-.--.--..--,-,+,++,+,+,+*+*+*+*)*)**))(()()('('('('('('('(('('('('(('(('('('('('('('('('('('(('('('('('('('('(('('('*+**+*+*+*+*+**+,+,+,+,-,,-,-,,-,-.--..--.-../././0/0/0/0101010110100101212121212121212232323232323232343434334343343434343434 3443443443445454545454544544545434343433433434343434343434343434343432323223232232323212 1211212121221211 0101001101010/0/0//00/0/0/./././.-.-.-.-.-.-.--,-,-,-,-,+,+,+,+,+*+*+*+*)**)*)*))())()()()(()()('('('('('('('('('(('('('('('('('('('('('('(('('(('((''('('('('('('('('('(*+*+**+*+*+*+*+,+,+,+,-,-,-,-,-.--.--.-.-././../././0/0/0/0101010101010121212112121223232323232332323234343434344343434 3443434343443434454545445454545454544545445454343434343434343 43434434343434343432323223223232321212121212121210101010101010/00/0/0/0/././././..//.-..-..-.-,-,-,-,-,+, +,+,++,+,+,+*+**++*+*+*+*)*)*)*)*)*))()()(()('(('(('('('('('('('(('(('('('(('('('('('('('('('(('('('('('('(('('('('('('('('('('(*+**++*+*+,+,+,+,+,-,,-,,-.-.--.-.-.-.-../../././../0/0/0/0100101010101010121 2112121221212322332232322323232232343433434334343343434545454445445454545454454545454545454545454545454545454344343443433434343434343343 23323322322323232232323212121212121212101 011010011011010/0/00/0/0/0//0/./././/./.- .-..-.-.--..-.-,-,--,-,+,+,+,+,+,+*+*+*+*++*+*+*)*)*)*)*))()()('('('('('('('('(''('(('('('(''('('(('('('('((''('('(('('('('('('('(*+*+*+*++*+,+,+,+,+,+,-,-,-,-.-.-./././././0/0//0/0/01010101012121212122112121212123233232323322323234343443433434343343434345454544545454545454544545454545545454544545454 545544545545454454544343434 344343434434334343434323 233232332232323232121212121221210101010101010/0/0/0/0/./././././.-.-.-.--.-.-.-,-,,-,-,+,,+,+,+,+*+*+**+*+*)*)*))*)*)*))()()()()(()()('('(''('('('('('('('(('('('('('('('('('('('('('('('(('(('('('('('('('('(*+* +*+*++*++*+*+,+,+,+,+,-,-,-,,--,-.-.-.-.-..-././../././0/0/0//00/0/0101010010010121221211212121232233223232323232332234334334434344343434545454545454544554545454554545545454545545454545454544544545454545454545454545443434343434343343343432323232323232121212121210101001010 /00/00/0//0/0/0/0/././././.-..--.--,-,-,,-,-,+,+,+,+,+*+*+*+*+*)*)*)*)*)*))()(())())()(()()()('('('('(('('('('(''('('('('('('('('(('('('('('('('('(*+*+*+*++*+,+,+,+,+,+,-,-,,--,-,-,-.-.-.-.-..--..-./././/.//.././/./0/0/0/010101 2122122121212322332322323234344343343433434343434 3443443434434545454545454554545454554554545454545455454545455454 5445454454545454544545455454454544343434433434343432323232323223232321212112121211212121010101010/0/00/0/0/././/./..//.-.--.-.-,-, -,--,-,-,,-,+,+,,+,++,,+,+*+*+*+*+*+*+*)*)*)**)*)*)*))()())()())()('('('('('('('('(('('('('('('(('((''('('('('('('('('('('('('(* +*++*+*+*+*+*++*+,+,+,,++,,+,-, -,-,,-,,-,-,-.-.-.-..--././/./0//0/0/0/01010 1001100100110121 2112122112121232323232323434343434334343434343443454554455454544554454545454554544545454545454545454545454545454 545545545454545445434343434343433434343432323232232332233223223212212121221210101101010/0/00//0/00/00/./.-.--.-,--,-,--,-,-,,--,+,+,+,+*+*+*++*+* )*)*)**))*)*)*)**))()() ())()(()())(()('('( '(('('(('('('('('('('(('('(('('(('('('('('('('('('('('('('('(('(('('(('('('('('('('('('('(* +**+*+*++*+*+*+,+,+,,+,-,,-,--,-,-,-.--.--.-..-. /../../././..//./ 0//00/0//0/01 0110010101001 21121221212122123232232223232232343434343443434343454545445545454545455454545454545454545454545455455454554454545455545434334343434344343233232323232323232121212112121010101101010/0/0/0/0/0/././././/.//././/./.-.-.--.-.-,-,-,-,-,-, +,,+,,+,,+,+,,+*+*+*+*)*)*)*)*))())()()())()()('('('('('(('('('('('('(''('('('('('(('(('('('('(('('('('(('('('('('('('('('(+**+*+*+*+*+,+,++,-,-,-,-,-.-.-.-.-.-.-./././././/./0//0/0//0/0/0//00/0101010101212121212323232332232343434434343434343454545454545 4554554454454545545545545454545454545454545454545 45445445444545545434434334434343432323232323212211221212212121212101010101101010/ 0/0//0/0/00/0/.//././././.-.-.-.-.-,-,-,-,-,+, +,+,++,+,++,,+,+*+*+*+*+*)*)**)*))*) ()())())()())('('('('('(('('('('('('('('(('('('('(('('('('('('('('('(*+**++*+*+,++,,+,+,+,-,-,-,-.-.-.-..-././.././0/0/0/0/0101 0110100100121121212212112322332323232232343434343 4344343443344345454545445445454545454545455545454545454545454554545454455434343343434343434432323232323 232232322321 2122121221212121212101011010010/0/0/00/././.-...-.-.-,--,--,,--,-,,-,-,+,++,++,+*+*)*)*)*))()()())(()()('(('('('('('(('('('('('('('(('('('(('('('('('('('('('*+*+*+*+,+,+,++,+,-,-,-,-,-,-,-.-.-..-.-./././././0/00/0/01010110121212211212323232323233234343434343 434433443345454545454545454545455454556565654545454545454455455454 54554455445445454343433434 34334343343443232323232212121010101001011001010101010/0/0/./././..//./.-..-.-.-,-,-,,-,-,+,+,+,,+,+,+,,++,+*+*+*+*+*)*)*)*))()()(()(()('('((''('('('('(('('('('('('('('('('('('('(('('('('(('('('('('(*++*+*++*+*+,++,+,+,-,-,-,-,-.-.-.-.--./././/0/0/0/0/00//010110101010101 212112112121212122123232323232232323343343434343454545454545454 5445454554544545565656556565 6556556556565654545454544545454545454545434343434343343432323233232121212121212101010101010/0/00/0/00/0/./././. /../..//../..-.-.-,-,,-,-,-,+, +,+,,+,++,+,+*+*)*)*)**)*))*)*))*)())(())()()()()('('('('('(('('('('('('(('('('('(('(('('('('('('('(('((+*+*+*+*+*+,+,++,+,+,+,-,-,-,-,-.-.-.-.-././.././/0//0/0/01010101012112212121221121123232322332233434343433443443434545454454544545454545454554556565656565656565656656656565656565454545554545454545455445545544545454343433443434343233232322121212101 01001101010/0/0/0/./././././..-.-.-.-,-,-,-,-,+,+,+,+*+*++**+*)*)*)*))*)*) ()())(()(())()('('('('('('('('('('('('('('('('(('(('('('('('(('((''('(('(('('('('('('(*+*+,+,+,+,+,-,-, -,-,-,-,--,--,- .-.-..-.--.-./././././/0/00/0/0/0101001010121212121212123232232323232334343434344343434343454545455454545 4554545454554565566565655565656565565 6565565566565566565665665565565566556656565565655454545454554545454545445434343433434323232323232323223323212121212210101010/0/0/0/.//.//./..-.-.-.-.-,- ,-,-,,-,-,-, +,+,++,,+,,+,+,+*+ *++*+*++*++*+*)*)*))()()(()()()('('('('('('('('('('('('('(('('('('('('('('('('('('('('('('('(+*+*++*+,+,+,,+, -,,--,,--,-,-,-.-..-.-.-./ ././..//..//0/0/0/0/010101001101212123232323233434343343434345454454544545445456565656556656565656565656565656565656556565656565656565656554544545454545455454554545434334343443434343 23223322323232321211212121211210110101010100110/0/0/.//.//././..//./..-..-.-, -,,-,-,-,-,-,+,+,+,+,,+,+,+*++*+*+*+*+*)*)**)()())()()(()()(()('('('('('('('(''('('('('('('('('('('('('(('('('((('('('('((''('('('((+**+*+,+,+,-,-,-,-.--.--.-.-./././0//0/0/0/0/010101001101211221212211232323232323234334434 344334334434545455454454545445454545656565655656565656565656556565566565656565656565656566565665566565565656565656556545454454545454454545454343434344343434343232323232121212122121010110101010/0/0/0/0/0/././. /.//././.../.-.-.-.-,--,-,-,-,+,+,+,++,+*++**+**++*+**+**+*)*)*)**))*)*)() ()(()(()())()('('(''('('('('('('('('('('('('('('('('('('('('('('(('('('('('('(+*+*+,+,+,+,+,-,,-,-,--,,-,,--,-,- .--.-..-..-./../././0//0/0/01010010 1010110100121212112123232232323234343434343434345445445545455454545656565656565 6565566565656656656656566565656566565656 5665656566565656565656565656565 6566556655656565454554454544545454554343434343343343432323323232121212112210101010100110 /0//0/0/00/0/.//..-.-.--.-.-,-,-,-,+,+,+,+*+*++**+*+*+*)*))*)*)*)())()()()('('('('('(('('('('('('('('('('('(''('('(('('('('(('('('('('('('('('(('((+,++,++,+,+,-,-,-.--.-./../././../0/0/0/0/0100110121121121212323232323434334334434434345445454454544545454554545455455454565656565656566565665656565656565656565656565665656656655656565655656565656556566565654545454545454545454343434343434323323233232323212122121210101101011010 /00//0/0//0/0/0/././././../.-.- .-..-.-.--.-,-,--,-,,--,-,+,+,+,+,+,+,+*+**+*+*)**)*)*)*)())(()())()('('('('('('('(('(('('('('('('('('('(('('('('('('('(('('('('('(''(('(*+,+,+,+,+,-,,-,-,--,-,-,-.-.--.-.-./../././0/0/0/0/00/0/0100100100101001010121212112212121232323232323234343343434343454545454454545454545545656565665566565655665565656565656565656565656565656656565656565656556545454545454454543434344334343432333232323232121211210101100101010/0/0/0/././.-.-..-.-.--..-,-,-,-,+,+,+,+,+*+*+*+*++*)*) *)*)*))**)*)()()()()(()()('('(('('('('('('('('('('('('(('('('('('('(('('('(('('('('('('('('('(+,+,+,,++,,++,+,-,,-,-,-.-.-.-.-./../././0/0//0//0/0//0/010101010121212121122112123223323223232343433434343434545454545454565656656656565656566566556565656656565656565656565656656556565565656545545455454545455445545434343434344343443432332332323232121221212212101010101101010/0/0/00/0/0/././/././.-.-.-.-.-.-,- ,--,--,-,--,+,+,+,,+,++,+*+*+*+*)*)*)*)*)*)()() ()(())(()()('('('('('(('('('('('('('(''('('('('('('(('('('('('('('('('('('('(+,+,+,+,-,-,-.-.-./././/..//./0/0010101212121212123232232323232343434434434345454545454545454545656565665656 5665665565565656676767676565665656565656565565655665454545545445434343434344332323232121221212101010101010/0/0/0/0/././/./../.-.-.-.-.-,- ,-,-,,-,-,,--,+,+,++,+,+ *+*++*+*+*+*+*)**)*)*))*))*)()()()('('('('('(('(('('('('('('('(('('('('('('('('(('('('('((+,+,+,+,+,,+,-,-,--,,-,-,-,-.-..-.-.-.-.-./. /..//././/./0/0/01001010101101 212112112121212323232232232343433434334343343443454545454 545545455445545656565 65565665656656565656565667676676767676767676767676767656656565656565656545455454545545434343433232323232121121122121010101001010/0/0/0/././/..//.-.-.--.-.--.-,-,,-,,-,+,+,+,,+*+*+*+**+*)**)*))*)*)*)*)()()()()()()('('('('(('('('('('('('('('('(('('('('('('('(('('('('('('('('('('('('('('('('((+,+,+,+,-,-,-,-.-.-.-.-.-./../././././0/0 /0//00/0/00//01010101212112123232233223323434344334343434545454 54554455445656565656565656565676676767676767667767676676767665565665656565655656545544545454545434343343 43343443433323232323212212212121122121010101010/0/0/0/.//./.-.--.-.-,-,-,--,-,-,,-,,-,+,+,+,+,+ *++**++*++*+*)*))**)*)*)()()())(())('((''('('('('('(('('('('('('('('('('('('('('(('('('('('('('('('(+,+,+,+,,+,-,-,-.-.-.-././././././0/0/00/01010010121211212123232323323434343343434454545456565656565656565565665656766676676767676767676767667676766766767676766767667667676767667676566565656565656 56556656556565654545445454554543443434332323322321212122121010010101010/0/ 0//0//00//0//./.././/.-.-.-.-,- ,-,--,-,,-,-,+,+,+*+*+*+*+**)*)*)()()('('('('('('(('('('('('('('('('('('('(('('('('('('('('('('('('(('(+,+,+,+,+,++,-,-,-,-,-.--.-.--.-. /..//..//././0/0/0/0/0010101010121212323223223234343343434454545445545545456565655656556565656565656766766767676767676776767676767767676776767676776766767676767665656565656656565566565454544544554455445445434343434334323232332323212121212101010/0/0/0/0//0/./././.-.-.-.-.-,-,-,-,,-,-,+,+,,++,+*+*+*++**+*+**)*)**)*)**)())()()()(()('('('('('(('('('('('('('('('('('(('('('(('('('(''('('('('('('('('('('('+,,+,+,++,++,-,-,-,-,-.-.-.-.-././././0/0/0/0/0010101100121212121232323232343434344343434544454 5445545545454545454565656566565656656567676677676767676776676676766776767667676676776766767676776776676676767676767667677676766767667676766565665656566565 65566556656545544545454543434332323232321212121211212101010101010/0/0//././././.-. -.-.--.-.-.- ,-,-,,--,-,-,+, +,++,+,,++,+*+**)*)*)*))*))*)()()()('('('('('('(('('('('('('('('('('('('(('('('('('('('('('(+,+,+,+,-,--,-,-.--.-././../././/././/./0/0/0/0/00101010121212121212123232323234343454454544545454565655656556565676767676767767676767676767 67766776767 67767766767676767 677676776676767676767676767676776766676565656565656556656545454545545454343434344343343434323232121212212210101010/0/0/0/0/0//0//./././.-.-.-.-.-.-,-,-,-,--,-,+,,+,+,+,++,+,+*+*+*+*++**)*)*))**)*)*)()( )(()(()(()()('('('(''('('('(('('(('('('('('('('(('('('(('(('('('('('('(+,+,+,,+,+,-,-,-,-.-.-./././../0/0/0/0/0010011010101101101 211211221121212323232343434343454544 54455445445445656566565565656556565656767676767676676766767676767676766767676767676676767767 6767767667767677676767767667767667666765665656565656565 455454545445454554545434334343432323233223321212121210101010/0/0/0//./././././.-..-.-.-.-,-,-,-, +,,++,++,,+,+,+*+*+*+**)*)**)*)**)*)*)()()( )(())(()()('('('('('('('('('('('('('('('(('('('('('('('('('('('(+,+,,+,+,+,-,-,-.-.-.--..-./././0/0/0/00/0/0/01 010101101001012121211232323223232343434343454545454545456556556565665656767667767676767667677677677676767767676767676776767676767676767676767676767676767676767667676766766765656565656545454554543444343232322323232321212212212101001010110010010010/00//0/0//./../././.-.-.-,-,-,-,+,+,+,+*+*+*+**+**)*)*) ()(()()(())()('('('('('(('('(('(('('('('('('('('('('('(('('('('('('('('('('('(+,+,+,,++,++,-,-,-,-,-.-.--..-.-.-././././././/./0/0100100101211221212212322323232323234343434345 4544544554554545656556565565656565656656656767676767667667677676767676767676767676767676767767 67667767667767667676676767656566556565656565654545445454545544544334432323232322323223212122121212121210101010/0/0/0//./. /.//././../.-.-..-.--..-.-,-,-,-,-,-,-,+,+,++,+,+*+*+**+*+**)**)*)**)()()()('('('('('('('('(('('('('('('('('('(('(''('('('('('('('('('('('('('(+,+,+,-,-,-,,-,-.-.--.--.-.-. /..//..//./././0/0/0101010121212112322322323232343 4343434334334345454554545545456565656556565656565665676766767677667 6766776776767677678787878767767676767677767676765656565654545454545434434343232322332322323232321211212121 01010011010/0/0/0/./././/.//.-.-..-.-.-,-,-,-,+,++,+,+,+,,+ *++*+*+**+*+**+*)**))*)*)*))*)())()())()(()(())('('('('('(('('('('('('('('('(('('('('('('('('(('('('('('('('('('(''('(+,+,+,+,-,-,-.--.-..-.-.-./../.././ 0//0//0//0/0/0100100101212121221212323232323434343434545454554565656565656567676 767677677676767676776776677878787878787878787876776767677767676676767677676 5656655665656565656545 4554454554545454434343433434323232321212121121010110/0/0/00//0/./././../../. -..-..-..-.-..-,-,-,--,-,,-,+,+,+,+*++*+*+**+* )**)*)**))*))*)()()())()()('('('(('('('('('('('('('(('('('(('('('('('('('('('+,+,-,-,-,-,-.-.-.-.-./././././0/0/0/010101011012121221212121232233232323234343434343345454554545445554565656565656565656567676767767676767878787878787887878 787887878877878788787877887878767676767676767676565665656 566556556556545454554544343434344323233232121212121210101011010/00/0/0/0//./././. -.-.--.-.--..-,-,-,,-, +,,+,+,,+,+,+,+,+ *++*++*+**+*+***+*)*)*)*)*)( )())(()(())('('('('(('('('('('('('('('('(('('('('('('('('('(('('('('(,-,-,-.-.-./..//./././/./0/0/0/010100101010010121121 21211212212322323232343 4334334344343454544545445454454545565656565 656656566556656767676 76676776767767676767877878788788787878778787878878787877887887878878877878787677767676767677676767656565665665656656565454544343434344343232323212112121011010/0/0/00/./././../.-.--.--.-,-,-,-,--,+,+,+,+,++,+*+*+**+**+*+*)**)*)*)*)()())()()('('('(('('('('('('('('('('(('('('('('(('('('('(,+,++,-,,-,,--,-.-.-.-.-./././0/0//0/010101010101012112212123232323232343434343434454545455445455656565 6566556655676767676767676787878778787788787878787878787878788778778778778787878878787878787878776767676766767676765655656565454545454545443443343434343432322332332321211211210101010/00/0/././/././.-.-.-..-.-.-..--.-,-,-,-,-, +,,++,++,,+*+*+*+**+**+*)*)*)*)()())()()('('('('('(('('('('('('('('('('('(('('('('('(''('('('('('('(,+,-,-,-,-.-.-.-./. /..//././../0//0/0/0/0101010101101212121221232323232234343343434545454556565656567676767676767676676787878787878787878787 87787878878787887877878778787878877877878787878878776767767676767676566565656565656565454545445454454343443343434323323232121212121010100110110/00 /00/0//0/0/./././. -.-..-.--.-.-,-,-,+,+,+,+,+,+*+**++**)*)*)**)()()('('('('('('('(('('('('('('('('(('('('('('('(('(''('('('('('+, +,,-,,-,,--,-,-.-.-.-.-././.././././0/0/0101011011212323232343343443434544545545454556565665656567676766767667676767678787878787878878 8778787877878787878787878787878787877887787787887878787878787878787788788778778767676767676565656656565 454544545445543434343233232323212122121210110010110010/0/0/00/0/././././../.-.-.-.-.-,-,--,+,+,,+,+,+*+*+**+*+*++*)*)**)*)()()()(()()('('('('('('(('('('('('(('('('('('('('('('('('('('('('('('('('('(+,+,-,-,-,,-,-.- .-.-.-.-..-..-./././.././0/00/0/0/01010112121121232323232323434343434545455454545456565 6556656565565656567676767766767676776767878787887878787 878788778788878787877878787878787878778787878787787 8788787788787878787887788778787887877878767767676676767667667676565656565654545454544343434343 2322323223232332121121212121010011010100//0/0/0/./././/././. -.-.--..-.-.-,- ,-,,-,--,,-,+,+,,++,+*+*++*+*+*)*)*)*)*)*))*)()()()('('('('('('('('('('('('('('('('('('(('('('('('('(('('(('('('('('(('(,-,-,,-,,-.--.--.-.-./././/././0/0/0/01010100112121232323232343434343454545656556556565656567676767667676787878787878 7878878787887878787878878787878787878778788788787787878787878778887878787876767677676677667667676765656565656656545454545454343434323232232332121221212112101010100100/0/0/0/./././././.-.-.-.-..-.-,--,-,-,-,,-,-,+,+,+,+*++**+**+*+**+*)**)*)*))*))*)()())()('('('('('(('((''('('('('('('('('('('('('(('('('('('(,-,-,-,-.--..-./../../././0/0/0/0/010110100101121211212323223232322323434343454545656556656556556656767677676676767667676787878787877877878787877878788878878787878788787878878787878787877877878787787788767676676766767676765656566565656545454545454545454 344334433433443432322323232321212121221212101011001010/0/0/0/0/./.-.-.-.- ,--,,-,,--,-,+,+,,++,+,+*+*+** +**+**+*++**++*)*)**)*)()()())()('('('('('('(('('((''('(('('('('('('('(('('(('('('('('('('('('('('('(,-,-,-,-.-.-.-.-././/.//./0/0//0/0//01010101211 2121122121123223234343434343454545656565656565567667667676776767667877878778787787878787787878878787887898987878787878 787877877878887878787877878767676767676767676565656656656545454343433443434323232232323232121212121011010100/0/0/0/./././.-.-.-.-,-,-,+,+,+,+*++*+*+*+*+*)**))*)()())()()('('('('(('('('('('('('(('(('('(('(('('('('(('('('('('('('('(('('('('('(,-,-,-,-,-,-.-.-./.././0/0/0/01011001010122121212323232343 43434343434345454545545656556656656566567676676767676767767677677678778778878787878787878787889898989889898989878787878787878787876776676767676676765656545545445454543443443434344344323232322322321212101010100100/0/0/0//0/.//.//.//./.-.-.-.-.-.-,-,-,,--,-,+,+,++,+*+*+*+*+*+*)*)*))*)*)*)())()(()()('('('('('('('(('('('('('('('('('(('('('('('(('('('(('('('((''(,-,-,-.-.-..-.-.-./././/././0//0/01010121121212323232233234343434343434345445454545454565656565656767676766767676767678787788787787887787878788989889989889989898988989898989898898987787887878787878787876767676767676676 5656656656656565656556554 54544554545543434343434343232323232 1212212212121010100/0/0/00/././/././.-.-.-.-,-,,-,-,-,-,+, +,,+,+,++,+,+*+*++*++**+*)*)*)*)*)() ()())()(())()('('('('(('('('('('(('('('('(('('('('('('(('('('('('('('('('('('(,-,-,,-,-.-.-./././././0//0/0 10010101001101012112212112123223223233223433443434334345445454545456565656566676767676767678787878787878789889898989898998 98899889989898899898989889898998989898788 7887887877878778778787677676767656565656545454554455454343434343232322332 12122121121010100/00/0/00//0/./././/.-.-.-..-.--.-,-,-,-,+,,+,++ *+*++*++*+*++*)*)*)*)*)())()()()('('('('(('('('('('('('('('('('('('('('('('(('('('('('('('('('('((,-,--,-,-.--.-././././0//00/0/00/0/0/0101010121212112112121232332323323434343454545454545456556565656565656676766767676766766767878787878788778787878789889898898989898998989898989889898899898989898989898989898988778878787878877878787878778787876767767767676765656565656554554545434334343432332232321221212121210100100/0/ .//./../././/.-..-.--.-.-,-,-,-, +,+,,+,,+,+,+,+,+,+*+++*+*+*+*)*)*)*)()()()('('('('('(('('('('('('(('('(('('('('('('('('('('('('('('('(,-,-,-.-.-..-.-.-./././././0/0/0/0/0/0/01010121211221221212323232343 434344334345445454454554545656566566556556566767767 6766776767678788787 87878878788787878787898988989898898989898989898989898989898989898989898989898989899887878878878787877878767676767667676565655665656565545454545434323232232323212121210101101010110010/0/0//0/0/.//./..//.-.-.-,--,-,-,+,+,+,+,+*+*+*+*+*)*)*)*)*)()()()()(())('(('('('('('('('('('(('('('('('('('((''('('(,-,-,-.-././././0/0/0/0/0/0100101212232233232323434434343434545454554456565656565667676767667678778787877878787878989898899898989899898989898989898988998898989899898989899898898989898989989898899898998878 788788787878787877878878767676767676765656566565655654545454343432332323223232232 1211212211212101010010 /00/0/0/0/0/././../.-..-.-.-,-,-,-,+,+,+,++*+*)*)*)**)*)()(()(()('('('('('('('('('('('('('('('(('('('('(('('('('('('(-,-,-.-.-././././/../0/0/0/0 1011010010101012121212232323234343343343434545445454456565655656565567676767 676776766776767878778778878878778787788788787878787898989898989889898898998989899898989898989898989898998898989898989898989889898898989898787878788778878787676767676565655656556545454343434343343 23233223233232121212211212101011010/0/0/0//0/0/.//./././.-.-,-,-,,-,-,+,+,+,++*+*+*+*)*)**)*))*)()())())()('('('('(('('('('('('('('('('('(''('('(('('('('(('('('('('('('('('((-,-,-.-.-./././././0//0//00/0/0/00/01010110101211212112322332 3223323223323234343434434545455454565656565656767676767678778787 878787877877878789889889898989898989898989898989898989 8998998988989898998998989889898987887787878787887787787876767676767676565655656556654545454543434334343232232233232121210110101/00/0/0/0/0/./././/.././.-.--.-.-,-,-,+,+,++,+,++*+*+*++**++*+**+*)**))*)*)()()()(())()('('('('('('('(('('('('('('('('('(('('('('('('('(('('('('('(''(,-,--,-.--..-.--././..//./0/01010012112112121221212223232323434343454545656566565565656767676676767878778878778878778789898989898989898998898989898989898989989989898998989989898989889899898987878787876767677676677676 56565655655656566545454545445434434344343232323212121011011101010/0//0/00/././/./././.-.-.-.-,-,,--,-,+,+, +,++,++,,+++,+*++**+*+*)*)*)*)()())(()('('('('(('('('('('(('('('('('('(('('(('('('('('('('('('('(,-,--,,-,-.-.-.-././/./././0/0/0/00//010011010101010121122122323322323434343454545454565656655676776767878778878787878989898 9889889898998989898989899:99:9:9:9:9:9:99:9:9:9898998989889898989898787878787878767676776767656566555665656545454554543443443433434433432323223232332122121221212212010101011010/0/00/0/././/././.-..-.-.-,-,-,,-,+,+,+,++,+*++**+*+**+**+*)*)*)*)()()()('('(('('('('('('('(''('('('('('('(('('('('('('('('('('('('(-,--,-.-.--.--..-././././0//0/0//0/01010101 2121221212121223233232343443434434345454454545656565656767667767676767676787878787878787787898989989898989898998989899:9:9:9:9:9:9:9:9:9:9:98989898998989898898998989989898987887878787876776767765665656545544545454343233223212121212100110010/0/0/0/0/.//.././.-.-.-.-,-,-,+,++,+*+*++**+*+**++*)*)**))*)()()()()(())('('('('('(('(('('('('('('('(('('('('('('('('(('('('(-,,-.-.-./././../0/0/00/01010101012121211223233233232343343434343433443454544545454565656566565656676766776767678787887787878988989 8989889889989898989:99:9:9:99:9:9:9:9::9:9:9:9:9:9:9:9:9:9::9:9:9:9:9:989989899898989898989898787878787878787676766767676765 6566566565566545454454343443434323232122121211010110110/0/.//../././.-.-.-.-.-.-,-,-,-,+,+,++*+*++*+*+*)*)*)()()()()()('('('('('('('('('('('('('('('('('(('('('('('('(('('('('('('('('('('('('('('('('(,-.-..-./././.././0/0/0/010010101211212322323234343434345456565656565676776 7676776776777878787878989899899898989:9:9::9:999:9:9:99::99:99:9:99::9:9:9:99:9:9:9:9:9:9: 9::99:9::99:9:99:9:9:9899898989898989878788788778878778787787676 766766766767766 565656565665656545454554545434334434343233232323212121212212101101001010/0/0//0/././.-.--.-.-,-,-,+,+,++,++,+*+* +**++*+**++*)*)*)*)*)*)*)()('('('('('('('('('('('('('(('('('(('('('('('('('('('(-.-.-.-.-./././/.././0/0/0/0/0101012112122332232323434344345454545456565655676767667667667678787878778989889898899898898998989:9:99:9::99:9:9:99::9:9:99:9:9:9:99:99:9:9:9:9:9:9:99:9:9 :9:9:99::9:9:9:9:998989898989889899898987878878778787787787876767767676767665656656556565454544543443443432323232121212122101010/0/00/0/0/././.-.-.-.-,-,--,-,+,+,++,+,+,+*+*+*+*+*)*)*)*)*)()()())()(('('('('('('('('('('('('(('('('('('('('('('('('('(('(-.-..--.-.-./././../0/0/0/0101001101101010121212112232323323234343434345445454565656556565656 7667667676766767677878787878989898989889898989:9:9:9:9:9:9 :9:9:9:9::99:9:9:9::9:9:9:99:9:9:9:9:9:9::99:9:9:9: 9:9::99:9:9:9:9:989898989889989889989898987878778787878767676676767656656565654545434433434343433432323212121212101101101100101010/0/0/0/././././../.-.-.-.-,--,-,-,-,+,+,,+,+,,+,++,+*+*)*)*)()('('('('(('('('('('('('('('('('(('('('(('('('(''('('('('('('('('('(-,-.-.-.-.-.-./././/./././0/0//0/0101010121211212112123232332343434 343343344334 545445544545656566565656565676767676677667677877878787877877878989898998898989:9:9:9:9:99:9:99::9:9:9:9:9:9:9:9:9:99:9:9:9::9:9:9:9:99::9:9:9:9:9::9:9:9989898998989898989878787878787787876767676656565665655655665654545454454543434323232323233212112121101010 /0/00/0/00/0/./././/.-.-.-.- ,-,--,--,-,-,-,+,+,+,+,,+,+*+*+*)**)*)*)**)()()('('('('('('('('('('('('('('('('('('('('(('('('('('('('('('(-.-.-.-././././ 0//0//00/0/0/0/01010110101212211232322322323233234343443454544545656566565656767 677667667676778787877887878989898989898998989:9:9:99:9:9:9:::9:9:9:9:9:9:99:9:9:9:9:9:9:9:9:9:9:9::9:9:9:9: 9:99:9:9::9:9:9:99::9:9:98989989898989898898787878878787876767667676566556565665565454545434434343434323232323212121221210101101101010/0/0/0/././.-.-.-,-,-,+,+,++,+,+*+*+*+*)*)*))*)*)*)*)()()()()('(('('(('('('('('('('(('('('(('(('('('('('('(-.-./././././0/0/0/0/01001010110101211232323232332323434343434545454565656567676767678787878787787898898989889898989:9:9:9 :9:99::99:99:9:9::9:9:9:9:9:9:9:9:9:9:9::9:9:9:9:9: 9:9::99::9::9:9:99:9:98989898989989898787877878787676767677676765656565665654545454454344344343432332321212112121210110101011010/0//0//0/././.-.-.-.-,-,-,-,+,,+,+*+*+*++*+*)**)*)*)()(())())(()(()('('('('(('('('('('('('(('('('(('('('('('('('('(-.-.-.-././/../0/0//0//01010121212121232322332323434334334345445454545456565565655676676767878 7878878778878789898898899899898898989899898989:9:9:9:9:9:99:9::9:9:9:9:::9:9:9:9:99:9:9:9:9::999:9:9:99:9:9:989898998898898989878787788787876767676676676565656654545445454344343434323232323212121121 010010010101010/0/0/0/0/././.-.-.--.-.-,-,-,-,,+,+,+*+*+*+*+*)*)*)*)*)())()()())('('(('('(('(('('('('('('('('('('('(('('('('('('('('('('('(-.-.-./..//../././0/0/0/010101212123323434343454545545656656565656767676677676767878787878789889898 989898988988989:9:99:99:9:9:9:9:9:9::;:;:;:9:9:9:9:9:9:99:9:9::99:99::9:9:9:99:989898988989898787878787676767676565656656565654544545454343434323232323232112101010/0/0/./../././.-.-.-,-,-,,-,-,+, +,+,,++,++,+*++*++*+*)*)*))*)*)('('('('('(('('('('('('('('('(('(''('('(('('('('('('('('('('('(.-.-.-./././0//00/0/01011010010100100121121211221212212322322332323 434343344343454545545656565676766767676787878778787898 98898899898898989:9:9:9:9:9::99:9:9:9::;:;:;:;:;:;:;:;:;:;:;::;:9:9:9::99:9:9:9:9:9:989898 989989898898987878767767676767656565656545454545454343433434323232321212121010110/0/0/0/0/././. -.--..--.-.-,-,-,-,,-,,--,,+,,+*+*+*)*)*)*)*)()()()()('('(('('('('('('('('('(('('('((('('('('('(('('('('('('('('('(''('(.-.-.--..-./././0/0/0/0101012121221122123233233434343433443434545445456565566567667767678788787878989889898989:9:9:9:9:9::9:9:9:;::;::;:;::;;:;:;:;:;::;:;:;:;:;:;:;:;:;:;:;: ;::;::;:;:;:;:;::;:9:::9:9::9::9:99:99::9:9:9:98998989989898998989878787877878787676767676765656 56656565565 45455455445434343443343432323232121212112101010/00/0/0/0/././.-.-.--.-,-,-,-,,+,,++,+,++,+*+*+**++*+*)*)*)**)*)()())()()('('(('((('('('('('('('('(''('('('(('('('('('('('('(.--.-.-././../././0/0/01010101012121221232323232323323434343454545456565656767676787878787878789898989898988989:9:9:9::9::9:9:9:9:9:9:;:;:;::;:;:;:;:;;:;:;:;;:;::;:;::;:;:;:;::;::;;:;:;:;:;;:;:;:;:;:;:9:9:9:9::99:99:9:9:9:9:98989989899889898787878787877676765656656545455454554343434343232323232212101010/0/0/./././.-.-.-,-,-,,+,+,+,+,+*+*+*+*)*)*)*)*)*)()()()()('('(('('('('('('('('('('('(('('('('('('('('('(('('('('((-.-.--./.././ 0/0//0/00/01010101211221212123232332233 43343343343345454545656565676767677676767877887878788989898989:99:9:9:99:9:9::9:99:;::;:;::;:::;:;:;:;;:;:;;::;:;:;:;;:;:;:;:;:;:;;:;:;;::;:;;:;:;;:;:;:;:;:;:;::9:9:9:9:9:9:98989889989898989878878776767676 56656656556565654545454543434343432323232321 122122122112101010/0/0/0/. /./././././/.-.-.-.-,-,-,-,,+,+,,+,+*+*+*+*)*)*)**))*)()())()(()('('('(('('('('('('('('('('(('('('('('(('('('('(.-.-././.././../0/0/0101010101101012112123232322322343343434345454565676766767678787 87878778878788989898989:9:9::9:99:;:;:;:;:;:;;:;;:;:;:;:;:;:;:;:;:;;:;:;:;:;:;:;:;;:;::;:;:;:;:; :;:;:;::;;:;::;:;::9:9:9:9:9:99:9:989898989898898787787878778787767677676767656 5655655656545454543434343434323232323221210101010/0/0/./.././.-.-.-,-,-,-,,-,,,+,+ ,++,,+,++,+ *+*++**+*+*+*)*)*)*)*)()()()('(('('('('('('('('('('('(('('('('('(''('('('('('(.-.--.-.-./././0/0/00/010101012121212323234343434345454545456565656565676767667678787 8778778778787889898989:9:9:99:9:9:9:99:9:;: ;::;:;;:;:;:;:;:;;;:;:;::;:;:;::;:;:;:;:;:;:;;::;:;:;:;:;:;::;:;;::;:;:;::;;:;:;:;;:;:;:;:;:;:;:;;:9:9:9:99::99:9:989898989898998989889878787787877676766776565656565565454543443434323323232111212122121010100110/0/0/0/./././.-.-..-.-,-,--,-,-,,-,-,-,,+,+,+,+*+*+**+*)**))*)*)*)()()()()(()(('('('('('('('('(('('('('('('(('(''('('('('(.-./././0//00//0/01011001212123232323234343343454565656 767767766767 87787787878778787889898989:9:9:9:9:9:;:;:;::;:;:;:;::;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;;:;:;:;:;;:;::;:;:;::;:;:;:9:9:99:9::9:99:9:9:989898989898987878778767676767676565565454545545543434432332322121212121010011010/0 /0/0//0/0/0/././.-.-.-.-,-,--,-,-,,+,+,+,+*++*+*+*+*)*)()()()('('('(('('(('('('('('(('('('('('('('(('('('('('('('('('('('('('-.-.-./.././0/0/0/01001101012121212323223232343 343443443434545454565 656565565567676 76767667767878878778877878988989898988988989:9:9:9:9:9::99:9:9:;:;:;:;:;:;::;:;:;:;;:;:;:;:;:;:;:;:;:;:;:;::;:;:;:;:9:9:9:9:9:9::9:9898988988989878787887887767676766765656656566545455454343443233232 3232232232212122112101010/0/././././. -..-..-.-.-.-,-,-,-,-,,,-,+,+,+,+*+*+**+*)**))*)()()('('('('(('('('('('('('('('('('('('('('('('('('('('(('('(('('('('('(('(.-..-././.././././0/0/0/0/010101010101012112121212323232343343433433454554545454565656565676766766767 87788778778787898898988998989:9:9:9:9:9: 9:9::99::9:;::;:;:;:;:;::;::; :;::;:;:;;::;:;:;:;:;<;<;<;<;:;:;:;:;:;::;:;:;:;:9:9:9:989898989878787787887876765656565565454545454454343432323323232212 1211211212101010/0/./.-.-.-,-,-,,+,+,,+,,+,+*+*+*)*)*)()()()()(('((''('('('('('('('('('('('('(('('('('(-./././0/0/0/010101010121211212323232233454545456565656767676676767767878787887878989898988898988989:9::9:9:99:9:9:;:;:;: ;:;::;;::;::;:;:;;<;<;;<;<;<;<;<;<;<;;<<;;<;<;<;;<;<;:;:;:;: ;:;::;::;:;:;:;:;:9:99:9:9:98998989889898989899878878787877878767676776776565655665455454544544543434434323323232232322232121210101010/0/0/./././.-.-.-.-,-,--,+,+,+,+*+*+**++*+*)**)*)*))*))*)()()()()()('(('('('((''('(('('('('('('('(('('(('('('('('('('('('('('('((.-./././0/0/0/00/01010101012122121212322322323234344345454545656565676767676787787887878789898988988998989:9:99:99::9::9:99:9:9:9:9:;:;:;:;:;:;:;:;:;<;<;;<;<;;<;<;<;;<;<;<;<<;<;<;<;<;<;<;<;<;<<;;<<;<;:;:;;:;:;:;:;::;:;:;:;:;:9:9:9:9:9:9898989898987887787 78878778778767676776566565665656545455454343434432323322322212 1212121212121010101010/0/0/0//0/././../././.-.-.-.-,-,,-,+,+,+,+,+*+*)*)*)*)**)*))*)()( )())(()(())(('('('('('('('(('(('('(('(('('('('(('(('('('('('('('(('('('('('(./.././0/0/0/0/0/010010011010101211211221211212212323433434334345454565656656567676767678778778787898989898989:99:9:9 :9:9:9:99::9:9:;::;:;::;::;:;:;:;<;;<;;<;<;<;<;<;<;<; <;<;;<<;;<;<;<;;<;<;<;<;:;;:;:;:;;::;:9:9:9:9:9:9:99:98989898998989878787878787676766765656545445454343443233232212122122121010/ 0//0/00/0/00/.//./.-.-.--.-.-,-,-,--,,-,,-,+,+,+,++,+*+*+**+*+*)*)*)*)()()()('('('('('('('('('('('(('('('('('(('('('(('('('((''(./././././0//00/010121212 3223233232232343433443454545545456556565656 7676776766776767878787887898 98988989899989:9 :99:99::9:99:9:;:;:;:;:;:;<;<;<;<;<;<;<;<;;<;<;<;<;<;<;<;<;<;<;<;<;<<;<;<;<<;<<;<;<;<;<;;:;:;:;:;:;::;::;:9:9:9 :99::9:9::9:989898989898787787876767656565665454545434434334323232232232232321212212101010/0//00/0/0/ ./..//.././.-.-.-.--.--..-,--,,+,+,+,+*++*+*+*+*)*)*)*))*)*)())(())()()()()(('('('('('(('('('('(('('('('('('(('('('('('('('('('('('(././././0/0/0/01010101212112121212322323234343444545454545656565656767678787878789898989899989:9:99:9:9:;:;:; :;::;;::;;:;:;<;<;<;<;<;<;<;<;<; <;;<<;<<;;<;<;<;<<;<;<;<<;<;<;;<<;;<;<;<;<;<<;<;<<;<<;<;<;<;<;;:;:;:;:;:9:9:99:9:9:9:98989898988 78787887787677676767676566556565655654545455434 34344343344343232323232121010/0/0/0/././.-.-.-,--,,-,+,+,++,+*+*+*+*+*)*)**))*)*)()())()()('(('(('('('('('('('('('('('('('('('('('(('('('('('('('('('(./..//../0/0/010110100101212123232323434454545656565676767676787887787787898989898989899:9:9:9:9:9:9:9:;:;:; :;;:;;:;::;:;:;<;<;<;<;<<;<;<;<;< ;<<;<<;;<;<;<;< ;<<;;<<;<;<;<;<;<<;;<<;<;<;<;<;<;<;<<;<;<;;<;;<<;;<;:;:;:;:;;:;:;:;:9:9:99::9::9:99:9:9898989898987878787876767676766765665656565566565454545434343432332323212121010/0/0/0/././.-.-,-,-,-,+,+,+,+*+*+*)*)*)()()())()()('('('('('('('('('('(('('(('('('('('('('(('(././././0/0//0101010121212123232322332343434344567676787878878787898989899:9:9:9:;::;:;:;:;:;<;<;<<;;<;;<;;<;<<;<;;<<;<<<;<;<;<<;<<;;<;<;<;<;<;<;<;<;<;<;<;<;<;<;<;<;<;<;;<;;<;:;:;;:;:;:; :;;:;:;:;;:;:;:9:9:9:9:9:99::98989898988787887876767767667656565654 5455445445434343432332323232121122101010010/0/0/0/00/./././/.-.-.-,-,--,-,+,+,+,+*+**+*+*+*+**+*+*)**)*)**)*)*)()()()()(()(())()('(('('('('('('('('('('(('('('('('('(././/../0/0//0/010101 0121211211212123232343343434545454545656565676787878789898 9898988998989899:9:9:9:;:;:;:;:;;:;::;<;<;<;<;<;<<;<<;<;<;<<<;<;<;<<;<;<;<;<;<;<;;<;<;<<;;<;<;<;<;:;:;:;:;:;:;:9:9:99:99:9898988787876776766767676565656565654554545434323323232321212121010/0/0//0/././.-.-.-.--.-,--,-,,--,-,+,++,+,+*+*+*+**+*)*)*)*)()())()()('('('(('('('('('('('('(('(('('('('('('('('( '(('('(('('('('('('('(././././0/0/00//0/010010101212123232323434433434544454545545 655655665565676767676767767878787898898898898989899:9:9:9:;:;:;:;::;:;:;:;:;<;;<;<;;<;;<;<;<;<;;<;<;<<;<=<=<=<=<;<;<;<;<;<;;<;;<<;<;<;:;:;:;:;;:;:9::9:9:9::9:9:9::99:98989898878787876765656655665454543434343323212212212121010/00/0/0/././/./.-.-.--.-.-.-,--,-,+,,+,+*+*+*+*+*)* )**))*)*))*)()()('(('('('('(('(('('('('('('('('('('('(('('('('('('('('(('('('(./././0/0/0//010101211221121232323233234343433445445454455445656565676767878789898989:9:9:9:;:;:;:;:;<;<;<;<;<;<;<;<;;<<;<<=<=< =<<=<<=<<=<=<=<=<=<=<;<;<;<;<;<; <;;<;;<<;<<;:;:;:;:;:;:9:9:9:9:9:98989988788787878788767766776767656565454543434343432323232322321212121210101001010/0/0/0/././.-.-..-.-.-,-,-,+,+,+,+*+*+*)*)**))**)()(()(()(()(()(()('('('('('('('('('('('('('('(('('(('((''('('('('('('('('('(./..//../0//0/00/0/010100121212123232323223 43433433434545545456565567667667878787898 9889988989989:99:9:99:9:99:99:9:;:;:;:;:;:;;:;<;;<<;<;<;<;<;<;;<;<;<;<<=< =<<=<=<<==<=<=<=<=<=<=<=<=<;<;<;<;<;<<<;<;<;<;<;<;<;<;<;:;:;:;:;:;:;:9:9:9:98998988987877878787 677667667765656565565454545454 343443434433232321212101010/0/0/0/ .//.//./././.-.-.-.-.--,-,-,-,-,+,+,+,++,+,+*++*+*)*)*)*)()()()()('(('(('(('('('(('('('('('('('('('('('('('('('(('('('('('('('('('('(././0/0 1001001101012121212323232343 433443443434545445545456565656565676767678787898898989:9:9:9:9:9:;:;:;:;:;:;:;:;:;:;<;<;;<;<;<;<;<;<;;<;<<;<=<<=<=<=<<==<=<=<=<=<=<=<=<=<<=<=<=<=<=<==<;<<<;<; <;<;<<;;<;;<;<;:;:;:;:;:;::;:;:;:9:99:9:9:989899889898987676766767676565654545545454343434334343232232332121212101101010/0//0/.//./././.-.-.-,-,--,--,-,+,+,+*+*+*+*)*)*)*)()()()(('('('(''('('(('('('('((''('('(('('('('('('('(./0/0/0/0//01010101 21121212211212323223434434545545656567676767878787878789898998989:9:9:9:9:99:9:;:;:;;:;::;:;::;:;:;<;<;<;<;<;<;;<<;;<;;<;;<=<=<=<=<=<=<=<=<=<=<=<=<<=<=<=<=<=<=<<=<=<==<=<<==<=<==<<=<=<<;<;<;<;<;<;<<;<;<;:;:;::;:;:;:;:9:9::9:9:9:99:9:9898989989878787677676 766767667765 65565565565454543434332332232323321212101010101010/0/0/./././.-.-.--,-,-,,-,+,+,+,+,+*+*+*+*+*+**+*)*)*)()()()()('((('('('('('('('('('('('('('('('(('(('('('('('('('('(/././0/00/010100100121212123232322323434434545454554456565656566556766767676767678787878789898989:9:99:99::9:9: ;:;::;::;;:;:;:;:;:;<;<;<;;<;<;<;<=<=<=<=<=<=<=<==<==<=<=<=<=<=<=<=<=<=<=<=<=<=<==<<=<=<<==<=<=<=< =<=<<=<<==<=<<=<=<=<=<<;<;<;<;<;:;:;;:;:;:;:;:9:99:9:9:9:9:9899898787878787787 676776676776765656566556565454545434332323232321212122112101 01010010010/00/0/0/0/./././.-.--,-,-,-,-,+,+*+*+*)*))*)*)*)()())()()('('('('('(''('('('('('('('('(('('('('('('('('(./0/0/0/01010101212123232343434544554544554545 656656656567676776767878787878989898989:99:9:9:9::9:;::;:;:;:;:;:;:;:;:;<;<;<;;<; <;;<;;<<;;<<;<;<=<=<==<=<=< =<<=<<=<==<<<=<==<<=<<=<=<=<=<=<==<=<=<=<=<=<= <==<=<<=<<=<=<=<==<==<=<=<=<=<=<=<<=<;<<;<;<<;< ;<<;;<;<<;<;<;<;<;:;:;:;:;:;:9:9:9:9:99::9:989 989889898989898787877878767667676765656565565454544543434334323232121221011010/0/0/0/././.././. -.-.-..--.--.--,-,-,-,+,+,+,++,+*++*+*)*)*)*)*)()()()('((('('('('('('(('((''('('('('('('('('('('('('('/./0/0/0100110101212121211212323233232323434343343454545565665656656767678787788778789898998989:9:9:99:9:9::;:; :;::;;:;::;:;<;<;<;<;<;<=<=<=<=<=<<=<=<=<=<<=<=<=<= <=<=<<=<=<<=<=<=<=<==<=<<==<==<==<==<=<=<==<=<==<=<=<=<=<<=<=<=<=<<==<=<<<=<;<;<;<;;<;<;;<;<;;<;:; :;;:;;:;;::;:;:9:99:9:9:9::989898988987887878878767676677656565454454554545434344334343232323232321212101 01010110010010/0//00//0/././../..//.-..--,-,-,-,+,+,,+,+,+,+*++*+*)*)*))*))*)*)()()()(()())(()('(('(('('(('('('('('('('('('('('('('('(('(('('(('('('('('('('('('('(/./0/0/00//01010101212121232323232323434545545565656565676767677678787787898989898989:9:9:9::;:;::;:;:;<;<;<;<;<=<=<=<=<=<=<<=<<=<=<==<=<=<=<=<=<=<=<==<=<=<<=<=<=<=<<<=<=<=<=<;<;<;<;<;;<<;:;:;:;:;:;:;:9:9:9:998989899898987887887877878877876767667676676 5656656566565454545434334344343434323232121211210101010011010/0/0/./././.-..--.--,-,-,,-,+,+,+,+*+ *++**+**++*)*))**))*))**)*)()()()(()()('(('('('('('('(''('('('('('(('('('('('(('('('('(('('('('('('('('('('/./0//0/0/00/010101212121232323 433434343434545545565656565656656767677676787878989898989:9:9:9:9::9:;:::;:;:;:;:;:;:;<;<;< ;<<;<<;<;;<;<=<<==<=<=<=<<==<=<=<=<=<=<=<=<=<=<=<=<=<=<=<==<=<==<=< ;<<;<;<;<;<;<;<;;<;;<;:;:;;::;:9:9:9:9:9:998989878767766765655656545454543443434323232121210101010/0/0/././.-.-.-.--,-,-,-,+,+*)*)*)*)*)()()(('('('('('('('(('('('('('((('('('('('('('('(/./0/0/00//0 10100101101212123232343434334345454545565656567676767878789889898989:9:9:;:;:;<;<;<;<;<=<=<=<=<=<<=<=<==>=>=>=>=>==>=>=>=>=>=<=<=<==<=<=<==<==<==<=<=<=<;<;<;<;<;<;<;:;:;:;:;;:;:9::9:99::9989898988988987878878787676767656656656545454544343232323212122121010110/0/0/00/./.-.-..-.-,-,-,-,+,+,+,+,+*++*+*+*) *)*)*)**)*)() ())()(()(()(('('('('('('('(('('('(('('('('('('('('('('/0/ 0//0/0//0/0101012121212122121232345445454565656567676767878789898989:9:99::9::9:9::9::9:;:;:;:;<;<;<;<;<<;<=<=<<=<==<=<=<=<=<==>=>==>=>=>=>=>==>>==>=>=>=>=>=<=<=<=<<=<=<=<=<<=<=<;<;<;<;<;<;<;:; :;::;::;:;;:;:9:9:9::9:9:9::9898989889878778878787677676767656565654545445454334343343232321212112121010/0/./././../.-.-.--.-.-,-,+,+,+*+*+*)*)*)*)*)())()(()(''('('('('('('('('('('('('('(('('('(('('('('('(/0/010101101212122112212323434345454565665656656767676767878787789898989:9:99:9:9:9:;:;:;:;<;<;<;<;<;;<;<;<=<=<<=<=<==<=<=<=<==>=>=>==>=>>=>=>=>=>=>=>=>==>=>= >=>=>==>>=>=>=>=>=<=<===<=<=<==<=<=<=<==<=<;<;<<;;< ;<;;<<;<;<;:;:;:;::;:;:9:9:999:989878878878767676565656556545454343432323323212211212101010/0/0/0/0/0/./../././.-.-..-,--,-,+,+,+,+*++*+*+*++*+*)*))*)*)*)()()()(('('('('('('(('('('('(('(('('('('(' ('('(('(('(/0/0/010010101212322332323434343434545455456555656567676767878787898989:9:9:9:9:;:;:::;:;<;<;<;<=<=<<=<=<=<=<=<=<=>=>=>==>=>=>==>=>=>=>=>=>==>=>>==>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=<=<=<=<=<==<<=<=<;<;<;<;<;<;<;<;<;:;:;:;:;:;:;:9:9:9:9:989889987887787878778767676565655656545545445545434343434343 2323232232321211212101010101010/0/././/././.-.-.-,-,-,-,+,+,+*+*+*+*++*)*)*)()()()()('('('('('('('('(('(('('('('('(('((''('(('(('('('('('('('(/0//0//00/0/0101012112212123223232323433434334345454554565656 566565665567676676787898989:9:9:9::9::9:;:;:;:;::;::;<;<;<;<;<;<<;<=<=<=<<==<=<=<<=<=<=<=<<=<=>=>=>>=>=>=>=>=>==>=>==>>=>=>=>=>>=>=>=>=>==>>=>=>=>=>=>>=>=>=>==<=<=<=<=<=<==<=<;<;<<;<<;<;<<;;<;;<;;<;<;:;:;:;:;::;:9:9:9:::9::9:9:989898989878767676767677656556545443434323232321210110101010/0/0/0/0/0/./././/./.-..-.-.--,,-,-,-,,-,+,+,+*+*+*+*+*)**))*)*)()()()()(()(('('('('('(('('('('((('('('('('('('('('('('('('('(/0//0/0/01010101212121212323233223434345445454545545655676 767677667678787787898989:99:9:9:;:;:;::;;:;:;<;<;<;<;<;<;<;<;<=<=< =<<==<<==<=<<=<=<=>=>=>==>=>=>==>=>>=>=>=>=>=>=>=>=>=>=>=>=>=>>=>=>=> =>>=>==>=>=>>=>=>=>==>=>=>=>=>==>===>=<==<=<=<=<=<=< ;<;<<;<;<<;<;<;:;::;: ;:;:;::;:;;:9::9:9::9::9898988989898788787878787676767676565665565454544545444343434323323232122112122101010/0/0/0/././../.-.-..-..-.-,-,+,+,+,+*+*+**+*)*)*)()()()()()()(('('('('('('('('(('('('('((('('('((''('('('(/0/0/010101012121212123232234343434343454 54545455454565656567677676767878787898989899889:9:9:9:9:;:;:;:;:;::;:;;<;<;<;<<;<;<<;<;;<;<;<;< =<=<<=<=<<=<<=<=<=<==<=<==<=>=>=>=>=>>=>=>=>=>==>>==>=>=>=>>=>=>=>=>=>=>=>>=>=>=>=>=>=>=>>=>=>>=>=>=>==>=>=>=<=<=<=<=<=<=<=<=<;<<;<;<;<;;<;<;:;:;:;;:;:;:;:;:9::9:9:9:9899889889898898788787876776676765656556565 45545454545443434323323232121212101010/0/0/./.--.-.-,-,-, +,+,,++,+,++,+,+*++*+*)*)*)*)*)()()()()('('('('('('('('('('('(('('('(('('('('('('('((/0/0/01010110121212121232323323234343345445545545656566767667667678787898989989988989:9:;: ;::;::;;::;;:;; <;<;;<;;<<;<;<;<=<=<=<=<<=<=<=>=>=> =>>=>=>=>==>=>=>>>=>=>=>=>=>=>=>==>=>=>=>=>=>=>=>>=>=>==>=>=<=<=<=<=<=<=<=<;<;;<<;;<;<;:;:;:;:;:9:9:9::99:9:989898898898898998898787876767676565654545454454443434343434323232323212121010110 /0//0/0/0//0/././.-.-.-.-.-,-,+,+,+*+*+*)*)*))*)())()()((('('('('('('('('('('(''('('('('('('(('('('('('('('('('(('(0//0//0101010101211211221212 322322332322345456565666567 67676776776787787878878989:9:9:;::;:;:;:;:;:;<;;<;<;<;<;<;<;<;<=< =<=<<=<<=<=< =<<==<<==<=>=>=>=>=>=>=>=>=>==>=>=>=>>=>=>=>=>=>==>=>=>=>=>=>>=>>=<==<=<=<=<=<=<<=<;<;<;<;<;<;<;:;:;::9:9:9:9899899889898787876767676565454545454434343233223212121210101010/0/00//00/ ./././/../../.-..-.-.-, -,-,--,-,,-,+,+,,+,,+,+*+*+**+*)*)*)*)*)()()()()((('(('('('('('('('('('(('('('('('('('(('('('('('(''(('('(/0//0/0/01001101101212123223232343 43443443434544554545656565665676767878789889989:9 :99:9:9::9:;:;::;:;:;:;;<;<;<;;<;<=<<=<=<=<==<<=<=<=<=>=>=>=>=>=>=>=>=>>=>=>=>>=>>?>?>?>?>?>?>>?>=>=>>==>=>=>=>=>=>=>=>=<= <=<=<<==<=<=<=<;<;<;;<;<;<;<;:;:;::;:;::9:9:99:9:989899898787877878767676765656565454454454 34343443343432321 2112121121101010/0/0/0/.//..-.-.-,-,--,-,-,+,+ *+**++**+**+*)*)*)()()(()()(('('('(('('('('('('(('('('('(('('('('('('('('(0/0/01010121212 1223223322322323233434343454554545545656565667676776776787787787878988998989:9:9::9:9:99:;:;:;:;<;;<;;<;<=<=<=<=<=<=>=>=>=>=>=>=>=>=>>?>?>?>?>>?>>?>?>>?>?>?>?>?> ?>>?>>?>?>?>?>?>?>>??>=>=>>=>=>=>=>=>=>=<=<=<=<=<<=<=<;<;<;<<;<;<;:;::;:;:;:;;::9::9:9:9:9:9899889898788778787876767656565654554543434343232332332121212101010/0/0/0/.//../..-.-.--.-,-,-,+,++,++,+* +*+*+**++**+*)*)*)**)*)*)()()(()()('('('('('('(''('('('('('('(('('('('('('('('('('('('(/01012122121123232343434343454544554554565656566767677676787877878989889:9:9:9::;:;:;:;:;;:;:;<;<;<;<;<;<=<=<=<=<= <==<==<=<==<=>=>>=>=>=>=>>=>=>?>?>?>?>?>?>?>?>?>>?>>??>?>?>?>??>?>?>?>?>?>?>=>>==>==>=>=>=>>=>=<==<=<=<=<=<<=<<=<=<;<<;;<;<;<;;<;:;:;:;::9::9:9:9:9 89989899889878787876767676765654545454343434323232121121010110/0/0/./././..-.-.-,-, +,,+,+,,+,,+*++**++*)*)*))**)*)()()()()('(('('('('('('('(('('('('('('('('(('('('('('0/010100101212121232323434343434545455445 65565565565567676766776787877878789898989:9::9:9:;::;;:;;:;<;;<;<=<=<=<=<=>=>=>>=>=>=>?>?>?>>>?>??>?>?>?>?>?>?>?>?>?>??>?>??>>?>??>?>??>?>?>?>?>?>?>?>?>=>>=>==>=>>=>=>=>=>=>==>=<=<=<=<=<;<;<;;<;<;:;:;;:;:;::;:9:9:9:9:99:989898987878787876767656566566545545434343432323322332121121010/0/0/././/./.-.-.-.-,-,-,-,-,+,+,+,,+*+**+**+*)* )*))*))*))*)()()()())((()('('('('('('('('(('('('('('('('(''('('('('('('('('('('('('('('('('((/00/010101212123232232332323434345454544544565565656767677678787877878 9899899898989:9:9:9:;:;::;;:;;:;:;;:;;:;<;<;;;<;<=<=<=<=<=<=<=>=>=>=>=>=>=>=>>=>=>?>?>?>>??>>?>>?>?>>??>?>?>?>>?>?>?>??>?>?>?>??>?>??>?>>?>?>?>?>>?>? >?>?>??>??>?>>?>?>?>?>?>=>=>=>=>=>=<=<=<=<<=<<=<;<;<;<;<<;:;:;:;::;::;:9:9:99:9:98998989878787878767676765656554545445434323323232121212121010/00/0/0/0//0/././..//./..-.-,-,-,-,+,+*+*++*+*)*)()()()()('('('('('('('('('('('(('('(('('('('('('('('('(010010121121212322323434343434545456565656567667676787878989898989:9:;:;::;:;:;:;<;<;<<;<;<=<=< =<<=<<==<<==<=<= >=>=>==>==>=>?>>?>?>?>?>??>?>?>?>>?>?>?>?>?>?>?>?>?>>?>??>>?>?>?>>??>?>?>??>?>?>?>?>?>>?>?>>??>>=>=>=>=>=>=>=>=<=<==<=<=<==<=<=<<=<<=<;<;<;<;<;:;:;;:9:99::9:9:98989898787878767765656545455454343233232321212121010101010/0//0/0/0/././..-..-.-,-,-,-,-,+,,+,+,+*+*+**+*+*)**)**)()()()()(()))('('('('('('('('('('('('('(('('('('('('('('('('('(('(0/010100121212123223322343434545454565655656766766787787878989898989:9::9:;:;:;:;<;<;<<;<=<=<=<=>=>=>=>=>?>>?>?>?> ?>?>?>?>??>>?>?>??>?>?>?>?>?>?>?>?>??>?>?>?>??>?>>?>?>?>?>?>?>>?>>??>>=>=>>=>=>=>=<=< =<=<==<=<<=<=<;<;:;:;:;;:;::;::;:9:9:9899878788767676 5665565656565454543434343432323321212121210101010/0/0/0/././..-.-.-.-,-,-,+,,+ *++**++*++*)*))*)**)*)()()()()('('('('('('('('('(('('('(('('('(''(('('('('('('('('('('('(01010121211232232323434345445454545 65565665665676766767878789898989:9:;:;:;::;:;;:;:;<;<;<;;<;;<<=<=<=<=<=<==<=>=>=>=>==>>=>=>==>=>=>?>?>>?>?>?>?>?>>??>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>??>?>?>??>?>>?>?>?>?>>?>?>=>=>>=>>=>=>=<=<=<=<=<=<;<;<<;<;:;:;:;::;:9:9::99:9899899898787887677676767656565655 45455454554343443433432323232121212121 010101011010/0/0/0/./././.-.-.--.-,-,-,-,+,+,+,+*+*++**+*)*)*)*)*)())()())(()(()()('('('('('('('('('('('('(('('('('('('('('('(0101211221212323232343434545445545 655656556567677676678787878988989889:99::9:9: ;::;::;;::;:;<;<;;<;;<<;<;<<=<=<=<=<=<==<=<=>=>=>=>==>>=>=>==>=>?>?>?>?>?>>?>?>?>?>?>?>>??>?>?>?>?>?>?>?>?>?>??>??>>>?>?>?>=>=>=>=>==>=>=<=<=<<==<=<=<=< ;<<;<;<<;<<;<;<;;:;:;:;:9::9:99:99:9898988987878767677676765665656554545445543432322321212121010/00//0/ 0/././/.//./..-.- ,--,-,,--,-,+,++,+*+*+*+*)*)()()()('('('('('('(('('('(('(('('('('('('('((0101010011012121212 3223232332234343345454456767677676787878787878989898989:9:9:9:;:;:;:;<;<;<;<;<;;<<=<=<==<=<==<=<<=<=<= >=>==>=>>=>=>=>=>?>?>?>?>??>?>?>?>?>?>?>???>?@?@?@?@?@??@?@?@?@??@?>?>?>??>?>?>>?>>?>??>?>?>>??>?>?>>?>?>>?>=>=>=>=>=>=>=>=<=<=<=<==<=<=<=<;<;<;<;<;;:;:9:9 :99::99:99:9:9898 988988988987878878767767676676565454454344343434323232321010010/0//0/./../.-.-.-,-,--,,-,+,+,,+,+*+*+*+*)*)*)()()(()('('('('('(('('('('(('('('('('('('(010110101212112112323223323434343434544545454545656567767877878787898988989:99:9:9:9:9:;:;:;:;<;<;;<;;<<;<;< =<=<<=<<==<=<=<=>==>==>=>=>=>==>=>?>?>?>>?>?>?>?>??>?>?>?>??@?@?@?@?@?@?@?@?@?@@??@@?@?@?@?>?>?>?>?>?>?>??>>?>?>?>=>=>=>=>=<=<=<<=<=<=<;<;<;;:;:;;::;:;:;:9:9:9:9898987878876767766765656565656545454343232121010101001010/0/0/0/./././.-.-,--,-,+,+*+**++*+*)**)*)())()('(('('('('('('('('('('('(('('('('('('('('('('('('(0101012121212343434 544545454554565655656 7676766767778787887898998989:9:;:;:;<;<;<;<;<;<;<=<<=<=<=<=<=<=>==>==>=>=>==>==>=>=>?>?>??>?>?>?>?>?>?>?>??@?@?@?@? @?@??@@??@?@?@??@?@?@?@?@?@?@?>??>?>?>?>??>>?>?>=>=>=>=>=>=>=<=<=<=<=<<==<;<;<;<;<;;:;::;;:;;:;::;:9:9:98988989878788767767656565565654554545434334323323232121010/0/0/0/././../.- .-.-..-.--.-.-,-,-,,--,-,+,+,+*+*+*)*)*)*)()()()()()('('('('('('(('(''('('('('(('('('('('('('('('('(010101212121232323233234343443454454454545545656556656767677878878989:9:9:9:9:;: ;::;:;:;;:;:;<;<;<;<=<=<=<<=<=>==>=>=>=>=>>==>=>?>?>?>??>>?>?>?>?@??@?@??@?@?@?@?@?@?@?@@?@?@?@@?@@? @?@@??@?@?@?@?@?>?>?>?>?>?>=>>=>=>>=>==>>=>= <=<=<=<<=<=<=<==<;<;<;<;<;;<;:;:;;:;:;;:;:9:9:9::9:989898788787787 6767667667667656566554545454343434323223232321221210101010/00//0/.//./.-.-..-.-,-,+,+,++,,++,+*+*+*+*)*)*)*)*)*)())()()()()('('('('('('('(('('('('(('('('('(('('('('('('('('('(''('(01012121232323234343434343454455456566567676778787787898989:99::9:;:;;:;:;::;<;<;<;<<;<<=<=<<===<=>=>=>=>=>=>?>?>?>?>?>>?>?>?@??@?@?@?@?@??@?@?@@?@??@?@?@?@@?@?@??@@??@?@?@?@?@@??@?@?@?@@??@?@?@?@@??>?>?>?>?>?>?>=>=>>=>=>=<=<==<<=<=<=<;<;<;<;<;:;:;;:;:;:9::9:99:9 89989899898 78788787788787676676566545545454344344343232323212121210101010/00//0/0//0/./././.-.-.-,-,-, +,,++,+,+,++,+*+**+*++*)**)*)*)()()())()('('('('('('('(('('('(('('('('('('('('('(1010101212121232323234343434345454554545676767677878787898989:9:9:;:;:;:;<;<;<;<<;<=<<=<=<=<=<=>=>==>==>>=>=>?>?>??>>?>??>>??>?>?>?@?@?@@?@?@@@?@?@?@??@?@?@?@?@?@@??@@?@?@@??@@?@?@?@?@?@?@?@@?@?@?@?@?@?@?@@?@?@?@??>??>?>?>?>?>=>=>>==>=<=<=<=<;<<;;<;<<;<;:;:;;:;:;:9:9::99:9:9898998987878767767676565665455445454343432321212212101001101010/0/00//0/0//00/././.-.-,-,-,--,--,+,+,+,+*+*++*+*)*)*)*)()())()()())()('('('('('('('('(('('('('('('('('('(('('('('('('1011001 21211212212323234343454545545656565677878789898989:9:9:9:;:;:;:; <;;<<;<;;<;<=<=<==>=>==>=>=>?>?>?>?>??>?>?@?@?@?@?@?@?@@??@?@?@?@@?@?@?@?@?@?@?@?@?@?@?@?@?@ ?@??@?@@?@?@?@?@?@?@?>?>?>?>?>?>?>?>=>=>==>=>=>=>>=>=<=<==<=<<==<;<;;<;;<;:;;:;:;;: 9:99:9:99::9 89988998998787878767677667676565656545454543434343232321212121011011010/0/00/0/0/.//./.-.-.-.-.-,-,-,-,-,+,++,++,+*++*+*+*+*)*)())())()(())()(()('('('('('('('(('('('('('(('('('('(010100121212323232323434345445456566565676676767878789:99:9:9:9:;:;<; <;<<;<;<<;<<;<=<=<==<=>=>=>=>=>=>?>?>?>?>?>?>?>?>??>?@?@?@?@?@?@@?@?@?@@?@?@?@?@?@?@?@?@?@?@?@@?@?@?@??@?@?>?>??>??>>??>?>>?>?>>?>?>=>=> =>==>==>=>>= <=<=<=<=<==<=<=<;<;<<<;<<;<;<;:;;:;:;:9:9:9:98989878767676765656565454543433432323232121121212101010110/ 0//00/0//0/./.././.-.-.-.-,+,+,+,++,+ *++*++**+**+*)*))*)*)*))()()()('('('('('('('('('('('('('('('('(''('('('('('('('(0101101101212123233223323434544545656565667676767767878787878989898989:9:99:9:;:;:;<;;<;<;<;<=<=<=<=<===>=>=>=>>==>>==>>=>=>=>?> ?>?>??>?>>?>>?@??@?@?@?@??@?@?@??@?@?@?@A@A@?@?@?@?@?@??@??@?@?@?@??@?>?>??>?>??>?>>?>>?>?>=>>=>=>=>=>=<==<=<<=<=<;<<<;<;;<<;:;:;::;::;:9::98989878787878767656566566545434343232321212112101010/0/0//.//./.-.-.-.-.-,--,-,-,+,+,++,+*+**+*)*)*)())()()('('('('('(('('('('('('(('(''('('('('('(100121121212323 433443343434545454456565567676767787898989:9:9:99:;:;:;<;<;;<;<;<;<=<=<=<==<==<==>=>=>?>?>?>?>?>?@?@?@?@?@?@?@?@?@?@?@?@?@A@A@A@A@A@A@?@?@?@?@?@??@??@@?@?@??@?@?>?>?>>?>?>?>?>?>?>?>=>=>=>=>=>=<==<=<=<=<=<<;<; :;;::;:;:;:;:9:9:98788787878767676767667665566556565454545445434343432323232121212101010/0/./././.-.-.-,--, +,,++,,+,,+*+*+**+*+*)*)*)*))*))()()('('('('(('('('('('('('('(('('('('('('('('('('('('('(10121212123223323234334434343454454544545 655655656566567677677877898 98989989989:9:9:9:9:9:;::;;::;:;:;<;<;<;<;<=<=<=<<=<<==>=>=>=>=>=>>=>?>?>>??>?>?>>??>?>?>?@?@?@?@?@?@?@?@?@?@?@@A@A@A@A@A@A@A@A@A@A@?@?@?@?@@?@@?@?@?@?>?>?>?>??>?>?>?>=>=>=>=>==>=<= <=<<==<==<=<<;<;<;<;;<;<;:;:;;:;:9:9:9:98989898 7878878788767676656565454554343434343232321212101010/0/0//././../.-.-.-,-,-,-,--,+,+,+*+*+*)**)*)*)*)())(()()()()()('('('('('('('('('('('(('('('('('('(('('(('('('('('(('(101212123232323434343443345455445 65566556565676766776767878787878989:9:9::9:9:;:;:;:;<;;<;<;<;<=<<=<<==<=<=>==>=>=>=>=>=>?>?>?>?>>??>?@?@?@?@?@?@?@?@?@A@@A@A@A@A@A@A@A@A@@A@@AA@A@A@A@A@@A@A@A@A@A@?@?@?@?@?@?@?@?@?>?>?>??>?>?>?>=>=>==>= >=>=>==>=>>=<=<=<==<==<<;<;<;<;:;;:;;:;:;::;;:9:9::9:9898998989878878787676676776656565454543433434323232321210110101010/0//././.-.-.-,-,,-,+,+,+,+*+*+*+*)*)*)()(()()('('('('('('('('('('('(('('('('('(0121212123232323234343345656565656567667678778878989:9::99:;:;::;:;<;<;<;<=<=<=<=<<=<=>=>=>=>>=>=>>=>==>?>?>??>?>?>?@?@?@?@?@@?@?@?@?@A@@A@A@@A@A@@A@A@A@A@@A@A@A@A@A@A@AA@@A@A@AA@AA@A @A@AA@@A@@AA@A@A@?@@?@?@?@?@@?@?@?>?>?>>?>?>?>?>=>=>=>=>=<=<=<=<=<=<;<;<;<;:;:;;:;;:;:9::99:9:98987878787677667676776665656545434343343232321212122101010/0/0/0//././.-.-..--.- ,--,,-,--,-,+,,+,,+*+*+*)*)*))()()()()('((''('(('('('('('('('(('('(('('('('('('('('('('('('(012122112323234343443434545656567676776678787878898989:9:99:9:99:;:;:;:;:;:;<;;<;<;<=<<=<<==<=<=>=>==>==>>=>=>=>?>>?>>?>?>?>?>>?@?@?@?@??@?@??@?@@?@?@?@A@A@A@@A@A@A@A@A@A@A@A@A@A@A@A@AA@@A @A@@AA@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@@?@ ?@@??@@?@?@?@?@?>?>>??>>?>?>=>==>=>=<=<=<==<<<;<;<;;<;<; :;;::;:;;:;:;:9:9:99:9::99:9:989898987676767676656565454543434334323232121211221010/0/0/0//./.-..-.-,-,+,++,,+,+*+*)*)**)**))*))()()()(()()('('('('(('(('('(('(('('('('(('('(('('('('('('(('('('('('(01212122112322322332323433433443454565676766776767878878898989989:9::9:9:;:;<;<;<;<;<=<=<=<=<=<=>=>==>=>=>=>=>?>??>>?>?>?>>?>>?@?@?@@??@?@?@?@A@A@A@A@A@A@A@A@A@A@AA@A@A@A@A@AA@AA@A@@A@A@@A @AA@AA@@A@A@A@A@@A@A@A@AA@A@A@A@A@@A@@?@?@??@?@?@@?@?@?>?>?>?>?>?>?>=>=>=<=<=<=<;<;;<;<;<;:;;::;:;:9:9:989898788778787676765654545454343432121011010110 /00/00/0///././../.-.-..-..-.-,-,-,+,+*++*+*++*)*)*)*)*)() ()(())()(()('('('('('('('(('('('('('(('('('(('('('((''(1212122123433434 54544554545545655656567676787887889898989:9:9:9:;:;:;;:;<;<;<;<;<=<=<=>=>=>=>=>?>>?>?>?>?>??>?@?@?@?@?@@??@?@?@A@A@A@A@@A@A@A@@@A@A@A@A@A@A@AA@A@@AA@AA@AA@AA@A@A@A@AA@A@A@A@A@@A@A @AA@@A@A@@A@A@A@A@A@@?@?@ ?@?@??@@?@?@?>?>?>?>?>?>=>=>>=>==>>=>=<=<=<<=<;<;<;<;<;<;:;:;:;::;:9:9:98998989878877878767676767676565654544554543432323233232121212212101101010/0/000/.//././.-.-,-,-,-,,--,,-,+,+,+,+,+ *++**+*+*+*)*)*))()()(()('('('(('('('('(('('('('('('('('('('('('('('('('('('(12121232323 233433443343343454454455456566567677667878787889898989:99::9:;:;<;<;;<;<;<;<=<=<=<==<=>==>=>>?>?>?>?>?>?@?@?@??@?@?@?@?@ A@AA@@AA@@A@A@A@@AA@A@A@A@A@A@A@A@A@A@A@A@AA@AA@A@@A@@AA@A@A@?@?@?@?@??@?@?@?>?>?>?>?>?>=>==>=>=>=>=<==<=<=<<=<=< ;<;<<;<<;;<;:;:;:;;::;:9:9::9:9::98989898987887878787677676565454545434334323232321212112101010010010 /0/0//00/000/././.-.- ,--,,-,-,-,+,++,+*++*+*+**++*)*)**)*))*))()())())()()('('('('('('('('('('('('('('(('('('('('('('('('(1212123223232232343454545454565656767767878787878898989:9:9:9:;:;:;:;<;<;<<;;<<;<=<=<==<=>==>=>=>=>>=>?>?>>?>?@?@? @?@@??@?@@?@?@A@A@A@A@AA@A@A@A@AA@A@ABABA@A@A@A@A@A@A@AA@@A@@A@A@A@A@A@A@?@@?@?@?@?@?@?>?>??>>?>?>?>>?>=>=>=>=<==<=<=<;<;<<;<;<<;:;:;:9:9:9:9:9899898987887787876767656545454543432323212121 0110011001010/0//0/./.-.-.-..-..-,-,-,-,+,+,+,+,,+*+*+*)*)*))()())()('('('('('('('(('('('((('('('('('('(('(121212323232343434545456565665676776776767878788989:9:9:;:;:;:;<;<;<;<;;<=<=<=>=>>?>?>>?>?>?@?@?@?@?@?@A@@A@A@@A@A@A@A@A@AA@@AABABABAABABABABABABABA@A@A@A@A@@A@AA@A@A@A@?@?@?@?@?@?>?>?>>?>?> =>>=>=>>=>=>=>=>=<==<=<=<=<=<;<;<;<;<;:;:;:;:;:9::9:9:98989878787676767656656556545454545455434343233232323212212101011011010/00/0/././././.-.-.-.-,-,,-,+,,++,,+,+*++*+*)*)*)*))*))()()(()('('('('('('('('(('('('('('('(12121232323 4344343443344345454565656565566567678787878 98989889989:;:;:;:;<;< =<==<=<==<==<=>=>=>=>>?>?>?>?>?>?@?@?@?@?@A@A@AA@A@AA@A@A@A@A@AABABAABBAABABABABAABABABABABABA@A@A@A@A@A@@A@A@AA@A@?@?@?@??@??@?>?>?>?>??>=>=>=>==>=<= <=<<=<==<=<;<;<;<;;:;;:;:;:;:;:9:9:9::989898898987878778767676565 4554544544554343432321212212121211001001010/0/00//0/0/././.-,-,-,-,+,,+ ,+,,++,++,+*+*+*)*)*)*)*))*)()()('('('('('('('(('('('('('('('('('( '(('('(('('('('('('('(12122112323232343343454545454565656767678788787898989:9:9:9:9:;:;:;::;<;;<<;<;<=<<=<=<=<=<=>=>=>=>=>?>?>?>??>>??>>??>?>?>?@?@?@?@?@?@A@A@@A@AA@A@A@A@A@A@ABABABABABABABABABAABABA BABABAABBABABABABABABAABABBA@AA@A@A@A@A@A@A@?@?@@?@?@?@@?@?@??@??@?>?>?>?>=>=>>=>==<=<<==<=<<=<=<;<;<;:;;:;:9:9::989898787876676765654554543434434323232121210101010/00/./././.-..-.-,-,-,,-,+,+,+,+*+*)*)*))()()())()()('(('('('('('('('('('('('('((('('('('('('('(('('('('(212323234334433454565656767677676787878998989:9:9:;::;:;:;<;;<<;<;;<;<=<<=<=<=<=>=>=>>==>=>>?>?>?@?@?@?@??@@??@A@A@@A@A@A@A@ABABAABAB ABABBABAABAABABBAABABABABABABBABABABABABBABABABABABABABAA@A@AA@A@A@A@?@?@? @?@?@@?@??@?@?>?>=>=>=>>=>==<=<;<;<<;:;:;:9:9:9:9 89989989988989878787876 767676676765656556565454344343232332121212101010/00/000/././.-..-,--,,-,-,+,+,++,+*+*+*+* )**)*)**))*)))*)())()()()('('('('('('(('('(('((''('('('('('('('('('(1211232232343434545456565565656767677678787878878989889:99:99:;:;:;:;:;<;<;<;<=<=<=<= >=>>==>==>==>=>??>?>?>>?>?>?>??>?@?@??@@??@?@??@@?@A@A@A@@A@A@A@ABA ABAABABAABBABABABABABABABAABABAABABABABABABABABABABAABABA@A@A@A@A@AA@A@A@?@?@@?@?@?@?@?@?>?>??>?>=>=>=>==>== <=<==<=<==<;<<;<<;<;:;:;:;:9::9:9:98987887767656545454 34344343343432323212122101010/00/0//0/././.-.-.--.-,-,-,+,+,+*+*+*)*))*))())()()()(()('(('('('('('('('('('('(('('('('('(('('('('('('('('('('('(212123232323243434345454545656565676767767878989989:9:99:9:;:;::;::;:;<;<;<;<;<=<=<=<=>==>==>>=>=>?>?>?>?>?>?@?@?@?@?@A@A@@A@A@A@A@ABABABAABBABABABABABABABAABABBABABABABABBABABABABABABABABABABBABAA@A@A@A@A@@A@A@?@?@??@@?@?@?@? >??>?>??>??>?>?>=>=>==<==<=<<=<<=<;<;<;<;;<;:;:;:;:9:9:9:9::9:98989889898787878776776767656565454343434323212212121010110/0/0/././.-.--.-,-,-,+,+,+,+*++*+*+*)*)*))()()('(('('('('((''('('('(('('('('('('('12112323 433434344334545445656565567676776787878789899899:9:9:9:;:;:;:;:;<;;<;<;<;<;<=<=>=>=>=>==>=>?>??>?>??>?>>?@?@?@?@@?@?@?@ A@@AA@@A@@A@A@A@ABABABABABABABBABABABABBABBABABABABBABABABABABABABABABAABAABABAABABAABBABABAABABBABA@A@A@A@A@A@A@A@?@?@?@?@@?@?@?>?>?>?>?>=>==<=< =<<==<<=<<=<=<;<<;<;<;;<;;<;:;:;: ;:9:9:9::9:9:9 89989898989878787676767656565654545434344343 233233233223212121010110100//0/0/0/./././../. -..--.-..-.-,-,--,--,+,+,+*+*+*)*)*))*)())(()()('('('('('('('('('('('(('(('('('('('('('('('('21232232232234343344345454545456556567678789898898899899:99:9:9:9:;:;::;;:;<;;<;<;<;<=<==<=<==<=>==>=>=>=>=> ?>?>>?>>??>??>>?>?@??@??@?@?@?@A@A@A@A@@A@AA@A@ABABABABABABBABBABABABABABABBABABABABABABABABABABABABABABABABABABAAABA@A@A@A@A@A@?@?@??@?@?@??>?>?>>?>?>=>=>>==>=>=<=<=<;<;<;:;;:;:;:;:;;:9:9:9 89889889898787878787876767676565656545445454545434323323223232121010100/0/././.-.- ,--,,-,,--,+,+,+,+*+*+**+**+*)**)*)*)()()()()('('('('('('('('(('('('('('('('('('(23232345454545656767677678787878989899:9:9:;:;:;:;<;<;<;<;<=<=<=<=>=>=>=>=>=>?>?>?>?>?>?>?@?@@??@?@?@?@A@A@A@ABABABBA BAABBAABAABABABCBCBABBABABABABBABBAABABABABA@A@A@A@AA@@A@A@A@A@?@?@?@?@??@@?>?>?>?>?>=>==>==>=>=<==<=<=<;<;;<;:;:;:9:98989898987878788777677667656656545454343212212121010/0/0//0/.//.//./.-.-,-,+,+,+,,+*+*+*)*)*))*))*)()(()()('('('('('((''('('('('('('('('('('('('('('(('2323322323434343443454545 65565665655656767767678787878789899:9:9:;:;::;;:;<;<;;<;<;;<=<=<==<<=>=>=>?>?>?>>?>?@??@?@?@?@?@A@A@A@A@A@A@A@A@ABABABABABABAB ABABAABABABBCBCBCBCBCCBBCBCBCBABABABABABABABAABABA@A@A@AA@A@@AA@A@ ?@?@?@??@??@@?@?@@?>?>?>?>?>>??>=>=>>=>=>=<==<<=<==<=<;<;<;:;;:;::;:9:9:9898898998787887887876765665565565 454455445454 344334343433432323232121010100/0/0/0/./.-.-.-.--.-,-,-,-,-,-, +,+,,+,,++,+,+*++*+*++*+*+*)*)**)**)*)() ())()()()(()('('('('('('('('(('('('('('('('('('('('('('(23232343454545454545655665676767667878787878989899:9:9::9:;:;<;;<<;;<=<=<<=<=<=>=>=>=>>=>>=>?>??@?@?@?@?@?@ A@@A@@A@A@A@@A@ABABABABABABBAABABABABABBCBCBCBCBCBCBBCBBCBCBCBCBCCBCCBCBCBCBCBABABAABABABABABA@A@A@AA@A@A@?@?@@??@?@?@?>?>?>?>??>>==>>=>>=>=<=<=<=<<=<;<<;<;<<;:;:;::;:;:;:9:9:98998987878787876767767765656656656545454343434323232121211210100/0/0/././.-..-.-.-,-,+,++,+,+*+*+**+* +*))*)**)*))()()()('('('('(''('('('('('(('('('(('('(('('('('(('('('('('('('('('('(23223323434343454545454565656766776678787878989 899899889:99:99:9:9:;:;::;:;:;<;<;<=<=<=<=<=>=>=>>=>?>>?>?>?>?>??@?@??@?@A@@A@@A@A@A@A@AA@ABABABABBABABABABABBABABCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBBCBBCCBCBCBABABAABBABBABAABABABABA@A@AA@?@?@?@?>??>>?>?>?>=>>=>=>=>>=>=<=<=<<==<=<;<;<;<<;<;:;;:;:9:98989897787877876767676565454543434323223212212212101010/0/././/.//.-.-.-.-,-,-,-,+,+*+*+*)*))*)()()()('('('(('('('('('(('('('('('('('('(2323434345454565656767767 877877877877898989889989:99:9:9:;:;:;:;<;<;<<;<;<=<=<=<<=>=>=>=>?>??@?@??@?@?@?@A@A@@A@A@@A@@A@ABABAABAABABABABCBCBBCBCBCBCBCBCBCCBCBCCBBCBCCBCBCCBCBCCBCBCBCBCCBCBCBCBCBCBCBCBBCBCBCBCBABABBABABABABABABA@A@A@@A@A@A@A@AA@A@?@?@@?@??@@?>?>?>>?>>=>>=>=>>=<=<=<; <;<<;;<;;<;:;:;:;:;:9::9::9::9::99:98998787887788767677667765656654545455434343434323232322332122121210101000/0/0/0/./././/.-.--.-,--,,--,-,+,++,+,,+*++*+**+*+*)*))*)*)()()()('('('('(('('(('('('('('('('('('('(23232343434345456556766767878787898989899:9:9:9:;:;<;<;<;;<;<;<=<= >=>==>=>>=>>=>=>?>?>?>?@???@?@?@??@?@A@A@A@ABABABABABBABBABABABCBCBBCBBBCBCBCBCBCBCBCCBCBCCBCBBCBCBCBCBCBCBCBBCBCBBCBCCBBCBCCBCBCBBABABBABBAABBABAABABAABA@A@A @A@@A@@A@AA@ ?@?@?@?@?@@?@?@?>?>?>??>?>?>>=>>=>=>=<==<=<=<=<;<;<;:;:;:9:9898987878787676767656545434323232321212121101010100/0/.-.-..-.-.-,--,-,--,+,++,,+*++*+*+*+*)*)**)))*)*))*)()('('('('('('('(('('('(('('('('('(23323234343454565676776676787878988989899:9:;:;:;;:;<;<;;<=<<==<=<=<=<=>=>=>=>=>?>?>?>?@?@?@ ?@@??@@??@@?@?@A@@A@A@A@A@ABABABABABAABABABCBCB CBBCBCCBCBBCBCBCBCBCBCBCBCBCBCBBCBCCBCBCBCBCBCBCBCBCBCBCBCBCBCBBCBCBCBCBCBBABABBABABBABAABAABABA@AA@A@A@A@A@?@@?@??@?@?>?>?>>??>>=>=>==>==>=<==<;<;<;:;:;:;:9:9:9::9:98989878787677676765655654543443344343232233223212212101010/0/0/0/.//././.-.-.--.-,-,-,+,,+,+*+*+*)*)*)*)*)()()('('('(('('('('(('(('('('('(' ('('(('(('('(232323434433454455445456565655676767678787787898989:9:9::9:9::9:;:; <;<<;<<;<<;<=<<=<<=<=>=>=>=>?>?>??>>?>?@?@?@A@A@A@AA@A@ABAABABABABAABBABCBCBCBCBBCBBCBCBCBCBCBCBCBCBCBCCBCBCBCBCBCBCB CBBCBBCCBCCBCBBCBBABABAABABABABABABA@A@A@@A@A@A@?@@?@?@?@?@?>?>> =>>==>=>=>=>=<=<=<;<;:;:;:9:9:9:9:989898899878878787876765656565654543433432332321210010//00//0/.//.-..--.-.- ,--,--,,-,,-,+,+,+,+*+*++*+*)**)**))*)**)()()('('('('(('('('('('(('((''('(('(('('('('('('('('(2332323234334434345445545454565565655656 76766766767 8788788787898988989:9:9::9:;:; <;<;<;;<<;<=<=<=<=>=>=>?>>?>>?>?@?@?@??@?@?@?@@?@A@A@@A@A@A@ABABABABAABABABCBCBC BCBCBCBBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCCBCBCBCBCCCBCBABABABABBABABABA@A@A@A@A@@A@?@ ?@??@@?@@?@?>?>?>?>>?>?>=>=>=>=<==<=<=<=<;<;<;<; :;:;;:;:;;:9:9:9 8998989989887887877876767656656565656545454543434334321212121011010/00/0/./././/.-.-.-,-,-,-,+,+,+*+*+*)*)*)*)()()()('('(('('('('('((('('('('('('('('('('('('('(234343433434544545454565656767667767767 877878778778989989889:9:9:;:;::;:;<;<;<=<= <==<<=<<=<=>=>=>==>?>>?>?>?@?@?@?@?@@?@A@A@A@A@A@ABAABAAB ABAABABABBABCBCBCBCBCBCBCBCBCCBCBCDCDCDDCBCBBCBCCBCCBBCBCBCBCBCBBCBCBABABABBABABABA@A@A@@A@ A@A@A@@A@AA@?@?@?@@?@@?>?>?>>?>=>>=>>=>=>==>>=<=<=<;<;<<;<;<;:;:;:;::;;: 9:99:99:9:9898989887876565656654545434343 2332323323232321212101001010/0/0/0/./../.-.-.-,--,-,,-,+,,+,,+,+*+*)*)*)()()()()('('('('('(('('('('(('('('((''('('('('((3232234343434343454544565567678989898989:9:9:9:9:;:;:;<;<;<;<;<=<=<=<=>=>?>?>>?>?>?@?@@?@?@@?@??@A@A@A@AA@ABA BABAABBAABAABABCBCBCBCCBCCBBCBCBBCCBBCBCBCBCBCCDCDCDCCDCDCDCDCCDCCDDCDCDDCCDCDCBCBCBCBCBCBCBCBCCBCBCBABABAABABABABA@A@A@A@A@?@?@?@?@?@?>?>?>>>?>>?>=>=>>=>>=>=<==<==<<=<=<;<;: ;::;:;::;;:9:9:9898898898878878787876767656545454 3443443344323232121011011011010/0/0//0/0/././/./.-.-..-..-,-,-,+,,+,++,,+*+*+*++*+**)**)**)*)()()()('('('('('('('('(('('(('('('('('('('('('233223234343434545455454565656567678787878989:99:9:9:9:;:;<;<;<;<=<<=<=<<=>=>=>>=>?>?>?>?>?@??@??@@?@?@?@@@A@A@@A@A@ABABABABABAABABCBCBCBCBCBCBCBCBCBCCDCDCDCD CDDCCDDCCDCDCDCDCDCDCDCCDCDCDCDCDCDCBCBCBCCBBCBBCBCBCBABAABBAABABA@A@@A@A@A@?@?@?@@?>?>?>>?>?> =>>==>=>>=>=>=<=<=<=<==<<=<=<;<;<;:;;::;;:9:9:9:9:989898988878765656654545454343434434323232121221211210010/0/./. -..--.--..-,--,-,-,-,+,+,++,++,+*+*+*+*)**)*)*)*)()())()(()('('('('(''('('('(('('('(('('('('('('('('('(('(323234334434343454454455456567676787787877898988989:99:9::9::;::;:;:;<;<;<;<=<<==<=<=>=>=>=>>?>?>?>?>?>?@?@?@?@?@?@@A@AA@@A@A@A@ABABABCBCBCBCBBCBCCBCBCBCDCCDCDC DCDCCDDCCDCDCDCCDCDCDCCDCCDDCDCDCDCDCDCDCCDCDCBCBCCBCBCBBCBCBCBCBABABABABABABA@A@A@?@?@?@?>>?>>?>?>?>=>>==>=>=<=<=<;<;<;:;:;:9:9:9898887877876767656656565454454543434321210101010/00/0/./.-.-,-,-,+,+,+,+ *+**++*+**+**)*)*)()()()('('('('('('('('('('('(('('('('('(''(('('(3234544545 656556656566567667678778878989:9::;:;:;;<;<;<;<=<=<=>=>=>=>?>?>?@?@??@?@@A@@A@A@ABABABABABCBCBBCBBCBCBCBCBBCDCDCDCDCDCDCDCDCDCDDCDCDCDDCDDCDCDCDCDCDCCDCDCDCDCCDCDDCDCDCDCBCBCBC BCBCBBCCBCBCBABABAABABABABA@A@AA@A@@AA@A@?@?@??@?>?>?>?>?>?>=>=>=>=<=<=<;<;;<;<<;<;<; :;::;::;;:;:;:9:98989898989878787 6766767677656545445543432323212101010/0/./..//.-.-.-.-.-.- ,-,--,--,,-,+,+,+,+,+*+*+**)*)()()()('('('(('('('('(('('('('('('('('('(3223434344334545445655655665678789898989:9:99::;:;:;:;<;<=<=<=> ?>?>>?>??>??>?@?@A@A@A@A BAABAABABABABCBCBCBCBBCBBCBCDCDCDCDCDCCCDCDCDCDDCDCDCCDDCCDCDCDCDCDDCCDCDCDCCDCD CDCDDCDDCDCDCDCDCDCBCBCBCBCBCBBCBCBCBABABABABABA@A@@A@A@A@AA@?@@?@?@?@? ?>?>??>??>>?>=>=>=>>==>=<==<=<==<=<==<;<;<;<; :;::;:;;:;:;:;:9:989898889878878767676565654545434343 233223223232321212101010010 /0/0//0//0/ .//../././.-.-,-,,-,-, +,,+,++,++,+*+*+**)*)*)*)*)*)()()(()()('('('('('('(('('('('('('('('('('('('(2343433434545656565656767676767878989:9:9::;:;::;:;<;<;<=<=<=<<=>=>=>==>=>=>>?>?>>?>?>?@?@?@?@?@A@A@@A@ABAABAABABABABCBCBCBCBCBCBCDCDCDCDCDCDCCDCDCCDDCDCCDDCDDCCDDCDCDDCCDCDCDCDCDCDCDCDCDCDCDCD CDCDDCDCCDDCCDCDCDCDCDCCBCBCCBCBCBCBCBCBABABBAABABABAABA@A@A@A@?@@?@?@?@?>?>??>?>??>=>=>=<=<=<=<=<;<;<;<;:;;::;:9:9:98988987878767656566543434343432332323212122101010/././.-.-.-.-,-,+,+,+*+**)*)*)())())()(()('('('('(('('('('('('('('(('('('('('('((2343434434545656565676767878789:9:9:;:;::;:;:;<;<;<=<<=<=<=<=>==>=>?>?>?>?@?@@?@A@A@@A@A@A@A BABAABAABBABCB CBCCBBCBBCCBCBCBCDCDCDCDCDDCDCDCDDCDDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCCBCBCBCBCBCBCBABABAABABA @A@AA@A@A@A@A@?@@?@?@?@?@?>?>?>?>?>=>=>=>=>=<==<=<=<<;<;<;:;:9:9:99::989898787876767676565454323322322332232211212211 01010010010/00/0/00/./../.-..--..- ,-,,--,-,--,+,+,,+,++,+*+*+**+*+*+**)*)*)*)*)()()()()('('('(('('('('('('('('(('('('('('('('('('('('('('('('('(343434345454454554455456565676776767877878988989:9:9:;:;<;<;<;<=<==<<=<=>=>>=>=>=>?>??>?>?@?@?@?@A@A@@A@A@@ABABAABABCBCBCBCBCBCDCDCDCCDDCCDCDCDCDDCDCDDCDCDEDCDCDCCDCDCDCDCDCCDCDCDCCBCBCBCBBCBBCBABABABABBA@A@A@A@@A@A@?@ ?@??@?@@?@?>?>?>?>=>=>=>=>=<=<=<=<==<;<;<;;<;<;:;:;::;:9:9:988987877876767676565654545454454343232323212121211010/0/./././.-..-.-..-,-,,--,+,,+,+,+*+*++*+**)*)*)*)()()('('('('('('('(('('(('('('('('('('('('(343433434544545 656565656656767678787898989989:9:9:9:;;::;:;<;<;<;;<=<=<=>=>=>=>?>?>??>?>?@?@?@@?@??@A@A@A@AA@@AA@A@A@ABAABABAABABABCBBCBBCBCBCBCBCBCDCDCDCDCDCDCDCDDCDEDEDEDEDEDEDEDCDCDCDCDCDCDCCDCDCDCBCBCCBCBCBCCBCBCBBCBBCBABABABA@A@A@?@??@@?@?@?>?>?>=>>=>=<=<==<;<;<;:;:9:9:989998989878787676765656565454454545434343233223232121211011010/0/0/././../.-.-.-,--,-,+,+,+*+*+*+*)*)()()(('('('('('('('('('('('('('('('('('('('('(('('(34345445544565676767678787898989:9:;:;;::;<;<;<;<=<=<= >==>==>=>=>=>?>??>>?>>?@?@?@@?@A@AA@ABABABABCBBCBCBCBCBBCBCDCDCDCCDCDCDCDDCDCDCDCDDEDEDEDEDEDEDEDEDEDEDEDEDEDCDCDCDCCDCDCDCDCBCBCB CBCBCCBCBBCBCBABA@A@A@AA@A@@A@@A@?@??@?>?>??>=>=>=<=<=<=<;<<;<<;<<;<;:;:;::;:;:9:9:9:9989898898987878787676767656565654545434343232321212110/0/0/.//.././. -..-..--.--.-,-,-,-,+,+,+,+*++*+*++**)*)*)*)*)()()()()('('('('(('('('(('('('(''(('('('('('('('('('('('(343454545656567676678787887898989:99:;::;;::;:;<;<;<;<=<=<=>=>=>=>?>??>>?@??@??@?@A@ A@A@@A@A@A@AA@ABABABABABABCBCBCBCBBCBCBCDCDCDCDDCCDCDCDEDDEDEDEDEDEDEDDEEDEDEDEDEDEDEDEDEDEDCDCDCDDCCDCDDCDCDCBCBCBCBCBCBCBABABBABA@A@A@@A@?@?@?@?>??>??>?>=>=>=<==<=<=<;<;:;:;:998898787878787676765656566565454545434343232122121210110010/0/0/0/././.-.-.-.-,-,-,,-,+,+*+*+*+**)*)*)*)()()()()()(()('('('('('('('('('('('('('('('('('(343434343454545656565676767877878787898989:9:9:9:9:;::;::;;:;<;;<;<;;<=<= >==>>==>==>=>?>>?>?@?@?@A@A@A@A@AAABABABABABABCBCBBCBBCBCDCDCDCCDCDCDCDCDCDCDDEDEDEDEDEDEDEDED EDEDDEDEDEEDEDEDEDEDEDEDEDEDEDCDDCDCDCDCCDCDCBCBCBBCCBCBCBCBABABBABBABABA@A@A@A@?@@?@??@??@?>?>?>>?>=>=>=>=<=<=<==<=<;<;<;;<;<;:;:;:9::9:9:9989878778787676767656545454343434323232121211010/0/0/././.-.-.-,-,--,,-,+,+,+*+*+**)*)*)*)()())()()('('('(('('('(('(('('('('('('('('(3434 5454554454565655676767667878789898989:9:;:;;<;<;<;<=<=<=<=>=>=>?@? @??@@?@??@?@A@AA@A@AA@A@@AABABABABBABCBCBCBBCCBBCBBCBBCDCDCDCDCDCDCDCDCDCDEDEDEDEDEDDEDEDEDEDEDEEDEDEDEDEDEDEDEEDEDEEDEDEDED EDEDDEDDEDEDEDEDEDEDDEDEEDDCDCDCDCDCDCDCDCBCBCBCBCCBCBCBCBBCBCBABABABA@A@?@? @??@@??@??@?@?>??>?>?>>?>>?>=>=>= >=<=<=<<=<=<=< ;<<;<;<;<;<;:;;:9:9:998987878767676765656545434323212101101010/00/0/.//.//.-..-.-.-,-,-,+ ,+,,+,+,+,,+*+*++**+**)**)*)*)*)())(()()('('('('('(('('('('(('('('('('('('(343344345454565656565676676787887898989:9:9:9:;:;:;<;<;;<;<=<=<=<=>=>=>?>?>??>?>?@?@?@?@?@A@@AA@A@A@ABABABAABABBABCBCBCBCBBCBCBCDCD CDDCDCDCDCCDCDEDEDEDEDEDEDEDEDEEDEDEDEDEEDDEDEDEDEEDEDEDDEDEDEDEDEDEDEDEDEDEDEDEEDEDEDEDEDDCDDCDCDCDCDCDCBCBCBBCBCBCBABABA@A@AA@@A@A@@?@?@?@?>?>?>=>>=>=>=>=>>=<=<;<;;<;;<;:;:;:;:;::9 :9:9::99:99898989878787787676565656556565454343432323321221212101010/0/./..//.-..-.-.-.-,-,-,+,+,+*+*+**)*))*)*)()()(()('('('('('('('('('('('('('('('('('('(343433454545656565676787898989:9::9:;:;;<;<<;<;<=<=>=>=>?>?>?>?@?@?@?@?@A@A@A@A@ABABBAABABABCBBCBCBBCBCDCDCDCDCDCDCDCDEDEDEDEDDEDEEDEDEDEDEDEEDEDEDEDEDEDEDEDEDDEDEDEDEDEDEEDDEDEDEDDCDCDCDCDCDCDCDCBCBCBCBCBBCCBABABABABA@A@@AA@AA@A@@A@@@?@@?@?@?>?>>?>?>=>=>=<=<;<;<;<;:;:;:9:9::99 89899898998787876565 454545544544543432323212121011010/0/0/./.-.-.-,-,-,-, +,++,,+,++,+*+*+*)**)*))*)*)()())()('(('(''('('('('(('('('('('('('('('('(3434 545445454454565656 7667677676776787788787898989:9:;::;:;:;;<;<;<=<=>=>=>=>?>?>?@?@?@A@A@@A@ABAABABABC BCBBCBCBCCBCDCDCDCDCCDCDCDCDDCDEDEDDEDEDEDEDEDEDEEDEDDEDEEDEEDEDEDEEDDEDEDEDEDEDEDEDDEDEDDCDCDCDDCDCCDDCDCDCBCBCBBCBCBCBCCBABABABABAABA@AA@A@AA@A@?@?@?@@?@?>?>?>=>>=>==>=<=<=<;<;;<;;<; :;:;::;::;:;:9:9:9898989878767676765656565455434323212122112101010/0//00//0/./././././. -.-..-..--.-,-,-,-,+,+,,+*+***+*)**)*)()('('('('('(('('('('(('('('('(('('('('('('('('('(''('(43434545656565656567667766787787887898989:9:9:;:;:;<;<;<=<<==<=<=>=>=>=>?>? @??@?@@?@@?@ABAABBABABCBBCBBCBCDCDCDCDCDCDEDDEDEDEDEDEDDEDEDEEDEEDDEFEFEEFEDEDEDEDEDEDEDEDEDCDCDCDDCDCDCDCBCBCBCBCBCBABABABBA @AA@AA@A@@A@A@?@@?@??@? >??>?>??>?>=>=>==>=>=>=<=<=<<=<;<<;<;:;:;:;:9:9:98989878767676765656565455445434434343432322332121221010110010010/0/0/0//0/./.-.--.-.- ,--,-,,-,,-,+,+*+**++*)*)*)*)()()()('('('('('('(('('('('('('('('('('(345454565656567676787787788789898989:9:9:9:;:;;<;<=<=>=>=>?>?>?>?@?@?@@?@A@A@A@ABABAABBABCBCBCBCBCDCDCDCDDCDDCDCDEDEDEEDEDEDEDEDEDEDEDEDEEFEFEFEFEFEFEFEFEDEDEDEEDEDDEDEDEDEDCDCDDCCDCBCBCBCBABABABA@A@AA@A@@A@?@?@@??@?@?>?>??>?>=>>=>=<=<;<;<;:;:9:99:98989878767656565654545454343434323233223212121210/00//00/./././.-.-,-,--,+,+,+*+**+*++*+*+*)*)**))*))*)()()()('('('('('('(('('('('('('('('(('('('('('('(34545656567676787887789889899889:99:9:;<;;;<;<;;<=<=<=>=>=>=>?>>?>?>?@?@A@@A@@A@ABABAABABABABCBCBBCBBCDCDCDCDCDEDDEDEDEDEDEEDDEDEDEDEEFEEFEFE FEFEEFFEFEFEFEFEFEFEFEFEFEFEDEDEDEEDEDEDEEDEDEDEDCDCDCCDCDCDDCDCBCBCCBCBBCCBABABABAABA@A@AA@ ?@??@?@??@?> ?>??>>?>>??>=>=>=>=>=<==<==<==<==<<=<;<;:;:;:;:9:9::9:98989899878767676767656656656545455454343343212121212101101011010/0//0//0/.//..//. -.--..-.-.-,-,--,-,+,+,++,++,+*+**+*+**+*)*)*)*)*)*)()()()()('('(('('('('('(('('('('(3454545545456567667877898898989:9:;:;:;:;<;<=<==<=<=>=>=>=>?>?>?@?@@?@?@A@A@@AA@@ABABABAABCBCBBCBCDCDCDCDCDCD EDEDEDDEEDDEEDEDEDEDEDEEDEFEFEEFFEEFEFEFEFEEFEFEFEF EFEFEFFEFFEFEEFEFEFEFFEFEFEFEDEDEEDEDEDEDDEDEDDEDEDCDCD CDCCDCCDCDDCDCBCBCBCCBCBCBCCBABABBABABA@AA@A@?@?@?@?>?>?>=>=>=<=<;<;<;;<;:;:9:99:99:98988987878767676565665454455434323232321212122101010 /0/0//0//.//././/.-.--..-,-,--,-,-,+,+,,+*+*+*+*)*))*)()())(()()('('('('('('(''('('('(''('('('('('('('(4343454545656767878877878989899889:9:9:;:;:;<;;<;<<<;<;<=<=<=>=> ?>>?>>?>??>>?@??@?@?@@?@A@AA@A@@ABABABABBAABBAABBABABCBBCCBCCBCBCDCDCCDCCDCDCDEDDEDDEDEDEDEDDEDEDEDEFEFEFEEFEFEFEFEEFEFEFEFEFEEFFEFFEEFEFFEFEFEFEFEFEFEFEFEEFFEFEFEFE EDDEDEEDEDEEDEDDEDDEEDEDCDCDCDCCDCDCBCBCBCBABAA@A@@A@@A@?@@?>?>?>=>=>=>=<=<=<==<=<;<<;<;:;:9:9:9:9898989878788787676765654545434343232321212101011010/0/0//0/././.-..-,-,+,+,+,++,+*++*+*+*)**)*)*)*)()()()())('('('('('((('('('('(('(''('('('('('(45445445 655665565656767676678787787898988989:9:9:;:;:;<;<<=<=<=<<=>=>?>?>?@?@@??@??@A@AA@ABABABBCBCBCCBCBCDCDCDCDCDDCCDDCCDCDED EDEDEEDEEDEDEDEDEDE FEEFFEFEEFEFEEFEEFEFFEEFEFEFEFEFEFFEFEFEFFEEFEFFEFEFEFEFEFEFE FEEFEEFFEFFEFEEFEFEDEDEDDEDEDEDEDEDEDCDCDCDCDCDCDCBCBCBCBCBABABAABBA@A A@@A@A@A@A@?@?@?>=>=>=<=<=<=<=<;<;<;:;:;:9:9:98989878878767676565654543443434323221211210101010 /00//00/00/././../.-.-.-.-,-,-,+,+,+*+*+**+*)*)*)*)()()(()(()('('('('('('(('('('('('('('('('('('('('('(4545456565656766767667 87877877878988989989:9:99:99:;:;::;<;<;<;;<;<=<=<=<=<=<=>==>?>?>>??>>?@??@@?@?@?@A@A@A@ABA BABAABABABABBABCBCBCBCBCDCDCDCDCCDCDEDEDDEDEDEDEDEFEFEEFFEFEFEEFEFEFEFEFEFEFEEFEFEFEFEFEFEFEFFEFEFEFEFFEEFEFEFEFEFFEFEFEFEFEFEEDEDEDEDEDEEDED EDDEDDEEDDEDCDCDCDCDDCCDCBCBCBCBCCBCBCBABABABABAA@AA@AA@A@?@?@?@?>?>?>?> =>=>>=>=>>=<=<==< ;<;<<;<;<<;:;:;:;::;::9:98989878788787876765656545454343432323322112101011010/0/0/././.-.-.--.-,--,-,+,+,+,+,+*+*+*++*+*+*)*)*)()()(()('('('('('('(('('('('('('(('('(('('('('('(('('((''(4545454545656655676767878778878 98898988989:9:;:;::;:;<;<;<<=<=<==<=>=>=>?>>?>?>?@?@@??@?@A@A@A@ABABABABCBBCBCBCBCBCDCDCDCCDCDEDEDEDEDEDEDEFEEFFEFEFEFEFEFFEFEFEFEFEFEFEFEFEFEFEFEFEFEEFEFFEEFEEFEFEFEFEFEEFEFEDEDEDEEDEDEDEDEDCDCCDC DCDCDCCDCDDCBCBCBCCBCCBABABAABABABA@AA@A@A@@AA@?@?@@?>?>??>?>?>=>=>=>=<=<<=<=<;<;<;;<<;:;:;::9::99:9::989878787676676566565656545454343432322121010/0/0/.//./../.-.-..--.-,-,-,+,++,+,++*)*))*)*)()()()()('('('('('('(('('('('('('((45454545456556766789:9:9:;:;;:;<;<;<;<=<==<<=>=>=>=>?>??>?>?@?@A@A@A@@A@ABABABBABAABCBCBCBCDCDC DCDCCDDCCDCCDEDDEDEDEDEDEFEEFEFEFEFEFEFEEFEFFEFEEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFEFEEFEDEDEEDEDEDEDDEDEDCDCDCDDCDCDCDCDCBCBCBCBCBABBAABAABABAA@AA@AA@A@?@@??@?@?>?>=>==>=>=>=<=<=<;<;;<;;<;:;;:;::9:9:98989878788787 67667767766765656545434343432212121121010/00/00/././.-.-.-, -,--,-,-,--,+,+,+*++*+*+*++*+*)**))*))*)())()()('('('('('('(('('(('('('('('('('('('('('('('('(454545656656567676787898989:99:99:;:;::;::;:;;<;;<;<;<;<<=<<=<=<<=>=>=>=>=>?>?@ ?@@??@@?@?@A@A@A@A@ABAABBABABABCBCBCBBCBCCBCDCDCDCDCDEDEDEDEEDEDEDEDEFEEFEFEFEFEFEFEFEFEFFEFGFGFGFGFGFEFEFEFFEEFEEFEFEEFEDEDDEEDDEDEDCDCDCDCDCBCBCCBBCBCBABABAABAABAABABBAABA@A@A@A@@?@??@?@@??@?@?>?>?>=>>==>>= <=<=<=<=<=<;<;<;:;;::;::98989878767767667656545454343232322121210100110/0//00/./././.-.-,-,-,+,++,,++,,+,++**++ *+**+**++*++*)*)*)*)**))*)()(()(()()('(('(('('(('(('('('('(('('(('('('('('('(('('('('('(4545454565566565567678787898988989:9:9:9:;:;:;<;<;<<=<=<=>=>?>?>?@?@?@?@A@A@A@A@ABABABABABCBCCBBCBBCBCDCCDCCDCDCDCDEDEDEDEDEFEFEFEFFEEFEFEFEFFGFGFGFGFGFGFGFGFGFFGFEFEFEFEFEFEFEEFEFEFFEFEFEFEEFEDEDEDEDEDDEDEDEDCDCDCDCDCBCBCBCBABBABBAABAA@A@A@?@?@?>?>?>=>=>=<==<==<=<;<;<;:;::;:::9:989989878787656656566545434343232212101010010/0/././.-.-.-.-,-,,--,+,+,+,+* +**++*+**+*)*)*)*)()()()('('('('('(('('('('(('('('(('('('((''(545545656 76766776767767877878989889989:99::9:9:;:;:;<;<;<=<=<=<=>=>=>=>?>?>??>?>?@?@?@A@ABAABBABAABCBBCBCBCCDCDCCDCDCDEDEDEDEDEDEFEFEFEEFEFEFEFEFFGFGFGFGFGGFGGFGFGGFFGFGFGFFGFFGFGFFGGFGFGFGFEFEFEFEFEFEEFFEFEFEFEDEDEDDEDEDEDEDCDCDCCDCDCBCBCCBCBCBABABBAABA@A@A@@AA@@A@?@?@?>??>??>?>?> =>==>==>>=>=>=<=<;<;<;<;:;:;::;:9:99:9:9898987878787877876767676565654543434433432322121210100110010/0/0/0/0/ ././/.//../.-.--.-.-,-,-,++*+*+*) *)**)*)*))*)()())()()()('('(('('('('('('('(('('('('('('('('('('('('((54544544565565565676676677678988989:9:9:;:;;:;<;<;<<;<=<=<=>=>=>?>??>?>?>?@?@?@A@AA@ABABABCBCBCBCCDCDDCDCDEDEDEDEFEEFFEFEEFFEFEFEFGFFGFGFFGFFGFGFGGFGFGFGFGGFFGFGFGFGFGFGFGFGFGFGFGFEFFEFEFEFFEFEFEEFEFEFEDEDEDEEDEDEDEDEDCDCCDCDCDCDDCBCCBCBCBCBCBABBAABABA@A@A@AA@@A@?@?@@?@?@@?>?>?>?> =>==>=>>=>=>=>=<=<;<;<;:;;:;;:::9:9:9:9898787876776676565565454544543434343232332 12211221221010100110/0//0/./.././. -..-.--.--.-,-,+,+,++*++*+*+*)*)*)*)())()()()('('('('('('('('(('('('('('('('('('('(4554456567676767678787878789:9:9:;: ;:;;:;;::;<;<;<<;<=<<<==<=<=<=>=>=>?>?>?@?@?@?@?@A@AA@ABAABABAABCBCBBCBCCDCDCDCDCDEDDEEDEDEEDEFEFEEFEFEFEFEFGFGFFGFGFGFGFGFGFGFGFGFGFGFGGFGFGFGGFGFGFGFFGFGFGGFGFGGFGFGFGFGFGFGFEFFEFFEFEFEFEFEEFEEFEFEDEEDDEDEDEEDEDDEDCDCDCDCBCBBCBBCBCBABBABABBA@A@A@A@?@?@?@?@?>??>?>?>=>>==>=<=<=<;<;<;::;:9:99:98989878787676 56655665565566545454343432322323212101100110/0/0/00/./.-.-..-,-,-,+,+,+,++*++*+*)*)*))*)*)()('('('(('('('('('('(('('((45456565665676677678787898989:9:;::;:;:;<;<;<=<===<=>=>=>=>?>?@?@@??@A@@A@A@ABAABABCBCCDCDCDCDCDEDEDEDEDEDEDEFEFEFEFEEFEFEEFEFEEFEEFFEFEFGFGFGFGFGFGFGFGFGFGFGGFGFGFGFGFGFGGFFGFFGFGFGFGGFGFFGFGFGFGFFGFFGFFEFEFEFEFEFEEFEDEDEDEDEDCDCDCDCDCCDCBCBCBCBBCCBABABA@AA@A@?@?>?>?>=>=>=>=<=<=<;<;<;::;:9:9:989898787878767676765656655654545454323232321212212101010/0/0/././.-.--.-,-,--,+,++*+**+*+*+*)*)**))*)()()()()('('('(('('('(('(('('((''('('('('('(('('('(455445656567677678778788778988989:;::;:;<;<;<=<=<==<=<=>=>=>==>?>>??>??>?@?@A@A@A@A@ABAABABABABCBCBBCBBCCDCDDCDCDED EDEEDEDDEEDEFEFFEFEFEFFEFEFGFFGFGFGFGGFGFGGFGFGFGFGFGFGFGFGFGFGFGFGFGFFGFGGFGFGFGFGGFGFGFGFGFGFGFGFGFFFEFEFEEFEFEDEDEDEDEDEEDEDCDCDDCDCDDCBCBCBCBA ABABBAABAABA@A@A@A@A@?@@?@@?@@?@@??@?>??>=>=>=>=<=<==<<==<;<;<<;:;:9:9:9:989989989878788787676676545454554454344343443232232121121121 011010010010/0/./././../.-.-,-,-,,-,+,+,,+,+*++*+*+*++*)*)*)*)*)()('('('('(('('('('('('('('('('('('('('('('('565567667678778787898989:9:;<;<<;<<;<;<=<=<=>=> ?>??>?>??>?@?@@?@A@ABABABAABCBCBCBBCBCCDCCDCDDCDCDEDEEDEDEEDEDEDEFEFEFEFEFEFGFGFFGGFGGFFGFGGFGGFGFGFFGFGFGFGFGFGFGFGFGFGFGFGGFGGFFGGFGFFGFGFGF GFGGFGFFGFFEFEFEFEFFEDEDEDEDEDCDCCDCDDCCDCDCBCBCBCBCBCBBABABA@A@A@?@?>?>?>=>=>=<=<<=<=<;<;:;:;:9:98989987877887876765656565454543432323232122121010/0/0/0/././.-..--.-,-,-,-,+,+,++,++*+*+*+*)*)*)()())(()('('('('('(('('('('('('('('('('('(('(56556 5667767766767878787898989:9:9:;:;:;:;<;<;<;;<=<=<==>==>>=>=>=>?>>?>?>?>?@?@?@?@A@AA@ABABABABABCBCBCCDCCDCDEDDEDEDEDEFEFEFEFEFGFGFGFGFGFGFFGFGGFFGFGFGFGGGFGFGHGHGFGF GFGGFGFGGFFG FGFFGGFGFGGFGFGFFGFEFEFEFEFEFEDEDEDEDEDCDCBCBBABABA@A@A@A@?@?@?@@?@?>?>?>=>=<==<=<;<;<;:;:;;:;:9:9:98989878767676765656545454343433232321212101010/0/0/././.-.-.-,-,-,,-,+,,++ *+**+**+*+*)*)*)*)()()('('('(('('(('('('('('('('('(5656565567678787787898989:9:9:;:;<;;<;<;<=<=<=>==>==>=>?>>?>?@?@?@?@@??@A@A@A@ABABABCBCBCCBCDDCCDEDEDEDEFEFEFFEFEFEF GFFGFGFFGFFG FGGFFGFGFGFGFGFGFGGFGHGHGHGHGHGFGFGGFGFGFGFFGFGFGFGFGFGFGGFEFEFFEDEEDEDEDEDEEDCDCDCDCDCBCBBCBCBBABA@A@A@?@?@?@?@?>?>>??>=>=>=>=>=<=<;<;<;<;<;;:;:;:9898987876767656545434332332232 122121121121010/0/0/././/.-.-.-.-,-,,-,+,+,+,+,++*+*+**+*++*)*)*)()())()('('('('(('('('(('('('('('('('(565565655656766766767 877878878878989889889:9:99:;:;:;:;;:;<;<;<=<=<==>=>=>?>?>?@?@?@?@A@A@A@A@ABABABABBABCBCBCDCDCCDCDCDEDEDEFEFEFEFGFGFGFGFGFGGHGHGHGHGHGGHGHGHGHGGHGHGHGHGHGFGFGGFGFGFFGGFGFGFGFGFEFEFFEFEFEDEEDEDEDEDDEDCDDCCDCDCBCCBCBCBBCBBABABABA @A@AA@A@AA@?@?@? >??>?>??>?>=>>=>==>=<=<=<;<<;<;; :;;:;;:;:;:9:9:989898787676767767656566545434343232321212121210101010/0/0/0/././.-.-.-,-,-,+,,++,+,++*+*+*+*)*)*)*)**)()()()('('('( '(('('(('('('('((('('('('('('('(('(('('('('('('('('('5456566556 7667667767767 87787877878989:9:9:;:;<;;<;<;;<== >==>>==>==>?>?>?>?@?@?@?@?@@A@@A@A@A@ABABABABCBCBCBCDCDCDDCDCDEDEDEDEFEFEFEFEFGFGFGFGFGFGFGHGHGHGHGGHGHGHGHGHHGHHGHGHGHGGHGHGHGHGHGGHGHGFGFGFGFGFGFEFEFEFEFEFEDEDEDCDCDDCDCDCBCBCBBABABBABABA@A@A@A@@AA@?@??@?@?>?>?>=<;<;<;;:;:;:;:9:98989878767656545434343321210101010/0/0/./.-.-,-,-,,-,+,++,+,++ *+**+*+**+* )**))*))*)*)*)())(())()(())('('('(('(('('('('('('('('('('('('('(565656767898989:9::9:;:;<;;<;<=<=<==>>=>=>=>?>?>?@?@?@?@A@A@A@A@ABABAABABABCBCBCBCDCDCDDCDEDEDEDEEDEDEFEFFEFEFEEFGFGFGFGFGGFGFFGFGHGGHGHHGHGGHHGHGHGHHGGHHGHHGHGHGHHGHGHGGHGGHGHGGHGHGHGHGHGGHGHHGHGHGHHGHGHGHGHGFGFGFGFGFGFGGFGFGFGFEFEFEFFEFEDEDEDCDCDCCDCDDCDC BCBBCBCCBBCBBBCBABA@AA@A@A@?@?@?>?>??>>?>=>>=>=>=>=<=<=<;<;<;;:;:;:9::9::99:9898787876765454544543443433232332332122112212101010/./.-..--.--.-,-, +,,+,++,+,++*++**+*+*)*)*)*)*)()()()(()('('('('((''('('('('(('('('(('('('('('(565655676787878789889889:9:99:99:;::;:;:;;:;<;<;;<;<=<=<=>=>=>==>?>?>?@??@??@@?@A@A@A BAABAABABABCBBCBBCBCCBCDCDCDD EDEDDEDEEDEDEFEFEFEFEFEFEFGFGFGFGFGFGFGFGFGHGHGHGHGHG HGHGGHGGHHGHGHGHGHGHGHGHGHGHGHGHHGGHGHGHGHGGHGHGHGHGHGFGGFGFGFFGFGFGFEFEFEFFEFEDEDEDEDDEDED CDCDDCCDCDDCDCBCBCBCBCBCBCBABABA@A@ ?@?@?@?@?@?>?>?>?>?>=>=<;<;<<;;:;:;:9:99:9:9898787878776765656545434332322332121221011010/00//0/.//./.-..-.-,-,-,-,-,+,+++,+*+*+*+*)**))*)**)*))**))**)()()('(('('('('('('('('('('('('('(''('('(('('('('((''(567678778787789898989:9:9:;:;:;;:;:;<;<<;<;<=<==>==>>=>=>?>?>?@?@?@?@A@A@A@A BABABAABAABABCBCCBBCBCBCDCCDCCDCDCDDEDEDE FEEFEEFEFFEFEFGFGFGFGFGHGHGGHGHGH GHHGHHGGHGHGHGHGHGGHGHGHGHGHGHHGHHGGHGHGHHGHGHGHGHGGHGHGHHGHGHHGHGGHGFGFGFGFGFGFGFFGGFGFEFFEFEFFEFEFEFEFEFEFEDEDDEDDEDEDEDCDCDCDDCDCDCBCBCBABABA@A@A@?@?>?>=>==>=<=<=<;<<;<;<; <;;::;;:;::;:;:9 899898998987887877876765654545434343323212101010/00/00/0/./././/.-,-, +,,+,+,,+,+,+*+*)**))*)*)())())(()()(()('('('('('('('('('('('('('('('('(5656656656766767877887898989:9:;:;:;<;<;<=<==>=>?>?@?@A@ABABAABABCBBCBCBCDCDDEDEDEDEDEDEFEFEFEFEEFEFGFGFFGFGFGFGHGHGHGGHGHGHHGHHGHGHHGHGHGHGHGGHGHGHHGGHGHGHGHGHGHGGHHGHGGHGGHHGHGHHGHGHGGFG FGFGFGFFGFGFGFGGFGFEFEFEFEDEDEEDEDCDCDCDCBCBCBABBABBABABA@AA@@A@A@@A@?@?>?>?>?>?>=>=>= <=<<=<=<==<;<;:;:;::;::;:9:9:98987878767677667656545454 3433443343323232321212121010/00/0/.//.//.-.-.-.-,-,-,-,+,+,+,+++*+*++**+*+*)*)*)*)()())()('('('('('(('('('('('(''('('('('('('(56565676787898989:9:;:;:;<;;<<;<=<<==<=<=>=>=>?@?@?@A@A@A@ABABABCBCBCBCDCCDDCDEDEDEDDEDEFEFEFGFGFGFFGFGFGHGHGHGGHGHGHGHGHGHHGHGHGHGHGHGGHGHGHGHGHGHGFGFGGFFGFGFGFGFEFEFEFFEFEFE DEDDEDEEDDEEDCDCDCDCDDCCDCBCBCCBCBCCBABABABA @A@@A@AA@A@A@A@?@?>?>=>>=>=<=<=<;<;:;:9:9:9898988987878778876767656566565 455445545543434343343323212121210/0//0/.//././.-..-.-,--,-,+,+,+,+*++**+*)*)()()()('('('('('('('('('('('(565567676787898989 :9::9::99:;:;:;<;<;<=<=>=>?>>?>?@?@?@@?@A@A@ABABAABABCBBCCBCDCDEDDEDEDEDEFEFEFFEFEFEFGFGGFGFGFGHGHGHGHGHGHGHGHGHIHIHGHGHHGHGHGHGGHHGHHGHHGHGHHGHGFGFGFGFGFGGFEFEFEFEDEDEEDEDEDCDCDCBCBCBCBCBABBABABA@AA@@A@A@?@?@?>?>=>=>=<==<=<;;<;<;:;:9:99:98998998987876767656565654543443344332323212101010/0/0/./../.-.-..-,-,-,+,+,+*+*+*+*+*)*)**)*)()('('('('('('('('('('('('(('('(('('('('('('('('('('('('(5656565676767767878789:9:99::9:;:;:;:;<;<=<=>=>>==>?>>?>?@?@?@A@A@ABABABCBCDCDCCDCCDDEDEEDEDE FEEFEEFEFFEFEFEFGFGFGFGGFFGFGFGFGHGHGHGHHGHGHGHGHGHHIHIHIHIHIHIHIHHIIHIHIHGHGHGHGHGHGGHGHGHGHGHGFGFGFGF EFFEFFEFEEFEFEDEDEDEDEDEDCDCDCDCDCCBCBCBABABA@A@?@?@??@@?>?>=>=>=<=<=<=<;<<;:9:9:99::9899898787676565654543433433233223321211211210101010/0/0/0//0/./.-.-.--.-,-,--,+,+,+*+*)*)*))*) ()())())()())('('('('('('('('('('('('(''('(65676767667877878989:9::9:;:;<=<=>=>=>>=>?>??>?>?>? @?@??@?@@?@@?@A@A@ABABCBCBCBCBCDCDCCDCDEDDEEDEEDEFEFFEFEFFEFGFGFFGGFGFGFGHGHGHGHGHGHGHHIHIHIHHIHIHIHIIHIHIHIHIHIHHIHIHGHGHGHGGHG HGGHGGHGHHGFGFGFGGFGFGFEFEF EFEEFEEFEFEDEDEDEDEDDCDDCDCDCDCDCCBCBCBCBAABABAABABA@A@A@@A@?@?@?@?>?>=>==>=<=<=<=<<;:;:;:;:9:9:9:98989878788787677677676565654343434332332323321221211210101010/0/0/././.-.-.-.-,-,-,++,+*)*))*)()()()('(('('('('('('('(('('('('('('('('('('(('(567678787898989:9:;:;<;;<<;;<;<=<=<<=<=>=>>?>?>?@?@?@?@A@A@ABAABABCBCBCBCBCDCCDDCDDCDEDDEDDDEFEFFEFEFEFGFGFGFFGFGFGFGHGHGHGHG HGHGHGHGHGHHGHIHIHHIHIHIHIHIHIHIHHIHIHHIHHIHIHIHIHIHHIHIHIHGHHGHGHGHHGHGHGHGHGHGHGHGFGFGFGFEFEFEEFFEFEEFEDEDEDCDDCDCCBCBCCBABABA@A@A@?@?@?>?>=>=>=<=<=<<;<;<;<;:9:9:989989878878767656545455454343434323212101010/0/0/././.-.-.--.-,--,+,++,+*+*+*)*)*)*)()()('('('('(('('('('('('('(65676767878789898989:;:;:;<;<<;;<=<<=>>?>?>?>?@?@?@?@A@A@ABABABAABABCBCBCDCDCDEDEEFEFEFGFFGFGFGFGGFGFGFGFGHGHGHGHGHGHGHGHIHIHHHIHIHIIHIHIHIIHIHIHIHIHIHHIHHIIHIHIHIHIHHIHIIHIHHIHIHIHIHIHIHHGHGHGGHGHGHGHGFGFGFFGFGFGFGFGFEFEEFEDEDEDEEDCDDCCDDCCBCBCBCBCBABBABBABBAABABA@A@A@A@ ?@?@?@??@?@?>?>?>>?>?>=>>==>=<=<=<=<<;<;<;:;:;;:;:;:9:989878878767656545455434433443443 23323322322321212101010010/00//0/./././.-..-.-,-,-,+,,+,+*+*+*+*)*)*)()())()()('('('(('('('('('('('('('('('('('('(6567667676787878878989:9:;:;:;<;;<;;<=<=<=>==>>?>?>?@?@?@A@A@@ABABABABABCBCCBCDCDCDEDEDDEDEDEFEEFEFEFGFGFGGFFGFGHGHGGHHGHGHGHGHHGHGHIHIHIHIHIHIHIHIHIIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIIHIHIHIHIHIHIHHGHGHGHGHHGGHGFGFG FGGFGFFGFFGFGFEFEFFEFEFFEDEEDEEDEDCDCDDCBCCBCBABA@AA@?>?>=>=>=>=>=<=<=< <;<;<;<;<<;<;<;:;:;;::;:9:989898987877876767654545434323232321212112101100110/00/0/././.-.-.--,-,-,+,+,,+,,+*+*++*+*+*)*)**)*)())(()()('(('('(('('('('('('('('('(('(6567678787887898989:9:9:9:;:;:;<;<=<=<<=<=>=>>?>>?>?>?@??@ A@@A@@AA@A@ABAABABABCBCBCBCBCDCDCDCDCDEDEDEDEEEFEFEFEFEFGFGFGFGFGHGHGHGHGHGHGHIHIHIHIHIHIHIHIHIHIHIHIHIHIHIIHIHIHIHIHIHIHHIHIHIHHIHIHIHIHHGHGHGGHG HGHGHGGHGHHGFGFGFEFEFEFEEFEEFEDEDEDDEDCDCDCBCBCCBCBAB ABAABBAABBA@A@A@A@?@@?@?@?>?>=>>=>==>>=<=<=<=<;<;<<;:;:;:9:9::9:9:9:989878767767656565454543433432332321212101010/0/0//0/./.-.-,-,-,,-,+,+,++,+*+*+**++*)*)()()('((' ('('(('(('('('('('('('('(676766787878878789898989:99::9:;:;:;:;:;<;<;<=<=<=>=>=>?>?>??>?@A@A@@A@ABABABCBCBBCBCBCDCDCDDCDEDEDEEDEEFEFEFEFEFGFGFGFGFGHGHGHGHGHGH IHIHHIHHIIHIHIIHHIHIIHIHIHIHIHIHIHIHIHIHIHIHIHIHIHHIHIHIHIHGHGHGHHGHGHGHGGHGHGFGFGFGGFGGFEFE FEEFFEEFEEFEFEDEEDED EDDEDDEDDEDCDCDDCDCBCCBCBCBBCBABABABA@A@A@?@?@?>?>??>=>=>==>=<=<=<<=<;<;;<;:;:9:98987878767667667656556556543443232321210/0/.//../../.-.- ,--,-,,-,-,,++,+,+,+*+*+**+*)**)*)**))*)()()()('((''('(('(('('('('('('('('('('('(6767676787898989:9:9:9:9:;:;:;:;<;<=<<=>=>=>=>=>>?@??@?@@?@A@A@@AA@ABABABCBCBCDCCDCCDCDCCDEDEDEDEE FEFEEFEFFEFEFGFGFGFGFGFGHGHGHGHHGHGHGHGHIHIHIIHHIIHHIHHIIHIHIIHIIHIHIHHIHHIHIHIHIJIHIHIIHIHIHIHIIHIHIHIHIHIHIHIHHGHG HGGHHGHGGHGGHGFGFGFGGFFGFGFEFEFEDEDEDDCDCDDCBCBCBCB ABAABAABABA@ A@A@A@A@A@?@@?@?@?>?>?>?>>?>=>=>==>=<=<=<;<;<;<;;<;:;::9::9:98989989878767656655656545445545434434343232321210110010/00/0/./.-.-.-.-,--,-,,++,+,+*+*+*)*)*)*)*)()()()('('('('(('('('('('('('('('('('('(('(676676767678787887898989:9::9:;:;<;;<;;<=<=<=<=>=>?>?>?@?@?@?@@A@A@A@A@ABABABABABABCBCBCDCCDCDCDCDEDDEDDEDEDEFEFEFGFFGFFGFGFGFGHGHGHGHIH IHIHHIIHHIHIHIHHIHHIHIHIJIJIJIJIIJIJIIJIHIHIHIHIHIHIHHIHIHGHGHGHHGGHGHGHGFGFFGFFGGFGFEFFEFEFEDEDDEDEDDCDCDDCBCBBCBABABA@A@A@AA@?@@?>??>=>=<<;<; :;:;:;;::;:9:99:98787877876767656654545445434343232321212121011010/0/0/00/.-.-,-,-,--,-,+,++,+,+,+,+*+*+*)*))**)()()(()('('((''(('('('('('('('('('('('(67667676776787898989:9::9:;:;;:;<;<=<=<<==<=>=>=>>==>?>>>?>??>?@?@?@A@A@ABAABAAB CBCBBCCBCBBCDCDCDCDEDEFEFEFFEEFEFEFGFGFGFGFFGHGHGHGHIHIHIHIIHIHIHIIJIJIJIJIJIJIJIJIIJIHIHIIHIHIHIHHIHIHIHGHGHGGHGHGFGFGGFGFGFEFEFEFFEFEDEDEDDCDDCDCCDCBCBCBBCBABABBA@A@AA@AA@A@?@? >?>?>??>>?>=>==>=<=<=<=<;<;<;:;;:9:989878787676 565655665566545454454434343 23223233223212121011010/00/0/./././.-.-.-,-,-,-,+,,+,++,+,+,+*+*+*)**)*)()()()()()('(('('('('('('('('('('('(67678787877898989:9:;:;;:;<;<;<=<=>=>?>??>?>?>?@?@?@A@A@@A@AA@AA@AABABABABCBCDCDCDCDCDEDEFEEFEFEFEFGFGFGFFGFGHGHGHGHIHIHHIHIHIHIHIHHIIHHIJIJIIJIIJJIJIJIJ IJIJIIJJIJIJIJIJIJIJIJIJIJIJIHIHIHIHIIHIHIIIHIHIHIHIHGH GHGHGHHGGHGHGHGHHGFGFGFGGFGFEFEFFEFEEFE DEEDEDEEDEDD CDCDDCDCCDDCDCBCBABABABA@A@A@A@@A@?@?@@?@@?>?>?>?>?>=>=>=<<=<=<;<;<;<;:;;::;:9:99:9:9:989878787676565654544554454434334323223212101010/0/0/.//./.-..-.-,--,-,-,-,+,+,+,+*+*+*)*)*)*))**)())()()(()('('('('('(('('('(('('(('('('('('('('('('6766767676787877898989:9:9:;:;:;<;<;;<;<=<=>=>=>=>?>??>?@?@?@?@A@ABABAABABCDCDCCDEDEEDEFEFEFEFGFGFGGFGFGFGHGHHGHGHGHGHIHHIHHIIHIHIIHHIJI IJIIJJIIJIJI JIIJIIJJIJIJIJIJJIJIJJIJJIJJIIJIIJIJIJJIJIJJIJIIJIJIJIJIIJIHIHIIHIHIHIHHIHGHGHGHGHGFGGFGFGFGGFGFEFEFFEEFEFEDEDEEDEDDDCDCDCBCBABABABA@A@A@?@?@?@?>?>?>=>=<=<=<;<;<;:;:;:9:989899878767676766765654434344323212121010110010/0/././/.-.-.-,-,,+,+,+*+*+*++*)*)*)()()(())()('('(('('(('('('(''(('('('('('(('('('('('(676766787878 9889889889989:99:9:;<;<;<=<=<=>=>=>>=>?>??@??@@?@?@A@A@ABABAABCBCCBCBCDCDEDEDDEDDEFEFFEFEF GFFGFFGFFGFGGFGFGHGHGHGHGHHGGHGGHIHIHIHIHIHIHIJIJIJIIJIJIJIJIJI JIJIJIJIIJIJIJIJIJIJIIJIJJIJIJIJIJJIJIJIJIJIJIJIJIJIIHIHIHHIHIHGHGHGFGGFGFGGFEFEEFEFEDEDEEDDDCDCDCDCBCBCCBABA@A@AA@@AA@?@?@@??@@?>?>??>=>= <==<=<=<<==<;<<;<<;<;:;:;:9:99:9:998898987878787876767656565454545443434323223323212121122101010010/0/././../.-.--.-,-,-,,+,+*+*+*+*+*)*)() ()())(()()()()('(('('('('('('('('('('(''('('('('(6787898989:9:;:;<;<=<=>=>=>>=>=>?>??@?@@?@@?@A@AA@A@ABABABCBCBCDCDEDEFEEFEFFEFFGFGFGFGGFGHG HGGHGHGGHHGHGHGHIHIHIHIHIHIJIJIJJIJIJIJIIJIJIJJIJIJJIJIJIJIJIJIJIJIJJIJJIIJJIJIIJIJIJIJIJJIJIIJIJIIHIHIHIHIHIHGHGHGHGHHGHGFGGFGFGFEFEFEFEFEDEDEDEDCDCBCBCBABA@A@A@?@@?@?@?>?>=>=>==<=<;<;<<;:;:;:9:9:989898787656565454434433433432322321212101010/0/0//0/./././.-.-.-,,+,+,+*+*)**)*)()()('('('('('('('('('(('('('('('(676787787898989:9:9:;:;:;<;<;<=<=<=>=>==>?>??@??@??@??@A@@A@A@ABABCBCBCDCDCCDCDEDDEEDEEDEFEEFEFFGFGGFGFGFGHGHGHGGHGHGHGHIHIHIHIHIHIHIHIJIJIJIJIIJJIJJIIJIIJIJIJIJIJIJIJIJIJIJIJIJI JIJJIJIJJIIJ IJIIJJIJIJJIJIJIJJIJIIJIHIHIHIHIHIHGHGHGHGGHHG FGGFGFFGFFGFEFFEDDEDEDCDCDCDDCBCBABABAABBA@A@A@?@@?@?@?>?>?>=>=>>=>==<=<=<;<;:;:9::99:989898787676776765656565454454543432332121212101010/0/././../.-..-,-,-,,+,+,+*+*++*+**+*)* )*))*)*))*)()()()()('('('('(('(('('('('('('('('('('('('('('(('('('('(678787798988989:9:9:;:;:;;<<;<;<=<=<=>=>?>>??>??@?@?@A@AA@@A@@ABAB CBCBBCBCBBCBCDCDEDEDEDEFEFEEFFGFGFGFGHG HGGHGHGHGHGHGHIHIHIHIHIJIJ IJIJJIJJIJIJIJJJIJIJIJIJIJIJIJIIJIJIJIIJIJIJIJI JIJIJJIJIIJIJIHIHIHGHGHG FGGFFGFGFGFGFEFEFEEDCDCDCDCCDDCBCBCBCBCBABAABBA@A@A@A@A@?@?>?>?>?>=>=>==<==<;<;<;:;:9:9:98987788778765654434334323232321212211211210110/0/0/.//./.-.-.-,-,,-,,+,,+,+,+*+* )*))*)*))**)()())()()('('('('(''(('('('('('('('('('('('(767878989989989:9:99:99:;:;;:;<;<;<=<=>=>=>=>=>?>?>?>???@??@@??@A@A@A@ABAABAABCBBCCBCBCDCDDCCDEDEDDEDEFEFEEFEFEFFGFFGFGFGHGHGHGH IHHIHIHHIIHIHIHIJIJI JIIJJIJIJIIJIJIJIJIJIJIJKJKJKJKJKJKJKJIJIJJIJIJIIJJIJIJIJIJIHIIHIHIHIIHIHHIIHGHHGHHGHGHGGHGHGFGFGGFGGFGFEFEFEFEFEFFEEDEDEDDEDCDDCDCDDCDCBCBCBABABA@AA@A@@AA@?@?>??>?> =>>=>==>=>===<=<;<;:;:9:989989878787676565455445444343232322321212211210101010/0/0/././..-.-.-,-,-,-,,+,,+,,+*+*++*+*+*)*)*)*))*)()()('('('(('('('('('('('('('('('('('('('(67 877887787878989889889:9:;:;<;<=<<=<=<=>=>?>?>?>?@?@?@A@AA@@ABAABABABCBCBCBCDCDCDCDEDEDEDEFEFEFEFGFGFGFGHGHGHGHGHIHHIIHIHIHIHIJIJIJJIIJIJIJIJIJIJIJIJJKJKJ KJKKJKJJKKJKJKJJKJJKKJKJKJKJJKJIJIJIJIJIJIJIHIHIHIHIHIHGHGHGHGFGGFGGFGFGFFGGFGFEFEFEFEDEEDEDEDEDCDCDCCDCBCBBCBCCBABA@A@?>?>?>=>==>>=>=<=<;<<;<;<; <;:;:;;:;;:9:9:9898987878767676565654544543434323233223212101010010/0//0/./.-.-.-.-,-,,+,+*+*+*)*)*))*)())(()('('('('('(('('('(('('('('('('('('('('('(7676787878789:9:9:9:;:;;:;<;<=<=<=>=>=>=>?>>?>?>??@@???@A@ABABAABCBCBCBCDCDCD EDEDDEDEEDEFEFEFEFGFFFGFGFGFGHGHGHGHIHIHIHIHIHIJIJJIJIJIJIJJIJIJJKJKJKJKJ KJKJJKJJKJKJKJJKKJKJKJJKJKKJKJKJKJKJKJKJIJIJIJIJJIJIJIIJIJIHIH IHIIHIHIHIIHGHGHGHGGHGFGGFGGFGFGFEFFEEFEFEEDEDEDCDCDCDCBCBCBCCBABA@A@A@?@?@?>?>?>=>=>= <==<==<==<<=<;<;<;:;:9:99:98987878778767766766765656545445434323232121010110/0//0/./. -..-.--.-.-,-,-,,-, +,+,++,+,++,+*+*+*)**))*)*)()(()()()('('('(('('('('('('('('('('('('(787898989:99:99:9;:;::;::;<;;<;<;<=<=<=<=>=>=>?>>?>?>?@@?@ A@AA@@AA@A@ABABCBCCBCBCDCDCDDCDCDEDDEDEDEFEFEFEFGFGFFGFGGFGHGHGHGHGGHGHIHIHIHIHIHIJIJIJIJJIIJIJIJJKJKJKJK JKJKJKJKKJKJKJKJKJKJKKJJKKJKJKJKJKJKJKJKJIJIJIJIIJIJIJIJIHIHIHIIHGHGHGGHGHGHHGGHGFGFGFGFEFEFFEEFEFEEDEDEEDEDCDCDCBCBCBCBCBABABA@A@?>?>??>= >=>==<==<=<<=<;<;:;:9:9::989989878767676676565656545434343232121010/0/./././.-..-.-,-,,-,+,+,+*+*+*+*+*)*)*)()())('('('(('('(('('('('('('(678989889:9:9:;:;:;<;<;<<;<=<==<=>=>=>?>?>?>?@?@?@A@A@A@ABABABABCBCBCBBCDCDEDEDEDDEEDEFEEFEFEFGFGGFGHGHGHGGHGHGHIHIHIHIJIJIJIIJIJJIJKJJKJKJKJKJKJKKJKKJJKJKJKKJKKJJKJKJKJKKJJKJKKJKJKJJKJKJKKJKJKKJKJJKJIJIJIJIJIJIJIHIHIHIIHIHIHIHGHGHGHGHGHGFGFGFEFEFEEDCDDCCDDCDCDCDCBCBA@A@A@?@@?@?>??>?> ?>>==>>=>==>=>=<;<<;<;<<;:;:9:9898987887876565656545454545434434344323232121010110/0/./.-.-.-..-.-,--,--,,,+,+,+*++**+*)*)*)*)())())()()('('('('(('('('('('('(67877887898989:9:9:;:;<;<;<=<=>==>>=>?>?>>?@?@?@@?@A@A@A@ABABCBCBCCBCDCCDCCDCCDCDEDEDEFEFEEFEFEFGFGFGFGFGFGHGHGHGHGHIHIHIJIJIJIJIJJIJIJJIJJIJKJJKJJKJKJKKJ JKJKJKJJKJKJKJJKJKJKJK JKJKJKJKJKJKJKJKJKJKJKJKKJKJKJJKKJKJJKJJKKJKJKKJKJKJKJIJIJIIJIJIJIJJIJIHIHIHIHIHIHGHGHHGHGFGFGFFGFGFGFEFEFEEDEDCDCCDCCDBCBCBCBCBCBABABA@A@ ?@??@?@?@@?>?>=>=>==>=<=<=<=<;<;<;:;:9:9::98989878767766776566556556545445434433432323232121210/0/0/././.-.-.-.-,--,-,-,+,,+,+,+*+*)*))*)*)()('(('('(('(('('('('('('('('('(7878878989:9:9:;:;;:;<;<;<=<<=>==>>=>?>?@??@?@??@A@A@ABABBABCBCDCCDCDEDEDEFEEFEFEFGFGFGFGFGHGHGGHGGHGGHGHIHIHIHIIHHIHIJIJIIJIJIJJIJ KJJKJKJKJKKJKJKKJKJKJJKJKJKJKKJKJKJKJKJKKJKJKJKJKJJKJKJKJKJKJKJJIJIJIJIJIJIJIJIHIHI HIIHIHIHHIHIHGHHGGHGHGFGFGFGFGFEFEEFEDEDCDCDCDCBCBCBABA@A@?@?@?>?>=>=<=<;<;;<;:;:;::;:9:9:989898787876776 766556655665665454545543443434323321212121010/00/0/.//./.-..-.-.-.-,-,-,+,,+,+,+,+*)*)*)()()()()()('('('('('('('('('('('('('('(('(''(787878989:9: ;:;;:;;::;<;<;<=<=>=>==>?>??>>?>>?@?@@??@@?@A@A@A@ABABBABCBCBCBCDCDEDEDEFEFEFGFGFGFGGGHGHGHHGHGHGHIHIIHIHIHIJIJIJIJIJJIIJJIJIJKJKJJKJKJKJKJKJKJKJKJKJKJKJKJKJKJKJKKJKJKJKJJKKJKKJKKJKJKKJJKJJIJIJIJIJIHIIHIHIHIH GHHGHGHHGGHGGHGFGFGFGFEFEFEFEFEDEDCDCDCDCBCBABA@A@A@?>?>?>=>>=<=<<=< ;<<;;<<;;<;;<<;:;:;:9:9:98989876767656565655454454323233212212212101010/0/00/././.-.- ,-,-,,--,--,-,+,+,,+,+ *+**++**+*+*+**)*)*)*)()()(()('('('('(('('('('('('('('('('(787878989989989:;:;::;;:;<;<;<;<=<=>=>=>?>>?>?>?@?@?@??@A@@A@ABABCBCDCDEDEFEFEEFEEFGFGGFGFGGHGGHGGHGGHGHGHIHIHIHIIHIHIIHIIHHIJIJIJIJIJ KJJKKJKJKKJKJKJKJKJKKJKJKJKJKLKLKJKJKJKJKJKJKJKJJKJKJKJKJKKJKJIJIJIJIJIJIHIIHIHIHIHIHHIHGHGHGHGFGFGFGFEFEEEFEFEDEDEEDEEDCDCCDDCBCBCBCBABABBABA@A@A@A@?@?@?>?>>=<=<=<=<<=<;<<;<;:989899889878878787677676676565665655454543443232332121010/0/0//0/././/.-.-,--,+,+,+,+*+*+*+*)*)*))*)()())())()('('('('('('(''('('('('('('('('('(7878778989:99:9:;:;;:;<;<=>=>>=>=>?>?>?@?@@A@@AA@A@ABAABABCBCDCDEDEFEFGFFGFGGFGGHGHGHHGHHGHIHIHHIHIHIJIIJIJIJIJJIIJIJKJKJKJJKKJKJKJKJKKLKLKLKLKLKJKJKKJKJJKJJKJJKJJKJKKJJJKJKJIJIJJIJIJIJIIJIHIHIHHIHIHIHGHHGHGHGHGFGFGFGFEFFEFEFEDEDEDCDCDCDCBCBCBABA@A@@A@?@?@?@?>>==>=>=<=<=<=<;<;<;:;:9:9:9::9898987876565656555454323323212122101010/0/0/0/././.-,-,-,+,+,+*+*++*+*)*)()()(()(()('('('('(('('('('('('('('('('('('(7878989:9::9:;:;<;<=<=<=>=>=>?>?@??@@?@?@?@@A@@A@A@ABABCBCCBCBCDCDCDEDDEDEFEFEFEFGFFGFGHGHHGHGHGHIHIHIHIHHIHIJIJIJIJIJKJJKJKJ KJKJKJJKKJKJKJKKLKLKKLKLKKLLKLKLKLKLKLKLKLKLKLKJKJKJKKJKJKJKJJKJKJ IJJIIJJIJJIJIHIHHIIHIHIHGHGHHGHGHGHGFGFGFEFFEDEDEDCDCDCBCBCCBCBABA@A@A@?@?@?>?>?>?>>>=>=<=<;<<;<;:;;:;;:9::9:9:989898787876765655454454344343232 1212211221121010/0//0/.//.-.-.-.-,,-,,-,+,+,+*+*+*+**+*)*)*)*)()()())('('('('(('('('('('('('('('('('('('(7877887898989989:9:9:9:;<;<;<=<=>=>=>==>?>?>?@??@??@?@A@@A@A@@ABAABABABABCBCCBCDCDEDEDEDEDEFEFEFGFGFFGGHGHGHIHIHHIHIHIHIHIJIJIJIJKJKJKJKJKJKJKJKKJKKLKLKLKLKLKLK LKKLKKLLKLLKLKLKLKLKKLKLKLKLKLKLKJKJKJKKJKJKJKJKJIJIJIJIJIJJIJIIJIHIHIHGHGHGFGFGFGFGFFEFFEFEDEDEDEDEDCDCDCDC BCBCBCBBCBCBABABAABABA@A@A@?@?@?@?>?>>=>=>>=>=>=<==<=<;<;<;:;:;:;:9:98987878765655454454543434323212212101010/0//0/././.-.--.-,--,--,-,+,+,,+,+*+*+*++*)*)*)*)*)*)*)()()())(())('('(('('(('('('('('('('('('('('(78878778989989:9:9::9:;:;<;<;<=<<=<<=>=>=>=>=>?>?@?@?@@A@@A@AA@ABAABABABABCBCBCDCDCDEDEFEEFFEEFEFGFGFFGFGFGGHGGHGHIHIHIHI JIJIIJIJIIJIJKJKJKJKJKJKJKJKLKLKLKLKLKLKLLKLKKLKLKLKLKLLKLKLKLKLKLKLKLLKLKLKLKLKLKLKJKKJJKJKJKKJKKJIJIJIJIIJIJI HIHIIHHIHHIIHGHHGHGFGGFGFFE FEFEEFEEFEDEDED CDDCDCCDCDCBCBCBABA@A@A@A@?@? >?>?>??>?>?>=>=>>==>=<;<;<;:;:9:9:989878787876765656554545434323321212121101011010/0/0//./././.-.-.--,-,+,+,+*+*+*+*)*)*))*)*) ())(()())()()()(('(''('('('(('('('('('('('('('('('('('(('(''(78778878989989:9:9:;:;:;:;<;<;<=<=>=>>=>? @??@@??@??@AA@A@ABABCBCBCDCDCDCDEDEDEEDDEFEFEFGFGFGHGHGGHHGGHIHIHIHIHIJIJIIJJIJIJIJKJKJKJKJKLKLLKLKLKLKLKLKLKLKKLKLLKLKLKLKLKLKLKKLKLKLKKLKLKLKLKJKJKKJK JKJJKJKKJJKJIJIJIHIHIHHIHIIHGHGHGFGFGFFEFFEFEFEDEEDEDEDCDCDCDCBCBCBABA@A@?@?@?>??>=>=>=<=<==<=<=<;<;:;:9:9:9898787787676765655454344343232121121010010/0/./././.-.-,--,-,+,,+,+,+*+*+*)*)*)()()())()('('(('('('('(('('('('('(('('('('('('(8989:9:9:;:;<;<;<;<=<=<=>=>=>?>??>>?@?@?@?@A@A@ABABABCBCBCBBCBCDCDDCDCDEDEDEDE FEFEEFEFFEFGFGFGFGFGHGHGHGHIHIHHIHIHIJIIJIJIJIJIJKJ KJJKKJKKJKJJKJKJK LKKLLKLKKLLKLKLKLLKKLLKLLKLKLKLKLKLKLKKLKLLKLLKLKLKLKLKLKLKLKLKLKLKLKLKLKKLKLKLKLKJKJKKJKJKJKJKJKJIJIJIHIIHIH IHHIHIHHIIHG HGGHGGHGGHGFGFGFFEFEEFEFEDEDCDCBCCBCBCBABABA@A@A@A@?@?@?>?>?>>=<=<=<;<;<<;:;:;:98989889878788787676767656655665545434334432 3232232323321010010010/0/.//./../.-..-.--.--,-,,--,+,++,,+,+*++*+*+*)*)**)())()('('('('('('('('('('('('('('('('('('(78989:9:9:;:;:;:;<;<;<=<=>==>?>?>?>?@?@??@A@A@ABABABCBCBCBCDCCDDCDCDEDEDEDEFEFEFEFGFGFGHGGHGHHGHHIHIHIHIHHIHIJIIJIJIJIJIJIJKJKJKJKJKJKJKLKLK LKLKKLKKLLKKLKLKLKLKLKLKLKLKLKLKLKLKLKLKLKLKKLKLKKJKKJJKJJKJKKJKJKJIJIJJIIJIJIJIIJIHI HIHHIHHIHIIHIHGHGHGGHHGFGFGFGFEFFEEFEDEEDEDEDEDEDCDCDCDCBCBCBCBCBABABAABA@A@@A@?@?@?>?>?>?>>?>=>=>=<<==<;<;<;:9::9::9898787 6776776676676565565434343343212121010/0/0/0/0/.//./.-.--,-,+,+*+*)()()(())(()()('(('('('(('('(('('((''('('('('('('('('('('('(78989889:9:;:;;:;<;<=<<=<<=>=>?@??@@?@?@A@ABABCBBCCBCBCDCDEDEDEFEFEEFEEFGFGFGHGHGHHHIHIHIHHIHIHIJIJIJIJKJKJJKJKJKJKLKLKKLKLKLKKLLKLLKLKLKLKLKKLKLKLKLKLKLKLKLKLKLKLKLKKJKJKJKJKJKJKJIJIIJJIJJIJIIJIHIHHIHIHIHGHGHGGHHGHGFGFFEFEFEDEDEDDEDCDCDDCCDCDCBCCBBCBABBABA@AA@?>?>>=>=>=>=>=<;<;:;:;;:;:9:98987876765655454554343432321221010/0/././.././.-..-..-,-,-,+,+,+,+*+*+**+*)**)*)*)*)*)())(()()('(('('('('('((''('(('('('('(878989889:9:9:9:;:;<;<<;<=<=>=>==>?>?>?@?@?@A@@ABAABABABCBCBCBCDCCDEDEEDDEFEFEFFEEFGFGFFGFGFGHGHGHGHGHGHHIHIHIHIHIJIJIIJIJIIJKJKJKJKJKJKKJKJJKLKLKLKLLKLLKLKLKLKLKLKKLKLKLLKKLMLMLKLLKLKLKLKLKKLKLKLKLKKJKJKJKJKJKJJKKJIJJIJIJJIJIHIHIHHIIHGHGHGFGFFGFGGFGFEFEFEEFEEFFEFEFEDEDEEDEDCDDCDCDCBCCBCBABBAABA@A@@AA@?@?@@?@?>??>?>=>>=<=<=<=<;<;:;;:;:9:99:99:98989878778876767676566565545454543434343232323212101010/0/0/./././.-.-.-.--,-,-,+,+*+*+*)*)()())('('('('('(('('('('('('('('('('(('(('('(('(('('(8989:9:9:;:;:;<;<<;<=<=>=>?@?@?@AABABABCBBCBCBCDEDEDEDEFEFEFGFFGFFGFGHGHGHGGHGHIHIHHIHHIHHIHIJIJIIJJIJIJKJJKJKJKJKJKKJKLKKLKKLKLKLLKKLKLLMLMLMLMLMLMLMLMLMLMLMLKLKLLKLKLKLLKLKLKKLKLKJKJKJKJKJKKJIJJIJJIJIIJIJJIIJIHIHIHHIHIHHIH GHGHHGHGHHGHGFGGFGFGGFGF EFEEFEEFEFEFEDEDCDDCDCDCBCBCCBCCBABABAABBA@A@A@?@?@?>?>??>?>=>>==>=<==<<=<<=<;<;:;:9:9:9899889989878787876765656545454455443434334323212101010/00/0/.//./././.-.--.--,-, +,+,+,,++,+,,+*+*++*)*)*)*)())()()()('('('(('('('('('('('('('('('('(89:9:9:9:;:;:;<;<=<=<<==<<=>=>=>?>?>?@?@A@@A@@ABAB ABBABBCCBCCBBCDCCDCDCDEDEDEEDEFEFEFFEFEF GFFGFFGFGFGFGHGHGHGHIHIHIHIHIJIJIJIJKJKJKJKJKJKJKLKLKLKLKLKLLMLMLMLMLMLMLMLMLMLMLMMLMLLMLMLMMLMLLMLKLKLLKKLKLKLLKLKKLLKLKLKJKKJJKJKJKJIJIHIIHHIHGHGGHGHGFFGFGFEFEEFFEEFEDEDCDDCCDCBCBABA@A@?@?@?>???>?>=>=>=<=<=<;<;:;:9:9:9:989878877887676776765656545454323232121010110110/0/0/./.-.-.--..-.--,-,-,+,,++,+*+*+*+*+*)*)*)**)*)()()()()(())('(('('(('((''('('('('('(('('('('(('(8989:99:99:;:;:;:;<=<=<=>=>=>?>?>?@?@?@A@@A@ABABAABCDCCDCCDEDEFEEFEFEFGFGFFGFFGHGHGHGHIHHIHIHHIHIJIJIJJIJIJJIJKJKJKJKJKLKLKLKLLKLKLKLKLMLMLMLLMLMLMLMMLMLMLMLMLMLMLMLMLMLMLMLMLMLKLKLKLKLKLLKLKKLLKJKJKJJKJJKJIJIJIJIJIHIHIHGHHGHGFFGFGFEFEFEFEDEDEDCDDCCDCDCBCBABABBA@A@?@?@?@?>??>??>?>=>=<=<<==<;<;<;:;:9:9:9898787787 6766766766565655655654543443432323212101010110/0/00/.--,--,-,,+,+,+,+*+*+*)**)*)()()(())(()('(('('('('('('('('('('('('('('('('('('(898898989:99:9:;:;<;<=>?>?@?@??@A@AA@A@A BABAABABBABBABCBCCBCDCDEDEDEFEFGFGHGHHGHGHIHIHIHIIHI JIIJJIIJJIJIJIJKJJKJKJK LKKLKKLKLLKLLKLKLKLMLMLMLLMLML MLMMLLMLMMLMLMLMLMLMLLMLMLML MLLMMLMLLMLMLMLMLMLLMLMLKLLKLKLKLKKLKLKJKJKJKKJKJKJJKJIJIIJJIJIJIHIIHIHIHIHGHGHGGFGFGFFGFEFEFEDEDEDEDCDCDCBCBCBBCBABA@A@A@?@??>?>??>=>=>=>=<=<;<;<;<;:;:;:9:9878787677676655654545454344343 2323322323212212101010110/0/.-.--,--,+,+,+*+*+**+*)*))*))*) ()()(())(())('('(('('('('('('('('('('('(('(89899:9:9:;:;:;<;<;<=<=<=>=>=>>=>?>??>?@?@A@A@AABABABABCBCBCBCDCD EDEEDDEDEEDEFEFEEFFEFGFGFGHGGHGHIHIIHHIHIHIJIJIJIIJIJKJKJJKJJKJKLKLKLKLKLKKLKLLKKLKLKLMLMLMLLMLMLMLMLMLMLMLMLMLMLML MLMMLMLMMLLM LMLLMMLMLMMLMLMLMMLMLMLLMLKLKLKLKLKLKJKJKJIJJIJJIJIHIHIHIHGHGHGHGGHGGFGFEFEDEEDEEDCDCBCBCBABA@A@AA@A@?@?@??>?>=>=>=<==<<=<=<;<;;<;:;:;:9:9:9899898787877876767665665454343232321221010010/00/./././.-.-- ,--,-,--,,-,+,+,+*+*+*+*)*)*)*)()()('('(('('(('('('('('('('('('(89889:;:;:;<;<;<<==<=<=>=>?>?@?@@?@A@A@@AABABABCBCBCCBCDCDEDEDEDEFEFEEFEFGFGFGFGHGHGHIHHIHIJIJIJIJIJIJKJJKJJKJKJKLKLKLKLKLKLKLMLMLMLMMLMMLMLMLMLMLMLMLMLMLMLMLMLMLMLLMLMLMLLMLMLML MLMLMMLMLLMLMLLKLLKLLKLKLKLKLKJKJJKKJIJIJIJIIJIHIHIHIH GHHGHHGGHGHGGFGGFGFFGGFGFEFEFEEFEDEDEDEDCDCDCDCCDCBCBCCBABABABABA@A@A@?@@??>?>?>=>=>=<=<;:;:9:989899878877878767667667656656545434343432323212121010010/0/0/./../.-.-.--,-,--,,-, +,+,++,,+,,+*+*++*+*)*)*)*)()( )(()(()(()('(('('('(('('('('('('('(8989:9::9:9:;:;::;<;<;;<=<=<=>=>?>?>?>?@??@@?@A@A@@AABBABABCBCBCBCDCDCDCDCDEDEDEDDEDEDEFEFEFGFGFGFGGFGHGHGHGHIHHIHIJIJIJKJKJKJKJJKJKLKLKLKLMLMMLMLMLMMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLLKLKLKLLKLKKLLKLLKLKLKJKJKJKJJKJKJJKJIJIIJIHIHIHIHIIHGHGGHGHGGGFGFEFEDEDEDCDCDCBCBCBCBBABABABA@AA@A@A@?@??>?>?>=>=<=<;<<;<;:;:9898987878767676 565656565654554543432323232321221212101010/0/././.-.-.-,-,,-,+,+,+,,+*++*+*+*+*+*)**))*)*)()()())(()()('('('('(('('('('('('(('(('('('('('('('('('(898989:9:99:;:;;:;;:;<;<=<=>==>=>?>?>?@?@?@A@@A@A@AABAABCBCBCBCCDCCDCCDCDCDEDEDEFEFFEFEFGFGFFGHGHGHIHIHIHIIJIJIJIJKJ KJKJJKKJJKJKJKLKLKLKLKLMLMLMLLMLMLMLMLMMLMNMNMNMLMLMLMLMLMLMLMLMLLMLKLLKKLKLKLLKLLKJKJKJJKKJJKJKJKJIJIJIJIJIHIHIHIHGHGHGHGGFGFGFFGFGFEFEDEDEDCDCDCBCBBCBABABA@AA@A@A@?@@@?>??>?>?> ?>=>=>>==>=<=<=<;<;;<;<;:;:;: 9::99:99:9:9898987876766565454343232232121121212101010010/0/0/0/././.-.--,--,,-,+,++,+,+,+*++**++*+*)*)**)*)()())()('('('('('('('('('('('('('('('('(89898989:99:9:;:;:;<;<<;<=<=>=>=>?>?>?@??@A@AA@A@ABBCBCBCBBCDCDCDEDEEDEDEFEFGFGFGFGHGHGHGGHGHIHIHIHIIHIJIJIIJIJIJKJKJKJKJKKJKLKLKKLKLKLMLMLMMLMLMMLMNMNMNMNMMNMNMMNMNMNMNMNMLMLMLMLMMLMLMLMLLMLMLKLKLKLKLKLKJKJKKJKJKJJKKJIJJIJIJIIJIHIH GHGHGGHGHGGHG FGGFGFGFGFGFEFFEDEDEDCDCBCBCBABA@A@?@@?@@??@?>?>=>=>=<=<;<<;<<;<;:;:;;::;:9:99::9:987887887 677667767666565654545434343443232 3212112112210 /00/0//0/0/.//./../.--,-,--,-,+,+,+*+*)*)*)()()()()('('('('((('('('(('('('(('('('('('('(89989:9:;:;<;;<;;<;<<=<<=<=<=>=>=>?>?>?@?@A@ABAABABABCBBCBBCCBCDCDCDEDEDEDEFEFEFFGFGFGFGFFGHGGHHGHGGHIHIIHIHIIJIJIJIJIIJIJKJJKJKJKJKJKLKLKLKLLKLKLML MLMLMLLMLLMLMLMMNMNMNMNMNMNMNMNMNMNMNMNMLMLMLMLMLMLMLLMLKLKLKLLKKLLKLKJK JKKJKJKKJJKKJIJIJJIJIHIIHIHIHIHGHHGFGFFGFEFEFFEEFEFEDEDEDEEDCBCBABBA@A@A@?@??@@@?>?>=>=<=<<=<;<;:;;:;:9:9:9898899898787788767677665654554454454343432332321210101010/00/0/./.-.-.-,-,-,-,-,+,,+,+,+,+*+*++*+*)**))**)*)()())()('('('('('('('('('(''('('(('('('('((''('(989:99::9:9:;:;:;<;<=<=<==<=<=>=>>=>?>??@?@?@A@A@ABABABABBCBCBCBCDCDCDCDEDEDEDEFEFEFGFFGFFGHGHGHIHIHIHIIJIJIJIIJIJIJJKJKJKLKLKLKLMLMLLMLMLLMLMLMNMNMNMNMNMNMNNMNMNM NMMNMNNMNMNMMNMNMNMNMNMNMMNMLMLMMLMLMMLMLMLKLKLKLKKLKJKJKJIJIIJIHIHIHIHGHGFGFGFGFEFEDEDDEDCDCDCBCCBCBCBABABA@A@@A@A@@?>??>?>??>=>=<=<=<;<;:;::;;:9::98989889878766 5665656656545434334432332233212121010/0/0/00/0/.//../.-..-.-.-.-,-,-,+,+,,+*+*+*+*)**)*)**)()()()()('('(('('('('('('('('('('('(989:9:;:;<;<;<=<=<=>=>?>>?>?@??@?@A@A@@A@A@ABABABCBCBCDCDEDEDDEFEFGFGFFGHGHGHIHIHIHIIJIJIJIJIJKJJKJJKJKJJKJKJKLKLKLKLKLMLMLLMLMLMMLMLMNMNMMNNMMNNM NMMNMNMMNMNMNMNMNMNMNMNNMNMNNMNMNMMNNMNMMNMMNNMNMNNMNMNMNMLMMLMLMLMMLMLMLKLKLLKLKLKLKJKJKJKKJIJIJIJIHIIHIIHIHGHGHGHGFGFFGFFGFEFEFEEFEDEDCDCCDDCDCBCBCBA@A@A@@A@@A@?@?@?>?>?>=>=>>=<=<;<;<<;<<;:9:9:98998898898787878767676765656545545454343443232121121210101010/0/0/0/./..//./.-.-.-,-,-,-,+,+,+,+*+*+*)*)*)*)*))*)()()()('('(('('('('('(''('('('('('('(89989:9:;:;:;:;<;<;<=<=<=>==>?>>?@?@A@AA@A@A@ABABABCBCBBCBCDCDCDEDEDEFEFEFGFGFG HGGHGGHGHGHIHIHIJIIJIJIIJIJKJJKKJKJJKKJK LKLKKLLKLKKLKLMLMLLMLMLMLMNMNMNMMNMNMNNMNNMNMMNMMNNMNMNMNMNMNMNMNMNMNMNMMNMNMNMNMNMNMNMLMMLMLLMLMLMLMLKLLKLK LKLKLKLKKLLKLKJKKJJKJKJKJJKJIJIJIHIHIHHIHIHIHHGHGHGGHGFGGFGFEFEFEFEDEDCDCBCBABA@A@??@?>?>>?>=>=>=<==<<==<;<;<;:;:9:98988998898787676766545544543432323212121010/00/0/0/0/./../.-.-.--.-.-,-,+,,++,++,+*+*)*)*)**) ()())()())(()('('('((('('('('('('(89989:9::9:;:;:;<;<;;<;<=<=>=>?>?>>?@?@?@A@A@ABABABABBCBBCCBCDCDEDEDEFEFEEF GFGGFGGFGFGHGHGHGHIHHIIHIHIJIJIJIJIJKJKJKLKLKLKLKLKLMLMLMNMNMMNMNMNMMNMNNMNMNMNMNMNMNMNMNNMNMNMNNMNMNM NMMNNMNNMNNMNMNNMMNMMLMLMLMLKLKLKLKLKKLKJKJKJKJJKKJKJIJIJIJIHIIHIHHGHGFGFGFEFEDEDEDDCDCDCDCBABABBA@?@??@? >??>>??>>?>>??>=>=>=<=<;<;<;:;:;;:;;:9:987878766776565454454343232323212212110010/0/././..//./.-..--.-,-,-,+,,+,+*+*+**))*)*)**)*)())()())('('('('(('('('('('(('('(('('('('('('('('('('('('('(9:9::9::99:;<;<;<=<=<=>=>?>?@?@@?@?@ABABBCBCDCDCDEDEFEFEEFEFEFGFGFFGFGHGHGGHIHIHIHIJIIJIIJJJIJKJKJKKJJKJKLKLKLKLKLMLMMLMLMMLLMLMLMNMNMNMNMNMNMNMNMNMNMNMNMNMNNMNMNNMNMNMNMNMNMNMNMNMNMMNNMNMNMNMNMMNMNMNNMNMM LMMLMLMMLMLMLMLMLLMLKLKLKLLKLKLLKJKJKJI JIJJIIJIIJIHIHIHIHIHHHGHHGHHGHHGHHGGHGFGFEFEFEFEDEDEEDC DCDCDCDCDCDCBCBCBA@?@?@?@??@?>??>?>=>=<;<;<;;<;:;:9:9:9898989878877887676676765654544543434334323212121010110/0/.-.-..-.-,-,--,-,+,+,++,+*+*+**+*)*)*)()()()()('('(('('('('('('('(''('('(9:99:9:;:;<;<;<=<=>?>??>?>?>?@?@?@ABABAABBABCBCCBCBCDCDEDEFEFEFGFGFGGFGHGHGHIHIIHIHIJIJJIJIJJIIIJ KJJKKJJKKJKJKJKLKKLKLKLML MLLMMLMMLLMLMMLMLMNMN MNMNMNNMNNMNMMNMNMNMNMNMNMNNMNMMNMMNMMNMMNMNNMNMNMMLMLMLMLLMLMLKLLKLKKLKLLKKLKLKJKJKJKJKJKJIJIJIHIHIHHHGHGFGFGFFGFEFEDEDEDDEDCDDCDCDCBCBABAABABA@A@A@A@@?@?@?@?>??>>?>?>=>=<=<=<=<;<;:9:9:98987887887677666765656565454554455434344323323232121221010/./.-.-.-,-,--,-,+,+,+*+*+*)*)*)*)*)())()(()('('('(('('('('('('('('('(('('('((9:9:9::99:;:;<;<;<=>=>=>?>?>?@?@A@@AA@ABABAABBCBCBCDCDCDEDEEDEFEEFEEFFEFGFFGGFGFGHGHIHIHIJIJJIJIJIJJKJKJKJJK LKLLKLKKLLKLKLMLML MLMLMLMLLMLMNMNMNMNMNMNMNMNONONOONONONONONMNMNMNNMNMNMNMMNMNMMMNMNMLMLMLMLMLKLKJKJIJIJIHIHIHIHGHGHGHHGHGFGGFGFEFEFEDEEDDEDEDCDDCBCBABABABA@@?@?>?>?>=>>==>=<=<=<;<<;<;:;;:;:9:9:9:9898898787656565454343432332121210110/0/0/./.-..-.-,-,-,+,+,+*+*)*)**)*)()(('('('('('('('('89:9:99:9:;:;:;<;<=<=<=<=>=>>==>?>?>?>>?@?@?@A@@A@@ABABABCBBCBBCBBCDCDEDEDEEDEFEFGFGFGFFGHGHGHGGHHGGHIHIJIJIJJKJKJKJKLKKLKKLKLKLMLMLLMLLMLMMLLMNMNMNMNMNMMNMNNMNMNNMNONONONONONONNONONONONONONMNMNMNMNMMNMLMLMLMLMLMLMMLKLLKKLLKLKLKLKLKJKJKJIHIHHIHGHGHGHGHGFGFGFEFEDEDCBCBABABAB@A@A@A@?@@?@?>?>?>=>=>==>=<=<;:;:9:989987877876677667656565455454344323212122101010/0//0/././.--.-.-,-,-,+*+*+*+*)**)*)()()('('(('('('('('('('('('('('('('(9:99:9::9:;:;:;<;<=<=>==>==>?>?>?>?>??@?@?@A@A@ABABABBABCBBCDCDCCDEDEDEDEDEFEFEFEFEFFEFGGFGGFFGFGHGHGHGGHHGHIHIHHIIHIHIJIJIJJJKJKLKLKLKLLKLMLMLMLMLMNMNMNMNMNMNMNMNMNNONNONONONONNONONONONONOONONONONONONONONMNMNMNMNNMMNMLMLMLLMLMLMLKLLKKLKLKJKKJKJKJKJIJIJIJIHIHIIHIHIIHGHGHG FGFGGFGFGGFEFEFEFEEFEDEDCDCBCBCBABABBABA@A@AA@@A@?>?>?>=>=<=<=<<;<<;;<;:9:9899889878767676565654543434343232321212121010/0/0/./.-.-.-.-,-,-,-,+,+,,+,+*+*+*)**)*)*)()()()()('(('('('('('('('('(('('( 9:99:9:99:9:;<;<;<=<=<=>=>?>??>?@A@AA@@ABAABCBCCBBCDCCDDCDCDEDDEDEFEFEFGFGFGFGHGHGGHHGHIHIHHIJIJJKJKJKJKLK LKLKKLLKKLKLMLMLMLMNMNMNMNMNMMNMNMNMNNONONONONOON ONONOONNONNONONONONONONONONNONONONNONONONONONMNMNNMNMNNMNNMNMNMLMLMLKLKLLKLKLKJKJKJIJIJJIJIJIHIHIHHIIHGHGGHGHGFGFGFGFEFEDEEDDEDDEDCDCBCBCBABA@A@@@?@?@@?@?@?>?>=>=<=<;<;:9:9:9898987878778767676565434343233232323212121121010010/00/./.-.--..-.-.-, -,,--,-,,-,+,+*++*++*+*)()()()((' ('('(('(('('('('('('('('(9:;:;:;<;<=<=>=>=>?>?>?@?@?@A@A@A@ABABCBCCDCDCCDEDEDEFEFEEFGFGFGHGGHGHGHGHIH IHIHHIIHHIIHIJIJIJIJKJKJJKJKJKLKLKLKLKLKLMLMLMLLMNMMNMNMNMNNMMNMNMNONONONNNONONNONNONONNONONONONONONONONONONONONNONONONONMNNMNNMNMNMNMLMLMLKLKLKKLKLLKLK JKJKKJKKJJKJKJIJIHIIHIHGHGHGFGFFGFFGFEFFEFEDEDEDCDCDCBCBABABA@@A@?@?@?>?>??>=>=<;<;<;:;;::;::;:9:9:989898787676545454554343432323212121 01101001010/00/0//0/.-.-.-.-.-,--,--,--,+,,+,+,,+*+*+*)*)*)*)*)()()('('('(('('('('('('('(('('9::9:9:;<;<;<=<=>=>?>>?@?@@??@A@AA@A@@ABAABABCBCBCDCDCDEDE FEEFEEFEFEFGFGFGFFGHGGHGHIHIHHIHIJIJJIJIJKJKJKJKJJKJKLKLKLKLMLMLMLMLMNMNNMMNNMMNMMNNMNMNNMNMNNMNONONONO NONONONOONONONONONONONONONONONONONONONONONNONONONONMNNNMNMMNMNMLMLMLMLMLLMLML KLKLLKKLKLLKLKJKJKJJKJKKJJKJKJIJIJIJIIH GHGHGHGHGHGFGFGFEFFEEFEDCDDCDCDCDCDCBCBABAABABAA@A@??@@?>?>?>=<=<;<;:9:9:989878787767656655654543432321221121010/0/././..-.-,-,-,-,+,+,+,+,+*+*+*)*)*)*)*)*))*)*)()(())())(('('('('('('('('('('('('(('(:9:99:;:;:;:;<;;<<;<;<=<==<=>==>==>?>?@ A@@AA@A@AABABCBBCBCCDCDCDCDEDDEDEDEFEFEFEFEFGFGGFFGFGHGHHGHIHIJIJIJKJKKJKJJKJKJKKLKLMLMLMLMNMNMNMNMMNMMNMNONONONONONONONOONOONNONONONONONONONONONONONONONNONONONONNMNMNM NMNMNMNMNMNMLMLLMLLMLMLMLKLLKKLKLKJKJKJIJIJIIHIHGHGHGFGFEFEEFEDEDCDCBA@A@A@A@A@?>?>=>=>=>=<=<;<<;<;:9::9:9:98989898787767676766566556545454454343434323233212121121 01101011010/00//0/.//./././/.-.-.-.-,-,,--,+,,+*+* )**))**))**))*)()()()('((''('((('('('('('('('('('('('(:99::9:;::;;:;:;<;<<;<=<<=<<=>=>?>?>>?@?@A@ABABABABCBCBBCCCDCDEDDEFEFEEFEFGFFGFGFGHGHGHGHIHIHIHHIJIJIJKJKJKJKJKLKLKKLKLKKLKLMLMLMLMLMLMLMNMNMNNMNMNON ONONONNONNONONNONONONONONONOONONONONONNONONONONONNONONNMNMNMNMNMMNMLMLMMLMLMLKLKLKLKKLKJKJKJIJJIJIJIHIIHHIHIHGHGFGFGFEFEFEFEDEDDEDED CDCCDDCCDCDCBCBCCBCBABABABA@AA@?@?@?@?>?>=>=>>==>=<=<;<;<;:;;:9::99:99:989898788778777676765656656545432323323212121210101010/00/0/0/..-.-,-,-,-,+,,+,+*+*)*)**)*)()()(()(('('('('('('('('('('('(':9:;:;<;<;<=<=<=>=>=>?>?@A@ABABABCBCCDCDDCDEDEDEFGFG HGGHGGHHGGHIHIHIJIJIJKJJKKKJKLKKLLKLKKLLKLMLMLMMLMLMNMNMNMNMMNONONOONOONONOONNONONOONONOPONONONOONONONOONONONOONONNONNMNMNMNNMNMNM LMLLMLMMLLMMLKLKLKLLKKLKJKJKKJKJKJKIJIJIJIJII HIIHIIHIHIHIHGHGFGFGFEFFEFEDEDEEDDEDCDCDCBCBCBCBABABA@AA@@A@?@@??@??@?>?>=>==>>=<=<==<;<;<<;;<;:;;:;: 9::99::9::989889898787787765655654454343432323221212211210101010/0//0/././..--.-.--.-,-,+,,+,+,+*++*+*+*)*)())()())(()(()(()('('(('('('(('('(('('('('('('('('('(:;:;:;<;<;<<;<=<=>==>=>?>?@?@?@A@ABABABABCBCBCCDCDDCD EDDEDDEDEEDEFGFG HGHHGHGGHGHIHIHIJIJKJKKJKJKJKLKLKLMLML MLLMLMLLMLLMMLMNMNMNMNMNONONONOONONONOONONONOOOPOPOPOPOPOPOPOOPONONOONNONONONONONONMNMNMNM LMLMMLMMLMLMMLKLKLKJKJKJKJKJIJIJIIHIIHHIHIHGHGHGFGFGFEFEDEDDEDCDCDCBCBCBABABAAA@A@A@?@?@?>?>=>=>>=>=<=<=<=<;:;:;:;:9:9:9:98787767676565454343432321010/0//00/0/.//././..-.-.-.-,-,--,+,+,,+,+*+*+*+*)*)*)*)())()('(('('('(''(('('('('('(('('('('('(9:;<;<;;<=>=>?>?>?@?@?@A@A@ABAABCBBCBCDCDEDEFEFFEFGFFGFGFGHGGHIJIJIJ KJJKJJKJKKJKKLKLKLLKKLMLMLMLMNMNMNNMNMNMNONONONNONONONONONONONONOOPOPOPOPOPOPOPOPPOPPOPOPOPOPOPONONONONONOONONNOONMN MNNMNNMNMMNMNMLMLMLMLMLKLKLKLKLKJKJIJIHIHGHGHGGHHGFGFGFEFEFEDEDDEDCDCDCDCBCBCBCBABBABBABAA@A@A@?@??@@?>?>?>=>=<=<;<;<<;<;:;::;:9:9::9:9898987878777676765656565565454543432323212212101010/././/./...-..-.-,-,-,-,+,+*+*+*)*)()())(()()('('('('('('('('('('(''('('('('('(:;:;<;<=<=<<=>?>?@?@A@A@ABABBABCBCCBCBCDCDEDEFEFEFGFGFGFFG HGGHHGHHGHHGHIHIHIHIJIJIJIJKJKJKKJKK LKKLLKKLLKLKLKLMLMLLMLMLMNMNMNMNONONNONONONONOOPOPOPOPOPOOPOPOPOPO POOPPOPOOPOPOPOPOPOOPOPOOPOOPONONONONONONOONONONOONMNMN MNMMNMMNMNMLMLMLMLKLKLKLKLKJK JKJKJIJJIJIIJIIJIHIHIHHIHGHGHGFGFEFEDEDCDCBCBABABBAA@A@A@?@??>?>?>?>=>>=>=<=<=<==<;<;<;:9:9:9:989898787788776767656565454554543434432321210/0/././/..-.-.-.-,-,-,+,,+,+*+*+*)**) ())(())())('('('('('('(('('('('('('(:;:;:;<;<;<=<=<=>==>=>?>?>?@?@@?@A@ABABABABCBBCBCBCBCDCCDEDEDEEFEFEFGFGFGFGHIHIJIJKJKJKJKKLKLKLKKL MLLMLMMLMLLMNMNMNMNMNMNMNONONNOONOONNONOONONOPOOPPOPOOPPOPOOPOOPOPOPOOPOPOPOPO POPPOPOPPOOP OPOOPPOPOPPOPOPOPPOPOPOOPOPONONONONNONONMNMNMMNNMNMMNMNMLMLMLMLKLKLKLKJKKJIIJIHIHIHGHGHGFGFGFEFEDEDEDCDCBCBCBABAA@A@?@@??@?@?>?>=>=<=<;<;<;:;:9:9898898788776767656545454323232122101010/0/./.././...-..-..-..-,-,,-,+, +,++,+,++,+*+*+*+*)*)*)*)()()('('(('((('('('('('('('('('('('('('(('('('('('(:;:;:;<;<=<=<=>=>?>?@?@A@ABABABABCBBCBCDCDCDCD EDEEDDEDEEFEFEFEEFEFGFGHGHIHHIHIJIIJIJJIJKJKJKLKLKLKLMLMLLMLLMLMNMNMMNMMNMNMNONO NONOONOONONONOPOPOPOPOOPOPOOPOOPPOPOPOPOPOPOPOPOOPOPOPOPOPOPOPPOPOOPOPOOPOPONOONOONONONONONONMNMMNMLMLMMLKLKLLKJKJKJKJIJJIJIJIHIHIHGHGHGHGGHGFGFGFFGFEFEFEDEDEDEDCDCBCBABAA@A@?@?>=>=<=<;<;:9:98988989878787 67766776676565665455454343433432323321212121010010/0/0/././..-,-,+,++,+,+*+*+*+*)*)())()()()('('(('('('('('('('('('('('(:;:;<;<=<=>=>=>?>?@?@?@?@A@@AA@ABABCBCDCCDCDCDCDEDDEDDEFEFEFGFGGFGHGHGHIHHIIHIHIJIJIJIIJKJKJKKLKLKLMLMLMNMNMNMNMN ONNOONONONNONONONOPOPOPOPPOOPOPOPOPOPOPOPOPOPOPOPOP OPOPOOPOPPOPPOPOPOPOPOPOPOPOPOPOPOONONONONOONONONMNMNNMNMNNMLMMLMMLMLKLKLLKJKKJKJKJKJIJJJIJIHIIHGFGFEFEEFFEFEDEDEDEDEDCDCDCDCBCBCBABA@A@?@?>?>>?>=>=<;<;<<;<;:;:9:9:9898787676776565454543434323232 122112121101010/0/ ./././../../.-.-.--.-,-,--,,-,+,+,+,++,+*++**+*)**)*)())()('(('('('('('('('('('('('('('('('(:;:;:;<;<;<=<==<<=>=>?>>?>?>?@?@A@A@ABAABABCDCDEDEFEFEFEFGFGFGFGHGHGHGHIHHIIHHIJIJIIJKJKJKLKLKLKLMLMLMLLMLMLMNMNMNONNONNONONONOPOPOPOOPOPOPPOPOPOPOPPOPOPOPOPOP OPOPOPOOPPOPOPOPOPOPOOPOPPOONONOONNONMNMNMNMMNMMNMLMLMLLMLKLKJKJKKJKJKKJIJIJJIIJJIHIHIHGHHGHGHGFGFEFEEFEDEDCDCBCBABAAABA@AA@AA@?@?@?>?>>?>??>=>=>=<=<;<;:9:98987887876765654545434323232232121121010/0/././/./../.-,-,-,-,+,++,+*+*+*)*)*)*)()()())(()('('('('(('('('('('('('('('('('('(('(':;:;:;:;<;<;<=<=<=>=>?>>?@?@?@A@@ABABCBCDCDCDDED EDEDDEDEEFEFEFEFGFGFGHGHGHIHI JIJIIJJIIJIIJKJKJKKJKJKLKLKKLKLKLMLMLMLMLMNMNMNNMNMMN ONONNONNOONNONONOPOPOPPOOPOOPPOPOPOPOPOPOPOPPOPOPOPQPQPOPOPOPPOPOPOPOPPOPOPOPOOPONONONONOONOONMNM NMMNNMMNMMNMNMLML MLLMLLMLLMLKLLKLKJKKJKJKJJKJJIJJIHIHIHGHGHGFGFEFEDCDCDCBCCBCCBBCBABBA@A@A@?@?>??>?>>?>=>=>>==>=<=<<=<<=<;<;:;:;:;:9:989878787767765654545543443432323212112121010/././.-.--.-,-,-,-,-,+,,++,+,+*+*+*+**+*)*))*)()()()(()('('('('('('('('('('('('(:;:;:; <;<;<;<;<=<<=<=<=>=>=>=>?>?>>?>?@?@?@A@ABCBCBCCBCDCCDDCDEDEDEDEFEEFEFGFGHGGHGGHGHIHHIHIJIJIJIJIJKJKJKJK LKLKLKLKKLLLKLMLMLMLMNMNMNMNONO NOONNOONNONONOPOPOPOPOPOPOPQPQPQPQPQPOPOPOOPOPOPOPOPOPOOPOPOPONONONOONNONONMNMNMNMLMLMLMLKLKLLKJKKJJKJJIJIIJIJIHIHIHIHIHIHGHHGHGHHGGHGFGFGFGFEFEFEDEDCDCCDCDCDCBCBBCBCBAABA@A@?@?>?>=>=<==<<=<;<;;<;:;;::;::;:9:99:987887676566565454545443344343232121010/0/0/././.-.-,-,-,-,+,+,+*+*+*+**)*)*)**)()(()()()()(('('(('('('('('('(:;:;<;<=<<=<==<=>=>=>?>??>?>?@?@?@@A@A@ABABABCBCBCDCDCDCDEDDEEDEDEFEFGFGHGGHGHGHIHHIHHIIHIJIJKJKJKLKLKKLKLKLLMLMNMNMNMNMNONNONONOONOONOPOPOPOPOPOPOOPOPPQPQPQPQPQPQPQPPQPOPOPPOPOPOPOOPONONNONNOONONMNNMNMNM LMLLMLMLLMMLKLKLLKLKJKKJKJJIJIHIHIHIIHGHHGFGFGGFEFEFEDCDCCDCDCBABBABABBA@?@?@?>?>>?>=>>==>=<==<;<;<;:;:9:989899887788767656656545434344323223232121221210110110/0/0/00/./.././/.-.-.-.-,-,+,++,+,+*+**+*+*)*)()(('('('('('('(':;:;:;<;<=>=>?>?@??@?@A@@A@ABABABBABCBCDCDDEDEFEFEFEEFGFFGFFGFFGHGHGHIHIJIJKJKLKLKLKLKLML MLMMLMLMLLMLMNMNMNMNMNMNON ONONNOONOONONOPOOPOPOP OPOPOPOOPOPOPPOOPPQPQPQPQPPQPPQPQPPQP QPPQPQPQPPQPPQPQPQPQPQPQPOPPOPOPOPPOPOOPOPONONOONONONMNMNMNNMNMLMLMLMLKLKKLKLK JKJKJJKJJKJJKJIJIJJIHIIHIIHIHGHGFGFGFGFGFEFEDEEDCDCCDCBCBABABA@A@AA@?@?>?>?>=>>=<=<=<<=<=<;<;<;:;:;:;:9:98989878878767656656654544543443432323232121212101101010/.//../.-.-..-.-.-.-,-,-,-,+,++,+,+*+*+*+*)*)*)()()()(('('(('(('('('('('('('('('(;:;:;<;<=>==>=>>=>?>>?@??@?@A@ABABBABABABCDCDDEDEDEEDEFGFFGFGHGHGHGHIHIJIJIIJIJKJKJKLKKLKLLMLLMMLMLLMMLMNMNMNNMNNMNONONONONNOONOPOPOPOPPOPOPOPOOPPQPQPQPQPQPQPQPQPQPQPQPQQPQPQPPQPQPQPQPQPQPOPOOPOPOPOPPOPONONONOONONONMNNMNMMNMNM LMLMMLMLMMLLMMLKLKLLKLKLKLKJKJJKJIJIJIHIHIHHIHGHGHHGHHGFGFEFEEFEDEDEDDEDCDCBCBCBAABAABA@A@A@?@@??@@?>?>=>=<=<;<;;<;:9:98989878878767676565654544554343232121010/0/0/.//.-.-,-,+,+,+*+*+*+*+*+*)**))**)()())()('(('('('('('('('('('(('(''('(:;:;:;<;<=<=>=>=>?>?@??@A@A@ABABABCBCBCBCCDCDCDDCDEDEEDDEFEFEFGFGHIHIJIJKJKJKLKLLKLKLKLMLMLMNMNM NMMNMNMMNMNMNONONOONNOPOPOPOPOPOPOPOPOPQPPPQQPQPQQPQPQPPQPQPQQPQPQPQPQQPQPQP QPPQQPQQPQQPQPQQPPQPQPQPQPOPOPOPOPOPONOONONONOONONONMNMNNMMNMNMLMLMMLMLMLKLKLKJKKJJKJKJIJIJIHIHIHGHGHGFGFGFEFEDEDCBCBBCBBABBAABABA@A@A@?@@??@?>?>?>=>=>=>==>=<=< =<<;<<;;<<;:;;:;:;:9:99::989898878876776545455454343232122101010/00/0/0/./../.-..-,-,-,-,-,+,+,+*+*+*+*)*)*))*)())('((('('('('('('('('('('(('(:;::;<;<=<=>=>==>=>?>?@?@?@A@AA@A@ABCBCBCDCDDEFEEFEEFGFGHGHIHIHIJIJKJKLKLKLLKLKLMLMLMMLLMNMNMNONONONOONOPOPOPOPOPOPOPOPQPPQPPQPQQPQPQPQQPQPQPQPQQPQPQPQPQPQPQPQPQPQPQPQPPQPQPQQPQPQPOPPOPOPOPOPPOPOPONOONONOONMNNMNMNMNMLMLMMLMLKLKLKJKJKJKJIJIJIHIIHHIIHGHGHHGGHHGFGFGFGGFEFEDEDEDCDCBCBBCCBBABBABA@A@?>?>?>=>=>=<=<;<;;<;:;::;::9:9:99:99:988787887676676565565454343432332321221210/0/00/0/././.-.-..-,-,--,--,+,+,+*+ *+**+*+**++*) *))*))*))*)())()('(''(('('('('('('('('('(;:;<;<;<=>=>==>?@?@A@AA@@A@ABCBCCBCDCDDCDEDEEDEFEFGFGHGHIHIHIHHI JIIJIJIJIIJKJKLKLKLLKLMLMLMLMLMNMNMMNMNMNONONONOPOOPOPOPOOPOPQPQPQP QPQQPPQPQQPPQPQPQPQPQPQPQPQPQPQPQQPQPPQQPQPPQPPQPQQPQPPQPQQPOPOPOPOPOPPOPONONON MNNMMNNMMNMNMLMLMLMLMLKLKLKLKKJKJKJKJIJIJIHIHGHGGHGHGFGFFGFEFEDEDDEDEDEDCDCDCDCBCBCBBABABA@A@?@?@?@?>?>=<=<<=<;<;<;:;;:;:;:98878767656655654343432322321010/0/00/././.-.-,-,+,+*++*+*+*)*)()()()()('(('('('('('('('('('('('(;:;<;<=<<=<=<=>?>?>?@?@?@ABAABCBBCBBCBBCDCDDCDDEDEDEFEFGFGFGHGGHGHIHIJIJIJJIJIJKJJKJKLKLMMLMLMLMLLM NMMNMNNMNMMNONONONONONONOPO POPOPOOPPOPOPOPQPQPQPQPQQPQPQPQPQPQPQPQPQPQPQQPQPQPQPPQPQPQPQPQPPOPOPOPOOPPONOONOONONMNMNMLMLMLMLLMLKLKLKKJKJIJIJIIJJIHIHIHGHHGHGFGFGFEFEFFEDEDEEDEDCDCCDCDCBCBBBABBABA@AA@AA@?@?@?>??>?>=>>=>=<=<=<;<;<;;<;:;:9::989887876767766765656554543432121010/0//0/0/././.-.-,-,-,,-,+,+,+,+*+*++*+*)*)*))*)()()('(('(('('('('('('('('('('('('(;<;<;<=<=>=>=>?>?@??@A@ABAABABCBCDCDCDCDEDDEDEEDDEFEFGFGHGHGGHIHIHIJIJKJKJKJKLKLMLMLLMLMNMNMMNNMNMN ONOONONNOONOPOPOPOPPOPOPQPQPQPQPQPQPQPQPPPQPQPQRQRQPQPQPQPQPPOPOPONOONNONONONONNONMNMNMLMLMLLMLMLKLKLKKLLKKJKJKJJKJIJIJIHIHIHIHGHGFGFGFEFFEFEDEDEDEDCDCDDCDCBCBABABA@A@A@@A@?@?>=<=<==<=<;<;<<;<<;:;::;:9:9:998988787677656545454344343432323233212112101010/0/0/./././.-.-..-..-,-,+,+,+,+,+,+,+*+*+*++*)*)*)()(()())()()('(('('('('('('('('('('('(:;<;<;;<=<=>=>? @?@@??@?@?@A@ABABABCBCDCCDDCCDEEDEFEFEFEFEFGFGHIHIHIJIJKJKJKJJKJKLKLMLMLMNMNONONONOONOPOPOOPOPOPQPQPQPQPQPQPQPQQPQPQRQRQRQRQRQRRQRQRQRQRQRQRQRQPQPQPQPQQPQPQPPQPOPPOPPOPOPOOPOPONONMNMNMNMNMNNMLMLLMLKLKLKLKKJKJIJIJIHIHIHGHGHGFGGFGFEFEFFEFEFEEDEDCDCDCBBCBABABA@A@?@?@??>??>?>=>=<=<;<<;:;:;:;: 9:9:9:9:9:98988788767676565655654545454343434432332232321212101010/0/0/0//0/.//.././.-.-,-,--,+,+,++,+,+ *+*++**+*++*+*)*)*)()())()('((('('('('('('('('('('('('(('(''(;<;<<;<<;<=<=>?>?>?@?@@?@?@ABABBAABCBCDEDDEDDEEDEDEFEFEFGFGHGHGHIHIHIJIJIJIIJKJJKJKLKLMLMLMLMNMNMNMNMNONONOPOPOPOPOPOPOPQPQPQPQPQPQQRQRQRQQRQQRQRQRQRQRQRQRQRQQRQRQRQQRQRQRQRQRQPQPQQPQPQPQPQPQPQPOPOPOPOPONOONONONONONMNMNMNMNMLMLMMLLMLKLKLKKLKKJKJJKJIJIHIHGFGFFGFEFEDCDDCBCCBCBCBABA@A@?@?>=>=>=<==<=<=<;<;:;:9:9889878767676676565454545434343443232321010/00/0//.//.-.-.-,-,-,-,+,+,+*+*+*)*)*))*))*)()()()('((('('('(('('('('('(('('('('('('(';<;<;<=<==<=>=>?>?@?@?@A@A@ABABABABCDCDEDEDDEDEFEFEFGFGFGGFGHGHGH IHIHHIHIIHIJIJKJKJJKJJKLKLKLKLMMNMNMNMNMNONONOONOPOPOOPOPOPPOPOP QPPQPPQPPQQPQPQPQQPQPQPQPQQRQRQRQRQRQQRQRRQRQR QRRQRQRQRQQRQRQRQRQRQRQRQQRQRQRQRQRQPQPQPQQPPQPQQPQPQPOPOPOPOOPOPOOPONONONMNNMNMLMLMLLMLML KLLKLKLKLKKKJKJKJKKJIJIHIHIHGHGHGFGFGFEFEFFEDCDCBCBCBABABBA@A@?>??>?>>?>=>>==>=<=<;:;;::;;:;:9:9:989898787877876767765665565565454343434323232121210/0/0//./.-.-.-,-,-,+,++,+*+*+*)*)**))*)()()()('('((('('('('('('('('('('('('('('(;<;<=<<=<<=>=>?>?@??@A@A@ABAABABABCBBCBCDCDDCCDCDEDEDDEEDEFEFGFGFGFGHGHGHGHIHIHHIJIJKJKJJKLKLKLKLMLMLMLMLMMNMMNMNMNNONONONONOPOPOPPOOPOPOPQPQPQPQQPQPQPQPQRQRQRQRQRRQQRQRQRQRQRQRQRQRQRQRQRQRQRQRQQRQRQRQRQRQQRQPQPQQPQPQQPQPOPOPOOPOOPOOPOPPOOPPONONONNONMNMNMNMLMLMLKLKLKLKKJKJKJKKJIJIJIHIHGFGGFFGGFEFEDEDEDDEEDCDCBCBABABA@?@?>?>=>==>=<=<=<;<<;:;:;;:9:98988988987676566545454343232122112112101010/0/0//./../..-.-..-,-,+*+*+**+* )**)*))*))*)*)()()()('('(('('((''('('('('('('('('('('('(;<;<;<=<<=<=>=>=>?>?@?@?@A BAABBABABBCBCDCDCDCDEDEEFEFEFEEFGFGFGFGHGHIHIHHIIHIJIIJIIJIJ IJJKKJKJKKJJKLKLKLMLLMLLMLMLMMMNONONONONOPOPOPOOPOPPOPQPQP QPPQPPQQPPQPQPQPQRQRQRQQRQRRQRQRQRQRRQQRQRQRRQRQRQRQRQRQRQRQRQRQRQRQQRQRQRQRQRQPQQPQPQPQPQPQPQQPQPQPOPOPOPOPONOONNONMNMNMNMNMLMLKLKLKLKLKJKJKJIJIHIHGHHGHGFGFGFEFEDCDCDCBCBABA@A@A@A@?@?>??>?>=<=<=<;<;:;:;: 9::9:9::9989889878767767765454554543433434323232122122101010110/0/0/././.-.-.-.-,-,,-,+,,+,+,+,+*+*++**++*+*)*)*))**)()())()('(('('('('((''('(('('('('('('(;<;<=<=<=>=>? >??@??@??@@?@A@A@ABABCBCBCDCDCDEDEEFEFGFGFGHGHIHIHIJIJKJKJKLKLKLMLMLMLLMNMMNMMNMNMMNONONONONOPOPOPPOPPOPQPQPQQPQQPQPQPQRQRQRQRQRQRQQRQRQRQRQRQRQRQRQRQRQRQRQRRQRQRQRQRQQRQRQRQRQQRQRQQRRQRRQQPQPQPQPOPOPPOPOPONONOONONONMNMNMMNMNMLMLMLMLKLKLKKLKJKJKJIJIJIHIH GHGGHGHGHHGFGFEFFEEFEFEDEDEDEEDCDDCCBCBABA@A@AA@@A@?@?>=>=>>=<==<<=<<=<;<;<;;:;:;:;:9:9:9899898787878765656545434 34432323232232121210/00//00//././.-.-,-,+,+*+*+*)*)*))*)()()()()(('('('('('('('('('('(('(('('(('(('('('<;<;<;<=<<=<=>=>?>?>?@ABABCBCDCDCCD EDEEDEEDEEFEFEFGFGFGHGHGHIHIHIJIJKJKJKLKLKLMLMNMMMNMMNNMNONONOONOONOPOPOPOPOPOPQPPQPQPQQPPQPQRQRQRRQRRQRQQRQQRRQRQRQRQRRQRQRQRQRQRQRRQRQRQRRQRQRQRRQRQRQRQRQQPQPQ PQQPQPQPPQPQPQPOPPOOPOPOPOOPONONONMNMNMMNMNMLMLMLKLLKLKJKJKJIJIHIHGHGHGFGFEFEFEDEDDEDCDDCCDCCBBCBBCBCBABA@A@@AA@?@?@@?>?>?>>?>=>>= >==<<==<<=<;<;:;:;:9898898787676566545454343232122121010/00/0/0/./.././.-.-..-,-,-,--,+,+,+*++**+*)*))()())()(()()()(('('('('('('('('('(<;< =<=<<==<<=>=>?>?@?@A@ABABCBCBCBCDCDEDEFEFEFGFGHGHGGHIHIHIJIJ KJKKJJKJKKJKLKLKLMLMLMLMMNMNONONONNONONOPOPOPOPOPQPQQPQPQPQPQPQPQ RQQRQQRRQRQRQRQRRQRRQRQRQRSRSRRSRQRQRRQQRQRQRQRQRQRQRQRRQQPQPQQPQPQPQPOPPOPOPOPOOPONONONONMNMNMLKLLKLKLKJKJIJIHIHIHGHHGHGFGFEFEFEDEDCDCDCCBCBABA@AA@AA@?@?>=>=>=<=<;<;<<;:;:9:989989878787676566565654543432 3221122121121011010110/0//././.-.-,-,-,+,,+,+,+*+*)*)*)**)**)()()()()('(('('('('('(('('('('(('('('((;<<;<=<=>==>=>>?>?@?@?@A@ABABABCBBCDCCDCDEDEEFEFGFGHGGHGGHGHIHHIHIJIJIIJIIJKJKLKLMLLMLMLMLMNMNMNMNNMMNONONOONOPOPOPOPPOOPQPQPQQPQPQPQRQRQRQRQRQRQRQRRQRQRRQRSRSRSRSRSRSRQRQRQRQ RQRRQRRQRQQRRQQPQQPQQPQPQPQPQPQPOPOPONONOONNONMNMNMNMLMLMMLMMLLMLLKLLKKLLKJKJKJIJJIJIIJIHIHIHIHGHGHGHGFGFGGFEFEFEFEDEEDEDCDCDDCCBCBBCCBABABA@A@?@?>?>??>??>=>=<=<=<;<;:;::;::;:9:98989889887787676565654554554543443443232101011010/00//0//./././..-.-.--.-,-,+,+*+*)*)*)*)()(()()('('('('('('('('('('('('('('('('('('(';<=<=<=>=>?>?@?@A@ABABABCBCCBCDCDDCDCDEDDEDEFEEEFEFGFGHGHIHIJIJKJKJKLKLKLMLMNMNMMNNNMNMN ONONOONONNOPOOPOPOPQPQPPQQPQRQRQQRQRQQRQRRQRQRRQRSRSRSRSRSRRSRSRRSRSRSRRSRSRRSRRSRQR QRQRQRQRQRRQRQRQQPQPQPPQPQPQPQPOPOPOPOPONONOONONMNMNMLMLLKLKLKKLKJKJIJIHIHHIHGHGHGHGFGFEDEDEEDEDEDCDCDCCBCBCBABABA@AA@A@?@?@?@@?>?>=<=<;<;:;;:;::;:9:9:9:989898787887676565454543432321210110/0/0/0//./.-.-..-,-,--,,-,+,+*+*+*+**+*+*)*) *))*))*)*))()()()()(('('('('('('('('('('('(('(;<=<=<=>= >?>>?>>??>?@?@?@A@A@@ABABCBCBCDCCDCDCDEDEFEEFGFFGFGHGHHGGHHGHIHIHIJIJIJKJJKJJKJJKLKKLKLMLMNMNMNMNMN ONNONOONONNOPOPOOPOPOPOPOPQPQP QPQPQPPQQPQRQRQRQRQRQQRQRQRQRRSRSRSRSRSRSRSRSSRSR SRRSRRSSRSRSSRSRSRSSRSRSRRSRRSRSRSRQRQRQRQQRRQPQPPQQPPQPQPOPOPPOOPPONONNMNNMNMNMNMLMLMLMMLMLLKKLKLLKJKJKJIJIHIHGHGFGFGFGFEFFEEFFEFEDEDCDCDCCBCCBBCBCBABA@A@?@?@?@?>?>?>=<=<=<;<;:9:9898787876765656545454454323232122101001010/0/0/././.-.-.-.-,-,-,+,+,+*+*)*)*)*)()(()()()(('(('('('('('('('('('('((;<=<=>=>?>?@??@?@?@A@ABABBABCBCBCBCDCCDEDDEEDEFEFFGFGFGGFGHGHIHIHHIHIJIJIJKJKLKLKLKLMLMLMNMMNMNMNMNONONNONNONOPOPOPOPQPQPQPQQPQRQRRQRQQRQRRSSRRSRSR SRSSRSRSSRSRSRSRSRSRSRSRSRSRSSRSRRSRSRRSRSRSRQRRQRQRQQRQRQRQQRQRQRQPQPQPQPQPOPOPONONONMNM LMLMLMLMLMLLKLKLKJKJKJKKJKJIJIIJIJIHIHIHGHGHGHGFGFEFEDEDEDCDCCCBCBCBA@A@?@?>?>=<=<;<;;<;:;:;:9:998998987887876767656656654545543434323223323212212101010/0/0/00/.//.././.-..-.-,-,--,-,+,+,+*+*)*)**)*)*)()())(()(('('('(('('('('('('('('(;<=<=>=>=>?>>?>>?@?@?@A@A@A@ABABCBCDCDCDEDDEDEDEDEFEEFEEFGFGFGFGFGHGHGHGHIHIIHHIJIIJJIIJKJKJKLKLKLMLMNMNMNNONOPOPOPOPOPQPQPQPQPQRQRQRQRQRQRSRRSRRRSRSRSRSRSRSRSRSRSRSSRSRS RSRSRRSRRSRSSRSRSRSRSRSRSRSRSSRRSRSRSRRSRQRQRQRRQRQRQRQQRQRQ PQPQQPPQPPQQPOPOPOPOOPONONONON MNMNNMNMNNMLMLMLL KLKLLKLKLLKJKJKJKJIJIHIHIHIHGHGHGFGFGFGFGFEFEFEDEDEDCBCBABBABA@A@?>?>??>??>=<=<;<;:;:;:9:99:9:9989898787878765654545543432332121210101010010/0/0/0/./././/.-.-.-..-,-,-,+,,++,+*++*+**+*+**+* )*)**)*)**))**)()())()()()(('('('('('('(('(('('('('('('('('('(<=<=<=>=>=>?@?@??@A@ABABABCBBCBCDEDEFEFFGFGHIHIIHIHIJIJIJKJKJKLKLMLMLMNMNMNMNNONONONNONONOPOPQPQPQPQQPQRQRQRRQRQRQRSRSRSRSRSRSRSRSSRSRSRSRSRSRSRSRSRSSRS RSRSRSRRSSRSRSRSRSRSRSRRSRSSRQRRQRQRQPQPQPPQPQPQPOPOPONONOONONONMNMNMNMLMLLMLKLKLKKLLKJKJKJIJIHGHGFGFEFEFEDEEDEDCDCCBCBCBABABBA@A@A@?@?>?>=>=<=<;<;<<;:;:;:9:998787787676676565654543434321011010/00//./../.-.-.--.-,-,-,-,+,+,,+,+*++**+*+* )*))**))*))**)()()()()(('('('('('('('('('('('('('('(('((<=>=>=>?>?>?@?@A@A@ABAABCBCCBCCDDCDEDEDEDEFEEFFGFGFGHGHGGHIJIJKJKJKLKLKKLKLMLMLMNMNNONONONONOPOPOPPOPQPQPQPQPQQPQRQRRQRRQRQR SRSRRSRRSRSRRSRSRSRSRSRSRSRSRSRSRSRSRSSRSRSRSRSSRSRSRSRSRQRRQRQRQRQPQQPQPQPPQPQPPQP OPOOPOPPOOPOPONONMNMMNMNMNMLLMLMLKLKKLKKLKJKJKKJKJIJIJIHIHIHIHGHGHGHGFGFEFFEEFFEDCDDCBCBABBABAABA@A@AA@@A@?@??@??@?>??>?>=>=>=<=<=<;<;:;;:99898989987876766765654554545543443432321212101010/0//0/././.-.-.-,-,+,+*++*+*+*)*)*)*)*)()()(())(('('(('('('(('('('('('('(';<=<=<=>=>=>?>?>?@??@?@A@ABAABABCDCDCDEDEDEFEFEFGFGHGGHGHIHIHIHIIJIJIJIJIJJKJKJKJKLKLKKLKLLKLMLMLMNMNMNONONONOPOPOPOPQPQPQQPPQRQRQRQRQRQR SRSRSRSRSSRSRSRSRSRSRSRSRSRRSRSRSRSRSRRSRRSSRSRRSRRSRRQRQRQRRQQRQRQRQQRQ PQPQQPPQPQQPQPOPOPOPPOOPOPONONONMNNMMNNMLMLMLMLMLMLKLKLKJKKJJKJIJIJIJIHIHHIHGHGFGFGFGFFGFEFEFEFEDEDCDCBCBCCBABA@A@?@@??@?@?>?>=>>=>>==>=<=<;<;<;:;:9::9998989878878767656545445434323322332321212101010/00/.//./.-..-,-,+,+,,++,,+*++*+*)*)*)*)()()(())(('('('(''('('(('('('('((''('(<=<=<=>=>>=>?>?>?@?@A@A@ABABCBCBCDCDCDEDEFEFEFGFGFGFGHGHGGHGHIHIJIIJIIJKJKJKLKLLKKLMLMLMLMNMMNMMNMNMNNOPOPOPOPQPQPQPPQRQRQQRQRQRQRQRSRSRSRSRSSRRSRRSRSRSSRSSRSSRRSTSTSSTSRSRSRSRSRSRSRSRSRRRQRQQRRQRRQRQQRQRQRQPQPQQPPQQPQPQPOPOPONONONMNMNMLMMLMMLMLKLKLKJKJJKJIJIJIHIIHGFGFEFEFEDEDEEDEDDCCDCBCBABAABA@AA@@A@?@?>?>=>=<=<;<;<;<<;:;:;:9:9:9989889989878876765654544543434323321212122101001010/0/00/./.-.-.-,--,--,,-,+,,+,+,+*+*)*)*)*)()()(('('('('('('('('('('('('(<=<=>==>==>?>?@?@?@A@ABABABCBCBBCBCDEDEFEFFGFG HGHGGHHGHGHIHHIHIJIJIIJKJKJJKLKKLLKLKLMLMLMLMNMNMNMMNONONNONOPOPOPOPOPQPQPQQPQQPQRQRQRRQRRQRQRRQRQRSRSRRSRSSTSTSTSSTSTSTSTSTSRSSRSRSRSRSRRSRSRSRSRSRRSRQRRQRQRRQRQPQPQPOPOPONONOONONON MNNMMNNMNMNMLMLKLKLKLKJKJKJKJIJJIIJIHIHHIIHGHGHGHGFGFEFEDEDCDCBCBABABA@AA@?@?@??@?>?>>??>=>>=>=>=<=<;<<;;<;:;:;:9:9:9898787876767656543434344343232101100110/00///.//.././.-.-,-,-,+,+,+,+*+*+*)*)*)*)()()(('('('('('(''('('('('('('(;<=<=>=>=>?>?@?@A@@AA@ABABCBCBBCBCBCDEDEFEEFEFFGFGHGHIJIJIJKJJKJKLKLMLMNMNMNMNONNOONOPOPPOPPOPQPQPPQPQRQQRQQRQRQRRQQRSRSRSRSRSRSSRSSTSTSTSTSTSTSTSSTSTSTSTSTSTSTSRSRRS RSRSRSSRRSRSRRSSRSSRQRRQRRQRQQRQRRQQRRQPQQPQPPQPQPQQPPQPOPPOPOPPOPOPPONONONON MNMMNMNNMNMNMNMLMLKLKLKJKJKKJKKJIJIJJIHIHIHGHGHGFGFGFGFEFEFEDEDEDDEDCDCDCCDCBCCBBCCBABA@A@?@?>?>?>?>=>=<=<==<;<<;<;:99:98987677676565665434323323212101101100100//0/ .//./././../.-.--.-,-,+,+,+,,++**+*+*+**+*)*)()())(())()(('('('('('(=<=<==<=>=>?>?>>?>?@?@?@A@ABABAABCBCDCDCDCDDEDE DEEDEEFFEFFEFFGFGHI JIJJIJJIJIJ KJJKJJKJKJKLKLKLLKLMLMLMMLMNMNMNONOOPOPOPOOPOPOPQPPQPPQQPQPQRQRQRQRQRQRSRSRSRRSRSRSRSRSSTSTSTSTSTTSTSSTSTSTSTSTTSTTSTSTSTTSTTSTSTTSTTSSTSTSTSTSSTSRSRSRSSRRSRRSRSRQRQRQPQPQPOPOPOPOPONOONONONMNNMMNMNMMLMLMLKLKLKJKJIJIHIHGHGFGFGFEFFEEFEDEEDEEDEDDCDCDCBCBABABA@A@A@A@?@?>??>>??>=>=>=>=<=<<=<;<<;:;:;:9::9898787876767767765655654543434323223232121221120100/0/././.-.-.-,-,,++,,+,+,,+*+*++*+*+*)**)*)*)()()()(('('('(('('(('('('('('('('('('('('('('(<=<=<<=>?>?>?@A@ABABABCDCDEDEFFGFGHGHIHHIHIHIJIJIJKJKJJKJJKLKLKLMLMLMNMNMNONONOONONOONOPOPOPQPQPQPQ RQRQQRRQRQRQRSR SRSRSRSRSSRSRSRSTSTSSTSTSTSTSTSTSTSTSTSTSSTTSTSTSTSTSTSSTSTSTTSTSTSTSRSSSRSRRSRRSRQRQRQRQRQPQPQQPQPQPOPPOPOPONONONMNMMLMLMLLMMLKLKLKJKJIHIHGHGHGHGFGFEFFEDEEDEDDCBABABAABA@A@A@?@?>?>>?>=>=<=<=<;<<;:;:;:9:9:9898898787767676 566566565565454554543232121221210110010/0/./.-..-.--.- ,-,--,-,,-,+,+,+,+*+*+*)**)**)()()(('('('('('('(''('('('(<=<=<=>=>==>?@A@ABABABCDCDDCDEDEEDEFEFFEFGGHGHIHIHHIJIIJIJJIJKLKKLKLMLMLMNMNMNONONNOONOO POPOOPOPOOPQPQPQPQPQRQRQRQRQRSRSRSRSSRSSRSRRSRSRSTSTSSSTSTSSTSTST STTSTTSSTTSTSTSTSTSTSTSSTSSTSSTSSTSTTSTSTTSTTSRSRRSSSRSRSSRSRSRRSRQRRQRRQRQRQPQQPQPQPQPQPOPOPONNONONNONONMNMNMMNMLMLMLKLKLKJKJIJIHIHIHGHGHGFGFGFFGFEFEDEDEDDCDCBCBCBCBABA@?@?>?>?>=>>=>=<;<;:;:;:9:9::989899878878767676765656545454543432323212210100//00/.//./.-.-,-,+,+,+*+*+*+*)*)*)**)*)() ())()(()(()(('('('('('('('('(('('('(<=<=>=>?>?>?@?@?@A@A@@A@ABABCBBCCBCDCCDCCDCCDEDEFGFGFFGHGHIHIHIHIJIJKJKJKLKKLKLMLMLMNONONONNONOPOPPOPOOPQPQPPQPQPQRQQRQRQRQRQRQRSRSRSRSTSTSSTTSTSTSTSTSSTSTSTSTSTSTSTSTSTSTTSTSTSTTSTSTSTSTSTSTSTSTSTSSRSRSRSRQRRQRQPQQPQPOPOPPONONONMNMNMMLMLKLKJKJKJIJIHIHIIHIHGFGFFGFGFGFEFEDEEDEDCDDCDDCBCCBCBABBABA@AA@A@?@?@?>?>?>>?>=>=>=<==<=<;<<;:;:;:99:9898788767667656565454545434323321211212101010/0/././.-..-.-.-,-,+,+,+*+*++*+*+*)*)**) ())()())())(('('('('('('('('(<=>=>=>?>?@?@A@@ABABCBBCBBCDCDCDEDEDEDE FEEFEFFEFFGFGGFGHGHIHIJIJKJKJKJKLKLKKLMLMLLMNMNMNMN ONNONONONONONOOOPOOPOOPOPQPQPQPQRQRQRQRQRSRSRSRSSRSRSTSTSSTSSTTSTSTSTSTSTSTTSTSTSTSTSTSTSTTSTSSRSRSRRSSRQRQRQRRQQRQPQQPPQQPOPOPOPOPONOONOONOONNONONMNMNMNMLMLMLMLKLKLKLKKLKJKJIJIJIJIHIHIHGHGFGFGFEFEDEDDCDDCCDDCDCBCBA@?@?@?@@?>??>>?>?=>>=>=<=<=<;<;<;:;;::;::9:9899876765665654545454343432332321212101010110//0/0//0/./.-.-.-,-,-,-,+,+,,+,+*+**+**+*)*)*)*)()()(()()()((('('('('('('('('('('('('<=>=>?>?>?@?@A@ABAABCBCBCDCDEDDEEDDEFGFGHGHGHIHIIHIJIJIJIJKJKJKJJKKJK LKKLKKLKLKLMLMLMLMMLMNMNMNMNONOONNONOOPOPOPOPQPQPQPQPQRQRQRQRQRSRSRSRSRSTSTSSTSTSTSTSTSTSTUTUTSTSTSTSTTSTSTSTSSTTSTSSRSRSRSRRSRSRSSRQRQRRQRQPQPQQPOPPOPONONMNMLKLKLLKJKJKJKJJIJIJIJIJIIHIIHIIHIHIHGHGFGGFEFEDEDEDDCDCBCBCBBABBABA@A@?@?@?>?>=>=>==>>=<=<;<;:;:;;:99::989898987878767656566566545434432321212112121010100/00/0/./.-.-.-.-,-,-,+,+,+*++*+*+*+*)*)*)()()(()()(('('('('('('('(('('(<=<=>=>?>?@??@?@A@@A@AB ABBCBBCCBBCBBCDCCDEFEEFEEFFEFFGFFGFFGFGHGHGHIHIHIJIJIJKJKJJKKJKLKLKLMLMLLMLMNMNMNMNMMNMNONONONO POPOOPPOOPOPQPQRQRQRRQQRQRQRSRSRRSRSRSRSTSTSTSTSTSSTTSTUTTUTUTUTUTUTUTUTSTSTTSTSTSTST STSTSTTSSTSSRSRSRRSSRRSRSRSRRSRQRQRQRQRQQRQPQPQPOPOPPOPOOPONO NONNOONNOONMNNMMNMNMLMMLMLMLKLKJKJJKJIJIJIJIHIHIHIHGHGGHHGFGGFEFEFEFEDDCDCBCBA@A@A@?@@?@?@?>?>=>=<=<;<<;;<;:;::9:98989878878767656545434323212212121011010//0/./.-.-.-.-,-,-,+*+*+*)*)*)*)()()(()(('('(('(('('('('('('('('('<=>=>=>?>?@?@A@A@@A@ABABCBCBCDCDEDEFEFEEFGFGFFGFGGHGHHGHGHIHIHIJIJIJKJJKJKJKLKLKLKLMLMNMNMNMNONOONOPOOPOPOPOPQPQPQQPQRQRQRQRQRSRSRSSRSRSTSTSTSTSSTSSTSTTSTSTSTTUTUTTUUTUTUTUTUT UTUTUTUTTUTUTUTUTSTSTS TSTTSTSTSTTSTSTSRSRSSRSRSRRSSRQRRQRQ RQQRQQRQQRQPQPQQPQPOPPOPOPOOPONONONOONMNMLMLMLKJKJKJIHIHGHGGHHGHHGFGFFGGFEFEDEDEDCDCDCBABBABAABA@AA@@A@?>??>??>=>>==>>=<=<;<<;<;;:;;::9:9898987876765656656654545434323212121010/00/0/././.-..--.-,-,-,+,+,+,+,+*+*+*+* )**)*)**))*)( )()()())()((('('('('('('(('('(<=<=>=>=>?>?>?>?@?@?@A@ABABABABCBBCDCDEDDEDDEDEFEFEFGFGFGGHGGHHGHIHIJIIJIIJIJKJJKJKLKLKKLMLMMLMNMNONOPOPOPOPQPQPQPQRQRQRRQR SRSRSRRSRRSRSTSTSTSTSTSTSTTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTTUTSTSTSTSTSTSTSRSRSSRSRSSRSRSRQRQRQRQPQPQQPOPOPPOOPO NONNONNONONNMMNMNMNMNMMLLMMLMLMMLLMLKLKLKLKJKJIJJIHIHGHHGHGGHGFGFGFEFEDEDEEDCBCBABA@A@@A@?@?@?>?>>??>=>=>>=<=<;<<;:;::9:9898787676767656565454543432321212100/0//00/./.././.-.-,-,+,+,+,+,+ *+*+**++*+*)*)*)()()(()())('('('('('('('('('('(('(<=>=>?>?>?@?@@?@ABABCBCDEDEDEDEFEFGFGFGFGGHGHGHIHIJIIJIJKJJKJKLMLMNMNMMNONOONOPOPQPQPQRQRQRQRSRSRRSRSRSRSTSTSSTSTSTSTT UTUUTUTUTTUTUTUTUTUTUTUUTTUTUTUTUTUTTUTUTUTUTUTUTSTSTSTTTSTSTSRSRSRSRQRQQRQRQPQPQQPOPOOPONONONMNMNMLMLMML KLKLLKLKLLKJKJKJKJKJIJI JIIHHIIHIHHIHGFGFGFEFEFFEDEEDCDCDCBCBABBABA@?@??@?>?>=<;<;:;::9:99:989898787876765656545445434434343232332 12112211221010110/0/0//0/./.-.-,-,+,+*+*+*+*)*)*)*))*)()()(('('('('('('('('('('(=>=>?>?@?@A@@A@ABABABBAABCBCBCBCDCDCDEDEFEFGFGGHGGHIHIJIJKJKJKLKLKLML MLMMLLMLMLMNMNONOPOOPOPOPQPQPQPQPQRQRQRSRSRSSRSSRSRSTSTSSTSSTSTSSTSTUTTUTUTUTTUTUTUUTUTUUTUTUTUTUTU TUUTUUTUUTUTUTUTTUTUTUTUTTUTUTTUUTUUTUTSTSTSTSTSSTSTSRSSRRSRSSRSRQRQRQPQQPQPPQPOPOPOOPOPONONOONMNMNNMNNMNMLMLMLKLKLKJKJKJIHIHIHHIHGHGHHGHGFGFEFEEDEDCDDCDDCBCBA@AA@@AA@?@??@?>?>?>?>=>=>=<=<=<=<;<;:;::9:98787787876767654554455434321212210110100/0/0/./././.-.-.-,-,-,+,+,,+,+*+*+*+*)*)*)()()(()('('('('('('('('('('('(''('=>?>>?>>?>?@??@A@ABABBAABCBCDCDEDE FEFFEFFEFFGFGFGGHIHIJIJIJIJKJKLKLKLMLMLMLMNMNONOONNOPOOPPOPPQPQPQQPQRQRQQRQRSRRSRRSRSRSSRSTSSTTSTSTSTSTUTUTUUTTUTUTUTUTUTUTUTUTUTTUTUTUTUTUTUUTUTUTUUTUTUTUUTUTUTUTUTUTUTSTSTTSTSTSTSTSTSRSRSRSRRSR QRRQRQRRQRQ PQPQQPQPPQQPQPOPONONONMNMNMNMMNMLMLMLMLLMLKLKLKJKJIJIHIHGHGFGFEFEEFEFEFEEDEDCDCBCBCCBABABA@AA@?@?@?>?>=>=>=<=<<==<<;<<;<;;<;:;:;:::9::9:9:9898787677656545543443434321212100/0/./.-.--..-,--,-,-,+*)*)*))*)())(()(()('(('('(('('('('('('('('('(<=>?>?>?@?@A@A@ABABCBCDCCDEDEDEFEFGFGHHGGHGGHIHIJKJKLKLKLMLMLMNMNONONONOPOPPOPOP QPPQPQPPQPQRQQRQQRRQRQRSRSRSRSRSRSRS TSSTTSSTSTSTSTTSTSTSTUTUTUTUTTUTTUTUUTUTUUTUTUTUTUUTTUTUTUTUTUTUTUTUUTTSTSSTTSTSTSTSSTSRSRS RSSRSSRRSRSRQRQRRQRQPQPQPOPPOPONONONOONMNMNMNMLMLMLKLKLKJIJIJJIHGHGFGFGGFFGFEFEEDEDCDCBCBA@A@A@?>?>=>=<=<=<;:;;:::989898787766767656565454543433434323233210100/0/./.-.-.-.-,-,+,+,+,+*+*+*+*)*)*)()('('('('('('(('('('('('('(('=>?>?>>?>?@?@A@ABABABBABCBCDCCDEDDEDEFEFGFGHGHIHHIJIJKJKJKLKKLMLMLMLMNMMNMMNONOPOPOPOPPOPPQPQPQRQRQRQR SRSSRSSRSRSRSTSTSTSTSTSTUTTUUTUUTUTUTUTUTUTUTUTUTUVUTUTUTUT UTUUTUUTUTTUUTUTUTUTTSTSTSTTSTSTTSRS RSRRSRSRRSSRQRQRRQPQPQPQPOPOPPOOPOPONONNMNMNNMMNNMLMLMMLMLKLKLKLLKJKJIHGHGHGFGFGGFGFEFEEFEFEEDDEDEDCDCBCBABABBABA@AA@A@?@?@?@?>??>>??>=>==>=<=<;<<;<<;:;::;:9:9:9898787876766765654554543432323223212121010100/0/.//.//.-.--.-,-,-,+,,+*+*+*)*)*)()()(())()('('('('('('('(''('('('('('('(=>=>?>?>>?@A@@A@A@A@ABABCDCCDCDEDEEDEDEFEEFEFGFGHGHIHIHIJ IJKJJKJKKJKJJKLKLKLMLMMLMNMNMNONONOPOPOOPPOPPQPPQPQPQRQRQRQRQRSRSRSRSRSTSTSTSTSTUTUTUTUTUUUTUVUVUVUVUTU TUTUTUTUTUUTUTUTUTTUTUTTSTTSTSSTSTTSSTSTSRSSRSRSRSRSRQRQRQRQPQPQPPOPOPOPONONNNONMNMLMLLMLKLKKLLKJKJKJIJIHIHIHGHHGHGHGFGFFGGFGFEFFEFEEDEDCDCDCBCBCBCCBABA@?@?>??>??>=>=<=<=<;<;:;:9::9:98989988787887676565654543434323232321211210100/0/0/./.-,-,-,+*)*)*)()()()('(('('('('('('(=>=>=>?@?@A@A@ABABAABCBCDCDCDEDEDEDEFEFGFGHGHHGHIHIHIIHIJIIJIJKLKLMLMNMNMNMMNMNONOPOOPOPPQQPQPPQRQRQQRQRQRSRRSRSSRRSRSRSRSTSTUTTUTUTTUTUTUTUUVUVUVUVUVUVUVUVUUVUVUUVUVUVUTU TUUTTUUTUUTUTTSTSTSSTSSTSRSSRQRQRQRQPQPQPQQPOPONONONNOONMNMLMMLMLKLKLKLKJKJIJIJIJIHIHGHGFGFEFEEDEDCDCDCBCBCBABABA@?@?@?>=>=<=<;<;:;:;;::;:9:987878767656565454543432322323212100/0/0/.-.-.--.-,-,-,+,+,+,+*+*)*)*)())()()()()('('('('('('('('('('('(('('('('('(=>=>=>?>?>?@?@A@@ABAABABCBBCCBCDCDCCDEDEFEFGFGHGHGHIHIHIJIJKJKJKKJKLKLMLMNMNMMNNMNONONONOPOPOPQPQPPQPQRQRQRQRSRSRSTSTSTSTSSTSTUTUTUTUTUTUTTUTTUUVUVUVUVUVUVUVUVUVUVUVUVUVUVVUVUUVUVUUVUVUVUTUTUTUTUTUTUUTUTUUTUTTUTSTTSSTTSTSTSTSTSTSRSRSRQRQPQPQPQPPQQPOPOPOPOOPONONNONMNMNMNMNMLMLKJKJIJIJIHIHIIHIHIHGHGHGFEFFEFFEDCDCBCBABA@?>?>>?>=>=<;<;::;:9:989898787887676565654543233223232121212210100/0/00/./.-.-.--..-,-,-,+*+*)*)*)*)())()()()('('('('('('('('('('((=>=>==>?>?@A@A@A@AABABABCBCDCDCCDEDEFEEFEFEFEFGFFGFFGHGHGHGHHHIHIHHIHIJKJKLKKLLKLKLMLLMMLMNMNONNONONONOPOPOPQPPQPQPQQPQRQRQRQRQRSRSRSRSRSTSTSTSTSTUTUTUUTTUTUTUUVUVUVUVUVVUVUVUVUVUVVUVUVVUUVUUVVUVUVUVUVUVVUUVUVUVUUVUTUTUTUTUTTUTUTUTSTTSSTSTSRSRSRSRSRSSRQRQQRQ PQPQQPPQPQPOPONONONMNNMNMMNMLMLMLKLKJKJKKJIJIJJIJIHIHIIHGHGFGFEFEEDEEDEDCDCBABABBA@A@?@?>?>=>=>=<==<=<;:;:;:;:9:98989878787876765656545434323223232121210101100/0//0//00/./.-.-.-,-,+,,+*+*+*+*++*)*))*)()())('('('('('('('('('('('('(=>=>=>?>?@?@?@A@AA@ABCBCBCBCDCCDCDCDEDEDEFEFGFGHGGHGHHIHI JIJIJJIIJKJKJKLKLKLMLMLLMNMNMNMNONOPOPOPOOPQPQPPQQPQPQRQRSRSRSRSRSRSTSTSTSSTSTSTUTUTUTUTUVUVUUVUUVUVUVUVUVUVUVUUVUV UVUVVUVUVVUVUVUVUVUVUVUVUUVUVUVUUVUVVUTUTUTUTTUTUTSTSTTSTSTSSTTSTSRSRSRSRQRQRQRRQQRQPQPQPPQPOPOOPOPPOONONMLMLMMLKLKJKJKJIJIHIHIHGHHGHGHGFGFEFEEEFEDEDEDCDCBCBABA@A@?@?@?>??>?>=>=<=<;<;:;:;::;:98987878778767676565654543432332323212212101010/00/0/./.-..-.-,-,-,+,+*+*)*)*)*)*)*)()()(()('('('('('('('('('('('(('('('(('>=>=>?>?@?@A@A@ABABCBC BCCDDCCDDCDCDEFEFGFFGHGHGHHIHHIHIHHIJIJ KJKJJKJKKJKLKL MLMLLMMLLMMLMNMNONONOPOPOPOPOPQPQPQPQQPQRQRQRRQRSRSRSRSTSTSTUT UTTUUTUTUTUTUTUTUVUVUVUUVUVUVUVUVUVUVUVUVUVVUVUVUVUVUVUVVUVUVUVUVVUVUVUVUVUUVUVUTUUTUTUTSTSTSTTSTTSTSTSRSSRRSRSRQRQRQRQPQQPQPQPOPOPOPPOONONMNMNMNMLMLMLKLKLKJKJIJIJIHGHGFGFGFEFEEFEDEDCDCDDCCDCBCBBCBBCBABBABA@A@A@A@?@?>?>=>=<=<=< ;<<;<;;<;<;:;:;;:9::98998987876776 766565565655654545434343232332121010100100010/0/0/././/.-.-.-,-,-,-,,-,+,++,+*+*++*+*+*)*)*)*)()(()(()('('('('('('('('('('(( >==>>=>>??>?>?@?@?@A@ABABCBCBCDCDCDEDEFEFEFGHGHGHHIHIJIJJIJK LKLKLLKLLKLMNMNMNONONOONOPOOPOPOOPQPPQPQQPQPQQPQRQRQQRSRSRSTSTSTTSTSSTUTUTTUTUTUUTUTUVUVUVUUVUVUVUVUVUVUVUVUVUVUVUVVUUVUVUVUVUVUVUVUVUTUUTUTUUTSTSTSTSTSTSSTTSRSRSRQRQRQPOPPOOPPOONONONMNMLMLMLKLKJKJIJIJIHIHHGGHGHGFGFEFEFEDEDDEDEDCDCBCBABABA@A@?>?>=>=>>=<=<=< ;<;<<;;<;;:;:9:9898767656545445434344323232121010110/00//0/0//./././..//.-.-,-,--,-,+,++,,+*+*+*)*)*))*)*)()()()('('('('('('('('('('('('('('('(=>=>?>?@?@@?@A@ABABBAABCBCDEDEFEFFEEFGFGHGHHIHIHIJIJIJKJJKJJKLKLKLMLMLMNMNMNMNMNONONONOPOPOPQPQPPQPQQQRQRQRQRRQRSRRSRRSSRSTSSTSTSTST UTTUTUUTUTUTUTUVU VUVVUUVVUVVUVUVUVUVUVUVUVUVUVVUVUVUVUVUVUVVUVUUVUVUUTUTUTUTUTUTSTSTTSTSTSRSRSRQRQRQRRQQRQPQQPQPQQPQPOPOOPOONOONNOONMNMMNMMNMLKLKLKLKKLKJKJKJIJIHIHIHGHGHHGFEFEFEDEDCDCDCBCCBBCBABA@A@?@?>?>>?>??>=>==<=<=<;<<;;:;;:9::989989987878778767654543434323323232121011010/0/0/././/.-.--.-,-,-,+,+,+*+**++**+*)*)*)*)*)())(()()('('('('('('('('('('(('(>=>?@?@A@A@ABABAABBABCBCBCDCDEFEFGFFGGFGFGHIHIHIJIJIIJKJKKJKLKLMLMNMNMNONNONNOONOPOOPPOOPQPQPPQQ RQRRQQRQRQRSRSRSSRSRSTSTSTSTSTSTUTTUTTUTUUTUTUVUVUVUUVUVUVUVUVUVUVUVWVUVUV UVUUVUUVUUVUVUVUVUVUUTUTUTUTUTTUTSTSSTSTSTSSRSRSRSRSRQRQRQRRQPQPOPOPOOPOONONOONMNMMNMLMLMLMLKLKLKJKJKKJKJIJIJJIHIIHHIHGHGFGFEFFEDEDEDCBCBABA@AA@@A@?@?>?>=>=>=<=<=<;;:;:;:9:99:9898787676565454543434321212121121010/0/./././.-.-.-,-,+,+,,+*+*)*)(()()('('('('('('('('('(=>?>?@A@@A@A@ABAABCBCDCDEDEDEFEFEFEFGFGGFGHGGHHGHHIIHHIJIJKJKLKKLKLMNONONOPOPOPOPQPQPQPQQPQQRQRRQRQRQRSRSRSTSTSTUTUTUVUVUVUVUVUVVUVUVVUVWVWVWVWVWVWVUVUVUVUVUVUVUVUUTUTUTTUTUTUTUTSTSTTSTSRSRSRQRQRQRQPQPQQPQPOPOPOOPOONONMNMLMLMLKLKLKJKJKJIHIHIHGHHGFEFEFEDEDEDCDCCDCDCBCBCBAABA@?@?>?>=<==<;<;<<;;<;;:;:9:9:98988987878787676565454545434334323232121210010/0/0/0/.//./.-.-..-.-,-,+,+*+*+*+*)())('('('(('('('('('('('(>?>?>>?@?@A@A@ABABABCBCDEDEDEFEFFEFGFGHGHHGHHGHHIHIJIJKJKJKJKLKKLKLMLMLMNMNMNONONONONNOPQPQQPPQPQRQQRQRQRSRSRSRSTSTSTSTUTUTUTUTUTUVUUVUUVUVUVUVUVUVVWVWVWVWVVWWVWVWVWVWVWVVWVWVWVWVWVWVWVUVVUVUVUVUVUVUUVVVUTUTUUTUTUTUTUTSTSTSRSRSRQRQQRQPQPQQPOPOPPONONNONMNMNMNMLMLMMLLMLKLLKJKJIJIJIHIHIIHGHGFGFGFFEDEDCDCDCBCBCBCCBA@A@?@?@?>?>?>=<=<=<;:;:;:9:9:9898987876767676565654545544554343432321211221010110/0/0/00/./././/.-.-.- ,--,--,,--,+,+,+*++*+*++*)*)*))*)*)()()()(()('('('('(('(('('('('('('('('('(=>=>?>?@?@A@ABABABCDCCDCDEDEFEFGFFGHGHGHGGHGHIHIJIJIJKLKKLKLLMLMLMNMNONOONOPOPOPQPPQPPQPQRQQQRQRSRRSRSSRSSRSRSTSTSTUTUTTUTUUTUTUUTTUVUUVUVUVUVUVVWVWVVWV WVVWVWWVVWVWVWVWVWVWVWVWVWVWVWVWVVWVWVUVUVUV UVUVVUVUUVUVUVUVUTUTUTUTUTSTSTSTSRSRSRSRQPQPQPQPOPPOOPONONMNMNMMNMLMMLLMLKLLKLKJKJIJIJIJIIHIHIHGHHGGHGFGFGFFEFEFEFFEDEDEDCDDCDCCDCBCBCBABABABA@AA@?>?>>?>=>=<;<<;<<;;<;:;:;:;:9:98988987876767765656566545454343432321210010/0//0/././../.-.-.-,-,--,+,+,,++,++,+*+*+*+**++*)*))*)*)())())()(())('('('('('('('('('('('('('((>?>?@?@?@?@A@A@@ABCBCBBCDCDEFEFGFGHIHIHIJIJIJKLMLMNMNONONOPOPQPQPQRQRQRSRSRRSRSTSTSTUTUTUTUVUUVUUVUVUVUVUVVWVWVWVWVWVWVVWWVWVWVVWVVWVWVWVWVWVWVWVWVWVWVWVWVUVUVUVUUVVUVUVU TUUTUUTUTUTUTUTUTSTSTSTSTSTSRSRSRSRSRQRQRQPQPQPQPOPPPOPONONONMNNMMNMLMLKLKLKJIJIJIHIHIHHIHGHGGHGFFEFEFEDEDCDCDCBCCBCBABA@?@? >?>??>>?>?>=>>=>=<=<=<;<;<<;:;:9:9:98988987878767676765656545454343433432321 21211211010001010/0/0/././.-.-,-,-,+,+,+*+*)*)*)*)(())()()()('(('('('(('('('('('('(>?>?@?@?@ABABABABCBCBCBCDCDEDEEDEFEFFEFEFGFFGFGFGHGGHGHIHIIHIJIJJIJKJKJKJKJKLKKLKKLMLLMLMNMNONONONONOPOPOPOPQPQPQQPQPQRQRQRQRRQRSRSTSTSTSTUTUUTUTUTUTUTUVUVUVUUVUVVUVUVUVVUVWVVWVWVWV WVVWVWVVWWVWVWVWVVWVWVWVVWVWVWVWVWWVWVWVWVWVWVUVUVVUVUVUTUTUTUTSTSSTSRSRRSRQRQQRRQRQPQPOPPOPONONMNNMNMLMLKLKLLKJKKJJKJJKJIJIJIHIHIHGHGGHGHGFGGFGFFFEDEEDEDCDCBCCBABABAABA@A@A@?>?>>?>=>>=>=>=<=<=<<=<;<;<;;:;:;;:9::99:989898788787676565454543432323212101010/00/0/0/.//.-.-..-.-,-,-,-,+,+,,+,+,+*+*)*)**)*)()()()(()(()()('('('(''('('(('('('('((''('(>?>??>?@?@A@@A@ABABCBCBCDCDEDEDEFGFGGFFGHGHIHIJIJKJKLKLKLMLMLMNMNONONONNOPOPOPQPQPPQQPQRQRQQRSRSRSTSTSSTSTSTSTUTUTUUTTUTUTUTUVUVVUUVVUVUVVUUVUVUVWVVWVWVVWVWVWVWVWWVWVWVWWVWVVWWVWVWVWVWVWVWVWVWVWWVVWVWVWVVWWVWVUUVUVUVUUVUVUTUTSTSTSRSSRSSRSRQRRQQRQRQQRQPQPQPQPOPOPPONONMNNMLMLKLKJKKJIJIHIHGHGFGFEDEDCDCBABA@A@A@A@?@@?>?>=>=>=>=>=<=<;<;;:;: 9:99::998898787877676767656654543434323212121212110/0/././.-..-.-.-,-,--,-,+,,++,+,+*+*+*)*)*))('('('('('('('('('('('('((>?>?@A@A@ABAABCBCDCDEDEDEFEFGHGHGGHGHIHHIIJIJIJIJKJKJJKJKLKLMLLMLLMLLMNMNONNONOPOPOPQPPQPQPQRQRQRRRQQRSRSTSTUTUTTUTUVUVUVUVUVUVUUVVUVWVWVVWVWVWVWVWWVWVWWVWVWVWVWVWVWWVVWVVWVWVWVWVWVWVUVUUVVUVUVVUUVVUTUUTUTUTUTSTSTSRSRSRSRQPQPQPQPOPOPOPONOONONOONMNMNMLMLKLLKLLKJIJIJJIJIHIHHIHIHGHGHHGHGFGGFFGFEFEEFEDEDCDCDCDCBCCBA@A@?@?>?>?>=>=>=<;<;;<;:;:;:9:9:99:9876766776565454545434343232321212121010/00//0/0/././.-.-.-,-,-,-,+*++**++*)*)**)*)()()('('('('(''('('('('('('(>?@??@??@A@@ABABCBCBCDCDCCDEDEFEFFEFGFGHGHIHIHIIIJIJIJIIJKJKJJKJKLKKLKLMLMLMNMNMNONNONO POOPPOPOOPOPQPQPPQRQRQQRQRSRSRRSRSRSRSTSTSTUTUTUUTTUTUVUVUVUVUVUVWVVWVWVWVWVWVWVWWVWVVWVWVWVWVWVWWVWVWVVWWVW VWWVVWVVWVWVWVWVVUVUVUVVUVUUVUTUTUTUTSTSTTSSTSRSSRRSRQRRQQRRQPQQPPQPPQPQPPPOPONONONONMNMNMNMLMLMLKJKJKJIJIHIHIHGHGHGHGFGGFFGFEFEDEDDEDEDCDCBCBABAABA@A@A@?@?>?>=>=<=<;<;:;:9:9:989989878787676765455454543432332332232110110/0/0/00/0/./../.-.-,-,+,+,+,+*+*+*)*)()()()('('('('('(>?>?@?@?@A@ABABCBCDEDEFGFFGGFGHGGHGHGHHIHIIJIJKLKLLKLMLMNMNONONOPOOPOPQPQPQRQRQQRQRQRRRSRSSRRSTSTST UTUUTUTUTTUVUVUVVUUVUVUVWVWWVVWVWVWVWWVWVWWWVWVWWVWVWXWXWXWVWVWVWVWVWVWVWVWWVVUVUVUVUUVUVU TUUTTUTTUTUTUTSTSTSSTTSRSRSRSRQRRQRQPQ PQQPQQPQPPPOPOPPOPONONONNOONNMNMNMMNMLMLKLKJKKJKJIJIJIHIHGHGFGFEFEFEFEDEDEDCDCDCBABABA@A@@A@?@?>=>=>=<=<<=<;;:9:9::9:989987876765656565565454545432321212211211010/0/0/././.-.-.-,-,-,,-,+,+,+*+*+*)*)*)*)*)())()('('(('('(('('('('('('('('('('('('('(>?@A@A@ABABCBCDCDEDEDEFEFGFGHGHIHIHIIJIIJIJIJKJJKKJKJKLKLKLMLMLMNMNONOONOONOPOPOPQPQPPQQPQRQRRQRRQQRRQQRRRSRSRRSRSTSTSTUTUTUTUVUVVUVUVUVVUVUVWVWVWVWVWWVWVWVWWWXWXWWXWXWXWXWXWVWVWVWVVUVUVUVUTUTUTUTUTUTSTSTTSTSRSRSRSSRSSRQRQRQRQPPQPQPQPQPOPOOPPONONMNMNMLMLMLKLKJKJKJIHIHHIIHIHGFGGFEFFEFEDEEDCDDCDCDCBCCBABBABA@A@A@A@@?@?>?>=>=>>=<;;<;:;;::;:9:9:98787787677656545454343432321212101010/0/.//./../.-.-.-,-,-,-,+,+,+*+*++**+*)*)*)*)(()())())(()('('('('('('(''('('('(>?@??@??@A@ABABABCBCCBBCBBCDCDEDEDEDEFEFEFGFGGFFGHGHGHGHIHIHHIIJIJIJIJKJKJJKLMLMLMLLMNMNMNMNONOPOPOOPOPQPQRQQRRSRSRRSRRSTSSTSSTTSTU TUTTUTUUTUTU VUVVUVUVVUVUVWVWVWVWVWWVVWWVWWXWXWXWXWXXWXXWWXWWXWXWXWWXXWXWWXXWXWXWXWXWXWXWVWVWVWVWVWWVWVWVWVUVVUVUVUUVVUTUTTUTUTSTSTSRSRSRSRQRRQRQQRQPQPQPPQPQPPOPOPOOPOOPONONMNNM NMMNMMLLMLMLKLKJKJKJIJJIJJIJIHIIHIHGGFEFEEFEDEDCDDCDCDDCBCBCBCBABA@?@?>?>?>=<=<=<<;<;<;:;;:9::9:9898788787676765454343432323212212121110110/00/0/./.-.-,-,-,+,+,+*+**+*+*)*)*)*))()('('('('('('('('(('('('(>?@?@@?@?@A@A@ABAABCBCBBCDCCDCDCDEDEFEFEFEFGFGGFGHGGHHGHIJIJKJKKJKLKLLKKLMLLMNMNMMNONOPOPQPQRQQRQQRQRSRS TSTSTTSTSTSTUTUTUTUVUVUUVUVUVWVWVWVWVVWVWVWVWVWVWWXWXWXWXWXWXWXWXWWXWXWWXWXWXWXWXWXWXWXWVWVWVWVWVWVUVUVVUVUVUVUVUTUTSTSTSTSRQRQPQQPQPOPONONONONMNMNMNMLMLMMLKLLKLKJKJKJKJIJIHIHGHGGFGFEFEFEEDEDCDDCDDCBCCBCCBBCBABA@AA@@A@?@?>??>=>==>=>=<=<;<;:;:;:;:987877887676565565545434323232232121211010/0/.//./.-.-..-,-,--,+,+,+,++*+*+*)*)*))()()()('('('('('('('((?@?@?@A@@A@@ABABAABCCBCBCBCDCDCCDEDEFEFGFFGFGHGHGHGHIHIHIJKJKJKJJKLKLKLLMLMLLMNMNNMMNONONO POOPOPPOPOPQPPQPQRQRQRRQRQRSRRSSRSRSRSTSTSTUTUTUVUVUVWVWVWVWVWXWXWWXWXWXXWXWXWXWXXWXWXXWXXWXWXXWXWXWXWXWWXWXWXWVWVWVWVWVWVVWWVWVWVUVUVUTUUTUTSTSTSTSRSSRSRSRQRQRQPQPQPOPOPONONMNMNMLMLMLKLLKJKJJKJIJIJIHIHIHIHGHGGFFGGFEFEEDEEDEDEDDCCDCBCBABABA@AA@A@?@?>?>?>=<==<=<<=<;<;:;:9:9:98998988987876767676565454343432321211010100110/0/././.-.-.-,-,+,,+,+*+*+*)*)*))*))())())()('('('('('('('('('('(>?>>?@?@ABABABCBCDCDEDEDEFGFGFGHGHIHIHIJJIJKLKLKLKLKLMLLMMLMNONONOONOPOPOPQPQRQRQRSRSRRSTSTSTSTUTUTUTUVUUVUVUVUUVWVWVVWVVWVWWXWWXWXWXWXWXWWXXWWXWXWXWXWXWXWXWWXWXWXWXWXWXWXWXWWXWXWXWXWXWXWVWVWVWVWVUVUVUTUTUTSTSTSRSSRQRRQQRQRPQQPQPPQPPQPOPONONONMNNMNMLMLKJKJIJJIJIHIHIHGHGHGGGFGFEFEDEEDEEDEDCDCCDCBCBABABA@A@?@?>?>?>=>=<=<=<;:;;:;;:9:98987878778767676566556656545434323223212121101011010/0/././.-.-,-,-,+,+,+*+*+*)*)*))()('('('('('('(('('(>?@?@A@A@ABABCDCDCCDEDEDEFEFGFGFGHGGHGHIHIIJKJKLKLKLMLLMLMNMMNMNMNMNNONONOPOPOPQPRQRQQRSRRSSSRSTSTTSTTSTSTUTTUTUV UVUUVUVVUVUVVUVWVWWVWVWXWXWXWXWXWWXWXWXWXXWXWXWXWXWXXWXWXWXWXWXWXWXWXWXWXWXWXWXWVWVWVWVWWVWVWVVWVVWVUVUVUVUVUTUTUTTUTSTTSTSRSRSRSRQRQRQPQPQPQPOPOPOPONONNONONMNMLMLMLMLKLLKLKLKJKJKJKIJIJJIJJIHIHGHHGGFGFGF EFEFEFEEFEEDEEDCDCDCBABABA@A@@A@?@??@?>?>=<=<<=<;<;:;::;:9:9::9:98989987887787676565654545454344343212111010/0/././/./.-..-..-.-,-,+,++,+*++*+*)*)*))()()()('('('('('('('(?>?@?@A BABABABBCCBCBCCDCDEDEDEFGFGFFGHGGHGHIHIHIJIJJJIJKJKLKLMLLMMLMLMMNMNMNONONOPOPOPOPOPQPQPQPQRQRQRQRQRSRSSRSTSTSSTSTUTUTUVUVUVWVVWVWVWVWVWVWXWXWXWXWWXWXWXXWXWXWXWXWXWXWXXWXWXWWXWXWWXWWVWVWVUVUVVUVVUVUTUTUTUTSTSTSRSRSRQRQRQQPPQQPOPOPONONONMNMLMLMLKLLKLKLKJKJIJIHIHHIHGHGGFEFEFEFEDEDCBCBABABA@A@?@?>??>?>=>=>=<=<==<;<<;:;:9:9:9898767767667656565454554543432332322332121121101010/0/0/.//../.-.-.-,-,-,-,+,+,+,+*+*+* )*)**))*))*))()()()('('('('('(('('(?@??@?@A@A@ABCBCBCDCDEDEFEEFGFGHIJIJJKJJKKJKKJKLKL MLLMLMMLMLMNMMNMNONOPOOPQPQPQRQRQQRQRQR SRSRSSRSRSRSRSTSTSTUTUTUTUVUVUVUVUVWVWVVWVWWVWVWWVWVWXWWXWXWXWXWXWXWXXWXWXWXYXYXWXWXWXWXWXWWVWWVWWVWVWWVWVUVUVUVVUVU TUUTUUTUUTUTSTTSTSTSRSRQRRQRRQPQPQPOPONMNMNNMNMLMLMLKLKLKJIJJIHIHIHGHGGFGFEFEDEDCDCDCBCBABABBA@A@@AA@A@?@?@?>??>?>=>=<=<=<<;<<;:;:;:9::989878767676676565665654543432323212112121010/0/0/././.-.-,-,-, +,,++,+,+,+*+*+*+*)*)*))()()(())('('('('('('('('(('(?>?@?@A@A@A@@ABABBABCBCDCDCDEDEFEFEFEEFGFGFGHGGHGGHHGHIHIHIHHIJIJJIJJK JKJKLKLKLKLKLMLMNMNNMNONONOPOPOPQPQRQRSRSSRSTSTSTSTUTTUTUTUTUVUVUVVUUVUVWVWWVWVWVWWVWXWXWWXXWWXWXWXXWWXWXWXWXYXYXYXYXYXWXWXWWXWXWXXWXWXWXWWVWWVWVVWVWVWVUVUVUVUVUTUTUTSTSTSRSRRSSRSRQRQQRRQQPQQPQPOPONOONNONMNMLMLMLKLKJKJKJIJIHIHGHGGFGFGFEFEEFEDEDEDCDCCDCBCBBCBABABBA@A@@?@?>?>?>>=>>=>>=<=<=<<=<<;<;:;:9:9898787887876765665454344323232323212121101010/0/./.-.-,-,+,,+*+**)**)*)*)*)(()()())()('('('('('('('('('(>?@?@??@A@@A@@ABABCDCDEDEFEEFGFFGHGHIHIHHIHIJIJIJJJKJKLKLKLMLMNMNONNOPOPOPQPQRQRQRRSRSRSSTSTSTUVUVUVUUVWVVWVWVWVWWVVWVWXWXWXWWXWXWWXWXWXXXYXYXYXYXYXYXYXYXYXYXWXWXWXWXWWWXWVWVWVWWVVWWVWVVWVUVVUVVUVVUTUTUTSTSTSRSRSRRSRQRQRQQPQPQPOPOPOPONOONONMNMMNMLMLMLKLKJKJKJIJIIJIHIHHIHGHGGHGHGFGFGGFEFEFEDEDEDEDCDCDCBCCBABA@A@A@?@@??@?>?>>?>=>==<=<==<<;<;:;:9:989889878787676765654554455434343232321212101010/0/0/./.-.-,-,--,+,,++,+,+,+ *+**+**+*+*)*))*))()()('('('('('('('('('('(''(?@??@A@A@ABABCBBCDEDEFEFGFGHGHGHHIIHIIHIJJKJKJKLKKLMLLMNONNONONOPOPPOPQPQPQRQRSRSRSRSSTSTSTSTUTUTUVUVUVVUVWVWWVWVWVWVWXWXWXWXWXWXXWXWXXYXYXYXXYXYXXYXXYXYYX YXYXXYXYYXYXYXYXYXYXYXYXXYXWXWXWXWXXWXWXWWXWWXWVWWVVWVWVUVUVUVUTUTUTUTSTSTSTSSTSTSRSRSRRSRQRQRQPQQPQQPPQPOPOPONOONONMNMLKLLKLKJKJKJIJIHIIHHIHGHHGFEFFEEFFEDEDCDCBCBABABA@A@?@?>=>=>=<=<<;<<;<;:9::9:989878765665656543432322121121010010/0/./../.-..-.-,-,-,+,+,,+*++*+**+*)*)*))()())()()()('(('('('('('('('('('(>@@?@A@A@ABABABABCDCCDCDEDDEFEEFEFFEFGFGHIHIHIIHIJIJJIJJKJKLKLKLMLMLLMNMNNMMNMNONOONOPOPOPOPQPQPPQRQRQRQRSRSRSRSTSTSSTUTUUTUTUTU VUVVUVUVUUVWVWVWWVVWVWXWXWXXWWXXWXWXXWXWXYXYXYXYXYXXYXXYXYYXYXYXYYXYXYXYXYXYXYYXYXYXYXYXXYYXYXYXWXWXWXWXWXWXWWXWVWWVVWVWVVWVVWVUVUVUUVVUTUTUTUUTSTTSSTSTSRSRRSSRRSRQRQQRQQRQRQPQPPQPQPOPONONNONMNNMNMNMLMLLMMLKLKLKKJKJIJIJIJIJIHGHGHGFEFFEFEDEDCDCBCBABAABA@A@?@@?@?>??>=>=<=<=<;<;<;:;;:;:9:9 8998998878876766765654543432323322321121010/0/./.-.-,--,,-,+,+,+*+*+*)*)*)*)))()()()()()('('('(('('('('('('?@?@A@A@ABAABBABBABCBCBCDCDCCDCDEDEDEFEEFEEFGFGFGHIHIHIJIJJKJKKJKLMLMLMNMMNMNONONOPOPOPQPQRQRQRSRSRRSRSTSTSSTSTUTUTUVUVUVWVWVWVWVWXWXWXWXWXWXWXWXYXXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXWXWXWWXWXW VWVWWVVWWVVWVWVWVUVUVVUUVUVUTUTUTUTSTSTSRSRQRQRRQQPQPOPOPONONOONMLMLMMLMLKLKJIJIHIHIHGHGGHGFGFGFEDEDEDCDCBCBABABA@A@AA@@??@?@?>?>??>=>=>=<=<<;<<;<;:989889878765654545434432323212122101010/00/00/.-.-,-,--,,-,+,,++,+*+*+*)**)*))()()()()('('('('('('(''('('('('('('((?@??@A@ABABCBCCBCDCDCDEDEDEFEFEFEFGFGHGHIHIJIJIJKJKLKLMLMNMNNMNOPOPOPQPQPQRQRQRSRRSTSTSSTSTUTUTUVUUVUVUVUVWVWVWWVWVWWVWXWXWXWWXWXWXYXYXYXYXYXYXYXYXYXYXYXYXYYXYXYXYYXYXYXYXYXYYXYXXYXYXWXWXXWXWXWVWVWWVWWVWVWVUVUVUTUTUTUTSTSRSRSRSRQRQRQPQQPOPOOPPONONONNONMNMNNMLMLLKLKLKLKJKKJIHIHIHGHGFGFFGFEFFEEFEDEDCDCBABABA@A@?@?>?>=>=>=<=<=<;<;<<;:;:9:98989876765654545454343233232322101010/0/.-.-,-,+,+,+,,+,+*+*)*))*)**)*))()()('(('('('('('('(@??@@?@@?@A@A@ABABABCBCDCDCDEFEFGFGHIJIJIJKJKJJKLKLLKLMLMNMNMNONOPOPPOPQPQPPQRQR SRRSRRSRRSRSTUTUUTUTUTUVUVUVWVWVVWVWVWXWXWXWXWXWXXWXYXYXYXYXYXYXXYXYXYXYXYXYXYXY XYXXYXXYXXYXYXYXYXYXYXWXWXWXWXWXXWXWVWWVWVWVWVWVUVUVUVVUTUTSTSTSRSRSRQRRQRQPOPPONONMNMNMLMLKLKLKJKJIHIIHHIHIHHGFGFGFEFEDEDCDDCBCBABA@A@A@A@A@?@?>=>=<=<<=<<=<;<;<;<<;<;:;:9:9:9898787676676545434334323212101011010/ ./.././../.-.-,--,+,+,,+,+*+*++*+* )*)**)**)**))()()('('('('('('('('('(('('('('('(?@?@A@ABABABCBCBCBCDCDCDEDEFEFGFGFGFGHGHIHIHIJIJKJKLKLMLLMLMNMNONOPOPOPQPQPQRQRQRRQRSRSRSRSTSSTTSTUTUTUVUVUVWVVWVWXWXWXWXYXYXYXYYXXYXYXYXYXYXYXYXYXXYXYXYXYXWXXWXWWXWXWXWVWVWVWVWVUVVUVVUVUTUTUTUUTUTSTSTSTSRSRSRRQRQQRQPQQPQPOPONONOONNONMNMNMLMLMLKLKJIJIJHIIHIHGHGHGFGFGFEFEDDEDCBCBA@?@?@??@?>?>=>==>=<=<;<<;:;;:;:9:9::9898787876776565455445434323232121210110/0/././.-.-,-,-,+,+,+,+*+*)*))())(()()()('('('('('('('(?@A@ABAABABCBCBCDCCDCCDEDEFEFEEFFEFGFFGGFFGHGHIHIJIIJKJJKLKLKLKLMLLMNMMNMNMNOPOPOPOPQPQPPQRQRQRSRSRSRSTSSTSTTTUTUTUTUVUVUVUVWVWWVWVWVVWXWXWXXWXXWXYXYXYXYXYXYXYYXYXYZYZYZYXYYXYXYXYXYXYXYXWXXWXWXWXWXWXWVWVWVWVUVUVUTUTSTSRSRQRQRQRQPQPQPOPONOONONMNMNMLMMLMMLKLLKLKLKJKJKJKJIHIHIHHGGHGHGFGGFGGFEFEFFEDCBCBABABABA@AA@?@??@@?@?>=>=>>=<=<;<<;<;:;:9:9:989898767676565654543232112210100100110/0/././.-..--.--.-,-,-,+,+,+,+*+**+* )*)*))*)**)()()()('('('('('('('('('('('('(?@A@A@A@ABABCBCBCDCDEDDEFEFGFGHIHIHHIHIJIJKJKJKLKLMLMNMNMNMNONONOPOPQPQPQRQRRQRSRRSRRSTSTTSTUTUUTUUTUTUVUUVVUVUVW VWVVWVWWVWVWXWXWXXWXWXYXYXYXYXYXYYXYYYXYXYZYZYZYZZYZYZYYZYXYXYXY XYXYYXYXXYXYXYXYXYXXWXWXWXXWXWVWVWVWVUVUVUTUTSTSRSRSRQRRQRQPQPONONONMNMLMLMLMLKLKLKLLKJKKJJKJKJIJIHIIHGHHGGHGFGGFGFFGFEFEDEDEDCDDCB ABAABAA@@A@A@?>?>??>=>==>==>=<<;<;<<;:;:9:9:987676767665656545544554323212212121011010/0/.//./.-.-,-,+,+*+*+*)*)*)*)*)*)()(()()()('(('('('('('('('('('('(('('('?@?@A@ABABCBCDCDCDEDEFEFGFGFGHGGHHGHIHIJIJIJKJKJKLMNMNMNONNOPQPQPQRQRRQRSRSRRSTSTSTSTSTTSTUTTUTUVUVUVUVWVWVWXWWXWXWXWXWXWXYXYXYXYXYXYYXYXYXYYZYZYZYYZYYZYZYZYZYYZZYZYZYZYZYZYZYZYZYXYXYXYXYXYXYXXYYXWXWXXWXWXWXWXWVWWVVWVUVVUVUUVVUTUTUTUTSTSTSSTTSRSRRQRQPQPQPOPOPONONNONMNMLMLMLKLKLLKJKJKJIJIHIHIHHGHGFGFEFFEFEDEDCDDCBCBCCBABA@A@?@@?>?>=>=>=<<=<;:;:9:9:989878778767676765656545454344343344323211212101010/0/00/.//.././.-.--..-.-,-,-,+,+,,+*+**+*+*+*)*))*))*)())()(()('('('('('('('('(@?@A@A@A@AABBABBABCBCDCDEDDEFEEFGFGHGGHHGHIHHIHIJIIJJIJKJKKJKLKLKLKLKLMLLMLMNMNONNONOPOPOPQPQPQRSRSRRSRSTSTSTTUTUTUTUTUVUVUVUVWVWVWVWVWXWXWWXWXXWXWXYXXYXXYXYXYXYXYYYZYZYZYZYZYZYZZYZYZYZYZYZYZYZYZYXYXYXYXXYXXYXYXWXWXWXWVWVWVWVWVUVUVVUUVUTUUTTUTTUT STSSTTSTSTSTSRSRSRRQRQRQRQPQPQPOPOPOPPONONMNMMNMLKLLKLKJKJKJIJIHHGHGFGFEFFEDEDEDDEDCDCBABAABA@AA@A@?@?@?>=>==<;<;;<;:;:9:9:98998987878876767767667766565454343432332323211210101010/0/././.-.-,-,-,+,+,+*+*++*+*++*)*))())('(('('('('('('(@A@A@A@ABCBCDCDCDCDEDEDEFEFGFGHGGHHGGHGHIJIJKJKKLKLMLMLMNMNMNONONOPOPQPQRQRSTSTSSTTUTUTUTUVUUVVUVUVUVWVVWVWWVVWVWXWXWXXWXWXWXXWXYXYXYXYYXXYXYXYYZYZYZYZYYZYZYZYZYZYZZYYZYZYZYZYZYZYZYZZYYZYZYZYYZYYZYX YXXYXYXYXXYXXYXWXWXWXWVWVWVUVUUVUTUTUTS TSTTSSTSSTSRSRSSRRRQRRQRQPQPPQPPQPOPOPONONOONONMNMLMLKLKKLKJKJIJIHHGHGHGFGFEDEDCDCDCDCBCBABBA@A@A@A@?@?>?>=>>=>=<=<;<;:9:9:98987876776676545545434323212122101010/0/0/./././.-.-.--.--.-,-,+,+*+*++*+*)*)*)*) ()(()(()()('('('('(?@A@A@@ABABCDEDEFEFGFGFGHGHHGHIHHIHIJIJJIJKJKJKKKLKLKKLKLMNMNNMNNMNOPOPOPPOPQPQQPPQRQRQRSRSTSTTUTUTUTUVWVWVVWXWWXWXWXWXXWWXYXYXYXXYXYZYZZYZYZYZYZYZYZYZYZYZYZZYYZYYZYZYZYZZYZYZYXYXYYXXYXXYXWXWXWWXWXWV WVWVWWVWVVWVWVUVUVUUVVUVUTUTSTSTSSRSRRQRQRRQRPQPQPOPOOPPONOONMNMLMLKLKKLKJKJIJJIJJIHIIHIHHIHGHGFGFGFGFEFFEDCDCBCBABABA@?>?>=>==>=>=<=<=<;<;<<;:9899898787887676565454343232321121210110110/0/0/././.-.-.-,-,-,+,+,+*+*+*)*))()()('('(('(('('('('('('('('('('(?@A@A@A@ABABABCBCBCBCDEDEDEFEFEFGFGHGHHGHIHIHIHIIHIJIJIJKJKJJKJK KLLKKLKKLKLMLLMLMNMNMNONOPOOPOPOPPOOPQPQPQPQRQRSRRSRSTSTTUTUTUVUVUVWVWVWWVW XWXXWXWWXXWXWXYXYXYZYYZYZYZYZYZYYZYYZYZYYZYZZYZYZYZYZYZYZYZZYZYZYZYYZZYZYZYZZYYZYYZYZYZYZYXYXYXYXYXWXWXWXWVWVWWVWVWVUVUTUTUTUTTUTSTTSTSTSTSRSRSRRSRQRQRQPQPQPQPOPOPPONONONMNMNMLMLMLKJKJKJKKJIJIJIHIIIHGHGGHGHGFGFFGGFEFEDEDDEDCDCDCBCBABBABA@?@?>??>?>=>==<;<<;;<;:9:9898898767676565454343232332212121210110110/0/00/./.-.-.-,-,-,+,,++,+,+*+*+*++*+*)*))()(())()('('('('('('('(('(''('(@A@ABABCBBCCBCDCCDEDEEDEFEFEFGFGFGHIHHIHIHIJIJKKLMLMMLMNMNONOPOPQPQPQRQRSRSTSTSTTUTUVUVUVUV WVWWVWVWVVWXWXWXXWWXYXYXYYXXYYXYXYYXYXYZYZYYZZYZYZYZYYZYZYYZYZYZYZYZYZYZZYZZYZYZYZYZYZYZYZYZZYZYXYXYXYXYXYXXYXWXWXWXWWXWVWVWVWV UVUVUUVUUVU TUUTTUTUTUTSTSRSRSSSRQPQQPPQPOPONONONMNMLMMLKJIJJIHIHIHHGHGHGHGFGFGFEDEDEDCDCDCCDCBCBABBA@A@A@?>?>=>=>=<=<;<;<;:;:9:989898788767765656545545454343443343221210/0/0//0/././.-.-,-,,-,+,+,+,,+,+*+*+**+*+*)*))()()()('('('('('('('('(('(@A@A@AABABBABCBCCBCDCDDCDEDEDDEDEFEFGFGFGHIHIHIHIJIJIJIJJKJJKJKJKKLKLKLMLMNOPOPOPPOPQPQPQRQRRQQRSRSRSTSTUTTTUVUVUVWVWVWVWXWXWXWXYXXYYXXYXYXYZYZYZYZYZYYYZZYYZYZYZYZYZYZYZYZYZZYZYZYY XYXXYXYYXXYXYXWXWXWXWVWVWVUTUTUTSTSTSRSSRSRQRQPQPPQPOPONONONMNNMLMLLMLKLKJKJKJJIJIJIIJIHIIHIHGHHGFGFGFGFEFFEDEEDEDCDCBCBA@A@A@?@?>=>==<;<<;;<;:9:989878787656565454343232212121010110/0/.//../.-.-.--.-.-,--,-,+,,++,+,+*+*)*))*)*))*)()()('('('('('('('('(@A@ABCBCDCDEDEFEFGFGGFFGHGHIHIIHIJIIJJIJKJKJKKLKLMNMNMNNMNONNOONONONNOOPPOOPPOPOPOPQPQPQPQQRQRQRSRSRSRSRSTSTSTSTUTTUVUVUVWVVWVWVWVWXWXWXXWXWXYXYXYXYZYZYZYZZYZYZ[Z[Z[ZYZYZYZYZYZYZYZYZYYZZYYXYXYXYXYYXYXWXWXWXWXWVWVWVWVVWVUVVUVUVVUVUTUTTUTTUTSTTSSTTSRSRSRRSRQRQPQPQPOPOOPONONMNMNMNNMLMLLMLKLKLKJIHIHGFGFGGFEFEFEFEDEDCBCBABA@A@A@@?@?>??>=>>==<==<==<;<;:;;:9:9:98787876765656566543443434322121010/0//0/./.-.-,--,,-,,-,+,+,+*+*+*+*+*)*)*)('('('('('('('(@A@ABCBCDCDEFEFGFGHGGHHGHGHIHIJIJKJKKJKLKLLKLMLMMLLMNMMNONONNOPOPOPQPPQPPQQPQRQRQRSRSRRSRSTSSTSSTUTUUTUVUVUVWVWXWXWWXWXWXYXYXYXYXYXYYXYZYZYZYZYZZYZYZ [ZZ[ZZ[Z[ZZ[Z[Z[Z[Z[Z[ZYZYZYZYZYZYZYYXYX YXXYYXYXXYX WXWXXWWXWXWXWVWVWVUVUVU TUTUTTUTTSTTSTSTTSRSSRSRRSRQRQRQRQPQPQQPOPOPPO NOONNOONNMNMNNMLMLKLKLKJKJIJIHIHIHHGHGHGFGGFGGFEFFEFFEEFEDEDCDDCCDCBCBABA@A@?>?>??>=>==>==<=<==<=<;<;<;;:;:9:98989988987876566545434322121010010/00//0/././/.-.-,--,-,-,-,,+,+,+*+*++*)**)*)*)*)*)())()()('('('('('('('(@ABABCBCDCDEDE FEFEEFFEFFGGF GFGFGGHGGHGHIHHIIHIJKJKKJKLKLKKLMLMLMMNMNMMNOPOPQPQRQRQRQRSRSRSRSTUTTUTUUVUVUUVUVWVWVWXWWXWXYXXYXYXYZYZYZYZZYZYZYZ[Z[Z[Z[Z[Z[Z[Z[Z[ZYZYZYZYZYZYZYZYZYYXYXYXYXYXWXWXWXWVWWVVWVWVUVUVVUVUTUTUTTUTSTSTSSRSRQRQRQPQPOPOPONMNMNMLMLKLKLKJKJIJJIHIHHIHIHGHGHGFEFEDEDEDCDDCBCBCBABA@?@?@??@?>?>>?>=>=>=<=<<=<;<;<;:;:9:9:9898787676765654543432322121121010/0/./././.-.-.-,-,+,+,+,+*+*+*)*)*)*)()()()('('('('('('('('('('(@A@A@ABAABABCBCDCCDDCDEFEFGFGGFGHGHIHIHIJIJKJKJKKLKLLKLML MLMLMLMNMMNMMNOPOPOPOPQPQPQPQPPQRSRSTSTSTSTUUVUVWVWVWVWXWXWXWWX YXYXYXYYXYYXYXYZYZYZZ[Z[Z[Z[Z[Z[ZZ[Z[Z[ZZ[[ZZ[Z[Z[ZZ[Z[Z[Z[Z[ZZ[Z[Z[Z[Z[Z[ZYZYZZYZYYZYXYXYXYXWXWXWXWVWVUVUVUVVUTUTUUTUUTSTSTSSTSSRSRSRSRQRRQRQQRQPQPQQPOPPOPONONONMNMNNMLMLKLKLKJKJKJIJJIJIIHIHGHHGHGFGFFGFEFEDEDEDDEDCDCDCBCBABABA@AA@A@?>?>=>==>===<=<;<;<;:;:;:;::9:9::9898987878767765654543432323222121211210/0/00/./.././.-.-,-,-,,-,+,+,,++,+,+*+*+*)**))*)) ()()()()()('('('('('('('('('(('(''(@A@ABABCBCDCDEDEDDEFEFEFGFGHIHIHIJIJKLKLKLMLMLMNMMNMNONNONOPOPOPQPQQPQRQRQRQQRSRSTSTSSTSTTUTUUTTUTUUVUUVUVUVWVWVWVWX WXWWXWXXWXWXYXYXYXYZYZYZYZYZYZZ[Z[Z[Z[Z[Z[Z[Z[[Z[Z[Z[ Z[Z[Z[[Z[ZZ[Z[Z[Z[Z[Z[Z[Z[Z[ZYZYZYZZYZYZYZYZYZYXYXYXYXWXXWXWXWXWWVWWVVWVUVUVUTUUTTUTSTSSRSRSRRSRQRQRRQPQPOPOPONONONMNMNMNMLMLKLKLKJIJIHIHIHIHHIHGHGFGFGFEDEDCDCBCBABAABA@A@A@A@?@?>?>?>=>==<=<;<;:;:;:9:9:98987878878767676566565454343232212112101010110/0/././.-..-.-,-,,-,-,+,+,+*+*+*+*)*)*)()(())('(('('('('('(('('('('('('('(@A@ABABCDCCD CDCDEDDEDDEFGFGHIHIJIIJIJKJKLKLLKLMLMNMMNNMNONONOPOPOPQPQPQPQRQRSRSRSTSTUTUTTUTTUVUUVUVVUVUVVUVWVWVWVWXWXYXYXXYXYXYXYZYYZZYZYZYZYZYZ[ZZ[Z[Z[Z[ZZ[ZZ[Z[ZZ[ZZ[Z[Z[Z[Z[[Z[Z[[Z[Z[ZZ[Z[ZZ[ZZ[Z[ZZ[ZYZYZYYZYZYXYXYXYXYXXYXYXWXWXWXWVWVUVUVUVUTUTUTSTSTSTTSSSRSRSRSRQRQPQPOPONONONMNMNMMNMLMLMLKLKLKJKJIIHIIHIHGHGFEFEDEDEDCDCBCBCBABA@AA@@A@?@?>?>=>=>=<=<;<;<;:;:;:;:;:9:98987876765654544554343432210110110/0/./.-..-..-.-,--,-,+,+*+*+*)*))*)()()('('('('('('('('('('(@A@A@ABCDCDEDDEFEFEFGFGFGHGGHGHGHIHIIHHIJIJIJKLKKLLKLMLMNMNNMNMNONONONOOPOPQPQPQRQRQRQRSRSRSTSTSTUTUTUTUUVUVWVVWVWVWXWXXWXWXWX YXXYYXXYXXYXYZYYZYYZYZYZ[Z [Z[ZZ[[Z[Z[Z[Z[ZZ[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[ZYZZYZZYZYXYXYXYYXYXWVWVWVVWVVWVUTUTUTSTSRSRSRRQRRQPQPOPPONOONONMNMNMLMMLMLLMLLKLKKLKLKKLKJKJKJIJIIHGFGFGFEFEFEDEDEEDCDCCDDCDCBCBABBABAA@A@A@?@?@?>?>??>=>>==>=<==<=<=<;<<;<;;:;:;:9:98987877887767766767676565654543434323232121010/.-,-,+,+,+,+*+*++*+*)*))*)*)**)*)())('('('('('('('('('('('(@A@A@ABABCBCDCDCDDEDEFGHGHHGGHIHIHIJIJIJIIJIJKJKJKLKLLKLKLMLMLMLMNMNOPOPQPQPPQRQRQRSRSRSRSTSTSTSTUTTUTUVUUVUUVUUVWVWVW XWWXXWWXXWWXWXYXYXYXYXYZYZYZYZYZZYZ[Z[Z[Z[Z[Z[Z[Z [ZZ[[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[ZZ[Z[Z[[Z[Z[Z[ZYZYYZZYZYZYZYXY XYYXYXXYXXYXWXWXWXWVWWVVWVWVUVUVUTUTSTSSRSRQRQPQQPQPOPOPOPOONNOONONMNMLMMLKLKJKJIJIIHIHIIHGHGHHGFGGFGFEFEEFEDEDEEDCDCCBBCBABABABA@AA@@A@?@?@?>?>?>=>==>=<=<;:;;:;:9::9898898767765654343434323232212121010/0//0/./././.-.--.-,--,,-,+,+,+*+*+**+*)*)*)())())()('((''('(('('('('('('(@ABABCBCDCDEDEFEFGFGHIHIHIJIJIJKJKJKLKLKLMLMMLMMLMNMNOPOPQPPQPQRQR SRRSRRSRSRSTSTSTUTU TUUTUUVUVUUVUVUVWVWVWXWXWWXWXYXXYXYXYXYZ YZYZZYYZZYZ[Z[[Z[Z[Z[ZZ[Z[[Z[Z[Z[Z[Z[Z[[Z[ Z[[ZZ[[ZZ[[Z[Z[Z[ZYZYZYZYZYZZYZYXYXYXWXWXWVWWVUVUVU VUTUTUTUTUTSTTSTSTTSRSRSRQRQPQPQPQPOPONONOONMNMMNM LMMLMLLMLMLKLKKLK JKJJKJKJJKJIJJIIHIHHIHIHGHGHGFGFGFEFFEDEDCDC BCCBBCBBAABABA@?@??@?>??>?>=>=>==>=<;:;:9:9898787676765654545434343443432322322212121011010/0/0/./.-..-.-,+,+,+*+*+*)**)*)*) ())())()()()('('('('(('(('('(('(('('('('A@ABCBCCBCDEDEEDEFGFGGFGHGHIHIJIJIJKJKJKJKLKLLKLMLLMNMMNOPOOPOOPQPQRQRQQRQRSRSTSTSTUTUTUTUVUUVVUVUVWVWVWVWXWXWXWXWX YXYYXYXXYYXYXYZYZYYZYZ[Z[ZZ[Z[[Z[Z[Z[Z[ZZ[Z[\[\[\[Z[Z[Z[Z[Z[[ZZ[Z[Z[ZZ[ZZ[[Z[ZZYZYZYYZYZYZYXYXYXYYXXYXWXWWXWWXW VWVWVVWWVVWWVUVVUUVUUVUTUTSTTSSTSTSRSSRSRQRQRQPQQPOPOPONMNMNMLMLMLMLKLLKKLKKLKJKKJIIHIIHHIIHGHGFGFEFEDEDEDCDCBABABBABBA@A@?>?>??>=>=>=<==<;<;<;:;:9:987676765656545434344323221212101010/00//0/./../.-.-.-,-,-,,-,+,+*++*++*+*)*)**)()(()('('('('('('('('(@ABAABABCBBCCBCDCDDCDEDDEEDEFEEFEFGHGGHHGHIHHIHIJIJJIIJKJJKJKJJKLKLKLMLMLMNMNMMNONOPOPQPPQQPQRQQRQRSRSSRSRSTSTSSTSTUTUTUVUUVUVUVUUVWVWWVVWVWVWXWXWXWWXWXYXYXYYXXYZYYZYZYZYZYZ[Z[Z[Z[Z[Z[[Z[\[\[\[\[\[\[\[\[\[Z[Z[Z[Z[Z[Z[Z[Z[ZZYZYZ YZZYYZYYZYZYZYXYXYYXXYYXYXYXWXWXWVWVWWVWVVUUVVUUVVUVVUVUUTTUUTUTUUTUTSTTSTTTSSTS RSSRSRRSRRSRQRQRQRQPQPOPOPONONMNMLMLMLKLKLKLKJKJIIHIIHIHGHGFGFEFEDEDDEDCDCDCBCBCBABA@A@AA@?@?>=>=>=>=<==<==<;<;:9::987887677676565654545544554343221221010/0/0/.//./.-..-.-,--,-,-,+*+*+**+**+*)*)*))*)*)()()()('('('('('(('('('('(('('('('(@ABABBABCBCDCCDCDEDEDEFEFEFGFGHGHIHIJIJKJJKKJKJKLKKLKLLMNMNMNMNONNONOPOPOPQPQPQPQRQRSRRSRSRRSSRSTSSTSTSTUTUTUVUVUVVWVWVWXWXWXXWXYXYXYXYZYZYYZZYYZYZ[ZZ[Z[Z[Z[Z[Z[[\[\[\[[\[\[\[\[\[\[\[\[Z[Z[Z[Z[ZZ[[Z[ZYZYZZYZZYZYZYXYXYXYXWXWXWXWWXWVWVWVUVUVUVUTUTTUUTSTSTSRQRRQRRQRQPQPOPPOPONONMNMLMLKLKLKLKJKJKKJIJJIHGHGFGFEFEDEDCDCDDCCBBCBABABA@A@?@?>??>>?>=>=>=<;<;;<;:;:9898898787676565455434322122121010/0/00/.-.-,--,-,--,+,+ *+**+*++*+*+*)*)*))*)*)*)*)()())()('('('('('('('('('('('('(@ABCBCBCDEFEFGFGFGHGGHGGHIHIHIJIJIJKJKLKLKLKLKLMLLMLLMNMNONOPQPQRQQRRQRQRSRSTSSTUTUUTUTUVUVVVWVWXWXWWXWXYXYYXYXYYXYZYZYZYYZYZ[Z[ZZ[[Z[Z[Z[Z[[[\[\[[\[\[\[[\\[\[\[\[\[\[\[\[\\[[\\[\[\[\[\\[\[[\[\[Z[Z[Z[[Z[ZYZYZZYYZYYZYXYXYXWXWXWXWXWVWWVWVUVUVUTUTUTTUTTUTTSTSRSSRSRQRQPQPOPOPONONOONONMNMLKJKJIJIIJIHIHIHGFGFEDEDCBCBABA@A@?@?@?>??>>=>>=<=<=<;<;:9:9898987878778765654545432322332121212101010/0/00//0/./.-.-,-,--,-,+,,+,+,+,+*+*+*+*+*)**)*)())()()()('('('('('('('('(('('(ABAABCBBCCBCDCDCDEDEDEFEFGFFGGFGHGHIHHIIHIJIJIIJKJJKJKLKKLMLMMLMNMNONONOPOPQRQRQRSRSTSTSSTUTUTUTUVUVUVUVVVWVWXWXWXYXXYXYXYZYYZYZYZYZYZZYZ[Z[Z[Z[Z[\[\[\[\[[\[\[[\[\[\[\[[\[\[\[[\[\[\[[\[\[\[\[\[\[Z[Z[Z[Z[Z[[Z[Z[Z[ZYZYZYZYZY XYXYXYYXYYXYXWVUVUVUVUTUTTSTSTSTSRSRSRQRQRRQPQPQPOPONONONMNMNMLKLKJKJJKJJIJIJIHIHGHGFGGFEFEDEDCDCDCDCBCBCBABA@A@AA@@AA@?@?>?>?>?>>=<;<;:;:9:9898987877876565565454543233233322321221221010110010/0/./.-.-.-,-,--,--,+,,+,,+*+*++*+*)*)**)**)*)()()('('('('('('('('(ABCDCDEFEFGFGFGFGHGGHGHIHIHIHIJIJIJKLKLMMLMLMNMMNMNONOPQPQPQ RQQRQRRQRQRSRRSRSTSTSTTSTUTTUTUVUVUVUVUVVWVWVVWWVWXWXWXYXYXYZYYZYZYZ[Z[Z[ZZ[Z[[ZZ[\[\[[\[\[\[\[\\[\[\\[\\[[\[\[\[\[\\[\[\[\[\[\[\[\[\[Z[ZZ[ZZ[Z[ZYZZYZYZYZZYZZYXYXYXWXWXXWXWVWVUVUVUVVUTUUTUUTTSTSRSRQRQRQPQQPOPOPONONONNONMLMLMLKLKJKJIJIJIIJIHIHHGHGFEFEDCDCBCBCBBCBA@A@@A@?@?>?>=>=>=<=<=<;<;:;:9:9:9898787656545434432322332121011010/0/./.-,-, -,-,,+,,++,+,,+,+*+*+**)*)*)()()('(('('('('('('('('(('((ABABCBCDEFEFGFGHGHGHIHIJIJIJKLMLLMLMLM NMMNMNNONNONOPQPQPQRQRSRSTSTUTUTTUTUTUVUVUVVWVWXWXXWXYXYXYXXY ZYZYZYZZYZZYZYZ[\[\[\[\[ [\\[[\[\[\[\[\[\[\[[\[\[\[\[\[\[\[[\[\[\[\[\[\[\[\[\[\[\[Z[Z[[Z[[Z[Z[ZYZYZYZYZYXYXYXWXWVWVUVVUVUTUTUTTTSTSRSSRSRQRQRQPQPQPOPPONONOONONMNMNMLMLLMLKLKLKJKJKJKJIJIJJIIJIIHIHIIHGFEFEDEDCDCBCBCBBCBA@A@AA@?@?>??>??>>=>=<=<;<;<;:;:;:9:9:98987887676565654543434323321212101101010/0/0/.//..//.-.--.-,-,-,+,,+,+,,+*+*+*+*) *))*))*)*)*)()('('('(('(('('('('('('('('('('((ABCBBCDEDDEDEFEFEFGFGFGHGHGHIJKJKJKJKLKLKLLMNMMNONONONOPOPOPOPQPQPQPQRQRSTSTSTUTUTUVUVWVVWVWVWWVWVWXWXWWXWXY XYXXYXYYXYXYYXYZYZYZ[Z[ZZ[[Z[Z[\[[\[\\[[\[\[\[\\[\[\[\[\[\[\[\[\[\ [\[\\[\[[\[\[\[\[\[[Z[Z[Z[ZYZYZYZYYZYXYXYXYXWXWXWVWVWVWVUVUVUVUVUTUTUTUTUTTSTSSTSTSRSRQRQRQRQPQQPQPOPONONOONMNMLMLKLLKKLKJKKJJIJIIJIHIHGHGHGFGGFEDEDCDCDCBABABA@A@@A@?@?>?>>?>=>=>>=>=<=<=<==<;<;<<;:;:;:;;:9:989898787876765654543432232122112101010/0/././/.-.-..--.-,--,-,-,+,+*+*+**)()()()('('('('('('('('(('(ABABCDCDCCDEDEFGHGHIHIJIJIJKJKLLKKLKLMMNMNONOPOOPQRQRQRQRQRSRRSRSRSTSTSTUTUTUVUVUVWVWWVWVWXWXWXXWXXWWXYXYZYYZYZYZYZ[ZZ[ZZ[Z[Z[Z[\[\[[\\[\[\\[\\[\[[\[\]\]\[\[\[\[\[\[\[\[\[Z[Z[Z[[Z[Z[Z[ZYZYZYXYXYXYXWXWWXWVUVUTUUTTUTUTSTSRQRQQRQPQPPQPOPONMNMNMLKLKJKJIJIHIIHIIHGHGFGGFEFEEFEDEDCDCBCCBA@A@A@?@@?>?>>>=>=<=<;<;<;:;:9:987876767656556654545434332333233212121221010/0/0/./.-.-,--,+,+*+*+*))*)**)())()('('(('('('('('('('('ABCDCDCDCDEDDEFEFGHGHGGHIJKJKLKLMLMLMNMMNMNONOPOOPQPQRQQRQRSRS TSTSTSSTSTSTUTUTUTUVUUVUVUVWVWVVWVWXWXYXYXYXYXYZYZYYZYZ[ZZ[ZZ[Z[\[\[\[[\[\[\]\]\]\]\[\[\[\[[\[\[\\[[\[[Z[Z[Z[ZYZYZYZYZYXYXYXYXXYXYXWXWXXWXWVWWVWWVUVVUUVVUVUTUTUTTSRSRSRSSRQRQQRRQPQPPQPOPONONOONNONNMNNMNMLMLMLKJKJKJJJIJIHIHHIHHGHGHGGHGGHGFGFEDEDCDCCDDCDCBCABA@A@?>?>?>>=>>=<;<;:;:9:98987878787677676565454543434343323332321221121221011010/0/././.-.-..-,-,+,+,+,+*+*+**++**)**)*)()()(()()()('('(('('('('((''('(ABABCBBCBCDCDCDDEDEFEFEFGFGHGHHGHIHIJIJIJIJKLKLKLMLMMNMNONONOPOPOPQPQRSRSTSTUTUTUVUUVVUVWVVWVVWXWXWXWXYXYXYXYXYZYZZYZYZYZ[Z[Z[ZZ[Z[Z[Z[\[\[\[\[\\[\[\]\]\]\]\]\]\]\]\]\]\[\[[\[\[\[[\[\[[\[\[\[[Z[Z[Z[Z[Z[ZYZYXYXWXWVWVVWWVUVUVVUVUTUUTTUTSTTSSTSRSRQRQQRRQPQPOPOPONOONOONMNMLMMLLMLLMLKLKKLKJKJJIJIHIHGHGFGFGFGFEFEDEEDCDCBCBABA@A@AA@?@?>?>>=>=<=<;<;<;:;:9:98987876767765454545434343233232322122121010/00//0/././.-..--.-.-,-,-,+,+,+,+,+,+*+*+*)**)*))**))*)()()('('('('('('('('('('('ABABBABCBCDEDEFEFGFGHGGHIHIJIIJKJKLMLMLMMMNMNONONNOPQPQPQRQRSTSTUTUTUTUVUVWVWVWXWXWXYXYXXYXXYZYZYZYZYZ[Z[Z[Z[Z[[Z[\[\[\[\[\\[\[\\]\]\]\]\]\]\]\ ]\]]\\]\\]\]\]\]\]\[\[\[\\[[\[\[[Z[Z[Z[ZZ[ZYZYZYYZYXYYXYXWXWXWVWVUVUVVUTUTUTSTTSSTSRSRSRRSRQRQRQPQPQPOPONONMNMNMLMMLKLKLKLKJKJJIJIJIHIIHGFGFEFEDEDCBCCBABA@AA@A@?@?>?>>=>=<=<<=<;<;;<<;:;;:;:9:9:987876767656545455454343434323232121010/0/0/././.-,-,-,+,+,,+,+*+*+*)*)*))*)()())())()('('(''('('('('('('('((ABCBBCBCDCCDDEDEFEFGFGHGHIHIIJJIJJIJKJKLKKLKLMMNMNONONONOPOPQPPQPQRQRQRQRSRSTSTUTUTTUVUVUUVUVWVWVWXWXWXYXYZYZYYZZYZYZ[Z[ZZ[Z[\[\[[\[\\[\[\[\[\\ ]\]\\]\\]\\]\]\]\\]\]]\]\]\]\]\]\]\]\]\]\]\\]\]\]]\]\]\[\[\[\[\[[Z[Z[Z[ZYZYZYZYXYXYXWXWWXXWWXWVWVWVWVWV UVUUVUVVUUVUTUTSTSTTSTSRQPQPPQPQPOPOPONMNMNNMMNNMLMLKJKJKKJIJIIJJIHIHGHGGHGFGFGFEFEDEEDEDCBCBABA@A@?@?>>=>>=>=>=<=<;<;<;:9:99:9:9898787676565455434334323212101010/0/./.-.- ,-,--,,-,,+,+,+*+*++*+**) ())()())(()()('('('('('(BABCBBCDCDCDDEFGFFGHGHGHIJIJIJJIJKJKLMMNMNONOPOPQPQRQRSRSRRSRSTSTUTTUTUVUVVUVWVVWWXWXWXWXWXYXYXYXYZYZYZZYYZ[ZZ[ZZ[Z[Z[Z[Z[\[\[\[\\[\[\[\]\]\]\]\\]\]\]\]\]]\]\]\]\]]\]]\]\\]\]\]\]\]\]\]\]]\[\[\[\\[[\[[\[\[[\[[\[Z[Z[ZZ[[Z[ZYZYZYZYZZYXY XYYXXYYXYYXWXWXWWXXWWXWVWVVWVUVUUVUVUUTS TSSTSSRSRSRRSRSRQRQRQPQPOPPONONMNNMLMMLMLKJKJKJJIJIJIJIHIHGHGHGFGFGFFGFEFEDEEDCBABABAA@AA@@AA@A@??@?@?>??>>>?>=>=<=<=<<;<;:;:;:9:98987878876767765654543233212122101010/0/././../.-.-,--,-,+,+,+*+*+*+*)*)*)*)()(()())()('('('('('('('('('('('('((ABABBABCBCDCDEDDEDEFEFEFGFFGGFFGHGHIHIJIJIJKJKLMLMLMLMMNMNONONOPQPQRQRQRSRSTSTST UTUTTUUTTUUTTUVUVWVWVWVWXWXWXWXYXYXYXXYZYZZYZYYZYZ[Z[ZZ[[ZZ[\[[\[\[\[\\]\]\]\]\]\]\]\]\]\]\]\]\]\]\]\]\]\]\]]\]\[\[\\[\[\[\[\[\[[\\[Z[Z[Z[[ZYZYZYZYXYXWXXWWXXWVWVWWVUVUUTTUUTUTSTSTSRQRQRQPQPPOOPOPONONMNMNMLMLLMLMLKLLKLKLKJKKJJIJIJIJIHIHGHGFGFEFEDCDCDCBCCBBCBBABA@A@?@@?@?>>=<==<=<;<<;:;:;:9:9::98987876765665454343232321221210110100110/0/././.-.--.-,-,-,+*+*+**)*)*)*)()(())('('('('(''('('('(BCBCCBBCDCDEFEFEFGFGFGHGHHGHIHIJIJKJKJKLKLMLMMNONOONNONNOPOPOPOOPPQQPPQQPQPQPQRQRSRSTSTSTUTTUVUVUVWVWVVWWVWXWXWXYXXYXXYZYZYZZYZ[Z[Z[ZZ[Z[\[\[\[[\\[[\\[[\\[[\]\]\]]\]\]\]\]\\]\]\]\]\]\]\]\]\]\]\]\]\]\]]\]\]\]\\]]\[\[\[\\[\[\[Z[Z[ZYZYZYZZYYZYXYXYXWXWXWVWVWVUVUVUUTTUTUTTUUTSTSTSSTSRSSRSRSRQRQPQPQPOPOPPONONMNNMLMLKLKKLKKJKJIJJIHIHIHGFEFEDED CDDCDCDCCBCCBABABA@A@A@?@?@@?>?>>=>=<;<;:9:9:98998987676676565454343343433232332121122101010/0/./.-.-..-.-,-,,-,+,,++,+*+**+**+**)*)*))**)()('('('('('(('('('(BCBBCCBCDCDEDDEDEDDEFEFGFGFGHGGHIHIJKJKJKLKLKLLMLLMLMMNMMNONNOPOPOOPQPQPQRQQRQQRRQRSRSTSTUTTUTTUTTUVUVUVWVWVWVWXWXWXXWXYXYXYZYYZYZ[Z[Z[Z[Z[[Z[\[\[\\[\[\]\]\]\]]\]\]\]\]\]\]\]\]\]\]\]\]\]\\]\[\\[ \[[\\[\[[\\[Z[Z[Z[Z[ZYZYZYZYZYXYXXYXWXWVWVVWVUVUUTUTUUTSTSTSRSSRRSRQRQPQPOPONONMNNMLMLMMLMLKLLKJJKKJIJJIJIHIIHIIHHIHGHGFGGFFGFEFEFEDEDCDCDCBABA@A@AA@@A@?@?@@?@?>?>=>=<=<;<;:;:9:9:9898898787676676565655654332332232101010/./../.-.-,-,+,+,+ *++*+*++*++*)*)**)*)*)()()()('('('('('('(ABCBBCDCDEDDEDDEFGFGHGHGHGHIH IHIHIHIIJIJIJKJKLMLMMNNMMNMNMNONNOPOPOPQPQRQRSRRSTSSTSTTSTUTUTUTUVUVUVUVWVWVWWXWXWXYXYXYYXYZYZYZ[ZZ[Z[Z[\[\[\\[\[\]\]]\]]\]\]\]\]^]\]\]]\]\]\]\]\]\]\]\]\]\[\\[\[\[\[Z[Z[ZYZYZYXYYXXYXYXYX WXWWXWWXWXWVWVVWVUVVUVUTUTUTSTSTSRSRQPQPOPPONMNMNMLKLKKLKLKJJKKJKJIHIHGHGHGFGGFEFEFEDEDCDDCBCBCCBBCBA@A@A@?@@?>??>=>=>>=<;<;<;<;:;:9:989989876767656545545434343433232122121 01011010010/0/0/./.-..-,-,,-,+,+,+,+,+*+*+**)*)()()(()('('('('('('('('(BCBCBCDCDEDEFEFEFGHGHIHIJIJKJJKLKLKLMLMLMLMNMNMNONOPQPQ RQRQRQRQQRRSRSRSTSTSTSTTUTUTUTUVUVUUVWVWVWXWWXWXWXYXYZYZ [Z[Z[[Z[[Z[Z[\[\]\]\]\ ]\]\\]]\\]\]\]\]\]\]^]^]^]^]]^]^]^]\]\]]\]\]\\[\[\[Z[ZZ[ZYZYX YXYXYYXXYYXWXWVWVVWVWVUVUVVUUUTUTUTSTSRSRQRQPQPQQPONONMNMLKLKLKJKKJKJIJIIJIHIHHIHGHGHGGHGFGFGFEFEFEDEDEDDCDCDCBABABA@A@A@?@?@??@?>>?>=>==>=<=<=<<==<=<<;<;<;:;:;;::;;:9:9:989898787676765654545434323232321212101010/0/0/././.-.-.-,-,-,+,+,,+*+*+**+*+**)*)*)()()()('('('('('('(('('('((ABCBBCDEDDEDEFEFEFGFGHGHGGHIHHIJIIJIIJKJKLKLMLMLMLMNMNOPOOPOPOPOPPQPQPQRQRRQRSRSRSTSTTSTUTTUTTUVUVWVVWVWWVWXWXWXWXYXYXYYXYYXYZYZYYZYZZYZYZZYZ[Z[Z[\[\[[\\[\]\]\\]\]\]\]]\]\]\]\]\]^]^^]^]^]^]]^^]]^^]^]^]^]^]^]\]\]\]\] \]]\]\]\]\]\]]\]\\[\[\[\[Z[Z[ZYZYXYXYXWXWXWVWVWVUVUUTUUTSTSTSRSRSRRSRQRQRQQPQPQPQPOPONONMNMNMNMLMLKLKLKKLKJJKJIJIJIHGHGFGFEFEEFEDEDDEDCDC BCCBCCBBCBABABA@?@?@@?>?>=>=>=<=<;<;:; :;:;::99:9:9898898787676765654543433232233212121010/0/0/./.-.-,-,-,+,,+,+,+*++*+**+*))*)*)*) ()())(()())('('('('('('(ABABCDCDCCDEDEFEFGHGHGHIHIJIIJKJKJKLKLKLMLMNMNNNONOONONOOPOPOPQPQPQRQRRQRQRQRSRSTSTUTUTTUVUVUVWVWWVWXWXXWWXYXYYXXYXYXYZYZYZ[ZZ[Z[Z[Z[\[[\[[\[\[\]\]\]\]\]\]]\]]^]^]^]]^^]^]^]^]^]^]^]^]^]^]^]]^]]^^]]^]]^]\]\]\\]\]\[\[\[\[\[\[Z[Z[Z[Z[ZYZYZYYZYZYXYXYXWXWXWVWVUVVUVUTUTSTSTSSTSRSRQRQRQPQPQPQQPOPOOPONONMNMLMLKLLKLKKJKJIHIHGHGHGFGFEFEFEDEDEDCDDCCDCBCBABA@A@?>>?>=<;<<;<;;<;:;:;:9:9878878767765654543323223212101010/0/0/./.-.-.-,+,+* +*+*+*++*+**)()())()('('('('(('('(BCBCBCDCDCDCDEDEFEFGHGHIHHIHIJIJKJJKLKLLKLMLMLMLMNMNMNONNONONOPOOPOPQPQRQRQRQRSRRSRSTUTTUTUVUVUVUVUVWVWXWXXWXWXYXYXYZYZYZYZ[Z[ZZ[Z[\[[\[[\[\]\]\]\]\]\]]^]^]^^]^]^]^]^^]^]^]^]^]^]^]^]^]^]^]\]]\]\]\\]\[\[Z[ZZ[ZZ[ZYZYYZZYZYZYYZYXYXYXWXWXWXWVWVUVUUVVUT UTUTTUTUTUTSRSSRRSRRSRQRQPQPQPOPOOPOPOONOONOONONMNMNMLMLMLKLKKJIJIJIHIHGHGHHGFGFFGGFGFEFEDEDCDCDCCDCBCBCBABABBA@A@?@??@?>>?>=>=<=<;<;<;;<;:;:;:9:9:98987876766765656565 45545443443433212101010/0/./.-.-.-.-,-,--,+,+,+*+*+**+*)*)*)*)()()()('('('('('('('(('('(BCBBCDCCDCDEDEFEFEFEFGFGFGHGHGHIHHIHIHIJKJKLKLMLMNMNNMNNOONOPOPOPPOPQPQRQRQRQQRSRSTSSTUVUVVUVWVWVWXWXWXXYXYXYZYYZYZYZYZ[Z[[Z[Z[Z[\[\[\[\[\[\]\]\]\]\]]^]^] ^]^]^^]]^]^]^]^]^]^]^]^^]]^]^]^]^]]^]^]^]]^]^]^]^]\]\\]\]\]\]\[\[\[\\[\[Z[[Z[[Z[ZYZYZYYZYXYXYXYXYXWXWWXWVWWVUUVUUVUUVUTSTSTSRSSRQRQPQPOPONMLMMLKLKLKKJKJKKJIJJIJJIHIHHIHGHGHHGFEFEDEDEDEDCDCBCBABBABA@A@?@??>=>=<=<==<=<;<;:;:9:9:9:9898767676 5655655454543434332323212101010/0/./.-.-,-,+,+,,+*+**)*)())())()()('('('('('('(ABBCBCBCDEDEDEFEEFGHGHIHIJIIJIJKJKLKLKLMLMLLMLMNMMNNNONOONOPOPQPPQRQQRQRSRSTSSTSSTSTUTUVUVWXWXWXXYXYXYXYXYZYYZYYZYZYYZ[Z[Z[[ZZ[Z[\[\[\[\\[\]\]\]\]\]^]]^]^]^]^]^]^]^ ]^^]]^]]^]]^]^]^]^]^]^]^]^]^]^]^]^]^]\]\]\]\]\]]]\[\[\[Z[Z[Z[ZZ[[ZYXYXYXWXWVUVVUVUTUTTUUTSTTSRQRQPQPPQPQPOPOPPOPONOONNONNMNNMNMMNMLMMLKLLKKLLKKKJKJKJIJIJIHIIHGFEFFEDEDEDC BCBBCBBABBABA@A@A@?@?@@?>?>=>=<==<=<;<;<:;:;:9:9898987878767656545454343433232122121010/0/0/././.-.-..-.-,-,-,,-,+,+*+**)*)*)*)*)()())(()()()('('('('('('('(''('(BCBBCDCDEDEDDEFEFEFEFGFGHGHIHIIHIJIJJIJJIIJKJKLKLKKLKLLMMLLMLLMNNONNONOPQPPQRQRRSRRSRSTSTSTTSTUTUTUVUVWVWVWVWXWXWWXWXYXYXYZYZYZZ[ZZ[Z[Z[Z[\[\[[\[\]\]\\]\]^]^]^]]^]^^]^] ^]^]^]^]^^]^]^]^^]^]^]^]^]^]^]]^]^]^^]]^]^^] ^]^]]^]]^^]^]\]\]]\]]\\]\]\]\]\[\[\\[[\[Z[[Z[[ZYZZYYZZYXYXYXYXYXWXWXWVWVWVWVWVVUVVUVUTUTUTSRSRQRQPQPOPOPOPONONNONMNNMLMLKLLKKJKJIJIHIHGHGHGFEDEDEEDDEDCBCBABA@?@@??@?>?>=<=<;:;;:;:;::99:989878787676566545445434433433323223210100110/00/0/././.-.-.-..-,-,-,-,,-,+,+*++**+**+**)**)*)**)()()()('('('('('('(BCBCDCDEFEFGFGGFGHGHIJIJIJKJKLMNMNMNNONNONOPOPOPQPQRQQRRQRSRSTSTUTUVUVUVWVVWVVWXWXWXXXYXYXYXYZYZYZYZ[Z[[ZZ[Z[\[\[\\[\[\]\]\]\]]\]\]^]]^]^^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]\] ]\]]\\]\\]\]\]\[\[\[[\\[Z[[Z[ZYZZYZYXYXYXWXWXWVWVVUUVUUVUTUTSRSSRSRQRQRQPQPOPONONONMLMLKLLKKLKJIJIHIHGHGFGFEFEDCDCCDCBABA@?@?@???>?>=>>=>=<==<=<;<;;<;:;:;:9::98987876767656543434334323233212121210101010/0/.//../.-.-,--,-,+,,+*+** )*))*))*))**)()('('('(('('('('('('(('('BCBCDCDEDEFEFEFFGFFGFFGGFGGHGHGHIJIJIJIJKJKLKLKLMLMLMNNONOONOPOPQPQRQQRQRSRSRSTSSTSTSTUTUVUVWVVWVWXWXWXXYXYXYZYZYYZZYZ[Z[ZZ[Z[Z[[Z[Z[\[\[\]\]\\]\]\]^]^]^]^]^]^]^]^]^_^]^]^]^]^]^]^]\]\]]\]]\]\]\]\]\[\[\\[\[Z[Z[Z[[Z[[ZYZYZYZYXYXYYXYXWXWXWVWVVUVVUVUTUTUTSTSRSRSSRRSRQPQPPQQPOPPONONNOONMNNMMNMLKLKKKJKJIJIHIHGHGFGFGFEFEDEDEEDEDCBCBABA@?@@??>?>=>>=<=<;:;:9:9876776565454455433232321211210100110/0/0/././.-.-,--,+,+,+,+*++*+**++**)*)*))*)()()()()('('(''('('('('('('(BCBCCBBCDCCDCCDEDEFEFFEFGFGHGHIHIIHIJIJKJKJKLKLMNMNONNOONOPOPOPQRQRQRSRSRRSTSTUTUTUTTUVUVUVUVWVWXWWXWWXXWXXYXYXYXYZYYZ[ZZ[Z[[Z[Z[\[\[\[\]\]\]\\]]\]\]\]^]^]^]^^]^^]^^]^]^_^_^_^_^_^__^_^]^]^]^]^^]^]^]\]]\]]\\]\\]\[\[\[\[Z[Z[Z[Z[ZYZYYZYXYYXXYX WXXWXWWXWWXWVWVVUVUUVU TUTUTTUTTUTSRSRSRQRRQRRQRQPQQPQQPOPPOPONMNMMNMLMMLMLKLKJIJIHGHGFGFEFEDEDCDCBABBABA@AA@?@??>??>=>=>=<;<;:;:9::9:9:987887788767656654544545433432321221210/0/./.-.-..- ,--,,--,--, +,,+,,++,++,+*+*+*+***)*)**))**)*)()()('('('('('('(BCBCBCDCDCCDCD EDDEDEDEEFEFEFGFFGHGHIJKJKLKLMLMMLMNMNONNOPQPQRQRSRSRSTST UTTUTTUTUTUVUUVUUVWXWXWXXWXYYXYXXYXXYZYZYZ[Z[Z[[Z[\[\[\[\[\\[\]\]\]]\]\]^]^]^]^]^]]^_^_^_^_^_^_^_^]^]^]^]^]^]^^]^]^]^]]\]]\]\[\[\[Z[ZYZYZZYZYZYXYYXYXYXWXWVWVWVWVVVUVUVVUUVVUTUTUUTSTTSTSRSRSRSRQRQPQPOPONMNMMNMLMLMLKLLKLKJKJIJJIIJIHIHGHGFGFGFEFEEFEDEDEDCDCBCBABA@?@?@?>?>?>=>=<=<;<;;<;:989878767767656543432332122101010010/./.-.--..-.-,-,+,+,+,+*+*+*+*+***)*)*)()()()()('('('('('(('('('('('('(BCBBCDCDCDEDDEFEFGHGHGHGHIHIJIIJJIJKJKKLLKLLKLMLMLLMNMNOONOPQPQRQRQRSRSSRSRSTSTUTUTUTUUTUVWVVWVWXWXYXXXYXYZYZYYZYZ[Z[\[\[\]\]\]]\]^]^^]^]^]^_^_^_^_^_^_^^_^_^_^_^_^_^]^]^]]^]^]^]^]]\]\]]\]\[\[\[\[Z[[Z[Z[ZYZYZYYZYXYXWXWVWVWVVUVUTUTSTTSRSRRSRQRQRQPQPOPONONMNMLMLKKLKJIHIHGFGFGFEFEDCDDCDCCDCBCBABA@A@@A@?@?@???>=>=>=<=<=<;<<;:;:9:9:8989878876565565454543433232121010100110/0/././.-.--..-,-,-,+,+,+,+*+*+*+**)*)*)*)()()()()('('('('('('(BCBCBCDCDEDDEFEFEFGFFGHGGHIHIJIJJIJKJJKLKLLKLKLMLMNMNMNMNONNONNOPOOPQRQRQRSRSTUTUUTTUVUVUVWXWXWXYXYXYXYZYZ[Z[Z[ \[\[\\[\\[\[\]\]^]^]^]^]^^]^]^]^^_^_^_^_^^_^_^^_^_^_^_^_^^_^_^_^_^_^_^_^_^_^_^_^]^]^]^]^^]^]^]\]]\]\]\]\[\[\[Z[Z[ZYZZYYZYZY XYYXXYXXYXXYXWXWXWVWVWVUVVUVUTUUTSRSRQRRQRQPQPQPOPOOPPOONONONMNMNMNNMLMMLMMLLKLKLLKJIHIHGHGFGFEFEFEDCDCDCBCBABBA@A@?@?@?>?>?>=>=>=<;<;<;:;:98987878767656654543233232121121010/0//0/./.-.-.-,--,+,,+,+,+*+*+*+***)*)()()('('('('('('('('('('('('(BCBCDEDDEDEFEFEEFGFGHIJIJIIJIJKJKLMLMLMNMNMNONNONOPOPQRQRQQRSRSTUTTUTTUVUVUUVUVVWVWWVVWVWXWXXWXWXYYXY ZYZYYZZYZYZ [ZZ[Z[Z[[ZZ[\[\[\[\]\]\\]]\]^]^]]^]^]^]^^]^]^]^^_^_^^_^_^_^_^_ ^_^_^__^_^^_^_^_^_^_^ _^_^_^_^__^_^_^_^_^_^]^]^]^]^]\]\]\]\\]\[\\[\[Z[Z[ZYZYZYXYXYXYXWXWXWWXWVWWVWVVVWVUVUTUTUTUTSTSTSRSRSRSRRQRRQRRQPQPOPPONONMNNMNMLMLLMLKKLKLKJKJKJIJJIHIHGHGFGFGFEDEDEDCDCCDCBCBA@A@?@?>?>=<;<;<;:;:;:9:9878778767656565454343433232121011010/0/./.-.-.-,--,+,+,+*+*+**+***)**)()()()()()('('('('('('('('(('('('(('(BCDCDEFEFGFFGHGHGHGHIHHIIHIJKJKJKLKLMLMNMNONOPOPQRSRSRSRSTSTSTUTUVWVWVVWVWXWWXWXYYZYYZYZYZYZ[Z[Z[\[[\[\[\[\[\]\\]\]\]^]^]^^]^]^]^_^_^^^_^^_^_^_^_^_^_^_^_^_^_^_^_^_^^_^_^_^_^ ]^^]^]^^]^]^]^]^]\]\]\[\[\[Z[ZYZYZYZYXYYXYXXYXWXWXWXWVWWVWVUVUTUTUTSTSTSTSRSRQRQPQPONMNMNMLMLMLKLKLLKJKJIJJIHIHGHGFGGFFGFEFEDEDDEDCDCDDCBCCBABBABA@A@@A@?@?@?>?>?>?>?>=>=<=<<=<;<;<;<;:;:;::;:9898987877876767667656545433232101010/0/0/0/0/././.-.-,-,,-,+,+*+*+**+*)*)*)*)*)*)()()()('('('('('('('(BCBCBCDCDCDCDEDEDEFGFFGHIHHIIHIIHIJIIJIJKJKKJKLKLMLLMMLMNONNONONOOPOOPOPQPQRQRQRSRSRSTSTUTUTUUTUVUVWVWVWXWXWXWXYXYXYYXYZYYZ[ZZ[Z[[Z[\[\[[\[\\[\]\\]\\]\]^]^]^]]^]^]^_^_^^_^_^_^_^^_^_^_^_^_^_^_^_^_^_^_^_^^_^_^_^]^]]^]^]\]\]]\]]\]\[\\[\[\[[\[ZYZYXYXYXWXXWVVUVUTUTUUTSTTSTSRQRRQPQPOPONMNMLMLLKLKKLKKJKJKJJKJJKJIJIHGHGFGFGFEDEDCDCBABBAABA@A@?@@??>??>??>=>>=>=<=<;<;<<;<;:;:9:9878767656656543232121010/0/././.-,-,,-,+,+,+*+*+*+*+*)*)()()()('('('('(BCDCDCDEDEFEFEF GFFGGFGFFGGHHGHGHIHIHIJKJKLKLMLMMLMLMNMNMNMNOOPOPQPQRQQRSTSTUTUTTUUTUUVUVUVUVUVWVVWVWXWXWWXXWXYXXYXYZYZZYYZ[Z[Z[Z[ \[[\\[\[\\[\]\]\]\]^]^]^]^_^^_^_^ _^_^_^__^^_^_^_^_^_^_^_^_^_^_^_^_^_^^_^_^_^]^]^]]^^]^]^]\]\[\[\[\[Z[ZZ[[Z[ZYZZYZYXYXYXWXWVWWVVWVUVVUVUTUTUTSTSRSRSRQRQPQPQPOPOPONONONMNMLMLLKLKJKJIJIJIHIHIHGHHGFGFGFEFEDEEDCDCDCBCBCBABBAA@@A@??>??>?>=>=<=<;<<;:;:9:98989876765656545454343434323321010/0//0//0/././.-.-,+,+,+,+,+*+*+**+*)*))*)()()()('('('('('(('(CDCDEDEFEFGFFGHGHGHIHIJIIJIJKJJKLKLKLMLMLMNMNNMNNMNONNOOPOPOOPQRQRQRRQRSRSTUTUVUVWVW VWWVWWXWXWWXXWXYXYYZYZYZ[ZZ[\[\[\[\[\[\] \]\]]\\]]\]^]^]^]^_^_^_^__^_^_^_^_^__^^_^_^_^]^^]^]^^]^]\]\]\\]\]\[\[\[\[Z[Z[ZZ[ZYZYZYXYXYXYYXWXWXWWVWVUVVUVUTUTUTSTSRSRSRQRQQRQPQPQPOPPONONONONMNMLMLMLLKLLKJIJIHIHGHGFGFEFFEDEDDCDCDDCBCBABA@??>?>=>=<==<;:;:9:98989898788767676765654544343432323321212101010/0/0/././.-.-.-.-,--,-,+,+,++,+*+*+*+*+*)*)*)()(()()('('('('('('('('(CDCDEDEDDEFEFGFGHIHIIHIJIJIJJIJKJKLKLKLKLM LMMLLMMNMMNONNOOPOPQPQRQRRQQRSRSRSRSTUTTUUTUVUVUVWVWVWVWXWXWXWXYXYXYYYZYYZYZ[Z[\[\[\[\]\]\\]\]^]^]]^]^_^_^_^_^^_^_^_^_^_`_`_ `__`__`_`__`_`_^_^_^_^_^_^_^^]^]^]\]\]\]\[\[\[\[[\[\[Z[Z[ZZ[ZZ[ZYZYZYXYYXXYXWXWWXWXWVWVWVUVVUVVUTUTSTTSTSRSRSRQ PQQPPQQPPQPOPONMNNMLMLLMMLLLKLKLKJKJJKJIJIJIHIHGHHGHGFEDEDEDCDCBCABA@AA@?@?@?>?>=>==>=<;<;:;:9::9::99:9989989876767656545544544543443432321210110/0/0/./.-..--.-,-,--,+,+,+,+*+**)*)*)*)()())()(()('('('(('(''('('(BCDCDEFEEFGFFGFGGFGHGHIHIJIIJIJIKJKJKLKLMLMLMLMNMNONOOPOPQPQRSRSTSTSTUTUVUVUUVUVWVWXWXWXWXWXYXYXYXYYZYZZYZYZ[Z[ZZ[[Z[\[\\[[\[\]\ ]\]]\\]]\]\]^]^]^]^^]^_^^_^^_^_^__^_`_`_`_`_`_`_`_^_^_^_^ _^^_^_^^_^^_^^]^]^]]^^]^]\]\]\]]\[\\[[\[\[ Z[ZZ[[ZZ[ZZ[[ZYZYYZYZZYXYYXYXYXWXXWWVVWVWVUVUVUTUTTUUTSTSSRSRQRQRQRQRQPOPPOPOPONONMLMLMLMLLKLKJKJKJIJIJIIJIHIHGHGGHGFEDEDCDCDCCBCBCBABABBABA@AA@@?@?>=>=<==<;:;:9:987878767765454343432322332232122121010/0/./.-.-,--,+,+,+*+*+*+* )*)*))**)*)()()()('('('('('('('(('(CDCDEDEFEFGFFGFFGHGHIJIJIJIJKJKJK JKKLKLLKLKLMLLMLMNONONOOPOOPOPQPQRQRRQRSRSRSTSTUTUTUVUVVUVUVWXWXWXYXYZYZ[Z[\[\[\\[\[\]\]\]^]]^]^]^_^_^_^_^_^__`_`_`_`_`_`_`_`_`_`_`_^_^^_^_^_^_^_^_^^__^]^]^^]]^]\]\]\]\]\]\[\[\[Z[Z[ZYZYYZYXYXWXWXXWWVWWVVWVUVUUVUTUTUUTUTSTSRQRQPQPQPOPOOPOPONONONMNNMMNMLMLMMLLKJKJIJIHIHGFGFGFEFEFFEDEDEDCDCBCCBBCCBABABABA@?@?>=<=<=<;:;:;:9:98987876766765655665454343343432321010010/0/0//0/0/./.-..--.-,--, -,+,+,++,+,+,+*++*+*+*+*)*)*)**)()()())('('('('(BCDCDCCDEDEFEFEFGFGFGHGHIHIJIJIJKJKJJKKJKLKLKLMLMLMLMLMNMMNMMNONOOPQPQPQRQRQRSRSTSTSTUTUTUVUUVWVWWVWVVWXWXYXYXYYZYZYZ[ZZ[Z[Z[\[[\[\\[\[\[\[[\]\]\\]^]^]]^^]^]^]^_^_^_^__`_`_`_`_`_`_``__``_`_`_`_``_`__`_`_``_`_`_^_^_^__^_^_^^^]^]^^]\]\]]\\]\]\[\[\[\[Z[Z[Z[Z[[ZYZYZYXWXWXXWWWVWVUVUTUTSTSTSRSSRQPQPQPOPONONOONONMNMLMMLLKLKLKJIHGHGFGFEFFEDEDEDCDCDCBCCBCBCBABA@A@?@?>?>??>=>=<=<=<;<<;:;:;:9:98787677656565654544343432323212121010/0/.//././.-.-,-,+,+,+*+**+*) *)*))*)*)**)()()('('('('('((CDCDCCDCDEDDEFEFEFGFGHGHHGHIHIHIJIJKLKLMLMNMNONOPOPOPQPPQRQRQRSRRSSRSTSTUVUUVUUVUVWVWWVVWVWXWXWXWXYXYXYZYYZYZ[Z[ZZ[\[\[\]\]\]\]\]^]^]^^]^]^_^_^_^_^^_^_^_`_`_`__`_`_`_`_`_`_`__`_` _`__`__`__`_`_`_`_`_`_`_^_^ _^^__^_^^__^_^^]^ ]^^]]^]^]^]\]\[\[\[Z[Z[Z[ZYZZYXWXWXWWVWVWWVUTUTSTSTSRSRQPOPOPONOONMNMLMLKLLKLLKKLKJKJIJJIIJIHIHIHHGHHGGHGFGFGFEDEEDCDCBCBCBCBA@@?>?>=>=>>==>=<=<;:;:9:9:989889878878767654434323232121010/0/.//././.-.-.--.-,-,+,+*+*+*)*)*))*)()()(()('('('('CDCDCDEDEDDEFEFGHGHGHIHIIHIJIIJJIJKLMLMLMNMMNMNONNONOOPOPQPQRQRSRRSRSTSSTUTTUTUUTUVUVVUVUVWVWWVWVWXWXWXWXWXYXYXYZYZYZ[Z[Z[\[\]\]^]^]^_^_`_`_`_`_`_`_``_`_``_`__`_`_`_``_`_`__`_`__`_`_`_`_^_^_^_^^^__^_^]^]^]^]\]\]\]]\]\[\[\[\[Z[Z[ZYZZYZYXYXWXWVWWVVWWVUVUTUTUTSTSRSSRQRQPQPQPOPONONNONONMNMLLKLKJKJKJIJJIHIHGFGGF EFEFFEEFEDEDDEDCBCCBABABA@AA@A@@??@?>?>=>=<=<;<;<;;:;;::;:9:9:989878767667656565454544343432321210101010/0/0/.//..//.-.-.-,-,,-,-,+,+,+,+*++*+*+*)*)*)**)*)*)())(())('('('('('('('('('('(BCDCDEDEFEFEFGFFGHGGHHGGHIHIJIJJIJJIKJKLKLMNMNMNONNONOOPOPOPOPQRQRSRSRSRRSTSTUTUTUVUVWVWVWXWXYXYZYZYZ[ZZ[Z[Z[\[\[\]\]\\]\]]\]^_^_^_^_^__^_`_`__`_`_`__`_`_`_`_`_`_`_`__`_``_`_`_`_`_`_`_`_`_`_`_`_^_^_^_^]^^]^]^]\]\[\[Z[ZYZYZZYXYXWXWXWVWWVWVUVUVUTUUTUUTSTTSTSTSRSRSRQRQPONONONMNMLMLLMLKLKKLKJKJKJJKJIJIJIHIHG HGHGGFFGGFGFEFEDEDEEDCDCBCCBCCBABA@A@@?@?>?>?>=>=>=<=<;<;:;:9:99::98989876776565434343232332121011010/0/ ././../..-.-.-..-,-,--,+,+*+**+*)*)*)*)*)()()())(()('('('('('('(('(''('(CDEDDEFEFEFGFGHGHIHIJIJIJIJKJKLMLLMNMNONNOPOPOPOPQPQPQPQQRQRSRSTSTSTSTUTUUTUVUUVVUVWVVWXWXYXXYXYZYZYZ[Z[\[\\[[\]\]]\]^]^]]^^]^]^_^_^^_^_^_^__^_^_`__``__`_`_`_``_`_`_`_`_`_`_`_`_`_`_`_``_``_`_`_`_`_`__`_`_``__`_`_^_^_^_^]^]^]\]\[\[Z[Z[Z YZYZYZYZYZYXYYXYXWWXWVWVWVUVUTUTSTSTSTTSRSSRRSRQRQRQPQPQPQPOPONONONNONMNMLMLKJKJIJIHIHHIHGHGFEFEFFEFEEDEDDEDDEDCBCBBCBABBABA@A@A@AA@@?@?@@?>?>?>=<=<==<=<;<;:;;::;;:9:9898898787676565454545444343343232 1212211212101010/00/0/.//./../.-.-,-,+,+,+*+*+*)*)*)()()('('('(('('('('('('('(CDCDEFEFGFGHGHGHIHHIJKJJKJKLKLMLMNMMNONOOPQPPQ RQRQRRQQRRSRRSRSRSTSTUTUVUVUVVUVWVWVVWXWXYXYYXYXYZYZYZZ[Z[\[\[\[\]\\]\]\]\]^]]^^]^]^_^_^__^_^_^_`_`_`__`__```_`_`_`_``_`_``_`_`_`_`_^__^^_^_^_^_^]^]^]\]\]\]\[\[\[Z[Z[ZYZYXYXXWXWVWVVWVUVUUVUTUTUTSTSTTSRSRQPQPQPOPONOONONMNMMLKLKJKJKJIJIHIHIHHGHHGHGFGFEFEDEDCDCBABA@A@@?@?@?>?>=>=<=<;<;<;:;:;:9:9:989889878767656544343432321221010010/00/00/0/.//.-.-,-,-,+,+,+,+*+**+*)*)*)*) ())(()()(()()('('('('('('('('('( DCCDCDCDCDEDEDEEFEFGFFGHIHHIIHIJIIJKJKKJKLMLLMLMNONNONNOPOPQPPQRQRQRSRSTSTSTSTUVUUV UVVWVWVWWVWVWXWXWXYXYXXYXYZYYZYZZ[Z[Z[\[[\[\[\]\]]\]\]^]]^]]^]^_^_^_^^_^_^_`_`_`_``_`_`_`a`a`_`_``_``_`_`__^_^^_^]^]]^]]^]\]]\\]\\]\ [\[[\\[\[\[\[Z[Z[Z[ZYZYZYXYXYXWXWXWXXWVWVWVUVUUVUTSTTSTSRSRSRQRRQRQPOPOOPONONONMNMMLMLKLKJKJKKJIJIHIHGHGFGFGFFGFEFEDCBCBCBCBABBA@@?@?>=>=>= <=<<==<<;<;<;:;:9:989878767767656545544343432321210/./.-.--.-.-,+,+,+*++*+*)**)()())()('('('('('('('('('(DCCDCDEDEFEFGFFGGFGHGHIHHIJIJKJJKJJKLKLMLMNMNMNMNONOPOPOPQPQQPPQRQRQRSRSTSTSTUTUUTUVWXWWXXWXYXXYXXYZYZYZZ[Z[Z[\[\[[\[[\]\]\]]\\]^]^]^_^_^_^_`_ `__`_`_`_`_```_`a`a`a``a`a`a`_``_`__`_`_`_`_^_^_^_^]^]^]\]\]\ [\\[\\[[\[[\[Z[Z[[ZYZYXYYXXYXXWXWXWVWWVWVUVUTUTSTSRSRQRQPQPONONMNMMLMMLMMLKLKKLKJKJKKJIHGHGHGHGFEFEDEEDEDCDCBCBABA@A@@?@?@?@?>=>>=>=<;:;;:9:9:9:9:989898788767676565 45455455444343343432323232122101010/0//0/./.-.-,-,-,+,++*++*+**+*+*+*)*)()(()('(('('('('('('('(('(CDEDEFEFGHGHGHIHIIHIJIJIIJIJKJKLKLMLMNMNONONNOPOOPOPQRQRSRSTSTUTTUTTUTUVUVWVWXWXYXYXYZYZYZZ[Z[Z[ZZ[\[[\\[\]\]\]^]^]^]^_^_^_^_`_`_`_``_`a`a`a`a`a`a`a`a`a`a`a`_`_`_``__``_`_``_`__^_^_^]^]^]]^^]^]\]\[\[\[ZYZZYZYZYXYXWXWWXXWXWVWWVVWVUVUTUTSTSSTSRSRSRQRRQQRQPQPPQPONOONNOONMNMNNMMLMLMLKJIHIHGHGFEFFEDEDDEDCDCBCBABA@A@@A@?@??@?>?>=>=<=<;<;:;:9:9:98987876765656544343232121010/00/0/.-.-.-,-,-,+,+,+,,+*+*+*+*)*))**)()()()('('('('(('(('('(('(('('('('(('(CDCDEDEDDEFEFGFGHIHIIHIJIJIJKJKLKLMLMNMNONOPOPOPOPQPQRQQRQRQRSRSSRSTSSTSSTSTUTUVUVUVWVWXWWXWXWXYXYXYZYZYZ[Z[\[\[\]\]]\]\]^]^_^_^^_^_`__`__`_`__`_``_``a`a`a`a`a`a`a`a``a`a`a`a`a`a`a``a`_``__`__`_`_`_`_`__^_^__^^_^]^]\]\]\]\\]\[\[\[\[Z[Z[Z[ZYZYXYXYXXWXWVWVUVUVUTUTUTSTTSRSRSRRSRQRRQQRQPOPONMNMMLMLKJKJIHIIHGHGFGFEFFEDCBCBABBABABA@A@@?@?>=<==<;<;:;:9878787676776565665454455455434344323232101010/0/0/././.- .--,-,--,-,+,+,+**+*)*)*)()())(()('('('('('('(CDEFEEFGFFGFGHGHGHIJIIJIJJKJKLKLKKLMLMNONNOPOPPPQPQRQRSRSRSRSTSTUTUUTUTUVUVWVWWVVWXWXXWWXYZYZZYYZYZYZ[Z[Z[ZZ[\[\\[\[\\[\]\]\] ^]^^]]^^]^]^_^_^_^__^_`_`__`_`_``a`a`a`a`a`aa`a`a`a`a`a`a`a`a`a``a`a`a`a`_``__`_` _``__`__`_`_`_^_^_^^__^_^]^]^] \]]\\]\]\]\[\[Z[Z[Z[ZYXYXYXYXXXWXWVWVUVUVUTUUTSRQRQPQPQPOPPOPONONONMMLMLKLKJKJIJIHGHGHGFGFEDEDEDDCDCDCBCBABA@A@@?@?>?>=<==<;<;<;:;:9:98989987887787676565455454454343232321210101010/00/0/ .//./..//..-.-..-,-,-,-,+,+,+*+*)*)*)*)()()()('('(('('('('(('('('('('(DCDEDEFEFEFGFFGFFGHGHIJIJIJKJKJKLKLKLMLLMLMNONOPOPOPQRQRSRSRSTSTUTUTTUVUVUVWVWXWXWWXYXYXYZYZYZ[Z[Z[\[\]\]]\]\]^]^]^]]^]^_^^_^_^_`_`_`_`a``a`a`a`a`a`a`a`a`a`a`aa`a`a`a`a`_`_``_``_`_`_`__`_^_^__^_^]^]\]\]\[\[\[Z[ZYZYZYXYXYYXXWXWVWVWVUVVUTUTTUTSTSRQRQPQQPOPONONMNMMMLMLKLKJKJIJIHIHGHGHHGFEDEDCDDCDCBA@A@@A@@@?@@?>?>=>==>=<=<;<;<;:9:98998787787787676677676565454554434323212210/0/./..//../.-.-,-,,-,+,+,+,+ +**+**+**+)*)*)*)*)*)()()('('('('('('('('('(CDCCDEDEFEFEFGFGFGGHHGHIHIJIJJIIJKJKJJKLKLMLMLMLMNMNOPOPOPOOPPQPQPQPQRQRQRSRRSSRSTSTSTSTUTUVUVUUVWVWVWVWXWXWWXWWXYXYXXYYXYZ[ZZZ[Z[Z[\[\[\]\]\]^]^_^ _^^__^^__^^_^_`_`_`_``a`a`a`a `a`a`aa`a`aa`a`a`a`a`a`a`a`a`a`a`a`a`a`_`_``__`__``_^_^_^_^_^]^^]^]^]\]\\]\\]\[\\[[\\[Z[ZZ[ZZ[ZYXYXYXYXYXWXWWXWVWVUVUVVUTUTTUTSTSTTSTSRQPQPPQPOPPOPPOPONONMMLMLKJIJIJJIHIHGFEFFEDEDCDDCDDCBABA@@?@??>?>=>=<=<;<;<;:;:98 989887887887676765654544343232121221121010/././/. -..--.--.-.--,-,-,+,,++,+*++*++*+*+*)*)**)()(())('('('('('('('(('('(DCCDCDEDDEFEFEFGFGHGHIHHIIHIHIJIJKLKLMLLMNMNNMNONONONOPOPPQPQPPQRQRSRSSRRSTSTUTUVUVUVWVVWVVWXYXYXYZYZYZZYZ[[Z[\[\[[\[\]\]\\]^]^]^]^_^_^_^_`_`_`_`__`_` a``a``a`a``a`a`a`a``a`a`a`a`a`a`a``a`a`a`a`a`aa`a`a`_``_`_^_^_^]^]^]\]\]\\]\[\[\\[Z[ZZ[ZYZYZYZYXYXYXWXWXXW VWWVVWWVVUVUVVUTUTUTSTSTSTSRSRQRQPQPQPOPOPONOONOONMNMLMMLKLKJKJIJIHGHGHGFGFEFFED EDDEDDCDCDDCDCBCBABABA@AA@?>?>=>=>=<=<;<<;:;::;:9:99:989987876545434434323232121010/00/0/0/././/../.-.-.-,-,+,+,+*++*+*)*)('('('('('('('(CDEDEDDEFEFGHGHGHIHIIHIJIIJKJKLMLMNMNONOPOOPOPPQPQRSTSTSTUTUVUVUVVUVWXWWXWXYXYXYZYZYZ[[\[\]\]\]\]^]^_^_^_^^_`_`a`a`a`a`a`a`a`a`a`a`a``a`a`a`_``_``_`_^_^_^_^]^]^^]^]\]\]\\]\[\[Z[ZYZYZYXYXWXWXWVUVUVUTUTSTSTSTSRSRQRQPOPONONNONMMLKLKJIJIJIHGFGGFGFEFEEFEDEDEDCDDCCDCBCBABABBAA@?@?>?>?>=>=<=<=<;<;:;:9:98 98898878878788767676765 655445445445443434343232121010/./../../.-.-..-.-.-,-,-,+,+*++*++*+*)*)()()()('('('('('('(('(CDEDEFEFEFGFGHGGHHGGHIHIJIJIJKJKLMNMNMNONOPOPPQRQRSRSRSRSTSTUTUVWVWVWXWXWXYXYXYZYZYZ[Z[[\[\[[\[\]\]\]^]]^]^_`_`_`_``_`a`a`a`a``a`a`a``a`a`a`a`a`a`ababababa`a`aa`a`a`a`a`a`a`__`_`_`_^_^_^]^]^]^^]\]\]]\]]\[\[\[[\[Z[Z[Z[Z YZZYYZZYYZYXYXYXWXXWXWVWVWVUVUVVUTUTSTSTSRSRSRQRQPQPQPQQPOPPOPPONOONMNMMLKLKJKJIJIHIHIHGHGFEFEDEDEDCDCCDCBCBABA@A@A@A@?@?@?>?>?>?>=>=<==<;<;:9:9:98987887787656544543432323223212212101100110/0//0/./.-..-.-..-.-,-,--,-,-,+,+*+++*+*+*)*)*)()('('('('('('('('('('(DEDDEFEFEFGHGHIHHIJIJIJKJKLKLMLMLMNONOPOPQPQPQPQQRQRSRSSRSTUTUVUVUVWVWVVWVWWXWXXWWX WXXYYXYYXYYXYZYZYZYZ[Z[ZZ[Z[[\[\[[\]\\]\]^]]^]^]^_^_^_`_`__`_`_`_`a``aa``a`aa`a`aa`ababababababababa`a`a`a`a`a`_``_`_`__`_^__^^_^]^]^]^]\]]\\]\[\[Z[Z[ZZ[ZYZYZZYXYXXWXWXWVWVWVUVUVUUTUTUTSRSSRQRQPQPQPQPOPOOPONONONMNMNMLMMLKLKJKJKJIJIJIHGFGFEFEFEDEDCDCBCBABABA@A@?@?>?>?>=>=>=<=<=<;<<;;<<;:9:9:98988787676565654454343343434323212121010110/0/0//0/.//. /..--..--.--..-,-,,-,--,+,,+,+,+*++*+**+**+*)*)()(())('('('('('('(('(DEFEFGFGHGHGHIHIJKJJKLKLMLMNOPOPPOPOOPQPQRQRQRSTSSTSTUTUUTUUVUVWXWXWXXWXYXXYXYZYZ[Z[[ZZ[[\[\]\]\]\]]\]^]^]^_^^_^_^_`_`_``_`_`_`a`a`a``a``a`aaababababababaabaabbaabaabaababaababababa`a`aa`a`a`a`a`a``_`_`_`_^_^]^]^]\]\]\[\[\[\[Z[[ZZ[ZYZYXXYYXWXWVWVUVUVUUVUTUTUTSTSSTSRQPQPOPONOONOONMNMLMMLKLKJKJIJIJIHIHGHGHGFGFEFEDEDEDCDCCBCBAA@?@@?@?>?>=<==<;<;:;;:;::;;:9:99:9899878787676776545454543233212121121010/./.-.-.-,--,,--,-,+,+,+*+*)*)()()('(('('('('('('('('(DCDEDEDEEFEFGFFGHGHIHIHIJIIJKLKLMLMNMNMNONNONOPOOPOPOPQPPPQQPQRQRSRSRSRSTSTUVUVUUVUVUVWVWVWXWXWXYXYXYXYZYZYZYZ[Z[[\[\[\]\]\]^]]^]^]^^]]^_^^_^^_^_`_`_`__`_`_`a`a`a`a``a`a`abababababababababababababababababa`a`a`a`a`a``_`_`_`_^__^_^_^^_^^_^]\]\]\[\[Z[Z[ZYZYXYXWXXWVWWVWVUVUTUUT UTTSTSSTSTSRSRQPQPOPONONMNMMNMMNMLMLKJKJIJIJIHIIHIHGHGFGFEFEFFEDEEDCDCCDCBCBCBABAA@A@?@?@?>?>?>=>=<=<=<=<;<;<<;:;:9:9899898788787876765654 3443433433232101010/0/00/.//./.-.-.-,-,-,+,+,+*+*++*)*)*)*)()(()('('('('((''('('(DEDEFEFGFFGGFGHGHIHHIJKJKJKJJKJKLKKLKLMLMNMNONOPQPQPQRQRSRSRSRSTSSTSTUTUVUVWVWVWVWXWWXWXYXYZYZ[Z[[\[\[\]\]\]^]^_^_^__^_`_`_`a`a``a`a`a`aabababababababaabababaabababbababababababaababa`a`a`a`a`a``_`_`_^_^_^__^_^]^]]^]^]\]\[\[Z[ZYZYYXYXWXWX WXWWVVWWVWWVUVUTSTSRSRSRQRQRQPQPOPONONMNMLMLMLKLKJKKJIJIJIHIHHGHHGGHGFGFGFGFEFEDCDCBABA@A@AA@?@@?>?>=>=<;<;:;:;:9:987876566566554343233232121010/00/././.-.-,-,+,++*+*+*+*)*)()()('('('('('('('('('('(DEDEFEFGHGHGHIHIIHIJIJIIJKJKLKLMNMNOPOPPOPPOPQPQQPQRQQRSRRSTSTSTSTUTUTUVUVWVWXWXWXYXYXYXYYZYZYZYYZ[Z[Z[Z[\[\[[\[[\]\\]\]^]]^_^_^^_^_`_`a`a`a`a`aababa babbaabaababababababababababababaabaabba`a`a`aa`a```_`__`_`_^_^__^]^]^] ^]\]\]\]\]\[\\[\[\\[Z[Z[ZYZYXYXYXYXWXWVWVWWVUVUUVUTUTTUTSTSSTSRSRQRQRRQPQPOPOPONOONMMLMLKLKJKJKKJIJJIIJIHIHHIHGHGGFGFFGFEFFEFEDEDEDCDCBABA@A@A@?@?>?>?>=<=<;<;:;:9:98787676765454454454343232122122101010/./././.-.-.-.-,-,,-,+,+,++*+*)*)*)()(()())()()('('('('('('('('((DEDEDDEFEFGFGHIHIIHIJIJKJKLKLMLMNONOPOPQQRQQRSTSSTUTUVUUVWVWVWXWXWXWXYXYXYZYZ[Z[Z[[\[\]\]]\]\]^]^^]]^]]^_^__^_`_`__`_`a``a``a`a``a`aabababababababababababababaabababababbaababaababababbabbaba`a`a`aaa`_`_`_`_^_^_^^_^_^]^]]^]]^]\]\[\\[[\[\[Z[[Z[ZYZYYYXYXWXWXWVWVUVUVUTUTUTSTTSSTSRSRQPQQPPQPOPOOPPONONONMNMMNMLMLMLKLKJKKJKJIJJIHGHGHGFGFEFEDEDCDCBAA@?>??>?>=>=<=<=<;<;:989878767676566566544343232121010/0/./././/.-.-,-,-,+,+,++*+*)**)()()()('('('('(DEFEEFGFFGFGHGHGHIJIIJIJJKKJJKLKKLKLMLMNONOPQPQPQRQRSRRSSRSTSTUTUVUVUVWVVWVWXWXYXYXYZYZZYZYZ[Z[Z[Z[[\[\[\]\]\\]\]]\]^]^]^]^ _^__^^__^_^__^_`_`_`_``_`a`a``a`a`abab babababbabababa babbabbaabbaabababababababababaababababaababa `a`a``aa`aaa`a`_`_`_``_`_^_^_^]^]^]]^^]\]\]\]]\]\[\\[\[\[Z[Z[ZZ[ZYZYZYYYXYXWXWVWVUVVUVVUTUUTUTUTUTSRSRSRQRRQPQQPOPOPOPONONMNMNMLMLMLLMLKLKJKJJKJIJIHIIHGHGFGFEDEDCDCDCBCBABBABBAA@?@??@?>?>?>=>=<=<;<;<;:;:;;::;:9:9899898787876776565655445434434432332323212101010010/0/././.-.-,-,-,+,,+,,+,++*+*)*)**)*)*)()()()('('('('('('('(('(DEDEFEFGFFGFFGHGHIJIJIJ KJKJKKLKKLLKL MLMMLMMNMNMNMNONOPQQRSRSTSTTSTUTUUTTUV WVVWWVVWWVWXYXYXYZYZ[Z[Z[\\[\[[\]\]\]^]^]^^]^_^_^_`__`_`_`a`a`a`ababababababababababababababababaabaabababa``a`aa``a`_`_`_`_`_`_^_^_^_^]^]^]^]\]\\]]\[\[\[ZYZZYZZYYZYXYXWXXWXWVWVUTUTSTSTSRSRSRQRQRRQPQQPPQPOPONONNMNMLMLKLKJKKJIJIHIHIIHGHGFGFEFFEDEDCDCBABBAA@?@?>?>??>=>=<=<;:;:;:9:9:98988987876765665665455445434323212212101010/0/./././.-..-,-,-,-,+,+,,+,,++*+**++*)*)*)*)())()(()()('('('('(''('('('('('(('DEDEFEFEFGFGFGGHHGHIHIJIJIJKJKJJKLKLMLMNOPOPOPQPPQQPQQRQRSRSTSTSTUTUVUVUVUVWVVWXWXWWXYXYZYZ[Z[Z[Z[\[[\]\]]\]\]^]^_^_^_`_`_`_`a`a`a`ababababbabcbcbcbababbabbababbabbababa`aa`aa`_`_`_`_^_^_^_^]^]^^]^]\]\]\\]\\]\[\[Z[[Z[ZYZYYXYXWXWVWVWVVWVUVUTSTSTSRQRQRQPQPOPPOPOONONONNMLKJKJJIJIJIHIHGHGFGFGFEFEDEEDCDCDCCBCBABABAAA@?>?>?>=>==>=<;:;;:;:;:9:9::9878787676765654555434334323232121010/0/00/00/./../.-.-..-.-,-,-,++*++*+**+**))*)*))*))*)()()()('('('(('('('('DEDDEDEFEFEFGFGHGHIHHIIHIHIJIJKLKLMLMLLMNMNNMNONNOPOOPQPQRQQRSRSTSTUTTUVUVUVWVVWVVWVVWXWXXWWXWXYXYXYZYZYZYZZ[[Z[ZZ[\[[\[\]\\]\]^]^^]^_^_^^_^_^_`_`_`a`a`a``a`a baabaababaabababababcbcbcbcb ababbababaaba baabbabaabba`aa`a`a`a`a`_`_^_^_^]^]^]^]\[\[\[\[Z[ZYZYZZYYXYXWXWVWVWVUVUT STTSSTSTSSRSRQRRQPQPOP OPOONOONOONNONNMNMLMLKLLKJKJKJIJIJIHGHGFGFEFEFEFEDCDCDCCBCBCBAA@A@?@?>?>?>=>=<;<;:;:9::989878767676565543434343232321010010/0/./.-.-.-,--,-,+,,+,++*+*)*)*)()()()()('('('(EDDEFEFGHGHGHIHIIHIJIIJKJKLMLMNMNONONOPOOPQQRSRSRSTSTTSTSTUTUTUVUVUVWVWVWVWXWWXXWXWXYXYXYZYYZ[\[\[[\\]\]^]]^^]^_^_^_`__``_`__`_`a`abababbabbaabcbcbcbcbcbcbabababababaa`a`a`a`_`_`_``_`_^_^_^_^]^]^]^]\]]\]]\[\[Z[ZYZYZYXYXWXWVWVWVUTUTTSTSTSRSRSRQRQQRQRQPQPONONNMNMNMLMMLKLKJIJJIHIHGHGGHGFGFEFEDEDDEDCDCDCBABAA@A@A@?@?>?>=>>=<;<;:;:9::99:98998787 676776566556565545454343232232121010/00/./.-.-,-,,-,+,,++,++,++*+*)*)*)*)()())(()()('('('('('('((DEDDEFEFEFGFFGHGGHHGGHIHIJIJIJKJKLMNMNOPOPQQRQRSRRSRSTUVUVWVWVWXWXWXYXYZYZ[Z[\[\\\]\]^]^]^_^_`_`_`a`a`a`a`aa`ababababababaabababab cbcbbcbbccbcbcbcbcbcbcbcbbcbcbcbcbabababaa`aa`a`a`_`_^]^]\]\]\[\[Z[[Z[ZYZYYZYXYXYXWXXWVWVWVUVUVUVUTSTSRSRQRRQQRQPQPOPOOPONONNONNMNMNMMNMLMMLMLMLKLKLKLKJIJIJIHGHGHHGFGFEFFEFFEDEDCDCBCBCBABABAA@?@?>?>?>=>=<=<;<;:;:9:99:98988987676554543432323212212101010/0/0/./././.-.-,-,+,+**+*+**+*+*)*)*)()()('('('(('('('('(('DEDDEFEFEFGHGHIHHIJIJIJKJKLKKLLKLKLMLMLMNONNOPQPQQRQRSRSTSTUVUVWVVWXYXXYZYYZYZ[Z[ \[\[[\\[\[\ ]\\]\]]\]\]^]]^_`_`_`_`a``a`a`a`aa`a`abaabbaababbabababbcbbccbbccbcbcbcbcbcbcbcbcbccbcbbcbcbcbcbcbbcbbcbabababaa`a`a`_`_^_^]^]^]]^^]\]\]\]\]\[\[[\[\[Z[Z[ZYZZYZYZYXYYXWXWVWVWWVUVVUUVUVUTUTSTTSRSRQRQQRQPQPQPOPONNMNMLMLKLKKLKJKJIHIHIHGHGGHGFGFEFEDEDDEDCDCBAA@ ?@?@??>>?>?>=>==>=<=<;<;:;:9:9:987876767676565445454343232121210101010/0/0/.-.-.-.-,--,+*++*+*+*+*)*)**)*)()('('('(EFEFGFGHGHGHIHIJIJKJKJKLKLKLMMLLMNOPOPPOPOPPQPQPQRSTSTSTSTUTUVUVWVWXWXYXYZYZZYZZYZ[Z[\[\[\[\\]\]^]]^]^]^_^_^_^_`_`a`a`a`a`a`abababaabaababcbcbcbcbcbcbbcbcbcbcbcbcbcbcbcbbcbcbcbabababababababa`a`a``aa`_`_`_`_^_^_^]^]^]\]]\\]\[\[ZYZYYZYXYXXYXWXWVWVUVUVUTUTSTSTSRSRQRQPONONNMNMNMLMLKLKLKKJKKJKJJIJJIJIHGHGFGGFEFEDEEDCDCBCBCBCBCBABA@A@@AA@?@?@?>?>=<=<=<;<;;<<;:;:9::989989898787887656565545455455434434432321221121010/0//0/./.-.-.-,-,,-,++*+*++*)*)*)()()('('(('('(EDEFGFFGHIHIHIJIIJKLKLMLMNMNMNONONNOPOOPOPQPQPQQRRQRSRSTSTSTUTUTUVUVUVWVWVWXWXWXYXYXYZYZYYZ[Z[Z[\[[\\]\]^]^]^_^_^_^_`__`_`_`a`a`a`ababababaabcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbccbbccbcbababaabaaa`a``a``a`_``__`__`_^_^_^^__^]^^]]^^]^]\]\]\[\[Z[Z[Z[[ZZY ZYYZZYXYXXYXXYXWXWVWWVWVWWVUVUVUTUTSRSRRSRQRQRQPQPOPONONMNMNNMLMLKJKJIJIJIHGFEFEDEDCDDCBCCBCBABBABA@A@@A@?@?@?>?>=>=>=<==<=<;<;:;::;:;:9:98989898787677654545454343433434323232121010/0/0/././.-.-.-,-,+,++*+*)*)*)**)()()()('('('('('('(('('(EDEFEFEFGFFGGFGHGHIHHIJKJKJKJJKJKLKKLMLMNONOONNOPPOPQPQRQQQRSRSTUTUVUVUVWVWXWXXWXYXXYZYYZYYZ[Z[\[\]\\]\]\]\]^]^]^_^_^_^_^_`_``__`_`a`a`a`ababaababababcbcbcbcbcbcbcbcbcbcbccbcbcbcb cbcbcbbcbcbbcbcbcbcbcbabababbba`a`a`_`_`_ ^__^^_^^__^]^]^^]\]]\[\\[[\[Z[Z[ZZYZYXYXWXWXWVWVVWVUVUTUTSRQ PQPPOPPOPPONONNONMNMNNMLKLKJKJKJKJKJIJIHIHGHGHHGFEFEDCBCCBCBAABA@A@?@?>?>?>?>=>=<=<==<;:;:9898767767765454554344343232121010/0/.//./.-.-.-.-,-,-,-,+,+,+*+*+*)*)*)()()('('('('('('(DEFEFGHGHGHIHIIHIJIJIIJJKJKJKLKLMNMNMNOPOPPOPQRQRRQRSRSSRSTSTTSTUTUVUVUVWVWVWXYXYZYZYZ[\[\[\\]\]\\]^]^]^]^_^^_`__`_`__`a`ababababcbcbcbcb cbccbbcbbcbbcbccbc bcbbccbcbccbcbcbcbcbccbbccbcbccbabaaba`a`a``aa`a`_`_^_^]^]^^]\]\]\[\[\[Z[Z[ZZ[ZZYZYZYXYXWXWVWVUVUTUUTUUTSTSSTSRSRQRRQQRRQPQPQQPOPOPONOONNMLMMLKJKJIHIHGHGFGFEFEDCBCBABAA@A@A@?@?>=>=<=<=<;<;:;:;:9:989878787656565545434323232212121010/0/0/./.-.-.-.-,--,--,+,++*+*+*)*))*)()())()(()('('('('(''('('(EFEFGFGHIHIJIJKJKJKLMLMNMNONNOPOOPOPQRRQRSRRSRRSTSTSTSTUTUVUVUUVWVWVWXWXYXXYXYXYZYZYZ[Z[Z[\[[\[\\]]\]^]^]^]^_^_`_`_`a``a`abababaabcbbcbccbcbcbcbcbcbcbcbcbcbcbcbccbbcbcbcbababbaaba`a`_`__``__`_^_^_^_^_^ ]^]^]]^]^^]\]\[\[\[[\[Z[ZZYXYXXYXWXWXWVUVUVUVVUTUTSTSRSRRSRQPQPQPOPONMLKLKJKJIJIHIHGHGFGFEDEEDCDCDCBCBABA@?@@?@?@??>>??>=>=<=<;<;:;:9::98987677656565545543432323212212101010/0/0//0/././.-.-.--.-,-,+,+,+,++*+*)*))*)*)*)()()()('('('('(EFEFGFFGFGHGHGHIJIIJIJJKKJJKLKKLKLMLMNONOONOPOOPQPQPQQRQRSRSTSTUTUVUVWVWVVWXW XWXXYYXXYXXYZ[Z[[ZZ[Z[\[\\[\[\]\\]]\]^]^^]]^_^^_^^_`__`_`_`_`a`a`a`a`ababaabababcbcbcbccbcbcbcbccbccbcdcdcbcbcbccbbcb cbbcbbcbbcbcbcbabbbabaabbaba`a``a``a` _``__`_`_`__`_^_^]^]^]]^]\[\[[\[ZZ[ZZYZYXYXWXXWVUTUTSTSTSTSRSSRRSRSRQRQRQPOPONONMNMLMMLKJKJKJKJIHIHIHHGHHGGHHGHGFFGFGFEFFEFEDEEDCDCBAABBA@A@?@?@?>??>=>=>>=< =<=<<;<;<<;;<;:9:98989876767655454554343432321210110/0/0/.//./.-.-,-,-,+,+,+,+ +*+**++*++*)()()('('('('(('('(EFEFGFFGFFGHGHIJIJIJKJKLKKLLKL MLMMLMMNMNMNMNONONOPOPQPQRQRRSRSSRSSRSTSTSTUTUVUVUVWVWWVWXWXYXXYXYZYZ[Z[Z[\\]^]^]^_^_^^__^^_` _`_`_``_`_`a`a`a`ababababcbbcbcbcbcbcdcdcdcdcdccdcdcdcbc bcbccbbccbccbcbcbbababbaba`_``__``_^_^_^]^]\]\]\[\[\[Z[ZZYZYZYXYYXYXXWWXWXXWVWVUVU VUUTTUUTUTTUTSTTSTSRSRQRQPQPOPONOONONMNMLMLKLKJKJJKJJIJIHIHGHGFGGFGFEFEDCDCCDCBCBCBABBA@A@?@?>?>=>=<=<;<<;:;;:9:989878767765665656554545454343232233212212101010/0/0/.//..//.-,-,+,+,++*+*+* )*)*)*))*)*)()()(()()()('('('('('('(EFEFFEFGFGFGHGHIHIJIJIJKJKLMLMNMNOPOPOPQPQPQRRSRSTSTUTUVUVWXWXWXYXYZYZYYZZYZ[\[[\[[\[\]]\]^]]^]^^]^_^_^__^_^_`_`_`a`ababababcbcbcbcbccdcdcdcddcdccdcdcddcdcdcdcbcbccbccbcbcbbcbbababababa`aa`a`a`_`__`__`_^__^_^_^]^]]^]]^]\]\]\[\[\[[\[Z[[Z[ZZYZYXYXWXWWXWVWVWVUTSTSSTSRSSRSSRSRQRQPOPOONMLMLMMLKLKJIJIHIHGHGFGFGGFEFEDEDCDCBCBCBA@A@?@?>??>?>?>=<=<;<;<;:;;:98989889878787676 56656556555454343432323211221010/0/.//../.-.-,-,--,+,+,+++*+*++*+*)**)*)())())()('('('('('(DEEFEFGFGHGHIHHIIHIHIJIJKLKKLKLMLMLLMNMNNMNONOPQRQRRRSRSTSTUTUVWVVWXWXYZYZYZ[\[\]\]\\]^]^_^_^_`_`__`_`_`_`a`a`abababab cbbcbbcbcbbcbcbccdcdcdcdcdcdcdcdcdccdccdcbccbcbcbcbcbbababa`a`a`_`_`__`_ ^__^__^^_^^_^]^]]^]\]\]\[\[Z[[ZZZ[[Z YZZYYZZYYXYXYYXWXWVWVWVUVUTUTSTSRSRSRQRRQRRQPQPOPPOONMNNMLMLKJKJIHIHGHGHHGGHGFGFFGFEDCBCBABABABA@@A@@A@?>=>=<=<<=<;:9:9:987878787676765655454454343344323232101010 /0/0//0//0/./.-.-.-,--,--,+,+,++ *+**++*+*+*)*)*)*)()()()('('('(('('('('('('(EFGHGHGHIHIIHIJIIJKJKLMLMNMNNOONNONOOPOPOPQRQRRSRSTSSTSTUTTUVUUVUVVUUVWVWWVWXWXWXXYXXYXYZYZ[Z[Z\\[\]\]\]\\]^_^_^_`_`_`a`aa``ababbabcbcbcbccdcdcdcdcdcdcdcdcdcdcdccdcdccdcdccddcdcdcdcdcdcbcbccbcbcbccbcbbabababababa`a`aa`a`_`_`__`_^_^_^]^^]\]\]\]\[\[\[Z[ZZ[ZYXYXYXWXWVWVWVUVUTUUTSTSSRRSRQRQQRQPONOONMNMLMLMLKJIJIJIHGHGHGFGGFEFEFEDEEDEDCDCBCBBABA@A@?@?>?>=>=<=<;<;:;:9:989987878876767656554323232233212101010/0/./.-.-.-,-,+,+,,+,++*+*++**+*)*)*)*)())()()('('('('('('(EFEFEFGFFGHGGHHGGHIHIJIJIJKJKLMNMNMNONONOPOOPQRRSRSTSTUTUVUVUVWVWXWXWWXWXWXYZYZYZ[Z[Z[\[\[\]\]]\\]\\]^]^]^_^_^_`_`a`abababababbababbcbcbcbcbcbcbcbcbccdcdcdcdccdcdcdcdcdcdcdcdcdcdc dcdccddcdccdcdcdccdcdcbcbcbcbcbbababa`a`a`aa`_`_``_^_^^_^]^]^]\]]\\]\\]\[\\[Z[[ZYZYZYXYXYYXWVWVWVUVUVUTUTSRSSRSSRQRRQPQPOONMNMLMLKLKLKJKJIHIHIHGHGFGGFGFEFEDEDCDCBCBCBBABABA@A@A@?@?>=>=<=<=<;<;:;:9::9:987876765655655545434323232121121010/0/.-.-.- ,-,-,,-,,-,+,+,++*++*)()()('('('('('('('('(EFEFEEFGFGHGHIHHIJIJIJKJKLKKLLKLKLMLMNMNONOPOPQPQRRSRSRSTSTSTUTUTUTUVUVVUVWVVWXWXWXYXYZYZZYZ[Z[Z[\[\[[\[\]]^]^^]]^_^^__^_`_`__`_`a`a`abababbabababcbbccbbcbccbcbcdccdccdcdcdcdcdcdcdcddcddcdcdcdcdcddcdcdcdcdcdcddcdcbcbcbcbbcbabbaaba`a`a`_``__`_^_^]^]\]]\\]\[\[\[ZZ[ZYZYZYXYXYXWXWVWVWVUTUTSTSTSTSRSRRSRQRQRRQPQPQPOPPONONMNMLMLMLKLKJKJKJIJIHIHIHGFGFGGFEFFEFEDEDEDEEDCDCDDCBCBCBBAABA@A@A@?@?@?>?>=<=<=<;<;:;;::;:;:9::98787876765655454543434432321210/0/././.-.-.--.- ,-,-,-,-,-,+,,+,++*+*+*)*)*)*)()(()()('('('('('('(('('('(('('('EFEFGFFGHGHGHIHHIJKJKJKLKLKLMMLLMNONOPOPQPQPQRRSTSTSTSTSTUVUVWVWVWXWXWXYXYXXYZYYZYZ[Z[\[\\[[\]\]\]]^]^]^_^_^_^_`_`a`a`a`a`abaabbabababcbcbcbbcbbcbcdcdcdcdcdcdcddcdcdcdcddcdcdcdccdcdcdcdcdcdcdcbcbcbaba`a`a`a`_`_`_^_^]^^]]^]\]\[\[\[[\[[ZYZYZYXYXYXXYXWXWXWVWVWVUTSTSRSRQRRQRRQPQPOPPONOONMNMLMLMLKLLKLJKKJJKJIJIJIHIHGHGFEFEFEDEDCDCDCBCBAABA@A@A@A@?@?@??@?>=>=<=<;<;<;:;:9:9898767676656565654545434323223232121212101010/././/.//../.-.-.-.-,-,,-,,-,+,,+,++,++,+*+*++*)*)*)()())()()()('('('('('('('('(EFGFFGHIHIHIJIIJKLKLMLMNMNONONOPOOPOPQPQPQRQRSRSTSSTUTUVWVWVWXWXWXWXYXYYXYXYZYZ[Z[Z[\[\]\]\]\]]^]]^]^]^_^__^_`__`_`_`a`ababcbcbcbbcdcdcdcddcdcdcdcdcdcddcdcdccdcdcdcdcbcbcbbccbcbabbababaabaaba`_`_`_^_^]^^]^]]^]\]\[\[\\[Z[[ZZ[ZYZYZYXYXYXWXXWXWWXWWVWVVWVWVUVUTUTSTSRSRQRQPQPPQPPQPOPOONMNMLMLMLKLLKLKJKJIJIHIHIIHGHGFGFGFEFFEDCBBA@AA@A@?@?>?>=>=<=<;<;<;:;:9:9:989899878765654544343432323212101010/00/././.-.-.-,+,++*+*+*)*)()()()(()('('('(EFEEFEFGHIHHIJIJKJKLMLLMLMNMNONNOPQPQPQRQRRSTSTUTUTUVUVUVWVVWVWVWXWXYXYXYZYZ[Z[Z[\[[\[\]\]\\]\]^^]^]^_^^_^_`_`a``a`abababaabcbcbcdcdcdcdcdcdcdcdcdedcdcdcdcdcdccdccdcbcbcbbccbcbcbbcb abaabbabababa`aa``a`a`_``_`__^__^_^]^]^^]\]]\\]\\]\[\[Z[Z[ZYZYYZYZYXYYXYXWVWVVWVUVUVUTUTSTSRSRQRQRRQPQPPQQPQPOPOONONMNMNMMNMLMLKJIJIHIIHGHHGHGGFGFGFEFFEFEDEDDEDCDCDCBCBBABABA@A@@?@?@?>?>=>>=<==<=<;:;;::;:9:9:98987878765654543432332121010/0/0/.//./../.-.-,-,-,+,+,+++*+*+*++*+*)*)*)*)()()()('('('('(EFFEEFGFGHGHGHGHIHIJIJKJKJKLKLKLKLMNMNMNONOONNOPOPOPQPQPQPQRQRSRSTSTSTUVUVWVVWWVWXWWXWWXYXXYZ[Z[[Z[\[\[[\]\]\]\]^]^]^]^_^_`_`_`_`a`a`abaababababcbcbcbcbcdcdccddcdcdccdededededcdcdcdcdcbccbbcbcbbcb abbabbaabaabba`a`aa`a`a`_`_^_^]^]\]]\[\[Z[ZYZYXYXWXWVUVUTUTSTTSRSSRQRQRRQPOPOONONONONMLMLKLLKLKJKJIJIHGHGFGGFGFEFEDEDEDCDCBCBCBCBBBABA@A@?>?>=>>=<=<=<;<;<;:;:;;:9::99:989989878788767676565554543432323212112121010/0/0/0/./.-.-,-,--,--,+,+,+,+*+*++**+* )**)*)*)*))*)()()()())('('('('('(EFGFGHGGHIHIJIJIJKJKJKJJKKLKKLKLLKLMLLMNMMNMMNOPQPPQRQRQRRSTSTUTUTUVWVWXWXWXYXYZYZYZ[Z[ZZ[\[[\ ]\]\]\]]\\]^]^_^_^^_^_`_`_`_`a`a`abababcbcbcdcdcdcdcdcdcdcdcdcdededededdedcdcdcdcdccdcdccbababa`a`a`_`_`_^_^]^^]^^]\[\[Z[[Z[Z[ZYZYZYXYYXXYXWXWWXWVWVUVVUUVVUTUTUUTSTSTSRSRQRQPOPPONONMLMMLKLKKLKJKJIHIHGFGFEFEDEDEDCDCBBABA@A@A@?@?>?>=<=<;<;:98989876765656545454323212212101010/0/0/00/././.-.-.-,--,,--,+,+++*+*)*)*)*)()()()()('('('('('('('(EFEFGFGHGHHGHIHIJIJIIJKJKJJKLMNMNMNONOPOOPOPOPQRQQRRSRSTSSTUTUTUVUVWVVWVWXWXYXYXYZYZYZ[Z[ZZ[\[\]^^]^_^^_^_`_`a`a`a`abaababaabcbcbccbcdcdcdcdcdcddccdededededdeddeeddeededededededcdcddcdcdcdcdcdcbccbccbbccbcbabababababa`aa`aa``a`_`_`_^_^_^]\]\]\[\[[Z[[Z[[ZYZYZYXYYXXYYXWVWVVWVUTUUTUTSTSRSRQRQRQPONONMNMLMLLKLKJKJIHIIHIHIHGHGHGFGFEFEEFEDCDCDCCBBCCBBABA@A@A@?>=>=>=<=<==<; <;;<;;:;:;:9:989889878787676767656654554545434343343233232121010/0/././.-.-.--.-,-,--,-,-,++*++*+*)*))*)**)()()())(()('('('(('(('('(EFEFGFG HGHGHHGHHIIHIJKLKLMLMNMNONOPOPOPQPQRQRSRSTSTUTUTTUVU VUVVWWVWWVVWXWXWWXYXYXYZYZ[Z[\[\\[\]\]\]^]]^]^ _^^_^^_^__^_`_`_`_`a``aa`a`abaabababcbbcbcdcdccddcdccdcdcdededededdedededededdededdedded eddeddeddedededcdcdcddcdccbccbcbcbabaaba`a``a`a` _``_`__`__`_^_^]^]\]]\]\[\\[\[\[[Z[ZYZYXYXWXWXWVWWVVWVWVUVUVUTSTSRSRQRQQRQPQPOPONONONMNMLMLKLKLKKJKJKJIJIHIHGHGFEFEDEDCDCDCBCCBBABABBA@A@?@?@@??@?>?>=>>==>>=<=<;<;:;;:9::9:989898788767656656545545434432321210/0/.-.-.--.-,-,+,++,+*+*)**))*)()())())()('('('('('('(EFGFGHGHGHIHIJIJKJKJKLKLMLMLMNMNMNOPOPQPQRQRRQRSRSRSTSTUTUUTUTUVUVWVWVVWXWWXWXYXYZYZ[Z[ZZ[\]\]\]]\]\]^]]^^]^_^_^_`__`_`a`ababcbbcbcdcdcdcddededeedededededededededededededededcdcdcdcdcdcdccdccbcbcbcbababba`aa`_^__^__^_^]^]\]\]\[[Z[Z[ZYXYXWXXWVWVUVUTUTSTSTSRQRQPQPOPPONONOONMLKLKJKKJKJIHGHGGHGFEFEDEDCDCBCBABA@A@?@?>?>?>=>==>=<=<<==<;:;:9::9:989898787676776545434343232321210/0//0/./../.-.-.-,-,+,,+*+*+*)*)*)*)())()('('('('('('(EFGFGFGHGHIHIHIJIJKJKJKLKKLMNONONONOPOPOPQPQRQRQRSRSTSTUTUVUVUVWVVWVVWXWXWWXYXYZYZYZ[ZZ[\[\[\]\]\]\\]]^]^]^]]^]^_^_`_`_`a`a`a`a`ababbabbabcbcbbcbcdcdcdcdcddcdcdcdedeededdedededededededeedeededededeedeedededdedededcdcdcdcdcdcdcdcbcbbcbbcbabbababa`aa`_`_``_`_^_^_^]^]\]\]\[\\[\\[\[\[Z[ZYXWXWWXWVWWVWWVWVUVUTUTSTSTSRSRQRQPQPOOPONMLMMLKLKJKKJIJIHIHGHGFEDEDCDCBCCBCBBBA@A@?@@?@?@?>??>=>>=<=<=<;:;::989898787876766545434343232121210101010/0/./.-.-.--.-,-,+,++,,+*+*+**+* )**)*)*)**)()('('('('('(EFFEFGFFGGFGHGHGHIHIHIJIJKJKKJKLMLMNMNMNOONONNOPOPQPQRQRSRRSTSTSTUTTUVUVWXWXYXYZYZ[Z[\[[\[\]\]^]^]^^_^^_^_^_`_`_`a`a`abababab cbbcbcbbcbbcdcdcdcdcdcddededededededdedededede dedeedededdededdededeededededcdcdccbcbcbcbbcbabbaabaaba`_`_`_ ^_^__^^_^_^]^^]^]\]\]\]\[\[[Z[ZYZYXYXWXWXWVWVWVUVVUVVUTUTSTSRSRQRQPQPQPOOPONONONMNMLMLMMLK LKKLKKJKJKKJKJIHGHGFGFEFEFFEEFEDEDCBBABA@A@@A@?@?>??>=>=<;:9:9:9876765655656545445434434332321212101010/0/00/0/./.-.-.-,-,-,+,++,+,+*+*+*)*)*)*)*)(()()()())('('('('(('('('('('('(FEFGFGFGGHGHGHIHIJKJKJJKLKLMLLMLMNMNNOONNOPQRQRQRSRSRSTSTUTUUTUVUUVUVVWVVWVWXWXYXXYZYZ[Z[\[[\]\]\]^]^]^^_^_`__``_`__`a``a`a`a`a`abababcbcbcdcdcdcdcdcddeddededededeedededededededededededeedededdedededcdcdcddcdcbcbcbbcbcbabaaba`a`_`_^_^_^_^]^^]\]\\]\[\\\[\[Z[Z[Z[Z[ZYZYXYXWXWWVWWVUVUUVUTSTSRSRQPQPQPOONMNMMNMLMLLMLKLKJKKJIJIHIHHIHGHGFGFEFEDEDCDCBCCBABA@A@?>?>=>>=<=<=<;<;:9::9:98987677655434343233210110/0/.//./.-.-.-,-,-,-,+,++,,+*+*+*)*)()()('('(('('('((FGFGHGHGHGHIHHIJIJIJKJKLKLKLKLMLLMLMMNMNMNOPOPQPQPQRQRSSTSTTUTUVUUVUVUVWVWXWXWXYXYZYZYZ[Z[\[\]\] ^]]^]^^]^^^_^_`_`_`a`a`a`abaabbaababcbcbcbcbcdccdcdcdcdcdccdedededededededededededededededcdcc bccbbccbccbabaababa`a`a`_`_``_`_^_^]\]\[\\[Z[Z[ZYZYYZZYZYXYXWXWXXWVWWVWWVUVVUTUTSTSRSRQRQPQPOPONONMLMLKLKLKJKJJKJJIJIHIHGHGHGFGFGFEFEFEDEDEDCDCBABA@A@A@?@?>??>?>=>=>=<;:;:9:98988998767676765656654543432101010110/0/./../../.-.-,-,--,--,+,++,+,,+,+*)*)*)()()(()()()('('('('('('(FGFGHIHIJIJKJKLKLKLMLLMNMNMNMNONONONOOPOPQPQRQRQQRSSTUTTUUTUVUVUVWVWXWXXWXXWXYXYXYZYZYZ [Z[ZZ[[Z[Z[\[[\[\\[\]\\]\]^]^^_^_^_`_`_`a`a``a`ababbaababcbcbccbcdcdcdcdcdededeedededededededefefefedededeedededededcdcdccdcdcbccbbcbababa`a`a`_`_`_^_^_^_^]^^]^]^]\]\]\]\\[\\[\\[Z[ZYZZYXYXWXWXWXWVWVVWVUVUVVUTUTUTSTTSRQRQPQPQPPONMNMLMLMLKLKJKJKKJIJIHIHIIHGHGHHGFGFGFEFEDEDEDCDCDCBCBABA@A@?@?>?>?>=<=<;<;<;:;:;:9:989898787677665454554344334323323232122121010010/0/././.-.-,-,-,,+,+,+*+*+*)*)*)*)()()('('('('('FGFGFGGHGHGHIHIJIJIJKJKLKLMLMNONNOPOPQRSRSRSSTSTUTUTUVUVWVWVWXWWXWXYXYZYZYZ[Z[\[\]\]\]^]^]^^_^_`_`_`a`a`abababbabcbcbbcbbcbcdccddcdcdedededeededefefefefefedededdedededededccdcdcbcbcbaba`a`_^_^_^_^]^^]^]^]\]\[[\[Z[ZZ[ZYXWXWVUVUTUTSRSRRSRQRQPQPQPPOPONONONMNMLMLKLKJIJIHIHGHGHGFGFEFEDEDCDCDCCDCBBABA@A@?@?>??>=>>=>=>=<=<==<;:;:;::9::9:989878778876767656545432323321212101010/00//0/././.-.-.-,-,+,+,+*+*+*)**))*)*)*)()()('('('(''('(FEFGFGFGHIHHIHIJIJKJKLMLLMLMNMNONNOPQPQPQRQRSRSSTSTSTUTTUTUUVUVUVWVWXWXWXWXYXYYXXYZYZ[\[\]\\]\]^]^]]^]^^_^^_^_^_`_`a``a`a`a baababaabbabcdcdcdedededededefefefefefefefedededdeddedcdcddcdcbcbcbabababa`a`a`_`_`_``_^_^_^]^]^]\\[\\[Z[Z[ZYZYXYXWXWVWVWVUVUTUUTTUTSTSRQRQPQPQPPOPONONMNMLMLMMLKLKJKJJKJIJIHIHGHGFEDEDCDCBCCCBABA@A@?@?@?>??>=>=>=<=<;<<; :;:;:;::9:9:989898767677665454323212101010/0/0/./.-.-.-.-,-,,-,+,+,+*+*+*+**+*+*)*)*)*)()()()('('('('('('(FGFGHGHGHGHIJIJKJKLKLKLKLMNMNMNONOONNOPOPQPQPQPQRQRSRRSSTSTSTUVWVWXWXWXYXYZYZYZ[Z[\[\[\[\]\]^]]^]]^_^_^_^_^_^_`_`_`a`a`abaabbab cbbcbcbcbcbcdcdcdcdededdededefefefeefefefeffefefefefedeededeedeededdcdccddcdcbcbcbabbaba`aa`aa``a`_`_`_^_^]^]\]\]\\[\[Z[ZYZYZYXYXYXWXWVWVUVUTUTSTSTSTSRSRQRRQPQPQPP OPOONOONNONMNMNMNMLMLKJKJIHIHGHGHGFEFEDEDCDCBCBA@?@?>=>=< ;<;<<;<<;;:;:;:;:9::989878878787676766565565545432121010/0/0/0/.././.-.-.-,-,+,+,,++*+*+*)*)*)()()())()(()('('('('('('(FGFGHGHIHIJIJIJKJKJJKKLKLKLMLLMNMMNMMNOPQPPQRQRRQQRSSTUTUVUVWVWXWXWWXXWXYXYZYZYZ[Z[Z[\[\[[\]\]^]]^_^_^_`_`a`ababcbccbcdcdcdedededededeefefeeffefefefefefefefefeffefefededededdeededcdcdccdcdcbcbcbcbcbababa`a`_`_`_`__`_^_^_^_^]^]^^]\]\]\\[\[[\[ Z[[Z[ZZ[YZZYZYZYXYXYYXWXWVWVWVUVVUTUTTUTSTSRSRQRQPQQPPQPPOPOOPONONNMNMMNMLMLKLKLKJKJKKJIJIHIHHIHGHGGHGFGFEFEDCDCBCCBABABA@A@?@?@?>?>=>=<=<=<;:;:;:9:9:989878767655656545434343433223232122112101010/0/./.-.-,-,+,+*+*+*)*))*))*)())()('('('('('('(('('(('(FGFGHGHHGHIHIJIJIIJIJJKKJJKJJKLMNMNMNONOPOOPOPOPQRQRSTSTSSTUTUVUVWVWVVWVWXWXYXYZ[Z[ZZ[\[ \[\\]]\]\\]]\]^]^^]]^^]^_^^_`_`_`_`a``a`abababaab cbcbbcbbcbccbcdccdcdcdcdededededeefefefefefeefefefefeffefefefefefefeefedeedededdcdcdccdccdcdcbcbcbcbababababa`a`a`_`_^]^]^^]^]\]\]\\\[Z[Z[[ZZ[ZYZYXWXXWWXWVWVVWWVUVUVUTUTSTSTSRSRQRRQRQPPONONONMLMLKLKJKKJJKJIJIHGHGFEDEDCDCBCCBCBABABAA@A@?@?>??>=>=<=<=<;<;;<;:9::9:989898788778767656656654343432321221011010/0/././.-.-..-.-,--,-,+,++*+*+*)*)*)()()()()(FGFFGFGHGHHGGHIJKLKLKLMLMNMNONOPO POPPQPPQQPQRQRSRSSTUTUUTUVUVWVWWVWWXWWXWXWXWXYXYXYZYZYZ[Z[Z[Z[\[[\]\]]\\]^]^__^_`_`_`a`a`aa`ababababcbcbcbcdcdcdcdeddeededdededefefefeffefefeefefefefefeefeefeffeefefeffeefeefefefeeffefefefefede dededeeddeddeedcdccddccdccddcdccbbccbcbcbcba`a`a``a`__`_`_^_^_^]^]^]]\]\\[\[\[\[\[ZYZZYZYZYXYYXWXXWVWVWVWVUVUVUVUTUTUTSTSSTSRSRQRQQRQPQPPOPPONONMLKLKJKJKJI HIIHHIHHGHGFGGFEDEDCDCCBBCBABABBA@A@?>?>=>=>=<==<;<<;<;:;;:;:9:98987876776654545434323322321010/./../.-.-.-,--,++*+*)*)*)*)()()()('('('(FGFGHGHIHIJIJKJKJKLKLMLMLMNMNMNOPOPQPPQPQRQRRQRSTSSTSTUTUUTUVWVWVVWXWXYZYYZYZ[Z[Z[\]\]\\]\]^_^_^_^_`_`_`a`a`ababcbcdcdcdedededefefefefeffefefefefef efeffeeffefefefefeffeefefefedededdcdcdcdcdcbcbcbababa`a`a`_^_^_^_^]^]\\[\[Z[Z[ZYZYZYXYXYYXWXXWXXWVWVUVUTUTSTSRSRQPQPOPOPPONONMNMLMMLKJKJIHIHGHHGFGFEFEDCDCDCBBCBA@AA@?@?>?>=>=<=<;<;<<;:;:9:98987878876765656543434432323212101010010/0/././.-.-,-,-,,-,+,+,,++,+ *++*+**++*+*)*)*)())()('('('('(FGFGFGHGHIHIHIJIJKLKLMLMNONONONOPOPOPPQPQPQRQRQRSRSSTSTUVUVUVUVWVWVWXWXYXYZYZYZ[Z[Z[\[\]\\]\]]\]^__`_``__``_`abababcbcbcdcdcdcdedededeedededefeffeefeefefefefeffeffefefeffefeffeefefefefefedeededeededd cdcdcdcddcdcbc bcbbcbbcbbcbaba`a`a`a``a`_``_`_`_^_^_^^]^]^]\]]\\[Z[Z[ZYXYXYXWXWVWVUVUTSRQRQQPQPQPPOPONONMNMNMLMLKLLKJKJIJIHGHGHGGFGFEFEDEEDCDCDCCBABBAABBA@A@?>=>=>=<=<;<<;<;:;:;:9:989898787676656556545545434343343210100110/0/././.-..--.-,-,,+,+*+*+*)*)*)*)()('('('('(('('('(('FGFGHGHGGHIHIHIJIJKJKJJKLMLMNMNMNONNONNOPQPQRQRSRRSTTUTTUVWXWXWXYXYXYXYYZZYZYYZYYZ[Z[\[\[[\]\]\\]^]^^]^_^_^__`_`_`abababaabcbcbcdcdccdcdcdededdedefeefefefefefeefefefefefeffefefef effeefefeffeffefefededdeededcdcdcdcbcbcbabababa`a`a`_``__`_^]^]^]\]\\\[Z[[ZYZYXYYXWXWVW VWVVUVVUVVUUVUTUUTSTTSSTSRSRQRRQQRQPQPQPONONMNMLMLKJKJIJIHIHGFGFEFEFEDCDCBCBABA@A@A@?>?>?>=>=<;:;:98787676766565654544543443232121010/0/0/././.-.--..-,--,--,-,+,,+++*+**+*+*)*))**)*))()()(()('('('('('(FGFGFFGHGHGHIHIJKLKLMLMNMNNOONNOPQRQRQRSRSRSTSTSTUTUUTUVUVWVVWXWXYXYZ[Z[\[[\]^]^_^^_^__`a`a`aa`ababcbbcbcbcdcdcddcddccdedededeededefeefefefeffefefefefgfefefefefefefededeeddedededcdcdcbcbababa`a`a`_`_^]^]\]]\[\[Z[Z[ZYZYZYXYXXYXYXWXWVUVUTUTUTSTTSRSRQPQQPOPONONNONMNMLMLKLKKLKJKJKJIHGHGHGFGFGFEDEDEDCCDDCCDCCBBCBABA@A@?@?>?>=>=<=<<;<;:;:9:98788767766565455434343212122101010010/0/0/././.-..--.-,-,,-,+,+,+,+*+*+*+*)**))*)()()('('('('('('((GFGFGHGHGHIHHIJIIJIJKJKJKLKLKL MLLMLMMNMMNMNMNOPOPQPQPQRQRSTTUTUVUVUUVUVWVWXWXWXYXYZYZ[\[[\[[\]\]\]^]^__`_`a`ababababcbbcbcbcbcdcdcdccdcdcddedededededdefefefefefefgfgfgfgfefeffefefefefedededeeddeedcdcdcbcbcbababaaba`aa`_`_^_^_^]^^]^]^]\]\]\[\[Z[ZYXYYXXYXWXWVWVVWVUVUVUTUTUTSTSTSRSRSRQPQQPQPONONOONMNMLMMLKLKJKJKJIJIJIIHIHHIIHIHHGHGHGFGFGFEFEDEDCDCBCBBCCBABABA@A@?@?>??>?>=<;<;:;:;:9:987878788767665656545454343 4332232232321221221210/0/./../.-.-.-,-,+,,++,++,+*+*)**))**)()()()('('(FGFGHIHIHIJIJKJKLKLKL MLLMMLLMMNMNMNONONONOOPOPQPQRQRQQRSTSSTTUTTUUTUVUVUVVWVWWVVWXWXXWXYZYZ[Z[[Z[\[\[[\]\]]\\]^]^_^__`__`a`a`abababcbbcbcdcdccdcdcdcdededeededdefefefefeeefefefgfgfgfgffgffggfgfgfgfgfgfgfefefefedeeededcdcdcdcdcbcbcbbcbababba`aa`a`_`_`__`_^_^_^_^]^]^]^^]\]]\\]\[\[\[Z[Z[[ZYZYXYXXYXWXWXWVWVUVUTUTSTSRSRRSRQRQPPOPOPONONNONMNMLMLKLKJKJIJJIHIHGHGFGFEFEDEDCDDCCBABABA@A@?@?@?>??>=>=<=<=<;<;:;:;;:989878876766565455434323323212101010/.//././.-,-,-,++,+*+*+*)**))*))*)()())()()('('('('(FGFGHGHIJIJKJKJKLKLMLMNONNOPOPQRSRSTSTSTTUTUTUVUVWVWVVWVWXWXXWXYXXYXYXYZYZYZ[ZZ[Z[\]\]]\\]\]^]^]^]^_^_^_`_`_`a`a`abaabbababcbcbbcdcdcdededededefefefefeffefgfgfgfgfgfgfgfgfgfgfgfgf effefeeffefefefedeedededcdcdcdcbcbcbcbaba`a`a``a`_`_^_^_^]^]^]^^]\]\\]\[\[[\[Z[Z[ZYZYXYXYXWVUTUTUTSTSRSRSRRQRRQRQQPQQPQPONONMNNMLMLKLKJKJKJIJIJIJIHGHHGHGFGFEFEDEDCDCCCBCBA@A@?@?>?>=>=>>=<;<;<;:;:9:98987878766545434 3433232332232122121210/0/././.-.--.-.-.-,--,-,+,+,,+,+*++*+*)*)*)*)*)()()())()()('('('('( '(('('(('('(FGFFGHIHIJIJJIJKJKJKJKLKLMLLMLMNMMNONNOPQPQPQRQRSRSRSTSTSTUTTUVUVUVWVWVWXWXYXYYXYZYYZYZ[Z[\[\ ]\\]\]\\]\]^]]^]^_^_^__`__`_`a`ababcbcbcdcdcdcdcdedededeedefefefefefeeffeeffgffgfgffgfgfggffggfgfggffgfgfgfgfggfgfefeffefefeefeefeededededededcddccdcdcbccbcbbabbaba`a`aa`_``__`__`_^_^]^]^]\]\\]\]\[\\[\[ZYZYYZYXYXYXWXWVWVUVUTUTUUTSTSRQRQPPQPQPONMNMLMMLLMLKLKJKKJIJIIJIJIHIHGHGHGFGFEFEDEDEDCDCCBABAABA@A@A@?@?>?>?>=>=< ;<;<;;:;:;;:9:9:98787887676656564545432332323232101010/0/.//.-.-..-,-,-,+,+,+*+*+*+*)**))*)()()(()('('('('(FGHGHGHGGHIJIJKJKLKLKLMNMNMNONOONNOPOPQPQPQPQRSRSTSTUVWVWXWXYXXYZYZ[Z[\[\[\]\\]^]^]^_^_^_^__`a`a`a`abcbcbbcdcdcdedededededefeefefeff gfgfgffgfgffgfgfgfgfgfgfgfgf gfgffgfggfgfgfefefefefeefeded edeeddeddedcdcddcdcbcbaba`a`_``_^_^]^]^]]\]\[\[Z[ZYXWXWVWWVUVUUVUTUTUUTSRQRQRQRQRQPQPOPONONOONMLMLKKLKJIHIHIIHIHGHHGFGFEDEDCDDCCBCBCBBABABA@A@A@A@?@?@?>=<==<==<;:9:9899898987876766565454543434323321211211010/0/./.-..-.-,-,-,-,-,+,+,+,++,+*+*+*+*)**)**))*)()()('('('('(FGFGHGHGHIHIJKJKJJKJKLKKLMLLMNMNOPQPPQRQRRQQRSTSTTUTUVUVWVWWVWWXWXYXYZ[Z[Z[\[[\]\\]\\]^]^]^_^^_`_`a`ababcbcbcbcdcdcdedefefefefefeffgfgffgffggfg fgfgfggffggfgfgfgffg fggfggfggffgfgfgfgffgfgfefefeffeededededcdcddcdcbcbcbaba`aa`aa`_^]^]^]\]\]\[\\[[\[Z[ZZ[ZYZYXYYXXYYXWXWXXWVWVWVUTSRQRQRQQPOPONONMNMLMLKJIHIIHIHGFGFGFEFEDEDCDCBCBCBCBABA@AA@A@?@??@?>?>=>=<;<;<;:9::9898767767676565454543434434323212121211010/0//0/./.-.--.-.-,-,-,-,++,,+,+*++*+*)*)*)*)()())()('('('(('('('('('((FGHGHGHIJIIJIJKJJKJJKLMLLMNMNONOPOOPOPOPQRQRSTSTSSTTTUTUVUVWVWVVWXWXWXYXXYZYZ[Z[\]\]^]^_^_`_`a`ababbabcbbcbbcdcddcdcdcdededededefefeffeefgfgfgfgfgfggfgfgfgfggffggfgfgfgfgfg fggfgfggffggfgfefe fefeeffeeffeedeedededed cdcddcddccdcbcbbcbcbabababa`_`_`_^_^]^^]^^]]]\]\]\[\\[[\[ZYZYYZYXYXWXXWXWVWVUVUTUTSRSRQRQPQPOPONONMNMMNMLMLKLLKJKJIHIHGFGFFGFGFEDEDCDCCBCBCCBABA@AA@@?@?>=<==<==<;:;:9:9899878767665654545434343343232321221121010/00/.-.-.- ,--,--,-,-,+,+,+*++*)*)*)()()('('('('(FGFGGHHGGHIHIJKLKLKLMLMLLMNMNONOPOPOPQPQRQRSRSSTSTTUTUVUVWVWXWXWXYXYZYZYZ[Z[[Z[\[\[\]\]\\]\]^]^_^^_^_`__`__`_``_`a`a`ababababcbcbbcbc dcdcdccdcdccdededeededefefeefefefefgfggffgfggfgfgffgfgfgfgfgfgfgfgfggfggffgfgfgfgfgfgfgffggfgffggfgfgfggfeffefeffefededcdccdcdc bccbcbbcbbcbabababa`a`_``_`_^_^_^]^]]\]\[\[Z[Z[ZYZZYYZYZYXYXYXWVWVUVUTUTSTTSTSRQRQRQQPOPOPOONOONNOONONMMNMNMNMLMLMMLMLKLLKJKJIJIHIIHGHGFGFEFFEDEDEDCDCCBABABA@A@?>?>?>?>= <==<=<<=<<;<;:;:9:9898788767767656545454323322321221010/0/./.-,-,,+,+*+*+*+*)*)*)*)*)()()('('('('(GFGHGHIHIJKJKJKLMLMLMNMMNOPOPQPQRQRRQRSTSTSTTUTUVUVWVWXWXYXYZYYZZYYZ[\[[\[[\\[\]\]^]^^]^]^_^_`_`_`a`a`abababcbcdcdcdcdcdeddedededefefefgffgfgfggfgfgfgfgfgfggfgfgfgfggfgfgfgfefefefefefedededededcdcbcbccbabbabbaba`a`_`_`_^]^]^]]\[\[Z[[ZYZYXYXWXWVWVUVUTUTSTSRSRQRQQRQQPQPOPONON MNNMNMLMLMLMLKJIHIHGHGFGFGFEFEDEDEDCCBABBA@A@?>?>=>=<==<;<<;<;:;:9:98989987876776767676566556654343432332121210/0/0/.//./..--.-.-,-,+,+,+,+*++*+*+*)*)()()(()()('('('('(GFGHGHIJIJKJKLKLMLMLMNONONONNOOPPOOPPOPQPQRQRQRSRSTSTTUVUVUVWVWXWXYXYZYZYZ[ZZ[Z[\[[\[\]\]^_^_^_`__`a`abababcbcbcdccdcdccdcdeddeedefeefeffeefefefgfggfgffgfgfgfgfgfgfgfgfgfgfgffgfefeffefeefedeeddeededcdcddcbcbccbcbaba`a`_`_`_ ^__^__^_^^_^]^]]\[Z[ZZ[ZYZZYZZYZYXYXWVWVUTSTSTTSRSRQPQPOPONONMNNMNMNMLMLKLKLKJIJIJIHGFGFEFEDEDEDCDCDCBA@?>?>>?>=>=>=<=<;<;<<;<;:;:9::9:9898788767656556545544554343432121121010/./.-.-.-,-,+,+,+*+*+**+*)*)*)())()('('('('('('FGHIHHIHIJIJIJJKJJKLKLMLMLMNMNMNONNOPOPQPQRQRSRRSTTUTTUVUUVUUVWXWXWXWXYXYZYZYYZ[Z[\[\[\]\]^]^_^_^_^_`__`_`_`a`abababcbcbcdededefefeefefefgfgfgfgffg fgfgfgfggfgfghgghghghghghgfgfggfgfgfgfgfgfeefefedeed edeeddeddedcbcbcbababbaaba`aa`a`_`_`_`_^_^]^]]\]\[\[Z[Z[ZYZYZYXYYXYYXWXWVWWVVWVUVUTUTSTSRQRQQPOPONONNONNONMNMNMNMLKJIJIHIHGHGFGFGFEFEDEEDCDCCDCBABAABA@?@??@?@?>?>=>=>=<=<;:;:9:9:98989878787676656566545432323212112210101010/0/0/0/./././..--..-.-,-,-,-,,+,,+,+*+*)**)*)()()(()('('('('('(GHGHIJIJKLKLMLMNMNONONOPQRQRQRSRSRSTSTTSSTUTUUTUVWVVWXWXYXYZYZYZ[\[\]\]^]^^]^_`_``a``a`ababaabababcbccbcdcdededefefefeffefgfgfgfgfggfgfgfghghghghgghghghhghghghgfgfggffgfgfggfgffefefeefededdeddedcddcdcbcbababa`aa`_`__`_^_^_^]^]^]^]\]\[\[ZYZYXYXXYXWVUVUVUTUTSTSTSRQQPQPQPONONMNNMLMLMLKLKLKJKJIJIJIHIHIHGHGFEFEDEDCDCDCBA@AA@?>??> =>=>>=<==<<=<;:;:9:989987887676656545454344344323212101010/0/./.-..-,-,+,+,+,+,+*++*++*+*)*)**)*)()()()('(('('('('(('('('('('(FGHGHIJKJKJKJLKLKLKLMLLMLMNMNOPOPQPQPQRQRSTUTUVUVVUVWVWVWXWXYXYZYZYZ[Z[\[\\[[\[\]^]^_^^_^_`_``a`ababcbcbccbcbccdcdcdcdededdedededefefefeefgfgfgfgfgfghghgghghghghghghghghgghgfgfgffgf feffeeffeffedededdededcdcdcbcbcbcbababa`a`_`_^__^_^]^]^^^]\]\\]]\][\[\[Z[Z[Z[[ZYZZYZZYXYYXWXWVUVUTUTSTSRSRSRQRQQPOPOPONONMNNMLMLKLKJKJKJJIJIJIHGHGFGGFEFFEDEDCDCBCBABA@A@A@?@?>=>=<;<;;<;:;;:98989878767656545445434323233212121121011010/0/././.-.-..-,,+*+**+**+*+*)**))*)()())()('('('('('(GHGHIHIHIJIJKJKJKL MLLMMLLMMNMNONONOPOPOPQPQRQRQQRSTSSTUTTUVUVUVVWVWWVVWXYXXYXYZYZ[Z[\]\]\]]\]^]^_^__^_`_`__`_```a`ababaabcbcbcdcdededefeefeffgfgfgfgfgfgfgfghghghghghghghghghhghghghghghgh ghgghgghghgfggfgfgfgfefefedededcdcdcbcbabababa`aa`a`a`_`_`^_^__^__^]^]]\]]\[\[Z[[Z[Z[Z[ZYZYYZYXYXYYXWXWXWVWWVUVUTUTSTSTSRSRQRQRQPQPOPOPONMNMMNMLMMLMLKLKJKJKJIH GHGHGGFFGFGFEFEFEDEEDDEEDCBCBBCBABA@A@?@@??@@?>=>=<=<;<;:9:9898787676767676565654554545543432321210/0/.//.-.-.-..-,-,,--,+,+,+,++*+*)*))*)()()('('('(GHGGHIHIHIJJIIJKLKLMLLMNMNONNOPOPQRSRSTSTSTUTUTUVUVWVWVWXWXYXYYXYZYZ[Z[\[\]\]^]]^]^_^_`_``__``a`a`abababcbccbcdcdcdccdcdeddeddededefefefgfgffgfgfgghghghghghghgghghghghghghghghghghghgfgfgfgfgffefefefefedededcdcdcbcbabaabababa`a`a`_`_^_^]]^]\[Z[ZYZYXYYXYYXWXWVWWVUVVUTUTUTSTSTSRSSRSQRRQQRQQQPQPQPOPONONMLMLKLLKLKJKJKJIJIHIHHIIHGHGHGFEFEDEDCDCDCBCBBCBABA@?@?@?>?>=<=<;<<;:;:9:9:99898987676765665454543443343212212101010/0/.//./../.-.-,-,-,,-,+,+,,+*)*)*)()())()('(('('(GHGHIHIJIJKJKJKLKL MLMMLMMNMMNONNOPOPQPQPQRQRSRSRSTSTSTUTUVUVUVUVWVWXWXYXYXXYZYZ[\[\[\]\\]\]^]^]^_^^_^__^_`_``__``a`a`ababababcbbcbcdcdcdedededefeffefefgfgfgfgfgg hghhghgghgghghghhgghghgghghghghghgghghghghgfgffggfggffgffgfgffeffeffefefedededcdcdcbcbcbccbabaabba`a`a`_^__^]^]^]\]\[Z[ZYZYX YXXWXWXWWXWWXWVWVUTUTSTSTSRSSRSRQRQPQPQPOPOPPONMNMNMLMMLKLKJKJIJJIJIHIHHIHGHGFGFEFEFEFEDEDEEDCCDCBCBABAA@A@A@@?@?@?>?>??>=>>=<;<<;:;:;:;:9:9899878766545434323232121010/0/./.-.-,-,-,-,,+,+,+*+*++*)*))**)*)()('GHGGHGHIHHIHIJIJKLKLMLMNMNONOPOPOPQPQPQPQRQRSRRSTSTUVWVWXWXYXXYZYZYZ[Z[\[\]\]\\]^]^^]^]^_^_`_`_`a`a`abababcbcbbccbcdccdcdcdededeeddedefefefefgffggfgfgffgg hghghgghghgghghghghghghghghghghgfgfgfgffeffeeffefededcdccdccdcbcbcbabaabba`a`_`_`_`_^_^]]^]\]\]\[\[\[Z[ZYZYXYXWXWVWVWVUVUTUUTSRSRSRQRRQQRQPQPOPPOPONONMLMLKLKJKKJKJIJIHIHGHGFGFEDCDCDCDCDCB ABAABAA@A@A@?@?>=>>=>>=<;: ;:;;:9::9:9:9898787765454343232121011010/0/00//././/.-.-,,+,+*+*+*)*)*))*)())()())('('('(('((''('(('(('('(GHGHIHIJKJKJJKJKLKKLMNMMNOPOPQPPQRQRSTSTUTUVUVWVWXYXYZ[Z[\[[\[\]\\]^]^]^]^_^^_`_`a`ababcbcbcdcdedededefefefeffeefeefgfgfgfgfgghghgghgghghghghghhghghghghghghgghghghgfgfgffgfefefefededeededdcdcdc bcbbccbcbbcbabababa`a`a`aa`_`_^_^^_^]^]^]\]]\[\[\[\\[Z[ZYZYZYXYYXWVWVUVUTUTUUTSTTSSTSRSRQQ PQPPQPPOPPOPONONONMNMLMLKJKJIJIHIHIHGHGHGFEFEDEDCDCDCBCCBABA@A@?@?@?>??>=<=<=<;<;:;;:9:9898788787676565 6545454545545434323232121010/0//0/.-..-,-,,-,,+,,+,+,,+*+*+*+*+*)*) ()()())())()('('('('('('('('(GHIHIJIJKJKLMLLMLMNMNNONOONOPOOPOPOPQRQQRSTSTSSTUTTUVUVWVWVWXWXWXYXYZYZYZ[ZZ[\]\]^]^_`_`a`a`a`abaababcbcbcbcdcdccdedededefefeffefgfgfgffghghghghghghhghghghghghghghghghhghghghghgghgghgfgfg fgffggffgffgfefefedededededcdcdcdcbcba`a``a`a`_`_`_`_^]^^]]^^]]^]\]\[Z[[ZZ[ZYZYYZZYXYXYXWXWWXWVWVUVUTUUTUTSTSRSSRSSRQPQPONMNMLMMLMLMLKLKJKJIJIIJIHGHHGHGFGFEFFEFEDDCBABBA@?@@?>=>>=<=<=<;<;:9::9898787676765654545434323212101010//00/0/./../.-.-.-.-,-,--,-,,+,+,+*+*)*)*)()()(())('(HGHIHIHIJIJKLKLMLLMNONOPOPOPQPQRQRSRSTUTUVUVWXYZYZ[Z[[Z[\[\[\]\]]\]\]^]^]^_^_^^_`_``__``_``aa`a`aa`abababcbcbcbcdccdcdcdedefefefefefgfgfggfghgghghhghghgghghghghghghghghghhghghg fggffgfgfgffggfgfefeefeffefedededcdcdcdcbcbababa`a`a``_`_^_^_^_^_^^]\]]\]\]\[\[Z[ZYZYZYZYXYXWXWXWVWVWVUVUVUTUTSTTSTSRSRQRQQRQPOPOPONONMNMLMLKLKJIJIHIHGFGFEFEDEDCDCBCBABA@?@?@@?>?>?>=>=<;<;:;:;:9:98998788787667665665455455434432323212121010/././.-.-.-,-,--,-,,+*+*+*+*)*)*)())()('('('('(GHGHGHIHI JIJJIJJKJKJKJKLKLMLMMLMNMMNMNONOPOOPQPQRQRRQRSTSTSTUTUVUVWVWXYXXYYXXYZYZYZ[\[\[[\] ^]^^]^^__^^_^^_`_`_`a`abababcbcdeddedefefgfgffghgghghhghghghihihghghghghghghgghhgfggffggffgfefeeffedededcdccdcbcbababa`a`_^_^^]^]^]\]\\]\]\[\[\[Z[[ZZ[ZYZZYXYXWXWVWVUVUTUUTTSSTSRSRSRRQPQPONONMLKLKKLKJIHIHGHGFEFEDCCDCBCBABA@?@?@?>?>?>=>>=<==<=<=<;<;:;:9:9::989878787667656543432321212101010/./.-..-,-,-,-,,,+,+,+*+**+*+*)*)*)()())()('(('('('('(GHGHGGHIHIJKJKLMLMNMNONONOPOOPPOPQPQRQRQRSRSTSTUUVUVUVWVWXWXYXYZ[ZZ[ZZ[Z[\[[\]\]]\]^]^]^]]^^_^_^_`_`a`aa``a`abcbcbcdcddcdededefefefgffggfgfgfghghhghghihihihihihghghghghghghghghghhg fggfgffgfgfgfefefeefeefededcdcdcdccdcbcbcbcbababaa`a`a`_``_^^]^]^]\]\[\[\\[\[Z[ZYZZYXYXYXWVUVVUTSTSRSRQPOPPONOONOONMLMLKLLKJIHIHGHGFGGFGFEDDCBABBA @A@@AA@A@@?@?@?>=>=<==<=<;<;:;:9::989987765654554344323233212101010/0/././.-,-,--,,+,++,+*+*+*)*)*)()()(()('('(('(GHIJIIJKJKLKLMNMNMNONNOPOPQPQRQRQRSRRSTUTTUUVUUVUUVWXWXWXYXYZYZZYZ[\[\]\]\]^]^_^^_`__`_`a`abcbcbcbbcdcdcd eddeddededdedefefeefgfgfgfghghghghghghhghihhihhihihihihihhiihihihihghghghgfggfgfgfgfefededededcdcdcbcbccbcbaba`a`_`_^_^^]^^]\]\]\[\\[Z[ZYZYXYYXYYXWXWXWVWVUVUTUTUTSTSRQRQPQPO POOPOONONOONONMNMLKLKLKJKJIJIJJIIJIHHIHHIHGFGFGFEDEDCCDCCDCBCBABA@AA@AA@A@?@?>?>?>=>=>=<;<;:;:;:9:9:9:98989878787677656545434343232233212101010/0/0/.-.-,-,--,,+,+*+*)*)*)*)()()('('('('(GHIJIJKJKKLLKKLKLLMLMNMNOPOPQRQRQRSRSRSTSTTSSTUTUUTUUUVWVWXWXYZYZYZ[\[\]^]^_^_`_`_`aabababbaabcbcdcdcdedeedefefefefgffggfgfghghghghghghihihihihihihihihihihihihihiihihihihghghghhghghghgfgfgfgfeffefefedededcdcbcbcba`a`_``_^_^^]^]^]\]\[\[[\[\[Z[ZYXYXWXWWXXWVWWVUVUTSTSTSSTSRRQRQQRQPQPQPOPONOONNONMNNMLMLMMLKLKJKJIJIHIIHGHGFGGFEDDCDCBABA@A@A@?>?>??>=>=>=<;<;:;:9::98998787677656545454343432323223212112210101001010/0/0//0/./.-.-.-.--,--,-,--,,+,+,+*+*+*)*)()()()('('('('('(GHIHIJKJKJJKLKLKLMLLMNMNMNOPQPQPQRQRSTSTTUTUUVUVVUVWVWXWXYXYZYZYZYZ[Z[\[[\]\]\]^]^_^_^__^_`aababcbcbcbcdcdcdcdededefefefefgfgffgfgfgfghghghghghhihihhiihhihihihhihiihhihihihihihghghhghghghhggfgfefefedededcdcddcbcbaba`aa`_`_`_^_^_^]\[\[\[Z[ZYZYYZYXW XWXWWXWVWWVWVUVUVUVUTUUTSTSTSSTSRQRQRQPQPOPOOPONONONMNMLMLKLKLKJKJKJIJIJIHIHIHGHGFGFGFEFEDCDCDCBABBA@A@?@@?@?>?>?>=>=<=<<=<;<;:;::;:9:9898787676565565454343232121010/0/0/././/.-.-.-,-,,+,+,+*+*+*)*)*)**)()()('('('('('(GHIJIJIJKLKLMLMNMNONONOOPOPQPQQPQRSTUTTUUVUVUVVWVWWVVWXYXXYXYZYZ[ZZ[Z[\]\\]\]\]^_^_`a`aababcbcdcdcddcdedeedefefefgffgfggfgfgfghghgghghghghghhihihihihihihihihihihihiihihihihhihihihihghghghghghgfgfgfgffgfefefefefedeedededcdcbcbabababaa`a`a`aa`_``__`_^_^_^]^]^]\]\[\[\[[\[Z[ZYZYZYXWXWV UVUUVUUTUUTUTSRSRSRRQQRQQRQPQPOPONONMNMLMLMMLKLKLLKJKJKJIJIHIHIHGHGHGFGFFGFEDDCDCBCBA@AA@?@?>?>=>=<=<;:9:9:9898787878767767656565454544543432323212121010/0/00//0/.//.-.-,-,-,+,+*++*+*+*)*)()()()()(()('('('('('('('(GHGHGHIHIJIJKLKKLMLLMNMNONOPOPOPQRSRSRSTSTUTUTUUUVUVWVWVWXWXYXYYXYZ[Z[[ZZ[\]^]^]^^]^_^_`a`aababaabcbbccbcbcdcdccdededdefefefefgfgfghghgghghghghhihihihihhihihiihi hihiihiihhihihihihihihihihihghghghghggfgfgfgfeffeefefedededcdcbcbababa`a`a`aa`_`__`_^]^]^]\]\[\\[\[Z[ZYXYXWXWVWVVUVUVUVUTUTSTTSRSRQRQRRQPQQPOPOPONMNMLKLKJKJIJIHIHIHIHHGGHGFEFEFEDEDDEEDCDCCDCBCBABAA@AA@?@?>?>>??>=>=>==<=<;:;;:;;:9:987878767765454344343232321210/00/0/./.-.-.-,-,,+,+,+,+*++**+*)*)*)**)*)())())()()('(('('('('(GHHGHIJIIJKJKJKLKLKLMLLMLMNMNMNOPOPQPQPQQRRQRSTSTSTUTTUUVUVUVWVWXWXYXYXXYZYZ[Z[\[\[\]\]^]]^]^_^_^^_^_`__`_`a`aababcbcdcdcdefefefgfgfgfghghghgh hihhihihhihhihihihihhihihihihihihihihhihihghgggfg fggffggffggfgfefefedcdcbccbbcbbcbababa`a`a`_`__`_`_^__^_^]\]\\]\[\[ZYZYZYXYXWXWXWXWWVVWVWVUTUUTUUTSRSRQRQPOPPOOPONONNONMNMLMLKLKJIHIHIIHIHGHGFGFEFEEDEDEDDCDCBCBABBABAA@A@A@??@?@?>?>=<=<<;<;<;<;:;:9::989878767676565455434323212122101010/0/././.-..-.-,--,-,-,,+,+*+*+*)*)*)()()()(()('('('('((GHIJKLKLLKLLMMLMNOPOPQPQRQQRSRRSTSTUUVWVWXWXYXXYZYZYZ[\[\\[\]\]\]^]^_^^_`_`_`_`_`a`aa`ababababcdcdcdededefefefefeffgfgfgfgfghghghgghghh ihihihhihihhihihihihihihihihihiihihghgghghghgfgfggfeffefedeeddeddedcddcdcbccbababa`a`_`_^^]^]\[\[Z[Z[[ZYZZYZYXYXXYXWXWXWVUVUTUTUTUTSRSRQRQRQPQPQQPONONMLMLKLKLKJIJIHIIHGHGFGFEFEFFEDDCDCBCCBABA@A@?@?>=<;<;:9:9898787677656545434343212121010/0/0/././.-..--.-,-,-,,+,+*+*+*+**+*+*)*)*)**)()()('('('('('('HIHIJIJKJKLMLMNMNOPOPQPPQPQRQRSTUTUUVUVWVWXYXYZ[Z[Z[\[\[[\]^]^_^^_`_`a`a``ababaabbabcdcdccdededefefgfgffgffghghghghhgghihhhihhihihihihiihihihihihihihihhiihihghghghghgfgfefefefedeedededcdcdcddcbababbaba`a``a`a`_`_``_`_^_^ _^^]^^]^]]^]\]\[\\[[\\[Z[Z[ZYZYZYXYYXWVWVWVUVUTSTTSRSRRQRQRRQPQQPQPOPOPONONOONMNMLMLLMLKLKKLKJKJIJJIIJIHGHGFGFEFEFEDEDCDCBCBABABA@A@?@@?>?>?>=>=<=<;<<;:;:9:98998987887677676545455434323321010/0/00/0/././.-.-,-,-,,-,-,+,+,+*+*++*)*)*)*)*)()()('('('('('HGHGHIHIHIJIJKLMLLMNOPOP QPQQPQQRQQRSRSTSSTUTUUVUVWVWVWXWXWXYXYZYZYYZ[Z[\[[\]^]^]^_^_^_`__`a`a`aababcdccdccdeddedeedefeffefgfgfgfgfgfghgghgghghghghihihihihihiihihihihihiihiihihihih ghhgghgghgghghghgfgfgfgfefefedeededcddcbcbcbababa`a`_`_`_`_^_^^_^]^^]\[\[\\[Z[ZYZYXYXWXWVWVUVUTSTSRSRRQRQPQQPOPONOONOONMNMLKLKJIHIHGFGFEFEDDCBCBCBABAABA@AA@@A@?@?>??>=>=>=<=<;:;;:;:9:989878787767676565654544545432 3221221121121010/0/./.-.-.-.-,-,-,,+,+ *++*+*++**+*)*)*)**)()('('(('(('('('((GHIHIJIJKLKLLKLMLLMLMNMNNMMNONOPOPQPQRQRSRSTSTUTUUTUVUVWVWXYZYZZYYZ[Z[\[\]\]]\]^]^^]]^_^_`a`a`abab ababcbcbbccbcdcdcddcdededefefef gffgfggfggfghgghghghihihihhihihihihijijiijijijihihihihihiihhiihiihhihghghghhghgfgfgfgfefededededcdcbcbccbababa`a`_`_^_^_^]^]\]\[\\[ZYZYXYXWXWVWWVUTSRSRQRQPOPONONONM LMMLMMLLKLKJKKJIJIHGFEFEDEDEEDDEDCDCDDCBCCBA@A@A@?@@??@?@?>=<;<;<;:;;:;::9::9898787877676566545543443432321212101010/0/.-.-.-,-,-,,+,+*++*+* +*)*)**)**)*)()('('('('('(H GHHIHHIHIHIJIIJIJKLMLMNMNOPOPQPQRQRSRSSRSTSTUTUUTUUVWVWXYXXYYXYZYZ[\[\[[\]^]^]^_^__^_`_`_`a`a`aa`abaababcbbcdcdccdeddedededefefefefgfghghghghihihiihhihijijijijijijijihihihihghghghghgfgfgfefefedeedeedcdcbcbcbaba`a`_``_^_^^__^]^^]]^]\[Z[ZYZYXYYXWXWVUTUTUTSTTSRSRSRQRQPQQPOPONMNMLMLKLLKJIJIHGHGFGFEFEDEDCDDCBCBBCBABAABA@A@?@?@?>=>=>=<;<<;<;;:;:;;:9:9898987887676565665454543432321211210/0/0/././../.-.--.-,-,,+,+*+*++*+*)**)*)()()(('('('('('('(HGHIHIJIJIJIJIJKLMLMNMNOPOPOPQPQRQQRSRSTSTUVUUVVUVWVWXWXYXYZ[Z[Z[[Z[\[[\]\]^]^]^_^_`a`aa`abaababcbcbcdcdeddededdedefefgfgfgfghghghihihihhiihijijijijijijijihiihihiihihihghghghgghgghgfgffgffgfefefeeffededcdcbcbcbabbabbaba`aa`aa`_``_`__^]^]]^]\]]\]\[\[ZYZYXYYXWVWVUVU TUUTUTUTTSTTSRSRSRQRQPQQPOPPONONMNMLKLKKJKJIJIHIIHGHGHGFEFEDEEDEDC DCDCDCCBCCBCBABABA@?@?>=>==>=<=<=<;:;;:9::98776765654544334343432323232121010010/0/./.-.-.-,-,,-,,+,,+*+*++*)*)())()()('('('('((HGHIJIIJKJKKJKLKLMNONOPOPQPQQPPQRQQRSRRSTSTUTTUVUUVWXWXWXYXYYXYZYZ[Z[\]\]^]^_^^_^_`_`_`a`a`aa``abababcbcbcdcdefeefefefgfgfgfghgghgghhghihihihihhihihijiijiijijijijiijjijijijijijijijijihihihihghhghghgfggfgffgfefeffededeedcdcdcbcbababa`a`_`__^]^]]^]\]\]\[\[Z[ZYZZYXYXYXWXWVWVUVUTUTUTSRSSRRQRQPQPQPQPONONMNMLMLKJKJIJIHGFGFEFEDEDDCDDCBCBA@A@?@?@?>?>?>>?>=>=<=<;<;<;:;:;:;:9:9:9898899878776766765665455434343232321210/0//0/.-.--.-,-,-,,,+,+,+,,+,+*+*+*+*+*)*)*)**)()()('('(('('('('('('(GHIHIJIJIJKJKLKLKLMLLMNOPOPQPQRQRQRSRSTSTUTUUTUVUVVVWVVWXWXYZYZYZ[Z[\]\\]^]^_^_`_`aabcb cbcbcbcdcddcdedefefgfghghghghihihihihijijijijijijijijijijijijijjijijiijijijijijihihiihhihihihihhghgfggfefedeeddededcdcbcbcbababaaba`a`_`__^_^]^]\]\]\[\[[Z[ZYZYXYXWXWVWVUVUTUUTSTSTTSSTSRSRRSRRQRQPQPOPOOPONONONMLKJKJKKJIHIHGHGFGFEFEDEDDDCDCCDCCBCBBCBABABA@A@?@@?>?>?>=>=<=<;<<;<;:;;::;:9:98987887877656565454323321221121010/./.-.-.-,-,--,,+,+,,+*+**+*)*)()()()()('('(('('('('(HIHIJKJKLMLMNOPOPQPQPQPQRQRSTSTTUTUVUVUUVWVWVWXWXYXYZYZYZ[Z[Z[\[[\]\]^]^_^_^_`_`a`abbcbcbcdccdcddedededefefefeefefgffgfgfgfgfghghghihihihihijijiijjiijijijiijijijijijijihihihiihhihghh ghgghgghgghgghgfgfgfgfefedeededcdcdcbccbcbababbaba`a`a`_`__`__^_^_^]^]^]^^] \]]\]]\\]\\[\[\\[ZYZYXWVWVUVUVUTUTSTTSRSRSSRQRQPQQPQQPOPOONONONMNMLMLLMMLKLKLKJKJIJIHIHGFEFEDEDDCDCBCCBABA@A@A@A@?>?>=>=<=<;<;;<;:;:98987878777676565454343 232323221212210110010/00/0/0/././.-.--.-.-,--,-,,-,,+*+*+*+*)*)*))*)*)()()()('('('('('(HIJKLKLMNMNOPOPQPQQPQRSTSTUTTUUTUVUV VUVVWVWWVVWXYXXYXYZYZ[ZZ[\[\]\\]\]]\]^]]^]^_^^__^_`a``abababbcbcbbcbcbcdcdcdefefefgfgfgfghghghgghghihihihihihiihiihihiijijijijijijijijjijijijjijijijijihihihihghghghghgfgfgffgfeffededededcddcdcbcbababba`a`_`__^_^]^^]\]\\]\[\[Z[Z[ZYZZYZYZZYXYXWXWWXWVWVWVUVUUVUT STSTTSTSSRSRRSRQPQPOPONONMNMLMLKLKJKJIJJIJIIHIHIHGHGFEFEDEDCDCBCBABA@A@?@@?>?>=>=<=<;<;;:;:;:9:9898989878778776767765665454454344323233232122121010/0//00/./././.-.-,-,,-,,+,,+,+*+*+*+*)*)*)()()('('('(('(HIHIJIJKJKLM LMMLMLMMNMNMNOPOPOPQPPQPQRQQRSRRSRSTSTUTUTUVUVVWVWVWWVWXWXYXYYXYZ[Z[[ZZ[\]^]^]^_^_^_`_`_`a`abababbcbcdcdcdededeededefefgfgfghghgghggh ihhiihhiihihihiijijijiijijijjijijijijijijijiijijijijijiji hiihihihhiihihhghghghhgfggffgfefefededdedcdccdcbcba`a`__^_^]^]\]\[\\[\[ZYZYXYYXWXWVWVUVUTUUTTUTSTSRRQPOPPONONONMNMNMNMLKLKJKJIJIHIHIIHIHGFGFEFEEFFEDEDDDCDDCBCBA@AA@?@??@@?>?>>?>=>=>=<;<;:;:9898987877767654545434323323212121010/0/.//../.-.-,-,,+,+,++*++**+**++*+*)*)()()()('('(''('(HIHIJIIJJIJKLKKLKLMLLMLMLMNMNONOPOPQPQPQRQQRSTSTUTTUTUUVUVUVVVWVWVWXWXYXYXXYZ[Z[\[\[\]\]^]]^_^__^_`_`_`a``a`abababbcbcbbcbcbcdccdcdccdededefefefefefgfgfghghihihihijijijijjijijiijijijij ijijjiijijiijijiijiiji hihhiihihihihhghhghghgfggfgffgfe feffefefeffededcdccdccdcbcbababbabbaa`aa`a`_`_`_^]^]\]\[\[Z[Z[ZYZYXYXWXWVWVUVUTUTUTTUTSTSSRQPQPOPONOONMNMNMLMLKLKJKJ IJIIJJIIHIHGHGFGFEFEDEDDEDCDDCBCCBCBABA@A@A@?@?>=>==<=<=<=<;<;:;;:9:989878776765434434343232321212101010/0/0/.-..--.-,,-,+,+,++,,+*+*+*+*)*)*)()('('('('('(HIHI JIJJIJIJKJKJKLKLMNONOPOPQPQRQRSTSTSTUVVWVWXWXYXXYZYZYZ[\[\]\]\]^]^_^_^__^_`_`_`_`ababababbbcbcdccddcdeddededefefeffeefeffgfgfgfgfghghghghihihi jijijiijijiijijijijjijijijijijijijjijiijihih ihiihhihhiihhghghghgfggfgffgffgfefefedeededcdcbcbcbabbabba`a`_``__``_`_^_^^_^]^]\]\[Z[ZYZYZYXYXWXWWVVWVUVUVUVUTSTSRSRSRSRQPQPOOPONMLMLMMLKLKJKJIHGHGFEDEDCBCBABABA@AA@@A@A@?@?>?>=>=<=<;:;:9:9898787877766767656545434343232121010/0//00/././../.-.-.-,-,+,++,+*+*+* )*)*))*))*)()())())('('('('('('(HIHIHIJIJIJKJKLMLMMLMNONOPOPQPQRQRSRSTSTUTUVUVWVWXYXYZ[Z[Z[\[\[[\]^_^_`a``a`a`ababbcbcdcdedefefefefghghghghihihiijiijjijijijijjijijijijjijijjihihihhhghghghhgfgfgfefeeffedeeddedcdcdcdcbcbababa`a``a``a`_``___^_^_^_^]^]\]\]\[\\[ZYXYXWXWXWVWWVUVUTSTTSRSRQRQPQPONMLMLMLKLKJKJIJIHIHGHGFGFGFEFEFEDEDDEDCBCBABA@?@?>?>=>=<=<;<;:;:9::9:9899878878787776765656545434344323212101010/0/00/0/././../.-.-.-.-,-,,+,+,+*+*++*)**)*)()('('('('('(('('(('('(HIHIHHIJIJJIJKJJKLKLMLMNONOPQPQQPQRQRSRSTUTUVUVVWVWVVWXWXWXYXYZYZYYZ[Z[\[\]\]^]]^^]^_^__^_^_`_`a`ababbcbbcbcdcdcdcdededdefefefgfgfgfgfghghghihhihhihihihhijijiijijijijkjjkkjkjjkjiji jijiijjiijjihiihihihihihhihghhgghghgfgfgfgfefeffededcdccdcbcbcba`a`aa``aa`__`_^]^^]^]^^]\]\\]]\[\[\[Z[[ZYZYXYXYXWXWVUVUVUTUT STTSTSSRSRRQRQPQPOPPONONMLKJIJJIHGHHGGHGFGFEFEEDEDDCDCBCBABBAABA@A@?@@?>?>?>=>=<;<;:;:9:98989878878877676565454343212101010/0/././/.-.-.-,-,--,,,-,+,,+,+*+*+*)*)*)*)*)())())())()(HIJIJKLMNMNMNOPQPQPQPQRSRSTSTUTUTTUVUVVWVWXWXWXYZYZZYYZ[Z[\[\]\]]\]^]^^]]^_^_`_`a``a`aa`ababbcbcbcbcdccdcdedefefgfgfghghgghghihhihihhihijijijijijijkj kjjkjjkjkjkjjkjkjkjkjkjijijjiijijjijihihihghhghghgfgfgffgfefededcdcdcbccbaba`aa`_``_`_^]^]^]\]\]\[Z[[ZYXYXWXWXXWVWVUVUVUTSTSSRSSRSRSRQQRQRQPQQPQPOPPONONMNMLKLKLKJIJJIHIHGHGFGFGGFEFFEEFEEDCDDCCDDCBA@A@A@?@@?>?>=<=<=<;<<;<;;:;;:9:989898787767654543432321210110/0//0/.//./.-.-.-,,-,+*+*+*)*)*)()()('('('((HIHIJIJIJKLKLMNONOPOPPOPQRSRRSRRSTUTUUTUVVWVWWVWXWXYXYXYZYZYZ[\[\[[\]^]^_`a`a`abababcbcbcdccdedefeefefgfgfghghghihihijijjijjijijkjkjkjkjkjkjkkjjkjkjkjijijijijihihihiihghghgfgfgfefedededcddcdccbbcbcbababa`a`a`_`_`_^__^_^_^]^^]\]\]\[\[Z[ZYXYXWXWXXWWVVWVUVUVVUTSRRSSRQRRQRQPQPQPONMLKLKJKKJIHIHIHGFEFFEEDEEDCDCCDCBCBBCCBA@?>??>=<=<<;<;<<;:;:9:989987877656566545454343232233212210/0/00/0/./.././.-.-..-.-,--,--,,+,,+,+,+,,+*+*+*)**)()()('('('('('('(('HIHIJIJIJKJJKJJKLMLMLMNMMNNMNOPOPQPQRQRQRQRSTSTSTSTUVUVUVWVWVWXWXYXYZ[Z[Z[\[[\]\]^]^^]^_`__`a`a`ababbcbcdcdedefefgfgfghghghhghihihiihihijijjijijijijijkjkjkjkjkjkjkjijijijjijiijihiihiiihihghgfggfgffgfefefeefededcdcbcbbcbaba`aa``_^_^^_^]\]]\]\[\[\[\[Z[Z[ZYZYZYXYXXYXYXWVWVUTSTTSSRSRQRQRRQPQPOPOPONMNMNMLKJKJIJIHIHIHGFGGFFGFEFEFEEDEEDCDDCBCBABA@A@?>?>>?>=>=>=<;<<;:;;:98787877767676565654543232121010/0/./.-.-.-.-.-,--,,-,+,++,+*++**+*+*)*)()()('('('(('('('(('(HIHIJIJJIJKJKLKLMLLMNONOPOPQPPQRQRSRSTSTSTUTTUVVWXWXXWWXWXYXYZYZ[Z[\]\\]\]^_^^_^^_`_`_` _``a``a`a`a`ababcbcdcdccdedede feefefeefefgfgfghghgghihihijijijijijkjjkjkjkjkjjkjkjk jkjjkjjkjkjkjkjkkjkkjkjkjkjjkjijijijihiihiihhihhihghghgfgfgfgfefeffe deeddeeddcdcddcbcbababa`a`__`_`_^_^_^^]^]^]\]]\]]\[\\[Z[ZYZYXYXWXWXWXWVWVUVUVUTSTSTSRSSRRSRQRQRQPONMNMLMLKLKJKJKJIHIHGHGFGFEDEEDCDCBABA@A @A@@?@?@@?@?>?>=>=<=<=<;<;<;<;:;:;:9:99::98987878877676566545434334323232121010/0/0//0/././/.-.-,-,-,-,+,+,+,+*+**++*+**)*)*))*)()())()('('('(HI JIJIIJJKJJKJKLKKLMLLMLMNONOPOPQPQRQRSRSTSTSTUTUTUVUVWVVWXWXYZYZYZ[Z[\]\]^]^]^_^_^_`a`ababcbcbbcbcdcddcdeddedefefgfgfghghgghghhghhihihihhijiijijijijkjkjkjkjkjkjkkjkjkjkjkjkjkjkjkjkjijijijijiijiihihhihghghgfgfgfefedcdcdcbcbaba`a``_^_^^_^_^]^]^]]\\]\[Z[ZYZYXWXWVUTUTSSRSRQRRQPQPQPOPOPONMNMLMMLLMLKJKJKJIJJIJIIHIIHHIHGHGFGFEFEDEDCDDCBCBCBABA@AA@?@?>?>?> =>==>==<==<=<;<<;;<;:;:9:98989878776767656545454543434432323212121010/0/ ./../././/..-.-.-,--,-,+,+, +,,+,+*++**+*)*)*)()())(()('('('('('(IHIHIJIJKJKJKLKKLMLMNOPOP QPQPQPPQQRQRQRSTSTUVUUVUVUVWVWXWXYXYZYZYZYZ[Z[Z[\[[\]\]^]^_^_`a`abababccdcdcdedededefefefgfgfgfghghghgghihihhiihiihijijijijijjkjjkkjjkjkjkjkjkjkjkjjkjkjkjkj ijjiijjijjiihhihhihihghghgfggfgfeffedededcdcddcbcbababa`a``_`_^_^]^^]^^]\[Z[ZZ[ZYZYXYXWXWVWVUVUTSTSTSSRRSRQRRQPQPOPONOONONMNMNMLKLKLLKKLKJKJIJJIHIHGHGHGFGFGFEFEDEDCDDCCDCBABBA@?@@?>?>?>=>=<=<<=<;:9:989898787876765665565454543434323232101010/0/././.-.-.-.-,--,-,,-,+*++**++*)*)*)*)()()('('(HIHIJIJKJKJKLKKLMLMNMNONOPOPQPQRQRSTSTTSTUTTUVUVWVVWXWXYXXYXYZYZ[ZZ[\[\]\\]\]]\]^]]^_^_`_`a`ababcbccbcdcdcdedefeffefgfgfgfghgghihihijijijijjijjijijijijkjkjkjkjkjkjkjkkjkjkjkjkjkjjkjijijijiihhiihihihghhghghgfgfefefefedededcdcdcdcbababa``_`_^_^_^_^^_^]\]\[\\[\\[Z[[ZYXYXWXWXWVUVVUTUTSTSTSSRQRQQRQPQQPQPOPONONMLKLKJKJKJIJIHIIHGFGFGFEFEDEDEDDCDCBCBABABABA@?@?>=>=<=<<;<;<;:;:9:9:9:98988987876765654554343232121210/0/./.-.-.-,,+,+,,+,+*++**+**+*)**)**)**)*)()()('('('('(IHIJIJKJKLMLMNMNOPQPQPQPQRQRSRSTSSTUTUTTUVUVWVWVVWVWXWXYXYYXYZ[Z[[ZZ[\]^] ^]^_^^__^_^_`_`_`a``a`abababcbcbcdcdcdeddefeefefgfgfghghihihijiijijjiijijijkkjkjkjjkjkjkkjkjkjkjkjkjkjjkjk jkkjkjjkkjkjkjkjkjijijijijiihihihghgfgfefefededededcdcdccdcbcbcbaba`a``_^__^_^]^]\]\[\[\[Z[ZZYZYXYXWXWXWVWVUVUVUTUTSTSSRSRQPQPOPPOPONONONONMNMLMLLMLKLKJIJIHIHGFGGFEFEDEEDCDCDCDCBCBABBA@A@?@??@?>?>?>=<=<;:9:9:989878787676565654545434334323212101010/00/./.-.-.-.-,-,,+,+*+*+*+*+*)*)*)**)()()('('('('( '(('('(('('('HIIHIJIJIJKLKKLMLMNMNNONOPOPQPPQRQRQRSTSTSTTSTUTUVUVVUVWVWXWXYXXYZYZ[Z[\[\[\]\]^]^_^_`_`a``a``ababcbbcbcbcdccdededefefgfgfghghhghghihihihihihijijijijjkjkkjjkjkjjkjkjkjkkjkjkjjkkjkjkjjkjijjijjijijiihihihihghghgfgfgfggfgfefeffedeededcdcdcbccbcbbcbbabaababaaba`a`a``_`_^_^]^]\ ]\]\]\\[\\[[\[Z[Z[ZYXYXWXWXWVWVUVVUTUTSTSTTSRQRQRQPQQPOPOONONON MNNMNMLMLMLLMLKLKLKJKJIJIHIHGFGFEFEFEEDEEDCDCDCBABA@A@?>?>=>=>=<;<<;:;:9:98987767676765654 544545443443432321212101010/0/././.-.-,-,-,,,--,+,+,++,+*++**+*)*)*)*))*)()()(())('('('('HIJIJKJKJKLMLMNMNNMNOPQPQQRQRSRSTSSTUVWVWXWXYXXYZYZYZ[\[\]\]\]^]^_^_^__^_`_`_`_`abaabababcbccbcdcdefefgfgfgfghghghghihihijijjijijkjkjkjkjkjkjkjkjkjkjkkjkjijiijjijiihiihihghgghgfgfefef efeeddeedeedcdcbccbaba`a``__`_^_^^_^]^]\]\[\[\[Z[Z[Z[ZYZYXYYXWXWXWVUVVUUVUTUTSTSSRSRQPQPOPONOONONMLMLKLKJKJIJIHIIHGFGFEFEEDCDCBCBABABBA@A@@A@?@?>?>=<;<;:;:9:989898787676565654343232121010/0/0/./.-.-,-,+,+,+*++*++**+*)*)*)()()()(()('('('('(HIJIJIIJIJKJKLKKLMLMMLMNMNNMNONOPOPPOPQPQRQRSRSRSTSTUTTUTUVWVWXWXWXYXYZ[Z[\[\[[\]^]^_`a``ababaabcbccdcdcdedededefefefgfghghhgghgghihihijijijijijkjkjjkjkjkjkkjkjkjkjkjkjijijijiihihihghghgfgfgffgfefefededeedcdccdcbcbcbbcbabaaba`a``a`a```_``_^_^]^]\[\[\\[Z[Z[[ZYZYXYXWXXWWXWVWVU TUTTUTTSTTSTSSSRSRSRQRQPQPONONMNMLMLKLKJKKJIJIHGHGFGFFEFEFEEDEDCDCBCBABA@A@?@?@?>?>=>=<=<;<;:;;:;:9::989989898787876565454554554343212210/0/././/./.-.-,-,-,--,+,,+,+,+*+*+*+*)*)**)()()('(('('('('('('(HIHIJIIJIIJKLMLMLMLMNONNOPOOPOOPQPQPQ RQQRQQRQRSSRSRSTSTUTUVUVVWVWVVWVWXWXYXXYZYZYZ[Z[\[\[\]\]^]]^^]^_^__^_`_`a`ababcbbcbccdccdcdcdefeffefefgffgfghghghghihihiihhijijjijijijijkjkjjkjkkjkjkjkjklklklkklklkjkjkkjjkkjjkjjkkjjkjijijiihihihihihghghhghgfgfefeefedeededcdcdcdcbcbcbcbabbaabaaba`a``_^__^^_^]^^]\]\]\]\[\[Z[[Z[ZYZYXYYXYXWXXWVUVUTSSRQPQQPQPQPOPOPONONMNMLKLLKLKJIJIH IHHGHHGHGHHGFGFEFEEDEEDCDCDDC BCBBCBBABABA@A@?@?@?>??>=<=<=<;:;:9:9:9899899878787676565455434432323232121010/00/0/0/./.-,-,,+,+,+*+*)*)*)())()()()('('('('(IJKJKLKLMLMNMNONOPOPQPQRQRSTUTTUTUVUVWVW VWWXWWXWXWXYXYZYZ[Z[\[\]\]]\]^]^^]]^_^_`__`_`a``a``a`abababcbccdcdcdcdeddedefefeefefefgfghghghhghihihijijijijkjkjkkjkjkjk lkklkklklklkklklklklklklklkkllkjkjkkjjkjkjkjjkkjjkj ijiijiijijjijijihghg hgghggfgfgffgfgfefeeffededcddcddcbccbcbcbcbaba`a`a``_^__^]^]^]^]\]\]\[\[\[Z[ZZ[ZYZYXYXXYXWXWVWWVUVUUVUTSTSTSSRSRQRQPQPOPONMNMLMLLMLKLKLKJIJIJIHIHGHGFGFEEDEDCDCBCBABABBA@AA@?@?@?>=>=>=<=<;:;:9:9:989877876765454343232121010100/0/0/.//././.-.-.-,-,-,+,+,+*+*++**+*)*)*)*)()()(()('('('('((HIJIJIJKLKLKLMLMLMNOPOPPOPPOPQPQRQRSRSTSTUTUTUVUVWVWVVWXWXYXYZYZYZ[\[\[[\]^]]^_^_`_`a`a`ababcbcbccdcdefefefefefgfgfghghihihhijijijijkjkjjkjklklklklklklkl kllkklklkklklkjkjkjkjkjijijijihihihghghgfefeffefededcbcbaba`a`a`a`_`_^_^]^]\]\[\[Z[ZYZYXYYXWXWVWVWVUVUTUTSSRSRQPOPOOPONONMNMLKLKLLKJKJIJIJIHIIHGFGGFEFEDEDCDDCDCBABA@?@@?>=>=<==<;<;<;:;:9::98987767677654545434334323212121011010/0/./.-..-,-,-,,-,+,,+,+,,+*+*)*)*))*)()('('(IJIJKJKLKLMNMNMNMNONOPOPQPQRQRSRSTSTSTSTUTTUVUVUVWVVWXWXYXYZYZ[ZZ[ZZ[Z[\[[\]\]^]^^]^_`_`a`abaabccdcdcdedeedefeefefgfgfghghghihhiihihihijijiijijiijkjkjkjkjkkjkkjklklklklklklklklklkklkjkjjkjjkjijijiijiijihihghghghgghgfgfgffgfefedededcddcdcbababa`a``_`_^_^_^]^]\]\[ZYXYXXWXWVWVUTSTTSRSSRSRQPQPOPONONONMLMLKLKJKJIJIHIHGHGFGFEEDCDCDCBCBA@?@??@?>?>=<==<;<<;:989898776776676565654343232101011010/0/0/./.-.-,-,--,-,,-,+,+,,+*+*+*)**)*)()()((''('('('('('('((IHHIIJIIJKJKLKLMLMLMNNMNMMNOPQPQRQRSRSTSSTSTUTTUTUVUVWWXWXYXYZYZZYZ[\]\\]\]^_^^__^_`_`_` _``a``a`a`ababcdcdcdccddedefefgfgfghghghihihijijijijijiijkjkjkkjkjkjkjklklkkllklklkl klkklkklklklklkllklklklklkjkjkkjkjkjkjjiijihihihihghghgfggffgfefedededcdcdcbababa`_^_^]^ ]^]]\]]\]]\\]\[\\[Z[[ZZ[ZYZZYXYXYXWXWVUVUTUTSTS STSSRSRSSRSRQRQPONONMNMLMLKLKJKJIJJIHIHGHGFGFGFEEDCBABABA@AA@AA@?@?@?>?>?>=>=<=<=<=<;<;<;:;::;;:9:98989987767676566566565454344323323212121010/0/././..-.--.-.-,,-,+,+,+*+*++*)*)*))*)()()(()('('('(IJKJKLKLMLMMNNMMNOPOPOPQPPQPQRQQRSRTS TSTSTUTUTUTUVUVVUVVWVVWVWXWXYXXYZYZYZ[\]\]^]^]^_^_`a`abaababcbcbccbbccdcdefefgfghghihijijijkjjkjkklklklklklkllklklklklklklklkklklkllklk jkjkjjkjkkjkjijjijijihihihihghghgfgfgffefefededcbcbcabbaba`a``a`_`__`_`_^_^]\]\[\[\[Z[[ZYZYXWXWXWVUVUUVUTUTUTSSTSRSSRRSRQRQPQPOPONONMNMLMLKJKJIJIHIHGFGFEFEEDEDCDCBCBA@A@?@?>??>=>>=>=<=<;:;:9::9:98989878787767676565454344323232121010110/0/0/.//./../.-.-.-.-,-,-,-,+,,+,,+,+*+*++*+*)*)*)()()('(('('('('('('(IJIJIJKJKJKLKKLKLMLMNONONOPOPQPQRSRSTSSTUTUTUVUVUVWWXWXWXYXYZYZYZ[Z[\[[\]\]^]^_`a`ababcdccdcdededefefefefgfgffg fgfgghgghghghghghihihihijijijijijijkjjkjkjjkjkklkklklklklkklklklklkllklklklklkjkjkkjkjijjijijihihihhihghhgfgfeffeffedeedededcdcdcdcbababa`a`_`_^_^]^]]^]\]]\\]]\[\[\[Z[Z[ZYZYZYZYXWXWWXWVUVUVUTUTSSTSRSRRSRQRQPQPOPONOONMLMLKLKJKKJIHIHGHGFEFEEEDEDDEDCBA@?@?@?>=>=>>=>=<=<;:;:9:9:9898987876766766765454543434323232121010/0/0//0/./.-..-.--,+,+,,+,+*++**+*)*)*)*)()())('('('('(IHIJIJIJK LKKLLKKLLMLM NMNMNMNNONOPQPQRQRQRSRSSRTSTUVUUVWVWXWXXWXYZYZ[Z[\]\]]\]^]]^_^_`_``a`a`ababcbbcbccdcdededefefgfgfghghghghihihijijijkjkjkjkjkklkklkklklklklklklkllklklklkllkklklklkjkkjjkjkjijijijijijihiihihihghhghgfgfgffgfefefefedededeed cddccdcdccbcbcbabba`a`a`_`_``_`_^_^]^]\]\[\[Z[ZYZYYZYXWVWVWVUVUTUTSTSRSRQRQPQPQQPOPOPPONONM LMLMLLKKLKLKJKJKJIJJIIJJIHIHGHGFGFEFEEDCBCBCBABAA@A@?>?>=>=<=<;<<;:;:;:;:9:99:98998878767765665665454543432121010/00/0/./.-..-.-,-,-,--,+,++,+*+**+*)*)()()('('('(IJKJKLKKLMNMMNONOPQPQPQPQRSRSTUVUVWVVWWXWWXYXYXYZ[Z[\]^] ^]^_^^__^_^_`_`__`a``abababcbcbcdcdcdededdefefeefeefgfgfghghghihiihijiijijijkjjkjjkllklklkl klkllkllkklklklklklklklklklklkklkjkjkjkjjijjiijijihihihghghgghgfgfefefededeedcdcdcbcbababa`a`_`_`_^]\]\[\[\[Z[ZYZYZYXYXWXXWVWVUVUVVUTUTUUTSTTSTSRQRQPQPOPOPONONMNMMNMLMLMLKJKJIJIHIHGFGFEFEDEDEDCDCDCBABABA@AA@?@?@?>=<;:;:;:9:989898 87788776766767656654543432321011011010/0/0/././.-.--.-,+*+*+*)*)*)()(()()()('(('('(IJIJKJKJK LKLLKLLMLLMNMMNOPOPQPPQRQRSTSTSSTSTSTUVUVUVWVWWVWVWXWXWXWXYXYYXYZYZYZ[\[\[\]\]^]^_^_`_`a``a``abababcbcbcbccdededefgfggfghghihijijijkjkjkllkkllklklklklkllklklkkllkllkklkllklkjkjkjkjkjkjjjijijihghgfggffgffgfefeffedeeddededcdcdcbccbcba`a``a`_`_`_^_^]^]\[\[\[[Z[[Z[ZYXYYXYXWXVWVUVUTSTSRSRRSRQPOPONONMNMLMLMLKLKJKJKJIJIHGHGFGFGFEFFEDEDCDCBCCBBCBABA@A@@?@?>?>=>=<==<;:;:9:9887676565434343232121010010/0//0/./././.-.-,-,+,+,,+*+**++*)*)()()())()()('(IJKJKLKLMLMNMNONOPOPOPQRQRSTSTUTUTUVUVWVVWWXXWWXYZYZ[\[\]\]\]^]^_^_^__^_`_`_`_`a`abaababcbcdcddcdede fefefefeffgfgfgfgfghghghghihijijiijijkjkjkllkklklklklklklmlmlmlkllklklklklkjkjkjkkjjijjijihihhihghgfggfefedededcdcbcbabbaa`_ ^_^^]^^]^^]\]\\]\[\[\[ZYZYXYXYXYXWVWVUVUVUTUTUTTSRSRQPQPPOPONONMNMNMLMLKLKJIJJIHIHIHGHGFGFGFGFEFEEDCBCBCCBABBA@A@@A@?@?>=>==>=<=<;<;:;:9:9:98876765454543443344323232122121010/0/0/././.-,-,+,+,,+*+**+*)**)**))*)()()('('(('((''('(('(('('('IJIJKLKLMLLMNOPOOPQPQRQRSRRSRSTSTUTUVWVW WXWWXXWXXYXYXYZ[Z[\[[\]^_`a``ababaabcbcdcdcddeededdefeffefgfghghgghghihijijjiijkjkjkjklkll klklkllkkllklklmlmlklklkklklkjkjkjkjjijijijihihghghghhgfedededcdcdcbccbbcbabaabaa`a`_``__``_ ^_^__^^]^]^]^]\]]\[Z[[ZYZYXWXXWVWVVUVUVVUTUUTUTSTSTSRSRSSRQRQQRQPQPPQPONONMNMNMLMLKJIJIHIHIHGHGFGGFGFEFEEDEDCDCDCBA@?@?>?>?>=>>=<=<;<<;<;:;;:9::9:9:98988767676765434323212101010/0//0/./.-.-.--.--,--, +,,+,++,+,,+,+* )*)*)**)**)*)()()('('('('('('(HIJKJJKLMLMNMNONNONONOPQPQRQRSRSTSSTUTUVUVWVVWVWWXXWXYZYZYZ[ZZ[\]^]]^^]^_^__^_`_`a`ababababcbbcbcdccdcdedde feefeefeffefgfgfghghghihijiijiijijijkjkjjkjjkjkjk lkkllkkllklkllkkllklklmlmlmllmlmlmlklklkkllkklkklkklklklk jkjkkjkjkjkjkjijijihiihihihgfgfgfefedeedeedcdcdcbccbbcbaa`a`_^_^]^]\[\[Z[ZYZYXWVWVUVUTUTUTSTSRSSRRSRQRQPQPOPONONNONMLMMLMLKLKJKJIJIHGHG FGGFFEFFEFEDEDCDCDDCBCBABABA@A@?@?>?>=>=<;<;:;:;:9::9::989898876565454343443232101010/00//00/.//. -..-.-.-..--.-,-,-,-,+,+*+*+*)*)*)()()('('IJKJKKJKLKKLKLMNMNONONOPOPQPQRQRQQRSRSSRSRSTUTTUTUVUVUVWVWWVVWWXWXWXWXXYXYYXYXYYZYZYZ[Z[[Z[\[\]\]]\]^]^^]]^_^_`__`_`a``aa`a`ababcbcdcdcdddeddedefefefgffghghghihihhijijijkjjkjkkjkjklklkklkklkllkllkkl mllmllmlmlmllmlmlmlmllmmlmlmlmmlmlkllkklklklkkllkklkkllklkjkjkjkjijihihihihghgfggfgfefefededcdcbcbbcbababa`aa`a`_`_`_^]^]\]\[\[Z[[ZYXWVWVUVUTTSTSRSRSRQPQPONONMNMLKLKJKJIJJIHGHGHGFEFEEDEDEDCDCBCCBABBA@A@A@@A@?>?>=>=<;<;:;:;:9:98987887676765654344321210110010/0/././.-.-,-,-,+,+*+*+*)*)*)*)*)())())()('('(IJKJKLKKLLKLMLLMLMNMNONOPOPQPQRQRSRRSTUTTUUTUUVUVUVWVVWWXWWXYZYZ[\[\[[\]^]^_`_`a`a`abcbcbcddefeefefefefgfghghihijijijkjkjklklklklklklklmllmmllmmlmlm lmmllmlmmlmlmlmlmlmllmmlkllkkllklklklkjkjjkkjijijihiihiihihghghgfgfgfedededcbcbabbaa`a`_`_^_^]^]\]]\[\[ZYXYXYXWXWXXWVWVWVUVUTUUTTSRSRQPQPPQPOPONMNMLMLKLKJKJIHIHHGHHGFGFEFEEDEDCDCBCBABABA@?>?>=<=<=<;<;:;;:9:98987887676565454543432321221010/0/0/.-.-,,--,+,++,+,+*+*+*)*)*))*)*)()()('('('('((HIJKLKLMLMNMNMNONNOONOPOPQPQPQQRQRSTSTSTUVUVUVWVVWWXYXYZYZ[ZZ[Z[\[[\]^]^_`_`a`ababcdcddcdedefeefefeefgfghghihhihiihijijijijjijkjkjklklklklkllkklmlmlmlmlmlmlmlmllmlmlml klkklklklkllklklkkjkjkkjkjjkjkjijijiijjihihghgfgfgfeffeffefedeededcdcbabaabaaa`aa`a`_`_^]^]\]]\[Z[ZYZY XYYXYXYXXWXXWVWVWVUVUVUTUTTSTTSRSRQRQPQPONONMNMLMLKLLKLKJIJIHGFEEDEDEDCBA@?@?>=>>=<==<;:9:9:98988767656565455454343232121210/00/0/././.-.-,-,,-,+,+*+*+*)*)*)*)()()())('('(('(IJIJJIJKJJKLMNONOPOPQPQRQRSTSSTUTTUTTUVUVUVUVWWXWXWX YXYXYYZZYZYYZ[Z[\[\]\]^_^^_^^_`_`_` _``a``a`a`ababcdcdcddedefgfgffgfghghgghihhijijkjkjkjklklklklmlmlmllmlm lmllmllmlmlmlmlmmlmlmlmlmlklklklkjkkjjjkjjkjijijjihihiihghhghgfgfgfgfefededcbcbabaabba`a`a`_`_^_^]^^]\]\[\[Z[ZYZYXYXYXWVWVUVUTUTTSRSRQRQRQPQPPQQPONOONNONMNMLKLKJIJIIJIHIHGHGGHGFEFEEEFEDEDCBABBABBA@A@@??@?@?>?>=>=>=<==<=<;<;;<<;:;:9:98788767676565656545445432121010100/0/./././.-..-.-,---,-,+ ,+*++*+*+*+*+*)*)*))*)()('('('(IJIJKJKJKLKLMNONOPQPQPQRQRQRSSRSRS TSTSTTSTTUTUVUVUVWVWXWWWXYZYZ[\[\]\\]^]^_^_^_`a`abaababcbcbccbbcddefefgfghghghihiihiijijijiijkjkjklklkklkllklllmlmlmlmlmlmlmlmlmlmmllmlmlmmlmlmlmlkllklklklklkjkkjkjijijihiihhihihghgfgfgfefefefededcdcbcbabaa`a`_`__^_^]^]\]\[\[Z[ZYZYXYYXWXWXXWVWVVWVUVUTUTTSTSRSRRQQRQRRQPQPOPONONMNNMLMLKLLKJIJIHGFGGFEDEDCDCBABABA@A@?@@?>??>?>=>=<=<<;<;:;;:9:98989887878776776566556565454434343232321212110010/00//0/./././.-.-,--,+,+,+*+*)**)*)*)()()('('('('('(IJIJKLMLLMNOPOPOPQPQRSRSRSTSTUTUVUVWWXWXYXYZYZ[Z[\]\]\]^]^_^_`ababcbcdcdcdcddeddeeddedefefefefgfgfgffghgghghihihhijijijkjkjkjkjklklklkllklkllmlmllmlmlmlmlmmlmlmlmllmlmlmmlmlklklklkjjkkjjkjkjijihiihihghghgfggfgfefeffefedededcdccddccbcbcbabababbaa `aa`aa`aa``_`_``_^]^]\[Z[ZYZYZYYXYXYXWVWVWWVUVUTUUTSTSRSRQRQPQPQPOPOPONONONMNMNMLMLKLKJKJIHIHGHGFGFGFFEFFEFEDCBA@A@A@?>??>?>=>=<;<;:;:;:9:9:98878767665654554454343232121210110110/0/0/.//././.-.--..--,--,-,+,+,+*+*+*++*)**)*)()()('('('(IJKLMLMNMNONO POPPOPPQPPQRSRSSRSTSTUTUTTUVWVWXWXXWXYXYZYYZ[Z[\]\]]\]\]^]^_^^_`_``a`a`ababcbcbcdcddeddefefgfghghghihhijijijkjkjkjkjkjkkjkkjkklklklklkllmlmlmmlmlmlmlmmlmlmlmlmmllmlmlmlmlmlmlklklklklkjkjkjjkjijjihihihihihghhghgfgfefeffefededcdcbcbabbaa`a``a`_`_^_^_^]^^]^]^^]\]\[\[[\[Z[ZYZYYZYXWXWXXWVWVVWVUVUTTSRSRQRQRQPQQPOPOPONONMNMNMLMLKLKJIHIHGHGFGFGFEFEDCDCBCBCABA@A@@?@@?>?>=>=<==<;<;<;<;:;::;:9::99898988787677677656545434343232321212121010/0/0/././.-.-.-,-,-,+,,+,+,+*+*)*)())()('('('('('('('((IJIIJKL KLLKLKLLMLMLMN ONONOONNOOPQRSRSTSTUVUVWXWWXWXYXYZYZYZ[ZZ[\[\]^]^]^_^_^_`_`__`a``abababcb cbcdccddcdcddedefefeefefgfghghghihijijkjjkjjkjkjklklklkklkllm lmlmllmmllmlmlmlmlmlmlmlmlmlmlmlklklklk jkjkjkkjjkjijijihihhihghgghgfgfededcbcbabaa`a`_``_`_^]^]\]]\[\[Z[ZYZYZYXYXWVWVUVVUTTSTSRSRSRQPQPOPONONMNMNMLMLKJKJIJJIJIHIHHIHGHGFEFEDEDEEDCBCBCBBABBA@A@?>=>=<;<;<;:;:9:9:98998878767667656565454543432323232121010/0/0/././.-.--,-,+,,++,+*+*+*++*)*))*)*)()()())('('('('IJKJJKJKLKKLKLKLMLMNMNONOPOPOPPQQPQRQRSTSTSTUTUVUVUVWVWWX YXYYXXYYZYYZYZ[Z[\[\]\]^]]^_^__^_`_`a``a``abababcbcbcddedefefeffggfgfgfgfghghghihihijijijijkjjkkjklkklk lkklkllkllklmllmlmlmmllmlmlmlmlmlmmllmlmlmlklklklkkjkjkji jijiijijijjihihihghgghgghgfgfefeffeffeedeededcdcdcbabaaaba`a`_``_^_^_^]^]\]\[\[\[\[Z[ZYZYXYXYXWVUTUUTTUTTTSTTSTSTSSRSRSSRQRQPONMNMNNMNMLMLKLKLKJIJIHIHGHGFGFEFEFEDEDCDDCBCBCBABA@A@A@?@?>?>=>>=<;<;:98988787 6776767765654543433432321221211210/0/0/0/././././.-..-.-.--,-,+,+,+*+*)*)*)*)()()('('('('(IJIJIJIJKJKLMNMNMMNONOPOOPQPPQRQQRSRRSSRSTUTUTUVUUVWVVWXWXYXYZYZ[Z[[ZZ[\[\]\]\\]^]^_^_^__^_`_`_`_`a`abaababcbcdcddedefeefefefgfgfggffghghghghihihihijijijkjkjkkjk lklklkklklkklmlmlmlmlmlmlmnmnmlmlmllmlmlmllmlklkllklkkjkjkjihihiihihghgfgfgfeffeffededcddccddcdcbcbbcbaba`a`_^_^]^]^]\]]\\]\[\[[ZZ[ZYZYZYZYXWXWVWVWWVVUVUTUTTSTSTSRQRQPQPQPONONMNNMLMLMLKLKJKJIJIJIJIHGHGFGFGFFEDCDCDDCCDCCBCCBBCBABABA@A@@A@?>?>>?>=>=<=<;:;:;:989898878767676767656545543432323232121010/0/00/.//../.-.--,-,-,+,+,+,++,+,+*+*+*++*)**)*)*)*)()('('('('(JIJKJKJJKLKLLKLMNMNONOPOPQPQRSRSTSTTUTUTUVUVWXWXYXYZYZYZ[\[[\[\]^]^_`a``ababaabcbcdcdeededdefefefgfgfghihhihhihhijijijkjkjklkklkkllmlmlmlmllmnmnmnmlmlmlmlmlklkllklkkjkjkjkjijiijjihiihhihghghghgfgfefedededcddcbcbcbcbaba`a`a`a`_``_^]\[\[Z[[ZYZYXWXWVUVUTUTTUTTSRQRQQRQPQPPQPOPONOONNONMLMLKLKJKJIJIJIHIIHGHHGHGFGFFGFEFEDEDEDCBABA@AA@?@@?@?>??>=>>=><==<=<;<<;:;;:;:;:9:9:9887676676566565454545543434432323233212101010/0/.-.--.--.-.-,-,-,+,+,,+*+*+*+*+*)*)*)()('('('('JIIJKLKLMNMNO POPPOPPQPPQRSRSRRSTSTUVUVUVWVWXWWXYXYZ[Z[\[\]\]^]^]^_^__^_`_`a`ababababcbbcdcdededdefeefeefefgfghghghghghihihijijijkjkkjkjkjklklklkllklmlmmlmmlmlmlmlmnmmnmnmmnmnmnmnmlmlmllmllmlmlmlklklkklkllkklkkkjkjkjkjkjijijihihihghgghgfgfgfededeeddeedcdcbabbababa`a``aa`_`_`_^_^]^]\]\]\[ZYZYXYXWXWVWVUTUTTSTSRQPQPONMNMLMMLKLKJKJIHGHHGFFEDEDEDCDCBCCBCBABA@A@?@?>?>=<=<;<;<;:;;:;;:9:9:98988765665654554543434432321212101010/0/0/./..//.-.--..-.-,-,+,+,,++,+*+*+*+*)*)()()()('('('((JIJKLKLLMLMLMNO POPOPOPPQPPQRQRSTSTUTUVUUVWVVWXWWXYXYXYZYZYZ[Z[\[\[\]\]]\]^]^_^_`_`a``a``a`ababcbbcbccbcdcdcdededefefefgfghghghihiihijijijkjkjklklklklklmllmlmlmmllmlmlmnmnmnmnmmnnmnmnmnnmnmnmnmlmllmmllmmlmmlmlmlklklkklklk jkkjkjjkjjkjijihihihghghgfggfefedeedcddcdccbcbabababa`a`a`_^__^]\]\[\[\[Z[ZYZYZYXWX WXWVVWWVVWWVUVUVUTUTUUTTSTSTTSTTSR QRRQRRQQPQPOPPONOONMLKLKLKJKJKJIJIHIHGHGFEFEFEDEEDCDDCBCCBABABA@?>?>=>=<=<;<;<;:;:9:9898878877876565565454343432321010/0//0/./././.-.-.-.--,-,,-,+,,+,+ ,+*+*++**+*)**))*)*)()()('('('(IJIJKJKLMNONOONOPOPQRQRRQRSRSTSTUTUVWVWXWXYZYYZYZ[\[[\[[\]^]^]^_`a`a`abcbcbcdededefefgffgfghghihijijkjkjklkklklmlmlmmlmlmlmmlmnmnmn mnnmmnmnnmnmnmnmnmnmmnnmlmlmlmlmlmlklkkjkjkjijijihihihihghhgfgfggfefefedeededcdccdcbccbcbabba`aa`a`a`_`_^__^_^]\]\[\[Z[ZYZYYZYXWXWVWVUVVUUVUTUTUTSRSRQPQQPONONMNMLKLKJIJIHIHGHGFFEFEDEDCDCBCCBCBABAABA@A@?@?>=>=<=<;<<;:;;:;:9:98988989887887676566545434323212112101010/0/00/././.-,---,+,,+,+*++*++*)*)())(()()('('('('(JIIJKLK LKKLMLLMMLMNONONOPOPQPPQRQRSRSTUTUVUUVWVWXWXWWXYXYZYZYZ[\]\]]\]^]^]^_`__`a`abaabcdcdcdedefeefefgfghghihihihijijijkjkjjkjkjklkllklklmlmmlmlmmlmnmnmnmnmnmnmnmmnmnmnmnmnmlmlmlmlmllmllmlklkklkllkkjkjkkj kjjkjjiijijijihihghghghhgfgffgfefedcbcbba`aa`_`_`_^_^_^]^]^]\]\[\[\\[Z[ZYXYXWXWVWVWVUVVUVUTUTSTSTSRSRQPQPPOPOPONONMNMLMMLMLKJIHGFEFEFEEFEDEDCDCCBA@?@?@@?>??>=<;:;:;:9:989898878787656565454343233232121010/././.-.--.--,--,-,+,+,,+*++*)*)**)*)()()(()('('('('('(IJKJKLKLMLMNMNMNONOPOOPQPQRSRSTSSTUTTUTTUVUUVUVWXWXXYXYZYYZ[Z[\[\]\]^]^_^^_`_` _``a``a`a`ababcdcdcdcdeddefgfgffgfghghghihijiijkjkjkkjklklklkl mllmlmmlmlmllmlmnmnmnmnmnmnmnmnmnnmnmnmnmnmnmnmnmlmmlmlmlklkkllkkjkjkjijijjihiihihihghghghhgfgfefefededcdcbcbcbbabba`aa`a`_`_^_^]^]\]\[\[ZYZYXWXWVWVUVUVUVUTTSTSTSSRRSSRQRQPOPONONMLKJKJIJIIJIHIIHIHGFGFFGFGFFEDCBCBCBABA@A@?@?>?>?>=>=<=<<==<;<;:;:98988787676765656556545434323323212121011010/0//0/.//././.-.-.-..-,-,--,-,+,+ ,+**+*++*+*+*)*)()()(()('('('('('(JIJKJJKJKLKLMNMNONOPOPQRQRSRSTSTTSTUVUVWVWXWXYXXYZ[\[\]\]^]^_^_`_`a`abaababcbcbccbbcddefefgfgfghghihihhijijiijkjkjklklklmlmlmlmlmmnmnmnmnmnmnmnmnmnnmmnmnmnnmnmnmnnmnmnmlmlmlkllkklkjkjijijihiihghghgfgfefefededcddcbcbbabba`a`_^_^]^]\[\[\[ZYXYYXXYXWVUTUTTUTSTSTSRQPQPOPONONMNMLMLKJIJIHGFFEFFEDCBCBABA@AA@?@@?@?>?>=>==<=<;<<;:;:9:9898878767667676565656545545432122121010/0/.-.-.-,-,-,--,+,+*+*+*)*))*)()(()('('('('((IJIJKJJKJKKLKLMNMNONO POPOPOOPPQPQRSRSSTSTUTUUTUVWVWXWXXYZYZ[\[\\[[\[\]^]^_^_^_`a`ababcbcdcdcdcdeddeededefefgfgfgfghghghihihihhijijijkjkjkjkjklklklmlmlmmnmnmnmnmnmnmnmnnmnmnmnmmnmnmnmnnmmnnmlmmlmllmllmllmllmlklklklkjkjkkjkjijihihghghhgfgfefefedededcddcdcbcbababba`_`_^_^]^]\]\[\[Z[Z[ZYZZYZYXWXXWXWVWVUVVUVVUTUTSTSRSRSRRQRQQRQPQPQPOPONOONMNMLMLKLKJIJIHGHGHGFGFFEDCDCBCBABABAABA@?@@?@?>?>=<=<;<;<;<;:;:98876767656556543232121121010/00/0/././.-.-.--,+,+,+*+*+*)**))*)*)()()()('('('('(JIJKJJKLKLKLMLMNMNONONOPOPQPQR SRSSRSTSSTTSTUTUTUVVUVVUVWVVWXWXXYXYXYZYZ[Z[[Z[\]\]\]^_^_`_`a`ababcbcbcdcdedeefgffgfgfghghghghihhijiijijkjkjjkjklklklklklmlmlmmnmmnmnmnnmnmnmnmnmnnmnmnmnmnmnmnmnmlmlmlmlmlmlklklkjkjijijijihihihghghggfgfgfefefedcdcdc bcbcbcbbcbbaba`a`aa`_`_``_^__^]\]\]\[\[\[Z[ZYZYZYZYXYYXWXWXXWVUVUUVUTUTSTSRSSRQRQPQPONONOONONNMNMLMLKLKJIJIHGHGFGGFFGFFFEDEDEDCDCDCBABAA@A@?@?>?>=>>=<=<=<=<;<;;<;:;;::9:9:98988767676765665432321212101010/0/.-.-.-,-,-,+,+,+,+*+*+*)*)()()('('(('(JIJKJKLMLMNMNOPOPOPOPQPQRQRSRSRRSTSTSTUTUVUVWVWXWXXYXYZYZ[Z[\[\]\]^]^_^_`_`_`a``a`abababcb cbcdccddcdcdedefeffefefgfghgghhghghhihihijijkjjkkjkjklkklklmlmlmlmlmmnmnmnmnmnmnmnmnmnmmnmnmnmnmnmnmnmnmlmlmlmlkllklklkjkjijjijijihiihihihihghghgfgfgfgfefefedcbcbcbbaba`a`_`_^]^]\]\]\[\[\[Z[Z[YZZYYZYXYXWXWVWVUVUTUUTSTSTSRSRSRSRQPQPONONMNMNMLKLKLK JKJJKKJIJIIJIHIIHIHGFGFGFEFEDCDCDCCBCCBABABA@A@?>?>=<=<=<;<;;<;:;:;:9:9:98988787878767656565454343432332232121010/0/./..//./.-.--,-,-,,+,,++,++,,+,+*+*++*)*)**))*)() ())()())(())('('(''('('(IJIJKJJKJKLKLMLMNMNONOPOOPQPQPQRSRSRSTSTSTTUTUTUVUVWVWXWXXYXYXYZ[ZZ[\[\]\\]\]^]^_^__^_`_`_`a``abababcbcbcdedefefefgfgfgfghghghihiihijijkjkjklklklklmlmmnmnmnmnmnmnmnmnmnmlmmlmlmllklklkjkjkjkkjijijihihihgfggfefeefefededcdcbcbababa`a`_`__`_^_^]\]\[\[\[Z[[Z[ZZYZYZYXYXYXWVUVUTTUTSTTSRSRRSRSRQRQPQPOPOPONONNONMNMLMLKLKKJJKJIHIHGHGGFGFGFFEFEDCDCDCBCBABABA@A@?@?>??>=<=<;:;:9:9:98989898878878767656543434323212121210110/0/0/././.-.-.-,--,-,-,+,+,+*+*+*)*)*)()(()(()('('(('(''('(JKLKLKLMLMMLLMNOPOPPQPQRQRSRSRRSTUVUVW VWXWWXWWXXXYXXYZYZYZ[Z[\[[\[\]\\]]\]^]^_^^_`_`_`abaababcbcdcdeddedeefeefefefgfgfggfghghghhihihihijiijkjklklklkklmlmnmmnmnmnmnmnononmnmnmmnmnmnmnmmnmlmmlmlmlmlkllklkklkklkjkjkjijihihghghgfefededcdcdcbcbaba`a`_`_^_^_^]^]\]]\[Z[Z[ZYZYXYXWXXWXWVWVUVUUTSRQRQRRQPQPOPPOPONONMNMLMMLKLKLLKJIJIJIHIHHGHGHGFFEDEEDEEDDCDCDCBCBCBABABBA@?@??@?>?>=>=<;<;<;:9:9:989887878776765654544543432321210110110/0/0//0/././/.-.--.-,-,-,+,+,+*+*+*)*)*)()())(()()('('('('('(IJKJKLKKLKKLMNMNONOONOPQPQRQRQRSRSTTSSTUTUVUVWXWXWXXYXYZYZYZ[Z[Z[\]\\]^]^]^_^^_`a``ababaabcbcdcdedeedeefefefgfgfghghihihhijijijijkjklklklmlmlmlmlmnmmnmnnmnmnmnonononmnmnmnnmmnnmnmlmlmlmlmmllkkllklk jkjjkkjkjjkjijijijihihiihghghgfgffgfefeefededdededcdcddcbcbbababa`aa`_^_^]^]\]\]\ [\\[[\[[ZZ[Z[ZYXYXWXWWXWVWVUVUUTSRQRQRQPQPOPONMNNMLMLKLKLKJIJIHGHGFGFFEFEDCBCBA@AA@A@?@@?>=>>=>=<==<;<<;<;<;:;:;:98988787767656545454343432332232121010/0//0/././.-.,--,-,+,++,+*++*+*)*)()(()('('('(('('(('('(JKJJKLKLMLMNMMNONNOPOPOP QPPQPPQPQRRQRQRSRSTSTUVUVUVWVWVWXWXYXYXYZ YZYZZ[[Z[[Z[\]\]^]^]^_^^__^_`_`a`ababcbbcdcdeddeddeeefefeefeefgfgfghihihijijkjjkjkjkjklkklkklklmlmlmnmmnmnmnonnonononon mnnmnnmmnnmnmnmnmnmlmmllmlmllklkllklklkjkjihihiihihghghgfeffeefededcbccbbcbabaabba`a`a`_`__`_^_^]^]\]\[\[Z[Z[[ZZ[ZYXYYXWVWVUTUUTSTSRQRQPONONMLMLKLKJIHIIHGFGFFFEDEDDEDCDCBCBABA@A@?@@?>=>=<=<=<;<<;<<;:;:;:9:9887876767676565654554343232122101010/0/././.-.-.--,-,-,+,+,+*+*+*+*)*))*)()('(IJKJJKLKLMLMNMNONOPQPQRSTSTSSTUTUVUVWXXYXYZYZ[Z[Z[Z[\]\]\]^]]^_`a``a`ababcbcdcdcdededeeefefefgfghghghihhihijijijkjjkjkjjklklklmlmlmllmnmmnmmnmnnmmnmnononononoononononnoonmnmnmnmlmmlmlmllmmllklklkklkjkjijijihihihhghgfgfgfgfgfedeedededcdcbcbabababa`a`_`_`_^_^_^]^]^]\[\\[\[Z[ZYZYYZYXWXWXWVVWVWVUVVUVUTUUTSTSRSRQPQPONMLKLKJKJKKJIJIJJIHIHGFGFGFGFGGFEDEEDEDCDDCDCBCBCBCBABA@?@?>?>=>=<=<=<;<;:9:988767656565 455455454434321211210110/0/0/.//././.-.-.--,-,+,+,+*+*)*)*)()()('('('('(JKJKKJKLKKLMNMNONOPOPOPQPQRQRSRSTSTTSTSTUVUVVUVWXWWXXWXXYXYYXXYZYZ[Z[Z[\[\]\]^]^_^_^_`_`a`a`ababcbcbcdededdeefefgffgfghghihijijijkjkjklklklmlmlmnmnmnmmnmnononononnonononononnoonmnmnmnmnmnmlmlmllkllklkklkjkjijijihihgfgfefefededdededcdcdcbccbbcbbabba`a`_``_`_^_^]^]\]\]]\\[[\[Z[[Z[ZYXWXWVWWVWVUVUVUUTSRQPQQPOPOOPONMNMLMLKJKJIJIHIHGFGFFEFEDEDEEDCDCBCBCBABA@A@?@?>?>=>=<=<;<<;<;:;:;:9:9:98876776765654543433432321210/0//0/././.-..-..-,-,-,--,+,+,+*+*++*)*)*)**)()()()()('('('('('(('(IJKJKLMLMLMLLMMNNMMNNMNNONOPOPQPQRQRSRSRSRSTSSTUTUTUVUVUVWVWXWXXYZ[ZZ[Z[\]\] ^]^]]^^_^_^_^_`a`a`ababcdcdcdedeefeefefgfgfghghihihijijijkjkkjkjklmlmlmmlmmlmnmmnnmnmnmnmnnmmnonononononnonononononmnmnmnnmmnnmnmlmllkllklkklkjkjjkjkjijihihihghhgfefefededcdcddcdcbcbabba`a`a`_`_`_^]^]^^]\[\[ZYXYYXWXWVWVWWVUVUTUUTUTSRSRSRQRQPOPONOONMNMNMLKLKJKKJKJIJIHIIHGHGFGFFGFFEFEFEDEDDEDDCBA@A@AA@?@@?>=<;<;<;:9:98998998878767656545445434334434323212121210/0/0/./././.-.--,-,,-,+,,++,+,+*)*)*)*)()()())()('('(('('('(('(IJKLKLMLLMNMNOPOPQPQRQRSRRSRSTSSTSSTUTUVWVWVWXWXXWXXYZYZ[\[\[[\]\]\]^]^_^_`_`_`a`a`a`ababcdcdcdedeefgfgffgfghghihijijkjklklklklklmlmlmnmnmnmmnmmnononononoononononononononnonmnnm nmnnmmnmmnmlmlmlklkllkkllkjkjkkjkjijijjihihghgfgfeffedededcddcbccbabbaba`aa`aa`_`_`_^_^]\]\]\]\]\[[\\[[\[Z[Z[ZYZYXYXYXWXXWWXWVWVUUTSRQRQPQPOPOPONMLMLKLKJKJIJIHIHGHHGHHGFGFFEFEFEDCDCDCBCBABA@A@?@?@?>?>=>==>>=<=<;<;:9:9887876767667765654543232121121010/00/0/./.-.-.-,--,-,-,+,++,,+*+*+**+*)*)())()('('('(JIJJKJKJKLMNONNOPOPPOPQPPQRQRQRSRSRSTSTSTUTUUVUUVWVWXXYXYZYZYZ[Z[[Z[\[[\]\]^_^_`_`a`ababcbcbccbbcdeefefgfgfghghghijijkjklklklmlmllmnmnmnmnmnmnonononoonononnonononoonnononoono nonoonnononnononmnmnmmnmmnmlmlmllklklkjkjkjihihihghhgfefefedcdccdcdcbcbbccbcba`a`_`__`_^__^]\[\[ZYZYYZYXYXWXWXWVWWVUVUVUTUTSRSRQRQRQPQPONONMNMLMLKLKJKJIHIHGFGGFFFEFEEDCDDCDCBCBABBA@AA@A@?@?>?>>=>=<==<;<;:;:98988787676676565454344323232321212101010110/0/./.-..--.-.-,-,- ,--,-,+,,++,+*+*+**+*)*)**))*)()()('('('('('(IJKJJKLKLMNONONOPQPQQRRQRQRSTSTSTUTUTUVWVWXWXXYXYXYZYZ[\[[\[[\]^]]^_^^_^_`_`a`ababcdcdcdeddeeddedeefefgfghghghghihihihihijijijkjkjkklklklmllmmlmlmnmmnnmmnnmnnonononnononononnononononoonnoononmnmnmnmmnmnmlmlmlkllklkjkkjkjijijihihiihghgfgfefedcdcdcbccbbbcbabaaba`_`_`_^_^_^]^]^]\]\[\[\[Z[ZYXYXWXWVWWVUVUUTUTSTSTSRSRSRRQRQRQPQPQPOPONMLKLKJKJKJKJIHIHGHGHGFFEFEDEDC BCBCBBCCBBA@AA@A@?@?>=>=<=<=<;<;:9:98998878878876767656565454323212121010/00/00/././../.-.-.--,+,,++,,+*++*+*)*)*)*)()()()('('(JKJKLKLMLMLMMNMNONOPOPQPQPQPQRQRRQRSTUTTUV UVVWWVWWVWXWWXWXXYXYZYZYZ[Z[\[\[[\]\]]\]^]^_^_`a`ababcbbcbcdcdeddeefgffgfgfghghihhijijkjkjkjk lklkllkllkllmlmlmlmlmnmmnmnnonononononoonononoonnononononononononmnmnmnmlmmlmlmlklkjkjkjkjijijihihihghgfgfefefefededcdcdccdcbcbbababa`a`_^]^]\]\]\[ZYZYXYXYXWVWVVWVUVVUVUUTUTSRQPQPOPPOPONONMNMLMLKLKJKJIJIHIHGHGHHGFFEFEFEDEDEDCDCBCBBABA@A@?@?>??>=>=>=>=<=<<=<;<<;;:;:;:9:99:989876766765654543432122121010/0/ 0//0//.//./.--,--,-,+,,++,++,++*+*+**++*++*)*)**)*)()()('('('(JKJKLKLKLMLLMNMNMNOPQRQRSTUTUVUVUV WVWWVWWXXWXXWXYZYZZYZ[\]\]]\\]^]]^]^_^_`a`abababcbcbcdcdcdedefeffefgfghgghhghghihihijiijjijkjkjkjjkjklklklmlmllmlmnmnmnmnmnonononnonononononononononononmnmnmnmlmlklkjkkjkjkjijihihihhihghgghhgfgfefededcddcdcbccba`aa`aa`_`_`__^_^]^]^^]\]\[\[Z[Z[ZYZYXYXWXWVUVUUTUTSTSTSTSRQRRQRQPQPOPONONOONONMLML KLKKLLKJKJJKJIJIIJIHGHGHHGFFEDEDEDDCDDCDCBCBABAABA@?@?>=>=<=<<=<;<;<;:;;:9:98989889987876566565454543432121010/././.--,-,+,+,+,+,+*+*+*++*)**)*)*)*)())(()('('( '(('('(('('('('((IJKJJKJKLKLKLMNMNONONOPOPQPQQPPQRSRRSRSRSTUTUTUVUVWVWXWWXXYZYYZ[\[\]\\]\]\]]\]^^]]^]^_^^_^_`__`a``a`ababcbcbcbcdedefefeffefgfgfgfghghghihiihijkjklklkl mllmllmlmmlmnmmnnmnnonononnonononoononononononmnmnmnmlmlmlklklkllklkjkjkkjijjijihihihghhghgghgfggfggfgfefefededcbbab abaa`aa``a`_`_`_^]^]\]\]\[\[Z[ZYZYXYXYYXWVWVUVVUTUUTSTTSTSRSRQRQRQPQP OPOOPPOONONMNMLMLKLKJKJIJIHIHGHGFGFFGFEDEDEDCDCBCBABA@A@?@@?>=>=<;<;:;:;:9:9:9887878787676565654545434321221221010/./.-.-.-.-,-,-,+,,++,+*+**+*+*+*)**))**)*)()())()('('(JKLMNMNONONOPQPQRSRSTSTSTSTUTUVUUVWVWXWWXYXYXYZ[ZZ[\[\]\\]^]^]^_`_`abababcbcdcdcdedefeefefefgfgfghghghihihijijijkjkjjklkllklmlmlmllmlmnmnmnmnmnnonononoononononnon onoonnonnoonmnmlmlmlmlklkjkjkjkjjiijjijihihghggfgfedeedcdcddcbcbcbaba`a`a`_`_`_^_^]^^]\]\]\[Z[[ZZ[ZYZYXYXWXWVWVUUTS TSTSSRSSRSRQRRQPQPONMNMLMLMMLKJKJIJJIHIHGHGFFEFFEFFEEDEDEDCDCBCBCCBA@A@@A@?@?>?>=<==<=<=<;:;:;:9:98998878765654545434323212212101010/0/./.-.-.--,-,-,+,,+,+*+*)*)*)()()('('('('(JKJKKJKLM NMNNMNNONNOPOPQPQRQQRQRSRSTSTUVUV WVVWWVWWXWWXXYZYZ[Z[Z[\[\]\\]\\]^]^]^^]]^_^^_`_`_`a`a`ababcbcdcdcdededdefefefgfgfghghihiihhihijijkjklklmllmnmnnmmnnmnnononoonoonnononoponononononmnnmnmnnmnmnlmlmlklklkklkjkjijijjihihhihghghhghgfgffgf efeefefeefedeedcdcdcbbcba`a`aa`_^_^]^]\]]\\]\[\[Z YZYYZYYXYYXYXWXWVWVUUTSRSSRSRQPQPOPONONMNMLMLMLKLKJKJIJIJIHIHGHGHGFGGFEDEDCDCBABBABA@AA@?@>??>?>=>>=<==<=<;<;<;:;:9:9:99::98988787676565 4554554434323232232121210110/0/./.-.-.-,--,-,+,+,+,+*++*+**++*)*)*))*)*)()()()()('('('('('('(JKJKLMNMN ONOONOOPOOPQRQRSRRSTSTUTUVUUVUVWVWXWWXYXYXYZYZ[\[\]^_`ababaabcbbcbcdccdcddeddeddefeefefgfghghihihijijkjjkjjkjklklklmlmlmmlmnmnmnnmmnnonononopoponoonnoonononononon mnnmmnmnmnmnmmlmlmllmlklklkjkjjkjijjijihihihihghghghgfggffgffgfeffedcddccddccbabababa`a`_``_`_^_^]^^]^]\]]\[Z[ZYXWVUVVUVUTUTSTSRSRQPOPPONMNNMLMLKJIJIHIHGHGFFEFFEFEDEDCDCBCBABA@AA@?>?>=>=>=<==<=<;<;<;:;:9899887876765656654543432321212121221010110010/0/.//.-.--,-,-,+,+,+*+*+*)*))*)*)()())())()('('('(JKLKLMLMLMNONOPOPQPQQRQRQRSTSTUTUVUVVUUVWVWVWVWWXWXYXXYZYZ[\]\]^]^_^^_^^_`_`a`ababcbcdcdccdedefefefgfghghghihhihijiijijkjklklklmlmlmlmlmnmmnmmnmnnmnonnonnonononnoonopopoppopopopooppononononnononmnnmnmnmlmmlml mllmllklklkklklkjkjjkkjijihiihiihghghghgfgfgfefedcddcbcbcbcbababa`a`_`_^_^]^]]^]\]\[\[Z[ZZ[ZYXYXYXWXWVWVUUTSTSRSSRQRQRQPOPPONONMLMLMLLKLKLLKKLKJKJKKJIJIHGHGHHGFFEFFEFEEFEEDEEDEDCDCDCBCBABA@A@?@?>?>=>=>=<=<;:;:9::9::9898987676565654554453343232101010/./.-.-..-.--,-,-,+,+,+*+*+*)*)**))*)*)()()()()('('('('('(JKLMLMNMNONOPOPQRQQRRQRSRSTSSTTSTUTUVUUVWVVWXYXXYYXXYZ[Z[\]\]\]^]^^]^]^_^^_`_`a`a`aa`abababcbcbcdcdefeeffgffgfghghihijijijkjklklmlmnmnmnmnmnononononopoopopopopopopooppopononononononoononmnmnmmlmlmmlkjkjjkjkkjkjijihghgfgfefefefededecdccbcbaba`a`_`_^_^]^^]\]\[\[\[ZYZYXYXWXXWXWVUUTUTSRQRQPQQPONONONMLMLKLKJKKJIJIHGHGHGFGFEFEFFEDEDCDCDCBCBABA@A@?@?>?>=>=<==<=<;<;<;:;:98988787676545432321212212210/0/0/. /..--..-.--.--,--,-,-,+,+*+*)*)**)*)()()('('('(JKJKJKLKKLLKLMNMNMNONOPOOPQPQRSRRSTUTUTUVUVWXWXYXYYZYYZYZ[ZZ[\[[\]\\]\]]\]^_^_`a`ababcdcdcdedefeefeffgfghghihhihihijiijijkjkjkkjklklklmlmlmlmnnoonnonnonopoopopopopopoponoonononmnmmlmlmlmllmlkllklklkjkjijijihiihihgfgfgfefededcdcdcbcbaba`_^]\]\[\[ZYXYXWXXWVWVUVUUUTUTSTSTSRQPQPOPOPONONONMNMLMLKLLKLKJKJIJJIHIHHIIHIHHGHGGHGFGFGFEFFEFEDEDCDCBABABBA@AA@?>=>=<=<=<;:9::99:988787654543443232121221010/0/./.-.-.---,-,,-,+,+*+*++*)*)*)*)()()()(()('('('('('('JKJKLMLMNONNONNOPOOPQPPQRSRSTSSTSTUTUTUVWVWVW XWXWXXYYXYXYZ[\[[\]\]^_^_^_`__`a`aa``ababcdcdcdcdedeffgfgffgfghghihijijijklklmlmlm nmmnmnnmnmnnmnoonononopopopopopopopopoponoonnoonoonnonnonmnmmnmnmnmmlmlmlklkllklkjijijihihgfgfgfededcdcbc bcbbabbabbaaba`aa`_``_^__^]^]^]\]\[Z[ZYZZYX YXXYXXWXWXXWXWVUUTSTSRSRQRQPQPQPONMNMLMLLMLKLKJKKJIHIIHIHGFGFGFEDEDCDCBCBABA@A@A@?@?>?>>??>=>=<=<;<;:;:98988987876 565545445543434343232321210/0/0/./.-.--,-,-,+,,+*+*)*)*)*)()()()()('('('(JKJJKJJKLMNMNMNOPOOPQRSRSRSTUTUVWXWXWXYXYZYZ[Z[\[[\]\]^]^]]^_`_`a`a`ababcbcdccdcdededefefeffgfgfghghghihhijiijiijijkjkjklklkllklmlmlmmlmnmmnnmnmmnonononononopoopopopopoopoopopopopopopopopopoponononononmnmmnnmnmnmmlmlmlklklkllkjkkjjkjijijihihghgfgfgffgfefefededcdcdccbccbcbaba`a``a`_`_^__^_^_^]\]]\[\[Z[ZZYZYXYXYXWXWVWWVUVUUTUTSTSRSRQRQPOPOPONONMNMLMLKLKJIJIHIHGHHGHGFFEFEDEDCDCBABA@AA@A@?@?>=>=>>=<=<;<;;<;:;: 9::9:998998987876765665454344323232122121010/0/00/./.-.--,-,-,+,+,++,+,+*+*+*++*)*)*)()('('('('(JKLKKLKLMLMNMNONOPOPQRQRRSRSSRSTSTSTUVUVWVWXWXYYZYZ[ZZ[\[\[\[\]^_^_^_`ababcbcdedefefeefgfgfghgghhghihijiijiijkjkkjklklmlmmlmlmnmnnmnmnmnononnooonopooppopopop opoppopopoopopopo poppoppoopoponononoononon mnmnmnmnmnmmlmmllmlklkllklkjkjkjjkjijihihihghghgfggfefedededcdcbcbccba`a`_^_^]^]\]\]]\[\[[\[Z[ZZ[ZYZYXWVWVUVUUTUTUTSRSRQRQPQPOPONONMNMLMLKLLKJKJIHIHGHGFGFFEDCBCBCBBABA@A@?@?>?>=<==<;:9:98998767677656545455454344334323212 121211001010/0/./../.-.--.-.--,-,-,-,+,+,,+*+*+*+*)*)*)()('('('(JKJJKLKLMLLMMLNMMNONONOPOPPOPQPQQRQRSRSTSTUTUVUUVUUVWXWXYXXXYZ[Z[\[[\]^]^]^_^_`a`abcbcdedefefghghghihijijijijkjjkkjkjklkklkkllklmlmlmmlmnmnmnononnonnoonopoopoopopopoopopopo pooppooppopopopopoppopopoponononoononmnnmnmnmmlmlklkklklkjkjkjihihhihghgghhghgfgfefefedcdccbcbcbaba`a`a`_^_^]^]\]\[\[ZYZYXYXWXWVWVUVVUVVUUTUTUUTSRSRQRQPQQPONOONMNMLMMLKLKJKJIJIJJIHIIHGHGFGFFGFEDCDCCBCCBCBABBA@A@?>?>=>=<;:;:;:9::99898787876766765656545543443232321212101010010/0//0/./.-.-.--,-,,-,+,,+,,+*+*+*++*)()()(()('('(JKJKLKLKLMLMNMNONOOPOOPOOPQPQPPQRQRSTUVUVWVWXWWXYXYYXYXYZYZYZ[\[\[\]\]^]^_`a`ababcbbcbcdccdcdefeffgfgffghghghihihijiijijkjkjklklklmlmnmnmn mnnonnoonnonnoonononopoopooppopoppopopoopopopoppopopopopopononononmnmmnmlmlmlklkjkjijjijihihghghgfeffefededcdccbcbaba`_``_^_^__^ ]^]]^]]\]\]\[\[\[Z[ZYZZYXWXWVWVUVUUTUTUTSSTSTSRQRQPQPONOONONMNMNMMLMLKLKJKKJKJIJIHIIHGHGHGHGFGFEFEFEDEDEDDCCDCDCBCBABA@A@A@?@?@?>??>=>=>=<==<=<;<<;:;:9:988788767667765665654544545434434323321010/0/0/./.-.-.--,-,+,,+,+,+ ,+*+*++*++*+*)*)*)()()('('('(JKJJKJKLKLMLMLMNMNMNMNOPOPOPQPQRQQRQRQRSRSTSTSTUTUVUVWXYXYXXYYZYYZ[ZZ[\[\]^]^_`__`_``_``a``aa`abcdcdededefefeffefgfgffghghghihihijijkjklkklklklmlmnmnmnonononopo popoppopopopopopoppoopopopopopoponononmnmnmnmlmlmlmllkllklklkjkjjkjijjiijihihihihhghgfgfgffgfefefedeedcdcddccb cbcbbababbaaba`_``_`_^_^_^]^]\]]\[\\[Z[Z[ZZ[ZYXYXYXWXWWVWWVUVUTUTSTSTS RSSRRQRQRRQPQPONMNNMMNMLMLMLKJIJIJIHIHGFGFEDEDCDCCDCBCCBA@A@?@?>=>=<=<;<;:;:;;:9::99:9:98989878778767654543432323232121121010/././.--,+,,+,+,+*++*++*++*)*)()()()('('('(JKJKJKLMLMNONOPQPQRSRSTUVWVWXYXYXYZYZ[Z[[Z[\]\]\]^]^_^_^_`_`a`a`abcbbcdedeedeffgffggfghghhghihijijijkjklkklmlmlmnmnmnmnononoopopopopoopopoppoppoopopopopopoopopopoponononoonmnmnmnnmnmlmlklklkjkjihihhihghhgfgfefeffedcdccbcbabba`aa`_`_^__^_^]\]\[\[\[ZYXYXXWXWXXWVWVUVVUVUVUUTUTSTSSRSRSSRQRQPQQPQPOPPONMNMLMMLMLKLKJKJKJKJIHIHGHHGFGFEFEDEDDCCDCB ABAABA@A@A@?@?>?>=>=<==<=<;:;:9:98989878765654323323223212121010/./././.-.--.--,--,-,+,+,,+*)*)**)*)()(()('('('('('JKJKLKKLMLLMMNMNMNONOPOPQPQPQRQQRSTSTUTUVUUVUVWVWXWXWXYXXYZ[Z[Z[\[\[\]\]]\]]^]^_^_`_`_`a`abcbcdccdeddedefeffeffgffgfgfghghihiihijiijijjiijkjklkklklkklmlmlmnmnmnonoononoononoopopopoopopoopoopopopoppopoponononnonnmmnnmlmlmlkllklkjkkjjkjijijihiihihghgfefefedeededccbcbababa`aa`_^_^_^]\[ZYZYXWXXWVWWVUVUTS RSSRRQRQQRQPQPQPOPOONMNMLMLKJIJIHGFGFEFEDEDDEDCDCBABABA@A@A@A@?@?>?>=>=>=<;:;:9:9:9898788767676565565454543434323323212101010/0/00/0/././.-.-..--,-,--,-,+,+,+*+*+**+*)()()(())('('('('(JKJKJKLKLMNMNMNONONNOPQRQQRSRSTSTUTUVWVWXYXYYZ[Z[[\[\]\]^]^]^]]^^_^_^__`_`_`a`a`ababcbbcdccddcdededeffgfghghhgghihijiijkjkjkjklmlmmllmnmnmnmnonnonoopopopoopopopoppopopopopopononononmnmnmmnmnmlmlmlkllkklkklkjihihhiihghgfgfefedededcdcccbcbbcbaba`_`_^]\]\]\[\\[\\[Z[ZYZYZYXYXWXWXWXWVWVWVUVUTSTSRQPQPQQPQPOPOPONONMLKLKJJKKJIJIJIHIIHGHGF FGFGEFFEFEFEDEDCDCBCBCBABA@A@?@@?@?>=<=<;<;:;:9:9887887876565454543232121210/0/.-.-- ,-,,--,--,,-,+,+*+*)*))*)*)()(()(()('('('(JKLKLMLMLMNMNONOPQPQPQRQRRQRSTSTUVWXWXYXXYXYZYZ[Z[\[\ ]\]\]\\]]^]^]^_^^_`__`_`a`a`ababcdedeedefeffgfgfghgghghihhiihijijijjkjklklklmlmnmnmnmnonnoonnoopopoopopoopopqpqpqpqpopopopoponononmmlmllmlklklkjkjjkjijjijiijihihghghghgfgfefeefedeededccbcbaba`a`_``_^_^_^^_^]^]\[\[Z[ZYZZY XYYXYXWXXWWXWVWWVUVUTUUTUTSTSRSSRQPQPOPONONNOONMNMLK JKJKKJKJJIJIJIHGHGHGFGFGFEFEFEDEDEDCDDCBABBABBA@A@A@?@?@?>=<;<<;:;:;:9:9899899876765656545434323232121121010/00/0/00/.//./.-.--,-,+,+,+,+*+*+*)**))*)*)()()()()('('('('(JKJKLMNMNONONOPOPOPQPQRQRSRSRRSTSTUTUTUUVUUVWXWXYXYXYYZYYZ[Z[\[[\\[\]\]^]^_`abaababcbcdccddcdeddeffgfghghgghghihhijijijkjjklkkllklmllmnmmnonnonononopopopopoopopqpqpqpopopoponoonononmnnnmlmlmmlmlklklkjkjkjijihihihhihghghgfggffggfefefedededcdccbcbcbaba`aa`a`_`__`_^]\[Z[Z[ZYXYXYYXWVUVVUVUTUTSRSRSRRQRRQPQPOPONOONNONMNMLMLKJKJKJIHIHGHGGHGFFGFEFEDEDCDCBCCBABA@A@?>?>>?>=>=<=<==<;:;:989989987876766765665654543432323223212121010/0/./.-.-.--,-,-,+,+,+*+*)*)()()()('('(('(JKLKKLMLMNMNMNMNONOPOPQRQRSRSRSTSTUTUUVWVWXYXYYZYZYZ[Z[Z[\[\]^]^_`__`a`ababbabcbcdccdefeffgfghgghghghghihhihiihijijijkjklklklmlmlmlmnmnmnmnmonononopopopopopqppqpqpqppqqpopoponononmnnmnmnmlmllmlmlmlklkjkjkkjkjijijijjihiihhihghg fgfgffeefefededcdccbcbaba`a`a`_^]^]^]\]\][\[Z[ZZYZZYXYXXWXWXWVWVUUTUTSTTSTSSRSRQPQPONMLMMLKLKJKJIJIJIHIHGHHGHGHGFGFEDCDCBCBBCBA@A@?@@?>=<;<;;<;:;:;:9:9899898787876767656545434323212121010/0/./././.-.-.--,-,,+,+,++,,+,+*+*++*)*)**))*)*))() ())()())(())('('(''('(JKLKLMLMNMMNNMNONOONOPOOPQPQRSRSTSTSTTUTUTUVWXWXYXXYYXYYZYZ[ZZ[\]\]^]^^__^_^_`_`a`aababcbcdcdcdeddeedefeeffghghihijiijijijklkklklmllmnmn onnononoonnonopopoopopqpqpqppqqpqpqqpqqpopoppoopopoponoonnononmnmnmmnmlmlmmlmlklkllklkjkkjkjijihghhghgghgfgfgfefedcddcdccbcbbccbaba`aa`_``_`_`_^_^__^]\]\]\]\\[\\[Z[ZYXWVUUTUTSTSRSSRQRQPOPONONONMNMLMLKJKJKJIJIHGHGFGFGFEFEFEEDEEDEDDCDCDDCBCCBA BABA@@A@AA@?>=<=<;<;:;:9:9887887677667656545434323232121211221011010/0/00/./././.-.--,--,-,-,+,+,+*+*+*+* )*))*))*)*)()(()(()('('(('(''('((KJKLMLMNMMNNONNOPOPOPQPQRSTSTUTUVUVWVWXYXXYYZYZ[Z[Z[\[\\[\]^_^_`a`ababcbcdcdeddefeffgfghghghihhijiijiijkjklklmlm nmmnmmnmmnnmnonnononopopopoopopopqpqpqpqpqpqpqpqpqpqpopopopopopononnoononononmnmlmlmmlkllkklkjkjijihihghghgghgfgfgfefededcdcbcbababa`a`_`_`_^_^]^^]\]\]\[\[Z[Z[ZYZYXWXXWVWVUVUUUVUUTUTSTTSRSRQRQPQPOPONONMNMLMLKJKJIJIHIHGFGGFEDEDCBCBABBABA@A@?>?>?>=>=<=<<=<;:;:;;:9::9:988987878767656545445543432323221210110/0//0/.//.-.--.--,-,-,-,+,+,+*+*+*)*)*)()())(()()('('('('('(JKJKKJKLKLMLMNONOPOPQPQPQRQRSRSRSTSTSTTUUTTUVUUVVUVWXWXYZYZ[\[[\[\]^]^_^_`_`__`a`a`ababbabcbcdcdefeefeeffeffgfghgghhgghihijiijkjklkklklmlmlm lmmnmmnnmnnmnononopopopopoppopqpqppqpqppqpqpqp qpqqpqqppqpqpopopoponononononmnnmnmnmlmlmmlmlklkkllkjkjkjijijihihiihghghgfgfefefefededcdccbaba`a`_`_^]^]^^]\]]\\]\[\[\[Z[ZZ[ZYXYXWXWVWVUVVUTSTTSR SRSRRQRQQRQPONOONONMNMLMMLKLKJIJJIHIHIHGHGGFEDCDCDCCBCBABA@?@?>=>>=>>=<;:9:988998787676566566545454343432332232121010/0//0/././.-..-,+,+,,+*++*+*)*)()('('('(('('(('('(JKLKLMLMNONOPOPQPQQPQRSRSRSTUTUVUUVWVWXWXYYZ[\[[\[\]\]^]^_^_^_`__`a`ababcbcdcdeffghghghghihijijijijkjjkkjkjklklklmllmmlmnmnmno nonnononnonnopoppopoopoppopqppqqpqqpqpq pqpqppqppqpqqpqpqpopopoppopopononononmnmnmlmlmmlmlklklkklkjkjijiijihihihghgfgfgfefededcdcdcccbcbababa`a`_`_^_^_^]\[\[Z[[ZYZZYZYXYYXWXWVWWVWVUVVUVVUTTUTSTSTSSRRSRRSSRQRRQPOPPONONMNMLMLKLKJKKJKKJIJIHIHGHGHGGFEFEDEDDCDDCDCBCCBABA@?@?>?>=<;<<;;<;:;;:9::99878767677654343232121210101010/0/././.-.---,-,-,-,+,+,+*+*+*+*+*)*))*)()()('(KJKJKLMLLMLMNONONOPQPPQPQRSRSSRSTSTSTSTTUTUTUVUVWVWXWWXWXYXYYZYYZZYZ[\[\]\]^]^]^_^__`_`a``ababcdcdedeedefef fgffggfgghghghghihihijiijijkjkjklklklmlmnmnonopopopoppooppopqpqqppqqpqpqppqpqqppqpqppqqppqpqpqpqpqpqpopoponononnmnmnmlmllmmlmlklklkjkkjkjkjijihihgfggfgfgffeeffededcdccbcbaba`aa`_`_^_^__^]^]\]]\]\[\[Z[ZYZYXYXWVWVUVUVUUTUTUTSRSRQRQRQPQPOPPOPONONONNMNMLMLKLKJKJIJIHIHIHIHGHGHGFGGFGFEFEFEEDDEDEDCDCBCBABABA@A@?@@?>?>?>=>>=>=<==<==<;<;:;;:;:9:98989989876765656565654543434321211210110/0/0/./.-.--.--.--,-,-,+,+,+*+*)*)*)()()('('('('((KJKJKLKLMLMNMNMNOPOOPOPQPQRSRSTSTUTTUTUVUVWVWXWXYXYYZYZ[Z[ZZ[[\[\]\\]\]^]]^_^_`__`_`_`a`ababcbcbccbcdcdedeedef effeeffgfgffggffghghghihihihijijkjklklklmnmmnnmnonnoononopoppopqpqpqppqpqpqpqqpqpqpqpqpqpqpopopoponononononmnmnmnmlmlmlklkllklkjkj ijjijjiihihghgghgfgfgfeffededcdcdcbcba`a`_`_`_^_^]^^]\]]\[\[\[\[ZYXYXWVWWVWVVUVUTUTUTSRSSRRSRQRQPQPONONMNMNMLKLKJKJKJIJIHGHGGFEFEDEDDEDCDDCBABA@AA@?>?>=>=<;<;<<;:;;:989987 67677675566565434334323212121010/0//0/./.-..-..--,-,-,--,+,+,+*+*++*)*)*)**)()()()()('('('('('(('(JKKJKLKKLKLMLMNOPOPQPQPQRQQRSRRSTSTUTUVUVWXYXYYZYZ[\[\]\]^]^]^_^_`_`a`abaababcbcdedefefgfghgghghijijijkjklkklmlmllmnmnonopooppoopopopqpqpqqpqpqpqpqpqpqppqpqpqpqpopopopoppono nonoonononnnmnmlmlmlklklkjijjijihghgfgfgfefededcdcddcbccbabbaaba`a`_`_^_^]^]\]]\]\[\\[[\[Z[ZYZYXWXW VWWVWVWVVUVUVUTUTSTTSRSRRQRRQRQPQQP OPOONONNOONMNMLMMLKLKLKJIJIHIIHGFGFEFEEDDEDCBCBABABA@A@?>?>=>>=>=<=<;<;:;:9::98989878787676765654544543434321212121010/0/./././.-.-.-,-,,-,+,,++,+,+*)*)*)*)()()())()('('(('('('(('(JKLKLMNMNONOPOPQPPQRSRSTSTUTUVUUVWXWXXWXYXYYZ[Z[\[\]\]^]]^^]^_^_`a`ababababcbcbcdcdedefeffgfgfghghihiihijiijijjijkjklkklklkklmlmlmnmnononoononopooppqpqp qppqpqqpqpqpqpqpqpqpqqpqpqpqpopoppopononnmnmnmlmmlmlkllklkjkkjjkjihghgfgfeffefefededcdcdcbcbcba`_`_`_^_^]^]]\[ZYZYZZYXYYXWXXWVVUTSTTSRSRSRQRQPQPPONONMNMLKJKJIHGHGFGFEFEEFEDEDCBCBCBABABABA@A@?@?@?>?>?>=<;<;:;:;:9:9:9:9898987876765654543232321212210/00/0/./.-.-.-.--,--,-,-,+,++,,+*+*+**++*)*)())()('('('((JKLKKLMNMNMNONOPOPOPQRQRQQRQRSRSTSSTUTUVUVWVVWXYXYXXYYZYZYZ[\]\\]\]^_`a`ababcdcdcdefgfghihijijkjkjkjklmlmmlmnmnmnmnononopopopopppqpqpqpqpqpqpqqpqpqpqpqpqpopopopoponoononnononnmnnmnmlmllmlkjijiijjihihghgghggfgfededcdccdcbcba`a`a`_`_^]\]\]\[\[Z[ZYZYXYXYXWXWXWVWVWVVUTSTSRQRQPQQPQPOPONONMLKKLLKJKJKJIJJIHIHGHGHGFGFGFEFEDEDCDCDCBCBABA@AA@?@?>?>=>=<;<;:;:98987876766765655654543443343232321212121010110/0/./.-.-.-.--,-,-,--,-,+,+*+*+**+*)*)**))*)()()('('('('('(KLMLLMLMNOPOOPQRQRSRRSTSTSTUVUWVWVWXYYZYYZ[Z[\]^]^_^_`a`ababcbcdcdedefefgfgfghghghihhiihijijijklklmllmnmnonnonnoonopopoppqpqpqpqpqpqppqpqpqpqpqpqpqpqpopoponnmnnmnmlmlmlklkklklkjkkjkjkkjijihihiihhihghgfgffgfefededcddcbcbaba`a`_`_^_^]\]\\]\[\[Z[[ZYZZYZYXYXWXWVWVUVUTSRSRQRQPQPQPOPOOPPONONML MLKLKLLKLKKJKJKJJIJIHIHIHGHGHGGFGFGFEFEFEDEEDCBCCBCCBABA@A@A@@??@?>=<==<;<;<;:9:98987887656545432121010/00/./././/.-.-..-,+,,++,,+*++*+*)*)*)*)()()()('('(KLMNMNONNOPOPOP QPQPQRQRQRQR SRSSTSSTSTSTUTUTUTTUUVUVWVWXYXYXYYZ[\[\[\]\]^]]^]^^__^_^_`_`a`abcbcbcdefefgfgfghghihhijijkjjklkkllklmllmnmnonoonononopopoppqpqppqpqpqpqpqpqpqpqppqpqpqpoppopopononnmnmnnmnmlmlmmlmmlklkjkj ijijiijjijiihihghghgfgfeffededccdcbcbaba`aa`a`_^]^]\[\[\[[\[ZYZZYZYXYXWVWVWVUUVUTUTSTSTSSRSSRQRQPQPOPOPONONMNMLKLKLKJIJIHIHHIHGHGGFGFEFEDEDCDDCBCBABA@?@??@?>?>?>=>=<;<;:9:987676676565434321221212110010/0/0//0/./.--,--,-,+,,++,++,++*+*+**++*++*)*)**)*)()()('('('(KLMLLMNMNONOPQPPQRQRSTSTSTUTTUVUVVWVWXWXWWXXWXXYXYXYXYYZYZZ[Z[ \[[\[\\[\\]\]^]^_^_`_``__``a`abaabcbcdeddedeffgfghihijijijjijkjklklmlmnmmnnmnmnonononopopopopqpq pqppqqpqqpqpqpqrqrqpqqppqpqpopopopononononmnmmnmnmnmlmmlklkllklkjkjkjkkjkjijjiijihghghgfgfgfefedcdcdcbcbabbaaba`a`_^_^]^]^]\[\[[Z[ZYZYXYXWXWVWVWVWVVUVUTUUTUTUSTSRQRQPONOONMLML KLKLKKJKJKJIJIHIHIHGHGFEDEDCDCCDCBABA@AA@?>=<=<<=<;<;;<;:9::988989878765665654543432321210/./.-.---,-,+,+,+,+,+*+*+*++*)**)*)*)*)())(()('('( '(('('(('('('(KLKLKLMNONOPOOPQPPQRQRSRSTUVUUVWXWXWXYZYYZYZ[Z[Z[\[\\[\]\]^]^^_^^__^_`_`abcbcdcdefefgfghghihijijijklklmllmllmnmnmnononononopoopoppqpqpqppqpqrqrqrqrqpqpqqppqpqpqpopoponononnonnmnnmnmlmlmmlmlmlkllklklkjkjihihhiihghghgfgfgfededcdcbcbcbaba`a`a`_`_``_^]^]^]]\]]\[\[Z[ZZ[ZYXWVVUVUTSRSRQPQPOPOPONONMNMLKLKLKJKKJIHIHGHGHG GFGFGFFEFFEFEEDEDEEDCDCBCBCBAABABA@?@@?@@??>?>=>=<=<;<;:;:9::99:9899898987676565454343432321221221010/./.-.-.--,-,-,,-,+,,++,+*++*+*+*+*)**))**)*)()())()('('(KJKLMLLMNONOPOPQRQRQRSTSTUVWVWVWXWXYXYYZ[ZZ[\[\]\]^]^_^_^^_`a``abcbcbcdcdeddeedefefefgfghghijijijkjklklmlmmlmnmnmmnmmnonononopoppopoopoppqppqpqpqpqpqrqrqpqpqpqpqpqpopooppopopopononnmnmnnmlmmllmlkllkjkjijihihihhihghghgfgfefededcdcbcbcbaba`a`a`_`_^__^]^]^]\]\[\[\[Z[ZYZYXYYXWXWVWVWVWVVUTSTSTSRSRQRQPQPOPPONONMNMLKLKJKJIJIHGHGGFEFEDCDCBCCBCBABA@?@?>?>>=>>=<;<;<<;:;::;::9:989899878778765655654545434323212101010/0/.-..-.-,-,+,,+,+,+*+*)*)*)()()('('('('((KJKLKLMLMNMNONNONOPOOP QPQQRQRRQQRSRSTUTUVUVWVWXYYZYYZ[Z[\[\[[\]\]^]^_^_`ababbcbbcbcdcdcdefefgfggfghghghihijijkjkkjklkklklmlmlmnmnmnnmnonopopopoppqppqpqrqrqrqqrqrqpqpqpqpqpopopopoponoononnonmnnmnmlmllmlklkjkjijijjijihihghgfgfgfeffefedcdcbcbaba`_ ^_^__^^_^^]^]^]\]\]\[\[\\[ZYZYYZYXYXWXWVWVUUTUUTS TSTSSRSRRSRQPOPPOPONONONMNNMLMLKJIJIJJIHIHGGFEDEDEDDCDCBCBA@?>??>??>=<=<;:;:9:9898987876765 455455443432322321210110/0/./.-.-.--,--,-,+,+,+*++*+**++*)*)*))*)*)()()()()('('('('('(JKLKLMLM NMNNOONONNOPOPQPQRSRSTSTUTTUTTUVUVWVWXWXYXYZYZ[Z[\]\]^]]^]^_`_`a``abababcbbcbcdccdedefgffggfghghghihijijijkjjkkjkjklkklklmllmmlmnmnnmmnonononopopoppqppqppqpqpqqpqpqrqrqrqrqrqrrqrqpqpqpqqpqpqpopopopononmnmnnmnmlmlmllmlklkjkjjkjijijihihihghgfgfefefedededdcdccbcbcbaba`a`_`_`_^]\]\[Z[[Z[ZYZZYXYYXWXXWXWVWVWWVUUVUTUTSTSSTTSRQPOPONONMLMLKJKJIJIHIHIHGFEFEEDEEDEDCDDCBCBA@A@?@?>??>=>=<==<<=<;<;:;::;;:9:9:99878765665454343232121221010110010/0/0/.//.-.-.-,-,-,+,+,+*+*+*)*))*)*)()())())()('('('(JKJKLKLMLMNMNMNONNOPOPOOPOOPQPQRQRSTSTUTUVUVWVVWXWXXWXWXYXYXYYZYZ[Z[\[\]\]]\]^]^_`a`a`abaabbabcdcddcdededdefefeefgffggfghghghghihiihijijijijkjklklklmlmnmnonononopopopopopoppqppqqpqrqrrqqrrqrqrqqrrqqrqrqrqrqrqpqpqpopoponononmnmmnnmnmlmlmlkllklklkjkjijihghhghghggffgfefedededdccdcbcbabbaba`a`_`_`_^_^]^]\]\[\[Z[ZYZYXWXWVWVWVVUVUTSTSRSRQRQPQPOPOPONMNMLMLKLKJKJIJIJIJIHIHGHGHGFGFGFFEEFEFEDEDCDCBCBCBABA@A@AA@?@?>??>?>=>=>>=<;<<;<;:;:;;:9:9::988767656565454343232101010/./.-.-..--..-,-,-,+,+,+*+*+*)*)**))*)()()()()('('('('(KLKLKLMLLMMLMNMNONOPOPOPQPQPQRQQRSRSTUTUVUVWXWXWWXXYXXYYZYYZZ[Z[Z[\]\]^]]^]^_^^_`_`__`a``a`abaabcdcdcdeddefeefefgfgghghghihihijiijkjjklkklklmnmmnnmnonononopopopopp qpqpqqpqpqpqpqrqrqqrrqrqrqrqrqrqrqrqpqpqpqpopopopopononnoononmnmnmlmlmmlmlklk jkkjkkjjijjihihhihghghgfggfededeeddccddcbaba`a`a`_``_^__^]^^]^]\]\]\]\[\[ZYZYXWXWWVWVUVUVU TUTTSTTSSTSRSRQRRQPOPONONONMLMLKLLKJKJIHIHGFGFEFEEFEDEEDCDCBCBCBBABBA@A@A@?@?>?>=<=<=<;<<;:9889878767654554323212212210/0/0/. /..--..-.--.-,--,-,-,+,+*+*)*)**)*)()()('('('(KLKLMNMMNOPOPQPQRQRSRSTUVUVWXWXWXYZYZYZ[ZZ[\[\]\]^]^^]]^_^_`_`abaababbabcbcbcbcdcdcdedefefgfgfghijijiijkjklkklmlmllmnmnononopoopopoppqpqpqppqrqrrqrrqrrqqrqqrqrqrqrqqrqrqrqrqpqpqpqpqqpopopoppopopononmnmnmlmlmlkjkkjkjijihghgfgfedeeddcddcbcbaba`aa`_`_^_^__^]^]\]\]\[\[Z[ZYXYXWXWVWWVUVUTUUTSTSRSRQ PQPPOPOOPPONONMNNMLMLMLKJKJIJJIHGHGGFGFFEEFEDCDCBCBA@?@?>?>?>=>=<=<;<;:;:;::99:9::98998787654543232121221010/0/./.-.-.-,-,,-,+,+*+*++*)*)*)*)()()()(()('('('('('(KJKLMLMLMNMNONOPOOPOPQRQRRSRSTSTUTUVUVWVWVWXWWXYZYZZYZ[Z[Z[\[\]\]^]^]^^]^_^_`a`abcbcdcdedefefeeffefgfggghgh ghhihihhihijijjijkjklkklklkklmlmlmnmnonononopopopqppqrqrqrqrqrqrqrqrqrqrrqrqrqrqrqpqpqqpqpoponoononmnnmnmlmmlmlkllkklkjihihghgfggfgfgfefedeeddeddcdcba`a`a`_`_^_^^]\[Z[Z[[ZYZZYXYYXWVWVVUVUTSTSTSRSRQRQQPOPONONMNMLMLKLKJKJIHIHGHGFGFFGFEFEDCDCDCBCBCBCBABA@A@?@?@?>?>=<;<<;<;:;:9::99898787876 56554544554534343432323232121010/0/0/./.-.---,-,-,+,,+*+*)*)*)*)*)()()()()('('('((JKLMLMNMNOPQPPQRQRSRSTSTUTUVUVWXWXYYZYZZ[Z[\[\]\]\]]\]]^]^]^^_^_^_`_`_`a`ababcbcdcdefefefgfggfgggfghghihijijiijjkjkjklmlmmlmnmnmnononopopqppqpqrqrqrqrrqqrqrrqrrqrqrrqrqrrqqrqrrqrqpqpqpqpoppopoopoponononmnmmnmlkjkjjkkjijihihhihhghgfefededdeddcdcdcbababa`a`_^]^]^]\]\[\[Z[ZYZYZYXYXWXWXWVVUTUTS RSSRRQRRQRQPQPOPONMLMML KLKLLKKJKKJIJIHIHIHGHGHGGFGFEFEFEDDEDEDCDCBCBABBA@AA@A@?@?>?>=<=<;<;:;:9989876776776676565434343232321221122101010/0/0/0/././/.-.-.-...-,--,--,-,+,+,,+*+**+*)*)*)()()())(()('('('('('('('JKLKLKLLKLMLMNMNNMNOPOPQPPQPPQRQRSRSTUTUVUVVUVWVWXWWXWXYXYYZYZ[Z[ \[\[\[[\\]\]\\]^]]^^]^_^_^_`__`a`ababcbbcbbcdccdcdededefefgfgffggghghghihijijkjkjklklmlmnmnonoonnopooppoopopqpqpqppqrqrqqrqrqrqrqrqrqrqqrqrqrqrqrqpqpqpononnonmnmnmlmllmlmlkllklkllkjkjijijijihihghgghgfgfefedededdcdcbcbaba`a`_^]^^]^]\]\[\\[Z[[Z[ZYZYXWXWVWVVUTSTSRSRQRQRQPQPPQQPOPONM NMLMLMMLMLLKLKLKKJKJIJIHIHIHGHGHGGGFGFGFEFFEDCDDCDDCBCBABA@A@@A@?>=>>=<=<=<;:9::99878778767656654544543434323212121011011010/00/00/./.--,-,,-,-,+,,++,+*+*+*)*)*)()(()()(()('('('('(KLMLMMLLMNMNONNONOPOPQRQRSRSTSTTUTTUVWVWXWXWXYXYZZYZ[ZZ[[Z[\[\]\\]^_^^_`_`ababcdcdefefgfghihiijijijkjjkkjjklkkllklmllmnmnononopopopopqppqpqppqpqrqr qrrqrrqrrqrqrqrqrqrqr qrqqrqrrqrrqqrqrqpqqpqpqpopononoononmnmnnmnnmlmlklk jkjkjjkkjkjjijihihihghgfgfefedededcdcbcbabbaba`_^_^] \]\]\\]]\\[Z[[Z[ZYZYXWXWVWVVUVVUTSRSRQRQRQPQPQPOPPONONMLMLMLKJKJIJIIJIHIHGHGGGFGGFEFEDEEDCDCBCBABA@A@?@?@?>?>=>==>=<=<;:;:;:99899878878876765654543432321212101101010/0/.-.-.-,+,+,+*+*)*)**)*)*)()()())(()('('(KLKLMLMNMN MNNONNONNOOPOOPQPPQPQRQRSRSTSTUVUUVWVWVWXWXYXYXYZYZYZ[Z[\]^_^_`_`a`ababcbcbcdcdefefefefgfghghihijijjijjijkjkjklklmlmlmlmnmmnnmnmnonononopopoppoopqpqqpqpqrqrqqrq rqrqqrqrqqrqqrqrqrqrqrrqqrqqrqpqpqpqpopopoponononononmnmlmlmmlmlklklkllkjkkjjkjihihihghghgfgfedededdcdcbccbbcbaba`_`_`_^_^_^]^]\]\\[\[Z[ZYZYXYXWXWXWXWVWVVUVVUVUTSRSSRQPOPPONMLMLLKLKLKJKJIJIJIHIHGGFEFEDEDDEDCBCBCBABBA@A@?>?>=>==>= <=<<=<<;<<;<;:;:9:9:989898787876776776545434343212101010/0/./../.--,+,+,+,,+ *++**++*++*)* )*))*))*)*)()(())()()('(('('(KJKLKLKLMLLMMLMNMMNNMNONNOPOPOOPOPQPQRQRRSRSRSSTSTSTUTUVWVWXWWXXWXYXYZYYZZ[\[\]\]]^^]^]^_^_`_`a`a``a``ababcbcdcdeddefeefefefgghghihihijijklklklmllmnmnmnononononopoopqpqqpqpqrqrqrqrrqrqrqr qrqrqrrqqrqrqrqpqqppqpqpopopooponoonoononmnmnnmnmlmmlmlklkjijjijiijjihihihghghgfefededcdcdcbcbababa`a`aa`_^_^_^^]^^]^]\]\[\[[\[ZYZYXWVWVVVUTSTSRQRQPQPQPOPONMLMLKLLKJIJIHIHIHGHGHGGFGGFGFFEFEFFEDEDCDCDCBBCBCBABA@AA@AA@@?@?>?>=>=<==<==<;<;:;;::;:9:99898 7877878776765656545434323212212101010/0/0/0/./.-.--,-,--,+,+,+,+*+*+* )**))*)*)*)()()())('(KLKKLKLKLMNMNMMNOPOPPQQPQPQRSTSTTSTUTTUVUVWVWWXWWXYXYZYZZYZ[Z[[Z[\]^_`_`a``ababcbbcbcdcdedefeefgffggfgghghhihihijijijkjklklklmlmnmmnmmnmmnononopoppopopqpqppqrqqrrqqrqrqrqrqrqrqrqpqppqqpqpqpqppopopoononoonmnnmmnmlmmlklkjkjijijiijihihihghgfgfefededdcdcdcbcbababa`a`_``_^_^_^]^]\]\]\\[\[Z[ZYZZYXWXWVVUTUTUTSTSRSRQRQPQQPOPONONMLMLKLKJKJIHIHGGFGFEFFEDEDCDCDCBA@A@?@?@??>??>=>=<==<<=<;<;<;:;:9:9:998987877876 76767656656543434432332321212121010/0/./.-..-,-,-,+,+,+*+*)*)*)()()()('('(('(('('('(JKLMNMNOPOPOPQPQPQRQRQRRSRSRSTSTUTUTUVWVWXYYZ[ZZ[Z[\]\]^]^_^_`_`a`ababcdcdedefefgfgghghghijijkjklklmlm lmmnmmnnmnnmnononoopopopqpqpqrqrqrrqrqrqr qrqrrqqrqrrqrqrqpqpqpqpqpoppoppopononoononmnmmnnmlmlklkjkjkkjkjijihihghghgfggfgfededcdcbcba` _`_``_``__^_^_^]^^]^]\]\]]\[Z[ZZ[ZYZYXYXWVVUVVUT UTUTTSTSSTSRQPQQPQPOPOPONOONMNMLKJKJKKJIJIHGGFEFEFEEDEDCBA@AA@@A@?@@??@??>?>=>=<;<;:;9:9:99898 98898878788787676565654543432321210/0/0/.//./../.-..-,-,-,-,+,+,+*+*+*)**)*)())(()('('(KLMLMNMNOPOPPOPQPQQRQRSRSTSTSTUVUVWVWXYXYXYYZYZ[Z[\[\]^_^_`_`ababcdcdedefefgfgfgghghghijijijjkjkjjklklklmllmmlmnmnnmmnononoonopopopqpqpqqpqqpqpqrqqrrqrrqrqqrrqrsrqrqrqrrqrqpqpqpqpopoononoononmnmnmmnmlmlklklkklkjkjkjijijhihihghgfgfgfefefedcdcdcbcbaba`a`a`_^]^]\[\\[\[Z[[ZYXYYXYXWXXWWVWVVUVUTUTTUUTSRSRQPQPOPONMNMLKLKJKJIJIJIHGGFGFFEEFEFEDEEDCDCBABA@A@?@@?>?>??>?>=>=>= <=<<==<<;;<;<;:;:9:99878767656545434323212122101010/00/0/0/ ./././/../.-.-.---.-,-,+,+*+*)*)*)())())()('('((''KJKKLKKLKLMLLMNMMNONOPOPPOPQPQRQRSRSRSTUVWVWXYXXYYXYZ[Z[\[\]\]^_^_`__`a`ababcbcdedefefgffgfgfgghghihiihijijiijkjkjklkklmnmnonononopopopqpqpqqqrqqrqqrqrqqrqrsrsrsrsrqrqrqrqrqpqpqpopopononnoononmnmnmlmmlmlmlklkjkjihiihihihhgghgfgfefefeededdcdcbccbcba`a`a`_`_^_^]^]\]\[\[Z[[ZYXYXWXWXWVWVVVUTUTSTSRSRQRQPQPQPONONMNMLMLKLKJKJKJKJIJIHIHIHGHGHGGFFGFEFEDCDCBCBABABBA@A@?@ ?@?>?>>?>?>>=>=<=<<=<;<;<<;:;:;:9::9:989876565654543434434323212121010/0/0/./.-.--.-,-,-,-,+,+,+,,+*++**+*+*)*)*)())(()()('(KJKLKLKLMLLMNMNOPOPPOPQPQRSRSRRSTUTUTTUVUVWVVWXWXYXYZYZYZ[\[[\[\]\\]^]^_^^_^_`__`ababcbcdcdcdedefefeefgffgghgghihiihijijijkjkjklklklmnmmnnmnononopoppopqpqppqpqpqrqrqqrqrqqr srsrsrsrssrsrsrsrqrqrqrqpqpqpqpopopopoonoonononmnmnmlmmllmmlml kllkklkkjkjijiijihihihghhgfefeffededdcbcbababa`aa`_``_^__^_^]^]^]^]\]\[Z[ZYXYXXWXWVWVWVVUVUTUTSTSRSSRQPQPOPOPONMNMLMLMLKLKJIJIHGHGGFGFFGFEFFEDEDCDCDCCBCCBABABA@AA@A@?@?@?>=>>=>=>=<=<;:;:9:9989889876765654545434343233212101010010/./.-.--,-,,-,-,+,++,+,+**+*)*)*)*)()()('('('('('KLKLMLMNMNMMNOPOPOPOPQPQRSRSTSTUTUVWXYZ[Z[\[\]\]\]^]^_^_`_`a`abcdcddcdefeeffeefgfghghghihijijijkjkjklklkllklmlmlmnmnononopopopqpqppqqrqrqrrqrqrsrsrsrsrsrsrsrqrqrqrqrrqpqpqpqqpqpqpopoonononmnmnmlklkklkjkkjijihihihghgfeffedeeddcdcbcbabba`a`_`_``_^_^]^]^]\]\[\[Z[ZYZYXYXWXXWVWVVUVVUTUTSTSR QRQQPQPPQQPOPONOONMNMNMLKLKJKKJIJIHIHGHGGFFGFEDEEDEDCDCBA@A@@AA@?@?>?>??>=>=<=<;<;:;:;:9::9989878877876766556566543434343232121121010/0/0/./.-.--.-,-,+,+*+*+*)*)*)**)()()('('(('(KLKLKKLMLMLMNMNONNOPOPQPPQRQRQRSTSTUTTUTUVWVWXWXWXYZYZ[Z[\]\\]]\]^]^_^_`_`a`a`ababcbbcdcdedeedefeefefgfggghghihhijijkjjkkjklklkklklmlmlmnmnonnoonnonopopqpqqrqqrqrqrsrsrsrsrsrsrqrqrqrrqrqpqpopopooonoononmnnmmnmlmlmlkjkjijihihghhghghgfgfefeefededdcbababa`a`_`__^]\[\[\\[Z[[ZYZZYXWXWVWVVUVVUTUTUTSTSRSRRQPQPOPONONMNMLMLKJIJIHIHGHGGHGGGFGFEDEDCDCBCBABA@A@?@?@@?@?>=>=<=<=<<;<<;<;:;:;:989889987877676765655665454323223212121010/0/0/.//./.-.--.-,+,+,+*+*+**+*)*))**) ())(()()()()('(JKLKLMLMLLMMNNMNOPOOPQPPQPPQRSRRSTSTUVUUVUUVWVWXWWXYXYZYZ[\[\\[\]^_`_`__`a`abcbcdcdcdefefgfgfghghhgghijijjkjkjklklmlmnmnmnononopopqpqpqqrqrrqqrqrqrsrsrssrsrsr srssrrssrrsrsrsrqrqrqrqrqpqpqpqpopopoonoonnonnonmlklkkllkjkji jiijiihihhihgfgfefeefedededcbcbcbaba`_^_^_^]^]\]\[\[Z[Z[ZYZYXYXYXWVVUVUT STTSSRSSRSRQRQPQPONMNNMLMLMLKLLKJKJIJIIHIIHIHGHGGFGFGFEEFEFEDEDCDCBCCBABBA@A@?>=>=<==<;<<;:;:99899898788787676767656565565454343432323232101010/0/0/0/./.-.--,-,-,+,+,+*+*+*)*)()('('('(KJKLKLMNONOPOPQPQRQRSRSRRSTSSTUVUVWVWXWXYXYZZYZ[\[\]\]^]^_`_`_`a``a``a`ababcbccdcddcdedefefgfghghijijkjkjklklmnmnonoonnopooppoopopqppqpqqpqqrqrqrqqrsrsrsrsrsrsrsrsrsrqrqrqpqpopoopopoonononmnmmnmlmmlmllmlklkjkjkjkjijihihhihghgfgfefededdcdcbcbaba`_^_^^_^]^]\]]\[\\[\[Z[ZYXYXWXWVVUTUTSTSRSRSRQRQQRRQPQPON ONMNMNNMNMMLMLMLLKLKJKJKJIJIJIHIHGHGHGGFEDEEDDEDCDCBCBABA@?>?>>=>=>=>=<;<<;:;:;:99889878787676565455434432122121010110/0/0/./../.-.-.--,-,+,,+,+,+*)*)*)()(()()()()('('('('KLKLMLMNMNMONOPOPOPQPQPPQRQRQRQRSRRSTSTSSTUTUTUVUUVWVWWXWXYXYZZ[Z[\[\]\\]\]]^]^]^_^_`_`a`a``ababcdefefgfgg hgghghihihiihhijijijkjjklklkllklmllmnmnonopopopopqpqqpqppqq rqrqqrqqrqrqrsrsrssrsrrsrsrrssrsrrsrsrrsrsrqrqrqrrqrqpqpopoppoponononmnmnmlmlklklkklkjkjkj ijjiijjijiihihihghghgfgfefededdcdcbccbcba`_`_^ ]^]^]]^^]]\[\\[\[Z[ZYXYXWXWVWWVVVUVUTSTSRSRSRQRQRQPQQPOPONMNMNMLKLKJKJJKJIJIHIHGHGGFGFGFEFEDEEDCBCCBCBABA@A@A@?@@?@?>?>=<==<;<;<;:;:;;:9989878778767656545454455454434343233223321212101010/0/././.-.--.--,--,-, +,,+,+,+,,+*+*)*)*))**)()())()()('('('('('(KJKLKLKLMLLMNOPOPQPQRQRSRSTUVWVVWXWXWXWXYXYZZ[Z[[\[\[\]\]^]^ _^__^^__`__`a`ababcbcdcdedefgffgghghihijiijijkjklkklmlmlmlmlmnmnmnonononopopoppoopqpqqrrqqrqqrrqrrqrqrsrsrsrsrsrsrsrsrssrrsrsrqrqrqpqpqqpqqpqpopoopopononmnmmnmlmlmlmmlklkllkklkjkj ijijiihhihihghgfgfefefededddcddccdcbcba`a`_`_`_^]^]]\]\[\[Z[ZYZYXYXYXYXWXWVWWVWWWVUTSTTSRQPQQPONON MNMNMMLMLMLKLKJKKJKJIJIHGGFGFEFEDEEDCDCDCBABABA@A@?@?>?>=>=<=<;:;:;:989878776776 765665565654343434343233232121010/0/0/./.-.-.-.-,--,+, +,++,++,,++*+*+*)*)*)()('('('(JKLKLMLMNMNNMNOPQPPQRQRQRSRSTSTUTTUVUVWVWXWXWXYXYZYZYZZ[Z[\[[\]\]]^]^]^_^_`a`ababcbbccbcdcdcdeddefghgghihihijklklmlmnononopoopqppqqrqrqrqrqrqrsrsrsrsrsrsrsrsrssrsrsrsrsrqrqrqrqpqqppqpqpopopopooponononmnnmlmlklkjkkjkjjkjijijihihgfggfgfefedededcddcdcbcbcbababba`_`_`__^__^]^]\]\\]\[Z[ZYXWXWVVUTUTSRSRQRQRQPQPONMNMNMLMLKJKJKJIJIJIHIHIHHGHHGG FGFGGFFEFFEFEDEDCDCDCBCBABBA@A@?>?> =>==>>=<==<=<;<;;<;:;:99878876565455454323212101010110/0/0/0/0/.//././.-.-,--,+,+,+*++*+*)**)*)*)())(()('('('('('JKLKLKLMLLMNMNMNONOPQPQRQRSTSTSTUVUVWVWWXWXYXYZYYZZZ[Z[\[\[\\]\\]^]^_`__`a`abababcbcdccddcdedefefefgfghghijijklkllkklmlmnmmnonononopoppopopqpqqrqrqrsrsrsrsrsrrs rsrsrssrssrrsrsrsrsrsrrsrqrqrqrqrqpqpqpopoopponoonnonmnmnmlmmlklkjkjkjjkjijijihihghgfgfefedededcdcbcbcbaba`aa`_`_`_^_^]^]\]\[\[Z[[ZYZYXYXYXWVVUVUVUTUTSTSRSRQRRQPQPOPONMNMLMLKLKJIJIHIHGHGHGGGFGGFEFEDEDEDCBABA@A@?@?>??>>?>=>>==>=<=<;<;:;:;:9:9:9987878767656654554343233232121010110/00//0/./.-.-,-,-,-,,-,+,+,+,+*+*+*+*)*)*)()(()('('('(KLKLMLMNMNOPOPOPPOPQPQRQRQRSRSSRSTUVWXWXWXYXXYYXYZZ[ZZ[\[\[\]\\]^]^_^_^__`_`_`a`ababcbbcbbccdcdcdcdeddedefeefgfgffgghghihihhijiijjiijkjkjjklkllklmlmnmnmnonopooppopoopqqrqrsrsrsrsrsrssrsrsrssrssrsrsrrsrsrqrqpqpopononononnmmnmnmlmlmlklklkjkkjjkjijihihghgfgfgfefedcbcbabba`aa`_^]^]\[Z[ZYZZYXYXYXWVVUVUVUUTUTUTSRQPQPONMNMNMLKLKJKJIJIHGHGGFEDEDCDCBCBABABA@?@??@?>?>=>=<;<;;<;:9:998987876765656545434323 232322112121010/./../../.-.--.-,-,-,+,+*+*+*)*)*)()())('('('(KLMNOPQPQRSRSTSSTUTUVUVWVWXYXYZYYZ[\[\]\\]\]^_^_`__`a`abaabcbcdefefgfgfgghihijijkjklklmlmnmnmnonononopopopqpqpqqpqqpqrqqrqrqrsrsrsrsrsrsrsrsrsrsrsrrssrrssrsrqrrqrqrqpqpoppopoopoponononmlmllmlklkkllklkjkjijijijihghgfgfgfefedededcdcbcbababa`_^_^]\]]\]\[\\[Z[[ZYZZYZYXYXYYXXWXWVWVUVUUVVUTSRQRQPQPONONMNNMNNMLMLKLKJKJKJIHGHGHGFGFEFFEDEDDEDCBCBBCBABA@AA@?@?@@?@?>=<=<;<;:;;:9::98989878787654554343432323212121010/0/./..//./.-.---,-,,-,--,+,+*+*+*)*)*)()())()()('('('('((KLMLMLMNONNOPOPQPQRQRSRSRRSSRSTSTSTTUTUVUUVUUVWVWVWXWXYXYYZYZYZZYZ[[ZZ[\[\]^_`__``_`a``aa`abcbccbcdcddcdedede feeffeffgfgfgfghghghihihijkjklmlmlmnmnmnonopopopqpqpqrrqrrqrsrsrsrsrsrsrsrsrsrqrqpqpqpopoononmnnmnmlmlklklkjijjijihihghgfgfefeddedcddcbcbababba`a`_`_^_^]^]\]\[\[ZYZYXYXYXWXWVVUVUTUTSTSRSRQRQRQPOPONONMNMLMMLKLKLKLKJIJIJIHIHIHIHHGGHGGFEFEDEDCBCBCBABA@?@??@?>?>=>==>=<=<=<;<<;<;:;:;;:9:9:898998788767766776565565654554543443432121010010/0/0/./..//.--.-,--,,-,+,+,+,+*++**+*+*)*))*)*)()()('(KLKLKLMNMMNMNONONOPQPQRQRSRRSTSTUTUVWVWXWXYXXYXYZYZYZ[\[\]\]^]]^_^_^^__^__`__`_`a``abcbcbcdccdeddeddefefgfgfghghghijijkjklklkklklmlmlmnmnonnoononopopoopqpqppqrqrqrqrqrsrsrsrsrsrsrsrrsrsrqrrqrqrqrqpqpqpopopoponononmnmnnmnnmlmlklkjkjkjkjjkjijijihiihghghhgfgfgfeffeeffeddcdcbcbcbaba`aa`_``_`_^_^_^_^]^]\[\[ZYZZYZYYXYXWXWXWVVUVVUUVUTUTSTSRQRQPQPQPONONMNMNMLMLKJKJIHIHGHGFGGFEFEDEDCDDCBCBCBABBA@A@?@?>??>=>==>==<=<;<;:;:9:998987878767656545434343232232121010/0/0/./.-..-,-,+,+,+*+*)*)*)()()()()('('('('(KLMNONOPOOPQPPQRSRSTSTUTUVUVWVWXWXYXYXYZYZ[Z[Z[\[\]\]\]^]^]^_`a``a`aa`ababababcbcdcdcdcdedefefgffgfghgghihijkjklkklmlmlmnmnonopoopopqpqpqpqrqqrqrrqqr srrsrrsrrsrrsrsrsrsrssrrqqrqrqrqqrqpqpqpopoonononmlmllmlkllkjkjkjijijjihihghgfgfeffedeedcdcbcbaba`a`_``_`_^__^^_^]^]\]\[Z[Z YZYZYYXYXYYXWXWVWWVUVUTUTS RSRRQRQQRRQPQPOPONONONMLMLKLLKJKJIJIJIHGHGGFEFFEFEDCBABAABA@?@?@@?>=<=<; <;<;;:;;:;;:989898767654 3443433433232321210/0/0/./../.-..-,--,-,-,+,,+*+*+*+*+*)*)*)()()()()('('('('('(KLKLMLMNMNONNOPOOPQPQRQQRSRSTSTUTUVUVVUVWVVWXYXYXYYZYZZ[Z[[Z[[\[\]\]^]^_^_`_`ababbcbcbcdcdededdefefgfgghghhghihhihiihijiijiijkjklklkklmlmnmnmnononoononopopqpqrqrqqrqqrsrrsrsrsrstsrsrrsrsrssrqrqrrqrqrqpqpqpqpoponoonoonmnmnmlmmlmlklklkjijijihiihihgfgfefefedeedcbcbcbaba`_^]\]\]]\[\\[Z[[ZYXWVWWVUVUVUTUTSTSSRQRQPQPONMNMLKJKJIJIHIHHIHGHGGFGGFEFEFEDEDCBCCBABAA@@A@@A@?@?>??>=>=>==<==<=<;<;<;:;:9:99899878876766765656545454344343232122121010/0//0/0/././.-.--.-,-,-,+,+,,+*+*+*++*)*)*)() ()(()()(())('('('('('('(KLKLKLMLMNNMNMMNOPOPOOPQPQRQQRSTUTTUVWVWXWXYXYZYZ[Z[Z[\[\[[\\]\]\]]^]^]^_^_^_`_`a`ababcbcdefefgghghihijijjijkjk lkllkklklmlmnmnmnmnonopopqpqrqrrqrsrsrsrsrssrststsrsrsrsrsrqrqrqrqpqpqpopoopo opoopoononoononmlmlmlkjkjijijihihihghgfgffgfefeddcdcbcba`_`_`_^_^]^]\]\[\[\[Z[Z[ZYZYZYXWVVWVUTUTSTTSTSRSRQRQPOPONNOONMNMNMLMMLKLKJKJJIJJIJIHGHGHGGFGFGFEDEDCDDCBCBABBA@?>?>=<==<<;<<;:9:99898987876765656543432321010/././/./.--,-,+,+*+* )**)**)**)*)())()(()()('('('('(KLMLMNMMNOPOPQPQRQRS TSSTTSTTUTUTTUVWVWXWWXWXYXYZYZYZZ[Z[ZZ[\[\]^]]^]^_^^_^_`_`a`ababcbbcbcdcdcdefefeefgfgfghghghihijijjiijkjkklklklmllmlmn mnnonnonnoonopooppoopopqpqqpqrqrqqqrqqrqrsrsrrsrsrststssttsrsrsrsrsrqrqrrqpqppqpopopoopononnonmnmnmnmlmlklkjkjkjijihiihgfgfefededdcddcbcbbcbaba`_`_^_^]^^]\]]\]\[\[ZYZYXYXWVVUVUTUTSTSTSRSRRSSRQRQPO NONOONONNMNMNMLKLKLKJKJKJIJIHIHIHGGFGFEFFEEFEDEDCDCBCBA@A@?@@?>?>?>=>>=<=<;<;:;:9989878767676565454343432321221011010/0/0/./.--,-,+*+*+**+*)*)*)**)()(()()('('('(KLKLMLLMNMNMNONOPOPOPOP QPPQPQQRQQRQRSRSRSRSTSTSTUTUVUVWVWVWXYXYXXYZYZZ[\[\]^_`_`a`abcbcdedefghghihihijkjklklklmlmnonoononopopopqppqpqppqrqrqqrqqrqr srrsrssrssrsrststsstsrsrsrqrqrrqrqpqpqqpopopononmnmlmlmlklklkjkjkkjjkkjijijihihihghgfgfgfefedeededddcdccdcba`a`_`_^_^_^]\]]\]\[\[ZYZYZYXYXWXWVWVWVUVVUTUTSTSRSRSRQRQPQPONONONMNMLMLKLKJKJIJIHIHGHGFGFEFFEDCDDCDCBCBABABA@A@A?@@??@?>=>>=<=<;<;<;<;;:;;:9:99898787787676565454343433432323212121010/0/./.-..---.-,-,-,+,+,+,+*+*+*++*)*)*)*)()()()('('(('('((KLKLMLMNONNOPOPQRQRQRQRSRRSTSTSTTUTUVUVWVW XWWXWXXWXXYXYZYZZZ[Z[\[\\[\]^]]^_^_`_`a`abababcbcdededefefgfghghihihiihijijkjjkjkjklklmlmnmnmnmonononopoopqpqpqrqrqqrrqrrqrsrrsrsrrsrrssrsrsrrstststststststs rsrrsrsrrsrsrqrqrqpqppqpponononmnmlmlmmlklklkllkjkjijijihihhihghgfgfefededddedcbababa`a`a`_^_^^]^]\]\[\[Z[ZYZYXYXWXXWXWWVWVVUTUTSRQRQPQQPOPONONMNMNMLMLKLLKLKJKJJIJIHGHGGFGFEFFEEFEDEDEDCDDCBCBABA@A@?@@?@?>?>=>=<=<;<;:9:9989878787676566545434323232121010/0/0/.-.-.-,--,,-,+,+*+*+*)*)*))*) ()(()(()())('('(''('('('JKLMLMNMMNONNOPOPQPQRSTSTUVWVVWXWXYZYZZYZ[[Z[Z[\[\\]]\]\]^_^`_`_`a`ababcbcdccdeddededefefefghggghihihijijkjjklklkklmlmlmnmnonnononopoopqrqrsrstststtstsrsrsrsrsrsrqrrqrrqqrqrqpqpqqpoopopononmnmnmlmlmlmlklklkjkjijihghghgfgffggfefedeeddcddcdcdcbcbccba`a`a`_``_^_^]\[ZYXYXWVVUVUTSTSRSRSRQPQPONONONMNMLKLKJKJKJIJIJIIHIIHGHGGHGFGGFGFEDEDEDCDCBCBA@A@?@@??@?>?>?>= <=<<=<<=<;<<;<;:;;:9:99899878877876765654543432323232122101010/0/0/./.-.-.-,-,+,+,++,+*+*+*)*)**)())()()('(''('('KLKLMLMNMNOPOPOPQRQRSTUTUTUVUVWVWXWWXYXYZZ[Z[\]\]^_^_`a`abaababcbcdcdededdefeffefghhgihihijijkjklklmllmmllmnmmnnmnmnonnonnopoppopopqpqppqrqrsrsrsrststsstststststtsrsrsrqrqrqqrqpqppoponoonononmnnmnmlmlklkjkjkjijihihihghhghgfgfefeefefededcdcdcbcbabba`a`a`_`_^_^_^]^]\]\[\\[Z[ZYZYZYXWXXWXWVWVVUVUTUTSTSRSRQRQPQPONONMNMLMMLMLKJIJIHIHIHGHGGFGFEFEEFFEDCBCBABA@A@@A@?@@?>?>=>=<=<;<<;:9:9989878876765655665454343432232122122101010010/0/0/.--.-,-,-,+,+,+*++*+*)**)*)**)())())()()('('('('(KLKLMNMNONOONOPQRSRSRRSTSTUTUTUVUVWVWXWXYZYYZYZZ[Z[\[\]\]^]^^_^_`a`a``ababcbcbcdedefefefgfghhihiihijkjjklklmlmlmlmnmmnmmnopopoppopqrqqrsrsrrssrsrststssttstststtsttsttststtstsrssrsrqrrqqrqpqpqpqppoponon mnnmmnmmlmlmlmlklkjihihghghgfefefededcdcbcbccbaba`_^_^]\[\[[\[Z[ZYZYYZYZYXWVWVVUVUVUTSRQPONONMLMLKLKJKJIHIHGHHGGFGFEFEDEDDCDCDCBCBCBABBA@A@@A@?>?>>?>=<=<;<;:9:99898787677656565454543443343232121010010/0/0/./.-.-.-,-,-,+,+,+*+*+**)*)*)()('(('('(('('('(KLMLMLLMNMNONOPQPQRQRSRRSRRSTUTUVUUVWVWXWXYZYZZ[Z[Z[\[\]\]\]^]]^_^_`a`ababcbcdcdedefefefgfgfgfgghghihihijiijjijijkjkjklkklmllmmlmnmn ononnononnopopqpqqpqqpqrqqrqrrrqrsrsrstststststtsttststsrsrssrrsrqpqpqqpopopononmlmllmlklklkjkjkjihihghghgfgfefefeddcdcbcbcba`_^__^]^^]^]\]]\[\[Z[[Z[[ZZYZYZZYXXYX WXWXWWVVWVVWVUVVUTSTTSRSRQRQPQPOPONONOONMNMLMLKLLKLKJIHIHGHGGGFGFGGFFEFEEFEEDEEDCDCBCBABABA@A@AA@?>=<==<;<;:;:9:9:9989878788765454343232121210/0/./.-..--.-,-,+,+,+*+*+*)*))*))*)()()('(KLKLKLMNMMNMMNONONOPOPQRQRSRSTSTUTTUVUVWVWXWXYZYYZZYZZ[Z[\]\]\]^_^^_`_`abaabcdcdedefeefefghgghghihihijijkjkjklklmlmnmnonopopopopopopqppqpqrqrrqrrrsrssrrsrstststststtstsstst stsstststtsrsrqrqrqpqpponoonoonnonmnmnmlmlk jkkjkjjkjkjijihiihihghghgfgffefedeedcdcddc bcbbcbbababa`a`a`_`_`_^_^]^]\]\[Z[ZYZYZYYXYXYXWVWVUVUTUTSTTSTSRSRSRRQRQPQPOPPOPONONMNNMLMLMLMLKJKJKJKJIJIJIHIHGHHGGGFGFEDCDCD CDCBCBCBBCBA@A@@A@?@?>?>=>=>=<=<;<;<<;:;:9:99::999878767676767656545454323223212210101010/0/0/.--,-,-,-,-,+*++*)*)*))*)())()('('('('('(KLMLLMLMNMNMNONONNOPOOPQPQRSRSTSTUVUVUVWVVWXWXWWXXYXYZYYZ[ZZ[\[[\[[\]\]]\]^]^]^_^_`_`a`a`abbabcbcdcdcdededdefeefgffgh hghhghhihhijiijkjkkjklklmlmnmnmmnononopopopopqpqpqrqrqrqrsrssrssrsrststtststtststs tstsststsststsrsrsrqrqqrqpqpqpqpoopopononoonmnmlklkjkjijihihghghgfgfggffgfefedeedeedcdcbcbabba`aa`_`_`__`_^]^]\]\\[\\[Z[[Z[ZZYZYXYXYXWXXWVWWVVVUVUTUTSRSSRRSRQRQRQPONONMNNMNMLKLLKLKJKJIJIHGHGGGFGFEDEDCDCBCBABBABA@A@?@?>?>?>=>=<=<;:;:99889898 787887866776765454454343232101101010/0/00/0/.//../.-..-.--.--.-,-,+,+,+,+,+*+*)*)()()('('('('(('('((KLKKLMNMMNONOPOPQPQRSTSTUVUVUVWXWXWXYXYZZ[Z[\[\]\]^]^]^_`_`a`abcbbcdeddeeddefefgfgfghhghihhiihijijkjjklmllmlmnmnnmmnonononopopopqpqppqrqrqrrqr srrssrssrssrrststststssttsstststststsrsrsrsrqrqrqpqppqpopoponoonnonmnmlmlklkjkjkkjkjijijihihgfgfefefededdedcdccddcbaba`a`a`_^]^]\]]\[\[Z[[Z[Z[ZZYZYXYXWXXWVWVVUVVUVUTUUTS RSRRSSRQRRQRQPQPOPOPOPONMNMLMMLKL KLKKJKJJKJKJIJIHIHGHGGFGGFEDCDCBCCBCBA@A@?@?@?>?>=>=<=<;<;:9:99898787887676565565454543432321010/0/0/0/.//.-.-,-,+,,++,+*+*+*+*)*)()()('(('('('(('('KLKLMLMNMNOPOPPQPQRQQRSRSSRSSTSTUTUTUVUUVVWVWXWXWXYXYXYYZYZYZYZ[\[\[\]^_`_`a`a`ababcbccdcddcdeddedefefgfghghijijkjjkjkjjklklmlmnmnonoononopoopqppqrqqrsrrsrsrststststtststststtstsrsrqrqpqpqpopoppopponononmnmlklkjkjijiijihgfggfgfgfefeffedeedeedcdcdcbcba`_`_``_^_^]\]]\[\\[Z[ZYX WXXWWVWVVWVWVUVUVUTSRSRQRQQRQPONONMLMLKLKJKJJKJIJIIJIHGHGFGFGFEFEDEDCDCBABAABA@AA@?@?>??>?>=>=<=<=<;<;<;<;:;:9:9987876765654343232232121210110/./.././.-.--.--.-,--,-,,+,+*+**+*)*)**)*)()()())()('(KLMNONNONOPQPQRQRSRRSTSTUVUVWXYXYZY[ZZ[Z[Z[\[\]\]^]]^^]^_^_`_`ababcdededefefefgfggffghghihihhihiijijklklmlmlmnmnmnmnonoonopqppqrqrrqqrqrsrsrsrsrststststststststststsrsrrsrqrqrqpqpopopoppopononononnmnmlmlklkjkjkjijihghgfgfeffededdcbababa`aa`aa`_`_^_^_^]^]\]\]\]\[\[\[Z[ZYXYXWVUVUVVUVUTUTSTSRQPOPONONONMNNMLMLKLLKJKKJKJIHIHIHGHGGFGFEFEDEDDEEDCBCCBABA@A@?@@?@?>=>=<=<;:;:;:9:98989987877877876765654554343434323212101010110/0/././/./.-.--.-,--,+,+,+,+*+*)*)*)*)()('('('(KLKLMNONOPOPQPQRSRSTSTTSTUTUVUUVUVWVWXWXYXYZYZYZZZ[Z[\[[\\[\]\]^]^_`_`_`a`ababcbcdccdcdedefefghhihijijijkjklkklmlmnonnoonnopopqpqpqppqrqrqrsrsrrsrststsstststststtsstststsrsrsrrsrqrqrqrqqrqqrqpqppoppooponononmnmlmlklkjkjijihghgfgfefeefedededcdcdcbcba`a`_`_^__^]^]\]]\\]\[\\[Z[ZYZZYZYXYXWXXWVUVUTUTSTSSTTSRQPOPOOPOONONMLMLKLKJKJKJIJIIHIHGHGFEDEDCBCBABA@A@?@?@?@?>?>=<;:9:99899889876765654343232121010/0/0/0/./../.-.- ,--,-,--,,-,+,,+,,+*+*+*+*)*)*))*)*)()()()('('(KLKLMLMLMNMNOPOPQPQRQRQRSRSTUTUVUVUVWVVWXWXYXXYYXYZYZZ[ZZ[\]\\]^_^^_`a``abcdedefefef gffgfghghghhgghihihihijiijkjklklmlmnmnnmnononopopqpqppqpq rqqrqqrqrrr srssrssrsrststststststststststs rsrsrsrrssrsrqrqpqpqpopopooponononmnmnmnmlmlmlklklkjkjijjihihghgfgfgfefedeeddedcbccba`_`_`_^]^]^^]\[\[Z[[Z[ZYZYXWXWXWVVWVVUVUTUTSTTSSTSRSRQPOPONONMNMLMLKLKJKJIJIHGHGFGGFEFEFFEDEEDCBCBABA@AA@?>??>=>=<=<=<=<;<<;:;:;:9987877876765454323233232121010/0/0/./.-.-.-,-,-,+,+*+*)**)*)*)*)()()('('('(KLKLMNMNONOPOPQPQRQQRSRSTSSTSTTUTUTUVUVWVWVWXWXWXYXYXYZZ[\[\]\]^]^_`a`a`abcbbcdcdedefeefefgfghghghihhijijkjklklmllmmlmnmnmnononopopopqpqrqqrrqrrqrqrsrsrrsrrstssttststststststsstsrsr qrqrrqrrqqrqpqpopopponononmnmnmlmlmlkjkjkjijijihiihihgfgfgfefefeedeedcdcbcbcba`a`_^_^]^]]\]\[\[ZY XYXYYXYXXWXWVUVUTSTTSRSSRQRRQPQPOPOPONONMNMLMLMMLKLKKJIHIHGHGHGFGGFEFFEDEDEDCDCBABA@AA@?@@?@@?>=>==>=<;:;:9::998987677676565432321210/0/0/0/././.-..--.-,-,-,+,+,+ *++*+*+**+* )**)**)*))*)*)()()(()( '(('('(('('('('('KLMNMNMMNMNONOPOPQPQRSRSTUTTUVUUVVUVWVWXWWXYZYZZ[Z[\[\[\]\\]^]^_^_`ababcdcdefefghgghhghijkjkjklkklmlmlmnmnmnonnonopopqpqpqrqrqrqrrsrstststststststsrssrrssrqrqrqpqqppononononmnmnmnmnmlmlklklkjkjijjihih ghgghhgfgffgfeffeddedcdcbccbababa`aa`_`_`_^]^]\]\[ZYZYXYYXWXXWVWVUTUTSTSTSRQRQPQPOPONMNMLKLKKLKKJKJKJIJJIHIHGHHGHGFGFEDEDCDCBABBAABA@ A@@A@@?@??@?@?>=>==>=<=<;:9::9:99878767676565654545432323323321212101010/0/././.-.-..---.-,-,-,+,,++,+*+*)*)*)()()('('(KLKLKKLMLMNOONONOPQPQRQRRQRSRRSTSTUTUUVUUVWVVWWXWXWXYXYZZ[\[\]^]^ ]^_^^_^__^_`__` a``a`aa`ababcbcdcdcdedefefefgfghhihijkjkkjklklmlmllmmlmnmnmnonopopopopqppqrqrrsrststststststsststsrssrsrsrqrqrqrqpqqpqqpoppopopoopononoon mnmnnmnnmnmlmlklklkjkjjkkjijijihihiihghghgfgfeffedeededcbcbaba`a``_`_^_^_^]^]\]]\[\[Z[ZYZYXYXWXWVVUVUVUTUTSTSRSRQRQPOPONONONMNNMLKLKJKJJIJIJIJIHIHGGFGFEFEEDEDCB CBAABABAABA@A@A@?@?>?>=<=<==<;<;:9:998988987676565654543233232121210/0/././../.-.-.---,-,-,-,+,+,+,+,,+*+*+*)*)*))*)*)()()(()('('('('(KLKLMLLMNMNOPOPQPQRQRQRSRSTSTUTTUVUUVUUVWVVWXYXYZZ[ \[\[\\]]\\]^_^_`_`_`a`ababcbcbbcdcdedefefeefefgfghghgghihhiihijijkjkjklklklmlmnmnmnonnonopopqpqrrsrsrrssrsrststtststststtststsrssrsrsrqrqrqrqpqpqpqpopoponoonnoonmnmlmlmlklklkjkjkkjkjijijihiihgfgffefeddedcdcddccbcbabba`a`_^]^]\]\\]\[\[Z[ZYZYXWXWVWVVUVVUTSTTSRQRQPOPPONMNMNMLMLKLKJJKJIJIHIIHGHGFEFEDEDCDCBCBABA@A@?>=>=<=<;<;<;:;;:9898787676 566566554543434323212101011010/0/00/././.-..--..-,-,-,-,+,,++,+,,+*+*)*)()()('('('('('(JKLKLMLMMNMNONONOPQPQQPQRQQRQRSTSTUTUVWVWXWXYXYZYZZ[\]^]^]^_`__`a`abaabcbcdeddefefefefghhghihijijkjklkkllklmlmmllmnmnnmnonnopoppop qppqpqqpqpqqpqrqqrrqrrsrsrsrststtststststsrsrsrssrqrqrqqrqpqqpqppopononmlmlklkjkjijihihghghgfgfefedeedcdcdcbcbaba`a`a`_`_^_^]^]\ [\\[\\[[Z[Z[[ZYXYXWXWVWWVVUTUTSTSTSRSRQRRQRQPQPOPOOPONONMNMMNMLMMLMLKJKKJIJIHIHGHGGHGFEFFEDEDEDCBCBBABABA@AA@?@?@@?>?>=<=<;:;::;:9:99989876767765654543432323212121010/.//..//.-.--,+,,+,+*+*)*)**)*)()()()(()('('('(KLKKLKLMLMLLMNMNNMNOPOPQRQRSTSTUTUVWVVWWVWXYXYZYZZ[Z[\]\]^]^_^_`_`_`a``a`ababcdcdccd eddeedeefefefefgfgfghghghijijkjklmlmnmnmmnmmnononopopopopqppqqpqrqqrqrrqrsrsrststststutututsttststsrsrsrsrqrrqrqpqpqqpqppopoopononmnmlmllmlkjkkjijihihgfefefeddedcddccdcbcbabba`a`a`_`_^]^^]\]\[\\[[\[Z[ZYZYZYXWXWVWWWVUTUUTUTSTSRSRQPQPOPONOONMNMLKLKKLKJKJIHIIHGGFGFEDEDCDCBCBABBA@AA@@A@?@?>=>=<==<=<;<<;:;;:;:9:9:9:9987876767656654543232121011010/0/0/./.-.-.-,--,,-,+,,+,,+,+*+*)*)()()())())('('('('('(KLKLKLMLMNMMNMNMNONOPOPQPQPQRQRSRRSTSTUVUVWVWXWXWWXYZYYZYZZ[ZZ[\[\ ]\\]\]]^]]^^]^_`abaabcdcdedefefefgfgfghhihijijkjkjklmllmmlmnmnmnopopqpqpqqpqrqqrrqrsrsrststststtstututststtsrssrqpqpqpopoppoponmnnmnmlmlklkjkkjijijihiihihghghgfgfggfeffeefeddcdcdcbcbcbabba`a`a`_^_^_^]^^]\]]\[\[Z[ZYZYZYZXYXYXXWXWVWVUTUTUTSTTSRSRSRQRRQPOPOPONONMNMLKLKJKKJJKJIHIHGHGGFGGFEFEDCDCBCBABA@A@AA@?@@?>?>?>=>==>=<=<==<;<;<<;:;:9:998987876565454323232121010/0/./././.-..-..-.-,--,+,+,+*+*+*)*)*)()()()('('('(KLMLMNONOPQRSRSSTSTUVWVWXYXYZYZYZZ[Z[\[\]\]^]^_^_`__`ababcdccddcddededefgfghgghijkjkkjjklklmlmnmnmnonopopqpqpqqpqrqqrrqrr srrsrrsrrsrrs tststststtstutututtututststs rsrssrrsrrqrqrqpqqppqqpoppononmnmlmlklklkjijijihghgfgfefeefedededcba`aa`_^__^_^^]^]^^]\[\\[\[\[[Z[ZY XYYXYXXYXWWXWXWVWVWVUVVUTUTSRSSRSRRQRQPQPQPONONNMMNNMNMLMLMLLKLKJKJIJIHIHGHGGFGGFEFEFEDEEDEDCDCCDCBCBABBA@A@A@?@?@?>??>=>>=<=<;:;:;:9898787656545543443343232332121010/.//./.-.--.-.-,-,-,+,+,+,+*++*+*+*)*)()())()('('('('('('(KLKLMLLMLMNMMNOPOPQPQRQRQRSRSTUTUTUVUVUUVUVWXWXWXYXYYXYZZ[Z[\[\]\]^]^_^_^_`_`a``ababaabcbcdccddcdedefefgfggfghgghghghihhijijkjkjjklklmlmnmnmnonnononopopopqrqrrsrrssrsrststststututststsrsrqrqrrqpqqpqppopononmnmnmlklklkjkjkjijijijihihihgfgfeffedeededcbcba`a``a`_`_`_^]\[\\[[\[ZYXYXWXWWXWVWVUVUTSTSRSRQRQPOPPONMNMLMLKLLKLKJIHIHHGHGGFGGFGFEDCDDCBCBBCBABA@A@@A@?@?>?>=>=>=<;<;:;:;9:9:99898987677656556654543432121010/0/0//0/0/.//./.-.-.---,-,+,+ *++*++*+**+*)**)*)**)()()('('('('(KLMNMMNONOPOPQPQPQRSRSTSTUTTUVUVWVWXYZYZZYZZ[\]^]^]]^_^__`__`a``aa`abcbcdcdededefefgfghihiihijijkjkkjklkklmllmlmlmnmnmnonnonopopopopopqpqrqrrsrsrssrstststututststststsrsrqrqrrqpqpqpqpponononmnmnmnmlmlmlmlklkjijihihhihghgghgfgfeedcdcdccbcbbc bcabababbaba`a`_`_^_^_^]^]^]\]\\]\]\[\[\[Z[[ZYZYXWXXWVWVUTUTSRQRQPQPOPOPONONMNMMNMLMMLKLKLLKJIJIJIHGHGFGGFEFEDCDCBCBABA@A@?@?>?>=>=<=<;<;<;<;:9::9:998788788767656545434323233212121010010010/0/0/./././.-.-,-,,--,+,,+,+*+*)*)()()()('('('('('('JKLMLMNMNNMNOPOPQRSTSTUTUVWVVWXWXYZYZZ[Z[\[\]^]^]^_^^_^^_^_`ababbabcbcbcdcdededdefefefgfghghghhihiihhijijjkjklkklklmnmnnmmnonnonopopqpqrqrqqrrrsrstuttututututsrsrqrqrqqrqpqpopopononoonmnmlmlmlmlklkjkjkjjijjiijihihghgfgfefeefeededededcdcbccbababa`a`a`_`_^__^]^^]\]\[\[\[Z[[Z[ZYXYXWXWVVWVVUVUVUTUTTUUTSRQPQPOPONMNMLKLKJIJIHIHHGGFEFEFEDEEDCDCBCBBCBA@A@?@@?>?>=>>=<==<;:;:;:99889889878767765656556545445432323212121121010/.-.--.--.-,--,-,+,+,+*++*+*+*)()('('('(KLKKLKLMLMNMMNONNOPOPQPQPQQRQQRSRSTUTUVUVWVVWXWXYXYXYXYZYZZ[\[\]\]^]^_^_^_`_`a``abaabcdccdcdedeedefghghihijijkjkjklklmllmnmnonnoonopopqpqppqrqrrsrssrststst uttuuttutututstststsrsrqrqrqrqpqqpqqpqqppopononmnmnmlmlklklkjkjijihihhiihghghgfeffededcdcdcdcbaba`a`_`_ ^_^^_^^]^]^]^^]\]\[\\[Z[ZYZYXYXYYXWXWVWVVVWVVUVVUTUTUTSTTSRSRQRQPQQPOPONMNMMNMLMLKLLKJKJIHIHGHHGGFGFFGFFEFEFFEDEDCBCBABABBA@?@?>?>>==>=<;<;:;:;:9::9:9::998998998767654545443432321221210/0//00/./.-..-.-,-,-,,-,+,+*+*+*)*)*)*)())()('('('KLKKLKLMLMNMNNMNONONOPOPQPQRSRSTUTUVUVUVWVWVWWXXWXYXYZYZZ[Z[\[\ ]\]]\\]]^]]^_^_`a``abcbcdcdcdcdedefefgfgfghghghihijiijijijklklmlmlmlmnmnmnmnonononopqpqpqrqqrqrqrqrrsrsrstststststututtututststsstsstsrsrsrsrqrqqrqrqrqpqqpopoppopononononmlklklklkkjkjkjijjihihghgghhgfgfededcdcbccbaba`a`_`_^]^^]\]\[Z[ZYZYXYXWXXWVWWVVUVUTUTSTSRSSRRSRQRQPQPQPPOPONMNMMNMLKJKJIHIHGHGHHGFGFEFEDEDCBCBABA@A@@A@?@?>?>=>>=<=<=<;<<;<;:;:;:998987887887656545432332321212101010/00/0//0/././/.-.-,-,-,--,-,+,++,+*+*+*+*)**))*)())()()('('('KLKKLMLMLLMNMNMNONOOPOPOPPQPQPQRSTSTUTTUVUUVWVWXYZYYZYZYZ[Z[[\[\[[\]^_^_ `_`_``a``aa``abaabcbbcdcdefefgfghghijiijkjkjjklklklmlmnmnmnonnopqpqppqrqrqrrsrsrsrststutututststsrssrrsrrsrqrqrrqrqpqpqqpqpqpppoppopopononmnmlmllmlklklklkjkjkkjkjijihihihghgghgfggfgffgfefeedeeedcddcbcbbccbabaabaa`a`a`a`_^_^]^]^]\]\]\[\[Z[ZYZZYXYYXWXWWVWWVVUVUUVUTUTSTSRSRQRQPQPOPONONMNNMNMLMLKLKLKJKJIJIHIIHGHGGFEDEDCBCBCBABABA@A@@A@?@?>?>=>>==>=<;:;:9:99:98989898877887676765654543432322321211210/0/0/./././.-.-.-.-,-,-,+,+,+*+*++*+*)**)*)*)('(KLKLMLMMNNMNMNOPQPQQPQRQRSRSTUTUVWVWXWWXWXYXYZYZZ[Z[\[\]^]]^_^_`_`a`abaabcbcdeddeedefeffgfgfghgghihijiijkjklkkllkklmllmmlmnmnmmnonoononopopopqpqpqrqrrsrsrststststtstuttutututututstssttststsrsrsrqrqrqrrqpqqppqppoponon mnmmnmlmlmllmlklkllklkjkjijihihghgfgfefefeededdedccdcdcbcba`a``_`_`_`_^_^]^]\[Z[Z[ZYZYZYXWVWVWVUVUTUTSTTSTSRSRQRRQPOPONONMLMLKLKKJIJIHGHGGFEFEDEEDCDDCBCBCBABBABA@A@?@@?@??>??>?>>=>=>=<==<=<;<<;:;;:;:9::99:999898787656545455434434323212121010/././.-.-.-,-,-,+,,+,+,+*+*++**+*)*)*)()()()()('(('('('('(KLKKLMNMMNOPQPQPQRQRSRSTUTUTUVUVWVWXWXXWXYZYZZZ[ZZ[Z[\[\]\]\]]^]^]^_^_`_`a``a``aabababbabcbbcdccdededefefgfgfghghhghihijiijkjklklklklmllmllmnononnopopqpqpqpqqpqqrqqrqrqqrrsrsrstssttstst ututuututuuttututststsrsrqrqpqpqpqppoponononmnmnmnmlmlmlklkjkjijihihihgghgfgfefeddedcdcdcbcbabaa`a`_^]^^]^]\[\[[\[Z[Z[ZYXWXWVWVWWVUVVUVUTUUTSTSRSRQRQPQPONOONONMNMMLMLKLKJIJJIHIHGHGGFEFEDCDCCDCBCBBCBABABA@?@@?>?>=>=>=<=<;<;<;:9:998989989878765655665434323232121010/0//0/././/./.-.--.-,-,+,+,+,+,+*+*+*)*)()()()()()('(KLMLMMLMNMNNONOPOPQPQRSRSTSTUVUVWVWXWWXYZYZ[Z[\]^]]^]^_^_`__`a`abcdedefefefghghihijijijkjklkkllklmlmlmnmnmmnmnonono pooppopoppopqpqpqqpqpqrqrqqrrsrsrsrsrststutututututsttststsr srrqrqrrqrqpqpqppopononnonmnmnmlmlmlklkjkkjjkkjijihihihihghgfgfefefededcddcbcbcbaba`a`_``_^_^]\]]\]\[\[\\[ZYZZYXYXWVWWVUVUTUTSTSRSRRSQQRQPQPOPOPOOPONONNONMNNMLMLKLKJKJKJIJIHIIHGGFGFGFFEFEDCBCBA@A@A@?@@?>??>=>=<=<;<;:;:9:9:998987676765656545432323212212101010110/0/00/0/./.-.-.-,-,+,+,,+*++*)*)()()('('((''(KLKLMLMMLMNMNONOPOPOPQRSTSSTSTUTUVUVWVWXWXYXYZYYZZYYZZ[\]\]^]^_^^__^_`a`ababbabcbcdccdededefefefgfghghghihihijijijkjklklmnmnonononopopqrqrrqrrrsrsrrssrststtstuttuttutututsttsrsrsrsrqrqpqppoppopononmnmlkllklklkjijjiijiijiihiihihiihghgfggfefedededcdcbccbababa`a`_^__^^_^]\]\\]\[\[Z[[Z[ZYXYXWXWVUVVUTUTSTSRQPQQPQP OPPOONONNONMLKLKJIHIHGHGGFGFGFEDEEDEDCDCBCCBABBA@A@?@@?@?>=>=>>=<=<;<;;<;<;:;:9:989878876765654543432332121010/0/00/0/././../.--,-,+,,+,+*++*+*)*)*)()())()(KLMLMLLMNMNOPOPOOPQPQRQRQQRRSRSTSSTUTUVUVWVWVVWWXWXYXXYZYZZ[\[[\[[\[\\]\\]]\]^]^_^^_`a`a`ababcbccbbcdccdedededefeffefgfgffghghhhghihijiijijklmlmllmnmnononopopoopqpqpqpqrrsrsrststsststututtututsttstsrsrrssrsrqrqrqrqqpqpqpqpopoppoppononononnmnmlmllmlklklkjijihihghghgfgfededeedcdcdcba`a`_`_^_^]^^]\[\[[Z[ZYZYXYXWXWWVUVUVUTUUTSTSRSRQRQPQPONOONNONMLMLKLLKJKJIJIHIHGGFEFEDCBCBABA@A@AA@?@@?>=<=<=<;<<;:;:;:998787656545434432321210110/0/././.-..--.--,-,-,+,+*+*+*)**)*)()('('('('(KLMLMLMNMNOPOPQRQRSTUVUVWXWXYXYZYYZZYZZ[Z[\[\]\]^_^__^_`_`_`_`a`abababcbcdcdeddedefefghgghihihijiijkjkjjklklmlmmllmnmnmnmnonopopopopqpqpqqpqrqrqrrstststututtutututstststsrsrsrqrqpqpqppononnonmnnmlmlklkjkjkjijihghhgfgfedeeededcdcdcbccbabbababa`a`_`_^_^__^]\]]\]\[Z[ZYZYZZYXYXWXWWXWXWVVUVVUTUUTSTTSRSRQRQRQPOPOPOONNOONMNMLMLMLKLLKJKJIJJIIJIHIIHIHGHGGFGFGFEFEDEEDEDDEDCBCBA@A@?@?>?>=>=>>=<==<;<;:;:;:9:99899878767677656545434343212210/0/0/./.-.-.-,-,-,-,,-,+,+,,+*+*+*)**)*)())(()()('(('('(KLKKLMLLMNMMNONONOPQPQRQRSTSTUTUVWVWXYXXYZZ[Z[\[\[\]\]^_^_`_`a`ababcbcbcdcdedeedefefgfghhghihhiihijijiijkjklklmlmlmnmnnmnmnonopopqpqpqppqqpqrqrrsrrsrstststututstststssrsrqrqrqrqpqqpqqpoopopooponoononmnmnmlmlklkjkkjkjkjihiihhiihghgfefedededcbcbabbaba`a`_`_`_^_^]\]\\]\[\[\[Z[Z[ZYZYZYXYXWXWXWVWWVVWVUTUTSTSTSRSRQPQPOPOOPONONMNMLMLKLKJIJIHGHGHHGHGGFGFEFEDEEDCDCDCBA@A@?@?>?>?>=<;:;:9:9989878767767667765654343232121010/0/0/././../.-.-,--,-,+,+,+,+*+*)*)*)()())(()('(KLMLLMMLMNMMNONOOPOPQPQPPQRQSRRSRRSTSTUTTUVUVWXWXXYXXYXYZYYZZ[ZZ[\]\]\]^]^_^_`_`a`abcdcdedefghghghihijijkjkkjklklmlmlmmlmnmnnmnopopqpqpqrqrqrrsrssrstsstsstststuttuttuutsttstsstsrsrsrqrqrqpqpqqpqppopononmnmlmlklkklkjijihihghghgghgfefeffeffedcdcdcdcbcbcba`_^]^]^]\]\]\][\[\[Z[ZZYZYXWXWVVUVUTUTSTSRSRQPOPOOPONONMNNMLMLMMLKLLKKLKJKJIHIHGHHGGGFGFEDCDCBCBA@A@?@??>?>=<=<<;<<;:;:;:998989878787676765654545454343433223212121 0101010100/00/0/./././-.-..-.--.-,--,-,+,+*+*+*+*)*)()('('('('(KLKLKLMLMNOPOPQPPQRSRSTSTUTUVWVVWVWXYZYZZ[\]\]\]^]^_^_`a`abababcdccdcdcdededefeeffefghhihhijijklklmnmnononopopopoopqppqqpqrqrqqrqrqrsrsrststststututututstststsstsrsrsrsrrsrrsrqrqpqqppqppopopopononmnmlmlklkklkjkjijihihihghgfggfedeedcdcddcbcba`_^]^]]\\]\ [\\[\[[Z[[ZYZYXYXWVWVWVVUVUUVUTSTSTSRQRQPQPONONMNMLMLKJKJIHGHGG FGFGFFEFFEFEDEDCDCBABBA@A@A@?>=>>=<;<;:;:9::99898767656545434343233233212212101010/0/0/./.-.---.-,--,--,--,+,++,+*++**++*)*)*)())()('('('('('((KLKLMLMNMNMMNONONOPOPQPQPPQRQRQRSTSTTUTUVUVWXWXWXYXYZYZYZ[Z[\[\]^]^_^_`_`a`abcbcdefeefgfgfgghghgghihhijijijjijkjjklklmllmmlmnmnonopopoopop qpqppqppqpqrqqrqrrqrrsrsrsrssrrststsstututstststsstsrsrqrqrqpqpqppqpopopononononmnmnmnmlmlmmllmmlklklkjkjkjijijihihihghghgfgfgffeffefeddedcdcbaba`aa`_^_^]\]\[\[Z[ZYZYXWXWVWWVUVUTUTSTSSRSRSRSRQRQPQQPONONMNMLMMLLMLKJKJIHIIHGGFGGFFGFEFFEEFEDEDCBCBCCBA@A@?>?>?>=<=<;<;;<;:;:;:9:989898787676565654545434343432321221010/0/0/././.-.-..-,-,-,+,+,+*+*+**+*)*)*)()()()('('('('('('KLMLMNMNMNONOPOPQRSTSSTUTUTUTUVUVWXWWXWXXYXYZZ[Z[\[\]\]^]^_^_`__`__`a`a`abcbcbcbcdefeffefgfghgghihijiijkjkjkjklkkllklklmlmlmnmnmnnmnononopop qppqppqqpqqpq rqqrqrqqrqrsrsts tststtsststststsstts rsrssrssrrsrqrqpqpqqppoppopononoonmnmnmnnmlmlmlklklkjkjjkjijihihihghgfgfgfeffeefeddcdcdcbcbababba`_`_^__^]^]^]\]]\[Z[ZYZZYYXYXYXXWXWWXWVWWVWVUVVUTUTTSTTSSTSRQRQPQPONONMLKLLKLKJKKJKJIHIHIIHGHGFGFEDCBABAABA@A@@A@?>?>=>=>==<<=<=;<;<;<<;:;:;;:9:9:9989878876767656565545454543232121010/0/0/./.-..--.-,-,+,,+,+*++*+*)*)**)()(()('('('('((KLKLMNMNONOPOPQRSRSRSTSTUTUVUVWVWVWXWXYXYZYZZ[ZZ[[Z[\]\]\]^]^_`_`a`abaabcbcbcdcdcdefefgffghghihihijijijkjklklklmlmlmlmnmnononnopopopqpqqpqrrsrsrsrstststststutsttstststsrsrsrqrqrrqpqppoopopopononononmnmlmlklkjijjijihihghghgfgfefedcbcbaba`a`_`__`_^]^] \]]\]\\]\[\[\[ Z[[ZZYYZZYZYXYXWVWVWVUVUTUTSTSRSSRSRQPQPQPOPONONMNMLKLKJKJIJIHIHHGGHGHGGFGGFGFEDCBCBABA@AA@?@?>??>>?>=>=<=<;<;<;:;:9::9:9989899876765655654543443432121211011010/0/00/././/././.-.-.-.-,-,+,+,+*+*)*)*)()('('('('('('((KLKLMLMNONOPOPQPQPQRSRSRSTSTTUTUVUVWVVWXWXYXYXYYZYYZZ[Z[ZZ[\[[\]\\]^]^_^_`__`_`a`ababcbbcdcddcdefgfghihijijkjklkklkklmlmnmnmnonononopoopqpqpqrqrqrrsrstsststststutsttsttstststsrsrsrqrqrqrrqpqpqpqppqpopopopponononmlmlmlklkjkjkjijihihghghgfgfefefededdedcdc bcbcbbababba`a`a`_^_^_^]^]\]\[\\[\[Z[Z[ZYXYXWXWXWWVWWVWVUVUTUUTUTSTSRSRRQRRQRQPOPONOONMLMLKJKJKJ IJIIJIIHIIHHIHGGFGFEFEFFDDEDEEDCDCBCBA@A@A@?@?@?>?>=>=>=<=<==<<;<;:9:998987876776565454545432323232212121010/0/./././.-.-.-,--,-,,-,+,+,+*+*+*)*)()()('('('(KLMLMNONOPOPQPQRQRST STTSTTUTUTUVUUVVUVWXWWXYXYZYZZ[\[\[\]]\]\]^]^_`_`a`a`abcbcdcdedefgfgghijijjiijijkjklklmlmlmnmmnmnonopopqrqrqqrrsrsrststtstststtssttstsrsrrsrqrqrqpqpqppoppooppononmnmlmlklklkjkjijijihihgfefefeddedcddcbaba`_`_`_^_^]^]\]]\]\[\[Z[[Z[[ZYZYXYXWXWXWVWVWVUVUTSRSRQRQPQPOPOPONMNNMLMLKLKJKJIJIHIHGHGGGFGGFGFEFEDEDCBCBABA@A@?@?>?>=>=<=<=<;<;:;::9:99898998788787676776565665454545543432323212121010/0/./.-.--,-,+,+,+,+*+*+*)*)()()('('('(KLKLLKLMLMNMNMNOPOPQPPQRQRSTSTUVUVUVWVVWXYXYZYYZYZZZ[\[\]\]^]^_^_`abcbcdcdcdededefefgfgfghgghhghihijijkjklklmlmnmmnmnonoonono poopoppopoppopqppqqpqrqrqrrsrssrsrrstsststststststtstststsrsrqrrqrrqrqpqpopononmnmlmlmlkllkjkjijijihihihghghgfgfefededdedcbcbcbababa`_`_^]^]\]\]\[\\[Z[Z[ZYZYZYXWXWXWXWVVWVUVUTUTSRSRQPQPQPONOONMLMLKLKJKJKJIJIHIIHGHGGFEFEDCBCBABABA@A@?@?@?>?>=<==<=<;<<;:;:9:9:99989878767766556566545434323212101010/././.-.-.-.-,-,+,,+,,+*)*)*)()()()('('('(KLKLMLMMNMNNMNONONONOOPOPQPQRQRSRRSRSTSTUTUVUV WVWVWWVWXXWWXYXYZ[\]\]\]^]^]^_`_`abcbcdcdcdefeefefgfgfgfghghghihihiijijijkjkjklklklmlmnmmnononopooppopqppqpqrqrqrsrsrstststststststsrsrsrqrqrqpqpqpopononmnmnmlklkjkjkjijijihihghgfggfgfedeedcddcdcbabbaba`a``__`_`_^]\]\\[\[\\[Z[[ZYZYZYXWVWWVVUVUUVUTSTSRQRQPQPQPONMNNMLMLKLKJKJIJIHIHIHGHGHGHGFGFEFFEDEDEDCDDCDCBCBCCBA@A@@A@?@?@@?>??>?>=>>=>=<=;<;<;<;:;:9:99:998988987876765654343232121010/0/0/./.-.--.-,--,-,+,+*+*)*)*)()()()('(KLKLMLMMNNMNONOPOOPOPQPQRQRSRSTUTUVUVWVWVWXWXYXYZYZZ[ZZ[\[\[[\]\\]\]^]]^_^_`_`a`aa`ababbabcbcbbcdccdeddefeffeffgffghghihijijijjkkjkjklklmllmmlmlmnmnonononopoppopqppqqpqrqrqrsrsrstststtstssttssttststststsrsrsrsrqrqrqpqpqqpqpqpopononmnmlkllkjkkjkjijijihihiihhihgfggfgfefefedeedcddcdcbccbcbababa`aa`_^_^]^]]^]\[\[\[Z[ZYXYXWXWWXWVWVUVUTUTSRSRQRQPOPPONONMNNMNMMNMLMMLKLKJKKJKJIHGHGFGFEDEDCDCBABBABABA@AA@?>?>=>=<=<;<;:;:9987876765454454343232321212112101010/0/./.-.--,-,+,,+,+*+*)*)*)*)()()('('('('('(K LKLKLKLLMLLMNMNONOPOPQPQRSTSTUTUVWVWXWXYXYXYYZYZYZ[Z[Z[\]^]]^]^^]^^__^_^_`_`a`ababcbbccbcdcdededefefgffggfghhghihijkjkjjklklmlmnmnonononopopoopqpqpqrqqrqqrqqrsrsrsrssrstststststststststsstsrsrsrqrqrqpqpqpqppononmnmlmlklkjkjihihghghhgfgfefeddedcdcddcbcbababa`a`__``_`_^_^]^]^]\]]\[\\[Z[ZYZYZYXWVWVUVVUTUUTTUUTSRSSRQRQPQPQPONMNMLMLKLLKJKJIHIHGGFGFEDED CDCDDCDCBCBCCBABA@A@?@?>?>?>=>>=<;<;:;:9:9998787876765656545434323212101010/0//00/././.--.-,-,+,+*++*+*)*))*)()()('('('(KLKKLKLMLMNMNOPOPQPPQRSRSSRSTSTUVUVVWVWXWXXWXYXXYZYZZ[Z[\]\]\]^]]^_`_`_`a`ababcbcbcdcdcdedefeefghghihhihihhjijijkjklklklmlmlmmlmnmnonopqpqpqrqqrqqrqrrsrsrsrststststststststssrsrsrsrsrsrqrrqrqpqqpqppoponononmnmlmmlmlmlklklkjkjihiihihihghhgfefefededcdcbcbaba`_^__^_^]\[Z[Z[ZYXYXWVWVVUVUTUTSTSRQRRQPQPPQPOPPONONMLMLLMLKLKLLKJKJIHIHGHHGFGFEFEDEDEDCDCBABA@A@A@@?@@?@?>?>?>=<=<;<;;::;:98898987878778767676565455432321010/0 /0/0//.//././.-..-.-,-,-,+,+*)*)*))*)())()('('('('('('(''JKKLKKLMLLMLMNMMNONNOPOPQPPQRQQRQRSTSTSSTUTUTUTUVUVWVWXWWXWXYXXYZYZYZZ[Z[Z[\[\[\]\]^]^_^_`abc dcddccdeddeddefgf gffgfgghggghijiijijkjklklklmlmnmnonopopopqpqpqqrqrqrrqrsrsrstststststststststsrsrsr qrqrrqqrqqrqpoponononmnmnnmmnmlmlmlklkjkkjijihihghhgfgfefeddcbcbcba`_`_^_^_^]^^]]^]]\]\\]]\]\\[\[Z[ZYXYXWXWVWWVVUVVUTUTSTTSRQRQPOPPO NONONNMMNMNMLMLMLKJIJIHIHGHGGGFGGFGFEFEDEDCDCBABA@AA@?@@?>?>=<=<;:9:98989898787878767656543432101010/0/./.-..-..--.-,-,+,+,+*+*+*)()(()(()('('('('('KLKLMLMNMNONONNOPOPOOPQRSTUTTUVUVWVVWXYXYZZ[Z[\[\]\]^]^_^^_^^_`__`_`ababcbcbcdccdcdedefgfghghghijiijkjkjklklmllmmlmnmmnnmmnmnonopopopqppqpqrqrqrsrststststststststsrsrsrssrsrrsrqrqrqrqpqppqpqpoppoopoppononmnmnmnmlmlklklkjkjijijihihghgghgfggfefefededdcbccbcbaba`aa`a`_`_^_^]^]\]\[Z[ZYZYYZYXYX WXWXWXWWVWVVWVVUVVUTSRQRQRQPQPQPONONMNMLMMLKLKLKJIHIIHGHGGGFGFGFFEEFEDCBCBABABA@?@?>?>?>=>>=<;<;:;;:;::;;:9:9:9:99898787787656565665434334323232121210110100100/0//0/0//0/././.-.-.--.-,-,+,+,+,+*+*+*)*)*)()()())('('('('(('KLKLKLMLMLMNMNMNMNONNOPOPOOPQPQRQQRSRSSTSTUVUUVWVWVWXWXYZZ[\]\]^]^_`_`a``ababcbcbcdcdccdcd eddeddeefeefeefgfgfghgghihijijkjkjkjjklkllklmlmlmnmnmnononopoopopqpqpqqpqrqrrqrsrrstststsstststststststsstsrsrsrqrqrqpqpqpopo nononnoononmnmlmlmmllmlkllkjkjjkjihihihihghgghgfggffgfedcdcbcb ababaabbaa`a`_`_^_^]\]\[\[Z[[ZYXYYXYXWXWVWVVUVUTSTSTSTSRQRRQRQPQPOPONONMNNMMNMLMLKLKJKJIHIHGHGGFEFEEFEDEDEDCDDCDCBCBA@AA@?@?>?>?>?>>=>>=<=<;<;:9:999898987887677656543434323223321212121010/0/././.-.-..-.-,-,+,+,+*+*)*)*)()())(())('('(('('(KLKLMLMNMNONOPQRSRSSTSTSTSTUTUTVUV WVVWVWWVWWXWXYZZ[ZZ[[Z[\[\]\]^]^]^_^_^_`_`ababcbcdcdcdedefefgffgfghggghihijijkjjklklklmlmlmnmmnonopopqpqpqqpqrqrqqqrsrsrststststsststsststsstssts rsrssrssrrsrrsrqpqpqppqpopopoppononmlmlmlmlklkjkkjjkkjihihihghggfgfefedededdcdcdcbabaa`a`_`_^_^]^^]\]\]\]\[\[[\[[Z[Z[ZYZYXWXWVWVUTUUTSTSRSRQPQPPQPONONONMLMLMLKLKLKJKJIJIIJIHGHGGFGGFEDCDCBCBA@A@?>??>>?>=<=<;<<;<;:;;:9::99::9998987887876765656545434434323212211221010/0/0/./././.-.-,-,+,+*+*++**+*+**)* )*))*)**))*) ())(()())()()('('(''('('('(KLMLLMNMNONOPOPQPPQRQRSRRSSRSTSTUTTUTUVUVUVWVWWVWXWXYZYZYYZZ[\[\\]\]^]^_^_`_`a``abababcbcdccdededefefefghhihihijiijkjjkjjkjklklmlmlmmllmnmmnopqpqrqrqrqrsrstststststststststsrsrsrqrqrqrqpqpoppoponmnmmnmlmlmlmlklklkjkjkji jijiijiihihhihghhgfgfefedeeddcdcdcbccbababa`a``a`_^_^]\]\[\[[\[[Z[ZYZYXYXWXWXWVWVWVUVUTUTUTSTTSTSRSRQRQPQPONMNMLMLKLKLKJKJIJIH IHIHGGHGHGGGFEFFEFEDEDCDCBCBABA@A@@A@@?@??@??@?>?>=>>=<=<;<;<;:;:9:998987876565434323232121010/00//0/./.-.--,-,,-,+,+,+,+ *+**+**+*+*)*))*))*)()()())()('('(KLMLMNMNOPOPOPQRQRSRSTTSTUTUVUUVWVWXWXYZYZ[Z[\]\]^]^_^^_^_`_`a`abababababcdeddefeffefgfgghihiihijijkjkjjklklmlmnmnmmnononnopopqpqrrqrsrsrrsrrsrstststsststststststsrsrsrsrqpqqpqpqpoppoopononmnmnmmnmlmlmmlmlklkjkjijihihghhgfggfgfedeededcdcbcbababa`a`_`_^__^]\]\[Z[ZYZ YZYZYXYXYYXYXWXXWVWVVUVUTUTSTSRSRQPONONMNMLMLKJIJIHIIHIHGHGFEFEDEDEDDCCDCBCCBBCBABBAABA@A@?@?>??>=<=<;:9:99:989878787676545455434323223321212101010/0/00/./.-.-.-,-,,-,+,++,+*+*+*)*)**)())()('('('(KLKLKLLKLMNMNMNONOPQPQRSTSTSTUTTUUTUVWVWVVWXYXYZZ[Z[[Z[\[\[\]^]]^]]^_^_`_`_`ababcbcdcdefeefgffghghgghihijijijkjklkkllklmlmlmnmnmnnmnopopqpqppqpqrqrqrqrsrsrssrssrstststtststsrsrrsrsrsrqrqrqrqrqpqpoppooponononmnnmmnmlmlkllkjkjijijihghgfgfefeffeddcddcbaba`_^_^]^^]\]\]\[\[Z[ZZ[ZYZYYZYZYYXYXWXWVWWVWVUVUTUTSRSRSRQRQPQPOPPOOPONONMNMNMMLLMLKLKLKJKJIJIIHIIHGHGGHGHGFEFEDCDCBCBABA@?@?>??>=<=<;:;:9:9:9:9898787676765656545434323233232121210/./.-.-.-,-,--,+,,+,+*)()()(())('('(('('('('(JKLMLMNONOONOPOOPQPQRSRSTUTUVUUVWXWXYXXYXYZZ[\]\]^]^_`_`a`ababcbbcbcdcdcdedefefefgfghggghihijijkjkkjjklklmlmllmnmnonoonoonopoopopopqppqqpqrqrqrsrstststtststsststsrsrsrsrqrrqrqpqpqqpoononnoononmnmnmlmlkllkkllkjkjkjijijihiihhihghgfgfefefededcdcbaba`aa`a`_``_^_^]^^]^]\]]\[\[Z[ZYZYXYXYXWVVUVUTSTSSRSRQRQPQPOPONOONMLML KLKLKLJKKJKJKJIJJIHIHGGFGFEFEDEEDCDCDDCDCBA@?@@?>?>=>=<=<=<;<<;:;::;:9:989898787876776566545543434323212121121010/0/././.-.--..-,--,,-,+,+,+,+*+**+*)*)*)*)())()('(KLMLMMLMNMNMNMONONONOPOPOPPQPQRQQRSRSTSTU VUVUVVUVWWVVWXWX YXYYZYZYZZZ[\]\]^_^_`a`ababcbbcdcdcdedefeefefghghijkjklklkklkklmlmnmnmnmnonnononopoppopqpqrqrqrqrsrststsrsrsrsrrsrqrqrrqrqpqppqppqpopoponononmlmmlmlmlkjkkjkkjjkjijihghgfgffgfeffeefededcdcdcbcbcbabbaaba`a`_`_^]^]\]\]\[\\[Z[ZYXWXWXWVVUVUTSTTSRSRQRRQPQPOPOPONONMNMLMLMLKLKJKJIJIHIHIHGHGGGFGFGGFEFEDCDCCDCBCBABA@A@A@?@?>?>??>=>=<=<<==<;:;:9:9:999898765656545434432321210/./.././.--,--,-,--,+,+,+*+*+*)*)()()()('('('('('('(KLMLMNMNONNONOPOPQPQRQRRSRSTSTTSTUTUVUVUVWXWXYXYZYYZZ[Z[Z[\[\]\ ]\\]^]^]^^]^_`_``_`a`a`ababaabcbbcdccdededefefgfghghihihhihijijkjjkkjklklmlmnmnononopopopqpqqpqrqrqrrrsrsrststsrsrsrsrqrqrqrqpqqpqpqpopoponmnmnmnmmnmlmlmlmlkjkjihihihghgfefefedeeddededcddcbcbcba`a`_`__^__^]^^]^]]\]\[\[\[Z[ZYZYXYXWXXWVVUVUTUTSTSRSRQRRQPQPQPOPONOONONMLMLKLKJKKJIHIHIHHGHHGGFGFGGFEFFEDEDCDCBCCBBABABAABAA@A@?@?>=>=<;:;:9:99878767765655665455432323212121010010/00/0//0/./.././.-..---,--,,--,-,+,,+*+*++*)*)*)())(()('('('(('('('(JKKLKKLMLMNMNMNONOPOPQPQRQRSRSTSTUTUVUVWVWVWXWXYXYZYZZ[Z[\]\\]\]^]^]^_^_`_`abaabbaabcbcdcdcdefeefefefgfgghghihhijijkjklklklmlmnmmnnmmnononopoppoop qppqqpqqpqqppqrqrqrsrsrsrststtstsrsrsrsrqrqrqrqpqpoponoonmnnmmnmlmlmmlklkjkjihiihihghgfgfededddcbccba`a`_``_^_^ ]^^]^]^]]\]\]]\[\[Z[[ZYZYXYYXWVWVUVUTUTSTSRSRSSRQRQRQPOPONMNMLMLLKKLKJIJIHIHGGFEFEEFEDCDCDDCBABA@A@?@?>?>=<=<;:;;:;;:9:99878765454343232121010/0/./././.-.--.-.-.-,-,-,+,+*+*+*+*)**)*)*)()()('('(('('('((KLMLMNMNOPOOPQRQRRQRSTUTUTUUVUVWVWWVWWXWXYXYZYYZ[\[\]\\]^]^_^_^_`_`a`abaababcbcdcdeddefeefefghggghhghihihijijkjklkkllkklmllmlmlmnonopoopqppqpqrrqrqrsrsrrssrsrstsrsrsrsrqrrqrqrqpqpqpoppoonononmnmlmlmlkllklklkjijjijihihghhgfgffgfededcbcbbcbababa`_``_^__^]^^]\[\[Z[[ZYZYZYXYYXWXWWVWVUTUTSRSSRSSRQRQPOPONONMNMLMLLMLKLKJIJIHIHGHGGFGGFEFEEDDEDDEDCDCBCCBABBABA@A@?@?@?>?>?>?>= <=<=<;;<;<;:;:9:98989878767656543432323223212112210110/0/./././.-.-.-..-,--,,--,-,,+,+,++,,+*+*)*)*)()('(KLKLKKLKLMLMNMMNONOPOOPQPPQRSRSRSTSTSTUTUVUVWVVWVWXWXWWXXYX YXYYZYZYZZZ[Z[Z[\[\]\]]\]^]^_`ababcbcbcdcddcdedefefeeffgfgfgfgghghihihijkjkjkjklklklmllmlmnmnmnmnmnonopopopqpqpqpqrqrqrqrrqrsrsrsrsrsrsrssrssrsrsrrssr qrqrrqqrqqrqpqpopoopononmnmnmlmlmlklklkjkjijihihhihgfggfggfgfefedede eddcdcdcddcdcbcbaba`a`a`_`_`_`_^_^_^]^]\[\[Z[ZY XYYXXWXXWXWVWVVVUVUVUTUTSR SRQRQRRQQPQQPQPOPONONONMNMNMLMLKLKLKJJKJKJIJIHIHGHHGGFGFEFFEDCBCBA@A@?@@?>=>=>=<;<;:;;:989898767677656565432322332121121010010/00/./../.-.-..--.--,-,+,+,+,,+*+**+*)*)*)()()()()('('('(KLKLMLMNMNNMNONOPOPQPQRSRSTSTUVUUVWXWXYZYYZYYYZ[ZZ[\[\]\]\]\] ^]]^]]^^__^^_`a`ababcbcdefefgfghghghihihihijiijijklkklkklmllmlmnmnonononopopooppqppqpqrqqrqqrsrrsrsrsrsrsrsrrsrrsrqrqrqrqpqppqqppqpopoonononmnmlmlkllklkjkjijijihihghhgfgfgfefedeeddcdcdcbcbcbaba`aa`a`_``_^__^]^]\]]\]\[ZYZYXYXWXWXWVWVVWWVVUVUTSTSTSRSRRQRQRQQPQPOPONONONMNMNMLMLMLKLKJIJJIIJIHIHGHGHGGFGFEDEDCDDCBCBCBCBABA@A@?>?>?>=<=<;<;<;:;:;:9:9988989898788787876776765656543433432332321210 /00//00//0/./.--,-,--,+,,+,+,+*+*+*+*)*)()('('('((KLKLKLMLMNMNMNONONNOPOPQPPQRSRSRSTUTUTTUVUVUVWVWXYZZ[\]\]^_`a`abaabcbcbbcbc dccdcdededeeddefefefgffggffghghihihijijklkllklmlmnmnononnopoppoopqpqqpqrqrqrsrrssrrsrsrsrrsrrsrsrsrsrsrsrqrrqqrqrqpqpqpopoopoopononoonnonmnmnmnmlmmlklklkjkjkjijijihihghghgfgfgfeffefedededddcdcbcbaba`a``a`_`_^_^]^^]^]\]\[\[Z[Z[ZZYZZYXYXWXWVWVWVUVVUTUTSRSRSRQPQPOPOOPONONMNMLMLKLKKJKJKJIJJIHGHHGHGGFGFEFEFEDEDCDDCCDCBCBABBA@A@?@?@?@?>??>=>=<;<;<<;:9:9998788787676765654544543233212101010/0/./.-.--,--,,-,,-,+,,+,,+,,+*+*+*+**+*)*)()('('(JKLMLMLMNMNOPQRQRQQRRQRRSRSRSRSTSTTUTUVUVWVWXWXYZYYZZZ[Z[\[\]\]^]^]^_`_`ababcbcbcbcdcd ededeefefeefeefgfgghghijijkjkjjkjklklklmlmlmnononopoopopopopqppqqpqpqrqrqrqrqrsrsrsrsrsrrsrsrs rsrssrssrrsrqrqpqpqpopopopononmlmlmlkllkklkklkjkjijijihihghgfgfggfefededdcdcbcbaba`_`_^_^]\ [\[\\[\[[Z[ZYXYXWVVUVVUTSTS RSRSRRQRQRQPQPOPPOPONONMLKLKJKJIJJIHIHIHGHHGGFGFEDEDCDDCDCBCBABA@A@A@?>=>=<=<;:;::;:9:998787887676565454343432323321212121010110/0//0/././.-.-.--,-,-,-,+,+,+,,+*++*+* )*))*)**))**)()()()( '(('('(('('('('('(KLMLMLMNMNONOPOOPQPQRQRQRSTSSTSTUTUTUVUVVUVWVWXWWXWXYXYZZ[Z[[\[\]\]^_`_`a`ababcbcdededefghhgghghihhihhijijijkjklkklklklmllmnmnononnopopopqpqpqpqrrqrsrsrsrsrsrsrsrs rssrssrrsrrsrsrsrqrrqqrqrqrqpqpqqpopoopononmnmnmlmlklkjkjkjijiijjihihihghgfgfggfefedeedcdcdccbcba`a`a``_`_`_^_^_^]\[\\[Z[[ZYZYXWXWVWVWVVUVUTUTSRSRSRQRQPOPONONONMNMNMMLMML KLKKLKKJKKJKJIHIHIHGHGGFGFEDEDC DCCDCCBCBBCBCBA@A@@A@?@?>=<==<;<<;<;<;:;:;:;:998998898788787876565455454343232121221010/0/./.-..--.--,-,+,+,+,+*+*+**++*)*)*)**)() ())(())())('('('(('(KLKLMLMLMNONONOPQPQRQRSRSTSTUTTUVUVWVVWXYXYZYZ[Z[\]\]^]]^]^_^_`_`a`a`ababcbcbcdccdefefgghghghihiihijijijkjkjklkklkklmlmmlmlmnmnmnononopopqpqpqqrqrqqrqqrsrrsrsrsrsrssrsrrsrsrsrsrrsrqrqpqqpqpqpoponoononmnmnmlmllmmlklklklkjkkjkjijihihihghgfgfgfefeffedeeedcbcbbabababa`a`_`_^]^]\]\[\[Z[ZYZYXYXWXWVWVVUVUTUTSRSRQRQPQQPQPONONMNMLMLMLKLKJKJIJIJIHGGFE FEEDEDEDDEDCDCDDCBCBABA@?@?@?>?>=<=<;<<;;<;:;:9:99898787656545434433443232322122121010/00/.//././.-..--,--,--,,-,+*+*+*)*)*)()()('('('('('('(KJKLMLMLMNMNNMNOPQRQRSRSRSTSSTUVUVWVVWXYZYZZYZZ[Z[Z[\]\]\\]^]^_^_`a`ababcbcdededdefefgfghhgghghijijijkjjkkjklmlmlmnononnonopopoopqpqpqpqqrqrqrqrsrsrrsrsrssrsrsrsrssrsrsrsrqrqrqrqpqpqpopopoonoonononmnmnmlmlmmlmlklklkjkjkjihihgfgfefededcbcba`_``_`_^_^]^]]^]\]\[Z[ZYZYXWVWWVVUTUTSRSRQPQPOPONONMLMLKLLKJKKJIJIHIHHGHGHGGGFGFGFEDEDDEDCBA@A@?@?>?>?>=>>=<;<;:9899898788767654543443233212121010/0/00//0/.--,-,-,+,,+,++,,+*+*+**+*+*)*)*)()())()()()('('('('('('(KLKLMNMNONNOPOPQPQRQRSTSTUTUVWVWXWXWXYZZ[Z[\[\]\]^]^_^_`_`a`abaabcbcbcdcdedefefgfgghghihhiihijijk lkklklkklklmlmnmnmnnmnonnonopopoop qpqpqppqqpqpqqrqrqrsrssrsrssrssrssrsrsrsrssrsrqrqrrqrrqrqpqpqqpopooponononmnmnnmmnmlmlklkjkjijihihihghgghgfgfefeffeddcdcdcbcbabba`a`_^__^_^]^]^^]\[\[Z[ZYZZYXWXWVWVVVUVVUTUTSTSRSRRSRQRQPQPOPPOPONMLMLKLKJKJKKJJIJIIJIIHIIHGHGGGFGFEFEDEDEDCDDCBCBCCBABBA@?@?>?>=>==>=<;<;<;:9:9::99898898787677656565654543433432121011010010/00//0/./.-.--,-,+,+,+*+*)*)()())(()()('('('(KLKLMLMLMMNMNMNMNONONOOPOPQPPQPPQRQRQRSRSTUTUTUVUVWVWWVWXYXYXYZZ[\[\]^]]^]^_`_`a`abaabcbcbcdcdeddedefgfghghijij kjkjkkjkklkklmlmlmlmlmlmnmmnmnonopoopopqpqpqqrqrqqrsrsrsrsrsrsrssrsrsrsrqrqqrqrqrqpqppqppqpopopoononononmlmlmmlklkjkjijiihihihghhghgfedeedeedcdcbcbaba`aa``a`_^_^^_^]^]^\]]\]\[ZYZYXWXXWXWVWVVUVUTUTSTSSTTSRSRQRRQPQPQPQPONONONONMNMNMLMLKLLKJKJIJIHGHGHGGFGFGFEDEEDCDDCCDCBCBA@A@?@@?@?>=>=>>=>=<=<;<<;:;;:;:;:99878877876765654545434323210/0/0/./.--.-,-,-,-,+,+,+*+*++**+*)*)*)('('('('(KLKLMNMMNMNONOPOPQRQRSRSTSSTSTUTUTUVWVWXWWXWXYXXYZYZYZ[Z[\[[\ [\]\]\]]\]]^]^_^_`_`a`a``abcbbcdcdcdedefefefgfghghghijiijjijkjklklklmlmlmnmnmnonopopqpqqrqrqrqrsrsrsrsrsrsrsrsrssrsrsrqrqrqrqrqpqqpqpqpopoononmnmlmmlklklkjkkjkjkjijijjiijihihghhghgfgfgfeffedeededdedcdcbcbaba`a`_``_^]^]\[\[Z[ZYZYZYXWXWXWVWWVVWVVUVUVUTUUTSRSRSRQRRQRQPOPPOPONONMNMLKLKJIHIHGGFGFEFEDEDCBCCBABABA@A@?@?@@?>?>??>=>=<=<;:;;:9:9:998989878787676676565454343443232211212101010/00/0/./.././.-.-..-,-,+,+*++*+*+*)*)*)()()()('('('('('KLKKLMLMNMNONOPOPQPQRQRSRSTSTSTUTUVUVWVWXWXYXYZYZ[\[\]\]\]^_^^_`a``a`ababcbcdededefefgfgghgghihijijkjklklmllmlmnmnmmnononopoppoppopqpqpqqrqrsrsrsrsrs rsrssrsrssrrsrqrqrqpqpopooonoonmlmlklklkjijijihihiihghgfggfefededeeddcdcbcbaba`a`aa`_^__^_^]\[\\[Z[ZYZYZYXYXWXWVVUVVUVUTUTSTSTSTSRQRQQPPQQPQPOPOPOONONNONMNMLMLKLKJKKJIJJIHIHIIHGHHGHGGGFGGFGFEFEDEEDEDCDCDCBCBCBABA@AA@?@@?>?>=>=<=<=<;<<;<<;:;:99898987676565654543432121210110/0/0/././/../.--,-,+,+,,+ *++**+**+*+*)*)*)()()()(()('('('('('('((KLKLMLMNMNONOPOPQPQQPQRSTSTSTTUTUVUVVUVVWVWXWXYXYZZ[Z[\[[\]\]\]^]^_^__`__`_`a``a`ababc bccdcdccdccdedeedefgfgfgghghgghijijkjkjklkklkkllklmnmmnonnopoopqpqpqq rqrqrqqrrqrsrsrssrssrsrs rsrrsrssrrssr qrqrqqrrqrqpqpqpopoononmnmlmlklklkjkjkjijjijihihiihgfgfgfefedeededdcdcdcbcbababa`a`_`_^_^^_^]^]^]\]\]\[\[\[Z[ZYZYXYYXYYXWVWVUVUVUTUTSRSSRQPQPONOONONMNMLKLKKJKJIJIHIHGHGGFGGFEFEEFEDEDCDCCDCBCBABABA@A@A@?>?>=<=<;<;:9:989989878767765665654543434434323232 322112212210/00/0/./.-.-..-.-,+,,+,+*+*+*)*)()('('('('(KJKLKLMLLMNMNONOPOOPQRQRSRSRSTSTUTUVUVUVWVWVVWWXWXWXXYXYXYZYZYZ[Z[\[\\[\]\]^_`a`abababcbccbcdcdededefefeeffefgfgg hghhgghghihhijiijijijkjkjklklmlmlmnmmn mnnoonoonnonopopoppoopqpqpqqqrqrqrqrqrsrsrsrsrq rqqrqqrqqrqpopoononmnmmnmlklkjkjkjjkjijiijihiihghgfgfedcdcdcba`_`_`_`_^_^]^]^]\]\[Z[ZYZYXWXWXWVWWVVUTUTSTSRSRSRQRQPQPPQPOPPONONOONONMLMLMLKLKKJKJIHIHHIHGGFGFEFEDEDCDCBCBABA@A@?>?>?>>=>>=<=<=<;:9:989898787676565654554454344323212121221010/0/./././.-..-..-,-,--,+,++,+,+*+*++* )*)*))*))*)())()())()('('('('('(JKLMLLMNOPOPOPQPQRQRSTSTSTUTUVUUVWVWWVWXYXYZYYZYZ[Z[\[\[\]^]^]^_^_`__`__``a`a`abaabcbbcbcdcdccdedefefefgfgghghihhijijkjkjklkklmnmnmnnmnopopqppqpqppqqrqrqrrqrqrsrsrsrsrqrqrqrqpqpqpopopoononoonnonnmnmnmnmlmmllmlklkjkjijiijihihihghgfgfefededdeddcdcdcbccbaba`_^]^]]^]\]\[\[[\[\[ZYXYXYXXWXWXWVVUVUTSTSRSRQRQRQPQPQPOPONONNONMNNMLMLKLKJKJIJIHGHHGGFGFEFEDEDEDCBCBBCBA@A@@A@?>?>=>>=<;<;:9:989898787876776765654343232321210100110/00/0/././.-.--,-,-,-,+,,+,+*+*+*+*)*)**)**))*)())('('(JKLKLLKLMLMMNMNONOPOPOPQRQRSRSTUVWVVWXWXYXYZYZZ[\]\\]\]^]]^_^_`__`abcdcdedefefgfgfgghghgghihhihijiijkjkl mllmlmllmllmmnmnonoonoonopoopopopqpqpqrqrrqrqrrqrsrsrqrqpqpqqpqpqpopoppoonmnmmnmlmlklklkjkjijihihihihghhgfgfgfgfefefededdcddcbcbababa`a`_`_^_^]^]\]]\]]\\[\[\[ZZ[ZYZYZYYXXYXXYYXWXXWVVUTUTSTSRQRQPONONMNMNMLKJKJJIIJIHIIHGHHGGHHGGFEFEEFEDEDCDDCBCBCCBA@?>??>=>=<=<;<;<;:;;:9:99:9987656565654554343343233232121121211001010/0/.//../.-.-..-..-,-,,-,+,+,+*+*+**+**+*)*)()()()(()('('('('('(KJKLKLLKLMLMNMNONOPQRSRRSRSTUTTUUTUVWVWXWXYXYYZ[\[\]\]^]]^^]^_^_`_``_`a`a``ababab cbbccbccdcdcdedededefefgfgffggfgghghihhijijkjklklkllmllmlmnmnmnmnmnonnononopoppopqpqqppqpqrqrqrqrqrsrqrqrqrqrqpqppqqpqpopopooponononmnmlkllklkjkjiji jiijiihiihihiihghgfggfefedeeddeddcdcbccbababa`a`_^__^_^]^]\]\[\[\[[Z[Z[ZYXYXWXWXWVWVVUVUTUTUTSRSRQRQPQPOPONONONONMNMLMLMLKLKLKKJJKJIJIHGHGGGFEFEFEDEDCBCBBCBABA@A@?@?@?>?>=>=>>=<=<;<;;<<;:9:99876545445434434434323212121010/./.-.-,-,+,+,+*++*+*+*)*)*)()(()('('('('('(KLKKLMLMNONONNOPQPPQRQRSTSTUTUVUVUUVVWVWXWWXYXYZYZ [ZZ[Z[[\[[\\[\]\\]^]]^_`_`a``abaabcbcdcdcdedefgffgfgghgghhghihihijkjkjklklmlmlmnmnononopopooppoppopqpqpqqqpqpqrqrqrrqrqrqrqrqrqrqrqpqpqpqpopoppopopoononmnmlmlmlklklkjkkjijihihghghgfgfededeeddcddccdcdcba`_`_`_^__^]^^]\]\[\[Z[Z[ZYZZYXYYXWXWVWVVWVUTUTSTSTSRQRQPQPQPOPOPONMNMLKLKJKJIJJIHIHGHGGGFGGFEFEDEEDCDDCDCBCBABA@A@A@?@?>?>=<=<;:9:998767767656 5665455455434343232121011010010/0/0/././.--,-,+,+,+*+**+*+*)**)**)*)()()()('('('('('(KLKLKLMLMNONOPQPQRQRSTUVWVWXWXYXXYYXYXYZZYZ[Z[\[\]^]^^]^_^^_`_`_`a`ababcbcdccdcdedefefgffggh ihiihhiijijijkjklklmlmnmmnnmmnononopoppop qppqppqppqppqrqrqqrqrqrqrqrqrqrqrqrqrqpqpqpopopopoononmnmnmlmlklkllkjkjijihghhgfgfedededddcdcdcbababa`_``_`__^_^__^]\]]\]\]\\[\[Z[ZZYZYZZYXYXWXXWXWVWWVVU TUTTUUTSTTSTSRSRQRQRQRQPOPONOONMNMLMLMLKJKJIHIIHIHGGFEFEDEDCBCBABA@A@?@?>?>=>=<;<;:9::9::9989878767654343434323212122101010/0/.//./.-..-.---.-,-,-,+,+*+*)*)()()(()('('('(KLKKLMNMNMNOPOPQPQRSRSTSTSTUVUVWVWXYXXYYXYZ[Z[\[\]^]^_^^_`_``_`a`abaabcbcdcdedeedefeefefgfgfgghghihihhihijijijkjklklklmllmlmlmnonopopqppqppqpqpqrqrqrqrqrqrqrqpqpqpqpoppopoononmnmnmlmlklklkjkkjkjijihiihhiihghgfefedededdcdcbabbaba`a`_`_^__^]\]]\\]\[Z YZZYYXYXXYXWXWXWVVUTUTSTSSTSRQPQPONMNMLMLKLKKLKJKJIJIHIHIHGHGGFGFEFFED CDCCDCCDCCBCCBABA@AA@A@?@?>?>?>=>=>=< ;<;<;::;:;:9:989876545454343 4332232233212120101010/00/00/./././../.-.--,+,+,+,+*++*)*)*)*)()())(())('('('('('(JKLKKLMLLMNMNONOPOPQPQRSRSTSTUTUVUVWXWXXWXYYZ[\[\[[\]\]]^]]^_^_^_`a`aa`abababcbcdedefefgfggghghihihijijkjklklklmlmnmnmnmnonopopoppqpqpqpqqpq rqqrqqrrqqrqrqrqrqrqr qrqrqrrqrrqqrqrqrqqrqrqpqpqppqppopopoononmnnmnmlmlmmllmlklklkjkjijihihhihghghgfefeefefeddcdcdcbcbcba`a`_`_`_^_^_^]^]]^]^]\]\]\[\\[Z[ZYXYYXWXWXWWXWVWVVVUVUTSRQRQPQPQPOPPONONMNNMNMMLMMLMLKJKJKJIJIJIIHIHGHGFGFGGFEDEEDCDCBCBABBABA@?@?>?>=>=<=<=<;:;:9::998987878767656545454343432332332121010/0/././.-.--,-,+,+*+**+*+*+*)*)()()('('(JKJKLKLLKLMNOPQRQRSRSTUTTUVUVWXWXYXYZZYZ[\[\[\]\]\\]\]^_ `_``__``a`a`ababcbcbbcdcdcdedefef effgfggffgghghhihijiijkjklkllklmllmmlmlmnmnonononopoopopqppqpqrqrqrqrqrqrqrqrqrrqrqqrqpqpopopooponoononoonmnmnmlmlklkjkkjihihghgfgfedeeddcdcddcbcbcba`a`_`_^__^]^]]\\]\]\[\\[\[ZYZYXYXWXWWVWVWVVUVUUVVUTSRQRQQRQQPQPONONMNMLMLKLKJIJIHIHIHGGFGFEDEDCDCBCBABABABA@A@?@?>=>=<;<;:;:;:9:9:98787676765665454321210/0/0/./. -.-.-.--.-.-,-,,--,-,+,+,+*+*)*)*)()()())()()('('('(KJKLKLMLMLLMNMNMNONONOOPOOPQPQRSRSTSTUTTUVUVWVWVWXWXYZYYZZYZ[Z[\[\]\]\]^]^_^__`_`abababcbccbcdeddefefgfgghghihhihihijijijkjjklklmlmmlmnmnononnonopopoppopqpqqpqqpqrqrqrqrqrqrqqrqr qrqrqrqqrrqrqpqpqpqpopopopopononmnmnmnmnmlmlmlmlklkjkkjijihihihghgfgfeffefeddcdcbabaaba`aa`_^_^_^_^]\]\[Z[ZYZYZZYXYXWXWXWWVWWVWVUVVUUVUTUUTSTSRQRQPQPOPONONMNMLMLKLKJIJI HIIHHIHHGHGHHGGFGGFGFEDEDCDCBCCBA@AA@?@@?@?>?>?>=>>=<=<;:;:;;:99 89898877878778767766765656545454343232321010/0/0/.//./../.-.-.-,-,+,+,+*+*+*)*)*)()()('('('('(KLKLMLMLMNMNONOPQPQRSRSTSTSTUTUTUUVVUVWVWXWXYXYZYZ[Z[[ZZ[[\[\]\]^_^^_`a`ababababcbcdcdededefeffefgfggghgghghghihijijkjkjkjklklklklmlmlmlmnmnononopopoppoppqpqqpqrqrqqrqrqrqrqqrqrqrrqrqqrqrqrqpqpqpqpqpopoppoponnonoonmnnmlmlklkllklkjkjkjijihihghgfggffgfeffedcdcdcbcbababba`_`_^__^]^]\[Z[ZYZYXYXWXXWXWVWVVUVUTUTSTTSSTSRSRQRQRQQPQPOPONONOONMNMMLKJKJIJIJIHIIHGHHGGFGFGFEFEDCDCBCCBABBABBA@?@??@?>?>=<==<=<;<;<;:9:99:98987876765454454343232 1221121211010/0/0/./.-.--,-,+,+,+*+**+*)*)()()('('('('(KJJKLKLMLMMNMNMNNONONOPQRQRSRRSSRSTSSTUTUVWXWWXWXWXYXYYZYYYZYYZ[\]\] ^]^]^^_^^__^^_`__``_`a``ababcdcdefefgghgghihihhijijijkjklkklklmllmnmmnopopqppqpqpqpqrqrqrqrqrqrqrqrqrqrqrqrqrqrqpqpqpqpoponononmnmlmllmlklklklkjkjijihihhiihghgfggfgfeffefefededeeddcbcbcbaba`a`_`__``_^_^]^]\]\\]\[\[Z[[ZYZZYZYZZY XYYXYXXWXXWVWVVWVVUVUTUTSTSRSSRQPQPOPONMNMMNMMLMLMLKLLKJKJIJJIJIHIHGGFGFEFEDCDCDCB CBBCBBABAABABA@?@??@?>?>=<;<;:;;:;:;:9:9:9:99899878787676565454343433432322121010/0/././.-.--,+,++,+,+*+*+*)*))**))*)*)()('('('('('(JKLKLKLMNONOONOPOPQPQRSRSTUTUVUUVUVWVWXWXYZYYZ[\[[\]^]^]^_^_`__`a`abcbbccbcdcdedefefefgfghgghghihijiijjiijkjjkkjkjklkklkklmlmmlmlmnmnonoonopopopoppqpqpqpqrqrqrqrqrqqrqrqrqrqrqrqrqqrqpqpqpqqpoppopopopoopoponoonon mnmmnmlmlmllmlklkllklkkllkkjkjkjkjijijjijiihhihihghgghghgfgfefefefededdc bcbcbcbbababba`a`a`_^_^_^]^]\[\[Z[Z[ZYXWXWVWVVVUVUTUTSTSRSSRQPQPOPPONMNMLMLLKLKLKJKJIHIHGHGGFGFEDCDCDCCDCBCBABA@A@?@?>?>?>=>=<==<;<<;<;:;;::;:9:9898787676565454554343432321210/0//0/./.-.-.-,-,-,-,,+,+,+*+**+*)*)*)*)()())('('('(('('('(KLKKLMNONONOPOPQPQRSRSRSTSTUTTUVUVVUVWXWXYXXYXYZZYZ[Z[\]\]\]^]^_^^_^^__`_`_`a``abaababcbcbbcdcddededefefgfgghgghihijijijkjjkjjklmlmlmnononopopoopopoopqpqpqqpqqpqrqrqrqqrqrqrrqrqrqrqrqpqpqpopopopononononmnmnmlmlmlmlklkjkkjjkjkjijihghghgfgfefedeedcdcba`_`_`_^_^]^]\]\[\[Z[[ZYXYXWXWXXWVWWVWVVUVVUTUTSTSRSRQRRQPOPOPONONMLMLKLKJKKJIJIJIHGHGGFGFEFEDEDCDCBCBCBA@?>?>=>=<==<;:;:9:9989878767656545434434432323212210/./././.--,-,+*++*+*)**))*)*)()()()('('('('('(''(KJKLKLLMLMNMNONONOPQPQRQRSTUVUUVWVWXWXYXYZYZ[\[[\[\]\\]^]^_^^_`abcbcdcdedefefeffgfgffghgghghihhijijk lklkklklkklklmlmnmnnmnnmnonnononopopoppqpqqpqpqrqr qrqrrqrqqrrqqrqrqrqpqpqpqqpopopoopopononnmnmmnnmnmlmlmlklkjkjijihihihihghgfefedededdcbcbcbababa`_`_^]^]\]\]\[Z[Z[[ZYZYXWXWVWVVUVUTUTUTSTSSTRRSRSRQRQPQPQPPQPOPOOPONOONMNMLMLKLKJKJIJIHGHGFGFGFEDCDCBABABBA@AA@?@?>?>=>=<=<;:;:;:989878767656545454343232121010/.-..--,-,+,+*+**+*+*)*)*)()())()('(('('('(JKKJKLKLMLMNMNMNOPQRQRSTSSTTSTUVUVWVWXWXYYZYZ[Z[\[\[\]\]^]^_^__^_`_`__`a`a`a baabbabbcbcbcdcdcdcdedefefeefgffghghhgghihijijijkjkjkklkklmlmlmlmlmlmnmmnmnonoonopoppoopopqppqpqpqpqrqrqrqrqrqrqrqrqqrrqrqrqpqpopononnonmnmlkllklklkjkjijjiijihgfgfgfefeffededeedcdcbcbaba`a`a``__`_`_^]\]\\[\[\\[\[ZYZYZYXYXWVWWVVUUVVUTUTSRQRRQRQ PQQPPOPOOPONMNMLMLKJKJIHIHGHGHHGGFGFEFEDCDDCBCCBBCBABA@A@?@?>?>??>=<=<==<=<;<;:;;:9::9:9:9987876766765656545454543443443232323321010/0/0/./././.-.-.-,-,+,+,,+,+*+*+*)*)*)()(()()()('('('(JKLKLMNMNMMNOPOOPQPQRSRSTSTUTUTTUUVUVWVVWVWXWXYXY ZYYZYZZ[ZZ[[Z[\]\\]^_^_`__`a``ababcbcbcdcdcdefeefefgffgfghghghijijijkjklklklmlmnmnononnoonopopooppopoppqpqpqqpqpqrqrqrqrqpqpqppqqpqpopopopononnonmnmlmlmllmlklklkjkjijihihghghhgfggffgfefededcddcbccbcbababa`a`_``_^_^]^]]^]\[\[Z[ZYZYXYXWXXWWXWVWVWVVUVVUTUTSTSRSRQRQPOPPOOPONMNMNMLMMLKLLKJKJIJIHIHGGFEFEDCBCBABABBA@AA@?>?>??>>=>=>=<=<;<;:9::989889876767654554343212101010010/0/././/./.--,--,-,-,+,+*)*)**)*)()())(()()('('('('(KJKLKLMNMNOPOPQPQRSTUVUVWVWXWXWXWXYXYZZYYZ[Z[\]\]]\]^_^_^_`_`a`ababcbbcbcdcdedefeeffghghghhghihijijkjklklmllmmllmnmnmnonoono poopoopoopooppqpqppqqppqpqrqrqrrqrqrqrqpqpqpopoponnmnmnmlmllmlklkllkjkjkjijihihghghgfgffgfefeeffedcdcbccbcbababa`a``_`_`_^_^]^]^]\]]\[\\[Z[ZYZYXYXWVWVVWWVUVUTUTUUTSTSRSRQPQPQPPOOPPONONMNMNMLMMLKLKJKKJJKJIJIHIHGHGHGGFGGFEFEEFEDEDCDCBCBABA@?@@?>??>=>>=<=<;<;<;:;::;;:;:9:9899898787787656545454343 23223223322121210101010/0/00/.-..--,-,-,+,+*+*+*+*)*)()('('('('(KJJKLMLMLMNONOPOPQRQRSRSRSTUTUVUVVUVWXWWXXWXYYZYZ[Z[\]\]^]]^_^__^_`_`a``ababcbcdcddcdeddedefefefgffghghgghghihihijijkjkjklkklkkllklmnmnonnonopoopoopopopppqpqpqrqqrqrqpqpqpqpqqpqpqpqpoppopponoonnonnmnmnmlmlklklkjkkjkjkjijihihghgfggfefefededdcba`_`_^__^_^]\[Z[Z[ZYXWXWVUUVUTUTSTSTSRQRRQQRQPQPPQPOPONONMNMLMLKJKJIHIIHIHHGHGFEFFEDEEDEDCBABA@A@A@?@?@?>=>=<;<;:;:9898787876767654545434323232122121101010/0/0//.//../.--,-,+,,++,+*+*)*)()('('('('('(KJJKLKKLMLMNMNONOPOPQPQQRQRSRSTSTUTUVWVWWVWXYZ[Z[ZZ[\[\\]\\]^]]^^]^_`_`a`ababbabcbcdcdedefefgfghghghihijijkjkjklklmlmlmnmnonopopoppopp qppqppqqppqpqpqrqpqpqpqpqqppqpo popopoppopononmnmnnmnmnmlmmllmlklklkjkjkjijihihghhghgfgfedeededcddcdcbccbccbabaa``a`_`_^_^_^]^] \]\\]]\]\\[\[Z[ZYXYXWXWVWVUVUTUTSTSRQPQPPQPOPONOONMNMNNMLMMLLMLKLKJIJIHIIHGHHGGFEFEDEDCDCBABA@A@?>=>==<==<;<;<;:989898787676 566556545544543443433432323212121010110/0/./../.-.--.--,-,--,+,++,+*+*)*)**)*)()()()())('('('('((KJKKJKLMLMNOPQPQRQRSTSSTUTUVWVWXWXYXYYZ[Z[Z[\[[\[[\[\]^_^__^_`_`_`a`ababaabcbcbcdcdededeefeffeefggfgghghihhijijkjkkjklklklmlmnmnmnmnononnonopopopqpqpqpqqppqpqqpqpq pqqpqppqpqpqpqpopoppoopononononoonmnmnmlmlklkjkkjkjijihiihgfgfefefefedcddcbcbaba`aa`_``_`_^_^]^]]\]\[\\[Z[ZYZYYZYXYXWXWXWXWVWVUVVUTUTSRQRQPQPOPONONMNMLKLKJIHIHGHGHGGFGFEFEDEDCBCCBABABA@?>??>=<=<=<<;;<;:;;:9:9898767667765654343232323212121010110/0/./.-.-.--,-,-,+,+,+,+,+*+*+**+*)*)*)()()('('('(JKLKLKKLMLMNMNMNNONNOPOPQRQRSRSTUVUVUVUVWVWXYXYYZZYYZ[Z[\[\[\]\]^]]^_^^_`a``a`ababbabcdedefefggfghghghihijiijkjklkkllklmlmnmnmmnmnononoonopopoppopppqpqpqpqpqpqpqpqqpqpoppoppopooponononnmnmnmnmnmlmlmlklkjkjijijihihihghgfgfgfefededededccbccbababa`_``_`_^_^]\]\[\[\[Z[[ZYXYYXYXWXWVWVVUVVVUT STSTSTSTSSRQRRQRQPQPONONMNNMMNMLKLKJIJJIHGHHGGHGFGGFFGFEFEDEDCDCDDCBABA@?@?@?>=>=<=<<=<;<;<;:;:9:99898987676765665654545454344323232121010/0/ 0/.//.//.//.-.-.---,-,+,+*+*++*+*)*)*))*)*)()()()(KJKKJKLKLKLMLMNMNNOPOPQRQRSRSRSTSTSTUTUVUVWVWXWXYXXYXYYZYZZYZ[Z[\[\]^]]^_`_`a`a`ababcbcbcdcdcdedeedefefgfgfghihijijijijkjkjkjklklklmlmnmnmnononoonoppopqpqpqpqpqpqpqpq pqpqqpqqppqppqpopoopoppononnonnnmnmnmnmlmlklkllklklkjkjkjjkjijihihihghgfgfefeffededcddcbcba`a`_`_^_^]^]\]\]\]\[\[Z[ZYXWXXWVWWVUUVUUTUUTSTSRSRQPQPONONONMLMMLMLKLLKLKJIJIJJIHIHHGHGHGGFEDCBCBBCBABAABA@?@?>?>?>>==>=><=<=<==<;<;<<;:;:;:9:9899878767676545454343 43232332232121010/0/.-.-.--,-,-,+,+,+*+*+*)**))*)()()('(('('('('('('((JKLKLLMLMLMMNMNMNOPQPQRQQRRQRSRRSTSSTUVUVWVWVWXWXWXYXXYYZ[\]\]^]]^^]^_^_^_`__`a`abcbcdcdedefgffghghgghihihijijkjjkjklkklmllmnonopopoppopopqpqpqpqpqpqpqpqpq pqqpqqppqppqpqpqpoponoononononnmnmnmlmllmlklkjkjijijihihhiihghghgfefeffededcdccdcbcbbcbababa`_^]\[\[Z[ZYZYXYXWXWXWVWVWVUVUVUTUTSTTSTSRQRQRQPQPOPONONMNMLMLKLKJKJIJIIHHIHIHGHHGHGFEDCDCBCBABBA@A@?@@??@?>?>=>=<=<=<;<;:;;:98987876776565654543434323210/00/././.-..-.--,--,,-,-,+,+,,+*+*+*)**)*)*)()()()()()('('('('('(KJKJKLMNMNNMNONNOPOPQRQQRSTSTUTTUTUVWXYXYYZYZ[ZZ[\]\]\]^]^_^^__^_`_`a`ababcbcdcdededefefeffgfghgh ghhihhiihhijiijjijijkjjkjjklkllklklmlmnmnnmnononoppopopopqpqpqpqpqpqpqpqppqpqpqpqpqpqpqpoppooppoponoononoononnmnmlmlmllmlklkllklkkllkkjkkjjkjkjkjijijihihghghgfgfgffefefedededcddcbabaa`a`a`a`_`_^__^]^]\]\]\]\[ZYZYZYXYXYYXYXWXXWVWVUVUTUTSTTSRSRRSRQPOPONMNMNMLKLKLKJ KJJIJJIIJIHIHGHGFGFGFGFEEFEFFEDEDCBABABA@A@A@?@?>?>?>=>=>>==<=<;:;:9::9:9:98989878787676676565655654543233212121211011010/0/./.-.--,-,-,+,,+*++**++*+*)*)*))*)()()()()()('('(JKJJKLMNMNMNONOPOPQRQRQRSRSTSSTUTUVWVWXWWXWXYXYYZ[\[\[\]^]]^_^_^_`__`_`a``a`ababaabcbcdcdedefefefgffghghihihijiijiijklklklmnmnonnononnopopoppopqpqpqqpqpqpqpqqpqpqpqpqqpqpqpqpqpqpqpopopopopono noonnoonnonnmnmnmnmnmlmmllmlmlkjkjkjijijihghghgfefededcdcbcbbaba`_`_^_^^_^]^]\]\\]\]\[Z[ZYZYYZYZYYXYXWXWVWWVWVUVVUTUTSRSRSRQRQPQPQPOPPONONMNMNMLLMLKLKJKJIJIHIHGHHGHGGFGFEFEDCDCBCBABA@A@A@?@?>?>=>=<=<;:;:9:9:99898987878767676565654554543 434322323321210/0/./.././.-.--.--,--,,-,+,,+,+*+**+*+*+*)**)*)*)*)()())('('('(JKJKLMLMNMNMNOPOPQPQRSRSTUTTUTUVUVWVWXWXYYZYZ[ZZ[Z[\[[\]\]^]]^_^_`a`ababcbcdcdedeefefeefgfgfghgghihij kjjkjkjjkjklklmlmmlmmlmnmmnmnmnononopoppooopopqppqpqpqqpqqpqpqpqpqqpqpqpopopopopononnmnmnmlmllmlmlklklkjkjijihihghghgfgffgfefedeedcdcbcbaba`_`_^]^^]^^]]\]\]]\[[\[Z[ZYZYYZYXYXWVUVUUTSTSRQRQRQPOPONOONMNMMLMMLKLKLKLKJKJIJJIHIIHGFGFEDCDCBCBCBABA@A@?@?>=>>=<==<;:; :;::99:99:989888987676776656565455445434321212210/././.-.-.-,-,+,+*+*+*)*)*)( )())()()())('('('('(JKJKLKLMLMNOPOPQPQRSRRSSRSTUTUVUVWVWXYXYXXYYZYZ[Z[Z[\[\]\]^]^^]^_^_^^_`_`__` a``aa`aababababcbcbcbcdcdcddededdeedeefefgffghghihijijijjkjjkjklklklklklmllmlmlmnmnnmnonoonnonopopopopopqpqpqpqpqpqpqpqpqpqpqqpqpqpqpopopopoponoononnmnmlkllklklkjijijihihhghghgfggfgfedcddcbcbcbaba`_``_^_^]^^]]^]\]\]\\[\[\[ZYZYXYXWXWVUVVUTSTTSRSRQPONOONMNMLMLKLKJKJIJIHIHIHGHGFGGFEFEFEDEEDEDCDCDCCBCBABAABA@A@AA@?@@?@?>??>??>>=>=<=<=<=<;:;::;:9:98 98998878878765454454343232121010/0/./.-..-.-.-,-,-,,-,+,+,+*+*)*)*)()())()('('('('('(JKJKLMLMLLMNMNONNOPOPQRQRSRSTSTSSTUVUUVUVWVVWXWXYXXYXYYZYYZZYZ[\[[\]^]]^_`__`_`a`abababcbcbcdedefeeffeffgfgfghihihijijkjkjklklmlmlmnmnmmnnmnnmnononononopoopoppopopqpqpqpqpqpqpqpqpqqpqpqpopopopo nonoonoonnonmnnmnmlmlmllmlklklkjkjijihihiihhihghgfggfgfefefedcdcdcbaba`a`a`_`_^__^]^]\]\[\[\[Z[[ZYZZYYZYXYXWXXWVUVUTUTSTSRSRQPQPQPOPONOONONMLMMLKLLKLKJIHIHGHGGFEFEDEDCBCCBCBCBABA@?@?>?>=>=<=<;<;:9:9:988987676565654545443443344332323212121010/0/0/././.-..--..---,-,-,+,++,+,+*+*+*+*)**)*)*)()())()()('('('('(JKJKLMNONONOOPOPQRSRSTUTUVUVUVWVWXWXYXYYZYZ[Z[\[[\]^]^_`__`a`a`aababcdcdeddef fgfggffgghghghihijijkjklkkllkklmlmlmnmnnmn onnonnonnonnopoopooppoopopqpqpqpqpqpq pqpqqpqpqqppqpqpop opoppooppoponmnmnmnmlmllmlklklkjkjkjijihihghghgfgfefededcddcddcbccbcbaba`a`_`_``_^]^^]^]\]\[\[[Z[Z[[ZYXYYXYXWVWVVUVUUVUTUTSTSRSRSSRSRRQRQRQPONMNMLMMLLKLKJIJIHIHIHGFFEFEDEDCDCDDCBCBA@A@?@?@?>??>=<=<;:;:9:989878765654343344343232121221010/0/0/./.-.--,-,-,-,+,+,,+*+*)*)*)()()()()('('('('('('((JKLKLKLMNMNMNONOPQPQPQRQRQQRQRSTSTUTUTTUVWVWXWXYYZYZ[Z[Z[\[\]\\]^]^]]^_^_`__`__`a`ababcbccbcdccdcddcdeddeddefefgffgfghghihijijijkjjkjkjklmllmnmnonnonnononopopopqpqpqqpqqpqpqpqpqpqp oppoppopoppononoonononnmmnmnmlmlklklkjkkjkjkjijihg hghghhgfggfggfefefededcddcdcbcbccbcbaba`a`a`_`_^]^]]^]\[ Z[[ZZYZYYZYZYXYXYXWXWWVUVUUTUTSRSSRSSRQRQPOPOPONMNMMNMLMLKJIJIJIHIHIHIHGHGFGGFEFEDEDEEDEDCBCBABABAA@AA@A@?@?@?>?>=>=<;<;:;:9:9:9889987878767656545434343232121010110010/0/./../.-..-.--,-,,-,,-,+,++,,+*+*++*+*)*)()()('('('('(('('(JKJKLKLMLMNONOPOOPQPPQRQRSRSTSTUVUVVUVWVWXYYZYYZ[Z[\]\\]]\]^_^_`_`a`a`ababcbcdedeedefefgfgfggfghghihihijijijkjklklklklklmlmlmnmnmnnonononoono poopooppoopopopqpqpqpqpopoopoopoopopopoponononmnmmnmnmlmlmmllmlklklkjkjijijihiihihhihghhgfgfefedccbcba`_ `__^_^_^^_^]^]^]^]\]]\[\[ZYZZYXYXYYXYXWXWXWVWVUUVUTSR SRQRQRRQQPQQPQPOPONONONMNMNMLMMLKLKJKJKJIJIHIHGHHGFGGFEFEDCBCCBCBABA@AA@@?@@?> =>==>=<<==<;:9:9:989878876565454545434323232121121010/0/././/./.-.--,-,+,+,+*+*++*+*)*)*)()()()('('('('('(JKLKLMNOPQPPQRQRSTSTUTUTUVUVWVWVWWXWXYXYYYZYZ[Z[\[\]\]]^]^^]^_^_^_^__`_`a`a``ababcbcdcddedeeddefeffgfghgghghijijjiijkjjkjklklmlmlmnmmnmnmnononoopopopoppoopqpqpopopopopooponononononmnnmlmlmlmlklkjkkjkjijijihghgfgfggfefefededccbccbcbaba`_^_^^]]^]\]]\]\[Z[ZYZYXYXXWXWXWVWVVWWVUVUTS TSRSRSSRSRRQRQRQQPQPOPONONONMNMNMLMLMLKLLKJIJJIJJIHIHGHGFGFEDCBCBCBCBA@A@?@?>?>=<=<;<<;<;:;:;:9:9:9987878767656654543 4334332323212210/./.-.-.-- ,-,,-,,-,-,+,,+,,+*+*+**+*+*)*)*)())('('('(JKLKL MLMMLMMNMMNOPOPQPPQRQRSRSTSSTSTUTUVUUVWVWXWXWXYXYYZ[Z[\[\]\]\]^]^_^_`_`_`a`ababcbcbcbcdedeedeffgfgfghghghihijiijiijijkjkjklklmlmlmnmmnmnmnonoopopopopqpopopoppopopopoopoppooponoononoonononmnmnmlmllmmlklkjk jkjjijijijihiihihghgfgffgfedeededcdccbcbababa`_^_^]^]\]\[\[Z[YZYXYXWVUUTSRSRSRQRRQPQPONMNNM LMMLLKLLKLKJKJIJIIJIIHIHGHHGFGFGGFEFEDCDDCCDCBABA@A@?@@?@?>=<=<;<;:;;:;:9:98987887676565434323212101010/0/0/0/./././.-.--,-,-,+,+,+*++*+**++*)*)('('('('('('('(('(JKLMLMNMNONOOPOPQRQRSRSTSTTSTUTUTUVUVWVWXWXYYZYYZ[ZZ[Z[[Z[\[\]^_^^_^_`_`a`a`abaabbabcbcdccdcdededdefeeffgfgfghgghghhghihhihijijkjklklkklmnmmnmnonnonnonononnoonoopooppopopopopooppopopop opoopopooponononnonmnmmnmlmllmmlklkjkjijihihihhihghgfggfgfefefedcdccbcbaba`aa`a`_^_^_^_^]\]\[\[\[Z[Z[ZYZYZZYXYXYXW VWWVWWVVUVUUUTUUTSTTSRSRSRQRRQPQPOPONMNMNMLKLKJKJKJIHIHIHGHGFFEFEDEDCDCBCCBA@A@@?@?>?>=>=<=<=<;:9:98998787876767656545432332121121010/0/.//.-.--,--,+,+,,+,,+*++*+*)*)*)()()('('('('(JKLKLLKLMLMNONOONOPOPQPPQPQRQRSRSTSSTUTTUVWVVWWVWXYYZ[Z[ \[\\[\[\]\\]]\]^_^_^_`a`abaabcdedededefeffgfgfghghihijijkjklklmlmlmnmnmnnmmnnmnononononoopoopopoop opopooppoopopopopopopopopopoopopononoononmnmnnmlmlmlklkjijihihihihghhgfededcdccbccbcbaba`_^_^]^^]]^]]\]\[\[Z[[ZZ[ZYZYXWVWVUVVUTSTSRSRQPQPONONNMNNMLMLKLKJKKJIHGFGFGFEFEDEDCDCCDCBABBAA@AA@?@?>?>??>=>=<=<<=<=<;<; :;::9:99::98988987876766765654545434433432332321221011010/00/0/././.-.-.--.---,-,+,+*+*+*)*)*)())(())('('('('JKLKLMLMNMMNNMNONOPOPQRSRRSTSTUVUVWXWWXWWXWXYXXYYZYZ[ZZ[Z[\]\]^_^_`ababcbcdcdeddefefffgfghghghihihihijijjijkjkjklklklmlmlmmllmnmnmnnmnonoopopoop opopoppopoppopoppoppopopopoppopop opoopoopooponononoononmnmnmmnmlmlklklkjkkjihihihghgfgffgfeffeefededccbccba`a`_`_ ^__^_^_^^]^^]\]\[\[Z[ZYZZYXYXWXWVUUTUTSTSRSRQRRQRQPQQPOPONMNMLKJKJKJIJIHIHGFGFEFEDEDEDCDCBCBABAABA@A@?@?@?>?>?>=>=<=<;<;:9:98998787676565454434321210/.//.-.-.--.---,-,+,,+*+*+*+*)*)()()()('('('(JKLKLMLLMNMNONOOPPOPQPPQRQQRQQRSRRSRSTUTUVUVWVWVVWXYZYYZYZ[Z[\]\]\]^]]^_^_^_`_`ababababcbcdeddefeffgffghghihhijijkjkjklklklmlmlmmlmnmnmmnononnoonononopopopopopopoppo poppoopoopononononmnmnnmmnmnnmlmmlmlmlklkllkjkjijihiihhihihgfefedcdcddcccbcbaba`a`_`_^_^_^]\]\[\[Z[ZYXYXWXWXWVWVVWWVUVVUUTUTUUTTUTSSTSSTSRSRQRQPOPOOPNOONMNMNMLKLKJIJIHIHGHGHGFFEDCBCBCBCBABA@A@A@?@?@??>?>??>=<=<;<;:;:9:9887 8778776776767765656545432321212101101010/0/././.-..-.--,-,-,+,+,+,++*+*+*+*)*)()())()('(('('('(JKLKLMLLMNMMNONOPOPQPQQPQRSRSTSTUTUVUVWXYYZYZ[\[\]^]^_`a`a`aa``abcdcdedeeddefeffgfgfgffghihihhijijkjkjklklmlmlmnmmnmnmnonnonononoonopopopoppopopopopopopoopopopopoopoopononononmnmnmnmmlmmlklklkklkjkjijihihihghgfgffgfgfefededcdccbcbcbabba`a`a`_^__^]^]\]\\]\[\[Z[ZYZYXYXWXWXXWVWVUVUUTSTTSRQRRQPQPOPOPONMNMLMLKLLKJKJKJIHIIHGHGHGFFEDCBCBCBABA@A@?@?>?>?>=>=<=<<;<;<;:;::;;:9:98787656656654545434432321210110010/0/.//.-..--,-,,-,+,+,+,+*+*+*+*+*)*)*)()()()()()('('(JKJKJKLKLMLMNOPOPPOOPQRQRQQRSTSTUTUVWVWXYYZYZ[\[\]\\]\]^]^_^_^_`ababab cbbccbbcbdcdcdeddefeefefgfgffghghgghihijijijkjklklkkllklmlmnmnmnonoonopopopopop oppooppoppopo poopoopopoopononononmnnmnmlmlmlklkklkjkjijijihihgfgfgfeffefededdedcdccdccbcbcbbcbababa`a`a`_^_^_^]\]\]\[Z[ZYZYZYXYXWXWVWVWVUVUVUTSTSTSSRSRQRRQPOPONONONMNMLMLKLLKKLKJKJIJIJIJIHGHGFGFEFFEDCDCBABA@A@?@?>?>=<=<;<<;:;;::;:9:988787676765654543233232321210/./././/. -..--..--.--,-,,-,+,+*+*+*)**)*)**)()()()('('('(JKJKLMLMNMNMNONOPOOPOPQPPQR QRRSRSSRRSSTSSTUTUVUVUVWVWXWXYY ZYZZYZYZ[ZZ[\]\\]\]^]^]]^_^_`_`a`a``ababbabcbbcdeddedefeffgfgfghghihijij kjjkjkkjkjklklklmlmlmnmnmnonoonopopopopopoopopopopopopopopooppooponononononmnmnmmlmlmlklkjkjkkjkkjijihghgfgfgffgfefedededccbcba`a``a`_^]^]^]\]\\]\[\[Z[ZYZYXYXWXWXXWVWVWWVUVUUUT STSTSSRRSRSRQRQRQPQQPPQQPOPONONONMNMLMLMLLKLLKJKJIJIHIHGHGFGGFEDCDCCBCBABBA@A@?@??@?>??>>=>=>==<=<<=<;<;:;:9:9987878767676765665665454545543232101010/00/././.--,-,+,,+,,+,++,+*+*+*)* )*)*))**)*)()()()()('('('('(('(JKJKLMLMLMNONOONOOPOPQRQRSRSRSSRSTSTUTUVUVWVWXWXYXYZ[Z[Z[\[\[\]\]^]^_^_`abcbcbbcdcdccdcdedefeffgfghghihijijijkjjkjklkl mllmlmlmmlmnmnmnmmnonnononopopopopopopooppopopooppopopopopopononoonononmnmmlmlklklklkjkjijihihgfgfgfefededcdcddccbcbcbbababaa`aa`_`_^__^]^]\]\]]\[\[\\[Z[Z[ZYXYXWXWVWVWVUVUUTUTTUTSTSTSRQRQPQPQPOPONOONMNMLMMLKLKJIJIHIHHIHGHGFGFEFEDEDDEDCDCBCBABAABA@A@A@A@?@?>?>?>=>>=<=<;<;<;;<;:;:9899876776565434323232121010010/0/./..//.-.--,-,-,+,,+,++,+*++*+**+*)**)*)()()('('(JKJKJKLKLKLMLMNMNOPOPOOPQPQRQRSRSTSTUTUTTUUVUVUVWVWXWWXYXYZYYZYZ[ZZ[Z[\[\]\]^]^^]]^_`a``abaabcbcbcdcddeedededefefefgfggfghghihihijiijjiijkjklklklmlmnmnmnononnnononopopoopoopopoppopopopooppopopopono noonononnonnoonmnmnmnnmnmlmlmmllmllmlklkjkkjkjkkjijjijihihgfgfefefed edededdcddccdcbcbcba`a`_`__``_^]^]\]\[\[\\[Z[ZYZYYZYXYYXWVWVUVVUVUUTUTTUTSTSTSRSRQRQRQPQPONONMNMNMLKLLKLKKJKKJJKKJIIJIJIHIIH GHHGFGFGGFFEFEFEDCDCBCCBABA@A@?>?>=>=>=<=<=<;<;:;:9:9:98878767676565454454454344334323212122121010/00/././.--,-,,-, +,+,,+,+,,+*+* )**)*))*)*)()()()(()('('('('('('('('(JKJKLKLMNMNOPOPQPQPQRQRSRRSTSTUTTUVWVVWXWXYXXYXYZYYZZYZ[Z[\[\]\]\]\]^]^_^_`_`a`a`abaabbabcbbcdcdcdedeeddefe effeffggffggffghihihijijijkjkjjklkklklkklmlmlmlmnmnmmnonononopopopoopopopopopooppopoponoonononmnmnmmlmlmlmmllkllklklkjkjkjjkjijihiihhihhihghghgfgfefededcdcbcbcbcbaba`aa`_`_`_ ^_^^]^^]]^]\]\[\[Z[ZYXYXWXXWVWWVWVUVUTSTSRSRQRQPQPONMNMLKJKJIJIHIIHGFGGFEFFEDEDDCDCDDCDCCBCBBCBBABBA@A@?@?@?>=>=<=<=<<;<;<;::;;:;:9:989876767656545454344343232121010/0/././.-.-.--,-,-,-,+,+,+,+,+ *++*+**+*+*)*)()()(()('('('('('('(JKJKLKLLMLMNONNONONOPOPQPQRSRSTSTSTSTTUTUVWXWXYYZYYZZYZ[Z[\[[\]^]]^_^_`_`a`ababcbcdcdccdededeffgfgfghghihihijijkjkjklklmlmlmnmnonononnonopopopoopopoponoonononon mnmmnnmnmmnmmlmlmlmlklkllklkjkjjkjkjijijihiihiih ghhghgghhghgfgfefefedeedcbcbaba`a`aa`_``__`_^_^] \]\\]\\[\\[\[Z[Z[ZYZYXYXWVWVUVUUTUTSTSTSRSRQRQPQPOPONONMNMLMLKLKLKJKJIJJIHGHGHGFGFGFEDCDCBCBCBABA@AA@?@@?@?>?>?>=>=<=<=<=<;<;:;:9:9898 788778767766765665655654545434323323221212101010/0/0/. -.-..-..--.--,-,-,+,++,++,+*+*+*)*)**))*)()('('('('(IJK LKLLKLLMLLMNONOPOPQPPQQPQRQRSRRSRSTSTUTTUVUVUVWVWXYYXYZYZ[\[[\]\]^]^_^_^_^_`_`_`abaabababcbcbcdcddcdedefefefefefgfghghihhihhihijijijkjklkkllkklmlmlmnmnmnonnoononopopo poopoopopopopo noonnonononononmnmnmnmmlkllklkjkjkjkjijijijihiihihghgfgffgfgfefeeffededcdccdcbbcbaba`a`_`_^__^__^]\]]\[\[ZYXYYXYXYXWXWXWVWVUVUUUTSTSSTSTSRQPQPPQPPOPONONNMLMLMLKLKKLKJKKJIHIIHGFGFEFEDEDCDDCBABA@A@A@?@@?@?>=<;<<;;<;:;:9:9898787676565454545434343232121010/0/0/.//.-..-.-,-,-,+*+*+*)*)*)**)()()()('('('(JKLKLKLKLMNMNOPOPQRQRSRRSTSTSTUTUTUUVUVWVWXXYZYZ[Z[\[\]^]]^]^_^_`_`_``_`a`ababcdccdcdcdeddefefgfghghihihiijjiijijkjkjjklkklmllmlmlm nmmnmnmnmmnnmnn onnoononoononopooppoopopopoponoonononmnmnmnmmlmlmlklklkjkkjkkjijihihihhihghghgfgfgfefefedcddcbbaba`_`_`_^_^]^]]^]\[\[\[[Z[Z[ZYZYXWVWVUVVUUTUTSRSSRQPQPOPOPPONOONNONMNMLMMLKJKJKKJIJIJIHIHHGHHGHGFGFGFEFEDEDCDCBCBABA@?@?@?>?>=>=<=<<=<;<;:;;:9:9:9899876767676566545432121010010010/0/./.-.-.--,-,-,+,+,+*++*+*+*)*)*)())()()('('(JKJKKJKLMNMMNMNONOPOPQPQRSRSTUVUVWXWXXWXYXYXYYZYZYZ[Z[[Z[Z[\[[\]\]\]^]^_^_`_`_`a`ababcdcdedefefghgghijijklklklmlmlmlm nmmnmmnmnmnnmnonnononnononononoponononononmnmnnmmnmnmlmmlmlkllklkjijihihihihghhgghgfgfefededcddcdccbaba`a`aa``__`_^_^__^]\[\[Z[[Z[ZYZYXWVUUTUTSTTSRQRQRQPOPONONMNNMLMLKJKJKJIJIHIIHIIHGHGFGFGFEFEDEDCBCBABA@AA@?@?>??>=<;<;:;;:9::9:99898876767656565454545432321212101010/00/./.--,-,-,+,+*+*)*)())()('('('('('(JKJKLMLMLMLMNONOPQPQRQQRSRSTSTSSTUTUVUVWVVWVWXWWXYXXYZYZZYZ[\[\]^]^_^_`a`ababcbbcdedefeeefgfgfggfgghghghihiihhihijkjkjkjklkllklmlmlmnmnnonnonononoonononono noononnonnonoonmnmnmnmmnmlmmmlklklklklkjkjkkjihihihghghgfggfgfefedcdcbaba`a`aa`_`_^]\]]\[Z[Z[[ZYZYXYXYXWVWVWVUUTSTSRSRQRQRQPQPOPONOONONMNMLMMLKLKKLLKLKKJKJJKJIJIJIHIIHIHGHGFFEDEDEEDCDDCBCCBA@A@?@?>=>=>=<;<;:;:9:9:989898787676565454321221010/0/0/.//.-.--,-,+,+*+*+*)*)*)*)*)()(()()('('('(('(JKLKLMLMLMNMNONONOPOOPQPPQRSRSTSTUTUVUVUVWVWXWXYXYZ[Z[\[\[\]\]\]^]^]^_^_`a`a`ababcdccdcdedefeefefgffghgghihijijijkjklkklkllklmlmllm nmnmmnmmnmnnmmnnononononononoonnononononnoononmnmnmnmlmmlmlmlklklklkjkjijihihihgfgfgfefededcddcbcbabba`a`_^_^]\]\[\[[\[[\[Z[Z[Z[ZYXWVUVUUUTTUUTSTSTSRQPQPOPONONMLMLKLLKLLKLKJKJIJIJIHGHGHGFGFEFEDEDCDCDCBCBCBABA@?>?>=<=<;<;:;;:;:9:989878878778767665654554343432332321210100110010/0/.//./../.-.--,-,-,--,+,+*+*+**+*+*)*)*)*))*)()('('('('('JKJKLKKLKLMLLMNONONOPOPQPQRQRSRSTSTUTTUVWXWXYXYZYYZ[Z[\]\]^_`__`_`abcbcdcdedefeefgfggfgghghghihihijiijiijijkjklklklmlmlmnmnmnmnnmnmnnmnonononoonononononoononononmnmnmlmlmlmlklklkklkjkjkjkjijijihihihghgfgffgfgfefededcddcddcdcbccbababa`a`_`_`_^]^^]]^]\[\[Z[ZYZYXYXYXWVUVUVUUTUTSRSRQRQPQPOPONONMNMLMLKJKKJIJIIHGHGGHGFGFFEFFE DEEDEDCDDCCDCBCCBABA@AA@A@?>=>=>=<=<;<;:;;:9:9:988787876776765654545543432121010/0/./../../.-.--,-,+,++,+*+*)**)()()()('('(JKJKLMNMNNOONNOPOPQPPQPQPQRQRSTSTSTUTUUVUVUVW XWXXWWXWXXYXYXYZYZ[\[\]\]^_`a``abababcbcdcdedededefefeffgffgfgfghghihihihijijkjjkkjklkklmlmllmnmnmnnmnononononononnonononnonoononononmnmnnmnmlmmllmmlkllkllkjkjkkjkjijijijihihgfgfgfefedeededcddccddcbcba`a`_`_`_^_^]\]\]]\[\[Z[[Z[[ZYZYXYXWXWVWVWVVUVUVUUTUTSTSRSRQPQPOPONONONONMLMLKLKJIHIHGHGFGFGFFFEDEDEEDCBCBABBABA@A@?@?>?>?>=<=<;<;;:;:9:9898878787677667656545434343232121010110010/0//0//0/./.-.-.-.--,-,-,+,+,+,+*+*+*)*)*)**)*)()())(()(()('('('(JIJKJKLKLMLMLMLMNMNNMNOPQPQRQQRSTSTSTUTUTUVUVUVWVWVVWXYXXYXYXYZ[ZZ[\ ]\]\\]\]]^]^_`__`a`ababbabcbbcdcdcdedeefefgfgfgghghihihijijiijijijkjkjkjkklkkllklklmllmlmnmnmnnmnnnonononononnononononononononononononononmnmnnmnmlmlmlmlklklklkjkjkkjijihiihghgfgfgffgfefededcdcbcbbbcbaba`a`_`__`_^]^]^^]\]\\]\[Z[ZYZYXYXWXXWVWVUVUUTSTTSTSSRSRQRQPQPONONMLMLKLLKKLKJIJIHIHIHGFGFEEFFEDEDDCDCBCBA@A@?@@?@??>?>=<==<<=<;<<;: ;::9::99:99:9898876766765654343432321212210101010/0/0/./.-.--,-,--,+,,++,,+*++*+*)*)*)*))*))*)()()(()()('('(JIJKLMNMNOPQPQRQRQRSRSTSTUVUVWVWVVWXYXYZYZ[ZZ[Z[\[\[[\]\\]^_^_^_`_`a`aa`abaab cbcbbcbbccdcdeddeedefefefgfggfghghihhiihijiijijkjkkjklklkllkllmlmlmnmnmnmnnnmnononononon onnoononononononononononmnmnmnmlmllmlmlklklklkjkjkkjijijihgfgfggfgfefedcdcbcbaba`a`a``_``_`_^_^]\]\[\\[Z[ZYZYXYXYXXWVUVVUUTSTSRSRSRQPQPQP OPOOPOONONNONMNNMLKLKJKJKKJIHIHGHHGFGFGFFFEDEDCDCDCBCBA@A@?@?>??>=>=<;<;<;:;::;;:9:989898787676565654545434343232121210/00/./.-.-.--,-,+,+,+*+*+*)*)*)*)())('('('('('('('('(JKJKLKLMLMMLLMNONNONONOPQPQPQ RQRRQRRSSRSTSSTUVUVWXWXYXYXYZYZ[Z[[Z[\[\]\\]\\]^]^_^_`_`_`a``a`abababcdcdcdcdedeeffeffefghghghhihhiihijijijkjklklmlmlmnmnmnnmnonnonnon onoonoonnon onoonoonononononononmnmnmnmnmlmllmmlkllklklkjkjkjkjijijihihgfgfefedededcdcbcbcbcbbabbaba`_``_`_^_^_^]\]\[\[Z[[ZZ[ZYZZYZYZYXYYXWXWVUUTSTTSTSRSRQRQPQPPOOPONONMNMMLMLKLKLKJKJIJJIHIHGHGGFGFFFEFEFEDEDCDCBABA@A@?@?>?>=>=<=<;<;:;:9:98988878765656545434344323233212121121011010/0/00/0/./.-.-.--,-,-,+,,++,+*+**+**+*)*)*)*)()()())(()('('('('(IJKJJKLKLMLLMNMNONOPOPOPOPQPQQPQRSRSTUTUTUVWVVWXWXXYXXYZYZ[\[\[\]^]]^]^_^_`a``abcbcbccdcdcdcddedededeefefgfgfghghihijkjklklklklmlmnmnmnmnononnonon onoonnonnoonononnonmnmnmnnmnnmmnmlmlmmlmlklklkjkjijihiihghghgfgfefededcdcdcbcbcbba`_`_`_`_^]\]\[\[Z[ZYZYXWXWVWVWVUUTUTSTTSRSRSRQRQPQPOPOPOPONMNMLMLMLKJIJIJJIHIHIIHGHGFGFFFEFEDEDCDCBCBBCBABA@?@?>?>=>==>=<;:;;:;:9:98998998898787676566545445432321221010010/0/0/./.-.--,-,-,+,+*+*+**+*)*)*)()()('('('(('('('('('((IJKJKLKLMNMNONOPPOPQPQRSRSSTSTUVUVWVWVVWXYXYXXYZYZYZYZ[ZZ[\[\]\\]^]^]]^_^_`a`ababbcbcdcdeefeefeefgfgfgfghghihijijkjkjklklklmlmlmlmnmmnmnmnononononnonononmnmnmnmnmnmlmlmlmmllklklkllkjkjjkjijijjijihiihiih ghhghgghgghgfgfefefedeedcdccdcbcbccbbbaba`a`a`_^__^]^]]\]\]]\[\\[\[Z[Z[ZYZYZZYXYXWXWWXWVWVVWVUVUTUUTSRQRQPQPOPOPONOONMNNMNMLMLLMLKLKJKJKJIHIHGHGHGFGFFFEDEDCBCCBCBABABBA@?@?>?>=>>=<;:98988787676767656545454344343232121221010/0/./.--,-,+,+,+*+*++**++*)*)()()()())()('('('('('('(IJKJKLKLMLMNMMNONOPQPQRQRSRSTUTUVUVWVWXWXWXXYYXYZ[\]^]^_^^_`_`a``a`ababcbcbcdcddcdedededeefefefgfghgghghghihihijkjkjkjlklmlmnmmnmmnmnmnonononnonnonononononmnmnmnnmnmnmmnmlmmlmllklklkklkjkjkjkjijijijihihhihghgfgffgfgfefeeffededcdccdcbcbcbbaba`aa`a`_^]^]^]\]\[\[Z[ZYZZYYZYXYXWXWVWVUVUVUTSTSTSSRRSSRQRQPONOON MNNMMLMMLMLKLK JKJJKJJIJIJIHGHGHGFGFFEDEEDCDCBCBBCBABAB@AA@A@?>?>=>=<=<;:;:9:9887887676565454543443212101010/00/0//0/.//./.-.-.-,-,,-,-,+,+,+*+*)**))*) ())())()()('('('('('(JKJKLMLMNMNONOPOPQPQRQQRSRRSTSTSTUTUTUVUVVUVWVWXWXXYXYZYZ[ZZ[ZZ[\[\[\]\]^]^_^_`_`_`a`abababcbcbcdcdededeefeffefgfghghghihhihijijijijijkjjkjjklkklklklmlmllmmlmlmnmmnnmnmmnmnmnonononononnoonononmnmnmmnmmnmlmlmllmlmllkllklklkjkkjkjijjijijijihihihihghgfggffgfgfefefedcdccbbcbcbbababa`a``a`_`_^__^]^]\[ZYZYXYXWXWVUVVUTUTSTSRSRQRQPQPONONONMLMLKLKLKJKJIJIJJIHIIHGHGFFEFEFEDEDCDDCBABA@?@?>?>=>=<=<<=<;:;:9:98878767656545454343232232121121010/00/./.-.--,--,-,+,+*+*+*+*)*)*)()(()('(('('('('IJJIJKJKLKLMLLMLLMNONOONOPQRQQRQRSRSTUTTUVWVVWVVWXXYXYZYZ[Z[\[\]\]\]^]]^]^_^_^_`a`a``ababcbcdccdcdcdedeefefgfghghihijijijkjklklklmlmnnmnmnmnmnonononmnmnmmnnmnmnmlmlklkllklklkjkjkjijihihihghhgghgfgfefededcddcdcbcbbaba`a`aa``__`_^_^_^]^]\]\[\[ZYXWXWWXWVUTTUTSTTSRSRQRQPONOONMNMLMLKJIJIHGHGFGFEFEDEDEEDCBCCBCBA@?@@?>?>=>=>=<==< ;<;;:;::;;:9:98998878765654344323212112101010/0/./.-.--,-,-,+,,+,+,,+*+*+*)*))**)*)()()()('('('('(('((IJKLKLMNMNMNMNOPOPOPQPQRSRRSRRSTUTUTUVUVWVVWXXYXYZ[Z[Z[[\[\[\]\]]\\]^]]^^]^_`_`_`a`abaababcbcdcdcdcdedeeefeffefghghgghijijijklkllklklmlmmlmlmlmmnmmn mnmnmnnmnmnnmnmnmnmnmnmnmmnnml mlmllmllmlmlmllklklk jkkjkkjkjjkjijihihihghgfggfgfefededcdcdcbcbcbbabaababba`_`_^_^]^]\[\\[Z[[Z[[ZYXYXWXXWVUTUTSTSRSRRSRQRQPQPQPONONMLKLKLKJKJIJIHGHGFGFFEFFEFEDEDCDCBCBBCBABABA@A@A@?@?@?@?>?>>?>=>=>=<=<;:;;:9:9887878767765654545434434323233210 /00//0//.././../.-.-,-,,-,-,+,+,++,+*+**+*)*)()(()()(()('('('IJKJKLKLMLMNMNMMNMNONNONNOPQRQRQRSRSRSTSTUTTUVUVWVWXWXWXXYXYZYYZZYZ[Z[Z[Z[\[\]^]^_`_`__``a`abcbcbbcbcdcdeddefgffgffggfghghihijijijij kjkkjkjkjjklklmlmlmlmlmlmmnmnmnmnmnmnmnmnmnmmnmnmnm lmlmmllmlmmlklklkjkjkjkjijijijihihghghgfgfgfefededcddcbcbbaba`a`a`_`__`_^_^_^]^]\]]\[ \[[\[[Z[Z[[Z[ZYZYXWVWVUVUTUTTUTTSTSRSRQRRQPQPOPONONONMLMLKJKJIJIHIHIHHIHGFGFFFEDCDCDCBCBABABA@A@@?@?>?>=>=<=<;<;:;:;:9:988788787676676565654554343432321010/.//././.--,-,-,+,,+*+*)*)*)*)()()()('('(('('('( JIIJJKJJKJKKJKLKKLMLMNMNMNONONOPQPPQRQRQRRSRSTSTUVUVWVWVWXWXXYZYZ[\[\]^_^_^_`_`abcbcdcdeefeeffefgfghghghihhihijijiijkjkjklkllklklmlmlmlmlmlmmnmnmnmnnmnmnmnmnnmnmnnmnmnmnmlmlmlmlmlkkjkjkjjkjijijijihihgfgffgfgfefededcdcbcbaaba`a`a`_^]^]]^]\]\[\[Z[[ZYZYXYXWXWVWVWVUVUTUTSRSRQRQPQPOPONONMNMLMMLKLKLKJIJJIHIHIHGFFEDCDCBCBABABAA@@A@?@?>?>?>=>==<=<=<;<;;<<;:;:989988787878767677656554554343343212121010/0/.-.-.-,-,,-,+,+,+,+*+**+*)*)*)*)*)*)()()('('('('('('('(IJIJIJKLKLMLMLMNONONOPOPOPQRQRSRSTSTSTUTUVWVVWVWXXYXYZYZYZ[\[\]^]^_^_`_`_`a``a`abababcbcbcbcdcdcdededefefefgfgfghghghihhihijijijjijijkjjkkjjkjkklklkklklmlmlmlmllmlmnmnmnmnmnmnmnmnmmnmnmnmnmnmlmmlmlkklklkjkkjkjkjijijihihihghhghgfgfgfefedeededcdcbba`a`_`_`_^_^]\]\]\[\[\[Z[[Z[ZYZYXYXWXWXWWVWVWWVUTTUUTSTTSRSSRQRQPQPPQQPOPOPONONMNMLMMLLMLKLKJKJKJKJIHIHGHGGHGFGGFFEDEDCBCBABA@A@?@?>=<==<=<;<<;;<;:;:9:9887877876767767656654543432121010/0/0/.//.-..--.--.--,-,+,,++,+*++*+*)*)*)('('('('('('('(('(IJIJKJKJJKLKLKLMLMMLMNMNONOPOOPQPQQRRQRRQRSRSTSTUTUTUVUUVVUVWVWVVWXWXXWXYZYZ[Z[\[\]\]\]^_^_^_^_`_`_``a``a`ababcdcdcdeddefgfghghghghihihihijijiijijkjklklkllklmlmmlmmlmlmmnmnmnmnmnmnmnmnmnmnmnmnmnmnmnmnmnmnmmnmnmlmlmlmlkllklklkjkjkjkjkkjijjiijihihghghgfgfgfgffgfefededcdcbcbbcbcbabaaba`a``a`_`_^_^_^_^]^^]\]\]\[Z[ZZ[ZYZZYZYXYXWXWXWVUTUTSTSTSRSRQRRQPOPOPONONMNMMLMMLKLKJKJIJIHIHGHGFEDEDDCDCBCCBABA@A@?@@??>?>?>=>=<=<;<<;:;:;;:98988878765665565454455434343232122121121010/././/.//.-.-.-,-,+,+*++*+*+*)*)('('('(IJKJKLKLM NMNNMNOONONOPOPQRQRSRRSSRSTSTUTUVUVWVWXWXXWXXYXYXYZ[Z[\[\[\]\]^]^_^_^_`_`a`a`a`abaababcbcdcddcdededefefgfgfghghhghghijijijkjklklklklmlmlmlmlmnmnmnmnmnmnmnnmnmnmnmnnmnmnmnmnmnmnmnmlmlmlmlklkjkjjkjijijihihihghgfgfgfeffefededcdcbcbbaababa`_`_`_^]^^]^]\[\[ZYZZYXYXWXWVUVUVUTTUTSTSRQRQPOPONONONMNNMNMLMLKJKJIJIHIIHIHGFFEFEDCDCDCBCCBABA@A@?@@?>=>=<;<;:;;:9:989889887887887676776565454343212101010/././/./.-.-.-,-,-,+,+*+*+*+*++*)*)*)*)*)()())('('('(('('('('('(JKLKKLKKLMNMNOPOOPQPQQPQRQRSRSTSTUVWVWWVWXXWXXYYXYZ[Z[Z[\[\]\]\]^]^_^_`__`a``aa`ababcdcdededeefefefgfgfghgghihijijijkjklklkklklm lmlmmlmlmlmllmnmnmnmnnmmnnmnnmmnnmnmnmnmnmnmnnmnnmmnmnmlmlmlmlklkllkkllkjkjkkjijijihihihihghhghhgfefefedcbcbabba`a`aa`a`_``_`_^_^]^]\]\]\[\[[\[[\[Z[ZYZYXYXYXXWWXWVWVVWVUVUTUTTUTSTSTSRSSRQPQQPOPONONMNMLMMLMLKLLKKLKJKJIJIHIHGHGHGFFEFEDEDCDCBCCBABA@A@A@?@@?@?>??>??>=>=<=<;:9:98988787677654543434334432321212121010/0/././.-,-,-,+,+,+*+*+*)()()('('('(IJKJJKLKLMLLMNMNONOPOPQRQRQRQRSRSTSTUTUVUVUUVWVWXWWXXXYXYZYYZZYZYZ[Z[\[\[[\]\]\]^]^]^^_^^_`_`abcbcdcdeedefeefgfgfghgghgghghihijijijijkjkjjklkkllklklmlmlmlmmlmlmnmnmnmmnmnmnmnmnnmnmnmnmnmnmmnmnmlmlmlmlmlklklkklkjkjjkjijijijihihihghghgghgfgfefefededcdcdcdcbcbabababba`_`_^_^_^]^]^]\]\\]\\[\\[ZYZZYXYYXYXXWXWXXWVWWVWVUVUTUTTTSTSRSRQRQPOPPONONOONMNMLMLMLKJKJIJJIJJIHIHGHGFGGFEFEDEDCDCDCBABA@A@? @??>?>??>?>=>=<=<;<;;<<;:9:98989888787676676566556545543434323212101010/0/0/0/00/./.-.--,-,-,+,+,+*++*+*++*)*)**)*))*)()()()(('('('('('('('('(IJKJKLMLLMNOPOPOOPQPQRQRQR SRSRSRSSTTSTSTUTUVWXXYXYXYXYZYZZYZ[ZZ[\[\]^]^_^__``__`_``a`a`abcbcdcdcdeddedededefeefefgfgfgfghghihhihijijijkjkjklklmlmlmlmmlmmlmnmnmnmnmnmnnmnmnnmnmlmlmllmmlmlmlklkklkjkkjkjkjijijihihiihihghgghghgfgfefededcdcbcbcbabbaababa`a`_`_`_^_^_^]^]\]\[\[Z[ZYZYZYXWXWVWVUTUTTSTSRQRQPOPOPONOONMLMLMLKLKJIJIHGFGFGFFEFEDCDDCBABAABA@A@?@?>??>>?>=>>=<=<==<;<;:;:9:98988787656565454554343232101010/0/./.-.-,--,-,,-,+,+,,+*++*+*)*)*)*)*)()()()('('('('(('('((IJKJKLK LKKLLMLMLLMNMNONOPQPQPQQRQRSRSTS TSTTUTTUUTUVWVWXXYXYZYZ[Z[[Z[\[\]^_^_`a`abcbcdcddcdcddedefgfghghghihijijijkjkjklkklklkklklmlmlmlmnmnmnnmnmmnmnmnmnmmnnmnmlmlmllmmlmlklklklkklklkjkjkjijihihihighghghgfggfgfefedeededcbcbababa`aa`_`_``_^__^^_^]^]\]\\]\[\[[Z[Z[[ZYZZYZYXYYXWXXWVUTUUTUTSTTSRSRQRQRRQPQPOPONONMNMNMNMLMMLMLKLKJKJJKJIHIHGFFEDCDCBABABA@A@?@?>?>>?>=>=<=<;<;<;:;:;:9:9:9898998878878676765654543434323223212112121010/0/0/./../.-,---,-,+,+,,+*++*)*)())()()()()('('('(IJIJKJKLKLMLLMLLMNMNMNONNOPQPQRSRSTUTUVUVUUVWVWXWWWXWXXYXYXXYZ[Z[ZZ[\[\]^]^]^_`_`a`abababcbcdcddcddefeffegfgfghghghghihijiijijijkjkjklklkklklklmllmlmlmmlmlmnmnmnmmnmnmmnmnmlmmlmlmmlmlmmlmlklklkllkkjkjkjkjkjiji hihihihiihihihghghgghgfgfggfefededcdccdcbcbabba`_`_`_^_^]^]\]\[\[\[\[Z[ZYZYXWXWVWVUVVUTUTUTTSTSSRSSRSRQRQRQQPQPQPONONMNNMLMMLKLKJKJIJJIJIHIIHGHHGHGFGFFGFEFEEFEDCBCBCBABA@A@?@?>?>??>=>=<=<==<;<;<<;:;:;:9:98989898878767656554543432321221010/0/0/./../././.-.-.-,-,-,-,+,,+,+*++**+**+*)*)*)()())()()('('(JIJIJKJJKLKLKLMLMNONONOPOPQPQRQRSTSTTUTUVUVWXXYXYXXYZYZ[\[\[\]\]^]^_^_`a``a`ababcbcbcdcddedefeffefgfgfghghghihijijjijijkjkjkkjkkjjklklklmllmlmmlmlmlmlmnmnmmnmnmlmllmlmlmllmmlklklkkkjkjjkjijihihihghghgfggfgfeffeffededcbccbaa`a`a`_`_^_^]^]^]\]]\[\[Z[[ZYZYXWXWVWVWVUVUUVUTUTUTSTSTSRQRQPONMLMLKLKJKJIJIHIHGHHGFGFEFEDEDCDDCBCBBCBABA@A@?@?>=>=>=<=<;<;<;:;:9:98989898878878876765665434343233232232121121010010/././.-.-..--,-,-,+,+*+*+**++*)*)*)*) ())(()())()('('('('((IJIJKLKLMLMLLMNMMNONONOPOPQPQPQRSRSSTSSTSTUTUVUUVWXXWXYXYXXYZ[Z[\[[\\[\]\]^]]^^]^ _^__`__`__`a`abaabcbcbcdcdcddedededefgfgffg fgghghghhghghihihi jiijijjiijijkjklklklkllklmlmllmlmlmlmllmlmlmnmnmlmlmmllmlmmlmlkllklkllklklklkkjkjkjkjihihihghhghhgghgfgfefededcdcdcbabbabaaba`aa`a`_^_^_^]^]\]\]\[\[ZYXYYXWXWVWVUVUUVUTUTTSRSRSSRQ RQRQQPQQPQPOPONMNMMNMLMLKLKJKJJIJIJIHIHGHGHHGFGFFEDEEDEDCBCBABA@A@AA@?@?>?>?>=>>=<==<;<;:;:98989989887876767675654545434343232321210/0/././.-.-.--.-,-,-,+,+,+*+*)*)()()(()('('('('(IJIIJKJKKLKLMLMNMNONNOPOPQPQPQRSRRSTSSTSTUVUVUVWVWWXYXYYXYZYZ[Z[\[\]\]^]^^]^]^_^_^_^_`a`a`abababcbcbcdcdcddededefeffefghghhghihihijijijkjklkklklklkkllklmllmlmlmlmlmlmlmlmlmllmmlmlmlmlmlmlmlmlmlmllkkllklklklkkjijijjihihihghgghgfgfgfeefededeedcbcbaa`a`_`_^_^_^_^]^]]\\]\]]\[Z[ZYZYXWXXWVWV UVVUUTUUTUUTTTSTSRSRQRQQPQPOPOPONMLMLMMLKJKJIJIHGHGHHGFEEDED CDCCBCCBBCBA@A@?@?>=>=<=<;<<;<;:;:9:98998878767654543432321212101010/0//0/././.-.-.--,-,+,+,+*+*)*))*)*)()())()('('(('(''('(JIIJIIJKJJKJKLKLMLMLMMLMNMNONOPQPPQPPQRQRSRSTUTUVUVWXWWXYZYZ[ZZ[\[\]\]\]^]^]^]]^^_^^_^__^_`__`a`a``abcbcbcdcdcddedefeefefgfgfghghihiijijijiijijkjkjkjklkkllkllmlmlmlmmlmlmlmlmmlmlmlmlmlmlmmlmlmlklkllkklkkjkjkjijjijijihihhihhihghghgfgffgfefededcdcdcbcbabaaba`a`_`_^__^_^]^]\[\[\\[Z[ZYZYXWXWWXWVUTUTTSTSRSRSRQRQQRQPQPOPPONOONONMLMLKLKLKJKKJIHGFGFEFFEDEDCDCB ABAABAA@AA@A@?@?>?>=>=<;<;:;::;:9:9:98987887677656556654554343432322321212101010/0/0/.//.-.-,-,+,+,+,+*+*+*)**)()('('('('('(('(IJKLKLKLMLMLMNMNONONOPOPQPQPQQRQRQRSRSRS TSSTTUTUTTUVUVWVWWXYXYZYZ[Z[[Z[\[\]\]\\]\]]^^]]^]]^_`__`a`ababcbccbbcdcdcdcdddedefefeefgfgfghghghghihihihijijijkjjkjkjjk lkllkllkllkllmlmllmlmlmlmmlmlmlmmlmlmlmllmllmlmllmlmmlklklklkkjkkjjkjjkj ijiijjiijijihihiihihghghghhgfggfefefedeedcdcddccdcbcbaa`a`a`_`_^__^^_^^_^]^]^]\]\[\\[[\[ZYZZYXWVUVUVVUTUUTUTTTSSTTSSTSRSRQRQRQRQPQPONMLMMLLMLKLKKLLKJKJIHGHGFEFFEFEDEEDCDDCBABBA@A@?@?>=>>=>=<=<=<;<;:;:98998989887876767654343432322332122122122101010/0/.//./.-.-.--.--,,--,+,+*+*)**)*)*)()()()('('('(IJIIJIJKJKLKLKLMLMNMNONOPOOPOPQPQRQQRQRRSRRSSRSTSTTSTTUVUVWVVWVWXWXYZYZ[Z[[ZZ[\[\]^_^_^_`__`a`aa``ababcbcdcddcddedefefgffgfghgh ihhihihihhijijjiijijkjkjkjjkjklklkllkklkllmlmlmmllmmlmlmmlmlmmlmlmlmlmmlmlmlmllmlmlmlmmlmlmlklkjkjkjijijiijihihihihghghgfggffgfeffeefededcdcbcbabaa`aa``a`_``_ `__^^__^^_^]^]\]\[\\[\[ZYZYYZYXYXYXXWXWVUVUVVUTUTTSTSRQRRQRQRQPQQPOPONONMLKLKLKJIJIHIHGHGFGFEFEFEDEEDEDCDCBCBBCBA@A@A@@?@?@?>??>?>=>>=<;<;:;:9:9878767676565454454344323223212121010010/0/./.-.-,,-,+*+*)**))*))*)()('('('(IJIJJKJKKJKLMLMNONOPOPQPQPQRQRSRSTSTUTUVUVUVWVVWXWXYZYZ[Z[Z[\[\]^]^]^_^_`__``_`a`ababcbccbccbcdcddcdedeedefefgfgffgfghghhghihihijijijijkjkjkjjklklkklklkllklklllmlmlmlmlmlmlmlmmlmlmlmlmlmlmlmlmlmlmlkllkklklkjkjkjkjijihihihghghg fgfgffeffeffefedededcdcbcbababaa`_`_`_^]^]\]\\]\[\[Z[ZYXYXWXWVWVUVUVVUTTSRQRQPQPPOOPPONOONMNMNNMLMMLKLKJKJIJIHIHGHGFGFEFEDEDCDDCDCBA@A@?@@?@?>?>?>=<=<;<;<;:;:9899878767656 5655455445434343233232121010100/0/0/././.-,-,,-,-,+,,+,+*+**+*)*)*)*)*)()()('(IJIJKLMLMNONNOPOPQPQRSRSSRSTSTUVUVWVWXWWXYXYZYZZYYZ[Z[ZZ[\]\]^]^_`_`_`a``aa`abcbcdcdcdddedefefefefefghghgghgghihihhiihijijijkjjklkklkllklkllmlmlmmllmmlmmllmmlmlmlmlmlmmlmmlmlmlmlklklkllkklklklkjkjkjkjijijihihihghgfggfggfeffefedcbcbababaa`a`aa`aa`_``_`_^_^_^]^]]^]]\]\[\[[\[Z[ZYZZYXYXYXWVWVUTUTTUTSTSTTSTSRQPONONMNMNMLKLLKJIHGFEFEDEDCBABA@A@?@@?@?@?>?>=>=>=<;<;<;:9:989898787676765656545443432321212101010/0/0/./.././.-.-.-.-,--,-,-,+,+,+*++**+*)*))*)()()()('('('('('('(IJIIJKLMLMMNMNONOPQPQPQRSTSTUVUVWVWXWWXYXYZ[\[\]\\]^]^^]^_^_`__`a`a``abcbcdcdccdddedefeefefefgffgffghihihiihijijiijiijkjkjjklklkllklmllmlmlmlmlmlmlmlmllmlmlmlmllmlklklklkjkjkjijijijihihhihihghghghgfgfgfgfefefededcddcdcbcbcbabababbaa`a`_`_^_^_^]^^]^]\]\[\[Z[ZYXYYXWXWVUV UVVUUTUTUTUTTSTSRSRQRQRQPOPONMNNMLMLKLLKLLKJIJIJIHIIHGHHGFEFEFEDEDCDCCDCBABA@A@?@?@?@?>=<;<;:;:9:98989877876545455434343343232332122112101010010/0/00/././.-.-..-.-,-,+,,+,+,+* +*+*+*+*+*)**)*)*)()()()('('(('(''(IJIIJKLKKLMLLMNMNONOPQRQQRSRSRSTSTSTUTUVUVWVWWXWXYXYZYYZZYZ[\]\]^]^_^_`__`_`a`abcdcddcdedefefeffefgfgfgghghghihihijijkjkjjkkjklkkllklkkklmlmlmlmlmmlmlmmlmlmlklkllklkjkkjkjkjijijihihihihghghhghgfgfefededcdcbcbcbabababaa`a`_`_`_`_^_^_^^_^]^]^]\[Z[ZYZYXYXWXWVWVUTUTSTSRSSRQRQPQPOPONONMNMMNMMLMMLKLKKLKKJKJIJIHIHIHGHHGFEFEDCBCCBBCBA@?>?>>?>=>=>=<;<;:;:;:9:9878876767656654343432322321212101001010/0/./..//.-.-.--,--,--,+,+,+,+*+*)*)*)()()('('('('('('((IJIJKLKKLMLMMLMNMMNONOPOPQPQRQRSRSTSSTUVUVWVWWXWXWXYXYZYZ[ZZ[\[\]^]^]^_^^_`_`ababcbcbcbcdccdededefefeefgffgfgfghghihijijijijkjkkjkjkkjjklklklklkllkllklmlmlmllmlmlmlmllmmlmlklkl klklklkklklkjkjkjijijijijihihghgfgfgfedededcbcbabaabba`aa`_`_``_^__^^_^]^]\]\\]\[\[ZYZYXYYXYXWXXWXVWVUTTSTSRQRQPQPONMNMLMMLMMLLKLKLLKJIJJIIJIHIHIHGHGHGFEEDEDEDCDDCDCBABBA@A@?@@?@@?>?>=>=<=<=<;<;<;;:;:9:9::99::9899878778767 6766566566545454344343432321210110/./.-.-.--,--,-,+,+,,++,++*+*+*+*+*)*)*)*)()()('('('('('('(IJKJKLKLMLLMNMNONOPOPOPQRQQRS TSTTSTTUTTUVUVUVWVWWXWXYXXYZYYZYZ[Z[\]\]^]^_^^_`_`_`_`a`a`a`bababcbccbcdcdcdedeedefeeffefgffghgghihihiihihijijiijijk jkjjkjkkjkjkkjklkllklklmlmllmlmllmlmllmlmmlmlklklklklkjkjjjijjijijihiihihihghghgfgfefededcdccdcbcbabaa`_`_`_^__^]^]\]\[\[\[Z[ZYZZYXYXWXWVWVUVUVUTUTSTTSTSRQRQPOPOPOPONONMNMNMNMLMLLMLKLKJKJIHGFGFEFEFEDEDCDC BCCBCBBABAABA@?@?>?>=>=<==<;<;:9:98989877876765654544343432121010/0//0/0/.//.//.-.- .-.--,,-,-,--,+,+,+*++*+*)*)*)()()()()('('('('('('('(IJIIJKJKJJKLKLMLMNONONOPOOPQPQRSRSRSTUTUVWVWWXYXYZYYZZYZ[Z[Z[\[\[\]\]^]^_^_`_`a`ababababcbcbccdededefefeefgfgfghghhghihihijijjiijijijkjkjklkklkllklklklmlmllmlmlmlklklklklklklkjkjkjjkjijiijihihhiihihghgfggfgfgf gfefeffeefedeeddedcbcbaa`a`a`_`_`_^]^]\]]\[\[Z[ZYXYXWXWWXWVWVUTUTUTSTSTSSTSRSRQRQPQPOPONMNMLMLKLKJIJJIJJIHIHIHHGHGGHGFEFEEDEDCDDCCDCBCBBABA@AA@?@?>?>=>= >==<<=<=<=<; :;;:;::;::9:9878767676565454343232121121010/0/0/.-.-,--,-,+,+*+*+*)*)**)())('('('('('(IJKJKLKKLLKKLMLMNMNMNONOPOPQPQQPQRSRSRSRSTSTTUTUVUUVWVWVWWXWWXWXYXYZ[ZZ[Z[\[\\[\]\]\]\]^]^ _^^_^__^__`__`_`a`ababcbbcddcdededefefefgfghghghihihijijkjjkjkjklklkklllklklkklkllkklklmlmlklklklkklkjkjkjjijijijihihiihihghghghhgfgffggfededcdcdcbabbabaaba`aa`a`_^_^_^]^]\]\[\[Z[ZY XYXYXYYXWXWXXWVWWVUVUTUUTSTS RSSRRQRRQRQPQQPQPOPOPONMLMLKLKJKJKJIJIHIHGFGFEFEEDEDCDCDCBA@A@?@@??@?>??>?>?>=>>=<=<;<;:;:9:9898787787676565454343432321221210/0//0/./.-,--,-,-,+,+ *+**++*+**+*)*)()()('(('(('('(('(('('('(IJIJKLKLKLMLMMLMNMNNOONOPOOPQPQRQRSRSRSSTSTUTUTUVUUVVUVWVWWXXWWXYXYXYZYZYZYZ[\[\]\]^]^_^_`a`ababcdcdededde fefefefefefgffgfghghghghihhihihijij kjkjjkjjkkjkjklkl klklkllklklklklklklklklklkllkklklklklklkjkjkjkjjijijiijihiihihghghgfgfefedededcbcbcba`a`_`_^__^_^_^]^]\]]\[\[Z[ZYZZYXWXWVWVUTSSTSRQRQPONONONMNMLMLKJKJIJIHIHIHGHHGFGFFEEFEEDEDEDEDCDCBCBABAABAA@A@?@??@?>?>=<=<;<;<<;:;:9:9877676765665434323212121010/./../.-.-,,-,--,+,+*+**++*+*)*)**))*)()('('('('(IJIIJJIJKLKLLKKLMLMNMNONOPOPQPQRSRSTSTUTUVUUVWVWVWXWXYXYXYZYZYZ[Z[Z[\]\]\\]\]^_^_`a`aa`ababbabcbccbbccdedefefgfgfgfghghgghhghghijijijiijkjjkjkjklkl klkllkklkklklklklklkllklklklklklklklklklkjkjjkjkjjijijijijihghgfgfgfgfgfedeededcdcbcbabaabbaa`aa`_`_^_^]^]^]\[\\[Z[ZYZYXYXWXWVWVUTUUTSTSRSRQRQPQPPQPOPONONONONMNMLMLKLKJIHIHGHGFGFEFEDEDCBCBABBA@A@?@?@?>?>=>=<=<<=<;<;;<<;:;;:;:9:98987876767765654543432323212101010100/0/00/.//././.-.--.--.-,-,-,-,+,+,++,+*+*+*)*)*)*)()()()()('('('(('('('(IJKJKJKLKLMLMLMNMNMNONONOPOOPQRQRSTSTUTUVUUVWWXWXXWXYXYZYZYZ[\[\]\]^]]^_^_`a``ababcbbccdcdeddefefgfgffgfghghghihihijijijijijkjkjkjkkjjklklklklklklkllkllklkklklklklkllklklkklkllklklklklkjkkjkjkjkjijjijijijihiihihghghgfgfefefedededcdcddcbcbcbabba`a`a`_`_^_^^_^]^]\]\]\[\[Z[ZYZYXWXWVWVUVUTUTSTSRQRQRQPQQPPQPOPONMNMMNMLKJKJKJIJIIJIHIHGHGHGFEFEDCDCBCBABA@A@A@?@?>??>>?>=>=<;<;:9899877676565565454323212101010/0/0/./../.-..-.-.-,-,-,,-,+,++,++,+*+*+**+*)*)()(())()()('('('('('('('((HIJIJKLKLMNMNONNOPOPQPQRSRRSTSTUTTUTUVUUVWVWWXWXYXXYXYYZYZ[Z[ZZ[[\[\]^]^_`_`_`a`abaabbabcbcdcdefefefgfggffghihihihihihijijijijkjkkjjkjkjkklkllkklklklkllklklklkllklklklklkklklkllklklklkjkjkjkkjkkjijijijihihihihghgfgfgffgfefefeefedededdedcdcbcbaba`aa`a`_``_ `__^^__^^_^]^]\]\[\\[\[ZYZZYYZYXYXWXXWXWVWVUVVUTUTTSTTSRQRQRQPOPPOPOONONM LMMLMLLKLKLKJKJIHGHGFEEDCBCBABA@?>?>?>=<=<;<;:;;:9899877676565454344334323212101100110/0/0/./././.-.-.-,-,-,-,-,+,,+,+,+*+*)*)()()()('('('('('(('(IHIJIIJKJKLKLMNMNOPQPQRQRSRSRRSTSTSSTUVUVWVVWXYXYXYZYZYZ[Z[Z[\[[\[\]^]^_^_`a`ababcdccdcdccdedefgfgffgfghgghhghihihijiijiijjijkjkjkkjkjkjkkklkklklklklklkllklklklklkl klkkllkklklklklklkjkjkjkjjiijiijihihihghgfgffgf effeefeeffedededcddcbcbababa``_`_`_^]^]\]\\]\[\\[ZYZZYXYYXWVWVUVUTUTTSSTSSTSRSRQRRQPQPQPOPOOPONOONMLKLKKJKKJIJIHGHGFEEDEDEDCDCDDCBCBABA@A@?>=<=<<=<;<<;:9:98778876766776565654544543432321221210/0/./.-.-..-.-,-,,-,+,+,+*+*)()('('('('(IHIJKJKLKKLMNMMNOPQPQQPQQRQRRQQRQRRSRSRSTSTUTUVUVWVWWVWXWXYXYZYZ[Z[\[\[\[\[\]\\]\\]^_^_`_`_`__``aa``aa`a`aabaabbabcbcbccdcdeddefefefefgfghghihihiihijiijjijijkjkjkkjklklklkkllklklklklklklkllkllklklklklkjk jkjkkjkjjkjkjijjijjijihihihiihghghghgfg fgffgfefeffefedededcddcbcbcbcbaba`a`aa`aa`_``_`_^_^_^_^]^^]]^]]\]\]\[\[Z[ZYZZYXYXXYXWXWWXWVUVUUTUTSTSTSRSSRSSRQPQQPONONNONMNMMNMLMLKLLKJKJKJKJIJIJIHGFGFEFEEEDEDCDCBA@AA@?@@?@@?>?>=>=<=<;:;:;:9:98998787787656656654545434321210/0/0/0/.//.//.-.-.--,+,,+,+*+*)*)()()('('('('('(('HIJIJKJKLKLMNMNNMNONOPQPQRQRQQRSRSTUVUUVVUVWWXWXYZYZ[Z[\[\\[\]\]^]^_^_^_`__`a`abaabaabcbccdeddefefefefgfgfghghghihihijijiijijijkjkjkjjkjkjkkjkkjklklklklklklklkklklklklkklklkjkjkjijijiijihihihghgfgfggfgfgfefeeffedeededcdcbcbcbabababba``_`_ ^_^^_^^]^^]^]\]\[\[[\[Z [Z[Z[ZYYZYZYXYXWXWXXWVUTUUTSTSSSRSRQPQQPOPONONMLMLKLLKLLKJKKJIJIHGHGFGFEFEEDEDCBCBCCBABA@ A@@A@@?@?@@?@?>?>=<=<=<;<;:;;::;:9:98778767677656565654543434323322321212101010010/0/00/./.-.-.-.-,---,-,+,,+,+*+*+*)*)()()('('('('('('HIHIJIJKJJKJJKLKKLMLMNMNMNONOPQRQRSRSRRSTSTUTTUTTUUVVUUVUVUVWVVWVW XWXWXWXXYXYXYZYZ[ZZ[Z[\[\[[\\]\\]\]^]]^]^_^_`a`ababcbbccdccdcddcdedeededefeffefefgfgfghghgghhghihijiijijkjjkjkjkkjklklklkklklkllklklklklkjkjkjkjkjijijiijihihiihihghghgfgfefefedeeddededcdcbcbababa`a`_`_`_`_^_^_^^_^]^]^]\]\\]\[Z[ZYXYXWXWVWVUTUTUTTUTSTSRQPQPOPONONMNMNMLMLMLLKKLKJIHIHGHGFGFEDEDEDCBCBBCBABA@A@A@?@@??@?>?>=>==>=<=<;<;:;:9:98987878767667656565654543432323212101010/0//0/.-.-.-.-,-,-,-,+,++,+*+*)*)*)()()('('('('('(('(IHIIHIJKLKLMLMNMNONOPOOPOPQPQRQRSRRSTSTSTUTTUVUUVWXWXYXYXYZYYZ[Z[Z[\[\[\]\]\]\]^]]^]]^_^_^_`a`abababccdcdcdededefefeefgfgfggfghghghghihijijijijijkjkjjkjjkjjklklklklkkllklklklkjkjkjkjkjkjkjkjjkjijijjiijihihihghghgfgfgfefefededcbcba`aa``_`_``_^__^^_^]^]\]\\]\[\[ZYZYXYXWXWVUVUVUTUTSTSTSRSRSRQRQPQPOPOPONONMNNMMNMLMMLKJKJIJIHIHGHGFGFGFEDEDEDDEDCBABA@A@A@?@?>=>=<=<;<;<;:;:;:9:9:9898767676545543232321211210/.-.-,-,--,-,-,+,+,+*+*)*)*))*)())()('('('('('('(HIHIJKJKLKKLMLMNMNONOPQPPQRSRRSRSTSTSSTUVUUVWXWXYZYZYZ[Z[\[\[\\]\]^]]^]^_^_`a`a`a`abababcbccdcddcdedefefgfggfggfghghghgh ihihhiihihi jiijijijjiijkjjkjjkjkjklklkklklkklkllklkjk jkjkjkjjkjjkjijijijijihihihghghgfgfggfefedeedededcdcbcbccbaba`a``_`_`_^__^]^]\]\[\[Z[ZYZZYXYXWXWVWVWVUVUVUTUTSTSTTSRSRSRRQRQPQQPOPPONONMNMNMMNMLKLKLKJKJIJJIJIIHIHIHHGGHG FGFFGFFEFFEFEEDCBCBABABA@?@?@@?>??>?>=>=>=>>=<=<==<;<;:;:9:9:9898987876776 566565565545434323232121010010/0/./././.-.-,-,-,,-,,-,+,+*+*+*+*)**)*)())()())(()('('('((''('(IHIJKJKLKLMNMNOPOPOPQRQQRSRSTUTTUVUVUVWWVWXWXYXYZ[Z[\]\]^]]^^]^_^_^__^_`ababababcbcbccdcdccdcdefefefeefefgffgfghihihihijijijijjijkjkjkjkjkjklklkklklklklkjkjkjkjkjkjkjijiijihihihihghgfgfeffefefefedcdcbcba`a`a``_`_^]^]\]\[\\[Z[[ZYXWXWWXWVUVUVUTSTSTTSSSRSRSRQRQPOPONONMNNMLKLLKLKJIHIHIHGHGGFGGFEFEEDEDCDCDCBCBABA@A@?>?>=>>=>=<=<=<=<;<;:;::;:9:9::989898776765454343432321212121010/0/./././.-.-,,+,+,+*+*+*)*)()()()('('('('('('(HIJIJKJKLKLMLMNMNOPQPQRQRSRRSTSTUVWVVWVWXWWXYZYZ[Z[\[\[\]\]\\]^]]^]^_^^_^__`_`a`ababcbccdcdccdcdcdedededefefefefgfghghghihihihijijiijjiijijkjkjj kjjkjjkjjkjkjkjklkjkjkjjkjjkjkjkjijijijiihghgfgfefefedededcbababa`a`a```_^_^_^]^]\]\[\[\[Z[ZZYXYXYXYYXWVWWVUVUTUTSTSTSSSRSSRQRQPQPONMNMLMLKJKJKJIJIHIHIHHGGHGFGFFGFEFEFEEDEDCDCBCBABABA@?@?>??>=>==<=<=<;<<;<;:;::;:9:9::98987876776676565454343432321212121121010/00//00/./././.-.--..-,-,-,+*+*+*+*)*)*)*)()('('('('('('IJIJIJKJJKLKLMLMLMNMNMMNONOPOPQPQRSRSTSTUTUVUVVWVWXWXYXYYXYZYZYZ[Z[\[[\]\\]^]^]^_^^_^_^_`__`a`a`abcbbccbcdcdeddededefefeefgfghghghghihijijijijjijijijijkjj kjkjjkjkkjjkjkjkjkjkkjkjkjkjkkjkj kjjkjjkjjkjkjijijijihiihihihihghghhgfgfefefedededcdcdcbcbaba`aa`aa``a`_`_^_^_^]^]\]\[\[ZYZYYZYXYYXYXWXWVUTUTSTSRSRQRQRRQPOPOPOPPONMNNMLMLKJKJKJIJJIHIHGFGFGFEFEEDEDCDCBCBABA@?@?@?>?>=>==>=<=<;:;:9:989878877876776565454343434323210110010/.//./.-.-.--.-,-,-,+,,+,+*+*)*)*)*)()()()('(('('(IHIHIJIIJJIJKJKJKLKLMLMNMNONOPOOPQPQRQRSRSTSTSTUVUVWVWVWVWXWXYXYZYZ[\[\[\]\]]\]^]^_^^_`_`a`ababcbcbbcdcdcdeedefeffeefgfgffghghihihihhiihijijijijiijjkjjkjjkkjkjkjkjkjkjkjkjkjkjkkjkjkjkkjkjkjkjijijijijijiihihihghghghghgfgfgfgfefededcdccdcbccbababa`a``a``_`__^__^]^]\]\[Z[[ZYZYXYXWVWVUVUTUTSTSSRSSRQPQPOPONONMNMLMLKLKJKJIHIHGFEFEFEEDEDCDCBCBBABBABA@A@@A@@?@?@?>?>=>>=<=<=< ;<;;:;;::;:9:9:9:98987876565454554343432321010 /00/0//0//./.-,--,+,,+,+,+,+*+*)*)**)*)()()('('('(''('(IHIIJJIJKJKLKLMLMNMNOPQRQQRRQRSTSTUTUUVVUVUVVWXWXXWXYXYXYZYZ[Z[\[\]^]^]^_^_`__`_`a`ababababcbcbbcbcdedeedeedefgfgffghghghihihijijijjiijjkjjkkjkjkjkjkjkjjkjkjkj kjkkjjkkjjk jkjkkjjkjjkjkjijijijihihihghghgfgfefeefedeedcdcbcbabaaba`a`_`_`_`_^_^]^]\]\[\[\[Z[ZYZYXYXWXWVWVWVUVUUTUTSSRSRQRQPQQPOPOOPPONONMNMLMLMLKLLKJKJIHIHGHHGFGFFGFGFEFEFEDEDCDCDCBCBCBABABA@A@AA@?>?>=>=>>=<==<<=<;<;:9:99:98987878776767766765455434323323223212121010/0/.//./.-.-.-,--,-,-,+,,++,+,+*+*+*)*)*)()('('('('('HIHIJKLKLMLMLMNONNOPOPQRQRSRRSTSTSTUVUUVVWVWXYXYZYZ[Z[ZZ[\[\]\]^]^_^__^_`_``_``__`a`ababaababcbbcbcdcdededefefefgfgfghgghgghghihhihijijijiijijijjkjkjkjkjkjkkjkjkjkkjkjkjkkjkkjjkjkkjjkjjkkjkjkjjkjjkkjijjijjijiijih ihihhihhiihihihghghhghgfgfgfeffefe dededeeddedcdcdcbababa`a`a`a``_``_^_^]^]\]\[\\[[\[ZYXYXWVWVVWVUVUVUVUTUUTSTTSTTSSSRSRSRQRQRQPQQPQPOPOPONOONMLKJKJIHIHIHGHGGHGGFFGFEDEDDEDEDCBCBABA@A@?@@?@?>?>=>>=>=<=<;<<;<<;:;:98987787676765454321210101010/0/./.-..-.-,-,-,+,+*++**++*)*)*)()('('('('(''(HIHIJIJJIJKJKLMLMNMNONOPOPQPQQRQQRQRSRRSTUTUVVWVWXWXYXXYZYZZ[\]\]^]^]^_`_`_`_`a`abccdccdedefefgfgfgfghghgghghihiihijijjiijijkjkjkjk jkkjkjkjjkjkjkjk jkkjkjjkjkkjjkjkjkjjkjkjkkjjkjijijijiijijijiihihghghgfgfgffgfefefeefedededcbcbabababa`a`a`_`_`_^_^^_^]^]^]^]\]\[\[Z[ZYZYXYYXXYXWXXWVWVUTUTUTSTSSRSRRSRQRRQPOPONONMNMLMMLKLKJKKJKJIHIHGHGFGFGFEDDEDEDCDDCBCBABABA@A@A@?@?@?>?>?>=<==<=<;<;:;::;:98989877656545434323232121210/0/.//./.-.-,-,,-,+,+,+*+*+*)*))*)()()('('(HIHIJIJJIJKJJKLKKLKLMLMNMNONOPOPPOPQRQRSRSRSTSTTUUTTUTUVVWVWVWXWXXWXYXYZYZ[Z[\[\[\]\]^]^_^_`_`_`a`ababbabbcdcdcdeddedefefefgfghghghihihihiihhijijiijijijjkjkjkjkjkjkjkjkjkjkjkkjkjkkjjkjjkkjjkjkjijijijijiihihghghgfgfgfefefeededededcbcbaba`a`a`a_``_^_^_^]^]\]\[\[\[Z[ZYZYZYXWXWVUVUTSTSSRSRSRQRQRQP QPPQPOPPOPPONMNMLMLKLKJKJKKJIHIIHGHGFGFFGFEFFEFEEDCBCBABA@A@?@?>?>=>=>>==<<=<;<;<<;:9:989878776565454344323210/0/00/././.-.-,-,-,-,+,+,++,+*+*+* )**)*)**)*)**) ()(()()(()('('(('('(('('('('('('(HIHIJKJJKLMNMNONOPQPQRQQRSRSTSTSTUTUVVWVWXWXYXYZYZ[\[\]\]\]^]^^]]^_^_^_`_`_`ababababcbbcbbcdcdededefefefefgfgfgfgghghghghihijijijijjjijijkjjkjkjjkjjkjkjkjkkjkjkkjkjkjkjijijjiijjijihhiihiihiihghhgghgfgfgfeffefedededcddcdccdcbcbcbabbababa`a` `_`__`_^_^__^_^]^]]^^]\]\[\[Z[Z[ZYZYXYXYYXYXWXWXWVWVUVUTUTSTSSTSSRQRQPQPOPONOONONMLMLKLKJKJJKJIJJIHGHHGFEFEEFEDEDEDCDDCCDCBCBABA@A@?@?@@?>?>>?>?>=<=<;:9::989878878876565454543432323212210/0//0/.//./../.-.-..-.-,-,,-,+,,+,+,+*+*+*)*)()()(()('('(HIHIJKLKLMLMNMNMNO NPPOOPOPPOQPQRQQRQRSTSTUTUTUVUVVWVWVWXWXYXYZYZ[\]\\]]\]^]^^]^_^^__^_`_`__`a``a`abaabbccbcdcdedefefefgfghgh ihhihhihhihhijijjijijijijjijijkjkjkjjkjjkjkjkjkjkjkjkjkjkjijijijijihihihhiiihihghghgghghgfgfgfefededcdcbcbcbabababa`a`a`_`_`_^_^_^]^]]\]]\[\[\[\[ZYZYXWXWXWVWVWVUVUTSTSSRQRQRQPQPQPOPONOONMNNMNMLMLKJIJIJIHGHHGFGFEFEEFEEDEDEDCBCBABBABBA@A@?@?>?>=>=<;<;:9:9:989988987878878767676765655654323212101010/00/0/./.-.-,--,,-,,+,+,,+,+*+**+**+*)**))**) ()(())()())('('('('('((HIJIJIJ KJKJKKLKKLKLMLMLMNMNMNONOPQPPQRQRQRSRSTSSTSTUTUTUTUVVWVVWVWXW XWXXYYXYXYXYXYZYZYZ[Z[ \[\[[\\[\\]]\]\]^]]^]^_^_^^_`_`abababbabbcbcbcdcdcdefefef gffgfggfgfghghghhghihihihihijijijjiijijjijijkjkjkjkjjkjijijjijijihihihhghghgfgfgfefedededcdcbcbccbcbabababa`a`__`_^_^]^]\]]\]]\[\[\[ZYZYZYXYXWXWXWVWVWVUVUTSTTSSRQRQPQPOPPOOPONONMNNMLMLKLKJKJKJIHIHGHGFGFEFEDEDEDCDCBABA@A@?@?>=>=>=<;:;:;:989898788776776766765654343432321212212101010/0/././.-.-..-,-,+,+*+*)*)*)*)())())('('('('(HIHIJIJKJKLKLKKLMLMLMNMNONONOPOPQPQPQRSTSTUTUVUVVWVWVWXWX YXYYZYYZYYZ[Z[\[\[[\]\\]]\\]^]^_^_^_`_`a`a`aababbabbcbcbcbcdccddcdefefgfghghghghihihihihihijijijijijijijkjijijijijihihihihhiihghghgghgfgfgfgfefeffefefededeedcdcdcbccbcbaba`a``a`_`_^_^_^]\]\]\[\[Z[ZYZYXYYXWXWXWXXWVWWVUVUTUTSTTSRSRSRQRQPQPOPPONOONMNMNMLMLKLKJKJKKJIJJIJIHIHGHGHGFGFEFEFEFEDDEDCDCBCBA@A@?>?>=>=<=<=<;<<;<;:9::9:98987887878767767654543434321211211010/0/././.-.-.-,-,-,+,,+*+* )*)*)*))**)()()()('('('('('('('('(HIHIHIJIIJKJKLKLMLLMLMNONOPOOPQPPQRQRSRRSTSTUTUVUVUVVWXWWXWXYZYZZYZ[Z[Z[\[\]\]^]^_^_^_^_`_`abababbcbcdcdedededefefefefgfgfgfghghhghghihihihihijiijijjiijijijjijijijijjijijijijijjiji hihiihihiihhghghgfgfgfeffefeefedededcdcbcbcbababababa`aa`a`a``_`_^_^]^]^]\]\[\[Z[ZYXWXWXWVWVUVUTUTUTSTSRSRRSRQRQRQPONONONONNMNMLMLKLKJKJKKJIJJIIJIHIHGFGFEFFEEFEDEDDEDCDCBCBCCBABABA@AA@?@?>=>==>=<=<<=<;<;:;;:;:9:9::9878788776565454343343232101010/0/././.-.-,--,-,+,,+,+,+*+*+*)*)**)()()(()()('('('(HIHIHIJIJKJKJKLKLKLMLMLMNMNMNONONOPQPQRSTSTSSTSTUVUVWXYXYZ[Z[\[\]\]\]^]]^^]^_`_`_`a`a`ababbcbbcdccdcdeddeddefgfghghghihihihihiihijiijijjijijijijijijijijijijijijijihihihiihihihh ghgghgghghgfgfgfgfefedededdedcbcbababa`a`_``__^_^_^]^]\]]\\]\]\[\[\\[Z[[Z[ZYZYXYXYXWXWVUVUTUTSRSRSRQRQPQPOPONONMNMLMLKLKJIJIIJJIHIIHIHGFGFEFEDEEDDDEDCDCBCBABA@A@?@@?>?>=>=<=<=<;<;:;:9:989877676676545432121221010/0/././/.-.-.-..-,-,-,-,+,+*+*++*+*+*)**)*)*)())()(()('('(('(('('('('('(HIHIHHIJIJIIJKJKLKLKLMNMNONOPQPQRQRQRSRSRRSTUTTUTUVUVUVVVWXWXYXYXYXYZYZ[\[[\]\]^]^^]^_^_`__`a`aa`abababababcbbcbcdcdedefefefefefefgfgfgfg hghghgghghghihihihihihiihiijijijijjijijijijijijijijjijijijijjiji jiijiijiijijihihihhihihihhihhghgfgffgfefefedededcdcbaba`a`aa`_``_^_^_^]^]\]\[\[Z[ZYZYYZYXYYXYXWXWVWWVWVUVUTUUTTUUTSTSRRQRQPQPONMNNMMNMLMMLMLKLKJKKJIJIIJIIHIHGHGFEFEEFEDDCDCBCBBABABA@A@?@?>?>>??>?>=>=<=<;<;<;:9878787767676565454344323232121010/0/0/././/.-.-,--,-,+,+,+*+*)**))*)( )()()())()('('('('(HIHHIJIJIJIJKJKLKLMNMNONOPOOPQRQRQQRSRRSTSTTSTUTUVUVUVVVWXWXYXYXYYZYZ[Z[Z[\[\[\]\]\]^]]^]^]^_^_`a`a`ababbcbcdcdcdedefefefgfgfghgghghihhihihiijiijjijijijjijijijijijijijijijjijijijiji jiijjiijijihihihihhh ghgghgghghgfgfgfgfgfgfefefededededdedcdcdcbccbaba`a`a``aa`__`_^^__^]^]\]\[Z[[ZYZYXYXWVWVUTUTTUTSTSRRQRQQRQPQPOPONONMNMNMLMLKLKJIHIHGHHGFGFEFFEDEDDEDDCDDCBABA@?@?@@?>=<=<=<=<=<;<;:;:9:9::9878776765454343212112121010/0//0/0/././.-.-,-,, +,+,+,++,+,+*+**++*+*)*)()()(()('('('(HIHIJIJKJKJJKLKLKLKLMLMNMNNMNNMNONONOPQPQPQQRSTSTUVUUVUUVWVWXYXYZYZ[Z[Z[\[\]\\]^]^_^^_`_`_`ababbbcbbcbbcdcdcdedefeefefgfgfghghghihihii jijijijijijijijiijjij ijiijjijjiijijjiijiijiijjiijijjiijiijijihihihghhghghghghgfgfgfefeffededdededdedcdcdcdcbccbcbababa`_`_`_`__^_^_^]\]\[\[\[Z[ZYZZYXYYXWXWVWWVWVUVUTSTTSTSTSRSRSRSQQRRQRQPQPOPOPONOONMNMLMLMLKJKJJKJIJIIJIHGHHGHHGFGFFGFEFFEDEDDCDCDCBCCBA@A@?>??>=<;:;:9::989878776776565656545454554323223212121101010010/00/0/./.-.--.-,--,-,,-,+,+,+*++*+*)*)*)*))*)()('('('('('HIJKJKLKLKKLMLMMLMNMNMNONOPOPOPQRSRSSRRSTSTSTUTTUVUVUVUVVWVWXWXYZYZZYZ[\[\]\]^]^_^__^_^_`a`abaabbcbbcdeddededefeefefefefgfggfghghghghgh ihihhihhiihihihiijijijiijijijijijijijjiji jijjiijiijjijiijijijijihihhihiihihihghhghghgghgghgfgfgfefededdeed cdccdcdcddcbcbabbaba`a`a`_`__^_^]\]\[\\[[\[ZYXYXYXWVWWVVWVUVUVUTSTTSRSRQ PQQPQQPQPOPOPONMLMLLMLKLKJKJIHIHIIHGHGFGGFEDEEDCDCCDDCBCBABA@?@?>?>=<;<;:;:9:9898787876765654543432332321212121010/00/0/.//.//.-..-.-,-,,+,+,+*+*+*)*)*)()()('('('('('('((HIHIJIJKLKLMLMNMNMNOPOOPQPQRQRSRSTUTTUTUVUVWVVWWVVWVWXWXYXXYZYZZYZ[Z[\]\]^]]^]^_^__^^_`__`_`__`a`a`abbabcbcbbcbcdcdcdedefefefgfgfgfghghgghghghihihihihihihhiijijjijijijijiijjijjijiijijjiijijijiijijijjiijijihihihiihihihihghg hghhghghghgfgfefedeededcdcdcbcbababa`a`a`_`_`__^_^]^]^]^]\]\[\[Z[ZYZYXYYXXYXWXXW XWWVVWWVVWVUTUTUUTSTSSRRQRRQRQPQPOPONONMNMLMLKLLKJKJIJIHGHGFGFEDEDDCDCDCBABA@A@?@?>?>=>>=<;:;:9:989898787887877676566545434323321212101010/././/./.-.-.-,-,,+,+*+*+*)*))*)())(()(()('(('('(('('('('('GHIHIJIIJIJKJKJKLMLLMNONOONONOPQPQPQRQQRQRSRSTUTUTUVUVUVWVXWWXWXYXYXXYZYZYZ[Z[\[\[\]^]^]^_^_^_`_`_`a``a`a`ababbcbccbcdededeedeedefefeffefgffgfgffggfg hghhghhgghghihihihihijijiijijijijjijijijjijijjiijiijjiijijihihihihiihihihghhhghghgfgfgfefefededcdcbcbaba`_`__`_^__^^_^]^]\]\[\[\[Z[Z[ZYZYZYZYXWXWXWVUVVUVUTSTSRRQRQPQPOPONMNMNMLMLKLKJIHGHGHGFGFGFEFEFEDEEDDCDCBCBABA@A@?@?@?@??>?>=<=<=<;<;<<;:;:9:9899889878787767656545434323322321210110/00/./../.-.-.-,-,--,-,,+,+,+*+*+*+*)*)*)()()('(''(('('('('('(('(HIJIJKJKLKL MLLMLMLMNMMNOPOPOOPOPQRQRSTSSTSTUTTUTUVUVVVWVW XWXXWWXWXXYXYXYZYZYZZ[[Z[\[\\[\]\]^]^^]]^_^_^^__^_`_`_`a`a``ababcbc bccbcdccddcdcdcdededede fefeeffefefgfgfghghghghghihihhiihhihijijijijiijijjijijijihiihihihihihghghhghgghghgfgfgfgfeffeefefededcdcddcba`_`_^_^__^_^]^]]^]\]\[Z[Z[ZYZYXYXYYXYYXWXXWXWVWVUVUTUTUTSTSSTSSTSRRQRQPQPPQPPOOPONONNONNMNMLMLMLKLKLKJKKJIJJIJIHIIHIHGFEFEEFEDEDCDCBA@?>=>==<=<=<;<;:;:9:9:9898788776565454543433232321010/0/0/0/././/.-.- ,--,,-,-,-,+*+*+*)*)()()()(())('('('('('('('(''(GHIHIJIJKJKLMLMLLMNMNONOPOPQPPQRQRRQRRSRSTSTUVUVUVWVWVWXWXWWXYXYZYZYZ[Z[\[\]\]\]\]^_^_`_`a`a``ababcbcdccdcdedefefeefefefgfgfghghghghghihihihiihihihi jijiijiijijijijiijijijijijihihihihihihihihghghgfgfgfefefededdededcdccdcbcbabaaba`a` a`_`_``_`_`__^_^]^]\]\[\[\[\[ZYXYXWXWVWVWVUVUVUTUTSTSRRQRQPQPOPOPPONOONONMNMLMLKLKJKJIJIHG HGGFGFGGFGFEFEFEEDEDEDDDCDDCBABABA@AA@?@@?>??>=>=>=<=<;:;:;:9:989877676545432332121010/0/././.-.--.-,,+,,+*)*)()()()()('('(('('(HIHIJKLKLLKL MLLMLMMNMMNNMNONOPOPQPQRSTSTUUVWVVWXWXWXYXXYZYZ[\[\[\[\]\]^]]^^]^_^_`_`a`abaababcbcbccdcdededefefeefefgfgfgfggfg hgghhghhghghghihihihihhihhihihijijijihihihihhihghghgfgfggfgfefededededcddcbcbababa`aa``aa`a`_`__^_^]^^]^]\]]\\]\[\[\[ZYZYZYXYXWXWXWVWVWVUVUTUTSTSTSRSRQRQRQPOPONONNMNNMLMLKJIJIHIHHGHGHGFEFEEDDEDDCDCBBCCBABA@A@A@?@@?>?>=<=<=<<=<;:;::;:9:98987877876767765654543433443323232121212210110110/0//0/./..//.-,-,-,-,-,+,+,+*+*)*)*)*)())())()(()('('('('('('('('(HGHGHIJKJJKJKLKLMNMNMMNONOPOPOPQPQRQRSRSRRSTSTUVUVWVWXWXYXYZYZYZ[\[\]\]^]^_^^_`_`a`a`aabaabcbccbcbcdeddedededefefgfghghgghihhihihihihihihihihihihih ghhghhghhgghghgfgfgfgfefefeefefededdedcdcdcbcbcbcbaba`a`_`_^_^]^]^]\]\]\[Z[ZYZYXYYXWXWXXWVWWVVWVUVUTUTSRSRSRRQRRQRQPQQPOPONMLMMLMLKLLKJKJIJIJIHGFGFEFFEDEEDDEDDCDDCBCBABAABA@A@A@?@?@?>?>?>=>=<=<=<;:;::99:9898898787876767765654543434343232232121211210/0/0/.//.-.-.--..-,-,,-,-,,+*+*+*)**)*)()())()()('('('('('('(GHIHHIHHIJIJIJIJKJKLKLMNMNONNOPOPQPPQPPQRQRQRSRSTSTUTUTUTUUVUVWVVWXYXXYXYZYZYZ[Z[Z[\[\[[\]\\]^]^_^_^_`_`_`aabaababbcbcbcdcdedeedefefefefgfgfghghhgghghihhihihihihiihiihihihiihihihiihihihihihiihihhihihghghhghghhgghghggfgfgfededcdcdcddcbcbcbcbcbababa`a`_``_^]^]^]]\\]\[\\[\[ZYXWXWXWVWVUVUTUTSTSTSTSRSRRQRQPOPONONMLMLKLKKJKKJKJIJIHIHIHGHGFGFEFFEDEDDEDDCDCBCBA@A@?>?>=>=>=<;:;:9:9:98987877676565655654544543232121010010/00/0/.//./.-.--.-.-,-,,+,,+*+*+*+*++*)*)*) ()())()())('('('('(GHGHHIHIJKJKLKL MLMMLLMNMNMNONONOPOPOPQPQRQRSTSTSTUUVUVWXWWXWXYXXYXYZ[\[\]\]^]^]^_^_``_`_`a``abababcbcbccbcdcdcdcdeddededefefefeffefgfgfgffghghgghghghhihihihihiihiihhihihihihihihihiihiihihihihihihihihihihihghghghgghghgfgffgfefefefededcdccdcbcbcbccbabababa`a`_``__`_^_^__^_^_^]^]\]\]\[\[[\[\\[Z[[Z[ZYZYXYXYXWXWVWVUVUTUTSTSRSRRQQRQPQPOPONONONMNMLMLMLKLKJIJIHGFEFEDEDEDDCBABBABBA@A@A@@?@?@@?>?>=>=>=<=<;<;<;:;:9:9898987877676565454545434343212121210/0/0//.././.-.-.-,--,-,,+,+*+*)*)*)()()()()('('('('((GH IHIHHIHIIJIJIJKJKKJKLKLMNMMNONNONONOPOPQPQPPQRQQRSRSRSTSTSTUTUUVUVWVWXWXWXYXXYZYZYZ[Z[Z[\[\[[\]\]\]^_^_`__`_`aa baababbababcbcbcbcdcdeddefefgfgfgfghgghghghihhihhihihihihihiihhiihihiihihihiihihiihih ihhihiihhihihihghhghghgghghghggfggffgfgfggfefefededcdcbcbababbaba`_^_^^]]^]\]\[\\[\[ZYZYYZYXYYXYXWVWVWVUVUTUUTTUUTSTSRRQPQPOPONONMNMMNMLMLKJKJKKJIJIJIIHIIHIHHIHGHGFEFEDEDEDDDCBC BCBBABBAABA@A@?>?>=>=>=<==<=<<;<;<;:;:9:9::989878778767676656656654543432321221010010/0/00/./.-.-.-,-,-,,-,,+,+,++,+*+*+*+*)*))*)*)*)()(()())('('('('('('('(GHGHIHIJKJJKJJKJKLKKLMLMLMMNMNMMNONNOPOPQPQRQRRQRRSRSRSSTTSTTSTUTTUTUVUVVUVWXWXWXYXYXYZ[\[\\[[\]\]\]^]^]^]]^]^_^_^_`_``_`_`a`a`a`aababcbcbccbcdcdcdedefefefgfgfgfghgghghghghghhihihihiihhihiihhih ihihhiihiihihihihiihhihihihihihiihhihihghghghghgfg fgfgfgfgfgfefefefefededcbcbcba`a``a`_``_`_^_^]^]\]\[Z[ZYZYXYXWXWVWVWVUTUTUUTSRSRRQRQQRQPOPON MNNMLLMMLMLKLKLKJKJIJIIHIHGHGHGFEFEDDCCDCDCBCBABA@A@A@?@?>??>=<=<=<=<;<;:;:9::9:989876765665454343343232121010/0/0/0/./.-.-,-,-,,,+,+,+*+*+*+*)*)**)*)**)()()('('(('('('(HGHGHIHHIHIHIJKLMLMNMMNMMNONNONOPOPQPQPQQPPQRQRSRSRSTSSTUTUUVUUVWXWXXYXYZYZ[Z[Z[\[\[\]\]\\]\]^]^_^_`_`__``a`a``aaababbabbabcdcdcddcd edeeddedede feefeefefefefgffggfgfgfghghghgghhghghhihihihihhihihihhihhiihihhihhihihiihhihhihhiihhihiihhihhihihihghghggfgfgfgfefefededdedcdcbcba`a`_`_^__^_^__^]^]\[\[\[Z[ZYZYXYYXWXWVWWVWVUVUTSTSTTSRSRSRRQRQPOPOOPONOONMLMLMMLKLKJKJKJIJIIJIHIHGHHGFGGFGFFGFEDEEDEDDDCBCCBCBA@A@?@?@?>?>?>=>>=<=<=<;:;:;:9::9:989878767656566565454343432121121010/0/00/./.-.-.-,-,,-,,-,,,+,+*+*+*)*)**)*)*)()()()('('(HGHIJIIJKJJKKJKJKLKLMNMMNOPOPOPQPQPQRQRQRSRSRSTSTSTUTTUUVUVWVVWVWXYXYZYZYZ[\[\\[\]\]\]^]^]^_^_^_^^_`_`__`a``aabababcbcdcddcdeddededefefeefgfgfgfghgghhghhghgghghghihihihiihihihihiihihihhihihihihghgghghhghghghgfgffgfggfeffefefedeedededcddccdcbcbbcbabababa`aa``aa`_`_^_^^]^]\]\[\[\\[[\[ZYXYXYXWVWWVVWVUVUVUTUTSTTSSTSRRQRQPQPONMNMMNMLMLMLKLKJKJIJIJIHIHGFEDEEDDEDDCDDCBCBCBABAABA@A@?@?@?>?>=<=<;<;:;:987876676776565454343432121011010/0/././.-.-.-,-,-,,+,+,+*+*+*)*)*)()('('(('(('('('(GHGHIJIJKJJKLKLMLMNMNMNONOPOPQPQRQRSRSTUTUUVWVWXYXXYZYYZYZZYZ[Z[\[\]\\]\]\]^]^_`a`aa`ababcbcdcdcdeddededdefefefefgfgffghghghhhghihih ihiihihhihiihhihihihhihihiihhihihghghhghghghghgfggfggfgfefefefedededeedeedcdcdcbcbababa`_`_^_^^]^]]^]^]\]\[\[Z[ZYZYXYYXXYXWXXW XWWVVWWVVWVUTUTSTSSTSRRQQRQPQPPQPOOPONMNMMNNMLMLKLKLKJIJJIJIJIHIIHGHGFGFEDEEDCDCDCDCBA@?@?>?>=<=<=<;:;:9:9:99898987887876766765454543443232121010 /00/00/00/././/.-.-.-,-,-,,+,+,+*++**+*+*)*)*)*)*)()()('('('('('('('(GHIHIJKJKLMLMNMNNONOONOPQPQRSRSTSTUTUUTUVUVWVWXWXYXY ZYYZYYZZYZZ[Z[Z[\]\]\]^]^_^_`_`_`_`a`ababaababcbcdcdccdcdedefefefgfgfghghghghghihihihhihih ihiihhihhiihihghghghhghghghgfggfgfgfgfefedededcdcdcbababba`_`_^_^_^^]^]\[\[Z[Z[ZYZYZYXWXWXWVUVVUVUTUTSTSRRQPQPOPONONMNMNNMLMMLKJIJIHIHHGGHHGFGGFEDEEDEEDCDCDCBCBABA@?@?>?>=>=<=<;<;:;:9:9899898767767654545434334323232232121010110/././../.-.-.-,-,,--,--,,+,+*+*+*)*)*))*)()('('('(GHGHIHIJIJIJKJJKLMLMNMNOPQPQRSRRSRRSTSTUTUUVUVUVWVWXYXYXYZYZ[\[\]\]^]^]^_^_`_`aababcdcdcdedededefefefeefgfggfgfgfgffghghghghghhghihhihhihihihghghghghghghgfgfgfefefefedeededdedcdcdcdcdcbcbcbaba`a`a`_``_`_^_^^]^^]^]\]\[Z[Z[ZYZYXYXYYXYYXWXXWXWVWVUTUTUTSTSSTSSTSRSRQRQQRRQPQPOPOPONONMNMLMLKLLKLKKLKJIHGFGFEFEDCDDCBCBCBBABABA@?>?>=>=<=<=<<;<<;:;:;:9:9:9899898998787676765656656545545454343432323212212101010/0/0/.//.//.-.-.-,--,-,-,,-,,,+,+*++**+*+*)*)()(()()()('('('('('(HGHIHIJKJKLMLLMNMMNOPOPQPQRSRSSRSRSTSTSTUTUUVUVWVWXWXWXYXYZYZYZ[\[\]\]\\]^]^]^_^_^^_`_``_`a``abcbcbbcdccdccddcdedededefefeefgffgfghghhghgghghghghghihihihihihghghghghghghghghgfgfgffgfgfefefededcdccdcbcbcbcbaba`_`_``_^_^^]^]\]\[\[\[\[ZYZYZYZZYXWXWVWVWVUVUVUTUTTUTSRSRQRRQQPQQPPQQPOPPONONMNNMMNMLMLMLKLKLKJKJIJIJIHGHGFEFFEDEDCDDCBCBABBA@A@?@?>?>=>=<=<=<;:;;:9:9898989877676565434343232321212210/0/0/./.-..-.--.-,-,--,,-,,+,++,,+,+*+*)*)*)()()()('('('('('('('(GHIHHIJIJKLKKLLKLMNMMNNMNONONOPQPQRSRRSTSTUTUTUUVWVWXWXWXYXYZ[Z[Z[\[\]\]^]^_^_`_`_`a`a`a``ababababcbcdcdcdccddcdeddeddededefefeffeefefgfgfgfgfghgghghghhghghghghghhghghghgghghghghghghghgfgfgfggfefefefededededcdcdccdcbcbcbcbbaababbaba`aa`a`_`_^_^_^^^]^^]\]\\]\[\[[\[Z[ZYZYXYXWXWXWWXWVWVWVUVVUTSTSRSRSRQRRQPQPQPONOONMNMLMMLKLKLKKJKJIJIIHHIHGFEFEDDCBABA@?@?@?>?>=<=<;<;:;:98787676565665454545434432322332122121101010/00/./././.-.-.-,-,+,++,+*++**++*+* )*))**)*)**)()())()(()('('('('('('('(('(GHGGHGHIHIJIJKJKLMLLMLMMLMNMNONOONOPOPPOPQPQQPQRQRSRRSTSTSTUTUUVUVWVVWVWXYXYZYZ[\[[\]\\]\]^_^^_^_``a``ababaabcbcdcddccdededdedefe feffeefefefgffgffgfgfgfgfggfgghghghghghghghghghhghghghhghghhghgh ghghghgghgghgfggfgfgfefefededeededcdccddcbcbabababa`a`a`_``_^__^^]^]\[\[\\[Z[ZYZYYZZYXYXXYYXWXWVWVUVUUVUTUTSTSRSRQRRQQPQPQPOPONMLMLKLKKLKLKJKJJKJIHIHGHGFGFEDEDCBCBABABBAABA@A@AA@AA@?@@??@?>?>=>>==>>=<=<=<;<;<;:;:9:98989898788787876776765434334323323212210101010/0/.-.-,-,-,-,,+,+*+*+*+*)**)**)())(()('('('('('(GHGGHIHIJIJKJK LKLKLLKLLMLLMNMNONOPOPQRSRSTSSTSTUTTUTTTUVUVWVWXWXYXXYZ[\[\]\\]\]\]^_^_`_``_``a`abcdcdcd eddeddededefefefgffgfgfghgghghghgghghghhghghghhghghghghghghhgghghghghg fgfggfggfgffefefefededeededcdccdcdcdcbcbcbcbababa`aa`a`_`_`_^_^__^]^]^^]\]]\]\[\\[Z[[ZZ[ZYZYYZYXYXYYXWXWXXWVWVUVUVVUVUTUTSTSRSSRSRSRQRQPQQPOPOOPOONONMNNMLMLMLKLKLKJKJIHIHIHGHGHGFGFEFFEDEEDDEDCDCDCBCBABA@A@?>?>=>=<=<;<<;:;::;:9:9898788767654 5454434434432323212121010/0//0/./.-.-..-,-,,+,+*+*+*++*)*)*)*)()('('('('('('(GHGHGHIJKJKLKLMLMLMNMNMMNONOPOPQPQPQRQQRRQRSRSTSTSTUU VUVUUVVUUVWVWXWWXYXYXYZYZ[Z[Z[\]\]\]\]]^]^]^]^_^__^_`_``__``a`a`abcbbccbcdcdccdcdededefefefgfgfgfgfggfghggghghghghgghghgh ghgghhghhgghhghghhgghhghghghghghghghghghgfgfggfgfgffefefefedeedededcdcddccdc bccbccbcbcbababa`a`_`_^_^]]^]^^]\]\[\[\[Z[ZYZYZYYZYXWXWVWVWVUVVUVUTUTSRSSRRSRQRRRQPOPONONMLMLKLKKLKJIJIHIHGFGFEFEDEEDDEDDCBABA@A@?@?>=>=<==<<==<;<;<;:;:;;:989898787876766656556543443 23232322322121010/0/0//0/.//../.-.-,-,-,,+,,+,+*+*)*)*))*)*)()()(()('('('(GHGHHGHIHIHHIJIIJKJKLMLMNMNONONOOPOPQPQPQRQRSRSTUTUTUVUVUVVWVVWXWXYZ YZZ[Z[Z[[Z[Z[\[\]\\]^]]^_^_^_`_`_```a``a``ababcbcdcdcdedefefefgfgfgghghghghghghghghghghhghghghhghghhghghhghghghgfgfgfgfgffefeffefefededededcdcdcbcbaba`a``a`_``_`__`_^_^_^]^^^]\]\[\[Z[Z[ZYZYXYXWXWXWVWWVUVUTUTUTSTSTTSRSRQQPQPOPONONMNNMNMLLMLMLKJKJIJIJIHIIHIHGFGFEDEEDCDCCDDCBCBA@A@?@?>?>=<=<;<<;:;:9::9:99:9878787676656545434343232 3221121122121011010/0/././.-.-,,+,+,+*++*+*++*)**)*))*)()())()()('('('('('(GHGHIHIHIJIJKJKLKLMLLMLLMNMNOPQPQPPQRQQRQRSTSSTSTTUVWVWXYZYZ[Z[\]\]\]^]^^]^]^_^^_^_`_``a`abababcbcdcdededefefefefgfgfgffgfgfgghghghghghghghghhgghghhghgghhghghghghghghgfgfggfggfggfgffefefeefededcdccddccdcbcbabaabaaba `a`aa``a`a`_`_`_^_^]^^]]^]\]\]\[Z[ZZ[ZYZZYZYXYYXYXWXWXWVUVUTUTSTSRQRQPQPOPONONNMMNMMNMLMLKLKJKJIJIHIHIHGHGFGFGGFEFEDEDCDCCBCCBABABABA@A@?@?@?>=<=<;<;:;;:98787876776654343343232321221221010/0/0/.//../.-.-,-,-,,+,+*+*)*)*)**)*)()('('(FGHGHIHIJIJKJKJKLKLMNOPOPPQRQRSRSTSTTSTUTTUTUVUVUVWXWXYXYXYZYYZYZ[\[[\]\\]^]^]^]^_`_``a``a`ababbaabbabcbcbbccbbcdcdccdcdeddedefeefefefeefefefgfgfgfgfgffgfgfgfghghghghghghghgghghg hghghgghhghghghgfgfggfgfgfgffefedededcdcddcdcbccbcbcbababa`a`_`_^_^]]\]\[\[[\[Z[ZYZZYXYXWXXWXWVUVVUTUTUTSRSRQRQQPQPQPOPPOPONONMLMLKLKLKJIJIHIHIGHHGGHHGFGFGFGFEDEDCDDCBCCBBCBABABAA@A@A@?@?>??>?>>=>>=>=<=<;<;<;;:;:9::98998787667656545434321010/0/0/./.-.-,-,-,-,+,,+,,+*+*+*)*)*))*))*)()()('('('('('('(FGHIHIJIJ KJKJKKLKKLKKLMNONOPQPQRSTSTTUTUVUVUVWVWVWXYXXYXYXYZYZ[\[[\[[\]\]^]^]^_^_^_`_``__`_` a`a``a`a``a`abababcbcbbcdcdcdcdcdedefefefgfgffgfgfgfggfggfgfgfghgghghg hghgghhgghghghghghghghgfgfgfgfgffefefeeffefededdededcdcbcbcbcbababa`a`_`_^_^_^]^^]^^]\]\[Z[[ZZ[ZYZZYXYXYXWXWVWVUVVUUVUTUTSTTSTTSRSRSRSRSRQRQQPQPOPOPO NONOONONNMMNMNMLMMLKJKJKJKJIJJIHIHGHGFGFEDEDCCBCCBBCBA@A@?>=>=<;:;;::;:9:9:9898987878767676565655654545434323212121010/0/./.-.-,-,,+*++*+*++*)*)()('('('('('(GHGHIHIJIJKJKKJKKLKLLKLKLLMLLMMLLMNMNONNONONOPOOPQPPQPQRQRSRSSRSRSTSTTUVUVUUVWVWXYXYXYXYZYZYZ[ZZ[\[\]\]^]]^^]]^_`_`_`a`a`ababbabcbcbcdccddcdcdedededdefeffefefgfgfgfghghghghghgfgfggfgfgfgfefefefededededcdcdcbcbcbaba`a`_``_^_^]^^]]^]\]\[\[\\[\[Z[ZYZYXYXYXWXWXWVWWVUVUTUTUTSRSRQRQQPQQPQPONOONONMLMLKLKJK JKJKJJIJJIJIHIHIIHGHGFGFEFE DEEDEDCDDCDCCBCBCCBABBABA@A@?@?>?>=>=<;<<;:;:;:989889878787665654323212121011001010/0/./.-.-.-,-,--,,+,+,++,+*+*)*)*)()()()()('('('('('(FGHIHIHIJIJKJKLKLKLMLMLMNMNMNONOPOPQPQQPQRQRRQRSRRSTTUTUVUVWVWXWXWXYXYZ[Z[Z[\[[\[\]\]^]^^]]^_^^__^_^_`__`_`a`a`ababababcbcbcbcdcdcdccdeddedefefefefeefefefgfggfgfgfgfgfgfghghghgfgfgfgfgfgfgfgfgfefefefededededcdcddcdcdcbcbcbcbababa`a`_``_`_``_^__^^_^_^]^^]]\[\[Z[ZZ[ZYZYZYXYXXYXWVU VUTUUTUTTUTSTSRSRQRQRQQQPQQPQPONONMNMLKLKJKJIJIHIHGHGFGFEFFEFEDEEDDEDCCBCBCBABABBA@AA@?>=>=<=<;<<;:9898987876766565654543443343232322321211010/0/.//.-.-,-,-,,-,+,+,,++,+*+*)**))*)()())()())('(('('('('('('('(GHGGHIHIJKJKJKLKLKL MLLMNMMNMMNONOPQPQRSRSRSTSTTUVUVUVUWVWXWXYXYZYZ[\[\]\]^]^]^_^_`_`_`a`aa`ababababab cbcbbcbccbcdcdcdededefefefefefefgfgfgfgfgfggfgfghgfgfgfgfggfgfefefefefefededcdcdcdcbcbababababa`a``a`_`_`_^_^]^]]\[\\[[\[Z[[Z[ZYZZYZYXYXYXWXWVUVUTUTUTSTSRSRQRQRQQPONMLMLMLKLKJIJIHIHGHGFEDCDCDCCBCCBBCBABA@?@@?@?>?>>?>>?>=>>=<=<;:;:9:987876766543 4334332323232121010/.//.-.-,-,-,,+,,+,+*+*+*)*)*)()(()(())('('('(('('('(GHGHIHHIIHIJIIJKJKLKL MLMMLMLMNMNMNMNONNOPOPOPQRQRSRSRSTSTTUTUVUUVUVVWVWVWXWXWXYXYZYZYZ[Z[Z[Z[[\[\]\\]\]^_^_`_``a``a``a`abababbcbcbcbcbcdcdcdeddededdede feefefefefeefefgfgfgfgfgfgfgfgfgfgfgfgfgffgfgfgfgfgfgfgfgfefefefeefefefedeedcdccddcdcbcbababa`a`a`_`__`_^_^]]\]\]]\[\[\[[\[Z[[ZZ[[ZZYZZYYZYZZYXYYXYXXWXWXWXWVWVUTUTSRSRRSR QRQRQRQRQQQPPQPQPONONMLMLLKKLLKJKKJJKJIJIHIHGHGHGFGGFEFEDDEDCDCCCBCBA@A@?>?>=<=<;<;:;::;:9:9:9878778767656566545454454343233223212121210110/.-.-.-.-,-,-,+,,++,,+*+*+*)*)*)*))**)()()()()(()('('('('('('(''('(GFGHGHIHIIHIJIJKJKLKLMLLMLLMNO POOPOPPQQPQPQRQRQQRSRSTTUTTUTUVUVWXWXXWXYZYZ[ZZ[\[\[\]\]^]^]^_^^__^_^_`_`__`a`a``a`ababbaababcbbcbcdcdedededefeefeefefefeffgfgfgfgfgfgfgfgfggfgfgfgfggfggffgffgfgfgfgfgfgfefeffeedededeededcdcdcbcbcbaba`a`a`_`_^]^]^]]\]\\]\[\[[\[[\[ZYZZYZYXYXWXWXWWXWVWVUVVUTSTSRSRSRQRRQRRQPQPOPONOONMNMLMMLKLKLKJIHIHHIHGFGFEFFEFEDEDCDDCCBCBCBABABA@A@?@??@?>=<=<<=<;<;;:;:9:9:98989787876656654545434344323232121010/./.-.--.-,-,,+,,++,+*++*+*+*)*)*)()()()(()('(('('('('(FGGFGHGGHIHIJIJIJKJK LKKLLMLLMMLMNMNMMNONOONONOPOOPOPQPQPPQRSRRSTSTTUTUVUVWVWXWXYXYZYZYZZYYZ[Z[\[\[\]\]\]^]^_^_^_`_``_`a``aa`a``abababcbcbcdcdcdededefefefefeffgfgffgfgfgfgfgfgfggfgf gfggfggfggfgfgfggfgfggfgfg fgfgfgffgffgfefefeefefeedededcdcdccdcbccbcbcbaba`a`a`a`_`_``_^_^_^^]^]^]^]]^]]]\]\[\[\[Z[[ZYXYXYXWXWXWVWVUVUUVUTUTSTSSTSRSRQPQPQPONMLMML KLKLKLLKKJJKKJIJJIHIHGHGFGFFEFEDEDCDCBABA@?>?>=>>=<=<<=<;<;<;<;:;;:9::9878767665432332232121221210/0/0/././.-.-.-,-,-,-,,+,+*+*+*)**)**)*))*)()()('('('('('('('(FGHIHIJIIJIJKLKKLMLMLMLMNMMNNMNONOPOPQRQRSRSTSTTUTTUVUVWXWXYXXYYXYZYZ[Z[\[\]\\]^]^^]^_^_^__`a`ababcbcdcdccdcdededefeeffeefefefeffgfgfgfgfgfgfgfggfgfgffggffgfgfgfgfggffgfggfgfgfgfgf efeffeffefefefefeeedededcdcdcddcddcbcbaba`a`a`_`_^_^_^_^ ]^]]^^]^]]]\]\[\\[\\[Z[[ZZ[[ZYZYYZYXYXYXYYXWXWXXWVWVUVUUVUVUTUTSTSRSSRSRSRQPQPOPPOPONONMNNMLKLKJKJIJIHIHIHGHGHGFGFEFEDEEDDEDCDCDCCBCBABA@A@?@?>??>>?>=>>=<=<;:;:;;:9:9878767676665656545434343232121221010/0/0//0/./.-..-.-,-,+,+*+*+*)*)**)*)*)()()()()('('('('('(FGFFGHIJIJIJKJKJKLMLMLMMNMNMNONOONOOPOPQRSRSTSTSTUVUVWVWXWXYXYZYZYYZ[Z[\[\]\]\]^]^_^_^__^_``_`a`a`abababcbc dcddccdcddcdedededefeffefefeffgfgfgfgffgffggfgfgfgfgfgfgfgfgfgfgfgfgfgfefefeffefeeddedeededcdcdcdcbcbabba`a`a`_`_`_^_^]^]]\]]\[\[Z[ZYZYZYXYXWXWVWVUVVUTUTSRSSRRSRQRQQPPQPOPOPONONMLMLKLLKLKJKJIJIHIHIHGFGFFGFEFEFEDEEDEDCCBCBABABA@A@?@?@?>=>=<;<;<;:9:987676665656545434343233233212112101010/0/0/././/.-..-,-,+,,+,+,,+*+*+* )*)**)*)**)()()()('('('('('('(GFFGHIJIJKJKLMLLMLMNMNONOPOPQPQPQRQQRQQRSRSTSTSTUVUVUUVUVWVWVWXWXWXYXYXYZYZ[\[\[\]\]\\]^]^_^^__`_`_`a`a``a`a`abababcbcbbcbbcdcddcdcdeddeddeddedefeefefeffefeffeffeefgfgfgfgfgfggfgfggffgfggfgfggfgfgfgfgfgfefefefefefedededededcdcdcdcdccbcbcbcbababaababa`a`_`_`_^]^]]^]\]]\]\\]\[\[\[ZYZYZYXYXWXWXWVWWVUVUUTUTU TSTSSTTSTTSRSRQRQPPQPOPOPONONMNMLMLMLKJIJJIHIHIHGFGFEDEEDEDCDCCBBCBABA@A@A@?@?>?>??>?>=>=<=<;<;:;:9:99:99:9898787887676766765665454554545434434343232121011010/0/0/././/.-.-,-,-,+,++*+*+**++*)*)*)*)*)()())()()('('('('('('('(FGHIHIJJIIJKJKKJKLKLKLMNMNOPOOPQRQQRQRSTSTTSTSTUTUVUVUUVWXWXXWXYXYZYZ[Z[\[\[[\\[\]\]]\]^]^_^__`_`_`a`a`a``abaababbabcbcdcddcdcdededeedefefeeffefefeffefgfgffggfggffgfggfggfgffgfgfgfgfefefefedeeededed cddcddccddcdcbcbcbccb abbabaabaaba`_^_^_^]^]\]]\ [\[[\[\\[\[ZYZYXYXWXWXWVUVUTUTSTSRQRQPPQPOPONONMNMMNMLMLLMLKLKJKJIJIHIHIHGHGHGFGFGGFEFEDEDCDDCDBC BCBCBBABABABA@?@@?>=>=>=<=<=<;<;:;:9::9878876776656565454543432323223212121010/00/0/00/./.-.--.-,-,,--,,+,+,+*++*+*+*+*)*))*)**)()())('('('('('(FGGFFGFGHIJIJKLKLMLMLMNMNONOPOOPOPQPQRQRSRSTSTTTUTUVUVUVWVVWXWWXYXYXXYZYZ[Z[Z[Z[\[[\]\]\]^]^]^_^__`_`a`a`a`a`abcbcbccbcbcdccdccdcdedefefefffefgfgfgfgffgfgfgfgfgfgfgfgfefefefeeffedeedededeedcdcdcdcbcbcbbccb cbbaabababbaba`a`a`_`_`_`_^__^_^^_^]^^]^]]\\]]\[\\[ZYZYXYXWXXWVUVVUTUTSRQRQPQPPQQPOPONONMNMLMLKLKJIJIHGHGFGFEFED CDDCCDCDCCBCCBCBABBABA@?@?@?>?>=>=>=<=<=<;<;:;:9:9:98987878767665654543434323233212101010/0/00/./.-.-.--,-,-,-,+,+,,+*+*+*+*)*)())('(('('('('(GFGFGHGGHGHIJKJJKKJKLKKLLKKLMLMNMNMNMNONNOONNOPOPQPQPPQPQRQRSRSTSTUTUVUVWXWWXYXYYXYZYZYZ[Z[Z[Z[\[[\]\\]\\]^]^__`_`a`a``abababbaabcbcdcdcdcdededededefefefefeefefgfgfgfgfgfefefefefefedeeddeedcdcdcdcdccbcbcbcbcbabababa`a`a``a`_^_^]^]^]^]]\]\\]\[\[Z[ZYZYZYXYXWVWVUTUTSTTSTTSRSRSRSRSRQRQPQPPPOPOPONONONONMNMLMLKJKJKJIJIHIHIHGHGFGFEFEDCDCCBCBCBABABA@@AA@?@?>??>=>=>=>>=<==<<=<;<;:;::;:9:99898788778767767665454543232332121210/././.-..-.-,-,-,+,+,+*+*++*+*+*)*)*)*) ()(()(()()('('(FGFGHGHIJIJKJKLKLLMLMNMMNONOPOPQPPQPQRQRSRRSSTUTUVUUVWVWXWXYXYZYZ[Z[ZZ[\[\]\]\]^]]^]^_^_^_^___`_`_`__`_`_`a`a`abaababcbcbbcdcdcdcddcdeddedededefe efefefeefefeefefefefefefefeffefefefefedededededcdcdcddcdcbcbcbcbabaabaaba`a`_`_``_^_^]^^]^]\]]\]\[\[Z[[ZZ[ZYZYXYXXWWXWXWVWWVUVUTUTUTUTSRSRQRQPQPQPONOONONMLKLKJKJKJKJIJI HIHIIHIHIHGHHGFGGFEDCDCCBCBABA@A@?>=>=>=<=<;<;:;:9:9:9:98987887876766565654543432332121212010/0/./.-.-,+,++,+*+*)*)()()('('(('(('('('('('('('(FGHGHIHIHI JIJIIJJKJKJKLKKLMNMNONONNOPOPOPQPQPPQPQRQRSRSRRSTSTSTUTTUTUVWVVWVWVWXWWXWXYZYZZYYZ[ZZ[[ZZ[\[\]\]^]^__`_`a`aa`a`abababcbcbcdcdcdcdeddedededefefeeffefefefefefefefefefefefefefefefededeeddeddedcdcdcdcbcbcbaba`a`a`_`_`_`_^_^]^]^^]\\[\[\[Z[[Z[ZYZYZYYZYXYXWXXWVUVUTUUTUTSTTSRSRQRQRQPQQPQPOPONONMNMLKJKJIJIHGHGFGFEFEDCDCBCBABABA@A@?@?>?>?>=>=<;<;:;;:9:98998898787665656543232332321210/.//.-.- .-.-.--,--,-,-,-+,+,++,+*+*++*+*)*)())()()()('('('('('('(FGFFGHGHGHIHIJIJKJJKJKLKKLMNMNOPOPOPQRQRSRSTSTSTUTUVUVUVWVWXWXYXYXYZYZYZ[\]\]\]\]^] ^]^]]^]^^_^_^__^_`_`__`_`a`a`abaababababcb cbcbbccbbccbcdcdcddcdcdededededefefefeefefeefeffefeefefefeffefefefefeffefeffefefededededededdedeedcdcdcbcbabbababa`aa`a`_`_`_^_^_^]^]^]\]]\]]\[\[\[Z[ZZ[ZYZZYZYYZZYXYXWXXWWXWVUTUUTUTUTSTSRSRQRQRQPPONONMLMLMLKLKJIJIHIHGHHGHHGFEDEDCDDCBCBABA@A@@A@?@?>?>=<=<=<;<;:;:;:9:98767676776656556654543443432323212210100110010/00/0/./.-.-,-,-,+,+,+,+*+*+**+*)*)()(()()()('('('(FGGFGHGHGHIHIJIJIJKJKJKLKLKKLMLMNONOPOPQPQR SRSRSRSTSSTSSTSTTUTTUVUVWXWXWXYXYZYZ[Z[\[\\[[\]\\]]\]^]^]^_^_^_`_`a``a``a`abaababcbcbcbcbcdcdcdcdedededefeeefefefefefefefeffefefefefefeefeefefefefefefefefefededededededddedcdccdcbcbcbababa`a`a`_`__``_^_^^__^_^]^]^]\]\\[\[\[Z[Z[[ZYZYZZYYZYXYXYXXYWXWXWVWWVWVUVUTUTSTTSRSRRSRQRQRQRQRQPQPQPPOPONONMLKLLKLKJKKJIJIHIHIHGHGGHHGFGFEFEDCDCDCCBBCBCCBABA@AA@?@?>?>?>=>=<=<=<;:;:;;:9898788767665655654554343443432323212121010/.//./.-.-.--.-.-,--,-,+,++,+*+*)*))*)()('('('('('('(EFFGFGHGHIHHIJIJKJJKJKLKLLKLMNMNOPOPOOPQPPQQPQRQRQRSRSSTSTTSTUTUUTUVWVWXWXYXYZYZ[Z[\[\]\]\]^]^]^]^_^_^_^_^_`_`_`a`a`abaabaabbaabbabbccbcbccbbcdcdcdcdededdeededeefefefefeefefefeefeffeffefeefeefefefeffeffefefefefefefededeeddcdcdcdcbcbcbccbcbbcbababa`a`aa`a`_`_`_`_^_^_^]^^]^]\]\]\\[\[Z[Z[ZYZYYZYXYXWXWVWVUVVUTSTSRSRSRQRRQRRQPQPPOPONOONMNMLKLKLKJIHIHHIHGFGFGFEFFEFEDED CDDCDCCBCCCBABAABAA@A@?@@?>??>=>=<==<=<;<;:9:9::989878767667665654543434344323212121010/0/0/0/./.-.-.--.-,--,,-,,-,+,+++,+*+*+*)*)*)*)()()('('('('('(FGFGHGHHGHIJIJIIJIJKLKLMLMNMNMNONNOONOPOOPQPQRQRSRSSRSSTTSTTSTUVUVUVVWVVWVVWXYXXYZYZYZZYZ[Z[\[[\[\]^]]^^]^__^_^^_`_`a`a`aa`ababcbcbcbccbbcdccdccdcdcdedededededdedeefefefefefefefeffefefeffeffefefefefefefefedededededdcdcdcdcbcbcbcbcbabbabbaba`a``a`a`_`_`_`_^_^^_^]\]\\[\\[ZYZYZZYXYXWXWVWVUVUTSTSTSRSRQRRQPQPQPPOPONMNMLMMLKLKJKJIJIHIHIHGHGHGFGFEDEDCDCCBABA@A@?@?>?>?>>?>=>=<==<<=<<=<;<;<;:;:9::99:98787676765656545432321212101010/0/0/./.-.-,--,-,-,+,+,,+*+*+*++*)**))**)*)())()())()('('('('('('(FGHGHIHIJIJKJJKLKLKLMLLMLMNONNOPOPQPQPQRQRQRQRSRSSTSTTSSTUTTUTUVUUVWXYXYZYYZYZYZ[\[\]\]]\]^]]^]^_^_`_`a`a`abaabaababcbcbcbcdcdcdccdccdcdeddeededdeedededeeefefefefefefefefefeeffefeefefeffefeffeffefefefededeedeededdeddeedededdcdcbcbcbababba`a`a`a`_``_`_^_^^_^]^]^]\]]\]\]\\[\[\[Z[[Z[[ZYZYZYXYXYXWXXWXWVWWVWVUVUUVUVUTUTSTSRSSRSRSRQPQPPOPPOPONONMNNMLKLKJKJIJIJIHIHGHGHGFEFEDEDCDCCDCBCBABA@A@A@?>?>?>= >==<<==<<=<;<;:;:9::9:98788778767656565654543432323212122101010/0/./././.-.-.-,--,,--,+,+,+++,+,+*+*++*+*+*)*)*)()()('('('('('('('FEFFGGFFGFGHGGHHGHIHIIJIJKJKLKLMLMNMNMNMNONOPQPQPQRQRSRSSRSSTSTUTUTTUVUVWVWVWXWXYXYZYZYZYZZ[Z[Z[Z[\[\\[\]\]]\\]^]^]^^_`_`_` a`aa`aa`a``a`abababcbcbcdcddcdcdcdedeededededeefefefefeffefefefefefedededeededdcdcdcbccbcbcbbcbababbabaaba`a`a`_`_^]^^]\]\\[\\[\[\[ZYZYZZYXYXYXWXWVWVUVUTUTUTSRSSRRSRQRQPQPPOPOPONONMNMLMLMLKLKJKJIJIJJIHIIHIHGHGFGFFGFEFEFEDEEDEDCDCDCBCCBABA@A@?@?@?@?>?>=>=<;<;:;::;:9::98987887677667656545454344323322321210/0/00/././../.-.-,-,-,,+,+,+,,+*+*++*)*)*)*) ()(()(()()('('('('('('('(FGFGHGHIHIJIJKJKLKLMLMLMNMNONOPOPQRQRSRRSSTTSSTUTUVWXWXWXXWXYXYZYYZ[Z[\[\]\]\]^]]^]]^^_^_`_`a`a`ababcbcdccdcdcdededeedededeededefeefefe fefeeffefefefefededededeedededcdccdcdcdcbcbcbcbababa`a`a`_`__`_^_^]^]\]\]\\]\\[\[Z[Z[[ZYZYXYXWXWXWVWWVWWVUVUVUUTUTUTSTSTSRSRQRQPQPPOPONONMNMLMLKJIHIHIHGHGFGFGGFEFEFEDEEDCBCBBCBABA@A@@A@?@?>?>=>=<=<=<=<;<;;<;;:;:;:9::9:98987887676566565454344343232121 21101010110/0/.//.-.-,--,-,+,++,+*+*)*)*)()()()('(('('('('('(('('('FGFGHGHIHIHIJIJIJKLKLKLMNMNMNONOPOOPQPQRQRSRSSTSTUVWVWXWXYZYZ[Z[[Z[Z[\[[\[\]\]^]^^_^_^_`_`a``a`abababcbcbcbcdcdcdcdedededdedededefefefefededededededcdcddccddcdcbcbcbbcbababaaba`a`a``a``a` _`_``_``_`_^_^_^_^]^]^]\]\]\[\\[\[[\[Z[[ZZ[ZYZYXYXYXWXWXWVWVWVWVUVUVUTUTSTSTSRSRQRQPQPPOPONONMNNMNMLMLLMLKJIHIHGHGHGFGGFGFGFEDEDCDCBCBABBA@A@?>?>=>= <=<<=<<;<<;<;:;:9:99:98989898787876765655454343233210110110/0/.-.-..-.-,--,,-,++,+*+*+*)*)*)() ())(())(()('('('('('('('(FGFGHGHGHGHIHIJIIJIJKLKLMNOPOPPOPQPQRQRQRRQRSRSRSTUTUTUVUVUVWVWVVWVWXYXXYZYZ[Z[Z[Z[\]\]^]]^]^^_^__^^_`_`_`a`a`abaabaabcbbcbcbcbbcbc dccdccdcdccdcdcdcded eddedeededdeddededeededefefefefededeedededdeededcdcddccdcdcbcbccbcbabababba `aa`a`a`aa`aa`_`_^_^_^]^^]^]\]\]\[\[Z[ZYZYXYXWXWVUVUTUTSRSRQRQPQPPQQPPOPONONMNMLKLKJKJIJJIHGFEFFEDEDCBABBA@AA@A@?@?>?>?>=>=>=>=>=<=<=<<=<;<;<;:;:989878767676565665454434343232121010/0/./.-.-.-,-,-,+,,+,++,+,+*+*)*)*)()()()(()('((''('('('('('('(FGFGFGHIHIIHIJKJKJKLMLMLMNMMNNMNONNOOPOOPOPQPQPQRQRSRRSTSTUVUUVUVUUVWVWXYXXYXXYZYZ[Z[Z[\[\[\]\]]\\]\]]^]^]]^]^]]^]^_^_^_`_`_`__`a`a`a`abababcbcbcdcdcdcdcdcdcdeddedededededeedededededededcddcbcbcbababa`aa`a`_`_`_^_^^__^^_^]^]^]\]\\]\[[\[Z[ZYZYZYZYXWXXWVWVWVUVUTUTSTSSTTSRSRSRSRQRQPQPOPOPONONONONMNMLMLKJKJIJIHIIHIHIGHGHHGFGFEFEDEDCDCBABA@A@?@?>?>=>=<==<<=<;<;:;::;:9:98787876776566655665454344323210101010/0//0/./../.-.-,-,+,+,++,,+*+*+*)*)()()()('('((''('(('(FGFGHGHIHHIHHIJIJIJKJKLKLMLMNMNONOPOPQRSRSSSRSTUTUUTUVUVUUVWVWVVWXWWXWWXYXYXYZYYZYZ[Z[Z[\[\[\]\\]\\]^^_^_^_`_`a`a`a`a`a`abaabaabbabcbcbcbcdcdcdcdcdededdeddededededededededdededed edeedeedededcdcdcddcbcbcbabbabababa`a`_`_``_`_^__^^_^^_^^]^]^]]^]]^^]\]\]\[\\[\[Z[Z[ZYXYXXYXXYXWXWXWVWWVWWVUVUTUTSTSRQPQPOOPONONMNMLMLMLKLLKJKJIJIHIHGHGFEDEDEEDCDCBCCBCBABBABBA@A@?@@?@?>?>=>>=>=<==<;<<;<;<:;:;:9:989878767655654543443232332101010/./.-..-,-,+,,++*+*)*)())())()('('('('('('((EFGFGGFGHGHIJIJKJKLKLKKLLMLMNMMNMMNONNONNOPOOPOOPQPQPQPQRQRQRSRRSTUTUVWVWVWVVWXYXXYZYZZYZ[Z[Z[\[[\\[\]\]\]^]^^^]^_^_^_`_`_`a`a`a`abababbababcdcdcdcdcdcddcddccddededdedededededededededededededededeedededcdcdcdccbccbabababa`a`aa``aa`a`_``_`_^_^_^_^_^]^^]]^]^^]\]\[[Z[Z[ZYZYZYXYXWXWVWVWVWVUVUTUTUTSTSSTSRQRQPOPONONONONMNNMNMNMLMLKLLKLKJKKJIJIHIHGHGFEFFEDEDEEDCDDCDCBCCBBCCBA@A@AA@?@@?>=>=>>=<=<==<;:;:9:989898788778667655654545454343233212101010/././/.-..--.-.-,-,-,,-,+,++*+*)*)*)*)()())(()()()('('('('('(EFGHGGHIHIJIJKJKLMLMNMNONONOPOPQPQRSRRSRSSRSTSTSSTUTUTUVWVWXWXYXYXYZYZ[ZZ[\]\\]\\]^]^]]^_^_^_^_`_`_`_`a``aa``abababaabcbcbcbcdccdcdcdcdcdccddcddcddedededededededeededededededdedededededcddcdccbcbcbaba`a`aa`_`__`__`_^_^_^]^^]^]\]]\]\[\[[Z[ZYZYXYYXYXWXWVWVUVUVUTUTTUTUTSTSRSRQRQRPQPQPQPOOPONMNMLMLKJKJIJJIHIHHIHGHGFGGFEDEDCDCCDCBCBBABABBA@A@?@?>?>=>>=<=<;<;<;:9::9::98987876765454434434323212101010/0/0/././.-.-..-,-,-,-,,-,+,++*++**+*)*)*)*)**)()()('('('('('EFEFGFGGFGHGHIHIIHIJIJKLKLKLMLMLLMNONONOONOPOPQRQRRSRSTSSTUTUTTUVWVVWVVWVWXWXWXYXYZYZ[Z[Z[\[\]\]\]^]]^_^_^_`_`__`_``__``_`a`abababaabcbcbcbcdcdcddcddededeedeedededeedededededededededdeedeededeedeeddededcdcdcdccbcbcba`aa`a`a`_``_`_^_^_^^_^]^]\[\[[[Z[ZYZZYZYXYXXYXWXWVWVUTUTSTTSTTSRQRQPQPOONOONOONMNMLKLKJKJJKJIJIJJIHIHIIHHIHGFGGFGFEFEDEEDC DCCBBCBCCBCBA@?@?>?>?>=<=<;<;<:;:;:9:98987876765665454344323233212121010/0/.//../.-.-,--,-,+,+,++*+*+*)*))*))**)()('('('(('('('('('(EFGHGGHIJIIJKJKLKLMLNMMNMNMNONONOOPOPOPQPQPQRQRSRRSTSTSTUTUUTUVWVWVWXWXWXXWWXYZYZ[Z[[Z[\[\[\]\]\]^]^]^_^_^__^_`_`_`a`a`a`a`abababcbcbcbcbc dcddccddccdcdcdededededededededeedded eddedededdededcd cdccddcddccdcdccbcbcbabbaba`aa`a`a`_^_^]^]^]^] \]\]\]]\]]\]\[\[Z[Z[ZYZYZYZYXYYXXYXWXWXWVWVUVUTUTUTSRSRSRQRQRQPQPONMNMMNMLMLKLLKLKLKJKJKJJKJIHGHGHGGFGGFEFEEFFEDCDDCBBA@A@?@?>?>=<=<=<<;<<;:;;:;:9::99::98765656543432321210100110/0/0/././.-.-,--,+,++,+,+*+*+**++*)*)*)*)*))*)()(())(()()('('('(''('('('(EF GFFGGFFGHGHGHIHIJIJKJJKLKLMLMLMNMNMMNONNOPOOPOPQPQPQRQRQRRSTSTTUTUUTUVUUVUVWVWVWXWWXWXYXXYYXYZYYZYZYZZ[Z[[ZZ[\[\]\]\\]^^]^_^_`__``_`_`a`a`a`ababaabbaababcbcbbcbcbcbcbcdccdcdcdcdcdededededdeddedededededcddcdcdcdcdccbcbcbcbababa`a`_`_`_^_^_^_^_^]^]^^]\]\]\[\[[Z[ZYZZYYZYXYXWXXWXWVWVUTUTSTSTSTSRSRRSRRSSRQRQPOPPONONMLMLKLKLKJKJKJIJIJIHGFGFEFEFEDEEDCDCBCBBABBA@A@A@A@?>=>>=<;<;<;;:;;:9:9:989887878767676554543432321221210/0/./.-.-.-,--,,-,-,+,++,++*+*+*)*)*))*)())()('('('('(EFEFEFEFGFGHGGHIHIIJIJKLKKLLKLMLMNMNOPQRQRQRSRSTUTUVUVWVWVWXWXYXXYZYZ[ZZ[\[[\\[\]\]^]^_^^__^_^_`_``_`_`_`a`aa`a``a`a babaabaababcbccbcbcdcdcdcdcdcdccdededdeddeedededededcdcdccdccd cdcdccddcdcbcbcbcbccbbccbcbababaaba`a``a`a`a`_``_`__`_`_^_^]^]\]\ [\[\[[\\[[[Z[ZYZYZYXWXWVWVUVUVUTUTTUTSTSTSRSRSRQRRQQRQPQPOONOONONMNMLMLLMLKLKLKJKJIJIHIHGHGFEFEFFEDEDCDCBCBABBAABA@?@@?>?>=>=>>=<=<;<<;<;:;:;;:;:9:987887676765655454545543443443233212101010010/0/./. -.-.--.--.-,+,+,++*++*++*+**+*)*)*)()()()())(()('('('('('('(('('('(EFEEFGHIHIJIJIJKJKJKLKLKLMNMNOPOOPPOPQPQRQRSRSTSTUTTUTUVUVWVWXYXYZYZZYZ[Z[\[\]\]\]\]^]^]^]^_^_^_^_`_``__`a`aa``abaabbaabababababcbcbcbcdcdccddccdcdcdcdedededdededcdcdcdcdcdcddccdcbccbcbcbcbababa`a`a`a`_`_`_`_`_^_^__^]^]^]^]^]\]\[\[\[[Z[ZYZZYXYXWXWXWVWVWVUVUTSTTSTSRSSRQRQPQQPOONMLMLKLKKJKJIHIHHIHGHGGHGHGFGFFEFEFEDEDCBCBBABBABA@A@?@?>=>=>=<=<=;<;<;<<;;<;:;:;:9:99:9898767656554554454323212101010/0/./././.-.-,-,,-,-,+,+,+++*++*++*+*)*)*)*)()()('('('('(EFGFFGHGHIHIJIIJKJJKLMLMLMNMMNMNONOONOONOPOPQPQRQRRSRSTSTUTUVUVUVWVWVWXWXYXYZYZZYZ[\[\[\]\]]^]^_^_^_`__`_`a`a`a`a`abababbabcbcbcbcbcbcdccdcdcdcdcded cdccdcdccddcdcdcdcdcdcbcbbcbbcbcbcbababa`aa`a``aa`_`__`_``_^_^_^__^]^^]\]\]\]\\[\[\[\[[Z[[Z[ZZ[ZYZYZYXYXWXWXWVWWVUVUVVUTUTSTSTSRSSRSRQRQRQPQPOONONMNMLMLLMLKLKJKJKJIJJIHIHIIHGHGFGFGFEFFEFEDEDCBCBCBBAABAABAA@A@@A@A@? @??>?>>?>>?>=>=<;<;<;:;::;:9::9:987887676565545455434323233232121010/00//0/./.-.-.-,-,+,++,+ *+*++*+*++*)*)**))*)())()()()('('('('('('('('('('('EFEFEFGHGHGHIHIJIJKJKJKLMLMNONONNOPQPPQRSRRSRSSRSTSTUTTUUTUVUVUVUVWVWWVWXWXYXYZYZYZ[Z[\[\\[[\]\]]\]]]^]]^^]^_^^_^^__^_ `_`__`_`_`_`a``a`ababcbcbcbcbcdccdcdcdcdcddcdccdcdcdcdcddcdcdcddcdcdcdcdcbcbcbcbcbcbcbababababa`a`a`_`_`_^_^_^]^]^]^]\]\]\]\[\[Z[ZYZYZYXYXWXWXWXWVWVUTUTSTTSRSRQRRQRQPQPQPOONONMLMMLKLK JKJJIJIIJJIJIHIIHGHGFGFEFEDEDEEDCDDCBCBCBBCBBBABABBA@A@?@?>?>=>=<=<=<;<;:;:9:989898788767676565654545543434432121010010/0/0/.-.-..-.-,-,-,+,++,,++*+*+*+*+*)*))*)*)*)()()()()('('('('('('(EFGFGHIHIHIJIJIIJKJKLKKLKLMLLMNMNONOPOPOPPQPQRQRQRRQRRRSRSTSTUVUVWVWVWXWXWXYXYXYZYZYZ[Z[ZZ[\[\[\]\]\]]\]]^]]^]]^_^_^_`_`a``a`a`aa`ababaababbabcbcbccbccbcbcdccdccdcdcddcdcdcdcddcdcdcdcdcdcdcdcdcdcdc dcddccddccdc bcbccbbcbcbccbcbccbbcbabbaababaaba`a`a`aa`_`_^_^]^]^]\]\]\[\[Z[ZYXYXWXWWXWXWVWVVWWVUVUTUTSTSRSRQPQPOONONONMNMNMLKLKJKJIJIHIIHGFGGFEFEFEDEEDCDCCDCBCBBCBABA@A@?>?>=>>=>=<;:;::9::9898767656566654554454344343343232121210110/0/././.././.-.-,-,--,-,+,+,+,++*+**+*++*)**)*))*)()()('('('('('('(EFEEFGFGHGHIJIJKJKLKLMLMNMMNMNOPQPPQPQRQQRRSTSTUTUVUVWVWXWXYXYYXYZYZ[Z[Z[\[\[\]\\]]\]]^_^_^^_`_``_`_`a``a`a`aa`a`abababcbccbcbccbcbccdcdcdcddcdccddccddcdcdcddcdcd cdcddcdcddcddcdcdcdcdccdcdcdcdccdcbcbcbcbbcbcbbcbabbaababa`a`a`a`a`a`_`_`_`_^_^_^]^]^^]\]\[\[\[Z[Z[ZYZZYZYXYXWXWXXWWXWVVWVWWVWVUVUVUTSRQRQPQPPQPOPOPONONOONMNMLMLMLKLKKJKJIJIJIHIHGHHGFGGFFGGFEDEDCBCBBA@A@AA@?@?>?>=>=<=<;<<;:;:9:9:9:989889878767767656554543432323232121010/0/.//.-.-,-,-,+,+,+*+*)**) ())(()(())('('('('(DEFEFEFGFGHGGHGHIJIJKLKLMLMMLMNOPOPQPQRQQRQRRSRSTUTUVUVUUVWVWVWXWXWXWXYXYXYZ[Z[Z[[\[\[\]\]\]^]^]^^]]^_^_^_`__`__``_`a`a`ababbaababcbcbccbcbbcbccdcdc dcdcdccddccddcdcdcdcdcdcdcdcdcdcdccdcddcdcbcbcbcbbaba`a``a`aa`_`_`_^_^^_^__^]^]^]\]]\]\]\[\\[\[[ZYZYZZYXWXWXWXWWVWVWWVUVUVUTUTSRSSRSRQRQPQPOONONMNMLMLMLKLLKJKJIHIIHGHGFGFEFEDEEDCDCDCBCCBCBABBAABA@A@?>?>=>>=>=<=<;<;<;:9:99:98998987656554545454323232121010/00/0/././.-.--.-,-,-,-,+,,+,+,+*+*+*+*)*)*)()()(())('('(DEFEFGFGHIHIJIJKJKJKLMLMNONNONNONOOPOOPPOPQRQRRQRSSRSTSTTSTU TUUTTUUVUVUUVWVWVWXWXWXYZYZ[Z[Z[\]\]]]\]^]^]^_^_`_`_`_`a`a`a`a`a`abababababcbcbcbcbccdcdcdcdcdcd cdccdccddcdcdcdcdcdcdcdcdcdcddcdcbcbcbcbcbbcbbbabbaba`aa`a`a`aa`_`_`_`_^]^^]^]\]]\[\[\[\[Z[ZZ[ZYZZYZYXYXXYXWXWVWVWVUVUTUTSRQRQPQPOPONONONMNNMNMNMLMLKLLKLKJKKJIJIHIHGHGFGFEFFEDEDEDCDCBCBABA@A@AA@?@?@?>??>=>>=<=<=<;:;:989898787656554545434343233223212211210/00/0/./.-.-,-,-,+,++*+*)*)*)()()(()('('('('('('('('(EFEFGHIJIJIJKJJKLKLKLMLMLMNMNONOPOPQPQRQRSRSTSTUTUVUVWVVWVWXWXYXYXYXYZYZ[ZZ[\[\[[\]\]^]^]^_^_^_`_`_`_`_`a`a`aa``a baabaabaabaabcbcbcbcbccbcdcdcdcdcddcdcdcdcdccddcdcdcdcdcbcbccbcbababababababa`a`a`_``_`_`_`_^]^]\]]\[\\[[\[[\[Z[ZYZYZZYXYXYXWXXWVWVUVVUTS RSSRSRRQRQQRRQPQPOPOONMNMLMLKJKJIJIHIIHHIHGHHGFEDCDCBCBCCBCBBA@A@?@?>??>=>=<;<;:9:98987876765655454343432323210110/0/0/././.-..-.-,-,-,+,++*+*+*)*)*)*)*)()()('('('('('(('(''(DEFEEFEFGHGHGHIHIJIJIJKJKLKLLKLMLLMNMNONOPOPQPQPQPQRQRQRSRSRSRSTSTUTUTTUVUVWVW VWWXWXWWXWXYXYYXYZ YZZYZZ[ZZ[Z[ZZ[\[\[\]]\]^]]^^]]^]^_^_^_`__`a``a`a`abaabababababcb cbcbcbbccbcbcbbcbcdcdcdcdcdcdcddcdcdcdc dcdccdcddcddcbcbcbcbabababbabaaba`a`a`_`_`_`_^_^]^]\]\[\[[\[ZZ[ZYZYZYXYYXWXWVWVUVVUTUTSTTSSTSRQRQPQPONOONONMNMLKLKJKJJKJIJIJJIHIHIIHHIHGHGFGFEFEDEDCDCBBA@A@?@?@?>?>?>=>=<=<;<; :;::;:;::9:98989878767656555454323321212101010/./.-.-.-,-,-,-,+,+,++,+++*+* )*))*))*)*)*)()()('('('('('('((DEFEFEFGFFGHIJIJKJKLKKLKLMLLMNMMNOPOPQPQRRQRSTUTUTUVUVVUVUVWVWXWXYXYXXYXYYZYZYZ[Z[\[\]\\]]\]\]^]^]^_^_`__`_`a``a`a`abababbababcbcbcbcbccbcbcbcbcdcdcdccddcdcdccdcdcdcbcbcbbccbcbcbcbababaabba `a`a`a`a``a`_`_`__`_^_^_^]^]^]\]\]\[\[\[Z[ZZYZYXYXYXWXWWXXWXWVWWVVWWVUVUTSTSRSRSRQRQPQPONOONMNMMNMLMLKLLKLKLKJKJKJJKJIHGHGFGGFEFEEFFEDEDCDCBCBAA@A@?@?>?>=>=<=<=<;:;:9:9898987876767767656554554543 4343223233232122121010/0/0//0//./.././..//.-.-.--.-,-,-,++*+**+*)()()('('('('(DEFGFGHGGHGHIHIHIJIJKJKJJKLMLMNMNONOPQPQPQRQQRQQRSRRSRSTSTSTUTUVUVUUVWXYXYZYZYYZ[Z[\[[\[\\]\]^]]^^]^_^_`_`_`_`a`a`aa`abababababcbbcbcbccbcbcbcdcdcbccbcbcbcbcbabbabababa`a`a`_`_^_^__^]^]\[Z[[ZZYXYXWXWXWVWVUVUTUTUTSTSTSTSRSRRSRQPOPPONONONMLMLKLKLKJKJKKJIJIJIHGFGFEFEDCBABA@A@A@?>?>=>>=<;<;:;:;:9:9:9898987876767676 56566565654554554454343212212101010/././.-.--.-,-,-,+,+,+,++*+*+*)*)*)()()())()('('('('('(DEFEFEFGFGHGHGHIHIJIJIIJKJKJKLKLMLMNMNMNOPOOPQRSRSTUTUTUVUUVVUV WVVWVWXWXWXXWWXYXYXYZYYZ[Z[[Z[Z[\[\\]\]]\]^]^]^_^_^_`_`__`_`a`a`aa`aa`ababaabababcbcbcbbcbcbcbcbcbccbcbcbcbcbcbbcb cbcbcbcbbccbcbababbababa`a`a`_`_`_`_^_^__^]^]\[\[\[[\[Z[ZZYZZYZYXYXWXXWXWXWVWVWVWVUVUTUTSTSRSRQRRQPQPONOONONMNMLMLKLKLKJKJIJIHIHGHHGFGFEFEFFEDCDCBCBBCBCBABAA@?>?>?>=<=<;<;<;:;:;;:9898787787876 5665655655454543432321212101010/./../.-.-.-,-,+,+,,+++*++**++*)**)*)()()(()('('('('(EFEFGFGFGHGHGH IHIIHIIHIIJIJ KJJKJKKJKKLKLKLMLMNMNONOPQPQRQQRQQRSRSRRSTSTUTUTUVUUVWVWXWXYXYXY ZYZZYZYYZZ[Z[\[\]\]\]^]^]^^]^_^_^_`_`_` a``a`a``a``abaabbababababcbbcbcbbcbcbbcbccbcbcbcbcbcbcbcb cbccbcbbccbcbcbcbcbccbbcbabababababa`aa``aa`_`_`__`__`_`_^_^]^]^]\]\]\][\[\[\\[Z[ZZYZYZYYXYXYXWXWVWVVWVUVUTUTSTTSSTSRSSRQRQPQQPPQQPOPOONMNMLMLKLKKJKJIHIHGHGGHGHHGFGFEFEDEDCBCBABBABA@A@A@@?@@?@?>?>=>=>=<=<==<=<;<;<;:9:99:9898787876566554545434343232321 2121211010110/0/0/0/0/././.-.-.-,-,-,-,+,,+,+,++*+*+*)*)*)()())(()()('('('('('('('('('(EFGFFGHGHIH IHIIJIJIJIJKJKLKKLKLKLMLMLMNMMNONOPOPOPQPQRQRQRSRRSTSTSSTUTTUVUVWVWXWXWWXYXYZYYZ[Z[ZZ[\[\[[\[\]\]\]\]^] ^]^^_^^_^^_`abaabbabababcbcbbcbcbcbcbccbbccbccbbcbcbcbcbcbcbcbcbccbcbcbcbcbcbcbcbabaabababbaababa`a`_``__`__`_^__^_^_^]^]\]\[\\[\[Z[ZYZYXYXWXWVWVVWVUVUVUVUTUUTUTSRSRSRQRQRQRQPQPOPONONMNMLMLKLKJKJKJIJJIJIIHIHIIHGHGFGFGFEFFEFEDEDCBCBABBAABBA@AA@A@@AA@?@@?@?>?>>?>=>=<=<;<;:;::;:9:9:9:98987876765665655454455434343232121221010 100/00//0//0/././.-.-.--.-,-,--,,-,-,+,+,,+*+*+*+* )*))*))*)*)()()()()()('('('('('('('(('EDDEFEFGFGHGHIJIIJKJKLKLMNONOPQPQQRQRSRRSTSTUTUVUVUVWVVWXWWXWWXYXYZYYZYZ[Z[Z[[Z[\[\[[\\[\\\]\]\]^]^]^]^_^_^_^_^_`_`a`a`aa``ababaabaabababcbcbcbcbc bccbccbbcbcbcbcbcbcbcbccbbccbcbccbcbbccbcbcbcbcbababababababaabaabbaa`aa``a`a``a`a`_`_`__`_^_^_^_^]^^]^]^]\]\[\[Z[Z[Z[ZZYZYZYXYYXXYYXWVWVUVUTSTSTSRSRQRQRQPQPONONNNMNMLMMLKLKJKJIJIJIHIIHGHGFGFEFEDEDEEDCBCBCBBCBABBA@A@AA@@A@?@?>?>=>=>=<=<==<;<;:;;::;:9:98987876565454543443232232121 01011011010/0/0/./.-..-.--.-.-,-,-,+,+,+*+*+*)*)*)*)()('('('('(('('('('('(EDEFEFGFFGFGHGHGHIHHIIHIJKJJKLKL MLMLMMNNMMNMNONOPQPPQPPQQRQRQQRRSRSRSSRSRSTSTSTUTUVUVWXWWXWXYZYYZYZ[Z[\[\\]\]\]]\]^]]^^]^]]^_`_`a`a`a`aba baababbabbabbcbcbcbcbcbcbbccbcbcbcbcbcbcbcbcb cbbcbbccbbcb ababbaabababbababa`a`a`a``a``a`_`_`_^_^_^]^]^^]\]]\]\[\[Z[Z[[ZZYZYXYXXYYXWXXWXWVWWVVWVUVUUVUTUTSTSTTSRSRQRRQPOPPONONONMNMNMLMMLKLKJKJIJIHIIHGHGGFGFEFFEFEDEEDCDCCDCBCBBCBA@A@@A@?>?>>?>=>=<=<=<;<;:;:9:987878767656654454545434343232321211210110/0//0/.//.//./.-..-,-,+,+,++*+*+*+*+*)*)**))**)()()()()()()('('('('('('('('(DEFEFEFGFFGHGHIHIJIIJKJKLKLMLMLMNMMNONOPOPPOPQPQQRQRSTUTTUTTUVUVUVWVWXWXWXYXYXYZYZYZ[ZZ[[Z[\[\[\]\]\]\]^]^]^_^ _^__^__^_^_`__``_`_` a`a`a``aa`a`ababababababbcbcbcbcbbcbcbcbbcbcbcbcbcbcbbcbcbccbabababaababaabaa`aa``a`a`_`_`_^_^_^]^]^]\[\[\[ZYZYXYXYXWXWXWWXWVUVUTUTSTSSTTSRSSRQRQPOPOPONONNONNMNMLMLMLMLKLLKJKJIJIJIHIHGHHGFGFEDEDCBCBCBABBAAA@?>?>=>>=<==<=<;<<;<;:;:;:9:9898998787876765654543433432323212210/.-.-.-.-,-,,-,-,++*+*+*)*)*)()()('('('('('('('('('(DEFEFGFGGFGFGHGHGHI HIIJIJIIJIJKJKLKLMLMNOPOPOPQQRQRRQRSRSRRSTSTSSTTSTUTTUVUVUVWVVWVWWVWXWXWWXYXYXYZYYZ[Z[\[\[\]\]^]^]^]^]^]^_^^_^^__^_`_`_`_`a`a`a`a`a`ababababbabcbcbbccbcbcbccbcbcbcbcbcbcbcbcbbcbcbabababaa`a`a`a`a`_``_`_`_^_^_^_^]^]^^]]^]\]\[\[\[Z[[Z[ZYZYZYZYXYXWXWWVWVWWVWVWVUTUTSRSSRSRQRQPQPONONNMNNMLMLMLKLLKJKJIHIIHGHGFGFGFEFEFEDEEDCDDCDCBCCBABBAABAA@A@A@?@?@?>?>=>=>>=<=<=;<;<;:;:9 :9::9:9989989878876776765654454343232321221010010/00/0/0/0/./.-.-.-,-,-,+,+,++*+*)*)*)*)*)()()('((''('(('('('('(DEDDEFGFGHGHIHIJIJKJJKJKLKKLKLMLMMLMNMNMNONONOPOOPQQRQRSTSTSTSSTUTUVUUVWVWVVWXWXWXYXXYYXYZYZYYZYZ[Z[Z[\[\[\]\]\]^]^ _^_^__^_^_^_`a`a`a`a`ababaababaababababcbcbcbcbcbbccbcbcbcbcbabbabababababaabaa`aa`a`_`_`_^_^^_^]^]^]^]\]]\\]\]]\[\[ZYZZYYZYXYYXWXWVWVUVUVVUTUUTTUTTUTSTSTTSSTSRSRSRQRRQQRQPQPOPONONONNNMNNMNMLMLKLLKLKJKKJIJIHIHGHGFGFGFFEFFEDCDCBCBABABBAAA@A@A@?@?@?>?>=>=<=<;<;:;:9:99::9898987676765654544543434433432122121010/0/0/./..//.-,-,,-,+,+,++*+*+*++*)*)*)*) ()(())()(()('('('('(('(('('(('(('('DEDEFEFGFGHGHIJIJKJKJKLKLMLMNMNMNOPOOPOPPOPQPQPPQQQRQRSTSTSTUTUVUVUVWVWXWWXYXYZYZ[Z[ZZ[\[\[\\[\]\]\]^]]^^]^_^_^_^^_`_`_`a`a`a`aa`ababaababababababcbcbcbcbcbcbcbabbababababbaba`a`aaa`a`a`a`a`_`_`_^_^__^^_^ ]^]]^^]^]^]\]\]\]\[\\[\[Z[ZYZYYYZYXYXWXXWXWXWVWWV UVUVVUVUVVUTUTUTSRSSRSSRSRQRQPQPOPPONONNMNMNMLMMLKJKJIJIHIHIHGHHGFEDCDCBCBABAA@@A@A@?>?>?>=>=>=<;<;:;:9::9899878767676765665455454343232321210110/0/././/.-.-,+,+,,+*++*+*+*+*)*))*)()()(())()('('('('('('(DEDEDFEFEFFEFGFFGHIHIJIJJIJKLKLKLMLMNONONOPOPQPPQQQRQRQQRSTSSTSTUTUTUVUVUVWVVWXWXWWXYXYXYZYZYZ[Z[\[\[\ ]\\]\]]\\]]\]^]^]^_^_^_^^_`_`_`a`a`a`aa`abababababcbcbcbcbabababababa`a``a`a``a`a`_`__``_^_^__^]^]]^]^]^]\]\]\[Z[Z[ZYZYZZYXYXYXWXXWWXWVWVVUVUVUVUTUTTUTUTSTTSRSSRQRQPQPONOONMNNMNMLMLKLKJKJJKJIJIJJIHIHIHGHGFGFEFEDEDCDCDCBAA@A@?@?>?>?>=>=>=>=<=<;<;;::;:98988987876765655445434323321212101010/0/./.-.-.-,-,--,+,+,+,+,+*+*)*)()()()('('('('('(('('('('((DEDEFGFGFFGHGHGHGHIHIJKJKKJKLKLKLLMLMLMNMNMNONOPOOPQPQPQQRQRQRSTSTUTUUTTUVWVWXWXXWXYXYZYYZYZ[Z[Z[\[\[\\[[\]\]\]^]^]^]^_^_^_`_`_``__`_`a`a`a`a`ababaababababababbabababababababaababaabbababa`a`a`a`aaa`a`_`_`_`__`_^_^__^]^]^^]^]\]\]\ [\[\[\\[\\[\[Z[ZYZYZYXYXYXYXYXWXWXWVWVUVUVVUTUUTSTSRSRQRQRRQPONONNMNMMNMLMLLMLKLLKLKLKJKJKJJKJIHGHGFEFEFFEDEDCDCBCBAA@A@?@?>?>=>=<=<=<;<;:9::989878787676545434432332121121010/0/00/0/.//.././/.-.-.-,-,-,+,,+,++*+*)*))*))*()()()()('('('('('('('('('('(DEDEDDEFGFGHIHIJIJIJKJKLKKLLKL MLLMLMLMNMMNMNMNONONOPQQPQQRQRRQRSRRSRSTSTSTUTTUTUTUTUVUUVVUVWVWVWXYXYZYYZ[Z[[\[\]\\]\]^]^]^_^_^^__^^_^_`_`__`_`_`a`a`a`abababababaabababbabbaabababababababababaabababbababbabababa`a`a`a`a`a`_`_`_`_^_^_^]^]^]\]\]\[\[\[\[Z[ZYZYZYZYXYXYXWXWXWVWWVWVUVUVUTUTSTSRSRQRRQPOPOPONONONMNNMLMLKLKLKJKJKJIJIJIHGFEFEDEDCBABBA@A@A@?@?>??>=>=<;<;<;:;;:;::;::9:9:9:98989889878767676676765656544543443232121010/0/0/.//.-.-.--.-.-,-,-,,-,+,+,+* +*++*++**+*)*))*)*)()())('('('('('('('('(('(DEDEFEFGFGFGHGHIHIJIJIJKJJKLMNONONOPOPPQRSRSTSTSSTUTUVUUVWVWXWWXWXYXXYYXYZYYZ[Z[\[\[\]\]\]\]^]]^]^]]^]^ _^_^^_^^_^_^_`_``_`_`a`a``a`abababa bababaabbabababab abbaababbabbabababababa babababaabbaba`a`aa`a`a`a`a`_`_`_^_^_^]^]^^]^]\]\]]\[\[Z[Z[ZZ[[ZYZYYXYXYXWXWWXXWVWVWVUVVUTSTSTSRSRQRQRQPQPONOONOONONMNMLMLKLKLKJKJKJIJIHIHGHHGFGFEFEFFEDEDCDCDCBCCBCBABABAA@A@?>?>=<=<;:;;:989878878787656545434334343232233212121010/0/0/0/./.-,-,+,++*+*)**)*)*)()('('('('('('(CDDEDEFEFEEFFEFFGFGFGFGFGHGHGHIHIHIJKJKLMLLMMLMNMNONOPOPQPQQRQQRQRSRSTUTUVUVUVWVWWVWWVWXWXYXYZYZYZYZ[Z[Z[\[\[\[\]\\]^]^^]]^]^_^^__^^_^_^_^_^_`_`_`a`a`a`a`a`abababababaabbabababaababab abbaabaababbababaabbababbababa`a`a`aa`a`a`_``_`_`_^_^]^]^]]^]\]\[\[Z[Z[ZYZYYXYXYXWXXWVWVUVVUVUVUTUTUTTUTSTTSTSRQ RQQPQQPPQPPQPOPONONNMNMNMNMLMLKJKJIHIHGHGGHGHHGFGFEFEDEDCDCBCBABAABAA@A@@A@?>??>=>=>=<==<=<;<<;:;::;;:9::99::989889898788787677676545455434323212210101010/0/ 0/0/././/.//.-,-,-,-,++*+* )*)**)**)*)()('(('('('('('('('(DEDEFEFGFFGFGHGHGHIHHIJIJKLKLKLMLMNMNONOPOPPOPOPQPPQRQRQRSRSTSSTSTUVUVWXWXYXXYXYZYZ[Z[Z[[\[\]\]^]^]^_^_^^__^_^_^_`_`_`_`_`_`a``a`a``a `a`a``aa``aabababa babaababababbabababababababababa`a``a`aa`a`aa`a``_`_`_`_ ^_^^__^_^^_^_^]^^]\]\]\[\\[\[Z[Z[Z[ZYZYZYXYXYXWXWXXWVWVUVUTUTSTSRQRQPQPOPONONNMMNMLKJKKJIJIHIHGHGFGFEFFEFFEDEDEDCDCBCBABABBAA@ ?@@?@?@??>?>??>=>=<=<=<;<;<;: 9:998988998978787676767656545434323321212112210/0/0/./../.-.-.-,-,-, -,,+,,+,,+,+*+*+*+*)*)*)()()())('('('('('(CDEDEFEFEFEFGHGHGHIHIJIJIIJKLKLMLLMLMNMNONOPQPQPPQRQRSRSSRRSSRSTSSTSTTUTUTUVUVWVVWVWXWXYXYZYZYZ[Z[Z[[\[\\[\[\]^]^]^]^_^ _^^__^_^__^_`_`a`a`a`a`aa`aa`ababaabbababaabaabaababbababaabbabaababa`a`a`a`a``a`a```_`_``_`_`_^]^ ]^]^^]^]]^]\]\]\[\\[\[\[Z[ZYZYYZYYXYXWXWVWVWVUVUVUTUUTUUTSTSRSRQRQRQPOPONONMNNMNMNMLKLKJKJKJIJJIHGHGHGFGFEFFEFEDEDEEDEDCDCBCBCBABAA@?@@??@?>=>=<;:;;:;;:989989878787656545543443432332321210110010010/0/././.-,-,,-, +,+,,+,+,,+**+*+* )*)**)*)**)()())()(())('('('('('('('('('('('(DEFEFEFGFFGFGHGGHGHIJIJIJKJKLKLMLMNMNMMNONOONOPOPQPQPQPQRQQRQRSTUTUVUVWXWXWWXWXYXYZYZ[ZZ[[[\[\]\]\]\]]\]^]^_^_^_^_^_`_`_`_`_``__`a`a`a`a`abaabababababababa`a`aa`a`a`a``_`_`_`_`_^_^_^_^]^]^]^]\]]\]]\]]\[\\[\[\\[Z[ZYZYZYXYXYXWXWVWVWVUVU TUTUTUTUUTUTSTSRSRSRQRQPQPOPONONMNMNMLMLKLKKLKJKJIJJIHIHGHGFEDEDEDCBA@A@A@@A@A@?@?@?>??>=>=<=<;<;<;:9:9:98989878787656565455445543434332232122121010/./.-..-.-,-,-,-,+,+,+,+,+*+**+*+*+*)*)*)()()())()()('('('('('('('('(('('('(('('(DEDEDEFEFEFFEFGHGHIHIHIJIJKJKLKLKLMLLMNMNOPOPPQRQRSRRSTSTSTTSSTUVWVWXWXYXYZYZYYZ[Z[Z[[\[\[\]\]^]^]^]]^_^_^_^_^_`__`_`_`_`_`a`a`a`aa```abababaababababa`a`a`aa``aa`a`_`_``_^_^_^]^]]^]^]\]\[\[\[Z[Z[ZYZYZYXXYXWVWVVWVUVUTUUTSTSTSRSRSSRQRQPQPQPOPONMNNMMLKLKJKJIJJIIJIHIIHGHGHGFGFEDEEDEDCDCDDCBCBA@A@@??@?@?>??>?>=<;<;:;:;:;:9:99:99::989876765656554544343443232121010010/0/0/.-.-..-..--.-,-,-,-,+,++,+,,+*++*+*)*)**))*)()()(()()('('('('('('CDEDEFEEFGFGHIHIJIJKJKJKLKLKLMLLMNMNONOPOPPQRQRSRSTUTUTUVUVUVWVWVWXWXWXWWXYXXYXYZYZYYZ[Z[[[\[\[\[\]\\]\]\\]^]^]^]^_^_`_`_``_`a``a`a`a`ababa`a`aa``a`a`a`a`_`_`_`_`_`_`_^_^_^ ]^]^]^^]]^^]\]\]\]]\[\[\[Z[ZYZYZYZYXXYXYXWXWVWVWVUTUUTUUTSTSRSRQRQRQQRQPQPQPOPOPOPONOONMNNMMMLMLKJKJKJIJIHIIHHIHGFEDED CDCDCCDDCCBCBABA@@?@?>?>=>=>=<=<;<<;<;:;:;:9:9:989878787876565454434343232121010/0/0/.//.//.-.-.-,-,-,+,++*+*)*)**))*))*)()()()('('('(CDEFEEFFEFGFGFGGHGHHGGHIHIJIIJIJKJKLKLMNMNNMNMNONOPOOPPOPPPQPQRQRSRSTSTTSTUTUVUVVUVWVWXWXWXYXYXYXYZYZZYZZ[Z[[\[\[\[\[\]\]^]^_^_^_`_`_``_`_`a`a`a``a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a``a`a`a`a`_`_`_`_``_``_`_`_^_^_^__^]^]^]^]]^]\]\]\]\[\[\\[Z[Z[ZYZYZYXYYXYXXXWXWXWVWVUVUTUTSTSTTSTSRSRSRSSRQRQRRQPQPQPQQPOPONONONMNMNMLMMLMLKJKJKJIJIHIHGHGFGFGFGFEFEEDEDCDCCBCBABAA@A@@@?@?>=>=<=<;:;;:;:9::98987876765654544343443212121011010010/0//00/./.-.-.-.-,--,-,-,+,+,+*++*+*+*)*)*)*)()()())('('('('('(('('DCDEDEEDEFEFGFGHGHGHIHHIJIIJIJIJKJKLKLMLMNMNONONOONOPOPPQRSRSRSTSTUTUUTUVUUVWVVWXWXWXYXYZYZZYZ[Z[\[[\[\]\]\]\]^]^]]^]^]^^]^^__^_^_^_^^_`_`_`_`_`_`a`a`a` a``aa`a`a`a`a`a`a`a`a`a`a`a``a`a`_`_`_``_`_`_^_^_^]^]\]\[\[Z[Z[ZYZYXYYXXYXXWXXWXWXWVWVWVUVUTUTUUTUTSTTSRSSRSRQRQRQRQPQPOPONONMNMMLMLK LKLKKLKJJKJJKJIJIIJIHIHGFGGFEFEFEDEEDCDCBCBBCBABA@A@ ?@@?@??@?>?>?>?>=>>=<==<;<;:;:;:9:9:989878787656545434323232121121221011010/0/./.-.-,-,-,+,+*+*)*)()()('('('('('('('('(CDEDEDEFEFGFGGFGHGHHGHGHIHIHI JIJJIIJJKJJKJKLKLMLMNMMNMNONONOPOOPOPPP QPPQPQRQQRQRSRSTSSTSTUTTUTUVUVWXWWXYXYYXYZYZ[ZZ[Z[\[\[\]\\]\]\\]\]]\]]\]^]^]^_^_^_^_`_`__``_`_`_``_`a``a``a` a`aa`aa``a` a`a`aa`aa`a`aa``aa`a`a `aa`a`aa`a`a`a`a`a`a`aa`a`a``aa`_`_`_`_`__`_ ^_^__^__^_^^_^]^]^]]^]\]\]\[\[\[Z[Z[Z[ZYZYYZZYZYXYXYXXWXWVWVUVUVVUTUUTTUTSTTSTSTSRSSRSRRQRQRQPQPOPOPO NONNOONNMNMNMMLMLKLKJKJIJIHIIHIHHGHHGGHHGGFGFGFEFEFEDEDDCDCBCBABA@AA@@A@?@?>??>?>=>=>=<=<;<;:;;:9:9:98989878767667656545545434434432323212121010/0/0/.//./.-.-,-,+,+,+**+*+*)*)*)*)*)()(()()('('('(('(''('('(DCDEDEEFEFEF GFGGFGGHGGHHGHIHHIJIJKJKJKLKLMLLMLMNMMNONONOPOPPQPQPQRQRSRSRSTSTSTUTTUUTUVUVWVWXWXWXWXYXYXYZYZYZZ[Z[ZZ[\[\[[\ ]\]\]\\]\]\\]^]^]^]^_^_`_`_`_``__`a`a``a`a` a`aa``a``aa`a`a`a`a`a`aa`a`a`aa`aa``a`a`a`a`a`_`_`_`_`_^_^_^]^]^]]^]\]\[\\[\\[\[Z[Z[Z[ZYXYXXWXWVWVUVVUVUTUTSTSSTTSRQRRQRQPQPOPONONMNMMLMLKLKLKJ IJIIJIIHIHIHGHGFGFEFEDEDCDCBABAABA@A@@@?@@?>?>=>=<=<;<;;<;:9898998987887 676767766566565454544432323221212121010010010/0/0/.-.-.-.--.-,-,-,-,+,+*+*+**+*+*)*)*))*)())()('('('('('('(('('DCDEDEFEFGFGHIHIHIJIIJKJKJKLKLKLMNMMNMMNONONOPOPPQPQRSRSRSTUTUVUVWVWVWXWXYXYXXYZYZYZYZZ[Z[Z[\[\[\[\]\\]]\]^]^]^_^_^__^__^^_`_`_`_``a``a`a`a`a`a`a`a`a` a`a`aa``a`a`a`a`a`a`a`a`a``a`a`_`_`__^_^_^^__^_^^_^^_^^]^^]^^]^]^]^^] \]]\]]\\]]\]\]\[\[\[Z[ZYZYZYXYYXXYXXWXWXWWXWVWVUVUUVUTUTUTSTSTTSRQPQQPQPPQPOPOPPONMNNMMNNMMLMLKLKLKJKJIJJIJIHIHHIHGHGHGFGGFEFEFEDEDCDCBCBABA@A@@A?@@?@?@?>??>=>=>>=<=<<=<;<<;:9:99:9898987887876766765656556545445544343432332321212101010010/00/00/0/./. /../../.-..-.-,+,++,+*++*)*)*)())()()('('('('(CDCDEDDEFEFEFGFGFGHGHIHIJIJIJKJKJKLKLMLMNMNONOPOOPQPQRQRQRSRSRSTSTUTTUTTU VUVUUVUUVUVWVWXWXWXWXWXYXYZYZYZYZ[Z[Z[[Z[Z[\[\[\[\]\]\]^]^_^_^_`_`_ `_``_``_``_`_`_`a`a`a``a``a`a`a`a`a`a``a`aa``a`a`a`a`a`a`a`a`a`a`a`_`_`_`_``_`_`_`__^_^_^_^__^_^^_^]^]\]]\\]]\]\[\[\[\[Z[Z[ZYZYXYXXWXWXXWXXWVWVWVUVUTUTSTSSTSRSRQPQPONONONML LMMLLMLLMLLKLKLKKJKJIJJIJJIIHIHGHGFEFFEDEDEDCDCBABA@AA@@?@?>?>??>=>>=<=<;<;:;:989878767767656565454454434323212121010/0/0/././/.-.-.-.-,-,-,-,+,+,+*+*++*)*)*)**)*)()())(()(()('('('('('(DCDDCDCDEFEFGFGHIJIJKJKLMLMNMNNMMNONOPOOPOPQPPQQPQPQRQRSRRSRSSRSTSTSTUTUTUUTUVUVUVWVWXWXWXYXYYXYZYZYZZ[Z[Z[ \[\[[\[\\[\]\\]^]]^]^]^_^_^^_^^_^_^_`_`_`_`_``_``a`a``aa`a` a``a`aa`a`a`a``a`a`a`a``a`a``a`_`_`_`_`_`__^__^_^_^]^^]^]^]\]\]]\]\]\[\[\[Z[ZYZYZYXYYXXWXWXWVWVWVUVUVUTUTUTSTTSTSRSRQRRQRRQPQQPOPOOPONONONMNNMMLKLKLLKJKJIHIHGHGHGHGFGFGFEFEDCDCBCBCBABA@AA@@?@@?@?>?>?>=>=<=<;<;<;:;;:9:99:989878876765455445444343232321212101010/0/.//./.-.-,-,--,+,,++,+*++***+*)*)*)*))**)*)()()())()('('('('(CDCCDDCDEDDEDEFEFGHGHIHHIIHIJIJKLKLKKLMNMNOPOPPQPQPQRQRSRSRSTSTUTUVUVUVUVWVWXWXYXYZYZYZZ[Z[\[\\[\]\]\]^]^]^^]^_^_^_`_`_`_`_`_`_`_`a`a`a`a`a`a`a`_`_`__`_``_`_``_`__^_^_^_^_^^]^]^]]^]^]^]\]]\\]\[\[Z[[Z[Z[ZYZYZYXYXWXWXWXXWVWVUVUTUUTTUUTUTSRQRQPOPONONOONMLMLKLKJKKJIJJIIJIHIHGHGFGFEFFEFFEDEDEDCDCBCBABABBA@A@@?@@?@?@?>??>>?>=>>=>=<=<;<;;<;<;:;;:9:9899889987876767676565654544344323232332122121101010/0/0/./.-..-.-,--,-,-,+,+,+*+**+*)*)*)*)()(()('('('('('('('('('('(CDCDEFEEFFEFGFGHGHIHIJIJKJJKJJKJKLKKLMLMNMNMNONOPOOPQPQPQRQRSRSSTSTSTUTUUTUVUUVUVWVWXWXYXYYXYZYZYZYZ[Z[Z[\[\[\[\]\\]\]^]^]^]^_^_^_^_^_^^_^_`_`_`_`_`_`` _``_`__``_`_`a``a`a`_`_`_`_`_`__`_`_^_^__^_^_^]^]\]]\]\[\[\[\[Z[ZYZYXYX WXXWXWXWWVWVUVUVUTUUTUTSTSRSSRRSRQPQPONONONMNNMNMMLKLKJKKJKJKJIJJIHGHGHGFGFEFFEFEDEDEEDEDCDCBCBCBABA@@?@@??@?>?>=>=>=<=<;<;<;:;:;::9:98987878765656556545443432321212101101010/0/00//0/././/./.-.-..--.-.-,-,--,+,+,+*+**+*)*)*)*)()()())(()('('('('('(('(''('('CDCDEDDEFGHGHI HIHIHIIJJIJIIJKJKLKLMLLMLMNMNONOPOPPOPQPQPQQPPQRQRQQRSRSTSTUTUTUTUVUUVVUVWVWXWXWXYXXYXYZZ[Z[\[\[\ ]\\]\]]\]\]]\]^]^_^_^_^__^_`_`_`_``_`_`_`_`_`_``_` _``_``__``_`_^_^_^_^_^]^]^]\]\]\[\\[\[\[Z[Z[ZYZZYYZYXYXYXYXYXWXWXWVUVVUUVUTUTUTUTSRQRQRQPOPOPONONONMNMLLKLKJKJIJJIHIHGHGFEDEDEDCBA BAA@A@A@@A@A@@?@?@?>=>=<=<;<;:;:9:98987878767656566545454434323232122121010010010/0/0/./.././.-.-.-,-,+,+,+*+**+*)*)*)()()('('('(('('('('('('('(CDCDCDEDEDEFEFFGFFGFGHGHIHIHIJKLKLMLMNONONOPOPQRSRSRSTSTTSTUTTUTUVUVVUUVWVWXWXYXXYYXYZZ[Z[Z[\[\]\]\]\]^]^^]]^]^_^_^_^_^__^^_`_`_`_``__`_`_`_`__`_`_`_`_`_`__`_`_`_^_^_^__^]^]]^]^]\]\\]\]\\]\[\[Z[[Z[Z[ZYZZYZYXYXYXWXWXWXWVWVWWVVWVUVUUVUTUTUTSTSSTSRSRSRQRQPQPOPOPONONMNMLKJKJI JIIJIIHIIHIHIIHGHGHGFGFEDEEDEDCDCBCBA@A@@?@?@?>??>?>=<=<<=<;<;:;:9:99::98987676676565654544434323321221221010110/0/.//./.-.-,-,-,+,+,+,+,+*+*+**++*)*)*)()()()())()('('('('('('('('('('CDCDEDEDEFEFEFGHGHGHIHIJIJKLKLKKLMNMNONOONOOPOPQRSRSRSTSTTSTUTUTUTUVUUVWVWVWVWXWXWXWXWXYXYXYZYYZZYZ[Z[\[[\\[\[\ ]\\]]\\]]\]\]^]^]^^]]^^]^_^_^_^_^__`_``__`_``__``_``_`__`_`_`__`_`_`_`_` _``_`_``_``_`_`_`_`_^_^_^_^_^_^]^]^]^]\]\]\]\]\[\[\\[\[Z[[ZZ[[ZYZYZYXYXYXWXWWWXWVWVUVUVUVUTUTUTSTSRSRSRQRQRQPQPQPOPOPONONMNNMLLMLKJKJKJIHIIHGHGFGGFEDED CDCDCCDDCCBCBABA@@?@?>?>=>=<;<<;<;:;;:9::99:9:98987878787676565454432321210/./.-.-.-,+,+,+*+*+*)**))*) ())())()()('('('('('('('('('(CDCCDCCDEDEFGFGHGHHGHIHIHIJIJIJKJKJJKKJKLKLKKLMLMMLLMNONOONO OPOPOOPOPPQPQRQRSRSRSRSTSTUVUUVUVUVWVWVWVWXWWXYXYXYZYZYYZYZ [Z[ZZ[Z[[Z[Z[Z[\[\[\[\]\]^]^]^]^]^_^_^__^^__`_`_`_`_`_`_`_`_`_`_`_` _``_``_`__`_`_``_``_`_`_`_`_`_`_^_^_^_^__^__^_^_^]^^]^]^]\]]\]]\]\]\]\\]\]\[\[\[\\[Z[Z[ZYZYXYXXYXWXWWVWVWVUVUUVUUVUTSTSRSRQRQRQPQPQPOPONONOONONMNMLMMLLMLKJKJJKJIJIHIHGHGFGFGFGFEFEEDEDCDCBABAA@A@A@@?>?> =>=>>=>=><=<;:;:9::98998787676766565656545433433434323232122101010/0//0/./.-.-,-,-,+,+*++*+*+*+*+*)*)()())('(('('('('('('('(('(CDCDEFEFGHGHIHIJIJKJKLKLMLLMLMNMNMNONONOOOPOOPQRQRSRRSSRSRSTSTUTUTTUTUVUVWVWVWXYZYYZZYYZZYZ[ZZ[Z[\[\[[\[\]\]\]\]^]]^]^]^]^_^_^_^__`_`_`_`_ `__`_`_``_`_`_`_`_`_`__`_`_^_^_^__^^_^_^]^]^]\]\]\]\[\[\[Z[Z[[ZYZZYZYXYXYXYXYXWXWWXWVWVVWVUVUVUTUTSTSSRRSRSRSRQRQRQRQRQPQPOPOOPONONONMNMNMLMLKLKJKJJKJIJIJIIJIHIHHGHGFGGFEFEEFFEEFEDEEDCDCBCBBCBABA@A@?@@?@??@?>?>=>>=<=<;<;:;;:;:;:9:9:989878878765656544343232121010/00/.-.-.-,-,-,+,+,+,,+*+*+*+*)*))**)()()()('('('('(('(('('(('(('('('('(('(CDCCDCDCDEDEFEFGFGHGHIHIHIJIJKJKJKLKLMLMNMNONOOPOOPOOPQPQPQRQRQRQRSTSTSTUTUVUVUVUVWVWVWXWXWXYXYXYXYZYZYZ[Z[Z[\[\]\]\]\]^]^^]^]]^]^_^_^^_^_^_^_^^__`_`_`_`_`_``__`_`_`_`__`_`_``_`_`_^_^_^_^_^_^^_^]^]^^]^^]^]]^]^]\]\]]\]\]\[\[ Z[Z[Z[[ZZ[ZYZYXYXXYXWXWXWWVWVWVUVUTSTSTSSTSRSRQRQRQPQQPQPOPOPPONONOONONMNMLMLLKJKJIJIJIHIHGHGHGFFGFGFEFEFEDEDDCDCBCBABA@AA@@AA@?@?>?>=>=>=<=<=<;<;<;:;;:;:9:98989878767767656545443434323232121010/0/./.-.--,-,--,+,+,+,+,+*+*)*)**)()()(()()(()('('('('('('(CDCCDEDEFEEFGFGHGGHGGHIHIHIJKJKLKLKLMLMNMNMNNMNONONONOOPQPQPQRQRQRSRSTSST UTUTUTUUVUVUVUVUVWVWVWXWXWXYXYXYYZYZYZ[Z[Z[\[\]\]\]\]^]^]]^]^]^^]^_^_^_^__^_`_`__`_`_`_`_`_`_`_ `__`__`__`__`_`_^_^_^_^_^_^^]^]^]^]\]\]]\[\[\[\[[\[Z[ZYZYZYZZYXYYXWXWXWXWXWWVWVWVUVUVUVUTUTSTSRQRQPQPQQPQPOPONOONMNMLMMLMLMLKLKKJKJKJIJIJIHIHIHGHGFGFEFEDEDCDCBABAABA@A@@A@??>?>=>=< =<=<<;<;;<;:;:9:99:989878877876767656565454543443232121210110/0/././..-.-..-,-,-,-,-,+,+*+*)*)*)()()('('(('('('('(('('('('('(BCDCDEDEFEFGHGHIJIJKJJKLMLMNMMNOOPOOPOPOPQPQRSTSTSTUTUVUVUVWVWVWVWXWXYXYXYYZYZ[Z[[Z[\[\[\[\[\]\]\]^]^]^^]^_^^__^_^__^_`_`_`_`_`_`_`_^_^_^_^_^^]^ ]^]]^^]^]]^]]^]\]]\]\]\]]\[\\[\[\[\[\[Z[Z[Z[ZYZYXYXYYXWXXWXWXWWVUVUUVUTUUTUTSTSRSRQRQQRQPQPQPOPOPNONONMNMLMLMLLKLKLKJKJIJIJJIJIHIHHIHGHGHGFGGFEFEDEDCDCBCBABA@AA@A@?@@?@?>??>=>=>>=<=<;<<;:9:9898767656565565454544323212101011010/0/0/00/././.-.-,--,-,+,+*+**+*)*)*)()()('('('('('('('('('('('(BCDCDEDE FEFEEFEFFGFGFGHGGHIHIJIIJIJKJKLKLMLMLMNMMNMMNONNOOPQRQRSRSRSRSTSTSTUTUTUTUVUVVUVWVWWVWXWXYXXYXXYXYYZYZYZ[Z[Z[[Z[\[\[\\[[\]\]\]^]^]^]^_^_^_^^__^^_ ^_^^__^__^^__^_`_`__`_`_`_`_`_^_^_^_^^_^_^_^_^^]^]^]^]^^]]^^]]^]]^]\]\[\[\[[\\[Z[Z[[ZZ[ZYZYZYXYXWXXWWVWVUVUTUTSTSTSRSSRSRSRQRQPQPONOONONMNMLMLLKLKJKJI JIJJIIHIIHIHGHGFEFFEDEDEDCDCBABA@@?>?>??>=<=<;<;:;:;:9:99:9898787676765656654545454343432323212112101010/././.-..--.--.-,-,-, +,+,,+,,++,+*+**+*+*)*)*)*)()('('('('('('('(('('(CBCDCDCCDEDEFEFFEFGFGFGFGGHGHHGHGH IHIHIHIIJIJJIJKJKJKL KLKLLKLMLLMLMNMNMMNONOONNOPOPOPQPPQPQRQRQRQRSRSTSTUTUVUVUVWVWVWXWWXWXYXXYXYZYYZYZ[Z[Z[Z[\[[\[\[\\[[\[[\ ]\\]\\]\]\]\]\]^]^]]^]^_^_^^_^^_^__^^_^_^_^^_^_^_^_^__^__^_^_^_^__^_^_^_^_^]^]^]^]\]\]\]\[\\[\[\[\[Z[Z[ZYZYZYZYYZYXYXWXWXWWVUTUTSTSTSRSSRQRQPQPOPOPONONMNMLMLLK LKLKKJKJKKJJKJIHIHGHGHGFEFEFEDCDCBCBCBABBABAA@AA@@?@?>?>?>=>=<=<;<;<;:;;:9:98989878878767667654334323232321212101010/0/0/.-.-,-,+*++***+*)*)*)('('('('('('('(CDCDDCDCDEDEFEFEEFGFFGHIHIHIJIJKJKLKLMLMMLMLM NMMNNMMNNONONOPOPQPQRQQRSRSTSTUTTUVUVWVWXWXWXYXYZYZYZ[Z[\[[\\[\[\[\]\]\]\]\]^]^]^^]^]^]^]^]^_^_^^__^^__^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^]^]]^^]^^]^]^] \]\\]\]\]]\\]\]\[\[Z[Z[ZZ[ZYZYXYXWXWWVWVWWVUVUTUTUTSTSRQRQQRQPQQPOPONONOONONMNMNMLMLLKJKJIJIJJIHIHGHHGFGFEFEFFEDEDEDCDCBCBABABBA@A@?@@?@?@?>?>=>=<=<;<;<;:;;:9:98989987876767767656565 65544554554434323323212121010/0/0/./.-.-.-.-,+,+,+*+*+**)*)*)()('('('('('('(('(CBCBCDCCDEDEEDEFEFGFGFFGHGHIHIHIJIIJIJKJKLKLKLMNMNMNNONOONOPOPOPQPPQQRQRQRQRSRSTSSTSTUTUVUVWVWVWVWXWXWXWXYXYYXYXXYZYZ[Z[Z[Z[[Z[ \[[\\[\[\\[\]\]^]^]^]^_^_^^_^^_^_^_^_^__^_^_^__^_^^_^_^_^__^^_^_^_^_^^_^_^_^_^_^_^]^^]^]^]^]\]\]\[\[\[Z[Z[ZYZZYXYXXYXYXYXWXWXWWVVWWVUVUVUTUTSTTSTTSRSRSRRSRQRQPQPQQPOPOPONONONMNMNMLMLMMLLKJKKJKJIJ IJJIHIIHIIHGHGHGFGFEFEEFEDEDEDCDCBCBCBABA@?@?>?>=>=>=<=<;<;:;::9:98987876767656656556545443232332122121 010010100/0/0/././.-..-.-..-,-,-,+,+,+ *+**+*++*+*+*+*)*)()()()('('('('('('('('('('('(BCBCDCCDCCDEDEDEDEFGFGFGHGHIHIJIJKJKJJKLKLKKLMLMMLMNMNMNMNONNONOPOPQRQRQRSRSTUTUTTUTTUVUVUUVWVWVVWXWWXXWXYXYXYYXYZYZYZ[Z[Z[\[\[\]\] \]\\]]\]\]]\\]^]^]^]^_^ _^__^_^_^_^_^__^^_^__^_ ^_^^_^_^__^^_^_^_^_^ _^__^^_^__^^_^_^_^_^]^]^]^]^^]^]^]\]\]]\[\[\[\[Z[ZYZYXYXWXXWWXWVWWVWVWVUVUVUTUTTUTTUTSTSTTSTSRSRSRSRRQRQPQPOPOPPOOPONONONMLMMLKLKKLKJKJKJJKJIJJIHIHGFEDEDEDCBA BAA@A@A@@A@A@?@?@?>=>=<;<;:;:9:9898787676765665654544543443334323232121122101010/0/./.-.--..-,-,+,+,+,+**)*)*)*)()()('('('('('('(('('BCBCBCDCDEDEDEFEFEFGFGFGHGHIHIHIJIIJKJKLKLMLMNONOPOOPOPQPQPQQPQRSTUTUUTUVUVUVWVWWVWWXWXWXWXWXYXYXYXYZYZYZ[Z[Z[ZZ[\[[\[\[\]\\]\]\]\]\]^]^]^]^^]^_^^_^_^_^^_^^_^_^_^_^_^__^_^__^_^_^_^_^_^_^_^_^^_^_^]^]^]^^]]\]\\]\]\ [\[[\[\[[\[\[Z[ZYZYZYXYXWVVUVUUVUTUTSTTSSTSRSRQPQPQPOPOPONONMNMNMMLMMLLMLKLLKJKJIJIHIHHIHGHGHGFGFEDEDDEDCDCDDCBCBA@A@@??@?@?>??>?>=<=<<==<;<;;:;:;:9:99::9898767667676565454543434323212121010/00/0/.//./.-,-,+,+,+*+*++***)**)*)()()(()('(('('('('('('('('('CBCDCDCDDEDDEFEFGFGHGHGHIHIHIJIIJKJKLKLMLMNOONOPOPQRQRQRSRSRSRSTSTSTUTUTTU TUTUUVUUVUVUUVUVVWVVWVWXWWXWXWXYXYXYZYZYYZ[Z[\[\[\]\]\]]\]^]^]^]^]^^_^^__^_^^_^^_^__^_^_^_^_^_^^_^_^_^__^^_^_^_^]^]^]^]^]^]^]^]^]\]\]\]\[\[\[\\[\\[Z[ZZ[Z YZYYZYZYYZYXWXXWVWVWWVWVUVUVUTUTSTTSTTSTSRSRRSRQRQRQPQPQPONONONMNMNMLMLKLKKLKJKJIJIHIIHGHGFGGFED CDCDCCDDCCBCBABA@?@??>?>=>>=<;<;:;;: ;:9::99:9:98787878787676767656545434334323212121121010/0/.//./././.-.-,-,-,-,+,+,++,,+*++***)**))*)()()('(('('('('((''('('(BCBBCDCDCCDCDEEDEEDDEFGFFGFGHGHIHIJKJJKJKJKLMLMNONOPOOPQPQPPQRQRQRSRSTSTUTUVUVUVUVWVWVWXWXYXYXYXYXYZYZYZ[Z[Z[\[\[\]\]]\]\]^]^]^]]^^]]^]^]^^]^^_^_^_^_^_^^_^_^_^_^_^_^_^]^]^]^]^^]^]^]\]\]]\]\]\]\ [\\[\[\[\[[\[\[Z[Z[ZYZYZZYXYXXYXWXWXWVVWVUVUTUTSTSSTSSTSRSSRSRQRQRQRQPQQPONONONMNMNMNMLMLKKJKJJKJIJIHIHGHHGFGFEDEDCDCCBCBABAA@A@A@??>?>=>=>>=>=<;<;:;:9::989987878767676565654543343232332121010010/00/0/00/.//.././.-.-,-,-,-,-,+,+,+*++*+**+*)*)*)())(()()('('('('('('('('('('('(('BCBCBCDCDEDEDEEDEFEFFEFGFFGFGHIHIJIJKJKLKLLKLMLMNNOPQPQRQRRQRSRSTUTUVUVWVWVVWXWXWXWWXWXYXYYXXYXYZYZYYZYZ[[Z [ZZ[Z[Z[[Z[\[\[\]\]\]\]\]\]^]^]^]^]^]^]^_^_^_^_^_^__^_^^__^_^]^]^]^]^]^^]^]^]]\]\]\[\[\[\[Z[[Z[ZYZYXYXYXWXWXWVWWVVUVUVUTUTUUTSTSRSRSRQRQPOPPOPOOPONONONMNMNMLKLKJIJIHGHHGFGGFEFEEFFEDEDDEDCDCDCBCBBCBABA@A@?@@?@??@??>=>=<=<;<;<;:;:;::;:9:9:989878878767676566543433343232121221010/0/0/./.-..--..-,-,--,-,-,+,+,+*+*+**)*)*)()()('('('('('('('('(BCBBCBCCDCDCDEDEFEFEFEFGFGGFGHGGHGHIHIJIJIJKJJKJKLKLKLMLLMLMNMMNMNONOPQPQPQRQQRQRQQRSRSTSTUTUTUVUVVUVWXWXYXXYXXY ZYYZYYZYZYYZ[Z[\[\[\[\[\]\]\\]]\]\]\]^]]^]]^]^]^]^]^]^]^]^_^_^_^_^_^_^]^]^]^^]^]^]^]^]^]\]]]\]\]]\]]\]\\]\]\]\[\[\\[\[\[Z[Z[ZYZZYYZYZYXYXYXWXWXWVWVUVUTUTUUTSTTSSTSRSRQPQPOPOPOOPONONONMNMNMLMLKLKJKJIJIJIHIHIHHGHGHGFGFGFEFEDCDCBCBABA@AA@@AA@?@??>?>=>>=>=<=<=<;<;<<;<;:;;:;:9:98987887677676565654545434332321212101010100/0/0/././. -.-..--.--,-,-,+,,++,,+,+*+**+**+**)*))*)()()(()('('('('(BCBCDEDEFEFEFGFFGHIHIHIJKJKLKLMLMLMLMNNONOPOPQPQPPQRQRSRRSTSTSSTUTUTUVUUVVUVWVWVWXWXWWXWWXWXXXYXXYXXYZYZYZ[Z[Z[\[\[\[\]\]\]\]]\]\]^]^]^]]^]^]^]^]^]^]^_^]^]^]^]]^]^]]^]^]]\]\\]\]\]\[\[\\[\[\[\[Z[Z[Z[Z YZZYYZYZYZYXYXYXWXWVVUVUVUVUTUUTSTSRSRSRQRQRRQPQPQQPOPPOPONONMNMNMLMLLMLKK JKKJJKJKJJIJIHIIHGHGFGFEFFEFFEEFEDEDCDCBCCBABBAABA@A@A@??>??>=>=<=<=<=<<=<;:9:99::9878787676765655654543433433432323212101010/0/./.-.-,-,-,+,+,+,+*+*+*+*+**)**)*))*)()()(()('('(('(''('('('('('((BCBBCDCDEFEEFEFEFGFGFFGHGHGHIHIHHIJIJKLKLKLKLMLMNMMNNMNNONOPQRQRQRSRRSRSTSTSTUTUTU VUUVUVVUVUVWVVWVWXWXWXWXXWXXXYXYXYZYZYZ[Z[Z[\[\[[\[\]\]\]\]]\]]\]^]^]^]^]^]^^]^]^]^]^]^]^]^]^]^]^]^]^^]^]^]\]\]]\]\]\]\]\]\[\[\[Z[[Z[ZYZYZYXYYXYXWXXWXWVWVVUVUVUTUTTUTSTTSRSRSRQRQPQPQPOPPONONMNMLKLKLKKJKJKJIHIHHIHIHGHGHGGFFGFEFEDEDDEDCDDCBCBA@A@A@?@??>?>>?>=>=<==<;<;<;:;;:;:9:98987878765665434332323212112101010/0/./././.-.-.-.-,-,+,+,++,+,+*+*+*+*+***)*)*)()())()()('('('('('(('('('('(BCBCBCDCDEDEFEFEFGFGHGHIHHIJIJIJKLKLMLMNMNNONNOPOPQPQPQPPQRQRSRSRSTUTUVUVUVWVWXWXWWXXYXYXYZYZYZ[Z[Z[Z[\[[\[\[[\[\]\\]\]\]\]\]\]^]]^]^]^^]^]^]^]^^]^^]^]^]^]^]^]^]^]^]^]^]^]^]^]]^]^]^]\]]\]\]]]\]\]\][\[\[\[\[Z[Z[ZYZYZYXYXYXWVWVVUTUTTUTSTSTSRSRSRQRRQRQPQPOPOPONOONOONMNNMNMLMLKLKKJKJIJIHIHGHHGHHGFEFEDEDDEDCDCBCBCBABBA@A@A@@A@??>>?>??>=>=<==<==<;<;:;:9:9:98989878787676566545434343232321211221011010/0//0//0/./.-,-,,-,+,+,+,+,+*++**)*)*)()()()()()('('('('('(ABCBBCBCDCDEDEDEFGFFGHIHHIHIJIJIJKJKJKLKLKKLMLLMNMNNONONOPOPOPQRQQRSRSRSRSTSTUTUTTUVUVUVWVWWVWXWWXXWXXYXYZYZZYZZYZYZ[Z[Z[\ [\[[\[\\[\[\]\]\]]\]\]^]]^]^]^]^]]^]^]^^]^]^]^]^]^]^^]^]^]^ ]^]^]^^]^]]^]^^]^]^]\]\]\]]\]\]\]\]\[\[\[\[\\[\[Z[Z[ZYZYZYYZYXYXYXWXWVWVWVUVUVUTUTUTSTSRSRRSRSRQRQPQPQPOPPOPONONONNMNMNMLKLKLKKJIJIHIHIHIHGHGGHGFGFGGFEFEFEDEEDCBCBABABA@?@?@??>>?>>?>=>=<=<;<;<;;<;:;:9:9::9898987677676565654543433233232121121121010010/0/00/./././.-.-.-.-,-,+,+,+*+*+*++**)*)**)()()()('('('('('('(BCBCBBCDEDEFEFGHGGHIHIJKLKLMLMNMNMNNONONOPPOPOPQPPQRQRQRSRSTUVUUVUVWVWXWWXYXYXYXXYXYZYYZYZZYZYZZYZ[Z[Z[Z[\[\[\[\]\\]\]\]\]^]^]^]^]^]^]^^]^]^]]^^]^]^]]^]^]^]^]^]^]^]^]^]^]^]^]\]\]\]\]\]\[\[\[Z[Z[[ZZ[Z[ZYZYXYYXYXWXWXWVWVWVUVUUVUTUTSTTSSTSRSRQRQRQPQPPQPOPONONONMNMNMMNMLMLKLKKLKKKJIHIHIHGHGFGGFGGFEFEDEDDEDCDDCBCBCBABABA@A@?@?@?>?>??>=>>=<=<=<;<<;:;:9:9:9:9898787676565454343344332323212121010/00/0/./.-.-..-,--,,-,+,,+,+ *+*++*++*+**)*)*))*)()(()()('('('ABCBCDCDCDEDEDEFEFGHGHIHHIJIJIJKJKJKLKLKKLKLMLMLMNNONOPOOPPOPPOPQ RQQRQRRQRQSRSRSRSTSTUTUTUTUTUVUVUVUVWVWVWXXWXYX YXYYXYXYYXYZYZYYZYZ[Z[Z[\[[\[\[\]\]\\]\]\]\\]\]]\\]\]]^]^]]^]^]]^^]^]^]^]^]^]^]^]^]]^]^]^]^]^]\]\]\]\]\ [\\[\\[\\[[\\[Z[Z[ZYZYYZYXWXWWXWWXWVUVVUVUTUUTTUUTUTSTSTSRSRSRQRQRQPQPQQPOPPONOONONMLMMLKLKKJKJKJIHIHGHGFGGFEFEFEDEDCDCBCBABABA@AA@A@?@?>?>=>=>>=<==<<=<;<<;<;<;:;;:9::9::9:98998987 67667766565656545434343323212101010/0/.//./.-..-.-.-,-,+,,+,+,+*+*++*+*+**)**))**)()('('('('('('('('('(ABCBCCBCDCDEDEDEFGFGHGHGHIHIHIJKLKLMNMNMNMMNMNONNONOPOPPOPOPQPQPQPQRQRSRSSRSTSTSTUTUTUUVUVUVWVWVVWWVWXWXWXWXYXXYYXYXYZYYZYYZ[Z[[ZZ[ \[\[[\[[\\[\[\]\]]\]\]\]]\]\]\]\]]^]^]^]^]^]]^]^]^]^]^]^]^]^]^]^]^]^]^]^]^]\]\]\\]\]\]\]\\[ \[\[\[[\[\[[\[\[Z[Z[ZYZYZZYXYXYXWXWXWVWVUVVUUVUVUTUTTUTSTSRSRSRQRQPQQPQPOPOPONONMNMNMNMLMMLMMLKLKKJKKJIHIHGHGFGFEFFEFEDCDDCCDCBCBBAABA@A@A@A@?@@??@?>?>?>=>=<;<;;<<;:9::9:989878767654554343434343323232121221 01011001010/00/0/././/.././.-.-..-,-,+,+,+*+*+*+**)*)*)()()()(()('('('('(('(''('('('('(BCBCDEDDEDDEFEFGHIHIJIJKJKJKJKLKLLKLMLMLLMLMNMMNONONOPOPOPOOPOPQPPQRQRRQRSRSSRSTSTUTUVUVWVWVWXXWXWXWXYXYZYZYZYYZYZ[Z[Z[Z[ZZ[\[[\[\[\]\] \]\]]\\]\\]\]\]]^]^]^]^]^]^]^]^]^]^]\]]\]\]\]\]\]\\\[\[\\[[\\[\[Z[[Z[Z[ZYZYZYXYXYXWXXWXWVWVUVUTUTUTSTSTTSRSRQRQRQPQPPQPOPOPONONONMNMLMLKLKJKJKJIJIIJIHGHHGGHHGFGFGGFEFEFEDCBCBABBA@A@A@? >?>>?>>=>>=>=<=<=<;<;<<;:98998987878876565454343434323212112112101010/0//0/0/././.-,-,-,+,+,+*+*+*)*)*)*)*)()(())('('('('('('('(ABABCDCCDEDEDDEFGFFGHIHIHIJIJIJKLKLLKLMLMLMMLMNMNMNONONNONOOPPOOPOOPOPQPPQRQRQRSRSTSSTSTUTUTUTUVUVWVVWVWWXWXYXYXYZYZYZ[Z[Z[[Z[\[\\[\[\[\[\]\]]\]\]\]\]\]\]]\]\]\]^]^]^]]^]^]^]\]\]\\]\]\\]\]\]\[\[\[\[\[\[\[Z[ZZ[Z[ZYZYZYXYXYXYXWXWVWVWWVUVVUUVUUVUVUTUTSTTSSTSRSRRSRSRQRRQRQPONONMNMLMMLKLKLKJKJJKJIJJIHIHGHGHHGFGFEFEDEDCDCBABA@A@?@?>??>=>=<;<<;;<;:;:989876767656545544543323323321221010/00/0/././.-.-.-,-,-,-,+,+*+*+*+**)*))*))*)()())()('('('('('('('('('(ABCBCDCCDCDEDEFEFGFGHIHHIJIIJIJJIJKJKLKLMLMLMNMNOPQPQQPQRQRSRSTUTUVUVWVWWVWWXWXWXYXYXYXYXXYZYZZYYZYZYZ[Z[Z[Z[\[\\[[\[\[\]\\]\]\]\]]\]]\]\]\]]\]\]^]^]\]\]\]]\]]\\]]\\]\]\]\]]\]\]\]\[[\[\[\[\[\[Z[[ZZ[Z[ZZ[ZYZYZYYZZYZYXYXYXWXXWXWVWWV WVVUUVVUUVUUVVUTUTTUTUTSTSSTSRQRQPQPOPOPONOONONMNMLMLKLKJKJKJKJIJIHGHHGFGFGFGFEFEFEDEDCDCBCBA@A@A@A@?>?>=>=>=<=<;<;<;:9::9:989989878778767676565454343323210/0/././.-,-,-,+,+,+*++*)*)*)()()('('('('('('('('('(BABCBCDCDCDEDEFEFGFGHGHIHIHIJIIJJIIJKJKJKLMLMLMNMNONOOPOPOPOPQPQRQRQQRQRSRSTSTTSTTSTUTUUTUVUUVUVUUVWVVWVWVWWWXWXYXYXYZYZYZYZ[ZZ[ZZ[[Z[\[\[\\[\[\[\\[\\[[\]\]\\]\]\]]\]\]\]\]\]\]\]\]\]\]\]\[\[\[\\[Z[Z[Z[ZYZYZYXYXYYXYXWXWXWXWWXWVWVUUTUTUUTSTSRSRSRQRQQRQPQPOPONONONMNMLMLKLKJKJJIJIJIHIHIIHGHGFGFEFEDEDCDCDCDCCBCBA@A@A@?@?>??>=>=<==<=<;:9:99:989878767676565654543433212121010010/0/./.-.-.-,+,,++,,+,+*+*+**)()()()('('('('('('(('('('(BABABCBBCBCDCCDCDEFEFFEEFGFGHIHIHIJIJIJKJKKJKLKLKLMLMNMNMNONONOPOPQRQRSTSTSTUTTUUTUTUVUVWVWWXWXWXWXYXYXXYYXYZYZYZYZZYZ[ZZ[[Z[Z[Z[\[\[\[[\[\]\]\\]\]\]\]\]\]\]\]\]\]\]\] \]]\]\]]\\]]\]\]\]\]\]]\]\[\[[\[\[\[\[Z[Z[[Z[[ZYZYYZYXYXYXWXWXWVWVUVUVUUTUUTTUUTSTSSTSSTSRSRQRRQ RQQRQQPPQPQPOPONONMNMNMLMMLKJKKKJJKJIJIHIHIIHIHGHGFGGFEFEFEDEDCBABA@A@A@@?@@?>?>?>=>=>=<=<==<;<;:;:9898767676566565654343232121011010/././.-.-.-,-,+,+,+*+**)**))**)()())()('('(('(('('(('(('('('('(('('(ABABCBCBCDEDDEFEEFFEFGFGHGHGHIHIJIJIJKJKLKKLLKLMLMLLMNMNMNONNOPOPPOPQPQPPQRSRSTSTTSTUTUTUV WVVWVVWVVWWWXWXYXYXYYXYXYYZZYZYZYZYZ[Z[ZZ[Z[Z[\[[\[\[\[\[\[\\[\]\\]\]\]\]\\]\]\]\]\]\]\\]\]\]\]\\]\]\]\\]\]\]\[\[\[\[\[Z[Z[[Z[Z[Z[ZYZYZYZYXYXYXYYXWXWXWXWXWVWV UVUVUUVUUTUUTUTUTSTSRSRSRSRQRQPQPQQPONONMNMNMLMLKLKJKKJJJIJIJIHIHIHHGHGHGFGGFGGFEFFEFFEDEDEDCDCBCCBABABA@A@A@?>??>>=>=<=<=<=<<=<;:9:99::98987876767656565454343321212112101010/0/0/.-.-..-,-,-,+,+*+**+**)*)*)()()('('('('('('('(ABABCBCBCDEDEFEFFGFFGHGHIHIHIJIJIJIJKJJKJKLKLKKLMLMMNONONOONOOPOOPOPQPQPQRSTSTUTTUVUVVUVUVWVWVWVWWXWWXWXYXYXYXYZYZYZYZ[Z[Z[\[\[\[\\]\]\\]\]\]]\]\]\]\]]\]\]]\]]\]\]]\]\]\]\]\]\]\]\[\[\\[\[\[[\[\[\[Z[Z[ZYZZYZYZYZYXYXYXWXWXWVWVWVUVUVUUTUTSTTSRSRQRQPQQPPQPOPOPOONMLMMLKLKLKJKJJIJJIHIHHGHHGFGFEDEDCDCBA@A@A@@A@?@?>?>>?>>=>=<==<;<;<;:;;:;::;:9:989878765665434344323232321221010/0/0/0//././/.-.-..-.-,-,+,+*+*+**)*)()()()(()('('('(('('('('('('('(ABBABABCDCDEDDEDEFEFGFFGGFGHIHIHIJIJJIJKJKLKLKLMLMMNMNMNNONOONOPO POPOPOPQPPQPPQRSRSRSTSTSTSTSSTUVUVWVWVWVWVWXWXYXYZYZYZ[Z[Z[Z[\[[\[\[\[\[\[\\]\]\]\]\]\\]]\\]\]\]\]\]\]\]\]\]\\]]\\]\]\]\\]\]\] \]\]\\]\\]]\]\[\[\[\[\[\[[Z[Z[Z[Z[Z[ZYZYZYXYXYXWVWWVWVUVUTUTTSTSTTSRSRQRQRQPQPOPONONONMNMNNMLMLKLKLKJKJKJIJIHIHIHIIHGHHGHHGFGGFEFEDEDCDCBCBCBCBABA@A@A@@A@?>?>??>=>=<==<==<;<;:;:9:9:98989878787876776566545434334343223212122121010110/0/0/./.-..-.-,-, +,,++,,+,+,+*+*)*)*)*)()()('('('('('('('('('('(ABABCBCDCDCDCDEDEEDEFEFEFGFGHGHGGHIHIHIJIJKJKLKLKLKKLMLMNMNONONOPOPQRQRQRQRRSRSRSTSTSTUTUTUVUUVUUVUVWVWVWWVWXWXWXYXYXYXY ZYZYYZZYZYZ[Z[[ZZ[Z[\[\[\[[\[\\]\]]\]\]\]\]\]\]\]\]\]\]\\]\]\[\[ \[\[\[\[\\[\[[[Z[Z[Z[Z[Z[ZYZYZYXYXYXXYXWXWXWVWVUVUTUTUTSTSTSRSRQRRQQRQPQQPOPOPONONONMNMNMMLMMLMMLKLKJKJJIJIHIIHGHGGHGFGFEFEFEDEEDCDCBCBCBABABA@?@?@?>?>>?>=>=<=<;<;<<;<;:;::;:9:9::9898989987876767656565454343433232332121210/0/0/././../.-.-.-.--,-,-,,-,--,,-,+,+,+*++*+**)*)()(()()('('('('('(('('('(ABABABCBCBCD EDEDEDEEFFEEFEFEFFGFGHGHIHIJIJIJIJKJJKKJKLMLMLMMNMNMNONOPOOPQPQQPQRQQRSRSRSRSTSTSTSTSTUTTUTUTUVUVUVUVWVWVWXWXXWXWXYXYZYZ[Z[Z[ZZ[Z[Z[Z[\[[\[[\\[\[\[\[\\[\]\]\]\]\]\\]\\]\]\]\]\\]]\]\]\[\[\[\[\[[Z[Z[ZYZYZZYZZYZYXYX WXXWXWWXXWWXXWVWVWVUVUVUTUTTUTSTSRSRSRQRQPQPOPOPONOONONONMNMLKLKJKJJIJIHIHGHGHGFGGFGFEDCDDCBCBABABA@A@?@?@?>?>??>>>=>>=<=<;<<;:;:;:9:9:9:9898787876765654545434334432322321212101010/./.-.-,-,+,+,,+,+*+**)*)*)())()()('('('('('('('(ABABABCBCDEDEEDEFEEFEFGFGHGHIHHIJIJKJKKJKLKLMLLMLMNMNNMNONONOPOOPOPQPQRQQRSRSTSTSTUVUUVUVUUVUVWVWVWVWXWXWXWWXYXYXYXYZYZYZYZYZ [ZZ[[ZZ[ZZ[Z[\[[\[[\[\[\[\[\\[\[\[\[\\[\]\]\\]\]\[\[\[\[\[\[Z[ Z[ZZ[[Z[[ZZ[[ZYZYZYXYXYXYXYXWXWWXWWXWVWVVWWVWVUVUTUTTSTSRSSRQPQPQPQQPOPOOPPONONNONMNMLMMLMLLMLKLKLKJKJJJIHIHHIHGHGHGFGFEFEFEDEDCDCBCBCBABA@AA@A@?@?>?>>=>=>>=<==<<=<;<<;<;<;:;;:;::9:9:9898787676677665665565654545454434343323212101010/0/./././.-.-,-,-,+,+,+*+*+*+*)**)*)()()()(())('('('('('('(('('('('('(ABAB ABBCCBCCBCBCDCDEDEFEFGFGHGHGHGHIHIHIJIJIJKJJKJJKKJKLKLKLMMNMNMNONOPOPQPQPQRQRSRSRSTSTUTTUTUVUVWVWVVWXWXWWXWWXYXYXYXYZYZYZYZYZ[ZZ[ZZ[[Z[Z[[ZZ[\[\[\[\[\[\[\[\[\]\[\[\[\[\[[\[\[Z [Z[Z[ZZ[Z[ZZ[Z[ZYZYZYXYXYXWXWXXWXXWXWVWWVVWVWVUVUUVVUVUTUUTTUUTUTSTTSTSRSSRSRQRQPQPQPOPPOPONMNMLMLMLKLKJJIJIHGHG FGFFEFFEFFEDEDDEDCDCDDCBABA@A@A@A@?@?@?>?>>=>=<;<;<;:9::9:9898787656545545432212112121010/0/0/.//././/.-.-.,-,-,+,++,+,+*+**)**)*)*)()())())()('('('('('('('('('('(ABABCBCDCDCDDEDEDEFEFGFGHGHIHIJIIJKJKLKLKLMLMLMNMNONOPOOPOOPQPQPQRQRRQRSRRSTST UTTUTTUTUTUVUVUVWVWVWVWXWXWXYXYXYXYZYZYZYYZ[Z[ZZ[[Z[\[\[[\[\[\[\[\[\\[\[\\[\[\[\[[\[[\[\[\[\[\[\[Z[Z[Z[Z[ZYZZYZYZYXYXYXWXWVWVWVUVUVUUVUTUTTTSTSTSRSSRSRSRQRQPQPPQQPOPPONMNMLMLLMLMLKLKLLKLKJKJKKJIJIJIJIIJIHIIHGHGHGFGFGFEFEDEEDCBABA@A@?>?>>?>>=>>=>=<=<=<;<;<<;:9899898898787887787676565454343232232122121010/0/./../.-.-,-,-,+*+**+*)*))*)()()()('('('('('(('('('((''A@ABABABCBCBCDEDEFEFGHIHIIHIJIJKJKLKLKLMLMLMNMNNMNONNOPOOPQRQQRQRSRSSRSTSSTSSTSTUTUTTUVUVUVVWVWVVWVWVWXWXWWXWXYXYXYXYZYZYZYZ[Z[[Z[Z[\[[\[[\[\\[\[\[\[\[[\[[\[\[[\[\\[\[\[\[\[\[\\[\[\[\[\[\\[[\[[\[\[\\[\[Z[Z[Z[Z[ZZ[ZZ[[Z[Z[ZYZYZYYZYZYXYXWXWXWXWVWVWVUVUUVVUUVUTUTUTUTTSTSTSRSRSRSRSRQRRQRQPQPQPQPONONONMLMLMLMLKLKLKLK JKKJJKJJKJJIIJIHGHHGGHGFGGFEFEFEFEDEDCDCCDCBCBABA@A@?@?>??>==>>=<;<<;;<;:9:989876767654543232232121011010110/00/0/./.-,-,-,+,+,,+*+*+**)**)**)*)()()())('(('('('('('('('('('('('('((ABABCDCDEDDEEDEFEFFEFGFFGGFGHGHIJIJKJJKJKJKKLKLMLLMLLMNMNMNONONOPOOPOPQPQPQRQRQRSRSRSRSTSTSSTUTUTUTUVUVUVVWVWWVVWXWXWXYXYYXYXY ZYZZYZYYZYZZYYZ[ZZ[ZZ[Z[Z[Z[Z[[Z[\[\[[\[\[[\\[\[\[\[[\[\[[\[\[\[\[\[\[\\[\[\[\[\\[\\[\[\[\[\[Z[Z[Z[Z[Z[ZYZZYYZYZYYZYYZYXYXYXXYYXYXWXWXWWXW VWVWVVWVVWVUVVUVUVUTUTTSTSTSRSRSRRSSRRQRQRQQRQPQPQPOPONONOONMNMMLMLKLKLKLKLKJIJJIJIJIHIHGHGFGFGFGFEFEFEDEDEDCDCBCBABBA@A@A@?>?>=>=>=<=<;<;<;:9::9:9899898787676565454343432323332232121010/00/0/0/./.-.-.-.-,-,-,+,+,+,+*++**+*)**)**)*)()()()()('('('((''('('('(ABABCBCBCCDCDDCDEDEEDEFEFFEFGFGFFGFGHIHIHIJKJJKJKJKLKLKLKLLMLLMLMLMNMNMNMNOPOPOPQRQRSRSRSTSTSTUTUVUVVWVVWVWXWXWXYXYXYXYZYZYZYZYZ[Z[Z[Z[Z[Z[Z[\[\[\[\[\[\[\[\[\[\[\[\[\[\[\[\[\[\[\[Z[Z[Z[ZZZ[[ZYZYZYZYZYZYXYXYXWXWVWVWVWWVWWVUVUVUVUTTUTUTUTTSTSSTSRSRSRQRRQPQQPONONOONONMNMLKLKJKJKJIJIJIJIHIIHIHIHGHHGFGFGFGFEFFEDEEDEDCDCBCBA@A@A@?@@??@??>?>==>>=<==<=<;:9::989876765656545434323212112101101010/00//0/0/./.-.-.-.-.-,-,-,+,+*+*+*)*))*)*)()('('('('('('('('('(('('(ABAABAABCBCDCDEDEEDEFEFEFGFGFGGHHGHIHIIHIJIJKJKJKLKLKLLMLMNMNOPOPOPOOPQPPQQPQPQPPQRQRQRQRQRSRSRSTSTUTUTUTTUVUVUVUVUVWVWVWXWXWXYXYXXYXXY ZYYZYZZYZYZYZYZ[Z[Z[Z[[ZZ[[Z[[\[\[\[\[\\[\\[\ [\[\[[\\[[\\[\[\[\[\[\[\[\[\[\\[[\\[\[\[\[Z[Z[Z[Z[Z[Z[ZYZYZYZZYZZYXYXXYXYXWXWVWVWVWVUVVUVUTUTUUTUTTSTSTSRSSRQRQQRRQPQPQPPQPOPPOPOPONONMNMLMLLMLKLKJIHIHHIHGHGFGGFEFEFEFEDEDCBCCBABAA@A@A@?@@?>?>?>>=>=<=<==<;<;:;:9:9878767656656565454323233212101010/././.-.-..-.-,-,--,+,+,+*+**+*)*)()())()('('('('('('('('(ABABBABABCBCBCDCDEFEFEFGHGHIHIIHIJIJKLKLKLLMLMNMMNMNONONOPOPOPQPPQRQRSRSTSSTTSSTUTUTTUVUVUVUVWVWWVWVWVWXWXWXWWXYXXYYXYXYXYZYZYZYYZYZ[Z[ZZ[Z[Z[Z[Z[Z[[ZZ[[\[\[\[\[\[\[[\[\[[\[\[\[\[\[\[\[Z[Z[Z[ZZZYZYZZYZYZYZYXYYXYXWXWXWXXWXXWXWVWVUVUVUTUTUTTSSTSSTSRSRRSRQRQRQPQPQPOPOPPO NOONNOOMNMNMNNMLMLMLKLKLKJKJIIJIHIHIHGHGHGFGGFGGFEFEDEDCDCBABABA@A@?>?>=>=<=<=<=<<=<;:9:99::98987876767654543434323321212121101010/0/ ././/../..-.-.-,--,,-,+,+*+*)*))*)()()()('('('('('((''(@ABCBBCDCDCCDDEDEDEDEFEFEEFGFGHIHIHIHIHIJIJIJIJKJKJKLKLLMLMNMNONONONOPOPQRQRQRQRSRSSRSRSTSTSTUTUUTUVUUVVUVUVUVWVWVWXWXWXYXYXXYZYZYZZYZYZ[Z[Z[Z[ZZ[Z[[Z[Z[\[\[\[\[\[\[Z[Z[Z[Z[[Z[Z[ZZYZYYZYZYXYXYXYXYXWXWXWXWVWVWVUVUVVUUVUVUTUTUTTUTTSSTSRSRQRQRQPQPOPONOONMNMMNMLMLMLKLKJKJIIJIHIHGHGFGFEDCDCBABA@A@A@@A@?>?>>?>=>>=<==<;<;<;:;;:;::;:9:989898787876765665654545432212110011010110/0/.//.-.-,-,-,+*++*+*)*)*)))*)()()()('('('('('('('(('('('(('('(@A@ABABCBCBCDCDEDEFEEFGFGFGHIHIHIJIJIJKJKJKLKKLLMNMNMNMN ONNONOOPOOPOPOPQ RQQRQRRQRQRSRSRRSTSTSTUTUTUTUVUUVVVWVWVWVWXWXWXYXYYXXYXXYXYYXYZYZYZYZYZZYZZYZYZ[Z[Z[Z[[Z[[Z[Z[\[\[\[\[\[Z[[Z[Z[Z[Z[Z[ZZ[ZZYZYZYZYZYZYXYXYXWXWXWVWVVWVUVUVUVVU TUUTTUUTUUTSTTSSTSSTSSTSRSRSRQRQRQPQQPQPOPONONONMNNMLMLMMLKLLKLKLKJKJJKJIJIJIHIHIHIHGHHGHHGFGFGFGGFEDEDCBCBABA@A@A@?>?>?>=>=<==<==<;<;:;:9:9:989898987878787676565654545434343232212212101010/0/./././.-..-.-,-,-,-,-,+,,+,,+,,+,,++,+*++**++*)*))*)*)()())(())('('('('(''('('('('('(('('('('(@A@@ABABABABCDCDCCDEFEEFEFGFGFGHGHGHIHIHIJIIJK JKKLLKKLLKLKLLMLMLLMNMNONNOONNOPOPQPQRQRRQRSRSRSTSTTSTSTUTUUTUVUVVUUVUVWVWWVWVWXWXWXWXY XYXXYXYYXYXYYXYZYZZYZYZ[Z[Z[Z[[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[[Z[Z[Z[Z[Z[ZZYZYZYZYZZYZYXYXYXYXWXXWXWVWWVVWVUVUVUTUTUTSTSTSTTTSSTSRSRSRSRSRQRQRQPQPOPOPOPOONONMNMLMLMML KLLKKLKLKKJKJKJIJJIHIHIHGHHGHGFGFGFEFEDEEDEDDCDCDCBCBABABA@?>?>>?>=>>=<=<;<;<<;<;:;::;:9:9::98989899878767676566556556545434343232321210110010/0/00/00/./../.-.-,-,-,,-,,-,+,+*++*+**+*)*))*)*)*)()()(()('('(('('('('('('(@ABABCBCDEDEDDEFEFGHGHIHIJIJIJKJKJKLKLLMLMNMNONNOPOPOPPOPQPQPQRQRRQRQRQRSRSTSTSTTSTUVUUVUVWVWWVWWVWVWXWXXWXXWWXWXYXYXYZYZYZYZYZ[Z[Z[ZZ[Z[[Z[Z[Z[[Z[Z[[Z[Z[Z[Z[Z[[Z[Z[Z[ZZ[Z[ZZ[ZZYZYZYXYXYYXYYXYXWXWXWVWVWVWVUTUTUTSTSSTSRSRQRQPQPQPOPOOPONONMNMNMLMLMLMMLKLKKLKJKJIJIIHIHGHHGHGFGFEDCDDCBCBABA@AA@A@?@?@?>?>=>=>>=<=<==<=<;<<;:;:;:9:9:9:98987876765654545434334432322121010/0/0/./.-.-.-,--,-,+,+*++*)*)()()()()('('('('('('(('(@A@A@ABABABCDEDEDEFEEFGFGFGHGHGHIHHIHIHIJIIJKJKJKLKLLMLLMMLMNMNONNONOPOOPOPQRQRSRSSRRS TSTSTTSTSTSTUTUTUTUVUUVUVUVWVWWVVWVWXWXWXYXXYXYXYXYZYYZYZYZYYZYZZYYZYZ[ZZ[Z [ZZ[Z[ZZ[[Z[Z[Z[[ZZ[Z[Z[Z[Z[Z[Z[[Z[Z[Z[Z[Z[Z[Z[Z[ZYZY ZYYZZYZZYYZZYXYXYXYXWXWXWXWXWVWVWWVVWVUVVUUVUUVUTUTUTUTUTSTSTTSSTTSSRSRQRQQRRQPQPOPOPPONOONNONNONMNMNMLMLMLKLLKLKKLKJKKJKKJKJIJIJIIHIHGFEFEFEDCDCDDCBCBBCCBCBABA@A@A@@?@?@?>?>?>=>=>>=<==<<=<;<<;<;<;:;;:;::9:9:989878787676677656565654545434323232212121010/.-.-,-,,-,+,,++,++,+*+*)*)*) ())())())(())()('('('('('('('('(A@ABABABABCBCDCDEDEDEDEDEFEFEFGHGHIHIJIJKJKLKKLMLMLMNMNMNOONOPOPPOOPQPQPQRSRSTSTUUVUVUVWVWVWXWX YXYXXYXXYXXYXYZYZZYZYZYZZYZYZYZYZ[Z[Z[Z[Z[Z[Z [ZZ[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[Z[[ZZ[Z [Z[ZZ[[Z[[Z[Z[Z[Z YZZYZYYZYZYZYYZYZYXYXYXWXWXWVWWVWWVWVUVUVUUVUTUTUTUTSTSTTSSRSRQRQPQPOPPOPONONO NONNMMNNMNNMLMLKJKJIJIIHHIIHIHGHGGHGFGFGFEFEDEDDEDDCDCDCDCBA@A@A@A@?@?>?>=>==<;<;;<<;:9::9:989878778765654554543232323221010010/0/0/0/./././.-,-,-,+,+,+*+*+**+*+*)*)*)()()(()()('('('(('('('('(('('('(@A@A@ABAABAABCBCBCDEFEFGHGHGHIHHIHIJIIJIJKJKKJKLKLKLMLMLLMLMNONOONOONOPQPQPQQPQRQRRQQRSRSRSTSTSTUTUUUVUVWXWXWXWWXYXXYXYXYXYZYZYZYYZYZ[ZZ[Z[Z[Z[Z [Z[Z[[ZZ[Z[Z[Z[Z[[Z[Z [Z[[ZZ[ZZ[Z[Z[Z[[Z[Z[ZYZ YZYYZYYZZYYXYYXYXYXWXWXWVWVWVUVUVVUTUTTUTSTSTSSRSRSRSSRQRQRQPQQPQPOPOOPONONONMNMNNMLMLKLKJKJKJIJJIHIHIHIIHGHGFGFGFEFFEFEDEDEEDCBCBCCBA@A@A@?>?>?>=>>=>===<=<=<;<;<<;:989889878877876765654543432323221212122101010/./.-.-.-,-,-,+*+*+*+*)*)**)*)()()('('('('(('('hU~{pZpnjioaXtgYxt^rpk~lf\Trg]on\mrspPatij?QziJ]{*|dS]|# R{"/+ 8y&    " 0/:  f+%"!3   4$#>( ) A   $!.< 4 &4F"G'A  $  )`)  !5*09-% !B"++ 39 =/ . "2*$/ ;2>M5+1$9.%.,/6$E2\/#+32   C'A:AF!!.  (+'#3/#"2$6!*5-0A$- :)0*.7 , ! 9*G&#$&[(N  7298(H @ -- 0@+7)  B #D61!;$   J)/ -, 6!%9>D &6" 0*01 ".!+1A    ް                   ް   ް                ް     ݰ  ݰ   ް     ް      ݰ  ݰ    ݰ   ްݰ      ް    ݰ  ݰ     ް     ް    ްݰ  ݰ     ް        ް     ݰ  ݰ    ް     ް       ݰ  ݰ    ݰ   ްݰ           ݰ  ݰ     ް           ްݰ  ݰ    ް             ݰ  ݰ      ް     ް    ݰ  ݰ   ްް     ް                   ް                   ݰ ް     ݰ                     ߰         ձٱ  ̱ڱ  ɱ ߱ɱ ް   ѱ           ް   ް   ٱ        ޱ           Ͳò      ݰ  ݰ  ۲     ݲ                   ٲݰ  ۲    ߲ ݰݰ  ܲݰ    dz          Գݳ       ֳ      ݰ    ܳڴ ٴ      ۴ ޱް                    ޴    ٴ                ϵ        ֵ      ߰       ߵ      ض   ׶̶              Ҷ          ް                  ޶          ڷ    Ϸݷ                              ׸     ָ                     %  ݰ     عѹ ݰ       ߹  ݹ                  ޹     Ժ  ں          ݺں  ޺             ްް              ݻۻ     ޻    ߻    ݻ  ޻           ߻  ް           ڼ    ټ    ޼             ݼ           ް           %   ݰ       ݰ               ׾    Ѿ ް     ߾          %            ɿ         ްް                                                                         ް ¦                 ݰ           ݰ                             ÿ                                 ް                                                                     ް                           ݰ      ݰ                                                             ް                                                                                          ݰ                                                                           ݰ                                                                                                                          ݰ                                                                                                               ݰ                                                              ݰ                                                                                                        ߰                                                                                                                                                          ް                                                                   ݰ                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            ߰                                                        ް                                                                                                                                   ް                                                        ް                                              ް                  ݰ                           B/(1:'#J3Q?>' >=B71,  +E"Z7,*.<*+>;#G1K=4/#4:I27)%HR7  0 F597, H9K8-90E@71-'8J:3"1OB"2' +*U!,  K !])#}(K4A^>;)=&0U4 DF+. ?E 3n)0- $S//-)  EO 6"  ' ,4 3 2/,&<  ?M3&  00C !6F %!/"0&6 D$K 6' B ' (,& < * ##01:    ##D% %  5'   & 3   " "   C& . H# /2 ) % &, ?'   5,  $&  :4)( 5*1 9 . C  5*) '  *P9 &  )$  ?$3C+,,++,+,+,+,+,+,+,++,,+,+,++,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,++,+,,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,++,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,++,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+,+,+,+ ,+,,++,++,+,+,++,,+,+,+,+,+,+,+,+,+,,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,+,++,+,+,+,+,++,+,+,+ ,++,++,++,+,+,+,+,++,++,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,++ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+,+,+,+,+,++,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,++,+,+ ,+,+,++,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,++,,+,++,+,+,+,+,+,+ ,++,++,++,,+,++,+,+,+,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,++,++,,+,++,+,+,+,+,+,+,++,,++,+,++,++,+,+,+,+,+,+,++,++,++,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,++,,+,++,+,+,+,+,+,+,+,++,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,++,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,++,+,+,+,++,++,+,+,+,++,+,++,+,++,+,+,+,+,+,+,,+,+,++,+,++,+,++,+,,+,+,++,+,+,+,+,+,+,+,++,,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,++,+,++,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,++,+,+,++,+,+,+,+,+,++,,++,++,++,,++,,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,,++,+,+,+,,++,+,++,+,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+ ,++,+,,++,+,+,+,+,,+,,++,+,+,++,++,+,+,+,++,++,+,+,+,+,++,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,++,++,,++,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+ ,++,+,++,,+,++,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,,+,+++,+,+,+ ,++,++,+,++,+,+,+,+,+,+,++,+,++,++,+,+,,+,+,,++,+,+,++,+ ,+,++,++,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,++,+,+,++,++,+,+,+,++,+,+,+,+,+,,++,+,+,,+,+,+,+,+,+,++,,+,+,,+,++,+,+,+,+,+,+,+,,+,+++,+,+,+,++,++,+,++,+,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,+,+,+,+,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,++,+,++,,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,++,+,++,+,,+,+,+,+ ,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+ ,+,++,++,,+,++,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+++,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,++,+,+,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,++,+,++,++,+,+++,+,+,+,,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,+,+,+,+,+,+,++,,+,+,++,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+ ,++,++,,++,+,+,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,++,+,+,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+++,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,++,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,+ ,++,++,++,,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,,+,++,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,,+,,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,++,+,+,,+,+,+,,+,+,++,+,+,+,+,++,+,+,+,+ ,+,++,++,++,+,++,+,+,+,+,+ ,++,++,+,+,,+,+,+,+,++,,+,+,,+,++,+,+,+,+,,++,++,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,,++,+,+,+,+,+,++,,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,,++,+,++,,+,+,+,+,,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,+,++,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,,+,+++,+,+,,++,,+,+,++,+,+,,++,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,++,++,+,+,++,+,++,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,+,++,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+ ,+,+,+,+,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,++,++,+,++,+,+,++,+,+,+,+,,+,+,+,+,+,+,+,,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+++,+,+,+,+,++,++,+,+,++,++,+,+,+,++,+,+,+,,+,+,+,+,++,+,++,+,+,+,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+ ,+,,+,,++,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,++,+,+,+ ,++,++,++,+,+,+,+,++,++,++,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,++,,+,+,,+,+,+,+,+,+,++,+,++,+++,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,,+,,++,++,+,+,++,,++,+,+,+,+,+,+,+,+,,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,++,,+,++,+,+,+,+,+,+,++,,++,+,++,++,+,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+++,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,+,++,++,+,+,,+,+,,+,+,+,++,+, +,++,++,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,++,+,++,+,+,++,+,+,+,+,+,+,+,+,++,++,+,+,+,+,++,,+,+,+,++,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+,++,+,+,+,++,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,,+++,+,+,+,+,+,++,,+,+,++,+,++,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,++,+,,+,++,+,+,+,+,+,++,+,,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,++,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,++,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,++,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+ ,+,+,++,++,,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,++,+,+,+,+,+,++,,+,++,+,+,+,+,+,++,+,+,+,+,++,+,+,+ ,++,++,++,+,+,+,+,++,++,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,++ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+,+,+,+,+,++,+,,+++,+,+,++,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+ ,+,+,++,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,++,+,+,+,+,++,,+,++,+,+,+,+,+,+ ,++,++,++,,+,+,++,+,+,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,+,++,+ ,++,++,++,,+,+,+,+,+,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+,++,+,,+,,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,,+,+,+,+,+,+,++,++,++,+,+,+,+,+,+,+,++,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,++,+,+,+,++,++,+,+,+,+,+,++,+,++,+,+,+,+,+,+,,+,+,++,+,++,+,++,+,,+,+,++,+,+,+,+,,+,+,+,++,,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,++,,++,++,++,,++,,+,+,++,+,++,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,,+,+++,+,+,,++,+,++,+,+,+,+,+,+,+,+,+,+ ,++,++,,+++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+ ,++,+,,++,+,+,+,+,,+,,++,+,+,++,++,+,+,+,++,++,+,+,+,+,++,+,+,+,+,+,+,+,,+,++,+,++,,++,+,+,+,+,+,+,+,++,++,,++,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,,+,+,+,+,+,+,+,+,+,+ ,++,+,++,,+,+,+++,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,,+,++,++,++,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,++,+,+,+,++,++,++,+,+,+,+,++,+,++,+,+,+,+,+,+,,+,+,++,+,++,+,++,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+++,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,++,+,++,,+,+,++,+,+,++,++,+,+,+,++,+,+,+,+,+,,+,++,+,,+,+,+,+,+,+,++,,+,+,,+,++,+,+,+,+,+,+,+,,+,++,+,+,+,++,++,+,++,+,+,+,+,+,+,+,+,+,+,,+,++,++,,+,+,+,+,+,+,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,+,++,++,+,+,+,+,,+,+,+,++,,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+++,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,+,+,+,+,++,++,+,,+,+,+,+ ,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,++,++,,+,++,++,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,++,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,++,+,+,+,+,+,+++,+,++,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+++,+,+,+,++,+,+,+,++,+,+,+,++,+,++,++,+,+,++,+,+,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,+,+,++,,++,++,++,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+ ,++,++,,++,+,+,+,++,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,++,+,+,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,++,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,+ ,++,++,++,,+,+,+,+,+,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,++,,+,+,+,+,,++,+,++,+,+,+,+,+,++,+,+,+,++,+,+,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+++,+,,+,+,+,,+,+,++,+,+,+,+,++,+,+,+,+ ,+,++,++,++,+,+,+,++,+,+,+ ,++,++,+,+,,+,+,+,+,++,,+,+,,+,++,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,,++,+,+,+,+,++,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+ ,++,+,,++,+++,+,+,+,,+,,+,+,+,++,++,+,+,+,++,++,+,+,+,+,++,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,++,,,+,+,+,+,+,+,+,+,+,+,+,+,,++,+,++,,+,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,,++,,+,+,++,+,+,,++,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,++,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,+,++,++,,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+ ,+,+,+,+,,+,+,+,++,+,+,+,+,,+,++,+,++,,+,+,+,+,+,+,+,+,++,++,,++,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,++,+,++,++,+,+,++,+,+,+,+,,+,+,+,+,+,+,+,,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,++,+,+,++,++,+,+,+,++,+,+,+,,+,+,+,+,++,+,++,+,+,+,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,++,,+,+,+,+,+,+ ,+,,+,,++,+,++,+,+,+,+,+,+ ,++,+,++,,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,+,+,+,+,+,+++,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,++,,+,+,,+,+,+,+,+,+,++,+,++,+,++,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,,+,,++,++,+,+,++,,+,+,,++,+,+,+,+,+,+,,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,++,+,++,,+,++,+,+,+,+,+,+,++,,++,+,++,++,+,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,++,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+ ,++,++,+,++,++,+,+,+,+,+,++,+,++,++,+,+,,+,+,,+,+,+,++,+,+,++,++,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,++,++,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,++,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,++,+,+,++,++,+,+,+,++,+,++,+,+,+,+,+,++,,+,+,++,+,++,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,++,+,,+,++,+,+,+,+,+,++,+,,+,+,+++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,++,+++,+,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,,+,+,+,,+,+,+,+,+,+,++,,+,+,,+,++,+,+,+,++,+,+,+,,+,+,+,+,+,++,++,+,++,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+ ,++,++,++,+,+,+,+,++,++,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+,+,+,+,+,++,+,,+,++,+,++,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,++ ,+,+,++,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,,+,+,+,+,++,,+,++,+,+,+,+,+,+ ,++,++,++,,+,+,+,+++,+,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,+,+,++,++,+,+,,+,+,++,,+,+,+,+,+,+,+,,+,+,+,++,++,+,+,+,+,,+,+,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,+,++,+,+,+,+,+,+,++,++,+,+,+,+,+,+,++,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,++,+,,+,+,+,+,+,+,++,++,+,+,++,+,+,+,++,++,+,+,+,+,+,++,++,++,+,+,+,+,+,+,,+,+,++,+,++,+,++,+,,+,+,++,+,+,+,+,,+,+,++,++,,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,++,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,+,++,++,,+,++,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,,++,++,++,,++,,+,+,++,+,++,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+++,+,,++,+,++,+,+,+,+,+,+,+,+,+,+,++,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+ ,++,+,,++,+,+,+,+,,+,,+,,+,+,++,++,+,+,+,++,++,+,+,+,+,++,+,+,+,+,+,+,+,,+,++,+,++,,+,+,++,+,+,+,+,+,++,++,,++,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+++,+,++,,+,+,+,+,+,+,+,+,+,+ ,++,+,++,,+,+,+,++,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,,+,++,+,+++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,++,+,+,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+++,++,,+,+,++,+,+,++,++,+,+,+,++,+,+,+,+,+,,+,+,+,,+,+,+,+,+,+,++,,+,+,,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,++,++,+,++,+,+,+,+,+,+,+,+,+,+,,+,+,++,,++,+,+,+,+,+,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,++,+,+,+,+,+ ,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,++,++,,+,++,+,+++,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,++,+,+,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,,+,+,+,++,+,+,+,++,+,+,+,++,+,++,++,+,+,+,+,+,,+,+,+,++,+,+,+,+,+,+,+,+,+,++,++,+,++,,++,+,+,+,+,++,+,++,++,+,+,+ ,++,+,++,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+ ,++,++,,++,+,+,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,++,+,+,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,+,+,+,,++,+,++,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,+ ,++,++,++,,+,+,+,+,+,,+,+,++ ,++,++,,++,+,+,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,,+,,+,+,+,+,+,+,+,+,+,+,+,++,++,+,++,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,,+,+,+,,+,+,++,+,+,+,+,++,+,+,+,+ ,+,++,++,++,+,+,+,+,+,+++,+ ,++,++,+,+,,+,+,+,+,++,,+,+,,+,++,+,+,+,+,,++,+,++,++,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,,++,+,+,+,+,+,++,++,,++,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,++,,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,,++,+,++,,+,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,++,+,,++,,+,+,++,+,+,,++,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,++,++,++,+,+,++,+,+,+,+,+++,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,+,++,++,,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+ ,+,+,+,+,,+,+,+,+,+++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,++,,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,++,+,+,++,+,+,++,+,+,+,+,,+,+,+,+,+,+,+,,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,++,+,+,++,++,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,++,,+,+,++,,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,++,,+,+,+,+,+,+ ,+,,+,,++,+,++,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,+ ,++,++,++,,+,+,+,+,+,,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,,+,+,+,+,+,+,++,+,++,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,,+,,++,++,+,+,++,,+,+,+,+,+,+,+,+,+,,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,++,+,++,,+,++,+,+,+,+,,+,+,++,,++,+,++,++,+,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,+,+,++,,+,+,++,+,+,++,+,+,++,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+ ,++,++,+,++,++,+,+,+,+,+,++,+,++,++,+,+,,+,+,,+,+,+,++,+ ,+,++,++,+,++,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,++,,+,+,+,+,++,,++,,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,+,++,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,,+,+,+,,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,,+,++,+,+,+,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,,+,++,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,++,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+ +,++,++,++,+,+,+,+,+,+,+ ,++,++,+,+,,+,+,+,+,++,,+,+,,+,++,++,+,+,+,,++,+,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,++,+,+,++,+,+,+ ,++,++,++,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+,+,+,+,+,++,+,,+,++,+,++,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,++,+,+,+,++,,+,++,+,+,+,+,+,+ ,++,++,++,,+,+,+,+,++,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,,++,+++,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+++,+,+,+,+,+,++,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,++,+,+,+,++,++,+,+,+,+,+,++,+,++,+++,+,+,+,+,+,,+,+,++,+,++,+,++,+,,+,+,++,+,+,+,+,,+,+,+,++,,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,++,+,+,,,++,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,,++,+,+,+,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,++,++,+,+,+,+,+,++,,++,++,++,,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,++,+,,++,+,++,+,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+ ,++,+,,++,+,+,+,+,,+,,+,+,++,++,++,+,+,+,++,++,+,+,+,+,++,+,+,+,+,+,+,+,,+,++,+,++,,+,+,+,++,+,+,+,+,++,++,,++,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+ ,++,+,++,,+,+,+,++,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,,++,,+,+,++,+,+,,++,+,+,+,+,+,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+,++,+,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,++,+,+,++,++,+,+,+,++,+,+,+,+,+,,+,+,+,,+,++,+,+,+,+,++,,+,+,,+,++,+,+,+,+,+,+,+,,+,+,+,++,+,++,++,+,++,+,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+++,+,+,+,+,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,+,+,++,+,,++,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,++,++,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,+,++,++,,++,+,+,+ ,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,++,++,,+,++,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,++,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,++,+,+,+,++,+,++,++,+,+,+,+,+,,+++,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+ ,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+ ,++,++,,++,+,+,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,++,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,++,+,+,+,+,++,++,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++ ,+,,+,,+,++,+,+,++,+,+,++,++,+ ,++,++,++,,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,+,,+,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,,+,++,+,,+,+,++,+,+,+,+,++,+,+,+,+ ,+,++,++,++,+,+,+,+,+,++,+ ,++,++,+,+,,+,+,+,+,++,,+,+,,+,++,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,,++,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,++,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,,++,+,++,,+,+,+,+,+,++,+,++,+,++,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,,++,+,+,++,+,+,,++,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+,+,,+,+,+,+,++,+,+,+,+,+,+,++,++,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,+,++,++,,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+ ,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,++,+,+,++,+,+,++,+,+,+,+,,+,+,+,+,+,+,+,,+,+,+,+,+,+,+++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,++,++,+,+,++,++,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,++,,+,+,+,+,+,+ ,+,,+,,++,+,++,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+ ,+,,+,,++,++,++,+,+,+,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,+,++,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,+,+,+,+,+,+,+++,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,++,,+,+,,+,+,+,+,+,+,++,+,++,+,+,++,+,,++,+,+,+,+,+,+,+,+,+,+,+,,+,,++,++,+,+,++,,+,+,+,+,+,+,+,+,+,,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,++,,+,++,+,+,+,+,+,++,++,,++,+,++,++,+,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,,+,+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,++,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,,+,+,+,+,++,,+,+,++,+,+,++,+,+,+,++,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+ ,++,++,+,++,+,++,+,+,+,+,++,+,++,++,+,+,,+,+,,+,+,+,++,+ ,+,++,++,+,+,++,++,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,++,+,++,+,+,+,+,++,+,+,+,+,+,+,++,++,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,,+,+,,+,+,+,+,++,+,++,+,++,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+ ,+,,+,,++,+,+,+,+,+,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,,+,++,+,+,+,+,+,++,+,,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+++,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,,+,++,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,++,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,++,,+,+,+,+,+,+,+,+,+,,+,+,+,+,,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,++,++,++,+,+,+ ,++,++,++,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+,+,+,+,+,++,+,,+,++,+,++,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+ ,+,+,++,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,++,+,+,+,++,,+,++,+,+,+,+,+,+ ,++,++,++,,+,+,+,+,+,++,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,+,+,++,+,++,++,,+,++,+,+,+,+,+,+,++,,++,+,++,++,+,+,+,+,+,+ ,++,++,++,+++,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,++,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,++,+,+,+,+,+,+,+,+,+,++,,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,++,+,+,+,++,++,+,+,+,+,+,++,+,++,++,+,+,+,+,+,,+,+,++,+,++,+,++,+,,+,+,++,+,+,+,+,,+,+,+ ,++,,++,,+++,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,++,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+ ,+,+,++,,+++,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+,++,,++,++,++,,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,++,+,,++,+,++,+,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+ ,++,+,,++,+,+,+,+,,+,,+,+,+,++,++,+,+,+,++,++,+,+,+,+,++,+,+,+,+,+,+,+,,+,++,+,++,,+,+,+,+,+,++,+,+,++,++,,++,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+ ,++,+,++,,+,+,+,+,+,+ ,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,,+,++,+,+,+,+,+,+,+ ,++,++,+,++,+,+,+,+,+,+,++,+,++,++,+,+,,+,+,,+,++,,+,++,+ ,+,++,++,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,++,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,++,,++,+,++,+,+,++,++,+,+,+,++,+,+,+,+,+,,+,+,+,,+,+,++,+,+,+,++,,+,+,,+,++,+,+,+,+,+,+,+,,+,+,+,+,+++,++,++,+,++,+,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,++,+,+,+,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,+,+,++,+,,+,+,++,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+ ,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,++,++,,+,++,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,++,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,++,+,+,+,+,+,+,+,++,+,+,,++,,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,++,+,+,+,++,+,+,+,++,+,++,++,+,+,+,+,+,,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+ +,++,+,,++,+ ,++,++,,++,+,+,+,+,+,+,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+ ,++,++,,++,+,+,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+++,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,++,+,+,+,+,+,++,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,,+,++,+,+,++,+,+,++,++,+ ,++,++,++,,+,+,+,+,+,,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,++,+,,+,++,+,+,+,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+++,+,+,+,,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+ ,+,++,++,++,+,+,+,+,+,+,+ ,++,++,+,+,,+,+,+,+,++,,+,+,,+,++,+,+,+,+,,++,+,++,+,+,+,++,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,++,+,+,++,+,+,,++,+,+,+,+,+,++,++,+,+,+,+,,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,++,+,+,+++,+,+,+,+,+,+,+,+,+,,++,+,++,,+,+,+,+,+,++,+,++,+,+,++,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,,++,,+,+,++,+,+,,++,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,++,++,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,+,++,++,,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+ ,+,+,+,+,,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,++,+,+,++,+,+,++,+,+,+,+,,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,++,+,+,++,++,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,,++,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,++,,+,+,+,+,+,+ ,+,,+,,++,+,++,+,+,+,+,+,++,+,+,+,,+,+,+,+,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+ ,++,++,++,+,+,+,+,++,++,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+++,+,+,+,++,,+,+,,+,+,+,+,+,+,++,+,++,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,,+,,++,++,+,+,++,,+,+,+,+,+,+,++,+,+,,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,++,,+,++,+,+,+,+,+,+,++,,+,+,++,++,+,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,++,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,,+,+,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+ ,++,++,+,++,+,+,+,+,+,+,++,+,++,++,+,+,,+,+,,+,+,+,++,+ ,+,++,++,+,+,+,++,+++,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,++,,+,+,+,+,+,+,+,+,,,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+++,+,+,++,+,+,+,+,+,,+,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+,++,+,+,+,++,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,,+,++,+,+,+,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,++,+,+,++,+,+,+,+,+ ,+,+,++,++,,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,++,,+,++,+,+,+,+,+,+,+,+ ,++,++,++,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,+,+++,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+ ,++,++,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,,+,++,+,++,+,+,+,+,+,+,+,++,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+ ,+,+,++,++,,+,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,++,+,+,++,,+,++,+,+,+,+,+,+ ,++,++,++,,+,+,+,+,+,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,+,+,++,+,+,+,+,+ ,++,++,++,,+,+,+,+,+,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,,+,+,+,+,+,+,++,+,++,+,+,++,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,++,+,+,+,++,++,+,+,+,+,+,++,+,++,++,+,+,+,+,+,,+,+,++,+,++,+,++,+,,+,+,++,+,+,+,+,,+,+,+,++,,++,,+,++,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,++,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+,,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,++,,++,++,++,,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,,+,+,++,+,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+ ,++,+,,++,+,+,+,+,,+,,+,+,+,++,++,+,+,+,++,++,+,+,+,+,++,+,+,+,+,+,+,+,,+,++,+,++,,+,+,+,+,+,++,+,+,++,++,,++,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,++,+,+,+,+,+,+,+,+ ,++,+,++,,+,+,+,+, +,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,++,+,+,+,++,++,++,+,+,+,+,++,+,++,+,+,+,+,+,+,,+,+,++,+,++,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,,+,,+,,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,++,,+,+,++,++,+,+,+,++,+,+,+,+,+,,+,+,+,,+,+,+,+,+,+,++,,+,+,,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,+,+,++,+,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,+,+,++,+,,+,+,+,+,+,+,+,+,,+,+,+,++,,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+ ,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,++,++,,+,++,+,+,+,++,++,,+,+++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,,,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,++,+,+,++,++,+,+,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,++,+,+,+,++,+,+,+,++,+,++,++,+,+,+,+,+,,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,++,+,,+,+,+,+,+,+,++,+,+,+,+,+,++,,++,++,++,,++,,+,+,++,++,+,+,+,+,+,+,+,+,+ ,++,++,,++,+,+,+,+,+,+,+,,++,+,+,++,++,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,++,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+++,+,+,+,+,+,++,++,+,+,+,+,+,++,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,+ ,++,++,++,,+,+,+,+,+,,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,++,,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,,++,+,+,++,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,++,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,,+,+,+,,+,+,++,+,+,+,+,++,+,+,+,+ ,+,++,++,++,+,+,+,+,+,+,+,+,++,+,+,,+,+,+,+,++,,+,+,,+,++,+,+,+,+,,++,+,++,+,+,+,++,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,,++,+,+,+,+,++,++,+,+,++,+,+,,++,+,+,+,+,+,++,++,+,+,+,++,+,+,++,++,,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+ ,++,+,,++,+,+,+,+,,+,,+,+,+,++,++,+,+,+,++,++,+,+,+,+,++,+,+,+,+,,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,,++,+,++,,+,+,+,+,+,++,+,++,+,+,+,++ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,++,,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,,++,,+,+,++,+,+,,++,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,++,++,++,+,+,++,+,+,+,+,+,+,,+,+,+++,++,,++,+,+,++,,++,++,,+,+,++,+,+,+,++,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+ ,+,+,+,+,,+,+,+,+,+,+,++,+,+,,+,++,+,++,,+,+,+,+,+,+,+,+,++,++,,++,++,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,++,+,+,++,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,++,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+ ,+,+,++,,++,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,++,,+,+,+,+,+,+ ,+,,+,,++,+,++,+,+,+,+,+,++,+,+,+,+,,+ ,++,+,++,,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+, +,++,+,+,,++,+,+,,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,,+,+++ ,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,,+,+,,+,+,+,+,+,+,++,+,++,+,+,++,+,,+,+,++,+,+,+,+,+,+,+,+,+,,+,,++,++,+,+,++,,+,+,+,+,+,+,+,+++,+,,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,++,,+,++,+,+,+,+,+,+ ,++,,++,+,++,++,+,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+ ,+,,+,++,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+++,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,,+,+,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+ ,++,++,+,++,+,+,+,++,+,+,++,+,++,++,+,+,,+,+,,+,+,+,++,+ ,+,++,++,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,++,+,+,+,+,+,++,++,+,+,+,+,++,,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,,+,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,+,+,+,+++,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,++,+,+,++,++,+,+,+,++,+,+,++,+,+,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,,+,++,+,+,+,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,,+,+,++,+,+,++,+,+,+,++,+,+,++,,+,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,++,+,,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+ ,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,++,+,+,,+,+,+,,+,+,+,+,+,+,++,,+,+,,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,++,++,+,++,+,+,+,+,+,+,+,+,++,+ ,++,++,++,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+ ,++,++,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,,+,++,+,++,+,+,+,+,+,+,+,++,+,,+,+ ,+,++,++,+++,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+ ,+,+,++,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,++,+,+,++,,+,++,+,+,+,+,+,+ ,++,++,++,,+,+,+,+,+,++,,+,++,+,+,+,+,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,+,+,++,+,+,+,+,++,+,,+,+,++,,+,+,+,+,+,+,+,,+,+,+,++,++,+,+,+,+,++,+,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,,+,+,++,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,,+,+,+,++,+,+,++,++,+,+,++,+,+,+,++,++,+,+,+,+,+,++,+,++,+,++,+,+,+,+,,+,+,++,+,++,+,++,+,,+,+,++,+,+,+,+,,+,+,+,++,,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,++,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,+,+,+,++,++,,+,++,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,++,++,++,,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+ ,++,+,,++,+,+,+,+,,+,,+,+,+,++,++,+,+,++,++,++,+,+,+,+,++,+,+,+,+,+,+,+,,+,++,+,++,,+,+,+,+,+,+,+,+,+ +,++,,++,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+ ,++,+,++,,+,+,+,+,+,+,+,+,++,+,++,++,+,+,++,+,+,+,+,+,+,+,+,+,,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+ ,+,++,++,++,+,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,++,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+,++,+,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,++,+,+,++,++,+,+,+,++,+,+,+,+,+,,+,+,+,,+,+,+,+,++,+,++,,+,+,,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,++,++,++,++,+,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,+,+,+,++,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,+,+,++,+,,+,+,+,+,++,+,,+,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,++,+,++,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,++,++,,+,++,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+++,+,+,+,+,+,++,+,+,++,+,+,++,++,+,+,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,++,+,++,++,+,+,+,+,+,,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,++,+,+,+,+,++,+,++,++,+,+,+ ,++,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+ ,++,++,,++,+,+,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,++,+,+,+,+,+,++,,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+ ,+,,+,,+,++,++,+,++,+,+,++,++,+ ,++,++,++,,+,+,+,+,+,,+,+,+,+,+,+,++,++,,++,+,+,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,,+,+,+,,+,++,++,+,+,+,+,++,+,+,+,+ ,+,++,++,++,+,+,+,+,+,+,+,++,++,+,+,,+,+,+,+,++,,+,+,,+,++,+,+,+,+,,++,+,++,+,+,+,+,++,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,++,+,+,++,+,+,,++,+,+,+,+,+,++,++,+,+,+,+,+,+++,++,+,+,+,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,++,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,,++,+,++,,+,+,+,+,+,++,+,++,+,+,+,++ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,++,,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,+,+,,++,,+,+,++,+,+,,++,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,++,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,+,++,++,,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+ ,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,++,+,+,+,+,++,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,++,+,+,++,+,+,++,+,++,+,+,,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,++,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,++,,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,++,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,++,,+,+,+,+,+,+ ,+,,+,,++,+,++,+,+,+,+,+,++,+,+,+,+,,+,+,+,+,+,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,+ ,++,++,++,,+,+,+,++,+,,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+ ,+,++,+,+,,++,+,+,,+,+,++,,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,,+,+,,+,+,+,+,+,+,++,+,++,+,+,++,+,,+,+,+,,+,+,+,+,+,+,+,+,+,,+,,++,++,+,+,++,,+,+,+,+,+,+,+,+,+,,+++,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,++,+,++,,+,++,+,+,+,+,+,+,++,,++,+,++,++,++,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,,+,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,,+,+,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,++,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+ ,++,++,+,++,+,+,+,+,+,+,++,+,++,++,+,+,,+,+,,+,+,+,++,+ ,+,++,++,+,+,+,++,+,+,+,+,+++,++,+,+,+,++,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,++,+,+,+,+,++,++,+,+,+,+,++,,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,,+,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,+,+,+,+,++,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,++,++,,+,+,++,+,++,+,+,+,,+,+,+,,+,+,++,+,+,+,+,++,+,+,+,+,+,++,+++,+,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,,+,++,+,+,+,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,,+,+,++,+,+,+,++,+,+,++,+,+,++,,+,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,++,+,++,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+ ,++,++,+,+,,+,+,+,+,++,,+,+,,+,++,+,++,+,+,,++,+,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+ ,++,++,++,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+++,+,+,++,+,+,+,+,++,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,,+,++,+,++,+,+,+,+,+,+,+,++,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+ ,+,+,++,++,,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,++,+,+,++,,+,++,+,+,+,+,+,+ ,++,++,++,,+,+,+,+,+,++,,+,++,+,+,,+,++,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,+,+,++,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,,++,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,++,++,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,++,+,+,+,++,++,+,+,+,+,+,++,+,++,+,+,+,+,+,+,,+,+,++,+,++,+,++,+,,+,+,++,+,+,+,+,,+,+,+,++,,++,,+,+,+,+,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,,++,+,+,+,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,,++,+,++,,++,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,++,+,++,,++,++,++,,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,,++,+,++,++,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+ ,++,+,,++,+,+,+,+,,+,,+,+,+,++,++,+,+,+,++,++,+,+,+,+,++,+,+,+,+,+,+,+,,+,++,+,++,,+,+,+,+,+,+ ,+,+,++,++,,++,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+ ,++,+,++,,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,++,+,,+,+,+,+,,++,,+,+,++,+,+,,++,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,++,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,++,+,+,+,++,+,+,+,++,+,+,+,+,+,,+,+,+,,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,++,++,+,++,++,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,+,+,+,+,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+ +,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,+,++,++,,++,++,+,+,+,+,+,+,++,+,+,+,+,+,++,++,,+,++,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,++,+,+,++,++,+,+,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,+++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+++,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,++,++,+,+,++,+,+,+,++,+,++,++,+,+,+,+,+,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+ ,++,++,,++,+,+,+,+,+,+,+,,++,+,+,+,++,++,++,+,+,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,++,+,+,+,+,+,++,,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+ ,+,,+,,+,++,+,++,++,+,+,++,++,+ ,++,++,++,,+,+,+,+,+,,+,+,+,+,+,+,++,+,+,++,+,++,+,+,++,+,+,++,+,+,+,+,,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,,+,+,+,,+,+,++,+,+,+,+,++,+,+,+,+ ,+,++,++,++,+,+,+,+,+,+,+ ,++,++,+,+,,++,+,+,+,++,,+,+,,+,++,+,+,+,+,,++,+,++,+,+,+,+,+,++,+,++,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,,++,+,+,+,+,+,++,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,+,+,++,++,+,+,+,++,+,+,+,,+,++,+,+,+,+,++,+,+,+,++,,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,+,++,,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,,++,+,++,,+,+,+,+,+,++,+,++,+,+,+,+,++,+,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,++,,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,+,+,,++,,+,+,++,+,+,,++,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,++,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,++,+,++,,++,++,,+,+,++,+,+,+,++,++,,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+ ,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,,+,+,+,++,+,+,++,+,+,++,+,+,+++,+,,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,++,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+ ,+,,+,,++,+,++,+,+,+,+,+,++,+,+,+,+,,+,+,+,++,++,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+ ,+,,+,,++,+,+,+,+,+,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,+,+,+,+,,++,+,+,,+,+,++,,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,++,,+,+,,+,+,+,+,+,+,++,+,++,+,+,++,+,,+,+,+,+,++,+,+,+,+,+,+,+,,+,,++,++,+,+,++,,+,+,+,+,+,+,+,+,+,,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,++,+,++,,+,++,+,+,+,+,+,+,++,,++,+,++,++,+,++,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+++,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,,+,+,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+++,+,+,+,+,+,++,+,+,+,+,+,+,+ ,++,++,+,++,+,+,+,+,+,+,++,+,++,++,+,+,,+,+,,+,+,+,++,+ ,+,++,++,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,,+,+,,+,+,+,+,+,+,++,+,++,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,,+,,++,++,+,++,+,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,,+,++,+,+,+,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+++,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,++,,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,++,++,,++,++,++,,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,++,++,,+,+,+,+,+,+,+,+,+,,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,++,,+ ,++,++,++,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+,+,+,+,+,++,+,,+,+,+,++,++,+,++,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+ ,+,+,++,++,,+,+,+,+,+++,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,++,,+,++,+,+,+,+,+,+ ,++,++,++,,+,+,+,+,+,++,,+,++,+,+,,+,+,+,,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,+,++,+,+,+,+,+,+,++,,++,+,++,++,+,+,+,+,+,+ ,++,++,++,+,+,,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,++,+,+,+,++,++,+,+,+,+,+,++,+,++,+,+,+,+++,+,+,,+,+,++,+,++,+,++,+,,+,+,++,+,+,+,+,,+,+,+,++,,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,,++,++,++,,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,++,,+,+,+,+,,++,+,++,++,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+ ,++,+,,++,+,+,+,+,,+,,+,+,+,++,++,+,+,+,++,++,++,+,+,+,++,+,+,+,+,+,+,+,,+,++,+,++,,+,+,+,+,+,+,+,+,++,++,,++,++,+++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,++,+,+,+,+,+,+ ,++,+,++,,+,+,+,+,+,+,+,+,++,+,++,+,+,++,++,+,+,+,+,+,+,+,+,+,,+,,+,++,+,+,+,+,+,+,+,+,+,+,++,+ ,++,++,+,++,+,+,+,+,+,+,++,+,++,++,+,+,,+,+,,+,+,++,++,+ ,+,++,++,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,+,++,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,++,+,+,++,++,++,+,+,++,+,+,+,+,+,,+,+,+,,+,+,+,+,+,+,++,,++,+,,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,++,++,+,++,++,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,+,+,+,+,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,+,++ +,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,++,,+,++,+,+,+,++,++,,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,++,+,+,++,++,+,+,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,++,,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,++,+,++,+,++,+,+,+,++,+,++,++,+,+,+,+,+,,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,+,,++,+ ,++,++,,++,+,+,+,+,+,+,++,,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+ ,++,++,,++,+,+,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,++,+,+,,++,,+,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,++,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,+ ,++,++,++,,+,+,+,+,+,,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,++,+,,+,++,+,+,++,,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,++,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,,+,+,+,,+,+,++,+,+,+,+,++,+,+,+,+ ,+,++,++,++,+,+,+,+,+,+,+ ,++,++,+,+,,+,+,+,+,++,,+,+,,+,++,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,++,+,+,++,+,+,,++,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,+,+,+,+,+,+,,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,++,,+,+,+,+,+,,++,+,++,,+,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,,++,,+,+,++,+,+,,++,+,++,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,++,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++, ,++,++,,+,+,++,+,+,+,++,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+ ,+,+,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,++,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,+,+,+,+,++,+,+,+,+,+,+,+,+,,+,+,+,++,+,+,++,+,+,++,+,+,+,+,,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,++,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,,+++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,,++,+,+,+,+,+ ,+,,+,,++,+,++,+,+,+,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,+,+,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+,+,+,+++,+,++,+,+,+,+,++,+,+,+ ,++,++,++,+,+,+,+,++,++,+,+,+,+++,+,,+,+,++,,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,,+,+,,+,+,+,+,+,+,++,+,++,+,+,++,+,,+,+,+,+,+,+,+++,+,+,+,+,+,,+,,++,++,+,+,++,,+,+,+,+,+,+,+,+,+,,+,+,++,,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,++,+,++,,+,++,+,+,+,+,+,+,++,,++,+,++,++,+,+,++,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,++,+,+,+,+,++,+,+,+,+,+,+,+ ,++,++,+,++,+,+,+,+,+,+,++,+,++,++,+,+,,+,+,,+,+,+,++,+ ,+,++,++,+,+,+,++,+,+,+,+,+,++,+,++,+,++,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+++,+,+,++,++,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,,+,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+,+,++,+,+,++,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,,+,+,+,+,++,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,++,+,,+,++,+,+,+,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,++,+,++,,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,++,++,,++,++,++,,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,++,++,+,+,+,+,+ ,+,+,++,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,++,,+,++,+,+,+,+,+,+,++,+,++,++,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+ ,+,,+,++,+,++,+,+,+,+,+,+,+,++,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+ ,+,+,++,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,++,,+,++,+,+,+,+,+,+ ,++,++,++,,+,+,+,+,+,++,,+,++,+,+,,+,+,+,+,+ +,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,,+,+,++,,+,+,+,+,+,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,++,+,+,++,+,+,+,+,+,+,+,++,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,++,,,+,+,++,+,+,+,++,++,+,+,+,+,+,++,+,++,+,+,+,+,+,+,,+,+,++,+,++,+,++,+,,+,+,++,+,+,+,+,,+,+,+,++,,++,,+,+,+,+,+,+,+,++,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,,+,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,+,+,+++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,,+ ,++,++,,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,++,,+,+,+,+,,++,+,++,+,++,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+ ,++,+,,++,+,+,+,+,,+,,+,+,+,++,++,+,+,+,++,++,+,+,+,+,++,+,+,+,+,+,+,+,,+,++,+,++,,+,+,+,+,+,+,+,+,++,++,,++,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,++,+,+,+,+,+,+ ,++,+,++,,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,++,+,+,+,++,++,+,+,+,+,+,++,+,++,+,+,+,+,+,+,,+,+,++,+,++,+,++,+,,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,++,+,+,++,++,+,++,+,++,+,+,+,+,+,,+,+,+,,+,+,+,+,+,+,++,,+ +,,+,,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,++,++,+,++,+,++,+,+,+,+,+,+,+,+,,+,+,++,,+,+,+,+,+,+,+,,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,+,++,++,+,+,,+,+,+,++,,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+++,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+++,+,+,+,+,+,++,+,+,+,+,+,++,++,,+,++,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,++,+,+,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,++,+,++,++,+,+,+,+,+,,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,,++,++,++,,++,,+,+,++,+,++,++,+,+,+,+,+,+,+ ,++,++,,++,+,+,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,++,+,+,+,+,+,++,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,+,++,+ ,++,++,++,,+,+,+,+,+,,+,+,+,+,+,+,++,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,,+,+,++,,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,,++,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,++,+,+,+,++,++,,+,+,+,+,++,+,+,+,,+,+,+,,+,+,++,+,+,++,+,++,+,+,+,+ ,+,++,++,++,+,+,+,+,+,+,+ ,++,++,+,+,,+,+,++,+,++,,+,+,,+,++,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,++,++,,,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,,++,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+ ,++,+,,++,+,+,+,+,,+,,+,+,+,++,++,+,+,+,++,++,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,,++,+,++,,+,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,++,+,+,+,+,+,+,+,,+,+,+,+,,++,,+,+,++,+,+,,++,+,+,,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,++,++,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+ ,+,++,,++,++,,+,+,++,+,+,+,++,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+ ,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,,+,+,+,+,+,+,+,+,++,++,,++,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,+,++,+,+,++,+,+,++,+,+,+,+,,++,,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,++,+,++,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+ ,+,,+,,++,+,++,+,+,+,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,++,,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,,+++,+,,+,+,+,+,+,+,++,+,++,+,+,++,+,,+,+,+,+,+,+,++,+,+,+,+,+,,+,,++,++,+,+,++,,+,+,+,+,+,+,+,+,+,,+,+,+,+,,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,++,+,++,,+,++,+,+,+,+,+,+,++,,++,+,++,++,+,+,+,++,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,,+,+,+,+,++,+,+,+,+,+,+,+ ,++,++,+,++,+,+,+,+,+,+,++,+,++,++,++,+,,+,+,,+,+,+,++,+ ,+,++,++,+,+,+,++,+,+,+,+,+,++,+,+,++,++,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,++,+,++,++,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,,+,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,+,+,+,+,+,+,++,,,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,,+,+,++,,+,+,++,+,+,++,++,+,+,+,++,+,+,++,+,++,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,,+,++,+,+,+,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,,+,+,+,+,++,+,++,,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,++,+,+,,+,+,+,+,+,+,+,+,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+ ,++,++,++,,+,+,,+,+,+,,+,+,+,+,+,+,++,,+,+,,+,++,+,+,+,+,+,++,+,,+,+,+,+,+,++,++,+,++,+,+,+,+,+,+,+,+,++,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,++,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+,+,+,+,+,++,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+ ,+,+,++,++,,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,++,+,+,+,+,+,++,,+++,++,+,+,+,+,+,+ ,++,++,++,,+,+,+,+,+,++,,+,++,+,+,,+,+,+,+,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,,+,+,+,+,,+,+,++,,+,+,+,+,+,+,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,++,+,+,+,++,++,+,+,+,+,+,++,+,++,+,+,+,+,+,+,,+,++,++,+,++,+,++,+,,+,+,++,+,+,+,+,,+,+,+,++,,++,,+,+,+,+,+,+,+,+,++,+,+,+,++,++,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,++,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,+,+ ,++,,++,+++,+,++,++,,+,++,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,,+,+,+,+,+,+,+,+,++,,+,+,+,+,,++,+,++,+,++,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+ ,++,+,,++,+,+,+,+,,+,,+,+,+,++,++,+,+,+,++,++,+,+,++,+,++,+,+,+,+,+,+,+,,+,++,+,++,,+,+,+,+,+,+,+,+,++,++,,++,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+ ,++,+,++,,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,++,+,++,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,++,+,+,++,++,+,++,+,++,+,+,+,+,+,,+,+,+,,+,+,+,+,+,+,++,,+,+,,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,++,++,+,++,+,+,++,+,+,+,+,+,+,+,,+,+,++,,+,+,+,+,+,+,+,,+,+,+,++,++,++,+,+,+,+,+,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,+,++,+,+++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,++,+,++,+,++,+,+,+,+,++,+,+,+,+,+,++,++,,+,++,+,+,+,++,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,++,+,+,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,++,++,+,+,++,+,++,++,+,+,+,+,+,,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,++,+,+,+,+,++,+,++,++,+,+,+ ,++,+,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+ ,++,++,,++,++,+,+,+,+,+,+ ,++,++,,++,+,+,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,++,+,+,+,+,+,++,,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,++ ,++,++,++,,+,+,+,+,+,,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,,+,+,+,,+,+,++,+,+,+,+++,++,+,+,+,+ ,+,++,++,++,+,+,+,+,+,+,+ ,++,++,+,+,,+,+,+,+,++,,+,+,,+,++,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,++,++,+,+,+++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+++,+,++,+,+,,++,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,++,+,+,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,++,++,,++,+,+,+,++,+,+,+,,+,+,+,,+,+,++,+,+,+,+,++,+,+,+,++ ,+,++,++,++,+,+,+,+,+,+,+ ,++,++,+,+,,+,+,+,+,++,,+,+,,+,++,++,+,+,+,,++,+,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,++,+,++,+,++,,++,+,+,+,+,++,+,++,++,+,++,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,,++,+,++,,+,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,+,,++,,+,+,++,+,+,,++,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,++,++,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,+,++,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+ ,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+ ,++,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+ ,++,++,,++,+,+,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,,+,,+,+,+,++,+,+,++,+,+,++,+,+,+,+,,+,+,+,+,++,,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,++,+,+,+,++,+,++,+,,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+ ,+,,+,,++,++,++,+,+,+,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,,,++,+,+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,,+,+,,+,+,+,+,++,+,++,+,++,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,++,+,+,++,,+,+,+,+,+,+,+,+,+,,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,++,,+,++,+,+,+,+,+,+,++,,++,+,++,++,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,++,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,++,+,+,+ ,++,++,+,++,+,+,+,+,+,+,++,+,++,++,+,+,,+,+,,+,+,+,++,+ ,+,++,++,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,+,+,+,+++,+ ,++,+,,++,+ ,++,++,,++,+,+,+,+,+,+,++,,+,+,++,+,++,+,++,+,+,++,++,+,+,+,+,+,++,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,,+,++,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,++,++,,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+++,+,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,++,+,+,+ ,++,++,++,+,+,+,+,++,++,+,+ ,++,++,++,,+,+,+,+,+,,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+,++,+,+,+,++,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+ ,+,+,++,++,,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,++,+,+,+,+,+,++,,+,++,+,+,+,+,++,+ ,++,++,++,,+,+,+,+,+,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+,++,+,,+,,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,++,+,+,+,++,++,++,+,+,+,+,++,+,++,+,+,+,+,+,+,,+,+,++,+,++,+,++,+,,+,++,++,+,+,+,+,,+,+,+,++,,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,++,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,++,+,,+,+,+,+,+,+,++,+,+,+,+,+,++,,++,++,++,,++,,+,+,++,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,,+,+,+,,+,+,++,+,+,+,++,++,+,+,+,+ ,+,++,++,++,+,+,+,+,+,+,+ ,++,++,+,+,,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,++,,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+ ,++,+,,++,+,+,+,+,,+,,+,+,+,++,++,+,+,+,++,++,+,+,+,+,++,+,+,+,+,+,+,+,,+,++,+,++,,+,+,+,+,+,+,+,+,++,++,,++,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++ ,++,+,++,,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,++,+,+,,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+,,+,++,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,++,++,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,+,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,,+,+,++,,+,+,++,+,+,++,++,+,+,+,++,+,+,+,+,+,,+,+,+,,+,+,+,+,+,+,++,,+,+,,+,++,+,+,+,++,+,+,+,,+,+,+,+,+,++,++,+,++,+,+,+,+,+,+,+,++,+,+,,+,+,++,,+,+,+,+,+,+,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,+,++,+,+,+,+,+,+,++,+,++,+,++,+,+,,++,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+++,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,++,++,,+,++,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,++,+,+,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,++,++,++,++,+,+,+,+,+,,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,++,+,+,+,,++,+,++,,+,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,++ ,++,++,,++,+,+,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,++,+++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,++,,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,++,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,+ ,++,++,++,,+,+,+++,+,+,,+,+,+,+,+,+,++,+,+,++,+,+,+,+,++,+,+,+,+,+,+,,+,+,+,+,,++,,+,+,++,+,+,,++,+,+,+,++,+,++,,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,,+,+,+,+,+,+,+,+++,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,++,++,,+,++,+,+,++,+,+,+,,+,+,+,,+,+,++,+,+,+,+,++,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+ ,++,++,+,+,,+,+,+,+,++,,+,+,,+,++,++,+,+,+,,++,+,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,,++,++,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,++,+,+,+,++,++,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,++,++,+,+,+,++,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,,++,+,++,+,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,++,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,,++,,+,+,++,+,+,,++,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,++,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,+,++,++,,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++ +,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,++,+,+,+,+,+ ,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,+,+,++,+,+,++,+,+,++,+,+,+,+,,+,++,+,+,++,+,+,++,+,+,++,+,+,+,+,,+,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,++,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+ ,+,,+,,++,++,++,+,+,+,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,+,+,,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,,+,+,,+,+,+,+,++,+,++,+,++,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+ ,+,,+,,++,++,+,+,++,,+,+,+,+,+,+,+,+,+,,+,+,+,+,,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,++,+,++,,+,++,+,+,+,+,+,+,++,,++,+,++,++,+,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,++,,++,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,++,+ ,++,++,+,++,+,+,+,+,+,+,++,+,++,++,+,+,,+,+,,+,+,,+,++,+ ,+,++,++,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,++,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,+,+,,++,+ ,++,++,,++,+,+,+,+,+,+,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,,+,++,+,+,++,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,+,+,+,+,+,+++,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,+,+,+,+,++,+,+,+,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+,+,+++,+,+,++,+,+,+,+,++,+,+,+ ,++,++,++,+,+,+,+,++,++,+,+,+++,+,+,+ ,+,,+,,++,+,++,+,+,+,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,++,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+,++,+,+,+,++,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+ ,+,+,++,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,++,,+,++,+,+,+,+,+,+ ,++,++,++,,+,+,+,+,+,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+++,,+,+,+,++,+,+,+,+,+,+,+,++,++,,+,+,+,+,+,+,++,+,++,++,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,++,+,+,+,++,++,++,+,+,+,+,++,+,++,+,+,+,+,+,+,,+,+,++,+,++,+,++,+,,+,+,++,+,+,+,+,,+,+,+,++,,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+++,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+++,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,++,+,,+,+,+,+,+,+,++,+,+,+,+,+,++,,++,++,++,,++,,+,+,++,++,+,+,+,+,+,++,+,++,+,+,++,+,,+,+,+,+,+,+,++,+,+,+,+,+,,+,,++,++,+,+,++,,+,+,+,+,+,+,+,+,+,,+,+,+,+,,+,,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,++,,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+ ,++,+,,++,+,+,++,+,,+,,+,+,+,++,++,+,+,+,++,++,+,+,+,+,++,+,+,+,+,+,+,+,,+,++,+,++,,+,+,+,+,+,+,+,+,++,++,,++,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,++,+,,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,++,+,++,,+,++,+,+,+,+,+,+,++,,++,+,++,++,+,+,+,+,,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+++,+,+,,+,+,++,,+,+,++,+,+,++,++,+,+,+,++,+,+,++,+,+,,+,+,+,,+,+,+,+,+,+,++,,+,+,,+,++,+,+,+,+,+,+++,+,,+,+,+,+,+,++,++,+,++,+,+,+,+,+,+,+,+,++,+,,+,+,++,,+,+,+,+,+,+,+,,+,+,+,++,++,+,+,+,+,++,+,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,++,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,++,,+,++,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,++,+,+,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,++,+,++,++,+,+,+,+,+,,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,++,+,,+,+,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+ ,++,++,+,++,+,+,+,+,+,+,++,+,++,++,+,+,,,++,+,+,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,++,++,+,+,+,+,++,,+,+,+,++,+,+,+,+,+,+,+++,+,+,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,+ ,++,++,++,,+,+,+,+,+,,+,+,+,+,+,+,++,+,+,++,+,+,+,+,++,+,,+,+,+,++,+ ,+,++,++,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,,+,,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,++,++,,+,+,++,+,++,+,+,+,,+,+,+,,+,+,++,+,+,+,+,++,+,+,+,+ ,+,++,++,++,+,+,+,+,+,+,+ ,++,++,+,+,,+,+,+,+,++,,+,+,,+,++,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,,++,+,++,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,++,++,++,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,,++,+,++,,+,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,++,+,,+,+,+,+,,++,,+,+,++,+,+,,++,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,+,++,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,,+,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,+,+,+,+,+,+,++,,++,+,++,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,+,+,++,++,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,+,+,+,+,+,+,+,+,+,+++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+ ,+,,+,,++,+,++,+,+,+,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,+,+,++,+,,+,++,+,+,+,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,,+,+,+,++,+,++,,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,,+,,++,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+++,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,,+,+,,+,+,+,+,+,+++,++,+,++,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,,+,,++,++,+,++,++,,+,+,+,+,+,+,+,+,+,,+,+,+,+,,+,+,+,+,+,+,+,+++,+,+,+,++,+,+,+,+,+,+,+,++,+,++,,+++,++,+,+,+,+,+,+,++,,++,+,++,++,+,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+ ,++,++,+,++,+,+,+,+,+,+,++,+,++,++,+,+,,+,+,,+,+,++,++,+ ,+,++,++,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,+,,++,+ ,++,++,,++,+,+,+,+,+,+,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,,+,++,+,+,+,,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+++,+,+,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,++,,++,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,++,+,+,+ ,++,++,++,+,+,+,+,++,++,+,+,+,++,++,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+ ,++,++,++,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,++,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+,+,+,+,+,++,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+ ,+,+,++,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,++,+,+,+,+,+,++,,+,++,+,+,+,+,+,+,++,++,+,+,+,+,+,+,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,,+,+,+,+,+,+,++,+,+,++,+,++,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+++,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,++,+,+,+,++,++,+,+,++,+,+,++,+,++,+,+,+,+,+,+,,+,+,++,+,++,+,++,+,,+,+,++,+,+,+,+,,+,+,+,++,,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,+,+,++,,++,++,++,,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,++,+,,+,+,+,++,++,+,+,+,++,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+ ,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,+,++,+,++,++,,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+ ,++,+,,++,+,+,+,+,,+,+,+,+,++,++,+,+,+,++,++,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,+,+,+,++,++,,++,++,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,++,+,+,+,+,+,++,,++,++,+,+,+,+,+,+ ,++,++,++,,+,+,+,+,+,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,++,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,,+,+,++,,+,+,++,+,+,++,++,+,+,+,++,+,+,+,+,+,,+,+,+,,+,+,+,+,+,+,++,,+,+,,+,++,+,+,+,+,+,++,+,,+,+,+,+,+,++,++,+,++,+,+,+,+,+,+,+,+,++,+,,+,+,++,,+,+,+,+,+,+,+,,+,+,+,++,++,+,+,+,+,+,++,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,++,+,+,+ ,++,+,,+,,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,++,,+,++,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,,,++,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,++,+,++,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,++,+,++,++,++,+,+,+,+,,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,++,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,++,+,+,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,++,+,+,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,++,+,+,+,++,,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,+ ,++,++,++,,+,+,+,+,+,,++,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,++,+,++,+,+,+,+,+,+,,+,+,++,+,++,+,++,+,,+,+,++,+,+,+,+,,+,+,+,++,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,,+,,+,+,+,+,+,+,+,+,+,++,+,++,+,+,++,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,,+,+,+,,+,+,++,+,+,+,+,++,+,+,+,+ ,+,++,++,++,++,+,+,+,+,+,+ ,++,++,+,+,,+,+,+,+,++,,+,+,,+,++,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,,++,+,+,+++,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,++,+,++,++,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,,++,+,++,,+,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,++,,+,+,++,+,+,,++,+,+,+,+,+,++,,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,+,++,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+ ,+,+,+,+,,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,+,+,++,,++,++,++,,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,++,+,+,++,+,+,+,+,,+,+,+,+,+,+,+,,+,,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,++,+,+,++,++,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,++,,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+ ,+,,+,,++,+,++,+,+++,+,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,+,+,+,+++,+,+,+,+,+,+,++,,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,,++,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,+,+,+,+,,++,,+,+,+,+,++,+,+,+,+,+,++,,+,+,,+,+,+,+,+,+,++,+++,++,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,,+,,++,++,+,++,++,,+,+,+,+,+,+,+,+,+,,+,+,+,+,,+,+,+,+,+,+,+,+,,+,+,+,++,+,+,+,+,+,+,+,++,+,++,,+,++,+++,+,+,+,+,+,++,,++,+,++,++,+,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+ ,++,+,,++,+,+,+,+,,+,,+,+,+,++,++,+,+,+,++,++,+,+,+,+++,++,+,+,+,+,+,+,+,,+,++,+,++,,+,+,+,+,+,+,+,+,++,++,,++,++,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,++,,+,+,++,+,++,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,++ ,++,++,+,++,+,+,+,+,+,+,++,+,++,++,+,+,,+,+,,+,+,+,+,+ ,+,++,++,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+ ,++,+,,++,+,+,++,,++,+,+,+,+,+,+,++,,+,+,++,+,++,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+++,+,+,+ ,++,+,++,,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,++,+,+,+ ,++,++,++,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,+,+,,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,++,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+,+,+,+,++,++,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+ ,+,+,++,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,++,+,+,+,+,+,++,,+,++,+,+,+,+,+,+ ,++,++,++,,+,++,+,+,+,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,++,+,++,+,+,+,+,+,+,+,++,++,,+,+,+,+,+,+,++,+,+,+,+,+++,+,+,+,+,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,++,+,,++,+,+,+,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,++,+,+,+,++,++,+,+,+,+++,+,++,+,++,+,+,+,+,+,+,,+,+,++,+,++,+,++,+,,+,+,++,+,+,++,+,,+,+,+,++,,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,,+,+,++,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,+,+,++,,++,++,++,,++,,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,++,+,+,++,++,+,+,++,++,+,+,+,+,+,,+,+,+,,+,+,+,+,+,+,++,,+, +,,+,++,+++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,+,+,++,++,++,,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+ ,++,+,,++,+,+,+,+,,+,,++,+,+,++,++,+,+,+,++,++,+,+,+,+,++,+,+,+,+,+,+,+,,+,++,+,++,,+,+,+,+,+,+,+,+,++,++,,++,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+ ,++,+,++,,+,++,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,++,++,+,++,+,+,+,,++,,+,+,+,+,+,+,,+,+,++,,+,+,+,+,+,+,+,,+,+,+,++,++,++,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+++,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,++,+,++,++,+,+,+,++,+,+,+,+,+,,+++,+,+,,+,+,+,+,+,+,++,,+,+,,+,++,+,+,+,+,+,+,+,,+++,+,+,+,+,++,++,+,++,+,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,+,+,+,+,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,++,++,,+,++,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,++,,+,++,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,++,+,+,++,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,++,+,+,+,+,+,++,+,+,+,++,+,+,+,++,+,++,++,++,+,+,+,+,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,++,+,+,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+++,+,+,++,,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,+ ,++,++,++,,+,+,+,+,+,,+,+++,+,+,+,+,++,+,+,++,+,+,+,+,+,++,++,+,+,++,+,+,++,++,+,+,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,,+,,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,++,++,+,++,+,+,+,++,++,,+,+,+,+,+ ,+,++,++,++,+,+,+,+,+,+,+ ,++,++,+,+,,+,+,+,+,++,,+,+,,+,++,+,+,+,+,,++,,,+,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,,++,+,+,+,++,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,,++,+,+,++,+,++,+,++,,++,+,+,+,+,++,+,++,++,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,,++,+,++,,+,+,+,++,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,++,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,+,++,++,,+,+,++,+,+++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+ ,+,+,+,+,,+,+,+++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,++,++ ,++,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+ ,++,++,,++,+,+,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,++,+,++,+,+,++,+,+,+,+,,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,++,+,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,++,,+,+,++,,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,++,,+,+,+,+,+,+ ,+,,+,,++,+,++,+,+,+++,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,++,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,,+,+,,+,+,+,+,+,++,+,+,+,+,+,++,+,++,,+,+,+,+,+,+,+,+,+,,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,++,,+,++,+,++,+,+,+,+,++,,++,+,++,++,+,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,++,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,++,,+,+,++,+,++,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,+,++,+,+,+,+,+,+,++,+,++,++,+,++,+,+,+,+,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,++,,+,+,++,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+ ,++,+,,++,+,++,++,,+,+,+,+,+,+,+,++,,+,+,++,+,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,++,,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,+,,+,+,+,++,+,+,+,+,+,++,+,,+,++,+,+,+,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,++,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,++,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+ ,++,++,++,+,+,+,+,++,++,+,+,+,++,+,++,++,++,,+,+,+,+,+,,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,++ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+ ,+,+,,+,++,+,+,+,+,++*+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,,+,++,+,+,+,+,+,+ ,++,++,++,,+,++,+,+,+,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,++,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,+,+,+,++,+,++*++*+*+*++,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,++,+,+,++,+,+,+,+,+,++,,++,++,++,,++,,+,+,++,+,++,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,,+,+,+,,+,+,++,+,+,+,+,++,+,+,+,+ ,+,++,++,++,+,+,+,+,+,+,+ ,++,++,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,,++,+,+,+,,++,+,++,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+*+++*+*++*+*+*+*+*+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+ ,++,+,++,,+,++,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,,+,++,+++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,,+,++,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+,++,,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++*+*+*++*+*+*+*+*++*+*+*+*+*+*+**+*++,+,+,,+,++,+,+,+,+,+,+,+,,+,++,+,+,+,++,++,+,++,+,+,+,+,+,+,+,+,+,+,,+,++,++,,+,+,+,+,+,+,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+ ,+,++,++,,+,+++,++,+,+,,++,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,++,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+++,+,+,+,+,+,+*+*++*+*+*+*+*+**+*+*+*+*+*+*+*++*+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,++,+,++,++,+,+,+,+,+,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,+,+,+,+,+,+,,++,+,++,,+,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,++,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,+,+++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,++,+,+,+,+,++,+,+,+*++*+*+*+*++*+*++*+*+*+*++*+,+,+,+,+,++,++,+,+,++,+,+,++,,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,+ ,++,++,++,,+,+,+,+,+,,+,+,++,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,,++,,+,+,++,+,+,,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,+*+*+*+*+*+*+*+*+*+*+*+*+*+*++*++*+*+**+*+*+*+*++*+*+*+*+*++*+*+,+,+,++,,+,+,,+,++,+,+,+,+,,++,++,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,,++,+,+,+,+,+++,++,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+,+,++,++,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,+,++,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,,++,+,++,,+,+,+,+,++,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,+,++,+,+,+,+,+,+*++*+*+*+*++*+*++*++*++*+*++*++**+*+*++*+*+**+*+ *++*+*++*+*+*+*+*++*+*+*+*++*+*+*++*+*+*+*+*+,+,+,+,+,++,++,++,+,+,++,+,+,,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,+,++,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+ ,+,+,+,+,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,++,++,+,+,+ ,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,++,+,+,++,+,+,++,+,+,+,+,,+,+,++,,+,++,+,+,++,+,+,+,+,,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+*+*+*+*+*+*+*+*+*+*+*++*+*+*++**+*+*+*+*+*+*+*+*+*+*+*+*+*+*+++*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+,,++,+,++,+,+,+,++,,+,+,++,,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,++,,+,+,+,+,+,+ ,+,,+,,++,+,++,+,+,+,++,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,+,+,+,+,++,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,++,+,+,++,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,++,+,+,+,+*+*+*+*++*+*+*++*++*+*++*+*+*+*+*+*+*+* +*++**++*++*+*+*+*+*+*+*+*+*+*+*+*++*+,+,+,+,+,+,+,+++,++,+,+,+,+,+,+,+,++,+,++,,+,++,+,+,++,+,+,+,++,,++,+,++,++,+,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,++,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+++,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,++,,+,+,++,+,+,++,+++,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+ ,++,++,+,++,+,+*+*+*+*++*+*+*+**+*+*+*+*+**+*+*+*++*+*++*+*+*+*++*+*+*+*+*+**+*+*+*+**++*+*+*+*+,++,++,+,+,+,++,,+,+,+,++,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,++,+,+,+,+,+,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,,+,+,+,+++,+,+,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+++,+,++,+,+,+,+,+,++,+,,+,++,+,+,+,+,+,++,+,,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,,+,+,+,+,+*++*+*+*+*+*+*++**++*+*+**+*+*+**+*+*+*+*++**++*+*+*+*+*+*+*++*+*+*+*+*+*+*++*+*+*+*+*+*+*+*+*+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+ ,++,++,++,+,+,+,+,++,++,+,+,+,++,+,++,+,+ ,+,,+,,++,+,++,+,+,+,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+*+*+*++*++*+*+*+*+*+*+*+*+*+**+*+**++*+*+*+*++*+*+*+*+*+*++*+*++*+*+*++*++**+*+*+*+*+*+*+**+*+*+*+*++*+*+*+**+*++*+*+*+,+,+,+,+,+,+,++,++,+,+,+,+,++,,+,++,+,+,+,+,+,+ ,++,++,++,,+,+,++,+,+,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,,+,+,,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+*+*+*+*+*++*+*+*+*+*+*+*++*++*+*+* +*++*+*++**+*+*+*++*+*+*+*+*+*+*+*++*+*+*++*+*+*+*+*+*++*+*+*+*+*+*+*++*+*+*+*+*+*+*+*+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,+,++,+,++,+,+,+,+,+,++,,++,++,++,,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,,+,,++,++,+,+,++,,+,+,+,+,+,+,+,+,+,,+,+,+,+,,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,,+,++,+,+,,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+*++*+*+*+*+*++*+*+*+*+*+*+*+*+*+**+*+*+**+*+*+*+*+*+*+*+*+*+*++*+*+*+*++*+*+*++*+*+**++*+*+**+**+*+*+*+*++*+*+*+*+*++*+,+,+,+,+,++,+,+,++,,+,+,+,+,+,+,+,+,+,+ ,++,+,++,,+,+,+,,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,++,,+,++,+,+,+,+,+,+,++,,++,+,++,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+,++,+,,+,+*+*+*+*+*+*+*+*+*++*+*+*+*+*+*+*+*+*+*+***+**+*+**++**+**+*++*+*+* +**+**+**+*+*+*+*+*+**+*+*+**+*+**++*+*+*+*+*+*+*+**+*+*+*+*++*+*+*+*+*+*+*+*+*+*+,+,+,++,+,+,++,++,+,++,+,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,+,+,+,+,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,++,++,,+,++,++,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++*+*+*+*+*+*+*+*+*+**+*+*+*+*+*++**+*+* +**+**++*+*+*+*++**+*+*+*++*+*+*+ *++**+*+*+*+*+*+*+*+*+*+**+*+*+*+*+*+*++**+*+*+*+*+*+*+*++**+*+*+*+*+*+**+*+*++*+**+*++*+**+,+,++,+,++,+,+,+,++,+,+,+,++,+,+,+,++,+,++,++,+,+,+,+,+,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,+,+,+,++,+,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,++,++,+,+,+,+,+,+,+ ,++,++,+,++,+,+,+,+,+,+,++,+,++,++,+,+,,++,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,++*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+ *+*+**+**++**+**+*+*+*+**++**+ *++**+**+*+**+*+*+*+*+*+*+*+*+*+* +*+*++**+*+*+*+*++*+** +*++**+**+*+*+*+*+*+*++**++**++*+*+*+*+*++,+,+,++,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,+ ,++,++,++,,+,+,+,+,+,,+,+,++,+,+,+,++,+,+,++,+,+,+,+,+,+,+,++,+,,+,+,+,++,+ ,+,++,++,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,,+,+,+,+,+,+,+,+,+,+,+,++*+*+*+*+*++*+*+*+*+*+*+*+*+*+**+*+*+*++*+**+*+*+*+*+*+**+*+*+**+*++*+*+*+*++*+*+**+*+*+*+*+*+*+**+*++*+*+ *+*+**+**++*+*+**+*++*+*+*+*++*+*+*+*++*+*+*+ *+*+*++**+**+*+*+**+*+*+*+*+*+*+*+*+,++,+,++,++,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,,++,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,++,+,++,++,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,,++,+,++,,+,+,+,+,+,++,+++,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,++*+*+*+*+*+*+*+*++*+*+*++*+*+*++**+*+*+**+*+*+*++**+*+*+*+ *++*+*+**+*+*+**++*+ +*+**+*++**+*+*+**+*+*++**+*+*+*++*+*+*+*+**++*+*+*+**+**+*++*+*+*++*+*+*+*+*+*++*+*+** *++**+*++*++* +**+*+*+*++*+*+*+**+*+*+*+*+**+*+*+*+*+,+,+++,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,+,++,++,,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+ ,+,+,+,+,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,++,+,+,+,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,+,+,+,+,+,+,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,,++,++,+,+,++,+,+,+,+,,+,+,+,+,+,+,+,,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++*+*++*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*++*++*+*+*++*+*++**+**++**+*+*+*+*+*+**+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+**+*+*+*+*++**++*+*+*+*+*+*+*+*+*++*+,+,++,+,++,+,+,+,++,,+,+,++,,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,++,,+,+,+,+,+,+ ,+,,+,,++,+,++,+,+,+,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,+,+,+,+,+,++,++,+,+,+,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,++,+,++,,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,,+,+,+,+++,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,+,+,+,+,+*+*+*+*+*+*+*+*+**++*+*+*+*+**+*+*++*+*+**+*+*++*+**++*+*+*+*+*+*+**+**+*+*+*+*+*++*+*+*+*+*+*+*+*+**++*+*+*+*+*+*+ *++*++**+**+*+*+**++*+**++*+*+*+*+*+*++**++*+*+*+*+*++*+*+*+*+*+*+*+*+*++*++*+*+*++*+*++,++,+,+,+,+,+,+,+,++,+,++,,+,++,+,+,+,++,+,+,++,,++,+,++,++,+,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,++,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+**++*+*+*+*+*+*+**+**+**+**+*+*+*+*+*+*++*+*+*+**+*+*++*+*+**+*+*+*+*+*+*+*+*+*+*+**+*+*+*+**+*+*+*+*+*+*+*+**+*+**+*+*+*+*+**+*+*+ *+**+**+**+*+*+*+*+*+*+**+*+*+*+*+*+*++*+*+*++*+*+,++,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,+,,+,+,+,+,+,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,++,+,+,+,+,+,+,+,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,++,++,+,+,+,+,+,++,+,,+,++,+,+,+,+,+,++,+,,+,+,+,,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+*+*+*+*+*+*+*++* +*+*++*+*+*+*+*+**+*+*+*+*+*+**+*+*+*+*+*+*+*+**+*+**+**+*+*+*+*+*+*+*+**+*+*++*+*+*+*+*+*+*+**++*+*+**+*+*+*+*+*+*+*+*+ *+**++**+*+*++**+*+**+*+*+*+*+*++,+,+,++,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,,+,+,+,++,+,+,+ ,++,++,++,+,+,+,+,++,++,+,+,+,++,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+ ,++,++,++,+,+,++,+,++,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+*+*+*+**+*+*+**+*+*+*+*+*+*+*+**+*+*+*+*+*+*+*+*+*+*+*+**+*++*+**+*+*+**+**+*+*+*+*+*+*+*+**++*+*+*+*+*+**+*+*+*+*+**+*+*++*+*+**+*+*+*+*+*+*+*+*+*+*+*+ *++*+*++*+*+*+*+*+*+,++,+,+,++,,+,++,+,+,+,+,+,+ ,++,++,++,,+,+,+,+,+,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,+,+,++,++,+,+,+,+,+,+,++,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+++,++,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+ +,,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,,++,+,+,+,+,+,+,+,+,+,+,+,+*+*+*+++*++*++*+*+ *+*+**+*++*++*+*+*+*+*+*+*+*+*+*++*++*+*+*+**++*+*+*+**+*+*+**+*+**+*+*+*+*+*+*++*+**+*+**+*+*++*+*+**+*+* +*+*++*+**+*+*+**+*++*+*+*+*+*+*+*+*+*++*+**+*+*+*+*+*+*+*+*++,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,+,+,+++,++,+,+,+,+,+,++,,++,++,++,,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+ ,+,+,++,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,++,+,,++,+,++,+,+,+,+,+,+,+,+*+*++*+*+*+*+ *+*++*+*++*+*+*+*+*+*+*+**+* +*+*+**+*++*++*+*+*+* +*++*++**+*+**+*+**+**+*+*+*+**+*+*+*+*+**+*+*+*+*+*+*++*+*+**++*+*+*+*+***+*+*+*+*+*+**+*+*+*+*+*+*+*+*+*+*++*+*++*+*++*+*+*+*+*++,+,+,+,+,+,+,+,+,+,+ ,++,+,++,,+,+,+,++,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,++,+,+,+,+,+,++,+,+,+,+,+,++,,+,++,+,+,+,+,+,+ ,++,++,++,,+,+,+,+,+,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+*++*+*+*+*+*+*+*+**+*+*+*+*+*++*+*+**+*+*+*+*+**+*+*+**+*+*+*+*++*+**+*+*+**++*+**+**+*+*+*+*+*+*+*+*++*+*+*++***+*+*+*+*+*+*+*+*+*+*+*+*+**+*+*+*+**+*+*+*++,++,++,+,++,+,+,+,+,+,+,+,+,+,+,,+,+,++,,++,+,+,+,+,+,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,+,+,++,+,,+++,+,+,+ ,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,++,++,,+,++,+,++,+ ,++,+,,+,,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+*+*+*+*+*+**++*+*+*+*+*+*+**+*+*+*+**+*+*+*+**+*+*+**+**+*+*+*+*+*+**+*+*+*++*+*+*+*+*+*+*+*+*+*+*+*+**+*+*+**+*+*+*+*+* +*+*+**+*+**+*+*+*+*+*+*+*+*++,+,++,+,+,+,++,+,+,+,++,+,++,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,++,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+*++*+*+*+*+*++*+*+*+*+*+*+*++**+*+*+*+*+*+*+*+*+**++*+*+*+*+*+*+**+***+*+*+*+*+*+*+*+*+*+*+*+*+**+*+*+*+*+**++*+**++*+ *+*+*++**++*+*+*+**+*+*+*+*++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+++ ,+,,+,,+,++,+,+,++,+,+,++,++,+ ,++,++,++,,+,+,+,+,+,,+,+,++,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,++,++,+,++,++,+,+,+,+,+,++,+,++,+,+,+,+,+,+,,+,+ ,++,+,++,+++,++,+,,+,+,++,+,+,+,+,,+,+,+,++,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,,+,,+,+,+,+*+*+*+**+*+*+**++*+**+**+ *++*+**++**+*+*+*+*+*+**++*++*+*+*+**+*+*+*+*+*+*+**+* +**+**+*+*++*+*+*+*+*+*+**+*+*+*+*++*+*+*+*+*+*++*+*++,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,,++,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,++,++,++,++,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+++,+,+,+,+,+,+,+,+,+,+,+,,++,+,++,,+,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+*+*+*++*+*+*+*+**+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+**)*+*+**+*+*+*+**+*+**+*+*+*+*+**+*+*++**+*+*++**+**+*+*+**++*+*++*+*+*+,++,,++,+,+,++,,+,+,++,+,+,+,++,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+ ,+,+,+,+,,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,++,+,+,++,++,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,+,+,++,,++,++,++,,++,,++,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,++,+,+,+,+,,+,+,+,+,+,+,+,,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+*+*+*+*++*+*+*+*+*+*+*++*++*+*+*++*++*+*++*++**+*+*+*+**+*+*+*+*+*+**)*)*)**+*+*+*+*+*+*+**+*+*+*+*+*+**+**+*+*+*++*+*+*+*+*++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,++,,+,+,+,+,+,+ ,+,,+,,++,+,++,+,+,+,+,+,++,+,+++,+,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,,++,+,++,+,+,+,++,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,,+,+,+,+,++,+,+,,+,+ ,+,++,,+,+,+,+,+*+*+*+**+*++*+*+*+*++*+*+*++*+*+*+*+*+*+*+*+*+**++*+*++*+*+*+*+**)*)*)*)*)**+*+*+*++*+*+*+*++*+*+*+*+*+*+ *+**++*+*++*++*+*+**+*+*+*+*+**+*+*+*+*+*++*+*+,+,+,++,+,++,,+,++,+,+,+,+,++,+,++,,++,+,++,++,+,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,++,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,++ ,++,+,,++,+,+,+,+,,+,,+,+,+,++,++,+,+,+,++,++,+,+,+,+,++,+,+,+,+,+,+,+,,+,++,+,++,,+,+,+,+,+,+,+,+,++,++,,++,++,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+*+*+*+**+*+*+*+*+* *+**++*+**+*+*+*+*+**+*+**+**+*+*++*+*+*+*+*)**)**)*)*)*)*)**+*+*+*+*+*+*+**+*+*+*+*+**+*+*+*+*+ *+*++**+*+*++*+*+*+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,+,++,+,+,+,+,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,++,+,+ ,++,+,++,,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,++,+,+,+,+,++,+,,+,++,+,+,+,+,+,++,+,,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+*+*+*+*+*+*+*+*+*++**+*++*+* +**+**++*+*++*+*+*++*+*+**+**++*+*+*+*+**)*)*)*)**)*)*)*)*)*)**+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*++*+*+*+*+,+,+,++,+,+,+,+,+,+,+,+,++,+,++,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+ ,++,++,++,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+++,+,+,+,+,+,,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+++,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+ ,++,++,++,+,+++,+,+,+,+,+,+,+,+*+ *+*+*+**++*+*+*++**+*+**+*++*+*++*+*+*+*+*+*+*+*+* +*+*++*+**+*+*+*+*+*)*)**)**)*)*)*)*)*)**)*)*)*)*)*)*)*)*)**+*+*+*+*+*+**++**+*+*+**+*++**+*+*+*+**+*++*++**+*+,+,++,+,+,+,+,+,+ ,++,++,++,,+,+,+,+,++,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,+,+,++,+,++,+,+,+,+,+,++,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,+,+,+,++,,++,+,+,+,+,+,+,+,+*+*+*+*+*+*+*+*+*+*+*+*+*++*+*+*+*+*+**+*+**+**+*+*+*+*+*+*)*)**))**)**)*)*)*)*)*)**)*)*)*)*)*)**)*)*)*)**)*)*+*+*+*+*+*+**+**+*+*++*+*+*+*+*+*+*++*+*+*++**+*+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,+,+,++,++,+,+,+,+,+,++,,++,++,++,,++,,+,+,++,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,,+,+,++,,+,+,++,+,+,++,++,+,+,++,++,+,+,+,+,+,,+,+,+,,+,+,+,+,+,+,++,,+,+,,+,++,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,++,+,,++,+,++,+,+,+,,+*+*+**+*++*+*+*+*+*+*+**+*+*+**+*+*+*+*+*+*)*)*)*)*)**)*)*)*)*)*)*)*)*)*)**)*)*)*)**)*)*)*)**)*)*))*)*)**+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*++*+,+,+,+ ,++,+,++,,+,+,+,+,,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,,++,+,+,+,+,+,,+,+,+,+,+,++,++,+,++,+,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,+,+,+,+,+,,+,+,+,++,++,+,++,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,,+,+,++,+,+ ,++,++,++,+*+*+*++*+*+*++*++*++*+*+*+*+*+*+*+ *++*+*+*+**+*+*+*+*+*+*+*+*+*+*)**)*)*)*)*)*)**)**)*)**)*)**)**))*))*)**))**)*)*)*)*)**)*)*)**)*)*)**))*)*)*)*)*)*)*)*)*+*+*+*+*+*+* +*+*+**+*++*+**+*+*+*+*+*+*++**+*+*+**++*+*+,+,+,+,+,+,+,+,,+,+,++,,+,+,+,+,+,+,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,+,+,++,+,,+,,+,+,+ ,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,++,++,,+,++,+,+,+,+++,+,+,+,+,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,+,++,+,+,+,+,,+,+,++,+,+,+,+,+,++,++,,+,++,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,++,+,+,,++,,+,+*+*+*+*+*+*+*++**+*+*+*+*+**+*+*+*+*)*)*)*)*)*)*)*)*)*)**)*)**)*)*)*)*)*)**)*)*)*)*)*)**)*)*)*))*))**)*)*)*)*)*)*)*)*)*)*)**)*)*)*+*+*+*+*+*+*+*+**+*+*+*+*++**++*+*+*+*+*+*+,+,++,++,+,+,+,+,+,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+++,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+*+*++*+*+*+*++*++**+*+*+*++**+*++*+*+**+*+*+*+*+**+*+*)*)*)*)*))*)*)**)*)*)*)**)*)*)*)*)*)*)*)**)*)*)*)*)*)*)* )**))*))*))*)**)*+**+*+*+*+*+*+*+*++*+**+*+*++*++*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,+ ,++,++,++,,+,+,+,+,+,,+,+,+,+,,+,+,++,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,++,++,+,+,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,++,+*+*++**+*+*+*+*+*+*+*+*+**+*+**+*+**+***+**+*+*+*+*+*)*)*)*)*)*)*)*)**)*)*)**)*)*)**)**)*)**)**))*)*))*)*)*)*)*))**)*))*)**)*)*)*)*))*))*)*))*)**)*)*)*)*)**)*)*)*)**)*)*)*)*)*)*)*)*)*+*+**+*+*+*+*++**+*+*+*+**+*+*++*++*++*+*+*+**+*+ *+**++*++**++*+*+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,,++,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,++,+,+++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,++,+,++,+,++,,++,+,+,+,+,++,+,++,++,+,+,++,+,+,+,+,+,+,+,+,+,+,,++,+,++,,+,+,+,+,+,++,+,++,+,++,+,+ ,++,++,+,+,+,+,+*+*+*++*++*+**+**++*+*+*+*+*+*+*+**+**++*+*+*)*))*)*)*)*)*)**)*)*)*)* )**)*))*)**))*)*)*)*))*)*)* )*)**)*)**)*)*)*)**)*)*)*)*)*))*)*))*)*)*)*)*)*)**)*)*)*)**)**))*)*)*)*)*)*)*+* +**+**+*+*+**+*+*+*+**++*+*+*+++*+*+*++**+*++**+*+**+*+,+,+,+,++,+,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+ ,+,+,+,+,,+,+,+,+,+,+++,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,++,+,+,++,+,++ ,++,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+ ,++,++,,++,+,+,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,++,++,+,+,+,+,,+,+,+,+,+,+,+,,+,+,+,+,+,+,++,+,+,+,+,++,+*+*+*+*+*+*+*++**+**+*+*+*++*+*+**+**+*+*++*+**+*+*+*)*)*)*)*)*)**))*)* )**)*))**)*)*)*)**)*)*)**)**))*)*)*)*)*)**)*)*)*)*)*)*)*)*)*) *))**))*)*)*)*)*)*)*)*)*)*))*)*)*)*)*)*)*)*+*+*+*+*+ *++**+*+**+*+**+*+*+*+*+*+*+*+*+*+*+*+,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+ ,+,,+,,++,+,++,+,+,+,+,+,++,+,+,++,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,++,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,,+,+,+,+,+,+*+*+*+*++*+*+*+*++*+*+*+*+*+*+**+**+*+*+*)*)*)*)*)*)*)**)*)*)*)*)**)*))*)* )**)*)**)*)*))*)*)*))*)*)*)*)**))**)**))**)*)*)*)*)*)**)**)* )*)*))**))*)*))*)*)*)*)*)*)*)**)*)**)***)*)*)*)*)*)*)*)*)*+*+*+*+*+**+*+*+*+*+*++*+**+**+*+*+*+*++*+*+*+,+,++,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+ +,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+*+*+*++*+*+*+*+*+*+*+*+**+*+*+*+**+*)*)*)*)*)*)**)*)*)*)*))*)*)*)*)*)*))*)*)**)*)*))***)**)*)*)*)*)*)*)*)*)**)*)*)*)*)*))*)*)*)* )*))*)*))*)*)*)*))*)*)*))*))* )*))*))*))*)*)*)*)*)**)*)*)*)*+*+*+*+*+*+*+*+*+*+*+*+*+*++**+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,+,+,+,+,+,+,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,++,+,++,++,++,+,+,+,+,+,++,,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,+,++,++,++,+,+,+,++,+,,+,++,+,+,+,+,+,++,+,,+,+,+,+,+,++,+,+,+,+,+*++*+*+*+*+**+*+**+*++*+*+*+*+*+**+*)**)*)*)*)*)*)**))**)*)*)**)*)*))**)*)*)*)**)**)*)*)*)*)*)*)**)*)*)**)*)**)*)*)*)*)*)*)*)*)*)**))*)*)*)*))*)*)*)**)*)*)*)*)*)*)*+*+*+*+*+*+*+**+*++*+*+*++**+*+*+*+**+*+,+,+,++,+,++,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+ ,++,++,++,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,++,,+,+,+,+,+,,+,+,+,+,+,+,++,+,+,++,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+++,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+*+*+*+*+*+* +**+**++*++*+*+*+*+*+*)*)*)**)**)*)*)*)*)*)*)*)*)*)*))*)*)*)*)*)*)*)**))*)*)*)*)*)*)*)*)*)*)*)*)*)*))**))*)*)*)*)*)*))*)*)*))**))*)*)*))*)*)*)*)*))*)*))*)*)*)*)*)*)*)*)*)*)*)**)*)*)*+**+*+*+*+*+*++*+*++*+*+**+*+*+**+*+,+,+,+,+,+,+,++,,++,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,+,+,++,+,+,+,,+,+,+,+,++,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,,+,,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,++,,+,+,+*+*+*+*+*++*+*+*+*++**+*+*+*+*+*+*+*+*+*+*+*+**)*)*)*)*)**)*)*)**)*)*)*)*)*))*)*)*))*))*)*)**))*))**))*))*)*)*))*)*)*)*)**) *))*)*))*)*) *)*))*)**))*)*)*)*)*)*)*)*)*)*)*)*))*))*)*)*)*)*)*)*)*)**)**)*)*)*)*)*)*+**+*+*+*+*+*++*+*+*+*+*+*+*+*++**+*+*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,+,+,++,,++,++,++,,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,,+,+,+,,+,+,++,+,+,+,+,++,+,+,+,+ ,+,++,++,++,+,+,+,+,+,+,+ ,++,++,+,+,,+,+,+,+,++,,++,+,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,,+,,+*+*+*+*+*+*+*+*+*++*++*+*+*+**+*+*+*+*+**+*+**)*))*)*)*)**)*)**)*)*)*)*)*)**)**))*)*)*)*)*)*)*)*))*)*)*)*)*)*))*))*)*)*)*)*)*)*)*)*))*)*)*))*))*)*)*)*)*)*)*)*)*)*)*)*))*))*)*))*)*)*)*)*)*)*)*)*)* )**)*)**)*)*)*+*+**++**+*+*+*+**++*+*+**++*+*+*+*+*+*+*+*+,+,+,+,+,+,+,+, +,++,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,,+,++,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+ ,++,,+,,+++,+,++,+*+*+*+*+*+*+*++* +*+**+**+*+*+**++*+*+**+*++*+*+*+**)*)*)*)*)*)*)*)**)*)**)*)*) *)**))*)**)*)*)*))*)*)*))*) *))**))*))*)*))*)*)*))*))*)*)*)*))*)*)*)*)*)*)**)*)*)*)*)*)*)**)*)*)*)*)*)*)*)*)*)*)*))**)*)*)*+*+*+*+**+**+*+*++*+*+*+*++*++*+*++**++*+*+*+,+,+,++,,+,+,+,++,+,+,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,+,+,++,+,,+,+,++,+ ,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,++,++,,+,++,+,+,+ ,++,++,,+++,+,,++,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+,++,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,+,,+,+*+*++*+*+*+*+*+*+*++*+*+*+*+**+*+*+*+*+**)*)*)*)*)*)*)*)*)*))*)*)**)*)**))*)**))*)*)*))*) *)**))**)*)))*)**)*)*)*)*)*)*)*)*)*)*)*)*)*))*)*)*)*)*)*)*)*)*)*)*)*)*)*)*))**)**)*)*)*)*)**))*)*) *)*)*))*)*))*)*)*)*)*+*+**+*++*+**+*+* +*++**+**++*+*+*+*+*+,+,+,+,+,,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,++,+,,++,+,++,,+,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,++,++,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++*++*+*+*+*+*+*+*+**+*+*++*++**++*+*+*++**)*)*)*)*)*)*)*)*)*)**))*)*)*)*)*)*)**)*)*)*))*)*)*))*)*)*)*)*)*)*)*)*)*))*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*))*))*)*)*)*)*)*)*)*)*)*))*))*)* )*)*)**))**)*)*)*)*+**++*+*+*+*+*+*+*+*+*+*+*+*+*++*++*+*++*+*+*+,+,+,+,+,+,+,,+,,+,++,+,+,++,+,+,++,++,+ ,++,++,++,,+,+,+,+,+,,+,+,+,+,+,++,++,+,+,++,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,,+,+,+,+,,++,,+,+,++,+,+,,++,+,+,+,+ ,+,++,,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++*+*+*++*+*+*+*+**+*+*+**+*+**+*++*+*+*+*+*)**))*)*)**)*)*)*)*) *)*)*)*))*)*)*)**)*))*)*)*)*)*))*)*)*)*)**)*)*)**))*)*))*))**)*)*)*)*) *)*))*))*))*)*)*)*)*)*)*))*)*))*)*)**)*)*)*))*)**))*)*)*))*)*)*)* )**))*))**)*)*)*+**+*+*+*+**+**+*+*+*+*+*+*+*++*++**+*+*+*+,+,+,+,+,+ +,,++,,++,+,+,+,+,++,++,+,+,++,+,+,,++,+,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,++,++,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,+,++,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,,++,+,++,,+,+,+,+,+,++,+,++,+,++*+*++**+*+**+*+*+ *+*+**++*+*+*+*+*+**)*)*)*)*)*)*))*)*)**)*)*)**)*)*)*)*)* )*)*)**))*)*)*)**)*)*)*)*)**))**))*))*)*))*))*)*)*)*)*)*)*)*)*)*)*)*)*)*)*))*))*)*)*)*)*))*)*)*)*)*)*))*))*)**))*)*)**))*)*)*)*)*+*+**+*+**++**+*+*+**++**++*++*+* +**+*++*+*+*++*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+ ,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,++,+,+,++,+,+,++,+++,+,+,+ ,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,++,+,+,++,+,+,++,+,+,+,+,,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,,+,+,+,+,+,+,++*+*+*+*+*+*+*++*+*+* +*++*+*++*+*++*+*+*+*+*+*)**)***)*)*)*)*)*)*)*)*)*))**)*)*)*)*)*)*)*)*)*))*)*)*))*)*)*)*)*)*)*)*)*)*)*)**)*)*)*)*)*)**)*)*)*)*)*)* )*)**))**)**)*)*)*)*)*+**+*+*+**++* +*+**+*+*+*++*+*+*+*+*+*+*+*+,+,+,+,+,++,+,++,,+,+,+,+,+,+ ,+,,+,,++,+,++,+,+,+,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,++,+,+,+,++,++,+,+,+,+,++,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,++,++*+*+*+*+*+*+*+ *+*+**+*+**+*+*+*+*+*+*)*)*)*)*))**)*)*)*)*))*)*)**)*)*))*)*)**)*))**)*)*)*))*)*)*)*)*)*)*)*)*))*)*)*)*)*))*)*)**)*))*)*)**)*)*)*)*)*)*)**)* )**)**)*)**)**)*)*)*)*)*))*)**+*+**+*+*+**+*+*+**+**+*++*+*+**+*++*+*+,+,+,+,++,,++,+,++,++,+,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,,+,+,+,+,++,,+,+,++,+,+,++,+,+,+,++*+*+*+*+**+*+**+*++**+*++*+*+*)*)*)**)*)*)*))*))*))*))*)**)*)**)**)*)*)*))*)*)**)*)*) *)*))*))*)*)*)*)*))*)*)*)*)*)*)))*)*)*)*)*)*)*)**)*)*)*)*))*)*)*)* )**))*)*)**)**+* +*+**+*+*+* +*++**++*++**+*+*+* +**+*+*++**+*+*+,+,+,++,+,+,++,+,+,+,+,+,,+,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,+,+,++,+,+,+,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,++,+,,+,++,+,+,+,+,+,++,+,,+,+,+,+,+,++*+*+*+*+*++*+*+*+*+*+**+*+**++*+*+*)*)*)*)*)*)*)**) *)*)**)*)*)*)*)*))*)*)*)*)*)*)*))()()()()*))*)*)*)*)*))**)*)*)*)*)*)*)**)*)*)*)**)*)*)**+*+*+* +*+**+**+*+*+*+*+**++*+*++*+*+*+*+*+,+,++,++,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+++,+ ,++,++,++,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,+,++ ,+,,+,,++,+,++,+,+,+,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+ ,++,++,++,+,++*+*+*++*+*+*++**+*++*+**+*+*+*+*+*+*+*)*)*)*))*)*)))*))*)*)*)*)*)*)*)*))*)*)*)*)*)*)*)*))*))*))()()()*)*)))*)*)*)*)*)*)*)*))**))*)*)*))*)*)*)*)**)*)*)*)**+*+**++*+**+**+*++*+*+*+*+*+*+*+*++*+,++,,+,++,++,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,+,+,++,+,+,+,+,++,+,+,++,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,,+,+,,+,+,++,++,+,+,+,+,+,+,+,+,+,++,,++*+*+*+**+*+*+*+*+*+*+*+*+*)*)*)*)*)*) *))*))*)**)*)*))**)*)*)*)*)**))*)*)**))*))*)*)*)*))()()()()()()()())*)*)*)*)*)*)*)*)**)*)*)*)*)**)*)*)*)**)*)*)**)*)*)**)**+*+*+**++**+*+*+*+**+*+*+*+*+*+*+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,+,+,++,,++,++,++,,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,++,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,,+,+,,+,,++,++,+,+,++,,+,+,+,+,+,+,+,+,+,,+,+,+,+,,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+*++*+*+*+**+*+*+*+*+**+*+*+* +*++*+**++*+*)*)*)*)*)** )*)**)*)**)*)*)*)*)*) *))*)**))*)*)*)())()()()()()()())()()()())*))*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)*)**+*+*+*+* +**+*+*++*+*+*+*+*++*++*+ ,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,++,++,+,++,,+,++,+,+,+,+,+,+,++,,++,+,++,++,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++*+*++*+*+*+*+*+ *+*++**+**++*+*+**+*+*+*)*)*)*)*)*)*)*)*))*)*) *))*)*)*)**)*)*))*)*)*)*)()())()) ())(()())()()()()()()())()()())()()()()()()())*)*)*)*)*)*)*)*)*)*)*)*)*))*)*)*)*)**)**)*)**+*+*+*+*+*+*+*+*+*+*+*+*+*+*++,+,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,++,++,,+,++,+,+,+,++,++,,+,++ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,++*+ *+*++*++*+*+* +*++*+**++*+*+*+*+*+*+*+*+*)*)*)*))**)*)*)*)*)*)*))*)*)*)*)*))*)*)*))*)*)*)())()()(()()()()()()()()())()(()()()()()()()()()()*)*)*)*))*)*)*)*)*)**)*))*)*)*)**)**))*)*)**)***)*+*+**+*+*+*+*+*+*+*++*++**+*+*++*+*+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+ ,++,++,+,++,+,+,+,+,+,+,++,+,++,++,+,+,,+,+,,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,+,+,+*+*+++ *++*++*+**+*+*+*++*++*+*+*+*+*+*+**+*)*)*)*)*)**)*)*)*)*)*)*)**))*)*)*)*)*)*)*)*)*)*)()())()()())()())()()()()()()() ())(()(()(()())()*)*)*))*))*)*)*)*)**)*)*)*)*)**)*))*)*)*)*)**)*+*+*+*+*+*+*+*+*+*+*+**++*+,+,++,+++,+,++,+,+,++,++,+ ,++,++,++,,+,+,+,+,+,,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,++,+ ,+,++,++,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+*+*+*++*++*++*+*+*++*+*+*+ *+*+*+**+**+*+*+*)*)*)*)*)*))**)*))*))**)*)**)*)*)*)*)*)*)*)*)*)*)()()()()()()()()())())()(()())()()()()(()(()( )(()())()()()()()()()())()()(()())()()*)*)**)*))*)*)*)*)*)*)*)**)*)*)*)*)*)**)*)**)*)*+*+*+*+*+*+*+*+*++*+*+*+*+*+,+,+,+,+,+,++,++,+,+,++,+,+,,++,+,+,+,+,+,++,++,+,+,+,+,+++,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,++,+,+,+,+,++,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,++,+,+,+,+,+,+,+,+,,++,+,++,,+,+,+,+,+,++,++,+*++*+*+*+*++**+*++*+*+*+*+*+*+*+*)*)*)*)*)*)*)*)*))*)*)*)*)*)*)*)()()() ()())())(()()())()()(()()() ()())()())()()()())()()()()()()()(()()()()()()())()()( )())())(())(()()())()()*)*)*))*))*))*)*)*))*))*)*) *))**)*)**)*)*)*)**)**)**)*)*+*+*+**+*+**+*+*+*+*+*+*+*+,+,++,+,+,+,+,+,++,+,+,+,+,+ ,+,+,+,+,,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,++,+,+,++,+,+,++,+,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,+,+,+,+,+,+,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,,++,+,+,+,,+,+,+,+,+,+,+,,+,+,+,+,+,+*+*++**++*+*+*+*+*+*+*+*+**+**++*+*)*)* )**)*)*)*)*)*)**))*)*) *))*))*)**))*)*)()())()()())()()())(()()()()()())()()()())()()()()()())()()()()()()()()()()()()()()()()())()*)*))**))*)*)* )**))*)**)*)*)*)*)*)*)*)*)*)*)*+*+*+* +*++**++*++**+*+*+**+*++*+,++,++,,+,+,+,+,+,+ ,+,,+,,++,+,++,+,+,+,+,+,++,+,+,+,+,,+,,++,,+,++,+,+,,++,+,+,,+,+,++,,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,++,+,++,,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,+,,+,+,+,++,+,++,+,+,+,+,+,+,+,,+,+,+,+*+*+*+*+*++*+*++*+* +*+**+*+*++*+*+*)*)**)*)*)**)*)*)*)*)*)*)*)**)*)*)*))**)*)*)*)()()())())()()()()()()()())()))(()()( )())(())())()()()()()()()()(())(()()(()()()() ()())()())()()())()()()()()()*)*)*))*)*)*))*) *)*))*)**)** )**)*))*))*)*)*+**+*+*+**++*+ *+*+**+*+**+*+*+*+*+*+*+,++,+,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,+,+,+,++,,+,+,++,+,+*++*+**+*+*+*+*+ *+*+*+**++*+**+*+*)*)*)*)*)*) *))**)*))*)*)*))*)**)*))*)*))*))*)*)()()())()()()()()(()()())()()()()()())()()()())()()()()()()(()()()() ()(()()(()()()()(()()()(()(() ()(())()(())()()()()()()*)*)*)*)*)*)*))**)*)*)*)*)**)**)*)*+*+*+*+*+*+* +*++**+*++*+*+*+*+*++,+,+,+,+,+,,+,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,+,+,+,++,+,+,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,+,+++,+,+,+,+,+,+,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,++,+,+,+,++,+,,+,++,+,+,+,+,+,++,+,,+,+,+*+ *+*+*+*+*+**+*+*+*+*+**++*++**+*+*+*+*+*+*)*)*)*)*)*)*)*)*)**)*)*))*))*)*)*)*))*)*))*)*)()())()()()()()(())()()())())()()())()()()()()()())()()()()()()()()(())()()()()())()()()(()()()())()()()()()*)*)*)*)*)*)*)*)**)*)*)*)*)*)*+*+*+*+**++*+*+*+**+*+*++*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,++,+ ,++,++,++,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+ ,++,++,++,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+++,+,+,+,++,+,+,+,+,++,+,+,+,+,+*+*+*+*+++*+*+*++*+*+*+*+*+*+*+*+*)*)*)*)**)*)*))*)**)*)**)*)*)*)*)*)*)*)*)*)*)())()()()()()()()()(()()()()()())())()()()()()()()()()())()()()(())(()()()()()()()()()(())(()()()(()()()()()(()()()()()(()()()()()()()()()()*))*)*)*)*)*)*)*)))*)*)*)*)*)*+*+*+*+**++*+**++*+*++*++*+**+*+*+*+*++,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,+*+*+*+*+*+**+**++*+*+*+*+*+*+*)*)*)*)*)*)*)*)*)**)*)*)*)*)*)*)*)*)()()()()()()())())()()( )())()())(()()())())()())(( )()(()(())()())()()()(()()( )())()())(()()()()()()()()() ()()())()(()()()()())()()()())())()()()()()()*)*))*))*)*)*)*)*)*)*))*)*)*)*)*)*)*)*)*)*)*)*+*+*+*+**+*+*+*+*+*+*+*+*+*+*+*+*++,+,+,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,++,+,++,,++,++,++,,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,++,+,,+,+,+,++,++,+,+,+,+,+,+,++,++,,+,+,+,+,+,++,+,+,+,+,+ ,+,+,++,++,,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,+,+*++*+*+*+*+*+*+*+*+*+*+*+*+*+**+*)*)*)*)*)*)*))**)*))*)**)*)*)*)*) *))*)*))*))*))*)()()()()()()()(()()()()())(()()(()()()()())()()()()()()())(())()()(()(()()()()( )(())(()(()(()()()()()()(()())(()()()()(()(()())()()()()()()()()()()()*)*)*))*)*)**))**)*)*))**))*)*)*)*)*)*)*)*)*+*+**++*+*+*++*+*+*+*+*+*+*++*++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,,++,+,++,,+++,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+ ,++,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+ ,++,++,,++,+,+,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+*+*+**+*+*+*++**+*+*+*+*++*+*+*+*+*+*)*)* )**)*)**)*)**)*)*)*))*)*)*)*)*)*)*)*)*)()()())())()()()()()()(()()()()()()()()(()()(()(()()(()( )(()()()(()(()()()(())()()())()()(()(()()()()(())(()(())()( )(()())()()()(()()()(()(()()()()()()()()()()()()()*)*)*))**)*)*)**)*)**)*)*)*)*+*+*+*+*+ *++**++**++*+*+*+*+*++*++*++,+,+,+,++,+,+,++,+,+,+,+,,+,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,++,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,+,+,++,++,+,+*+*+*+*+*+*+*+*+*+**+*+*+*)*)*)*)*)**)*)*)*)*)*)*)*)*)*)*))*)()()()()()()()())()()()()()()()()()()()()() ())(()()(()()()()(())()()()()()()()()(()()()()()(( )())(())())()()(()()(()())()()()()()()()()*)*) *)**)**))*))*)*)*)*)* )*))**))*)*)*)* +*+**+*+*++**+*+*+**+*+*+*++*+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+*+*+*+*+*+*+*+*++*+*++*+*+**+**+*+*+*)*)*)*)*)**))**)**))**)*)*)*)*) *)**)**))*)*))()()())()()()()()()()()()()()()()()(())()()()()()()()(()()()()()(()()(())()()(()(()(()())()()(())()(()()(()()(()()()()()()())())()()())()*) *))*))*))*)*)*)*)**)*)*)*+*+*+*++*+*+*+*+**++*++*+*++*++*+*++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,++,++,++,+,+,+,+,+,++,,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,+,++,++,+ ,++,++,+,++,+,+,+,+,+,+,++,+,+*+ *+*+*+*+*++*+*+*+**+*+*+* +*+**+**+*+*)**)*)*)*)**)*)*)*)*)*)*)*))()()()() ()(()(()(()()()()()()()()()()()(()()()()()()()()()()()()()()()()()(()()()()()()(()()()( )())(()())(()())()()(())())(())(()()()*)*)*)*)*)**)*)*)*)*)**))*)*)**)*)*)*)*)*)*+*+**++*+*+**+**+**+*+*+*+*+*+*++,+,+,+,+,++,+,+,+,+,+,++,+,,+,++,+,+,++,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,++,++,,+,+,+,+,+,,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,++,+*+*+*++*+*+*+**+*+*+*+*+*)*)*)*)*)*)*)*))*)*)*)*))()()()()())()()()()()()()()()()(()()()()()()()()()()())((()()()()()()()()()()()()()()(()()()())()()()()()()(())()()()()()()()()()()()()()()()()*)*)*)*)*))*)*)*)*)*)*+**+**+*+*+*+**+*+*+**++**++*+*++*++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,,+,+,+,++,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+*+*+**++*+*+*+*+***++*+*+**+*++*)*)*)*))*)*)*)*)*)*)*))*)*)*)*)*)*))()()()()()()()(()()()()()()()()()()()(()()()()(()()()(()()(()()()()()()()(()()(()()()()()()(()( )(())()())(()()()()()()(())())()())()()()()()()()()*)*)*))*)*)*))*)*)*)*)*))*+*+*+*+*+*++*+*+*+*+*+**+*+*+*+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,++,++,++,,+,+,+,+,++,+,+,+,,+,+,+,,+,+,++,+,+,+,+,++,++,+,+,+ ,+,++,++,++,+,+,+,+,+,+,+ ,++,++,+,+,,+,+,+,+,++,,,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,+,+*+*+*+*++*+ *+*++*+**++*++*+*+*+**+*+*)**)**)*)*)*)*)*)**)*))*)*))*)*))()()()()()()()()()()()()()()()()()()()(()(()()()(()()()()()()()()()()()()()()()(()()()()()( )(())())()()()()()()()())()())(()()()()()()*)*)*)**)*)*)*) *)*)**))*)*)*)*)*))*)*+*+* +**+**++**++*+*+**+*++*+*+**++*+*+++*+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,+,++,+,,+,++,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,++,++,,+,+,+,+,++,+,+,+,+,+,+,+*+*+*+ *++*+*++*++*+*+*+*+*++**+*)**)**)*)*)*)*)*)*)*)*)*)*)*))*)*)()()()())()()())()()()(()()()()())()()()()()()()()()()(()()()()()()()()()()()()(()()()()()()())()(()()()()*)*)*)**)**)*)**)*)*)*)*)*)*)*)*)*+*+*+*+*+*+**+*+**+**+*+*+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+,++,+,+,,++,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+,++,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+*+*+*+*++*+*+*+*+*+*++*+**+*+*+*++*)*)**)*)*)**)*)**)*) *))*)**))*)*)*)*))()()()()()())()()()()()()()()()())()(()()()(()()()()(()())()()(())(()(()(())()()()()()()())())()(()()()())()()())*)*)*))*)*)*)*)*)*)*)*)**)*))*)*+*+*++**++*+*+**+**++*+*+**+*+*+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,++,+,++,,+,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+++,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+*+*+*+*+*+**+*+*+**+*+*)*)**)*)*)*)*)*)**))*)*)*)*)()()()()()()()()())(()( )()(())())()()()()()()()(('('()(()()()()())()()()()()()(()()()()()()())*)*)*)*)**)*)**)*))*)*)*)*)*+**+*+*+*+*+*+*+*++*+*+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,++,+,+,++,+ ,++,++,+,,+,+,+,+,+,+,+,,+,+,,+,,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,,++,,+,+,++,+,+,,++,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,++,+*+*+*++*+*+*+*+*+*+*+**+*+*+*)*)*)*)**))*))*)*))**)*))*)*)*)*)()()())()()()( )())(()(()()()())()()()()()()(('('('('()(()()()()()()())()()()(()(()()(()())()(())()())())()(()())()()()()())()*)*)*)*)*)*)*)**)*)*+*+*+**+*+*+*+*+*+*+*++*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,,+,,+,+,+,+,+,+,+,+,+,++,+,+,++,++,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,++,+,++,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,++,+,+,++,+,+,+,+*+*+*+*+**+*+*+*++*+**+*+*+*+**+*)*)*)*)*)*))*)*)*)*)*)*)*)()()())())()()()())()()()()()()()()()(()()())()()()()(()()()(('('('('('('('(('('()((()()()()()()()()(())()()()()())(())(()()()()())*)*)*)*))*)*)*)*)*))**)*)*)*+*+*+*++*++*+*+*+++*+*+,+,+,+,+,+,+,+,+,+,+,,++,+,++,,+,++,,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,+,+ ,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,,+,+,+,++,+,+,++,+,+,++,+,+,+,+,,+,+,+,++,+,+,+,+,+,+,++,,+,+ *++*+*++*++**+*+*+*+*+*+*++**+*++*+*)*)**))*)*)**)*)*))*)*)**))*)*)*))*))**)*)*)*)*)()()()()()()())()()()()(())()()()()()()('('('('('('('(('('((''('('(''('(('('('('((()()()()()()()()()()()( )()())()()()()()())(()*)*)*)*)*))*)*)*)*)*)*))*)*+*+*+*+**+*+*++**+*+**+*++*+*+*+*+,+,+,+,+,,+,+,+,+,+,+,+,,+++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+++,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,++,+,+,+,++,+,+,+,+,+,+,+,++,++,+*+*++**+*+*+*+*+*+*+*+**+*+*)*)**)*)*)**)**))*)*)*)*)*)*)*)()())()()()()()()()()()()()()('('('('(('(('('('('('('('('('('('('('('('(('()()()()()()()()()()() ()(()()())())()()())*)*)*))*)*)*)*)*)*)*)*)*)*)*+*+*+*+*+**+*++**+*+*+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+*+*+*+*+*++*+**++*+**++*+***+*)*)*)*)*)*)*))*)*)*)*)*)*)*)()()()) )(()(()()()()()()()()())(())()()())()()('('('(('('((''('(('('(''('('('('( '('(('('(('('(('(''(''('('('('(('('('(('(''('('('(('()()()()(()()()(()(()()()()()()()()(()(()())()()()()())*)*)*)*)*)*)*)*)*)*+*+*++**++* +*+**++**+*+*++**+*+*+*+*+,+,+,+,+,+,+,+,+,,+,+,+,+,++,,+,+,++,++,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+++ ,++,++,+,++,+,+,+,+,+,+*+*+**+*+*+*+*+*+*++*+*+*++**)**)*)*)**)*)*)*)*)*)*)*)()()()()))(()()()()()()()()()()('('('('('('('(('('( '((''('('(('('('('('('('( '('((''(('(('('('(' ('('(('(('('(('()()()()()()()()()()()()()()())()()*)*)*)*)*)*))*)*))*)*)*+*+*+*+*++***+*++*+*+*+*+,+,+,+,++,+,,+,++,+,+,+,+,++,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,++,+ ,+,,+,,++,+,++,+,+,+,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+++,+,+,+,,+,+,++,+,+,+,+*++*+*+*+*+*+*+*+*+*+*+**)**)**)*)*)*)**))**)*)*)*)*)()()()()())(()()(())()()()()()('('('('('('(('('('('('((''('('(('('('('('('(''('('(('('(('('(''('('()(()()()()()()()()()()()(()()(()()(()()()()())()*)*)*)*)*)*)*) *))*)*)**)*)*)*)**)*)*+*+*+*+*++*++*+*+**+*+*+*+*+,+,++,+,+,+,++,+,+,+,+,++,+,+,+,++,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+++,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,,+,+,,+,+,++,+,+,+,+,+,+,+*+*+*+*+*+*++*+**)* )**))**)*)**))*)*)**)**)*)*)*)())())())(()()()()()()() ()()(())(()()(()()()()()(()()()('('('('('('('('('('('(''('('('(''('('('('((''('(''(''('((''(''('('('('(('('(('()(()()()( )(()()(())()(()()(()(()()())(())())())())()()()())*)*)*)*)*)*) *)*)*))**)*)*)*+*+*+*+*+*+*+*+*+*+*+*+*++*+,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,++,+,++,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,,+,,++,++,+,+,++,,+,+,+,+,+,+,+,+,+,,+,+,+,+,,+,+,+,+,+,++,+,+,+,+,+,,+,+,+,+*+*+*+*+*++*++**+*+*+**)*)*)**))*)*)*))*)*)*)*)*)()()()()()()()(()()()()()()(()()()()('('('('('('('('('('('((''('('(('('('(''('('('('('('('('('('('('('('('(('('('('('('('('('()()()()()()(())(()()()(()()(()(())()()())()*))*)*)*)*)*)*)*)*))*)*+*+*+*++*+*+ *++**++**+*+*+*+*+*+,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,++,+,++,,+,++,+,+,+,+,+,+,++,,++,+,++,++,+,+,+,+,++,++,++,,+,+,+,+,++,+,+*+**+*+*+**+* +*+*+**+*++**+*+*+**)*)*)*)*))*)*)*))**)*)*)*))*))*)()()()()()()(())()()(()(()()()(())()()()()()('(('('('('(('('(('( '('(('((''('('(('('('('('('('('(''(('('('(''(('('(''(('('('('('('(' (''('('(('('('(('('(''(''('('()()()()()()()()())()(()*)*)*)*)*)*)*)*))*)*)*)*)*)*)*)*)*+*+*+*+*+*+*+*+*+*+*++*+**+*+*+*+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,++,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,,+,++,+,,+,+,+,+,+,+,+*+*+*++*+*+*+*++*+*+*+*+**+*+*+**)*)*)**)*)*)*)*))*)*))*)*)*))*))*)*)()()())()()()()()()()()())()()()('('('('('(('(('('(''('('('('(('(''('('(('(('(' (''(''('('('(''(('((''('(('((''(' ('(('(('('('('('('('('('('('('('((''('('((''('('('()()(()(()()()()()()()()()(()()()()()()*))*)*)*)*)*)*)*)*)*)*)*)*)*)**)*+*+*+*+*++*+*+*+*+*+*+*++*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+ ,++,++,+,++,+,+,+,+,+,+,++,+,++,++,+,+,,+,+,+,+,+,+,+,+*+*+*+*+**+*+*+*+*+**+*+*+*+**))*)*)*)*)*)**)*)*)*))*))*)**)*)*)*)*)*)()()())()()()(()()()()()()(()()()()()()()('('('(''('('(''('(''('('('('('('('(''('('('(''('('('('('('(('(' ('((''(''(('('('(('('(''(('('('(('((''('('('('('('('('('('()()()(()()(()()()()()()())(()()()()*)*)*)*)*)*)*)*)*)*)*)**)*)*)*+*+*+ *+*+*++*+**++*+*+*+*+,+,+,+,+,++,+,+,+,+,+,,+,++,+,+,++,+ ,++,++,+,,+,+,+,+,+,+,+,,+,+,,+,,+,+,+,++,+,+,+,+,+,++,++,,+,+,+,++,+ ,+,++,++,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,++,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+*+*+*+*+*+*+*+*+*+**++*+*+**)*)*))*))*)*)*)*)*)*)*)*)()())()()()()()()()()()(()()()()()('('('('((''('( '('('((''(('('('('(('('(('('('('('(('(''('('(''(('('('('(''('('('('('(('('('('('('('(''('('(('('(('('('('('(('(''()(()(()()(()(())()()()()()())()())()()()*)*)*)*))*)*) *))*)*)**)**))*)*+**+*+**++*+**++*++**+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,,+,,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,+++,+,++,+,+,+*+*+*+* +*+*+*+**+*+*+*++*+*+**)**)*)*)**)*)**)*)*))*)()(()()()()()(()(()()(()())(()()()()('('('('('('((''('(('('('('(('('('('('('('((''(('('(''(''('('('('('(''(''('('('('('('('('('('('('('(('('('(('(('('('('('('('('('('('()()()())(())()()(())(()()()()()()()()()*)*)*))**)*)*)**)*)*)*)*)*)*+**++**+*+**+*+*++*+*+*+,+,+,+,+,+,+,+,,++,+,++,,+,+,++,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,++,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,+,+,+,+,+,+,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,,++,,+,+,+,+,+*+*+*+*++*+*+*++*+*+*++*+*+*+*)**)**)*)* )**)*))*)**))*)*)*))*)*))*))*)()()())()()()()()(()()(()())()()()(()()((('('('('('('('('('('('('(''(''('(''(''('(''(''(''('('(''(''('('(''(('('('(('('(''(''('('('(''((''(''(('(' (''('(('('('(''('('('(''('(''('('('('('(''('('('('('('()()()()()()()()()()()()*)*)*)*)*)*)*)*)*)*)*)*+*+**+*+*+**+*+*+*++*+,+,+,+,+,+,+,,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,++,+,+,+,+,+,+*+*+*+*+*+*+**+*+*+*)**)*))**)*)*)*)* )**)*)**))*))*)*)()()()()()()()()()()()('('('('('('(('('('('(''(''('('('('('('('(''( '((''('(''('('('(''(('('(''(('('('('(''(('('('('('('(('('('('('('(('('('('('('()( )())())(()(()()())()()()()(()()()()()()*)*)*))*)*)**))**)*)*))*)*)*)*+**+*+*+**+**+*+*+*+*+,+,++,+,++,+,+,+,+,+,+,+,,++,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+*+*+**+*+*++*+*+**+*+*+*)*)**)**)*)*)*)**)*)**)*)*)*)()()()()()()())())()()()()(()('('('('('('('('('('('('(('('(''(('('('('(''('('(''('('(('('('('(''(''('('(''((' (''('(''(''('('('('('('('(('('(('('( )(()(()(()()()()())(()())()()()*)*)*)**)*)*)*)**)**)*)**)**)*)*+*+*+*+*+*+*+*++*+**+,+,+,+,,+,+,+,+,++,,+,+,++,+,++,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,+ +,++,+,++,+,+,+*+* +**+**+**+*++*+*++*++*+*)***)*)*))*)*)**))*)*)*)*)*)*)*)()()()()()(()()()()(()()(()(('('('('('('('('('('('('(('('('(('('('('(''(('('('''('('('('('('(''('('('('('('('('('('((''('('('(' ('((''((''('('('('()()()()(()()()()()())(()()())()()()()()()()*)*))**)*)*))*))*))*)*)*)*)*)*+**+* +**+**++**+**+*+*+*+**+*+,+,++,+,,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+ ,++,++,++,+,+,+,,+,++,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,,+,+,+,+*+*++* +*+*++*+*+*+*+*+**+*+*+*+*)*)**)*)*))**)*)*)*))*))*)*)()(()())()()()()()()(('('('(''('('('('('(''('(''(('('('('('('('('(('(''('(''('('('('('('('('('('(''('('('('('('('('('(''('('('('((''(('('('('('('(('()()()()()()()()()()() *))*))*))*)*)*)*)*)*)*))*)*)**)*+**+*+*+*+*+**+*++*+*+*+,+,+,++,+,+,+,+,++ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,+,++,+,+,+,+*+*+*+*+*+**+*+*+*+*)*)*)*)*))*)*)*)*)*)*))*)()()()())()( )()(())(()()()()()()(()()(('('('('(''('('('('('('('('('('(''('('('(''('('('('(''(''('('('('('('('('(' (''(''(''(('(''('('('('(('('(('('('('('('('('('()()()()(())()(()()( )()()(()(()*)*)*)*)*)*)*)*)*)*)*)*)**+*+*+*+*++**+*+*+*+*+,+,+,+,+,++,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,++,+,+,+,+,+,++,+,,+,+,+,++,++,+,+,+,+,+,++,+,++,,+,+,+,+,+,++,+,+,+,+,+ ,+,+,++,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+*+*++*+*+*+*+*+*++**+*+*+**+*)*)*)**)**)*) *))*)*)**))*)*)()()())()()())()())()()()(('('('(('('('('('('('('('(('(''('('('('('(''(''('('('('(''('('('('('('(''('('(''('('('('('('('('(('(('('((''('('('('('('('(('('()()(())()()()(()()()(()()()()(()()*)*) *))*))**))*)*) *))*)**))*)**)*)*)*)**+*+*+*+*+*+*+*+*+*+*++*+,+,+,+,+,+,+,+,+,++,,++,+,+,+,,++,+,++,+,+,+,+,+,+,+,+,+,+,+++,++,+,+,+,+,+,++,+,+,+,+,+,++,,+,++,+,+,+,+,+,+ ,++,++,++,,+,+,+,+,+,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,++,,+,+,+,+,++,+,+*+*+*+*+*+*+*+**+*++*)*)*))*)*)*)*)*))*))*)*)()()()())()()()())()()()()(()()()(('('(('('('('('('(''(('('('('('('('('('('('('(''('('('('('('('('(('(''('('(''('('()()(())()())()()()()()()()()()*)*)*)*)*)*))*)*)*)**+*+*+*+*+*+*++*+*+*+*+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+,+++,+ ,++,+,,+,,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,,+,,+,+,+,+*+*++*+*+**+*+*+*++*+*+**+*+*)**)*)*)*)*)**)*)*))*)*))**)*)*)*)()()()()()()()()(()()()(()()()()()(('('('(('('('('('('('('('('('('('('('(''&'&''&'&'&'('('(''(('(''(''('(''(('('('(('(''('('(''('('('('()()(()()()()()()()()())()(()()*)*)*)**))**)*)**)*))**)*)*)*)**+*+*+*+*+**+*+*+*+**+*+*+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+++,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,++,+,+,,+,+,+*+**++**+*+*+*+*+*+**+*+*+*)*)*)*)*)*)*)*))*)*)**))**)()()(() ())()())(()()()()()()()('(('('('((''('('('(''('('('('('('('('('('(''&'&''&'&'&'&'('''('('(('('('('('(('('('('('('('()(()()()())(()())()(()()()()()()*))*)*)*)*)*)*)*)**+*+**+*+**+*+*+*+*+*+**++*+*+*+,+,+,+,+,+,+,,+,++,+,+,++,+ ,++,++,+,,+,+,+,+,+,+,+,,+,+,,+,,+,+,+,++,+,+,+,+,+,++,+,+,+,+,++,++,+,+,+,+,+,++,+,++,+,+,+,+,+,+,,+,+,++,+,++,++,++,+,,+,+,++,+,+,+,+,,+,+,+,++,,++,,+,+,+,+,+,+,+,+,+,+,+,++,+*+*+*+*+*+**+*+*+*+*+*)*)*)*)*)*))*))**)*))*)*)*)()()()()()()()()(('((''(''('('('(('('('('('('('(''&'&'&'&'&'&'&'&'&'&'&'&''('(' (''('(('(''('('('('(('(''(('('(('(('('(''('('('(''(('('(()()()(() ()())())())()()*)*)*)*))*)*)*)*)*)**+**+*+*+*+*+*+*+,+,+,+,+,+,++,+,+,+,+,+,+,+,,+,,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+++,++,+*+*+ *++*++*++**+*+*+*+*+*+*+*)*)*)*)*)*)*))*)*))*)*)**)*)*)()()()()()()(()()()()()()()('('('('('('('('('(''('('(('('('('('(''('('(''&'&''&'&'&''&&'&'&'&''&&''&'&'&'&'&'&'&''&&'&'&'&'&''('('('('('('('(''(''((''(''(('('(('('(''('('('()( )(()(()()()()()()()()()()*)*)*)**)**)*)*)*)*)**+*+*+*+*+*+*+*+*+,+,+,,++,+,++,,+,+,+,+,,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,+,+,++,,++,++,++,,++,,++,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+*+*+*+*+*+**+*+*+*+*)*)*)* )**)*)*))*)*)*)**)*)**))*)() ())()())()())()() ()(()()(())()()('('((('(('('('('(('(('('('('('('(''('('&'&'&'&''&'&'&'&'&''&'&''&&'&'&&'&'&'&&''&'&'&'&''&'&'&'&'&'&''('('('('('('('(' ('(''('('('('(''('(''('('()(()()()(()()()()())()(()()()*)*)*)*))*)*)**)*)**)*)**)***)*+*+*+*++*+*+*+*+*+*++*+,+,+,+,,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+++,+,+,+,+,++,,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+*+*+*+*+*++*+*++**+*+*+*+**+*)*)**))*)*)*)*))*)*)*))*)*)()()()()())()()()()()()()('('(''((''('('('('('('('('('('('('&'&'&'&''&'&''&' &'&'&&''&&'&'&'&'&'&'&'&'&'&'&'&'&'&'&'&'&''&'('(''(('('('(''('('(('('('('())()()(()()()()()()()()()()()*)*)*)*)*)*)*))*)*)**+*+*+*+**+*+**+*+*+*+*+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,++ ,++,+,,++,+,+,+,+,,+,,+,+,+,++,++,+,+,+,++,++,+,+,+,+,++,++,+,+,+,+,+,+,,+,++,+,++,,+,+,+,+,+,+,+,+,++,++,,++,++,+,++,+,+,+,+,++,+*+*+*+*+*+*+**+*+*+*+*++*+*)**)*)*)*))*))*)*)*))*))*)()()( )())(())())()()()()()()()('('('('('((''('('('('((''(('('('('(('('('('&'&'&''&'&''&&'&'&''&'&'& '&'&'&''&&' &'&'&''&'&''&'&''&'&&'&&'&'&'&'&'&''&'&'&''&'&&'&'&'&'&''&&'&'&''&'&'('(''('('('('('('('(''('(('('('('('('('(()()())())()()()()()()*)*)**))*)*)*))**))*)*)**)* +**++**+*+**+*+*+*+*+*++*+*+,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,,+,+ ,++,+,++,,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+*+*+*+**+**+*+*++*+*+*)*)*)*)*)*)**)* )*))*))*)*)*)())()()()())()())()()()()()()()('('(''('('(''('('('('('('&'&'&'&'&'&'&'&'&''&'&'&''&'&'&'&'&'&' &'&''&'&'&''&'&''&&'&''&'&' &'&&'&'&''&&'&'&'&'&'&'&''&'&'('('('('('('('((''('('('('((''('(('(('('(('(()()()()()(()()(()()()()*)*))*)*)*)*)* )*))**)**)*)*+**+*+* +*+*++*+**+*+,++,+,+,+,+,+,++,+,,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,++,+,+,+,+,,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,++,+,,+,+*+*+*+*+*++* +*+*++*+*+*++*+*++*+*+*)*)**))**)*)*)*)*))**))*)()()()())()()(()()()('('('(('('(('(('('('('('('('(''('('('('&'&'&'&'&'&'&''&&'&'&'&''&&'&'&''&'&''&&'&'&'&'&&'&'&'&'&'&''&'&''&'&'&'&'&'&'&'''&'&'&'('('('('('('('('(''('('(''((''('('(('()()(()()()()())()())()()*)*)*)*)*)**)*)*)*))*)**)*+*+*+*+*+*+*+*+*+*+,+,+,+,+,++ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,,+,+*+*+*+**+*+*+*+*+*++*+**+*+**+*+*)**)*)*))*)*)*)*)**) *)**))*)**)))()()(()()()()()()()()()()('('('('(''('('('(''('('('('(''('('('('('&'&'&'&'&'&'&'&'&''&'&&'&'&'&'&'&''&&' &''&&''&''&'&'&&'&&'&&'&''&'&'&'&'&'&'&''&'&''&'&'&'&'&'&'('('('('('(''('('('('(('(('( '(('('((''(('('('()()()()()()()()()*)*)*)*)*)*)*)*)*)***)*)*+*+*+*+*+**++*+*+**+*+*+*+**+*+*+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,++,+,+,++,++,+,+,++,++,+,+,+,+,+,,+,+,+,,+,+,+,+,+,+,++,,+,+,,+,++,+,++,+,+,+*+ *+*+**+*++*++*+*+**+**+*+*+**+*+*)*)*)*)*)*)*)*)*))*)*)*))*)*)())())()()()()()())()(()()(()('('('( '(('('(('('('((('('('(''(''((''(('('('('&'&'&'&'&'&'&'&'&''&'&'&'&'&'&'&'&'&'&'&'&'&'&'&'&'&'&'&'&'&'&&'&'&'&'&''&'&'&'&'&'&'&'&'&'&'&'&'&'&'&'('('('(''('(''('('('('('(('('()()()()()(())()()()(()()()*)*))*)*)**)*)*)*)*)**)*)*+*+*+**+*+*+*+*+*+**+*++*+*+*+,+,+,+,+,++,,+,+++,+,+,,++,+,++,+,+,+,+,+,+,+,+,+,+ ,++,++,,+++,+,+,+,+,+,,+,+,+,+,+,++,++,+,++,+,+,+,+,+,++,+,+,+,+,,+,+,++,,+,+,+,+,+,+,+,,+,+,+,++,++,+,++,+*+*+ *+*++*+*++*+*+*+*+*)**))* )*)**)**))*)*))*)())())()()()()()()()()()()()(()('('('(''('('('('('('('('('('('('&'&'&'&''&'&''&'&'&''&''&'&'&'&'&&'&'&'&'&'&'&'&'&'&&'&&'&'&'&'&'&'&'&'&'&'&&'&'&'&'&'&'&'&'&&'&&&'&'&&'&'&'&'&'&'&'&'&'('('('('('('('('('('(('('()()()()()()(()()()()()()()()*)*)*)*)*)*)*)*)*)*)**)*))*)*)*)*+*+*+* +*+**++**+**+*+*+*+,+,++,+,+,+,+++,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,+,++,+,+,+,+,++,+,++,+,+,+,+,+,++,++,,+,++,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,+*+*+*+*+*+**+*+*+*+*+*)*)*)*)**)*)*)*)*)**))*)()()()())()( )(()(()(()()()('(('('((''('('(''(''('('('('&'&'&''&''&'&'&&'&'&'&'&'&'&&'&'&'&'&&''&'&'&&'&'&'&&'&&'&'&&'&'&'&&''&'&'&'&'&'&'&'&&'&'&''&'&'&'&''&&'&&'&&''&'&'&'&''&'&'('('('('('('(''(''('('('((''('(('('()( )(())(()()()()(()()()()())()*)*)*)*)**)*)*)*)*)*)*)*+*+*+*+*+*+**+*++*+*+*+,++,+,+,++,+,+,+,,+,++,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+*+*+*+*+*+*+*+*+*+*)*)*))*)*)**) *)**))**))**))*)*)()())()()()()()())(()()()('('(''(('('('('('('('((''('('('('('('('('('&'&'&&'&'&'&&'&'&&'&'&'&'&'&'&''&'&&'&'&&'&'&&'&'&'&'&''&'&&'&'&'&'&&''&'&'&&'&'&'&'&'& '&&'&&'&&'&''&'&'&'&''&'&&''&'&'&'&'&'&''&&'&'&'&'('('('(' ('(('((''(''(('('('(('('('()()()()()()()())()()()()*)*)*)*)*)*)**)*)*+*+*+*+*+**+*+*+,+,+,,+,++,+,+,++,++ ,++,++,+,,+,+,+,+,+,+,+,,+,+,,+,,+,+,+,++,+,+,+,+,+,++,+,+,+,+,,+,+,++,+,+,++,++,+,+,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++*+*+*+*+*+*+*+*+*+*+*)*)*)*)*)*) *)*)*)*)*)**)*)*))()()()())(()(()()(())()(()()('('(('('('('('(('('('('('('('('&'&'&''&&'&' &'&'&''&&''&'&'&'&''&'&''&'&'&'&'&&&'&&'&'&'&&''&'&'&'&&'&'&'&'&'&'&'&'&'&'&' &'&&'&&''&''&'&'&'&'&'&'&'&&'&&'&'&'&''&''&'('('('('('('(('('(('('('(('('('('()()(()()( )(()()(()())(()()*) *))**)*))**) *))**)**))*+*+*+*+*+*++**+*+*+,+,+,+,++,+,+,+,+,+,,+,,+,+,+,+,+,+,+,+,+,+,+,+++,++,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,++,+,++,+,++,,++,+,+,+,+,++,+,++,++,+,+,+,++,+*+*+*+*+*+*++*+**++*+*+*+*)*)*)*))*)*)*)*))*))()()()()(()()()('('('((''('(''('(('(' ('(''(''('(''('('&'&'&'&'&'&'&''&'&'&'&''&'&'&'&'&'&'&&'&'&'&'&'&'&'&'&&'&&'&'&'&'&'&'&'&'&'&'&'&'&''&'&'&'&''&'&'&'&&'&'&&'&&''&&'&'&'&'&'&'&''&'('('('('('('('(('(''('('('('()()()()()())()()()()()*)*)*)*)**)*)**)*+*+*+*+*+*+*+*+*+,++,+,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+ ,++,++,,++,+,+,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,++*+*+*+*+**+*+*+*+*+*+*)*))* )*)*)**))*)*)*)**)*))())(()()())()()(()()())(()()()()('('(''('('(('('('('('('('('&'&'&'&'&'&'&'&'&'&'&&'&'&&'&&'&'&&'&&'&&'&'&'&&'&'&'&'&'&'&''&'&'&'&&''&&'&'&'&&''&'&'&'&'&&'&&''&'&&'&'&&'&'&'&& '&&''&''&'&&'&'&'&'&'&'&'&'&'('('('('('('('('('('( '(''((''(('('()()() ())(())(())()()()()()()*)*))*)*)*)*))*)*)*+*++*+*+*+*++*+*+*+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+*+*++*+*+*+* +*++*++*+*++*)*)*)*)*)*)*)*)*)*))())()()())())(()()()()()()('( '(('((''('('('('('(''&'&'&''&'&'&'&'&&'&&'&'&'&'&'&'&'&'&'&'&'&'&'&'&&''&'&'&'&'&'&'&'&'&'&'&&'&'&'&&'&'&'&''&'&'&'&'&'&'&'&&'&'&'&'&&''&'('(''('('('(''('('((''('('('('( )(()()())(()()()()(()()()()*)*)**)*) *))*))*)*)*)*+*+*+*+*+**+*+*+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++*+*+*+**++*+*+*+*+*+*+**++*+*)*)*)*)*)*)*)*)*)*))*)*))()()()()()(()()()()()('('('('( '(''((''(('(''(('('('&'&'&'&'&'&'&'&'&'&'&''&'&'&&''&'&'&'&'&'&'&&'&'&&'&'&'&&'&'&'&'&'&'&'&'&'&''&'&''&'&'&'&'&'&'('('('('(' ('('(''(('('(('('('()()()())()()()()(())())()())())()()*)*)**)*)*)*)*)**)*+*+*+*+*+*+*+*+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+ ,++,++,+,++,++,++,++,+,+,+,+,+,++,,+,+,+,++,+,+,++,,+,+,+,+,+,+,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,+ ,++,++,++,,++ *++*++**++*+ *+**++**++**+*+**+*+**+**+*)* )*)*)*)*)**)*)*)*))*)*)*))()()()()()(()()()('('(''('('('('(''('(''('('('(''&'&'&'&'&'&'&'&'&'&''&'&'&&'&'&'&'&'&&''&'&'&'&'&'&'&'&'&'&'&&'&'&'&'&'&''&&'&'&'&'&'&'&'&'&'&'&'&'(''(' (''(''((''('('('''('('('(' ('('(('((''('()(())()()()(()()()()()()*)*)*)**))**))*))*)*)*)*)*+* +**+**+*++*+*+*+**+*+*+,++,+,++,+,,+,+,+++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,,++,+,+,+,+,,+,+,+,+,+,+,++,+,+,++,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+*+*+*++**+ *+**++*+*++*+*+**+*+**+*)*)*)**)*))*)*))()()()()())(())()('(('('('('('('('('('(''&'&'&'&&'&'&'&''&'&'&&'&'&&'&'&&''&'&'&'&'&'&'&'&''&'&'&'&&%&'&'&&'&&&'&'&&'&&''&&''&'&&''&'&'&'&'&&'&'&'&'&'&&'&'('('('('(''('('('('()(()(()()()()(()()()(()()())()*)*)*)*)*)*))*)*)*+**+*+*+*+**+*+*+*+*+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,,+,,+,+,+,+,++,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,++,+*+*+*+**+*+*+*+*+*+*+*+*)*))**)*)*)*)*)*)*)()()()()())(()()())())()()()('('('(('((''('('('('('(''('('('(''&'&'&&'&''&'&'&'&&'&'&'&'&'&'&'&&'&'&'&'&&'&'&'&'&&%&%&%&%&%&%&'&&'&&''&'&''&'&''&''&'&'&'&'&'&&'&'&'&'&'&'&''&'('('(''(''('(''('('('('()()()()())()()()()()(())()*)*)*)*)*)**))*)*)*)*+*+*+*+**++**+*++*+*+*+*+*++*+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,++,+,+,+,+,++,+,+,+,,+,+,+,,+,+,++,+,+,+,+,++,+,+,+,+ ,+,++,++,++,+,+,+,+,+,+,+ ,++,++,+,+,,+,+,+,+,++,,+,+,,*+*+*+*+*+*++*+*+**+**+*+*)*)*)*)**)*)*)**)*))**)*)*)()())(()()()(()()()('(('('('(('('('('('('('(''&'&'&'&'&''&'&'&'&'&''&'&&'&'&'&'&'&'&&'&&'&'&'&&%&%&%&%&%&%&%&%&%&'&'&&'&'&'&'&'&''&'&'&'&''&'&'&'&&''&''&'&'&'&''&'&''&'&'('('('('(''('(''('(('('('()(()()(())()(()())()()()()()()*)*)*)*)*)**)*)*)*)*)*+*+*+*+*+*+*+*+*+,+,+,+,+++,+,,++,+,++,+,+,+,+,+,+,+,+,+,+,++,++,,+,+,++,++,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+*+*+*+*+*+ *+*+*++*+*+*+*+*)* )**)*)**)**)*)*)*)*)**))*)()))()()(()()()(())()()(()('('('(('('('(('('(''('( '(''(''('(('('(''&'&'&'&'&'&&''&'&'&'&'&'&'&%&%&&%&%&%&%&%&%&%&%&%&&'& '&'&&'&'&&'&'&&'&'&&'&&'&'&'&'&&' &''&'&'&'&''&'('('''('('('('((''('('(('('()()()()()()(()())()()()*)*)*)*)*)*)**)*)*)*+*+*+*+*++*+*+*+*+*+*+*+,+,+,+,,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+,++,+,,+,+,+,+,,++,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+++,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++*+*+*+*+*+*+*+*+*+*+*)*)*)**)*)*)*)*)*))*)()()()()()(()()(()()()(()(()('('(''('('(''('(''(('('('('('('(''(''&'&'&'&'&'&'&'&'&'&'&'&'&'&&%&%&&%&%&%&%%&&%&%&%&%&&%&%&%&%&%&%&%&%&&'&'&''&'&'&'&'&&'&'&'&''&''&&'&'&'&'(''('(''('(('('(''('(''(('('('('('()()()()()(()(())()()()()*)*)))*)*)*))*)*)*)*))*)*+*+*+*+ *++*+*+*++*+*+,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,,++,+,++,,+,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,++*+*+**++*+*+*+*+*)*)*) *))**)**)**)*)*)*)()()()))())()()()(()(()())()()()('('('('('('(''('('('('&'&''&'&'&'&'&'&'&&'&'&'&'&'&'&'&'&%&&%&&&%&%&%&%&&%&%&%%&%&%&&%%&%&%&%&%&%&%&&%&%&%&&'&'&'&'&'&'&''&&' &''&'&''&'&'&'&'&'(''('('('('('('('(('('()()()()()()()*)*)*))*)*))*)*)*)*)*)**)*)*+*+**+*+*+*+*+*+*+*+,++,+,++,++,+,,+,+,+,+,+,+,+,,+,+,,+,,+,+,+,++,+,+,+,+,+,++,+,+,+ ,+,,++,++,+,+,+,+,+,+,,+,+,+,+,,++,,+,+,++,+,+,,++,+,+,+,+,+,++,,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+*++*+*+*+*+*+*+*++**+*+*+*)*)**)*)*)*)*)*)*)()()()()()()()()()('('('('('('&'&'&&'&'&'&'&'&'&'&'&'&'&'&%&%&%&%&&%&%&%&%&%&%&%&%&%&%&%&&%&&%&%&&%&%&%&%&&%&%&%&%&&'&'&'&&'&'&'&&'&&'& '&'&&'&&''&''&'&'&&''&'&'&''('('('(('(''((''(('('('(('('('()()()(()()()()()()()*))*)*)*)*)**))*)*)*)*+*+*+*+**+**+*+*+*+**+*+*+*+,+,+,++,+,+,+,+,,+,,+,+,+,+,+,+,+,+,+,+,+,++,++,+,++,++,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,++,++,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++*+*+*+**++*+**+**++*+*++*+*+*)*)*))*)*)*)**)*))**)*)())()())())()())()()('(('(('(''('(('('('('(''(''(('('(''(''(''('&'&'&'&'&'& '&''&&'&&'&'&'&'&'&'&'&&'&'&%&%&%&%&%&%&&%&%&%&&%&%&&%&%&%&%%&%& %&%%&&%%&%%&&%&%&%&%&%&%&%&%&&%&&%%&%&%&%&%&%&%&%&%&&%&%&'&&'&'&'&&'&&'&'&''&&''&'&'&&'&''&&'&'&'&''('(' ('('(''((''(('('('()() ()(()(()())()()()()()*))*)*)* )*))**))**)*)*+*+*+*+**+**+*++**+*+*+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,+ ,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+++,+,+,,+,+,+,++,+,+,++,+,+,++,+,+,+,+,,+,+,+,+,++*++*+*+*+*+**+*+*+*+*)**)*)**))*)*)*)*)*)*)*)()())())()(()())(()()()(()()(()('('('('('(('('('('('(('(''('('('('&'&'&&'&''&''&'&'&'&&''&&'&'&'&&'&'&%&%&%&%&%&%&&%&%&&%&%&%&%&&%%&%&&%%&%&%&%%&&%%&% &%%&%&&%&%&%&%%&%&%& %&%%&%%&&%%&%&%&%%&%&%&&%&%&'&'&&'&'& '&'&''&''&'&'&'&'&''&''&&''('('('('('('('('('()()()()())(()()()())()())()()*)*)*)**)*)*)*)*)*)*)*)*+*+*+*+*+*+*+*+ *++*++**+*+*+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,++,+,+,+,++,++*+*+*+*+*+*++**+*+*+**+*+*)**))*)*)*)*)*)*)**)()()())() ())()())(()(()()('('('('(('('('('('(''('&'&''&&'&'&'&'&'&'&'&'&'&'&'&'&%&%&%&%&&%&%&%&%&%&&%&%&%&%&%&%&%&%&%&%&%&%&&%&%&%&%&&%&%&%&%&% &%%&&%&&%%&%&%&%&%&%&%%&%&%&%&%&'&'&'&'&'&'&''&''&''&''&&'&'&' &''&''&''&''('('('('('('(('('('('()()()()()(()()())*)*)*)*))*))**))*))*)*+**+*+**+*+*+*+*+*++**+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,+,+,+,+,+,+++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+++*+*+*+*+*++*+*+*)*)*)*)*)**)*))**)())()() ()())())()())()()()()('('('('('('(' ('(('((''('&'&'&'&'&'&'&''&&''&'&'&'&''&'&&'&'&'&%&%&%&&%&%&&%%&%&%&%&%&%&%&%&%&%&&%%&%&%&%&%&%&%&%%&%%&% &%&&%&%&%%&%%&%&%&%&%%&%%&%%&%&&%&%&%&%&&%& %&%&%%&%&%%&%&%&%&%&&%&%&%&%&%&'&'&&'&'&&'&'&''&'&'&'&'&''(''('(('('('(''('('('()()()()()()()()()) *))**))*)*))*)*)*)*+*++*+*+*+*+*+*+*+*+*+*++*++,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+ ,++,++,+,++,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,,+,+,+,+,+,,+,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,++ *++**++*+**+*+*+*+*+**+*)*)*)*)*)*)*))*)*)()()(()())(()()()()()()()('('('('('('('('('('&'&'&'&&'&''&'&&'&'&&'&'&'&'&%&%&%&&%&%&%&%%&%&%&%&%&%&%&%&%&&%&&%&%&%&%&%&&%&%&% &%&%&&%&%&%&% &%&&%%&%%&&%%&%&%%&&%&%&%&%&&%%&% &%&&%%&%&&%%&%&&%&&&%&%&%&%&'&'&'&'&'&'&'&'&''&'&''&'&'&'&''('('('('('('('('('()()()()())()())()())*))*)*) *)*)**)*))*))*+*+*+**+*+*+**+*+*+*+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,,+,+,+,,++,+,++,+,+,+,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,*+*+*++*+**+*+**+**+*+*)*)*)*)*)*)*)*)*)*)()()(())(()()()(()(()('('('('('(('('(('('&'&'&'&''&'&&'&'&'&'&%&%&%&%&%&&%&%&%&%&%&%&%&%&%&&%& %&%&&%%&%&%&%&%&%%&%%&%&%&%&% &%%&%%&&%%&%&%&%&%&%&%&%%&%&%&%&%&%&%&%%&%&%&%&%&%&'&'&&'&'&'&'&'&&'&'&'&'&''&'''('('('('(''('('('()()()())()()()(()()())*)*)*)*)*)*+* +*+*++**+*+*+*++*+*+*+*+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,,+,+,,+,+,+*+*+*+*+*+*+*)*)*)*)*)*)()(()()(()()()()('('(('('('('('(''(('('&'&'&'&'&'&'&'&'&'&&'&'&'&'&'&'&%&%&%&%&%&%&%&%&%&%&%&%&%&%%&%&%&%&%&&%%&%&%%&&%&%%&%%&%&%&%&%&%&%&%%&%&%&%&&%&&%&%&%&%&%&&%&%&&%&%&%&%&%&%&&%&%& '&&'&''&''&'&'&'&&'&'&&''&'&&'&''&'('('('('('('('('('(''((''('(('()()()()()()()()()()()()))*)*)*)*)*))**)*)*))*)*)*)*))*)*+*+*+*+*++*+*+*+*++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,,+,+,+,++,+,++,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,++,+,,+,,++,++,+,+,++,,+,+,+,+,+,+,+,+,+,,+,+,+,+,,+,+,+,+,+*++*+*+*+*+*+*+*)*)*)*)**)**))*)()()()( )())()())(()()()('('('('('('('(''('('(''('(('&''&'&'&' &'&'&''&'&&''&''&'&'&'&'&%&%&%&%&%&%&%&%&%&%&&%&%&%&%%&%&&%%&%&%&%&%&%&%&%&%&%&%&%&%%&%&%&%%&%&%&%&%&%&%&&%&%&%%&%&%&%&%&%&%&%&%&%&%&'&&'&'&'&''&'&'&'&'&''&&'&'&'''&'('('(('((''(''('('('()()(()() ()())(())(()()()())*)*)*))*)*)*)*)*)*))*)*+*+*+*+*+*+*+*++,+,,++,+,++,+,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,++,,+,++,+,+,+,+,+,+,++,,++,+,++,++,+,+,+,+,+,++*+*+*+**+*+*+*+*)*)*)*))*) *)*)*))*)**))*)*)()()()()(()(()(()()('('('('('(''('('('('('&'&'&'&'&'&'&'&'&'&'&'&'&'&'&%&%&%&%&&%&%&&%&%&%&%&%&%&%&%&%&%&%%&%%&&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%&%%&%&%&%%&%&%&%&%&%&%&&%&%%&%&%&'&'&'&'&'&'&''&'&'&'&''&&'&'&'('('('('('(('('('()()()()()()()())()(()()()))*)*)*) *)*))**))*))*)*+*+*++*++*+*+*+*+*++*++,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+,++,+,,+,+,++ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+*+**+*++*+*+*+*+*)*)*)**)*)*)*)**)*)*)*)*)()()()()(()()(())()()()( '('(('((''(('('(('('('('&'&'&'&&'&'&'&'&'&'&'&'&'&%&%&%&&%&&%&%&%%&%&%&%&%&&%&%%&%&%&%&%&%%&%%&%&%&%%&%%&%&%%&%&%&%&%%&&%&%&%&%&%&%&&%&% &%%&&%%&%%&%%&%&%&%&%&%&%&%&&%&&%&%%&%&%&%&&%&%&%&'&'&'&'&&'&'&'&'&'&''&'&'('('(''('('('('('(('('()()()( )())()(())()()()()())()()))()*)*)**)*)*)*))*)**)*+*+*+*+*+*++*++*+*+*+*+*+*+*++,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,++,+,+,+,+,+ ,++,++,+,++,+,+,+,+,+,+,++,+,++,++,+,+,,+,+,,+*+*+*+*)*)*)**)*)*)*)*))*)*)*)()()()()()(()()()()('('(''( '((''('('('('(('('('('&'&'&'&'&'&'&'&'&'&'&''&%&%%&%&%&%%&%&%%&%&%&%&%&%&%&%&%&%&%%&%&%&%%&%&%&%%&%&%&%%&%&%&%%&%%&%&%&%&%&%&&%%%&&%&%&%&%&%&%%&%&%&%&%&&%&%&'&'&'&&'&'&'&'&''&''&'&'('('('('('(('('('('('()()()()())()(())()())*)*)*)*)*)*))*)*+* +*++*++*+*+*+*++,+,+,+,+,+,,+,+,,+,,+,+,+,++,+,+,+,+,+,++,+,+,+ ,+,,++,++,+,+,++,+,+,++,+ ,+,++,++,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,++,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,++,+*+*++*+*+*+**+*)*)*)*)*)*)*)*))**)*)()(()(())()(()()()('('('('('('(('('('&'&'&'&'&''&'&'&'&''&&%&%&%&&%%&%&%&%&%&&%%&&%&%&&%&%&%&%&%&%%&%&%&%&%%&%&%&%&%&%&%&%&%&%&%&%%&%&&%&%&%&%%&%%&%&%&%&&%&%%&&%&%&&%&&%&%%&%&&%&%&%&%&%&'&''&'&'&'&'&'&'&''&'&'('(''('('('('('('('('()()()(())()(())())(())*)*)*)*)*)*)**))*)*)*+*+*+*+**+*+*+*+*++,+,+,+,+,,+,,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,++*+*+**+*+*)*)*)*)*)*)*)*)*))*)*)*)**)*)()()())()()()()())()(()('('('('('('('(''(' &''&&'&''&'&'&'&'&'&''&''&'&'&'&'&'&&%&%&%&%&%&%&%&&%&%&%&%&&%&%&%&%&%&&%%&%&%%&%&%%&%&%&%&%&%%&%&%&%&%&%%&%&%&%&%&%%&%&%&%&%&&%%&&%%&%&%&%&%&'&'&'&'&'&'&'&&'&''&'&'('('('(''('('('('('('(('()()()(()()())()*)*)*)*)*)*)*)*)*+**++* +**++*++**+*+*+*++,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,+,+,+,+,+,+,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,,+*+**++*+*)*)**)*)*)**)*)*)**)*))*)()()())()( )()()()(())())()())(()('('( '('(('('(('('('('('('('&'&'&'&' &'&'&'&&'&'&'&&%&%&%&%&%&%&%&%&%&%&%%&%&%%&% &%%&%%&%%&%&%&%&%%&%$%$%$%&%&%&%&%%&%&%&%&%&%&%&%&% &%&%&&%&%&%&%&%&%&&%%&'&'&'&'&'&&'&'&&'&''&'&'&'&'('('('(''(('('('('('(('()()()()(()()))()*)*)**))*)**))**)*)*)**)*)*+*+*++*+*+*+ *+*+*++*+*++*+*+*++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,++,+,++,,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,+,+,*+*+**+**+*)*)*)*)*)*))*)*)*)()()()())()()()()(()()('('('('('('(('(''('('('&'&'&'&'&'&'&'&'&'&%&%&%&&%&%&%&%&%&%&%&%&%&%&%&%&%&%%$%$%$%$%$%$%$%&%&%&%%&%&%&%&%&%&%&%& %&%%&%&%&&%&&%&%&%&'&'&'&&'&'&'&'&'&'('('(''(('('('(''('('('()()(()(()()()()*)*)*)*)*)*+*+*+*+*++*+*+*++*+*+*++,+,+ ,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+*+*+*+*)*)*)*)**)*)*))*)*)()()())()(()()()()(()(()(('('(' ('((''(''(('('('('&'&'&''&''&&'&'&'&&''&'&'&'&'&&%&%&%&%&%&%&%&%&%&%&%&%&%&%%&&%&%&%&%%$%%$%$%$%%$%%$%$%$%$%$%$%$%$%$%$%&%&%&%%&%%&%&%&%%&%%&%&%&%&%&%&% &%&%%&%%&%&%&%&%&'&'&'&'&'''&'&'&'&'('('('(''(('(('('(('(('('()()()()()())(()())()*)*)*)*)*)*)*)*+**++*+*+*+**+*+*+*++,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+ ,++,++,+,++,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,+,++,+,+,+,+,+,+,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,++*+**+*+*)*)* )*))*))*)**)*))*)**)()()(()()()() ()(()(()()()(('(('('('('('('('('&'&' &'&&'&'&&'&'&'&'&&%&%&%&%&%&%&%&%&%&&%&%&%%&%&%&%&%&%&%%$%$%%$$%$%$ %$%$%%$%%$%$%$%&%%&%&%&%%&%&%&%&%&%&%&%&%&%&%&%&&%&%&'&'&'&&''&&'&'&'&'&'&''&'&'(' (''('('('(('('('('('()()()()(()()()()(()*)*))*))*)*)*)*))*)*)*+*+* +*++*++*+**+**+*+*+++,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,,+,+,++,,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+ ,++,++,++,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+*++*+*)*)*)**)*)*)*)*))*)*)*)()()()()(()()()()()(('('('('('('('&'&'&'&'&'&'&'&'&&%&%&%&%%&%&%&%&&%&%&%&%%&%&%&%&%&%&%&%&%&%%&%&%$%$%$%%%$%$%%$%$%$%$%%$%$%$%%$%$%$%$%$%$%$%%$%%&%&%&%&%&%&%&%&%&%&%&%%&%&%%&%&%&%&%&'&'&'&'&&'&'&'&'&&'&'&'&''&'&'&'('('((''(''((''(('('(('()()()()()(()()()()*))*)*)*)*))*)*)*)*+*+*+**+*+*+*+*++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+*+*)*)*)*)*))*)*)*)()()()()()()()('(('('('('('('('&''&''&''&&'&'&'&'&'&'&&'&'&'&'&'&&%&%&%&&%&%&%&%&%&%&%&%%&%&%&%&%&%$%$%%$%$%$%%$%$%$%$%$$%$%$%$$%$%$%$%$%$%$%%$%%&%&% &%%&%&%%&&%&%&%&%%&%%&%&%&&%%&&%&&%&&%&&%&%&%&%&'&'&'&'&'&'&'&'&'&'&'&'(''(('('('('('(''(''('('()()()())(())()()()()*)*)*)*))*)*)*)*)*+*+* +*+**+*+**++*+*+*+*+*+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+ ,+,+,++,++,,+,+,+,+,+,+,+,+,+,++*+*)*)*)*)*)**))*)*)*))*)()()()()(()()()(()()(('(('(('('('('('('(('('(''('&'&'&'&'&'&'&'&''&'&'&%&&%&%&%&%&&%&%&%&%&%&&%&%%&%&%&%&%&%%&%%&%&%$%$%$%$%%$$%%$%$%$%$%%$%$%$%$%$%$%$%$%$%$%$%$%$%$% $%%$%%$%$$%$%$%$%$%$%$%$%$%%$%$%&%&%&%&%%&&%%&%&%&%%&%&%%&%%&&%&%&%&&%&'&'&'&'&'&'&&'&&'&'&'&'&'('(('('(''(('('('()()()()()()()*)*)*)*)*)*)*+*+*+**++*+*+*+*+*+++,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,++,,+,++,+,+,+,+,+,+ ,++,++,++,,+,+,+,+,+,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+* )*)*)*))**)*)*)*)*)*)()()()()(()('('('('('('('('('('&'&'&'&&''&'&'&&'&&'&'&'&'&&''&&%&%&%&%&%&%%&&%&%&%&%$%$%$%$$%$%$%%$%$%$%$%$%$%$%$%$%$%$%$%$%$%$%$%$%$%$%$%%$%$%$%$%$%$$%$$%$%$%%$%$%%%$%$%&%&%&%&%&%&%&&%&%&'&'&'&'&'&'&'&''&&'&'&'&'('('('('('(' (''(('(''('('()()()()())(()())()()()*)*)*)*)**)*)*)*)*)*+**+*+*+*+*+*+**+*++*++*++,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+,++,+,,+,+,+,+, ,++,+,,+,,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,*+*+*)*)*)*)*)**)*)*))*)*)()()()()())())()('('('('('(('(' (''(''(''('('&'&'&'&'&'&'&'&'&'&''&'&%&%&&%&%&%&%&%&%&%&%&%&%&%&%$%$%$% $%$%%$$%$%% $%$$%%$%%$$%$%$%$ %$%$%%$%%$%$%$%$%$%$%$%$%$%$% $%$%$%%$$%$%$%$%%$$%$%$%%$%%$%&%&%&%&%&%&%&%&%&%%&%&%&%&%&%&'&'&&'&'&'&''&'&'&'&'&'&'&&'('(''('('('('('()()()(()(())()()()(()()*)*)*)*)**)*)*)*)*+*+*+*++*+*+*+*+*+*+**+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,++,+,+,+,++*+*)*))**))*)*)*) *)*))*)*))*)*)()()() ())(())(())(()()()('('(('('('(('('(' (''((''('('&'&'&''&'&'&'&&'&'&'&'&'&'&'&%&%&%&&%&%&%&%%&%&%&%&%&%$%$%$%$%$%$%$%$%%$%%$$%$%$%$$%%$$%$%$%$ %$%%$$%$$%%$%$%$%%$%$%$$%%$%$%$%%$%%$$%$%$%$%$%$%$%$%$%$%$%$%$%&%&%%&%&%%&&%%&%&%&%&%%&&%&%&%&%&'&'&'&'&'&'&'&'&''&'&'&'&'&''&'&'(' (''(('(''('('('()(()()(()((()()()()())())()()*)*))*)*)*)*))*)*)*)*)*)*+*+*+**++**+*+*++**+*+*+*+*+,+,,+,+,,+,,+,+,+,++,+,+,+,+,+,++,+,+,+ ,+,,++,++,+,+,+,++,++,+,+,+,+,+,++,+,++,+,+,+,+,+,+,,+,+,++,+,++,+,++,+,,+,+,++,+,+,+,+,,+,+,+,++,,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,++,*)*)*)*)*)**)*)*)*)())()()()()()()(()()('('('('((''(''('('('&''&'&'&'&'&'&'&'&'&% &%%&%%&%&&&%&%&%&%&%&%&%&%&%$%%$%$%$%$%$%$%$%$$%$%$%$%%$%%$%$%%$%$%$%$%$%$%$%$%$%$%$%%$%$%$%$%$%$%$%$$%%$%$$%$$%%$%%$%$%$%$%%$%$%%$%$$%$%$%&%&%&%&%&%&%&%&&%&%&%&&%&%&%&'&'&'&'&''&' &'&''&'&''&'&'('(''(('(''('('(('('()(()()()()()()*)*)*)*)*))*)*)*)*))*+*+*+*+*+*+*+*+*+**+,+,+,,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+*)*)*)*)*)*)()()()()()()('('((('('(''('('('&'&' &'&'&&'&&''&'&'&&'&&'&%&%&&%&%&%&%%&& %&%&%&&%%&%%&%&%&%&%&%&%$%$%$%$%$%$%$%%$%$%$%$%$%%$%%$%$%$%$$%%$$%%$$%$$%%$$%$$%$$%$%$%$%$%$%$%$%$%$%$%$%$%$%$%$%$%$%%$%$%$%%$%$%$%$%%$%$%$%$%$%$%$%$%$%%$%&%&&%%&&%&%&%&%&%&%&&%&&%&%&%&&'&'&'&''&'&'&'&'&&'(''('('('('('('()()((()()()()()*)*)*)*))*))*)*)*)*)*+*+*+*+*+*+*+*++*++*+ ,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+++,+,+,+,,+,+,+,+,+,+,++,+,+,+,+,+,++,,++,++,++,,++,,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++*)*)*)*)*))*)*)*)*)()()()()()())()()()('((''('('(('('(''('('((''('('&'&''&'&'&'&&'&'&&'&&'&'&'&'&&'&%&%&%&&%&&%&%%&%&%&%%&&%%&%&%&%%&%&%$%%$$%$%$%%$$%%$%$%$%$$%%$%$%$$%%$ %$$%%$%$$%$%$%$%$%$%%$$%$%%$%$%$$%%$$%$$%%$%$ %$$%$%%$%$%$%$$%$%$%$%$$%$%$$%$%$%$%$$%%$%$%$$%$%$%$%$%$%$%&%&%&%&%&%&%&%&%&&%&%&%&%&&'&'&''&'&&''&'&'&'&'&'('((''('('('('(''('()()())()()()()()()*)*)*)**)*)*)*)*)**)*)*+*+*+*+*+* +*++**++***+*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,,+,+,+,+,,++,+,++,+,+,+,+,++,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+*)*)**))*)*)*)*))*)()()()()()()('(('('(('(('((''('('&'&'&'&'&'&'&'&'&'&%&%&%&%&%&%&%&%&%&%$% $%$%%$$%%$%%$%$%$%$%$%$%$%%$%$%$%$%$%%$%%$%$%$%$%$%$%$%$%$$%%$%$%$%$%$%$$%$%$%$%$%$%$%$%%$%$%$%$%$%$%$%$%$%$%$%$%&%&%&%%&% &%&&%&%&%&%&%%&%&%&%&%&%&&'&' &'&&'&'&''&'&'&'&&'&'&'&'('(''(''('('('()(()()(()(())(()(()()()*))*)*))*)*)*)*)*+*+*+*+*+*+*++*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,,+,,+,+,+,++,++,+,+,+,++,++,+,+,+,+,++,+,++,,+,+,+,+,+,,+,++,+,++,,+,+,+,+,+,+,+,+,++,++,,++,++,+,++,+,+,+,+,+,+*)*)*)*))*)*)**)*) ())()())()()()())()()(()('('('(('('('(''(('('('('&'&'&'&' &''&''&&'&&'&'&%&%&%&&%%&&%&%&%&%&%&&%&%%&%&%&%$%$%$%$%%$%%$%$%$$%$%$%$%$%$%$$%$%$%$%$%$%$$%$%$%$%$$%$$%$%$$%%$%$$%$%$$%$%$%$%$%%$%$%$%$%$%%$%$%%$%$%$%$%$%&%%&%%&%&%&%&%&%&%&%&%&%&%&&'&'&'&'&'('('(''('('('('()(())((()(()()()()()*)**)*)*)*)*)*)*+*+*+*+*+*+*+*+*+,+,+,+,+,+,++,+,+,+,+,+,+,+ ,++,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,++,+ ,++,+,++,,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+*)*)*)*))*))*))*))*)**)*) ()())()()()()(()()()()()('('('('('(''('('&'&'&'&&'&'&'&'&&'&%&%&%&%%&%&%&%%&%&%&%$%%$%$% $%$%%$%$%$$%$%$$%$%$%$%$%$%$%$%%$%%$%$%$%$%%%$%$$%$%$%$$%$%$%$%$%$%$%$%$$%$%%$%$%$%%$$%%$%$%$%%$$%%$$%$$%$%$%$%$%$%$%$%&%%&&%&% &%&&%%&&%%&%&%&%&%&%&%&%&%&%&'&'&&''&'&''&&'&&'&&'&&'&'&'&'('(''('('('('('(('('('('(()( )()())()(()(()*)*)*))*)*)*))*)*)*+*+*+*+*+ *+*+*+**+*+*++,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,,+,+,++,+,++,+,+,+,+,,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+*)*)**) *)*)**)*)*)*)**)*)*)()()()())()()('(('(('(''('('('&'&''&'&'&'&'&%&%&%&%&%%&%&%&%&%$%$%%$%$%$%$%$%$%$%%$%$%$%$%%$%$%$$%$%$%$%$%$%$%$%$%$%$$%$%$%$%$%$%$%$$%$%$%$$%$$%%$$%%$%%$%%$%$%$%$%$$%$%%$$%%$%$%$$%&%&%&%&%&%&%&%&%&&%&'&&'&&'&&'&'&'&&'&'&'&'&'&'(''('('('('('('('('()((()()()()()*))*) *)*)**))*)*)*)*)*)*)*)*+**++*+*++*+**+**+*++*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,++,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+*)*)*)*)*)*)*)*)*))*)())()()()()()()()(()(()('('((''('('('('('&''&'&'&'&&''&'&%&%&%&%&%&%&%&%%&%&%&&%&%&%&%$%$%$%%$%$%$%$%%$%$%$$%$%$%$%$%$%$%$%$$%$%$%$%$%$%$%$%$%$%$%$$%%$%$%$%$%%$%%$%$%$%$%$%$$%$%$%$%$%$%$%&%&%&%&%%&&%%&%&%&%%&%%&&'&'&'&''&'&'&&'&''&'&'&'&'(' ('('(''(('('('(''('('('(('()(()()(())()()(()()(())()(()()*)*)*)*)**))*)*+*+*+*+*++*+*+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,,+,+,+,,+,+,+,+,+,+,,+,+,++,,+,+,++,+,+,++,++,+,+,+,++,+++,+,+,+,+,,+,+,+,,+,+,+,+,+,+,++,,+,+,,+,++,+,+,+*)*)*)*)*)*)*))*)())()()())()()())()()('('((''('(''(''('('&''&'&'&''&'&''&'&%& %&%&%&&%&%%&%&&%&%%&%&%&%$%$%$%$%$%$%$%$%$%$%$%$%$%$%$%$$%$%$%$%$%$$%$%$%$%$%$%$%$%$%$$%$%$%%$$%$%$$%$$%$%$%%$%$%$%$%%$%$%$%$%%$%$%%$%&%&%&%&%&%&%&%%&%&%%&%&'&'&&'& '&&'&&''&&'&'&''&&'&&'&'&'('('('('('('('('('('((''(()()(()()()()()()(()()*)*)*)*)*)*)*+*+*+++*+*+*+*+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,++,,+,+,+,+,,+,+,+,+,+,++,++,+,++,+,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,+,+,+,+,+,,+,+,+,++,++,+,+,+,*)*)*)*)*)*)*)()()()()())())('('(''('('(''('('(''('&'&''&'&'&'&''&'&'&'&'&'&%&%&%&&%&%&%&%&%&%%&%&%&%&%$%%$%$%$%$$%$%$%$%$%$%$%$%$%$$%$%$%$%$%$%$$%$%$% $%$%$%$%$$%$%$$%$%$$%$%$$%$%$$%$%$%$%$%%$%&%&%&%&%&%&%&&%%&%&&%&'&'&'&'('('('(('('(''('('('(()()()( )()(())(()(()()*)*)**)**))*)*)*)*)*)*+* +**++*++*+**+++*+*+*++*+*+,++,,+,+,,++,+,+,+,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,++,++,,+,++,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+*)*)**)*)*) *))*)*)*)*)())()( )())(()())()()()()('('('('('(''('(''(('('('&'&'&'&'&'&&'&'&'&&'&'&%&%&%&%&%&%&%&&%&%&%%&%$%$%$%$%$$%%$%$%$%$%$%$%$%$%$%%$%$%$%$%$$#$#$#$#$%$%$$%$%$%%$%$%$%$%%$%$$%$%$%$%%$%%$$%$%$%&%%&%&%%&%&%&%&%%&%&%&%&'&'&' &''&&''&'&'&''&'&' (''(('(''(''('(''((''('('('(('(''('(()()()()()()(()())()()*)*)*)*)*)**)**)*)*)*)*+*+*+*+*+++*++**+*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++*)**)*)*))*)*)*)())(()(()()()('('('(('('('(''(''('(('('('&'&'&'&'&'&'&%&%&%&%&%&%&%&%&&%%&%&%%$ %$%$%$$%$%$$%$%$%$%$%$%$%$%$%$%$%$#$#$#$#$#$#$#$#$%$%$$%$%$$%$%$%$%$%$%%$$%$%$%$%$%&%&%&%&%&%%&%&%&%&%&%&'&&'&'&'&'&&'&'&'&'('('('('('('('('(()()()()()(()()*) *)**)**)*)*)*+*+*+*+*+** +**+*+**+*++**+,+,,+,+,+,++,+,+,+,+,+,++,+,+,+ ,+,,++,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,*)*)*)*)*)*)*)()()()()()()()()()()('('((''('('('('('('&'&'&'&'&'&'&%&%&%&%&&%&% &%&&%%&%%&%%$%$%$%%$$%$%$%$%$%$%$$%$$%$%$%$%$$#$#$#$#$#$#$#$$#$#$#$#$#$#$#$#$%$%$$$%$%$$%$%$%$$%$$%$ %$%$$%$$%%$%%$ %$$%%$$%%$%$%$%&%& %&%&&%&%%&&%&%&%&%&'&'&'&'&&'&'&'&'('(''('(''((''('('(()()()( )())(()()()*)*)*)**)*)*)*+**+*++*+*+*+,+,+,+,+,+,+,+,+,++,+,+,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,++,++,++,+,++,,++,+,+,+,+,++,+,++,++,+,+,+ ,++,+,++,,+)* )**)**)**))*)*)*)())()()()()(()()()()(()('('('(('('(('('&'&'&&''&'&&'&''&'&'&'&%&%&%&%&%&%&&%&%&%&%&%&%&%%$%$%$%$%$%%$$%$%$$%$%$%$%$%$%$%$%$#$#$#$#$$##$$#$#$#$#$#$#$#$$##$#$#$#$#$#$$#$#$#$$%$$%$%$%$$%$$%$%$%%$$%$%$$%$%%$$%$%$%$%&%&%&%&%&%&&%%&&%&%&%&'&'&'&'&''&''&'&'(''('('('('('('()()()()()()()*))**) *))**)**))*)*+*+*+*+*+*+**+*+*+*+*+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,++,,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+ ,++,++,,++,+,+,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,++)*)*)*)*)*)()()(()()()())()('(('(('(''('((''('('(''(' &'&''&'&''&'&' &'&&'&'&&''&'&%&%&%&%&%&&%&%&%&%%$%$%$%$%$%$%$%$%$$%$%$$%$%$$%$$%$%$#$#$#$#$$#$#$$##$#$##$#$#$#$#$#$#$$#$#$#$#$#$#$$#$$#$#$#$$%$%$$%$%$ %$%$%%$%%$%$%$%$%$%%$%%$$%&%&%&%&%&%&%&%&%&'&'&'&'&''&'&''&'&'('(''('('(('(('('('()())()()()())()()*)*)**)*)*)*)*+*+*+*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,++,+,+,+,+,+,++,+,+,+,+,+,+ ,+,++,,+,,*)*))**)**)**)*)**))*)()()()()()()()()('(('('('( '(('('((''(''('('&'&'&'&'&'&'&'&'&%&%&%&%&%&%&%&%&%%$%$%$%%$%$%$%$%$%$%$%$#$#$$#$#$#$#$#$#$#$#$#$#$#$#$# $##$$#$$#$$#$#$#$#$#$##$#$$#$#$$%$%$%$%$%$%$%%$%%$%%$%%$$%$$%$%$%$%&%&%&%%&%&%&%&&%&%&%&'&'&'&'&'&'&'('('('('('(('()()()()()()()*)*)*)*)*)**)*)*)**)*)*+*+*++*+**+**+*++*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+*)*)*)*) *))*)*))**)*)()()()()()()()('( '(('('(('('('('(''&''&''&&''&''&&''&'&'&'&'&%&%&%%&%&%&%&%&%&%&%$%%$%$%$%$%$%$%$%$%$%$%$%$%$#$#$##$#$#$#$#$#$#$$#$#$$#$#$$#$##$##$#$#$#$#$#$$#$#$#$##$##$#$$#$#$#$#$$#$ #$#$##$#$##$#$#$#$$##$#$#$#$$#$#$%$%$$%$%$$%$%$%%$%$%$%$%$%&% &%&&%&&%&%%&%&&%&%&%&%&'&'&'&''&&'&'&''&''&&'&'&'('('(('(''()()()()()()()()*))**)*)*)*)**)*)*+*++*++*+*+*+*+*+,+,+,+,+,+,+,+,+ ,++,++,+,++,+,+,+,++,++,++,+,+,+,+,+,++,,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,+ ,++,++,++,,+,+*)*)*)*))*))*)() ()()()()())()()('('(''('(('('('('('('('&'&'&'&'&'&'&'&'&'&%&%&%&%&%&%&%&%$%%$%$%$%$%$%$%$%$%$%$%$$%$%$#$#$#$#$$#$#$#$##$#$#$ #$#$$#$#$#$# $#$$##$$#$$##$#$##$$##$##$#$#$#$#$#$# $#$$##$#$$##$#$$#$#$#$#$#$$%$%$%$%$%$%$%$%$%%$%$%%$%$%$%&%%%&%&%&%&%&%&'&'&&'&'&'&'&'&'&&'('(''('(''(('('(('('( )(()())()()()(()()()*)*)*)*)*))*)*+*+*+**+*+* +*+*+**++*+*+*+,+,++,+,++,,+,+,+,+,+,,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,++,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+*)*)*)**)*)*)**)*)*))*)()()()()(()()('('(''(('('('(''(''(''&'&'&'&&'&'&'&%&%&%&&%&%&%&%&%$%$%$%$%$$%$%$%$%%$%$%$%$%$%$%$%$%$%$%$%$#$#$#$$#$#$#$#$$##$#$#$$#$$#$$##$#$#$#$##$#$#$#$#$#$$#$#$##$#$$#$#$#$#$##$#$#$#$##$#$#$#$#$#$#$$#$#$%$%$$%$%$%$%$%$$%$%$%$%$%%$%&%%&%&%&&%&%%&%&'&'&'&'&'&''&'&'&''&'&'('('('('('(('('('()()()(()()()()()*)*)*))*))*)*)*)*+*+**+*+*+*++*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,,+,,+,+,+,+,+,++,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,++,++,,+*)*)*)*)*)*)**)()()()()('(''('('('('('(''&'&'&'&'&'&'&%&%&%&%& %&%&%%&&%%&%&%&%&%$%%$%%$%$%$%$%$%$%$%$%$%$%$#$#$$#$#$#$#$##$#$#$#$$##$ #$$##$$#$$#$#$##$##$#$$#$#$#$#$#$##$#$#$#$$#$$#$#$#$#$#$#$#$$#$#$#$#$#$#$$#$#$ %$$%$%%$%%$%$%$%$$%$%$$%%$%$$%$%&%&%&%&%&%&%&%&%&%&%&%&%&%&'&'&&'&&'&'&'&'&'&'&'('('('('('((('('()()(())(()())()()()*)*) *)*)*))*)*))*)*)*+**+* +**++*+*+**+*+*+*+*+,+,++,+,+,+,++,+,+,+,+,+,,+,+,+,++,+,+,+,++,+,+,+,,+,+,+,,+,+,++,+,+,+,+,++,+,+,+,+++ ,+,++,++,++,+,+,+,+,+,+,+ ,++,++,+,+,,+,+,+,+,++,,+ ,+,,+,++,++)*)**)*)**))*))*))*)*)()()())()()()('('(' ('(('('((''('('(''&'&'&'&''&'&&'&'&&'&%&%&%&% &%&%%&%&%&&%&%&%$%$%$%%$%%$%$%$%$%$%%$%$$%$%$%$%$%$%$%$#$#$#$#$$#$#$#$##$#$##$#$#$#$#$#$#$##$$##$#$#$#$##$#$#$#$#$#$#$#$#$#$$#$#$##$#$#$#$#$#$$#$$##$#$#$#$#$%$%$%$%%$%$%$%$%$%%$$%$%$%&%%&%&%&&%&&%%&%%&%&%&'&'&&'&&'&'&'&'&'&'&'&'('('('('(''(('()()()()()()()()*)*)*))**)*)*)*)*+*+**+**+*+*+*+**+*+*+*+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,++,+,+,+,,++,+,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+*)**)*)*)*)*)() ()(()())())()()()('('('('('(''(''(''&'&'&'&'&'&'&'&&'&%&%&%&%%&%&%&%%&&%&%$%%%$%$%$%$%$%$%$%$%$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$##$##$#$#$#$#$#$#$#$#$#$#$#$#$#$#$##$#$#$##$#$#$#$#$#$#$$##$##$#$#$%$%$%$%$%$%%$%$%$%$%%$$%$%$%%&%&%&%&%&%&%&&%&%&%&'&'&'&'&'&'&'&'&'&'&''&'&'('('('(('(''('('()()()(()()()()()()*))*)*)*)*)*)*)**)*+*+**+**++*+**+**+*+*+*+,+,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,,*)*))*)*)*)*)()()())()()()(()()()('('(' (''('(''(''(('('(' '&&'&&'&''&&'&'&'&'&%&%&&%&%&%&%&%&&%&%$%$%$%$ $%%$$%%$$%%$%$%$%%$%$#$#$#$#$#$#$# $##$##$#$##$#$##$##$##$##$#$#$#$#$#$#$#$#$#$#$#$$#$#$##$$##$##$##$$#$#$#$#$#$#$#$$#$$#$##$#$#$#$$#$#$#$%$%$%$%$$%$%$%$%$%$%$%$%%&%&%&%%&%&%&%&%&&%&'&'&'&'&'&'&'&'('('('(''(('('()()()())()()()()*)*)*)**)*)*)*)*)*)*)*+*++*+*+* +*+*+**+**+*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+++,+,++,,+,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+*)*)*)*)()(()(())()(()(()()('('('('(''('('((''((''&'&'&''&&'&'&'&%&%&%%&%%&%%&%&%&%&%&%&%&%&%&%$%$%$%$%$%$$%$%$%$%$#$#$#$#$#$#$#$#$##$#$#$#$#$##$#$#$#$##$$#$#$#$#$##$##$#$##$#$#$#$#$$#$#$#$#$#$#$##$#$#$#$#$#$#$%$%$%$$%$%$%$%%$%$%$%%&%&%&%&%&%&&%&%&%&%&'&'&'&'&'('('('(''(('('('()()(()()()()()()()()*)*)*))*)*)**))*)*+**+*+*+*+*+,+,+,+,+,++,+,+,+ ,+,,++,++,+,+,+,+,+,++,,,+,+,+,+,,+,+,+,+,,++,,+,+,++,+,+,,++,+,+,+,+,+,++,,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+)*)*)*)*)()())()()()()('(''(('('(''('('(''&''&'&'&&'&'&'&'&'&%&%&&%&%&%&%&%&%&%&%$%$$%$$%$%$%$%$%$%$%$%$#$#$#$$#$#$#$##$ #$$#$$#$$##$#$#$#$$#$##$#$#$##$$#$#$##$##$#$#$#$#$#$#$#$#$#$#$#$#$#$#$$#$#$#$##$##$#$##$#$$#$##$$#$#$$#$$#$##$#$$#$#$#$#$#$%$%$%$%$%$%$%$%$%%&%&%%&%&%&&%&%&%&%&%&'&'&&''&'&&''&'&&'&'('('('('('(('()()(()(()()()()(()*)*))*)*)*)*)*)*+*+*+*++*++*+*+*+*+*++*+,+,+,+,+,+,++,+,+,++,+,+,+,++,++,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,+,++,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+*)*)*)*)()()(()()()())()()('('('(('('(('('&'&'&''&'&'&''&&'&'&'&%&%&%%&%%&%&%%&%&&%$%%$%$%$$%%$%$%$%%$$%$$%$%$%$%$#$#$$#$#$#$#$#$#$#$#$$##$$#$#$##$##$#$#$##$#$# $##$##$#$#$#$#$#$##$#$#$#$##$#$#$#$#$#$#$#$#$#$##$$#$#$#$#$#$$##$$##$#$#$#$#$%$%$%$%$%$%$$%$%$%$%%&%&%&%&%%&%&%&%&%&%&'&'&'&'&'&'&'&' (''(''('('(('('()()()(()(()())(()()()*)*)*)*))*)*)*)**)**+**+**+*+*++*+*+*+**+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,++,+,+ ,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,,+,+,+,++,+,+,++,+,+,++,+,+,+,+,,+,+,+,+,+)*)*))*)())()())(()()()()()(()()()('('(('('('('('('(('('((''('&'&'&'&' &'&''&'&''&'&'&'&%&%&%%&%&%&%&&%&%&%$%$%$%%$%%$%$$%$%$%$$%$%%$%$%$$%$#$#$#$$##$#$#$$##$##$#$#$##$$#$#$##$$#$##$$#$#$#$$#$#$#$##$$##$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$# $#$#$$#$#$#$#$#$##$$##$#$%$%$%$%$%$$%$%$$%$%$%$%$%$%%&%&%&%&%%&&%&%&%& %&%&&%&&%&%&'&&'&'&'&'(''(''('('('('(('()()()()()()() ())())())()*)*)*)*)*)*)**))**)*)*+*+**+*+*+*+*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,++,+,+,+,++,+,++)*))*))*)*)()()()()()()()('( '(('(''(('('('(''('('&'&''&&'&'&'&'&'&'&'&%&&%%&%%&&%%&%&%&%&%$%$%$%$%$%$%$%$%$%$%$#$#$#$$#$ #$#$$##$$#$$#$#$#$#$#$#$ #$$##$#$##$#$#$#$##$$##$#$#$#$#$#$#$##$##$$#$#$ #$##$#$#$$#$$#$#$#$%$%$%$$%$%$%$%$%$%$%%%&%&%&%%&&%&%&%&%&'&'&''&'&'&'&&'&'&'&'('(''('('(('('()()(()()()()()()*)*)*)*)*)**++*+*+*+*+*+*+*+*+*+*+*+*+,+,+,+,+,+,+,+,+,++,+,+,++,+,,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+)*)*)()()()()())()(())('( '(('(('(''('('('(''(''('&'&''&'&'&'&'&&'&%&%&%&&%&&%&%&%&%$%$%%$%$%$ %$%$%$%%$$$%$$%$%$#$#$$#$$#$#$#$#$$#$$#$#$#$#$#$##"#"#"#$#$#$#$#$##$##$##$#$#$#$##$#$#$#$##$##$#$$#$#$$#$#$#$#$%$%$%$%$%$%$%%$%&%&%&%&%&%%&&%&&%&%&&%&&%&%&'&'&'&'&'&'&&'&'('('(('('('('('('(('('()()()()()()()*)*)*)*)*)**+*+*+*+*+*+*+,+,+ ,++,++,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,,+,,++*)*))*)*)()()()()()()('('('( '(''('(('('('&'&''&'&'&'&'&'&%&%&%%&%&%&%&%&%%&%&%$%$%$%$$%$%$%$$%$%$$%$#$#$#$#$#$#$$#$#$#$#$##$#$#$##$$#$#$#$#$#$##"#" #"#"##"##"#"#"#$#$##$#$#$#$#$#$#$#$#$#$#$#$#$$#$#$%$%$$%%$%$%$%$%$%$%$%$%&% &%%&%&%&%&&%&%&%&'&'&'&''&&''&&''&'&'&''('(''(''('('()()(()()(()()()(()()()()*)*)*)* )*)*)*)*)*)**+*+*+*+*+*+*+,+,+,+,+,+,+,,+,+,++,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+)**)*)*))*)()()()()()()()('('('('('('('('&'&'&'&'&%&%&%&%&%&%&&%&%&%$%$%$%$%$$%%$%$%$%$#$#$##$#$#$#$#$#$#$#$#$#$#$#$#"##"#"#"#"#"#"#"#"#$#$#$#$#$#$#$#$#$#$##$#$##$#$#$#$#$#$#$%$%$%$%$%$%$%$%$$%$%$%%$%%$%$%$%&%&%%&%&&%%&%%&&%%&&%&%&&%%&'&'&'&'&'('''('('((''((''('('()()()()()()())()()()()*))**)*)**)*))*))*)**))**+*+*+*+*+*++*+*+*+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,,+,+,,+,+,+,+,*)*)*)()()()()('(('('('('('&'&'&'&'&'&'&%&%&%&%%&&%%&%&%&%&%&%&%&%%&%$%$%$%$%$%$%$$%$%$%$%$$%$%$#$#$#$$#$#$#$#$#$#$#$#$#$#$##$#$#"##"#"#"#"#""#"#"#"#"#"#"##"#"#"##$#$#$#$##$#$#$#$#$##$#$#$#$#$$#$$#$#$#$#$%$%$%$%$%%$%$%$%$$%$%$%&%%&&%&%&%&%&%%&%%&'&'&'&'&''&&'&'&''('('('(''('('()()()())()()()*)*)*)*)*)**+*++*+*+ *++*+*+*+*+,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,++,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+, ,+,,++,++,+,+,++,,+,+,+,+,+,+,+,+,+,,+,+,+,+,,+,+,+,+,+,+*)*)()()()())())('('('(''('('(''('('&''&''&'&'&'&&'&'&'&''&%&%&%&&%&%&%&%&%%&%&%$%$%$%$%$%$%$%$%$$#$#$#$#$#$#$#$#$#$#$$#$#$#$#$#$#$#$#"##"#"#"#"#"#"#"#"#"#"#"#"#"##"#""#"#"#"#"#"#"#"#"#"#"#"#"##$#$#$#$##$#$##$#$##$##$$#$#$#$##$#$%$$%$%$%$$%$$%$$%$%$%$%&%&&%&%&%%&&%&%&'&'&'&'&'&''&'&'&'&'&''('(''(''( '(''('('(('()()()()()()*)*)*)*)**+*+*+*+*+*+*+*+*+,++,,+,+,++,++,,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,++,,+,++,+,+,+,+,+,+,++,,++,+,++,++,+,+,+,+,+,+,++,+*)*)()()()(()( )()()(()())('('('('('('(('&''&'&'&'&'&''&&'&'&%&%&%&%&&%&%&%&%%&%&%%&%&%$%%$%$%$%$%$%$$%$%$%$%$$#$$#$#$#$#$##$#$#$#$#$#$#$#$#"#"#"#"#"#"#"#"#"#"#"#"#"#"##"#"#"#"#"#""#""#"#"##"#"#"#"#"#"#$#$#$#$#$#$#$#$#$#$#$%$%$%$%$%$%$%%$$%$%$%$%&%&%&%&%&%&% &%%&&%&%%&%&'&'&'&'&'&'&''(' ('(''((''(''('('('()()()()()()()()*)*))*)*))*)*)** +**+**+**++*+*+*++*+*+*+*+,+,+,+,++,+,,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+*)*)())()()()())()()()()('('('('('('('&'&'&''&''&'&''&'&'&&'&'&&'&'&%&%&%&&%&% &%%&%&%%&&%&%&%&%$%$%$%$%$%%$%$%$%$$#$#$#$#$#$$##$$#$#$#$#$#"#"##"#"#"##"#""##"#"##"##"#"##""##""#"#"#"#"#"#"#"#"#"##""#"##"##""#"##""#""##"##"#"#"#"##"##"#$#$#$#$#$#$#$##$##$#$#$#$$##$#$#$%$%$%$%$%$%$$%$%$%$%$%$$%&%&%%&%&%&%&%&'&'&'&'&'&&'&'&''('('('(''('(''('(('('()()())())()()()()()*)*)*)*)*)**))*)***)*+*+**+**++*+*+*+*+,+,+,+,+,+,+,+,+,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,++,+,+,+ ,++,++,+,++,+,+,+,+,+,+,++,+,++,++,+,+,,+,+,,+)()(()()()()()(()('('('('((''('('('&'&''&'&'&''&'&&&'&'&%&%&%&%&%&%$%$%$%$%$%%$$%$%$$#$# $#$#$##$#$##$#$#$$#$#$#$#$#"#"#"#"##"#"#"#" #"##""#""##"#"#"##"#"#"##"#"#"##"##""#"#"#"#"##"#""#"#"#"#"#"#"#"##"#"#$#$#$#$# $#$$#$$##$##$$#$ #$#$$#$#$#$#$%$%$%$%$%$%$%$%$%$%$%%$%$%&% &%%&&%&%&&%&%&%&%&'& '&'&&''&&'&&'&'&'&''&''('('('('('('()( )())())()()()*) *)*)*)**)*) *))*)*))*)***)*+*++*++**++**+*+*+**+*+,+,+ ,+,,++,++,+,+,+,+,+,++,,++,+,+,++,+ ,+,++,++,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+)()()()()()()(())()('('('('('(''('('&'&'&''&&'&'&''&&'&&'&'&%&%&%&%&%$%$%$ %$%%$$%$$%$$#$#$##$##$$#$#$#$##$#"#"#"#"#"#"##"#"##"#"#"#"#"#"#"#"#"##"#"#"#"#"#"#"# "#""#""##"##"#"#"#"#"#"#"#""#""#"##"#"##"##"#$#$#$#$#$#$#$$#$#$$#$#$#$#$$#$#$%$%$%$%$$%$% $%$%%$%$%%$%$%&%&%&%&%%&%%&%&'&&'&'&'&'&''&&'&'&'&'('('('('('('()()(()()()()*)*)*)**)**)*+*+*+*+**+*+*++**+*+,+,++,+,+,++,+,+,++,,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,+,+,+,*)()()()()()()()(()()(())())('('('('(''('('&'&'&'&&'&'&&''&&'&'&'&%&%%&%&&%&%&%&%&%&%&%$%$%$%%$%$%$%$%$%$%$%$#$#$#$#$#$$##$#$##$#$#$#$$#$$#$#"#"##"#"#"#"##"#"#"#""##""#"#"#"#""#""#"#"#"#"#""#"##""#"#"#"#"#"#"#"#"#"#"#"##"#"#"##"#"#"#"##"#"##""##""#"#"#"#"#"#"##"#$#$#$#$#$#$#$#$$#$##$#$#$#$%$%$$%%$%$%$%%$%$%$$%&%&&%&%&%&%&%&'&'&'&'&&''&&''('('('('('()(()()()())(()()*)*)*)*)*)*))*)*)*)*)*+*+**++*+*+*+*+*+*+,+,+,+,+,+,++,,+,+,++,+ ,++,+,,++,+ ,++,++,,++,+,+,+,+,+,+,++,,+,+,++,+,++,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,,+,++,+)()()())()()())()('('('(('('('('('&''&&'&'&''&'&'&&'&'&''&&'&'&%&%&%&&%&%&%&%&%&%&%$%$%$%%$%$%$%$%$#$#$$#$#$#$#$#$#$#$##$#$#"#"##"#"#"#"#"#"##""#"##""#"#""##""##"##"#" #""#"##"#"#"#""#"#"#"#""#"#""#"#"#" #""##"##"#""#"#"#"#"#"#"#"#"#"#$#$#$#$#$#$#$#$#$#$ #$##$$##$$#$%$%$%$%$$%%$%$%$%$%$%$%&%&&%%&%&%%&%&&%&%&%&%&'&'&' &''&''&'&&'&'&''('('('(('('('()())()()()()*)*)*)**+*+**+*+*+**+*+*+*+*+,+,+,+,+,+,+,++,++,+,+,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,,+,++,,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,+,+,+,+,+)()())(()()()(()()('((''('('('('('&''&'&' &'&&''&&'&'&&%&%&%&&%&%&%&%&%$%$%$%$%$%$%$%$##$#$#$$#$#$#$#$#"#"#"#"#"#"#"#"#"#"#"##""##"#"#"#"#"#""#"#"#"#"#"#""#"#"#""#"#"#"##"#"#"#"#"#"#"#"#"#"#""##"##"#"#$##$#$#$#$##$#$#$#$#$#$#$#$%$%$$%$%$%%$%$%$%$$%$%$%$%&%&%%&%%&%&%&'&'&'&'&'&&'&&''(' ('((''(''(('('('()()()())()()())()()*)*)**)*)**))*)*)**)*+*+*+*+*+*+*+*+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,)())()()(()()('('('(''(''('&'&'&'&'&'&'&&%&%&%&%&%&%&%&%&%$%$%$%$%$%$%$%$%$%$#$#$#$$##$#$#$#$#$#$#$#$#"#"#"#"#"#"#"#" #"#"#"##""#"#"#"#"#"#"#""#"#""##"#"#""#""#"#""##"#""#"#""#"#"#"#"#"#"#"#"#"##"#"##"#"##"#"#"#""#""#$#$#$#$#$#$##$$#$#$$#$#$%$$$%%$%$%$%$%$%%$%&%&%&%%&%&%&%&%& '&&''&&'&'&&'&''&'('('('('(('(('('('()()()()())()()*) *))*)**)**)*)*)*+*+**+*+**+*++*+*+*+*+,+,++,+,+,+,+,+,+,++,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,+,+,++,+,+,+,+,+,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+)() ()(()(()())()(()())('('('('('('(('('('&''&'&'&'&'&'&%&%&%&%&%&%&%&%&%$%$%$%$%$%$%$#$#$#$#$#$#$#$#$#$##$##$#"##"#"#"# "##""#"#"##"#"#"#"#"#"#"#"#""#"#""#"#"#"#"#"#"#"#"##"#"#"#"#"#"#"##""#"#"#"#"#"#"#"#"#"#"#"#"# $##$##$$##$#$#$#$#$#$# $#$#$$#$$##$#$%$%$$%%$%$%%$$%$$%$$%$$%$%$%$%$%&%&%%&%&%&&%&%&'&&'&'&''&'&'('(''('(('('('()()( )(()())()(()(()()*)*)*)*))*)*)*)*)*))*)*+*+*+*+*+*+*+*+,+,+,,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+ ,++,++,++,+,+,+,+,++,++,+++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,++)())()()()(()()('((''(('('('('('&''&''&'&'&'&'&&%&%&%&&%&%&%$%$%$%%$%$%%$%%$%$%$#$#$#$##$#$##$#$#$#$#$#$#"#"#"#"#"#"##"#"#"#"##"#"#"#""##"#"#""#"#"#""#"#"#"#"#""#"#"#""#""##""##"#""##"#"#"#"#""#"#"#"#"#""#"##"#"#$#$##$#$#$#$#$#$#$$ %$$%$$%$%$%$$%$%$%$%$%$%&%%&%&%&%&%&%&%&'&'&'&'&''&'('('('('('('()()()(()()()()*)*)*)*)**)**)*)*+*+*++*+*+*+*+*+*+*+*+*+,+,+,+,+,+,+,+,+,+,++,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+,+)()()()(()()()('('('('('('((' (''(''(''('&'&''&&'&'&''&&'&&%&%&&%&%&%&%&%&%$%$%$%$$%%$$%$%$$%$%$%$%$#$#$$#$#$#$###$$#$#$#$#$#"#"#"#"#"#"#"#"#"#"#"#"#"#"#"#"#"#"#"#""##"#""#"#"##"##"#"#"##"#"#""#"#"#"#"#"# "##"##"##"#$#$##$#$#$##$#$#$#$#$$%$%$%$%$%$%$%$%&% &%&%&%%&&%&%&%&%%&%&%&%&&%&'&'&'&'&&''&''&'&&'&'&'('('('('(''('( )()(()()(())()()()*)*)*))*)*))*))*)*)*+*+*+*++**+*+*+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,++,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,,+++,+,+,+,+,++,+,+,+,+,+ ,+,+,++,++,,+,+,+,+,+,+,+,+,+,++,+)()()())(()()()('('('('(('(''(''('(''('('&''&&'&''&''&'&&'&'&&%&%&%%&%&%&%&%$%$% $%%$%$%%$%$%$%$#$#$#$#$$#$#$#$#$#$#$#$#$#$#$#"#"##"#"#"##"#"#"#"#"#"#""#"#"#"#"#"#"#"##"#"#"#"#"#"#"#"#""##""#"#"#"#"##"#"##""#"#$#$#$#$#$##$#$##$#$$#$#$#$$ %$$%$$%%$$%$%$ %$$%$%%$$%$%&%&%&%&%&%&%&&%&%&%&'&'&&'&'&'&&''&'&'('('('('('('('()(())()()()()*)*))*))*)**)**)*)*)*+*++*+*+*+*+*+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+,++,,+,++,+,+,+,+,++,+ ,++,++,++,,+,+,+,+,+,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+,++,+,,)()())()()()()('(('('('('('('&'&'&'&''&'&&%&%&%&&%&%&%&%&%&%$%$%$% $%$$%%$$%$$%$$%$%$%$%$#$#$#$#$#$#$##$#$$#$#"#"#"#"#"#"##""##""#""##"#"##""##"#"##""#"#"#""#"#"#""#"#""#"#"#""#"#"#"#"#"#"#"#$#$#$#$##$##$#$$##$#$#$$%$%$%$$%$%$%$%$%%$%$%%$%$%&%&%&%&%&%&&%&%&%%&%&'&'&'&''&&'&'('('('('(''('('()()()()())(()()*)*)*)*)**)*)*+*++**+*+*+**+**+*+*++*+*+,+,+,++,,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,++,,)()()())()()()('('('('('('(''('&'&'&'&'&'&&'&&'&'&&%&%&%%&&%&%%&&%&%&%&&%$%$%%$$%$%$%$$%%$$%$$%%$%$%$#$$#$#$#$##$##$#$##$#$#$#"#"#"#"#"#"#"#"#""#"#"#"#"#"#"#""!"!"!"!"#"#"#"#"#""#"#"#""#"#"# "##"##"#""#"#"##"#"#"#"#$#$#$#$#$#$#$#$#$ #$$#$$##$#$$#$%$%$%$$%$$%%$%$%%$$%&%&%&%&&%&%&%&%&%&'&'&'&'&'&&'&'('('('('('()()()()()()*)*)*)**)*)**)*))*+*+*+*+*+**++**+*+*+*+*+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+)()()()()('('(('('('('&'&'&'&'&'&'&&%&%&%&%&%%&%$%$%$%$%$%$%$%$%$#$#$##$$#$$#$##$#$#$#$#$#"#"#"#"#"#"#"#"#"#"#"#"#"#"#""#""!"!"!"!"!"!"!"#""#"#"#"#"#"#"#""#"#"#""#""#"#$##$#$##$#$#$# $#$$##$$#$$#$$##$%$%$%$%$%$%%$%$%$%&%&%&%&%&%&%&'&'&'&'&'&'&'&'('('('('('('()()())()()(()()()*)*)*))*))*)*+*+*+*+**+*+*+*+,+,+,+,+,+,,+,,++,++,+,++,++,++,+,+,+,+,+,++,,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,+ ,++,++,++,,+)()()()()()()('('(('(''('('&'&''&''&'&'&&''&%&%&&%&%&%&%$%%$%$% $%%$%$$%$$%$#$#$#$#$#$#$$#$##$#$##$#"#"# "##"##"#"##"#"#"#"#""##"#"#"#""#""!"!"!"!"!"!"!""#"#"#"#"#"#"##"##"#"#"#$#$#$#$##$#$$#$#$#$#$#$$#$%$%$%$%%$%$%%$%$%& %&%&%&&%&&%&%%&%&%&'&'&&''&'&&'&'('('('('('()()())()()()()()*)*)*)*)*)*))*+*+**+*+*+*+*+*+*+*+*+*+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,+,+,++,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,()()()()()('('(''('('('('('('&'&'&'&'&'&''&'&'&'&%&%&%&%&%&%&%&%$%$%$%$%$%$$%$%$#$#$#$##$#$#$#$#$##"#"#"#"#"#"#"#"#"#"#"#"#"!""!"!"!"!"!"! "!"!""!!"!!"!"!""!"!"!"!"!"!"!"#"#"#"#"#"#""#"#"#""#"#" #"#"##"#""#""#$##$#$#$#$##$#$#$#$%$%$ %$%$%$%$$%$%%$%$%$%&%&%&%&%&%&%%&%&%&'&'&'&''&'&&'&'&'('('('( '(''(('('(('('('(('()(()(())()(()()())(()()*)*)*)*))*)*)*+**+*+*+*+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,,+,,+,+,+,+,++,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,++,++,,)())()()('('(('('('('('&'&'&'&&'&'&'&'&%&&%&%&%%&%&%&%$%$%%$%$%%$$%$%$%$%$%$$%$%$#$#$$#$#$#$#$#$#$##"#"#"#"#"##"##"#"#"#"#"#"!"!"!"!"!"!""!!"!"!"!"!"!"!"!""!"!"!"!"!"!"!"!""!""#"#"#"#"#"#"#"#"#"#"#"#$#$#$##$#$#$#$$#$###$#$#$ %$%$$%%$$%$%$%$%$%$%%$%&%&&%&%&%&% &%&%&%&%&%&'&&'&&'&'&'('('('( )()(()()()()()()(())()()*)*)*)*)*)*)*))*)**)*+*+**+**+*+*+*+*+*+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,,+,+,+,,+,+,++,+,+,+,+,++,+,+,+,+ ,+,++,++,++,+,+,+,+,+,+,+ ,++,++,+,+,,+,+,+,+,++,,+,+,,+,++() ()()()(()()()()('('('('('('('&'&'&&'&'&'&'&'&%&%%&&%%&%&%$%$%%$%$%$%$%%$$%%$%$%$#$$##$#$#$#$#$#$##$##$#$#$###"#"#"##"##"#"##"#"##"##"#"#"#"#""#"#"#"!"!"!"!"!"!"!"!"!!"!"!"!"!!"!"!" !"!"!"!"!!""!"!"!"!"!!""!!"!""!""!"!"!"!"!"!!"!!"!"!"#"#"#"#""##"#"#""##"#"#""#"#""##"#""#"#"#$#$#$$#$$#$#$%$%$%$%$%$$%$%$%&%&%&%&%&%&'&'&&''&'&'&'&'('('('(('('()())(()()())()()*)*)*)*))*)*) *)**)*)**)*+**+*+*+*+,+,++,+,,+,+,++,+,+,+,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+()()()()('('('('('('('('&'&' &''&'&'&'&'&'&'&%&%&&%&%&%%&%&%%&%$%$%$%$%$%$%$#$#$#$#$#$#$#$##$#$#$##"#"#"#"#"#"#"#"#" #"#"##"#""#"#"#"#"!"!"!"!""!"!""!"!"!"!!""!""!"!""!!"!"!"!"!"!!"!"!!"!""!"!!"!"!"!"!"!!"!"!"!"!"!!"!"!"!"!"!"!""!"#"#"#"#"#""#"#"#"#"#"#""# "##"#"#"##"#$#$#$#$#$#$#$#$#$%$%%$$%$%$%$%$%$%&%&%&%&%&%&%&'&''&&'&&'&''&'&'(' ('(('('(('('('(('()()()()()(()()())(()*))*))*)*)*)*)*+*+*+*+*+*+*+*+*+,++,+,+,+,+,+,+ ,+,,+,++,++,+,,++,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,()()()()()('(('('(''('&'&'&'&%&%&%&%&%&%$%$%$%$%$%$$%$$%$#$#$#$##$#$#$#$#$#$##$$##"##"#"#""#"#"#"#"#"#"#""#"#"#"#"!""!"!"!""!"!"" !"!""!"!"!""!!"!"!"!"!"!" !"!""!!""!"!"!!"!"!"!""!"!"!" !"!""!"!!"!""!"!"!""!"!"#"#"#"#" #"#""##""#""#"#"#"#$#$#$#$#$#$$#$#$#$%$%$%$$%$$%%$%$%%$$%$% &%&&%%&%%&&%&%&%&%&%&&%&'&'&'&&'&'&'&'('('('(('('('('()()(()()()()()()()*)*)*)*)*)*)*)**)*+**+*+* +**+**+**+*+*+,++,+,+,+,+,+,,++,,++,+,++,,+,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+()(()()()('('('('('('('&' &'&&''&''&&''&'&%&%&%&%%&%&%&%&%&%&%$%%$%$%$$%%$%%$$%$%%$%$%$#$$#$#$#$#$##"#"##""#""#""##"#"#"#"#"#"##"#"#"!"!"!"!"!"!!"!"!"!"!"!"!"!"!"!"!!"!"!"!"!""!"!"!"!!"!"!"!"!""!"!""!!""!"!""!"!!""!"!"!""!"!"!"#"#"#"#"#"#"#""#"##"#"#"#"#$#$#$##$#$#$$#$#$#$#$#$%$%$%%$$%%$$%$$%%$%$%$$%$%$%&%&%&%&%&%&%&%&'&'&'&'&'&'&'&'&'&'&'('(''('('(''((''('('()(()()()(()(()*)**))**))*)*)*)*)*)*+*++*+*+*+**+*+*+*++*++*+,+,+,+,++,+,+,+,+,++,+,+,+,+,,+,+,+,+,,++,,+,+,++,+,+,,++,+,+,+,+,+,++,,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+)())('('('( '('('((''('&'&''&'&'&%&%&%&%%&%&%&%$%$% $%$%%$%$$%$%$%$#$#$#$#$#$#$#"#"#"#"#"#"#""##""#"#""#""#"!"!"!"!!""!"!!""!"!"!!"!""!""!""!"!"!""!""!""!"!""!"!!"!"!""!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!!""!"!"!"!"#"#"#"#"##""#"#"#"#"#$#$##$#$#$#$#$%$%$%$$%$%$$%$%&%&%&%&%&&%&&%%&%&& '&&'&''&'&'&&'&'(''(''('('('('()()()(())()()())()()*)*))*))**)*))*))**)*+*+*+*++**+**+*+**+*+*+,+,+,+,+,++,+,++,++,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,+,++,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+)())(()()()('('('('('('('&'&&''&'&''&&''&'&'&%& %&&%&&%&&%%&%&%$%$%$%%$%$$%$#$#$#$#$#$$#$#$$#$#$#$#$#"##"#"#"#"#"#"##"#""#"#"#"!""!""!"!""!""!"!"!"!"!!""!!""!"!"!""!!"!""!"!"!"!!"!""!!"!"!"!!""!!""!"!""!"!!""!!"!"!"!!"!"!"!!"!"!"!"!"!!"!"!"!"!"!!"!"!"!!"!"!"!"#"#"#"#"#"#"#"#"#"#"#"##$#$##$#$#$#$#$%$%$%$%%$%%$%$%%$%$%&%&%%&%&'&&&'&&'&'&''&'&'&'('('('(''('('('()()(())())()(()()()*))*)*)*)*+*+*+*+*+*+*++*+*+,+,+ ,+,++,++,++,+,++,+,+,+ ,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,,+,+,+,++,+,+,++,+,+,++,+,+,+,+,,+,+,+,+,+)())()()('(''(('('('((''(''('('(('('&'&'&'&'&'&'&''&'&&'&%&%&%&%&%&%%&%$%%$%$%$%$$%$%$%$#$#$#$#$#$#$##$#$$##$#$#$#$#"##"#"#"#"#"#"#"#"!"!""!"!" !"!!""!"!""!!"!"!!""!!"!"!"!"!"!!"!"!" !"!!"!"!""!"!"!"!"!!""!"!!""!"!"!"!!"!"!"!"!"!"!""!""!"!"!"!"!"!"!"!"!"#"#"#"#"#"#"#"#"#"#$#$##$#$#$$#$$#$#$#$$#$%$$%$$%$%$%%$$%$%& %&%&&%&&%&&%&'&&'&'&'&'&'&'&'('('('(''('('()(()()()()()()()*)* )**)*))*)**))*+*+*++**+*+*+*++*+*+*+*++*+,+,+,+,++,+,++,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,++,+,+,+,++,+()()()('(('('('('(''((''('('&'&'&'&'&'&%&%&&%%&&%&%&%&%%&&%&%$%$%$%%$$%$%$%$ #$##$$#$#$$#$#$#$##$#$##$$#"#"#"##"#"#"#" #""##"##"#"#"#"#"!" !""!"!"!"!"!"!"!"!""!"!"!"!"!"!"!!"!"!"!"!"!"!"!"!"!"!"!"!!""!"!"!"!!"!"!""!!"!"!"!"!!"!"!"!""!"!""!"#"#"#"#"#"#"#"#$#$#$##$##$#$#$ #$##$$#$$##$$#$#$%$%%$%$%$%$%$%$%$% &%&&%&%&&%&%&%&%&%&'&'& '&''&'&&'&'&'&''&'('('(''(('('('((''()()()()()()()*))*)*)*)*)**)*)*+*+*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+('('('('('&'&'&'&'&'&%&%&&%&&%&%&%&%&%&%%&&%&%$%$%$$%%$$%$%$%%$%%$%$%$%$#$#$#$#$##$#$#"#"#"##"#""#"#"#"#"#"#"!"!"!"!"!"!!""!"!!"!"!""!""!"!""!""! "!""!"!"!"!"!!"!"!"!!"!"!"!"!""!"! "!"!!"!"!""!!"!"!"!"!"!!""!"!"!"!""! "!!"!!"!"!""!"!"!"!!"!"!"!"!"#"#" #""#""#"##"#"#"#$###$#$#$#$#$#$#$%$%$%$%$%%$%$%$%$%$%$%&%&%&%&%%&%&&%&&&'&'&'&'&'&'&'('('(''('('('('()(()(())()()()()()*)))*)*)**)*)**)*)*+* +*++**++*++*+*+*+,+,,+,,++,++,+,+,+++,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,,+,)()()('('('('('('(('('&'&'&'&'&'&'&'&'&%&%&&%&%&&%%&%%&%&%%$%$%$%$%$%$%$%$%$%$#$#$#$#$$#$#$ #$##$##$##$#"#"#"#""#"#"#"#"#"#""#"#"#"!"! "!"!!"!!"!""!"!"!""!!"!"!"!"!"!"!"!"!!"!"!"!"!"!"!"!"!"!"!"!""!"!"!"!"!"!"!!"!"!"!"!"!"!"!""!"!!"#"#"#"#"#"##"#"#"#"#"##$#$#$#$#$#$#$%$%$%$%$%$%$%&%&%&%&%&&'&'&&''&'('(''(' (''(''(''(''('('()()()()())()(())*)*))*)*)**)*)*)*+*+**+*+*+*+*++*+*+*+,+,+,+,++,+,++,+,+,++,+,++,+,+,+,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+())()('('(''('('(' &'&&'&'&''&'&'&&'&%&%%&%&%&%&%%$%$%$#$$# $#$$##$##$$#$#"#"#"#"#"##""#"##""#"#"#"#"!"!"!"!"!"!"!"!"!"!"!!"!"!"!"!!"!!"!!!"!"!"!"!"!"!"!!"!"!""! "!""!!""!!"!!"!"!"!"!!"!""!"!"!"#"#""#"##"#"#"#""#"#"#""#"#"#$#$#$#$#$# $#$#$#$#$#$%$%$%$%$%$%&%%&%&&%&%%&&%&%%&%&%&&'&'&'&'&''&'&'&'&'(' ('('(('('('('()()()()()(()()())*)*)*)*)*)*+*+*+*+*+*++*+*+,+,+,+,++,+,+,+,+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,,+,+,,+,+,+,+()()('(('('('('('&'&'&'&'&'&'&'&%&%&&%&%&%&%&%&%$%$%%$$%$%$%%$%$%$#$$#$#$#$#$##$##$#"#"#"#"#"#""#"#"#""#"!"!"!"!"!"!"!"!"!"!!"!"!"!"!!"!"!"!"!!"!"!"!!!"!"!"!"!"!!"!""!"!"!"#"#"#" #"#"#"##"##"#"#"#"#"#"#"##$##$$#$#$$#$##$##$#$$##$#$%$%$%$%$%$%%$%$%&%&%%&%%&&%&%&&%%&&'&'&'&'&'&'&'&'('('('('('('('()()()()()()()*)*)*)*)*)*+*+*+*++*+*+,+,+,+,+,+,++,+,+,++,+,+,++,+,++,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,,+,,++,++,+,+,++,,+,+,+,+,+,+,+,+,+,,+,+,+,+,,+,+,+,+,+,+()('('(''('('('('('('&'&'&'&'&%&%&%&%&%&%&%%$%$%$%$#$#$#$##$##$##$#$#$#"#"# "##"#"##"##""#"#"#"#"!"!"!"!"!"!"!!"!"!""!"!"!"!"!""!""!"!"!! !"!"!"!"!"!"!!!"!"!"!"!""!!"!"!"!"!"!"!"!"!""!"!"#"#""#"#"#"#"#"##$#$#$#$#$#$%$%%$%$%$%$%&%%&%&%&%&%&&%&%&%&%&%&'&'&''&'&'&'&'&&'&'(''(''('('('('('()()()()()())*))*)*)**))*))*)*)*)*+*+*+*+*+*+*++*+*+,++,+,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,++,,+,++,+,+,+,+,+,+,++,,++,+,++,++,+,+,+,+,+,+,+()('('('('('('('(' &''&''&'&'&'&'&'&'&%&%&%&%&%&%%$%$%$$%$#$#$$##$#$##$$##$#$#$#"#"#"#"##"#"#"#"#"!"!"!"!""!!"!"!"!""! "!"!""!!"!!""!"!!"!"!"!"!! ! ! ! ! ! ! ! !"!"!!"!"!"!"!"!"!"!"!"!"!!""!"!"!!"!"!"#"#"#""#"#"#"#"#"##$#$#$#$#$%$%$%$%$%$%$% &%&%%&%%&&%&&%&%&%&&%&&'&&'&'&'&'&&'&'&'&'('('('('('(('()()()()()()()())*)*)*))*)*)*)*)*)*+*+*+*+*+*+*+*++*+,+,+,+,+,,+,++,+,++,,+,++,++,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,('((''('(''('('&'&'&'&&'&'&%&&%&%&&%&%&&%%&%&%&%%$%$%$%$%$%$%$#$#$#$#$#$#$#$#"#"#"#"#""#"#"!"!"!"!"!!"!"!"!"!"!"!"!"!"!"!! ! ! ! ! ! !! ! ! ! ! ! ! !"!"!"!"!"!"!""!"!""!"!"!""!"!!""!!"!!"!!"#"#"#"##"##"#"#"#"#"#"##$# $##$$#$$#$#$#$#$#$$#$#$%$$%$$%%$%$%$%%$%$%$%$%&%&%%&&%&%%&%&&%&'&'&'&'&' ('('('(('('('('('(('()()()()()())*)*))**))*))*)**)*)**)*)*+**+*+*+*+*+*+*++*+*+,+,+,+,,+,++,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+ ,++,++,+,++,+,+,+,+,+,+,++,+,++,++,+,+,,+,+,,+('('('('('('('&'&'&'&'&'&%&%&%&%&%%&%&&%&%%$%$%%$$%$%$%$$%$$%$#$##$$#$#$$#$$#$#$#$#$#$#"#"#"#"#"#"##"#""#""##"!"!""!"!""!"!!"!"!"!!"!""!"!!"!"!"!"!"! !! ! ! !! ! ! ! ! ! ! ! ! ! ! ! !! ! ! ! ! !"!"!"!"!!"!!"!"!"!"!!"!"!"!"!"!"#"#"#"#"#"##"##"#"#"#"#"###""#$#$#$#$$##$#$#$%$%$%$%$%$%&%&%&%&%&&%%&%&%&'&'&'&'('('('(''('('()(()(()()())()())*)*)*)**)*)*)**)*+**+*+*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,++,+ ,+,++,++,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,+,++,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,++,+,('('(''('((''(('('(''('('&'&' &'&&''&'&&'&'&%&%&&%&%&%%&%&%&%&%% $%$$%$%%$%$$%$%$#$#$#$##$#$#"#"#"#"#""##""#"#""#"#"!"!"!"!!"!"!"!"!!"!""!"!"!!"!"!!"!"!"! ! !! ! ! ! ! !! !! ! ! !! ! ! !! ! ! ! ! ! ! ! ! ! ! ! ! !!"!!"!!"!"!"!!"!"!!"!!"!"!"!"!"!"#"#"#"#"#"#"#$#$#$##$#$#$##$$#$$#$##$#$%$%$%$%$$%$%$%$%&%&%&&%&'&'&'&'&''&&'&'&'('('('()()()()()())*))*)*)*)*)*))*+*+**+*+*+*+*+*++*+*+,+,+,+,++,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,+,+('(''('('('(('('('&'&'&%&&%&%&%&%&&%$%$%$$%$%$%$%$$%%$%$#$#$#$#$#$#"#"#"#"#"#"#"#"#""#""#"!"!"!"!!"!!"!"!!"!""!"!!"!!"!!"!!"!"!!"!"! ! !! ! ! ! ! ! !! ! ! ! !! ! ! ! !! ! !! !! ! ! ! ! ! ! !!"!"!"!"!"!"!"!"!"!"!""!!"!"!"#"#"#""#"#"#"##"#$#$#$$#$#$#$%$%$$%$$%$%$$%$%&%&%&&%%&%&%&'&'&''&'('('(''('('('()()()()()())())*))*)*)*)**))*))*)*+*+*+*+**+*++*+*+*+*+*+,+,+,++,+,+,+,,+,+,+ ,++,+,,++,+ ,++,++,,++,+,+,+,+,+,+,++,,+,+,++,+,++,+,+++,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,,+,++,('(('('('('('(''('('&'&'&''&'&'&&'&&'&%&&%%&%%&%&%&%&%&%&%$%$%$%$%$%$%$$%$$%$#$#$##$##$#$#$#$#$#"#"#"##"#"#"#"#"#"!"!"!"!"!!"!"!"!!"!"!!"!!"!"! ! ! ! ! ! ! ! ! ! ! ! ! !! ! ! ! ! ! ! !! ! ! ! !! !"!"!!"!!"!"!!"!"!"!"!"!"#""#"#"#"#"#"##"##"#$#$#$##$#$#$#$%$%$%$%$%$%%$%&%&%&%&%%&&%%&%&%&'&'&'&'&'&'&'('('((''('(''()()())()()(())*)**))*)*)*)*))*)*)*)*+*+*+*+*+*+*+,+,+,++,+,+,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,++,,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,+,+,+,++('('('(('(('('('&'&'&'&'&'&'&%&&%%&% &%%&%%&%%&%&%&%%$%$%$$%%$%%$%$#$$##$#$##$$##$$#$$#$#$#"##"#"#"#""#""#"#""#"#"#"!"!"!"!"!"!"!"!"!"!"! ! ! ! ! !! ! ! ! ! !! ! ! ! ! ! !! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !! ! !! ! !! ! !! ! !"!"!"!""!!"!""!!""!"!"!""!"!"#"#"##"# "##"#""#"#"## "#""#""##"#"#$#$#$#$#$#$#$ %$$%$$%%$%$%$%&%&%&&%&&%&'&''&&'&'&&''&'&'('(''('('('()()()()())()(())*)*)*)*)*))**))*+*+*+*+*+*+*+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+('('('('('('('&'&'&''&'&'&%& %&%&&%%&&%%&%&%&%$%%$%$%$%$%$%$%$#$#$#$#$#$#$#"#"#""##"##"#"#"#""!"!!"!"!"!"!"!"!"!"!"!"! ! !! ! ! ! !! ! !! ! ! ! ! ! ! ! ! !! ! ! ! ! !! ! ! ! ! ! ! ! ! ! ! ! !! ! !"!"!"!"!"!"!"!"!!"!"!"#"#"##"#"#"##"##"#"#$#$# $#$$#$$#$#$$#$#$#$#$#$%$%$ %$%%$%$$%%$%$%&%%&&%&%&%&%&%&%&%&'&'&'&'&'&'&'('('(''('('('('()()(()()(()(())*)*)*)*))*)*+*+*+*+*+*+,+,++,,+,++,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+('('((''(('('('('&'&'&'&'&'&'&&''&%&%&%&&%&%&%&%$%$%$%$%$%$%$$%$#$ #$$#$##$##$#$#$#"#"#"#"#"#"##"#""#"#""#"!""!"!"!"!""!"!!"!"!"!"!"! ! ! ! ! ! ! ! !! ! !! ! !! ! ! ! !! !! ! ! ! ! ! ! !! ! ! ! ! !! !! ! !! !! ! ! !! !! ! ! ! ! ! ! !! ! !"!"!"!"!"!"!"!"!"!"#"#"#""#"#""#"#$#$##$$#$#$##$#$#$%$%$ %$%%$$%$%%$$%%$%$%&%%&%&%&%&%&&%&&%%&'&'&'&'&'('(('('('('('(('('()())()()(()*)*))*)*)*)*)*)**)*)*+*+*+*+*+*+**+*+,++,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+ ,++,++,++,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+('('(''('('&'&'&'& %&%&&%&%&%%&% &%%&&%&%%&&%&%%$%$%%$$%$ %$%%$%%$%$%$%$%$$%$#$#$#$#$##$#$#"#""#"#"#"#""!"! "!""!!""!!"!"!"!"!"! ! ! !! !! ! !! ! !! ! ! ! ! ! !! ! ! ! ! ! ! ! !! ! ! ! ! ! ! !! ! ! ! ! ! !! !! ! ! ! ! ! ! ! !"! "!!"!!"!""!"!"!"!!"!"!!"#""#" #""#"##"#""#"##"#"#"#"#"#$#$#$#$##$$#$$##$#$$#$#$%$%$$%$%$%$%$%$%&%&%&&%&%&%&%&'&'&'&''&'&'&''&'('('('('('()()()()(()()(())*))*)*)*)*+*+**+*+*+,+,+,+,,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+('('(''('('('&'&''&'&'&'&'&%&%&%&%&%&%$%$%$%$%$%$#$#$#$#$#$#$##$#$#"#"##"#"#"#"#"#"#""!"!"!"!""!!""!!""!"!!""!"! ! ! ! ! ! !! ! ! ! ! ! ! ! !!! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !! ! ! ! ! ! !! ! ! ! ! ! ! ! !"!!"!"!"!"!!"!"!"!"!"!"#"##"#"#"#"#$#$#$#$#$#$#$#$%$%$%$%$%$%$$%$$%&%%&%&&%&%&&%&%&%&%%&'&'&'&'&'('('('('('()()()()(())())(()*)*))*))*)*)*))**)*)*+**+*++*+* +*++*++**+*+,+,+,+,++,+,+,+,+,++,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+ ,+,+,++,++,,+,+,+,+,+,+,+,+,+,++,+('('('(''('('('&'&'&'&'&'&'&'&%&%&%&&%&%&%$%$%$$%$%$#$#$$#$#$#$$##$#$##$$#"#"#"#"#"#"#""#""#"!""!""!"!"!"!""!"!""!"!""!"!"!"!"!"! ! ! ! ! !! !! !! ! !! ! ! ! ! !  ! ! ! ! ! ! ! ! ! ! !! ! ! ! ! !! ! ! ! ! ! ! ! ! ! !! ! ! ! ! ! ! !! ! ! ! ! !"!"!"!"!"!"!"!"!"!"#""#"#""##"#"#"#"##"#"#$#$#$#$#$#$#$#$#$%$%$%$%$%&%&&%&%&%&&%&%& '&'&&'&&'&&'&'&'&'('(''('(('(('('('('()()()(()()()())()())()*))*)*)*)* +**+*+**+*+*+*++*+*+*+*+*+,+,,+,+,++,+,+,+,+,++,+,+,+,+,+,++,,+,++,+,+,+,+,+,+ ,++,++,++,,+,+,+,+,+,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+,++,('('('('(''&'&' &'&''&'&&'&'&'&'&'&%&%&%&&%&%&%$%$%$%%$%%$%$%$%$#$#$$#$#$#$#$#"#"#"#"#"#"#""#"#"#"!"!"!"!""!"!"!"!"!"!"!""!"! ! !! ! ! ! !! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !! !! ! ! ! ! ! ! !! ! ! ! ! !"!"!"!"!"!!"!"!"!"!"!"!"#"#"#"#"#"#"#$#$#$##$#$#$#$#$%$% $%%$%%$%$$%$%&%&%&%&%&%&%&%&'&'&'&'&'&&' ('(''('(('(('('()()((()()()*)*)*)*)*)*)*+*+*+*+*+*++*+*++*+,+,+,++,,+,+,,+,,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+('('('('&'&'&'&'&'&'&%&%&%&&%&%&%&%&%&%&%$%$%$%%$%$%$#$#$#$#$#$#"#"#""#"#"#"#"#"#""#"!""!"!!""!"!!"!"!"!"!"!"!!"!"! ! ! ! ! ! !! ! ! ! ! ! ! !! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !"!"!"!"!"!"!"!"!"!"!"!"#"#"#""#"#""#"#"#$#$#$$#$$#$#$#$%$$%$$%$%$$%$%$%$%$%&%& %&&%&%&%&%%&%&%& '&'&'&&'&'&'&'&'('('('('((''('('()())()()()()())()*))*)*) *))*)**))**)*+* +**+*+**++*+*+,+,++,+,++,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,++,+,+,+,++,++,('(('('('('&'&'&'&'&'&''&'&%&&%&%&%%&%&%&%$%$%$%$%$$%$%$#$ #$$##$#$$#$#$#$#"#"#"#"#"!"!"! "!!"!!""!"!"!!""!"!"! ! ! !! ! ! ! ! ! ! ! ! ! ! ! ! ! !! ! ! ! ! ! ! ! ! ! ! ! ! !! ! ! ! ! ! ! ! ! ! ! ! ! ! !"!"!"!"!"!"!"!"!"!"!"!"#""#"#"#""##"#"#"#"##"#$#$#$#$#$$#$#$#$#$%$%$%$%$%$%&%%&%&%&%&%&'&'&'&'('(''(''('()()()()()()()()*)**)*)*)**)*)*)*)*+*+*+*+*+*+**+*+,+,+,+,++,+,+,+,+,++,+,++,+,+,+,+,+,+,,+,+,++,+,++,+,++,+,,++,+,++,+,+,+,+,,+,+,+,++,,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+ ('(('('(''('('('&'&'&'&'&&'&%&%&%&%&%%&%&%$%$% $%$%%$%%$%$%$%$%$#$ #$#$$#$##$$#$#$##$##$#$#"#"#"#"#"!""!"!"!"!"!"!!"!"! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !! !! ! !"!"! "!!"!!"!""!"!""!"!""#"#"#"#"#"##"#$#$#$#$#$#$#$#$#$#$%$$%$%$%%$$%$$%$%$%%&%%&%&%&%&%&%&'&'&'&'&'&'('('('('('(''('()()(()()()(())()*)* )*)**))*))*)*+*+*+*+*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+('((''(''('&''&&''&'&'&'&%&%&%&&%%&%%&%%&%$%$%$%$$%$$%$#$#$#$#$##$#$#"# "#"##""#"#"##"#"#"#"!"!"!"!""!"!"!"!"!""!""!"! !! !! ! ! ! ! ! !! ! ! ! ! ! !!      ! ! ! ! ! ! ! ! ! ! ! !! ! !"!"!"!"!"!"!" !"!"!!"!"!"#""#"#" #"##"##"##"#"#$#$#$$##$#$#$##$#$#$$##$%$%$%$%$%$%% &%%&%&%&%%&%&%&%&'&'&'&'&'&'&'&'('(''('('()()()()()*)*)*)*)*)*+*+*+*+**+**+*+**+*+,+,+,++,+,+,,+,+,+,+,+,+,++,+,+,+,+,+,++,,++,++,++,,++,,+,++,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,('('('('&'&&''&&'&%&%&%&%&&%$%$% $%$%%$$%$$$%$#$# $#$##$$##$$#$#$#"#"#"##"#"#"#""#"##""#"#"#"#"#"!"!"!"!""!"!"!"!"!"! ! ! ! ! !! ! ! ! !! ! ! ! !! !! ! ! ! !      ! ! ! ! ! ! !! !! ! !! ! ! ! "!""!!""!!"!"!"!!""!"!"!""#"#"#"#"#"#"#""##""#$#$#$$#$$#$#$$##$#$%$%$%$%$%$%%&%&%&%&%&%%&'&'&'&''&'&'('('('((''('('('()()()) ()(()())(()*)*)**))*))*)**)*)**)*)*)*+*+*+*+*+*+**+*+*+,+,++,+,+,+,++,,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,+,+,+,++,++,,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,,++('('(('&'&'&'&'&%&%&%&% &%%&%&%%&%%&%$%$%$%$$%%$%$%$#$#$$##$#$$#$#"#"#"#"#"#""#"#""##"!"!"!"!"! !"!!""!!"!"!"!"! ! ! !! ! ! ! !! ! ! ! ! ! ! ! ! ! ! !           ! ! ! ! !! ! !! ! ! ! ! !! ! ! ! !"!"!""!"!"!"!""#"#"#"# $##$$##$#$#$#$$#$#$#$#$%$%$%$%$$%$%%&%&%&%&%&'&'&'&&'&'&'&'&'('('('('()()()()()())()()*)*)*)*)**)*+*+*+*+**+*+*+,+,+,+,+,+,+,,+,,+,+,+,++,++,+,+,+,++,++,+,+,+,+,++,+,+,++,+,+,+,+,,+,++,+,++,,+,+,+,+,+,+,+,+,++,++,,++,++,+,++,+,+,+,+,+,+'(('('('&'&'&%&%&%&%&%&%$%$% $%%$$%$%$$$%$#$#$#$#$#$#"#"#"#"!"!"!"!"!"!!"!"!"!"! ! ! ! ! ! ! ! ! ! ! !! !! !               ! ! ! ! ! ! ! !! ! ! !"!"!!"!"!"!"!""!!"!"!"!""!""#"#"#"##"#"##""#"#"#"#$# $#$#$#$##$#$#$#$%$%$%$%$%$%$%$%%%&%&%&%&%& '&&''&'&'&''&'&'&''&'('('('('(('()()() )()())()()()()*)*)*)**))**)*)*+*+*+*++*++*+*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,++,+ ,++,+,++,,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,'('('(('('&'&'&'&''&%&&%&&%&%&%%&&%$%$%$%$%$$#$#$#$#$#$#"##"#"# "#""#""#""#"!"!"! "!"!!"!!"!"!"!!"!"!"! ! !! ! ! ! ! ! ! ! ! ! ! !                ! !! ! ! ! ! ! ! ! ! !! ! ! ! ! !"!"!"!!""!!"!"!"!""!"!"" #""#"##"##"#"#"#$#$#$##$#$$#$#$$#$%$%$%$$%$%$%&%&%%&%&%&%&'&&'& '&''&&'&'&'('('(''('('('()()(()(()()()()()*)*))*)*)*)*)*)*)*+*+*+*+*+*+,+,++,+,+,+,,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+'('('&'&'&'&'&'&'&%&%&%&%&%&&%&%&%&% $%$$%$$%$%$%$$#$#$#$#$##$#"##" #"##""##"##""#"#"!"!"!"! "!""!!"!""!!"!"!"!"! ! ! !! ! ! ! ! !! ! ! !                                  ! ! ! ! ! ! ! ! ! !"!"! "!""!""!"!!""!"!""#"#"#""#"#" #"#"#""##"#"#$#$#$#$#$#$#$%$%$%$%%&%&%&%&%&%&%&&%&%& '&&''&''&'&'&'&'('('('()(()()()()*)*)*)*)*)*))*)**))*+*+*+*+*+*++**+,+,++,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,++,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+('('('('&'&'&&'&'&'&%&%&%%&%&%&%$%$%$%%$%$%$%$$#$#$#$$#$#$#$#$#"#"#""#""##"!"!"!"!"!"!!"!"!! ! ! ! ! ! ! ! ! ! ! ! !                                     ! ! ! ! ! ! ! ! ! ! !! ! !"!"!"!!"!"!"!"!"#"#"#"#"##"#"#$#$#$$#$#$#$#$#$#$#$#$%$%$%$%$%%&%&%&%& '&'&&'&'&&'&'&'('('('('('('(()()()()*)*+* +**++**+*+*+*+*+*+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,++,+,+,++,++,+,+,+,++,+,+,+,+,+,,+,+,+,,+,+,+,+,+,+,++,,+,+,,+,++,+,+,+,+'('(''('('&''&'&'&'&'&'&%&%&&%&%&%&%&%$%$%$%$%$%$%$$$#$#$#"#""#""#""#""#""#"#"#"!"!" !""!"!""!""!"!"!! ! ! ! ! ! ! ! ! !! ! ! !                                         ! ! ! ! ! ! ! ! ! !"!"!"!!"!"!!""!"!!!"!"!" #""##"#"#""#"#"#"#$#$#$#$#$#$#$%$$%$%$%$%$%$%&%&%&%&&%&%&'&'&&'&''&&'&'&''&'(''(('('('(('(('()())(()(()()()()*)*)*)*)*)*)*)*+*+*+*+*++*+,+,+,+,+,+,,+,+,+,+,+,++,++,+,++,+,+,+,+,+,+,+,++,+,+,,+,+,++,,+,+,+,+,+,+,+,,+,+,+,++,++,+,+,+,+'('('&'&'&''&'&'&'&'&%&%&%&%&%&%$%$%%$%$%$%$$%$%$$#$$##$#$#$#"#"#"#"#"#"#"#"!"!"!"!"!"!"!! ! ! ! ! !! ! ! ! !                                                ! ! ! ! ! ! ! ! ! !"!"!"!!""!"!"!"!"!"#"#"#"#"#"##"#"#$#$#$#$#$%$%$$%$$%$%$%$%%&%&%&&%&%&'&'&'&'&&'&'&'(' ('(('((''('('()())((()()(()()()()()()*)*)*)*)**)*)*)*+*+*+**+*+*+**+**+*+,++,+,+,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,++,++,,+,++,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+('('('&'&'&''&'&&'&%&%&%&%$%$%$%$%$%$%$$#$#$#$#$#"#"#"#"#"!"!"!"!"!!"!"!! ! ! !! ! ! ! ! ! !                                          ! ! ! ! !! ! ! ! ! !"!"!"!!"!"!"!"!"!!"#"#""#"#"#"#$#$#$#$##$##$#$$#$#$%$$%$%$%%$%$%&%&%&&%&%&%&'&'&''&'&'(''('('('('('()(()(())(()(()())()())()()*))*)*)*)*)*)*)*+*+*+*+*+*+*+*+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+'('('&'&'&'&%& %&%%&&%&&%%&&%&%$%$%$%$%$#$#$#$#$##$##$#$##$#"#"#"#"#"#"#"#"!"!"!"!!"!"!""!"!"!! ! ! ! !! !! ! ! ! ! ! !                                                 ! ! ! ! ! ! !! ! ! !! ! !"!"!"!"!"!"!""!"!"#"#"#"#"#"#"#$# $#$#$#$#$$#$#$#$%$%$%$%$%$%$%$%$$%$%$%&%%&%&%&%%&&%&%&'&'&&''&'&'&'&'&'('('('((''('('()(()())()()())(()*)*)*)*)*)*)*)*+* +**+*+*+*+*+*+*+*+*+,+,++,+,++,++,+,+,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,'('&''&&'&'&'&%&&%&%&%&%$%$%$#$$#$$#$$#$#$#$#$#"#"#"#""#"#"#"#"#"#"!"!"!"!"!!""!!"!"! !!! ! !! ! ! ! ! !! !   -                                                    ! ! ! ! ! ! ! ! ! ! !"!"!"!!"!""!"!"!"!"#"#""#"#"# "##"##""#"#"#$#$#$#$#$##$#$$#$$#$#$ %$%%$%$%$$%$%&%%&%%&%&%&%&%&'&'&'&'('('('('('(''()()()()()()(()*)*))*)*)*)*+*+*+*+*+*+*+*+,+++,++,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,++,++,++,+,++,,++,+,+,+,+,++,+,++,++,+,+,+ ,++,+,++,,+,+'&''&'&'&'&'&%&%&&%%&%&%$%$%%$%%$%$#$$$#$#$$#$$#$#"#"#"#"#"!"!"!"!"!"!"!"!!"!! ! ! ! ! ! ! ! ! ! !                                                 ! ! ! ! ! ! ! ! ! ! ! ! !"!"!"!"!"!"!""!"!"!" #"#"#"##"##"#"#"#"#"#""#"#$#$#$#$#$#$#$#$%$$%$%$$%$%$%%$%$%$%&%&%&%%&&%%&%&%&'&'&'&'&''&'&'(''('('('('('('()(()())(()(()()*)*)*)*))*)*)* +*+**+**+*++*+*+*+*+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+ ,++,++,,++,+,+,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,'&'&&'&'&'&'&%&%&&%&%&%&&%&%%&%$%$%$%$%$#$$#$$#$$#$#$#$#"##""##"#"#"#"#"#"!"!"!""!"!"!"!"!"! ! !!! ! ! !! !! !! ! !! ! !                                          ! ! ! ! ! ! !! ! ! ! ! !"!!"!"!"!"!"!!"!""!"!"#"#"#"#"#"#"#""#$#$#$#$##$$#$##$##$$#$%$%$%$%$%$%&%&%&%&%%&%&'&'&'&'&'&'&&'&'&' ('(('('(''('('('(()()()()(()()()*)*)*)*)**)*)*)*+* +*+*++*+*+*+*+*++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,++,,+,+'&'&'&'&'&'&%&%%&%&%&%%&%&%$%$%%$$%$$%$%$%$$%$%$#$#$#$#$#$#$##$# "#""##""##"#"#""#"#"!"!"!!"!!"!"!!"!"! ! ! ! ! ! !! ! ! ! ! ! !                                            ! ! ! ! ! !! ! ! ! ! !"!"!!"!!""!"!""!!"#"#"#"##"#"#"#$#$#$#$$#$$#$$##$##$#$%$ %$%$$%$$%$$%$%$%%$%&%&%&%%&&%&%&%&&%%&'&'&'&'&'('('(''(('(()()()(())(()*))*)*)*)*)*))*+*+*+*+*+*+*+*++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+'('&'&'&'&'&%&%&%&%&%&%$%$%%$%%$%$%$%$%$%$%$#$#$#$#$#$#$##$$#"#"#"#"#"#"#"!"!"!"!""!"!"!"! ! ! !!  !! !! ! ! ! !                                        ! ! ! ! ! ! !! ! !! ! !"!"!"!!"!"!""!"!"!"#"#""#"#"#"#"#"#$##$$#$$#$#$$#$#$%$%%$%%$%$%$$%%$%$%&%&%&%%&%&%&'&'&&''&'('(''(''('('('(()()()(()()*)*)*)*)*+**+**+*+*+**++*+**+*+*+*++,++,+,+,+,+,+,++,,+,+,+,++,+,+,+,+,,+,+,+,+,+,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,+ ,++,++,++,,+,+'&'&''&'&&'&'&%&%&%&%&%&%$%$%%$%%$%$%$$%$#$##$#$#$#$$##$#$#"#""#""#"#"#"##"#"#""#"!"!"!"!""!"!!"!"! ! ! ! ! ! !! ! ! !                            ! ! ! !! ! ! ! ! ! !"!"!"!""!!"!""!"!"# "#"#"##"##"#""#"#"#$#$#$#$#$%$$%$$%%$%&%&%%&% &%%&%%&%%&%%&%&'&''& '&'&''&'&'&'(''('('(''(()(()()()()()()())()*)*)*)*)*))*)*+*+**+*+**+*+*++,+,+,+,,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+'&'&'&&'&'&'&%&%&%&%&%%&%$%$$%$%$%$%$#$##$$#$#$#"# "#"##"#"#"#"#"!"!!"!"!"!"! ! ! ! ! !! ! ! ! !                                 ! ! ! ! ! ! ! ! !"!!"!"!"!"!"!!"!""!!"!"!"#"#"##"#"#"##"#"#$#$#$#$%$%$ %$%%$%$%%$$%$%&% &%&%&&%&%&%&%&'&'&'&'&''&&''&'('(''(('(()()()()*)*))*)*)*)*+*+*+**++**+*+*++,+,+,+,+,+,+,+,+,+,+,,+,,+,+,+,+,+,+,++,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,++,++,,+'&'&'&'&'&%&%&%&%%&&%&%&%&%&%$%$%%$%$%$%$%$#$$#$#$#$#$##$#$#"#"# "#"#""#""#"#"#"!""!"!"!"!"!"!"! !! ! ! ! ! !! ! ! !                         ! ! ! ! ! !! ! !! "!"!!""!!"!"!"!"!"!""!"#"##"#"#"#"#$#$#$$#$#$%$%$%$%$%&%&%&%&%&%&%&'&'&'&'&'&'&' (''('((''(''('(''(('()()(()(()()()()()*)*)**)*)**)**)*+*+**+*+*+**+*+*+*+*+*+*++,++,,+,+,+,++,+,+,+,,+,+,+,,+,+,++,+,+,+,+,++,+,+,+,++ ,+,++,++,++,+,+,+,+,+,+,+ ,++,++,+,+,,+,+,+,+,++,,+,+,,+,++,+'&'&'&'&'&'&'&%&%&%&%$%$%$%$#$#$#$$#$#"# "##""##"##"!"!"!"!"!"!"!!"!!"! !! ! ! ! ! ! ! !! ! ! !                                ! ! ! ! ! ! ! !!"!"!"!"!"!!"!"!"#"#"#"#"#"#"#"#$#$#$#$#$#$#$#$%$%$%$%$%$$%$%&%%&%%&%&%&%&%&'&&'&&''&'&'&'&'('(''('(('('((''(()(()()()() *))*)*))*)*)*)**)*)*)*+*+*+*+*+*+*+*++,+,+,+,,++,+,++,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,,++'&'&'&'&'&'&'&'&%&%&%&%&%&%&%%&%$%$%$%$%$%$#$#$#$#"#"#"#"#"!"!"!"!""!"!"!"! ! ! ! !! ! ! ! ! ! !                                 ! ! ! !! ! ! ! !!"!"!""!!"!"!!""!"!"!"!"#"#"#"#"#"#"#$#$#$#$#$%$%$$%$$%$%$%$%%$%&%&%&%&%&%& '&&'&''&&'&'&'('('('('()()()()()()*)*)*)*)*)**)*+*+*+*+*+*+*++*+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,,++,+' &'&&'&&''&&'&%&&%&%&%&%$%%$%$%%$%$%%$$%$%$#$#$#$#$##$$#$#"# "#"#""##"#"#"!"!"!"!"!"!"!"!!"! ! ! ! ! ! ! ! ! ! ! !                         ! ! ! ! ! ! ! !!"!"!!"!!""!"!""!!"!"!"#"##""#""##"#"#"#"#"#"#$#$#$#$##$#$%$$$%%$$%$%$%$%$% &%&%&%&&%&%&%&%&&%&'&'&'&'&'&'('(''('('('()()()( )(()())(())()*)*)*))*)*)*+*+*++*+**+*+*+*+*++,++,+,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+ ,+,+,+,,+++,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+'&'&'&'&'&&''&%&%&%&%%&%&%&%$%$%$%$%$%$#$#$##$##$#"#"#"#"!"!"!"! ! ! !! ! ! !! ! !                          ! ! ! ! !! ! ! ! ! !!"!"!""!!""!!"!!""!"!"!"!!"!"#"#"#"#"#"#"#"#$#$#$#$#$#$$##$$%$%$%$%$%$%&%&%&%&%%&%&%&'&'&'&&'&'&'&'(''(' ('(''(''(('('(()())()()()(()()()()*)*)*)*)*)*)**)*))*+*+*+*+*+*+*+*+*+*+++,+,+,,+,+,+,+,,++,,+,+,++,+,+,,++,+,+,+,+,+,++,,+,+,+++,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+'&'&'&'&'&'&''&%&%&%&%&%&%%&%$%%$%$%$$%$%$%$$#$ #$$#$##$##$##"#""#"#""#""#"#"!"!"!"!"! !! ! ! ! ! ! !                         ! ! ! ! !!"!"!!"!"!"!"!"#"#"#"#"##"##""#"#$#$$##$#$#$$#$$%$%$%%$$%$%$%&%&%&%&'&'&'&'&'(''('(('()() ()())(()(()()*)*)*)**)*)*+*+*+*+*++**+*++ ,++,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,+,++,++,,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+'&'&'&'&% &%%&%%&%%&&%$%%$%$%$%$%%$#$#$#$##$#$##$#"#"#""#"#"!"!"!"!""!"!"!"! ! ! ! !! ! ! !! ! ! !                               ! ! ! ! ! ! ! !"!"!"!""!""!"!""!"!"#"#""#"#$#$#$##$#$#$#$#$$$%$%$%$%%$%%$%&%&%&%%&%&%&%&'&'&'&'&'&'(' ('(('(('(('('()()()()()*)*)*)*))*))*+* +**+*++*+*+*+*+*++*++ ,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,,+,+,+,++,+,+,++,+,+,++,+,+,+,+,,+,+,+,+,+,&''&'&'&''&&'&&'&'&''&'&%&%&%&&%%&%&%&%%&%%&&%&%$%$%%$%$%$%$%$%$%$#$#$$#$#$#$#$##"#"#"#"#""##""#""#""#"#"#"!"!"!""!""!!"!"!"!"!"! ! ! ! ! ! !                     ! ! ! ! ! ! ! !! !"!!"!!"!"!""!!"!"#"#"##"#$#$#$#$#$$%$%$%$%%$%$%$%&%&%&&%%&%& '&''&&'&'&'&'&''&'&'( '(''('((''('('('()())(()()()())()()*)*)*)*)*))*))*)*))*)*+*+ *+*+*++*+*+*+* +*++*++*+++,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,++,+,+,+,++,+,+'&&'&'&'&&''&&'&%&%&%&%&%&%&%$%%$$%$ %$$%$$%$$%$%$%$#$#$#$##$$#$#$#$$##"#"##" #"#""##""#"#"!"!"!"!"!!"!"!!""! ! ! ! ! ! !                        ! ! ! ! ! ! !! !! ! !"!"!"!!"!"!"!"!"!"!"!"!" #"##"#"##"#"#"#"#$#$# $#$$#$$#$#$$%$$%$%$$%%$%$%&%&%%&%&%&'&'&'&'('(('('('(('('()()()()()()*)*)*)**)*+*+*+*+*+*+*+,+,+,+,++,+,+,+,++,,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,'&'&'&'&%&%&%&%$% $%$%%$$%%$$%$%$%$#$#$#$$#$##"#"#"#"#"!"!"!"! ! ! ! ! ! ! !                      ! ! ! ! ! ! !! !"!"!"!"!"!"!"!"!"!"#"#"#"#""#$#$#$##$#$#$#$$%$%$%$%$%$$%&%&%&%%&%&%&%&&%&'&'&'&''&'&'(''('(('('('('''()( )())(())())()()*)*)*)*)*)*+**++*+*+*+*+*+*++,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+ ,+,,+,,++,+'&&'&'&'&'&''&'&%&%&%&%&%&%$%$%$%%$%$%$%$#$#$#$#$#$##"##"#"##"#"#"#""#"!"!" !"!!"!!"!!"! ! ! ! ! ! ! ! ! !! ! !                        ! ! ! ! ! ! !"!"!"!"!"!""!"#"#"#"#"#$#$#$#$$##$$#$$%$% $%$$%$$%$%$$%&%&&%&%&%&%&%&%&'&'&'&'&'&'('('('(''(('()(()()()()()()*)*)*)*)*)*+*+*+*+*+*++,++,+,+,+,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+'&'&&'&'&%&%&%&%&%$%$%$%$$%$ %$$%%$%$$%$#$ #$$##$#$#$$#$#$##"#"#"#"#"!""!!"!"!""!!"!"! ! ! ! ! !! ! !! ! ! !                     ! ! ! ! ! ! ! ! ! ! !"!"!"!"!"#"##"#""#"#""#"#"#$#$#$#$#$#$$#$#$%$%$%$%$%%$%&%&%&%&%&%&'&'&'&''&'&'('('('(('()()()()(()())(()*)**)*)*)*)**))*+*+*+*+**+*+*++**+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,,+,+,,+,+,+,+,+&'&'&'&'&%&%&&%&%&%&%&%&%&%$%$%$%$%$%$#$#$#$#$#"#"##"# "##""#"#""#"#"!"!""!""!!"!"! ! ! ! ! ! ! !                      ! ! ! !! ! ! ! ! !"!"!"!"!""!"!"#"#""#""##"#"##"#$#$##$#$#$#$$##$%$%$%$%$$%$%$%&%&%&%&%&'&'&'&'&'&'('('('(('()()()*) *))**))*)*)*)*)*)*+**+*+*+*+*+**++,++,+,++,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,,+,,+,++,+,+,++,,+,+,+,+,+,+,+,+,+,,+,+,+,+,,+,+,+,+,+,+,+'&'&'&'&%&%&%&%%&%&%&%$%$%$%%$%$%$#$$#$#$#"##"#"#"#"##"#"!""!"!"!"!!"!"!"!"! ! ! !! ! !! !! !                     ! ! ! ! ! ! ! !"!"!" !""!"!"!"!"#""#"#"#"#"#"#$#$#$#$$#$#$$$%$%$$%%$%$%&%&%%&%&&%&&%&%&'&'&'&'&&'&'&'('((''(('(('()()()()()()*)*)*)*+**+*+*++*+**+*++*+*++*+,+,+,+,++,+,+,+,+,+,+,+,++,++,++,,+,++,+,+,+,+,+,+,++,,++,+,++,++,+,+,+,+,+,+,++,++,++&'&'&'&'& %&%&&%&&%&%&%&%&%&%$%$%$%$#$#$#$$#$#$#$$##"#"#"#"#"#"!"!"!"!"!"!"!"! ! ! ! ! !                     ! ! ! ! !! ! ! !"!"!"!"!"!" #"#""#""##"##"#"##"#$#$#$#$#$$#$%$%$%$%$%&%&%%&%&%&%&'&'&'&'&'&&'('(''('('('('('()()()())()()()*)*)*))**)*)*))*))*+**++*+*+*+*+*+*++,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,++,&'&'&&'&'&%&%&%&%&%&% $%%$%%$%$%$%$%$%$%$#$#$#$#"#"#"#"#"#""#"!"!"!"!"!"! ! ! ! ! !                    ! ! ! ! ! ! !! ! !"!!""!"!""!!"!"!"!"#"#""##"#"#"#$##$#$$#$#$%$%$$%$%$%$%$%$%&%&%&%&%&%&'&'&'&'&'&'('('(('( '(('((''('()()()()()()()*)*)*)*)*)*)*))*+*+*+*++*+*+*++,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,+,+ ,++,++,+,++,+,+,+,+,+,+,++,+,++,++,+,+,,+,+,,+,+'&'&'&%&%&%&%&%$%$$%$%$%$%$#$#$#$#$#$#"##"##"#""##"#"#""#"!"!"!""!!""!!"!"! ! ! ! ! ! !! !                      ! ! !! !! ! !! ! !! !"!"!"!""!"!"#"#"#"#"##""#$###$#$%$%$%$%$%&%&%%&%%&'&'&''&&'&'&'&'('(''('('('('('('()(()()()()()()*) *))*)*)*)*)*+*+*+*+*+*+*++*+,++,+ ,+,++,++,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,++,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+&'&'&%& %&%&&%%&%%&%&%$%$%$$%$%$#$#$ #$##$#$$#$#$#"#"#"#"##"#"#"!"!!"!"!"!"!"!"!"! ! ! ! !! ! !                ! !! ! ! ! ! ! !"!"!!"!"!"!"#"#"#"#$#$#$#$#$#$%$%$%$%$%$%&%&%& %&&%%&%&%%&%&'&'&&'&&'&'&&'('('('()()()()()()*)*)*)**)*)*+*+* +*++**+**+*+*+*+*+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,+,+,+,+'&'&'&%&%&%$%$%$%%$$%%$%$$%$#$#$#$#"#"#"##"!"!"!"!"! ! ! ! ! ! ! !              ! ! ! ! !! !! ! !"!"!"!!"!"!"#"#"#"#"#$##$##$#$#$#$%$%$%$%$%$%$%$%&%&%%&%&%&'&'&'('(('''('()()()(()()()*)*))*))*)**)*)*)*)*+*+*+*+*+*+*+*++*+ ,++,++,,++,+,+,+,+,+,+,++,,+,+,++,+,++,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,,+,++,+ &''&&'&&'&'&%&%&%&%%&%&%&%$%$%%$%$#$#$ #$$#$#$$##$#"##"#"#"#"#"!""!"!"!"!"!"! ! ! ! ! ! ! !                      ! ! ! ! !! !"!"!"!"!""!"#"#"#"#"#"#"#"#$##$##$##$#$#$#$%$%$%$%$%&%&%&%&&%%&%&%&'&'& '&&''&''&'&''&'(''(''('('(('('()()()(()()()()*)*)*)*)**)*)*)*+*+**++*+**+*+*+*+*+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,++,++,,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,+,+,+,+,+&%&%&%&%&%%&%&%&%$%$%$$%$%$$%$%$#$#$#$#$#$##$$#$#$#"#"#" #"##""##"##""#"!"!"!"!!"!""! !! ! ! ! ! ! !                   ! ! ! ! ! ! ! ! !"!"!"!"!"#"#"#"##"#$#$#$#$##$$#$%$%$%$%$%$%$%&%&%&%&%&'&'&'&'('('('('('()()()()()(()*)*)*)*)*)*)*+*+*+*++*++*+*+,+,+,+,++,+,+,+,+,+,+,++,+,+,+,+++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+&'&%&%&%&&% $%$$%$$%$$%$%$#$#$#$$##$#$#"#"#"##"#"!"!"!""!"!"!"!"! ! ! !! ! ! !                     ! ! ! ! ! ! ! !"!!"!"!"!"#""##"#"#"##"#"#"#$#$###$#$#$#$#$%$%$%%$%$%$%$$%&%&%&%&%&'&'&'&''&'&'('('(''('('()()()()*))*))*)*))**))*)*)*)*+*+*+*++**+*+*+**+*+*+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,+,+,+,+++,+,+,+,+,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+'&'&'&%&%&%&%&&%$%%$%%$%$%$$%%$#$#$#$#$#"#"#"#"#"#"""#"##"!"!"!"!"!"!!"!!""!"! ! ! ! !! ! ! !                    ! ! ! ! ! !"! "!""!!"!""!"!"!"#""#"#"#"#"#"#$##$##$#$#$%$%$%%$$%$%&%&%&%%&%%&'&'&&'&'&'('''('('(''('('('('()()()()(()()*) *))*)*))*))*+*+*+*+**++*+*+*+,+,++,+,+,+,+,++,+,+,+ ,++,++,++,+,+,+,+,++,++,+,+++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+&%&%&%$%$%$%$%%$%$%$%$#$#$#$#"#"#""!"!"!"!"!"! ! ! ! ! !                     ! ! ! ! ! !"!!"!"!"!"!"#"#"#"#"#$# $##$##$$#$#$$#$#$#$$#$ %$$%%$%%$%$%$$%$%&%&%&%&&%&'&'&''('('('()()(()()()*)*)*)*+**+*+*+*+*+*+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+,+&%&%&%&&%&%&%$%$$%$%$#$#$$#$#"##""#"#"##""#"!"!"!!"!"!"!"!""! ! ! ! ! ! !                ! ! ! ! ! !"!"!"!"!!"!!""!"#"#"##"#"##"#"#"##"##$#$#$#$%$%$$%$%$%&%&%&%&%&%&%&'&'&'&'&'&''('('('('()(()())()())())()*)*)*)*))*)*)*))*)*)*)*+*+**+*+*+*++*+*+*+*+,+,,+,+,+,++,++,+,+,+,+,+,+,+,++,,+,++,+,+,+,++,+,+,+,+,+ ,+,+,++,++,,+,+,+,+,+,+,+,+,+,++,+,&%&%&%&%&%&%$%$%$%$%$%$%$#$#$#$#$#$#"#"#"" !""!!""!""!"! ! ! ! ! ! ! !                ! ! ! ! ! !"!"!!""!!"#"#"#"#"##"#"##$#$$#$#$#$%$%%$$%$%$%%$%&%%&&%&%&%&'&&'&'&''&&'('''('(''('()()(()()()())()()()*)*)*)**)*)*+*+*+*++*+,++,+,+,+,+,+,++,,+,++,+,+,+,+,++,+ ,++,++,++,,+,+,+,+,+,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+&'&&%&%&%&%&%&&%&%$%$%$%$%$%$#$#$$#$#$#$##$##$#"##""#""!"!"!"!"!"! ! ! !! ! ! !                  ! ! ! ! ! ! !"!"!" !""!""!"!!"!"#"#"#"#"#"#"##$#$#$#$#$#$#$$#$%$%$%$%$%%$%$%&%&%&&%&&%%&%&'&'&'&''&'&''('((''('('()()()()()())()*)*)*)*)*)*)**)*+*+*+*+*+,+,++,+,+,+,+,+,+,+,++,++,,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+&%&%&%&%&%&%$%$%$$%$%$#$#$#$#$#$# "##"#""##"#"#""#"!"!"!"!"!"!"!"! ! ! ! !! !! ! ! !                    ! ! ! !! ! ! !! ! !"!!"!!"!"!!"!"!"!"!"#"# "##"#"#"#"## $#$#$#$##$#$#$#$%$%$$%$%$%$%$%&%%&%&%&%&'& '&&''&&'&''&''(''(''('('()()(()()()*)*)*)*))*)*+*+*+*+*+*+*+*+*+*+,+,++,,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,++,+,+,+,++,++,+&%&%&%&%&% $%%$%%$%%$$%%$%$#$#$#$$#$# "#"##""#"#""#"#""#""#"!"!"!"!"!!""!"! ! ! !               ! ! !! ! ! ! !"!"!"!"!"#"#"#"#"#"##$#$##$#$#$%$$%$%$%$%$$%&%&%%&%&%&&%%&'&'&'&'&'&'('('('((''('()()()()()())()(() *)*)**))*)*)*)*)*)*+*+**+**+*+*+*+,+,++,+,++,+,+,+,+,+,+,,+,+,++,+,++,+,++,+,,+,++,++,+,+,+,+,,+,+,+,++,,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+&%&%&%&%&%$%%$%$$%$%$#$#$#"#""#"##"#""#""#"#""!"!"!"!"!"!!""! ! ! ! !       !          ! ! ! ! ! ! ! ! !"!!"! "!"!""!!"!!"!"!""!"#""#"#"#"#"##$#$#$#$#$%$%$%$%$%&%&%&%&%&%&%&%%&'&&'&'&'&''&&'&''('('(''('(''('()()())()()*)*)*)*)**)*+*+***++*+*+*+,++,++,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,++,+,+&%&&%%&&%&%&%&%$%$%$%$#$#$$#$$#$#"#"#"#""##"#""!"!"!"!"!"! !! ! !! ! ! ! !               ! ! ! ! ! !! ! !"!"!"!"!"!" #""#"#"#""#"#"##$#$#$#$#$%$%$%$%%$%$%&%&%%&%&%%&'&'&'&'&'&''(''('('('('('(('()()()()(()(()*)*)*)**)*)*)*)*)**)*+*+*+**+*+*++*+,+,+,++,+,+,+,+,+,++,,++,++,++,,++,,+,+,++,+++,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+&%&%%&&%%&%$%$%$%$%$#$#$#$#"#"#"#""#""#"!" !"!!""!!"!!"!!"!"!"! ! !! ! ! ! ! !             ! !! ! ! ! ! !"!"!"!"!"#"#"#"#"#""##$#$##$#$#$#$$#$ %$$%$%$%$$%$%$% &%&&%&%&%%&%&'&''&&'&'&'&'&&''(''('('('(('('('('()()()()()(()()*)*)*)**)*)*)*)*+*+*+*+*+*+,+,+,+,,++,+,++,+,+,+,+,+,+,+,,+,+,+,++,++,,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+ ,++,+,,++,+,++&%&%&%$%$%$%$$%$%$#$$##$##$#$#$##$#"#"#"##"#""!""!!"!"!"!!""!!"!!""!"! ! ! ! ! ! !             ! ! ! ! ! ! !"!"!!"!"#"#"#"## $##$#$$#$$##$#$#$%$%$%$%$%&%&%&%%&&%&'&'&''&'&'&''&''&&''('('('('()()()())()*)*)*)*)*)*+*+*+**+*+*+,+,+,++,++,+,+,+,++,++,+,+,+,+,++,+,+,+,+++,,+,+,+,,+,++,+,++,,+,+,+,+,+,+,+,+,++,++,,++,++,+,++,+,+,+,+,+,+,+,&%&%&%$%$%$%$%$#$$#$#$#$#$#$#$#"#"#"#"#"#"#""!"!"!"!"! ! ! !                  ! ! ! ! ! ! ! !"!"!"!"!"!"#"#"#"#"###$##$#$#$#$%$%$$%%$%$%&%&%%&%%&%&'&'&'&'&'('('('(('('('()()()())())()*))**)*)*+*+*+*+*+*+**++**+*+,+,+,++,,+,+,+,+,+,+,+,+,+,++ ,++,+,++,,+,+,+,+,+,+,+,+,++,+,++,+,+,+,++,+,+,+,+,+,+,+&%&%&%&%$%$%$%%$%$#$#$$##$##$#"#"#"#"#""#"!"""!""!"!!"! ! !! ! ! ! !!                  ! ! ! ! !! ! !"!"!!"!"!"!"#"#""#"#"#"# $##$##$##$##$#$#$#$%$%$%$%%$%$%&%%&&%&%&%%&'&'&'&'&'&'&'&'('('('()()()()()()*)*)*))*)*)*+*++*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+&%&%&%&%&%&%$%$%$%$%$$%$#$$#$#$#$#$#"#"##"#"#"#"##""!"!"!"!!"! ! ! ! !                      ! ! ! ! ! ! !"!""!"!"!"#"#"#"#"#"###"#$#$#$#$#$#$%$%$%$%$ %$$%%$$%%$%&%&%%&&%&'&'&'&''&'('('('(('()()()()()())()*)*)*)*+*+*++**+*+**++**+*+*+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+&%&%&%$%%$$%%$%$%$%$%$#$#$$#$#$#$#"##"#"#"#"#"!"!"!"!"!"!"!"!!"! !! ! ! !                 ! ! ! ! ! ! ! ! ! !"!"!"!"!"#"##"#"# $#$#$$#$##$#$#$%$%$%$%$% &%%&%&&%%&%%&%&&%%&'&'&&'&''&''('('(('()( )(())(()()()()()()*))*)*)*)*)*))*+*+*+*++*+*+*+,+,++,,+,+,++,+,+,++,++,+,+,+,++,+,+,++,+,+,,+,+,+,,+,+,+,+,+,+,++,,+,+,,+,++,+,+,+,+%&%&%&%&%$%$%$$%$%$#$#$#"#"#"!"!"!!"!"!""!!"!"!"! ! ! ! !! ! ! !              ! ! !! ! ! !"!"!"!"!"!"#"#"#"#"#"#$#$#$#$#$#$%$$%$%$%$%$%& %&%%&%&&%&%&&%&'&''&'&&'('('('(('()()()()*)*)*)*)*)*)*+*+*+*+*+*+*+,+,+,++,++,+,++,+,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,+,+,+,+,+,,+,+,+,++,++,+,+,+,+,+&%&%&%&%&%$%$%$%$$%$%$$%$$%$#$#$#$#"#"#"#"!"!""!"!"!"! ! ! ! ! ! !              ! ! ! ! !"!"!"!"#"#"##"#$# $#$#$##$##$%$%$%$%&%&%&%&'&&'&'&'&'&'&'('('('('('('()()(()(()()(()(()*))**)*)*)*)*)*+*+***+**+**+*+*+*+,++,+,,+,+,+,+ ,++,,++,+,+,++,+,+,+,+,+,+,++,+,++,+,+,+,++,++,,+,++,+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+&%&%&%&&%$%$$%$%$#$#$$#$$#$#"#""#"#"#"#"!"""!!""!"!"! ! ! ! !           ! ! ! ! !! ! ! !"!"!""!"!"!"!"#"##"##"#"#$#$#$$#$# $#$$#$#$$#$%$%$%$%%$%$%&%&%&%%&%&&%&'&'&&'&'&'&'&'&'('('('('(('('()()()()(()*)*)*)**)*)*+**+*++*+*+*+*+,+,+,+,+,+,+,,++,,+,+,+,+,+,+,+,+,+,+,+,+++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+%&&%%&&%$%$%$%%$$%$#$#$#$##$#$#$#"##"#"#"#""#"!""!!"!"!"! ! ! ! ! !                ! ! ! ! ! ! !"!"!"! "!!"!"!"!!"!"!"#""#"#"#""##"#$#$##$#$#$#$%$$%%$%$%$%$%&%%&% &%&%%&%%&&%&%&'&''&'&'&''&'&'&&'('('('()( )(()()()()()*)*)*)*)*)*)*)**+*+*++*+*+,+,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++&%&%&%&%$%$%$%$%$#$$#$#$##$#$#$#$##"#"#"##"#"#"!" !"!""!"!!""!"!"! ! ! ! !                ! ! ! ! !! !! ! !"!"!"!!"!"#""#""#""#"#"#$#$#$%$%$%$%&%%&%&'&'&''&''&'('('('(('()()()())()()*)*) *)**))*))*))*+**+*+*+*++*+*+*+,+,+,+,+,+,+,++,,+,+,+,++,+,++,+,++,,++,+,+,+,+,++,+,++,++,+,+,+ ,++,+,++,,+,+%&%$%$%$%%$$%%$#$$#$#$#$#$$#"#"#"#""#"#"!!"!"!!"! ! ! ! ! ! !                 ! ! ! ! ! ! !"!"!!"!"!""!"!"!"!"#"#"#"#"#"#"#$#$#$##$#$#$#$%$%$%$%$%&% &%&&%&&%&&%&%&'&'&&'''&'('(''('(('('('('()()(()(()())()()()()*)*)*)*)*)*))*+*++*+*+*+**+*++*++*++*+*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,,++,+,+,+,+,+,+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,++,+%&%$%$%$%$%$%$%%$%$#$$#$#$#$#$#"#"##"#"#"#"!""!!"!"!!""!!""!"! ! ! ! ! ! ! !                ! ! ! ! ! !"!"!"!"!"#""#"#"##"#"#$#$#$#$##$%$%$%$%$%%$%$%& %&%%&%&&%%&%&'&'&''&'&'&''&'&'('('('('('( )()())()()()()*)*)*)**))**))*)*+**+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,++,,+,+%&%$%$%$%$%$%$#$$##$#$# $##$##$#$#$#"##"#"#""##"#"#""#"!"!""!!"!""!"! ! ! !! ! !                 ! ! ! ! ! !"!"!"!"!""!"!"#""##"##"#"#"##""#$#$##$#$#$#$%$%$%&%&&%&%&%&&%&%&'&'&&'&'&'&'('('('('()()()()()()()*)*)*)** +*+*+*+*+*+*+**+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,++&%&%$%$%$ #$#$$##$$##$#$#$#"#"#"##"#"!"!"!"!"! ! ! ! !! ! !!                 ! ! ! ! ! ! !"!"!!""!"!"!!""!"#"#"#""#"#$#$#$#$#$%$% $%$$%$%%$%$% &%%&%&&%&%&%&%&'&'&'&''&&''&'('('('('()(()(()()()(()()()()*)*)*)*)**)*)*)**+*+*++*++**+*+*+,++,,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,++,++,+ ,++,++,++,,+,+,+,%&%$%$%$%$%$#$#$$#$#$#$#"#"#"#"!""!"!""!"!!"! ! ! !! !! ! !               ! ! ! ! !"!"!"!!"!"!"#"#"#" #""#""#""#""#$#$$#$#$#$#$$#$#$%$%$%$%&%&%&%&%%&%&'&'&'& &'&'&''&&'&'('('('(''('()( )(()()(()(()*)*))*)**+*++*+*++*+*+,+,+,++,+,+,++,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+&%&%$%$$%$%$%$$%$#$# $##$$#$##$$#"# "##""#"#"##"#"!"!"!!"! ! !! ! !! !              ! ! ! "!!"!""!"!""!!"!"#""" #"#"##"#"#"#"#$#$#$#$%$%$%$%%$%$%&%&%&&%&&%&'&'&&'&'&'('(''('('()()())())(()*)*))**)*)*+*+*+*+*+,+,+,+,+,,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,++,++,,+,+,%$%$%$%$%$%$#$#$#$#"#"#"#"#"!"!""!"!"!"! ! ! ! ! !                ! ! !"!"!""#"#"#"#"#"#"#$#$#$#$#$%$%$%$%$%$%&%&%&%&'&'&'&'('('('('(('('('()()(()()()(()()()()*)*))*)*)*)*)*+**+*+**+*+**+*+*+*+,+,+,,+,+,++,+,+,+,+,++,+,+,+,+,+,++,++,++,+,+,+,+,+,+,+ ,++,++,+,+,,+,+,+,+,++,,+,+,,+,++,+,&%&%$%$%$%$#$#$#$#$#"##"#"#"!"!! ! ! ! ! !               ! ! ! ! ! !"!"!"!"!"!!"!"!""#""#""#"#"#"#$#$$#$$#$#$#$#$%$%$%$$%$%$%&%&%&%&'&'&'&'&'('('(('('('('()()()())()()*))**))**)*)*))*)*)**+*+*+*+*++*+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,,++,+%&%&% $%$%$%$%%$%$%$#$#$#$#$#"#"#"##"#"#"#"!"!"!"!! ! !! ! ! !! !            ! ! ! ! ! !"!"!"!"!""!""#"#"#"#"# $##$#$$#$$#$#$%$$%$%$%$%&%&%%&%&%&%&%&%&'&&'&'&'&'&'&'(''('('(('('(('()()()()()()*)*))*)**++*+*+*+*++*+**+*+,+,+,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,,++,+,++,,%$%%$%$%$%$#$#$$#$#$#$#$#"#"#"!"!"!!"!"!! ! ! ! ! !                 ! ! !"!"!"!"!"!""#"#"#"##"#"#"#"# $#$##$#$$##$#$#$%$%$%$%$%$%&%&%%&%&&%&%&&%&&%%&'&&'&'&'&'&' (''('(''(('('()()())()(()()*)*)*)*)*)*)*)*+*+*+*+*+*+*+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,+,+%$%$%$%$%$#$#$#$#"#"#"#"#"#"!""!"!"!!"!!"!"!!"!! ! !! !! ! !               ! ! ! ! ! ! !"!"!"!"!"!""!"#"#"#"#""#$##$##$$#$#$%$%$%$%$%$%$% &%%&&%&%%&%%&%&&'&'&'&'&'&'&'('('(''(('('(''()()()()()()()()()*)*))*)*)**+ *++*+*+**+*+*+*+,+,+,++,+,+,,++,+,+,+,+,+,++,,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+%$%$%$%$%$#$#$##$#$#"#"# "#""#"##"#"#"!""!"!"!"!""!"!! ! ! ! !!                ! ! !! ! !! ! !"!""!!"!"!!"#"#"#"#"#$#$#$#$#$%$%$$%$$%%$%$%$$%&%&%%&&%&&'&'&&'&'&'('('('('('()()()()*)*)*)*)*)*)** +**+*+*+**++*+*+**+*+,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,+,++,++,,++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,%$%$$%$$%$%$#$#$#$#$#$$#$#"#"#"!"!""!"!"!! ! ! !                ! ! ! !! ! !" !"!""!""!""!"""#"#"#""#"#"#$#$#$#$#$%$%$%&%&&%&%&'&'&'&'&'&''&'('(''(''('((''()(()()()()()*)*)*))*)*)*)**+*++*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,++,+,+,++,+,+,++,+,+,+,+,,+,+,+,+,+,+%$%$%$%%$$%$%$%$$%$$%$#$$##$#$#"# "##"#"##""#"!"!"!"! !! !! !! ! ! ! !                 ! ! ! ! !"!"!"!"!"#"#"#"##""# $#$#$#$$##$#$#$#$%$ %$$%%$%%$%$%%$%&%&%%&%%&%&%&'&'&'&'&'&''&'(''(''('('()()()())()()()*)*))*)*)**+*+*+*++*+**+*+*++*+*++*+*+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++,++,+,+,+,++,+,+,+,,++%$%$%$%$%$%$#$#$$##$#$##$##$#"#"#"#""##"#"!"!"! "!!"!!"!!"! ! ! ! !! ! !                ! ! !! ! ! ! ! !! !"!!"!"!"!""!"#"#""#"# $#$$##$$##$#$%$%$%$%&%&%%&&%%&&'&&'&'&'&'('('('(''('()()()()()*)*)*)*)*)**+*+*+**++*+,+,++,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+%$%$%$%$#$#$#$#$#$#$##$$#"#"#"##""#"!"!!"!"!"!""!""! !! !! ! ! !               ! ! ! ! ! !"!"!"!"!!"#"#"#""#"#"#$#$#$#$#$$#$%$%$%%$%$%&%&%&%&%&%&&'&'&'&'('(('(('('()(())()()*)*)*)*)**)*)*)**+*+*+*+*+,+,++,,+,+,++,,+,+,+,+,+,+,+++,+,++,+,+,+,+,+,+,+,++,,+,+,+,+,+,+ ,+,,+,,++,+$%$%$%$%$%$#$#$#$$#$$#"#"#"#"#"!"!"!"!"!"!"!"! ! ! ! !             ! ! !! !"!"!!"!"!!"!"#"#"#"#"#"#$#$#$##$#$#$#$%$%$$%$%$%&%&%&%&%&%&%&&'&'&'&'('('('()()()(()()()*))*)*)**+*+*+*+*+*+,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,++,+,+,+,+%$%$%$%$%$#$#$$#$#$#$#$# "#""#""#"#"#"!"!"!"! ! ! !! ! ! !            ! ! ! !! ! ! !"!"!"!""!"#""#"#"#"#"#$#$#$#$#$%$%$%&%&%&%&&'&'&''&'&'&'&'(''('('()()()()*)*)*)*)*)**+**+*+*+*++*+*+*+,+,+ ,+,++,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,++,+,+,+,+,+,++,,+,+,,+,+,+,+,+%$%$%$%$%$%$#$#$#$#$#"#"##"#"!"!""!!"!"!""!"! ! ! ! ! !          ! ! ! ! ! !! !"!"!"!!"!"!"#"#"#"#"#$#$#$#$%$%$%$%$%&%&%&%&%&%&'&'&'&'&'('('('('('('()(()()()()()(()*)*)*)*)*)**+**+*+*+*+*+,+,+,+,+,+,+,+,+,+,+ ,+,,+,,++,++,+,+,++,,+,+,+,+,+,+,+,+,+,,+,+,+,+,,+,+,+,+,+,+,+%$%$%$%$%$#$#$#$#$#"#"#"#"#"!"!"! !! ! !!                ! ! ! ! ! !"!"!!""!"!"!"#"#"##"##"#"#$#$##$#$$#$$#$#$%$%$%%$$%&%&%&%%&%&&'&&'&'&&'&'&'&'('('('()(()()()()*)*)*)*)*)*)*)*+*+*+*+*+*+*+*+*+*+,+,+,+,+,+,++,+,++,,+,++,+,+,+,+,+,+,++,,++,+,++,++,+,+,+,+,+,+ ,++,++,++,+,++%$%%$%$%$%$%$%$#$#$#$#$$#"#"#"#"#""#"!""!"! ! ! !           ! ! ! ! ! ! !"!"!!"!"#"#""#"#"#$# $#$$#$$##$#$#$%$%$%$%%$%$%&%&%&%&&'&'&''&'&'('('(''(''('()()()()()()()*)*)*))*)*)*)*)**)*+* +*+*+**++*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,++,,+,%$%$%$%$#$#$#$$#$#$#$#$#"#"#"#"#"#" !""!"!!""!"!"! ! ! ! !          ! ! ! ! !"!"!"!"!"!"#"#"#"#"#$#$#$#$%$ %$$%%$$%$$%$%&%%&%%&%&&'&&'&'&'&'('('('('()()()())()()*)*)*)*)**+*+**+*+*+,+,++,+,+,+,+,+,+,++,+,+,+,+,+,++,+ ,++,++,+,++,+,+,+,+,+,+,++,+,++,++,+,+,,+,+,,+,+,+%$$%$%$#$#$#"#"!"!""!!"!"!"! !  ! !              ! ! !"!"!"!"!"!"#"#""#""#$#$$##$#$#$%$%$%$%$%&%&%&%&&%&'&'&'&'(''('('('('()()()()()()()()*)*)**)**)*)*+*+**+*+*+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,$%$$%$#$#$$#$##$#"#"#"#" !"!!"!""!"!!"!"! ! ! ! ! ! !             ! ! ! ! !"!!""!"!""!"!"#"#"#"#"#"##"#"# $#$$#$#$#$##$%$%$%$%$%$%&%&%&%%&%&%%&&'&&'&'&'&'&'&'('('('('()()( )())(()(()(()*)*)**+*+*+*+*+*++*+*+,+,++,+,+,++,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,++%$%$#$#$#$#$##$#"##"##"#"!"!"!"!!""!"! ! ! ! !               ! ! !! !""!"!"!"!"!"#"#""#"#"#$#$#$#$#$#$%$%$%$%%$%$%&%%&%&%&%&&&%&%&'&'&'&'&'&' ('(''(''('(('('('()()()()()(()*))*)*)**)*)*)***+*+*+*+*+*+*+*+*+*+,+,+,+,++,,+,+,++,+,++,+,+,+,+++,+,+,+,+,+,++,+,+,+,+,+,++,+,,+,++,+,+,+$%$%$%$#$#$#$#"#"#"#"!"!"!"!!"!!"! ! ! ! !! ! !  ! !               ! ! ! ! ! !"!!!"!"!"!"#"#"#"#$#$#$#$#$%$%$%$%$%$$%&%%&%&%&%&&%&%&'&'&&''&'&'&'&'&' ('('(''('('('()()())(())(()()*)*)*)*))*)*+*+*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,++,+,++,,++,+,+,+,+,,+,+,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,+,+,+,+,+,+%$%$$%$%$%$#$#$$##$#$##$#"#"#""#""#"!"!"!""!"! !! ! ! !! !                 ! ! ! !! !!"!"!"#"#"#"#$#$#$##$$#$%$$%$%$%$%%$%%$$%&%%&%&%%&&%&'&'&'('('('('()()()()*)*)*)**)*+*+*+*+,+,+,+,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,$%%$%$#$#$#$#"#"#"#"#"#"#"!"!"!"!"!"! ! ! ! !          ! ! ! ! !"!"!""!"!"!"!"#"#"#"#$##$#$#$#$%$%$%$%&%&&%%&&%&%&%&'&'&'&'&'('('(''('()()()())()()()*)*))*)*)*)*+*+*+*+*++**+*+,+,++,+,+,++,+,+,+,,+,+,+,+,++,+,+,+,++,+,+,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+,+,+%$#$$#$$#$#$##$$#"#"##""#""#"#"!"!"!"!"!!"! ! !! ! !               ! ! ! !!"!""!"#"#"#""#""#$#$##$%$$%$%$%$%$%%$%&%&%&&%&%&'&'&'&' (''(''('(''('('()()(()()*)*)*)*))*)*+*+**+*+*+,+ ,++,++,++,+,+,+,+,++,++,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+$#$$#$#$#$#$$#$#$#$#"#"#"#"#"!""!"!"!"!!"! ! ! !                 ! ! !! ! ! !! !!"!!""!"!!"!"#"#"#$#$##$$##$#$%$$%$%$%$%&%&%&%%&%&&%&'&''&'&'('('('()(())()()*)*))***)*)*)*+*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+,+,$%$#$##$#$#$#"##"#"#"#"#"!""!"!"!"! ! !! ! ! ! !             ! ! ! !!"!!"!"!"!"!"!""!"#"#"#"#"#"#$#$$#$#$##$%$%$$%$%%$%&%&%&'&'& '&'&&''&&'&'('('(''('('('('('()()(()()()()()*)*)*)*)*)*)*+**+*+*+*+*+*+,+,+,+,+,+,+,++,,+,+,+,+++,+,++,+,+,+,+,+ ,+,+,++,++,,+,+,+,+,+,+,+,+,+,++,+,+,+%$#$#$$#$#$#$#"#"#"#"#"!"!"! ! ! ! !! !                  ! ! ! ! !!"!""!!"!"!""!"#"#"#"#$#$##$##$#$#$$##$%$$%$%$%&%&&%%&%&'&''&&'&'('('('()()()()(()()*) *)*)**)*))*)*)*)*+**+*+*+*+*++**+*+,+,+,++,,+,++,+,+,+,+,+,+,+ +,++,++,,+,+,+,+,+,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,$%$#$#$#$#$#$#"#"#"#"!"!"!"! ! ! ! !               ! ! ! ! ! !!!"!"!""!"!"#"#"#"#"#"#$#$#$#$%$%$%$%$%$%&%&%%&%&%&%&'&'&'&&'(''(''('('('(('()()(()()*)*)*)*)**)*)**))*+**+* +*+*+**+**+,+,++,++,,+,+,+,+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+%$%$#$#$#$#"##"#"#"#"#"!"!"!"!"! !! ! ! !! !              ! ! ! !! !!"!"!"!"!"!"#"#"#"#$#$#$#$#$%$%$%$%$%$%&%%&%&%%&'&'&'&'&'('('(('(('( )(()(()())(()()()*)*)*))**)*)*+*+*+*+*+*+*+**+*+,+,+,+,+,+,+,+,+,+,+,+,+,+, ,+,++,+,++,+,+,+,+,+,+,+,++,+,,+,+,+,++,++,+,+,+$#$#$$#$$#$#"#"#""#"#"#"#"!"!"!"!"!"! ! ! ! !                ! ! ! ! !!"!"!!"!"!"#""#"#"#"#$##$#$#$##$#$#$%$%$%$%$%$%&%%&%&%%&&%&%&'&'&''&'&&'&'('('('('()(())()()(()()()*)*))*+* +**++**+*+*+*+*+*+,+,+ ,+,+,++,++,,+,+,+,+,+,+,+++,,+,+,++,+,+,+,+,+,++,+,+,+,+,+,++$#$#$#$#"##"#"#"!"!"!!""!"!"!!"! !! !! ! ! !        ! ! ! !  !! !"!"!""!"!" #"#""#""##"#"#$#$$#$#$#$#$#$##$%$$%$%$%$%$%$%&%&%&'&'&'&'&'&'&'&'&'('('('(''('('()()()()()(()*)*)**)*))*)*)**)*+*+*+*+*+*+*+,+,+,+,++,,+,++,+,+,,+,+,+,+,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,,+,+$#$#$##$#$#$#$#$##"#"#"##"#"!"!"!""!"!"! ! ! ! !!            ! ! ! ! !! ! "!"!"!"!"!"!"#""#"#$#$#$#$#$$#$%$%$%$%&&%&%&%&%&'&'&'('('('('()()()()()()*)*)*)*)*)*)*+*+**+*+*+*+**+**+*+,+,+,+,+,+,+,+,+,++,+,+,+++,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+$#$#$#$##$#$$#"#"#"#""#"!"!"!""! ! !               ! ! !! ! !"!"!!"!""!" #"##"#""##"#"#$#$##$#$%$%$$%$%&%%&%&%&%%&%&&%&'&&'&'&'&'&'('('((''()()()()())(()() *)**)**)*))*)*)*)*)*+*+*+*+*+,+,+,+,+,,+,+,+,+,+,+,++,++,+,+,++,+,+,+,++,++,+,+,+,+,+,++,+,++,+,+,+,+,+,+,,+$#$#$#$#"#"##"#"#"!"!"!"!!"!"! !! !! ! ! ! ! !               ! ! ! ! ! ! !"!""!"!"!!"#"#"##""#"#"#"#$#$#$$##$$#$#$$#$#$%$%$%$%$%$%%&%%&%&%&'&'&'&''&'&'&'('('()()( )()(()()(()()()*)*)*)*+*+*+*+*+,+,++,,++,,+,+,+,+,+,+,+,++,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,$#$ #$$##$##$#$#$#"##""##"#""##"#"!"!""!!"!"! ! ! !! ! !              ! ! ! !"!"!"!!"#"#""#"#"##"#"#$#$#$#$#$#$%$%$%$%$$%%&%&%&%&'&&'&'&'&'('('('('()(()()())()()*)*))*)*)*)*)*)*+*+*+*+*+*+*+*+,+,+,+,+,+,+,+,+,+,,+,+,+,++,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,+,+,++,,+ $#$#$$##$$#$$#$#$#"#"#"#""#"!"!"!"! ! ! ! !              ! ! ! ! !"!!"!"!!"!!"#""#"##"#"#$#$#$#$$##$$#$%$%$%$%%&%&&%%&&%&%&%%&%&'&'&'('('('()())()()()*)*))*))*)*)*+*+**+**++*+*+*+*+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,++,,+,+,+,+,,++,+,++,+,+$#$#$$#$$#$#$#"#"#"#"!"!"!"!"! ! ! ! ! !! ! !             ! ! ! ! !"!""!"!"!!"#"#"#$# $##$#$#$$##$#$%$$%$%$%$%$$%%&%&'&'&&'&'&'(''(''(''()()()()()()*))*)*))*)*)*)*)*+*+*+*+**+*+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+ ,++,+,,++,+,+,+,+,,+,,+,+,+,++,++,+,+,+,++,++,+,+,++$#$##$#$#$##"#"#"#"#"#"! ! !! ! ! !                ! ! ! ! !! !! !"!"!"#"#"##"#"#$#$#$%$%$$%$%$%%&%&%&%&&%%&'&'&'&'&&'('('('(''('('()()(()()*)*)*)*)*)*)*)*+*+**+*+*+**+**+*+,+,+,+,+,+,+,+,++,++,,++,++,+,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+$#$#$#$#$#"#"#"#"#"!"!"!""!"! ! ! ! ! !           ! ! ! ! !"!!"!"!!"!"#"#"#"#$#$#$%$%$%$%%$%%&%&%&%&%&%&'&&'&'&'&'&'&&'('('('('()(() ()(()())())()()()*)*))*)*)*)*+*+*+*+,+,+,+,+,+,++,+,++,+,+,+,++,+,+++,+,+,+,+,+,+,+,,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++$#$#$#$#"#"#"!"! !! !! !!           ! ! ! ! !"!" !"!!"!""!"!"#"#"##"#$#$#$#$#$%$%$$%$%$%$%%$%$%$%%&%%&&%%&%&&%&%&'&'&''&'&&'('('('('()()()()()*)*))**))**)*)*+*+* +**++*+**+*+,+,+,+,+,+,+,+,+,+,+,++,,++,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,$#$#$#$#$#"#"#""#" #""#""!""!!"!"! ! ! ! !                ! ! ! ! !"!"!"#""#"#"#"#"#$#$#$#$#$#$%$$%%$%$%$%%$%%&%&%%&%%&%&'&'&'&'&'('('(''('('()()()()(()())*)*)*)**)*)*+**+**+*+**+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,++,+,+,++,++,+,+#$$#$#$#$#"#"#"!"!"! ! ! ! ! !            ! ! ! !"!!"!"!"!"!""!"#"#""#"##"##""#$##$#$#$#$%$$%$%$%%&%&%&%&'&''&'&'('('('('()()()(()()()*))*)*)*))*)*)*+*+*+*+*+*+*+,+,+,+,+,+,+,++,,+,+,,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,++,++,+,++,+,+,$#$#$#"#"#"#"#"#"#"!""!"!"!!"!!"! ! ! ! ! !           ! ! ! ! !"!!"!"!"!!""!"#"#"#"#"#"#"#$#$#$#$#$#$#$%$%$%$%$%$%%$%&%&%&&%%&%&'&'&'&'&'('('('( )()()(()()(()*)))*)*)*+*+*+*+*+,+,+,+,+,+,+,+,,+,+,+,++,+,+,+,+,+,+,+,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,+,++,+$#$#$#"# "#"##"##"#"#"!""!"!"! ! ! ! !        ! ! !"!!""!"#"#""#$#$##$#$#$%$%$%%$%%%&%&%&%&%&'&'&'&&'&&'('(''(('()(())()()()*)*))*)*)*)**)*+*+*+*+*+*+,+,+,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+#$#"#"#"!"!""!""!"! ! ! ! !                ! ! ! ! ! !"!"!"!"#"#""#$#$#$#$#$%$%$%$$%$$%%&%&%&%&%&&%&'&'&'&'&'(''('('(('('('()()(()()()()())*))*))**)*)*)*)*+*+*+*+*+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,++,++,+,+,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,++#$#$#"#"#"##""#"!""!"! ! ! ! ! !                ! ! ! !! ! ! "!""!"!!"!""!!"#""#""#"#"##"#"#$#$#$#$$#$%$%$$%$%&%&%&%&'&'&''&&''&&'&'('('('()()()()()(()(())*)*)*)*+**+*+*+*+*+*++*+*+*+,+,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,+,+,++,+,+,+,++#$##$##$#"#"#""##"#"!"!"!"!"! !! ! ! ! !! ! !!                ! ! !"!"!"!"!"#"#"#"#$##$#$#$#$%$% $%$$%%$$%%$%&%%&%&%&'&'&'&'('('('()()()()())*)*)*)*)* +**+*+**+**+*+*++*+,+,++,+,++,++,+,++,+ ,++,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+#$#$#$#"#"##""#"#"!"!"!"!"!!""! ! ! ! !          ! ! ! ! !"!"!""!"!"!"#"#"#"#$#$#$%$%$%%$%%$%%&%&%&%&'&'&''&&'&'&'('(('(''('()()()()())())*)*)*)*)* +**+**++**+*+*+*+**+*+,+,,++,+,+,+,++,++,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+$#$#$#"#"#"!"!"!""!!"!"! ! ! !                 ! ! ! !"!"!"!"!"#"#"#""#"#"#"#"#$#$#$#$%$%$%$%&%&%%&%&%&%&'&'&'&'('('('('()( )())()())())*)*)*)*)*)*))*)*+**+* +*+*++**+**+*+*++*+,+,+,+,+,++,+,+,+,++,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,++ $##$$#$##$# "#"##""#"#"#"!"!"!"! ! ! !            ! ! ! !! ! !"!"!"!"#"#"#$#$#$$#$#$#$#$%$%$%%%$%$%&%&%&&%&'&&''&'&'('('('('()()()()(()())*)**)*)*)*)*)*)*+*+*+*+*+,+,+,+,+,++,+,+,++,++,+,+,+,+,+,++,,+,+,+,++,+,++#$#"##"#"#"!""!!"!"!"! ! ! ! ! !            ! ! ! ! ! !"!"!"#"#"#"#$#$#$#$#$%$%$%$%$%$%$%&%&%&%%&%&%&%&%&'&&'&'&'&'&'('('('('()()())*)*))*)*)**)**)*)*+*+*+*+**+**++*+ ,+,,+,,+,++,+,+,++,+,+,++,+,+ ,++,++,++,,+,+,+,+,+,,+,+,+,+,+,+,++,+,+,++,+,+#$#"##"#"#"#"!"!"! ! ! !! ! !               ! ! ! ! !"!"!"!"!"#"#""#"#$##$#$##$#$#$#$%$%$%%$%&%&%&%&%&'&'&'&&'&'('(' ('('(('(('('('()()()()())*)*)*)*)*)*+*+*+**+*+,++,+,+,+,+,+,+,+,+,+++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,,+$#$#"#"#"#""#"!""!"! ! !                 ! ! !"!"!!"!"!"!"#""#""#"#"#$#$#$$#$#$%$%%$%$$%$$%&%%&&%&%&'&'&'(''(''(''('('()()()(()()())()())()())*)*))*))*)**))*)*+*+*+*+*+*+,+,++,+,+,+,+,+,++,+,+,+,++,++,,+,+,+,+,++,+,+,+,,+,+,+,,+,+,++,+,+,+#$#"#"#" !""!"!!""!"!"! ! ! !             ! ! ! ! !"!"!!"!""!"!"#""#""#"#$#$#$#$%$%%%$%$$%&%&%&'&'&'&'&'&'('('('('()()())*))*)*)*)*)*)**)*+*+**+*+*+*+*++*+*+,+ ,++,++,+,+,,+,+,++,+,++,,+,+,,+,++,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,++,++,+,$#"#""#"!"!""!!"!"!"! !               ! ! ! ! ! !"!!"!!""!"!""!!"#"#"##""#"#$#$#$%$$%$%$%$%$%&%&%&%&%&%&'&&'&'&'('('('('()()()()()())*) *))*)**))*)*)*+*+*+*+*+*+,+,+,+,+,+,+,+,+,++,++,+,+,++,+,+,,++,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,$#"#"#"#"#" !"!!"!""!"!!"! ! ! ! ! !            ! ! !! ! !"!"!"!!"#"#""#"#""#"#$#$#$#$#$%$%$%$%$%&%&&%&%&&%%&%&'&'&'&'&'('('('(('( )())(())()())*)*)*)*)*)*+*+**++*+*+*+*+,+,+,+,+,+,+,+,,+,+,+,+,,++,+,++,,+,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,#"#"#"!"!"!"!!""! ! ! !              ! ! !"!""!!"!!"!"#"#"#"#"#"##"#$#$#$#$#$%$%$$%$ $%$%%$%$%$%$%&%&%&%&%&%&'&'&'&&'&'&'('('('()())())()()())*)*)*)*)*+*+*+*+*++*+,++,,+,+,+,+,+,+,+,+,+,+,+,+,,+,+,+,+,,++,,+,+,++,+,+,,++,+,+,+#"#"#"#"!"!"!!"!!"! ! ! ! !! !             ! ! !! ! !! !"!"!!"!!"!"#"#"##"#"#"#$#$##$$#$#$#$#$#$%$%$%$$%$%$%$%&%&%&%&%&&%&'&'&'('(''('('('('()()(()()()))*)*))**)*)*)*))*)*)**)*+*+**+*+*+*+*+*+,+,+,+,++,+,+,+,+,+,+,++,++,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,#"#"#""##"#"!"!"!""!"! ! !! ! !         ! ! !"!"!!""!!"#"#"#"#$#$#$%$%$%$%$%$%&%&%&'&'&'&'&'('(('('()()()())(())()()()*)*))*)*)*+*+**+*+*+*+*+,+,+,+,+,+,+,+,++,++,+,+,+,+,+ ,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,#"#"#"#"!"!"!"!"!"! ! ! ! !          ! ! !! ! !"!"!"!"#" #""##""##""#"#$#$#$#$%$$%$$%$%$%$%&%&%&%&%&%&&%&'&'&'&''&'&'('(('('('('('()( )(())()())()()(()*)*)*)*)**)*+**+*+**+*+,+,++,+,+,+,+,,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,#"#"#"#"#"!"!"!"!!"!!"! ! ! !             ! ! ! !! !"!"!"!"!"#"#"#$#$#$#$%$ %$$%$%$$%$$%&%&%&%&'&'&'('('(('('('()()()()(()() *))*))**)*)*)*+*+,++,++,+,+,++,++,+,++,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,+,+,+#"#"!"!"!"!!"! ! ! !            ! !"!"!"!"#""#"#"##""#$#$$#$$%$%$%$%&%&%&%%&%&&%&'&'&'(''('(('()()()()())*)*)*+*+*+*+*+*+*+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,,+,++#"#"#"##"##"!"!"!"! ! !! ! ! !       ! ! ! !"!"!"!"#"#"##"#$#$##$$##$#$$%$$%$%$%$$%$%$%&%&%&%&%%&'&'&'&'&'('(''('(''(('('(('('()()())()*)*)*)*)*))*+*+**+*+*+**+*+**+,+,+,+,+,++,,+,++,+,+,+,+ ,+,,+,,++,+,++,+,+,+,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+#"#"#"#""#"!"!"! ! ! ! !! !             ! !! ! !"!"!"!"#"#"#"##"#$#$$##$#$%$%$$%$%$%$%&%%&%&&%&'&'&'&'&'&'&'('('('('()()())()()()()*)*)*)*)*+*+*++*+*+*+,+,+,+,+,+++,++,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+"##"##"#"#"!"!"!"! ! ! ! !             ! !! ! ! ! ! !"!"!"!"#"#"#"#"#$#$#$##$$%$%$%$%&%&%&%&&%& '&&''&&''&'&'('('(''('(('('() ()()(())(())()*)**)*))*)*+*+*+*+*++*+*+*+,+,+,+,+,++,,+,+,+,+,+,+,+,+,++,+,++,+,+,++,+,,+,+,+,+,+,+,+#"#"#"#"#"!"!"!"!!""! ! !           ! !! ! ! !"!!"!!""!"# "#"#"##"#"#$#$#$#$#$$%%$%$%%$%$$%$%&%&%&%&'&'&'&'(''(''('('()()()()*)*)*)*+*+*+*+,+,+,+,,+,+,+,+,,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+#"#"#"!"!!"!!"! !! ! ! !                 ! ! !! ! ! !! !"!"!"!"!"#"#"#$#$#$#$#$$%$%$%$%$%$%$%$%&%&%&%&'& '&'&''&''&' ('('(''('(''()()()())()()*))*)**)*)*))*+*+*+*+*+*+*+,++,+,+,++,++,+,+,+,++,,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,#"#"!"!!"!!"! ! ! !! ! ! !        ! ! ! ! ! ! !"!"!"!!"!"!!"#"##"#"#$#$#$#$$%$%$%&%&%&%&%&%&'&'&'&'&'('('('('()(()()())*)*)**)*)*+*+*+*+*+*+*++*+,+,+,+,+,+,+,+,+,,+,+,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+"##"##"#"!"!!"!"! !!           ! !! ! !"!!"!"!"#""#"##"#"#$##$#$##$#$$#$$%$$%$%$%$%$%&%&%&%&'&''&'&'&'&'&'(' (''((''(('('()()()()*) *)**))*)**))**)*)*+**+**+*+*+*+,+,+,+,++,+,++,++,+,+,,+,+,,+,+,+,++,+ ,+,++,++,+,+,+,++,+,+,+,+,+,++,+,+,+"#"#"!"!"!"!"! ! ! !! !!              ! ! ! ! !"!!"!"!"!""!"#"#"#"#"#$#$#$#$#$$%$%$%%$%$%&%&%&%&%&'&'&'&'&'('(''(''('( )(()(()(()(()*)*)*)*)*+*+*+*+**+*+*+,+,+,+,+,++,+,++,++,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,++,+#"#""#"!"!"!""! ! !! ! ! !           ! ! ! !! !! !"!"!"!"#"#"#"#$#$#$#$#$$#$%$$%$%$%$%&%&%%&'&'&'&'('('('('('()()()()()*) *)*)**))*)*)*+*+**+*++**+*++*+*+*+,+,+,++,+,+,++,+,+,,+,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,+,+,+,+,+,+,++,,+"#"#"#"!"!"! ! !               ! ! ! ! !"!""!!""!"#"#"#"#"#$#$##$#$##$#$$$%$%$%&%%&&%&%&%&%&'&'&'&'('('('(('('()()(()()()()*)*)*)*)*)*+*+*+*++**++**++*+*+*+,+,+,++,++,+,,+,++,+,+,+,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+#"!"!"!"!"! !! ! !! !                 ! ! ! ! ! !! !"!"!"!"#"#"#"#""#"#$#$$#$$$%$%$$%$%&%%&%%&%%&'&'&'&'&&'&'(' ('(('('(''()()(()(()*))*)*)*)*)*+*+*+*+*+,+,+,+,+,++,+,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+"##"#"!"!"!""!"!"!"! ! !           ! ! !"!"!"!!"!"#"#$#$$##$%$%$%$$%&%&%&%&%%&'&&'&'&&'&'&'('('('('('('()()()()())()*)*)*)*)*+*+*+*+,+,+,++,+,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+"#"#"!""!"!"! ! !! ! ! !            ! ! ! !"!"!"#"#"#"#"##"#"#$#$#$#$$%$$%$%$%$%$%$$%&%&%&&%&'&'&'&'&'('('('('()()()()()()*)*)*)*)*)*+*+**+*+*+*+,+ ,++,++,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+ ,++,++,++,+#"#"!""!"!"! !           ! ! ! !"!"!"!"!"#""#"#"#$#$#$$#$#$%$%$%$%&%&%&%&'&'&'&&'&'&'&'('('('()()()(()(()()()*)*)*)*)*+*+*+*+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+"#"!"!"!"!"! ! !             ! ! ! ! !"!"!"!"!"!"#"#"##"#"##"#$#$##$#$%$%$%$%$%&%&%&'&&'&'('(''('('('(('('()()()()())()()*)*)*))*))*+*+*++*+*+*+*+**+,+,+,+,+,+ ,+,+,,+,++,+,++,+,+,+,+,+,+,+,++,+,,+,+,+,++,++,+,+,+,++#"#"!"!!"!"!"!"! ! ! ! !           ! ! ! ! ! !"!"!"!"!"!" #""#"#""##"#$#$#$$#$#$%$%%$%$%&%&%&%&'&'&'('('()()()()()*)*)*)*)*)*)*+**+*+*+*+*+**+,+,+,+,+,+,++,+,++,+,+,+,+,+,++,+,+,+,+,+,++,,+#"#"!""!"!"! ! ! !! ! ! !             ! ! ! !! ! ! !"!"!"!"!"!"#"#""#$#$#$$#$#$%$%$%$%$%&%&%&%%&%&'&'&'&'&''&'('('(('('('((''((''()(()(()(()(()()*)*)*))**))*+*+*+*+*+*+*+,++,+,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,,+,+,+#"!"!""!"!"! ! ! ! !! !                 ! ! !! !! !"!"!"!"#"#"#"#"#"#$#$#$#$#$%$%$%$$%$$%&%&%&'&'&&'&&'('('('(()(()()())())()*)*)*))*))*)*)*+*+*+*+*+*++**+*+,++,+,+,+,++,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+#"!"!"!!"! ! ! !            ! !"!"!!"!"#""#""#"#"#$#$#$#$$#$%$%$%$%$%$$%&%%&%%&%&%&%%&'&'&'&''&'&'(''('('()(()()()*))**))*+*+*+*+*++*+*+,+,+,++,++,+,+,++,+,+,+,++,++,+,+,+,+,+,++,+,++,+,+,+,+,+,+,,+,+,"#"!"!""!"!"!"! ! ! ! !                 ! !! !! ! !! ! !"!"!"!"!"#""#"#"#$##$#$%$%$%%$$%%$$%$%&%%&%&%&'&'&'&'&'(''('('()(()(()()(()()()()*)*)*)**)*+*+*++*+**+*+*+,+,+,+,+,+,+,,+,+,+,++,++,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+"!"!"!!""!"! ! !! ! !!                ! ! ! ! !! !"!"!"!"!"#"#$#$#$#$%$%$%$%&%&%&'&'&&'&'('('('('()( ()(())(()()(()()*)*)*)**)*)*)*+*+* +**++*++*+*+*+*+*+,+,+,+,++,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,+,+ ,++,,++,++,++"!"!""!"! ! ! !! !!         ! ! !! !! !"!"!"!"#"##"##"#"##$#$#$#$%$%$%%$$%$%$%&%&&%&%%&%&%&'&'&'&'&'('( '(('('((''()()(()()())()())()*))*)*)*)*)*+*+*+*+*+*++*+*+,++,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,,++,+,++,+,+"!"!"! ! ! ! !!             ! ! ! ! !"!!"!"!"!"#"#"#$# #$$##$$#$#$$#$%$$%$%&%&%&%%&'&'&'('(''('()()(()()()()()*)*)* )**)**)*))*)*+*+*+*+*+*+*+*+,+,+,+,+,++,+,+ ,++,+,,++,+,+,+,+,,+,,+,+,+,++,++,+,+,+,++,++,+,+,+" !""!!"!"!""!"!            ! ! !"!"!!"!"!"#""#"#$#$#$#$%$$%%$%$%&%&%&%&&%&%&'&'&&'&''&'(''('('('()()())()()()*)*)*))*))*)*+*+*+*+*+*+*+,+,++,++,+,++,+,+,+++,+,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+"!"!"!"! ! ! !! !           !"!""!"!""!"#"#"#"#"#$##$#$#$#$#$%$$%$%$%$%&%&%&%&%&'&'&'&&'&'&'&'('('()()()()()*)*)*+*+*+*+*+*+,+,+,++,+,+,++,+,+,+,+,+,+,,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+"!"!"! !           ! ! ! !"!!"!"!"!""!"!"#"#"#"#$#$#$#$#$#$#$%$%$%$$%$%&% &%&%&%&%&&%&&%&'&'&'&&'&'('('('('(()()*)*)*)*)*)*)*+*+*+*+*+*+,+,+,+,++,,+,++,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+"!""!"!"!"! !         ! !! ! ! !"!!""!"!"!""!"#"#"#""#""#$#$#$#$%$%$$%$% &%%&%%&%&&%%&%&%&'&'&'&'&'('('('(''(()())(()()()()*))*)*))*)*)*)*)*+*+ *++*+*+*+**+*+*+,+,+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+,+,,+,+,++,,+,+,++,+,+,++,++,+,+,"!"!"! ! !            ! ! ! ! !"!!"!"#"#"##$#$#$#$%$%%$%$%&%&%&%&'&'('('()(()()()()()*)*)*)*)*+*+*+*+*+,++,,+,+,,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,++,++,+,++,+,+,+"!"!"!!"!!"! !! ! ! ! !                 ! ! ! !! ! ! !"!"!"!"!"#""#"#"#"#"##$#$#$#$#$#$%$$%$%$%&%&%&%&%%&%&%&'&'&'('('()()(()()()*)*))*)*)*+* +**+**++*+**+*+*+,+,+,+,++,++,++,+,+,+,+,+,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,+,++,+,+,+ !""!""!"!"!"! !! ! !         ! ! ! ! ! !"!"!""!"#"#"#"##$#$#$#$$##$#$%$%$%$%$%&%&%&%&%&'&'&'&'&'('('(()()())(()()*)*)*)*)*)*+*+*+*+**+*++*+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+! "!""!"!!"!"! !! !            ! ! ! ! !"!"!"!!"!!"#""#"#"##$#$#$#$%$%$%$$%$%&%&%%&%%&%&%& '&&''&&''&'&'&'('('('('(()()()())()*)*)*)*)*+*+*+*+*+,+,+,+,+,+,++,+,+,++,+,+,++,++,+,+,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,+,"!"!""!!"! !              ! ! ! !! !"!"!!"!"#"#""#"#"##$#$#$#$#$$#$%$$%$%$%&%&%&%&&%&'&&'&&'&''&' (''(''('('('('(()()()())()*)**)*)*)*+*+*+*+*+*+,+,+,++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,,+!"!"!"! ! !! ! !            ! ! ! ! ! !"!"!"!"#"#"##$#$%$%$%$%$%&%%&%&%&&%&'&'&'&'&'('('('('('(()())()(()()*)*))**))*)*)*+*+*+**++*+*+*+**+,+,+ ,++,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+"!"!"! ! ! ! !!          ! ! !"!"!"#"#""#"##$#$#$#$#$$#$%$%$%$%%$%$%&%&%&%&'&'&'&'('('(()()()()()()*)*)*)*))*)*)*+*++**+*+*+**+,+,+,,+,+,+,+,,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+"! ! ! ! !            ! !"!"!"!"#""#"#""#"#"##$#$%$%$%&%&%&%& '&&'&''&'&'&&'&''&''('(''(('(''(('('(()()(()()()()*)**)*)**)*+* +*+*+*++**+*+*+*+,+,+,++,+,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+!"!"! ! ! !           ! ! !! ! ! ! !"!"!"!"#"#"##$#$##$#$$#$%$%$%&%&%&%&'&'&'&'&'&'('('(()()())()*)*)*)*)*)*)*+*+*+*+*+*++*+,+,+,+,+,++,++,+,+,+,+,+,++,,+,+,+,++,+,+,+"!!"!"! ! ! !            ! ! ! ! !"!"!"!"!"!"#"#"#""#"#"###"#$#$#$##$#$%$%$%$%$%$%&%&%%&%& '&&''&&''&'&'('('('(()()()()()*)*)*+*+*+*+*++*+**+,++,+,+,++,++,++ ,++,++,++,,+,+,+,+,+,,+,+,+,+,+,+,++,+,+,++,+,+,+"!"! !          ! ! ! ! ! ! !"!"!"#"#"##$##$#$$#$%$%$%$%&%&%&%&&'&&'&&'&'('('('('(()()()(()()()*)*)*))*)*+**+*+*+*+*++**+*+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,,+,+"!!"! !! !            ! ! ! ! !"!!"!"!"#"#"#"#"#$#$#$$#$ %$$%%$$%%$%&%&%&%&%%&%&'&'&'&'&'(''('('('()()(()*)*)*)*+*+*+**++*+**+*+*+,+,+,+++,+,+,++,++,,+,+,+,+,++,+,+,+,,+,+,+,,+,+,++,+,+,+,+,!"! ! ! !           ! ! !"!"!"!"!!"#"#"#"""#$#$#$%$%$%$%&%&% &%%&%&&%&&%&'&'&'&'('(('(''('(('()()()(()(()*)*)*)**)*)*+*+*++**++*+,+,+,+++,++,,+,+,,+,++,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,++,++,+,+,+!"! ! !! ! ! ! !       ! ! !"!!"!"!"!"#"#"#"#"#$#$#$#$#$%$%$% &%&%&%%&%&%%&'&'&'&'&'('(''('(()()()()()()*)*))*)*)*)*+*+*+*+*+,+,++,++,+,+,++,+,+,,++,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+"!"! ! !! ! ! !        ! ! ! !"!"!""!"#"#"##$#$#$#$#$%$%$%&%%&%&'&&'&'&'&&'('('('(()()()())()*)*)*+*+*+*+**++**+,+,++,+,+,+,,++,+,++,,+,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+! ! ! !! !             ! ! ! ! ! "!"!!"!!"!""!"#"#"#"#"#"#$#$#$#$%$%%$%$%$%$%&%&%%&%&%&'&'&'(''('('('((''()()())()*)*)*)*)*)**)*+*+**+*+**+*+*+,+,++,+,+,+,+,+,+,,+,+,+,+,,++,,+,+,++,+,+,,++,+,+,+,+!"! !! !               ! ! ! ! ! !"!"!""!"!"!"#"#"#"#$#$#$#$%$%$%$%$%&%&%&%&'&&'&'&''&&'('('(''(('()()(()()*)*)*)*)*+*+*+*+*+*+,+,+,+,+,+,+,++,++,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++"! ! ! !          ! ! !"!"!"!"!"!"#""#$#$#$%$%&%&%&%&'&'&'&''&'('('(()()()()*)*)*)*)*+*+*+*+*+*+,+,++,+++,+,+,+,+ ,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+! ! ! ! ! !           ! ! ! !"!"!!"!"!"#"#"##"#$#$#$%$%$%&%&%&%&%&&%&'&'&''&'&'&'(' ('(''((''('(('()()(()()())()*))*)*)*+*+*++*++*+*+*+,+,++,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+! ! ! !! ! !          ! ! !"! "!!"!"!!"!"#"#"#"#"#$##$##$##$%$%$%$%$%&%&%&'&'&&'&'('('('(('()()()*)*+*+*+*+**++*+,+,++,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,+,+,+,+,+! ! ! !!        ! !! !"!"!"#"#""#$#$#$#$##$ %$$%$$%%$$%$%&%&%&%%&'&'&''&'('(''('((('()()()()(()()*)*)*)*)*)*)*+*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,,+,+,+! ! !! ! !         ! ! !! ! !"!!"!"!"!!"!"#""#"#""#"#"#""#$#$#$#$$#$%$%$%$%$%&%&%&%&'&'&&'&'(''('((''()()()(())())()()*)*)*)*)*))*+*+*+*+*+*+*+,+,+,+,+,+ ,+,,+,,++,+,++,+,+,+,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+! ! !          ! ! !! ! "!"!!"!"!""!"!"#""#""#$#$#$#$%$%$%$$%$%$%$%&%&%&'&&'&'&''&'('(''(''(('('('()()()()*)**)*)*+* +*+*+**+**+,++,++,+,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+! ! !            ! ! !"!"!"!"#"#"#$#$#$#$%$%$%&%&% &%&&%&%&&%&'&'&'&'('('('('()(()()()*))**)*)*)**)*)*)*+*+*+*+*+*+*+,+,+,,+,++,+,+,+,+,++,+,++,+,+,++,+,,+,+,+,+,+,+,+ ! !! ! !! ! !           ! ! ! !"!"!""!"##""#"#"#"#$#$#$%$%$%&%&%&%%&'&'&'&'&'('(''(('('()())())()()*))**)*)*+*+*+*+*++*+*+*+*+,+,+,+,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,++! ! !! !            ! ! ! ! !"!"!"!"!"!"!"#"""#"#"#"#$#$#$##$#$%$%$%$%&%&%&%&'&'('('('(('('()()())(()*)*)*)*)*)*+**++**+*++*+*++*+*+,++,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,+,! ! !! !             ! ! ! !"!" "#""#""#""#"#$#$#$%$%$%%$%&%&%&&%%&&%&'&'&'&'(''(('(('(('()()())()()*)*)*)*)**)*+**++*+**+*+*+,+,+,+,,+,+,+,+,++,,+,+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+! ! ! !         ! ! ! ! !! !"!!"!""#"#"#$##$##$#$#$##$%$%$%&%&&%&&%&&%%&%%&'&'&'(''('('('()()()*))*)*)*)*+*+**++**+*+,+,,++,+,,+,+,+,++,+ ,+,++,++,+,+,+,++,+,+,+,+,+,++,+,+,+,++,! ! ! !             ! ! ! !"!"!"!""#""##"#""#"#$##$#$#$%$%$%$%$%&%%&%&%&&%%&%& '&&'&'&'&&''&'&'(''(('(('('('()()()*)*)*))*)*)*+*+*+*+,++,++,++,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+! ! !! !       ! ! ! ! !"!!"!"!"!""#"#"#$#$#$%$%$%&%&%%&&%&%&&%%&&%&'&'&'&'&''&'(''('(''('(('('()()()()*)**))*)**)*)*+*+*+,+,+,,+,+,+,+,+,+ ,++,+,,++,+ ,++,++,,++,+,+,+,+,+,+,++,,+,++! ! ! ! !           ! ! ! ! ! !"!"!""#""#"#"#$#$$#$##$#$#$%$%$%$%$%&% &%%&&%&%&&%&'&'('(''('('('()()()()*)*)**))**))**)*)*+**+*+*+*+*+*+,+,++,+,,+,++,+,+,+,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+ ! ! !            ! !! !"!"!!""#"#"#"#$#$##$%$%$%$%&%&%&%&%&'&' &'&&''&'&''&&'(''('('(('()()(()()()()*)*)*)*+* +**+**++*+*++*+*+*++*+,+,+,++,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,+! ! !          ! !! !"!"!"!""#"#"##"#$#$#$#$$#$#$%$%$$%&%&%&%&%&'&&'&'&'&'&'('('()()()()())(()*)*)*)*))*+*+*+*+*++*+,++,+,+,+,+,+,+,+,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,+ !               ! ! ! !"!!"!"!"!"#""##"#"#$#$#$#$%$%$%$%%$%$%&%&'&'('(''(''(('()()()(()()*))*)*)*+**+**++**++*++*++**+*+*+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+ ,++,++,++,+,+,+ !          ! !! ! !"!"!"!"""#"#$# $#$#$#$#$$#$$#$%$%$%$%%$%&%&%&&%&'&'&'&'('(('('(''('('('()()())(()()*)*)*+*+*+*+*+,+,+,++,+,+,+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+! ! !          ! ! ! ! !"!"!"!"!""#"#"# $##$##$#$$##$#$$#$%$%%$%$%&%&%&&%&&%&'&'&'&&'&''('()(()(())()()*)*)* )*)**)*)*)**)*+*+*+*+,++,++,+,+,+,+,+,+,++,+,,+,+,+,++,++,+,+,+,+ ! !!             ! ! ! ! !"!"!""!"""#"#"#"#"#"#$#$#$#$%$%&%&%&'&&'&'(''('('('(('()()()()()()*))*)*)*)*)*))*+*+*+*+*+*+,+,++,+,+,+,+,+,++,+,+,+,+,+,++,,+ ! !             ! ! !! ! !"!"!""!"#""##"#"#$#$#$#$##$#$#$%$%&%&%&%&'&'&'&'&''(''('(('('()()(()()*)*)*)*)*)*)*+*++*++*+*+*+,+,+,+,+ ,++,+,,+,,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,,+,+,+,+              ! ! ! ! !"!"!""!!"!!"!!"#"#"#"#"#$#$#$#$#$%$%$%$%&%%&%&%&'&'&''('('()()()()()*)**))*)*+*+**++*+*+**+*+*++,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,++        ! ! ! !! !"!"!"!"""!"!"#"#""#"#"#$#$##$##$#$#$ %$$%%$$%%$%$%&%&%&%&'&'&''&'&''('('('()(()()()()*)*)*)*)**)*)* +*++*+*++**+*+,++,+,+,++,++,+,+,+,+,+,++,+,++,+,+,+,+,+,+,,+,+,++,+,++           ! ! !"!"!""!"#"#"#$#$#$#$$#$%$$%$$%$% &%%&%%&%%&%&'&'&&'('('('(('('('()(())(()())()()*)*)*))*))*)*+*+*+**+*+*+*+*+*++*++*+*+,+++,++,++,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+ !!          ! ! ! !"!""!"#"#"#"#"#$#$#$$#$%$%$%$%&%&%&'&'&'&''&''('('('()()(()()()()*) *))**)**)*)*)*)*+*+*++*+**+**+*+*+*+,+,+,+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,+,+,++,,++,++,++,,++,,+         ! ! ! !"!"!""!"!"#"#"##"#"#$#$$#$#$%$%$%&%&%&'&'&'&'&'&'' (''('((''('()())(()()()()*)*)*)**)*)*+**+*+*+*+*+*+,++,+,+,+,+,+,+,++,,+,+,+,+,,++,+,++,+,+,+,             ! ! ! !"!"!!"!"#"#$#$#$#$ %$$%$%%$%$%$$%&%&%&%&%&'&''&''(''('()(())())()())()*)*)*)*)*)*+*+*+*+*+*+*+**+,++ ,++,+,,++,+,+,+,+,,+,,+,+,+,++,++,+,+,+,++,++,+,+,+,+             ! ! !"!!"!"#"#"#$#$#$#$%$%$%$%$%&%&&%%&%&%&'&'&'&'&'(''('('(('('()()(()()()*)*)*)* +**++**++*+*+*++*+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+,          ! ! ! ! !"!"!!"!"""!"!"#"#"#"#$#$##$#$%$$%$%$%&%&%&&%%&&%&'&'&''('(''('('()(()()(()()()())()*)*)*)*)*+*+**+*+,+,+,+,+,+,+,,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+         ! ! ! ! !"!"!!"!"!"#"#"#"#"#"#$#$#$%$$%%$%$%&%%&&%&&%&%&'&&'&'&''('('('()()()()()()()*)*)*)*)*+*+*+*+**++**+**+**+,+,+,+,+,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,          ! !! ! !"!"!!""!" #""##""##"#$#$#$#$#$#$%$%$%$%$%&%&%&%&%&'&'&'&''('('('('('()()(())()()()*))**))*)*)*)*))* +*+*+*+**+*+**+*+*++,+,+,+,+,+,+,+,+,,+,+,++,,+,+,++,+,+,++,++,+,+,+          ! ! !"!"!"#"#"#$##$#$##$#$$#$%$%&%&%&'&'&'&'&''&''&'' (''('(''(('()()()()*)*)*)*+**++*+*+*+*++,+,+,+,+,+,+,,+,+,+,+,+,++,++,+,++,+,+,+,+,            ! ! ! ! ! !!"!!"!"#"#"#"##"# $#$#$##$#$##$%$%$%$%$%&%&%&'&'&''&&''('('('('()()())(()()*) *))*))**)*)*)*+*++*+**+*+*+**+*+*++,+,+,+,+,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,+,++,+,+,+,+        ! ! ! !! ! !"!"!"!"!"#"#"#"#$##$#$%$%$%$%&%&&%&&%%&%&&%&'&'&''('(''(''(('()())()()()()*)*)*))*)**)*+*+*+*+**+*+*+*++,+,+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+       ! ! ! !"!"!"#"#"#"#"#"#$#$##$#$#$%$%$%&%&%&%&'&'&'&''('('('('('('()()())(()*)*)*)*+**+*+*+,+,+,++,+,+,++,++,+,+,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,+,+,++            ! ! ! ! !! !!"!"!"#"#"#$#$#$%$$%$%$%&%&%%&&%&%&%&'&'&''('('()()()*)*)*)*)*)*+*+* +*+*++**+**++*++,+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,,+              ! !"!!"!"!"#"#"#$#$#$#$%$%$%$%$%&%&'&'&'&'&'(''('(('('('()(())(()()()*)*))*))**)*)*)**)*+*+*+*++ ,++,+,++,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+      ! ! ! ! !!"!"!"#"#"#$#$#$#$#$$#$%$% $%%$%$%%$$%&%&&%&%&%&'&&'&''('('('('('()()()()()()()*)**))*)*)*)*+*+*++,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+           ! !"!!"!"#"#"#"#"#"##"#$#$#$%$%$$%$%&%&%&%&%&%&'&'&''('('('(('((''('()()()*) *)*)*)**))*)*)*)*+*+*+*+*+*+*++,+,++,,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+     ! ! ! !! !!"!!"!"!!"#""#"#""#"#$#$#$##$%$$%$%$%$%&%&%&&%&%&%&%&'&'&''('('('('()()()()*)*)*)*)*)**)*+*+*+*+*+*+*++,++,++,+,+,+,+,+,++,,+,+,+,++,+,+,+           ! ! ! !"!"!"!"#"#"#"#$#$#$#$%$%$$%&%&%&&%&''&'('('('('()()(()()*)*)*)*+*+*++*+**++*+*++*++*+*++*++*+++,+,+,+,+,+,,+,+,+,+,+,+,++,+,+,++,+,+,+         ! ! !! !!"!"!"!"#"#""#"#"#"#$#$#$%$%$%&%&%&&%&'&'&''&'('('()()(()()*))*)*)*)**))*+*+*+*+*++**+*+*++,+,+,+,+,+,+,+,+,+,+,+,+,,+,,+,+,+,+        ! ! !! !!"!"!"!!"!"!"#""#"#$#$#$$#$#$%$%$%$%$$%&%&%&%&%&'&&''&'&&'(''('('()()()()*)*)*))**)*))*)*)*+*+*+*+**+*+*+*+*+++,++,,+,+,+,+,++,+,+,+,,+,+,+,,+,+,++,+,+,+,+,++,+          ! ! !!"!"!"#"#"#$#$#$##$%$%$%&%&%&'&'&''('('('(''('()(()()()()*)*)**))*+*+*+*+*++**+*++,+,,+,++,+,+,+,+,,++,+,++,+,+,+,+,+,+,+,++,++,+,+,+,+          ! ! !!"!"!"#"#"#"#$#$#$#$$%$%$%&%&%&%&%&'&''&''&'('('('('()())(())()()*)*)*)* +**+**++**+*+*++,+,,++,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+,+      ! ! ! !"!"!!"#"#"##"# $#$#$#$$##$$#$%$%&%&&%&%%&%&'&&''&''&'('(('()()()()*)*)*)*)*+*+*+*+*+**+*++,+,,++,+,++,,+,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,++           ! !!"!"!""!"!"#"#"#"#"##"#$#$#$$##$$#$%$%$%&%&%&%&'&'&'('((''('(('(('(('()()()()()()*))*)*))*)*+*+**+*+*++*+*++,+,+,+,+,,+,+,+,+,,++,,+,+,++,+,+,,++,+,+,+,+,+,++,,     ! ! !! !"!"!"#"#"#"#"#$#$#$$##$##$ %$$%$$%$%$%$%$%&%&%%&%&'&'&'&'&' (''(''('('('()()()())()()()*)*)*+*+* +*+**+*+**+*+*++,+,++,++,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+        ! ! !!"!!""!"!"#""#"#$#$##$$#$#$#$%$%$%$%$% &%%&&%%&%&&%&%&'&'&''&''&''&'(''(('(''(''(('()()()()*)*)*)*)*+*+*+*+*+*+*++*+*+*+*+++,+,+,+ ,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+      ! ! ! !!"!!"!"!"#"#"#"#$# $##$$#$#$$#$%$%&%&%&%&'&''&'&'('((''()()()*) *)**)**)*))*))*)*+*++*+*+*+*+*+++,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,     ! !! ! !"!!"!"!"!"#"#""#"#$#$#$#$#$#$$##$%$%$$%&%&&%&'&&''&'' (''((''('('('()()()(()()()()()()*)*))*)*)*)*)*+*+*+*+*+*++*+,++,+,+,+,+,+,++,+,+,+,+,+,++,,+     ! ! !! !"!"!""!!" #""##""#""##"# $##$$##$##$$#$%$%$%$$%$%$%&%&%&'&'&&'&&'&&'('('('('()()())())()()*)**)*)*)*+*+*+*+**+*++,+ ,++,+,,+,,+,+,+,+,+,++,+,+,+,+,+,+,+,++,++,,+,+,+,++      ! !"!"!"!"#"#"#$#$#$%$%$%$%$%$%&%&%&'&'&&&'&''&''&'(''('('('(''( )()()(())()()*)*)*)*)*+*+*+*+**+*++*+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+    ! !! !"!"#"#"#"#"#$ #$##$#$##$##$%$$%$%$$%%$%$%%$%%$%&%%&%%&&%&%&'&'&'&'&'('('('('()(()()()()*)*)*)*)*))*+*+**+**+*+**+*++ ,++,++,++,+,+,+,+,+,++,+,++,+,+,+,+,+,+,,+,+,++,+            ! ! !"!"!"#"#"#"#$#$#$ %$$%$$%%$$%$%&%&&%%&%&&%&'&''&&'&'&'&'('('()()()()()*)*)*))*)*+*+*+*++*+**+*+*+*++*+,++,++,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+        ! ! ! !"!"!"!!"#""##"#$#$#$#$%$%$%$%$%$%$%&%&%%&&%%&'&'&'&'&'&&'('('('()()()()()()*)*)*)*)*)*)*)*+*+*+*++**+*++*+,++,+,+,+,,+,+,+,+,+,+,++,+,+,+,+,+,++,,++,++,++,,++   ! ! !"!!"!"!"#"#"#$#$#$%$ %$%$%$$%%$%&%%&&%&%&'&''&'&'('(''(''(('('()()()()*)*)*)*)*)*+*+**+**+*++*+++,+,+,+,+,++,,+,+,+,+,,++,+,++,+,+,+       !! !! !"!"!!"!"#"#"#$#$##$##$#$#$%$%%$%&%&&%&%&'&'&'('('()()(()(()()()*)*)*))*)*)*+*+*+*+*+ ,++,+,,++,+,+,+,+,,+,,+,+,+,++,++,+,+,+,++,++,+,+,+,+       ! ! ! !"!"!"#"#"#""#"#$#$#$%$$%$%&%&%&%&'&&'&''&'&'(''('(('(''()()()()*)*)*)*+*+*++*+,+,+,+,+,+,+,+,+,+,+,++,,+,+,+,+,+,+,+       ! ! ! ! !"!"!!"#"#"#$##$##$$#$#$#$%$%$%$$%&%&%&%&&%&'&&'&'&'('()(()()()()*)*)*)*) *)*)**))*)*+*+**+*+*+**++,+,+,+,+,,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,      ! !"!!"#"##"#$#$$#$#$#$%$$%$%$$%$%&%&%&&%&'&'&'(' (''(('(''('()()(()()(()()()*)*)**)*)*)* +**++**+**+*++*+,+,+,+,++,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+        ! ! !! ! !"!"!"!"!"#"#"#"#"#$#$#$$##$%$% &%&%&&%&%&&%&'&''&&'&'(''(''('(('('('()(()()*)*)*)*)*)*+* +*+*+*++*+*+*+*+,+,+,+,+,+,+,,+,+,++,,+,+,++,+,+,++,++,+,+,+        ! !! !"!"!"!"#"#"#"#"#$#$##$#$%$%$%$$%&'&&'&'('('(''()()()*)*)*)*)*)*+*+*+*+*++*+,+,+,+,+,+,,+,+,+,+,+,++,++,+,++,+,+,+,          ! ! !"!"!""!!"#"#"#"#$#$$#$##$#$%$$%$%$%$%$%&%&%&%&&'&'('('(('()()()())(()*)*)*)*)*+*+*+*+**+*++*+*+,+,+,+,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,+,++,+,+,+,      ! ! ! !"!"#""##"#"#"#$#$#$$#$#$%$$%$%&%%&%&%&'&&'&''&'&'('('('( )(()(()()()())()()*)*)*)*))*)*+*+*+**+*+**+*+*+,+,+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+,       ! ! !! !"!"!"#"##"#"#"#$#$#$$#$%$$%$$%$%$%%$%$%&%&%&'&'&'&''&'('('()()()()*)*)*+*+*+*+*++*+++,++,+,+,++,++,+,+,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,+,+        !! ! !"!"!"!"#"#"#"#$#$#$#$#$#$%$%&%&&%%&%&&'&'&'&''&'('('()( )())())()()*)*)*+**+**+*+*+,++,+,+,+,+,+,+,+,+,+,+,+,+,++,,+      ! ! ! !! !"!"!"#"#"#"#$#$%$%$%$%&%&&%&&%&%&%&&'&'&'(''('()()()()*)*)*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,      ! ! !! !"!"!"!"#"#"#"#$##$$#$#$#$%$%$%%$%&%%&&%%&%&&%%&%%&&'&'&'&'&'(''(''('('('()()()*))*) *))*))**))**)*+*+*++*+*+*++*+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+     ! ! ! ! ! ! !"!"!"#"#"##"#"#"#$#$#$#$%$%$%$$%$$%&%%&%&%&%&&'&'&&'&'&'(''('( '(('((''(''( )())()())()*)*)**))*)*)*+*+*++*+*+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+       ! ! !! ! !"!"!"!"!"#"#"#"#$#$#$#$#$%$%$%$%&%&%&%&&%&&'&'&'('('('('()()()())(()(()*)*)*)**))*+*+**+**+++**+*+,++,++,+,+,+,+,+,++,,+,+,+,++,+,+,+        ! ! ! !"!" #""#""##""#$##$#$%$%$%$$%$%$$%%&%&%&%&%&& '&''&''&'&'('('(''('('('()()()()*)**)*))*)*))*))*)*)*+*+**+**+*+*+**+*+*+,+,+,+,,+,+,+,+,+,+,++,+,+,++,+,+,+      ! ! !! ! !"!"!"#"#"#"#$#$#$#$##$ %$%$$%$$%$%$%&%&&%&%&&'&'&'&&'&'(''(''()(()()())(()*)*)*)*+*+*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,,+,,+,+,+,      ! !"!"!"!"!"#"#"##"#"#$#$#$#$%$ %$$%%$$%$%$%$%&%&%&%&&'&'&&'&'('('('('('()(()()())()()*)*)*)**)*+*+*+*+*+*+,+,+,+,++,+,+,+,,+,+,+,,+,+,++,+,+,+,+,++,+     ! ! ! ! !"!"#"#""#"#""#$##$%$%$%$%$%&%&%&%&%&&'&'&'&&'&'(''('(('('()()()()()()*))*))*)*)*)*+*+**+*+*+,+,+,+,,++,+,++,+,+,+,+,+,+,+,++,++,+,+,+,++      ! ! !! !"!"!!""!"!"#"#"##"#"#$#$##$%$%$$%%$%%$%&%&%&%%&&'&'&'&'&'('('('()()()()()*)*)*))*)*)*)*)*+**+*+*+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+      ! ! ! !"!""!"!"!"#"#""#$#$#$%$%$%%$%$%&%&%&&'&'&'&'('('('('()()())()*))**)*)*+*+*++*+*+,++,,+,+,+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+        ! !! !! !"!"#""#"#"#$# $#$$#$$#$#$$#$%$%%$%$$%&%&%&%&&'&'('('('()()()()()*)*)*)**)*)*)*+*+*+*++**+*+,+,+,+,,+,+,+,+,,++,,+,+,++,+,+,,++,+,+,+,+,+,+      ! ! !"!"!"!""!!"#""#""#"#"#"#$##$##$$#$%$%&%&%&%&%&&&'&'&''&'('(''('('()()( )(()())())()*))*)*)*+*+*+*+*+*+*+,++,++,++,+,+,++,+,+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+       ! ! !"!"!"!"#"#"#$#$#$$#$#$%&%&%&%&&'&'&'('(''('('(('()()(())()*)*)*)*)*+**+*+***+*+*+*++**+ ,+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,  ! ! ! ! !"!!""!"!"#""#"#"#$#$#$##$%$%$%&%&%&&%%&'&'&''&'(''('('('('()()(()()*)**))*)*)*)*+*+*+*++*+*+,+,+,,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+       ! !"!"!"!""!"#"#"#$##$%$$%$%$%&%&%&%%&'&'('(''('()( )()(()(()()()()*))*)*))**)*)*+*+*+*+,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,+,+,+,+,+    ! ! !! !"!"!""!!""!"#"#$#$%$%$%$%&%&%&&%%&'&'&'&&'&'(''('()()()()*)*)*)*+*+**+*+*+,+,+,+,+,+,+,+,++,+,+,+,++,,+,+,++,,+,+,+,+       ! ! ! !"!""!!""!"#"#"#$#$#$#$#$%$%$$%$%&%&%&%&'&'&'&&'('('((''()()()()*)*)*)*)*+*+*+*+*++*+*+,++,+,+,+,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+        ! ! ! !"!"!"!""!"!"!"#"#"#"#$#$##$#$#$%$%$%%$%%$%&%&%%&%&'&'(''(''('('()()()*)*)*))*))*)*+*+**++*+*+,+,+,+,+,,+,+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+     ! ! !! !! ! !"!"!"!"#"#"#"#$#$##$$#$ %$$%$%$$%$$%&%%&&%&%&%&%&'&&'&'&'('('('('('()())())()()()*)*)*)*)*+*+*+*+**+*+*+*+,+,++,+,++,+,+,++,+,,+,+,+,+,+,+,+,+,        ! ! ! ! !"!"!"!""!!"#"#""#$#$%&%&%&'&''&''&'('('('()()()())()()()*)**)*))*)*)*+*+*+*+*+*++*+,+,+,+,+,++,+,+,+,+,+,+,         ! ! ! !"!"!"!"#"#"#""#"#$#$$#$%$%$%$%&%&%&%&%&&%&'&'&'&'(''('(''('(''('('()()()()()*))*)*)*+*+***+**+*+*+,+,+,+,+,+,+,+,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,++      ! ! !! !"!"#"#"#"#$#$#$%$%$%&&%&'&&'&'&'('('()()()*)*)*)*)*))*+*+*+*++*++*+,++,+,+,++,+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+      ! !! ! ! "!"!!"!"!!"!!"#""#"#""##"#"##"#$##$#$#$%$%$%$%&%&%%&&%&'&'&''&'&'('(''('()(()(())()*)* )*))*))*)*))*+*+*+*+*+*+*+*+,+,++,+ ,+,++,++,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,     ! ! !"!!"!" #""#""##""#"#$#$$#$%$%$%&%&%&&%&%&'&'&'&'&'('(''('('()()(()()*)*)*)*)*)*+**+* +*++*+*++*+,+,++,,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+       ! ! ! !"!"!"!"!"#"#"#"#"#"#$#$##$##$$#$%$%$%$%&%&%&%&%&'&'&''&&'&'('('((''('()()()()())(())()*)*)*)*)*+*+*++**+*+*+,++,++,+ ,++,++,,++,+,+,+,+,+,+,++,,+,+,    ! ! ! !"!"#"#"#"#""#$#$#$$#$%$$%$%&%%&%&%&'&'&'&'&'('('()(()()(())()() *)*)*))*))*))*+*++**+*+*+,+,+,++,+,,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,      ! ! ! !"!!"!"#"#$##$#$#$%$$%$%$%&%&%&%&'&'&'&'('(('()()())()()()*)*)*)**)*+**+*+*+*+*+,+,+,+,+,++,+,+,+,+,+,+,++,+    ! ! ! ! !! !"!"!"#""#"#$#$#$#$%$%$%%$%&%%&%%&&%%&'&&'&'('('(('()(())()()*)*)*)*)*)*+*+*+*+**+*+*+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,+    ! !"!!""!!"!"#"#"#""#$#$##$#$%$%$%&&%&'&'&'&'&'('('('(''()()*)*)*)*)*+**+* +**+*+*++*+*+,+,+,++,+,+,+,+,++,+,+,+ ,++,++,++,+,+,+    ! !! ! !"!!""!"!"!"#""#"#""#"#$#$#$$#$%$%$%%$%$%&%%&%&'&'&'('(''('('('()()()(()()*)*)*+**+*+*+*+*+,+,+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+      ! ! ! ! ! !"!"!!"!!"!"#"#$##$#$#$#$$#$%$%$%&%&&%'&'&&'&&'('()()()()(())()*)*)*)*)*)*++**+*+*+*+,+,+,++,+,,+,+,+,++,++,+,+,+,+,+,      ! ! ! ! ! !"!!"!"#"#""#$#$#$$#$%$%$%$%&%%&%&&%&'&'&'&'&'('(''('('('('()(()()()()()*)*)*)*)*+**+*+*+*+,+,++,+,+,+,+,+,++,,+,++       ! ! ! ! "!""!"!!"!"!"!"#""#"#"#$#$#$%$$%$$%$%&%%&%&&%&&%%&'&'&&'('(''()())()()()*)*)*)*+**+*+ *++*++*++*+,+,+,+,++,+,+,+,+,+,+,+,++,++,,+,+,+,+     ! ! ! !"!""!"!"#""#"# $##$#$#$##$#$% $%%$$%%$%%$$%&%%&%&%& '&''&&'&&'&&'('( '('(''('('()()()()()*) *)*))**)*))**+*+*+*+*+*+*+,+,++,,+,+,+,+,+,+,+,+,+,+,++      ! ! ! !! !"!"!""!"#""#"#"##"#"#$#$##$$#$%$%%$%$$%&%%%&%&%&%&%&'&&''&&'('('('('()()()()()()*)*))**)*)*)*+*+*++*++*+*+,+,+,+,+,++,+,++,+,+,+,+,+,+,,+,+,++,+,++,+       ! ! !"!"!"!"!"!"#"#$#$%$%$%$%$%&%%&%&&%&%&%&'&'&'&'('(('('('('('()()()(()()*)*)*)*)*)**)**)*)*)*+**+*+*+*+,+,+,+,+,+,++,++,+,+,+,+,+,+,+,+,++,++     ! ! ! ! !"!"#"#"#"#"#$#$$#$%$%$%$%$%%$%&%%%&%&%&'&'&'&'('('('('()()()()()()()*)*)*)*)*+*+**+* +*+**+*+**+**+*+,++,,+,+,+,+,+,+,++,+,+,+,+,+,++,,++,++,++,,++,,+  ! ! ! !"!!""!"!"!"#"#"#"##"#$#$$#$$#$$#$$##$%$$%$%$%$%%$%&%%&%%&%&&%%&'&'&'&'&'('('(('()()()()()*)*)*))*)*+*+*+*+*+*+*+,+,+,++,,+,+,+,+,,++,+,++,+,+,+,+          ! !! ! !! !"!"!"!"#"#"#""#""#$##$#$#$%$%$%$%&%%&%&'&'&'&''&'&&'('('('()()(()()()*)*)*)**+*+**+*+*+*+,+,+,+,++,++,+,+,+,++,++,+,+,+,+,++,     ! ! !"!"!"!"!"#"#"#$#$#$#$#$%$$%$%$%%&%&&%&'&'&'&&'&&'&'(''(('('()()()*))*))*))*)*)*++*+**+*+*++*+*+*+*+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+     ! !! !"!!"!"#"#""##""#"#$#$##$#$%$%&%&%&%%&%&%&'&'('('('()()()( )()())(()()*)*))*)*)*)**+*+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+     ! ! ! !"!"!"!!" #"#""#""#"#$#$$#$$#$%$%$$%%&&%&%&'&'&'&&'&'('(''('('( )()(()())()()()*) *)*))**))*))*)*+*+*+*+*+*+,+,+,+,+,+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,         ! ! !! ! ! !"!"#" #""##""#"#"#$#$##$$#$#$%$%$%$%$%%&%&%&%&%&&%&'&'&&'&'&'('('('()()()()()*)*)*)*)**++*+*+*+*+*+,+,+,,+,+,++,,+,+,++,+,+,++,++,+,+,+              ! ! !"!!"#"#"#"#"#"#$#$#$#$#$%$%$%% &%%&%&%%&&%&'&'&'('('('(('()()()()()()*)*)*)*)*+*+*+*+,+,+,+,+,+,++,++,+,++,+,+,+,+,+,+                        ! ! !! ! !"!"!!"#"#""##"#$#$#$%$%$$%$$%$%% &%&&%%&%&%&&%&'&'&'&'('('((''('('()(())(()()()*)*)*)**)*))**+*+*+*+*+,+,++,+,+,++,+,,+,+,+,+ ,++,,++,+,+,++,+,+,+,+,                         ! ! !"!"!"#"#"#"#$#$#$%$%$%%$%$%%&%&%&%&'&'&'(' (''(('(('('()()()()(()()*)*)*)*))*)**)*+*+*+*+*+**+*+,+,+,+,,+,+,+,+,+,+,+,+,,++,,+,+,+,+,+,                        ! ! !"! "!""!""!"!""!"#""##"##"#"# $#$#$##$$#$#$%$%$%$%%&%&%&%&%&'&'&'&'('('('('('()()()*)*)*)*)*)**+*+**+**+,+,+,+,+,+,++,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,+,+,+,+                                   ! ! ! ! ! !"!!"!!""!"#"#"#"#$#$#$#$%$%$$%$%%&%&%&%&'&''&'&'&'('(('('()()()*)*)*))**)*)**+*+*+*+**+*+**+,+,+,+,+,+,+,+,+,+,+,++,,+,+                                  ! ! ! ! !"!"!""!"#$#$#$#$%$%$%$%%&%%&%&%&%&'&&'&'&'('('('()()()*)*)**+*+**+* +**++*+**++*+*+,+,+,+,+,+,+,+,+,+,+,+,+,                                    ! ! !"!"!"!!"#"#"#"#$#$%$%%&%&%&%&'&'&'&'&'&&'('('('()(()( )(()(())(()*)*)**))*)*)** +**+**+*++*+*+,+,+,+,+,+,+,+,+,+,+,                                            ! !"!!"#""#"#"#$#$#$%$%$%$%$%%&%&%&%&%&'&''&'&' ('(('('(''('()()())(()()*))**)*)**)*)*+*+*+*+*+*+**+*+,+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,                                       ! ! !"!"#"#"#$#$$#$#$%$%$%$%$%%%&%&%&%&'&'&'&'&'('(' ('((''(''('()()()())(()*)*)**)**+*+*+*+**+,+,+,++,,+,+,+,++,+,+,+                                     ! ! !"!"!"!"#"#""#"#"#$#$#$#$#$%$%$%$%%%&%&%&%&'&'&'(''(('('('( )()(()()(()(()()*)*)**)**)*))*)**)*)*+*+*+*+*+*+,+,+,+,+,++,+,+,++,+,+,+,+                                     ! ! !"!"!!"!"!"#"#"##"#$ #$##$##$$##$%$%$%$%%&%&%&'&'&''&'('()()()*) *)**))*)*)**+*+*+*+*+*+*+,+,+,+,+,+,+,+,+,,+,,+,+,+,+,                                       ! ! !"!"!!""!" #""#"#""#"#$#$$#$##$%$%$%%&%%&'&'('(''('('()()()())()*) *)*)*)*)**)**+*+**+*+*+,+,+,,+,+,+,,+,+,++,+,+,+,+,++,+,+                                   ! ! !"#$#$#$%$%%&%%&%%&%&'&'&'&'&''&'('('('('('()(()(()()()()*)*)*)**)*)**+**+*+*+,++,+,++,+,+,+,+,+,+,+,++,++,+,+,+,+                              ! ! ! !"!""!"#"#"#"#$#$#$#$%$%$%%&%&%&%%&%%&'&'&''&&'('('('('( )(())(()(()()()()*))*))**)**+*++**+*+*+*+,+,++,++,+,+,+,+,+,+,+,+,+,+,++,,+,+                            ! ! ! ! !"!"!"#"#"#$#$##$$#$%$%$%%$%%$% &%%&%&&%&&%&'&'('('()(())()()*)*)*)*)** +*++**++**+*+*+*+,+,+,++,+,++,+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,++                      ! ! ! !! ! !! !"!!"!"!"#"#"#"#$#$#$$#$%$%$%$%&%&%&%&%&&%&'&''&'&'('('('('()()()())()()()*)*)*)*)**+*+*+*++**+*+*+,+,+,+,,++,,+,+,++,+,+,,++,+,+,+,+ ,+,++,,+,++                         ! ! !! ! !"!""!"#"#"#$#$#$#$%$%$%%$%%&%%&%&%&'&'&'('('((''('()(()()(()()*)*)*)*)**+**+*+*++**+*+,+,+,+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,+                               ! ! ! ! !"!"!!""!""!"#"#"#"#$#$#$$#$$##$ %$$%$%$$%%%$%&%%&%&%&%&'&'&'&&'(''(('('()()()() *)*))*)*)*)*)**+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+                             ! ! !"!"!""!" #""#""#""#""#$#$##$$#$$#$%$%$$%$%$%$%&%&&%&'&&'&'&'(''('('( )())(()()()()*)*)**)**+*+ *++*++**+*+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+                             ! !"!!"!"#""#""#"#"#$#$$#$%$%%&%&%&&%&'('(''('('(('()(()()(())()*)*)**+*+*+*+*+,+,+,++,+,+,+,++,,+,+,++,+,+,+,+,+                        ! ! !"!"!"#"#"#"#$#$#$#$#$%$%$%%&%&'&'&'&'('('('()()()*)*))*)**)*+*+*+*+*++*+*+,+,+,+,++,+,+,+,++,,+,+,++,,+,+,+,+,+                           ! ! ! !"!"!!"!"#"#""##""#$#$#$#$$%$%$%%&%&&%&%&'&'&&'&'&'('('('()()()()()*) *)*))*)*)**)**+**+**+*+,+,+,++,+,+,+,+,,+,+, +,++,+,+,,++,+,+,,+,+,++,,                            ! ! ! !"!"!""!"#"#"##"#$#$##$%$%$%$$%$%$%&%&%&'&'&'&'('()()(()()(()(()*)*)*)*)**+*+*+*+*++**+*+,+,+,+,+,+,,+,+ ,+,++,,+,+,+,+,+,+                                  !"!!"!"!"!""!"#"#"#$#$#$$##$%$%%$%&%&'&&''&'&'(''(('('('()()()*)*)**)*)*)*)**+*+*+*++*+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,,                       ! ! ! !"!"!""!"#"#"#$#$$#$#$#$%$%$$%$%&%&%&%&'&'&'&'('('(('('('()())()(()()(()*)*)*)**)**)*+*+*+*+*+*+,+,++,+,+,+,+,+,+,+                                  ! ! ! ! !"!"#""#""#"#$##$#$#$#$%%&%&&%%&'&'&'&&'&'('('('()(()()()*) *)*))*))*** +**+**+**+*+*+*+*+,+,+,+,,+,++,+,+,+,+,+,+,+,+,+,+,+,+                               ! ! ! "!!"!"!"!!"!"#"##""#$ #$##$#$#$#$#$%$%$%%$%%$%&%&%%&%&'&'&'&'('('(('()()()()()*)*)*)*)*)* +*+**++**++*+*+*+*+,+,+,+,++,,++,+,+,++,+,+,+,+,+,+,++,+,                           ! ! ! !! ! !"!"!!""!"#"#"#$#$$##$%%$%$%&%&%&'&'&&'&'(''(''(('()()()()()*)**)**+*+*+**+**+*+ ,+,++,++,+,+,+,++,+,+,+,+,+,++,+,+,+,++,+,+,+,+                             ! !"!"#"#"#"#"#$#$#$%$%$%$%$$%$%&%&'&'&'&'(''('()()()()()(()*)*)*)*+*+**+*+*+*+,+,+,+,+,+,++,+,+,++,+,+,+                        ! ! ! !"!""!"#"#"#"#"#$#$#$%$$%&%&%&%&'&&'&''&'('('('('((''(('()()*)*)*)***+*+*+*++*+*++*+,+,+,+,+,+,++,,+,+,++,+,                         ! ! !! !"!""!""!"!"#"#"#$#$#$%$$%&%&%&'&'&'&'('(''(('('( )()())()(()(()*)*))*)*)*))*)*)*+*+*+**+*+*+*+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+                         ! ! ! ! !"!!"!"!"#"#"#$#$#$#$%$$%$%&%%&%&%&'&'&' (''('(('('('()()()())()*))**)*))*)**+*+*+,+,+,++,+,+,+,+,+,+,++,+,                   ! ! !"!"!"!"!"#"#"#"##"#$#$%%$%&%&%&&%&'&'&'&'(''(('('()()()())()()*)*))*)*))**+*+*+*+*+,+,+,+,+,+,++,+,+,++,+,+,++,+,+,+,,+,+                        ! ! ! ! !"!"!!"!"#"#""#$##$#$#$%%$%$%&%&%&%%&%&'&'&'&'('()(())()()*)*)*))*)*))*+*+*+*+*+*+,+,+,+,+,++,+,+,+ ,++,++,++,+,+,+,+                         ! ! ! ! ! "!""!""!"!"#"#"#$##$$##$#$%$%%%$%$$%&%&%&&%%&%&'&'&'&'&'('('(''('()()()*)*)*)***+*+*++*+*+*+ ,++,++,++,+,+,+,+,+,+,+,+,+,+,+,+,+,                        ! !! ! ! !"!"!!""!"!"#"#"#"#"#$#$#$%$$%$$%$%$%$%&%%&%%&&%&'&'&'&'('('('('()()()*))*)*)*)*)*)**)**)*+*+*+*+*+*+*+,+,++,++,+,+,+,+,+,+,++                 ! ! ! ! !"!"!"!"#"#$#$#$%$%$%%$%$%$%&%&%&%&'&&'&'&''(''('('('('()()()()()*)*)*)**)*+*+**+*+*+,+,+,+,+,++,,+,++,+,+                             ! !! !"!"!"#"#"##""#$##$#$#$#$%$$%$%$%&%%&%&'&'&'(''(('('('()()()()*) *)*))*))*)*)**)*+*+*+*+**+**+*+*+,+,+,+,+,+,+,+,++,++,,+,+,+,+,+,                       ! ! !"!"#"#"#$#$$#$%$$%$%$%&%&%&%&'& '&'&&'&'&'&''&'('('('()()(()()()*)*)**)*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+                           ! !! ! !"!"!"!"!"#"#"#$#$%$%%$%$%&%%&%&%&%&'&'&'('('('('('()()(())()*)*)**)**)*+**++*+*+*++*++*+,+,++,+,+,+,+,+,+,,+,+,++,+,++,+,++                              ! ! !"!"!!""!"!"#"#""#$##$##$#$%$%$%&%&%&&%&'&&'&'&'&'&'(''('()()()()()())())()()*)**)*)**+**+*+*++*+*+,+,+,+,+,+,+,+,+,+,++,+,                           !"!"!"!"#"#"#$#$##$#$#$%$%$%%$%%$%&%%&%&%&'&'&'&'('('('('('()()()*) *))**))*)*)*)*)**)*+*+*+*+*+*+,+,++,+,+,+,+,+,++,,++,++,++,,++,,+                      ! ! ! !"#"#"#$##$$#$#$%$%$%%$%&%%&%%&%&%&'&'&'&'('('('('()()()(()*)*)*)*)*+*++*+*+*+*+,+,,++,+,++,+,+,+,+,+                     ! ! !"!!"!"!"#"#$#$%$$%$%$%&%&&%&%&'&'&'&'('('()()()*)*)**)*)*+* +*++*++**+*+*+,+,,+,+,++,++,+,+,+,++,++,+,+,+,+,++,+,+                        ! ! !"!""!" !"#""#""##""#"#$##$##$$#$#$$%$%%$%&%&%%&%&'&'&'('('()(()())(()()()*)*)*)*)**)*+*+*+*+*+*+,+,++,,+,+,+,+,+,+,+,+,+                   ! ! ! ! !"!"!"!"#"#"#$#$#$$%$%%$%$%&%&%%&%&'&'&'&&'&'('('('('('((''()()(()*)*)*)*)**)*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+                           ! ! !! !"!"!"!!"!!"#"#""#$#$%$%$%$%$%&%&%&%&%&'&'&&'&'&' ('(''('(('('('()()()(())(()(()(()*))*)*)*)*)*+*+* +*+*+*++*+*+,+,++,,+,,+,+,++,+,+,+,,+,++,,+,+,,++,+,+,+                       ! ! ! ! !"!"!!"#"#"#$#$##$#$%$$%$%&%&%%&%&%&'&&''&'&'('('('('()()(()()()()()*))*)*)*)*)*+*+*+*+*+,+,++,,+,+,++,+,+,++,++,+,+,+,++                       !"!"!"!"!"#"#"#"#"#$#$#$#$%%$%$%$%&%&%&%&%&'&'&'&''&'('('('('('()()(()()()*)**))*)*))*+*+*+*+**+*+*+,+,+,++,++,+,++,+,+,+,+,+,+,++                     ! ! ! !"!"!"!"#"#"#"#$#$#$$#$$%$%$%$%&%&%&&%%& '&&''&&'&&''&'(''((''('('()()()()()*)*))**)*)*+*+*+*++**+*+,+,,+,+,+,+ ,++,,++,+,+,++,+,+,+,+,+,+                     ! ! !"!"!!""!"#"#"#"#$#$#$##$$%$$%$$%%$%$%&%&%&'&'&'&'&'('('('(''('()()()()(()()*)*)**)*)*)*)*+*+*+*+*+*+*+*+,+,+,+,+,,++,,+,+,+,+,+,+,+                       ! ! ! !"!""!"#""#"#"#"#$#$#$#$%$%$%$%$%$%&%&%&%&'&'&'&&'&'&'&'('('()()()()*)*)**))*))*+*+*+*++**+*+,+ ,+,,++,,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+                         ! ! !"!"!"#"#"#"#$#$#$$%$%%$$%%$%&%&%&'&''&'&'&'('('()()()(())()*)**)*)*)*+*+*++*+*+*+,+,+,+,+,+,+,++,,+,+,+,++,                                ! ! ! !"!"!""!"#"#"##"#$#$#$#$#$$%$%$%&%%&&%%&%&%&'&'&'&'('('()()*)*)*))*)**)*+* +*++*++*+*+*+,+,+,+,+,+,+,+,+,+,+,+                      ! ! ! ! !"!"!"!!""!"#"#"#"#"#$#$#$%$%$%$%$%$%&%&%&%%&'&'&'&'(''('(''(''(('()()())(()*)*)*)*)*+*+*++*+*+,+,+,+,+,+,+,+,+,+,+                          ! ! ! ! !"!""!"#"#"#""#$#$#$$$%$%$%&%&%&&%&'&'&'&&'&'('('('('()()()()()*)*)*))**)*)*+*+*+*+*+*+**+,+,+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,+                          ! ! !! !"!"!"!"#"#"#$#$#$##$#$%$%$%&%&%&%&%&'& '&''&&'&&'&&'('('('(('()()()()*)*)* )**))**)*)*+*+*++*++**+*+*+,++,,+,+,+,++,+,+,+,+                        ! ! !! !"!"#"#"#$##$#$#$#$$%$%$%&%&'&'&'&''&&'&' ('(''('(''(''('()()( )())())()())()*))*))**)*)*+*++*+*++*+*+,+,+,+,++,+,+,++,+,+,+,+                           ! ! !! !"!!"#" #"#"#""##"#$#$#$#$#$#$$$%$%&%&%%&%&'&&'&'('('()()( )())(()()()*)*)*)*)*)*+*+*+,+,+,+,+,,+,,+,+,+,+,+                              ! ! !"!"!"!"#"#"#$#$#$$#$#$$%$%$%&%&'&&'&'&''&'('('(('()()()()()()*))**)**)*)*)*+**+ *+**+*++**+*+,+,+,,+,+,++,+,+,+,+,++,+,+,+                          ! ! ! !"!""!"#"#"#"#$#$#$#$#$$%$$%$%$$%&%&%&&%&'&'&'&'&'&'(''(''('('('()()()()*)*)*)*))*)*+*+*+*++*+,++,+,+,+,+,+,++,++,+,+,+,+,+,+                          ! ! !"!"!!"!!"!"#"#"#"#"#"#$#$#$$%$%$%$%&%&%&%&'&'&'(''((''('('('()(()()()*))*)*)*+*+*+*++*+**+*+,+,+,+,+,+,+,+,+,+,++,,+,+,+,                           ! !"!"!""!"!"#$#$#$#$$%$%%$%&%&%&'&'&'(''(('()()()(()()**)*)*+*+*+*+**+*+,+,+,+ ,++,++,+,+,+,+,+,,+,,+,+,+,+,                            ! ! !"!"#""#"#$##$#$$%$$%%$%%$%&%&%&'&'&'&'&'('('('('()()())()()*))*)*)*)*)*)* +*++*+*+**+*+*+*+,+,+,+,++,+,+,,++,+,+,+,+,+,++,,+,+                      ! ! ! ! !"!"#"#"#"#$##$$#$$%$%$%$%&%&%&%&'&'&''&&'&'(''('(''()(()()(()()()*))*)*)**))*)* +**+*+*+**++*+*+**+*+,+,,+,+,+,++,,++,+,+,++,,++,++,,+,+,++,+,+,+,+                          ! ! ! !"!"!"#"#"#$#$$%$%$$%$%$%&%&%&%&'&&''&'&'('('('()()( )()())()()())*)**)*)*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+                  ! ! !"#"#"#$#$#$$$%$%%$$%&%&%&%%&%&'&&''&'('('('('()(())()()()*)*)*)*)**)*+*+ *++*+**+*+*+,+,+,+,+,++,+,+,+,+,+,+,+                            ! ! ! "!"!"!!""!"#$#$#$$%$%$%$%&'&'&'&'&''&'(''('(''(('()()()()()()*)*))**)*)*+*+*+**++*+,+,+,++,,+,+,++,+,+,+,+,+,+,+                       ! ! !"!"!"#"#"#$#$$#$%$%$%$%&%&%&%%&'&&'&'&''&&'(''(''('('()()()()*))**)**)*)*))* +**+*++*+*+*++*+,+,++,+,+,+,+,+,+,+,+,+                    ! ! !"!"!"!!"#"#"#$#$#$#$#$%$%$%$%$%&%&%%&%%&&%&'&'&'&'('('('()()()()()*)*)*)*)*+*+*+*+*+*+*+*+,+,+,+,+,++,+,+,++,+,+,++,+,+                       ! ! !"!!"!"!"!"#"#$#$#$##$$%$%$%%$$%%$%&%&%&' &''&''&''&'('('(''('('()(()(())()()*)*)*)*)*)*)*+*+**+*+*+*++*+*+*+,+,+,+,+,+,+,+,+,+,++,++,+,+                             ! ! ! ! ! !"!"!"!"!"!"#""#$#$##$$$#$ %$%%$%%$$%$%&%&%%&%&'&'&'&'('('(''(('()()())()()*))*)*)*)**)*+*+*+*+*+,++,+,+,+,+,+,+,+,+,+,+,+,++                                    ! ! ! !"!"!""!"!"#"#"#$##$#$#$$#$%$%$%%$%$%&%&%&%&'&'&''&'('()()()**))**))**)*+*+*+**+*+*+,+,+,++,+,+,+,+,+,+,+                             ! ! ! ! !"!"!"!"#"#""#"##$$#$#$#$%$%$%$$%%$%&%&&%&'&'('()()()()*)*)**)*)*)*+*+*+*+,+,+,+,+,+,+,+                             ! ! !"!"!"#""#"#"#$##$#$$%$%$%$%&%%&%%&%%&%&'&&'&'&''&&'('('(('()()()()()*)*)**)*)*)*+* +*+*+*+**+*+,+,+,+,+,+,+,+,++,+,+,+,                                  ! !"!"!"!"#"#"# $##$#$##$$$#$#$%$$%$%$%&%&%&'&'(''('('()()()*))*)*)**))**)*+*+*+*+*+*+,+,+,++,,+,+,+,+,+,+,+,+,+,,+                         ! !"!!"!"#"#$##$%$%$%$%&%&%&&%&'&'&'&'&'('('('('(''()(()()()())() *)*))*))*)*)*)*+*+*+**+**+*+,+,++,+,+,+,+,+,+,++,,++,+,++,++,+                          ! ! !"!!""!"#"#"#$$%$$%&%&&%&%&'&&'&'&'&'('('('()()*)**))**)*)*+*+**++*++*+*++*++*+,+,+,+,+,+,+,+,+,+,+,+                        ! !"!"#"#$#$##$%$%$%$%&%&%&&%&'&'&&'&'&'(''('('()()()()*))*)*)*+*+**+*++*+*+,+,+ ,++,++,+,++,+,+,+,+,+,+                      ! !"!"!"#"#"#$#$$#$%$$%$$%$$%$%&%&%&%&%&'&'&'&&'&&'('(''()()()()*)*)*)*)**)*+*+*+*+**+*+,+,++,+,++,+,+,+,+,+,+,+                    ! !"!"!"#"#$#$##$$#$#$$#$%$%$%$%&% &%&&%&%&&%&'&'('('('('(('()()()()()**)*)*)*)*)*+*+*+*+*+*+*++,+,+,+,+,+,+,+,+,+,+                     ! ! ! !"!"!"!!"#""##"#$##$%$$%$%&%&%&%&'&'&''&'&'('('('('( )()())(()(()*))*)*+**+*+*+*+*+,+,+,+,+,+,++,+,+,                          ! ! !"!""!""!"#""#""#"#$#$###$#$$#$#$%$$%$$%$%&%&'&'&'&&'&'('(''(''('()()()()()()*)*))**)*)*)**)*+*+*+*+*+*+,+,+,+,+,+,,+,+,++,+,+,+,+,+                            ! !"!"!"!"#"#"#$##$#$#$%$%$%&%&%&%&'&'&'('(''(('()(())()()*))*)*)*+*+*+,+,+,+,+,+,+,+,+                                      ! ! ! !"!" #""##""#""#"#$##$#$#$%$%$%$%&%&%&%&%&'&'&'('(''('('()()())()*)*)*)*))*+*+**+*++**+,+,+,+,++,+,+,++,++,,++,++,++,,++                                     ! ! ! !"!"!""!!"#"#$#$#$%$%$%$%$%&%&%&&%&'&'&'&'('('('(('()()()()())*)**)*+*+**+*+*+**+,++,+,+,+,+,+,+,+,+,+,+,+                                          ! ! ! ! !"!"!"!"#"#$#$#$#$%$%$%$%&%&%&%&%&'&''&'&'&'('()())(()*)*)*)*)*)*+*+*+*+* +*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,                                          ! ! !"!"!"!"!""!"#"#"#"##"#"#$###$%$%$$%$%$%&%&%&%&'&'&'&'('((''(''('((''()()()()())())()())*)*+*+*+* +*++*++**+*+,++,+,+,+,+,+ ,+,+,++,++,,+,+,+,                                       ! ! !"!"!""!"#" #""#"#"##"#$#$#$#$%$%$$%$%$%&%%&%&'&'&'&'(''('('('()()()()**))*)**))*)*)*+**+*++*+*+*+,++,,+,+,+,+,+,++,,+,++,+,+,,+,+                                                ! !"!!""!!"#""#"#""#$##$#$%$%&%&%&&%&'&' &'&&'&&''&'('('('()()()()()()*))*))**))*)*)*)*+*++*+*+*+,+,+,+,+,+,+,+,+,+,+,+,+,++,+                                                       ! ! !"!"!"#"#"#"#$##$#$#$%$%$%$%%$%&% &%%&%&%&%&%&'&'&'&' (''('(''(('('()()()())*)*)*)*)*+*+*+*+,+,+,++,+,+,+,+,+,,+,+,+,+,+,++                                            ! ! !"!!"!"!"!""#"##"#""#$#$$##$#$%$%$$%$%&%&&%&&%&%&'&'&'&'( '(''('(('('(('()()())())*)*)*)*+*+*++*+*+*+*+*+,+,+,+,,+,+,+,++,,++,,+,+,+,+,+                                                  ! ! !! ! ! !"!"!"!"#"##"#"#"#$$#$#$#$#$%$%$%$%&%%&&%&%&'&&''&''&'('(''(''('()() ()(())(()()*)))*)*)*)*+*+*+*++*++*+*+,+,+,+,+,+,+,+,+,+,+,,+                                                     ! ! !"!"#"#""#"##""#$#$#$#$#$#$%$%$%$% &%%&%&%&&%&'&''&'&&'('(''('()()())()())*)*)**)**))*))*)*+*++**+*+,+,+,+,+,+,+,+,+,+,+,++,+,+                                           ! ! !"!""!"#"#"#"#$#$#$#$#$% $%$$%$%$%%$%&%&%&'&'&'('('('()()()())*)*)*))*)*)*+*+**+*+*+,+,+,++,++,,+,+,+,+,++,+,+,+,+,+,++                                      ! ! ! !"!!""!"!"#"#"#"##"##$#$#$#$%$%$%$%$%%$%&%%&%&&%&%&&%&'&'&''&''&&'('('('()(())()()()*)))*)*)*)*)*)*+**+*+*++*+*++*+,+,++,+,++,,+,+,+,+,+,+,+,+,++,++,,++,+                                             ! ! ! !"!"!"!"#""##""##$#$#$%$%$%$$%$%&%&%&%&%&'&'&'&'&'('('()()(())())*)*)*)*+* +**+*+*++*+*+,+,+,+,+,+,+,+,+,++,+,++,+,+                                                    ! ! ! !! !"!"!"!"!"#"#"#$#$#$#$##$%$%$$%&'&'&'('()()()())*)*)*)*)*+*+*+*+*+,+,+,++,+,+,+,+,+,+,+,+,+                                            ! ! ! !"!!"!"!"!!"#"#"#$#$#$##$$##$%$%$%$%&%&%&%&'&'&'&'&'('('('()()()()()*)*)**)*)* +**+**++*+*+*+*+,+,+,++,+,,+,+,+,+,+,+,+,+,+,+,                                            ! ! ! !"!"!"#"#"#"#$#$#$##$#$%$%$%$%&%&%%&%&'&'&'(''('(('()()(()()()()()*)*)*)*)*)* +**+*+**++*+*+,+,+,,+,+,+,,+,+,+,+,+,+,++,                                           ! !"!"!"!"#"#"#"#$#$#$ %$$%$$%$%$$%%$%&%&'&&'&'(''(('('('()()(())())())*))**)*)*)*+*+*+*+*+*+*+*+,+,,+,+,++,,+,+,+,+,+,+,+,,+                                            ! ! !"!"!"!"#"#"#$ #$#$#$##$#$%$%%$%&%&%&%&'&'&'&'('('('('()()()()())*))*)**)*)*)*+*+*+*+**++*+*+,+,++,++,,+,++,+,+,+,++,++,,+,+,+,+                                           ! ! !"!"!"#"#"#"#"#$#$#$#$#$%$%$%$%&%&%&%&%%&%&'&&'&'&'('('('()()())(())*)*)*)*)*+*+*+*+*+*+*+,+,+,+,+,+,+,+,+,+                                 ! ! ! !! !"!"#"#"#$#$#$#$%$$%$%&%%&%%&'&'&''&&' ('(''(''(('('()()()()()()()))*) *)*)**))*)*)*+*+*+**++*+**+,+,+,+,+,+,+,+,+,+,+,+,+                                 ! ! ! ! !" #""##"##"#"## $#$#$$##$#$%$$%$%%$%&%&%&%&'&'&'&'('('(''('( )()())()(())*)*)*))*)*+*+**+*+*+*+,+,+,+,+,+,++,+,++,++,+                                  ! ! !"!!""!"!"!"#""#"#"#"##$#$#$#$%$%$%&%&%%&&%&%& '&''&''&'&'('('(('('('()()()())*)*)*)*)*+**+*+*+*+*+*+,+,+,+,+,+,,++,+,+,+,++,++,+                                     ! ! !"!!"!!"!"!"#"#"#"##$#$%$%$%&%&%&%&'&'&''&'('('()(()()())())()*)*) *))**)**))*)*+*+*+*++*++**+,+,+,+,+,++,+,++                                   ! ! !"!"!"#"#"##$#$#$%$%&%&%&%&&%&%&'&'&'&'&'(''('()()(())*)*))*)*)*)*+*+*+*+*+*+,+,+,+,+,+,+                                       ! !"!!"!"!"#""##$#$#$#$%$%$%$%&%&%&%&'&''&''&&'&'(''('('()()())())*))*)*)*)*)*)*+*+*+*+*+,+,+,+,+,+ ,+,,+,,+,++,+,+,                                ! ! !"!""!"!"#"#$# $#$##$$#$#$$#$%$$%$%$%&%&%&%&'&'&''&'('('(()()(())())*) *))*)*)**)*)*+*+*+*+,+,+,++,+,+,+,+,+,++                                         ! ! ! ! !"!"#"#"#"##$#$#$#$#$%$%$%$%&%&%&%&'&'&'('('()())()())*))*)*)*+*+**+*+,+,++,+,+,++,+,+,+,++                                  ! ! ! !! ! !"!""!"!"#"##$$#$#$#$%$%$$%$%$%&%&%&'&&'&'&&' ('(('(('(('()()(())*)*)*)*))*)*+*+**+**+*+**+,+,+,+,+,+,+ ,++,++,+,+,,+,+                              ! ! ! !"!"!"!"#"#""#"##$#$#$#$%$$%%$$%&%&%&'&'&'&'('('()()())*))*)*)*)*+**+*+*+**+**+*+*+,+,+,+,+,+,+,+,+,+,+,+,+                              ! ! !"!"!"#"#"##$#$#$#$%$%%$%&%&%&'&'&'&'(''(''('('()(())()())*)*)**)*)*))*+*+ *+**+*++*++*+,+,++,+,+,+,+,+,+                                     !"!"!"!!"!"#"#"##"##$#$%$%$%&%%&&%%&%&%&%&'&'&'('('('('(('()())*)*)*)*)*))*+*+*++*+,+,+,+,+,+,++,,+,+,+                            ! ! ! !"!!"!"!"#"#"##$#$##$#$#$%$%$$%&%%&%&%&%& '&''&'&'&&'&'('('((''()(()(()()()()()*)*)*)**)*)*+**+**+*+*+,+,+,+,+,+,+,+,+                                 ! ! ! !"!"!"#"##"#"##$#$#$##$#$%$$%$%&%%&%&%&'&'&&''&'&''&'('(''('()(()(()())(())*))**)*)*))*+**+*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,                                    ! !"!!"!!"!!"#"#"##"##$#$##$#$#$%$%$$%$$%%$%&%&%&%&'&'&'&&'&'('(''('('()()())*)*)**))**)*)*+*+*+*++*+,+,+,++,+,+,++,+,+,+                          ! ! !"!"!"#""#""##""##"#"#$#$#$%$%$%& %&&%&&%&&%&'&'&'(' ('((''((''())*)*)*)*)* +*++*+*++*+*+,+,+,+,+,+,+,++,++,+,+,++,+                                     ! ! !"!"!""!""!"#""#"#"#"##$#$#$##$#$%$$%%$%$%$%&%&%&'&'&'&&'('(''('('(('('()()()(()())*))*)*)**)*)*+*+*+*+*+,++,+,+,+,+,+,+,+,+                                ! ! !! !! !"!"!"#"#"##$#$$#$%$%$%$%&%&%&&%&'&'( '('(''((''()()())*)*)*+*+* +**++*++*++*+*+,+,+,+,+,+,+,++,                             ! ! ! !"!"#"#"#""##$#$##$$#$%$%%$%&%&'&'&'('('('(''()()()())*)*)*))*)*)*+*+*+*+,+,+,+,+,+                                 ! ! !"!"!""!" #""#""##""##"#$#$#$#$%$$%$$%$%&%&%&%&'&'&'&''&'('('('()()()()*)*))*)*)*+**+*+*+*++*+,+,+,+,+,++,+,+,+,+,+                           ! ! ! !"#"##$#$#$#$%$%$%&%&'&&'&&' (''('(('('('('()()()))*)*)*+*++*++*+*+*+,+,+,+,+,+,+,+,+,+,,+,+,++                                      ! ! !! !"!"!"!"#"##"#$#$$#$#$%$%$%%$%&%&&%&%&%&'&'&'&'&'(''('()() ()(())()(())()*))*)*)**)*+*+*+*++**+,+,+,+,+,+,++,,++,+,++,++,+,+,                                 ! !! ! ! !"!!"!"#"##"##$##$%$%%$%$%&%%&%&%&'&'('()()())()())()*)**)*)*)*)*+**++**+*+*++*+*+,+,+,+,+,+,+,+,+                                  ! ! ! !!"!"!"!"!"!"#"##"##$#$#$%$%$%%$%&%&%&%&%&'& '&'&''&'&&'('('('('()()()()())*)*)*)*)*+*+*++*+*+,+,++,+,+,+,+,+,+,++,+                               ! ! ! !"!!"!"##$##$##$#$#$#$%$%$%$%$%&%&%&%%&&%&'&'&'&&'('('(''('()()(()()()())()*)*)*)*+*+*+*+,+,+,+,+,+,+                                 ! ! "!""!"!""!""!"#"##"##$#$#$#$%$ %$%%$%$%%$%%&&%&%&'&'&'&'&'&'('('()())*)**))*)*+*+*+*+*+,+,+,+,+,+,+,+,+,++,+,+                             ! ! !! ! !"!"!"!"#"#"##$#$#$%$%$%$%&%&%&&%& '&&'&&''&&'&'('('('('('()()()(())()*)*)*))*))*))*)*+*+*+*+**+,+,+,+,++,+,+,+,                            ! ! ! !"!"!"!"#"#"#$##$#$%$%&%&%&%%&%&'&'&&'&'('('('('()( )()()(())()*)*)*+**+*+**+*+*+*+,+,,+,+,++,+,+,+,+,+,+,+                           ! ! ! !"!!""!!" #"##""#""##"#$#$#$#$%$%$%$%&%&%&'&'&&'('('('(('(('()()())*)*)**)*)*)*)*+**+*+*++*+,+,+,+,+,+,+,+                               ! ! ! !"!""!!"#""#"#"###"#$##$#$%$%$%$%&%&&%&%&'&'&'&'&'('('('()()(()())*)*)*)*)*)**)*+*+*+*+*+*+,++,+,+,++,++,,++,++,++,,+,                        !! !"!"!"#""##"#"#$#$#$#$#$%$%$%&%&%&'&'&'('('('()()()*)*)*)*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+                               ! ! !"!"!"#"#"#""#$#$#$#$%$%$%$%&%&%&&%%&'&'&'('(''(''('()()()())()*)**)*)*+*+*+**+**++*+,+,+,+,+,+,+,+,+,+,+,++                      ! !! ! ! !"!"#"##$#$##$#$#$%$%$%$%&%&%&%& '&&'&''&&'&&'&'('('('()()()))()*)*)*)*)*+**+*+*+*+*+*+,+,+ ,+,+,++,++,,+,+,+,+,+,+                           ! ! !! !"!"#"#"#$#$##$#$#$%$$%$%&%&%%&'&&''&'&''&'('()())()()*)*))*))*)*+*+*+*+**+,+,+,+,++,,+,++,+,+,,+,+,+,+                     !"!"!"#"#"###$#$#$%$%$%%$%&%&%&%&&%%&'&'&'('()()())*)*)*)**)**)*)*+*+*+**+**+*+*+,+,+,+,+,+,+,+,+,++,+,+                            ! ! ! !!"!"!""!"#"#""#"#"#$#$#$#$$#$%$%$%$%$%$%$%&%&%&'&&'&'&&'('('()()()(()()*)*)*)*+**++**+,+,+,+,+,,+,+,+,+,+,+,++,                             ! !! ! !"!"!"#""#$##$#$%$%%$%%$%$%&%%&&%&%&'&'&&'&'&'('('('()()(()())*))*)*))*)*)*)*+*+*+*++*+,+,++,,++,,+,+,+,+,+,+,+,                            ! ! !! !"!""!!"!"#"#"#"#$#$#$#$%$$%%$%$%&%%&%&%&&%&'&''&'('('('()()()()()) *))**))*)*))*)*+*+*+*+*+*+,+,+,+,+,+,+,+,+,+,,+,+,+                       ! ! ! ! !"!"#"##"##"#$#$#$#$ %$$%$%$%%$%&%&&%&'&'&' ('(''('(''()()()() *))*))**))*)**)*)*+**+**+*+*+*+*+,+,+,+,+,+,+,+,++,+,+                                 ! ! ! !"!"!"!"#"##"#"#"#$#$#$#$$#$%$%$%&%&&'&'&'&'('('()()())()*)*)*)*+*+ *++*++*+**+*+,+,+,+,+,++,+,+,+,+,+,+,++                          ! ! !"!"!"#"#"#""#"##"#$#$#$#$#$$#$%$$%$%&%&%&%&'&'(''('('('()(()(()())*)*)**)*)*+*+*+**+**+*+,+,+,+,+,+,+,+,+,++,++,,++,++,+                           ! ! ! !"!"!"!!""!"#"#"##"#$#$##$#$%$%$%$%%$%&%&%&'&'&'&'&'(''(('('()(()()())()*)*)*)*+*+*+*+,+,+,+,+,+,+,++,+,++,+,+,+,                         ! !"!"!"!!"!"#"#"#$#$##$%&%&%&%&%&'&'&'&'&'&'('(''('('()()(()))()*)*)*)*+*+*+*+**+*+,+,+,+,+,+,+,+,+,+,+,                        ! ! !! !"!"!"!"#"##"#"#$#$#$#$%$%$%$%&%&%&'&'&&'&'&&'('(('('('( )(()(()()))*)*)**)*)*+**+**+*+**+*+*+,++,,+,+,+,+,+,+,+,+,+,+,+,++                              ! !! !"!!""!"!"#"##"#$#$#$#$%$%$%&%&'&'&'&'('(''('(('('()(()(()()*))*)*)*)*+*+*+*+*+,+,+,,+,+,+,+,+,+,++,,+                                ! ! !"!"#"##"# $##$##$#$##$$#$%$%&%&%&%&'&'&'('('(''()()()()()()*)*)*+*+*+*+,++,,+,+,+,+,+,+,+,,+,+,+                              ! ! !"!""!""#"#$#$%$%$%$%&%&%&%&'&'&'&'('(''('(''()()()()())()()()*)*)**)*)*+*+*+*+,+,+,+,++,++,,+,+,+,+,+,+,                       ! !"!""!"#""##"#"#$#$#$#$%$%$%$%$$%$%&%&%&%&'&'&'&'('('()()()(()()*)*)*)*)*+*+*+,+,+,+,+,+,                      ! !! !"!"#"##"#"#$##$#$%$$%$$%&%%&%&%&'&&'&'&'&'('('((''()()())()*)*)*)*+**+*+*+*+*+,+,+,+,+,+,+,+,+                               ! ! ! !! !! !"!"!!"!"#""#"#$##$#$$#$%$%$%&%&%&%&&%&%& '&'&'&''&'&&'('('('(('('()()(()(()(()*)*+**+*+*+*+,+,+,++,+,++,++,+,+                             ! ! ! !"!"#"#"#"#$#$#$%$$%$%$$%%$%&%&%&&%&'&'&''&'('(('('('('()()()()()*)*)*)*+**+**+*+*+*+*+,+,+,+,,++,+,+,+,++,++,+,+,+                         ! !! ! !"!"#"##"#$#$#$%$$%$$%$%$%&%&'&'&'&'('('('()()(()()(()()*)*)*))*)*+**+*+*++*++**+*+,+,+,+,+,++,+,+,+                     ! !! ! !"!!"!!"##"#$#$#$%$%$%$%$%&%&%&%&%&%&'&&''&'(''()( )(()()(()))()*))*)*)*)*)*)*+*+*+*+*+,+,+,+,+,+,+                          ! !! ! !"!"#"##"#$#$#$%$%$%&%&%&%&'&&'&'(''(('()()())()()*))*)*)*+*+*+*+*+*+*+*+,+,+,+ ,+,,+,,+,++,+,+,++,+,++                       ! ! !"!"!"!!"!"#"##"#"#"##"#$##$#$#$%$%$%&%&&%&%&'&'&'&'('('(''(('('()(()(()()()*)*)*)*+*+**+**+*+,++,+,+,+,+,+,+,+                         ! ! !! !"!"!"#"#"#"#$#$#$#$%$%$$%$%&%&%%&'&'&'&'&'('('(('(('()()())())(()()*)*))*))*)**))*+*+**+*+*+*+*+,+,+,++,+,+,+,+,+                        ! !"!"#"##"#"#$#$##$#$#$%$%$$%$%&%&%%&%&'&'&'&'('((''(''('('()()()())()()*)*)*)*)*)* +*+**+**+*++*+*+*+,+,+,+ ,++,++,+,+,,+,+,++                         ! ! !"!"#"#"#$#$#$%$%&%&'&&''&'&'('('(('()()()(())()()*) *))*)**))*)*+*+*+*+,+,+,+,+,+,+,+,+,+                       ! ! ! !"!"!"#"#""##""#"#$#$$#$%$%%$$%$%&%&%&%&'&'&''&'('()()())()()*)*)*)*+*+*+*+*+,+,+,+,+,+,+,+,                         ! ! "!!"!!"!""!""#$#$%$$%%$$%&%&%&%&'&'&&'&'('('(''(('()(()()())()*)*)*)*+*+*+*+*+,+,+,++,,+,+,+,+,+                    ! !"!""#"#"#$#$$##$%$%$%&%&&%&%& '&''&'&&'&''&'('(''(''()()()())()()*)*))**)*)*)**)*)* +*+*+**+*+*+*+,+,+,+,+,+,++,++                         ! ! !"!"!""#"#""#"#$#$#$##$%$$%$%$% &%&%&%%&&%&%&'&&'&'('('('(('()()(())(()()()*)*)*)*))*+**+*+*+*+*++*+,+,+,+,+,+,+,+,+,+,+,+                      ! ! !"!!"!"!!"#"#""#"#"#$#$##$$#$$#$%$%$%$%&%&%&&%&&%%& '&&'&'&&''&&'('('()(())()()*)*)*)*)*)*+*+*+**+*++*+*++*+,+,++,+,+,++,+,+,+,+,,+                         ! ! ! !! !"!""##""##"#$#$%$%%$%&%&%&%&'&'&'&'('('()()())()()()*))*)*)*)*)*+*+*+*+**+*+,+,+,+,++,++,+,+,++,++,+,+                   ! ! ! !"!"!"!"#"#"#""#"#$#$##$#$%$%$%&%&%&'&'&'('(''((''()()(()()*)*)*)*+*+*+*+*+*+,+,+,+,+,+,+,+                         ! ! !! ! !"!"!"##"##"#"#$#$#$#$%$%$%$%&%&&%&'&&'&'&&'&'&'('(''('('('()(())()()()()*)*)*)*)*+*+*+*+,+,+,+,+,+,++,,+                      ! ! !"!"!"#""#"#""##"#$#$$#$ %$$%$$%$$%$$%&%&%%&&%&&%&'&'&&'&'&'('('('()())()(() *))**)**)*)*+*++**+*+,+,+,+,+                             ! ! ! !"!"!"#"#"#"#"#$##$##$##$#$%$%$%&%&&%&%&'&'&''&'&'('('((''('()()()())()(())()()*) *)*)*)*))*)*)*+*+*+*++*+*+*+,+,++,+,+,+,+,+,++                   ! ! !! !"!"!"!"#"#"#"#"#$#$#$%$%$%&%&%%&%& '&''&'&''&'('('(''('()()()())()()*)*)*)*)*)*+*+*+**++*+*+*+,+,+,+,+,+,+,,+,+,+,                      !"!"!"!!""##"#"#$#$#$#$$##$%$%$%$%&%&'&'&'&'('()()()*) *))*))*)**)*+* +**+*+**+*+*+,+,+,+,++,,++,+,++,++,+,+,+                          ! !! !"##""#$##$#$%$$%$$%$%$%&%&&%&'&'(''('(('('()(()*) *)**)*)**)**)*)*+*+*+**++**+*+,+,+,+,+,+,+                             !! !! !"!!"!"!!"#""#"#"#$#$#$$#$%$%$$%$%%$%&%&%&'&'&'&' (''('(('(('('()()(()()()*)*))*)*))*)**)*+*+*+*+*+,+,+,+,+,+,++,+,++,++                         ! ! ! !"!"!"!"#""#""#""#$#$#$#$%$%$%&%&%&%&'&'&''&'('('('('(('()()()()()*)*)*)*))*)*+*+**+*+**+*+,+,+,+,+,+,+                          ! !"!""#"#$#$#$$#$%$%$$% &%&%%&&%&%&&%%&'&'&'('('()())()()())(()*)*)*)*))*)**+*+*+*++**+*+,+,+,+,+,+,++,+,+,+                         ! ! !"!"!""#""#"#$#$#$#$$%$%$%$%&%&%&%&%&'&'&'&'&'('(''('(('()()()()()*))*)*)*)*)*+**+*+*++*+,+,++,+,+,+,+                          ! ! "!"!!"!"!!"!""#""#"#$#$%$%$%$$%&%&%%&%&%&'&'&'&'(''('(('()()()()()*)*)*)*)*+*+*+*+,+,++,+,+,+,+,+,+,++,+,+                      ! ! !"!"!""#"#"#$#$#$%$%$%&%&%%&%&'&'('('()())(()(()()*)**)*)*+*+*++*++**+,+,+,+,+,+                          ! ! !"!"!"!""#"#"#"#$#$#$%$%$% $%&%%&%&%&%&%&'&'&&'(''('('('('()()()(()*)*)**)**)*+*+*+*+,+,++,++,,++,++,++,,+,+,                      ! ! ! ! !"!"!""!""#"#"#$#$##$#$%$%$$%%$$%&%&%&%&&'&'&'('(''('('()(()(()(()()*)**))*))*+*++*+*+*+**+*+,+,+,+,+,+,+,+,+,+,++,,                          ! ! !"!"!"!""#"#"#"#$#$#$#$%$$%$%$%$%$%&%%&%%&%&'&'&'&'('('()()()()(()*)**)*)**)*)*)*)*)*+*++*+*+,+,+,+,+,+,+,+,+,+,+,+,                     ! !"!"!"!"#"#""#"#"#$#$#$#$%$%$%$%&%&%&%&'&'&'(''('('('()()()*)*)*) *)**)**))*)*+*+**+*+*+**+*+*+*+ ,+,++,++,,+,+,+,+,+,+,++                       ! !"!"!!"!""##"#""#"#$#$%$%$%&%&'&'&'&'&'('()()()(()()*)*))*)*)*)* +**+**++*+*++*+*++*+,++,,+,++,+,+,,+,+,+,+,++,+                        ! ! ! !"!""#"#$#$#$$#$%$%$%%$%&%&%%&'&'&&'&&'('('('('('()(()()()*))**)*)*)*+*+*+*+*+*+*+,+,+,+,+,+,++,+,+,++                        ! ! ! !! !"#"#"#"#"#$#$#$#$%$%%$$%$%&%&%&&%&%&'&'&'&''&'('('('()((()()()()*)*)*+*+*+*+*+*+*+*+,+,,+,+,+,+,+,+,++,++,+,                     ! !"!""#"#$##$#$$#$$#$%$%&%&%&'&''&&'&'(''('('('()())()()*))*)*)*)*+*+*+*++*+*+,++,,++,,+,+,+,+,+,+,+,+                          ! ! ! !"!"!""#"#"#$#$#$%$%$%&%&%&'&'&'&&'('()()()()*)*)**)**)*)*+**+*+*+*+*+,+,+,+,+,+,,+,+,+,+                         ! !"!"!""!""#"#"#$#$#$$#$%$%&%&%&&%%&%&'&'&'&'('('()(())(()(()()()*)**)*+**+*+**+*++**+*+*+,+,+,+,+,++,+,+                        ! ! !"!""#"#""#"#"#$#$#$#$%$%$%&%%&&%&%&'&'(''(('('()(()()()()*)*)*)*+*+*+*++*+,++,+,+,+,+,+,+,+                      ! ! ! !"!"!"!"!""!"#"#"#"#$#$##$#$%$%$%&%&'&'&'&''&'('('('('()()((()()()()*)*)*)**)*+*+*+*+*+*+,+,+,+,+,++,++,,++,++,+,++,+                         ! ! !"!"!""#"#"#"#$# $##$#$#$$#$%$%$%$$%&%&%&%%&'&'&'&'('('('()()()*) *))*)*)**)*)*+**++**+*+*+**+**+,+,+,+,+,++,+,++,+,+,+,++,+,++                        ! ! ! !"!"!!"!""#"#"#""#$#$#$%$%$%$%&%&&%&%&%&'&'&'('('('('('()((()())()()*)*)*)*)*+*+*+*+*+*++*+,+,+,+,+,+,+,+,++,,+                     ! !! ! !"!"!""!"!"""#"#"#$#$#$#$%$%$%$$%&%&%&%&'&'&&' ('(''(''(('(('('()(())()()()*)*)*)*)*+*+**++*+*+**+*+,+,+,+,+,+,+,+,+,+,+,                        ! ! ! ! !"!"!!"!""#"#"#$#$#$#$#$%$%$%&%&%&%&'&&''&&'&'('('(''('('()()()()()() *))*)*))**)*)*+*+*+*+**+*+,+,+,+,+,+,++,,+,                        ! ! !"!""!""!"!"""#"#"#$##$##$$#$%$%$%$%&%&%&&%&&%%&'&'&&''&&'('(''(()()()*)*)*)*)**)*+*+*+*+*+*+*+,+,+,+,++,+,+,+,+,,                          ! ! ! !! !"!""!""#"#"#"#$#$#$% $%%$%%$%%$%&%&%&'&'&'&&'('('()()((()()()()*))*)*)*)*)*+*+*+*+**+*+,+,+,+,++,++,+,+,++,++,+,                     ! ! !"!""!"!""#""#"#$##$#$#$%$%&%&%&&%&'&'&'('(''((''())()()()*)*)*+*+*+*+*+,+,+,+,+,+,+,                           ! ! !"!"!"""#"##"#$#$#$%$%$%$%&%&'&&'&'&&'&'&'&'('(''(('('()(())((()()()()*)*)*)*)* +**++*++**+,+,+,+,+,+,++,,+                            ! ! ! ! ! !"!"!""#"#"#$##$$#$%$$%$%&%&%%&&%%&%&'&'&&'&'&'('('('()())() *))**)*))*)*+*++**+*+,+,+,+,+                            ! !! !"!""!"!""#"#"#"#$##$##$#$%$%$%&%&%&%&'&'&'&'&'&'('('((''('()()( )()(())()()*)*)*)*)*)*)*+*+*+*++*+*+,+,++,+,+,+,+,+                             ! ! ! ! !"!"!"!"!"#"#"#"#"#$#$#$%$%$%&%&%%&%&'&'&''&'('('('()()((())())()()*)*)*)*)*)*+*+**++*+**+*+,+,+,+,+,+,+,,+,+,+                        ! !"!"!!"!"!"!""#"##"#"#$#$#$$#$%$% $%%$%$%%$$%&%&'&'&'&'('(()()()()*) *))*))*)**)*+*+**+*+**+*++*+*+*+,+,+,+,++,,++,+,++,++,+,+,+                         ! ! ! !"!"!!"!"!""!""#""#$#$#$%$$%%$$%$%&%&%&'&'('(('('('()(() *)**)*)**)**)*)*+*+*+**++**+*+,+,+,+,+,+                      ! ! !"!"!"!""#"#"#$#$#$$#$ %$$%%$$%%$%&%&%&%&'&'&' (''('(('(('('()(()()()*)*))*)*))*)**)*+*+*+*+*+,+,+,+,+,+,++,+,++                        ! ! !"!!"!"!"!"#"#"#"#"#$#$#$#$#$#$%$%$%%$%&%%&&%&%&'&'&''&'('('('('()(()()()*)*)*)*))*)*+*+**+*+**+*+,+,+,+,+,++                      ! ! !"!"!"!"!"!""#"#"#$#$#$$#$%$%$$%$%&%&%&%&&%%&'&'&'&'('('()( )(()()())(()*)*))*)*))*)*+*+*++**+*+,+,+,+,+,+,++,+,+,+                      ! ! !"!"!!"!""!""#"#"#$#$#$%$%$%%$%&%&&%%&%&%&'&'&'&'&'('(''('(('()(()(())()()*)*)*)**)*)*+**+*+*++*+*+,+,++,+,+,+,+                           ! !"!"!"!!""#""#"#$#$%$%$%$%$$%&%%&%&%&'&'&'&'(''('(('('(()()(()()*)*)*)*)*+*+*+*+,+,++,+,+,+,+,+,+,++,+,                     ! !"!"!"#"#"#$#$#$#$%$%$%&%&%%&%&'&'('()(())()(()())()*)**)*)*+*+*++*++**+,+,+,+,+,+                      ! ! ! !"!"!"!"#""#"#$#$#$#$#$%$%$%&%&%&%&'&'&&'('('('('()()(()()(()()*)*)**)**)*+*+*+*+,+,++,++,,++,++,++,,+,+                          ! ! !"!"!""#"#"#"#$##$#$#$%$%$%&%&%&%&'&'&'(''('('()(()(()(()()*)**))*))*+**+*+*+*+**+*+,+,+,+,+,+,+,+,+,+,+                          ! !! ! "!!""!"!"!"!"#"#"#"#$#$#$#$ %$$%$%$%$%$%$%&%%&%%&%&'&'&'&'('('()()(()()(()*)**)*)*) *)*)*)*)*)*+*+*+*+,+,+,+,+,+,+,+,+,+,+                     ! ! ! !"!"!""#"#""#"#"#$#$#$#$%$%$%$%&%%&%&%&'&'&'&'(''('('('()()()*)*)*) *)**)**))*)*+*+**+*+*+**+*+*+*+ ,+,++,++,,+,+,+,+,+,+                       ! !"!"!!"!""#"#""#"#"#$#$%$%$$%&%&'&'&'&'&'('()())()(()()*)*))*)*)*)* +**+**++*+*++*+*++*+,++,,+,++,+,+,,+,+,+,+,+                        ! ! ! ! !"!"!""#"#$#$#$$#$%$%$%%$%&%&%%&'&&'&&'('('('('())()()()*))**)*)*)*)*+*+*+*+*+*+*+,+,+,+,+,+,++,+,+                       ! !! ! !""#"#"#"#$#$#$#$%$%$%&%&%&%%&%&'&'&'&'('('('()()()()()*)*)*+*+*+*+*+*+*+*+,+,+,+,+,+,+,++,++,,                          ! !! !! ! !"!"!"!""#"#""#"#$#$#$$#$$#$%$%$%&%&%&%&'&&'&&'&'('('('()()()()*))*)*)*)*+*+*+*++*+*+,++,,++,,+,+,+,+,+,+,+,+                         ! ! !"!"!""#"#"#"#$#$#$%$%$%&%&%&'&'&'&&'('(())(()()*)*)**)**)*)*+**+*+*+*+*+,+,+,+,+,+,,+,+,+,                         ! !! !! !"!""!""#"#"#"#$#$#$$#$%$%&%&%%&%&%&&%%&%&'&'&'&'('('()(()()(()()()*)**)*+**+*+**+*++**+*+*+,+,+,+,+,++,+,+                          ! !! !"!"!""#"#""#"#"#$#$#$#$%$%$%&%%&&%&%&'&'(''(('('()(()()()()*)*)*)*+*+*+*++*+,++,+,+,+,+,+,+,+                  ! !! ! !"!"!"!"!""#"#"#$##$#$%$%$%&%&'&'&'&''&'('('('('()()()()()()*)*)*)**)*+*+*+*+*+*+,+,+,+,+,++,++,,++,++,+,+                               ! ! !"!""#"#"#""#$# $##$#$#$$#$%$%$%$$%&%&%&'&'&'&'('('('(()()()*) *))*)*)**)*)*+**++**+*+*+**+**+,+,+,+,+,++,+,++,+,+,+,++,+                       ! ! !"!"!""#"#"#""#$#$%$%$%$%&%&&%&%&%&'&'&'('('('('('()()())()()*)*)*)*)*+*+*+*+*+*++*+,+,+,+,+,+,+,+,++,,                         ! !! ! !"!"""!"#"#"#$#$#$#$%$%$$%&%&%&'&'&&' (''(''(('(('('()(())()(()()*)*)*)*)*+* +**++*+**++**+*+,+,+,+,+,+,+,+,+,+                      ! ! !"!"!"!"!""#"#"#$#$#$#$%$%$%&%&%&%&'&&''&&'&'('('(''('('()(()()()()() *))*)*))**)*)*+*+*+*+**+*+,+,+,+,+,+,++,,+                       ! ! ! ! !"!"!"" #""#""#"##"#$##$$#$%$%$%&%%&%&&%%&'&'&&'&'(''('('('()(()()())(())()*)*)*)*)*+*++*+*+,+,+,+,+,+,+,,+,+,+,                       ! ! ! ! !! !""#"#"#"#$#$#$%$$%$$%$%&%%&%&%&%&'&'('('(('((''('(()()*)*))*))**)*+*++*+*+*+*+,++,++,,+,+,+,+,+,+,+,                        ! ! !"!"!"!""!""#"##"#$#$#$#$%$%%$%$%&%&%&%&%&'&'&&''&'&'('('(''(('()(()()()*)*)*)*)*)*+*+*++**+*+,+,+,+,+,+,                            ! ! !"!"!""!""!"#"#""#"#$#$##$##$%$%$%$%&%&%&'&'&'&'( '('('(('('('()(()()()()()()*)*)*))*+*+*+*+*+*+*+*+*+,+,+,+,+,+                   ! ! ! ! ! !""#"##"#$##$##$#$#$%$%$%$%$%%&%&%&'&'&'&&'(''('()()()(()()()*)*))*)*)*)*+**++**+*+*+,++,+,++,++,+,+                      ! ! ! !"!"!"!"#"#"#$#$##$#$$#$%$%$$%$%&%&%&'&'&''&'&'('(()()()*)*)*)*)*)*+**+*+*+*+*+*+*+,++,++,+,+,+,++,++,+,+,+,,++                   ! ! ! !"!"!""#"#$#$#$##$%$%$%&%&%&'&'('(('('(('(()()()()*)*)*)**)**))*+*+*+*+,+,+,++,+,+,+,+                   ! ! "!"!"!"#"#"##""#$#$#$#$%$%$%&%%&%%&%&'&'&''&&'&'('('('(('()()()()()*)*)*)*)*)*+*+*+*+*+,+,+,+,+,+                      ! ! ! !"!"!"#""#"#$#$#$%$%$%&%&%&'&'&'&'('('()()()()()()*)*)*)*)*+*+*+**+*+ ,+,,+,,+,++,+,+,++,+,+,                       ! ! ! !"!"!"#"#"#""#"#$##$$#$%$%%$%$%&%&%%&'&'&'&'('('('('()(( )(()()())()()*)*)*)*+*+**++*+**+*+,+,+,+,+,+,+,+,+                      ! !! ! ! !"!!"!!"!""#"#$#$#$#$#$ %$$%$%%$%$%$%&%&%%&%&%&'&'&''&'&'('(''('(()()()()()*))*)*+*+*+*+,+,++,+,+,+,+,+,+                           ! ! !"!""#"#"#""#"#$#$#$%$%$%$%&%&%&'&'&'&'('(()()(()()*)*))*))*)*)*+*+*+*++*+*+,+ ,++,++,+,+,,+,+,+                       ! ! ! !"!"!"#"#""#"#"# $#$$#$$##$##$%$%$%&%&&%&%& '&&'&&'&''&''&'('('(''(('())()()()()()*))*)*)*))*))*+*+**+*+*+*+*+,+,+,+,+,+,+,+,+,+                            ! ! ! !"!""#"#$#$%$%$%$%&%&%&'&'&&''&'('('()()()()()()*)*)*)**)**)*+*+*+*+,+,+,+,+,+,+,+                        !"!"!!"""#"#"#$#$#$%$%$$%%$%&%&%&&%&&%&'&&'&'&&'('('('())())()()(()*)*)**)*+*+*+*+*+*++*+,+,++,,+,+,+,+,+                              ! ! ! !"!"!"!"#"##"#$#$%$%$%$%&%&%%&&%&&%&'&'&'&' ('((''(('('(('())(()()())()()*)*))*)*+*+*+*+*+,+,+,+,++,+                           ! ! !"!!""!""!"#"#$##$##$ %$$%$$%$%$%&%&%&'&'&'&'(''(('((''('('(''())()()(()()*))*)*)*+*+*+*+*+,+,+,+,+,+,+,+,+                        ! ! !! !"!""#"#"#$#$$#$%$%$%$%$%&%&%&'&'&'&'('('('('()()()()()*)*))*)*)**)*+**+*+*+,+,++,+,+,+,+,,+                      ! ! !"!"!""#"#"##"#$#$#$#$%$%%$%$% &%%&%&%%&%&%&'&&'&&''&'&'('('('(())()()()*)*)*+,+,++,++,+,+,++,++,+,+                    ! ! ! ! ! ! "!!"!!""!""!!"#"#""#$##$$#$%$%$%&%&%&'&'&''&'&'('('()(()()()()()*)*)*))*)*)*+*+*+*+*+*+*+,+,+,+,+,+,+,+                    ! !"!!"!""!"#"#$##$##$#$#$%$%$%&%&%&%&'&'('('('()()()())(()*)*)*))*)*)*+*+**+*+*+**+*+*+,+,+,+,+,+,++,,+,                       ! ! ! "!!""!""!"!!"!"#"#"#$#$$#$$#$$#$$##$%$%$%&%&%&'&'&'('('('(('('()()()(()()()*)*+*+*++*+*+,+,+,+,+,+                       ! ! !"!!"!"!""#"#"#$#$%$%$%$%%$%%$$%&%&'&'&''&&'(''(('('('(()()()()*))*)*)*+**++*+*+*++*+*+*+,+,+,+,+,++,,++                    ! ! ! ! !"!""#"#""#"#$##$##$$#$%$%$%$%&%&%&'&'('('('(()()()*)**)**)*+*+*+,+,+,+,+,,+,+,+,+,,+                        ! !"!"!"!"#"#"#"##"##$$##$##$$#$#$$#$%$%&%&%%&%&'&&'&'&''&' ('(''(''('('(()(()()())()*))*)*)*)*)*+*+*+**+*+,+,++,,++,+,++,++,+,+,+,+                    ! !"!"!"!"#"#"#""#""#$##$#$%$%$%&%&%&%&'&'('('('()())()()()*)**))*)*+*+*+*+*+,++,,+,+,+,+,+                        ! ! ! !! !"!""#"#"#"#$#$#$#$%$%$%$%&%&'&'&'&'(''((''())()()()()() *)**))*)**)*)*)*+*+**+*+*+*+,+,+,+,+,++,+,++,++,+                       ! !"!"!!!"#$#$$#$#$#$%$%$%$%&%&%%&%&'&'&''&'('('('('('(()()*)*)*)*+*+**+*+*+*+**+,+,+,+,+,+                       ! ! !"!"!""!"#"#$#$#$#$#$$%$%$%$%$%&%&&%&'&&''&'('('(()())(()*) *)*)**))*)*+* +*++**+*++*+,+,+,+,+,++,+,+,+                  ! !! !"!"!"#"#"#$#$#$#$#$%$%$%$%%$%&%&%& '&'&''&''&'('('('()()()(()(()(()()*)*)*)*)*+*+*+*+,+,+,                          ! ! !"!""#"#"#""#"#"# $##$##$#$##$%$%$%$%$%&%&%&'&'&'&'&'(' ('('(''(('())()()*))*)*)*)*)*+*++*+*+*+,+,+,+,+,+,+,++,+,+,++                   ! ! ! ! !"!!"!"!"#""#"#$#$##$#$%$%$%&%%&'&&''&'&&'('('('(()()())()()()*)*)*)*)*+*+*+*+,+,+,+,+                       ! ! !"!"!"!""!"#"#"##"#$#$#$#$%$%$%&%&%&%&'&'&''&'('('(()()()())()*)*)*)*+*+*+**+*+*+,++,++,,++,++,++,,+,+,+,+,                    ! !"!"!""!"#"#""#"#$#$##$#$%$%$$%&%&%&%&'&'&'&'('('()()()()*)*)*)**)*+*+**+*+*+*+*+*+,+,+,+,+,+,+,++,+,+                         ! ! ! ! "!!""!"!""!"#"#$#$#$%$%$%&%&'&''&&'('('('(('(()())()()*)*)*)*))*)*+*+*+,+,+,+,+,+,+,+,+,,+,+                          ! ! !"!"#$#$%$%%$%&%&%&%%&'&'&'&'('('('()()() *))**))*)*)*)*)*)*+*+*+*+**+*+*+*+*+*+,+,+,+,+,+,+,+,+                        ! ! !"!!"!""!"#"#"#"#$#$%$%$%$%&%&%&'&'('((''('()((()(()(()*)*)*)*)*)*+*+*+**+*+,+,+,++,+,+,,+,+,+,+,++,+,++,                         ! !""!" #"#""#""#"# $#$$#$$#$#$%$%$%&%%&&%%&'&'&'&'('('()()()())()*))*)*)*)*))*))*+*+*+ *+*+**+*+*+*+,+,+,+,++,+,+,+,                        ! !"!""!"!!"#"#"#$%$%&%&%%&&%&%&'&'&'('('(''('()()()()*)*)*)*)*+**+*+*+*+*+,+,+,+,+,++,++,+,+                             ! ! ! !""!""#"#"#$##$#$#$$#$#$%$%$$%$%%$%& %&%%&%&&%&%&&%&'&'&'('('(()(()()(()()*)*)*+*+*+*+*+*+,+,+,+,+,+,+,+,+                ! !"!"!"!"!"#""#""#"#$#$#$#$%$%$%$%$%&%%&%&'&'&'('('('(()()()()*)*)*)*+*+*+*+*+*+,+,+,+,,+,+,+,+                    ! !"!"!!" #""##"##"#"#$#$##$$#$#$#$%$$%%$%$%$%&%&%%&%&'&&'&'&&'(''(('('()(()(())(()()*)*)*))**)*)*+*+*+*+*+*+*+,+,+,+,++,+,+,                      ! ! ! !"!"""!"#"#$#$#$#$%$%$%&%&%&%&'&'&'&'('(()()()*)*)*+*+**+**+*+*+,+,+,+,+,+,+,+                        ! ! !""!"#"#"#$#$#$#$%$%%$$%$%$%&%&%&'&&'&'&'&'&'(''(''('(()()()())()*)*))**)*)*)*+*+*+*+*+,+,+,+,++,++,,++,++,+,++,+,+                     ! ! !"!!"!"!"#"#"#"#$#$#$%$%$%$%&%&'&&''&'&'(''('('(()()()*)*+*+*+**+*+*+*+,+,+,+,++,+,++,+,+,+,++,+,+,                     ! ! ! !!"!"!""#"#"#"#"#"#$#$#$%$$%%$%&%&'&&'&''&&'('(''('(())(()()()*)*)*)*))*)*+*++*+**+*+**+*+*+*+,+,++,+,+,+,+,+,++,,+,+                        ! ! ! ! ! !"!!"!"#"#"#$%$%$%$%$%&%&%&%&'&&''&'&&'&'(''(''('()()()())()()*)*))*))*)**)*)*+**+*+,+,+,+,+,+,+,+,+,+,+,+,                       ! !"!"!""#""#"#"#$#$$##$#$%$%$%&%%&%&&%&'&''&'&'(''(''('(()()()(()()()*)*)*)*)*)**)*+*+*+*+*+,+,+,+,++,,+,+,,+                          ! ! !! !"!"!!""!"!"#"#$#$#$#$#$%$%$%&%%&%&'&'&'&&'('('('('('(()()()*)*)*)*+*+*+*++**+,+,+,+,+,,+,+,+,++,++,+                       ! ! ! !"!"!""#"#"#$#$#$$##$%$%$%$%&%&%&&%&'&&'&&'&'&&'('('('('('('(()(()())()())()*))*)*)*)*)*)*+**++*++*+**+*+*+*+,+,+,+,+,+,+,+,+,+                    ! ! !"!"!"!!"!"#"#"#$#$%$%$%$%&%&%&%&'&'&'('(()()()()() *)*)*))*)*)*)*+*+*+*+*+*+,+,+,+,+,+,+                   ! ! ! !"!""#""#""#"#"#$#$#$%$%%$$%&%&%%&&%&'&'&&'&&'('('(('(())()()*)*))*)*)*)*+*+*+*+*+*+,+,+,+                     ! !! ! !"!"!""#"#""#$##$#$##$%$%$% &%&%&&%&%%&'&'&''&'&'('(''(''(''()()()()()*)*)*)*+*+*+*+*++**+,++,++,+,+                       ! ! !"!""#"#$##$#$#$ %$%%$%%$%$%&%&%&&%&%&'&'&'&'('('('()(()()()())*)*)*)*)*)*)*)* +*+*+**+**+*+,+,++,++,+,+,+,,+,+,+,+                           ! ! ! !"!""#"#""#$#$$#$#$%$%$%%$%&%&%&%&'&'&'&'('(''('(''('()(()()()()()()*)*)*))*+*++**+*+*++*+,++,+,+,+,+                    ! ! !"!""!"#"#$#$#$##$#$%$%$%$%&%%&&%&'&&'('(''('(''(()())()()*)*)*)*+*+*+*++**+*+,+,+,+,+                         ! ! ! !"!"!"#"#"#"#$##$#$#$#$%$%%$%%$$%&%%&%&'&&''&'('('()(()())()*)*)*)**)*+*+**++*++*+*+,+,,+,++,+,+,++,+,+,++,++,+                      ! ! ! !"!""!""!""!"#""##"#"#$#$#$%$%$%%$%&%&%&%&'&'&&''&'('(''('(''('()(()()()()*)*)*)*+ *+**++*+**+*+,+,+,+,+,+,+,+                     ! ! ! !"!"!"!"!"#""#"##"#$#$#$%$%$%&%&%&%&%&'&'&''&''&'('('(('(('('(()()()(()()())(()*)*)*+*+*+**+*+*+*+,+,+,+,+,+,+                       ! ! !"!"!""!"#"#"#"#$#$#$%$$%$%%$%&%&%&%&'&''&&'&&'&'&'(''('('('(()(()())()()*)*)*))*)**)* +**+*+*+*+*+*++*+,+ ,++,++,+,+,,+,+,+                       ! ! !! ! !"!""!""#"#"#"#$#$%$%&%%&&%&%&'&'&''&'('('(''(('()((()()()())()*)*)*)*)*)*+*+*+*+*+*+,+,+,+,+,+,+,+,++,++,++                       ! !"!!"!"!!"#""#"##"#$#$#$#$%$%$%&%&%&&%&'&'('('(()()*)**)*)*)*)*+*+*+*+*+*+,+,+,+,+,+,+,+                           ! ! ! !"!!"#"#"##"#"#$#$#$#$#$%$%$%&%%&%%&%&'&'&'&'&'(''('('((''()()()()*)*) *)*))**)*))*+*+*+*+,+,+,+,+,+,+                           ! ! !"!"!"!"#"#"#$#$#$#$ %$%%$%$%$$% &%&&%&%%&%&'&'&'&&'(''('('('(()()()()*)*)*)*)* +*+*++*+*+*+*+*+,+,+,+,++,+,+,++                ! ! !"!"!"!"#""#""#$##$#$#$%$%$$%%$%$%&%%&&%&%&'&'&'&''&'('('(''((''( )(()())()()())()*))**)*))*))**)*+*+*+**+*+,+,+,+,+,+,+,+,+,++                      ! !"!"!"!"#""##""#$#$#$#$%$%$%%$%%$$% &%%&%&%%&&%%&'&'&'('('(''(()()()()()*)**))*+*+*+*++*+,+,+,+,+,,+,+,                           !"!"!"#"#"#$ #$$#$$#$$#$%$%$%&%&%&%&'&'&'('(''('('('()()()()())()*)*)*)*)* +*+*+*+*++**+*++*+,++,++,+,+,++,++,+,+                    !"!"!"!"#"#"#$#$%$%$%&%&%&'&'&&''&&'('('('()((()()()*)*)*)*)*+*+*+*+,+,+,+,+,+,+,+                      ! ! ! ! !!"!"!""#"#"#$#$#$%$%$%&%%&%&&%&%&%&'&'&''&'&'&'('(''(('('('()(()()()*)*)*)*+*+*+**+*++*+,+,+,+,++,,+,+,+                   ! ! !"!"!""#"#"#$##$#$%$%$$%%$%%$%&%&%%&%&%&'&'&'(''('('('()()()()()*)*)*)*+*+*+*+*+,+,+,+,+                         ! ! !"!""#""#""#"#$#$#$%$%%$%$%&%&%&&%&%&'&''&'&'('('('('(()()()()*)*)**)*+*+*+*+*+*+*+*+,+,+,+,+,++,,+,+,,++                        ! ! !! !"!"!!"!!""!"#"#"#$#$%$%$$%$%&%&&%&%&'&'&'&&'&'('((''(('(()()()() *)**))**)*)*))*)*+*+*+,+,+,+,,+,+,+,+,,+,+                          ! ! "!!"!"!"!""#"##"#$#$#$$#$#$$#$%$%&%&%&%&'&'&'&' (''(''('('('()()()(()(()*)**))*+*+*+*+*+*+,+,+,++,++,+,+,+,+,+                    ! !"!!"!"#"#"#$##$$##$#$%$%%$%&%& '&''&''&'&'&'('('('(()()(())()()*)*))**))*+*+*+*+*++*+,+,+,+,+,+,+,+                       ! ! !"!""#"#"##"# $##$$##$$#$%$%$%&%&%&'&''&&'&'('('(''(()()(()()*)*)*))*+*+*+*+*+,+,+,+,++,+,++,++,+,+,,+                         ! "!""!""!"!!"!"#"#"#"#"#"#$#$#$$#$%$%$%&%%&%&'&'&'&'(''('('('('(()()()())()*)*+*+**+*+*+,+,+,+,+,+,+                  ! !! ! !"!""!"#"#"##"#$#$##$%$%$$%%$%$%&%%&%&'&'&'('('('('()(()(())(()*)*)*)*+*++**+*++*+*+,+,+,++,+,+,+,                        ! ! ! !"!"!"#"#"##$#$#$#$%$%$%$%&%&%&%&'&'&'&'('()()(()()()()*)*)*)*+*+*++**++**++*+*+,+,+,+,++                     ! !"!"!""#$#$#$##$%$%$%$%&%&%&%&'& '&'&'&'&&'&'(''(('((''('(('()()()())()*)*))*)*)*)**+*+*+*+*+,+,+,+,+,++,+,+ ,++,,+,,++                        ! "!!"!!"!"!""#"#"#$#$#$%$%$%%$%&%&'&'&'('()()(()()()*)*)*)*)**)*+*+*+*+,+,+,+,                    ! ! !"!"!""!!"#"#"#$##$#$#$%$$%$%$%$%&%&%&&%%&'&''&'(''('('(''()()(())()*)*)*)*)*+**++**++*+,++,++,,++,++,++,,+,+,+,+,+,+                      ! !"!!"#"#""#"#$#$##$$##$%$%&%&%&'&'&'&&'('(('()()(()()(()()()*)*)*)*+*+*+,+,+,+,+,+,+,++,+,+,+                       ! ! !"!"!"!""!"#"#"#"#$##$#$#$#$%$%$$%%$%&%&%&%&'&'&&'&'&'&'('('('(()()()*))*))**)*+*+*++*+*+*+,+,+,+,+,+,+,+,+,,+,++,+,++,                         ! !"!"!"#"#"#"##"#$#$#$#$#$%$%$%&%&%&%&'&'&&'&''&'(()())(()()*)*)*)*)*+**+*+*+*+*+**+,+,+,+,+,+,+,+                        ! ! ! !! !"!"!"!"#"#$#$#$%$%&%&%&'&'&'&'(''('((''('(()(()(()()*)*))*+*+*+*+*+,++,+,+,,+,+,+,+ ,++,+,++,,+,+                     ! ! !"!""!"!"#"#"#$#$#$$#$%$$%$%&% &%&%&%%&%%&'&'&'&'&'(''((''('('()((()()()()*)*)*))*))*)*+*+*+*+*+*++*+,+,+,++,+,+,+,+                        ! !! !"!"!""!"#"#"#"#$#$$##$#$%$%$%$%&%&%&%&%&'&'&'&'('('('('()()()(())()()()*))**))*+*+*+*+*+,+,+,+,++,++,+,+,++,+                           ! ! !"!"!""#""#"##"##"#$#$#$#$ %$%$$%$$%$%&%&%&&%%&'&''&'&'('('()()(()()()()*)*)*+*+*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+                    ! !! !"!"!"!"#"#$#$#$%$%&%&%&%&&%&'&'&&'&'('(()(()()()()*)*)*)*)*+*+*+*+*+*+,+,+,+,,+,+,+,+,                      ! ! ! ! "!!"!!""!""#""#"#"#"##"#$#$#$%$%$%&%&%&'&'&'&&'&'('('('('()()()(()*))*)*)*)*)*+*+*+*+*+*+*+,+,++,+,+,+,+                      ! !"!!"!""!"#"#"#""#"#$#$#$##$ %$%$$%%$$%$%&%&'&'&'&'('('('(('('()()()()()*)*)* )**)**)*))*+*+*+*+,+,+,+,+,+,+,+,+,                    ! ! !"!"!"!"#"#""#"#$#$%$%$%&%&%&%&'&'&'&'('('()(()()()()()*)*)*))*))*+**++*+*+,+,+,++,++,,++,++,+,++,+,+,+                           ! ! !"!"!""#"#"##"#"#$ #$#$##$$##$%$%$%$%&%&%&'&'('('('('()(()()()()*)*+*+*+**+*+,++,+,++,+,+,+,++,+,+,+                   ! ! ! !"!"!"!"!""#"#"##"#$#$#$#$%$%&%&%&%&'&'&'&'&'(''('('('())()*) *))**)*))*)*+*+**+*+*+,+,+,+,+,++,,+,+,+                       ! !! ! !"!!"!""#"#"#"#$#$#$#$#$%$%$%$%&%&&%&&%&'&'&&'&'&'('('()())(()()()*))*))*)**)*)*)*+*++*+*+*+*+,+,+,+,+,+,+,+,+,+,+,++                      ! ! !"!!"#"#"#$#$#$#$%$%$%&%&%%&%&%&'&&'&'&'&'(''('('()(()()*)*)*))*+*+*+*++*+*+,+,+,++,,+,+,,+,++,+                 ! ! ! !"!"!!""!""#"#"#""#$#$%$%$$%$%&%&%&&%&&%&'&&''&''&'('(('(('()()()*)*)*+*+ *++**+**++*+,+,+,,+,+,+,++,++,+,                       ! ! ! "!"!""!""!""#"##"#"#$##$#$%$%$%$%&%&%&%&'&&'&'&'('('('() )(()(())()())()*)*)*+**+*+*+*++*+*+,+,+,+,++,                    ! ! ! !"!""#"# $##$#$##$#$%$%$%&%&%&%&%&&%&%&'&&'('('(''(('(()(()()()*)**)*+*+*+,+,+,+,+,+,+,+,+,+                             ! ! ! !"!""#"##"#$#$#$%$%$%%$% &%%&&%&&%&&%&%&'&'&'&'&&'('('('(())()()()*)*)*)*)*+*+*+*+,+,+,+,+,+,+,++,+,+                       ! ! ! ! !"!"!"#"#"#$#$%$$%$%$%$% &%&%%&%&%%&' &'&&'&&'&'&&' ('((''('('( ()()())()()()*)*)*)*+*+*+**+*+,++,+,+,+,++,+,+,+,+                        ! !"!""#"#"#$#$##$#$%$%$%$%&%%&'&'&'('('('()(()(()()()()*)* )*))*))*)**))*+*+*+*+,+,+,++,+,+,+                           ! ! !"!"!"!!"#"##""#"#$#$#$$#$$#$%$%$%&%&%&'&'&'('('())(()())(()()*)*)*)*)*)*+*+*+* +*+*++*++**+,+,++,,+,+,++,+,++,+                      ! ! !"!!"!"!""#"#"#"#$#$$#$%$$%$$%%$$%%$%$%&'&'&&'&&'&'('('('('() )()(()()(()()*)*)*)*)*+*+*+*+*+*+*+*+,+,+,+,+,+,+,+                    ! ! ! ! ! !"!"!""#"#"#"#$%$%$%$%&%&%%&%&'&'&'&''&'('(('('('('()()()()()())()*)*)*)**)*)*+*+*+*++*++*+,+,+,+,++,+,+,++                   ! ! !"!"!""!""!"#""#"#"#$#$#$$#$$##$%$%$%&%&%&'&'&'&''&'('(''()()()()()*))*)*)*)*)*+*+*+*++*+,++,+,+,++,+,+,+,,+,+                        ! ! ! !"!"!""#"#"#$#$%$$%$%$%&%&&%%&&%&'&'&'('('('('()()(()()*)*)*)*+*+*+*+*+*+*+ ,++,++,++,+,+,+,+,++                      ! ! ! ! !"!!""!"#""#"#"#$#$#$$#$%$%$%&%&%&&%%&'&'&'('(''((''()(()()()*)*)*))*))*)*+*+**+**+*++**+,+,+,+,+,+,+,+,+,++                         !"!"!""!"#"#""#"#$#$%$%$%$%$%&%&%&'&'('(''(()()()*)*)*)*)*)*+*+*+*+,+,+,+,+,+,                       ! ! !!"!"!"!"#"#"#"#$#$#$##$ #$#$$%$$%$%$%$%$%$$%&%&%&'&'&'&' ('(''(('('('()(()()()*)*)*+*+*+*+*+,+,+,++,,+,++,+,+,+                       ! ! ! !""#"#"#"#$#$#$$#$#$%$%$%$%&%%&&%&%&&%&%&%&'&'&'&'('(''('('()( )())())()()*)*))**)*))*+*+*+,++,++,,+,+,+,+,+,+,                    ! ! !"!"!!""#"#""#$#$#$#$#$%$%%$%&%&%&'&'&&'&'('('('('()()()()*)*)*)**)*)*+*+*+*+*+,+,+,+,+,+                 ! ! !"!"!"""!"#"#"#$#$#$#$#$$%$%$%$%&%&%&%%&'&&'&&'&'('('()(()()()())()()*)*)*))*)*+**+*+*+*+*+,+,+,+,+,,+,+,++,+,++,+,++,+,,                           ! !"!""!"!""#$#$#$%$%$%$%&%&'&'&'&'&'&'('('('('())()()()*)*)*)*+*+*+**+*+,+,+,+,++,+,+,+,                 ! ! ! !"!"!!"!"#"#"#$#$#$#$%$%$%$%&%&%&%&'&'&'&'('('(''(('()(()()(()(())()()(()*)*)*)*)*)*)* +*+**+*+**+,+,++,,++,++,++,,++,,+,                       ! ! !"!!""#""##"#"#$##$#$#$%$%$%$%$%&%&%&%&'&'&'&'('('('(()()()()*) *)*))**))*)*)*+*+*+*+*+,+,+,+,+                         ! !"!"!"!""#""#$#$#$%$%$%&%&'&'&'&'&'&'('('('('(('()(()())())()()*))*)*)*)*)*+*+*+**+*+*+*+*+,++,+,+,+,+,++,+,+                ! ! ! !"!!"!!"!"#""#$#$#$#$%$%$%$%&%&'&&'&&'&'&'('('(''('(()()()()()*))*)*)*))*+*+*+*+,+,+,+,+,+                      ! ! !"!"!"!"""#"#$#$#$#$$#$%$%$$%$%&%&%&%&%&'&&'&'('(''(()()*)*)*)*+*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+                    ! !"!"!""#"#""#$#$#$#$%$%$% &%&%%&%&&%&'&'&'&'&'('('('('()()((()*))*)*)*)*)*+*+**+*+*+,+,+,,+,++,,+,+,,++,+,+,+                          ! !! ! !"!"!""#""#""#"#$#$#$##$#$%$%&%&%&%& '&'&'&&'&'&'&'('('('('() ()(()())(()()*))*)*)*+**++**+**+*++*+*+,++,++,+,+,+,++,+                     ! ! !"!"!"#"#"#$#$#$#$%$%$%%$%&%&%&'&&''&'&' (''(''('(''(('()()()()*)**)*))*)*+*+**+*+*+,+,+,+,+,+,+,+,                               ! ! !"!!""!"!""#"#"#$#$$##$ %$$%%$$%$$%%$%&%&%&%%& '&&'&'&&'&'&'&'('('()()(()()())(()*)*))*))*)*+*+**+*+**+,+,++,+,+,+,+,+,+,                            ! ! !"!"!""#"#"#"#$#$$#$#$%$%$%$%&%&%&%&'&'&'&&'('(('('()()()()()()*)*)*)*)*+*+*+*+*+*+*+,+,+,+,+,+,+,+,+                 ! !"!"!""#"#$#$$#$%$%$%$$%$%$%&%&%&'&&'('(''('()(()()*)*)**))**))*+*+*++*+*+*++*+,+,+,+,+,+,+,+,+,+,+                       ! !"!""#""#"#$%$%%$%$%&%&%&%&'&'&'&'&'('(('()()(()()(()*)*)*)*+*+**+*+*+*++*+*+,+,+,+,++,,+,+,+,++,+                 ! ! !"!"!"!!""#"#"#$#$#$#$%$%$%&%%&%&'&'&'&'('('()(())((()(())()()()*)*)*)**)*+*+*++*+*+*+,+,+,+,+,+,+,+,+                         ! !"!"!"""#"#"#"#"#$#$%$%$%&%&%%&%%&'&'&'('('('()(()()())()()*)*))*)*+*+*+*+,+,+,+,+,+,+,+,+,++                         ! !"!"!"!""#"#""#$#$$#$%$%$%%$%&%&%&'&'&'&'('('('()()()()(()() *))*)*)*))*+*+*+*+*+**++*+,+,++,+,+,++,+,+,+,+,+                           ! ! !! !"!"!"!!""#"#$#$#$%$%$$%$%&%&%&%&&%&'&''&'&'&'('('('('()(()()*))*)*+*+*+*+,+,++,+,+,+,+,++                        ! !! ! ! !"!"!"!""#"#$#$%$%$%$%&%&%&%&'&'&'('('('('())(()()*)*)*))*)*+*+*++**+*+,+,+,,+,+,+,+,+,++                     ! ! "!!"!!"!"!"""#"#"#"#$#$#$%$$%$$%%$%&%&%&'&'&'&'&'('(''('()(()()*)*)*)*+*++*+*+*+,+,+,+,+,++,++,+,+,+,++,+                       ! !"!"!""#"#"#""#"#$#$%$%$%%$%&%&'&'&&''&&'('('('('()(()()()*))**)*)*)*)*+*+*+*++*+,+,+,+,+,+,+,+,+,+,                          ! !! !"!"!""#$#$#$#$#$%$%&%&'&'&&'('('('()())()*)*)*)*+*+*+*+*+,+,+,+,++,,+,+,+,+,+,++,                       ! !"!"!""#"#""#"#"#$#$#$#$##$%$%&%&%&%& '&'&&''&'&'(''((''(('()()(()()()*)*)*)*)*+*+*+,+,++,+,+,+,+,+,+,++,++,++                            ! ! !"!"!"!"!"""#"##"#"#"#$#$%$%%$%$%&%&%&%&'&'&&'&'&' (''('(('(('('()()(()()*)*)*))*))*+*+*+*+,+,+,+,+,++,+,+,+                         ! !"!"!!"!" #"#"#""##"#"#$#$$##$%$%$$%&%&%%&%&'&'&'&'('('('()(()*)*)*)**)*+*+**+*+**+*+,+,+,+,++,+,+,++                               ! !! !! !"!"!""#""#"#"#"#"#$#$#$#$#$$#$%$%$%$$%&%&%&'&&'&'&'('(('('('('()()(( )())())()()*)*)**))*+*+*+**+*+,++,+,++,+,++,+,,+,+,++,+,+,++                    ! !"!"!""!""#"#"#$##$%$%&%&%&%&%&%&'&'&'&'&'(''('()()()()()*)*)**))*+*+*+*+*+,++,+,+,+,+,+,+,++,+                        ! !! !""#"#"#$# $##$$#$$#$#$%$%$%$%&%&%&%&'&'&'&' (''('(''(''()(())()()()()*)*))*)*)*+*+*+*+,++,+,+,+,++,+,++,+,+                             ! ! !"!"!!""!"#"#"#"#"#$#$#$#$%$%$%$%&%&%&%&'&'&'&'(''('(''('('()(()()()()*)*)*+**+**+*+*+,+,+,+,+,+,+,+                          ! ! ! !"!"!!""!!""#"#"#$#$%$%$%&%&%&%&%&%&'&'&'&'&''&' (''('(('(('('()())())()()()()*)*)*)**)*+*+*+*+*+,+,++,+,+,+,+,+,+,+,,                   ! ! !"!!""!"!""#"#"#$#$#$%$%&%%&%%&%&%&'&'&'&&'&'('('('()(()()()*)*)*)*)*+* +**++*+*+*+,+,+,+,+ ,++,+,++,,+                       ! !"!"!""#"#"#""#$##$##$#$%$%$%$%$%$%%$$%&%%&%&%%&'&'&&'()(()*)*)*)*+*+*+*+*++**+*+,+,+,+,+,+,+,+,+,+,+                        ! !! !"!"!"!"#"#"#"#"#$#$#$ %$%$$%$%%$%&%&%&%&%&'&'&'&'('('('('()( ()()()())()()*)*)*))*+**+**++*+*++**+*+,+,+,,++,+,+,+,++,+,+,+                         ! ! ! !"!"!"!!""#"#""#$#$#$#$#$%$$%$%$%$% &%&%&%%&%&%&%&'&'&'&'('(''('('()(())()()*)*))*)*)*)*+*+* +**+*++**++*+,+,++,+,+,+,+,                    ! !"!"!!"!""##"#$#$$#$#$%$%$%$%&%%&&%&'&&'&'&&'&&'&''&''&'('()()()*)*)**)**)*+**+*+*++*+*+**+*+,+,+,+,+,+,+                             ! !"!""#"##"#"#$#$##$$#$%$%$%$$%&%&%&%&%&'&&'&'&'&'&'('('('()()()()())(()*))*)*)*)*)*+*+*+*+*+*+*+*+*+,+,+,+,++,+,+,+,+,+                          ! ! !"!"!"!"#""#"#"#"#$#$#$#$#$%$%$%$%$$%&%%&&%&%%&'&''&'&'('('('(''('()(()(()()()()*)*)*)*)*+*++**++**+**++*+*++*+*+,+,+,+,+,+,+,+,+,+,+                         ! ! ! !"!""!""#"#"##""#$#$#$#$%$%$%&%%&'&'&&'&'(''(''()()())(() *)*))*))*))*)*)*+ *+*+*++*+*+*+*+,+,+,+,+,+,+,++,+,+,+,+                        ! ! ! !"!""!!"!""#"#"#$#$#$#$%$%$%&%&%&%&%&'&''&'('('('()()(()()*)*) *)**)**)**)*))*+**+*+*+,+,+,+,++,+,++,+,++,,+                       ! ! !"!!"!!"!"!""#"#"#$#$#$%$%&%&%&'&&'&'&'&'('(''('(''(('('()())())()()*)*))*)*)**)*+*+*+*+,+,+,+,+,+,+,+ ,++,++,,++,+                          ! ! !"!!"!!"!"!""#"#"#"#$#$%$$%$$%&%&'&'&'&'(''(''('('()(()())()*)*)**)*+*+**+*+,+,+,+,+,+,++,+,++,+                           ! !! !"!"!"!"!""#"#$#$#$##$%$%$%&%&%&'&'&''&&'('('('('()()()())()()()*))*)*)*+*+ *+*++**++*+,+,+,+,+,+,+,+                          ! !"!"!"!""#"#"#$#$#$$##$##$%$%$%&%&%&'&&'&'('('()())())(()()*)*)*)*+*+*+*+,+,+,+,+,+,+                    ! ! !! !"!"#"""#"#"#$#$#$#$%$%$%$%$$%&%&%&&%&%&'&&'&'&'&&'&'('('()())()())()*)*)*+*+*+*++*+*+,+,+,+,++                            ! "!!"!"!""!!""#""#"#$#$%$%&%&%&%&'&'&'&'('('(''()((()()*)*)*)*+*+**+*+*++**+,+,+,+,+,+,+,+,+                           ! ! ! !"!"!!"#""#"#$##$#$#$%$$%$$%$%$%&%%&%&%&'&'&'&''&'('(''('()()(()))())() *)**)*))**)*)*+*+**+*+,++,+,+,+,+ ,+,++,++,++,+                      ! !"!""!"!!"!""#"#"##"#$#$#$#$%$%$%&%&%&%&'&'&&'&'&'(''('('()())()()*))*)*)*)*+*+* +**++*++**++*+,+,+,+,+,+,+,+,+,++,++                         ! ! !"!"!"!""#"#"#$#$#$%$%$%&%&%&%&%&%&'&'('((''('()()()((()() *))*))*)*)*)*+*+*+*+,+,+,+,+,++,+,+                          ! !! ! !"!"#"#"#$#$#$%$%$%$$%%$$%&%&%&%&'&'&'&'('('('()()()()*)*)*)*)**)*+*+*+*+,++,,+,+,+,+,+,+,,+,+,+,+,+,+                    ! ! ! !"!"!""#$##$#$%$%$$%$%&%&%&%&'&'&'&'('()()(())()()()()*)*)*)*)*)*+*+*+*+*+*+,+,++,+,+,+,++,+,+,+,++                       ! !"!"#"#"##"#$#$#$##$%$%$%&%%&%&'&''&'&'('(''('()(()(()()())(()*))*)*)*+*+*+*++*+,+,+,++,+,+,+,+,,+,+,+                              ! ! ! !"!"#""#""#$#$%$%$%$%$%$%&%&%&%&%&&'&&'&&'&'(''(('(('('()(()(()()*)*))*)*)*+*+*+*+*+*+*+,+,+,+,++,+,+,+,+,++                          ! ! !"!"!"#"##"#"#$#$#$#$%$%$%$%&%&%& '&&'&'&&'&'('(('('()()(())()*)*)*))*))*)*+* +**++**+**+*+*+,+,++,+,++,+,+,+,+,+,+                                  ! ! ! !"!"!"#""#"#"##""#$#$#$%$%$%&%&%&%&&%%&'&&'&'&'('(('('()()()()*)*)**))*)*)*+*+*+*+*+*+,+,+,+,+,+,++,++,,+,+,+                              ! ! ! "!!"!!"!"!"#""#$#$#$%$%$%$%$%&%&%&%&%&&%& '&&'&''&''&'&'('('(('((''('())(()())()*)*)*)*+*+*+*+*+*+,+,+,+,+,+,+,,+,++,+,++,,+,+,++                          ! !! ! ! !"!"!""#$#$#$%$$%$$%$%$%&%&%&%%&%&'&'&'&'&'('('('('()(())()()*)*)*))*)*+*+*+,+ ,++,+,++,,+,+,+,+                            !! ! !! ! !! !"!"!!"#"#"#"#"#$#$#$#$$##$%$%$%$$%&%&%&%%&'('('('()()()()*)*)*))*)*)**)*+*+*+*++*+*+*+,+,+,+,+,+,+,+,+,+,++,+,+,+                   ! ! ! !! !!"!"!!"!""#"#"#$#$$#$%$%$%$%&%&%&'&'&'&'('('('('('()()())())()*)*)*))*)*)**)*+*++*+**+*+,+,++,+,+,+,+,++,+,,+,+,+                        ! ! ! !"!"##"#"#"#$#$#$ %$%$%$$%$%$%$%&%&%&'&'&'&'('('()(())()()*)*))*)*)*))*)*+*+*+*+*+*+,+,+,+,+,+,,+,+,+,,                      ! !"!"!""!!"!"#""##"#"#$#$#$#$#$%$$%%$%&%%&%&%%&%%&%&&%&'&&''&'('(''('()(())())()() *))**)**))*+**++*+*++**++*+,+,+,+,+,,+,+,++,,++                           ! ! ! !"!!""!""!"##""#""# $##$$##$##$$#$%$%$%$%$%&%%&%&%&%&%&'&'&'&'('('('()()()))(()()*)*)*)*)*)*+*+*+*+*+,++,+,+,+,+,+,++,++,,+,++,+,+                             ! ! !"!"!"#"#""#"#"#"#$#$#$#$##$%$$%%$%$$%&%&&%&%&'&'&'&'&&'&'('('('('(()()()()()*)*)**))*)*)*+*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+                      !"!"!!"!""#"#"#"#$#$#$%$$%&%&%%&%&'&'&&'&&'(''('('()()()(()(()()*)*)*)*)*)*)*)*+**+*+*+*+*+*+,+,++,+,+,+,+,+,+,+,+,+                           ! ! ! !"!"#""#"#"#""#$#$#$#$%$%$%$%$%&%&&%&'&'&''&'('('('(('('('( )()()())()()() *)*)**)*))*+*+*+**+*+*+,+,++,+,++,,++,+,+,+,++                           ! ! !"!"!"#"#"#$%$%$% &%%&%&%&%%&%&'&'&&'&'&&'('('(('()()())()()()*)*)*)*)*)*+*+*+,+,+,+,+ ,++,++,,++,+,+,+,+,+,                               ! !"!"!"#"#"#$##$##$%$%&%&%&'&'&&'&'&''('()()((()()*))*)*)**)**)*+*+*+*+*+*+,+,++,+,++,+                           ! ! ! ! "!!"!"!"!!""!"#"#""#"#$#$#$%$%$%&%&%&&%%&'&'&'&' ('('('('('('()(())()*)*))*+*+**+*+*+*+,+,+,+,+,+,+,+                                 ! ! ! !"!"!"!"!"#"#"#""#""#$#$#$%$%$%&%%&%&'&'&'&'('('('()(()()*)*)**)*+**+*+*+*+*+*+,+,+,+,+,+,+,+,+,+,                            ! ! !! !"!"#"#""#$#$#$#$##$%$%$%%$%&%%&%&%&&%&%&'&'&'&'&'('(('()()())()*)*)*)*+* +**+*+*++*+*+,+,+,+,+,                          ! ! !"!"!!""!"!"#"#$#$%$%$%$%&%&%&'&'&'&'&'&&'('(''('('()()()()()*)*)**)*)*+**+*+*+*+*+**+*+,+,+,+,+,+,+,++,+                       ! !! !"!"!"#"#""#"#$##$##$#$#$%$$%$%&%&%&%&&%&'&&''&'&'('('('()()()))()*)*)*+*+*+*+**+*+,+ ,+,++,++,++,+,+,+,+,+,+                              !"!"#""#"#$#$#$%$%$%$%&%&%&&%&%&&'&''&''&''&&'&&'('('( )(())()()))*)*)*))*)*+**+**+*+*+*+*+*+,++,+,+,+,+,+,++,+,+,+,+,+                            ! !! !"!"!"!"#""##"#"#$#$#$%$%$%$%$%$%&%&'&'('('('('()()()())()*))**))**)*+*+*++*+*+**+*+,+,++,+,+,+,++,+                         ! ! ! !"!"!"#"#"#$#$#$##$$##$%$%$%%$%&%&%&'&'(''(('('('(()()()(())()*)*)*))*+*+*+*+*+*+**+,+,+,,+,+,+,+,+,+,+,+                              ! ! !"!"!"#"#""#"##"#$#$##$%$%&%&%&'&'&&'&'('(('('()())()())())(()*))*))*)*)*+*+*+*+*++*+*+,+,+,+,++,+,+,+,+,+,++                       ! ! ! !"!"!"!"#"#"##"#$#$#$%$%$%$%&%&%&%&%&'&'&''&&'&&' (''(''('('('('()()(())()*)*)**))*)**)*+**++*+*+**+*+,++,++,,+,+,++,+,+,+,++                          ! ! ! !"!""!!"#""#"#$##$$#$#$%$% &%%&%&%&%&%&'&'('('('('('(('()()(()()(())(()*)*))*+*+*++**++*+*+,+,+,+,,+,+,+,++,+,+,++,+                           ! !"!"#""##"## $#$$#$$#$##$#$%$%$%&%&%&'&'&'('(('('('('()()()()()*)*)*+*+*+*+*+,+,+,+,+,+,+,+,+,+                           ! !"!"!!""!"!"#""##"#"#$#$%$%$%&%&%&'&'&'&'('('()())()*)*))**))*+**+*+*+*+,+,+,+,+,+,+,+,+,+,++                             ! ! !"!""!"#""#"##"#"#$#$%$%$%&%&'&'&&''&'&'&'('('('('('( )(())(()())()()()*)*))**)*)*)*+*+*+**+*+*+,+,+,+,++,+,+                              ! !! ! !! !"!"##"#$#$#$%$%$%&%&%&%%&%&'&'&'&'('('('(('()()()())(()*)*)*)*)*+*+*+**+*+,+,+,+,+,+                        ! ! ! !"!"!!""!!"!"#"#"##"#$##$#$##$%$%$%$$%&'&'&'&'&'('('()()(()())(())*)*))*)*)*)*+*+*+*+*+,+,+,+,++,+,+,+,+,+,+,+,++                            ! ! ! !"!""!"#"#"##$#$#$#$%$%$%&%&%&%&'&'&'&'('(''('(''()())()(()()*)*)*+* +**++*+*+*+*++*+,+,+,+,++,+,,+,+,+,+,+,+,+                             ! ! ! !"!"!"#"#""##""# $#$#$##$#$#$%$%$%%$%$%&%&%&%&'&&'&'&''&'('('('()()())()())()()*))*))*)*)*+**+*+*+,+,+,,+,+,+,,+,+,+,+,++                       ! ! ! !"!"!"!"#"##""##"#$##$$#$%$$%$%$%%$%%$%&%%&&%&'&'&'&'('('('()()()(())()*)*)**)**)*+**++*+* +*++**+*+*++*+,+,,+,+,++,,+,+,+,+,+                              ! ! !"!!"!!""!"#"#"#"#"#$#$#$#$#$%$$%$%$%$%$%&%&%&'&'&'('('('('()()(()()(()))*)*))*)*)*))*+*+ *++**++*+*+*+,+,+,++,++,,+,++,+,+,+,++,++,,+,+                         ! ! !"!!"!"!" #""#"##"#"#""#$##$$#$##$%$$%$%%$%&%%&%&%&%&%&'&'&&'&'('('('()()())() *)*)*))*))*)*+*+*+*+*+*+,+,+,+,+,+,+,+,+,+                                 !! ! ! !"!"!!"#"#"##$##$%$%$$%&%&%%&%%&'&'&''&&'&'(''('('('()()(()(())*)*)**))*)*+*+*+*+*+*++*+,+,+,+,+,+,+,+,+,+,+,+                            ! ! !"!"!!"#"#"#"###$#$#$#$#$%$%&%%&%%&%&%&'&'&'&'&'( '('('(('(''()()()()())()(()*)*))*)*)*+*++*+**+*+*+*+,++,,++,+,+,+,+,++,+                         ! ! ! !"!""!!"!!"!"#"##$#$#$%$$%$%$%%$%&%&%%&%&&%&'&'&&'&'('(('('()())()()()))()*)*)*)*)*)*+*+*+*+*+*+,+,+,+,+,+,+,+,+,,++,+,+,+                         ! ! ! !"!"!!"#""#""##$#$#$%$%$%$%$%&%&%&%%&'&'('('('()()()())*)*))*)*)*)*+*+**+*+*+*+,+,+,+,+,+,                                   ! ! !! !! !"!"#"#""#"##$#$#$%$%&%&%%&&%&%&'&'&'&'('('(''()()()(())*)*))*)*))*)*+*+*+*++*+,+,+,+,+,+,+,+                                   ! !"!"!"!!"!" #""##""#"##$#$#$%$$%&%&&%%&&%&'&'('(('(''('()(())())*)**)*)*)* +*++*++*+*+*+,+,+,+,+,+,+ ,+,,+,,+,++,+                            ! ! ! !"!"!"!"!"#"#"#"#$#$#$$#$%$$%$$%$%$%%$%&%&%%&&%&'&''&'&'(''('('('()()())()(())()))*)*))*)*)*)*+*+*+**+*+*+,+,+,+,++,+,+,+,++                          ! ! !! ! "!"!!""!"!"#"##$#$#$$#$%$%$%&%&%&%&%&'& '&''&'&'&&'('('('('()()())())()*)*)**)**)*)**)*)*+*+*+**+*+,+,+,++,+,+,++,+,                              ! ! !"!"#"#"##$##$#$%$%$%$%$%&%%&&%&&%&%&'&'&'&'('()())(()(()()()*)*)*)*)*)*+**+*+*+**+*+,+,+,+,+,+,+,+,++,+                               ! !! !"!"!!""!"#"##""#"##$#$#$#$%$%$%%$%&%&%&&%%&'&'&'('('()()(()()()*)*)*))**)*)*+*+*+*+*+*+,+,++,+,+,+,+,+,+,+,+,+,+                                ! !"!"#"#"##"#"###$#$#$#$#$#$%$$%%$%&%%&%&'&'&'&'&'('('('('()()())*)*)*)*)*+*+*+*+*+*+,+,+,++,+,+,+,+                            ! ! ! !"!"#"#"##$#$#$%$%$%&%%&%&'&'&&''&'('('(('(('()()()()))()*))*)*)**))*+*+*+*+*+,+,+,+,+,+,+,+,++,,+,                           ! ! !"!"!!"#"#"##$#$#$%$%$$% &%%&%&%&%%&'&'&'&'&'('(''(('(('('()()()()(())*))*)*)*)**)*)*+*+**++*+*+*+**+*+*++*+,+,++,+,+,+,+,+,+,+,                              ! ! !"!"#"##"##$#$#$%$%$%$%$%&%%&%%&%&&%&&%& '&&'&&'&'&'('(''()(())()()())()))*)*)*))**))*)*+*+*+**+*+*+,+,++,+,+,+,+,+,+,+,+                         ! !! !"!"!""!"#""#"#"##$#$#$#$#$ %$%$%%$%$%$%&'&'&'&'('('()()()()())*)*)*)*)*)*+*+*+*+*++*+*+,++,+,++,+,+,++,+,+,++,+                           ! ! ! !" !"!!"!""!"!"#""##$#$#$%$%$%&%&%&%&%&'&'&'(' (''('(''(''(('()()())(()))*)*))*)*)*)*)*)*+**+*+*+*+*+,+,+,+,+,+,+,+,++,++,+                                     ! !! ! !"!"#""#"#"#"###$#$#$%$%$%&%&%&%&'&'&'&'('('()()()())()())*)*)*)*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+                             ! ! !"!"!"#"#""#"##$##$$#$#$%$%$%&%&%&%&%&'&'&'('('('()()()()))*)*))**)*)*)*+*+*+*+*+,+,++,+,+,+,+,+,+,+                                   ! !! !"!!"!"!"!"#"##"#"#"##$#$#$%$%$%$$%&%&%&%&'&''&'&'('('('()()()())*))*)*)*)* +**++*+**+*+,+,+,+,+,+,+,                                 ! ! !"!"!"!"#"##$%$%&%%&%&%&%&'&'&'&'&''&'('('()()())()()))*)*)*)*)*)*)*+* +*+*+*+**+*+*+*+,+,+,+,+,+,+,+,++,+,+,+                               ! ! !"!"!"#"#"##$#$#$#$#$%$%$%%$%$% &%&&%&%%&&%&'&'&'&''&'(''(('('('()()()*)*)**))**)*+*+*+*+*+*+,+,++,,+,+,+,+,+,+,+,+,+,                             ! !! ! !"!""!"!""!"#"#"##$##$#$##$%$%$%$%$%&%&%&'&'&'('('(''('()(()( )()(()())())) *))*))*)*)*)*)*+*+**+**+**+*++*+,+,++,+,+,+,+,+,+,++,,++,+,++,++,                               !"!"#"##"#"##$#$%$%$%&%%&%&'&'&' ('('(''(('('()()()))*)*)*)*+*+**++*++*+*++*++*+*+,+,+,+,+,+,+,+,+,+,+                                 ! ! ! ! !"!"!""!"##$#$#$#$%$%$%&%&%&'&'&&''&'(''('('()()(())())*)*)*))*)*+*+**+*++*+*++*+,+ ,++,++,+,++,+,+,+,+,++                                   ! ! !"!"!!"!"!"#"#"##"#$#$#$#$$#$#$%$%$%$%$%&%&&%&%&%&%&&%&'&'&&'&'&'('(''()()())()())*))*)*)*)*)*+*+*+*+*+**+*+ ,++,++,+,++,+,+,+,+,+,+,                                   ! !"!"!"#""##"#"##$#$##$%$%$%$% &%%&%&&%&%&%%&'&'&'('('('(('()(())()())*)*)*)*)*+*+*+*+*+*+*+,+,+,+,+,+,+,+,+                            !"!"!"#"##"##"##$#$%$%$%$%&%&%&'&'&'('('('()()()()*)*)*)*)*)*+*+*+,+,+,++,+,++,++,+,+                                  ! ! !"!"!!"!"!"#"#""##"##$#$%$$%$%$$%$%&%&%&%&&%&'&'&'('(('((''()())*)*)*)*)*+*+*+*+*+*+*+*+,+,+,+,,++,+,+,+,++,++,+,+,+,,++                                  ! ! ! ! !"!"!""!"#"#"#$##$#$#$%$%$%&%&%&%&%&'&'&'('('('()()(()())*)*)*)*)*)*)*+*+*+**+*++*++*+*+,+,+,+,+,++,+,+,+,+                                    ! ! !! !"!"!"!"#"#"##""##$#$%$%$$%%$%$%&%&%&'&'&&'&&'&'('('('('()()()(())*)*)*+*+*+*+,+,+,+,+,+,+,+                                     ! ! !! ! !"!"!" #""#"##"##"##$#$$#$%$%$%$%$%&%&%&'&'&'('('()()*)*)*)*)*)*+*+*+**+*+*+,+,+,+,+ ,+,,+,,+,++,+,+,++,+,+,                                 ! ! !"!"!"#"#"#""#"##$##$#$#$$#$%$%$$%&%&%&%&'&''&'('('('()()())()())*)*)**)*)*+*+*+*+,+,++,+,+,+,+,+,+,+,+                                ! ! ! ! !"!"!"!"#"#"#"#$#$#$#$#$%$%$%&%&%&%&%&'&'&&'&'('('(('(''()()()())(())*)*)*)*))*)*)**)*+*+*+*+*+*+*+,++,+,+,++,+,+,+,+,+,+                                  ! ! ! !"!"!"!"!"#"#"##$#$#$%$%$%$%&%&%&%&%&'&'&'('('('('()())*)*))*)**)*)*+**+*+**+**+*++*+*+,+,+,+,+,+ ,++,++,+,+,,+,+,+                                        ! ! !"!"#"#"##$#$#$%$%$%$%&%&%&%&'&&'&'&'&''&'(' (''('(('(('()()(())())(())())*)*)*)*)* )*)*)*)**)*+*+*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+,+                                        ! ! !"!"!!"#"#""#"#"#$#$##$$#$%$%&%&%&'&'&'('('(''(('()()*)*)*)*+*++*+*+*+*+,++,+,+,+,+,+,+,+,+                                                ! ! !"!"!"#"#"##""##$#$##$#$%$%$%$$%$$%$%&%%&&%&%%&&%&'&&'&'&' ('(''('(''()()()()**)**)**)*+*+* +*+**++*+**+*+,+,+,+,++,,+,+,+,+,+                                            ! ! ! !"!""!!"#"#"#""#"#"##$#$#$%$%$%$%$$% &%&&%%&%&%&%&'&'&'&'('((''('('()()())(())()())()()*)*)*)*)*)* +**+**+*+*+*+*+*+,+,+,+,+,+,+,+,++,+                                           ! ! !"!"!"#"##"#$##$#$##$#$#$%$$%$$%$%&%%&%%&%&'&&'&&'&'('('('()(())())(()()()(()*)*) *))*)**)*)*)**)*+**++* +**+**++**+*+,+,+,+,+,+,+,+,+,+,+,+                                                        ! ! !"!"!""!"#""#"#""#$#$#$#$$#$%&%&%&%&'&'&'&'('('('()()()()()*)*)*))**)*)*)*)*+*++**+*+,+,++,+,+,++,+,+,+,+,,+                                                     ! ! ! !! ! "!""!!""!!"#"#$##$$#$#$%$%$%$%$%&%&%&'&'&'&''&'(''(''(('('()()()()()()) *))**)**)*)*)*+*+*+*+*+*+,+,+,+,+,+,++,++,+,+,++,++,+,+                                               ! ! !"!"!"#""#""#"#$##$#$#$%$%$%$% &%&&%%&&%%&%&'&'&&''&'('('(('('()()()()())*)*)*)*)*+*+*+*+*+*+,+,+,+,+,+,+,+,+,+                                                ! ! ! !"!"!"#"##"#"##$%$%&%&%&%&'&'('('()()()()*)*)*)*+*+*+*+,+,+,+,+,+,+,+,++,,+,                                           ! ! ! ! !"!"!"!"#""#"##"#$#$#$#$#$%$%$%$%&'&'('('()()()())()()*)*)*))*)*)*)*+*+*+*+,+,+,+,+,+,+                                               ! !"!"!!"!!"#"#"#$$#$#$ %$$%$$%$%%$%&%&%&&%%&'&'&''&'('('('( )())())()()())*)*)*)*)*)*+*+*+*+**+,+,+,+,++,+,+,+,+,+,++,,++                                          ! ! ! !"!"!"!"#"#"#$#$#$#$#$%$%$%$%&%&%&'&&'&'(''('(('('('()()())*)*+*++*++*+*+*+**+*+,+,+,+,+,+,+,+,+,+,,+,+,+,+,,+                                          ! ! ! !"!!"#"#"#$###$#$%$%$%%$%&%&%&%&'&'&'&'&'(''('('('()()()()(()(())*))*)*)**)*)*+*+*++**+*+,+,+,+,+,++,,++,+,++,++,+,+,+,+                                            ! ! !"!!"#"#""#"#"##"#$#$$%$%%$%$%&%%&%&%&%&'&'('()()(()()()*)**)*)*)**)*+*+*++*+*+*+,+,+,+,+,+,+,+,+                                      ! ! !"!"!!""!"!"#"##""#"#"#"#$#$$#$%$%$%%$%&%&%&%&%& '&'&''&'&&'('('('('()()()()()**)*)*)*)*)*+*+*+**+*+,+,++,+,+,+,+,+,+,++,+,++,++,+                                  ! ! !"!"!"#" #""#"#""#"#$#$##$#$%$%$%$%$%$%&%&%&%%&&%&'&'&'&&'('('(''('()()()()()()()*))*)*+*+*+*+,+,+,+,+,+,+,+,+                              ! ! ! ! !"!"!"#"##"#$#$$###$#$%$%$%%$%&%&%%&%&'&'&'&''&&'&'('('()())*)**))*)*+*+*+*+*+,+,+,+,+,+,+,+,+,++,+,+,+                             ! !! !! ! "!"!!"!""!"#"#$#$#$$##$#$%$%$%$%&%&%&&%& '&&'&&''&&'&'(''(''((''((''('('()()()(()()*)*)*))*))*))*)*+*+*+*+*+,+,+,+,++,+,+,+,+,                              ! ! ! !! !"!!"!!""!"#$#$#$#$%$%&%&%&%&%%&'&''&'&&'('('('('('()()()()()(()**)*)*+**+*+**+*+*+*+,+,,+,+,++,+,+,+,+,+,+,++,+,+,++                   !"!"!"!"#"#$#$#$#$%$%$%$%&%&%&'&'('('('()()())*)*)**)*)*)*)*+*+**+*+*++*+,+,+,+,+,+,+,+,+                     ! ! !"!"!"!"#""##"#$#$##$#$#$%$%$%$$%&%%&%&%&%&'&'&''&'&'('('( )()())(()()*))*)*)*)**)*+*+*+*+*+*+*+,++,+,+,++,++,,++,++,++,,+,+,+,+,                              ! ! !"!"!"!"!"#""#"##""#"#"##$#$#$#$%$%$$%$$%&%&%%&&%%&'&'&'&'('('()())()()()()*))*)*)*))*)*)*+*+**+*+*+*+,+,+,+,+,+,+,+,+,+,+,+,++,+,+                           !"!!"!"#"#$#$#$#$#$%$%$%&%%&%&%&%&%& '&&'&&'&'&&'('(''(''()()()())())*)**)*)*+*+*+**+**+,+,+,+,+,+,+,+,+,+,+,+,+,+,,+,+                           ! ! ! !"!"!"#"#"#$##$#$#$%$%$%%$%&%&%&%&%&'&'&'&'('('()()()**)*)*+*+*+*+*+*+*+,+,+ ,+,+,++,++,,+,+,+,+,+,+,+,+                                  ! ! ! !"!"#"#"#"#$#$$##$$#$%$%$%&%&%&%&%& '&''&'&&''&'&'('(''()()()()()* *)*)*))*))*+*+*+*++*+*+,+ ,++,++,+,+,,+,+,+,+,++,,+,+,,                              ! ! ! ! !"!"!"#"#"##"#"#$#$#$$#$%$%&%&%&%&'&'&'&'('('()(()(()()()()*)*)*)*)*)*+*+*++*+*+*+,+,+,+,+,+,+,+,+,++,++,+,+,++,+                          ! ! ! !"!"!"#"#"#$#$#$%$%$%$$%%$%$%&%&%%&'&'&'&'(''(('('()()())()()(()*)))*)*)**)*+*+*+,+,+,+,+,+,+,+,+,+,+                            ! ! !"!"!"!!"#"#"#$#$#$$##$#$%$%$%$%&%&%&%%&%&'&'&&'&'&''&'('()()()()*)*)**)*+*+*++*+*+*+,+,++,,+,+,+,+,+,+,+,+                            ! ! !"!"!"!"!"#"#"# $##$#$#$#$$$#$ %$%$%$%%$$%$%&%&%&%%&%&'&'&''&&'(''(''('('()()()()()())()*)*)*))*)*))*)*+*+*+*+*+*+,+,+,+,+,++,+,+,+,+,+                         ! ! !"!"!"#"#"#$#$###$%$$%$%$%%$$%&%%&%%&%&%&'&'&&'&'(''(''('(('()(()()*)*)*)*)*+*+**+*+*+*+*+,+,+,+,+,+,+,+,+,+,++,+,+                               ! !"!"!""!"#"#$##$#$#$##$%$%$%$%&%&%&%%&%&'&'&&'&'&'('('()()()()*)))*)**)*+*+*+*+,+,++,+,+,+,+,,+,+,+,+,+                          ! ! ! !"!""!!"#"#"#$#$#$#$$#$% $%%$%%$%%$%&%&%&'&'&''&&''&'('()()()()()*)*)*+*+**+*+,+,++,++,+,+,++,++,+,+,+,++,+                              ! ! ! ! !"!"!!"#"#"#"#"#$#$$%$%$%&%&%&%%&'&''&'&&'&'&'(''((''('()()()()()*))*)*+**+*+*+*+,+,+,+,+,+,+,+,+,+,++                     ! !! !"!"!"!"!"#"#"#"##"#$#$$#$#$$%$%$%$%&%&'&&'&'&'&'&'(''(('('('()()()()*)* *))*)*))**))*+*+*++*+*+,+,+,+,+,+,++,,+,+,+,+,+,+,+                       ! !"!"!!""!"#"#"##"#"#$#$#$$$%$$%$$%$$%&%&%%&&%%&%&'&'&&'&'&'&'('('('()(()()()()*)*))*)*)*)*+**+**+*+*+,+,+,+,+,+,+,++,+,++,                      ! ! ! !"!"#""##""#$##$#$#$#$#$%$%$%$%&%&&%&%&%&'&'&'&'&'('(''(''('()(()()()()()*)*)*)*+*+*+*+*+*+*+,+,+,+,+,+,++,,+,+,,+,+,+                          ! ! !! !"!"!"#"#"#$#$#$#$$%$%$%&%&%%&%&'&'&''&'&'('('('()( )(())(())(()()*)*))*)*+**+*+*+*+*+,+,+,+,+,+,,+,+,+,+,,+,+,+,+,+                      ! ! ! ! !"!"!"#"#"##"#"#"##$#$$#$##$$%$%$%&%&'&'&'&'('('()()()())()()*))*))*)**)*)*+*+**+*+**+*+**+*+*+,+,+,++,,++,+,++,++,+,+,+,+,+,+                       ! !"!""!""!"!"#"#"#$#$$#$#$#$$%$$%$$%$%$%&%&&%&'&'('(('('('()()*)*))*)**)**)*)*+*+*+*+*+,+,+,+,+,+,+,+,+,+,,+,+                   ! ! ! !"!"!!"!"#"#""#$#$#$$%$%$%$$%&%&%&'&'&'&' (''('(('(('('()()()()*)*))**)**)*+*+*+**+*+,+,+,+,+,++,+,++,++,+,+,,+,+,,+                            !! ! !"!!"!"!"!!"#"#"#$#$##$#$$%$%&%&%&%& '&&'&'&''&'('('('('()()()()*)*)*)* +**+**+*+**+*+*+,+,+,+,+,+,+,++,++,                     ! ! ! ! ! !"!"!"!"!"!"#""#$#$##$$##$$%$%$$%&%&%%&%&'&&''&'&'('('( )()(()()())(()*)*)*)*))*)*)*+*+*++**+*+,+,+,+,+,+,++,+,+,+,+,+,,+,+                              ! ! !"!"!""!"!"#"#"#$##$#$#$$%$%$%%$%&%&%&%&%&'&'&'&'&'('(''('(('()()(())()()*)*)*)**)*)*+*+*++*+*+,++,+,+,+,+,+,++,+,,+                         ! ! ! !"!"!"#"#""#$#$#$$$%$%$$% $%$%$%%&&%&%&%&'&'&'&'('('(''('(('()()()()()*)*))**)*)*)*+*+*+*+,++,+,+,+,+,+,+,++,+,+,++,,+,,+,+,+,+,                         ! ! ! !"!!"#"#"#"#$#$#$$%$%$$%%$%$&&%&%&%&&%&'&'('('()()()(()()*)**)*)*+*+*++*++**+,+,+,+,+,+,+,+,+,+,+                             ! !! !"!"!"#"#"#""#"#$#$$#$#$#$$%$%$%&%%&%&'&'&''&&'('(('('('()()()(()*)*)**)**)*+*+*+*+*+,+,++,++,,++,++,++,,+,+,+,+,+,+,+                      ! !"!"!!""!"!"#""#"#""#$#$#$$##$%$%$$%$%$%&%&'&'&'('('(''('()(())()(()()*)**))*))*+**+*+*+*+**+*+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++,+                        ! !"!!"#"#"#$#$#$$ %$%$%%$%%$%&%&%&%&'&&''&'&'&'('('('('()()()()()*)**)*)** *))*)*)*)*)*+*+*+*+,+,+,+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+                             ! ! ! !"!"!"#"#"#""#$#$#$##$#$$%$%$%$%&%&'&'&'&'&'('(''(''('()()()*)*)*)*)*)**))*)*+*+**+*+*+**+*+*+*+ ,+,++,++,,+,+,+,+,+,+,+,+,+,++                 ! ! !"!"!"!"#""#"#"#"#$##$#$#$$%$%&%&'&'('('('()()())()(()()*)**)**)*)*)* +**+**++*+*++*+*++*+,++,,+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+                       !"!!"!""!"!"#"#"#"#$#$#$#$$ %$%%$%%$%$%&%&%&'& '&'&'&&'&&'('('(('('('('()()()()*)**)*)*)*+*+*+*+*+*+*+,+,+,+,+,+,++,+,+,+,+,+,                    ! ! ! ! !"!"!"#"# $##$##$##$##$$%&%&'&&''&'&'&'&'('('('()()()()()*)*)))*)*+*+*+*+*+*+*+*+*+,+,+,,+,+,+,+,+,+,++,++,+,+,++,+,+,+,++                     ! !"!"!"!!"#"##"#$#$#$#$%$%$$%$%$%%$%$%&%&%&%&&%&&%& '&&'&&'&'&''&&'('(('('()()()()*)**)*)**)*+*+*+*++*+*+,++,,++,,+,+,+,+,+,+,+,+,+,+,+,+,++,++,                          ! ! ! ! !"!"!"!""!"!"#""#""##"#$#$##$#$#$$#$$%$%$%&%&%&%&%&'&&'&'&'('(''('()()()()*)*)***)**)**)*+**+*+*+*+*+,+,+,+,+,+,,+,+,+,+,+,+,+,                         ! ! ! !"!"!!"!"#"#"#" $##$##$$##$$%$%$$%$$% $%$%&%%&&%&%&%&%&'&'&'('('(''('('()()())())(()(()()*))*)**))*)*+**+*+*+*+*+*+,+,+,+,+,+,++,+,+,+,+,+,+                           ! ! ! !"!"!"!"!"#"#""#"#$#$#$#$%$$%$%$%$%&%&%&%&%&'&'&'('('('()()()(()()()*)*))*)**)*+**++**+*+*+*++*+,+,++,+,+,+,+,+,+,+,+,+,+,+,++,+                         ! ! ! ! !"!"!""!"#"#"#$#$##$##$%$%$%$%$%&%&%&%&%&'&'&'&'('(''('('('()()()())()()()*)*)**)**)*)*+*+* +*++*++*+*+,++,+,+,++,++,+,+,+,++,+,+,+,,+,+,                         ! ! !"!" #"##"#"#"##""#$#$$%&%&'&''&''&&'('('('()()()*)*)*)*)*)*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+                          ! ! !"!"!""!!"!"#""#"#""#$##$##$$#$$%%$%$%$% &%%&&%%&%&&%&'&'&'&'&'('(''(('('('()()()()*)*)**)*+*+* +**+*+**+*++*+,+,+,++,,+,+,+,+,+,+ ,+,,+,,++,+,++,                       ! !"#"##"#"#$##$#$%$$%$%$%%$%&%&%&%&%&'&'&'(''('('('()()()()*)*)*)*))*+* +**+**+*+*+*+,+,+,+,+,++,+,++,+,+,+,+,+,+                            ! ! !"!"#"#"#"#$#$#$%$ $%$%%$$%$$%&%&%&%&'&'&''&'&'('('('('('()()()()*)***)*))*+*+*+*+*+*+*+,+,+,+,++,,+,+,,+,+,+,+,+,+                                 ! ! !"!"!!""!"#$#$#$%$%$$%$%%$%&%&%&&%&'&'&'&'('('((''(('()()()()()*)*)*)*))*)*+*+*+*+*+*++*+,+,+,,+,+,+,+,,+,+,+,+,+,+,+,+                        ! ! !"!!"!"!"!"#""##"#$##$#$$%$%&%&%&%&%&%&'& '&'&&'&''&' (''(''('('('()()()(()(()*)**)*)*)*+*+*+*+*+*+,+,++,++,+,+,+,+,+,+ ,++,++,++,+,+,+,                            ! ! !"!"!"!!"#"#""##"#$#$#$$%$%$%$%&%&%&%&'&'&'('('('()()()(())()()*)*))**))*))*+*+*+*+**+*+,+,+,+,+,+,+,+,+,,+,+,+,+,++,,+,+,++,+                     ! !"!"!"#""#"#"#"#$#$%$$%$%$%&%&%&'&&''&''&'('('()()()(()()*)*)*)*)*+*+**++*+*+*++*++**+,+,+,+,++,+,++,++,+,+,,+,+,,+,+,+                        ! ! ! !! !! !"!"!"!"#""#""#"#"#"#$#$##$#$$##$$%$%$%&%&%%&%&%&'&'&&'&'(''('('(('()(()()()()*)**+*+*+*+*+,+,+,+,+,+,+,++,++,+,+,+,+,++,,                         ! ! ! !"!""!!"#""#"#""#$#$#$$#$%$%$%%$%$%&%&&%&'&'&'('('('('()()()()()*)*)*)**+*+*++*+*+*+,+,+,++,+,+,+,+,+,,+,+,+,+,+,+,++,+,,++                         ! !"!"#"#"#"#$##$#$%$%%$%&%&%&'&'&'&&'('('('()()(()()()()*)**)*)*+*+*++**++**++*+*+*+,+,+,+,++,+,,+,++,+,+,+,                       ! ! ! ! !! !"!" !"!!""!""!"#"#"#"#$#$##$##$%$%$%$%&%&%&'&'&'&'&'&'('(''(('('()()()()()*)**)*))*)*)**)**+*+*+*+*+,+,+,+,+,++,+,+,++,,+,,+,+,+,+,+,+,+,+,+                     ! ! ! !"!" #""#"#"##""#$#$#$%$%$%&%%&'&&''&'&'('('()()(()()()()*))**)*)*)*)*+*+*+*+**+,+,+,+,+,+,+,+,+,+,+,+,,+                     ! ! ! "!"!""!!"!"#"#""#$##$%$%$%$%&%&%%&%&%&'&'&''&'('('('()()()())()*)*)*)*)**)*+**+*+*+,++,++,,++,++,++,,+,+,+,+,+,+,+,+,+,+,+,+                       ! !"#"##"#""#"#$##$#$$##$%$%$$%$%&%&%&%&%&&%&'&'&'&'('('(('()()()()()*)*)**)*+*+*+,+,+,+,+,+,+,++,+,+,+,+,++,+,+,+,+                     ! ! ! !"!"!"#"#"#"#$#$#$#$%$%$%$%%$%$%$%&%&'&''&&'('('('(('(('('()())()(()*)*)*))*))**+*+*++*+*+*+*+,+,+,+,+,+,+,+,,+,++,+,++,+,+,+,+,+,+                       ! ! !"!"!!""!"#"#$#$#$#$#$%$%%$%&%&&%&%&&%%&'&'&'('('('()()()()()*))*)*)*)*)*)**+**+*+*+*+*+**+,+,+,+,+,+,+,+,+,++,+,+,+,++                            ! ! !"!"!"!"#""##"#"#$#$#$%$%$$%$%&%%&%&%&%&'&'('((''('()()(()(()()*)*)*))**))**+*+*+*+*+,++,+,+,,+,+,+,+ ,++,+,++,,+,+,+,+,+ ,++,+,,+,,+,+,+,                         ! ! !! ! "!"!""!!"!!"#"#""##"#"#$#$#$%$%%$%$%&%&%&%&'&'&'('('()()()())())()*)*)*))*))***+*+*+*+*+*++*+,+,+,++,+,+,+,+,+,+,+,+                           ! ! !"!"#"#"#"#$#$$#$%$%$%%$%&%%&%&%%&%&'&'&'('('(''('()()()()*)*)*)**+*+*+*+*+*+,+,+,+,++,++,+,+,++,+,+,+,++,++,+,+,++                              ! ! ! !! !"!"!"!!""!"#""#"#"#"# $##$#$$##$#$%$%%& %&%%&%&&%&%&'&'&'&'('(''('()(()()(()()()()*)*)*)**+*++*+*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,+,+,+                           ! ! ! !"!"!""!!"#""#"#$#$##$%$%$$%$%$%&%&&%&%&'&'&&'&'&'('('('('()(())(()()*)*)*)*)*)**+*+*+*+*+*+,+,+,+,,+,+,+,+,+,+,+,++,+,+,+,,+                         ! !"!"#"#"#$#$#$%$%$%$%&%&%& '&'&&'&'&&'('('( )(()(())(()()*)*))*))**)*)**+*+*+*+*+*+*+*+*+,+,+,++,+,+,+,+,+,+,+,+,+                          ! ! ! !! !"!"!"!!""!"#"#"##"#$#$##$%$%%%$%%&%&%&%&'&'&'('('()()()*)*)*)*+**+**+*+*+*+,+,+,+,+,+,+,+,+,+ ,++,+,,++,+,+,+,+,,+,                          ! !! ! !" #""#"#"##""#$#$#$%$%$%%$%&%&'&'&&'&'&'&'('((''('()()()())()*)*))*))*)*))**+**++*+*+,+,+,+,++,++,,++,++,+,++,+,+,+,+,+,+,+,+,+,+,++                       ! ! ! !!"!"!!"!" #"#""#"##"#"#$%$%$%$%%&%&%&%&'&'&'('('('('()()()*)**+**+*+*+**+*+,++,+,++,+,+,+,++,+,+,+,+,+,+,+,+,+,,+,,                       ! !"!" #""##"#""#"#$#$$#$#$%$%$$%%$%&%&%&%&%&%&'&'&'&'('('('('()()()()*)*)*)*))*)*)**+*+*+**+*+*+,+,+,+,+,+,++,,+,+,+,+,+,+,+,+,+,                           ! ! !"!"!"#"#"#"#$#$#$#$%$%%&%&%&%&'&&'&'('('((''('()(())()()())()()*)*))*))*)**)*)**+**+*+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,+,+,+                          ! !! !"!"!!""!"!"#"#$#$#$%%&%&&%&%&&%&%&'&'&&'&'(''(''(('()()()(()()()*)*)*)*)*)**)**+*+*+*++*+,+,+,+,++,,+,+,,+,++,+,+,+,+,+,+                               ! ! ! !"!"!"!"!" #""##"#"#"#"#$#$#$#$%$%%&%%&%&%&%&'&'&&'&'&'('(''('('(''('()()()*)*)*)**+*+*+*++**+*+*+,+,+,+,,+,+,+,++,++,+,+,+,+,+,++                                   ! ! ! !! ! "!"!!"!!"!!"#"#""##"#"#$#$#$%$$%$%$%%$%&%%&%&%&%&'&'&''&'(''('('('('()()()()*))*)*)*)*)*)***+ *++*+**+*+*+*++*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+,+,++,                        ! ! !"!"!"#"#"##"#$#$$#$#$%$%%$$%% &%%&&%%&%%&%%&'&&'&'&'&'('('('(''()()(()()*)**)*)*)*)**+*+*++*+*+,+,++,+,+,+,+,++,+,,+,+,+,+,+,+,+,+,+,                                      ! ! !! !! ! !"!"!"!"#"#$# $#$##$$##$#$%$%$%%&%&%&%&'&&'&'&'('('('()())()()()()()*)*)**)*)**)**))**+**+*+*+*+*+*+*+,++,+,+,+,+,+,,+,+,+,,+,+,+,+,+,+,+                                        ! !! !"!"!"#"#"##"#$#$#$#$%$%$%%$%%&%&%%&%&%&'&'('()()()()*)*)*))**)**+**++*+*++**++*+,+,+,+,+,,+,+,++,,+,+,+,+,+,+,+,,+                                       ! ! ! !"!!"!"#"#"#$#$#$$#$%$%$$%$%%&%&%&%&%&'&'&&''&''&'('('(''('()(()()()()*)*))*)*))**+**+*+*+*+,+,++,+,+,+,+,+,++,++,,+,++,+,+,+,++,++,,+,+,+,+                                    ! ! ! !! !"!!"!!"!"#"#"#"# $##$#$##$$#$%$%$%%&%&%&%&%%&'&'&'('('(('()()()()()*)*)**)**+*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+                                            ! ! !"!"!""!"#"#"#$#$#$$#$%$%$%$%%&%&%&%&'&&''&'&'&'(''('('()()()()()() *))**)*))*))*)**+* +*+*++**+*+*+*+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+,+                                    ! !"!"!!"!"!!"#"#$#$$#$%$%$%$%%&%&%&%%&&%&'&&'&'&&'(''('('()()()()*)*))*) *)*)**)*))**+*+*+**+*+*+,++,+,++,+,++,,++,+,+,+,+,++,+,++,++,+                                    ! !! ! ! !"!!"!"#"#""#"# $##$#$##$##$%$%%$%$%$%%&%&%&'&'('('('('()()())()*)**)*)*)*)**+*+*+*+*+,+,+,+,+ ,++,++,,++,+,+,+,+,+,+,+,,++,+,+,+,++,++,+                            ! ! ! !"!!"!"!"!"#"#"#"#"#$#$#$$#$%$%$$%$%$%$%%&%&'&'&'&'&'('('()()()*)*)*)*+***+**+*+*+*++*++**+,+,+,+,++,+,++,+,+,+,+,+,++,+,                           ! ! !! !"!"!"!""!"#"#"#"#""#$#$#$%$%$%$%$%$%%&%&%&'&'('('()()(()(()()(()*)*)*)*))**+*+*+*+*+,+,+,+,+,+,+,+,+,+,+                    ! ! ! ! !"!"!""!!"#"#$#$#$%$%$$%$%%&%&%&%&%&'&'&'&'&'(''('('()()()()*))**)*)**+**+*+*+*+,+,+,+,+,+,+,+,+,+,+ ,+,,+,,+,++,+,+             ! ! ! ! ! ! "!!"!"!""!!"!"#"##$#$#$%$%$$%$%$%%&%%&%&%%&&%&%&&%&'&&'&&''&'&'('('('('('()()())(()* )*)**)**)**)*)*+*+* +*++*+*++*+,+,+,+,+,++,+,+,+,+,+,                  ! ! !"!"!"#"#"##"#"#$#$$#$%$%%$%$%%&%&'&'&'&'('('()()(()()*)*)**)**)*+*+*+*++*++*+*+*+,+,+,+,+,+,+,+,++,+,+,++,+,+,+,              ! ! ! !! ! !"!"!"!"#$#$##$$##$#$%$%$%$%%&%&%&%&'&'&&'&'&'&'('('()()()()*)**))*))*)*)*+**++*+*+*+*+*+**++*+*+,+,+ ,+,++,++,++,+,+,+,+,+,+,+ ,++,++,+,+,,+        ! !! !"!"!"#"#"##"#$#$$##$#$%$%%$%$%&%&%&%&%&'&'&'&'&'('('()(()()()())()()*))*))*))*)*))*)*)*+* *++**+**+**+*+*+*+,+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,+,+,+,+    ! ! ! !"!!""!"!"#"#"#"#$#$#$$#$%$%$$%$%&%&%&&%%&&%&'&''&'('('('(''(('('()()(()()*)*)*)*+*+*+*++*+*+**+,+,+,+,++,+,+,+,++,+,+,+,+,+,+        ! ! ! !! ! !"!!"!!"!"#"#"#"# $##$#$##$$#$%$%$%&%%&%%&%&'&'(''((''('('('()(()()()*)*))*)*)*)*+**+*+*++**+*+,+,+,+,,+,+,+,+,+,+,+,+,+,+,++,,+,+,+          ! !"!"!""!"#"#"#$#$#$$#$##$%$%$%$%&%&%&%&%%&%&'&''&&' (''('('('((''('('()()()()()*)*)*)*)*))*+**+**+*+*++*+*+*+*++*+,+,+,+,+,+,++,+,+,+,+,+,+,+,+,+,       ! !"!"!!"!"!!"#"#$#$##$%$%$%$%&%%&%&'&'&'&&'(''('('((''()()()(()()*)**)*)*)**)*+* +*+**++**++*+*+**+,+,++,++,,+,+,++,+,+,+,+,+,+,+,+,+,+      ! !! ! ! !"!!"!"#"#""#"#$#$##$##$%$$%$%$%&%&%&%&&%&'&'&'&'&'&''&'('('('()()()()*)*)*)*)*+**+**++*+*+*+,+,+,+,,+,+,+,++,+,+,++,+,+,++,+,+,+      ! ! ! !"!!"!"!"!"#"#"#"#"#$#$##$#$%$%$$%$%$%$%% &%&&%%&%&&%&'&'&'( '(('(('(('()() ()(()()())()*))*))**)*)*)*+*+**+*+*+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+,+,++,++,+,+,++            ! ! !! !"!"!"!""!"#"#"#"#""#$#$#$%$%$%$%$%&%&%&%&'&'&&'&'('('('()()()(())()*)*)**)*)*)*)*+**+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+       ! ! ! ! !"!"!""!!""!"#"#$#$#$%$%$$%$%$%&%&%%&%&'&'&'&'&'('('('('()()()*)*)*)*+*+*+*+*+*+*+,+,+,+,+,++,+,+,+,+,+,+,+,+       ! ! ! ! ! ! "!!"!"!""!!"!"#"#$#$#$%$ %$$%$%$$%$%&%&%&&%&%&%&'&'&''&'&' (''(''(''(''()()()()*)*)*)*+*+**+*+*+*+*+,+,+,+,+,+,+,+,+,+,+,+        ! ! !"!"!"#"#"##"#"#$#$$#$%$%$%&%&%&%&'&''&&'&'('('()()()())()*)*)*)**)*+*+*+**+*+*+*+*+,+,+,+,+,+,+,+,+,+,++,+,+,+,+,++     ! ! ! !! !"!"!"#$#$##$$##$#$%$%$$%$%$%&%%&%&%%&'&''&'&'&&'&'('('('()(()(()*)*)*)*)*)*+* *+*++**++*++*+*+*+,+,+,+,,+,,++,++,+,+,++,,+,+,+,+,+,+,+,+,+,,+,+,      ! !! !"!"!"!"#""#"##"#$#$$##$#$%$%%$%$%&%%&'&'&'&''&''&'('('(('()()()()*))*)*)**)*)*+**+**+*+*+*+*+,++,+,++,,+,++,+,+,+,+,+,+,++,,++,+,++,++,+,+      ! ! ! !"!!""!"!"#"#"#"#$#$#$$#$%$%$$%$%&%&%&&'&'&'&'&&'&&'(''('('('()()()*)*+*+*+*+,+,+,+,,+,+,+,+,+,+,+,+,+,+,+,+,+      ! ! ! !! ! !"!!"!!"!"#"#"#"# $##$#$##$$#$#$%$%$%$%&%&%%&%&'&'&'&'('('('()()()()()*)*)*)*+**+*+**+*+*+,+,+,+,+,+,+,+ ,++,++,+,++,+,+,+,+,+,+,++,+        ! !"!"!""!"#"#"#$#$##$%$%$%$%%$%&%&%&%%&%%&'&''&'('('()())()()()*)*)*)*+*+**+*+*+*+*+*++**+,+,+,+,+,+,++,+,++,+,+,+,+,+,+,+,+     ! !"!"!!"!"!!"#"#$#$##$#$%$%$%&%&%%&'&'&'&'&'('('('('()()()())(()*)*)*)*)*+***+*+*+*+*++**+,+,+,+,+,+,+,+,+,+,+,+,+,+,++,+     ! !! ! ! !"!!"!"#""#"#$#$##$##$%$$%$%$%&%&&'&'&'('('('('(('()()()()()*)*)*) *)*)**)**))*+*++*+*+*+,+,++,+,+,+,+,+,+,+,+,+,++,+,+,+Ms~{`Hqpuv6oprvJ}uXj{s}gEqqy2bkz{|A~y~x`jqlsm>|u{j7msu~>su4g_qr<jxmi5XAZt>mSK?*x`vj.ny^yr~<"~f  +4 .#+ 1./'   1 #5 (6 14>   *"83      +';   * 1  $ "#21* )&/ : ,7,":#5& )6(* 6"(# + 85& )-'2%30  6$ 4 "                                                                                                                                                                                              Ѱ  ѻм                        !                            Ф ҹ Ҷ              !                                 Ѵ               !                                                                                                                                                        Զ                                                               ՜                                                                                                          ײ                                                      ڣ                                                        ٴ                                                  ڿ                                                                                                       ܫ                                                                                         ޿                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     $                                                                                   !                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  28BIMPatt8BIMFMsk 2X60.,((((&&$$"$$$$"$$"""""""""""XD>86664420000.00..00.0,,,.......,,..,.**,,,.**,,**,**,**,($&(*(,****,((***(**,(**(,*(*((*(*(*(*(((*(*(&&$&**((((((((((((((((((&(((((((((*((((((&$&$&((((&((((((((((&&&(((((((&&(((((&&&&&((&((((&$&((&&((&&(((&$&(&&&&&&(&$((&$&(&&&&(&$&($$(($(&$&&$""&"$&&&($$($&&,FOQH[WVV_fw]rdfotqpujxusft|yuoypmbn`i]fafQ^\P`ddaT_VW]]Y\^f[T]fU\]^[^U_SX^\Va]eSVY_}|u~vwxuwoabl^okljyksdpqiws~lx{xkx|svxxod~dsg`h^M<FD@A:;;?=>:C7AAGA>C???@CB7;>;:<:A8;D=@?AAAB>==>C@99CE?CACE]Xgaqqyyvs~|yr|zw1%-7'2/! ~mzuwytquwtltvn\fcY`aaPTNSG3($(&&&$&&&&&&&($&&$($$(&&&$"&""$&&$&($(($$(&$&(&&&&(&$&(($&(&&&&&&(&$&(((&&((&&((&$&((((&((&&&&&(((((&&(((((((&&'((((((((((&((((&$&$&((((((*((((((((('((((((((((((((((((**&$&&(*(*(((*(*(*(*((*(*,(**(,**(***((,****,(*(&$(,**,**,**,,**.,,,**.,..,,.......,,,0.00..00.00002446668>DX"""""""""""$$"$$$$"$$&&((((,.06XT60.,((((&&$$"$$$$"$$"""""""""""...,,..,.,,,,,(,.,,,,,,***,,*****,,**,**(**,**(**((*((*((*($&(*(*(((&*(((&((((*((((*((&((&(&(&(*(((&(&("&$&*&((&(&&(&&(&&((&&(($&((&&&((&&&(((&&&$&$&(&&&&&&&&((((((&&&(((((((&&(((&&$$&&&&&$(((&$$&&&&&&&&$&(&$$&&&$&&$&&&$&($$&&$&&$$&$$&$$(&$&&$&&"" $""$&$($$($&$3DMXT[\Xce\bibgpilvpr_vy{ux}|x{vrnrjhjjidgabbf\\b[`[Za]\X^Tbbc_S\]]UVZVRT^WY^`_ZRX\}s~kvbpa|kzyep|srtuwwsv}mpwllrenrnpi[GA>G?;9I>DG=>@<:=;F?:A?=DF?>4:68;E@@J><GFC>=CCDC;79BC8>6;U]lppqxzzyy|~5 , '&' 8=*?"5$18,0C  8% owuztvyymookcd_b\]aVVUJ<($&$&$$&$&$$&$&$$&$($$($&$""$ ""&&$&&$&($$&$$&$$&&$&&$$(&$&&&$&&$&&&$$&(&$&&&&&&&&$$&((($&&&&&$$&&(((&&(((((((&&'((((((&&&&&&&&(&$&$&&&(((&&&((&&&((&%((&&((&&(&&(&&(&((&*&$&"(&(&(((*(&(&(&((&((*((((*((((&(((*&(((*(*(&$(*((*((*((**(**,**(**,**,,*****,,***,,,,,,.,(,,,,,.,..,,..."""""""""""$$"$$$$"$$&&((((,.06TT60.,((((&&$$"$$$$"$$"""""""""""...,,..,.,,,,,(,.,,,,,,***,,*****,,**,**(**,**(**((*((*((*($&(*(*(((&*(((&((((*((((*((&((&(&(&(*(((&(&("&$&*&((&(&&(&&(&&((&&(($&((&&&((&&&(((&&&$&$&(&&&&&&&&((((((&&&(((((((&&(((&&$$&&&&&$(((&$$&&&&&&&&$&(&$$&&&$&&$&&&$&($$&&$&&$$&$$&$$(&$&&$&&"" $""$&$($$($&$0DMWSNVZ^\ZgfodhgfWqrsgt|vqrp}yp|pikjlxktcljgc\aZa`Yb^dc[iWYVaNRUROS\]g`\cd]YcOETOXSOLS|sfupprpwwfmgxcutgewzwwy~wv~w~}t{n|{czwzgcij_SDAE=9>?AB=7C>B;:9@D>;E:DCAD><@4;>G6;FCHA=J<>GC:<BDBBBC;:BVdgexovoqzyz|~}| "%  5%F>+=)9 ?7#2 *  wy||s|x~lkqlxqykrced_^YVKTZUJ<($&$&$$&$&$$&$&$$&$($$($&$""$ ""&&$&&$&($$&$$&$$&&$&&$$(&$&&&$&&$&&&$$&(&$&&&&&&&&$$&((($&&&&&$$&&(((&&(((((((&&'((((((&&&&&&&&(&$&$&&&(((&&&((&&&((&%((&&((&&(&&(&&(&((&*&$&"(&(&(((*(&(&(&((&((*((((*((((&(((*&(((*(*(&$(*((*((*((**(**,**(**,**,,*****,,***,,,,,,.,(,,,,,.,..,,..."""""""""""$$"$$$$"$$&&((((,.06TZ60.,((((&&$$"$$$$$$$"""""""""""^D>86664620000.02.000.0,,,.......,,..,.**,,,.*,.,**,**,**,*$&(*(,****,*(***(**,(**(,*(,((*(*(*(,(*(*(*(&&$&**((*((((((((*((*(((((((((((((*((((((&$&$&(((((((((((((((&&&(((((((&&(((((&&(&&((&((((&$&((&&((&&(((&$&(&&(&&((($((&$((&&&&(&$&($&(($(&$&&$""&"$&&&($&($(&6HRXRSa\^YMibdqzm~pqrqjr~q|r}sZ_mwplcofg`]db^c[WffmglXld\Y_IY[Z]][`^VXfNXVQYMcWa\jytn vqwthqllsvqyhi{|qtmvx|}{~|u~ywm}suhdllj_Y>:BB:=?<>@<CD<C<9?B=>A>DF@D?>>@C?>9AGBF@CC?D>:<BFAB@AC@FDZlmv}rz{}s|'  $&,* "$3)A@'L.$ #  y~~wb}ntjunain^Xd^RTR[WN<($(&&&$&&&&&&&($&($(&$(&&&$"&""$&&$&($((&$(&$&(&&&&(($&(($(((&&(&&(&$&(((&&((&&((&$&((((&((&&(&&(((((&&(((((((&&'(((((((((((((((&$&$&((((((*((((((((()(((*((*((((((((*((**&$&&(*(*(*(,(*(*(*((,(*,(**(,**(***(*,****,(*(&$*,**,**,**,.,*.,,,**.,..,,.......,,,0.000.20.00002646668>D^"""""""""""$$$$$$$"$$&&((((,.06ZV60.,((((&&$$"$$$$"$$"""""""""""""" "" " "                              " " "" """"""""""""""$$"$$$$"$$&&((((,.06Vù~umga\WSQMKJGFEEFGJKMQSW\agmu~ ξwg[QIEE IQ[gw ιuaRGEE GRau иiVHEE HVi¤iSGEEGSiɫiREERiɥcLEELcظmQEEQmسfKEEKfmMEEMmد]GEEG]ѥxSEESxӧxSEESxVEEVǔeGEEEEGe߱~SEEEES~գoKEEEEKoΚfGEEEEGfКdEEEEd֠kGEEEEGk߬rJEEEEJr뼂QEEEEQї_EEEE_wJEEEEJwӗ]EEEE]~LEEEEL~kEEEEk֙]EEEE]ύSEEEESɈPEEEEPłLEEEELĀKEEEEKȂKEEFGGHIJJKLLMMNNOOPPQQRSTTSRQPONMLKJJIHGGFEEK̈MEE FGHIKLMNOPPQRSTT SRQPPONMLKIHGFEEMՐQEE FGIJKMNOPRSTT SRPONMKJIGFEEQߞZEEFHIKLNOQRTTRQONLKIHFEEZfEEFHJLMOQRTTRQOMLJHFEEfwGEEGIKMNPRTTRPNMKIGEEGw؏PEEFHJLNPRTTRPNLJHFEEPaEEGIKMOQSTTSQOMKIGEEazGEEFHKMOQTTQOMKHFEEGzߘSEEGILNPSTTSPNLIGEESmEEHJMOQTTQOMJHEEmݓOEEHJMORTTROMJHEEOmEEGJLOQTTQOLJGEEmߕQEEFHKNQSTTSQNKHFEEQsEGJLORTTROLJGEsYEHJMPSTTTTTSPMJHEY؉JEHKNQTTTTQNKHEJmEHKNQTTTTQNKHEmWEGJNQTTTTQNJGEWݍJEGJMPSTTTTSPMJGEJwEFILORTTTTROLIFEwcEGKNQTTTTQNKGEcUEFILPSTTTTSPLIFEUKEGJNQTTTTQNJGEKGEHLOSTTTTSOLHEGڂzEEFIMPTTTTPMIFEEzpEEFJMQTTTTQMJFEEpgEEGJNQTTTTQNJGEEgaEEGJNRTTTTRNJGEEa\EEGKNRTTTTRNKGEE\WEEGKNRTTTTRNKGEEWVEEFJNRTTTTRNJFEEVVEEFJNRTTTTRNJFEEVVEEIMQTTTTQMIEEVVEEHLPTTTTPLHEEV\EEGKOSTTTTSOKGEE\`EEFJNRTTTTRNJFEE`fEEHLPTTTTPLHEEfoEEGKOSTTTTSOKGEEowEEIMQTTTTQMIEEwӠ݃EEGKOTTTTOKGEEݢGEEIMRTTTTRMIEEGMEEGKPTTTTPKGEEMVEEIMQTTTTQMIEEVgEEFJOSTTTTSOJFEEgxEEHLPTTTTPLHEExثEEINRTTTTRNIEEMEEFKOTTTTOKFEEM^EEGLPTTTTPLGEE^uEEIMRTTTTRMIEEuղEEJNSTTTTSNJEEPEEFKOTTTTOKFEEPeEEGLPTTTTPLGEEeɷEEGLQTTTTQLGEEMEEHMRTTTTRMHEEMdEEINRTTTTRNIEEdȼEEINSTTTTSNIEEMEEJNSTTTTSNJEEMiEEJOTTTTOJEEEiEJOTTTTOJEVEJOTTTTOJEVzEJOTTTTTTTOJEzKEJOTTTTTTOJEKmEJOTTTTTTOJEmGEINSTTTTTTSNIEGaEINSTTTTTTSNIEaEHNSTTTTTTSNHEZEHMRTTTTTTRMHEZEGLRTTTTTTRLGEVEFLQTTTTTTQLFEVEKPTTTTTTPKEVEJOTTTTTTOJEVEINSTTTTTTSNIE]EGMRTTTTTTRMGE]EFLQTTTTTTQLFEaEJPTTTTTTPJEaFEINTTTTTTNIEFmEHMSTTTTTTSMHEmKEFLQTTTTTTQLFEK|EJOTTTTTTOJE|SEHNSTTTTTTSNHESEFLQTTTTTTQLFEgEJPTTTTTTPJEgJEHNSTTTTTTSNHEJEFLQTTTTTTQLFEZEJOTTTTTTOJEZEGMSTTTTTTSMGEuEKQTTTTTTQKEuSEINTTTTTTNIESEFLRTTTTTTRLFErEIOTTTTTTOIErSEGMRTTTTTTRMGESEJPTTTTTTPJEzEGMSTTTTTTSMGEzYEJPTTTTTTPJEYGEHNTTTTTTNHEGEKQTTTTTTQKEfEHNTTTTTTNHEfMEJPTTTTTTPJEMEGMSTTTTTTSMGE|EJPTTTTTTPJE|bEGMSTTTTTTSMGEbMEIPTTTTTTPIEMEFLRTTTTTTRLFEEIOTTTTTTOIEfEKQTTTTTTQKEfۃREEHNTTTTTTNHEERĄGEEEJPTTTTTTPJEEGEEFLSTTTTTTSLFEEwEEIOTTTTTTOIEEwaEEKQTTTTTTQKEEa؉QEEGMTTTTTTMGEEQŊGEEIPTTTTTTPIEEGEELRTTTTTTRLEEEEGNTTTTTTNGEEpEEIPTTTTTTPIEEp^EELRTTTTTTRLEE^ؐQEEGNTTTTTTNGEEQőGEEIPTTTTTTPIEEGEEKRTTTTTTRKEEEEFMTTTTTTMFEEEEHOTTTTTTOHEErEEJQTTTTTTQJEErdEELSTTTTTTSLEEdݘXEEGNTTTTTTNGEEXәPEEIOTTTTTTOIEEPŚGEEJQTTTTTTQJEEGEELSTTTTTTSLEEEEGNTTTTTTNGEEEEIOTTTTTTOIEEEEJQTTTTTTQJEEEEKRTTTTTTRKEEzEEFMTTTTTTMFEEzrEEGNTTTTTTNGEEriEEIPTTTTTTPIEEibEEJQTTTTTTQJEEbߥ]EEKRTTTTTTRKEE]ڦWEEFMSTTTTTTSMFEEWէTEEGNTTTTTTNGEETӨSEEHOTTTTTTOHEESЩQEEIPTTTTTTPIEEQ̪MEEJQTTTTTTQJEEMɫMEEKRTTTTTTRKEEMȬKEELSTTTTTTSLEEKĭKEEFMTTTTTTMFEEK®JEGNTTTTTTNGEJ¯JEHOTTTTTTOHEJ°JEHPTTTTTTPHEJ±KEIPTTTTTTTTPIEKIJKEJQTTTTTTTTTQJEKȳMEKRTTTTTTTTRKEMɴMEKSTTTTTTTTSKEM̵QELSTTTTTTTTSLEQжSEMTTTTTTTTMESӷTEFMTTTTTTTTMFETոWEFNTTTTTTTTNFEWڹ]EGNTTTTTTTTNGE]ߺbEGOTTTTTTTTOGEbiEHOTTTTTTTTOHEirEHOTTTTTTTTOHErzEHPTTTTTTTTPHEzEIPTTTTTTTTPIEEIPTTTTTTTTPIEEIPTTTTTTTTPIEEIQTTTTTTTTQIEEIQTTTTTTTTQIEEIQTTTTTTTTQIEGEJQTTTTTTTTQJEGPEJQTTTTTTTTQJEPXEJQTTTTTTTTQJEXdEIQTTTTTTTTQIEdrEIQTTTTTTTTQIErEIQTTTTTTTTQIEEIQTTTTTTTTQIEEIPTTTTTTTTPIEEIPTTTTTTTTPIEGEHPTTTTTTTTPHEGQEHPTTTTTTTTPHEQ^EHOTTTTTTTTOHE^pEGOTTTTTTTTOGEpEGOTTTTTTTTOGEEFNTTTTTTTTNFEEFNTTTTTTTTNFEGEMTTTTTTTTMEGQEMTTTTTTTTMEQaELTTTTTTTTLEawEKSTTTTTTTTSKEwEKSTTTTTTTTSKEEJRTTTTTTTTRJEGEIQTTTTTTTTQIEGREHPTTTTTTTTPHERfEHPTTTTTTTTPHEfEGOTTTTTTTTOGEEFNTTTTTTTTNFEEMTTTTTTTTMEMELTTTTTTTTLEMbEKSTTTTTTTTSKEb|EJRTTTTTTTTRJE|EIQTTTTTTTTQIEEHPTTTTTTTTPHEMEGOTTTTTTTTOGEMfEFNTTTTTTTTNFEfEMTTTTTTTTMEEKSTTTTTTTTSKEGEJRTTTTTTTTRJEGYEIQTTTTTTTTQIEYzEGPTTTTTTTTPGEzEFNTTTTTTTTNFEEMTTTTTTTTMESEKTTTTTTTTKESrEJRTTTTTTTTRJErEIQTTTTTTTTQIEEGOTTTTTTTTOGESENTTTTTTTTNESuELTTTTTTTTLEuEJSTTTTTTTTSJEEIQTTTTTTTTQIEZEGOTTTTTTTTOGEZENTTTTTTTTNEELTTTTTTTTLEJEJSTTTTTTTTSJEJgEHQTTTTTTTTQHEgEFOTTTTTTTTOFEEMTTTTTTTTMESEKTTTTTTTTKES|EIRTTTTTTTTRIE|EGPTTTTTTTTPGEKENTTTTTTTTNEKmELTTTTTTTTLEmEIRTTTTTTTTRIEFEGPTTTTTTTTPGEFaENTTTTTTTTNEaELTTTTTTTTLEEIRTTTTTTTTRIE]EGPTTTTTTTTPGE]EMTTTTTTTTMEEKTTTTTTTTKEVEIQTTTTTTTTQIEVEFOTTTTTTTTOFEELTTTTTTTTLEVEJSTTTTTTTTSJEVEHPTTTTTTTTPHEENTTTTTTTTNEZEKTTTTTTTTKEZEIQTTTTTTTTQIEEFOTTTTTTTTOFEaELTTTTTTTTLEaEIRTTTTTTTTRIEGEGPTTTTTTTTPGEGՂmEMTTTTTTTTMEmEEJSTTTTTTTTSJEEKEEGPTTTTTTTTPGEEK߄zEEEMTTTTTTTTMEEzEEJSTTTTTTTTSJEEVEEHPTTTTTTTTPHEEVEENTTTTTTTTNEEEEKTTTTTTTTKEEЇiEEHQTTTTTTTTQHEEiEENTTTTTTTTNEEMEEJTTTTTTTTJEEMEEGPTTTTTTTTPGEEEEMTTTTTSTSTTTTMEEȊdEEJSTTTTTSTTPRNMOIKJHKIHKJJMLLOPOTSRTTTTSJEEdEEGPTTTTT%STPQMIJDC@==8:67764746855:7:=>@CGHJQPQTTTTPGEEMEEMTTTTTSTOLKCA<:64403/00/0//0//11/466:>CDJORQTTTTMEEMEEIRTTTTT RPJI@>67211/0/./2459@EHMRTTTTRIEEEEFOTTTTT RSLIA>642/0/0/0/0//00//0/./ 0/.279>ELQQSTTTTOFEEɍeEELTTTTTSTMHA;630/0/0/0/0/0/0/0/ ./0116=DINQTTTTLEEeEEIRTTTTTSNGB951010 /0/00//0/0/0/ .//./../17>CKOTTTTRIEEPEENTTTTRSJE:701010/0/0/0/.//././.49>FMSTTTTNEEPEEKTTTTN H@:110110100101010010/0/00/0/0/./ ././25;BLRTTTTKEEEEGQTTTTQOG>6310101001010/0/0/0/0/0/0/./././038@KRTTTTQGEEՐuEEMTTTTNG=621010 101011001101010100//0/0/00/0/00//0/0//00/0/./././16=JPTTTTMEEuEEJSTTTTSOF<611010100101010/0/00/0/./05=JOTTTTSJEE^EEFOTTTTOH<42211010100101010/0/0/0/0/0//0/0/0/0/0/0/./.17AKQTTTTOFEE^EELTTTTSRI>812211010101011010/0/0/0/0/0/0/./39EKQTTTTLEEMEEHQTTTTRNC6311211 0101001101010/0/0//00/0/0/./././4:FPSTTTTQHEEMEENTTTTPF;121212121210101010101010/00/0/0/0/././5?JTTTTNEEEEJSTTTTK?7221212121212101 011010011011010/0/00/0/0/0//0/./8EOTTTTSJEEؔxEEFPTTTTSQG8421212121221210101010101010/0/0/0/0/./1>KRTTTTPFEExEELTTTTRN@53221212121210101001010 /00/00/0//0/0/0/0/././2;FOSTTTTLEEŕgEEHQTTTTQJ:321212112121211212121010101010/0/00/0/0/./.5@LSTTTTQHEEgEENTTTTOE923212212121221210101101010/0/00//0/00/00/.2MTTTTLEEMEEHQTTTTPF9232323232212121010101001011001010101010/0/0/./2?JRTTTTQHEEGEEMTTTTOD932323233232121212121212101010101010/0/00/0/00/0/./1:HTTTTMEEGݙEEISTTTTOA83232322121212101 01001101010/0/0/0/09HQTTTTSIEEEENTTTT OA53223232323232323223323212121212210101010/0/0/0/06JRTTTTNEEӚwEEJTTTTPA53 23223322323232321211212121211210110101010100110/0/0/7FQTTTTJEEwEEFPTTTTQA443232323232121212122121010110101010/0/0/0/0/0/6IQTTTTPFEE˛oEELTTTTSA43343432323323232123243164694;859656413210101010100110 /0//0/0/00/0/0:FRTTTTLEEoEEGQTTTTRA4343432332323323232323266:>?BCFIFLJKJJILHFFD?><854310101101011010 /00//0/0//0/0/0/09GRTTTTQGEEÜfEEMTTTTRE4343434323332323234!:DPRTSQLC;31010010101010/0/ 0//0//00//07ETTTTKEEVEEFPTTTTQD7434343434334336:GMTSQK@:4101010/0/0/0//09MSTTTTPFEEVEELTTTTSH954343433;CLSTOJA83101010101010/1>NTTTTLEEVEEGQTTTTM>4545434343434434336@KRTNG>510101010/0/0/0/3EQTTTTQGEEVEELTTTTPB64545455454543434:HNTMD710101010/08FQTTTTLEEVEEHRTTTTSH744545545438@MTRK=5101001010110010010010 /00//0//0;LTTTTRHEEVEEMTTTTL;545445454545544549FPTND8310101010/0/04?RTTTTMEEVEEHRTTTTPA65454545454546=ISTTPG:31 01010011010/03FSTTTTRHEEEVEENTTTTSE8545 45544545545454547@LTTJ?31010110/0/0141121210101 0100104ERTTTTTOEШzEJTTTTTI76 565665665665656559GTTSJ=212121010102=NTTTTTJEzEOTTTTTP?767656567DQTT H82122121121010105GSTTTTOEکEJTTTTTI;767656565?NTTPC51212121210100>NTTTTJEGEOTTTTTQA7676565659JSTTP=3212121010110101017ISTTTTOEGEJTTTTTK<676767676765658DRTT I7112122112121010103AQTTTTJEKEOTTTTTSD7677667676=OTTQC71212122112121017LTTTTOEKEJTTTTTO?676767676767668HTTO?212121015FRTTTTJEUENTTTTTL9667676776766776767@QTTRG8212121011012>OTTTTNEUEISTTTTTSD7676767767676:JTTPC4212212122121221201017JTTTTSIEcENTTTTTP<787677676776CQTTJ83212121212103BSTTTTNEcEISTTTTTJ87676766767:LSTTQA52122121211;PTTTTSIEɭwENTTTTTRB7877876767667AQTTL:21212121221210117ISTTTTNEwEHRTTTTT O=778778778787676776769KTTQB42321212121221014CSTTTTRHEݮEMTTTTTJ:78787878?QTTSK:232121212121?OTTTTMEJEGRTTTTTSE87878787787879FTTPA33233212112121127LSTTTTRGEJELTTTTTQ?78787887878787=MTTSI932323212121221214FQTTTTLEWEGQTTTTTN;88778787787878CQTTP;53321212112121213=STTTTQGEWELTTTTTI98787 8778878787:JSTTRE62323232121211=PTTTTLEmEFPTTTTTD8787878787?OTT M:32232323232321128JTTTTPFEmEKTTTTTR?88987878ERTTO?423232321212122HRTTTTKEرEOTTTTTO<8987878 7877878;JSTTSF632323232121213AQTTTTOEJEJTTTTTK:8898987878>MTTK:33232323221=OTTTTJEJENTTTTTE:98989898CQTTO?323232323211221:LTTTTNEYEISTTTTTRB98998898988987:FSTTSD53232323232215ITTTTSIEYEMTTTTTOA89898989989898898;JTTI932332323211124GSTTTTMEósEGRTTTTTM?989898989898>LTTM<32332322CRTTTTRGEsELTTTTTL>98989889889898@OTTP?43233232 32322322322?QTTTTLEߴEFPTTTTTSK<98989898:ARTTRC534323233232322=NTTTTPFEQEKTTTTTSI989989898898989899ETTSH6334432332323223232223223;LTTTTKEQEOTTTTTSF989898989ITTI:3443232332232227MTTTTOEmEITTTTTSB9:9898989899:MTTL<34344323323228ITTTTIEmENTTTTTQA:9::9:989898NTT PA53443433443432323223FRTTTSTSTTRHEOELTTTTTN@9:99::9::9:99:9:989ANTTRD44343434323325EQTTTSTTSTPQQLPLKNHJPJNPSQRTTSTTLEOEFPTTTTTO?:9:9:9:99::9AOTTD4334343432332336ARTTT#STRNOGHC@?8;65704434536;8EMQTSTTOE߸EISTTTTTJ>:9:9:9:9:9:9DQTTJ6434343434323234?PTTSLI<8/')('('('('('(-02;EKPQTTSIESEMTTTTTK?::;:9:9:CPTTH94 3434434344332334=QTTSPH>50'(('(('('()*+4=DJPTTMESEGQTTTTTM<;:;:9:99:9;AQTTSI94454343434334343>QTTSRID52)*(('('('(''('('(('/6?EMTTQGEĹzEKTTTTTK<;:;:;:9:9::9:9:BRTTSL84343433?PTTNJ;5+)('((('('('('('('((,19AJSTTKEzGEPTTTTTJ=:;:;:9:99:9CQTTL7434334?OTTRPE;/*('('('('('(''(+.6AIQTTPEGEITTTTTSK>::;:;:;:9:9APTTI854454343433434>MSTTNH:/+('((('('(*.6AJQTTIEaEMTTTTTSM=:;;::;:;:?PTTH:54545434344334343;:;;::;:@KTTSH545454543443434463 537<;:; :;::;::;:;;:0+()(()(''('('('('('('(,;GPTTIE¼wEMTTTTTNA;:; :;:;::;=GSTTQA654545434343234;?AFKPRRTTPI8+*)()()(('('('(,4BMSTTMEwGEGQTTTTTOD<;<;<;:;:;:;:;:CFJNTTSTTNC3)()()()('('('('('('(15454434343 232327::AGLNOTTL=.()()()()(()(('('('(+6HRTTKEfEOTTTTTRD<;<;:;::;:@NTTL;545454454544434343432332323239>?FIPSQTTRJ9,)()()()()()()(('('('('('('('*0ERTTOEfEHSTTTTTRG=;<;<;;<;<;:;:>LTTSI8565 455454545454434343233232 32473;;<;<;=HSTTRG765454545445444343434343432323232325<;BEJOOTTPD2)())()()((('('('('('('('(,BNTTLEZEFPTTTTTJ@<<;;<;<;<;<;:?FHOTQTTPA2)()()()()((('(('('('('('('('(0=LTTPFEZEJTTTTTN@<;<;<;;<;<;<;<;ANTTP;65656565454454454 3434344334343232 474;AEKKPTSTTPA/)()()(()()(('('('(('('('(,:NTTJEտENTTTTTOA<;<;<;<<;<;<;=LSTTL76565654554543434343232332332125:9@DJRORTTSA.*)*)()()(()()('('('('('('(''('('(,8KSTTNEQEGRTTTTTQC=<;<<;;<;<;<;;<;=GRTTE6565454545434343432323212 426=?GHNSRSTTC.*))**)*)()()()()('()'()(()('('('(*8LTTRGEQEKTTTTTRG=<;<;<;;<;=<<=<;<;<;<;<<;;@KSTTN:6565655454544543432332323212121213129;>CIROQTTF0*)()()()()(,54=>DGEIJGNIKKFCF?=87/++*(('('():LSTTOEMEHSTTTTT LA<=<<=<<=<;<;<;;=FRTTI765656545455454343233232321212121 324;@DHKSTSTT H2+*)**)**)()()()()(()))((,,68DDLPOTRTTRT STTRTRMNHC<53,('('('('('('('(+:JTTSHEMELTTTTT PA=<==<=<<=<=<;BQTTRA76 566556565656545454343434343232332121212121576?EJNNTTK3)*))*)**)*)()()()*,8=FKRRT STRLHA;2*()'('('('('('(+;MTTLEEPTTTTTPE=<=<=<=<;<;>KSTTO:7656565655 45455454554343443433432323232121212121 011207=>DHNQPTTO7))*)*)*)*)())()())((-3DHOMRTTQ=*)*)*)()(.6CKTSTSPG>/)('('()3GRTTMEEFQTTTTTNA=<=<=<<=<=<=<>ESTT SJ;7677667656565656565454543432321210101010010205<=CGLTPSTTSA-*)**)*)+6ANRTTSRH<-)'('('('(6HSTTQFEKEJTTTTTQE=<=<=<=<=<<==<?NSTTPA767656565565654554545434334323323232121010 1527@AKJOTSSTTRF1*)*)*)*)+1@JTTSQF:.('( '(('(''(,:MTTJEKENTTTTTRJ= <=<=<=<<=<=<=<==<=GQTTJ<776767667667667656566554545454343434323223232321221210101010177>BGNMQTTL7*)*)*)*)*)*)).9HQTTRN@3+('('('(/ARTTNEEFRTTTTTK@=<=<==<<=<=<=<AOTTSC87676676566545545454344344343232323212121210101010149BJJOTTSTTSE0*+*)*)*)*,6ERTTLA2('('(9MTTJELENTTTTTSG>=>=<= <==<=<<==<>=<=<=<=<=<==<==EQTTK;767676765656565454543433432323232121121212101010110/0//02017=BEKQRRTTTQ=**+**+* )*))*)*)*.>LTTRL:*('('('('('(4HSTTRGEPEKTTTTTPD?>=>=>=>=<==<=?JRTTPB878767656576566545434343232321212112101010/0/246=>=>=<==<=<COTTSI:778787876767676766768=<:6565454545445434343432323232121212101010/0/0//499?GLQPSTO8,**+**+*+*)*)*0BPTTS=/('('('(0ESTTNEEGRTTTTTSLA>=>=>=>==>=<=<>GQTTO>878788767676 BLKKHC>@:78765454554343434343232321212101010/0/0/0 2/6>AFIOTRSTSE.+**+*+*)**)/@RTTN@0'('('('()7LTTRGESEKTTTTT QE?>>=>==>= >=>=>==>=>>=<=@LRTTQD8788787876766767769ISTSTSONKHE?A<5785454543433434323232321210110101010/0// .1559AENKQTSTM6*+*+*+*,@RTTN@/('('('('('((-AQTTKESENTTTTTJ@>>=>=>=>=>=<=<>DMTTSI:878787677667676776?OTSTTOONIEC?=95845434343343232321212122101010/0/0/0// 0.0:8BEIQNSTRA,+*+*+*)*)->RTTSN?,('('('(*7KSTTNEEGRTTTTTNC>=>==>=>=>ERTTO>8767 676767667FST STTPNSJDDA<987454543434334323232121211221010/0/0/0//. 2/6<>HGOTSSTL5+*+*)=PTTN:,('(('(('('(('(('(,APTTRGE]EJTTTTTQI>?>=>=>=?IRTTQC87887787876766:NT QOPMGCD>8;84454343432121011010110 /00/00/0///./ .//.064:@ENLQT@-+*++*+*++*)*8NTTI7+('('()4LTTJE]ENTTTTTMB?>=>=>>=>==>>=>=@KRTTSG:9878877878767676767BTT QRNNJCE?:9945543432323233232121212212101101010/0/000/.//./. 0.08:ABJQPRTN3+ *++**+*+*+*4KTTSH6('('((-BSTTNEEGRTTTTTQH@>=>==>=>=>=>=CLSTTSK<98788787878769LTTSTTQRQMHID?=9;445434334323232321212112101010010010 /0/0//00/000/././. 2058?GGNTTSTC,+*++*+*+**++*/ETTSB1)('('('('(5KTTRGEkEJTTTTTLA>>?>=>=>=>=>ENSTTL>989878877878767@QTT RQTOILEB<;:543432323212121 0110011001010/0//0/./. /--34:=EKLOTO8+*+*+*,?RTTOA.'('('(('(-DRTTJEkENTTTTTQE??>?> =>>=>=>>=>=>=>=>?EOTTQ?9898787876:JTTT SRTNKIHC;>:564343233232323212212101011011010/00/0/././././. 0-04:>AIPSQTSG/++,+*++*+**+7NTTN7('('('*:NTTNEEFQTTTTTLA??>??>=>=>=>==>=>EQTTO?98988989878787787APTTTSTTPNIJD>><7363432321212212121211001001010/0/00//0/0/././. /016AEILRTSTP=+,++,+*0FTTRG.('('(/HSTTQFE~EJTTTTTOG>>?>?>?>=>=>>=>=>GQTTOA89898787879JSTTT STSQMNICC==836323232121210101010/00/./././.-..-. -168=CIONSTK3+,+,+*+*+;RTTS?,('('('(,>PTTJE~LEMTTTTTSMB?>?>=>=>=>>==?FPTTOB:998998998998898987878787@RTTS TQMQJDC@=56532332121212101010/00/000/././.-..- ./.2:??>?>=>=>=?GOSTTNC:98987887:KTT ROONGAB>88642323212122101010/00/0//0/././.-.- .--.-.318>BIIQTO9,+,+*+*-ASTTQD/('('('(-ERTTQFEEITTTTT MC?>??>?>??>??>?>?>=>=>>EMTTMC:9:989898898987878BRTT RPOMICD@:78434212212121010110/0/0/././.-.--.- .-055=AIQNRTF2,,++,+,+*++*+5MTTN8*'('((''('():OTTIE]EMTTTTTSH?>?>?>?>=>>?CLSTTTSKB9:9 899898989898787.,+,+*++BTTSD/''('('('(3MTTME]EPTTTTTND?>?>?>>?>?>=>?ALSTTRJ@:9:9 8988988989879FSTTSPTNIIF@<9853232211221010100/0/././.-.-,--,,-219;BKIPTTSTM7,+,+,+*+*3MTTP:*('('('(0BTTPEEHTTTTTRKB@@?>?>?>?>?>=>==BIQTQH>:9:9898989898788?PTTSRTRJHIB:=9522321010/0/0//0/.//.//./.-.-, .,046>?HNNE1,+,+,,+*,@RTTSD/('('(*:STTHEwELTTTTTPF@@?>?>?>?>?>>??>=GMRTND=:9:9:989889899878;HTT SRRMIHD>9;52421010100/0/0/0/./.-.-.-.--.-,-,-,-,-,/-17<8-,+,+,,+,,++,+,+*++*2HTTL9)('('('(7LTTLEwJEOTTTTTSMC?>?>?>?>??>@CJPSTSIA=:9:9:989989879CQTT RTQLMGDA<=5310100/0/0/././.-..-.-.-,-,-,+,++,+,+*,:PTTRB-('('('-HSTTOEJEGSTTTTTRI@@?>??>>?>?>?>=>>=BFMRTROF=;:9:9898989;MTT RTQMOKG@@<6323101010/0/././/.//.-.-.-.-,-,-,-,+,+/CTTK3('('(*BQTTSGEEJTTTTTPE@?@@?>?>?>>?>>?CJRSTPJB;:;:;:9::9::9::9::99:98998HTTSTSOMOG?B<84320101000/0/0/0/./././/.-.--.-,--,,--,-,+,++,+,,+4LTTS:+('((6QTTJE_ENTTTTTLE?@@?@?@?>?>?>??>?>?>>?EKRTSRLE?:;:;:9:989898:DRTT PMPHCA?:47300/0/.-.-..-.-.-,--,-,--,+,++,,+,?>?>>??>>@FLQTQOF?;::;:;:;:9:9:9::9:98988?NTT OPNIH@A;4650010/0/0/0/.//././.-.-.--.-,-,-,+,,+,+-DRTTM5'('('(('('(0GSTTQFEEITTTTTPHA?@?@?@?>?>>?BGLPTSMG@<;:;:;:9:9:9:9:98989?>?>?>>?>?>?@EKOTSQMF@><; :;:;;:;:;;:9:9:989;ERTTRQRLEIB99740010/0/./././/.-.-.-,-,-,-,+,+,+:MTTSE-( '(('('(()=RTTLEQEPTTTTTRLD@@??@?@?@@?@@?>?>?>>?>ACHMSTSOJCA;<;:;:;:;::;;: 9:99:99:9:989:BOTTTR SMGGD>7:5020/0/./../.-.-.-,--,-,,-,+,,+,,+->QTTJ4)()8PTTPEQEGSTTTTTRKC??@?@?@?@?@?>?>?>>>?>>?>?EIOQRTS NLEC==<<;<;: ;::;:;::;;:9:9:9=MTTTRTRMLGDA9;7/010/././/./.-.-..-..-,-,-, +,,+,++,0BTTP8)('('(5MTTSGEEKTTTTTPHA@?@?@?@@?>?>?>>?>?>BEILNRTSTRTONIFB?=<;<;<;:;;::;;:9:9:9:9:9>?>>?>?>?>@BCEILNNRTST STTSTQQOLJFE@?<;<;<;:;:;:9:9:9?>?>?>?>?>? =ACCEGIIKNMONPMNMKLJGGDC?>=<;<;;<;<<;<;<; :;::;::;;:;:;:9:9;FRTTTPMMKC=?9242..0/.-.-.-.-.-.- ,-,--,--,,-,+,+,+6OTTF0('('(+DSTTQFEJEITTTTTSNEA@?@@?@?@?@? ?>?>??>??>>?>=>>=??@@CBADABB@>?=<=<==<;<;<;<; :;::;:;;:;:;:;:9:STTIEELTTTTTRLE@?@@?@?@?@?>?>??>?>??>=>=>=<=<=<=<=<;<;<;<;:;;::;:9:DQTTT STTQQPJEF?:634.-.-.-.-,-,+,+>STTP5('('()=RTTLEkEOTTTTTRKD@A@?@@?@?@?@?@?>?>?>?>?>=>=>=>=>=<==<=<=<<;<;<;:;:APTTTROSLFG@=654.-..--..- ,-,,--,-,--,+,DRTTP=)''('('('();PTTOEkGEGRTTTTTQKD@A@?@ ?@??@?@@?@?>?>?>?>=>=>=>=>=<=<=<=<==<;<;<;;<;<;:;:;::;:CQTTT RQTMHED>494../-,-,,--,+,,++/ERTTS>)(('('(6PTTRGEGEJTTTTTQLDA@?@??@@?@?@?>?>?>=>>=>=<=<==<;<;<;:;:BPTTT RSSOKEF?9761-0-,--,-,1DSTTS>)('('(4QTTJEEMTTTTTRL@AA@A@@A@@A@?@??@?>?>??>=>=>=<=<=<=<;<<;<<;<<;<;: ;:;::;::;BNTTT RSRPJKE>>881-,-,-,-,/DTTS@,('('(('('('6NTTMEdEPTTTTTSKEA@A@@A@?@?@?@?>??>??>?>=>=>=<==<=<=<;<;:;:;CNTTT SRTPJNF6.--,-,-,,-,.ITTE+('(5LTTPEdEGSTTTTTKDAA@A@A@?@@?@??@??@?>?>?>>?>=>=>=>=<=<=<==<=<;<;<;;<;<;:;=ENTTTRC/-,-,--,,-,1HTTC+('(2LTTSGEEJTTTTTRLFA@A@?@? @??@@??@??@?@?>??>?>?>>?>>?>=>=>= >=<=<=<<=<=<=< ;<<;<;<;<;<;>EOTTTSC/-,-,-,1CTTB.('('(1MTTJEENTTTTTSMGA@A@AA@@A@A@@?@?@?@?>?>?>=>>=>=>=>=>>=<=<;<;;<;;<;:;;>HPTTTS@.-,-,-,0DTTE/('('(4LTTNEfEQTTTTT RPHA@A@@AA@AA@A@@A@@@?@@?@?@?>?>>?>?>=>=>=<=<;<;<;<;@IQTTTR@0.-,-,-,-,.FSTTSH+'('()5LTTQEfGEHTTTTTSQHCA@AA@A@AA@A@?@?@?@@?@?>?>?>=>>=>==>=<=<=<;<;;<;;<;AKRTTTRC/.-,-,-,-/CRTTD*('('(('()3LTTHEGEKTTTTTSKDA @AA@AA@A@@A@A@?@@?@??@? >??>?>??>?>=>=>==>=>=>=<=<=<<=< ;<<;<;;?>??>?>=>>=>=<=<;<;+('(6QTTNEoEQTTTTTSOIDA@A@AA@ ?@??@?@??@?> ?>??>>?>>??>=>=>=>=>=<==<==<==<==<<=<;AKQTTTD2.-,-,--,-=OTTQ>*('(9NTTQEoKEHTTTTTQLFA@AA@A@?@?@?@?>?>?>=>=>=<=<>EOSTTTG2..-,-,--,-,-,,-6MTTQ=)('():NTTHEKEKTTTTTSPIDAA@A@@A@@A@?@@?>?>?>=>=>=>=<=<=<==<=<=AIQSTTTI2..-,-,2MTTQ7('(*:QTTKEENTTTTTQLFBA@A A@@A@A@A@A@?@?@?>=>=>=<=<=<=<=<@EMTTTI6-.-.-,-,4FTTO0('('(*=STTNE~EQTTTTTROICBBAA@AA@AA@A@?@?@?@?>?>?>?> =>=>>=>=>>=<=<==BJPTTTN8.--.-,--,-BSTTJ,('('(BSTTQE~SEHTTTTTRMHCABA@AA@A@A@@AA@?@?@@?>?>??>?>?>=>=>=>=<>?GPRTTTQ8-..--.-,-,?OTTB*''('('(+GSTTHESEJTTTTTPKFAABAA@AA@AA@A@?@@??@?@?>?>=>==>=>=>=AELSTTTP=/-.-,-,--,-,6MTTS<('('(0ITTJEEMTTTTTSPJFBABBAABA@A@A@A@@?@??@?@@??@?@?>?>?>=>>==>>=?EKPTTTS@/-..-,3HSTT O5)'('(('(('('('(4ITTMEEPTTTTTSPJGBBAA@A@A@?@?@?>?>?>=>=>=@DJRSTTTC2.-.-.-,-,/BSTTJ/('('()6LTTPEeEGSTTTTTROJFCABA@A@A@@AA@@A@?@?@?>??>??>?>?>=>==>==>>=>=ADLOTTT SH2-.--.-.-,--?>?>?> =>==>?AGKRSTTTL5..-..-.--.--.-,5HTTR8*('('('((+=TTJEGELTTTTTRPMHEBA@A@A@A@?@?@?@?@?>??>?>?>?DGNQTTTP:.-..-..-,-/CSTTL3)(+DTTLEEOTTTTTTSQOJGCA@AA@A@?@?>?>?>?BDLNRTTTRA0.-.--.-,.8NTTD,((''('('(('(/KTTOEEFRTTTTTTSRMJECCA@A@A@A@A@?@@?@@?@@?@@??@?>??>@AEINQTTTC2.-.-,--4FSTTR:)'('('(4QTTRFEVEHTTTTTTPMHFEBA@A@A@?@? >??BAFINPTSTTT SH6..-..--.-,-0=RTTN/('('();STTHEVEKTTTTTTRPMKHEDCBA@A@A@A@?@?@?@@?@?@?BBEGKNQTTTSO8/.-.-.-,-5LTTSB)('(*DTTKEENTTTTTTSRPMJHCA@A@A@?@?@?@?@ ?@@BDEIJNOSSTTTP@0..-.-.-.-/APTTP3'('(.MTTNEEQTTTTTTSPEBA @A@AA@A@AA@?@AGLLPPSSTTTSF3.-.-.-7KTTSE+('('('(6RTTQExEGSTTTTTTRDABA@A@A@A@@AA@EPTTTI7.-.-1@RTTN6('()?TTSGExSEJTTTTTTPGA@AA@A@A@?GPTTTP=/.-..--.--.-3HTTSB-('(-ITTJESELTTTTTTPFBABA@A@FPTTTSD2.-..-.-,-->PTTN4)('(('('('(4PTTLEEOTTTTTTQFBBABA@A@A@AESTTTK7//.-4ERTTA*('('(+>TTOEEQTTTTTTPDBBABABA@AA@@A@A@@A@GSTTTP>/.-.-.-.-,:KTTJ/('(/HTTQExEHTTTTTTODBABABA@A@@A@AA@A@A@A@@JSTTTSG4.-..-.-1@OTTO9*('()8PTTHExSEJTTTTTTMEABBABABA @AA@@A@A@AJSTTTO7/.-.-..-,3DQTTSB-)('(',CSTTJESEMTTTTTTOEBAABABA@A@HSTTTRA3.-.-.--.-.7KTTI4())('('(4LTTMEEOTTTTTT OCBCBAABABAABABA@A@AHTTTSL6.-.-.-.-,--0:OTTN8+()('(('('(*@QTTOEERTTTTTTNCBABABA@A@ALTTTO>0//.-.-.--.-/APTTS>+()('(1JTTREEHTTTTTTLCBCBABBABBABBAABABA@AMTTTSI5./.-..-.-,-4CPTTC,()()('('=QTTHE]EJTTTTTTSKCBABACMTTTR=1.-.- .--,--.5EQTTF-))(()()('((-ITTJE]GEMTTTTTTSLDCBCBAB ABAABBAABBA@AACLTTTSG6.-.-,-.7DTTG1*)()():RTTMEGEOTTTTTTMCBCBBCBABABABABLTTTP<0./.-.-/4ISTTJ2)()()('((''('(/FTTOEEQTTTTTTJCBCBCB ABAABAABABABOTTTG8//./.-.-.-.-.7IRTTSI5()()()('('('()8PTTQEEGTTTTTTIDCCBCBBCBABABADPTTTP?.-.-,4FPTTQG4)()()(()(/HTTGEmEITTTTTTRJDCBCBCBBCBABABBAEOTTTSI60./.-.-.-.5DOSTTPD4))()()()()()('(*=STTIEmMELTTTTTTRJCBCBABABAENTTTQC3/./.-..-.-,--4?KTTNA1)())()()(()('(1LTTLEMENTTTTTTSJCDCBCBABAEPTTTK80/.//.-.-.-,1:HPTTJ<.)()()(())()(,BSTTNEEPTTTTTTSHDDCBCBCCBABADRTTT RD6/../../.-.--.-/5CNSTTRF6*)() ()())(()()()()()8PTTPEEFSTTTTTTQGCBCBCBAGRTTTO?/.././.-.-.-2=NQSTTL>2)()()(0ITTSFEEHTTTTTTQIDCDDCBCBAHPTTTSK7/./../.-..-.5BLSTT NG6-*)*))*)()()()()(,?STTHEfEKTTTTTT RHCCDCDCCDDCBCBCBCBCBEQTTTSF5/./.-.-.-19DNTT SI4*)*))*)()()()2JTTMEKEOTTTTTTRFDCDCDCCDCBCBBCBCCBISTTTL;1//../.-.-.-.-,.19CMTRFA2-*)*))*)())(()(-DTTOEEQTTTTTTOFDCDCDCDCBCBCBCCBKSTTTSH9/. -..-.--.-.-,-,-.7?ISRSTSTKE:2+*)**))*)*)()(()()()()@RTTQEEGTTTTTTNGDCDCDCBC BCBCBCBBCKRTTTQE5././.-..-.-,-,-.3;CLMPTSTOMF@6/*)*)*)()())(*:PTTGEEITTTTTTPGDCDDCCDDCDCDCDCBCISTTTPC4../.-.-.-..-.-,--,--,,, -,/4:ADKPQQT STSRPKJB=33*+*)*)*)*)())())()()6MTTIEmEKTTTTTTPEDCDCCDCCDBCBCBCBCBJTTTN>2..//.-.-.-.-,--,-,-,0258?CDHMLLQOOTOOPKLKFF?<73/*)*))*)*)()(()3LTTKEmQEMTTTTTTNEDCDCDCDCBCCLTTTSL<2/./.-..-.-.-.-,-,-,+,-++/225969=<:=898562./+-+*)*)*)()()()()(3KTTMEQEOTTTTTTMFEDCDCDCDCBCMSTTTI=1/.-.- ,-,-,,--,--,-,+-,+.++.++,+*+**++**+*+*+**)*)*)*)()0HTTOEEQTTTTTT SMFEEDEEDEEDCDCCDDCBCCDLTTTRJ<.//.-.-,--,+,+,+,+*+*+*+*)*)*))*) ()())())(1ISTTQEEFSTTTTTTSNFEDEDCDCDCDCELTTTSI=/../.-,-,-,+,+,+*+*++*+*)*)().DRTTSFEEHTTTTTTNDEDEDCDCDCDMTTTRP;0/.//.-.-.-.-,,-,,-,+,+,+*+*+*+**+*)*)*)*)(.ARTTHEEJTTTTTTLEDEDEDEDEDCDCDCDCDPTTTRM;3./.-.--.-,--,--,-,+,+,,+,+*+*+*++*)*)*)*)*)*)*)().@STTJEcELTTTTTTJEDED CDDCDCCDCDCCEQTTTO=5./.-.-.--,-,+,+,+*+*+*+*)*)*))*)*).BSTTLEcLENTTTTTTSLFEDEEDEDEDCDCDCFNTTTLA5./.-.-,--,-,+,,+,+,+*+*+*)*)*)*1BTTNELEPTTTTTTSLEDEDCFOTTTNB2/../.-..-.--.--,-,,--,+,++,,+,+*++*+*+*)*)**)+2ESTTPEERTTTTTTJEDEEDEDEDEDEDCDCFPTTTOG61/./.-.--,-,+,+*+*),7HSTTREEGTTTTTTSJEDEDEDDEDCDCDDFRTTTQH60././.-..-..-,-,-,+,+,+,+*+*+**+*)**)*) *)*)*)).;LTTGEEITTTTTTQHEFFEFEFEDEDEEDEDCDIRTTTJ=2/.-.-.-.--,-,-,+,+*+*+*)*)*1@PTTIEEKTTTTTT QKEEFEEFEFEFEDEDIQTTTM@51.-.--.--,-, +,+,+,,++,+,,+*+*++*)*)*),7FQTTKEiEMTTTTTT SJFEFEEFFEEFEDEDCGRTTTSNF92/.-.-.--..-.--,-,-,+,,++,+*+*+*+*+*)*)*)*/50.-.-.-,-,,-,+,+,+,,+*++*+*+*+*+**.6ANQTTHEEJTTTTTTQHFGFEFEDKTTTSNF?60.--,--,,-,+,++,+,+,+*++**++*+**/6AKTSTTJEELTTTTTTNGGFGFEFFEDNTTTNG>72.--,-,--,-,+,+,+*+*,.9AOPTTLEiEMTTTTTTNGFGFFGFEFEFFEEFEFEDFMSTTT SOHA:4.-..-.-,-,-,-,-,+,,+,+,+,+*+*++,,59EMTTMEiSEOTTTTTTNHFGFGFGFEFEFMSTTTQKF>82.-,-,-,+,+,,+*+,38AJQSTTOESGEQTTTTTT SOHFFGFFGFFGFEFEFEEFEFLTTTRNLE>802.-.-,-,-,-,+,+,+,+,+0/;?HMSTTQEGERTTTTTTOGFGGFGFEFEFEFEMTTTSRQKD@:72-..-,-,+,,++,++-+-24=@KMTRTTREEFTTTTTTLGFGFGFEFEFPTTT QLKE?;451,-.-,-,+,-+,-.46<@GKQRTTFEEHTTTTTTSLGFGFEFEFEFGPTTTT%RTPIHFA::93240,2/./.,1-030565<:DDJNNTRTTHEEITTTTTTSMGFGFGFFGFEFEGOTTTTRSSMLLHFFCCDA>D@CDCFHHMLPSRTSTTIEEKTTTTTTSNGFGGFGFEFEFEFOTTTT SRTSRTRRTRSTRTTKEELTTTTTTLHGFGFGFEFEGRTTTTTLEiENTTTTTTSKHGHG FGFGGFGFGGFEFEFEIRTTTTTNEiVEOTTTTTT RKHGGHGGHGHGFGFGFGFJQTTTTTOEVHEQTTTTTTRLGHGHGFGFFGFFGFJQTTTTTQEHERTTTTTT SLHGHGHGHGHGHGFGFGFHRTTTTTREEFTTTTTTSJHGHGHGFGFISTTTTTFEEGTTTTTTQJHGHGFGFGFKTTTTTGEEITTTTTTQJHGHGFGFGFLRTTTTTIEEJTTTTTTQJHGHGHGFGFGFKSTTTTTJEEKTTTTTTRJHGHGHGGHHGFGFKTTTTTKEEMTTTTTTRIIHHIHGHGHGFGLTTTTTMEuENTTTTTTOHIHGHGHGFGOTTTTTNEuaEOTTTTTTOJHIHIHGHGHGHGGHGFGGOSTTTTTOEaREPTTTTTTPJIHIIHGFHMSTTTTTPERGERTTTTTTPJIHIHIHGHHGHGHGNTTTTTREGESTTTTTTOIHIHIHGHGHGHOTTTTTSEEFTTTTTTNIHIHIHIHIHIHGHHGHGHHGGHGHPTTTTTFEEGTTTTTTSMJIHIHIHIIHGHHGIPTTTTTGEEHTTTTTTSOIHIIHIIHIHGHGGIOTTTTTHEEITTTTTTNIJIHIHIHHIHGHGHHGIQTTTTTIEEKTTTTTTMIJIHIHIHGHGHRTTTTTKEELTTTTTTSMIIJIHIIHHIIHGHGHJRTTTTTLEEMTTTTTTRMIIJIJIHIHGHGJQTTTTTMEENTTTTTT RMJJIJIIJJIHIHIHJQTTTTTNEwEOTTTTTTSMJIJIJIHIHIHIHJRTTTTTOEwgEPTTTTTTSLJIJIJIHIHIHKSTTTTTPEg[EPTTTTTTRKJIJIHIMSTTTTTPE[QEQTTTTTTQMJIJIHIHIHMRTTTTTQEQIERTTTTTTRLJIJIJIHIHLSTTTTTREIESTTTTTTRLJKJIJIHIHLTTTTTSEEFTTTTTTQLJKJIJIJIHINTTTTTFEEGTTTTTTPKJKJIJIHIHOTTTTTGEEGTTTTTTPKJKKJIJIHIJOSTTTTTGEEHTTTTTTQLKJKJKJIJJIJIIJIHNTTTTTHEEITTTTTTQKJKJIJINTTTTTIEEJTTTTTTPKJKJKJIJIQTTTTTJEEJTTTTTTOKJKJKJKKJKJIJIIJIJIJPTTTTTJEEKTTTTTTSOLLKJKJKJKJILPTTTTTKEELTTTTTTSPKKLLKJKJKJIJIJPTTTTTLEELTTTTTTPKKLKJKJKKJKJIJQTTTTTLEEMTTTTTTNKLKJKKJJKJIJIJKRTTTTTMEEMTTTTTTSNLKLKLKJKJJKJIJJLRTTTTTMEENTTTTTTSNLKLKLKJKJKJKJILQTTTTTNEENTTTTTTSOLKLKLKJKJKKJKKJIJLRTTTTTNE~EOTTTTTTSNLKLKLKJKJLSTTTTTOE~uEOTTTTTTSMLKLKLKJKJMSTTTTTOEumEPTTTTTTRMLKLKLKJKJNSTTTTTPEmgEPTTTTTTRNLMLKLKJKJKJMRTTTTTPEgaEQTTTTTTSNMLKLKLKLKKLKJKJLSTTTTTQEa\EQTTTTTTSNMMLKLKLLKJKJKNTTTTTQE\WERTTTTTTRMLMLMLKLKJOTTTTTREWSERTTTTTTQMLMMLMLKJKJOSTTTTTRESQERTTTTTT QNMLMLMMLLMLKLKLKLKJKOTTTTTREQMERTTTTTTRNMLMLMML KLKLLKLKLLKJKJNTTTTTREMKESTTTTTTRMMLMLMLKLKLKPTTTTTSEKJESTTTTTTQMLMLMLMLLMLKLKLKQTTTTTSEJGESTTTTTTQMLMLMLKLKLKLQTTTTTSEGGESTTTTTTQNNMLMLMMLMLKLKLKLMPTTTTTSEGGETTSRSRQRSTTTTQMLMLLMLKLKKLQTTTTTEGFETTSRQPOPPOPOPPOPQOPQQRSRSTTTTQMLMMLMLKLKLKKLQTTTTTEFETTSRPOPNPOPOPOPQPQPRSTTTTPMNMNMNMLMLKLRTTTTTEETTS RQQOOPNNONONONOPOPOPQPPQPQPQQPQRSTTTT SPMNNMNMMNMLMLMLKMRTTTTTEETTSRQPOONONOPOPOPOOPQPQPPQQPQPQRQRSTTTTSQNMLMLMMLNQTTTTTEETTSRQPPOONONONOPOPOPOPOPQPQPQPQQPQRQRQRSTTTTSPNMNMNMNMLMLMLKLRTTTTTEETTSRQPONONONOONOPOOPOPOOPQPPQPQQPQPQQPQRQRQQRSTTTTPNMNMLMLMLSTTTTTEETTSRQPNNMNMNONONONOPOPOPQPQPPQPQQQRQRQRQRRQRSRSTTTTSONMNMMNMMNMLMSTTTTTEETTSQOONMNONNONNOONOPOOPPOOPQPQPPQQ RQRRQQRQRQRSRSSTTTTSONMNMMNMLMLMLMLOSTTTTTEETTRPNONONOPOPOPOPQPQPQPQQPQQRQRRQRQRQRSRSRSTTTTSPNMNMLMLMLOSTTTTTEFETTSQPOMNMNONONONONNOPQPQQPPQPQRQQRQRQRSRSRSRSSTTTTSPNNONMNMNMNMLMLMMLLMLNSTTTTTEFGETTSRPONNMNONOONOPOPOPQPPQPPQPQRQQQRQRSRRSRSSRSSRSRSTTTTSONMNMNMMNMLMMLLOTTTTTEGGESTTSRPNMNONONOPOPQPQPQRQRQRSRSRRSRSTSTTTTSONONONMNNMMNMLPSTTTTTSEGGESTTSRPONMNONONONONOPOPOPOPQPQPQQPQPQRQRQRQRRQRSRSTSTSTTTTRPONONMNNMNMLPSTTTTTSEGJESTTSRPNMNMNONONONNOPOPOPQPQPPQQPQRQRQQRSRSRSTSTSSTSTSTTTTRONMNNMLMMPSTTTTTSEJKESTTSRPNMNMNONNONOPOPOPQPPQPQPQRQRQRRRQQRSRSTSTTTT SONOONONOONMNMNMPTTTTTSEKMERTTRPOMNMNONNONO POOPPOPOOPOPQPQPPQRQRQQRQRSRSRRSRSRSRSTSTSTTTTRONONONONMNMNMNMPTTTTTREMQERTTSPOMNNMNONONOPOOPOPQPQPQRQRQQRQRQRRRSRSSRRSTSTSTUTUUTTTTQONONONNOONNMNMNMMNMRTTTTTREQSERTTSQONMNMNONOONOONOPOPOPQPQPPQQPQRQRRQRRQQRRQQRRRSRSRRSRSTSTSTUTTTTRPONONMNMNQTTTTTRESWERTTRPMNMNMNMNONOPOPOOPOPQPQRQQRRSRSRRSRRSTSSTSSTTSTUTUTTUTUUTTTTRPOOPONONMNNMNMMNQTTTTTREW\EQTTSPOMNMNMMNONOPOPQPQRQQRQQRQRSRS TSTSTTSTSTSTUTUTUTUTTTTRPONONONONMNMNMRTTTTTQE\aEQTT RONMMNMNNMMNONONO POOPOPPOPOPQPPQPQRQRQRRQRQRSRRSSRSRSRSTSTSTUTUTUTTTTRPPOPONONMNMRTTTTTQEagEPTTSQNMNONONOONOPOPOPQPQRQRQRSRSRRSTSTSTSTUTUTUTUVUUVUTTTTQPPOPONONONMNSTTTTTPEgmEPTTRPMNMMNMNMNMNNONONOPOPOPQPRQRQQRSRRSSSRSTSTTSTTSTSTUTTUTUVUTTTTQPOPOPONONNONONMORTTTTTPEmuEOTTSQNLMMNMNMNONONOPOPOPOPOPQPQPQPQRQRQRQRQRSRSSRSTSTSSTSTUTUTUVUTTTTRPOPOPONONONORTTTTTOEu~EOTTRONMNMMNMNONOPOOPQPQPQRQRQQRQRQR SRSRSSRSRSRSRSTSTSTUTUTUTUVUVUVUVVUUTTTTRPOPONMNRTTTTTOE~ENTTQONMNMNNMNONONOPOPOPQPQRQRSRSSRSTSTSTSTUTTUTUTUTUVUVUVVUUVUVUTTTTQPOPONOONNONOSTTTTTNEENTTQNMNMNONNOPOPOPQPQRQRQRRSRSRSSTSTSTUVUVUVUUVWUTTTTSQQPOPOPOPONOONONPSTTTTTNEEMTTSPNMNONNONONOPOPPOPQPQPQRQRSRSRSRSSTSTSTSTUTUTUVUVUVVUVWVVUTTTTSQPQPOPOPONOONONPSTTTTTMEEMTTROMNMNNMMNMNONOONOPOPOPOPQPQPPQRQRQRQRSRSRSRSTSTSSTUTUUTUTUTU VUVVUVUVUUVWVUTTTTSRQQPPQPOPONONNONPSTTTTTMEELTTROMNMMNMNONONOPOPOPQPQRQRQRSRSRRSRSTSTSSTSTUTUTUVUVUVWVWVUTTTTRPOPOPONONOONOSTTTTTLEELTTQNLMNMNNMNOPOPOPQPQPQRQRQRSRRSTSTSSTSTUTUTUVUUVUVUVUVWVWVWWVWVWWUTTTTQPQQPOPOOPPONONONNONPTTTTTLEEKTTSQNMNMNMNONOPOPPOPQPQPPQRQR SRRSRRSRRSRSTUTUUTUTUTUVUVUVWVWVVWVWVWVUTTTTSQPOPPONONQTTTTTKEEJTTSPLLMNMNONOPOPOPQPQPQRQRQRRQRSRSRSRSTSSTTSTUTUTUVUVUVWVVWVWVTTTTSQPQQPQPOPO NONOONNOQSTTTTTJEEJTTSPMNMMNMNMNOPOPOPOPQPQPPQRQRQRSRSRSRSTSSTSTTTUTUTUTUVUVUVUVWVWWVWVWVVWVUTTTTSQQPQPQPOPONOQTTTTTJEEITTSONMNMNMNMNONONOPOPQPQPQRQRRQRSRRSRRSTSTTSTUTUUTUUTUTUVUUVVUVUVW VWVVWVWWVWVWVUTTTTSQPQPONONQTTTTTIEEHTTSOMNMNMNONNOPQPQPQRQRRQRSRSRRSTSTSTSTSTTSTUTTUTUVUVUVUVWVWVWXWWXWXWVTTTTSQPQPQPOPOPOQTTTTTHEEGTTROMNMNONNONOPOPOPQPQPQRSRSRRSRSTSTSTTUTUTUTUTUVUVUVUVWVWVWVWVWXWXWWXVUTTTTRQPQPQPOPOPOPPORTTTTTGEEGTTROMNMNMNONONOPOPQPQRQRSTSTSSTTUTUTUTUVUUVVUVUVUVWVVWVWWVVWVWXWXWXXWXWXWXWUTTTTRQPQPPQPPQPOPOPOORTTTTTGEEFTTSOMNMNNMNNMNOPOPOPPOPQPQQPPQRQRQRSRSTSTTUTUTUTUVWVWVVWXWWXWXWXWXXWWXWUTTTTSRQRRQRPQPQPOPOOPPOQTTTTTFEESTTSPMNMNMNONOPOOPOPOPPOOPQPQPQPQRQRSRRSRSTSTTUTUTUVUVUVWVWVWWVW XWXXWXWWXXWXWXWUTTTTSQRQPQPQPQPOPOPPORTTTTTSEIERTTSPMNMNONOPOPQPQPQRQRSRSTSTSTTUTUVUVUVUV WVWWVWVWVVWXWXWXXWWXWUTTTTSRQPQQPPQPOPOSTTTTTREIQEQTTPMNOPOPOPPOPQPQPQRQRRQQRSRSRSTSTUTTTUVUVUVWVWVWVWXWXWXWXYXXYWUTTTTRQQRQPQPPQPOPSTTTTTQEQ[EPTTPMNMNMNNMNONNOONONONNOOPPOOPPOPOPOPQPQPQPQQRQRQRSRSRSRSRSTSTSTSTUTTUVUVUVWVVWVWVWVWXWXWXXWXWXYXYXWUTTTTRQPQPQPOPOOQSTTTTTPE[gEPTTQMNMMNONONNOPOPOPQPPQPPQQPQRQRQRSRSRRSRSTSSTSSTUTUUTUVUVUVWVWXWXWWXWXWXYXYXYXYWWTTTTSQQRQRQRQPQPQQPOPOQSTTTTTPEgwEOTTQMNMNMMNOPOPQPQRQRQRQRSRSRSRSTUTTUTUUVUVUUVUVWVWVWXWWXWXYXXYXYXYVTTTTSRQRQRQPQPOSTTTTTOEwENTTRMMNMMNMMNOPOPOPOPQPQPQPQPPQRSRSTSTSTSTUUVUVWVWVWVWXWXWXWWXYXYXYXYYXYYXYXYYXVUTTTTRQRRQRQQRQPQPQQPOPSTTTTTNEEMTTSOMNMMNMNONNONOPOPOPQPQQPQRQRQRQQRSRSTSTSSTSTTUTUUTTUTUUVUUVUVUVWVWVWVWX WXWWXWXXWXWXYXYXYXYXVTTTTRQRQRRQPQPQSTTTTTMEELTT SPMMNMMNNMNONONOPOPOPQPQPQPQRQRSRSRSTSTUTUTTUTTUVUUVUVVUVUVVUVWVWVWVWXWXYXYXXYXYXYXYWVTTTTSRQRQPQPSTTTTTLEEKTTSPMNMNNMNMNONONONOOPOPQPQPQRQRQRQRSRSRSTSTUVUVWVVWVWVWXWXXWXWXWX YXXYYXXYXXYXYXUTTTTSRSRRQRRQPQPQSTTTTTKEEITTQNMMNMNOPOPQPQPPQRQRQRSRSRSRSTTUTTUVWVWVW XWWXXWWXXWWXWXYXYXYXYXYZYZYYWTTTTRQRQPQQPQPQTTTTTIEEHTTROMNMNOPOPQPPQPQRQR SRRSRRSRSRSTTUVWVWVWXWXWWXWXYXXYXYXYXYZYZYZZYVTTTTRSRQRQPQPQPRTTTTTHEEGTTSOMMNMMNOPOOPOOPQPQRQRQQRQRSRSTTUVWVWVWXWXWXWXWX YXYYXYXXYYXYXYZYZYYZYXVTTTTRSRQRQRQPQQPPRTTTTTGEEFTTSQMNMNMMNONOPOPQPPQQPQRQQRQRSRSSRSRSSTTUVWVWVWXWXWXWWXWXYXYXYYXXYZYYZYZYZYXUTTTTS RSRRSRRSRQRQRQRQPQPRTTTTTFEESTTQNNMNMNMNONNONOPOPOPQPQPQPQRQRSRRSRSRRSTTUVUVWXWXWXXWXYXYXYXYZYZYYZZYYZYZYWUTTTTSRQRRQRRQRQPQTTTTTSEGERTTSNMNMNONOPQPQRQQRRQRQRSRSTTUVWXWXWWXWXYXYYXYXYYXYZYZYZYYZYZYWTTTTSRSSRSRQRQPQRTTTTTREGREPTTSPMMNMNONONOPOPQRQRQRSRSTTUVWXWXWXYXXYXYXYZYYZYZYZYZYZZYZ[ZXUTTTTSRSRSRQRQRRQSTTTTTPERaEOTTQNNMMNMNONOPQPQPQ RQQRQRRQRQRSRRSTTUVWXWXYXYXYZYYZYZYZ[WUTTTTSRSRQRQRQSTTTTTOEauENTTROM NMMNMNNONNONOPQPQPQRQRSTTUVXYXYXYXXY ZYZYZYZZYZZYZYZWTTTTSRSSRSRQRQRQRTTTTTNEuEMTTSPMNMMNONONONOPOPOPOPQPQPQPQRQRSTTUVWXY XYXXYXYYXYXYYXYZYZYZ[Z[ZZ[[Z[YUTTTTSRSRQRQRQRQRTTTTTMEEKTTRNONOPOOPQRQRQRQRQRSRRSSTTUVWXYXYZYYZYZYZYZ[ZZ[ZZ[Z[Z[ZXUTTTTSRQRQQRQRTTTTTKEEJTTSOMMNMNONOPOOPQPQRQQRQRSRSTTUXYXYXYXYZYZYYZYZ[ZZ[ZZ[Z[ZVTTTTSRSRSRSSRQRQQRRSTTTTTJEEITTPNMNONONOPOPOPQPQRSRSTTUWXYXYXYXYZYZZYZYZYZ[Z[Z[ZZ[Z[Z[Z[XUTTTTSTTSSTSRSRQRQQRRQSTTTTTIEEGTTRONMNONONNOPQPQPQRQRSTTUVWYZYZYZYZYZ[Z[Z[Z[Z[[Z[\ZWTTTTSTTSSTSRSRSRRSRQRQRSTTTTTGEEFTTSPMNONONONOPOPQPPQPQRQRQRQRSTTVWYZYZYYZZYZYZ[Z[ZZ[Z[YVTTTTSTSTTSTSRQSTTTTTFEERTTRNNMNONOPOPQPQRQRSRSTTUVXYZYZYZZYYZ[ZZ[ZZ[Z[Z[Z[Z[\ZXUTTTTS TSSTSSRSRSRRSRSRQRSTTTTTREHEQTTSONNMNONONOPQPQRQRQRSTTUVYYZYZZYZYYZYZ[Z[ZZ[[ZZ[\[[\[[VTTTTSTSTSRQRQTTTTTQEHVEOTTQMNONOONNONNOPOPOPOOPPQQPPQQPQPQPQRQRSRSTT VXYYZZYZYZZYZ[Z[Z[ZZ[Z[\[\[ \[[\\[[\\ZXUTTTTUTSTSTSSTSRSSRSRSRQSTTTTTOEViENTTSOMNONNOPOPOOPQPQPQRQQRQQRRQRSRRSTTVXZYZ[Z[Z[Z[Z[[Z[\[\[\\[\[[ZVTTTTSTSTSRSSRRSRQRTTTTTNEiELTTQMNMNONNOPOPOPQPQRQRSTTVXYZ[ZZ[Z[Z[\[\[\\[\YUTTTTSTSTSRSRSTTTTTLEEKTSNMNONOPQPQ RQRQRQRQQRRSRSTTUWZ [Z[Z[[Z[[Z[Z[\[\[WTTTTUTUTSTSRSRTTTTTKEEITQMNOPOOPOPOPOPPQPQPQRQRRQRSTTUXYZ[Z[Z[\[\[[\\[\]YUTTTTUTSTSTSRSRSRRSRSTTTTTIEEHTSONONOONONOOPOPOPQPQPQRQRRQRQRQRSTTUXZ[ZZ[Z[Z[Z[\[[\[[\[\[\]\\[WTTTTUTTUUTSTSTSSTSRSRSTTTTTHEEFTQMNONNONONOPOOPOPQPQRQRQRQRSRRSSTT UXY[[ZZ[ZZ[Z[\[[\[[\[\]\]YUTTTT UTUTTUTUTUTS RSSRRSRRSSTTTTTFEERTSPNMNNOONOPOPOPPOPQPQRQRQRQQRSRSTTVX[Z[Z[Z[\[\[\[\[\[\]\]\WTTTTUTSTSTSRSTTTTTREGEQTQONONOONOPOPQPPQRQQRQRSTTVYZ[[ZZ[Z[\[\[\[\\[\]\]\]\]YUTTTTUTUTTUUTSTTSRSTTTTTQEGSEOTSPNNONNONOPQPPQRQRRSRRSTTUVYZZ[\[\[[\[\]\]\\]\][WTTTTUTUTUTSRSTTTTTOESiEMTRONNONNONOPOPOPQPQRQQRRQRSRSTTVY[\[\[\\[\[\]\]\]\]]\]\YTTTTUTUTSRSTTTTTMEiELTPNNNONOONOPOPQPQRQQRQRSRSTTW[Z[\[\[\]\]\\]\]\][VTTTTVUTUTUTSTSRSRSTTTTTLEEJTSONNONNOONOPOPOPQRQRQRSRSSTTXZ\[\[\[\]\]\]\\]]\]\]\]\XUTTTTUVU TUTUTTUTTUTSRSSTTTTTJEEHTQNONNOPQPQRQRSRSRTTVY[[\[\[\[\[\\[\]\]\]]\]\]^]ZUTTTTUVVUTUTUUTSTTSTSRTTTTTHEEFTSPNNOONOPQPQRQRQRSRSSRTTUWZ[\[\]\]\]]\]\WTTTTUVUTUTSTTSTTTTTFEERTRNNONNONNOPOOPQRQRQRSTT UW\\[\\[\[\]\]^]^]ZUTTTTUVUVUTUUTSTTTTTREEPTSPNONNONOPOPQRQRQQRSRSTTUY\[\[\]\]\\]]\]^]^]]^]^]^][VTTTTUVUTUTUTUTSTSTSSTTTTTPERENTRONOPOPQRSRSRSRSTTVZ\[\]\\]\]\]^]^]^^]^]]XTTTTUVUVUTUTUTSTSTSTTTTTNERiEMTQPNNONONOOPOOPOPQPQRQRQRSRSRSTTX[\]\\]\\]\]^]^]^]]^]^]^ZUTTTTUVUVUTUTUUTSTTSTSTTTTTMEiEKTSPNOOPOPQPQRQQRSTTVY\]\]\]\]^]^]^]^\VTTTTVUVVUVUTUTUTSTSTTTTTKEEITRPNNOOPOPOOPQRQRQRRQRSRSTTW[\]]\]\]]\\]]\]^]^]^]^]XUTTTTVUVVUVUTUTUTSTTTTTIEEGTQONNOOPOPQPQRQRRQQRSRSRSRSTTUX\\]\\]\]^]^]]^]^[UTTTTUVUVVUVVUTUTSTTSTTTTTGEERTPONOOPOPQPQRSRSTTVZ\\]\]]\\]]\]\]^]^]^]^^]^\VTTTTUVUVUVUTUTTUUTTTTTREEPTSPNOOPOOPOPQPQRQRRQRSRSRSTTY\]]\\]^]]^]^]^_^_^YTTTTVWVUVUUVUTUTUUTUTSTTTTTPELENTRONOOPQPQPQRQRQRSRSTTVZ]^]^]]^^]^]^]^_^_^_[UTTTTWVUVUTUTTTTTNELcELTPNOPOPOPQPPQRQRQRSRRSSRSSTTUX[]^]^]^^]^]^_^_^_^_^^_[VTTTTUVVWWVUTUTTTTTLEcEJTSPOONNOOPOPQPQRQRSRRSRSTTV[]^]^]^_^_^XTTTTUVWWVUVUTUTUTTTTTJEEHTRONONOOPOPOPOPQRQRSRSRSRRSTTUX\]^_^_^_^_^__^__YUTTTTUVWVWVUVUVUTUUTUUTSTTSSTTTTTHEEFSTQNOPOPOPOPQPQPQPQQRQRSRSTTV[]^]]^^]^]^_^_^^_^_^_^__^_^__\VTTTTUVWVWVWVWVUVUTUTSTSTSTTSTTTTTSFEEQTSPOOPQPPQ RQRQRRQQRRSRRSRSRSTTUY]]^^]^]^_^_^__^_^_^_]WTTTUVVWVXWVWVVWVUVUUVUTUTUTSTSTTSTSTTTTTQEEOTSPOPOPQPPQRQRQRSRSTTW[^]]^]^_^_^_^^_^_^_`_^YTTTUVWWXWXWXWXXWVWVWVUVUUVUTSTTSTSTTTTTOEQEMTRPOPOPOPQPQQPPQRQRQRSRSTTUY]^]^_^_^_^_`_ZUTTTUVWWXXWXWXWVWWVWVUVUTUTSTSTTTTTMEQmEKTQOPOOPOPQRQRSRSTTX]^_^_^_^_`_[VTTTUVVWXWXWWXXWXWVWWVVWVUVUTUTSTSSTSRSTTTTTKEmEITSQOPOPOPOPQPQRQQRQRQRSRSSRSTTV\^_^_^^_^_`__`__`]WTTTUVWXYXYXXWXWVWVUVUVUTUTUTSTTSRSRSRRSTTTTTIEEGTSPOPOPPPQPQRQRSRSRSRSTTY]^_^_^_^__^_`_`__`__YTTTVWWYXYXYXXXWXWVWVUVUVUTUUTSRSTTTTTGEEQTSPOPOPOPQRQRSRSRSTTX\^_^^_^_^_`_`_`_``_ZTTTVWYXYXYYXXWXWVWVWVUVVUTUTTUTSTSRSTTTTTQEEOTRPOPOPOOPPQPQPQPQRQRQRSRRSSRSTSSTTV[_^ _^^__^^__^^_^_`_`_`_`[UTTTUVWXYXYXYXYXYXWXWWXWVWVUVUVVUTUTTUTSTSTTSTSRSTTTTTOEKEMTQOPOPPQPQPPQRQRSRSSRRSTTZ]^_^_^_`_`_`_`__`_`\VTTTVWYYZYXYXYXWXWXXW VWWVVWWVVUVUVVUTUTUTSTSTSTSRSRSTTTTTMEKfEKTQPOOPOPPQPQRSTSTTW]__^_^_^^_`_`]WTTTUXYZZYYZYZYXYXWXWXWVUVUVUTUTSTSTSTSRSRSTTTTTKEfEHTSPOPPQRQRSRSRSRSTSSTTV\_`_`_`_``_`a`^YTTTVWYZZYZZYYZZYYZYXYXYXWXXWXWVWVWVUVUVVUTUTSTSTSRSRSRSTTTTTHEEFSTSPPOPQPQPQPQQRQRSRSSRSTTV[_^_`_`__`_`_`_`a_ZTTTUVYZYZYZZYXYXXWXWXWVWVWVUVUVUUTUTUTSRSSRSTTTTTSFEEPTRPPOPOOPQPQRQRQRSTSSTTY^_`_`_``_`_`_`a`a`[TTTVXZ[ZYZYXXYYXWXWVWVUVUVUUVUTUTUTSTSSTSRSTTTTTPEENTQPOPOPQPPPQQPQRQRSRSRSRSTSTTW]_`_`_`__`_`_`a`a`a[VTTTUWZZ[Z[ZYZYXYXWXXWVWWVWVUVUTUUT UTTSTSSTSTSRSRQRSTTTTTNEMELTQPQPQPQRQRSRSRSRSTSSTTV\_`_`_`a`a``a`^UTTTVXZ[ZYZYYXYXWXWX WXWWVVWWVWWVUVUTSTSRSRSRQRSTTTTTLEMmEITSRPOPPOPQPQQPQRQQRSRRSTSTSTSTTVZ_`_`a`a`a`a^WTTTUWY[Z[Z[ZYZYXYXYXYXWXWVWVWWVUVUUVUTUTTUTSTSSTSRSRQRQRSTTTTTIEmEGTSQOPQQRQQRSTSSTTUY_`_`__`_`a``a``a`a``a^XTTTVXZ\[Z[[Z[ZYZYYYXYXWXWXWVWVUVUVUTUTUTSTTSSTSRSRQRSTTTTTGEEQTSQPQPQPQRQRSRRSSRSTSTTY^`__`_`_``_`a`a``a`a`aa`YTTTWYZ\[Z[Z[ZZ[ZYZYZYYYXYXWXWVWVUVVUVVUTUUTUTUTUTSRSRSRQRRQRSSTTTTTQEEOTSQPQQRSRSTSTTSTTW]_`_`_`a`a`a`a`YWVTTTUWZ\[\[ZYZZYZZYYZYXYXWXXWXWVWVUTUTSTSTSRSRSRQRQRRQRSTTTTTOEGEMTSOPQPPQQPQQRQRSRSTSTSTT V\_``__``__`a`a`a`a`]]^ZXWUUTTTUX[\\[\[Z[[Z[ZYZYYXYXWXWVWVWVVWVUVUTSTSTSRQRQRQRSTTTTTMEG]EJTROPQPQRQQRSRSTSTTV[_`_`a`a`a``a`abaab`ab`b^[\XWUTUTTTVY\[\[\[\[Z[ZYZYZZYYXYXWXWVWVWVUVUT STTSSTSTSSRSRQRRQRSTTTTTJE]EHTRPQQRSRSRSTSTTSTSTTU[__`_`a`abab`__\ZYWVTTUWZ\[\[Z[ZYZYZYXYXWXWVWVWVUTUTTSTSTSRSRSRQRQQRQRQRSSTTTTTHEERTRPQQRQRSRRSRSTTUZ_`a`a`a`a`aa`ababababababaabb`]^ZXVTUTTVX[\]\[\[Z[[Z[ZYZYYZYXYXYXWXXWVWVWVUVUVUVUTSTSRSRQRRQQRQRTTTTTREEOTRPPQPQQRQRSRSTSTTY_`a``a`a`a`aa`a`abaabbaababbabababa`b^[ZXWUTTVY\\]\[\[[\[\[Z[Z[ZYZZYZYZYXYYXWXWVWVWWVUVVUUVUVUTUTSTTSRSRQRQQRQPQSTTTTTOEEMTRPQPQPQRSTSTSTSTUTTX_``a`a`a`a`a`abababaabaababcb`^_\ZXUVTTVY\]\\]\[\[ZYZYYZYXYXXYXWXWVWVUVUVUTUTSTSTSRSRQRQRTTTTTMESEJTQPPQPQPQQRRQRSRSTSTSTUTUTTY^``a`a`a`ababababaabcb cbbca]\YXVTUTTVZ]\]\[\[Z[Z[Z[[ZZY ZYYZZYXYXXYXXYXWXWVWWVWVWWVUVUVUTUTSRSRRSRQRQRQRSTTTTTJESxEHTQPQPQRQQQRSRSTUTTW]aa`a`a`ababaababababcbcbcbcb`][ZWWUTTVZ]\]]\[\\[[\[Z[Z[ZZYZYXYXWXWXWVWVVWVUVUTUTSRQRSTTTTTHExEQTSRPQRQRRQRSRSSRSTSTTSTUTTV^a`ababababcbcbcbcbcbccb`_][ZWTUTTV[]\]\]\[\[\[Z[Z[ZZ[ZZYZYZYXYXWXWVWVUVUTUUTUUTSTSSTSRSRQRRQQRRQRSTTTTTQEEOTQPQRRQRSRRSRRSTSTSTSTUTUUTTV^`a``a`abababaabcbbcbccbcbcbcbcbcbcbcbaa`\[WXVTTW[^^]\]\[\[\[[\[Z[ZZYXYXXYXWXWXWVUVUVUVVUTUTSTSRSRRSRQSTTTTTOEELTRPPQPQQRQRSRSTSTUTUTTW]``a`a`a`ababaabababcbcbcbccbcbcbcbccbccbc_\[YVVUTTV[^]]^]\[\[[\[ZZ[ZZYZYXYXWXXWVUTUTSTSTSTSRSSRRSRSRQRQRQRSTTTTTLESEJTSRPQRQRRSRSSRSSRSTSTSTUTUTTV\a`a`ababababcbbcbcbcbcbcdcbca_]ZZWTTV[]^]\]\]\[\[\[Z[ZZYZYZYXYYXYXXWWXWXXWVWVUVU VUUTTUUTUTTUTSTTSTSRSRQRQRTTTTTJESxEGSTSQPQQPQRRSRSTSTUTUTTU]``ababababcbcbcbcbccdc dccab^][WWUTTU[]]^]]^]\]\]\[\[\[[\[Z[[Z[ZZYZYXYXWXWWXWVWVWVUTSTSSTSRSSRSSRSRQRQRSTTTTTSGExEQTSQRQRRRSRSTSTUTUTTV^abababab cbbcbbcbcbbcbcbccdcdc`_[[WUUTTUZ^]^]]^]\]\]\[\[Z[[ZZZ[[Z YZZYYZZYYXYXYYXWXWVWVWVUVUTUTSTSRSRSRQRRQRRQRSTTTTTQEENTRQRQRRSRSTSSTSTUTTUTTV]a``ababbabcbcbcbccdcdcdcdcdcdbaa_\XXVTTY_^]^^]\]\]\]\[\[\[Z[ZZ[ZYXYXYXWXWVWVWVUVUTUUTSTSSRRSRQRQQRQSTTTTTNEEKTQRRSRSTSTUTUVTTV]abababababbababbcbcbcbcbcbcbcbcbccdcdcdcdccdcdcdcdcd cdcda_]]ZWVUTTX^]^]^]\]]\\]\\]\[\\[Z[[ZYZYZYXYXYYXWVWVWVUVUVUTUTSRSSRSSRQRRQPRSTTTTTKEVEHTRQRRSRSRSTSTSTUTUTUTUVTTV^aabababbabababcbbccbbcbccbcbcdccdccdcdcdcdcdcdcbb`^[ZXUTTW\^]^]\]]\\]\[\[\[ZZ[ZYZYZYXWXWVWVWVUTUTSTSTSTSRSRRSRQRQRRQPRTTTTTHEVEFRTRQRRSTSTSTSTSTUTT W^aabaabbabababcbcbcbbcbbcbcdcdcdcdcdcdcddcdcdcdc``_[XVVUTTV\_^]^^]]^]\]\[\[\[[\[[ZXYXXWVUVXWVWVWVUTSTSRSRQRRQRRQPRTTTTTRFEEOTRQQRQRSRSTSSTUTUTTX^ababcbcbcbbcdcdcdcddcdcdcdcdc_][YWTTVZ^_^^_^]^^]^]]^]\]\[\[\\[Z[[ZZ[ZYXWVUTUVWVVWVWVUVUTUTSTSRSRQRQPQQSTTTTTOEELTRQQRRQRRSTSTUTUTUVTTX_ababaabcbcbcdcdcdcdcdcdcdcdcdedbaa]ZXWVTTUX^_^]^]^^]\]]\\]\\]\[\[Z[Z[ZYWUTUVWVVWVUVUVUTUTSTSRSRQRQRRQPQRSTTTTTLEGEJTRQRQRSRSTSTSTUVUTTW_baababababcbcbcbcbcdcdccddcdcdccdeded edd`^^[XUVUTTW\_^_^]^]\]]\[\[Z[ZYYWVUTUVUVUTUTSTTSRSSRQRQRRQRTTTTTJEGeEGSTRQRQRQRRSTSTUTUTUTTX`bababcbcbcdcdcdcdcdcdcdcdcdcdededed eddeddcba_\YYVTTU[_^_^]^^]^^]\[\[Z[[YYVVTU VWVUVVUUVVUTUTUUTSTSTSRSRQRQSTTTTTSGEeEPTRQRQQRRSRSTSSTUTUTUVUTTZaabaabcbcbccbcdcdcdcdcdcddccdededededdeddeeddeededed eddb`_]YVVUTTX^_^_^_^]\]\]\[\[[ZXWUTUVUTUUTUTSTSRSRQRQRQRSTTTTTPEEMTSQRRQRSRSTSTUTUTTUVUTT[babcbbcbcdcdccddcdccdcdcdededededdedededededdededdeddededdedca]\ZXUTTV]__`_^_^]^]\]]\]\[\\[\[\YXVUTUVUVUVUTSTSRSRQRQQRQPQTTTTTMEEJTSRQRRQRSRSRSTSTUTUUTUTUVUVUTTU\babcbbcbcdcdcdcddededeedededededededededededeca`_[YWVTTUZ^_^__^__^_^]^]\]\]\[ZWVUTUVUVUTUTSTSTSRQRQPRTTTTTJESEHTSQRQRSRSTSTUTUVUVUVTTV]bcbcbbcbcdcdcdcdcddcdcdcdedeededdedededededededeedeededededeedeedededdedc_]\YVTUTTX]``_`_^_^_^]^]\]\]\[\\ZYWTTTUVUVUTUTSTSTSRSRQRQPRSTTTTTHES~EQTSRSRRSTSTSTUTTUVUVUTTW]ab cbbcbcbbcbbcdcdcdcdcdcddededededededdedededede dedeedededdededdededeededdcba`]ZYWUTTU]_`_ ^_^__^^_^_^]^^]^]\]\]\]\ZWUTTUVUVVUTUTSTSRSRQRQPQPRSTTTTTQE~ENTSRRQRSRSRSTSTUTUUTUVUUVUVVWUTTX^bcbcbcdcdcdcdcdcddeddededededeedededededededededededeedeed`_^ZXVUUTTZ``__`_^_^_^_^]^^]\]\XVTTUVUUVUTSTSRSRQPQRTTTTTNEEKTSRRQQRSSTSTTUTUVUUVUVUVUTTXabcbcbcbcbcdccdcdcdcdcdccdedededededededededededededecbc^[[XWTTW^`_`_``_`_^_^]\ZWTTUVUTUTSTSRSRQRQRSTTTTTKEKEHTSRSSTUTTUUTUVUVUVUTTZbccbbcbccbcdcdcdcdcdededeedededededededefefefedededeedea`_]ZXVVTTU\`_`_`_^_^_^_^]^^]^]^]\]\\XVTTUVVUVVUTUTUTSTTSRQRQPSTTTTTHEKoEQTSRSRSRSSTSTUTUTUVUVWVVUTT]cbbcbbcbcdccddcdcdedededeededefefefefefedededdeded cdd`]]YXUTUTTX_`_^_^_^_^]^^]^]^][XUTTVUTUTSRSRRSRQRQPQQSTTTTTQEoENTSRRSRSSTSTSTUTTUTUUVUVUVWVUTTU_bcdcdcdedededededefefefefefefefededecac]ZYWVTTU\`_`_`_``_^_^_^]^]^]ZWTTUVUTUUTTUTSTSRQRQPQPRSTTTTTNEEKTSRSRRSSTSTSTUVWVWUTTXacbcbcbcdcdcdcdededdededefefefeefefefeffefefefefedeededeedeeda_^[YWTUTTZ_`a`_`_`_^_^]^]\ZVTTVUTUTSTSTSTSRSRQRRQSTTTTTKEGEHTSRSSTUTUVUVWVUTTZccbcdcdcdedededededeefefeeffefefefefefefefefeffefefededed ecbd`\[XXUTUTTV^`_`_`_`__`_^_^_^_^]^]^]YVTTUTUTTUTSTSRSRQRQPQQPQTTTTTHEGfEQTSRSTSTSSTUTUVUVWVWVVWUTT]cbccbcdccdcdcdcdededededeefefefefefeefefefefeffefefefefefefeefedeeded c``]ZXVVUTTTZ`a`a`_`_^]^]^^]]YUTTUTUTSTSTSRSRQRRQRQSTTTTTQEfENTSRSRSSTUTUUTUVUVWVWWVUTTU`cdcdcdcdeddeededdededefefefeffefefeefefefefefeefeefeffeefefeffeefeefefefeeffefefefefede dedededca_]ZZVTUTV^a`a``a`__`_`_^_^_^]^]YUTTVUVUTUTUTSTSSTSRSRQRQQRQPQRSTTTTTNEEJTSTSSTSTUTUUTUVWVWVVWWUTTXbcdcdcdedededefefefefeffefefefefef efeffeeffefefefefeffeefefefedededcab_\ZVWUTUY`a``a`a`_^_^_^_^\YUTTUTUTSTSRSRQSTTTTTJEEGSTSRSSRSSTSTUVUVUVUVWVWVWVUTT\cdcdcdcdedededeedededefeffeefeefefefefeffeffefefeffefeffeefefefefefedeededeededcdb_^[ZWTUTV]aa``a`a`a``a`_``_`_`_^_^_^^]^YTTUTSR QRQQPQQRSTTTTTTSGEdEPTSRSTTUTTUVWUTTU`cdcdccdcdcdededdedefeefefefefefeefefefefefeffefefef effeefefeffeffefefeded deedcb`]\XYVTZ`a`a`a`_``__`_^YUTTUVUTUUTSTTSSTSRSRQRRQQRQPSTTTTTTPEdEMTSRSRSTSTSTUTUUTUVUVWVVWVTTXaccdcdcddcddccdedededeededefeefefefeffefefefefgfefefefefefefededeeddededea`]\YUVUTV^a`a`a`_`_^ZTTUTUTUTSTTSRSRQRTTTTTTMEEJTSRRSTTUTUVUVUUVUVWVWXWTT\cdcdcdccdcdcddedededededdefefefefefefgfgfgfgfefeffefefefefedededeeddeedcb_]ZZWTY`aba`aa`_`_^_^\VTTUTUTUTSTSTSRSRSRQSTTTTTJEGEGRTSTSSTTUTTUUTUVUVUVVWVWWVVWXVUTT V_cdcdccdcdcdcdededeededdefefefefeeefefefgfgfgfgffgffggfgfgfgfgfgfgfefefefedeeededba_^ZVWUTU]bba`aa`a`_`_`__`_^_^\WTTUTUTSTSRSRRSRQRQPRTTTTTRGEGkEOTSRSTSTSTTUTUTUVUVWVWVVWVWXWXVTTXbccdcdcdededededefefefefeffefgfgfgfgfgfgfgfgfgfgfgfgf effefeeffefefefedeedededcdd`_[[XUTWababa`a`a``a`_`_^XTTUTUTUTSTSRSRSRRQRRQRQQPQRSTTTTOEkELTSTSTSTUTTUVUVUVWVWVWXWXXWUTTU]ccdcdcdcdcdedededeedefefefefefeeffeeffgffgfgffgfgfggffggfgfggffgfgfgfgfggfgfefeffefefeefeefeededededededca`_\XYVT[aba`a`aa`_``__`__`_]YTTUTUTUUTSTSRQRQRTTTTLEEITSTSTUVWVWXWXVTTWacdcdcdedededededefeefefeff gfgfgffgfgffgfgfgfgfgfgfgfgf gfgffgfggfgfgfefefefefeefeded edeeddeddedc dbb`]]YVUUTV_bbaba`a`_``_[VTTUTUTUUTSRQRQRQRQRQRSTTTTIEJEFQTSTSTTUTUVUVWVWWVWWXWXWUTTU[cdcdedefefefefefeffgfgffgffggfg fgfgfggffggfgfgfgffg fggfggfggffgfgfgfgffgfgfefefeffeededededcdca`]ZZWVTYababa`aa`aa`_]WTTUTSRQRQRQSTTTTQFEJrENTSTTSTSSTTTUTUVUVWVWVVWXWXWXXWVTTW`dcdcdcdededededefefeffeefgfgfgfgfgfggfgfgfgfggffggfgfgfgfgfg fggfgfggffggfgfefe fefeeffeeffeedeededededcdcddcca__[XWUUTV\babababa`_`_`_^YTTVUTUTSRSRQRQRTTTTNErEKTSTTUTUVUVWVWXWXWXXVTT[bcdccdededeededefefeefefefefgfggffgfggfgfgffgfgfgfgfgfgfgfgfggfggffgfgfgfgfgfgfgffggfgffggfgfgfggfeffefeffefededcdccddcb^\[XWTUTX_cbabababa`a`_``_`_[UTTUTUTSTTSTSRQRQRQRSTTTTKEEGSTSTSTTUTUVUVWVWXWXYWUTTVacdcdeddedededefefefgffgfgfggfgfgfgfgfgfggfgfgfgfggfgfgfgfefefefefefedededededcdca`_\ZXWVTUZababbabbaba`a`_`_]WTTUTUTSTSRSRQRQQRQQQSTTTTSGEQEPTSTSTTUVUVUVWVWXWXWTT[cdcdeddeedefeefeffeefefefgfggfgffgfgfgfgfgfgfgfgfgfgfgffgfefeffefeefedeeddeededcdcddc b`^]ZXUTUV^bcbaba`a`_`^ZTTUTSTSTTSRSRQPQRTTTTPEQELTTUTTUVUUVUUVWXWXWXWXVTTW`dededefefeefefefefgfgfgfgffg fgfgfgfggfgfghgghghghghghgfgfggfgfgfgfgfgfeefefedeed edeeddeddedcbaa][Y[`cbababbaaba`aa`a`_`_\VTTUVUTUTSTSRQRQQRSTTTTLEEITSTUTUUTUVWVVWXWXYWUTTU[bdededefefefeffefea^acddfgfgfgfgfggfgfgfghghghghgghghghhghghghgfgfggffgfgfggfgffefefeefededdeddedcddcdca`bccbababa`aa`YTTVUTUTSTSTSRQQSTTTTIEEFQTUTUVUVVUVWVWVWXWXYWVTTX`dcdededdedededefefefeefgfcZVVX\\_acedgfgfgfghghgghghghghghghghghgghgfgfgffgf feffeeffeffedededdededcdcdcbcbcbcbababa`a`]UTTUTUTSTSRSRSRQRQQSTTTTQFE_ENTUTTUVUVUVVWVWWVVWXYXXYXYWUTTU\cdededefeefeffgfaVT UWVY]]`adgegfgfghghghghghghghghghhghghghghghgh ghgghgghghgfggfgfgfgfefefedededcdcdcbcbabababa `aa`a`a``_YTTUTUTSTSTSRSRQRQRQRSTTTTNE_EJTUTUTUVUVWVWVWXWXYXYYXYVTTY`deddeddededefefefe]TUXVY\_abegfghghghghghghgghghghghghghghghghghghgfgfgfgfgffefefefefedededcdcdcbcbabaabababa`a`a`]VTTUTUTUTSTSTSRSSRSQRRQQRQQQSTTTTJEEGSTUTUVUVUVUVWVWXWXYXYXXYXUTTV]ddeedededefeffefefgfdXTVXXZ]a`cffgghghhghgghgghghghhgghghgghghghghghgghghghghgfgffggfggffgffgfgffeffeffefefedededcdcdcbcbcbccbabaabba`a`a_YTTUTUTSTSTSRSSRSRQRQRTTTTSGEJEOTUVWVWXWXYXXYWUTT [bddededeeddedefefefefgffg`UT TVXZZ^badfg hghghgghghgghghghghghghghghghghgfgfgfgffeffeeffefededcdccdccdcbcbcbabaabba`a`]VTTUTUUTSRSRSRQRRQQRQQRTTTTOEJwELTUTUVUVWVWXYXYXVTTWadedededefefefeffeefeefgfe\TTUTUVX[[^bccfhgghghghghghhghghghghghghgghghghgfgfgffgfefefefededeededdcdcdc bcbbccbcbbcbabababa`a`aZTTUTUTUUTSTTSSTSRSRQQRSTTTTLEwEHTUTTUVUVWVWVWXWXWXYXYZWUTTV^edededefefeffefgfgbXTT UTWY[\`bgdfhghghghghghghghghhghghghghgghgghgfgfg fgffggffgffgfefefedededededcdcdcdcbcba`a`VTTUTUUTUTSTSRSSRSSRQSTTTTHEEPTUTUVUVWXYZYWUTTU[cdedefefefefefgfgfg^VTT UTV[[^`cfeghghghghghhghghg fggffgfgfgffggfgfefeefeffefedededcdcdcdcbcbababa`]UTTUVUTUTSTTSTSRSRQRQQRQQSTTTTPE]EMTUTUVUVWVWXYXXYYXXYZYZYVUTTY`deddedefefgfgffgeZTT WVW[\``cgeghhihihghghghghghghgghhgfggffggffgfefeeffedededcdccdcbcbababaYTTUTUUTTSSTSRSRSRRQRTTTTME]EITUUVUVUVWVWXWXYXYZXVTTV^dededefefefgffggfgfgfggaWTTWUX[]_beghghhiihihihihghghghghghghghghghhg fggfgffgfgfgfefefeefeefededcdcdcdccdcbcbcbcbababaa`_VTTUTSTSRSRQRSTTTTIEEFQTUUVUUVUUVWXWXWXYXYZYZZYXUTT U]ceddededdedefefeefgfgfgfgf\TTW\``begihihihhiihihihihghghghgfggfgfgfgfefededededcdcdcbcbccbcbaba]UTTUTUTUTSTSRQRQRSTTTTQFELEMTUUVWVWXWXYZYZYZYXTTZbdedeedefefefefgffggfgfggdWTT WYX[aaceghhihihihihihihiihihihihghghghhghghghgfgfgfgfeffefefedededcdcbcbcba`ZTTUVUTSTSTSSTSRRQRQQSTTTTMEL~EJTUUVUVVUVWVWXWXYXYZYZYZYZWUTTXbdedefefefefgfgffgfgfgfgf_TTWZZ]abcfhihiihhihihihihihghghhghghghhggfgfefefedededcdcddcbcbaba_WTTUVUTUUTSTSTSSTSRQRQSTTTTJE~EFQTUUVUVUVVWVWWVVWXYXXYXYZYZ[ZYWUTTWbdedeedefefefgffgfggfgfgfgeYTTUTUWZ[]adcfihiihihihihhihihihihghghghghghgfgfgfgffgfefefefefedeedededcdcbcbababa]UTTUVUUTUUTUTSRSRSRRQQRQRTTTTQFEENTUUVUVWVWVWXWXYXYYXYZ[Z[ZVUTTW`eddefefefefgfgfghgfaUTT UTUXZ]]afdfiihihihihihihihihghghghghggfgfgfgfeffeefefedededcdcbcbabaa[TTUVUVUTUTSTTSRSRQRQRTTTTNEkEJTUUVUVUVWVWXWXYXYXXYZYZ[ZYVTTW_cddefefefgfgfgfghge[TT UTVY[^_aefgihihihihihihhihihghgggfg fggffggffggfgfefefedcdcbccbbcbbcbaba`YTTUTUUTUUTSRSRQRSTTTTJEkEGRTUVWVWXWXYXXYZYZYZ[YVTTV^cddedefefefefeffgfgfgfgfghgg`WTTVUY\^`behfihihihihiihihghgghghghgfgfggfeffefedeeddeddedcddcdcbccbab_WTTUTUTUTUTSRSRQRQRSTTTTRGEENTUVUVWVWXYXYZ[Z[Z[YUTTU^cddefefgfgffgffghgheZTT VWWZ]^abfighihihihihhiihihghghghghgfgfefefefedeedededcdcdcddcbab]UTTUVUTSTTSRSRRQRQRRQSTTTTNE]EJTUVUVWVWVWXWXWXYXYZYZYYZ[Z[YVTTV]edeedefeffefgfgfgfgfgfghggaVTT UXV[^_bceihihiihiihihihih ghhgghgghgghghghgfgfgfgfefefedeededcddcbcbcba\TTUVUVUTSTSRSRRQRSTTTTJE]EGRTUVWVWXYZYZZYYZ[Z[YVUTTV]efefef gffgfggfggfghge\TT VXWZ_acdghhihihihiihhiihiihhihghghghhghgfgfgfgfefededededcdcbcbccbaYTTUVUTSRSRQRSTTTTRGEENTTVWVWXYXXYYXYZYZ[\YVTTW^cededefefefefgfghghghbVTTUYZZ_cbegiihhihihihghghghghgfgfgfefefedeedeedcdcbcbcb`XTTUVUTUTUTSTTSRSRSRQRSTTTTNESEKTTVWVWXWXYXYZ[Z[Z[[Z[\[[ZWUTTX^dedefefgfgfgfghghe[TTUY\[_ccegiihiihihiihihihghghghgghgghgfgffgffgfefefeeffededcdcbcbcb_XTTUVUVU TUUTUTUTTSTTSRSRSRSTTTTKESEGRTTUVWXWXWXYXYYXYZYZ[Z[XTTY`defeefefefgfgfgfghgghggh`VTTU VY\[_deehiihihihihghhghghgfggfgffgfefeffededeedcdcdcbcb^WTTUVUTUTUTSRSSRRQSTTTTRGEENTTUVWVVWXWXYZYZYZ[Z[\[XUTTUZadefefgfghghghfZTTUVZ\^_dgfhiihiihhihihihihhghgfggfefedeeddededcdcbcbcb^VTTUVUTUUTSTSTTSSTSRSRRSRRQRRSTTTTNEPEKTTUVWVWVWXWXYXYZYZYZ[Z[Z[\[[\XVTTV\dededefefefeefefgffgfgfgfgfghghghhg`UTTVTXZ]``cgehhihiihhihghh ghgghgghgghgghgfgfgfgfefedeededcdcdcbccbc^UTTUVUUVUVUTUTSTTSRSRSSRQSSTTTTKEPEGRTTVWVWXYXXYXYZYZ[ZZ[\[\][YWUTTUX^defefefgfgfgfghg hghgghghhdYTT WVXZ]`aeghghihihghghghghgfgfgffgfeffededededcddcdcbcb]TTUVUUVUT STSTTSTSSRSRRSRTTTTRGEENTTUWVWVWWVWXWXYXYYXYZ[Z[[ZZ[\ZXVTT VY`dedeededefefgfgfghghgghgghf]UTTWX[^`behihihhghghghhgfggffgfefefededdedcdccdcb[TTUVUVUTUUTTUTSTSRRSTTTTNELEJTTUVWVWXWXYXYXXYZ[Z[\[\[\YWTTX]aedefefefefefgfgfghghcWTT WYW\`acdgighhihhghhghghgfggfgffgfe feffefefeffededcdccdccdcbc[UTTUVUVUTUTUTTUTSTSSRSTTTTJELEFRTTUVVWXWXYXXYZYZYZ[\[\]\]\XVTT Z_ceddededefefeffeefeffgfgfgfgfghghghghg[TT WYX]`aeegihhghghghgfggfgffgffgfefefedeededcdcbcb[UTTUVUVUVUVUTSTSRSRSRSRSTTTTRFEENTTUVWXYXYZ[Z[Z[\[\[[\]\YWUTTUW]acdedefefefefghghghghhg`UTT UTX[Z\`cdehhghghghhgfgfgfefeeffedeeddedcdcdcdca[TTUVVUUVUTSTTSRSRSTTTTNEKEJTTUWXWXWXYXYZYZYYZ[Z[\[\]\]\YVUTTWZ`ededdefefefgfgfgfgfghghghihhdYTTUTWZ]]adcghghhgghghgfgfgfgfefeffededcdccdcbcbZTTUVUVUVUTUT STTSTSSRSRRTTTTJEKEFQTTUVWXWXWXYZYZZYYZ[Z[\[\]\]]\]^]][XVTTUTZ_bddedefefgfgfghghgghghf\TTUVWZ]\aeefghhghhghghgfgfgffgfefededcdcdcbZTTUVUVUVUTSTSSRSSRSRSRSTTTTQFEEMTTUWXWXYXYXYZYZYZ[\[\[[\]^][XUTTWY^bdedefeefefgfgfghghghiaVTTTUVW[^^begfhghghgfgfgfefedededcddcdccba[UTTVUVUVVUTSRRSSRTTTTMEKEITTVWXWXYXYZ[Z[Z[\[[\]\]^]^^]^][XUTTUY^adeedefefgfgfghghghhghihhcYTTT UVVW\^abdgfhghgfggfgffgfefefeefededcdcb\TTVUTSTTSSRSRTTTTIEKEPTTUWXWWXWXYXYZYZ[Z[\]\\]\]^_][YUUTTWZ]bceedede feefefeefefgfgfghghgghih[TTT UXWZ\^badgfghghgfgfgfgfefeffe deeddeeddcdcddc\TTUVWVUVUVUTSTSTSRSSRRSRTTTTPEELTTUWXYZYZYZ[Z[\]\]^]^]^_^\YWUUTTUXZ_adeddedefefgfgfghghgghghhghhihihaUTTT UXWZ]_bafggfgfgfgfefedcdcdc\UTTUVUTUTSSRSRRSTTTTLEMEHSTTUVXWXYXYZYZYZYZ[Z[Z[\[[\]\]^]^ _^__][YVVUTTUTWY]`dcdedededefefefgfgfgfghghghgghihihbWTTT UTUXXY]bbceggfgfggfgfeffedededcdcddc]VTTUVUVUTSTSTSSRRSRRSTTTTSHEMEOTTUWXWXYXXYXYZYZ[ZZ[\[\]\\]\]]\]^]]^_^_^\[XWVTTUWY\_acdedefeffefgfgfgfghgghihe[TTT VXZZ^bbdeggfgfefefefedededcdcdcdc_UTTUVUVVUTUTSTSTSSRSTTTTOEEKTTUWXXYYXYYXYZ[Z[[ZZ[\]^] ^]^_^^__^_^_^\\YWUTTUTWXZ\`adcdeddefeefefgfgfghghihih]UTTTUX\[^acdegfgfefefededededcdcdccd^VTTUVWVUVUVUTUTSTSSRSTTTTKEQEGRTTVXYXXYZYZ[Z[\[\[\]\]^]^_^_`^][YXWUTVUXWZ\^`acdededefefgfgfghghhghghihihigaWTTT UVUX[[^aeddfgfefeffedeededcdcd_XTTUWVWVUVVUTUTSTSTTSTTTTRGEQENTTVXYXXYZYZYZ[\[\]\]\]^]^_^_^__^_`_`_`_`_^]\[YYXWVVUUVTUUTTUTUVUXWYZ\^^aacdcdefefgfgfgfghghghghidXTTTUWZ[^^bfdefefef efeeddeedeedcdcaXTTUWWVUVVUUVUTUTSTSSRSTTTTNEEJTTUWYXYZ[Z[\[\[[\]^]^_`a`_ ]^][\[ZZ[Z[\^`a`cbcdcdcdedededefefefgfghghhgghgghihf[TTTVUWZ[`cfefefededeedcdccdbZTTUWVWVU TUTTUTTSTTSTSSSRSSTTTTJEտZEFPTTUWXYXXYZYZYZ[Z[\[\[\]\]^]]^^]^_^__^_`_`a`a`b`ababbabbcbbcbccdccdcdcdefeffefefgffgfghghghghihihiig\TTTX_fefeefedeededcdcdb[TTVWVUVUTSSTTTTPFEZELTTVXYYXYZYZ[Z[\[\]\]]\]^]^^]]^_^_`__`_`a``a``a`abababcbccdcdcdcdeddedefefeefefefgfghghghhghihiih^UTTTU[fgfefeeffededcddc]UTTVWWVWWVUVUUVUTSTSTSSRSSTTTTLEEHSTTUXXYZYZYZ[\[\[[\]^]]^_^_`_`a`a`ababcbcbccdcdefefefefefgfgfghghihihhih`VTTT[efefeffefededc^VTTUVWVWVWVUVUTUTSSRSSTTTTSHE߾fEOTTVXYZYZ[ZZ[ZZ[Z[\[[\]\]^]^^]^_`_`a`abaabccdcdcdedeedefeefefgfgfghghghihhiihihihibWTTTZdffgfefedededcddc`XTTUWVWVUTSTTSTTTTOEfEKTTWXYZYZZYZ[\]\\]\]^_^^__^_`_`_` _``a``a`a`ababcdcdcdccddedefefgfgfghghghihihiieXTTTWbggfefedededcdcaZTTUWVUVUTUTSTSSTSSRSTTTTKEGEGQTTUWYZYZYZ[\]\]^]^]^_^_`a`abaababcbcbccbbccdcdefefgfghghiheYTTTVbgfgffefefededc\UTTVWWVUVUUVUTUTUTSSTSTTTTQGEGwEMTTUWYYZYZYZ[Z[\[[\]\]^]^_`a`ababcdccdcdededefefefefgfgffg fgfgghgghghghghghihihihieXTTTW_ggfeffeffedeedededc_WTTUVWVUVUVUTUTSSTSTTTTMEwEITTUWYZZYZ[Z[\]\]]\]^]]^_^_`_``a`a`ababcbbcbccdcdededefefgfgfghghghghihihe\TTTU]fgffgfefefefedededeedcdaYTTUWVWVWVUVUTUTSTSTTTTIE¼PEOTTUXZ[Z[\]^] ^]^_^^__^_^_`_`__`a``abababcbcbcdcdcdededdefefeefeefgfgfghghghihiihie[UTTT\egfgfefefededeedcbZUTTVWVWVUVUVVUTUTUUTSTTSTTTTOEPEKTTVXZYZ[\[\[\]\]^]^_^_`_`a``a``abababcbcbcbccdededefgfggfghghihif\UTTTXdgffgffgfefeffedeeddededc]VTTUVWXVWVUVUTSTSTTTTKEEGRTTVXZ[\[\]\]\]^]^_^_^__^_`_`_`_`a`abaababcbcdcddcdede fefefefeffgfgfgfgfghghghghihif]TTTXcgfggfefedededaXTTUWVWVUVUVUTUTUTTSTTTTRGEػaEMTTVXZ[Z[\[[\]^_`a``ababaabcbcdcdcddeededdefeffefgfghghgghghihie\TTTW_gfedededcb[UTTVXXWVWVVUVUVVUTUUTUTSTSTSSTTTTMEaEITTVXZ[ZZ[\]^]]^^]^_^__^_`_`a`ababababcbbcbcdccdcdedde feefeefeffefgfgfghghghihihe\TTTU]eggfgfefedeedeedb_VTTUWXWVWVUVUTUTUTSTTTTIEGEPTTUX[[Z[[Z[\[\]\]]\]^]^^]]^_^_`__`_`a``aa`a`ababcbcdcdcdddeddedefefefgffghghghihihhiid\TTT[dgfggfgfefefededaYUTTVXWVWVUVUTTSTTTTPEGzEKTTUXZ[\[\[[\]^]^_`_`a`a`abcbcbcddefeefefefefgfghghihihcZUTTTXdgfgfgfedededc]VTTWXWXXWVWVWVUVUTUUTTSTTTTKEzEGQTTUXY[Z[\[[\]^]^_`_`a`ababcdcddcdedefeefefeefgfghghihhihiihibYTTTW`gfgfgfeffeffefedeeded`XTTUXXWXXWVWVWVUVUVUTUTTSTTTTQGEĹSEMTTUXZZ[\[\]\]^_^^_^^_`_`_` _``a``a`a`ababcdcdcddedefgfgffgfghghgghihhihaWTTTU^fgfgfgfgfefededb\UTTVXWVWVUVUTUTTTTTMESEISTTUWY[\[\]\\]^]^_^_^_`a`abaababcbcbccbbcddefefgfghghghihiihih`VTTTZdgfgfgfefefefeded`WTTUWXXWXWXXWVWVVWVUVUTUTTSTTTTSIEEOTTUVY[[\]\]\]^]^_^_`ababcbcdcdcdcddeddeeddedefefefefgfgfgffghgghghihihhihe^VTTTWcgfggfgfefeffefedededc[UTTVXWVWVWWVUVUTUUTSTTTTOE߸mEJTTVYZ[[\]\]]\]\]^]^_^^_`_``a`a`ababcbcbcdcddeddefefgfghghghihhihd\UTTTV_gfgfefeffefeded`WTTUWXWXWXXWVWVVWVUVUTTTTTJEmEFPTTUXZ\\[\]^]^]^_^_^_`_`__`a``abababcb cbcdccddcdcddedefefeefefgfghghghihigbYTTTU[egfgfededc\UTTVXWVWVUVVUTTTTTPFEOELTTUWY[\]\]^]]^_^__^_`_`a``a``abababcbcbcddedefefeffggfgfgfgfghghghihihiif_WTTTYdgfgfefeffeffeedeeded_XTTUXXYXWVUTUUTTUTTTSTTTTLEOEHRTTUVY[\]\]\\]^]^_^_^__^_`_`_`_`a`abaababcbcdcddedefeefefefgfgfggffghghghghihihic]UTTTV`ghgfgfgfeffeffededc]VTTUWYXWXWVWVWWVVUVUTUTTTTTRHEENTTVX[\]^]^_`a``ababaabcbcdcdeededdefefefgfgfgh ihhihhihhgaZTTT\eghgfgfefedededaZUTTVYXWXWVUVUTUTTUTTTTTNEݶmEITTUVZ[\]\]^]^]^_^__^_`_`a`ababababcbbcdcdededdefeefeefefgfghghghghghihihe^XTTTXcghgfgfgfe dedeeddeeddc_XTTUXYXWXWVWVUTUTTTTTIEmEOTTVZ[]]\]^]^_^_`_`a``a``a`ababcbbcbccbcdcdcdededefefefgfghghghihiibZVTTTV_gghhgfggfefedeedc\UTTUWYXWX WXWVVWWVVWWVUVUVUTUTUUTTTTTOEQEKTTUX[\]^]^]^_`a`a`abcbcbcdededefefgffgfghghihihe_WUTTTUZfgfgfggfefefedeededbYUTTVYXWXWVWVUVVUUVUTUTTTTTKEQEFPTTVY[\]^]^]^_`__`a`abaabcdcdcdedefeefefgfghghihihifb[TTTXbfhhgfgffgfefed_XTTVXYXYXWXWVWVWVUVVUVUTTTTTPFEELTTUWZ\]^]^_^^_`_` _``a``a`a`ababcdcdcdcdeddefgfgffgfghghghihc]XTTTV]fhhgfgfefefededc]VTTWYXWXWVWVUVUVUVUTTTTTLEߴsEGRTTUVX[\]]^]^_^_`_`a`abaababcbcbccbbcddefefgfgfghghihhf`YVTTTYehgghgfgfefefededb\UTTWYXYYXXYXWVUTUTTTTTRGEsEMTTUWY]^]]^_^_^_`a`ababcbcdcdcdcdeddeededefefgfgfgfghghghihieb[UUTTTU_fhghhgfgfefefedededaZTTVYZYZYXWXXWXWVWVUVVUVVUTTTTTMEóYEISTTUW[]^_^_`_`a`ababcbcbcdcdedeefgffgfgfghghghghigb]XTTTZeghggfgfgfefefed`YUTTVXZYZYXYYXWXWXXWVUVUUVUTTTTTSIEYENTTUX[]^_^_`_`_`a``a`abababcb cbcdccddcdcdedefeffefefgfghgghhgh ghhihihgd^WUTTTX`gghghgfgfgfgfefefedc_XTTUYZYYZYXYXWXWVWVUVUTTTTTNEJEJTTVX[^^__^_`_`_`a``abababcbcbcdedefefefgfgfgfghghghihc^YUTTTUZegfggfefeefefededc]WTTUXYZYZYXYXYXWVUVUTTTTTJEJEOTTUVX[_^^_`_`_`abaababcbcdcdeddedeefeefefefgfgfggfghg hghhigc^XVTTTWbghgfefededa]VTTUXZYZYXYXWXXWXWVWVUVUTTTTTOEEKTTVX[]_`a``ababaabcbcdcdedeedeefefefgfgfghghfc]YUTTTU\ehghgfgffgfefeefededdededcb^WTTUYZYXYXWXWWXWVWVUVUTTTTTKEرmEFPTTUXZ]_`_`a`ababcbbcdcdeddeddeeefefeefeefgfgfghgfa^XUTTTVaghhgghgfeffeefededc^UUTTUYZZ[ZYXYYXWVWVUTTTTTPFEmELTTUWZ\^_`a``a`ababcbcdcdcdededeeefefefgfg hghghhghca[WTTT\ehhgfgfgfgfgfedeedededc]XTTVY[Z[ZYZYYZYXWXWXWVVWVWVUVVUVUTTTTTLEWEGQTTUVY[^_`a`a`ababcbcbcdededdeefefgffgfghda]YVTTTW`hgfgfefefededdededc]XUTTVYZ[[Z[ZYXWXWVWWVWVUVUVUTTTTTQGEWELTTUXZ]^_``a`a`ababcdcdcdedeefeefefgfgfghfgb`[XTTTU\ehhgfefefededcdcc_YTTUWY[ZYXYYXWXWVWVWWVUVVUTTTTTLEJEGRTTWY[]^a`a`a`ababcdcdcdedeefgfgffgfgfca[YTUTTTV`fgghgfgfeffededed_[VTTUXZ[Z[Z[ZYZYXYXYXWXXWWXWVWVUTTTTTRGEJEMTTVWX[\__ababcbcbccbbcdeefefgfgfgfc`\YVUTTT[dhhghhgfefefedcdc\WUTTVXZ[ZYZYYZYXYXWXWXWVWWVUVTTTTTMEEHRTTUVXZ]^_ababcdcdcdeddeeddedeefefgfcb]\XWTTTW_ghghgfgfefedcdb]YUTTVYZ[\[Z[ZYXYXWXWVWWVTTTTTRHEݮwENTTVXZ[]_`abcbbcbcdcdeddeef gffgefcb`\ZWVTTTYcghghgfgfefefefededcdcdc`ZWTTUX[ZYZYXYXYXWVWVVWVVUTTTTTNEwEISTTUVWY[\]`abcbcbcdcdcdedefeffeffefdeca_[[WWTTTV\dghgghhgfgfefededcddcda]YUTTUWY\[\[Z[Z[ZYZYXYXWXWVUTTTTTSIEɭcENTTUVWXZ\]^`b`bbcbcdedefefe fedebba^^YZUVTTTW`hhghgghgfggfggfgfefefededcb`\XUTTTVX[\[\[Z[ZYZYXYXYYXWVWVUTTTTTNEcEISTTUVVWYZZ\^^_`b`ccbdbbddcedcddcecbca`^[ZYVWTUTTTYchghggfgfedeedcdcddcb_[WUTUXZ\[Z[[ZZ[ZYZYXYXWXWVWVUTTTTTSIEUENTTUWXYYZZ[[\^]\]\[[ZXYWVWTUTTT U\ehghghhghgfgffgf efeefefeefedeedcdcdcca^YVUTVWZ[\[\[Z YZYYZYYXYYXYXWXWVWUTTTTTNEUEJTTUTUUTUUTUVTVUTUTTUTTTTW`fhghghgfggffgffgfeffedcddccddca]YVUTUVXZ[]]\[Z[ZYXWVUTTTTTJEKEOTTTTTZbhhghghgfgfgfefedcddcbcbca][WVTUVXZ]\]\[\[Z[ZZ[ZYXYXYXWXWVWVUTTTTTOEKEJTTTTTU[ehhgfgfefefefededecdcca_\YWUTUVXY[\]\]\[\[\[ZYZYXYXWXXWXWUTTTTTJEGEOTTTTTV_ghhgfgfgfefededcdcdcbca_^\YVUTUXY[\^]\]\[\[ZYXYXWXXWVWVTTTTTOEGEJTTTTTYbghgfgfgfededcdcbc bcbb``_[YXVUTUWXZ[\^]^]\]\[Z[ZYZZYXYXXYXXWXWXXWXWWVUTTTTTJEEOTTTTTUZcghghgfgfgffgfefefededcdcdccbccbcb a_\\ZXVWVTUUT UTTUUVWWYZ[]^]\]]\[\[Z[ZZYZYXYXYXWXWUTTTTTOEکzEJTTTTT]dghghgfggfefedededcdcbcbccba`^]\ZYXW XVYXXYYZ[\]\]_^]^]\]\]]\[\[[\[Z[ZZ[ZYZYXWVTTTTTJEzEOTTTTTTW^fgghhghgfgfefefedcdccbcbcbaba`a^__^_^]_^^_^^_^_^_^]^]\]\[\[ZYZYXYXWXWVTTTTTOEШpEJTTTTTTX`fghgfeffefededcdccbcbaba`_``_^_^__^ ]^]]^]]\]\]\[\[\[Z[ZYZZYXWXVUTTTTTJEpEOTTTTTUYbfgfgfgffgfefefedeedcdcddccb cbcbbababbaaba`_``_`_^_^_^]^]\]]\[\\[Z[Z[ZZ[ZYXYXYXWUTTTTTOEǧgEJTTTTT\cfgfgfefeffedcdccbcbabba`aa`_`_^__^_^]\]\[\[\[ZYXYXXWXWXWUTTTTTJEgEOTTTTV]eghgfefefedeededccbcbababa`aa`_^_^_^]\[ZYZYXUTTTTOEaEJSTTTTW^egghgfgfefedededcdcccbcbbcbaba`_`_^]\]\]\[\\[\\[Z[ZYZYZYXYXWXVTTTTSJEaENTTTTW_fgghgfgfefeefedeededccbcbaba`a`_``_^_^_^^_^]^]\[\[Z[ZYZZYXYYXYXVTTTTNE\EISTTTTUXafgfggffggfefefedededcdccbcbcbaba`aa`a`_`__`_^]\[Z[Z[ZYXYXYYXVTTTTSIE\EENTTTTWag fgfgffeefefededcdccbcbaba`a`a`_^]^]^]\]\][\[Z[ZZYZZYXYVTTTTNEEWEEISTTTTUY`ehgfgfgfefedcddcdccbcbbccbaba`aa`_``_`_`_^_^__^]\]\]\]\\[\\[Z[ZYVUTTTTSIEEWEENTTTTX`fgfgfgfefededcdcbcbababa`a`_`_`_^_^]^^]\]\]\[\[Z[Z[ZYZYXWVUTTTTNEEEVEEHRTTTTUY^egfgfefefefededcdccbaba`a`_`_^]^]^^]\]]\\]\[\[\[Z[ZZ[ZYXVUTTTTRHEEEVEEMTTTTX^ggfgfgfefededcdcdcccbcbababa`a`_`_^_^_^]\[\[Z[[ZYZZYZYXVUTTTTMEEVEEHRTTTT V]dggfggfgfgffeeffededcdccbcbaba`aa`_`_^_^__^]^]\]]\]\[\[Z[ZYZYXVUTTTTRHEEVEELTTTTV\dfgfgfgfeffededcdcdcbcba`a`_`_`_^_^]^^]\]]\[\[\[\[ZYWUTTTTLEEVEEGQTTTT\afggfgfefededcdcddcbccbabbaaba`a`_`_^_^]^]\]]\]\[\\[[\[Z[ZYZXVUTTTTQGEEVEELTTTTUZ`egfgfeffefefededcdcdcbcbcba`_`_`_^_^]^]]\[ZYZXVUTTTTLEEVEEFPTTTTUX]dfggfededcdccdcbcba`a`a`_`_^]\]\]\[\[Z[ZYWUTTTTPFEEVEEKTTTTW\afgffgfefededcddcbcbaba`a`_`_^_^]\]\\]\[\[Z[[ZYWUTTTTKEE\EEOTTTTUY`dfgfeffededccdcbcbaba`aa`a`_^]^]\[\[\[[\[ZYVUTTTTOEE\EEJSTTTTUW\aefefedcdcdcbcbabbaaba`a`_^_^]^]^]\[\[[Z[ZYXVTTTTSJEE`EENTTTTUY^cfededcdcbcbcbaba`a`a`_`_``_^]^]^]]\]]\[\[Z[ZYWUTTTTNEE`EEIRTTTTV[`efefededcdcbcbcbaba`a`a`_`_^__^]^]^]\]\[\[\[Z[ZXUTTTTRIEEfEEMTTTT UX\cffeffefedcdcbcbaba`_ ^_^__^^_^^]^]^]\]\]\[\[\\[ZYWUTTTTMEEfEEGQTTTTY^dfefefedededdcdccbcbcbaba`a`_`_`_^]\]\[ZWVTTTTQGEEÜoEELTTTTV[`ceffedededdccdcbcbabbaba`a`_`_`_^_^]^]\]\[\ZXVUTTTTLEEoEEFPTTTTUX\`dffededeeddccddcbaba`a`a`_``_^__^]^^]^]\]\]\]\[ZWUTTTTPFEE˛wEEJTTTTUX]`cedeeddcddcbcbaba`aa`_`_^_^__^]^]\]\]\ZWUTTTTJEEwEENTTTTUY]adedeeddeddcdcba`a`a`_`_^_^^]\[ZXUUTTTTNEEӚEEISTTTT VY]acdededdeddcdcdcbababa`a`_^]^]^]\][ZWVTTTTSIEEGEEMTTTTUX]`cdededdcdcbcbaba`a`_^]^^]^]\[\YXUUTTTTMEEGݙEEHQTTTT UW[^abdededcdcbcbabbaba`_^_^]\]ZYVUTTTTQHEEMEELTTTTVY\_aeddcdcbccbbcbaba`_`_`_^_^_^]^[ZXVUTTTTLEEMEEFOTTTTUWZ\_bddcdcdcbcbababa`a`aa`_^_^_^^]^^]\\ZYVUTTTTOFEEVEEJSTTTTUWY]`bbddcdcdcbcbababa`a`_``_^_^_^]\ZYWVTTTTSJEEVEENTTTTWY\^_bdcbcba` _`_``_``__^_^][ZYWUTTTTNEEgEEHQTTTTUWXY\_`aacbcbaba`a`a`_^]\ZYWWTUTTTTQHEEgEELTTTTTU XZZ]^`_acaba`a`a` _`__^_]\[YYWWUTTTTLEEŕxEEFPTTTTTUXYY[]_`_` b``a`aa^a`^`^\[YWWVVUTTTTPFEExEEJSTTTTTUTTVVWXY[ZZ[ZZ[Z[ZZYYXYWWVUVTTTTSJEEؔEENTTTTT UTUUTUUTUUTUTTTTNEEMEEHQTTTTTTTTQHEEMEELTTTTTTTTLEE^EEFOTTTTTTTTOFEE^EEJSTTTTTTTTSJEEuEEMTTTTTTTTMEEuEEGQTTTTTTTTQGEEՐEEKTTTTTTTTKEEPEENTTTTTTTTNEEPEEIRTTTTTTTTRIEEeEELTTTTTTTTLEEeEEFOTTTTTTTTOFEEɍEEIRTTTTTTTTRIEEMEEMTTTTTTTTMEEMEEGPTTTTTTTTPGEEdEEJSTTTTTTTTSJEEdEEMTTTTTTTTMEEȊEEGPTTTTTTTTPGEEMEEJTTTTTTTTJEEMEENTTTTTTTTNEEiEEHQTTTTTTTTQHEEiEEKTTTTTTTTKEEЇEENTTTTTTTTNEEVEEHPTTTTTTTTPHEEVEEJSTTTTTTTTSJEEzEEEMTTTTTTTTMEEzKEEGPTTTTTTTTPGEEK߄EEJSTTTTTTTTSJEEmEMTTTTTTTTMEmGEGPTTTTTTTTPGEGՂEIRTTTTTTTTRIEaELTTTTTTTTLEaEFOTTTTTTTTOFEEIQTTTTTTTTQIEZEKTTTTTTTTKEZENTTTTTTTTNEEHPTTTTTTTTPHEVEJSTTTTTTTTSJEVELTTTTTTTTLEEFOTTTTTTTTOFEVEIQTTTTTTTTQIEVEKTTTTTTTTKEEMTTTTTTTTME]EGPTTTTTTTTPGE]EIRTTTTTTTTRIEELTTTTTTTTLEaENTTTTTTTTNEaFEGPTTTTTTTTPGEFEIRTTTTTTTTRIEmELTTTTTTTTLEmKENTTTTTTTTNEKEGPTTTTTTTTPGE|EIRTTTTTTTTRIE|SEKTTTTTTTTKESEMTTTTTTTTMEEFOTTTTTTTTOFEgEHQTTTTTTTTQHEgJEJSTTTTTTTTSJEJELTTTTTTTTLEENTTTTTTTTNEZEGOTTTTTTTTOGEZEIQTTTTTTTTQIEEJSTTTTTTTTSJEuELTTTTTTTTLEuSENTTTTTTTTNESEGOTTTTTTTTOGEEIQTTTTTTTTQIErEJRTTTTTTTTRJErSEKTTTTTTTTKESEMTTTTTTTTMEEFNTTTTTTTTNFEzEGPTTTTTTTTPGEzYEIQTTTTTTTTQIEYGEJRTTTTTTTTRJEGEKSTTTTTTTTSKEEMTTTTTTTTMEfEFNTTTTTTTTNFEfMEGOTTTTTTTTOGEMEHPTTTTTTTTPHEEIQTTTTTTTTQIE|EJRTTTTTTTTRJE|bEKSTTTTTTTTSKEbMELTTTTTTTTLEMEMTTTTTTTTMEEFNTTTTTTTTNFEEGOTTTTTTTTOGEfEHPTTTTTTTTPHEfREHPTTTTTTTTPHERGEIQTTTTTTTTQIEGEJRTTTTTTTTRJEEKSTTTTTTTTSKEwEKSTTTTTTTTSKEwaELTTTTTTTTLEaQEMTTTTTTTTMEQGEMTTTTTTTTMEGEFNTTTTTTTTNFEEFNTTTTTTTTNFEEGOTTTTTTTTOGEpEGOTTTTTTTTOGEp^EHOTTTTTTTTOHE^QEHPTTTTTTTTPHEQGEHPTTTTTTTTPHEGEIPTTTTTTTTPIEEIPTTTTTTTTPIEEIQTTTTTTTTQIEEIQTTTTTTTTQIErEIQTTTTTTTTQIErdEIQTTTTTTTTQIEdXEJQTTTTTTTTQJEXPEJQTTTTTTTTQJEPGEJQTTTTTTTTQJEGEIQTTTTTTTTQIEEIQTTTTTTTTQIEuEIQTTTTTTTTQIEgEIPTTTTTTTTPIEbEIPTTTTTTTTPIE]EIPTTTTTTTTPIEYEHPTTTTTTTTPHEzVEHOTTTTTTTTOHErSEHOTTTTTTTTOHEiPEGOTTTTTTTTOGEbMEGNTTTTTTTTNGE]ߺKEFNTTTTTTTTNFEWڹKEFMTTTTTTTTMFETոJEMTTTTTTTTMESӷIELSTTTTTTTTSLEQжHEKSTTTTTTTTSKEM̵GEKRTTTTTTTTRKEMɴGEJQTTTTTTTTTQJEKȳGEIPTTTTTTTTPIEKIJGEHPTTTTTTPHEJ±GEHOTTTTTTOHEJ°GEGNTTTTTTNGEJ¯GEEFMTTTTTTMFEEK®GEELSTTTTTTSLEEKĭGEEKRTTTTTTRKEEMȬHEEJQTTTTTTQJEEMɫIEEIPTTTTTTPIEEQ̪JEEHOTTTTTTOHEESЩKEEGNTTTTTTNGEETӨKEEFMSTTTTTTSMFEEWէMEEKRTTTTTTRKEE]ڦPEEJQTTTTTTQJEEbߥSEEIPTTTTTTPIEEiVEEGNTTTTTTNGEErYEEFMTTTTTTMFEEz]EEKRTTTTTTRKEEbEEJQTTTTTTQJEEgEEIOTTTTTTOIEEuEEGNTTTTTTNGEEEELSTTTTTTSLEEGEEJQTTTTTTQJEEGPEEIOTTTTTTOIEEPŚXEEGNTTTTTTNGEEXәdEELSTTTTTTSLEEdݘrEEJQTTTTTTQJEErEEHOTTTTTTOHEEEEFMTTTTTTMFEEEEKRTTTTTTRKEEGEEIPTTTTTTPIEEGQEEGNTTTTTTNGEEQő^EELRTTTTTTRLEE^ؐpEEIPTTTTTTPIEEpEEGNTTTTTTNGEEEELRTTTTTTRLEEGEEIPTTTTTTPIEEGQEEGMTTTTTTMGEEQŊaEEKQTTTTTTQKEEa؉wEEIOTTTTTTOIEEwEEFLSTTTTTTSLFEEGEEEJPTTTTTTPJEEGREEHNTTTTTTNHEERĄfEKQTTTTTTQKEfۃEIOTTTTTTOIEEFLRTTTTTTRLFEMEIPTTTTTTPIEMbEGMSTTTTTTSMGEb|EJPTTTTTTPJE|EGMSTTTTTTSMGEMEJPTTTTTTPJEMfEHNTTTTTTNHEfEKQTTTTTTQKEGEHNTTTTTTNHEGYEJPTTTTTTPJEYzEGMSTTTTTTSMGEzEJPTTTTTTPJESEGMRTTTTTTRMGESrEIOTTTTTTOIErEFLRTTTTTTRLFESEINTTTTTTNIESuEKQTTTTTTQKEuEGMSTTTTTTSMGEZEJOTTTTTTOJEZEFLQTTTTTTQLFEJEHNSTTTTTTSNHEJgEJPTTTTTTPJEgEFLQTTTTTTQLFESEHNSTTTTTTSNHES|EJOTTTTTTOJE|KEFLQTTTTTTQLFEKmEHMSTTTTTTSMHEmFEINTTTTTTNIEFaEJPTTTTTTPJEaEFLQTTTTTTQLFE]EGMRTTTTTTRMGE]EINSTTTTTTSNIEVEJOTTTTTTOJEVEKPTTTTTTPKEVEFLQTTTTTTQLFEVEGLRTTTTTTRLGEZEHMRTTTTTTRMHEZEHNSTTTTTTSNHEaEINSTTTTTTSNIEaGEINSTTTTTTSNIEGmEJOTTTTTTOJEmKEJOTTTTTTOJEKzEJOTTTTTTTOJEzVEJOTTTTOJEVEJOTTTTOJEiEEJOTTTTOJEEEiMEEJNSTTTTSNJEEMEEINSTTTTSNIEEdEEINRTTTTRNIEEdȼMEEHMRTTTTRMHEEMEEGLQTTTTQLGEEeEEGLPTTTTPLGEEeɷPEEFKOTTTTOKFEEPEEJNSTTTTSNJEEuEEIMRTTTTRMIEEuղ^EEGLPTTTTPLGEE^MEEFKOTTTTOKFEEMEEINRTTTTRNIEExEEHLPTTTTPLHEExثgEEFJOSTTTTSOJFEEgVEEIMQTTTTQMIEEVMEEGKPTTTTPKGEEMGEEIMRTTTTRMIEEG݃EEGKOTTTTOKGEEݢwEEIMQTTTTQMIEEwӠoEEGKOSTTTTSOKGEEofEEHLPTTTTPLHEEf`EEFJNRTTTTRNJFEE`\EEGKOSTTTTSOKGEE\VEEHLPTTTTPLHEEVVEEIMQTTTTQMIEEVVEEFJNRTTTTRNJFEEVVEEFJNRTTTTRNJFEEVWEEGKNRTTTTRNKGEEW\EEGKNRTTTTRNKGEE\aEEGJNRTTTTRNJGEEagEEGJNQTTTTQNJGEEgpEEFJMQTTTTQMJFEEpzEEFIMPTTTTPMIFEEzGEHLOSTTTTSOLHEGڂKEGJNQTTTTQNJGEKUEFILPSTTTTSPLIFEUcEGKNQTTTTQNKGEcwEFILORTTTTROLIFEwݍJEGJMPSTTTTSPMJGEJWEGJNQTTTTQNJGEWmEHKNQTTTTQNKHEm؉JEHKNQTTTTQNKHEJYEHJMPSTTTTTSPMJHEYsEGJLORTTROLJGEsߕQEEFHKNQSTTSQNKHFEEQmEEGJLOQTTQOLJGEEmݓOEEHJMORTTROMJHEEOmEEHJMOQTTQOMJHEEmߘSEEGILNPSTTSPNLIGEESzGEEFHKMOQTTQOMKHFEEGzaEEGIKMOQSTTSQOMKIGEEa؏PEEFHJLNPRTTRPNLJHFEEPwGEEGIKMNPRTTRPNMKIGEEGwfEEFHJLMOQRTTRQOMLJHFEEfߞZEEFHIKLNOQRTTRQONLKIHFEEZՐQEE FGIJKMNOPRSTT SRPONMKJIGFEEQ̈MEE FGHIKLMNOPPQRSTT SRQPPONMLKIHGFEEMȂKEEFGGHIJJKLLMMNNOOPPQQRSTTSRQPONMLKJJIHGGFEEKĀKEEEEKłLEEEELɈPEEEEPύSEEEES֙]EEEE]kEEEEk~LEEEEL~ӗ]EEEE]wJEEEEJwї_EEEE_뼂QEEEEQ߬rJEEEEJr֠kGEEEEGkКdEEEEdΚfGEEEEGfգoKEEEEKo߱~SEEEES~ǔeGEEEEGeVEEVӧxSEESxѥxSEESxد]GEEG]mMEEMmسfKEEKfظmQEEQmɥcLEELcɫiREERi¤iSGEEGSi иiVHEE HVi ιuaRGEE GRau ξwg[QIEE IQ[gwù~umga\WSQMKJGFEEFGJKMQSW\agmu~Ƽ~vqlfc`]YXWUTTUWXY]`cflqv~ qf]VTT V]fq м}l^UTT U^l} ҼsbVTT Vbsũs`UTTU`s̰s^TT^s̪nYTTYnڼv^TT^vڸpXTTXpÛvZTTZvڴhUTTUhԪ`TT`լ_TT_bTTbʚoUTTTTUoආ_TTTT_רxWTTTTWxРpUTTTTUpҠnTTTTnئtUTTTTUt{WTTTTW{]TTTT]ԝjTTTTjWTTTTW՝hTTTThYTTTTYtTTTTt؟hTTTThє_TTTT_̎\TTTT\ȊYTTTTYLjWTTTTWʊXTTUVWWVUTTXώZTTUVWWVUTTZז^TTUVWWVUTT^eTTUVWWVUTTepTTUVWWVUTTpUTTUVWWVUTTUږ\TTUVWWVUTT\kTTUVWWVUTTkǂUTTUVWWVUTTU`TTUVWWVUTT`vTTUVWWVUTTvޙ\TTUVWWVUTT\vTTUVWWVUTTv]TTUVWWVUTT]|TUVWWVUT|dTUVWWWWVUTdڐWTUVWWWWVUTWvTUVWWWWVUTvcTUVVWWWWVUTcޔWTUVVWWWWVUTWTUVWWWWVUUTnTUVVWWWWVUTnaTUVWWWWVUUTaXTUVVWWWWVUTXUTUVWWWWVUUTU܂҂TTUVVWWWWVUTTxTTUVVWWWWVUTTxqTTUVVWWWWVUTTqkTTUVWWWWVUTTkfTTUVWWWWVUTTfcTTUVWWWWVUTTcbTTUVWWWWVUTTbbTTUVWWWWVUTTbbTTUVVWWWWVUTTbbTTUVWWWWVUUTTbfTTUVWWWWVUTTfjTTUVWWWWVUTTjpTTUVWWWWVUUTTpxTTUVWWWWVUTTxրTTUVVWWWWVUTT֠ߊTTUVWWWWVUTTߢUTTUVWWWWVUTTUYTTUVWWWWVUTTYbTTUVVWWWWVUTTbqTTUVWWWWVUTTqڀTTUVWWWWVUUTTګTTUVWWWWVUTTZTTUVWWWWVUTTZiTTUVWWWWVUTTi}TTUVWWWWVUTT}ײTTUVWWWWVUTT\TTUVWWWWVUTT\oTTUVWWWWVUTTo̷TTUVWWWWVUTTYTTUVWWWWVUTTYnTTUVWWWWVUTTnʼTTUVWWWWVUTTZTTUVWWWWVUTTZsTTUVWWWWVUTTTsTUVWWWWVUTbTUVWWWWVUTbTUVWWWWWWWVUTXTUVWWWWWWVUTXvTUVWWWWWWVUTvUTUVWWWWWWVUTUlTUVWWWWWWVUTlTUVWWWWWWVUTeTUVWWWWWWVUTeTUWWWWWWUTbTUVWWWWWWVUTbTUVWWWWWWVUTbTUVWWWWWWVUTbTUVWWWWWWVUThTVWWWWWWVThTUVWWWWWWVUTlTUVWWWWWWVUTlTUVWWWWWWVUTvTUVWWWWWWVUTvWTUVWWWWWWVUTWTUVWWWWWWVUT`TUVWWWWWWVUT`TUVWWWWWWVUTqTUVWWWWWWVUTqWTUVWWWWWWVUTWTUVWWWWWWVUTeTUVWWWWWWVUTeTVWWWWWWVT}TUVWWWWWWVUT}_TUVWWWWWWVUT_TUWWWWWWUTzTUVWWWWWWVUTz`TVWWWWWWVT`TUVWWWWWWVUTTVWWWWWWVTdTUVWWWWWWVUTdUTUVWWWWWWVUTUTUVWWWWWWVUTpTUVWWWWWWVUTpZTUVWWWWWWVUTZTVWWWWWWVTTUVWWWWWWVUTlTVWWWWWWVTlYTUVWWWWWWVUTYTUWWWWWWUTTUVWWWWWWVUTpTUVWWWWWWVUTp݃^TTUVWWWWWWVUTT^DŽUTTTUVWWWWWWVUTTUTTUWWWWWWUTTTTUVWWWWWWVUTTkTTUVWWWWWWVUTTkډ^TTVWWWWWWVTT^ȊUTTUVWWWWWWVUTTUTTUWWWWWWUTTTTVWWWWWWVTTxTTUVWWWWWWVUTTxiTTUWWWWWWUTTiڐ]TTVWWWWWWVTT]ȑUTTUVWWWWWWVUTTUTTUWWWWWWUTTTTVWWWWWWVTTTTUVWWWWWWVUTTzTTUVWWWWWWVUTTznTTUWWWWWWUTTnߘdTTVWWWWWWVTTdՙ\TTUVWWWWWWVUTT\ȚUTTUVWWWWWWVUTTUTTUWWWWWWUTTTTVWWWWWWVTTTTUVWWWWWWVUTTTTUVWWWWWWVUTTTTUWWWWWWUTTTTVWWWWWWVTTzTTVWWWWWWVTTzsTTUVWWWWWWVUTTslTTUVWWWWWWVUTTlhTTUWWWWWWUTThܦcTTVWWWWWWVTTcק`TTVWWWWWWVTT`ը_TTUVWWWWWWVUTT_ҩ]TTUVWWWWWWVUTT]ϪZTTUVWWWWWWVUTTZ̫YTTUWWWWWWUTTYʬXTTUWWWWWWUTTXǭWTTVWWWWWWVTTTWŮWTTVWWWWWWVTTWůWTUVWWWWWWVUTWŰWTUVWWWWWWVUTWűWTUVWWWWWWWWVUTWDzXTUVWWWWWWWWWVUTXʳYTUWWWWWWWWUTY̴ZTUWWWWWWWWUTZϵ]TUWWWWWWWWUT]Ҷ_TVWWWWWWWWVT_շ`TVWWWWWWWWVT`׸cTVWWWWWWWWVTcܹhTVWWWWWWWWVThlTVWWWWWWWWVTlsTUVWWWWWWWWVUTszTUVWWWWWWWWVUTzTUVWWWWWWWWVUTTUVWWWWWWWWVUTTUVWWWWWWWWVUTTUVWWWWWWWWVUTTUVWWWWWWWWVUTTUVWWWWWWWWVUTTUVWWWWWWWWVUTUTUVWWWWWWWWVUTU\TUVWWWWWWWWVUT\dTUVWWWWWWWWVUTdnTUVWWWWWWWWVUTnzTUVWWWWWWWWVUTzTUVWWWWWWWWVUTTUVWWWWWWWWVUTTUVWWWWWWWWVUTTUVWWWWWWWWVUTUTUVWWWWWWWWVUTU]TUVWWWWWWWWVUT]iTUVWWWWWWWWVUTixTVWWWWWWWWVTxTVWWWWWWWWVTTVWWWWWWWWVTTVWWWWWWWWVTUTVWWWWWWWWVTU^TVWWWWWWWWVT^kTUWWWWWWWWUTkTUWWWWWWWWUTTUWWWWWWWWUTTUWWWWWWWWUTUTUVWWWWWWWWVUTU^TUVWWWWWWWWVUT^pTUVWWWWWWWWVUTpTVWWWWWWWWVTTVWWWWWWWWVTTVWWWWWWWWVTYTUWWWWWWWWUTYlTUWWWWWWWWUTlTUWWWWWWWWUTTUVWWWWWWWWVUTTUVWWWWWWWWVUTZTVWWWWWWWWVTZpTVWWWWWWWWVTpTVWWWWWWWWVTTUWWWWWWWWUTUTUWWWWWWWWUTUdTUVWWWWWWWWVUTdTVWWWWWWWWVTTVWWWWWWWWVTTVWWWWWWWWVT`TUWWWWWWWWUT`zTUWWWWWWWWUTzTUVWWWWWWWWVUTTVWWWWWWWWVT_TVWWWWWWWWVT_}TUWWWWWWWWUT}TUWWWWWWWWUTTUVWWWWWWWWVUTeTVWWWWWWWWVTeTVWWWWWWWWVTTUWWWWWWWWUTWTUWWWWWWWWUTWqTUVWWWWWWWWVUTqTVWWWWWWWWVTTVWWWWWWWWVT`TUWWWWWWWWUT`TUWWWWWWWWUTTVWWWWWWWWVTWTVWWWWWWWWVTWvTUWWWWWWWWUTvTUWWWWWWWWUTTVWWWWWWWWVTlTVWWWWWWWWVTlTUWWWWWWWWUTTUWWWWWWWWUThTVWWWWWWWWVThTVWWWWWWWWVTTUWWWWWWWWUTbTUVWWWWWWWWVUTbTVWWWWWWWWVTTUWWWWWWWWUTbTUWWWWWWWWUTbTUVWWWWWWWWVUTTVWWWWWWWWVTeTUWWWWWWWWUTeTUVWWWWWWWWVUTTVWWWWWWWWVTlTUWWWWWWWWUTlTUWWWWWWWWUTUTVWWWWWWWWVTUׂvTVWWWWWWWWVTvTTUWWWWWWWWUTTXTTVWWWWWWWWVTTXTTTVWWWWWWWWVTTTTUWWWWWWWWUTTbTTUVWWWWWWWWVUTTbTTVWWWWWWWWVTTTTUWWWWWWWWUTT҇sTTUVWWWWWWWWVUTTsTTVWWWWWWWWVTTZTTUWWWWWWWWUTTZTTVWWWWWWWWVTTTTVWWWWW XWWYWWXWYWWXWWWWVTTʊnTTUWWWWWZXXb[fidtnqwmuuorqjkldbeWY\WWWWUTTnTTVWWWWW%ZWb`hsrwwo^`_WWWWVTTYTTVWWWWW[Wcmpqd]^WWWWVTTYTTUWWWWW \arv vj]WXWWWWUTTTTVWWWWW \Zlt ~m`^YWWWWVTT̍oTTUWWWWW ZXlw rf]WWWWUTToTTUWWWWWZiyocWWWWUTT\TTVWWWW \YsyhYWWWWVTT\TTUWWWWXWgxl]WWWWUTTTTVWWWW^d|o\WWWWVTTא}TTVWWWWh}qbWWWWVTT}TTUWWWW[d~ qcWWWWUTTiTTVWWWWdyn_WWWWVTTiTTUWWWWY\w ~n]WWWWUTTZTTUVWWWW^j  |cZWWWWVUTTZTTVWWWWc~qWWWWVTTTTUWWWWXWr }cWWWWUTTڔTTVWWWWY`~n]WWWWVTTTTUWWWW\h {eZWWWWUTTȕqTTUVWWWW `vkYWWWWVUTTqTTVWWWW g yZWWWWVTTbTTUWWWWm_YWWWWUTTbTTVWWWWXrdWWWWVTTYTTUWWWW\xjWWWWUTTYTTUVWWWWb r\WWWWVUTTUTTVWWWWe vWWWWVTTUߙTTUWWWWfv^WWWWUTTTTVWWWWe q]WWWWVTT֚TTUWWWWb{^WWWWUTTTTVWWWW`  u^WWWWVTTΛxTTUWWWWZ{\WWWWUTTxTTVWWWW^"v~nuqsswnz x\WWWWVTTƜpTTVWWWW]+vog_bW]WWZWW[WWYWW^W^ghj{ sWWWWVTTpTTUWWWW] mg\W[W XekniYWWWWUTTjTTVWWWWX|ze`WZWYZZqeWWWWVTTjTTUWWWWXlvj\XWfqeWWWWUTTfTTVWWWWl vX\W _eubWWWWVTTfTTUWWWWfd^W [an}XWWWWUTTbTTVWWWW_lWYao jYWWWWVTTbTTUWWWWZ}n[WXethWWWWUTTbTTVWWWWos]Wg{_XWWWWVTTbTTUWWWWc{hWj{`WWWWUTTbTTUWWWWYnXW]pmWWWWUTTbTTVWWWWpdWg]XWWWWVTTbTTUWWWWe{YWW c||[WWWWUTTTbTTVWWWWYpWWuiWWWWVTTTcTTUWWWWkjWWYk_WWWWUTTcTTVWWWW_fWW YbrXWWWWVTTfTUWWWWw_WW`_XWWWWUTfTVWWWW`\WW|YWWWWVTkTUWWWW[zXWW X`dWWWWUTkTVWWWWjWW]}]WWWWVT¦qTUWWWWW[\WWX`{kXWWWWWWUTqTVWWWWWh_WWb \WWWWWWVTʧxTUWWWWWW jWWYgkXWWWWWUTxTVWWWWWW`mWWm ]WWWWWVTҨTUWWWWWX}WWYtgWWWWWUTTVWWWWWdaWWX{|[WWWWVTܩTUWWWWW}jWWbgWWWWUTUTVWWWWWa{YWWXctYWWWWVTUTUWWWWWw^WWv `WWWWUTXTVWWWWW[gWW`mWWWWVTXTUWWWWWgWWg\WWWWUTaTVWWWWWubWW\}eWWWWVTaTUWWWWW\zWW csWWWWUTnTVWWWWWXgaWWs[WWWWVTnTUWWWWW}sYWW abXWWWWUṰTVWWWWW] `WWXmuYWWWWVTTUWWWWWkyXWWaYWWWWUTޮTVWWWWWX|cWWYrfWWWWVTWTWWWWW\YWWbnYWWWWTWTUWWWWWbpWW [x}`WWWWUTcTVWWWWWXn`WWc[WWWWVTcTUWWWWW|YWW^dWWWWUT°vTVWWWWWYjWWXmuWWWWVTvTUWWWWW``WWez[WWWWUTڱTVWWWWWk|YWW[aWWWWVTWTUWWWWW|oWWrfWWWWUTWTVWWWWWcWWf oWWWWVTdTUWWWWW]\WWYvXWWWWUTdTVWWWWWi~XWWx~ZWWWWVTƳ|TWWWWWttWW n\WWWWT|TUWWWWWXxjWW b`WWWWUTTVWWWWW[|^WW ]hWWWWVT]TUWWWWW\XWWZzoWWWWUT]TVWWWWW\WWykWWWWVTvTUWWWWW]sWWnvXWWWWUTvTVWWWWWblWW`XWWWWVT޶TUWWWWWj mXWWc\WWWXWWXWWXWWUT\TUWWWWWnlWW]^WWWXWWYW_]]f_gjdnk_kdcc_Y]\WWXWWUT\TVWWWWWXlhWWX\WWW#ZW\baqox~zyoee_WWXWWVTvTUWWWWWm aWWWW,WZZinv}ohc]WWXWWUTvTVWWWWWv›]WWX}`WWZWf iz vf]WYWWVTTUWWWWWcWWXxbWWYhnuj_\WWUT`TVWWWWWX|eWW X}`WWY_pwk`WWVT`TVWWWWWYwbWWY{_WW YZmwvfWWVTǹTUWWWWWX} ž_WWYrdWWXWck}lYWWUTUTVWWWWWYÜdWWqeWW[_u}m]WWVTUTUWWWWW\|ähWWzkYWWdq}l]WWUTkTVWWWWWYuëfWWX~xtdW^WW YWu}h]WWVTkTWWWWWxkYWWZ{ kn[WW]kwfYWWTڻTUWWWWW|ª|XWWY~k`c[WWgmYWWUT\TVWWWWWYu÷xWW }ydWYYWWX\t~cWWVT\TUWWWWWXn WWY{ii`WWXWWZaq`WWUTżTVWWWWWp[WWbpd^^WW^o{eZWWVTUTVWWWWWm`WWj tgWWZWWd{lWWVTUTUWWWWWcßhWWn~oheWWgp\WWUTpTVWWWWW_ëpWWXr xcY^WWZmuZWWVTpTUWWWWWaĵyXWWZz ml]WZWW[uz\WWUTTUWWWWWYZWW\ sdgXWW_y {cWWUTeTVWWWWW `WW_ zeX_XWW ^hWWVTeTUWWWWW têqXWWd qpaWYWW_~cWWUT׿TVWWWWWXl|ZWWsu[f[WWYjYWWVT^TWWWWWg^WWX |xhZ\ZWW|gWWT^TUWWWWWa fWW _ qodWWwiWWUTTVWWWWW|ZWWm w^d_WWuxrtnlqdmjitzshYWWVTZTUWWWWW~ļ_WWX zo[W[WWrwwg`aW[WWZWXWWZW[fcoylWWUTZTUWWWWWjĦfXWW] sggWWXWWXksi[\W YW[ho}eXWWUTTVWWWWWiŻ]WWjyi`aWWXc u`_W^`n|_WWVTXTUWWWWW]ŝdWWY ur`W\WWajbWXWZYdux]WWUTXTVWWWWW{WWc xei^WXWW]ziWYWX_qq[WWVTTVWWWWWr]WWY} |nWbYWWZ~d[WWX[ooYWWVTWTUWWWWW hŲtZWWdpsdW[YWW[ulWWX]tfWWUTWTVWWWWW^cWWz zhj_WWiq]WW[d}[WWVTTWWWWWoWW\ oW_[WW`cXWW_qpYWWTYTUWWWWWkŐeXWWp rreWWYWWZyw[WWg~fWWUTYTVWWWWW[ůWW_ xieaWWgmWW]q~\WWVTTWWWWW^dXWWYy }o^\\WWW]gWWXZgoYWWT\TUWWWWWXkŸ^WWeypiZWXWYvbWWhcWWUT\TVWWWWW`ƤmYWWY yk^bZWb~`WWYuYWWVTTWWWWW[|gWWXhqvv |reW]YWXz [WWcfWWT_TUWWWWWg~^WWb}YW[WYikw ~gm`WZWXh\WWc}]WWUT_TVWWWWWäyWWZhW[WWhhm|  ~s]eZW\\WW XbhXWWVTTWWWWWvcWWYl[WYWWcl[z  wxdWZYWi`WWc}`WWThTUWWWWWe`WWbkW agcm }fl_WWXWXdWWmhWWUThTVWWWWW}^XWW[YWXWWa_jkz p`b\WelWWYp|YWWVTTWWWWWf|^WW\{tWWYWW`]an|y xyfXXZWX~wWWY|iWWTtTUWWWWWsZWWw aWWXWW\`Xizq }njcWb[WWa}wZWWUTtTVWWWWWXgqWWd}XWW Z]Witz| qaZ]WYucWWccWWVTTVWWWWWXžhYWWkfWWW[XWck{w |rk]WYW`uWW[qoYWWVTTUWWWWWpƿhWWizYWWW [WYaljy rcfZWXm\WWY_WWUTYTVWWWWW ]{ ƿlWWi`WWY W`nbt ~vhZ`YW[lWWmdWWVTYTVWWWWWhpZWWnvWWX W]ggj~qq]WWXWd YWW]wvZWWVTTUWWWWW Z}ǿxWWr`WWXWW]cglxp_e[WveXWWdbWWUThTVWWWWW]^WWWZyrXWWXWW\a`jyz{{iZ^ZW\XWWYveWWVThTVWWWWWXz Ĵ]WW]ZWWYcWivxlqaWWXWggWW_|WWVTTUWWWWWbƱfXWe gWWY^X^s{vsee{[WWYvYWWUTTUWWWWWnŘ{bWpWWXY^\lxy qWWghWWUTWTVWWWWW]ƾl\WY\dWW[W^nl}`WW\|oXWWVTWTWWWWWbŴy^W_jpWW]W_kfr~ }XWWi}]WWTTUWWWWWm ¬cZWXWiWWYW[eke|iWW Y^WWUTjTVWWWWW_XW Z`x]WWbkcx_WWufWWVTjTVWWWWWcƺiWcnmWW dahuy{[WW erXWWVTTUWWWWWl ôlWZ]wXWWXWWd\gt| ~ nWW_yZWWUTTUWWWWW[ppWZgw`WWXWW ^_]n~vfWWXv\WWUT]TVWWWWW`z^ZZW[]ohWWW[\Zjy{ ^WWk^WWVT]TWWWWWXb  qgbW] sysWWW]X\jmzXWW^eWWTTUWWWWWlsbX^W_YmuwWWW ]WYiko~uWW]nWWUT{TVWWWWWZt'Ǿusa_aWWZWWYWWYWW[WX]Weep|WWW ZWWeodzkWWYtrXWWVT{WTVWWWWW[w"Ʒv{roqrlzvw_WWWXWbhho bWWtvYWWVTWTUWWWWW]xøcWWWYWWbcln~ZWWfZWWUTTUWWWWW` dWWWZWW``bo~zXWW`\WWUTtTVWWWWWbgWWWXWW]cZl{x|[WW` _WWVTtUTWWWWWgcWWW \`Wju~~z[WWZ_WWTUTUWWWWWg âiWWW\Z[em}{}YWWY^WWUTTVWWWWWYb nYWWW [Y[aom}}XWWYbWWVTnTVWWWWW]qWWW Y\WaodyqWWXuhWWVTnTWWWWW YnWWWX]tWWyfWWTTUWWWWWa  ĹmWWWY}WW{eWWUTTVWWWWW\hWWWY~WWXufWWVTpTVWWWWW`o  ïbWWW[wXWWXohWWVTpUTUWWWWW[jè}^WWW \~[WWwgWWUTUTUWWWWW`vYWWWZ}[WW^WWUTTVWWWWWaŸjWWW]WWZ ^WWVTxTVWWWWW_u ìeWWW~cWW\cWWVTxWTUWWWWWjo]WWWvhWW]bWWUTWTUWWWWWX`nfZWWWrgXWW]]WWUTTVWWWWWYhxWYWWWryXWW`YWWVTTVWWWWWcxëjWWWgZWWl{XWWVT_TUWWWWWgk`WWW_cWW|qYWWUT_TUWWWWWpz]YWWWahWWYmWWUTTVWWWWWZ_nükWWWYsZWW`lWWVTTVWWWWWZ^n`^WWWXZWWkgWWVToTWWWWWZcuƷ~oWXWWWYufWW|]WWToUTUWWWWWZet ǿ`]WWWksWW[WWUTUTUWWWWWXfn rhWWWbYWWgxWWUTTVWWWWWW`is°t_WWW[eWWxhWWVTTWWWWWW ZabȿthWWWxXWW\^WWTbTUWWWWWWXWrȹtmX[WWWZt[WWcXWWUTbTUWWWWWWer ǹtgXYWWWYdkXWWY{wWWUTTVWWWWWW\`erøvp[_WWW``WW_eWWVTTVWWWWWWXWW_n mm^ZXWWWYzmWWYvZWWVTTWWWWWWfnYWYWWWr[WWd WWT_TUWWWWWWnlWWWasWWY|nWWUT_TUWWWWWWpƤkWWWXaWWc _WWUTTVWWWWWWkŪ]WWWn{]WWWWVTTVWWWWWW nǢ[WWWalXWWmnWWVTTUWWWWWWyǐ[WWWYycWW a_WWUT`TUWWWWWWXő]WWWe~]WWX{ zXWWUT`TVWWWWWWYy Ǜ^WWW] mWWXmgWWVTTVWWWWWWXu ʚXWWWYl bWWd]WWVTTWWWWWW ɆWWWc`WWYlXWWTTUWWWWWWX~YWWW Zt bWWz]WWUThTUWWWWWW[ʽYWWW]{^WWumWWUThUTVWWWWWW]YWWW[y|WWq\WWVTUTVWWWWWWZ‡WWWXbsZWWXlsWWVTTVWWWWWWrWWWxs[WWZn_WWVTTWWWWWWYoYWWWaxaWW]roWWTvTUWWWWWWd˱wWWWYs }dYWW_yZWWUTvZTUWWWWWWeɲzWWW_lWWdhWWUTZTVWWWWWW^pWWWns`WWl|XWWVTTVWWWWWW^ ˺aWWW[eYWW[t_WWVTTWWWWWWmʦaWWWef_YWWXh nWWTTUWWWWWWmˣoWWWZnjYWWcrXWWUTpTUWWWWWWggWWWY{}fWWXZpcWWUTpXTVWWWWWWeaWWWdydWW^mkWWVTXTVWWWWWWi ˠ]WWWXlhW\twWWVTTVWWWWWW|˓_WWWYwrZ\YWYWkw[WWVTTWWWWWWƓbWWW_}ih_WZWagv_WWTTUWWWWWWwģ[WWWb}l`^^WWXWXWWXWZ[_jldWWUTvTUWWWWWWt ʙWWWe-~|sfii^bbWbcakijvvgWWUTv^TVWWWWWWɊWWWYliWWVT^TVWWWWWWXƄ[WWW r pWWVTTVWWWWWW]‰ZWWW\poZWWVTTWWWWWW^ WWW Zt x[WWTTUWWWWWWǂWWW \b~\WWUTTUWWWWWWsWWW[iXWWUTnTUWWWWWW[mZWWWc|YWWUTnYTVWWWWWWb~YWWWk|WWVTYTVWWWWWWc~WWWg vYWWVTTWWWWWWX;oWWWdx pYWWTTWWWWWW_fWWW^vhWWTTUWWWWWWnfWWWq_WWUTTUWWWWWWp ˦lWWWiv\WWUTsTVWWWWWWc̵iWWWYg|mWWVTs^TVWWWWWWf\WWW[qwcWWVT^TVWWWWWWo]WWWbvi]WWVTTWWWWWWw̖cWWWXWjvWYWWTTWWWWWWX șdWWWY_swgWWTTUWWWWWWn ̡]WWW Zeye\WWUTTUWWWWWWrΛYWWWYezkWXWWUTTUWWWWWW˄YWWWXex c_WWUTsTVWWWWWWĊ[WWW XctwgWWVTs`TVWWWWWWYÑ[WWW_l{n^ZWWVT`UTVWWWWWW\ǐXWWW\ek}rfXWWVTUTWWWWWWZˈWWWY]^m}  lfW[WWTTWWWWWWYsWWWXW]kn{ tl^[WWTTUWWWWWW_tWWWW%]X`quy||meeW[WWUTTUWWWWWWdνXWWWW\YYhjjtyy~}~~}~xstgj`Y\WYWWUTTUWWWWWW]WWWWX\WZ\X\\W\ZW\WWXWWUTTUWWWWWWY kWWWWWUTsTVWWWWWWaθfXWWWWWVTsbTVWWWWWWmϩnWWWWWVTbVTVWWWWWW kqWWWWWVTVTWWWWWWclWWWWWTTWWWWWWeϴ\WWWWWTTWWWWWWs[WWWWWTTUWWWWWWzΝhWWWWWUTTUWWWWWWXw˧aWWWWWUTTUWWWWWW Xp̧ZWWWWWUTTVWWWWWWrКWWWWWVT}TVWWWWWWωYWWWWWVT}lTVWWWWWWȉ^WWWWWVTl^TVWWWWWWȘ]WWWWWVT^UTWWWWWWΐYWWWWWTUTWWWWWWXɃWWWWWTTWWWWWW {WWWWWTTWWWWWW`|WWWWWTTUWWWWWWeWWWWWUTTUWWWWWW\zWWWWWUTTUWWWWWW[jWWWWWUTTUWWWWWWbkYWWWWWUTTVWWWWWWktYWWWWWVTTVWWWWWWmuWWWWWVTTVWWWWWWX`iWWWWWVTqTVWWWWWWd ^WWWWWVTqfTVWWWWWWrbWWWWWVTf]TVWWWWWW{ϢlWWWWWVT]VTWWWWWWtͭeWWWWWTVTWWWWWWqЮWWWWWTTWWWWWWyўWWWWWTTWWWWWWXόZWWWWWTTWWWWWWYǎ\WWWWWTTUWWWWWW Y|њZWWWWWUTTUWWWWWWWWWWWUTTUWWWWWW}YWWWWWUTTUWWWWWWY ǀZWWWWWUTTUWWWWWW_XWWWWWUTTUWWWWWW`†WWWWWUTTUWWWWWW ZǀWWWWWUTTVWWWWWWZoWWWWWVTTVWWWWWWcӹqWWWWWVTTVWWWWWWlxWWWWWVTTVWWWWWWhtWWWWWVTTVWWWWWW`gWWWWWVT~TVWWWWWWe^WWWWWVT~vTVWWWWWWydWWWWWVTvqTVWWWWWWtnWWWWWVTqlTVWWWWWWlfWWWWWVTlfTVWWWWWWoө]WWWWWVTfcTWWWWWW yҜ[WWWWWTc`TWWWWWWД_WWWWWT`]TWWWWWWX ̚[WWWWWT]YTWWWWWWX}ΤXWWWWWTYXTWWWWWWXWWWWWTXWTWWWWWWXЁWWWWWTWUTWWWWWWZˀ[WWWWWTUUTWWXWYXW[WWaW_`WY`W\^WX[WWXWWWWW_ʌYWWWWWTUUTWWYWXaWkgrvwz|~~titc^cZWWXWWWW]ʅXWWWWWTUTWW%ZW`^atlùð tqn_WZXWWWWzWWWWWTTWW\Wehtõ{rdW[YWWWW XqWWWWWTTWWXW[]eu{ һqobWWXWWWWbpWWWWWTTWW _]v Ӷw_a[WWWWjWWWWWTTWW [Wkxξ{rdWWWWfwWWWWWTTWW [Wp{ սr[WYWWWW_hWWWWWTTWW[hy ƾmY]WWWWjdWWWWWTTWWXav ӱfaWWWWXwjWWWWWTTWWZWs{ܿufYWWWWXvԬlWWWWWTTWW do ɴk\WWWWXgӸdWWWWWTUTWWZa Ӿo^WWWWo[WWWWWTUUTWWg}êpaWWWW}֘aWWWWWTUUTWWeɮrbWWWWԙfWWWWWTUWTWWdʳqbXWWWWϟaWWWWWTWXTWWczʯnZXWWWWXyѤWWWWWTXYTWW\~ ͫ_WXWWWWԗWWWWWTY]TWW_h Ԧz^WWWWY πWWWWWT]`TWW iėuYWWWW\ɍXWWWWWT`cTWW \| βlXWWWW^ВYWWWWWTcfTVWWmç|cXWWWW]҈WWWWWVTflTVWW`{ӸcWWWWXxWWWWWVTlqTVWW Xl Ѩ~XWWWW[rXWWWWWVTqvTVWW^ƊkWWWWdxYWWWWWVTv~TVWWhƟx_XWWWWe׿~XWWWWWVT~TVWWzձ]WWWW\ xWWWWWVTTVWWX mWWWW\ fWWWWWVTTVWWY[Ӫw\WWWWkiXWWWWWVTTVWW[mֳz[WWWWx֭pWWWWWVTTVWW X{ LjfWWWWpӳmWWWWWVTTUWWY~ēoYXWWWWXeչbWWWWWUTTUWW̧lWWWWlXWWWWWUTTUWW Ya ѮpZWWWWXך^WWWWWUTTUWWYe޻mYWWWWY՟hWWWWWUTTUWW nֲu]WWWWZzԪ^WWWWWUTTUWWmᴂ`WXWWWWXz֡\WWWWWUTTUWWrڹ^WWWWדZWWWWWUTTWWt XWWWWЈYWWWWWTTWWrĈ_XWWWWZʐ[WWWWWTTWWm\WWWWYΞXWWWWWTTWWe ߽`WWWW ZՊWWWWWTVTWWa ݴWWWW]{WWWWWTV]TVWW^ٱzZWWWW\xXWWWWWVT]fTVWWֱgWWWWh~WWWWWVTfqTVWW ^ѱcXWWWWXgǀWWWWWVTqTVWW\bYWWWWX[qWWWWWVTTVWWX{͑hWWWW_eWWWWWVTTVWWl ʌ`WWWWhٶiYWWWWWVTTUWWgپʺ۹WWWWrٴwXWWWWWUTTUWWc"è}rwhil_ebWdcYibdpwoٵnXWWWWXpٸrWWWWWUTTUWW^ ָtqiWbWXWWXWXWWbZ bs{դbWWWWXbcWWWWWUTTUWW| űuhaW[WW ^Wcx ԎbXWWWW sٮ[WWWWWUTTWWj ٿehWXWW fmxẄYWWWWםbWWWWWTTWWa˵|iaWXWW []a ٲtXWWWWYԤeWWWWWTTWWq^YWWXWWoեfWWWWZu׳^WWWWWTUTWWeϽY^WWc|Ѝ[WWWWXzWWWWWTU^TVWWeصqeWWZwtWWWWZWWWWWVT^lTVWW[Ñv[WWvߜiWWWW[ӌ^WWWWWVTl}TVWWt ܼt]WW v͎ZWWWW\͒]WWWWWVT}TVWWa΢|aWWy oWWWWX֙ZWWWWWVTTUWWXϹfWWXa}ҤdWWWWٌXWWWWWUTTUWWjÝqYWWXZd҂ZWWWWwXWWWWWUTTUWW[^WWa~ܩqYWWWW\ƅWWWWWUTTWWtʜr\WWpҘ`WWWWfƉWWWWWTTWW bdWW`wYWWWWe̓WWWWWTTWWYvaWWX]mעfWWWW]wWWWWWTVTVWWdզjZWWXe΁ZWWWW`fWWWWWVTVbTVWW\̜]YWWcکiWWWWmۺoWWWWWVTbsTVWWj ŏaXWWXWЀ[WWWWqۿwWWWWWVTsTUWY^WW^pWWWWXipWWWWWUTTUWm ܾ}^WW}ώWWWWe ܽaXWWWWWUTTUWܺxZWW ^hiXWWWWqܮ`XWWWWWUTTUWixZWWw͒YWWWW۞hWWWWWUTTWZܽ\WWYiaXWWWWz֭iWWWWWTTWm\WWZ{Ӏ\WWWWtڸ^WWWWWTUTVWZ̍WWXfWWWW{WWWWWVTU`TVWhڒWWeXWWWWXٖ\WWWWWVT`sTVW۟\WW`ݥ^WWWWYՖ`WWWWWVTsTUW^ ڨdXWWX`tZWWWW\ҝYWWWWWUTTUWXr ٺrWWYcٖaWWWW ZכWWWWWUTTUW^ŁZWWzfWWWWXWWWWWUTTWXiҘYXWWb ҈ZWWWWX|XWWWWWTTW[֮jWWXdcWWWWZ̄ZWWWWWTTVWcyWWpyWWWW`͐YWWWWWVT^TVWyXWW[}ؐZWWWW^ҀXWWWWWVT^sTVWZٲ`WW\gWWWW[tWWWWWVTsTUWg|WWXsuYWWWW_oWWWWWUTTUW{ؙ]WW֔^WWWWpܽsWWWWWUTTWYkWWfgWWWWp |WWWWWTTWa֐WWxwYWWWWeiWWWWWTTVWvٰfWW _ݓ^WWWWf_WWWWWVTYTVWπ\WW{`WWWWtޱgXWWWWWVTYnTUW^ݪdWW`tWWWWm\^WWWWWUTnTUWp{YWWXv ֋WWWWY ̳sc\bWWWWWUTTUW۱dWWahWWWW[YmhtaW]WWWWWUTTWY΍YWWY{nWWWZWipпjk\WWWWWTTVWd۴oWWcyXWWWXWqt ̮|iWYXWWWWWVTTVWwј]WWؕYWWW\mzƪ|_^YWWWWWVT^TVWXݾuXWWobXWWW `X| Ǣqf]WWWWWVT^vTUW^۠^WW\pWWWZWtشlbWWWWWUTvTUWg}YWWuxWWWgwxeWWWWWUTTWqݺeWW_׏WWWaʶiWWWWWTTVWX|ܘZXWWߣ[WWWYekYWWWWWVTTVWY|WXWWYsdWWWiѿg[WWWWWVTXTVW\ݷiWWX]mWWWX\ ջz`ZWWWWWVTXpTUW_ ܝ\XWW XzWWWdx ٹp`ZWWWWWUTpTUWgԅWWwՍWWWwpWWWWWUTTWvjWWkߡWWWYf ϭcWWWWWTTVW[WWX\WWW_z ƥybWWWWWVTTVWYܐ[WWjWWWn һl]WWWWWVTZTUW`yXWWrgWWW^~Ťxc[WWWWWUTZvTUWhoWWmzWWWcֹt[XWWWWWUTvTWkޭdWW`͊WWWw ͪgWWWWWTTVWmڜ_WW[ًWWXWWWXZҽo[WWWWWVTTVWrՏ]WW[}voZWZWWW ZaȧsXXWWWWWVTUTVW~ʅYWWuΡydeWWXWWW^mϺ}bWWWWWVTUhTUWX~WW oĤyd\_WWW_gXWWWWWUThTUW[ܾqWWfϲtnWWYWWg ׿mWWWWWUTTW_ۻcWW ^ һoXdWWXoȡeWWWWWTTVW_ZWW\ 쿟~vcW\WWYuήqXWWWWWVTTVWZܙZWWYǫbmYWW[yϬf[WWWWWVT`TUW[֐[WW ӯmW`YWW]{ڧwZWWWWWUT`TUWeєYWW ׸utcWWYyԧv_WWWWWUTTVWjӏWWs »xWd[WWXx ժWWWWWVTTVWeԃWWr Ϫw~hWYYWW }Ҭu[WWWWWVTTUWdzXWWw  Ƭin_WWt ̦pWWWWWUT_TUWo zYWWXl rW[YWWt˚kZWWWWWUT_TWsĂXWWe ڿrtfWWjƗiWWWWWTTVWYlʁXWWk ̼za][WWcڿ^WWWWWVTTVWXd{WWsģ~lXWW֯~YWWWWWVTTUWf}XWWj ɭpjcYWWX  ѪoYWWWWWUTbTUWmLjXWWj ϲ}dWWXWW X÷ȼϛeWWWWWUTbTWfӈWWvli`WWXWWYv#l|gpvkq{r|ˋbWWWWWTTVWb؅WW㻩r[W[WWXk)о}fh\W^WXWWXWWYWWZWW]YXhpuپ]WWWWWVTTUWgٌ^WWX ͪ|qgWWXWW` ƤywX^WWXW [WWgrکyXWWWWWUTUTUWf ؟]WW\{ Ͷde_WW[ ƦxbWYW\ fvͥbWWWWWUTUoTW_ڜ[WWY ֻnWWXWWgλ}^_W XWYbƍaWWWWWToTVW\ڞcWW̾nfcWWXФc_WXW[s׽{[WWWWWVTTVW_۳bWWZ̯ycY[WWXtzgWmԩmXWWWWWVTTUWX޼jWWaȺviYWWf՞~bWl̎bWWWWWUT_TUW yWWjݿkY_ZWWί\WWoڶ[WWWWWUT_TVWXʂXWWtɨteWWXWWi仍fWWYk ԩnXWWWWWVTTVWZ{Ԍ\WWX} ˹{g`^WWXWW]ԝw^WWXW\tĉZWWWWWVTTUWXtڤ_WWY 涛|n[X[WWÈ^WWYhӺnYXWWWWWUTWTUWXoݶ_WWZ  |jfWW^ ңvXWWc|fWWWWWUTWxTVWXesWW\ ɮz^W^WWȕfWWqWWWWWVTxTVW^ˁXWWg߰qm[WYWWhῆWWcѧiZWWWWWVTTUW\ՐdWW|йrWeWWZٴ{WWX]y‰^WWWWWUTUTUW[ڱ`WWX  Ģ}y_W\WWp٩uWWYsծ^WWWWWUTUpTVWX߷lWW\ ʪjn\WWWZ ԢlWWsȊ^WWWWWVTpTVWYuΉWWc зlW^XWoٛiWWX[u ײpWWWWWVTTUWXecWW  ݽfsbWWXW_۟`WWsŀ_WWWWWWUTTWbqWW  ߼x[e\Ws[WW[fԫpWWWWWWTnTVW ^~WWXb ˰zkWYXW\aWWXq̓ZWWWWWVTnTVWZ՝\WW ̪cn_Wm[XWWYsӤhWWWWWVTTUWXymWW[  ׿rWoXWW] āYWWWWUTUTWXgˁ[WWk  lscW`yWW_֜eWWWWTUtTVW ]۞eWW Ҽ}cd\WyՋWWbwXWWWWVTtTUWZvYWW^ m[W\ߟ]WWj͎`WWWWUTTUWYӒZWWYx  ̰ld`[WnkXWWYtֲgXWWWWUTWTVWXlܱkWW ]ұyiWWYW[WW[{ZWWWWVTW{TVWY͎[WW rpc`WWXWiߕZWWc_WWWWVT{TUWߧgXWWX r[\\WX|dWWroWWWWUTTWwȃ^WWm ƫ|sgWWXWW^΀WWaljWWWWT]TVWgީdWWX ˹}b[_j\WWX_ӥ`XWWWWVT]TUW]ńXWWp ݺvWWX ڷvYWWWWUTTUWX}ٱhWW\ ĩXWWeɌWWWWUTTVWlʅ[WWy֊eg|hWW|֔`WWWWVTjTVW`߳pXWW`hWXWWapd ߏZWWdسmWWWWVTjTUWY~ۏbWWYW XWWbtj  pWWYnx]WWWWUTTWi޺WWk|WYWWgxw ݒ\WWc˗[WWWWTWTVW[٫iXWWYcWZY Wfuƾ lWWZդ_WWWWVTWTUWu ʑ\WWs[WW[Y`hw\WWhڶvWWWWUTTUWXoݹrZWWexXWW[ ZjuWW YxYWWWWUTTVW^ݢoWWaeWWYaXi]WWjя^WWWWVThTVWϑcWWZWWXkdrWW`רbWWWWVThTUWe[WWlkWWXmcwsWWYyڱpWWWWUTTVWX~ߴnWW cZWWYWXjolaWWqxWWWWVTYTVWaҰ_YWW[mWWm~vޚXWW[YWWWWVTYTUWXbXWWWWYWXm{WWԏ]WWWWUTTVWuȋcWWxWW \Y[p bWWYlڣaWWWWVTTVWXZƊdWW waWW`YcvXWWeګgWWWWVTtTUWvݽWWoݍYWWXWWaXfz߉XWW]زrWWWWUTtTW_޼x]WWlnWW XWWcd_{rWWpXWWWWTTVWYrܺmZWWe[WWXWWcnjdWWu|ZWWWWVThTUW]|\WW YffWWYWW`wdYWWgАXWWWWUThTW}vaWW[i XWWX[Wcuo YWWaٍ]WWWWTTVW c߲WW[s kWWYWW`z  ރYWWZՕcWWWWVT_TUWXWt乑cXWW[|ݑXWWYX^`y΀WWXԨaWWWWUT_TWW_ϙYYWWYiWWX^agyzWWzسWWWWTTVWWXoҗnWW\߅WW^`dlWWtۦeWWWWVT\TUWWZu\WW YlaWWfXs_WWXpٴnWWWWUT\TWWpزgZWW^y WWXW[lew YWWfڽgWWWWTTVWWYĜpWWg\WW [WWllw \WW ]۸hWWWWVTYTUWWh֮WWXWz nXWWZWWkzp `WWc۳yWWWWUTYTWWvҚsZWW [ZWWYXWos`WW^{WWWWTTVWWZ֮fZWW _u]WW Z]Wr\WW\nWWWWVTWTUWWlƟsaZWWXWs{XWW^]YmYWW_nWWWWUTWTVWWZz ໗o^WW][XWW`_ ir[WWbڼxWWWWVTTVWWcضbYWWqiWWYWW`\gp`WWbvWWWWVTXTUWWYj ۻdYWXWW\eWWWXWW_fiqZWW_kWWWWUTXTVWWY޾k_ZXWW r WWWXWW^tlXWW]kXWWWWVTTUWWaƣebZWW\b[WWWX[Wayl_WWa۲nXWWWWUTZTUWWjαup`WW]WypWWWX^WbuugWWjoXWWWWUTZTVWWY{ İmWW ZXfu؉XWWWYWdvbWWqkWWWWVTTUWW[ǵhabWW]Zr}`WWW\ [wmXWWXreWWWWUT^TWWXe޿|dfaWWZWWXWXWXWW f]zykXWWW _g^}~WWXv٩^WWWWT^TVWWXY#ɿxqsg_hW]bWZcWbc]iie~w zWWW b`l~WW؜_WWWWVTTUWW pϹ³ķߊWWW XWWh_oߒWW֗`WWWWUT׿eTVWWXWXWWWYWWu[WW\ϖZWWWWVTeTUWWe  [WWW_ aXWWi͏XWWWWUTTUWWXghWWWoXWWzzWWWWUTpTVWW Y_ qWWWWW XjWWWWVTpTUWW YexWWWsݒWW\dWWWWUTUTVWWn zWWWg\WWfܥcWWWWVTUTVWW[z uWWWqpXWWwؙ`WWWWVTTUWWZz֏WWW`Ԉ[WWYύ\WWWWUTż\TVWW`{׋`WWW^WWbȂXWWWWVT\TUWWX}ۓ`WWW{kWWswXWWWWUTTWW]ۗYWWW uҁYWWYܷhWWWWTڻkTVWW֖WWWmݕ\WW`إ\WWWWVTkTUWW]ՐZWWW\jWWp،XWWWWUTUTVWW[x ˏYXWWWX߆\WWwWWWWVTUTUWW\e˂]WWWyfWW`fWWWWUTTVWWhyYWWWpzWW~ݦ[WWWWVTǹ`TVWWikXWWW`^WW_ڎWWWWVT`TUWWi  fWWWYwYWWYztWWWWUTTVWW Xh٠dXWWWXq_WWc^WWWWVTvTUWW`y͏\XWWWewXWW}XWWWWUTvTVWWm y[WWW\aWWbzWWWWVT\TUWWYlܫoWWWÀ[WWY޿eWWWWUT\TUWWc ΙbWWWhkWW kܝ[WWWWUTTVWWx 清[WWWXь]WW]}WWWWVT޶vTUWW [j ֡sWWWyyWWXufWWWWUTvTVWW_x  fWWWiaXWWeYWWWWVT]TUWWmԧo]WWW^ډ`WW_{WWWWUT]TVWWY|ÊWYWWWyyWW}ܯeWWWWVTTUWW[k˜vWWWeiXWWc ώ[WWWWUT|TWW`p ߴ~cWWWXۡ_WWcrWWWWT|TVWW eb\WWWXaΌ\WW\י_WWWWVTƳdTUWWeƗwWXWWW˅`WWZ|vXWWWWUTdTVWWiϣlbWWWtWWyܦ]XWWWWVTWTUWW[m͡~[YWWW^wZWWt~WWWWWWUTWTVWW_tɨuhWXWWWoڲmWWo۬`WWWWWWVTTUWWZpΜ\ZWWW_޸sYWW wɄXWWWWWWUTڱvTVWWZYf巤qbWWWj_]WWuޣeWWWWWVTvTUWW YXc~ ϸmWWW[YWW} zYWWWWWUT°cTVWW XY_tšiWWWqaWW]ޤ^WWWWWVTcTUWWX]i ǶwWZWWW^㿎YWWdʁWWWWWUTWTWW]w˺X`WWWXjǙfWWjڠbWWWWWTWTVWWi{зj[WWWs]WWXW{uWWWWWVTTUWW_gl ʢumWXWWWXj ޵`ZWWY\؏]WWWWWUTޮTVWWY Wm ŹrcW[WWWY~ΗqZWW^i޸kWWWWWVTTUWW ^foy lpWYWWWfܶ`WWXWiɆXWWWWWUṰnTVWWXWWapv¨bgZWWWYn  ϥ~_WWWYZwڠaWWWWWVTnTUWW&XZW`pmy ÿkt[]WWXWWWY œw_W _o޾rWWWWWUTaTVWWXWYe`aywnimWaWWW\ٷq`W ZWȗYWWWWWVTaTUWWXWW[`W_^ZbcXefXg\WdWX_WXWWYWWWYrjdWcrڪjWWWWWUTXTVWWXWWWW[׳ulXWYf}}WWWWWVTXTUWWWWW` y]WWXW YWeqҕ_WWWWWUTUTVWWWWWXh¨j_Y[W jhٲnWWWWWVTUTUWWWWWXƬ|peWXZWWXW \Wgj ߿YWWWWWUTTVWWWWW^'˳sxiXa_WX[WWYWWXW`XXh^v}Δ^WWWWWVTܩTUWWWWW#Ⱦ|wuשhWWWWWUTTVWWWWWWk ߲mWWWWWVTҨxTUWWWWWWXWvzWWWWWUTxTVWWWWW\}ZWWWWWVTʧqTUWWWWWY ΋\WWWWWUTqTVWWWWf ԕ`WWWWVT¦kTUWWWWXp٠^WWWWUTkTVWWWWYs  aWWWWVTfTUWWWW[wڨ`WWWWUTfTTVWWWWXr cXWWWWVTTcTTUWWWW]z ֧hXWWWWUTTcTTVWWWW{ ΣjWWWWVTTTbTTUWWWW[|ǝlWWWWUTTTbTTVWWWWtÓiWWWWVTTbTTUWWWWYf޹fWWWWUTTbTTUWWWW Ydبv^WWWWUTTbTTVWWWW[ ѝkYWWWWVTTbTTUWWWW^̋eWWWWUTTbTTVWWWW_yڹy\WWWWVTTbTTUWWWWlϧlWWWWUTTfTTVWWWW]’dWWWWVTTfTTUWWWW\pг|YXWWWWUTTjTTVWWWW dŔrWXWWWWVTTjTTUWWWWi׮xcWWWWUTTpTTVWWWW\yÔi[WWWWVTTpTTVWWWW XYW˧{YYWWWWVTTƜxTTUWWWW[eٱhWWWWUTTxTTVWWWWXay׻e]WWWWVTTΛTTUWWWWd{޽sXXWWWWUTTTTVWWWWb}ڿqcWWWWVTT֚TTUWWWWf} غxWZWWWWUTTUTTVWWWWby֮hbWWWWVTTUߙTTUVWWWW \q濪oWWWWVUTTYTTUWWWWiǸybXWWWWUTTYTTVWWWWcq Ӿ|nWWWWVTTbTTUWWWW]bpԴ}xW\WWWWUTTbTTVWWWWYo l]XWWWWVTTqTTUVWWWW\s} į{\cWWWWVUTTqTTUWWWWW^_`~º{ya]WWXWWWWUTTȕTTVWWWWW+bcd|պélo^WZWWWWVTTTTUWWWWW"]XYpjr~~x{rdkX]WWYWWWWUTTڔTTVWWWWWXWWYWY`W]bX`aW`_W`WWZWWWWVTTZTTUVWWWWWWWWVUTTZTTUWWWWWWWWUTTiTTVWWWWWWWWVTTiTTUWWWWWWWWUTT}TTVWWWWWWWWVTT}TTVWWWWWWWWVTTאTTUWWWWWWWWUTT\TTVWWWWWWWWVTT\TTUWWWWWWWWUTToTTUWWWWWWWWUTToTTVWWWWWWWWVTT̍TTUWWWWWWWWUTTYTTVWWWWWWWWVTTYTTVWWWWWWWWVTTnTTUWWWWWWWWUTTnTTVWWWWWWWWVTTʊTTVWWWWWWWWVTTZTTUWWWWWWWWUTTZTTVWWWWWWWWVTTsTTUVWWWWWWWWVUTTsTTUWWWWWWWWUTT҇TTVWWWWWWWWVTTbTTUVWWWWWWWWVUTTbTTUWWWWWWWWUTTTTTVWWWWWWWWVTTXTTVWWWWWWWWVTTXTTUWWWWWWWWUTTvTVWWWWWWWWVTvUTVWWWWWWWWVTUׂTUWWWWWWWWUTlTUWWWWWWWWUTlTVWWWWWWWWVTTUVWWWWWWWWVUTeTUWWWWWWWWUTeTVWWWWWWWWVTTUVWWWWWWWWVUTbTUWWWWWWWWUTbTUWWWWWWWWUTTVWWWWWWWWVTbTUVWWWWWWWWVUTbTUWWWWWWWWUTTVWWWWWWWWVThTVWWWWWWWWVThTUWWWWWWWWUTTUWWWWWWWWUTlTVWWWWWWWWVTlTVWWWWWWWWVTTUWWWWWWWWUTvTUWWWWWWWWUTvWTVWWWWWWWWVTWTVWWWWWWWWVTTUWWWWWWWWUT`TUWWWWWWWWUT`TVWWWWWWWWVTTVWWWWWWWWVTqTUVWWWWWWWWVUTqWTUWWWWWWWWUTWTUWWWWWWWWUTTVWWWWWWWWVTeTVWWWWWWWWVTeTUVWWWWWWWWVUTTUWWWWWWWWUT}TUWWWWWWWWUT}_TVWWWWWWWWVT_TVWWWWWWWWVTTUVWWWWWWWWVUTzTUWWWWWWWWUTz`TUWWWWWWWWUT`TVWWWWWWWWVTTVWWWWWWWWVTTVWWWWWWWWVTdTUVWWWWWWWWVUTdUTUWWWWWWWWUTUTUWWWWWWWWUTTVWWWWWWWWVTpTVWWWWWWWWVTpZTVWWWWWWWWVTZTUVWWWWWWWWVUTTUVWWWWWWWWVUTTUWWWWWWWWUTlTUWWWWWWWWUTlYTUWWWWWWWWUTYTVWWWWWWWWVTTVWWWWWWWWVTTVWWWWWWWWVTpTUVWWWWWWWWVUTp^TUVWWWWWWWWVUT^UTUVWWWWWWWWVUTUTUWWWWWWWWUTTUWWWWWWWWUTTUWWWWWWWWUTkTUWWWWWWWWUTk^TVWWWWWWWWVT^UTVWWWWWWWWVTUTVWWWWWWWWVTTVWWWWWWWWVTTVWWWWWWWWVTxTVWWWWWWWWVTxiTUVWWWWWWWWVUTi]TUVWWWWWWWWVUT]UTUVWWWWWWWWVUTUTUVWWWWWWWWVUTTUVWWWWWWWWVUTTUVWWWWWWWWVUTTUVWWWWWWWWVUTzTUVWWWWWWWWVUTznTUVWWWWWWWWVUTndTUVWWWWWWWWVUTd\TUVWWWWWWWWVUT\UTUVWWWWWWWWVUTUTUVWWWWWWWWVUTTUVWWWWWWWWVUT~TUVWWWWWWWWVUTqTUVWWWWWWWWVUTlTUVWWWWWWWWVUThTUVWWWWWWWWVUTdTUVWWWWWWWWVUTbTUVWWWWWWWWVUTz_TUVWWWWWWWWVUTs\TVWWWWWWWWVTlYTVWWWWWWWWVThXTVWWWWWWWWVTcܹWTVWWWWWWWWVT`׸WTVWWWWWWWWVT_շVTUWWWWWWWWUT]ҶVTUWWWWWWWWUTZϵUTUWWWWWWWWUTY̴UTUVWWWWWWWWWVUTXʳUTUVWWWWWWWWVUTWDzUTUVWWWWWWVUTWűUTUVWWWWWWVUTWŰUTTVWWWWWWVTTWůUTTVWWWWWWVTTTWŮUTTUWWWWWWUTTXǭUTTUWWWWWWUTTYʬVTTUVWWWWWWVUTTZ̫VTTUVWWWWWWVUTT]ϪWTTUVWWWWWWVUTT_ҩWTTVWWWWWWVTT`ըXTTVWWWWWWVTTcקYTTUWWWWWWUTThܦ\TTUVWWWWWWVUTTl_TTUVWWWWWWVUTTsbTTVWWWWWWVTTzdTTVWWWWWWVTThTTUWWWWWWUTTlTTUVWWWWWWVUTTqTTUVWWWWWWVUTT~TTVWWWWWWVTTTTUWWWWWWUTTUTTUVWWWWWWVUTTU\TTUVWWWWWWVUTT\ȚdTTVWWWWWWVTTdՙnTTUWWWWWWUTTnߘzTTUVWWWWWWVUTTzTTUVWWWWWWVUTTTTVWWWWWWVTTTTUWWWWWWUTTUTTUVWWWWWWVUTTU]TTVWWWWWWVTT]ȑiTTUWWWWWWUTTiڐxTTUVWWWWWWVUTTxTTVWWWWWWVTTTTUWWWWWWUTTUTTUVWWWWWWVUTTU^TTVWWWWWWVTT^ȊkTTUVWWWWWWVUTTkډTTUVWWWWWWVUTTTTUWWWWWWUTTUTTTUVWWWWWWVUTTU^TTUVWWWWWWVUTT^DŽpTUVWWWWWWVUTp݃TUVWWWWWWVUTTUWWWWWWUTYTUVWWWWWWVUTYlTVWWWWWWVTlTUVWWWWWWVUTTVWWWWWWVTZTUVWWWWWWVUTZpTUVWWWWWWVUTpTUVWWWWWWVUTUTUVWWWWWWVUTUdTUVWWWWWWVUTdTVWWWWWWVTTUVWWWWWWVUT`TVWWWWWWVT`zTUVWWWWWWVUTzTUWWWWWWUT_TUVWWWWWWVUT_}TUVWWWWWWVUT}TVWWWWWWVTeTUVWWWWWWVUTeTUVWWWWWWVUTWTUVWWWWWWVUTWqTUVWWWWWWVUTqTUVWWWWWWVUT`TUVWWWWWWVUT`TUVWWWWWWVUTWTUVWWWWWWVUTWvTUVWWWWWWVUTvTUVWWWWWWVUTlTUVWWWWWWVUTlTUVWWWWWWVUThTVWWWWWWVThTUVWWWWWWVUTbTUVWWWWWWVUTbTUVWWWWWWVUTbTUVWWWWWWVUTbTUWWWWWWUTeTUVWWWWWWVUTeTUVWWWWWWVUTlTUVWWWWWWVUTlUTUVWWWWWWVUTUvTUVWWWWWWVUTvXTUVWWWWWWVUTXTUVWWWWWWWVUTbTUVWWWWVUTbTUVWWWWVUTsTTUVWWWWVUTTTsZTTUVWWWWVUTTZTTUVWWWWVUTTnTTUVWWWWVUTTnʼYTTUVWWWWVUTTYTTUVWWWWVUTToTTUVWWWWVUTTo̷\TTUVWWWWVUTT\TTUVWWWWVUTT}TTUVWWWWVUTT}ײiTTUVWWWWVUTTiZTTUVWWWWVUTTZTTUVWWWWVUTTڀTTUVWWWWVUUTTګqTTUVWWWWVUTTqbTTUVVWWWWVUTTbYTTUVWWWWVUTTYUTTUVWWWWVUTTUߊTTUVWWWWVUTTߢրTTUVVWWWWVUTT֠xTTUVWWWWVUTTxpTTUVWWWWVUUTTpjTTUVWWWWVUTTjfTTUVWWWWVUTTfbTTUVWWWWVUUTTbbTTUVVWWWWVUTTbbTTUVWWWWVUTTbbTTUVWWWWVUTTbcTTUVWWWWVUTTcfTTUVWWWWVUTTfkTTUVWWWWVUTTkqTTUVVWWWWVUTTqxTTUVVWWWWVUTTx҂TTUVVWWWWVUTTUTUVWWWWVUUTU܂XTUVVWWWWVUTXaTUVWWWWVUUTanTUVVWWWWVUTnTUVWWWWVUUTޔWTUVVWWWWVUTWcTUVVWWWWVUTcvTUVWWWWVUTvڐWTUVWWWWVUTWdTUVWWWWVUTd|TUVWWVUT|]TTUVWWVUTT]vTTUVWWVUTTvޙ\TTUVWWVUTT\vTTUVWWVUTTv`TTUVWWVUTT`ǂUTTUVWWVUTTUkTTUVWWVUTTkږ\TTUVWWVUTT\UTTUVWWVUTTUpTTUVWWVUTTpeTTUVWWVUTTeז^TTUVWWVUTT^ώZTTUVWWVUTTZʊXTTUVWWVUTTXLjWTTTTWȊYTTTTY̎\TTTT\є_TTTT_؟hTTTThtTTTTtYTTTTY՝hTTTThWTTTTWԝjTTTTj]TTTT]{WTTTTW{ئtUTTTTUtҠnTTTTnРpUTTTTUpרxWTTTTWxආ_TTTT_ʚoUTTTTUobTTbլ_TT_Ԫ`TT`ڴhUTTUhÛvZTTZvڸpXTTXpڼv^TT^v̪nYTTYn̰s^TT^sũs`UTTU`s ҼsbVTT Vbs м}l^UTT U^l} qf]VTT V]fqƼ~vqlfc`]YXWUTTUWXY]`cflqv~Ƽ~vqlfc`][ZYWVVWYZ[]`cflqv~ qf]XVV X]fq м}l^WVV W^l} ҼsbXVV Xbsũs`WVVW`s̰s^VV^s̪n[VV[nڼv^VV^vڸpZVVZpÛv\VV\vڴhWVVWhԪ`VV`լ_VV_bVVbʚoWVVVVWoආ_VVVV_רxYVVVVYxРpWVVVVWpҠnVVVVnئtWVVVVWt{YVVVVY{]VVVV]ԝjVVVVjYVVVVY՝hVVVVh[VVVV[tVVVVt؟hVVVVhє_VVVV_̎\VVVV\Ȋ[VVVV[LjYVVVVYʊZVVUTSSTUVVZώ\VVUTSSTUVV\ז^VVUTSSTUVV^eVVUTSSTUVVepVVUTSSTUVVpWVVUTSSTUVVWږ\VVUTSSTUVV\kVVUTSSTUVVkǂWVVUTSSTUVVW`VVUTSSTUVV`vVVUTSSTUVVvޙ\VVUTSSTUVV\vVVUTSSTUVVv]VVUTSSTUVV]|VUTSSTUV|dVUTSSSSTUVdڐYVUTSSSSTUVYvVUTSSSSTUVvcVUTTSSSSTUVcޔYVUTTSSSSTUVYVUTSSSSTUUVnVUTTSSSSTUVnaVUTSSSSTUUVaZVUTTSSSSTUVZWVUTSSSSTUUVW܂҂VVUTTSSSSTUVVxVVUTTSSSSTUVVxqVVUTTSSSSTUVVqkVVUTSSSSTUVVkfVVUTSSSSTUVVfcVVUTSSSSTUVVcbVVUTSSSSTUVVbbVVUTSSSSTUVVbbVVUTTSSSSTUVVbbVVUTSSSSTUUVVbfVVUTSSSSTUVVfjVVUTSSSSTUVVjpVVUTSSSSTUUVVpxVVUTSSSSTUVVxրVVUTTSSSSTUVV֠ߊVVUTSSSSTUVVߢWVVUTSSSSTUVVW[VVUTSSSSTUVV[bVVUTTSSSSTUVVbqVVUTSSSSTUVVqڀVVUTSSSSTUUVVګVVUTSSSSTUVV\VVUTSSSSTUVV\iVVUTSSSSTUVVi}VVUTSSSSTUVV}ײVVUTSSSSTUVV\VVUTSSSSTUVV\oVVUTSSSSTUVVo̷VVUTSSSSTUVV[VVUTSSSSTUVV[nVVUTSSSSTUVVnʼVVUTSSSSTUVV\VVUTSSSSTUVV\sVVUTSSSSTUVVVsVUTSSSSTUVbVUTSSSSTUVbVUTSSSSSSSTUVZVUTSSSSSSTUVZvVUTSSSSSSTUVvWVUTSSSSSSTUVWlVUTSSSSSSTUVlVUTSSSSSSTUVeVUTSSSSSSTUVeVUSSSSSSUVbVUTSSSSSSTUVbVUTSSSSSSTUVbVUTSSSSSSTUVbVUTSSSSSSTUVhVTSSSSSSTVhVUTSSSSSSTUVlVUTSSSSSSTUVlVUTSSSSSSTUVvVUTSSSSSSTUVvYVUTSSSSSSTUVYVUTSSSSSSTUV`VUTSSSSSSTUV`VUTSSSSSSTUVqVUTSSSSSSTUVqYVUTSSSSSSTUVYVUTSSSSSSTUVeVUTSSSSSSTUVeVTSSSSSSTV}VUTSSSSSSTUV}_VUTSSSSSSTUV_VUSSSSSSUVzVUTSSSSSSTUVz`VTSSSSSSTV`VUTSSSSSSTUVVTSSSSSSTVdVUTSSSSSSTUVdWVUTSSSSSSTUVWVUTSSSSSSTUVpVUTSSSSSSTUVp\VUTSSSSSSTUV\VTSSSSSSTVVUTSSSSSSTUVlVTSSSSSSTVl[VUTSSSSSSTUV[VUSSSSSSUVVUTSSSSSSTUVpVUTSSSSSSTUVp݃^VVUTSSSSSSTUVV^DŽWVVVUTSSSSSSTUVVWVVUSSSSSSUVVVVUTSSSSSSTUVVkVVUTSSSSSSTUVVkډ^VVTSSSSSSTVV^ȊWVVUTSSSSSSTUVVWVVUSSSSSSUVVVVTSSSSSSTVVxVVUTSSSSSSTUVVxiVVUSSSSSSUVViڐ]VVTSSSSSSTVV]ȑWVVUTSSSSSSTUVVWVVUSSSSSSUVVVVTSSSSSSTVVVVUTSSSSSSTUVVzVVUTSSSSSSTUVVznVVUSSSSSSUVVnߘdVVTSSSSSSTVVdՙ\VVUTSSSSSSTUVV\ȚWVVUTSSSSSSTUVVWVVUSSSSSSUVVVVTSSSSSSTVVVVUTSSSSSSTUVVVVUTSSSSSSTUVVVVUSSSSSSUVVVVTSSSSSSTVVzVVTSSSSSSTVVzsVVUTSSSSSSTUVVslVVUTSSSSSSTUVVlhVVUSSSSSSUVVhܦcVVTSSSSSSTVVcק`VVTSSSSSSTVV`ը_VVUTSSSSSSTUVV_ҩ]VVUTSSSSSSTUVV]Ϫ\VVUTSSSSSSTUVV\̫[VVUSSSSSSUVV[ʬZVVUSSSSSSUVVZǭYVVTSSSSSSTVVVYŮYVVTSSSSSSTVVYůYVUTSSSSSSTUVYŰYVUTSSSSSSTUVYűYVUTSSSSSSSSTUVYDzZVUTSSSSSSSSSTUVZʳ[VUSSSSSSSSUV[̴\VUSSSSSSSSUV\ϵ]VUSSSSSSSSUV]Ҷ_VTSSSSSSSSTV_շ`VTSSSSSSSSTV`׸cVTSSSSSSSSTVcܹhVTSSSSSSSSTVhlVTSSSSSSSSTVlsVUTSSSSSSSSTUVszVUTSSSSSSSSTUVzVUTSSSSSSSSTUVVUTSSSSSSSSTUVVUTSSSSSSSSTUVVUTSSSSSSSSTUVVUTSSSSSSSSTUVVUTSSSSSSSSTUVVUTSSSSSSSSTUVWVUTSSSSSSSSTUVW\VUTSSSSSSSSTUV\dVUTSSSSSSSSTUVdnVUTSSSSSSSSTUVnzVUTSSSSSSSSTUVzVUTSSSSSSSSTUVVUTSSSSSSSSTUVVUTSSSSSSSSTUVVUTSSSSSSSSTUVWVUTSSSSSSSSTUVW]VUTSSSSSSSSTUV]iVUTSSSSSSSSTUVixVTSSSSSSSSTVxVTSSSSSSSSTVVTSSSSSSSSTVVTSSSSSSSSTVWVTSSSSSSSSTVW^VTSSSSSSSSTV^kVUSSSSSSSSUVkVUSSSSSSSSUVVUSSSSSSSSUVVUSSSSSSSSUVWVUTSSSSSSSSTUVW^VUTSSSSSSSSTUV^pVUTSSSSSSSSTUVpVTSSSSSSSSTVVTSSSSSSSSTVVTSSSSSSSSTV[VUSSSSSSSSUV[lVUSSSSSSSSUVlVUSSSSSSSSUVVUTSSSSSSSSTUVVUTSSSSSSSSTUV\VTSSSSSSSSTV\pVTSSSSSSSSTVpVTSSSSSSSSTVVUSSSSSSSSUVWVUSSSSSSSSUVWdVUTSSSSSSSSTUVdVTSSSSSSSSTVVTSSSSSSSSTVVTSSSSSSSSTV`VUSSSSSSSSUV`zVUSSSSSSSSUVzVUTSSSSSSSSTUVVTSSSSSSSSTV_VTSSSSSSSSTV_}VUSSSSSSSSUV}VUSSSSSSSSUVVUTSSSSSSSSTUVeVTSSSSSSSSTVeVTSSSSSSSSTVVUSSSSSSSSUVYVUSSSSSSSSUVYqVUTSSSSSSSSTUVqVTSSSSSSSSTVVTSSSSSSSSTV`VUSSSSSSSSUV`VUSSSSSSSSUVVTSSSSSSSSTVYVTSSSSSSSSTVYvVUSSSSSSSSUVvVUSSSSSSSSUVVTSSSSSSSSTVlVTSSSSSSSSTVlVUSSSSSSSSUVVUSSSSSSSSUVhVTSSSSSSSSTVhVTSSSSSSSSTVVUSSSSSSSSUVbVUTSSSSSSSSTUVbVTSSSSSSSSTVVUSSSSSSSSUVbVUSSSSSSSSUVbVUTSSSSSSSSTUVVTSSSSSSSSTVeVUSSSSSSSSUVeVUTSSSSSSSSTUVVTSSSSSSSSTVlVUSSSSSSSSUVlVUSSSSSSSSUVWVTSSSSSSSSTVWׂvVTSSSSSSSSTVvVVUSSSSSSSSUVVZVVTSSSSSSSSTVVZVVVTSSSSSSSSTVVVVUSSSSSSSSUVVbVVUTSSSSSSSSTUVVbVVTSSSSSSSSTVVVVUSSSSSSSSUVV҇sVVUTSSSSSSSSTUVVsVVTSSSSSSSSTVV\VVUSSSSSSSSUVV\VVTSSSSSSSSTVVVVTSSSSSRSSRSSRSRSSSSTVVʊnVVUSSSSSRSRNQLKMFIGEIEEHGHJJIMNMSRQSSSSUVVnVVTSSSSS%QSNOKFG@?:7814001/-0-02//51498;?DEHPOOSSSSTVV[VVTSSSSSQSMIH?<54/--'+''('()'('(('()('*)'-004:@AGMPPSSSSTVV[VVUSSSSS QNGE;9.0*()'('('('('(''()'(+-/4/%&%&%%&%%&&'&'&'&''&'&'&&'&''&'&'&'&'('('('(''(('(,7CQSSSSTVVbVVUSSSSI8*%&%%&%&%%&%&'&'&&'& '&&'&&''&&'&'&''&&'&&'&'&'('('('('()1@PRSSSSUVVbVVTSSSSRF4'%%&%&%&%&%&&%%&%&&%&'&'&'&'('('('(('(-@MSSSSTVV[VVUSSSSPD1&%&%&%%&%&%&%&'&'&' &''&&''&'&'&''&'&'(''(('(''(''*:KSSSSUVV[VVUTSSSSN@.%&%&%&%&%%&%&%&%&%&%&'&&'&'&'&'&&'&'&'&'('('('('+;GQSSSSTUVVWVVTSSSSM=-%&%& %&%&&%&%%&&%&%&%&%&'&'&'&'&&'&'&'&'('(''('*5ESSSSTVVWߙVVUSSSSL:+%&%&%&%&%&&%%&&%&%&%&'&'&'&'&''&''&'&'(''(*3EPSSSSUVVVVTSSSSM9(%&%&%&%&%&%&%&%&%&'&'&'&'&''&'&''&'&'('*/GPSSSSTVV֚VVUSSSSN8(%&%&%&%%&%&%&%&&%&%&%&'&'&'&'&'&'&'('('1BPSSSSUVVVVTSSSSO9%&% &%&&%&&%&%%&%&&%&%&%&%&'&'&'&'&''&&'&'&''&''&&'&'&'1EPSSSSTVVΛxVVUSSSSR8%&%%%&%&%&%&%'&((',*,/*2/+0,+-*&*(&&'&&'&'&'&'&'&'&&'('(4CQSSSSUVVxVVTSSSSP9%$%%$%&%%&%&%(&+-157<<@EAIFGFFEHC@@?874/)*)&'&'&'&'&''&'&'&''&'&'(')3DQSSSSTVVƜpVVTSSSSP=&%$%&%&%&%&%&%&%&(%&'')13;?EHKONSPSSRSSQSSRSSPSPLKJB=94.)&(&'&&'&&'&'&'&'&'&'&'()4FSSSSTVVpVVUSSSSP?+$%$%&%% &(%/1NSSSSTVVfVVUSSSSL6$$%%$%$%$%$%%'4.&'&'&'&'&'&'&&'&'1COSSSSUVVbVVUSSSSRA($%$%$$%%$%$%$%$%$+5HRSPG6+'&'&'&''&&''&&''&'&'&'(4ISSSSUVVbVVTSSSSH-$%%$%$%$%$%$%$%$%$$%$->MSL>/(&'&'&'&',:PSSSSTVVbVVUSSSSM6%$%$%$%$%$%%$%$(1CRSSNB2)&&'&'&'&'&''&&'&'&''(,BQSSSSUVVVbVVTSSSSR=($%$$%$ %$%$$%$$)6HSSE8)&'&'&'&'&'&''&'&'&'&')6KSSSSTVVVcVVUSSSSJ0$#$%$%$%$%$+:JSSRJ=,'&'&'&'&'&'&'&'+?OSSSSUVVcVVTSSSSO:&$#$%$%$%$%+=LSSRN?'&'&'&'&'&'&&'&'&'2GSSSSTVVfVUSSSSE)$#$#$%+>OSSOA.&&'& '&'&&''&&'&&'&'&'&''&''*9PSSSSUVfVTSSSSO4#$#$$#$#$%$%'?QSS?-(&'&&'&'&'&'&''&&'&'&,CRSSSSTVkVUSSSSQC'##$#$#$%$$(=SSRO>2&'&'&' &'&&''&&'(6MSSSSUVkVTSSSSK3##$#$ #$##$$##$$#$=SSPB1'&'&'&' &''&''&'&&'&'.APSSSSTV¦qVUSSSSSQ>&$#$#$#$#$#$:QSSOB.&'&'&' &'&'&&'&&5JSSSSSUVqVTSSSSS K/$$#$#$$#$#$%6OSSN=+&&%& '&&''&&'&'&&'&'-AQSSSSSSTVʧxVUSSSSSS>%#$#$#$#$# $#$#$$#$$#%3JSSRL:*&'&&'&'&)4JSSSSSSUVxVTSSSSSSO.#$#$#$#$#$#$.ISSI6)&'&'&'&'&+@PSSSSSTVҨVUSSSSSRA#$##$#$#$##$#$#$*?SSRF4'%&'&'&'& '&&''&&(6LSSSSSUVVTSSSSSM2#$#$#$#$##$#$##$#$$&;NSSRC0&%&%&'&'&&'&'&'&&-CQSSSSTVܩVUSSSSSA)#$#$#$##$##$#$$##$2JSSN=)&%&'&'&'&(7LSSSSUVWVTSSSSSN4%$#$#$#$#$#$#$#$(CRSSRN6)&%&%&%&'&'&'&'&'.FRSSSSTVWVUSSSSSD,#$##$#$##$#$#$&;PSSE,'%&%&'&'&*;OSSSSUVZVTSSSSSQ9%#$#$ #$#$##$$/LSSO=,&&%&%&'&'&'.ISSSSTVZVUSSSSSK0#$##$#(@SSL6&%%&%&%&'&'&'&,AQSSSSUVaVTSSSSSE&"#"#$#$#$%2NSSQB.%&% &%&%&%&%&%&'&&'&'7MSSSSTVaVUSSSSSQ9#"#"#)CSSM<)%&%&%&'&'&&'0FSSSSUVnVTSSSSS RL,"#"#"##"#$#7NSSF-&%&%&'&'*""!!"!"!"$8SSRC)%%$%&%%&&%&%&%&1HSSSSUV]VTSSSSSQ8"!"!"!"#?SSC,%%$$%&%%&%&%&',JSSSSTVvVUSSSSS P2!"!!"!"!!"%FSSI1$%%$%&%&%&&-ESSSSUVvVTSSSSSN1!"!"!"!"!")ISSO1%&%%&%&&(ASSSSTV޶VUSSSSSJ0"!!""!!""!"!"!"!"!-ISSN7%&%&&%'@QSSSSUV\VUSSSSSH-"!"!"!!"!"!"!"!"!"/ISSP<&%$%$$%$%&%&%&%)?PSSSRSOPPLOLKMHJOJMNNORPQSSUV\VTSSSSSI+!""!"!"!"!"!"!"1KSS;&$%$%$%$%&%&%&*9QSSS#RSQNNGHEA@:<87926656758<9=ACDHMMPSSRSSTVvVUSSSSSI("!"!"!"!"!"!"!"0NSS<)%%$%$%$%&%%(7SS SRRKIE@;7412-,-,+,++,,+,++-+-1/28;;BHKNPSSUVvVTSSSSSE&!"! "!!"!!"!""!"!""3PSSRB*$$%$$%$%$%%&8OSSRSL KC>733+.+,+,+,+,+,+,+,+./-7=@ELPSRSSTVVUSSSSSA)!"!"!"!"!"!"!"7NSSRD'%$%$%$%%&6NSSRLI>;1+-+,+,,+,+,+,+,+024=FKPQSSUV`VTSSSSSRB*! "!""!!""!!"!"!"3LSSRB+$%$%$%$%%&4OSSROH@83+++,+,+,+,++,,+,+ ,+,,.6>EJOSSTV`VTSSSSSRD&!"!"!#1NSSRC+$%$$%$%%5OSSRQID75+-+,+,+,+,+,,+,,+,+18@ELSSTVǹVUSSSSSRA&!"!"!!"!"!"!2OSSRG*$$%%$$%%$%$%$%$%%%7MSS NJ<7-,+,,++,+,+,+,+,+,+,+,+,+,+,++/3:BJRSSUVWVTSSSSSR?' ! !"!"!"!!""3MSSG($%$%$$%$%$%&6MSSQPF=1-+,++,+,+,+,,+,,+,++,+,+ ,+,+.07BIPSSTVWVUSSSSSQA( !"/KSSC*$%$%$%$%%&4JRSSMG:1.+,+,++,+,+,++,+,+,+,+,+,+,++-27BJPSSUVkVTSSSSSRE%!"!,LSSA+$%$%$%$%%&1:DFMSPSSRSF<3+,+,+,+,+,+,+,+,+,,+,+,++,,+08BKQSSTVkVSSSSSD%! ! !-JRSSRC)%$$%$%$%$%$%$% &+(.,6;AJIQSSPJ@0.+,+,+,+,+,+,,+,+,+,+,+0:DLRSSVڻVUSSSSSB)! ! ! ! ! !"!,BSSRA'$%$$%$$%$%$%$%%&)%%&(%+22;?JONQSSLA6,+,++,+,+,+,++,+,+,++,+,,+,+,+2;IRSSUV\VTSSSSSRE+! ! ! !'DSS<%$%$$%$%$%%$%%&% &)'.5;BCMSRRSSQF90+,+,+,++,+,+,++,+,+,+,,+,+,+,+,+,+,5BNSSTV\VUSSSSSH'! ! !! ! !&@SSR6&$%$%$%$%$%$%$%$%$$%$%$% ',-38CKKOSSRSSRO?2-*+*+,+,++,+,++,++,+,+,+,+,+,+,+,++,+ ,+,,++,,+,+0%$#$%$$%$$%%$%&%&%%&%&%%&%%&%%+21;@FMLRSSPD3+*+*++,+,+,+,,+,+,+,+,+,+,++,+.CNSSUVeVTSSSSS?* ! ! ! ! ! !"3OSSO6$%$%$ %$%%$%$%%$$%$%&% &%&%&&%&%&%& (*'/58ACMSORSS PA2+*+**++**+*+*++,+,+,+,+,+,+,+,+2>KSSTVeVUSSSSSE)! ! ! ! !-GSSM+$%$%$%$%$%&%&%&%&%&%&%&(-)39@GHNSRSSOB/+*+**+*+*+*+*+*+*++,++,,+,+,+,++,+,+,+,,+,+,+,,+,+/EQLQSSRA.*+*+*+*+*+*++,+,+,+,,++,+,++,+,+,+,+,+,/9KRSSTV^VSSSSSL/! ! ! ! !!#9PSS<%##$#$%$%$$%$$%$%$%$%%$%&%&%&%&%& %'*&,58BDKRQRSSC0+**+*+*+*++*+,+,+,+,+,+,+,++,++,+,+,+,+,+,+,-:LSSV^VUSSSSSN7" ! ! ! ! #-LSSO1$##$#$%$$$%%$$%$%$%$%$% &%&%&%&&%&%&%& %&&%&--2:@GHMSSE+*++*+**+*+*+*+*++,++,+,+1-3 54173120+.-,+,++,+,++,+,+,+,+,+-9KSSUVVTSSSSS9$  ! ! ! ! !! *BQSSI*#$#$#$$##$$%$%$%$%$%$%&%&%&%&%%&%& %&('(137=EPMOSSE0*+*+*+*+*+*+*+*+++,+/.76>?DGFIJGMJKKFCF@>992-.,+,+,+,,++,,+,+,++,+ ,+,,++-;KRSSTV\VUSSSSSA)  !%6OSSRA$#$#$$##$#$#$$#$$%$%$%%$$%$%$%&%&%&%& '&)'*49?CHQSQSSG2,*+*+*+*++**+*++ /.89EELOOSQSSRS QSQLNHD>85/+,+,+,+,,+,+,+,++,,++,+/FKQQS RSQLHB=4-++,+,+,+,+,+,+.OSSTVZVUSSSSS P8"    ! 2MSSR>%#$#$# $#$$#$$#$#$$%$$%$%$$%%$%$%&%&%%&%&%&'& '&(++29BHSNRSSRA-*+*+*+*+*+*,7BMQSSRQH>1++,,+,+,,+,+, +,++,+,+,,+8IRSSTVYVUSSSSS K2!       )FQSSM4%#$#$#$#$#$#$$#$#$%$%$%$%$%%$%&%&%&%&%&%&'&'&' &(-(0:        "8NSSC+#$#$##$#$#$#$$##$%$%$%$%$$%$%$%&%&%&%&%&'&'&'&'(1/8=CKJOSSK6*+**+*+*+*+*09GPSSQM@5.+,+,+,+,+,+,+1BQSSTVVSSSSS?&     *HSSQ6$##"#$#$#$#$$#$#$$$%$%$$%%$%$%&%&%%&%&&%&&%&%&'&'&'&'&&'&' *(+36>AHSOQSSO<,*+**+* +*++*+**2@NSSOG<2-,+,+,+,+,+,3HRSSV[VUSSSSSJ1       8LSSG'#$#$#$#$#$$#$%$%$%$%$%&%&%%&%&%&%&'&'&'&'&'&&' ,*/8LSSRL;.+,+,+,+,+,++,+,+6HRSSV\VUSSSSSJ.      &>PSSM4"#"#$#$#$#%$$#$#$%$%$%$%$%$%&%&%& %&&%%&%&%%&%&'&'&&'&&'&'&&'('+-06=CHKRSRSRE0*)*+*+*+*+1ANSSK=0,,+,++,+,+,+/=NSSUV\VTSSSSSO9"     /IRSSR@("#"#"#$##$##$ &//*$&&$$#$%$%$%$%$%$%$%$%&%&%%&%&%&'&'&')').33;DJPNRSN7**)*)*+*+*+**/AOSSR>2+,+,+,+,2ERSSTVVSSSSSQB(        #8LSSK-""#"#"#"#"#$##$6GEE@813,%(&#$#$%$%$%$%$%&%&%&%&&%%&%&%&'&'& '&&''&''&'&''&') +(0:AGPMQSQ@+**)*)*)*+-=QSSN@0+,+,++, +,+,++,,8KSSTVVSSSSSD+     "3MSSRI.""#"#"#"#"#"#$##$=QSRSSNIQC:;6/*)(%$%$%%$$%$%&%&%&%%&%%&'&'&&'&'&'('''('('(''()-)089DDMSQRS K3*)*))*))*=OSSN;/+,+ ,++,++,+0BOSSVhVUSSSSSM9      %:OSSN6#"#"#"#"#$#)JSNKMI?:;3).)%$&%$%$%$$%$%&%&%&%&&%&'&'&''('('( '((*0.6+)*)*)*8MSSJ9.+,+,+,+,+,+6KSSUVhVTSSSSSA(      &@PSSQ<&"#"#"##"#"##"#"#"##"#6RSRSSOOKJC:=4.++%%'$%$%&%&%&%&%&%&%&'&'&'&'&'&''('('( '(*()35>>HONQSM1*)*)*))*)*)*)*4JSSRH8+,+,+0CRSSTVVSSSSSL5!  .BPSSQB)"#"#"#"#"##"#"#'FSSRSSOPNIBC;52,.%%&$$%$%%$%&%%&&%&%&%&'&&'&'&''&&'('''('(''('( ,*03;DDLRSRS B*)*)*)**)*)*/ESSRC3,+,+,+,++,,+,7KSSVtVUSSSSS@$ !0FRSSD,"#"#"#"#"#"#"#3NSS QOSKCG>80.-&&%$%$%&%&%&&%&&%%&%&'&'&'&''&'&''('((''('('( )((./5:BIJNSN5*)*)*)*)**)*,>QSSNB0,+,+,++,++,,+,+,1EQSSUVtVTSSSSSRL/!   $3GSSM."!"#"# "##"#"#"#"#(BRSS RPSKECB:05.&('%$%&%%&%&%&%&'& '&&''&&'&''&''(''(''('('( *)*16:>GNRPSRF.)*)*)*))*)*+6MSSN8+,+,+,+,;NSSTVVTSSSSS@% !2KRSSJ/"!"#"#"#"#"#"#4LSSS QRSMJCD<340)%)%&%&%%&%&%&&%%&'&'&'&'&'&'('('('((''('( +,,2>BGJPSRSO<)*)**))*)*)*)*)*)*/FSSQG0+,+,+,+,+,,+,+1HRSSTVVUSSSSSG3 "6KSSJ1!""!"#""#"#" #"#"#'CRSSS QSRNJJD<;33,%*%&%&%&%&%&%&%&%%&'&&'&'&'&''&&'&''('('(''('(''('(,35:@GNLRSI1)*)*)*)**)*+;QSSR@/+,+,+,+/?OSSUV[VTSSSSSPB& #3ISSK3$""!"!" #""#"#"#""#"2OSSRSOINF=;73(*(&%%&%&%%&%&%%&'&'&'&'&'&''(''('('('('('(('(* ).79AEKRORSQ@+)*)*)**)*)*)*)*3ISSI9+,+ ,++,,++,++,,6MSSTV[VTSSSSSK/! "6GQSSH4%"!!"!"#"#"#"#")DSSRSSPLLJA8:5++*&&%&&%&%&%%&%&'&''&&'&'&'&'&&''(''('('('(('('('('()()( )().-4GPMQSE/)*)*)*)*)4MSS M:-,++,++,+,+,+,SSR PQIDC>702+&*'&'&'&&'&''&''('('(('()( )(())(()()()()(),*.4:5*)*))*)*)1GSS L;,,++,++,+,+,8KSSUVYVTSSSSS P@(#+=IQSRQ?/$!"!"!"!"!"!"#"$4MSS QSPHJB?;35+'((&'&''&'&&'('('('(('()()()()*)*)*)*)*)*+9OSSQC0+,+,+0IRSSTVYVSSSSSN8 '3CPSOJ8&#!"!"!"!")HSS PSOJLGA994,*')&'&'&'&'&'('('('('('('()()(()(()()(()(()*))**)*)*)*)*-BSSK6+,++,+,+,++-BPSSVVUSSSSSI, !,;MRSJ?0"!"!"!""!"!"!"!"#?SS RSQMJLB8<40++*&'&'&'&'&'('('('('(('('()()()()(()*)*)*2KSSR<-+,+,+,+,8PSSUVjVTSSSSS>*!/>OSROD4( !"!"!"! "!!"!"!"!!"!"!"%6PSSNJND=;82+.*&'(''&'&'&&'('('('()( )(()()()()()*)*)*)*)*;OSSE1+,+,+,+,+7LSSTVjVTSSSSSM:%1@KSNH6*# ! !"!"!"!!"!"#.ISS MNKFD9;4+.+'&('&'('('('(('()()()())()()*)*)*),CQSSM6+,+,+,++,,+2GSSTVVUSSSSSI2!  !(4?ISRPD9*" ! ! !"!"!!"!"!""!"!"!"!(@RSSRSSMQLFBA;21.-''('('(''('(('('('('()()(()(()())()()()()*)*)*))1ISSO?,++,+,+.DRSSUVVUSSSSSQG+#'0>GSRLD6(&! ! ! !"!"!"!"!"&9OSSRSS POPIAE=22.,&(('('('('('('( )()())()()()()*)*)8LSSE/++,+,+,+,+,>QSSUV]VTSSSSSO>("%*8CPRRSQPH>0+ "! ! ! !"!"!"!"!""!""#1KSSSQKCC?8/4.'))''((''('('('()()()()()()()*+=PSSJ6++,+,+,++,+,+,+,:PSSTV]VSSSSSN:% "$0;GKNSPFC30""! ! ! ! ! !"!"!!""! "!"!!""!*FSSS PRQJIC@;350')*'('('('('()(()(()()()(()()()()*)*))-ASSP9,+,++,+,+,+6MSSVVUSSSSSI4"(2:@FNSPSORIE<5,&! ! ! ! ! !"!"!"!!"!"&DSSSPSRKJHA;831,)+'('('(''('()( )(()()(()(()0FSSP@.+,+,+3ISSUV{VTSSSSS RE3%#(+29?EFNONSSRSSRSSRSSQSRPSMMGB>51(' ! ! ! ! "!!"!""!"!""&>SSSRSSMHMC;:70++*''('()()())())(()*1JSS RF.,+,,+,,+,+,+0GSSTV{YVTSSSSSQD. !&,*05;:?ECFHGFICED>@<77/-%$  ! ! !"!"!%9OSSSNKKH?8:3+-+(')('('('()()(()()()(()()()()*3NSSF3,,+,+,+,++,/ERSSTVYVUSSSSSPD*  "$#&*((.'**&(&!& !    ! ! ! ! ! !"!"!"%4NSSSRSSNNJIA;<40,-(()('()()()())()()*))8RSSL6,+,++,++,+,+,+,+/?RSSUVVUSSSSSO=) ! !  ! ! ! ! ! !"!5MSSSRSSOONHAC;51..(()()()()()()()=RSSO7+,+,+,++,,+,>QSSUVtVTSSSSSN;'         ! ! !"!"!!.LSSS RSSPNRIBD=910.()()())()(()()*BQSSO>,+,+,+,+,+,,+,,+,=OSSTVtWVSSSSSK;&        ! ! ! ! ! ! !"!!1NSSS QOSKEBA:05/)()()()()()()()()-CQSSR?,+,,+,+,+,+,+9OSSVWVUSSSSSL=%        ! ! !! ! !! ! !0KSSS QRQMIBC;432,(,()()()/BRSSR@,,++,,++,++,,+,+,++,+,+6PSSUVVTSSSSSRN<        ! ! ! !! ! !"0HRSSSQRQNHIB;;34-)(()()()()()-BSSRA/+,+,+,+,+,8NSSTVnVTSSSSSP:)      ! ! ! ! !"2GSSS RQSNHMD3*()())()()()+GSSF.+,+,+,+,+7KSSTVnVSSSSSR:'         ! ! !! ! ! ! ! !%3HSSSRPA+()()().FSSD/+,+,+,+,+4LSSVVUSSSSSN>,       ! ! ! ! !%7ISSSR@)()()/BSSC0,,+,+,+,+4MSSUVVTSSSSS Q?/      ! ! !! !':KSSSR=)())()(()()()-BSSE2,++,+,+,,+,+6LSSTVpVTSSSSSOH2     ! ! ! !!*-"   ! ! ! &8JSSS@,()()()()();PSSR@/+,+,+,+,++8PSSTVxVTSSSSSOE4%      ! !,@LSSSB-()()())()());NSSQ?-+,,+,+,+,+,+;NSSTVxYVUSSSSSJ<*      $3HPSSSE.()()()()()4LSSP>+,+,++,+-RSSTVVTSSSSS MD3$    !->JSSSL4()() ())(())()@RSSJ0+,+,+,+,CRSSTV_VUSSSSSL>/       !'7JOSSSO3)()()()-,,+,+,++,+,+,+,,+3ISSUVVTSSSSSROH7+   $1@JSSSR=*()()(()(0FRSSO7+ ,++,++,++,+,+,+7ISSTVVTSSSSSRPH6,   &.=OPSSSR@,()(())(),?RSSJ2++,+,+,+,8LSSTVoVSSSSSRME6,"  '/AHSSSRE-('()()(()()()())9LSSB/+,+,+,-;PSSVoWVUSSSSSRLE6.%  "'4>OPSSSJ0()()()()((1FSSQ:.+,++,,+,->SSUVWVUSSSSSRLH=0'"-5FKSSSN5)()()(()(),ARSSL5,+,+,+,+/DSSUVVTSSSSSSOKF6,! )0?EOSSSQ=*( )(()(()())(()5MSSD/+,+,+,+,+,+2KSSTVVSSSSSS QON>4(#!  #'19FKSSS@-()(())()()((1DRSSQ;,++,+ ,+,+,++,++,,+,6PSSVbVUSSSSSS RSG=2,' &%28EIRQSSSRF0'(('()()()(-;QSSN1++,+,+,++,,+,+,=SSUVbVUSSSSSS LF@:1'##!%'.4>ELSRSSSRM3)()()()(1JSSRC+,+,+,+,+,+-ESSUVVTSSSSSSQOMG>71$ ! &*.6;DGQPSSSO<*()()()()(+>OSSP6,+,+,+,,+,+,+,1MSSTVVTSSSSSSOH(!1>>IIPRRSSSRC,()()()()((4ISSRE/,+,++,,++,,+,+8RSSTVVSSSSSSL%.HRSRSSSG2()(()()())((,=QSSM8+,+,+,+,+,+,+,@SSV_VUSSSSSSH+2ISSSN9('()())(0FSSRB/,+,+,+,+,+,+0ISSUV_VUSSSSSSG,/ISSSRA-()()(*;OSSN6,+,+,+,+,++,+,+6PSSUVVTSSSSSSI(-PSSSI2(''('()()((1CQSSA-+,+,+,+,+.?SSTVVTSSSSSSH%/QSSSO:)('('()(()()(()(7IRSSI2+,+, +,+,+,+,1HSSTVVUSSSSSSC"9QSSSRD/''()()(->NSSO:-+,+,+,+,+,9OSSUV`VUSSSSSSR?%8PSSSM2)(('()( )()()(()1BPSSC/+,+,+,+,+,+/CRSSUV`VTSSSSSSRC' 3PSSSP=,'('()()()((*3ISSI5+,+,+,+6LSSTVVTSSSSSSRE!4SSSRJ1()()()(+7NSSM:-+,+,+,+,+-@PSSTVVSSSSSS@=SSSM:)'(('()(())(*>OSSR?.+,+,+ ,++,++,,++3JSSVVUSSSSSS9ARSSSRF/(('('( )()(()())1@NSSD-+,+>PSSUVhVUSSSSSSQ7#@RSSSP8+'('()()()(*1BPSSE/+*+,+,+,+,+0ISSUVhWVTSSSSSSP< $=RSSSQD1('()(+4CSSG3*+,+,++,+,;QSSTVWVTSSSSSSR>!=SSSRN6*'()()()()*2GQSSJ4+*+,+,,++,+,+2FSSTVVTSSSSSS2!FSSSD2('('()(*4FQSSRI6++*+,+,+,+,++,:PSSTVVSSSSSSR/%HRSSSO<('('('()( )()()(()1DOSSPG6*+,+2HSSVvVUSSSSSSM2)DSSSRF/('()()*2BMRSSOD6*+,+,.>RSSUVv\VUSSSSSSM4(CSSS O?,'(('('('()()()(1=JSSMA2*+**+*+,++,+,+3LSSUV\VTSSSSSSP2%GSSSI4('('()()()(()(-6FOSSJ3*+*+*+,2ISSVVUSSSSSSI,/HSSSRI0'('('(('()())(()2?JRSSNG7.*+*+*+*+,++/ASSUVpVUSSSSSSL+*KSSSRB.(''('()())())()()-7BLSSRH=/,+*+*+*++*+-9NSSUVpZVTSSSSSSL&,NSSSM;,'('('('()( )(()(()*.7CMSSPI=5*+*+*+*+*+4JSSTVZVTSSSSSSK!1PSSSRI6)'('()()( )())(())*.6AKSQ FA2-**+**+*+*+*+*+0ESSTVVTSSSSSSA" 7OSSSRE4'('('('()( )(())()())()*+4=GRQRSRSJE:2+*+**+*+**+*+-AQSSTVVSSSSSS>% 7NSSSPB/)('('('()()()()(())*18AKKOSRSNLE?5/*+*+-;OSSVVUSSSSSSD$0QSSSN@-('(('()()()()()) *),18?BJOPPS RSRQOKIA=32*+*+*+*+*+*+*+*+,8MSSUVvVUSSSSSSE!4SSS M9+'(('('(('('()()())()-/26=BBGLKKPNNSNNOJKJEE>:53/*+*+**+*+*+**+*+**+,6LSSUVv^VTSSSSSS?;SSSRJ8+('('()()())()()()()*))-//2747;:8;576441,.*,*+*+*++*+*+*+5KSSTV^VTSSSSSSR9! >QSSSG8+'(('('() ()()(())(())()*))*)),*),*)+))*)*+*+*+*+*++*+*+*+2HSSTVVTSSSSSSP9!!;RSSSQG7''(('()()()()*)*)*)*+*+*+*+2HRSSTVVSSSSSSP= !:SSSQF7)''()()()())()()*))*)**)*)*))*+*+*+*+*+*+1DQSSVVUSSSSSS=?SSSQN5))('('()(()()())*)*)**)*)*+*+*+*+*+*+*0BQSSUVVUSSSSSS4!FSSSQK5-('('()()()()*) *)**))*)**))**)*)*+**+**+*+*+/ASSUVnVUSSSSSSQ.$IRSSSM8.''(''('( )(()(()(()(()*)*)*)*)*+*+*+*+**+*+/CRSSUVn[VTSSSSSSN5'ARSSSJ>/'('('()()()()()*) *)*)**))*)*)*+*+**+*++**+*+,2BSSTV[VTSSSSSSN5 $ASSSL>,'('()()(()()()()*)*)*)*)*)*+*+* +*++**+-3ERSSTVVSSSSSS/"HSSSMD1)('(''()()(()(()*))*)*)*)*)*+*+*+.8HRSSVVSSSSSSO) &LSSSPE0)''('('()()()()())()*)*)*)*)*+*+*+*/RSSSRMD:2,()()(()()())()())()*))*)*)*)*)*,.9ANOSSUVsVTSSSSSS9 !;QSSS RNF=6/))()(()()()()()*)*)*)**)**)*))**,+49ELSSTVs`VTSSSSSSR:! !7QSSSOIC:3,()()()())()()()*)*)*))*))*+27AIPRSSTV`WVTSSSSSSQ=8SSSQMJB:3,-)()()()()*/.:>GLRSSTVWVSSSSSSR<FIPQSSVVUSSSSSSO0#ESSSS%PSOGEC>775/.1,)/++-*)/*.0-244;9BBILMSQSSUVVUSSSSSSM5#?RSSSSQRRLJJFDDBAB?BBADFFLKORQSRSSUVVUSSSSSSP7 @SSSS RQSRQRQQSQRSQSSUVVUSSSSSSR+ !JSSSSSUVsVTSSSSSSN(%LSSSSSTVsbVTSSSSSSI)-HSSSSSTVbXVTSSSSSSJ-*GSSSSSTVXVSSSSSSM,%ISSSSSVVSSSSSS L$(QSSSSSVVSSSSSSF"0QSSSSSVVUSSSSSSC&2KSSSSSUVVUSSSSSSRD%-NSSSSSUVVUSSSSSSG!-RSSSSSUVVTSSSSSSF3SSSSSTV}VTSSSSSS<;RSSSSSTV}lVTSSSSSS9SSSSSVVSSSSSS1BSSSSSVVSSSSSSO/ "BSSSSSVVUSSSSSS M7#=SSSSSUVVUSSSSSSP5 BSSSSSUVVUSSSSSSQ-JSSSSSUVVUSSSSSSN($JRSSSSSUVVTSSSSSSI,'FRSSSSSTVVTSSSSSSI-'ESSSSSTVVTSSSSSSO(!JSSSSSTVqVTSSSSSSM"'PSSSSSTVqfVTSSSSSSF!1NSSSSSTVf]VTSSSSSSB'/ISSSSSTV]XVSSSSSSE%*LSSSSSVXVSSSSSSG +SSSSSVVSSSSSSC2SSSSSVVSSSSSSR=:QSSSSSVVSSSSSSR;9PSSSSSVVUSSSSSSRB 4QSSSSSUVVUSSSSSS@7SSSSSUVVUSSSSSS6ARSSSSSUVVUSSSSSSR1?RSSSSSUVVUSSSSSSO1!=SSSSSUVVUSSSSSSO7 =SSSSSUVVUSSSSSSQ6?SSSSSUVVTSSSSSSR(HSSSSSTVVTSSSSSS M( %GSSSSSTVVTSSSSSSI-&CSSSSSTVVTSSSSSSK."ESSSSSTVVTSSSSSSO(#LSSSSSTV~VTSSSSSSL 'PSSSSSTV~vVTSSSSSSC!0MSSSSSTVvqVTSSSSSSE%-HSSSSSTVqlVTSSSSSSI#'LSSSSSTVlfVTSSSSSSH,PSSSSSTVfcVSSSSSSC 2QSSSSSVc`VSSSSSS:6OSSSSSV`]VSSSSSS; 4QSSSSSV][VSSSSSSRA .SSSSSV[ZVSSSSSSR@ 7SSSSSVZYVSSSSSS6?SSSSSVYWVSSSSSSR3 ?QSSSSSVWWVSSRSSQSSNSOOSROSQPSSQSSSSS O6:RSSSSSVWWVSSRSSNSIKFDDB>B8;94693;68;;:A>@EJEMPMRSSSSP7=SSSSSVWVSS%RSOPNEI;<51.&'% $! )' +.67;EGHOSRSSSS3BSSSSSVVSSQSMKE>:-/!$&+-7@AFMSQRSSSS) GSSSSSVVSSQPMEB53%%#(*7>FHNSSSSN'$GSSSSSVVSS OPD?7/#!&+3;DONQSSSSJ1 %@SSSSSVVSS QSIC;.'".6AFMSSSSL.DSSSSSVVSSQSGB3. "(1HRPSSSSJ!'MSSSSSVVSS RND9+#(6?LNSSSSD",JSSSSSVVSSRSFB.'!-8DLRSSSSD'+ISSSSSVVSSMG7*&3?IQSSSSK"%MSSSSSVWVSSQN@3%".>GPSSSSH+QSSSSSVWWVSSKA. +4SSSSSV[]VSSOK4$ -BOSSSSR4?SSSSSV]`VSS J:' 4ERSSSSQ5:SSSSSV`cVSSPA/ '=ISSSSP87RSSSSSVcfVTSSI4% -AMRSSSSP9' !4HSSSSQ#LSSSSSTVVTSSRQ7 +DPSSSSJ 'KSSSSSTVVTSS QH1&BQSSSSC#*GSSSSSTVVTSSRB,   ;LSSSSG''ISSSSSTVVUSSR@$6HRSSSSL#$NSSSSSUVVUSS;!-ISSSSI(SSSSSUVVUSS RN8 )GRSSSS>3PSSSSSUVVUSSRL4#HRSSSSR?1KSSSSSUVVUSSH2'EPSSSSRB+PSSSSSUVVUSSI. &?OSSSSB0QSSSSSUVVUSS F,$9PSSSS>7RSSSSSUVVSSE) ":SSSS2PSSSSR91SSSSSVVSSL-"?OSSSSR8:SSSSSVXVSS N1'?SSSSP1BSSSSSVX]VTSSO2 (BRSSSSQ*CSSSSSTV]fVTSS2   (KSSSSK+ASSSSSTVfqVTSSP: 'MSSSSL1?SSSSSTVqVTSSQ= 3NRSSSSQ+GSSSSSTVVTSSRB"7KSSSSO# LSSSSSTVVTSSI%:OSSSSK"&JRSSSSSTVVUSSK,"$(&,,*3-110,0'%% $?SSSSF&'DSSSSSUVVUSSM2 ! ,.8;AFDKJIOLNSMMRJNMGDH?974)##&HSSSSG(%FSSSSSUVVUSSP; %%67EFJSNSRSSRSRSSNRNEB<5*.NSSSSM !MSSSSSUVVUSSB$(/;DKNSQSSOSMC<1) 9NSSSSE*QSSSSSUVVSSJ, !'5=LKSRSS LIC6+#=RSSSS >2NSSSSSVVSS N7&2AJNSSQPN@5&'ERSSSSR?"-LSSSSSVVSS=  -=GPRSSRSSG=0"-LSSSSRD'PSSSSSVWVSSL" #3>RPSSMA6% 9QSSSSB-SSSSSVW^VTSSL/&3GLSSQD6$ !ESSSS<7RSSSSSTV^lVTSSQ: 7DQSSD5&2JSSSSQ69PSSSSSTVl}VTSSF%#2EPSSD5$8QSSSSQ47PSSSSSTV}VTSSN2/ANSSC2!&GSSSSR=4RSSSSSTVVUSS>$RSSSS,DSSSSSUVVUSSQ4);PSSN@) ,FRSSSSP+=SSSSSUVVSSE"2FQSSG5!4OSSSSL-;SSSSSVVSSN.#9MSSO=)$DRSSSSL1>SSSSSVVSSR@'DNSSRPH3/LSSSSP-DSSSSSVXVTSSM)-JQSSRL5?RSSSSN"LSSSSSTVXbVTSSQ= 2PRSSM> ,JSSSSI$$HSSSSSTVbsVTSSJ'8NSS:!?QSSSSG)"DSSSSSTVsVUSR7 !;PSSP>*+GSSSSJ' GSSSSSUVVUSI""AOSS@- 9SSSSL#NSSSSSUVVUS6#CRSSPK)+JRSSSSG*OSSSSSUVVUSK"!CRSSD'7RSSSS=1KSSSSSUVVSR9"@QSSRJ& *NSSSSB )KSSSSSVVSH)@PSSQB(  ?QSSSSE%PSSSSSVWVTSR9 9SS="+LSSSSB.SSSSSTVW`VTSK*7SSL<?SSSS;5QSSSSSTV`sVTS?0QSSN=  -PSSSSR65OSSSSSTVsVUSP.,MSSRN1 EQSSSSQ91RSSSSSUVVUSF#FSSRM)    5NSSSSQ=2SSSSSUVVUSP7 ?RSSB$    $LSSSSR8)JSSRM6    ,MSSSSQ,=QSSSSSVVTSM/BSSG&        "CSSSSO08RSSSSSTV^VTSC$ 9RSSQA!       8RSSSSO.?SSSSSTV^sVTSR5'OSSQ0       *KSSSSQ*ESSSSSTVsVUSL+ASSRE(     DRSSSSO!GSSSSSUVVUSB 4PSS<        5PSSSSG!"ESSSSSUVVSR5!ISSL.         %KSSSSG, ASSSSSVVSN'8SS C             CRSSSSL% JSSSSSVVTSD )LSSO0       6PSSSSL!OSSSSSTV[VTS7 ?QSSA         (OSSSSE(KRSSSSSTV[nVUSP*+MSSO2        !ESSSS?(IPPSSSSSUVnVUSG#BRSS D        :SSSSR;'6==FMQNSSSSSUVVUS<(MSSN3      1KSSSSQRIK;8$ !'47?ENSPSSSSSUVVSR29RSSRB  !HSSSQSJG;3+! !"*9?JJQSSSSSVVTSM' &GSSM-       CRSSSRSFE5.! )-;AJSRSSSSSTVVTSD4PSS:      5RSSSQHB6#+8BOPRSSSSSTV^VTS9"ESSG(    /MSSS OSA8$  /9FLPSSSSSTV^vVUSP10PSS Q7   &GSSS QSE:+" &1?INSSSSSUVvVUSK,ARSSD     CSSS KD4$ !+7CLSSSSSUVVSG$#LSSO0     8SSSN>,!  &5>JSSSSSVVTSA4QSS7 .QSSSRLIRSSSSSTVVTSR;ASSRE$     )MSSSK=*!-?LQSSSSSTVZVTSQ3%JSSP+  %HSSSP<-#1BORSSSSSTVZpVUSO*2QSSR<  BSSSMC* $5GORSSSSSUVpVUSK#=SSD   9SSSD2 (7GSSSSSUVVSD JSSI*  /SSSRL8% *=MSSSSSVVTS;+QSS3   /PSSSOB(.CNSSSSSTVVTSR38QSS>   )JSSSH7$:IPSSSSSTV\VUSO0CRSSF KSSSO@) .CMQSSSSSUV\vVUSK-!HSSH* BSSSM6 $5EQSSSSSUVvVSI*)MSSO1  :SSSD,,>KSSSSSVVTSH&1OSSQ6   :SSSR;""6HQSSSSSTVVTSF9PSSQA  6DGQSQSSSRN6-FSSSSSTVWVTSA=RSSE   $/=CMLSSRSSSPH.$ANSSSSSTVWhVUS:!@SSG)    .,    *6?NIRSSQB(+LQSSSSSTV`VUSQ)8QSS8     ()9>ISNRSSPB# -DRSSSSSUV`VUSL*6RSS?   $/7DEMSSRB"  -DOSSSSSUVVTSJ,8SSE      "/7CSMQSSRC  +@SSSSSTVVTSL+>SSF    *0D@KSRRSS @     +EQSSSSSTVVUSM%BRSSC        *0RSSL      !)5FELSSJ%    4JSSSSSVVTSRI(?SS I    "/2BNPQSSM+     "=PSSSSSTVVTSM#BSSF!    .@?IRSS1      )@RSSSSSTVVUSL#ARSSJ! )+:GJMRSS8      ,HRSSSSSUVbVUSI(      $ $$"  2LSSSSSUVbVSL+9.'(":NSSSSSVVTSN%=SS>     "+25)(!@PSSSSSTVVUSK):PSS>     +9AFKSSRSSO6      .2BDSPSSRSQSSKF?9*,BSSSSSUVWVUSL01PSSQA     %)5?MLOSSQ?   -9CNSRSQLD7* .NSSSSSUVWoVSO32QSSR@       #-:=HSSRSSK'   #9APOS RSRN@5& 9NSSSSSVoVTSQ. 1MSS6        !*;HLMSSR6      .8MOSQE:*#BQSSSSSTVVTSO4'NSSQ.        )39BMRQSSRE         *BKSH<, +ISSSSSTVVUS:#JSSN(      #2?DJRSS L,       1@NSI>.9NSSSSSUV_VUS;CSSJ#       !,/>IRORSS:    (ELSSRSSJ     $9LSSRJ6,HSSSSSTVVTSRB9QSSR@         #$7BKNPSSP2    2DOSSQE,;RSSSSSTVVUSE.OSSR=      %25AHQSQSS?     ;OSSRK8$ $HRSSSSSUVYVUSH)&OSSR4          -:AJLSSP&      .DRSSMA-4LSSSSSUVYxVTSL+ $FSSQ&     )*SSSSSTVxVTSP.?RSSK      (6=FHQSRSSK!    !# -JRSSSSSTVVUSQ57MSS A     ##2=FSLSSQ5  %BSSPC";PSSSSSUVWVUSQ>(OSS5     .2@COSQSSG   +DSSRE**PSSSSSUVWpVTS>%ISSP'       +6?JHPSSSR4   /ISSE*;PSSSSSTVpVTSRE&;SSM                %(7;ISPRSG   2JSSQD3(GSSSSSTVVUSL%7MSS@                 !18LFNSO5   0OSSF2?OSSSSSSUVVSN0(FSS+                       "#28CQLQSF  .QSSQL0 +GSSSSSSVnVTSP9@SSN                      (/B>ISRSQ1   -NSSF+>RSSSSSTVnVTSR= 1PSS>                      */;MHOSH     'QSSRE'.KSSSSSTVVUSC!%HSSQ,                          !(98FS8   #GSSP>&?RSSSSUVWVSK) ?QSSI                                      %5IEMSN"  CSSO@2LSSSSVWtVTSP2 1LSS>                             "32@MMQSB :SSN8$CSSSSTVtVUSQ;"DRSSP)                                   -=FQPQSA  %MSSF&'HSSSSUVVSD%>PSSH                                    *6AEKSP4   ?SSN=;SSSSV]VTSK-+MSSR4                              $)4ANQOJ# -QSSRO/.OSSSSTV]VUSP7>RSSG                          #193  DSS> &DRSSSSUVVUSA (KSSP1       +                      7SSL49SSSSUVVTSI'=QSSC        :LKA43%                     KSSA"6OSSSSTVjVTSN4'GSSN,      KSRSSNGM>//"                   8RSSM4'ISSSSTVjVUSR@8MSS=      .RS RSSMEJ>0'           GSSRH CPSSSSUVVSJ&#@SSI(     ASRSSKCC;/"          6PSSM05QSSSSVYVTSQ6 +JRSS R3         "MSRSLE::-!              ISSQ@.OSSSSTVYVUSD7QSS E        5QSS QROKD99+           /QSS K+%DSSSSUVVUSH*$FQSSL%      CSSQ RJ?94(                 ESSR=CRSSSSUVVTSP;/GSSN4        +LSSRNRJ97*&          "PSSJ$8PSSSSTVhVTS@%7MSS >       ;RSSRIMF96&&             6SSO5,NSSSSTVhVUSL2 4&               ASS<8PSSSSUVVTSD(:MSSC        >SS PRQG>93"          !NSSRI# .NSSSSTVVTSQ7:MSSD      !NSS ORMD>33$       -SSL,+KSSSSTVtVUSD#";SSH"         9RSS NSLB;0-#           ;SSP9(FSSSSUVtVSO4 "CPSSI'     $HSSRSSMMOA5.&          FSS;GSSSSVVTSRF"$HRSSL)         ;QSS MHJ?30        MSSE%ARSSSSTVhVUSP2"AQSSRK+        "LSSRSSODM;0+"               +RSSL&8SSSSUVhVSA%'DNSSQJ*       6SSRQSMDG?+$            6RSSN29PSSSSVVTSM4';SSQE(      ISS RSSOB=>,        >RSSQ75MSSSSTV_VUSSE"$7MRSSQA$     7RSSRSPOC68*          ?SS;,NSSSSUV_VSSO64RRSSR=     &JSS RPNKB78*          BSSB'SSSSVVTSSRH"4HSSQ9       7/-          ISSE-LSSSSTV\VUSSQ5-DQSSRI2         %NSS LRF<3''            OSSG&'HSSSSUV\VSSG-'=KRSSPB(      @SS RSQILC<2%$          &RSSL*"KSSSSVVTSSR>2GSSK:       0QSS QSSIIC8,)      -QSSP%%KSSSSTV[VUSSK/)=SSB.     HSSRSSIBG5($             1OSSM('CSSSSUV[VSSD$ 3ERSSQR9       8SSR SG>E3'          1OSSO/BSSSSVVTSSQ6   )?LRSSOE+         $PSS RPSF;;4&        /QSSQ1HSSSSTVYVUSSI, 0ENRSS E9     ARSSPRH=21#         2RSSO, HSSSSUVYVTSSRB!  "4GPSSPQ8"        4RSSO JF=04          6QSSN/"CSSSSTVVTSSM7   %5NRSSF>'         "JSS RSSOPKG7/.      2OSSN2 DSSSSTVZVUSSRJ.   $5MRSSPL;'       ?SSSRSSOLJF3-!       )RSSO0JSSSSUVZVTSSR>      !2IORRSS F9)    8SSSRSSOEI=5/         -RSSP) ISSSSTVVUSSN3     .>LNQSSQN@7      $QSSSRQSNCI:1)        -OSSN%'HSSSSUV\VUSS J+   (4EGOSSPSC<'      GSSS PSNDD>0      %KSS J%(HSSSSUV\VTSSRB&     (8>HSSRSLE;,!      ;RSSS RSMD9;-        NSSG&%JSSSSTVVUSSQ=   %0>KNNSSPRFA6+        /OSSSP QC39*     $HSSF!'LSSSSUV^VSS M8      ,5;AMLNSSRSRSS LPBC6+$          %ISSSOKP@64*      @SS D+PSSSSV^VTSSR+    !+63>CGEKOKSPNSRMSNMPJJL@D94.!       BSSS MOI=6++   @SS=2OSSSSTVVUSSG(      $'-+/15/51-1*(,$         :SSSKOG;5#      6SS 35OSSSSUV׿eVTSS="                5SSS RSSD'       /QSSQ)5RSSSSTVeVUSSL:           -QSSSO7   *NSSJ$8SSSSUVVUSSK:           &KSSS6     !GSSB BSSSSUVpVTSSRO2          FSSS;     @SSR;JSSSSTVpVUSSRL*              CSSSE   6SSQ3%MSSSSUVWVTSSH)              BSSSK     *PSSL*-MSSSSTVWVTSS QB*           DSSSG&      !GSSC"4NSSSSTVVUSS RB'         8SSSO/   ;QSSR:9QSSSSUVż\VTSSOB!          :OSSS3   6PSSN0>SSSSTV\VUSSR@!            6OSSSB     %ISSF$ !DSSSSUVVSSP=!            4RSSSD       ?RSSR=%KSSSSVڻkVTSS=%           4SSSH&       5PSSO..QSSSSTVkVUSSP>*         7RSSSP,       !JSSG:SSSSUVWVTSSQC*        8RSSS8         PSSSC     +LSSO$!LSSSSUVVTSSK(          "CRSSSG#     BSS@-QSSSSTVǹ`VTSSJ/           #ISSSO/       -PSSO,9SSSSTV`VUSS J2              *LSSSR9    CRSSRBESSSSUVVTSSRK=#            0MRSSSG        1OSSM3%PSSSSTVvVUSSOB#         8QRSSSL&      CRSSA2SSSSUVvVTSSH-          CQSSSQ9   1NSSN+BSSSSTV\VUSSRI3          *GSSS>    ?QSSR>"LSSSSUV\VUSSM>'         3NSSSK%       )ISSJ(1QSSSSUVVTSSC/         $=QSSS3     9PSSP6ASSSSTV޶vVUSSQJ@#       /ESSSB       !BSSD#LSSSSUVvVTSSOC)          >LSSSJ'       .NSSL*2RSSSSTV]VUSSH6           ,GPSSSO;     ;OSSO:BSSSSUV]VTSSRA-             :SRSSSC   !BSSA (LSSSSTVVUSSQJ:%     2DSSSL/   )JSSM(9QSSSSUV|VSSOG3           &@MSSSR?     /OSSM1&FSSSSV|VTSSL@+        9NQSSSN&       9QSSQ93OSSSSTVƳdVUSSM9$        3DSSS<      =NSSQADSSSSSUVdVTSSJ5!        .INSSSE%         ?SSB-PSSSSSTVYVUSSQH5$        /@QRSSSP;    )CRSSE!@SSSSSSUVYVTSSOE7$         +DKSSSG        'HSSH!*OSSSSSSTVVUSSQRG9%      2?QRSSSO4     $FRSSD%=RSSSSSSUVڱvVTSSR L<(     $-FNSSSJ    $OPSSE%.LSSSSSTVvVUSSRM@.        #9HSSSQ4      )@RSSA&BRSSSSSUV°cVTSSROE3%      /@JSSSF'    &@NSSP>#.PSSSSSTVcVUSSRPJ;.          %8DSRSSSP5   !8RSSM8 ?SSSSSUVYVSSPC8+      #6@ROSSSJ$      3LSSJ10NSSSSSVYVTSSJA:-"      $4@JQSSS:      ,EPSSB*"ESSSSSTVVUSS OKI:0       .2EHSSSJ+     %>ORSSRQ;!8PSSSSSUVޮVTSSR SH?3/$     #23/   6PSSSSSTVܩVUSSSSS1   "%-357==;AC;D7:833-%#    +KSSSSSUVVTSSSSSSI-             'ISSSSSTVҨxVUSSSSSSD&             BSSSSSUVxVTSSSSSQ@          @RSSSSSTVʧqVUSSSSSR6          :PSSSSSUVqVTSSSSL0              5OSSSSTV¦kVUSSSSRG+       0PSSSSUVkVTSSSSRE)            /NSSSSTVfVUSSSSQD$           ,OSSSSUVfVVTSSSSRF!           .MSSSSTVVcVVUSSSSPB"          ,KSSSSUVVcVVTSSSSA$      .JSSSSTVVVbVVUSSSSQA,         1ISSSSUVVVbVVTSSSSE-          7KSSSSTVVbVVUSSSSRL1       $=LSSSSUVVbVVUSSSSRM2             ,DPSSSSUVVbVVTSSSS Q5          2IRSSSSTVVbVVUSSSS O;#           :LSSSSUVVbVVTSSSS OB.        $CQSSSSTVVbVVUSSSSI3           -ISSSSUVVfVVTSSSSP?&     7MSSSSTVVfVVUSSSSQG4          'ARSSSSUVVjVVTSSSS M?*        5FSSSSTVVjVVUSSSS J6#        )CMSSSSUVVpVVTSSSSPB1      6JQSSSSTVVpVVTSSSSRS?)      -ARRSSSSTVVƜxVVUSSSSQL7"            (HSSSSTUVV[VVUSSSSJ=/%     %4BNSSSSUVV[VVTSSSSMG:0  !.AHSSSSTVVbVVUSSSSPNG=+   &.ACSQSSSSUVVbVVTSSSSRG:.#    !(3=IPRSSSSTVVqVVUTSSSS PFA:-"   (-?AQMSSSSTUVVqVVUSSSSSPOO@76*"      $02ACNPSSSSUVVȕVVTSSSSS+NMMA:=2*$%    #+,3==IGOSQSSSSTVVVVUSSSSSPRRGJF@=@9161040*3.4 6;7CAFMISPSSRSSSSUVVڔVVTSSSSSRSSRSRNSPNSONSOOSOSSQSSSSTVV\VVUTSSSSSSSSTUVV\VVUSSSSSSSSUVViVVTSSSSSSSSTVViVVUSSSSSSSSUVV}VVTSSSSSSSSTVV}VVTSSSSSSSSTVVאVVUSSSSSSSSUVV\VVTSSSSSSSSTVV\VVUSSSSSSSSUVVoVVUSSSSSSSSUVVoVVTSSSSSSSSTVV̍VVUSSSSSSSSUVV[VVTSSSSSSSSTVV[VVTSSSSSSSSTVVnVVUSSSSSSSSUVVnVVTSSSSSSSSTVVʊVVTSSSSSSSSTVV\VVUSSSSSSSSUVV\VVTSSSSSSSSTVVsVVUTSSSSSSSSTUVVsVVUSSSSSSSSUVV҇VVTSSSSSSSSTVVbVVUTSSSSSSSSTUVVbVVUSSSSSSSSUVVVVVTSSSSSSSSTVVZVVTSSSSSSSSTVVZVVUSSSSSSSSUVVvVTSSSSSSSSTVvWVTSSSSSSSSTVWׂVUSSSSSSSSUVlVUSSSSSSSSUVlVTSSSSSSSSTVVUTSSSSSSSSTUVeVUSSSSSSSSUVeVTSSSSSSSSTVVUTSSSSSSSSTUVbVUSSSSSSSSUVbVUSSSSSSSSUVVTSSSSSSSSTVbVUTSSSSSSSSTUVbVUSSSSSSSSUVVTSSSSSSSSTVhVTSSSSSSSSTVhVUSSSSSSSSUVVUSSSSSSSSUVlVTSSSSSSSSTVlVTSSSSSSSSTVVUSSSSSSSSUVvVUSSSSSSSSUVvYVTSSSSSSSSTVYVTSSSSSSSSTVVUSSSSSSSSUV`VUSSSSSSSSUV`VTSSSSSSSSTVVTSSSSSSSSTVqVUTSSSSSSSSTUVqYVUSSSSSSSSUVYVUSSSSSSSSUVVTSSSSSSSSTVeVTSSSSSSSSTVeVUTSSSSSSSSTUVVUSSSSSSSSUV}VUSSSSSSSSUV}_VTSSSSSSSSTV_VTSSSSSSSSTVVUTSSSSSSSSTUVzVUSSSSSSSSUVz`VUSSSSSSSSUV`VTSSSSSSSSTVVTSSSSSSSSTVVTSSSSSSSSTVdVUTSSSSSSSSTUVdWVUSSSSSSSSUVWVUSSSSSSSSUVVTSSSSSSSSTVpVTSSSSSSSSTVp\VTSSSSSSSSTV\VUTSSSSSSSSTUVVUTSSSSSSSSTUVVUSSSSSSSSUVlVUSSSSSSSSUVl[VUSSSSSSSSUV[VTSSSSSSSSTVVTSSSSSSSSTVVTSSSSSSSSTVpVUTSSSSSSSSTUVp^VUTSSSSSSSSTUV^WVUTSSSSSSSSTUVWVUSSSSSSSSUVVUSSSSSSSSUVVUSSSSSSSSUVkVUSSSSSSSSUVk^VTSSSSSSSSTV^WVTSSSSSSSSTVWVTSSSSSSSSTVVTSSSSSSSSTVVTSSSSSSSSTVxVTSSSSSSSSTVxiVUTSSSSSSSSTUVi]VUTSSSSSSSSTUV]WVUTSSSSSSSSTUVWVUTSSSSSSSSTUVVUTSSSSSSSSTUVVUTSSSSSSSSTUVVUTSSSSSSSSTUVzVUTSSSSSSSSTUVznVUTSSSSSSSSTUVndVUTSSSSSSSSTUVd\VUTSSSSSSSSTUV\WVUTSSSSSSSSTUVWVUTSSSSSSSSTUVVUTSSSSSSSSTUV~VUTSSSSSSSSTUVqVUTSSSSSSSSTUVlVUTSSSSSSSSTUVhVUTSSSSSSSSTUVdVUTSSSSSSSSTUVbVUTSSSSSSSSTUVz_VUTSSSSSSSSTUVs\VTSSSSSSSSTVl[VTSSSSSSSSTVhZVTSSSSSSSSTVcܹYVTSSSSSSSSTV`׸YVTSSSSSSSSTV_շXVUSSSSSSSSUV]ҶXVUSSSSSSSSUV\ϵWVUSSSSSSSSUV[̴WVUTSSSSSSSSSTUVZʳWVUTSSSSSSSSTUVYDzWVUTSSSSSSTUVYűWVUTSSSSSSTUVYŰWVVTSSSSSSTVVYůWVVTSSSSSSTVVVYŮWVVUSSSSSSUVVZǭWVVUSSSSSSUVV[ʬXVVUTSSSSSSTUVV\̫XVVUTSSSSSSTUVV]ϪYVVUTSSSSSSTUVV_ҩYVVTSSSSSSTVV`ըZVVTSSSSSSTVVcק[VVUSSSSSSUVVhܦ\VVUTSSSSSSTUVVl_VVUTSSSSSSTUVVsbVVTSSSSSSTVVzdVVTSSSSSSTVVhVVUSSSSSSUVVlVVUTSSSSSSTUVVqVVUTSSSSSSTUVV~VVTSSSSSSTVVVVUSSSSSSUVVWVVUTSSSSSSTUVVW\VVUTSSSSSSTUVV\ȚdVVTSSSSSSTVVdՙnVVUSSSSSSUVVnߘzVVUTSSSSSSTUVVzVVUTSSSSSSTUVVVVTSSSSSSTVVVVUSSSSSSUVVWVVUTSSSSSSTUVVW]VVTSSSSSSTVV]ȑiVVUSSSSSSUVViڐxVVUTSSSSSSTUVVxVVTSSSSSSTVVVVUSSSSSSUVVWVVUTSSSSSSTUVVW^VVTSSSSSSTVV^ȊkVVUTSSSSSSTUVVkډVVUTSSSSSSTUVVVVUSSSSSSUVVWVVVUTSSSSSSTUVVW^VVUTSSSSSSTUVV^DŽpVUTSSSSSSTUVp݃VUTSSSSSSTUVVUSSSSSSUV[VUTSSSSSSTUV[lVTSSSSSSTVlVUTSSSSSSTUVVTSSSSSSTV\VUTSSSSSSTUV\pVUTSSSSSSTUVpVUTSSSSSSTUVWVUTSSSSSSTUVWdVUTSSSSSSTUVdVTSSSSSSTVVUTSSSSSSTUV`VTSSSSSSTV`zVUTSSSSSSTUVzVUSSSSSSUV_VUTSSSSSSTUV_}VUTSSSSSSTUV}VTSSSSSSTVeVUTSSSSSSTUVeVUTSSSSSSTUVYVUTSSSSSSTUVYqVUTSSSSSSTUVqVUTSSSSSSTUV`VUTSSSSSSTUV`VUTSSSSSSTUVYVUTSSSSSSTUVYvVUTSSSSSSTUVvVUTSSSSSSTUVlVUTSSSSSSTUVlVUTSSSSSSTUVhVTSSSSSSTVhVUTSSSSSSTUVbVUTSSSSSSTUVbVUTSSSSSSTUVbVUTSSSSSSTUVbVUSSSSSSUVeVUTSSSSSSTUVeVUTSSSSSSTUVlVUTSSSSSSTUVlWVUTSSSSSSTUVWvVUTSSSSSSTUVvZVUTSSSSSSTUVZVUTSSSSSSSTUVbVUTSSSSTUVbVUTSSSSTUVsVVUTSSSSTUVVVs\VVUTSSSSTUVV\VVUTSSSSTUVVnVVUTSSSSTUVVnʼ[VVUTSSSSTUVV[VVUTSSSSTUVVoVVUTSSSSTUVVo̷\VVUTSSSSTUVV\VVUTSSSSTUVV}VVUTSSSSTUVV}ײiVVUTSSSSTUVVi\VVUTSSSSTUVV\VVUTSSSSTUVVڀVVUTSSSSTUUVVګqVVUTSSSSTUVVqbVVUTTSSSSTUVVb[VVUTSSSSTUVV[WVVUTSSSSTUVVWߊVVUTSSSSTUVVߢրVVUTTSSSSTUVV֠xVVUTSSSSTUVVxpVVUTSSSSTUUVVpjVVUTSSSSTUVVjfVVUTSSSSTUVVfbVVUTSSSSTUUVVbbVVUTTSSSSTUVVbbVVUTSSSSTUVVbbVVUTSSSSTUVVbcVVUTSSSSTUVVcfVVUTSSSSTUVVfkVVUTSSSSTUVVkqVVUTTSSSSTUVVqxVVUTTSSSSTUVVx҂VVUTTSSSSTUVVWVUTSSSSTUUVW܂ZVUTTSSSSTUVZaVUTSSSSTUUVanVUTTSSSSTUVnVUTSSSSTUUVޔYVUTTSSSSTUVYcVUTTSSSSTUVcvVUTSSSSTUVvڐYVUTSSSSTUVYdVUTSSSSTUVd|VUTSSTUV|]VVUTSSTUVV]vVVUTSSTUVVvޙ\VVUTSSTUVV\vVVUTSSTUVVv`VVUTSSTUVV`ǂWVVUTSSTUVVWkVVUTSSTUVVkږ\VVUTSSTUVV\WVVUTSSTUVVWpVVUTSSTUVVpeVVUTSSTUVVeז^VVUTSSTUVV^ώ\VVUTSSTUVV\ʊZVVUTSSTUVVZLjYVVVVYȊ[VVVV[̎\VVVV\є_VVVV_؟hVVVVhtVVVVt[VVVV[՝hVVVVhYVVVVYԝjVVVVj]VVVV]{YVVVVY{ئtWVVVVWtҠnVVVVnРpWVVVVWpרxYVVVVYxආ_VVVV_ʚoWVVVVWobVVbլ_VV_Ԫ`VV`ڴhWVVWhÛv\VV\vڸpZVVZpڼv^VV^v̪n[VV[n̰s^VV^sũs`WVVW`s ҼsbXVV Xbs м}l^WVV W^l} qf]XVV X]fqƼ~vqlfc`][ZYWVVWYZ[]`cflqv~Ź|qg]SLE>950-*'&&$##""#$&&'*-059>ELS]gq| Ųr_L=0'"" '0=L_r Ŭw\E2&"" &2E\w ȫlO7'"" '7OlշpO5$""$5Op࿝tO2""2Ot࿖mG+""+Gmҫ~S1""1S~ѦwJ*""*Jw޵R."".Rѡm@$""$@mɖ`5""5`˘`4""4`j8""8j齁I&""""&I٤g4""""4gΒU)"""")UňJ$""""$JȈH#""""#HϐP%""""%PٝY'""""'Yl0""""0lɅB""""B_(""""(_˅@""""@g+""""+gޛP""""Pχ@""""@y4""""4yr/""""/rl+""""+li)"""")il*""#%&'()*+,-./01123345566789987654332110/.-,+*)('&%#""*lr."" $&')*,./12456899 865421/.,*)'&$"".r|1"" $&(*,.0245799 75420.,*(&$""1|ٌ<""$')+-0246996420-+)'$""<J""$'),/14699641/,)'$""J_$""%(+.03699630.+(%""$_|/""$'*-03699630-*'$""/|D""%(+.25899852.+(%""Db$""$'+.15899851.+'$""$bن5""%),04799740,)%""5S""&*.159951.*&""S׀/""&*.259952.*&""/R""%)-159951-)%""Rق0""#',04899840,'#""0Z"%)-269962-)%"Z:"&*/389999983/*&":t'"'+0489999840+'"'tR"&+04999940+&"R9"&*/48999984/*&"9y("$).38999983.)$"(y_"#(-26999962-(#"_G"&+05999950+&"G6"#(-28999982-(#"6ށ*"%*05999950*%"*p$"',27999972,'"$pӂb""#(.399993.(#""bU""$)/499994/)$""UL""$*05999950*$""LD""%*06999960*%""D>""%+06999960+%"">9""%*06999960*%""97""$*06999960*$""77""#)/599995/)#""77""(.499994.(""78""'-399993-'""8>""%+18999981+%"">C""#)/699996/)#""CJ""'-399993-'""JU""$+18999981+$""U_""(/599995/(""_̠m""%,299992,%""mע~%""(/599995/(""%~,""%+299992+%"",8""(.599995.(""8L""#*18999981*#""L`""&-499994-&""`ѫz#""(/699996/(""#z.""$+28999982+$"".A""&-499994-&""A\""'.599995.'""\βy"")07999970)""y/""$+299992+$""/I""%,399993,%""In""&-499994-&""n-""'.599995.'""-H""(/699996/(""Hp""(07999970(""p."")08999980)"".O"")18999981)"""O~"*199991*"~8"*199991*"8c"*199999991*"c*")19999991)"*R")19999991)"R$"(0899999980("$E"(0899999980("E|"'/79999997/'"|<"&.69999996.&"<t"%-59999995-%"t8"$,49999994,$"8r"#+39999993+#"r8")19999991)"8w"(0899999980("w@"&.69999996.&"@~"$,59999995,$"~E"*39999993*"E#"(19999991("#R"&.79999997.&"R)"$,59999995,$")e"*29999992*"e5"'/89999998/'"5|"$,59999995,$"|L"*29999992*"L'"'/89999998/'"'i"$,59999995,$"i<")29999992)"<#"&/79999997/&"#\"+49999994+"\4"(09999990("4"$-69999996-$"X")29999992)"X5"%.79999997.%"5"*39999993*"b"%/89999998/%"b:"*39999993*":%"&/89999998/&"%p"+49999994+"pJ"&/89999998/&"J."*49999994*"."%/89999998/%"e"*39999993*"eF"%.79999997.%"F,")29999992)","$-69999996-$"i"(19999991("iJ",59999995,"JՃ2""&09999990&""2$"""*39999993*""$~""$-79999997-$""~_""(19999991(""_D""+59999995+""D҉1""%/89999998/%""1&""(29999992(""&"",69999996,""m""&/999999/&""mU"")39999993)""UA"",69999996,""Aѐ0""%/999999/%""0&""(29999992(""&""+59999995+""~""$.89999998.$""~j""'19999991'""jX""*49999994*""XH""#-79999997-#""Hט:""%/999999/%"":˙/""(29999992(""/&""*49999994*""&""#-79999997-#""""%/999999/%""""'29999992'""w""*49999994*""wl"",69999996,""lb""$.999999.$""bX""&09999990&""XO""(29999992(""OF""*49999994*""F٥@"",69999996,""@Ӧ9""#.89999998.#""9Χ5""%/999999/%""5˨4""'19999991'""4ȩ0""(39999993(""0Ī.""*49999994*"".,"",69999996,"",*""-89999998-""*)""#.999999.#"")'"%09999990%"''"&19999991&"''"'29999992'"')")3999999993)")*"*59999999995*"*,"+6999999996+",.",7999999997,".ĵ0"-8999999998-"0ȶ4"#.99999999.#"4˷5"#.99999999.#"5θ9"$/99999999/$"9ӹ@"%0999999990%"@ٺF"&1999999991&"FO"&1999999991&"OX"'2999999992'"Xb"'3999999993'"bl"(3999999993("lw"(3999999993("w"(3999999993(""(4999999994("")4999999994)"")4999999994)"&")4999999994)"&/")5999999995)"/:")5999999995)":H")4999999994)"HX")4999999994)"Xj"(4999999994("j~"(4999999994("~"(3999999993(""(3999999993("&"'3999999993'"&0"'3999999993'"0A"&2999999992&"AU"&1999999991&"Um"%1999999991%"m"$0999999990$""#/99999999/#"&"#.99999999.#"&1".99999999."1D"-99999999-"D_",8999999998,"_~"+7999999997+"~"*6999999996*"$")5999999995)"$2"'3999999993'"2J"&2999999992&"Ji"%1999999991%"i"#0999999990#"".99999999.","-99999999-",F",8999999998,"Fe"*6999999996*"e"(4999999994(""'3999999993'"."%1999999991%".J"#/99999999/#"Jp".99999999."p",8999999998,"%"*6999999996*"%:"(4999999994(":b"&2999999992&"b"$0999999990$"".99999999."5",99999999,"5X"*6999999996*"X"'4999999994'""%2999999992%"4"#/99999999/#"4\"-99999999-"\"*7999999997*"#"(4999999994("#<"%2999999992%"<i"#/99999999/#"i"-99999999-"'"*7999999997*"'L"'4999999994'"L|"$1999999991$"|".99999999."5"+8999999998+"5e"(5999999995("e"%2999999992%")"/99999999/")R",99999999,"R")6999999996)"#"&3999999993&"#E"/99999999/"E~",99999999,"~"(6999999996("@"%2999999992%"@w"/99999999/"w"+8999999998+"8"(5999999995("8r"$1999999991$"r"-99999999-"8"*7999999997*"8t"&3999999993&"t"0999999990"<",99999999,"<|"(5999999995("|"$1999999991$"E"-99999999-"E")6999999996)"$"%2999999992%"$΂R".99999999."R""*7999999997*""*""%3999999993%""*لc"""/99999999/""c""*8999999998*""8""&4999999994&""8~""/99999999/""~""+8999999998+""ȇO""&4999999994&""O""/99999999/"".""*8999999998*"".p""%3999999993%""p""/99999;99<99;9;99:99:9999/""H""*899999:9=:;K@QWMh]bm]ij_ebWZ[NKO9;A99998*""H""%399999(>9JHTed~mmaEHF99:99993%""-"".99999.?9M\aԾ}{cNCE9999.""-n"")799999 :BJcj ſykWC9;99997)""n""$299999A>Zh Ǵx\GD=99992$""I""-99999 >;Zmɵ{eRC9999-""I""(699999>Voǰ}`L99996(""/""09999@=ez ҿpU=99990""/y""+9999;9SmǷZC9999+""y""&49999EMt©_B99994&""ΐ\""/9999:9Tu ɵcJ9999/""\"")79999?Nw ͹dL99997)""A""$29999Noɳ_E99992$""A"",9999 ;Bkåy^C9999,"".""'59999CWtL>:99995'"".z""/9999Lw Ӹd9999/""z#""*89999:9cЭvM99998*""#є`""$299999999/""8""*89999[̴{E;99998*""8""$29999;dϾ|N:99992$"","",9999BlΒW9999,"",~""&59999 K{ ɏeA99995&""~%"".9999Oɤk9999.""%יm""(79999Q ΫkE99997(""m""19999 OϹcC:99991""̚_""*9999 :JsD9999*""_""$39999 G iE:99993$""›U"",9999>·ǭ´žЧsB9999,""U""&59999D!¾{jw]hcffk^qy{ ѫn@:99995&""J"".9999C-˱~j^SEJ9B99=99?99;9:E9CSTXs ͨe9999.""J""(69999B}ո\SB9?9:9:PY^  ͛W<99996(""C""09999:soOH9>9c}ȑP99990""C"")89999:Y͵jWB:9Qb|džP99998)"">""#19999YȰ~j:@9FOiԾK99991#"">""+9999QΤNE9?H]ձw;9999+""8""$39999FȶxZ:9"(89999jE99GxʖE:99998(">"09999G{A99s=99990"D")89999?o˃:99 ;GӟM99998)"D"19999V׃99Bu yB99991"L")99999?،@99:GsգY:999999)"L"199999 S՜F99KyA9999991"U"*999999 ~ҦW99;R̨X:99999*"U"1999999G׷[99[ |B999991"Ȩb"*99999;sz99=gΞR99999*"b"199999:L΋H99;rs?99991"өp"*99999sתV99JӛR9999*"p$"199999H p<99;Lָg<99991"$ު")99999jыD99jɍH9999)"*"199999? ײQ99GҺ[:99991"*")899999Rz99:R y@99998)"6"099999:gӦI99BtO99990"6"(899999:Ap99:M f:99998("G"099999;QH99eɈ?99990"G"(799999sd=99IԨJ:99997("_"/99999:BG99:\ָi;9999/"_"'699999Wm:99HɆ=99996'"׮y".99999;r֬K99;cҘP9999."y("&599999A̅<99Jӹ^;99995&"("-99999:Jض`99?lvG9999-"9"%499999:\ӖG99K̞?99994%"9",99999y r<99CӟM9999,"R"$399999<V99;[պi99993$"R"+99999F׌F99Oo@9999+"ѱt"299999X q<99?~ҏH99992"t'")99999qڵ^99c P9999)"'"099999םL99Qկ_99990":"'799999BшA99 =j:99997'":".99999Tu;99lw?9999."Z"&599999de99\щ@99995&"Z"-99999;l׬U99KH9999-"ٴ"$499999?qӤD99BT99994$"0"+99999A}ԕ:99=pӮ_9999+"0"299999 @{99nԿY:99992"R"(899999Bc99]j:99998("R"/99999 JY99Gx:9999/"׶"&699999VZ:99Lz@999 ;99:99;99:996&"/"-99999:[ۭY:99B̀E999;9:=:GDCSGTZOa[G[NMMG9ALKebq~|tsaQQF99;994#"S"*99999:Y H99И99,9>>W_nʸ¶zbUMC99:99*"S"199999gڡB99;tԔG99>9RXu ƢnRC9=991"ٸ"(899999uٖK99;lӝK99<=U` оkYFB998("5".99999;p١O99;sҥG99=GdƨoZH99."5"%599999pͷxY]?99:99D[ ϻpR=995%"ѻ|",99999pq:99=u~YHK?99S}ϴ_=99,"|/"299999IeH99("_"/99999_Ќ?99Jΰ{aMDD99FaèvP>99/"_$"$599999 Z֙G99V {gS99>99Nv\995$"$"+99999:L ۦS99:\  w_TP99:99T ĞdA99+"J"199999E۷_99;cҷzmL;E99>^ʲl>:991"J"'899999Hk:99=o Фz\[B9?99?lͫtA998'"پ"-99999<χ=99A é|eNR;99FruM99-"<"#399999zؠG99E ӷxpO:E;99E{V993#"<")99999:eܵ`:99NϽɨ|baJ9<:99GzN99)"ο|"/99999;Xp=99:9dƱi@Q@99:99 <|ęX=99/"|1"%699999QэD99: tmU>@>99v ȘU996%"1"+99999HձP:99E Խ{c^M99:99nϸɱɝX:99+"r"199999q>99[ ϳlDMG99k(âqgj`\eN]YWjth̓U=991"r."'899999:sДE99;v  ɥp_?9?99f&ÞooTHJ9@99>99:99;99?9@RMar\998'"."-99999:VܯO:99B ù|eRR99;99:ZiX@A9 =9@UbzďQ:99-"l"399999TvB99 :V չoUHJ99;M lHF9EI_wG993"l*"(99999CM99;~ ŭidG9A:99Jǟ~XL9:9>=PmϼpB:99("*".99999 o99LɳoPVC9:99C нtY9<9;Geͫe?99."i"#499999aҜA99=s  վs^9K<99>~ ʤ{O@99:;@bϟa=994#"i)")99999Qd>99M ̵beN9?<99?jɵ~]99 :;DjÒR99)")"/99999 D} ֏J99nѲqTXF99:WѾeB99@Nz@99/"l"$599999xۻ\::99A ©z_9F?99I дM;99GeͲd<995$"l+"*99999WN:99_  ʹeeO99<99=qƤo@99T| ϗR:99*"+"099999?ܻu99EշnVOH99SĔ^99Ceν|A990"r"%699999CuӞM:99Tb<996%"r/"*99999:W |D99N ǾpaW>9;9 yS9@99SS[r ˦xfCP>9AƊA99;L˝W;990""%699999gԟJ99;9WH:99:MϾzH996%"@"*99999 ṀG99J X9IRL\~Ƿ  θwQ\F99:9:ϟN:99]ΦU99*"@"099999 qvD:99?ؘ<9;99HEVYo ϬbGKA9PϮ[99=cw<990""$699999 PܰpC99@oe99<99GBI\ro ˷noR;:>9;yn99C9Tgos ˶cI=C9 9:\ΒB99:<ƒG99)"g+"/99999BnўY99TF99:99<=9G\Jg ѾylU=G<9@а]99_˧N99/"+"#499999R֖^>99 [i99;:9BRRWv μccC99:9N ~<99Coпm>994#""(99999=qӣi99:bԚF99;99CLRZmúȲbFP@99:9:lQ:99OΑK99("@".99999BֵtC999>mٽb:99:99AHHWmp ҿttW=D=9B}:9999:99=L:Vjm{Ҽ~[dI99;9T ҰS99Gw993""'99999I|P:9N رQ9999("l"-99999>^ Ũ{^9=QhΏF99;99DEB^xkR99 ;n͉A99-"l0"299999F| ˻lD==9 :9?B]}צS999@?Wpr~̉D99Z̙E992"0"&899999:IΨ_QI9Cbl۽c999B;AW\q{z;99EϥQ998&""+99999 W ݿucJ:C9E99<99<99?9;B9NN^o}|999 >99O_NrZ99=jg:990"Y'"#599999>h"Ƶygnb\_aXlgiztЌE999:9KUUaǾ ѬK99jn=995#"'"(99999AiƻƼǿϝK999<99KL[^xľџ=99R>99(""-99999F| ۛL999=99HHK`yr;99ḦA99-"P"299999IR999;99BL=\sn v@99H͏G992"P%"$699999PK999AG9Wjwxr@99>ΜG996$"%")99999P|T999A>?O\wsx<99=E99)"".99999U۱qD999A~y@99:oΩS998&"$"+99999Eםh<999=xЋ@99:~E99+""099999:HzɏU999~ґC99>ϠD990"U"499999Dd ٸvN999xАM99BM994"U)"'99999UΡ]B999lϪT99C͑L99'")"+99999;EZֻO=999dS;99DɑB99+""09999999]w;994"g4"&899999PzŒWF999FӋL99 xe=998&"4"*99999\¡lC<999I ҮU:99=^:99*""/99999 =EZϦuV9:999=Ӹh=99HϤ]99/""399999=C[ɬGC999;{ȁ>99Z͞T993"I"%899999=Jeƪr]9:999GIyæcQ999~o;99AϨE996#"j8"'999999 ;:`| ǡdY;>999 =iÑ?99NΎ;99'"8",999999 M`u ìzcP:<9:999;OѲY:99=wo99,""0999999@FM`z ȸf^>D999 H̄H99:FлQ990""4999999:99D[ ԣ||YZC>;9:999994"`"%8999999OެZ<9<999dĉ@:99O:998%"`4")999999[X999 :JҸh99=x_99)"4"-999999]۪W999;{ΐI99NϧF99-""1999999VٱA999] ӷtB99}DŽ:991""5999999Zۦ>999Iӡ\;99]a995"`"&999999:jی>999=ońL99J˛G99&"`5"*999999;v؎A999 OҶyC:99;u t;99*"5".999999h|K99sЈB99&"m@"*999999? t<999BгtD99k^99*"@$".999999B}<999?oͩu99e̓A99."$"1999999=y~:999;KͲf>:99:]h991""5999999a:999nάf@99>`˙F995""%999999<\<999HӵoI99Dg϶b99%"R")999999 Lh999 99)"R.",999999Mk999F [99N}ϰV99,"."0999999 D]999^šhH99\w;990""4999999CG999@|̲}P=99:?i̚F994""$7999999XG:999OѽQF=99:Vϵ`997$"w"'999999:Yߧ[999>]ϱX<:99Mg;99'"wJ"+999999OQ999=s wR99:>bʛM99+"J*".999999 M߲G999NqM99D]ί[99."*"1999999SB999;\{U9Ai~o991""5999999n E999 A<9=9[n}@995""%8999999x؏I999Ev{WUF9 =9JSmȒG998%"~"(999999g֦?999K~ȳw[HDD99;9;99;9>?GX]{̟P99("~S"+999999cޙ999O#ýywgRWVEJK9KMIYXYll̫T99+"S1".999999:v݃:999;Z$üX99."1"2999999;z>999eb992""5999999Bҁ=999Abдa>995""$8999999Cz ҄:999 >h p?998$""'999999|w999:BKzA99'"m"*999999a999@Wо};99*"mG"-999999>X=999M˾x=99-"G+"0999999Hq<999:Z ̲x990"+"3999999J p999SȰm=993""6999999:\999:Nn  Ɵb=996""%999999EO999DkU99%""(999999YO999bϳG99("t"+999999]ߪW999W ȡmB99+"tO".999999J߿R999=St п_99."O2"0999999N@999@cϦpN990"2"3999999[ A999KlʹWC993""6999999:fߓI999:9Xm9=996""$999999:qۗK999 =FfĥoS99$""'999999YޢB999 >Ppæ~PB99'"")999999^<999991"5$"4999999@y֋:999APZw ҿ–eR;:994"$"6999999=~~9999A99;99+"l"-999999<U:99999-"lO"0999999FN:999990"O7"2999999XY999992"7'"4999999T^999994"'"6999999JV999996""$999999M@99999$""&999999a?99999&""(999999jߜQ99999(""*999999;eܩH99999*"",999999:]ݪ=99999,"w".999999_ 99999."w\"0999999}<999990"\E"2999999B999992"E2"4999999wؕA999994"2&"5999999:|<999995"&"7999999;w999997""$999999k99999$""&999999Fl:99999&""'999999L|:99999'"")999999@j99999)""*999999?T99999*"",999999H T<99999,"".999999 Ua<99999."r"/999999 :W b99999/"r_"1999999:FR999991"_L"2999999KC999992"L="4999999_I999994"=0"5999999kV999995"0'"6999999a߱L999996"'"8999999:]ᱳ999998""#999999:h99999#""%999999;y߃>99999%""&999999<~ׇ@99999&""'99999999999'""(999999:r99999("")999999m<99999)""*999999<s=99999*""+999999Dz:99999+"",999999Fz99999,""-999999 >r99999-"".999999=Z99999.""/999999J]99999/"|"0999999Vg999990"|q"1999999Pa999991"qg"1999999FN999991"g]"2999999LB999992"]S"3999999gJ:999993"SL"3999999aY999993"LE"4999999UN999994"E>"5999999ZA999995">9"5999999g?999995"95"6999999D999996"50"6999999:}ڕ?999996"0-"7999999 ;mݤ:999997"-*"7999999 ;q 挲999997"*'"7999999:r:999997"'&"8999999<r>999998"&&"899:9;:9>99F9DE999:99999Cׁ<999998"&$"899;9:G9TO]cehuk{}~|mtn`R_IBJ=99:9999A x:999998"$#"99%<9ECF`U}{̽ʱ }`\XD9=:9999j:99999"##"99@9KPavƿ ˷pj]K9><9999:]99999"#"99:9>AKait\YH99:9999H[:99999""99CAcq ޷|dCG?9999Rp:99999""99>9Te áj^J9999Me99999""99 >9Zi °x^>9<9999DP99999""99 >Pg–tV;A9999R K:99999""99;Fd ߱oLG9999:dS:99999"#"99 =9_j ţaM<9999:dU99999"##"99KZҵqT?9999:NK99999"#$"899 >GoŸtYB9999Y >999998"$&"899:Om ɨyZF9999lG999998"&&"899MtЬ{]H9999xN999998"&'"799Kwв\G:9999{ݛG999997"'*"799IiЮX=:9999 :gߢ:999997"*-"799@n֨tC9:9999u:999997"-0"699DQޢgC9999;q999996"05"699Rȍ`<9999@Ղ:999996"59"599AkֲwT:9999Cފ<999995"9>"599W  ȤjH:9999A|999995">E"499Ej ܷI9999:f999994"EL"399;Uأm:9999?^:999993"LS"399Cq {T9999K e;999993"S]"299P ˘eD:9999Ln:999992"]g"199:9h߯xA9999?g999991"gq"199;v ĎV9999@M999991"q|"099<>ܦc@9999SQ:999990"|"/99>X߲g>9999fZ99999/"".99;kyM9999 [V99999.""-9999999%""#99 Xt@9999;ښ:99999#""899LnE9999 <~999998"'"699:Go9999Ai999996"'0"599Cf=9999@f:999995"0="499ݮN9999 Pm999994"=L"299B ׯI:9999:Nq999992"L_"199@yG;9999:>\999991"_r"/99;k ӄO9999CL99999/"r".99U~E9999 PR;99999."",99Oѻp9999]d:99999,""*99J!ǥ}k]cPQUDKH9KH;QHKYcXq W:9999:Z ]99999*"")99B~ ๺`\Q9H9:99:9:99G=H^ixܝG9999:HI99999)""'99k ˰|aPF9>99C9IdyG:9999_>99999'""&99T ówLP9:99LVes;9999tG99999&""$99GԷkQF9:99 ?AFn _:999999a Q9999>B999992"E\"099``A99 aҀ=9999?؈A999990"\w".99G ؝kG99fX9999:u<99999."w",99:uٻwM99:Fk؜I9999:99999,""*99Tɖ[;99:=Jyp=9999 d:99999*""(99>|B99Fl[;9999@w99999(""&99aҕ]@99Y֌D9999M|99999&""$99H꿂J99Dtb;9999 Lt99999$""699;pcF99:AVܙL9999A c999996"'"499JR=99 :Ko=9999FM999994"'7"299@xԕA;99HqQ9999VY999992"7O"099S˃F:99:9|n>9999[d999990"Ol"-9<|B99Bp Y9999:QZ99999-"l"+9V kC99k 9999LG:99999+"")9 e<99BOP:9999[E:99999)""'9R e=99bЄ<9999tO99999'""$9<n?99;QE:9999hQ99999$""69Wn@99=g m?9999_B999996"$"49=ԁ99:tL9999h999994"$5"19P臸99Lwm:9999:z?999991"5O"/9r?99EuB9999< E99999/"Op",9CJ:99:E_=9999 ?ޗ<99999,"p")9:^\99;H߉F9999=u䓮99999)""'9Bq<99gL9999 :z99999'""$9:Rݐ<:99G{x=9999:j:99999$""69>vS99:IH9999=u=999996""39Ig99Yd9999Dօ<999993"2"09g:99?j݂=9999Cp:999990"2O".9=E99?N9999> `99999."Ot"+9Nj99:]`;9999DY99999+"t"(9jA99wڇB9999Z^99999(""%9;S99LN9999Zj99999%""69GⅯ99cb;9999KQ999996""39cM99C B9999MD999993"+"09o?99hD9999_N:999990"+G"-9CJ99D]9999oV@B99999-"Gm"*9[i;99:` {9999;z Բvw^I?H99999*"m"'9zJ99EN9999 >;UO{ Ųr_G9A99999'""$89<ׂ;99 ;fV999=9PZ{rSS?999998$""59KY99Id:999:9[^֭~jQ9<:999995""29dېA99z݇;999?Vg  ͨjCB<999992"1".9:a:99WH:999 D:i Ν\LA99999."1S"+9BB99?Y999 =9_~嶗qUH99999+"S~"(9 Ol;99_c999 NbŧdL99999("~"%89\K99C 999 FrҹsQ999998%""59:j=:99>999999991"*".9 @Q99 :AU999:@v⿘gE=99999."*J"+9D?:99:ve999Ic缎ZE=99999+"Jw"'9N v99 a}999b[99999'"w"$79bS99 R99999qP999W ݿUA999990".",9Ef:99[M999Bl ˡdI?99999,".R")9PX99Ue999H弌`>:99999)"R"%9 T J99Dy999b שuO99999%""59WC99>{99:999:=y ŠY?999995""19] A99>i`W=9=999=FϤ^::999991"$".9mv;99_ 侴ϖqcIK99:999BVھkG99999."$@"*9:m99WvdJ@C999Dm{N:99999*"@m"&9>\99L Ϫ{^U99<99NzŌV99999&"m"59DH99B ԶqW:I99:X ЛL999995""29C=99@ j`H9?99<` ح\:999992"".9==9999999."5"*9>?99  Ԩ{pT9E<99@g d<99999*"5`"&9Lڊ<99n ڲ^]H99;e cC99999&"`"59R܃99\ ݾb9I>99:co999995""19Ls99 [ ϡaiN9;;99jߪa>999991""-9Jg:99a ģtOVC99_֣[99999-"4")9Yg;99:S پ}[9><99 ^ӓT=99999)"4`"%89_r:99K ۻ[]K99RώR999998%"`"49;U p:99R ʷdF@=99 HwC999994""09:Ji99\ jmT:99m<999990"",9Ml:99Qǥ{YQH;99:  ݨY;99999,"8"'9Vy:99P  ϩhI99:99:pŷ÷̼ٕL99999'"8j"#69M z99`ɻjSPD99:99;a$uwnTiNYaSZh\i}tG999996#"j"29Gv99n涟t[=9>99:R +־njLO?9A9:99:99;99=99A;:PZaqnA999992""-9O~B99:o ̠{gYM99:99E ȝeb:B99:9 >99M\pg:99999-"&")9NA99 ?f̰mIKC99>mȟdG9<9?LaסG99999)"&I"%89 C?99;l ضyqV99:99 MҺjBC9:9;HnςF999998%"I"39@I99 ʹuVKH99:՝HD9:9>^|i>999993""/9 C H99= ˦}dH;=99:^eN9VwV:99999/""*9:R99Eŵl_P<99 LڔkG9UrփG99999*"4"&89{e99P  ໝoR999998&"4g"49:}q:99] ǝo\J99:99OL99;SW:999994"g"09:>99mwB99;OW;:99999+")"'9:YC99={gQL99Bכa:99HjN99999'")U"49:L^99? ǥtdA9B99sɉL99[ v999994"U"09Bp:99M 㧄sYT=9<99O u99IsݤQ<999990""+9@ޅJ99h  гp[9J99=g99:Af}B99999+"$"&89>sE99: hcC9?99Xߢ`99 <^C999998&"$J"49:sU99@ ȠmQU@999=ؘT99^}C999994"J"/9;a {99H  ϰvT9B:9XP99 :>a[99999/""*9:LI99l  ~L\G99:9 BE99^pC999999*"#"&89 H\99   ⷳb>J?9\>99>MZ9999998&"#H"39Cl99:G  ɨdpR9;:9?E99:\t=999993"H".9=uݕ@99oˡwHUC9U>:99;^P99999."")9:fV99= ػ|~Z9W:99Asq<9999)"%"$69:Op?99R ֽS\H9Ed99 DnL99996$"%P"29 AK99o ҶiHI?9d|99Hd:99992"P"-9=|a<99B  ľqtU=9? @99RׄE9999-""(9;nۆ=99;b ʨzTIE=9V R:99<_O:9999("'"#59 :US99@ ҩdO99<9=|l99?i<99995#"'Y"09;Ԁ>99[ҾmYHD99:9O=99ID99990"Y"+9N:99:  켔o[=@?9 :hJ99\Y9999+""&89crB99T  ġg\N99:99Bm99Fv|99998&"0"29NJ99: ʳiG>CQ?99:DE:99992"0l"-9At:99Y  ൒|a99:rc;9999-"l"(9:k P99@￟ :99Kҁ9999(""#59Ut>99c xJMf N99jE99995#"B"09FZ:99EN9:99FXIo=99KW99990"B"*999997%"("29>P:99< H9=;9L^yx¸  T99=nC99992"(_",9a΄?99[>99>;DN`|{?99Ob9999,"_"'9:X\=99Kb:99=>=Qjz_99Xm{G99;TG99995$""09:={J99` F99C;G^m:99LN99990"P"*9ay99V {;99 :99F:Ldvx:99A^9999*"P"$69Cd@99TU99 :99GICe [99zZ:99996$""09<]U=99Ju=99:99GUPlJ99`j<99990"@"*9Ai?99;LL99;99D`Iv;99Mۅ:9999*"@"%69k`F99=P:99:=9H^Wk<99FA99996%""09Iy99>\R99;99DdpmĻ  p<99=I99990"4"+9:9_H:99=gހ:99;:ADb| l99:{F9999+"4y"%69 9D ӎ;;99 ;r O99:AELc}f99g洈99996%"y"099:X׌V99?{r99BDImS99`L99990"/"*99=`?99=|{99;:9Vm[D99Ci99995$"l"/99= ڨnL=99C^ @99 =@9Zut?99?X9999/")")99Tƕ]F=99:9\|e:99A@;To;99CW9999)")i"#499=g 踊XB99@>:99DC OZq=99He99994#"i".99I޳G<99YpO99;99D@MX D99Hc9999."*"(99;R᷈J;9:99@Jx j999:99CLOY=99DS9999("*l"399;q彏SC=:99[{|999:99B]Rq»:99AT:99993"l"-99 F ƙpKG=99?Gk>999:=9EcSxC99FX:9999-"."'899R ά_XD99A9ct X999:A9F^^nN99RY:99998'".r"199`|T:99:]L9999+"1"%699:K你xhJLF99=99:9:9:99L@ed Q:999 CLBhi99:bB99996%"1|"/99:;ȻpcY\MCO9AG9=H9GHAPOKi`|d999 GDRrj99uC9999/"|")99Zд w999 :99NCWw99E9999)"ο<"#399:9u:999;99^=99?ٌ<99993#"<"-99K} >999CE:99Qփ:9999-""'899:N| N999W:99gh99998'"پJ"199;CX999v k99:yS99991"J"+99f^999YY:99cE9999/"_"(99=f~999Dv=99;}ڀ?9999("/"299DgyD999 B99Gs:99992"/|",99:kڂD999eR99]c:9999,"|"%599Auڇ;999^m;99;uP99995%"ѻD"/99t Ն999T@99E?9999/"D"(99Aq=999@P99Z:9999("$"299?c ~<:999:|s@99c99992"$b"+99?Kn@999cL99DM9999+"b"%599Nb;999 Xd99l?99995%"5".99 P Q:999DB99D灅9999."5"(899P K99999996&""/99cq=999:{@99Ak9999/"׶R"(899>QmԔ[999cd99:`M99998("R"299CcmL999OF:99K<99992"0"+99 V ӛW@999 BtwD99C~h9999+"0"$499;h w9<999cd99kL99994$""-99>R| nj^999KO:99H؁>9999-"ٴZ"&599EYhH999:lߕC99H]99995&"Z".99Kl ޻yF?999:F{?99?C9999.":"'799J~`9:999rsE99=ib:99997'":"099P̖RF999\m99eA:99990"'")99>Uɔi><999Avb=99^l999999)"'t"299C^ ŝ^M9:999WݪT99XE9999992"t"+99=Y~ʍl?=999C [;99bu:999999+"ѱR"$399=;Lu 篗YF999PC@99`K999993$"R",99;:Hj̰{T999 =k<99jg<99999,"9"%499:999y\@99:9g`99999."y"'699 CMTy Ɩ]T9:999:Q oD=99;?zA999996'"׮_"/99<;9Um tZH9=99999;99:9E::OBaipՉB999991"өb"*99999Ǻsswhbx_{O99999*"b"1999999RU999991"ȨU"*999999:9_ f99999*"U"199999?hm=999991"L")99999;}@99999)"L"19999L  ܊E99991"D")89999:XB99998)"D"09999;[F99990">"(89999>` D99998(">""09999:ZI:99990""9""(79999@dޡP:99997(""9""/9999 e ԜQ9999/"""7""'69999>f˔U99996'"""7"".9999] ćP9999.""7""&59999;LtL99995&""7""-9999 ;I aA9999-""7""%49999= דS<99994%""7"",9999Bv|K9999,""8""$39999Cce?99993$""8""+9999SՠT9999+"">""#19999@kÅI99991#"">"")89999?Wկj<:99998)""C""09999IlȈ[9:99990""C""(69999OީdH99996(""J"".9999@cćP>9999.""J""&59999:;9l ͠h;;99995&""U"",9999 =J vN9999,""U""$39999:EcݺLA99993$""›_""*9999 Ie弈]::9999*""_""19999Fh⾌ZI99991""̚m""(79999Lh ޷d9=99997(""m%"".9999Gc ܩOG9999.""%י~""&59999?YqW99995&""~,"",9999PqɴeG:9999,"",""$29999HYx׼iV99992$""8""*89999@FXsدjc9?99998*""8""/9999;WyrTA:9999/""L""'59999 @\hx ĩng?H99995'""L"",99999BCDjgdE@99:9999,""`""$299999+FHIgysٶrsSWB9=99992$""`#""*899999"@:""%+18999981+%"">8""'-399993-'""87""(.499994.(""77""#)/599995/)#""77""$*06999960*$""79""%*06999960*%""9>""%+06999960+%"">D""%*06999960*%""DL""$*05999950*$""LU""$)/499994/)$""Ub""#(.399993.(#""bp$"',27999972,'"$pӂށ*"%*05999950*%"*6"#(-28999982-(#"6G"&+05999950+&"G_"#(-26999962-(#"_y("$).38999983.)$"(y9"&*/48999984/*&"9R"&+04999940+&"Rt'"'+0489999840+'"'t:"&*/389999983/*&":Z"%)-269962-)%"Zق0""#',04899840,'#""0R""%)-159951-)%""R׀/""&*.259952.*&""/S""&*.159951.*&""Sن5""%),04799740,)%""5b$""$'+.15899851.+'$""$bD""%(+.25899852.+(%""D|/""$'*-03699630-*'$""/|_$""%(+.03699630.+(%""$_J""$'),/14699641/,)'$""Jٌ<""$')+-0246996420-+)'$""<|1"" $&(*,.0245799 75420.,*(&$""1|r."" $&')*,./12456899 865421/.,*)'&$"".rl*""#%&'()*+,-./01123345566789987654332110/.-,+*)('&%#""*li)"""")il+""""+lr/""""/ry4""""4yχ@""""@ޛP""""Pg+""""+g˅@""""@_(""""(_ɅB""""Bl0""""0lٝY'""""'YϐP%""""%PȈH#""""#HňJ$""""$JΒU)"""")U٤g4""""4g齁I&""""&Ij8""8j˘`4""4`ɖ`5""5`ѡm@$""$@m޵R."".RѦwJ*""*Jwҫ~S1""1S~࿖mG+""+Gm࿝tO2""2OtշpO5$""$5Op ȫlO7'"" '7Ol Ŭw\E2&"" &2E\w Ųr_L=0'"" '0=L_rŹ|qg]SLE>950-*'&&$##""#$&&'*-059>ELS]gq| ,8FUds¶sdUF8,  0F]v տv]F0 ,Fd ädF, &Ce ҰeC&3WҫW3&MwҧwM& &MگM& 7e͛e78kפk8 (ZΖZ( 8qq8AA?}}? 1mm1 PؗP.nn.<˃<F׏FCُC :І: .vv.__ AA #kk# ?? __(yy(:: EE  MM RRTT OO  HH <<..s׳sWW88yޫy TT ..aͣa11bΞb.. UřU 88 \Β\ 11MMgډg((55CCPP\\ ee nnttwwwwvvqq hh aaUUJJ>>00##jjRR88##]]<<!! ww MM&& zz OO&& ww CCbb.. zz <λ<KݸKWW\\ZZRRFݩF7Φ7tt%%]]<՟<vv!!MM  *Ø*ZZ  ,ǔ,UU##KKzz7׋7aa  :܆:bb3ׁ3TTvv!!77RRpp%%88RRmm  !!00??RRddvv  %%..55<<??CCHHMMOOTTWWWWWWWWTTOOMMHHCC??<<55..%%  vvddRR??00!ٽ!Ǽ  mmRR88%%ʵppRR77!ް!vvTT33׫bb::ܧ  aa77ףzzKK##UU,, ǜ ZZ** Ù MM!!vv<<Ք]]%%tt77ΏFFݍRRZZ\\WWKK݃<< ΁ zz..bbCC  ww&&OO  zz&&MM  ww!!<<]]##88RRjj##00>>JJUUaa  hhqqvvwwwwttnn  ee\\PPCC55((ggMM11  \\88  UUų..bbε11aaͷ..  TTyy88WWss׽..<<  HH  OOTTRR  MM  EE::((yyм__  ??##kk  AA__..vvƶ  ::еCCٴFF׳<<˲..nnPPذ  11mm??}}AA88qq  ((ZZΫ88kkת77eeͩ &&MMڨ&&MMwwҧ33WWҦ&&CCeeҥ,,FFddäݤ00FF]]vvգ ,,88FFUUddss¢͢բݢݢբ͢¢ssddUUFF88,, գvv]]FF00ݤäddFF,,ҥeeCC&&ҦWW33ҧwwMM&&ڨMM&& ͩee77תkk88ΫZZ((  qq88AA}}??mm11  ذPPnn..˲<<׳FFٴCCе::  ƶvv..__AA  kk##??  __мyy((::EE  MM  RRTTOO  HH  <<..׽ssWW88yyTT  ..ͷaa11εbb..ųUU  88\\  11MMgg((55CCPP\\ee  nnttwwwwvvqqhh  aaUUJJ>>00##jjRR88##]]<<!!ww  MM&&zz  OO&&ww  CCbb..zz ΁ <<݃KKWW\\ZZRRݍFFΏ77tt%%]]Ք<<vv!!MM Ù **ZZ ǜ ,,UU##KKzzף77aa  ܧ::bb׫33TTvv!ް!77RRppʵ%%88RRmm  Ǽ!ٽ!00??RRddv!7F Ubny%.5<?CHMOTWWWWTOMHC?<5.y%nbUF 7!vddRR??00!!  mmRR88%%ppRR77!!vvTT3ׁ3bb:܆:  aa7׋7zzKK##UU,ǔ,  ZZ*Ø*  MM!!vv<՟<]]%%tt7Φ7FݩFRRZZ\\WWKݸK<λ< zz ..bbCC ww &&OO zz &&MM ww !!<<]]##88RRjj##00>>JJUUaa hh qqvvwwwwttnn ee \\PPCC55((gډgMM11 \Β\ 88 UřU ..bΞb11aͣa.. TT yޫy88WWs׳s..<< HH  OO TTRR MM  EE ::(yy(__ ?? #kk# AA __.vv. :І: CُCF׏F<˃<.nn.PؗP 1mm1 ?}}?AA8qq8 (ZΖZ( 8kפk87e͛e7 &MگM& &MwҧwM&3WҫW3 &Ce ҰeC& ,Fd ädF, 0F]v տv]F0 ,8FUds¶sdUF8, freelan-2.0/defines.hpp.template000066400000000000000000000013401252300335000167160ustar00rootroot00000000000000// THIS FILE IS GENERATED. #pragma once #define STRINGIFY(x) #x #define TO_STRING(x) STRINGIFY(x) #define FREELAN_NAME "freelan" #define FREELAN_VERSION_MAJOR {defines.version.major} #define FREELAN_VERSION_MINOR {defines.version.minor} #define FREELAN_VERSION_PATCH {defines.version.patch} #define FREELAN_REPOSITORY_VERSION "{defines.repository_version}" #define FREELAN_DATE "{defines.date}" #define FREELAN_VERSION_STRING TO_STRING(FREELAN_VERSION_MAJOR) "." TO_STRING(FREELAN_VERSION_MINOR) "." TO_STRING(FREELAN_VERSION_PATCH) " (" FREELAN_REPOSITORY_VERSION ")" #define FREELAN_NAME_VERSION_MAJOR FREELAN_NAME TO_STRING(FREELAN_VERSION_MAJOR) #define FREELAN_USER_AGENT FREELAN_NAME_VERSION_MAJOR "/" FREELAN_VERSION_STRING freelan-2.0/defines.py000066400000000000000000000110571252300335000147530ustar00rootroot00000000000000""" Generate a defines file. """ import os import argparse import inspect import datetime from subprocess import check_output, CalledProcessError from distutils.version import StrictVersion from collections import namedtuple class Defines(object): """ Handles defines. """ def __init__(self): self._repository_root = None self._repository_version = None self._version = None self._date = None @property def no_git(self): return int(os.environ.get('FREELAN_NO_GIT', '0')) @property def local_path(self): return os.path.dirname(os.path.realpath(__file__)) @property def repository_root(self): if self._repository_root is None: try: if self.no_git: self._repository_root = self.local_path else: self._repository_root = os.path.abspath(check_output(['git', 'rev-parse', '--show-toplevel']).rstrip()) except (CalledProcessError, OSError): self._repository_root = os.path.abspath(os.path.dirname(inspect.getfile(inspect.currentframe()))) return self._repository_root @property def repository_version(self): if self._repository_version is None: try: if self.no_git: if 'FREELAN_NO_GIT_VERSION' not in os.environ: raise RuntimeError(errstr='You must specify FREELAN_NO_GIT_VERSION when FREELAN_NO_GIT is specified.') self._repository_version = os.environ['FREELAN_NO_GIT_VERSION'].rstrip() else: self._repository_version = check_output(['git', 'describe', '--dirty=-modified']).rstrip() except (CalledProcessError, OSError): self._repository_version = "" return self._repository_version @property def version_file_path(self): return os.path.join(self.repository_root, 'VERSION') @property def version(self): if self._version is None: self._version = namedtuple('Version', ['major', 'minor', 'patch'])(*StrictVersion(open(self.version_file_path).read()).version) return self._version @property def version_str(self): return '%s.%s' % (self.version.major, self.version.minor) @property def date(self): if self._date is None: self._date = datetime.date.today().strftime('%a %d %b %Y') return self._date @property def template_file_path(self): return os.path.join(self.repository_root, 'defines.hpp.template') @property def defines_file_name(self): return os.path.splitext(os.path.basename(self.template_file_path))[0] def replace_template_variables(self, content): """ Replace the template variables. Return the content. """ return content.format(defines=self) def emitter(self, target, source, env): """ Modifies the dependencies. """ env.Depends(target, env.Value(self.repository_version)) env.Depends(target, env.Value(self.version)) env.Depends(target, env.Value(self.date)) return target, source def action(self, target, source, env): """ Generate the defines file. """ output = self.replace_template_variables(source[0].get_contents()) with open(target[0].abspath, 'wb') as out: out.write(output) def register_into(self, env): """ Register into the specified environment. """ env.Append(BUILDERS={'GenerateDefines': env.Builder( action=self.action, emitter=self.emitter, )}) env.defines = self def generate_defines(self, target): """ Generate the defines.hpp file. """ with open(self.template_file_path, 'rb') as source_file: output = self.replace_template_variables(source_file.read()) try: with open(target, 'rb') as target_file: current_content = target_file.read() except IOError: current_content = None if output != current_content: with open(target, 'wb') as target_file: target_file.write(output) if __name__ == '__main__': parser = argparse.ArgumentParser(description='Generate a defines file.') parser.add_argument('target', help='The target file to generate from the template.') args = parser.parse_args() defines = Defines() defines.generate_defines(args.target) freelan-2.0/freelan-all.sln000066400000000000000000000213311252300335000156600ustar00rootroot00000000000000 Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Express 2013 for Windows Desktop VisualStudioVersion = 12.0.30501.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libiconvplus", "libs\iconvplus\libiconvplus.vcxproj", "{ACD7B910-1594-4192-9AE1-E805B2F5DB59}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libkfather", "libs\kfather\libkfather.vcxproj", "{FCBBDD58-4EF6-4EEF-8405-49E06F61364B}" ProjectSection(ProjectDependencies) = postProject {ACD7B910-1594-4192-9AE1-E805B2F5DB59} = {ACD7B910-1594-4192-9AE1-E805B2F5DB59} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcryptoplus", "libs\cryptoplus\libcryptoplus.vcxproj", "{BABD5FDD-D2DC-44FE-B2A4-A21D3DD1F6C2}" ProjectSection(ProjectDependencies) = postProject {ACD7B910-1594-4192-9AE1-E805B2F5DB59} = {ACD7B910-1594-4192-9AE1-E805B2F5DB59} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libasiotap", "libs\asiotap\libasiotap.vcxproj", "{9173624C-FFF7-4431-BB4A-FC30B13AD742}" ProjectSection(ProjectDependencies) = postProject {67D44B66-2B37-4FEC-90AD-F3A64B5BA1F4} = {67D44B66-2B37-4FEC-90AD-F3A64B5BA1F4} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libfscp", "libs\fscp\libfscp.vcxproj", "{D2906D5F-3E94-4376-814D-299B8F81E195}" ProjectSection(ProjectDependencies) = postProject {ACD7B910-1594-4192-9AE1-E805B2F5DB59} = {ACD7B910-1594-4192-9AE1-E805B2F5DB59} {BABD5FDD-D2DC-44FE-B2A4-A21D3DD1F6C2} = {BABD5FDD-D2DC-44FE-B2A4-A21D3DD1F6C2} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libfreelan", "libs\freelan\libfreelan.vcxproj", "{3BCC24B5-D624-47BC-AFED-BF540AFA29F8}" ProjectSection(ProjectDependencies) = postProject {9173624C-FFF7-4431-BB4A-FC30B13AD742} = {9173624C-FFF7-4431-BB4A-FC30B13AD742} {FCBBDD58-4EF6-4EEF-8405-49E06F61364B} = {FCBBDD58-4EF6-4EEF-8405-49E06F61364B} {D2906D5F-3E94-4376-814D-299B8F81E195} = {D2906D5F-3E94-4376-814D-299B8F81E195} {70266482-33AC-449F-8356-0EC6FA0C1BBD} = {70266482-33AC-449F-8356-0EC6FA0C1BBD} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freelan", "apps\freelan\freelan.vcxproj", "{FCABC429-7FB2-4453-89CB-D1A59A7D59F9}" ProjectSection(ProjectDependencies) = postProject {67D44B66-2B37-4FEC-90AD-F3A64B5BA1F4} = {67D44B66-2B37-4FEC-90AD-F3A64B5BA1F4} {3BCC24B5-D624-47BC-AFED-BF540AFA29F8} = {3BCC24B5-D624-47BC-AFED-BF540AFA29F8} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libexecuteplus", "libs\executeplus\libexecuteplus.vcxproj", "{67D44B66-2B37-4FEC-90AD-F3A64B5BA1F4}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmongooseplus", "libs\mongooseplus\libmongooseplus.vcxproj", "{70266482-33AC-449F-8356-0EC6FA0C1BBD}" ProjectSection(ProjectDependencies) = postProject {BABD5FDD-D2DC-44FE-B2A4-A21D3DD1F6C2} = {BABD5FDD-D2DC-44FE-B2A4-A21D3DD1F6C2} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {ACD7B910-1594-4192-9AE1-E805B2F5DB59}.Debug|Win32.ActiveCfg = Debug|Win32 {ACD7B910-1594-4192-9AE1-E805B2F5DB59}.Debug|Win32.Build.0 = Debug|Win32 {ACD7B910-1594-4192-9AE1-E805B2F5DB59}.Debug|x64.ActiveCfg = Debug|x64 {ACD7B910-1594-4192-9AE1-E805B2F5DB59}.Debug|x64.Build.0 = Debug|x64 {ACD7B910-1594-4192-9AE1-E805B2F5DB59}.Release|Win32.ActiveCfg = Release|Win32 {ACD7B910-1594-4192-9AE1-E805B2F5DB59}.Release|Win32.Build.0 = Release|Win32 {ACD7B910-1594-4192-9AE1-E805B2F5DB59}.Release|x64.ActiveCfg = Release|x64 {ACD7B910-1594-4192-9AE1-E805B2F5DB59}.Release|x64.Build.0 = Release|x64 {FCBBDD58-4EF6-4EEF-8405-49E06F61364B}.Debug|Win32.ActiveCfg = Debug|Win32 {FCBBDD58-4EF6-4EEF-8405-49E06F61364B}.Debug|Win32.Build.0 = Debug|Win32 {FCBBDD58-4EF6-4EEF-8405-49E06F61364B}.Debug|x64.ActiveCfg = Debug|x64 {FCBBDD58-4EF6-4EEF-8405-49E06F61364B}.Debug|x64.Build.0 = Debug|x64 {FCBBDD58-4EF6-4EEF-8405-49E06F61364B}.Release|Win32.ActiveCfg = Release|Win32 {FCBBDD58-4EF6-4EEF-8405-49E06F61364B}.Release|Win32.Build.0 = Release|Win32 {FCBBDD58-4EF6-4EEF-8405-49E06F61364B}.Release|x64.ActiveCfg = Release|x64 {FCBBDD58-4EF6-4EEF-8405-49E06F61364B}.Release|x64.Build.0 = Release|x64 {BABD5FDD-D2DC-44FE-B2A4-A21D3DD1F6C2}.Debug|Win32.ActiveCfg = Debug|Win32 {BABD5FDD-D2DC-44FE-B2A4-A21D3DD1F6C2}.Debug|Win32.Build.0 = Debug|Win32 {BABD5FDD-D2DC-44FE-B2A4-A21D3DD1F6C2}.Debug|x64.ActiveCfg = Debug|x64 {BABD5FDD-D2DC-44FE-B2A4-A21D3DD1F6C2}.Debug|x64.Build.0 = Debug|x64 {BABD5FDD-D2DC-44FE-B2A4-A21D3DD1F6C2}.Release|Win32.ActiveCfg = Release|Win32 {BABD5FDD-D2DC-44FE-B2A4-A21D3DD1F6C2}.Release|Win32.Build.0 = Release|Win32 {BABD5FDD-D2DC-44FE-B2A4-A21D3DD1F6C2}.Release|x64.ActiveCfg = Release|x64 {BABD5FDD-D2DC-44FE-B2A4-A21D3DD1F6C2}.Release|x64.Build.0 = Release|x64 {9173624C-FFF7-4431-BB4A-FC30B13AD742}.Debug|Win32.ActiveCfg = Debug|Win32 {9173624C-FFF7-4431-BB4A-FC30B13AD742}.Debug|Win32.Build.0 = Debug|Win32 {9173624C-FFF7-4431-BB4A-FC30B13AD742}.Debug|x64.ActiveCfg = Debug|x64 {9173624C-FFF7-4431-BB4A-FC30B13AD742}.Debug|x64.Build.0 = Debug|x64 {9173624C-FFF7-4431-BB4A-FC30B13AD742}.Release|Win32.ActiveCfg = Release|Win32 {9173624C-FFF7-4431-BB4A-FC30B13AD742}.Release|Win32.Build.0 = Release|Win32 {9173624C-FFF7-4431-BB4A-FC30B13AD742}.Release|x64.ActiveCfg = Release|x64 {9173624C-FFF7-4431-BB4A-FC30B13AD742}.Release|x64.Build.0 = Release|x64 {D2906D5F-3E94-4376-814D-299B8F81E195}.Debug|Win32.ActiveCfg = Debug|Win32 {D2906D5F-3E94-4376-814D-299B8F81E195}.Debug|Win32.Build.0 = Debug|Win32 {D2906D5F-3E94-4376-814D-299B8F81E195}.Debug|x64.ActiveCfg = Debug|x64 {D2906D5F-3E94-4376-814D-299B8F81E195}.Debug|x64.Build.0 = Debug|x64 {D2906D5F-3E94-4376-814D-299B8F81E195}.Release|Win32.ActiveCfg = Release|Win32 {D2906D5F-3E94-4376-814D-299B8F81E195}.Release|Win32.Build.0 = Release|Win32 {D2906D5F-3E94-4376-814D-299B8F81E195}.Release|x64.ActiveCfg = Release|x64 {D2906D5F-3E94-4376-814D-299B8F81E195}.Release|x64.Build.0 = Release|x64 {3BCC24B5-D624-47BC-AFED-BF540AFA29F8}.Debug|Win32.ActiveCfg = Debug|Win32 {3BCC24B5-D624-47BC-AFED-BF540AFA29F8}.Debug|Win32.Build.0 = Debug|Win32 {3BCC24B5-D624-47BC-AFED-BF540AFA29F8}.Debug|x64.ActiveCfg = Debug|x64 {3BCC24B5-D624-47BC-AFED-BF540AFA29F8}.Debug|x64.Build.0 = Debug|x64 {3BCC24B5-D624-47BC-AFED-BF540AFA29F8}.Release|Win32.ActiveCfg = Release|Win32 {3BCC24B5-D624-47BC-AFED-BF540AFA29F8}.Release|Win32.Build.0 = Release|Win32 {3BCC24B5-D624-47BC-AFED-BF540AFA29F8}.Release|x64.ActiveCfg = Release|x64 {3BCC24B5-D624-47BC-AFED-BF540AFA29F8}.Release|x64.Build.0 = Release|x64 {FCABC429-7FB2-4453-89CB-D1A59A7D59F9}.Debug|Win32.ActiveCfg = Debug|Win32 {FCABC429-7FB2-4453-89CB-D1A59A7D59F9}.Debug|Win32.Build.0 = Debug|Win32 {FCABC429-7FB2-4453-89CB-D1A59A7D59F9}.Debug|x64.ActiveCfg = Debug|x64 {FCABC429-7FB2-4453-89CB-D1A59A7D59F9}.Debug|x64.Build.0 = Debug|x64 {FCABC429-7FB2-4453-89CB-D1A59A7D59F9}.Release|Win32.ActiveCfg = Release|Win32 {FCABC429-7FB2-4453-89CB-D1A59A7D59F9}.Release|Win32.Build.0 = Release|Win32 {FCABC429-7FB2-4453-89CB-D1A59A7D59F9}.Release|x64.ActiveCfg = Release|x64 {FCABC429-7FB2-4453-89CB-D1A59A7D59F9}.Release|x64.Build.0 = Release|x64 {67D44B66-2B37-4FEC-90AD-F3A64B5BA1F4}.Debug|Win32.ActiveCfg = Debug|Win32 {67D44B66-2B37-4FEC-90AD-F3A64B5BA1F4}.Debug|Win32.Build.0 = Debug|Win32 {67D44B66-2B37-4FEC-90AD-F3A64B5BA1F4}.Debug|x64.ActiveCfg = Debug|x64 {67D44B66-2B37-4FEC-90AD-F3A64B5BA1F4}.Debug|x64.Build.0 = Debug|x64 {67D44B66-2B37-4FEC-90AD-F3A64B5BA1F4}.Release|Win32.ActiveCfg = Release|Win32 {67D44B66-2B37-4FEC-90AD-F3A64B5BA1F4}.Release|Win32.Build.0 = Release|Win32 {67D44B66-2B37-4FEC-90AD-F3A64B5BA1F4}.Release|x64.ActiveCfg = Release|x64 {67D44B66-2B37-4FEC-90AD-F3A64B5BA1F4}.Release|x64.Build.0 = Release|x64 {70266482-33AC-449F-8356-0EC6FA0C1BBD}.Debug|Win32.ActiveCfg = Debug|Win32 {70266482-33AC-449F-8356-0EC6FA0C1BBD}.Debug|Win32.Build.0 = Debug|Win32 {70266482-33AC-449F-8356-0EC6FA0C1BBD}.Debug|x64.ActiveCfg = Debug|x64 {70266482-33AC-449F-8356-0EC6FA0C1BBD}.Debug|x64.Build.0 = Debug|x64 {70266482-33AC-449F-8356-0EC6FA0C1BBD}.Release|Win32.ActiveCfg = Release|Win32 {70266482-33AC-449F-8356-0EC6FA0C1BBD}.Release|Win32.Build.0 = Release|Win32 {70266482-33AC-449F-8356-0EC6FA0C1BBD}.Release|x64.ActiveCfg = Release|x64 {70266482-33AC-449F-8356-0EC6FA0C1BBD}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal freelan-2.0/gpl-3.0.txt000066400000000000000000001045131252300335000146050ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . freelan-2.0/libs/000077500000000000000000000000001252300335000137115ustar00rootroot00000000000000freelan-2.0/libs/asiotap/000077500000000000000000000000001252300335000153515ustar00rootroot00000000000000freelan-2.0/libs/asiotap/README.md000066400000000000000000000016311252300335000166310ustar00rootroot00000000000000# What is libasiotap? libasiotap provides a portable C++ TAP adapter extension for the Boost::ASIO library. It is mainly based on [boost::asio](http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio.html). The library can deal with any TAP adapter device that has the same interface as OpenVPN's one (commonly called "tap0901"). The source code for such a TAP adapter as well as the source code for a tool to install/remove a TAP adapter is provided. # Licensing All code is licensed under the GPLv3. See gpl-3.0.txt. If you are interested in using this project under a different license, please [contact me](mailto:julien.kauffmann__AT__freelan.org). I don't bite and I probably won't charge (at least, not much). # Does the project have a website ? Yes, it does. And [here](http://www.freelan.org) it is. You may also find the [git repository](https://github.com/freelan-developers/freelan-all) on github. freelan-2.0/libs/asiotap/SConscript000066400000000000000000000013001252300335000173550ustar00rootroot00000000000000import os import sys Import('env dirs name') env = env.Clone() local_include_dir = Dir(os.path.join('include', name)) env.Prepend(CPPPATH=[local_include_dir]) all_sources = set(env.RGlob('src', '*.cpp')) windows_sources = set(env.RGlob(os.path.join('src', 'windows'), '*.cpp')) linux_sources = set(env.RGlob(os.path.join('src', 'linux'), '*.cpp')) if sys.platform.startswith('linux'): sources = all_sources - windows_sources else: sources = all_sources - windows_sources - linux_sources includes = env.RInstall(dirs['root'], local_include_dir, ['*.hpp']) library = env.StaticLibrary(target=os.path.join(str(dirs['lib']), name), source=sorted(sources, key=str)) Return('library includes') freelan-2.0/libs/asiotap/include/000077500000000000000000000000001252300335000167745ustar00rootroot00000000000000freelan-2.0/libs/asiotap/include/asiotap/000077500000000000000000000000001252300335000204345ustar00rootroot00000000000000freelan-2.0/libs/asiotap/include/asiotap/asiotap.hpp000066400000000000000000000037611252300335000226140ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file asiotap.hpp * \author Julien KAUFFMANN * \brief The global asiotap include file. */ #ifndef ASIOTAP_ASIOTAP_HPP #define ASIOTAP_ASIOTAP_HPP #include "tap_adapter.hpp" namespace asiotap { } #endif /* ASIOTAP_ASIOTAP_HPP */ freelan-2.0/libs/asiotap/include/asiotap/base_dns_servers_manager.hpp000066400000000000000000000221501252300335000261660ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file base_dns_servers_manager.hpp * \author Julien KAUFFMANN * \brief The base DNS servers manager class. */ #pragma once #include #include #include #include #include #include #include #include "types/ip_endpoint.hpp" namespace asiotap { /** * \brief Handle DNS servers. */ template class base_dns_servers_manager { public: struct dns_server_type { std::string interface_name; ip_address dns_server_address; friend bool operator<(const dns_server_type& lhs, const dns_server_type& rhs) { if (lhs.interface_name == rhs.interface_name) { return (lhs.dns_server_address < rhs.dns_server_address); } else { return (lhs.interface_name < rhs.interface_name); } } friend bool operator==(const dns_server_type& lhs, const dns_server_type& rhs) { return ((lhs.interface_name == rhs.interface_name) && (lhs.dns_server_address == rhs.dns_server_address)); } friend std::ostream& operator<<(std::ostream& os, const dns_server_type& value) { return os << value.interface_name << " - " << value.dns_server_address; } }; class entry_type_impl { public: ~entry_type_impl() { if (m_success) { m_dns_servers_manager.unregister_dns_server(m_dns_server); } } entry_type_impl(const entry_type_impl&) = delete; entry_type_impl& operator=(const entry_type_impl&) = delete; entry_type_impl(entry_type_impl&&) = delete; entry_type_impl& operator=(entry_type_impl&&) = delete; const dns_server_type& dns_server() const { return m_dns_server; } private: entry_type_impl(base_dns_servers_manager& dns_server_manager, const dns_server_type& _dns_server) : m_dns_servers_manager(dns_server_manager), m_dns_server(_dns_server), m_success(m_dns_servers_manager.register_dns_server(m_dns_server)) { } base_dns_servers_manager& m_dns_servers_manager; dns_server_type m_dns_server; bool m_success; friend class base_dns_servers_manager; }; /** * \brief The entry implementation type. */ typedef boost::shared_ptr entry_type; /** * \brief The add handler type. */ typedef boost::function dns_server_add_handler_type; /** * \brief The remove handler type. */ typedef boost::function dns_server_remove_handler_type; /** * \brief The registration success handler type. */ typedef boost::function dns_server_registration_success_handler_type; /** * \brief The registration failure handler type. */ typedef boost::function dns_server_registration_failure_handler_type; /** * \brief The unregistration success handler type. */ typedef boost::function dns_server_unregistration_success_handler_type; /** * \brief The unregistration failure handler type. */ typedef boost::function dns_server_unregistration_failure_handler_type; explicit base_dns_servers_manager(boost::asio::io_service& io_service_) : m_io_service(io_service_), m_dns_server_add_handler(), m_dns_server_remove_handler(), m_dns_server_registration_success_handler(), m_dns_server_registration_failure_handler(), m_dns_server_unregistration_success_handler(), m_dns_server_unregistration_failure_handler() { } base_dns_servers_manager(const base_dns_servers_manager&) = delete; base_dns_servers_manager& operator=(const base_dns_servers_manager&) = delete; base_dns_servers_manager(base_dns_servers_manager&&) = delete; base_dns_servers_manager& operator=(base_dns_servers_manager&&) = delete; boost::asio::io_service& io_service() { return m_io_service; } void set_dns_server_add_handler(dns_server_add_handler_type handler) { m_dns_server_add_handler = handler; } void set_dns_server_remove_handler(dns_server_remove_handler_type handler) { m_dns_server_remove_handler = handler; } void set_dns_server_registration_success_handler(dns_server_registration_success_handler_type handler) { m_dns_server_registration_success_handler = handler; } void set_dns_server_registration_failure_handler(dns_server_registration_failure_handler_type handler) { m_dns_server_registration_failure_handler = handler; } void set_dns_server_unregistration_success_handler(dns_server_unregistration_success_handler_type handler) { m_dns_server_unregistration_success_handler = handler; } void set_dns_server_unregistration_failure_handler(dns_server_unregistration_failure_handler_type handler) { m_dns_server_unregistration_failure_handler = handler; } bool register_dns_server(const dns_server_type& dns_server) { try { bool result = false; if (m_dns_server_add_handler) { result = m_dns_server_add_handler(dns_server); } if (!result) { static_cast(this)->register_dns_server(dns_server); } if (m_dns_server_registration_success_handler) { m_dns_server_registration_success_handler(dns_server); } } catch (boost::system::system_error& ex) { if (m_dns_server_registration_failure_handler) { m_dns_server_registration_failure_handler(dns_server, ex); } return false; } return true; } bool unregister_dns_server(const dns_server_type& dns_server) { try { bool result = false; if (m_dns_server_remove_handler) { result = m_dns_server_remove_handler(dns_server); } if (!result) { static_cast(this)->unregister_dns_server(dns_server); } if (m_dns_server_unregistration_success_handler) { m_dns_server_unregistration_success_handler(dns_server); } } catch (boost::system::system_error& ex) { if (m_dns_server_unregistration_failure_handler) { m_dns_server_unregistration_failure_handler(dns_server, ex); } return false; } return true; } entry_type get_dns_server_entry(const dns_server_type& dns_server) { entry_type entry = m_entry_table[dns_server].lock(); if (!entry) { entry = boost::shared_ptr(new entry_type_impl(*this, dns_server)); m_entry_table[dns_server] = entry; } return entry; } protected: typedef std::map> entry_table_type; private: boost::asio::io_service& m_io_service; entry_table_type m_entry_table; dns_server_add_handler_type m_dns_server_add_handler; dns_server_remove_handler_type m_dns_server_remove_handler; dns_server_registration_success_handler_type m_dns_server_registration_success_handler; dns_server_registration_failure_handler_type m_dns_server_registration_failure_handler; dns_server_unregistration_success_handler_type m_dns_server_unregistration_success_handler; dns_server_unregistration_failure_handler_type m_dns_server_unregistration_failure_handler; }; } freelan-2.0/libs/asiotap/include/asiotap/base_route_manager.hpp000066400000000000000000000173301252300335000247730ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file base_route_manager.hpp * \author Julien KAUFFMANN * \brief The base route manager class. */ #ifndef ASIOTAP_BASE_ROUTE_MANAGER_HPP #define ASIOTAP_BASE_ROUTE_MANAGER_HPP #include #include #include #include #include #include #include #include #include #include "types/ip_route.hpp" namespace asiotap { /** * \brief A routing table entry. */ template struct base_routing_table_entry { typedef InterfaceType interface_type; InterfaceType interface; ip_route route; unsigned int metric; friend bool operator==(const base_routing_table_entry& lhs, const base_routing_table_entry& rhs) { return ((lhs.interface == rhs.interface) && (lhs.route == rhs.route)); } friend bool operator<(const base_routing_table_entry& lhs, const base_routing_table_entry& rhs) { if (lhs.interface == rhs.interface) { return (lhs.route < rhs.route); } else { return (lhs.interface < rhs.interface); } } friend std::ostream& operator<<(std::ostream& os, const base_routing_table_entry& value) { return os << value.interface << " - " << value.route << " - metric " << value.metric; } }; /** * \brief Handle system routes. */ template class base_route_manager { public: typedef RouteType route_type; class entry_type_impl { public: ~entry_type_impl() { if (m_success) { m_route_manager.unregister_route(m_route); } } entry_type_impl(const entry_type_impl&) = delete; entry_type_impl& operator=(const entry_type_impl&) = delete; entry_type_impl(entry_type_impl&&) = delete; entry_type_impl& operator=(entry_type_impl&&) = delete; const route_type& route() const { return m_route; } private: entry_type_impl(base_route_manager& route_manager, const route_type& _route) : m_route_manager(route_manager), m_route(_route), m_success(m_route_manager.register_route(m_route)) { } base_route_manager& m_route_manager; route_type m_route; bool m_success; friend class base_route_manager; }; /** * \brief The entry implementation type. */ typedef boost::shared_ptr entry_type; /** * \brief The registration success handler type. */ typedef boost::function route_registration_success_handler_type; /** * \brief The registration failure handler type. */ typedef boost::function route_registration_failure_handler_type; /** * \brief The unregistration success handler type. */ typedef boost::function route_unregistration_success_handler_type; /** * \brief The unregistration failure handler type. */ typedef boost::function route_unregistration_failure_handler_type; explicit base_route_manager(boost::asio::io_service& io_service_) : m_io_service(io_service_) { } base_route_manager(const base_route_manager&) = delete; base_route_manager& operator=(const base_route_manager&) = delete; base_route_manager(base_route_manager&&) = delete; base_route_manager& operator=(base_route_manager&&) = delete; boost::asio::io_service& io_service() { return m_io_service; } void set_route_registration_success_handler(route_registration_success_handler_type handler) { m_route_registration_success_handler = handler; } void set_route_registration_failure_handler(route_registration_failure_handler_type handler) { m_route_registration_failure_handler = handler; } void set_route_unregistration_success_handler(route_unregistration_success_handler_type handler) { m_route_unregistration_success_handler = handler; } void set_route_unregistration_failure_handler(route_unregistration_failure_handler_type handler) { m_route_unregistration_failure_handler = handler; } bool register_route(const route_type& route) { try { static_cast(this)->register_route(route); if (m_route_registration_success_handler) { m_route_registration_success_handler(route); } } catch (boost::system::system_error& ex) { if (m_route_registration_failure_handler) { m_route_registration_failure_handler(route, ex); } return false; } return true; } bool unregister_route(const route_type& route) { try { static_cast(this)->unregister_route(route); if (m_route_unregistration_success_handler) { m_route_unregistration_success_handler(route); } } catch (boost::system::system_error& ex) { if (m_route_unregistration_failure_handler) { m_route_unregistration_failure_handler(route, ex); } return false; } return true; } entry_type get_route_entry(const route_type& route) { entry_type entry = m_entry_table[route].lock(); if (!entry) { entry = boost::shared_ptr(new entry_type_impl(*this, route)); m_entry_table[route] = entry; } return entry; } protected: typedef std::map> entry_table_type; private: boost::asio::io_service& m_io_service; entry_table_type m_entry_table; route_registration_success_handler_type m_route_registration_success_handler; route_registration_failure_handler_type m_route_registration_failure_handler; route_unregistration_success_handler_type m_route_unregistration_success_handler; route_unregistration_failure_handler_type m_route_unregistration_failure_handler; }; } #endif /* ASIOTAP_BASE_ROUTE_MANAGER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/base_tap_adapter.hpp000066400000000000000000000166501252300335000244330ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file base_tap_adapter.hpp * \author Julien KAUFFMANN * \brief The base tap adapter class. */ #ifndef ASIOTAP_BASE_TAP_ADAPTER_HPP #define ASIOTAP_BASE_TAP_ADAPTER_HPP #include #include #include #include "osi/ethernet_address.hpp" #include "tap_adapter_layer.hpp" #include "tap_adapter_configuration.hpp" #include "os.hpp" #include "error.hpp" namespace asiotap { template class base_tap_adapter { public: base_tap_adapter(const base_tap_adapter&) = delete; base_tap_adapter& operator=(const base_tap_adapter&) = delete; /** * \brief The descriptor type. */ typedef DescriptorType descriptor_type; /** * \brief The layer type. */ typedef tap_adapter_layer layer_type; /** * \brief The configuration type. */ typedef tap_adapter_configuration configuration_type; /** * \brief Read some data from the tap adapter. * \param buffers The buffers into which the data will be read. * \param handler The handler to be called when the read operation completes. */ template void async_read(const MutableBufferSequence& buffers, ReadHandler handler) { m_descriptor.async_read_some(buffers, handler); } /** * \brief Write some data to the tap adapter. * \param buffers One or more buffers to be written to the tap adapter. * \param handler The handler to be called when the write operation completes. */ template void async_write(const ConstBufferSequence& buffers, WriteHandler handler) { m_descriptor.async_write_some(buffers, handler); } /** * \brief Read some data from the tap adapter. * \param buffers The buffers into which the data will be read. * \return The number of bytes read. */ template size_t read(const MutableBufferSequence& buffers) { return m_descriptor.read_some(buffers); } /** * \brief Read some data from the tap adapter. * \param buffers The buffers into which the data will be read. * \param ec The error code. * \return The number of bytes read. */ template size_t read(const MutableBufferSequence& buffers, boost::system::error_code& ec) { return m_descriptor.read_some(buffers, ec); } /** * \brief Write some data to the tap adapter. * \param buffers One or more buffers to be written to the tap adapter. * \return The number of bytes written. */ template size_t write(const ConstBufferSequence& buffers) { return m_descriptor.write_some(buffers); } /** * \brief Write some data to the tap adapter. * \param buffers One or more buffers to be written to the tap adapter. * \param ec The error code. * \return The number of bytes written. */ template size_t write(const ConstBufferSequence& buffers, boost::system::error_code& ec) { return m_descriptor.write_some(buffers, ec); } /** * \brief Cancel all pending asynchronous operations associated with the tap adapter. */ void cancel() { m_descriptor.cancel(); } /** * \brief Cancel all pending asynchronous operations associated with the tap adapter. * \param ec The error code. */ void cancel(boost::system::error_code& ec) { m_descriptor.cancel(ec); } /** * \brief Get the associated io_service instance. * \return The associated io_service. */ boost::asio::io_service& get_io_service() { return m_descriptor.get_io_service(); } /** * \brief Get the layer of the tap adapter. * \return The layer. */ tap_adapter_layer layer() const { return m_layer; } /** * \brief Get the device name. * \return The device name. */ const std::string& name() const { return m_name; } /** * \brief Get the device MTU. * \return The device MTU. */ size_t mtu() const { return m_mtu; } /** * \brief Get the device ethernet address. * \return The device ethernet address. */ const osi::ethernet_address& ethernet_address() const { return m_ethernet_address; } /** * \brief Get the tap adapter current state. * \return true if the tap adapter is open. */ bool is_open() const { return m_descriptor.is_open(); } /** * \brief Close the associated descriptor. */ void close() { m_descriptor.close(); } /** * \brief Close the associated descriptor. * \param ec The error code. */ boost::system::error_code close(boost::system::error_code& ec) { return m_descriptor.close(ec); } protected: base_tap_adapter(boost::asio::io_service& _io_service, tap_adapter_layer _layer) : m_descriptor(_io_service), m_layer(_layer), m_name(), m_mtu(), m_ethernet_address() {} descriptor_type& descriptor() { return m_descriptor; } void set_name(const std::string& _name) { m_name = _name; } void set_mtu(size_t _mtu) { m_mtu = _mtu; } void set_ethernet_address(const osi::ethernet_address& _ethernet_address) { m_ethernet_address = _ethernet_address; } private: descriptor_type m_descriptor; tap_adapter_layer m_layer; std::string m_name; size_t m_mtu; osi::ethernet_address m_ethernet_address; friend std::ostream& operator<<(std::ostream& os, const base_tap_adapter& value) { return os << value.name(); } }; } #endif /* ASIOTAP_BASE_TAP_ADAPTER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/dns_servers_manager.hpp000066400000000000000000000043131252300335000251750ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file dns_servers_manager.hpp * \author Julien KAUFFMANN * \brief A DNS servers manager class. */ #pragma once #include "os.hpp" #ifdef WINDOWS #include "windows/windows_dns_servers_manager.hpp" #elif defined(UNIX) #include "posix/posix_dns_servers_manager.hpp" #endif namespace asiotap { #ifdef WINDOWS typedef windows_dns_servers_manager dns_servers_manager; #elif defined(UNIX) typedef posix_dns_servers_manager dns_servers_manager; #endif }freelan-2.0/libs/asiotap/include/asiotap/error.hpp000066400000000000000000000075241252300335000223060ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file error.hpp * \author Julien Kauffmann * \brief The errors. */ #ifndef ASIOTAP_ERROR_HPP #define ASIOTAP_ERROR_HPP #include #include #include namespace asiotap { /** * @brief Get the default server error category. * @return The default server error category instance. * * @warning The first call to this function is thread-safe only starting with C++11. */ const boost::system::error_category& asiotap_category(); /** * The list of errors. */ enum class asiotap_error { success = 0, invalid_tap_adapter_layer, invalid_type, no_ethernet_address, process_handle_expected, external_process_output_parsing_error, no_such_tap_adapter, invalid_ip_configuration, external_process_execution_failed, no_dns_script_provided }; /** * @brief Create an error_code instance for the given error. * @param error The error. * @return The error_code instance. */ inline boost::system::error_code make_error_code(asiotap_error error) { return boost::system::error_code(static_cast(error), asiotap_category()); } /** * @brief Create an error_condition instance for the given error. * @param error The error. * @return The error_condition instance. */ inline boost::system::error_condition make_error_condition(asiotap_error error) { return boost::system::error_condition(static_cast(error), asiotap_category()); } /** * @brief A server error category. */ class asiotap_category_impl : public boost::system::error_category { public: /** * @brief Get the name of the category. * @return The name of the category. */ virtual const char* name() const throw(); /** * @brief Get the error message for a given error. * @param ev The error numeric value. * @return The message associated to the error. */ virtual std::string message(int ev) const; }; } namespace boost { namespace system { template <> struct is_error_code_enum< ::asiotap::asiotap_error> : public boost::true_type {}; } } #endif /* ASIOTAP_ERROR_HPP */ freelan-2.0/libs/asiotap/include/asiotap/os.hpp000066400000000000000000000070011252300335000215640ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file os.hpp * \brief Macro to know the operating system. * * - UNIX: Unix-like operating system.\n * - LINUX: Linux operating system.\n * - SUNOS: Sun operating system.\n * - MACINTOSH: Macintosh or MacOS operating system.\n * - WINDOWS: MS Windows operating system.\n * - MSDOS: MS DOS operating system.\n * * \author Julien KAUFFMANN * \author Sebastien VINCENT */ #ifndef ASIOTAP_OS_HPP #define ASIOTAP_OS_HPP /* * Extract the "MACINTOSH" flag from the compiler. */ #if defined(__APPLE__) #define UNIX #define MACINTOSH #endif /* * Extract the "SUNOS" flag from the compiler. */ #if defined(sun) #define UNIX #define SUNOS #endif /* * Extract the "UNIX" flag from compiler. */ #ifdef __linux__ #define UNIX #define LINUX #endif /* * Extract the "BSD" flag from compiler. */ #if defined(BSD) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) #define BSD #define UNIX #endif /* * Extract the "MSDOS" flag from the compiler. */ #ifdef __MSDOS__ #define MSDOS #undef UNIX #endif /* * Extract the "WINDOWS" flag from the compiler. */ #if defined(_Windows) || defined(__WINDOWS__) || \ defined(__WIN32__) || defined(WIN32) || \ defined(__WINNT__) || defined(__NT__) || \ defined(_WIN32) || defined(_WIN64) #define WINDOWS #ifdef _MSC_VER #define MSV #if defined(DEBUG) || defined(DEBUGTRACE) #ifdef NDEBUG #undef NDEBUG #endif #else #ifndef NDEBUG #define NDEBUG #endif #endif #else #undef MSV #endif #undef UNIX #undef MSDOS #endif /* * Remove the WINDOWS flag when using MACINTOSH. */ #ifdef MACINTOSH #undef WINDOWS #endif /* * Assume UNIX if not Windows, Macintosh or MSDOS. */ #if !defined(WINDOWS) && !defined(MACINTOSH) && !defined(MSDOS) #define UNIX #endif #endif /* ASIOTAP_OS_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/000077500000000000000000000000001252300335000212265ustar00rootroot00000000000000freelan-2.0/libs/asiotap/include/asiotap/osi/arp_builder.hpp000066400000000000000000000065221252300335000242340ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file arp_builder.hpp * \author Julien KAUFFMANN * \brief An ARP frame builder class. */ #ifndef ASIOTAP_OSI_ARP_BUILDER_HPP #define ASIOTAP_OSI_ARP_BUILDER_HPP #include "builder.hpp" #include "arp_frame.hpp" #include namespace asiotap { namespace osi { /** * \brief An arp frame builder class. */ template <> class builder : public _base_builder { public: /** * \brief Create a builder. * \param buf The buffer to use. * \param payload_size The size of the payload. Should be 0 (the default), as ARP frame have no payload. */ builder(boost::asio::mutable_buffer buf, size_t payload_size = 0); /** * \brief Write the frame. * \param operation The ARP operation. * \param sender_hardware_address The sender hardware address. * \param sender_logical_address The sender logical address. * \param target_hardware_address The target hardware address. * \param target_logical_address The target logical address. * \return The total size of the written frame, including its payload. */ size_t write( uint16_t operation, boost::asio::const_buffer sender_hardware_address, boost::asio::ip::address_v4 sender_logical_address, boost::asio::const_buffer target_hardware_address, boost::asio::ip::address_v4 target_logical_address ) const; }; inline builder::builder(boost::asio::mutable_buffer buf, size_t payload_size) : _base_builder(buf, payload_size) { } } } #endif /* ASIOTAP_ARP_BUILDER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/arp_filter.hpp000066400000000000000000000056441252300335000240770ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file arp_filter.hpp * \author Julien KAUFFMANN * \brief An ARP filter class. */ #ifndef ASIOTAP_OSI_ARP_FILTER_HPP #define ASIOTAP_OSI_ARP_FILTER_HPP #include "filter.hpp" #include "arp_frame.hpp" #include "ethernet_helper.hpp" #include "arp_helper.hpp" namespace asiotap { namespace osi { /** * \brief The ARP filter. */ template class filter : public _filter { public: /** * \brief Constructor. * \param _parent The parent filter. */ filter(ParentFilterType& _parent) : _filter(_parent) {}; }; /** * \brief The frame parent match function. * \param parent The parent frame. * \return true if the frame matches the parent frame. */ template <> inline bool frame_parent_match(const_helper parent) { return (parent.protocol() == ARP_PROTOCOL); } /** * \brief Check if a frame is valid. * \param frame The frame. * \return true on success. */ bool check_frame(const_helper frame); } } #endif /* ASIOTAP_OSI_ARP_FILTER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/arp_frame.hpp000066400000000000000000000066751252300335000237110ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file arp_frame.hpp * \author Julien KAUFFMANN * \brief An ARP frame structure. */ #ifndef ASIOTAP_OSI_ARP_FRAME_HPP #define ASIOTAP_OSI_ARP_FRAME_HPP #include "frame.hpp" #include "ethernet_frame.hpp" namespace asiotap { namespace osi { /** * \brief The ARP protocol number. */ const uint16_t ARP_PROTOCOL = 0x0806; /** * \brief The Ethernet hardware type. */ const uint16_t ETHERNET_HARDWARE_TYPE = 0x0001; /** * \brief The IP protocol type. */ const uint16_t IP_PROTOCOL_TYPE = 0x0800; /** * \brief An ARP request operation. */ const uint16_t ARP_REQUEST_OPERATION = 0x0001; /** * \brief An ARP reply operation. */ const uint16_t ARP_REPLY_OPERATION = 0x0002; #ifdef MSV #pragma pack(push, 1) #endif /** * \brief An arp frame structure. */ struct arp_frame { uint16_t hardware_type; /**< Link-layer protocol. */ uint16_t protocol_type; /**< Layer 3 protocol. */ uint8_t hardware_address_length; /**< Length of link-layer address (6 in case of ethernet). */ uint8_t logical_address_length; /**< Length of layer 3 address (4 in case of IPv4). */ uint16_t operation; /**< Operation of the sender (1 for requesting a resolution, 2 for replying to a request). */ uint8_t sender_hardware_address[ETHERNET_ADDRESS_SIZE]; /**< Link-layer address of sender. */ struct in_addr sender_logical_address; /**< Layer 3 address (i.e. IPv4) of sender. */ uint8_t target_hardware_address[ETHERNET_ADDRESS_SIZE]; /**< Link-layer address of target. */ struct in_addr target_logical_address; /**< Layer 3 address (i.e. IPv4) of target. */ } PACKED; #ifdef MSV #pragma pack(pop) #endif } } #endif /* ASIOTAP_OSI_ARP_FRAME_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/arp_helper.hpp000066400000000000000000000217701252300335000240670ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file arp_helper.hpp * \author Julien KAUFFMANN * \brief An ARP helper class. */ #ifndef ASIOTAP_OSI_ARP_HELPER_HPP #define ASIOTAP_OSI_ARP_HELPER_HPP #include "helper.hpp" #include "arp_frame.hpp" namespace asiotap { namespace osi { /** * \brief The base arp helper implementation class. */ template class _base_helper_impl : public _base_helper { public: /** * \brief Get the hardware type. * \return The hardware type. */ uint16_t hardware_type() const; /** * \brief Get the protocol type. * \return The protocol type. */ uint16_t protocol_type() const; /** * \brief Get the hardware address length. * \return The hardware address length. */ size_t hardware_address_length() const; /** * \brief Get the logical address length. * \return The logical address length. */ size_t logical_address_length() const; /** * \brief Get the operation. * \return The operation. */ uint16_t operation() const; /** * \brief Get the sender hardware address. * \return The sender hardware address. */ typename _base_helper_impl::buffer_type sender_hardware_address() const { return boost::asio::buffer(this->frame().sender_hardware_address, sizeof(this->frame().sender_hardware_address)); } /** * \brief Get the sender logical address. * \return The sender logical address. */ boost::asio::ip::address_v4 sender_logical_address() const; /** * \brief Get the target hardware address. * \return The target hardware address. */ typename _base_helper_impl::buffer_type target_hardware_address() const { return boost::asio::buffer(this->frame().target_hardware_address, sizeof(this->frame().target_hardware_address)); } /** * \brief Get the target logical address. * \return The target logical address. */ boost::asio::ip::address_v4 target_logical_address() const; /** * \brief Get the payload buffer. * \return The payload. */ typename _base_helper_impl::buffer_type payload() const { return this->buffer() + sizeof(arp_frame); } protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _base_helper_impl(typename _base_helper_impl::buffer_type buf); }; /** * \brief The mutable arp helper implementation class. */ template <> class _helper_impl : public _base_helper_impl { public: /** * \brief Set the hardware type. * \param hardware_type The hardware type. */ void set_hardware_type(uint16_t hardware_type) const; /** * \brief Set the protocol type. * \param protocol_type The protocol type. */ void set_protocol_type(uint16_t protocol_type) const; /** * \brief Set the hardware address length. * \param hardware_address_length The hardware address length. */ void set_hardware_address_length(size_t hardware_address_length) const; /** * \brief Set the logical address length. * \param logical_address_length The logical address length. */ void set_logical_address_length(size_t logical_address_length) const; /** * \brief Set the operation. * \param operation The operation. */ void set_operation(uint16_t operation) const; /** * \brief Set the sender logical address. * \param sender_logical_address The sender logical address. */ void set_sender_logical_address(boost::asio::ip::address_v4 sender_logical_address) const; /** * \brief Set the target logical address. * \param target_logical_address The target logical address. */ void set_target_logical_address(boost::asio::ip::address_v4 target_logical_address) const; protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _helper_impl(_helper_impl::buffer_type buf); }; template inline uint16_t _base_helper_impl::hardware_type() const { return ntohs(this->frame().hardware_type); } template inline uint16_t _base_helper_impl::protocol_type() const { return ntohs(this->frame().protocol_type); } template inline size_t _base_helper_impl::hardware_address_length() const { return this->frame().hardware_address_length; } template inline size_t _base_helper_impl::logical_address_length() const { return this->frame().logical_address_length; } template inline uint16_t _base_helper_impl::operation() const { return ntohs(this->frame().operation); } template inline boost::asio::ip::address_v4 _base_helper_impl::sender_logical_address() const { return boost::asio::ip::address_v4(ntohl(this->frame().sender_logical_address.s_addr)); } template inline boost::asio::ip::address_v4 _base_helper_impl::target_logical_address() const { return boost::asio::ip::address_v4(ntohl(this->frame().target_logical_address.s_addr)); } template inline _base_helper_impl::_base_helper_impl(typename _base_helper_impl::buffer_type buf) : _base_helper(buf) { } inline void _helper_impl::set_hardware_type(uint16_t _hardware_type) const { this->frame().hardware_type = htons(_hardware_type); } inline void _helper_impl::set_protocol_type(uint16_t _protocol_type) const { this->frame().protocol_type = htons(_protocol_type); } inline void _helper_impl::set_hardware_address_length(size_t _hardware_address_length) const { this->frame().hardware_address_length = static_cast(_hardware_address_length); } inline void _helper_impl::set_logical_address_length(size_t _logical_address_length) const { this->frame().logical_address_length = static_cast(_logical_address_length); } inline void _helper_impl::set_operation(uint16_t _operation) const { this->frame().operation = htons(_operation); } inline void _helper_impl::set_sender_logical_address(boost::asio::ip::address_v4 _sender_logical_address) const { this->frame().sender_logical_address.s_addr = htonl(_sender_logical_address.to_ulong()); } inline void _helper_impl::set_target_logical_address(boost::asio::ip::address_v4 _target_logical_address) const { this->frame().target_logical_address.s_addr = htonl(_target_logical_address.to_ulong()); } inline _helper_impl::_helper_impl(_helper_impl::buffer_type buf) : _base_helper_impl(buf) { } } } #endif /* ASIOTAP_OSI_ARP_HELPER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/arp_proxy.hpp000066400000000000000000000124071252300335000237660ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file arp_proxy.hpp * \author Julien KAUFFMANN * \brief An ARP proxy class. */ #ifndef ASIOTAP_OSI_ARP_PROXY_HPP #define ASIOTAP_OSI_ARP_PROXY_HPP #include "proxy.hpp" #include "ethernet_filter.hpp" #include "arp_filter.hpp" #include "complex_filter.hpp" #include "ethernet_address.hpp" #include #include namespace asiotap { namespace osi { /** * \brief An ARP proxy class. */ template <> class proxy : public _base_proxy { public: /** * \brief The Ethernet address type. */ typedef ethernet_address ethernet_address_type; /** * \brief The entry type. */ typedef std::pair entry_type; /** * \brief The ARP request callback type. */ typedef boost::function arp_request_callback_type; /** * \brief Create an ARP proxy. */ proxy() : m_arp_request_callback(0) { } /** * \brief Add a proxy entry. * \param entry The entry to add. * \return If an entry for the specified logical address already exists, nothing is done and the call returns false. Otherwise, the call returns true. */ bool add_entry(const entry_type& entry); /** * \brief Add a proxy entry. * \param logical_address The logical address. * \param hardware_address The hardware address. * \return If an entry for the specified logical address already exists, nothing is done and the call returns false. Otherwise, the call returns true. */ bool add_entry(const boost::asio::ip::address_v4& logical_address, const ethernet_address_type& hardware_address); /** * \brief Delete a proxy entry. * \param logical_address The logical address. * \return If an entry was deleted, true is returned. Otherwise, the call returns false. */ bool remove_entry(const boost::asio::ip::address_v4& logical_address); /** * \brief Set the callback function when a ARP request is received. * \param callback The callback function. */ void set_arp_request_callback(arp_request_callback_type callback); /** * \brief Process a frame. * \param ethernet_helper The ethernet layer. * \param arp_helper The ARP layer. * \param response_buffer The buffer to write the response to. * \return The buffer that contains the answer, if there is one. */ boost::optional process_frame(const_helper ethernet_helper, const_helper arp_helper, boost::asio::mutable_buffer response_buffer) const; private: typedef std::map entry_map_type; entry_map_type m_entry_map; arp_request_callback_type m_arp_request_callback; }; inline bool proxy::add_entry(const entry_type& entry) { return m_entry_map.insert(entry).second; } inline bool proxy::add_entry(const boost::asio::ip::address_v4& logical_address, const ethernet_address_type& hardware_address) { return add_entry(std::make_pair(logical_address, hardware_address)); } inline bool proxy::remove_entry(const boost::asio::ip::address_v4& logical_address) { return (m_entry_map.erase(logical_address) > 0); } inline void proxy::set_arp_request_callback(arp_request_callback_type callback) { m_arp_request_callback = callback; } } } #endif /* ASIOTAP_ARP_PROXY_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/bootp_builder.hpp000066400000000000000000000075161252300335000246010ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file bootp_builder.hpp * \author Julien KAUFFMANN * \brief An BOOTP frame builder class. */ #ifndef ASIOTAP_OSI_BOOTP_BUILDER_HPP #define ASIOTAP_OSI_BOOTP_BUILDER_HPP #include "builder.hpp" #include "bootp_frame.hpp" #include namespace asiotap { namespace osi { /** * \brief An bootp frame builder class. */ template <> class builder : public _base_builder { public: /** * \brief Create a builder. * \param buf The buffer to use. * \param payload_size The size of the payload. */ builder(boost::asio::mutable_buffer buf, size_t payload_size); /** * \brief Write the frame. * \param operation The operation. * \param hardware_type The hardware type. * \param hardware_length The hardware length. * \param hops The number of hops. * \param xid The x identifier. * \param seconds The number of seconds since the beginning of the request. * \param flags The flags. * \param ciaddr The client address. * \param yiaddr The future client address. * \param siaddr The server address. * \param giaddr The gateway address. * \param chaddr The hardware address. * \param sname The server name. * \param file The filename to use for the boot sequence. * \return The total size of the written frame, including its payload. */ size_t write( uint8_t operation, uint8_t hardware_type, size_t hardware_length, uint8_t hops, uint32_t xid, uint16_t seconds, uint16_t flags, boost::asio::ip::address_v4 ciaddr, boost::asio::ip::address_v4 yiaddr, boost::asio::ip::address_v4 siaddr, boost::asio::ip::address_v4 giaddr, boost::asio::const_buffer chaddr, boost::asio::const_buffer sname, boost::asio::const_buffer file ) const; }; inline builder::builder(boost::asio::mutable_buffer buf, size_t payload_size) : _base_builder(buf, payload_size) { } } } #endif /* ASIOTAP_BOOTP_BUILDER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/bootp_filter.hpp000066400000000000000000000057621252300335000244410ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file bootp_filter.hpp * \author Julien KAUFFMANN * \brief A BOOTP filter class. */ #ifndef ASIOTAP_OSI_BOOTP_FILTER_HPP #define ASIOTAP_OSI_BOOTP_FILTER_HPP #include "filter.hpp" #include "bootp_frame.hpp" #include "udp_helper.hpp" #include "bootp_helper.hpp" namespace asiotap { namespace osi { /** * \brief The BOOTP filter. */ template class filter : public _filter { public: /** * \brief Constructor. * \param _parent The parent filter. */ filter(ParentFilterType& _parent) : _filter(_parent) {} }; /** * \brief The frame parent match function. * \param parent The parent frame. * \return true if the frame matches the parent frame. */ template <> inline bool frame_parent_match(const_helper parent) { return (parent.destination() == BOOTP_PROTOCOL); } /** * \brief Check if a frame is valid. * \param frame The frame. * \return true on success. */ inline bool check_frame(const_helper frame) { static_cast(frame); return true; } } } #endif /* ASIOTAP_OSI_BOOTP_FILTER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/bootp_frame.hpp000066400000000000000000000064041252300335000242400ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file bootp_frame.hpp * \author Julien KAUFFMANN * \brief A BOOTP frame structure. */ #ifndef ASIOTAP_OSI_BOOTP_FRAME_HPP #define ASIOTAP_OSI_BOOTP_FRAME_HPP #include "frame.hpp" namespace asiotap { namespace osi { #ifdef MSV #pragma pack(push, 1) #endif /** * \brief The BOOTP protocol. */ const uint16_t BOOTP_PROTOCOL = 67; /** * \brief The BOOTP BOOTREQUEST operation code. */ const uint8_t BOOTP_BOOTREQUEST = 0x01; /** * \brief The BOOTP BOOTREPLY operation code. */ const uint8_t BOOTP_BOOTREPLY = 0x02; /** * \brief The BOOTP ethernet hardware type. */ const uint8_t BOOTP_HARDWARE_TYPE_ETHERNET = 0x01; /** * \brief A BOOTP frame structure. */ struct bootp_frame { uint8_t operation; /**< The operation. */ uint8_t hardware_type; /**< The hardware type. */ uint8_t hardware_length; /**< The hardware length. */ uint8_t hops; /**< The hops. */ uint32_t xid; /**< The X identifier. */ uint16_t seconds; /**< The time elapsed since the request, in seconds. */ uint16_t flags; /**< The flags. */ in_addr ciaddr; /**< The client address. */ in_addr yiaddr; /**< The future client address. */ in_addr siaddr; /**< The next server address. */ in_addr giaddr; /**< The gateway address. */ uint8_t chaddr[16]; /**< The hardware address. */ uint8_t sname[64]; /**< The server name. */ uint8_t file[128]; /**< The boot filename. */ } PACKED; #ifdef MSV #pragma pack(pop) #endif } } #endif /* ASIOTAP_OSI_BOOTP_FRAME_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/bootp_helper.hpp000066400000000000000000000256321252300335000244310ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file bootp_helper.hpp * \author Julien KAUFFMANN * \brief A BOOTP helper class. */ #ifndef ASIOTAP_OSI_BOOTP_HELPER_HPP #define ASIOTAP_OSI_BOOTP_HELPER_HPP #include "helper.hpp" #include "bootp_frame.hpp" namespace asiotap { namespace osi { /** * \brief The base bootp helper implementation class. */ template class _base_helper_impl : public _base_helper { public: /** * \brief Get the operation. * \return The operation. */ uint8_t operation() const; /** * \brief Get the hardware type. * \return The hardware type. */ uint8_t hardware_type() const; /** * \brief Get the hardware length. * \return The hardware length. */ size_t hardware_length() const; /** * \brief Get the hops count. * \return The hops count. */ uint8_t hops() const; /** * \brief Get the X identifier. * \return The X identifier. */ uint32_t xid() const; /** * \brief Get the seconds elapsed. * \return The seconds elapsed. */ uint16_t seconds() const; /** * \brief Get the flags. * \return The flags. */ uint16_t flags() const; /** * \brief Get the client address. * \return The client address. */ boost::asio::ip::address_v4 ciaddr() const; /** * \brief Get the requested address. * \return The requested address. */ boost::asio::ip::address_v4 yiaddr() const; /** * \brief Get the server address. * \return The server address. */ boost::asio::ip::address_v4 siaddr() const; /** * \brief Get the gateway address. * \return The gateway address. */ boost::asio::ip::address_v4 giaddr() const; /** * \brief Get the hardware address. * \return The hardware address. */ typename _base_helper_impl::buffer_type chaddr() const { return boost::asio::buffer(this->frame().chaddr, sizeof(this->frame().chaddr)); } /** * \brief Get the server name. * \return The server name. */ typename _base_helper_impl::buffer_type sname() const { return boost::asio::buffer(this->frame().sname, sizeof(this->frame().sname)); } /** * \brief Get the filename. * \return The filename. */ typename _base_helper_impl::buffer_type file() const { return boost::asio::buffer(this->frame().file, sizeof(this->frame().file)); } /** * \brief Get the options. * \return The options. */ typename _base_helper_impl::buffer_type options() const { return payload(); } /** * \brief Get the payload buffer. * \return The payload. */ typename _base_helper_impl::buffer_type payload() const { return this->buffer() + sizeof(typename _base_helper_impl::frame_type); } protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _base_helper_impl(typename _base_helper_impl::buffer_type buf); }; /** * \brief The mutable udp helper implementation class. */ template <> class _helper_impl : public _base_helper_impl { public: /** * \brief Set the operation. * \param operation The operation. */ void set_operation(uint8_t operation) const; /** * \brief Set the hardware type. * \param hardware_type The hardware type. */ void set_hardware_type(uint8_t hardware_type) const; /** * \brief Set the hardware length. * \param hardware_length The hardware length. */ void set_hardware_length(size_t hardware_length) const; /** * \brief Set the hops count. * \param hops The hops count. */ void set_hops(uint8_t hops) const; /** * \brief Set the X identifier. * \param xid The X identifier. */ void set_xid(uint32_t xid) const; /** * \brief Set the seconds elapsed. * \param seconds The seconds elapsed. */ void set_seconds(uint16_t seconds) const; /** * \brief Set the flags. * \param flags The flags. */ void set_flags(uint16_t flags) const; /** * \brief Set the client address. * \param ciaddr The client address. */ void set_ciaddr(boost::asio::ip::address_v4 ciaddr) const; /** * \brief Set the requested address. * \param yiaddr The requested address. */ void set_yiaddr(boost::asio::ip::address_v4 yiaddr) const; /** * \brief Set the server address. * \param siaddr The server address. */ void set_siaddr(boost::asio::ip::address_v4 siaddr) const; /** * \brief Set the gateway address. * \param giaddr The gateway address. */ void set_giaddr(boost::asio::ip::address_v4 giaddr) const; protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _helper_impl(_helper_impl::buffer_type buf); }; template inline uint8_t _base_helper_impl::operation() const { return this->frame().operation; } template inline uint8_t _base_helper_impl::hardware_type() const { return this->frame().hardware_type; } template inline size_t _base_helper_impl::hardware_length() const { return this->frame().hardware_length; } template inline uint8_t _base_helper_impl::hops() const { return this->frame().hops; } template inline uint32_t _base_helper_impl::xid() const { return ntohl(this->frame().xid); } template inline uint16_t _base_helper_impl::seconds() const { return ntohs(this->frame().seconds); } template inline uint16_t _base_helper_impl::flags() const { return this->frame().flags; } template inline boost::asio::ip::address_v4 _base_helper_impl::ciaddr() const { return boost::asio::ip::address_v4(ntohl(this->frame().ciaddr.s_addr)); } template inline boost::asio::ip::address_v4 _base_helper_impl::yiaddr() const { return boost::asio::ip::address_v4(ntohl(this->frame().yiaddr.s_addr)); } template inline boost::asio::ip::address_v4 _base_helper_impl::siaddr() const { return boost::asio::ip::address_v4(ntohl(this->frame().siaddr.s_addr)); } template inline boost::asio::ip::address_v4 _base_helper_impl::giaddr() const { return boost::asio::ip::address_v4(ntohl(this->frame().giaddr.s_addr)); } template inline _base_helper_impl::_base_helper_impl(typename _base_helper_impl::buffer_type buf) : _base_helper(buf) { } inline void _helper_impl::set_operation(uint8_t _operation) const { this->frame().operation = _operation; } inline void _helper_impl::set_hardware_type(uint8_t _hardware_type) const { this->frame().hardware_type = _hardware_type; } inline void _helper_impl::set_hardware_length(size_t _hardware_length) const { this->frame().hardware_length = static_cast(_hardware_length); } inline void _helper_impl::set_hops(uint8_t _hops) const { this->frame().hops = _hops; } inline void _helper_impl::set_xid(uint32_t _xid) const { this->frame().xid = htonl(_xid); } inline void _helper_impl::set_seconds(uint16_t _seconds) const { this->frame().seconds = htons(_seconds); } inline void _helper_impl::set_flags(uint16_t _flags) const { this->frame().flags = _flags; } inline void _helper_impl::set_ciaddr(boost::asio::ip::address_v4 _ciaddr) const { this->frame().ciaddr.s_addr = htonl(_ciaddr.to_ulong()); } inline void _helper_impl::set_yiaddr(boost::asio::ip::address_v4 _yiaddr) const { this->frame().yiaddr.s_addr = htonl(_yiaddr.to_ulong()); } inline void _helper_impl::set_siaddr(boost::asio::ip::address_v4 _siaddr) const { this->frame().siaddr.s_addr = htonl(_siaddr.to_ulong()); } inline void _helper_impl::set_giaddr(boost::asio::ip::address_v4 _giaddr) const { this->frame().giaddr.s_addr = htonl(_giaddr.to_ulong()); } inline _helper_impl::_helper_impl(_helper_impl::buffer_type buf) : _base_helper_impl(buf) { } } } #endif /* ASIOTAP_OSI_BOOTP_HELPER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/builder.hpp000066400000000000000000000100441252300335000233640ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file builder.hpp * \author Julien KAUFFMANN * \brief An OSI frame builder class. */ #ifndef ASIOTAP_OSI_BUILDER_HPP #define ASIOTAP_OSI_BUILDER_HPP #include #include "helper.hpp" namespace asiotap { namespace osi { /** * \brief The base ethernet builder class. */ template class _base_builder { public: /** * \brief The frame type. */ typedef OSIFrameType frame_type; /** * \brief The helper type. */ typedef mutable_helper helper_type; /** * \brief Get the underlying buffer. * \return The underlying buffer. */ boost::asio::mutable_buffer buffer() const; /** * \brief Get the payload buffer. * \return The payload buffer. */ boost::asio::mutable_buffer payload() const; /** * \brief Get a helper. * \param frame_size The frame size. * \return The helper. */ helper_type get_helper(size_t frame_size = sizeof(frame_type)) const; protected: /** * \brief Create a builder. * \param buf The buffer to use. * \param payload_size The size of the payload. */ _base_builder(boost::asio::mutable_buffer buf, size_t payload_size); private: const boost::asio::mutable_buffer m_buf; size_t m_payload_size; }; /** * \brief An frame builder class. */ template class builder : public _base_builder { }; template inline boost::asio::mutable_buffer _base_builder::buffer() const { return m_buf; } template inline boost::asio::mutable_buffer _base_builder::payload() const { return m_buf + (boost::asio::buffer_size(m_buf) - m_payload_size); } template inline typename _base_builder::helper_type _base_builder::get_helper(size_t frame_size) const { return helper_type(m_buf + (boost::asio::buffer_size(m_buf) - m_payload_size - frame_size)); } template inline _base_builder::_base_builder(boost::asio::mutable_buffer buf, size_t payload_size) : m_buf(buf), m_payload_size(payload_size) { } } } #endif /* ASIOTAP_OSI_BUILDER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/checksum.hpp000066400000000000000000000047571252300335000235560ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file checksum.hpp * \author Julien KAUFFMANN * \brief Checksum related functions. */ #ifndef ASIOTAP_OSI_CHECKSUM_HPP #define ASIOTAP_OSI_CHECKSUM_HPP #include #include "osi/checksum_helper.hpp" namespace asiotap { namespace osi { /** * \brief Compute a checksum from the specified buffer. * \param buf The buffer from which to compute a checksum. * \param buf_len The length of buf. * \return The computed checksum. */ uint16_t compute_checksum(const uint16_t* buf, size_t buf_len); inline uint16_t compute_checksum(const uint16_t* buf, size_t buf_len) { checksum_helper helper; helper.update(buf, buf_len); return helper.compute(); } } } #endif /* ASIOTAP_OSI_CHECKSUM_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/checksum_helper.hpp000066400000000000000000000052511252300335000251030ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file checksum_helper.hpp * \author Julien KAUFFMANN * \brief Checksum helper class. */ #ifndef ASIOTAP_OSI_CHECKSUM_HELPER_HPP #define ASIOTAP_OSI_CHECKSUM_HELPER_HPP #include namespace asiotap { namespace osi { /** * \brief A checksum helper class. */ class checksum_helper { public: /** * \brief Create a new checksum helper. */ checksum_helper(); /** * \brief Update the checksum. * \param buf The buffer to compute the checksum from. * \param buf_len The size of buf. */ void update(const uint16_t* buf, size_t buf_len); /** * \brief Compute the checksum. * \return The computed checksum. */ uint32_t compute(); private: uint32_t m_checksum; uint8_t m_left; }; inline checksum_helper::checksum_helper() : m_checksum(0), m_left(0) { } } } #endif /* ASIOTAP_OSI_CHECKSUM_HELPER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/complex_filter.hpp000066400000000000000000000045771252300335000247700ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file complex_filter.hpp * \author Julien KAUFFMANN * \brief An OSI complex filter class. */ #ifndef ASIOTAP_OSI_COMPLEX_FILTER_HPP #define ASIOTAP_OSI_COMPLEX_FILTER_HPP #include "filter.hpp" namespace asiotap { namespace osi { template struct complex_filter { typedef filter::type> type; /**< Filter type. */ }; template <> struct complex_filter { typedef void type; /**< Filter type. */ }; } } #endif /* ASIOTAP_OSI_COMPLEX_FILTER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/dhcp_builder.hpp000066400000000000000000000106151252300335000243660ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file dhcp_builder.hpp * \author Julien KAUFFMANN * \brief A DHCP frame builder class. */ #ifndef ASIOTAP_OSI_DHCP_BUILDER_HPP #define ASIOTAP_OSI_DHCP_BUILDER_HPP #include "builder.hpp" #include "dhcp_frame.hpp" #include "dhcp_option.hpp" #include namespace asiotap { namespace osi { /** * \brief An dhcp frame builder class. */ template <> class builder : public _base_builder { public: /** * \brief Create a builder. * \param buf The buffer to use. * \warning buf will also be used internally to generate the temporary options buffer. That is, its whole content is undefined after calling this constructor. */ builder(boost::asio::mutable_buffer buf); /** * \brief Add an option. * \param tag The option tag. */ void add_option(dhcp_option::dhcp_option_tag tag); /** * \brief Add an option. * \param tag The option tag. * \param value The option value. */ void add_option(dhcp_option::dhcp_option_tag tag, boost::asio::const_buffer value); /** * \brief Add an option. * \param tag The option tag. * \param value The option value. * \param value_size The size of value. */ void add_option(dhcp_option::dhcp_option_tag tag, const void* value, size_t value_size); /** * \brief Add an option. * \param tag The option tag. * \param value The option value. */ void add_option(dhcp_option::dhcp_option_tag tag, uint8_t value); /** * \brief Add padding. * \param cnt The count of padding bytes to add. */ void add_padding(size_t cnt); /** * \brief Complete with padding, if needed. * \param size The minimum size to get to. */ void complete_padding(size_t size); /** * \brief Write the frame. * \return The total size of the written frame, including its payload. */ size_t write() const; private: size_t m_options_offset; }; inline builder::builder(boost::asio::mutable_buffer buf) : _base_builder(buf, 0), m_options_offset(0) { } inline void builder::add_option(dhcp_option::dhcp_option_tag tag, const void* value, size_t value_size) { add_option(tag, boost::asio::buffer(value, value_size)); } inline void builder::add_option(dhcp_option::dhcp_option_tag tag, uint8_t value) { add_option(tag, &value, sizeof(value)); } inline void builder::complete_padding(size_t size) { if (size > m_options_offset) { add_padding(size - m_options_offset); } } } } #endif /* ASIOTAP_DHCP_BUILDER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/dhcp_filter.hpp000066400000000000000000000057051252300335000242310ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file dhcp_filter.hpp * \author Julien KAUFFMANN * \brief A DHCP filter class. */ #pragma once #include "filter.hpp" #include "dhcp_frame.hpp" #include "bootp_helper.hpp" #include "dhcp_helper.hpp" namespace asiotap { namespace osi { /** * \brief The DHCP filter. */ template class filter : public _filter { public: /** * \brief Constructor. * \param _parent The parent filter. */ filter(ParentFilterType& _parent) : _filter(_parent) {} }; /** * \brief The frame parent match function. * \param parent The parent frame. * \return true if the frame matches the parent frame. */ template <> inline bool frame_parent_match(const_helper parent) { return (boost::asio::buffer_size(parent.options()) >= sizeof(DHCP_MAGIC_COOKIE)); } /** * \brief Check if a frame is valid. * \param frame The frame. * \return true on success. */ inline bool check_frame(const_helper frame) { return (frame.magic_cookie() == DHCP_MAGIC_COOKIE) && frame.check_options(); } } } freelan-2.0/libs/asiotap/include/asiotap/osi/dhcp_frame.hpp000066400000000000000000000061771252300335000240420ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file dhcp_frame.hpp * \author Julien KAUFFMANN * \brief A DHCP frame structure. */ #ifndef ASIOTAP_OSI_DHCP_FRAME_HPP #define ASIOTAP_OSI_DHCP_FRAME_HPP #include "frame.hpp" namespace asiotap { namespace osi { #ifdef MSV #pragma pack(push, 1) #endif /** * \brief The DHCP magic cookie. */ const uint32_t DHCP_MAGIC_COOKIE = 0x63825363; /** * \brief The DHCP discover message. */ const uint8_t DHCP_DISCOVER_MESSAGE = 0x01; /** * \brief The DHCP offer message. */ const uint8_t DHCP_OFFER_MESSAGE = 0x02; /** * \brief The DHCP request message. */ const uint8_t DHCP_REQUEST_MESSAGE = 0x03; /** * \brief The DHCP decline message. */ const uint8_t DHCP_DECLINE_MESSAGE = 0x04; /** * \brief The DHCP acknowledgment message. */ const uint8_t DHCP_ACKNOWLEDGMENT_MESSAGE = 0x05; /** * \brief The DHCP negative acknowledgment message. */ const uint8_t DHCP_NEGATIVE_ACKNOWLEDGMENT_MESSAGE = 0x06; /** * \brief The DHCP release message. */ const uint8_t DHCP_RELEASE_MESSAGE = 0x07; /** * \brief The DHCP informational message. */ const uint8_t DHCP_INFORMATIONAL_MESSAGE = 0x08; /** * \brief A DHCP frame structure. */ struct dhcp_frame { uint32_t magic_cookie; /**< The magic cookie. */ } PACKED; #ifdef MSV #pragma pack(pop) #endif } } #endif /* ASIOTAP_OSI_DHCP_FRAME_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/dhcp_helper.hpp000066400000000000000000000156501252300335000242230ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file dhcp_helper.hpp * \author Julien KAUFFMANN * \brief A DHCP helper class. */ #ifndef ASIOTAP_OSI_DHCP_HELPER_HPP #define ASIOTAP_OSI_DHCP_HELPER_HPP #include "helper.hpp" #include "dhcp_frame.hpp" #include "dhcp_option_helper_iterator.hpp" #include namespace asiotap { namespace osi { /** * \brief The base dhcp helper implementation class. */ template class _base_helper_impl : public _base_helper { public: /** * \brief The iterator type. */ typedef dhcp_option_helper_iterator const_iterator; /** * \brief Get the magic cookie. * \return The magic cookie. */ uint32_t magic_cookie() const; /** * \brief Get the options begin iterator. * \return An iterator to the first option. */ const_iterator begin() const; /** * \brief Get the options end iterator. * \return An iterator past the last option. */ const_iterator end() const; /** * \brief Get the options buffer. * \return The options. */ typename _base_helper_impl::buffer_type options() const { return this->buffer() + sizeof(typename _base_helper_impl::frame_type); } /** * \brief Search for the specified option. * \param tag The option tag. * \return An iterator to the option, or end() if no such option is found. */ const_iterator find(dhcp_option::dhcp_option_tag tag) const; /** * \brief Check if all the options are valid. * \return true if all the options are valid, false otherwise. */ bool check_options() const; protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _base_helper_impl(typename _base_helper_impl::buffer_type buf); }; /** * \brief The mutable udp helper implementation class. */ template <> class _helper_impl : public _base_helper_impl { public: /** * \brief Set the magic cookie. * \param magic_cookie The magic cookie. */ void set_magic_cookie(uint32_t magic_cookie) const; protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _helper_impl(_helper_impl::buffer_type buf); }; template inline uint32_t _base_helper_impl::magic_cookie() const { return ntohl(this->frame().magic_cookie); } template inline typename _base_helper_impl::const_iterator _base_helper_impl::begin() const { return const_iterator(options()); } template inline typename _base_helper_impl::const_iterator _base_helper_impl::end() const { return const_iterator(); } template inline _base_helper_impl::_base_helper_impl(typename _base_helper_impl::buffer_type buf) : _base_helper(buf) { } inline void _helper_impl::set_magic_cookie(uint32_t _magic_cookie) const { this->frame().magic_cookie = htonl(_magic_cookie); } inline _helper_impl::_helper_impl(_helper_impl::buffer_type buf) : _base_helper_impl(buf) { } // Boost specializations template inline typename _base_helper_impl::const_iterator range_begin(_base_helper_impl& x) { return x.begin(); } template inline typename _base_helper_impl::const_iterator range_begin(const _base_helper_impl& x) { return x.begin(); } template inline typename _base_helper_impl::const_iterator range_end(_base_helper_impl& x) { return x.end(); } template inline typename _base_helper_impl::const_iterator range_end(const _base_helper_impl& x) { return x.end(); } } } namespace boost { template <> struct range_mutable_iterator > { typedef asiotap::osi::const_helper::const_iterator type; }; template <> struct range_const_iterator > { typedef asiotap::osi::const_helper::const_iterator type; }; template <> struct range_mutable_iterator > { typedef asiotap::osi::mutable_helper::const_iterator type; }; template <> struct range_const_iterator > { typedef asiotap::osi::mutable_helper::const_iterator type; }; } #endif /* ASIOTAP_OSI_DHCP_HELPER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/dhcp_option.hpp000066400000000000000000000223331252300335000242500ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file dhcp_option.hpp * \author Julien KAUFFMANN * \brief A DHCP option class. */ #ifndef ASIOTAP_OSI_DHCP_OPTION_HPP #define ASIOTAP_OSI_DHCP_OPTION_HPP #include namespace asiotap { namespace osi { /** * \brief A DHCP option class. */ class dhcp_option { public: /** * \brief The DHCP option. */ enum dhcp_option_tag { pad = 0x00, subnet_mask = 0x01, time_offset = 0x02, router = 0x03, time_server = 0x04, name_server = 0x05, domain_name_server = 0x06, log_server = 0x07, quote_server = 0x08, lpr_server = 0x09, impress_serve = 0x0a, resource_location_server = 0x0b, host_name = 0x0c, boot_file_size = 0x0d, merit_dump_file = 0x0e, domain_name = 0x0f, swap_server = 0x10, root_path = 0x11, extensions_path = 0x12, ip_forwarding = 0x13, non_local_source_routing = 0x14, policy_filter = 0x15, maximum_datagram_reassembly_size = 0x16, default_ip_ttl = 0x17, path_mtu_aging_timeout = 0x18, path_mtu_plateau_table = 0x19, interface_mtu = 0x1a, all_subnets_are_local = 0x1b, broadcast_address = 0x1c, perform_mask_discovery = 0x1d, mask_supplier = 0x1e, perform_router_discovery = 0x1f, router_solicitation_address = 0x20, static_routing_table = 0x21, trailer_encapsulation = 0x22, arp_cache_timeout = 0x23, ethernet_encapsulation = 0x24, default_tcp_ttl = 0x25, tcp_keepalive_internal = 0x26, tcp_keepalive_garbage = 0x27, network_information_service_domain = 0x28, network_information_service_servers = 0x29, ntp_servers = 0x2a, vendor_specific = 0x2b, netbios_over_tcpip_name_server = 0x2c, netbios_over_tcpip_datagram_distribution_server = 0x2d, netbios_over_tcpip_node_type = 0x2e, netbios_over_tcpip_scope = 0x2f, x_window_system_font_server = 0x30, x_window_system_display_manager = 0x31, requested_ip_address = 0x32, ip_address_lease_time = 0x33, option_overload = 0x34, dhcp_message_type = 0x35, server_identifier = 0x36, parameter_request_list = 0x37, message = 0x38, maximum_dhcp_message_size = 0x39, renew_time_value = 0x3a, rebinding_time_value = 0x3b, class_identifier = 0x3c, client_identifier = 0x3d, netware_ip_domain_name = 0x3e, netware_ip_information = 0x3f, network_information_service_plus_domain = 0x40, network_information_service_plus_servers = 0x41, tftp_server_name = 0x42, bootfile_name = 0x43, mobile_ip_home_agent = 0x44, smtp_server = 0x45, pop_server = 0x46, nntp_server = 0x47, default_www_server = 0x48, default_finger_server = 0x49, default_irc_server = 0x4a, streettalk_server = 0x4b, streettalk_directory_assistance_server = 0x4c, user_clas_information = 0x4d, slp_directory_agent = 0x4e, slp_service_scope = 0x4f, rapid_commit = 0x50, fully_qualified_domain_name = 0x51, relay_agent_information = 0x52, internet_storage_name_service = 0x53, nds_servers = 0x55, nds_tree_name = 0x56, nds_context = 0x57, bcmcs_controller_domain_name_list = 0x58, bcmcs_controller_ipv4_address_list = 0x59, authentication = 0x5a, client_last_transaction_time = 0x5b, associated_ip = 0x5c, client_system_architecture_type = 0x5d, client_network_interface_identifier = 0x5e, ldap = 0x5f, client_machine_identifier = 0x61, open_group_user_authentication = 0x62, geoconf_civic = 0x63, ieee_1003_1_tz_string = 0x64, reference_to_the_tz_database = 0x65, netinfo_parent_server_address = 0x70, netinfo_parent_server_tag = 0x71, url = 0x72, auto_configure = 0x74, name_service_search = 0x75, subnet_selection = 0x76, dns_domain_search_list = 0x77, sip_servers = 0x78, classless_static_route = 0x79, cablelabs_client_configuration = 0x7a, geoconf = 0x7b, vendor_identifying_vendor_class = 0x7c, vendor_identifying_vendor_specific = 0x7d, tftp_server_ip_address = 0x80, call_server_ip_address = 0x81, discrimination_string = 0x82, remote_statistics_server_ip_address = 0x83, _802_1p_vlan_id = 0x84, _802_1q_l2_priority = 0x85, diffserv_code_point = 0x86, http_proxy_for_phone_specific_applications = 0x87, pana_authentication_agent = 0x88, lost_server = 0x89, capwap_access_controller_address = 0x8a, ipv4_address_mos = 0x8b, ipv4_fqdn_mos = 0x8c, sip_ua_configuration_service_domains = 0x8d, ipv4_address_andsf = 0x8e, ipv4_fqdn_andsf = 0x8f, tftp_server_address = 0x96, etherboot = 0xaf, ip_telephone = 0xb0, packet_cable = 0xb1, pxelinux_magic = 0xd0, pxelinux_configfile = 0xd1, pxelinux_pathprefix = 0xd2, pxelinux_reboottime = 0xd3, _6rd = 0xd4, v4_access_domain = 0xd5, subnet_allocation = 0xdc, virtual_subnet_selection = 0xdd, end = 0xff }; /** * \brief Check if the specified DHCP option code has a length. * \param option_tag The DHCP option tag. * \return true if it has a length, false otherwise. */ static bool has_length(dhcp_option_tag option_tag); private: static const uint8_t has_length_map[256]; dhcp_option(); }; inline bool dhcp_option::has_length(dhcp_option::dhcp_option_tag option_tag) { return (has_length_map[static_cast(option_tag)] != 0); } inline dhcp_option::dhcp_option() { } } } #endif /* ASIOTAP_OSI_DHCP_OPTION_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/dhcp_option_helper.hpp000066400000000000000000000207731252300335000256150ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file dhcp_option_helper.hpp * \author Julien KAUFFMANN * \brief A DHCP option helper class. */ #ifndef ASIOTAP_OSI_DHCP_OPTION_HELPER_HPP #define ASIOTAP_OSI_DHCP_OPTION_HELPER_HPP #include "helper.hpp" #include "dhcp_option.hpp" #include #include namespace asiotap { namespace osi { /** * \brief The base DHCP option class. */ template class _base_dhcp_option_helper { public: /** * \brief The buffer type. */ typedef typename helper_buffer::type buffer_type; /** * \brief The option tag type. */ typedef dhcp_option::dhcp_option_tag dhcp_option_tag; /** * \brief Create a new DHCP option helper. * \param buf The buffer to parse and use. */ _base_dhcp_option_helper(buffer_type buf); /** * \brief Get the underlying buffer. * \return The buffer. */ buffer_type buffer() const; /** * \brief Get the option tag. * \return The option tag. */ dhcp_option_tag tag() const; /** * \brief Check if the option tag matches his length. * \return true if the option is valid. */ bool is_valid() const; /** * \brief Check if the option has a length. * \return true if the option has a length. */ bool has_length() const; /** * \brief Get the option length. * \return The option length. * \warning Calling this method when has_length() returns false has undefined behavior. */ size_t length() const; /** * \brief Get the option value. * \return The option value. * \warning Calling this method when has_length() returns false has undefined behavior. */ buffer_type value() const; /** * \brief Get the option value as the specified type. * \return The value. * \warning Calling this method when has_length() returns false has undefined behavior. * \warning If the option value and its length mismatch, a std::logic_error is thrown. */ template const T& value_as() const; /** * \brief Get the total length. * \return The total length of the option, including its tag and length. */ size_t total_length() const; protected: /** * \brief Returns the size of the buffer. * \return buffer size. */ size_t size() const; /** * \brief Returns raw data. * \return raw data. */ const uint8_t* const_data() const; private: /** * \brief Buffer type. */ buffer_type m_buf; }; template class dhcp_option_helper; template <> class dhcp_option_helper : public _base_dhcp_option_helper { public: /** * \brief Create a new DHCP option helper. * \param buf The buffer to parse and use. */ dhcp_option_helper(buffer_type buf); /** * \brief Create a DHCP option helper from a mutable DHCP option helper. * \param helper The helper. */ dhcp_option_helper(const dhcp_option_helper& helper); }; template <> class dhcp_option_helper : public _base_dhcp_option_helper { public: /** * \brief Create a new DHCP option helper. * \param buf The buffer to parse and use. */ dhcp_option_helper(buffer_type buf); /** * \brief Set the tag. * \param tag The option tag. */ void set_tag(dhcp_option_tag tag); /** * \brief Set the length. * \param length The length to set. * \warning Calling this method when has_length() returns false has undefined behavior. */ void set_length(size_t length); private: uint8_t* data() const; }; template inline _base_dhcp_option_helper::_base_dhcp_option_helper(buffer_type buf) : m_buf(buf) { if (size() == 0) { throw std::logic_error("Invalid buffer size"); } } template inline typename _base_dhcp_option_helper::buffer_type _base_dhcp_option_helper::buffer() const { return m_buf; } template inline typename _base_dhcp_option_helper::dhcp_option_tag _base_dhcp_option_helper::tag() const { return static_cast(const_data()[0]); } template inline bool _base_dhcp_option_helper::is_valid() const { return (!dhcp_option::has_length(tag()) || (size() > 1)); } template inline bool _base_dhcp_option_helper::has_length() const { return (size() > 1); } template inline size_t _base_dhcp_option_helper::length() const { return static_cast(const_data()[1]); } template inline typename _base_dhcp_option_helper::buffer_type _base_dhcp_option_helper::value() const { return boost::asio::buffer(buffer() + 2, length()); } template template const T& _base_dhcp_option_helper::value_as() const { if (boost::asio::buffer_size(value()) != sizeof(T)) throw std::logic_error("Value size and type mismatch"); return *boost::asio::buffer_cast(value()); } template inline size_t _base_dhcp_option_helper::total_length() const { if (dhcp_option::has_length(tag()) && has_length()) { return 2 + length(); } else { return 1; } } template inline size_t _base_dhcp_option_helper::size() const { return boost::asio::buffer_size(buffer()); } template inline const uint8_t* _base_dhcp_option_helper::const_data() const { return boost::asio::buffer_cast(buffer()); } inline dhcp_option_helper::dhcp_option_helper(buffer_type buf) : _base_dhcp_option_helper(buf) { } inline dhcp_option_helper::dhcp_option_helper(const dhcp_option_helper& helper) : _base_dhcp_option_helper(helper.buffer()) { } inline dhcp_option_helper::dhcp_option_helper(buffer_type buf) : _base_dhcp_option_helper(buf) { } inline void dhcp_option_helper::set_tag(dhcp_option_tag _tag) { data()[0] = static_cast(_tag); } inline void dhcp_option_helper::set_length(size_t _length) { data()[1] = static_cast(_length); } inline uint8_t* dhcp_option_helper::data() const { return boost::asio::buffer_cast(buffer()); } } } #endif /* ASIOTAP_OSI_DHCP_OPTION_HELPER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/dhcp_option_helper_iterator.hpp000066400000000000000000000140151252300335000275160ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file dhcp_option_helper_iterator.hpp * \author Julien KAUFFMANN * \brief A DHCP option helper iterator class. */ #ifndef ASIOTAP_OSI_DHCP_OPTION_HELPER_ITERATOR_HPP #define ASIOTAP_OSI_DHCP_OPTION_HELPER_ITERATOR_HPP #include "dhcp_option_helper.hpp" #include #include namespace asiotap { namespace osi { struct dhcp_frame; template class dhcp_option_helper_iterator; /** * \brief Compare two iterators. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two arguments represent the same iterator. */ template bool operator==(const dhcp_option_helper_iterator& lhs, const dhcp_option_helper_iterator& rhs); /** * \brief Compare two iterators. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two arguments represent different iterators. */ template bool operator!=(const dhcp_option_helper_iterator& lhs, const dhcp_option_helper_iterator& rhs); /** * \brief The DHCP option helper iterator class. */ template class dhcp_option_helper_iterator : public std::iterator > { public: /** * \brief The helper type. */ typedef dhcp_option_helper helper_type; /** * \brief Create an empty iterator. */ dhcp_option_helper_iterator() {} /** * \brief Dereference operator. * \return The value. */ typename dhcp_option_helper_iterator::reference operator*(); /** * \brief Dereference operator. * \return The value. */ typename dhcp_option_helper_iterator::pointer operator->(); /** * \brief Increment the iterator. * \return A reference to this. */ dhcp_option_helper_iterator& operator++(); /** * \brief Increment the iterator. * \return The old value. */ dhcp_option_helper_iterator operator++(int); private: /** * \brief The buffer type. */ typedef typename helper_buffer::type buffer_type; dhcp_option_helper_iterator(buffer_type); boost::optional m_helper; friend bool operator==(const dhcp_option_helper_iterator& lhs, const dhcp_option_helper_iterator& rhs) { if (lhs.m_helper) { return rhs.m_helper && (boost::asio::buffer_cast(lhs.m_helper->buffer()) == boost::asio::buffer_cast(rhs.m_helper->buffer())) && (boost::asio::buffer_size(lhs.m_helper->buffer()) == boost::asio::buffer_size(rhs.m_helper->buffer())) ; } else { return (!rhs.m_helper); } } friend bool operator!=(const dhcp_option_helper_iterator& lhs, const dhcp_option_helper_iterator& rhs) { return !(lhs == rhs); } friend class _base_helper_impl; }; template inline typename dhcp_option_helper_iterator::reference dhcp_option_helper_iterator::operator*() { return *m_helper; } template inline typename dhcp_option_helper_iterator::pointer dhcp_option_helper_iterator::operator->() { return &*m_helper; } template inline dhcp_option_helper_iterator& dhcp_option_helper_iterator::operator++() { const buffer_type new_buffer = m_helper->buffer() + m_helper->total_length(); if (boost::asio::buffer_size(new_buffer) > 0) { m_helper = helper_type(new_buffer); } else { m_helper = boost::optional(); } return *this; } template inline dhcp_option_helper_iterator dhcp_option_helper_iterator::operator++(int) { dhcp_option_helper_iterator value = *this; ++*this; return value; } template inline dhcp_option_helper_iterator::dhcp_option_helper_iterator(buffer_type buf) : m_helper(boost::asio::buffer_size(buf) > 0 ? helper_type(buf) : boost::optional()) { } } } #endif /* ASIOTAP_OSI_DHCP_OPTION_HELPER_ITERATOR_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/dhcp_proxy.hpp000066400000000000000000000154371252300335000241300ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file dhcp_proxy.hpp * \author Julien KAUFFMANN * \brief An DHCP proxy class. */ #ifndef ASIOTAP_OSI_DHCP_PROXY_HPP #define ASIOTAP_OSI_DHCP_PROXY_HPP #include "proxy.hpp" #include "ethernet_filter.hpp" #include "ipv4_filter.hpp" #include "udp_filter.hpp" #include "bootp_filter.hpp" #include "dhcp_filter.hpp" #include "complex_filter.hpp" #include #include #include #include namespace asiotap { namespace osi { /** * \brief An DHCP proxy class. */ template <> class proxy : public _base_proxy { public: /** * \brief The default lease time. */ static const boost::posix_time::time_duration DEFAULT_LEASE_TIME; /** * \brief The Ethernet address type. */ typedef boost::array ethernet_address_type; /** * \brief An IPv4 address netmask type. */ struct ipv4_address_netmask_type { boost::asio::ip::address_v4 address; /**< The IPv4 address. */ unsigned int prefix_length; /**< The IPv4 netmask length. */ }; /** * \brief The entry type. */ typedef std::pair entry_type; /** * \brief Create an DHCP proxy. */ proxy() : m_lease_time(DEFAULT_LEASE_TIME) { } /** * \brief Set the hardware address. * \param hardware_address The hardware address. */ void set_hardware_address(const ethernet_address_type& hardware_address); /** * \brief Set the software address. * \param software_address The software address. */ void set_software_address(const boost::asio::ip::address_v4& software_address); /** * \brief Set the lease time. * \param lease_time The lease time. */ void set_lease_time(boost::posix_time::time_duration lease_time); /** * \brief Add a proxy entry. * \param entry The entry to add. * \return If an entry for the specified logical address already exists, nothing is done and the call returns false. Otherwise, the call returns true. */ bool add_entry(const entry_type& entry); /** * \brief Add a proxy entry. * \param hardware_address The hardware address. * \param logical_address The logical address. * \param logical_prefix_length The prefix length. * \return If an entry for the specified logical address already exists, nothing is done and the call returns false. Otherwise, the call returns true. */ bool add_entry(const ethernet_address_type& hardware_address, const boost::asio::ip::address_v4& logical_address, unsigned int logical_prefix_length); /** * \brief Delete a proxy entry. * \param hardware_address The hardware address. * \return If an entry was deleted, true is returned. Otherwise, the call returns false. */ bool remove_entry(const ethernet_address_type& hardware_address); /** * \brief Process a frame. * \param ethernet_helper The ethernet layer. * \param ipv4_helper The IPv4 layer. * \param udp_helper The UDP layer. * \param bootp_helper The BOOTP layer. * \param dhcp_helper The DHCP layer. * \param response_buffer The buffer to write the response to. * \return The buffer that contains the answer, if there is one. */ boost::optional process_frame(const_helper ethernet_helper, const_helper ipv4_helper, const_helper udp_helper, const_helper bootp_helper, const_helper dhcp_helper, boost::asio::mutable_buffer response_buffer) const; private: typedef std::map entry_map_type; ethernet_address_type m_hardware_address; boost::asio::ip::address_v4 m_software_address; boost::posix_time::time_duration m_lease_time; entry_map_type m_entry_map; }; inline void proxy::set_hardware_address(const ethernet_address_type& hardware_address) { m_hardware_address = hardware_address; } inline void proxy::set_software_address(const boost::asio::ip::address_v4& software_address) { m_software_address = software_address; } inline void proxy::set_lease_time(boost::posix_time::time_duration lease_time) { m_lease_time = lease_time; } inline bool proxy::add_entry(const entry_type& entry) { return m_entry_map.insert(entry).second; } inline bool proxy::add_entry(const ethernet_address_type& hardware_address, const boost::asio::ip::address_v4& logical_address, unsigned int logical_prefix_length) { ipv4_address_netmask_type ipv4_address_netmask = { logical_address, logical_prefix_length }; return add_entry(std::make_pair(hardware_address, ipv4_address_netmask)); } inline bool proxy::remove_entry(const ethernet_address_type& hardware_address) { return (m_entry_map.erase(hardware_address) > 0); } } } #endif /* ASIOTAP_DHCP_PROXY_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/ethernet_address.hpp000066400000000000000000000135261252300335000252710ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ethernet_address.hpp * \author Julien KAUFFMANN * \brief An Ethernet address class. */ #ifndef ASIOTAP_OSI_ETHERNET_ADDRESS_HPP #define ASIOTAP_OSI_ETHERNET_ADDRESS_HPP #include "ethernet_frame.hpp" #include #include namespace asiotap { namespace osi { /** * \brief An ethernet address class. */ class ethernet_address { public: /** * \brief The underlying data type. */ typedef boost::array data_type; /** * \brief Get a null address. * \return A null address. */ static ethernet_address null() { const data_type data = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }; return ethernet_address(data); } /** * \brief Get a broadcast address. * \return A broadcast address, that is: ff:ff:ff:ff:ff:ff. */ static ethernet_address broadcast() { const data_type data = { { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } }; return ethernet_address(data); } /** * \brief Creates a default initialized ethernet_address. */ ethernet_address() {} /** * \brief Create an address from its bytes. * \param _data The data. */ ethernet_address(const data_type& _data) : m_data(_data) {} /** * \brief Get the associated data. * \return The associated data. */ const data_type& data() const { return m_data; } /** * \brief Get the associated data. * \return The associated data. */ data_type& data() { return m_data; } private: data_type m_data; }; /** * \brief Compare two ethernet addresses. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two addresses are equal. */ inline bool operator==(const ethernet_address& lhs, const ethernet_address& rhs) { return lhs.data() == rhs.data(); } /** * \brief Compare two ethernet addresses. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two addresses are different. */ inline bool operator!=(const ethernet_address& lhs, const ethernet_address& rhs) { return lhs.data() != rhs.data(); } /** * \brief Compare two ethernet addresses. * \param lhs The left argument. * \param rhs The right argument. * \return true if lhs compare lexicographically smaller to rhs. */ inline bool operator<(const ethernet_address& lhs, const ethernet_address& rhs) { return lhs.data() < rhs.data(); } /** * \brief Compare two ethernet addresses. * \param lhs The left argument. * \param rhs The right argument. * \return true if lhs compare lexicographically larger to rhs. */ inline bool operator>(const ethernet_address& lhs, const ethernet_address& rhs) { return lhs.data() > rhs.data(); } /** * \brief Compare two ethernet addresses. * \param lhs The left argument. * \param rhs The right argument. * \return true if lhs compare lexicographically smaller or equal to rhs. */ inline bool operator<=(const ethernet_address& lhs, const ethernet_address& rhs) { return lhs.data() <= rhs.data(); } /** * \brief Compare two ethernet addresses. * \param lhs The left argument. * \param rhs The right argument. * \return true if lhs compare lexicographically larger or equal to rhs. */ inline bool operator>=(const ethernet_address& lhs, const ethernet_address& rhs) { return lhs.data() >= rhs.data(); } /** * \brief Output an ethernet address to a stream. * \param os The output stream. * \param value The value. * \return os. */ std::ostream& operator<<(std::ostream& os, const ethernet_address& value); /** * \brief Input an ethernet address from a stream. * \param is The output stream. * \param value The value. * \return s. * * The ethernet address is expected to be in one of the following formats: * * - ab:cd:ef:01:23:45 * - ab-cd-ef-01-23-45 */ std::istream& operator>>(std::istream& is, ethernet_address& value); } } #endif /* ASIOTAP_ETHERNET_ADDRESS_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/ethernet_builder.hpp000066400000000000000000000057541252300335000252760ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ethernet_builder.hpp * \author Julien KAUFFMANN * \brief An Ethernet frame builder class. */ #ifndef ASIOTAP_OSI_ETHERNET_BUILDER_HPP #define ASIOTAP_OSI_ETHERNET_BUILDER_HPP #include "builder.hpp" #include "ethernet_frame.hpp" namespace asiotap { namespace osi { /** * \brief An Ethernet frame builder class. */ template <> class builder : public _base_builder { public: /** * \brief Create a builder. * \param buf The buffer to use. * \param payload_size The size of the payload. */ builder(boost::asio::mutable_buffer buf, size_t payload_size); /** * \brief Write the frame. * \param target The target Ethernet address. * \param sender The sender Ethernet address. * \param protocol The protocol. * \return The total size of the written frame, including its payload. */ size_t write( boost::asio::const_buffer target, boost::asio::const_buffer sender, uint16_t protocol ) const; }; inline builder::builder(boost::asio::mutable_buffer buf, size_t payload_size) : _base_builder(buf, payload_size) { } } } #endif /* ASIOTAP_ETHERNET_BUILDER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/ethernet_filter.hpp000066400000000000000000000041671252300335000251320ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ethernet_filter.hpp * \author Julien KAUFFMANN * \brief An Ethernet filter class. */ #pragma once #include "filter.hpp" #include "ethernet_frame.hpp" #include "ethernet_helper.hpp" namespace asiotap { namespace osi { /** * \brief The Ethernet filter. */ template <> class filter : public _filter { }; } } freelan-2.0/libs/asiotap/include/asiotap/osi/ethernet_frame.hpp000066400000000000000000000047651252300335000247430ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ethernet_frame.hpp * \author Julien KAUFFMANN * \brief An Ethernet frame structure. */ #ifndef ASIOTAP_OSI_ETHERNET_FRAME_HPP #define ASIOTAP_OSI_ETHERNET_FRAME_HPP #include "frame.hpp" namespace asiotap { namespace osi { /** * \brief The size of an ethernet address. */ const size_t ETHERNET_ADDRESS_SIZE = 6; #ifdef MSV #pragma pack(push, 1) #endif /** * \brief An Ethernet frame structure. */ struct ethernet_frame { uint8_t target[ETHERNET_ADDRESS_SIZE]; /**< The destination MAC address. */ uint8_t sender[ETHERNET_ADDRESS_SIZE]; /**< The source MAC address. */ uint16_t protocol; /**< The protocol. */ } PACKED; #ifdef MSV #pragma pack(pop) #endif } } #endif /* ASIOTAP_ETHERNET_FRAME_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/ethernet_helper.hpp000066400000000000000000000110211252300335000251070ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ethernet_helper.hpp * \author Julien KAUFFMANN * \brief An Ethernet helper class. */ #ifndef ASIOTAP_OSI_ETHERNET_HELPER_HPP #define ASIOTAP_OSI_ETHERNET_HELPER_HPP #include "helper.hpp" #include "ethernet_frame.hpp" namespace asiotap { namespace osi { /** * \brief The base Ethernet helper implementation class. */ template class _base_helper_impl : public _base_helper { public: /** * \brief Get the target. * \return The target. */ typename _base_helper_impl::buffer_type target() const { return boost::asio::buffer(this->frame().target, sizeof(this->frame().target)); } /** * \brief Get the sender. * \return The sender. */ typename _base_helper_impl::buffer_type sender() const { return boost::asio::buffer(this->frame().sender, sizeof(this->frame().sender)); } /** * \brief Get the protocol. * \return The protocol. */ uint16_t protocol() const; /** * \brief Get the payload buffer. * \return The payload. */ typename _base_helper_impl::buffer_type payload() const { return this->buffer() + sizeof(ethernet_frame); } protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _base_helper_impl(typename _base_helper_impl::buffer_type buf); }; /** * \brief The mutable Ethernet helper implementation class. */ template <> class _helper_impl : public _base_helper_impl { public: /** * \brief Set the protocol. * \param protocol The protocol. */ void set_protocol(uint16_t protocol) const; protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _helper_impl(_helper_impl::buffer_type buf); }; template inline uint16_t _base_helper_impl::protocol() const { return ntohs(this->frame().protocol); } template inline _base_helper_impl::_base_helper_impl(typename _base_helper_impl::buffer_type buf) : _base_helper(buf) { } inline void _helper_impl::set_protocol(uint16_t _protocol) const { this->frame().protocol = htons(_protocol); } inline _helper_impl::_helper_impl(_helper_impl::buffer_type buf) : _base_helper_impl(buf) { } } } #endif /* ASIOTAP_OSI_ETHERNET_HELPER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/filter.hpp000066400000000000000000000324011252300335000232240ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file filter.hpp * \author Julien KAUFFMANN * \brief An OSI filter class. */ #ifndef ASIOTAP_OSI_FILTER_HPP #define ASIOTAP_OSI_FILTER_HPP #include "helper.hpp" #include #include #include #include #include #include namespace asiotap { namespace osi { /** * \brief The base template function to check for frame encapsulation. * \param parent The parent frame. * \return true if the parent frame should contain a frame of the specified type. */ template bool frame_parent_match(const_helper parent); /** * \brief The base template function to check for frame encapsulation. * \param parent The parent frame. * \return true if the parent frame should contain a frame of the specified type. */ template inline bool frame_parent_match(mutable_helper parent) { return frame_parent_match(const_helper(parent)); } /** * \brief A base filter class. */ template class _base_filter { public: /** * \brief The frame type. */ typedef OSIFrameType frame_type; /** * \brief The frame filter callback. */ typedef boost::function)> frame_filter_callback; /** * \brief The frame handler callback. */ typedef boost::function)> frame_handler_callback; /** * \brief The frame const handler callback. */ typedef boost::function)> frame_const_handler_callback; /** * \brief Add a filter function. * \param callback The filter function to add. */ void add_filter(frame_filter_callback callback) { m_filters.push_back(callback); } /** * \brief Add a handler function. * \param callback The handler function to add. */ void add_handler(frame_handler_callback callback) { m_handlers.push_back(callback); } /** * \brief Add a const handler function. * \param callback The const handler function to add. */ void add_const_handler(frame_const_handler_callback callback) { m_const_handlers.push_back(callback); } /** * \brief Get the last helper. * \return The last helper, if any. */ boost::optional > get_last_helper() const { return m_last_helper; } /** * \brief Get the last const helper. * \return The last const helper, if any. */ boost::optional > get_last_const_helper() const { return m_last_const_helper; } /** * \brief Clear the last helper. */ void clear_last_helper() const { m_last_helper = boost::none; m_last_const_helper = boost::none; } protected: /** * \brief Do the parsing. * \param buf buffer to parse. */ void do_parse(boost::asio::const_buffer buf) const; /** * \brief Do the parsing. * \param buf buffer to parse. */ void do_parse(boost::asio::mutable_buffer buf) const; /** * \brief Check if the frame has to be handled. * \param helper frame type helper. * \return true if the frame type belongs to the filter. */ bool filter_frame(const_helper helper) const { for (auto&& filter : m_filters) { if (!filter(helper)) { return false; } } return true; } /** * \brief Handle the frame by the filter functions. * \param helper frame type helper. */ void frame_handled(const_helper helper) const { m_last_const_helper = helper; for (auto&& handler : m_const_handlers) { handler(*m_last_const_helper); } } /** * \brief Handle the frame by the filter functions. * \param helper frame type helper. */ void frame_handled(mutable_helper helper) const { m_last_helper = helper; for (auto&& handler : m_handlers) { handler(*m_last_helper); } } private: std::vector m_filters; std::vector m_handlers; std::vector m_const_handlers; mutable boost::optional > m_last_helper; mutable boost::optional > m_last_const_helper; }; /** * \brief A generic filter class. */ template class _filter : public _base_filter { public: /** * \brief The frame bridge filter callback. */ typedef boost::function, const_helper)> frame_bridge_filter_callback; /** * \brief Constructor. * \param parent The parent filter. */ _filter(ParentFilterType& parent); /** * \brief Get the parent filter. * \return The parent filter. */ ParentFilterType& parent() const; /** * \brief Add a bridge filter function. * \param callback The bridge filter function to add. */ void add_bridge_filter(frame_bridge_filter_callback callback); /** * \brief Parse a frame. * \param parent The parent frame. */ void parse(const_helper parent) const; /** * \brief Parse a frame. * \param parent The parent frame. */ void parse(mutable_helper parent) const; protected: bool bridge_filter_frame(const_helper parent_helper, const_helper helper) const { for (auto&& bridge_filter : m_bridge_filters) { if (!bridge_filter(parent_helper, helper)) { return false; } } return true; } private: ParentFilterType& m_parent; std::vector m_bridge_filters; }; /** * \brief A generic filter class. */ template class _filter : public _base_filter { public: /** * \brief Parse the specified buffer. * \param buf The buffer to parse. */ void parse(boost::asio::const_buffer buf) const; /** * \brief Parse the specified buffer. * \param buf The buffer to parse. */ void parse(boost::asio::mutable_buffer buf) const; }; /** * \brief A generic filter class. */ template class filter; /** * \brief Check if a frame is valid. * \param frame The frame. * \return true on success. */ template inline bool check_frame(const_helper frame) { static_cast(frame); return true; } /** * \brief Check if a frame is valid. * \param frame The frame. * \return true on success. */ template inline bool check_frame(mutable_helper frame) { return check_frame(const_helper(frame)); } template inline void _base_filter::do_parse(boost::asio::const_buffer buf) const { try { const_helper helper(buf); if (check_frame(helper)) { if (_base_filter::filter_frame(helper)) { _base_filter::frame_handled(helper); } } } catch (std::logic_error&) { } } template inline void _base_filter::do_parse(boost::asio::mutable_buffer buf) const { try { mutable_helper helper(buf); if (check_frame(helper)) { if (_base_filter::filter_frame(helper)) { _base_filter::frame_handled(helper); } } } catch (std::logic_error&) { } } template inline _filter::_filter(ParentFilterType& _parent) : m_parent(_parent) { typedef _filter filter_type; typedef typename ParentFilterType::frame_type frame_type; const auto mutable_parse = static_cast) const>(&filter_type::parse); const auto const_parse = static_cast) const>(&filter_type::parse); m_parent.add_handler(boost::bind(mutable_parse, this, _1)); m_parent.add_const_handler(boost::bind(const_parse, this, _1)); #if 0 // The previous lines could be simplified using lambdas, like // below. But there is a compiler bug in gcc 4.7 which makes this // impossible. And we have to support it to be able to backport on // Debian wheezy. m_parent.add_handler([this](mutable_helper helper) { parse(helper); }); m_parent.add_const_handler([this](const_helper helper) { parse(helper); }); #endif } template inline ParentFilterType& _filter::parent() const { return m_parent; } template inline void _filter::add_bridge_filter(frame_bridge_filter_callback callback) { m_bridge_filters.push_back(callback); } template inline void _filter::parse(const_helper parent_helper) const { _base_filter::clear_last_helper(); if (frame_parent_match(parent_helper)) { try { const_helper helper(parent_helper.payload()); if (check_frame(helper)) { if (_base_filter::filter_frame(helper)) { if (bridge_filter_frame(parent_helper, helper)) { _base_filter::frame_handled(helper); } } } } catch (std::logic_error&) { } } } template inline void _filter::parse(mutable_helper parent_helper) const { _base_filter::clear_last_helper(); if (frame_parent_match(parent_helper)) { try { mutable_helper helper(parent_helper.payload()); if (check_frame(helper)) { if (_base_filter::filter_frame(helper)) { if (bridge_filter_frame(parent_helper, helper)) { _base_filter::frame_handled(helper); } } } } catch (std::logic_error&) { } } } template inline void _filter::parse(boost::asio::const_buffer buf) const { _base_filter::clear_last_helper(); _base_filter::do_parse(buf); } template inline void _filter::parse(boost::asio::mutable_buffer buf) const { _base_filter::clear_last_helper(); _base_filter::do_parse(buf); } } } #endif /* ASIOTAP_OSI_FILTER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/frame.hpp000066400000000000000000000046331252300335000230370ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file frame.hpp * \author Julien KAUFFMANN * \brief An osi frame structure. */ #ifndef ASIOTAP_OSI_FRAME_HPP #define ASIOTAP_OSI_FRAME_HPP #include #include "../os.hpp" /** * \def PACKED * \brief A "packed" C-structure has the minimal space in memory without take care of memory alignment. * * This is useful for network-related messages. * * \note GCC only. For Microsoft Visual C++ use: * \code * #pragma pack(push, 1) * struct my_struct * { * char a; * int b; * }; * #pragma pack(pop) * \endcode */ #ifdef MSV #define PACKED #else #define PACKED __attribute__((packed)) #endif #endif /* ASIOTAP_OSI_FRAME_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/helper.hpp000066400000000000000000000226751252300335000232320ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file helper.hpp * \author Julien KAUFFMANN * \brief An OSI helper class. */ #ifndef ASIOTAP_OSI_HELPER_HPP #define ASIOTAP_OSI_HELPER_HPP #include namespace asiotap { namespace osi { /** * \brief The const helper tag. */ class const_helper_tag; /** * \brief The mutable helper tag. */ class mutable_helper_tag; /** * \brief The helper buffer type. */ template struct helper_buffer; /** * \brief The const helper buffer type. */ template <> struct helper_buffer { /** * \brief The buffer type. */ typedef boost::asio::const_buffer type; }; /** * \brief The mutable helper buffer type. */ template <> struct helper_buffer { /** * \brief The buffer type. */ typedef boost::asio::mutable_buffer type; }; /** * \brief A base helper class. */ template class _generic_base_helper { public: /** * \brief The helper tag. */ typedef HelperTag helper_tag; /** * \brief The buffer type. */ typedef typename helper_buffer::type buffer_type; /** * \brief The frame type. */ typedef OSIFrameType frame_type; /** * \brief Get the underlying buffer. * \return The underlying buffer. */ buffer_type buffer() const; protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _generic_base_helper(buffer_type buf); private: buffer_type m_buf; }; /** * \brief A base helper class. */ template class _base_helper; /** * \brief A base const helper class. */ template class _base_helper : public _generic_base_helper { public: /** * \brief Get the associated frame. * \return The associated frame. */ const OSIFrameType& frame() const; protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _base_helper(typename _base_helper::buffer_type buf); }; /** * \brief A base mutable helper class. */ template class _base_helper : public _generic_base_helper { public: /** * \brief Get the associated frame. * \return The associated frame. */ OSIFrameType& frame() const; protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _base_helper(typename _base_helper::buffer_type buf); }; /** * \brief The base implementation type for helpers. */ template class _base_helper_impl; /** * \brief The implementation type for helpers. */ template class _helper_impl : public _base_helper_impl { protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _helper_impl(typename _helper_impl::buffer_type buf); }; /** * \brief A const helper class. */ template class const_helper : public _helper_impl { public: /** * \brief The constructor. * \param buf The buffer to refer to. */ const_helper(boost::asio::const_buffer buf); /** * \brief Convert to the referenced type. * \return The referenced type. */ operator const OSIFrameType&() const; }; /** * \brief A mutable helper class. */ template class mutable_helper : public _helper_impl { public: /** * \brief The constructor. * \param buf The buffer to refer to. */ mutable_helper(boost::asio::mutable_buffer buf); /** * \brief Convert to a const_helper. * \return A const_helper. */ operator const_helper() const; /** * \brief Convert to the referenced type. * \return The referenced type. */ operator OSIFrameType&() const; }; /** * \brief Create a helper from a buffer. * \param buf The buffer. * \return The helper. */ template const_helper helper(boost::asio::const_buffer buf); /** * \brief Create a helper from a buffer. * \param buf The buffer. * \return The helper. */ template mutable_helper helper(boost::asio::mutable_buffer buf); template inline typename _generic_base_helper::buffer_type _generic_base_helper::buffer() const { return m_buf; } template inline _generic_base_helper::_generic_base_helper(buffer_type buf) : m_buf(buf) { if (boost::asio::buffer_size(buf) < sizeof(OSIFrameType)) { throw std::length_error("buf"); } } template inline const OSIFrameType& _base_helper::frame() const { return *boost::asio::buffer_cast(_base_helper::buffer()); } template inline _base_helper::_base_helper(typename _base_helper::buffer_type buf) : _generic_base_helper(buf) { } template inline OSIFrameType& _base_helper::frame() const { return *boost::asio::buffer_cast(_base_helper::buffer()); } template inline _base_helper::_base_helper(typename _base_helper::buffer_type buf) : _generic_base_helper(buf) { } template inline _helper_impl::_helper_impl(typename _helper_impl::buffer_type buf) : _base_helper_impl(buf) { } template inline const_helper::const_helper(boost::asio::const_buffer buf) : _helper_impl(buf) { } template inline const_helper::operator const OSIFrameType&() const { return const_helper::frame(); } template inline mutable_helper::mutable_helper(boost::asio::mutable_buffer buf) : _helper_impl(buf) { } template inline mutable_helper::operator const_helper() const { return const_helper(mutable_helper::buffer()); } template inline mutable_helper::operator OSIFrameType&() const { return mutable_helper::frame(); } template inline const_helper helper(boost::asio::const_buffer buf) { return const_helper(buf); } template inline mutable_helper helper(boost::asio::mutable_buffer buf) { return mutable_helper(buf); } } } #endif /* ASIOTAP_OSI_HELPER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/icmp_builder.hpp000066400000000000000000000056371252300335000244100ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file icmp_builder.hpp * \author Julien KAUFFMANN * \brief An ICMP frame builder class. */ #ifndef ASIOTAP_OSI_ICMP_BUILDER_HPP #define ASIOTAP_OSI_ICMP_BUILDER_HPP #include "builder.hpp" #include "icmp_frame.hpp" #include namespace asiotap { namespace osi { /** * \brief An icmp frame builder class. */ template <> class builder : public _base_builder { public: /** * \brief Create a builder. * \param buf The buffer to use. * \param payload_size The size of the payload. */ builder(boost::asio::mutable_buffer buf, size_t payload_size); /** * \brief Write the frame. * \param type The type of the icmp message. * \param code The error code, if any. * \param data The data. * \return The total size of the written frame, including its payload. */ size_t write( uint8_t type, uint8_t code, uint32_t data ) const; }; inline builder::builder(boost::asio::mutable_buffer buf, size_t payload_size) : _base_builder(buf, payload_size) { } } } #endif /* ASIOTAP_ICMP_BUILDER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/icmp_filter.hpp000066400000000000000000000074551252300335000242470ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file icmp_filter.hpp * \author Julien KAUFFMANN * \brief An ICMP filter class. */ #pragma once #include "filter.hpp" #include "icmp_frame.hpp" #include "ipv4_helper.hpp" #include "ipv6_helper.hpp" #include "icmp_helper.hpp" namespace asiotap { namespace osi { /** * \brief The ICMP filter. */ template class filter : public _filter { public: /** * \brief An ICMP checksum filter. * \param helper The current frame. * \return true if the ICMP checksum is correct. */ static bool checksum_filter(const_helper helper) { return helper.verify_checksum(); } /** * \brief Constructor. * \param parent The parent filter. */ filter(ParentFilterType& parent); /** * \brief Add the checksum filter. */ void add_checksum_filter(); }; /** * \brief The frame parent match function. * \param parent The parent frame. * \return true if the frame matches the parent frame. */ template <> bool frame_parent_match(const_helper parent); /** * \brief The frame parent match function. * \param parent The parent frame. * \return true if the frame matches the parent frame. */ template <> bool frame_parent_match(const_helper parent); template inline filter::filter(ParentFilterType& _parent) : _filter(_parent) { } template inline void filter::add_checksum_filter() { this->add_filter(checksum_filter); } template <> inline bool frame_parent_match(const_helper parent) { return ((parent.protocol() == ICMP_PROTOCOL) && (parent.tos() == 0)); } template <> inline bool frame_parent_match(const_helper parent) { //TODO: Implement this (void)parent; return false; } } } freelan-2.0/libs/asiotap/include/asiotap/osi/icmp_frame.hpp000066400000000000000000000051611252300335000240440ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file icmp_frame.hpp * \author Julien KAUFFMANN * \brief An ICMP frame structure. */ #ifndef ASIOTAP_OSI_ICMP_FRAME_HPP #define ASIOTAP_OSI_ICMP_FRAME_HPP #include "frame.hpp" namespace asiotap { namespace osi { #ifdef MSV #pragma pack(push, 1) #endif /** * \brief The ICMP protocol. */ const uint8_t ICMP_PROTOCOL = 0x01; /** * \brief The ICMP echo reply message type. */ const uint8_t ICMP_ECHO_REPLY = 0x00; /** * \brief The ICMP echo request message type. */ const uint8_t ICMP_ECHO_REQUEST = 0x08; /** * \brief An ICMP frame structure. */ struct icmp_frame { uint8_t type; /**< ICMP message type. */ uint8_t code; /**< Error code. */ uint16_t checksum; /**< The checksum. */ uint32_t data; /**< The data. */ } PACKED; #ifdef MSV #pragma pack(pop) #endif } } #endif /* ASIOTAP_OSI_ICMP_FRAME_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/icmp_helper.hpp000066400000000000000000000137251252300335000242360ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file icmp_helper.hpp * \author Julien KAUFFMANN * \brief An ICMP helper class. */ #ifndef ASIOTAP_OSI_ICMP_HELPER_HPP #define ASIOTAP_OSI_ICMP_HELPER_HPP #include "helper.hpp" #include "icmp_frame.hpp" #include "ipv4_helper.hpp" #include "ipv6_helper.hpp" namespace asiotap { namespace osi { /** * \brief The base icmp helper implementation class. */ template class _base_helper_impl : public _base_helper { public: /** * \brief Get the message type. * \return The message type. */ uint8_t type() const; /** * \brief Get the error code. * \return The error code. */ uint8_t code() const; /** * \brief Get the checksum. * \return The checksum. */ uint16_t checksum() const; /** * \brief Get the data. * \return The data. */ uint32_t data() const; /** * \brief Get the payload buffer. * \return The payload. */ typename _base_helper_impl::buffer_type payload() const { return this->buffer() + sizeof(typename _base_helper_impl::frame_type); } /** * \brief Compute the checksum. * \return The checksum. */ uint16_t compute_checksum() const; /** * \brief Verify the checksum. * \return true if the checksum is valid. */ bool verify_checksum() const; protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _base_helper_impl(typename _base_helper_impl::buffer_type buf); }; /** * \brief The mutable icmp helper implementation class. */ template <> class _helper_impl : public _base_helper_impl { public: /** * \brief Set the message type. * \param type The message type. */ void set_type(uint8_t type) const; /** * \brief Set the error code. * \param code The error code. */ void set_code(uint8_t code) const; /** * \brief Set the checksum. * \param checksum The checksum. */ void set_checksum(uint16_t checksum) const; /** * \brief Set the data. * \param data The data. */ void set_data(uint32_t data) const; protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _helper_impl(_helper_impl::buffer_type buf); }; template inline uint8_t _base_helper_impl::type() const { return this->frame().type; } template inline uint8_t _base_helper_impl::code() const { return this->frame().code; } template inline uint16_t _base_helper_impl::checksum() const { return this->frame().checksum; } template inline uint32_t _base_helper_impl::data() const { return ntohl(this->frame().data); } template inline bool _base_helper_impl::verify_checksum() const { return this->compute_checksum() == 0x0000; } template inline _base_helper_impl::_base_helper_impl(typename _base_helper_impl::buffer_type buf) : _base_helper(buf) { } inline void _helper_impl::set_type(uint8_t _type) const { this->frame().type = _type; } inline void _helper_impl::set_code(uint8_t _code) const { this->frame().code = _code; } inline void _helper_impl::set_checksum(uint16_t _checksum) const { this->frame().checksum = _checksum; } inline void _helper_impl::set_data(uint32_t _data) const { this->frame().data = htonl(_data); } inline _helper_impl::_helper_impl(_helper_impl::buffer_type buf) : _base_helper_impl(buf) { } } } #endif /* ASIOTAP_OSI_ICMP_HELPER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/icmpv6_builder.hpp000066400000000000000000000061651252300335000246610ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ipv6_builder.hpp * \author Julien KAUFFMANN * \brief An IPV6 frame builder class. */ #pragma once #include "builder.hpp" #include "icmpv6_frame.hpp" #include "ipv6_helper.hpp" #include namespace asiotap { namespace osi { /** * \brief An ipv4 frame builder class. */ template <> class builder : public _base_builder { public: /** * \brief Create a builder. * \param buf The buffer to use. * \param payload_size The size of the payload. */ builder(boost::asio::mutable_buffer buf, size_t payload_size) : _base_builder(buf, payload_size) {} /** * \brief Write the frame. * \param type The message type. * \param code The code. * \param router_flag The router flag. * \param solicited_flag The solicited flag. * \param override_flag The override flag. * \param target The target address. * \return The total size of the written frame, including its payload. */ size_t write( uint8_t type, uint8_t code, bool router_flag, bool solicited_flag, bool override_flag, boost::asio::ip::address_v6 target ) const; /** * \brief Update the checksum. * \param parent_frame The parent frame. */ void update_checksum(const_helper parent_frame); }; } } freelan-2.0/libs/asiotap/include/asiotap/osi/icmpv6_filter.hpp000066400000000000000000000063551252300335000245210ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ipv6_filter.hpp * \author Julien KAUFFMANN * \brief An IPv6 filter class. */ #pragma once #include "filter.hpp" #include "icmpv6_frame.hpp" #include "ipv6_helper.hpp" #include "icmpv6_helper.hpp" namespace asiotap { namespace osi { /** * \brief The ICMPv6 filter. */ template <> class filter : public _filter { }; /** * \brief The ICMPv6 filter, depending on an IPv6 parent frame. */ template class filter : public _filter { public: /** * \brief Constructor. * \param _parent The parent filter. */ filter(ParentFilterType& _parent) : _filter(_parent) {} }; /** * \brief The frame parent match function. * \param parent The parent frame. * \return true if the frame matches the parent frame. */ template <> inline bool frame_parent_match(const_helper parent) { // Okay, things might be a little more complex if we wanted to handle things perfectly. // TODO: Handle the cases were the ICMPV6_HEADER is not the first and sole next-header. return (parent.next_header() == ICMPV6_HEADER); } /** * \brief Check if a frame is valid. * \param frame The frame. * \return true on success. */ inline bool check_frame(const_helper frame) { static_cast(frame); return true; } } } freelan-2.0/libs/asiotap/include/asiotap/osi/icmpv6_frame.hpp000066400000000000000000000064311252300335000243210ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file icmpv6_frame.hpp * \author Julien KAUFFMANN * \brief An ICMPv6 frame structure. */ #pragma once #include "frame.hpp" namespace asiotap { namespace osi { /** * \brief The ICMPv6 header. */ const uint8_t ICMPV6_HEADER = 0x3A; /** * \brief The neighbor solicitation type. */ const uint8_t ICMPV6_NEIGHBOR_SOLICITATION = 0x87; /** * \brief The neighbor advertisement type. */ const uint8_t ICMPV6_NEIGHBOR_ADVERTISEMENT = 0x88; /** * \brief The source link-layer address option. */ const uint8_t ICMPV6_OPTION_SOURCE_LINK_LAYER_ADDRESS = 0x01; /** * \brief The target link-layer address option. */ const uint8_t ICMPV6_OPTION_TARGET_LINK_LAYER_ADDRESS = 0x02; #ifdef MSV #pragma pack(push, 1) #endif /** * \brief An ICMPv6 frame structure. */ struct icmpv6_frame { uint8_t type; /**< Type */ uint8_t code; /**< Code */ uint16_t checksum; /**< Checksum */ uint32_t flags; /**< Flags */ struct in6_addr target; /**< Target */ } PACKED; /** * \brief An ICMPv6-IPv6 pseudo-header structure. */ struct icmpv6_ipv6_pseudo_header { struct in6_addr ipv6_source; /**< Source IPv6 address */ struct in6_addr ipv6_destination; /**< Source IPv6 address */ uint32_t upper_layer_length; /**< The upper-layer length */ uint16_t zero; /**< 16 bits reserved field (must be zero) */ uint8_t zero2; /**< 8 bits reserved field (must be zero) */ uint8_t ipv6_next_header; /**< The IPv6 next header */ } PACKED; #ifdef MSV #pragma pack(pop) #endif } } freelan-2.0/libs/asiotap/include/asiotap/osi/icmpv6_helper.hpp000066400000000000000000000161271252300335000245110ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file icmpv6_helper.hpp * \author Julien KAUFFMANN * \brief An ICMPv6 helper class. */ #pragma once #include "helper.hpp" #include "icmpv6_frame.hpp" #include "ipv6_helper.hpp" namespace asiotap { namespace osi { /** * \brief The base icmpv6 helper implementation class. */ template class _base_helper_impl : public _base_helper { public: /** * \brief Get the type. * \return The type. */ uint8_t type() const { return this->frame().type; } /** * \brief Get the code. * \return The code. */ uint8_t code() const { return this->frame().code; } /** * \brief Get the router flag. * \return The router flag. */ bool router_flag() const { return ((this->frame().flags & htonl(0x80000000)) != 0); } /** * \brief Get the solicited flag. * \return The solicited flag. */ bool solicited_flag() const { return ((this->frame().flags & htonl(0x40000000)) != 0); } /** * \brief Get the override flag. * \return The override flag. */ bool override_flag() const { return ((this->frame().flags & htonl(0x20000000)) != 0); } /** * \brief Get the checksum. * \return The checksum. */ uint16_t checksum() const { return this->frame().checksum; } /** * \brief Compute the checksum. * \param parent_frame The parent frame. * \return The checksum. */ uint16_t compute_checksum(const_helper parent_frame) const; /** * \brief Verify the checksum. * \param parent_frame The parent frame. * \return true if the checksum is valid. */ bool verify_checksum(const_helper parent_frame) const { return (compute_checksum(parent_frame) == 0x0000); } /** * \brief Get the target address. * \return The target address. */ boost::asio::ip::address_v6 target() const { using boost::asio::ip::address_v6; address_v6::bytes_type raw; std::memcpy(&raw.front(), this->frame().target.s6_addr, raw.size()); return address_v6(raw); } /** * \brief Get the payload buffer. * \return The payload. */ typename _base_helper_impl::buffer_type payload() const { return this->buffer() + header_length(); } /** * \brief Get the ICMPv6 header length, in bytes. * \return The ICMPv6 header length, in bytes. * \warning Does not contain the options. */ size_t header_length() const { return sizeof(icmpv6_frame); } /** * \brief Get the payload length. * \param parent_frame The parent frame. * \return The payload length. */ typename _base_helper_impl::buffer_type payload_length(const_helper parent_frame) const { return parent_frame.payload_length() - header_length(); } protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _base_helper_impl(typename _base_helper_impl::buffer_type buf) : _base_helper(buf) {} }; /** * \brief The mutable ipv6 helper implementation class. */ template <> class _helper_impl : public _base_helper_impl { public: /** * \brief Set the type. * \param _type The type. */ void set_type(uint8_t _type) const { this->frame().type = _type; } /** * \brief Set the code. * \param _code The code. */ void set_code(uint8_t _code) const { this->frame().code = _code; } /** * \brief Set the checksum. * \param _checksum The checksum. */ void set_checksum(uint16_t _checksum) const { this->frame().checksum = _checksum; } /** * \brief Reset the flags. */ void reset_flags() const { this->frame().flags = htonl(0x00000000); } /** * \brief Set the router flag. * \param flag The flag value. */ void set_router_flag(bool value) const { if (value) { this->frame().flags |= htonl(0x80000000); } else { this->frame().flags &= htonl(0x7fffffff); } } /** * \brief Set the solicited flag. * \param flag The flag value. */ void set_solicited_flag(bool value) const { if (value) { this->frame().flags |= htonl(0x40000000); } else { this->frame().flags &= htonl(0xbfffffff); } } /** * \brief Set the override flag. * \param flag The flag value. */ void set_override_flag(bool value) const { if (value) { this->frame().flags |= htonl(0x20000000); } else { this->frame().flags &= htonl(0xdfffffff); } } /** * \brief Set the target address. * \param _target The target address. */ void set_target(const boost::asio::ip::address_v6& _target) const { std::memcpy(this->frame().target.s6_addr, _target.to_bytes().data(), _target.to_bytes().size()); } protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _helper_impl(_helper_impl::buffer_type buf) : _base_helper_impl(buf) {} }; } } freelan-2.0/libs/asiotap/include/asiotap/osi/icmpv6_proxy.hpp000066400000000000000000000067001252300335000244070ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file icmpv6_proxy.hpp * \author Julien KAUFFMANN * \brief An ICMPv6 proxy class. */ #pragma once #include "proxy.hpp" #include "ipv6_filter.hpp" #include "icmpv6_filter.hpp" #include "ethernet_address.hpp" #include namespace asiotap { namespace osi { /** * \brief An ARP proxy class. */ template <> class proxy : public _base_proxy { public: /** * \brief The Ethernet address type. */ typedef ethernet_address ethernet_address_type; /** * \brief The neighbor sollicitation request callback type. */ typedef boost::function neighbor_solicitation_callback_type; /** * \brief Create an ARP proxy. */ proxy() : m_neighbor_solicitation_callback() { } /** * \brief Set the callback function when a neighbor sollicitation is received. * \param callback The callback function. */ void set_neighbor_solicitation_callback(neighbor_solicitation_callback_type callback) { m_neighbor_solicitation_callback = callback; } /** * \brief Process a frame. * \param ipv6_helper The IPv6 layer. * \param icmpv6_helper The ICMPv6 layer. * \param response_buffer The buffer to write the response to. * \return The buffer that contains the answer, if there is one. */ boost::optional process_frame(const_helper ipv6_helper, const_helper icmpv6_helper, boost::asio::mutable_buffer response_buffer) const; private: neighbor_solicitation_callback_type m_neighbor_solicitation_callback; }; } } freelan-2.0/libs/asiotap/include/asiotap/osi/ipv4_builder.hpp000066400000000000000000000065011252300335000243310ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ipv4_builder.hpp * \author Julien KAUFFMANN * \brief An IPV4 frame builder class. */ #ifndef ASIOTAP_OSI_IPV4_BUILDER_HPP #define ASIOTAP_OSI_IPV4_BUILDER_HPP #include "builder.hpp" #include "ipv4_frame.hpp" #include namespace asiotap { namespace osi { /** * \brief An ipv4 frame builder class. */ template <> class builder : public _base_builder { public: /** * \brief Create a builder. * \param buf The buffer to use. * \param payload_size The size of the payload. */ builder(boost::asio::mutable_buffer buf, size_t payload_size); /** * \brief Write the frame. * \param tos The type of service. * \param identification The identification. * \param flags The IP flags. * \param position_fragment The position fragment. * \param ttl The time to live. * \param protocol The underlying protocol. * \param source The source address. * \param destination The destination address. * \return The total size of the written frame, including its payload. */ size_t write( uint8_t tos, uint16_t identification, uint8_t flags, uint16_t position_fragment, uint8_t ttl, uint8_t protocol, boost::asio::ip::address_v4 source, boost::asio::ip::address_v4 destination ) const; }; inline builder::builder(boost::asio::mutable_buffer buf, size_t payload_size) : _base_builder(buf, payload_size) { } } } #endif /* ASIOTAP_IPV4_BUILDER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/ipv4_filter.hpp000066400000000000000000000071251252300335000241730ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ipv4_filter.hpp * \author Julien KAUFFMANN * \brief An IPv4 filter class. */ #pragma once #include "filter.hpp" #include "ipv4_frame.hpp" #include "ethernet_helper.hpp" #include "ipv4_helper.hpp" namespace asiotap { namespace osi { /** * \brief An IPv4 checksum filter. * \param helper The current frame. * \return true if the IP checksum is correct. */ inline bool check_ipv4_checksum(const_helper helper) { return helper.verify_checksum(); } /** * \brief The IPv4 filter. */ template <> class filter : public _filter { public: /** * \brief Add the checksum filter. */ void add_checksum_filter() { add_filter(check_ipv4_checksum); } }; /** * \brief The IPv4 filter, depending on an Ethernet parent frame. */ template class filter : public _filter { public: /** * \brief Constructor. * \param _parent The parent filter. */ filter(ParentFilterType& _parent) : _filter(_parent) {} /** * \brief Add the checksum filter. */ void add_checksum_filter() { this->add_filter(check_ipv4_checksum); } }; /** * \brief The frame parent match function. * \param parent The parent frame. * \return true if the frame matches the parent frame. */ template <> inline bool frame_parent_match(const_helper parent) { return (parent.protocol() == IP_PROTOCOL); } /** * \brief Check if a frame is valid. * \param frame The frame. * \return true on success. */ inline bool check_frame(const_helper frame) { return ((frame.version() == IP_PROTOCOL_VERSION_4) && (frame.ihl() >= 5)); } } } freelan-2.0/libs/asiotap/include/asiotap/osi/ipv4_frame.hpp000066400000000000000000000056611252300335000240030ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ipv4_frame.hpp * \author Julien KAUFFMANN * \brief An IPv4 frame structure. */ #ifndef ASIOTAP_OSI_IPV4_FRAME_HPP #define ASIOTAP_OSI_IPV4_FRAME_HPP #include "frame.hpp" namespace asiotap { namespace osi { /** * \brief The IP protocol. */ const uint16_t IP_PROTOCOL = 0x800; /** * \brief The IP protocol version 4. */ const uint8_t IP_PROTOCOL_VERSION_4 = 0x04; #ifdef MSV #pragma pack(push, 1) #endif /** * \brief An ipv4 frame structure. */ struct ipv4_frame { uint8_t version_ihl; /**< Version and IHL */ uint8_t service_type; /**< Type of service */ uint16_t total_length; /**< Length of header + data */ uint16_t identification; /**< IPv4 identification (used in fragmentation) */ uint16_t flags_fragment; /**< Flags for fragmentation */ uint8_t ttl; /**< TTL (time to live) */ uint8_t protocol; /**< Transport protocol (ICMP, TCP, UDP, ...) */ uint16_t header_checksum; /**< Checksum of IPv4 header */ struct in_addr source; /**< IPv4 source address */ struct in_addr destination; /**< IPv4 destination address */ } PACKED; #ifdef MSV #pragma pack(pop) #endif } } #endif /* ASIOTAP_OSI_IPV4_FRAME_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/ipv4_helper.hpp000066400000000000000000000272461252300335000241730ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ipv4_helper.hpp * \author Julien KAUFFMANN * \brief An IPv4 helper class. */ #ifndef ASIOTAP_OSI_IPV4_HELPER_HPP #define ASIOTAP_OSI_IPV4_HELPER_HPP #include "helper.hpp" #include "ipv4_frame.hpp" namespace asiotap { namespace osi { /** * \brief The base ipv4 helper implementation class. */ template class _base_helper_impl : public _base_helper { public: /** * \brief Get the version. * \return The version. */ uint8_t version() const; /** * \brief Get the Internet Header Length, in words. * \return The Internet Header Length, in words. */ uint8_t ihl() const; /** * \brief Get the Internet Header Length, in bytes. * \return The Internet Header Length, in bytes. */ size_t header_length() const; /** * \brief Get the Type Of Service. * \return The Type Of Service. */ uint8_t tos() const; /** * \brief Get the total length. * \return The total length. */ size_t total_length() const; /** * \brief Get the payload length. * \return The payload length. */ size_t payload_length() const; /** * \brief Get the identification. * \return The indentification. */ uint16_t identification() const; /** * \brief Get the flags. */ uint8_t flags() const; /** * \brief Get the position fragment. * \return The position fragment. */ uint16_t position_fragment() const; /** * \brief Get the time-to-live. * \return The time-to-live. */ uint8_t ttl() const; /** * \brief Get the protocol. * \return The protocol. */ uint8_t protocol() const; /** * \brief Get the checksum. * \return The checksum. */ uint16_t checksum() const; /** * \brief Get the source address. * \return The source address. */ boost::asio::ip::address_v4 source() const; /** * \brief Get the destination address. * \return The destination address. */ boost::asio::ip::address_v4 destination() const; /** * \brief Get the payload buffer. * \return The payload. */ typename _base_helper_impl::buffer_type payload() const { return this->buffer() + header_length(); } /** * \brief Compute the checksum. * \return The checksum. */ uint16_t compute_checksum() const; /** * \brief Verify the checksum. * \return true if the checksum is valid. */ bool verify_checksum() const; protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _base_helper_impl(typename _base_helper_impl::buffer_type buf); }; /** * \brief The mutable ipv4 helper implementation class. */ template <> class _helper_impl : public _base_helper_impl { public: /** * \brief Set the version. * \param version The version. */ void set_version(uint8_t version) const; /** * \brief Set the Internet Header Length, in words. * \param ihl The Internet Header Length, in words. */ void set_ihl(uint8_t ihl) const; /** * \brief Set the Type Of Service. * \param tos The Type Of Service. */ void set_tos(uint8_t tos) const; /** * \brief Set the total length. * \param total_length The total length. */ void set_total_length(size_t total_length) const; /** * \brief Set the identification. * \param identification The identification. */ void set_identification(uint16_t identification) const; /** * \brief Set the flags. * \param flags The flags. */ void set_flags(uint8_t flags) const; /** * \brief Set the position fragment. * \param position_fragment The position fragment. */ void set_position_fragment(uint16_t position_fragment) const; /** * \brief Set the time-to-live. * \param ttl The time-to-live. */ void set_ttl(uint8_t ttl) const; /** * \brief Set the protocol. * \param protocol The protocol. */ void set_protocol(uint8_t protocol) const; /** * \brief Set the checksum. * \param checksum The checksum. */ void set_checksum(uint16_t checksum) const; /** * \brief Set the source address. * \param source The source address. */ void set_source(boost::asio::ip::address_v4 source) const; /** * \brief Set the destination address. * \param destination The destination address. */ void set_destination(boost::asio::ip::address_v4 destination) const; protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _helper_impl(_helper_impl::buffer_type buf); }; template inline uint8_t _base_helper_impl::version() const { return (this->frame().version_ihl & 0xF0) >> 4; } template inline uint8_t _base_helper_impl::ihl() const { return (this->frame().version_ihl & 0x0F); } template inline size_t _base_helper_impl::header_length() const { return ihl() * sizeof(uint32_t); } template inline uint8_t _base_helper_impl::tos() const { return this->frame().service_type; } template inline size_t _base_helper_impl::total_length() const { return ntohs(this->frame().total_length); } template inline size_t _base_helper_impl::payload_length() const { return total_length() - header_length(); } template inline uint16_t _base_helper_impl::identification() const { return ntohs(this->frame().identification); } template inline uint8_t _base_helper_impl::flags() const { return static_cast((this->frame().flags_fragment & 0xE000) >> 13); } template inline uint16_t _base_helper_impl::position_fragment() const { return (this->frame().flags_fragment & 0x1FFF); } template inline uint8_t _base_helper_impl::ttl() const { return this->frame().ttl; } template inline uint8_t _base_helper_impl::protocol() const { return this->frame().protocol; } template inline uint16_t _base_helper_impl::checksum() const { return this->frame().header_checksum; } template inline boost::asio::ip::address_v4 _base_helper_impl::source() const { return boost::asio::ip::address_v4(ntohl(this->frame().source.s_addr)); } template inline boost::asio::ip::address_v4 _base_helper_impl::destination() const { return boost::asio::ip::address_v4(ntohl(this->frame().destination.s_addr)); } template inline bool _base_helper_impl::verify_checksum() const { return compute_checksum() == 0x0000; } template inline _base_helper_impl::_base_helper_impl(typename _base_helper_impl::buffer_type buf) : _base_helper(buf) { } inline void _helper_impl::set_version(uint8_t _version) const { this->frame().version_ihl = (this->frame().version_ihl & 0x0F) | ((_version & 0x0F) << 4); } inline void _helper_impl::set_ihl(uint8_t _ihl) const { this->frame().version_ihl = (this->frame().version_ihl & 0xF0) | (_ihl & 0x0F); } inline void _helper_impl::set_tos(uint8_t _tos) const { this->frame().service_type = _tos; } inline void _helper_impl::set_total_length(size_t _total_length) const { this->frame().total_length = htons(static_cast(_total_length)); } inline void _helper_impl::set_identification(uint16_t _identification) const { this->frame().identification = htons(_identification); } inline void _helper_impl::set_flags(uint8_t _flags) const { this->frame().flags_fragment = (this->frame().flags_fragment & 0x1FFF) | ((static_cast(_flags) & 0x0007) << 13); } inline void _helper_impl::set_position_fragment(uint16_t _position_fragment) const { this->frame().flags_fragment = (this->frame().flags_fragment & 0xE000) | (_position_fragment & 0x1FFF); } inline void _helper_impl::set_ttl(uint8_t _ttl) const { this->frame().ttl = _ttl; } inline void _helper_impl::set_protocol(uint8_t _protocol) const { this->frame().protocol = _protocol; } inline void _helper_impl::set_checksum(uint16_t _checksum) const { this->frame().header_checksum = _checksum; } inline void _helper_impl::set_source(boost::asio::ip::address_v4 _source) const { this->frame().source.s_addr = htonl(_source.to_ulong()); } inline void _helper_impl::set_destination(boost::asio::ip::address_v4 _destination) const { this->frame().destination.s_addr = htonl(_destination.to_ulong()); } inline _helper_impl::_helper_impl(_helper_impl::buffer_type buf) : _base_helper_impl(buf) { } } } #endif /* ASIOTAP_OSI_IPV4_HELPER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/ipv6_builder.hpp000066400000000000000000000057231252300335000243400ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ipv6_builder.hpp * \author Julien KAUFFMANN * \brief An IPV6 frame builder class. */ #pragma once #include "builder.hpp" #include "ipv6_frame.hpp" #include namespace asiotap { namespace osi { /** * \brief An ipv4 frame builder class. */ template <> class builder : public _base_builder { public: /** * \brief Create a builder. * \param buf The buffer to use. * \param payload_size The size of the payload. */ builder(boost::asio::mutable_buffer buf, size_t payload_size) : _base_builder(buf, payload_size) {} /** * \brief Write the frame. * \param _class The class. * \param label The label. * \param next_header The next header. * \param hop_limit The hop limit. * \param source The source address. * \param destination The destination address. * \return The total size of the written frame, including its payload. */ size_t write( uint8_t _class, uint32_t label, uint8_t next_header, uint8_t hop_limit, boost::asio::ip::address_v6 source, boost::asio::ip::address_v6 destination ) const; }; } } freelan-2.0/libs/asiotap/include/asiotap/osi/ipv6_filter.hpp000066400000000000000000000060571252300335000242000ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ipv6_filter.hpp * \author Julien KAUFFMANN * \brief An IPv6 filter class. */ #pragma once #include "filter.hpp" #include "ipv6_frame.hpp" #include "ethernet_helper.hpp" #include "ipv6_helper.hpp" namespace asiotap { namespace osi { /** * \brief The IPv6 filter. */ template <> class filter : public _filter { }; /** * \brief The IPv6 filter, depending on an Ethernet parent frame. */ template class filter : public _filter { public: /** * \brief Constructor. * \param _parent The parent filter. */ filter(ParentFilterType& _parent) : _filter(_parent) {}; }; /** * \brief The frame parent match function. * \param parent The parent frame. * \return true if the frame matches the parent frame. */ template <> inline bool frame_parent_match(const_helper parent) { return (parent.protocol() == IPV6_PROTOCOL); } /** * \brief Check if a frame is valid. * \param frame The frame. * \return true on success. */ inline bool check_frame(const_helper frame) { return (frame.version() == IP_PROTOCOL_VERSION_6); } } } freelan-2.0/libs/asiotap/include/asiotap/osi/ipv6_frame.hpp000066400000000000000000000052621252300335000240020ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ipv6_frame.hpp * \author Julien KAUFFMANN * \brief An IPv6 frame structure. */ #ifndef ASIOTAP_OSI_IPV6_FRAME_HPP #define ASIOTAP_OSI_IPV6_FRAME_HPP #include "frame.hpp" namespace asiotap { namespace osi { /** * \brief The IP protocol. */ const uint16_t IPV6_PROTOCOL = 0x86DD; /** * \brief The IP protocol version 6. */ const uint8_t IP_PROTOCOL_VERSION_6 = 0x06; #ifdef MSV #pragma pack(push, 1) #endif /** * \brief An IPv6 frame structure. */ struct ipv6_frame { uint32_t version_class_label; /**< Version, class and flow label */ uint16_t payload_length; /**< Payload length */ uint8_t next_header; /**< Next header number */ uint8_t hop_limit; /**< Hop limit value */ struct in6_addr source; /**< Source address */ struct in6_addr destination; /**< Destination address */ } PACKED; #ifdef MSV #pragma pack(pop) #endif } } #endif /* ASIOTAP_OSI_IPV6_FRAME_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/ipv6_helper.hpp000066400000000000000000000220561252300335000241670ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ipv6_helper.hpp * \author Julien KAUFFMANN * \brief An IPv6 helper class. */ #ifndef ASIOTAP_OSI_IPV6_HELPER_HPP #define ASIOTAP_OSI_IPV6_HELPER_HPP #include "helper.hpp" #include "ipv6_frame.hpp" namespace asiotap { namespace osi { /** * \brief The base ipv6 helper implementation class. */ template class _base_helper_impl : public _base_helper { public: /** * \brief Get the version. * \return The version. */ uint8_t version() const; /** * \brief Get the class. * \return The class. */ uint8_t _class() const; /** * \brief Get the label. * \return The label. */ uint32_t label() const; /** * \brief Get the payload length. * \return The payload length. */ size_t payload_length() const; /** * \brief Get the next header. * \return The next header. */ uint8_t next_header() const; /** * \brief Get the hop limit. * \return The hop limit. */ uint8_t hop_limit() const; /** * \brief Get the source address. * \return The source address. */ boost::asio::ip::address_v6 source() const; /** * \brief Get the destination address. * \return The destination address. */ boost::asio::ip::address_v6 destination() const; /** * \brief Get the payload buffer. * \return The payload. */ typename _base_helper_impl::buffer_type payload() const { return this->buffer() + header_length(); } /** * \brief Get the IPv6 header length, in bytes. * \return The IPv6 header length, in bytes. */ size_t header_length() const; protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _base_helper_impl(typename _base_helper_impl::buffer_type buf); }; /** * \brief The mutable ipv6 helper implementation class. */ template <> class _helper_impl : public _base_helper_impl { public: /** * \brief Set the version. * \param version The version. */ void set_version(uint8_t version) const; /** * \brief Set the class. * \param _class The class. */ void set_class(uint8_t _class) const; /** * \brief Set the label. * \param label The label. */ void set_label(uint32_t label) const; /** * \brief Set the payload length. * \param payload_length The payload length. */ void set_payload_length(size_t payload_length) const; /** * \brief Set the next header. * \param next_header The next header. */ void set_next_header(uint8_t next_header) const; /** * \brief Set hop limit. * \param hop_limit The hop limit. */ void set_hop_limit(uint8_t hop_limit) const; /** * \brief Set the source address. * \param source The source address. */ void set_source(boost::asio::ip::address_v6 source) const; /** * \brief Set the destination address. * \param destination The destination address. */ void set_destination(boost::asio::ip::address_v6 destination) const; protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _helper_impl(_helper_impl::buffer_type buf); }; template inline uint8_t _base_helper_impl::version() const { return static_cast((ntohl(this->frame().version_class_label) & 0xF0000000) >> 28); } template inline uint8_t _base_helper_impl::_class() const { return static_cast((ntohl(this->frame().version_class_label) & 0x0FF00000) >> 20); } template inline uint32_t _base_helper_impl::label() const { return (ntohl(this->frame().version_class_label) & 0x000FFFFF); } template inline size_t _base_helper_impl::payload_length() const { return ntohs(this->frame().payload_length); } template inline uint8_t _base_helper_impl::next_header() const { return this->frame().next_header; } template inline uint8_t _base_helper_impl::hop_limit() const { return this->frame().hop_limit; } template inline boost::asio::ip::address_v6 _base_helper_impl::source() const { using boost::asio::ip::address_v6; address_v6::bytes_type raw; std::memcpy(&raw.front(), this->frame().source.s6_addr, raw.size()); return address_v6(raw); } template inline boost::asio::ip::address_v6 _base_helper_impl::destination() const { using boost::asio::ip::address_v6; address_v6::bytes_type raw; std::memcpy(&raw.front(), this->frame().destination.s6_addr, raw.size()); return address_v6(raw); } template inline size_t _base_helper_impl::header_length() const { return sizeof(ipv6_frame); } template inline _base_helper_impl::_base_helper_impl(typename _base_helper_impl::buffer_type buf) : _base_helper(buf) { } inline void _helper_impl::set_version(uint8_t _version) const { this->frame().version_class_label = htonl((this->frame().version_class_label & 0x0FFFFFFF) | ((_version & 0x0FL) << 28)); } inline void _helper_impl::set_class(uint8_t __class) const { this->frame().version_class_label = htonl((this->frame().version_class_label & 0xF00FFFFF) | ((__class & 0xFFL) << 20)); } inline void _helper_impl::set_label(uint32_t _label) const { this->frame().version_class_label = htonl((this->frame().version_class_label & 0xFFF00000) | (_label & 0x000FFFFFL)); } inline void _helper_impl::set_payload_length(size_t _payload_length) const { this->frame().payload_length = htons(static_cast(_payload_length)); } inline void _helper_impl::set_next_header(uint8_t _next_header) const { this->frame().next_header = _next_header; } inline void _helper_impl::set_hop_limit(uint8_t _hop_limit) const { this->frame().hop_limit = _hop_limit; } inline void _helper_impl::set_source(boost::asio::ip::address_v6 _source) const { std::memcpy(this->frame().source.s6_addr, _source.to_bytes().data(), _source.to_bytes().size()); } inline void _helper_impl::set_destination(boost::asio::ip::address_v6 _destination) const { std::memcpy(this->frame().destination.s6_addr, _destination.to_bytes().data(), _destination.to_bytes().size()); } inline _helper_impl::_helper_impl(_helper_impl::buffer_type buf) : _base_helper_impl(buf) { } } } #endif /* ASIOTAP_OSI_IPV6_HELPER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/proxy.hpp000066400000000000000000000045151252300335000231250ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file proxy.hpp * \author Julien KAUFFMANN * \brief An OSI frame proxy class. */ #ifndef ASIOTAP_OSI_PROXY_HPP #define ASIOTAP_OSI_PROXY_HPP #include #include namespace asiotap { namespace osi { /** * \brief A base proxy class. */ template class _base_proxy { public: /** * \brief The frame type. */ typedef OSIFrameType frame_type; }; /** * \brief A generic proxy class. */ template class proxy; } } #endif /* ASIOTAP_OSI_PROXY_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/tcp_filter.hpp000066400000000000000000000070061252300335000240750ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file tcp_filter.hpp * \author Julien KAUFFMANN * \brief An TCP filter class. */ #pragma once #include "filter.hpp" #include "tcp_frame.hpp" #include "ipv4_helper.hpp" #include "ipv6_helper.hpp" #include "tcp_helper.hpp" namespace asiotap { namespace osi { /** * \brief The TCP filter. */ template class filter : public _filter { public: /** * \brief An TCP checksum bridge filter. * \param parent_helper The parent frame. * \param helper The current frame. * \return true if the TCP checksum is correct. */ static bool checksum_bridge_filter(const_helper parent_helper, const_helper helper) { return helper.verify_checksum(parent_helper); } /** * \brief Constructor. * \param _parent The parent filter. */ filter(ParentFilterType& _parent) : _filter(_parent) {} /** * \brief Add the checksum bridge filter. */ void add_checksum_bridge_filter() { add_bridge_filter(checksum_bridge_filter); } }; /** * \brief The frame parent match function. * \param parent The parent frame. * \return true if the frame matches the parent frame. */ template <> inline bool frame_parent_match(const_helper parent) { return (parent.protocol() == TCP_PROTOCOL); } /** * \brief The frame parent match function. * \param parent The parent frame. * \return true if the frame matches the parent frame. */ template <> inline bool frame_parent_match(const_helper parent) { return (parent.next_header() == TCP_PROTOCOL); } } } freelan-2.0/libs/asiotap/include/asiotap/osi/tcp_frame.hpp000066400000000000000000000071501252300335000237020ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file tcp_frame.hpp * \author Julien KAUFFMANN * \brief An TCP frame structure. */ #pragma once #include "frame.hpp" namespace asiotap { namespace osi { #ifdef MSV #pragma pack(push, 1) #endif /** * \brief The TCP protocol. */ const uint8_t TCP_PROTOCOL = 0x06; /** * \brief The TCP end option. */ const uint8_t TCP_OPTION_END = 0x00; /** * \brief The TCP no-op option. */ const uint8_t TCP_OPTION_NOP = 0x01; /** * \brief The TCP MSS option. */ const uint8_t TCP_OPTION_MSS = 0x02; /** * \brief A TCP frame structure. */ struct tcp_frame { uint16_t source; /**< Source port */ uint16_t destination; /**< Destination port */ uint32_t sequence; /**< The sequence number */ uint32_t ack; /**< The ack */ uint16_t offset_flags; /**< The offset and flags */ uint16_t window; /**< The window */ uint16_t checksum; /**< The checksum */ uint16_t pointer; /**< The pointer */ } PACKED; /** * \brief A TCP-IPv4 pseudo-header structure. */ struct tcp_ipv4_pseudo_header { struct in_addr ipv4_source; /**< Source IPv4 address */ struct in_addr ipv4_destination; /**< Source IPv4 address */ uint8_t reserved; /**< 8 bits reserved field (must be zero) */ uint8_t ipv4_protocol; /**< The IPv4 protocol */ uint16_t tcp_length; /**< The TCP length */ } PACKED; /** * \brief A TCP-IPv6 pseudo-header structure. */ struct tcp_ipv6_pseudo_header { struct in6_addr ipv6_source; /**< Source IPv6 address */ struct in6_addr ipv6_destination; /**< Source IPv6 address */ uint32_t upper_layer_length; /**< The upper-layer length */ uint16_t zero; /**< 16 bits reserved field (must be zero) */ uint8_t zero2; /**< 8 bits reserved field (must be zero) */ uint8_t ipv6_next_header; /**< The IPv6 next header */ } PACKED; #ifdef MSV #pragma pack(pop) #endif } } freelan-2.0/libs/asiotap/include/asiotap/osi/tcp_helper.hpp000066400000000000000000000271171252300335000240740ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file tcp_helper.hpp * \author Julien KAUFFMANN * \brief A TCP helper class. */ #pragma once #include "helper.hpp" #include "tcp_frame.hpp" #include "ipv4_helper.hpp" #include "ipv6_helper.hpp" namespace asiotap { namespace osi { /** * \brief The base udp helper implementation class. */ template class _base_helper_impl : public _base_helper { public: /** * \brief TCP option. */ class tcp_option { public: tcp_option(typename _base_helper_impl::buffer_type buf = typename _base_helper_impl::buffer_type()) : m_buf(buf) { } bool valid() const { const size_t buf_size = boost::asio::buffer_size(m_buf); if (buf_size == 0) { return false; } switch (kind()) { case TCP_OPTION_END: case TCP_OPTION_NOP: return true; default: break; } if (buf_size < 1) { return false; } if (size() > buf_size) { return false; } return true; } uint8_t kind() const { return boost::asio::buffer_cast(m_buf)[0]; } uint8_t size() const { switch (kind()) { case TCP_OPTION_END: case TCP_OPTION_NOP: return 1; default: return boost::asio::buffer_cast(m_buf)[1]; } } typename _base_helper_impl::buffer_type value() const { const uint8_t _size = size(); if (_size <= 2) { return {}; } else { return boost::asio::buffer(m_buf + 2, _size - 2); } } tcp_option next_option() const { if (!valid()) { return {}; } else { return { m_buf + size() }; } } private: typename _base_helper_impl::buffer_type m_buf; }; /** * \brief Get the source port. * \return The source port. */ uint16_t source() const { return ntohs(this->frame().source); } /** * \brief Get the destination port. * \return The destination port. */ uint16_t destination() const { return ntohs(this->frame().destination); } /** * \brief Get the sequence number. * \return The sequence number. */ uint32_t sequence() const { return ntohl(this->frame().sequence); } /** * \brief Get the ack number. * \return The ack number. */ uint32_t ack() const { return ntohl(this->frame().ack); } /** * \brief Get the offset. * \return The offset. */ size_t offset() const { return ((ntohs(this->frame().offset_flags) & 0xf000) >> 12) * 4; } /** * \brief Get the urgent flag. * \return The flag's value. */ bool urgent_flag() const { return ((this->frame().offset_flags & htons(0x0020)) != 0); } /** * \brief Get the ack flag. * \return The flag's value. */ bool ack_flag() const { return ((this->frame().offset_flags & htons(0x0010)) != 0); } /** * \brief Get the psh flag. * \return The flag's value. */ bool psh_flag() const { return ((this->frame().offset_flags & htons(0x0008)) != 0); } /** * \brief Get the rst flag. * \return The flag's value. */ bool rst_flag() const { return ((this->frame().offset_flags & htons(0x0004)) != 0); } /** * \brief Get the syn flag. * \return The flag's value. */ bool syn_flag() const { return ((this->frame().offset_flags & htons(0x0002)) != 0); } /** * \brief Get the fin flag. * \return The flag's value. */ bool fin_flag() const { return ((this->frame().offset_flags & htons(0x0001)) != 0); } /** * \brief Get the window. * \return The window. */ uint16_t window() const { return ntohs(this->frame().window); } /** * \brief Get the checksum. * \return The checksum. */ uint16_t checksum() const { return this->frame().checksum; } /** * \brief Get the pointer. * \return The pointer. */ uint16_t pointer() const { return ntohs(this->frame().pointer); } /** * \brief Get the options payload buffer. * \return The payload. */ typename _base_helper_impl::buffer_type options_payload() const { return boost::asio::buffer(this->buffer() + sizeof(typename _base_helper_impl::frame_type), offset()); } /** * \brief Get the first option. * \return The first option. */ tcp_option first_option() const { return { options_payload() }; } /** * \brief Get the payload buffer. * \return The payload. */ typename _base_helper_impl::buffer_type payload() const { return this->buffer() + sizeof(typename _base_helper_impl::frame_type) + offset(); } /** * \brief Compute the checksum. * \param parent_frame The parent frame. * \return The checksum. */ uint16_t compute_checksum(const_helper parent_frame) const; /** * \brief Compute the checksum. * \param parent_frame The parent frame. * \return The checksum. */ uint16_t compute_checksum(const_helper parent_frame) const; /** * \brief Verify the checksum. * \param parent_frame The parent frame. * \return true if the checksum is valid. */ bool verify_checksum(const_helper parent_frame) const { return this->compute_checksum(parent_frame) == 0x0000; } /** * \brief Verify the checksum. * \param parent_frame The parent frame. * \return true if the checksum is valid. */ bool verify_checksum(const_helper parent_frame) const { return this->compute_checksum(parent_frame) == 0x0000; } protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _base_helper_impl(typename _base_helper_impl::buffer_type buf) : _base_helper(buf) {} }; /** * \brief The mutable udp helper implementation class. */ template <> class _helper_impl : public _base_helper_impl { public: /** * \brief Set the source port. * \param _source The source port. */ void set_source(uint16_t _source) const { this->frame().source = htons(_source); } /** * \brief Set the destination port. * \param _destination The destination port. */ void set_destination(uint16_t _destination) const { this->frame().destination = htons(_destination); } /** * \brief Set the sequence. * \param _sequence The sequence. */ void set_sequence(uint32_t _sequence) const { this->frame().sequence = htonl(_sequence); } /** * \brief Set the ack. * \param _ack The ack. */ void set_ack(uint32_t _ack) const { this->frame().ack = htonl(_ack); } /** * \brief Set the offset. * \param _offset The offset. Must be a multiple of 4, or the result is undefined. */ void set_offset(size_t _offset) const { this->frame().offset_flags = (this->frame().offset_flags & htons(0x0fff)) | htons(static_cast(_offset / 4) << 12); } /** * \brief Set the urgent flag. * \param value The new flag's value. */ void set_urgent_flag(bool value) const { if (value) { this->frame().offset_flags |= htons(0x0020); } else { this->frame().offset_flags &= htons(0xffdf); } } /** * \brief Set the ack flag. * \param value The new flag's value. */ void set_ack_flag(bool value) const { if (value) { this->frame().offset_flags |= htons(0x0010); } else { this->frame().offset_flags &= htons(0xffef); } } /** * \brief Set the psh flag. * \param value The new flag's value. */ void set_psh_flag(bool value) const { if (value) { this->frame().offset_flags |= htons(0x0008); } else { this->frame().offset_flags &= htons(0xfff7); } } /** * \brief Set the rst flag. * \param value The new flag's value. */ void set_rst_flag(bool value) const { if (value) { this->frame().offset_flags |= htons(0x0004); } else { this->frame().offset_flags &= htons(0xfffb); } } /** * \brief Set the syn flag. * \param value The new flag's value. */ void set_syn_flag(bool value) const { if (value) { this->frame().offset_flags |= htons(0x0002); } else { this->frame().offset_flags &= htons(0xfffd); } } /** * \brief Set the fin flag. * \param value The new flag's value. */ void set_fin_flag(bool value) const { if (value) { this->frame().offset_flags |= htons(0x0001); } else { this->frame().offset_flags &= htons(0xfffe); } } /** * \brief Set the window. * \param _window The window. */ void set_window(uint16_t _window) const { this->frame().window = htons(_window); } /** * \brief Set the checksum. * \param _checksum The checksum. */ void set_checksum(uint16_t _checksum) const { this->frame().checksum = _checksum; } /** * \brief Set the pointer. * \param _pointer The pointer. */ void set_pointer(uint16_t _pointer) const { this->frame().pointer = htons(_pointer); } protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _helper_impl(_helper_impl::buffer_type buf) : _base_helper_impl(buf) {} }; } } freelan-2.0/libs/asiotap/include/asiotap/osi/tcp_mss_morpher.hpp000066400000000000000000000053661252300335000251550ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file tcp_mss_morpher.hpp * \author Julien KAUFFMANN * \brief A TCP MSS morpher class. */ #pragma once #include "tcp_filter.hpp" #include "ipv4_helper.hpp" #include "ipv6_helper.hpp" #include namespace asiotap { namespace osi { /** * \brief An TCP MSS morpher class. */ class tcp_mss_morpher { public: /** * \brief Create a TCP MSS morpher. * \brief The max MSS value. */ tcp_mss_morpher(size_t max_mss) : m_max_mss(max_mss) { } /** * \brief Handle a TCP frame. * \param ipv4_helper The IPv4 helper. * \param tcp_helper The TCP helper. */ void handle(const_helper ipv4_helper, mutable_helper tcp_helper); /** * \brief Handle a TCP frame. * \param ipv6_helper The IPv4 helper. * \param tcp_helper The TCP helper. */ void handle(const_helper ipv6_helper, mutable_helper tcp_helper); private: size_t m_max_mss; }; } } freelan-2.0/libs/asiotap/include/asiotap/osi/udp_builder.hpp000066400000000000000000000060411252300335000242360ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file udp_builder.hpp * \author Julien KAUFFMANN * \brief An UDP frame builder class. */ #ifndef ASIOTAP_OSI_UDP_BUILDER_HPP #define ASIOTAP_OSI_UDP_BUILDER_HPP #include "builder.hpp" #include "udp_frame.hpp" #include "ipv4_frame.hpp" #include namespace asiotap { namespace osi { /** * \brief An udp frame builder class. */ template <> class builder : public _base_builder { public: /** * \brief Create a builder. * \param buf The buffer to use. * \param payload_size The size of the payload. */ builder(boost::asio::mutable_buffer buf, size_t payload_size); /** * \brief Write the frame. * \param source The source port. * \param destination The destination port. * \return The total size of the written frame, including its payload. */ size_t write( uint16_t source, uint16_t destination ) const; /** * \brief Update the checksum. * \param parent_frame The parent frame. */ void update_checksum(const_helper parent_frame); }; inline builder::builder(boost::asio::mutable_buffer buf, size_t payload_size) : _base_builder(buf, payload_size) { } } } #endif /* ASIOTAP_UDP_BUILDER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/udp_filter.hpp000066400000000000000000000073501252300335000241010ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file udp_filter.hpp * \author Julien KAUFFMANN * \brief An UDP filter class. */ #pragma once #include "filter.hpp" #include "udp_frame.hpp" #include "ipv4_helper.hpp" #include "ipv6_helper.hpp" #include "udp_helper.hpp" namespace asiotap { namespace osi { /** * \brief The UDP filter. */ template class filter : public _filter { public: /** * \brief An UDP checksum bridge filter. * \param parent_helper The parent frame. * \param helper The current frame. * \return true if the UDP checksum is correct. */ static bool checksum_bridge_filter(const_helper parent_helper, const_helper helper) { return helper.verify_checksum(parent_helper); } /** * \brief Constructor. * \param _parent The parent filter. */ filter(ParentFilterType& _parent) : _filter(_parent) {} /** * \brief Add the checksum bridge filter. */ void add_checksum_bridge_filter() { this->add_bridge_filter(checksum_bridge_filter); } }; /** * \brief The frame parent match function. * \param parent The parent frame. * \return true if the frame matches the parent frame. */ template <> inline bool frame_parent_match(const_helper parent) { return (parent.protocol() == UDP_PROTOCOL); } /** * \brief The frame parent match function. * \param parent The parent frame. * \return true if the frame matches the parent frame. */ template <> inline bool frame_parent_match(const_helper parent) { return (parent.next_header() == UDP_PROTOCOL); } /** * \brief Check if a frame is valid. * \param frame The frame. * \return true on success. */ inline bool check_frame(const_helper frame) { static_cast(frame); return true; } } } freelan-2.0/libs/asiotap/include/asiotap/osi/udp_frame.hpp000066400000000000000000000064411252300335000237060ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file udp_frame.hpp * \author Julien KAUFFMANN * \brief An UDP frame structure. */ #ifndef ASIOTAP_OSI_UDP_FRAME_HPP #define ASIOTAP_OSI_UDP_FRAME_HPP #include "frame.hpp" namespace asiotap { namespace osi { #ifdef MSV #pragma pack(push, 1) #endif /** * \brief The UDP protocol. */ const uint8_t UDP_PROTOCOL = 0x11; /** * \brief An UDP frame structure. */ struct udp_frame { uint16_t source; /**< Source port */ uint16_t destination; /**< Destination port */ uint16_t length; /**< The header and data length */ uint16_t checksum; /**< The checksum */ } PACKED; /** * \brief An UDP-IPv4 pseudo-header structure. */ struct udp_ipv4_pseudo_header { struct in_addr ipv4_source; /**< Source IPv4 address */ struct in_addr ipv4_destination; /**< Source IPv4 address */ uint8_t reserved; /**< 8 bits reserved field (must be zero) */ uint8_t ipv4_protocol; /**< The IPv4 protocol */ uint16_t udp_length; /**< The UDP length */ } PACKED; /** * \brief An UDP-IPv6 pseudo-header structure. */ struct udp_ipv6_pseudo_header { struct in6_addr ipv6_source; /**< Source IPv6 address */ struct in6_addr ipv6_destination; /**< Source IPv6 address */ uint16_t udp_length; /**< The UDP length */ uint16_t reserved; /**< 8 bits reserved field (must be zero) */ uint8_t reserved2; /**< 8 bits reserved field (must be zero) */ uint8_t ipv6_next_header; /**< The IPv6 next header */ } PACKED; #ifdef MSV #pragma pack(pop) #endif } } #endif /* ASIOTAP_OSI_UDP_FRAME_HPP */ freelan-2.0/libs/asiotap/include/asiotap/osi/udp_helper.hpp000066400000000000000000000156611252300335000240770ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file udp_helper.hpp * \author Julien KAUFFMANN * \brief An UDP helper class. */ #ifndef ASIOTAP_OSI_UDP_HELPER_HPP #define ASIOTAP_OSI_UDP_HELPER_HPP #include "helper.hpp" #include "udp_frame.hpp" #include "ipv4_helper.hpp" #include "ipv6_helper.hpp" namespace asiotap { namespace osi { /** * \brief The base udp helper implementation class. */ template class _base_helper_impl : public _base_helper { public: /** * \brief Get the source port. * \return The source port. */ uint16_t source() const; /** * \brief Get the destination port. * \return The destination port. */ uint16_t destination() const; /** * \brief Get the length. * \return The length. */ uint16_t length() const; /** * \brief Get the checksum. * \return The checksum. */ uint16_t checksum() const; /** * \brief Get the payload buffer. * \return The payload. */ typename _base_helper_impl::buffer_type payload() const { return this->buffer() + sizeof(typename _base_helper_impl::frame_type); } /** * \brief Compute the checksum. * \param parent_frame The parent frame. * \return The checksum. */ uint16_t compute_checksum(const_helper parent_frame) const; /** * \brief Compute the checksum. * \param parent_frame The parent frame. * \return The checksum. */ uint16_t compute_checksum(const_helper parent_frame) const; /** * \brief Verify the checksum. * \param parent_frame The parent frame. * \return true if the checksum is valid. */ bool verify_checksum(const_helper parent_frame) const; /** * \brief Verify the checksum. * \param parent_frame The parent frame. * \return true if the checksum is valid. */ bool verify_checksum(const_helper parent_frame) const; protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _base_helper_impl(typename _base_helper_impl::buffer_type buf); }; /** * \brief The mutable udp helper implementation class. */ template <> class _helper_impl : public _base_helper_impl { public: /** * \brief Set the source port. * \param source The source port. */ void set_source(uint16_t source) const; /** * \brief Set the destination port. * \param destination The destination port. */ void set_destination(uint16_t destination) const; /** * \brief Set the length. * \param length The length. */ void set_length(uint16_t length) const; /** * \brief Set the checksum. * \param checksum The checksum. */ void set_checksum(uint16_t checksum) const; protected: /** * \brief Create a helper from a frame type structure. * \param buf The buffer to refer to. */ _helper_impl(_helper_impl::buffer_type buf); }; template inline uint16_t _base_helper_impl::source() const { return ntohs(this->frame().source); } template inline uint16_t _base_helper_impl::destination() const { return ntohs(this->frame().destination); } template inline uint16_t _base_helper_impl::length() const { return ntohs(this->frame().length); } template inline uint16_t _base_helper_impl::checksum() const { return this->frame().checksum; } template inline bool _base_helper_impl::verify_checksum(const_helper parent_frame) const { return this->compute_checksum(parent_frame) == 0x0000; } template inline bool _base_helper_impl::verify_checksum(const_helper parent_frame) const { return this->compute_checksum(parent_frame) == 0x0000; } template inline _base_helper_impl::_base_helper_impl(typename _base_helper_impl::buffer_type buf) : _base_helper(buf) { } inline void _helper_impl::set_source(uint16_t _source) const { this->frame().source = htons(_source); } inline void _helper_impl::set_destination(uint16_t _destination) const { this->frame().destination = htons(_destination); } inline void _helper_impl::set_length(uint16_t _length) const { this->frame().length = htons(_length); } inline void _helper_impl::set_checksum(uint16_t _checksum) const { this->frame().checksum = _checksum; } inline _helper_impl::_helper_impl(_helper_impl::buffer_type buf) : _base_helper_impl(buf) { } } } #endif /* ASIOTAP_OSI_UDP_HELPER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/posix/000077500000000000000000000000001252300335000215765ustar00rootroot00000000000000freelan-2.0/libs/asiotap/include/asiotap/posix/posix_dns_servers_manager.hpp000066400000000000000000000050001252300335000275530ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file posix_dns_servers_manager.hpp * \author Julien KAUFFMANN * \brief The POSIX DNS servers manager class. */ #pragma once #include "../os.hpp" #include "../base_dns_servers_manager.hpp" #include "../types/ip_network_address.hpp" #include namespace asiotap { class posix_dns_servers_manager : public base_dns_servers_manager { public: explicit posix_dns_servers_manager(boost::asio::io_service& io_service_) : base_dns_servers_manager(io_service_) { } protected: void register_dns_server(const dns_server_type& dns_server); void unregister_dns_server(const dns_server_type& dns_server); friend class base_dns_servers_manager; }; } freelan-2.0/libs/asiotap/include/asiotap/posix/posix_route_manager.hpp000066400000000000000000000066571252300335000263770ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file posix_route_manager.hpp * \author Julien KAUFFMANN * \brief The POSIX route manager class. */ #pragma once #include "../os.hpp" #include "../base_route_manager.hpp" #include "../types/ip_network_address.hpp" #include #ifdef LINUX #include #endif namespace asiotap { typedef base_routing_table_entry posix_routing_table_entry; class posix_route_manager : public base_route_manager { public: explicit posix_route_manager(boost::asio::io_service& io_service_) : #ifndef LINUX base_route_manager(io_service_) #else base_route_manager(io_service_), m_netlink_manager(io_service_) #endif { } posix_route_manager::route_type get_route_for(const boost::asio::ip::address& host); void ifconfig(const std::string& interface, const ip_network_address& address); void ifconfig(const std::string& interface, const ip_network_address& address, const boost::asio::ip::address& remote_address); enum class route_action { add, remove }; void set_route(route_action action, const std::string& interface, const ip_network_address& dest); void set_route(route_action action, const std::string& interface, const ip_network_address& dest, const boost::asio::ip::address& gateway); protected: void register_route(const route_type& route); void unregister_route(const route_type& route); friend class base_route_manager; #ifdef LINUX private: netlinkplus::manager m_netlink_manager; #endif }; } freelan-2.0/libs/asiotap/include/asiotap/posix/posix_tap_adapter.hpp000066400000000000000000000141521252300335000260200ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file posix_tap_adapter.hpp * \author Julien KAUFFMANN * \brief The POSIX tap adapter class. */ #ifndef ASIOTAP_POSIX_TAP_ADAPTER_HPP #define ASIOTAP_POSIX_TAP_ADAPTER_HPP #include "../base_tap_adapter.hpp" #include "posix_route_manager.hpp" #include "posix_dns_servers_manager.hpp" #include #include namespace asiotap { class posix_tap_adapter : public base_tap_adapter { public: /** * \brief Enumerate the tap adapters available on the system. * \param _layer The layer of the adapters to list. * \return A map of the tap adapter identifiers with their names. */ static std::map enumerate(tap_adapter_layer _layer); /** * \brief Create a new tap adapter. * \param _io_service The io_service to attach to. * \param _layer The layer of the tap adapter. */ posix_tap_adapter(boost::asio::io_service& _io_service, tap_adapter_layer _layer) : base_tap_adapter(_io_service, _layer), m_route_manager(_io_service) {} /** * \brief Destroy the tap adapter. */ ~posix_tap_adapter() { if (is_open()) { boost::system::error_code ec; // This is required on OSX. destroy_device(ec); // We do nothing with the error code as errors can happen legitimately. } } posix_tap_adapter(const posix_tap_adapter&) = delete; posix_tap_adapter& operator=(const posix_tap_adapter&) = delete; posix_tap_adapter(posix_tap_adapter&&) = default; posix_tap_adapter& operator=(posix_tap_adapter&&) = default; /** * \brief Get the associated network manager. * \return The associated network manager. */ posix_route_manager& network_manager() { return m_route_manager; } /** * \brief Open the first available tap adapter. * \param ec The error code. */ void open(boost::system::error_code& ec); /** * \brief Open the tap adapter. * \param name The name of the tap adapter to open. * \param ec The error code. */ void open(const std::string& name, boost::system::error_code& ec); /** * \brief Open the tap adapter. * \param name The name of the tap adapter to open. If name is empty, then the first available tap adapter is opened. */ void open(const std::string& name = ""); /** * \brief Close the associated descriptor. */ void close() { boost::system::error_code ec; destroy_device(ec); // We do nothing with the error code as errors can happen legitimately. base_tap_adapter::close(); } /** * \brief Close the associated descriptor. * \param ec The error code. */ boost::system::error_code close(boost::system::error_code& ec) { destroy_device(ec); base_tap_adapter::close(ec); return ec; } /** * \brief Set the tap adapter connected state. * \param connected The connected state. */ void set_connected_state(bool connected); /** * \brief Get the IP addresses of the adapter. * \return The IP addresses. */ ip_network_address_list get_ip_addresses(); /** * \brief Configure the tap adapter. * \param configuration The IP configuration. * \warning If a serious error occurs, an exception will be thrown. */ void configure(const configuration_type& configuration); /** * \brief Build a route associated to this tap adapter. * \param route The route. * \return The route. */ posix_routing_table_entry get_route(const ip_route& route) { return { name(), route, 0 }; } /** * \brief Build a DNS server entry associated to this tap adapter. * \param dns_server The DNS server IP address. * \return The DNS server entry. */ posix_dns_servers_manager::dns_server_type get_dns_server(const ip_address& dns_server) { return { name(), dns_server }; } private: void update_mtu_from_device(); void set_device_mtu(size_t _mtu); void set_ip_address_v4(const ipv4_network_address& network_address); void set_ip_address_v6(const ipv6_network_address& network_address); void set_remote_ip_address_v4(const ipv4_network_address& network_address, const boost::asio::ip::address_v4& remote_address); void destroy_device(); void destroy_device(boost::system::error_code& ec); posix_route_manager m_route_manager; }; } #endif /* ASIOTAP_POSIX_TAP_ADAPTER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/route_manager.hpp000066400000000000000000000043731252300335000240040ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file route_manager.hpp * \author Julien KAUFFMANN * \brief A route manager class. */ #ifndef ASIOTAP_ROUTE_MANAGER_HPP #define ASIOTAP_ROUTE_MANAGER_HPP #include "os.hpp" #ifdef WINDOWS #include "windows/windows_route_manager.hpp" #elif defined(UNIX) #include "posix/posix_route_manager.hpp" #endif namespace asiotap { #ifdef WINDOWS typedef windows_route_manager route_manager; #elif defined(UNIX) typedef posix_route_manager route_manager; #endif } #endif /* ASIOTAP_ROUTE_MANAGER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/tap_adapter.hpp000066400000000000000000000043471252300335000234410ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file tap_adapter.hpp * \author Julien KAUFFMANN * \brief The tap adapter class. */ #ifndef ASIOTAP_TAP_ADAPTER_HPP #define ASIOTAP_TAP_ADAPTER_HPP #include "os.hpp" #ifdef WINDOWS #include "windows/windows_tap_adapter.hpp" #elif defined(UNIX) #include "posix/posix_tap_adapter.hpp" #endif namespace asiotap { #ifdef WINDOWS typedef windows_tap_adapter tap_adapter; #elif defined(UNIX) typedef posix_tap_adapter tap_adapter; #endif } #endif /* ASIOTAP_TAP_ADAPTER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/tap_adapter_configuration.hpp000066400000000000000000000050311252300335000263570ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file tap_adapter_configuration.hpp * \author Julien KAUFFMANN * \brief A tap adapter configuration class. */ #ifndef ASIOTAP_TAP_ADAPTER_CONFIGURATION_HPP #define ASIOTAP_TAP_ADAPTER_CONFIGURATION_HPP #include #include #include "types/ip_network_address.hpp" namespace asiotap { struct tap_adapter_configuration { struct ipv4_configuration { boost::optional network_address; boost::optional remote_address; }; struct ipv6_configuration { boost::optional network_address; }; tap_adapter_configuration() : mtu(0) {} size_t mtu; ipv4_configuration ipv4; ipv6_configuration ipv6; }; } #endif /* ASIOTAP_TAP_ADAPTER_CONFIGURATION_HPP */ freelan-2.0/libs/asiotap/include/asiotap/tap_adapter_layer.hpp000066400000000000000000000046071252300335000246340ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file tap_adapter_layer.hpp * \author Julien KAUFFMANN * \brief A tap adapter layer enum. */ #ifndef ASIOTAP_TAP_ADAPTER_LAYER_HPP #define ASIOTAP_TAP_ADAPTER_LAYER_HPP #include #include namespace asiotap { /** * \brief The tap adapter layers. */ enum class tap_adapter_layer { ethernet, ip }; inline std::ostream& operator<<(std::ostream& os, const tap_adapter_layer& value) { switch (value) { case tap_adapter_layer::ethernet: return os << "ethernet"; case tap_adapter_layer::ip: return os << "ip"; } assert(false); return os; } } #endif /* ASIOTAP_TAP_ADAPTER_LAYER_HPP */ freelan-2.0/libs/asiotap/include/asiotap/types/000077500000000000000000000000001252300335000216005ustar00rootroot00000000000000freelan-2.0/libs/asiotap/include/asiotap/types/endpoint.hpp000066400000000000000000000262761252300335000241460ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file endpoint.hpp * \author Julien KAUFFMANN * \brief An endpoint type. */ #ifndef ASIOTAP_ENDPOINT_HPP #define ASIOTAP_ENDPOINT_HPP #include #include #include #include #include "hostname_endpoint.hpp" #include "ip_endpoint.hpp" namespace asiotap { /** * \brief The endpoint type. */ typedef boost::variant endpoint; /** * \brief A visitor that resolves endpoints. */ class endpoint_resolve_visitor : public boost::static_visitor { public: /** * \brief The resolver type. */ typedef boost::asio::ip::udp::resolver resolver; /** * \brief Create a new endpoint_resolve_visitor. * \param _resolver The resolver to use. * \param protocol The protocol to use. * \param flags The flags to use for the resolution. * \param default_service The default service to use. */ endpoint_resolve_visitor(resolver& _resolver, resolver::query::protocol_type protocol, resolver::query::flags flags, const std::string& default_service) : m_resolver(_resolver), m_protocol(protocol), m_flags(flags), m_default_service(default_service) { } /** * \brief Resolve the specified endpoint. * \tparam T The type of the endpoint. * \param ep The endpoint. * \return The resolved endpoint. */ template result_type operator()(const T& ep) const { return resolve(ep, m_resolver, m_protocol, m_flags, m_default_service); } private: resolver& m_resolver; resolver::query::protocol_type m_protocol; resolver::query::flags m_flags; std::string m_default_service; }; /** * \brief A visitor that resolves endpoints asynchronously. */ class endpoint_async_resolve_visitor : public boost::static_visitor<> { public: /** * \brief The resolver type. */ typedef boost::asio::ip::udp::resolver resolver_type; /** * \brief The handler type. */ typedef boost::function handler_type; private: class resolver_handler { public: resolver_handler(boost::shared_ptr _resolver, handler_type _handler) : m_resolver(_resolver), m_handler(_handler) {} void operator()(const boost::system::error_code& ec, resolver_type::iterator it) { m_handler(ec, it); } private: boost::shared_ptr m_resolver; handler_type m_handler; }; public: /** * \brief Create a new endpoint_async_resolve_visitor. * \param _resolver The resolver to use. * \param protocol The protocol to use. * \param flags The flags to use for the resolution. * \param default_service The default service to use. * \param _handler The handler to use. */ endpoint_async_resolve_visitor(boost::shared_ptr _resolver, resolver_type::query::protocol_type protocol, resolver_type::query::flags flags, const std::string& default_service, handler_type _handler) : m_resolver(_resolver), m_protocol(protocol), m_flags(flags), m_default_service(default_service), m_handler(_handler) { } /** * \brief Resolve the specified endpoint. * \tparam T The type of the endpoint. * \param ep The endpoint. * \return The resolved endpoint. */ template void operator()(const T& ep) const { return async_resolve(ep, *m_resolver, m_protocol, m_flags, m_default_service, resolver_handler(m_resolver, m_handler)); } private: boost::shared_ptr m_resolver; resolver_type::query::protocol_type m_protocol; resolver_type::query::flags m_flags; std::string m_default_service; handler_type m_handler; }; /** * \brief A visitor that adds a default port number to a endpoint that doesn't have one. */ class default_port_endpoint_visitor : public boost::static_visitor { public: /** * \brief Create the visitor with a default port number. * \param default_port */ default_port_endpoint_visitor(uint16_t default_port) : m_default_port(default_port) { } /** * \brief Get the endpoint with a default endpoint if needed. * \tparam AddressType The address type. * \param ep The endpoint. * \return The new endpoint. */ template result_type operator()(const base_ip_endpoint& ep) const { if (ep.has_port()) { return ep; } else { return base_ip_endpoint(ep.address(), m_default_port); } } /** * \brief Get the endpoint with a default endpoint if needed. * \param ep The endpoint. * \return The new endpoint. */ result_type operator()(const hostname_endpoint& ep) const { if (!ep.service().empty()) { return ep; } else { return hostname_endpoint(ep.hostname(), boost::lexical_cast(m_default_port)); } } private: uint16_t m_default_port; }; /** * \brief A visitor that fills the IP address part of a endpoint if is null. */ template class default_ip_endpoint_visitor : public boost::static_visitor { public: /** * \brief Create the visitor with a default IP address. * \param default_ip */ default_ip_endpoint_visitor(const AddressType& default_ip) : m_default_ip(default_ip) { } /** * \brief Get the endpoint with a default endpoint if needed. * \tparam AddressType The address type. * \param ep The endpoint. * \return The new endpoint. */ result_type operator()(const base_ip_endpoint& ep) const { if (ep.has_null_address()) { if (ep.has_port()) { return base_ip_endpoint(m_default_ip, ep.port()); } else { return base_ip_endpoint(m_default_ip); } } else { return ep; } } /** * \brief Get the endpoint with a default endpoint if needed. * \tparam AddressType The address type. * \param ep The endpoint. * \return The new endpoint. */ template result_type operator()(const base_ip_endpoint& ep) const { return ep; } /** * \brief Get the endpoint with a default endpoint if needed. * \param ep The endpoint. * \return The new endpoint. */ result_type operator()(const hostname_endpoint& ep) const { return ep; } private: AddressType m_default_ip; }; /** * \brief A visitor that checks if the endpoint is complete. */ class is_endpoint_complete_visitor : public boost::static_visitor { public: /** * \brief Check if the endpoint is complete. * \tparam AddressType The address type. * \param ep The endpoint. * \return The validity state. */ template result_type operator()(const base_ip_endpoint& ep) const { return (!ep.has_null_address() && ep.has_port()); } /** * \brief Check if the endpoint is complete. * \tparam AddressType The address type. * \param ep The endpoint. * \return The validity state. */ result_type operator()(const hostname_endpoint& ep) const { return (!ep.service().empty()); } }; /** * \brief Read an endpoint from an input stream. * \param is The input stream. * \param value The value. * \return is. */ std::istream& operator>>(std::istream& is, endpoint& value); /** * \brief Compare two endpoints. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two endpoints are different. */ inline bool operator!=(const endpoint& lhs, const endpoint& rhs) { return !(lhs == rhs); } /** * \brief Get an endpoint with a default port. * \param ep The endpoint. * \param default_port The default port. * \return The endpoint with the specified default port if it hadn't one yet. */ inline endpoint get_default_port_endpoint(const endpoint& ep, uint16_t default_port) { return boost::apply_visitor(default_port_endpoint_visitor(default_port), ep); } /** * \brief Get an endpoint with a default IP. * \param ep The endpoint. * \param default_ip The default ip. * \return The endpoint with the specified default port if it hadn't one yet. */ template inline endpoint get_default_ip_endpoint(const endpoint& ep, const AddressType& default_ip) { return boost::apply_visitor(default_ip_endpoint_visitor(default_ip), ep); } /** * \brief Get an endpoint with a default IP. * \param ep The endpoint. * \param default_ip The default ip. * \return The endpoint with the specified default port if it hadn't one yet. */ inline endpoint get_default_ip_endpoint(const endpoint& ep, const boost::asio::ip::address& default_ip) { if (default_ip.is_v4()) { return boost::apply_visitor(default_ip_endpoint_visitor(default_ip.to_v4()), ep); } else { return boost::apply_visitor(default_ip_endpoint_visitor(default_ip.to_v6()), ep); } } /** * \brief Check if an endpoint is complete. * \param ep The endpoint. * \param default_ip The default ip. * \return The endpoint completion state. */ inline bool is_endpoint_complete(const endpoint& ep) { return boost::apply_visitor(is_endpoint_complete_visitor(), ep); } } #endif /* ASIOTAP_ENDPOINT_HPP */ freelan-2.0/libs/asiotap/include/asiotap/types/hostname_endpoint.hpp000066400000000000000000000136651252300335000260420ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file hostname_endpoint.hpp * \author Julien KAUFFMANN * \brief A hostname endpoint class. */ #ifndef ASIOTAP_HOSTNAME_ENDPOINT_HPP #define ASIOTAP_HOSTNAME_ENDPOINT_HPP #include #include #include namespace asiotap { /** * \brief A hostname endpoint class. */ class hostname_endpoint { public: /** * \brief Get a null hostname endpoint. * \return A null hostname endpoint. */ static hostname_endpoint null() { return hostname_endpoint(); } /** * \brief The resolver type. */ typedef boost::asio::ip::udp::resolver resolver; /** * \brief The handler type. */ typedef boost::function handler; /** * \brief Create a hostname endpoint. * \param _hostname The hostname component. * \param _service The service component. An empty service indicates that the default service value should be used. */ hostname_endpoint(const std::string& _hostname = "", const std::string& _service = "") : m_hostname(_hostname), m_service(_service) { } /** * \brief Check if the instance is null. * \return true if the instance is null. */ bool is_null() const { return (*this == null()); } /** * \brief Get the hostname. * \return The hostname. */ const std::string& hostname() const { return m_hostname; } /** * \brief Get the service. * \return The service. */ const std::string& service() const { return m_service; } private: std::string m_hostname; std::string m_service; friend bool operator<(const hostname_endpoint& lhs, const hostname_endpoint& rhs) { if (lhs.m_hostname == rhs.m_hostname) { return (lhs.m_service < rhs.m_service); } else { return (lhs.m_hostname < rhs.m_hostname); } } friend bool operator==(const hostname_endpoint& lhs, const hostname_endpoint& rhs) { return (lhs.m_hostname == rhs.m_hostname) && (lhs.m_service == rhs.m_service); } friend bool operator!=(const hostname_endpoint& lhs, const hostname_endpoint& rhs) { return !(lhs == rhs); } }; /** * \brief Perform a host resolution on the endpoint. * \param ep The endpoint to resolve. * \param resolver The resolver to use. * \param protocol The protocol to use. * \param flags The flags to use for the resolution. * \param default_service The default service to use. * \return The endpoint. */ inline boost::asio::ip::udp::endpoint resolve(const hostname_endpoint& ep, hostname_endpoint::resolver& resolver, hostname_endpoint::resolver::protocol_type protocol, hostname_endpoint::resolver::query::flags flags, const std::string& default_service) { hostname_endpoint::resolver::query query(protocol, ep.hostname(), ep.service().empty() ? default_service : ep.service(), flags); return *resolver.resolve(query); } /** * \brief Perform an asynchronous host resolution on the endpoint. * \param ep The endpoint to resolve. * \param resolver The resolver to use. * \param protocol The protocol to use. * \param flags The flags to use for the resolution. * \param default_service The default service to use. * \param handler The handler. */ template inline void async_resolve(const hostname_endpoint& ep, hostname_endpoint::resolver& resolver, hostname_endpoint::resolver::protocol_type protocol, hostname_endpoint::resolver::query::flags flags, const std::string& default_service, ResolveHandler handler) { hostname_endpoint::resolver::query query(protocol, ep.hostname(), ep.service().empty() ? default_service : ep.service(), flags); resolver.async_resolve(query, handler); } /** * \brief Write an endpoint to an output stream. * \param os The output stream. * \param value The value. * \return os. */ std::ostream& operator<<(std::ostream& os, const hostname_endpoint& value); /** * \brief Read an endpoint from an input stream. * \param is The input stream. * \param value The value. * \return is. */ std::istream& operator>>(std::istream& is, hostname_endpoint& value); } #endif /* ASIOTAP_HOSTNAME_ENDPOINT_HPP */ freelan-2.0/libs/asiotap/include/asiotap/types/ip_endpoint.hpp000066400000000000000000000234641252300335000246320ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ip_endpoint.hpp * \author Julien KAUFFMANN * \brief IP endpoint classes. */ #pragma once #include #include #include #include #include #include #include namespace asiotap { /** * \brief A generic IP endpoint template class. */ template class base_ip_endpoint { public: /** * \brief Get a null IP endpoint. * \return A null IP endpoint. */ static base_ip_endpoint null() { return base_ip_endpoint(); } /** * \brief The address type. */ typedef AddressType address_type; /** * \brief The resolver type. */ typedef boost::asio::ip::udp::resolver resolver; /** * \brief The handler type. */ typedef boost::function handler; /** * \brief Create an IP endpoint. */ base_ip_endpoint() {}; /** * \brief Create an IP endpoint. * \param _address The address. */ base_ip_endpoint(const address_type& _address) : m_address(_address) {}; /** * \brief Create an IP endpoint. * \param _address The address. * \param _port The port number. */ base_ip_endpoint(const address_type& _address, boost::optional _port) : m_address(_address), m_port(_port) {}; /** * \brief Check if the instance is null. * \return true if the instance is null. */ bool is_null() const { return (*this == null()); } /** * \brief Check if the ip_endpoint has a null IP address. * \return true if the ip_endpoint has a null IP address. */ bool has_null_address() const { return address().is_unspecified(); } /** * \brief Get the address. * \return The address. */ const address_type& address() const { return m_address; } /** * \brief Check if the ip_endpoint contains a valid port number. * \return true if the ip_endpoint contains a valid port number. */ bool has_port() const { return static_cast(m_port); } /** * \brief Get the port number. * \return The port number. * \warning If has_port() is false, calling port() is undefined behavior. */ uint16_t port() const { return *m_port; } private: address_type m_address; boost::optional m_port; friend bool operator<(const base_ip_endpoint& lhs, const base_ip_endpoint& rhs) { if (lhs.m_address == rhs.m_address) { if (lhs.has_port()) { return (rhs.has_port() && (lhs.port() < rhs.port())); } else { return rhs.has_port(); } } else { return (lhs.m_address < rhs.m_address); } } friend bool operator==(const base_ip_endpoint& lhs, const base_ip_endpoint& rhs) { return (lhs.address() == rhs.address()) && (lhs.m_port == rhs.m_port); } friend bool operator!=(const base_ip_endpoint& lhs, const base_ip_endpoint& rhs) { return !(lhs == rhs); } }; /** * \brief Perform a host resolution on the endpoint. * \tparam AddressType The address type. * \param ep The endpoint to resolve. * \param resolver The resolver to use. * \param protocol The protocol to use. * \param flags The flags to use for the resolution. * \param default_service The default service to use. * \return The endpoint. */ template inline boost::asio::ip::udp::endpoint resolve(const base_ip_endpoint& ep, typename base_ip_endpoint::resolver& resolver, typename base_ip_endpoint::resolver::protocol_type protocol, typename base_ip_endpoint::resolver::query::flags flags, const std::string& default_service) { (void)resolver; (void)protocol; (void)flags; if (ep.has_port()) { return boost::asio::ip::udp::endpoint(ep.address(), ep.port()); } else { return boost::asio::ip::udp::endpoint(ep.address(), boost::lexical_cast(default_service)); } } /** * \brief Perform an asynchronous host resolution on the endpoint. * \tparam AddressType The address type. * \param ep The endpoint to resolve. * \param resolver The resolver to use. * \param protocol The protocol to use. * \param flags The flags to use for the resolution. * \param default_service The default service to use. * \param handler The handler. */ template inline void async_resolve(const base_ip_endpoint& ep, typename base_ip_endpoint::resolver& resolver, typename base_ip_endpoint::resolver::protocol_type protocol, typename base_ip_endpoint::resolver::query::flags flags, const std::string& default_service, typename base_ip_endpoint::handler handler) { try { boost::asio::ip::udp::endpoint result = resolve(ep, resolver, protocol, flags, default_service); auto it = base_ip_endpoint::resolver::iterator::create(result, result.address().to_string(), boost::lexical_cast(result.port())); handler(boost::system::error_code(), it); } catch (boost::system::system_error& ex) { typename base_ip_endpoint::resolver::iterator it; handler(ex.code(), it); } } /** * \brief Write an endpoint to an output stream. * \tparam AddressType The address type. * \param os The output stream. * \param value The value. * \return os. */ template std::ostream& operator<<(std::ostream& os, const base_ip_endpoint& value); /** * \brief Read an endpoint from an input stream. * \tparam AddressType The address type. * \param is The input stream. * \param value The value. * \return is. */ template std::istream& operator>>(std::istream& is, base_ip_endpoint& value); /** * \brief The IPv4 instantiation. */ typedef base_ip_endpoint ipv4_endpoint; /** * \brief The IPv6 instantiation. */ typedef base_ip_endpoint ipv6_endpoint; /** * \brief The generic IP endpoint. */ typedef boost::variant ip_endpoint; /** * \brief An IP endpoint set. */ typedef std::set ip_endpoint_set; /** * \brief The generic IP address. * * Needs to be a class and not a typedef or ADL won't work. */ class ip_address { private: class to_generic_ip_address_visitor : public boost::static_visitor { public: template result_type operator()(const AddressType& addr) const { return addr; } }; public: typedef boost::variant value_type; ip_address() {} template ip_address(const AnyType& _value) : m_value(_value) {} template ip_address& operator=(const AnyType& _value) { m_value = _value; return *this; } boost::asio::ip::address value() const { return boost::apply_visitor(to_generic_ip_address_visitor(), m_value); } private: friend bool operator<(const ip_address& lhs, const ip_address& rhs) { return (lhs.m_value < rhs.m_value); } friend bool operator==(const ip_address& lhs, const ip_address& rhs) { return (lhs.m_value == rhs.m_value); } value_type m_value; }; /** * \brief Read an IP address from an input stream. * \param is The input stream. * \param value The value. * \return is. */ std::istream& operator>>(std::istream& is, ip_address& value); /** * \brief Write an IP address to an output stream. * \param os The output stream. * \param value The value. * \return os. */ std::ostream& operator<<(std::ostream& os, const ip_address& value); /** * \brief An IP address set. */ typedef std::set ip_address_set; /** * \brief Write an IP address set to an output stream. * \param os The output stream. * \param values The values. * \return os. */ std::ostream& operator<<(std::ostream& os, const ip_address_set& values); } freelan-2.0/libs/asiotap/include/asiotap/types/ip_network_address.hpp000066400000000000000000000423431252300335000262050ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ip_network_address.hpp * \author Julien KAUFFMANN * \brief An IP network address class. */ #ifndef ASIOTAP_IP_NETWORK_ADDRESS_HPP #define ASIOTAP_IP_NETWORK_ADDRESS_HPP #include #include #include #include #include namespace asiotap { /** * \brief A generic IP network address template class. */ template class base_ip_network_address { public: /** * \brief The address type. */ typedef AddressType address_type; /** * \brief Get a null network address. * \return A null network address. */ static base_ip_network_address null() { return base_ip_network_address(); } /** * \brief Get a network address that represents all addresses. * \return A network address. */ static base_ip_network_address any() { return base_ip_network_address(address_type(), 0); } /** * \brief The single address prefix length. */ static const size_t single_address_prefix_length = std::tuple_size::value * 8; /** * \brief Create an IP network address. */ base_ip_network_address() : m_address(), m_prefix_length(single_address_prefix_length) {}; /** * \brief Create an IP network address. * \param _address The address. */ base_ip_network_address(const address_type& _address) : m_address(_address), m_prefix_length(single_address_prefix_length) {}; /** * \brief Create an IP network address. * \param _address The address. * \param _prefix_length The prefix length. */ base_ip_network_address(const address_type& _address, unsigned int _prefix_length) : m_address(_address), m_prefix_length(_prefix_length) {}; /** * \brief Check if the instance is null. * \return true if the instance is null. */ bool is_null() const { return (*this == null()); } /** * \brief Get the address. * \return The address. */ const address_type& address() const { return m_address; } /** * \brief Get the prefix length. * \return The prefix length. */ unsigned int prefix_length() const { return m_prefix_length; } /** * \brief Check if the specified address belongs to the network address. * \param addr The address to check. * \return true if addr belongs to the network address, false otherwise. */ bool has_address(const address_type& addr) const; /** * \brief Check if the specified network address is a subnet of the current network address. * \param addr The network address to check. * \return true if addr belongs to the network address, false otherwise. */ bool has_network(const base_ip_network_address& addr) const; /** * \brief Check if the specified network address represents an unicast address. * \return true if the specified network address represents an unicast address. */ bool is_unicast() const { return (m_prefix_length == single_address_prefix_length); } /** * \brief Get the network address. * \return The network address. */ address_type get_network_address() const; private: address_type m_address; unsigned int m_prefix_length; public: friend bool operator==(const base_ip_network_address& lhs, const base_ip_network_address& rhs) { return (lhs.address() == rhs.address()) && (lhs.prefix_length() == rhs.prefix_length()); } friend bool operator!=(const base_ip_network_address& lhs, const base_ip_network_address& rhs) { return !(lhs == rhs); } friend bool operator<(const base_ip_network_address& lhs, const base_ip_network_address& rhs) { if (lhs.prefix_length() == rhs.prefix_length()) { return (lhs.address() < rhs.address()); } else { // More specific means a higher prefix length. return (lhs.prefix_length() > rhs.prefix_length()); } } }; /** * \brief Write an network address to an output stream. * \tparam AddressType The address type. * \param os The output stream. * \param value The value. * \return os. */ template std::ostream& operator<<(std::ostream& os, const base_ip_network_address& value); /** * \brief Read a network address from an input stream. * \tparam AddressType The address type. * \param is The input stream. * \param value The value. * \return is. */ template std::istream& operator>>(std::istream& is, base_ip_network_address& value); /** * \brief The IPv4 instantiation. */ typedef base_ip_network_address ipv4_network_address; /** * \brief The IPv6 instantiation. */ typedef base_ip_network_address ipv6_network_address; /** * \brief The generic IP type. */ typedef boost::variant ip_network_address; /** * \brief An IPv4 network list type. */ typedef std::vector ipv4_network_address_list; /** * \brief An IPv6 network list type. */ typedef std::vector ipv6_network_address_list; /** * \brief A generic IP network list type. */ typedef std::vector ip_network_address_list; /** * \brief Convert an IP address into a network address. * \param addr The address. * \return The network address. */ inline ip_network_address to_network_address(const boost::asio::ip::address& addr) { if (addr.is_v4()) { return addr.to_v4(); } else { return addr.to_v6(); } } /** * \brief Convert an IP address into a network address. * \param addr The address. * \param prefix_len The prefix length. * \return The network address. */ inline ip_network_address to_network_address(const boost::asio::ip::address& addr, unsigned int prefix_len) { if (addr.is_v4()) { return ipv4_network_address(addr.to_v4(), prefix_len); } else { return ipv6_network_address(addr.to_v6(), prefix_len); } } /** * \brief A visitor that writes ip_network_address to output streams. */ class ip_network_address_output_visitor : public boost::static_visitor { public: /** * \brief Create a new ip_network_address_output_visitor. * \param os The output stream. */ ip_network_address_output_visitor(result_type os) : m_os(os) {} /** * \brief Write the specified ip_network_address. * \tparam T The type of the ip_network_address. * \param ina The ip_network_address. * \return os. */ template result_type operator()(const T& ina) const { return m_os << ina; } private: result_type m_os; }; /** * \brief Write an ip_network_address to an output stream. * \param os The output stream. * \param value The value. * \return os. */ inline std::ostream& operator<<(std::ostream& os, const ip_network_address& value) { return boost::apply_visitor(ip_network_address_output_visitor(os), value); } /** * \brief Read an ip_network_address from an input stream. * \param is The input stream. * \param value The value. * \return is. */ std::istream& operator>>(std::istream& is, ip_network_address& value); /** * \brief A visitor that checks if the ip_network_address contains an address. */ class ip_network_address_has_address_visitor : public boost::static_visitor { public: /** * \brief Create a new ip_network_address_has_address_visitor. * \param addr The address. */ ip_network_address_has_address_visitor(const boost::asio::ip::address& addr) : m_addr(addr) {} /** * \brief Check if the ip_network_address contains an address. * \param ina The ipv4_network_address. * \return os. */ result_type operator()(const ipv4_network_address& ina) const { return (m_addr.is_v4() && ina.has_address(m_addr.to_v4())); } /** * \brief Check if the ip_network_address contains an address. * \param ina The ipv6_network_address. * \return os. */ result_type operator()(const ipv6_network_address& ina) const { return (m_addr.is_v6() && ina.has_address(m_addr.to_v6())); } private: boost::asio::ip::address m_addr; }; /** * \brief Check if an ip_network_address contains an address. * \param ina The base_ip_network_address. * \param addr The address. * \return true if addr is contained in ina. */ template inline bool has_address(const base_ip_network_address& ina, const AddressType& addr) { return ina.has_address(addr); } /** * \brief Check if an ip_network_address contains an address. * \param ina The ip_network_address. * \param addr The address. * \return true if addr is contained in ina. */ template inline bool has_address(const ip_network_address& ina, const AddressType& addr) { return boost::apply_visitor(ip_network_address_has_address_visitor(addr), ina); } /** * \brief A visitor that checks if the ip_network_address contains a network. */ class ip_network_address_has_network_visitor : public boost::static_visitor { private: template class ip_network_address_belongs_to_network_visitor : public boost::static_visitor { public: ip_network_address_belongs_to_network_visitor(const base_ip_network_address& ina) : m_ina(ina) {} template result_type operator()(const Any&) const { return false; } result_type operator()(const base_ip_network_address& addr) const { return m_ina.has_network(addr); } private: base_ip_network_address m_ina; }; public: /** * \brief Create a new ip_network_address_has_network_visitor. * \param addr The address. */ ip_network_address_has_network_visitor(const ip_network_address& addr) : m_addr(addr) {} /** * \brief Default implementation. * \return true if m_addr belongs to ina. */ template result_type operator()(const base_ip_network_address& ina) const { return boost::apply_visitor(ip_network_address_belongs_to_network_visitor(ina), m_addr); } private: ip_network_address m_addr; }; /** * \brief Check if an ip_network_address contains a network. * \param ina The ip_network_address. * \param addr The network address. * \return true if addr is contained in ina. */ template inline bool has_network(const base_ip_network_address& ina, const base_ip_network_address& addr) { return ina.has_network(addr); } /** * \brief Check if an ip_network_address contains a network. * \param ina The ip_network_address. * \param addr The network address. * \return true if addr is contained in ina. */ inline bool has_network(const ip_network_address& ina, const ip_network_address& addr) { return boost::apply_visitor(ip_network_address_has_network_visitor(addr), ina); } /** * \brief A visitor that checks if the ip_network_address is an unicast address. */ class ip_network_address_is_unicast_visitor : public boost::static_visitor { public: /** * \brief Default implementation. * \return false. */ template result_type operator()(const base_ip_network_address& ina) const { return ina.is_unicast(); } }; /** * \brief Check if an ip_network_address is an unicast address. * \param ina The ip_network_address. * \return true if ina is an unicast address. */ template inline bool is_unicast(const base_ip_network_address& ina) { return ina.is_unicast(); } /** * \brief Check if an ip_network_address is an unicast address. * \param ina The ip_network_address. * \return true if ina is an unicast address. */ inline bool is_unicast(const ip_network_address& ina) { return boost::apply_visitor(ip_network_address_is_unicast_visitor(), ina); } /** * \brief A visitor that gets the network address. */ class ip_network_address_get_network_address_visitor : public boost::static_visitor { public: /** * \brief Get the network address of the specified address. * \param ina The base_ip_network_address instance. * \return The network address. */ template result_type operator()(const base_ip_network_address& ina) const { return ina.get_network_address(); } }; /** * \brief Get the network address associated to an address. * \param ina The ip_network_address. * \return The network address. */ inline boost::asio::ip::address get_network_address(const ip_network_address& ina) { return boost::apply_visitor(ip_network_address_get_network_address_visitor(), ina); } /** * \brief Look for an address in a list. * \param begin An iterator to the first element of the list. * \param end An iterator past the last element of the list. * \param addr The address to look for. * \return An iterator to the entry that has the address, or end if no such element exists. */ template NetworkAddressIterator find_address(NetworkAddressIterator begin, NetworkAddressIterator end, const AddressType& addr) { for (; begin != end; ++begin) { if (has_address(*begin, addr)) { break; } } return begin; } /** * \brief Look for an address in a list. * \param begin An iterator to the first element of the list. * \param end An iterator past the last element of the list. * \param addr The address to look for. * \return true if the address was found in the list. */ template inline bool has_address(NetworkAddressIterator begin, NetworkAddressIterator end, const AddressType& addr) { return (find_address(begin, end, addr) != end); } /** * \brief A visitor that gets the IP address. */ class ip_network_address_ip_address_visitor : public boost::static_visitor { public: /** * \brief Get the IP address of the specified ip_network_address. * \tparam T The type of the ip_network_address. * \param ina The ip_network_address. * \return The prefix length. */ template result_type operator()(const T& ina) const { return ina.address(); } }; /** * \brief Get the IP address of a given network address. * \param ina the ip_network_address. * \return The network address IP address. */ inline boost::asio::ip::address to_ip_address(const ip_network_address& ina) { return boost::apply_visitor(ip_network_address_ip_address_visitor(), ina); } /** * \brief A visitor that gets the prefix length. */ class ip_network_address_prefix_len_visitor : public boost::static_visitor { public: /** * \brief Get the prefix length of the specified ip_network_address. * \tparam T The type of the ip_network_address. * \param ina The ip_network_address. * \return The prefix length. */ template result_type operator()(const T& ina) const { return ina.prefix_length(); } }; /** * \brief Get the prefix length of a given network address. * \param ina the ip_network_address. * \return The network address prefix length. */ inline unsigned int to_prefix_length(const ip_network_address& ina) { return boost::apply_visitor(ip_network_address_prefix_len_visitor(), ina); } } #endif /* ASIOTAP_IP_NETWORK_ADDRESS_HPP */ freelan-2.0/libs/asiotap/include/asiotap/types/ip_route.hpp000066400000000000000000000374121252300335000241460ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ip_route.hpp * \author Julien KAUFFMANN * \brief An IP route class. */ #ifndef ASIOTAP_IP_ROUTE_HPP #define ASIOTAP_IP_ROUTE_HPP #include "ip_network_address.hpp" #include namespace asiotap { /** * \brief A generic IP network address template class. */ template class base_ip_route { public: /** * \brief Get a null IP route. * \return A null IP route. */ static base_ip_route null() { return base_ip_route(); } /** * \brief The address type. */ typedef AddressType address_type; /** * \brief The network address type. */ typedef base_ip_network_address ip_network_address_type; /** * \brief Create an IP route. */ base_ip_route() : m_network_address(), m_gateway() {}; /** * \brief Create an IP route. * \param _network_address The network address. */ base_ip_route(const ip_network_address_type& _network_address) : m_network_address(_network_address), m_gateway() {}; /** * \brief Create an IP network address. * \param _network_address The network address. * \param _gateway The gateway. */ base_ip_route(const ip_network_address_type& _network_address, boost::optional _gateway) : m_network_address(_network_address), m_gateway(_gateway) {}; /** * \brief Check if the instance is null. * \return true if the instance is null. */ bool is_null() const { return (*this == null()); } /** * \brief Get the network address. * \return The network address. */ const ip_network_address_type& network_address() const { return m_network_address; } /** * \brief Get the gateway. * \return The gateway. */ const boost::optional& gateway() const { return m_gateway; } /** * \brief Check if the specified address belongs to the route. * \param addr The address to check. * \return true if addr belongs to the route, false otherwise. */ bool has_address(const address_type& addr) const { return m_network_address.has_address(addr); } /** * \brief Check if the specified network address is a subnet of the current route. * \param addr The network address to check. * \return true if addr belongs to the route, false otherwise. */ template bool has_network(const base_ip_network_address& addr) const { return m_network_address.has_network(addr); } /** * \brief Check if the specified network address represents an unicast address. * \return true if the specified network address represents an unicast address. */ bool is_unicast() const { return m_network_address.is_unicast(); } private: ip_network_address_type m_network_address; boost::optional m_gateway; public: friend bool operator==(const base_ip_route& lhs, const base_ip_route& rhs) { return (lhs.network_address() == rhs.network_address()) && (lhs.gateway() == rhs.gateway()); } friend bool operator!=(const base_ip_route& lhs, const base_ip_route& rhs) { return !(lhs == rhs); } friend bool operator<(const base_ip_route& lhs, const base_ip_route& rhs) { if (lhs.network_address() == rhs.network_address()) { return (lhs.gateway() < rhs.gateway()); } else { return (lhs.network_address() < rhs.network_address()); } } }; /** * \brief Write an IP route to an output stream. * \tparam AddressType The address type. * \param os The output stream. * \param value The value. * \return os. */ template std::ostream& operator<<(std::ostream& os, const base_ip_route& value); /** * \brief Read an IP route from an input stream. * \tparam AddressType The address type. * \param is The input stream. * \param value The value. * \return is. */ template std::istream& operator>>(std::istream& is, base_ip_route& value); /** * \brief The IPv4 instantiation. */ typedef base_ip_route ipv4_route; /** * \brief The IPv6 instantiation. */ typedef base_ip_route ipv6_route; /** * \brief The generic IP type. */ typedef boost::variant ip_route; /** * \brief An IPv4 route list type. */ typedef std::vector ipv4_route_list; /** * \brief An IPv6 route list type. */ typedef std::vector ipv6_route_list; /** * \brief A generic IP route list type. */ typedef std::vector ip_route_list; /** * \brief Convert an IP address into an IP route. * \param addr The address. * \return The IP route. */ inline ip_route to_ip_route(const boost::asio::ip::address& addr) { if (addr.is_v4()) { return ip_network_address(addr.to_v4()); } else { return ip_network_address(addr.to_v6()); } } /** * \brief Convert an IP address into an IP route. * \param addr The address. * \param prefix_len The prefix length. * \return The IP route. */ inline ip_route to_ip_route(const boost::asio::ip::address& addr, unsigned int prefix_len) { if (addr.is_v4()) { return ipv4_network_address(addr.to_v4(), prefix_len); } else { return ipv6_network_address(addr.to_v6(), prefix_len); } } /** * \brief Convert an IP address into an IP route. * \param addr The address. * \param prefix_len The prefix length. * \param gateway The gateway. * \return The IP route. */ inline ip_route to_ip_route(const boost::asio::ip::address& addr, unsigned int prefix_len, const boost::asio::ip::address& gateway) { // Make sure the address and the gateway belong to the same family. assert(addr.is_v4() == gateway.is_v4()); if (addr.is_v4()) { return ipv4_route(ipv4_network_address(addr.to_v4(), prefix_len), gateway.to_v4()); } else { return ipv6_route(ipv6_network_address(addr.to_v6(), prefix_len), gateway.to_v6()); } } /** * \brief Convert an IP address into an IP route. * \param addr The address. * \param prefix_len The prefix length. * \param gateway The gateway. * \return The IP route. */ inline ip_route to_ip_route(const ip_network_address& ina, const boost::optional& gateway) { const auto addr = get_network_address(ina); const auto prefix_len = to_prefix_length(ina); if (gateway) { return to_ip_route(addr, prefix_len, *gateway); } else { return to_ip_route(addr, prefix_len); } } /** * \brief A visitor that writes ip_route to output streams. */ class ip_route_output_visitor : public boost::static_visitor { public: /** * \brief Create a new ip_network_address_output_visitor. * \param os The output stream. */ ip_route_output_visitor(result_type os) : m_os(os) {} /** * \brief Write the specified ip_route. * \tparam T The type of the ip_route. * \param ir The ip_route. * \return os. */ template result_type operator()(const T& ir) const { return m_os << ir; } private: result_type m_os; }; /** * \brief Write an ip_route to an output stream. * \param os The output stream. * \param value The value. * \return os. */ inline std::ostream& operator<<(std::ostream& os, const ip_route& value) { return boost::apply_visitor(ip_route_output_visitor(os), value); } /** * \brief Read an ip_route from an input stream. * \param is The input stream. * \param value The value. * \return is. */ std::istream& operator>>(std::istream& is, ip_route& value); /** * \brief A visitor that checks if the ip_route contains an address. */ class ip_route_has_address_visitor : public boost::static_visitor { public: /** * \brief Create a new ip_route_has_address_visitor. * \param addr The address. */ ip_route_has_address_visitor(const boost::asio::ip::address& addr) : m_addr(addr) {} /** * \brief Check if the ip_route contains an address. * \param ir The ipv4_route. * \return os. */ result_type operator()(const ipv4_route& ir) const { return (m_addr.is_v4() && ir.has_address(m_addr.to_v4())); } /** * \brief Check if the ip_route contains an address. * \param ir The ipv6_route. * \return os. */ result_type operator()(const ipv6_route& ir) const { return (m_addr.is_v6() && ir.has_address(m_addr.to_v6())); } private: boost::asio::ip::address m_addr; }; /** * \brief Check if an ip_route contains an address. * \param ir The base_ip_route. * \param addr The address. * \return true if addr is contained in ir. */ template inline bool has_address(const base_ip_route& ir, const AddressType& addr) { return ir.has_address(addr); } /** * \brief Check if an ip_route contains an address. * \param ir The ip_route. * \param addr The address. * \return true if addr is contained in ir. */ template inline bool has_address(const ip_route& ir, const AddressType& addr) { return boost::apply_visitor(ip_route_has_address_visitor(addr), ir); } /** * \brief A visitor that checks if the ip_route contains a network. */ class ip_route_has_network_visitor : public boost::static_visitor { private: template class ip_route_belongs_to_network_visitor : public boost::static_visitor { public: ip_route_belongs_to_network_visitor(const base_ip_route& ir) : m_ir(ir) {} template result_type operator()(const Any&) const { return false; } result_type operator()(const base_ip_network_address& addr) const { return m_ir.has_network(addr); } private: base_ip_route m_ir; }; public: /** * \brief Create a new ip_route_has_network_visitor. * \param addr The address. */ ip_route_has_network_visitor(const ip_network_address& addr) : m_addr(addr) {} /** * \brief Default implementation. * \return true if m_addr belongs to ir. */ template result_type operator()(const base_ip_route& ir) const { return boost::apply_visitor(ip_route_belongs_to_network_visitor(ir), m_addr); } private: ip_network_address m_addr; }; /** * \brief Check if an ip_route contains a network. * \param ir The ip_route. * \param addr The network address. * \return true if addr is contained in ir. */ template inline bool has_network(const base_ip_route& ir, const base_ip_network_address& addr) { return ir.has_network(addr); } /** * \brief Check if an ip_network_address contains a network. * \param ir The ip_network_address. * \param addr The network address. * \return true if addr is contained in ir. */ inline bool has_network(const ip_route& ir, const ip_network_address& addr) { return boost::apply_visitor(ip_route_has_network_visitor(addr), ir); } /** * \brief A visitor that checks if the ip_route is an unicast address. */ class ip_route_is_unicast_visitor : public boost::static_visitor { public: /** * \brief Default implementation. * \return false. */ template result_type operator()(const base_ip_route& ir) const { return ir.is_unicast(); } }; /** * \brief Check if an ip_route is an unicast address. * \param ir The ip_route. * \return true if ir is an unicast address. */ template inline bool is_unicast(const base_ip_route& ir) { return ir.is_unicast(); } /** * \brief Check if an ip_route is an unicast address. * \param ir The ip_route. * \return true if ir is an unicast address. */ inline bool is_unicast(const ip_route& ir) { return boost::apply_visitor(ip_route_is_unicast_visitor(), ir); } /** * \brief A visitor that gets the network address. */ class ip_route_network_address_visitor : public boost::static_visitor { public: /** * \brief Get the network address of the specified address. * \param ir The base_ip_route instance. * \return The network address. */ template result_type operator()(const base_ip_route& ir) const { return ir.network_address(); } }; /** * \brief Get the network address associated to an IP route. * \param ir The ip_route. * \return The network address. */ inline ip_network_address network_address(const ip_route& ir) { return boost::apply_visitor(ip_route_network_address_visitor(), ir); } /** * \brief A visitor that gets the gateway. */ class ip_route_gateway_visitor : public boost::static_visitor> { public: /** * \brief Get the gateway of the specified ip_route. * \tparam T The type of the ip_route. * \param ir The ip_route. * \return The gateway. */ template result_type operator()(const T& ir) const { if (ir.gateway()) { return boost::asio::ip::address(*ir.gateway()); } else { return boost::none; } } }; /** * \brief Get the gateway of a given IP route. * \param ir the ip_route. * \return The gateway. */ inline boost::optional gateway(const ip_route& ir) { return boost::apply_visitor(ip_route_gateway_visitor(), ir); } /** * \brief Check if the given IP route has a gateway. * \param ir the ip_route. * \return True if the IP route has a gateway. */ inline bool has_gateway(const ip_route& ir) { return static_cast(gateway(ir)); } /** * \brief A route set type. */ typedef std::set ip_route_set; /** * \brief Output the routes to a stream. * \param os The output stream. * \param routes The routes to output. * \return os. */ std::ostream& operator<<(std::ostream& os, const ip_route_set& routes); } #endif /* ASIOTAP_IP_ROUTE_HPP */ freelan-2.0/libs/asiotap/include/asiotap/types/stream_operations.hpp000066400000000000000000000103621252300335000260510ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file stream_operations.hpp * \author Julien KAUFFMANN * \brief Stream related functions. */ #ifndef ASIOTAP_STREAM_OPERATIONS_HPP #define ASIOTAP_STREAM_OPERATIONS_HPP #include #include namespace asiotap { /** * \brief Put back some characters in an input stream. * \param is The input stream. * \param str The characters to put back. * \return is. */ std::istream& putback(std::istream& is, const std::string& str); /** * \brief Read an IP address. * \tparam AddressType The address type. * \param is The input stream. * \param ip_address The result address. * \return is. */ template std::istream& read_ip_address(std::istream& is, std::string& ip_address); /** * \brief Read a port number. * \param is The input stream. * \param port The result port. * \return is. */ std::istream& read_port(std::istream& is, std::string& port); /** * \brief Read a prefix length. * \tparam AddressType The address type. * \param is The input stream. * \param prefix_length The result prefix_length. * \return is. */ template std::istream& read_prefix_length(std::istream& is, std::string& prefix_length); /** * \brief Read a hostname. * \param is The input stream. * \param hostname The result hostname. * \return is. */ std::istream& read_hostname(std::istream& is, std::string& hostname); /** * \brief Read a service string. * \param is The input stream. * \param service The result service. * \return is. */ std::istream& read_service(std::istream& is, std::string& service); /** * \brief Read an IP address and a prefix length. * \tparam AddressType The address type. * \param is The input stream. * \param ip_address The result address. * \param prefix_length The result prefix length. * \return is. */ template std::istream& read_ip_address_prefix_length(std::istream& is, std::string& ip_address, std::string& prefix_length); /** * \brief Read an IP address, a prefix length and a gateway. * \tparam AddressType The address type. * \param is The input stream. * \param ip_address The result address. * \param prefix_length The result prefix length. * \param gateway The result gateway. * \return is. */ template std::istream& read_ip_address_prefix_length_gateway(std::istream& is, std::string& ip_address, std::string& prefix_length, std::string& gateway); } #endif /* ASIOTAP_STREAM_OPERATIONS_HPP */ freelan-2.0/libs/asiotap/include/asiotap/windows/000077500000000000000000000000001252300335000221265ustar00rootroot00000000000000freelan-2.0/libs/asiotap/include/asiotap/windows/netsh.hpp000066400000000000000000000041351252300335000237630ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file netsh.hpp * \author Julien KAUFFMANN * \brief netsh commands. */ #pragma once #include #include namespace asiotap { std::wstring multi_byte_to_wide_char(const std::string& str); #ifdef UNICODE void netsh(const std::vector& args); #else void netsh(const std::vector& args); #endif } freelan-2.0/libs/asiotap/include/asiotap/windows/registry.hpp000066400000000000000000000204151252300335000245110ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file posix_tap_adapter.hpp * \author Julien KAUFFMANN * \brief The POSIX tap adapter class. */ #ifndef ASIOTAP_WINDOWS_REGISTRY_HPP #define ASIOTAP_WINDOWS_REGISTRY_HPP #include #include #include #include #include #include #include #include "../error.hpp" namespace asiotap { class registry_key { public: registry_key() : m_key(), m_name() { } registry_key(HKEY hKey, const std::string& name, REGSAM samDesired = KEY_READ) : m_key(), m_name(name) { HKEY key; const LONG status = ::RegOpenKeyExA(hKey, m_name.c_str(), 0, samDesired, &key); if (status != ERROR_SUCCESS) { throw boost::system::system_error(status, boost::system::system_category()); } m_key = key; } registry_key(const registry_key& parent, const std::string& name, REGSAM samDesired = KEY_READ) : registry_key(parent.native_handle(), name, samDesired) { } ~registry_key() { if (m_key) { ::RegCloseKey(*m_key); } } registry_key(const registry_key&) = delete; registry_key& operator=(const registry_key&) = delete; registry_key(registry_key&& other) throw() : m_key(other.m_key), m_name(other.m_name) { other.m_key.reset(); other.m_name.clear(); } registry_key& operator=(registry_key&& other) throw() { using std::swap; swap(m_key, other.m_key); return *this; } bool is_open() const { return static_cast(m_key); } HKEY native_handle() const { return *m_key; } const std::string& name() const { return m_name; } void query_value(const std::string& value_name, DWORD& type, void* buf, size_t& buflen, boost::system::error_code& ec) const { DWORD data_len = static_cast(buflen); const LONG status = ::RegQueryValueExA(native_handle(), value_name.c_str(), NULL, &type, static_cast(buf), &data_len); buflen = static_cast(data_len); if (status != ERROR_SUCCESS) { ec = boost::system::error_code(status, boost::system::system_category()); return; } } std::string query_string(const std::string& value_name, boost::system::error_code& ec) const { boost::array value; DWORD type = REG_NONE; size_t value_size = value.size(); query_value(value_name, type, value.data(), value_size, ec); if (ec) { return std::string(); } if (type != REG_SZ) { ec = make_error_code(asiotap_error::invalid_type); } return std::string(value.begin(), value.begin() + value_size - 1); } std::string query_string(const std::string& value_name) const { boost::system::error_code ec; const std::string result = query_string(value_name, ec); if (ec) { throw boost::system::system_error(ec); } return result; } boost::filesystem::path query_path(const std::string& value_name, boost::system::error_code& ec) const { boost::array value; DWORD type = REG_NONE; size_t value_size = value.size(); query_value(value_name, type, value.data(), value_size, ec); if (ec) { return std::string(); } if (type != REG_SZ) { ec = make_error_code(asiotap_error::invalid_type); } return boost::filesystem::path(value.begin(), value.begin() + value_size - 1); } boost::filesystem::path query_path(const std::string& value_name) const { boost::system::error_code ec; const boost::filesystem::path result = query_path(value_name, ec); if (ec) { throw boost::system::system_error(ec); } return result; } registry_key operator[](size_t index) const { boost::array name; DWORD name_size = static_cast(name.size()); const LONG status = ::RegEnumKeyExA(native_handle(), static_cast(index), name.data(), &name_size, NULL, NULL, NULL, NULL); switch (status) { case ERROR_SUCCESS: { try { return registry_key(*this, std::string(name.begin(), name.begin() + name_size)); } catch (const boost::system::system_error&) { return registry_key(); } } case ERROR_NO_MORE_ITEMS: { return registry_key(); } default: { throw boost::system::system_error(status, boost::system::system_category()); } } } size_t size() const { DWORD count = 0; const LONG status = ::RegQueryInfoKey(native_handle(), NULL, NULL, NULL, &count, NULL, NULL, NULL, NULL, NULL, NULL, NULL); if (status != ERROR_SUCCESS) { throw boost::system::system_error(status, boost::system::system_category()); } return static_cast(count); } class const_iterator : public std::iterator { public: const_iterator operator++(int) { const const_iterator result = *this; ++m_index; return result; } const_iterator& operator++() { m_index++; return *this; } value_type operator*() const { return m_key[m_index]; } private: const_iterator(const registry_key& key, size_t index) : m_key(key), m_index(index) { } friend bool operator<(const const_iterator& lhs, const const_iterator& rhs) { assert(&lhs.m_key == &rhs.m_key); return (lhs.m_index < rhs.m_index); } friend bool operator==(const const_iterator& lhs, const const_iterator& rhs) { assert(&lhs.m_key == &rhs.m_key); return (lhs.m_index == rhs.m_index); } friend bool operator!=(const const_iterator& lhs, const const_iterator& rhs) { assert(&lhs.m_key == &rhs.m_key); return (lhs.m_index != rhs.m_index); } const registry_key& m_key; size_t m_index; friend class registry_key; }; class available_keys_range { public: const_iterator begin() const { return const_iterator(m_key, 0); } const_iterator end() const { return const_iterator(m_key, m_key.size()); } private: available_keys_range(const registry_key& key) : m_key(key) {} const registry_key& m_key; friend class registry_key; }; available_keys_range available_keys() const { return available_keys_range(*this); } private: boost::optional m_key; std::string m_name; }; } #endif /* ASIOTAP_WINDOWS_REGISTRY_HPP */ freelan-2.0/libs/asiotap/include/asiotap/windows/windows_dns_servers_manager.hpp000066400000000000000000000050251252300335000304420ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file windows_dns_servers_manager.hpp * \author Julien KAUFFMANN * \brief The Windows DNS servers manager class. */ #pragma once #include "../base_dns_servers_manager.hpp" #include #include namespace asiotap { class windows_dns_servers_manager : public base_dns_servers_manager { public: explicit windows_dns_servers_manager(boost::asio::io_service& io_service_) : base_dns_servers_manager(io_service_) { } protected: void register_dns_server(const dns_server_type& dns_server); void unregister_dns_server(const dns_server_type& dns_server); std::map m_references; friend class base_dns_servers_manager; }; } freelan-2.0/libs/asiotap/include/asiotap/windows/windows_route_manager.hpp000066400000000000000000000070501252300335000272430ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file windows_route_manager.hpp * \author Julien KAUFFMANN * \brief The Windaps route manager class. */ #pragma once #include "../base_route_manager.hpp" #include #include #include #include "../os.hpp" #include "../types/ip_route.hpp" // These are not provided by Microsoft, so we implement them. inline bool operator==(const NET_LUID& lhs, const NET_LUID& rhs) { return (lhs.Value == rhs.Value); } inline bool operator<(const NET_LUID& lhs, const NET_LUID& rhs) { return (lhs.Value < rhs.Value); } inline std::ostream& operator<<(std::ostream& os, const NET_LUID& value) { return os << "Network interface #" << value.Info.NetLuidIndex; } namespace asiotap { typedef base_routing_table_entry windows_routing_table_entry; class windows_route_manager : public base_route_manager { public: explicit windows_route_manager(boost::asio::io_service& io_service_) : base_route_manager(io_service_) { } void netsh_interface_ip_set_address(const std::string& interface_name, const ip_network_address& address, bool persistent = false); windows_route_manager::route_type get_route_for(const boost::asio::ip::address& host); void register_route(const NET_LUID& interface_luid, const ip_route& route, unsigned int metric); void unregister_route(const NET_LUID& interface_luid, const ip_route& route, unsigned int metric); void set_unicast_address(const NET_LUID& interface_luid, const ip_network_address& network_address); protected: void register_route(const route_type& route_entry); void unregister_route(const route_type& route_entry); friend class base_route_manager; }; } freelan-2.0/libs/asiotap/include/asiotap/windows/windows_tap_adapter.hpp000066400000000000000000000127611252300335000267040ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file windows_tap_adapter.hpp * \author Julien KAUFFMANN * \brief The Windaps tap adapter class. */ #ifndef ASIOTAP_WINDOWS_TAP_ADAPTER_HPP #define ASIOTAP_WINDOWS_TAP_ADAPTER_HPP #include "../base_tap_adapter.hpp" #include "windows_route_manager.hpp" #include "windows_dns_servers_manager.hpp" #include #include #include namespace asiotap { class windows_tap_adapter : public base_tap_adapter { public: /** * \brief Enumerate the tap adapters available on the system. * \param _layer The layer of the adapters to list. * \return A map of the tap adapter identifiers with their names. */ static std::map enumerate(tap_adapter_layer _layer); /** * \brief Create a new tap adapter. * \param _io_service The io_service to attach to. * \param _layer The layer of the tap adapter. */ windows_tap_adapter(boost::asio::io_service& _io_service, tap_adapter_layer _layer) : base_tap_adapter(_io_service, _layer), m_route_manager(_io_service), m_display_name(), m_interface_index(), m_interface_luid() {} windows_tap_adapter(const windows_tap_adapter&) = delete; windows_tap_adapter& operator=(const windows_tap_adapter&) = delete; /** * \brief Get the associated network manager. * \return The associated network manager. */ windows_route_manager& network_manager() { return m_route_manager; } /** * \brief Get the device display name. * \return The device display name. */ const std::string& display_name() const { return m_display_name; } /** * \brief Open the first available tap adapter. * \param ec The error code. */ void open(boost::system::error_code& ec); /** * \brief Open the tap adapter. * \param name The name of the tap adapter to open. * \param ec The error code. */ void open(const std::string& name, boost::system::error_code& ec); /** * \brief Open the tap adapter. * \param name The name of the tap adapter to open. If name is empty, then the first available tap adapter is opened. */ void open(const std::string& name = ""); /** * \brief Set the tap adapter connected state. * \param connected The connected state. */ void set_connected_state(bool connected); /** * \brief Get the IP addresses of the adapter. * \return The IP addresses. */ ip_network_address_list get_ip_addresses(); /** * \brief Configure the tap adapter. * \param configuration The IP configuration. * \warning If a serious error occurs, an exception will be thrown. */ void configure(const configuration_type& configuration); /** * \brief Build a route associated to this tap adapter. * \param route The route. * \return The route. */ windows_routing_table_entry get_route(const ip_route& route) { return { m_interface_luid, route, 0 }; } /** * \brief Build a DNS server entry associated to this tap adapter. * \param dns_server The DNS server IP address. * \return The DNS server entry. */ windows_dns_servers_manager::dns_server_type get_dns_server(const ip_address& dns_server) { return { m_display_name, dns_server }; } /** * \brief Set the metric of the interface. * \param metric The metric of the interface. */ void set_metric(unsigned int metric); private: windows_route_manager m_route_manager; std::string m_display_name; NET_IFINDEX m_interface_index; NET_LUID m_interface_luid; friend std::ostream& operator<<(std::ostream& os, const windows_tap_adapter& value) { return os << value.display_name(); } }; } #endif /* ASIOTAP_WINDOWS_TAP_ADAPTER_HPP */ freelan-2.0/libs/asiotap/libasiotap.vcxproj000066400000000000000000000523151252300335000211230ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {9173624C-FFF7-4431-BB4A-FC30B13AD742} Win32Proj libasiotap StaticLibrary true v120 Unicode StaticLibrary true v120 Unicode StaticLibrary false v120 true Unicode StaticLibrary false v120 true Unicode $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ ClCompile $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ ClCompile $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ ClCompile $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ ClCompile Level3 Disabled USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;DEBUG;TAP_ID="tap0901";_WIN32_WINNT=0x0600;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\asiotap 4996;4396;4267 Windows true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 Disabled USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;DEBUG;TAP_ID="tap0901";_WIN32_WINNT=0x0600;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\asiotap 4996;4396;4267 Windows true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 MaxSpeed true true USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;TAP_ID="tap0901";_WIN32_WINNT=0x0600;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\asiotap 4996;4396;4267 Windows true true true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 MaxSpeed true true USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;TAP_ID="tap0901";_WIN32_WINNT=0x0600;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\asiotap 4996;4396;4267 Windows true true true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template freelan-2.0/libs/asiotap/libasiotap.vcxproj.filters000066400000000000000000000407271252300335000225760ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files freelan-2.0/libs/asiotap/src/000077500000000000000000000000001252300335000161405ustar00rootroot00000000000000freelan-2.0/libs/asiotap/src/arp_builder.cpp000066400000000000000000000063541252300335000211440ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file arp_builder.cpp * \author Julien KAUFFMANN * \brief An ARP frame builder class. */ #include "osi/arp_builder.hpp" #include "osi/arp_helper.hpp" namespace asiotap { namespace osi { size_t builder::write( uint16_t operation, boost::asio::const_buffer sender_hardware_address, boost::asio::ip::address_v4 sender_logical_address, boost::asio::const_buffer target_hardware_address, boost::asio::ip::address_v4 target_logical_address ) const { assert(boost::asio::buffer_size(sender_hardware_address) == ETHERNET_ADDRESS_SIZE); assert(boost::asio::buffer_size(target_hardware_address) == ETHERNET_ADDRESS_SIZE); helper_type helper = get_helper(); helper.set_hardware_type(ETHERNET_HARDWARE_TYPE); helper.set_protocol_type(IP_PROTOCOL_TYPE); helper.set_hardware_address_length(ETHERNET_ADDRESS_SIZE); helper.set_logical_address_length(sizeof(in_addr)); helper.set_operation(operation); memcpy(boost::asio::buffer_cast(helper.sender_hardware_address()), boost::asio::buffer_cast(sender_hardware_address), ETHERNET_ADDRESS_SIZE); helper.set_sender_logical_address(sender_logical_address); memcpy(boost::asio::buffer_cast(helper.target_hardware_address()), boost::asio::buffer_cast(target_hardware_address), ETHERNET_ADDRESS_SIZE); helper.set_target_logical_address(target_logical_address); return sizeof(frame_type) + boost::asio::buffer_size(payload()); } } } freelan-2.0/libs/asiotap/src/arp_filter.cpp000066400000000000000000000043031252300335000207730ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file arp_filter.cpp * \author Julien KAUFFMANN * \brief An ARP filter class. */ #include "osi/arp_filter.hpp" namespace asiotap { namespace osi { bool check_frame(const_helper frame) { return ( (frame.protocol_type() == IP_PROTOCOL_TYPE) && (frame.hardware_address_length() == ETHERNET_ADDRESS_SIZE) && (frame.logical_address_length() == sizeof(in_addr)) ); } } } freelan-2.0/libs/asiotap/src/arp_frame.cpp000066400000000000000000000036461252300335000206110ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file arp_frame.cpp * \author Julien KAUFFMANN * \brief An ARP frame structure. */ #include "osi/arp_frame.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/arp_helper.cpp000066400000000000000000000036451252300335000207750ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file arp_helper.cpp * \author Julien KAUFFMANN * \brief An ARP helper class. */ #include "osi/arp_helper.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/arp_proxy.cpp000066400000000000000000000073141252300335000206740ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file arp_proxy.cpp * \author Julien KAUFFMANN * \brief An ARP proxy class. */ #include "osi/arp_proxy.hpp" #include "osi/ethernet_helper.hpp" #include "osi/arp_helper.hpp" #include "osi/ethernet_builder.hpp" #include "osi/arp_builder.hpp" namespace asiotap { namespace osi { boost::optional proxy::process_frame(const_helper ethernet_helper, const_helper arp_helper, boost::asio::mutable_buffer response_buffer) const { if (arp_helper.operation() == ARP_REQUEST_OPERATION) { const entry_map_type::const_iterator entry_it = m_entry_map.find(arp_helper.target_logical_address()); ethernet_address_type eth_addr; bool should_answer = false; if (entry_it != m_entry_map.end()) { eth_addr = entry_it->second; should_answer = true; } else { if (m_arp_request_callback) { should_answer = m_arp_request_callback(arp_helper.target_logical_address(), eth_addr); } } if (should_answer) { size_t payload_size; builder arp_builder(response_buffer); payload_size = arp_builder.write( ARP_REPLY_OPERATION, boost::asio::buffer(eth_addr.data()), arp_helper.target_logical_address(), arp_helper.sender_hardware_address(), arp_helper.sender_logical_address() ); builder ethernet_builder(response_buffer, payload_size); payload_size = ethernet_builder.write( ethernet_helper.sender(), ethernet_helper.target(), ethernet_helper.protocol() ); return boost::make_optional(response_buffer + (boost::asio::buffer_size(response_buffer) - payload_size)); } } return boost::optional(); } } } freelan-2.0/libs/asiotap/src/asiotap.cpp000066400000000000000000000036221252300335000203070ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file asiotap.cpp * \author Julien KAUFFMANN * \brief The global asiotap include file. */ #include "asiotap.hpp" namespace asiotap { } freelan-2.0/libs/asiotap/src/base_tap_adapter.cpp000066400000000000000000000036371252300335000221330ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file base_tap_adapter.cpp * \author Julien KAUFFMANN * \brief The base tap adapter class. */ #include "base_tap_adapter.hpp" namespace asiotap { } freelan-2.0/libs/asiotap/src/bootp_builder.cpp000066400000000000000000000074161252300335000215050ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file bootp_builder.cpp * \author Julien KAUFFMANN * \brief An bootp frame builder class. */ #include "osi/bootp_builder.hpp" #include "osi/bootp_helper.hpp" namespace asiotap { namespace osi { namespace { void boost_asio_buffer_memcpy(boost::asio::mutable_buffer destination, boost::asio::const_buffer source) { const size_t destination_size = boost::asio::buffer_size(destination); uint8_t* const destination_data = boost::asio::buffer_cast(destination); const size_t source_size = boost::asio::buffer_size(source); const uint8_t* const source_data = boost::asio::buffer_cast(source); const size_t copy_cnt = source_size > destination_size ? destination_size : source_size; const size_t left_cnt = destination_size - copy_cnt; memcpy(destination_data, source_data, copy_cnt); memset(destination_data + copy_cnt, 0x00, left_cnt); } } size_t builder::write( uint8_t operation, uint8_t hardware_type, size_t hardware_length, uint8_t hops, uint32_t xid, uint16_t seconds, uint16_t flags, boost::asio::ip::address_v4 ciaddr, boost::asio::ip::address_v4 yiaddr, boost::asio::ip::address_v4 siaddr, boost::asio::ip::address_v4 giaddr, boost::asio::const_buffer chaddr, boost::asio::const_buffer sname, boost::asio::const_buffer file ) const { helper_type helper = get_helper(); helper.set_operation(operation); helper.set_hardware_type(hardware_type); helper.set_hardware_length(hardware_length); helper.set_hops(hops); helper.set_xid(xid); helper.set_seconds(seconds); helper.set_flags(flags); helper.set_ciaddr(ciaddr); helper.set_yiaddr(yiaddr); helper.set_siaddr(siaddr); helper.set_giaddr(giaddr); boost_asio_buffer_memcpy(helper.chaddr(), chaddr); boost_asio_buffer_memcpy(helper.sname(), sname); boost_asio_buffer_memcpy(helper.file(), file); return sizeof(frame_type) + boost::asio::buffer_size(payload()); } } } freelan-2.0/libs/asiotap/src/bootp_filter.cpp000066400000000000000000000036521252300335000213420ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file bootp_filter.cpp * \author Julien KAUFFMANN * \brief A BOOTP filter class. */ #include "osi/bootp_filter.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/bootp_frame.cpp000066400000000000000000000036531252300335000211500ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file bootp_frame.cpp * \author Julien KAUFFMANN * \brief A BOOTP frame structure. */ #include "osi/bootp_frame.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/bootp_helper.cpp000066400000000000000000000036521252300335000213340ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file bootp_helper.cpp * \author Julien KAUFFMANN * \brief A BOOTP helper class. */ #include "osi/bootp_helper.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/builder.cpp000066400000000000000000000036461252300335000203030ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file builder.cpp * \author Julien KAUFFMANN * \brief An OSI frame builder class. */ #include "osi/builder.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/checksum.cpp000066400000000000000000000036501252300335000204520ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file checksum.cpp * \author Julien KAUFFMANN * \brief Checksum related functions. */ #include "osi/checksum.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/checksum_helper.cpp000066400000000000000000000052241252300335000220100ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file checksum_helper.cpp * \author Julien KAUFFMANN * \brief Checksum helper class. */ #include "osi/checksum_helper.hpp" namespace asiotap { namespace osi { void checksum_helper::update(const uint16_t* buf, size_t buf_len) { if (buf_len > 0) { if (m_left != 0) { m_checksum += (static_cast(m_left) << 8 | *reinterpret_cast(buf)); buf_len -= sizeof(uint8_t); m_left = 0; } while (buf_len > 1) { m_checksum += *buf++; buf_len -= sizeof(uint16_t); } if (buf_len > 0) { m_left = *reinterpret_cast(buf); } } } uint32_t checksum_helper::compute() { if (m_left != 0) { m_checksum += m_left; m_left = 0; } while (m_checksum >> 16) { m_checksum = (m_checksum & 0xFFFF) + (m_checksum >> 16); } return static_cast(~m_checksum); } } } freelan-2.0/libs/asiotap/src/complex_filter.cpp000066400000000000000000000036651252300335000216720ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file complex_filter.cpp * \author Julien KAUFFMANN * \brief An OSI complex filter class. */ #include "osi/complex_filter.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/dhcp_builder.cpp000066400000000000000000000100171252300335000212670ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file dhcp_builder.cpp * \author Julien KAUFFMANN * \brief An dhcp frame builder class. */ #include "osi/dhcp_builder.hpp" #include "osi/dhcp_helper.hpp" #include "osi/dhcp_option_helper.hpp" namespace asiotap { namespace osi { namespace { void memcpy(boost::asio::mutable_buffer dst, boost::asio::const_buffer src) { const size_t src_size = boost::asio::buffer_size(src); std::memcpy(boost::asio::buffer_cast(dst), boost::asio::buffer_cast(src), src_size); } void memmove(boost::asio::mutable_buffer dst, boost::asio::const_buffer src) { const size_t src_size = boost::asio::buffer_size(src); std::memmove(boost::asio::buffer_cast(dst), boost::asio::buffer_cast(src), src_size); } } void builder::add_option(dhcp_option::dhcp_option_tag tag) { dhcp_option_helper dhcp_option_helper(buffer() + m_options_offset); dhcp_option_helper.set_tag(tag); ++m_options_offset; } void builder::add_option(dhcp_option::dhcp_option_tag tag, boost::asio::const_buffer value) { dhcp_option_helper dhcp_option_helper(buffer() + m_options_offset); const size_t value_size = boost::asio::buffer_size(value); if (value_size + 2 > boost::asio::buffer_size(buffer() + m_options_offset)) { throw std::runtime_error("Insufficient buffer size"); } dhcp_option_helper.set_tag(tag); dhcp_option_helper.set_length(value_size); memcpy(dhcp_option_helper.value(), value); m_options_offset += dhcp_option_helper.total_length(); } void builder::add_padding(size_t cnt) { if (cnt > boost::asio::buffer_size(buffer() + m_options_offset)) { throw std::runtime_error("Insufficient buffer size"); } std::memset(boost::asio::buffer_cast(buffer() + m_options_offset), static_cast(dhcp_option::pad), cnt); m_options_offset += cnt; } size_t builder::write() const { helper_type helper(buffer() + (boost::asio::buffer_size(buffer()) - m_options_offset - sizeof(frame_type))); helper.set_magic_cookie(DHCP_MAGIC_COOKIE); memmove(helper.options(), boost::asio::buffer(buffer(), m_options_offset)); return boost::asio::buffer_size(helper.buffer()); } } } freelan-2.0/libs/asiotap/src/dhcp_filter.cpp000066400000000000000000000036471252300335000211410ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file dhcp_filter.cpp * \author Julien KAUFFMANN * \brief A DHCP filter class. */ #include "osi/dhcp_filter.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/dhcp_frame.cpp000066400000000000000000000036501252300335000207400ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file dhcp_frame.cpp * \author Julien KAUFFMANN * \brief A DHCP frame structure. */ #include "osi/dhcp_frame.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/dhcp_helper.cpp000066400000000000000000000062431252300335000211260ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file dhcp_helper.cpp * \author Julien KAUFFMANN * \brief A DHCP helper class. */ #include "osi/dhcp_helper.hpp" #include #include namespace asiotap { namespace osi { namespace { template bool has_tag(const dhcp_option_helper helper, dhcp_option::dhcp_option_tag tag) { return helper.tag() == tag; } } template typename _base_helper_impl::const_iterator _base_helper_impl::find(dhcp_option::dhcp_option_tag tag) const { return std::find_if(this->begin(), this->end(), boost::bind(&has_tag, _1, tag)); } template bool _base_helper_impl::check_options() const { return (std::find_if(this->begin(), this->end(), !boost::bind(&dhcp_option_helper::is_valid, _1)) == this->end()); } template _base_helper_impl::const_iterator _base_helper_impl::find(dhcp_option::dhcp_option_tag) const; template _base_helper_impl::const_iterator _base_helper_impl::find(dhcp_option::dhcp_option_tag) const; template bool _base_helper_impl::check_options() const; template bool _base_helper_impl::check_options() const; } } freelan-2.0/libs/asiotap/src/dhcp_option.cpp000066400000000000000000000054221252300335000211550ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file dhcp_option.cpp * \author Julien KAUFFMANN * \brief A DHCP option class. */ #include "osi/dhcp_option.hpp" namespace asiotap { namespace osi { const uint8_t dhcp_option::has_length_map[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }; } } freelan-2.0/libs/asiotap/src/dhcp_option_helper.cpp000066400000000000000000000036741252300335000225230ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file dhcp_option_helper.cpp * \author Julien KAUFFMANN * \brief A DHCP option helper class. */ #include "osi/dhcp_option_helper.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/dhcp_option_helper_iterator.cpp000066400000000000000000000037271252300335000244330ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file dhcp_option_helper_iterator.cpp * \author Julien KAUFFMANN * \brief A DHCP option helper iterator class. */ #include "osi/dhcp_option_helper_iterator.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/dhcp_proxy.cpp000066400000000000000000000222661252300335000210330ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file dhcp_proxy.cpp * \author Julien KAUFFMANN * \brief An DHCP proxy class. */ #include "osi/dhcp_proxy.hpp" #include "osi/ethernet_helper.hpp" #include "osi/ipv4_helper.hpp" #include "osi/udp_helper.hpp" #include "osi/bootp_helper.hpp" #include "osi/dhcp_helper.hpp" #include "osi/ethernet_builder.hpp" #include "osi/ipv4_builder.hpp" #include "osi/udp_builder.hpp" #include "osi/bootp_builder.hpp" #include "osi/dhcp_builder.hpp" #include namespace asiotap { namespace osi { namespace { bool is_bootp_request(const_helper bootp_helper) { return (bootp_helper.operation() == BOOTP_BOOTREQUEST); } bool bootp_is_ethernet(const_helper bootp_helper) { return ((bootp_helper.hardware_type() == BOOTP_HARDWARE_TYPE_ETHERNET) && (bootp_helper.hardware_length() == ETHERNET_ADDRESS_SIZE)); } proxy::ethernet_address_type bootp_get_ethernet_address(const_helper bootp_helper) { proxy::ethernet_address_type result; std::memcpy(result.data(), boost::asio::buffer_cast(bootp_helper.chaddr()), result.size()); return result; } boost::asio::ip::address_v4 prefix_length_to_netmask_v4(unsigned int netmask) { if (netmask <= 0) { return boost::asio::ip::address_v4::any(); } else { if (netmask > 32) { netmask = 32; } uint32_t numeric_netmask = (1 << (32 - netmask)) - 1; return boost::asio::ip::address_v4(~numeric_netmask); } } } const boost::posix_time::time_duration proxy::DEFAULT_LEASE_TIME = boost::posix_time::hours(1); boost::optional proxy::process_frame( const_helper ethernet_helper, const_helper ipv4_helper, const_helper udp_helper, const_helper bootp_helper, const_helper dhcp_helper, boost::asio::mutable_buffer response_buffer ) const { // This implementation is partial and far from being perfect. // In a ideal world, there should be some udp_socket and a real (complete) DHCP server implementation. if (is_bootp_request(bootp_helper) && bootp_is_ethernet(bootp_helper)) { const ethernet_address_type ethernet_address_source = bootp_get_ethernet_address(bootp_helper); const entry_map_type::const_iterator entry = m_entry_map.find(ethernet_address_source); // A matching entry was found. if (entry != m_entry_map.end()) { const_helper::const_iterator message_type_option = dhcp_helper.find(dhcp_option::dhcp_message_type); if (message_type_option != dhcp_helper.end()) { bool info = false; const_helper::const_iterator requested_ip_address_option = dhcp_helper.find(dhcp_option::requested_ip_address); size_t payload_size; builder dhcp_builder(response_buffer); switch (message_type_option->value_as()) { case DHCP_DISCOVER_MESSAGE: dhcp_builder.add_option(dhcp_option::dhcp_message_type, DHCP_OFFER_MESSAGE); break; case DHCP_REQUEST_MESSAGE: if (requested_ip_address_option != dhcp_helper.end()) { const boost::asio::ip::address_v4 requested_ip_address(ntohl(requested_ip_address_option->value_as())); if (requested_ip_address != entry->second.address) { dhcp_builder.add_option(dhcp_option::dhcp_message_type, DHCP_NEGATIVE_ACKNOWLEDGMENT_MESSAGE); } else { dhcp_builder.add_option(dhcp_option::dhcp_message_type, DHCP_ACKNOWLEDGMENT_MESSAGE); } } else { dhcp_builder.add_option(dhcp_option::dhcp_message_type, DHCP_NEGATIVE_ACKNOWLEDGMENT_MESSAGE); } break; case DHCP_INFORMATIONAL_MESSAGE: dhcp_builder.add_option(dhcp_option::dhcp_message_type, DHCP_ACKNOWLEDGMENT_MESSAGE); info = true; break; } dhcp_builder.add_option(dhcp_option::server_identifier, boost::asio::buffer(m_software_address.to_bytes())); if (!info) { const uint32_t lease_time = htonl(m_lease_time.total_seconds()); dhcp_builder.add_option(dhcp_option::ip_address_lease_time, &lease_time, sizeof(lease_time)); } BOOST_FOREACH(dhcp_option_helper& dhcp_option_helper, dhcp_helper) { switch (dhcp_option_helper.tag()) { case dhcp_option::parameter_request_list: if (dhcp_option_helper.has_length()) { const uint8_t* options = boost::asio::buffer_cast(dhcp_option_helper.value()); const size_t options_count = boost::asio::buffer_size(dhcp_option_helper.value()); for (size_t i = 0; i < options_count; ++i) { switch (static_cast(options[i])) { case dhcp_option::subnet_mask: dhcp_builder.add_option(dhcp_option::subnet_mask, boost::asio::buffer(prefix_length_to_netmask_v4(entry->second.prefix_length).to_bytes())); break; default: break; } } } break; default: break; } } dhcp_builder.add_option(dhcp_option::end); dhcp_builder.complete_padding(60); payload_size = dhcp_builder.write(); builder bootp_builder(response_buffer, payload_size); payload_size = bootp_builder.write( BOOTP_BOOTREPLY, bootp_helper.hardware_type(), bootp_helper.hardware_length(), bootp_helper.hops(), bootp_helper.xid(), bootp_helper.seconds(), bootp_helper.flags(), boost::asio::ip::address_v4::any(), info ? boost::asio::ip::address_v4::any() : entry->second.address, m_software_address, boost::asio::ip::address_v4::any(), boost::asio::buffer(entry->first), boost::asio::const_buffer(NULL, 0), boost::asio::const_buffer(NULL, 0) ); builder udp_builder(response_buffer, payload_size); payload_size = udp_builder.write(udp_helper.destination(), udp_helper.source()); builder ipv4_builder(response_buffer, payload_size); payload_size = ipv4_builder.write( ipv4_helper.tos(), ipv4_helper.identification(), ipv4_helper.flags(), ipv4_helper.position_fragment(), ipv4_helper.ttl(), ipv4_helper.protocol(), m_software_address, ipv4_helper.source() ); udp_builder.update_checksum(ipv4_builder.get_helper()); builder ethernet_builder(response_buffer, payload_size); payload_size = ethernet_builder.write(ethernet_helper.sender(), boost::asio::buffer(m_hardware_address), ethernet_helper.protocol()); return boost::make_optional(response_buffer + (boost::asio::buffer_size(response_buffer) - payload_size)); } } } return boost::optional(); } } } freelan-2.0/libs/asiotap/src/endpoint.cpp000066400000000000000000000044501252300335000204670ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file endpoint.cpp * \author Julien KAUFFMANN * \brief An endpoint type. */ #include "types/endpoint.hpp" namespace asiotap { std::istream& operator>>(std::istream& is, endpoint& value) { if (is) { ipv6_endpoint ep; if (is >> ep) { value = ep; return is; } is.clear(); } if (is) { ipv4_endpoint ep; if (is >> ep) { value = ep; return is; } is.clear(); } if (is) { hostname_endpoint ep; if (is >> ep) { value = ep; return is; } } return is; } } freelan-2.0/libs/asiotap/src/error.cpp000066400000000000000000000064511252300335000200030ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file error.cpp * \author Julien Kauffmann * \brief The errors. */ #include "error.hpp" namespace asiotap { const boost::system::error_category& asiotap_category() { static asiotap_category_impl instance; return instance; } const char* asiotap_category_impl::name() const throw() { return "asiotap::error"; } std::string asiotap_category_impl::message(int ev) const { switch (static_cast(ev)) { case asiotap_error::success: { return "Success"; } case asiotap_error::invalid_tap_adapter_layer: { return "The TAP adapter doesn't operate on the required layer"; } case asiotap_error::invalid_type: { return "The value has an invalid type"; } case asiotap_error::no_such_tap_adapter: { return "No TAP adapter found which has the specified name"; } case asiotap_error::no_ethernet_address: { return "No ethernet address"; } case asiotap_error::process_handle_expected: { return "A process handle was expected"; } case asiotap_error::external_process_output_parsing_error: { return "Unable to parse the output of the external process"; } case asiotap_error::invalid_ip_configuration: { return "The specified IP configuration is invalid"; } case asiotap_error::external_process_execution_failed: { return "The execution of the external process failed"; } case asiotap_error::no_dns_script_provided: { return "No DNS script was provided"; } default: { return "Unknown asiotap error"; } } } } freelan-2.0/libs/asiotap/src/ethernet_address.cpp000066400000000000000000000130631252300335000221720ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ethernet_address.cpp * \author Julien KAUFFMANN * \brief An Ethernet address class. */ #include "osi/ethernet_address.hpp" #include #include #include namespace asiotap { namespace osi { namespace { std::istream& putback(std::istream& is, const char* data, size_t data_len) { std::ios::iostate state = is.rdstate(); is.clear(); std::for_each(data, data + data_len, boost::bind(&std::istream::putback, boost::ref(is), _1)); is.setstate(state); return is; } bool is_ethernet_address_separator(char c) { return (c == ':') || (c == '-'); } unsigned int xdigit_to_numeric(char c) { assert(isxdigit(c)); static const char xdigit_map[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; return xdigit_map[static_cast(c)]; } } std::ostream& operator<<(std::ostream& os, const ethernet_address& value) { // This will save the flags and restore them when the function exits. boost::io::ios_flags_saver ifs(os); os << std::hex << std::setfill('0') << std::setw(2); os << static_cast(value.data()[0]); for (size_t i = 1; i < value.data().size(); ++i) { os << ':' << std::setw(2) << static_cast(value.data()[i]); } return os; } std::istream& operator>>(std::istream& is, ethernet_address& value) { static const size_t ethernet_address_string_size = 6 * 2 + 5; char data[ethernet_address_string_size]; if (is.read(data, sizeof(data))) { // We check for separators for (size_t i = 2; i < sizeof(data); i += 3) { if (!is_ethernet_address_separator(data[i])) { putback(is, data, sizeof(data)); is.setstate(std::ios_base::failbit); return is; } } ethernet_address::data_type raw; // We check for digits to be hexadecimal for (size_t i = 0; i < sizeof(data); i += 3) { if (!(isxdigit(data[i]) && isxdigit(data[i + 1]))) { putback(is, data, sizeof(data)); is.setstate(std::ios_base::failbit); return is; } else { raw[i / 3] = (xdigit_to_numeric(data[i]) << 4) | xdigit_to_numeric(data[i + 1]); } } value = ethernet_address(raw); } return is; } } } freelan-2.0/libs/asiotap/src/ethernet_builder.cpp000066400000000000000000000052611252300335000221740ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ethernet_builder.cpp * \author Julien KAUFFMANN * \brief An Ethernet frame builder class. */ #include "osi/ethernet_builder.hpp" #include "osi/ethernet_helper.hpp" namespace asiotap { namespace osi { size_t builder::write( boost::asio::const_buffer target, boost::asio::const_buffer sender, uint16_t protocol ) const { assert(boost::asio::buffer_size(target) == ETHERNET_ADDRESS_SIZE); assert(boost::asio::buffer_size(sender) == ETHERNET_ADDRESS_SIZE); helper_type helper = get_helper(); memcpy(boost::asio::buffer_cast(helper.target()), boost::asio::buffer_cast(target), ETHERNET_ADDRESS_SIZE); memcpy(boost::asio::buffer_cast(helper.sender()), boost::asio::buffer_cast(sender), ETHERNET_ADDRESS_SIZE); helper.set_protocol(protocol); return sizeof(frame_type) + boost::asio::buffer_size(payload()); } } } freelan-2.0/libs/asiotap/src/ethernet_filter.cpp000066400000000000000000000036641252300335000220400ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ethernet_filter.cpp * \author Julien KAUFFMANN * \brief An Ethernet filter class. */ #include "osi/ethernet_filter.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/ethernet_frame.cpp000066400000000000000000000036651252300335000216460ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ethernet_frame.cpp * \author Julien KAUFFMANN * \brief An Ethernet frame structure. */ #include "osi/ethernet_frame.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/ethernet_helper.cpp000066400000000000000000000036641252300335000220320ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ethernet_helper.cpp * \author Julien KAUFFMANN * \brief An Ethernet helper class. */ #include "osi/ethernet_helper.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/filter.cpp000066400000000000000000000036351252300335000201400ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file filter.cpp * \author Julien KAUFFMANN * \brief An OSI filter class. */ #include "osi/filter.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/frame.cpp000066400000000000000000000035631252300335000177450ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file frame.cpp * \author Julien KAUFFMANN * \brief An osi frame structure. */ #include "osi/frame.hpp" freelan-2.0/libs/asiotap/src/helper.cpp000066400000000000000000000036351252300335000201320ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file helper.cpp * \author Julien KAUFFMANN * \brief An OSI helper class. */ #include "osi/helper.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/hostname_endpoint.cpp000066400000000000000000000054171252300335000223710ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file hostname_endpoint.cpp * \author Julien KAUFFMANN * \brief A hostname endpoint class. */ #include "types/hostname_endpoint.hpp" #include "types/stream_operations.hpp" namespace asiotap { namespace { std::istream& read_hostname_service(std::istream& is, std::string& hostname, std::string& service) { if (read_hostname(is, hostname)) { if (is.good() && (is.peek() == ':')) { is.ignore(); if (!read_service(is, service)) { putback(is, hostname + ':'); is.setstate(std::ios_base::failbit); } } } return is; } } std::ostream& operator<<(std::ostream& os, const hostname_endpoint& value) { os << value.hostname(); if (!value.service().empty()) { os << ":" << value.service(); } return os; } std::istream& operator>>(std::istream& is, hostname_endpoint& value) { std::string hostname; std::string service; if (read_hostname_service(is, hostname, service)) { value = hostname_endpoint(hostname, service); } return is; } } freelan-2.0/libs/asiotap/src/icmp_builder.cpp000066400000000000000000000045211252300335000213040ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file icmp_builder.cpp * \author Julien KAUFFMANN * \brief An icmp frame builder class. */ #include "osi/icmp_builder.hpp" #include "osi/icmp_helper.hpp" namespace asiotap { namespace osi { size_t builder::write( uint8_t type, uint8_t code, uint32_t data ) const { helper_type helper = get_helper(); helper.set_type(type); helper.set_code(code); helper.set_data(data); helper.set_checksum(0x0000); helper.set_checksum(helper.compute_checksum()); return sizeof(frame_type) + boost::asio::buffer_size(payload()); } } } freelan-2.0/libs/asiotap/src/icmp_filter.cpp000066400000000000000000000036501252300335000211450ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file icmp_filter.cpp * \author Julien KAUFFMANN * \brief An ICMP filter class. */ #include "osi/icmp_filter.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/icmp_frame.cpp000066400000000000000000000036511252300335000207530ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file icmp_frame.cpp * \author Julien KAUFFMANN * \brief An ICMP frame structure. */ #include "osi/icmp_frame.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/icmp_helper.cpp000066400000000000000000000046731252300335000211450ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file icmp_helper.cpp * \author Julien KAUFFMANN * \brief An ICMP helper class. */ #include "osi/icmp_helper.hpp" #include "osi/checksum.hpp" namespace asiotap { namespace osi { template uint16_t _base_helper_impl::compute_checksum() const { const uint16_t* buf = boost::asio::buffer_cast(this->buffer()); size_t buf_len = boost::asio::buffer_size(this->buffer()); return osi::compute_checksum(buf, buf_len); } template uint16_t _base_helper_impl::compute_checksum() const; template uint16_t _base_helper_impl::compute_checksum() const; } } freelan-2.0/libs/asiotap/src/icmpv6_builder.cpp000066400000000000000000000053331252300335000215620ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ipv6_builder.cpp * \author Julien KAUFFMANN * \brief An IPv6 frame builder class. */ #include "osi/icmpv6_builder.hpp" #include "osi/icmpv6_helper.hpp" namespace asiotap { namespace osi { size_t builder::write( uint8_t type, uint8_t code, bool router_flag, bool solicited_flag, bool override_flag, boost::asio::ip::address_v6 target ) const { helper_type helper = get_helper(); helper.set_type(type); helper.set_code(code); helper.reset_flags(); helper.set_router_flag(router_flag); helper.set_solicited_flag(solicited_flag); helper.set_override_flag(override_flag); helper.set_target(target); return helper.header_length() + boost::asio::buffer_size(payload()); } void builder::update_checksum(const_helper parent_frame) { helper_type helper = get_helper(); helper.set_checksum(0x0000); helper.set_checksum(helper.compute_checksum(parent_frame)); } } } freelan-2.0/libs/asiotap/src/icmpv6_filter.cpp000066400000000000000000000036561252300335000214270ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file icmpv6_filter.cpp * \author Julien KAUFFMANN * \brief An ICMPv6 filter class. */ #include "osi/icmpv6_filter.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/icmpv6_frame.cpp000066400000000000000000000036571252300335000212350ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file icmpv6_frame.cpp * \author Julien KAUFFMANN * \brief An ICMPv6 frame structure. */ #include "osi/icmpv6_frame.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/icmpv6_helper.cpp000066400000000000000000000067541252300335000214230ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file icmpv6_helper.cpp * \author Julien KAUFFMANN * \brief An ICMPv6 helper class. */ #include "osi/icmpv6_helper.hpp" #include "osi/checksum_helper.hpp" namespace asiotap { namespace osi { namespace { icmpv6_ipv6_pseudo_header parent_frame_to_pseudo_header(const_helper parent_frame) { icmpv6_ipv6_pseudo_header pseudo_header = {}; pseudo_header.ipv6_source = parent_frame.frame().source; pseudo_header.ipv6_destination = parent_frame.frame().destination; pseudo_header.upper_layer_length = htonl(parent_frame.payload_length()); pseudo_header.ipv6_next_header = ICMPV6_HEADER; // Must be this value, not the parent frame next-header as it could be different. return pseudo_header; } template uint16_t compute_icmpv6_checksum(const_helper parent_frame, HelperType icmpv6_frame) { const uint16_t* buf = boost::asio::buffer_cast(icmpv6_frame.buffer()); size_t buf_len = boost::asio::buffer_size(icmpv6_frame.buffer()); const auto pseudo_header = parent_frame_to_pseudo_header(parent_frame); checksum_helper chk; chk.update(reinterpret_cast(&pseudo_header), sizeof(pseudo_header)); chk.update(buf, buf_len); return chk.compute(); } } template uint16_t _base_helper_impl::compute_checksum(const_helper parent_frame) const { return compute_icmpv6_checksum(parent_frame, *this); } template uint16_t _base_helper_impl::compute_checksum(const_helper) const; template uint16_t _base_helper_impl::compute_checksum(const_helper) const; } } freelan-2.0/libs/asiotap/src/icmpv6_proxy.cpp000066400000000000000000000076671252300335000213310ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file icmpv6_proxy.cpp * \author Julien KAUFFMANN * \brief An ICMPv6 proxy class. */ #include "osi/icmpv6_proxy.hpp" #include "osi/ipv6_helper.hpp" #include "osi/icmpv6_helper.hpp" #include "osi/ipv6_builder.hpp" #include "osi/icmpv6_builder.hpp" namespace asiotap { namespace osi { boost::optional proxy::process_frame(const_helper ipv6_helper, const_helper icmpv6_helper, boost::asio::mutable_buffer response_buffer) const { if (icmpv6_helper.type() == ICMPV6_NEIGHBOR_SOLICITATION) { ethernet_address_type eth_addr; bool should_answer = false; if (m_neighbor_solicitation_callback) { should_answer = m_neighbor_solicitation_callback(icmpv6_helper.target(), eth_addr); } if (should_answer) { // We hardcode the structure for the ICMPv6 option because it just works. size_t payload_size = 8; uint8_t* const target_link_layer_address_option_buffer = boost::asio::buffer_cast(response_buffer + (boost::asio::buffer_size(response_buffer) - payload_size)); target_link_layer_address_option_buffer[0] = ICMPV6_OPTION_TARGET_LINK_LAYER_ADDRESS; // The option type. target_link_layer_address_option_buffer[1] = 0x01; // The size, in multiples of 8 bytes. ::memcpy(&target_link_layer_address_option_buffer[2], ð_addr.data()[0], eth_addr.data().size()); // The ethernet address. builder icmpv6_builder(response_buffer, payload_size); payload_size = icmpv6_builder.write( ICMPV6_NEIGHBOR_ADVERTISEMENT, 0, false, true, true, icmpv6_helper.target() ); builder ipv6_builder(response_buffer, payload_size); payload_size = ipv6_builder.write( ipv6_helper._class(), ipv6_helper.label(), ICMPV6_HEADER, 0xFF, icmpv6_helper.target(), ipv6_helper.source() ); icmpv6_builder.update_checksum(ipv6_builder.get_helper()); return boost::make_optional(response_buffer + (boost::asio::buffer_size(response_buffer) - payload_size)); } } return boost::optional(); } } } freelan-2.0/libs/asiotap/src/ip_endpoint.cpp000066400000000000000000000130251252300335000211550ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ip_endpoint.cpp * \author Julien KAUFFMANN * \brief IP endpoint classes. */ #include "types/ip_endpoint.hpp" #include "types/stream_operations.hpp" #include namespace asiotap { namespace { template std::istream& read_ip_address_port(std::istream& is, std::string& ip_address, std::string& port); template <> std::istream& read_ip_address_port(std::istream& is, std::string& ip_address, std::string& port) { if (is.good()) { if (read_ip_address(is, ip_address)) { if (is.good() && (is.peek() == ':')) { is.ignore(); if (!read_port(is, port)) { putback(is, ip_address + ':'); is.setstate(std::ios_base::failbit); } } } } return is; } template <> std::istream& read_ip_address_port(std::istream& is, std::string& ip_address, std::string& port) { if (is.good()) { if (is.peek() == '[') { is.ignore(); if (!read_ip_address(is, ip_address)) { is.clear(); is.putback('['); is.setstate(std::ios_base::failbit); } else { if (is.peek() != ']') { // End bracket not found: lets put back everything and fail. putback(is, '[' + ip_address); is.setstate(std::ios_base::failbit); } else { is.ignore(); if (is.good() && (is.peek() == ':')) { is.ignore(); if (!read_port(is, port)) { putback(is, '[' + ip_address + ']' + ':'); is.setstate(std::ios_base::failbit); } } } } } else { read_ip_address(is, ip_address); } } return is; } } template std::istream& operator>>(std::istream& is, base_ip_endpoint& value) { std::string ip_address; std::string port; if (read_ip_address_port(is, ip_address, port)) { value = base_ip_endpoint(AddressType::from_string(ip_address), port.empty() ? boost::none : boost::optional(boost::lexical_cast(port))); } return is; } template <> std::ostream& operator<<(std::ostream& os, const ipv4_endpoint& value) { os << value.address().to_string(); if (value.has_port()) { os << ":" << value.port(); } return os; } template std::istream& operator>>(std::istream& is, ipv4_endpoint& value); template std::istream& operator>>(std::istream& is, ipv6_endpoint& value); template <> std::ostream& operator<<(std::ostream& os, const ipv6_endpoint& value) { if (value.has_port()) { os << "[" << value.address().to_string() << "]:" << value.port(); } else { os << value.address().to_string(); } return os; } std::istream& operator>>(std::istream& is, ip_address& value) { if (is) { std::string addr_str; // Fun fact: since "127" is for instance a valid IPv4 address // representation (127.0.0.0), we have to test for IPv6 addresses // first. if (read_ip_address(is, addr_str)) { value = boost::asio::ip::address_v6::from_string(addr_str); } else { is.clear(); if (read_ip_address(is, addr_str)) { value = boost::asio::ip::address_v4::from_string(addr_str); } } } return is; } std::ostream& operator<<(std::ostream& os, const ip_address& value) { return os << value.value().to_string(); } std::ostream& operator<<(std::ostream& os, const ip_address_set& values) { for (auto it = values.begin(); it != values.end(); ++it) { if (it == values.begin()) { os << *it; } else { os << ", " << *it; } } return os; } } freelan-2.0/libs/asiotap/src/ip_network_address.cpp000066400000000000000000000137171252300335000225430ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ip_configuration.cpp * \author Julien KAUFFMANN * \brief Deals with IP configurations. */ #include "types/ip_network_address.hpp" #include "types/stream_operations.hpp" #include namespace asiotap { template bool base_ip_network_address::has_address(const AddressType& addr) const { const typename AddressType::bytes_type network_bytes = address().to_bytes(); const typename AddressType::bytes_type addr_bytes = addr.to_bytes(); unsigned int prefix_len = m_prefix_length; for (size_t i = 0; i < network_bytes.size(); ++i) { if (prefix_len >= 8) { if (network_bytes[i] != addr_bytes[i]) return false; prefix_len -= 8; } else { const typename AddressType::bytes_type::value_type mask = (static_cast(0xFF) >> prefix_len) ^ static_cast(0xFF); if ((network_bytes[i] & mask) != (addr_bytes[i] & mask)) return false; break; } } return true; } template bool base_ip_network_address::has_address(const boost::asio::ip::address_v4&) const; template bool base_ip_network_address::has_address(const boost::asio::ip::address_v6&) const; template bool base_ip_network_address::has_network(const base_ip_network_address& addr) const { // If the network address has a prefix length that is more or equally inclusive to ours: it can't be a subnet. if (addr.m_prefix_length <= m_prefix_length) { return false; } return has_address(addr.get_network_address()); } template bool base_ip_network_address::has_network(const base_ip_network_address&) const; template bool base_ip_network_address::has_network(const base_ip_network_address&) const; template typename base_ip_network_address::address_type base_ip_network_address::get_network_address() const { typename AddressType::bytes_type network_bytes = address().to_bytes(); unsigned int prefix_len = m_prefix_length; for (auto&& byte : network_bytes) { if (prefix_len >= 8) { prefix_len -= 8; } else if (prefix_len > 0) { const auto byte_mask = static_cast((0xFF >> prefix_len) ^ 0xFF); byte ^= byte_mask; } else { byte = 0x00; } } return AddressType(network_bytes); } template boost::asio::ip::address_v4 base_ip_network_address::get_network_address() const; template boost::asio::ip::address_v6 base_ip_network_address::get_network_address() const; template std::istream& operator>>(std::istream& is, base_ip_network_address& value) { std::string ip_address; std::string prefix_length; if (read_ip_address_prefix_length(is, ip_address, prefix_length)) { if (prefix_length.empty()) { value = base_ip_network_address(AddressType::from_string(ip_address)); } else { value = base_ip_network_address(AddressType::from_string(ip_address), boost::lexical_cast(prefix_length)); } } return is; } template std::istream& operator>>(std::istream& is, ipv4_network_address& value); template std::istream& operator>>(std::istream& is, ipv6_network_address& value); template std::ostream& operator<<(std::ostream& os, const base_ip_network_address& value) { return os << value.address().to_string() << "/" << std::dec << value.prefix_length(); } template std::ostream& operator<<(std::ostream& is, const ipv4_network_address& value); template std::ostream& operator<<(std::ostream& is, const ipv6_network_address& value); std::istream& operator>>(std::istream& is, ip_network_address& value) { if (is) { ipv6_network_address ina; if (is >> ina) { value = ina; return is; } is.clear(); } if (is) { ipv4_network_address ina; if (is >> ina) { value = ina; return is; } is.clear(); } return is; } } freelan-2.0/libs/asiotap/src/ip_route.cpp000066400000000000000000000074271252300335000205040ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ip_configuration.cpp * \author Julien KAUFFMANN * \brief Deals with IP configurations. */ #include "types/ip_route.hpp" #include "types/stream_operations.hpp" #include namespace asiotap { template std::istream& operator>>(std::istream& is, base_ip_route& value) { std::string ip_address; std::string prefix_length; std::string gateway; if (read_ip_address_prefix_length_gateway(is, ip_address, prefix_length, gateway)) { base_ip_network_address ina; if (prefix_length.empty()) { ina = AddressType::from_string(ip_address); } else { ina = { AddressType::from_string(ip_address), boost::lexical_cast(prefix_length) }; } if (gateway.empty()) { value = ina; } else { value = { ina, AddressType::from_string(gateway) }; } } return is; } template std::istream& operator>>(std::istream& is, ipv4_route& value); template std::istream& operator>>(std::istream& is, ipv6_route& value); template std::ostream& operator<<(std::ostream& os, const base_ip_route& value) { if (value.gateway()) { return os << value.network_address() << " => " << *value.gateway(); } else { return os << value.network_address(); } } template std::ostream& operator<<(std::ostream& is, const ipv4_route& value); template std::ostream& operator<<(std::ostream& is, const ipv6_route& value); std::istream& operator>>(std::istream& is, ip_route& value) { if (is) { ipv6_route ir; if (is >> ir) { value = ir; return is; } is.clear(); } if (is) { ipv4_route ir; if (is >> ir) { value = ir; return is; } } return is; } std::ostream& operator<<(std::ostream& os, const ip_route_set& routes) { if (routes.size() > 0) { auto route = routes.begin(); os << *route; for (++route; route != routes.end(); ++route) { os << ", " << *route; } } return os; } } freelan-2.0/libs/asiotap/src/ipv4_builder.cpp000066400000000000000000000054711252300335000212430ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ipv4_builder.cpp * \author Julien KAUFFMANN * \brief An ipv4 frame builder class. */ #include "osi/ipv4_builder.hpp" #include "osi/ipv4_helper.hpp" namespace asiotap { namespace osi { size_t builder::write( uint8_t tos, uint16_t identification, uint8_t flags, uint16_t position_fragment, uint8_t ttl, uint8_t protocol, boost::asio::ip::address_v4 source, boost::asio::ip::address_v4 destination ) const { helper_type helper = get_helper(); helper.set_version(4); helper.set_ihl(5); helper.set_tos(tos); helper.set_total_length(helper.ihl() * sizeof(uint32_t) + boost::asio::buffer_size(payload())); helper.set_identification(identification); helper.set_flags(flags); helper.set_position_fragment(position_fragment); helper.set_ttl(ttl); helper.set_protocol(protocol); helper.set_source(source); helper.set_destination(destination); helper.set_checksum(0x0000); helper.set_checksum(helper.compute_checksum()); return helper.total_length(); } } } freelan-2.0/libs/asiotap/src/ipv4_filter.cpp000066400000000000000000000036501252300335000210770ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ipv4_filter.cpp * \author Julien KAUFFMANN * \brief An IPv4 filter class. */ #include "osi/ipv4_filter.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/ipv4_frame.cpp000066400000000000000000000036511252300335000207050ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ipv4_frame.cpp * \author Julien KAUFFMANN * \brief An IPv4 frame structure. */ #include "osi/ipv4_frame.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/ipv4_helper.cpp000066400000000000000000000046511252300335000210730ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ipv4_helper.cpp * \author Julien KAUFFMANN * \brief An IPv4 helper class. */ #include "osi/ipv4_helper.hpp" #include "osi/checksum.hpp" namespace asiotap { namespace osi { template uint16_t _base_helper_impl::compute_checksum() const { const uint16_t* buf = reinterpret_cast(&this->frame()); size_t buf_len = this->header_length(); return asiotap::osi::compute_checksum(buf, buf_len); } template uint16_t _base_helper_impl::compute_checksum() const; template uint16_t _base_helper_impl::compute_checksum() const; } } freelan-2.0/libs/asiotap/src/ipv6_builder.cpp000066400000000000000000000051161252300335000212410ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ipv6_builder.cpp * \author Julien KAUFFMANN * \brief An IPv6 frame builder class. */ #include "osi/ipv6_builder.hpp" #include "osi/ipv6_helper.hpp" namespace asiotap { namespace osi { size_t builder::write( uint8_t _class, uint32_t label, uint8_t next_header, uint8_t hop_limit, boost::asio::ip::address_v6 source, boost::asio::ip::address_v6 destination ) const { helper_type helper = get_helper(); helper.set_version(IP_PROTOCOL_VERSION_6); helper.set_class(_class); helper.set_label(label); helper.set_payload_length(boost::asio::buffer_size(payload())); helper.set_next_header(next_header); helper.set_hop_limit(hop_limit); helper.set_source(source); helper.set_destination(destination); return helper.header_length() + helper.payload_length(); } } } freelan-2.0/libs/asiotap/src/ipv6_filter.cpp000066400000000000000000000036501252300335000211010ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ipv6_filter.cpp * \author Julien KAUFFMANN * \brief An IPv6 filter class. */ #include "osi/ipv6_filter.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/ipv6_frame.cpp000066400000000000000000000036511252300335000207070ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ipv6_frame.cpp * \author Julien KAUFFMANN * \brief An IPv6 frame structure. */ #include "osi/ipv6_frame.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/ipv6_helper.cpp000066400000000000000000000036501252300335000210730ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ipv6_helper.cpp * \author Julien KAUFFMANN * \brief An IPv6 helper class. */ #include "osi/ipv6_helper.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/posix/000077500000000000000000000000001252300335000173025ustar00rootroot00000000000000freelan-2.0/libs/asiotap/src/posix/posix_dns_servers_manager.cpp000066400000000000000000000044541252300335000252660ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file posix_dns_servers_manager.cpp * \author Julien KAUFFMANN * \brief The POSIX DNS servers manager class. */ #include "posix/posix_dns_servers_manager.hpp" #include namespace asiotap { void posix_dns_servers_manager::register_dns_server(const dns_server_type& dns_server_entry) { //TODO: Implement. static_cast(dns_server_entry); } void posix_dns_servers_manager::unregister_dns_server(const dns_server_type& dns_server_entry) { //TODO: Implement. static_cast(dns_server_entry); } } freelan-2.0/libs/asiotap/src/posix/posix_route_manager.cpp000066400000000000000000000224121252300335000240610ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file posix_route_manager.cpp * \author Julien KAUFFMANN * \brief The POSIX route manager class. */ #include "posix/posix_route_manager.hpp" #include "error.hpp" #include #include #include #include #include #ifdef LINUX #include #endif #include namespace asiotap { posix_route_manager::route_type posix_route_manager::get_route_for(const boost::asio::ip::address& host) { #ifdef MACINTOSH const std::vector real_args { "/sbin/route", "-n", "get", boost::lexical_cast(host) }; std::stringstream ss; executeplus::checked_execute(real_args, executeplus::get_current_environment(), &ss); //The output is like: /* route to: 8.8.8.8 destination: default mask: default gateway: 10.7.0.254 interface: en0 flags: recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire 0 0 0 0 0 0 1500 0 */ std::map values; std::string line; while (std::getline(ss, line)) { const auto colon_pos = line.find_first_of(':'); if (colon_pos == std::string::npos) { continue; } std::string key = line.substr(0, colon_pos); std::string value = line.substr(colon_pos + 1, std::string::npos); boost::algorithm::trim(key); boost::algorithm::trim(value); values[key] = value; } if (values.find("interface") == values.end()) { throw boost::system::system_error(make_error_code(asiotap_error::external_process_output_parsing_error)); } const std::string interface = values["interface"]; boost::optional gw; if (values.find("gateway") != values.end()) { gw = boost::asio::ip::address::from_string(values["gateway"]); } #else #ifdef FREELAN_DISABLE_NETLINK const std::vector real_args { "/bin/ip", "route", "get", boost::lexical_cast(host) }; std::stringstream ss; executeplus::checked_execute(real_args, executeplus::get_current_environment(), &ss); // The output is like: /* 8.8.8.8 via 37.59.15.254 dev eth0 src 46.105.57.112 cache */ std::string host_addr; if (!(ss >> host_addr)) { throw boost::system::system_error(make_error_code(asiotap_error::external_process_output_parsing_error)); } std::map values; std::string key, value; while (ss >> key >> value) { boost::algorithm::trim(key); boost::algorithm::trim(value); values[key] = value; } if (values.find("dev") == values.end()) { throw boost::system::system_error(make_error_code(asiotap_error::external_process_output_parsing_error)); } const std::string interface = values["dev"]; boost::optional gw; if (values.find("via") != values.end()) { gw = boost::asio::ip::address::from_string(values["via"]); } #else const auto route_info = m_netlink_manager.get_route_for(host); const auto interface = route_info.output_interface.name(); const auto gw = route_info.gateway; #endif #endif const auto route = to_ip_route(to_network_address(host), gw); const posix_route_manager::route_type route_entry = { interface, route, 0 }; return route_entry; } void posix_route_manager::ifconfig(const std::string& interface, const ip_network_address& address) { #if defined(MACINTOSH) || defined(FREELAN_DISABLE_NETLINK) const std::vector real_args { "/sbin/ifconfig", interface, boost::lexical_cast(address) }; executeplus::checked_execute(real_args, executeplus::get_current_environment()); #else m_netlink_manager.add_interface_address(netlinkplus::interface_entry(interface), to_ip_address(address), to_prefix_length(address)); #endif } void posix_route_manager::ifconfig(const std::string& interface, const ip_network_address& address, const boost::asio::ip::address& remote_address) { #if defined(MACINTOSH) || defined(FREELAN_DISABLE_NETLINK) const std::vector real_args { "/sbin/ifconfig", interface, boost::lexical_cast(address), boost::lexical_cast(remote_address) }; executeplus::checked_execute(real_args, executeplus::get_current_environment()); #else m_netlink_manager.add_interface_address(netlinkplus::interface_entry(interface), remote_address, to_prefix_length(address), to_ip_address(address)); #endif } void posix_route_manager::set_route(route_action action, const std::string& interface, const ip_network_address& dest) { #if defined(MACINTOSH) || defined(FREELAN_DISABLE_NETLINK) const std::string net_host = is_unicast(dest) ? "-host" : "-net"; #ifdef MACINTOSH const std::string command = action == route_action::add ? "add" : "delete"; const std::vector real_args { "/sbin/route", "-n", command, net_host, boost::lexical_cast(dest), "-interface", interface }; #else const std::string command = action == route_action::add ? "add" : "del"; const std::vector real_args { "/sbin/route", "-n", command, net_host, boost::lexical_cast(dest), "dev", interface }; #endif executeplus::checked_execute(real_args, executeplus::get_current_environment()); #else if (action == route_action::add) { m_netlink_manager.add_route(netlinkplus::interface_entry(interface), to_ip_address(dest), to_prefix_length(dest)); } else { m_netlink_manager.remove_route(netlinkplus::interface_entry(interface), to_ip_address(dest), to_prefix_length(dest)); } #endif } void posix_route_manager::set_route(route_action action, const std::string& interface, const ip_network_address& dest, const boost::asio::ip::address& gateway) { #if defined(MACINTOSH) || defined(FREELAN_DISABLE_NETLINK) const std::string net_host = is_unicast(dest) ? "-host" : "-net"; const std::string command = action == route_action::add ? "add" : "del"; #ifdef MACINTOSH static_cast(interface); const std::vector real_args { "/sbin/route", "-n", command, net_host, boost::lexical_cast(dest), boost::lexical_cast(gateway) }; #else const std::vector real_args { "/sbin/route", "-n", command, net_host, boost::lexical_cast(dest), "gw", boost::lexical_cast(gateway), "dev", interface }; #endif executeplus::checked_execute(real_args, executeplus::get_current_environment()); #else if (action == route_action::add) { m_netlink_manager.add_route(netlinkplus::interface_entry(interface), to_ip_address(dest), to_prefix_length(dest), gateway); } else { m_netlink_manager.remove_route(netlinkplus::interface_entry(interface), to_ip_address(dest), to_prefix_length(dest), gateway); } #endif } void posix_route_manager::register_route(const route_type& route_entry) { const auto _gateway = gateway(route_entry.route); const auto ina = network_address(route_entry.route); if (_gateway) { set_route(route_action::add, route_entry.interface, ina, *_gateway); } else { set_route(route_action::add, route_entry.interface, ina); } } void posix_route_manager::unregister_route(const route_type& route_entry) { const auto _gateway = gateway(route_entry.route); const auto ina = network_address(route_entry.route); if (_gateway) { set_route(route_action::remove, route_entry.interface, ina, *_gateway); } else { set_route(route_action::remove, route_entry.interface, ina); } } } freelan-2.0/libs/asiotap/src/posix/posix_tap_adapter.cpp000066400000000000000000000503451252300335000235230ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file posix_tap_adapter.cpp * \author Julien KAUFFMANN * \brief The posix tap adapter class. */ #include "posix/posix_tap_adapter.hpp" #include #include #include #include #include #include #include #ifdef LINUX #include /** * \struct in6_ifreq * \brief Replacement structure since the include of linux/ipv6.h introduces conflicts. * * If someone comes up with a better solution, feel free to contribute :) */ struct in6_ifreq { struct in6_addr ifr6_addr; /**< IPv6 address */ uint32_t ifr6_prefixlen; /**< Length of the prefix */ int ifr6_ifindex; /**< Interface index */ }; #elif defined(MACINTOSH) || defined(BSD) /* * Note for Mac OS X users : you have to download and install the tun/tap driver from (http://tuntaposx.sourceforge.net). */ #include #include #include #include #include #include #endif namespace asiotap { namespace { unsigned int netmask_to_prefix_len(in_addr netmask) { uint32_t bits = ~ntohl(netmask.s_addr); unsigned int result = 0; while (bits > 0) { bits >>= 1; ++result; } return (sizeof(in_addr) * 8) - result; } unsigned int netmask_to_prefix_len(in6_addr netmask) { unsigned int result = 0; for (size_t i = 0; i < sizeof(netmask.s6_addr); ++i) { uint8_t bits = ~netmask.s6_addr[i]; while (bits > 0) { bits >>= 1; ++result; } } return (sizeof(in6_addr) * 8) - result; } class descriptor_handler { public: descriptor_handler() : m_fd(-1) {} explicit descriptor_handler(int fd) : m_fd(fd) {} descriptor_handler(const descriptor_handler&) = delete; descriptor_handler& operator=(const descriptor_handler&) = delete; descriptor_handler(descriptor_handler&& other) : m_fd(other.m_fd) { other.m_fd = -1; } descriptor_handler& operator=(descriptor_handler&& other) { using std::swap; swap(m_fd, other.m_fd); return *this; } ~descriptor_handler() { if (m_fd >= 0) { ::close(m_fd); }} int native_handle() const { return m_fd; } bool valid() const { return (m_fd >= 0); } int release() { const int result = m_fd; m_fd = -1; return result; } private: int m_fd; }; descriptor_handler open_device(const std::string& name, boost::system::error_code& ec) { const int device_fd = ::open(name.c_str(), O_RDWR); if (device_fd < 0) { // Unable to open the device. ec = boost::system::error_code(errno, boost::system::system_category()); return descriptor_handler(); } return descriptor_handler(device_fd); } descriptor_handler open_socket(int family, boost::system::error_code& ec) { const int socket_fd = ::socket(family, SOCK_DGRAM, 0); if (socket_fd < 0) { ec = boost::system::error_code(errno, boost::system::system_category()); return descriptor_handler(); } return descriptor_handler(socket_fd); } descriptor_handler open_socket(int family) { boost::system::error_code ec; descriptor_handler result = open_socket(family, ec); if (!result.valid()) { throw boost::system::system_error(ec); } return result; } } std::map posix_tap_adapter::enumerate(tap_adapter_layer _layer) { std::map result; struct ifaddrs* addrs = nullptr; if (getifaddrs(&addrs) != -1) { boost::shared_ptr paddrs(addrs, freeifaddrs); for (struct ifaddrs* ifa = paddrs.get(); ifa != NULL ; ifa = ifa->ifa_next) { const std::string name(ifa->ifa_name); switch (_layer) { case tap_adapter_layer::ethernet: { if (name.substr(0, 3) == "tap") { result[name] = name; } } case tap_adapter_layer::ip: { if (name.substr(0, 3) == "tun") { result[name] = name; } } } } } return result; } void posix_tap_adapter::open(boost::system::error_code& ec) { open("", ec); } void posix_tap_adapter::open(const std::string& _name, boost::system::error_code& ec) { ec = boost::system::error_code(); #if defined(LINUX) const std::string dev_name = (layer() == tap_adapter_layer::ethernet) ? "/dev/net/tap" : "/dev/net/tun"; if (::access(dev_name.c_str(), F_OK) == -1) { if (errno != ENOENT) { // Unable to access the tap adapter yet it exists: this is an error. ec = boost::system::error_code(errno, boost::system::system_category()); return; } // No tap found, create one. if (::mknod(dev_name.c_str(), S_IFCHR | S_IRUSR | S_IWUSR, ::makedev(10, 200)) == -1) { ec = boost::system::error_code(errno, boost::system::system_category()); return; } } descriptor_handler device = open_device(dev_name, ec); if (!device.valid()) { return; } struct ifreq ifr {}; ifr.ifr_flags = IFF_NO_PI; #if defined(IFF_ONE_QUEUE) && defined(SIOCSIFTXQLEN) ifr.ifr_flags |= IFF_ONE_QUEUE; #endif if (layer() == tap_adapter_layer::ethernet) { ifr.ifr_flags |= IFF_TAP; } else { ifr.ifr_flags |= IFF_TUN; } if (!_name.empty()) { strncpy(ifr.ifr_name, _name.c_str(), IFNAMSIZ); } // Set the parameters on the tun device. if (::ioctl(device.native_handle(), TUNSETIFF, (void *)&ifr) < 0) { ec = boost::system::error_code(errno, boost::system::system_category()); return; } descriptor_handler socket = open_socket(AF_INET, ec); if (!socket.valid()) { return; } { struct ifreq netifr {}; std::strncpy(netifr.ifr_name, ifr.ifr_name, IFNAMSIZ); #if defined(IFF_ONE_QUEUE) && defined(SIOCSIFTXQLEN) netifr.ifr_qlen = 100; // 100 is the default value if (::ioctl(socket.native_handle(), SIOCSIFTXQLEN, (void *)&netifr) < 0) { ec = boost::system::error_code(errno, boost::system::system_category()); return; } // Reset the structure for the next call. netifr = {}; std::strncpy(netifr.ifr_name, ifr.ifr_name, IFNAMSIZ); #endif // Get the interface hwaddr if (::ioctl(socket.native_handle(), SIOCGIFHWADDR, (void*)&netifr) < 0) { ec = boost::system::error_code(errno, boost::system::system_category()); return; } osi::ethernet_address _ethernet_address; std::memcpy(_ethernet_address.data().data(), netifr.ifr_hwaddr.sa_data, _ethernet_address.data().size()); set_ethernet_address(_ethernet_address); } set_name(ifr.ifr_name); #else /* *BSD and Mac OS X */ const std::string dev_type = (layer() == tap_adapter_layer::ethernet) ? "tap" : "tun"; std::string interface_name = _name; descriptor_handler device; if (!_name.empty()) { device = open_device("/dev/" + _name, ec); } else { for (unsigned int i = 0 ; !device.valid(); ++i) { interface_name = dev_type + boost::lexical_cast(i); device = open_device("/dev/" + interface_name, ec); if (!device.valid() && (errno == ENOENT)) { // We reached the end of the available tap adapters. break; } } } if (!device.valid()) { ec = make_error_code(asiotap_error::no_such_tap_adapter); return; } struct stat st {}; if (::fstat(device.native_handle(), &st) != 0) { ec = boost::system::error_code(errno, boost::system::system_category()); return; } char namebuf[256]; memset(namebuf, 0x00, sizeof(namebuf)); if (::devname_r(st.st_dev, S_IFCHR, namebuf, 255) != NULL) { set_name(namebuf); } else { set_name(interface_name); } if (if_nametoindex(name().c_str()) == 0) { ec = make_error_code(asiotap_error::no_such_tap_adapter); return; } // Do not pass the descriptor to child ::fcntl(device.native_handle(), F_SETFD, FD_CLOEXEC); descriptor_handler socket = open_socket(AF_INET, ec); if (!socket.valid()) { return; } /* Get the hardware address of tap inteface. */ struct ifaddrs* addrs = nullptr; if (getifaddrs(&addrs) < 0) { ec = boost::system::error_code(errno, boost::system::system_category()); return; } boost::shared_ptr paddrs(addrs, freeifaddrs); for (struct ifaddrs* ifa = addrs; ifa != NULL; ifa = ifa->ifa_next) { const std::string if_name = name(); if ((ifa->ifa_addr->sa_family == AF_LINK) && !std::memcmp(ifa->ifa_name, if_name.c_str(), if_name.length())) { struct sockaddr_dl* sdl = (struct sockaddr_dl*)ifa->ifa_addr; if (sdl->sdl_type == IFT_ETHER) { osi::ethernet_address _ethernet_address; std::memcpy(_ethernet_address.data().data(), LLADDR(sdl), ethernet_address().data().size()); set_ethernet_address(_ethernet_address); break; } } } #endif update_mtu_from_device(); if (descriptor().assign(device.release(), ec)) { return; } } void posix_tap_adapter::open(const std::string& _name) { boost::system::error_code ec; open(_name, ec); if (ec) { throw boost::system::system_error(ec); } } void posix_tap_adapter::destroy_device() { boost::system::error_code ec; destroy_device(ec); if (ec) { throw boost::system::system_error(ec); } } void posix_tap_adapter::destroy_device(boost::system::error_code& ec) { #if defined(MACINTOSH) || defined(BSD) descriptor_handler socket = open_socket(AF_INET, ec); if (!socket.valid()) { return; } struct ifreq ifr {}; strncpy(ifr.ifr_name, name().c_str(), IFNAMSIZ); // Destroy the virtual tap device if (ioctl(socket.native_handle(), SIOCIFDESTROY, &ifr) < 0) { ec = boost::system::error_code(errno, boost::system::system_category()); } #else static_cast(ec); #endif } void posix_tap_adapter::set_connected_state(bool connected) { descriptor_handler socket = open_socket(AF_INET); struct ifreq netifr {}; strncpy(netifr.ifr_name, name().c_str(), IFNAMSIZ); // Set the interface UP if (::ioctl(socket.native_handle(), SIOCGIFFLAGS, static_cast(&netifr)) < 0) { throw boost::system::system_error(errno, boost::system::system_category()); } if (connected) { #ifdef MACINTOSH netifr.ifr_flags |= IFF_UP; #else netifr.ifr_flags |= (IFF_UP | IFF_RUNNING); #endif } else { #ifdef MACINTOSH // Mac OS X: set_connected_state(false) seems to confuse the TAP // so do nothing for the moment. return; #else netifr.ifr_flags &= ~(IFF_UP | IFF_RUNNING); #endif } if (::ioctl(socket.native_handle(), SIOCSIFFLAGS, static_cast(&netifr)) < 0) { throw boost::system::system_error(errno, boost::system::system_category()); } } ip_network_address_list posix_tap_adapter::get_ip_addresses() { ip_network_address_list result; struct ifaddrs* addrs = nullptr; if (::getifaddrs(&addrs) < 0) { throw boost::system::system_error(errno, boost::system::system_category()); } boost::shared_ptr paddrs(addrs, ::freeifaddrs); for (struct ifaddrs* ifa = paddrs.get(); ifa != nullptr; ifa = ifa->ifa_next) { const std::string ifname(ifa->ifa_name); if ((ifa->ifa_addr) && (ifname == name())) { if (ifa->ifa_addr->sa_family == AF_INET) { struct sockaddr_in* sai = reinterpret_cast(ifa->ifa_addr); boost::asio::ip::address_v4::bytes_type bytes; memcpy(bytes.data(), &sai->sin_addr, bytes.size()); boost::asio::ip::address_v4 address(bytes); unsigned int prefix_len = sizeof(in_addr) * 8; if (ifa->ifa_netmask) { struct sockaddr_in* sain = reinterpret_cast(ifa->ifa_netmask); prefix_len = netmask_to_prefix_len(sain->sin_addr); } result.push_back(ipv4_network_address{ address, prefix_len }); } else if (ifa->ifa_addr->sa_family == AF_INET6) { struct sockaddr_in6* sai = reinterpret_cast(ifa->ifa_addr); boost::asio::ip::address_v6::bytes_type bytes; memcpy(bytes.data(), &sai->sin6_addr, bytes.size()); boost::asio::ip::address_v6 address(bytes); unsigned int prefix_len = sizeof(in6_addr) * 8; if (ifa->ifa_netmask) { struct sockaddr_in6* sain = reinterpret_cast(ifa->ifa_netmask); prefix_len = netmask_to_prefix_len(sain->sin6_addr); } result.push_back(ipv6_network_address{ address, prefix_len }); } } } return result; } void posix_tap_adapter::configure(const configuration_type& configuration) { if (configuration.ipv4.network_address) { if (layer() == tap_adapter_layer::ethernet) { set_ip_address_v4(*configuration.ipv4.network_address); } else { if (configuration.ipv4.remote_address) { set_remote_ip_address_v4(*configuration.ipv4.network_address, *configuration.ipv4.remote_address); } } } if (configuration.ipv6.network_address) { set_ip_address_v6(*configuration.ipv6.network_address); } if (configuration.mtu > 0) { set_device_mtu(configuration.mtu); } } void posix_tap_adapter::update_mtu_from_device() { descriptor_handler socket = open_socket(AF_INET); struct ifreq netifr {}; strncpy(netifr.ifr_name, name().c_str(), IFNAMSIZ); if (::ioctl(socket.native_handle(), SIOCGIFMTU, (void*)&netifr) >= 0) { set_mtu(netifr.ifr_mtu); } else { throw boost::system::system_error(errno, boost::system::system_category()); } } void posix_tap_adapter::set_device_mtu(size_t _mtu) { descriptor_handler socket = open_socket(AF_INET); struct ifreq netifr {}; strncpy(netifr.ifr_name, name().c_str(), IFNAMSIZ); netifr.ifr_mtu = _mtu; if (::ioctl(socket.native_handle(), SIOCSIFMTU, (void*)&netifr) < 0) { throw boost::system::system_error(errno, boost::system::system_category()); } } void posix_tap_adapter::set_ip_address_v4(const ipv4_network_address& network_address) { const boost::asio::ip::address_v4& address = network_address.address(); const unsigned int prefix_len = network_address.prefix_length(); assert(prefix_len < 32); descriptor_handler socket = open_socket(AF_INET); ifreq ifr_a {}; std::strncpy(ifr_a.ifr_name, name().c_str(), IFNAMSIZ - 1); sockaddr_in* ifr_a_addr = reinterpret_cast(&ifr_a.ifr_addr); ifr_a_addr->sin_family = AF_INET; #ifdef BSD ifr_a_addr->sin_len = sizeof(sockaddr_in); #endif std::memcpy(&ifr_a_addr->sin_addr.s_addr, address.to_bytes().data(), address.to_bytes().size()); if (::ioctl(socket.native_handle(), SIOCSIFADDR, &ifr_a) < 0) { if (errno == EEXIST) { // The address is already set. We ignore this. } else { throw boost::system::system_error(errno, boost::system::system_category()); } } if (prefix_len > 0) { ifreq ifr_n {}; std::strncpy(ifr_n.ifr_name, name().c_str(), IFNAMSIZ - 1); sockaddr_in* ifr_n_addr = reinterpret_cast(&ifr_n.ifr_addr); ifr_n_addr->sin_family = AF_INET; #ifdef BSD ifr_n_addr->sin_len = sizeof(sockaddr_in); #endif ifr_n_addr->sin_addr.s_addr = htonl((0xFFFFFFFF >> (32 - prefix_len)) << (32 - prefix_len)); if (::ioctl(socket.native_handle(), SIOCSIFNETMASK, &ifr_n) < 0) { if (errno == EEXIST) { // The netmask is already set. We ignore this. } else { throw boost::system::system_error(errno, boost::system::system_category()); } } } } void posix_tap_adapter::set_ip_address_v6(const ipv6_network_address& network_address) { const boost::asio::ip::address_v6& address = network_address.address(); const unsigned int prefix_len = network_address.prefix_length(); assert(prefix_len < 128); descriptor_handler socket = open_socket(AF_INET6); #ifdef LINUX const unsigned int if_index = ::if_nametoindex(name().c_str()); if (if_index == 0) { throw boost::system::system_error(errno, boost::system::system_category()); } in6_ifreq ifr {}; std::memcpy(&ifr.ifr6_addr, address.to_bytes().data(), address.to_bytes().size()); ifr.ifr6_prefixlen = prefix_len; ifr.ifr6_ifindex = if_index; if (::ioctl(socket.native_handle(), SIOCSIFADDR, &ifr) < 0) #elif defined(MACINTOSH) || defined(BSD) in6_aliasreq iar {}; std::memcpy(iar.ifra_name, name().c_str(), name().length()); reinterpret_cast(&iar.ifra_addr)->sin6_family = AF_INET6; reinterpret_cast(&iar.ifra_prefixmask)->sin6_family = AF_INET6; std::memcpy(&reinterpret_cast(&iar.ifra_addr)->sin6_addr, address.to_bytes().data(), address.to_bytes().size()); std::memset(reinterpret_cast(&iar.ifra_prefixmask)->sin6_addr.s6_addr, 0xFF, prefix_len / 8); reinterpret_cast(&iar.ifra_prefixmask)->sin6_addr.s6_addr[prefix_len / 8] = (0xFF << (8 - (prefix_len % 8))); iar.ifra_lifetime.ia6t_pltime = 0xFFFFFFFF; iar.ifra_lifetime.ia6t_vltime = 0xFFFFFFFF; #ifdef SIN6_LEN reinterpret_cast(&iar.ifra_addr)->sin6_len = sizeof(sockaddr_in6); reinterpret_cast(&iar.ifra_prefixmask)->sin6_len = sizeof(sockaddr_in6); #endif if (::ioctl(socket.native_handle(), SIOCAIFADDR_IN6, &iar) < 0) #endif { if (errno == EEXIST) { // The address is already set. We ignore this. } else { throw boost::system::system_error(errno, boost::system::system_category()); } } } void posix_tap_adapter::set_remote_ip_address_v4(const ipv4_network_address& network_address, const boost::asio::ip::address_v4& remote_address) { if (layer() != tap_adapter_layer::ip) { throw boost::system::system_error(make_error_code(asiotap_error::invalid_tap_adapter_layer)); } #ifdef MACINTOSH // The TUN adapter for Mac OSX has a weird behavior regarding routes and ioctl. // For some reason, on Mac, setting up the IP address using ioctl() doesn't work for TUN devices. m_route_manager.ifconfig(name(), network_address, remote_address); // OSX apparently does not create a route even though ifconfig indicates that the netmask is understood. // We must create it ourselves. m_route_manager.set_route(posix_route_manager::route_action::add, name(), network_address); #else set_ip_address_v4(network_address); descriptor_handler socket = open_socket(AF_INET); ifreq ifr_d {}; std::strncpy(ifr_d.ifr_name, name().c_str(), IFNAMSIZ - 1); sockaddr_in* ifr_dst_addr = reinterpret_cast(&ifr_d.ifr_dstaddr); ifr_dst_addr->sin_family = AF_INET; #ifdef BSD ifr_dst_addr->sin_len = sizeof(sockaddr_in); #endif std::memcpy(&ifr_dst_addr->sin_addr.s_addr, remote_address.to_bytes().data(), remote_address.to_bytes().size()); if (::ioctl(socket.native_handle(), SIOCSIFDSTADDR, &ifr_d) < 0) { if (errno == EEXIST) { // The address is already set. We ignore this. } else { throw boost::system::system_error(errno, boost::system::system_category()); } } #endif } } freelan-2.0/libs/asiotap/src/proxy.cpp000066400000000000000000000036401252300335000200300ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file proxy.cpp * \author Julien KAUFFMANN * \brief An OSI frame proxy class. */ #include "osi/proxy.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/stream_operations.cpp000066400000000000000000000260261252300335000224100ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file stream_operations.cpp * \author Julien KAUFFMANN * \brief Stream related functions. */ #include "types/stream_operations.hpp" #include #include #include namespace asiotap { std::istream& putback(std::istream& is, const std::string& str) { std::ios::iostate state = is.rdstate(); is.clear(); std::for_each(str.rbegin(), str.rend(), [&is] (char c) { is.putback(c); }); is.setstate(state); return is; } template bool is_ip_address_character(char c); template <> bool is_ip_address_character(char c) { return (std::isdigit(c) || (c == '.')); } template <> bool is_ip_address_character(char c) { return (std::isxdigit(c) || (c == ':')); } template std::istream& read_ip_address(std::istream& is, std::string& ip_address) { if (is.good()) { if (!is_ip_address_character(is.peek())) { is.setstate(std::ios_base::failbit); } else { std::ostringstream oss; do { oss.put(static_cast(is.get())); } while (is.good() && is_ip_address_character(is.peek())); if (is) { const std::string& result = oss.str(); boost::system::error_code ec; AddressType::from_string(result, ec); if (ec) { // Unable to parse the IP address: putting back characters. putback(is, result); is.setstate(std::ios_base::failbit); } else { ip_address = result; } } } } return is; } template std::istream& read_ip_address(std::istream& is, std::string& ip_address); template std::istream& read_ip_address(std::istream& is, std::string& ip_address); std::istream& read_port(std::istream& is, std::string& port) { uint16_t num_port; if (is >> std::dec >> num_port) { port = boost::lexical_cast(num_port); } return is; } template bool check_prefix_length(unsigned int prefix_length); template <> bool check_prefix_length(unsigned int prefix_length) { return (prefix_length < 32); } template <> bool check_prefix_length(unsigned int prefix_length) { return (prefix_length < 128); } template std::istream& read_prefix_length(std::istream& is, std::string& prefix_length) { if (is.good()) { if (!isdigit(is.peek())) { is.setstate(std::ios_base::failbit); } else { std::ostringstream oss; do { oss.put(static_cast(is.get())); } while (is.good() && isdigit(is.peek())); if (is) { const std::string& result = oss.str(); std::istringstream iss(result); unsigned int num_prefix_length = 0; if ((iss >> std::dec >> num_prefix_length) && check_prefix_length(num_prefix_length)) { prefix_length = result; } else { putback(is, result); is.setstate(std::ios_base::failbit); } } } } return is; } template std::istream& read_prefix_length(std::istream& is, std::string& prefix_length); template std::istream& read_prefix_length(std::istream& is, std::string& prefix_length); // Hostname labels are 63 characters long at most const size_t HOSTNAME_LABEL_MAX_SIZE = 63; // Hostnames are at most 255 characters long const size_t HOSTNAME_MAX_SIZE = 255; bool is_hostname_label_regular_character(char c) { return (std::isalnum(c) != 0); } bool is_hostname_label_special_character(char c) { return (c == '-'); } bool is_hostname_label_character(char c) { return is_hostname_label_regular_character(c) || is_hostname_label_special_character(c); } std::istream& read_hostname_label(std::istream& is, std::string& label) { // Parse hostname labels according to RFC1123 if (is.good()) { if (!is_hostname_label_regular_character(is.peek())) { is.setstate(std::ios_base::failbit); } else { std::ostringstream oss; do { oss.put(static_cast(is.get())); } while (is.good() && is_hostname_label_character(is.peek())); if (is) { const std::string& result = oss.str(); // Check if the label is too long, if the last character is not a regular character or if it contains only digits if ((result.size() > HOSTNAME_LABEL_MAX_SIZE) || (!is_hostname_label_regular_character(result[result.size() - 1])) || (result.find_first_not_of("0123456789") == std::string::npos)) { putback(is, result); is.setstate(std::ios_base::failbit); } else { label = result; } } } } return is; } std::istream& read_hostname(std::istream& is, std::string& hostname) { // Parse hostnames labels according to RFC952 and RFC1123 std::string label; if (read_hostname_label(is, label)) { if (is.eof()) { // There is nothing more to read: lets use the content of the first label std::swap(hostname, label); } else { std::ostringstream oss(label); oss.seekp(0, std::ios::end); while (is.good() && (is.peek() == '.')) { is.ignore(); oss.put('.'); if (!read_hostname_label(is, label)) { putback(is, oss.str()); is.setstate(std::ios_base::failbit); } else { oss << label; } } if (is) { const std::string& result = oss.str(); if (result.size() > HOSTNAME_MAX_SIZE) { putback(is, result); is.setstate(std::ios_base::failbit); } else { hostname = result; } } } } return is; } std::istream& read_service(std::istream& is, std::string& service) { if (is.good()) { if (!isalnum(is.peek())) { is.setstate(std::ios_base::failbit); } else { std::ostringstream oss; do { oss.put(static_cast(is.get())); } while (is.good() && isalnum(is.peek())); if (is) { const std::string& result = oss.str(); // Check if the label contains only digits if (result.find_first_not_of("0123456789") == std::string::npos) { std::istringstream iss(result); uint16_t num_service; if (iss >> std::dec >> num_service) { service = result; } else { putback(is, result); is.setstate(std::ios_base::failbit); } } else { service = result; } } } } return is; } template std::istream& read_ip_address_prefix_length(std::istream& is, std::string& ip_address, std::string& prefix_length) { if (is.good()) { if (read_ip_address(is, ip_address)) { if (is.good()) { if (is.peek() == '/') { is.ignore(); if (!read_prefix_length(is, prefix_length)) { putback(is, ip_address + '/'); is.setstate(std::ios_base::failbit); } } else { prefix_length.clear(); } } else if (is.eof()) { prefix_length.clear(); } else { putback(is, ip_address); is.setstate(std::ios_base::failbit); } } } return is; } template std::istream& read_ip_address_prefix_length(std::istream& is, std::string& ip_address, std::string& prefix_length); template std::istream& read_ip_address_prefix_length(std::istream& is, std::string& ip_address, std::string& prefix_length); template std::istream& read_ip_address_prefix_length_gateway(std::istream& is, std::string& ip_address, std::string& prefix_length, std::string& gateway) { if (is.good()) { if (read_ip_address_prefix_length(is, ip_address, prefix_length)) { if (is.good()) { std::ostringstream oss; while (is.good() && isblank(is.peek())) { oss.put(static_cast(is.get())); } if (is.peek() == '=') { is.ignore(); if (is.peek() == '>') { is.ignore(); std::ostringstream oss2; while (is.good() && isblank(is.peek())) { oss2.put(static_cast(is.get())); } if (!read_ip_address(is, gateway)) { putback(is, ip_address + '/' + prefix_length + oss.str() + "=>" + oss2.str()); is.setstate(std::ios_base::failbit); } } else { putback(is, ip_address + '/' + prefix_length + oss.str() + '='); is.setstate(std::ios_base::failbit); } } else { putback(is, ip_address + '/' + prefix_length + oss.str()); is.setstate(std::ios_base::failbit); } } else if (is.eof()) { gateway.clear(); } else { putback(is, ip_address + '/' + prefix_length); is.setstate(std::ios_base::failbit); } } } return is; } template std::istream& read_ip_address_prefix_length_gateway(std::istream& is, std::string& ip_address, std::string& prefix_length, std::string& gateway); template std::istream& read_ip_address_prefix_length_gateway(std::istream& is, std::string& ip_address, std::string& prefix_length, std::string& gateway); } freelan-2.0/libs/asiotap/src/tcp_filter.cpp000066400000000000000000000036441252300335000210060ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file tcp_filter.cpp * \author Julien KAUFFMANN * \brief A TCP filter class. */ #include "osi/tcp_filter.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/tcp_frame.cpp000066400000000000000000000036461252300335000206150ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file udp_frame.cpp * \author Julien KAUFFMANN * \brief An UDP frame structure. */ #include "osi/tcp_frame.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/tcp_helper.cpp000066400000000000000000000112011252300335000207640ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file tcp_helper.cpp * \author Julien KAUFFMANN * \brief A TCP helper class. */ #include "osi/tcp_helper.hpp" #include "osi/checksum_helper.hpp" namespace asiotap { namespace osi { namespace { template struct tcp_pseudo_header; template <> struct tcp_pseudo_header > { typedef tcp_ipv4_pseudo_header type; }; template <> struct tcp_pseudo_header > { typedef tcp_ipv6_pseudo_header type; }; tcp_ipv4_pseudo_header parent_frame_to_pseudo_header(const_helper parent_frame) { tcp_ipv4_pseudo_header pseudo_header {}; pseudo_header.ipv4_source = parent_frame.frame().source; pseudo_header.ipv4_destination = parent_frame.frame().destination; pseudo_header.ipv4_protocol = parent_frame.frame().protocol; pseudo_header.tcp_length = htons(parent_frame.payload_length()); return pseudo_header; } tcp_ipv6_pseudo_header parent_frame_to_pseudo_header(const_helper parent_frame) { tcp_ipv6_pseudo_header pseudo_header {}; pseudo_header.ipv6_source = parent_frame.frame().source; pseudo_header.ipv6_destination = parent_frame.frame().destination; pseudo_header.upper_layer_length = htonl(parent_frame.payload_length()); pseudo_header.ipv6_next_header = TCP_PROTOCOL; // Must be this value, not the parent frame next-header as it could be different. return pseudo_header; } template uint16_t compute_tcp_checksum(ParentHelperType parent_frame, HelperType tcp_frame) { const uint16_t* buf = boost::asio::buffer_cast(tcp_frame.buffer()); size_t buf_len = boost::asio::buffer_size(tcp_frame.buffer()); const auto pseudo_header = parent_frame_to_pseudo_header(parent_frame); checksum_helper chk; chk.update(reinterpret_cast(&pseudo_header), sizeof(pseudo_header)); chk.update(buf, buf_len); return chk.compute(); } } template uint16_t _base_helper_impl::compute_checksum(const_helper parent_frame) const { return compute_tcp_checksum(parent_frame, *this); } template uint16_t _base_helper_impl::compute_checksum(const_helper parent_frame) const { return compute_tcp_checksum(parent_frame, *this); } template uint16_t _base_helper_impl::compute_checksum(const_helper) const; template uint16_t _base_helper_impl::compute_checksum(const_helper) const; template uint16_t _base_helper_impl::compute_checksum(const_helper) const; template uint16_t _base_helper_impl::compute_checksum(const_helper) const; } } freelan-2.0/libs/asiotap/src/tcp_mss_morpher.cpp000066400000000000000000000061601252300335000220530ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file tcp_mss_morpher.cpp * \author Julien KAUFFMANN * \brief A TCP MSS morpher class. */ #include "osi/tcp_mss_morpher.hpp" namespace asiotap { namespace osi { namespace { template void generic_handle(uint16_t max_mss, OSIHelperType ip_helper, mutable_helper tcp_helper) { if (tcp_helper.syn_flag()) { for (auto option = tcp_helper.first_option(); option.valid(); option = option.next_option()) { if (option.kind() == TCP_OPTION_END) { break; } if (option.kind() == TCP_OPTION_MSS) { if (option.size() == 4) { auto value = option.value(); uint16_t mss = ntohs(*boost::asio::buffer_cast(value)); if (mss > max_mss) { *boost::asio::buffer_cast(value) = htons(max_mss); tcp_helper.set_checksum(0x0000); tcp_helper.set_checksum(tcp_helper.compute_checksum(ip_helper)); } } break; } } } } } void tcp_mss_morpher::handle(const_helper ipv4_helper, mutable_helper tcp_helper) { generic_handle(static_cast(m_max_mss), ipv4_helper, tcp_helper); } void tcp_mss_morpher::handle(const_helper ipv6_helper, mutable_helper tcp_helper) { generic_handle(static_cast(m_max_mss), ipv6_helper, tcp_helper); } } } freelan-2.0/libs/asiotap/src/udp_builder.cpp000066400000000000000000000050061252300335000211430ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file udp_builder.cpp * \author Julien KAUFFMANN * \brief An udp frame builder class. */ #include "osi/udp_builder.hpp" #include "osi/udp_helper.hpp" namespace asiotap { namespace osi { size_t builder::write( uint16_t source, uint16_t destination ) const { helper_type helper = get_helper(); helper.set_source(source); helper.set_destination(destination); helper.set_length(static_cast(sizeof(frame_type) + boost::asio::buffer_size(payload()))); return helper.length(); } void builder::update_checksum(const_helper parent_frame) { helper_type helper = get_helper(); helper.set_checksum(0x0000); helper.set_checksum(helper.compute_checksum(parent_frame)); } } } freelan-2.0/libs/asiotap/src/udp_filter.cpp000066400000000000000000000036451252300335000210110ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file udp_filter.cpp * \author Julien KAUFFMANN * \brief An UDP filter class. */ #include "osi/udp_filter.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/udp_frame.cpp000066400000000000000000000036461252300335000206170ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file udp_frame.cpp * \author Julien KAUFFMANN * \brief An UDP frame structure. */ #include "osi/udp_frame.hpp" namespace asiotap { namespace osi { } } freelan-2.0/libs/asiotap/src/udp_helper.cpp000066400000000000000000000113511252300335000207740ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file udp_helper.cpp * \author Julien KAUFFMANN * \brief An UDP helper class. */ #include "osi/udp_helper.hpp" #include "osi/checksum_helper.hpp" namespace asiotap { namespace osi { namespace { template struct udp_pseudo_header; template <> struct udp_pseudo_header > { typedef udp_ipv4_pseudo_header type; }; template <> struct udp_pseudo_header > { typedef udp_ipv6_pseudo_header type; }; udp_ipv4_pseudo_header parent_frame_to_pseudo_header(const_helper parent_frame, uint16_t udp_length) { udp_ipv4_pseudo_header pseudo_header; memset(&pseudo_header, 0x00, sizeof(pseudo_header)); pseudo_header.ipv4_source = parent_frame.frame().source; pseudo_header.ipv4_destination = parent_frame.frame().destination; pseudo_header.ipv4_protocol = parent_frame.frame().protocol; pseudo_header.udp_length = htons(udp_length); return pseudo_header; } udp_ipv6_pseudo_header parent_frame_to_pseudo_header(const_helper parent_frame, uint16_t udp_length) { udp_ipv6_pseudo_header pseudo_header; memset(&pseudo_header, 0x00, sizeof(pseudo_header)); pseudo_header.ipv6_source = parent_frame.frame().source; pseudo_header.ipv6_destination = parent_frame.frame().destination; pseudo_header.ipv6_next_header = parent_frame.frame().next_header; pseudo_header.udp_length = htons(udp_length); return pseudo_header; } template uint16_t compute_udp_checksum(ParentHelperType parent_frame, HelperType udp_frame) { const uint16_t* buf = boost::asio::buffer_cast(udp_frame.buffer()); size_t buf_len = boost::asio::buffer_size(udp_frame.buffer()); checksum_helper chk; typename udp_pseudo_header::type pseudo_header = parent_frame_to_pseudo_header(parent_frame, udp_frame.length()); chk.update(reinterpret_cast(&pseudo_header), sizeof(pseudo_header)); chk.update(buf, buf_len); return chk.compute(); } } template uint16_t _base_helper_impl::compute_checksum(const_helper parent_frame) const { return compute_udp_checksum(parent_frame, *this); } template uint16_t _base_helper_impl::compute_checksum(const_helper parent_frame) const { return compute_udp_checksum(parent_frame, *this); } template uint16_t _base_helper_impl::compute_checksum(const_helper) const; template uint16_t _base_helper_impl::compute_checksum(const_helper) const; template uint16_t _base_helper_impl::compute_checksum(const_helper) const; template uint16_t _base_helper_impl::compute_checksum(const_helper) const; } } freelan-2.0/libs/asiotap/src/windows/000077500000000000000000000000001252300335000176325ustar00rootroot00000000000000freelan-2.0/libs/asiotap/src/windows/netsh.cpp000066400000000000000000000103741252300335000214640ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file windows_tap_adapter.cpp * \author Julien KAUFFMANN * \brief The Windows tap adapter class. */ #include "windows/netsh.hpp" #include #include #include namespace asiotap { namespace { size_t get_system_directory(char* buf, size_t buf_len) { return static_cast(::GetSystemDirectoryA(buf, static_cast(buf_len))); } size_t get_system_directory(wchar_t* buf, size_t buf_len) { return static_cast(::GetSystemDirectoryW(buf, static_cast(buf_len))); } template std::basic_string get_system_directory() { const size_t required_size = get_system_directory(static_cast(NULL), 0); if (required_size == 0) { throw boost::system::system_error(::GetLastError(), boost::system::system_category()); } std::basic_string result; // We make room for the content and the trailing NULL character. result.resize(required_size + 1); const size_t new_size = get_system_directory(&result[0], result.size()); if (new_size == 0) { throw boost::system::system_error(::GetLastError(), boost::system::system_category()); } // Get rid of the trailing NULL character. result.resize(new_size); return result; } } std::wstring multi_byte_to_wide_char(const std::string& str) { if (str.empty()) { return std::wstring(); } size_t required_size = ::MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, &str[0], str.size(), nullptr, 0); if (required_size == 0) { throw boost::system::system_error(::GetLastError(), boost::system::system_category()); } std::wstring result(required_size, '\0'); required_size = ::MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, &str[0], str.size(), &result[0], result.capacity()); if (required_size == 0) { throw boost::system::system_error(::GetLastError(), boost::system::system_category()); } result.resize(required_size); return result; } #ifdef UNICODE void netsh(const std::vector& args) #else void netsh(const std::vector& args) #endif { #ifdef UNICODE std::vector real_args = { get_system_directory() + L"\\netsh.exe" }; #else std::vector real_args = { get_system_directory() + "\\netsh.exe" }; #endif real_args.insert(real_args.end(), args.begin(), args.end()); const auto env = executeplus::get_current_environment(); executeplus::checked_execute(real_args, env); } } freelan-2.0/libs/asiotap/src/windows/windows_dns_servers_manager.cpp000066400000000000000000000105551252300335000261450ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file windows_dns_servers_manager.cpp * \author Julien KAUFFMANN * \brief The Windows DNS servers manager class. */ #include "windows/windows_dns_servers_manager.hpp" #include "windows/netsh.hpp" #include namespace asiotap { namespace { void netsh_interface_ip_generic_dns(const std::string& verb, const std::string& interface_name, const boost::asio::ip::address& dns_server) { std::vector args; args = { "interface", dns_server.is_v4() ? "ipv4" : "ipv6", verb, "dnsservers", "name=" + interface_name }; if (verb != "delete") { args.push_back("source=static"); } args.push_back("address=" + boost::lexical_cast(dns_server.to_string())); #ifdef UNICODE std::vector wargs; for (auto&& arg : args) { wargs.push_back(multi_byte_to_wide_char(arg)); } netsh(wargs); #else netsh(args); #endif } void netsh_interface_ip_set_dnsservers(const std::string& interface_name, const boost::asio::ip::address& dns_server) { return netsh_interface_ip_generic_dns("set", interface_name, dns_server); } void netsh_interface_ip_add_dnsservers(const std::string& interface_name, const boost::asio::ip::address& dns_server) { return netsh_interface_ip_generic_dns("add", interface_name, dns_server); } void netsh_interface_ip_delete_dnsservers(const std::string& interface_name, const boost::asio::ip::address& dns_server) { return netsh_interface_ip_generic_dns("delete", interface_name, dns_server); } } void windows_dns_servers_manager::register_dns_server(const dns_server_type& dns_server_entry) { auto& ip_addresses = m_references[dns_server_entry.interface_name]; if (ip_addresses.empty()) { netsh_interface_ip_set_dnsservers(dns_server_entry.interface_name, dns_server_entry.dns_server_address.value()); } else { netsh_interface_ip_add_dnsservers(dns_server_entry.interface_name, dns_server_entry.dns_server_address.value()); } ip_addresses.insert(dns_server_entry.dns_server_address); } void windows_dns_servers_manager::unregister_dns_server(const dns_server_type& dns_server_entry) { auto& ip_addresses = m_references[dns_server_entry.interface_name]; const auto index = ip_addresses.find(dns_server_entry.dns_server_address); if (index == ip_addresses.end()) { // Okay, we try to delete an address that was never added by us. This doesn't seem too good. assert(false); } else { netsh_interface_ip_delete_dnsservers(dns_server_entry.interface_name, dns_server_entry.dns_server_address.value()); ip_addresses.erase(index); } } } freelan-2.0/libs/asiotap/src/windows/windows_route_manager.cpp000066400000000000000000000173331252300335000247470ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file windows_route_manager.cpp * \author Julien KAUFFMANN * \brief The Windows route manager class. */ #include "windows/windows_route_manager.hpp" #include "windows/netsh.hpp" #include "error.hpp" #include #include #include #include #include #include namespace asiotap { namespace { void set_sockaddr_inet(SOCKADDR_INET& result, const boost::asio::ip::address& address) { if (address.is_v4()) { const auto bytes = address.to_v4().to_bytes(); std::memcpy(&result.Ipv4.sin_addr, bytes.data(), bytes.size()); result.Ipv4.sin_family = AF_INET; } else if (address.is_v6()) { const auto bytes = address.to_v6().to_bytes(); std::memcpy(&result.Ipv6.sin6_addr, bytes.data(), bytes.size()); result.Ipv6.sin6_family = AF_INET6; } else { throw boost::system::system_error(make_error_code(asiotap_error::invalid_type)); } } boost::optional from_sockaddr_inet(const SOCKADDR_INET& sai) { if (sai.si_family == AF_INET) { typedef boost::asio::ip::address_v4 addr_type; addr_type::bytes_type bytes; std::memcpy(bytes.data(), &sai.Ipv4.sin_addr, bytes.size()); const addr_type result(bytes); if (result != addr_type::any()) { return result; } } else if (sai.si_family == AF_INET6) { typedef boost::asio::ip::address_v6 addr_type; addr_type::bytes_type bytes; std::memcpy(bytes.data(), &sai.Ipv6.sin6_addr, bytes.size()); const addr_type result(bytes); if (result != addr_type::any()) { return result; } } return boost::none; } MIB_IPFORWARD_ROW2 make_ip_forward_row(const NET_LUID& interface_luid, const ip_route& route, unsigned int metric) { const auto ina = network_address(route); const auto gw = gateway(route); MIB_IPFORWARD_ROW2 entry{}; ::InitializeIpForwardEntry(&entry); entry.Protocol = MIB_IPPROTO_NETMGMT; entry.InterfaceLuid = interface_luid; entry.Metric = metric; if (gw) { set_sockaddr_inet(entry.NextHop, *gw); } const auto network_ip_address = to_ip_address(ina); const auto network_prefix_length = to_prefix_length(ina); set_sockaddr_inet(entry.DestinationPrefix.Prefix, network_ip_address); entry.DestinationPrefix.PrefixLength = network_prefix_length; return entry; } MIB_UNICASTIPADDRESS_ROW make_unicast_ip_address_row(const NET_LUID& interface_luid, const ip_network_address& network_address) { MIB_UNICASTIPADDRESS_ROW entry{}; InitializeUnicastIpAddressEntry(&entry); entry.InterfaceLuid = interface_luid; const auto network_ip_address = to_ip_address(network_address); const auto network_prefix_length = to_prefix_length(network_address); set_sockaddr_inet(entry.Address, network_ip_address); entry.OnLinkPrefixLength = network_prefix_length; return entry; } } void windows_route_manager::register_route(const route_type& route_entry) { register_route(route_entry.interface, route_entry.route, route_entry.metric); } void windows_route_manager::unregister_route(const route_type& route_entry) { unregister_route(route_entry.interface, route_entry.route, route_entry.metric); } void windows_route_manager::netsh_interface_ip_set_address(const std::string& interface_name, const ip_network_address& address, bool persistent) { std::vector args; if (to_ip_address(address).is_v4()) { args = { "interface", "ip", "set", "address", "name=" + interface_name, "source=static", "addr=" + boost::lexical_cast(address), "gateway=none", persistent ? "store=persistent" : "store=active" }; } else { args = { "interface", "ipv6", "set", "address", "interface=" + interface_name, "address=" + boost::lexical_cast(address), persistent ? "store=persistent" : "store=active" }; } #ifdef UNICODE std::vector wargs; for (auto&& arg : args) { wargs.push_back(multi_byte_to_wide_char(arg)); } netsh(wargs); #else netsh(args); #endif } windows_route_manager::route_type windows_route_manager::get_route_for(const boost::asio::ip::address& host) { SOCKADDR_INET dest_addr {}; set_sockaddr_inet(dest_addr, host); MIB_IPFORWARD_ROW2 best_route{}; ::InitializeIpForwardEntry(&best_route); SOCKADDR_INET best_source_address {}; const DWORD result = ::GetBestRoute2(NULL, 0, NULL, &dest_addr, 0, &best_route, &best_source_address); if (result != NO_ERROR) { throw boost::system::system_error(result, boost::system::system_category()); } const auto gw = from_sockaddr_inet(best_route.NextHop); const auto route = to_ip_route(to_network_address(host), gw); const windows_route_manager::route_type route_entry = { best_route.InterfaceLuid, route, 0 }; return route_entry; } void windows_route_manager::register_route(const NET_LUID& interface_luid, const ip_route& route, unsigned int metric) { const auto row = make_ip_forward_row(interface_luid, route, metric); const DWORD result = ::CreateIpForwardEntry2(&row); if (result != NO_ERROR) { throw boost::system::system_error(result, boost::system::system_category()); } } void windows_route_manager::unregister_route(const NET_LUID& interface_luid, const ip_route& route, unsigned int metric) { const auto row = make_ip_forward_row(interface_luid, route, metric); const DWORD result = ::DeleteIpForwardEntry2(&row); if (result != NO_ERROR) { throw boost::system::system_error(result, boost::system::system_category()); } } void windows_route_manager::set_unicast_address(const NET_LUID& interface_luid, const ip_network_address& network_address) { const auto row = make_unicast_ip_address_row(interface_luid, network_address); const DWORD result = ::SetUnicastIpAddressEntry(&row); if (result != NO_ERROR) { throw boost::system::system_error(result, boost::system::system_category()); } } } freelan-2.0/libs/asiotap/src/windows/windows_tap_adapter.cpp000066400000000000000000000341541252300335000244030ustar00rootroot00000000000000/* * libasiotap - A portable TAP adapter extension for Boost::ASIO. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libasiotap. * * libasiotap is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libasiotap is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libasiotap in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file windows_tap_adapter.cpp * \author Julien KAUFFMANN * \brief The Windows tap adapter class. */ #include "windows/windows_tap_adapter.hpp" #include "windows/registry.hpp" #include #include #include #include #include #include #include #include #include "../../windows/tap-windows.h" namespace asiotap { namespace { typedef std::vector guid_array_type; typedef std::map guid_map_type; typedef std::pair guid_pair_type; guid_array_type enumerate_tap_adapters_guid() { guid_array_type tap_adapters_list; const std::string tap_component_id(TAP_ID); const registry_key adapter_key(HKEY_LOCAL_MACHINE, ADAPTER_KEY); for (registry_key network_adapter_key : adapter_key.available_keys()) { if (network_adapter_key.is_open()) { try { const std::string component_id_str = network_adapter_key.query_string("ComponentId"); if (tap_component_id == component_id_str) { const std::string net_cfg_instance_id_str = network_adapter_key.query_string("NetCfgInstanceId"); tap_adapters_list.push_back(net_cfg_instance_id_str); } } catch (const boost::system::system_error&) { } } } return tap_adapters_list; } guid_map_type enumerate_network_connections() { guid_map_type network_connections_map; const registry_key network_connections_key(HKEY_LOCAL_MACHINE, NETWORK_CONNECTIONS_KEY); for (registry_key network_connection_key : network_connections_key.available_keys()) { if (network_connection_key.is_open()) { try { const registry_key connection_key(network_connection_key, "Connection"); const std::string name = connection_key.query_string("Name"); network_connections_map[network_connection_key.name()] = name; } catch (const boost::system::system_error&) { } } } return network_connections_map; } guid_map_type enumerate_tap_adapters() { guid_map_type tap_adapters_map; try { guid_map_type network_connections_map = enumerate_network_connections(); const guid_array_type tap_adapters_list = enumerate_tap_adapters_guid(); for (const std::string& guid : tap_adapters_list) { if (network_connections_map.find(guid) != network_connections_map.end()) { tap_adapters_map[guid] = network_connections_map[guid]; } } } catch (const boost::system::system_error&) { } return tap_adapters_map; } guid_pair_type find_tap_adapter_by_guid(const std::string& guid) { const guid_map_type tap_adapters_map = enumerate_tap_adapters(); const guid_map_type::const_iterator it = tap_adapters_map.find(guid); if (it == tap_adapters_map.end()) { throw make_error_code(asiotap_error::no_such_tap_adapter); } return *it; } } std::map windows_tap_adapter::enumerate(tap_adapter_layer) { return enumerate_tap_adapters(); } void windows_tap_adapter::open(boost::system::error_code& ec) { const guid_map_type tap_adapters_map = enumerate_tap_adapters(); if (tap_adapters_map.empty()) { throw std::runtime_error("No tap adapter found. You may want to relaunch the installer to install one."); } for (auto&& tap_adapter : tap_adapters_map) { if (!tap_adapter.first.empty()) { open(tap_adapter.first, ec); if (!ec) { return; } } } throw std::runtime_error("Some tap adapters were found but none could be opened. Are they all in use already ?"); } void windows_tap_adapter::open(const std::string& _name, boost::system::error_code& ec) { ec = boost::system::error_code(); if (_name.empty()) { return open(ec); } PIP_ADAPTER_INFO piai = NULL; ULONG size = 0; DWORD status; status = GetAdaptersInfo(piai, &size); if (status != ERROR_BUFFER_OVERFLOW) { ec = boost::system::error_code(status, boost::system::system_category()); return; } assert(size > 0); std::vector piai_data(size); piai = reinterpret_cast(&piai_data[0]); status = GetAdaptersInfo(piai, &size); if (status != ERROR_SUCCESS) { ec = boost::system::error_code(status, boost::system::system_category()); return; } piai_data.resize(size); try { const guid_pair_type adapter = find_tap_adapter_by_guid(_name); for (PIP_ADAPTER_INFO pi = piai; pi; pi = pi->Next) { if (adapter.first == std::string(pi->AdapterName)) { const HANDLE handle = CreateFileA( (USERMODEDEVICEDIR + adapter.first + TAP_WIN_SUFFIX).c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_OVERLAPPED, 0 ); if (handle == INVALID_HANDLE_VALUE) { ec = boost::system::error_code(::GetLastError(), boost::system::system_category()); return; } if (descriptor().assign(handle, ec)) { return; } set_name(adapter.first); m_display_name = adapter.second; m_interface_index = pi->Index; if (::ConvertInterfaceIndexToLuid(m_interface_index, &m_interface_luid) != NO_ERROR) { ec = boost::system::error_code(::GetLastError(), boost::system::system_category()); return; } if (pi->AddressLength != ethernet_address().data().size()) { if (close(ec)) { return; } ec = make_error_code(asiotap_error::no_ethernet_address); return; } osi::ethernet_address _ethernet_address; std::memcpy(_ethernet_address.data().data(), pi->Address, pi->AddressLength); set_ethernet_address(_ethernet_address); DWORD read_mtu; DWORD len; if (!DeviceIoControl(descriptor().native_handle(), TAP_WIN_IOCTL_GET_MTU, &read_mtu, sizeof(read_mtu), &read_mtu, sizeof(read_mtu), &len, NULL)) { ec = boost::system::error_code(::GetLastError(), boost::system::system_category()); return; } set_mtu(static_cast(read_mtu)); break; } } } catch (const boost::system::system_error& ex) { ec = ex.code(); return; } if (!is_open()) { ec = make_error_code(asiotap_error::no_such_tap_adapter); } } void windows_tap_adapter::open(const std::string& _name) { boost::system::error_code ec; open(_name, ec); if (ec) { throw boost::system::system_error(ec); } } void windows_tap_adapter::set_connected_state(bool connected) { ULONG status = connected ? TRUE : FALSE; DWORD len; if (!::DeviceIoControl(descriptor().native_handle(), TAP_WIN_IOCTL_SET_MEDIA_STATUS, &status, sizeof(status), NULL, 0, &len, NULL)) { throw boost::system::system_error(::GetLastError(), boost::system::system_category()); } } ip_network_address_list windows_tap_adapter::get_ip_addresses() { ip_network_address_list result; DWORD status; std::vector buffer; ULONG buffer_size = 0; do { buffer.resize(buffer_size); buffer_size = static_cast(buffer.size()); status = ::GetAdaptersAddresses( AF_UNSPEC, GAA_FLAG_INCLUDE_ALL_INTERFACES | GAA_FLAG_INCLUDE_PREFIX | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_FRIENDLY_NAME | GAA_FLAG_SKIP_MULTICAST, NULL, /* reserved */ reinterpret_cast(buffer.empty() ? nullptr : &buffer.front()), &buffer_size ); if ((status != ERROR_BUFFER_OVERFLOW) && (status != ERROR_SUCCESS)) { throw boost::system::system_error(status, boost::system::system_category()); } } while (status == ERROR_BUFFER_OVERFLOW); for (PIP_ADAPTER_ADDRESSES adapter = reinterpret_cast(&buffer.front()); adapter; adapter = adapter->Next) { const std::string ifname(adapter->AdapterName); if (ifname == name()) { for (const IP_ADAPTER_UNICAST_ADDRESS* unicast_address = adapter->FirstUnicastAddress; unicast_address; unicast_address = unicast_address->Next) { if (unicast_address->Address.lpSockaddr->sa_family == AF_INET) { struct sockaddr_in* sai = reinterpret_cast(unicast_address->Address.lpSockaddr); boost::asio::ip::address_v4::bytes_type bytes; std::memcpy(bytes.data(), &sai->sin_addr, bytes.size()); boost::asio::ip::address_v4 address(bytes); const unsigned int prefix_len = unicast_address->OnLinkPrefixLength; result.push_back(ipv4_network_address{ address, prefix_len }); } else { struct sockaddr_in6* sai = reinterpret_cast(unicast_address->Address.lpSockaddr); boost::asio::ip::address_v6::bytes_type bytes; memcpy(bytes.data(), &sai->sin6_addr, bytes.size()); boost::asio::ip::address_v6 address(bytes); const unsigned int prefix_len = unicast_address->OnLinkPrefixLength; result.push_back(ipv6_network_address{ address, prefix_len }); } } } } return result; } void windows_tap_adapter::configure(const configuration_type& configuration) { if (::FlushIpNetTable(m_interface_index) != NO_ERROR) { // Not able to flush the ARP table. // // This is non fatal. } if (layer() == tap_adapter_layer::ip) { if (!configuration.ipv4.network_address) { throw boost::system::system_error(make_error_code(asiotap_error::invalid_ip_configuration)); } DWORD len = 0; const unsigned int plen = configuration.ipv4.network_address->prefix_length(); const boost::asio::ip::address_v4::bytes_type addr = configuration.ipv4.network_address->address().to_bytes(); const uint32_t netmask = htonl(plen > 0 ? 0 - (1 << (32 - plen)) : 0xFFFFFFFF); if (configuration.ipv4.remote_address) { const uint32_t network = htonl(configuration.ipv4.remote_address->to_ulong()) & netmask; uint8_t param[3 * sizeof(uint32_t)]; // address std::memcpy(param, addr.data(), addr.size()); // network std::memcpy(param + sizeof(uint32_t), &network, sizeof(uint32_t)); // netmask std::memcpy(param + 2 * sizeof(uint32_t), &netmask, sizeof(uint32_t)); if (!::DeviceIoControl(descriptor().native_handle(), TAP_WIN_IOCTL_CONFIG_TUN, param, sizeof(param), param, sizeof(param), &len, NULL)) { throw boost::system::system_error(::GetLastError(), boost::system::system_category()); } } else { uint8_t param[3 * sizeof(uint32_t)]; // address std::memcpy(param, addr.data(), addr.size()); // netmask std::memcpy(param + 2 * sizeof(uint32_t), &netmask, sizeof(uint32_t)); if (!::DeviceIoControl(descriptor().native_handle(), TAP_WIN_IOCTL_CONFIG_POINT_TO_POINT, param, sizeof(param), param, sizeof(param), &len, NULL)) { throw boost::system::system_error(::GetLastError(), boost::system::system_category()); } } } else { if (configuration.ipv4.remote_address) { throw boost::system::system_error(make_error_code(asiotap_error::invalid_ip_configuration)); } } if (configuration.ipv4.network_address) { try { // Depending on the TAP adapter version this may not be supported. m_route_manager.netsh_interface_ip_set_address(display_name(), *configuration.ipv4.network_address); } catch (const boost::system::system_error& ex) { if (ex.code() != executeplus::executeplus_error::external_process_failed) { throw; } } } if (configuration.ipv6.network_address) { try { // Depending on the TAP adapter version this may not be supported. m_route_manager.netsh_interface_ip_set_address(display_name(), *configuration.ipv6.network_address); } catch (const boost::system::system_error& ex) { if (ex.code() != executeplus::executeplus_error::external_process_failed) { throw; } } } } void windows_tap_adapter::set_metric(unsigned int metric) { MIB_IPINTERFACE_ROW row{}; ::InitializeIpInterfaceEntry(&row); row.InterfaceLuid = m_interface_luid; row.Family = AF_INET; auto error = ::GetIpInterfaceEntry(&row); if (error != NO_ERROR) { throw boost::system::system_error(error, boost::system::system_category()); } row.Metric = static_cast(metric); row.UseAutomaticMetric = FALSE; // This is needed before a call to SetIpInterfaceEntry with AF_INET as the family. row.SitePrefixLength = 0; error = ::SetIpInterfaceEntry(&row); if (error != NO_ERROR) { throw boost::system::system_error(error, boost::system::system_category()); } } } freelan-2.0/libs/asiotap/windows/000077500000000000000000000000001252300335000170435ustar00rootroot00000000000000freelan-2.0/libs/asiotap/windows/README.txt000066400000000000000000000002251252300335000205400ustar00rootroot00000000000000The file tap-windows.h belongs to the TAP-Windows adapter driver source code from OpenVPN. It was copied here without any changes for safe-keeping. freelan-2.0/libs/asiotap/windows/tap-windows.h000066400000000000000000000053171252300335000214760ustar00rootroot00000000000000/* * TAP-Windows -- A kernel driver to provide virtual tap * device functionality on Windows. * * This code was inspired by the CIPE-Win32 driver by Damion K. Wilson. * * This source code is Copyright (C) 2002-2010 OpenVPN Technologies, Inc., * and is released under the GPL version 2 (see below). * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING included with this * distribution); if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef __TAP_WIN_H #define __TAP_WIN_H /* * ============= * TAP IOCTLs * ============= */ #define TAP_WIN_CONTROL_CODE(request,method) \ CTL_CODE (FILE_DEVICE_UNKNOWN, request, method, FILE_ANY_ACCESS) /* Present in 8.1 */ #define TAP_WIN_IOCTL_GET_MAC TAP_WIN_CONTROL_CODE (1, METHOD_BUFFERED) #define TAP_WIN_IOCTL_GET_VERSION TAP_WIN_CONTROL_CODE (2, METHOD_BUFFERED) #define TAP_WIN_IOCTL_GET_MTU TAP_WIN_CONTROL_CODE (3, METHOD_BUFFERED) #define TAP_WIN_IOCTL_GET_INFO TAP_WIN_CONTROL_CODE (4, METHOD_BUFFERED) #define TAP_WIN_IOCTL_CONFIG_POINT_TO_POINT TAP_WIN_CONTROL_CODE (5, METHOD_BUFFERED) #define TAP_WIN_IOCTL_SET_MEDIA_STATUS TAP_WIN_CONTROL_CODE (6, METHOD_BUFFERED) #define TAP_WIN_IOCTL_CONFIG_DHCP_MASQ TAP_WIN_CONTROL_CODE (7, METHOD_BUFFERED) #define TAP_WIN_IOCTL_GET_LOG_LINE TAP_WIN_CONTROL_CODE (8, METHOD_BUFFERED) #define TAP_WIN_IOCTL_CONFIG_DHCP_SET_OPT TAP_WIN_CONTROL_CODE (9, METHOD_BUFFERED) /* Added in 8.2 */ /* obsoletes TAP_WIN_IOCTL_CONFIG_POINT_TO_POINT */ #define TAP_WIN_IOCTL_CONFIG_TUN TAP_WIN_CONTROL_CODE (10, METHOD_BUFFERED) /* * ================= * Registry keys * ================= */ #define ADAPTER_KEY "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}" #define NETWORK_CONNECTIONS_KEY "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}" /* * ====================== * Filesystem prefixes * ====================== */ #define USERMODEDEVICEDIR "\\\\.\\Global\\" #define SYSDEVICEDIR "\\Device\\" #define USERDEVICEDIR "\\DosDevices\\Global\\" #define TAP_WIN_SUFFIX ".tap" #endif freelan-2.0/libs/asiotap/windows/tap_adapter/000077500000000000000000000000001252300335000213275ustar00rootroot00000000000000freelan-2.0/libs/asiotap/windows/tap_adapter/README.txt000066400000000000000000000001501252300335000230210ustar00rootroot00000000000000In this directory, you will find the source code for a tool that ease TAP adapter installation/removal. freelan-2.0/libs/asiotap/windows/tap_adapter/tap-setup/000077500000000000000000000000001252300335000232515ustar00rootroot00000000000000freelan-2.0/libs/asiotap/windows/tap_adapter/tap-setup/README.txt000066400000000000000000000004401252300335000247450ustar00rootroot00000000000000# How-to build the tap-setup binary - Install the Windows Driver Kit (http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx) - Open the proper WDK build environment (depends on the target platform): likely "x86 Free" or "x64 Free". - Go into this directory - Type: "build -c" - Enjoy ! freelan-2.0/libs/asiotap/windows/tap_adapter/tap-setup/sources000066400000000000000000000010531252300335000246560ustar00rootroot00000000000000TARGETNAME=tap-setup TARGETTYPE=PROGRAM USE_MSVCRT=1 USE_STL=1 USER_C_FLAGS=/EHsc MSC_WARNING_LEVEL=/W4 /WX C_DEFINES=$(C_DEFINES) -DUNICODE -D_UNICODE SOURCES=tap_setup.cpp TARGETLIBS=\ $(SDK_LIB_PATH)\advapi32.lib \ $(SDK_LIB_PATH)\kernel32.lib \ $(SDK_LIB_PATH)\ntdll.lib \ $(SDK_LIB_PATH)\ole32.lib \ $(SDK_LIB_PATH)\setupapi.lib \ $(SDK_LIB_PATH)\shell32.lib \ $(SDK_LIB_PATH)\user32.lib _NT_TARGET_VERSION = $(_NT_TARGET_VERSION_WINXP) UMTYPE=console UMENTRY=wmain MUI=0 freelan-2.0/libs/asiotap/windows/tap_adapter/tap-setup/tap_setup.cpp000066400000000000000000000331661252300335000257720ustar00rootroot00000000000000/* * libfreelan - open-source and multi-platform peer-to-peer VPN library. * Copyright 2007-2010 Julien Kauffmann * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file tap_setup.cpp * \author Julien KAUFFMANN * \brief The tap-setup main file. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define EXIT_REBOOT_REQUIRED 2 typedef BOOL (WINAPI *UpdateDriverForPlugAndPlayDevicesFunc)(HWND hwndParent, LPCTSTR HardwareId, LPCTSTR FullInfPath, DWORD InstallFlags, PBOOL bRebootRequired); bool reboot(); bool install(const std::wstring& inf, const std::wstring& hardware_id, bool& reboot_required); bool update(const std::wstring& inf, const std::wstring& hardware_id, bool& reboot_required); bool remove(const std::wstring& class_name, bool& reboot_required); LPTSTR* getDeviceProperty(HDEVINFO devices, const SP_DEVINFO_DATA& device_info, DWORD property); bool reboot() { HANDLE token; TOKEN_PRIVILEGES new_privileges; LUID luid; if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &token)) { if (LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &luid)) { new_privileges.PrivilegeCount = 1; new_privileges.Privileges[0].Luid = luid; new_privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(token, FALSE, &new_privileges, 0, NULL, NULL); } CloseHandle(token); } #pragma warning(suppress: 28159) return (InitiateSystemShutdownEx(NULL, NULL, 0, FALSE, TRUE, REASON_PLANNED_FLAG | REASON_HWINSTALL) == TRUE); } bool install(const std::wstring& inf, const std::wstring& hardware_id, bool& reboot_required) { TCHAR inf_path[MAX_PATH]; if (GetFullPathName(inf.c_str(), MAX_PATH, inf_path, NULL) >= MAX_PATH) { return false; } std::wcerr << "INF file full path: " << inf_path << std::endl; bool result = false; TCHAR hardware_id_list[LINE_LEN + 4]; ZeroMemory(hardware_id_list, sizeof(hardware_id_list)); if (SUCCEEDED(StringCchCopy(hardware_id_list, LINE_LEN, hardware_id.c_str()))) { std::wcerr << "Hardware identifier list: " << hardware_id_list << std::endl; GUID class_guid; TCHAR class_name[MAX_CLASS_NAME_LEN]; if (SetupDiGetINFClass(inf_path, &class_guid, class_name, sizeof(class_name) / sizeof(class_name[0]), 0)) { std::wcerr << "Class name: " << class_name << std::endl; HDEVINFO device_info_set = INVALID_HANDLE_VALUE; device_info_set = SetupDiCreateDeviceInfoList(&class_guid, 0); if (device_info_set != INVALID_HANDLE_VALUE) { std::wcerr << "Device information set created." << std::endl; SP_DEVINFO_DATA device_info_data; device_info_data.cbSize = sizeof(SP_DEVINFO_DATA); if (SetupDiCreateDeviceInfo(device_info_set, class_name, &class_guid, NULL, 0, DICD_GENERATE_ID, &device_info_data)) { std::wcerr << "Device information element created." << std::endl; if (SetupDiSetDeviceRegistryProperty(device_info_set, &device_info_data, SPDRP_HARDWAREID, (LPBYTE)hardware_id_list, (lstrlen(hardware_id_list) + 1 + 1) * sizeof(TCHAR))) { std::wcerr << "Hardware id set." << std::endl; if (SetupDiCallClassInstaller(DIF_REGISTERDEVICE, device_info_set, &device_info_data)) { std::wcerr << "Device registered." << std::endl; result = update(inf, hardware_id, reboot_required); } } } SetupDiDestroyDeviceInfoList(device_info_set); } } } return result; } bool update(const std::wstring& inf, const std::wstring& hardware_id, bool& reboot_required) { TCHAR inf_path[MAX_PATH]; if (GetFullPathName(inf.c_str(), MAX_PATH, inf_path, NULL) >= MAX_PATH) { return false; } if (GetFileAttributes(inf_path) == (DWORD)(-1)) { return false; } bool result = false; DWORD flags = INSTALLFLAG_FORCE; HMODULE new_device_module = LoadLibrary(TEXT("newdev.dll")); if (new_device_module) { std::wcerr << "Loaded newdev.dll." << std::endl; UpdateDriverForPlugAndPlayDevicesFunc update_function = reinterpret_cast( GetProcAddress(new_device_module, "UpdateDriverForPlugAndPlayDevicesW") ); if (update_function) { std::wcerr << "Update function loaded." << std::endl; BOOL reboot = FALSE; if (update_function(NULL, hardware_id.c_str(), inf_path, flags, &reboot)) { std::wcerr << "Update function suceeded. Device is up to date." << std::endl; reboot_required = (reboot == TRUE); result = true; } else { std::wcerr << "Unable to update the device." << std::endl; } } else { std::wcerr << "Unable to load the update function." << std::endl; } FreeLibrary(new_device_module); } return result; } bool getDeviceProperty(HDEVINFO devices, SP_DEVINFO_DATA& device_info, DWORD property, std::wstring& value) { DWORD size = 8192; try { DWORD data_type; DWORD requested_size; LPTSTR buffer = new TCHAR[(size / sizeof(TCHAR)) + 1]; memset(buffer, 0x00, (size / sizeof(TCHAR)) + 1); if (buffer) { bool success = true; while (!SetupDiGetDeviceRegistryProperty(devices, &device_info, property, &data_type, reinterpret_cast(buffer), size, &requested_size)) { if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { success = false; break; } if (data_type != REG_SZ) { success = false; break; } size = requested_size; delete[] buffer; buffer = new TCHAR[(size / sizeof(TCHAR)) + 1]; memset(buffer, 0x00, (size / sizeof(TCHAR)) + 1); if (!buffer) { success = false; break; } } if (success) { value = std::wstring(buffer); } delete[] buffer; return true; } } catch (...) { std::wcerr << "Allocation error. This is serious !" << std::endl; } return false; } bool getDeviceProperty(HDEVINFO devices, SP_DEVINFO_DATA& device_info, DWORD property, std::list& values) { DWORD size = 8192; try { DWORD data_type; DWORD requested_size; LPTSTR buffer = new TCHAR[(size / sizeof(TCHAR)) + 2]; memset(buffer, 0x00, (size / sizeof(TCHAR)) + 2); if (buffer) { bool success = true; while (!SetupDiGetDeviceRegistryProperty(devices, &device_info, property, &data_type, reinterpret_cast(buffer), size, &requested_size)) { if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { success = false; break; } if (data_type != REG_MULTI_SZ) { success = false; break; } size = requested_size; delete[] buffer; buffer = new TCHAR[(size / sizeof(TCHAR)) + 2]; memset(buffer, 0x00, (size / sizeof(TCHAR)) + 2); if (!buffer) { success = false; break; } } if (success) { values = std::list(); for (LPTSTR value = buffer; value[0]; value += lstrlen(value) + 1) { values.push_back(std::wstring(value)); } } delete[] buffer; return true; } } catch (...) { std::wcerr << "Allocation error. This is serious !" << std::endl; } return false; } bool remove(const std::wstring& hardware_id, bool& reboot_required) { bool result = false; HDEVINFO devices = SetupDiGetClassDevsEx(NULL, NULL, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT, NULL, NULL, NULL); if (devices != INVALID_HANDLE_VALUE) { std::wcerr << "Got device information set." << std::endl; SP_DEVINFO_LIST_DETAIL_DATA device_info_list_detail; memset(&device_info_list_detail, 0x00, sizeof(device_info_list_detail)); device_info_list_detail.cbSize = sizeof(device_info_list_detail); if (SetupDiGetDeviceInfoListDetail(devices, &device_info_list_detail)) { std::wcerr << "Got device information list details." << std::endl; SP_DEVINFO_DATA device_info; device_info.cbSize = sizeof(device_info); for (DWORD index = 0; SetupDiEnumDeviceInfo(devices, index, &device_info); ++index) { TCHAR device_id[MAX_DEVICE_ID_LEN]; if (CM_Get_Device_ID_Ex(device_info.DevInst, device_id, MAX_DEVICE_ID_LEN, 0, device_info_list_detail.RemoteMachineHandle) == CR_SUCCESS) { std::list device_hardware_id_list; if (getDeviceProperty(devices, device_info, SPDRP_HARDWAREID, device_hardware_id_list)) { bool match = false; for (std::list::const_iterator device_hardware_id = device_hardware_id_list.begin(); device_hardware_id != device_hardware_id_list.end(); ++device_hardware_id) { if (*device_hardware_id == hardware_id) { match = true; break; } } if (match) { std::wstring friendly_name; if (getDeviceProperty(devices, device_info, SPDRP_FRIENDLYNAME, friendly_name) && (friendly_name.length() > 0)) { std::wcerr << "Removing device: " << friendly_name << " (" << device_id << ")" << std::endl; } else { std::wcerr << "Removing device: " << device_id << std::endl; } SP_REMOVEDEVICE_PARAMS remove_device_params; remove_device_params.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); remove_device_params.ClassInstallHeader.InstallFunction = DIF_REMOVE; remove_device_params.Scope = DI_REMOVEDEVICE_GLOBAL; remove_device_params.HwProfile = 0; result = true; if (!SetupDiSetClassInstallParams(devices, &device_info, &remove_device_params.ClassInstallHeader, sizeof(remove_device_params)) || !SetupDiCallClassInstaller(DIF_REMOVE, devices, &device_info)) { std::wcerr << "Failed to set the class installer." << std::endl; result = false; } if (result) { reboot_required = false; SP_DEVINSTALL_PARAMS device_params; if (SetupDiGetDeviceInstallParams(devices, &device_info, &device_params)) { if (device_params.Flags & (DI_NEEDRESTART | DI_NEEDREBOOT)) { reboot_required = true; } } } } } } } } SetupDiDestroyDeviceInfoList(devices); } return result; } int _cdecl wmain(int argc, wchar_t** argv) { bool show_usage = false; int exit_code = EXIT_FAILURE; bool reboot_required = false; if (argc <= 1) { show_usage = true; } else { std::wstring command(argv[1]); if (command == TEXT("install")) { if (argc <= 3) { show_usage = true; } else { std::wstring inf(argv[2]); std::wstring hardware_id(argv[3]); if (install(inf, hardware_id, reboot_required)) { exit_code = reboot_required ? EXIT_REBOOT_REQUIRED : EXIT_SUCCESS; std::wcerr << "Installation of \"" << inf << "\" (" << hardware_id << ") succeeded." << std::endl; if (reboot_required) { std::wcerr << "A reboot is required to complete the operation." << std::endl; } } else { std::wcerr << "Installation of \"" << inf << "\" (" << hardware_id << ") failed." << std::endl; } } } else if (command == TEXT("remove")) { if (argc <= 2) { show_usage = true; } else { std::wstring hardware_id(argv[2]); if (remove(hardware_id, reboot_required)) { exit_code = reboot_required ? EXIT_REBOOT_REQUIRED : EXIT_SUCCESS; std::wcerr << "Removal of \"" << hardware_id << "\" succeeded." << std::endl; if (reboot_required) { std::wcerr << "A reboot is required to complete the operation." << std::endl; } } else { std::wcerr << "Removal of \"" << hardware_id << "\" failed." << std::endl; } } } else { std::wcerr << "Unknown command \"" << command << "\"." << std::endl; show_usage = true; } } if (show_usage) { std::wcerr << "Usage:\ttap-setup.exe install " << std::endl; std::wcerr << " \ttap-setup.exe remove " << std::endl; std::wcerr << std::endl; std::wcerr << "Returns 0 on success, 1 on failure and 2 if a reboot is required to complete the operation." << std::endl; exit_code = EXIT_FAILURE; } return exit_code; } freelan-2.0/libs/cryptoplus/000077500000000000000000000000001252300335000161355ustar00rootroot00000000000000freelan-2.0/libs/cryptoplus/CONTRIBUTORS.md000066400000000000000000000001601252300335000204110ustar00rootroot00000000000000Contributors ============ Julien Kauffmann Damien Buhl freelan-2.0/libs/cryptoplus/LICENSE.OpenSSL000066400000000000000000000142071252300335000204300ustar00rootroot00000000000000 LICENSE ISSUES ============== The OpenSSL toolkit stays under a dual license, i.e. both the conditions of the OpenSSL License and the original SSLeay license apply to the toolkit. See below for the actual license texts. Actually both licenses are BSD-style Open Source licenses. In case of any license issues related to OpenSSL please contact openssl-core@openssl.org. OpenSSL License --------------- /* ==================================================================== * Copyright (c) 1998-2008 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" * * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please contact * openssl-core@openssl.org. * * 5. Products derived from this software may not be called "OpenSSL" * nor may "OpenSSL" appear in their names without prior written * permission of the OpenSSL Project. * * 6. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit (http://www.openssl.org/)" * * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY * EXPRESSED 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 OpenSSL PROJECT OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This product includes cryptographic software written by Eric Young * (eay@cryptsoft.com). This product includes software written by Tim * Hudson (tjh@cryptsoft.com). * */ Original SSLeay License ----------------------- /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * 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 copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ freelan-2.0/libs/cryptoplus/README.md000066400000000000000000000131671252300335000174240ustar00rootroot00000000000000# What is libcryptoplus? libcryptoplus stands as a lightweight, simple, yet complete, C++ wrapper around the OpenSSL cryptographic library. libcryptoplus is portable across all operating systems and architectures : as long as OpenSSL compiles and runs on your system, libcryptoplus should compile and run too. It provides exception safe classes and functions to deal with symmetric ciphers, public key cryptography, certificates, authentication codes, hash functions and data encoding. # Which parts of the OpenSSL crypto library does it provide ? Here is what is currently implemented: - HMAC - Error handling - Exceptions - Hash methods - PBKDF2 - Random - Symmetric Ciphers - X509 - EVP - DER - BIO - BIGNUM - ASN1 - Public Key Cryptography - RSA - DSA - Diffie-Hellman - EVP PKEY Note: Support for SSL/TLS/DTLS is **NOT** planned as they do not belong to the OpenSSL crypto library. # Why would I use it when I can directly use OpenSSL ? Before answering this question, I have to say that I have a mixed relationship with OpenSSL: I love it and hate it at the same time. I love it, because if offers everything one might need. It was created by very smart people with a strong care for security concerns. It is widely used, efficient and still maintained. Despite that, I sometimes hate it because even if it does the job, the documentation is almost inexistant or erroneous, the API is inconsistent in both naming and argument typing. What you could do in a couple of minutes takes a week to do, just because of the lack of reliable information. So, why would you use libcryptoplus ? After all, it is just a wrapper: it doesn't bring any new functionnality in itself. So if you already have an existing and working code base, you probably don't need to use libcryptoplus. However, it greatly increases code maintainability by providing a object-oriented **RAII** approach of dealing with OpenSSL concepts. Using libcryptoplus, you will: - No longer have to care about your objects lifetime: libcryptoplus heavily relies on **RAII** (Resource Acquisition Is Initialization) and smart pointer mechanisms. - Benefit from an exception-oriented environment so you can focus on writing efficient code, not on checking return codes for every single call. - Use a consistent and **const-correct** API. All the ugly `const_cast<>` are done for you underneath, and you don't need to care anymore about that. - Use modern C++ approaches to deal with your objects: you can now *iterate* trough the extensions of a X509 certificate or the entries of a X509 name using well-known C++ iterators. - Have no performance issues: 99% of libcryptoplus source code is *inline* functions: as a result, any modern compiler with optimizations enabled will likely generate the **exact same machine code** that you would have had using the genuine interface. - Use a really lightweight library: libcryptoplus does not require any additional library (except boost, but this dependency will go away as soon as the next C++ version goes out, which at the time of this writing should be not that far). - Not have to drop your code base: libcryptoplus provides a way to get the RAW pointers of every single OpenSSL object so that if something is missing, you can still use a low-level function to get the job done. So sure, you can always use OpenSSL directly, that is what I did the past few years as well. But how many time did I wish there was a more C++ alternative ? Now, there is. And it is free ! :) # You claim that almost everything is supported, but [some functionality] is missing ! I tried to implement everything I could but surely, some parts remain unimplemented. The reason can be either a lack of information (have you ever tried to find the documenation of OpenSSL X509 extensions ? Good luck !), or just something I missed. In any case, feel free to submit your requests: my intent is that this library becomes more and more complete. You may also submit patches, features, bug fixes (please use: push requests) and I would be glad to add your name to the contributors list if you want to. The only requirement regarding new features is that they remain of general utility. So, a feature like "Patch to ease certificate generation by automatically setting the subject name domain to mycompany.com" will obviously be rejected, and its author will have to buy me a cake. (Blame me, but I love cake). # What about all the ugly `const_cast<>` ? This is probably what I hate the most when I need to interface my const-correct code with OpenSSL: you must either copy the data to a writable buffer or `const_cast<>` it (with all the risks that comes along) before issuing the call. Doing a `const_cast<>` is not that bad as long as you have the guarantee that the calling function will not attempt to modify the input buffer. Everytime I had to put a `const_cast<>` somewhere, I double (even triple)-checked both OpenSSL documentation and source code to be sure that I could reasonably assume that the variable was not meant to be modified. However, if you find any evidence that some `const_cast<>` is not legitimate, please tell-me: I chose the "casting way" for performance's sake, but not at the cost of leading to *undefined behavior*. # Licensing All code is licensed under the GPLv3. See gpl-3.0.txt. If you are interested in using this project under a different license, please [contact me](mailto:julien.kauffmann__AT__freelan.org). I don't bite and I probably won't charge (at least, not much). # Does the project have a website ? Yes, it does. And [here](http://www.freelan.org) it is. You may also find the [git repository](https://github.com/freelan-developers/freelan-all) on github. freelan-2.0/libs/cryptoplus/SConscript000066400000000000000000000005431252300335000201510ustar00rootroot00000000000000Import('env dirs name') import os env = env.Clone() local_include_dir = Dir(os.path.join('include', name)) env.Prepend(CPPPATH=[local_include_dir]) includes = env.RInstall(dirs['root'], local_include_dir, ['*.hpp']) library = env.StaticLibrary(target=os.path.join(str(dirs['lib']), name), source=env.RGlob('src', '*.cpp')) Return('library includes') freelan-2.0/libs/cryptoplus/include/000077500000000000000000000000001252300335000175605ustar00rootroot00000000000000freelan-2.0/libs/cryptoplus/include/cryptoplus/000077500000000000000000000000001252300335000220045ustar00rootroot00000000000000freelan-2.0/libs/cryptoplus/include/cryptoplus/asn1/000077500000000000000000000000001252300335000226465ustar00rootroot00000000000000freelan-2.0/libs/cryptoplus/include/cryptoplus/asn1/integer.hpp000066400000000000000000000205241252300335000250170ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file integer.hpp * \author Julien KAUFFMANN * \brief An ASN1_INTEGER pointer class. */ #ifndef CRYPTOPLUS_ASN1_INTEGER_HPP #define CRYPTOPLUS_ASN1_INTEGER_HPP #include "../pointer_wrapper.hpp" #include "../error/helpers.hpp" #include "../bio/bio_ptr.hpp" #include "../bn/bignum.hpp" #include #include #include #include namespace cryptoplus { namespace asn1 { /** * \brief An OpenSSL ASN1_INTEGER pointer. * * The integer class is a wrapper for an OpenSSL ASN1_INTEGER* pointer. * * A integer instance has the same semantic as a ASN1_INTEGER* pointer, thus two copies of the same instance share the same underlying pointer. * * \warning Always check for the integer not to be NULL before calling any of its method. Calling any method (except raw()) on a null integer has undefined behavior. */ class integer : public pointer_wrapper { public: /** * \brief Create a new integer. * \return The integer. * * If allocation fails, an exception is thrown. */ static integer create(); /** * \brief Take ownership of a specified ASN1_INTEGER pointer. * \param ptr The pointer. Cannot be NULL. * \return An integer. */ static integer take_ownership(pointer ptr); /** * \brief Create an integer from a long. * \param l The long value. * \return The integer. */ static integer from_long(long l); /** * \brief Create an integer from a BIGNUM. * \param bn The BIGNUM. * \return The integer. */ static integer from_bignum(bn::bignum bn); /** * \brief Create a new empty integer. */ integer(); /** * \brief Create an integer by *NOT* taking ownership of an existing ASN1_INTEGER* pointer. * \param ptr The ASN1_INTEGER* pointer. * \warning The caller is still responsible for freeing the memory. */ integer(pointer ptr); /** * \brief Set the value. * \param l The long. */ void set_value(long l) const; /** * \brief Set the value from a BIGNUM. * \param bn The BIGNUM. */ void set_value(bn::bignum bn) const; /** * \brief Get a long from the ASN1_INTEGER. * \return A long if the integer is not too big, 0xFFFFFFFFL otherwise. */ long to_long() const; /** * \brief Get a BIGNUM from this integer. * \return A BIGNUM. */ bn::bignum to_bignum() const; /** * \brief Write the integer to a BIO. * \param bio The bio to write to. * \return The count of bytes written. */ size_t write(bio::bio_ptr bio) const; /** * \brief Read the integer from a BIO. * \param bio The bio to read from. * * This method uses an internal buffer of size 1024. If you need or want to use your own supplied buffer, see the other read() overloads. */ void read(bio::bio_ptr bio) const; /** * \brief Read the integer from a BIO. * \tparam size The size of the internal buffer to be allocated on the stack. * \param bio The bio to read from. * * This method uses an internal buffer. If you need or want to use your own supplied buffer, see the other read() overloads. */ template void read(bio::bio_ptr bio) const; /** * \brief Read the integer from a BIO. * \param bio The bio to read from. * \param buf A buffer to use for the read operation. * \param buf_len The size of buf. */ void read(bio::bio_ptr bio, const void* buf, size_t buf_len) const; private: explicit integer(pointer _ptr, deleter_type _del); }; /** * \brief Compare two ASN1 integer pointers. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two integer instance share the same underlying pointer. */ bool operator==(const integer& lhs, const integer& rhs); /** * \brief Compare two ASN1 integer pointers. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two integer instance do not share the same underlying pointer. */ bool operator!=(const integer& lhs, const integer& rhs); /** * \brief Compare two ASN1 integer pointers. * \param lhs The left argument. * \param rhs The right argument. * \return 0 if the two ASN1 integer are identical. */ int compare(const integer& lhs, const integer& rhs); inline integer integer::create() { return take_ownership(ASN1_INTEGER_new()); } inline integer integer::from_long(long l) { integer result = create(); result.set_value(l); return result; } inline integer integer::from_bignum(bn::bignum bn) { return take_ownership(BN_to_ASN1_INTEGER(bn.raw(), NULL)); } inline integer::integer() { } inline integer::integer(pointer _ptr) : pointer_wrapper(_ptr, null_deleter) { } inline void integer::set_value(long l) const { throw_error_if_not(ASN1_INTEGER_set(ptr().get(), l) != 0); } inline void integer::set_value(bn::bignum bn) const { throw_error_if_not(BN_to_ASN1_INTEGER(bn.raw(), ptr().get()) != 0); } inline long integer::to_long() const { return ASN1_INTEGER_get(ptr().get()); } inline bn::bignum integer::to_bignum() const { return bn::bignum::from_integer(*this); } inline size_t integer::write(bio::bio_ptr bio) const { int result = i2a_ASN1_INTEGER(bio.raw(), ptr().get()); throw_error_if_not(result >= 0); return result; } inline void integer::read(bio::bio_ptr bio) const { read<1024>(bio); } template inline void integer::read(bio::bio_ptr bio) const { char buf[size]; read(bio, buf, size); } inline void integer::read(bio::bio_ptr bio, const void* buf, size_t buf_len) const { throw_error_if_not(a2i_ASN1_INTEGER(bio.raw(), ptr().get(), static_cast(const_cast(buf)), static_cast(buf_len)) != 0); } inline integer::integer(pointer _ptr, deleter_type _del) : pointer_wrapper(_ptr, _del) { } inline bool operator==(const integer& lhs, const integer& rhs) { return lhs.raw() == rhs.raw(); } inline bool operator!=(const integer& lhs, const integer& rhs) { return lhs.raw() != rhs.raw(); } inline int compare(const integer& lhs, const integer& rhs) { #if OPENSSL_VERSION_NUMBER >= 0x01000000 return ASN1_INTEGER_cmp(lhs.raw(), rhs.raw()); #else return ASN1_INTEGER_cmp(const_cast(lhs.raw()), const_cast(rhs.raw())); #endif } } } #endif /* CRYPTOPLUS_ASN1_INTEGER_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/asn1/object.hpp000066400000000000000000000123671252300335000246360ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file object.hpp * \author Julien KAUFFMANN * \brief An ASN1_OBJECT pointer class. */ #ifndef CRYPTOPLUS_ASN1_OBJECT_HPP #define CRYPTOPLUS_ASN1_OBJECT_HPP #include "../pointer_wrapper.hpp" #include "../error/helpers.hpp" #include #include #include namespace cryptoplus { namespace asn1 { /** * \brief An OpenSSL ASN1_OBJECT pointer. * * The object class is a wrapper for an OpenSSL ASN1_OBJECT* pointer. * * A object instance has the same semantic as a ASN1_OBJECT* pointer, thus two copies of the same instance share the same underlying pointer. * * \warning Always check for the object not to be NULL before calling any of its method. Calling any method (except raw()) on a null object has undefined behavior. */ class object : public pointer_wrapper { public: /** * \brief Create a new object. * \return The object. * * If allocation fails, an exception is thrown. */ static object create(); /** * \brief Take ownership of a specified ASN1_OBJECT pointer. * \param ptr The pointer. Cannot be NULL. * \return An object. */ static object take_ownership(pointer ptr); /** * \brief Create an ASN1 object pointer from a nid. * \param nid The nid. * \return The ASN1 object pointer. */ static object from_nid(int nid); /** * \brief Create a new empty object. */ object(); /** * \brief Create an object by *NOT* taking ownership of an existing ASN1_OBJECT* pointer. * \param ptr The ASN1_OBJECT* pointer. * \warning The caller is still responsible for freeing the memory. */ object(pointer ptr); /** * \brief Get the nid associated to the specified object. * \return The nid. */ int to_nid() const; private: explicit object(pointer _ptr, deleter_type _del); }; /** * \brief Compare two ASN1 object pointers. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two object instance share the same underlying pointer. */ bool operator==(const object& lhs, const object& rhs); /** * \brief Compare two ASN1 object pointers. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two object instance do not share the same underlying pointer. */ bool operator!=(const object& lhs, const object& rhs); /** * \brief Compare two ASN1 object pointers. * \param lhs The left argument. * \param rhs The right argument. * \return 0 if the two ASN1 objects are identical. */ int compare(const object& lhs, const object& rhs); inline object object::create() { return take_ownership(ASN1_OBJECT_new()); } inline object object::from_nid(int nid) { return OBJ_nid2obj(nid); } inline object::object() { } inline object::object(pointer _ptr) : pointer_wrapper(_ptr, null_deleter) { } inline int object::to_nid() const { return OBJ_obj2nid(ptr().get()); } inline object::object(pointer _ptr, deleter_type _del) : pointer_wrapper(_ptr, _del) { } inline bool operator==(const object& lhs, const object& rhs) { return lhs.raw() == rhs.raw(); } inline bool operator!=(const object& lhs, const object& rhs) { return lhs.raw() != rhs.raw(); } inline int compare(const object& lhs, const object& rhs) { return OBJ_cmp(lhs.raw(), rhs.raw()); } } } #endif /* CRYPTOPLUS_ASN1_OBJECT_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/asn1/string.hpp000066400000000000000000000210021252300335000246600ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file string.hpp * \author Julien KAUFFMANN * \brief An ASN1_STRING pointer class. */ #ifndef CRYPTOPLUS_ASN1_STRING_HPP #define CRYPTOPLUS_ASN1_STRING_HPP #include "../pointer_wrapper.hpp" #include "../buffer.hpp" #include "../error/helpers.hpp" #include #include #include #include namespace cryptoplus { namespace asn1 { /** * \brief An OpenSSL ASN1_STRING pointer. * * The string class is a wrapper for an OpenSSL ASN1_STRING* pointer. * * A string instance has the same semantic as a ASN1_STRING* pointer, thus two copies of the same instance share the same underlying pointer. * * \warning Always check for the string not to be NULL before calling any of its method. Calling any method (except raw()) on a null string has undefined behavior. */ class string : public pointer_wrapper { public: /** * \brief Create a new string. * \return The string. * * If allocation fails, an exception is thrown. */ static string create(); /** * \brief Take ownership of a specified ASN1_STRING pointer. * \param ptr The pointer. Cannot be NULL. * \return An string. */ static string take_ownership(pointer ptr); /** * \brief Create an ASN1 string from some data. * \param buf The data buffer. * \param buf_len The length of buf. * \return The ASN1 string. */ static string from_data(const void* buf, size_t buf_len); /** * \brief Create an ASN1 string from some data. * \param buf The data buffer. * \return The ASN1 string. */ static string from_data(const buffer& buf); /** * \brief Create an ASN1 string from a C-string. * \param str The string. * \return The ASN1 string. */ static string from_string(const char* str); /** * \brief Create an ASN1 string from a std::string. * \param str The string. * \return The ASN1 string. */ static string from_string(const std::string& str); /** * \brief Create a new empty string. */ string(); /** * \brief Create an string by *NOT* taking ownership of an existing ASN1_STRING* pointer. * \param ptr The ASN1_STRING* pointer. * \warning The caller is still responsible for freeing the memory. */ string(pointer ptr); /** * \brief Get the size of the string. * \return The size of the string. */ size_t size() const; /** * \brief Get the string data. * \return The string data. */ const unsigned char* data() const; /** * \brief Set the internal data. * \param data The data. * \param data_len The length of data. */ void set_data(const void* data, size_t data_len) const; /** * \brief Set the internal data. * \param data The data. */ void set_data(const buffer& data) const; /** * \brief Set the internal data. * \param data The data, as a null terminated ASCII C-string. */ void set_data(const char* data) const; /** * \brief Set the internal data. * \param data The data, as an ASCII string. */ void set_data(const std::string& data) const; /** * \brief Get the type of the string. * \return The type. */ int type() const; /** * \brief Build a string from data() and size(). * \return A string built from data() and that will be size() bytes long. */ std::string str() const; /** * \brief Get the content as an UTF-8 string. * \return The UTF-8 content. */ std::string to_utf8() const; private: explicit string(pointer _ptr, deleter_type _del); }; /** * \brief Compare two ASN1 string pointers. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two string instance share the same underlying pointer. */ bool operator==(const string& lhs, const string& rhs); /** * \brief Compare two ASN1 string pointers. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two string instance do not share the same underlying pointer. */ bool operator!=(const string& lhs, const string& rhs); /** * \brief Compare two ASN1 string pointers. * \param lhs The left argument. * \param rhs The right argument. * \return 0 if the two ASN1 strings are identical. */ int compare(const string& lhs, const string& rhs); inline string string::create() { return take_ownership(ASN1_STRING_new()); } inline string string::from_data(const void* buf, size_t buf_len) { string result = create(); result.set_data(buf, buf_len); return result; } inline string string::from_data(const buffer& buf) { string result = create(); result.set_data(buf); return result; } inline string string::from_string(const char* str) { string result = create(); result.set_data(str); return result; } inline string string::from_string(const std::string& str) { string result = create(); result.set_data(str); return result; } inline string::string() { } inline string::string(pointer _ptr) : pointer_wrapper(_ptr, null_deleter) { } inline size_t string::size() const { return ASN1_STRING_length(ptr().get()); } inline const unsigned char* string::data() const { return ASN1_STRING_data(ptr().get()); } inline void string::set_data(const void* _data, size_t data_len) const { throw_error_if_not(ASN1_STRING_set(ptr().get(), _data, static_cast(data_len)) != 0); } inline void string::set_data(const buffer& _data) const { set_data(buffer_cast(_data), buffer_size(_data)); } inline void string::set_data(const char* _data) const { throw_error_if_not(ASN1_STRING_set(ptr().get(), _data, -1) != 0); } inline void string::set_data(const std::string& _data) const { set_data(_data.c_str()); } inline int string::type() const { return ASN1_STRING_type(ptr().get()); } inline std::string string::str() const { return std::string(reinterpret_cast(data()), size()); } inline string::string(pointer _ptr, deleter_type _del) : pointer_wrapper(_ptr, _del) { } inline bool operator==(const string& lhs, const string& rhs) { return lhs.raw() == rhs.raw(); } inline bool operator!=(const string& lhs, const string& rhs) { return lhs.raw() != rhs.raw(); } inline int compare(const string& lhs, const string& rhs) { #if OPENSSL_VERSION_NUMBER >= 0x01000000 return ASN1_STRING_cmp(lhs.raw(), rhs.raw()); #else return ASN1_STRING_cmp(const_cast(lhs.raw()), const_cast(rhs.raw())); #endif } } } #endif /* CRYPTOPLUS_ASN1_STRING_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/asn1/utctime.hpp000066400000000000000000000173511252300335000250400ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file utctime.hpp * \author Julien KAUFFMANN * \brief An ASN1_UTCTIME pointer class. */ #ifndef CRYPTOPLUS_ASN1_UTCTIME_HPP #define CRYPTOPLUS_ASN1_UTCTIME_HPP #include "../pointer_wrapper.hpp" #include "../error/helpers.hpp" #include "../bio/bio_ptr.hpp" #include #include #include #include namespace cryptoplus { namespace asn1 { /** * \brief An OpenSSL ASN1_UTCTIME pointer. * * The utctime class is a wrapper for an OpenSSL ASN1_UTCTIME* pointer. * * A utctime instance has the same semantic as a ASN1_UTCTIME* pointer, thus two copies of the same instance share the same underlying pointer. * * \warning Always check for the utctime not to be NULL before calling any of its method. Calling any method (except raw()) on a null utctime has undefined behavior. */ class utctime : public pointer_wrapper { public: /** * \brief Create a new utctime. * \return The utctime. * * If allocation fails, an exception is thrown. */ static utctime create(); /** * \brief Take ownership of a specified ASN1_UTCTIME pointer. * \param ptr The pointer. Cannot be NULL. * \return An utctime. */ static utctime take_ownership(pointer ptr); /** * \brief Create an utctime from a time_t. * \param time The time_t value. * \return The utctime. */ static utctime from_time_t(time_t time); /** * \brief Create an utctime from a string. * \param str The time string. It must respect one of these formats: YYMMDDhhmmssZ, YYMMDDhhmmss+hh'mm', YYMMDDhhmmss-hh'mm'. * * Z indicates that local time is GMT. * + indicates that local time is later than GMT. * - indicates that local time is earlier than GMT. * hh' is the absolute value of the offset from GMT in hours. * mm' is the absolute value of the offset from GMT in minutes. * * \return The utctime. */ static utctime from_string(const std::string& str); /** * \brief Create an utctime by taking its value from a boost::posix_time::ptime. * \param time The time. * \return The utctime. */ static utctime from_ptime(const boost::posix_time::ptime& time); /** * \brief Create a new empty utctime. */ utctime(); /** * \brief Create an utctime by *NOT* taking ownership of an existing ASN1_UTCTIME* pointer. * \param ptr The ASN1_UTCTIME* pointer. * \warning The caller is still responsible for freeing the memory. */ utctime(pointer ptr); /** * \brief Set the time. * \param time The time to set. */ void set_time(time_t time) const; /** * \brief Set the time from a string. * \param str The time string. It must respect one of these formats: YYMMDDhhmmssZ, YYMMDDhhmmss+hh'mm', YYMMDDhhmmss-hh'mm'. * * Z indicates that local time is GMT. * + indicates that local time is later than GMT. * - indicates that local time is earlier than GMT. * hh' is the absolute value of the offset from GMT in hours. * mm' is the absolute value of the offset from GMT in minutes. */ void set_time(const std::string& str) const; /** * \brief Set the time from a ptime structure. * \param time The time. */ void set_time(const boost::posix_time::ptime& time) const; /** * \brief Get a ptime from the ASN1_UTCTIME. * \return A ptime if check() returns true, boost::posix_time::not_a_date_time otherwise. */ boost::posix_time::ptime to_ptime() const; /** * \brief Check if the structure is valid. * \return true if the structure is valid, false otherwise. */ bool check() const; /** * \brief Print a ASN1_UTCTIME to a BIO. * \param bio The BIO. */ void print(bio::bio_ptr bio) const; private: explicit utctime(pointer _ptr, deleter_type _del); }; /** * \brief Compare two ASN1 utctime pointers. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two utctime instance share the same underlying pointer. */ bool operator==(const utctime& lhs, const utctime& rhs); /** * \brief Compare two ASN1 utctime pointers. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two utctime instance do not share the same underlying pointer. */ bool operator!=(const utctime& lhs, const utctime& rhs); inline utctime utctime::create() { return take_ownership(ASN1_UTCTIME_new()); } inline utctime utctime::from_time_t(time_t time) { utctime result = create(); result.set_time(time); return result; } inline utctime utctime::from_string(const std::string& str) { utctime result = create(); result.set_time(str); return result; } inline utctime utctime::from_ptime(const boost::posix_time::ptime& time) { utctime result = create(); result.set_time(time); return result; } inline utctime::utctime() { } inline utctime::utctime(pointer _ptr) : pointer_wrapper(_ptr, null_deleter) { } inline void utctime::set_time(time_t time) const { throw_error_if_not(ASN1_UTCTIME_set(ptr().get(), time)); } inline void utctime::set_time(const std::string& str) const { throw_error_if_not(ASN1_UTCTIME_set_string(ptr().get(), str.c_str()) != 0); } inline bool utctime::check() const { return (ASN1_UTCTIME_check(ptr().get()) != 0); } inline void utctime::print(bio::bio_ptr bio) const { throw_error_if_not(ASN1_UTCTIME_print(bio.raw(), ptr().get()) != 0); } inline utctime::utctime(pointer _ptr, deleter_type _del) : pointer_wrapper(_ptr, _del) { } inline bool operator==(const utctime& lhs, const utctime& rhs) { return lhs.raw() == rhs.raw(); } inline bool operator!=(const utctime& lhs, const utctime& rhs) { return lhs.raw() != rhs.raw(); } } } #endif /* CRYPTOPLUS_ASN1_UTCTIME_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/base64.hpp000066400000000000000000000111041252300335000235760ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file base64.hpp * \author Julien KAUFFMANN * \brief Base 64 related functions. */ #ifndef CRYPTOPLUS_BASE64_HPP #define CRYPTOPLUS_BASE64_HPP #include "buffer.hpp" #include namespace cryptoplus { /** * \brief base64 encode a given buffer. * \param output The output buffer. * \param outputlen The output buffer length. Specify at least (((inputlen + 2) / 3) * 4) + 3 to get a complete result. * \param input The string to base64 encode. * \param inputlen The length of input. * \return The count of bytes of output that were used. * * If output is too small to hold the result, the data is truncated. */ size_t base64_encode(void* output, size_t outputlen, const void* input, size_t inputlen); /** * \brief base64 encode a given buffer. * \param input The string to base64 encode. * \param inputlen The length of input. * \return The base64 encoded string. */ std::string base64_encode(const void* input, size_t inputlen); /** * \brief base64 encode a given string. * \param buf The buffer to encode. * \return The base64 encoded string. */ std::string base64_encode(const buffer& buf); /** * \brief base64 decode a given string. * \param output The output buffer. * \param outputlen The output buffer length. Specify at least (inputlen * 3) / 4 to get a complete result. * \param input The base64 encoded string to decode. * \param inputlen The length of input. * \return The count of bytes of output that were used. * * If output is too small to hold the result, the data is truncated. */ size_t base64_decode(void* output, size_t outputlen, const void* input, size_t inputlen); /** * \brief base64 decode a given buffer. * \param input The string to base64 decode. * \param inputlen The length of input. * \return The base64 decoded string. */ buffer base64_decode(const void* input, size_t inputlen); /** * \brief base64 decode a given string. * \param str The base64 encoded string to decode. * \return The decoded string. */ buffer base64_decode(const std::string& str); inline std::string base64_encode(const void* input, size_t inputlen) { std::string result(((inputlen + 2) / 3) * 4, '\0'); if (!result.empty()) { result.resize(base64_encode(&result[0], result.size(), input, inputlen)); } return result; } inline std::string base64_encode(const buffer& buf) { return base64_encode(buffer_cast(buf), buffer_size(buf)); } inline buffer base64_decode(const void* input, size_t inputlen) { buffer result((inputlen * 3) / 4); result.data().resize(base64_decode(buffer_cast(result), buffer_size(result), input, inputlen)); return result; } inline buffer base64_decode(const std::string& str) { return base64_decode(str.c_str(), str.size()); } } #endif /* CRYPTOPLUS_BASE64_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/bio/000077500000000000000000000000001252300335000225555ustar00rootroot00000000000000freelan-2.0/libs/cryptoplus/include/cryptoplus/bio/bio_chain.hpp000066400000000000000000000070061252300335000252040ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file bio_chain.hpp * \author Julien KAUFFMANN * \brief A bio chain class. */ #ifndef CRYPTOPLUS_BIO_BIO_CHAIN_HPP #define CRYPTOPLUS_BIO_BIO_CHAIN_HPP #include "bio_ptr.hpp" #include "../error/helpers.hpp" #include #include namespace cryptoplus { namespace bio { /** * \brief A BIO chain wrapper class. * * bio_chain is a wrapper around OpenSSL BIOs which has ownership over its underlying pointer. * * It acts as a container for BIO pointers and relies on bio_ptr. The underlying BIO pointer is deleted with BIO_free_all(). * * A bio_chain holds a shared pointer to its underlying BIO, thus any copy of the bio_chain instance shares the same pointer. */ class bio_chain { public: /** * \brief Create a new bio_chain from a BIO_METHOD. * \param type The type. */ explicit bio_chain(BIO_METHOD* type); /** * \brief Create a new bio_chain by taking ownership of an existing BIO pointer. * \param bio The BIO pointer. Cannot be NULL. */ explicit bio_chain(BIO* bio); /** * \brief Get the first BIO in the chain. * \return The first BIO in the chain. * \warning If the bio_chain instance is destroyed, the returned bio_ptr is invalidated. */ bio_ptr first() const; private: boost::shared_ptr m_bio; }; inline bio_chain::bio_chain(BIO_METHOD* _type) : m_bio(BIO_new(_type), BIO_free_all) { throw_error_if_not(m_bio != NULL); } inline bio_chain::bio_chain(BIO* bio) : m_bio(bio, BIO_free_all) { if (!m_bio) { throw std::invalid_argument("bio"); } } inline bio_ptr bio_chain::first() const { return bio_ptr(m_bio.get()); } } } #endif /* CRYPTOPLUS_BIO_BIO_CHAIN_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/bio/bio_ptr.hpp000066400000000000000000000531251252300335000247320ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file bio_ptr.hpp * \author Julien KAUFFMANN * \brief A bio pointer class. */ #ifndef CRYPTOPLUS_BIO_BIO_PTR_HPP #define CRYPTOPLUS_BIO_BIO_PTR_HPP #include "../nullable.hpp" #include "../os.hpp" #include "../cipher/cipher_algorithm.hpp" #include "../cipher/cipher_context.hpp" #include "../hash/message_digest_algorithm.hpp" #include #include #include namespace cryptoplus { namespace bio { /** * \brief An OpenSSL BIO pointer. * * The bio_ptr class is a wrapper for an OpenSSL BIO* pointer. * * A bio_ptr instance has the same semantic as a BIO* pointer, thus two copies of the same instance share the same underlying pointer. * * A bio_ptr *DOES NOT* own its underlying pointer. It is the caller's responsibility to ensure that a bio_ptr always points to a valid BIO structure. * * If you require a wrapper for OpenSSL BIO with ownership semantic, see bio_chain. * * \warning Always check for the bio_ptr not to be NULL before calling any of its method. Calling any method (except raw() or reset_ptr()) on a null bio_ptr has undefined behavior. */ class bio_ptr : public nullable { public: /** * \brief Create a new bio_ptr. * \param bio The bio to point to. */ bio_ptr(BIO* bio = NULL); /** * \brief Reset the underlying pointer. * \param bio The bio to point to. */ void reset_ptr(BIO* bio = NULL); /** * \brief Get the raw BIO pointer. * \return The raw BIO pointer. */ BIO* raw() const; /** * \brief Set the method of the BIO. * \param type The type. * \return true on success. */ bool set_method(BIO_METHOD* type) const; /** * \brief Push a bio_ptr at the bottom of the BIO chain. * \param bio The bio to append to the BIO chain. * \returns The current bio_ptr. */ bio_ptr push(bio_ptr bio) const; /** * \brief Remove the bio_ptr from its BIO chain. * \return The next bio_ptr in the chain, or a null one if there is no next bio_ptr. * * Once it is removed from its chain, the bio_ptr can be either deleted or added to another chain. */ bio_ptr pop() const; /** * \brief Find a BIO in the BIO chain by its type. * \param type The type of the bio_ptr. * \return The first bio_ptr to match or an empty one if none is found that match the specified type. */ bio_ptr find_by_type(int type) const; /** * \brief Get the next bio_ptr in the chain. * \return The next bio_ptr in the chain. */ bio_ptr next() const; /** * \brief Get the type of the bio. * \return The type. * * The list of possible types is available on the man page for BIO_find_type(3). */ int type() const; /** * \brief Determine if the last operation on the BIO should be retried. * \return true if the last operation should be retried. */ bool should_retry() const; /** * \brief Determine if the BIO should be read. * \return true if the BIO should be read. */ bool should_read() const; /** * \brief Determine if the BIO should be written. * \return true if the BIO should be written. */ bool should_write() const; /** * \brief Determine if the cause of the last failure was due to a special IO event. * \return true if the cause of the last failure was due to a special IO event. */ bool should_io_special() const; /** * \brief Get the retry type. * \return The retry type, as specified on the man page of BIO_should_retry(3). */ int retry_type() const; /** * \brief Determine the precise reason for the special condition and returns the BIO that caused it. * \param reason If not NULL, *reason will be set to the reason code. * \return The BIO that caused the special condition. * \see get_retry_reason */ bio_ptr get_retry_bio(int* reason = NULL) const; /** * \brief Get the reason for a special condition. * \return The reason code. * \see get_retry_bio */ int get_retry_reason() const; /** * \brief Read some data from the BIO. * \param buf The buffer to read the data to. * \param buf_len The length of buf. * \return The amount of data successfully read. If the return value is 0 or -1, no data could be read. If it is -2, then the operation is not available for the specific BIO type. */ ptrdiff_t read(void* buf, size_t buf_len) const; /** * \brief Read a line of data from the BIO. * \param buf The buffer to read the data to. * \param buf_len The length of buf. * \return The amount of data successfully read. If the return value is 0 or -1, no data could be read. If it is -2, then the operation is not available for the specific BIO type. */ ptrdiff_t gets(char* buf, size_t buf_len) const; /** * \brief Write some data to the BIO. * \param buf The buffer to write the data from. * \param buf_len The length of buf. * \return The amount of data successfully written. If the return value is 0 or -1, no data could be written. If it is -2, then the operation is not available for the specific BIO type. */ ptrdiff_t write(const void* buf, size_t buf_len) const; /** * \brief Write a line of data to the BIO. * \param buf The buffer to write the data from. * \return The amount of data successfully written. If the return value is 0 or -1, no data could be written. If it is -2, then the operation is not available for the specific BIO type. */ ptrdiff_t puts(const char* buf) const; /** * \brief Write a line of data to the BIO. * \param str The string. * \return The amount of data successfully written. If the return value is 0 or -1, no data could be written. If it is -2, then the operation is not available for the specific BIO type. */ ptrdiff_t puts(const std::string& str) const; /** * \brief Reset the BIO to its initial state. * \return 1 for success, 0 or -1 for failure. If the BIO is a file bio, then 0 means success and -1 means failure. * * Please don't blame me for the inconsistent return values: take a look at BIO_ctrl(3) for the reason. */ int reset() const; /** * \brief Set the file position pointer. * \param offset The offset value. * \return The current file position on success, and -1 for failure except file BIOs which for seek() returns 0 for success and -1 for failure. * * Please don't blame me for the inconsistent return values: take a look at BIO_ctrl(3) for the reason. */ ptrdiff_t seek(ptrdiff_t offset) const; /** * \brief Get the current file position. * \return The current file position on success, and -1 for failure except file BIOs which for seek() returns 0 for success and -1 for failure. */ ptrdiff_t tell() const; /** * \brief Write out any internally buffered data. * \return 1 for success and 0 or -1 for failure. */ int flush() const; /** * \brief Determine if the BIO has reached EOF. * \return true if the BIO has reached EOF. */ bool eof() const; /** * \brief Set the BIO close flag. * \param close The close flag. Can be either BIO_CLOSE or BIO_NOCLOSE. */ void set_close(long close) const; /** * \brief Get the BIO close flag. * \return The BIO close flag. */ long get_close() const; /** * \brief Return the number of pending read characters. * \return The number of pending read characters. */ size_t pending_read() const; /** * \brief Return the number of pending write characters. * \return The number of pending write characters. */ size_t pending_write() const; // BIO_f_buffer() specific methods /** * \brief Get the number of lines currently buffered. * \return The number of lines currently buffered. * * This method only makes sense for BIOs of type "BIO_f_buffer()". */ unsigned int get_buffer_num_lines() const; /** * \brief Set the read buffer size. * \param size The size to set. * \return true if the set succeeded. * * This method only makes sense for BIOs of type "BIO_f_buffer()". */ bool set_read_buffer_size(size_t size) const; /** * \brief Set the write buffer size. * \param size The size to set. * \return true if the set succeeded. * * This method only makes sense for BIOs of type "BIO_f_buffer()". */ bool set_write_buffer_size(size_t size) const; /** * \brief Set both read and write buffer sizes. * \param size The size to set. * \return true if the set succeeded. * * This method only makes sense for BIOs of type "BIO_f_buffer()". */ bool set_buffer_size(size_t size) const; /** * \brief Set the buffer read data. * \param buf The data. * \param buf_len The length of buf. * \return true if the set succeeded. * * This method only makes sense for BIOs of type "BIO_f_buffer()". */ bool set_buffer_read_data(const void* buf, size_t buf_len) const; // BIO_f_cipher() specific methods /** * \brief Set the cipher associated to the BIO. * \param algorithm The cipher algorithm to use. * \param key The key buffer. * \param iv The IV buffer. * \param direction The cipher direction. Only possible values are cipher::cipher_context::decrypt and cipher::cipher_context::encrypt. * * This method only makes sense for BIOs of type "BIO_f_cipher()". */ void set_cipher(cipher::cipher_algorithm algorithm, const void* key, const void* iv, cipher::cipher_context::cipher_direction direction) const; /** * \brief Determine whether the decryption operation was successful. * \return true for success. * * This method only makes sense for BIOs of type "BIO_f_cipher()". */ bool get_cipher_status() const; /** * \brief Get the associated cipher context. * \return The associated cipher context. * * This method only makes sense for BIOs of type "BIO_f_cipher()". */ EVP_CIPHER_CTX* get_cipher_context() const; // BIO_f_md() specific methods /** * \brief Set the message digest algorithm. * \param algorithm The message digest algorithm to use. * \return true on success. * * This method only makes sense for BIOs of type "BIO_f_md()". */ bool set_message_digest(hash::message_digest_algorithm algorithm) const; /** * \brief Get the message digest algorithm. * \return The used algorithm. * * This method only makes sense for BIOs of type "BIO_f_md()". */ hash::message_digest_algorithm get_message_digest() const; /** * \brief Get the message digest context. * \return The associated message digest context. * * This method only makes sense for BIOs of type "BIO_f_md()". */ EVP_MD_CTX* get_message_digest_context() const; // BIO_s_fd() specific methods /** * \brief Set the file descriptor. * \param fd The file descriptor. * \param close The close flags. * * This method only makes sense for BIOs of type "BIO_s_fd()". */ void set_file_descriptor(int fd, long close) const; /** * \brief Get the file descriptor. * \return The file descriptor or -1 if the BIO has not been initialized. * * This method only makes sense for BIOs of type "BIO_s_fd()". */ int get_file_descriptor() const; // BIO_s_file specific methods /** * \brief Set the file pointer. * \param fp The file pointer. * \param close The close flags. * * This method only makes sense for BIOs of type "BIO_s_file()". */ void set_file_pointer(FILE* fp, long close) const; /** * \brief Get the file pointer. * \return The file pointer. * * This method only makes sense for BIOs of type "BIO_s_file()". */ FILE* get_file_pointer() const; // BIO_s_mem specific methods /** * \brief Set the behavior of the memory BIO when it is empty. * \param v If zero, an empty memory BIO will return EOF. If v is non zero, it will return v when it is empty and will set the retry flag. v should be either zero or a negative value to avoid ambiguities with normal positive return values. * * This method only makes sense for BIOs of type "BIO_s_mem()". */ void set_mem_eof_return(int v) const; /** * \brief Get the BIO memory data pointer. * \param buf A pointer that must receive the memory data address. * \return The length of the data. * * This method only makes sense for BIOs of type "BIO_s_mem()". */ size_t get_mem_data(char*& buf) const; /** * \brief Set the internal memory buffer. * \param mb The memory buffer. * \param close The close flags. Should be either BIO_CLOSE or BIO_NOCLOSE. * * This method only makes sense for BIOs of type "BIO_s_mem()". */ void set_mem_buf(BUF_MEM* mb, long close) const; /** * \brief Get the internal memory buffer. * \return The memory buffer. * * This method only makes sense for BIOs of type "BIO_s_mem()". */ BUF_MEM* get_mem_buf() const; /** * \brief Set the flags on the associated BIO. * \param flags The flags to set. * * Example: bio.set_flags(BIO_FLAGS_BASE64_NO_NL) */ void set_flags(int flags) const; private: bool boolean_test() const; BIO* m_bio; friend bool operator==(const bio_ptr& lhs, const bio_ptr& rhs); }; /** * \brief Compare two bio instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two bio instance share the same underlying pointer. */ bool operator==(const bio_ptr& lhs, const bio_ptr& rhs); /** * \brief Compare two bio instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two bio instance do not share the same underlying pointer. */ bool operator!=(const bio_ptr& lhs, const bio_ptr& rhs); inline bio_ptr::bio_ptr(BIO* _bio) : m_bio(_bio) { } inline void bio_ptr::reset_ptr(BIO* _bio) { m_bio = _bio; } inline BIO* bio_ptr::raw() const { return m_bio; } inline bool bio_ptr::set_method(BIO_METHOD* _type) const { return BIO_set(m_bio, _type) != 0; } inline bio_ptr bio_ptr::push(bio_ptr bio) const { return bio_ptr(BIO_push(m_bio, bio.raw())); } inline bio_ptr bio_ptr::pop() const { return bio_ptr(BIO_pop(m_bio)); } inline bio_ptr bio_ptr::find_by_type(int _type) const { return bio_ptr(BIO_find_type(m_bio, _type)); } inline bio_ptr bio_ptr::next() const { return bio_ptr(BIO_next(m_bio)); } inline int bio_ptr::type() const { return BIO_method_type(m_bio); } inline bool bio_ptr::should_retry() const { return BIO_should_retry(m_bio) != 0; } inline bool bio_ptr::should_read() const { return BIO_should_read(m_bio) != 0; } inline bool bio_ptr::should_write() const { return BIO_should_write(m_bio) != 0; } inline bool bio_ptr::should_io_special() const { return BIO_should_io_special(m_bio) != 0; } inline int bio_ptr::retry_type() const { return BIO_retry_type(m_bio); } inline bio_ptr bio_ptr::get_retry_bio(int* reason) const { return bio_ptr(BIO_get_retry_BIO(m_bio, reason)); } inline int bio_ptr::get_retry_reason() const { return BIO_get_retry_reason(m_bio); } inline ptrdiff_t bio_ptr::read(void* buf, size_t buf_len) const { return BIO_read(m_bio, buf, static_cast(buf_len)); } inline ptrdiff_t bio_ptr::gets(char* buf, size_t buf_len) const { return BIO_gets(m_bio, buf, static_cast(buf_len)); } inline ptrdiff_t bio_ptr::write(const void* buf, size_t buf_len) const { return BIO_write(m_bio, buf, static_cast(buf_len)); } inline ptrdiff_t bio_ptr::puts(const char* buf) const { return BIO_puts(m_bio, buf); } inline ptrdiff_t bio_ptr::puts(const std::string& str) const { return puts(str.c_str()); } inline int bio_ptr::reset() const { return BIO_reset(m_bio); } inline ptrdiff_t bio_ptr::seek(ptrdiff_t offset) const { return BIO_seek(m_bio, static_cast(offset)); } inline ptrdiff_t bio_ptr::tell() const { return BIO_tell(m_bio); } inline int bio_ptr::flush() const { return BIO_flush(m_bio); } inline bool bio_ptr::eof() const { return BIO_eof(m_bio) != 0; } inline void bio_ptr::set_close(long _close) const { (void)BIO_set_close(m_bio, _close); } inline long bio_ptr::get_close() const { return BIO_get_close(m_bio); } inline size_t bio_ptr::pending_read() const { return BIO_ctrl_pending(m_bio); } inline size_t bio_ptr::pending_write() const { return BIO_ctrl_wpending(m_bio); } inline unsigned int bio_ptr::get_buffer_num_lines() const { return BIO_get_buffer_num_lines(m_bio); } inline bool bio_ptr::set_read_buffer_size(size_t size) const { return BIO_set_read_buffer_size(m_bio, static_cast(size)) > 0; } inline bool bio_ptr::set_write_buffer_size(size_t size) const { return BIO_set_write_buffer_size(m_bio, static_cast(size)) > 0; } inline bool bio_ptr::set_buffer_size(size_t size) const { return BIO_set_buffer_size(m_bio, static_cast(size)) > 0; } inline bool bio_ptr::set_buffer_read_data(const void* buf, size_t buf_len) const { return BIO_set_buffer_read_data(m_bio, const_cast(buf), static_cast(buf_len)) > 0; } inline void bio_ptr::set_cipher(cipher::cipher_algorithm algorithm, const void* key, const void* iv, cipher::cipher_context::cipher_direction direction) const { BIO_set_cipher(m_bio, algorithm.raw(), static_cast(key), static_cast(iv), static_cast(direction)); } inline bool bio_ptr::get_cipher_status() const { return BIO_get_cipher_status(m_bio) != 0; } inline EVP_CIPHER_CTX* bio_ptr::get_cipher_context() const { EVP_CIPHER_CTX* ctx = NULL; BIO_get_cipher_ctx(m_bio, &ctx); return ctx; } inline bool bio_ptr::set_message_digest(hash::message_digest_algorithm algorithm) const { return BIO_set_md(m_bio, algorithm.raw()) != 0; } inline hash::message_digest_algorithm bio_ptr::get_message_digest() const { const EVP_MD* md; BIO_get_md(m_bio, &md); return hash::message_digest_algorithm(md); } inline EVP_MD_CTX* bio_ptr::get_message_digest_context() const { EVP_MD_CTX* ctx; BIO_get_md_ctx(m_bio, &ctx); return ctx; } inline void bio_ptr::set_file_descriptor(int fd, long close) const { BIO_set_fd(m_bio, fd, close); } inline int bio_ptr::get_file_descriptor() const { return BIO_get_fd(m_bio, NULL); } inline void bio_ptr::set_file_pointer(FILE* fp, long close) const { BIO_set_fp(m_bio, fp, close); } inline FILE* bio_ptr::get_file_pointer() const { FILE* fp = NULL; BIO_get_fp(m_bio, &fp); return fp; } inline void bio_ptr::set_mem_eof_return(int v) const { BIO_set_mem_eof_return(m_bio, v); } inline size_t bio_ptr::get_mem_data(char*& buf) const { return BIO_get_mem_data(m_bio, &buf); } inline void bio_ptr::set_mem_buf(BUF_MEM* mb, long close) const { BIO_set_mem_buf(m_bio, mb, close); } inline BUF_MEM* bio_ptr::get_mem_buf() const { BUF_MEM* mb = NULL; BIO_get_mem_ptr(m_bio, &mb); return mb; } inline void bio_ptr::set_flags(int flags) const { BIO_set_flags(m_bio, flags); } inline bool bio_ptr::boolean_test() const { return (m_bio != NULL); } inline bool operator==(const bio_ptr& lhs, const bio_ptr& rhs) { return lhs.m_bio == rhs.m_bio; } inline bool operator!=(const bio_ptr& lhs, const bio_ptr& rhs) { return !(lhs == rhs); } } } #endif /* CRYPTOPLUS_BIO_BIO_PTR_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/bn/000077500000000000000000000000001252300335000224035ustar00rootroot00000000000000freelan-2.0/libs/cryptoplus/include/cryptoplus/bn/bignum.hpp000066400000000000000000000243161252300335000244030ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file bignum.hpp * \author Julien KAUFFMANN * \brief A BIGNUM pointer class. */ #ifndef CRYPTOPLUS_BN_bignum_HPP #define CRYPTOPLUS_BN_bignum_HPP #include "../pointer_wrapper.hpp" #include "../buffer.hpp" #include "../error/helpers.hpp" #include #include namespace cryptoplus { namespace asn1 { class integer; } namespace bn { /** * \brief An OpenSSL BIGNUM pointer. * * The bignum class is a wrapper for an OpenSSL BIGNUM* pointer. * * A bignum instance has the same semantic as a BIGNUM* pointer, thus two copies of the same instance share the same underlying pointer. * * \warning Always check for the bignum not to be NULL before calling any of its method. Calling any method (except raw()) on a null bignum has undefined behavior. */ class bignum : public pointer_wrapper { public: /** * \brief Create a new bignum. * \return The bignum. * * If allocation fails, an exception is thrown. */ static bignum create(); /** * \brief Take ownership of a specified BIGNUM pointer. * \param ptr The pointer. Cannot be NULL. * \return An bignum. */ static bignum take_ownership(pointer ptr); /** * \brief Create a BIGNUM from its binary representation. * \param buf The buffer that holds the binary representation of the BIGNUM. * \param buf_len The length of buf. * \return A bignum. * * On error an exception is thrown. */ static bignum from_bin(const void* buf, size_t buf_len); /** * \brief Load a BIGNUM from its hexadecimal representation. * \param str The hexadecimal string representation. * \return A bignum. */ static bignum from_hex(const std::string& str); /** * \brief Load a BIGNUM from its decimal representation. * \param str The decimal string representation. * \return A bignum. */ static bignum from_dec(const std::string& str); /** * \brief Load BIGNUM from an ASN1_INTEGER. * \param i The integer. * \return A bignum. */ static bignum from_integer(asn1::integer i); /** * \brief Load BIGNUM from an unsigned long. * \param ul The unsigned long. * \return A bignum. */ static bignum from_long(unsigned long ul); /** * \brief Create a new empty bignum. */ bignum(); /** * \brief Create an bignum by *NOT* taking ownership of an existing BIGNUM pointer. * \param ptr The BIGNUM pointer. * \warning The caller is still responsible for freeing the memory. */ bignum(pointer ptr); /** * \brief Append another bignum to the current instance. * \param bn The bignum. * \return *this. */ const bignum& operator+=(const bignum& bn) const; /** * \brief Append another bignum to the current instance. * \param bn The bignum. * \return *this. */ bignum& operator+=(const bignum& bn); /** * \brief Substract another bignum from the current instance. * \param bn The bignum. * \return *this. */ const bignum& operator-=(const bignum& bn) const; /** * \brief Substract another bignum from the current instance. * \param bn The bignum. * \return *this. */ bignum& operator-=(const bignum& bn); /** * \brief Copy another BIGNUM. * \param bn The bignum. */ void copy(const bignum& bn); /** * \brief Get the number of bytes needed to represent the BIGNUM. * \return The number of bytes needed to represent the BIGNUM. */ size_t size() const; /** * \brief Get the binary representation of the BIGNUM. * \param out The out buffer. Must be at least size() bytes long. * \param out_len The length of out. * \return The number of bytes written to out. */ size_t to_bin(void* out, size_t out_len) const; /** * \brief Get the binary representation of the BIGNUM. * \return The binary representation. */ buffer to_bin() const; /** * \brief Get the hexadecimal representation of the BIGNUM. * \return The hexadecimal representation of the BIGNUM. */ std::string to_hex() const; /** * \brief Get the decimal representation of the BIGNUM. * \return The decimal representation of the BIGNUM. */ std::string to_dec() const; /** * \brief Get a ASN1_INTEGER from this BIGNUM. * \return An ASN1_INTEGER. */ asn1::integer to_integer() const; /** * \brief Get the value as a long. * \return A long or 0xFFFFFFFFL if the value cannot be represented as an unsigned long. */ unsigned long to_long() const; /** * \brief Clone the BIGNUM. * \return A new bignum. */ bignum clone() const; /** * \brief Set the value of the BIGNUM. * \param ul The unsigned long value. */ void set_value(unsigned long ul) const; private: explicit bignum(pointer _ptr, deleter_type _del); }; /** * \brief Compare two BIGNUM pointers. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two bignum instance share the same underlying pointer. */ bool operator==(const bignum& lhs, const bignum& rhs); /** * \brief Compare two BIGNUM pointers. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two bignum instance do not share the same underlying pointer. */ bool operator!=(const bignum& lhs, const bignum& rhs); /** * \brief Add two BIGNUM pointers. * \param lhs The left argument. * \param rhs The right argument. * \return The result of the operation. */ bignum operator+(const bignum& lhs, const bignum& rhs); /** * \brief Substract two BIGNUM pointers. * \param lhs The left argument. * \param rhs The right argument. * \return The result of the operation. */ bignum operator-(const bignum& lhs, const bignum& rhs); inline bignum bignum::create() { return take_ownership(BN_new()); } inline bignum bignum::from_bin(const void* buf, size_t buf_len) { return take_ownership(BN_bin2bn(static_cast(buf), static_cast(buf_len), NULL)); } inline bignum bignum::from_long(unsigned long ul) { bignum result = create(); result.set_value(ul); return result; } inline bignum::bignum() { } inline bignum::bignum(pointer _ptr) : pointer_wrapper(_ptr, null_deleter) { } inline const bignum& bignum::operator+=(const bignum& bn) const { throw_error_if_not(BN_add(ptr().get(), ptr().get(), bn.raw()) != 0); return *this; } inline bignum& bignum::operator+=(const bignum& bn) { throw_error_if_not(BN_add(ptr().get(), ptr().get(), bn.raw()) != 0); return *this; } inline const bignum& bignum::operator-=(const bignum& bn) const { throw_error_if_not(BN_sub(ptr().get(), ptr().get(), bn.raw()) != 0); return *this; } inline bignum& bignum::operator-=(const bignum& bn) { throw_error_if_not(BN_sub(ptr().get(), ptr().get(), bn.raw()) != 0); return *this; } inline void bignum::copy(const bignum& bn) { throw_error_if_not(BN_copy(ptr().get(), bn.raw()) != 0); } inline size_t bignum::size() const { return BN_num_bytes(ptr().get()); } inline buffer bignum::to_bin() const { buffer result(size()); result.data().resize(to_bin(buffer_cast(result), buffer_size(result))); return result; } inline unsigned long bignum::to_long() const { return static_cast(BN_get_word(ptr().get())); } inline bignum bignum::clone() const { return take_ownership(BN_dup(ptr().get())); } inline void bignum::set_value(unsigned long ul) const { throw_error_if_not(BN_set_word(ptr().get(), ul) != 0); } inline bignum::bignum(pointer _ptr, deleter_type _del) : pointer_wrapper(_ptr, _del) { } inline bool operator==(const bignum& lhs, const bignum& rhs) { return lhs.raw() == rhs.raw(); } inline bool operator!=(const bignum& lhs, const bignum& rhs) { return lhs.raw() != rhs.raw(); } inline bignum operator+(const bignum& lhs, const bignum& rhs) { bignum result = bignum::create(); BN_add(result.raw(), lhs.raw(), rhs.raw()); return result; } inline bignum operator-(const bignum& lhs, const bignum& rhs) { bignum result = bignum::create(); BN_sub(result.raw(), lhs.raw(), rhs.raw()); return result; } } } #endif /* CRYPTOPLUS_BN_bignum_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/buffer.hpp000066400000000000000000000152001252300335000237640ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file buffer.hpp * \author Julien KAUFFMANN * \brief A buffer class. */ #ifndef CRYPTOPLUS_BUFFER_HPP #define CRYPTOPLUS_BUFFER_HPP #include #include #include #include namespace cryptoplus { /** * \brief A buffer type. */ class buffer { public: /** * \brief The underlying storage type. */ typedef std::vector storage_type; /** * \brief Create an empty buffer. */ buffer() {} /** * \brief Create a buffer that has the specified size. * \param size The size of the buffer to create. */ explicit buffer(size_t size) : m_data(size) {} /** * \brief Create a buffer from a raw buffer. * \param data The raw buffer. * \param data_len The count of bytes to copy. */ buffer(const void* data, size_t data_len); /** * \brief Create a buffer from a C-string. * \param str The C-string. */ explicit buffer(const char* str); /** * \brief Create a buffer from a string. * \param str The string. */ explicit buffer(const std::string& str); /** * \brief Create a buffer from its storage type. * \param data The storage type. */ explicit buffer(const storage_type& data); /** * \brief Create a buffer from two iterators. * \tparam Iterator The iterator type. * \param begin An iterator to the first element. * \param end An iterator past the last element. */ template buffer(Iterator begin, Iterator end) : m_data(begin, end) {} /** * \brief Get the underlying data. * \return The underlying data. */ storage_type& data() { return m_data; } /** * \brief Get the underlying data. * \return The underlying data. */ const storage_type& data() const { return m_data; } /** * \brief Get the buffer as a string. * \return The buffer as a string. */ std::string to_string() const { return std::string(m_data.begin(), m_data.end()); } /** * \brief Check if the buffer is empty. * \return true if the buffer is empty, false otherwise. */ bool empty() const { return m_data.empty(); } private: std::vector m_data; friend bool operator!(const buffer& buf) { return buf.empty(); } }; /** * \brief Compare two buffers for equality. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two buffers have the exact same content. */ bool operator==(const buffer& lhs, const buffer& rhs); /** * \brief Compare two buffers for non-equality. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two buffers have different contents. */ bool operator!=(const buffer& lhs, const buffer& rhs); /** * \brief Compare two buffers for ordering. * \param lhs The left argument. * \param rhs The right argument. * \return true if lhs is "smaller" than rhs. */ bool operator<(const buffer& lhs, const buffer& rhs); /** * \brief Cast a buffer to a pointer. * \tparam T The type of the pointer. * \param buf The buffer to cast. * \return The pointer. */ template T buffer_cast(buffer& buf) { return buf.data().empty() ? nullptr : reinterpret_cast(&buf.data()[0]); } /** * \brief Cast a buffer to a pointer. * \tparam T The type of the pointer. * \param buf The buffer to cast. * \return The pointer. */ template T buffer_cast(const buffer& buf) { return buf.data().empty() ? nullptr : reinterpret_cast(&buf.data()[0]); } /** * \brief Get the size of a buffer. * \param buf The buffer to get the size of. * \return The size of buf. */ size_t buffer_size(const buffer& buf); /** * \brief Output a buffer to a stream, as an hexadecimal string. * \param os The output stream. * \param buf The buffer to output. * \return os. */ std::ostream& operator<<(std::ostream& os, const buffer& buf); /** * \brief Convert a buffer to its hexadecimal representation. * \param buf The buffer to convert. * \return The hexadecimal representation of buf. */ std::string hex(const buffer& buf); inline bool operator==(const buffer& lhs, const buffer& rhs) { // Optimization-free implementation to prevent timing attacks. bool result = true; const auto len = std::min(lhs.data().size(), rhs.data().size()); for (size_t i = 0; i < len; ++i) { if (lhs.data()[i] != rhs.data()[i]) { result = false; } } if (lhs.data().size() != rhs.data().size()) { result = false; } return result; } inline bool operator!=(const buffer& lhs, const buffer& rhs) { return !(lhs == rhs); } inline bool operator<(const buffer& lhs, const buffer& rhs) { return lhs.data() < rhs.data(); } inline size_t buffer_size(const buffer& buf) { return buf.data().size(); } } #endif /* CRYPTOPLUS_BUFFER_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/cipher/000077500000000000000000000000001252300335000232565ustar00rootroot00000000000000freelan-2.0/libs/cryptoplus/include/cryptoplus/cipher/cipher_algorithm.hpp000066400000000000000000000134401252300335000273110ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file cipher_algorithm.hpp * \author Julien KAUFFMANN * \brief A cipher algorithm wrapper class. */ #ifndef CRYPTOPLUS_CIPHER_CIPHER_ALGORITHM_HPP #define CRYPTOPLUS_CIPHER_CIPHER_ALGORITHM_HPP #include "../nullable.hpp" #include #include #include namespace cryptoplus { namespace cipher { /** * \brief A cipher algorithm. */ class cipher_algorithm : public nullable { public: /** * \brief The maximum key length. */ static const size_t max_key_length; /** * \brief The maximum iv length. */ static const size_t max_iv_length; /** * \brief Create a new cipher_algorithm from a const EVP_CIPHER pointer. * \param cipher The raw const EVP_CIPHER pointer. If cipher is NULL, the cipher_algorithm is a null object on which no methods except raw() should be called. */ cipher_algorithm(const EVP_CIPHER* cipher = NULL); /** * \brief Create a new cipher_algorithm from its type (NID). * \param type The type of the cipher_algorithm to create. * \warning If no such type is found, a std::invalid_argument is thrown. */ explicit cipher_algorithm(int type); /** * \brief Create a new cipher_algorithm from its name. * \param name The name of the cipher_algorithm to create. * \warning If no such name is found, a std::invalid_argument is thrown. */ explicit cipher_algorithm(const std::string& name); /** * \brief Get the raw const EVP_CIPHER pointer. * \return The raw pointer. */ const EVP_CIPHER* raw() const; /** * \brief Get the type (NID) of the cipher_algorithm. * \return The type of the cipher_algorithm. */ int type() const; /** * \brief Get the name of the cipher_algorithm. * \return The name of the cipher_algorithm. */ std::string name() const; /** * \brief Get the size of a block. * \return The size of a block. */ size_t block_size() const; /** * \brief Get the key length. * \return The key length. */ size_t key_length() const; /** * \brief Get the iv length. * \return The iv length. */ size_t iv_length() const; /** * \brief Get the flags. * \return The flags. */ unsigned long flags() const; /** * \brief Get the mode. * \return The mode. */ unsigned long mode() const; /** * \brief Check that the cipher_algorithm is null. * \return true if the cipher_algorithm is null. */ bool operator!() const; /** * \brief Check that the cipher_algorithm is not null. * \return true if the cipher_algorithm is not null. */ bool boolean_test() const; private: const EVP_CIPHER* m_cipher; }; inline cipher_algorithm::cipher_algorithm(const EVP_CIPHER* cipher) : m_cipher(cipher) { } inline const EVP_CIPHER* cipher_algorithm::raw() const { return m_cipher; } inline int cipher_algorithm::type() const { assert(m_cipher); return EVP_CIPHER_nid(m_cipher); } inline std::string cipher_algorithm::name() const { return std::string(OBJ_nid2sn(type())); } inline size_t cipher_algorithm::block_size() const { assert(m_cipher); return EVP_CIPHER_block_size(m_cipher); } inline size_t cipher_algorithm::key_length() const { assert(m_cipher); return EVP_CIPHER_key_length(m_cipher); } inline size_t cipher_algorithm::iv_length() const { assert(m_cipher); return EVP_CIPHER_iv_length(m_cipher); } inline unsigned long cipher_algorithm::flags() const { assert(m_cipher); return EVP_CIPHER_flags(m_cipher); } inline unsigned long cipher_algorithm::mode() const { assert(m_cipher); return EVP_CIPHER_mode(m_cipher); } inline bool cipher_algorithm::operator!() const { return !boolean_test(); } inline bool cipher_algorithm::boolean_test() const { return (m_cipher != NULL); } } } #endif /* CRYPTOPLUS_CIPHER_CIPHER_ALGORITHM_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/cipher/cipher_context.hpp000066400000000000000000000424301252300335000270100ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file cipher_context.hpp * \author Julien KAUFFMANN * \brief A cipher context class. */ #ifndef CRYPTOPLUS_CIPHER_CIPHER_CONTEXT_HPP #define CRYPTOPLUS_CIPHER_CIPHER_CONTEXT_HPP #include "../buffer.hpp" #include "../error/helpers.hpp" #include "cipher_algorithm.hpp" #include #include #include #include #include namespace cryptoplus { namespace pkey { class pkey; } namespace cipher { /** * \brief A cipher context class. * * The cipher_context class ease the computation of a cipher. * * The list of the available cipher methods depends on the version of OpenSSL and can be found on the man page of EVP_EncryptInit(). * * cipher_context is noncopyable by design. */ class cipher_context : public boost::noncopyable { public: /** * \brief The cipher direction. */ enum cipher_direction { unchanged = -1, /**< \brief The direction did not change since the last call. */ decrypt = 0, /**< \brief Specifies a decryption cipher context. */ encrypt = 1 /**< \brief Specifies an encryption cipher context. */ }; /** * \brief Create a new cipher_context. */ cipher_context(); /** * \brief Destroy a cipher_context. * * Calls EVP_CIPHER_CTX_cleanup() on the internal EVP_CIPHER_CTX. */ ~cipher_context(); /** * \brief Initialize the cipher_context. * \param algorithm The cipher algorithm to use. * \param direction The direction of the cipher_context. If a previous call to initialize() was done, you may specify cipher_direction::unchanged to keep the same direction value. * \param key The key to use. Cannot be NULL. * \param key_len The length of key. Must match algorithm.key_length() or a std::runtime_error is thrown. * \param iv The iv to use (if one is needed for the specified algorithm, NULL otherwise). * \param impl The engine to use. Default is NULL which indicates that no engine should be used. * \see set_padding * * The list of the available hash methods depends on the version of OpenSSL and can be found on the man page of EVP_EncryptInit(). * * Once the cipher_context is initialized, you may enable or disable PKCS padding by calling set_padding(). By default, PKCS padding is enabled. */ void initialize(const cipher_algorithm& algorithm, cipher_direction direction, const void* key, size_t key_len, const void* iv, ENGINE* impl = NULL); /** * \brief Initialize the cipher_context for envelope sealing. * \param algorithm The cipher algorithm to use. * \param iv The iv that was generated (if one is needed for the specified algorithm, NULL otherwise). * \param pkeys_begin A pointer to the first public pkey to use. * \param pkeys_end A pointer past the last public pkey to use. * \return The public encrypted shared secret keys array. * \see seal_update * \see seal_finalize */ template std::vector seal_initialize(const cipher_algorithm& algorithm, void* iv, T pkeys_begin, T pkeys_end); /** * \brief Initialize the cipher_context for envelope sealing. * \param algorithm The cipher algorithm to use. * \param iv The iv that was generated (if one is needed for the specified algorithm, NULL otherwise). * \param pkey The public pkey to use. * \return The public encrypted shared secret key. * \see seal_update * \see seal_finalize */ buffer seal_initialize(const cipher_algorithm& algorithm, void* iv, pkey::pkey pkey); /** * \brief Initialize the cipher_context for envelope opening. * \param algorithm The cipher algorithm to use. * \param key The encrypted shared secret key. * \param key_len The length of key. Must match algorithm.key_length() or a std::runtime_error is thrown. * \param iv The iv to use (if one is needed for the specified algorithm, NULL otherwise). * \param pkey The private pkey to use. * \see open_update * \see open_finalize */ void open_initialize(const cipher_algorithm& algorithm, const void* key, size_t key_len, const void* iv, pkey::pkey pkey); /** * \brief Set PKCS padding state. * \param enabled If enabled is true, PKCS padding will be enabled. * \see cipher_algorithm::block_size * * If PKCS padding is disabled, the input data size must be an exact multiple of the specified algorithm block size. See cipher_algorithm::block_size(). */ void set_padding(bool enabled); /** * \brief Get the size of the ISO 10126 padding for a buffer of the specified size. * \param len The length of the buffer. * \return The size of the ISO 10126 padded result. */ size_t get_iso_10126_padding_size(size_t len) const; /** * \brief Pad the given buffer using the ISO 10126 padding. * \param buf The buffer. * \param buf_len The length of buf. * \param max_buf_len The maximum length of buf. Should be at least ((buf_len / algorithm().block_size()) + 1) * algorithm().block_size(). * \return The new size of the buffer. */ size_t add_iso_10126_padding(void* buf, size_t buf_len, size_t max_buf_len) const; /** * \brief Get an ISO 10126 padded copy of the specified buffer. * \param buf The buffer. * \param buf_len The length of buf. * \return The resulting buffer. */ buffer get_iso_10126_padded_buffer(const void* buf, size_t buf_len) const; /** * \brief Verify the given buffer and check if it matches ISO 10126 padding. * \param buf The buffer. * \param buf_len The length of buf, including its padding. Should be a multiple of algorithm().block_size(). * \return The size of the data, without any padding. */ size_t verify_iso_10126_padding(const void* buf, size_t buf_len) const; /** * \brief Get the key length. * \return The key length. * \see set_key_length * * For fixed key length ciphers, returns the same value as algorithm().key_length(). * For variable key length ciphers, returns the current used key length value. See set_key_length(). */ size_t key_length() const; /** * \brief Set the current key length for variable key length ciphers. * \param len The new key length. * \warning Attempting to set the key length of a fixed key length cipher is an error. */ void set_key_length(size_t len); /** * \brief Control cipher specific parameters. * \param type The type. * \param set_value The first value. * \param get_value The second value. */ void ctrl(int type, int set_value, void* get_value); /** * \brief Get cipher specific parameters. * \param type The type. * \param value The value to get. */ template void ctrl_get(int type, T& value); /** * \brief Set cipher specific parameters. * \param type The type. * \param value The value to set. */ void ctrl_set(int type, int value); /** * \brief Update the cipher_context with some data. * \param out The output buffer. Should be at least in_len + algorithm().block_size() bytes long. Cannot be NULL. * \param out_len The length of the out buffer. * \param in The input buffer. * \param in_len The length of the in buffer. * \return The count of bytes written. */ size_t update(void* out, size_t out_len, const void* in, size_t in_len); /** * \brief Update the cipher_context with some data. * \param out The output buffer. Should be at least in_len + algorithm().block_size() bytes long. Cannot be NULL. * \param out_len The length of the out buffer. Will be updated to indicate the written bytes count. * \param in The input buffer. * \param in_len The length of the in buffer. * \return The count of bytes written. */ size_t seal_update(void* out, size_t out_len, const void* in, size_t in_len); /** * \brief Update the cipher_context with some data. * \param out The output buffer. Should be at least in_len + algorithm().block_size() bytes long. Cannot be NULL. * \param out_len The length of the out buffer. Will be updated to indicate the written bytes count. * \param in The input buffer. * \param in_len The length of the in buffer. * \return The count of bytes written. */ size_t open_update(void* out, size_t out_len, const void* in, size_t in_len); /** * \brief Update the cipher_context with some data. * \param out The output buffer. Should be at least in_len + algorithm().block_size() bytes long. Cannot be NULL. * \param out_len The length of the out buffer. * \param in The input buffer. * \return The count of bytes written. */ size_t update(void* out, size_t out_len, const buffer& in); /** * \brief Update the cipher_context with some data. * \param out The output buffer. Should be at least in_len + algorithm().block_size() bytes long. Cannot be NULL. * \param out_len The length of the out buffer. Will be updated to indicate the written bytes count. * \param in The input buffer. * \return The count of bytes written. */ size_t seal_update(void* out, size_t out_len, const buffer& in); /** * \brief Update the cipher_context with some data. * \param out The output buffer. Should be at least in_len + algorithm().block_size() bytes long. Cannot be NULL. * \param out_len The length of the out buffer. Will be updated to indicate the written bytes count. * \param in The input buffer. * \return The count of bytes written. */ size_t open_update(void* out, size_t out_len, const buffer& in); /** * \brief Finalize the cipher_context and get the resulting buffer. * \param out The output buffer. Should be at least algorithm().block_size() bytes long. Cannot be NULL. * \param out_len The length of the out buffer. * \return The count of bytes written. * * After a call to finalize() no more call to update() can be made unless initialize() is called again first. */ size_t finalize(void* out, size_t out_len); /** * \brief Finalize the cipher_context and get the resulting buffer. * \param out The output buffer. Should be at least algorithm().block_size() bytes long. Cannot be NULL. * \param out_len The length of the out buffer. * \return The count of bytes written. * * After a call to seal_finalize() no more call to seal_update() can be made unless seal_initialize() is called again first. */ size_t seal_finalize(void* out, size_t out_len); /** * \brief Finalize the cipher_context and get the resulting buffer. * \param out The output buffer. Should be at least algorithm().block_size() bytes long. Cannot be NULL. * \param out_len The length of the out buffer. * \return The count of bytes written. * * After a call to open_finalize() no more call to open_update() can be made unless open_initialize() is called again first. */ size_t open_finalize(void* out, size_t out_len); /** * \brief Get the underlying context. * \return The underlying context. * \warning This method is provided for compatibility issues only. Its use is greatly discouraged. */ const EVP_CIPHER_CTX& raw() const; /** * \brief Get the underlying context. * \return The underlying context. * \warning This method is provided for compatibility issues only. Its use is greatly discouraged. */ EVP_CIPHER_CTX& raw(); /** * \brief Get the associated cipher algorithm. * \return The associated cipher algorithm. If no call to initialize was done, the behavior is undefined. */ cipher_algorithm algorithm() const; private: EVP_CIPHER_CTX m_ctx; }; inline cipher_context::cipher_context() { EVP_CIPHER_CTX_init(&m_ctx); } inline cipher_context::~cipher_context() { EVP_CIPHER_CTX_cleanup(&m_ctx); } template inline std::vector cipher_context::seal_initialize(const cipher_algorithm& _algorithm, void* iv, T pkeys_begin, T pkeys_end) { size_t pkeys_count = std::distance(pkeys_begin, pkeys_end); std::vector result; std::vector ek; std::vector ekl(pkeys_count); std::vector pubk; ek.reserve(pkeys_count); pubk.reserve(pkeys_count); result.reserve(pkeys_count); if (pkeys_count > 0) { try { for (T pkey = pkeys_begin; pkey != pkeys_end; ++pkey) { ek.push_back(new unsigned char[pkey->size()]); pubk.push_back(pkey->raw()); } throw_error_if_not(EVP_SealInit(&m_ctx, _algorithm.raw(), &ek[0], &ekl[0], static_cast(iv), &pubk[0], static_cast(pkeys_count)) != 0); for (std::vector::iterator p = ek.begin(); p != ek.end(); ++p) { result.push_back(buffer(*p, *p + ekl[std::distance(ek.begin(), p)])); } } catch (...) { for (std::vector::iterator p = ek.begin(); p != ek.end(); ++p) { delete[] *p; } throw; } for (std::vector::iterator p = ek.begin(); p != ek.end(); ++p) { delete[] *p; } } return result; } inline void cipher_context::set_padding(bool enabled) { // The call always returns 1 so testing its return value is useless. EVP_CIPHER_CTX_set_padding(&m_ctx, static_cast(enabled)); } inline size_t cipher_context::get_iso_10126_padding_size(size_t len) const { return ((len / algorithm().block_size()) + 1) * algorithm().block_size(); } inline buffer cipher_context::get_iso_10126_padded_buffer(const void* buf, size_t buf_len) const { buffer result(get_iso_10126_padding_size(buf_len)); std::memcpy(buffer_cast(result), buf, buf_len); result.data().resize(add_iso_10126_padding(buffer_cast(result), buf_len, buffer_size(result))); return result; } inline size_t cipher_context::key_length() const { return EVP_CIPHER_CTX_key_length(&m_ctx); } inline void cipher_context::set_key_length(size_t len) { throw_error_if_not(EVP_CIPHER_CTX_set_key_length(&m_ctx, static_cast(len)) != 0); } inline void cipher_context::ctrl(int type, int set_value, void* get_value) { throw_error_if_not(EVP_CIPHER_CTX_ctrl(&m_ctx, type, set_value, get_value) != 0); } template inline void cipher_context::ctrl_get(int type, T& value) { throw_error_if_not(EVP_CIPHER_CTX_ctrl(&m_ctx, type, 0, &value) != 0); } inline void cipher_context::ctrl_set(int type, int value) { throw_error_if_not(EVP_CIPHER_CTX_ctrl(&m_ctx, type, value, NULL) != 0); } inline size_t cipher_context::update(void* out, size_t out_len, const buffer& in) { return update(out, out_len, buffer_cast(in), buffer_size(in)); } inline size_t cipher_context::seal_update(void* out, size_t out_len, const buffer& in) { return seal_update(out, out_len, buffer_cast(in), buffer_size(in)); } inline size_t cipher_context::open_update(void* out, size_t out_len, const buffer& in) { return open_update(out, out_len, buffer_cast(in), buffer_size(in)); } inline const EVP_CIPHER_CTX& cipher_context::raw() const { return m_ctx; } inline EVP_CIPHER_CTX& cipher_context::raw() { return m_ctx; } inline cipher_algorithm cipher_context::algorithm() const { return cipher_algorithm(EVP_CIPHER_CTX_cipher(&m_ctx)); } } } #endif /* CRYPTOPLUS_CIPHER_CIPHER_CONTEXT_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/cipher/cipher_stream.hpp000066400000000000000000000144711252300335000266230ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file cipher_stream.hpp * \author Julien KAUFFMANN * \brief A cipher stream class. */ #ifndef CRYPTOPLUS_CIPHER_CIPHER_STREAM_HPP #define CRYPTOPLUS_CIPHER_CIPHER_STREAM_HPP #include "../buffer.hpp" #include "cipher_context.hpp" #include namespace cryptoplus { namespace cipher { /** * \brief A cipher stream class. * * The cipher_stream class ease the computation of a cipher, using a stream oriented interface. * * To work with cipher_stream, call the initialize() method like you would do on a cipher_context, call append() or operator<<() as long as you have data to cipher then call finalize(). The resulting ciphered buffer can be get by calling result(). * * The list of the available cipher methods depends on the version of OpenSSL and can be found on the man page of EVP_EncryptInit(). * * cipher_stream is noncopyable by design. */ class cipher_stream : private cipher_context { public: using cipher_context::cipher_direction; using cipher_context::unchanged; using cipher_context::decrypt; using cipher_context::encrypt; using cipher_context::initialize; using cipher_context::set_padding; using cipher_context::set_key_length; using cipher_context::key_length; using cipher_context::ctrl_get; using cipher_context::ctrl_set; using cipher_context::algorithm; /** * \brief Create a new cipher stream. * \param alloc The minimum number of bytes to pre-allocate. A good value here is the count of bytes to cipher + cipher algorithm block size. * \see initalize() * * The list of the available hash methods depends on the version of OpenSSL and can be found on the man page of EVP_EncryptInit(). */ explicit cipher_stream(size_t alloc); /** * \brief Append data to the stream. * \param buf The data to append to the stream. * \param buf_len The length of buf. * \return The cipher stream. */ cipher_stream& append(const void* buf, size_t buf_len); /** * \brief Append data to the stream. * \param buf The data to append to the stream. * \return The cipher stream. */ cipher_stream& append(const buffer& buf); /** * \brief Append a C-string to the stream. * \param cstr The C-string to add. No terminal null-characater is appended. * \return The cipher stream. */ cipher_stream& append(const char* cstr); /** * \brief Append a string to the stream. * \param str The string to add. No terminal null-characater is appended. * \return The cipher stream. */ cipher_stream& append(const std::string& str); /** * \brief Finalize the stream input. * \see result() */ void finalize(); /** * \brief Reallocate the internal buffer. * \param alloc The minimum number of bytes to pre-allocate. A good value here is the count of bytes to cipher + cipher algorithm block size. * \warning Avoid reallocations while a encrypt/decrypt sequence is pending. At any time, if the streams needs more output space, it will automatically reallocate() the underlying buffer. */ void reallocate(size_t alloc); /** * \brief Get the result buffer. * \return The result buffer. * \warning Be sure to call finalize() before calling this method. * \see finalize() */ const buffer& result() const; private: using cipher_context::update; using cipher_context::finalize; buffer m_buffer; size_t m_offset; }; /** * \brief Append a value to a cipher_stream. * \param cs The cipher_stream. * \param value The value. * \return The cipher_stream. */ template cipher_stream& operator<<(cipher_stream& cs, const T& value); inline cipher_stream::cipher_stream(size_t alloc) : m_buffer(alloc), m_offset(0) { } inline cipher_stream& cipher_stream::append(const buffer& buf) { return append(buffer_cast(buf), buffer_size(buf)); } inline cipher_stream& cipher_stream::append(const char* cstr) { return append(cstr, std::strlen(cstr)); } inline cipher_stream& cipher_stream::append(const std::string& str) { return append(str.c_str(), str.size()); } inline void cipher_stream::reallocate(size_t alloc) { m_buffer.data().resize(alloc); } inline const buffer& cipher_stream::result() const { return m_buffer; } template inline cipher_stream& operator<<(cipher_stream& cs, const T& value) { return cs.append(value); } } } #endif /* CRYPTOPLUS_CIPHER_CIPHER_STREAM_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/cryptoplus.hpp000066400000000000000000000055701252300335000247500ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file cryptoplus.hpp * \author Julien Kauffmann * \brief The global cryptoplus include file. */ #ifndef CRYPTOPLUS_CRYPTOPLUS_HPP #define CRYPTOPLUS_CRYPTOPLUS_HPP #include "initializer.hpp" #include namespace cryptoplus { namespace { /** * \brief A function wrapper to call the OpenSSL_add_all_algorithms macro. */ inline void _OpenSSL_add_all_algorithms() { OpenSSL_add_all_algorithms(); } /** * \brief A function that does nothing. */ inline void _null_function() { } } /** * \brief The algorithms initializer. * * Only one instance of this class should be created. When an instance exists, the library can proceed to name resolutions. */ typedef initializer<_OpenSSL_add_all_algorithms, EVP_cleanup> algorithms_initializer; /** * \brief The crypto initializer. * * Only one instance of this class should be created. When an instance exists, it will prevent memory leaks related to the libcrypto's internals. */ typedef initializer<_null_function, CRYPTO_cleanup_all_ex_data> crypto_initializer; } #endif /* CRYPTOPLUS_CRYPTOPLUS_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/error/000077500000000000000000000000001252300335000231355ustar00rootroot00000000000000freelan-2.0/libs/cryptoplus/include/cryptoplus/error/error.hpp000066400000000000000000000212751252300335000250060ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file error.hpp * \author Julien Kauffmann * \brief Error helper functions. */ #pragma once #include #include #include #include namespace cryptoplus { namespace error { /** * \brief The error type. */ struct error_type { unsigned long error_code; }; /** * \brief The error info structure. */ struct error_info { /** * \brief The file. */ const char* file; /** * \brief The line. */ int line; }; /** * \brief The error data structure. */ struct error_data { /** * \brief Check if the data is a text string. * \return true if the data is a text string. */ bool is_text_string() const; /** * \brief Check if the data was allocated using OPENSSL_malloc(). * \return true if the data was allocated using OPENSSL_malloc(). */ bool is_text_malloced() const; /** * \brief The data. */ const char* data; /** * \brief The flags. */ int flags; }; /** * \brief Get the earliest crypto error that occured in this thread and removes it from the error queue. * \return The last error. */ error_type get_error(); /** * \brief Get the earliest crypto error that occured in this thread and leaves it in the error queue. * \return The last error. */ error_type peek_error(); /** * \brief Get the last crypto error that occured in this thread and leaves it in the error queue. * \return The last error. */ error_type peek_last_error(); /** * \brief Get the earliest crypto error that occured in this thread and removes it from the error queue. * \param info The error information. * \return The last error. */ error_type get_error_line(error_info& info); /** * \brief Get the earliest crypto error that occured in this thread and leaves it in the error queue. * \param info The error information. * \return The last error. */ error_type peek_error_line(error_info& info); /** * \brief Get the last crypto error that occured in this thread and leaves it in the error queue. * \param info The error information. * \return The last error. */ error_type peek_last_error_line(error_info& info); /** * \brief Get the earliest crypto error that occured in this thread and removes it from the error queue. * \param info The error information. * \param data The error data. * \return The last error. */ error_type get_error_line_data(error_info& info, error_data& data); /** * \brief Get the earliest crypto error that occured in this thread and leaves it in the error queue. * \param info The error information. * \param data The error data. * \return The last error. */ error_type peek_error_line_data(error_info& info, error_data& data); /** * \brief Get the last crypto error that occured in this thread and leaves it in the error queue. * \param info The error information. * \param data The error data. * \return The last error. */ error_type peek_last_error_line_data(error_info& info, error_data& data); /** * \brief Get the library component of the specified error code. * \param err The error code. * \return The library component. */ int get_library_error(error_type err); /** * \brief Get the function component of the specified error code. * \param err The error code. * \return The function component. */ int get_function_error(error_type err); /** * \brief Get the reasib component of the specified error code. * \param err The error code. * \return The reason component. */ int get_reason_error(error_type err); inline bool error_data::is_text_string() const { return (flags & ERR_TXT_STRING) == ERR_TXT_STRING; } inline bool error_data::is_text_malloced() const { return (flags & ERR_TXT_MALLOCED) == ERR_TXT_MALLOCED; } inline error_type get_error() { return error_type{ ERR_get_error() }; } inline error_type peek_error() { return error_type{ ERR_peek_error() }; } inline error_type peek_last_error() { return error_type{ ERR_peek_last_error() }; } inline error_type get_error_line(error_info& info) { return error_type{ ERR_get_error_line(&info.file, &info.line) }; } inline error_type peek_error_line(error_info& info) { return error_type{ ERR_peek_error_line(&info.file, &info.line) }; } inline error_type peek_last_error_line(error_info& info) { return error_type{ ERR_peek_last_error_line(&info.file, &info.line) }; } inline error_type get_error_line_data(error_info& info, error_data& data) { return error_type{ ERR_get_error_line_data(&info.file, &info.line, &data.data, &data.flags) }; } inline error_type peek_error_line_data(error_info& info, error_data& data) { return error_type{ ERR_peek_error_line_data(&info.file, &info.line, &data.data, &data.flags) }; } inline error_type peek_last_error_line_data(error_info& info, error_data& data) { return error_type{ ERR_peek_last_error_line_data(&info.file, &info.line, &data.data, &data.flags) }; } inline int get_library_error(error_type err) { return ERR_GET_LIB(err.error_code); } inline int get_function_error(error_type err) { return ERR_GET_FUNC(err.error_code); } inline int get_reason_error(error_type err) { return ERR_GET_REASON(err.error_code); } } /** * @brief Get the default cryptoplus error category. * @return The default cryptoplus error category instance. * * @warning The first call to this function is thread-safe only starting with C++11. */ const boost::system::error_category& cryptoplus_category(); /** * @brief Create an error_code instance for the given error. * @param error The error. * @return The error_code instance. */ inline boost::system::error_code make_error_code(error::error_type error) { return boost::system::error_code(static_cast(error.error_code), cryptoplus_category()); } /** * @brief Create an error_condition instance for the given error. * @param error The error. * @return The error_condition instance. */ inline boost::system::error_condition make_error_condition(error::error_type error) { return boost::system::error_condition(static_cast(error.error_code), cryptoplus_category()); } /** * @brief A cryptoplus error category. */ class cryptoplus_category_impl : public boost::system::error_category { public: /** * @brief Get the name of the category. * @return The name of the category. */ virtual const char* name() const throw(); /** * @brief Get the error message for a given error. * @param ev The error numeric value. * @return The message associated to the error. */ virtual std::string message(int ev) const; }; } namespace boost { namespace system { template <> struct is_error_code_enum : public boost::true_type {}; } } freelan-2.0/libs/cryptoplus/include/cryptoplus/error/error_strings.hpp000066400000000000000000000101461252300335000265520ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file error_strings.hpp * \author Julien Kauffmann * \brief Error strings helper functions. */ #ifndef CRYPTOPLUS_ERROR_STRINGS_HPP #define CRYPTOPLUS_ERROR_STRINGS_HPP #include "error.hpp" #include "../initializer.hpp" #include namespace cryptoplus { namespace error { /** * \brief A error string initializer. * * Only one instance of this class should be created. When an instance exists, the library can provide more informative error strings. */ typedef initializer error_strings_initializer; /** * \brief Get the error string associated with a specified error. * \param err The error. */ std::string get_error_string(error_type err); /** * \brief Get the error string associated with a specified error, with a limited count of characters. * \param err The error. * \param len The maximum characters count to get. */ std::string get_error_string_n(error_type err, size_t len); /** * \brief Get the library error string associated with a specified error. * \param err The error. */ std::string get_library_error_string(error_type err); /** * \brief Get the function error string associated with a specified error. * \param err The error. */ std::string get_function_error_string(error_type err); /** * \brief Get the reason error string associated with a specified error. * \param err The error. */ std::string get_reason_error_string(error_type err); /** * \brief Print the errors to a BIO. * \param bp The BIO. * * The error queue will be empty after this call. */ void print_errors(BIO* bp); /** * \brief Print the errors to a file. * \param fp The file. * * The error queue will be empty after this call. */ void print_errors(FILE* fp); inline std::string get_library_error_string(error_type err) { return ERR_lib_error_string(err.error_code); } inline std::string get_function_error_string(error_type err) { return ERR_func_error_string(err.error_code); } inline std::string get_reason_error_string(error_type err) { return ERR_reason_error_string(err.error_code); } inline void print_errors(BIO* bp) { ERR_print_errors(bp); } inline void print_errors(FILE* fp) { ERR_print_errors_fp(fp); } } } #endif /* CRYPTOPLUS_ERROR_STRINGS_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/error/helpers.hpp000066400000000000000000000055561252300335000253230ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file helpers.hpp * \author Julien Kauffmann * \brief Error helpers. */ #pragma once #include "error.hpp" namespace cryptoplus { /** * \brief Throw an exception for the first available cryptographic error in the error queue. */ inline void throw_error() { throw boost::system::system_error(make_error_code(error::get_error())); } /** * \brief Throw an exception for the first available cryptographic error in the error queue if the condition succeeds. * \param condition The condition. */ inline void throw_error_if(bool condition) { if (condition) throw_error(); } /** * \brief Throw an exception for the first available cryptographic error in the error queue if the condition fails. * \param condition The condition. */ inline void throw_error_if_not(bool condition) { if (!condition) throw_error(); } /** * \brief Throw an exception for the first available cryptographic error in the error queue if the specified pointer is NULL. * \param ptr The pointer to test. */ inline void throw_error_if_not(const void* ptr) { if (ptr == NULL) throw_error(); } } freelan-2.0/libs/cryptoplus/include/cryptoplus/file.hpp000066400000000000000000000104461252300335000234410ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file file.hpp * \author Julien KAUFFMANN * \brief A file class. */ #ifndef CRYPTOPLUS_FILE_HPP #define CRYPTOPLUS_FILE_HPP #include "os.hpp" #include "pointer_wrapper.hpp" #include #include namespace cryptoplus { /** * \brief A file class. * * The file class represents a FILE*. * file is a low level structure. * * A file instance has the same semantic as a FILE* pointer, thus two copies of the same instance share the same underlying pointer. */ class file : public pointer_wrapper { public: /** * \brief Open a file. * \param filename The filename. * \param mode The mode, as specified in fopen(). * \return The file. */ static file open(const std::string& filename, const std::string& mode = "r"); #ifdef WINDOWS /** * \brief Open a file, unicode aware version. * \param filename The filename. * \param mode The mode, as specified in fopen(). * \return The file. */ static file open(const std::wstring& filename, const std::wstring& mode = L"r"); #endif /** * \brief Take ownership of a specified EVP_file pointer. * \param ptr The pointer. Cannot be NULL. * \return An file. */ static file take_ownership(pointer ptr); /** * \brief Create a new empty file. */ file(); /** * \brief Create an file by *NOT* taking ownership of an existing EVP_file pointer. * \param ptr The EVP_file pointer. * \warning The caller is still responsible for freeing the memory. */ file(pointer ptr); private: explicit file(pointer _ptr, deleter_type _del); }; /** * \brief Compare two file instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two file instances share the same underlying pointer. */ bool operator==(const file& lhs, const file& rhs); /** * \brief Compare two file instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two file instances do not share the same underlying pointer. */ bool operator!=(const file& lhs, const file& rhs); inline file::file() { } inline file::file(pointer _ptr) : pointer_wrapper(_ptr, null_deleter) { } inline file::file(pointer _ptr, deleter_type _del) : pointer_wrapper(_ptr, _del) { } inline bool operator==(const file& lhs, const file& rhs) { return lhs.raw() == rhs.raw(); } inline bool operator!=(const file& lhs, const file& rhs) { return lhs.raw() != rhs.raw(); } } #endif /* CRYPTOPLUS_FILE_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/hash/000077500000000000000000000000001252300335000227275ustar00rootroot00000000000000freelan-2.0/libs/cryptoplus/include/cryptoplus/hash/hmac.hpp000066400000000000000000000073501252300335000243550ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file hmac.hpp * \author Julien KAUFFMANN * \brief HMAC helper functions. */ #ifndef CRYPTOPLUS_HASH_HMAC_HPP #define CRYPTOPLUS_HASH_HMAC_HPP #include "../buffer.hpp" #include "message_digest_algorithm.hpp" #include namespace cryptoplus { namespace hash { /** * \brief Compute a HMAC for the given buffer, using the given key and digest method. * \param out The output buffer. Must be at least as big as the message digest algorithm result size. * \param out_len The output buffer length. * \param key The key to use. * \param key_len The key length. * \param data The buffer. * \param len The buffer length. * \param algorithm The message digest algorithm to use. * \param impl The engine to use. The NULL default value indicate that no engine should be used. * \return The count of bytes written to out. Should be equal to algorithm.result_size(). */ size_t hmac(void* out, size_t out_len, const void* key, size_t key_len, const void* data, size_t len, const message_digest_algorithm& algorithm, ENGINE* impl = NULL); /** * \brief Compute a HMAC for the given buffer, using the given key and digest method. * \param key The key to use. * \param key_len The key length. * \param data The buffer. * \param len The buffer length. * \param algorithm The message digest algorithm to use. * \param impl The engine to use. The NULL default value indicate that no engine should be used. * \return The hmac. */ buffer hmac(const void* key, size_t key_len, const void* data, size_t len, const message_digest_algorithm& algorithm, ENGINE* impl = NULL); inline buffer hmac(const void* key, size_t key_len, const void* data, size_t len, const message_digest_algorithm& algorithm, ENGINE* impl) { buffer result(algorithm.result_size()); hmac(buffer_cast(result), buffer_size(result), key, key_len, data, len, algorithm, impl); return result; } } } #endif /* CRYPTOPLUS_HASH_HMAC_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/hash/hmac_context.hpp000066400000000000000000000140421252300335000261150ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file hmac_context.hpp * \author Julien KAUFFMANN * \brief A HMAC context class. */ #ifndef CRYPTOPLUS_HASH_HMAC_CONTEXT_HPP #define CRYPTOPLUS_HASH_HMAC_CONTEXT_HPP #include "../buffer.hpp" #include "../error/helpers.hpp" #include "message_digest_algorithm.hpp" #include #include #include namespace cryptoplus { namespace hash { /** * \brief A HMAC context class. * * The hmac_context class ease the computation of a HMAC. * * The list of the available hash methods depends on the version of OpenSSL and can be found on the man page of EVP_DigestInit(). * * A hmac_context is non-copyable by design. */ class hmac_context : public boost::noncopyable { public: /** * \brief Create a new hmac_context. */ hmac_context(); /** * \brief Destroy a hmac_context. * * Calls HMAC_CTX_cleanup() on the internal HMAC_CTX. */ ~hmac_context(); /** * \brief Initialize the hmac_context. * \param key The key to use. If key is NULL, the previously used key is taken. * \param key_len The key length. If key is NULL, key_len is not used. * \param algorithm The message digest algorithm to use. If algorithm is NULL, then the previously specified algorithm is reused. * \param impl The engine to use. Default is NULL which indicates that no engine should be used. * * The list of the available hash methods depends on the version of OpenSSL and can be found on the man page of EVP_DigestInit(). */ void initialize(const void* key, size_t key_len, const message_digest_algorithm* algorithm, ENGINE* impl = NULL); /** * \brief Update the hmac_context with some data. * \param data The data buffer. * \param len The data length. */ void update(const void* data, size_t len); /** * \brief Finalize the hmac_context and get the resulting buffer. * \param md The resulting buffer. Cannot be NULL. * \param len The length of md. * \return The number of bytes written or 0 on failure. * * After a call to finalize() no more call to update() can be made unless initialize() is called again first. */ size_t finalize(void* md, size_t len); /** * \brief Finalize the hmac_context and get the resulting buffer. * \return The resulting buffer. */ buffer finalize(); /** * \brief Get the underlying context. * \return The underlying context. * \warning This method is provided for compatibility issues only. Its use is greatly discouraged. */ const HMAC_CTX& raw() const; /** * \brief Get the underlying context. * \return The underlying context. * \warning This method is provided for compatibility issues only. Its use is greatly discouraged. */ HMAC_CTX& raw(); /** * \brief Get the associated message digest algorithm. * \return The associated message digest algorithm. If no call to initialize() was done to specify a message digest algorithm, the behavior is undefined. */ message_digest_algorithm algorithm() const; private: HMAC_CTX m_ctx; }; inline hmac_context::hmac_context() { HMAC_CTX_init(&m_ctx); } inline hmac_context::~hmac_context() { HMAC_CTX_cleanup(&m_ctx); } inline void hmac_context::update(const void* data, size_t len) { #if OPENSSL_VERSION_NUMBER < 0x01000000 HMAC_Update(&m_ctx, static_cast(data), static_cast(len)); #else throw_error_if_not(HMAC_Update(&m_ctx, static_cast(data), static_cast(len)) != 0); #endif } inline buffer hmac_context::finalize() { buffer result(algorithm().result_size()); finalize(buffer_cast(result), buffer_size(result)); return result; } inline const HMAC_CTX& hmac_context::raw() const { return m_ctx; } inline HMAC_CTX& hmac_context::raw() { return m_ctx; } inline message_digest_algorithm hmac_context::algorithm() const { //WARNING: Here we directly use the undocumented HMAC_CTX.md field. This is unlikely to change, but if it ever does, we'll have to find a better way of doing things nicely. return message_digest_algorithm(m_ctx.md); } } } #endif /* CRYPTOPLUS_HASH_HMAC_CONTEXT_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/hash/message_digest.hpp000066400000000000000000000103301252300335000264200ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file message_digest.hpp * \author Julien KAUFFMANN * \brief Message digest helper functions. */ #ifndef CRYPTOPLUS_HASH_MESSAGE_DIGEST_HPP #define CRYPTOPLUS_HASH_MESSAGE_DIGEST_HPP #include "../buffer.hpp" #include "message_digest_algorithm.hpp" #include namespace cryptoplus { namespace hash { /** * \brief Compute a message digest for the given buffer, using the given digest method. * \param out The output buffer. Must be at least message_digest_size(md) bytes long. * \param out_len The output buffer length. * \param data The buffer. * \param len The buffer length. * \param algorithm The message digest algorithm to use. * \param impl The engine to use. The NULL default value indicate that no engine should be used. * \return The count of bytes written to out. Should be equal to the size of the message digest algorithm. */ size_t message_digest(void* out, size_t out_len, const void* data, size_t len, const message_digest_algorithm& algorithm, ENGINE* impl = NULL); /** * \brief Compute a message digest for the given buffer, using the given digest method. * \param data The buffer. * \param len The buffer length. * \param algorithm The message digest algorithm to use. * \param impl The engine to use. The NULL default value indicate that no engine should be used. * \return The message digest. */ buffer message_digest(const void* data, size_t len, const message_digest_algorithm& algorithm, ENGINE* impl = NULL); /** * \brief Compute a message digest for the given buffer, using the given digest method. * \param buf The buffer. * \param algorithm The message digest algorithm to use. * \param impl The engine to use. The NULL default value indicate that no engine should be used. * \return The message digest. */ buffer message_digest(const buffer& buf, const message_digest_algorithm& algorithm, ENGINE* impl = NULL); inline buffer message_digest(const void* data, size_t len, const message_digest_algorithm& algorithm, ENGINE* impl) { buffer result(algorithm.result_size()); message_digest(buffer_cast(result), buffer_size(result), data, len, algorithm, impl); return result; } inline buffer message_digest(const buffer& buf, const message_digest_algorithm& algorithm, ENGINE* impl) { return message_digest(buffer_cast(buf), buffer_size(buf), algorithm, impl); } } } #endif /* CRYPTOPLUS_HASH_MESSAGE_DIGEST_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/hash/message_digest_algorithm.hpp000066400000000000000000000106141252300335000304730ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file message_digest_algorithm.hpp * \author Julien KAUFFMANN * \brief A message digest algorithm wrapper class. */ #ifndef CRYPTOPLUS_HASH_MESSAGE_DIGEST_ALGORITHM_HPP #define CRYPTOPLUS_HASH_MESSAGE_DIGEST_ALGORITHM_HPP #include #include namespace cryptoplus { namespace hash { /** * \brief A message digest algorithm. */ class message_digest_algorithm { public: /** * \brief Create a new message_digest_algorithm from a const EVP_MD pointer. * \param md The raw const EVP_MD pointer. If md is NULL, the behavior is undefined. */ message_digest_algorithm(const EVP_MD* md); /** * \brief Create a new message_digest_algorithm from its type (NID). * \param type The type of the message_digest_algorithm to create. * \warning If no such type is found, a std::invalid_argument is thrown. */ explicit message_digest_algorithm(int type); /** * \brief Create a new message_digest_algorithm from its name. * \param name The name of the message_digest_algorithm to create. * \warning If no such name is found, a std::invalid_argument is thrown. */ explicit message_digest_algorithm(const std::string& name); /** * \brief Get the raw const EVP_MD pointer. * \return The raw pointer. */ const EVP_MD* raw() const; /** * \brief Get the type (NID) of the message_digest_algorithm. * \return The type of the message_digest_algorithm. */ int type() const; /** * \brief Get the name of the message_digest_algorithm. * \return The name of the message_digest_algorithm. */ std::string name() const; /** * \brief Get the size of the generated digest message. * \return The size of the generated digest message. */ size_t result_size() const; /** * \brief Get the size of a block. * \return The size of a block. */ size_t block_size() const; private: const EVP_MD* m_md; }; inline message_digest_algorithm::message_digest_algorithm(const EVP_MD* md) : m_md(md) { } inline const EVP_MD* message_digest_algorithm::raw() const { return m_md; } inline int message_digest_algorithm::type() const { return EVP_MD_type(m_md); } inline std::string message_digest_algorithm::name() const { return std::string(OBJ_nid2sn(type())); } inline size_t message_digest_algorithm::result_size() const { return EVP_MD_size(m_md); } inline size_t message_digest_algorithm::block_size() const { return EVP_MD_block_size(m_md); } } } #endif /* CRYPTOPLUS_HASH_MESSAGE_DIGEST_ALGORITHM_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/hash/message_digest_context.hpp000066400000000000000000000436011252300335000301730ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file message_digest_context.hpp * \author Julien KAUFFMANN * \brief A message digest context class. */ #ifndef CRYPTOPLUS_HASH_MESSAGE_DIGEST_CONTEXT_HPP #define CRYPTOPLUS_HASH_MESSAGE_DIGEST_CONTEXT_HPP #include "../error/helpers.hpp" #include "message_digest_algorithm.hpp" #include "../pkey/pkey.hpp" #include namespace cryptoplus { namespace hash { /** * \brief A message digest context class. * * The message_digest_context class ease the computation of a message digest (hash). * * The list of the available hash methods depends on the version of OpenSSL and can be found on the man page of EVP_DigestInit(). * * message_digest_context is noncopyable by design, however you may copy an existing message_digest_context using copy(). This is useful when you have to compute the hash of several values that differ only in their last bytes. */ class message_digest_context { public: /** * \brief Create a new message_digest_context. */ message_digest_context() { EVP_MD_CTX_init(&m_ctx); } /** * \brief Copy a message_digest_context. * \param other The other instance. */ message_digest_context(const message_digest_context& other) { EVP_MD_CTX_init(&m_ctx); copy(other); } /** * \brief Destroy a message_digest_context. * * Calls EVP_MD_CTX_cleanup() on the internal EVP_MD_CTX. */ ~message_digest_context() { EVP_MD_CTX_cleanup(&m_ctx); } /** * \brief Assign a message_digest_context to this instance. * \param other The other instance. * \return The current modified instance. */ message_digest_context& operator=(const message_digest_context& other) { if (&other != this) { copy(other); } return *this; } /** * \brief Initialize the message_digest_context. * \param algorithm The message digest algorithm to use. * \param impl The engine to use. Default is NULL which indicates that no engine should be used. * * The list of the available hash methods depends on the version of OpenSSL and can be found on the man page of EVP_DigestInit(). */ void initialize(const message_digest_algorithm& algorithm, ENGINE* impl = NULL); /** * \brief Initialize the message_digest_context for signing. * \param algorithm The message digest algorithm to use. * \param impl The engine to use. Default is NULL which indicates that no engine should be used. * * The list of the available hash methods depends on the version of OpenSSL and can be found on the man page of EVP_DigestInit(). */ void sign_initialize(const message_digest_algorithm& algorithm, ENGINE* impl = NULL); /** * \brief Initialize the message_digest_context for signature verification. * \param algorithm The message digest algorithm to use. * \param impl The engine to use. Default is NULL which indicates that no engine should be used. * * The list of the available hash methods depends on the version of OpenSSL and can be found on the man page of EVP_DigestInit(). */ void verify_initialize(const message_digest_algorithm& algorithm, ENGINE* impl = NULL); /** * \brief Initialize the message_digest_context for digest signing. * \param algorithm The message digest algorithm to use. * \param key The pkey to use. * \param pctx If not NULL, *pctx will point to the signing operation context. * \param impl The engine to use. Default is NULL which indicates that no engine should be used. * * The list of the available hash methods depends on the version of OpenSSL and can be found on the man page of EVP_DigestInit(). */ void digest_sign_initialize(const message_digest_algorithm& algorithm, const pkey::pkey& key, EVP_PKEY_CTX** pctx = NULL, ENGINE* impl = NULL); /** * \brief Initialize the message_digest_context for digest signature verification. * \param algorithm The message digest algorithm to use. * \param key The pkey to use. * \param pctx If not NULL, *pctx will point to the signing operation context. * \param impl The engine to use. Default is NULL which indicates that no engine should be used. * * The list of the available hash methods depends on the version of OpenSSL and can be found on the man page of EVP_DigestInit(). */ void digest_verify_initialize(const message_digest_algorithm& algorithm, const pkey::pkey& key, EVP_PKEY_CTX** pctx = NULL, ENGINE* impl = NULL); /** * \brief Update the message_digest_context with some data. * \param data The data buffer. * \param len The data length. */ void update(const void* data, size_t len); /** * \brief Update the message_digest_context with some data. * \param data The data buffer. * \param len The data length. */ void sign_update(const void* data, size_t len); /** * \brief Update the message_digest_context with some data. * \param data The data buffer. * \param len The data length. */ void verify_update(const void* data, size_t len); /** * \brief Update the message_digest_context with some data. * \param data The data buffer. * \param len The data length. */ void digest_sign_update(const void* data, size_t len); /** * \brief Update the message_digest_context with some data. * \param data The data buffer. * \param len The data length. */ void digest_verify_update(const void* data, size_t len); /** * \brief Update the message_digest_context with some data. * \param buf The data buffer. */ void update(const buffer& buf); /** * \brief Update the message_digest_context with some data. * \param buf The data buffer. */ void sign_update(const buffer& buf); /** * \brief Update the message_digest_context with some data. * \param buf The data buffer. */ void verify_update(const buffer& buf); /** * \brief Update the message_digest_context with some data. * \param buf The data buffer. */ void digest_sign_update(const buffer& buf); /** * \brief Update the message_digest_context with some data. * \param buf The data buffer. */ void digest_verify_update(const buffer& buf); /** * \brief Finalize the message_digest_context and get the resulting buffer. * \param md The resulting buffer. Cannot be NULL. * \param md_len The length of md. * \return The number of bytes written or 0 on failure. * * After a call to finalize() no more call to update() can be made unless initialize() is called again first. */ size_t finalize(void* md, size_t md_len); /** * \brief Finalize the message_digest_context and get the resulting buffer. * \return The resulting buffer. * * After a call to finalize() no more call to update() can be made unless initialize() is called again first. */ buffer finalize(); /** * \brief Finalize the message_digest_context and get the resulting signature. * \param sig The resulting signature. Cannot be NULL. Must be at least pkey->size() bytes long. * \param sig_len The length of sig. * \param pkey The private pkey to use to generate the signature. * \return The number of bytes written. * * After a call to sign_finalize() no more call to sign_update() can be made unless sign_initialize() is called again first. */ size_t sign_finalize(void* sig, size_t sig_len, pkey::pkey& pkey); /** * \brief Finalize the message_digest_context and get the resulting signature. * \param pkey The pkey to use to generate the signature. * \return The resulting signature. * * After a call to sign_finalize() no more call to sign_update() can be made unless sign_initialize() is called again first. */ buffer sign_finalize(pkey::pkey& pkey); /** * \brief Finalize the message_digest_context and compare its resulting signature to the specified signature. * \param sig The signature to compare to. Cannot be NULL. * \param sig_len The length of sig. * \param pkey The public pkey to use to verify the signature. * \return true if the signature matches, false otherwise. * * After a call to verify_finalize() no more call to verify_update() can be made unless verify_initialize() is called again first. */ bool verify_finalize(const void* sig, size_t sig_len, pkey::pkey& pkey); /** * \brief Finalize the message_digest_context and compare its resulting signature to the specified signature. * \param sig The signature to compare to. * \param pkey The public pkey to use to verify the signature. * \return true if the signature matches, false otherwise. * * After a call to verify_finalize() no more call to verify_update() can be made unless verify_initialize() is called again first. */ bool verify_finalize(const buffer& sig, pkey::pkey& pkey); /** * \brief Finalize the message_digest_context and get the resulting signature. * \param sig The resulting signature. If NULL, the required size will be returned. * \param sig_len The length of sig. * \return The number of bytes written. * * After a call to sign_finalize() no more call to sign_update() can be made unless sign_initialize() is called again first. */ size_t digest_sign_finalize(void* sig, size_t sig_len); /** * \brief Finalize the message_digest_context and get the resulting signature. * \return The resulting signature. * * After a call to sign_finalize() no more call to sign_update() can be made unless sign_initialize() is called again first. */ buffer digest_sign_finalize(); /** * \brief Finalize the message_digest_context and compare its resulting signature to the specified signature. * \param sig The signature to compare to. Cannot be NULL. * \param sig_len The length of sig. * \return true if the signature matches, false otherwise. * * After a call to digest_verify_finalize() no more call to digest_verify_update() can be made unless digest_verify_initialize() is called again first. */ bool digest_verify_finalize(const void* sig, size_t sig_len); /** * \brief Finalize the message_digest_context and compare its resulting signature to the specified signature. * \param sig The signature to compare to. * \return true if the signature matches, false otherwise. * * After a call to digest_verify_finalize() no more call to digest_verify_update() can be made unless digest_verify_initialize() is called again first. */ bool digest_verify_finalize(const buffer& sig); /** * \brief Copy an existing message_digest_context, including its current state. * \param ctx A message_digest_context to copy. * * This is useful if large amounts of data are to be hashed which only differ in the last few bytes. */ void copy(const message_digest_context& ctx); /** * \brief Set the flags on the message digest context. * \param flags The flags to set. */ void set_flags(int flags); /** * \brief Get the underlying context. * \return The underlying context. * \warning This method is provided for compatibility issues only. Its use is greatly discouraged. */ const EVP_MD_CTX& raw() const; /** * \brief Get the underlying context. * \return The underlying context. * \warning This method is provided for compatibility issues only. Its use is greatly discouraged. */ EVP_MD_CTX& raw(); /** * \brief Get the associated message digest algorithm. * \return The associated message digest algorithm. If no call to initialize was done, the behavior is undefined. */ message_digest_algorithm algorithm() const; private: EVP_MD_CTX m_ctx; }; inline void message_digest_context::initialize(const message_digest_algorithm& _algorithm, ENGINE* impl) { throw_error_if_not(EVP_DigestInit_ex(&m_ctx, _algorithm.raw(), impl) == 1); } inline void message_digest_context::sign_initialize(const message_digest_algorithm& _algorithm, ENGINE* impl) { throw_error_if_not(EVP_SignInit_ex(&m_ctx, _algorithm.raw(), impl) == 1); } inline void message_digest_context::verify_initialize(const message_digest_algorithm& _algorithm, ENGINE* impl) { throw_error_if_not(EVP_VerifyInit_ex(&m_ctx, _algorithm.raw(), impl) == 1); } inline void message_digest_context::digest_sign_initialize(const message_digest_algorithm& _algorithm, const pkey::pkey& key, EVP_PKEY_CTX** pctx, ENGINE* impl) { throw_error_if_not(EVP_DigestSignInit(&m_ctx, pctx, _algorithm.raw(), impl, const_cast(key.raw())) == 1); } inline void message_digest_context::digest_verify_initialize(const message_digest_algorithm& _algorithm, const pkey::pkey& key, EVP_PKEY_CTX** pctx, ENGINE* impl) { throw_error_if_not(EVP_DigestVerifyInit(&m_ctx, pctx, _algorithm.raw(), impl, const_cast(key.raw())) == 1); } inline void message_digest_context::update(const void* data, size_t len) { throw_error_if_not(EVP_DigestUpdate(&m_ctx, data, len) != 0); } inline void message_digest_context::sign_update(const void* data, size_t len) { throw_error_if_not(EVP_SignUpdate(&m_ctx, data, len) != 0); } inline void message_digest_context::verify_update(const void* data, size_t len) { throw_error_if_not(EVP_VerifyUpdate(&m_ctx, data, len) != 0); } inline void message_digest_context::digest_sign_update(const void* data, size_t len) { throw_error_if_not(EVP_DigestSignUpdate(&m_ctx, data, len) != 0); } inline void message_digest_context::digest_verify_update(const void* data, size_t len) { throw_error_if_not(EVP_DigestVerifyUpdate(&m_ctx, data, len) != 0); } inline void message_digest_context::update(const buffer& buf) { update(buffer_cast(buf), buffer_size(buf)); } inline void message_digest_context::sign_update(const buffer& buf) { sign_update(buffer_cast(buf), buffer_size(buf)); } inline void message_digest_context::verify_update(const buffer& buf) { verify_update(buffer_cast(buf), buffer_size(buf)); } inline void message_digest_context::digest_sign_update(const buffer& buf) { digest_sign_update(buffer_cast(buf), buffer_size(buf)); } inline void message_digest_context::digest_verify_update(const buffer& buf) { digest_verify_update(buffer_cast(buf), buffer_size(buf)); } inline buffer message_digest_context::finalize() { buffer result(algorithm().result_size()); finalize(buffer_cast(result), buffer_size(result)); return result; } inline buffer message_digest_context::sign_finalize(pkey::pkey& pkey) { buffer result(pkey.size()); sign_finalize(buffer_cast(result), buffer_size(result), pkey); return result; } inline bool message_digest_context::verify_finalize(const buffer& sig, pkey::pkey& pkey) { return verify_finalize(buffer_cast(sig), buffer_size(sig), pkey); } inline buffer message_digest_context::digest_sign_finalize() { buffer result(digest_sign_finalize(nullptr, 0)); digest_sign_finalize(buffer_cast(result), buffer_size(result)); return result; } inline bool message_digest_context::digest_verify_finalize(const buffer& sig) { return digest_verify_finalize(buffer_cast(sig), buffer_size(sig)); } inline void message_digest_context::copy(const message_digest_context& ctx) { throw_error_if_not(EVP_MD_CTX_copy_ex(&m_ctx, &ctx.m_ctx) != 0); } inline void message_digest_context::set_flags(int flags) { EVP_MD_CTX_set_flags(&m_ctx, flags); } inline const EVP_MD_CTX& message_digest_context::raw() const { return m_ctx; } inline EVP_MD_CTX& message_digest_context::raw() { return m_ctx; } inline message_digest_algorithm message_digest_context::algorithm() const { return message_digest_algorithm(EVP_MD_CTX_md(&m_ctx)); } } } #endif /* CRYPTOPLUS_HASH_MESSAGE_DIGEST_CONTEXT_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/hash/pbkdf2.hpp000066400000000000000000000112741252300335000246150ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file pbkdf2.hpp * \author Julien KAUFFMANN * \brief PBKDF2 helper functions. */ #ifndef CRYPTOPLUS_HASH_PBKDF2_HPP #define CRYPTOPLUS_HASH_PBKDF2_HPP #include "../buffer.hpp" #include "../error/helpers.hpp" #include "message_digest.hpp" #include "message_digest_algorithm.hpp" #include namespace cryptoplus { namespace hash { /** * \brief Generate a buffer from a password and a salt, using PBKDF2. * \param password The password to generate a digest from. * \param passwordlen The password size. * \param salt The salt. * \param saltlen The salt len. * \param outbuf The PBKDF2 resulting buffer. * \param outbuflen The resulting buffer length. Optimal value is the size of the digest for the specified hash method. See cryptoplus::hash::message_digest_size(). * \param algorithm The message digest algorithm to use. * \param iter The iteration count. Default is 1000. The more iterations you use, the securer (and the slower) the function becomes. * \return The count of bytes written. Should be outbuflen. * \warning This function is slow by design. * * The list of the available message digest algorithms depends on the version of OpenSSL and can be found on the man page of EVP_DigestInit(). * * Some versions of OpenSSL only provide SHA1 as a hash method. In this case, pbkdf2() will throw an std::invalid_argument exception. */ size_t pbkdf2(const void* password, size_t passwordlen, const void* salt, size_t saltlen, void* outbuf, size_t outbuflen, const message_digest_algorithm& algorithm, unsigned int iter = 1000); /** * \brief Generate a buffer from a password and a salt, using PBKDF2. * \param password The password to generate a digest from. * \param passwordlen The password size. * \param salt The salt. * \param saltlen The salt len. * \param algorithm The message digest algorithm to use. * \param iter The iteration count. Default is 1000. The more iterations you use, the securer (and the slower) the function becomes. * \return The generated buffer. * \warning This function is slow by design. * * The list of the available message digest algorithms depends on the version of OpenSSL and can be found on the man page of EVP_DigestInit(). * * Some versions of OpenSSL only provide SHA1 as a hash method. In this case, pbkdf2() will throw an std::invalid_argument exception. */ buffer pbkdf2(const void* password, size_t passwordlen, const void* salt, size_t saltlen, const message_digest_algorithm& algorithm, unsigned int iter = 1000); inline buffer pbkdf2(const void* password, size_t passwordlen, const void* salt, size_t saltlen, const message_digest_algorithm& algorithm, unsigned int iter) { buffer result(algorithm.result_size()); pbkdf2(password, passwordlen, salt, saltlen, buffer_cast(result), buffer_size(result), algorithm, iter); return result; } } } #endif /* CRYPTOPLUS_HASH_PBKDF2_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/initializer.hpp000066400000000000000000000047611252300335000250500ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file initializer.hpp * \author Julien KAUFFMANN * \brief An initializer template. */ #ifndef CRYPTOPLUS_INITIALIZER_HPP #define CRYPTOPLUS_INITIALIZER_HPP #include namespace cryptoplus { /** * \brief An initializer template. * * This initializer template provides a RAII method of initializing modules. */ template class initializer : public boost::noncopyable { public: /** * \brief Create the initializer and call initialize. */ initializer() { initialize(); } /** * \brief Destroy the initializer and call cleanup. */ ~initializer() { cleanup(); } }; } #endif /* CRYPTOPLUS_INITIALIZER_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/nullable.hpp000066400000000000000000000107111252300335000243130ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file nullable.hpp * \author Julien KAUFFMANN * \brief A nullable interface. * * See http://www.artima.com/cppsource/safebool.html for more explanations. */ #ifndef CRYPTOPLUS_NULLABLE_HPP #define CRYPTOPLUS_NULLABLE_HPP namespace cryptoplus { /** * \brief The base nullable class. */ class nullable_base { protected: /** * \brief The boolean type. */ typedef void (nullable_base::*bool_type)() const; /** * \brief A dummy function. */ void this_type_does_not_support_comparisons() const {} /** * \brief Default constructor. */ nullable_base() {} /** * \brief Protected copy constructor. */ nullable_base(const nullable_base&) {} /** * \brief Protected assignation operator. */ nullable_base& operator=(const nullable_base&) { return *this; } /** * \brief Default destructor. */ ~nullable_base() {} }; /** * \brief A templated version of the nullable class. */ template class nullable : public nullable_base { public: /** * \brief The bool_type conversion operator. */ operator bool_type() const { return (static_cast(this))->boolean_test() ? &nullable::this_type_does_not_support_comparisons : 0; } /** * \brief Explicit test. * \return true if the instance is null. */ bool is_null() const { return !static_cast(this)->boolean_test(); } protected: ~nullable() {} }; /** * \brief A specialized version of the template nullable class. */ template <> class nullable : public nullable_base { public: /** * \brief The bool_type conversion operator. */ operator bool_type() const { return (boolean_test() == true) ? &nullable::this_type_does_not_support_comparisons : 0; } /** * \brief Explicit test. * \return true if the instance is null. */ bool is_null() const { return boolean_test(); } protected: /** * \brief The boolean_test() method. * \return true or false, it's up to you. * * Must be defined in the subclasses to determine booleaness of the derived type. * */ virtual bool boolean_test() const = 0; virtual ~nullable() {} }; /** * \brief Compare two nullables, in a boolean context. * \return false, always. */ template inline bool operator==(const nullable&, const nullable&) { return false; } /** * \brief Compare two nullables, in a boolean context. * \return false, always. */ template bool operator!=(const nullable&, const nullable&) { return false; } } #endif /* CRYPTOPLUS_NULLABLE_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/os.hpp000066400000000000000000000070331252300335000231410ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file os.hpp * \brief Macro to know the operating system. * * - UNIX: Unix-like operating system.\n * - LINUX: Linux operating system.\n * - SUNOS: Sun operating system.\n * - MACINTOSH: Macintosh or MacOS operating system.\n * - WINDOWS: MS Windows operating system.\n * - MSDOS: MS DOS operating system.\n * * \author Julien KAUFFMANN * \author Sebastien VINCENT */ #ifndef CRYPTOPLUS_OS_HPP #define CRYPTOPLUS_OS_HPP /* * Extract the "MACINTOSH" flag from the compiler. */ #if defined(__APPLE__) #define UNIX #define MACINTOSH #endif /* * Extract the "SUNOS" flag from the compiler. */ #if defined(sun) #define UNIX #define SUNOS #endif /* * Extract the "UNIX" flag from compiler. */ #ifdef __linux__ #define UNIX #define LINUX #endif /* * Extract the "BSD" flag from compiler. */ #if defined(BSD) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) #define BSD #define UNIX #endif /* * Extract the "MSDOS" flag from the compiler. */ #ifdef __MSDOS__ #define MSDOS #undef UNIX #endif /* * Extract the "WINDOWS" flag from the compiler. */ #if defined(_Windows) || defined(__WINDOWS__) || \ defined(__WIN32__) || defined(WIN32) || \ defined(__WINNT__) || defined(__NT__) || \ defined(_WIN32) || defined(_WIN64) #define WINDOWS #ifdef _MSC_VER #define MSV #if defined(DEBUG) || defined(DEBUGTRACE) #ifdef NDEBUG #undef NDEBUG #endif #else #ifndef NDEBUG #define NDEBUG #endif #endif #else #undef MSV #endif #undef UNIX #undef MSDOS #endif /* * Remove the WINDOWS flag when using MACINTOSH. */ #ifdef MACINTOSH #undef WINDOWS #endif /* * Assume UNIX if not Windows, Macintosh or MSDOS. */ #if !defined(WINDOWS) && !defined(MACINTOSH) && !defined(MSDOS) #define UNIX #endif #endif /* CRYPTOPLUS_OS_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/pkey/000077500000000000000000000000001252300335000227545ustar00rootroot00000000000000freelan-2.0/libs/cryptoplus/include/cryptoplus/pkey/dh_key.hpp000066400000000000000000000265151252300335000247410ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file dh_key.hpp * \author Julien KAUFFMANN * \brief A Diffie-Hellman key class. */ #ifndef CRYPTOPLUS_PKEY_DH_KEY_HPP #define CRYPTOPLUS_PKEY_DH_KEY_HPP #include "../pointer_wrapper.hpp" #include "../buffer.hpp" #include "../error/helpers.hpp" #include "../bio/bio_ptr.hpp" #include "../bn/bignum.hpp" #include "../file.hpp" #include #include #include namespace cryptoplus { namespace pkey { /** * \brief A Diffie-Hellman helper class. * * The dh_key class represents a DH structure (with or without a private compound). * dh_key is a low level structure that offers no mean to know what components are set up in the underlying DH structure. It is up to the caller to perform only allowed operations on the dh_key instance. * * A dh_key instance has the same semantic as a DH* pointer, thus two copies of the same instance share the same underlying pointer. */ class dh_key : public pointer_wrapper { public: /** * \brief A generate callback type. */ typedef void (*generate_callback_type)(int, int, void*); /** * \brief A PEM passphrase callback type. */ typedef int (*pem_passphrase_callback_type)(char*, int, int, void*); /** * \brief Create a new dh_key. * \return The dh_key. * * If allocation fails, an exception is thrown. */ static dh_key create(); /** * \brief Take ownership of a specified DH pointer. * \param ptr The pointer. Cannot be NULL. * \return An dh_key. */ static dh_key take_ownership(pointer ptr); /** * \brief Create a new DH with the specified parameters. * \param prime_len The length, in bits, of the safe prime number to be generated. * \param generator A small number greater than 1. Typically 2 or 5. * \param callback A callback that will get notified about the key generation, as specified in the documentation of DH_generate_parameters(3). callback might be NULL (the default). * \param callback_arg An argument that will be passed to callback, if needed. * \return The dh_key. */ static dh_key generate_parameters(int prime_len, int generator, generate_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load DH parameters from a BIO. * \param bio The BIO. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The dsa_key. */ static dh_key from_parameters(bio::bio_ptr bio, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load DH parameters from a file. * \param file The file. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The dsa_key. */ static dh_key from_parameters(file file, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load DH parameters from a public key buffer. * \param buf The buffer. * \param buf_len The length of buf. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The dsa_key. */ static dh_key from_parameters(const void* buf, size_t buf_len, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Create a new empty dh_key. */ dh_key(); /** * \brief Create an dh_key by *NOT* taking ownership of an existing DH pointer. * \param ptr The DH pointer. * \warning The caller is still responsible for freeing the memory. */ dh_key(pointer ptr); /** * \brief Write the DH parameters to a BIO. * \param bio The BIO. */ void write_parameters(bio::bio_ptr bio) const; /** * \brief Write the DH parameters to a file. * \param file The file. */ void write_parameters(file file) const; /** * \brief Get the private key component. * \return the private key component. */ bn::bignum private_key() const; /** * \brief Get the public key component. * \return the public key component. */ bn::bignum public_key() const; /** * \brief Return the size of a DH signature in bytes. * \return The DH signature size, in bytes. */ size_t size() const; /** * \brief Validates the Diffie-Hellman parameters. * \param codes An integer whose content is updated according to the success or failure of the check operation. For more information, take a look a the DH_generate_parameters(3) man page. * * On failure, an exception is thrown. */ void check(int& codes) const; /** * \brief Performs the first step of a Diffie-Hellman key exchange by generating private and public DH values. * \return *this * * On failure, an exception is thrown. */ dh_key& generate_key(); /** * \brief Performs the first step of a Diffie-Hellman key exchange by generating private and public DH values. * \return *this * * On failure, an exception is thrown. */ const dh_key& generate_key() const; /** * \brief Compute the shared secret from the private DH value in the instance and other party's public value. * \param out The buffer to which the shared secret is written. Must be at least size() bytes long. * \param out_len The length of out. * \param pub_key The other party's public key. * \return The number of bytes written to out. * * On failure, an exception is thrown. */ size_t compute_key(void* out, size_t out_len, bn::bignum pub_key) const; /** * \brief Compute the shared secret from the private DH value in the instance and other party's public value. * \param pub_key The other party's public key. * \return The shared secret. * * On failure, an exception is thrown. */ buffer compute_key(bn::bignum pub_key) const; /** * \brief Print the DH parameters in a human-readable hexadecimal form to a specified BIO. * \param bio The BIO to use. */ void print_parameters(bio::bio_ptr bio) const; /** * \brief Print the DH parameters in a human-readable hexadecimal form to a specified file. * \param file The file. */ void print_parameters(file file) const; private: explicit dh_key(pointer _ptr, deleter_type _del); }; /** * \brief Compare two dh_key instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two dh_key instances share the same underlying pointer. */ bool operator==(const dh_key& lhs, const dh_key& rhs); /** * \brief Compare two dh_key instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two dh_key instances do not share the same underlying pointer. */ bool operator!=(const dh_key& lhs, const dh_key& rhs); inline dh_key dh_key::create() { return take_ownership(DH_new()); } inline dh_key dh_key::from_parameters(bio::bio_ptr bio, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_bio_DHparams(bio.raw(), NULL, callback, callback_arg)); } inline dh_key dh_key::from_parameters(file _file, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_DHparams(_file.raw(), NULL, callback, callback_arg)); } inline dh_key::dh_key() { } inline dh_key::dh_key(pointer _ptr) : pointer_wrapper(_ptr, null_deleter) { } inline void dh_key::write_parameters(bio::bio_ptr bio) const { throw_error_if_not(PEM_write_bio_DHparams(bio.raw(), ptr().get()) != 0); } inline void dh_key::write_parameters(file _file) const { throw_error_if_not(PEM_write_DHparams(_file.raw(), ptr().get()) != 0); } inline bn::bignum dh_key::private_key() const { return raw()->priv_key; } inline bn::bignum dh_key::public_key() const { return raw()->pub_key; } inline size_t dh_key::size() const { return DH_size(ptr().get()); } inline void dh_key::check(int& codes) const { throw_error_if_not(DH_check(ptr().get(), &codes) != 0); } inline dh_key& dh_key::generate_key() { throw_error_if_not(DH_generate_key(ptr().get()) != 0); return *this; } inline const dh_key& dh_key::generate_key() const { throw_error_if_not(DH_generate_key(ptr().get()) != 0); return *this; } inline buffer dh_key::compute_key(bn::bignum pub_key) const { buffer result(size()); result.data().resize(compute_key(buffer_cast(result), buffer_size(result), pub_key.raw())); return result; } inline void dh_key::print_parameters(bio::bio_ptr bio) const { throw_error_if_not(DHparams_print(bio.raw(), ptr().get()) != 0); } inline void dh_key::print_parameters(file _file) const { throw_error_if_not(DHparams_print_fp(_file.raw(), ptr().get()) != 0); } inline bool operator==(const dh_key& lhs, const dh_key& rhs) { return lhs.raw() == rhs.raw(); } inline bool operator!=(const dh_key& lhs, const dh_key& rhs) { return lhs.raw() != rhs.raw(); } inline dh_key::dh_key(pointer _ptr, deleter_type _del) : pointer_wrapper(_ptr, _del) { } } } #endif /* CRYPTOPLUS_PKEY_DH_KEY_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/pkey/dsa_key.hpp000066400000000000000000000554371252300335000251220ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file dsa_key.hpp * \author Julien KAUFFMANN * \brief A DSA key class. */ #ifndef CRYPTOPLUS_PKEY_DSA_KEY_HPP #define CRYPTOPLUS_PKEY_DSA_KEY_HPP #include "../pointer_wrapper.hpp" #include "../buffer.hpp" #include "../error/helpers.hpp" #include "../bio/bio_ptr.hpp" #include "../file.hpp" #include "dh_key.hpp" #include #include #include namespace cryptoplus { namespace pkey { /** * \brief A DSA key. * * The dsa_key class represents a DSA key (with or without a private compound). * dsa_key is a low level structure that offers no mean to know what components are set up in the underlying DSA structure. It is up to the caller to perform only allowed operations on the dsa_key instance. * * A dsa_key instance has the same semantic as a DSA* pointer, thus two copies of the same instance share the same underlying pointer. */ class dsa_key : public pointer_wrapper { public: /** * \brief A generate callback type. */ typedef void (*generate_callback_type)(int, int, void*); /** * \brief A PEM passphrase callback type. */ typedef int (*pem_passphrase_callback_type)(char*, int, int, void*); /** * \brief Create a new dsa_key. * \return The dsa_key. * * If allocation fails, an exception is thrown. */ static dsa_key create(); /** * \brief Take ownership of a specified ASN1_dsa_key pointer. * \param ptr The pointer. Cannot be NULL. * \return An dsa_key. */ static dsa_key take_ownership(pointer ptr); /** * \brief Create a new DSA key with the specified parameters. * \param bits The length, in bits, of the prime to be generated. Maximum value is 1024. * \param seed The seed to use. Can be NULL. * \param seed_len The length of seed. Can't exceed 20. * \param counter_ret The iteration counter. Can be NULL. * \param h_ret The counter for finding a generator. Can be NULL. * \param callback A callback that will get notified about the key generation, as specified in the documentation of DSA_generate_parameters(3). callback might be NULL (the default). * \param callback_arg An argument that will be passed to callback, if needed. * \param must_take_ownership If set to true (the default), the resulting DSA key will own the underlying DSA pointer. If set to false, the caller is responsible for handling the lifetime of the underlying DSA pointer. Failing to do so will cause memory leaks. * \return The dsa_key. */ static dsa_key generate_parameters(int bits, void* seed, size_t seed_len, int* counter_ret, unsigned long *h_ret, generate_callback_type callback = NULL, void* callback_arg = NULL, bool must_take_ownership = true); /** * \brief Generate a new DSA private key. * \param bits The length, in bits, of the prime to be generated. Maximum value is 1024. * \param seed The seed to use. Can be NULL. * \param seed_len The length of seed. Can't exceed 20. * \param counter_ret The iteration counter. Can be NULL. * \param h_ret The counter for finding a generator. Can be NULL. * \param callback A callback that will get notified about the key generation, as specified in the documentation of DSA_generate_parameters(3). callback might be NULL (the default). * \param callback_arg An argument that will be passed to callback, if needed. * \return The dsa_key. * * generate_private_key() is equivalent to a call to generate_parameters() followed by a call to generate(). */ static dsa_key generate_private_key(int bits, void* seed, size_t seed_len, int* counter_ret, unsigned long *h_ret, generate_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a private DSA key from a BIO. * \param bio The BIO. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The dsa_key. */ static dsa_key from_private_key(bio::bio_ptr bio, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load DSA parameters from a BIO. * \param bio The BIO. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The dsa_key. */ static dsa_key from_parameters(bio::bio_ptr bio, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a certificate public DSA key from a BIO. * \param bio The BIO. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The dsa_key. */ static dsa_key from_certificate_public_key(bio::bio_ptr bio, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a private DSA key from a file. * \param file The file. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The dsa_key. */ static dsa_key from_private_key(file file, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load DSA parameters from a file. * \param file The file. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The dsa_key. */ static dsa_key from_parameters(file file, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a certificate public DSA key from a file. * \param file The file. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The dsa_key. */ static dsa_key from_certificate_public_key(file file, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a DSA key from a private key buffer. * \param buf The buffer. * \param buf_len The length of buf. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The dsa_key. */ static dsa_key from_private_key(const void* buf, size_t buf_len, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load DSA parameters from a public key buffer. * \param buf The buffer. * \param buf_len The length of buf. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The dsa_key. */ static dsa_key from_parameters(const void* buf, size_t buf_len, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a DSA key from a certificate public key buffer. * \param buf The buffer. * \param buf_len The length of buf. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The dsa_key. */ static dsa_key from_certificate_public_key(const void* buf, size_t buf_len, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Create a new empty dsa_key. */ dsa_key(); /** * \brief Create an dsa_key by *NOT* taking ownership of an existing DSA pointer. * \param ptr The DSA pointer. * \warning The caller is still responsible for freeing the memory. */ dsa_key(pointer ptr); /** * \brief Write the private DSA key to a BIO. * \param bio The BIO. * \param algorithm The cipher algorithm to use. * \param passphrase The passphrase to use. * \param passphrase_len The length of passphrase. */ void write_private_key(bio::bio_ptr bio, cipher::cipher_algorithm algorithm, const void* passphrase, size_t passphrase_len) const; /** * \brief Write the private DSA key to a BIO. * \param bio The BIO. * \param algorithm The cipher algorithm to use. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. */ void write_private_key(bio::bio_ptr bio, cipher::cipher_algorithm algorithm, pem_passphrase_callback_type callback, void* callback_arg = NULL) const; /** * \brief Write the DSA parameters to a BIO. * \param bio The BIO. */ void write_parameters(bio::bio_ptr bio) const; /** * \brief Write the certificate public DSA key to a BIO. * \param bio The BIO. */ void write_certificate_public_key(bio::bio_ptr bio) const; /** * \brief Write the private DSA key to a file. * \param file The file. * \param algorithm The cipher algorithm to use. * \param passphrase The passphrase to use. * \param passphrase_len The length of passphrase. */ void write_private_key(file file, cipher::cipher_algorithm algorithm, const void* passphrase, size_t passphrase_len) const; /** * \brief Write the private DSA key to a file. * \param file The file. * \param algorithm The cipher algorithm to use. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. */ void write_private_key(file file, cipher::cipher_algorithm algorithm, pem_passphrase_callback_type callback, void* callback_arg = NULL) const; /** * \brief Write the DSA parameters to a file. * \param file The file. */ void write_parameters(file file) const; /** * \brief Write the certificate public DSA key to a file. * \param file The file. */ void write_certificate_public_key(file file) const; /** * \brief Generate the DSA key, reading its parameters. * \return The current instance. * * On error, an exception is thrown. */ dsa_key& generate(); /** * \brief Generate the DSA key, reading its parameters. * \return The current instance. * * On error, an exception is thrown. */ const dsa_key& generate() const; /** * \brief Return the size of a DSA signature in bytes. * \return The DSA signature size, in bytes. */ size_t size() const; /** * \brief Print the DSA key in a human-readable hexadecimal form to a specified BIO. * \param bio The BIO to use. * \param offset The number of offset spaces to output. */ void print(bio::bio_ptr bio, int offset = 0) const; /** * \brief Print the DSA key in a human-readable hexadecimal form to a specified file. * \param file The file. * \param offset The number of offset spaces to output. */ void print(file file, int offset = 0) const; /** * \brief Print the DSA parameters in a human-readable hexadecimal form to a specified BIO. * \param bio The BIO to use. */ void print_parameters(bio::bio_ptr bio) const; /** * \brief Print the DSA parameters in a human-readable hexadecimal form to a specified file. * \param file The file. */ void print_parameters(file file) const; /** * \brief Extract a public DSA key from a private DSA key. * \return A public DSA key. */ dsa_key to_public_key() const; /** * \brief Sign a message digest. * \param out The buffer to write the signature to. Must be size() bytes long. * \param out_len The length of out. * \param buf The message digest buffer. * \param buf_len The length of buf. * \param type The type parameter is ignored. * \return The number of bytes written to out. * \see verify * * In case of failure, an exception is thrown. */ size_t sign(void* out, size_t out_len, const void* buf, size_t buf_len, int type) const; /** * \brief Sign a message digest. * \param buf The message digest buffer. * \param buf_len The length of buf. * \param type The type parameter is ignored. * \return The signature. * \see verify * * In case of failure, an exception is thrown. */ buffer sign(const void* buf, size_t buf_len, int type) const; /** * \brief Sign a message digest. * \param buf The message digest buffer. * \param type The type parameter is ignored. * \return The signature. * \see verify * * In case of failure, an exception is thrown. */ buffer sign(const buffer& buf, int type) const; /** * \brief Verify a message digest signature, as specified by PCKS #1 v2.0. * \param sign The signature buffer, as generated by sign(). * \param sign_len The length of sign. * \param buf The message digest buffer. * \param buf_len The length of buf. * \param type The type parameter is ignored. * \see sign * * In case of failure, an exception is thrown. */ void verify(const void* sign, size_t sign_len, const void* buf, size_t buf_len, int type) const; /** * \brief Verify a message digest signature, as specified by PCKS #1 v2.0. * \param sign The signature buffer, as generated by sign(). * \param buf The message digest buffer. * \param type The type parameter is ignored. * \see sign * * In case of failure, an exception is thrown. */ void verify(const buffer& sign, const buffer& buf, int type) const; /** * \brief Duplicate DSA parameters and keys as DH parameters and keys. * \return A new DH structure. */ dh_key to_dh_key() const; private: explicit dsa_key(pointer _ptr, deleter_type _del); }; /** * \brief Compare two dsa_key instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two dsa_key instances share the same underlying pointer. */ bool operator==(const dsa_key& lhs, const dsa_key& rhs); /** * \brief Compare two dsa_key instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two dsa_key instances do not share the same underlying pointer. */ bool operator!=(const dsa_key& lhs, const dsa_key& rhs); inline dsa_key dsa_key::create() { return take_ownership(DSA_new()); } inline dsa_key dsa_key::generate_private_key(int bits, void* seed, size_t seed_len, int* counter_ret, unsigned long *h_ret, generate_callback_type callback, void* callback_arg) { return generate_parameters(bits, seed, seed_len, counter_ret, h_ret, callback, callback_arg).generate(); } inline dsa_key dsa_key::from_private_key(bio::bio_ptr bio, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_bio_DSAPrivateKey(bio.raw(), NULL, callback, callback_arg)); } inline dsa_key dsa_key::from_parameters(bio::bio_ptr bio, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_bio_DSAparams(bio.raw(), NULL, callback, callback_arg)); } inline dsa_key dsa_key::from_certificate_public_key(bio::bio_ptr bio, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_bio_DSA_PUBKEY(bio.raw(), NULL, callback, callback_arg)); } inline dsa_key dsa_key::from_private_key(file _file, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_DSAPrivateKey(_file.raw(), NULL, callback, callback_arg)); } inline dsa_key dsa_key::from_parameters(file _file, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_DSAparams(_file.raw(), NULL, callback, callback_arg)); } inline dsa_key dsa_key::from_certificate_public_key(file _file, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_DSA_PUBKEY(_file.raw(), NULL, callback, callback_arg)); } inline dsa_key::dsa_key() { } inline dsa_key::dsa_key(pointer _ptr) : pointer_wrapper(_ptr, null_deleter) { } inline void dsa_key::write_private_key(bio::bio_ptr bio, cipher::cipher_algorithm algorithm, const void* passphrase, size_t passphrase_len) const { throw_error_if_not(PEM_write_bio_DSAPrivateKey(bio.raw(), ptr().get(), algorithm.raw(), static_cast(const_cast(passphrase)), static_cast(passphrase_len), NULL, NULL) != 0); } inline void dsa_key::write_private_key(bio::bio_ptr bio, cipher::cipher_algorithm algorithm, pem_passphrase_callback_type callback, void* callback_arg) const { throw_error_if_not(PEM_write_bio_DSAPrivateKey(bio.raw(), ptr().get(), algorithm.raw(), NULL, 0, callback, callback_arg) != 0); } inline void dsa_key::write_parameters(bio::bio_ptr bio) const { throw_error_if_not(PEM_write_bio_DSAparams(bio.raw(), ptr().get()) != 0); } inline void dsa_key::write_certificate_public_key(bio::bio_ptr bio) const { throw_error_if_not(PEM_write_bio_DSA_PUBKEY(bio.raw(), ptr().get()) != 0); } inline void dsa_key::write_private_key(file _file, cipher::cipher_algorithm algorithm, const void* passphrase, size_t passphrase_len) const { throw_error_if_not(PEM_write_DSAPrivateKey(_file.raw(), ptr().get(), algorithm.raw(), static_cast(const_cast(passphrase)), static_cast(passphrase_len), NULL, NULL) != 0); } inline void dsa_key::write_private_key(file _file, cipher::cipher_algorithm algorithm, pem_passphrase_callback_type callback, void* callback_arg) const { throw_error_if_not(PEM_write_DSAPrivateKey(_file.raw(), ptr().get(), algorithm.raw(), NULL, 0, callback, callback_arg) != 0); } inline void dsa_key::write_parameters(file _file) const { throw_error_if_not(PEM_write_DSAparams(_file.raw(), ptr().get()) != 0); } inline void dsa_key::write_certificate_public_key(file _file) const { throw_error_if_not(PEM_write_DSA_PUBKEY(_file.raw(), ptr().get()) != 0); } inline dsa_key& dsa_key::generate() { throw_error_if_not(DSA_generate_key(ptr().get()) != 0); return *this; } inline const dsa_key& dsa_key::generate() const { throw_error_if_not(DSA_generate_key(ptr().get()) != 0); return *this; } inline size_t dsa_key::size() const { return DSA_size(ptr().get()); } inline void dsa_key::print(bio::bio_ptr bio, int offset) const { throw_error_if_not(DSA_print(bio.raw(), ptr().get(), offset) != 0); } inline void dsa_key::print(file _file, int offset) const { throw_error_if_not(DSA_print_fp(_file.raw(), ptr().get(), offset) != 0); } inline void dsa_key::print_parameters(bio::bio_ptr bio) const { throw_error_if_not(DSAparams_print(bio.raw(), ptr().get()) != 0); } inline void dsa_key::print_parameters(file _file) const { throw_error_if_not(DSAparams_print_fp(_file.raw(), ptr().get()) != 0); } inline buffer dsa_key::sign(const void* buf, size_t buf_len, int type) const { buffer result(size()); result.data().resize(sign(buffer_cast(result), buffer_size(result), buf, buf_len, type)); return result; } inline buffer dsa_key::sign(const buffer& buf, int type) const { return sign(buffer_cast(buf), buffer_size(buf), type); } inline void dsa_key::verify(const void* _sign, size_t sign_len, const void* buf, size_t buf_len, int type) const { throw_error_if_not(DSA_verify(type, static_cast(buf), static_cast(buf_len), static_cast(_sign), static_cast(sign_len), ptr().get()) != 0); } inline void dsa_key::verify(const buffer& _sign, const buffer& buf, int type) const { verify(buffer_cast(_sign), buffer_size(_sign), buffer_cast(buf), buffer_size(buf), type); } inline dh_key dsa_key::to_dh_key() const { return dh_key::take_ownership(DSA_dup_DH(ptr().get())); } inline dsa_key::dsa_key(pointer _ptr, deleter_type _del) : pointer_wrapper(_ptr, _del) { } inline bool operator==(const dsa_key& lhs, const dsa_key& rhs) { return lhs.raw() == rhs.raw(); } inline bool operator!=(const dsa_key& lhs, const dsa_key& rhs) { return lhs.raw() != rhs.raw(); } } } #endif /* CRYPTOPLUS_PKEY_DSA_KEY_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/pkey/ecdhe.hpp000066400000000000000000000067721252300335000245510ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ecdhe.hpp * \author Julien KAUFFMANN * \brief An Elliptical Curve Diffie-Hellman Ephemeral context class. */ #ifndef CRYPTOPLUS_PKEY_ECDHE_HPP #define CRYPTOPLUS_PKEY_ECDHE_HPP #include "pkey.hpp" #include "../buffer.hpp" #include "../error/helpers.hpp" #include #include #include #include #include namespace cryptoplus { namespace pkey { class ecdhe_context { public: /** * \brief Create a new context with the specified elliptic curve NID. * * See for a list of possible NIDs. */ explicit ecdhe_context(int nid); ecdhe_context(const ecdhe_context&) = delete; ecdhe_context& operator=(const ecdhe_context&) = delete; /** * \brief Generate new keys for the context. */ void generate_keys(); /** * \brief Get the internal public key, generating one if none exists yet. * \return The public key. */ buffer get_public_key(); /** * \brief Derive the secret key from a given peer public key. * \param peer_key The peer key buffer. * \param peer_key_len The length of the peer key buffer. * \return The buffer. */ buffer derive_secret_key(const void* peer_key, size_t peer_key_len); /** * \brief Derive the secret key from a given peer public key. * \param peer_key The peer key buffer. * \return The buffer. */ template buffer derive_secret_key(const BufferType& peer_key) { return derive_secret_key(buffer_cast(peer_key), buffer_size(peer_key)); } private: int m_nid; pkey m_private_key; }; } } #endif /* CRYPTOPLUS_PKEY_ECDHE_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/pkey/pkey.hpp000066400000000000000000000561541252300335000244500ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file pkey.hpp * \author Julien KAUFFMANN * \brief An EVP_PKEY class. */ #ifndef CRYPTOPLUS_PKEY_PKEY_HPP #define CRYPTOPLUS_PKEY_PKEY_HPP #include "../pointer_wrapper.hpp" #include "../error/helpers.hpp" #include "../file.hpp" #include "rsa_key.hpp" #include "dsa_key.hpp" #include "dh_key.hpp" namespace cryptoplus { namespace pkey { /** * \brief A EVP_PKEY. * * The pkey class represents an EVP_PKEY structure. * pkey is a low level structure. It allows you to check the type of the contained key but no further check is done when it comes to convert the pkey to one of the native types (aka. rsa_key, dsa_key, dh_key). * * A pkey instance has the same semantic as a EVP_PKEY* pointer, thus two copies of the same instance share the same underlying pointer. */ class pkey : public pointer_wrapper { public: /** * \brief A generate callback type. */ typedef void (*generate_callback_type)(int, int, void*); /** * \brief A PEM passphrase callback type. */ typedef int (*pem_passphrase_callback_type)(char*, int, int, void*); /** * \brief Create a new pkey. * \return The pkey. * * If allocation fails, an exception is thrown. */ static pkey create(); /** * \brief Take ownership of a specified EVP_PKEY pointer. * \param ptr The pointer. Cannot be NULL. * \return An pkey. */ static pkey take_ownership(pointer ptr); /** * \brief Create a pkey from a RSA key. * \param key The RSA key. * \return The pkey. */ static pkey from_rsa_key(rsa_key key); /** * \brief Create a pkey from a DSA key. * \param key The DSA key. * \return The pkey. */ static pkey from_dsa_key(dsa_key key); /** * \brief Create a pkey from a DH key. * \param key The DH key. * \return The pkey. */ static pkey from_dh_key(dh_key key); /** * \brief Load a private EVP_PKEY key from a BIO. * \param bio The BIO. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The pkey. */ static pkey from_private_key(bio::bio_ptr bio, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a certificate public EVP_PKEY key from a BIO. * \param bio The BIO. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The pkey. */ static pkey from_certificate_public_key(bio::bio_ptr bio, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a private EVP_PKEY key from a file. * \param file The file. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The pkey. */ static pkey from_private_key(file file, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a certificate public EVP_PKEY key from a file. * \param file The file. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The pkey. */ static pkey from_certificate_public_key(file file, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a EVP_PKEY key from a private key buffer. * \param buf The buffer. * \param buf_len The length of buf. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The pkey. */ static pkey from_private_key(const void* buf, size_t buf_len, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a EVP_PKEY key from a certificate public key buffer. * \param buf The buffer. * \param buf_len The length of buf. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The pkey. */ static pkey from_certificate_public_key(const void* buf, size_t buf_len, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Create a new EVP_PKEY from a HMAC secret key. * \brief buf Is a buffer that contains the secret key. * \brief buf_len Is the length of buf. * \brief engine Is the engine to use, if any. */ static pkey from_hmac_key(const void* buf, size_t buf_len, ENGINE* engine = NULL); /** * \brief Create a new empty pkey. */ pkey(); /** * \brief Create an pkey by *NOT* taking ownership of an existing EVP_PKEY pointer. * \param ptr The EVP_PKEY pointer. * \warning The caller is still responsible for freeing the memory. */ pkey(pointer ptr); /** * \brief Set the associated RSA key. * \param rsa The RSA key. */ void set_rsa_key(rsa_key rsa) const; /** * \brief Get the associated RSA key. * \return The RSA key. * \warning If no key was set, an exception is thrown. */ rsa_key get_rsa_key() const; /** * \brief Take ownership of a RSA key. * \param rsa The RSA key. */ void assign_rsa_key(RSA* rsa) const; /** * \brief Set the associated DSA key. * \param dsa The DSA key. */ void set_dsa_key(dsa_key dsa) const; /** * \brief Get the associated DSA key. * \return The DSA key. * \warning If no key was set, an exception is thrown. */ dsa_key get_dsa_key() const; /** * \brief Take ownership of a DSA key. * \param dsa The DSA key. */ void assign_dsa_key(DSA* dsa) const; /** * \brief Set the associated DH key. * \param dh The DH key. */ void set_dh_key(dh_key dh) const; /** * \brief Get the associated DH key. * \return The DH key. * \warning If no key was set, an exception is thrown. */ dh_key get_dh_key() const; /** * \brief Take ownership of a DH key. * \param dh The DH key. */ void assign_dh_key(DH* dh) const; /** * \brief Write the private EVP_PKEY key to a BIO. * \param bio The BIO. * \param algorithm The cipher algorithm to use. * \param passphrase The passphrase to use. * \param passphrase_len The length of passphrase. */ void write_private_key(bio::bio_ptr bio, cipher::cipher_algorithm algorithm, const void* passphrase, size_t passphrase_len) const; /** * \brief Write the private EVP_PKEY key to a BIO. * \param bio The BIO. * \param algorithm The cipher algorithm to use. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. */ void write_private_key(bio::bio_ptr bio, cipher::cipher_algorithm algorithm, pem_passphrase_callback_type callback, void* callback_arg = NULL) const; /** * \brief Write the private EVP_PKEY key to a BIO according to PKCS8. * \param bio The BIO. * \param algorithm The cipher algorithm to use. * \param passphrase The passphrase to use. * \param passphrase_len The length of passphrase. */ void write_private_key_pkcs8(bio::bio_ptr bio, cipher::cipher_algorithm algorithm, const void* passphrase, size_t passphrase_len) const; /** * \brief Write the private EVP_PKEY key to a BIO according to PKCS8. * \param bio The BIO. * \param algorithm The cipher algorithm to use. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. */ void write_private_key_pkcs8(bio::bio_ptr bio, cipher::cipher_algorithm algorithm, pem_passphrase_callback_type callback, void* callback_arg = NULL) const; /** * \brief Write the private EVP_PKEY key to a BIO according to PKCS8, but use PKCS5 or PKCS12 as an encryption algorithm. * \param bio The BIO. * \param nid The nid of the encryption algorithm to use. * \param passphrase The passphrase to use. * \param passphrase_len The length of passphrase. */ void write_private_key_pkcs8_nid(bio::bio_ptr bio, int nid, const void* passphrase, size_t passphrase_len) const; /** * \brief Write the private EVP_PKEY key to a BIO according to PKCS8, but use PKCS5 or PKCS12 as an encryption algorithm. * \param bio The BIO. * \param nid The nid of the encryption algorithm to use. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. */ void write_private_key_pkcs8_nid(bio::bio_ptr bio, int nid, pem_passphrase_callback_type callback, void* callback_arg = NULL) const; /** * \brief Write the certificate public EVP_PKEY key to a BIO. * \param bio The BIO. */ void write_certificate_public_key(bio::bio_ptr bio) const; /** * \brief Write the private EVP_PKEY key to a file. * \param file The file. * \param algorithm The cipher algorithm to use. * \param passphrase The passphrase to use. * \param passphrase_len The length of passphrase. */ void write_private_key(file file, cipher::cipher_algorithm algorithm, const void* passphrase, size_t passphrase_len) const; /** * \brief Write the private EVP_PKEY key to a file. * \param file The file. * \param algorithm The cipher algorithm to use. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. */ void write_private_key(file file, cipher::cipher_algorithm algorithm, pem_passphrase_callback_type callback, void* callback_arg = NULL) const; /** * \brief Write the private EVP_PKEY key to a file according to PKCS8. * \param file The file. * \param algorithm The cipher algorithm to use. * \param passphrase The passphrase to use. * \param passphrase_len The length of passphrase. */ void write_private_key_pkcs8(file file, cipher::cipher_algorithm algorithm, const void* passphrase, size_t passphrase_len) const; /** * \brief Write the private EVP_PKEY key to a file according to PKCS8. * \param file The file. * \param algorithm The cipher algorithm to use. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. */ void write_private_key_pkcs8(file file, cipher::cipher_algorithm algorithm, pem_passphrase_callback_type callback, void* callback_arg = NULL) const; /** * \brief Write the private EVP_PKEY key to a file according to PKCS8, but use PKCS5 or PKCS12 as an encryption algorithm. * \param file The file. * \param nid The nid of the encryption algorithm to use. * \param passphrase The passphrase to use. * \param passphrase_len The length of passphrase. */ void write_private_key_pkcs8_nid(file file, int nid, const void* passphrase, size_t passphrase_len) const; /** * \brief Write the private EVP_PKEY key to a file according to PKCS8, but use PKCS5 or PKCS12 as an encryption algorithm. * \param file The file. * \param nid The nid of the encryption algorithm to use. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. */ void write_private_key_pkcs8_nid(file file, int nid, pem_passphrase_callback_type callback, void* callback_arg = NULL) const; /** * \brief Write the certificate public EVP_PKEY key to a file. * \param file The file. */ void write_certificate_public_key(file file) const; /** * \brief Get the maximum size of a signature. * \return The maximum size of a signature. */ size_t size() const; /** * \brief Get the private key type. * \return The nid of the private key type. */ int type() const; /** * \brief Check if the pkey holds a RSA key. * \return true or false. */ bool is_rsa() const; /** * \brief Check if the pkey holds a DSA key. * \return true or false. */ bool is_dsa() const; /** * \brief Check if the pkey holds a DH key. * \return true or false. */ bool is_dh() const; private: explicit pkey(pointer _ptr, deleter_type _del); }; /** * \brief Compare two pkey instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two pkey instances share the same underlying pointer. */ bool operator==(const pkey& lhs, const pkey& rhs); /** * \brief Compare two pkey instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two pkey instances do not share the same underlying pointer. */ bool operator!=(const pkey& lhs, const pkey& rhs); inline pkey pkey::create() { return take_ownership(EVP_PKEY_new()); } inline pkey pkey::from_rsa_key(rsa_key key) { pkey result = create(); result.set_rsa_key(key); return result; } inline pkey pkey::from_dsa_key(dsa_key key) { pkey result = create(); result.set_dsa_key(key); return result; } inline pkey pkey::from_dh_key(dh_key key) { pkey result = create(); result.set_dh_key(key); return result; } inline pkey pkey::from_private_key(bio::bio_ptr bio, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_bio_PrivateKey(bio.raw(), NULL, callback, callback_arg)); } inline pkey pkey::from_certificate_public_key(bio::bio_ptr bio, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_bio_PUBKEY(bio.raw(), NULL, callback, callback_arg)); } inline pkey pkey::from_hmac_key(const void* buf, size_t buf_len, ENGINE* engine) { return take_ownership(EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, engine, static_cast(buf), static_cast(buf_len))); } inline pkey pkey::from_private_key(file _file, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_PrivateKey(_file.raw(), NULL, callback, callback_arg)); } inline pkey pkey::from_certificate_public_key(file _file, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_PUBKEY(_file.raw(), NULL, callback, callback_arg)); } inline pkey::pkey() { } inline pkey::pkey(pointer _ptr) : pointer_wrapper(_ptr, null_deleter) { } inline void pkey::set_rsa_key(rsa_key rsa) const { throw_error_if_not(EVP_PKEY_set1_RSA(ptr().get(), rsa.raw()) != 0); } inline rsa_key pkey::get_rsa_key() const { return rsa_key::take_ownership(EVP_PKEY_get1_RSA(ptr().get())); } inline void pkey::assign_rsa_key(RSA* rsa) const { throw_error_if_not(EVP_PKEY_assign_RSA(ptr().get(), rsa) != 0); } inline void pkey::set_dsa_key(dsa_key dsa) const { throw_error_if_not(EVP_PKEY_set1_DSA(ptr().get(), dsa.raw()) != 0); } inline dsa_key pkey::get_dsa_key() const { return dsa_key::take_ownership(EVP_PKEY_get1_DSA(ptr().get())); } inline void pkey::assign_dsa_key(DSA* dsa) const { throw_error_if_not(EVP_PKEY_assign_DSA(ptr().get(), dsa) != 0); } inline void pkey::set_dh_key(dh_key dh) const { throw_error_if_not(EVP_PKEY_set1_DH(ptr().get(), dh.raw()) != 0); } inline dh_key pkey::get_dh_key() const { return dh_key::take_ownership(EVP_PKEY_get1_DH(ptr().get())); } inline void pkey::assign_dh_key(DH* dh) const { throw_error_if_not(EVP_PKEY_assign_DH(ptr().get(), dh) != 0); } inline void pkey::write_private_key(bio::bio_ptr bio, cipher::cipher_algorithm algorithm, const void* passphrase, size_t passphrase_len) const { throw_error_if_not(PEM_write_bio_PrivateKey(bio.raw(), ptr().get(), algorithm.raw(), static_cast(const_cast(passphrase)), static_cast(passphrase_len), NULL, NULL) != 0); } inline void pkey::write_private_key(bio::bio_ptr bio, cipher::cipher_algorithm algorithm, pem_passphrase_callback_type callback, void* callback_arg) const { throw_error_if_not(PEM_write_bio_PrivateKey(bio.raw(), ptr().get(), algorithm.raw(), NULL, 0, callback, callback_arg) != 0); } inline void pkey::write_private_key_pkcs8(bio::bio_ptr bio, cipher::cipher_algorithm algorithm, const void* passphrase, size_t passphrase_len) const { throw_error_if_not(PEM_write_bio_PKCS8PrivateKey(bio.raw(), ptr().get(), algorithm.raw(), static_cast(const_cast(passphrase)), static_cast(passphrase_len), NULL, NULL) != 0); } inline void pkey::write_private_key_pkcs8(bio::bio_ptr bio, cipher::cipher_algorithm algorithm, pem_passphrase_callback_type callback, void* callback_arg) const { throw_error_if_not(PEM_write_bio_PKCS8PrivateKey(bio.raw(), ptr().get(), algorithm.raw(), NULL, 0, callback, callback_arg) != 0); } inline void pkey::write_private_key_pkcs8_nid(bio::bio_ptr bio, int nid, const void* passphrase, size_t passphrase_len) const { throw_error_if_not(PEM_write_bio_PKCS8PrivateKey_nid(bio.raw(), ptr().get(), nid, static_cast(const_cast(passphrase)), static_cast(passphrase_len), NULL, NULL) != 0); } inline void pkey::write_private_key_pkcs8_nid(bio::bio_ptr bio, int nid, pem_passphrase_callback_type callback, void* callback_arg) const { throw_error_if_not(PEM_write_bio_PKCS8PrivateKey_nid(bio.raw(), ptr().get(), nid, NULL, 0, callback, callback_arg) != 0); } inline void pkey::write_certificate_public_key(bio::bio_ptr bio) const { throw_error_if_not(PEM_write_bio_PUBKEY(bio.raw(), ptr().get()) != 0); } inline void pkey::write_private_key(file _file, cipher::cipher_algorithm algorithm, const void* passphrase, size_t passphrase_len) const { throw_error_if_not(PEM_write_PrivateKey(_file.raw(), ptr().get(), algorithm.raw(), static_cast(const_cast(passphrase)), static_cast(passphrase_len), NULL, NULL) != 0); } inline void pkey::write_private_key(file _file, cipher::cipher_algorithm algorithm, pem_passphrase_callback_type callback, void* callback_arg) const { throw_error_if_not(PEM_write_PrivateKey(_file.raw(), ptr().get(), algorithm.raw(), NULL, 0, callback, callback_arg) != 0); } inline void pkey::write_private_key_pkcs8(file _file, cipher::cipher_algorithm algorithm, const void* passphrase, size_t passphrase_len) const { throw_error_if_not(PEM_write_PKCS8PrivateKey(_file.raw(), ptr().get(), algorithm.raw(), static_cast(const_cast(passphrase)), static_cast(passphrase_len), NULL, NULL) != 0); } inline void pkey::write_private_key_pkcs8(file _file, cipher::cipher_algorithm algorithm, pem_passphrase_callback_type callback, void* callback_arg) const { throw_error_if_not(PEM_write_PKCS8PrivateKey(_file.raw(), ptr().get(), algorithm.raw(), NULL, 0, callback, callback_arg) != 0); } inline void pkey::write_private_key_pkcs8_nid(file _file, int nid, const void* passphrase, size_t passphrase_len) const { throw_error_if_not(PEM_write_PKCS8PrivateKey_nid(_file.raw(), ptr().get(), nid, static_cast(const_cast(passphrase)), static_cast(passphrase_len), NULL, NULL) != 0); } inline void pkey::write_private_key_pkcs8_nid(file _file, int nid, pem_passphrase_callback_type callback, void* callback_arg) const { throw_error_if_not(PEM_write_PKCS8PrivateKey_nid(_file.raw(), ptr().get(), nid, NULL, 0, callback, callback_arg) != 0); } inline void pkey::write_certificate_public_key(file _file) const { throw_error_if_not(PEM_write_PUBKEY(_file.raw(), ptr().get()) != 0); } inline size_t pkey::size() const { return EVP_PKEY_size(ptr().get()); } inline int pkey::type() const { return EVP_PKEY_type(ptr()->type); } inline bool pkey::is_rsa() const { return (type() == EVP_PKEY_RSA); } inline bool pkey::is_dsa() const { return (type() == EVP_PKEY_DSA); } inline bool pkey::is_dh() const { return (type() == EVP_PKEY_DH); } inline pkey::pkey(pointer _ptr, deleter_type _del) : pointer_wrapper(_ptr, _del) { } inline bool operator==(const pkey& lhs, const pkey& rhs) { return lhs.raw() == rhs.raw(); } inline bool operator!=(const pkey& lhs, const pkey& rhs) { return lhs.raw() != rhs.raw(); } } } #endif /* CRYPTOPLUS_PKEY_PKEY_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/pkey/rsa_key.hpp000066400000000000000000001045431252300335000251310ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file rsa_key.hpp * \author Julien KAUFFMANN * \brief A RSA key class. */ #ifndef CRYPTOPLUS_PKEY_RSA_KEY_HPP #define CRYPTOPLUS_PKEY_RSA_KEY_HPP #include "../pointer_wrapper.hpp" #include "../buffer.hpp" #include "../error/helpers.hpp" #include "../bio/bio_ptr.hpp" #include "../hash/message_digest_algorithm.hpp" #include "../file.hpp" #include #include #include #include namespace cryptoplus { namespace pkey { /** * \brief A RSA key. * * The rsa_key class represents a RSA key (with or without a private compound). * rsa_key is a low level structure that offers no mean to know whether the represented RSA key is a public or private key: it is up to the user to ensure that private key related functions will only get called on rsa_key instances that have private key information. * * A rsa_key instance has the same semantic as a RSA* pointer, thus two copies of the same instance share the same underlying pointer. */ class rsa_key : public pointer_wrapper { public: /** * \brief Register a new index for external data. * \param argl A long argument to pass to the functions. * \param argp A pointer argument to pass to the functions. * \param new_func The function to call when a new store_context is allocated. * \param dup_func The function to call when a store_context is duplicated. * \param free_func The function to call when a store_context is deleted. * \return The new index. */ static int register_index(long argl, void* argp, CRYPTO_EX_new* new_func, CRYPTO_EX_dup* dup_func, CRYPTO_EX_free* free_func); /** * \brief Register a new index for external data. * \return The new index. * * This method is equivalent to store_context::register_index(0, NULL, NULL, NULL, NULL). */ static int register_index(); /** * \brief A generate callback type. */ typedef void (*generate_callback_type)(int, int, void*); /** * \brief A PEM passphrase callback type. */ typedef int (*pem_passphrase_callback_type)(char*, int, int, void*); /** * \brief Create a new rsa_key. * \return The rsa_key. * * If allocation fails, an exception is thrown. */ static rsa_key create(); /** * \brief Take ownership of a specified RSA pointer. * \param ptr The pointer. Cannot be NULL. * \return An rsa_key. */ static rsa_key take_ownership(pointer ptr); /** * \brief Generate a new RSA private key. * \param num The size (in bits) of the modulus. As specified in OpenSSL documentation, key sizes with num < 1024 should be considered insecure. * \param exponent The exponent. Must be an odd number: typically 3, 17 or 65537. * \param callback A callback that will get notified about the key generation, as specified in the documentation of RSA_generate_key(3). callback might be NULL (the default). * \param callback_arg An argument that will be passed to callback, if needed. * \param must_take_ownership If set to true (the default), the resulting RSA key will own the underlying RSA pointer. If set to false, the caller is responsible for handling the lifetime of the underlying RSA pointer. Failing to do so will cause memory leaks. * \return The rsa_key. */ static rsa_key generate_private_key(int num, unsigned long exponent, generate_callback_type callback = NULL, void* callback_arg = NULL, bool must_take_ownership = true); /** * \brief Load a private RSA key from a BIO. * \param bio The BIO. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The rsa_key. */ static rsa_key from_private_key(bio::bio_ptr bio, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a public RSA key from a BIO. * \param bio The BIO. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The rsa_key. */ static rsa_key from_public_key(bio::bio_ptr bio, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a certificate public RSA key from a BIO. * \param bio The BIO. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The rsa_key. */ static rsa_key from_certificate_public_key(bio::bio_ptr bio, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a private RSA key from a file. * \param file The file. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The rsa_key. */ static rsa_key from_private_key(file file, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a public RSA key from a file. * \param file The file. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The rsa_key. */ static rsa_key from_public_key(file file, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a certificate public RSA key from a file. * \param file The file. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The rsa_key. */ static rsa_key from_certificate_public_key(file file, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a RSA key from a private key buffer. * \param buf The buffer. * \param buf_len The length of buf. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The rsa_key. */ static rsa_key from_private_key(const void* buf, size_t buf_len, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a RSA key from a public key buffer. * \param buf The buffer. * \param buf_len The length of buf. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The rsa_key. */ static rsa_key from_public_key(const void* buf, size_t buf_len, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a RSA key from a certificate public key buffer. * \param buf The buffer. * \param buf_len The length of buf. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The rsa_key. */ static rsa_key from_certificate_public_key(const void* buf, size_t buf_len, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Create a new empty rsa_key. */ rsa_key(); /** * \brief Create an rsa_key by *NOT* taking ownership of an existing RSA pointer. * \param ptr The RSA pointer. * \warning The caller is still responsible for freeing the memory. */ rsa_key(pointer ptr); /** * \brief Set the external data. * \param index The index, as returned by register_index(). * \param data The data. */ void set_external_data(int index, void* data); /** * \brief Get the external data. * \param index The index, as returned by register_index(). * \return The data. */ void* get_external_data(int index) const; /** * \brief Write the private RSA key to a BIO. * \param bio The BIO. * \param algorithm The cipher algorithm to use. * \param passphrase The passphrase to use. * \param passphrase_len The length of passphrase. */ void write_private_key(bio::bio_ptr bio, cipher::cipher_algorithm algorithm, const void* passphrase, size_t passphrase_len) const; /** * \brief Write the private RSA key to a BIO. * \param bio The BIO. * \param algorithm The cipher algorithm to use. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. */ void write_private_key(bio::bio_ptr bio, cipher::cipher_algorithm algorithm, pem_passphrase_callback_type callback, void* callback_arg = NULL) const; /** * \brief Write the public RSA key to a BIO. * \param bio The BIO. */ void write_public_key(bio::bio_ptr bio) const; /** * \brief Write the certificate public RSA key to a BIO. * \param bio The BIO. */ void write_certificate_public_key(bio::bio_ptr bio) const; /** * \brief Write the private RSA key to a file. * \param file The file. * \param algorithm The cipher algorithm to use. * \param passphrase The passphrase to use. * \param passphrase_len The length of passphrase. */ void write_private_key(file file, cipher::cipher_algorithm algorithm, const void* passphrase, size_t passphrase_len) const; /** * \brief Write the private RSA key to a file. * \param file The file. * \param algorithm The cipher algorithm to use. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. */ void write_private_key(file file, cipher::cipher_algorithm algorithm, pem_passphrase_callback_type callback, void* callback_arg = NULL) const; /** * \brief Write the public RSA key to a file. * \param file The file. */ void write_public_key(file file) const; /** * \brief Write the certificate public RSA key to a file. * \param file The file. */ void write_certificate_public_key(file file) const; /** * \brief Enable blinding of the rsa_key to prevent timing attacks. * \param ctx A BN_CTX to use or NULL (the default) if one is to be created. * \warning The PRNG must be seeded prior to calling enable_blinding(). * \see disable_blinding */ void enable_blinding(BN_CTX* ctx = NULL) const; /** * \brief Disable blinding on the rsa_key after a previous call to enable_blinding(). * \see enable_blinding */ void disable_blinding() const; /** * \brief Return the RSA modulus size in bytes. * \return The RSA modulus size, in bytes. */ size_t size() const; /** * \brief Check the rsa_key for validity. * \warning The instance must contain both public and private key data. * * If the rsa_key is not valid, an exception is thrown. */ void check() const; /** * \brief Print the RSA key in a human-readable hexadecimal form to a specified BIO. * \param bio The BIO to use. * \param offset The number of offset spaces to output. */ void print(bio::bio_ptr bio, int offset = 0) const; /** * \brief Print the RSA key in a human-readable hexadecimal form to a specified file. * \param file The file. * \param offset The number of offset spaces to output. */ void print(file file, int offset = 0) const; /** * \brief Extract a public RSA key from a private RSA key. * \return A public RSA key. */ rsa_key to_public_key() const; /** * \brief Add a PKCS#1 V2.0 PSS padding. * \param out The destination buffer. * \param out_len The length of out. * \param buf The data to read from. * \param buf_len The length of buf. * \param algorithm The message digest algorithm to use. * \param salt_len The salt_len. Should be -1 or -2. * * The result out buffer should then be encrypted using private_encrypt(). */ void padding_add_PKCS1_PSS(void* out, size_t out_len, const void* buf, size_t buf_len, hash::message_digest_algorithm algorithm, int salt_len) const; /** * \brief Verify a PKCS#1 V2.0 PSS padding. * \param digest The message digest. * \param digest_len The length of digest. * \param buf The decrypted signature, obtained from public_decrypt(). * \param buf_len The length of buf. * \param algorithm The message digest algorithm to use. * \param salt_len The salt_len. Should be -1 or -2. */ void verify_PKCS1_PSS(const void* digest, size_t digest_len, const void* buf, size_t buf_len, hash::message_digest_algorithm algorithm, int salt_len) const; /** * \brief Verify a PKCS#1 V2.0 PSS padding. * \param digest The message digest. * \param buf The decrypted signature, obtained from public_decrypt(). * \param algorithm The message digest algorithm to use. * \param salt_len The salt_len. Should be -1 or -2. */ void verify_PKCS1_PSS(const buffer& digest, const buffer& buf, hash::message_digest_algorithm algorithm, int salt_len) const; /** * \brief Encrypt data bytes using the private key information. * \param out The buffer to write the result to. Must be at least size() bytes long. * \param out_len The length of out. * \param buf The data to encrypt. Must be smaller than size() - 11. * \param buf_len The length of buf. * \param padding The padding mode to use. The list of available padding mode can be found in the man page of RSA_private_encrypt(3). * \return The count of bytes written to out. Should be size(). * \see public_decrypt * * In case of failure, an exception is thrown. */ size_t private_encrypt(void* out, size_t out_len, const void* buf, size_t buf_len, int padding) const; /** * \brief Decrypt data bytes using the public key information. * \param out The buffer to write the result to. Must be at least size() - 11 bytes long. * \param out_len The length of out. * \param buf The data to decrypt. * \param buf_len The length of buf. * \param padding The padding mode to use. The list of available padding mode can be found in the man page of RSA_private_encrypt(3). * \return The count of bytes written to out. Should be size(). * \see private_encrypt * * In case of failure, an exception is thrown. */ size_t public_decrypt(void* out, size_t out_len, const void* buf, size_t buf_len, int padding) const; /** * \brief Encrypt data bytes using the public key information. * \param out The buffer to write the result to. Must be at least size() bytes long. * \param out_len The length of out. * \param buf The data to encrypt. Depending on the padding mode, buf must be either smaller than size() - 11, size() - 41 or size(). For additional information, take a look at RSA_public_encrypt(3). * \param buf_len The length of buf. * \param padding The padding mode to use. The list of available padding mode can be found in the man page of RSA_public_encrypt(3). * \return The count of bytes written to out. Should be size(). * \see public_decrypt * * In case of failure, an exception is thrown. */ size_t public_encrypt(void* out, size_t out_len, const void* buf, size_t buf_len, int padding) const; /** * \brief Decrypt data bytes using the public key information. * \param out The buffer to write the result to. Whose size depends on the padding mode. If out is at least size() bytes long, no size problem will occur. * \param out_len The length of out. * \param buf The data to decrypt. * \param buf_len The length of buf. * \param padding The padding mode to use. The list of available padding mode can be found in the man page of RSA_public_encrypt(3). * \return The count of bytes written to out. Should be size(). * \see private_encrypt * * In case of failure, an exception is thrown. */ size_t private_decrypt(void* out, size_t out_len, const void* buf, size_t buf_len, int padding) const; /** * \brief Encrypt data bytes using the private key information. * \param buf The data to encrypt. Must be smaller than size() - 11. * \param buf_len The length of buf. * \param padding The padding mode to use. The list of available padding mode can be found in the man page of RSA_private_encrypt(3). * \return The result. * \see public_decrypt * * In case of failure, an exception is thrown. */ buffer private_encrypt(const void* buf, size_t buf_len, int padding) const; /** * \brief Decrypt data bytes using the public key information. * \param buf The data to decrypt. * \param buf_len The length of buf. * \param padding The padding mode to use. The list of available padding mode can be found in the man page of RSA_private_encrypt(3). * \return The result. * \see private_encrypt * * In case of failure, an exception is thrown. */ buffer public_decrypt(const void* buf, size_t buf_len, int padding) const; /** * \brief Encrypt data bytes using the public key information. * \param buf The data to encrypt. Depending on the padding mode, buf must be either smaller than size() - 11, size() - 41 or size(). For additional information, take a look at RSA_public_encrypt(3). * \param buf_len The length of buf. * \param padding The padding mode to use. The list of available padding mode can be found in the man page of RSA_public_encrypt(3). * \return The result. * \see public_decrypt * * In case of failure, an exception is thrown. */ buffer public_encrypt(const void* buf, size_t buf_len, int padding) const; /** * \brief Decrypt data bytes using the public key information. * \param buf The data to decrypt. * \param buf_len The length of buf. * \param padding The padding mode to use. The list of available padding mode can be found in the man page of RSA_public_encrypt(3). * \return The result. * \see private_encrypt * * In case of failure, an exception is thrown. */ buffer private_decrypt(const void* buf, size_t buf_len, int padding) const; /** * \brief Encrypt data bytes using the private key information. * \param buf The data to encrypt. Must be smaller than size() - 11. * \param padding The padding mode to use. The list of available padding mode can be found in the man page of RSA_private_encrypt(3). * \return The result. * \see public_decrypt * * In case of failure, an exception is thrown. */ buffer private_encrypt(const buffer& buf, int padding) const; /** * \brief Decrypt data bytes using the public key information. * \param buf The data to decrypt. * \param padding The padding mode to use. The list of available padding mode can be found in the man page of RSA_private_encrypt(3). * \return The result. * \see private_encrypt * * In case of failure, an exception is thrown. */ buffer public_decrypt(const buffer& buf, int padding) const; /** * \brief Encrypt data bytes using the public key information. * \param buf The data to encrypt. Depending on the padding mode, buf must be either smaller than size() - 11, size() - 41 or size(). For additional information, take a look at RSA_public_encrypt(3). * \param padding The padding mode to use. The list of available padding mode can be found in the man page of RSA_public_encrypt(3). * \return The result. * \see public_decrypt * * In case of failure, an exception is thrown. */ buffer public_encrypt(const buffer& buf, int padding) const; /** * \brief Decrypt data bytes using the public key information. * \param buf The data to decrypt. * \param padding The padding mode to use. The list of available padding mode can be found in the man page of RSA_public_encrypt(3). * \return The result. * \see private_encrypt * * In case of failure, an exception is thrown. */ buffer private_decrypt(const buffer& buf, int padding) const; /** * \brief Sign a message digest, as specified by PCKS #1 v2.0. * \param out The buffer to write the signature to. Must be size() bytes long. * \param out_len The length of out. * \param buf The message digest buffer. * \param buf_len The length of buf. * \param type The NID of the message digest algorithm that was used to generate the message digest buffer. Usually one of NID_sha1, NID_ripemd160, NID_md5. See RSA_sign(3) for additional information. * \return The number of bytes written to out. * \see verify * * In case of failure, an exception is thrown. */ size_t sign(void* out, size_t out_len, const void* buf, size_t buf_len, int type) const; /** * \brief Sign a message digest, as specified by PCKS #1 v2.0. * \param buf The message digest buffer. * \param buf_len The length of buf. * \param type The NID of the message digest algorithm that was used to generate the message digest buffer. Usually one of NID_sha1, NID_ripemd160, NID_md5. See RSA_sign(3) for additional information. * \return The signature. * \see verify * * In case of failure, an exception is thrown. */ buffer sign(const void* buf, size_t buf_len, int type) const; /** * \brief Sign a message digest, as specified by PCKS #1 v2.0. * \param buf The message digest buffer. * \param type The NID of the message digest algorithm that was used to generate the message digest buffer. Usually one of NID_sha1, NID_ripemd160, NID_md5. See RSA_sign(3) for additional information. * \return The signature. * \see verify * * In case of failure, an exception is thrown. */ buffer sign(const buffer& buf, int type) const; /** * \brief Verify a message digest signature, as specified by PCKS #1 v2.0. * \param sign The signature buffer, as generated by sign(). * \param sign_len The length of sign. * \param buf The message digest buffer. * \param buf_len The length of buf. * \param type The NID of the message digest algorithm that was used to generate the message digest buffer. Usually one of NID_sha1, NID_ripemd160, NID_md5. See RSA_sign(3) for additional information. * \see sign * * In case of failure, an exception is thrown. */ void verify(const void* sign, size_t sign_len, const void* buf, size_t buf_len, int type) const; /** * \brief Verify a message digest signature, as specified by PCKS #1 v2.0. * \param sign The signature buffer, as generated by sign(). * \param buf The message digest buffer. * \param type The NID of the message digest algorithm that was used to generate the message digest buffer. Usually one of NID_sha1, NID_ripemd160, NID_md5. See RSA_sign(3) for additional information. * \see sign * * In case of failure, an exception is thrown. */ void verify(const buffer& sign, const buffer& buf, int type) const; private: explicit rsa_key(pointer _ptr, deleter_type _del); }; /** * \brief Compare two rsa_key instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two rsa_key instances share the same underlying pointer. */ bool operator==(const rsa_key& lhs, const rsa_key& rhs); /** * \brief Compare two rsa_key instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two rsa_key instances do not share the same underlying pointer. */ bool operator!=(const rsa_key& lhs, const rsa_key& rhs); inline int rsa_key::register_index(long argl, void* argp, CRYPTO_EX_new* new_func, CRYPTO_EX_dup* dup_func, CRYPTO_EX_free* free_func) { int index = RSA_get_ex_new_index(argl, argp, new_func, dup_func, free_func); throw_error_if(index < 0); return index; } inline int rsa_key::register_index() { return register_index(0, NULL, NULL, NULL, NULL); } inline rsa_key rsa_key::create() { return take_ownership(RSA_new()); } inline rsa_key rsa_key::from_private_key(bio::bio_ptr bio, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_bio_RSAPrivateKey(bio.raw(), NULL, callback, callback_arg)); } inline rsa_key rsa_key::from_public_key(bio::bio_ptr bio, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_bio_RSAPublicKey(bio.raw(), NULL, callback, callback_arg)); } inline rsa_key rsa_key::from_certificate_public_key(bio::bio_ptr bio, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_bio_RSA_PUBKEY(bio.raw(), NULL, callback, callback_arg)); } inline rsa_key rsa_key::from_private_key(file _file, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_RSAPrivateKey(_file.raw(), NULL, callback, callback_arg)); } inline rsa_key rsa_key::from_public_key(file _file, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_RSAPublicKey(_file.raw(), NULL, callback, callback_arg)); } inline rsa_key rsa_key::from_certificate_public_key(file _file, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_RSA_PUBKEY(_file.raw(), NULL, callback, callback_arg)); } inline rsa_key::rsa_key() { } inline rsa_key::rsa_key(pointer _ptr) : pointer_wrapper(_ptr, null_deleter) { } inline void rsa_key::set_external_data(int index, void* data) { throw_error_if(RSA_set_ex_data(raw(), index, data) == 0); } inline void* rsa_key::get_external_data(int index) const { // This call can fail but we cannot know for sure when it happens since NULL as a return value could also be a valid value... return RSA_get_ex_data(raw(), index); } inline void rsa_key::write_private_key(bio::bio_ptr bio, cipher::cipher_algorithm algorithm, const void* passphrase, size_t passphrase_len) const { throw_error_if_not(PEM_write_bio_RSAPrivateKey(bio.raw(), ptr().get(), algorithm.raw(), static_cast(const_cast(passphrase)), static_cast(passphrase_len), NULL, NULL) != 0); } inline void rsa_key::write_private_key(bio::bio_ptr bio, cipher::cipher_algorithm algorithm, pem_passphrase_callback_type callback, void* callback_arg) const { throw_error_if_not(PEM_write_bio_RSAPrivateKey(bio.raw(), ptr().get(), algorithm.raw(), NULL, 0, callback, callback_arg) != 0); } inline void rsa_key::write_public_key(bio::bio_ptr bio) const { throw_error_if_not(PEM_write_bio_RSAPublicKey(bio.raw(), ptr().get()) != 0); } inline void rsa_key::write_certificate_public_key(bio::bio_ptr bio) const { throw_error_if_not(PEM_write_bio_RSA_PUBKEY(bio.raw(), ptr().get()) != 0); } inline void rsa_key::write_private_key(file _file, cipher::cipher_algorithm algorithm, const void* passphrase, size_t passphrase_len) const { throw_error_if_not(PEM_write_RSAPrivateKey(_file.raw(), ptr().get(), algorithm.raw(), static_cast(const_cast(passphrase)), static_cast(passphrase_len), NULL, NULL) != 0); } inline void rsa_key::write_private_key(file _file, cipher::cipher_algorithm algorithm, pem_passphrase_callback_type callback, void* callback_arg) const { throw_error_if_not(PEM_write_RSAPrivateKey(_file.raw(), ptr().get(), algorithm.raw(), NULL, 0, callback, callback_arg) != 0); } inline void rsa_key::write_public_key(file _file) const { throw_error_if_not(PEM_write_RSAPublicKey(_file.raw(), ptr().get()) != 0); } inline void rsa_key::write_certificate_public_key(file _file) const { throw_error_if_not(PEM_write_RSA_PUBKEY(_file.raw(), ptr().get()) != 0); } inline void rsa_key::enable_blinding(BN_CTX* ctx) const { throw_error_if_not(RSA_blinding_on(ptr().get(), ctx) != 0); } inline void rsa_key::disable_blinding() const { RSA_blinding_off(ptr().get()); } inline size_t rsa_key::size() const { return RSA_size(ptr().get()); } inline void rsa_key::check() const { throw_error_if_not(RSA_check_key(ptr().get()) > 0); } inline void rsa_key::print(bio::bio_ptr bio, int offset) const { throw_error_if_not(RSA_print(bio.raw(), ptr().get(), offset) != 0); } inline void rsa_key::print(file _file, int offset) const { throw_error_if_not(RSA_print_fp(_file.raw(), ptr().get(), offset) != 0); } inline void rsa_key::verify_PKCS1_PSS(const buffer& digest, const buffer& buf, hash::message_digest_algorithm algorithm, int salt_len) const { verify_PKCS1_PSS(buffer_cast(digest), buffer_size(digest), buffer_cast(buf), buffer_size(buf), algorithm, salt_len); } inline buffer rsa_key::private_encrypt(const void* buf, size_t buf_len, int padding) const { buffer result(size()); result.data().resize(private_encrypt(buffer_cast(result), buffer_size(result), buf, buf_len, padding)); return result; } inline buffer rsa_key::public_decrypt(const void* buf, size_t buf_len, int padding) const { buffer result(size()); result.data().resize(public_decrypt(buffer_cast(result), buffer_size(result), buf, buf_len, padding)); return result; } inline buffer rsa_key::public_encrypt(const void* buf, size_t buf_len, int padding) const { buffer result(size()); result.data().resize(public_encrypt(buffer_cast(result), buffer_size(result), buf, buf_len, padding)); return result; } inline buffer rsa_key::private_decrypt(const void* buf, size_t buf_len, int padding) const { buffer result(size()); result.data().resize(private_decrypt(buffer_cast(result), buffer_size(result), buf, buf_len, padding)); return result; } inline buffer rsa_key::private_encrypt(const buffer& buf, int padding) const { buffer result(size()); result.data().resize(private_encrypt(buffer_cast(result), buffer_size(result), buffer_cast(buf), buffer_size(buf), padding)); return result; } inline buffer rsa_key::public_decrypt(const buffer& buf, int padding) const { buffer result(size()); result.data().resize(public_decrypt(buffer_cast(result), buffer_size(result), buffer_cast(buf), buffer_size(buf), padding)); return result; } inline buffer rsa_key::public_encrypt(const buffer& buf, int padding) const { buffer result(size()); result.data().resize(public_encrypt(buffer_cast(result), buffer_size(result), buffer_cast(buf), buffer_size(buf), padding)); return result; } inline buffer rsa_key::private_decrypt(const buffer& buf, int padding) const { buffer result(size()); result.data().resize(private_decrypt(buffer_cast(result), buffer_size(result), buffer_cast(buf), buffer_size(buf), padding)); return result; } inline buffer rsa_key::sign(const void* buf, size_t buf_len, int type) const { buffer result(size()); result.data().resize(sign(buffer_cast(result), buffer_size(result), buf, buf_len, type)); return result; } inline buffer rsa_key::sign(const buffer& buf, int type) const { return sign(buffer_cast(buf), buffer_size(buf), type); } inline void rsa_key::verify(const buffer& _sign, const buffer& buf, int type) const { verify(buffer_cast(_sign), buffer_size(_sign), buffer_cast(buf), buffer_size(buf), type); } inline rsa_key::rsa_key(pointer _ptr, deleter_type _del) : pointer_wrapper(_ptr, _del) { } inline bool operator==(const rsa_key& lhs, const rsa_key& rhs) { return lhs.raw() == rhs.raw(); } inline bool operator!=(const rsa_key& lhs, const rsa_key& rhs) { return lhs.raw() != rhs.raw(); } } } #endif /* CRYPTOPLUS_PKEY_RSA_KEY_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/pointer_wrapper.hpp000066400000000000000000000135121252300335000257370ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file pointer_wrapper.hpp * \author Julien KAUFFMANN * \brief A pointer wrapper template class. */ #ifndef CRYPTOPLUS_POINTER_WRAPPER_HPP #define CRYPTOPLUS_POINTER_WRAPPER_HPP #include "nullable.hpp" #include "os.hpp" #include namespace cryptoplus { /** * \brief A pointer wrapper template class. * * A pointer_wrapper holds a shared reference to a pointer. */ template class pointer_wrapper : public nullable > { public: /** * \brief The value type. */ typedef T value_type; /** * \brief The deleter type. */ typedef void (*deleter_type)(value_type*); /** * \brief The pointer type. */ typedef value_type* pointer; /** * \brief The const pointer type. */ typedef const value_type* const_pointer; /** * \brief Get the raw pointer. * \return The raw pointer. * \warning The instance has ownership of the return pointer. Do not free the returned pointer. */ const_pointer raw() const; /** * \brief Get the raw pointer. * \return The raw pointer. * \warning The instance has ownership of the return pointer. Do not free the returned pointer. */ pointer raw(); /** * \brief Convert the instance to the raw pointer type. * \return The same value as raw(). */ operator pointer(); /** * \brief Convert the instance to the raw pointer type. * \return The same value as raw(). */ operator const_pointer() const; /** * \brief The negate boolean operator. * \return true if *this evaluates to false. */ bool operator!() const; protected: /** * \brief The default deleter. */ static deleter_type deleter; /** * \brief A null deleter. */ static void null_deleter(pointer); /** * \brief Create an empty instance. */ pointer_wrapper(); /** * \brief Create a wrapper around a given pointer, using the specified deleter. * \param ptr The pointer to wrap. * \param del The deleter to use to release ptr. */ pointer_wrapper(pointer ptr, deleter_type del); /** * \brief The boolean test. * \return True if the underlying pointer is not null. */ bool boolean_test() const; /** * \brief Get the underlying pointer. * \return The underlying pointer. */ boost::shared_ptr& ptr(); /** * \brief Get the underlying pointer. * \return The underlying pointer. */ const boost::shared_ptr& ptr() const; private: /** * \brief The wrapped pointer. */ boost::shared_ptr m_pointer; friend class nullable >; }; template inline bool pointer_wrapper::operator!() const { return !boolean_test(); } template inline typename pointer_wrapper::const_pointer pointer_wrapper::raw() const { return m_pointer.get(); } template inline typename pointer_wrapper::pointer pointer_wrapper::raw() { return m_pointer.get(); } template pointer_wrapper::operator typename pointer_wrapper::pointer() { return raw(); } template pointer_wrapper::operator typename pointer_wrapper::const_pointer() const { return raw(); } template inline void pointer_wrapper::null_deleter(pointer) { } template inline pointer_wrapper::pointer_wrapper() { } template inline pointer_wrapper::pointer_wrapper(typename pointer_wrapper::pointer _ptr, typename pointer_wrapper::deleter_type _del) : m_pointer(_ptr, _del) { } template inline bool pointer_wrapper::boolean_test() const { return static_cast(m_pointer); } template inline boost::shared_ptr::value_type>& pointer_wrapper::ptr() { return m_pointer; } template inline const boost::shared_ptr::value_type>& pointer_wrapper::ptr() const { return m_pointer; } } #endif /* CRYPTOPLUS_POINTER_WRAPPER_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/random/000077500000000000000000000000001252300335000232645ustar00rootroot00000000000000freelan-2.0/libs/cryptoplus/include/cryptoplus/random/random.hpp000066400000000000000000000237061252300335000252650ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file random.hpp * \author Julien Kauffmann * \brief Randomization helper functions. */ #ifndef CRYPTOPLUS_RANDOM_RANDOM_HPP #define CRYPTOPLUS_RANDOM_RANDOM_HPP #include "../buffer.hpp" #include "../error/helpers.hpp" #include "../os.hpp" #include #include #include namespace cryptoplus { namespace random { /** * \brief Set the randomization engine. * \param engine The randomization engine. * * On error, an exception is thrown. */ void set_randomization_engine(ENGINE* engine); /** * \brief Get truly random bytes. * \param buf The buffer to fill with the random bytes. Its content will be mixed in the enthropy pool unless disabled at OpenSSL compile time. * \param buf_len The number of random bytes to request. buf must be big enough to hold the data. * \see get_pseudo_random_bytes * * If the PRNG was not seeded with enough randomness, the call fails and an exception is thrown. */ void get_random_bytes(void* buf, size_t buf_len); /** * \brief Get truly random bytes. * \param cnt The count of random bytes to get. * \return The random bytes. * \see get_pseudo_random_bytes * * If the PRNG was not seeded with enough randomness, the call fails and an exception is thrown. */ buffer get_random_bytes(size_t cnt); /** * \brief Get pseudo random bytes. * \param buf The buffer to fill with the random bytes. Its content will be mixed in the enthropy pool unless disabled at OpenSSL compile time. * \param buf_len The number of random bytes to request. buf must be big enough to hold the data. * \return true if the generated numbers are cryptographically strong, false otherwise. * \see get_random_bytes * * Do not use the resulting bytes for critical cryptographic purposes (like key generation). If require truly random bytes, see get_random_bytes(). * * If the PRNG was not seeded with enough randomness, the call fails and an exception is thrown. */ bool get_pseudo_random_bytes(void* buf, size_t buf_len); /** * \brief Get pseudo random bytes. * \param cnt The count of random bytes to get. * \return true if the generated numbers are cryptographically strong, false otherwise. * \see get_random_bytes * * Do not use the resulting bytes for critical cryptographic purposes (like key generation). If require truly random bytes, see get_random_bytes(). * * If the PRNG was not seeded with enough randomness, the call fails and an exception is thrown. */ buffer get_pseudo_random_bytes(size_t cnt); /** * \brief Mix some bytes into the PRNG state. * \param buf The buffer that contains the bytes. * \param buf_len The size of buf. * \param entropy An estimate (lower bound) of how much randomness is contained in buf, measured in bytes. See RFC 1750 for details. */ void add(const void* buf, size_t buf_len, double entropy); /** * \brief Mix some bytes into the PRNG state. * \param buf The buffer that contains the bytes. * \param buf_len The size of buf. * \see add * * A call to seed(buf, buf_len) is equivalent to a call of add(buf, buf_len, buf_len). */ void seed(const void* buf, size_t buf_len); /** * \brief Check if the PRNG was seeded enough to provide strong cryptographic material. * \return true if the PRNG was seeded enough, false otherwise. */ bool status(); #ifdef WINDOWS /** * \brief Mix some bytes into the PRNG from Windows events. * \param imsg The imsg param. * \param wparam The WPARAM. * \param lparam The LPARAM. * \return true if the PRNG was seeded enough, false otherwise. */ bool windows_event(UINT imsg, WPARAM wparam, LPARAM lparam); /** * \brief Mix some bytes from the current screen state into the PRNG. */ void windows_screen(); #endif /** * \brief Get a seed filename. * \param buf The buffer to put the seed filename into. * \param buf_len The size of buf. * \return buf. * \warning If buf is not long enough to hold the filename, an exception is thrown. */ const char* get_seed_filename(char* buf, size_t buf_len); /** * \brief Load a seed file. * \param file The file to load the seed from. * \param cnt The number of bytes to read. If cnt is -1 (the default), the complete file is read. * \return The number of bytes read. */ size_t load_seed_file(const std::string& file, ptrdiff_t cnt = -1); /** * \brief Write a seed file from the current PRNG state. * \param file The file to write the seed to. * \return The number of bytes written. */ size_t write_seed_file(const std::string& file); /** * \brief Query the entropy gathering daemon for 255 bytes. * \param path The EGD socket path. * \return The count of bytes read and added to the PRNG. */ size_t egd_query(const std::string& path); /** * \brief Query the entropy gathering daemon for the specified ammount of bytes. * \param path The EGD socket path. * \param cnt The count of bytes to query. * \return The count of bytes read and added to the PRNG. */ size_t egd_query(const std::string& path, size_t cnt); /** * \brief Query the entropy gathering daemon for the specified ammount of bytes without adding the to the PRNG. * \param path The EGD socket path. * \param buf The buffer to put the random bytes into. If buf is NULL, the bytes are added to the PRNG state. * \param cnt The count of bytes to query. buf must be long enough to hold cnt bytes. * \return The count of bytes read. */ size_t egd_query(const std::string& path, void* buf, size_t cnt); /** * \brief Clean up the PRNG. */ void cleanup(); inline void set_randomization_engine(ENGINE* engine) { throw_error_if_not(RAND_set_rand_engine(engine) != 0); } inline void get_random_bytes(void* buf, size_t buf_len) { throw_error_if_not(RAND_bytes(static_cast(buf), static_cast(buf_len)) == 1); } inline buffer get_random_bytes(size_t cnt) { buffer result(cnt); get_random_bytes(buffer_cast(result), buffer_size(result)); return result; } inline bool get_pseudo_random_bytes(void* buf, size_t buf_len) { int result = RAND_pseudo_bytes(static_cast(buf), static_cast(buf_len)); throw_error_if(result < 0); return (result == 1); } inline buffer get_pseudo_random_bytes(size_t cnt) { buffer result(cnt); get_pseudo_random_bytes(buffer_cast(result), buffer_size(result)); return result; } inline void add(const void* buf, size_t buf_len, double entropy) { RAND_add(buf, static_cast(buf_len), entropy); } inline void seed(const void* buf, size_t buf_len) { RAND_seed(buf, static_cast(buf_len)); } inline bool status() { return (RAND_status() == 1); } #ifdef WINDOWS inline bool windows_event(UINT imsg, WPARAM wparam, LPARAM lparam) { return (RAND_event(imsg, wparam, lparam) == 1); } inline void windows_screen() { RAND_screen(); } #endif inline const char* get_seed_filename(char* buf, size_t buf_len) { const char* result = RAND_file_name(buf, buf_len); throw_error_if_not(result); return result; } inline size_t load_seed_file(const std::string& file, ptrdiff_t cnt) { int result = RAND_load_file(file.c_str(), static_cast(cnt)); throw_error_if_not(result >= 0); return result; } inline size_t write_seed_file(const std::string& file) { int result = RAND_write_file(file.c_str()); throw_error_if_not(result >= 0); return result; } inline size_t egd_query(const std::string& path) { int result = RAND_egd(path.c_str()); throw_error_if_not(result >= 0); return result; } inline size_t egd_query(const std::string& path, size_t cnt) { int result = RAND_egd_bytes(path.c_str(), static_cast(cnt)); throw_error_if_not(result >= 0); return result; } inline size_t egd_query(const std::string& path, void* buf, size_t cnt) { int result = RAND_query_egd_bytes(path.c_str(), static_cast(buf), static_cast(cnt)); throw_error_if_not(result >= 0); return result; } inline void cleanup() { RAND_cleanup(); } } } #endif /* CRYPTOPLUS_RANDOM_RANDOM_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/tls/000077500000000000000000000000001252300335000226065ustar00rootroot00000000000000freelan-2.0/libs/cryptoplus/include/cryptoplus/tls/tls.hpp000066400000000000000000000134401252300335000241230ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file tls.hpp * \author Julien KAUFFMANN * \brief TLS utility functions. */ #ifndef CRYPTOPLUS_TLS_TLS_HPP #define CRYPTOPLUS_TLS_TLS_HPP #include #include "../buffer.hpp" #include "../hash/message_digest_algorithm.hpp" namespace cryptoplus { namespace tls { /** * \brief Computes the P_hash as defined in TLS RFC 5246. * \param out The output buffer. Must be at least as big as the message digest algorithm result size. * \param out_len The output buffer length. Also the count of bytes requested. * \param key The key to use. * \param key_len The key length. * \param data The first buffer of data. * \param data_len The data length. * \param data2 The second buffer of data. * \param data2_len The data2 length. * \param algorithm The message digest algorithm to use. * \param impl The engine to use. The NULL default value indicate that no engine should be used. * \return The count of bytes written to out. Should be equal to out_len. */ size_t p_hash(void* out, size_t out_len, const void* key, size_t key_len, const void* data, size_t data_len, const void* data2, size_t data2_len, const hash::message_digest_algorithm& algorithm, ENGINE* impl = NULL); /** * \brief Computes the P_hash as defined in TLS RFC 5246. * \param out_len The count of bytes requested. * \param key The key to use. * \param key_len The key length. * \param data The buffer. * \param data_llen The buffer length. * \param algorithm The message digest algorithm to use. * \param impl The engine to use. The NULL default value indicate that no engine should be used. * \return The hash. */ inline buffer p_hash(size_t out_len, const void* key, size_t key_len, const void* data, size_t data_len, const void* data2, size_t data2_len, const hash::message_digest_algorithm& algorithm, ENGINE* impl = NULL) { buffer result(out_len); p_hash(buffer_cast(result), buffer_size(result), key, key_len, data, data_len, data2, data2_len, algorithm, impl); return result; } /** * \brief TLS PRF function as defined in RFC 5246. * \param out The output buffer. Must be at least as big as the message digest algorithm result size. * \param out_len The output buffer length. Also the count of bytes requested. * \param key The key to use. * \param key_len The key length. * \param label The label to use. * \param label_len The label length. * \param seed The seed. Typically the concatenation of the client and server randoms. * \param seed_len The seed length. * \param algorithm The message digest algorithm to use. * \param impl The engine to use. The NULL default value indicate that no engine should be used. * \return The count of bytes written to out. Should be equal to out_len. */ inline size_t prf(void* out, size_t out_len, const void* key, size_t key_len, const void* label, size_t label_len, const void* seed, size_t seed_len, const hash::message_digest_algorithm& algorithm, ENGINE* impl = NULL) { return p_hash(out, out_len, key, key_len, label, label_len, seed, seed_len, algorithm, impl); } /** * \brief TLS PRF function as defined in RFC 5246. * \param out_len The count of bytes requested. * \param key The key to use. * \param key_len The key length. * \param label The label to use. * \param seed The seed. Typically the concatenation of the client and server randoms. * \param seed_len The seed length. * \param algorithm The message digest algorithm to use. * \param impl The engine to use. The NULL default value indicate that no engine should be used. * \return The hash. */ inline buffer prf(size_t out_len, const void* key, size_t key_len, const std::string& label, const void* seed, size_t seed_len, const hash::message_digest_algorithm& algorithm, ENGINE* impl = NULL) { buffer result(out_len); prf(buffer_cast(result), buffer_size(result), key, key_len, label.c_str(), label.size(), seed, seed_len, algorithm, impl); return result; } } } #endif /* CRYPTOPLUS_TLS_TLS_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/x509/000077500000000000000000000000001252300335000225115ustar00rootroot00000000000000freelan-2.0/libs/cryptoplus/include/cryptoplus/x509/certificate.hpp000066400000000000000000001315431252300335000255130ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file certificate.hpp * \author Julien KAUFFMANN * \brief A X509 certificate class. */ #ifndef CRYPTOPLUS_X509_CERTIFICATE_HPP #define CRYPTOPLUS_X509_CERTIFICATE_HPP #include "../pointer_wrapper.hpp" #include "../buffer.hpp" #include "../error/helpers.hpp" #include "../bio/bio_ptr.hpp" #include "../pkey/pkey.hpp" #include "../asn1/integer.hpp" #include "../asn1/utctime.hpp" #include "../file.hpp" #include "name.hpp" #include "extension.hpp" #include "certificate_request.hpp" #include #include namespace cryptoplus { namespace x509 { /** * \brief A X509 certificate. * * The certificate class represents a X509 certificate. * * A certificate instance has the same semantic as a X509* pointer, thus two copies of the same instance share the same underlying pointer. * * \warning Always check for the object not to be NULL before calling any of its method. Calling any method (except raw()) on a null object has undefined behavior. */ class certificate : public pointer_wrapper { public: /** * \brief The wrapped value type. */ typedef extension wrapped_value_type; /** * \brief The wrapper pointer type. */ typedef wrapped_value_type* wrapped_pointer; /** * \brief An iterator class. */ template class base_iterator : public std::iterator { public: /** * \brief Create an empty iterator. */ base_iterator(); /** * \brief Dereference operator. * \return The value. */ typename base_iterator::reference operator*() const; /** * \brief Dereference operator. * \return The value. */ typename base_iterator::pointer operator->() const; /** * \brief Dereference operator. * \param index The index to add or substract. * \return An iterator. */ typename base_iterator::reference operator[](int index) const; /** * \brief Increment the iterator. * \return A reference to this. */ base_iterator& operator++(); /** * \brief Increment the iterator. * \return The old value. */ base_iterator operator++(int); /** * \brief Decrement the iterator. * \return A reference to this. */ base_iterator& operator--(); /** * \brief Decrement the iterator. * \return The old value. */ base_iterator operator--(int); /** * \brief Increment the iterator. * \param cnt The number to add to the iterator. * \return A reference to this. */ base_iterator& operator+=(int cnt); /** * \brief Decrement the iterator. * \param cnt The number to substract from the iterator. * \return A reference to this. */ base_iterator& operator-=(int cnt); private: base_iterator(IteratorValueType*, int); IteratorValueType* m_owner; int m_index; typename IteratorValueType::wrapped_value_type m_cache; friend class certificate; template friend bool operator==(const certificate::base_iterator<_IteratorValueType>& lhs, const certificate::base_iterator<_IteratorValueType>& rhs); template friend bool operator!=(const certificate::base_iterator<_IteratorValueType>& lhs, const certificate::base_iterator<_IteratorValueType>& rhs); template friend bool operator<(const certificate::base_iterator<_IteratorValueType>& lhs, const certificate::base_iterator<_IteratorValueType>& rhs); template friend bool operator<=(const certificate::base_iterator<_IteratorValueType>& lhs, const certificate::base_iterator<_IteratorValueType>& rhs); template friend bool operator>(const certificate::base_iterator<_IteratorValueType>& lhs, const certificate::base_iterator<_IteratorValueType>& rhs); template friend bool operator>=(const certificate::base_iterator<_IteratorValueType>& lhs, const certificate::base_iterator<_IteratorValueType>& rhs); template friend certificate::base_iterator<_IteratorValueType> operator+(const certificate::base_iterator<_IteratorValueType>& lhs, int rhs); template friend certificate::base_iterator<_IteratorValueType> operator+(int lhs, const certificate::base_iterator<_IteratorValueType>& rhs); template friend certificate::base_iterator<_IteratorValueType> operator-(const certificate::base_iterator<_IteratorValueType>& lhs, int rhs); template friend certificate::base_iterator<_IteratorValueType> operator-(int lhs, const certificate::base_iterator<_IteratorValueType>& rhs); template friend typename certificate::base_iterator<_IteratorValueType>::difference_type operator-(const certificate::base_iterator<_IteratorValueType>& lhs, const certificate::base_iterator<_IteratorValueType>& rhs); }; /** * \brief The iterator type. */ typedef base_iterator iterator; /** * \brief The iterator type. */ typedef base_iterator const_iterator; /** * \brief Reverse iterator type. */ typedef std::reverse_iterator reverse_iterator; /** * \brief Const reverse iterator type. */ typedef std::reverse_iterator reverse_const_iterator; /** * \brief A PEM passphrase callback type. */ typedef int (*pem_passphrase_callback_type)(char*, int, int, void*); /** * \brief Create a new certificate. * \return The certificate. * * If allocation fails, an exception is thrown. */ static certificate create(); /** * \brief Take ownership of a specified X509 pointer. * \param ptr The pointer. Cannot be NULL. * \return A certificate. */ static certificate take_ownership(pointer ptr); /** * \brief Load a X509 certificate in DER format. * \param bio The BIO. * \return The certificate. */ static certificate from_der(bio::bio_ptr bio); /** * \brief Load a X509 certificate from a BIO. * \param bio The BIO. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The certificate. * * This function will also load a trusted certificate but without its 'trust' information. */ static certificate from_certificate(bio::bio_ptr bio, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a X509 trusted certificate from a BIO. * \param bio The BIO. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The certificate. */ static certificate from_trusted_certificate(bio::bio_ptr bio, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a X509 certificate in DER format. * \param file The file. * \return The certificate. */ static certificate from_der(file file); /** * \brief Load a X509 certificate from a file. * \param file The file. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The certificate. * * This function will also load a trusted certificate but without its 'trust' information. */ static certificate from_certificate(file file, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a X509 trusted certificate from a file. * \param file The file. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The certificate. */ static certificate from_trusted_certificate(file file, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a X509 certificate in DER format. * \param buf The buffer. * \param buf_len The length of buf. * \return The certificate. */ static certificate from_der(const void* buf, size_t buf_len); /** * \brief Load a X509 certificate in DER format. * \param buf The buffer. * \return The certificate. */ static certificate from_der(const buffer& buf); /** * \brief Load a X509 certificate from a buffer. * \param buf The buffer. * \param buf_len The length of buf. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The certificate. */ static certificate from_certificate(const void* buf, size_t buf_len, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a X509 trusted certificate from a buffer. * \param buf The buffer. * \param buf_len The length of buf. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The certificate. */ static certificate from_trusted_certificate(const void* buf, size_t buf_len, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Create a new empty X509 certificate. */ certificate(); /** * \brief Create a X509 certificate by *NOT* taking ownership of an existing X509* pointer. * \param ptr The X509* pointer. * \warning The caller is still responsible for freeing the memory. */ certificate(pointer ptr); /** * \brief Write the certificate in DER format to a BIO. * \param bio The BIO. */ void write_der(bio::bio_ptr bio) const; /** * \brief Write the certificate to a BIO. * \param bio The BIO. */ void write_certificate(bio::bio_ptr bio) const; /** * \brief Write the trusted certificate to a BIO. * \param bio The BIO. */ void write_trusted_certificate(bio::bio_ptr bio) const; /** * \brief Write the certificate in DER format to a file. * \param file The file. */ void write_der(file file) const; /** * \brief Write the certificate to a file. * \param file The file. */ void write_certificate(file file) const; /** * \brief Write the trusted certificate to a file. * \param file The file. */ void write_trusted_certificate(file file) const; /** * \brief Write the certificate in DER format to a buffer. * \param buf The buffer to write too. If NULL is specified, only the needed size is returned. * \return The size written or to be written. */ size_t write_der(void* buf) const; /** * \brief Write the certificate in DER format to a buffer. * \return The buffer. */ buffer write_der() const; /** * \brief Clone the certificate instance. * \return The clone. */ certificate clone() const; /** * \brief Print a X509 to a BIO. * \param bio The BIO. */ void print(bio::bio_ptr bio) const; /** * \brief Get a complete string representation of the certificate. * \return The string representation. */ std::string to_string() const; /** * \brief Get the count of entries. * \return The count of entries. */ int count() const; /** * \brief Get the entry at the specified position. * \param index The index. Must be a valid index position or the behavior is undefined. See count(). * \return The name entry. * \see count(). */ wrapped_value_type operator[](int index) const; /** * \brief Get the begin iterator. * \return The begin iterator. */ const_iterator begin() const; /** * \brief Get the begin iterator. * \return The begin iterator. */ iterator begin(); /** * \brief Get the end iterator. * \return The end iterator. */ const_iterator end() const; /** * \brief Get the end iterator. * \return The end iterator. */ iterator end(); /** * \brief Get the reverse begin iterator. * \return The reverse begin iterator. */ reverse_const_iterator rbegin() const; /** * \brief Get the reverse begin iterator. * \return The reverse begin iterator. */ reverse_iterator rbegin(); /** * \brief Get the reverse end iterator. * \return The reverse end iterator. */ reverse_const_iterator rend() const; /** * \brief Get the reverse end iterator. * \return The reverse end iterator. */ reverse_iterator rend(); /** * \brief Erase the given entry. * \param it An iterator to the entry to erase. * \return The next iterator. */ const_iterator erase(const_iterator it) const; /** * \brief Erase the given entry. * \param it An iterator to the entry to erase. * \return The next iterator. */ iterator erase(iterator it); /** * \brief Erase the given entries. * \param first The first iterator. * \param last The last iterator. * \return last. */ const_iterator erase(const_iterator first, const_iterator last) const; /** * \brief Erase the given entries. * \param first The first iterator. * \param last The last iterator. * \return last. */ iterator erase(iterator first, iterator last); /** * \brief Find an extension by its NID. * \param nid The nid. * \return An iterator to the first extension that matches, or end() if none is found. */ const_iterator find(int nid) const; /** * \brief Find an extension by its NID. * \param nid The nid. * \return An iterator to the first extension that matches, or end() if none is found. */ iterator find(int nid); /** * \brief Find an extension by its NID. * \param nid The nid. * \param lastpos The iterator to start the search after. * \return An iterator to an extension that matches, or end() if none is found. */ const_iterator find(int nid, const_iterator lastpos) const; /** * \brief Find an extension by its NID. * \param nid The nid. * \param lastpos The iterator to start the search after. * \return An iterator to an extension that matches, or end() if none is found. */ iterator find(int nid, iterator lastpos); /** * \brief Find an extension by its ASN1 object. * \param object The ASN1 object. * \return An iterator to the first extension that matches, or end() if none is found. */ const_iterator find(asn1::object object) const; /** * \brief Find an extension by its ASN1 object. * \param object The ASN1 object. * \return An iterator to the first extension that matches, or end() if none is found. */ iterator find(asn1::object object); /** * \brief Find an extension by its ASN1 object. * \param object The ASN1 object. * \param lastpos The iterator to start the search after. * \return An iterator to an extension that matches, or end() if none is found. */ const_iterator find(asn1::object object, const_iterator lastpos) const; /** * \brief Find an extension by its ASN1 object. * \param object The ASN1 object. * \param lastpos The iterator to start the search after. * \return An iterator to an extension that matches, or end() if none is found. */ iterator find(asn1::object object, iterator lastpos); /** * \brief Find an extension by its critical flag. * \param critical The critical flag. * \return An iterator to the first extension that matches, or end() if none is found. */ const_iterator find_by_critical(bool critical) const; /** * \brief Find an extension by its critical flag. * \param critical The critical flag. * \return An iterator to the first extension that matches, or end() if none is found. */ iterator find_by_critical(bool critical); /** * \brief Find an extension by its critical flag. * \param critical The critical flag. * \param lastpos The iterator to start the search after. * \return An iterator to an extension that matches, or end() if none is found. */ const_iterator find_by_critical(bool critical, const_iterator lastpos) const; /** * \brief Find an extension by its critical flag. * \param critical The critical flag. * \param lastpos The iterator to start the search after. * \return An iterator to an extension that matches, or end() if none is found. */ iterator find_by_critical(bool critical, iterator lastpos); /** * \brief Clear all extensions. */ void clear() const; /** * \brief Push a copy of the specified extension at the end of the extension table. * \param ext The extension */ void push_back(wrapped_value_type ext) const; /** * \brief Insert a copy of the specified extension in the extension table. * \param position The position to insert the extension at. * \param ext The extension. * \return An iterator to the extension that was added. */ const_iterator insert(const_iterator position, wrapped_value_type ext) const; /** * \brief Insert a copy of the specified extension in the extension table. * \param position The position to insert the extension at. * \param ext The extension. * \return An iterator to the extension that was added. */ iterator insert(iterator position, wrapped_value_type ext); /** * \brief Get the public key. * \return The public key. */ pkey::pkey public_key() const; /** * \brief Set the public key. * \param pkey The public key. */ void set_public_key(pkey::pkey pkey) const; /** * \brief Get the subject name. * \return The subject name. * \warning The returned name depends on the certificate instance and will be invalidated as soon as the underlying pointer is changed (or freed). */ name subject() const; /** * \brief Set the subject name. * \param aname The subject name that will be copied. */ void set_subject(name aname) const; /** * \brief Get the issuer name. * \return The issuer name. * \warning The returned name depends on the certificate instance and will be invalidated as soon as the underlying pointer is changed (or freed). */ name issuer() const; /** * \brief Set the issuer name. * \param aname The issuer name that will be copied. */ void set_issuer(name aname) const; /** * \brief Get the certificate version. * \return The version. */ long version() const; /** * \brief Set the certificate version. * \param version The version. */ void set_version(long version) const; /** * \brief Get the certificate serial number. * \return The serial number. */ asn1::integer serial_number() const; /** * \brief Set the certificate serial number. * \param serial_number The serial number. */ void set_serial_number(asn1::integer serial_number) const; /** * \brief Get the certificate not before date. * \return The not before date. */ asn1::utctime not_before() const; /** * \brief Set the certificate not before date. * \param not_before The not before date. */ void set_not_before(asn1::utctime not_before) const; /** * \brief Get the certificate not after date. * \return The not after date. */ asn1::utctime not_after() const; /** * \brief Set the certificate not after date. * \param not_after The not after date. */ void set_not_after(asn1::utctime not_after) const; /** * \brief Verify the certificate against a specified public key. * \param pkey The public pkey. * \return true if the verification succeeds. */ bool verify_public_key(pkey::pkey pkey) const; /** * \brief Sign the certificate. * \param pkey The private key. * \param algorithm The message digest to use. */ void sign(pkey::pkey pkey, hash::message_digest_algorithm algorithm) const; /** * \brief Verify the certificate against a specified private key. * \param pkey The private pkey. * \return true if the verification succeeds. */ bool verify_private_key(pkey::pkey pkey) const; /** * \brief Generate a X509 certificate request from this certificate. * \param pkey The private key to use to sign the request. * \param algorithm The message digest algorithm to use to sign the request. * \return The certificate request. */ certificate_request to_certificate_request(pkey::pkey pkey, hash::message_digest_algorithm algorithm) const; private: certificate(pointer _ptr, deleter_type _del); }; /** * \brief Compare two certificate::iterator instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two certificate::iterator instances point to the same element. */ template bool operator==(const certificate::base_iterator& lhs, const certificate::base_iterator& rhs); /** * \brief Compare two certificate::iterator instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two certificate::iterator instances do not point to the same element. */ template bool operator!=(const certificate::base_iterator& lhs, const certificate::base_iterator& rhs); /** * \brief Compare two certificate::iterator instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if lhs is smaller than rhs. */ template bool operator<(const certificate::base_iterator& lhs, const certificate::base_iterator& rhs); /** * \brief Compare two certificate::iterator instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if lhs is smaller than or equal to rhs. */ template bool operator<=(const certificate::base_iterator& lhs, const certificate::base_iterator& rhs); /** * \brief Compare two certificate::iterator instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if lhs is greater than rhs. */ template bool operator>(const certificate::base_iterator& lhs, const certificate::base_iterator& rhs); /** * \brief Compare two certificate::iterator instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if lhs is greater than or equal to rhs. */ template bool operator>=(const certificate::base_iterator& lhs, const certificate::base_iterator& rhs); /** * \brief Add an integer value to an iterator. * \param lhs The left argument. * \param rhs The right argument. * \return The new iterator. */ template certificate::base_iterator operator+(const certificate::base_iterator& lhs, int rhs); /** * \brief Add an integer value to an iterator. * \param lhs The left argument. * \param rhs The right argument. * \return The new iterator. */ template certificate::base_iterator operator+(int lhs, const certificate::base_iterator& rhs); /** * \brief Substract an integer value from an iterator. * \param lhs The left argument. * \param rhs The right argument. * \return The new iterator. */ template certificate::base_iterator operator-(const certificate::base_iterator& lhs, int rhs); /** * \brief Substract an integer value from an iterator. * \param lhs The left argument. * \param rhs The right argument. * \return The new iterator. */ template certificate::base_iterator operator-(int lhs, const certificate::base_iterator& rhs); /** * \brief Substract a iterator from another iterator and gets the index distance. * \param lhs The left argument. * \param rhs The right argument. * \return The distance. */ template typename certificate::base_iterator::difference_type operator-(const certificate::base_iterator& lhs, const certificate::base_iterator& rhs); /** * \brief Compare two certificate instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two certificate instances share the same underlying pointer. */ bool operator==(const certificate& lhs, const certificate& rhs); /** * \brief Compare two certificate instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two certificate instances do not share the same underlying pointer. */ bool operator!=(const certificate& lhs, const certificate& rhs); /** * \brief Output the certificate to an output stream. * \param os The output stream. * \param value The value instance.. * \return The output stream. */ std::ostream& operator<<(std::ostream& os, const certificate& value); template inline certificate::base_iterator::base_iterator() : m_owner(NULL), m_index(0) { } template inline typename certificate::base_iterator::reference certificate::base_iterator::operator*() const { return (m_cache = (*m_owner)[m_index]); } template inline typename certificate::base_iterator::pointer certificate::base_iterator::operator->() const { return &operator*(); } template inline typename certificate::base_iterator::reference certificate::base_iterator::operator[](int index) const { return *iterator(m_owner, m_index + index); } template inline certificate::base_iterator& certificate::base_iterator::operator++() { ++m_index; return *this; } template inline certificate::base_iterator certificate::base_iterator::operator++(int) { const base_iterator old = *this; ++m_index; return old; } template inline certificate::base_iterator& certificate::base_iterator::operator--() { --m_index; return *this; } template inline certificate::base_iterator certificate::base_iterator::operator--(int) { const base_iterator old = *this; --m_index; return old; } template inline certificate::base_iterator& certificate::base_iterator::operator+=(int cnt) { m_index += cnt; return *this; } template inline certificate::base_iterator& certificate::base_iterator::operator-=(int cnt) { m_index -= cnt; return *this; } template inline certificate::base_iterator::base_iterator(IteratorValueType* _certificate, int index) : m_owner(_certificate), m_index(index) { } inline certificate certificate::create() { pointer _ptr = X509_new(); throw_error_if_not(_ptr); return take_ownership(_ptr); } inline certificate certificate::from_der(bio::bio_ptr bio) { return take_ownership(d2i_X509_bio(bio.raw(), NULL)); } inline certificate certificate::from_certificate(bio::bio_ptr bio, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_bio_X509(bio.raw(), NULL, callback, callback_arg)); } inline certificate certificate::from_trusted_certificate(bio::bio_ptr bio, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_bio_X509_AUX(bio.raw(), NULL, callback, callback_arg)); } inline certificate certificate::from_der(file _file) { return take_ownership(d2i_X509_fp(_file.raw(), NULL)); } inline certificate certificate::from_certificate(file _file, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_X509(_file.raw(), NULL, callback, callback_arg)); } inline certificate certificate::from_trusted_certificate(file _file, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_X509_AUX(_file.raw(), NULL, callback, callback_arg)); } inline certificate certificate::from_der(const void* buf, size_t buf_len) { const unsigned char* pbuf = static_cast(buf); return take_ownership(d2i_X509(NULL, &pbuf, static_cast(buf_len))); } inline certificate certificate::from_der(const buffer& buf) { return from_der(buffer_cast(buf), buffer_size(buf)); } inline certificate::certificate() { } inline certificate::certificate(pointer _ptr) : pointer_wrapper(_ptr, null_deleter) { } inline void certificate::write_der(bio::bio_ptr bio) const { throw_error_if_not(i2d_X509_bio(bio.raw(), ptr().get()) != 0); } inline void certificate::write_certificate(bio::bio_ptr bio) const { throw_error_if_not(PEM_write_bio_X509(bio.raw(), ptr().get()) != 0); } inline void certificate::write_trusted_certificate(bio::bio_ptr bio) const { throw_error_if_not(PEM_write_bio_X509_AUX(bio.raw(), ptr().get()) != 0); } inline void certificate::write_der(file _file) const { throw_error_if_not(i2d_X509_fp(_file.raw(), ptr().get()) != 0); } inline void certificate::write_certificate(file _file) const { throw_error_if_not(PEM_write_X509(_file.raw(), ptr().get()) != 0); } inline void certificate::write_trusted_certificate(file _file) const { throw_error_if_not(PEM_write_X509_AUX(_file.raw(), ptr().get()) != 0); } inline size_t certificate::write_der(void* buf) const { unsigned char* out = static_cast(buf); unsigned char** pout = out != NULL ? &out : NULL; int result = i2d_X509(ptr().get(), pout); throw_error_if(result < 0); return result; } inline buffer certificate::write_der() const { buffer result(write_der(static_cast(NULL))); write_der(buffer_cast(result)); return result; } inline certificate certificate::clone() const { return certificate(X509_dup(ptr().get())); } inline void certificate::print(bio::bio_ptr bio) const { throw_error_if_not(X509_print(bio.raw(), ptr().get()) != 0); } inline int certificate::count() const { return X509_get_ext_count(ptr().get()); } inline certificate::wrapped_value_type certificate::operator[](int index) const { return wrapped_value_type(X509_get_ext(ptr().get(), index)); } inline certificate::const_iterator certificate::begin() const { return const_iterator(this, 0); } inline certificate::iterator certificate::begin() { return iterator(this, 0); } inline certificate::const_iterator certificate::end() const { return const_iterator(this, count()); } inline certificate::iterator certificate::end() { return iterator(this, count()); } inline certificate::reverse_const_iterator certificate::rbegin() const { return reverse_const_iterator(end()); } inline certificate::reverse_iterator certificate::rbegin() { return reverse_iterator(end()); } inline certificate::reverse_const_iterator certificate::rend() const { return reverse_const_iterator(begin()); } inline certificate::reverse_iterator certificate::rend() { return reverse_iterator(begin()); } inline certificate::const_iterator certificate::erase(const_iterator it) const { wrapped_value_type::take_ownership(X509_delete_ext(it.m_owner->ptr().get(), it.m_index)); return it; } inline certificate::iterator certificate::erase(iterator it) { wrapped_value_type::take_ownership(X509_delete_ext(it.m_owner->ptr().get(), it.m_index)); return it; } inline certificate::const_iterator certificate::erase(const_iterator first, const_iterator last) const { while (first != last) first = erase(first); return first; } inline certificate::iterator certificate::erase(iterator first, iterator last) { while (first != last) first = erase(first); return first; } inline certificate::const_iterator certificate::find(int nid) const { int index = X509_get_ext_by_NID(ptr().get(), nid, -1); return (index < 0) ? end() : const_iterator(this, index); } inline certificate::iterator certificate::find(int nid) { int index = X509_get_ext_by_NID(ptr().get(), nid, -1); return (index < 0) ? end() : iterator(this, index); } inline certificate::const_iterator certificate::find(int nid, const_iterator lastpos) const { int index = X509_get_ext_by_NID(ptr().get(), nid, lastpos.m_index); return (index < 0) ? end() : const_iterator(this, index); } inline certificate::iterator certificate::find(int nid, iterator lastpos) { int index = X509_get_ext_by_NID(ptr().get(), nid, lastpos.m_index); return (index < 0) ? end() : iterator(this, index); } inline certificate::const_iterator certificate::find(asn1::object object) const { int index = X509_get_ext_by_OBJ(ptr().get(), object.raw(), -1); return (index < 0) ? end() : const_iterator(this, index); } inline certificate::iterator certificate::find(asn1::object object) { int index = X509_get_ext_by_OBJ(ptr().get(), object.raw(), -1); return (index < 0) ? end() : iterator(this, index); } inline certificate::const_iterator certificate::find(asn1::object object, const_iterator lastpos) const { int index = X509_get_ext_by_OBJ(ptr().get(), object.raw(), lastpos.m_index); return (index < 0) ? end() : const_iterator(this, index); } inline certificate::iterator certificate::find(asn1::object object, iterator lastpos) { int index = X509_get_ext_by_OBJ(ptr().get(), object.raw(), lastpos.m_index); return (index < 0) ? end() : iterator(this, index); } inline certificate::const_iterator certificate::find_by_critical(bool critical) const { int index = X509_get_ext_by_critical(ptr().get(), critical ? 1 : 0, -1); return (index < 0) ? end() : const_iterator(this, index); } inline certificate::iterator certificate::find_by_critical(bool critical) { int index = X509_get_ext_by_critical(ptr().get(), critical ? 1 : 0, -1); return (index < 0) ? end() : iterator(this, index); } inline certificate::const_iterator certificate::find_by_critical(bool critical, const_iterator lastpos) const { int index = X509_get_ext_by_critical(ptr().get(), critical ? 1 : 0, lastpos.m_index); return (index < 0) ? end() : const_iterator(this, index); } inline certificate::iterator certificate::find_by_critical(bool critical, iterator lastpos) { int index = X509_get_ext_by_critical(ptr().get(), critical ? 1 : 0, lastpos.m_index); return (index < 0) ? end() : iterator(this, index); } inline void certificate::clear() const { erase(begin(), end()); } inline void certificate::push_back(wrapped_value_type ext) const { throw_error_if_not(X509_add_ext(ptr().get(), ext.raw(), -1) != 0); } inline certificate::const_iterator certificate::insert(const_iterator position, wrapped_value_type ext) const { assert(position.m_owner == this); throw_error_if_not(X509_add_ext(ptr().get(), ext.raw(), position.m_index) != 0); return position; } inline certificate::iterator certificate::insert(iterator position, wrapped_value_type ext) { assert(position.m_owner == this); throw_error_if_not(X509_add_ext(ptr().get(), ext.raw(), position.m_index) != 0); return position; } inline pkey::pkey certificate::public_key() const { return pkey::pkey::take_ownership(X509_get_pubkey(ptr().get())); } inline void certificate::set_public_key(pkey::pkey pkey) const { throw_error_if_not(X509_set_pubkey(ptr().get(), pkey.raw()) != 0); } inline name certificate::subject() const { return X509_get_subject_name(ptr().get()); } inline void certificate::set_subject(name _name) const { throw_error_if_not(X509_set_subject_name(ptr().get(), _name.raw()) != 0); } inline name certificate::issuer() const { return X509_get_issuer_name(ptr().get()); } inline void certificate::set_issuer(name _name) const { throw_error_if_not(X509_set_issuer_name(ptr().get(), _name.raw()) != 0); } inline long certificate::version() const { return X509_get_version(ptr().get()); } inline void certificate::set_version(long _version) const { throw_error_if_not(X509_set_version(ptr().get(), _version) != 0); } inline asn1::integer certificate::serial_number() const { return X509_get_serialNumber(ptr().get()); } inline void certificate::set_serial_number(asn1::integer _serial_number) const { throw_error_if_not(X509_set_serialNumber(ptr().get(), _serial_number.raw()) != 0); } inline asn1::utctime certificate::not_before() const { return X509_get_notBefore(ptr().get()); } inline void certificate::set_not_before(asn1::utctime _not_before) const { throw_error_if_not(X509_set_notBefore(ptr().get(), _not_before.raw()) != 0); } inline asn1::utctime certificate::not_after() const { return X509_get_notAfter(ptr().get()); } inline void certificate::set_not_after(asn1::utctime _not_after) const { throw_error_if_not(X509_set_notAfter(ptr().get(), _not_after.raw()) != 0); } inline bool certificate::verify_public_key(pkey::pkey pkey) const { return X509_verify(ptr().get(), pkey.raw()) == 1; } inline void certificate::sign(pkey::pkey pkey, hash::message_digest_algorithm algorithm) const { throw_error_if_not(X509_sign(ptr().get(), pkey.raw(), algorithm.raw()) != 0); } inline bool certificate::verify_private_key(pkey::pkey pkey) const { return X509_check_private_key(ptr().get(), pkey.raw()) == 1; } inline certificate_request certificate::to_certificate_request(pkey::pkey pkey, hash::message_digest_algorithm algorithm) const { return certificate_request::take_ownership(X509_to_X509_REQ(ptr().get(), pkey.raw(), algorithm.raw())); } inline certificate::certificate(pointer _ptr, deleter_type _del) : pointer_wrapper(_ptr, _del) { } template inline bool operator==(const certificate::base_iterator<_IteratorValueType>& lhs, const certificate::base_iterator<_IteratorValueType>& rhs) { assert(lhs.m_owner == rhs.m_owner); return (lhs.m_index == rhs.m_index); } template inline bool operator!=(const certificate::base_iterator<_IteratorValueType>& lhs, const certificate::base_iterator<_IteratorValueType>& rhs) { assert(lhs.m_owner == rhs.m_owner); return (lhs.m_index != rhs.m_index); } template inline bool operator<(const certificate::base_iterator<_IteratorValueType>& lhs, const certificate::base_iterator<_IteratorValueType>& rhs) { assert(lhs.m_owner == rhs.m_owner); return (lhs.m_index < rhs.m_index); } template inline bool operator<=(const certificate::base_iterator<_IteratorValueType>& lhs, const certificate::base_iterator<_IteratorValueType>& rhs) { assert(lhs.m_owner == rhs.m_owner); return (lhs.m_index <= rhs.m_index); } template inline bool operator>(const certificate::base_iterator<_IteratorValueType>& lhs, const certificate::base_iterator<_IteratorValueType>& rhs) { assert(lhs.m_owner == rhs.m_owner); return (lhs.m_index > rhs.m_index); } template inline bool operator>=(const certificate::base_iterator<_IteratorValueType>& lhs, const certificate::base_iterator<_IteratorValueType>& rhs) { assert(lhs.m_owner == rhs.m_owner); return (lhs.m_index >= rhs.m_index); } template inline certificate::base_iterator<_IteratorValueType> operator+(const certificate::base_iterator<_IteratorValueType>& lhs, int rhs) { return certificate::base_iterator<_IteratorValueType>(lhs.m_owner, lhs.m_index + rhs); } template inline certificate::base_iterator<_IteratorValueType> operator+(int lhs, const certificate::base_iterator<_IteratorValueType>& rhs) { return certificate::base_iterator<_IteratorValueType>(rhs.m_owner, rhs.m_index + lhs); } template inline certificate::base_iterator<_IteratorValueType> operator-(const certificate::base_iterator<_IteratorValueType>& lhs, int rhs) { return certificate::base_iterator<_IteratorValueType>(lhs.m_owner, lhs.m_index - rhs); } template inline certificate::base_iterator<_IteratorValueType> operator-(int lhs, const certificate::base_iterator<_IteratorValueType>& rhs) { return certificate::base_iterator<_IteratorValueType>(rhs.m_owner, rhs.m_index - lhs); } template inline typename certificate::base_iterator<_IteratorValueType>::difference_type operator-(const certificate::base_iterator<_IteratorValueType>& lhs, const certificate::base_iterator<_IteratorValueType>& rhs) { return lhs.m_index - rhs.m_index; } inline bool operator==(const certificate& lhs, const certificate& rhs) { return lhs.raw() == rhs.raw(); } inline bool operator!=(const certificate& lhs, const certificate& rhs) { return lhs.raw() != rhs.raw(); } inline std::ostream& operator<<(std::ostream& os, const certificate& value) { return os << value.to_string(); } } } #endif /* CRYPTOPLUS_X509_CERTIFICATE_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/x509/certificate_request.hpp000066400000000000000000000347611252300335000272670ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file certificate_request.hpp * \author Julien KAUFFMANN * \brief A X509 certificate request class. */ #ifndef CRYPTOPLUS_X509_CERTIFICATE_REQUEST_HPP #define CRYPTOPLUS_X509_CERTIFICATE_REQUEST_HPP #include "../pointer_wrapper.hpp" #include "../buffer.hpp" #include "../error/helpers.hpp" #include "../bio/bio_ptr.hpp" #include "../pkey/pkey.hpp" #include "../asn1/integer.hpp" #include "../asn1/utctime.hpp" #include "../file.hpp" #include "name.hpp" #include "extension.hpp" #include #include namespace cryptoplus { namespace x509 { /** * \brief A X509 certificate request. * * The certificate_request class represents a X509 certificate request. * * A certificate_request instance has the same semantic as a X509* pointer, thus two copies of the same instance share the same underlying pointer. * * \warning Always check for the object not to be NULL before calling any of its method. Calling any method (except raw()) on a null object has undefined behavior. */ class certificate_request : public pointer_wrapper { public: /** * \brief A PEM passphrase callback type. */ typedef int (*pem_passphrase_callback_type)(char*, int, int, void*); /** * \brief Create a new certificate_request. * \return The certificate_request. * * If allocation fails, an exception is thrown. */ static certificate_request create(); /** * \brief Take ownership of a specified X509 pointer. * \param ptr The pointer. Cannot be NULL. * \return A certificate_request. */ static certificate_request take_ownership(pointer ptr); /** * \brief Load a X509 certificate_request in DER format. * \param bio The BIO. * \return The certificate_request. */ static certificate_request from_der(bio::bio_ptr bio); /** * \brief Load a X509 certificate_request from a BIO. * \param bio The BIO. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The certificate_request. * * This function will also load a trusted certificate_request but without its 'trust' information. */ static certificate_request from_certificate_request(bio::bio_ptr bio, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a X509 certificate_request in DER format. * \param file The file. * \return The certificate_request. */ static certificate_request from_der(file file); /** * \brief Load a X509 certificate_request from a file. * \param file The file. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The certificate_request. * * This function will also load a trusted certificate_request but without its 'trust' information. */ static certificate_request from_certificate_request(file file, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a X509 certificate_request in DER format. * \param buf The buffer. * \param buf_len The length of buf. * \return The certificate_request. */ static certificate_request from_der(const void* buf, size_t buf_len); /** * \brief Load a X509 certificate_request in DER format. * \param buf The buffer. * \return The certificate_request. */ static certificate_request from_der(const buffer& buf); /** * \brief Load a X509 certificate_request from a buffer. * \param buf The buffer. * \param buf_len The length of buf. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The certificate_request. */ static certificate_request from_certificate_request(const void* buf, size_t buf_len, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Create a new empty X509 certificate_request. */ certificate_request(); /** * \brief Create a X509 certificate_request by *NOT* taking ownership of an existing X509* pointer. * \param ptr The X509* pointer. * \warning The caller is still responsible for freeing the memory. */ certificate_request(pointer ptr); /** * \brief Write the certificate_request in DER format to a BIO. * \param bio The BIO. */ void write_der(bio::bio_ptr bio) const; /** * \brief Write the certificate_request to a BIO. * \param bio The BIO. */ void write_certificate_request(bio::bio_ptr bio) const; /** * \brief Write the certificate_request in DER format to a file. * \param file The file. */ void write_der(file file) const; /** * \brief Write the certificate_request to a file. * \param file The file. */ void write_certificate_request(file file) const; /** * \brief Write the certificate_request in DER format to a buffer. * \param buf The buffer to write too. If NULL is specified, only the needed size is returned. * \return The size written or to be written. */ size_t write_der(void* buf) const; /** * \brief Write the certificate_request in DER format to a buffer. * \return The buffer. */ buffer write_der() const; /** * \brief Clone the certificate_request instance. * \return The clone. */ certificate_request clone() const; /** * \brief Print a X509 to a BIO. * \param bio The BIO. */ void print(bio::bio_ptr bio) const; /** * \brief Get the public key. * \return The public key. */ pkey::pkey public_key() const; /** * \brief Set the public key. * \param pkey The public key. */ void set_public_key(pkey::pkey pkey) const; /** * \brief Get the subject name. * \return The subject name. * \warning The returned name depends on the certificate_request instance and will be invalidated as soon as the underlying pointer is changed (or freed). */ name subject() const; /** * \brief Set the subject name. * \param aname The subject name that will be copied. */ void set_subject(name aname) const; /** * \brief Get the certificate_request version. * \return The version. */ long version() const; /** * \brief Set the certificate_request version. * \param version The version. */ void set_version(long version) const; /** * \brief Verify the certificate_request against a specified public key. * \param pkey The public pkey. * \return true if the verification succeeds. */ bool verify_public_key(pkey::pkey pkey) const; /** * \brief Sign the certificate_request. * \param pkey The private key. * \param algorithm The message digest to use. */ void sign(pkey::pkey pkey, hash::message_digest_algorithm algorithm) const; /** * \brief Verify the certificate_request against a specified private key. * \param pkey The private pkey. * \return true if the verification succeeds. */ bool verify_private_key(pkey::pkey pkey) const; private: certificate_request(pointer _ptr, deleter_type _del); }; /** * \brief Compare two certificate_request instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two certificate_request instances share the same underlying pointer. */ bool operator==(const certificate_request& lhs, const certificate_request& rhs); /** * \brief Compare two certificate_request instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two certificate_request instances do not share the same underlying pointer. */ bool operator!=(const certificate_request& lhs, const certificate_request& rhs); inline certificate_request certificate_request::create() { pointer _ptr = X509_REQ_new(); throw_error_if_not(_ptr); return take_ownership(_ptr); } inline certificate_request certificate_request::from_der(bio::bio_ptr bio) { return take_ownership(d2i_X509_REQ_bio(bio.raw(), NULL)); } inline certificate_request certificate_request::from_certificate_request(bio::bio_ptr bio, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_bio_X509_REQ(bio.raw(), NULL, callback, callback_arg)); } inline certificate_request certificate_request::from_der(file _file) { return take_ownership(d2i_X509_REQ_fp(_file.raw(), NULL)); } inline certificate_request certificate_request::from_certificate_request(file _file, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_X509_REQ(_file.raw(), NULL, callback, callback_arg)); } inline certificate_request certificate_request::from_der(const void* buf, size_t buf_len) { const unsigned char* pbuf = static_cast(buf); return take_ownership(d2i_X509_REQ(NULL, &pbuf, static_cast(buf_len))); } inline certificate_request certificate_request::from_der(const buffer& buf) { return from_der(buffer_cast(buf), buffer_size(buf)); } inline certificate_request::certificate_request() { } inline certificate_request::certificate_request(pointer _ptr) : pointer_wrapper(_ptr, null_deleter) { } inline void certificate_request::write_der(bio::bio_ptr bio) const { throw_error_if_not(i2d_X509_REQ_bio(bio.raw(), ptr().get()) != 0); } inline void certificate_request::write_certificate_request(bio::bio_ptr bio) const { throw_error_if_not(PEM_write_bio_X509_REQ(bio.raw(), ptr().get()) != 0); } inline void certificate_request::write_der(file _file) const { throw_error_if_not(i2d_X509_REQ_fp(_file.raw(), ptr().get()) != 0); } inline void certificate_request::write_certificate_request(file _file) const { throw_error_if_not(PEM_write_X509_REQ(_file.raw(), ptr().get()) != 0); } inline size_t certificate_request::write_der(void* buf) const { unsigned char* out = static_cast(buf); unsigned char** pout = out != NULL ? &out : NULL; int result = i2d_X509_REQ(ptr().get(), pout); throw_error_if(result < 0); return result; } inline buffer certificate_request::write_der() const { buffer result(write_der(static_cast(NULL))); write_der(buffer_cast(result)); return result; } inline certificate_request certificate_request::clone() const { return certificate_request(X509_REQ_dup(ptr().get())); } inline void certificate_request::print(bio::bio_ptr bio) const { throw_error_if_not(X509_REQ_print(bio.raw(), ptr().get()) != 0); } inline pkey::pkey certificate_request::public_key() const { return pkey::pkey(X509_REQ_get_pubkey(ptr().get())); } inline void certificate_request::set_public_key(pkey::pkey pkey) const { throw_error_if_not(X509_REQ_set_pubkey(ptr().get(), pkey.raw()) != 0); } inline name certificate_request::subject() const { return X509_REQ_get_subject_name(ptr().get()); } inline void certificate_request::set_subject(name _name) const { throw_error_if_not(X509_REQ_set_subject_name(ptr().get(), _name.raw()) != 0); } inline long certificate_request::version() const { return X509_REQ_get_version(ptr().get()); } inline void certificate_request::set_version(long _version) const { throw_error_if_not(X509_REQ_set_version(ptr().get(), _version) != 0); } inline bool certificate_request::verify_public_key(pkey::pkey pkey) const { return X509_REQ_verify(ptr().get(), pkey.raw()) == 1; } inline void certificate_request::sign(pkey::pkey pkey, hash::message_digest_algorithm algorithm) const { throw_error_if_not(X509_REQ_sign(ptr().get(), pkey.raw(), algorithm.raw()) != 0); } inline bool certificate_request::verify_private_key(pkey::pkey pkey) const { return X509_REQ_check_private_key(ptr().get(), pkey.raw()) == 1; } inline certificate_request::certificate_request(pointer _ptr, deleter_type _del) : pointer_wrapper(_ptr, _del) { } inline bool operator==(const certificate_request& lhs, const certificate_request& rhs) { return lhs.raw() == rhs.raw(); } inline bool operator!=(const certificate_request& lhs, const certificate_request& rhs) { return lhs.raw() != rhs.raw(); } } } #endif /* CRYPTOPLUS_X509_CERTIFICATE_request_REQUEST_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/x509/certificate_revocation_list.hpp000066400000000000000000001237201252300335000307750ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file certificate_revocation_list.hpp * \author Julien KAUFFMANN * \brief A X509 certificate revocation list class. */ #ifndef CRYPTOPLUS_X509_CRL_CERTIFICATE_REVOCATION_LIST_HPP #define CRYPTOPLUS_X509_CRL_CERTIFICATE_REVOCATION_LIST_HPP #include "../pointer_wrapper.hpp" #include "../buffer.hpp" #include "../error/helpers.hpp" #include "../bio/bio_ptr.hpp" #include "../pkey/pkey.hpp" #include "../asn1/utctime.hpp" #include "../file.hpp" #include "name.hpp" #include "extension.hpp" #include #include namespace cryptoplus { namespace x509 { /** * \brief A X509 certificate revocation list. * * The certificate_revocation_list class represents a X509 certificate revocation list. * * A certificate_revocation_list instance has the same semantic as a X509_CRL* pointer, thus two copies of the same instance share the same underlying pointer. * * \warning Always check for the object not to be NULL before calling any of its method. Calling any method (except raw()) on a null object has undefined behavior. */ class certificate_revocation_list : public pointer_wrapper { public: /** * \brief The wrapped value type. */ typedef extension wrapped_value_type; /** * \brief The wrapper pointer type. */ typedef wrapped_value_type* wrapped_pointer; /** * \brief An iterator class. */ template class base_iterator : public std::iterator { public: /** * \brief Create an empty iterator. */ base_iterator(); /** * \brief Dereference operator. * \return The value. */ typename base_iterator::reference operator*() const; /** * \brief Dereference operator. * \return The value. */ typename base_iterator::pointer operator->() const; /** * \brief Dereference operator. * \param index The index to add or substract. * \return An iterator. */ typename base_iterator::reference operator[](int index) const; /** * \brief Increment the iterator. * \return A reference to this. */ base_iterator& operator++(); /** * \brief Increment the iterator. * \return The old value. */ base_iterator operator++(int); /** * \brief Decrement the iterator. * \return A reference to this. */ base_iterator& operator--(); /** * \brief Decrement the iterator. * \return The old value. */ base_iterator operator--(int); /** * \brief Increment the iterator. * \param cnt The number to add to the iterator. * \return A reference to this. */ base_iterator& operator+=(int cnt); /** * \brief Decrement the iterator. * \param cnt The number to substract from the iterator. * \return A reference to this. */ base_iterator& operator-=(int cnt); private: base_iterator(IteratorValueType*, int); IteratorValueType* m_owner; int m_index; typename IteratorValueType::wrapped_value_type m_cache; friend class certificate_revocation_list; template friend bool operator==(const certificate_revocation_list::base_iterator<_IteratorValueType>& lhs, const certificate_revocation_list::base_iterator<_IteratorValueType>& rhs); template friend bool operator!=(const certificate_revocation_list::base_iterator<_IteratorValueType>& lhs, const certificate_revocation_list::base_iterator<_IteratorValueType>& rhs); template friend bool operator<(const certificate_revocation_list::base_iterator<_IteratorValueType>& lhs, const certificate_revocation_list::base_iterator<_IteratorValueType>& rhs); template friend bool operator<=(const certificate_revocation_list::base_iterator<_IteratorValueType>& lhs, const certificate_revocation_list::base_iterator<_IteratorValueType>& rhs); template friend bool operator>(const certificate_revocation_list::base_iterator<_IteratorValueType>& lhs, const certificate_revocation_list::base_iterator<_IteratorValueType>& rhs); template friend bool operator>=(const certificate_revocation_list::base_iterator<_IteratorValueType>& lhs, const certificate_revocation_list::base_iterator<_IteratorValueType>& rhs); template friend certificate_revocation_list::base_iterator<_IteratorValueType> operator+(const certificate_revocation_list::base_iterator<_IteratorValueType>& lhs, int rhs); template friend certificate_revocation_list::base_iterator<_IteratorValueType> operator+(int lhs, const certificate_revocation_list::base_iterator<_IteratorValueType>& rhs); template friend certificate_revocation_list::base_iterator<_IteratorValueType> operator-(const certificate_revocation_list::base_iterator<_IteratorValueType>& lhs, int rhs); template friend certificate_revocation_list::base_iterator<_IteratorValueType> operator-(int lhs, const certificate_revocation_list::base_iterator<_IteratorValueType>& rhs); template friend typename certificate_revocation_list::base_iterator<_IteratorValueType>::difference_type operator-(const certificate_revocation_list::base_iterator<_IteratorValueType>& lhs, const certificate_revocation_list::base_iterator<_IteratorValueType>& rhs); }; /** * \brief The iterator type. */ typedef base_iterator iterator; /** * \brief The iterator type. */ typedef base_iterator const_iterator; /** * \brief Reverse iterator type. */ typedef std::reverse_iterator reverse_iterator; /** * \brief Const reverse iterator type. */ typedef std::reverse_iterator reverse_const_iterator; /** * \brief A PEM passphrase callback type. */ typedef int (*pem_passphrase_callback_type)(char*, int, int, void*); /** * \brief Create a new certificate_revocation_list. * \return The certificate_revocation_list. * * If allocation fails, an exception is thrown. */ static certificate_revocation_list create(); /** * \brief Take ownership of a specified X509_CRL pointer. * \param ptr The pointer. Cannot be NULL. * \return A certificate_revocation_list. */ static certificate_revocation_list take_ownership(pointer ptr); /** * \brief Load a X509_CRL certificate_revocation_list in DER format. * \param bio The BIO. * \return The certificate_revocation_list. */ static certificate_revocation_list from_der(bio::bio_ptr bio); /** * \brief Load a X509_CRL certificate_revocation_list from a BIO. * \param bio The BIO. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The certificate_revocation_list. * * This function will also load a trusted certificate_revocation_list but without its 'trust' information. */ static certificate_revocation_list from_certificate_revocation_list(bio::bio_ptr bio, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a X509_CRL certificate_revocation_list in DER format. * \param file The file. * \return The certificate_revocation_list. */ static certificate_revocation_list from_der(file file); /** * \brief Load a X509_CRL certificate_revocation_list from a file. * \param file The file. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The certificate_revocation_list. * * This function will also load a trusted certificate_revocation_list but without its 'trust' information. */ static certificate_revocation_list from_certificate_revocation_list(file file, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Load a X509_CRL certificate_revocation_list in DER format. * \param buf The buffer. * \param buf_len The length of buf. * \return The certificate_revocation_list. */ static certificate_revocation_list from_der(const void* buf, size_t buf_len); /** * \brief Load a X509_CRL certificate_revocation_list in DER format. * \param buf The buffer. * \return The certificate_revocation_list. */ static certificate_revocation_list from_der(const buffer& buf); /** * \brief Load a X509_CRL certificate_revocation_list from a buffer. * \param buf The buffer. * \param buf_len The length of buf. * \param callback A callback that will get called whenever a passphrase is needed. Can be NULL, in such case no passphrase is used. * \param callback_arg An argument that will be passed to callback, if needed. * \return The certificate_revocation_list. */ static certificate_revocation_list from_certificate_revocation_list(const void* buf, size_t buf_len, pem_passphrase_callback_type callback = NULL, void* callback_arg = NULL); /** * \brief Create a new empty X509_CRL certificate_revocation_list. */ certificate_revocation_list(); /** * \brief Create a X509_CRL certificate_revocation_list by *NOT* taking ownership of an existing X509_CRL* pointer. * \param ptr The X509_CRL* pointer. * \warning The caller is still responsible for freeing the memory. */ certificate_revocation_list(pointer ptr); /** * \brief Write the certificate_revocation_list in DER format to a BIO. * \param bio The BIO. */ void write_der(bio::bio_ptr bio) const; /** * \brief Write the certificate_revocation_list to a BIO. * \param bio The BIO. */ void write_certificate_revocation_list(bio::bio_ptr bio) const; /** * \brief Write the certificate_revocation_list in DER format to a file. * \param file The file. */ void write_der(file file) const; /** * \brief Write the certificate_revocation_list to a file. * \param file The file. */ void write_certificate_revocation_list(file file) const; /** * \brief Write the certificate_revocation_list in DER format to a buffer. * \param buf The buffer to write too. If NULL is specified, only the needed size is returned. * \return The size written or to be written. */ size_t write_der(void* buf) const; /** * \brief Write the certificate_revocation_list in DER format to a buffer. * \return The buffer. */ buffer write_der() const; /** * \brief Clone the certificate_revocation_list instance. * \return The clone. */ certificate_revocation_list clone() const; /** * \brief Print a X509_CRL to a BIO. * \param bio The BIO. */ void print(bio::bio_ptr bio) const; /** * \brief Get the count of entries. * \return The count of entries. */ int count() const; /** * \brief Get the entry at the specified position. * \param index The index. Must be a valid index position or the behavior is undefined. See count(). * \return The name entry. * \see count(). */ wrapped_value_type operator[](int index) const; /** * \brief Get the begin iterator. * \return The begin iterator. */ const_iterator begin() const; /** * \brief Get the begin iterator. * \return The begin iterator. */ iterator begin(); /** * \brief Get the end iterator. * \return The end iterator. */ const_iterator end() const; /** * \brief Get the end iterator. * \return The end iterator. */ iterator end(); /** * \brief Get the reverse begin iterator. * \return The reverse begin iterator. */ reverse_const_iterator rbegin() const; /** * \brief Get the reverse begin iterator. * \return The reverse begin iterator. */ reverse_iterator rbegin(); /** * \brief Get the reverse end iterator. * \return The reverse end iterator. */ reverse_const_iterator rend() const; /** * \brief Get the reverse end iterator. * \return The reverse end iterator. */ reverse_iterator rend(); /** * \brief Erase the given entry. * \param it An iterator to the entry to erase. * \return The next iterator. */ const_iterator erase(const_iterator it) const; /** * \brief Erase the given entry. * \param it An iterator to the entry to erase. * \return The next iterator. */ iterator erase(iterator it); /** * \brief Erase the given entries. * \param first The first iterator. * \param last The last iterator. * \return last. */ const_iterator erase(const_iterator first, const_iterator last) const; /** * \brief Erase the given entries. * \param first The first iterator. * \param last The last iterator. * \return last. */ iterator erase(iterator first, iterator last); /** * \brief Find an extension by its NID. * \param nid The nid. * \return An iterator to the first extension that matches, or end() if none is found. */ const_iterator find(int nid) const; /** * \brief Find an extension by its NID. * \param nid The nid. * \return An iterator to the first extension that matches, or end() if none is found. */ iterator find(int nid); /** * \brief Find an extension by its NID. * \param nid The nid. * \param lastpos The iterator to start the search after. * \return An iterator to an extension that matches, or end() if none is found. */ const_iterator find(int nid, const_iterator lastpos) const; /** * \brief Find an extension by its NID. * \param nid The nid. * \param lastpos The iterator to start the search after. * \return An iterator to an extension that matches, or end() if none is found. */ iterator find(int nid, iterator lastpos); /** * \brief Find an extension by its ASN1 object. * \param object The ASN1 object. * \return An iterator to the first extension that matches, or end() if none is found. */ const_iterator find(asn1::object object) const; /** * \brief Find an extension by its ASN1 object. * \param object The ASN1 object. * \return An iterator to the first extension that matches, or end() if none is found. */ iterator find(asn1::object object); /** * \brief Find an extension by its ASN1 object. * \param object The ASN1 object. * \param lastpos The iterator to start the search after. * \return An iterator to an extension that matches, or end() if none is found. */ const_iterator find(asn1::object object, const_iterator lastpos) const; /** * \brief Find an extension by its ASN1 object. * \param object The ASN1 object. * \param lastpos The iterator to start the search after. * \return An iterator to an extension that matches, or end() if none is found. */ iterator find(asn1::object object, iterator lastpos); /** * \brief Find an extension by its critical flag. * \param critical The critical flag. * \return An iterator to the first extension that matches, or end() if none is found. */ const_iterator find_by_critical(bool critical) const; /** * \brief Find an extension by its critical flag. * \param critical The critical flag. * \return An iterator to the first extension that matches, or end() if none is found. */ iterator find_by_critical(bool critical); /** * \brief Find an extension by its critical flag. * \param critical The critical flag. * \param lastpos The iterator to start the search after. * \return An iterator to an extension that matches, or end() if none is found. */ const_iterator find_by_critical(bool critical, const_iterator lastpos) const; /** * \brief Find an extension by its critical flag. * \param critical The critical flag. * \param lastpos The iterator to start the search after. * \return An iterator to an extension that matches, or end() if none is found. */ iterator find_by_critical(bool critical, iterator lastpos); /** * \brief Clear all extensions. */ void clear() const; /** * \brief Push a copy of the specified extension at the end of the extension table. * \param ext The extension */ void push_back(wrapped_value_type ext) const; /** * \brief Insert a copy of the specified extension in the extension table. * \param position The position to insert the extension at. * \param ext The extension. * \return An iterator to the extension that was added. */ const_iterator insert(const_iterator position, wrapped_value_type ext) const; /** * \brief Insert a copy of the specified extension in the extension table. * \param position The position to insert the extension at. * \param ext The extension. * \return An iterator to the extension that was added. */ iterator insert(iterator position, wrapped_value_type ext); /** * \brief Set the issuer name. * \param aname The issuer name that will be copied. */ void set_issuer(name aname) const; /** * \brief Get the certificate_revocation_list version. * \return The version. */ long version() const; /** * \brief Set the certificate_revocation_list version. * \param version The version. */ void set_version(long version) const; /** * \brief Verify the certificate_revocation_list against a specified public key. * \param pkey The public pkey. * \return true if the verification succeeds. */ bool verify_public_key(pkey::pkey pkey) const; /** * \brief Sign the certificate_revocation_list. * \param pkey The private key. * \param algorithm The message digest to use. */ void sign(pkey::pkey pkey, hash::message_digest_algorithm algorithm) const; private: certificate_revocation_list(pointer _ptr, deleter_type _del); }; /** * \brief Compare two certificate_revocation_list::iterator instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two certificate_revocation_list::iterator instances point to the same element. */ template bool operator==(const certificate_revocation_list::base_iterator& lhs, const certificate_revocation_list::base_iterator& rhs); /** * \brief Compare two certificate_revocation_list::iterator instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two certificate_revocation_list::iterator instances do not point to the same element. */ template bool operator!=(const certificate_revocation_list::base_iterator& lhs, const certificate_revocation_list::base_iterator& rhs); /** * \brief Compare two certificate_revocation_list::iterator instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if lhs is smaller than rhs. */ template bool operator<(const certificate_revocation_list::base_iterator& lhs, const certificate_revocation_list::base_iterator& rhs); /** * \brief Compare two certificate_revocation_list::iterator instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if lhs is smaller than or equal to rhs. */ template bool operator<=(const certificate_revocation_list::base_iterator& lhs, const certificate_revocation_list::base_iterator& rhs); /** * \brief Compare two certificate_revocation_list::iterator instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if lhs is greater than rhs. */ template bool operator>(const certificate_revocation_list::base_iterator& lhs, const certificate_revocation_list::base_iterator& rhs); /** * \brief Compare two certificate_revocation_list::iterator instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if lhs is greater than or equal to rhs. */ template bool operator>=(const certificate_revocation_list::base_iterator& lhs, const certificate_revocation_list::base_iterator& rhs); /** * \brief Add an integer value to an iterator. * \param lhs The left argument. * \param rhs The right argument. * \return The new iterator. */ template certificate_revocation_list::base_iterator operator+(const certificate_revocation_list::base_iterator& lhs, int rhs); /** * \brief Add an integer value to an iterator. * \param lhs The left argument. * \param rhs The right argument. * \return The new iterator. */ template certificate_revocation_list::base_iterator operator+(int lhs, const certificate_revocation_list::base_iterator& rhs); /** * \brief Substract an integer value from an iterator. * \param lhs The left argument. * \param rhs The right argument. * \return The new iterator. */ template certificate_revocation_list::base_iterator operator-(const certificate_revocation_list::base_iterator& lhs, int rhs); /** * \brief Substract an integer value from an iterator. * \param lhs The left argument. * \param rhs The right argument. * \return The new iterator. */ template certificate_revocation_list::base_iterator operator-(int lhs, const certificate_revocation_list::base_iterator& rhs); /** * \brief Substract a iterator from another iterator and gets the index distance. * \param lhs The left argument. * \param rhs The right argument. * \return The distance. */ template typename certificate_revocation_list::base_iterator::difference_type operator-(const certificate_revocation_list::base_iterator& lhs, const certificate_revocation_list::base_iterator& rhs); /** * \brief Compare two certificate_revocation_list instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two certificate_revocation_list instances share the same underlying pointer. */ bool operator==(const certificate_revocation_list& lhs, const certificate_revocation_list& rhs); /** * \brief Compare two certificate_revocation_list instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two certificate_revocation_list instances do not share the same underlying pointer. */ bool operator!=(const certificate_revocation_list& lhs, const certificate_revocation_list& rhs); template inline certificate_revocation_list::base_iterator::base_iterator() : m_owner(NULL), m_index(0) { } template inline typename certificate_revocation_list::base_iterator::reference certificate_revocation_list::base_iterator::operator*() const { return (m_cache = (*m_owner)[m_index]); } template inline typename certificate_revocation_list::base_iterator::pointer certificate_revocation_list::base_iterator::operator->() const { return &operator*(); } template inline typename certificate_revocation_list::base_iterator::reference certificate_revocation_list::base_iterator::operator[](int index) const { return *iterator(m_owner, m_index + index); } template inline certificate_revocation_list::base_iterator& certificate_revocation_list::base_iterator::operator++() { ++m_index; return *this; } template inline certificate_revocation_list::base_iterator certificate_revocation_list::base_iterator::operator++(int) { iterator old = *this; ++m_index; return old; } template inline certificate_revocation_list::base_iterator& certificate_revocation_list::base_iterator::operator--() { --m_index; return *this; } template inline certificate_revocation_list::base_iterator certificate_revocation_list::base_iterator::operator--(int) { iterator old = *this; --m_index; return old; } template inline certificate_revocation_list::base_iterator& certificate_revocation_list::base_iterator::operator+=(int cnt) { m_index += cnt; return *this; } template inline certificate_revocation_list::base_iterator& certificate_revocation_list::base_iterator::operator-=(int cnt) { m_index -= cnt; return *this; } template inline certificate_revocation_list::base_iterator::base_iterator(IteratorValueType* _certificate_revocation_list, int index) : m_owner(_certificate_revocation_list), m_index(index) { } inline certificate_revocation_list certificate_revocation_list::create() { pointer _ptr = X509_CRL_new(); throw_error_if_not(_ptr); return take_ownership(_ptr); } inline certificate_revocation_list certificate_revocation_list::from_der(bio::bio_ptr bio) { return take_ownership(d2i_X509_CRL_bio(bio.raw(), NULL)); } inline certificate_revocation_list certificate_revocation_list::from_certificate_revocation_list(bio::bio_ptr bio, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_bio_X509_CRL(bio.raw(), NULL, callback, callback_arg)); } inline certificate_revocation_list certificate_revocation_list::from_der(file _file) { return take_ownership(d2i_X509_CRL_fp(_file.raw(), NULL)); } inline certificate_revocation_list certificate_revocation_list::from_certificate_revocation_list(file _file, pem_passphrase_callback_type callback, void* callback_arg) { return take_ownership(PEM_read_X509_CRL(_file.raw(), NULL, callback, callback_arg)); } inline certificate_revocation_list certificate_revocation_list::from_der(const void* buf, size_t buf_len) { const unsigned char* pbuf = static_cast(buf); return take_ownership(d2i_X509_CRL(NULL, &pbuf, static_cast(buf_len))); } inline certificate_revocation_list certificate_revocation_list::from_der(const buffer& buf) { return from_der(buffer_cast(buf), buffer_size(buf)); } inline certificate_revocation_list::certificate_revocation_list() { } inline certificate_revocation_list::certificate_revocation_list(pointer _ptr) : pointer_wrapper(_ptr, null_deleter) { } inline void certificate_revocation_list::write_der(bio::bio_ptr bio) const { throw_error_if_not(i2d_X509_CRL_bio(bio.raw(), ptr().get()) != 0); } inline void certificate_revocation_list::write_certificate_revocation_list(bio::bio_ptr bio) const { throw_error_if_not(PEM_write_bio_X509_CRL(bio.raw(), ptr().get()) != 0); } inline void certificate_revocation_list::write_der(file _file) const { throw_error_if_not(i2d_X509_CRL_fp(_file.raw(), ptr().get()) != 0); } inline void certificate_revocation_list::write_certificate_revocation_list(file _file) const { throw_error_if_not(PEM_write_X509_CRL(_file.raw(), ptr().get()) != 0); } inline size_t certificate_revocation_list::write_der(void* buf) const { unsigned char* out = static_cast(buf); unsigned char** pout = out != NULL ? &out : NULL; int result = i2d_X509_CRL(ptr().get(), pout); throw_error_if(result < 0); return result; } inline buffer certificate_revocation_list::write_der() const { buffer result(write_der(static_cast(NULL))); write_der(buffer_cast(result)); return result; } inline certificate_revocation_list certificate_revocation_list::clone() const { return certificate_revocation_list(X509_CRL_dup(ptr().get())); } inline void certificate_revocation_list::print(bio::bio_ptr bio) const { throw_error_if_not(X509_CRL_print(bio.raw(), ptr().get()) != 0); } inline int certificate_revocation_list::count() const { return X509_CRL_get_ext_count(ptr().get()); } inline certificate_revocation_list::wrapped_value_type certificate_revocation_list::operator[](int index) const { return wrapped_value_type(X509_CRL_get_ext(ptr().get(), index)); } inline certificate_revocation_list::const_iterator certificate_revocation_list::begin() const { return const_iterator(this, 0); } inline certificate_revocation_list::iterator certificate_revocation_list::begin() { return iterator(this, 0); } inline certificate_revocation_list::const_iterator certificate_revocation_list::end() const { return const_iterator(this, count()); } inline certificate_revocation_list::iterator certificate_revocation_list::end() { return iterator(this, count()); } inline certificate_revocation_list::reverse_const_iterator certificate_revocation_list::rbegin() const { return reverse_const_iterator(end()); } inline certificate_revocation_list::reverse_iterator certificate_revocation_list::rbegin() { return reverse_iterator(end()); } inline certificate_revocation_list::reverse_const_iterator certificate_revocation_list::rend() const { return reverse_const_iterator(begin()); } inline certificate_revocation_list::reverse_iterator certificate_revocation_list::rend() { return reverse_iterator(begin()); } inline certificate_revocation_list::const_iterator certificate_revocation_list::erase(const_iterator it) const { wrapped_value_type::take_ownership(X509_CRL_delete_ext(it.m_owner->ptr().get(), it.m_index)); return it; } inline certificate_revocation_list::iterator certificate_revocation_list::erase(iterator it) { wrapped_value_type::take_ownership(X509_CRL_delete_ext(it.m_owner->ptr().get(), it.m_index)); return it; } inline certificate_revocation_list::const_iterator certificate_revocation_list::erase(const_iterator first, const_iterator last) const { while (first != last) first = erase(first); return first; } inline certificate_revocation_list::iterator certificate_revocation_list::erase(iterator first, iterator last) { while (first != last) first = erase(first); return first; } inline certificate_revocation_list::const_iterator certificate_revocation_list::find(int nid) const { int index = X509_CRL_get_ext_by_NID(ptr().get(), nid, -1); return (index < 0) ? end() : const_iterator(this, index); } inline certificate_revocation_list::iterator certificate_revocation_list::find(int nid) { int index = X509_CRL_get_ext_by_NID(ptr().get(), nid, -1); return (index < 0) ? end() : iterator(this, index); } inline certificate_revocation_list::const_iterator certificate_revocation_list::find(int nid, const_iterator lastpos) const { int index = X509_CRL_get_ext_by_NID(ptr().get(), nid, lastpos.m_index); return (index < 0) ? end() : const_iterator(this, index); } inline certificate_revocation_list::iterator certificate_revocation_list::find(int nid, iterator lastpos) { int index = X509_CRL_get_ext_by_NID(ptr().get(), nid, lastpos.m_index); return (index < 0) ? end() : iterator(this, index); } inline certificate_revocation_list::const_iterator certificate_revocation_list::find(asn1::object object) const { int index = X509_CRL_get_ext_by_OBJ(ptr().get(), object.raw(), -1); return (index < 0) ? end() : const_iterator(this, index); } inline certificate_revocation_list::iterator certificate_revocation_list::find(asn1::object object) { int index = X509_CRL_get_ext_by_OBJ(ptr().get(), object.raw(), -1); return (index < 0) ? end() : iterator(this, index); } inline certificate_revocation_list::const_iterator certificate_revocation_list::find(asn1::object object, const_iterator lastpos) const { int index = X509_CRL_get_ext_by_OBJ(ptr().get(), object.raw(), lastpos.m_index); return (index < 0) ? end() : const_iterator(this, index); } inline certificate_revocation_list::iterator certificate_revocation_list::find(asn1::object object, iterator lastpos) { int index = X509_CRL_get_ext_by_OBJ(ptr().get(), object.raw(), lastpos.m_index); return (index < 0) ? end() : iterator(this, index); } inline certificate_revocation_list::const_iterator certificate_revocation_list::find_by_critical(bool critical) const { int index = X509_CRL_get_ext_by_critical(ptr().get(), critical ? 1 : 0, -1); return (index < 0) ? end() : const_iterator(this, index); } inline certificate_revocation_list::iterator certificate_revocation_list::find_by_critical(bool critical) { int index = X509_CRL_get_ext_by_critical(ptr().get(), critical ? 1 : 0, -1); return (index < 0) ? end() : iterator(this, index); } inline certificate_revocation_list::const_iterator certificate_revocation_list::find_by_critical(bool critical, const_iterator lastpos) const { int index = X509_CRL_get_ext_by_critical(ptr().get(), critical ? 1 : 0, lastpos.m_index); return (index < 0) ? end() : const_iterator(this, index); } inline certificate_revocation_list::iterator certificate_revocation_list::find_by_critical(bool critical, iterator lastpos) { int index = X509_CRL_get_ext_by_critical(ptr().get(), critical ? 1 : 0, lastpos.m_index); return (index < 0) ? end() : iterator(this, index); } inline void certificate_revocation_list::clear() const { erase(begin(), end()); } inline void certificate_revocation_list::push_back(wrapped_value_type ext) const { throw_error_if_not(X509_CRL_add_ext(ptr().get(), ext.raw(), -1) != 0); } inline certificate_revocation_list::const_iterator certificate_revocation_list::insert(const_iterator position, wrapped_value_type ext) const { assert(position.m_owner == this); throw_error_if_not(X509_CRL_add_ext(ptr().get(), ext.raw(), position.m_index) != 0); return position; } inline certificate_revocation_list::iterator certificate_revocation_list::insert(iterator position, wrapped_value_type ext) { assert(position.m_owner == this); throw_error_if_not(X509_CRL_add_ext(ptr().get(), ext.raw(), position.m_index) != 0); return position; } inline void certificate_revocation_list::set_issuer(name _name) const { throw_error_if_not(X509_CRL_set_issuer_name(ptr().get(), _name.raw()) != 0); } inline long certificate_revocation_list::version() const { return X509_CRL_get_version(ptr().get()); } inline void certificate_revocation_list::set_version(long _version) const { throw_error_if_not(X509_CRL_set_version(ptr().get(), _version) != 0); } inline bool certificate_revocation_list::verify_public_key(pkey::pkey pkey) const { return X509_CRL_verify(ptr().get(), pkey.raw()) == 1; } inline void certificate_revocation_list::sign(pkey::pkey pkey, hash::message_digest_algorithm algorithm) const { throw_error_if_not(X509_CRL_sign(ptr().get(), pkey.raw(), algorithm.raw()) != 0); } inline certificate_revocation_list::certificate_revocation_list(pointer _ptr, deleter_type _del) : pointer_wrapper(_ptr, _del) { } template inline bool operator==(const certificate_revocation_list::base_iterator<_IteratorValueType>& lhs, const certificate_revocation_list::base_iterator<_IteratorValueType>& rhs) { assert(lhs.m_owner == rhs.m_owner); return (lhs.m_index == rhs.m_index); } template inline bool operator!=(const certificate_revocation_list::base_iterator<_IteratorValueType>& lhs, const certificate_revocation_list::base_iterator<_IteratorValueType>& rhs) { assert(lhs.m_owner == rhs.m_owner); return (lhs.m_index != rhs.m_index); } template inline bool operator<(const certificate_revocation_list::base_iterator<_IteratorValueType>& lhs, const certificate_revocation_list::base_iterator<_IteratorValueType>& rhs) { assert(lhs.m_owner == rhs.m_owner); return (lhs.m_index < rhs.m_index); } template inline bool operator<=(const certificate_revocation_list::base_iterator<_IteratorValueType>& lhs, const certificate_revocation_list::base_iterator<_IteratorValueType>& rhs) { assert(lhs.m_owner == rhs.m_owner); return (lhs.m_index <= rhs.m_index); } template inline bool operator>(const certificate_revocation_list::base_iterator<_IteratorValueType>& lhs, const certificate_revocation_list::base_iterator<_IteratorValueType>& rhs) { assert(lhs.m_owner == rhs.m_owner); return (lhs.m_index > rhs.m_index); } template inline bool operator>=(const certificate_revocation_list::base_iterator<_IteratorValueType>& lhs, const certificate_revocation_list::base_iterator<_IteratorValueType>& rhs) { assert(lhs.m_owner == rhs.m_owner); return (lhs.m_index >= rhs.m_index); } template inline certificate_revocation_list::base_iterator<_IteratorValueType> operator+(const certificate_revocation_list::base_iterator<_IteratorValueType>& lhs, int rhs) { return certificate_revocation_list::base_iterator<_IteratorValueType>(lhs.m_owner, lhs.m_index + rhs); } template inline certificate_revocation_list::base_iterator<_IteratorValueType> operator+(int lhs, const certificate_revocation_list::base_iterator<_IteratorValueType>& rhs) { return certificate_revocation_list::base_iterator<_IteratorValueType>(rhs.m_owner, rhs.m_index + lhs); } template inline certificate_revocation_list::base_iterator<_IteratorValueType> operator-(const certificate_revocation_list::base_iterator<_IteratorValueType>& lhs, int rhs) { return certificate_revocation_list::base_iterator<_IteratorValueType>(lhs.m_owner, lhs.m_index - rhs); } template inline certificate_revocation_list::base_iterator<_IteratorValueType> operator-(int lhs, const certificate_revocation_list::base_iterator<_IteratorValueType>& rhs) { return certificate_revocation_list::base_iterator<_IteratorValueType>(rhs.m_owner, rhs.m_index - lhs); } template inline typename certificate_revocation_list::base_iterator<_IteratorValueType>::difference_type operator-(const certificate_revocation_list::base_iterator<_IteratorValueType>& lhs, const certificate_revocation_list::base_iterator<_IteratorValueType>& rhs) { return lhs.m_index - rhs.m_index; } inline bool operator==(const certificate_revocation_list& lhs, const certificate_revocation_list& rhs) { return lhs.raw() == rhs.raw(); } inline bool operator!=(const certificate_revocation_list& lhs, const certificate_revocation_list& rhs) { return lhs.raw() != rhs.raw(); } } } #endif /* CRYPTOPLUS_X509_CRL_CERTIFICATE_REVOCATION_LIST_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/x509/extension.hpp000066400000000000000000000230261252300335000252410ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file extension.hpp * \author Julien KAUFFMANN * \brief A X509 extension class. */ #ifndef CRYPTOPLUS_X509_EXTENSION_HPP #define CRYPTOPLUS_X509_EXTENSION_HPP #include "../pointer_wrapper.hpp" #include "../buffer.hpp" #include "../error/helpers.hpp" #include "../asn1/object.hpp" #include "../asn1/string.hpp" #include "x509v3_context.hpp" #include #include namespace cryptoplus { namespace x509 { /** * \brief A X509 extension. * * The extension class represents a X509 extension. * * A extension instance has the same semantic as a X509_EXTENSION* pointer, thus two copies of the same instance share the same underlying pointer. * * \warning Always check for the object not to be NULL before calling any of its method. Calling any method (except raw()) on a null object has undefined behavior. */ class extension : public pointer_wrapper { public: /** * \brief Create a new extension. * \return An extension. * * If allocation fails, an exception is thrown. */ static extension create(); /** * \brief Take ownership of a specified X509_EXTENSION pointer. * \param ptr The pointer. Cannot be NULL. * \return An extension. */ static extension take_ownership(pointer ptr); /** * \brief Load a X509 extension in DER format. * \param buf The buffer. * \param buf_len The length of buf. * \return An extension. */ static extension from_der(const void* buf, size_t buf_len); /** * \brief Load a X509 extension in DER format. * \param buf The buffer. * \return An extension. */ static extension from_der(const buffer& buf); /** * \brief Create an extension from a nid and its data. * \param nid The nid. * \param critical The critical flag. * \param data The data. * \return An extension. */ static extension from_nid(int nid, bool critical, asn1::string data); /** * \brief Create an extension from an ASN1 object and its data. * \param obj The ASN1 object. * \param critical The critical flag. * \param data The data. * \return An extension. */ static extension from_obj(asn1::object obj, bool critical, asn1::string data); /** * \brief Create an extension from a nid and its value, using a configuration file and a context. * \param nid The nid. * \param value The value. * \param ctx The context. Can be NULL (defaut). * \param conf The configuration file. Can be NULL (default). * \return An extension. */ static extension from_nconf_nid(int nid, const char* value, x509v3_context ctx = NULL, CONF* conf = NULL); /** * \brief Create a new empty extension. */ extension(); /** * \brief Create a X509 extension by *NOT* taking ownership of an existing X509_EXTENSION* pointer. * \param ptr The X509_EXTENSION* pointer. * \warning The caller is still responsible for freeing the memory. */ extension(pointer ptr); /** * \brief Write the extension in DER format to a buffer. * \param buf The buffer to write too. If NULL is specified, only the needed size is returned. * \return The size written or to be written. */ size_t write_der(void* buf) const; /** * \brief Write the extension in DER format to a buffer. * \return The buffer. */ buffer write_der() const; /** * \brief Clone the extension instance. * \return The clone. */ extension clone() const; /** * \brief Get the object. * \return The ASN1 object. */ asn1::object object() const; /** * \brief Set the object. * \param obj The ASN1 object. */ void set_object(asn1::object obj) const; /** * \brief Get the critical flag. * \return The critical flag. */ bool critical() const; /** * \brief Set the critical flag. * \param critical The critical flag. */ void set_critical(bool critical) const; /** * \brief Get the data. * \return The data. */ asn1::string data() const; /** * \brief Set the data. * \param data The data. */ void set_data(asn1::string data) const; private: extension(pointer _ptr, deleter_type _del); }; /** * \brief Compare two extension instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two extension instances share the same underlying pointer. */ bool operator==(const extension& lhs, const extension& rhs); /** * \brief Compare two extension instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two extension instances do not share the same underlying pointer. */ bool operator!=(const extension& lhs, const extension& rhs); inline extension extension::create() { pointer _ptr = X509_EXTENSION_new(); throw_error_if_not(_ptr); return take_ownership(_ptr); } inline extension extension::from_der(const void* buf, size_t buf_len) { const unsigned char* pbuf = static_cast(buf); return take_ownership(d2i_X509_EXTENSION(NULL, &pbuf, static_cast(buf_len))); } inline extension extension::from_der(const buffer& buf) { return from_der(buffer_cast(buf), buffer_size(buf)); } inline extension extension::from_nid(int nid, bool critical, asn1::string data) { return take_ownership(X509_EXTENSION_create_by_NID(NULL, nid, critical ? 1 : 0, data.raw())); } inline extension extension::from_obj(asn1::object obj, bool critical, asn1::string data) { return take_ownership(X509_EXTENSION_create_by_OBJ(NULL, obj.raw(), critical ? 1 : 0, data.raw())); } inline extension extension::from_nconf_nid(int nid, const char* value, x509v3_context ctx, CONF* conf) { return take_ownership(X509V3_EXT_nconf_nid(conf, ctx.raw(), nid, const_cast(value))); } inline extension::extension() { } inline extension::extension(pointer _ptr) : pointer_wrapper(_ptr, null_deleter) { } inline size_t extension::write_der(void* buf) const { unsigned char* out = static_cast(buf); unsigned char** pout = out != NULL ? &out : NULL; int result = i2d_X509_EXTENSION(ptr().get(), pout); throw_error_if(result < 0); return result; } inline buffer extension::write_der() const { buffer result(write_der(static_cast(NULL))); write_der(buffer_cast(result)); return result; } inline extension extension::clone() const { return extension(X509_EXTENSION_dup(ptr().get())); } inline asn1::object extension::object() const { return X509_EXTENSION_get_object(ptr().get()); } inline void extension::set_object(asn1::object obj) const { throw_error_if_not(X509_EXTENSION_set_object(ptr().get(), obj.raw()) != 0); } inline bool extension::critical() const { return (X509_EXTENSION_get_critical(ptr().get()) != 0); } inline void extension::set_critical(bool _critical) const { throw_error_if_not(X509_EXTENSION_set_critical(ptr().get(), _critical ? 1 : 0) != 0); } inline asn1::string extension::data() const { return X509_EXTENSION_get_data(ptr().get()); } inline void extension::set_data(asn1::string _data) const { throw_error_if_not(X509_EXTENSION_set_data(ptr().get(), _data.raw()) != 0); } inline extension::extension(pointer _ptr, deleter_type _del) : pointer_wrapper(_ptr, _del) { } inline bool operator==(const extension& lhs, const extension& rhs) { return lhs.raw() == rhs.raw(); } inline bool operator!=(const extension& lhs, const extension& rhs) { return lhs.raw() != rhs.raw(); } } } #endif /* CRYPTOPLUS_X509_EXTENSION_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/x509/name.hpp000066400000000000000000001236731252300335000241560ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file name.hpp * \author Julien KAUFFMANN * \brief A X509 name class. */ #ifndef CRYPTOPLUS_X509_NAME_HPP #define CRYPTOPLUS_X509_NAME_HPP #include "../pointer_wrapper.hpp" #include "../buffer.hpp" #include "../error/helpers.hpp" #include "../bio/bio_ptr.hpp" #include "name_entry.hpp" // Windows defines a X509_NAME structure as well... #ifdef X509_NAME #undef X509_NAME #endif #include #include #include namespace cryptoplus { namespace x509 { /** * \brief A X509 name. * * The name class represents a X509 name. * * A name instance has the same semantic as a X509_NAME* pointer, thus two copies of the same instance share the same underlying pointer. * * \warning Always check for the object not to be NULL before calling any of its method. Calling any method (except raw()) on a null object has undefined behavior. */ class name : public pointer_wrapper { public: /** * \brief The wrapped value type. */ typedef name_entry wrapped_value_type; /** * \brief The wrapper pointer type. */ typedef wrapped_value_type* wrapped_pointer; /** * \brief An iterator class. */ template class base_iterator : public std::iterator { public: /** * \brief Create an empty iterator. */ base_iterator(); /** * \brief Dereference operator. * \return The value. */ typename base_iterator::reference operator*() const; /** * \brief Dereference operator. * \return The value. */ typename base_iterator::pointer operator->() const; /** * \brief Dereference operator. * \param index The index to add or substract. * \return An iterator. */ typename base_iterator::reference operator[](int index) const; /** * \brief Increment the iterator. * \return A reference to this. */ base_iterator& operator++(); /** * \brief Increment the iterator. * \return The old value. */ base_iterator operator++(int); /** * \brief Decrement the iterator. * \return A reference to this. */ base_iterator& operator--(); /** * \brief Decrement the iterator. * \return The old value. */ base_iterator operator--(int); /** * \brief Increment the iterator. * \param cnt The number to add to the iterator. * \return A reference to this. */ base_iterator& operator+=(int cnt); /** * \brief Decrement the iterator. * \param cnt The number to substract from the iterator. * \return A reference to this. */ base_iterator& operator-=(int cnt); private: base_iterator(IteratorValueType*, int); IteratorValueType* m_owner; int m_index; mutable typename IteratorValueType::wrapped_value_type m_cache; friend class name; template friend bool operator==(const name::base_iterator<_IteratorValueType>& lhs, const name::base_iterator<_IteratorValueType>& rhs); template friend bool operator!=(const name::base_iterator<_IteratorValueType>& lhs, const name::base_iterator<_IteratorValueType>& rhs); template friend bool operator<(const name::base_iterator<_IteratorValueType>& lhs, const name::base_iterator<_IteratorValueType>& rhs); template friend bool operator<=(const name::base_iterator<_IteratorValueType>& lhs, const name::base_iterator<_IteratorValueType>& rhs); template friend bool operator>(const name::base_iterator<_IteratorValueType>& lhs, const name::base_iterator<_IteratorValueType>& rhs); template friend bool operator>=(const name::base_iterator<_IteratorValueType>& lhs, const name::base_iterator<_IteratorValueType>& rhs); template friend name::base_iterator<_IteratorValueType> operator+(const name::base_iterator<_IteratorValueType>& lhs, int rhs); template friend name::base_iterator<_IteratorValueType> operator+(int lhs, const name::base_iterator<_IteratorValueType>& rhs); template friend name::base_iterator<_IteratorValueType> operator-(const name::base_iterator<_IteratorValueType>& lhs, int rhs); template friend name::base_iterator<_IteratorValueType> operator-(int lhs, const name::base_iterator<_IteratorValueType>& rhs); template friend typename name::base_iterator::difference_type operator-(const name::base_iterator<_IteratorValueType>& lhs, const name::base_iterator<_IteratorValueType>& rhs); }; /** * \brief The iterator type. */ typedef base_iterator iterator; /** * \brief The iterator type. */ typedef base_iterator const_iterator; /** * \brief Reverse iterator type. */ typedef std::reverse_iterator reverse_iterator; /** * \brief Const reverse iterator type. */ typedef std::reverse_iterator reverse_const_iterator; /** * \brief Create a new name. * \return The name. * * If allocation fails, an exception is thrown. */ static name create(); /** * \brief Take ownership of a specified X509_NAME pointer. * \param ptr The pointer. Cannot be NULL. * \return A name_entry. */ static name take_ownership(pointer ptr); /** * \brief Load a X509 name in DER format. * \param buf The buffer. * \param buf_len The length of buf. * \return The name. */ static name from_der(const void* buf, size_t buf_len); /** * \brief Load a X509 name in DER format. * \param buf The buffer. * \return The name. */ static name from_der(const buffer& buf); /** * \brief Create a new empty name. */ name(); /** * \brief Create a X509 name by *NOT* taking ownership of an existing X509_NAME* pointer. * \param ptr The X509_NAME* pointer. * \warning The caller is still responsible for freeing the memory. */ name(pointer ptr); /** * \brief Write the name in DER format to a buffer. * \param buf The buffer to write too. If NULL is specified, only the needed size is returned. * \return The size written or to be written. */ size_t write_der(void* buf) const; /** * \brief Write the name in DER format to a buffer. * \return The buffer. */ buffer write_der() const; /** * \brief Clone the name instance. * \return The clone. */ name clone() const; /** * \brief Get the hash of the name. * \return The hash. */ unsigned int hash() const; /** * \brief Get a one-line human readable representation of the X509 name. * \param max_size The maximum size of the result. Default is 256. * \return A string. */ std::string oneline(size_t max_size = 256) const; /** * \brief Print a X509 name to a BIO. * \param bio The BIO. * \param obase An undocumented parameter. Defaulted to 0. */ void print(bio::bio_ptr bio, int obase = 0) const; /** * \brief Get a complete string representation of the name. * \return The string representation. */ std::string to_string() const; /** * \brief Get the count of entries. * \return The count of entries. */ int count() const; /** * \brief Get the entry at the specified position. * \param index The index. Must be a valid index position or the behavior is undefined. See count(). * \return The name entry. * \see count(). */ wrapped_value_type operator[](int index) const; /** * \brief Get the begin iterator. * \return The begin iterator. */ const_iterator begin() const; /** * \brief Get the begin iterator. * \return The begin iterator. */ iterator begin(); /** * \brief Get the end iterator. * \return The end iterator. */ const_iterator end() const; /** * \brief Get the end iterator. * \return The end iterator. */ iterator end(); /** * \brief Get the reverse begin iterator. * \return The reverse begin iterator. */ reverse_const_iterator rbegin() const; /** * \brief Get the reverse begin iterator. * \return The reverse begin iterator. */ reverse_iterator rbegin(); /** * \brief Get the reverse end iterator. * \return The reverse end iterator. */ reverse_const_iterator rend() const; /** * \brief Get the reverse end iterator. * \return The reverse end iterator. */ reverse_iterator rend(); /** * \brief Erase the given entry. * \param it An iterator to the entry to erase. * \return The next iterator. */ const_iterator erase(const_iterator it) const; /** * \brief Erase the given entry. * \param it An iterator to the entry to erase. * \return The next iterator. */ iterator erase(iterator it); /** * \brief Erase the given entries. * \param first The first iterator. * \param last The last iterator. * \return last. */ const_iterator erase(const_iterator first, const_iterator last) const; /** * \brief Erase the given entries. * \param first The first iterator. * \param last The last iterator. * \return last. */ iterator erase(iterator first, iterator last); /** * \brief Find an entry by its NID. * \param nid The nid. * \return An iterator to the first entry that matches, or end() if none is found. */ const_iterator find(int nid) const; /** * \brief Find an entry by its NID. * \param nid The nid. * \return An iterator to the first entry that matches, or end() if none is found. */ iterator find(int nid); /** * \brief Find an entry by its NID. * \param nid The nid. * \param lastpos The iterator to start the search after. * \return An iterator to an entry that matches, or end() if none is found. */ const_iterator find(int nid, const_iterator lastpos) const; /** * \brief Find an entry by its NID. * \param nid The nid. * \param lastpos The iterator to start the search after. * \return An iterator to an entry that matches, or end() if none is found. */ iterator find(int nid, iterator lastpos); /** * \brief Find an entry by its ASN1 object. * \param object The ASN1 object. * \return An iterator to the first entry that matches, or end() if none is found. */ const_iterator find(asn1::object object) const; /** * \brief Find an entry by its ASN1 object. * \param object The ASN1 object. * \return An iterator to the first entry that matches, or end() if none is found. */ iterator find(asn1::object object); /** * \brief Find an entry by its ASN1 object. * \param object The ASN1 object. * \param lastpos The iterator to start the search after. * \return An iterator to an entry that matches, or end() if none is found. */ const_iterator find(asn1::object object, const_iterator lastpos) const; /** * \brief Find an entry by its ASN1 object. * \param object The ASN1 object. * \param lastpos The iterator to start the search after. * \return An iterator to an entry that matches, or end() if none is found. */ iterator find(asn1::object object, iterator lastpos); /** * \brief Clear all entries. */ void clear() const; /** * \brief Push a copy of the specified name_entry at the end of the entry table. * \param entry The name entry. */ void push_back(wrapped_value_type entry) const; /** * \brief Push a new entry at the end of the entry table. * \param field The field. * \param type The type. * \param data The data. * \param data_len The length of data. * \param set If set is -1 or 1, the entry will be added to the previous or next RDN structure respectively. If set is 0, the default, a new RDN is created. */ void push_back(const std::string& field, int type, const void* data, size_t data_len, int set = 0) const; /** * \brief Push a new entry at the end of the entry table. * \param field The field. * \param type The type. * \param data The data. * \param set If set is -1 or 1, the entry will be added to the previous or next RDN structure respectively. If set is 0, the default, a new RDN is created. */ void push_back(const std::string& field, int type, const std::string& data, int set = 0) const { push_back(field, type, data.empty() ? nullptr : &data[0], data.size(), set); } /** * \brief Push a new entry at the end of the entry table. * \param object The ASN1 object. * \param type The type. * \param data The data. * \param data_len The length of data. * \param set If set is -1 or 1, the entry will be added to the previous or next RDN structure respectively. If set is 0, the default, a new RDN is created. */ void push_back(asn1::object object, int type, const void* data, size_t data_len, int set = 0) const; /** * \brief Push a new entry at the end of the entry table. * \param object The ASN1 object. * \param type The type. * \param data The data. * \param data_len The length of data. * \param set If set is -1 or 1, the entry will be added to the previous or next RDN structure respectively. If set is 0, the default, a new RDN is created. */ void push_back(asn1::object object, int type, const std::string& data, int set = 0) const { push_back(object, type, data.empty() ? nullptr : &data[0], data.size(), set); } /** * \brief Push a new entry at the end of the entry table. * \param nid The NID. * \param type The type. * \param data The data. * \param data_len The length of data. * \param set If set is -1 or 1, the entry will be added to the previous or next RDN structure respectively. If set is 0, the default, a new RDN is created. */ void push_back(int nid, int type, const void* data, size_t data_len, int set = 0) const; /** * \brief Push a new entry at the end of the entry table. * \param nid The NID. * \param type The type. * \param data The data string. * \param set If set is -1 or 1, the entry will be added to the previous or next RDN structure respectively. If set is 0, the default, a new RDN is created. */ void push_back(int nid, int type, const std::string& data, int set = 0) const { push_back(nid, type, data.empty() ? nullptr : &data[0], data.size(), set); } /** * \brief Insert a copy of the specified name_entry in the entry table. * \param position The position to insert the entry at. * \param entry The name entry. * \return An iterator to the entry that was added. */ const_iterator insert(const_iterator position, wrapped_value_type entry) const; /** * \brief Insert a copy of the specified name_entry in the entry table. * \param position The position to insert the entry at. * \param entry The name entry. * \return An iterator to the entry that was added. */ iterator insert(iterator position, wrapped_value_type entry); /** * \brief Insert a copy of the specified name_entry in the entry table. * \param position The position to insert the entry at. * \param entry The name entry. * \param set If set is -1 or 1, the entry will be added to the previous or next RDN structure respectively. If set is 0, the call is equivalent to insert(position, entry) without a return value. */ void insert(const_iterator position, wrapped_value_type entry, int set) const; /** * \brief Insert a copy of the specified name_entry in the entry table. * \param position The position to insert the entry at. * \param entry The name entry. * \param set If set is -1 or 1, the entry will be added to the previous or next RDN structure respectively. If set is 0, the call is equivalent to insert(position, entry) without a return value. */ void insert(iterator position, wrapped_value_type entry, int set); /** * \brief Insert a new entry in the entry table. * \param position The position to insert the entry at. * \param field The field. * \param type The type. * \param data The data. * \param data_len The length of data. * \param set If set is -1 or 1, the entry will be added to the previous or next RDN structure respectively. If set is 0, the default, a new RDN is created. */ void insert(const_iterator position, const std::string& field, int type, const void* data, size_t data_len, int set = 0) const; /** * \brief Insert a new entry in the entry table. * \param position The position to insert the entry at. * \param field The field. * \param type The type. * \param data The data. * \param data_len The length of data. * \param set If set is -1 or 1, the entry will be added to the previous or next RDN structure respectively. If set is 0, the default, a new RDN is created. */ void insert(iterator position, const std::string& field, int type, const void* data, size_t data_len, int set = 0); /** * \brief Insert a new entry in the entry table. * \param position The position to insert the entry at. * \param object The ASN1 object. * \param type The type. * \param data The data. * \param data_len The length of data. * \param set If set is -1 or 1, the entry will be added to the previous or next RDN structure respectively. If set is 0, the default, a new RDN is created. */ void insert(const_iterator position, asn1::object object, int type, const void* data, size_t data_len, int set = 0) const; /** * \brief Insert a new entry in the entry table. * \param position The position to insert the entry at. * \param object The ASN1 object. * \param type The type. * \param data The data. * \param data_len The length of data. * \param set If set is -1 or 1, the entry will be added to the previous or next RDN structure respectively. If set is 0, the default, a new RDN is created. */ void insert(iterator position, asn1::object object, int type, const void* data, size_t data_len, int set = 0); /** * \brief Insert a new entry in the entry table. * \param position The position to insert the entry at. * \param nid The NID. * \param type The type. * \param data The data. * \param data_len The length of data. * \param set If set is -1 or 1, the entry will be added to the previous or next RDN structure respectively. If set is 0, the default, a new RDN is created. */ void insert(const_iterator position, int nid, int type, const void* data, size_t data_len, int set = 0) const; /** * \brief Insert a new entry in the entry table. * \param position The position to insert the entry at. * \param nid The NID. * \param type The type. * \param data The data. * \param data_len The length of data. * \param set If set is -1 or 1, the entry will be added to the previous or next RDN structure respectively. If set is 0, the default, a new RDN is created. */ void insert(iterator position, int nid, int type, const void* data, size_t data_len, int set = 0); /** * \brief Insert a copy of the specified name entries in the entry table. * \param position The position to insert the first entry at. * \param first An iterator to the first entry to insert. * \param last An iterator past the last entry to insert. */ void insert(const_iterator position, const_iterator first, const_iterator last) const; /** * \brief Insert a copy of the specified name entries in the entry table. * \param position The position to insert the first entry at. * \param first An iterator to the first entry to insert. * \param last An iterator past the last entry to insert. */ void insert(iterator position, iterator first, iterator last); private: name(pointer _ptr, deleter_type _del); }; /** * \brief Compare two name::iterator instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two name::iterator instances point to the same element. */ template bool operator==(const name::base_iterator& lhs, const name::base_iterator& rhs); /** * \brief Compare two name::iterator instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two name::iterator instances do not point to the same element. */ template bool operator!=(const name::base_iterator& lhs, const name::base_iterator& rhs); /** * \brief Compare two name::iterator instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if lhs is smaller than rhs. */ template bool operator<(const name::base_iterator& lhs, const name::base_iterator& rhs); /** * \brief Compare two name::iterator instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if lhs is smaller than or equal to rhs. */ template bool operator<=(const name::base_iterator& lhs, const name::base_iterator& rhs); /** * \brief Compare two name::iterator instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if lhs is greater than rhs. */ template bool operator>(const name::base_iterator& lhs, const name::base_iterator& rhs); /** * \brief Compare two name::iterator instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if lhs is greater than or equal to rhs. */ template bool operator>=(const name::base_iterator& lhs, const name::base_iterator& rhs); /** * \brief Add an integer value to an iterator. * \param lhs The left argument. * \param rhs The right argument. * \return The new iterator. */ template name::base_iterator operator+(const name::base_iterator& lhs, int rhs); /** * \brief Add an integer value to an iterator. * \param lhs The left argument. * \param rhs The right argument. * \return The new iterator. */ template name::base_iterator operator+(int lhs, const name::base_iterator& rhs); /** * \brief Substract an integer value from an iterator. * \param lhs The left argument. * \param rhs The right argument. * \return The new iterator. */ template name::base_iterator operator-(const name::base_iterator& lhs, int rhs); /** * \brief Substract an integer value from an iterator. * \param lhs The left argument. * \param rhs The right argument. * \return The new iterator. */ template name::base_iterator operator-(int lhs, const name::base_iterator& rhs); /** * \brief Substract a iterator from another iterator and gets the index distance. * \param lhs The left argument. * \param rhs The right argument. * \return The distance. */ template typename name::base_iterator::difference_type operator-(const name::base_iterator& lhs, const name::base_iterator& rhs); /** * \brief Compare two name instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two name instances share the same underlying pointer. */ bool operator==(const name& lhs, const name& rhs); /** * \brief Compare two name instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two name instances do not share the same underlying pointer. */ bool operator!=(const name& lhs, const name& rhs); /** * \brief Compare two names, by value. * \param lhs The left argument. * \param rhs The right argument. * \return The result of the comparison, which is 0 if the two arguments are identical. */ int compare(const name& lhs, const name& rhs); /** * \brief Output the name to an output stream. * \param os The output stream. * \param value The value instance.. * \return The output stream. */ std::ostream& operator<<(std::ostream& os, const name& value); template inline name::base_iterator::base_iterator() : m_owner(NULL), m_index(0) { } template inline typename name::base_iterator::reference name::base_iterator::operator*() const { return (m_cache = (*m_owner)[m_index]); } template inline typename name::base_iterator::pointer name::base_iterator::operator->() const { return &operator*(); } template inline typename name::base_iterator::reference name::base_iterator::operator[](int index) const { return *iterator(m_owner, m_index + index); } template inline name::base_iterator& name::base_iterator::operator++() { ++m_index; return *this; } template inline name::base_iterator name::base_iterator::operator++(int) { base_iterator old = *this; ++m_index; return old; } template inline name::base_iterator& name::base_iterator::operator--() { --m_index; return *this; } template inline name::base_iterator name::base_iterator::operator--(int) { base_iterator old = *this; --m_index; return old; } template inline name::base_iterator& name::base_iterator::operator+=(int cnt) { m_index += cnt; return *this; } template inline name::base_iterator& name::base_iterator::operator-=(int cnt) { m_index -= cnt; return *this; } template inline name::base_iterator::base_iterator(IteratorValueType* _name, int index) : m_owner(_name), m_index(index) { } inline name name::create() { pointer _ptr = X509_NAME_new(); throw_error_if_not(_ptr); return take_ownership(_ptr); } inline name name::from_der(const void* buf, size_t buf_len) { const unsigned char* pbuf = static_cast(buf); return take_ownership(d2i_X509_NAME(NULL, &pbuf, static_cast(buf_len))); } inline name name::from_der(const buffer& buf) { return from_der(buffer_cast(buf), buffer_size(buf)); } inline name::name() { } inline name::name(pointer _ptr) : pointer_wrapper(_ptr, null_deleter) { } inline size_t name::write_der(void* buf) const { unsigned char* out = static_cast(buf); unsigned char** pout = out != NULL ? &out : NULL; int result = i2d_X509_NAME(ptr().get(), pout); throw_error_if(result < 0); return result; } inline buffer name::write_der() const { buffer result(write_der(static_cast(NULL))); write_der(buffer_cast(result)); return result; } inline name name::clone() const { return name(X509_NAME_dup(ptr().get())); } inline unsigned int name::hash() const { return X509_NAME_hash(ptr().get()); } inline std::string name::oneline(size_t max_size) const { std::string result(max_size + 1, ' '); char* c = X509_NAME_oneline(ptr().get(), &result[0], static_cast(result.size() - 1)); throw_error_if_not(c); result.resize(std::strlen(c)); return result; } inline void name::print(bio::bio_ptr bio, int obase) const { throw_error_if_not(X509_NAME_print(bio.raw(), ptr().get(), obase) != 0); } inline int name::count() const { return X509_NAME_entry_count(ptr().get()); } inline name::wrapped_value_type name::operator[](int index) const { return wrapped_value_type(X509_NAME_get_entry(ptr().get(), index)); } inline name::const_iterator name::begin() const { return const_iterator(this, 0); } inline name::iterator name::begin() { return iterator(this, 0); } inline name::const_iterator name::end() const { return const_iterator(this, count()); } inline name::iterator name::end() { return iterator(this, count()); } inline name::reverse_const_iterator name::rbegin() const { return reverse_const_iterator(end()); } inline name::reverse_iterator name::rbegin() { return reverse_iterator(end()); } inline name::reverse_const_iterator name::rend() const { return reverse_const_iterator(begin()); } inline name::reverse_iterator name::rend() { return reverse_iterator(begin()); } inline name::const_iterator name::erase(const_iterator it) const { wrapped_value_type::take_ownership(X509_NAME_delete_entry(it.m_owner->ptr().get(), it.m_index)); return it; } inline name::iterator name::erase(iterator it) { wrapped_value_type::take_ownership(X509_NAME_delete_entry(it.m_owner->ptr().get(), it.m_index)); return it; } inline name::const_iterator name::erase(const_iterator first, const_iterator last) const { while (first != last) first = erase(first); return first; } inline name::iterator name::erase(iterator first, iterator last) { while (first != last) first = erase(first); return first; } inline name::const_iterator name::find(int nid) const { int index = X509_NAME_get_index_by_NID(ptr().get(), nid, -1); return (index < 0) ? end() : const_iterator(this, index); } inline name::iterator name::find(int nid) { int index = X509_NAME_get_index_by_NID(ptr().get(), nid, -1); return (index < 0) ? end() : iterator(this, index); } inline name::const_iterator name::find(int nid, const_iterator lastpos) const { int index = X509_NAME_get_index_by_NID(ptr().get(), nid, lastpos.m_index); return (index < 0) ? end() : const_iterator(this, index); } inline name::iterator name::find(int nid, iterator lastpos) { int index = X509_NAME_get_index_by_NID(ptr().get(), nid, lastpos.m_index); return (index < 0) ? end() : iterator(this, index); } inline name::const_iterator name::find(asn1::object object) const { int index = X509_NAME_get_index_by_OBJ(ptr().get(), object.raw(), -1); return (index < 0) ? end() : const_iterator(this, index); } inline name::iterator name::find(asn1::object object) { int index = X509_NAME_get_index_by_OBJ(ptr().get(), object.raw(), -1); return (index < 0) ? end() : iterator(this, index); } inline name::const_iterator name::find(asn1::object object, const_iterator lastpos) const { int index = X509_NAME_get_index_by_OBJ(ptr().get(), object.raw(), lastpos.m_index); return (index < 0) ? end() : const_iterator(this, index); } inline name::iterator name::find(asn1::object object, iterator lastpos) { int index = X509_NAME_get_index_by_OBJ(ptr().get(), object.raw(), lastpos.m_index); return (index < 0) ? end() : iterator(this, index); } inline void name::clear() const { erase(begin(), end()); } inline void name::push_back(wrapped_value_type entry) const { throw_error_if_not(X509_NAME_add_entry(ptr().get(), entry.raw(), -1, 0) != 0); } inline void name::push_back(const std::string& field, int type, const void* data, size_t data_len, int set) const { throw_error_if_not(X509_NAME_add_entry_by_txt(ptr().get(), field.c_str(), type, static_cast(data), static_cast(data_len), -1, set) != 0); } inline void name::push_back(asn1::object object, int type, const void* data, size_t data_len, int set) const { throw_error_if_not(X509_NAME_add_entry_by_OBJ(ptr().get(), object.raw(), type, static_cast(const_cast(data)), static_cast(data_len), -1, set) != 0); } inline void name::push_back(int nid, int type, const void* data, size_t data_len, int set) const { throw_error_if_not(X509_NAME_add_entry_by_NID(ptr().get(), nid, type, static_cast(const_cast(data)), static_cast(data_len), -1, set) != 0); } inline name::const_iterator name::insert(const_iterator position, wrapped_value_type entry) const { assert(position.m_owner == this); throw_error_if_not(X509_NAME_add_entry(ptr().get(), entry.raw(), position.m_index, 0) != 0); return position; } inline name::iterator name::insert(iterator position, wrapped_value_type entry) { assert(position.m_owner == this); throw_error_if_not(X509_NAME_add_entry(ptr().get(), entry.raw(), position.m_index, 0) != 0); return position; } inline void name::insert(const_iterator position, wrapped_value_type entry, int set) const { assert(position.m_owner == this); throw_error_if_not(X509_NAME_add_entry(ptr().get(), entry.raw(), position.m_index, set) != 0); } inline void name::insert(iterator position, wrapped_value_type entry, int set) { assert(position.m_owner == this); throw_error_if_not(X509_NAME_add_entry(ptr().get(), entry.raw(), position.m_index, set) != 0); } inline void name::insert(const_iterator position, const std::string& field, int type, const void* data, size_t data_len, int set) const { assert(position.m_owner == this); throw_error_if_not(X509_NAME_add_entry_by_txt(ptr().get(), field.c_str(), type, static_cast(data), static_cast(data_len), position.m_index, set) != 0); } inline void name::insert(iterator position, const std::string& field, int type, const void* data, size_t data_len, int set) { assert(position.m_owner == this); throw_error_if_not(X509_NAME_add_entry_by_txt(ptr().get(), field.c_str(), type, static_cast(data), static_cast(data_len), position.m_index, set) != 0); } inline void name::insert(const_iterator position, asn1::object object, int type, const void* data, size_t data_len, int set) const { assert(position.m_owner == this); throw_error_if_not(X509_NAME_add_entry_by_OBJ(ptr().get(), object.raw(), type, static_cast(const_cast(data)), static_cast(data_len), position.m_index, set) != 0); } inline void name::insert(iterator position, asn1::object object, int type, const void* data, size_t data_len, int set) { assert(position.m_owner == this); throw_error_if_not(X509_NAME_add_entry_by_OBJ(ptr().get(), object.raw(), type, static_cast(const_cast(data)), static_cast(data_len), position.m_index, set) != 0); } inline void name::insert(const_iterator position, int nid, int type, const void* data, size_t data_len, int set) const { assert(position.m_owner == this); throw_error_if_not(X509_NAME_add_entry_by_NID(ptr().get(),nid, type, static_cast(const_cast(data)), static_cast(data_len), position.m_index, set) != 0); } inline void name::insert(iterator position, int nid, int type, const void* data, size_t data_len, int set) { assert(position.m_owner == this); throw_error_if_not(X509_NAME_add_entry_by_NID(ptr().get(),nid, type, static_cast(const_cast(data)), static_cast(data_len), position.m_index, set) != 0); } inline void name::insert(const_iterator position, const_iterator first, const_iterator last) const { assert(position.m_owner == this); assert(first.m_owner == last.m_owner); for(; first != last; ++first) { position = insert(position, *first) + 1; } } inline void name::insert(iterator position, iterator first, iterator last) { assert(position.m_owner == this); assert(first.m_owner == last.m_owner); for(; first != last; ++first) { position = insert(position, *first) + 1; } } inline name::name(pointer _ptr, deleter_type _del) : pointer_wrapper(_ptr, _del) { } template inline bool operator==(const name::base_iterator& lhs, const name::base_iterator& rhs) { assert(lhs.m_owner == rhs.m_owner); return (lhs.m_index == rhs.m_index); } template inline bool operator!=(const name::base_iterator& lhs, const name::base_iterator& rhs) { assert(lhs.m_owner == rhs.m_owner); return (lhs.m_index != rhs.m_index); } template inline bool operator<(const name::base_iterator& lhs, const name::base_iterator& rhs) { assert(lhs.m_owner == rhs.m_owner); return (lhs.m_index < rhs.m_index); } template inline bool operator<=(const name::base_iterator& lhs, const name::base_iterator& rhs) { assert(lhs.m_owner == rhs.m_owner); return (lhs.m_index <= rhs.m_index); } template inline bool operator>(const name::base_iterator& lhs, const name::base_iterator& rhs) { assert(lhs.m_owner == rhs.m_owner); return (lhs.m_index > rhs.m_index); } template inline bool operator>=(const name::base_iterator& lhs, const name::base_iterator& rhs) { assert(lhs.m_owner == rhs.m_owner); return (lhs.m_index >= rhs.m_index); } template inline name::base_iterator operator+(const name::base_iterator& lhs, int rhs) { return name::base_iterator(lhs.m_owner, lhs.m_index + rhs); } template inline name::base_iterator operator+(int lhs, const name::base_iterator& rhs) { return name::base_iterator(rhs.m_owner, rhs.m_index + lhs); } template inline name::base_iterator operator-(const name::base_iterator& lhs, int rhs) { return name::base_iterator(lhs.m_owner, lhs.m_index - rhs); } template inline name::base_iterator operator-(int lhs, const name::base_iterator& rhs) { return name::base_iterator(rhs.m_owner, rhs.m_index - lhs); } template inline typename name::base_iterator::difference_type operator-(const name::base_iterator& lhs, const name::base_iterator& rhs) { return lhs.m_index - rhs.m_index; } inline bool operator==(const name& lhs, const name& rhs) { return lhs.raw() == rhs.raw(); } inline bool operator!=(const name& lhs, const name& rhs) { return lhs.raw() != rhs.raw(); } inline int compare(const name& lhs, const name& rhs) { return X509_NAME_cmp(lhs.raw(), rhs.raw()); } inline std::ostream& operator<<(std::ostream& os, const name& value) { return os << value.to_string(); } } } #endif /* CRYPTOPLUS_X509_NAME_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/x509/name_entry.hpp000066400000000000000000000236641252300335000253760ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file name_entry.hpp * \author Julien KAUFFMANN * \brief A X509 name entry class. */ #ifndef CRYPTOPLUS_X509_NAME_ENTRY_HPP #define CRYPTOPLUS_X509_NAME_ENTRY_HPP #include "../pointer_wrapper.hpp" #include "../buffer.hpp" #include "../error/helpers.hpp" #include "../bio/bio_ptr.hpp" #include "../asn1/object.hpp" #include "../asn1/string.hpp" #include #include #include namespace cryptoplus { namespace x509 { /** * \brief A X509 name entry. * * The name_entry class represents a X509 name_entry. * * A name_entry instance has the same semantic as a X509_NAME_ENTRY* pointer, thus two copies of the same instance share the same underlying pointer. * * \warning Always check for the object not to be NULL before calling any of its method. Calling any method (except raw()) on a null object has undefined behavior. */ class name_entry : public pointer_wrapper { public: /** * \brief Create a new name_entry. * \return The name_entry. * * If allocation fails, an exception is thrown. */ static name_entry create(); /** * \brief Take ownership of a specified X509_NAME_ENTRY pointer. * \param ptr The pointer. Cannot be NULL. * \return A name_entry. */ static name_entry take_ownership(pointer ptr); /** * \brief Load a X509 name entry in DER format. * \param buf The buffer. * \param buf_len The length of buf. * \return The name. */ static name_entry from_der(const void* buf, size_t buf_len); /** * \brief Load a X509 name entry in DER format. * \param buf The buffer. * \return The name. */ static name_entry from_der(const buffer& buf); /** * \brief Create a X509 name entry from an ASN1 object. * \param object The object. * \param type The type of the data. A common value is MBSTRING_UTF8, in which case data points to an UTF8 encoded string. * \param data The data to fill in the name entry. * \param data_len The length of data. * \return The name_entry. */ static name_entry from_object(asn1::object object, int type, const void* data, size_t data_len); /** * \brief Create a X509 name entry from a nid. * \param nid The nid. * \param type The type of the data. A common value is MBSTRING_UTF8, in which case data points to an UTF8 encoded string. * \param data The data to fill in the name entry. * \param data_len The length of data. * \return The name_entry. */ static name_entry from_nid(int nid, int type, const void* data, size_t data_len); /** * \brief Create an empty name_entry. */ name_entry(); /** * \brief Create a X509 name entry by *NOT* taking ownership of an existing X509_NAME_ENTRY* pointer. * \param ptr The X509_NAME_ENTRY* pointer. * \warning The caller is still responsible for freeing the memory. */ name_entry(pointer ptr); /** * \brief Get the ASN1 object associated to this name_entry. * \return The object. */ asn1::object object() const; /** * \brief Set the ASN1 object associated to this name_entry. * \param object The object. */ void set_object(asn1::object object); /** * \brief Get the data associated to this name_entry. * \return The data, as an ASN1 string. */ asn1::string data() const; /** * \brief Set the data associated to this name_entry. * \param type The type of the data to set. Usually MBSTRING_ASC or MBSTRING_UTF8. * \param data The data. * \param data_len The length of data. */ void set_data(int type, const void* data, size_t data_len); /** * \brief Get the nid associated to this name_entry. * \return The nid. */ int nid() const; /** * \brief Get the name associated to this name_entry. * \return The name. */ std::string name() const; /** * \brief Get the long name associated to this name_entry. * \return The long name. */ std::string long_name() const; /** * \brief Write the name entry in DER format to a buffer. * \param buf The buffer to write too. If NULL is specified, only the needed size is returned. * \return The size written or to be written. */ size_t write_der(void* buf) const; /** * \brief Write the name entry in DER format to a buffer. * \return The buffer. */ buffer write_der() const; /** * \brief Clone the name_entry instance. * \return The clone. */ name_entry clone() const; private: name_entry(pointer _ptr, deleter_type _del); }; /** * \brief Compare two name_entry instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two name_entry instances share the same underlying pointer. */ bool operator==(const name_entry& lhs, const name_entry& rhs); /** * \brief Compare two name_entry instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two name_entry instances do not share the same underlying pointer. */ bool operator!=(const name_entry& lhs, const name_entry& rhs); inline name_entry name_entry::create() { pointer _ptr = X509_NAME_ENTRY_new(); throw_error_if_not(_ptr); return take_ownership(_ptr); } inline name_entry name_entry::from_der(const void* buf, size_t buf_len) { const unsigned char* pbuf = static_cast(buf); return take_ownership(d2i_X509_NAME_ENTRY(NULL, &pbuf, static_cast(buf_len))); } inline name_entry name_entry::from_der(const buffer& buf) { return from_der(buffer_cast(buf), buffer_size(buf)); } inline name_entry name_entry::from_nid(int _nid, int _type, const void* _data, size_t data_len) { return take_ownership(X509_NAME_ENTRY_create_by_NID(NULL, _nid, _type, static_cast(const_cast(_data)), static_cast(data_len))); } inline name_entry name_entry::from_object(asn1::object _object, int _type, const void* _data, size_t data_len) { return take_ownership(X509_NAME_ENTRY_create_by_OBJ(NULL, _object.raw(), _type, static_cast(const_cast(_data)), static_cast(data_len))); } inline name_entry::name_entry() { } inline name_entry::name_entry(pointer _ptr) : pointer_wrapper(_ptr, null_deleter) { } inline asn1::object name_entry::object() const { return X509_NAME_ENTRY_get_object(ptr().get()); } inline void name_entry::set_object(asn1::object _object) { throw_error_if_not(X509_NAME_ENTRY_set_object(ptr().get(), _object.raw()) != 0); } inline asn1::string name_entry::data() const { return X509_NAME_ENTRY_get_data(ptr().get()); } inline void name_entry::set_data(int type, const void* _data, size_t data_len) { throw_error_if_not(X509_NAME_ENTRY_set_data(ptr().get(), type, static_cast(_data), static_cast(data_len)) != 0); } inline int name_entry::nid() const { return object().to_nid(); } inline std::string name_entry::name() const { return OBJ_nid2sn(nid()); } inline std::string name_entry::long_name() const { return OBJ_nid2ln(nid()); } inline size_t name_entry::write_der(void* buf) const { unsigned char* out = static_cast(buf); unsigned char** pout = out != NULL ? &out : NULL; int result = i2d_X509_NAME_ENTRY(ptr().get(), pout); throw_error_if(result < 0); return result; } inline buffer name_entry::write_der() const { buffer result(write_der(static_cast(NULL))); write_der(buffer_cast(result)); return result; } inline name_entry name_entry::clone() const { return take_ownership(X509_NAME_ENTRY_dup(ptr().get())); } inline name_entry::name_entry(pointer _ptr, deleter_type _del) : pointer_wrapper(_ptr, _del) { } inline bool operator==(const name_entry& lhs, const name_entry& rhs) { return lhs.raw() == rhs.raw(); } inline bool operator!=(const name_entry& lhs, const name_entry& rhs) { return lhs.raw() != rhs.raw(); } } } #endif /* CRYPTOPLUS_X509_NAME_ENTRY_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/x509/store.hpp000066400000000000000000000161001252300335000243540ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file store.hpp * \author Julien KAUFFMANN * \brief A X509 store class. */ #ifndef CRYPTOPLUS_X509_STORE_HPP #define CRYPTOPLUS_X509_STORE_HPP #include "../pointer_wrapper.hpp" #include "../error/helpers.hpp" #include "certificate.hpp" #include "certificate_revocation_list.hpp" #include "verify_param.hpp" #include #include namespace cryptoplus { namespace x509 { /** * \brief A X509 certificate store. * * The store class represents a X509 certificate store. * * A store instance has the same semantic as a X509_STORE* pointer, thus two copies of the same instance share the same underlying pointer. * * \warning Always check for the object not to be NULL before calling any of its method. Calling any method (except raw()) on a null object has undefined behavior. */ class store: public pointer_wrapper { public: /** * \brief A verification callback type. */ typedef int (*verification_callback_type)(int, X509_STORE_CTX*); /** * \brief Create a new store. * \return The store. * * If allocation fails, an exception is thrown. */ static store create(); /** * \brief Take ownership of a specified X509_STORE pointer. * \param ptr The pointer. Cannot be NULL. * \return A store. */ static store take_ownership(pointer ptr); /** * \brief Create a new empty X509 store. */ store(); /** * \brief Create a X509 store by *NOT* taking ownership of an existing X509_STORE* pointer. * \param ptr The X509_STORE* pointer. * \warning The caller is still responsible for freeing the memory. */ store(pointer ptr); #ifdef X509_STORE_set_verify_cb /** * \brief Set the verification callback. * \param callback The verification callback. */ void set_verification_callback(verification_callback_type callback); #endif /** * \brief Set the verification parameters. * \param vp The verification parameters. */ void set_verification_parameters(verify_param vp); /** * \brief Set the verification flags. * \param flags The verification flags. */ void set_verification_flags(int flags); /** * \brief Add a lookup method to the store. * \param lookup_method The lookup method to add. * \return The new created X509_LOOKUP. Return value is never NULL. */ X509_LOOKUP* add_lookup_method(X509_LOOKUP_METHOD* lookup_method); /** * \brief Add a file and a directory to the loaded locations for certificates and CRLs. * \param file A certificate or CRL file. * \param dir A directory containing hash named certificates or CRLs. */ void load_locations(const char* file, const char* dir); /** * \brief Add a certificate to the store. * \param cert The certificate. */ void add_certificate(certificate cert); /** * \brief Add a CRL to the store. * \param crl The CRL. */ void add_certificate_revocation_list(certificate_revocation_list crl); private: store(pointer _ptr, deleter_type _del); }; /** * \brief Compare two store instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two store instances share the same underlying pointer. */ bool operator==(const store& lhs, const store& rhs); /** * \brief Compare two store instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two store instances do not share the same underlying pointer. */ bool operator!=(const store& lhs, const store& rhs); inline store store::create() { pointer _ptr = X509_STORE_new(); throw_error_if_not(_ptr); return take_ownership(_ptr); } inline store::store() { } inline store::store(pointer _ptr) : pointer_wrapper(_ptr, null_deleter) { } #ifdef X509_STORE_set_verify_cb inline void store::set_verification_callback(verification_callback_type callback) { X509_STORE_set_verify_cb(raw(), callback); } #endif inline void store::set_verification_parameters(verify_param vp) { X509_STORE_set1_param(raw(), vp.raw()); } inline void store::set_verification_flags(int flags) { X509_STORE_set_flags(raw(), flags); } inline X509_LOOKUP* store::add_lookup_method(X509_LOOKUP_METHOD* lookup_method) { X509_LOOKUP* lookup = X509_STORE_add_lookup(raw(), lookup_method); throw_error_if_not(lookup != NULL); return lookup; } inline void store::load_locations(const char* file, const char* dir) { throw_error_if_not(X509_STORE_load_locations(raw(), const_cast(file), const_cast(dir)) != 0); } inline void store::add_certificate(certificate cert) { throw_error_if_not(X509_STORE_add_cert(raw(), cert.raw()) != 0); } inline void store::add_certificate_revocation_list(certificate_revocation_list crl) { throw_error_if_not(X509_STORE_add_crl(raw(), crl.raw()) != 0); } inline store::store(pointer _ptr, deleter_type _del) : pointer_wrapper(_ptr, _del) { } inline bool operator==(const store& lhs, const store& rhs) { return lhs.raw() == rhs.raw(); } inline bool operator!=(const store& lhs, const store& rhs) { return lhs.raw() != rhs.raw(); } } } #endif /* CRYPTOPLUS_X509_STORE_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/x509/store_context.hpp000066400000000000000000000300121252300335000261160ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file store_context.hpp * \author Julien KAUFFMANN * \brief A X509 store context class. */ #ifndef CRYPTOPLUS_X509_STORE_CONTEXT_HPP #define CRYPTOPLUS_X509_STORE_CONTEXT_HPP #include "../pointer_wrapper.hpp" #include "../error/helpers.hpp" #include "store.hpp" #include "certificate.hpp" #include "verify_param.hpp" #include #include namespace cryptoplus { namespace x509 { /** * \brief A X509 certificate store context. * * The store class represents a X509 certificate store context. * * A store instance has the same semantic as a X509_STORE_CTX* pointer, thus two copies of the same instance share the same underlying pointer. * * \warning Always check for the object not to be NULL before calling any of its method. Calling any method (except raw()) on a null object has undefined behavior. */ class store_context: public pointer_wrapper { public: /** * \brief Register a new index for external data. * \param argl A long argument to pass to the functions. * \param argp A pointer argument to pass to the functions. * \param new_func The function to call when a new store_context is allocated. * \param dup_func The function to call when a store_context is duplicated. * \param free_func The function to call when a store_context is deleted. * \return The new index. */ static int register_index(long argl, void* argp, CRYPTO_EX_new* new_func, CRYPTO_EX_dup* dup_func, CRYPTO_EX_free* free_func); /** * \brief Register a new index for external data. * \return The new index. * * This method is equivalent to store_context::register_index(0, NULL, NULL, NULL, NULL). */ static int register_index(); /** * \brief A verification callback type. */ typedef int (*verification_callback_type)(int, X509_STORE_CTX*); /** * \brief Create a new store context. * \return The store context. * * If allocation fails, an exception is thrown. */ static store_context create(); /** * \brief Take ownership of a specified X509_STORE_CTX pointer. * \param ptr The pointer. Cannot be NULL. * \return A store. */ static store_context take_ownership(pointer ptr); /** * \brief Create a new empty X509 store context. */ store_context(); /** * \brief Create a X509 store context by *NOT* taking ownership of an existing X509_STORE_CTX* pointer. * \param ptr The X509_STORE_CTX* pointer. * \warning The caller is still responsible for freeing the memory. */ store_context(pointer ptr); /** * \brief Set the verification callback. * \param callback The verification callback. */ void set_verification_callback(verification_callback_type callback); /** * \brief Initialize the store context. * \param _store The store to use, if any. Can be NULL. * \param cert The certificate to be verified. Can be NULL. * \param chain Additional untrusted certificates that might be used to build the chain. Can be NULL. */ void initialize(store _store, certificate cert, STACK_OF(X509)* chain); /** * \brief Cleanup the store context. * * The context can then be reused and you can call initialize() again. */ void cleanup(); /** * \brief Set the external data. * \param index The index, as returned by register_index(). * \param data The data. */ void set_external_data(int index, void* data); /** * \brief Get the external data. * \param index The index, as returned by register_index(). * \return The data. */ void* get_external_data(int index); /** * \brief Set a trusted stack of certificates. * \param certs The trusted stack of certificates to set. * * This is an alternative way of specifying trusted certificates instead of using a x509::store. */ void set_trusted_certificates(STACK_OF(X509)* certs); /** * \brief Set the certificate to be verified. * \param cert The certificate to be verified. */ void set_certificate(certificate cert); /** * \brief Set the additional untrusted certificates that might be used to build the chain. * \param chain The certificates. */ void set_chain(STACK_OF(X509)* chain); /** * \brief Set the CRL to use to aid certificate verification. These CRLs will only be used if CRL verification is enable in the associated x509::verify_param structure. * \param crls The CRLs. */ void set_crls(STACK_OF(X509_CRL)* crls); /** * \brief Get the associated verification parameters. * \return The associated verification parameters. */ verify_param verification_parameters() const; /** * \brief Set the verification parameters. * \param vp The verification parameters. vp should not be used after this method was called. * * \warning The store_context instance takes ownership on vp and is responsible for his deletion. */ void set_verification_parameters(verify_param vp); /** * \brief Lookups and sets the default verification method. * \param name The verification method name. */ void set_default(const char* name); /** * \brief Lookups and sets the default verification method. * \param name The verification method name. */ void set_default(const std::string& name); /** * \brief Get the error. * \return The error. */ long get_error() const; /** * \brief Get the error string. * \return The error string. */ const char* get_error_string() const; /** * \brief Get the error depth. * \return The error depth. */ int get_error_depth() const; /** * \brief Get the certificate where the error occured. * \return The certificate where the error occured. May be null. */ certificate get_current_certificate() const; /** * \brief Verifies the certificate. * \return true on success, false if the certificate could not be verified. */ bool verify(); private: store_context(pointer _ptr, deleter_type _del); }; /** * \brief Compare two store_context instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two store_context instances share the same underlying pointer. */ bool operator==(const store_context& lhs, const store_context& rhs); /** * \brief Compare two store_context instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two store_context instances do not share the same underlying pointer. */ bool operator!=(const store_context& lhs, const store_context& rhs); inline int store_context::register_index(long argl, void* argp, CRYPTO_EX_new* new_func, CRYPTO_EX_dup* dup_func, CRYPTO_EX_free* free_func) { int index = X509_STORE_CTX_get_ex_new_index(argl, argp, new_func, dup_func, free_func); throw_error_if(index < 0); return index; } inline int store_context::register_index() { return register_index(0, NULL, NULL, NULL, NULL); } inline store_context store_context::create() { pointer _ptr = X509_STORE_CTX_new(); throw_error_if_not(_ptr); return take_ownership(_ptr); } inline store_context::store_context() { } inline store_context::store_context(pointer _ptr) : pointer_wrapper(_ptr, null_deleter) { } inline void store_context::set_verification_callback(verification_callback_type callback) { X509_STORE_CTX_set_verify_cb(raw(), callback); } inline void store_context::initialize(store _store, certificate cert, STACK_OF(X509)* chain) { throw_error_if_not(X509_STORE_CTX_init(raw(), _store.raw(), cert.raw(), chain) != 0); } inline void store_context::cleanup() { X509_STORE_CTX_cleanup(raw()); } inline void store_context::set_external_data(int index, void* data) { throw_error_if(X509_STORE_CTX_set_ex_data(raw(), index, data) == 0); } inline void* store_context::get_external_data(int index) { // This call can fail but we cannot know for sure when it happens since NULL as a return value could also be a valid value... return X509_STORE_CTX_get_ex_data(raw(), index); } inline void store_context::set_trusted_certificates(STACK_OF(X509)* certs) { X509_STORE_CTX_trusted_stack(raw(), certs); } inline void store_context::set_certificate(certificate cert) { X509_STORE_CTX_set_cert(raw(), cert.raw()); } inline void store_context::set_chain(STACK_OF(X509)* chain) { X509_STORE_CTX_set_chain(raw(), chain); } inline void store_context::set_crls(STACK_OF(X509_CRL)* crls) { X509_STORE_CTX_set0_crls(raw(), crls); } inline verify_param store_context::verification_parameters() const { return X509_STORE_CTX_get0_param(const_cast(raw())); } inline void store_context::set_verification_parameters(verify_param vp) { X509_STORE_CTX_set0_param(raw(), vp.raw()); } inline void store_context::set_default(const char* name) { throw_error_if_not(X509_STORE_CTX_set_default(raw(), name) != 0); } inline void store_context::set_default(const std::string& name) { throw_error_if_not(X509_STORE_CTX_set_default(raw(), name.c_str()) != 0); } inline long store_context::get_error() const { return X509_STORE_CTX_get_error(const_cast(raw())); } inline const char* store_context::get_error_string() const { return X509_verify_cert_error_string(get_error()); } inline int store_context::get_error_depth() const { return X509_STORE_CTX_get_error_depth(const_cast(raw())); } inline certificate store_context::get_current_certificate() const { return X509_STORE_CTX_get_current_cert(const_cast(raw())); } inline bool store_context::verify() { return (X509_verify_cert(raw()) > 0); } inline store_context::store_context(pointer _ptr, deleter_type _del) : pointer_wrapper(_ptr, _del) { } inline bool operator==(const store_context& lhs, const store_context& rhs) { return lhs.raw() == rhs.raw(); } inline bool operator!=(const store_context& lhs, const store_context& rhs) { return lhs.raw() != rhs.raw(); } } } #endif /* CRYPTOPLUS_X509_STORE_CONTEXT_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/x509/verify_param.hpp000066400000000000000000000166271252300335000257220ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file verify_param.hpp * \author Julien KAUFFMANN * \brief A class that holds X509 verification parameters. */ #ifndef CRYPTOPLUS_X509_VERIFY_PARAM_HPP #define CRYPTOPLUS_X509_VERIFY_PARAM_HPP #include "../pointer_wrapper.hpp" #include "../error/helpers.hpp" #include "../asn1/object.hpp" #include #include #include namespace cryptoplus { namespace x509 { /** * \brief A class that holds X509 verification parameters. * * A verify_param instance has the same semantic as a X509_VERIFY_PARAM* pointer, thus two copies of the same instance share the same underlying pointer. * * \warning Always check for the object not to be NULL before calling any of its method. Calling any method (except raw()) on a null object has undefined behavior. */ class verify_param: public pointer_wrapper { public: /** * \brief Create a new verify_param. * \return The verify_param. * * If allocation fails, an exception is thrown. */ static verify_param create(); /** * \brief Take ownership of a specified X509_VERIFY_PARAM pointer. * \param ptr The pointer. Cannot be NULL. * \return A verify_param. */ static verify_param take_ownership(pointer ptr); /** * \brief Create a new empty X509 verify_param. */ verify_param(); /** * \brief Create a X509 verify_param by *NOT* taking ownership of an existing X509_VERIFY_PARAM* pointer. * \param ptr The X509_VERIFY_PARAM* pointer. * \warning The caller is still responsible for freeing the memory. */ verify_param(pointer ptr); /** * \brief Set the specified flags. * \param flags The flags to set. */ void set_flags(unsigned long flags); /** * \brief Clear the specified flags. * \param flags The flags to clear. */ void clear_flags(unsigned long flags); /** * \brief Get the flags. * \return The flags. */ unsigned long flags() const; /** * \brief Set the purpose. * \param purpose The purpose. */ void set_purpose(int purpose); /** * \brief Set the trust setting. * \param trust The trust setting. */ void set_trust(int trust); /** * \brief Set the time. * \param time The time. */ void set_time(boost::posix_time::ptime time = boost::posix_time::second_clock::local_time()); /** * \brief Add a policy. * \param policy The policy to add. */ void add_policy(asn1::object policy); /** * \brief Set the policies. * \param policies The policies to set. May be NULL to clear policies. */ void set_policies(STACK_OF(ASN1_OBJECT)* policies); /** * \brief Set the verification depth. * \param depth The depth. */ void set_depth(int depth); /** * \brief Get the verification depth. * \return The depth. */ int depth() const; private: verify_param(pointer _ptr, deleter_type _del); }; /** * \brief Compare two verify_param instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two verify_param instances share the same underlying pointer. */ bool operator==(const verify_param& lhs, const verify_param& rhs); /** * \brief Compare two verify_param instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two verify_param instances do not share the same underlying pointer. */ bool operator!=(const verify_param& lhs, const verify_param& rhs); inline verify_param verify_param::create() { pointer _ptr = X509_VERIFY_PARAM_new(); throw_error_if_not(_ptr); return take_ownership(_ptr); } inline verify_param::verify_param() { } inline verify_param::verify_param(pointer _ptr) : pointer_wrapper(_ptr, null_deleter) { } inline void verify_param::set_flags(unsigned long _flags) { throw_error_if_not(X509_VERIFY_PARAM_set_flags(raw(), _flags) != 0); } inline void verify_param::clear_flags(unsigned long _flags) { throw_error_if_not(X509_VERIFY_PARAM_clear_flags(raw(), _flags) != 0); } inline unsigned long verify_param::flags() const { return X509_VERIFY_PARAM_get_flags(const_cast(raw())); } inline void verify_param::set_purpose(int purpose) { throw_error_if_not(X509_VERIFY_PARAM_set_purpose(raw(), purpose) != 0); } inline void verify_param::set_trust(int trust) { throw_error_if_not(X509_VERIFY_PARAM_set_trust(raw(), trust) != 0); } inline void verify_param::set_time(boost::posix_time::ptime time) { ::tm t = boost::posix_time::to_tm(time); X509_VERIFY_PARAM_set_time(raw(), ::mktime(&t)); } inline void verify_param::add_policy(asn1::object policy) { throw_error_if_not(X509_VERIFY_PARAM_add0_policy(raw(), policy.raw()) != 0); } inline void verify_param::set_policies(STACK_OF(ASN1_OBJECT)* policies) { throw_error_if_not(X509_VERIFY_PARAM_set1_policies(raw(), policies) != 0); } inline void verify_param::set_depth(int _depth) { X509_VERIFY_PARAM_set_depth(raw(), _depth); } inline int verify_param::depth() const { return X509_VERIFY_PARAM_get_depth(raw()); } inline verify_param::verify_param(pointer _ptr, deleter_type _del) : pointer_wrapper(_ptr, _del) { } inline bool operator==(const verify_param& lhs, const verify_param& rhs) { return lhs.raw() == rhs.raw(); } inline bool operator!=(const verify_param& lhs, const verify_param& rhs) { return lhs.raw() != rhs.raw(); } } } #endif /* CRYPTOPLUS_X509_VERIFY_PARAM_HPP */ freelan-2.0/libs/cryptoplus/include/cryptoplus/x509/x509v3_context.hpp000066400000000000000000000113621252300335000257470ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file x509v3_context.hpp * \author Julien KAUFFMANN * \brief A X509 V3 context class. */ #ifndef CRYPTOPLUS_X509_X509V3_CONTEXT_HPP #define CRYPTOPLUS_X509_X509V3_CONTEXT_HPP #include "../pointer_wrapper.hpp" #include "../error/helpers.hpp" #include namespace cryptoplus { namespace x509 { /** * \brief A X509 V3 context. * * The x509v3_context class represents a X509 V3 context. * * A x509v3_context instance has the same semantic as a X509V3_CTX* pointer, thus two copies of the same instance share the same underlying pointer. * * \warning Always check for the object not to be NULL before calling any of its method. Calling any method (except raw()) on a null object has undefined behavior. */ class x509v3_context : public pointer_wrapper { public: /** * \brief Create a new x509v3_context. * \return The x509v3_context. * * If allocation fails, an exception is thrown. */ static x509v3_context create(); /** * \brief Take ownership of a specified X509_X509V3_CONTEXT pointer. * \param ptr The pointer. Cannot be NULL. * \return A x509v3_context_entry. */ static x509v3_context take_ownership(pointer ptr); /** * \brief Create a new empty x509v3_context. */ x509v3_context(); /** * \brief Create a X509 x509v3_context by *NOT* taking ownership of an existing X509_X509V3_CONTEXT* pointer. * \param ptr The X509_X509V3_CONTEXT* pointer. * \warning The caller is still responsible for freeing the memory. */ x509v3_context(pointer ptr); private: x509v3_context(pointer _ptr, deleter_type _del); }; /** * \brief Compare two x509v3_context instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two x509v3_context instances share the same underlying pointer. */ bool operator==(const x509v3_context& lhs, const x509v3_context& rhs); /** * \brief Compare two x509v3_context instances. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two x509v3_context instances do not share the same underlying pointer. */ bool operator!=(const x509v3_context& lhs, const x509v3_context& rhs); inline x509v3_context x509v3_context::create() { pointer _ptr = new X509V3_CTX(); throw_error_if_not(_ptr); return take_ownership(_ptr); } inline x509v3_context::x509v3_context() { } inline x509v3_context::x509v3_context(pointer _ptr) : pointer_wrapper(_ptr, null_deleter) { } inline x509v3_context::x509v3_context(pointer _ptr, deleter_type _del) : pointer_wrapper(_ptr, _del) { } inline bool operator==(const x509v3_context& lhs, const x509v3_context& rhs) { return lhs.raw() == rhs.raw(); } inline bool operator!=(const x509v3_context& lhs, const x509v3_context& rhs) { return lhs.raw() != rhs.raw(); } } } #endif /* CRYPTOPLUS_X509_X509V3_CONTEXT_HPP */ freelan-2.0/libs/cryptoplus/libcryptoplus.vcxproj000066400000000000000000000424371252300335000224770ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {BABD5FDD-D2DC-44FE-B2A4-A21D3DD1F6C2} Win32Proj libcryptoplus StaticLibrary true v120 Unicode StaticLibrary true v120 Unicode StaticLibrary false v120 true Unicode StaticLibrary false v120 true Unicode $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) ClCompile $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) ClCompile $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) ClCompile $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) ClCompile Level3 Disabled USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;DEBUG;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\cryptoplus 4996 Windows true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 Disabled USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;DEBUG;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\cryptoplus 4996 Windows true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 MaxSpeed true true USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\cryptoplus Windows true true true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 MaxSpeed true true USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\cryptoplus Windows true true true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template freelan-2.0/libs/cryptoplus/libcryptoplus.vcxproj.filters000066400000000000000000000233051252300335000241370ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files freelan-2.0/libs/cryptoplus/src/000077500000000000000000000000001252300335000167245ustar00rootroot00000000000000freelan-2.0/libs/cryptoplus/src/base64.cpp000066400000000000000000000062541252300335000205230ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file base64.cpp * \author Julien KAUFFMANN * \brief Base 64 related functions. */ #include "base64.hpp" #include "bio/bio_chain.hpp" #include "bio/bio_ptr.hpp" #include namespace cryptoplus { size_t base64_encode(void* output, size_t outputlen, const void* input, size_t inputlen) { bio::bio_chain bio_chain(BIO_f_base64()); bio_chain.first().set_flags(BIO_FLAGS_BASE64_NO_NL); bio_chain.first().push(BIO_new(BIO_s_mem())); ptrdiff_t cnt = bio_chain.first().write(input, inputlen); if (cnt <= 0) { throw std::runtime_error("Unable to perform base 64 encoding"); } bio_chain.first().flush(); BUF_MEM* b64ptr = bio_chain.first().next().get_mem_buf(); const size_t min_size = std::min(static_cast(b64ptr->length), outputlen); std::copy(static_cast(b64ptr->data), static_cast(b64ptr->data) + min_size, static_cast(output)); return min_size; } size_t base64_decode(void* output, size_t outputlen, const void* input, size_t inputlen) { bio::bio_chain bio_chain(BIO_f_base64()); bio_chain.first().set_flags(BIO_FLAGS_BASE64_NO_NL); bio_chain.first().push(BIO_new_mem_buf(const_cast(input), static_cast(inputlen))); ptrdiff_t cnt = bio_chain.first().read(output, outputlen); if (cnt <= 0) { throw std::runtime_error("Unable to perform base 64 decoding"); } return static_cast(cnt); } } freelan-2.0/libs/cryptoplus/src/bignum.cpp000066400000000000000000000067071252300335000207230ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file bignum.cpp * \author Julien KAUFFMANN * \brief A BIGNUM pointer class. */ #include "bn/bignum.hpp" #include "asn1/integer.hpp" #include #include #include #include namespace cryptoplus { template <> bn::bignum::deleter_type pointer_wrapper::deleter = BN_clear_free; namespace bn { namespace { void _OPENSSL_free(void* buf) { OPENSSL_free(buf); } } bignum bignum::take_ownership(pointer _ptr) { throw_error_if_not(_ptr); return bignum(_ptr, deleter); } bignum bignum::from_hex(const std::string& str) { BIGNUM* bn = NULL; throw_error_if_not(BN_hex2bn(&bn, str.c_str()) != 0); return take_ownership(bn); } bignum bignum::from_dec(const std::string& str) { BIGNUM* bn = NULL; throw_error_if_not(BN_dec2bn(&bn, str.c_str()) != 0); return take_ownership(bn); } bignum bignum::from_integer(asn1::integer i) { return take_ownership(ASN1_INTEGER_to_BN(i.raw(), NULL)); } size_t bignum::to_bin(void* out, size_t out_len) const { assert(out_len >= size()); if (out_len < size()) { throw std::invalid_argument("out_len"); } return BN_bn2bin(ptr().get(), static_cast(out)); } std::string bignum::to_hex() const { boost::shared_ptr result(BN_bn2hex(ptr().get()), _OPENSSL_free); return std::string(result.get()); } std::string bignum::to_dec() const { boost::shared_ptr result(BN_bn2dec(ptr().get()), _OPENSSL_free); return std::string(result.get()); } asn1::integer bignum::to_integer() const { return asn1::integer::from_bignum(*this); } } } freelan-2.0/libs/cryptoplus/src/bio_chain.cpp000066400000000000000000000040661252300335000213510ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file bio_chain.cpp * \author Julien KAUFFMANN * \brief A bio_chain class. */ #include "bio/bio_chain.hpp" #ifdef MSV // Avoid LNK4221: no public symbols found; archive member will be inacessible namespace { char not_empty; } #endif namespace cryptoplus { namespace bio { } } freelan-2.0/libs/cryptoplus/src/bio_ptr.cpp000066400000000000000000000040641252300335000210720ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file bio_ptr.cpp * \author Julien KAUFFMANN * \brief A bio pointer class. */ #include "bio/bio_ptr.hpp" #ifdef MSV // Avoid LNK4221: no public symbols found; archive member will be inacessible namespace { char not_empty; } #endif namespace cryptoplus { namespace bio { } } freelan-2.0/libs/cryptoplus/src/buffer.cpp000066400000000000000000000055771252300335000207170ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file buffer.cpp * \author Julien KAUFFMANN * \brief A buffer class. */ #include "buffer.hpp" #include #include #include #include namespace cryptoplus { buffer::buffer(const void* _data, size_t data_len) : m_data(static_cast(_data), static_cast(_data) + data_len) { } buffer::buffer(const char* str) : m_data(static_cast(static_cast(str)), static_cast(static_cast(str)) + strlen(str)) { } buffer::buffer(const std::string& str) : m_data(str.begin(), str.end()) { } buffer::buffer(const storage_type& _data) : m_data(_data) { } std::ostream& operator<<(std::ostream& os, const buffer& buf) { boost::io::ios_flags_saver ifs(os); for (buffer::storage_type::const_iterator i = buf.data().begin(); i != buf.data().end(); ++i) { os << std::hex << std::setw(2) << std::setfill('0') << static_cast(*i); } return os; } std::string hex(const buffer& buf) { std::ostringstream oss; oss << buf; return oss.str(); } } freelan-2.0/libs/cryptoplus/src/certificate.cpp000066400000000000000000000063331252300335000217170ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file certificate.cpp * \author Julien KAUFFMANN * \brief A X509 certificate class. */ #include "x509/certificate.hpp" #include "bio/bio_chain.hpp" #include namespace cryptoplus { template <> x509::certificate::deleter_type pointer_wrapper::deleter = X509_free; namespace x509 { namespace { bio::bio_chain get_bio_chain_from_buffer(const void* buf, size_t buf_len) { return bio::bio_chain(BIO_new_mem_buf(const_cast(buf), static_cast(buf_len))); } } certificate certificate::from_certificate(const void* buf, size_t buf_len, pem_passphrase_callback_type callback, void* callback_arg) { bio::bio_chain bio_chain = get_bio_chain_from_buffer(buf, buf_len); return from_certificate(bio_chain.first(), callback, callback_arg); } certificate certificate::from_trusted_certificate(const void* buf, size_t buf_len, pem_passphrase_callback_type callback, void* callback_arg) { bio::bio_chain bio_chain = get_bio_chain_from_buffer(buf, buf_len); return from_trusted_certificate(bio_chain.first(), callback, callback_arg); } certificate certificate::take_ownership(pointer _ptr) { throw_error_if_not(_ptr); return certificate(_ptr, deleter); } std::string certificate::to_string() const { bio::bio_ptr bio(BIO_new(BIO_s_mem())); this->print(bio); BUF_MEM* const str = bio.get_mem_buf(); return std::string(str->data, str->length); } } } freelan-2.0/libs/cryptoplus/src/certificate_request.cpp000066400000000000000000000054741252300335000234740ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file certificate_request.cpp * \author Julien KAUFFMANN * \brief A X509 certificate request class. */ #include "x509/certificate_request.hpp" #include "bio/bio_chain.hpp" #include namespace cryptoplus { template <> x509::certificate_request::deleter_type pointer_wrapper::deleter = X509_REQ_free; namespace x509 { namespace { bio::bio_chain get_bio_chain_from_buffer(const void* buf, size_t buf_len) { return bio::bio_chain(BIO_new_mem_buf(const_cast(buf), static_cast(buf_len))); } } certificate_request certificate_request::from_certificate_request(const void* buf, size_t buf_len, pem_passphrase_callback_type callback, void* callback_arg) { bio::bio_chain bio_chain = get_bio_chain_from_buffer(buf, buf_len); return from_certificate_request(bio_chain.first(), callback, callback_arg); } certificate_request certificate_request::take_ownership(pointer _ptr) { throw_error_if_not(_ptr); return certificate_request(_ptr, deleter); } } } freelan-2.0/libs/cryptoplus/src/certificate_revocation_list.cpp000066400000000000000000000056341252300335000252060ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file certificate_revocation_list.cpp * \author Julien KAUFFMANN * \brief A X509 certificate revocation list class. */ #include "x509/certificate_revocation_list.hpp" #include "bio/bio_chain.hpp" #include namespace cryptoplus { template <> x509::certificate_revocation_list::deleter_type pointer_wrapper::deleter = X509_CRL_free; namespace x509 { namespace { bio::bio_chain get_bio_chain_from_buffer(const void* buf, size_t buf_len) { return bio::bio_chain(BIO_new_mem_buf(const_cast(buf), static_cast(buf_len))); } } certificate_revocation_list certificate_revocation_list::from_certificate_revocation_list(const void* buf, size_t buf_len, pem_passphrase_callback_type callback, void* callback_arg) { bio::bio_chain bio_chain = get_bio_chain_from_buffer(buf, buf_len); return from_certificate_revocation_list(bio_chain.first(), callback, callback_arg); } certificate_revocation_list certificate_revocation_list::take_ownership(pointer _ptr) { throw_error_if_not(_ptr); return certificate_revocation_list(_ptr, deleter); } } } freelan-2.0/libs/cryptoplus/src/cipher_algorithm.cpp000066400000000000000000000047641252300335000227630ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file cipher_algorithm.cpp * \author Julien KAUFFMANN * \brief A cipher algorithm wrapper class. */ #include "cipher/cipher_algorithm.hpp" #include #include namespace cryptoplus { namespace cipher { const size_t cipher_algorithm::max_key_length = EVP_MAX_KEY_LENGTH; const size_t cipher_algorithm::max_iv_length = EVP_MAX_IV_LENGTH; cipher_algorithm::cipher_algorithm(int _type) : m_cipher(EVP_get_cipherbynid(_type)) { if (!m_cipher) { throw std::invalid_argument("type"); } } cipher_algorithm::cipher_algorithm(const std::string& _name) : m_cipher(EVP_get_cipherbyname(_name.c_str())) { if (!m_cipher) { throw std::invalid_argument("name"); } } } } freelan-2.0/libs/cryptoplus/src/cipher_context.cpp000066400000000000000000000155411252300335000224540ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file cipher_context.cpp * \author Julien KAUFFMANN * \brief A cipher context class. */ #include "cipher/cipher_context.hpp" #include "pkey/pkey.hpp" #include "random/random.hpp" #include namespace cryptoplus { namespace cipher { namespace { typedef int (*update_function)(EVP_CIPHER_CTX*, unsigned char*, int*, const unsigned char*, int); typedef int (*finalize_function)(EVP_CIPHER_CTX*, unsigned char*, int*); int _EVP_SealUpdate(EVP_CIPHER_CTX* ctx, unsigned char* out, int* outl, const unsigned char* in, int inl) { return EVP_SealUpdate(ctx, out, outl, in, inl); } int _EVP_OpenUpdate(EVP_CIPHER_CTX* ctx, unsigned char* out, int* outl, const unsigned char* in, int inl) { return EVP_OpenUpdate(ctx, out, outl, in, inl); } size_t generic_update(cipher_context& ctx, update_function update_func, void* out, size_t out_len, const void* in, size_t in_len) { assert(out); if (in_len <= 0) { return 0; } assert(in); assert(out_len >= in_len + ctx.algorithm().block_size()); int iout_len = static_cast(out_len); throw_error_if_not(update_func(&ctx.raw(), static_cast(out), &iout_len, static_cast(in), static_cast(in_len)) != 0); return iout_len; } size_t generic_finalize(cipher_context& ctx, finalize_function finalize_func, void* out, size_t out_len) { assert(out); assert(out_len >= ctx.algorithm().block_size()); int iout_len = static_cast(out_len); throw_error_if_not(finalize_func(&ctx.raw(), static_cast(out), &iout_len) != 0); return iout_len; } } void cipher_context::initialize(const cipher_algorithm& _algorithm, cipher_context::cipher_direction direction, const void* key, size_t key_len, const void* iv, ENGINE* impl) { if (key && _algorithm) { if (key_len != _algorithm.key_length()) { throw std::runtime_error("key_len"); } } // Doing the same test on the IV is wrong because for some algorithms, the IV size is dynamic. throw_error_if_not(EVP_CipherInit_ex(&m_ctx, _algorithm.raw(), impl, static_cast(key), static_cast(iv), static_cast(direction)) != 0); } buffer cipher_context::seal_initialize(const cipher_algorithm& _algorithm, void* iv, pkey::pkey pkey) { return seal_initialize(_algorithm, iv, &pkey, &pkey + sizeof(&pkey))[0]; } void cipher_context::open_initialize(const cipher_algorithm& _algorithm, const void* key, size_t key_len, const void* iv, pkey::pkey pkey) { if (key && _algorithm) { if (key_len != _algorithm.key_length()) { throw std::runtime_error("key_len"); } } // Doing the same test on the IV is wrong because for some algorithms, the IV size is dynamic. throw_error_if_not(EVP_OpenInit(&m_ctx, _algorithm.raw(), static_cast(key), static_cast(key_len), static_cast(iv), pkey.raw()) != 0); } size_t cipher_context::add_iso_10126_padding(void* buf, size_t buf_len, size_t max_buf_len) const { assert(buf); assert(buf_len <= max_buf_len); const size_t result_len = get_iso_10126_padding_size(buf_len); if (result_len > max_buf_len) { throw std::logic_error("The resulting buffer is too small"); } const size_t padding_len = result_len - buf_len; unsigned char* padding = reinterpret_cast(buf) + buf_len; random::get_random_bytes(padding, padding_len - 1); padding[padding_len - 1] = static_cast(padding_len); return result_len; } size_t cipher_context::verify_iso_10126_padding(const void* buf, size_t buf_len) const { assert(buf); if (buf_len % algorithm().block_size() != 0) { throw std::logic_error("buf_len should be a multiple of algorithm().block_size()"); } const unsigned char* cbuf = reinterpret_cast(buf); const size_t padding_len = static_cast(cbuf[buf_len - 1]); if ((padding_len > algorithm().block_size()) || (padding_len == 0)) { throw std::logic_error("Impossible padding length"); } return buf_len - padding_len; } size_t cipher_context::update(void* out, size_t out_len, const void* in, size_t in_len) { return generic_update(*this, EVP_CipherUpdate, out, out_len, in, in_len); } size_t cipher_context::seal_update(void* out, size_t out_len, const void* in, size_t in_len) { return generic_update(*this, _EVP_SealUpdate, out, out_len, in, in_len); } size_t cipher_context::open_update(void* out, size_t out_len, const void* in, size_t in_len) { return generic_update(*this, _EVP_OpenUpdate, out, out_len, in, in_len); } size_t cipher_context::finalize(void* out, size_t out_len) { return generic_finalize(*this, EVP_CipherFinal, out, out_len); } size_t cipher_context::seal_finalize(void* out, size_t out_len) { return generic_finalize(*this, EVP_SealFinal, out, out_len); } size_t cipher_context::open_finalize(void* out, size_t out_len) { return generic_finalize(*this, EVP_OpenFinal, out, out_len); } } } freelan-2.0/libs/cryptoplus/src/cipher_stream.cpp000066400000000000000000000054611252300335000222630ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file cipher_stream.cpp * \author Julien KAUFFMANN * \brief A cipher stream class. */ #include "cipher/cipher_stream.hpp" #include namespace cryptoplus { namespace cipher { cipher_stream& cipher_stream::append(const void* buf, size_t buf_len) { size_t out_len = buffer_size(m_buffer) - m_offset; if (out_len < algorithm().block_size() + buf_len) { m_buffer.data().resize(buffer_size(m_buffer) + algorithm().block_size() + buf_len - out_len); out_len = algorithm().block_size() + buf_len; } m_offset += update(buffer_cast(m_buffer) + m_offset, out_len, buf, buf_len); return *this; } void cipher_stream::finalize() { size_t out_len = buffer_size(m_buffer) - m_offset; if (out_len < algorithm().block_size()) { m_buffer.data().resize(buffer_size(m_buffer) + algorithm().block_size() - out_len); out_len = algorithm().block_size(); } m_buffer.data().resize(m_offset + finalize(buffer_cast(m_buffer) + m_offset, out_len)); m_offset = 0; } } } freelan-2.0/libs/cryptoplus/src/cryptoplus.cpp000066400000000000000000000036751252300335000216670ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file cryptoplus.cpp * \author Julien Kauffmann * \brief The global cryptoplus include file implemenation. */ #include "cryptoplus.hpp" namespace cryptoplus { } freelan-2.0/libs/cryptoplus/src/dh_key.cpp000066400000000000000000000063521252300335000207010ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file dh_key.cpp * \author Julien KAUFFMANN * \brief A Diffie-Hellman key class. */ #include "pkey/dh_key.hpp" #include "bio/bio_chain.hpp" #include namespace cryptoplus { template <> pkey::dh_key::deleter_type pointer_wrapper::deleter = DH_free; namespace pkey { namespace { bio::bio_chain get_bio_chain_from_buffer(const void* buf, size_t buf_len) { return bio::bio_chain(BIO_new_mem_buf(const_cast(buf), static_cast(buf_len))); } } dh_key dh_key::generate_parameters(int prime_len, int generator, generate_callback_type callback, void* callback_arg) { return take_ownership(DH_generate_parameters(prime_len, generator, callback, callback_arg)); } dh_key dh_key::from_parameters(const void* buf, size_t buf_len, pem_passphrase_callback_type callback, void* callback_arg) { bio::bio_chain bio_chain = get_bio_chain_from_buffer(buf, buf_len); return from_parameters(bio_chain.first(), callback, callback_arg); } dh_key dh_key::take_ownership(pointer _ptr) { throw_error_if_not(_ptr); return dh_key(_ptr, deleter); } size_t dh_key::compute_key(void* out, size_t out_len, bn::bignum pub_key) const { assert(out_len >= size()); if (out_len < size()) { throw std::invalid_argument("out_len"); } int result = DH_compute_key(static_cast(out), pub_key.raw(), ptr().get()); throw_error_if_not(result >= 0); return result; } } } freelan-2.0/libs/cryptoplus/src/dsa_key.cpp000066400000000000000000000103631252300335000210520ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file dsa_key.cpp * \author Julien KAUFFMANN * \brief A DSA key class. */ #include "pkey/dsa_key.hpp" #include "bio/bio_chain.hpp" #include namespace cryptoplus { template <> pkey::dsa_key::deleter_type pointer_wrapper::deleter = DSA_free; namespace pkey { namespace { bio::bio_chain get_bio_chain_from_buffer(const void* buf, size_t buf_len) { return bio::bio_chain(BIO_new_mem_buf(const_cast(buf), static_cast(buf_len))); } } dsa_key dsa_key::generate_parameters(int bits, void* seed, size_t seed_len, int* counter_ret, unsigned long *h_ret, generate_callback_type callback, void* callback_arg, bool must_take_ownership) { DSA* ptr = DSA_generate_parameters(bits, static_cast(seed), static_cast(seed_len), counter_ret, h_ret, callback, callback_arg); if (must_take_ownership) { return take_ownership(ptr); } else { return ptr; } } dsa_key dsa_key::from_private_key(const void* buf, size_t buf_len, pem_passphrase_callback_type callback, void* callback_arg) { bio::bio_chain bio_chain = get_bio_chain_from_buffer(buf, buf_len); return from_private_key(bio_chain.first(), callback, callback_arg); } dsa_key dsa_key::from_parameters(const void* buf, size_t buf_len, pem_passphrase_callback_type callback, void* callback_arg) { bio::bio_chain bio_chain = get_bio_chain_from_buffer(buf, buf_len); return from_parameters(bio_chain.first(), callback, callback_arg); } dsa_key dsa_key::from_certificate_public_key(const void* buf, size_t buf_len, pem_passphrase_callback_type callback, void* callback_arg) { bio::bio_chain bio_chain = get_bio_chain_from_buffer(buf, buf_len); return from_certificate_public_key(bio_chain.first(), callback, callback_arg); } dsa_key dsa_key::take_ownership(pointer _ptr) { throw_error_if_not(_ptr); return dsa_key(_ptr, deleter); } dsa_key dsa_key::to_public_key() const { bio::bio_chain bio_chain(BIO_s_mem()); write_certificate_public_key(bio_chain.first()); return from_certificate_public_key(bio_chain.first()); } size_t dsa_key::sign(void* out, size_t out_len, const void* buf, size_t buf_len, int type) const { unsigned int _out_len = static_cast(out_len); throw_error_if_not(DSA_sign(type, static_cast(buf), static_cast(buf_len), static_cast(out), &_out_len, ptr().get()) != 0); return _out_len; } } } freelan-2.0/libs/cryptoplus/src/ecdhe.cpp000066400000000000000000000110231252300335000204750ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ecdhe.cpp * \author Julien KAUFFMANN * \brief An Elliptical Curve Diffie-Hellman Ephemeral context class. */ #include "pkey/ecdhe.hpp" #include #include "bio/bio_chain.hpp" namespace cryptoplus { namespace pkey { namespace { struct universal_deleter { void operator()(EVP_PKEY_CTX* ctx) { if (ctx) { ::EVP_PKEY_CTX_free(ctx); } } }; typedef std::unique_ptr evp_pkey_context_type; } ecdhe_context::ecdhe_context(int nid) : m_nid(nid) { } void ecdhe_context::generate_keys() { evp_pkey_context_type parameters_context(EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL)); throw_error_if_not(parameters_context.get()); throw_error_if(EVP_PKEY_paramgen_init(parameters_context.get()) != 1); throw_error_if(EVP_PKEY_CTX_set_ec_paramgen_curve_nid(parameters_context.get(), m_nid) != 1); EVP_PKEY* cparameters = nullptr; throw_error_if_not(EVP_PKEY_paramgen(parameters_context.get(), &cparameters) == 1); pkey parameters = pkey::take_ownership(cparameters); evp_pkey_context_type key_generation_context(EVP_PKEY_CTX_new(parameters.raw(), NULL)); throw_error_if_not(key_generation_context.get()); throw_error_if(EVP_PKEY_keygen_init(key_generation_context.get()) != 1); EVP_PKEY* private_key = nullptr; throw_error_if(EVP_PKEY_keygen(key_generation_context.get(), &private_key) != 1); ::EC_KEY_set_asn1_flag(private_key->pkey.ec, OPENSSL_EC_NAMED_CURVE); m_private_key = pkey::take_ownership(private_key); } buffer ecdhe_context::get_public_key() { if (!m_private_key) { generate_keys(); } bio::bio_chain bio(::BIO_new(::BIO_s_mem())); m_private_key.write_certificate_public_key(bio.first()); char* buf = nullptr; const size_t buf_len = bio.first().get_mem_data(buf); return buffer(buf, buf_len); } buffer ecdhe_context::derive_secret_key(const void* peer_key, size_t peer_key_len) { if (!m_private_key) { generate_keys(); } bio::bio_chain bio(::BIO_new_mem_buf(const_cast(peer_key), static_cast(peer_key_len))); pkey peer_pkey = pkey::from_certificate_public_key(bio.first()); evp_pkey_context_type key_derivation_context(::EVP_PKEY_CTX_new(m_private_key.raw(), NULL)); throw_error_if_not(key_derivation_context.get()); throw_error_if(::EVP_PKEY_derive_init(key_derivation_context.get()) != 1); throw_error_if(::EVP_PKEY_derive_set_peer(key_derivation_context.get(), peer_pkey.raw()) != 1); size_t buf_len = 0; throw_error_if(::EVP_PKEY_derive(key_derivation_context.get(), NULL, &buf_len) != 1); buffer buf(buf_len); throw_error_if(::EVP_PKEY_derive(key_derivation_context.get(), buffer_cast(buf), &buf_len) != 1); return buf; } } } freelan-2.0/libs/cryptoplus/src/error.cpp000066400000000000000000000045311252300335000205640ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file error.cpp * \author Julien Kauffmann * \brief Error helper functions. */ #include "error/error.hpp" #include "error/error_strings.hpp" namespace cryptoplus { namespace error { } const boost::system::error_category& cryptoplus_category() { static cryptoplus_category_impl instance; return instance; } const char* cryptoplus_category_impl::name() const throw() { return "cryptoplus::error"; } std::string cryptoplus_category_impl::message(int ev) const { return error::get_error_string(error::error_type{ static_cast(ev) }); } } freelan-2.0/libs/cryptoplus/src/error_strings.cpp000066400000000000000000000044401252300335000223340ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file error_strings.cpp * \author Julien Kauffmann * \brief Error strings helper functions. */ #include "error/error_strings.hpp" namespace cryptoplus { namespace error { std::string get_error_string(error_type err) { char buf[120]; return std::string(ERR_error_string(err.error_code, buf)); } std::string get_error_string_n(error_type err, size_t len) { char buf[120]; if (len > 120) len = 120; ERR_error_string_n(err.error_code, buf, len); return std::string(buf, len); } } } freelan-2.0/libs/cryptoplus/src/extension.cpp000066400000000000000000000043111252300335000214430ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file extension.cpp * \author Julien KAUFFMANN * \brief A X509 extension class. */ #include "x509/extension.hpp" #include namespace cryptoplus { template <> x509::extension::deleter_type pointer_wrapper::deleter = X509_EXTENSION_free; namespace x509 { extension extension::take_ownership(pointer _ptr) { throw_error_if_not(_ptr); return extension(_ptr, deleter); } } } freelan-2.0/libs/cryptoplus/src/file.cpp000066400000000000000000000071351252300335000203550ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file file.cpp * \author Julien KAUFFMANN * \brief A file class. */ #include #include "file.hpp" #include #ifdef WINDOWS #include #else #include #include #include #include #endif namespace cryptoplus { void secure_fclose(file::pointer ptr) { if (ptr) { fclose(ptr); } } template <> file::deleter_type pointer_wrapper::deleter = secure_fclose; namespace { #ifdef WINDOWS std::string get_last_error_string() { LPSTR msgbuf = NULL; FormatMessageA( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&msgbuf, 0, NULL ); boost::shared_ptr _msgbuf(msgbuf, LocalFree); std::string result(msgbuf, strlen(_msgbuf.get())); return result; } #else std::string get_last_error_string() { return std::string(strerror(errno)); } #endif } file file::open(const std::string& filename, const std::string& mode) { #ifdef MSV file::pointer ptr = 0; int err = fopen_s(&ptr, filename.c_str(), mode.c_str()); if (err != 0) { ptr = 0; } #else file::pointer ptr = fopen(filename.c_str(), mode.c_str()); #endif return take_ownership(ptr); } #ifdef WINDOWS file file::open(const std::wstring& filename, const std::wstring& mode) { #ifdef MSV file::pointer ptr = 0; int err = _wfopen_s(&ptr, filename.c_str(), mode.c_str()); if (err != 0) { ptr = 0; } #else file::pointer ptr = _wfopen(filename.c_str(), mode.c_str()); #endif return take_ownership(ptr); } #endif file file::take_ownership(pointer _ptr) { if (!_ptr) { throw std::runtime_error(get_last_error_string()); } return file(_ptr, deleter); } } freelan-2.0/libs/cryptoplus/src/helpers.cpp000066400000000000000000000036321252300335000210760ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file helpers.cpp * \author Julien Kauffmann * \brief Error helpers. */ #include "error/helpers.hpp" namespace cryptoplus { } freelan-2.0/libs/cryptoplus/src/hmac.cpp000066400000000000000000000045121252300335000203420ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file hmac.cpp * \author Julien KAUFFMANN * \brief HMAC helper functions. */ #include "hash/hmac.hpp" #include "hash/hmac_context.hpp" #include namespace cryptoplus { namespace hash { size_t hmac(void* out, size_t out_len, const void* key, size_t key_len, const void* data, size_t len, const message_digest_algorithm& algorithm, ENGINE* impl) { assert(out); assert(key); assert(data); hmac_context ctx; ctx.initialize(key, key_len, &algorithm, impl); ctx.update(data, len); return ctx.finalize(out, out_len); } } } freelan-2.0/libs/cryptoplus/src/hmac_context.cpp000066400000000000000000000053251252300335000221110ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file hmac_context.cpp * \author Julien KAUFFMANN * \brief A HMAC context class. */ #include "hash/hmac_context.hpp" #include namespace cryptoplus { namespace hash { void hmac_context::initialize(const void* key, size_t key_len, const message_digest_algorithm* _algorithm, ENGINE* impl) { #if OPENSSL_VERSION_NUMBER < 0x01000000 HMAC_Init_ex(&m_ctx, key, static_cast(key_len), _algorithm ? _algorithm->raw() : NULL, impl); #else throw_error_if_not(HMAC_Init_ex(&m_ctx, key, static_cast(key_len), _algorithm ? _algorithm->raw() : NULL, impl) != 0); #endif } size_t hmac_context::finalize(void* md, size_t len) { assert(md); unsigned int ilen = static_cast(len); #if OPENSSL_VERSION_NUMBER < 0x01000000 HMAC_Final(&m_ctx, static_cast(md), &ilen); #else throw_error_if_not(HMAC_Final(&m_ctx, static_cast(md), &ilen) != 0); #endif return ilen; } } } freelan-2.0/libs/cryptoplus/src/integer.cpp000066400000000000000000000045601252300335000210720ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file integer.cpp * \author Julien KAUFFMANN * \brief An ASN1_INTEGER pointer class. */ #include "asn1/integer.hpp" #ifdef MSV // Avoid LNK4221: no public symbols found; archive member will be inacessible namespace { char not_empty; } #endif namespace cryptoplus { namespace asn1 { // We don't need this, because ASN1_INTEGER is an ASN1_STRING. #if 0 template <> integer::deleter_type pointer_wrapper::deleter = ASN1_INTEGER_free; #endif integer integer::take_ownership(pointer _ptr) { throw_error_if_not(_ptr); return integer(_ptr, deleter); } } } freelan-2.0/libs/cryptoplus/src/message_digest.cpp000066400000000000000000000045061252300335000224200ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file message_digest.cpp * \author Julien KAUFFMANN * \brief Message digest helper functions. */ #include "hash/message_digest.hpp" #include "hash/message_digest_context.hpp" #include namespace cryptoplus { namespace hash { size_t message_digest(void* out, size_t out_len, const void* data, size_t len, const message_digest_algorithm& algorithm, ENGINE* impl) { assert(out); assert(data); message_digest_context ctx; ctx.initialize(algorithm, impl); ctx.update(data, len); return ctx.finalize(out, out_len); } } } freelan-2.0/libs/cryptoplus/src/message_digest_algorithm.cpp000066400000000000000000000046151252300335000244670ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file message_digest_algorithm.cpp * \author Julien KAUFFMANN * \brief A message digest algorithm wrapper class. */ #include "hash/message_digest_algorithm.hpp" #include #include namespace cryptoplus { namespace hash { message_digest_algorithm::message_digest_algorithm(int _type) : m_md(EVP_get_digestbynid(_type)) { if (!m_md) { throw std::invalid_argument("type"); } } message_digest_algorithm::message_digest_algorithm(const std::string& _name) : m_md(EVP_get_digestbyname(_name.c_str())) { if (!m_md) { throw std::invalid_argument("name"); } } } } freelan-2.0/libs/cryptoplus/src/message_digest_context.cpp000066400000000000000000000071051252300335000241620ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file message_digest_context.cpp * \author Julien KAUFFMANN * \brief A message digest context class. */ #include "hash/message_digest_context.hpp" #include "pkey/pkey.hpp" #include namespace cryptoplus { namespace hash { size_t message_digest_context::finalize(void* md, size_t md_len) { assert(md); unsigned int ilen = static_cast(md_len); throw_error_if_not(EVP_DigestFinal_ex(&m_ctx, static_cast(md), &ilen) != 0); return ilen; } size_t message_digest_context::sign_finalize(void* sig, size_t sig_len, pkey::pkey& pkey) { assert(sig); unsigned int ilen = static_cast(sig_len); throw_error_if_not(EVP_SignFinal(&m_ctx, static_cast(sig), &ilen, pkey.raw()) != 0); return ilen; } bool message_digest_context::verify_finalize(const void* sig, size_t sig_len, pkey::pkey& pkey) { int result = EVP_VerifyFinal(&m_ctx, static_cast(sig), static_cast(sig_len), pkey.raw()); throw_error_if(result < 0); return (result == 1); } size_t message_digest_context::digest_sign_finalize(void* md, size_t md_len) { throw_error_if_not(EVP_DigestSignFinal(&m_ctx, static_cast(md), &md_len) != 0); return md_len; } bool message_digest_context::digest_verify_finalize(const void* sig, size_t sig_len) { // The const_cast<> below is needed because the prototype in the code is incorrect... // // The documentation clearly states this should be const. // http://www.openssl.org/docs/crypto/EVP_DigestVerifyInit.html int result = EVP_DigestVerifyFinal(&m_ctx, const_cast(static_cast(sig)), static_cast(sig_len)); throw_error_if(result < 0); return (result == 1); } } } freelan-2.0/libs/cryptoplus/src/name.cpp000066400000000000000000000045501252300335000203540ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file name.cpp * \author Julien KAUFFMANN * \brief A X509 name class. */ #include "x509/name.hpp" #include namespace cryptoplus { template <> x509::name::deleter_type pointer_wrapper::deleter = X509_NAME_free; namespace x509 { name name::take_ownership(pointer _ptr) { throw_error_if_not(_ptr); return name(_ptr, deleter); } std::string name::to_string() const { bio::bio_ptr bio(BIO_new(BIO_s_mem())); this->print(bio); BUF_MEM* const str = bio.get_mem_buf(); return std::string(str->data, str->length); } } } freelan-2.0/libs/cryptoplus/src/name_entry.cpp000066400000000000000000000043221252300335000215720ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file name_entry.cpp * \author Julien KAUFFMANN * \brief A X509 name entry class. */ #include "x509/name_entry.hpp" #include namespace cryptoplus { template <> x509::name_entry::deleter_type pointer_wrapper::deleter = X509_NAME_ENTRY_free; namespace x509 { name_entry name_entry::take_ownership(pointer _ptr) { throw_error_if_not(_ptr); return name_entry(_ptr, deleter); } } } freelan-2.0/libs/cryptoplus/src/nullable.cpp000066400000000000000000000036361252300335000212360ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file nullable.cpp * \author Julien KAUFFMANN * \brief A nullable interface. */ #include "nullable.hpp" namespace cryptoplus { } freelan-2.0/libs/cryptoplus/src/object.cpp000066400000000000000000000043111252300335000206750ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file object.cpp * \author Julien KAUFFMANN * \brief An pointer class. */ #include "asn1/object.hpp" #include "error/helpers.hpp" #include namespace cryptoplus { template <> asn1::object::deleter_type pointer_wrapper::deleter = ASN1_OBJECT_free; namespace asn1 { object object::take_ownership(pointer _ptr) { throw_error_if_not(_ptr); return object(_ptr, deleter); } } } freelan-2.0/libs/cryptoplus/src/pbkdf2.cpp000066400000000000000000000060241252300335000206020ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file pbkdf2.cpp * \author Julien KAUFFMANN * \brief PBKDF2 helper functions. */ #include "hash/pbkdf2.hpp" #include #include #if OPENSSL_VERSION_NUMBER < 0x10000000 namespace { int PKCS5_PBKDF2_HMAC(const char* pass, int passlen, const unsigned char* salt, int saltlen, int iter, const EVP_MD* md, int outlen, unsigned char* out) { if (md == EVP_sha1()) { return PKCS5_PBKDF2_HMAC_SHA1(pass, passlen, salt, saltlen, iter, outlen, out); } throw std::invalid_argument("md"); } } #endif #include namespace cryptoplus { namespace hash { size_t pbkdf2(const void* password, size_t passwordlen, const void* salt, size_t saltlen, void* outbuf, size_t outbuflen, const message_digest_algorithm& algorithm, unsigned int iter) { int result = PKCS5_PBKDF2_HMAC( static_cast(password), static_cast(passwordlen), static_cast(salt), static_cast(saltlen), static_cast(iter), algorithm.raw(), static_cast(outbuflen), static_cast(outbuf) ); return result; } } } freelan-2.0/libs/cryptoplus/src/pkey.cpp000066400000000000000000000056761252300335000204160ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file pkey.cpp * \author Julien KAUFFMANN * \brief An EVP_PKEY class. */ #include "pkey/pkey.hpp" #include "bio/bio_chain.hpp" #include namespace cryptoplus { template <> pkey::pkey::deleter_type pointer_wrapper::deleter = EVP_PKEY_free; namespace pkey { namespace { bio::bio_chain get_bio_chain_from_buffer(const void* buf, size_t buf_len) { return bio::bio_chain(BIO_new_mem_buf(const_cast(buf), static_cast(buf_len))); } } pkey pkey::from_private_key(const void* buf, size_t buf_len, pem_passphrase_callback_type callback, void* callback_arg) { bio::bio_chain bio_chain = get_bio_chain_from_buffer(buf, buf_len); return from_private_key(bio_chain.first(), callback, callback_arg); } pkey pkey::from_certificate_public_key(const void* buf, size_t buf_len, pem_passphrase_callback_type callback, void* callback_arg) { bio::bio_chain bio_chain = get_bio_chain_from_buffer(buf, buf_len); return from_certificate_public_key(bio_chain.first(), callback, callback_arg); } pkey pkey::take_ownership(pointer _ptr) { throw_error_if_not(_ptr); return pkey(_ptr, deleter); } } } freelan-2.0/libs/cryptoplus/src/pointer_wrapper.cpp000066400000000000000000000040701252300335000226510ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file pointer_wrapper.cpp * \author Julien KAUFFMANN * \brief A pointer wrapper template class. */ #include "pointer_wrapper.hpp" #ifdef MSV // Avoid LNK4221: no public symbols found; archive member will be inacessible namespace { char not_empty; } #endif namespace cryptoplus { } freelan-2.0/libs/cryptoplus/src/random.cpp000066400000000000000000000041021252300335000207050ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file random.cpp * \author Julien Kauffmann * \brief Randomization helper functions. */ #include "random/random.hpp" #ifdef MSV // Avoid LNK4221: no public symbols found; archive member will be inacessible namespace { char not_empty; } #endif namespace cryptoplus { namespace random { } } freelan-2.0/libs/cryptoplus/src/rsa_key.cpp000066400000000000000000000172451252300335000210760ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file rsa_key.cpp * \author Julien KAUFFMANN * \brief A RSA key class. */ #include "pkey/rsa_key.hpp" #include "bio/bio_chain.hpp" #include namespace cryptoplus { template <> pkey::rsa_key::deleter_type pointer_wrapper::deleter = RSA_free; namespace pkey { namespace { bio::bio_chain get_bio_chain_from_buffer(const void* buf, size_t buf_len) { return bio::bio_chain(BIO_new_mem_buf(const_cast(buf), static_cast(buf_len))); } } rsa_key rsa_key::generate_private_key(int num, unsigned long exponent, generate_callback_type callback, void* callback_arg, bool must_take_ownership) { // Exponent must be odd assert(exponent | 1); RSA* ptr = RSA_generate_key(num, exponent, callback, callback_arg); if (must_take_ownership) { return take_ownership(ptr); } else { return ptr; } } rsa_key rsa_key::from_private_key(const void* buf, size_t buf_len, pem_passphrase_callback_type callback, void* callback_arg) { bio::bio_chain bio_chain = get_bio_chain_from_buffer(buf, buf_len); return from_private_key(bio_chain.first(), callback, callback_arg); } rsa_key rsa_key::from_public_key(const void* buf, size_t buf_len, pem_passphrase_callback_type callback, void* callback_arg) { bio::bio_chain bio_chain = get_bio_chain_from_buffer(buf, buf_len); return from_public_key(bio_chain.first(), callback, callback_arg); } rsa_key rsa_key::from_certificate_public_key(const void* buf, size_t buf_len, pem_passphrase_callback_type callback, void* callback_arg) { bio::bio_chain bio_chain = get_bio_chain_from_buffer(buf, buf_len); return from_certificate_public_key(bio_chain.first(), callback, callback_arg); } rsa_key rsa_key::take_ownership(pointer _ptr) { throw_error_if_not(_ptr); return rsa_key(_ptr, deleter); } rsa_key rsa_key::to_public_key() const { bio::bio_chain bio_chain(BIO_s_mem()); write_public_key(bio_chain.first()); return from_public_key(bio_chain.first()); } void rsa_key::padding_add_PKCS1_PSS(void* out, size_t out_len, const void* buf, size_t buf_len, hash::message_digest_algorithm algorithm, int salt_len) const { assert(out_len >= algorithm.result_size()); assert(buf_len >= algorithm.result_size()); if (out_len < algorithm.result_size()) { throw std::invalid_argument("out_len"); } if (buf_len < algorithm.result_size()) { throw std::invalid_argument("buf_len"); } throw_error_if_not(RSA_padding_add_PKCS1_PSS(ptr().get(), static_cast(out), static_cast(buf), algorithm.raw(), salt_len) != 0); } void rsa_key::verify_PKCS1_PSS(const void* digest, size_t digest_len, const void* buf, size_t /*buf_len*/, hash::message_digest_algorithm algorithm, int salt_len) const { assert(digest_len >= algorithm.result_size()); if (digest_len < algorithm.result_size()) { throw std::invalid_argument("digest_len"); } //TODO: Use buf_len throw_error_if_not(RSA_verify_PKCS1_PSS(ptr().get(), static_cast(digest), algorithm.raw(), static_cast(buf), salt_len) != 0); } size_t rsa_key::private_encrypt(void* out, size_t out_len, const void* buf, size_t buf_len, int padding) const { assert(out_len >= size()); if (out_len < size()) { throw std::invalid_argument("out_len"); } int result = RSA_private_encrypt(static_cast(buf_len), static_cast(buf), static_cast(out), ptr().get(), padding); throw_error_if_not(result >= 0); return result; } size_t rsa_key::public_decrypt(void* out, size_t out_len, const void* buf, size_t buf_len, int padding) const { assert(out_len >= size() - 11); if (out_len < size() - 11) { throw std::invalid_argument("out_len"); } int result = RSA_public_decrypt(static_cast(buf_len), static_cast(buf), static_cast(out), ptr().get(), padding); throw_error_if_not(result >= 0); return result; } size_t rsa_key::public_encrypt(void* out, size_t out_len, const void* buf, size_t buf_len, int padding) const { assert(out_len >= size()); if (out_len < size()) { throw std::invalid_argument("out_len"); } int result = RSA_public_encrypt(static_cast(buf_len), static_cast(buf), static_cast(out), ptr().get(), padding); throw_error_if_not(result >= 0); return result; } size_t rsa_key::private_decrypt(void* out, size_t out_len, const void* buf, size_t buf_len, int padding) const { assert(out_len >= size() - 41); if (out_len < size() - 41) { throw std::invalid_argument("out_len"); } int result = RSA_private_decrypt(static_cast(buf_len), static_cast(buf), static_cast(out), ptr().get(), padding); throw_error_if_not(result >= 0); return result; } size_t rsa_key::sign(void* out, size_t out_len, const void* buf, size_t buf_len, int type) const { unsigned int _out_len = static_cast(out_len); throw_error_if_not(RSA_sign(type, static_cast(buf), static_cast(buf_len), static_cast(out), &_out_len, ptr().get()) != 0); return _out_len; } void rsa_key::verify(const void* _sign, size_t sign_len, const void* buf, size_t buf_len, int type) const { #if OPENSSL_VERSION_NUMBER >= 0x01000000 throw_error_if_not(RSA_verify(type, static_cast(buf), static_cast(buf_len), static_cast(_sign), static_cast(sign_len), ptr().get()) != 0); #else throw_error_if_not(RSA_verify(type, static_cast(const_cast(buf)), static_cast(buf_len), static_cast(const_cast(_sign)), static_cast(sign_len), ptr().get()) != 0); #endif } } } freelan-2.0/libs/cryptoplus/src/store.cpp000066400000000000000000000042451252300335000205710ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file store.cpp * \author Julien KAUFFMANN * \brief A X509 store class. */ #include "x509/store.hpp" #include namespace cryptoplus { template <> x509::store::deleter_type pointer_wrapper::deleter = X509_STORE_free; namespace x509 { store store::take_ownership(pointer _ptr) { throw_error_if_not(_ptr); return store(_ptr, deleter); } } } freelan-2.0/libs/cryptoplus/src/store_context.cpp000066400000000000000000000043511252300335000223330ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file store_context.cpp * \author Julien KAUFFMANN * \brief A X509 store context class. */ #include "x509/store_context.hpp" #include namespace cryptoplus { template <> x509::store_context::deleter_type pointer_wrapper::deleter = X509_STORE_CTX_free; namespace x509 { store_context store_context::take_ownership(pointer _ptr) { throw_error_if_not(_ptr); return store_context(_ptr, deleter); } } } freelan-2.0/libs/cryptoplus/src/string.cpp000066400000000000000000000051151252300335000207400ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file string.cpp * \author Julien KAUFFMANN * \brief An ASN1_STRING pointer class. */ #include "asn1/string.hpp" #include #include namespace cryptoplus { template <> asn1::string::deleter_type pointer_wrapper::deleter = ASN1_STRING_free; namespace asn1 { namespace { void _OPENSSL_free(unsigned char* c) { OPENSSL_free(c); } } string string::take_ownership(pointer _ptr) { throw_error_if_not(_ptr); return string(_ptr, deleter); } std::string string::to_utf8() const { unsigned char* out = NULL; const int _size = ASN1_STRING_to_UTF8(&out, ptr().get()); throw_error_if(_size < 0); const boost::shared_ptr pout(out, _OPENSSL_free); return std::string(out, out + _size); } } } freelan-2.0/libs/cryptoplus/src/tls.cpp000066400000000000000000000072061252300335000202370ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file tls.cpp * \author Julien KAUFFMANN * \brief TLS utility functions. */ #include "tls/tls.hpp" #include "hash/message_digest_context.hpp" #include "pkey/pkey.hpp" #include #include namespace cryptoplus { namespace tls { size_t p_hash(void* out, size_t out_len, const void* key, size_t key_len, const void* data, size_t data_len, const void* data2, size_t data2_len, const hash::message_digest_algorithm& algorithm, ENGINE* impl) { using hash::message_digest_context; using pkey::pkey; assert(out); assert(key); message_digest_context ctx; message_digest_context ctx_a1; message_digest_context ctx_init; ctx.set_flags(EVP_MD_CTX_FLAG_NON_FIPS_ALLOW); pkey mac_key = pkey::from_hmac_key(key, key_len); ctx_init.digest_sign_initialize(algorithm, mac_key, NULL, impl); // Everything is set up. We can start the computation. ctx.copy(ctx_init); if (data) { ctx.digest_sign_update(data, data_len); } if (data2) { ctx.digest_sign_update(data2, data2_len); } buffer a1 = ctx.digest_sign_finalize(); // We got A1 let's compute for real. const size_t chunk_size = algorithm.result_size(); size_t bytes_left = out_len; unsigned char* buf = static_cast(out); while (bytes_left > 0) { ctx.copy(ctx_init); ctx.digest_sign_update(a1); ctx_a1.copy(ctx); if (data) { ctx.digest_sign_update(data, data_len); } if (data2) { ctx.digest_sign_update(data2, data2_len); } if (bytes_left > chunk_size) { const size_t len = ctx.digest_sign_finalize(buf, bytes_left); buf += len; bytes_left -= len; a1 = ctx_a1.digest_sign_finalize(); } else { a1 = ctx.digest_sign_finalize(); std::copy(a1.data().begin(), a1.data().begin() + bytes_left, buf); bytes_left = 0; } } return out_len; } } } freelan-2.0/libs/cryptoplus/src/utctime.cpp000066400000000000000000000073111252300335000211040ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file utctime.cpp * \author Julien KAUFFMANN * \brief An ASN1_UTCTIME pointer class. */ #include "asn1/utctime.hpp" #include "asn1/string.hpp" #include #include namespace cryptoplus { namespace asn1 { namespace { const boost::posix_time::ptime epoch(boost::gregorian::date(1970, 1, 1)); } // We don't need this, because ASN1_UTCTIME is an ASN1_STRING. #if 0 template <> utctime::deleter_type pointer_wrapper::deleter = ASN1_UTCTIME_free; #endif utctime utctime::take_ownership(pointer _ptr) { throw_error_if_not(_ptr); return utctime(_ptr, deleter); } void utctime::set_time(const boost::posix_time::ptime& time) const { set_time(static_cast((time - epoch).total_seconds())); } boost::posix_time::ptime utctime::to_ptime() const { using boost::lexical_cast; std::string str = string(ptr().get()).str(); // str format can either be: // YYMMDDhhmmssZ // YYMMDDhhmmss+hh'mm' // YYMMDDhhmmss-hh'mm' assert(str.size() >= 13); int year = lexical_cast(str.substr(0, 2)); if (year < 50) { year += 2000; } else { year += 1900; } const int month = lexical_cast(str.substr(2, 2)); const int day = lexical_cast(str.substr(4, 2)); boost::gregorian::date date(year, month, day); const int hour = lexical_cast(str.substr(6, 2)); const int minute = lexical_cast(str.substr(8, 2)); const int second = lexical_cast(str.substr(10, 2)); boost::posix_time::time_duration time_duration(hour, minute, second); const char separator = str[12]; if ((separator == '+') || (separator == '-')) { //const int offset_hour = lexical_cast(str.substr(13, 2)); //const int offset_minute = lexical_cast(str.substr(16, 2)); } //TODO: Use the separator and offset information return boost::posix_time::ptime(date, time_duration); } } } freelan-2.0/libs/cryptoplus/src/verify_param.cpp000066400000000000000000000043721252300335000221220ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file verify_param.cpp * \author Julien KAUFFMANN * \brief A class that holds X509 verification parameters. */ #include "x509/verify_param.hpp" #include namespace cryptoplus { template <> x509::verify_param::deleter_type pointer_wrapper::deleter = X509_VERIFY_PARAM_free; namespace x509 { verify_param verify_param::take_ownership(pointer _ptr) { throw_error_if_not(_ptr); return verify_param(_ptr, deleter); } } } freelan-2.0/libs/cryptoplus/src/x509v3_context.cpp000066400000000000000000000045171252300335000221610ustar00rootroot00000000000000/* * libcryptoplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libcryptoplus. * * libcryptoplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libcryptoplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libcryptoplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file x509v3_context.cpp * \author Julien KAUFFMANN * \brief A X509 V3 context class. */ #include "x509/x509v3_context.hpp" #include namespace cryptoplus { void x509v3_context_delete(x509::x509v3_context::pointer ptr) { delete ptr; } template <> x509::x509v3_context::deleter_type pointer_wrapper::deleter = cryptoplus::x509v3_context_delete; namespace x509 { x509v3_context x509v3_context::take_ownership(pointer _ptr) { throw_error_if_not(_ptr); return x509v3_context(_ptr, deleter); } } } freelan-2.0/libs/executeplus/000077500000000000000000000000001252300335000162575ustar00rootroot00000000000000freelan-2.0/libs/executeplus/README.md000066400000000000000000000010451252300335000175360ustar00rootroot00000000000000# What is libexecuteplus? libexecuteplus provides portable C++ execution functions. # Licensing All code is licensed under the GPLv3. See gpl-3.0.txt. If you are interested in using this project under a different license, please [contact me](mailto:julien.kauffmann__AT__freelan.org). I don't bite and I probably won't charge (at least, not much). # Does the project have a website ? Yes, it does. And [here](http://www.freelan.org) it is. You may also find the [git repository](https://github.com/freelan-developers/freelan-all) on github. freelan-2.0/libs/executeplus/SConscript000066400000000000000000000006021252300335000202670ustar00rootroot00000000000000import os import sys Import('env dirs name') env = env.Clone() local_include_dir = Dir(os.path.join('include', name)) env.Prepend(CPPPATH=[local_include_dir]) sources = env.RGlob('src', '*.cpp') includes = env.RInstall(dirs['root'], local_include_dir, ['*.hpp']) library = env.StaticLibrary(target=os.path.join(str(dirs['lib']), name), source=sources) Return('library includes') freelan-2.0/libs/executeplus/include/000077500000000000000000000000001252300335000177025ustar00rootroot00000000000000freelan-2.0/libs/executeplus/include/executeplus/000077500000000000000000000000001252300335000222505ustar00rootroot00000000000000freelan-2.0/libs/executeplus/include/executeplus/error.hpp000066400000000000000000000071261252300335000241200ustar00rootroot00000000000000/* * libexecuteplus - A portable execution library. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libexecuteplus. * * libexecuteplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libexecuteplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libexecuteplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file error.hpp * \author Julien Kauffmann * \brief The errors. */ #pragma once #include #include #include namespace executeplus { /** * @brief Get the default server error category. * @return The default server error category instance. * * @warning The first call to this function is thread-safe only starting with C++11. */ const boost::system::error_category& executeplus_category(); /** * The list of errors. */ enum class executeplus_error { success = 0, external_process_failed }; /** * @brief Create an error_code instance for the given error. * @param error The error. * @return The error_code instance. */ inline boost::system::error_code make_error_code(executeplus_error error) { return boost::system::error_code(static_cast(error), executeplus_category()); } /** * @brief Create an error_condition instance for the given error. * @param error The error. * @return The error_condition instance. */ inline boost::system::error_condition make_error_condition(executeplus_error error) { return boost::system::error_condition(static_cast(error), executeplus_category()); } /** * @brief A server error category. */ class executeplus_category_impl : public boost::system::error_category { public: /** * @brief Get the name of the category. * @return The name of the category. */ virtual const char* name() const throw(); /** * @brief Get the error message for a given error. * @param ev The error numeric value. * @return The message associated to the error. */ virtual std::string message(int ev) const; }; } namespace boost { namespace system { template <> struct is_error_code_enum< ::executeplus::executeplus_error> : public boost::true_type {}; } } freelan-2.0/libs/executeplus/include/executeplus/executeplus.hpp000066400000000000000000000036041252300335000253320ustar00rootroot00000000000000/* * libexecuteplus - A portable execution library. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libexecuteplus. * * libexecuteplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libexecuteplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libexecuteplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file executeplus.hpp * \author Julien KAUFFMANN * \brief Execution functions. */ #pragma once namespace executeplus { } freelan-2.0/libs/executeplus/include/executeplus/os.hpp000066400000000000000000000067021252300335000234070ustar00rootroot00000000000000/* * libexecuteplus - A portable execution library. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libexecuteplus. * * libexecuteplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libexecuteplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libexecuteplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file os.hpp * \brief Macro to know the operating system. * * - UNIX: Unix-like operating system.\n * - LINUX: Linux operating system.\n * - SUNOS: Sun operating system.\n * - MACINTOSH: Macintosh or MacOS operating system.\n * - WINDOWS: MS Windows operating system.\n * - MSDOS: MS DOS operating system.\n * * \author Julien KAUFFMANN * \author Sebastien VINCENT */ #pragma once /* * Extract the "MACINTOSH" flag from the compiler. */ #if defined(__APPLE__) #define UNIX #define MACINTOSH #endif /* * Extract the "SUNOS" flag from the compiler. */ #if defined(sun) #define UNIX #define SUNOS #endif /* * Extract the "UNIX" flag from compiler. */ #ifdef __linux__ #define UNIX #define LINUX #endif /* * Extract the "BSD" flag from compiler. */ #if defined(BSD) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) #define BSD #define UNIX #endif /* * Extract the "MSDOS" flag from the compiler. */ #ifdef __MSDOS__ #define MSDOS #undef UNIX #endif /* * Extract the "WINDOWS" flag from the compiler. */ #if defined(_Windows) || defined(__WINDOWS__) || \ defined(__WIN32__) || defined(WIN32) || \ defined(__WINNT__) || defined(__NT__) || \ defined(_WIN32) || defined(_WIN64) #define WINDOWS #ifdef _MSC_VER #define MSV #if defined(DEBUG) || defined(DEBUGTRACE) #ifdef NDEBUG #undef NDEBUG #endif #else #ifndef NDEBUG #define NDEBUG #endif #endif #else #undef MSV #endif #undef UNIX #undef MSDOS #endif /* * Remove the WINDOWS flag when using MACINTOSH. */ #ifdef MACINTOSH #undef WINDOWS #endif /* * Assume UNIX if not Windows, Macintosh or MSDOS. */ #if !defined(WINDOWS) && !defined(MACINTOSH) && !defined(MSDOS) #define UNIX #endif freelan-2.0/libs/executeplus/include/executeplus/posix_system.hpp000066400000000000000000000050021252300335000255240ustar00rootroot00000000000000/* * libexecuteplus - A portable execution library. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libexecuteplus. * * libexecuteplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libexecuteplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libexecuteplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file posix_system.hpp * \author Julien KAUFFMANN * \brief The POSIX system functions. */ #pragma once #include "os.hpp" #ifdef UNIX #include #include #include #include namespace executeplus { std::map get_current_environment(); int execute(const std::vector& args, const std::map& env, boost::system::error_code& ec, std::ostream* output = nullptr); int execute(const std::vector& args, const std::map& env, std::ostream* output = nullptr); void checked_execute(const std::vector& args, const std::map& env, std::ostream* output = nullptr); } #endif freelan-2.0/libs/executeplus/include/executeplus/windows_system.hpp000066400000000000000000000055421252300335000260650ustar00rootroot00000000000000/* * libexecuteplus - A portable execution library. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libexecuteplus. * * libexecuteplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libexecuteplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libexecuteplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file windows_system.hpp * \author Julien KAUFFMANN * \brief The Windows system functions. */ #pragma once #include "os.hpp" #ifdef WINDOWS #include #include #include #include namespace executeplus { #ifdef UNICODE std::map get_current_environment(); int execute(const std::vector& args, const std::map& env, boost::system::error_code& ec); int execute(const std::vector& args, const std::map& env); void checked_execute(const std::vector& args, const std::map& env); #else std::map get_current_environment(); int execute(const std::vector& args, const std::map& env, boost::system::error_code& ec); int execute(const std::vector& args, const std::map& env); void checked_execute(const std::vector& args, const std::map& env); #endif } #endif freelan-2.0/libs/executeplus/libexecuteplus.vcxproj000066400000000000000000000326331252300335000227400ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {67D44B66-2B37-4FEC-90AD-F3A64B5BA1F4} Win32Proj libexecuteplus StaticLibrary true v120 Unicode StaticLibrary true v120 Unicode StaticLibrary false v120 true Unicode StaticLibrary false v120 true Unicode $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ ClCompile $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ ClCompile $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ ClCompile $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ ClCompile Level3 Disabled USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;DEBUG;TAP_ID="tap0901";_WIN32_WINNT=0x0600;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\executeplus 4996;4396 Windows true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 Disabled USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;DEBUG;TAP_ID="tap0901";_WIN32_WINNT=0x0600;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\executeplus 4996;4396 Windows true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 MaxSpeed true true USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;TAP_ID="tap0901";_WIN32_WINNT=0x0600;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\executeplus 4996;4396 Windows true true true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 MaxSpeed true true USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;TAP_ID="tap0901";_WIN32_WINNT=0x0600;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\executeplus 4996;4396 Windows true true true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template freelan-2.0/libs/executeplus/libexecuteplus.vcxproj.filters000066400000000000000000000034471252300335000244100ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Header Files Header Files Header Files Header Files Header Files Source Files Source Files Source Files Source Files freelan-2.0/libs/executeplus/src/000077500000000000000000000000001252300335000170465ustar00rootroot00000000000000freelan-2.0/libs/executeplus/src/error.cpp000066400000000000000000000047221252300335000207100ustar00rootroot00000000000000/* * libexecuteplus - A portable execution library. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libexecuteplus. * * libexecuteplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libexecuteplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libexecuteplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file error.cpp * \author Julien Kauffmann * \brief The errors. */ #include "error.hpp" namespace executeplus { const boost::system::error_category& executeplus_category() { static executeplus_category_impl instance; return instance; } const char* executeplus_category_impl::name() const throw() { return "executeplus::error"; } std::string executeplus_category_impl::message(int ev) const { switch (static_cast(ev)) { case executeplus_error::success: { return "Success"; } case executeplus_error::external_process_failed: { return "A call to an external process failed"; } default: { return "Unknown executeplus error"; } } } } freelan-2.0/libs/executeplus/src/executeplus.cpp000066400000000000000000000036221252300335000221230ustar00rootroot00000000000000/* * libexecuteplus - A portable execution library. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libexecuteplus. * * libexecuteplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libexecuteplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libexecuteplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file executeplus.cpp * \author Julien KAUFFMANN * \brief Execution functions. */ #include "executeplus.hpp" namespace executeplus { } freelan-2.0/libs/executeplus/src/posix_system.cpp000066400000000000000000000175011252300335000223240ustar00rootroot00000000000000/* * libexecuteplus - A portable execution library. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libexecuteplus. * * libexecuteplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libexecuteplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libexecuteplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file posix_system.cpp * \author Julien KAUFFMANN * \brief Posix system primitives. */ #include "posix_system.hpp" #ifdef UNIX #include "error.hpp" #include #include #include #include #include #include #include #include #include extern char** environ; namespace executeplus { std::map get_current_environment() { std::map result; for (size_t count = 0; environ[count]; ++count) { const std::string line = std::string(environ[count]); const auto pos = line.find('='); if (pos == std::string::npos) { result[line] = std::string(); } else { const std::string key = line.substr(0, pos); const std::string value = line.substr(pos + 1); result[key] = value; } } return result; } int execute(const std::vector& args, const std::map& env, boost::system::error_code& ec, std::ostream* output) { #if FREELAN_DEBUG std::cout << "Executing:"; for (auto&& arg : args) { std::cout << " " << arg; } std::cout << std::endl; std::cout << "Environment starts:" << std::endl; for (auto&& pair : env) { std::cout << pair.first << "=" << pair.second << std::endl; } std::cout << "Environment ends." << std::endl; #endif int fd[2] = {0, 0}; if (::pipe(fd) < 0) { ec = boost::system::error_code(errno, boost::system::system_category()); return -1; } int output_fd[2] = {0, 0}; if (output) { if (::pipe(output_fd) < 0) { ec = boost::system::error_code(errno, boost::system::system_category()); return -1; } } const pid_t pid = fork(); switch (pid) { case -1: { // fork() failed. if (output) { ::close(output_fd[0]); ::close(output_fd[1]); } ::close(fd[0]); ::close(fd[1]); ec = boost::system::error_code(errno, boost::system::system_category()); return -1; } case 0: { // Child process const int fdlimit = ::sysconf(_SC_OPEN_MAX); if (output) { ::dup2(output_fd[1], STDOUT_FILENO); ::dup2(output_fd[1], STDERR_FILENO); ::close(output_fd[1]); } for (int n = 0; n < fdlimit; ++n) { if ((n != fd[1]) && (!output || ((n != STDOUT_FILENO) && (n != STDERR_FILENO)))) { ::close(n); } } fcntl(fd[1], F_SETFD, FD_CLOEXEC); // Estimate the required size for the argv buffer. std::vector argv_buffer; std::vector argv(args.size() + 1, nullptr); { // One null-terminated byte per arg. size_t buffer_size = args.size(); for (auto&& arg : args) { buffer_size += arg.size(); } argv_buffer.resize(buffer_size, 0x00); auto offset = argv_buffer.begin(); for (size_t i = 0; i != args.size(); ++i) { const auto& arg = args[i]; argv[i] = &*offset; offset = std::copy(arg.begin(), arg.end(), offset); *(offset++) = '\0'; } } // Estimate the required size for the envp buffer. std::vector envp_buffer; std::vector envp(env.size() + 1, nullptr); { // One null-terminated byte per arg. size_t buffer_size = env.size(); for (auto&& pair : env) { buffer_size += pair.first.size() + 1 + pair.second.size(); } envp_buffer.resize(buffer_size, 0x00); auto offset = envp_buffer.begin(); for (size_t i = 0; i != env.size(); ++i) { auto it = env.begin(); std::advance(it, i); const auto& pair = *it; envp[i] = &*offset; offset = std::copy(pair.first.begin(), pair.first.end(), offset); *(offset++) = '='; offset = std::copy(pair.second.begin(), pair.second.end(), offset); *(offset++) = '\0'; } } // Execute the file specified ::execve(argv[0], &argv[0], &envp[0]); // Something went wrong. Sending back errno to parent process then exiting. if (::write(fd[1], &errno, sizeof(errno))) {} _exit(127); break; } default: { // Parent process ::close(fd[1]); if (output) { ::close(output_fd[1]); } int child_errno = 0; if (output) { // This will take ownership of the file descriptor. boost::iostreams::file_descriptor_source output_src(output_fd[0], boost::iostreams::close_handle); boost::iostreams::stream output_is(output_src); (*output) << output_is.rdbuf(); } const ssize_t readcnt = ::read(fd[0], &child_errno, sizeof(child_errno)); ::close(fd[0]); if (readcnt < 0) { ec = boost::system::error_code(errno, boost::system::system_category()); return -1; } else if (readcnt == sizeof(child_errno)) { ec = boost::system::error_code(child_errno, boost::system::system_category()); return -1; } int status = 0; if (::waitpid(pid, &status, 0) != pid) { ec = boost::system::error_code(child_errno, boost::system::system_category()); return -1; } else { if (WIFEXITED(status)) { const int result = WEXITSTATUS(status); #if FREELAN_DEBUG std::cout << "Exit status: " << result << std::endl; #endif return result; } } break; } } return EXIT_FAILURE; } int execute(const std::vector& args, const std::map& env, std::ostream* output) { boost::system::error_code ec; const auto result = execute(args, env, ec, output); if (result < 0) { throw boost::system::system_error(ec); } return result; } void checked_execute(const std::vector& args, const std::map& env, std::ostream* output) { if (execute(args, env, output) != 0) { throw boost::system::system_error(make_error_code(executeplus_error::external_process_failed)); } } } #endif freelan-2.0/libs/executeplus/src/windows_system.cpp000066400000000000000000000271521252300335000226570ustar00rootroot00000000000000/* * libexecuteplus - A portable execution library. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libexecuteplus. * * libexecuteplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libexecuteplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libexecuteplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file windows_system.cpp * \author Julien KAUFFMANN * \brief Windows system primitives. */ #include "windows_system.hpp" #ifdef WINDOWS #include "error.hpp" #include #include #include #include #include #include #include #include #include namespace executeplus { namespace { template struct argument_helper; template <> struct argument_helper { static const char ESCAPE_CHARACTER = '\\'; static const char QUOTE_CHARACTER = '"'; static const char EQUAL_CHARACTER = '='; static const char NULL_CHARACTER = '\0'; }; template <> struct argument_helper { static const wchar_t ESCAPE_CHARACTER = L'\\'; static const wchar_t QUOTE_CHARACTER = L'"'; static const wchar_t EQUAL_CHARACTER = L'='; static const wchar_t NULL_CHARACTER = L'\0'; }; struct EnvironmentStringsDeleter { void operator()(wchar_t* p) { ::FreeEnvironmentStringsW(p); } void operator()(char* p) { ::FreeEnvironmentStringsA(p); } }; template const std::unique_ptr get_environment_strings(); template <> const std::unique_ptr get_environment_strings() { return std::unique_ptr(::GetEnvironmentStringsW()); } #ifndef UNICODE template <> const std::unique_ptr get_environment_strings() { return std::unique_ptr(::GetEnvironmentStringsA()); } #endif template std::map, std::basic_string> get_current_environment() { typedef std::basic_string string_type; std::map result; const auto environment_strings = get_environment_strings(); auto ptr = environment_strings.get(); if (ptr) { while (*ptr) { const string_type line(ptr); // Environment variables that start with an equal sign are private to the shell and should be ignored. if (*ptr != argument_helper::EQUAL_CHARACTER) { const auto pos = line.find(argument_helper::EQUAL_CHARACTER); if (pos == string_type::npos) { // Discard the result. } else { const string_type key = line.substr(0, pos); const string_type value = line.substr(pos + 1); result[key] = value; } } ptr += line.size() + 1; } } return result; } class handle_closer { public: handle_closer(HANDLE handle) : m_handle(handle) {} ~handle_closer() { ::CloseHandle(m_handle); } private: HANDLE m_handle; }; void output(const char* str) { std::cout << str << std::endl; } void output(const wchar_t* str) { std::wcout << str << std::endl; } bool has_escapable_characters(const std::string& str) { return (str.find_first_of(" \t\n\v\"") != std::string::npos); } bool has_escapable_characters(const std::wstring& str) { return (str.find_first_of(L" \t\n\v\"") != std::string::npos); } template std::basic_string escape_argument(const std::basic_string& arg) { std::basic_string result(1, argument_helper::QUOTE_CHARACTER); for (auto it = arg.begin();; ++it) { unsigned int escapes_count = 0; while ((it != arg.end()) && (*it == argument_helper::ESCAPE_CHARACTER)) { ++it; ++escapes_count; } if (it == arg.end()) { result.append(escapes_count * 2, argument_helper::ESCAPE_CHARACTER); break; } else if (*it == argument_helper::QUOTE_CHARACTER) { result.append(escapes_count * 2 + 1, argument_helper::ESCAPE_CHARACTER); result.push_back(*it); } else { result.append(escapes_count, argument_helper::ESCAPE_CHARACTER); result.push_back(*it); } } result.push_back(argument_helper::QUOTE_CHARACTER); return result; } template std::basic_string escape_argument_if_needed(const std::basic_string& arg) { if (!arg.empty() && !has_escapable_characters(arg)) { return arg; } else { return escape_argument(arg); } } DWORD do_create_process(const char* application, char* command_line, char* env, STARTUPINFOA& si, PROCESS_INFORMATION& pi) { return ::CreateProcessA(application, command_line, NULL, NULL, FALSE, 0, env, NULL, &si, &pi); } DWORD do_create_process(const wchar_t* application, wchar_t* command_line, wchar_t* env, STARTUPINFOW& si, PROCESS_INFORMATION& pi) { return ::CreateProcessW(application, command_line, NULL, NULL, FALSE, CREATE_UNICODE_ENVIRONMENT, env, NULL, &si, &pi); } template struct startupinfo; template <> struct startupinfo { typedef STARTUPINFOA type; }; template <> struct startupinfo { typedef STARTUPINFOW type; }; template DWORD create_process(const CharType* application, CharType* command_line, CharType* env) { DWORD exit_status; typename startupinfo::type si; si.cb = sizeof(si); si.lpReserved = NULL; si.lpDesktop = NULL; si.lpTitle = NULL; si.dwX = 0; si.dwY = 0; si.dwXSize = 0; si.dwYSize = 0; si.dwXCountChars = 0; si.dwYCountChars = 0; si.dwFillAttribute = 0; si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; // Remove STARTF_USESTDHANDLES to show stdout si.wShowWindow = SW_HIDE; si.cbReserved2 = 0; si.lpReserved2 = NULL; si.hStdInput = INVALID_HANDLE_VALUE; #if FREELAN_DEBUG si.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE); #else si.hStdOutput = INVALID_HANDLE_VALUE; #endif si.hStdError = INVALID_HANDLE_VALUE; PROCESS_INFORMATION pi; #if FREELAN_DEBUG output(command_line); #endif if (!do_create_process(application, command_line, env, si, pi)) { throw boost::system::system_error(::GetLastError(), boost::system::system_category()); } handle_closer thread_closer(pi.hThread); handle_closer process_closer(pi.hProcess); DWORD wait_result = ::WaitForSingleObject(pi.hProcess, INFINITE); switch (wait_result) { case WAIT_OBJECT_0: { DWORD exit_code = 0; if (::GetExitCodeProcess(pi.hProcess, &exit_code)) { exit_status = static_cast(exit_code); } else { throw boost::system::system_error(::GetLastError(), boost::system::system_category()); } break; } default: { throw boost::system::system_error(::GetLastError(), boost::system::system_category()); } } return exit_status; } template int do_execute(const std::vector>& args, const std::map, std::basic_string>& env, boost::system::error_code& ec) { if (args.empty()) { ec = make_error_code(executeplus_error::external_process_failed); return EXIT_FAILURE; } const std::basic_string application = args.front(); std::basic_ostringstream command_line_buffer; std::basic_ostringstream environment_string_buffer; for (auto it = args.begin(); it != args.end(); ++it) { if (it != args.begin()) { command_line_buffer << " "; } command_line_buffer << escape_argument_if_needed(*it); } for (auto&& pair : env) { environment_string_buffer << pair.first << argument_helper::EQUAL_CHARACTER << pair.second << argument_helper::NULL_CHARACTER; } std::basic_string command_line = command_line_buffer.str(); std::basic_string environment_string = environment_string_buffer.str(); return create_process(application.c_str(), command_line.empty() ? nullptr : &command_line[0], environment_string.empty() ? nullptr : &environment_string[0]); } template int do_execute(const std::vector>& args, const std::map, std::basic_string>& env) { boost::system::error_code ec; const auto result = do_execute(args, env, ec); if (result < 0) { throw boost::system::system_error(ec); } return result; } template void do_checked_execute(const std::vector>& args, const std::map, std::basic_string>& env) { if (do_execute(args, env) != 0) { throw boost::system::system_error(make_error_code(executeplus_error::external_process_failed)); } } } #ifdef UNICODE std::map get_current_environment() { return get_current_environment(); } #else std::map get_current_environment() { return get_current_environment(); } #endif #ifdef UNICODE int execute(const std::vector& args, const std::map& env, boost::system::error_code& ec) #else int execute(const std::vector& args, const std::map& env, boost::system::error_code& ec) #endif { return do_execute(args, env, ec); } #ifdef UNICODE int execute(const std::vector& args, const std::map& env) #else int execute(const std::vector& args, const std::map& env) #endif { return do_execute(args, env); } #ifdef UNICODE void checked_execute(const std::vector& args, const std::map& env) #else void checked_execute(const std::vector& args, const std::map& env) #endif { do_checked_execute(args, env); } } #endif freelan-2.0/libs/freelan/000077500000000000000000000000001252300335000153255ustar00rootroot00000000000000freelan-2.0/libs/freelan/README.md000066400000000000000000000013121252300335000166010ustar00rootroot00000000000000# What is libfreelan? libfreelan is a portable C++ library that allows creation of peer-to-peer virtual private networks over IPv4/IPv6 networks. It makes a great use of [boost::asio](http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio.html). # Licensing All code is licensed under the GPLv3. See gpl-3.0.txt. If you are interested in using this project under a different license, please [contact me](mailto:julien.kauffmann__AT__freelan.org). I don't bite and I probably won't charge (at least, not much). # Does the project have a website ? Yes, it does. And [here](http://www.freelan.org) it is. You may also find the [git repository](https://github.com/freelan-developers/freelan-all) on github. freelan-2.0/libs/freelan/SConscript000066400000000000000000000005431252300335000173410ustar00rootroot00000000000000Import('env dirs name') import os env = env.Clone() local_include_dir = Dir(os.path.join('include', name)) env.Prepend(CPPPATH=[local_include_dir]) includes = env.RInstall(dirs['root'], local_include_dir, ['*.hpp']) library = env.StaticLibrary(target=os.path.join(str(dirs['lib']), name), source=env.RGlob('src', '*.cpp')) Return('library includes') freelan-2.0/libs/freelan/include/000077500000000000000000000000001252300335000167505ustar00rootroot00000000000000freelan-2.0/libs/freelan/include/freelan/000077500000000000000000000000001252300335000203645ustar00rootroot00000000000000freelan-2.0/libs/freelan/include/freelan/configuration.hpp000066400000000000000000000456031252300335000237540ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file configuration.hpp * \author Julien KAUFFMANN * \brief The configuration structure. */ #ifndef FREELAN_CONFIGURATION_HPP #define FREELAN_CONFIGURATION_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "mtu.hpp" #include "mss.hpp" #include "metric.hpp" #include "ip_route.hpp" namespace freelan { class core; /** * \brief The server configuration. */ struct server_configuration { /** * \brief The endpoint type. */ typedef asiotap::endpoint endpoint; /** * \brief Create a new server configuration. */ server_configuration(); /** * \brief Whether the server mechanism is enabled. */ bool enabled; /** * \brief The endpoint to listen on. */ endpoint listen_on; /** * \brief The server protocol type. */ enum class server_protocol_type { http, /**< \brief HTTP. */ https /**< \brief HTTPS. */ }; /** * \brief The protocol to use. */ server_protocol_type protocol; /** * \brief The certificate type. */ typedef cryptoplus::x509::certificate cert_type; /** * \brief The key type. */ typedef cryptoplus::pkey::pkey key_type; /** * \brief The server certificate to use for the web server. */ cert_type server_certificate; /** * \brief The server private key to use for the web server. */ key_type server_private_key; /** * \brief The CA certificate to use to sign certificate requests. */ cert_type certification_authority_certificate; /** * \brief The CA private key to use to sign certificate requests. */ key_type certification_authority_private_key; /** * \brief The authentication script. */ boost::filesystem::path authentication_script; /** * \brief The registration validity duration. */ boost::posix_time::time_duration registration_validity_duration; }; /** * \brief The client configuration. */ struct client_configuration { /** * \brief The endpoint type. */ typedef asiotap::endpoint endpoint; /** * \brief The endpoint list type. */ typedef std::set endpoint_list; /** * \brief Create a new client configuration. */ client_configuration(); /** * \brief Whether the client mechanism is enabled. */ bool enabled; /** * \brief The endpoint to connect to. */ endpoint server_endpoint; /** * \brief The client protocol type. */ typedef server_configuration::server_protocol_type client_protocol_type; /** * \brief The protocol to use. */ client_protocol_type protocol; /** * \brief Whether to disable peer verification. */ bool disable_peer_verification; /** * \brief Whether to disable host verification. */ bool disable_host_verification; /** * \brief The username. */ std::string username; /** * \brief The password. */ std::string password; /** * \brief The public endpoints to advertise. */ endpoint_list public_endpoint_list; }; /** * \brief The FSCP related options type. */ struct fscp_configuration { /** * \brief The endpoint type. */ typedef asiotap::endpoint endpoint; /** * \brief The endpoint list type. */ typedef std::set endpoint_list; /** * \brief The hostname resolution protocol type. */ enum hostname_resolution_protocol_type { HRP_IPV4 = PF_INET, /**< \brief The IPv4 protocol. */ HRP_IPV6 = PF_INET6 /**< \brief The IPv6 protocol. */ }; /** * \brief The certificate type. */ typedef fscp::identity_store::cert_type cert_type; /** * \brief The certificate list type. */ typedef std::vector cert_list_type; /** * \brief Create a new FSCP configuration. */ fscp_configuration(); /** * \brief The endpoint to listen on. */ endpoint listen_on; /** * \brief The device to listen on. */ std::string listen_on_device; /** * \brief The contact list. */ endpoint_list contact_list; /** * \brief The "accept contact requests" flag. */ bool accept_contact_requests; /** * \brief The "accept contacts" flag. */ bool accept_contacts; /** * \brief The dynamic contact list. */ cert_list_type dynamic_contact_list; /** * \brief The never contact list. */ asiotap::ip_network_address_list never_contact_list; /** * \brief The hostname resolution protocol. */ hostname_resolution_protocol_type hostname_resolution_protocol; /** * \brief The hello timeout. */ boost::posix_time::time_duration hello_timeout; /** * \brief The list of allowed cipher suites. */ fscp::cipher_suite_list_type cipher_suite_capabilities; /** * \brief The list of allowed elliptic curves. */ fscp::elliptic_curve_list_type elliptic_curve_capabilities; }; /** * \brief The security related options type. */ struct security_configuration { /** * \brief The certificate validation method type. */ enum certificate_validation_method_type { CVM_DEFAULT, /**< \brief The default certificate validation method. */ CVM_NONE /**< \brief No certificate validation. */ }; /** * \brief The certificate revocation validation method type. */ enum certificate_revocation_validation_method_type { CRVM_LAST, /**< \brief Only the last certificate of the chain is checked for revocation. */ CRVM_ALL, /**< \brief All certificates from the chain are checked for revocation. */ CRVM_NONE /**< \brief No certificate is checked for revocation. */ }; /** * \brief The certificate type. */ typedef fscp::identity_store::cert_type cert_type; /** * \brief The certificate revocation list type. */ typedef cryptoplus::x509::certificate_revocation_list crl_type; /** * \brief The certificate list type. */ typedef std::vector cert_list_type; /** * \brief The certificate revocation list list type. */ typedef std::vector crl_list_type; /** * \brief Constructor. */ security_configuration(); /** * \brief The identity. */ boost::optional identity; /** * \brief The certificate validation method. */ certificate_validation_method_type certificate_validation_method; /** * \brief The certificate validation script. */ boost::filesystem::path certificate_validation_script; /** * \brief The certificate authorities. */ cert_list_type certificate_authority_list; /** * \brief The certificate revocation validation method. */ certificate_revocation_validation_method_type certificate_revocation_validation_method; /** * \brief The certificate revocation lists. */ crl_list_type certificate_revocation_list_list; }; /** * \brief Tap adapter related options type. */ struct tap_adapter_configuration { /** * \brief The ethernet address type. */ typedef asiotap::osi::ethernet_address ethernet_address_type; /** * \brief The tap adapter type. */ enum class tap_adapter_type { tap = 0, tun = 1 }; /** * \brief Constructor. */ tap_adapter_configuration(); /** * \brief Whether the tap adapter is enabled. */ bool enabled; /** * \brief The tap adapter type. */ tap_adapter_type type; /** * \brief The tap adapter's name. */ std::string name; /** * \brief The tap adapter's MTU. */ mtu_type mtu; /** * \brief The MSS override. */ mss_type mss_override; /** * \brief The tap adapter's metric. */ metric_type metric; /** * \brief The IPv4 tap adapter address. */ asiotap::ipv4_network_address ipv4_address_prefix_length; /** * \brief The IPv6 tap adapter address. */ asiotap::ipv6_network_address ipv6_address_prefix_length; /** * \brief The remote IPv4 address. */ boost::optional remote_ipv4_address; /** * \brief Whether to enable the ARP proxy. */ bool arp_proxy_enabled; /** * \brief The ARP proxy fake ethernet address. */ ethernet_address_type arp_proxy_fake_ethernet_address; /** * \brief Whether to enable the DHCP proxy. */ bool dhcp_proxy_enabled; /** * \brief The DHCP server IPv4 address. */ asiotap::ipv4_network_address dhcp_server_ipv4_address_prefix_length; /** * \brief The DHCP server IPv6 address. */ asiotap::ipv6_network_address dhcp_server_ipv6_address_prefix_length; /** * \brief The up script. */ boost::filesystem::path up_script; /** * \brief The down script. */ boost::filesystem::path down_script; }; /** * \brief The switch related options type. */ struct switch_configuration { /** * \brief The routing method type. */ enum routing_method_type { RM_SWITCH, /**< \brief The switch routing method. */ RM_HUB /**< \brief The hub routing method. */ }; /** * \brief Constructor. */ switch_configuration(); /** * \brief The routing method. */ routing_method_type routing_method; /** * \brief Whether to enable the relay mode. */ bool relay_mode_enabled; }; /** * \brief The router related options type. */ struct router_configuration { /** * \brief Constructor. */ router_configuration(); /** * \brief The local IP routes. * * These routes are sent to the other hosts for VPN routing. */ std::set local_ip_routes; /** * \brief The local DNS servers. * * These DNS servers are sent to the other hosts. */ asiotap::ip_address_set local_dns_servers; /** * \brief Whether to enable client routing. */ bool client_routing_enabled; /** * \brief Whether to accept route requests. */ bool accept_routes_requests; /** * \brief The internal route scope type. */ enum class internal_route_scope_type { none, /**< \brief Don't accept routes. */ unicast_in_network, /**< \brief Accept only unicast addresses that belong to the network. */ unicast, /**< \brief Accept only unicast addresses. */ subnet, /**< \brief Accept only subnets of the network. */ any /**< \brief Accept any routes. */ }; /** * \brief The internal route acceptance policy. */ internal_route_scope_type internal_route_acceptance_policy; /** * \brief The system route scope type. */ enum class system_route_scope_type { none, /**< \brief Don't accept routes. */ unicast, /**< \brief Accept only unicast addresses. */ any, /**< \brief Accept all addresses. */ unicast_with_gateway, /**< \brief Accept only unicast addresses that may contain gateways. */ any_with_gateway, /**< \brief Accept any addresses that may contain gateways. */ }; /** * \brief The system route acceptance policy. */ system_route_scope_type system_route_acceptance_policy; /** * \brief The maximum routes count to accept from a given peer. */ unsigned int maximum_routes_limit; /** * \brief The DNS servers scope type. */ enum class dns_servers_scope_type { none, /**< \brief Don't accept DNS servers. */ in_network, /**< \brief Accept only DNS server addresses that belong to the network. */ any /**< \brief Accept any DNS server. */ }; /** * \brief The DNS servers acceptance policy. */ dns_servers_scope_type dns_servers_acceptance_policy; /** * \brief The DNS script. */ boost::filesystem::path dns_script; }; /** * \brief The configuration structure. */ struct configuration { /** * \brief The server related options. */ freelan::server_configuration server; /** * \brief The client related options. */ freelan::client_configuration client; /** * \brief The FSCP related options. */ freelan::fscp_configuration fscp; /** * \brief The security configuration. */ freelan::security_configuration security; /** * \brief The Tap adapter related options. */ freelan::tap_adapter_configuration tap_adapter; /** * \brief The switch related options. */ freelan::switch_configuration switch_; /** * \brief The router related options. */ freelan::router_configuration router; /** * \brief The constructor. */ configuration(); }; /** * \brief Input a server protocol. * \param is The input stream. * \param value The value to read. * \return is. */ std::istream& operator>>(std::istream& is, server_configuration::server_protocol_type& value); /** * \brief Output a server protocol to a stream. * \param os The output stream. * \param value The value. * \return os. */ std::ostream& operator<<(std::ostream& os, const server_configuration::server_protocol_type& value); /** * \brief Convert a hostname resolution protocol type into a boost asio udp endpoint type. * \param value The value to convert. * \return The boost::asio::ip::udp. */ boost::asio::ip::udp to_protocol(fscp_configuration::hostname_resolution_protocol_type value); /** * \brief Input a hostname resolution protocol. * \param is The input stream. * \param value The value to read. * \return is. */ std::istream& operator>>(std::istream& is, fscp_configuration::hostname_resolution_protocol_type& value); /** * \brief Output an hostname resolution protocol to a stream. * \param os The output stream. * \param value The value. * \return os. */ std::ostream& operator<<(std::ostream& os, const fscp_configuration::hostname_resolution_protocol_type& value); /** * \brief Input a certificate validation method. * \param is The input stream. * \param value The value to read. * \return is. */ std::istream& operator>>(std::istream& is, security_configuration::certificate_validation_method_type& value); /** * \brief Output a certificate validation method to a stream. * \param os The output stream. * \param value The value. * \return os. */ std::ostream& operator<<(std::ostream& os, const security_configuration::certificate_validation_method_type& value); /** * \brief Input a certificate revocation validation method. * \param is The input stream. * \param value The value to read. * \return is. */ std::istream& operator>>(std::istream& is, security_configuration::certificate_revocation_validation_method_type& value); /** * \brief Output a certificate revocation validation method to a stream. * \param os The output stream. * \param value The value. * \return os. */ std::ostream& operator<<(std::ostream& os, const security_configuration::certificate_revocation_validation_method_type& value); /** * \brief Input a tap adapter type. * \param is The input stream. * \param value The value to read. * \return is. */ std::istream& operator>>(std::istream& is, tap_adapter_configuration::tap_adapter_type& value); /** * \brief Output a tap adapter type to a stream. * \param os The output stream. * \param value The value. * \return os. */ std::ostream& operator<<(std::ostream& os, const tap_adapter_configuration::tap_adapter_type& value); /** * \brief Input a routing method. * \param is The input stream. * \param value The value to read. * \return is. */ std::istream& operator>>(std::istream& is, switch_configuration::routing_method_type& value); /** * \brief Output a routing method to a stream. * \param os The output stream. * \param value The value. * \return os. */ std::ostream& operator<<(std::ostream& os, const switch_configuration::routing_method_type& value); /** * \brief Input a internal route scope. * \param is The input stream. * \param value The value to read. * \return is. */ std::istream& operator>>(std::istream& is, router_configuration::internal_route_scope_type& value); /** * \brief Output a internal route scope to a stream. * \param os The output stream. * \param value The value. * \return os. */ std::ostream& operator<<(std::ostream& os, const router_configuration::internal_route_scope_type& value); /** * \brief Input a system route scope. * \param is The input stream. * \param value The value to read. * \return is. */ std::istream& operator>>(std::istream& is, router_configuration::system_route_scope_type& value); /** * \brief Output a system route scope to a stream. * \param os The output stream. * \param value The value. * \return os. */ std::ostream& operator<<(std::ostream& os, const router_configuration::system_route_scope_type& value); /** * \brief Input a DNS servers scope. * \param is The input stream. * \param value The value to read. * \return is. */ std::istream& operator>>(std::istream& is, router_configuration::dns_servers_scope_type& value); /** * \brief Output a DNS servers scope to a stream. * \param os The output stream. * \param value The value. * \return os. */ std::ostream& operator<<(std::ostream& os, const router_configuration::dns_servers_scope_type& value); } #endif /* FREELAN_CONFIGURATION_HPP */ freelan-2.0/libs/freelan/include/freelan/core.hpp000066400000000000000000000651731252300335000220410ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file core.hpp * \author Julien KAUFFMANN * \brief The freelan core class. */ #pragma once #include "os.hpp" #include "configuration.hpp" #include "switch.hpp" #include "router.hpp" #include "message.hpp" #include "routes_message.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace freelan { class routes_request_message; class web_server; class web_client; /** * \brief The core class. */ class core { public: // General purpose type definitions /** * \brief The ethernet address type. */ typedef freelan::tap_adapter_configuration::ethernet_address_type ethernet_address_type; /** * \brief The low-level endpoint type. */ typedef fscp::server::ep_type ep_type; /** * \brief The high-level endpoint type. */ typedef asiotap::endpoint endpoint; /** * \brief The certificate type. */ typedef fscp::server::cert_type cert_type; /** * \brief The certificate list type. */ typedef std::vector cert_list_type; /** * \brief The certificate revocation list type. */ typedef security_configuration::crl_type crl_type; /** * \brief The resolver type. */ typedef boost::asio::ip::udp::resolver resolver_type; /** * \brief The hash type. */ typedef fscp::hash_type hash_type; /** * \brief The hash list type. */ typedef fscp::hash_list_type hash_list_type; // Handlers /** * \brief A void operation handler. */ typedef boost::function void_handler_type; /** * \brief A simple operation handler. */ typedef boost::function simple_handler_type; /** * \brief An IO operation handler. */ typedef boost::function io_handler_type; /** * \brief An operation handler for multiple endpoints. */ typedef boost::function&)> multiple_endpoints_handler_type; /** * \brief A duration operation handler. */ typedef boost::function duration_handler_type; /** * \brief An IP network addresses operation handler. */ typedef boost::function ip_network_address_list_handler_type; // Callbacks /** * \brief The log callback. */ typedef fscp::logger::log_handler_type log_handler_type; /** * \brief The core opened callback. */ typedef boost::function core_opened_handler_type; /** * \brief The core closed callback. */ typedef boost::function core_closed_handler_type; /** * \brief A session failed callback. * \param host The host with which a session is established. * \param is_new A flag that indicates whether the session is a new session or a session renewal. */ typedef boost::function session_failed_handler_type; /** * \brief A session error callback. * \param host The host with which a session is established. * \param is_new A flag that indicates whether the session is a new session or a session renewal. * \param error The error. */ typedef boost::function session_error_handler_type; /** * \brief A session established callback. * \param host The host with which a session is established. * \param is_new A flag that indicates whether the session is a new session or a session renewal. * \param cs The cipher suite. * \param ec The elliptic curve. */ typedef boost::function session_established_handler_type; /** * \brief A reason for the session loss. */ typedef fscp::server::session_loss_reason session_loss_reason; /** * \brief A session lost callback. * \param host The host with which a session was lost. */ typedef boost::function session_lost_handler_type; /** * \brief The authentication callback type. */ typedef boost::function authentication_handler_type; /** * \brief The certificate validation callback type. */ typedef boost::function certificate_validation_handler_type; /** * \brief The up callback type. */ typedef boost::function tap_adapter_handler_type; enum class DnsAction { Add, Remove }; /** * \brief The up callback type. */ typedef boost::function dns_handler_type; // Public constants /** * \brief The contact period. */ static const boost::posix_time::time_duration CONTACT_PERIOD; /** * \brief The dynamic contact period. */ static const boost::posix_time::time_duration DYNAMIC_CONTACT_PERIOD; /** * \brief The routes request period. */ static const boost::posix_time::time_duration ROUTES_REQUEST_PERIOD; /** * \brief The renew certificate warning period. */ static const boost::posix_time::time_duration RENEW_CERTIFICATE_WARNING_PERIOD; /** * \brief The registration warning period. */ static const boost::posix_time::time_duration REGISTRATION_WARNING_PERIOD; /** * \brief The get contact information update period. */ static const boost::posix_time::time_duration GET_CONTACT_INFORMATION_UPDATE_PERIOD; /** * \brief The default service. */ static const std::string DEFAULT_SERVICE; // Public methods /** * \brief The constructor. * \param io_service The io_service to bind to. * \param configuration The configuration to use. */ core(boost::asio::io_service& io_service, const freelan::configuration& configuration); /** * \brief Set the function to call when a log entry is emitted. * \param callback The callback. * * \warning This method can only be called when the core is NOT running. */ void set_log_callback(log_handler_type callback) { m_logger.set_callback(callback); } /** * \brief Set the logger's level. * \param level The log level. * \warning This method can only be called when the core is NOT running. */ void set_log_level(fscp::log_level level) { m_logger.set_level(level); } /** * \brief Set the function to call when the core was just opened. * \param callback The callback. * * \warning This method can only be called when the core is NOT running. */ void set_core_opened_callback(core_opened_handler_type callback) { m_core_opened_callback = callback; } /** * \brief Set the function to call when the core was just closed. * \param callback The callback. * * \warning This method can only be called when the core is NOT running. */ void set_close_callback(core_closed_handler_type callback) { m_core_closed_callback = callback; } /** * \brief Set the session failed callback. * \param callback The callback. * \warning This method can only be called when the core is NOT running. */ void set_session_failed_callback(session_failed_handler_type callback) { m_session_failed_callback = callback; } /** * \brief Set the session error callback. * \param callback The callback. * \warning This method can only be called when the core is NOT running. */ void set_session_error_callback(session_error_handler_type callback) { m_session_error_callback = callback; } /** * \brief Set the session established callback. * \param callback The callback. * \warning This method can only be called when the core is NOT running. */ void set_session_established_callback(session_established_handler_type callback) { m_session_established_callback = callback; } /** * \brief Set the session lost callback. * \param callback The callback. * \warning This method can only be called when the core is NOT running. */ void set_session_lost_callback(session_lost_handler_type callback) { m_session_lost_callback = callback; } /** * \brief Set the authentication callback. * \param callback The callback. * \warning This method can only be called when the core is NOT running. */ void set_authentication_callback(authentication_handler_type callback) { m_authentication_callback = callback; } /** * \brief Set the certificate validation callback. * \param callback The callback. * \warning This method can only be called when the core is NOT running. */ void set_certificate_validation_callback(certificate_validation_handler_type callback) { m_certificate_validation_callback = callback; } /** * \brief Set the tap adapter up callback. * \param callback The callback. * \warning This method can only be called when the core is NOT running. */ void set_tap_adapter_up_callback(tap_adapter_handler_type callback) { m_tap_adapter_up_callback = callback; } /** * \brief Set the tap adapter down callback. * \param callback The callback. * \warning This method can only be called when the core is NOT running. */ void set_tap_adapter_down_callback(tap_adapter_handler_type callback) { m_tap_adapter_down_callback = callback; } /** * \brief Set the DNS callback. * \param callback The callback. * \warning This method can only be called when the core is NOT running. */ void set_dns_callback(dns_handler_type callback) { m_dns_callback = callback; } /** * \brief Open the core. * \see close */ void open(); /** * \brief Close the core. */ void close(); private: boost::asio::io_service& m_io_service; freelan::configuration m_configuration; boost::asio::strand m_logger_strand; fscp::logger m_logger; private: /* Callbacks */ void do_handle_log(fscp::log_level, const std::string&, const boost::posix_time::ptime&); log_handler_type m_log_callback; core_opened_handler_type m_core_opened_callback; core_closed_handler_type m_core_closed_callback; session_failed_handler_type m_session_failed_callback; session_error_handler_type m_session_error_callback; session_established_handler_type m_session_established_callback; session_lost_handler_type m_session_lost_callback; authentication_handler_type m_authentication_callback; certificate_validation_handler_type m_certificate_validation_callback; tap_adapter_handler_type m_tap_adapter_up_callback; tap_adapter_handler_type m_tap_adapter_down_callback; dns_handler_type m_dns_callback; private: /* General purpose */ bool is_banned(const boost::asio::ip::address& address) const; private: /* FSCP server */ void open_fscp_server(); void close_fscp_server(); void async_contact(const endpoint& target, duration_handler_type handler); void async_contact(const endpoint& target); void async_contact_all(); void async_dynamic_contact_all(); void async_send_contact_request_to_all(const fscp::hash_list_type&, multiple_endpoints_handler_type); void async_send_contact_request_to_all(const fscp::hash_list_type&); void async_introduce_to(const ep_type&, simple_handler_type); void async_introduce_to(const ep_type&); void async_request_session(const ep_type&, simple_handler_type); void async_request_session(const ep_type&); void async_handle_routes_request(const ep_type&, const routes_request_message&); void async_handle_routes(const ep_type&, const routes_message&); void async_send_routes_request(const ep_type&, simple_handler_type); void async_send_routes_request(const ep_type&); void async_send_routes_request_to_all(multiple_endpoints_handler_type); void async_send_routes_request_to_all(); void async_send_routes(const ep_type&, routes_message::version_type, const asiotap::ip_route_set&, const asiotap::ip_address_set& dns_servers, simple_handler_type); void do_contact(const ep_type&, duration_handler_type); void do_handle_contact(const endpoint&, const ep_type&, const boost::system::error_code&, const boost::posix_time::time_duration&); void do_handle_periodic_contact(const boost::system::error_code&); void do_handle_periodic_dynamic_contact(const boost::system::error_code&); void do_handle_periodic_routes_request(const boost::system::error_code&); void do_handle_send_contact_request(const ep_type&, const boost::system::error_code&); void do_handle_send_contact_request_to_all(const std::map&); void do_handle_introduce_to(const ep_type&, const boost::system::error_code&); void do_handle_request_session(const ep_type&, const boost::system::error_code&); void do_handle_send_routes_request(const ep_type&, const boost::system::error_code&); void do_handle_send_routes_request_to_all(const std::map&); bool do_handle_hello_received(const ep_type&, bool); bool do_handle_contact_request_received(const ep_type&, cert_type, hash_type, const ep_type&); void do_handle_contact_received(const ep_type&, hash_type, const ep_type&); bool do_handle_presentation_received(const ep_type&, cert_type, fscp::server::presentation_status_type, bool); bool do_handle_session_request_received(const ep_type&, const fscp::cipher_suite_list_type&, const fscp::elliptic_curve_list_type&, bool); bool do_handle_session_received(const ep_type&, fscp::cipher_suite_type, fscp::elliptic_curve_type, bool); void do_handle_session_failed(const ep_type&, bool); void do_handle_session_error(const ep_type&, bool, const std::exception&); void do_handle_session_established(const ep_type&, bool, const fscp::cipher_suite_type&, const fscp::elliptic_curve_type&); void do_handle_session_lost(const ep_type&, fscp::server::session_loss_reason); void do_handle_data_received(const ep_type&, fscp::channel_number_type, fscp::SharedBuffer, boost::asio::const_buffer); void do_handle_message(const ep_type&, fscp::SharedBuffer, const message&); void do_handle_routes_request(const ep_type&); void do_handle_routes(const asiotap::ip_network_address_list&, const ep_type&, routes_message::version_type, const asiotap::ip_route_set&, const asiotap::ip_address_set&); boost::shared_ptr m_fscp_server; boost::asio::deadline_timer m_contact_timer; boost::asio::deadline_timer m_dynamic_contact_timer; boost::asio::deadline_timer m_routes_request_timer; private: /* Certificate validation */ static const int ex_data_index; static int certificate_validation_callback(int, X509_STORE_CTX*); enum class build_ca_store_when { it_doesnt_exist, always }; void build_ca_store(build_ca_store_when); bool certificate_validation_method(bool, cryptoplus::x509::store_context); bool certificate_is_valid(cert_type); cryptoplus::x509::store m_ca_store; boost::mutex m_ca_store_mutex; private: /* TAP adapter */ typedef asiotap::osi::filter ethernet_filter_type; typedef asiotap::osi::complex_filter::type arp_filter_type; typedef asiotap::osi::complex_filter::type ipv4_filter_type; typedef asiotap::osi::complex_filter::type ipv6_filter_type; typedef asiotap::osi::complex_filter::type udp_filter_type; typedef asiotap::osi::complex_filter::type tcpv4_filter_type; typedef asiotap::osi::complex_filter::type tcpv6_filter_type; typedef asiotap::osi::complex_filter::type bootp_filter_type; typedef asiotap::osi::complex_filter::type dhcp_filter_type; typedef asiotap::osi::filter tun_ipv4_filter_type; typedef asiotap::osi::filter tun_ipv6_filter_type; typedef asiotap::osi::complex_filter::type tun_tcpv4_filter_type; typedef asiotap::osi::complex_filter::type tun_tcpv6_filter_type; typedef asiotap::osi::complex_filter::type tun_icmpv6_filter_type; typedef asiotap::osi::const_helper arp_helper_type; typedef asiotap::osi::const_helper dhcp_helper_type; typedef asiotap::osi::const_helper icmpv6_helper_type; typedef asiotap::osi::proxy arp_proxy_type; typedef asiotap::osi::proxy dhcp_proxy_type; typedef asiotap::osi::proxy icmpv6_proxy_type; void open_tap_adapter(); void close_tap_adapter(); void async_get_tap_addresses(ip_network_address_list_handler_type); void async_read_tap(); template void async_write_tap(const ConstBufferSequence& data, simple_handler_type handler) { m_tap_adapter_io_service.post([this, data, handler] () { push_tap_write(data, handler); }); } template void push_tap_write(const ConstBufferSequence&, simple_handler_type); void pop_tap_write(); void do_read_tap(); void do_handle_tap_adapter_read(fscp::SharedBuffer, const boost::system::error_code&, size_t); void do_handle_tap_adapter_write(const boost::system::error_code&); void do_handle_arp_frame(const arp_helper_type&); void do_handle_dhcp_frame(const dhcp_helper_type&); void do_handle_icmpv6_frame(const icmpv6_helper_type&); bool do_handle_arp_request(const boost::asio::ip::address_v4&, ethernet_address_type&); bool do_handle_icmpv6_neighbor_solicitation(const boost::asio::ip::address_v6&, ethernet_address_type&); boost::asio::io_service m_tap_adapter_io_service; boost::thread m_tap_adapter_thread; boost::shared_ptr m_tap_adapter; std::queue m_tap_write_queue; std::list m_tap_adapter_buffers; ethernet_filter_type m_ethernet_filter; arp_filter_type m_arp_filter; ipv4_filter_type m_ipv4_filter; ipv6_filter_type m_ipv6_filter; udp_filter_type m_udp_filter; tcpv4_filter_type m_tcpv4_filter; tcpv6_filter_type m_tcpv6_filter; bootp_filter_type m_bootp_filter; dhcp_filter_type m_dhcp_filter; tun_ipv4_filter_type m_tun_ipv4_filter; tun_ipv6_filter_type m_tun_ipv6_filter; tun_tcpv4_filter_type m_tun_tcpv4_filter; tun_tcpv6_filter_type m_tun_tcpv6_filter; tun_icmpv6_filter_type m_tun_icmpv6_filter; boost::scoped_ptr m_arp_proxy; boost::scoped_ptr m_dhcp_proxy; boost::scoped_ptr m_icmpv6_proxy; boost::scoped_ptr m_tcp_mss_morpher; private: /* Switch & router */ typedef asiotap::route_manager::route_type route_type; struct client_router_info_type { client_router_info_type() : version(), system_route_entries(), saved_system_route() {} bool is_older_than(routes_message::version_type _version) { return (!version || ((*version) < _version)); } boost::optional version; std::vector system_route_entries; asiotap::route_manager::entry_type saved_system_route; std::vector dns_servers_entries; }; typedef std::map client_router_info_map_type; void async_register_switch_port(const ep_type& host, void_handler_type handler) { m_router_strand.post(boost::bind(&core::do_register_switch_port, this, host, handler)); } void async_unregister_switch_port(const ep_type& host, void_handler_type handler) { m_router_strand.post(boost::bind(&core::do_unregister_switch_port, this, host, handler)); } void async_register_router_port(const ep_type& host, void_handler_type handler) { m_router_strand.post(boost::bind(&core::do_register_router_port, this, host, handler)); } void async_unregister_router_port(const ep_type& host, void_handler_type handler) { m_router_strand.post(boost::bind(&core::do_unregister_router_port, this, host, handler)); } void async_save_system_route(const ep_type& host, const route_type& route, void_handler_type handler) { m_router_strand.post(boost::bind(&core::do_save_system_route, this, host, route, handler)); } void async_clear_client_router_info(const ep_type& host, void_handler_type handler) { m_router_strand.post(boost::bind(&core::do_clear_client_router_info, this, host, handler)); } template void async_write_switch(const port_index_type& index, boost::asio::const_buffer data, WriteHandler handler) { m_router_strand.post(boost::bind(&core::do_write_switch, this, index, data, handler)); } template void async_write_router(const port_index_type& index, boost::asio::const_buffer data, WriteHandler handler) { m_router_strand.post(boost::bind(&core::do_write_router, this, index, data, handler)); } void do_register_switch_port(const ep_type&, void_handler_type); void do_register_router_port(const ep_type&, void_handler_type); void do_unregister_switch_port(const ep_type&, void_handler_type); void do_unregister_router_port(const ep_type&, void_handler_type); void do_save_system_route(const ep_type&, const route_type&, void_handler_type); void do_clear_client_router_info(const ep_type&, void_handler_type); void do_write_switch(const port_index_type&, boost::asio::const_buffer, switch_::multi_write_handler_type); void do_write_router(const port_index_type&, boost::asio::const_buffer, router::port_type::write_handler_type); boost::asio::strand m_router_strand; switch_ m_switch; router m_router; asiotap::route_manager m_route_manager; asiotap::dns_servers_manager m_dns_servers_manager; boost::optional m_local_routes_version; client_router_info_map_type m_client_router_info_map; private: void open_web_server(); void close_web_server(); boost::shared_ptr m_web_server; boost::thread m_web_server_thread; private: void open_web_client(); void close_web_client(); void request_certificate(); void request_ca_certificate(); void register_(); void unregister(); void set_contact_information(); void get_contact_information(); boost::shared_ptr m_web_client; struct timer_period { timer_period(boost::asio::io_service& _io_service, boost::posix_time::time_duration _min, boost::posix_time::time_duration _max) : timer(_io_service), min(_min), max(_max), period(_min) {} void reset() { period = min; } void exponential_backoff(); boost::asio::deadline_timer timer; const boost::posix_time::time_duration min; const boost::posix_time::time_duration max; boost::posix_time::time_duration period; }; timer_period m_request_certificate; timer_period m_request_ca_certificate; boost::asio::deadline_timer m_renew_certificate_timer; timer_period m_registration_retry; timer_period m_set_contact_information_retry; timer_period m_get_contact_information_retry; cert_list_type m_client_certificate_authority_list; private: asiotap::ip_route_set translate_ip_routes(const std::set& routes) const; }; } freelan-2.0/libs/freelan/include/freelan/freelan.hpp000066400000000000000000000043701252300335000225150ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file freelan.hpp * \author Julien KAUFFMANN * \brief The global freelan include file. */ #ifndef FREELAN_FREELAN_HPP #define FREELAN_FREELAN_HPP #include "core.hpp" namespace freelan { /** * \brief Takes in charge initialization and cleanup of all internally used libraries. */ class initializer { public: /** * \brief Initializes. */ initializer(); /** * \brief Cleans up. */ ~initializer(); }; } #endif /* FREELAN_FREELAN_HPP */ freelan-2.0/libs/freelan/include/freelan/ip_route.hpp000066400000000000000000000115431252300335000227270ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ip_route.hpp * \author Julien KAUFFMANN * \brief An IP route type, extended with specific configuration values. */ #pragma once #include #include #include #include namespace freelan { /** * \brief A default IPv4 gateway value. */ struct default_ipv4_gateway_type { static const std::string string_representation; friend bool operator==(const default_ipv4_gateway_type&, const default_ipv4_gateway_type&) { return true; } friend bool operator<(const default_ipv4_gateway_type&, const default_ipv4_gateway_type&) { return false; } }; /** * \brief A default IPv6 gateway value. */ struct default_ipv6_gateway_type { static const std::string string_representation; friend bool operator==(const default_ipv6_gateway_type&, const default_ipv6_gateway_type&) { return true; } friend bool operator<(const default_ipv6_gateway_type&, const default_ipv6_gateway_type&) { return false; } }; /** * \brief The IP route type. */ typedef boost::variant ip_route; /** * \brief A visitor that get the route. */ class get_ip_route_visitor : public boost::static_visitor { public: get_ip_route_visitor(asiotap::ipv4_route ipv4_default, asiotap::ipv6_route ipv6_default) : m_ipv4_default(ipv4_default), m_ipv6_default(ipv6_default) {} result_type operator()(default_ipv4_gateway_type) const { return m_ipv4_default; } result_type operator()(default_ipv6_gateway_type) const { return m_ipv6_default; } result_type operator()(const asiotap::ip_route& value) const { return value; } private: asiotap::ipv4_route m_ipv4_default; asiotap::ipv6_route m_ipv6_default; }; inline asiotap::ip_route to_ip_route(const ip_route& value, asiotap::ipv4_route ipv4_default, asiotap::ipv6_route ipv6_default) { return boost::apply_visitor(get_ip_route_visitor(ipv4_default, ipv6_default), value); } inline asiotap::ip_route_set to_ip_routes(const std::set& values, asiotap::ipv4_route ipv4_default, asiotap::ipv6_route ipv6_default) { asiotap::ip_route_set result; for (auto&& value : values) { result.insert(to_ip_route(value, ipv4_default, ipv6_default)); } return result; } /** * \brief A visitor that get the string representation of the IP route. */ class ip_route_to_string_visitor : public boost::static_visitor { public: result_type operator()(const asiotap::ip_route& value) const { return boost::lexical_cast(value); } template result_type operator()(const T&) const { return T::string_representation; } }; std::istream& operator>>(std::istream& is, ip_route& value); inline std::ostream& operator<<(std::ostream& os, const ip_route& value) { return os << boost::apply_visitor(ip_route_to_string_visitor(), value); } inline bool operator!=(const ip_route& lhs, const ip_route& rhs) { return !(lhs == rhs); } } freelan-2.0/libs/freelan/include/freelan/message.hpp000066400000000000000000000103051252300335000225200ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file message.hpp * \author Julien KAUFFMANN * \brief The messages exchanged by the peers. */ #ifndef FREELAN_MESSAGE_HPP #define FREELAN_MESSAGE_HPP #include #include namespace freelan { /** * \brief The base class for all messages. * * A message is composed of a message type and arbitrary * data depending on the effective message type. */ class message { public: /** * \brief The message type. */ enum message_type { MT_ROUTES_REQUEST = 0x01, MT_ROUTES = 0x02 }; /** * \brief Write a message to a buffer. * \param buf The buffer to write to. * \param buf_len The length of buf. * \param type The message type. * \param length The length of the payload. * \return The count of bytes written. */ static size_t write(void* buf, size_t buf_len, message_type type, size_t length); /** * \brief Create a message and map it on a buffer. * \param buf The buffer. * \param buf_len The buffer length. * * If the mapping fails, a std::runtime_error is thrown. */ message(const void* buf, size_t buf_len); /** * \brief Get the type. * \return The type. */ message_type type() const; /** * \brief Get the length. * \return The length. */ size_t length() const; /** * \brief Get the raw data. * \return The message data buffer. */ const uint8_t* data() const; /** * \brief Get the total size of the message. * \return The total size of the message. */ size_t size() const; /** * \brief Get the payload data. * \return The payload data. */ const uint8_t* payload() const; protected: /** * \brief The length of the header. */ static const size_t HEADER_LENGTH = sizeof(uint8_t) + sizeof(uint16_t); private: const void* m_data; }; inline message::message_type message::type() const { return static_cast(fscp::buffer_tools::get(m_data, 0)); } inline size_t message::length() const { return ntohs(fscp::buffer_tools::get(m_data, 1)); } inline const uint8_t* message::data() const { return static_cast(m_data); } inline size_t message::size() const { return HEADER_LENGTH + length(); } inline const uint8_t* message::payload() const { return static_cast(m_data) + HEADER_LENGTH; } } #endif /* FREELAN_MESSAGE_HPP */ freelan-2.0/libs/freelan/include/freelan/metric.hpp000066400000000000000000000121301252300335000223550ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file metric.hpp * \author Julien KAUFFMANN * \brief A metric type. */ #ifndef FREELAN_METRIC_HPP #define FREELAN_METRIC_HPP #include #include #include #include #include namespace freelan { /** * \brief An auto metric type. */ struct auto_metric_type { static const std::string string_representation; friend bool operator==(const auto_metric_type&, const auto_metric_type&) { return true; } }; /** * \brief A system metric type. */ struct system_metric_type { static const std::string string_representation; friend bool operator==(const system_metric_type&, const system_metric_type&) { return true; } }; /** * \brief The metric type. */ typedef boost::variant metric_type; /** * \brief A visitor that get the string representation of the metric. */ class metric_to_string_visitor : public boost::static_visitor { public: /** * \brief Return the string representation of the metric. * \param value The numeric value. * \return The string representation of the metric. */ result_type operator()(unsigned int value) const { return boost::lexical_cast(value); } /** * \brief Return the string representation of the metric. * \return The string representation of the metric. */ template result_type operator()(const T&) const { return T::string_representation; } }; /** * \brief Read a metric from an input stream. * \param is The input stream. * \param value The value. * \return is. */ std::istream& operator>>(std::istream& is, metric_type& value); /** * \brief Write a metric to an output stream. * \param os The output stream. * \param value The mtu. * \return os. */ inline std::ostream& operator<<(std::ostream& os, const metric_type& value) { return os << boost::apply_visitor(metric_to_string_visitor(), value); } /** * \brief Compare two metrics. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two endpoints are different. */ inline bool operator!=(const metric_type& lhs, const metric_type& rhs) { return !(lhs == rhs); } /** * \brief A visitor that get the metric value. */ class metric_to_value_visitor : public boost::static_visitor> { public: /** * \brief Return the value of the metric. * \param value The numeric value. * \return The value of the metric. */ result_type operator()(unsigned int value) const { return value; } /** * \brief Return the value of the metric. * \return The value of the metric. */ result_type operator()(const auto_metric_type&) const { return 3; } /** * \brief Return the value of the metric. * \return The value of the metric. */ result_type operator()(const system_metric_type&) const { return boost::none; } }; /** * \brief Get the value of the metric. * \param metric The metric. * \return The value, if any. */ inline boost::optional get_metric_value(const metric_type& metric) { return boost::apply_visitor(metric_to_value_visitor(), metric); } } #endif /* FREELAN_METRIC_HPP */ freelan-2.0/libs/freelan/include/freelan/mss.hpp000066400000000000000000000127211252300335000217020ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file mss.hpp * \author Julien KAUFFMANN * \brief A MSS type. */ #pragma once #include #include #include #include namespace freelan { /** * \brief A MSS auto type. */ struct auto_mss_type { static const std::string string_representation; friend bool operator==(const auto_mss_type&, const auto_mss_type&) { return true; } }; /** * \brief A disabled MSS type. */ struct disabled_mss_type { static const std::string string_representation; friend bool operator==(const disabled_mss_type&, const disabled_mss_type&) { return true; } }; /** * \brief The MSS type. */ typedef boost::variant mss_type; /** * \brief A visitor that computes the MSS. */ class compute_mss_visitor : public boost::static_visitor { public: /** * \brief Create a compute mss visitor. * \param auto_value The auto value to use with auto_mtu_type. */ explicit compute_mss_visitor(size_t auto_value) : m_auto_value(auto_value) { } /** * \brief Return the numeric value of the MSS. * \param value The numeric value. * \return The numeric value of the MSS. */ result_type operator()(size_t value) const { return value; } /** * \brief Return the automatic value for the MSS. * \return The automatic value for the MSS. */ result_type operator()(const auto_mss_type&) const { return m_auto_value; } /** * \brief Return the system value for the MSS. * \return The system value for the MSS. */ result_type operator()(const disabled_mss_type&) const { return 0; } private: size_t m_auto_value; }; /** * \brief A visitor that get the string representation of the MSS. */ class mss_to_string_visitor : public boost::static_visitor { public: /** * \brief Return the string representation of the MSS. * \param value The numeric value. * \return The string representation of the MSS. */ result_type operator()(size_t value) const { return boost::lexical_cast(value); } /** * \brief Return the string representation of the MSS. * \return The string representation of the MSS. */ result_type operator()(const auto_mss_type&) const { return auto_mss_type::string_representation; } /** * \brief Return the string representation of the MSS. * \return The string representation of the MSS. */ result_type operator()(const disabled_mss_type&) const { return disabled_mss_type::string_representation; } }; /** * \brief Read a MSS from an input stream. * \param is The input stream. * \param value The value. * \return is. */ std::istream& operator>>(std::istream& is, mss_type& value); /** * \brief Write a MSS to an output stream. * \param os The output stream. * \param value The MSS. * \return os. */ inline std::ostream& operator<<(std::ostream& os, const mss_type& value) { return os << boost::apply_visitor(mss_to_string_visitor(), value); } /** * \brief Compare two MSS values. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two endpoints are different. */ inline bool operator!=(const mss_type& lhs, const mss_type& rhs) { return !(lhs == rhs); } /** * \brief Compute the MSS numerical value. * \param mtu The MSS. * \param auto_value The value to use with auto_mtu_type. * \return The MSS associated numerical value. */ inline unsigned int compute_mss(const mss_type& mtu, size_t auto_value) { return boost::apply_visitor(compute_mss_visitor(auto_value), mtu); } } freelan-2.0/libs/freelan/include/freelan/mtu.hpp000066400000000000000000000130351252300335000217040ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file mtu.hpp * \author Julien KAUFFMANN * \brief A MTU type. */ #ifndef FREELAN_MTU_HPP #define FREELAN_MTU_HPP #include #include #include #include namespace freelan { /** * \brief A MTU auto type. */ struct auto_mtu_type { static const std::string string_representation; friend bool operator==(const auto_mtu_type&, const auto_mtu_type&) { return true; } }; /** * \brief A MTU system type. */ struct system_mtu_type { static const std::string string_representation; friend bool operator==(const system_mtu_type&, const system_mtu_type&) { return true; } }; /** * \brief The MTU type. */ typedef boost::variant mtu_type; /** * \brief A visitor that computes the MTU. */ class compute_mtu_visitor : public boost::static_visitor { public: /** * \brief Create a compute mtu visitor. * \param auto_value The auto value to use with auto_mtu_type. */ compute_mtu_visitor(unsigned int auto_value) : m_auto_value(auto_value) { } /** * \brief Return the numeric value of the MTU. * \param value The numeric value. * \return The numeric value of the MTU. */ result_type operator()(unsigned int value) const { return value; } /** * \brief Return the automatic value for the MTU. * \return The automatic value for the MTU. */ result_type operator()(const auto_mtu_type&) const { return m_auto_value; } /** * \brief Return the system value for the MTU. * \return The system value for the MTU. */ result_type operator()(const system_mtu_type&) const { return 0; } private: unsigned int m_auto_value; }; /** * \brief A visitor that get the string representation of the MTU. */ class mtu_to_string_visitor : public boost::static_visitor { public: /** * \brief Return the string representation of the MTU. * \param value The numeric value. * \return The string representation of the MTU. */ result_type operator()(unsigned int value) const { return boost::lexical_cast(value); } /** * \brief Return the string representation of the MTU. * \return The string representation of the MTU. */ result_type operator()(const auto_mtu_type&) const { return auto_mtu_type::string_representation; } /** * \brief Return the string representation of the MTU. * \return The string representation of the MTU. */ result_type operator()(const system_mtu_type&) const { return system_mtu_type::string_representation; } }; /** * \brief Read a mtu from an input stream. * \param is The input stream. * \param value The value. * \return is. */ std::istream& operator>>(std::istream& is, mtu_type& value); /** * \brief Write a mtu to an output stream. * \param os The output stream. * \param value The mtu. * \return os. */ inline std::ostream& operator<<(std::ostream& os, const mtu_type& value) { return os << boost::apply_visitor(mtu_to_string_visitor(), value); } /** * \brief Compare two MTUs. * \param lhs The left argument. * \param rhs The right argument. * \return true if the two endpoints are different. */ inline bool operator!=(const mtu_type& lhs, const mtu_type& rhs) { return !(lhs == rhs); } /** * \brief Compute the MTU numerical value. * \param mtu The MTU. * \param auto_value The value to use with auto_mtu_type. * \return The MTU associated numerical value. */ inline unsigned int compute_mtu(const mtu_type& mtu, unsigned int auto_value) { return boost::apply_visitor(compute_mtu_visitor(auto_value), mtu); } } #endif /* FREELAN_MTU_HPP */ freelan-2.0/libs/freelan/include/freelan/os.hpp000066400000000000000000000070241252300335000215210ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file os.hpp * \brief Macro to know the operating system. * * - UNIX: Unix-like operating system.\n * - LINUX: Linux operating system.\n * - SUNOS: Sun operating system.\n * - MACINTOSH: Macintosh or MacOS operating system.\n * - WINDOWS: MS Windows operating system.\n * - MSDOS: MS DOS operating system.\n * * \author Julien KAUFFMANN * \author Sebastien VINCENT */ #ifndef FREELAN_OS_HPP #define FREELAN_OS_HPP /* * Extract the "MACINTOSH" flag from the compiler. */ #if defined(__APPLE__) #define UNIX #define MACINTOSH #endif /* * Extract the "SUNOS" flag from the compiler. */ #if defined(sun) #define UNIX #define SUNOS #endif /* * Extract the "UNIX" flag from compiler. */ #ifdef __linux__ #define UNIX #define LINUX #endif /* * Extract the "BSD" flag from compiler. */ #if defined(BSD) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) #define BSD #define UNIX #endif /* * Extract the "MSDOS" flag from the compiler. */ #ifdef __MSDOS__ #define MSDOS #undef UNIX #endif /* * Extract the "WINDOWS" flag from the compiler. */ #if defined(_Windows) || defined(__WINDOWS__) || \ defined(__WIN32__) || defined(WIN32) || \ defined(__WINNT__) || defined(__NT__) || \ defined(_WIN32) || defined(_WIN64) #define WINDOWS #ifdef _MSC_VER #define MSV #if defined(DEBUG) || defined(DEBUGTRACE) #ifdef NDEBUG #undef NDEBUG #endif #else #ifndef NDEBUG #define NDEBUG #endif #endif #else #undef MSV #endif #undef UNIX #undef MSDOS #endif /* * Remove the WINDOWS flag when using MACINTOSH. */ #ifdef MACINTOSH #undef WINDOWS #endif /* * Assume UNIX if not Windows, Macintosh or MSDOS. */ #if !defined(WINDOWS) && !defined(MACINTOSH) && !defined(MSDOS) #define UNIX #endif #endif /* FREELAN_OS_HPP */ freelan-2.0/libs/freelan/include/freelan/port_index.hpp000066400000000000000000000120431252300335000232500ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file port_index.hpp * \author Julien KAUFFMANN * \brief A port index class. */ #ifndef PORT_INDEX_HPP #define PORT_INDEX_HPP #include #include #include #include #include namespace freelan { /** * \brief A null port index. */ class null_port_index_type { public: /** * \brief Create a null port index. */ null_port_index_type() {}; private: friend bool operator<(const null_port_index_type&, const null_port_index_type&) { return false; } friend bool operator==(const null_port_index_type&, const null_port_index_type&) { return true; } friend std::ostream& operator<<(std::ostream& os, const null_port_index_type&) { return os << "null()"; } }; /** * \brief A tap adapter port index. */ class tap_adapter_port_index_type { public: /** * \brief Create a new tap_adapter_port_index. * \param _tap_adapter The tap adapter. */ tap_adapter_port_index_type(boost::shared_ptr _tap_adapter) : m_tap_adapter(_tap_adapter) { assert(m_tap_adapter); } /** * \brief Get the associated tap adapter. * \return The associated tap adapter. */ boost::shared_ptr tap_adapter() const { return m_tap_adapter; } private: boost::shared_ptr m_tap_adapter; friend bool operator<(const tap_adapter_port_index_type& lhs, const tap_adapter_port_index_type& rhs) { return (lhs.m_tap_adapter < rhs.m_tap_adapter); } friend bool operator==(const tap_adapter_port_index_type& lhs, const tap_adapter_port_index_type& rhs) { return (lhs.m_tap_adapter == rhs.m_tap_adapter); } friend std::ostream& operator<<(std::ostream& os, const tap_adapter_port_index_type& idx) { return os << "tap_adapter(" << *idx.m_tap_adapter << ")"; } }; /** * \brief An endpoint port index. */ class endpoint_port_index_type { public: /** * \brief Create a new endpoint_port_index_type. * \param ep The endpoint. */ endpoint_port_index_type(const fscp::server::ep_type& ep) : m_ep(ep) {} /** * \brief Get the associated tap adapter. * \return The associated tap adapter. */ fscp::server::ep_type endpoint() const { return m_ep; } friend bool operator<(const endpoint_port_index_type& lhs, const endpoint_port_index_type& rhs) { return (lhs.m_ep < rhs.m_ep); } friend bool operator==(const endpoint_port_index_type& lhs, const endpoint_port_index_type& rhs) { return (lhs.m_ep == rhs.m_ep); } friend std::ostream& operator<<(std::ostream& os, const endpoint_port_index_type& idx) { return os << "endpoint(" << idx.m_ep << ")"; } private: fscp::server::ep_type m_ep; }; /** * \brief The generic port index type. */ typedef boost::variant port_index_type; inline port_index_type make_port_index(boost::shared_ptr tap_adapter) { return tap_adapter_port_index_type(tap_adapter); } inline port_index_type make_port_index(const fscp::server::ep_type& ep) { return endpoint_port_index_type(ep); } } #endif /* PORT_INDEX_HPP */ freelan-2.0/libs/freelan/include/freelan/router.hpp000066400000000000000000000204721252300335000224220ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file router.hpp * \author Julien KAUFFMANN * \brief A router class. */ #ifndef ROUTER_HPP #define ROUTER_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include "configuration.hpp" #include "port_index.hpp" #include "routes_message.hpp" namespace freelan { /** * \brief A class that represents a router. */ class router { public: /** * \brief The port group type. */ typedef unsigned int port_group_type; /** * \brief A router port type. */ class port_type { public: /** * \brief The write handler type. */ typedef boost::function write_handler_type; /** * \brief A write function type. */ typedef boost::function write_function_type; /** * \brief Create a new default port. */ port_type() : m_write_function(), m_local_routes(), m_group(), m_router(NULL) {} /** * \brief Create a new port. * \param write_function The write function to use. * \param _group The group this port belongs to. */ port_type(write_function_type write_function, port_group_type _group) : m_write_function(write_function), m_local_routes(), m_group(_group), m_router(NULL) {} /** * \brief Copy constructor. * \param other The other instance. */ port_type(const port_type& other) : m_write_function(other.m_write_function), m_local_routes(other.m_local_routes), m_group(other.m_group), m_router(NULL) {} /** * \brief Destructor. */ ~port_type() { dissociate_from_router(); } /** * \brief Assignment operator. * \param other The other instance. * \return *this. */ port_type& operator=(const port_type& other) { dissociate_from_router(); m_write_function = other.m_write_function; m_local_routes = other.m_local_routes; m_group = other.m_group; return *this; } /** * \brief Write data to the port. * \param data The data to write. * \param handler The handler to call when the write is complete. */ void async_write(boost::asio::const_buffer data, write_handler_type handler) const { m_write_function(data, handler); } const asiotap::ip_route_set& local_routes() const { return m_local_routes; } const asiotap::ip_address_set& local_dns_servers() const { return m_local_dns_servers; } void set_local_routes(const asiotap::ip_route_set& _local_routes) { m_local_routes = _local_routes; if (m_router) { m_router->invalidate_routes(); } } void set_local_dns_servers(const asiotap::ip_address_set& _local_dns_servers) { m_local_dns_servers = _local_dns_servers; } port_group_type group() const { return m_group; } private: void associate_to_router(router* _router) { m_router = _router; if (m_router) { m_router->invalidate_routes(); } } void dissociate_from_router() { if (m_router) { m_router->invalidate_routes(); m_router = NULL; } } friend class router; write_function_type m_write_function; asiotap::ip_route_set m_local_routes; asiotap::ip_address_set m_local_dns_servers; port_group_type m_group; router* m_router; }; /** * \brief The port list type. */ typedef std::map port_list_type; /** * \brief Create a new router. * \param configuration The router configuration. */ router(const router_configuration& configuration) : m_configuration(configuration) {} /** * \brief Invalidate the routes cache. */ void invalidate_routes() { m_routes = boost::none; } /** * \brief Register a router port. * \param index The index of the port. * \param port The port to register. Cannot be null. */ void register_port(port_index_type index, port_type port) { port_type& local_port = (m_ports[index] = port); // This takes care of automatically clearing the route cache whenever needed. local_port.associate_to_router(this); } /** * \brief Unregister a port. * \param index The port to unregister. Cannot be null. * * If the port was not registered, nothing is done. */ void unregister_port(port_index_type index) { m_ports.erase(index); } /** * \brief Check if the specified port is registered. * \param index The port to check. * \return true if the port is registered, false otherwise. */ bool is_registered(port_index_type index) const { return (m_ports.find(index) != m_ports.end()); } /** * \brief Get the port associated to a given index, if it exists. * \param index The index of the port to get. * \return A pointer to the port. */ port_type* get_port(port_index_type index) { const port_list_type::iterator port_entry = m_ports.find(index); if (port_entry == m_ports.end()) { return nullptr; } return &port_entry->second; } /** * \brief Receive data trough the specified port. * \param index The port from which the data comes. * \param data The data to write. * \param handler The handler to call when the write is complete. */ void async_write(port_index_type index, boost::asio::const_buffer data, port_type::write_handler_type handler); private: std::vector get_targets_for(port_index_type, boost::asio::const_buffer); template std::vector get_targets_for(port_index_type, const AddressType&); router_configuration m_configuration; port_list_type m_ports; asiotap::osi::filter m_ipv4_filter; asiotap::osi::filter m_ipv6_filter; typedef std::multimap routes_port_type; const routes_port_type& routes() const; mutable boost::optional m_routes; }; } #endif /* ROUTER_HPP */ freelan-2.0/libs/freelan/include/freelan/routes_message.hpp000066400000000000000000000073031252300335000241250ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file routes_message.hpp * \author Julien KAUFFMANN * \brief The routes messages exchanged by the peers. */ #ifndef FREELAN_ROUTES_MESSAGE_HPP #define FREELAN_ROUTES_MESSAGE_HPP #include #include #include #include "message.hpp" namespace freelan { /** * \brief A routes message. */ class routes_message : public message { public: /** * \brief The version typedef. */ typedef uint32_t version_type; /** * \brief Write a routes message to a buffer. * \param buf The buffer to write to. * \param buf_len The length of buf. * \param version The version. * \param routes The routes. * \return The count of bytes written. */ static size_t write(void* buf, size_t buf_len, version_type version, const asiotap::ip_route_set& routes, const asiotap::ip_address_set& dns_servers); /** * \brief Get the version. * \return The version. */ version_type version() const; /** * \brief Get the routes. * \return The routes. */ const asiotap::ip_route_set& routes() const; /** * \brief Get the DNS servers. * \return The DNS servers. */ const asiotap::ip_address_set& dns_servers() const; /** * \brief Create a routes_message and map it on a buffer. * \param buf The buffer. * \param buf_len The buffer length. * * If the mapping fails, a std::runtime_error is thrown. */ routes_message(const void* buf, size_t buf_len); /** * \brief Create a routes_message from a message. * \param message The message. */ routes_message(const message& message); private: struct routes_and_dns_servers { asiotap::ip_route_set routes; asiotap::ip_address_set dns_servers; }; void read_and_cache_results() const; mutable boost::optional m_results; }; } #endif /* FREELAN_ROUTES_MESSAGE_HPP */ freelan-2.0/libs/freelan/include/freelan/routes_request_message.hpp000066400000000000000000000055541252300335000257030ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file routes_request_message.hpp * \author Julien KAUFFMANN * \brief The routes request messages exchanged by the peers. */ #ifndef FREELAN_ROUTES_REQUEST_MESSAGE_HPP #define FREELAN_ROUTES_REQUEST_MESSAGE_HPP #include "message.hpp" namespace freelan { /** * \brief A routes request message. */ class routes_request_message : public message { public: /** * \brief Write a routes request message to a buffer. * \param buf The buffer to write to. * \param buf_len The length of buf. * \return The count of bytes written. */ static size_t write(void* buf, size_t buf_len); /** * \brief Create a routes_request_message and map it on a buffer. * \param buf The buffer. * \param buf_len The buffer length. * * If the mapping fails, a std::runtime_error is thrown. */ routes_request_message(const void* buf, size_t buf_len); /** * \brief Create a routes_request_message from a message. * \param message The message. */ routes_request_message(const message& message); }; } #endif /* FREELAN_ROUTES_REQUEST_MESSAGE_HPP */ freelan-2.0/libs/freelan/include/freelan/server.hpp000066400000000000000000000074431252300335000224130ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file server.hpp * \author Julien KAUFFMANN * \brief The freelan server class. */ #pragma once #include "os.hpp" #include "configuration.hpp" #include #include #include #include #include #include namespace freelan { class web_server : public mongooseplus::routed_web_server { public: typedef boost::function authentication_handler_type; web_server(fscp::logger& _logger, const freelan::server_configuration& configuration, authentication_handler_type authentication_handler); protected: route_type& register_authenticated_route(route_type&& route); template route_type& register_authenticated_route(Types&&... values) { return register_authenticated_route(route_type(std::forward(values)...)); } mongooseplus::routed_web_server::request_result handle_request(mongooseplus::request&) override; mongooseplus::routed_web_server::request_result handle_http_error(mongooseplus::request&) override; private: struct client_information_type { fscp::presentation_store presentation; boost::posix_time::ptime expiration_timestamp; std::set endpoints; bool has_expired() const { const auto now = boost::posix_time::microsec_clock::universal_time(); return (expiration_timestamp < now); } void expires_from_now(const boost::posix_time::time_duration& duration) { const auto now = boost::posix_time::microsec_clock::universal_time(); expiration_timestamp = now + duration; } }; client_information_type* get_client_information(mongooseplus::request&); fscp::logger& m_logger; authentication_handler_type m_authentication_handler; std::map m_client_information_map; }; } freelan-2.0/libs/freelan/include/freelan/switch.hpp000066400000000000000000000141241252300335000224000ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file switch.hpp * \author Julien KAUFFMANN * \brief A switch class. */ #ifndef SWITCH_HPP #define SWITCH_HPP #include #include #include #include #include #include "configuration.hpp" #include "port_index.hpp" namespace freelan { /** * \brief A class that represents a switch. */ class switch_ { public: /** * \brief The default maximum entry count. */ static const unsigned int MAX_ENTRIES_DEFAULT; /** * \brief The port group type. */ typedef unsigned int port_group_type; /** * \brief The multi write result type. */ typedef std::map multi_write_result_type; /** * \brief The write handler type. */ typedef boost::function multi_write_handler_type; /** * \brief A switch port type. */ class port_type { public: /** * \brief The write handler type. */ typedef boost::function write_handler_type; /** * \brief A write function type. */ typedef boost::function write_function_type; /** * \brief Create a new default port. */ port_type() : m_write_function(), m_group() {} /** * \brief Create a new port. * \param write_function The write function to use. * \param _group The group this port belongs to. */ port_type(write_function_type write_function, port_group_type _group) : m_write_function(write_function), m_group(_group) {} /** * \brief Write data to the port. * \param data The data to write. * \param handler The handler to call when the write is complete. */ void async_write(boost::asio::const_buffer data, write_handler_type handler) { m_write_function(data, handler); } port_group_type group() const { return m_group; } private: write_function_type m_write_function; port_group_type m_group; }; /** * \brief The port list type. */ typedef std::map port_list_type; /** * \brief Create a new switch. * \param configuration The switch configuration. * \param max_entries maximum entries allowed. */ switch_(const switch_configuration& configuration, const unsigned int max_entries = MAX_ENTRIES_DEFAULT) : m_configuration(configuration), m_max_entries(max_entries) {} /** * \brief Register a switch port. * \param index The index of the port. * \param port The port to register. Cannot be null. */ void register_port(port_index_type index, port_type port) { m_ports[index] = port; } /** * \brief Unregister a port. * \param index The port to unregister. Cannot be null. * * If the port was not registered, nothing is done. */ void unregister_port(port_index_type index) { m_ports.erase(index); } /** * \brief Check if the specified port is registered. * \param index The port to check. * \return true if the port is registered, false otherwise. */ bool is_registered(port_index_type index) const { return (m_ports.find(index) != m_ports.end()); } /** * \brief Receive data trough the specified port. * \param index The port from which the data comes. * \param data The data to write. * \param handler The handler to call when the write is complete. */ void async_write(port_index_type index, boost::asio::const_buffer data, multi_write_handler_type handler); private: std::set get_targets_for(port_index_type, boost::asio::const_buffer); std::set get_targets_for(port_list_type::const_iterator); switch_configuration m_configuration; unsigned int m_max_entries; port_list_type m_ports; typedef boost::array ethernet_address_type; typedef std::map ethernet_address_map_type; static ethernet_address_type to_ethernet_address(boost::asio::const_buffer); static bool is_multicast_address(const ethernet_address_type&); ethernet_address_map_type m_ethernet_address_map; }; } #endif /* SWITCH_HPP */ freelan-2.0/libs/freelan/include/freelan/tools.hpp000066400000000000000000000100321252300335000222310ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file tools.hpp * \author Julien KAUFFMANN * \brief Generic purposes functions and classes. */ #pragma once #include "os.hpp" #include #include #include namespace freelan { /** * \brief Get the hostname of the current host. * \return The current hostname. */ std::string get_hostname(); /** * \brief Generate a private key. * \param size The size of the key. Defaults to 2048. * \param prime A prime number to generate the key. Defaults to 17. * \return The private key. */ cryptoplus::pkey::pkey generate_private_key(unsigned int size = 2048, unsigned int prime = 17); /** * \brief Generate a certificate request. * \param private_key The private key to use. * \param common_name The common name to use. Defaults to get_hostname(). * \param The duration of the certificate. Defaults to a year. * \return The self-signed certificate. */ cryptoplus::x509::certificate_request generate_certificate_request(const cryptoplus::pkey::pkey& private_key, const std::string& common_name = get_hostname()); /** * \brief Generate a self-signed certificate. * \param private_key The private key to use. * \param common_name The common name to use. Defaults to get_hostname(). * \param The duration of the certificate. Defaults to a year. * \return The self-signed certificate. */ cryptoplus::x509::certificate generate_self_signed_certificate(const cryptoplus::pkey::pkey& private_key, const std::string& common_name = get_hostname(), unsigned int duration = 365); /** * \brief Sign a certificate request. * \param req The certificate request to sign. * \param ca_certificate The CA certificate to use. * \param private_key The private key that matches the CA certificate. * \param common_name The common name to use. Will override the common name in the certificate request. * \param The duration of the certificate. Defaults to a day. * \return The signed certificate. */ cryptoplus::x509::certificate sign_certificate_request(const cryptoplus::x509::certificate_request& req, const cryptoplus::x509::certificate& ca_certificate, const cryptoplus::pkey::pkey& private_key, const std::string& common_name, unsigned int duration = 1); } freelan-2.0/libs/freelan/libfreelan.vcxproj000066400000000000000000000355721252300335000210610ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {3BCC24B5-D624-47BC-AFED-BF540AFA29F8} Win32Proj libfreelan StaticLibrary true v120 Unicode StaticLibrary true v120 Unicode StaticLibrary false v120 true Unicode StaticLibrary false v120 true Unicode $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) ClCompile $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) ClCompile $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) ClCompile $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) ClCompile Level3 Disabled USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;DEBUG;_WIN32_WINNT=0x0501;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\freelan 4345;4800;4996;4267 /bigobj %(AdditionalOptions) Windows true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 Disabled USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;DEBUG;_WIN32_WINNT=0x0501;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\freelan 4345;4800;4996;4267 /bigobj %(AdditionalOptions) Windows true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 MaxSpeed true true USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;_WIN32_WINNT=0x0501;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\freelan 4345;4800;4996;4267 Windows true true true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 MaxSpeed true true USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;_WIN32_WINNT=0x0501;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\freelan 4345;4800;4996;4267 Windows true true true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template freelan-2.0/libs/freelan/libfreelan.vcxproj.filters000066400000000000000000000111511252300335000225130ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files freelan-2.0/libs/freelan/src/000077500000000000000000000000001252300335000161145ustar00rootroot00000000000000freelan-2.0/libs/freelan/src/client.cpp000066400000000000000000000472521252300335000201100ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file client.cpp * \author Julien KAUFFMANN * \brief A client implementation. */ #include "client.hpp" #include #include #include #include #include #include #include "web_client_error.hpp" namespace { using fscp::SharedBuffer; template boost::function get_write_function(BufferType buffer, BufferSizeType count) { const auto result = [buffer, count] (boost::asio::const_buffer indata) { using boost::asio::buffer_cast; using boost::asio::buffer_size; const char* const bytes = buffer_cast(indata); const size_t bytes_len = buffer_size(indata); char* const dest = buffer_cast(buffer) + *count; const size_t dest_len = buffer_size(buffer) - *count; if (dest_len < bytes_len) { *count = buffer_size(buffer); std::memcpy(dest, bytes, dest_len); return dest_len; } else { *count += bytes_len; std::memcpy(dest, bytes, bytes_len); return bytes_len; } }; return result; } kfather::array_type to_json(const std::set& public_endpoints) { kfather::array_type result; for (auto&& public_endpoint : public_endpoints) { result.items.push_back(boost::lexical_cast(public_endpoint)); } return result; } kfather::string_type to_json(const fscp::hash_type& hash) { return cryptoplus::base64_encode(cryptoplus::buffer(&hash.data[0], hash.data.size())); } kfather::array_type to_json(const std::set& hashes) { kfather::array_type result; for (auto&& hash : hashes) { result.items.push_back(to_json(hash)); } return result; } template ResultType from_json(const kfather::array_type&); template <> std::set from_json>(const kfather::array_type& endpoints) { std::set result; for (auto&& endpoint_obj : endpoints.items) { const auto endpoint_str = kfather::value_cast(endpoint_obj); try { auto endpoint = boost::lexical_cast(endpoint_str); result.insert(endpoint); } catch (const std::exception&) { // If parsing fail, we discard the value silently. } } return result; } template ResultType from_json(const kfather::string_type&); template <> fscp::hash_type from_json(const kfather::string_type& hash_b64) { const auto hash_buf = cryptoplus::base64_decode(hash_b64); if (hash_buf.data().size() != sizeof(fscp::hash_type)) { throw std::runtime_error("Invalid hash size"); } fscp::hash_type hash; std::copy_n(hash_buf.data().begin(), sizeof(hash.data), hash.data.begin()); return hash; } template ResultType from_json(const kfather::object_type&); template <> std::map> from_json>>(const kfather::object_type& contacts) { std::map> result; for (auto&& item : contacts.items) { try { const auto hash = from_json(item.first); const auto endpoints = from_json>(kfather::value_cast(item.second)); result[hash] = endpoints; } catch (const std::exception&) { // If parsing fail, we discard the value silently. } } return result; } } namespace freelan { void web_client::request_certificate(cryptoplus::x509::certificate_request certificate_request, request_certificate_callback handler) { const auto self = shared_from_this(); const auto request = make_request("/request_certificate/"); const auto data = certificate_request.write_der(); request->set_http_header("content-type", "application/octet-stream"); request->set_copy_post_fields(boost::asio::buffer(data.data())); const auto buffer = SharedBuffer(8192); const boost::shared_ptr count(new size_t(0)); request->set_write_function(get_write_function(buffer, count)); m_curl_multi_asio->execute(request, [self, request, buffer, count, handler] (boost::system::error_code ec) { using boost::asio::buffer_cast; using boost::asio::buffer_size; cryptoplus::x509::certificate cert; if (ec) { self->m_logger(fscp::log_level::error) << "Error while sending HTTP(S) request to " << request->get_effective_url() << ": " << ec.message() << " (" << ec << ")"; } else { if (request->get_response_code() != 200) { self->m_logger(fscp::log_level::debug) << "Received unexpected HTTP return code: " << request->get_response_code(); ec = make_error_code(web_client_error::unexpected_response); } else { self->m_logger(fscp::log_level::debug) << "Sending HTTP(S) request to " << request->get_effective_url() << ": " << request->get_response_code(); const auto content_type = request->get_content_type(); if (content_type == "application/x-x509-cert") { try { cert = cryptoplus::x509::certificate::from_der(buffer_cast(buffer), *count); } catch (const boost::system::system_error& ex) { ec = ex.code(); } } else { ec = make_error_code(web_client_error::unsupported_content_type); } } } handler(ec, cert); }); } void web_client::request_ca_certificate(request_certificate_callback handler) { const auto self = shared_from_this(); const auto request = make_request("/request_ca_certificate/"); const auto buffer = SharedBuffer(8192); const boost::shared_ptr count(new size_t(0)); request->set_write_function(get_write_function(buffer, count)); m_curl_multi_asio->execute(request, [self, request, buffer, count, handler] (boost::system::error_code ec) { using boost::asio::buffer_cast; using boost::asio::buffer_size; cryptoplus::x509::certificate cert; if (ec) { self->m_logger(fscp::log_level::error) << "Error while sending HTTP(S) request to " << request->get_effective_url() << ": " << ec.message() << " (" << ec << ")"; } else { if (request->get_response_code() != 200) { self->m_logger(fscp::log_level::debug) << "Received unexpected HTTP return code: " << request->get_response_code(); ec = make_error_code(web_client_error::unexpected_response); } else { self->m_logger(fscp::log_level::debug) << "Sending HTTP(S) request to " << request->get_effective_url() << ": " << request->get_response_code(); const auto content_type = request->get_content_type(); if (content_type == "application/x-x509-ca-cert") { try { cert = cryptoplus::x509::certificate::from_der(buffer_cast(buffer), *count); } catch (const boost::system::system_error& ex) { ec = ex.code(); } } else { ec = make_error_code(web_client_error::unsupported_content_type); } } } handler(ec, cert); }); } void web_client::register_(cryptoplus::x509::certificate certificate, registration_callback handler) { const auto self = shared_from_this(); const auto request = make_request("/register/"); const auto data = certificate.write_der(); request->set_http_header("content-type", "application/x-x509-cert"); request->set_copy_post_fields(boost::asio::buffer(data.data())); const auto buffer = SharedBuffer(8192); const boost::shared_ptr count(new size_t(0)); request->set_write_function(get_write_function(buffer, count)); m_curl_multi_asio->execute(request, [self, request, buffer, count, handler] (boost::system::error_code ec) { using boost::asio::buffer_cast; using boost::asio::buffer_size; boost::posix_time::ptime expiration_timestamp; if (ec) { self->m_logger(fscp::log_level::error) << "Error while sending HTTP(S) request to " << request->get_effective_url() << ": " << ec.message() << " (" << ec << ")"; } else { if (request->get_response_code() != 200) { self->m_logger(fscp::log_level::debug) << "Received unexpected HTTP return code: " << request->get_response_code(); ec = make_error_code(web_client_error::unexpected_response); } else { self->m_logger(fscp::log_level::debug) << "Sending HTTP(S) request to " << request->get_effective_url() << ": " << request->get_response_code(); const auto content_type = request->get_content_type(); if (content_type == "application/json") { self->m_logger(fscp::log_level::debug) << "Received JSON data: " << std::string(buffer_cast(buffer), *count); kfather::parser parser; kfather::value_type result; if (!parser.parse(result, buffer_cast(buffer), *count)) { ec = make_error_code(web_client_error::invalid_json_stream); } else { const kfather::object_type value = kfather::value_cast(result); if (kfather::is_falsy(value)) { ec = make_error_code(web_client_error::invalid_json_stream); } else { const std::string expiration_timestamp_str = kfather::value_cast(value.get("expiration_timestamp")); boost::posix_time::time_input_facet* tif = new boost::posix_time::time_input_facet; tif->set_iso_extended_format(); std::istringstream iss(expiration_timestamp_str); iss.imbue(std::locale(std::locale::classic(), tif)); iss >> expiration_timestamp; if (expiration_timestamp.is_not_a_date_time()) { ec = make_error_code(web_client_error::invalid_json_stream); } } } } else { ec = make_error_code(web_client_error::unsupported_content_type); } } } handler(ec, expiration_timestamp); }); } void web_client::unregister(unregistration_callback handler) { const auto self = shared_from_this(); const auto request = make_request("/unregister/"); const auto buffer = SharedBuffer(8192); const boost::shared_ptr count(new size_t(0)); request->set_write_function(get_write_function(buffer, count)); m_curl_multi_asio->execute(request, [self, request, buffer, count, handler] (boost::system::error_code ec) { if (ec) { self->m_logger(fscp::log_level::error) << "Error while sending HTTP(S) request to " << request->get_effective_url() << ": " << ec.message() << " (" << ec << ")"; } else { if (request->get_response_code() != 200) { self->m_logger(fscp::log_level::debug) << "Received unexpected HTTP return code: " << request->get_response_code(); ec = make_error_code(web_client_error::unexpected_response); } else { self->m_logger(fscp::log_level::debug) << "Sending HTTP(S) request to " << request->get_effective_url() << ": " << request->get_response_code(); } } handler(ec); }); } void web_client::set_contact_information(const std::set& public_endpoints, set_contact_information_callback handler) { const auto self = shared_from_this(); const auto request = make_request("/set_contact_information/"); std::ostringstream oss; kfather::compact_formatter().format( oss, kfather::object_type { { {"public_endpoints", to_json(public_endpoints)} } } ); request->set_http_header("content-type", "application/json"); request->set_copy_post_fields(boost::asio::buffer(oss.str())); const auto buffer = SharedBuffer(8192); const boost::shared_ptr count(new size_t(0)); request->set_write_function(get_write_function(buffer, count)); m_curl_multi_asio->execute(request, [self, request, buffer, count, handler] (boost::system::error_code ec) { using boost::asio::buffer_cast; using boost::asio::buffer_size; std::set accepted_endpoints; std::set rejected_endpoints; if (ec) { self->m_logger(fscp::log_level::error) << "Error while sending HTTP(S) request to " << request->get_effective_url() << ": " << ec.message() << " (" << ec << ")"; } else { if (request->get_response_code() != 200) { self->m_logger(fscp::log_level::debug) << "Received unexpected HTTP return code: " << request->get_response_code(); ec = make_error_code(web_client_error::unexpected_response); } else { self->m_logger(fscp::log_level::debug) << "Sending HTTP(S) request to " << request->get_effective_url() << ": " << request->get_response_code(); const auto content_type = request->get_content_type(); if (content_type == "application/json") { self->m_logger(fscp::log_level::debug) << "Received JSON data: " << std::string(buffer_cast(buffer), *count); kfather::parser parser; kfather::value_type result; if (!parser.parse(result, buffer_cast(buffer), *count)) { ec = make_error_code(web_client_error::invalid_json_stream); } else { const kfather::object_type value = kfather::value_cast(result); if (kfather::is_falsy(value)) { ec = make_error_code(web_client_error::invalid_json_stream); } else { accepted_endpoints = from_json>(value.get("accepted_endpoints")); rejected_endpoints = from_json>(value.get("rejected_endpoints")); } } } else { ec = make_error_code(web_client_error::unsupported_content_type); } } } handler(ec, accepted_endpoints, rejected_endpoints); }); } void web_client::get_contact_information(const std::set& requested_contacts, get_contact_information_callback handler) { const auto self = shared_from_this(); const auto request = make_request("/get_contact_information/"); std::ostringstream oss; kfather::compact_formatter().format( oss, kfather::object_type { { {"requested_contacts", to_json(requested_contacts)} } } ); request->set_http_header("content-type", "application/json"); request->set_copy_post_fields(boost::asio::buffer(oss.str())); const auto buffer = SharedBuffer(8192); const boost::shared_ptr count(new size_t(0)); request->set_write_function(get_write_function(buffer, count)); m_curl_multi_asio->execute(request, [self, request, buffer, count, handler] (boost::system::error_code ec) { using boost::asio::buffer_cast; using boost::asio::buffer_size; std::map> contacts; if (ec) { self->m_logger(fscp::log_level::error) << "Error while sending HTTP(S) request to " << request->get_effective_url() << ": " << ec.message() << " (" << ec << ")"; } else { if (request->get_response_code() != 200) { self->m_logger(fscp::log_level::debug) << "Received unexpected HTTP return code: " << request->get_response_code(); ec = make_error_code(web_client_error::unexpected_response); } else { self->m_logger(fscp::log_level::debug) << "Sending HTTP(S) request to " << request->get_effective_url() << ": " << request->get_response_code(); const auto content_type = request->get_content_type(); if (content_type == "application/json") { self->m_logger(fscp::log_level::debug) << "Received JSON data: " << std::string(buffer_cast(buffer), *count); kfather::parser parser; kfather::value_type result; if (!parser.parse(result, buffer_cast(buffer), *count)) { ec = make_error_code(web_client_error::invalid_json_stream); } else { const kfather::object_type value = kfather::value_cast(result); if (kfather::is_falsy(value)) { ec = make_error_code(web_client_error::invalid_json_stream); } else { contacts = from_json>>(value.get("contacts")); } } } else { ec = make_error_code(web_client_error::unsupported_content_type); } } } handler(ec, contacts); }); } web_client::web_client(boost::asio::io_service& io_service, fscp::logger& _logger, const freelan::client_configuration& configuration) : m_curl_multi_asio(curl_multi_asio::create(io_service)), m_logger(_logger), m_configuration(configuration), m_url_prefix(boost::lexical_cast(m_configuration.protocol) + "://" + boost::lexical_cast(m_configuration.server_endpoint)) { if (m_configuration.protocol == client_configuration::client_protocol_type::http) { m_logger(fscp::log_level::warning) << "Web client not configured to use HTTPS: your username and password will be readable by anyone !"; } else { if (m_configuration.disable_peer_verification) { m_logger(fscp::log_level::warning) << "Web client configured to ignore peer verification: you are vulnerable to man-in-the-middle attacks !"; } if (m_configuration.disable_host_verification) { m_logger(fscp::log_level::warning) << "Web client configured to ignore host verification: you are vulnerable to man-in-the-middle attacks !"; } } } boost::shared_ptr web_client::make_request(const std::string& path) const { boost::shared_ptr request = boost::make_shared(); request->set_url(m_url_prefix + path); request->enable_cookie_support(); if (m_configuration.disable_peer_verification) { request->set_ssl_peer_verification(false); } if (m_configuration.disable_host_verification) { request->set_ssl_host_verification(false); } if (!m_configuration.username.empty() || !m_configuration.password.empty()) { request->set_username(m_configuration.username); request->set_password(m_configuration.password); } return request; } } freelan-2.0/libs/freelan/src/client.hpp000066400000000000000000000127571252300335000201170ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file client.hpp * \author Julien KAUFFMANN * \brief A client implementation. */ #pragma once #include #include #include #include #include #include #include #include #include "os.hpp" #include "configuration.hpp" #include "curl.hpp" namespace freelan { class web_client : public boost::enable_shared_from_this { public: typedef boost::function request_certificate_callback; typedef boost::function registration_callback; typedef boost::function unregistration_callback; typedef boost::function&, const std::set&)> set_contact_information_callback; typedef boost::function>&)> get_contact_information_callback; /** * \brief Create a new web client. * \param io_service The io_service to bind to. * \param _logger The logger to use. * \param configuration The configuration to use. */ static boost::shared_ptr create(boost::asio::io_service& io_service, fscp::logger& _logger, const freelan::client_configuration& configuration) { return boost::shared_ptr(new web_client(io_service, _logger, configuration)); } /** * \brief Request the server for a certificate. * \param certifcate_request The certificate request to send. * \param handler The handler that will get called when the response is received. */ void request_certificate(cryptoplus::x509::certificate_request certificate_request, request_certificate_callback handler); /** * \brief Request the server's CA certificate. * \param handler The handler that will get called when the response is received. */ void request_ca_certificate(request_certificate_callback handler); /** * \brief Register upon the server. * \param certifcate The certificate to send. * \param handler The handler that will get called when the response is received. */ void register_(cryptoplus::x509::certificate certificate, registration_callback handler); /** * \brief Unregister from the server. * \param handler The handler that will get called when the response is received. */ void unregister(unregistration_callback handler); /** * \brief Set contact information on the server. * \param public_endpoints The public endpoints. * \param handler The handler that will get called when the response is received. */ void set_contact_information(const std::set& public_endpoints, set_contact_information_callback handler); /** * \brief Get contact information from the server. * \param requested_contacts The hashes of the contacts to request. * \param handler The handler that will get called when the response is received. */ void get_contact_information(const std::set& requested_contacts, get_contact_information_callback handler); private: web_client(boost::asio::io_service& io_service, fscp::logger& _logger, const freelan::client_configuration& configuration); boost::shared_ptr make_request(const std::string& path) const; boost::shared_ptr m_curl_multi_asio; fscp::logger& m_logger; freelan::client_configuration m_configuration; std::string m_url_prefix; }; } freelan-2.0/libs/freelan/src/configuration.cpp000066400000000000000000000302711252300335000214720ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file configuration.cpp * \author Julien KAUFFMANN * \brief The configuration structure. */ #include "configuration.hpp" #include #include #include namespace freelan { server_configuration::server_configuration() : enabled(false), listen_on(asiotap::ipv4_endpoint(boost::asio::ip::address_v4::any(), 443)), protocol(server_protocol_type::https), authentication_script(), registration_validity_duration(boost::posix_time::minutes(30)) { } client_configuration::client_configuration() : enabled(false), server_endpoint(), protocol(client_protocol_type::https), disable_peer_verification(false), disable_host_verification(false), username(), password(), public_endpoint_list() { } fscp_configuration::fscp_configuration() : listen_on(), listen_on_device(), contact_list(), accept_contact_requests(true), accept_contacts(true), hostname_resolution_protocol(HRP_IPV4), hello_timeout(boost::posix_time::seconds(3)) { } security_configuration::security_configuration() : identity(), certificate_validation_method(CVM_DEFAULT), certificate_validation_script(), certificate_authority_list(), certificate_revocation_validation_method(CRVM_NONE), certificate_revocation_list_list() { } tap_adapter_configuration::tap_adapter_configuration() : enabled(true), type(tap_adapter_type::tap), ipv4_address_prefix_length(), ipv6_address_prefix_length(), arp_proxy_enabled(false), arp_proxy_fake_ethernet_address(), dhcp_proxy_enabled(false), dhcp_server_ipv4_address_prefix_length(), dhcp_server_ipv6_address_prefix_length(), up_script(), down_script() { } switch_configuration::switch_configuration() : routing_method(RM_SWITCH), relay_mode_enabled(false) { } router_configuration::router_configuration() : local_ip_routes(), local_dns_servers(), client_routing_enabled(false), accept_routes_requests(true), internal_route_acceptance_policy(internal_route_scope_type::unicast_in_network), system_route_acceptance_policy(system_route_scope_type::none), maximum_routes_limit(1), dns_servers_acceptance_policy(dns_servers_scope_type::in_network), dns_script() { } configuration::configuration() : server(), fscp(), security(), tap_adapter(), switch_(), router() { } std::istream& operator>>(std::istream& is, server_configuration::server_protocol_type& v) { std::string value; is >> value; if (value == "http") v = server_configuration::server_protocol_type::http; else if (value == "https") v = server_configuration::server_protocol_type::https; else throw boost::bad_lexical_cast(); return is; } std::ostream& operator<<(std::ostream& os, const server_configuration::server_protocol_type& value) { switch (value) { case server_configuration::server_protocol_type::http: return os << "http"; case server_configuration::server_protocol_type::https: return os << "https"; } assert(false); throw std::logic_error("Unexpected value"); } boost::asio::ip::udp to_protocol(fscp_configuration::hostname_resolution_protocol_type value) { switch (value) { case fscp_configuration::HRP_IPV4: return boost::asio::ip::udp::v4(); case fscp_configuration::HRP_IPV6: return boost::asio::ip::udp::v6(); } assert(false); throw std::logic_error("Invalid hostname_resolution_protocol_type"); } std::istream& operator>>(std::istream& is, fscp_configuration::hostname_resolution_protocol_type& v) { std::string value; is >> value; if (value == "ipv4") v = fscp_configuration::HRP_IPV4; else if (value == "ipv6") v = fscp_configuration::HRP_IPV6; else throw boost::bad_lexical_cast(); return is; } std::ostream& operator<<(std::ostream& os, const fscp_configuration::hostname_resolution_protocol_type& value) { switch (value) { case fscp_configuration::HRP_IPV4: return os << "ipv4"; case fscp_configuration::HRP_IPV6: return os << "ipv6"; } assert(false); throw std::logic_error("Unexpected value"); } std::istream& operator>>(std::istream& is, security_configuration::certificate_validation_method_type& v) { std::string value; is >> value; if (value == "default") v = security_configuration::CVM_DEFAULT; else if (value == "none") v = security_configuration::CVM_NONE; else throw boost::bad_lexical_cast(); return is; } std::ostream& operator<<(std::ostream& os, const security_configuration::certificate_validation_method_type& value) { switch (value) { case security_configuration::CVM_DEFAULT: return os << "default"; case security_configuration::CVM_NONE: return os << "none"; } assert(false); throw std::logic_error("Unexpected value"); } std::istream& operator>>(std::istream& is, security_configuration::certificate_revocation_validation_method_type& v) { std::string value; is >> value; if (value == "last") v = security_configuration::CRVM_LAST; else if (value == "all") v = security_configuration::CRVM_ALL; else if (value == "none") v = security_configuration::CRVM_NONE; else throw boost::bad_lexical_cast(); return is; } std::ostream& operator<<(std::ostream& os, const security_configuration::certificate_revocation_validation_method_type& value) { switch (value) { case security_configuration::CRVM_LAST: return os << "last"; case security_configuration::CRVM_ALL: return os << "all"; case security_configuration::CRVM_NONE: return os << "none"; } assert(false); throw std::logic_error("Unexpected value"); } std::istream& operator>>(std::istream& is, tap_adapter_configuration::tap_adapter_type& v) { std::string value; is >> value; if (value == "tap") v = tap_adapter_configuration::tap_adapter_type::tap; else if (value == "tun") v = tap_adapter_configuration::tap_adapter_type::tun; else throw boost::bad_lexical_cast(); return is; } std::ostream& operator<<(std::ostream& os, const tap_adapter_configuration::tap_adapter_type& value) { switch (value) { case tap_adapter_configuration::tap_adapter_type::tap: return os << "tap"; case tap_adapter_configuration::tap_adapter_type::tun: return os << "tun"; } assert(false); throw std::logic_error("Unexpected value"); } std::istream& operator>>(std::istream& is, switch_configuration::routing_method_type& v) { std::string value; is >> value; if (value == "switch") v = switch_configuration::RM_SWITCH; else if (value == "hub") v = switch_configuration::RM_HUB; else throw boost::bad_lexical_cast(); return is; } std::ostream& operator<<(std::ostream& os, const switch_configuration::routing_method_type& value) { switch (value) { case switch_configuration::RM_SWITCH: return os << "switch"; case switch_configuration::RM_HUB: return os << "hub"; } assert(false); throw std::logic_error("Unexpected value"); } std::istream& operator>>(std::istream& is, router_configuration::internal_route_scope_type& v) { std::string value; is >> value; if (value == "none") v = router_configuration::internal_route_scope_type::none; else if (value == "unicast_in_network") v = router_configuration::internal_route_scope_type::unicast_in_network; else if (value == "unicast") v = router_configuration::internal_route_scope_type::unicast; else if (value == "subnet") v = router_configuration::internal_route_scope_type::subnet; else if (value == "any") v = router_configuration::internal_route_scope_type::any; else throw boost::bad_lexical_cast(); return is; } std::ostream& operator<<(std::ostream& os, const router_configuration::internal_route_scope_type& value) { switch (value) { case router_configuration::internal_route_scope_type::none: return os << "none"; case router_configuration::internal_route_scope_type::unicast_in_network: return os << "unicast_in_network"; case router_configuration::internal_route_scope_type::unicast: return os << "unicast"; case router_configuration::internal_route_scope_type::subnet: return os << "subnet"; case router_configuration::internal_route_scope_type::any: return os << "any"; } assert(false); throw std::logic_error("Unexpected value"); } std::istream& operator>>(std::istream& is, router_configuration::system_route_scope_type& v) { std::string value; is >> value; if (value == "none") v = router_configuration::system_route_scope_type::none; else if (value == "unicast") v = router_configuration::system_route_scope_type::unicast; else if (value == "any") v = router_configuration::system_route_scope_type::any; else if (value == "unicast_with_gateway") v = router_configuration::system_route_scope_type::unicast_with_gateway; else if (value == "any_with_gateway") v = router_configuration::system_route_scope_type::any_with_gateway; else throw boost::bad_lexical_cast(); return is; } std::ostream& operator<<(std::ostream& os, const router_configuration::system_route_scope_type& value) { switch (value) { case router_configuration::system_route_scope_type::none: return os << "none"; case router_configuration::system_route_scope_type::unicast: return os << "unicast"; case router_configuration::system_route_scope_type::any: return os << "any"; case router_configuration::system_route_scope_type::unicast_with_gateway: return os << "unicast_with_gateway"; case router_configuration::system_route_scope_type::any_with_gateway: return os << "any_with_gateway"; } assert(false); throw std::logic_error("Unexpected value"); } std::istream& operator>>(std::istream& is, router_configuration::dns_servers_scope_type& v) { std::string value; is >> value; if (value == "none") v = router_configuration::dns_servers_scope_type::none; else if (value == "in_network") v = router_configuration::dns_servers_scope_type::in_network; else if (value == "any") v = router_configuration::dns_servers_scope_type::any; else throw boost::bad_lexical_cast(); return is; } std::ostream& operator<<(std::ostream& os, const router_configuration::dns_servers_scope_type& value) { switch (value) { case router_configuration::dns_servers_scope_type::none: return os << "none"; case router_configuration::dns_servers_scope_type::in_network: return os << "in_network"; case router_configuration::dns_servers_scope_type::any: return os << "any"; } assert(false); throw std::logic_error("Unexpected value"); } } freelan-2.0/libs/freelan/src/core.cpp000066400000000000000000002703421252300335000175600ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file core.cpp * \author Julien KAUFFMANN * \brief The freelan core class. */ #include "core.hpp" #include "tools.hpp" #include "client.hpp" #include "routes_request_message.hpp" #include "routes_message.hpp" #include "server.hpp" #include "client.hpp" #include #include #ifdef WINDOWS #include #else #include #endif #include #include #include #include #include #include namespace freelan { using fscp::SharedBuffer; typedef boost::date_time::c_local_adjustor local_adjustor; using boost::asio::buffer; using boost::asio::buffer_cast; using boost::asio::buffer_size; namespace { void null_simple_write_handler(const boost::system::error_code&) { } void null_switch_write_handler(const switch_::multi_write_result_type&) { } void null_router_write_handler(const boost::system::error_code&) { } asiotap::endpoint to_endpoint(const core::ep_type& host) { if (host.address().is_v4()) { return asiotap::ipv4_endpoint(host.address().to_v4(), host.port()); } else { return asiotap::ipv6_endpoint(host.address().to_v6(), host.port()); } } template class causal_handler { private: class automatic_caller : public boost::noncopyable { public: automatic_caller(CausalHandler& _handler) : m_auto_handler(_handler) { } ~automatic_caller() { m_auto_handler(); } private: CausalHandler& m_auto_handler; }; public: typedef void result_type; causal_handler(Handler _handler, CausalHandler _causal_handler) : m_handler(_handler), m_causal_handler(_causal_handler) {} result_type operator()() { automatic_caller ac(m_causal_handler); m_handler(); } template result_type operator()(Arg1 arg1) { automatic_caller ac(m_causal_handler); m_handler(arg1); } template result_type operator()(Arg1 arg1, Arg2 arg2) { automatic_caller ac(m_causal_handler); m_handler(arg1, arg2); } private: Handler m_handler; CausalHandler m_causal_handler; }; template inline causal_handler make_causal_handler(Handler _handler, CausalHandler _causal_handler) { return causal_handler(_handler, _causal_handler); } unsigned int get_auto_mtu_value() { const unsigned int default_mtu_value = 1500; const size_t static_payload_size = 20 + 8 + 4 + 22; // IP + UDP + FSCP HEADER + FSCP DATA HEADER return default_mtu_value - static_payload_size; } size_t get_auto_mss_value(size_t mtu) { // This somehow is the magic number. const size_t static_payload_size = 20 + 8 + 4 + 22; // IP + UDP + FSCP HEADER + FSCP DATA HEADER return mtu - static_payload_size; } static const unsigned int TAP_ADAPTERS_GROUP = 0; static const unsigned int ENDPOINTS_GROUP = 1; asiotap::ip_route_set filter_routes(const asiotap::ip_route_set& routes, router_configuration::internal_route_scope_type scope, unsigned int limit, const asiotap::ip_network_address_list& network_addresses) { asiotap::ip_route_set result; auto ipv4_limit = limit; auto ipv6_limit = limit; auto check_limit = [limit, &ipv4_limit, &ipv6_limit](const asiotap::ip_route& route) { if (limit == 0) { return true; } const bool is_ipv4 = get_network_address(network_address(route)).is_v4(); if (is_ipv4 ? ipv4_limit : ipv6_limit > 0) { (is_ipv4 ? ipv4_limit : ipv6_limit)--; return true; } return false; }; switch (scope) { case router_configuration::internal_route_scope_type::none: break; case router_configuration::internal_route_scope_type::unicast_in_network: { for (auto&& ina: network_addresses) { for (auto&& route : routes) { if (is_unicast(route) && has_network(ina, network_address(route))) { if (check_limit(route)) { result.insert(route); } } } } break; } case router_configuration::internal_route_scope_type::unicast: { for (auto&& route : routes) { if (is_unicast(route)) { if (check_limit(route)) { result.insert(route); } } } break; } case router_configuration::internal_route_scope_type::subnet: { for (auto&& ina : network_addresses) { for (auto&& route : routes) { if (has_network(ina, network_address(route))) { if (check_limit(route)) { result.insert(route); } } } } break; } case router_configuration::internal_route_scope_type::any: { for (auto&& route : routes) { if (check_limit(route)) { result.insert(route); } } break; } } return result; } asiotap::ip_route_set filter_routes(const asiotap::ip_route_set& routes, router_configuration::system_route_scope_type scope, unsigned int limit) { asiotap::ip_route_set result; auto ipv4_limit = limit; auto ipv6_limit = limit; auto check_limit = [limit, &ipv4_limit, &ipv6_limit](const asiotap::ip_route& route) { if (limit == 0) { return true; } const bool is_ipv4 = get_network_address(network_address(route)).is_v4(); if (is_ipv4 ? ipv4_limit : ipv6_limit > 0) { (is_ipv4 ? ipv4_limit : ipv6_limit)--; return true; } return false; }; switch (scope) { case router_configuration::system_route_scope_type::none: break; case router_configuration::system_route_scope_type::unicast: case router_configuration::system_route_scope_type::unicast_with_gateway: { for (auto&& route : routes) { if (is_unicast(route)) { if ((scope == router_configuration::system_route_scope_type::unicast_with_gateway) || !has_gateway(route)) { if (check_limit(route)) { result.insert(route); } } } } break; } case router_configuration::system_route_scope_type::any: case router_configuration::system_route_scope_type::any_with_gateway: { for (auto&& route : routes) { if ((scope == router_configuration::system_route_scope_type::any_with_gateway) || !has_gateway(route)) { if (check_limit(route)) { result.insert(route); } } } break; } } return result; } asiotap::ip_address_set filter_dns_servers(const asiotap::ip_address_set& dns_servers, router_configuration::dns_servers_scope_type scope, const asiotap::ip_network_address_list& network_addresses) { asiotap::ip_address_set result; switch (scope) { case router_configuration::dns_servers_scope_type::none: break; case router_configuration::dns_servers_scope_type::in_network: { for (auto&& ina : network_addresses) { for (auto&& dns_server : dns_servers) { if (has_address(ina, dns_server.value())) { result.insert(dns_server); } } } break; } case router_configuration::dns_servers_scope_type::any: { result = dns_servers; break; } } return result; } void exponential_backoff_value(boost::posix_time::time_duration& value, const boost::posix_time::time_duration& min, const boost::posix_time::time_duration& max, float min_factor = 1.5f, float max_factor = 2.5f) { const auto factor = (static_cast(::rand()) / static_cast(RAND_MAX)) * (max_factor - min_factor) + min_factor; value = boost::posix_time::milliseconds(static_cast(value.total_milliseconds() * factor)); if (value < min) { value = min; } else if (value > max) { value = max; } } } typedef boost::asio::ip::udp::resolver::query resolver_query; // Has to be put first, as static variables definition order matters. const int core::ex_data_index = cryptoplus::x509::store_context::register_index(); const boost::posix_time::time_duration core::CONTACT_PERIOD = boost::posix_time::seconds(30); const boost::posix_time::time_duration core::DYNAMIC_CONTACT_PERIOD = boost::posix_time::seconds(45); const boost::posix_time::time_duration core::ROUTES_REQUEST_PERIOD = boost::posix_time::seconds(180); const boost::posix_time::time_duration core::RENEW_CERTIFICATE_WARNING_PERIOD = boost::posix_time::hours(6); const boost::posix_time::time_duration core::REGISTRATION_WARNING_PERIOD = boost::posix_time::minutes(5); const boost::posix_time::time_duration core::GET_CONTACT_INFORMATION_UPDATE_PERIOD = boost::posix_time::minutes(5); const std::string core::DEFAULT_SERVICE = "12000"; core::core(boost::asio::io_service& io_service, const freelan::configuration& _configuration) : m_io_service(io_service), m_configuration(_configuration), m_logger_strand(m_io_service), m_logger(m_logger_strand.wrap(boost::bind(&core::do_handle_log, this, _1, _2, _3))), m_log_callback(), m_core_opened_callback(), m_core_closed_callback(), m_session_failed_callback(), m_session_error_callback(), m_session_established_callback(), m_session_lost_callback(), m_authentication_callback(), m_certificate_validation_callback(), m_tap_adapter_up_callback(), m_tap_adapter_down_callback(), m_dns_callback(), m_fscp_server(), m_contact_timer(m_io_service, CONTACT_PERIOD), m_dynamic_contact_timer(m_io_service, DYNAMIC_CONTACT_PERIOD), m_routes_request_timer(m_io_service, ROUTES_REQUEST_PERIOD), m_tap_adapter_io_service(), m_tap_adapter_thread(), m_arp_filter(m_ethernet_filter), m_ipv4_filter(m_ethernet_filter), m_ipv6_filter(m_ethernet_filter), m_udp_filter(m_ipv4_filter), m_tcpv4_filter(m_ipv4_filter), m_tcpv6_filter(m_ipv6_filter), m_bootp_filter(m_udp_filter), m_dhcp_filter(m_bootp_filter), m_tun_ipv4_filter(), m_tun_ipv6_filter(), m_tun_tcpv4_filter(m_tun_ipv4_filter), m_tun_tcpv6_filter(m_tun_ipv6_filter), m_tun_icmpv6_filter(m_tun_ipv6_filter), m_router_strand(m_io_service), m_switch(m_configuration.switch_), m_router(m_configuration.router), m_route_manager(m_io_service), m_dns_servers_manager(m_io_service), m_request_certificate(m_io_service, boost::posix_time::seconds(5), boost::posix_time::seconds(90)), m_request_ca_certificate(m_io_service, boost::posix_time::seconds(5), boost::posix_time::seconds(90)), m_renew_certificate_timer(m_io_service), m_registration_retry(m_io_service, boost::posix_time::seconds(5), boost::posix_time::seconds(90)), m_set_contact_information_retry(m_io_service, boost::posix_time::seconds(5), boost::posix_time::seconds(35)), m_get_contact_information_retry(m_io_service, boost::posix_time::seconds(5), boost::posix_time::seconds(35)) { m_arp_filter.add_handler(boost::bind(&core::do_handle_arp_frame, this, _1)); m_dhcp_filter.add_handler(boost::bind(&core::do_handle_dhcp_frame, this, _1)); m_tun_icmpv6_filter.add_handler(boost::bind(&core::do_handle_icmpv6_frame, this, _1)); m_tcpv4_filter.add_handler([this](asiotap::osi::mutable_helper tcp_helper){ if (m_tcp_mss_morpher) { m_tcp_mss_morpher->handle(*m_tcpv4_filter.parent().get_last_helper(), tcp_helper); } }); m_tcpv6_filter.add_handler([this](asiotap::osi::mutable_helper tcp_helper){ if (m_tcp_mss_morpher) { m_tcp_mss_morpher->handle(*m_tcpv6_filter.parent().get_last_helper(), tcp_helper); } }); m_tun_tcpv4_filter.add_handler([this](asiotap::osi::mutable_helper tcp_helper){ if (m_tcp_mss_morpher) { m_tcp_mss_morpher->handle(*m_tun_tcpv4_filter.parent().get_last_helper(), tcp_helper); } }); m_tun_tcpv6_filter.add_handler([this](asiotap::osi::mutable_helper tcp_helper){ if (m_tcp_mss_morpher) { m_tcp_mss_morpher->handle(*m_tun_tcpv6_filter.parent().get_last_helper(), tcp_helper); } }); // Setup the route manager. m_route_manager.set_route_registration_success_handler([this](const asiotap::route_manager::route_type& route){ m_logger(fscp::log_level::information) << "Added system route: " << route; }); m_route_manager.set_route_registration_failure_handler([this](const asiotap::route_manager::route_type& route, const boost::system::system_error& ex){ m_logger(fscp::log_level::warning) << "Unable to add system route (" << route << "): " << ex.what(); }); m_route_manager.set_route_unregistration_success_handler([this](const asiotap::route_manager::route_type& route){ m_logger(fscp::log_level::information) << "Removed system route: " << route; }); m_route_manager.set_route_unregistration_failure_handler([this](const asiotap::route_manager::route_type& route, const boost::system::system_error& ex){ m_logger(fscp::log_level::warning) << "Unable to remove system route (" << route << "): " << ex.what(); }); // Setup the DNS servers manager. m_dns_servers_manager.set_dns_server_add_handler([this](const asiotap::dns_servers_manager::dns_server_type& dns_server) -> bool { if (m_dns_callback) { if (!m_dns_callback(dns_server.interface_name, DnsAction::Add, dns_server.dns_server_address.value())) { throw boost::system::system_error(make_error_code(asiotap::asiotap_error::external_process_execution_failed)); } return true; } else { #ifndef WINDOWS throw boost::system::system_error(make_error_code(asiotap::asiotap_error::no_dns_script_provided)); #endif } return false; }); m_dns_servers_manager.set_dns_server_remove_handler([this](const asiotap::dns_servers_manager::dns_server_type& dns_server) -> bool { if (m_dns_callback) { if (!m_dns_callback(dns_server.interface_name, DnsAction::Remove, dns_server.dns_server_address.value())) { throw boost::system::system_error(make_error_code(asiotap::asiotap_error::external_process_execution_failed)); } return true; } else { #ifndef WINDOWS m_logger(fscp::log_level::warning) << "Should have added a DNS server but no DNS script was configured."; throw boost::system::system_error(make_error_code(asiotap::asiotap_error::no_dns_script_provided)); #endif } return false; }); m_dns_servers_manager.set_dns_server_registration_success_handler([this](const asiotap::dns_servers_manager::dns_server_type& dns_server){ m_logger(fscp::log_level::information) << "Added DNS server: " << dns_server; }); m_dns_servers_manager.set_dns_server_registration_failure_handler([this](const asiotap::dns_servers_manager::dns_server_type& dns_server, const boost::system::system_error& ex){ m_logger(fscp::log_level::warning) << "Unable to add DNS server (" << dns_server << "): " << ex.what(); }); m_dns_servers_manager.set_dns_server_unregistration_success_handler([this](const asiotap::dns_servers_manager::dns_server_type& dns_server){ m_logger(fscp::log_level::information) << "Removed DNS server: " << dns_server; }); m_dns_servers_manager.set_dns_server_unregistration_failure_handler([this](const asiotap::dns_servers_manager::dns_server_type& dns_server, const boost::system::system_error& ex){ m_logger(fscp::log_level::warning) << "Unable to remove DNS server (" << dns_server << "): " << ex.what(); }); } void core::open() { m_logger(fscp::log_level::debug) << "Opening core..."; open_web_client(); if (m_configuration.security.identity || !m_configuration.client.enabled) { open_fscp_server(); } open_tap_adapter(); open_web_server(); m_logger(fscp::log_level::debug) << "Core opened."; } void core::close() { m_logger(fscp::log_level::debug) << "Closing core..."; close_web_server(); close_tap_adapter(); close_fscp_server(); close_web_client(); m_logger(fscp::log_level::debug) << "Core closed."; } // Private methods void core::do_handle_log(fscp::log_level level, const std::string& msg, const boost::posix_time::ptime& timestamp) { // All do_handle_log() calls are done within the same strand, so the user does not need to protect his callback with a mutex that might slow things down. if (m_log_callback) { m_log_callback(level, msg, timestamp); } } bool core::is_banned(const boost::asio::ip::address& address) const { return has_address(m_configuration.fscp.never_contact_list.begin(), m_configuration.fscp.never_contact_list.end(), address); } void core::open_fscp_server() { if (!m_configuration.security.identity) { m_logger(fscp::log_level::warning) << "No user certificate/private key or pre-shared key set. Generating a temporary certificate/private key pair..."; const auto private_key = generate_private_key(); const auto certificate = generate_self_signed_certificate(private_key); m_configuration.security.identity = fscp::identity_store(certificate, private_key); m_logger(fscp::log_level::warning) << "Using a generated temporary certificate (" << certificate.subject() << ") prevents reliable authentication ! Generate and specify a static certificate/key pair for use in production."; } else { if (!!m_configuration.security.identity->signature_certificate()) { m_logger(fscp::log_level::information) << "Enabling certificate-based authentication."; } if (!m_configuration.security.identity->pre_shared_key().empty()) { m_logger(fscp::log_level::information) << "Enabling pre-shared key authentication."; } } m_logger(fscp::log_level::information) << "Starting FSCP server..."; m_fscp_server = boost::make_shared(boost::ref(m_io_service), boost::ref(m_logger), boost::cref(*m_configuration.security.identity)); try { m_fscp_server->set_cipher_suites(m_configuration.fscp.cipher_suite_capabilities); m_fscp_server->set_elliptic_curves(m_configuration.fscp.elliptic_curve_capabilities); m_fscp_server->set_hello_message_received_callback(boost::bind(&core::do_handle_hello_received, this, _1, _2)); m_fscp_server->set_contact_request_received_callback(boost::bind(&core::do_handle_contact_request_received, this, _1, _2, _3, _4)); m_fscp_server->set_contact_received_callback(boost::bind(&core::do_handle_contact_received, this, _1, _2, _3)); m_fscp_server->set_presentation_message_received_callback(boost::bind(&core::do_handle_presentation_received, this, _1, _2, _3, _4)); m_fscp_server->set_session_request_message_received_callback(boost::bind(&core::do_handle_session_request_received, this, _1, _2, _3, _4)); m_fscp_server->set_session_message_received_callback(boost::bind(&core::do_handle_session_received, this, _1, _2, _3, _4)); m_fscp_server->set_session_failed_callback(boost::bind(&core::do_handle_session_failed, this, _1, _2)); m_fscp_server->set_session_error_callback(boost::bind(&core::do_handle_session_error, this, _1, _2, _3)); m_fscp_server->set_session_established_callback(boost::bind(&core::do_handle_session_established, this, _1, _2, _3, _4)); m_fscp_server->set_session_lost_callback(boost::bind(&core::do_handle_session_lost, this, _1, _2)); m_fscp_server->set_data_received_callback(boost::bind(&core::do_handle_data_received, this, _1, _2, _3, _4)); resolver_type resolver(m_io_service); const ep_type listen_endpoint = boost::apply_visitor( asiotap::endpoint_resolve_visitor( resolver, to_protocol(m_configuration.fscp.hostname_resolution_protocol), resolver_query::address_configured | resolver_query::passive, DEFAULT_SERVICE ), m_configuration.fscp.listen_on ); m_logger(fscp::log_level::important) << "Core set to listen on: " << listen_endpoint; if (m_configuration.security.certificate_validation_method == security_configuration::CVM_DEFAULT) { build_ca_store(build_ca_store_when::it_doesnt_exist); } for(auto&& network_address : m_configuration.fscp.never_contact_list) { m_logger(fscp::log_level::information) << "Configured not to accept requests from: " << network_address; } // Let's open the server. m_fscp_server->open(listen_endpoint); #ifdef LINUX if (!m_configuration.fscp.listen_on_device.empty()) { const auto socket_fd = m_fscp_server->get_socket().native(); const std::string device_name = m_configuration.fscp.listen_on_device; if (::setsockopt(socket_fd, SOL_SOCKET, SO_BINDTODEVICE, device_name.c_str(), device_name.size()) == 0) { m_logger(fscp::log_level::important) << "Restricting VPN traffic on: " << device_name; } else { m_logger(fscp::log_level::warning) << "Unable to restrict traffic on: " << device_name << ". Error was: " << boost::system::error_code(errno, boost::system::system_category()).message(); } } #endif // We start the contact loop. async_contact_all(); m_contact_timer.async_wait(boost::bind(&core::do_handle_periodic_contact, this, boost::asio::placeholders::error)); m_dynamic_contact_timer.async_wait(boost::bind(&core::do_handle_periodic_dynamic_contact, this, boost::asio::placeholders::error)); m_routes_request_timer.async_wait(boost::bind(&core::do_handle_periodic_routes_request, this, boost::asio::placeholders::error)); m_logger(fscp::log_level::information) << "FSCP server started."; } catch (std::exception& ex) { m_logger(fscp::log_level::error) << "Unable to start the FSCP server: " << ex.what(); close_fscp_server(); throw; } } void core::close_fscp_server() { if (m_fscp_server) { m_logger(fscp::log_level::information) << "Closing FSCP server..."; // Stop the contact loop timers. m_routes_request_timer.cancel(); m_dynamic_contact_timer.cancel(); m_contact_timer.cancel(); m_fscp_server->close(); m_logger(fscp::log_level::information) << "FSCP server closed."; } } void core::async_contact(const endpoint& target, duration_handler_type handler) { m_logger(fscp::log_level::debug) << "Resolving " << target << " for potential contact..."; // This is a ugly workaround for a bug in Boost::Variant (<1.55) endpoint target1 = target; const auto resolve_handler = [this, handler, target1] (const boost::system::error_code& ec, boost::asio::ip::udp::resolver::iterator it) { if (!ec) { const ep_type host = *it; // This is a ugly workaround for a bug in Boost::Variant (<1.55) endpoint target2 = target1; // The host was resolved: we first make sure no session exist with that host before doing anything else. m_fscp_server->async_has_session_with_endpoint( host, [this, handler, host, target2] (bool has_session) { if (!has_session) { m_logger(fscp::log_level::debug) << "No session exists with " << target2 << " (at " << host << "). Contacting..."; do_contact(host, handler); } else { m_logger(fscp::log_level::debug) << "A session already exists with " << target2 << " (at " << host << "). Not contacting again."; } } ); } else { handler(ep_type(), ec, boost::posix_time::time_duration()); } }; boost::apply_visitor( asiotap::endpoint_async_resolve_visitor( boost::make_shared(boost::ref(m_io_service)), to_protocol(m_configuration.fscp.hostname_resolution_protocol), resolver_query::address_configured, DEFAULT_SERVICE, resolve_handler ), target ); } void core::async_contact(const endpoint& target) { async_contact(target, boost::bind(&core::do_handle_contact, this, target, _1, _2, _3)); } void core::async_contact_all() { for (auto&& contact : m_configuration.fscp.contact_list) { async_contact(contact); } } void core::async_dynamic_contact_all() { using boost::make_transform_iterator; hash_type (*func)(cert_type) = fscp::get_certificate_hash; const hash_list_type hash_list(make_transform_iterator(m_configuration.fscp.dynamic_contact_list.begin(), func), make_transform_iterator(m_configuration.fscp.dynamic_contact_list.end(), func)); async_send_contact_request_to_all(hash_list); } void core::async_send_contact_request_to_all(const hash_list_type& hash_list, multiple_endpoints_handler_type handler) { m_fscp_server->async_send_contact_request_to_all(hash_list, handler); } void core::async_send_contact_request_to_all(const hash_list_type& hash_list) { async_send_contact_request_to_all(hash_list, boost::bind(&core::do_handle_send_contact_request_to_all, this, _1)); } void core::async_introduce_to(const ep_type& target, simple_handler_type handler) { assert(m_fscp_server); m_fscp_server->async_introduce_to(target, handler); } void core::async_introduce_to(const ep_type& target) { async_introduce_to(target, boost::bind(&core::do_handle_introduce_to, this, target, _1)); } void core::async_request_session(const ep_type& target, simple_handler_type handler) { assert(m_fscp_server); m_logger(fscp::log_level::debug) << "Sending SESSION_REQUEST to " << target << "."; m_fscp_server->async_request_session(target, handler); } void core::async_request_session(const ep_type& target) { async_request_session(target, boost::bind(&core::do_handle_request_session, this, target, _1)); } void core::async_handle_routes_request(const ep_type& sender, const routes_request_message& msg) { // The routes request message does not contain any meaningful information. static_cast(msg); m_router_strand.post( boost::bind( &core::do_handle_routes_request, this, sender ) ); } void core::async_handle_routes(const ep_type& sender, const routes_message& msg) { const auto version = msg.version(); const auto routes = msg.routes(); const auto dns_servers = msg.dns_servers(); async_get_tap_addresses([this, sender, version, routes, dns_servers](const asiotap::ip_network_address_list& ip_addresses){ m_router_strand.post( boost::bind( &core::do_handle_routes, this, ip_addresses, sender, version, routes, dns_servers ) ); }); } void core::async_send_routes_request(const ep_type& target, simple_handler_type handler) { assert(m_fscp_server); m_logger(fscp::log_level::debug) << "Sending routes request to " << target << "."; const auto data_buffer = SharedBuffer(2048); const size_t size = routes_request_message::write( buffer_cast(data_buffer), buffer_size(data_buffer) ); m_fscp_server->async_send_data( target, fscp::CHANNEL_NUMBER_1, buffer(data_buffer, size), make_shared_buffer_handler( data_buffer, handler ) ); } void core::async_send_routes_request(const ep_type& target) { async_send_routes_request(target, boost::bind(&core::do_handle_send_routes_request, this, target, _1)); } void core::async_send_routes_request_to_all(multiple_endpoints_handler_type handler) { assert(m_fscp_server); m_logger(fscp::log_level::debug) << "Sending routes request to all hosts."; const auto data_buffer = SharedBuffer(2048); const size_t size = routes_request_message::write( buffer_cast(data_buffer), buffer_size(data_buffer) ); m_fscp_server->async_send_data_to_all( fscp::CHANNEL_NUMBER_1, buffer(data_buffer, size), make_shared_buffer_handler( data_buffer, handler ) ); } void core::async_send_routes_request_to_all() { async_send_routes_request_to_all(boost::bind(&core::do_handle_send_routes_request_to_all, this, _1)); } void core::async_send_routes(const ep_type& target, routes_message::version_type version, const asiotap::ip_route_set& routes, const asiotap::ip_address_set& dns_servers, simple_handler_type handler) { assert(m_fscp_server); m_logger(fscp::log_level::debug) << "Sending routes and DNS servers to " << target << ": version " << version << " (" << routes << "), (" << dns_servers << ")."; const auto data_buffer = SharedBuffer(8192); const size_t size = routes_message::write( buffer_cast(data_buffer), buffer_size(data_buffer), version, routes, dns_servers ); m_fscp_server->async_send_data( target, fscp::CHANNEL_NUMBER_1, buffer(data_buffer, size), make_shared_buffer_handler( data_buffer, handler ) ); } void core::do_contact(const ep_type& address, duration_handler_type handler) { assert(m_fscp_server); m_logger(fscp::log_level::debug) << "Sending HELLO to " << address; m_fscp_server->async_greet(address, boost::bind(handler, address, _1, _2)); } void core::do_handle_contact(const endpoint& host, const ep_type& address, const boost::system::error_code& ec, const boost::posix_time::time_duration& duration) { if (!ec) { m_logger(fscp::log_level::debug) << "Received HELLO_RESPONSE from " << host << " at " << address << ". Latency: " << duration << ""; async_introduce_to(address); } else { if (ec == fscp::server_error::hello_request_timed_out) { m_logger(fscp::log_level::debug) << "Received no HELLO_RESPONSE from " << host << " at " << address << ": " << ec.message() << " (timeout: " << duration << ")"; } else { m_logger(fscp::log_level::debug) << "Unable to send HELLO to " << host << ": " << ec.message(); } } } void core::do_handle_periodic_contact(const boost::system::error_code& ec) { if (ec != boost::asio::error::operation_aborted) { async_contact_all(); m_contact_timer.expires_from_now(CONTACT_PERIOD); m_contact_timer.async_wait(boost::bind(&core::do_handle_periodic_contact, this, boost::asio::placeholders::error)); } } void core::do_handle_periodic_dynamic_contact(const boost::system::error_code& ec) { if (ec != boost::asio::error::operation_aborted) { async_dynamic_contact_all(); m_dynamic_contact_timer.expires_from_now(DYNAMIC_CONTACT_PERIOD); m_dynamic_contact_timer.async_wait(boost::bind(&core::do_handle_periodic_dynamic_contact, this, boost::asio::placeholders::error)); } } void core::do_handle_periodic_routes_request(const boost::system::error_code& ec) { if (ec != boost::asio::error::operation_aborted) { async_send_routes_request_to_all(); m_routes_request_timer.expires_from_now(ROUTES_REQUEST_PERIOD); m_routes_request_timer.async_wait(boost::bind(&core::do_handle_periodic_routes_request, this, boost::asio::placeholders::error)); } } void core::do_handle_send_contact_request(const ep_type& target, const boost::system::error_code& ec) { if (ec) { m_logger(fscp::log_level::warning) << "Error sending contact request to " << target << ": " << ec.message(); } } void core::do_handle_send_contact_request_to_all(const std::map& results) { for (std::map::const_iterator result = results.begin(); result != results.end(); ++result) { do_handle_send_contact_request(result->first, result->second); } } void core::do_handle_introduce_to(const ep_type& target, const boost::system::error_code& ec) { if (ec) { m_logger(fscp::log_level::warning) << "Error sending introduction message to " << target << ": " << ec.message(); } } void core::do_handle_request_session(const ep_type& target, const boost::system::error_code& ec) { if (ec) { m_logger(fscp::log_level::warning) << "Error requesting session to " << target << ": " << ec.message(); } } void core::do_handle_send_routes_request(const ep_type& target, const boost::system::error_code& ec) { if (ec) { m_logger(fscp::log_level::warning) << "Error sending routes request to " << target << ": " << ec.message(); } } void core::do_handle_send_routes_request_to_all(const std::map& results) { for (std::map::const_iterator result = results.begin(); result != results.end(); ++result) { do_handle_send_routes_request(result->first, result->second); } } bool core::do_handle_hello_received(const ep_type& sender, bool default_accept) { m_logger(fscp::log_level::debug) << "Received HELLO_REQUEST from " << sender << "."; if (is_banned(sender.address())) { m_logger(fscp::log_level::warning) << "Ignoring HELLO_REQUEST from " << sender << " as it is a banned host."; default_accept = false; } if (default_accept) { async_introduce_to(sender); } return default_accept; } bool core::do_handle_contact_request_received(const ep_type& sender, cert_type cert, hash_type hash, const ep_type& answer) { if (m_configuration.fscp.accept_contact_requests) { m_logger(fscp::log_level::information) << "Received contact request from " << sender << " for " << cert.subject() << " (" << hash << "). Host is at: " << answer; return true; } else { return false; } } void core::do_handle_contact_received(const ep_type& sender, hash_type hash, const ep_type& answer) { if (m_configuration.fscp.accept_contacts) { // We check if the contact belongs to the forbidden network list. if (is_banned(answer.address())) { m_logger(fscp::log_level::warning) << "Received forbidden contact from " << sender << ": " << hash << " is at " << answer << " but won't be contacted."; } else { m_logger(fscp::log_level::information) << "Received contact from " << sender << ": " << hash << " is at: " << answer; async_contact(to_endpoint(answer)); } } } bool core::do_handle_presentation_received(const ep_type& sender, cert_type sig_cert, fscp::server::presentation_status_type status, bool has_session) { if (m_logger.level() <= fscp::log_level::debug) { if (!!sig_cert) { m_logger(fscp::log_level::debug) << "Received PRESENTATION from " << sender << ": " << sig_cert.subject() << "."; } else { m_logger(fscp::log_level::debug) << "Received PRESENTATION from " << sender << " using pre-shared key authentication."; } } if (is_banned(sender.address())) { m_logger(fscp::log_level::warning) << "Ignoring PRESENTATION from " << sender << " as it is a banned host."; return false; } if (has_session) { m_logger(fscp::log_level::warning) << "Ignoring PRESENTATION from " << sender << " as an active session currently exists with this host."; return false; } if (!!sig_cert) { if (!certificate_is_valid(sig_cert)) { m_logger(fscp::log_level::warning) << "Ignoring PRESENTATION from " << sender << " as the signature certificate is invalid."; return false; } m_logger(fscp::log_level::information) << "Accepting PRESENTATION from " << sender << " (" << sig_cert.subject() << "): " << status << "."; } else { m_logger(fscp::log_level::information) << "Accepting PRESENTATION from " << sender << " for pre-shared key authentication: " << status << "."; } async_request_session(sender); return true; } bool core::do_handle_session_request_received(const ep_type& sender, const fscp::cipher_suite_list_type& cscap, const fscp::elliptic_curve_list_type& eccap, bool default_accept) { m_logger(fscp::log_level::debug) << "Received SESSION_REQUEST from " << sender << " (default: " << (default_accept ? std::string("accept") : std::string("deny")) << ")."; if (m_logger.level() <= fscp::log_level::debug) { std::ostringstream oss; for (auto&& cs : cscap) { oss << " " << cs; } m_logger(fscp::log_level::debug) << "Cipher suites capabilities:" << oss.str(); oss.str(""); for (auto&& ec : eccap) { oss << " " << ec; } m_logger(fscp::log_level::debug) << "Elliptic curve capabilities:" << oss.str(); } return default_accept; } bool core::do_handle_session_received(const ep_type& sender, fscp::cipher_suite_type cs, fscp::elliptic_curve_type ec, bool default_accept) { m_logger(fscp::log_level::debug) << "Received SESSION from " << sender << " (default: " << (default_accept ? std::string("accept") : std::string("deny")) << ")."; m_logger(fscp::log_level::debug) << "Cipher suite: " << cs; m_logger(fscp::log_level::debug) << "Elliptic curve: " << ec; return default_accept; } void core::do_handle_session_failed(const ep_type& host, bool is_new) { if (is_new) { m_logger(fscp::log_level::warning) << "Session establishment with " << host << " failed."; } else { m_logger(fscp::log_level::warning) << "Session renewal with " << host << " failed."; } if (m_session_failed_callback) { m_session_failed_callback(host, is_new); } } void core::do_handle_session_error(const ep_type& host, bool is_new, const std::exception& error) { if (is_new) { m_logger(fscp::log_level::warning) << "Session establishment with " << host << " encountered an error: " << error.what(); } else { m_logger(fscp::log_level::warning) << "Session renewal with " << host << " encountered an error: " << error.what(); } if (m_session_error_callback) { m_session_error_callback(host, is_new, error); } } void core::do_handle_session_established(const ep_type& host, bool is_new, const fscp::cipher_suite_type& cs, const fscp::elliptic_curve_type& ec) { if (is_new) { m_logger(fscp::log_level::important) << "Session established with " << host << "."; } else { m_logger(fscp::log_level::information) << "Session renewed with " << host << "."; } m_logger(fscp::log_level::information) << "Cipher suite: " << cs; m_logger(fscp::log_level::information) << "Elliptic curve: " << ec; if (is_new) { if (m_configuration.tap_adapter.type == tap_adapter_configuration::tap_adapter_type::tap) { async_register_switch_port(host, boost::bind(&core::async_send_routes_request, this, host)); } else { // We register the router port without any routes, at first. async_register_router_port(host, boost::bind(&core::async_send_routes_request, this, host)); } const auto route = m_route_manager.get_route_for(host.address()); async_save_system_route(host, route, void_handler_type()); } if (m_session_established_callback) { m_session_established_callback(host, is_new, cs, ec); } } void core::do_handle_session_lost(const ep_type& host, fscp::server::session_loss_reason reason) { m_logger(fscp::log_level::important) << "Session with " << host << " lost (" << reason << ")."; if (m_session_lost_callback) { m_session_lost_callback(host, reason); } if (m_configuration.tap_adapter.type == tap_adapter_configuration::tap_adapter_type::tap) { async_unregister_switch_port(host, void_handler_type()); } else { async_unregister_router_port(host, void_handler_type()); } async_clear_client_router_info(host, void_handler_type()); } void core::do_handle_data_received(const ep_type& sender, fscp::channel_number_type channel_number, fscp::SharedBuffer buffer, boost::asio::const_buffer data) { switch (channel_number) { // Channel 0 contains ethernet/ip frames case fscp::CHANNEL_NUMBER_0: if (m_configuration.tap_adapter.type == tap_adapter_configuration::tap_adapter_type::tap) { async_write_switch( make_port_index(sender), data, make_shared_buffer_handler( buffer, &null_switch_write_handler ) ); } else { async_write_router( make_port_index(sender), data, make_shared_buffer_handler( buffer, &null_router_write_handler ) ); } break; // Channel 1 contains messages case fscp::CHANNEL_NUMBER_1: try { const message msg(buffer_cast(data), buffer_size(data)); do_handle_message(sender, buffer, msg); } catch (std::runtime_error& ex) { m_logger(fscp::log_level::warning) << "Received incorrectly formatted message from " << sender << ". Error was: " << ex.what(); } break; default: m_logger(fscp::log_level::warning) << "Received unhandled " << buffer_size(data) << " byte(s) of data on FSCP channel #" << static_cast(channel_number); break; } } void core::do_handle_message(const ep_type& sender, fscp::SharedBuffer, const message& msg) { switch (msg.type()) { case message::MT_ROUTES_REQUEST: { routes_request_message rr_msg(msg); async_handle_routes_request(sender, rr_msg); break; } case message::MT_ROUTES: { routes_message r_msg(msg); async_handle_routes(sender, r_msg); break; } default: m_logger(fscp::log_level::warning) << "Received unhandled message of type " << static_cast(msg.type()) << " on the message channel"; break; } } void core::do_handle_routes_request(const ep_type& sender) { // All calls to do_handle_routes_request() are done within the m_router_strand, so the following is safe. if (!m_configuration.router.accept_routes_requests) { m_logger(fscp::log_level::debug) << "Received routes request from " << sender << " but ignoring as specified in the configuration"; } else { if (m_tap_adapter && (m_tap_adapter->layer() == asiotap::tap_adapter_layer::ip)) { const auto local_port = m_router.get_port(make_port_index(m_tap_adapter)); if (m_local_routes_version.is_initialized()) { const auto routes = local_port->local_routes(); const auto dns_servers = local_port->local_dns_servers(); m_logger(fscp::log_level::debug) << "Received routes request from " << sender << ". Replying with version " << *m_local_routes_version << ": " << routes << ". DNS: " << dns_servers; async_send_routes(sender, *m_local_routes_version, routes, dns_servers, &null_simple_write_handler); } else { m_logger(fscp::log_level::debug) << "Received routes request from " << sender << " but no local routes are set. Not sending anything."; } } else { const auto routes = translate_ip_routes(m_configuration.router.local_ip_routes); const auto dns_servers = m_configuration.router.local_dns_servers; const auto version = 0; m_logger(fscp::log_level::debug) << "Received routes request from " << sender << ". Replying with version " << version << ": " << routes; async_send_routes(sender, version, routes, dns_servers, &null_simple_write_handler); } } } void core::do_handle_routes(const asiotap::ip_network_address_list& tap_addresses, const ep_type& sender, routes_message::version_type version, const asiotap::ip_route_set& routes, const asiotap::ip_address_set& dns_servers) { // All calls to do_handle_routes() are done within the m_router_strand, so the following is safe. client_router_info_type& client_router_info = m_client_router_info_map[sender]; if (!client_router_info.is_older_than(version)) { m_logger(fscp::log_level::debug) << "Ignoring old routes message with version " << version << " as current version is " << *client_router_info.version; return; } if (!m_tap_adapter) { m_logger(fscp::log_level::information) << "Ignoring routes message as no tap adapter is currently associated."; return; } asiotap::ip_address_set filtered_dns_servers; if (m_configuration.router.dns_servers_acceptance_policy == router_configuration::dns_servers_scope_type::none) { if (!dns_servers.empty()) { m_logger(fscp::log_level::warning) << "Received DNS servers from " << sender << " (version " << version << ") will be ignored, as the configuration requires: " << dns_servers; } } else { filtered_dns_servers = filter_dns_servers(dns_servers, m_configuration.router.dns_servers_acceptance_policy, tap_addresses); if (filtered_dns_servers != dns_servers) { if (filtered_dns_servers.empty()) { m_logger(fscp::log_level::warning) << "Received DNS servers from " << sender << " (version " << version << ") but none matched the DNS servers acceptance policy (" << m_configuration.router.dns_servers_acceptance_policy << "): " << dns_servers; } else { asiotap::ip_address_set excluded_dns_servers; std::set_difference(dns_servers.begin(), dns_servers.end(), filtered_dns_servers.begin(), filtered_dns_servers.end(), std::inserter(excluded_dns_servers, excluded_dns_servers.end())); m_logger(fscp::log_level::warning) << "Received DNS servers from " << sender << " (version " << version << ") but some did not match the DNS servers acceptance policy (" << m_configuration.router.dns_servers_acceptance_policy << "): " << excluded_dns_servers; } } if (!filtered_dns_servers.empty()) { if ((m_tap_adapter->layer() == asiotap::tap_adapter_layer::ip)) { const auto port = m_router.get_port(make_port_index(sender)); if (port) { port->set_local_dns_servers(filtered_dns_servers); m_logger(fscp::log_level::information) << "Received DNS servers from " << sender << " (version " << version << ") were saved: " << filtered_dns_servers; } else { m_logger(fscp::log_level::debug) << "Received DNS servers from " << sender << " but unable to get the associated router port. Doing nothing"; } } } } asiotap::ip_route_set filtered_routes; if (m_tap_adapter->layer() == asiotap::tap_adapter_layer::ip) { if (m_configuration.router.internal_route_acceptance_policy == router_configuration::internal_route_scope_type::none) { if (!routes.empty()) { m_logger(fscp::log_level::warning) << "Received routes from " << sender << " (version " << version << ") will be ignored, as the configuration requires: " << routes; } } else { filtered_routes = filter_routes(routes, m_configuration.router.internal_route_acceptance_policy, m_configuration.router.maximum_routes_limit, tap_addresses); if (filtered_routes != routes) { if (filtered_routes.empty()) { m_logger(fscp::log_level::warning) << "Received routes from " << sender << " (version " << version << ") but none matched the internal route acceptance policy (" << m_configuration.router.internal_route_acceptance_policy << ", limit " << m_configuration.router.maximum_routes_limit << "): " << routes; } else { asiotap::ip_route_set excluded_routes; std::set_difference(routes.begin(), routes.end(), filtered_routes.begin(), filtered_routes.end(), std::inserter(excluded_routes, excluded_routes.end())); m_logger(fscp::log_level::warning) << "Received routes from " << sender << " (version " << version << ") but some did not match the internal route acceptance policy (" << m_configuration.router.internal_route_acceptance_policy << ", limit " << m_configuration.router.maximum_routes_limit << "): " << excluded_routes; } } if (!filtered_routes.empty()) { const auto port = m_router.get_port(make_port_index(sender)); if (port) { port->set_local_routes(filtered_routes); m_logger(fscp::log_level::information) << "Received routes from " << sender << " (version " << version << ") were applied: " << filtered_routes; } else { m_logger(fscp::log_level::debug) << "Received routes from " << sender << " but unable to get the associated router port. Doing nothing"; } } } } else { if (m_configuration.router.system_route_acceptance_policy == router_configuration::system_route_scope_type::none) { if (!routes.empty()) { m_logger(fscp::log_level::warning) << "Received routes from " << sender << " (version " << version << ") will be ignored, as the configuration requires: " << routes; } } else { filtered_routes = routes; } } // Silently filter out routes that are already covered by the default interface routing table entries (aka. routes that belong to the interface's network). asiotap::ip_route_set filtered_system_routes; for (auto&& ina: tap_addresses) { for (auto&& route : filtered_routes) { if (!has_network(ina, network_address(route))) { filtered_system_routes.insert(route); } } } const auto system_routes = filter_routes(filtered_system_routes, m_configuration.router.system_route_acceptance_policy, m_configuration.router.maximum_routes_limit); if (system_routes != filtered_system_routes) { if (system_routes.empty() && !filtered_system_routes.empty()) { m_logger(fscp::log_level::warning) << "Received system routes from " << sender << " (version " << version << ") but none matched the system route acceptance policy (" << m_configuration.router.system_route_acceptance_policy << ", limit " << m_configuration.router.maximum_routes_limit << "): " << filtered_system_routes; } else { asiotap::ip_route_set excluded_routes; std::set_difference(filtered_system_routes.begin(), filtered_system_routes.end(), system_routes.begin(), system_routes.end(), std::inserter(excluded_routes, excluded_routes.end())); m_logger(fscp::log_level::warning) << "Received system routes from " << sender << " (version " << version << ") but some did not match the system route acceptance policy (" << m_configuration.router.system_route_acceptance_policy << ", limit " << m_configuration.router.maximum_routes_limit << "): " << excluded_routes; } } client_router_info_type new_client_router_info; new_client_router_info.saved_system_route = client_router_info.saved_system_route; new_client_router_info.version = client_router_info.version; for (auto&& route : filtered_system_routes) { // Mac OSX doesn't support duplicate default gateways. #ifdef MACINTOSH const auto address = to_ip_address(network_address(route)); const auto prefix_length = to_prefix_length(network_address(route)); if ((address == boost::asio::ip::address_v4::any()) && (prefix_length == 0)) { m_logger(fscp::log_level::warning) << "Received a default IPv4 route: splitting it as Mac OS X doesn't support duplicate default routes."; const auto gateway = asiotap::gateway(route); boost::optional ipv4_gateway; if (gateway && gateway->is_v4()) { ipv4_gateway = gateway->to_v4(); } const auto route1 = asiotap::ipv4_route(asiotap::ipv4_network_address(boost::asio::ip::address_v4::from_string("0.0.0.0"), 1), ipv4_gateway); const auto route2 = asiotap::ipv4_route(asiotap::ipv4_network_address(boost::asio::ip::address_v4::from_string("128.0.0.0"), 1), ipv4_gateway); new_client_router_info.system_route_entries.push_back(m_route_manager.get_route_entry(m_tap_adapter->get_route(route1))); new_client_router_info.system_route_entries.push_back(m_route_manager.get_route_entry(m_tap_adapter->get_route(route2))); } else { new_client_router_info.system_route_entries.push_back(m_route_manager.get_route_entry(m_tap_adapter->get_route(route))); } #else new_client_router_info.system_route_entries.push_back(m_route_manager.get_route_entry(m_tap_adapter->get_route(route))); #endif } for (auto&& dns_server : filtered_dns_servers) { new_client_router_info.dns_servers_entries.push_back(m_dns_servers_manager.get_dns_server_entry(m_tap_adapter->get_dns_server(dns_server))); } client_router_info = new_client_router_info; } int core::certificate_validation_callback(int ok, X509_STORE_CTX* ctx) { cryptoplus::x509::store_context store_context(ctx); core* _this = static_cast(store_context.get_external_data(core::ex_data_index)); return (_this->certificate_validation_method(ok != 0, store_context)) ? 1 : 0; } void core::build_ca_store(build_ca_store_when condition) { // We can't easily ensure m_ca_store is used only in one strand, so we protect it with a mutex instead. boost::mutex::scoped_lock lock(m_ca_store_mutex); if (!!m_ca_store) { if (condition == build_ca_store_when::it_doesnt_exist) { return; } m_logger(fscp::log_level::information) << "Rebuilding CA store..."; } else { m_logger(fscp::log_level::information) << "Building CA store..."; } m_ca_store = cryptoplus::x509::store::create(); for (const cert_type& cert : m_configuration.security.certificate_authority_list) { m_ca_store.add_certificate(cert); } for (const cert_type& cert : m_client_certificate_authority_list) { m_ca_store.add_certificate(cert); } for (const crl_type& crl : m_configuration.security.certificate_revocation_list_list) { m_ca_store.add_certificate_revocation_list(crl); } switch (m_configuration.security.certificate_revocation_validation_method) { case security_configuration::CRVM_LAST: { m_ca_store.set_verification_flags(X509_V_FLAG_CRL_CHECK); break; } case security_configuration::CRVM_ALL: { m_ca_store.set_verification_flags(X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL); break; } case security_configuration::CRVM_NONE: { break; } } } bool core::certificate_validation_method(bool ok, cryptoplus::x509::store_context store_context) { cert_type cert = store_context.get_current_certificate(); if (!ok) { m_logger(fscp::log_level::warning) << "Error when validating " << cert.subject() << ": " << store_context.get_error_string() << " (depth: " << store_context.get_error_depth() << ")"; } else { m_logger(fscp::log_level::information) << cert.subject() << " is valid."; } return ok; } bool core::certificate_is_valid(cert_type cert) { switch (m_configuration.security.certificate_validation_method) { case security_configuration::CVM_DEFAULT: { using namespace cryptoplus; // We can't easily ensure m_ca_store is used only in one strand, so we protect it with a mutex instead. boost::mutex::scoped_lock lock(m_ca_store_mutex); // Create a store context to proceed to verification x509::store_context store_context = x509::store_context::create(); store_context.initialize(m_ca_store, cert, NULL); // Ensure to set the verification callback *AFTER* you called initialize or it will be ignored. store_context.set_verification_callback(&core::certificate_validation_callback); // Add a reference to the current instance into the store context. store_context.set_external_data(core::ex_data_index, this); if (!store_context.verify()) { return false; } break; } case security_configuration::CVM_NONE: { break; } } if (m_certificate_validation_callback) { return m_certificate_validation_callback(cert); } return true; } void core::open_tap_adapter() { if (m_configuration.tap_adapter.enabled) { const asiotap::tap_adapter_layer tap_adapter_type = (m_configuration.tap_adapter.type == tap_adapter_configuration::tap_adapter_type::tap) ? asiotap::tap_adapter_layer::ethernet : asiotap::tap_adapter_layer::ip; m_tap_adapter = boost::make_shared(boost::ref(m_tap_adapter_io_service), tap_adapter_type); const auto write_func = [this] (boost::asio::const_buffer data, simple_handler_type handler) { async_write_tap(buffer(data), m_io_service.wrap(handler)); }; m_tap_adapter->open(m_configuration.tap_adapter.name); asiotap::tap_adapter_configuration tap_config; // The device MTU. tap_config.mtu = compute_mtu(m_configuration.tap_adapter.mtu, get_auto_mtu_value()); m_logger(fscp::log_level::important) << "Tap adapter \"" << *m_tap_adapter << "\" opened in mode " << m_configuration.tap_adapter.type << " with a MTU set to: " << tap_config.mtu; // The MSS override. const size_t max_mss = compute_mss(m_configuration.tap_adapter.mss_override, get_auto_mss_value(tap_config.mtu)); if (max_mss > 0) { m_tcp_mss_morpher.reset(new asiotap::osi::tcp_mss_morpher(max_mss)); m_logger(fscp::log_level::important) << "MSS override enabled with a value of: " << max_mss; } else { m_tcp_mss_morpher.reset(); m_logger(fscp::log_level::warning) << "MSS override disabled. You may experience IP fragmentation for encapsulated TCP connections."; } // IPv4 address if (!m_configuration.tap_adapter.ipv4_address_prefix_length.is_null()) { m_logger(fscp::log_level::information) << "IPv4 address: " << m_configuration.tap_adapter.ipv4_address_prefix_length; tap_config.ipv4.network_address = { m_configuration.tap_adapter.ipv4_address_prefix_length.address(), m_configuration.tap_adapter.ipv4_address_prefix_length.prefix_length() }; } else { m_logger(fscp::log_level::information) << "No IPv4 address configured."; } // IPv6 address if (!m_configuration.tap_adapter.ipv6_address_prefix_length.is_null()) { m_logger(fscp::log_level::information) << "IPv6 address: " << m_configuration.tap_adapter.ipv6_address_prefix_length; tap_config.ipv6.network_address = { m_configuration.tap_adapter.ipv6_address_prefix_length.address(), m_configuration.tap_adapter.ipv6_address_prefix_length.prefix_length() }; } else { m_logger(fscp::log_level::information) << "No IPv6 address configured."; } // If we are running in tun mode, we need at least one if (m_configuration.tap_adapter.type == tap_adapter_configuration::tap_adapter_type::tun) { if (m_configuration.tap_adapter.ipv4_address_prefix_length.is_null() && m_configuration.tap_adapter.ipv6_address_prefix_length.is_null()) { throw std::runtime_error("Running in tun mode, but no IPv4 or IPv6 address was provided. Please configure at least one IPv4 or IPv6 address."); } if (m_configuration.tap_adapter.remote_ipv4_address) { m_logger(fscp::log_level::information) << "IPv4 remote address: " << m_configuration.tap_adapter.remote_ipv4_address->to_string(); tap_config.ipv4.remote_address = *m_configuration.tap_adapter.remote_ipv4_address; } else { const boost::asio::ip::address_v4 remote_ipv4_address = m_configuration.tap_adapter.ipv4_address_prefix_length.get_network_address(); m_logger(fscp::log_level::information) << "No IPv4 remote address configured. Using a default of: " << remote_ipv4_address.to_string(); tap_config.ipv4.remote_address = remote_ipv4_address; } } m_tap_adapter->configure(tap_config); #ifdef WINDOWS const auto metric_value = get_metric_value(m_configuration.tap_adapter.metric); if (metric_value) { m_logger(fscp::log_level::information) << "Setting interface metric to: " << *metric_value; m_tap_adapter->set_metric(*metric_value); } #endif m_logger(fscp::log_level::information) << "Putting interface into the connected state."; m_tap_adapter->set_connected_state(true); auto local_routes = translate_ip_routes(m_configuration.router.local_ip_routes); auto local_dns_servers = m_configuration.router.local_dns_servers; if (tap_adapter_type == asiotap::tap_adapter_layer::ethernet) { // Registers the switch port. m_switch.register_port(make_port_index(m_tap_adapter), switch_::port_type(write_func, TAP_ADAPTERS_GROUP)); // The ARP proxy if (m_configuration.tap_adapter.arp_proxy_enabled) { m_logger(fscp::log_level::warning) << "The ARP proxy is enabled and this is NOT recommended ! You will face IPv4 connectivity issues !"; m_arp_proxy.reset(new arp_proxy_type()); m_arp_proxy->set_arp_request_callback(boost::bind(&core::do_handle_arp_request, this, _1, _2)); } else { m_arp_proxy.reset(); } // The DHCP proxy if (m_configuration.tap_adapter.dhcp_proxy_enabled) { m_logger(fscp::log_level::information) << "The DHCP proxy is enabled."; m_dhcp_proxy.reset(new dhcp_proxy_type()); m_dhcp_proxy->set_hardware_address(m_tap_adapter->ethernet_address().data()); if (!m_configuration.tap_adapter.dhcp_server_ipv4_address_prefix_length.is_null()) { m_dhcp_proxy->set_software_address(m_configuration.tap_adapter.dhcp_server_ipv4_address_prefix_length.address()); } if (!m_configuration.tap_adapter.ipv4_address_prefix_length.is_null()) { m_dhcp_proxy->add_entry( m_tap_adapter->ethernet_address().data(), m_configuration.tap_adapter.ipv4_address_prefix_length.address(), m_configuration.tap_adapter.ipv4_address_prefix_length.prefix_length() ); } } else { m_dhcp_proxy.reset(); } // We don't need those proxies in TAP mode. m_icmpv6_proxy.reset(); } else { // Registers the router port. m_router.register_port(make_port_index(m_tap_adapter), router::port_type(write_func, TAP_ADAPTERS_GROUP)); // Add the routes from the TAP adapter. const auto tap_ip_addresses = m_tap_adapter->get_ip_addresses(); for (auto&& ip_address : tap_ip_addresses) { local_routes.insert(asiotap::to_network_address(asiotap::to_ip_address(ip_address))); } m_local_routes_version = routes_message::version_type(); m_router.get_port(make_port_index(m_tap_adapter))->set_local_routes(local_routes); m_router.get_port(make_port_index(m_tap_adapter))->set_local_dns_servers(local_dns_servers); // Handle ICMPv6 neighbor solicitations. This is required for Windows. m_icmpv6_proxy.reset(new icmpv6_proxy_type()); m_icmpv6_proxy->set_neighbor_solicitation_callback(boost::bind(&core::do_handle_icmpv6_neighbor_solicitation, this, _1, _2)); // We don't need those proxies in TUN mode. m_arp_proxy.reset(); m_dhcp_proxy.reset(); } if (local_routes.empty()) { m_logger(fscp::log_level::information) << "Not advertising any routes."; } else { m_logger(fscp::log_level::information) << "Advertising the following routes: " << local_routes; } if (local_dns_servers.empty()) { m_logger(fscp::log_level::information) << "Not advertising any DNS servers."; } else { m_logger(fscp::log_level::information) << "Advertising the following DNS servers: " << local_dns_servers; } if (m_tap_adapter_up_callback) { m_tap_adapter_up_callback(*m_tap_adapter); } async_read_tap(); m_tap_adapter_thread = boost::thread([this](){ m_logger(fscp::log_level::information) << "Starting tap adapter's thread..."; m_tap_adapter_io_service.run(); m_logger(fscp::log_level::information) << "Tap adapter's thread is now stopped."; }); } else { m_tap_adapter.reset(); } } void core::close_tap_adapter() { // Clear the endpoint routes, if any. m_router_strand.post([this](){ m_client_router_info_map.clear(); }); m_dhcp_proxy.reset(); m_arp_proxy.reset(); m_icmpv6_proxy.reset(); m_tcp_mss_morpher.reset(); if (m_tap_adapter) { if (m_tap_adapter_down_callback) { m_tap_adapter_down_callback(*m_tap_adapter); } m_router_strand.post([this](){ m_switch.unregister_port(make_port_index(m_tap_adapter)); m_router.unregister_port(make_port_index(m_tap_adapter)); }); m_tap_adapter->cancel(); m_tap_adapter->set_connected_state(false); m_tap_adapter->close(); m_tap_adapter_thread.join(); } } void core::async_get_tap_addresses(ip_network_address_list_handler_type handler) { if (m_tap_adapter) { m_tap_adapter_io_service.post([this, handler](){ handler(m_tap_adapter->get_ip_addresses()); }); } else { handler(asiotap::ip_network_address_list {}); } } void core::async_read_tap() { m_tap_adapter_io_service.post(boost::bind(&core::do_read_tap, this)); } template void core::push_tap_write(const ConstBufferSequence& data, simple_handler_type handler) { // All push_tap_write() calls are done in the m_tap_adapter_io_service so the following is thread-safe. const auto write_call = [this, data, handler] () { m_tap_adapter->async_write(data, [this, handler] (const boost::system::error_code& ec, size_t) { pop_tap_write(); handler(ec); }); }; if (m_tap_write_queue.empty()) { // Nothing is being written, lets start the write immediately. write_call(); } // We need to push it always, even if it was called immediately as it // will be popped-out when the write ends and also serves as a marker // that a write is in progress. m_tap_write_queue.push(write_call); } void core::pop_tap_write() { // All pop_tap_write() calls are done in the m_tap_adapter_io_service so the following is thread-safe. m_tap_write_queue.pop(); if (!m_tap_write_queue.empty()) { m_tap_write_queue.front()(); } } void core::do_read_tap() { // All calls to do_read_tap() are done within the m_tap_adapter_io_service, so the following is safe. assert(m_tap_adapter); // Get either a new buffer or an old, recycled one if possible. const SharedBuffer receive_buffer = m_tap_adapter_buffers.empty() ? SharedBuffer(65536) : [this] () { const auto result = m_tap_adapter_buffers.front(); m_tap_adapter_buffers.pop_front(); return result; }(); m_tap_adapter->async_read( buffer(receive_buffer), boost::bind( &core::do_handle_tap_adapter_read, this, SharedBuffer(receive_buffer, [this](const SharedBuffer& buffer) { m_tap_adapter_io_service.post([this, buffer] () { m_tap_adapter_buffers.push_back(buffer); }); }), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred ) ); } void core::do_handle_tap_adapter_read(SharedBuffer receive_buffer, const boost::system::error_code& ec, size_t count) { // All calls to do_handle_tap_adapter_read() are done within the m_tap_adapter_io_service, so the following is safe. if (ec != boost::asio::error::operation_aborted) { // We try to read again, as soon as possible. do_read_tap(); } if (!ec) { const boost::asio::mutable_buffer data = buffer(receive_buffer, count); #ifdef FREELAN_DEBUG std::cerr << "Read " << buffer_size(data) << " byte(s) on " << *m_tap_adapter << std::endl; #endif bool handled = false; if (m_tap_adapter->layer() == asiotap::tap_adapter_layer::ethernet) { // This line will eventually call the filters callbacks and the mss morpher. m_ethernet_filter.parse(data); if (m_arp_proxy || m_dhcp_proxy) { if (m_arp_proxy && m_arp_filter.get_last_helper()) { handled = true; m_arp_filter.clear_last_helper(); } if (m_dhcp_proxy && m_dhcp_filter.get_last_helper()) { handled = true; m_dhcp_filter.clear_last_helper(); } } if (!handled) { async_write_switch( make_port_index(m_tap_adapter), data, make_shared_buffer_handler( receive_buffer, &null_switch_write_handler ) ); } } else { // This line will eventually call the filters callbacks and the mss override. m_tun_ipv6_filter.parse(data); if (m_icmpv6_proxy) { if (m_tun_icmpv6_filter.get_last_helper()) { // We don't want to catch ICMP echo requests or other stuff yet. handled = m_tun_icmpv6_filter.get_last_helper()->type() == asiotap::osi::ICMPV6_NEIGHBOR_SOLICITATION; m_tun_icmpv6_filter.clear_last_helper(); } } if (!handled) { // This is a TUN interface. We receive either IPv4 or IPv6 frames. async_write_router( make_port_index(m_tap_adapter), data, make_shared_buffer_handler( receive_buffer, &null_router_write_handler ) ); } } } else if (ec != boost::asio::error::operation_aborted) { m_logger(fscp::log_level::error) << "Read failed on " << m_tap_adapter->name() << ". Error: " << ec.message(); } } void core::do_handle_tap_adapter_write(const boost::system::error_code& ec) { if (ec) { if (ec != boost::asio::error::operation_aborted) { m_logger(fscp::log_level::warning) << "Write failed on " << m_tap_adapter->name() << ". Error: " << ec.message(); } } } void core::do_handle_arp_frame(const arp_helper_type& helper) { if (m_arp_proxy) { const auto response_buffer = SharedBuffer(2048); const boost::optional data = m_arp_proxy->process_frame( *m_arp_filter.parent().get_last_helper(), helper, buffer(response_buffer) ); if (data) { async_write_tap( buffer(*data), make_shared_buffer_handler( response_buffer, boost::bind( &core::do_handle_tap_adapter_write, this, boost::asio::placeholders::error ) ) ); } } } void core::do_handle_dhcp_frame(const dhcp_helper_type& helper) { if (m_dhcp_proxy) { const auto response_buffer = SharedBuffer(2048); const boost::optional data = m_dhcp_proxy->process_frame( *m_dhcp_filter.parent().parent().parent().parent().get_last_helper(), *m_dhcp_filter.parent().parent().parent().get_last_helper(), *m_dhcp_filter.parent().parent().get_last_helper(), *m_dhcp_filter.parent().get_last_helper(), helper, buffer(response_buffer) ); if (data) { async_write_tap( buffer(*data), make_shared_buffer_handler( response_buffer, boost::bind( &core::do_handle_tap_adapter_write, this, boost::asio::placeholders::error ) ) ); } } } void core::do_handle_icmpv6_frame(const icmpv6_helper_type& helper) { if (m_icmpv6_proxy) { const auto response_buffer = SharedBuffer(2048); const boost::optional data = m_icmpv6_proxy->process_frame( *m_tun_icmpv6_filter.parent().get_last_helper(), helper, buffer(response_buffer) ); if (data) { async_write_tap( buffer(*data), make_shared_buffer_handler( response_buffer, boost::bind( &core::do_handle_tap_adapter_write, this, boost::asio::placeholders::error ) ) ); } } } bool core::do_handle_arp_request(const boost::asio::ip::address_v4& logical_address, ethernet_address_type& ethernet_address) { if (!m_configuration.tap_adapter.ipv4_address_prefix_length.is_null()) { if (logical_address != m_configuration.tap_adapter.ipv4_address_prefix_length.address()) { ethernet_address = m_configuration.tap_adapter.arp_proxy_fake_ethernet_address; return true; } } return false; } bool core::do_handle_icmpv6_neighbor_solicitation(const boost::asio::ip::address_v6& logical_address, ethernet_address_type& ethernet_address) { if (!m_configuration.tap_adapter.ipv6_address_prefix_length.is_null()) { if (logical_address != m_configuration.tap_adapter.ipv6_address_prefix_length.address()) { ethernet_address = m_configuration.tap_adapter.arp_proxy_fake_ethernet_address; return true; } } return false; } void core::do_register_switch_port(const ep_type& host, void_handler_type handler) { // All calls to do_register_switch_port() are done within the m_router_strand, so the following is safe. m_switch.register_port(make_port_index(host), switch_::port_type(boost::bind(&fscp::server::async_send_data, m_fscp_server, host, fscp::CHANNEL_NUMBER_0, _1, _2), ENDPOINTS_GROUP)); if (handler) { handler(); } } void core::do_unregister_switch_port(const ep_type& host, void_handler_type handler) { // All calls to do_unregister_switch_port() are done within the m_router_strand, so the following is safe. m_switch.unregister_port(make_port_index(host)); if (handler) { handler(); } } void core::do_register_router_port(const ep_type& host, void_handler_type handler) { // All calls to do_register_router_port() are done within the m_router_strand, so the following is safe. m_router.register_port(make_port_index(host), router::port_type(boost::bind(&fscp::server::async_send_data, m_fscp_server, host, fscp::CHANNEL_NUMBER_0, _1, _2), ENDPOINTS_GROUP)); if (handler) { handler(); } } void core::do_unregister_router_port(const ep_type& host, void_handler_type handler) { // All calls to do_unregister_router_port() are done within the m_router_strand, so the following is safe. m_router.unregister_port(make_port_index(host)); if (handler) { handler(); } } void core::do_save_system_route(const ep_type& host, const route_type& route, void_handler_type handler) { // All calls to do_save_system_route() are done within the m_router_strand, so the following is safe. client_router_info_type& client_router_info = m_client_router_info_map[host]; client_router_info.saved_system_route = m_route_manager.get_route_entry(route); if (handler) { handler(); } } void core::do_clear_client_router_info(const ep_type& host, void_handler_type handler) { // All calls to do_clear_client_router_info() are done within the m_router_strand, so the following is safe. // This clears the routes, if any. m_client_router_info_map.erase(host); if (handler) { handler(); } } void core::do_write_switch(const port_index_type& index, boost::asio::const_buffer data, switch_::multi_write_handler_type handler) { // All calls to do_write_switch() are done within the m_router_strand, so the following is safe. m_switch.async_write(index, data, handler); } void core::do_write_router(const port_index_type& index, boost::asio::const_buffer data, router::port_type::write_handler_type handler) { // All calls to do_write_router() are done within the m_router_strand, so the following is safe. m_router.async_write(index, data, handler); } void core::open_web_server() { if (m_configuration.server.enabled) { if (m_configuration.server.protocol == server_configuration::server_protocol_type::https) { bool generated = false; if (!m_configuration.server.server_private_key) { m_logger(fscp::log_level::warning) << "No private key set for the web server. Generating a temporary one..."; m_configuration.server.server_private_key = generate_private_key(); generated = true; } if (!m_configuration.server.server_certificate) { m_logger(fscp::log_level::warning) << "No certificate set for the web server. Generating a temporary one..."; m_configuration.server.server_certificate = generate_self_signed_certificate(m_configuration.server.server_private_key); generated = true; } if (generated) { m_logger(fscp::log_level::warning) << "Using a dynamically generated certificate/private key for the web server will force web clients to disable peer verification. Is this what you really want ?"; } } // CA certificate check. { bool generated = false; if (!m_configuration.server.certification_authority_private_key) { m_logger(fscp::log_level::warning) << "No private key set for the web server's CA. Generating a temporary one..."; m_configuration.server.certification_authority_private_key = generate_private_key(); generated = true; } if (!m_configuration.server.certification_authority_certificate) { m_logger(fscp::log_level::warning) << "No certificate set for the web server's CA. Generating a temporary one..."; m_configuration.server.certification_authority_certificate = generate_self_signed_certificate(m_configuration.server.certification_authority_private_key); generated = true; } if (generated) { m_logger(fscp::log_level::warning) << "Using a dynamically generated certificate/private key for the web server's CA will cause the session lifecycle to be tied to the one of the server."; } } m_web_server = boost::make_shared(m_logger, m_configuration.server, m_authentication_callback); m_logger(fscp::log_level::information) << "Starting " << m_configuration.server.protocol << " web server on " << m_configuration.server.listen_on << "..."; m_web_server_thread = boost::thread([this](){ m_web_server->run(); }); m_logger(fscp::log_level::information) << "Web server started."; } } void core::close_web_server() { if (m_web_server) { m_logger(fscp::log_level::information) << "Closing web server..."; m_web_server->stop(); m_web_server_thread.join(); m_web_server.reset(); m_logger(fscp::log_level::information) << "Web server closed."; } } void core::open_web_client() { if (m_configuration.client.enabled) { m_logger(fscp::log_level::information) << "Starting web client to contact web server at " << m_configuration.client.protocol << "://" << m_configuration.client.server_endpoint << "..."; m_web_client = web_client::create(m_io_service, m_logger, m_configuration.client); m_logger(fscp::log_level::information) << "Web client started."; if (!m_configuration.security.identity) { m_logger(fscp::log_level::information) << "No user or private key set. Requesting one from web server..."; request_certificate(); } else { m_logger(fscp::log_level::information) << "Registering onto the server..."; register_(); } request_ca_certificate(); } } void core::close_web_client() { if (m_web_client) { m_logger(fscp::log_level::information) << "Closing web client..."; unregister(); m_request_certificate.timer.cancel(); m_request_ca_certificate.timer.cancel(); m_renew_certificate_timer.cancel(); m_registration_retry.timer.cancel(); m_set_contact_information_retry.timer.cancel(); m_get_contact_information_retry.timer.cancel(); m_web_client.reset(); m_logger(fscp::log_level::information) << "Web client closed."; } } void core::request_certificate() { if (m_web_client) { m_logger(fscp::log_level::information) << "Requesting a client certificate from the web server..."; const auto private_key = generate_private_key(); const auto certificate_request = generate_certificate_request(private_key); m_web_client->request_certificate(certificate_request, [this, private_key](const boost::system::error_code& ec, cryptoplus::x509::certificate certificate) { if (ec) { if (m_web_client) { m_logger(fscp::log_level::error) << "The certificate request to the web server failed: " << ec.message() << " (" << ec << "). Retrying in " << m_request_certificate.period << "..."; m_request_certificate.exponential_backoff(); m_request_certificate.timer.async_wait([this](const boost::system::error_code& ec2) { if (ec2 != boost::asio::error::operation_aborted) { request_certificate(); } }); } else { m_logger(fscp::log_level::error) << "The certificate request to the web server failed: " << ec.message() << " (" << ec << "). Not retrying as the web client was shut down."; } } else { m_request_certificate.reset(); m_logger(fscp::log_level::information) << "Received certificate from server: " << certificate.subject(); m_configuration.security.identity = fscp::identity_store(certificate, private_key); if (m_fscp_server) { m_fscp_server->async_set_identity(*m_configuration.security.identity, [this]() { m_logger(fscp::log_level::important) << "Renewed identity. Existing connections will be reset."; }); } else { open_fscp_server(); } const auto renew_timestamp = certificate.not_after().to_ptime() - RENEW_CERTIFICATE_WARNING_PERIOD; m_logger(fscp::log_level::information) << "Certificate expires on " << local_adjustor::utc_to_local(certificate.not_after().to_ptime()) << ". Renewing on " << local_adjustor::utc_to_local(renew_timestamp) << "."; m_renew_certificate_timer.expires_at(renew_timestamp); m_renew_certificate_timer.async_wait([this](const boost::system::error_code& ec2) { if (ec2 != boost::asio::error::operation_aborted) { request_certificate(); } }); m_logger(fscp::log_level::information) << "Registering to the server..."; register_(); } }); } else { m_logger(fscp::log_level::information) << "Not requesting a client certificate from the web server as the web client was shut down."; } } void core::request_ca_certificate() { if (m_web_client) { m_logger(fscp::log_level::information) << "Requesting the CA certificate from the web server..."; m_web_client->request_ca_certificate([this](const boost::system::error_code& ec, cryptoplus::x509::certificate certificate) { if (ec) { if (m_web_client) { m_logger(fscp::log_level::error) << "The CA certificate request to the web server failed: " << ec.message() << " (" << ec << "). Retrying in " << m_request_ca_certificate.period << "..."; m_request_ca_certificate.exponential_backoff(); m_request_ca_certificate.timer.async_wait([this](const boost::system::error_code& ec2) { if (ec2 != boost::asio::error::operation_aborted) { request_ca_certificate(); } }); } else { m_logger(fscp::log_level::error) << "The CA certificate request to the web server failed: " << ec.message() << " (" << ec << "). Not retrying as the web client was shut down."; } } else { m_request_ca_certificate.reset(); m_logger(fscp::log_level::information) << "Received CA certificate from server: " << certificate.subject(); m_client_certificate_authority_list.clear(); m_client_certificate_authority_list.push_back(certificate); build_ca_store(build_ca_store_when::always); } }); } else { m_logger(fscp::log_level::information) << "Not requesting the CA certificate from the web server as the web client was shut down."; } } void core::register_() { if (m_web_client) { if (!m_configuration.security.identity) { if (m_web_client) { m_logger(fscp::log_level::warning) << "Cannot register onto the web server right now as no identity is currently set. Retrying in " << m_registration_retry.period << "..."; m_registration_retry.exponential_backoff(); m_registration_retry.timer.async_wait([this](const boost::system::error_code& ec2) { if (ec2 != boost::asio::error::operation_aborted) { register_(); } }); } else { m_logger(fscp::log_level::warning) << "Cannot register onto the web server right now as no identity is currently set. Won't retry as the web client was shut down."; } } else { m_logger(fscp::log_level::information) << "Registering at the web server..."; m_web_client->register_(m_configuration.security.identity->signature_certificate(), [this](const boost::system::error_code& ec, const boost::posix_time::ptime& expiration_timestamp) { if (ec) { if (m_web_client) { m_logger(fscp::log_level::error) << "The registration onto the web server failed: " << ec.message() << " (" << ec << "). Retrying in " << m_registration_retry.period << "..."; m_registration_retry.exponential_backoff(); m_registration_retry.timer.async_wait([this](const boost::system::error_code& ec2) { if (ec2 != boost::asio::error::operation_aborted) { register_(); } }); } else { m_logger(fscp::log_level::error) << "The registration onto the web server failed: " << ec.message() << " (" << ec << "). Not retrying as the web client was shut down."; } } else { const auto local_expiration_timestamp = local_adjustor::utc_to_local(expiration_timestamp); if (m_web_client) { m_registration_retry.reset(); const auto registration_update_timestamp = expiration_timestamp - REGISTRATION_WARNING_PERIOD; const auto local_registration_update_timestamp = local_adjustor::utc_to_local(registration_update_timestamp); m_logger(fscp::log_level::information) << "Registered onto the web server until " << local_expiration_timestamp << ". Registration update planned at " << local_registration_update_timestamp << "."; m_registration_retry.timer.expires_at(registration_update_timestamp); m_registration_retry.timer.async_wait([this](const boost::system::error_code& ec2) { if (ec2 != boost::asio::error::operation_aborted) { register_(); } }); set_contact_information(); get_contact_information(); } else { m_logger(fscp::log_level::information) << "Registered onto the web server until " << local_expiration_timestamp << ". However, no registration update was planned as the web client was shut down already."; } } }); } } else { m_logger(fscp::log_level::information) << "Not registering at the web server as the web client was shut down."; } } void core::unregister() { if (m_web_client) { m_logger(fscp::log_level::information) << "Unregistering from the web server..."; m_web_client->unregister([this](const boost::system::error_code& ec) { if (ec) { m_logger(fscp::log_level::error) << "The unregistration from the web server failed: " << ec.message() << " (" << ec << "). Not retrying to avoid delaying shutdown."; } else { m_logger(fscp::log_level::information) << "Unregistered from the web server."; } }); } else { m_logger(fscp::log_level::information) << "Not unregistering from the web server as the web client was shut down."; } } void core::set_contact_information() { if (m_web_client) { m_logger(fscp::log_level::information) << "Setting contact information on the web server..."; if (!m_fscp_server) { m_logger(fscp::log_level::warning) << "Cannot set contact information right now as the FSCP server is not started yet."; m_set_contact_information_retry.exponential_backoff(); m_set_contact_information_retry.timer.async_wait([this](const boost::system::error_code& ec2) { if (ec2 != boost::asio::error::operation_aborted) { set_contact_information(); } }); } else { const auto local_port = m_fscp_server->get_socket().local_endpoint().port(); std::set public_endpoints; for (auto&& public_endpoint : m_configuration.client.public_endpoint_list) { public_endpoints.insert(asiotap::get_default_port_endpoint(public_endpoint, local_port)); } if (public_endpoints.empty()) { m_logger(fscp::log_level::information) << "Setting contact information on the web server with no public endpoints..."; } else { std::ostringstream oss; for (auto&& endpoint : public_endpoints) { if (!oss.str().empty()) { oss << ", "; } oss << endpoint; } m_logger(fscp::log_level::information) << "Setting contact information on the web server with " << public_endpoints.size() << " public endpoint(s) (" << oss.str() << ")..."; } m_web_client->set_contact_information(public_endpoints, [this](const boost::system::error_code& ec, const std::set& accepted_endpoints, const std::set& rejected_endpoints) { if (ec) { m_logger(fscp::log_level::error) << "Failed to set contact information on the web server: " << ec.message() << " (" << ec << ")."; m_set_contact_information_retry.exponential_backoff(); m_set_contact_information_retry.timer.async_wait([this](const boost::system::error_code& ec2) { if (ec2 != boost::asio::error::operation_aborted) { set_contact_information(); } }); } else { m_set_contact_information_retry.reset(); m_logger(fscp::log_level::information) << "The web server acknowledged our contact information."; if (accepted_endpoints.empty()) { m_logger(fscp::log_level::information) << "No public endpoints will be advertised."; } else { std::ostringstream oss; for (auto&& endpoint : accepted_endpoints) { if (!oss.str().empty()) { oss << ", "; } oss << endpoint; } m_logger(fscp::log_level::information) << "Server will advertise the following endpoints: " << oss.str(); } if (!rejected_endpoints.empty()) { std::ostringstream oss; for (auto&& endpoint : rejected_endpoints) { if (!oss.str().empty()) { oss << ", "; } oss << endpoint; } m_logger(fscp::log_level::warning) << "Server refused to advertise the following endpoints: " << oss.str(); } } }); } } else { m_logger(fscp::log_level::information) << "Not setting contact information on the web server as the web client was shut down."; } } void core::get_contact_information() { if (m_web_client) { if (!m_fscp_server) { m_logger(fscp::log_level::warning) << "Cannot get contact information right now as the FSCP server is not started yet."; m_get_contact_information_retry.exponential_backoff(); m_get_contact_information_retry.timer.async_wait([this](const boost::system::error_code& ec2) { if (ec2 != boost::asio::error::operation_aborted) { get_contact_information(); } }); } else { m_logger(fscp::log_level::information) << "Getting contact information from the web server..."; // The requested contacts list is empty, meaning we want them all. std::set requested_contacts; m_web_client->get_contact_information(requested_contacts, [this](const boost::system::error_code& ec, const std::map>& contacts) { if (ec) { m_logger(fscp::log_level::error) << "Failed to get contact information from the web server: " << ec.message() << " (" << ec << ")."; m_get_contact_information_retry.exponential_backoff(); m_get_contact_information_retry.timer.async_wait([this](const boost::system::error_code& ec2) { if (ec2 != boost::asio::error::operation_aborted) { get_contact_information(); } }); } else { // We got contact information lets trigger an update later. m_get_contact_information_retry.reset(); m_get_contact_information_retry.timer.expires_from_now(GET_CONTACT_INFORMATION_UPDATE_PERIOD); m_get_contact_information_retry.timer.async_wait([this](const boost::system::error_code& ec2) { if (ec2 != boost::asio::error::operation_aborted) { get_contact_information(); } }); m_logger(fscp::log_level::information) << "The web server replied to our contact information request."; if (contacts.empty()) { m_logger(fscp::log_level::information) << "No contacts were provided."; } else { for (auto&& contact : contacts) { std::ostringstream oss; for (auto&& endpoint : contact.second) { async_contact(endpoint); if (!oss.str().empty()) { oss << ", "; } oss << endpoint; } m_logger(fscp::log_level::information) << "Contact information for " << contact.first << ": " << oss.str(); } } } }); } } else { m_logger(fscp::log_level::information) << "Not getting contact information from the web server as the web client was shut down."; } } void freelan::core::timer_period::exponential_backoff() { timer.expires_from_now(period); exponential_backoff_value(period, min, max); } asiotap::ip_route_set core::translate_ip_routes(const std::set& routes) const { boost::optional ipv4_gateway; boost::optional ipv6_gateway; if (!m_configuration.tap_adapter.ipv4_address_prefix_length.is_null()) { ipv4_gateway = m_configuration.tap_adapter.ipv4_address_prefix_length.address(); } if (!m_configuration.tap_adapter.ipv4_address_prefix_length.is_null()) { ipv6_gateway = m_configuration.tap_adapter.ipv6_address_prefix_length.address(); } const auto ipv4_default_route = asiotap::ipv4_route(asiotap::ipv4_network_address::any(), ipv4_gateway); const auto ipv6_default_route = asiotap::ipv6_route(asiotap::ipv6_network_address::any(), ipv6_gateway); return to_ip_routes(routes, ipv4_default_route, ipv6_default_route); } } freelan-2.0/libs/freelan/src/curl.cpp000066400000000000000000000514001252300335000175650ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file curl.cpp * \author Julien KAUFFMANN * \brief The curl structures and functions. */ #include "curl.hpp" #include #include #include #include #include "curl_error.hpp" namespace freelan { namespace { void throw_if_curl_error(CURLcode errorcode) { if (errorcode != CURLE_OK) { throw boost::system::system_error(make_error_code(errorcode)); } } void throw_if_curlm_error(CURLMcode errorcode) { if (errorcode != CURLM_OK) { throw boost::system::system_error(make_error_code(errorcode)); } } } curl_list::curl_list() : m_slist(nullptr, [](curl_slist* p){ if (p) { curl_slist_free_all(p); }}) { } void curl_list::append(const std::string& value) { struct curl_slist* const new_slist = curl_slist_append(m_slist.get(), value.c_str()); if (!new_slist) { throw std::runtime_error("Unable to append a value to the list"); } m_slist.reset(new_slist); } void curl_list::reset() { m_slist.reset(); } struct curl_slist* curl_list::raw() const { return m_slist.get(); } curl::curl() : m_curl(curl_easy_init(), [] (CURL* p) { if (p) curl_easy_cleanup(p); }), m_debug_function() { if (!m_curl) { throw std::runtime_error("Unable to allocate a CURL structure"); } set_write_function(&curl::default_write_function); set_connect_timeout(boost::posix_time::seconds(15)); } void curl::set_option(CURLoption option, void* value) { throw_if_curl_error(curl_easy_setopt(m_curl.get(), option, value)); } void curl::set_option(CURLoption option, long int value) { throw_if_curl_error(curl_easy_setopt(m_curl.get(), option, value)); } void curl::set_option(CURLoption option, curl_debug_callback value) { throw_if_curl_error(curl_easy_setopt(m_curl.get(), option, value)); } void curl::set_option(CURLoption option, curl_write_callback value) { throw_if_curl_error(curl_easy_setopt(m_curl.get(), option, value)); } void curl::set_option(CURLoption option, curl_open_socket_callback value) { throw_if_curl_error(curl_easy_setopt(m_curl.get(), option, value)); } void curl::set_option(CURLoption option, curl_close_socket_callback value) { throw_if_curl_error(curl_easy_setopt(m_curl.get(), option, value)); } void curl::set_proxy(const asiotap::endpoint& proxy) { if (proxy != asiotap::hostname_endpoint::null()) { set_option(CURLOPT_PROXY, static_cast(boost::lexical_cast(proxy).c_str())); } else { set_option(CURLOPT_PROXY, static_cast(NULL)); } } void curl::set_debug_function(debug_function_t func) { m_debug_function = func; if (m_debug_function) { set_option(CURLOPT_DEBUGFUNCTION, &curl::debug_function); set_option(CURLOPT_DEBUGDATA, &m_debug_function); } else { set_option(CURLOPT_DEBUGFUNCTION, static_cast(NULL)); set_option(CURLOPT_DEBUGDATA, static_cast(NULL)); } } void curl::set_write_function(write_function_t func) { m_write_function = func; if (m_write_function) { set_option(CURLOPT_WRITEFUNCTION, &curl::write_function); set_option(CURLOPT_WRITEDATA, &m_write_function); } else { set_option(CURLOPT_WRITEFUNCTION, static_cast(NULL)); set_option(CURLOPT_WRITEDATA, static_cast(NULL)); } } void curl::set_user_agent(const std::string& user_agent) { set_option(CURLOPT_USERAGENT, static_cast(user_agent.c_str())); } void curl::set_url(const std::string& url) { set_option(CURLOPT_URL, static_cast(url.c_str())); } void curl::set_ssl_peer_verification(bool state) { set_option(CURLOPT_SSL_VERIFYPEER, state ? 1L : 0L); } void curl::set_ssl_host_verification(bool state) { set_option(CURLOPT_SSL_VERIFYHOST, state ? 2L : 0L); } void curl::set_ca_info(const boost::filesystem::path& ca_info) { if (ca_info.empty()) { set_option(CURLOPT_CAINFO, static_cast(NULL)); } else { set_option(CURLOPT_CAINFO, static_cast(ca_info.string().c_str())); } } void curl::set_connect_timeout(const boost::posix_time::time_duration& timeout) { set_option(CURLOPT_CONNECTTIMEOUT_MS, static_cast(timeout.total_milliseconds())); } void curl::set_timeout(const boost::posix_time::time_duration& timeout) { set_option(CURLOPT_TIMEOUT_MS, static_cast(timeout.total_milliseconds())); } void curl::set_http_header(const std::string& header, const std::string& value) { m_http_headers.append(header + ": " + value); set_option(CURLOPT_HTTPHEADER, static_cast(m_http_headers.raw())); } void curl::unset_http_header(const std::string& header) { m_http_headers.append(header + ":"); set_option(CURLOPT_HTTPHEADER, static_cast(m_http_headers.raw())); } void curl::reset_http_headers() { m_http_headers = curl_list(); set_option(CURLOPT_HTTPHEADER, static_cast(m_http_headers.raw())); } void curl::set_get() { set_option(CURLOPT_HTTPGET, 1L); } void curl::set_post() { set_option(CURLOPT_POST, 1L); } void curl::set_post_fields(boost::asio::const_buffer buf) { set_option(CURLOPT_POSTFIELDSIZE_LARGE, static_cast(boost::asio::buffer_size(buf))); set_option(CURLOPT_POSTFIELDS, boost::asio::buffer_cast(buf)); } void curl::set_copy_post_fields(boost::asio::const_buffer buf) { set_option(CURLOPT_POSTFIELDSIZE_LARGE, static_cast(boost::asio::buffer_size(buf))); set_option(CURLOPT_COPYPOSTFIELDS, boost::asio::buffer_cast(buf)); } void curl::set_cookie_file(const std::string& file) { set_option(CURLOPT_COOKIEFILE, file.c_str()); } void curl::enable_cookie_support() { set_cookie_file(""); } void curl::set_username(const std::string& username) { set_option(CURLOPT_USERNAME, username.c_str()); } void curl::set_password(const std::string& password) { set_option(CURLOPT_PASSWORD, password.c_str()); } std::string curl::escape(const std::string& url) { char* rstr = curl_easy_escape(m_curl.get(), url.c_str(), static_cast(url.size())); if (!rstr) { throw std::bad_alloc(); } boost::shared_ptr str(rstr, curl_free); return std::string(str.get()); } std::string curl::unescape(const std::string& encoded) { int len = 0; char* rstr = curl_easy_unescape(m_curl.get(), encoded.c_str(), static_cast(encoded.size()), &len); if (!rstr) { throw std::bad_alloc(); } boost::shared_ptr str(rstr, curl_free); return std::string(str.get(), static_cast(len)); } void curl::perform() { throw_if_curl_error(curl_easy_perform(m_curl.get())); } std::string curl::get_effective_url() { char* effective_url = NULL; throw_if_curl_error(curl_easy_getinfo(m_curl.get(), CURLINFO_EFFECTIVE_URL, &effective_url)); return effective_url ? effective_url : ""; } long curl::get_response_code() { long response_code = 0; throw_if_curl_error(curl_easy_getinfo(m_curl.get(), CURLINFO_RESPONSE_CODE, &response_code)); return response_code; } ptrdiff_t curl::get_content_length_download() { double content_length = 0.0; throw_if_curl_error(curl_easy_getinfo(m_curl.get(), CURLINFO_CONTENT_LENGTH_DOWNLOAD, &content_length)); return (content_length >= 0) ? static_cast(content_length) : -1; } ptrdiff_t curl::get_content_length_upload() { double content_length = 0.0; throw_if_curl_error(curl_easy_getinfo(m_curl.get(), CURLINFO_CONTENT_LENGTH_UPLOAD, &content_length)); return (content_length >= 0) ? static_cast(content_length) : -1; } std::string curl::get_content_type() { char* content_type = NULL; throw_if_curl_error(curl_easy_getinfo(m_curl.get(), CURLINFO_CONTENT_TYPE, &content_type)); return content_type ? content_type : ""; } boost::system::error_code curl::get_system_error() { if (get_response_code() == 0) { long error = 0; throw_if_curl_error(curl_easy_getinfo(m_curl.get(), CURLINFO_OS_ERRNO, &error)); return boost::system::error_code(error, boost::system::system_category()); } return boost::system::error_code(); } int curl::debug_function(CURL*, curl_infotype infotype, char* data, size_t datalen, void* context) { assert(context); debug_function_t& func = *static_cast(context); func(infotype, boost::asio::buffer(data, datalen)); return 0; } size_t curl::write_function(char* data, size_t size, size_t nmemb, void* context) { assert(context); write_function_t& func = *static_cast(context); return func(boost::asio::buffer(data, size * nmemb)); } void curl_multi::add_handle(boost::shared_ptr handle) { const auto self = shared_from_this(); assert(self); m_associations[handle->raw()] = std::unique_ptr(new curl_association(self, handle)); } boost::shared_ptr curl_multi::get_handle(CURL* easy_handle) const { const auto it = m_associations.find(easy_handle); return (it != m_associations.end()) ? it->second->get_curl() : boost::shared_ptr(); } boost::shared_ptr curl_multi::remove_handle(CURL* easy_handle) { boost::shared_ptr result; const auto it = m_associations.find(easy_handle); if (it != m_associations.end()) { result = it->second->get_curl(); m_associations.erase(it); } return result; } std::vector> curl_multi::clear() { std::vector> result; for (auto&& pair : m_associations) { result.push_back(pair.second->get_curl()); } m_associations.clear(); return result; } void curl_multi::set_option(CURLMoption option, void* value) { throw_if_curlm_error(curl_multi_setopt(m_curlm.get(), option, value)); } void curl_multi::set_option(CURLMoption option, long int value) { set_option(option, &value); } void curl_multi::set_option(CURLMoption option, curl_multi_timer_callback value) { throw_if_curlm_error(curl_multi_setopt(m_curlm.get(), option, value)); } void curl_multi::set_option(CURLMoption option, curl_socket_callback value) { throw_if_curlm_error(curl_multi_setopt(m_curlm.get(), option, value)); } void curl_multi::socket_action(curl_socket_t sockfd, int ev_bitmask, int* running_handles) { throw_if_curlm_error(curl_multi_socket_action(m_curlm.get(), sockfd, ev_bitmask, running_handles)); } CURLMsg* curl_multi::info_read(int* count_left) { int local_counter = 0; if (!count_left) { count_left = &local_counter; } return curl_multi_info_read(m_curlm.get(), count_left); } curl_multi::curl_multi() : m_curlm(curl_multi_init(), [](CURLM* p){ if (p) curl_multi_cleanup(p); }) { if (!m_curlm) { throw std::runtime_error("Unable to allocate a CURLM structure"); } } curl_association::curl_association(boost::shared_ptr _curl_multi, boost::shared_ptr _curl) : m_curl_multi(_curl_multi), m_curl(_curl) { assert(m_curl_multi); assert(m_curl); m_curl_multi->before_associate_handle(m_curl); throw_if_curlm_error(::curl_multi_add_handle(m_curl_multi->raw(), m_curl->raw())); m_curl_multi->after_associate_handle(m_curl); } curl_association::~curl_association() { m_curl_multi->before_disassociate_handle(m_curl); throw_if_curlm_error(::curl_multi_remove_handle(m_curl_multi->raw(), m_curl->raw())); m_curl_multi->after_disassociate_handle(m_curl); } curl_multi_asio::~curl_multi_asio() { // Some sockets might still be in use: we need to close them explicitely // while it is still valid to access the close_socket_callback(). int running_handles = 0; for (auto&& pair : m_socket_map) { socket_action(pair.second->native_handle(), CURL_POLL_REMOVE, &running_handles); } check_info(); m_socket_map.clear(); set_option(CURLMOPT_SOCKETDATA, static_cast(nullptr)); set_option(CURLMOPT_SOCKETFUNCTION, static_cast(nullptr)); set_option(CURLMOPT_TIMERDATA, static_cast(nullptr)); set_option(CURLMOPT_TIMERFUNCTION, static_cast(nullptr)); } void curl_multi_asio::execute(boost::shared_ptr handle, connection_complete_callback handler) { const auto self = shared_from_this(); assert(self); m_strand.post([self, handle, handler] () { self->add_handle(handle); self->m_handler_map[handle] = handler; self->m_result_map.erase(handle); }); } void curl_multi_asio::async_clear(boost::function handler) { const auto self = shared_from_this(); assert(self); m_strand.post([self, handler] () { self->clear(); if (handler) { handler(); } }); } void curl_multi_asio::before_associate_handle(boost::shared_ptr handle) { handle->set_option(CURLOPT_OPENSOCKETFUNCTION, &curl_multi_asio::open_socket_callback); handle->set_option(CURLOPT_OPENSOCKETDATA, this); handle->set_option(CURLOPT_CLOSESOCKETFUNCTION, &curl_multi_asio::close_socket_callback); handle->set_option(CURLOPT_CLOSESOCKETDATA, this); } void curl_multi_asio::after_disassociate_handle(boost::shared_ptr handle) { const auto handler_it = m_handler_map.find(handle); if (handler_it != m_handler_map.end()) { const auto handler = handler_it->second; if (handler) { const auto result_it = m_result_map.find(handle); if (result_it != m_result_map.end()) { const auto system_error = handle->get_system_error(); if (system_error) { m_io_service.post(boost::bind(handler, system_error)); } else { m_io_service.post(boost::bind(handler, make_error_code(result_it->second))); } } else { m_io_service.post(boost::bind(handler, boost::asio::error::operation_aborted)); } } m_handler_map.erase(handler_it); } handle->set_option(CURLOPT_CLOSESOCKETDATA, static_cast(nullptr)); handle->set_option(CURLOPT_CLOSESOCKETFUNCTION, static_cast(nullptr)); handle->set_option(CURLOPT_OPENSOCKETDATA, static_cast(nullptr)); handle->set_option(CURLOPT_OPENSOCKETFUNCTION, static_cast(nullptr)); } void curl_multi_asio::curl_socket::trigger(curl_multi_asio& _curl_multi_asio) { if ((m_current_action & CURL_POLL_IN) != 0) { trigger_read(_curl_multi_asio); } if ((m_current_action & CURL_POLL_OUT) != 0) { trigger_write(_curl_multi_asio); } } void curl_multi_asio::curl_socket::trigger_read(curl_multi_asio& _curl_multi_asio) { if (!m_read_operation_pending) { m_read_operation_pending = true; const auto self = shared_from_this(); const auto cm_self = _curl_multi_asio.shared_from_this(); assert(self); assert(cm_self); const auto handler = boost::bind(&curl_multi_asio::socket_callback, cm_self, _1, self); async_read_some( boost::asio::null_buffers(), _curl_multi_asio.m_strand.wrap([self, handler] (const boost::system::error_code& ec, size_t) { self->m_read_operation_pending = false; handler(ec); }) ); } } void curl_multi_asio::curl_socket::trigger_write(curl_multi_asio& _curl_multi_asio) { if (!m_write_operation_pending) { m_write_operation_pending = true; const auto self = shared_from_this(); const auto cm_self = _curl_multi_asio.shared_from_this(); assert(self); assert(cm_self); const auto handler = boost::bind(&curl_multi_asio::socket_callback, cm_self, _1, self); async_write_some( boost::asio::null_buffers(), _curl_multi_asio.m_strand.wrap([self, handler] (const boost::system::error_code& ec, size_t) { self->m_write_operation_pending = false; handler(ec); }) ); } } int curl_multi_asio::static_timer_callback(CURLM*, long timeout_ms, void* _curl_multi_asio) { assert(_curl_multi_asio); curl_multi_asio& pself = *static_cast(_curl_multi_asio); pself.m_timer.cancel(); const auto self = pself.shared_from_this(); assert(self); if (timeout_ms > 0) { pself.m_timer.expires_from_now(boost::posix_time::millisec(timeout_ms)); pself.m_timer.async_wait(pself.m_strand.wrap(boost::bind(&curl_multi_asio::timer_callback, self, _1))); } else { pself.m_strand.post(boost::bind(&curl_multi_asio::timer_callback, self, boost::system::error_code())); } return 0; } int curl_multi_asio::static_socket_callback(CURL*, curl_socket_t socket_fd, int action, void* _curl_multi_asio, void*) { // This method is always called in the strand. assert(_curl_multi_asio); curl_multi_asio& self = *static_cast(_curl_multi_asio); const auto socket_it = self.m_socket_map.find(socket_fd); if (socket_it != self.m_socket_map.end()) { const auto socket = socket_it->second; socket->set_current_action(action); switch (action) { case CURL_POLL_REMOVE: { socket->cancel(); break; } case CURL_POLL_IN: case CURL_POLL_OUT: case CURL_POLL_INOUT: { socket->trigger(self); break; } } } return 0; } curl_socket_t curl_multi_asio::open_socket_callback(void* _curl_multi_asio, curlsocktype purpose, struct curl_sockaddr* address) { assert(_curl_multi_asio); curl_multi_asio& self = *static_cast(_curl_multi_asio); if ((purpose == CURLSOCKTYPE_IPCXN) && ((address->family == AF_INET) || (address->family == AF_INET6))) { const auto socket = curl_socket::create( self.m_io_service, (address->family == AF_INET) ? boost::asio::ip::tcp::v4() : boost::asio::ip::tcp::v6() ); const curl_socket_t socket_fd = socket->native_handle(); self.m_socket_map[socket_fd] = socket; return socket_fd; } return CURL_SOCKET_BAD; } int curl_multi_asio::close_socket_callback(void* _curl_multi_asio, curl_socket_t socket_fd) { assert(_curl_multi_asio); curl_multi_asio& self = *static_cast(_curl_multi_asio); self.m_socket_map.erase(socket_fd); return 0; } curl_multi_asio::curl_multi_asio(boost::asio::io_service& io_service) : m_io_service(io_service), m_strand(m_io_service), m_timer(m_io_service) { set_option(CURLMOPT_TIMERFUNCTION, &curl_multi_asio::static_timer_callback); set_option(CURLMOPT_TIMERDATA, this); set_option(CURLMOPT_SOCKETFUNCTION, &curl_multi_asio::static_socket_callback); set_option(CURLMOPT_SOCKETDATA, this); } void curl_multi_asio::timer_callback(const boost::system::error_code& ec) { if (!ec) { int running_handles = 0; socket_action(CURL_SOCKET_TIMEOUT, 0, &running_handles); check_info(); } } void curl_multi_asio::socket_callback(const boost::system::error_code& ec, boost::shared_ptr socket) { if (!ec) { int running_handles = 0; // This will likely cause static_socket_callback to be called synchronously // so it may update the socket's current action. socket_action(socket->native_handle(), socket->current_action(), &running_handles); check_info(); if (running_handles <= 0) { // No transfer is pending, we can kill the timer. m_timer.cancel(); } else { socket->trigger(*this); } } } void curl_multi_asio::check_info() { for (CURLMsg* msg = info_read(); msg; msg = info_read()) { if (msg->msg == CURLMSG_DONE) { const auto handle = get_handle(msg->easy_handle); m_result_map[handle] = msg->data.result; remove_handle(msg->easy_handle); } } } } freelan-2.0/libs/freelan/src/curl.hpp000066400000000000000000000435041252300335000176000ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file curl.hpp * \author Julien KAUFFMANN * \brief The cURL structures and functions. */ #ifndef FREELAN_CURL_HPP #define FREELAN_CURL_HPP #include #include #include #include #include #include #include namespace freelan { /** * \brief A CURL slist. */ class curl_list { public: /** * \brief Create a CURL slist. */ curl_list(); /** * \brief The move constructor. * \param other The other instance to move from. */ curl_list(curl_list&& other) : m_slist(std::move(other.m_slist)) { } /** * \brief The move assignment operator. * \param other The other instance to move from. * \return The current instance. */ curl_list& operator=(curl_list&& other) { m_slist = std::move(other.m_slist); return *this; } /** * \brief Append a value to the list. */ void append(const std::string& value); /** * \brief Reset the list. */ void reset(); /** * \brief Get the raw pointer for the slist. * \return The raw pointer. */ struct curl_slist* raw() const; private: std::unique_ptr m_slist; friend class curl; }; typedef curl_socket_t (*curl_open_socket_callback)(void*, curlsocktype, struct curl_sockaddr*); typedef int (*curl_close_socket_callback)(void*, curl_socket_t); /** * \brief A CURL wrapper class. */ class curl { public: /** * \brief A debug function type. */ typedef boost::function debug_function_t; /** * \brief A write function type. */ typedef boost::function write_function_t; /** * \brief A default write function. * \param data The data. * \return The size of data, in bytes. */ static size_t default_write_function(boost::asio::const_buffer data) { return boost::asio::buffer_size(data); } /** * \brief Create a CURL. */ curl(); /** * \brief Get the raw pointer. * \return The raw pointer. */ CURL* raw() const { return m_curl.get(); } /** * \brief Set an option. * \param option The option. * \param value The option value. * * On error, a std::runtime_error is raised. */ void set_option(CURLoption option, void* value); /** * \brief Set an option. * \param option The option. * \param value The option value. * * On error, a std::runtime_error is raised. */ void set_option(CURLoption option, const void* value) { set_option(option, const_cast(value)); } /** * \brief Set an option. * \param option The option. * \param value The option value. * * On error, a std::runtime_error is raised. */ void set_option(CURLoption option, long int value); /** * \brief Set an option. * \param option The option. * \param value The option value. * * On error, a std::runtime_error is raised. */ void set_option(CURLoption option, curl_debug_callback value); /** * \brief Set an option. * \param option The option. * \param value The option value. * * On error, a std::runtime_error is raised. */ void set_option(CURLoption option, curl_write_callback value); /** * \brief Set an option. * \param option The option. * \param value The option value. * * On error, a std::runtime_error is raised. */ void set_option(CURLoption option, curl_open_socket_callback value); /** * \brief Set an option. * \param option The option. * \param value The option value. * * On error, a std::runtime_error is raised. */ void set_option(CURLoption option, curl_close_socket_callback value); /** * \brief Set the HTTP(S) proxy to use. * \param proxy The proxy. */ void set_proxy(const asiotap::endpoint& proxy); /** * \brief Set a debug function. * \param func The debug function. */ void set_debug_function(debug_function_t func); /** * \brief Set the write function. * \param func The write function. */ void set_write_function(write_function_t func); /** * \brief Set the user agent. * \param user_agent The user agent to set. */ void set_user_agent(const std::string& user_agent); /** * \brief Set the url. * \param url The url. */ void set_url(const std::string& url); /** * \brief Enable or disable the SSL peer verification method. * \param state The state. */ void set_ssl_peer_verification(bool state); /** * \brief Enable or disable the SSL host verification method. * \param state The state. */ void set_ssl_host_verification(bool state); /** * \brief Set the cainfo path. * \param ca_info The cainfo path.. */ void set_ca_info(const boost::filesystem::path& ca_info); /** * \brief Set the connect timeout. * \param timeout The timeout. */ void set_connect_timeout(const boost::posix_time::time_duration& timeout); /** * \brief Set the timeout. * \param timeout The timeout. */ void set_timeout(const boost::posix_time::time_duration& timeout); /** * \brief Set a HTTP header. * \param header The header. * \param value The value. */ void set_http_header(const std::string& header, const std::string& value = "\"\""); /** * \brief Unset a HTTP header. * \param header The header. */ void unset_http_header(const std::string& header); /** * \brief Reset all HTTP headers. */ void reset_http_headers(); /** * \brief Set the GET method for the request. */ void set_get(); /** * \brief Set the POST method for the request. */ void set_post(); /** * \brief Sets the post fields. * \param buf The buffer containing the data. * * buf must remain valid until to curl instance gets destroyed or * set_post_fields() gets called again. */ void set_post_fields(boost::asio::const_buffer buf); /** * \brief Sets the post fields. * \param buf The buffer containing the data. * * The specified data is copied by the curl library so it may be modified * or deleted once the call is complete. */ void set_copy_post_fields(boost::asio::const_buffer buf); /** * \brief Set the cookie file. * \param file The file. */ void set_cookie_file(const std::string& file); /** * \brief Enable cookies support. */ void enable_cookie_support(); /** * \brief Set the username for authentication. * \param username The username. */ void set_username(const std::string& username); /** * \brief Set the password for authentication. * \param password The password. */ void set_password(const std::string& password); /** * \brief Escape the specified string using url encoding. * \param url The url to encode. * \return The encoded url. */ std::string escape(const std::string& url); /** * \brief Unescape the specified encoded string url encoding. * \param encoded The encoded string. * \return The decoded string. */ std::string unescape(const std::string& encoded); /** * \brief Perform the cURL request. * * On error, an exception is thrown. */ void perform(); /** * \brief Get the effective url. * \return The effective url. */ std::string get_effective_url(); /** * \brief Get the last response code. * \return The last response code. */ long get_response_code(); /** * \brief Get the content length for downloads. * \return The content length or -1, if no content length is specified. */ ptrdiff_t get_content_length_download(); /** * \brief Get the content length for uploads. * \return The content length or -1, if no content length is specified. */ ptrdiff_t get_content_length_upload(); /** * \brief Get the content type. * \return The content type or an empty string if no content type is specified. */ std::string get_content_type(); /** * \brief Get the system error. * \return The system error. */ boost::system::error_code get_system_error(); private: static int debug_function(CURL*, curl_infotype, char*, size_t, void*); static size_t write_function(char*, size_t, size_t, void*); std::unique_ptr m_curl; curl_list m_http_headers; debug_function_t m_debug_function; write_function_t m_write_function; friend class curl_multi; }; class curl_association; /** * \brief A CURLM wrapper class. */ class curl_multi : public boost::enable_shared_from_this { public: /** * \brief Create a CURLM. */ static boost::shared_ptr create() { return boost::shared_ptr(new curl_multi()); } /** * \brief Destroy a CURLM. */ virtual ~curl_multi() {}; /** * \brief Get the raw pointer. * \return The raw pointer. */ CURLM* raw() const { return m_curlm.get(); } /** * \brief Add a handle to this CURLM. * \param handle The handle to add. * * On error, a std::runtime_error is raised. */ virtual void add_handle(boost::shared_ptr handle); /** * \brief Get a handle from this CURLM. * \param easy_handle The CURL handle to get. * \return The curl instance that was first added. */ virtual boost::shared_ptr get_handle(CURL* easy_handle) const; /** * \brief Remove a handle from this CURLM. * \param easy_handle The CURL handle to remove. * \return The curl instance that was first added. * * On error, a std::runtime_error is raised. */ virtual boost::shared_ptr remove_handle(CURL* easy_handle); /** * \brief Clear all the handles from this CURLM. * \return All the curl instance previously handled. */ virtual std::vector> clear(); /** * \brief Set an option. * \param option The option. * \param value The option value. * * On error, a std::runtime_error is raised. */ void set_option(CURLMoption option, void* value); /** * \brief Set an option. * \param option The option. * \param value The option value. * * On error, a std::runtime_error is raised. */ void set_option(CURLMoption option, long int value); /** * \brief Set an option. * \param option The option. * \param value The option value. * * On error, a std::runtime_error is raised. */ void set_option(CURLMoption option, curl_multi_timer_callback value); /** * \brief Set an option. * \param option The option. * \param value The option value. * * On error, a std::runtime_error is raised. */ void set_option(CURLMoption option, curl_socket_callback value); /** * \brief Perform a socket action. */ void socket_action(curl_socket_t sockfd, int ev_bitmask, int* running_handles); /** * \brief Read information from the curl multi handle. * \param count_left A pointer to an integer that must receive the count of remaining messages. * \return A pointer to the information structure if any, or nullptr otherwise. */ CURLMsg* info_read(int* count_left = nullptr); protected: curl_multi(); virtual void before_associate_handle(boost::shared_ptr) { } virtual void after_associate_handle(boost::shared_ptr) { } virtual void before_disassociate_handle(boost::shared_ptr) { } virtual void after_disassociate_handle(boost::shared_ptr) { } private: std::unique_ptr m_curlm; std::map> m_associations; friend class curl_association; }; /** * An association class between a curl and a curl multi. */ class curl_association { public: curl_association(boost::shared_ptr _curl_multi, boost::shared_ptr _curl); ~curl_association(); boost::shared_ptr get_curl_multi() const { return m_curl_multi; } boost::shared_ptr get_curl() const { return m_curl; } private: curl_association(const curl_association&) = delete; curl_association& operator=(const curl_association&) = delete; boost::shared_ptr m_curl_multi; boost::shared_ptr m_curl; }; /** * \brief A CURL multi wrapper class compatible with Boost ASIO. */ class curl_multi_asio : public curl_multi { public: /** * \brief The connection complete callback. */ typedef boost::function connection_complete_callback; /** * Create a new instance. */ static boost::shared_ptr create(boost::asio::io_service& io_service) { return boost::shared_ptr(new curl_multi_asio(io_service)); } /** * \brief The destructor. */ ~curl_multi_asio(); boost::shared_ptr shared_from_this() { return boost::static_pointer_cast(curl_multi::shared_from_this()); } /** * \brief Post a handle to this CURLM, asynchronously. * \param handle The handle to add. * \param handler The handler to call upon completion. This handler will *NOT* be * called once the handle was added but when the handle associated operation * completes. * * On error, a std::runtime_error is raised. */ void execute(boost::shared_ptr handle, connection_complete_callback handler = connection_complete_callback()); /** * \brief Clear all the handles from this CURLM, asynchronously. */ void async_clear(boost::function handler = boost::function()); protected: void before_associate_handle(boost::shared_ptr) override; void after_disassociate_handle(boost::shared_ptr) override; private: class curl_socket : private boost::asio::ip::tcp::socket, public enable_shared_from_this { public: template static boost::shared_ptr create(Values&&... values) { return boost::shared_ptr(new curl_socket(std::forward(values)...)); } using boost::asio::ip::tcp::socket::cancel; using boost::asio::ip::tcp::socket::native_handle; int current_action() const { return m_current_action; } void set_current_action(int action) { m_current_action = action; } void trigger(curl_multi_asio& _curl_multi_asio); void trigger_read(curl_multi_asio& _curl_multi_asio); void trigger_write(curl_multi_asio& _curl_multi_asio); private: template curl_socket(Values&&... values) : boost::asio::ip::tcp::socket(std::forward(values)...), m_current_action(0), m_read_operation_pending(false), m_write_operation_pending(false) { } int m_current_action; bool m_read_operation_pending; bool m_write_operation_pending; }; static int static_timer_callback(CURLM*, long, void*); static int static_socket_callback(CURL*, curl_socket_t, int, void*, void*); static curl_socket_t open_socket_callback(void* _curl_multi_asio, curlsocktype purpose, struct curl_sockaddr* address); static int close_socket_callback(void* _curl_multi_asio, curl_socket_t item); curl_multi_asio(boost::asio::io_service& io_service); void timer_callback(const boost::system::error_code& ec); void socket_callback(const boost::system::error_code& ec, boost::shared_ptr socket); void check_info(); boost::asio::io_service& m_io_service; boost::asio::strand m_strand; boost::asio::deadline_timer m_timer; std::map, connection_complete_callback> m_handler_map; std::map, CURLcode> m_result_map; std::map> m_socket_map; }; } #endif /* FREELAN_CURL_HPP */ freelan-2.0/libs/freelan/src/curl_error.cpp000066400000000000000000000050401252300335000207750ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file curl_error.cpp * \author Julien Kauffmann * \brief The errors. */ #include "curl_error.hpp" namespace freelan { const boost::system::error_category& curl_category() { static curl_category_impl instance; return instance; } const char* curl_category_impl::name() const throw() { return "curl::error"; } std::string curl_category_impl::message(int ev) const { return curl_easy_strerror(static_cast(ev)); } const boost::system::error_category& curlm_category() { static curlm_category_impl instance; return instance; } const char* curlm_category_impl::name() const throw() { return "curlm::error"; } std::string curlm_category_impl::message(int ev) const { return curl_multi_strerror(static_cast(ev)); } } freelan-2.0/libs/freelan/src/curl_error.hpp000066400000000000000000000116121252300335000210040ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file curl_error.hpp * \author Julien Kauffmann * \brief The errors. */ #pragma once #include #include #include #include #include namespace freelan { /** * @brief Get the default server error category. * @return The default server error category instance. * * @warning The first call to this function is thread-safe only starting with C++11. */ const boost::system::error_category& curl_category(); /** * @brief Create an error_code instance for the given error. * @param error The error. * @return The error_code instance. */ inline boost::system::error_code make_error_code(CURLcode error) { return boost::system::error_code(static_cast(error), curl_category()); } /** * @brief Create an error_condition instance for the given error. * @param error The error. * @return The error_condition instance. */ inline boost::system::error_condition make_error_condition(CURLcode error) { return boost::system::error_condition(static_cast(error), curl_category()); } /** * @brief A server error category. */ class curl_category_impl : public boost::system::error_category { public: /** * @brief Get the name of the category. * @return The name of the category. */ virtual const char* name() const throw(); /** * @brief Get the error message for a given error. * @param ev The error numeric value. * @return The message associated to the error. */ virtual std::string message(int ev) const; }; /** * @brief Get the default server error category. * @return The default server error category instance. * * @warning The first call to this function is thread-safe only starting with C++11. */ const boost::system::error_category& curlm_category(); /** * @brief Create an error_code instance for the given error. * @param error The error. * @return The error_code instance. */ inline boost::system::error_code make_error_code(CURLMcode error) { return boost::system::error_code(static_cast(error), curlm_category()); } /** * @brief Create an error_condition instance for the given error. * @param error The error. * @return The error_condition instance. */ inline boost::system::error_condition make_error_condition(CURLMcode error) { return boost::system::error_condition(static_cast(error), curlm_category()); } /** * @brief A server error category. */ class curlm_category_impl : public boost::system::error_category { public: /** * @brief Get the name of the category. * @return The name of the category. */ virtual const char* name() const throw(); /** * @brief Get the error message for a given error. * @param ev The error numeric value. * @return The message associated to the error. */ virtual std::string message(int ev) const; }; } namespace boost { namespace system { template <> struct is_error_code_enum : public boost::true_type {}; template <> struct is_error_code_enum : public boost::true_type {}; } } freelan-2.0/libs/freelan/src/freelan.cpp000066400000000000000000000042451252300335000202410ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file freelan.cpp * \author Julien KAUFFMANN * \brief The global freelan include file. */ #include "freelan.hpp" #include #include namespace freelan { initializer::initializer() { if (curl_global_init(CURL_GLOBAL_ALL) != 0) { throw std::runtime_error("Unable to initialize libcurl"); } } initializer::~initializer() { curl_global_cleanup(); } } freelan-2.0/libs/freelan/src/ip_route.cpp000066400000000000000000000052731252300335000204550ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file ip_route.cpp * \author Julien KAUFFMANN * \brief An IP route type, extended with specific configuration values. */ #include "ip_route.hpp" namespace freelan { const std::string default_ipv4_gateway_type::string_representation = "ipv4_proxy"; const std::string default_ipv6_gateway_type::string_representation = "ipv6_proxy"; std::istream& operator>>(std::istream& is, ip_route& value) { asiotap::ip_route new_value; if (is >> new_value) { value = new_value; } else { if (!is.eof()) { is.clear(); std::string str; if (is >> str) { if (str == default_ipv4_gateway_type::string_representation) { value = default_ipv4_gateway_type(); } else if (str == default_ipv6_gateway_type::string_representation) { value = default_ipv6_gateway_type(); } else { is.clear(std::istream::failbit); } } } } return is; } } freelan-2.0/libs/freelan/src/message.cpp000066400000000000000000000050351252300335000202470ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file message.cpp * \author Julien KAUFFMANN * \brief The messages exchanged by the peers. */ #include "message.hpp" #include namespace freelan { size_t message::write(void* buf, size_t buf_len, message_type _type, size_t _length) { if (buf_len < HEADER_LENGTH) { throw std::runtime_error("buf_len"); } fscp::buffer_tools::set(buf, 0, static_cast(_type)); fscp::buffer_tools::set(buf, 1, htons(static_cast(_length))); return HEADER_LENGTH + _length; } message::message(const void* buf, size_t buf_len) : m_data(buf) { if (buf_len < HEADER_LENGTH) { throw std::runtime_error("buf_len"); } if (buf_len < HEADER_LENGTH + length()) { throw std::runtime_error("buf_len"); } } } freelan-2.0/libs/freelan/src/metric.cpp000066400000000000000000000051231252300335000201040ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file metric.cpp * \author Julien KAUFFMANN * \brief A metric type. */ #include "metric.hpp" namespace freelan { const std::string auto_metric_type::string_representation = "auto"; const std::string system_metric_type::string_representation = "system"; std::istream& operator>>(std::istream& is, metric_type& value) { unsigned int num_value = 0; if (is >> num_value) { value = num_value; } else { if (!is.eof()) { is.clear(); std::string str; if (is >> str) { if (str == auto_metric_type::string_representation) { value = auto_metric_type(); } else if (str == system_metric_type::string_representation) { value = system_metric_type(); } else { is.clear(std::istream::failbit); } } } } return is; } } freelan-2.0/libs/freelan/src/mss.cpp000066400000000000000000000050671252300335000174320ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file mss.cpp * \author Julien KAUFFMANN * \brief A MSS type. */ #include "mss.hpp" namespace freelan { const std::string auto_mss_type::string_representation = "auto"; const std::string disabled_mss_type::string_representation = "disabled"; std::istream& operator>>(std::istream& is, mss_type& value) { size_t num_value = 0; if (is >> num_value) { value = num_value; } else { if (!is.eof()) { is.clear(); std::string str; if (is >> str) { if (str == auto_mss_type::string_representation) { value = auto_mss_type(); } else if (str == disabled_mss_type::string_representation) { value = disabled_mss_type(); } else { is.clear(std::istream::failbit); } } } } return is; } } freelan-2.0/libs/freelan/src/mtu.cpp000066400000000000000000000050651252300335000174330ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file mtu.cpp * \author Julien KAUFFMANN * \brief A MTU type. */ #include "mtu.hpp" namespace freelan { const std::string auto_mtu_type::string_representation = "auto"; const std::string system_mtu_type::string_representation = "system"; std::istream& operator>>(std::istream& is, mtu_type& value) { unsigned int num_value = 0; if (is >> num_value) { value = num_value; } else { if (!is.eof()) { is.clear(); std::string str; if (is >> str) { if (str == auto_mtu_type::string_representation) { value = auto_mtu_type(); } else if (str == system_mtu_type::string_representation) { value = system_mtu_type(); } else { is.clear(std::istream::failbit); } } } } return is; } } freelan-2.0/libs/freelan/src/router.cpp000066400000000000000000000125351252300335000201460ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file router.cpp * \author Julien KAUFFMANN * \brief A router class. */ #include "router.hpp" #include #include #include #include namespace freelan { namespace { bool is_multicast(const boost::asio::ip::address_v4&) { return false; } bool is_multicast(const boost::asio::ip::address_v6& addr) { static asiotap::ipv6_network_address solicited_node_multicast_address(boost::asio::ip::address_v6::from_string("ff02::1:ff00:0"), 104); return solicited_node_multicast_address.has_address(addr); } } void router::async_write(port_index_type index, boost::asio::const_buffer data, port_type::write_handler_type handler) { const auto port_entries = get_targets_for(index, data); for (auto&& port_entry : port_entries) { port_entry->async_write(data, handler); } } std::vector router::get_targets_for(port_index_type index, boost::asio::const_buffer data) { // Try IPv4 first because it is more likely. m_ipv4_filter.parse(data); if (m_ipv4_filter.get_last_const_helper()) { const boost::asio::ip::address_v4 destination = m_ipv4_filter.get_last_const_helper()->destination(); m_ipv4_filter.clear_last_helper(); return get_targets_for(index, destination); } else { m_ipv6_filter.parse(data); if (m_ipv6_filter.get_last_const_helper()) { const boost::asio::ip::address_v6 destination = m_ipv6_filter.get_last_const_helper()->destination(); m_ipv6_filter.clear_last_helper(); return get_targets_for(index, destination); } } // Frame of other types than IPv4 or IPv6 are silently dropped. return {}; } template std::vector router::get_targets_for(port_index_type index, const AddressType& dest_addr) { const router::port_list_type::const_iterator source_port_entry = m_ports.find(index); if (source_port_entry != m_ports.end()) { std::vector result; if (is_multicast(dest_addr)) { result.reserve(m_ports.size()); for (auto port_entry = m_ports.begin(); port_entry != m_ports.end(); ++port_entry) { // Make sure we don't route multicast back packets to the source. if (source_port_entry != port_entry) { if (m_configuration.client_routing_enabled || (source_port_entry->second.group() != port_entry->second.group())) { result.push_back(&port_entry->second); } } } } else { const auto& routes_ports = routes(); for (auto&& route_port : routes_ports) { if (has_address(route_port.first, dest_addr)) { const port_list_type::const_iterator port_entry = m_ports.find(route_port.second); if (m_configuration.client_routing_enabled || (source_port_entry->second.group() != port_entry->second.group())) { result.push_back(&port_entry->second); break; } } } } return result; } // No route for the current frame so we return an empty list. return {}; } const router::routes_port_type& router::routes() const { if (!m_routes) { // The routes were invalidated, we recompile them. m_routes = routes_port_type(); // We add all the port routes to the routes list. // These are sorted automatically by the container. for (port_list_type::const_iterator port = m_ports.begin(); port != m_ports.end(); ++port) { const auto& local_routes = port->second.local_routes(); for (auto&& route : local_routes) { m_routes->insert(std::make_pair(route, port->first)); } } } return *m_routes; } } freelan-2.0/libs/freelan/src/routes_message.cpp000066400000000000000000000271131252300335000216510ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file routes_message.cpp * \author Julien KAUFFMANN * \brief The routes messages exchanged by the peers. */ #include "routes_message.hpp" #include namespace freelan { namespace { enum ip_network_address_type { INAT_INVALID = 0x00, INAT_IPV4 = 0x01, INAT_IPV4_GATEWAY = 0x02, INAT_IPV6 = 0x03, INAT_IPV6_GATEWAY = 0x04, INAT_DNS_SERVER_IPV4 = 0x05, INAT_DNS_SERVER_IPV6 = 0x06 }; template ip_network_address_type get_address_type(); template ip_network_address_type get_address_type(bool has_gateway); template <> ip_network_address_type get_address_type() { return INAT_DNS_SERVER_IPV4; } template <> ip_network_address_type get_address_type() { return INAT_DNS_SERVER_IPV6; } template <> ip_network_address_type get_address_type(bool has_gateway) { return has_gateway ? INAT_IPV4_GATEWAY : INAT_IPV4; } template <> ip_network_address_type get_address_type(bool has_gateway) { return has_gateway ? INAT_IPV6_GATEWAY : INAT_IPV6; } /** * \brief A visitor that writes the representation of a network address to a buffer. */ template class routes_helper : public boost::static_visitor { public: /** * \brief Create a new ip_network_address_representation. * \param buf The buffer to write the representation to. * \param buf_len The length of buf. */ routes_helper(BufferType buf, size_t buf_len) : m_buf(buf), m_buf_len(buf_len) {} /** * \brief Get the representation size of the network address. * \param ir The ip_route. * \return The representation size. */ template result_type operator()(const asiotap::base_ip_route& ir) const { const auto ina = ir.network_address(); const auto _gateway = ir.gateway(); const uint8_t prefix_length = static_cast(ina.prefix_length()); const auto bytes = ina.address().to_bytes(); size_t result_size = 2 + bytes.size(); if (m_buf_len < result_size) { throw std::runtime_error("buf_len"); } fscp::buffer_tools::set(m_buf, 0, static_cast(get_address_type(static_cast(_gateway)))); fscp::buffer_tools::set(m_buf, 1, static_cast(prefix_length)); std::copy(bytes.begin(), bytes.end(), m_buf + 2); if (_gateway) { const auto gateway_bytes = _gateway->to_bytes(); result_size += gateway_bytes.size(); if (m_buf_len < result_size) { throw std::runtime_error("buf_len"); } std::copy(gateway_bytes.begin(), gateway_bytes.end(), m_buf + 2 + bytes.size()); } return result_size; } /** * \brief Get the representation size of the DNS server address. * \param dns_server The IP address of the DNS server. * \return The representation size. */ result_type write_dns_server(const boost::asio::ip::address& dns_server) const { if (dns_server.is_v4()) { return operator()(dns_server.to_v4()); } else { return operator()(dns_server.to_v6()); } } /** * \brief Get the representation size of the DNS server address. * \param dns_server The IP address of the DNS server. * \return The representation size. */ template result_type operator()(const AddressType& dns_server) const { const auto bytes = dns_server.to_bytes(); size_t result_size = 1 + bytes.size(); if (m_buf_len < result_size) { throw std::runtime_error("buf_len"); } fscp::buffer_tools::set(m_buf, 0, static_cast(get_address_type())); std::copy(bytes.begin(), bytes.end(), m_buf + 1); return result_size; } /** * \brief Read the next ip_route contained in the buffer. * \param has_gateway Whether the function must read a gateway or not. * \return The IP route. */ template asiotap::base_ip_route read_next_ip_route(bool has_gateway) { if (m_buf_len == 0) { throw std::runtime_error("Not enough bytes for the expected prefix length"); } const unsigned int prefix_length = static_cast(*m_buf); ++m_buf; --m_buf_len; typename AddressType::bytes_type bytes; if (m_buf_len < bytes.size()) { throw std::runtime_error("Not enough bytes for the expected IP address"); } std::copy(m_buf, m_buf + bytes.size(), bytes.begin()); m_buf += bytes.size(); m_buf_len -= bytes.size(); if (has_gateway) { typename AddressType::bytes_type gateway_bytes; if (m_buf_len < gateway_bytes.size()) { throw std::runtime_error("Not enough bytes for the expected IP address"); } std::copy(m_buf, m_buf + gateway_bytes.size(), gateway_bytes.begin()); m_buf += gateway_bytes.size(); m_buf_len -= gateway_bytes.size(); return asiotap::base_ip_route(asiotap::base_ip_network_address(AddressType(bytes), prefix_length), AddressType(gateway_bytes)); } else { return asiotap::base_ip_route(asiotap::base_ip_network_address(AddressType(bytes), prefix_length)); } } /** * \brief Read the next DNS server address contained in the buffer. * \return The DNS server address. */ template AddressType read_next_dns_server() { typename AddressType::bytes_type bytes; if (m_buf_len < bytes.size()) { throw std::runtime_error("Not enough bytes for the expected IP address"); } std::copy(m_buf, m_buf + bytes.size(), bytes.begin()); m_buf += bytes.size(); m_buf_len -= bytes.size(); return AddressType(bytes); } /** * \brief Read the next ip_route or dns server address contained in the buffer. * \param ir The route to read. * \param dns_server The DNS server address to read. * \return The type that was read. */ ip_network_address_type read_next(asiotap::ip_route& ir, asiotap::ip_address& dns_server) { if (m_buf_len == 0) { return INAT_INVALID; } const auto _type = *m_buf; ++m_buf; --m_buf_len; switch (_type) { case INAT_IPV4: case INAT_IPV4_GATEWAY: { ir = read_next_ip_route(_type == INAT_IPV4_GATEWAY); break; } case INAT_IPV6: case INAT_IPV6_GATEWAY: { ir = read_next_ip_route(_type == INAT_IPV6_GATEWAY); break; } case INAT_DNS_SERVER_IPV4: { dns_server = read_next_dns_server(); break; } case INAT_DNS_SERVER_IPV6: { dns_server = read_next_dns_server(); break; } default: { throw std::runtime_error("Unknown route type in message"); } } return static_cast(_type); } private: BufferType m_buf; size_t m_buf_len; }; } size_t routes_message::write(void* buf, size_t buf_len, version_type _version, const asiotap::ip_route_set& routes, const asiotap::ip_address_set& dns_servers) { if (buf_len < HEADER_LENGTH) { throw std::runtime_error("buf_len"); } size_t required_size = 0; uint8_t* pbuf = static_cast(buf) + HEADER_LENGTH; size_t pbuf_len = buf_len - HEADER_LENGTH; fscp::buffer_tools::set(pbuf, 0, htonl(static_cast(_version))); required_size += sizeof(uint32_t); pbuf += sizeof(uint32_t); pbuf_len -= sizeof(uint32_t); for (auto&& route : routes) { const size_t count = boost::apply_visitor(routes_helper(pbuf, pbuf_len), route); required_size += count; pbuf += count; pbuf_len -= count; } for (auto&& dns_server : dns_servers) { const size_t count = routes_helper(pbuf, pbuf_len).write_dns_server(dns_server.value()); required_size += count; pbuf += count; pbuf_len -= count; } return message::write(buf, buf_len, MT_ROUTES, required_size); } routes_message::version_type routes_message::version() const { return ntohl(static_cast(fscp::buffer_tools::get(payload(), 0))); } const asiotap::ip_route_set& routes_message::routes() const { read_and_cache_results(); return m_results->routes; } const asiotap::ip_address_set& routes_message::dns_servers() const { read_and_cache_results(); return m_results->dns_servers; } routes_message::routes_message(const void* buf, size_t buf_len) : message(buf, buf_len) { routes(); } routes_message::routes_message(const message& _message) : message(_message) { routes(); } void routes_message::read_and_cache_results() const { if (!m_results) { routes_and_dns_servers result; const uint8_t* pbuf = payload() + sizeof(uint32_t); size_t pbuf_len = length() - sizeof(uint32_t); routes_helper deserializer(pbuf, pbuf_len); asiotap::ip_route ir; asiotap::ip_address dns_server; for ( ip_network_address_type _type = deserializer.read_next(ir, dns_server); _type != INAT_INVALID; _type = deserializer.read_next(ir, dns_server) ) { switch (_type) { case INAT_IPV4: case INAT_IPV4_GATEWAY: case INAT_IPV6: case INAT_IPV6_GATEWAY: { result.routes.insert(ir); break; } case INAT_DNS_SERVER_IPV4: case INAT_DNS_SERVER_IPV6: { result.dns_servers.insert(dns_server); break; } default: break; } } m_results = result; } } } freelan-2.0/libs/freelan/src/routes_request_message.cpp000066400000000000000000000047461252300335000234300ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file routes_request_message.cpp * \author Julien KAUFFMANN * \brief The routes request messages exchanged by the peers. */ #include "routes_request_message.hpp" #include namespace freelan { size_t routes_request_message::write(void* buf, size_t buf_len) { return message::write(buf, buf_len, MT_ROUTES_REQUEST, 0); } routes_request_message::routes_request_message(const void* buf, size_t buf_len) : message(buf, buf_len) { if (length() != 0) { throw std::runtime_error("bad message length"); } } routes_request_message::routes_request_message(const message& _message) : message(_message) { if (length() != 0) { throw std::runtime_error("bad message length"); } } } freelan-2.0/libs/freelan/src/server.cpp000066400000000000000000000377071252300335000201440ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file server.cpp * \author Julien KAUFFMANN * \brief The freelan server class. */ #include "server.hpp" #include "tools.hpp" #include #include #include #include #include #include namespace freelan { using kfather::value_cast; namespace { class session_type : public mongooseplus::generic_session, public mongooseplus::basic_session_type { public: session_type(const std::string& _session_id, const std::string& _username) : mongooseplus::generic_session(_session_id), basic_session_type(_username) { } }; class external_authentication_handler : public mongooseplus::basic_authentication_handler { public: external_authentication_handler(fscp::logger& _logger, web_server::authentication_handler_type auth_handler) : mongooseplus::basic_authentication_handler("freelan"), m_logger(_logger), m_authentication_handler(auth_handler) {} protected: bool authenticate_from_username_and_password(mongooseplus::request& req, const std::string& username, const std::string& password) const override { if (!m_authentication_handler) { m_logger(fscp::log_level::warning) << "No authentication script defined ! Failing authentication for user \"" << username << "\"."; return false; } if (!m_authentication_handler(username, password, req.remote(), req.remote_port())) { m_logger(fscp::log_level::warning) << "Authentication failed for user \"" << username << "\"."; return false; } m_logger(fscp::log_level::debug) << "Authentication succeeded for user \"" << username << "\"."; const auto session = req.get_session(); if (!session || (session->username() != username)) { req.set_session(username); } return true; } private: fscp::logger& m_logger; web_server::authentication_handler_type m_authentication_handler; }; kfather::array_type to_json(const std::set& public_endpoints) { kfather::array_type result; for (auto&& public_endpoint : public_endpoints) { result.items.push_back(boost::lexical_cast(public_endpoint)); } return result; } kfather::string_type to_json(const fscp::hash_type& hash) { return cryptoplus::base64_encode(cryptoplus::buffer(&hash.data[0], hash.data.size())); } kfather::object_type to_json(const std::map>& contacts) { kfather::object_type result; for (auto&& contact : contacts) { result.items[to_json(contact.first)] = to_json(contact.second); } return result; } } web_server::web_server(fscp::logger& _logger, const freelan::server_configuration& configuration, authentication_handler_type authentication_handler) : m_logger(_logger), m_authentication_handler(authentication_handler) { m_logger(fscp::log_level::debug) << "Web server's listen endpoint set to " << configuration.listen_on << "."; set_option("listening_port", boost::lexical_cast(configuration.listen_on)); if (configuration.protocol == server_configuration::server_protocol_type::https) { set_certificate_and_private_key(configuration.server_certificate, configuration.server_private_key); } register_authenticated_route("/request_certificate/", [this, configuration](mongooseplus::request& req) { const auto session = req.get_session(); m_logger(fscp::log_level::debug) << session->username() << " (" << req.remote() << ") requested a certificate."; const cryptoplus::x509::certificate_request cert_req = cryptoplus::x509::certificate_request::from_der(req.content(), req.content_size()); const auto certificate = sign_certificate_request(cert_req, configuration.certification_authority_certificate, configuration.certification_authority_private_key, session->username()); const auto certificate_buffer = certificate.write_der(); req.send_header("content-type", "application/x-x509-cert"); req.send_data(&certificate_buffer.data()[0], certificate_buffer.data().size()); return request_result::handled; }); register_authenticated_route("/request_ca_certificate/", [this, configuration](mongooseplus::request& req) { const auto session = req.get_session(); m_logger(fscp::log_level::debug) << session->username() << " (" << req.remote() << ") requested the CA certificate."; const auto certificate_buffer = configuration.certification_authority_certificate.write_der(); req.send_header("content-type", "application/x-x509-ca-cert"); req.send_data(&certificate_buffer.data()[0], certificate_buffer.data().size()); return request_result::handled; }); register_authenticated_route("/register/", [this, configuration](mongooseplus::request& req) { const auto session = req.get_session(); auto cinfop = get_client_information(req); const bool registered = (cinfop != nullptr); if (registered) { m_logger(fscp::log_level::debug) << session->username() << " (" << req.remote() << ") asked to update his registration."; } else { m_logger(fscp::log_level::debug) << session->username() << " (" << req.remote() << ") asked to be registered."; cinfop = &m_client_information_map[session->username()]; } const cryptoplus::x509::certificate cert = cryptoplus::x509::certificate::from_der(req.content(), req.content_size()); cinfop->presentation = fscp::presentation_store(cert, cryptoplus::buffer()); cinfop->expires_from_now(configuration.registration_validity_duration); typedef boost::date_time::c_local_adjustor local_adjustor; if (registered) { m_logger(fscp::log_level::information) << session->username() << " (" << req.remote() << ") registration extended until: " << local_adjustor::utc_to_local(cinfop->expiration_timestamp) << "."; } else { m_logger(fscp::log_level::information) << session->username() << " (" << req.remote() << ") registered until: " << local_adjustor::utc_to_local(cinfop->expiration_timestamp) << "."; } kfather::object_type result; result.items["expiration_timestamp"] = boost::posix_time::to_iso_extended_string(cinfop->expiration_timestamp); req.send_json(result); return request_result::handled; }); register_authenticated_route("/unregister/", [this, configuration](mongooseplus::request& req) { const auto session = req.get_session(); const auto cinfop = get_client_information(req); const bool registered = (cinfop != nullptr); if (registered) { m_logger(fscp::log_level::information) << session->username() << " (" << req.remote() << ") asked to be unregistered."; m_client_information_map.erase(session->username()); } else { m_logger(fscp::log_level::warning) << session->username() << " (" << req.remote() << ") asked to be unregistered but is not currently registered. Doing nothing."; } return request_result::handled; }); register_authenticated_route("/set_contact_information/", [this, configuration](mongooseplus::request& req) { const auto session = req.get_session(); const auto cinfop = get_client_information(req); if (cinfop == nullptr) { m_logger(fscp::log_level::warning) << session->username() << " (" << req.remote() << ") tried to set his contact information without an active registration. Denying."; throw mongooseplus::http_error(mongooseplus::mongooseplus_error::http_400_bad_request) << mongooseplus::error_content_error_info("No active registration"); } else { auto info = req.json(); m_logger(fscp::log_level::debug) << "Raw client information: " << kfather::inline_formatter().format(info); const auto public_endpoints = kfather::value_cast(info).get("public_endpoints"); cinfop->endpoints = std::set(); std::set rejected_endpoints; for (auto&& endpoint_obj : public_endpoints.items) { const auto endpoint_str = kfather::value_cast(endpoint_obj); try { auto endpoint = boost::lexical_cast(endpoint_str); endpoint = asiotap::get_default_ip_endpoint(endpoint, req.remote_ip()); if (asiotap::is_endpoint_complete(endpoint)) { cinfop->endpoints.insert(endpoint); } else { m_logger(fscp::log_level::warning) << "Not adding \"" << endpoint << "\" as a public endpoint: the endpoint is not complete."; rejected_endpoints.insert(endpoint); } } catch (std::exception& ex) { m_logger(fscp::log_level::warning) << "Unable to parse \"" << endpoint_str << "\": " << ex.what(); } } if (cinfop->endpoints.empty()) { m_logger(fscp::log_level::information) << session->username() << " (" << req.remote() << ") set his contact information and has no public endpoints."; } else { std::ostringstream oss; for (auto&& ep : cinfop->endpoints) { oss << ", " << ep; } m_logger(fscp::log_level::information) << session->username() << " (" << req.remote() << ") set his contact information and can be joined at: " << oss.str().substr(2); } kfather::object_type result; result.items["accepted_endpoints"] = to_json(cinfop->endpoints); result.items["rejected_endpoints"] = to_json(rejected_endpoints); req.send_json(result); return request_result::handled; } }); register_authenticated_route("/get_contact_information/", [this, configuration](mongooseplus::request& req) { const auto session = req.get_session(); const auto cinfop = get_client_information(req); if (cinfop == nullptr) { m_logger(fscp::log_level::warning) << session->username() << " (" << req.remote() << ") asked for contact information without an active registration. Denying."; throw mongooseplus::http_error(mongooseplus::mongooseplus_error::http_400_bad_request) << mongooseplus::error_content_error_info("No active registration"); } else { auto info = req.json(); m_logger(fscp::log_level::debug) << "Raw client information: " << kfather::inline_formatter().format(info); std::set requested_contacts; for(auto&& hash_obj : kfather::value_cast(info).get("requested_contacts").items) { const std::string hash_b64 = kfather::value_cast(hash_obj); try { const auto hash_buf = cryptoplus::base64_decode(hash_b64); if (hash_buf.data().size() != sizeof(fscp::hash_type)) { throw std::runtime_error("Invalid hash size"); } fscp::hash_type hash; std::copy_n(hash_buf.data().begin(), sizeof(hash.data), hash.data.begin()); requested_contacts.insert(hash); } catch (std::exception& ex) { m_logger(fscp::log_level::warning) << "Unable to read base 64 encoded DER certificate hash from \"" << hash_b64 << "\": " << ex.what(); } } std::map> contacts; if (requested_contacts.empty()) { m_logger(fscp::log_level::information) << session->username() << " (" << req.remote() << ") requested all contact information."; for (auto&& cinfo_pair : m_client_information_map) { if (cinfo_pair.first != session->username()) { const auto& hash = cinfo_pair.second.presentation.signature_certificate_hash(); if (hash) { contacts[*hash] = cinfo_pair.second.endpoints; } } } } else { std::ostringstream oss; for (auto&& hash : requested_contacts) { oss << ", " << hash; } m_logger(fscp::log_level::information) << session->username() << " (" << req.remote() << ") requested contact information for: " << oss.str().substr(2); for (auto&& cinfo_pair : m_client_information_map) { if (cinfo_pair.first != session->username()) { const auto& hash = cinfo_pair.second.presentation.signature_certificate_hash(); if (hash && (requested_contacts.find(*hash) != requested_contacts.end())) { contacts[*hash] = cinfo_pair.second.endpoints; } } } } kfather::object_type result; result.items["contacts"] = to_json(contacts); req.send_json(result); return request_result::handled; } }); } web_server::route_type& web_server::register_authenticated_route(route_type&& route) { return register_route(route).set_authentication_handler(m_logger, m_authentication_handler); } web_server::request_result web_server::handle_request(mongooseplus::request& req) { if (m_logger.level() <= fscp::log_level::debug) { m_logger(fscp::log_level::information) << "Web server - Received " << req.request_method() << " request from " << req.remote() << " for " << req.uri() << " (" << req.content_size() << " byte(s) content)."; m_logger(fscp::log_level::debug) << "--- Headers follow ---"; for (auto&& header : req.get_headers()) { m_logger(fscp::log_level::debug) << header.key() << ": " << header.value(); } m_logger(fscp::log_level::debug) << "--- End of headers ---"; } return mongooseplus::routed_web_server::handle_request(req); } web_server::request_result web_server::handle_http_error(mongooseplus::request& req) { m_logger(fscp::log_level::warning) << "Web server - Sending back " << req.status_code() << " to " << req.remote() << "."; return mongooseplus::routed_web_server::handle_http_error(req); } web_server::client_information_type* web_server::get_client_information(mongooseplus::request& req) { const auto session = req.get_session(); const auto cinfop = m_client_information_map.find(session->username()); if (cinfop != m_client_information_map.end()) { if (cinfop->second.has_expired()) { m_client_information_map.erase(cinfop); m_logger(fscp::log_level::warning) << "Registration for " << req.remote() << " (" << session->username() << ") just expired."; } else { return &cinfop->second; } } return nullptr; } } freelan-2.0/libs/freelan/src/switch.cpp000066400000000000000000000166571252300335000201400ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file switch.cpp * \author Julien KAUFFMANN * \brief A switch class. */ #include "switch.hpp" #include #include #include #include #if BOOST_VERSION >= 104700 #include #else #include #include #endif #include #include #include namespace freelan { namespace { template class results_gatherer { public: typedef std::set set_type; typedef std::map map_type; results_gatherer(Handler handler, const set_type& keys) : m_handler(handler), m_keys(keys) { if (m_keys.empty()) { m_handler(m_results); } } void gather(const KeyType& key, const ValueType& value) { boost::mutex::scoped_lock lock(m_mutex); const size_t erased_count = m_keys.erase(key); // Ensure that gather was called only once for a given key. assert(erased_count == 1); m_results[key] = value; if (m_keys.empty()) { m_handler(m_results); } } private: boost::mutex m_mutex; Handler m_handler; set_type m_keys; map_type m_results; }; } const unsigned int switch_::MAX_ENTRIES_DEFAULT = 1024; void switch_::async_write(port_index_type index, boost::asio::const_buffer data, multi_write_handler_type handler) { typedef results_gatherer results_gatherer_type; const auto targets = get_targets_for(index, data); #if FREELAN_DEBUG if (!targets.empty()) { std::cerr << "Switching " << buffer_size(data) << " byte(s) of data from " << index << " to " << targets.size() << " host(s)." << std::endl; } else { std::cerr << "Switching " << buffer_size(data) << " byte(s) of data from " << index << ": no targets." << std::endl; } #endif boost::shared_ptr rg = boost::make_shared(handler, targets); for (auto&& target : targets) { #if FREELAN_DEBUG std::cerr << index << "-> " << target << std::endl; #endif m_ports[target].async_write(data, boost::bind(&results_gatherer_type::gather, rg, target, _1)); } } std::set switch_::get_targets_for(port_index_type index, boost::asio::const_buffer data) { const port_list_type::iterator source_port_entry = m_ports.find(index); if (source_port_entry != m_ports.end()) { switch (m_configuration.routing_method) { case switch_configuration::RM_HUB: { return get_targets_for(source_port_entry); } case switch_configuration::RM_SWITCH: { asiotap::osi::const_helper ethernet_helper(data); const ethernet_address_type target_address = to_ethernet_address(ethernet_helper.target()); if (is_multicast_address(target_address)) { return get_targets_for(source_port_entry); } else { m_ethernet_address_map[to_ethernet_address(ethernet_helper.sender())] = index; // We exceeded the maximum count for entries: we delete random entries to fix it. while (m_ethernet_address_map.size() > m_max_entries) { ethernet_address_map_type::iterator entry = m_ethernet_address_map.begin(); #if BOOST_VERSION >= 104700 boost::random::mt19937 gen; std::advance(entry, boost::random::uniform_int_distribution<>(0, static_cast(m_ethernet_address_map.size()) - 1)(gen)); #else boost::mt19937 gen; boost::variate_generator > vgen(gen, boost::uniform_int<>(0, m_ethernet_address_map.size() - 1)); std::advance(entry, vgen()); #endif m_ethernet_address_map.erase(entry); } // We look in the ethernet address map const ethernet_address_map_type::iterator target_entry = m_ethernet_address_map.find(target_address); if (target_entry == m_ethernet_address_map.end()) { // No target entry: we send the message to everybody. return get_targets_for(source_port_entry); } const port_index_type target_port_index = target_entry->second; if (!is_registered(target_port_index)) { // The port does not exist: we delete the entry and send to everybody. m_ethernet_address_map.erase(target_entry); return get_targets_for(source_port_entry); } std::set targets; targets.insert(target_port_index); return targets; } } } } return std::set(); } std::set switch_::get_targets_for(port_list_type::const_iterator source_port_entry) { std::set targets; for (port_list_type::const_iterator port_entry = m_ports.begin(); port_entry != m_ports.end(); ++port_entry) { if (source_port_entry != port_entry) { if (m_configuration.relay_mode_enabled || (source_port_entry->second.group() != port_entry->second.group())) { targets.insert(port_entry->first); } } } return targets; } switch_::ethernet_address_type switch_::to_ethernet_address(boost::asio::const_buffer buf) { assert(boost::asio::buffer_size(buf) == ethernet_address_type::static_size); ethernet_address_type result; std::memcpy(result.c_array(), boost::asio::buffer_cast(buf), result.size()); return result; } bool switch_::is_multicast_address(const switch_::ethernet_address_type& address) { return ((address[0] & 0x01) != 0x00); } } freelan-2.0/libs/freelan/src/tools.cpp000066400000000000000000000136531252300335000177700ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file tools.cpp * \author Julien KAUFFMANN * \brief Generic purposes functions and classes. */ #include "tools.hpp" #include #include #include #include #ifdef WINDOWS #include #else #include #endif #include namespace freelan { std::string get_hostname() { #ifdef WINDOWS std::wstring whostname; whostname.resize(1024); DWORD size = static_cast(whostname.size()) - 1; // GetComputerNameA doesn't seem to work sadly. if (::GetComputerNameW(&whostname[0], &size)) { whostname.resize(size); return std::string(whostname.begin(), whostname.end()); } throw boost::system::system_error(::GetLastError(), boost::system::system_category()); #else char buf[256] = {}; if (gethostname(buf, sizeof(buf)) == 0) { return std::string(buf); } throw boost::system::system_error(errno, boost::system::system_category()); #endif } cryptoplus::pkey::pkey generate_private_key(unsigned int size, unsigned int prime) { return cryptoplus::pkey::pkey::from_rsa_key(cryptoplus::pkey::rsa_key::generate_private_key(size, prime)); } cryptoplus::x509::certificate_request generate_certificate_request(const cryptoplus::pkey::pkey& private_key, const std::string& common_name) { cryptoplus::x509::certificate_request certificate_request = cryptoplus::x509::certificate_request::create(); certificate_request.set_version(2); certificate_request.subject().push_back("CN", MBSTRING_ASC, common_name); certificate_request.set_public_key(private_key); certificate_request.sign(private_key, cryptoplus::hash::message_digest_algorithm(NID_sha1)); return certificate_request; } cryptoplus::x509::certificate generate_self_signed_certificate(const cryptoplus::pkey::pkey& private_key, const std::string& common_name, unsigned int duration) { cryptoplus::x509::certificate certificate = cryptoplus::x509::certificate::create(); certificate.set_version(2); certificate.subject().push_back("CN", MBSTRING_ASC, common_name); certificate.set_issuer(certificate.subject()); certificate.set_serial_number(cryptoplus::asn1::integer::from_long(1)); certificate.push_back(cryptoplus::x509::extension::from_nconf_nid(NID_basic_constraints, "critical,CA:TRUE")); const cryptoplus::asn1::utctime not_before = cryptoplus::asn1::utctime::from_ptime(boost::posix_time::second_clock::universal_time() - boost::gregorian::days(1)); const cryptoplus::asn1::utctime not_after = cryptoplus::asn1::utctime::from_ptime(boost::posix_time::second_clock::universal_time() + boost::gregorian::days(duration)); certificate.set_not_before(not_before); certificate.set_not_after(not_after); certificate.set_public_key(private_key); certificate.sign(private_key, cryptoplus::hash::message_digest_algorithm(NID_sha1)); return certificate; } cryptoplus::x509::certificate sign_certificate_request(const cryptoplus::x509::certificate_request& req, const cryptoplus::x509::certificate& ca_certificate, const cryptoplus::pkey::pkey& private_key, const std::string& common_name, unsigned int duration) { cryptoplus::x509::certificate certificate = cryptoplus::x509::certificate::create(); certificate.set_version(2); certificate.subject().push_back("CN", MBSTRING_ASC, common_name); certificate.set_issuer(ca_certificate.subject()); certificate.set_serial_number(cryptoplus::asn1::integer::from_long(1)); certificate.push_back(cryptoplus::x509::extension::from_nconf_nid(NID_basic_constraints, "critical,CA:FALSE")); const cryptoplus::asn1::utctime not_before = cryptoplus::asn1::utctime::from_ptime(boost::posix_time::second_clock::universal_time() - boost::gregorian::days(1)); const cryptoplus::asn1::utctime not_after = cryptoplus::asn1::utctime::from_ptime(boost::posix_time::second_clock::universal_time() + boost::gregorian::days(duration)); certificate.set_not_before(not_before); certificate.set_not_after(not_after); certificate.set_public_key(req.public_key()); certificate.sign(private_key, cryptoplus::hash::message_digest_algorithm(NID_sha1)); return certificate; } } freelan-2.0/libs/freelan/src/web_client_error.cpp000066400000000000000000000051461252300335000221520ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file web_client_error.cpp * \author Julien Kauffmann * \brief The errors. */ #include "web_client_error.hpp" namespace freelan { const boost::system::error_category& web_client_category() { static web_client_category_impl instance; return instance; } const char* web_client_category_impl::name() const throw() { return "freelan::web_client_error"; } std::string web_client_category_impl::message(int ev) const { switch (static_cast(ev)) { case web_client_error::unsupported_content_type: { return "Unsupported content type"; } case web_client_error::invalid_json_stream: { return "Invalid JSON stream"; } case web_client_error::unexpected_response: { return "Unexpected response"; } default: { return "Unknown freelan web client error"; } } } } freelan-2.0/libs/freelan/src/web_client_error.hpp000066400000000000000000000073051252300335000221560ustar00rootroot00000000000000/* * libfreelan - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfreelan. * * libfreelan is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfreelan is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfreelan in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file web_client_error.hpp * \author Julien Kauffmann * \brief The errors. */ #pragma once #include #include #include #include namespace freelan { /** * @brief Get the default web_client error category. * @return The default web_client error category instance. * * @warning The first call to this function is thread-safe only starting with C++11. */ const boost::system::error_category& web_client_category(); /** * The list of errors. */ enum class web_client_error { unsupported_content_type = 1, invalid_json_stream = 2, unexpected_response = 3 }; /** * @brief Create an error_code instance for the given error. * @param error The error. * @return The error_code instance. */ inline boost::system::error_code make_error_code(web_client_error error) { return boost::system::error_code(static_cast(error), web_client_category()); } /** * @brief Create an error_condition instance for the given error. * @param error The error. * @return The error_condition instance. */ inline boost::system::error_condition make_error_condition(web_client_error error) { return boost::system::error_condition(static_cast(error), web_client_category()); } /** * @brief A web_client error category. */ class web_client_category_impl : public boost::system::error_category { public: /** * @brief Get the name of the category. * @return The name of the category. */ virtual const char* name() const throw(); /** * @brief Get the error message for a given error. * @param ev The error numeric value. * @return The message associated to the error. */ virtual std::string message(int ev) const; }; } namespace boost { namespace system { template <> struct is_error_code_enum< ::freelan::web_client_error> : public boost::true_type {}; } } freelan-2.0/libs/fscp/000077500000000000000000000000001252300335000146445ustar00rootroot00000000000000freelan-2.0/libs/fscp/README.md000066400000000000000000000010731252300335000161240ustar00rootroot00000000000000# What is libfscp? libfscp provides a portable C++ implementation of the FreeLAN Secure Channel Protocol. # Licensing All code is licensed under the GPLv3. See gpl-3.0.txt. If you are interested in using this project under a different license, please [contact me](mailto:julien.kauffmann__AT__freelan.org). I don't bite and I probably won't charge (at least, not much). # Does the project have a website ? Yes, it does. And [here](http://www.freelan.org) it is. You may also find the [git repository](https://github.com/freelan-developers/freelan-all) on github. freelan-2.0/libs/fscp/SConscript000066400000000000000000000005431252300335000166600ustar00rootroot00000000000000Import('env dirs name') import os env = env.Clone() local_include_dir = Dir(os.path.join('include', name)) env.Prepend(CPPPATH=[local_include_dir]) includes = env.RInstall(dirs['root'], local_include_dir, ['*.hpp']) library = env.StaticLibrary(target=os.path.join(str(dirs['lib']), name), source=env.RGlob('src', '*.cpp')) Return('library includes') freelan-2.0/libs/fscp/fscp.txt000066400000000000000000000632571252300335000163550ustar00rootroot00000000000000The FreeLAN Project J. Kauffmann Draft: www.freelan.org Category: Informational 03 March 2011 The FreeLAN Secure Channel Protocol Status of this Memo This memo provides information for the Internet community. It does not specify an Internet standard of any kind. Distribution of this memo is unlimited. Abstract The FreeLAN peer-to-peer virtual private network specification requires a fast and secure communication channel. The protocol is specialized into peer-to-peer applications and supports some well-known NAT traversal techniques. 1. Introduction The FreeLAN peer-to-peer virtual private network specification requires a fast and secure communication channel. The FSCP (FreeLAN Secure Channel Protocol) is designed to be secure and efficient, and tries to minimize the overhead. It is based over UDP [RFC768]. The protocol supports packet loss. Reordered or duplicated packets are treated as lost packets. 1.1. Terminology The keywords MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, SHOULD NOT, RECOMMENDED, MAY, and OPTIONAL, when they appear in this document, are to be interpreted as described in [RFC2119]. 2. Format FSCP uses different message formats. The roles of these messages are described in a further section. Multi-bytes integer values MUST be written in network byte order. 2.1. Generic message format All messages start with a 4 bytes header whose layout is: 0 7 8 15 16 23 24 31 +--------+--------+-----------------+ |version | type | length | +--------+--------+-----------------+ The version MUST be set to the currently used version of the FreeLAN Secure Channel Protocol. The current version described in this document is 3. The type field indicates the type of the message. Its possible values are listed in the next sections. The length field indicates the length of the message body. 2.2. HELLO message format A HELLO message is 4 bytes long and has the following format: 0 7 8 15 16 23 24 31 +-----------------------------------+ | unique_number | +-----------------------------------+ 2.2.1. HELLO message type The type value of a HELLO message can be either: 0x00: For a request HELLO message 0x01: For a response HELLO message 2.2.2. HELLO message fields The unique_number field is a 4 bytes value chosen by the sender of a HELLO request message. 2.3. PRESENTATION message format A PRESENTATION message has the following format: 0 7 8 15 16 23 24 31 +-----------------+~~~~~~~~~~~~~~~~~+ | sig_cert_len | sig_cert | +-----------------+~~~~~~~~~~~~~~~~~+ 2.3.1. PRESENTATION message type A PRESENTATION message has a type value of 0x02. 2.3.2. PRESENTATION message fields The sig_cert_len field indicates the size of the sig_cert field. The sig_cert field is a DER-encoded X509 certificate used for message signature by the sender. This certificate SHOULD have the digitalSignature key usage set, as specified in [RFC2459]. In the next sections, its associated RSA public and private keys for signature will respectively be referred as PKV and PKS. sig_cert can be empty (and thus sig_cert_len is 0) if the host is using a pre-shared key instead of RSA certificates. In this case, such a PRESENTATION message conveys an intent to establish a session. A host MIGHT ignore any PRESENTATION message whose sig_cert field does not satisfy the key usage requirements or if it doesn't support pre-shared key encryption. The minimum RSA key size is 1024 bits. The RECOMMENDED RSA key size is 2048 bits or higher, with an exponent of 2^16 + 1. A strict implementation MAY reject PRESENTATION messages with a low RSA key size. 2.4. SESSION_REQUEST message format A SESSION_REQUEST message has the following format: 0 7 8 15 16 23 24 31 +-----------------------------------+ | session_number | +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ | host_identifier | +~~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~+ | cs_len | cs | +-----------------+~~~~~~~~~~~~~~~~~+ | ec_len | ec | +-----------------+~~~~~~~~~~~~~~~~~+ This header is signed using the sender host signature private key (PKS). That is, a SESSION_REQUEST message sent over the wire has the following format: 0 7 8 15 16 23 24 31 +-----------------------------------+ | session_number | +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ | host_identifier | +~~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~+ | cs_len | cs | +-----------------+~~~~~~~~~~~~~~~~~+ | ec_len | ec | +-----------------+~~~~~~~~~~~~~~~~~+ | hr_sig_len | hr_sig | +-----------------+~~~~~~~~~~~~~~~~~+ 2.4.1. SESSION_REQUEST message type A SESSION_REQUEST message has a type value of 0x03. 2.4.2. SESSION_REQUEST message fields The session_number indicates the requested session number. If no previous session is known, session_number MUST be 0. The host_identifier field is 32 bytes long and is a random number generated on startup (or at least before a session attempt begins). It MUST remain constant during the lifetime of a FSCP client. The host_identifier can be different for every host the client wants to establish a session with, but MUST remain constant within that relationship. The cs_len field indicates the length of the cs field. The cs field is a list of cipher suites supported by the client, by order of preference. A list of identifiers for the cipher suites is available in a further section of this document. The ec_len field indicates the length of the ec field. The ec field is a list of elliptic curves supported by the client, by order of preference. A list of identifiers for the elliptic curves is available in a further section of this document. The hr_sig_len field indicates the length of the hr_sig field. The hr_sig field is the header signature, generated using the private signature key (PKS) of the sender host or HMAC-SHA-256 with the pre-shared key if a pre-shared key is used. A host who receives a SESSION_REQUEST message MUST first check if the hr_sig signature matches the sending host public verification key (PKV). If the signature does not match, the message MUST be ignored. 2.5. SESSION message format A SESSION message has the following format: 0 7 8 15 16 23 24 31 +-----------------------------------+ | session_number | +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ | host_identifier | +~~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~+ | cs | ec | | +-----------------+~~~~~~~~~~~~~~~~~+ | pub_key_len | pub_key | +-----------------+~~~~~~~~~~~~~~~~~+ This header is signed using the sender host signature private key (PKS). That is, a SESSION message sent over the wire has the following format: 0 7 8 15 16 23 24 31 +-----------------------------------+ | session_number | +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ | host_identifier | +~~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~+ | cs | ec | | +-----------------+~~~~~~~~~~~~~~~~~+ | pub_key_len | pub_key | +-----------------+~~~~~~~~~~~~~~~~~+ | hr_sig_len | hr_sig | +-----------------+~~~~~~~~~~~~~~~~~+ 2.5.1. SESSION message type A SESSION message has a type value of 0x04. 2.5.2. SESSION message fields The session_number indicates the identifier of the session. Every session MUST have its own and unique session_number value. The host_identifier field is 32 bytes long and is a random number generated on startup (or at least before a session attempt begins). It MUST remain constant during the lifetime of a FSCP client. The host_identifier can be different for every host the client wants to establish a session with, but MUST remain constant within that relationship. The cs field is the code of the chosen cipher suite. It MUST be the identifier of the first supported cipher suite specified in the associated SESSION_REQUEST. A list of identifiers for the cipher suites is available in a further section of this document. A value of 0 in cs indicates that no cipher suite was supported. In this case, the pub_key field SHOULD be empty. The ec field is the code of the chosen elliptic curve. It MUST be the identifier of the first supported elliptic curve specified in the associated SESSION_REQUEST. A list of identifiers for the elliptic curves is available in a further section of this document. A value of 0 in ec indicates that no elliptic curve was supported. In this case, the pub_key field SHOULD be empty. The field is reserved for future uses and MUST be zero in the current implementation. The pub_key_len field indicates the size of the pub_key field. The pub_key field is a pub_key_len bytes long Elliptic Curve Diffie-Hellman Ephemeral public key generated by the host. It MUST be fed to the local ECDHE instance to generate the shared secret. The hr_sig_len field indicates the length of the hr_sig field. The hr_sig field is the header signature, generated using the private signature key (PKS) of the sender host or HMAC-SHA-256 with the pre-shared key if a pre-shared key is used. A host who receives a SESSION message MUST first check if the hr_sig signature matches the sending host public verification key (PKV). If the signature does not match, the message MUST be ignored. If an host receives a SESSION message whose cs is null, it SHOULD report to the upper layer that no session could be established with the requested parameters. 2.6. DATA message format A DATA message format has the following format: 0 7 8 15 16 23 24 31 +-----------------------------------+ | sequence_number | +-----------------------------------+ | tag... | +-----------------------------------+ | ... | +-----------------------------------+ | ... | +-----------------------------------+ | ... | +-----------------+~~~~~~~~~~~~~~~~~+ | ciphertext_len | ciphertext | +-----------------+~~~~~~~~~~~~~~~~~+ 2.6.1. DATA message type Valid type values for DATA messages are 0x70 to 0x7F. Every value represent a different channel. Those channels share the same session and thus, the same sequence numbers. 2.6.2. DATA message fields The sequence_number field indicates the sequence number of the current message. Two different DATA messages belonging to the same session MUST have two different sequence numbers. The rules governing the sequence number are explained in a further section. The tag field is 16 bytes long and contains the GCM tag associated to ciphertext. The ciphertext_len field is the length of the ciphertext field. The ciphertext field represents the data of the message, ciphered using the target host session cipher key. The nonce used for the generation of the ciphertext is a sequence of 8 bytes derived from the session shared secret concatenated to the 4 bytes sequence number in network byte order. The generation of the nonce is detailled later in 3.3. If the decipherment of the ciphertext fails, the message MUST be ignored. The 4 less significant bits of the message type value indicate the channel number. The channel number SHOULD be made available to the upper layers. 2.7. CONTACT-REQUEST message format A CONTACT-REQUEST message is similar to a DATA message. 2.7.1. CONTACT-REQUEST message type A CONTACT-REQUEST message has a type value of 0xFD. 2.7.2. CONTACT-REQUEST message fields A CONTACT-REQUEST is similar to a DATA message. CONTACT-REQUEST and DATA messages share the same sequence counter. A host who receives a CONTACT-REQUEST message MUST also first check if the hmac matches the message. If the HMAC doesn't match, the message MUST be ignored. The data contained in a CONTACT-REQUEST message has the following format: 0 7 8 15 16 23 24 31 +-----------------------------------+ | hash 0 | +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ | hash 1 | +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ | ... | +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ | hash n | +-----------------------------------+ That is, a list of 32 bytes hashes indicating the certificate(s) for which contact addresses are requested. hash is 32 bytes long and is the SHA-256 digest of the DER representation of the requested certificate. Duplicates entries in the hash list MUST be treated like a single entry. The order of entries does not matter and CAN thus be ignored by the implementation. 2.8. CONTACT message format A CONTACT message is similar to a DATA message. 2.8.1. CONTACT message type A CONTACT message has a type value of 0xFE. 2.8.2. CONTACT message fields A CONTACT is similar to a DATA message. CONTACT and DATA messages share the same sequence counter. A host who receives a CONTACT message MUST also first check if the hmac matches the message. If the HMAC doesn't match, the message MUST be ignored. The data contained in a CONTACT message has the following format: 0 7 8 15 16 23 24 31 +-----------------------------------+ | hash 0 | +--------+~~~~~~~~~~~~~~~~~~~~~~~~~~+ | ep_type| endpoint | +--------+~~~~~~~~~~~~~~~~~~~~~~~~~~+ | hash 1 | +--------+~~~~~~~~~~~~~~~~~~~~~~~~~~+ | ep_type| endpoint | +--------+~~~~~~~~~~~~~~~~~~~~~~~~~~+ | ... | +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ | hash n | +--------+~~~~~~~~~~~~~~~~~~~~~~~~~~+ | ep_type| endpoint | +--------+~~~~~~~~~~~~~~~~~~~~~~~~~~+ That is a list of (hash, ep_type, endpoint) tuples indicating the contact information for the specified hosts. hash is 32 bytes long and is the SHA-256 digest of the DER representation of the requested certificate. ep_type is a 1 byte field that can take the following values: * 0x04: IPv4 endpoint In which case, endpoint has the following format: 0 7 8 15 16 23 24 31 +-----------------------------------+ | IPv4 address | +-----------------+-----------------+ | port | +-----------------+ * 0x06: IPv6 endpoint In which case, endpoint has the following format: 0 7 8 15 16 23 24 31 +-----------------------------------+ | IPv6 address... : +-----------------+-----------------+ : ...IPv6 address... : +-----------------+-----------------+ : ...IPv6 address... : +-----------------+-----------------+ : ...IPv6 address | +-----------------+-----------------+ | port | +-----------------+ 2.9. KEEP-ALIVE message format A KEEP-ALIVE message is similar to a DATA message. 2.9.1. KEEP-ALIVE message type A KEEP-ALIVE message has a type value of 0xFF. 2.9.2. KEEP-ALIVE message fields A KEEP-ALIVE is similar to a DATA message. KEEP-ALIVE and DATA messages share the same sequence counter. A host who receives a KEEP-ALIVE message MUST also first check if the hmac matches the message. If the HMAC doesn't match, the message MUST be ignored. The data contained in a KEEP-ALIVE message MUST be random to prevent key analysis attacks. The deciphered data SHOULD be ignored and not made accessible to the upper layers. 3. Algorithms 3.1. Supported cipher suites and elliptic curves The available cipher suites are: - 0x01: ECDHE-RSA-AES128-GCM-SHA256 - 0x02: ECDHE-RSA-AES256-GCM-SHA384 The available elliptic curves are: - 0x01: SECT571K1 - 0x02: SECP384R1 - 0x03: SECP521R1 3.2. Signature algorithms The used signature algorithm is RSA with a PKCS#1 v2.1 PSS padding (RSASSA_PSS). The underlying hash algorithm is SHA256. The salt len for PSS is the size of the hash digest. The minimum key size is 1024. The RECOMMENDED key size is 2048. 3.3. Key derivation The key derivation function is the same as the one for TLS 1.2, and is defined in RFC 5246. Is it defined as: PRF(secret, label, seed) The used hash algorithm is SHA256. When deriving session keys, the label is "session key". When deriving nonce 8-bytes prefixes, the label is "nonce prefix". When deriving the local session key or the local nonce prefix, the seed is the local host identifier. When deriving the remote session key or the remote nonce prefix, the seed is the remote host identifier. 4. Protocol 4.1. Saying "Hello" A host CAN test the protocol support of another host using a request HELLO message. A host who receives a request HELLO message MAY respond with a matching HELLO response message. The response message MUST have the same unique_number value. If a HELLO response is received that doesn't match with a recently send HELLO request, it MUST be ignored. The maximum amount of time to wait for a HELLO response is up to the implementor. A recommended value is 4 seconds. That is, the whole HELLO message functionality is OPTIONAL. 4.2. Presentation If two hosts want to communicate but don't "know" each other, they CAN send a PRESENTATION message to the remote host to inform them about their idendity. A host who receives a PRESENTATION message is free to ignore it if the presented certificates are not acceptable. Whether a certificate is acceptable or not is up to the host. A host MAY ignore any PRESENTATION message whose certificate does not match a previously sent certificate. That is, the whole PRESENTATION message functionality is OPTIONAL. 4.3. Sessions When a host wants to establish a session MUST send a SESSION_REQUEST message to the target host indicating the desired session number. When a host receives a SESSION_REQUEST or a SESSION message from an host, the following can happen: - If the message is the first one received from the host (that is, if no host_identifier is known for that host), the specified host_identifier is stored for later comparisons. - If the message host_identifier does not match the one known for the host, ignore it. - If the message host_identifier matches the one known for the host, continue to process it. When a session is lost (because of a timeout, or whenever the implementation decide a session is to be considered dead), the host_identifier known for the host SHOULD be emptied. This allows for session reestablishment with a given host that went down for some time (and thus changed his host_identifier). When receiving a SESSION_REQUEST message: - If no previous session exists with the requesting host, and the target host and the parameters of the request are acceptable, the target host should generate a new ECDHE public key and reply with a SESSION message matching those parameters. - If a previous session exists and the requested session number is higher than the current one, the target host should also generate a new ECDHE public key and reply with a SESSION message matching those parameters. - If the requested session number is equal to or lower than the current one, the target host should reply with the same SESSION message that was used to establish the current session. When receiving a SESSION message: - If the session number is higher than the current one or if no session exists, the receiving host should renew its session parameters and reply with an updated SESSION message that contains its new ECDHE public key. The session is then considered established on this receiving side. - If the session number or the cipher suite match the current ones, the host MUST ignore it as it might be the result of a frame duplication or an attempt of replay. - If the session number matches the current one, but the public key or the cipher suite do not match the ones currently used by the active session, it should send a SESSION_REQUEST with an incremented session number to start a new session. An existing session MUST remain valid until a new one completes to prevent DoS-replay attacks. If a host does not receive a response SESSION message after 3 seconds, it MAY send another SESSION_REQUEST. If a host receives more than one request SESSION_REQUEST within 3 seconds, it MAY only accept the first one and discard the others. If a session becomes too old (more on that in the next sub-section), an host SHOULD send a SESSION_REQUEST message with an incremented session number. Whenever a session is established, its associated sequence number MUST be reset to zero. 4.3.1 Old sessions Every session has a limited lifespan. One host may send a maximum of 2^16 data messages during a session. A session is considered old when a host considers too much data messages were sent during it. A good value for this "too much" is 2^16 - 2^10 messages. Using a value too close from 2^16 may cause an interruption of the communication channel while new keys are being exchanged. Using a value too small would cause too many key exchanges to occur. Note that in any case, the session lifespan is way smaller than the AES cipherment and sealing keys lifespan. A well designed implementation should however limit session renewals to a minimum since key exchange is a critical procedure. 4.3.2. Session timeout If an host does not receive any DATA or KEEP-ALIVE message from another host during 30 seconds, it SHOULD consider the session lost. After a session is lost, the hosts MUST renegotiate session keys before sending any DATA message. 4.4. DATA messages Once a host has the session parameters for a target host, it can start sending DATA messages to him. The sequence number of the first DATA message of a given session MUST be 1. The next sequence numbers must be greater than any previously used sequence number within the same session. If a host receives a DATA message with a sequence number lower than or equal to a previously received sequence number, it MUST ignore it. 4.5. CONTACT-REQUEST and CONTACT messages A host MAY send a CONTACT-REQUEST message for one or several certificates, to one or several hosts. A session MUST be established between the requesting host and the requested host. A host SHOULD NOT send a CONTACT-REQUEST message to a host for a certificate that is part of an active session (since a session is active, contact information for the certificate is already know and thus, sending a CONTACT-REQUEST for it is useless). A host receiving a CONTACT-REQUEST message CAN reply with one or several CONTACT messages. The receiving host SHOULD only reply to requests for which the requested certificate is known and used in an active session. If an host receives a request for its own certificate, it MUST discard it, but CAN still process other requests contained in the same CONTACT-REQUEST message. 4.6. KEEP-ALIVE messages If a host does not send any DATA message to another host within 10 seconds, it SHOULD send a KEEP-ALIVE message to maintain the session alive. 5. Thanks Thanks to N.Caritey for his precious help regarding the security concerns and for his reviews of the present RFC. freelan-2.0/libs/fscp/include/000077500000000000000000000000001252300335000162675ustar00rootroot00000000000000freelan-2.0/libs/fscp/include/fscp/000077500000000000000000000000001252300335000172225ustar00rootroot00000000000000freelan-2.0/libs/fscp/include/fscp/buffer_tools.hpp000066400000000000000000000066271252300335000224370ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file buffer_tools.hpp * \author Julien Kauffmann * \brief Buffer manipulation tools. */ #ifndef FSCP_BUFFER_TOOLS_HPP #define FSCP_BUFFER_TOOLS_HPP #include #include namespace fscp { namespace buffer_tools { /** * \brief Get a value from a buffer. * \param buf The buffer. * \param offset The offset of the value to read. */ template Type get(const void* buf, size_t offset); /** * \brief Set a value in a buffer. * \param buf The buffer. * \param offset The offset of the value to write. * \param value The value to write. */ template void set(void* buf, size_t offset, Type value); /** * \brief Get a value from a buffer. * \param buf The buffer. * \param offset The offset of the value to read. */ uint8_t get(const void* buf, size_t offset); /** * \brief Set a value in a buffer. * \param buf The buffer. * \param offset The offset of the value to write. * \param value The value to write. */ void set(void* buf, size_t offset, uint8_t value); template inline Type get(const void* buf, size_t offset) { return *reinterpret_cast(static_cast(buf) + offset); } template inline void set(void* buf, size_t offset, Type value) { *reinterpret_cast(static_cast(buf) + offset) = value; } inline uint8_t get(const void* buf, size_t offset) { return static_cast(buf)[offset]; } inline void set(void* buf, size_t offset, uint8_t value) { static_cast(buf)[offset] = value; } } } #endif /* FSCP_BUFFER_TOOLS_HPP */ freelan-2.0/libs/fscp/include/fscp/constants.hpp000066400000000000000000000401561252300335000217550ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file constants.hpp * \author Julien Kauffmann * \brief The constants. */ #ifndef FSCP_CONSTANTS_HPP #define FSCP_CONSTANTS_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include namespace fscp { class enumeration_type { public: typedef uint8_t value_type; enumeration_type() : m_value(value_type()) {} enumeration_type(value_type _value) : m_value(_value) {} value_type value() const { return m_value; } private: value_type m_value; }; inline bool operator==(const enumeration_type& lhs, const enumeration_type& rhs) { return (lhs.value() == rhs.value()); } // This overload is needed to accomodate with the ambiguity raised by the implicit conversion to value_type inline bool operator==(const enumeration_type& lhs, const enumeration_type::value_type& rhs) { return (lhs.value() == rhs); } // This overload is needed to accomodate with the ambiguity raised by the implicit conversion to value_type inline bool operator==(const enumeration_type::value_type& lhs, const enumeration_type& rhs) { return (lhs == rhs.value()); } inline bool operator!=(const enumeration_type& lhs, const enumeration_type& rhs) { return (lhs.value() != rhs.value()); } // This overload is needed to accomodate with the ambiguity raised by the implicit conversion to value_type inline bool operator!=(const enumeration_type& lhs, const enumeration_type::value_type& rhs) { return (lhs.value() != rhs); } // This overload is needed to accomodate with the ambiguity raised by the implicit conversion to value_type inline bool operator!=(const enumeration_type::value_type& lhs, const enumeration_type& rhs) { return (lhs != rhs.value()); } template struct is_enumeration_type : boost::is_base_of {}; template inline typename boost::enable_if, std::ostream&>::type operator<<(std::ostream& os, const Type& value) { return os << value.to_string(); } template inline typename boost::enable_if, std::istream&>::type operator>>(std::istream& is, Type& value) { std::string str; if (is >> str) { value = Type::from_string(str); } return is; } /** * \brief The session number type. */ typedef uint32_t session_number_type; /** * \brief The hash type. */ struct hash_type { typedef boost::array data_type; data_type data; friend bool operator<(const hash_type& lhs, const hash_type& rhs) { return (lhs.data < rhs.data); } friend bool operator==(const hash_type& lhs, const hash_type& rhs) { return (lhs.data == rhs.data); } friend bool operator!=(const hash_type& lhs, const hash_type& rhs) { return (lhs.data != rhs.data); } friend std::ostream& operator<<(std::ostream& os, const hash_type& hash) { boost::io::ios_flags_saver ifs(os); os << std::hex; for (data_type::const_iterator it = hash.data.begin(); it != hash.data.end(); ++it) { os << std::setfill('0') << std::setw(2) << static_cast(*it); } return os; } }; /** * \brief The host identifier type. */ typedef hash_type host_identifier_type; /** * \brief The hash list type. */ typedef std::set hash_list_type; /** * \brief The contact map type. */ typedef std::map contact_map_type; /** * \brief The sequence number type. */ typedef uint32_t sequence_number_type; /** * \brief The current protocol version. */ const unsigned char CURRENT_PROTOCOL_VERSION = 3; /** * \brief The length of the GCM tag. */ const size_t GCM_TAG_LENGTH = 16; /** * \brief The default nonce prefix size. */ const size_t DEFAULT_NONCE_PREFIX_SIZE = 8; /** * \brief The different message types. */ enum message_type { MESSAGE_TYPE_HELLO_REQUEST = 0x00, MESSAGE_TYPE_HELLO_RESPONSE = 0x01, MESSAGE_TYPE_PRESENTATION = 0x02, MESSAGE_TYPE_SESSION_REQUEST = 0x03, MESSAGE_TYPE_SESSION = 0x04, MESSAGE_TYPE_DATA_0 = 0x70, MESSAGE_TYPE_DATA_1 = 0x71, MESSAGE_TYPE_DATA_2 = 0x72, MESSAGE_TYPE_DATA_3 = 0x73, MESSAGE_TYPE_DATA_4 = 0x74, MESSAGE_TYPE_DATA_5 = 0x75, MESSAGE_TYPE_DATA_6 = 0x76, MESSAGE_TYPE_DATA_7 = 0x77, MESSAGE_TYPE_DATA_8 = 0x78, MESSAGE_TYPE_DATA_9 = 0x79, MESSAGE_TYPE_DATA_10 = 0x7A, MESSAGE_TYPE_DATA_11 = 0x7B, MESSAGE_TYPE_DATA_12 = 0x7C, MESSAGE_TYPE_DATA_13 = 0x7D, MESSAGE_TYPE_DATA_14 = 0x7E, MESSAGE_TYPE_DATA_15 = 0x7F, MESSAGE_TYPE_CONTACT_REQUEST = 0xFD, MESSAGE_TYPE_CONTACT = 0xFE, MESSAGE_TYPE_KEEP_ALIVE = 0xFF }; /** * \brief The different channel numbers. */ enum channel_number_type { CHANNEL_NUMBER_0 = 0, CHANNEL_NUMBER_1 = 1, CHANNEL_NUMBER_2 = 2, CHANNEL_NUMBER_3 = 3, CHANNEL_NUMBER_4 = 4, CHANNEL_NUMBER_5 = 5, CHANNEL_NUMBER_6 = 6, CHANNEL_NUMBER_7 = 7, CHANNEL_NUMBER_8 = 8, CHANNEL_NUMBER_9 = 9, CHANNEL_NUMBER_10 = 10, CHANNEL_NUMBER_11 = 11, CHANNEL_NUMBER_12 = 12, CHANNEL_NUMBER_13 = 13, CHANNEL_NUMBER_14 = 14, CHANNEL_NUMBER_15 = 15 }; /** * \brief The endpoint type type. */ enum endpoint_type_type { ENDPOINT_TYPE_IPV4 = 0x04, ENDPOINT_TYPE_IPV6 = 0x06 }; /** * \brief The cipher suite type. */ class cipher_suite_type : public enumeration_type { public: static const value_type unsupported; static const value_type ecdhe_rsa_aes128_gcm_sha256; static const value_type ecdhe_rsa_aes256_gcm_sha384; cipher_suite_type() {} cipher_suite_type(value_type _value) : enumeration_type(_value) {} /** * \brief Check whether the instance is a valid cipher suite. * \return true if the cipher suite is valid. */ bool is_valid() const { if ((value() == unsupported) || (value() == ecdhe_rsa_aes128_gcm_sha256) || value() == ecdhe_rsa_aes256_gcm_sha384) { return true; } return false; } /** * \brief Get a string representation of the cipher suite. * \return A string representation. */ std::string to_string() const { if (value() == unsupported) { throw std::runtime_error("Unsupported cipher suite value: " + boost::lexical_cast(static_cast(value()))); } else if (value() == ecdhe_rsa_aes128_gcm_sha256) { return ecdhe_rsa_aes128_gcm_sha256_string; } else if (value() == ecdhe_rsa_aes256_gcm_sha384) { return ecdhe_rsa_aes256_gcm_sha384_string; } throw std::invalid_argument("Invalid cipher suite value: " + boost::lexical_cast(static_cast(value()))); } /** * \brief Get a cipher suite from its string representation. * \param str The string representation. * \return The cipher suite. */ static cipher_suite_type from_string(const std::string& str) { if (str == ecdhe_rsa_aes128_gcm_sha256_string) { return ecdhe_rsa_aes128_gcm_sha256; } else if (str == ecdhe_rsa_aes256_gcm_sha384_string) { return ecdhe_rsa_aes256_gcm_sha384; } throw std::invalid_argument("Invalid cipher suite string representation: " + str); } /** * \brief Get the associated message digest algorithm. * \return The message digest algorithm. */ cryptoplus::hash::message_digest_algorithm to_message_digest_algorithm() const { if (value() == unsupported) { throw std::runtime_error("Unsupported cipher suite value: " + boost::lexical_cast(static_cast(value()))); } else if (value() == ecdhe_rsa_aes128_gcm_sha256) { return cryptoplus::hash::message_digest_algorithm(NID_sha256); } else if (value() == ecdhe_rsa_aes256_gcm_sha384) { return cryptoplus::hash::message_digest_algorithm(NID_sha384); } throw std::invalid_argument("Invalid cipher suite value: " + boost::lexical_cast(static_cast(value()))); } /** * \brief Get the cipher algorithm associated with the instance:. * \return The associated cipher algorithm. * * If the instance is not supported, a std::runtime_error is thrown. */ cryptoplus::cipher::cipher_algorithm to_cipher_algorithm() const { if (value() == unsupported) { throw std::runtime_error("Unsupported cipher suite value: " + boost::lexical_cast(static_cast(value()))); } else if (value() == ecdhe_rsa_aes128_gcm_sha256) { return cryptoplus::cipher::cipher_algorithm(NID_aes_128_gcm); } else if (value() == ecdhe_rsa_aes256_gcm_sha384) { return cryptoplus::cipher::cipher_algorithm(NID_aes_256_gcm); } throw std::invalid_argument("Invalid cipher suite value: " + boost::lexical_cast(static_cast(value()))); } private: static const std::string ecdhe_rsa_aes128_gcm_sha256_string; static const std::string ecdhe_rsa_aes256_gcm_sha384_string; }; /** * \brief The elliptic curve type. */ class elliptic_curve_type : public enumeration_type { public: static const value_type unsupported; static const value_type sect571k1; static const value_type secp384r1; static const value_type secp521r1; elliptic_curve_type() {} elliptic_curve_type(value_type _value) : enumeration_type(_value) {} /** * \brief Check whether the instance is a valid elliptic curve. * \return true if the elliptic curve is valid. */ bool is_valid() const { if ((value() == unsupported) || (value() == sect571k1) || value() == secp384r1 || value() == secp521r1) { return true; } return false; } /** * \brief Get a string representation of the elliptic curve. * \return A string representation. */ std::string to_string() const { if (value() == unsupported) { throw std::runtime_error("Unsupported elliptic curve value: " + boost::lexical_cast(static_cast(value()))); } else if (value() == sect571k1) { return sect571k1_string; } else if (value() == secp384r1) { return secp384r1_string; } else if (value() == secp521r1) { return secp521r1_string; } throw std::invalid_argument("Invalid elliptic curve value: " + boost::lexical_cast(static_cast(value()))); } /** * \brief Get an elliptic curve from its string representation. * \param str The string representation. * \return The elliptic curve. */ static elliptic_curve_type from_string(const std::string& str) { if (str == sect571k1_string) { return sect571k1; } else if (str == secp384r1_string) { return secp384r1; } else if (str == secp521r1_string) { return secp521r1; } throw std::invalid_argument("Invalid elliptic curve string representation: " + str); } /** * \brief Get the elliptic curve associated with the instance. * \return The associated elliptic curve. * * If the instance is not supported, a std::runtime_error is thrown. */ int to_elliptic_curve_nid() const { if (value() == unsupported) { throw std::runtime_error("Unsupported elliptic curve value: " + boost::lexical_cast(static_cast(value()))); } else if (value() == sect571k1) { return NID_sect571k1; } else if (value() == secp384r1) { return NID_secp384r1; } else if (value() == secp521r1) { return NID_secp521r1; } throw std::invalid_argument("Invalid elliptic curve value"); } private: static const std::string sect571k1_string; static const std::string secp384r1_string; static const std::string secp521r1_string; }; /** * \brief The cipher suite list type. */ typedef std::vector cipher_suite_list_type; /** * \brief The elliptic curve list type. */ typedef std::vector elliptic_curve_list_type; /** * \brief The default cipher suite list. */ inline const cipher_suite_list_type get_default_cipher_suites() { return { cipher_suite_type::ecdhe_rsa_aes256_gcm_sha384, cipher_suite_type::ecdhe_rsa_aes128_gcm_sha256 }; } /** * \brief The default elliptic curve list. */ inline const elliptic_curve_list_type get_default_elliptic_curves() { return { elliptic_curve_type::sect571k1, elliptic_curve_type::secp384r1 }; } /** * \brief The certificate digest algorithm. * * This has to be a function sadly because initializing a message_digest_algorithm requires OpenSSL to be initialized first. */ cryptoplus::hash::message_digest_algorithm get_default_digest_algorithm(); /** * \brief The session keep-alive period. */ const boost::posix_time::time_duration SESSION_KEEP_ALIVE_PERIOD = boost::posix_time::seconds(10); /** * \brief The session timeout. */ const boost::posix_time::time_duration SESSION_TIMEOUT = SESSION_KEEP_ALIVE_PERIOD * 3; /** * \brief The keep-alive data size. */ const size_t SESSION_KEEP_ALIVE_DATA_SIZE = 32; /** * \brief Check if a message type is a DATA type message. * \param type The message type. * \return true if the message type is one from MESSAGE_TYPE_DATA_0 to MESSAGE_TYPE_DATA_15. */ inline bool is_data_message_type(message_type type) { return (type >= MESSAGE_TYPE_DATA_0) && (type <= MESSAGE_TYPE_DATA_15); } /** * \brief Convert a DATA message type to a channel number. * \param type The message type. Must be one from MESSAGE_TYPE_DATA_0 to MESSAGE_TYPE_DATA_15. * \return The channel number. */ channel_number_type to_channel_number(message_type type); /** * \brief Convert a channel number to a DATA message type. * \param channel_number The channel number. * \return The DATA message type. */ message_type to_data_message_type(channel_number_type channel_number); /** * \brief Gives a hash for a certificate. * \param buf The output buffer. * \param buflen The output buffer length. * \param cert The certificate. */ void get_certificate_hash(void* buf, size_t buflen, cryptoplus::x509::certificate cert); /** * \brief Gives a hash for a certificate. * \param cert The certificate. */ hash_type get_certificate_hash(cryptoplus::x509::certificate cert); } #endif /* FSCP_CONSTANTS_HPP */ freelan-2.0/libs/fscp/include/fscp/data_message.hpp000066400000000000000000000225341252300335000223560ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file data_message.hpp * \author Julien Kauffmann * \brief A data message class. */ #ifndef FSCP_DATA_MESSAGE_HPP #define FSCP_DATA_MESSAGE_HPP #include "message.hpp" #include "constants.hpp" #include namespace fscp { /** * \brief A data message class. */ class data_message : public message { public: /** * \brief The cipher algorithm type. */ typedef cryptoplus::cipher::cipher_algorithm calg_t; /** * \brief Write a data message to a buffer. * \param buf The buffer to write to. * \param buf_len The length of buf. * \param channel_number The channel number. * \param sequence_number The sequence number. * \param cipher_algorithm The cipher algorithm to use. * \param cleartext The cleartext data. * \param cleartext_len The data length. * \param enc_key The encryption key. * \param enc_key_len The encryption key length. * \param nonce_prefix The nonce prefix. * \param nonce_prefix_len The nonce prefix length. * \return The count of bytes written. */ static size_t write(void* buf, size_t buf_len, channel_number_type channel_number, sequence_number_type sequence_number, data_message::calg_t cipher_algorithm, const void* cleartext, size_t cleartext_len, const void* enc_key, size_t enc_key_len, const void* nonce_prefix, size_t nonce_prefix_len); /** * \brief Write a contact-request message to a buffer. * \param buf The buffer to write to. * \param buf_len The length of buf. * \param sequence_number The sequence number. * \param cipher_algorithm The cipher algorithm to use. * \param hash_list The hash list. * \param enc_key The encryption key. * \param enc_key_len The encryption key length. * \param nonce_prefix The nonce prefix. * \param nonce_prefix_len The nonce prefix length. * \return The count of bytes written. */ static size_t write_contact_request(void* buf, size_t buf_len, sequence_number_type sequence_number, data_message::calg_t cipher_algorithm, const hash_list_type& hash_list, const void* enc_key, size_t enc_key_len, const void* nonce_prefix, size_t nonce_prefix_len); /** * \brief Write a contact message to a buffer. * \param buf The buffer to write to. * \param buf_len The length of buf. * \param sequence_number The sequence number. * \param cipher_algorithm The cipher algorithm to use. * \param contact_map The contact map. * \param enc_key The encryption key. * \param enc_key_len The encryption key length. * \param nonce_prefix The nonce prefix. * \param nonce_prefix_len The nonce prefix length. * \return The count of bytes written. */ static size_t write_contact(void* buf, size_t buf_len, sequence_number_type sequence_number, data_message::calg_t cipher_algorithm, const contact_map_type& contact_map, const void* enc_key, size_t enc_key_len, const void* nonce_prefix, size_t nonce_prefix_len); /** * \brief Write a keep-alive message to a buffer. * \param buf The buffer to write to. * \param buf_len The length of buf. * \param sequence_number The sequence number. * \param cipher_algorithm The cipher algorithm to use. * \param random_len The length of the random content to send. * \param enc_key The encryption key. * \param enc_key_len The encryption key length. * \param nonce_prefix The nonce prefix. * \param nonce_prefix_len The nonce prefix length. * \return The count of bytes written. */ static size_t write_keep_alive(void* buf, size_t buf_len, sequence_number_type sequence_number, data_message::calg_t cipher_algorithm, size_t random_len, const void* enc_key, size_t enc_key_len, const void* nonce_prefix, size_t nonce_prefix_len); /** * \brief Parse the hash list. * \param buf The buffer to parse. * \param buflen The length of the buffer to parse. * \return The hash list. */ static hash_list_type parse_hash_list(const void* buf, size_t buflen); /** * \brief Parse the contact map. * \param buf The buffer to parse. * \param buflen The length of the buffer to parse. * \return The contact map. */ static contact_map_type parse_contact_map(const void* buf, size_t buflen); /** * \brief Create a data_message and map it on a buffer. * \param buf The buffer. * \param buf_len The buffer length. * * If the mapping fails, a std::runtime_error is thrown. */ data_message(const void* buf, size_t buf_len); /** * \brief Create a data_message from a message. * \param message The message. */ data_message(const message& message); /** * \brief Get the sequence number. * \return The sequence number. */ sequence_number_type sequence_number() const; /** * \brief Get the tag. * \return The tag. */ const uint8_t* tag() const; /** * \brief Get the tag size. * \return The tag size. */ size_t tag_size() const; /** * \brief Get the ciphertext. * \return The ciphertext. */ const uint8_t* ciphertext() const; /** * \brief Get the ciphertext size. * \return The ciphertext size. */ size_t ciphertext_size() const; /** * \brief Get the clear text data, using a given encryption key. * \param buf The buffer that must receive the data. If buf is NULL, the function returns the expected size of buf. * \param buf_len The length of buf. * \param cipher_algorithm The cipher algorithm to use. * \param enc_key The encryption key. * \param enc_key_len The encryption key length. * \param nonce_prefix The nonce prefix. * \param nonce_prefix_len The nonce prefix length. * \return The count of bytes deciphered. */ size_t get_cleartext(void* buf, size_t buf_len, data_message::calg_t cipher_algorithm, const void* enc_key, size_t enc_key_len, const void* nonce_prefix, size_t nonce_prefix_len) const; protected: /** * \brief The min length of the body. */ static const size_t MIN_BODY_LENGTH = sizeof(sequence_number_type) + GCM_TAG_LENGTH + sizeof(uint16_t); /** * \brief Write a data message to a buffer. * \param buf The buffer to write to. * \param buf_len The length of buf. * \param sequence_number The sequence number. * \param cipher_algorithm The cipher algorithm to use. * \param cleartext The cleartext data. * \param cleartext_len The data length. * \param enc_key The encryption key. * \param enc_key_len The encryption key length. * \param nonce_prefix The nonce prefix. * \param nonce_prefix_len The nonce prefix length. * \param type The message type. * \return The count of bytes written. */ static size_t raw_write(void* buf, size_t buf_len, sequence_number_type sequence_number, data_message::calg_t cipher_algorithm, const void* cleartext, size_t cleartext_len, const void* enc_key, size_t enc_key_len, const void* nonce_prefix, size_t nonce_prefix_len, message_type type); private: void check_format() const; }; inline sequence_number_type data_message::sequence_number() const { return ntohl(buffer_tools::get(payload(), 0)); } inline const uint8_t* data_message::tag() const { return payload() + sizeof(sequence_number_type); } inline size_t data_message::tag_size() const { return GCM_TAG_LENGTH; } inline const uint8_t* data_message::ciphertext() const { return payload() + sizeof(sequence_number_type) + tag_size() + sizeof(uint16_t); } inline size_t data_message::ciphertext_size() const { return ntohs(buffer_tools::get(payload(), sizeof(sequence_number_type) + tag_size())); } } #endif /* FSCP_DATA_MESSAGE_HPP */ freelan-2.0/libs/fscp/include/fscp/fscp.hpp000066400000000000000000000037041252300335000206720ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file fscp.hpp * \author Julien Kauffmann * \brief The global fscp include file. */ #ifndef FSCP_FSCP_HPP #define FSCP_FSCP_HPP #include "server.hpp" namespace fscp { } #endif /* FSCP_FSCP_HPP */ freelan-2.0/libs/fscp/include/fscp/hello_message.hpp000066400000000000000000000067141252300335000225520ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file hello_message.hpp * \author Julien Kauffmann * \brief A hello message class. */ #ifndef FSCP_HELLO_MESSAGE_HPP #define FSCP_HELLO_MESSAGE_HPP #include "message.hpp" namespace fscp { /** * \brief A hello message class. */ class hello_message : public message { public: /** * \brief Write a hello request message to a buffer. * \param buf The buffer to write to. * \param buf_len The length of buf. * \param unique_number The unique number to write. * \return The count of bytes written. */ static size_t write_request(void* buf, size_t buf_len, uint32_t unique_number); /** * \brief Write a hello response message to a buffer. * \param buf The buffer to write to. * \param buf_len The length of buf. * \param unique_number The unique number to write. * \return The count of bytes written. */ static size_t write_response(void* buf, size_t buf_len, uint32_t unique_number); /** * \brief Create a hello_message and map it on a buffer. * \param buf The buffer. * \param buf_len The buffer length. * * If the mapping fails, a std::runtime_error is thrown. */ hello_message(const void* buf, size_t buf_len); /** * \brief Create a hello_message from a message. * \param message The message. */ hello_message(const message& message); /** * \brief Get the unique number. * \return The unique number. */ uint32_t unique_number() const; protected: /** * \brief The length of the body. */ static const size_t BODY_LENGTH = 4; }; inline uint32_t hello_message::unique_number() const { return ntohl(buffer_tools::get(payload(), 0)); } } #endif /* FSCP_HELLO_MESSAGE_HPP */ freelan-2.0/libs/fscp/include/fscp/identity_store.hpp000066400000000000000000000063111252300335000230010ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file identity_store.hpp * \author Julien Kauffmann * \brief An identity store class. */ #ifndef FSCP_IDENTITY_STORE_HPP #define FSCP_IDENTITY_STORE_HPP #include #include namespace fscp { /** * \brief An identity store class. */ class identity_store { public: /** * \brief The certificate type. */ typedef cryptoplus::x509::certificate cert_type; /** * \brief The key type. */ typedef cryptoplus::pkey::pkey key_type; /** * \brief Create a new identity store. * \param sig_cert The signature certificate. * \param sig_key The signature key. * \param pre_shared_key The pre-shared key. */ identity_store(cert_type sig_cert, key_type sig_key, const cryptoplus::buffer& pre_shared_key = cryptoplus::buffer()); /** * \brief Get the signature certificate. * \return The signature certificate. */ cert_type signature_certificate() const { return m_sig_cert; } /** * \brief Get the signature key. * \return The signature key. */ key_type signature_key() const { return m_sig_key; } /** * \brief Get the pre-shared key. * \return The pre-shared key. */ const cryptoplus::buffer& pre_shared_key() const { return m_pre_shared_key; } private: cert_type m_sig_cert; key_type m_sig_key; cryptoplus::buffer m_pre_shared_key; }; } #endif /* FSCP_IDENTITY_STORE_HPP */ freelan-2.0/libs/fscp/include/fscp/logger.hpp000066400000000000000000000215061252300335000212160ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file logger.hpp * \author Julien KAUFFMANN * \brief A logger class. */ #pragma once #include #include #include #include #include #include #include namespace fscp { class logger; /** * \brief Log level type. */ enum class log_level { trace, /**< \brief The trace log level. */ debug, /**< \brief The debug log level. */ information, /**< \brief The information log level. */ important, /**< \brief The important log level. */ warning, /**< \brief The warning log level. */ error, /**< \brief The error log level. */ fatal /**< \brief The fatal log level. */ }; /** * \brief A null logger stream. */ class null_logger_stream {}; /** * \brief A string logger stream. */ class string_logger_stream { public: /** * \brief Create a string logger stream. * \param logger_ The logger to attach to. * \param level_ The level of the logger stream. */ string_logger_stream(const logger& logger_, log_level level_) : m_logger(logger_), m_level(level_) {} /** * \brief Destroy the string logger. */ ~string_logger_stream(); /** * \brief Output a value to the stream. * \return *this. */ template string_logger_stream& operator<<(const Type& value) { if (!m_oss) { m_oss = boost::make_shared(); } (*m_oss) << value; return *this; } private: const logger& m_logger; log_level m_level; boost::shared_ptr m_oss; }; /** * \brief The logger stream type implementation. */ typedef boost::variant logger_stream_impl; /** * \brief A visitor that outputs value to the logger stream. */ template class output_visitor : public boost::static_visitor<> { public: /** * \brief Create an output visitor. * \param value The value to output. */ output_visitor(const Type& value) : m_value(value) { } /** * \brief Does nothing. */ void operator()(null_logger_stream&) const { } /** * \brief Output the value to the internal ostringstream. * \param ls The logger stream. * \return The logger stream. */ void operator()(string_logger_stream& ls) const { ls << m_value; } private: const Type& m_value; }; /** * \brief A visitor that applies a manipulator to the logger stream. */ template class manipulator_visitor : public boost::static_visitor<> { public: /** * \brief The manipulator type. */ typedef StreamType& (*manipulator_type)(StreamType&); /** * \brief Create a manipulator visitor. * \param manipulator The manipulator to apply. */ manipulator_visitor(manipulator_type manipulator) : m_manipulator(manipulator) { } /** * \brief Does nothing. */ void operator()(null_logger_stream&) const { } /** * \brief Output the value to the internal ostringstream. * \param ls The logger stream. * \return The logger stream. */ void operator()(string_logger_stream& ls) const { ls << m_manipulator; } private: manipulator_type m_manipulator; }; /** * \brief The logger stream type. */ class logger_stream { public: /** * \brief The ostream manipulator type. */ typedef std::ostream& (ostream_manipulator_type)(std::ostream&); /** * \brief The manipulator type. */ typedef logger_stream& (manipulator_type)(logger_stream&); logger_stream() : m_impl() {} logger_stream(const logger_stream_impl& impl) : m_impl(impl) {} /** * \brief Output a value to the logger stream. * \param value The value. * \return *this. */ template logger_stream& operator<<(const Type& value) { boost::apply_visitor(output_visitor(value), m_impl); return *this; } /** * \brief Output a standard manipulator to the logger stream. * \param manipulator The manipulator. * \return *this. */ logger_stream& operator<<(ostream_manipulator_type manipulator) { boost::apply_visitor(manipulator_visitor(manipulator), m_impl); return *this; } /** * \brief Output a standard manipulator to the logger stream. * \param manipulator The manipulator. * \return *this. */ logger_stream& operator<<(manipulator_type manipulator) { return manipulator(*this); } private: logger_stream_impl m_impl; }; /** * \brief A logger class. */ class logger { public: /** * \brief The stream type. */ typedef logger_stream stream_type; /** * \brief The timestamp type. */ typedef boost::posix_time::ptime timestamp_type; /** * \brief The log handler type. */ typedef boost::function log_handler_type; /** * \brief Create a new logger. * \param handler The function to call whenever a log entry must be written. * \param _level The desired log level of the logger. Any logging below that level will be silently ignored. */ logger(log_handler_type handler = log_handler_type(), log_level _level = log_level::information) : m_handler(handler), m_level(_level) { } /** * \brief Set the logger's callback. * \param _callback The callback. * \warning This method is NOT thread-safe. */ void set_callback(log_handler_type _callback) { m_handler = _callback; } /** * \brief Get the logger's callback. * \return The logger's callback. */ log_handler_type callback() const { return m_handler; } /** * \brief Set the logger's level. * \param _level The log level. * \warning This method is NOT thread-safe. */ void set_level(log_level _level) { m_level = _level; } /** * \brief Get the logger's level. * \return The logger's level. */ log_level level() const { return m_level; } /** * \brief Get a logger stream. * \param level_ The log level. * \return The appropriate logger stream. */ stream_type operator()(log_level level_) const { if (level_ >= m_level) { return logger_stream_impl(string_logger_stream(*this, level_)); } else { return logger_stream_impl(null_logger_stream()); } } /** * \brief Log the specified message. * \param level_ The log level. * \param msg The message to log. * \param timestamp The timestamp. */ void log(log_level level_, const std::string& msg, timestamp_type timestamp = boost::posix_time::microsec_clock::local_time()) const { if (m_handler && (level_ >= m_level)) { m_handler(level_, msg, timestamp); } } private: log_handler_type m_handler; log_level m_level; }; inline string_logger_stream::~string_logger_stream() { if (m_oss) { (*m_oss) << std::flush; const std::string msg = (*m_oss).str(); m_logger.log(m_level, msg); } } } freelan-2.0/libs/fscp/include/fscp/message.hpp000066400000000000000000000102501252300335000213550ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file message.hpp * \author Julien Kauffmann * \brief A generic message class. */ #ifndef FSCP_MESSAGE_HPP #define FSCP_MESSAGE_HPP #include "buffer_tools.hpp" #include "constants.hpp" #include #include #include namespace fscp { /** * \brief A generic message class. */ class message { public: /** * \brief Write a message to a buffer. * \param buf The buffer to write to. * \param buf_len The length of buf. * \param version The protocol version. * \param type The message type. * \param length The length of the payload. * \return The count of bytes written. */ static size_t write(void* buf, size_t buf_len, unsigned int version, message_type type, size_t length); /** * \brief Create a message and map it on a buffer. * \param buf The buffer. * \param buf_len The buffer length. * * If the mapping fails, a std::runtime_error is thrown. */ message(const void* buf, size_t buf_len); /** * \brief Get the version. * \return The version. */ unsigned int version() const; /** * \brief Get the type. * \return The type. */ message_type type() const; /** * \brief Get the length. * \return The length. */ size_t length() const; /** * \brief Get the raw data. * \return The message data buffer. */ const uint8_t* data() const; /** * \brief Get the total size of the message. * \return The total size of the message. */ size_t size() const; /** * \brief Get the payload data. * \return The payload data. */ const uint8_t* payload() const; protected: /** * \brief The length of the header. */ static const size_t HEADER_LENGTH = 4; private: const void* m_data; }; inline unsigned int message::version() const { return buffer_tools::get(m_data, 0); } inline message_type message::type() const { return static_cast(buffer_tools::get(m_data, 1)); } inline size_t message::length() const { return ntohs(buffer_tools::get(m_data, 2)); } inline const uint8_t* message::data() const { return static_cast(m_data); } inline size_t message::size() const { return HEADER_LENGTH + length(); } inline const uint8_t* message::payload() const { return static_cast(m_data) + HEADER_LENGTH; } } #endif /* FSCP_MESSAGE_HPP */ freelan-2.0/libs/fscp/include/fscp/peer_session.hpp000066400000000000000000000200131252300335000224250ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file session.hpp * \author Julien Kauffmann * \brief An session class. */ #ifndef FSCP_PEER_SESSION_HPP #define FSCP_PEER_SESSION_HPP #include "constants.hpp" #include #include #include #include #include #include namespace fscp { /** * \brief A peer session storage class. */ class peer_session { public: struct session_parameters { session_parameters(session_number_type _session_number, cipher_suite_type _cipher_suite, elliptic_curve_type _elliptic_curve, const cryptoplus::buffer& _public_key) : session_number(_session_number), cipher_suite(_cipher_suite), elliptic_curve(_elliptic_curve), public_key(_public_key) {} session_number_type session_number; cipher_suite_type cipher_suite; elliptic_curve_type elliptic_curve; cryptoplus::buffer public_key; }; struct next_session_type { next_session_type(session_number_type _session_number, cipher_suite_type _cipher_suite, elliptic_curve_type _elliptic_curve) : ecdhe_context(_elliptic_curve.to_elliptic_curve_nid()), parameters(_session_number, _cipher_suite, _elliptic_curve, ecdhe_context.get_public_key()) {} cryptoplus::pkey::ecdhe_context ecdhe_context; session_parameters parameters; }; struct current_session_type { explicit current_session_type(const session_parameters& _parameters) : parameters(_parameters), local_sequence_number(), remote_sequence_number() {} bool is_old() const; session_parameters parameters; sequence_number_type local_sequence_number; sequence_number_type remote_sequence_number; cryptoplus::buffer local_session_key; cryptoplus::buffer remote_session_key; cryptoplus::buffer local_nonce_prefix; cryptoplus::buffer remote_nonce_prefix; }; peer_session() : m_local_host_identifier(), m_remote_host_identifier(), m_last_sign_of_life(boost::posix_time::microsec_clock::local_time()) { // Generate a random host identifier. cryptoplus::random::get_random_bytes(m_local_host_identifier.data.data(), m_local_host_identifier.data.size()); } /** * \brief Get the local host identifier. * \return Return the local host identifier. */ const host_identifier_type& local_host_identifier() const { return m_local_host_identifier; } /** * \brief Set the remote host identifier. * \param _host_identifier The host identifier to set. * \return Return true if there was no host identifier or if _host_identifier matches the current one. */ bool set_first_remote_host_identifier(const host_identifier_type& _host_identifier); /** * \brief Clear the remote host identifier. */ void clear_remote_host_identifier() { m_remote_host_identifier = boost::none; } /** * \brief Get the remote host identifier, if any. * \return The remote host identifier. */ boost::optional remote_host_identifier() const { return m_remote_host_identifier; } /** * \brief Check if the session has timed out. * \param timeout The timeout value. * \return true if the session has timed out, false otherwise. */ bool has_timed_out(const boost::posix_time::time_duration& timeout) const { return (boost::posix_time::microsec_clock::local_time() > m_last_sign_of_life + timeout); } /** * \brief Keep the session alive. */ void keep_alive() { m_last_sign_of_life = boost::posix_time::microsec_clock::local_time(); } /** * \brief Prepare the next session. * \param _session_number The next session number. * \param _cipher_suite The next cipher suite. * \param _elliptic_curve The next elliptic curve. * \return true if a new session was created. */ bool prepare_session(session_number_type _session_number, cipher_suite_type _cipher_suite, elliptic_curve_type _elliptic_curve); /** * \brief Complete the next session. * \param remote_public_key The remote public key. * \param remote_public_key_size The remote public key size. * \return true if the session was completed. */ bool complete_session(const void* remote_public_key, size_t remote_public_key_size); /** * \brief Get the next session number. * \return The next session number. */ session_number_type next_session_number() const; /** * \brief Get the next session parameters. * \return The next session parameters. */ const session_parameters& next_session_parameters() const; /** * \brief Get the current session parameters. * \return The current session parameters. */ const session_parameters& current_session_parameters() const; /** * \brief Check if an active session exists. * \return true if an active session exists. */ bool has_current_session() const { return static_cast(m_current_session); } /** * \brief Get the current session. * \return The current session, if there is one. If there is no current session, the behavior is undefined. */ const current_session_type& current_session() const { return *m_current_session; } /** * \brief Increment the local sequence number. * \return Return the current sequence number and increment it afterwards. */ sequence_number_type increment_local_sequence_number() { return ++m_current_session->local_sequence_number; } /** * \brief Set the remote sequence number. * \param sequence_number The remote sequence number. * \return true if the sequence number was incremented with the new value, false is the current sequence number is greater than sequence_number. */ bool set_remote_sequence_number(sequence_number_type sequence_number); /** * \brief Clear the current session. * \return True if the session was cleared. False is there was no active session. */ bool clear(); private: host_identifier_type m_local_host_identifier; boost::optional m_remote_host_identifier; boost::posix_time::ptime m_last_sign_of_life; boost::shared_ptr m_next_session; boost::shared_ptr m_current_session; }; } #endif /* FSCP_PEER_SESSION_HPP */ freelan-2.0/libs/fscp/include/fscp/presentation_message.hpp000066400000000000000000000067011252300335000241560ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file presentation_message.hpp * \author Julien Kauffmann * \brief A presentation message class. */ #ifndef FSCP_PRESENTATION_MESSAGE_HPP #define FSCP_PRESENTATION_MESSAGE_HPP #include "message.hpp" #include namespace fscp { /** * \brief A presentation message class. */ class presentation_message : public message { public: /** * \brief The certificate type. */ typedef cryptoplus::x509::certificate cert_type; /** * \brief Write a presentation message to a buffer. * \param buf The buffer to write to. * \param buf_len The length of buf. * \param sig_cert The signature certificate. Cannot be null. * \return The count of bytes written. */ static size_t write(void* buf, size_t buf_len, cert_type sig_cert); /** * \brief Create a presentation_message and map it on a buffer. * \param buf The buffer. * \param buf_len The buffer length. * * If the mapping fails, a std::runtime_error is thrown. */ presentation_message(const void* buf, size_t buf_len); /** * \brief Create a presentation_message from a message. * \param message The message. */ presentation_message(const message& message); /** * \brief Get the signature certificate. * \return The signature certificate. * \warning The returned certificate is parsed from the underlying buffer on every call so storing the result might be a good idea. */ cert_type signature_certificate() const; protected: /** * \brief The minimum body length. */ static const size_t MIN_BODY_LENGTH = sizeof(uint16_t); private: void check_format() const; }; } #endif /* FSCP_PRESENTATION_MESSAGE_HPP */ freelan-2.0/libs/fscp/include/fscp/presentation_store.hpp000066400000000000000000000067611252300335000236740ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file presentation_store.hpp * \author Julien Kauffmann * \brief An presentation store class. */ #ifndef FSCP_PRESENTATION_STORE_HPP #define FSCP_PRESENTATION_STORE_HPP #include "constants.hpp" #include #include #include namespace fscp { /** * \brief An presentation store class. */ class presentation_store { public: /** * \brief The certificate type. */ typedef cryptoplus::x509::certificate cert_type; /** * \brief Create an empty presentation_store. */ presentation_store() {}; /** * \brief Create a new presentation store. * \param sig_cert The signature certificate. * \param pre_shared_key The pre-shared key. */ explicit presentation_store(cert_type sig_cert, const cryptoplus::buffer& pre_shared_key); /** * \brief Check if the presentation store is empty. * \return true if the presentation store is empty. */ bool empty() const { return !m_sig_cert && !m_pre_shared_key; } /** * \brief Get the signature certificate. * \return The signature certificate. */ cert_type signature_certificate() const { return m_sig_cert; } /** * \brief Get the signature certificate hash. * \return The signature certificate hash. */ const boost::optional& signature_certificate_hash() const { return m_sig_hash; } /** * \brief Get the pre-shared key. * \return The pre-shared key. */ const cryptoplus::buffer& pre_shared_key() const { return m_pre_shared_key; } private: cert_type m_sig_cert; boost::optional m_sig_hash; cryptoplus::buffer m_pre_shared_key; }; } #endif /* FSCP_PRESENTATION_STORE_HPP */ freelan-2.0/libs/fscp/include/fscp/server.hpp000066400000000000000000001766071252300335000212620ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file server.hpp * \author Julien Kauffmann * \brief The server class. */ #ifndef FSCP_SERVER_HPP #define FSCP_SERVER_HPP #include #include "identity_store.hpp" #include "shared_buffer.hpp" #include "presentation_store.hpp" #include "peer_session.hpp" #include "logger.hpp" #include #include #include #include #include #include #include #include namespace fscp { class hello_message; class presentation_message; class session_request_message; class clear_session_request_message; class session_message; class clear_session_message; class data_message; /** * \brief A FSCP server. * * All the public methods are thread-safe, unless otherwise specified. * * async_* methods are designed to be run from inside handlers (or callbacks). * sync_* methods are designed to be run outside of the server running threads while the server is running. */ class server { public: // General purpose type definitions /** * \brief The endpoint type. */ typedef boost::asio::ip::udp::endpoint ep_type; /** * \brief The certificate type. */ typedef cryptoplus::x509::certificate cert_type; /** * \brief The socket type. */ typedef boost::asio::ip::udp::socket socket_type; // Handlers /** * \brief A void operation handler. */ typedef boost::function void_handler_type; /** * \brief An identity handler. */ typedef boost::function identity_handler_type; /** * \brief A simple operation handler. */ typedef boost::function simple_handler_type; /** * \brief A boolean operation handler. */ typedef boost::function boolean_handler_type; /** * \brief An operation handler for multiple endpoints. */ typedef boost::function&)> multiple_endpoints_handler_type; /** * \brief A duration operation handler. */ typedef boost::function duration_handler_type; /** * \brief An optional presentation store handler. */ typedef boost::function&)> optional_presentation_store_handler_type; /** * \brief An endpoints handler. */ typedef boost::function&)> endpoints_handler_type; // Callbacks /** * \brief A handler for when hello requests are received. * \param sender The endpoint that sent the hello message. * \param default_accept The default return value. * \return true to reply to the hello message, false to ignore it. */ typedef boost::function hello_message_received_handler_type; /** * \brief A presentation status type. */ enum presentation_status_type { PS_FIRST, PS_NEW, PS_SAME }; /** * \brief A handler for when presentation requests are received. * \param sender The endpoint that sent the presentation message. * \param sig_cert The signature certificate. * \param status The presentation status. * \param has_session Tell if a session currently exists with the host. * \return true to accept the presentation message for the originating host. */ typedef boost::function presentation_message_received_handler_type; /** * \brief A handler for when session requests are received. * \param sender The endpoint that sent the session request message. * \param cs_cap The cipher suite capabilities of the remote host. * \param ec_cap The elliptic curve capabilities of the remote host. * \param default_accept The default return value. * \return true to accept the session request. */ typedef boost::function session_request_received_handler_type; /** * \brief A handler for when session messages are received. * \param sender The endpoint that sent the session message. * \param cs The cipher suite used for the session. * \param ec The elliptic curve used for the session. * \param default_accept The default return value. * \return true to accept the session. */ typedef boost::function session_received_handler_type; /** * \brief A handler for when a session establishment failed. * \param host The host with which the session establishment failed. * \param is_new A flag that indicates whether the session would have been a new session or a renewal. */ typedef boost::function session_failed_handler_type; /** * \brief A handler for when a session establishment encountered an error. * \param host The host with which the session establishment failed. * \param is_new A flag that indicates whether the session would have been a new session or a renewal. */ typedef boost::function session_error_handler_type; /** * \brief A handler for when a session was established. * \param host The host with which the session was established. * \param is_new A flag that indicates whether the session is a new session or a renewal. * \param cipher_suite The cipher suite used in the session. * \param elliptic_curve The elliptic curve used in the session. */ typedef boost::function session_established_handler_type; /** * \brief A reason for the session loss. */ enum class session_loss_reason { timeout, manual_termination }; /** * \brief A handler for when a session was lost. * \param host The host with which a session was lost. */ typedef boost::function session_lost_handler_type; /** * \brief A handler for when data is available. * \param sender The endpoint that sent the data message. * \param channel_number The channel number. * \param buffer The buffer that own the data. Must be release as soon as possible to avoid memory starvation. * \param data The sent data. */ typedef boost::function data_received_handler_type; /** * \brief A handler for when contact requests are received. * \param sender The sender of the request. * \param cert The certificate associated to the answer. * \param hash The requested hash. * \param answer The answer endpoint. * \return true to allow the request to be answered. */ typedef boost::function contact_request_received_handler_type; /** * \brief A handler for when contacts are received. * \param sender The sender of the information. * \param hash The hash. * \param answer The answer endpoint. */ typedef boost::function contact_received_handler_type; // Public methods /** * \brief Create a new FSCP server. * \param io_service The Boost Asio io_service instance to associate with the server. * \param _logger The logger to use. It must remain valid during the lifetime of the fscp::server. * \param identity The identity store. */ server(boost::asio::io_service& io_service, fscp::logger& _logger, const identity_store& identity); /** * \brief Get the underlying socket. */ socket_type& get_socket() { return m_socket; } /** * \brief Get the associated io_service. * \return The associated io_service. */ boost::asio::io_service& get_io_service() { return get_socket().get_io_service(); } /** * \brief Get the identity of the server. * \return The identity. * \warning This method is *NOT* thread-safe and should be called only before the server is started. */ const identity_store& get_identity() const { return m_identity_store; } /** * \brief Get the identity of the server. * \param handler The handler to call when the result is available. */ void async_get_identity(identity_handler_type handler) { m_socket_strand.post(boost::bind(&server::do_get_identity, this, handler)); } /** * \brief Get the identity of the server. * \return The identity. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ identity_store sync_get_identity(); /** * \brief Set the identity of the server. * \param identity The identity. * \warning This method is *NOT* thread-safe and should be called only before the server is started. */ void set_identity(const identity_store& identity) { m_identity_store = identity; } /** * \brief Set the identity of the server. * \param identity The identity. * \param handler The handler to call when the change is effective. */ void async_set_identity(const identity_store& identity, void_handler_type handler = void_handler_type()) { m_socket_strand.post(boost::bind(&server::do_set_identity, this, identity, handler)); } /** * \brief Set the identity of the server. * \param identity The identity. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ void sync_set_identity(const identity_store& identity); /** * \brief Open the server. * \param listen_endpoint The listen endpoint. */ void open(const ep_type& listen_endpoint); /** * \brief Close the server. * * This method can be called from another thread. */ void close(); /** * \brief Greet an host. * \param target The target to greet. * \param handler The handler to call when a reply was received, an error occured or the request timed out. * \param timeout The maximum time to wait for a reply. */ void async_greet(const ep_type& target, duration_handler_type handler, const boost::posix_time::time_duration& timeout = boost::posix_time::seconds(3)); /** * \brief Cancel all pending greetings. */ void cancel_all_greetings() { m_greet_strand.post(boost::bind(&server::do_cancel_all_greetings, this)); } /** * \brief Set the default acceptance behavior of incoming hello messages. * \param value The default value. * \warning This method is *NOT* thread-safe and should be called only before the server is started. */ void set_accept_hello_messages_default(bool value) { m_accept_hello_messages_default = value; } /** * \brief Set the default acceptance behavior of incoming hello messages. * \param value The default value. * \param handler The handler to call when the change was made effective. */ void async_set_accept_hello_messages_default(bool value, void_handler_type handler = void_handler_type()) { m_greet_strand.post(boost::bind(&server::do_set_accept_hello_messages_default, this, value, handler)); } /** * \brief Set the default acceptance behavior of incoming hello messages. * \param value The default value. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ void sync_set_accept_hello_messages_default(bool value); /** * \brief Set the hello message received callback. * \param callback The callback. * \warning This method is *NOT* thread-safe and should be called only before the server is started. */ void set_hello_message_received_callback(hello_message_received_handler_type callback) { m_hello_message_received_handler = callback; } /** * \brief Set the hello message received callback. * \param callback The callback. * \param handler The handler to call when the change was made effective. */ void async_set_hello_message_received_callback(hello_message_received_handler_type callback, void_handler_type handler = void_handler_type()) { m_greet_strand.post(boost::bind(&server::do_set_hello_message_received_callback, this, callback, handler)); } /** * \brief Set the hello message received callback. * \param callback The callback. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ void sync_set_hello_message_received_callback(hello_message_received_handler_type callback); /** * \brief Send a presentation message to the specified target. * \param target The target host. * \param handler The handler to call when the presentation message is sent or an error occured. */ void async_introduce_to(const ep_type& target, simple_handler_type handler); /** * \brief Send a presentation message to the specified target. * \param target The target host. * \return An error_code. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ boost::system::error_code sync_introduce_to(const ep_type& target); /** * \brief Resend a presentation message to all the known peers. * \param handler The handler to call when all the presentation messages were sent or an error occured. */ void async_reintroduce_to_all(multiple_endpoints_handler_type handler); /** * \brief Send a presentation message to the specified target. * \return A map of error codes. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ std::map sync_reintroduce_to_all(); /** * \brief Get the presentation store associated to a target. * \param target The target host. * \return The presentation for the given host. * \warning This method is *NOT* thread-safe and should be called only before the server is started. */ boost::optional get_presentation(const ep_type& target); /** * \brief Get the presentation store associated to a target. * \param target The target host. * \param handler The handler to call with the presentation store instance. */ void async_get_presentation(const ep_type& target, optional_presentation_store_handler_type handler); /** * \brief Get the presentation store associated to a target. * \param target The target host. * \return The presentation for the given host. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ boost::optional sync_get_presentation(const ep_type& target); /** * \brief Set the presentation for the given host. * \param target The host to set the presentation for. * \param signature_certificate The signature certificate. * \param pre_shared_key The pre-shared key to use for this host. * \warning This method is *NOT* thread-safe and should be called only before the server is started. */ void set_presentation(const ep_type& target, cert_type signature_certificate, const cryptoplus::buffer& pre_shared_key); /** * \brief Set the presentation for the given host. * \param target The host to set the presentation for. * \param signature_certificate The signature certificate. * \param pre_shared_key The pre-shared key to use for this host. * \param handler The handler to call when the presentation was set for the given host. */ void async_set_presentation(const ep_type& target, cert_type signature_certificate, const cryptoplus::buffer& pre_shared_key, void_handler_type handler = void_handler_type()); /** * \brief Set the presentation for the given host. * \param target The host to set the presentation for. * \param signature_certificate The signature certificate. * \param pre_shared_key The pre-shared key to use for this host. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ void sync_set_presentation(const ep_type& target, cert_type signature_certificate, const cryptoplus::buffer& pre_shared_key); /** * \brief Clear the presentation for the given host. * \param target The host to set the presentation for. * \warning This method is *NOT* thread-safe and should be called only before the server is started. */ void clear_presentation(const ep_type& target); /** * \brief Clear the presentation for the given host. * \param target The host to set the presentation for. * \param handler The handler to call when the presentation was cleared for the given host. */ void async_clear_presentation(const ep_type& target, void_handler_type handler = void_handler_type()); /** * \brief Clear the presentation for the given host. * \param target The host to set the presentation for. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ void sync_clear_presentation(const ep_type& target); /** * \brief Set the presentation message received callback. * \param callback The callback. * \warning This method is *NOT* thread-safe and should be called only before the server is started. */ void set_presentation_message_received_callback(presentation_message_received_handler_type callback) { m_presentation_message_received_handler = callback; } /** * \brief Set the presentation message received callback. * \param callback The callback. * \param handler The handler to call when the change was made effective. */ void async_set_presentation_message_received_callback(presentation_message_received_handler_type callback, void_handler_type handler = void_handler_type()) { m_presentation_strand.post(boost::bind(&server::do_set_presentation_message_received_callback, this, callback, handler)); } /** * \brief Set the presentation message received callback. * \param callback The callback. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ void sync_set_presentation_message_received_callback(presentation_message_received_handler_type callback); /** * \brief Sends a session request to an host. * \param target The target to greet. * \param handler The handler to call when the request was sent or an error occured. */ void async_request_session(const ep_type& target, simple_handler_type handler); /** * \brief Sends a session request to an host. * \param target The target host. * \return An error_code. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ boost::system::error_code sync_request_session(const ep_type& target); /** * \brief Close an established session. * \param target The remote host corresponding to the session to close. * \param handler The handler to call when the session has been closed. */ void async_close_session(const ep_type& target, simple_handler_type handler); /** * \brief Close an established session. * \param target The remote host corresponding to the session to close. * \return An error code indicating the result of the operation. */ boost::system::error_code sync_close_session(const ep_type& target); /** * \brief Get a list of endpoints to which the server has an active session. * \param handler The handler to call with the endpoints list. */ void async_get_session_endpoints(endpoints_handler_type handler) { m_session_strand.post(boost::bind(&server::do_get_session_endpoints, this, handler)); } /** * \brief Get a list of endpoints to which the server has an active session. * \return The list of endpoints. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ std::set sync_get_session_endpoints(); /** * \brief Check if a session exists with the specified endpoint. * \param handler The handler to call with the result. */ void async_has_session_with_endpoint(const ep_type& host, boolean_handler_type handler) { m_session_strand.post(boost::bind(&server::do_has_session_with_endpoint, this, host, handler)); } /** * \brief Check if a session exists with the specified endpoint. * \param handler The handler to call with the result. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ bool sync_has_session_with_endpoint(const ep_type& host); /** * \brief Set the default acceptance behavior of incoming session requests. * \param value The default value. * \warning This method is *NOT* thread-safe and should be called only before the server is started. */ void set_accept_session_request_messages_default(bool value) { m_accept_session_request_messages_default = value; } /** * \brief Set the default acceptance behavior of incoming session requests. * \param value The default value. * \param handler The handler to call when the change was made effective. */ void async_set_accept_session_request_messages_default(bool value, void_handler_type handler = void_handler_type()) { m_session_strand.post(boost::bind(&server::do_set_accept_session_request_messages_default, this, value, handler)); } /** * \brief Set the default acceptance behavior of incoming session requests. * \param value The default value. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ void sync_set_accept_session_request_messages_default(bool value); /** * \brief Set the cipher suites. * \param cipher_suites The cipher suites. * \warning This method is *NOT* thread-safe and should be called only before the server is started. */ void set_cipher_suites(const cipher_suite_list_type& cipher_suites) { m_cipher_suites = cipher_suites; } /** * \brief Set the cipher suites. * \param cipher_suites The cipher suites. * \param handler The handler to call when the change was made effective. */ void async_set_cipher_suites(const cipher_suite_list_type& cipher_suites, void_handler_type handler = void_handler_type()) { m_session_strand.post(boost::bind(&server::do_set_cipher_suites, this, cipher_suites, handler)); } /** * \brief Set the cipher suites. * \param cipher_suites The cipher suites. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ void sync_set_cipher_suites(const cipher_suite_list_type& cipher_suites); /** * \brief Set the elliptic curves. * \param elliptic_curves The elliptic curves. * \warning This method is *NOT* thread-safe and should be called only before the server is started. */ void set_elliptic_curves(const elliptic_curve_list_type& elliptic_curves) { m_elliptic_curves = elliptic_curves; } /** * \brief Set the elliptic curves. * \param elliptic_curves The elliptic curves. * \param handler The handler to call when the change was made effective. */ void async_set_elliptic_curves(const elliptic_curve_list_type& elliptic_curves, void_handler_type handler = void_handler_type()) { m_session_strand.post(boost::bind(&server::do_set_elliptic_curves, this, elliptic_curves, handler)); } /** * \brief Set the elliptic curves. * \param elliptic_curves The elliptic curves. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ void sync_set_elliptic_curves(const elliptic_curve_list_type& elliptic_curves); /** * \brief Set the session request message received callback. * \param callback The callback. * \warning This method is *NOT* thread-safe and should be called only before the server is started. */ void set_session_request_message_received_callback(session_request_received_handler_type callback) { m_session_request_message_received_handler = callback; } /** * \brief Set the session request message received callback. * \param callback The callback. * \param handler The handler to call when the change was made effective. */ void async_set_session_request_message_received_callback(session_request_received_handler_type callback, void_handler_type handler = void_handler_type()) { m_session_strand.post(boost::bind(&server::do_set_session_request_message_received_callback, this, callback, handler)); } /** * \brief Set the session request message received callback. * \param callback The callback. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ void sync_set_session_request_message_received_callback(session_request_received_handler_type callback); /** * \brief Set the default acceptance behavior of incoming sessions. * \param value The default value. * \warning This method is *NOT* thread-safe and should be called only before the server is started. */ void set_accept_session_messages_default(bool value) { m_accept_session_messages_default = value; } /** * \brief Set the default acceptance behavior of incoming sessions. * \param value The default value. * \param handler The handler to call when the change was made effective. */ void async_set_accept_session_messages_default(bool value, void_handler_type handler = void_handler_type()) { m_session_strand.post(boost::bind(&server::do_set_accept_session_messages_default, this, value, handler)); } /** * \brief Set the default acceptance behavior of incoming sessions. * \param value The default value. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ void sync_set_accept_session_messages_default(bool value); /** * \brief Set the session message received callback. * \param callback The callback. * \warning This method is *NOT* thread-safe and should be called only before the server is started. */ void set_session_message_received_callback(session_received_handler_type callback) { m_session_message_received_handler = callback; } /** * \brief Set the session message received callback. * \param callback The callback. * \param handler The handler to call when the change was made effective. */ void async_set_session_message_received_callback(session_received_handler_type callback, void_handler_type handler = void_handler_type()) { m_session_strand.post(boost::bind(&server::do_set_session_message_received_callback, this, callback, handler)); } /** * \brief Set the session message received callback. * \param callback The callback. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ void sync_set_session_message_received_callback(session_received_handler_type callback); /** * \brief Set the session failed callback. * \param callback The callback. * \warning This method is *NOT* thread-safe and should be called only before the server is started. */ void set_session_failed_callback(session_failed_handler_type callback) { m_session_failed_handler = callback; } /** * \brief Set the session failed callback. * \param callback The callback. * \param handler The handler to call when the change was made effective. */ void async_set_session_failed_callback(session_failed_handler_type callback, void_handler_type handler = void_handler_type()) { m_session_strand.post(boost::bind(&server::do_set_session_failed_callback, this, callback, handler)); } /** * \brief Set the session failed callback. * \param callback The callback. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ void sync_set_session_failed_callback(session_failed_handler_type callback); /** * \brief Set the session error callback. * \param callback The callback. * \warning This method is *NOT* thread-safe and should be called only before the server is started. */ void set_session_error_callback(session_error_handler_type callback) { m_session_error_handler = callback; } /** * \brief Set the session error callback. * \param callback The callback. * \param handler The handler to call when the change was made effective. */ void async_set_session_error_callback(session_error_handler_type callback, void_handler_type handler = void_handler_type()) { m_session_strand.post(boost::bind(&server::do_set_session_error_callback, this, callback, handler)); } /** * \brief Set the session failed callback. * \param callback The callback. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ void sync_set_session_error_callback(session_error_handler_type callback); /** * \brief Set the session established callback. * \param callback The callback. * \warning This method is *NOT* thread-safe and should be called only before the server is started. */ void set_session_established_callback(session_established_handler_type callback) { m_session_established_handler = callback; } /** * \brief Set the session established callback. * \param callback The callback. * \param handler The handler to call when the change was made effective. */ void async_set_session_established_callback(session_established_handler_type callback, void_handler_type handler = void_handler_type()) { m_session_strand.post(boost::bind(&server::do_set_session_established_callback, this, callback, handler)); } /** * \brief Set the session established callback. * \param callback The callback. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ void sync_set_session_established_callback(session_established_handler_type callback); /** * \brief Set the session lost callback. * \param callback The callback. * \warning This method is *NOT* thread-safe and should be called only before the server is started. */ void set_session_lost_callback(session_lost_handler_type callback) { m_session_lost_handler = callback; } /** * \brief Set the session lost callback. * \param callback The callback. * \param handler The handler to call when the change was made effective. */ void async_set_session_lost_callback(session_lost_handler_type callback, void_handler_type handler = void_handler_type()) { m_session_strand.post(boost::bind(&server::do_set_session_lost_callback, this, callback, handler)); } /** * \brief Set the session lost callback. * \param callback The callback. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ void sync_set_session_lost_callback(session_lost_handler_type callback); /** * \brief Send data to a host. * \param target The target host. * \param channel_number The channel number. * \param data The data to send. * \param handler The handler to call when the data was sent or an error occured. */ void async_send_data(const ep_type& target, channel_number_type channel_number, boost::asio::const_buffer data, simple_handler_type handler); /** * \brief Send data to a host. * \param target The target host. * \param channel_number The channel number. * \param data The data to send. * \return The error code associated to the send operation. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ boost::system::error_code sync_send_data(const ep_type& target, channel_number_type channel_number, boost::asio::const_buffer data); /** * \brief Send data to a list of hosts. * \param targets The list of hosts. * \param channel_number The channel number. * \param data The data to send. * \param handler The handler to call when the data was sent to all hosts or an error occured. */ void async_send_data_to_list(const std::set& targets, channel_number_type channel_number, boost::asio::const_buffer data, multiple_endpoints_handler_type handler); /** * \brief Send data to a list of hosts. * \param begin An iterator to the first endpoint of the list. * \param end An iterator past the last endpoint of the list. * \param channel_number The channel number. * \param data The data to send. * \param handler The handler to call when the data was sent to all hosts or an error occured. */ template void async_send_data_to_list(EPIterator begin, EPIterator end, channel_number_type channel_number, boost::asio::const_buffer data, multiple_endpoints_handler_type handler) { async_send_data_to_list(std::set(begin, end), channel_number, data, handler); } /** * \brief Send data to a list of hosts. * \param targets The list of hosts. * \param channel_number The channel number. * \param data The data to send. * \return A map of individual results. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ std::map sync_send_data_to_list(const std::set& targets, channel_number_type channel_number, boost::asio::const_buffer data); /** * \brief Send data to a list of hosts. * \param begin An iterator to the first endpoint of the list. * \param end An iterator past the last endpoint of the list. * \param channel_number The channel number. * \param data The data to send. * \return A map of individual results. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ template std::map sync_send_data_to_list(EPIterator begin, EPIterator end, channel_number_type channel_number, boost::asio::const_buffer data) { return sync_send_data_to_list(std::set(begin, end), channel_number, data); } /** * \brief Send data to all hosts. * \param channel_number The channel number. * \param data The data to send. * \param handler The handler to call when the data was sent to all hosts or an error occured. */ void async_send_data_to_all(channel_number_type channel_number, boost::asio::const_buffer data, multiple_endpoints_handler_type handler) { m_session_strand.post(boost::bind(&server::do_send_data_to_all, this, channel_number, data, handler)); } /** * \brief Send data to all hosts. * \param channel_number The channel number. * \param data The data to send. * \return A map of individual results. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ std::map sync_send_data_to_all(channel_number_type channel_number, boost::asio::const_buffer data); /** * \brief Send a contact request to an host. * \param target The target host. * \param hash_list The hashes to request. * \param handler The handler to call when the data was sent or an error occured. */ void async_send_contact_request(const ep_type& target, const hash_list_type& hash_list, simple_handler_type handler); /** * \brief Send a contact request to an host. * \param target The target host. * \param hash_list The hashes to request. * \return The error code associated to the send operation. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ boost::system::error_code sync_send_contact_request(const ep_type& target, const hash_list_type& hash_list); /** * \brief Send a contact request to a list of hosts. * \param targets The list of hosts. * \param hash_list The hashes to request. * \param handler The handler to call when the data was sent to all hosts or an error occured. */ void async_send_contact_request_to_list(const std::set& targets, const hash_list_type& hash_list, multiple_endpoints_handler_type handler); /** * \brief Send a contact request to a list of hosts. * \param begin An iterator to the first endpoint of the list. * \param end An iterator past the last endpoint of the list. * \param hash_list The hashes to request. * \param handler The handler to call when the data was sent to all hosts or an error occured. */ template void async_send_contact_request_to_list(EPIterator begin, EPIterator end, const hash_list_type& hash_list, multiple_endpoints_handler_type handler) { async_send_contact_request_to_list(std::set(begin, end), hash_list, handler); } /** * \brief Send a contact request to a list of hosts. * \param targets The list of hosts. * \param hash_list The hashes to request. * \return A map of individual results. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ std::map sync_send_contact_request_to_list(const std::set& targets, const hash_list_type& hash_list); /** * \brief Send a contact request to a list of hosts. * \param begin An iterator to the first endpoint of the list. * \param end An iterator past the last endpoint of the list. * \param hash_list The hashes to request. * \return A map of individual results. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ template std::map sync_send_contact_request_to_list(EPIterator begin, EPIterator end, const hash_list_type& hash_list) { return sync_send_contact_request_to_list(std::set(begin, end), hash_list); } /** * \brief Send a contact request to all hosts. * \param hash_list The hashes to request. * \param handler The handler to call when the data was sent to all hosts or an error occured. */ void async_send_contact_request_to_all(const hash_list_type& hash_list, multiple_endpoints_handler_type handler) { m_session_strand.post(boost::bind(&server::do_send_contact_request_to_all, this, hash_list, handler)); } /** * \brief Send a contact request to all hosts. * \param hash_list The hashes to request. * \return A map of individual results. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ std::map sync_send_contact_request_to_all(const hash_list_type& hash_list); /** * \brief Send contact information to an host. * \param target The target host. * \param contact_map The contact information. * \param handler The handler to call when the data was sent or an error occured. */ void async_send_contact(const ep_type& target, const contact_map_type& contact_map, simple_handler_type handler); /** * \brief Send contact information to an host. * \param target The target host. * \param contact_map The contact information. * \return The error code associated to the send operation. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ boost::system::error_code sync_send_contact(const ep_type& target, const contact_map_type& contact_map); /** * \brief Send contact information to a list of hosts. * \param targets The list of hosts. * \param contact_map The contact information. * \param handler The handler to call when the data was sent to all hosts or an error occured. */ void async_send_contact_to_list(const std::set& targets, const contact_map_type& contact_map, multiple_endpoints_handler_type handler); /** * \brief Send contact information to a list of hosts. * \param begin An iterator to the first endpoint of the list. * \param end An iterator past the last endpoint of the list. * \param contact_map The contact information. * \param handler The handler to call when the data was sent to all hosts or an error occured. */ template void async_send_contact_to_list(EPIterator begin, EPIterator end, const contact_map_type& contact_map, multiple_endpoints_handler_type handler) { async_send_contact_to_list(std::set(begin, end), contact_map, handler); } /** * \brief Send contact information to a list of hosts. * \param targets The list of hosts. * \param contact_map The contact information. * \return A map of individual results. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ std::map sync_send_contact_to_list(const std::set& targets, const contact_map_type& contact_map); /** * \brief Send contact information to a list of hosts. * \param begin An iterator to the first endpoint of the list. * \param end An iterator past the last endpoint of the list. * \param contact_map The contact information. * \return A map of individual results. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ template std::map sync_send_contact_to_list(EPIterator begin, EPIterator end, const contact_map_type& contact_map) { return sync_send_contact_to_list(std::set(begin, end), contact_map); } /** * \brief Send contact information to all hosts. * \param contact_map The contact information. * \param handler The handler to call when the data was sent to all hosts or an error occured. */ void async_send_contact_to_all(const contact_map_type& contact_map, multiple_endpoints_handler_type handler) { m_session_strand.post(boost::bind(&server::do_send_contact_to_all, this, contact_map, handler)); } /** * \brief Send contact information to all hosts. * \param contact_map The contact information. * \return A map of individual results. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ std::map sync_send_contact_to_all(const contact_map_type& contact_map); /** * \brief Set the data received callback. * \param callback The callback. * \warning This method is *NOT* thread-safe and should be called only before the server is started. */ void set_data_received_callback(data_received_handler_type callback) { m_data_received_handler = callback; } /** * \brief Set the data received callback. * \param callback The callback. * \param handler The handler to call when the change was made effective. */ void async_set_data_received_callback(data_received_handler_type callback, void_handler_type handler = void_handler_type()) { m_session_strand.post(boost::bind(&server::do_set_data_received_callback, this, callback, handler)); } /** * \brief Set the data received callback. * \param callback The callback. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ void sync_set_data_received_callback(data_received_handler_type callback); /** * \brief Set the contact request received callback. * \param callback The callback. * \warning This method is *NOT* thread-safe and should be called only before the server is started. */ void set_contact_request_received_callback(contact_request_received_handler_type callback) { m_contact_request_message_received_handler = callback; } /** * \brief Set the contact request received callback. * \param callback The callback. * \param handler The handler to call when the change was made effective. */ void async_set_contact_request_received_callback(contact_request_received_handler_type callback, void_handler_type handler = void_handler_type()) { m_presentation_strand.post(boost::bind(&server::do_set_contact_request_received_callback, this, callback, handler)); } /** * \brief Set the contact request received callback. * \param callback The callback. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ void sync_set_contact_request_received_callback(contact_request_received_handler_type callback); /** * \brief Set the contact received callback. * \param callback The callback. * \warning This method is *NOT* thread-safe and should be called only before the server is started. */ void set_contact_received_callback(contact_received_handler_type callback) { m_contact_message_received_handler = callback; } /** * \brief Set the contact received callback. * \param callback The callback. * \param handler The handler to call when the change was made effective. */ void async_set_contact_received_callback(contact_received_handler_type callback, void_handler_type handler = void_handler_type()) { m_contact_strand.post(boost::bind(&server::do_set_contact_received_callback, this, callback, handler)); } /** * \brief Set the contact received callback. * \param callback The callback. * \warning If the io_service is not being run, the call will block undefinitely. * \warning This function must **NEVER** be called from inside a thread that runs one of the server's handlers. */ void sync_set_contact_received_callback(contact_received_handler_type callback); private: fscp::logger& m_logger; private: identity_store m_identity_store; void do_get_identity(identity_handler_type); void do_set_identity(const identity_store&, void_handler_type); private: void async_receive_from() { m_socket_strand.post(boost::bind(&server::do_async_receive_from, this)); } void do_async_receive_from(); void handle_receive_from(const identity_store&, boost::shared_ptr, SharedBuffer, const boost::system::error_code&, size_t); ep_type to_socket_format(const ep_type& ep); void async_send_to(const SharedBuffer& data, const size_t size, const ep_type& target, simple_handler_type handler) { const void_handler_type write_handler = [this, data, size, target, handler] () { m_socket.async_send_to(buffer(data, size), target, 0, [data, handler] (const boost::system::error_code& ec, size_t) { handler(ec); }); }; m_write_queue_strand.post(boost::bind(&server::push_write, this, write_handler)); } void push_write(void_handler_type); void pop_write(); socket_type m_socket; boost::asio::strand m_socket_strand; std::queue m_write_queue; boost::asio::strand m_write_queue_strand; std::list m_socket_buffers; private: // HELLO messages /** * @brief Represents a context for an endpoint. */ class ep_hello_context_type { public: /** * @brief Generate an unique number. * @warning The first invocation of this function is *NOT* thread-safe in C++03. */ static uint32_t generate_unique_number(); /** * @brief Create a new context. */ ep_hello_context_type(); /** * @brief Returns the current hello unique number and generates a new one. * @return The current hello unique number. */ uint32_t next_hello_unique_number(); /** * @brief Asynchronously waits for a hello reply. * @param io_service The io_service instance to use for the wait. * @param hello_unique_number The unique hello number. * @param timeout The time to wait for the reply. * @param handler The handler to call upon timeout or cancellation. */ template void async_wait_reply(boost::asio::io_service& io_service, uint32_t hello_unique_number, const boost::posix_time::time_duration& timeout, WaitHandler handler); /** * @brief Cancel a hello reply wait timer. * @param hello_unique_number The hello reply number. * @param success Whether the cancel is the result of a received reply. * @return true if the timer was cancelled or false if it was too late to do so. */ bool cancel_reply_wait(uint32_t hello_unique_number, bool success); /** * @brief Cancel all pending hello request wait timers. * * This call is similar to calling cancel_reply_wait(, false) for all hello unique numbers. */ void cancel_all_reply_wait(); /** * @brief Remove a hello reply wait from the pending list. * @param hello_unique_number The hello reply number. * @param duration A variable whose value after the call will be the time elapsed since the creation of the request. * @return The success status of the request. */ bool remove_reply_wait(uint32_t hello_unique_number, boost::posix_time::time_duration& duration); private: struct pending_request_status { pending_request_status() : timer(), start_date(boost::posix_time::microsec_clock::universal_time()), success(false) {} pending_request_status(boost::shared_ptr _timer) : timer(_timer), start_date(boost::posix_time::microsec_clock::universal_time()), success(false) {} boost::shared_ptr timer; boost::posix_time::ptime start_date; bool success; }; typedef std::map pending_requests_map; uint32_t m_current_hello_unique_number; pending_requests_map m_pending_requests; }; typedef std::map ep_hello_context_map; void do_greet(const ep_type&, duration_handler_type, const boost::posix_time::time_duration&); void do_greet_handler(const ep_type&, uint32_t, duration_handler_type, const boost::posix_time::time_duration&, const boost::system::error_code&); void do_greet_timeout(const ep_type&, uint32_t, duration_handler_type, const boost::system::error_code&); void do_cancel_all_greetings(); void handle_hello_message_from(const hello_message&, const ep_type&); void do_handle_hello_request(const ep_type&, uint32_t); void do_handle_hello_response(const ep_type&, uint32_t); void do_set_accept_hello_messages_default(bool, void_handler_type); void do_set_hello_message_received_callback(hello_message_received_handler_type, void_handler_type); ep_hello_context_map m_ep_hello_contexts; boost::asio::strand m_greet_strand; bool m_accept_hello_messages_default; hello_message_received_handler_type m_hello_message_received_handler; private: // PRESENTATION messages typedef std::map presentation_store_map; bool has_presentation_store_for(const ep_type&) const; void do_introduce_to(const ep_type&, simple_handler_type); void do_reintroduce_to_all(multiple_endpoints_handler_type); void do_get_presentation(const ep_type&, optional_presentation_store_handler_type); void do_set_presentation(const ep_type&, cert_type, const cryptoplus::buffer&, void_handler_type); void do_clear_presentation(const ep_type&, void_handler_type); void handle_presentation_message_from(const identity_store&, const presentation_message&, const ep_type&); void do_handle_presentation(const identity_store& identity, const ep_type&, bool, cert_type); void do_set_presentation_message_received_callback(presentation_message_received_handler_type, void_handler_type); // This strand is also used by session requests and session messages during the cipherment/decipherment phase. boost::asio::strand m_presentation_strand; presentation_store_map m_presentation_store_map; presentation_message_received_handler_type m_presentation_message_received_handler; private: // SESSION_REQUEST messages typedef std::map peer_session_map_type; static cipher_suite_type get_first_common_supported_cipher_suite(const cipher_suite_list_type&, const cipher_suite_list_type&, cipher_suite_type); static elliptic_curve_type get_first_common_supported_elliptic_curve(const elliptic_curve_list_type&, const elliptic_curve_list_type&, elliptic_curve_type); void do_request_session(const identity_store&, const ep_type&, simple_handler_type); void do_close_session(const ep_type&, simple_handler_type); void do_handle_session_request(SharedBuffer, const identity_store&, const ep_type&, const session_request_message&); void do_handle_verified_session_request(const identity_store&, const ep_type&, const session_request_message&); std::set get_session_endpoints() const; bool has_session_with_endpoint(const ep_type&); void do_get_session_endpoints(endpoints_handler_type); void do_has_session_with_endpoint(const ep_type&, boolean_handler_type); void do_set_accept_session_request_messages_default(bool, void_handler_type); void do_set_cipher_suites(cipher_suite_list_type, void_handler_type); void do_set_elliptic_curves(elliptic_curve_list_type, void_handler_type); void do_set_session_request_message_received_callback(session_request_received_handler_type, void_handler_type); // This strand is common to session requests, session messages and data messages. boost::asio::strand m_session_strand; peer_session_map_type m_peer_sessions; std::list m_session_buffers; bool m_accept_session_request_messages_default; cipher_suite_list_type m_cipher_suites; elliptic_curve_list_type m_elliptic_curves; session_request_received_handler_type m_session_request_message_received_handler; private: // SESSION messages void do_send_session(const identity_store&, const ep_type&, const peer_session::session_parameters&); void do_handle_session(SharedBuffer, const identity_store&, const ep_type&, const session_message&); void do_handle_verified_session(const identity_store&, const ep_type&, const session_message&); void do_set_accept_session_messages_default(bool, void_handler_type); void do_set_session_message_received_callback(session_received_handler_type, void_handler_type); void do_set_session_failed_callback(session_failed_handler_type, void_handler_type); void do_set_session_error_callback(session_error_handler_type, void_handler_type); void do_set_session_established_callback(session_established_handler_type, void_handler_type); void do_set_session_lost_callback(session_lost_handler_type, void_handler_type); bool m_accept_session_messages_default; session_received_handler_type m_session_message_received_handler; session_failed_handler_type m_session_failed_handler; session_error_handler_type m_session_error_handler; session_established_handler_type m_session_established_handler; session_lost_handler_type m_session_lost_handler; private: // DATA messages void do_send_data(const ep_type&, channel_number_type, boost::asio::const_buffer, simple_handler_type); void do_send_data_to_list(const std::set&, channel_number_type, boost::asio::const_buffer, multiple_endpoints_handler_type); void do_send_data_to_all(channel_number_type, boost::asio::const_buffer, multiple_endpoints_handler_type); void do_send_data_to_session(peer_session&, const ep_type&, channel_number_type, boost::asio::const_buffer, simple_handler_type); void do_send_contact_request(const ep_type&, const hash_list_type&, simple_handler_type); void do_send_contact_request_to_list(const std::set&, const hash_list_type&, multiple_endpoints_handler_type); void do_send_contact_request_to_all(const hash_list_type&, multiple_endpoints_handler_type); void do_send_contact_request_to_session(peer_session&, const ep_type&, const hash_list_type&, simple_handler_type); void do_send_contact(const ep_type&, const contact_map_type&, simple_handler_type); void do_send_contact_to_list(const std::set&, const contact_map_type&, multiple_endpoints_handler_type); void do_send_contact_to_all(const contact_map_type&, multiple_endpoints_handler_type); void do_send_contact_to_session(peer_session&, const ep_type&, const contact_map_type&, simple_handler_type); void handle_data_message_from(const identity_store&, SharedBuffer, const data_message&, const ep_type&); void do_handle_data(const identity_store&, const ep_type&, const data_message&); void do_handle_data_message(const ep_type&, message_type, SharedBuffer, boost::asio::const_buffer); void do_handle_contact_request(const ep_type&, const std::set&); void do_handle_contact(const ep_type&, const contact_map_type&); void do_set_data_received_callback(data_received_handler_type, void_handler_type); void do_set_contact_request_received_callback(contact_request_received_handler_type, void_handler_type); void do_set_contact_received_callback(contact_received_handler_type, void_handler_type); boost::asio::strand m_contact_strand; data_received_handler_type m_data_received_handler; contact_request_received_handler_type m_contact_request_message_received_handler; contact_received_handler_type m_contact_message_received_handler; private: // Keep-alive void do_check_keep_alive(const boost::system::error_code&); void do_send_keep_alive(const ep_type&, simple_handler_type); boost::asio::deadline_timer m_keep_alive_timer; private: // Misc friend std::ostream& operator<<(std::ostream& os, presentation_status_type status) { switch (status) { case PS_FIRST: return os << "first presentation"; case PS_NEW: return os << "new presentation"; case PS_SAME: return os << "same presentation"; } assert(false); return os << "invalid presentation status"; } }; std::ostream& operator<<(std::ostream& os, server::session_loss_reason value); } #endif /* FSCP_SERVER_HPP */ freelan-2.0/libs/fscp/include/fscp/server_error.hpp000066400000000000000000000074451252300335000224640ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file server_error.hpp * \author Julien Kauffmann * \brief The server errors. */ #ifndef FSCP_SERVER_ERROR_HPP #define FSCP_SERVER_ERROR_HPP #include #include #include namespace fscp { /** * @brief Get the default server error category. * @return The default server error category instance. * * @warning The first call to this function is thread-safe only starting with C++11. */ const boost::system::error_category& server_category(); namespace server_error { /** * The list of server errors. */ enum server_error_t { success = 0, server_offline, hello_request_timed_out, no_presentation_for_host, session_already_exist, no_session_for_host }; /** * @brief Create an error_code instance for the given error. * @param error The error. * @return The error_code instance. */ inline boost::system::error_code make_error_code(server_error_t error) { return boost::system::error_code(static_cast(error), server_category()); } /** * @brief Create an error_condition instance for the given error. * @param error The error. * @return The error_condition instance. */ inline boost::system::error_condition make_error_condition(server_error_t error) { return boost::system::error_condition(static_cast(error), server_category()); } } /** * @brief A server error category. */ class server_category_impl : public boost::system::error_category { public: /** * @brief Get the name of the category. * @return The name of the category. */ virtual const char* name() const throw(); /** * @brief Get the error message for a given error. * @param ev The error numeric value. * @return The message associated to the error. */ virtual std::string message(int ev) const; }; } namespace boost { namespace system { template <> struct is_error_code_enum< ::fscp::server_error::server_error_t> : public boost::true_type {}; } } #endif /* FSCP_SERVER_ERROR_HPP */ freelan-2.0/libs/fscp/include/fscp/session_message.hpp000066400000000000000000000205061252300335000231250ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file session_message.hpp * \author Julien Kauffmann * \brief A session message class. */ #ifndef FSCP_SESSION_MESSAGE_HPP #define FSCP_SESSION_MESSAGE_HPP #include #include "message.hpp" #include "buffer_tools.hpp" #include "constants.hpp" #include #include #include namespace fscp { /** * \brief A session message class. */ class session_message : public message { public: /** * \brief Write a session message to a buffer. * \param buf The buffer to write to. * \param buf_len The length of buf. * \param session_number The session number. * \param host_identifier The host identifier. * \param cs The cipher suite. * \param ec The elliptic curve. * \param pub_key The public key. * \param pub_key_len The public key length. * \param sig_key The private key to use to sign the ciphertext. * \return The count of bytes written. */ static size_t write(void* buf, size_t buf_len, session_number_type session_number, const host_identifier_type& host_identifier, cipher_suite_type cs, elliptic_curve_type ec, const void* pub_key, size_t pub_key_len, cryptoplus::pkey::pkey sig_key); /** * \brief Write a session message to a buffer using a pre-shared key. * \param buf The buffer to write to. * \param buf_len The length of buf. * \param session_number The session number. * \param host_identifier The host identifier. * \param cs The cipher suite. * \param ec The elliptic curve. * \param pub_key The public key. * \param pub_key_len The public key length. * \param pre_shared_key The pre-shared key used to sign the session message. * \param pre_shared_key_len The pre-shared key length. * \return The count of bytes written. */ static size_t write(void* buf, size_t buf_len, session_number_type session_number, const host_identifier_type& host_identifier, cipher_suite_type cs, elliptic_curve_type ec, const void* pub_key, size_t pub_key_len, const void* pre_shared_key, size_t pre_shared_key_len); /** * \brief Create a session_message from a message. * \param message The message. */ session_message(const message& message); /** * \brief Get the session number. * \return The session number. */ session_number_type session_number() const; /** * \brief Get the host identifier. * \return The host identifier. */ host_identifier_type host_identifier() const; /** * \brief Get the cipher suite. * \return The cipher suite. */ cipher_suite_type cipher_suite() const; /** * \brief Get the elliptic curve. * \return The elliptic curve. */ elliptic_curve_type elliptic_curve() const; /** * \brief Get the public key. * \return The public key. */ const uint8_t* public_key() const; /** * \brief Get the public key size. * \return The public key size. */ size_t public_key_size() const; /** * \brief Get the header size, without the signature. * \return The header size, without the signature. */ size_t header_size() const; /** * \brief Get the header signature. * \return The header signature. */ const uint8_t* header_signature() const; /** * \brief Get the header signature size. * \return The header signature size. */ size_t header_signature_size() const; /** * \brief Check if the signature matches with a given public key. * \param key The public key to use. * \return If the check fails, false is returned. */ bool check_signature(cryptoplus::pkey::pkey key) const; /** * \brief Check if the signature matches with a given public key. * \param pre_shared_key The pre-shared key used to sign the session message. * \param pre_shared_key_len The pre-shared key length. * \return If the check fails, false is returned. */ bool check_signature(const void* pre_shared_key, size_t pre_shared_key_len) const; protected: /** * \brief The min length of the body. */ static const size_t MIN_BODY_LENGTH = sizeof(session_number_type) + host_identifier_type::data_type::static_size + sizeof(uint8_t) * 4 + sizeof(uint16_t); /** * \brief Write an unsigned session message to a buffer. * \param payload The buffer to write to. * \param payload_len The length of buf. * \param session_number The session number. * \param host_identifier The host identifier. * \param cs The cipher suite. * \param ec The elliptic curve. * \param pub_key The public key. * \param pub_key_len The public key length. * \return The count of bytes written. */ static size_t write_unsigned(uint8_t* payload, size_t payload_len, session_number_type session_number, const host_identifier_type& host_identifier, cipher_suite_type cs, elliptic_curve_type ec, const void* pub_key, size_t pub_key_len); }; inline session_number_type session_message::session_number() const { return ntohl(buffer_tools::get(payload(), 0)); } inline host_identifier_type session_message::host_identifier() const { host_identifier_type result; std::copy(payload() + sizeof(session_number_type), payload() + sizeof(session_number_type) + result.data.size(), result.data.begin()); return result; } inline cipher_suite_type session_message::cipher_suite() const { return buffer_tools::get(payload(), sizeof(session_number_type) + host_identifier_type::data_type::static_size); } inline elliptic_curve_type session_message::elliptic_curve() const { return buffer_tools::get(payload(), sizeof(session_number_type) + host_identifier_type::data_type::static_size + sizeof(uint8_t)); } inline const uint8_t* session_message::public_key() const { return payload() + sizeof(session_number_type) + host_identifier_type::data_type::static_size + sizeof(uint8_t) * 2 + 2 + sizeof(uint16_t); } inline size_t session_message::public_key_size() const { return ntohs(buffer_tools::get(payload(), sizeof(session_number_type) + host_identifier_type::data_type::static_size + sizeof(uint8_t) * 2 + 2)); } inline size_t session_message::header_size() const { return sizeof(session_number_type) + host_identifier_type::data_type::static_size + sizeof(uint8_t) * 2 + 2 + sizeof(uint16_t) + public_key_size(); } inline const uint8_t* session_message::header_signature() const { return payload() + header_size() + sizeof(uint16_t); } inline size_t session_message::header_signature_size() const { return ntohs(buffer_tools::get(payload(), header_size())); } } #endif /* FSCP_SESSION_MESSAGE_HPP */ freelan-2.0/libs/fscp/include/fscp/session_request_message.hpp000066400000000000000000000201341252300335000246720ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file session_request_message.hpp * \author Julien Kauffmann * \brief A session request message class. */ #ifndef FSCP_SESSION_REQUEST_MESSAGE_HPP #define FSCP_SESSION_REQUEST_MESSAGE_HPP #include "message.hpp" #include "buffer_tools.hpp" #include "constants.hpp" #include #include #include namespace fscp { /** * \brief A session request message class. */ class session_request_message : public message { public: /** * \brief Write a session request message to a buffer. * \param buf The buffer to write to. * \param buf_len The length of buf. * \param session_number The session number. * \param host_identifier The host identifier. * \param cs_cap The cipher suite capabilities. * \param ec_cap The elliptic curve capabilities. * \param sig_key The private key to use to sign the ciphertext. * \return The count of bytes written. */ static size_t write(void* buf, size_t buf_len, session_number_type session_number, const host_identifier_type& host_identifier, const cipher_suite_list_type& cs_cap, const elliptic_curve_list_type& ec_cap, cryptoplus::pkey::pkey sig_key); /** * \brief Write a session request message to a buffer. * \param buf The buffer to write to. * \param buf_len The length of buf. * \param session_number The session number. * \param host_identifier The host identifier. * \param cs_cap The cipher suite capabilities. * \param ec_cap The elliptic curve capabilities. * \param pre_shared_key The pre-shared key used to sign the session message. * \param pre_shared_key_len The pre-shared key length. * \return The count of bytes written. */ static size_t write(void* buf, size_t buf_len, session_number_type session_number, const host_identifier_type& host_identifier, const cipher_suite_list_type& cs_cap, const elliptic_curve_list_type& ec_cap, const void* pre_shared_key, size_t pre_shared_key_len); /** * \brief Create a session_request_message from a message. * \param message The message. */ session_request_message(const message& message); /** * \brief Get the session number. * \return The session number. */ session_number_type session_number() const; /** * \brief Get the host identifier. * \return The host identifier. */ host_identifier_type host_identifier() const; /** * \brief Get the cipher suite capabilities. * \return The cipher suite capabilities. */ cipher_suite_list_type cipher_suite_capabilities() const; /** * \brief Get the elliptic curve capabilities. * \return The elliptic curve capabilities. */ elliptic_curve_list_type elliptic_curve_capabilities() const; /** * \brief Get the cipher suite capabilities size. * \return The cipher suite capabilities size. */ size_t cipher_suite_capabilities_size() const; /** * \brief Get the elliptic curve capabilities size. * \return The elliptic curve capabilities size. */ size_t elliptic_curve_capabilities_size() const; /** * \brief Get the header size, without the signature. * \return The header size, without the signature. */ size_t header_size() const; /** * \brief Get the header signature. * \return The header signature. */ const uint8_t* header_signature() const; /** * \brief Get the header signature size. * \return The header signature size. */ size_t header_signature_size() const; /** * \brief Check if the signature matches with a given public key. * \param key The public key to use. * \return If the check fails, false is returned. */ bool check_signature(cryptoplus::pkey::pkey key) const; /** * \brief Check if the signature matches with a given public key. * \param pre_shared_key The pre-shared key used to sign the session message. * \param pre_shared_key_len The pre-shared key length. * \return If the check fails, false is returned. */ bool check_signature(const void* pre_shared_key, size_t pre_shared_key_len) const; protected: /** * \brief The min length of the body. */ static const size_t MIN_BODY_LENGTH = sizeof(session_number_type) + host_identifier_type::data_type::static_size + sizeof(uint16_t) * 2; /** * \brief Write an unsigned session request message to a buffer. * \param payload The buffer to write to. * \param payload_len The length of buf. * \param session_number The session number. * \param host_identifier The host identifier. * \param cs_cap The cipher suite capabilities. * \param ec_cap The elliptic curve capabilities. * \return The count of bytes written. */ static size_t write_unsigned(uint8_t* payload, size_t payload_len, session_number_type session_number, const host_identifier_type& host_identifier, const cipher_suite_list_type& cs_cap, const elliptic_curve_list_type& ec_cap); }; inline session_number_type session_request_message::session_number() const { return ntohl(buffer_tools::get(payload(), 0)); } inline host_identifier_type session_request_message::host_identifier() const { host_identifier_type result; std::copy(payload() + sizeof(session_number_type), payload() + sizeof(session_number_type) + result.data.size(), result.data.begin()); return result; } inline size_t session_request_message::cipher_suite_capabilities_size() const { return ntohs(buffer_tools::get(payload(), sizeof(session_number_type) + host_identifier_type::data_type::static_size)); } inline size_t session_request_message::elliptic_curve_capabilities_size() const { return ntohs(buffer_tools::get(payload(), sizeof(session_number_type) + host_identifier_type::data_type::static_size + sizeof(uint16_t) + cipher_suite_capabilities_size())); } inline size_t session_request_message::header_size() const { return sizeof(session_number_type) + host_identifier_type::data_type::static_size + sizeof(uint16_t) + cipher_suite_capabilities_size() + sizeof(uint16_t) + elliptic_curve_capabilities_size(); } inline const uint8_t* session_request_message::header_signature() const { return payload() + header_size() + sizeof(uint16_t); } inline size_t session_request_message::header_signature_size() const { return ntohs(buffer_tools::get(payload(), header_size())); } } #endif /* FSCP_SESSION_REQUEST_MESSAGE_HPP */ freelan-2.0/libs/fscp/include/fscp/shared_buffer.hpp000066400000000000000000000106301252300335000225320ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file shared_buffer.hpp * \author Julien Kauffmann * \brief A shared buffer class. */ #pragma once #include #include #include #include #include namespace fscp { class SharedBuffer; boost::asio::mutable_buffers_1 buffer(const SharedBuffer&); boost::asio::mutable_buffers_1 buffer(const SharedBuffer&, size_t); template Type buffer_cast(const SharedBuffer&); size_t buffer_size(const SharedBuffer&); class SharedBuffer { public: SharedBuffer(size_t size) : m_size(size), m_data(new uint8_t[size]) {} template SharedBuffer(const SharedBuffer& buffer, Handler handler) : m_buffer(new SharedBuffer(buffer), [handler] (SharedBuffer* buf) { handler(*buf); delete buf; }) { } private: size_t m_size; boost::shared_array m_data; boost::shared_ptr m_buffer; friend inline boost::asio::mutable_buffers_1 buffer(const SharedBuffer& buf) { if (buf.m_buffer) { return buffer(*(buf.m_buffer)); } else { return boost::asio::buffer(buf.m_data.get(), buf.m_size); } } friend inline boost::asio::mutable_buffers_1 buffer(const SharedBuffer& buf, size_t size) { if (buf.m_buffer) { return buffer(*(buf.m_buffer), size); } else { return boost::asio::buffer(buf.m_data.get(), std::min(size, buf.m_size)); } } template friend inline Type buffer_cast(const SharedBuffer& buf) { if (buf.m_buffer) { return buffer_cast(*(buf.m_buffer)); } else { return boost::asio::buffer_cast(buffer(buf)); } } friend inline size_t buffer_size(const SharedBuffer& buf) { if (buf.m_buffer) { return buffer_size((*buf.m_buffer)); } else { return boost::asio::buffer_size(buffer(buf)); } } }; template class SharedBufferHandler { public: typedef void result_type; SharedBufferHandler(SharedBuffer buf, Handler handler) : m_buffer(buf), m_handler(handler) {} result_type operator()() { m_handler(); } template result_type operator()(Arg1 arg1) { m_handler(arg1); } template result_type operator()(Arg1 arg1, Arg2 arg2) { m_handler(arg1, arg2); } private: SharedBuffer m_buffer; Handler m_handler; }; template inline SharedBufferHandler make_shared_buffer_handler(SharedBuffer buf, Handler handler) { return SharedBufferHandler(buf, handler); } } freelan-2.0/libs/fscp/libfscp.vcxproj000066400000000000000000000345611252300335000177140ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {D2906D5F-3E94-4376-814D-299B8F81E195} Win32Proj libfscp StaticLibrary true v120 Unicode StaticLibrary true v120 Unicode StaticLibrary false v120 true Unicode StaticLibrary false v120 true Unicode $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) ClCompile $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) ClCompile $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) ClCompile $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) ClCompile Level3 Disabled USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;DEBUG;_WIN32_WINNT=0x0501;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\fscp 4996;4267 Windows true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 Disabled USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;DEBUG;_WIN32_WINNT=0x0501;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\fscp 4996;4267 Windows true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 MaxSpeed true true USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;_WIN32_WINNT=0x0501;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\fscp 4996;4267 Windows true true true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 MaxSpeed true true USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;_WIN32_WINNT=0x0501;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\fscp 4996;4267 Windows true true true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template freelan-2.0/libs/fscp/libfscp.vcxproj.filters000066400000000000000000000075411252300335000213610ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files freelan-2.0/libs/fscp/src/000077500000000000000000000000001252300335000154335ustar00rootroot00000000000000freelan-2.0/libs/fscp/src/buffer_tools.cpp000066400000000000000000000036441252300335000206370ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file buffer_tools.cpp * \author Julien Kauffmann * \brief Buffer manipulation tools. */ #include "buffer_tools.hpp" namespace fscp { namespace buffer_tools { } } freelan-2.0/libs/fscp/src/constants.cpp000066400000000000000000000077571252300335000201730ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file constants.cpp * \author Julien Kauffmann * \brief The constants. */ #include "constants.hpp" #include #include namespace fscp { const cipher_suite_type::value_type cipher_suite_type::unsupported = 0x00; const cipher_suite_type::value_type cipher_suite_type::ecdhe_rsa_aes128_gcm_sha256 = 0x01; const cipher_suite_type::value_type cipher_suite_type::ecdhe_rsa_aes256_gcm_sha384 = 0x02; const std::string cipher_suite_type::ecdhe_rsa_aes128_gcm_sha256_string("ecdhe_rsa_aes128_gcm_sha256"); const std::string cipher_suite_type::ecdhe_rsa_aes256_gcm_sha384_string("ecdhe_rsa_aes256_gcm_sha384"); const elliptic_curve_type::value_type elliptic_curve_type::unsupported = 0x00; const elliptic_curve_type::value_type elliptic_curve_type::sect571k1 = 0x01; const elliptic_curve_type::value_type elliptic_curve_type::secp384r1 = 0x02; const elliptic_curve_type::value_type elliptic_curve_type::secp521r1 = 0x03; const std::string elliptic_curve_type::sect571k1_string("sect571k1"); const std::string elliptic_curve_type::secp384r1_string("secp384r1"); const std::string elliptic_curve_type::secp521r1_string("secp521r1"); channel_number_type to_channel_number(message_type type) { assert(is_data_message_type(type)); return static_cast(static_cast(type) & 0x0F); } message_type to_data_message_type(channel_number_type channel_number) { assert(channel_number >= CHANNEL_NUMBER_0); assert(channel_number <= CHANNEL_NUMBER_15); return static_cast(static_cast(MESSAGE_TYPE_DATA_0) + static_cast(channel_number)); } cryptoplus::hash::message_digest_algorithm get_default_digest_algorithm() { return cryptoplus::hash::message_digest_algorithm(NID_sha256); } void get_certificate_hash(void* buf, size_t buflen, cryptoplus::x509::certificate cert) { assert(!!buf); assert(!!cert); cryptoplus::hash::message_digest_context mdctx; mdctx.initialize(get_default_digest_algorithm()); mdctx.update(cert.write_der()); mdctx.finalize(buf, buflen); } hash_type get_certificate_hash(cryptoplus::x509::certificate cert) { hash_type result; get_certificate_hash(&result.data[0], result.data.size(), cert); return result; } } freelan-2.0/libs/fscp/src/data_message.cpp000066400000000000000000000302031252300335000205520ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file data_message.cpp * \author Julien Kauffmann * \brief A data message class. */ #include "data_message.hpp" #include #include #include #include #include #include namespace fscp { namespace { typedef std::vector iv_type; iv_type compute_iv(const void* nonce_prefix, size_t nonce_prefix_len, sequence_number_type sequence_number) { iv_type result(nonce_prefix_len + sizeof(sequence_number_type)); std::copy(static_cast(nonce_prefix), static_cast(nonce_prefix) + nonce_prefix_len, result.begin()); buffer_tools::set(result.data(), nonce_prefix_len, htonl(sequence_number)); return result; } const hash_type::data_type& hash_to_data(const hash_type& hash) { return hash.data; } } using boost::make_transform_iterator; size_t data_message::write(void* buf, size_t buf_len, channel_number_type channel_number, sequence_number_type _sequence_number, data_message::calg_t cipher_algorithm, const void* _cleartext, size_t cleartext_len, const void* enc_key, size_t enc_key_len, const void* nonce_prefix, size_t nonce_prefix_len) { return raw_write(buf, buf_len, _sequence_number, cipher_algorithm, _cleartext, cleartext_len, enc_key, enc_key_len, nonce_prefix, nonce_prefix_len, to_data_message_type(channel_number)); } size_t data_message::write_keep_alive(void* buf, size_t buf_len, sequence_number_type _sequence_number, data_message::calg_t cipher_algorithm, size_t random_len, const void* enc_key, size_t enc_key_len, const void* nonce_prefix, size_t nonce_prefix_len) { const cryptoplus::buffer random = cryptoplus::random::get_random_bytes(random_len); return raw_write(buf, buf_len, _sequence_number, cipher_algorithm, cryptoplus::buffer_cast(random), cryptoplus::buffer_size(random), enc_key, enc_key_len, nonce_prefix, nonce_prefix_len, MESSAGE_TYPE_KEEP_ALIVE); } size_t data_message::write_contact_request(void* buf, size_t buf_len, sequence_number_type sequence_number, data_message::calg_t cipher_algorithm, const hash_list_type& hash_list, const void* enc_key, size_t enc_key_len, const void* nonce_prefix, size_t nonce_prefix_len) { const std::vector hash_vec(make_transform_iterator(hash_list.begin(), hash_to_data), make_transform_iterator(hash_list.end(), hash_to_data)); return raw_write(buf, buf_len, sequence_number, cipher_algorithm, hash_vec.empty() ? nullptr : reinterpret_cast(&hash_vec[0]), hash_vec.size() * hash_type::data_type::static_size, enc_key, enc_key_len, nonce_prefix, nonce_prefix_len, MESSAGE_TYPE_CONTACT_REQUEST); } size_t data_message::write_contact(void* buf, size_t buf_len, sequence_number_type _sequence_number, data_message::calg_t cipher_algorithm, const contact_map_type& contact_map, const void* enc_key, size_t enc_key_len, const void* nonce_prefix, size_t nonce_prefix_len) { std::vector cleartext; cleartext.resize(contact_map.size() * 49); std::vector::iterator ptr = cleartext.begin(); for (contact_map_type::const_iterator it = contact_map.begin(); it != contact_map.end(); ++it) { // We copy the hash ptr = std::copy(it->first.data.begin(), it->first.data.end(), ptr); if (it->second.address().is_v4()) { *(ptr++) = static_cast(ENDPOINT_TYPE_IPV4); boost::asio::ip::address_v4::bytes_type bytes = it->second.address().to_v4().to_bytes(); ptr = std::copy(bytes.begin(), bytes.end(), ptr); *(reinterpret_cast(&*ptr)) = htons(it->second.port()); ptr += sizeof(uint16_t); } else if (it->second.address().is_v6()) { *(ptr++) = static_cast(ENDPOINT_TYPE_IPV6); boost::asio::ip::address_v6::bytes_type bytes = it->second.address().to_v6().to_bytes(); ptr = std::copy(bytes.begin(), bytes.end(), ptr); *(reinterpret_cast(&*ptr)) = htons(it->second.port()); ptr += sizeof(uint16_t); } } cleartext.resize(std::distance(cleartext.begin(), ptr)); return raw_write(buf, buf_len, _sequence_number, cipher_algorithm, cleartext.empty() ? nullptr : &cleartext[0], cleartext.size(), enc_key, enc_key_len, nonce_prefix, nonce_prefix_len, MESSAGE_TYPE_CONTACT); } hash_list_type data_message::parse_hash_list(const void* buf, size_t buflen) { // Here we might loose duplicates but those are not allowed by the RFC anyway. if ((buflen / hash_type::data_type::static_size) * hash_type::data_type::static_size != buflen) { throw std::runtime_error("Invalid message structure"); } hash_list_type result; for (const uint8_t* ptr = static_cast(buf); ptr < static_cast(buf) + buflen; ptr += hash_type::data_type::static_size) { hash_type hash; std::copy(ptr, ptr + hash_type::data_type::static_size, hash.data.begin()); result.insert(hash); } return result; } contact_map_type data_message::parse_contact_map(const void* buf, size_t buflen) { contact_map_type result; for (const uint8_t* ptr = static_cast(buf); ptr < static_cast(buf) + buflen;) { hash_type hash; if (static_cast(buf) + buflen - ptr < static_cast(hash_type::data_type::static_size) + 1) { throw std::runtime_error("Invalid message structure"); } std::copy(ptr, ptr + hash_type::data_type::static_size, hash.data.begin()); ptr += hash_type::data_type::static_size; switch (static_cast(*ptr)) { case ENDPOINT_TYPE_IPV4: { ++ptr; boost::asio::ip::address_v4::bytes_type bytes; if (static_cast(buf) + buflen - ptr < static_cast(bytes.size())) { throw std::runtime_error("Invalid message structure"); } std::copy(ptr, ptr + bytes.size(), bytes.begin()); ptr += bytes.size(); result[hash] = boost::asio::ip::udp::endpoint(boost::asio::ip::address_v4(bytes), ntohs(*reinterpret_cast(ptr))); ptr += sizeof(uint16_t); break; } case ENDPOINT_TYPE_IPV6: { ++ptr; boost::asio::ip::address_v6::bytes_type bytes; if (static_cast(buf) + buflen - ptr < static_cast(bytes.size())) { throw std::runtime_error("Invalid message structure"); } std::copy(ptr, ptr + bytes.size(), bytes.begin()); ptr += bytes.size(); result[hash] = boost::asio::ip::udp::endpoint(boost::asio::ip::address_v6(bytes), ntohs(*reinterpret_cast(ptr))); ptr += sizeof(uint16_t); break; } default: { throw std::runtime_error("Invalid message structure"); } } } return result; } data_message::data_message(const void* buf, size_t buf_len) : message(buf, buf_len) { check_format(); } data_message::data_message(const message& _message) : message(_message) { check_format(); } void data_message::check_format() const { if (length() < MIN_BODY_LENGTH) { throw std::runtime_error("buf_len"); } if (length() < MIN_BODY_LENGTH + ciphertext_size()) { throw std::runtime_error("buf_len"); } } size_t data_message::get_cleartext(void* buf, size_t buf_len, data_message::calg_t cipher_algorithm, const void* enc_key, size_t enc_key_len, const void* nonce_prefix, size_t nonce_prefix_len) const { assert(enc_key); if (buf) { const iv_type iv = compute_iv(nonce_prefix, nonce_prefix_len, sequence_number()); cryptoplus::cipher::cipher_context cipher_context; // First initialization - required to set GCM specific attributes cipher_context.initialize(cipher_algorithm, cryptoplus::cipher::cipher_context::decrypt, NULL, 0, NULL); cipher_context.ctrl_set(EVP_CTRL_GCM_SET_IVLEN, static_cast(iv.size())); cipher_context.ctrl(EVP_CTRL_GCM_SET_TAG, static_cast(tag_size()), const_cast(tag())); cipher_context.initialize(data_message::calg_t(), cryptoplus::cipher::cipher_context::unchanged, enc_key, enc_key_len, iv.data()); size_t cnt = cipher_context.update(buf, buf_len, ciphertext(), ciphertext_size()); cnt += cipher_context.finalize(static_cast(buf) + cnt, buf_len - cnt); return cnt; } else { return ciphertext_size(); } } size_t data_message::raw_write(void* buf, size_t buf_len, sequence_number_type _sequence_number, data_message::calg_t cipher_algorithm, const void* _cleartext, size_t cleartext_len, const void* enc_key, size_t enc_key_len, const void* nonce_prefix, size_t nonce_prefix_len, message_type type) { assert(enc_key); const iv_type iv = compute_iv(nonce_prefix, nonce_prefix_len, _sequence_number); if (buf_len < HEADER_LENGTH + sizeof(sequence_number_type) + GCM_TAG_LENGTH + sizeof(uint16_t) + (cleartext_len + cipher_algorithm.block_size())) { throw std::runtime_error("buf_len"); } uint8_t* const payload = static_cast(buf) + HEADER_LENGTH; uint8_t* const tag = payload + sizeof(sequence_number_type); uint8_t* const ciphertext = tag + GCM_TAG_LENGTH + sizeof(uint16_t); buffer_tools::set(payload, 0, htonl(_sequence_number)); cryptoplus::cipher::cipher_context cipher_context; // First initialization - required to set GCM specific attributes cipher_context.initialize(cipher_algorithm, cryptoplus::cipher::cipher_context::encrypt, NULL, 0, NULL); cipher_context.ctrl_set(EVP_CTRL_GCM_SET_IVLEN, static_cast(iv.size())); cipher_context.initialize(data_message::calg_t(), cryptoplus::cipher::cipher_context::unchanged, enc_key, enc_key_len, iv.data()); const size_t max_ciphertext_len = buf_len - HEADER_LENGTH - sizeof(sequence_number_type) - GCM_TAG_LENGTH - sizeof(uint16_t) - cipher_algorithm.block_size(); const cryptoplus::buffer cleartext(_cleartext, cleartext_len); size_t ciphertext_len = cipher_context.update(ciphertext, max_ciphertext_len, cleartext); ciphertext_len += cipher_context.finalize(ciphertext + ciphertext_len, max_ciphertext_len - ciphertext_len); cipher_context.ctrl(EVP_CTRL_GCM_GET_TAG, GCM_TAG_LENGTH, tag); buffer_tools::set(payload, sizeof(sequence_number_type) + GCM_TAG_LENGTH, htons(static_cast(ciphertext_len))); const size_t length = sizeof(sequence_number_type) + GCM_TAG_LENGTH + sizeof(uint16_t) + ciphertext_len; return message::write(buf, buf_len, CURRENT_PROTOCOL_VERSION, type, length) + length; } } freelan-2.0/libs/fscp/src/hello_message.cpp000066400000000000000000000060741252300335000207550ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file hello_message.cpp * \author Julien Kauffmann * \brief A hello message class. */ #include "hello_message.hpp" #include #include namespace fscp { size_t hello_message::write_request(void* buf, size_t buf_len, uint32_t _unique_number) { if (buf_len < HEADER_LENGTH + BODY_LENGTH) { throw std::runtime_error("buf_len"); } buffer_tools::set(buf, HEADER_LENGTH, htonl(_unique_number)); message::write(buf, buf_len, CURRENT_PROTOCOL_VERSION, MESSAGE_TYPE_HELLO_REQUEST, BODY_LENGTH); return HEADER_LENGTH + BODY_LENGTH; } size_t hello_message::write_response(void* buf, size_t buf_len, uint32_t _unique_number) { if (buf_len < HEADER_LENGTH + BODY_LENGTH) { throw std::runtime_error("buf_len"); } buffer_tools::set(buf, HEADER_LENGTH, htonl(_unique_number)); message::write(buf, buf_len, CURRENT_PROTOCOL_VERSION, MESSAGE_TYPE_HELLO_RESPONSE, BODY_LENGTH); return HEADER_LENGTH + BODY_LENGTH; } hello_message::hello_message(const void* buf, size_t buf_len) : message(buf, buf_len) { if (length() != BODY_LENGTH) { throw std::runtime_error("bad message length"); } } hello_message::hello_message(const message& _message) : message(_message) { if (length() != BODY_LENGTH) { throw std::runtime_error("bad message length"); } } } freelan-2.0/libs/fscp/src/identity_store.cpp000066400000000000000000000045261252300335000212130ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file identity_store.cpp * \author Julien Kauffmann * \brief An identity store class. */ #include "identity_store.hpp" #include #include namespace fscp { identity_store::identity_store(identity_store::cert_type sig_cert, identity_store::key_type sig_key, const cryptoplus::buffer& psk) : m_sig_cert(sig_cert), m_sig_key(sig_key), m_pre_shared_key(psk) { assert(!!m_pre_shared_key || !!m_sig_cert); if (!!m_sig_cert) { assert(!!m_sig_key); if (!m_sig_cert.verify_private_key(m_sig_key)) { throw std::runtime_error("sig_key mismatch"); } } } } freelan-2.0/libs/fscp/src/logger.cpp000066400000000000000000000036001252300335000174150ustar00rootroot00000000000000/* * libfscp - A C++ library to establish peer-to-peer virtual private * networks. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file logger.cpp * \author Julien KAUFFMANN * \brief A logger class. */ #include "logger.hpp" namespace fscp { } freelan-2.0/libs/fscp/src/message.cpp000066400000000000000000000050651252300335000175710ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file message.cpp * \author Julien Kauffmann * \brief A generic message class. */ #include "message.hpp" #include #include namespace fscp { size_t message::write(void* buf, size_t buf_len, unsigned int _version, message_type _type, size_t _length) { if (buf_len < HEADER_LENGTH) { throw std::runtime_error("buf_len"); } buffer_tools::set(buf, 0, _version); buffer_tools::set(buf, 1, static_cast(_type)); buffer_tools::set(buf, 2, htons(static_cast(_length))); return HEADER_LENGTH; } message::message(const void* buf, size_t buf_len) : m_data(buf) { if (buf_len < HEADER_LENGTH) { throw std::runtime_error("buf_len"); } if (buf_len < HEADER_LENGTH + length()) { throw std::runtime_error("buf_len"); } } } freelan-2.0/libs/fscp/src/peer_session.cpp000066400000000000000000000137651252300335000206510ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file peer_session.cpp * \author Julien Kauffmann * \brief An peer session storage class. */ #include "peer_session.hpp" #include namespace fscp { bool peer_session::current_session_type::is_old() const { const auto max = std::numeric_limits::max() / 2; return ((local_sequence_number > max) || (remote_sequence_number > max)); } bool peer_session::set_first_remote_host_identifier(const host_identifier_type& _host_identifier) { if (!m_remote_host_identifier) { m_remote_host_identifier = _host_identifier; return true; } return (_host_identifier == *m_remote_host_identifier); } bool peer_session::prepare_session(session_number_type _session_number, cipher_suite_type _cipher_suite, elliptic_curve_type _elliptic_curve) { if (m_next_session) { if ((m_next_session->parameters.session_number == _session_number) && (m_next_session->parameters.cipher_suite == _cipher_suite) && (m_next_session->parameters.elliptic_curve == _elliptic_curve)) { // The session in preparation matches the requested one: not creating one to ensure the private DH key stays the same. return false; } } m_next_session = boost::make_shared(_session_number, _cipher_suite, _elliptic_curve); return true; } bool peer_session::complete_session(const void* _remote_public_key, size_t remote_public_key_size) { using cryptoplus::buffer_cast; if (!m_next_session || !m_remote_host_identifier) { return false; } boost::shared_ptr _current_session = boost::make_shared(m_next_session->parameters); const size_t key_length = m_next_session->parameters.cipher_suite.to_cipher_algorithm().key_length(); const auto remote_public_key = cryptoplus::buffer(_remote_public_key, remote_public_key_size); // We get the derived secret key. const auto secret_key = m_next_session->ecdhe_context.derive_secret_key(remote_public_key); _current_session->local_session_key = cryptoplus::tls::prf( key_length, buffer_cast(secret_key), buffer_size(secret_key), "session key", m_local_host_identifier.data.data(), m_local_host_identifier.data.size(), get_default_digest_algorithm() ); _current_session->remote_session_key = cryptoplus::tls::prf( key_length, buffer_cast(secret_key), buffer_size(secret_key), "session key", m_remote_host_identifier->data.data(), m_remote_host_identifier->data.size(), get_default_digest_algorithm() ); _current_session->local_nonce_prefix = cryptoplus::tls::prf( DEFAULT_NONCE_PREFIX_SIZE, buffer_cast(secret_key), buffer_size(secret_key), "nonce prefix", m_local_host_identifier.data.data(), m_local_host_identifier.data.size(), get_default_digest_algorithm() ); _current_session->remote_nonce_prefix = cryptoplus::tls::prf( DEFAULT_NONCE_PREFIX_SIZE, buffer_cast(secret_key), buffer_size(secret_key), "nonce prefix", m_remote_host_identifier->data.data(), m_remote_host_identifier->data.size(), get_default_digest_algorithm() ); m_next_session.reset(); swap(m_current_session, _current_session); keep_alive(); return true; } session_number_type peer_session::next_session_number() const { if (!has_current_session()) { return 0; } else if (!m_next_session) { return current_session().parameters.session_number + 1; } else { return m_next_session->parameters.session_number; } } const peer_session::session_parameters& peer_session::next_session_parameters() const { assert(m_next_session); return m_next_session->parameters; } const peer_session::session_parameters& peer_session::current_session_parameters() const { assert(m_current_session); return m_current_session->parameters; } bool peer_session::set_remote_sequence_number(sequence_number_type sequence_number) { if (sequence_number > m_current_session->remote_sequence_number) { m_current_session->remote_sequence_number = sequence_number; return true; } return false; } bool peer_session::clear() { clear_remote_host_identifier(); const bool result = has_current_session(); m_current_session.reset(); m_next_session.reset(); return result; } } freelan-2.0/libs/fscp/src/presentation_message.cpp000066400000000000000000000072511252300335000223630ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file presentation_message.cpp * \author Julien Kauffmann * \brief A presentation message class. */ #include "presentation_message.hpp" #include #include #include namespace fscp { size_t presentation_message::write(void* buf, size_t buf_len, presentation_message::cert_type sig_cert) { size_t sig_cert_len = !sig_cert.is_null() ? sig_cert.write_der(static_cast(0)) : 0; if (buf_len < HEADER_LENGTH + MIN_BODY_LENGTH + sig_cert_len) { throw std::runtime_error("buf_len"); } char* pbuf = static_cast(buf) + HEADER_LENGTH; buffer_tools::set(pbuf, 0, htons(static_cast(sig_cert_len))); pbuf += sizeof(uint16_t); if (!sig_cert.is_null()) { pbuf += sig_cert.write_der(pbuf); } message::write(buf, buf_len, CURRENT_PROTOCOL_VERSION, MESSAGE_TYPE_PRESENTATION, pbuf - static_cast(buf) - HEADER_LENGTH); return pbuf - static_cast(buf); } presentation_message::presentation_message(const void* buf, size_t buf_len) : message(buf, buf_len) { check_format(); } presentation_message::presentation_message(const message& _message) : message(_message) { check_format(); } presentation_message::cert_type presentation_message::signature_certificate() const { uint16_t sig_len = ntohs(buffer_tools::get(payload(), 0)); if (sig_len == 0) { return cert_type(); } else { return cert_type::from_der(payload() + sizeof(uint16_t), sig_len); } } void presentation_message::check_format() const { if (length() < MIN_BODY_LENGTH) { throw std::runtime_error("bad message length"); } uint16_t sig_len = ntohs(buffer_tools::get(payload(), 0)); if (sig_len != 0) { // Test that the certificate can be parsed. cert_type::from_der(payload() + sizeof(uint16_t), sig_len); } if (length() < MIN_BODY_LENGTH + sig_len) { throw std::runtime_error("sig_len value mismatch"); } } } freelan-2.0/libs/fscp/src/presentation_store.cpp000066400000000000000000000043251252300335000220720ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file presentation_store.cpp * \author Julien Kauffmann * \brief An presentation store class. */ #include "presentation_store.hpp" #include #include namespace fscp { presentation_store::presentation_store(presentation_store::cert_type sig_cert, const cryptoplus::buffer& psk) : m_sig_cert(sig_cert), m_sig_hash(m_sig_cert.is_null() ? boost::none : boost::optional(get_certificate_hash(m_sig_cert))), m_pre_shared_key(psk) { } } freelan-2.0/libs/fscp/src/server.cpp000066400000000000000000002404271252300335000174560ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file server.cpp * \author Julien Kauffmann * \brief The server class. */ #include "server.hpp" #include "server_error.hpp" #include "message.hpp" #include "hello_message.hpp" #include "presentation_message.hpp" #include "session_request_message.hpp" #include "session_message.hpp" #include "data_message.hpp" #include #include #include #include #include #include namespace fscp { using boost::asio::buffer; using boost::asio::buffer_cast; using boost::asio::buffer_size; namespace { void null_simple_handler(const boost::system::error_code&) {} void null_multiple_endpoints_handler(const std::map&) {} server::ep_type normalize(const server::ep_type& ep) { server::ep_type result = ep; // If the endpoint is an IPv4 mapped address, return a real IPv4 address if (result.address().is_v6()) { boost::asio::ip::address_v6 address = result.address().to_v6(); if (address.is_v4_mapped()) { result = server::ep_type(address.to_v4(), result.port()); } } return result; } template class causal_handler { private: class automatic_caller : public boost::noncopyable { public: automatic_caller(CausalHandler& _handler) : m_auto_handler(_handler) { } ~automatic_caller() { m_auto_handler(); } private: CausalHandler& m_auto_handler; }; public: typedef void result_type; causal_handler(Handler _handler, CausalHandler _causal_handler) : m_handler(_handler), m_causal_handler(_causal_handler) {} result_type operator()() { automatic_caller ac(m_causal_handler); m_handler(); } template result_type operator()(Arg1 arg1) { automatic_caller ac(m_causal_handler); m_handler(arg1); } template result_type operator()(Arg1 arg1, Arg2 arg2) { automatic_caller ac(m_causal_handler); m_handler(arg1, arg2); } private: Handler m_handler; CausalHandler m_causal_handler; }; template inline causal_handler make_causal_handler(Handler _handler, CausalHandler _causal_handler) { return causal_handler(_handler, _causal_handler); } template class results_gatherer { public: typedef std::set set_type; typedef std::map map_type; results_gatherer(Handler handler, const set_type& keys) : m_handler(handler), m_keys(keys) { if (m_keys.empty()) { m_handler(m_results); } } void gather(const KeyType& key, const ValueType& value) { boost::mutex::scoped_lock lock(m_mutex); const size_t erased_count = m_keys.erase(key); // Ensure that gather was called only once for a given key. assert(erased_count == 1); m_results[key] = value; if (m_keys.empty()) { m_handler(m_results); } } private: boost::mutex m_mutex; Handler m_handler; set_type m_keys; map_type m_results; }; bool compare_certificates(const server::cert_type& lhs, const server::cert_type& rhs) { if (!!lhs && !!rhs) { return (lhs.write_der() == rhs.write_der()); } else { return (!lhs && !rhs); } } } // Public methods server::server(boost::asio::io_service& io_service, fscp::logger& _logger, const identity_store& identity) : m_logger(_logger), m_identity_store(identity), m_socket(io_service), m_socket_strand(io_service), m_write_queue_strand(io_service), m_greet_strand(io_service), m_accept_hello_messages_default(true), m_hello_message_received_handler(), m_presentation_strand(io_service), m_presentation_message_received_handler(), m_session_strand(io_service), m_accept_session_request_messages_default(true), m_cipher_suites(get_default_cipher_suites()), m_elliptic_curves(get_default_elliptic_curves()), m_session_request_message_received_handler(), m_accept_session_messages_default(true), m_session_message_received_handler(), m_session_failed_handler(), m_session_error_handler(), m_session_established_handler(), m_session_lost_handler(), m_contact_strand(io_service), m_data_received_handler(), m_contact_request_message_received_handler(), m_contact_message_received_handler(), m_keep_alive_timer(io_service, SESSION_KEEP_ALIVE_PERIOD) { // These calls are needed in C++03 to ensure that static initializations are done in a single thread. server_category(); } identity_store server::sync_get_identity() { typedef boost::promise promise_type; promise_type promise; void (promise_type::*setter)(const identity_store&) = &promise_type::set_value; async_get_identity(boost::bind(setter, &promise, _1)); return promise.get_future().get(); } void server::sync_set_identity(const identity_store& identity) { typedef boost::promise promise_type; promise_type promise; async_set_identity(identity, boost::bind(&promise_type::set_value, &promise)); return promise.get_future().wait(); } void server::open(const ep_type& listen_endpoint) { m_socket.open(listen_endpoint.protocol()); if (listen_endpoint.address().is_v6()) { // We accept both IPv4 and IPv6 addresses m_socket.set_option(boost::asio::ip::v6_only(false)); } m_socket.bind(listen_endpoint); async_receive_from(); m_keep_alive_timer.async_wait(m_session_strand.wrap(boost::bind(&server::do_check_keep_alive, this, boost::asio::placeholders::error))); } void server::close() { cancel_all_greetings(); m_keep_alive_timer.cancel(); m_socket.close(); } void server::async_greet(const ep_type& target, duration_handler_type handler, const boost::posix_time::time_duration& timeout) { m_greet_strand.post(boost::bind(&server::do_greet, this, normalize(target), handler, timeout)); } void server::sync_set_accept_hello_messages_default(bool value) { typedef boost::promise promise_type; promise_type promise; async_set_accept_hello_messages_default(value, boost::bind(&promise_type::set_value, &promise)); return promise.get_future().wait(); } void server::sync_set_hello_message_received_callback(hello_message_received_handler_type callback) { typedef boost::promise promise_type; promise_type promise; async_set_hello_message_received_callback(callback, boost::bind(&promise_type::set_value, &promise)); return promise.get_future().wait(); } void server::async_introduce_to(const ep_type& target, simple_handler_type handler) { m_socket_strand.post(boost::bind(&server::do_introduce_to, this, normalize(target), handler)); } boost::system::error_code server::sync_introduce_to(const ep_type& target) { typedef boost::promise promise_type; promise_type promise; void (promise_type::*setter)(const boost::system::error_code&) = &promise_type::set_value; async_introduce_to(target, boost::bind(setter, &promise, _1)); return promise.get_future().get(); } void server::async_reintroduce_to_all(multiple_endpoints_handler_type handler) { m_presentation_strand.post(boost::bind(&server::do_reintroduce_to_all, this, handler)); } std::map server::sync_reintroduce_to_all() { typedef std::map result_type; typedef boost::promise promise_type; promise_type promise; void (promise_type::*setter)(const result_type&) = &promise_type::set_value; async_reintroduce_to_all(boost::bind(setter, &promise, _1)); return promise.get_future().get(); } boost::optional server::get_presentation(const ep_type& target) { const presentation_store_map::const_iterator item = m_presentation_store_map.find(target); if (item != m_presentation_store_map.end()) { return boost::make_optional(item->second); } else { return boost::optional(); } } void server::async_get_presentation(const ep_type& target, optional_presentation_store_handler_type handler) { m_presentation_strand.post(boost::bind(&server::do_get_presentation, this, normalize(target), handler)); } boost::optional server::sync_get_presentation(const ep_type& target) { typedef boost::promise > promise_type; promise_type promise; void (promise_type::*setter)(const boost::optional&) = &promise_type::set_value; async_get_presentation(target, boost::bind(setter, &promise, _1)); return promise.get_future().get(); } void server::set_presentation(const ep_type& target, cert_type signature_certificate, const cryptoplus::buffer& pre_shared_key) { m_presentation_store_map[target] = presentation_store(signature_certificate, pre_shared_key); } void server::async_set_presentation(const ep_type& target, cert_type signature_certificate, const cryptoplus::buffer& pre_shared_key, void_handler_type handler) { m_presentation_strand.post(boost::bind(&server::do_set_presentation, this, normalize(target), signature_certificate, pre_shared_key, handler)); } void server::sync_set_presentation(const ep_type& target, cert_type signature_certificate, const cryptoplus::buffer& pre_shared_key) { typedef boost::promise promise_type; promise_type promise; async_set_presentation(target, signature_certificate, pre_shared_key, boost::bind(&promise_type::set_value, &promise)); return promise.get_future().wait(); } void server::clear_presentation(const ep_type& target) { m_presentation_store_map.erase(target); } void server::async_clear_presentation(const ep_type& target, void_handler_type handler) { m_presentation_strand.post(boost::bind(&server::do_clear_presentation, this, normalize(target), handler)); } void server::sync_clear_presentation(const ep_type& target) { typedef boost::promise promise_type; promise_type promise; async_clear_presentation(target, boost::bind(&promise_type::set_value, &promise)); return promise.get_future().wait(); } void server::sync_set_presentation_message_received_callback(presentation_message_received_handler_type callback) { typedef boost::promise promise_type; promise_type promise; async_set_presentation_message_received_callback(callback, boost::bind(&promise_type::set_value, &promise)); return promise.get_future().wait(); } void server::async_request_session(const ep_type& target, simple_handler_type handler) { async_get_identity(m_session_strand.wrap(boost::bind(&server::do_request_session, this, _1, normalize(target), handler))); } void server::async_close_session(const ep_type& target, simple_handler_type handler) { m_session_strand.post(boost::bind(&server::do_close_session, this, normalize(target), handler)); } boost::system::error_code server::sync_close_session(const ep_type& target) { typedef boost::promise promise_type; promise_type promise; void (promise_type::*setter)(const boost::system::error_code&) = &promise_type::set_value; async_close_session(target, boost::bind(setter, &promise, _1)); return promise.get_future().get(); } std::set server::sync_get_session_endpoints() { typedef std::set result_type; typedef boost::promise promise_type; promise_type promise; void (promise_type::*setter)(const result_type&) = &promise_type::set_value; async_get_session_endpoints(boost::bind(setter, &promise, _1)); return promise.get_future().get(); } bool server::sync_has_session_with_endpoint(const ep_type& host) { typedef bool result_type; typedef boost::promise promise_type; promise_type promise; void (promise_type::*setter)(const result_type&) = &promise_type::set_value; async_has_session_with_endpoint(host, boost::bind(setter, &promise, _1)); return promise.get_future().get(); } boost::system::error_code server::sync_request_session(const ep_type& target) { typedef boost::promise promise_type; promise_type promise; void (promise_type::*setter)(const boost::system::error_code&) = &promise_type::set_value; async_request_session(target, boost::bind(setter, &promise, _1)); return promise.get_future().get(); } void server::sync_set_accept_session_request_messages_default(bool value) { typedef boost::promise promise_type; promise_type promise; async_set_accept_session_request_messages_default(value, boost::bind(&promise_type::set_value, &promise)); return promise.get_future().wait(); } void server::sync_set_cipher_suites(const cipher_suite_list_type& cipher_suites) { typedef boost::promise promise_type; promise_type promise; async_set_cipher_suites(cipher_suites, boost::bind(&promise_type::set_value, &promise)); return promise.get_future().wait(); } void server::sync_set_elliptic_curves(const elliptic_curve_list_type& elliptic_curves) { typedef boost::promise promise_type; promise_type promise; async_set_elliptic_curves(elliptic_curves, boost::bind(&promise_type::set_value, &promise)); return promise.get_future().wait(); } void server::sync_set_session_request_message_received_callback(session_request_received_handler_type callback) { typedef boost::promise promise_type; promise_type promise; async_set_session_request_message_received_callback(callback, boost::bind(&promise_type::set_value, &promise)); return promise.get_future().wait(); } void server::sync_set_accept_session_messages_default(bool value) { typedef boost::promise promise_type; promise_type promise; async_set_accept_session_messages_default(value, boost::bind(&promise_type::set_value, &promise)); return promise.get_future().wait(); } void server::sync_set_session_message_received_callback(session_received_handler_type callback) { typedef boost::promise promise_type; promise_type promise; async_set_session_message_received_callback(callback, boost::bind(&promise_type::set_value, &promise)); return promise.get_future().wait(); } void server::sync_set_session_failed_callback(session_failed_handler_type callback) { typedef boost::promise promise_type; promise_type promise; async_set_session_failed_callback(callback, boost::bind(&promise_type::set_value, &promise)); return promise.get_future().wait(); } void server::sync_set_session_error_callback(session_error_handler_type callback) { typedef boost::promise promise_type; promise_type promise; async_set_session_error_callback(callback, boost::bind(&promise_type::set_value, &promise)); return promise.get_future().wait(); } void server::sync_set_session_established_callback(session_established_handler_type callback) { typedef boost::promise promise_type; promise_type promise; async_set_session_established_callback(callback, boost::bind(&promise_type::set_value, &promise)); return promise.get_future().wait(); } void server::sync_set_session_lost_callback(session_lost_handler_type callback) { typedef boost::promise promise_type; promise_type promise; async_set_session_lost_callback(callback, boost::bind(&promise_type::set_value, &promise)); return promise.get_future().wait(); } void server::async_send_data(const ep_type& target, channel_number_type channel_number, boost::asio::const_buffer data, simple_handler_type handler) { m_session_strand.post(boost::bind(&server::do_send_data, this, normalize(target), channel_number, data, handler)); } boost::system::error_code server::sync_send_data(const ep_type& target, channel_number_type channel_number, boost::asio::const_buffer data) { typedef boost::promise promise_type; promise_type promise; void (promise_type::*setter)(const boost::system::error_code&) = &promise_type::set_value; async_send_data(target, channel_number, data, boost::bind(setter, &promise, _1)); return promise.get_future().get(); } void server::async_send_data_to_list(const std::set& targets, channel_number_type channel_number, boost::asio::const_buffer data, multiple_endpoints_handler_type handler) { const std::set normalized_targets(boost::make_transform_iterator(targets.begin(), normalize), boost::make_transform_iterator(targets.end(), normalize)); m_session_strand.post(boost::bind(&server::do_send_data_to_list, this, normalized_targets, channel_number, data, handler)); } std::map server::sync_send_data_to_list(const std::set& targets, channel_number_type channel_number, boost::asio::const_buffer data) { typedef std::map result_type; typedef boost::promise promise_type; promise_type promise; void (promise_type::*setter)(const result_type&) = &promise_type::set_value; async_send_data_to_list(targets, channel_number, data, boost::bind(setter, &promise, _1)); return promise.get_future().get(); } std::map server::sync_send_data_to_all(channel_number_type channel_number, boost::asio::const_buffer data) { typedef std::map result_type; typedef boost::promise promise_type; promise_type promise; void (promise_type::*setter)(const result_type&) = &promise_type::set_value; async_send_data_to_all(channel_number, data, boost::bind(setter, &promise, _1)); return promise.get_future().get(); } void server::async_send_contact_request(const ep_type& target, const hash_list_type& hash_list, simple_handler_type handler) { m_session_strand.post(boost::bind(&server::do_send_contact_request, this, normalize(target), hash_list, handler)); } boost::system::error_code server::sync_send_contact_request(const ep_type& target, const hash_list_type& hash_list) { typedef boost::promise promise_type; promise_type promise; void (promise_type::*setter)(const boost::system::error_code&) = &promise_type::set_value; async_send_contact_request(target, hash_list, boost::bind(setter, &promise, _1)); return promise.get_future().get(); } void server::async_send_contact_request_to_list(const std::set& targets, const hash_list_type& hash_list, multiple_endpoints_handler_type handler) { const std::set normalized_targets(boost::make_transform_iterator(targets.begin(), normalize), boost::make_transform_iterator(targets.end(), normalize)); m_session_strand.post(boost::bind(&server::do_send_contact_request_to_list, this, normalized_targets, hash_list, handler)); } std::map server::sync_send_contact_request_to_list(const std::set& targets, const hash_list_type& hash_list) { typedef std::map result_type; typedef boost::promise promise_type; promise_type promise; void (promise_type::*setter)(const result_type&) = &promise_type::set_value; async_send_contact_request_to_list(targets, hash_list, boost::bind(setter, &promise, _1)); return promise.get_future().get(); } std::map server::sync_send_contact_request_to_all(const hash_list_type& hash_list) { typedef std::map result_type; typedef boost::promise promise_type; promise_type promise; void (promise_type::*setter)(const result_type&) = &promise_type::set_value; async_send_contact_request_to_all(hash_list, boost::bind(setter, &promise, _1)); return promise.get_future().get(); } void server::async_send_contact(const ep_type& target, const contact_map_type& contact_map, simple_handler_type handler) { m_session_strand.post(boost::bind(&server::do_send_contact, this, normalize(target), contact_map, handler)); } boost::system::error_code server::sync_send_contact(const ep_type& target, const contact_map_type& contact_map) { typedef boost::promise promise_type; promise_type promise; void (promise_type::*setter)(const boost::system::error_code&) = &promise_type::set_value; async_send_contact(target, contact_map, boost::bind(setter, &promise, _1)); return promise.get_future().get(); } void server::async_send_contact_to_list(const std::set& targets, const contact_map_type& contact_map, multiple_endpoints_handler_type handler) { const std::set normalized_targets(boost::make_transform_iterator(targets.begin(), normalize), boost::make_transform_iterator(targets.end(), normalize)); m_session_strand.post(boost::bind(&server::do_send_contact_to_list, this, normalized_targets, contact_map, handler)); } std::map server::sync_send_contact_to_list(const std::set& targets, const contact_map_type& contact_map) { typedef std::map result_type; typedef boost::promise promise_type; promise_type promise; void (promise_type::*setter)(const result_type&) = &promise_type::set_value; async_send_contact_to_list(targets, contact_map, boost::bind(setter, &promise, _1)); return promise.get_future().get(); } std::map server::sync_send_contact_to_all(const contact_map_type& contact_map) { typedef std::map result_type; typedef boost::promise promise_type; promise_type promise; void (promise_type::*setter)(const result_type&) = &promise_type::set_value; async_send_contact_to_all(contact_map, boost::bind(setter, &promise, _1)); return promise.get_future().get(); } void server::sync_set_data_received_callback(data_received_handler_type callback) { typedef boost::promise promise_type; promise_type promise; async_set_data_received_callback(callback, boost::bind(&promise_type::set_value, &promise)); return promise.get_future().wait(); } void server::sync_set_contact_request_received_callback(contact_request_received_handler_type callback) { typedef boost::promise promise_type; promise_type promise; async_set_contact_request_received_callback(callback, boost::bind(&promise_type::set_value, &promise)); return promise.get_future().wait(); } void server::sync_set_contact_received_callback(contact_received_handler_type callback) { typedef boost::promise promise_type; promise_type promise; async_set_contact_received_callback(callback, boost::bind(&promise_type::set_value, &promise)); return promise.get_future().wait(); } // Private methods void server::do_get_identity(identity_handler_type handler) { // do_set_identity() is executed within the socket strand so this is safe. handler(get_identity()); } void server::do_set_identity(const identity_store& identity, void_handler_type handler) { // do_set_identity() is executed within the socket strand so this is safe. set_identity(identity); async_reintroduce_to_all(&null_multiple_endpoints_handler); if (handler) { handler(); } } void server::do_async_receive_from() { // do_async_receive_from() is executed within the socket strand so this is safe. boost::shared_ptr sender = boost::make_shared(); // Get either a new buffer or an old, recycled one if possible. const SharedBuffer receive_buffer = m_socket_buffers.empty() ? SharedBuffer(65536) : [this]() { const auto result = m_socket_buffers.front(); m_socket_buffers.pop_front(); return result; }(); m_socket.async_receive_from( buffer(receive_buffer), *sender, boost::bind( &server::handle_receive_from, this, get_identity(), sender, SharedBuffer(receive_buffer, [this](const SharedBuffer& buffer) { m_socket_strand.post([this, buffer]() { m_socket_buffers.push_back(buffer); }); }), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred ) ); } void server::handle_receive_from(const identity_store& identity, boost::shared_ptr sender, SharedBuffer data, const boost::system::error_code& ec, size_t bytes_received) { assert(sender); if (ec != boost::asio::error::operation_aborted) { // Let's read again ! async_receive_from(); *sender = normalize(*sender); if (!ec) { try { message message(buffer_cast(data), bytes_received); switch (message.type()) { case MESSAGE_TYPE_DATA_0: case MESSAGE_TYPE_DATA_1: case MESSAGE_TYPE_DATA_2: case MESSAGE_TYPE_DATA_3: case MESSAGE_TYPE_DATA_4: case MESSAGE_TYPE_DATA_5: case MESSAGE_TYPE_DATA_6: case MESSAGE_TYPE_DATA_7: case MESSAGE_TYPE_DATA_8: case MESSAGE_TYPE_DATA_9: case MESSAGE_TYPE_DATA_10: case MESSAGE_TYPE_DATA_11: case MESSAGE_TYPE_DATA_12: case MESSAGE_TYPE_DATA_13: case MESSAGE_TYPE_DATA_14: case MESSAGE_TYPE_DATA_15: case MESSAGE_TYPE_CONTACT_REQUEST: case MESSAGE_TYPE_CONTACT: case MESSAGE_TYPE_KEEP_ALIVE: { data_message data_message(message); m_session_strand.post( make_shared_buffer_handler( data, boost::bind( &server::do_handle_data, this, identity, *sender, data_message ) ) ); break; } case MESSAGE_TYPE_HELLO_REQUEST: case MESSAGE_TYPE_HELLO_RESPONSE: { hello_message hello_message(message); handle_hello_message_from(hello_message, *sender); break; } case MESSAGE_TYPE_PRESENTATION: { presentation_message presentation_message(message); handle_presentation_message_from(identity, presentation_message, *sender); break; } case MESSAGE_TYPE_SESSION_REQUEST: { session_request_message session_request_message(message); m_presentation_strand.post( boost::bind( &server::do_handle_session_request, this, data, identity, *sender, session_request_message ) ); break; } case MESSAGE_TYPE_SESSION: { session_message session_message(message); m_presentation_strand.post( boost::bind( &server::do_handle_session, this, data, identity, *sender, session_message ) ); break; } default: { break; } } } catch (std::runtime_error&) { // These errors can happen in normal situations (for instance when a crypto operation fails due to invalid input). } } else if (ec == boost::asio::error::connection_refused) { // The host refused the connection, meaning it closed its socket so we can force-terminate the session. async_close_session(*sender, &null_simple_handler); } } } void server::push_write(void_handler_type handler) { // All push_write() calls are done in the same strand so the following is thread-safe. if (m_write_queue.empty()) { // Nothing is being written, lets start the write immediately. m_socket_strand.post(make_causal_handler(handler, m_write_queue_strand.wrap(boost::bind(&server::pop_write, this)))); } m_write_queue.push(handler); } void server::pop_write() { // All pop_write() calls are done in the same strand so the following is thread-safe. m_write_queue.pop(); if (!m_write_queue.empty()) { m_socket_strand.post(make_causal_handler(m_write_queue.front(), m_write_queue_strand.wrap(boost::bind(&server::pop_write, this)))); } } server::ep_type server::to_socket_format(const server::ep_type& ep) { #ifdef WINDOWS if (m_socket.local_endpoint().address().is_v6() && ep.address().is_v4()) { return server::ep_type(boost::asio::ip::address_v6::v4_mapped(ep.address().to_v4()), ep.port()); } else { return ep; } #else static_cast(ep); return ep; #endif } uint32_t server::ep_hello_context_type::generate_unique_number() { // The first call to this function is *NOT* thread-safe in C++03 ! static boost::mt19937 rng(static_cast(time(0))); return rng(); } server::ep_hello_context_type::ep_hello_context_type() : m_current_hello_unique_number(generate_unique_number()) { } uint32_t server::ep_hello_context_type::next_hello_unique_number() { return m_current_hello_unique_number++; } template void server::ep_hello_context_type::async_wait_reply(boost::asio::io_service& io_service, uint32_t hello_unique_number, const boost::posix_time::time_duration& timeout, WaitHandler handler) { const boost::shared_ptr timer = boost::make_shared(boost::ref(io_service), timeout); m_pending_requests[hello_unique_number] = pending_request_status(timer); timer->async_wait(handler); } bool server::ep_hello_context_type::cancel_reply_wait(uint32_t hello_unique_number, bool success) { pending_requests_map::iterator request = m_pending_requests.find(hello_unique_number); if (request != m_pending_requests.end()) { if (request->second.timer->cancel() > 0) { // At least one handler was cancelled which means we can set the success flag. request->second.success = success; return true; } } return false; } void server::ep_hello_context_type::cancel_all_reply_wait() { for (pending_requests_map::iterator request = m_pending_requests.begin(); request != m_pending_requests.end(); ++request) { if (request->second.timer->cancel() > 0) { // At least one handler was cancelled which means we can set the success flag. request->second.success = false; } } } bool server::ep_hello_context_type::remove_reply_wait(uint32_t hello_unique_number, boost::posix_time::time_duration& duration) { pending_requests_map::iterator request = m_pending_requests.find(hello_unique_number); assert(request != m_pending_requests.end()); const bool result = request->second.success; duration = boost::posix_time::microsec_clock::universal_time() - request->second.start_date; m_pending_requests.erase(request); return result; } void server::do_greet(const ep_type& target, duration_handler_type handler, const boost::posix_time::time_duration& timeout) { if (!m_socket.is_open()) { handler(server_error::server_offline, boost::posix_time::time_duration()); return; } // All do_greet() calls are done in the same strand so the following is thread-safe. ep_hello_context_type& ep_hello_context = m_ep_hello_contexts[target]; const uint32_t hello_unique_number = ep_hello_context.next_hello_unique_number(); const auto send_buffer = SharedBuffer(16); const size_t size = hello_message::write_request(buffer_cast(send_buffer), buffer_size(send_buffer), hello_unique_number); async_send_to( send_buffer, size, target, m_greet_strand.wrap([this, target, hello_unique_number, handler, timeout](const boost::system::error_code& ec) { do_greet_handler(target, hello_unique_number, handler, timeout, ec); }) ); } void server::do_greet_handler(const ep_type& target, uint32_t hello_unique_number, duration_handler_type handler, const boost::posix_time::time_duration& timeout, const boost::system::error_code& ec) { if (ec) { handler(ec, boost::posix_time::time_duration()); return; } // All do_greet() calls are done in the same strand so the following is thread-safe. ep_hello_context_type& ep_hello_context = m_ep_hello_contexts[target]; ep_hello_context.async_wait_reply(get_io_service(), hello_unique_number, timeout, m_greet_strand.wrap(boost::bind(&server::do_greet_timeout, this, target, hello_unique_number, handler, _1))); } void server::do_greet_timeout(const ep_type& target, uint32_t hello_unique_number, duration_handler_type handler, const boost::system::error_code& ec) { // All do_greet_timeout() calls are done in the same strand so the following is thread-safe. ep_hello_context_type& ep_hello_context = m_ep_hello_contexts[target]; boost::posix_time::time_duration duration; const bool success = ep_hello_context.remove_reply_wait(hello_unique_number, duration); if (ec == boost::asio::error::operation_aborted) { // The timer was aborted, which means we received a reply or the server was shut down. if (success) { // The success flag is set: the timer was cancelled due to a reply. handler(server_error::success, duration); return; } } else if (!ec) { // The timer timed out: replacing the error code. handler(server_error::hello_request_timed_out, duration); return; } handler(ec, duration); } void server::do_cancel_all_greetings() { // All do_cancel_all_greetings() calls are done in the same strand so the following is thread-safe. for (ep_hello_context_map::iterator hello_context = m_ep_hello_contexts.begin(); hello_context != m_ep_hello_contexts.end(); ++hello_context) { hello_context->second.cancel_all_reply_wait(); } } void server::handle_hello_message_from(const hello_message& _hello_message, const ep_type& sender) { switch (_hello_message.type()) { case MESSAGE_TYPE_HELLO_REQUEST: { // We need to handle the response in the proper strand to avoid race conditions. m_greet_strand.post(boost::bind(&server::do_handle_hello_request, this, sender, _hello_message.unique_number())); break; } case MESSAGE_TYPE_HELLO_RESPONSE: { // We need to handle the response in the proper strand to avoid race conditions. m_greet_strand.post(boost::bind(&server::do_handle_hello_response, this, sender, _hello_message.unique_number())); break; } default: { // This should never happen. assert(false); break; } } } void server::do_handle_hello_request(const ep_type& sender, uint32_t hello_unique_number) { // All do_handle_hello_request() calls are done in the same strand so the following is thread-safe. bool can_reply = m_accept_hello_messages_default; if (m_hello_message_received_handler) { can_reply = m_hello_message_received_handler(sender, can_reply); } if (can_reply) { const auto send_buffer = SharedBuffer(16); const size_t size = hello_message::write_response(buffer_cast(send_buffer), buffer_size(send_buffer), hello_unique_number); async_send_to( send_buffer, size, sender, [](const boost::system::error_code&) {} ); } } void server::do_handle_hello_response(const ep_type& sender, uint32_t hello_unique_number) { // All do_handle_hello_response() calls are done in the same strand so the following is thread-safe. ep_hello_context_type& ep_hello_context = m_ep_hello_contexts[sender]; ep_hello_context.cancel_reply_wait(hello_unique_number, true); } void server::do_set_accept_hello_messages_default(bool value, void_handler_type handler) { // All do_set_accept_hello_messages_default() calls are done in the same strand so the following is thread-safe. set_accept_hello_messages_default(value); if (handler) { handler(); } } void server::do_set_hello_message_received_callback(hello_message_received_handler_type callback, void_handler_type handler) { // All do_set_hello_message_received_callback() calls are done in the same strand so the following is thread-safe. set_hello_message_received_callback(callback); if (handler) { handler(); } } bool server::has_presentation_store_for(const ep_type& ep) const { // This method should only be called from within the presentation strand. presentation_store_map::const_iterator presentation_store = m_presentation_store_map.find(ep); if (presentation_store != m_presentation_store_map.end()) { return !(presentation_store->second.empty()); } return false; } void server::do_introduce_to(const ep_type& target, simple_handler_type handler) { // All do_introduce_to() calls are done in the same strand so the following is thread-safe. if (!m_socket.is_open()) { handler(server_error::server_offline); return; } const identity_store& identity = get_identity(); const auto send_buffer = SharedBuffer(4096); try { const size_t size = presentation_message::write( buffer_cast(send_buffer), buffer_size(send_buffer), identity.signature_certificate() ); async_send_to( send_buffer, size, target, handler ); } catch (const boost::system::system_error& ex) { handler(ex.code()); } } void server::do_reintroduce_to_all(multiple_endpoints_handler_type handler) { // All do_reintroduce_to_all() calls are done in the same strand so the following is thread-safe. typedef results_gatherer results_gatherer_type; results_gatherer_type::set_type targets; for (presentation_store_map::const_iterator presentation_store = m_presentation_store_map.begin(); presentation_store != m_presentation_store_map.end(); ++presentation_store) { targets.insert(presentation_store->first); } boost::shared_ptr rg = boost::make_shared(handler, targets); for (presentation_store_map::const_iterator presentation_store = m_presentation_store_map.begin(); presentation_store != m_presentation_store_map.end(); ++presentation_store) { async_introduce_to(presentation_store->first, boost::bind(&results_gatherer_type::gather, rg, presentation_store->first, _1)); } } void server::do_get_presentation(const ep_type& target, optional_presentation_store_handler_type handler) { // All do_get_presentation() calls are done in the same strand so the following is thread-safe. handler(get_presentation(target)); } void server::do_set_presentation(const ep_type& target, cert_type signature_certificate, const cryptoplus::buffer& pre_shared_key, void_handler_type handler) { // All do_set_presentation() calls are done in the same strand so the following is thread-safe. set_presentation(target, signature_certificate, pre_shared_key); if (handler) { handler(); } } void server::do_clear_presentation(const ep_type& target, void_handler_type handler) { // All do_set_presentation() calls are done in the same strand so the following is thread-safe. clear_presentation(target); if (handler) { handler(); } } void server::handle_presentation_message_from(const identity_store& identity, const presentation_message& _presentation_message, const ep_type& sender) { const auto signature_certificate = _presentation_message.signature_certificate(); async_has_session_with_endpoint(sender, [this, identity, sender, signature_certificate](bool has_session) { m_presentation_strand.post( boost::bind( &server::do_handle_presentation, this, identity, sender, has_session, signature_certificate ) ); }); } void server::do_handle_presentation(const identity_store& identity, const ep_type& sender, bool has_session, cert_type signature_certificate) { // All do_handle_presentation() calls are done in the same strand so the following is thread-safe. presentation_status_type presentation_status = PS_FIRST; const presentation_store_map::iterator entry = m_presentation_store_map.find(sender); if (entry != m_presentation_store_map.end()) { if (compare_certificates(entry->second.signature_certificate(), signature_certificate)) { presentation_status = PS_SAME; } else { presentation_status = PS_NEW; } } if (m_presentation_message_received_handler) { if (!m_presentation_message_received_handler(sender, signature_certificate, presentation_status, has_session)) { return; } } m_presentation_store_map[sender] = presentation_store(signature_certificate, identity.pre_shared_key()); } void server::do_set_presentation_message_received_callback(presentation_message_received_handler_type callback, void_handler_type handler) { // All do_set_presentation_message_received_callback() calls are done in the same strand so the following is thread-safe. set_presentation_message_received_callback(callback); if (handler) { handler(); } } cipher_suite_type server::get_first_common_supported_cipher_suite(const cipher_suite_list_type& reference, const cipher_suite_list_type& capabilities, cipher_suite_type default_value = cipher_suite_type::unsupported) { for (auto&& cs : reference) { if (std::find(capabilities.begin(), capabilities.end(), cs) != capabilities.end()) { return cs; } } return default_value; } elliptic_curve_type server::get_first_common_supported_elliptic_curve(const elliptic_curve_list_type& reference, const elliptic_curve_list_type& capabilities, elliptic_curve_type default_value = elliptic_curve_type::unsupported) { for (auto&& cs : reference) { if (std::find(capabilities.begin(), capabilities.end(), cs) != capabilities.end()) { return cs; } } return default_value; } void server::do_request_session(const identity_store& identity, const ep_type& target, simple_handler_type handler) { // All do_request_session() calls are done in the session strand so the following is thread-safe. if (!m_socket.is_open()) { handler(server_error::server_offline); return; } peer_session& p_session = m_peer_sessions[target]; if (p_session.has_current_session()) { handler(server_error::session_already_exist); return; } const SharedBuffer send_buffer = m_session_buffers.empty() ? SharedBuffer(65536) : [this]() { const auto result = m_session_buffers.front(); m_session_buffers.pop_front(); return result; }(); try { const auto next_session_number = p_session.next_session_number(); const auto local_host_identifier = p_session.local_host_identifier(); m_logger(log_level::trace) << "Sending session request message to " << target << " (next_session_number: " << next_session_number << ", local_host_identifier: " << local_host_identifier << ")"; size_t size = 0; if (!!identity.signature_key()) { size = session_request_message::write( buffer_cast(send_buffer), buffer_size(send_buffer), next_session_number, local_host_identifier, m_cipher_suites, m_elliptic_curves, identity.signature_key() ); } else { size = session_request_message::write( buffer_cast(send_buffer), buffer_size(send_buffer), next_session_number, local_host_identifier, m_cipher_suites, m_elliptic_curves, buffer_cast(identity.pre_shared_key()), buffer_size(identity.pre_shared_key()) ); } async_send_to( SharedBuffer(send_buffer, [this](const SharedBuffer& buffer) { m_session_strand.post([this, buffer]() { m_session_buffers.push_back(buffer); }); }), size, target, handler ); } catch (const boost::system::system_error& ex) { handler(ex.code()); } } void server::do_close_session(const ep_type& target, simple_handler_type handler) { // All do_close_session() calls are done in the same strand so the following is thread-safe. if (m_peer_sessions[target].clear()) { handler(server_error::success); if (m_session_lost_handler) { m_session_lost_handler(target, session_loss_reason::manual_termination); } } else { handler(server_error::no_session_for_host); } } void server::do_handle_session_request(SharedBuffer data, const identity_store& identity, const ep_type& sender, const session_request_message& _session_request_message) { // All do_handle_session_request() calls are done in the presentation strand so the following is thread-safe. if (!has_presentation_store_for(sender)) { // No presentation_store for the given host. // We do nothing. m_logger(log_level::trace) << "Received a SESSION_REQUEST from " << sender << " but no presentation is available. Ignoring."; return; } // We make sure the signatures matches. bool check_ok = false; if (!!m_presentation_store_map[sender].signature_certificate()) { check_ok = _session_request_message.check_signature(m_presentation_store_map[sender].signature_certificate().public_key()); } else { const auto psk = m_presentation_store_map[sender].pre_shared_key(); check_ok = _session_request_message.check_signature(buffer_cast(psk), buffer_size(psk)); } if (!check_ok) { m_logger(log_level::trace) << "Received a SESSION_REQUEST from " << sender << " with an invalid signature. Ignoring."; return; } // The make_shared_buffer_handler() call below is necessary so that the reference to session_request_message remains valid. m_session_strand.post( make_shared_buffer_handler( data, boost::bind( &server::do_handle_verified_session_request, this, identity, sender, _session_request_message ) ) ); } void server::do_handle_verified_session_request(const identity_store& identity, const ep_type& sender, const session_request_message& _session_request_message) { // All do_handle_verified_session_request() calls are done in the session strand so the following is thread-safe. // Get the associated session, creating one if none exists. peer_session& p_session = m_peer_sessions[sender]; if (!p_session.set_first_remote_host_identifier(_session_request_message.host_identifier())) { m_logger(log_level::trace) << "Received a SESSION_REQUEST from " << sender << " but the host identifier does not match (Received: " << _session_request_message.host_identifier() << ". Expected: " << *p_session.remote_host_identifier() << "). Ignoring."; // The host identifier does not match. return; } const cipher_suite_list_type cipher_suites = _session_request_message.cipher_suite_capabilities(); const elliptic_curve_list_type elliptic_curves = _session_request_message.elliptic_curve_capabilities(); const cipher_suite_type calg = get_first_common_supported_cipher_suite(m_cipher_suites, cipher_suites); const elliptic_curve_type ec = get_first_common_supported_elliptic_curve(m_elliptic_curves, elliptic_curves); if ((calg == cipher_suite_type::unsupported) || (ec == elliptic_curve_type::unsupported)) { // No suitable cipher and/or elliptic curve is available. m_logger(log_level::trace) << "Received a SESSION_REQUEST from " << sender << " but can't agree on the cipher suite to use (Cipher algorithm: " << calg << ". Elliptic curve: " << ec << "). Ignoring"; return; } bool can_reply = m_accept_session_request_messages_default; if (m_session_request_message_received_handler) { can_reply = m_session_request_message_received_handler(sender, cipher_suites, elliptic_curves, m_accept_session_request_messages_default); } if (!can_reply) { m_logger(log_level::trace) << "Received a SESSION_REQUEST from " << sender << " but not allowed to reply (`m_accept_session_request_messages_default` is " << m_accept_session_request_messages_default << ")."; } else { if (!p_session.has_current_session()) { m_logger(log_level::trace) << "Received a SESSION_REQUEST from " << sender << " with session number " << _session_request_message.session_number() << " and cipher suite " << calg << "_" << ec << ". No current session exist: preparing one and sending it."; p_session.prepare_session(_session_request_message.session_number(), calg, ec); do_send_session(identity, sender, p_session.next_session_parameters()); } else { m_logger(log_level::trace) << "Current session has number " << p_session.current_session().parameters.session_number << " and " << sender << " requests session number " << _session_request_message.session_number(); if (_session_request_message.session_number() > p_session.current_session().parameters.session_number) { m_logger(log_level::trace) << "Received a SESSION_REQUEST from " << sender << " with session number " << _session_request_message.session_number() << " and cipher suite " << calg << "_" << ec << ". A current session exists but has the number " << p_session.current_session().parameters.session_number << ": preparing a new session and sending it."; // A new session is requested. Sending a new message. p_session.prepare_session(_session_request_message.session_number(), calg, ec); do_send_session(identity, sender, p_session.next_session_parameters()); } else { m_logger(log_level::trace) << "Received a SESSION_REQUEST from " << sender << " with session number " << _session_request_message.session_number() << " and cipher suite " << calg << "_" << ec << ". A current session exists and has the number " << p_session.current_session().parameters.session_number << ": sending the current session."; // An old session is requested: sending the same message. do_send_session(identity, sender, p_session.current_session_parameters()); } } } } std::set server::get_session_endpoints() const { // All get_session_endpoints() calls are done in the same strand so the following is thread-safe. std::set result; for (auto&& p_session: m_peer_sessions) { if (p_session.second.has_current_session()) { result.insert(p_session.first); } } return result; } bool server::has_session_with_endpoint(const ep_type& host) { // All has_session_with_endpoint() calls are done in the same strand so the following is thread-safe. const auto p_session = m_peer_sessions.find(host); if (p_session != m_peer_sessions.end()) { return p_session->second.has_current_session(); } return false; } void server::do_get_session_endpoints(endpoints_handler_type handler) { // All do_get_session_endpoints() calls are done in the same strand so the following is thread-safe. handler(get_session_endpoints()); } void server::do_has_session_with_endpoint(const ep_type& host, boolean_handler_type handler) { // All do_has_session_with_endpoint() calls are done in the same strand so the following is thread-safe. handler(has_session_with_endpoint(host)); } void server::do_set_accept_session_request_messages_default(bool value, void_handler_type handler) { // All do_set_hello_message_received_callback() calls are done in the same strand so the following is thread-safe. set_accept_session_request_messages_default(value); if (handler) { handler(); } } void server::do_set_cipher_suites(cipher_suite_list_type cipher_suites, void_handler_type handler) { // All do_set_hello_message_received_callback() calls are done in the same strand so the following is thread-safe. set_cipher_suites(cipher_suites); if (handler) { handler(); } } void server::do_set_elliptic_curves(elliptic_curve_list_type elliptic_curves, void_handler_type handler) { // All do_set_hello_message_received_callback() calls are done in the same strand so the following is thread-safe. set_elliptic_curves(elliptic_curves); if (handler) { handler(); } } void server::do_set_session_request_message_received_callback(session_request_received_handler_type callback, void_handler_type handler) { // All do_set_hello_message_received_callback() calls are done in the same strand so the following is thread-safe. set_session_request_message_received_callback(callback); if (handler) { handler(); } } void server::do_send_session(const identity_store& identity, const ep_type& target, const peer_session::session_parameters& parameters) { // All do_send_session() calls are done in the session strand so the following is thread-safe. m_logger(log_level::trace) << "Sending session message to " << target << " (session number: " << parameters.session_number << ", cipher suite: " << parameters.cipher_suite << ", elliptic curve: " << parameters.elliptic_curve << ")."; peer_session& p_session = m_peer_sessions[target]; const SharedBuffer send_buffer = m_session_buffers.empty() ? SharedBuffer(65536) : [this]() { const auto result = m_session_buffers.front(); m_session_buffers.pop_front(); return result; }(); try { size_t size = 0; if (!!identity.signature_key()) { size = session_message::write( buffer_cast(send_buffer), buffer_size(send_buffer), parameters.session_number, p_session.local_host_identifier(), parameters.cipher_suite, parameters.elliptic_curve, buffer_cast(parameters.public_key), buffer_size(parameters.public_key), identity.signature_key() ); } else { size = session_message::write( buffer_cast(send_buffer), buffer_size(send_buffer), parameters.session_number, p_session.local_host_identifier(), parameters.cipher_suite, parameters.elliptic_curve, buffer_cast(parameters.public_key), buffer_size(parameters.public_key), buffer_cast(identity.pre_shared_key()), buffer_size(identity.pre_shared_key()) ); } async_send_to( SharedBuffer(send_buffer, [this](const SharedBuffer& buffer) { m_session_strand.post([this, buffer]() { m_session_buffers.push_back(buffer); }); }), size, target, [] (const boost::system::error_code&) {} ); } catch (const boost::system::system_error& ex) { m_logger(log_level::error) << "Error sending session to " << target << ": " << ex.what() << "."; } } void server::do_handle_session(SharedBuffer data, const identity_store& identity, const ep_type& sender, const session_message& _session_message) { // All do_handle_session() calls are done in the same strand so the following is thread-safe. if (!has_presentation_store_for(sender)) { // No presentation_store for the given host. // We do nothing. m_logger(log_level::trace) << "Received a SESSION from " << sender << " but no presentation is available. Ignoring."; return; } // We make sure the signatures matches. bool check_ok = false; if (!!m_presentation_store_map[sender].signature_certificate()) { check_ok = _session_message.check_signature(m_presentation_store_map[sender].signature_certificate().public_key()); } else { const auto psk = m_presentation_store_map[sender].pre_shared_key(); check_ok = _session_message.check_signature(buffer_cast(psk), buffer_size(psk)); } if (!check_ok) { m_logger(log_level::trace) << "Received a SESSION from " << sender << " with an invalid signature. Ignoring."; return; } m_session_strand.post( make_shared_buffer_handler( data, boost::bind( &server::do_handle_verified_session, this, identity, sender, _session_message ) ) ); } void server::do_handle_verified_session(const identity_store& identity, const ep_type& sender, const session_message& _session_message) { // All do_handle_verified_session() calls are done in the session strand so the following is thread-safe. peer_session& p_session = m_peer_sessions[sender]; if (!p_session.set_first_remote_host_identifier(_session_message.host_identifier())) { m_logger(log_level::trace) << "Received a SESSION from " << sender << " but the host identifier does not match (Received: " << _session_message.host_identifier() << ". Expected: " << *p_session.remote_host_identifier() << "). Ignoring."; // The host identifier does not match. return; } const bool session_is_new = !p_session.has_current_session(); if (!session_is_new) { if (_session_message.session_number() == p_session.current_session().parameters.session_number) { // The session number matches the current session. if (p_session.current_session().parameters.cipher_suite != _session_message.cipher_suite()) { m_logger(log_level::trace) << "Received a SESSION from " << sender << " with session number " << _session_message.session_number() << " and cipher suite " << _session_message.cipher_suite() << ". A session currently exists and has the same number but its cipher suite does not match (" << p_session.current_session().parameters.cipher_suite << "): requesting a new session."; // The parameters don't match the current session. Requesting a new one. do_request_session(identity, sender, &null_simple_handler); } else { m_logger(log_level::trace) << "Received a SESSION from " << sender << " with session number " << _session_message.session_number() << " and cipher suite " << _session_message.cipher_suite() << ". A session currently exists and has the same number and cipher suite. Ignoring."; } return; } else if (_session_message.session_number() < p_session.current_session().parameters.session_number) { m_logger(log_level::trace) << "Received a SESSION from " << sender << " with session number " << _session_message.session_number() << " and cipher suite " << _session_message.cipher_suite() << ". A session currently exists and has a higher number (" << p_session.current_session().parameters.session_number << "). Ignoring."; // This is an old session message. Ignore it. return; } } if (_session_message.cipher_suite() == cipher_suite_type::unsupported) { m_logger(log_level::trace) << "Received a SESSION from " << sender << " with session number " << _session_message.session_number() << " but an unsupported cipher suite. Failing session handshake."; if (m_session_failed_handler) { m_session_failed_handler(sender, session_is_new); } return; } bool can_accept = m_accept_session_messages_default; if (m_session_message_received_handler) { can_accept = m_session_message_received_handler(sender, _session_message.cipher_suite(), _session_message.elliptic_curve(), can_accept); } if (!can_accept) { m_logger(log_level::trace) << "Received a SESSION from " << sender << " but not allowed to accept (`m_accept_session_messages_default` is " << m_accept_session_messages_default << ")."; } else { bool session_completed = true; try { if (!p_session.complete_session(_session_message.public_key(), _session_message.public_key_size())) { m_logger(log_level::trace) << "Received a SESSION from " << sender << " with session number " << _session_message.session_number() << " but no session was prepared yet. Preparing a new one."; // We received a session message but no session was prepared yet: we issue one and retry. p_session.prepare_session(_session_message.session_number(), _session_message.cipher_suite(), _session_message.elliptic_curve()); if (!p_session.complete_session(_session_message.public_key(), _session_message.public_key_size())) { // Unable to complete the session. m_logger(log_level::warning) << "Unable to compute the session keys with " << sender << "."; return; } } } catch (const std::exception& ex) { session_completed = false; m_logger(log_level::error) << "Exception while computing the session keys with " << sender << ": " << ex.what() << "."; if (m_session_error_handler) { m_session_error_handler(sender, session_is_new, ex); } } if (session_completed) { m_logger(log_level::trace) << "Session established with " << sender << ". Sending acknowledgement session message back."; do_send_session(identity, sender, p_session.current_session_parameters()); if (m_session_established_handler) { m_session_established_handler(sender, session_is_new, p_session.current_session().parameters.cipher_suite, p_session.current_session().parameters.elliptic_curve); } } } } void server::do_set_accept_session_messages_default(bool value, void_handler_type handler) { // All do_set_accept_session_messages_default() calls are done in the same strand so the following is thread-safe. set_accept_session_messages_default(value); if (handler) { handler(); } } void server::do_set_session_message_received_callback(session_received_handler_type callback, void_handler_type handler) { // All do_set_session_message_received_callback() calls are done in the same strand so the following is thread-safe. set_session_message_received_callback(callback); if (handler) { handler(); } } void server::do_set_session_failed_callback(session_failed_handler_type callback, void_handler_type handler) { // All do_set_session_failed_callback() calls are done in the same strand so the following is thread-safe. set_session_failed_callback(callback); if (handler) { handler(); } } void server::do_set_session_error_callback(session_error_handler_type callback, void_handler_type handler) { // All do_set_session_error_callback() calls are done in the same strand so the following is thread-safe. set_session_error_callback(callback); if (handler) { handler(); } } void server::do_set_session_established_callback(session_established_handler_type callback, void_handler_type handler) { // All do_set_session_established_callback() calls are done in the same strand so the following is thread-safe. set_session_established_callback(callback); if (handler) { handler(); } } void server::do_set_session_lost_callback(session_lost_handler_type callback, void_handler_type handler) { // All do_set_session_lost_callback() calls are done in the same strand so the following is thread-safe. set_session_lost_callback(callback); if (handler) { handler(); } } void server::do_send_data(const ep_type& target, channel_number_type channel_number, boost::asio::const_buffer data, simple_handler_type handler) { // All do_send_data() calls are done in the session strand so the following is thread-safe. peer_session& p_session = m_peer_sessions[target]; do_send_data_to_session(p_session, target, channel_number, data, handler); } void server::do_send_data_to_list(const std::set& targets, channel_number_type channel_number, boost::asio::const_buffer data, multiple_endpoints_handler_type handler) { // All do_send_data_to_list() calls are done in the session strand so the following is thread-safe. typedef results_gatherer results_gatherer_type; boost::shared_ptr rg = boost::make_shared(handler, targets); for (auto&& item: m_peer_sessions) { if (targets.count(item.first) > 0) { do_send_data_to_session(item.second, item.first, channel_number, data, boost::bind(&results_gatherer_type::gather, rg, item.first, _1)); } } } void server::do_send_data_to_all(channel_number_type channel_number, boost::asio::const_buffer data, multiple_endpoints_handler_type handler) { // All do_send_data_to_all() calls are done in the session strand so the following is thread-safe. do_send_data_to_list(get_session_endpoints(), channel_number, data, handler); } void server::do_send_data_to_session(peer_session& p_session, const ep_type& target, channel_number_type channel_number, boost::asio::const_buffer data, simple_handler_type handler) { // All do_send_data_to_session() calls are done in the session strand so the following is thread-safe. if (!m_socket.is_open()) { handler(server_error::server_offline); return; } if (!p_session.has_current_session()) { handler(server_error::no_session_for_host); return; } // Get either a new buffer or an old, recycled one if possible. const SharedBuffer send_buffer = m_session_buffers.empty() ? SharedBuffer(65536) : [this]() { const auto result = m_session_buffers.front(); m_session_buffers.pop_front(); return result; }(); try { const size_t size = data_message::write( buffer_cast(send_buffer), buffer_size(send_buffer), channel_number, p_session.increment_local_sequence_number(), p_session.current_session().parameters.cipher_suite.to_cipher_algorithm(), buffer_cast(data), buffer_size(data), buffer_cast(p_session.current_session().local_session_key), buffer_size(p_session.current_session().local_session_key), buffer_cast(p_session.current_session().local_nonce_prefix), buffer_size(p_session.current_session().local_nonce_prefix) ); async_send_to( SharedBuffer(send_buffer, [this](const SharedBuffer& buffer) { m_session_strand.post([this, buffer]() { m_session_buffers.push_back(buffer); }); }), size, target, handler ); } catch (const boost::system::system_error& ex) { handler(ex.code()); } } void server::do_send_contact_request(const ep_type& target, const hash_list_type& hash_list, simple_handler_type handler) { // All do_send_contact_request() calls are done in the session strand so the following is thread-safe. peer_session& p_session = m_peer_sessions[target]; do_send_contact_request_to_session(p_session, target, hash_list, handler); } void server::do_send_contact_request_to_list(const std::set& targets, const hash_list_type& hash_list, multiple_endpoints_handler_type handler) { // All do_send_contact_request_to_list() calls are done in the same strand so the following is thread-safe. typedef results_gatherer results_gatherer_type; boost::shared_ptr rg = boost::make_shared(handler, targets); for (auto&& item: m_peer_sessions) { if (targets.count(item.first) > 0) { do_send_contact_request_to_session(item.second, item.first, hash_list, boost::bind(&results_gatherer_type::gather, rg, item.first, _1)); } } } void server::do_send_contact_request_to_all(const hash_list_type& hash_list, multiple_endpoints_handler_type handler) { // All do_send_contact_request_to_all() calls are done in the same strand so the following is thread-safe. do_send_contact_request_to_list(get_session_endpoints(), hash_list, handler); } void server::do_send_contact_request_to_session(peer_session& p_session, const ep_type& target, const hash_list_type& hash_list, simple_handler_type handler) { // All do_send_contact_request_to_session() calls are done in the same strand so the following is thread-safe. if (!m_socket.is_open()) { handler(server_error::server_offline); return; } if (!p_session.has_current_session()) { handler(server_error::no_session_for_host); return; } const auto send_buffer = SharedBuffer(65536); try { const size_t size = data_message::write_contact_request( buffer_cast(send_buffer), buffer_size(send_buffer), p_session.increment_local_sequence_number(), p_session.current_session().parameters.cipher_suite.to_cipher_algorithm(), hash_list, buffer_cast(p_session.current_session().local_session_key), buffer_size(p_session.current_session().local_session_key), buffer_cast(p_session.current_session().local_nonce_prefix), buffer_size(p_session.current_session().local_nonce_prefix) ); async_send_to( send_buffer, size, target, handler ); } catch (const boost::system::system_error& ex) { handler(ex.code()); } } void server::do_send_contact(const ep_type& target, const contact_map_type& contact_map, simple_handler_type handler) { // All do_send_contact() calls are done in the same strand so the following is thread-safe. peer_session& p_session = m_peer_sessions[target]; do_send_contact_to_session(p_session, target, contact_map, handler); } void server::do_send_contact_to_list(const std::set& targets, const contact_map_type& contact_map, multiple_endpoints_handler_type handler) { // All do_send_contact_to_list() calls are done in the same strand so the following is thread-safe. typedef results_gatherer results_gatherer_type; boost::shared_ptr rg = boost::make_shared(handler, targets); for (auto&& item: m_peer_sessions) { if (targets.count(item.first) > 0) { do_send_contact_to_session(item.second, item.first, contact_map, boost::bind(&results_gatherer_type::gather, rg, item.first, _1)); } } } void server::do_send_contact_to_all(const contact_map_type& contact_map, multiple_endpoints_handler_type handler) { // All do_send_contact_to_all() calls are done in the same strand so the following is thread-safe. do_send_contact_to_list(get_session_endpoints(), contact_map, handler); } void server::do_send_contact_to_session(peer_session& p_session, const ep_type& target, const contact_map_type& contact_map, simple_handler_type handler) { // All do_send_contact_to_session() calls are done in the same strand so the following is thread-safe. if (!m_socket.is_open()) { handler(server_error::server_offline); return; } if (!p_session.has_current_session()) { handler(server_error::no_session_for_host); return; } const auto send_buffer = SharedBuffer(65536); try { const size_t size = data_message::write_contact( buffer_cast(send_buffer), buffer_size(send_buffer), p_session.increment_local_sequence_number(), p_session.current_session().parameters.cipher_suite.to_cipher_algorithm(), contact_map, buffer_cast(p_session.current_session().local_session_key), buffer_size(p_session.current_session().local_session_key), buffer_cast(p_session.current_session().local_nonce_prefix), buffer_size(p_session.current_session().local_nonce_prefix) ); async_send_to( send_buffer, size, target, handler ); } catch (const boost::system::system_error& ex) { handler(ex.code()); } } void server::do_handle_data(const identity_store& identity, const ep_type& sender, const data_message& _data_message) { // All do_handle_data() calls are done in the same strand so the following is thread-safe. peer_session& p_session = m_peer_sessions[sender]; if (!p_session.has_current_session()) { m_logger(log_level::trace) << "Received a data message from " << sender << " but no session exists. Ignoring."; return; } if (_data_message.sequence_number() <= p_session.current_session().remote_sequence_number) { // The message is outdated: we ignore it. m_logger(log_level::trace) << "Received a data message from " << sender << " but its sequence number is outdated (received: " << _data_message.sequence_number() << ", expecting: " << p_session.current_session().remote_sequence_number << "). Ignoring."; return; } // Get either a new buffer or an old, recycled one if possible. const SharedBuffer cleartext_buffer = m_session_buffers.empty() ? SharedBuffer(65536) : [this]() { const auto result = m_session_buffers.front(); m_session_buffers.pop_front(); return result; }(); try { const size_t cleartext_len = _data_message.get_cleartext( buffer_cast(cleartext_buffer), buffer_size(cleartext_buffer), p_session.current_session().parameters.cipher_suite.to_cipher_algorithm(), buffer_cast(p_session.current_session().remote_session_key), buffer_size(p_session.current_session().remote_session_key), buffer_cast(p_session.current_session().remote_nonce_prefix), buffer_size(p_session.current_session().remote_nonce_prefix) ); p_session.set_remote_sequence_number(_data_message.sequence_number()); p_session.keep_alive(); if (p_session.current_session().is_old()) { // do_send_clear_session() and do_handle_data() are to be invoked through the same strand, so this is fine. p_session.prepare_session(p_session.next_session_number(), p_session.current_session().parameters.cipher_suite, p_session.current_session().parameters.elliptic_curve); do_send_session(identity, sender, p_session.next_session_parameters()); } const message_type type = _data_message.type(); if (type == MESSAGE_TYPE_KEEP_ALIVE) { // If the message is a keep alive then nothing is to be done and we avoid posting an empty call into the data strand. return; } // This call is fast so we hold on to the data_message a bit longer. do_handle_data_message( sender, type, SharedBuffer(cleartext_buffer, [this] (const SharedBuffer& buffer) { m_session_strand.post([this, buffer] () { m_session_buffers.push_back(buffer); }); }), buffer(cleartext_buffer, cleartext_len) ); } catch (const boost::system::system_error& ex) { // This can happen if a message is decoded after a session rekeying. m_logger(log_level::error) << "Error deciphering data message from " << sender << ": " << ex.what(); } } void server::do_handle_data_message(const ep_type& sender, message_type type, SharedBuffer buffer, boost::asio::const_buffer data) { // All do_handle_data_message() calls are done in the same strand as do_handle_data() so the following is thread-safe. // This call should remain *FAST*. That ims, it should only discard the message or trigger some deferred handling by another task. if (is_data_message_type(type)) { // This is safe only because type is a DATA message type. const channel_number_type channel_number = to_channel_number(type); if (m_data_received_handler) { m_data_received_handler(sender, channel_number, buffer, data); } } else if (type == MESSAGE_TYPE_CONTACT_REQUEST) { const hash_list_type hash_list = data_message::parse_hash_list(buffer_cast(data), buffer_size(data)); m_presentation_strand.post( boost::bind( &server::do_handle_contact_request, this, sender, hash_list ) ); } else if (type == MESSAGE_TYPE_CONTACT) { const contact_map_type contact_map = data_message::parse_contact_map(buffer_cast(data), buffer_size(data)); m_contact_strand.post( boost::bind( &server::do_handle_contact, this, sender, contact_map ) ); } } void server::do_handle_contact_request(const ep_type& sender, const std::set& hash_list) { // All do_handle_contact_request() calls are done in the same strand so the following is thread-safe. contact_map_type contact_map; for (std::set::iterator hash_it = hash_list.begin(); hash_it != hash_list.end(); ++hash_it) { for (presentation_store_map::const_iterator it = m_presentation_store_map.begin(); it != m_presentation_store_map.end(); ++it) { // Contact requests do not work for PSK authenticated hosts. if (!it->second.signature_certificate()) { continue; } const boost::optional hash = it->second.signature_certificate_hash(); if (hash && (*hash == *hash_it)) { if (!m_contact_request_message_received_handler || m_contact_request_message_received_handler(sender, it->second.signature_certificate(), *hash, it->first)) { contact_map[*hash_it] = it->first; } } } } // Our contact map contains some answers: we send those. if (!contact_map.empty()) { async_send_contact(sender, contact_map, &null_simple_handler); } } void server::do_handle_contact(const ep_type& sender, const contact_map_type& contact_map) { // All do_handle_contact() calls are done in the same strand so the following is thread-safe. if (m_contact_message_received_handler) { for (contact_map_type::const_iterator contact_it = contact_map.begin(); contact_it != contact_map.end(); ++contact_it) { m_contact_message_received_handler(sender, contact_it->first, contact_it->second); } } } void server::do_set_data_received_callback(data_received_handler_type callback, void_handler_type handler) { // All do_set_data_received_callback() calls are done in the same strand so the following is thread-safe. set_data_received_callback(callback); if (handler) { handler(); } } void server::do_set_contact_request_received_callback(contact_request_received_handler_type callback, void_handler_type handler) { // All do_set_contact_request_received_callback() calls are done in the same strand so the following is thread-safe. set_contact_request_received_callback(callback); if (handler) { handler(); } } void server::do_set_contact_received_callback(contact_received_handler_type callback, void_handler_type handler) { // All do_set_contact_received_callback() calls are done in the same strand so the following is thread-safe. set_contact_received_callback(callback); if (handler) { handler(); } } void server::do_check_keep_alive(const boost::system::error_code& ec) { // All do_check_keep_alive() calls are done in the same strand so the following is thread-safe. if (ec != boost::asio::error::operation_aborted) { for (auto&& p_session: m_peer_sessions) { if (p_session.second.has_timed_out(SESSION_TIMEOUT)) { if (p_session.second.clear()) { if (m_session_lost_handler) { m_session_lost_handler(p_session.first, session_loss_reason::timeout); } } } else { do_send_keep_alive(p_session.first, &null_simple_handler); } } m_keep_alive_timer.expires_from_now(SESSION_KEEP_ALIVE_PERIOD); m_keep_alive_timer.async_wait(m_session_strand.wrap(boost::bind(&server::do_check_keep_alive, this, boost::asio::placeholders::error))); } } void server::do_send_keep_alive(const ep_type& target, simple_handler_type handler) { // All do_send_keep_alive() calls are done in the same strand so the following is thread-safe. if (!m_socket.is_open()) { handler(server_error::server_offline); return; } peer_session& p_session = m_peer_sessions[target]; if (!p_session.has_current_session()) { handler(server_error::no_session_for_host); return; } const auto send_buffer = SharedBuffer(1024); try { const size_t size = data_message::write_keep_alive( buffer_cast(send_buffer), buffer_size(send_buffer), p_session.increment_local_sequence_number(), p_session.current_session().parameters.cipher_suite.to_cipher_algorithm(), SESSION_KEEP_ALIVE_DATA_SIZE, // This is the count of random data to send. buffer_cast(p_session.current_session().local_session_key), buffer_size(p_session.current_session().local_session_key), buffer_cast(p_session.current_session().local_nonce_prefix), buffer_size(p_session.current_session().local_nonce_prefix) ); async_send_to( send_buffer, size, target, handler ); } catch (const boost::system::system_error& ex) { handler(ex.code()); } } std::ostream& operator<<(std::ostream& os, server::session_loss_reason value) { switch (value) { case server::session_loss_reason::timeout: os << "timeout"; break; case server::session_loss_reason::manual_termination: os << "manual termination"; break; default: os << "unspecified reason"; break; } return os; } } freelan-2.0/libs/fscp/src/server_error.cpp000066400000000000000000000054721252300335000206660ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file server_error.cpp * \author Julien Kauffmann * \brief The server errors. */ #include "server_error.hpp" namespace fscp { const boost::system::error_category& server_category() { static server_category_impl instance; return instance; } const char* server_category_impl::name() const throw() { return "fscp::server"; } std::string server_category_impl::message(int ev) const { switch (ev) { case server_error::success: { return "Success"; } case server_error::server_offline: { return "The FSCP server is offline"; } case server_error::hello_request_timed_out: { return "No HELLO response received"; } case server_error::no_presentation_for_host: { return "No presentation is available for the specified host"; } case server_error::session_already_exist: { return "A session already exists for the specified host"; } case server_error::no_session_for_host: { return "No session is available for the specified host"; } default: { return "Unknown FSCP error"; } } } } freelan-2.0/libs/fscp/src/session_message.cpp000066400000000000000000000175001252300335000213310ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file session_message.cpp * \author Julien Kauffmann * \brief A session message class. */ #include "session_message.hpp" #include #include #include #include namespace fscp { namespace { void configure_context(EVP_PKEY_CTX* evp_ctx) { // Set RSASSA_PSS with a digest size salt length. EVP_PKEY_CTX_set_rsa_padding(evp_ctx, RSA_PKCS1_PSS_PADDING); EVP_PKEY_CTX_set_rsa_pss_saltlen(evp_ctx, -1); } } size_t session_message::write(void* buf, size_t buf_len, session_number_type _session_number, const host_identifier_type& _host_identifier, cipher_suite_type cs, elliptic_curve_type ec, const void* pub_key, size_t pub_key_len, cryptoplus::pkey::pkey sig_key) { uint8_t* const payload = static_cast(buf) + HEADER_LENGTH; const size_t unsigned_payload_size = write_unsigned(payload, buf_len - HEADER_LENGTH, _session_number, _host_identifier, cs, ec, pub_key, pub_key_len); cryptoplus::hash::message_digest_context mdctx; EVP_PKEY_CTX* evp_ctx = nullptr; mdctx.digest_sign_initialize(get_default_digest_algorithm(), sig_key, &evp_ctx); configure_context(evp_ctx); mdctx.digest_sign_update(static_cast(payload), unsigned_payload_size); const size_t signature_size = mdctx.digest_sign_finalize(nullptr, 0); const size_t signed_payload_size = unsigned_payload_size + sizeof(uint16_t) + signature_size; if (buf_len < HEADER_LENGTH + signed_payload_size) { throw std::runtime_error("buf_len"); } mdctx.digest_sign_finalize(payload + unsigned_payload_size + sizeof(uint16_t), signature_size); buffer_tools::set(payload, unsigned_payload_size, htons(static_cast(signature_size))); return message::write(buf, buf_len, CURRENT_PROTOCOL_VERSION, MESSAGE_TYPE_SESSION, signed_payload_size) + signed_payload_size; } size_t session_message::write(void* buf, size_t buf_len, session_number_type _session_number, const host_identifier_type& _host_identifier, cipher_suite_type cs, elliptic_curve_type ec, const void* pub_key, size_t pub_key_len, const void* pre_shared_key, size_t pre_shared_key_len) { const auto mdalg = get_default_digest_algorithm(); uint8_t* const payload = static_cast(buf) + HEADER_LENGTH; const size_t unsigned_payload_size = write_unsigned(payload, buf_len - HEADER_LENGTH, _session_number, _host_identifier, cs, ec, pub_key, pub_key_len); if (buf_len < HEADER_LENGTH + unsigned_payload_size + mdalg.result_size()) { throw std::runtime_error("buf_len"); } cryptoplus::hash::hmac_context hmctx; hmctx.initialize(pre_shared_key, pre_shared_key_len, &mdalg); hmctx.update(static_cast(payload), unsigned_payload_size); hmctx.finalize(payload + unsigned_payload_size + sizeof(uint16_t), mdalg.result_size()); buffer_tools::set(payload, unsigned_payload_size, htons(static_cast(mdalg.result_size()))); const size_t signed_payload_size = unsigned_payload_size + sizeof(uint16_t) + mdalg.result_size(); return message::write(buf, buf_len, CURRENT_PROTOCOL_VERSION, MESSAGE_TYPE_SESSION, signed_payload_size) + signed_payload_size; } session_message::session_message(const message& _message) : message(_message) { if (length() < MIN_BODY_LENGTH) { throw std::runtime_error("buf_len"); } if (length() < MIN_BODY_LENGTH + public_key_size()) { throw std::runtime_error("buf_len"); } if (length() < MIN_BODY_LENGTH + public_key_size() + header_signature_size()) { throw std::runtime_error("buf_len"); } } bool session_message::check_signature(cryptoplus::pkey::pkey key) const { assert(key); assert(key.get_rsa_key()); cryptoplus::hash::message_digest_context mdctx; EVP_PKEY_CTX* evp_ctx = nullptr; mdctx.digest_verify_initialize(get_default_digest_algorithm(), key, &evp_ctx); configure_context(evp_ctx); mdctx.digest_verify_update(payload(), header_size()); return mdctx.digest_verify_finalize(header_signature(), header_signature_size()); } bool session_message::check_signature(const void* pre_shared_key, size_t pre_shared_key_len) const { const auto mdalg = get_default_digest_algorithm(); cryptoplus::hash::hmac_context hmctx; hmctx.initialize(pre_shared_key, pre_shared_key_len, &mdalg); hmctx.update(payload(), header_size()); const auto verified_signature = hmctx.finalize(); const cryptoplus::buffer signature(header_signature(), header_signature_size()); return (signature == verified_signature); } size_t session_message::write_unsigned(uint8_t* payload, size_t payload_len, session_number_type _session_number, const host_identifier_type& _host_identifier, cipher_suite_type cs, elliptic_curve_type ec, const void* pub_key, size_t pub_key_len) { using cryptoplus::buffer_cast; using cryptoplus::buffer_size; const size_t unsigned_payload_size = MIN_BODY_LENGTH + pub_key_len; if (payload_len < unsigned_payload_size) { throw std::runtime_error("payload_len"); } buffer_tools::set(payload, 0, htonl(_session_number)); std::copy(_host_identifier.data.begin(), _host_identifier.data.end(), payload + sizeof(_session_number)); buffer_tools::set(payload, sizeof(session_number_type) + host_identifier_type::data_type::static_size, cs.value()); buffer_tools::set(payload, sizeof(session_number_type) + host_identifier_type::data_type::static_size + sizeof(uint8_t), ec.value()); buffer_tools::set(payload, sizeof(session_number_type) + host_identifier_type::data_type::static_size + sizeof(uint8_t) * 2, 0x00); buffer_tools::set(payload, sizeof(session_number_type) + host_identifier_type::data_type::static_size + sizeof(uint8_t) * 3, 0x00); buffer_tools::set(payload, sizeof(session_number_type) + host_identifier_type::data_type::static_size + sizeof(uint8_t) * 4, htons(static_cast(pub_key_len))); std::memcpy(static_cast(payload)+sizeof(session_number_type) + host_identifier_type::data_type::static_size + sizeof(uint8_t) * 4 + sizeof(uint16_t), pub_key, pub_key_len); return unsigned_payload_size; } } freelan-2.0/libs/fscp/src/session_request_message.cpp000066400000000000000000000220571252300335000231040ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file session_request_message.cpp * \author Julien Kauffmann * \brief A clear session request message class. */ #include "session_request_message.hpp" #include #include #include #include namespace fscp { namespace { void configure_context(EVP_PKEY_CTX* evp_ctx) { // Set RSASSA_PSS with a digest size salt length. EVP_PKEY_CTX_set_rsa_padding(evp_ctx, RSA_PKCS1_PSS_PADDING); EVP_PKEY_CTX_set_rsa_pss_saltlen(evp_ctx, -1); } } size_t session_request_message::write(void* buf, size_t buf_len, session_number_type _session_number, const host_identifier_type& _host_identifier, const cipher_suite_list_type& cs_cap, const elliptic_curve_list_type& ec_cap, cryptoplus::pkey::pkey sig_key) { uint8_t* const payload = static_cast(buf) + HEADER_LENGTH; const size_t unsigned_payload_size = write_unsigned(payload, buf_len - HEADER_LENGTH, _session_number, _host_identifier, cs_cap, ec_cap); cryptoplus::hash::message_digest_context mdctx; EVP_PKEY_CTX* evp_ctx = nullptr; mdctx.digest_sign_initialize(get_default_digest_algorithm(), sig_key, &evp_ctx); configure_context(evp_ctx); mdctx.digest_sign_update(static_cast(payload), unsigned_payload_size); const size_t signature_size = mdctx.digest_sign_finalize(nullptr, 0); const size_t signed_payload_size = unsigned_payload_size + sizeof(uint16_t) + signature_size; if (buf_len < HEADER_LENGTH + signed_payload_size) { throw std::runtime_error("buf_len"); } mdctx.digest_sign_finalize(payload + unsigned_payload_size + sizeof(uint16_t), signature_size); buffer_tools::set(payload, unsigned_payload_size, htons(static_cast(signature_size))); return message::write(buf, buf_len, CURRENT_PROTOCOL_VERSION, MESSAGE_TYPE_SESSION_REQUEST, signed_payload_size) + signed_payload_size; } size_t session_request_message::write(void* buf, size_t buf_len, session_number_type _session_number, const host_identifier_type& _host_identifier, const cipher_suite_list_type& cs_cap, const elliptic_curve_list_type& ec_cap, const void* pre_shared_key, size_t pre_shared_key_len) { using cryptoplus::buffer_cast; using cryptoplus::buffer_size; const auto mdalg = get_default_digest_algorithm(); uint8_t* const payload = static_cast(buf) + HEADER_LENGTH; const size_t unsigned_payload_size = write_unsigned(payload, buf_len - HEADER_LENGTH, _session_number, _host_identifier, cs_cap, ec_cap); if (buf_len < HEADER_LENGTH + unsigned_payload_size + mdalg.result_size()) { throw std::runtime_error("buf_len"); } cryptoplus::hash::hmac_context hmctx; hmctx.initialize(pre_shared_key, pre_shared_key_len, &mdalg); hmctx.update(static_cast(payload), unsigned_payload_size); hmctx.finalize(payload + unsigned_payload_size + sizeof(uint16_t), mdalg.result_size()); buffer_tools::set(payload, unsigned_payload_size, htons(static_cast(mdalg.result_size()))); const size_t signed_payload_size = unsigned_payload_size + sizeof(uint16_t) + mdalg.result_size(); return message::write(buf, buf_len, CURRENT_PROTOCOL_VERSION, MESSAGE_TYPE_SESSION_REQUEST, signed_payload_size) + signed_payload_size; } session_request_message::session_request_message(const message& _message) : message(_message) { if (length() < MIN_BODY_LENGTH) { throw std::runtime_error("buf_len"); } if (length() < MIN_BODY_LENGTH + cipher_suite_capabilities_size()) { throw std::runtime_error("buf_len"); } if (length() < MIN_BODY_LENGTH + cipher_suite_capabilities_size() + elliptic_curve_capabilities_size()) { throw std::runtime_error("buf_len"); } if (length() < MIN_BODY_LENGTH + cipher_suite_capabilities_size() + elliptic_curve_capabilities_size() + header_signature_size()) { throw std::runtime_error("buf_len"); } } cipher_suite_list_type session_request_message::cipher_suite_capabilities() const { cipher_suite_list_type result(cipher_suite_capabilities_size()); std::copy( payload() + sizeof(session_number_type) + host_identifier_type::data_type::static_size + sizeof(uint16_t), payload() + sizeof(session_number_type) + host_identifier_type::data_type::static_size + sizeof(uint16_t) + cipher_suite_capabilities_size(), result.begin() ); return result; } elliptic_curve_list_type session_request_message::elliptic_curve_capabilities() const { elliptic_curve_list_type result(elliptic_curve_capabilities_size()); std::copy( payload() + sizeof(session_number_type) + host_identifier_type::data_type::static_size + sizeof(uint16_t) + cipher_suite_capabilities_size() + sizeof(uint16_t), payload() + sizeof(session_number_type) + host_identifier_type::data_type::static_size + sizeof(uint16_t) + cipher_suite_capabilities_size() + sizeof(uint16_t) + elliptic_curve_capabilities_size(), result.begin() ); return result; } bool session_request_message::check_signature(cryptoplus::pkey::pkey key) const { assert(key); assert(key.get_rsa_key()); cryptoplus::hash::message_digest_context mdctx; EVP_PKEY_CTX* evp_ctx = nullptr; mdctx.digest_verify_initialize(get_default_digest_algorithm(), key, &evp_ctx); configure_context(evp_ctx); mdctx.digest_verify_update(payload(), header_size()); return mdctx.digest_verify_finalize(header_signature(), header_signature_size()); } bool session_request_message::check_signature(const void* pre_shared_key, size_t pre_shared_key_len) const { const auto mdalg = get_default_digest_algorithm(); cryptoplus::hash::hmac_context hmctx; hmctx.initialize(pre_shared_key, pre_shared_key_len, &mdalg); hmctx.update(payload(), header_size()); const auto verified_signature = hmctx.finalize(); const cryptoplus::buffer signature(header_signature(), header_signature_size()); return (signature == verified_signature); } size_t session_request_message::write_unsigned(uint8_t* payload, size_t payload_len, session_number_type _session_number, const host_identifier_type& _host_identifier, const cipher_suite_list_type& cs_cap, const elliptic_curve_list_type& ec_cap) { using cryptoplus::buffer_cast; using cryptoplus::buffer_size; const size_t unsigned_payload_size = MIN_BODY_LENGTH + cs_cap.size() + ec_cap.size(); if (payload_len < unsigned_payload_size) { throw std::runtime_error("payload_len"); } buffer_tools::set(payload, 0, htonl(_session_number)); std::copy(_host_identifier.data.begin(), _host_identifier.data.end(), payload + sizeof(_session_number)); buffer_tools::set(payload, sizeof(_session_number) + host_identifier_type::data_type::static_size, htons(static_cast(cs_cap.size()))); { uint8_t* cs_buf = payload + sizeof(_session_number) + host_identifier_type::data_type::static_size + sizeof(uint16_t); for (auto&& cs : cs_cap) { *cs_buf++ = cs.value(); } } buffer_tools::set(payload, sizeof(_session_number) + host_identifier_type::data_type::static_size + sizeof(uint16_t) + cs_cap.size(), htons(static_cast(ec_cap.size()))); { uint8_t* ec_buf = payload + sizeof(_session_number) + host_identifier_type::data_type::static_size + sizeof(uint16_t) + cs_cap.size() + sizeof(uint16_t); for (auto&& ec : ec_cap) { *ec_buf++ = ec.value(); } } return unsigned_payload_size; } } freelan-2.0/libs/fscp/src/shared_buffer.cpp000066400000000000000000000036041252300335000207410ustar00rootroot00000000000000/* * libfscp - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libfscp. * * libfscp is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libfscp is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libfscp in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file shared_buffer.cpp * \author Julien Kauffmann * \brief A shared buffer class. */ #include "shared_buffer.hpp" namespace fscp { } freelan-2.0/libs/iconvplus/000077500000000000000000000000001252300335000157335ustar00rootroot00000000000000freelan-2.0/libs/iconvplus/README.md000066400000000000000000000011541252300335000172130ustar00rootroot00000000000000# What is libiconvplus? libiconvplus is a portable C++ wrapper around the iconv library. It was designed to ease the use of iconv's conversion facilities. # Licensing All code is licensed under the GPLv3. See gpl-3.0.txt. If you are interested in using this project under a different license, please [contact me](mailto:julien.kauffmann__AT__freelan.org). I don't bite and I probably won't charge (at least, not much). # Does the project have a website ? Yes, it does. And [here](http://www.freelan.org) it is. You may also find the [git repository](https://github.com/freelan-developers/freelan-all) on github. freelan-2.0/libs/iconvplus/SConscript000066400000000000000000000005431252300335000177470ustar00rootroot00000000000000Import('env dirs name') import os env = env.Clone() local_include_dir = Dir(os.path.join('include', name)) env.Prepend(CPPPATH=[local_include_dir]) includes = env.RInstall(dirs['root'], local_include_dir, ['*.hpp']) library = env.StaticLibrary(target=os.path.join(str(dirs['lib']), name), source=env.RGlob('src', '*.cpp')) Return('library includes') freelan-2.0/libs/iconvplus/include/000077500000000000000000000000001252300335000173565ustar00rootroot00000000000000freelan-2.0/libs/iconvplus/include/iconvplus/000077500000000000000000000000001252300335000214005ustar00rootroot00000000000000freelan-2.0/libs/iconvplus/include/iconvplus/converter.hpp000066400000000000000000000151451252300335000241260ustar00rootroot00000000000000/* * libiconvplus - A C++ lightweight wrapper around the iconv library. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libiconvplus. * * libiconvplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libiconvplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libiconvplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file converter.hpp * \author Julien KAUFFMANN * \brief The iconv converter class. */ #ifndef ICONVPLUS_CONVERTER_HPP #define ICONVPLUS_CONVERTER_HPP #include "iconv_instance.hpp" #include #include #include #include #include namespace iconvplus { /** * \brief An input stream type. */ template struct input_stream; /** * \brief A char-specialized input stream type. */ template <> struct input_stream { typedef std::istream type; /**< Input stream type. */ }; /** * \brief A wchar_t-specialized input stream type. */ template <> struct input_stream { typedef std::wistream type; /**< Input stream type. */ }; /** * \brief An output stream type. */ template struct output_stream; /** * \brief A char-specialized output stream type. */ template <> struct output_stream { typedef std::ostream type; /**< Output stream type. */ }; /** * \brief A wchar_t-specialized output stream type. */ template <> struct output_stream { typedef std::wostream type; /**< Output stream type. */ }; /** * \brief A converter class. */ template class converter { public: /** * \brief The default size of chunks, in bytes. */ static const size_t DEFAULT_CHUNK_SIZE = 8192; /** * \brief The input char type. */ typedef InputCharType input_char_type; /** * \brief The output char type. */ typedef OutputCharType output_char_type; /** * \brief The input stream type. */ typedef typename input_stream::type input_stream_type; /** * \brief The onput stream type. */ typedef typename output_stream::type output_stream_type; /** * \brief Create a new converter. * \param ic The iconv instance to use. * \param chunk_size The chunk size, in bytes. Must be at least max(sizeof(InputCharType), sizeof(OutputCharType)). * \see set_iconv_instance * * A reference is kept on the specified iconv_instance, so it must remain valid during all the lifetime of the converter instance or until set_iconv_instance() is called. */ converter(const iconv_instance& ic, size_t chunk_size = DEFAULT_CHUNK_SIZE); /** * \brief Set another iconv_instance to use. * \param ic The new iconv instance to use. * * A reference is kept on the specified iconv_instance, so it must remain valid during all the lifetime of the converter instance or until set_iconv_instance() is called again. */ void set_iconv_instance(const iconv_instance& ic); /** * \brief Proceed to the conversion. * \param is The input stream. * \param os The output stream. * \param ec The error code, if an error occurs. * \param non_reversible_conversions If not NULL, *non_reversible_conversions will be updated to indicate the count of non-reversible conversions performed during the call. * \return true on success. On error, ec is updated to indicate the error. */ bool convert(input_stream_type& is, output_stream_type& os, boost::system::error_code& ec, size_t* non_reversible_conversions = NULL); /** * \brief Proceed to the conversion. * \param is The input stream. * \param os The output stream. * \param non_reversible_conversions If not NULL, *non_reversible_conversions will be updated to indicate the count of non-reversible conversions performed during the call. * * On error, a boost::system::system_error is thrown. */ void convert(input_stream_type& is, output_stream_type& os, size_t* non_reversible_conversions = NULL); private: const iconv_instance* m_iconv_instance; std::vector m_input_buffer; std::vector m_output_buffer; }; template inline converter::converter(const iconv_instance& ic, size_t chunk_size) : m_iconv_instance(&ic), m_input_buffer(chunk_size / sizeof(input_char_type)), m_output_buffer(chunk_size / sizeof(output_char_type)) { assert(chunk_size > 0); assert(m_input_buffer.size() > 0); assert(m_output_buffer.size() > 0); } template inline void converter::set_iconv_instance(const iconv_instance& ic) { m_iconv_instance = ⁣ } template inline void converter::convert(input_stream_type& is, output_stream_type& os, size_t* non_reversible_conversions) { boost::system::error_code ec; if (!convert(is, os, ec, non_reversible_conversions)) { throw boost::system::system_error(ec); } } } #endif /* ICONVPLUS_CONVERTER_HPP */ freelan-2.0/libs/iconvplus/include/iconvplus/iconv_error_category.hpp000066400000000000000000000052711252300335000263420ustar00rootroot00000000000000/* * libiconvplus - A C++ lightweight wrapper around the iconv library. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libiconvplus. * * libiconvplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libiconvplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libiconvplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file iconv_error_category.hpp * \author Julien KAUFFMANN * \brief The iconv error category. */ #ifndef ICONVPLUS_ICONV_ERROR_CATEGORY_HPP #define ICONVPLUS_ICONV_ERROR_CATEGORY_HPP #include namespace iconvplus { /** * \brief The iconv error category. */ class iconv_error_category : public boost::system::error_category { public: /** * \brief Constructor. */ iconv_error_category() { } /** * \brief Get the name of the category. * \return The name of the category. */ const char* name() const throw() { return "iconv"; } /** * \brief Get the error message for the specified event. * \param ev The event. * \return error message. */ std::string message(int ev) const; }; /** * \brief The iconv error category. */ const iconv_error_category& iconv_category(); } #endif /* ICONVPLUS_ICONV_ERROR_CATEGORY_HPP */ freelan-2.0/libs/iconvplus/include/iconvplus/iconv_instance.hpp000066400000000000000000000230041252300335000251120ustar00rootroot00000000000000/* * libiconvplus - A C++ lightweight wrapper around the iconv library. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libiconvplus. * * libiconvplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libiconvplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libiconvplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file iconv_instance.hpp * \author Julien KAUFFMANN * \brief The iconv_instance class. */ #ifndef ICONVPLUS_ICONV_INSTANCE_HPP #define ICONVPLUS_ICONV_INSTANCE_HPP #include #include #include namespace iconvplus { /** * \brief A class that wraps a iconv_t. */ class iconv_instance { public: iconv_instance(const iconv_instance&) = delete; iconv_instance& operator=(const iconv_instance&) = delete; /** * \brief The native type. */ typedef iconv_t native_type; /** * \brief Check if a native_type is null. * \param value The value to check. * \return true if the value is null. */ static bool is_null(native_type value) { return (value == (native_type)-1); } /** * \brief The error value. */ static const size_t ERROR_VALUE = static_cast(-1); /** * \brief The default chunk size. */ static const size_t DEFAULT_CHUNK_SIZE = 1024; /** * \brief Create a new iconv instance. * \param to The destination encoding. * \param from The source encoding. */ iconv_instance(const char* to, const char* from); /** * \brief Create a new iconv instance. * \param to The destination encoding. * \param from The source encoding. */ iconv_instance(const std::string& to, const std::string& from); /** * \brief Move an iconv instance. * \param other The other instance. */ iconv_instance(iconv_instance&& other) throw() : m_iconv(other.m_iconv) { other.m_iconv = (native_type)-1; } /** * \brief Assign-move an iconv instance. * \param other The other instance. * \return *this. */ iconv_instance& operator=(iconv_instance&& other) throw() { std::swap(other.m_iconv, m_iconv); return *this; } /** * \brief Destroy the iconv instance. */ ~iconv_instance() { if (!is_null(m_iconv)) { ::iconv_close(m_iconv); } } /** * \brief Get the native pointer. * \return The native pointer. */ native_type raw() const; /** * \brief Proceed to a native iconv() call. * \param inbuf The input buffer. * \param inbytesleft The count of bytes left to be converted. * \param outbuf The output buffer. * \param outbytesleft The count of bytes left to output. * \return The number of characters converted in a non-reversible way during the call. In case of error, ERROR_VALUE is returned and errno is set accordingly. See iconv() man page for details. * * This call cannot throw. */ size_t raw_convert(const char** inbuf, size_t* inbytesleft, char** outbuf, size_t* outbytesleft) const; /** * \brief Reset the iconv context. * * Reset the iconv context, as specified in the iconv man page. */ void reset() const; /** * \brief Write the initial state to a destination buffer. * \param outbuf The output buffer. * \param outbytesleft The count of bytes left to output. * \param ec The error code, if an error occurs. * \return true on success. In case of error, false is returned and ec is updated to indicate the error. */ bool write_initial_state(char** outbuf, size_t* outbytesleft, boost::system::error_code& ec) const; /** * \brief Write the initial state to a destination buffer. * \param outbuf The output buffer. * \param outbytesleft The count of bytes left to output. * * On error, a boost::system::system_error is thrown. */ void write_initial_state(char** outbuf, size_t* outbytesleft) const; /** * \brief Proceed to a conversion. * \param inbuf The input buffer. * \param inbytesleft The count of bytes left to be converted. * \param outbuf The output buffer. * \param outbytesleft The count of bytes left to output. * \param ec The error code, if an error occurs. * \return The number of characters converted in a non-reversible way during the call. In case of error, ERROR_VALUE is returned and ec is updated to indicate the error. * * This call cannot throw. */ size_t convert(const char** inbuf, size_t* inbytesleft, char** outbuf, size_t* outbytesleft, boost::system::error_code& ec) const; /** * \brief Proceed to a conversion. * \param inbuf The input buffer. * \param inbytesleft The count of bytes left to be converted. * \param outbuf The output buffer. * \param outbytesleft The count of bytes left to output. * \return The number of characters converted in a non-reversible way during the call. In case of error, a boost::system::system_error is thrown. */ size_t convert(const char** inbuf, size_t* inbytesleft, char** outbuf, size_t* outbytesleft) const; /** * \brief Convert some data using the specified iconv instance. * \param in The input buffer. Cannot be NULL. * \param in_len The length of in, in bytes. * \param out The output buffer. Cannot be NULL. * \param out_len The length of out, in bytes. * \param ec The error code, if an error occurs. * \param non_reversible_conversions If not NULL, *non_reversible_conversions will be updated to indicate the count of non-reversible conversions performed during the call. * \return The count of bytes written to out. In case of error, a boost::system::system_error is thrown. * * A reset() and a write_initial_state() are performed inside the call, before the conversion takes place. */ size_t convert_all(const void* in, size_t in_len, void* out, size_t out_len, boost::system::error_code& ec, size_t* non_reversible_conversions = NULL) const; /** * \brief Convert some data using the specified iconv instance. * \param in The input buffer. Cannot be NULL. * \param in_len The length of in, in bytes. * \param out The output buffer. Cannot be NULL. * \param out_len The length of out, in bytes. * \param non_reversible_conversions If not NULL, *non_reversible_conversions will be updated to indicate the count of non-reversible conversions performed during the call. * \return The count of bytes written to out. In case of error, a boost::system::system_error is thrown. * * A reset() and a write_initial_state() are performed inside the call, before the conversion takes place. */ size_t convert_all(const void* in, size_t in_len, void* out, size_t out_len, size_t* non_reversible_conversions = NULL) const; private: void check_iconv() const; native_type m_iconv; }; inline iconv_instance::iconv_instance(const char* to, const char* from) : m_iconv(::iconv_open(to, from)) { check_iconv(); } inline iconv_instance::iconv_instance(const std::string& to, const std::string& from) : m_iconv(::iconv_open(to.c_str(), from.c_str())) { check_iconv(); } inline iconv_instance::native_type iconv_instance::raw() const { return m_iconv; } inline size_t iconv_instance::raw_convert(const char** inbuf, size_t* inbytesleft, char** outbuf, size_t* outbytesleft) const { #if defined(__FreeBSD__) || defined(_MSC_VER) return ::iconv(m_iconv, inbuf, inbytesleft, outbuf, outbytesleft); #else return ::iconv(m_iconv, const_cast(inbuf), inbytesleft, outbuf, outbytesleft); #endif } inline void iconv_instance::reset() const { ::iconv(m_iconv, NULL, NULL, NULL, NULL); } inline bool iconv_instance::write_initial_state(char** outbuf, size_t* outbytesleft, boost::system::error_code& ec) const { return (convert(NULL, NULL, outbuf, outbytesleft, ec) != ERROR_VALUE); } inline void iconv_instance::write_initial_state(char** outbuf, size_t* outbytesleft) const { convert(NULL, NULL, outbuf, outbytesleft); } inline void iconv_instance::check_iconv() const { if (is_null(m_iconv)) { throw std::runtime_error("Unknown encoding"); } } } #endif /* ICONVPLUS_ICONV_INSTANCE_HPP */ freelan-2.0/libs/iconvplus/include/iconvplus/iconvplus.hpp000066400000000000000000000040661252300335000241410ustar00rootroot00000000000000/* * libiconvplus - A C++ lightweight wrapper around the iconv library. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libiconvplus. * * libiconvplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libiconvplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libiconvplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file iconvplus.hpp * \author Julien KAUFFMANN * \brief The global iconvplus include file. */ #ifndef ICONVPLUS_ICONVPLUS_HPP #define ICONVPLUS_ICONVPLUS_HPP #include "iconv_instance.hpp" #include "iconv_error_category.hpp" #include "converter.hpp" #endif /* ICONVPLUS_ICONVPLUS_HPP */ freelan-2.0/libs/iconvplus/include/iconvplus/os.hpp000066400000000000000000000070231252300335000225340ustar00rootroot00000000000000/* * libiconvplus - C++ portable OpenSSL cryptographic wrapper library. * Copyright (C) 2010-2011 Julien Kauffmann * * This file is part of libiconvplus. * * libiconvplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libiconvplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libiconvplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file os.hpp * \brief Macro to know the operating system. * * - UNIX: Unix-like operating system.\n * - LINUX: Linux operating system.\n * - SUNOS: Sun operating system.\n * - MACINTOSH: Macintosh or MacOS operating system.\n * - WINDOWS: MS Windows operating system.\n * - MSDOS: MS DOS operating system.\n * * \author Julien KAUFFMANN * \author Sebastien VINCENT */ #ifndef ICONVPLUS_OS_HPP #define ICONVPLUS_OS_HPP /* * Extract the "MACINTOSH" flag from the compiler. */ #if defined(__APPLE__) #define UNIX #define MACINTOSH #endif /* * Extract the "SUNOS" flag from the compiler. */ #if defined(sun) #define UNIX #define SUNOS #endif /* * Extract the "UNIX" flag from compiler. */ #ifdef __linux__ #define UNIX #define LINUX #endif /* * Extract the "BSD" flag from compiler. */ #if defined(BSD) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) #define BSD #define UNIX #endif /* * Extract the "MSDOS" flag from the compiler. */ #ifdef __MSDOS__ #define MSDOS #undef UNIX #endif /* * Extract the "WINDOWS" flag from the compiler. */ #if defined(_Windows) || defined(__WINDOWS__) || \ defined(__WIN32__) || defined(WIN32) || \ defined(__WINNT__) || defined(__NT__) || \ defined(_WIN32) || defined(_WIN64) #define WINDOWS #ifdef _MSC_VER #define MSV #if defined(DEBUG) || defined(DEBUGTRACE) #ifdef NDEBUG #undef NDEBUG #endif #else #ifndef NDEBUG #define NDEBUG #endif #endif #else #undef MSV #endif #undef UNIX #undef MSDOS #endif /* * Remove the WINDOWS flag when using MACINTOSH. */ #ifdef MACINTOSH #undef WINDOWS #endif /* * Assume UNIX if not Windows, Macintosh or MSDOS. */ #if !defined(WINDOWS) && !defined(MACINTOSH) && !defined(MSDOS) #define UNIX #endif #endif /* ICONVPLUS_OS_HPP */ freelan-2.0/libs/iconvplus/libiconvplus.vcxproj000066400000000000000000000327771252300335000221010ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {ACD7B910-1594-4192-9AE1-E805B2F5DB59} Win32Proj libiconvplus StaticLibrary true v120 Unicode StaticLibrary true v120 Unicode StaticLibrary false v120 true Unicode StaticLibrary false v120 true Unicode $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) ClCompile $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) ClCompile $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) ClCompile $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) ClCompile Level3 Disabled USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;DEBUG;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\iconvplus Windows true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 Disabled USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;DEBUG;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\iconvplus Windows true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 MaxSpeed true true USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\iconvplus Windows true true true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 MaxSpeed true true USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\iconvplus Windows true true true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template freelan-2.0/libs/iconvplus/libiconvplus.vcxproj.filters000066400000000000000000000034611252300335000235340ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files Source Files Source Files Source Files Header Files Header Files Header Files Header Files Header Files freelan-2.0/libs/iconvplus/src/000077500000000000000000000000001252300335000165225ustar00rootroot00000000000000freelan-2.0/libs/iconvplus/src/converter.cpp000066400000000000000000000105141252300335000212360ustar00rootroot00000000000000/* * libiconvplus - A lightweight C++ wrapper around the iconv library. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libiconvplus. * * libiconvplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libiconvplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libiconvplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file converter.cpp * \author Julien KAUFFMANN * \brief The iconv converter class. */ #include "converter.hpp" #include namespace iconvplus { template bool converter::convert(input_stream_type& is, output_stream_type& os, boost::system::error_code& ec, size_t* non_reversible_conversions) { assert(m_output_buffer.size() > 0); assert(m_input_buffer.size() > 0); size_t counter = 0; if (!non_reversible_conversions) non_reversible_conversions = &counter; m_iconv_instance->reset(); size_t itmp_size = 0; const char* inbuf = NULL; size_t otmp_size = m_output_buffer.size() * sizeof(output_char_type); char* outbuf = reinterpret_cast(&m_output_buffer[0]); if (!m_iconv_instance->write_initial_state(&outbuf, &otmp_size, ec)) { return false; } else { os.write(&m_output_buffer[0], m_output_buffer.size() - otmp_size / sizeof(output_char_type)); } size_t result; while (is) { is.read(&m_input_buffer[itmp_size / sizeof(input_char_type)], m_input_buffer.size() - itmp_size / sizeof(input_char_type)); if (is.good() || is.eof()) { itmp_size += static_cast(is.gcount()) * sizeof(input_char_type); inbuf = reinterpret_cast(&m_input_buffer[0]); do { otmp_size = static_cast(m_output_buffer.size()) * sizeof(output_char_type); outbuf = reinterpret_cast(&m_output_buffer[0]); result = m_iconv_instance->convert(&inbuf, &itmp_size, &outbuf, &otmp_size, ec); os.write(&m_output_buffer[0], m_output_buffer.size() - otmp_size / sizeof(output_char_type)); if (result == iconv_instance::ERROR_VALUE) { if (ec.value() == E2BIG) { // We check if the destination buffer will always be too small. if (otmp_size >= m_output_buffer.size() * sizeof(output_char_type)) { return false; } } else if (ec.value() == EINVAL) { // An incomplete multi-byte sequence was cut. Lets copy the bytes to the beginning of the next input buffer and try again. std::memmove(reinterpret_cast(&m_input_buffer[0]), inbuf, itmp_size); } else { return false; } } non_reversible_conversions += result; } while ((result == iconv_instance::ERROR_VALUE) && (ec.value() == E2BIG)); } } return true; } template class converter; template class converter; template class converter; template class converter; } freelan-2.0/libs/iconvplus/src/iconv_error_category.cpp000066400000000000000000000055241252300335000234600ustar00rootroot00000000000000/* * libiconvplus - A lightweight C++ wrapper around the iconv library. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libiconvplus. * * libiconvplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libiconvplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libiconvplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file iconv_error_category.cpp * \author Julien KAUFFMANN * \brief The iconv error category. */ #include "iconv_error_category.hpp" #include #include #include namespace iconvplus { std::string iconv_error_category::message(int ev) const { switch (ev) { case E2BIG: return "Output buffer is too small"; case EILSEQ: return "An invalid multibyte sequence has been encountered in the input"; case EINVAL: return "An incomplete multibyte sequence has been encountered in the input"; default: #ifdef _MSC_VER char error_buf[256] = {}; strerror_s(error_buf, ev); const std::string error_string(error_buf, strnlen_s(error_buf, sizeof(error_buf))); return "Unknown error " + boost::lexical_cast(ev) + ": " + error_string; #else return "Unknown error " + boost::lexical_cast(ev) + ": " + strerror(ev); #endif } } const iconv_error_category iconv_error_category_instance; const iconv_error_category& iconv_category() { return iconv_error_category_instance; } } freelan-2.0/libs/iconvplus/src/iconv_instance.cpp000066400000000000000000000072721252300335000222400ustar00rootroot00000000000000/* * libiconvplus - A lightweight C++ wrapper around the iconv library. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libiconvplus. * * libiconvplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libiconvplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libiconvplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file iconv_instance.cpp * \author Julien KAUFFMANN * \brief The iconv_instance class. */ #include "iconv_instance.hpp" #include "converter.hpp" #include "iconv_error_category.hpp" #include #include #include namespace iconvplus { size_t iconv_instance::convert(const char** inbuf, size_t* inbytesleft, char** outbuf, size_t* outbytesleft, boost::system::error_code& ec) const { size_t result = raw_convert(inbuf, inbytesleft, outbuf, outbytesleft); if (result == ERROR_VALUE) { ec = boost::system::error_code(errno, iconv_category()); } return result; } size_t iconv_instance::convert(const char** inbuf, size_t* inbytesleft, char** outbuf, size_t* outbytesleft) const { boost::system::error_code ec; size_t result = convert(inbuf, inbytesleft, outbuf, outbytesleft, ec); if (result == ERROR_VALUE) { throw boost::system::system_error(ec); } return result; } size_t iconv_instance::convert_all(const void* in, size_t in_len, void* out, size_t out_len, boost::system::error_code& ec, size_t* non_reversible_conversions) const { assert(in); assert(out); reset(); const char* inbuf = static_cast(in); char* outbuf = static_cast(out); if (!write_initial_state(&outbuf, &out_len, ec)) { return ERROR_VALUE; } size_t result = convert(&inbuf, &in_len, &outbuf, &out_len, ec); if (result == ERROR_VALUE) { return result; } if (non_reversible_conversions) *non_reversible_conversions = result; return (outbuf - static_cast(out)); } size_t iconv_instance::convert_all(const void* in, size_t in_len, void* out, size_t out_len, size_t* non_reversible_conversions) const { boost::system::error_code ec; size_t result = convert_all(in, in_len, out, out_len, ec, non_reversible_conversions); if (result == ERROR_VALUE) { throw boost::system::system_error(ec); } return result; } } freelan-2.0/libs/iconvplus/src/iconvplus.cpp000066400000000000000000000040401252300335000212460ustar00rootroot00000000000000/* * libiconvplus - A lightweight C++ wrapper around the iconv library. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libiconvplus. * * libiconvplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libiconvplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libiconvplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file iconvplus.cpp * \author Julien KAUFFMANN * \brief The global iconvplus include file. */ #include "iconvplus.hpp" #include "os.hpp" #ifdef MSV // Avoid LNK4221: no public symbols found; archive member will be inacessible namespace { char not_empty; } #endif freelan-2.0/libs/kfather/000077500000000000000000000000001252300335000153355ustar00rootroot00000000000000freelan-2.0/libs/kfather/README.md000066400000000000000000000010731252300335000166150ustar00rootroot00000000000000# What is libkfather? libkfather stands as a lightweight, simple, and efficient C++ JSON parser/producer. # Licensing All code is licensed under the GPLv3. See gpl-3.0.txt. If you are interested in using this project under a different license, please [contact me](mailto:julien.kauffmann__AT__freelan.org). I don't bite and I probably won't charge (at least, not much). # Does the project have a website ? Yes, it does. And [here](http://www.freelan.org) it is. You may also find the [git repository](https://github.com/freelan-developers/freelan-all) on github. freelan-2.0/libs/kfather/SConscript000066400000000000000000000005431252300335000173510ustar00rootroot00000000000000Import('env dirs name') import os env = env.Clone() local_include_dir = Dir(os.path.join('include', name)) env.Prepend(CPPPATH=[local_include_dir]) includes = env.RInstall(dirs['root'], local_include_dir, ['*.hpp']) library = env.StaticLibrary(target=os.path.join(str(dirs['lib']), name), source=env.RGlob('src', '*.cpp')) Return('library includes') freelan-2.0/libs/kfather/include/000077500000000000000000000000001252300335000167605ustar00rootroot00000000000000freelan-2.0/libs/kfather/include/kfather/000077500000000000000000000000001252300335000204045ustar00rootroot00000000000000freelan-2.0/libs/kfather/include/kfather/formatter.hpp000066400000000000000000000135321252300335000231240ustar00rootroot00000000000000/* * libkfather - C++ JSON parser/producer library. * Copyright (C) 2010-2012 Julien Kauffmann * * This file is part of libkfather. * * libkfather is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libkfather is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * If you intend to use libkfather in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file formatter.hpp * \author Julien Kauffmann * \brief Formatter classes. */ #ifndef KFATHER_FORMATTER_HPP #define KFATHER_FORMATTER_HPP #include #include #include "value.hpp" namespace kfather { class parser; /** * \brief A base formatter class. * * The same formatter can be used to format JSON values in a thread-safe and * reentrant manner. */ template class generic_formatter { public: /** * \brief Format the specified value to the specified stream. * \param os The stream to format the value to. * \param value The value to format. * \return os. */ std::ostream& format(std::ostream& os, const value_type& value) const { return boost::apply_visitor(FormatterVisitorType(os), value); } /** * \brief Format a value to a string. * \param value The value to format. * \return The formatted string. * * If your intent is to print a value to an output stream, use the first * format() overload instead as it will be far more efficient. */ std::string format(const value_type& value) const { std::ostringstream oss; format(oss, value); return oss.str(); } }; /** * \brief The base formatter visitor class. */ class base_formatter_visitor : public boost::static_visitor { public: /** * \brief Prints a null value. * \return The referenced output stream. */ std::ostream& operator()(const null_type&) const; /** * \brief Prints a boolean value. * \return The referenced output stream. */ std::ostream& operator()(const boolean_type&) const; /** * \brief Prints a number. * \return The referenced output stream. */ std::ostream& operator()(const number_type&) const; /** * \brief Prints a string. * \return The referenced output stream. */ std::ostream& operator()(const string_type&) const; protected: /** * \brief Construct a formatter visitor. * \param _os The output stream to hold a reference to. */ base_formatter_visitor(std::ostream& _os) : m_os(_os) {} /** * \brief Get the referenced output stream. * \return The referenced output stream instance. */ std::ostream& os() const { return m_os; } private: std::ostream& m_os; }; /** * \brief A formatter visitor that compact its values. */ class compact_formatter_visitor : public base_formatter_visitor { public: /** * \brief Construct a formatter visitor. * \param _os The output stream to hold a reference to. */ compact_formatter_visitor(std::ostream& _os) : base_formatter_visitor(_os) {} /** * \brief Prints an array. * \return The referenced output stream. */ std::ostream& operator()(const array_type&) const; /** * \brief Prints an object. * \return The referenced output stream. */ std::ostream& operator()(const object_type&) const; using base_formatter_visitor::operator(); }; /** * \brief A formatter visitor that inlines its values. */ class inline_formatter_visitor : public base_formatter_visitor { public: /** * \brief Construct a formatter visitor. * \param _os The output stream to hold a reference to. */ inline_formatter_visitor(std::ostream& _os) : base_formatter_visitor(_os) {} /** * \brief Prints an array. * \return The referenced output stream. */ std::ostream& operator()(const array_type&) const; /** * \brief Prints an object. * \return The referenced output stream. */ std::ostream& operator()(const object_type&) const; using base_formatter_visitor::operator(); }; /** * \brief A formatter visitor that pretty prints its values. */ class pretty_print_formatter_visitor : public base_formatter_visitor { public: /** * \brief Construct a formatter visitor. * \param _os The output stream to hold a reference to. */ pretty_print_formatter_visitor(std::ostream& _os) : base_formatter_visitor(_os), m_indent_level(0) {} /** * \brief Prints an array. * \return The referenced output stream. */ std::ostream& operator()(const array_type&) const; /** * \brief Prints an object. * \return The referenced output stream. */ std::ostream& operator()(const object_type&) const; using base_formatter_visitor::operator(); private: std::ostream& indent() const; mutable unsigned int m_indent_level; }; /** * \brief A compact formatter class. */ typedef generic_formatter compact_formatter; /** * \brief An inline formatter class. */ typedef generic_formatter inline_formatter; /** * \brief A pretty-print formatter class. */ typedef generic_formatter pretty_print_formatter; } #endif /* KFATHER_FORMATTER_HPP */ freelan-2.0/libs/kfather/include/kfather/kfather.hpp000066400000000000000000000025221252300335000225420ustar00rootroot00000000000000/* * libkfather - C++ JSON parser/producer library. * Copyright (C) 2010-2012 Julien Kauffmann * * This file is part of libkfather. * * libkfather is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libkfather is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * If you intend to use libkfather in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file kfather.hpp * \author Julien Kauffmann * \brief The global kfather include file. */ #ifndef KFATHER_KFATHER_HPP #define KFATHER_KFATHER_HPP namespace kfather { } #ifndef KFATHER_NO_JSON_NAMESPACE_ALIAS namespace json = kfather; #endif /* KFATHER_NO_JSON_NAMESPACE_ALIAS */ #endif /* KFATHER_KFATHER_HPP */ freelan-2.0/libs/kfather/include/kfather/parser.hpp000066400000000000000000000155301252300335000224150ustar00rootroot00000000000000/* * libkfather - C++ JSON parser/producer library. * Copyright (C) 2010-2012 Julien Kauffmann * * This file is part of libkfather. * * libkfather is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libkfather is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * If you intend to use libkfather in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file parser.hpp * \author Julien Kauffmann * \brief A JSON parser class. */ #ifndef KFATHER_PARSER_HPP #define KFATHER_PARSER_HPP #include #include #include #include "value.hpp" namespace kfather { /** * \brief A JSON parser class. * * parser objects are thread-safe and reentrant in the sense that the same * parser instance can be used to parse different strings (or even the same * string) at the same time. * * Note however that modifying a parser instance while parsing has undefined * behavior. * * A parser can be used to validate JSON input, to transform (normalize, * format) JSON input or to build a JSON value tree. */ class parser { public: /** * \brief Parse the specified JSON string buffer. * \param value The resulting value, if the parsing succeeds. If the * parsing fails, value is guaranteed not to be modified. * \param buf The buffer to parse. Must contain a valid JSON string or * the call will fail. The string must be UTF-8 encoded. buf cannot be * null. * \param buflen The length of buf. * \param error_token A pointer to a pointer to the first invalid * character of buf, in case the parsing fails. * \return true if the parsing succeeds, false otherwise. * * If the parsing fails, and error_token is not null, *error_token is set * to the first invalid character in buf. That is, the position of the * first invalid character of buf can be get by doing (error_token - * buf). * * If the parsing succeeds, *error_token is guaranteed not to be * modified. */ bool parse(value_type& value, const char* buf, size_t buflen, const char** error_token = NULL); /** * \brief Parse the specified JSON string. * \param value The resulting value, if the parsing succeeds. If the * parsing fails, value is guaranteed not to be modified. * \param str The JSON string to parse. Must contain a valid JSON string or * the call will fail. The string must be UTF-8 encoded. * \param error_pos A pointer to a position of the first invalid character. * \return true if the parsing succeeds, false otherwise. * * If the parsing fails, and error_pos is not null, *error_pos is set * to the position of the first invalid character in str. * * If the parsing succeeds, *error_pos is guaranteed not to be * modified. */ bool parse(value_type& value, const std::string& str, std::string::size_type* error_pos = NULL); /** * \brief Parse the specified input stream. * \param value The resulting value, if the parsing succeeds. If the * parsing fails, value is guaranteed not to be modified. * \param is The input stream to parse. The stream must be UTF-8 encoded. * \param error_pos A pointer to a position of the first invalid character. * \return true if the parsing succeeds, false otherwise. * * If the parsing fails, and error_pos is not null, *error_pos is set * to the position of the first invalid character in is. * * If the parsing succeeds, *error_pos is guaranteed not to be * modified. */ bool parse(value_type& value, std::istream& is, size_t* error_pos = NULL); private: /** * \brief Parse a range of characters. * \tparam IteratorType The iterator type. * \param value The resulting value, if the parsing succeeds. If the * parsing fails, value is guaranteed not to be modified. * \param begin An iterator to the first character to parse. * \param end An iterator past the last character to parse. * \param error_pos A pointer to an iterator where the last parsing error occured. * \return true if the parsing succeeds, false otherwise. * * If the parsing fails, and error_pos is not null, *error_pos is set to * the position of the first invalid character in [begin, end). * * If the parsing fails and error_pos == end, then the end of the range * was reached before the parsing could be completed. * * If the parsing succeeds, *error_pos is guaranteed not to be * modified. */ template bool parse(value_type& value, IteratorType begin, IteratorType end, IteratorType* error_pos = NULL); private: class context { public: context(); void clear(); void push_char(char c); void push_codepoint(uint16_t cp); const std::string& str(); bool get_number(number_type&); private: void end_codepoints(); iconvplus::iconv_instance m_iconv; std::string m_utf16; string_type m_str; }; template bool parse_value(context& ctx, value_type& value, IteratorType& ch, IteratorType end); template bool parse_object(context& ctx, object_type& value, IteratorType& ch, IteratorType end); template bool parse_array(context& ctx, array_type& value, IteratorType& ch, IteratorType end); template bool parse_string(context& ctx, string_type& value, IteratorType& ch, IteratorType end); template bool parse_number(context& ctx, number_type& value, IteratorType& ch, IteratorType end); template bool parse_boolean(context& ctx, boolean_type& value, IteratorType& ch, IteratorType end); template bool parse_null(context& ctx, null_type& value, IteratorType& ch, IteratorType end); template bool check_char(context& ctx, char c, IteratorType& ch, IteratorType end); template bool check_chars(context& ctx, const char* str, IteratorType& ch, IteratorType end); template void skip_whitespace(context& ctx, IteratorType& ch, IteratorType end); }; } #endif /* KFATHER_PARSER_HPP */ freelan-2.0/libs/kfather/include/kfather/value.hpp000066400000000000000000000231501252300335000222320ustar00rootroot00000000000000/* * libkfather - C++ JSON parser/producer library. * Copyright (C) 2010-2012 Julien Kauffmann * * This file is part of libkfather. * * libkfather is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libkfather is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * If you intend to use libkfather in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file value.hpp * \author Julien Kauffmann * \brief Value classes. */ #ifndef KFATHER_VALUE_HPP #define KFATHER_VALUE_HPP #include #include #include #include #ifdef WIN32 #pragma warning(push) #pragma warning(disable: 4800) #endif #include #ifdef WIN32 #pragma warning(pop) #endif #include #include #include #include namespace kfather { class object_type; class array_type; /** * \brief The string type. * * Assumed to be UTF-8 encoded. */ typedef std::string string_type; /** * \brief A number. */ typedef double number_type; /** * \brief A boolean value. */ typedef bool boolean_type; /** * \brief The null type. */ class null_type {}; /** * \brief The generic value type. */ typedef boost::variant, boost::recursive_wrapper> value_type; template Type value_cast(const value_type& value); /** * \brief The array type. */ class array_type { public: /** * \brief The item type. */ typedef value_type item_type; /** * \brief The list type. */ typedef std::vector items_type; /** * \brief Default constructor. * * Creates an empty array. */ array_type() {}; /** * \brief Creates an array from a list of values. * \param _items The items. */ array_type(const items_type& _items) : items(_items) {} /** * \brief The items. */ items_type items; }; /** * \brief The object type. */ class object_type { public: /** * \brief The key type. */ typedef string_type key_type; /** * \brief The item type. */ typedef value_type item_type; /** * \brief The items type. */ typedef std::map items_type; /** * \brief Default constructor. * * Creates an empty object. */ object_type() {}; /** * \brief Creates an object for a list of couples. * \param _items The items. */ object_type(const items_type& _items) : items(_items) {} /** * \brief Get a value. * \param key The key. * \param def The default value. * \return The value, if it exists or default otherwise. */ item_type get(const key_type& key, item_type def = null_type()) const; /** * \brief Get a value. * \param key The key. * \param def The default value. * \return The value, if it exists or default otherwise. */ template ValueType get(const key_type& key, item_type def = null_type()) const { return value_cast(get(key, def)); } /** * \brief The items. */ items_type items; }; /** * \brief The generic visitor type. * \tparam Type The visitor type. */ template class visitor : public boost::static_visitor { public: /** * \brief This handle the conversion for all arithmetic types. * \tparam AnyType Any type. * \param val The value to convert. * \return The numeric value. */ template typename boost::enable_if, Type>::type operator()(const AnyType& val) const; }; /** * \brief The string_type visitor. */ template <> class visitor : public boost::static_visitor { public: string_type operator()(const null_type&) const { return "null"; } string_type operator()(const boolean_type& bt) const { return bt ? "true" : "false"; } string_type operator()(const number_type& nb) const { std::ostringstream oss; oss << nb; return oss.str(); } const string_type& operator()(const string_type& str) const { return str; } string_type operator()(const array_type&) const { return ""; } string_type operator()(const object_type&) const { return "[object Object]"; } }; /** * \brief The number_type visitor. */ template <> class visitor : public boost::static_visitor { public: number_type operator()(const null_type&) const { return 0; } number_type operator()(const boolean_type& bt) const { return bt ? 1 : 0; } number_type operator()(const number_type& nb) const { return nb; } number_type operator()(const string_type& str) const { try { return boost::lexical_cast(str); } catch (boost::bad_lexical_cast&) { return std::numeric_limits::quiet_NaN(); } } number_type operator()(const array_type&) const { return 0; } number_type operator()(const object_type&) const { return std::numeric_limits::quiet_NaN(); } }; /** * \brief The boolean_type visitor. */ template <> class visitor : public boost::static_visitor { public: number_type operator()(const null_type&) const { return false; } boolean_type operator()(const boolean_type& bt) const { return bt; } boolean_type operator()(const number_type& nb) const { return (nb != 0) && (nb != std::numeric_limits::quiet_NaN()); } boolean_type operator()(const string_type& str) const { return !str.empty(); } boolean_type operator()(const array_type&) const { return true; } boolean_type operator()(const object_type&) const { return true; } }; /** * \brief The boolean_type visitor. */ template <> class visitor : public boost::static_visitor { public: const null_type& operator()(const null_type& nt) const { return nt; } template null_type operator()(const Type&) const { return null_type(); } }; /** * \brief The array_type visitor. */ template <> class visitor : public boost::static_visitor { public: const array_type& operator()(const array_type& ar) const { return ar; } template array_type operator()(const Type&) const { return array_type(); } }; /** * \brief The object_type visitor. */ template <> class visitor : public boost::static_visitor { public: const object_type& operator()(const object_type& obj) const { return obj; } template object_type operator()(const Type&) const { return object_type(); } }; /** * \brief A visitor that checks if the variant has the specified type. * \tparam Type The type. */ template class check_type_visitor : public boost::static_visitor { public: bool operator()(const Type&) const { return true; } template bool operator()(const OtherType&) const { return false; } }; template template inline typename boost::enable_if, Type>::type visitor::operator()(const AnyType& val) const { return boost::numeric_cast(visitor()(val)); } /** * \brief Casts a value to the specified type. * \tparam Type The type of the destination value. * \param value The value to cast. * \return The casted value. */ template inline Type value_cast(const value_type& value) { return boost::apply_visitor(visitor(), value); } /** * \brief Checks if a specified value is a truthy value. * \param value The value. * \return true if the value is truthy, according to the Javascript rules. */ inline bool is_truthy(const value_type& value) { return value_cast(value); } /** * \brief Checks if a specified value is a falsy value. * \param value The value. * \return true if the value is falsy, according to the Javascript rules. */ inline bool is_falsy(const value_type& value) { return !is_truthy(value); } /** * \brief Check if the value has the specified type. * \tparam Type The type. * \param value The value. * \return true if value has the specified type. */ template inline bool is(const value_type& value) { return boost::apply_visitor(check_type_visitor(), value); } /** * \brief Output a JSON value to a string stream. * \param os The output stream. * \param value The value. * \return os. */ inline std::ostream& operator<<(std::ostream& os, const value_type& value) { return os << value_cast(value); } } #endif /* KFATHER_VALUE_HPP */ freelan-2.0/libs/kfather/libkfather.vcxproj000066400000000000000000000322161252300335000210710ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {FCBBDD58-4EF6-4EEF-8405-49E06F61364B} Win32Proj libkfather StaticLibrary true v120 Unicode StaticLibrary true v120 Unicode StaticLibrary false v120 true Unicode StaticLibrary false v120 true Unicode $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ ClCompile $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ ClCompile $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ ClCompile $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ ClCompile Level3 Disabled USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;DEBUG;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\kfather 4345;4800 Windows true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 Disabled USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;DEBUG;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\kfather 4345;4800 Windows true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 MaxSpeed true true USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\kfather 4345;4800 Windows true true true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 MaxSpeed true true USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\kfather 4345;4800 Windows true true true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template freelan-2.0/libs/kfather/libkfather.vcxproj.filters000066400000000000000000000032171252300335000225370ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files Source Files Source Files Source Files Header Files Header Files Header Files Header Files freelan-2.0/libs/kfather/src/000077500000000000000000000000001252300335000161245ustar00rootroot00000000000000freelan-2.0/libs/kfather/src/formatter.cpp000066400000000000000000000121341252300335000206340ustar00rootroot00000000000000/* * libkfather - C++ JSON parser/producer library. * Copyright (C) 2010-2012 Julien Kauffmann * * This file is part of libkfather. * * libkfather is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libkfather is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * If you intend to use libkfather in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file formatter.cpp * \author Julien Kauffmann * \brief Formatter classes. */ #include "formatter.hpp" #include "parser.hpp" #include namespace kfather { std::ostream& base_formatter_visitor::operator()(const null_type&) const { return os() << "null"; } std::ostream& base_formatter_visitor::operator()(const boolean_type& bt) const { return os() << (bt ? "true" : "false"); } std::ostream& base_formatter_visitor::operator()(const number_type& nb) const { return os() << nb; } std::ostream& base_formatter_visitor::operator()(const string_type& str) const { os() << '"'; for (string_type::const_iterator it = str.begin(); it != str.end(); ++it) { switch (*it) { case '"': os() << "\\\""; break; case '\\': os() << "\\\\"; break; case '/': os() << "\\/"; break; case '\b': os() << "\\b"; break; case '\n': os() << "\\n"; break; case '\f': os() << "\\f"; break; case '\r': os() << "\\r"; break; case '\t': os() << "\\t"; break; default: os() << *it; } } return os() << '"'; } std::ostream& compact_formatter_visitor::operator()(const array_type& ar) const { os() << "["; if (!ar.items.empty()) { boost::apply_visitor(*this, ar.items.front()); for (array_type::items_type::const_iterator it = ar.items.begin() + 1; it != ar.items.end(); ++it) { os() << ","; boost::apply_visitor(*this, *it); } } return os() << "]"; } std::ostream& compact_formatter_visitor::operator()(const object_type& obj) const { os() << "{"; if (!obj.items.empty()) { object_type::items_type::const_iterator it = obj.items.begin(); (*this)(it->first); os() << ":"; boost::apply_visitor(*this, it->second); ++it; for (; it != obj.items.end(); ++it) { os() << ","; (*this)(it->first); os() << ":"; boost::apply_visitor(*this, it->second); } } return os() << "}"; } std::ostream& inline_formatter_visitor::operator()(const array_type& ar) const { os() << "["; if (!ar.items.empty()) { boost::apply_visitor(*this, ar.items.front()); for (array_type::items_type::const_iterator it = ar.items.begin() + 1; it != ar.items.end(); ++it) { os() << ", "; boost::apply_visitor(*this, *it); } } return os() << "]"; } std::ostream& inline_formatter_visitor::operator()(const object_type& obj) const { os() << "{"; if (!obj.items.empty()) { object_type::items_type::const_iterator it = obj.items.begin(); (*this)(it->first); os() << ": "; boost::apply_visitor(*this, it->second); ++it; for (; it != obj.items.end(); ++it) { os() << ", "; (*this)(it->first); os() << ": "; boost::apply_visitor(*this, it->second); } } return os() << "}"; } std::ostream& pretty_print_formatter_visitor::operator()(const array_type& ar) const { os() << "["; if (!ar.items.empty()) { os() << "\n"; m_indent_level++; indent(); boost::apply_visitor(*this, ar.items.front()); for (array_type::items_type::const_iterator it = ar.items.begin() + 1; it != ar.items.end(); ++it) { os() << ",\n"; indent(); boost::apply_visitor(*this, *it); } os() << "\n"; m_indent_level--; indent(); } return os() << "]"; } std::ostream& pretty_print_formatter_visitor::operator()(const object_type& obj) const { os() << "{"; if (!obj.items.empty()) { os() << "\n"; m_indent_level++; indent(); object_type::items_type::const_iterator it = obj.items.begin(); (*this)(it->first); os() << ": "; boost::apply_visitor(*this, it->second); ++it; for (; it != obj.items.end(); ++it) { os() << ",\n"; indent(); (*this)(it->first); os() << ": "; boost::apply_visitor(*this, it->second); } os() << "\n"; m_indent_level--; indent(); } return os() << "}"; } std::ostream& pretty_print_formatter_visitor::indent() const { for (unsigned int i = 0; i < m_indent_level; ++i) { os() << " "; } return os(); } } freelan-2.0/libs/kfather/src/kfather.cpp000066400000000000000000000022531252300335000202560ustar00rootroot00000000000000/* * libkfather - C++ JSON parser/producer library. * Copyright (C) 2010-2012 Julien Kauffmann * * This file is part of libkfather. * * libkfather is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libkfather is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * If you intend to use libkfather in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file kfather.cpp * \author Julien Kauffmann * \brief The global kfather include file implemenation. */ #include "kfather.hpp" namespace kfather { } freelan-2.0/libs/kfather/src/parser.cpp000066400000000000000000000316751252300335000201400ustar00rootroot00000000000000/* * libkfather - C++ JSON parser/producer library. * Copyright (C) 2010-2012 Julien Kauffmann * * This file is part of libkfather. * * libkfather is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libkfather is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * If you intend to use libkfather in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file parser.cpp * \author Julien Kauffmann * \brief A JSON parser class. */ #include "parser.hpp" #include #include #include #include #include namespace kfather { namespace { int xdigit_to_int(char c) { static const int digit_map[256] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; return digit_map[static_cast(c)]; } } bool parser::parse(value_type& value, const char* buf, size_t buflen, const char** error_token) { assert(buf); const char* const end = buf + buflen; const char* ch = buf; context ctx; skip_whitespace(ctx, ch, end); if (!parse_value(ctx, value, ch, end)) { if (error_token) { *error_token = ch; } return false; } return true; } bool parser::parse(value_type& value, const std::string& str, std::string::size_type* error_pos) { if (error_pos) { std::string::const_iterator error_it; if (!parse(value, str.begin(), str.end(), &error_it)) { *error_pos = std::distance(str.begin(), error_it); return false; } return true; } else { return parse(value, str.begin(), str.end()); } } bool parser::parse(value_type& value, std::istream& is, size_t* error_pos) { const std::istreambuf_iterator begin = std::istreambuf_iterator(is); const std::istreambuf_iterator end; if (error_pos) { std::istreambuf_iterator error_it; if (!parse(value, begin, end, &error_it)) { *error_pos = static_cast(std::distance(begin, error_it)); return false; } return true; } else { return parse(value, begin, end); } } template bool parser::parse(value_type& value, IteratorType begin, IteratorType end, IteratorType* error_pos) { IteratorType it = begin; context ctx; skip_whitespace(ctx, it, end); if (!parse_value(ctx, value, it, end)) { if (error_pos) { *error_pos = it; } return false; } return true; } template bool parser::parse_value(context& ctx, value_type& value, IteratorType& ch, IteratorType end) { bool result = false; if (ch != end) { switch (*ch) { case '{': { object_type object; result = parse_object(ctx, object, ch, end); if (result) { value = object; } break; } case '[': { array_type array; result = parse_array(ctx, array, ch, end); if (result) { value = array; } break; } case '"': { string_type str; result = parse_string(ctx, str, ch, end); if (result) { value = str; } break; } case 't': case 'f': { boolean_type bt; result = parse_boolean(ctx, bt, ch, end); if (result) { value = bt; } break; } case 'n': { null_type nt; result = parse_null(ctx, nt, ch, end); if (result) { value = nt; } break; } default: { number_type nb; result = parse_number(ctx, nb, ch, end); if (result) { value = nb; } break; } } } return result; } template bool parser::parse_object(context& ctx, object_type& value, IteratorType& ch, IteratorType end) { if (!check_char(ctx, '{', ch, end)) { return false; } skip_whitespace(ctx, ch, end); if (ch != end) { object_type object; // Do we have an empty object ? if (*ch == '}') { ++ch; value = object; return true; } while (ch != end) { string_type key; if (!parse_string(ctx, key, ch, end)) { return false; } skip_whitespace(ctx, ch, end); if (!check_char(ctx, ':', ch, end)) { return false; } skip_whitespace(ctx, ch, end); if (!parse_value(ctx, object.items[key], ch, end)) { return false; } skip_whitespace(ctx, ch, end); if (ch != end) { if (*ch == '}') { ++ch; value = object; return true; } if (*ch != ',') { return false; } ++ch; skip_whitespace(ctx, ch, end); } } } return false; } template bool parser::parse_array(context& ctx, array_type& value, IteratorType& ch, IteratorType end) { if (!check_char(ctx, '[', ch, end)) { return false; } skip_whitespace(ctx, ch, end); if (ch != end) { array_type array; // Do we have an empty array. if (*ch == ']') { ++ch; value = array; return true; } while (ch != end) { skip_whitespace(ctx, ch, end); array.items.resize(array.items.size() + 1); if (!parse_value(ctx, array.items[array.items.size() - 1], ch, end)) { return false; } skip_whitespace(ctx, ch, end); if (ch != end) { if (*ch == ']') { ++ch; value = array; return true; } if (*ch != ',') { return false; } ++ch; skip_whitespace(ctx, ch, end); } } } return false; } template bool parser::parse_string(context& ctx, string_type& value, IteratorType& ch, IteratorType end) { ctx.clear(); if (!check_char(ctx, '"', ch, end)) { return false; } while (ch != end) { if (std::iscntrl(*ch)) { return false; } switch (*ch) { case '"': { // The string ends. ++ch; value = ctx.str(); return true; } case '\\': { // An escape character was provided. ++ch; if (ch == end) { return false; } switch (*ch) { case '"': ctx.push_char('"'); ++ch; break; case '\\': ctx.push_char('\\'); ++ch; break; case '/': ctx.push_char('/'); ++ch; break; case 'b': ctx.push_char('\b'); ++ch; break; case 'n': ctx.push_char('\n'); ++ch; break; case 'f': ctx.push_char('\f'); ++ch; break; case 'r': ctx.push_char('\r'); ++ch; break; case 't': ctx.push_char('\t'); ++ch; break; case 'u': { ++ch; uint16_t codepoint = 0x0000; for (size_t i = 0; i < 4; ++i) { if (ch == end) { return false; } if (!std::isxdigit(*ch)) { return false; } codepoint *= 16; codepoint += xdigit_to_int(*ch); ++ch; } ctx.push_codepoint(codepoint); break; } default: return false; } break; } default: { ctx.push_char(*ch); ++ch; } } } return false; } template bool parser::parse_number(context& ctx, number_type& value, IteratorType& ch, IteratorType end) { ctx.clear(); // Check if the number is negative if (ch != end) { if (*ch == '-') { ctx.push_char(*ch); ++ch; } } if (ch == end) { return false; } switch (*ch) { case '0': ctx.push_char(*ch); ++ch; break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': ctx.push_char(*ch); ++ch; while ((ch != end) && std::isdigit(*ch)) { ctx.push_char(*ch); ++ch; } break; } // Check for a period if (ch != end) { if (*ch == '.') { ctx.push_char(*ch); ++ch; while ((ch != end) && std::isdigit(*ch)) { ctx.push_char(*ch); ++ch; } } } // Check for an exponent if (ch != end) { if ((*ch == 'e') || (*ch == 'E')) { ctx.push_char(*ch); ++ch; if (ch == end) { return false; } switch (*ch) { case '-': ctx.push_char(*ch); ++ch; break; case '+': ctx.push_char(*ch); ++ch; break; } if (ch == end) { return false; } while ((ch != end) && std::isdigit(*ch)) { ctx.push_char(*ch); ++ch; } } } if (!ctx.get_number(value)) { return false; } return true; } template bool parser::parse_boolean(context& ctx, boolean_type& value, IteratorType& ch, IteratorType end) { if (check_chars(ctx, "true", ch, end)) { value = true; return true; } if (check_chars(ctx, "false", ch, end)) { value = false; return true; } return false; } template bool parser::parse_null(context& ctx, null_type& value, IteratorType& ch, IteratorType end) { if (check_chars(ctx, "null", ch, end)) { value = null_type(); return true; } return false; } template bool parser::check_char(context&, char c, IteratorType& ch, IteratorType end) { if ((ch != end) && (*ch == c)) { ++ch; return true; } return false; } template bool parser::check_chars(context&, const char* str, IteratorType& ch, IteratorType end) { assert(str); for (const char* c = str; *c != '\0'; ++c, ++ch) { if ((ch == end) || (*ch != *c)) { return false; } } return true; } template void parser::skip_whitespace(context&, IteratorType& ch, IteratorType end) { for (; (ch != end) && std::isspace(*ch); ++ch) {} } parser::context::context() : m_iconv("utf-8", "utf-16be") { } void parser::context::clear() { m_str.clear(); m_utf16.clear(); } void parser::context::push_char(char c) { end_codepoints(); m_str.push_back(c); } void parser::context::push_codepoint(uint16_t cp) { m_utf16.push_back(static_cast(cp / 256)); m_utf16.push_back(static_cast(cp % 256)); } const std::string& parser::context::str() { end_codepoints(); return m_str; } bool parser::context::get_number(number_type& value) { std::istringstream iss(m_str); m_str.clear(); iss >> value; return !iss.fail(); } void parser::context::end_codepoints() { if (!m_utf16.empty()) { const size_t initial_size = m_str.size(); // This is enough to hold all possible UTF-8 encoded characters. m_str.resize(m_str.size() + m_utf16.size() * 2); size_t wrote_cnt = m_iconv.convert_all(m_utf16.c_str(), m_utf16.size(), &m_str[initial_size], m_str.size() - initial_size); m_str.resize(initial_size + wrote_cnt); m_utf16.clear(); } } } freelan-2.0/libs/kfather/src/value.cpp000066400000000000000000000025121252300335000177440ustar00rootroot00000000000000/* * libkfather - C++ JSON parser/producer library. * Copyright (C) 2010-2012 Julien Kauffmann * * This file is part of libkfather. * * libkfather is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libkfather is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * If you intend to use libkfather in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file value.cpp * \author Julien Kauffmann * \brief Value classes. */ #include "value.hpp" namespace kfather { object_type::item_type object_type::get(const key_type& key, item_type def) const { const auto it = items.find(key); if (it != items.end()) { return it->second; } return def; } } freelan-2.0/libs/mongooseplus/000077500000000000000000000000001252300335000164435ustar00rootroot00000000000000freelan-2.0/libs/mongooseplus/README.md000066400000000000000000000011441252300335000177220ustar00rootroot00000000000000What is libmongooseplus? libmongooseplus is a portable C++ wrapper around the libmongoose library. It was designed to ease the use of libmongoose. # Licensing All code is licensed under the GPLv3. See gpl-3.0.txt. If you are interested in using this project under a different license, please [contact me](mailto:julien.kauffmann__AT__freelan.org). I don't bite and I probably won't charge (at least, not much). # Does the project have a website ? Yes, it does. And [here](http://www.freelan.org) it is. You may also find the [git repository](https://github.com/freelan-developers/freelan-all) on github. freelan-2.0/libs/mongooseplus/SConscript000066400000000000000000000006601252300335000204570ustar00rootroot00000000000000Import('env dirs name') import os env = env.Clone() local_include_dir = Dir(os.path.join('include', name)) env.Prepend(CPPPATH=[local_include_dir]) env.Append(CCFLAGS=['-DMONGOOSE_NO_FILESYSTEM', '-DNS_ENABLE_SSL']) includes = env.RInstall(dirs['root'], local_include_dir, ['*.hpp']) library = env.StaticLibrary(target=os.path.join(str(dirs['lib']), name), source=env.RGlob('src', ['*.cpp', '*.c'])) Return('library includes') freelan-2.0/libs/mongooseplus/include/000077500000000000000000000000001252300335000200665ustar00rootroot00000000000000freelan-2.0/libs/mongooseplus/include/mongooseplus/000077500000000000000000000000001252300335000226205ustar00rootroot00000000000000freelan-2.0/libs/mongooseplus/include/mongooseplus/error.hpp000066400000000000000000000074701252300335000244720ustar00rootroot00000000000000/* * libmongooseplus - A C++ lightweight wrapper around the libmongoose * library. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libmongooseplus. * * libmongooseplus is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libmongooseplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libmongooseplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file error.hpp * \author Julien Kauffmann * \brief The errors. */ #pragma once #include #include #include #include namespace mongooseplus { /** * @brief Get the default server error category. * @return The default server error category instance. * * @warning The first call to this function is thread-safe only starting with C++11. */ const boost::system::error_category& mongooseplus_category(); /** * The list of errors. */ enum class mongooseplus_error { http_200_ok = 200, http_204_no_content = 204, http_400_bad_request = 400, http_401_unauthorized = 401, http_405_method_not_allowed = 405, http_406_not_acceptable = 406 }; /** * @brief Create an error_code instance for the given error. * @param error The error. * @return The error_code instance. */ inline boost::system::error_code make_error_code(mongooseplus_error error) { return boost::system::error_code(static_cast(error), mongooseplus_category()); } /** * @brief Create an error_condition instance for the given error. * @param error The error. * @return The error_condition instance. */ inline boost::system::error_condition make_error_condition(mongooseplus_error error) { return boost::system::error_condition(static_cast(error), mongooseplus_category()); } /** * @brief A server error category. */ class mongooseplus_category_impl : public boost::system::error_category { public: /** * @brief Get the name of the category. * @return The name of the category. */ virtual const char* name() const throw(); /** * @brief Get the error message for a given error. * @param ev The error numeric value. * @return The message associated to the error. */ virtual std::string message(int ev) const; }; } namespace boost { namespace system { template <> struct is_error_code_enum< ::mongooseplus::mongooseplus_error> : public boost::true_type {}; } } freelan-2.0/libs/mongooseplus/include/mongooseplus/mongooseplus.hpp000066400000000000000000000364371252300335000261000ustar00rootroot00000000000000/* * libmongooseplus - A C++ lightweight wrapper around the libmongoose * library. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libmongooseplus. * * libmongooseplus is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libmongooseplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libmongooseplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file mongooseplus.hpp * \author Julien KAUFFMANN * \brief The global mongooseplus include file. */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "error.hpp" struct mg_connection; namespace mongooseplus { class request; /** * \brief Represents a HTTP header. */ class header_type { public: header_type(const std::string& _key, const std::string& _value) : m_key(boost::to_lower_copy(_key)), m_value(_value) {} template header_type(const typename std::enable_if::value, std::string>::type& _key, const SequenceType& _values) : m_key(boost::to_lower_copy(_key)), m_value(flatten_list(_values)) {} const std::string& key() const { return m_key; } const std::string& value() const { return m_value; } boost::optional value(const std::string& key) const; std::string value(const std::string& _key, const std::string& default_value) const { const auto result = value(_key); if (result) { return *result; } return default_value; } std::vector values() const { return unflatten_list(m_value); } private: template static std::string flatten_list(const SequenceType& values); static std::vector unflatten_list(const std::string& value); std::string m_key; std::string m_value; }; class generic_session { public: generic_session(const std::string& _session_id, const boost::posix_time::time_duration& duration = boost::posix_time::minutes(5)) : m_session_id(_session_id), m_expires(boost::posix_time::second_clock::universal_time() + duration) { } virtual ~generic_session() { } const std::string& session_id() const { return m_session_id; } bool has_expired(const boost::posix_time::ptime& reference = boost::posix_time::second_clock::universal_time()) const { return (m_expires <= reference); } void expires_in(const boost::posix_time::time_duration& duration) { expires_at(boost::posix_time::second_clock::universal_time() + duration); } void expires_at(const boost::posix_time::ptime& date) { m_expires = date; } const boost::posix_time::ptime& expiration_date() const { return m_expires; } private: void set_session_id(const std::string& _session_id) { m_session_id = _session_id; } std::string m_session_id; boost::posix_time::ptime m_expires; friend class session_handler_type; }; /** * \brief A session handler class. */ class session_handler_type { public: session_handler_type() { generate_session_id(); } template boost::shared_ptr generate_session(Types&&... values) { const std::string session_id = generate_session_id(); boost::shared_ptr session = boost::make_shared(session_id, std::forward(values)...); m_sessions[session_id] = session; return session; } boost::shared_ptr read_session(const request& req) const; void clear_expired(); private: std::string generate_session_id() const; mutable std::string m_last_session_id; std::map> m_sessions; }; /** * \brief The HTTP exception class. */ class http_error : public boost::system::system_error, public boost::exception { public: explicit http_error(mongooseplus_error error) : boost::system::system_error(make_error_code(error)) { } }; typedef std::vector header_list_type; typedef boost::error_info headers_error_info; typedef boost::error_info error_content_error_info; /** * \brief A base web server class. */ class web_server { public: web_server(); virtual ~web_server(); void run(int poll_period = 1000); void stop(); private: struct underlying_server_type; std::unique_ptr m_server; std::atomic m_is_running; protected: session_handler_type& session_handler() { return m_session_handler; } void set_option(const std::string& name, const std::string& value); void set_certificate_and_private_key(cryptoplus::x509::certificate cert, cryptoplus::pkey::pkey private_key); enum class request_result { handled, ignored, expect_more }; virtual request_result handle_auth(request&) { return request_result::handled; } virtual void prepare_request(request&); virtual request_result handle_request(request&) { return request_result::ignored; } virtual request_result handle_poll(request&) { return request_result::ignored; }; virtual request_result handle_http_error(request&) { return request_result::ignored; } virtual request_result handle_close(request&) { return request_result::ignored; } virtual boost::shared_ptr handle_session_required(const request&) { return boost::shared_ptr(); } private: session_handler_type m_session_handler; friend class base_authentication_handler; friend class request; }; /** * \brief A base request class. */ class request { public: web_server& get_web_server() { return m_web_server; } boost::shared_ptr get_session() const { return m_session; } template boost::shared_ptr get_session() const { return boost::dynamic_pointer_cast(m_session); } void set_session(boost::shared_ptr _session) { m_session = _session; } template void set_session(Types&&... values) { set_session(get_web_server().session_handler().generate_session(std::forward(values)...)); } std::string uri() const; header_list_type get_headers() const; boost::optional get_header(const std::string& name) const; header_type get_header(const std::string& name, const std::string& default_value) const; header_type get_header(const std::string& name, const std::vector& default_values) const; std::string request_method() const; std::string http_version() const; std::string query_string() const; int status_code() const; std::string content_type() const; const char* content() const; size_t content_size() const; kfather::value_type json() const; boost::asio::ip::address local_ip() const; uint16_t local_port() const; std::string local() const; boost::asio::ip::address remote_ip() const; uint16_t remote_port() const; std::string remote() const; void set_user_param(void* user_param); void* get_user_param() const; void send_status_code(int status_code); void send_header(const header_type& header); void send_header(header_type&& header); template void send_header(Types&&... values) { send_header(header_type(std::forward(values)...)); } void send_headers(const header_list_type& headers) { for (auto&& header : headers) { send_header(header); } } void send_session(); void send_data(const void* data, size_t data_len); void send_data(const std::string& data) { send_data(data.empty() ? nullptr : &data[0], data.size()); } void send_json(const kfather::value_type& json); void write(const void* buf, size_t buf_len); void set_from_error(const http_error& ex); private: request(web_server&, mg_connection* connection); mg_connection* m_connection; web_server& m_web_server; boost::shared_ptr m_session; friend struct web_server::underlying_server_type; }; /** * \brief Authentication handler class. */ class base_authentication_handler { public: virtual ~base_authentication_handler() {}; const std::string& scheme() const { return m_scheme; } void authenticate(request& req) const { const auto authorization_header = req.get_header("authorization"); if (authorization_header) { if (authenticate_from_header(req, *authorization_header)) { return; } raise_authentication_error(); } else { if (authenticate_from_session(req, req.get_session())) { return; } raise_authentication_error(); } } protected: base_authentication_handler(const std::string& _scheme) : m_scheme(_scheme) { } virtual bool authenticate_from_header(request& req, const header_type& header) const = 0; virtual bool authenticate_from_session(request& req, boost::shared_ptr session) const = 0; virtual void raise_authentication_error() const = 0; private: std::string m_scheme; }; class basic_session_type { public: explicit basic_session_type(const std::string& _username) : m_username(_username) { } virtual ~basic_session_type() { } const std::string& username() const { return m_username; } void set_username(const std::string& _username) { m_username = _username; } private: std::string m_username; }; class basic_authentication_handler : public base_authentication_handler { public: basic_authentication_handler(const std::string& _realm) : base_authentication_handler("Basic"), m_realm(_realm) { } const std::string& realm() const { return m_realm; } protected: bool authenticate_from_header(request& req, const header_type& header) const override; bool authenticate_from_session(request& req, boost::shared_ptr session) const override; virtual bool authenticate_from_username_and_password(request& req, const std::string& username, const std::string& password) const = 0; void raise_authentication_error() const override; private: std::string m_realm; }; class routed_web_server : public web_server { protected: struct route_type { typedef std::function function_type; std::regex url_regex; std::set request_methods; std::set content_types; boost::shared_ptr authentication_handler; function_type function; route_type(const std::string& _url_regex, function_type _function) : url_regex(_url_regex), function(_function) {} route_type(const std::string& _url_regex, const std::set& _request_methods, function_type _function) : url_regex(_url_regex), request_methods(_request_methods), function(_function) {} route_type(const std::string& _url_regex, const std::set& _request_methods, const std::set& _content_types, function_type _function) : url_regex(_url_regex), request_methods(_request_methods), content_types(_content_types), function(_function) {} route_type& set_authentication_handler(boost::shared_ptr auth_handler) { authentication_handler = auth_handler; return *this; } template route_type& set_authentication_handler(Types&&... values) { return set_authentication_handler(boost::make_shared(std::forward(values)...)); } bool url_matches(const request&) const; bool request_method_matches(const request&) const; bool content_type_matches(const request&) const; void check_authentication(request& req) const { if (authentication_handler) { authentication_handler->authenticate(req); } } }; route_type& register_route(route_type&& route); template route_type& register_route(Types&&... values) { return register_route(route_type(std::forward(values)...)); } request_result handle_request(request& req) override; private: const route_type* get_route(const request&); std::vector m_routes; }; template class object_web_server : public routed_web_server { protected: RequestInfoType& get_request_info(request& req) { return *static_cast(req.get_user_param()); } virtual request_result handle_pre_auth(request& req) { return routed_web_server::handle_auth(req); } virtual void handle_post_auth(request&) { } private: request_result handle_auth(request& req) override { const request_result result = handle_pre_auth(req); if (result != request_result::handled) { std::unique_ptr request_info(new RequestInfoType()); req.set_user_param(request_info.get()); handle_post_auth(req); request_info.release(); } return result; } request_result handle_close(request& req) { std::unique_ptr user_data(static_cast(req.get_user_param())); req.set_user_param(nullptr); return routed_web_server::handle_close(req); } }; } freelan-2.0/libs/mongooseplus/libmongooseplus.vcxproj000066400000000000000000000352621252300335000233110ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 4267;4244;4996 4267;4244;4996 4267;4244;4996 4267;4244;4996 false false false false {70266482-33AC-449F-8356-0EC6FA0C1BBD} Win32Proj libmongooseplus StaticLibrary true v120 Unicode StaticLibrary true v120 Unicode StaticLibrary false v120 true Unicode StaticLibrary false v120 true Unicode $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) ClCompile $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) ClCompile $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) ClCompile $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\lib\ $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\libs\$(ProjectName)\ $(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include;$(SolutionDir)\third-party\install\$(PlatformShortName)\$(Configuration)\include\boost-1_57;$(SolutionDir)\libs\asiotap\include;$(SolutionDir)\libs\cryptoplus\include;$(SolutionDir)\libs\executeplus\include;$(SolutionDir)\libs\freelan\include;$(SolutionDir)\libs\fscp\include;$(SolutionDir)\libs\iconvplus\include;$(SolutionDir)\libs\kfather\include;$(SolutionDir)\libs\mongooseplus\include;$(IncludePath) ClCompile Level3 Disabled USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;DEBUG;MONGOOSE_NO_FILESYSTEM;NS_ENABLE_SSL;WIN32;_WIN32_WINNT=0x0501;_DEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\mongooseplus 4996;4267 Windows true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 Disabled USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;DEBUG;MONGOOSE_NO_FILESYSTEM;NS_ENABLE_SSL;WIN32;_WIN32_WINNT=0x0501;_DEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\mongooseplus 4996;4267 Windows true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 MaxSpeed true true USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;MONGOOSE_NO_FILESYSTEM;NS_ENABLE_SSL;WIN32;_WIN32_WINNT=0x0501;NDEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\mongooseplus 4996;4267 Windows true true true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template Level3 MaxSpeed true true USING_STATIC_LIBICONV;CURL_STATICLIB;BOOST_ALL_NO_LIB;MONGOOSE_NO_FILESYSTEM;NS_ENABLE_SSL;WIN32;_WIN32_WINNT=0x0501;NDEBUG;_LIB;%(PreprocessorDefinitions) true $(ProjectDir)\include\mongooseplus 4996;4267 Windows true true true python $(SolutionDir)\defines.py $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp Generating the common defines header. $(SolutionDir)\build\$(PlatformShortName)\$(Configuration)\include\defines.hpp $(SolutionDir)\VERSION;$(SolutionDir)\defines.hpp.template freelan-2.0/libs/mongooseplus/libmongooseplus.vcxproj.filters000066400000000000000000000027111252300335000247510ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files Source Files Source Files Header Files Header Files Header Files freelan-2.0/libs/mongooseplus/src/000077500000000000000000000000001252300335000172325ustar00rootroot00000000000000freelan-2.0/libs/mongooseplus/src/error.cpp000066400000000000000000000056051252300335000210750ustar00rootroot00000000000000/* * libmongooseplus - A lightweight C++ wrapper around the libmongoose * library. * Copyright (C) 2010-2011 Julien KAUFFMANN * * This file is part of libmongooseplus. * * libmongooseplus is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * libmongooseplus is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * * If you intend to use libmongooseplus in a commercial software, please * contact me : we may arrange this for a small fee or no fee at all, * depending on the nature of your project. */ /** * \file error.cpp * \author Julien Kauffmann * \brief The errors. */ #include "error.hpp" namespace mongooseplus { const boost::system::error_category& mongooseplus_category() { static mongooseplus_category_impl instance; return instance; } const char* mongooseplus_category_impl::name() const throw() { return "mongooseplus::error"; } std::string mongooseplus_category_impl::message(int ev) const { switch (static_cast(ev)) { case mongooseplus_error::http_200_ok: { return "HTTP 200 OK"; } case mongooseplus_error::http_204_no_content: { return "HTTP 204 NO CONTENT"; } case mongooseplus_error::http_400_bad_request: { return "HTTP 400 BAD REQUEST"; } case mongooseplus_error::http_401_unauthorized: { return "HTTP 401 UNAUTHORIZED"; } case mongooseplus_error::http_405_method_not_allowed: { return "HTTP 405 METHOD NOT ALLOWED"; } case mongooseplus_error::http_406_not_acceptable: { return "HTTP 406 NOT ACCEPTABLE"; } default: { return "Unknown mongooseplus error"; } } } } freelan-2.0/libs/mongooseplus/src/mongoose.c000066400000000000000000004446601252300335000212420ustar00rootroot00000000000000// Copyright (c) 2004-2013 Sergey Lyubka // Copyright (c) 2013-2014 Cesanta Software Limited // All rights reserved // // This library is dual-licensed: you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as // published by the Free Software Foundation. For the terms of this // license, see . // // You are free to use this library under the terms of the GNU General // Public License, but WITHOUT ANY WARRANTY; without even the implied // warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // Alternatively, you can license this library under a commercial // license, as set out in . #ifdef NOEMBED_NET_SKELETON #include "net_skeleton.h" #else // net_skeleton start // Copyright (c) 2014 Cesanta Software Limited // All rights reserved // // This library is dual-licensed: you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as // published by the Free Software Foundation. For the terms of this // license, see . // // You are free to use this library under the terms of the GNU General // Public License, but WITHOUT ANY WARRANTY; without even the implied // warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // Alternatively, you can license this library under a commercial // license, as set out in . #ifndef NS_SKELETON_HEADER_INCLUDED #define NS_SKELETON_HEADER_INCLUDED #define NS_SKELETON_VERSION "1.0" #undef UNICODE // Use ANSI WinAPI functions #undef _UNICODE // Use multibyte encoding on Windows #define _MBCS // Use multibyte encoding on Windows #define _INTEGRAL_MAX_BITS 64 // Enable _stati64() on Windows #define _CRT_SECURE_NO_WARNINGS // Disable deprecation warning in VS2005+ #undef WIN32_LEAN_AND_MEAN // Let windows.h always include winsock2.h #define _XOPEN_SOURCE 600 // For flockfile() on Linux #define __STDC_FORMAT_MACROS // wants this for C++ #define __STDC_LIMIT_MACROS // C++ wants that for INT64_MAX #define _LARGEFILE_SOURCE // Enable fseeko() and ftello() functions #define _FILE_OFFSET_BITS 64 // Enable 64-bit file offsets #ifdef _MSC_VER #pragma warning (disable : 4127) // FD_SET() emits warning, disable it #pragma warning (disable : 4204) // missing c99 support #endif #include #include #include #include #include #include #include #include #include #include #include #include #ifdef _WIN32 #pragma comment(lib, "ws2_32.lib") // Linking with winsock library #include #include #ifndef EINPROGRESS #define EINPROGRESS WSAEINPROGRESS #endif #ifndef EWOULDBLOCK #define EWOULDBLOCK WSAEWOULDBLOCK #endif #ifndef __func__ #define STRX(x) #x #define STR(x) STRX(x) #define __func__ __FILE__ ":" STR(__LINE__) #endif #ifndef va_copy #define va_copy(x,y) x = y #endif // MINGW #defines va_copy #define snprintf _snprintf #define vsnprintf _vsnprintf #define to64(x) _atoi64(x) typedef int socklen_t; typedef unsigned char uint8_t; typedef unsigned int uint32_t; typedef unsigned short uint16_t; typedef unsigned __int64 uint64_t; typedef __int64 int64_t; typedef SOCKET sock_t; #else #include #include #include #include #include #include #include // For inet_pton() when NS_ENABLE_IPV6 is defined #include #include #include #define closesocket(x) close(x) #define __cdecl #define INVALID_SOCKET (-1) #define to64(x) strtoll(x, NULL, 10) typedef int sock_t; #endif #ifdef NS_ENABLE_DEBUG #define DBG(x) do { printf("%-20s ", __func__); printf x; putchar('\n'); \ fflush(stdout); } while(0) #else #define DBG(x) #endif #define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])) #ifdef NS_ENABLE_SSL #ifdef __APPLE__ #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif #include #include #include #else typedef void *SSL; typedef void *SSL_CTX; #endif #ifdef __cplusplus extern "C" { #endif // __cplusplus union socket_address { struct sockaddr sa; struct sockaddr_in sin; #ifdef NS_ENABLE_IPV6 struct sockaddr_in6 sin6; #endif }; struct iobuf { char *buf; int len; int size; }; void iobuf_init(struct iobuf *, int initial_size); void iobuf_free(struct iobuf *); int iobuf_append(struct iobuf *, const void *data, int data_size); void iobuf_remove(struct iobuf *, int data_size); struct ns_connection; enum ns_event { NS_POLL, NS_ACCEPT, NS_CONNECT, NS_RECV, NS_SEND, NS_CLOSE }; typedef void (*ns_callback_t)(struct ns_connection *, enum ns_event, void *); struct ns_server { void *server_data; union socket_address listening_sa; sock_t listening_sock; struct ns_connection *active_connections; ns_callback_t callback; SSL_CTX *ssl_ctx; SSL_CTX *client_ssl_ctx; sock_t ctl[2]; }; struct ns_connection { struct ns_connection *prev, *next; struct ns_server *server; void *connection_data; time_t last_io_time; sock_t sock; struct iobuf recv_iobuf; struct iobuf send_iobuf; SSL *ssl; unsigned int flags; #define NSF_FINISHED_SENDING_DATA (1 << 0) #define NSF_BUFFER_BUT_DONT_SEND (1 << 1) #define NSF_SSL_HANDSHAKE_DONE (1 << 2) #define NSF_CONNECTING (1 << 3) #define NSF_CLOSE_IMMEDIATELY (1 << 4) #define NSF_ACCEPTED (1 << 5) #define NSF_USER_1 (1 << 6) #define NSF_USER_2 (1 << 7) #define NSF_USER_3 (1 << 8) #define NSF_USER_4 (1 << 9) }; void ns_server_init(struct ns_server *, void *server_data, ns_callback_t); void ns_server_free(struct ns_server *); int ns_server_poll(struct ns_server *, int milli); void ns_server_wakeup(struct ns_server *); void ns_iterate(struct ns_server *, ns_callback_t cb, void *param); struct ns_connection *ns_add_sock(struct ns_server *, sock_t sock, void *p); int ns_bind(struct ns_server *, const char *addr); int ns_set_ssl_cert(struct ns_server *, const char *ssl_cert); struct ns_connection *ns_connect(struct ns_server *, const char *host, int port, int ssl, void *connection_param); int ns_send(struct ns_connection *, const void *buf, int len); int ns_printf(struct ns_connection *, const char *fmt, ...); int ns_vprintf(struct ns_connection *, const char *fmt, va_list ap); // Utility functions void *ns_start_thread(void *(*f)(void *), void *p); int ns_socketpair(sock_t [2]); void ns_set_close_on_exec(sock_t); #ifdef __cplusplus } #endif // __cplusplus #endif // NS_SKELETON_HEADER_INCLUDED // Copyright (c) 2014 Cesanta Software Limited // All rights reserved // // This library is dual-licensed: you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as // published by the Free Software Foundation. For the terms of this // license, see . // // You are free to use this library under the terms of the GNU General // Public License, but WITHOUT ANY WARRANTY; without even the implied // warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // Alternatively, you can license this library under a commercial // license, as set out in . #ifndef NS_MALLOC #define NS_MALLOC malloc #endif #ifndef NS_REALLOC #define NS_REALLOC realloc #endif #ifndef NS_FREE #define NS_FREE free #endif #ifndef IOBUF_RESIZE_MULTIPLIER #define IOBUF_RESIZE_MULTIPLIER 2.0 #endif void iobuf_init(struct iobuf *iobuf, int size) { iobuf->len = iobuf->size = 0; iobuf->buf = NULL; if (size > 0 && (iobuf->buf = (char *) NS_MALLOC(size)) != NULL) { iobuf->size = size; } } void iobuf_free(struct iobuf *iobuf) { if (iobuf != NULL) { if (iobuf->buf != NULL) NS_FREE(iobuf->buf); iobuf_init(iobuf, 0); } } int iobuf_append(struct iobuf *io, const void *buf, int len) { static const double mult = IOBUF_RESIZE_MULTIPLIER; char *p = NULL; int new_len = 0; assert(io->len >= 0); assert(io->len <= io->size); if (len <= 0) { } else if ((new_len = io->len + len) < io->size) { memcpy(io->buf + io->len, buf, len); io->len = new_len; } else if ((p = (char *) NS_REALLOC(io->buf, (int) (new_len * mult))) != NULL) { io->buf = p; memcpy(io->buf + io->len, buf, len); io->len = new_len; io->size = (int) (new_len * mult); } else { len = 0; } return len; } void iobuf_remove(struct iobuf *io, int n) { if (n >= 0 && n <= io->len) { memmove(io->buf, io->buf + n, io->len - n); io->len -= n; } } #ifndef NS_DISABLE_THREADS void *ns_start_thread(void *(*f)(void *), void *p) { #ifdef _WIN32 return (void *) _beginthread((void (__cdecl *)(void *)) f, 0, p); #else pthread_t thread_id = (pthread_t) 0; pthread_attr_t attr; (void) pthread_attr_init(&attr); (void) pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); #if NS_STACK_SIZE > 1 (void) pthread_attr_setstacksize(&attr, NS_STACK_SIZE); #endif pthread_create(&thread_id, &attr, f, p); pthread_attr_destroy(&attr); return (void *) thread_id; #endif } #endif // NS_DISABLE_THREADS static void ns_add_conn(struct ns_server *server, struct ns_connection *c) { c->next = server->active_connections; server->active_connections = c; c->prev = NULL; if (c->next != NULL) c->next->prev = c; } static void ns_remove_conn(struct ns_connection *conn) { if (conn->prev == NULL) conn->server->active_connections = conn->next; if (conn->prev) conn->prev->next = conn->next; if (conn->next) conn->next->prev = conn->prev; } // Print message to buffer. If buffer is large enough to hold the message, // return buffer. If buffer is to small, allocate large enough buffer on heap, // and return allocated buffer. static int ns_avprintf(char **buf, size_t size, const char *fmt, va_list ap) { va_list ap_copy; int len; va_copy(ap_copy, ap); len = vsnprintf(*buf, size, fmt, ap_copy); va_end(ap_copy); if (len < 0) { // eCos and Windows are not standard-compliant and return -1 when // the buffer is too small. Keep allocating larger buffers until we // succeed or out of memory. *buf = NULL; while (len < 0) { if (*buf) free(*buf); size *= 2; if ((*buf = (char *) NS_MALLOC(size)) == NULL) break; va_copy(ap_copy, ap); len = vsnprintf(*buf, size, fmt, ap_copy); va_end(ap_copy); } } else if (len > (int) size) { // Standard-compliant code path. Allocate a buffer that is large enough. if ((*buf = (char *) NS_MALLOC(len + 1)) == NULL) { len = -1; } else { va_copy(ap_copy, ap); len = vsnprintf(*buf, len + 1, fmt, ap_copy); va_end(ap_copy); } } return len; } int ns_vprintf(struct ns_connection *conn, const char *fmt, va_list ap) { char mem[2000], *buf = mem; int len; if ((len = ns_avprintf(&buf, sizeof(mem), fmt, ap)) > 0) { iobuf_append(&conn->send_iobuf, buf, len); } if (buf != mem && buf != NULL) { free(buf); } return len; } int ns_printf(struct ns_connection *conn, const char *fmt, ...) { int len; va_list ap; va_start(ap, fmt); len = ns_vprintf(conn, fmt, ap); va_end(ap); return len; } static void ns_call(struct ns_connection *conn, enum ns_event ev, void *p) { if (conn->server->callback) conn->server->callback(conn, ev, p); } static void ns_close_conn(struct ns_connection *conn) { DBG(("%p %d", conn, conn->flags)); ns_call(conn, NS_CLOSE, NULL); ns_remove_conn(conn); closesocket(conn->sock); iobuf_free(&conn->recv_iobuf); iobuf_free(&conn->send_iobuf); NS_FREE(conn); } void ns_set_close_on_exec(sock_t sock) { #ifdef _WIN32 (void) SetHandleInformation((HANDLE) sock, HANDLE_FLAG_INHERIT, 0); #else fcntl(sock, F_SETFD, FD_CLOEXEC); #endif } static void ns_set_non_blocking_mode(sock_t sock) { #ifdef _WIN32 unsigned long on = 1; ioctlsocket(sock, FIONBIO, &on); #else int flags = fcntl(sock, F_GETFL, 0); fcntl(sock, F_SETFL, flags | O_NONBLOCK); #endif } #ifndef NS_DISABLE_SOCKETPAIR int ns_socketpair(sock_t sp[2]) { struct sockaddr_in sa; sock_t sock; socklen_t len = sizeof(sa); int ret = 0; sp[0] = sp[1] = INVALID_SOCKET; (void) memset(&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; sa.sin_port = htons(0); sa.sin_addr.s_addr = htonl(0x7f000001); if ((sock = socket(AF_INET, SOCK_STREAM, 0)) != INVALID_SOCKET && !bind(sock, (struct sockaddr *) &sa, len) && !listen(sock, 1) && !getsockname(sock, (struct sockaddr *) &sa, &len) && (sp[0] = socket(AF_INET, SOCK_STREAM, 6)) != -1 && !connect(sp[0], (struct sockaddr *) &sa, len) && (sp[1] = accept(sock,(struct sockaddr *) &sa, &len)) != INVALID_SOCKET) { ns_set_close_on_exec(sp[0]); ns_set_close_on_exec(sp[1]); ret = 1; } else { if (sp[0] != INVALID_SOCKET) closesocket(sp[0]); if (sp[1] != INVALID_SOCKET) closesocket(sp[1]); sp[0] = sp[1] = INVALID_SOCKET; } closesocket(sock); return ret; } #endif // NS_DISABLE_SOCKETPAIR // Valid listening port spec is: [ip_address:]port, e.g. "80", "127.0.0.1:3128" static int ns_parse_port_string(const char *str, union socket_address *sa) { unsigned int a, b, c, d, port; int len = 0; #ifdef NS_ENABLE_IPV6 char buf[100]; #endif // MacOS needs that. If we do not zero it, subsequent bind() will fail. // Also, all-zeroes in the socket address means binding to all addresses // for both IPv4 and IPv6 (INADDR_ANY and IN6ADDR_ANY_INIT). memset(sa, 0, sizeof(*sa)); sa->sin.sin_family = AF_INET; if (sscanf(str, "%u.%u.%u.%u:%u%n", &a, &b, &c, &d, &port, &len) == 5) { // Bind to a specific IPv4 address, e.g. 192.168.1.5:8080 sa->sin.sin_addr.s_addr = htonl((a << 24) | (b << 16) | (c << 8) | d); sa->sin.sin_port = htons((uint16_t) port); #ifdef NS_ENABLE_IPV6 } else if (sscanf(str, "[%49[^]]]:%u%n", buf, &port, &len) == 2 && inet_pton(AF_INET6, buf, &sa->sin6.sin6_addr)) { // IPv6 address, e.g. [3ffe:2a00:100:7031::1]:8080 sa->sin6.sin6_family = AF_INET6; sa->sin6.sin6_port = htons((uint16_t) port); #endif } else if (sscanf(str, "%u%n", &port, &len) == 1) { // If only port is specified, bind to IPv4, INADDR_ANY sa->sin.sin_port = htons((uint16_t) port); } else { port = 0; // Parsing failure. Make port invalid. } return port <= 0xffff && str[len] == '\0'; } // 'sa' must be an initialized address to bind to static sock_t ns_open_listening_socket(union socket_address *sa) { socklen_t len = sizeof(*sa); sock_t on = 1, sock = INVALID_SOCKET; if ((sock = socket(sa->sa.sa_family, SOCK_STREAM, 6)) != INVALID_SOCKET && !setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *) &on, sizeof(on)) && !bind(sock, &sa->sa, sa->sa.sa_family == AF_INET ? sizeof(sa->sin) : sizeof(sa->sa)) && !listen(sock, SOMAXCONN)) { ns_set_non_blocking_mode(sock); // In case port was set to 0, get the real port number (void) getsockname(sock, &sa->sa, &len); } else if (sock != INVALID_SOCKET) { closesocket(sock); sock = INVALID_SOCKET; } return sock; } int ns_set_ssl_cert(struct ns_server *server, const char *cert) { #ifdef NS_ENABLE_SSL if (cert != NULL && (server->ssl_ctx = SSL_CTX_new(SSLv23_server_method())) == NULL) { return -1; } else if (SSL_CTX_use_certificate_file(server->ssl_ctx, cert, 1) == 0 || SSL_CTX_use_PrivateKey_file(server->ssl_ctx, cert, 1) == 0) { return -2; } else { SSL_CTX_use_certificate_chain_file(server->ssl_ctx, cert); } return 0; #else return server != NULL && cert == NULL ? 0 : -3; #endif } int ns_bind(struct ns_server *server, const char *str) { ns_parse_port_string(str, &server->listening_sa); if (server->listening_sock != INVALID_SOCKET) { closesocket(server->listening_sock); } server->listening_sock = ns_open_listening_socket(&server->listening_sa); return server->listening_sock == INVALID_SOCKET ? -1 : (int) ntohs(server->listening_sa.sin.sin_port); } static struct ns_connection *accept_conn(struct ns_server *server) { struct ns_connection *c = NULL; union socket_address sa; socklen_t len = sizeof(sa); sock_t sock = INVALID_SOCKET; // NOTE(lsm): on Windows, sock is always > FD_SETSIZE if ((sock = accept(server->listening_sock, &sa.sa, &len)) == INVALID_SOCKET) { closesocket(sock); } else if ((c = (struct ns_connection *) NS_MALLOC(sizeof(*c))) == NULL || memset(c, 0, sizeof(*c)) == NULL) { closesocket(sock); #ifdef NS_ENABLE_SSL } else if (server->ssl_ctx != NULL && ((c->ssl = SSL_new(server->ssl_ctx)) == NULL || SSL_set_fd(c->ssl, sock) != 1)) { DBG(("SSL error")); closesocket(sock); free(c); c = NULL; #endif } else { ns_set_close_on_exec(sock); ns_set_non_blocking_mode(sock); c->server = server; c->sock = sock; c->flags |= NSF_ACCEPTED; ns_add_conn(server, c); ns_call(c, NS_ACCEPT, &sa); DBG(("%p %d %p %p", c, c->sock, c->ssl, server->ssl_ctx)); } return c; } static int ns_is_error(int n) { return n == 0 || (n < 0 && errno != EINTR && errno != EINPROGRESS && errno != EAGAIN && errno != EWOULDBLOCK #ifdef _WIN32 && WSAGetLastError() != WSAEINTR && WSAGetLastError() != WSAEWOULDBLOCK #endif ); } #ifdef NS_ENABLE_HEXDUMP static void ns_hexdump(const struct ns_connection *conn, const void *buf, int len, const char *marker) { const unsigned char *p = (const unsigned char *) buf; char path[500], date[100], ascii[17]; FILE *fp; #if 0 if (!match_prefix(NS_ENABLE_HEXDUMP, strlen(NS_ENABLE_HEXDUMP), conn->remote_ip)) { return; } snprintf(path, sizeof(path), "%s.%hu.txt", conn->mg_conn.remote_ip, conn->mg_conn.remote_port); #endif snprintf(path, sizeof(path), "%p.txt", conn); if ((fp = fopen(path, "a")) != NULL) { time_t cur_time = time(NULL); int i, idx; strftime(date, sizeof(date), "%d/%b/%Y %H:%M:%S", localtime(&cur_time)); fprintf(fp, "%s %s %d bytes\n", marker, date, len); for (i = 0; i < len; i++) { idx = i % 16; if (idx == 0) { if (i > 0) fprintf(fp, " %s\n", ascii); fprintf(fp, "%04x ", i); } fprintf(fp, " %02x", p[i]); ascii[idx] = p[i] < 0x20 || p[i] > 0x7e ? '.' : p[i]; ascii[idx + 1] = '\0'; } while (i++ % 16) fprintf(fp, "%s", " "); fprintf(fp, " %s\n\n", ascii); fclose(fp); } } #endif static void ns_read_from_socket(struct ns_connection *conn) { char buf[2048]; int n = 0; if (conn->flags & NSF_CONNECTING) { int ok = 1, ret; socklen_t len = sizeof(ok); ret = getsockopt(conn->sock, SOL_SOCKET, SO_ERROR, (char *) &ok, &len); (void) ret; #ifdef NS_ENABLE_SSL if (ret == 0 && ok == 0 && conn->ssl != NULL) { int res = SSL_connect(conn->ssl); int ssl_err = SSL_get_error(conn->ssl, res); DBG(("%p SSL_connect %d %d", conn, res, ssl_err)); if (res == 1) { conn->flags = NSF_SSL_HANDSHAKE_DONE; } else if (ssl_err == 2 || ssl_err == 3) { return; // Call us again } else { ok = 1; } } #endif conn->flags &= ~NSF_CONNECTING; DBG(("%p ok=%d", conn, ok)); if (ok != 0) { conn->flags |= NSF_CLOSE_IMMEDIATELY; } ns_call(conn, NS_CONNECT, &ok); return; } #ifdef NS_ENABLE_SSL if (conn->ssl != NULL) { if (conn->flags & NSF_SSL_HANDSHAKE_DONE) { n = SSL_read(conn->ssl, buf, sizeof(buf)); } else { int res = SSL_accept(conn->ssl); int ssl_err = SSL_get_error(conn->ssl, res); DBG(("%p SSL_accept %d %d", conn, res, ssl_err)); if (res == 1) { conn->flags |= NSF_SSL_HANDSHAKE_DONE; } else if (ssl_err == 2 || ssl_err == 3) { return; // Call us again } else { conn->flags |= NSF_CLOSE_IMMEDIATELY; } return; } } else #endif { n = recv(conn->sock, buf, sizeof(buf), 0); } #ifdef NS_ENABLE_HEXDUMP ns_hexdump(conn, buf, n, "<-"); #endif DBG(("%p <- %d bytes [%.*s%s]", conn, n, n < 40 ? n : 40, buf, n < 40 ? "" : "...")); if (ns_is_error(n)) { conn->flags |= NSF_CLOSE_IMMEDIATELY; } else if (n > 0) { iobuf_append(&conn->recv_iobuf, buf, n); ns_call(conn, NS_RECV, &n); } } static void ns_write_to_socket(struct ns_connection *conn) { struct iobuf *io = &conn->send_iobuf; int n = 0; #ifdef NS_ENABLE_SSL if (conn->ssl != NULL) { n = SSL_write(conn->ssl, io->buf, io->len); } else #endif { n = send(conn->sock, io->buf, io->len, 0); } #ifdef NS_ENABLE_HEXDUMP ns_hexdump(conn, io->buf, n, "->"); #endif DBG(("%p -> %d bytes %d [%.*s%s]", conn, n, conn->flags, io->len < 40 ? io->len : 40, io->buf, io->len < 40 ? "" : "...")); if (ns_is_error(n)) { conn->flags |= NSF_CLOSE_IMMEDIATELY; } else if (n > 0) { iobuf_remove(io, n); //conn->num_bytes_sent += n; } if (io->len == 0 && conn->flags & NSF_FINISHED_SENDING_DATA) { conn->flags |= NSF_CLOSE_IMMEDIATELY; } ns_call(conn, NS_SEND, NULL); } int ns_send(struct ns_connection *conn, const void *buf, int len) { return iobuf_append(&conn->send_iobuf, buf, len); } static void ns_add_to_set(sock_t sock, fd_set *set, sock_t *max_fd) { if (sock != INVALID_SOCKET) { FD_SET(sock, set); if (*max_fd == INVALID_SOCKET || sock > *max_fd) { *max_fd = sock; } } } int ns_server_poll(struct ns_server *server, int milli) { struct ns_connection *conn, *tmp_conn; struct timeval tv; fd_set read_set, write_set; int num_active_connections = 0; sock_t max_fd = INVALID_SOCKET; time_t current_time = time(NULL); if (server->listening_sock == INVALID_SOCKET && server->active_connections == NULL) return 0; FD_ZERO(&read_set); FD_ZERO(&write_set); ns_add_to_set(server->listening_sock, &read_set, &max_fd); ns_add_to_set(server->ctl[1], &read_set, &max_fd); for (conn = server->active_connections; conn != NULL; conn = tmp_conn) { tmp_conn = conn->next; ns_call(conn, NS_POLL, ¤t_time); ns_add_to_set(conn->sock, &read_set, &max_fd); if (conn->flags & NSF_CONNECTING) { ns_add_to_set(conn->sock, &write_set, &max_fd); } if (conn->send_iobuf.len > 0 && !(conn->flags & NSF_BUFFER_BUT_DONT_SEND)) { ns_add_to_set(conn->sock, &write_set, &max_fd); } else if (conn->flags & NSF_CLOSE_IMMEDIATELY) { ns_close_conn(conn); } } tv.tv_sec = milli / 1000; tv.tv_usec = (milli % 1000) * 1000; if (select((int) max_fd + 1, &read_set, &write_set, NULL, &tv) > 0) { // Accept new connections if (server->listening_sock != INVALID_SOCKET && FD_ISSET(server->listening_sock, &read_set)) { // We're not looping here, and accepting just one connection at // a time. The reason is that eCos does not respect non-blocking // flag on a listening socket and hangs in a loop. if ((conn = accept_conn(server)) != NULL) { conn->last_io_time = current_time; } } // Read possible wakeup calls if (server->ctl[1] != INVALID_SOCKET && FD_ISSET(server->ctl[1], &read_set)) { unsigned char ch; recv(server->ctl[1], &ch, 1, 0); send(server->ctl[1], &ch, 1, 0); } for (conn = server->active_connections; conn != NULL; conn = tmp_conn) { tmp_conn = conn->next; if (FD_ISSET(conn->sock, &read_set)) { conn->last_io_time = current_time; ns_read_from_socket(conn); } if (FD_ISSET(conn->sock, &write_set)) { if (conn->flags & NSF_CONNECTING) { ns_read_from_socket(conn); } else if (!(conn->flags & NSF_BUFFER_BUT_DONT_SEND)) { conn->last_io_time = current_time; ns_write_to_socket(conn); } } } } for (conn = server->active_connections; conn != NULL; conn = tmp_conn) { tmp_conn = conn->next; num_active_connections++; if (conn->flags & NSF_CLOSE_IMMEDIATELY) { ns_close_conn(conn); } } //DBG(("%d active connections", num_active_connections)); return num_active_connections; } struct ns_connection *ns_connect(struct ns_server *server, const char *host, int port, int use_ssl, void *param) { sock_t sock = INVALID_SOCKET; struct sockaddr_in sin; struct hostent *he = NULL; struct ns_connection *conn = NULL; int connect_ret_val; (void) use_ssl; if (host == NULL || (he = gethostbyname(host)) == NULL || (sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { DBG(("gethostbyname(%s) failed: %s", host, strerror(errno))); return NULL; } sin.sin_family = AF_INET; sin.sin_port = htons((uint16_t) port); sin.sin_addr = * (struct in_addr *) he->h_addr_list[0]; ns_set_non_blocking_mode(sock); connect_ret_val = connect(sock, (struct sockaddr *) &sin, sizeof(sin)); if (ns_is_error(connect_ret_val)) { closesocket(sock); return NULL; } else if ((conn = (struct ns_connection *) NS_MALLOC(sizeof(*conn))) == NULL) { closesocket(sock); return NULL; } memset(conn, 0, sizeof(*conn)); conn->server = server; conn->sock = sock; conn->connection_data = param; conn->flags = NSF_CONNECTING; conn->last_io_time = time(NULL); #ifdef NS_ENABLE_SSL if (use_ssl && (conn->ssl = SSL_new(server->client_ssl_ctx)) != NULL) { SSL_set_fd(conn->ssl, sock); } #endif ns_add_conn(server, conn); DBG(("%p %s:%d %d %p", conn, host, port, conn->sock, conn->ssl)); return conn; } struct ns_connection *ns_add_sock(struct ns_server *s, sock_t sock, void *p) { struct ns_connection *conn; if ((conn = (struct ns_connection *) NS_MALLOC(sizeof(*conn))) != NULL) { memset(conn, 0, sizeof(*conn)); ns_set_non_blocking_mode(sock); conn->sock = sock; conn->connection_data = p; conn->server = s; conn->last_io_time = time(NULL); ns_add_conn(s, conn); DBG(("%p %d", conn, sock)); } return conn; } void ns_iterate(struct ns_server *server, ns_callback_t cb, void *param) { struct ns_connection *conn, *tmp_conn; for (conn = server->active_connections; conn != NULL; conn = tmp_conn) { tmp_conn = conn->next; cb(conn, NS_POLL, param); } } void ns_server_wakeup(struct ns_server *server) { unsigned char ch = 0; if (server->ctl[0] != INVALID_SOCKET) { send(server->ctl[0], &ch, 1, 0); recv(server->ctl[0], &ch, 1, 0); } } void ns_server_init(struct ns_server *s, void *server_data, ns_callback_t cb) { memset(s, 0, sizeof(*s)); s->listening_sock = s->ctl[0] = s->ctl[1] = INVALID_SOCKET; s->server_data = server_data; s->callback = cb; #ifdef _WIN32 { WSADATA data; WSAStartup(MAKEWORD(2, 2), &data); } #else // Ignore SIGPIPE signal, so if client cancels the request, it // won't kill the whole process. signal(SIGPIPE, SIG_IGN); #endif #ifndef NS_DISABLE_SOCKETPAIR do { ns_socketpair(s->ctl); } while (s->ctl[0] == INVALID_SOCKET); #endif #ifdef NS_ENABLE_SSL SSL_library_init(); s->client_ssl_ctx = SSL_CTX_new(SSLv23_client_method()); #endif } void ns_server_free(struct ns_server *s) { struct ns_connection *conn, *tmp_conn; DBG(("%p", s)); if (s == NULL) return; // Do one last poll, see https://github.com/cesanta/mongoose/issues/286 ns_server_poll(s, 0); if (s->listening_sock != INVALID_SOCKET) closesocket(s->listening_sock); if (s->ctl[0] != INVALID_SOCKET) closesocket(s->ctl[0]); if (s->ctl[1] != INVALID_SOCKET) closesocket(s->ctl[1]); s->listening_sock = s->ctl[0] = s->ctl[1] = INVALID_SOCKET; for (conn = s->active_connections; conn != NULL; conn = tmp_conn) { tmp_conn = conn->next; ns_close_conn(conn); } #ifdef NS_ENABLE_SSL if (s->ssl_ctx != NULL) SSL_CTX_free(s->ssl_ctx); if (s->client_ssl_ctx != NULL) SSL_CTX_free(s->client_ssl_ctx); #endif } // net_skeleton end #endif // NOEMBED_NET_SKELETON #include #ifdef _WIN32 //////////////// Windows specific defines and includes #include // For _lseeki64 #include // For _mkdir #ifndef S_ISDIR #define S_ISDIR(x) ((x) & _S_IFDIR) #endif #define sleep(x) Sleep((x) * 1000) #define stat(x, y) mg_stat((x), (y)) #define fopen(x, y) mg_fopen((x), (y)) #define open(x, y) mg_open((x), (y)) #define lseek(x, y, z) _lseeki64((x), (y), (z)) #define popen(x, y) _popen((x), (y)) #define pclose(x) _pclose(x) #define mkdir(x, y) _mkdir(x) #define to64(x) _atoi64(x) #ifndef __func__ #define STRX(x) #x #define STR(x) STRX(x) #define __func__ __FILE__ ":" STR(__LINE__) #endif #define INT64_FMT "I64d" #define stat(x, y) mg_stat((x), (y)) #define fopen(x, y) mg_fopen((x), (y)) #define open(x, y) mg_open((x), (y)) #define flockfile(x) ((void) (x)) #define funlockfile(x) ((void) (x)) typedef struct _stati64 file_stat_t; typedef HANDLE pid_t; #else ////////////// UNIX specific defines and includes #include #include #include #define O_BINARY 0 #define INT64_FMT PRId64 typedef struct stat file_stat_t; #endif //////// End of platform-specific defines and includes #include "mongoose.h" #define MAX_REQUEST_SIZE 16384 #define IOBUF_SIZE 8192 #define MAX_PATH_SIZE 8192 #define LUA_SCRIPT_PATTERN "**.lp$" #define DEFAULT_CGI_PATTERN "**.cgi$|**.pl$|**.php$" #define CGI_ENVIRONMENT_SIZE 8192 #define MAX_CGI_ENVIR_VARS 64 #define ENV_EXPORT_TO_CGI "MONGOOSE_CGI" #define PASSWORDS_FILE_NAME ".htpasswd" #ifndef MONGOOSE_USE_WEBSOCKET_PING_INTERVAL #define MONGOOSE_USE_WEBSOCKET_PING_INTERVAL 5 #endif // Extra HTTP headers to send in every static file reply #if !defined(MONGOOSE_USE_EXTRA_HTTP_HEADERS) #define MONGOOSE_USE_EXTRA_HTTP_HEADERS "" #endif #ifndef MONGOOSE_POST_SIZE_LIMIT #define MONGOOSE_POST_SIZE_LIMIT 0 #endif #ifndef MONGOOSE_IDLE_TIMEOUT_SECONDS #define MONGOOSE_IDLE_TIMEOUT_SECONDS 30 #endif #ifdef MONGOOSE_NO_SOCKETPAIR #define MONGOOSE_NO_CGI #endif #ifdef MONGOOSE_NO_FILESYSTEM #define MONGOOSE_NO_AUTH #define MONGOOSE_NO_CGI #define MONGOOSE_NO_DAV #define MONGOOSE_NO_DIRECTORY_LISTING #define MONGOOSE_NO_LOGGING #define MONGOOSE_NO_SSI #endif struct vec { const char *ptr; int len; }; // For directory listing and WevDAV support struct dir_entry { struct connection *conn; char *file_name; file_stat_t st; }; // NOTE(lsm): this enum shoulds be in sync with the config_options. enum { ACCESS_CONTROL_LIST, #ifndef MONGOOSE_NO_FILESYSTEM ACCESS_LOG_FILE, #ifndef MONGOOSE_NO_AUTH AUTH_DOMAIN, #endif #ifndef MONGOOSE_NO_CGI CGI_INTERPRETER, CGI_PATTERN, #endif #ifndef MONGOOSE_NO_DAV DAV_AUTH_FILE, #endif DOCUMENT_ROOT, #ifndef MONGOOSE_NO_DIRECTORY_LISTING ENABLE_DIRECTORY_LISTING, #endif #endif EXTRA_MIME_TYPES, #if !defined(MONGOOSE_NO_FILESYSTEM) && !defined(MONGOOSE_NO_AUTH) GLOBAL_AUTH_FILE, #endif HIDE_FILES_PATTERN, #ifndef MONGOOSE_NO_FILESYSTEM INDEX_FILES, #endif LISTENING_PORT, #ifndef _WIN32 RUN_AS_USER, #endif #ifndef MONGOOSE_NO_SSI SSI_PATTERN, #endif #ifdef NS_ENABLE_SSL SSL_CERTIFICATE, #endif URL_REWRITES, NUM_OPTIONS }; static const char *static_config_options[] = { "access_control_list", NULL, #ifndef MONGOOSE_NO_FILESYSTEM "access_log_file", NULL, #ifndef MONGOOSE_NO_AUTH "auth_domain", "mydomain.com", #endif #ifndef MONGOOSE_NO_CGI "cgi_interpreter", NULL, "cgi_pattern", DEFAULT_CGI_PATTERN, #endif #ifndef MONGOOSE_NO_DAV "dav_auth_file", NULL, #endif "document_root", NULL, #ifndef MONGOOSE_NO_DIRECTORY_LISTING "enable_directory_listing", "yes", #endif #endif "extra_mime_types", NULL, #if !defined(MONGOOSE_NO_FILESYSTEM) && !defined(MONGOOSE_NO_AUTH) "global_auth_file", NULL, #endif "hide_files_patterns", NULL, #ifndef MONGOOSE_NO_FILESYSTEM "index_files","index.html,index.htm,index.shtml,index.cgi,index.php,index.lp", #endif "listening_port", NULL, #ifndef _WIN32 "run_as_user", NULL, #endif #ifndef MONGOOSE_NO_SSI "ssi_pattern", "**.shtml$|**.shtm$", #endif #ifdef NS_ENABLE_SSL "ssl_certificate", NULL, #endif "url_rewrites", NULL, NULL }; struct mg_server { struct ns_server ns_server; union socket_address lsa; // Listening socket address mg_handler_t event_handler; char *config_options[NUM_OPTIONS]; char local_ip[48]; }; // Local endpoint representation union endpoint { int fd; // Opened regular local file struct ns_connection *cgi_conn; // CGI socket }; enum endpoint_type { EP_NONE, EP_FILE, EP_CGI, EP_USER, EP_PUT, EP_CLIENT }; #define MG_HEADERS_SENT NSF_USER_1 #define MG_LONG_RUNNING NSF_USER_2 #define MG_CGI_CONN NSF_USER_3 struct connection { struct ns_connection *ns_conn; struct mg_connection mg_conn; struct mg_server *server; union endpoint endpoint; enum endpoint_type endpoint_type; char *path_info; char *request; int64_t num_bytes_sent; // Total number of bytes sent int64_t cl; // Reply content length, for Range support int request_len; // Request length, including last \r\n after last header //int flags; // CONN_* flags: CONN_CLOSE, CONN_SPOOL_DONE, etc //mg_handler_t handler; // Callback for HTTP client }; #define MG_CONN_2_CONN(c) ((struct connection *) ((char *) (c) - \ offsetof(struct connection, mg_conn))) static void open_local_endpoint(struct connection *conn, int skip_user); static void close_local_endpoint(struct connection *conn); static const struct { const char *extension; size_t ext_len; const char *mime_type; } static_builtin_mime_types[] = { {".html", 5, "text/html"}, {".htm", 4, "text/html"}, {".shtm", 5, "text/html"}, {".shtml", 6, "text/html"}, {".css", 4, "text/css"}, {".js", 3, "application/x-javascript"}, {".ico", 4, "image/x-icon"}, {".gif", 4, "image/gif"}, {".jpg", 4, "image/jpeg"}, {".jpeg", 5, "image/jpeg"}, {".png", 4, "image/png"}, {".svg", 4, "image/svg+xml"}, {".txt", 4, "text/plain"}, {".torrent", 8, "application/x-bittorrent"}, {".wav", 4, "audio/x-wav"}, {".mp3", 4, "audio/x-mp3"}, {".mid", 4, "audio/mid"}, {".m3u", 4, "audio/x-mpegurl"}, {".ogg", 4, "application/ogg"}, {".ram", 4, "audio/x-pn-realaudio"}, {".xml", 4, "text/xml"}, {".json", 5, "text/json"}, {".xslt", 5, "application/xml"}, {".xsl", 4, "application/xml"}, {".ra", 3, "audio/x-pn-realaudio"}, {".doc", 4, "application/msword"}, {".exe", 4, "application/octet-stream"}, {".zip", 4, "application/x-zip-compressed"}, {".xls", 4, "application/excel"}, {".tgz", 4, "application/x-tar-gz"}, {".tar", 4, "application/x-tar"}, {".gz", 3, "application/x-gunzip"}, {".arj", 4, "application/x-arj-compressed"}, {".rar", 4, "application/x-arj-compressed"}, {".rtf", 4, "application/rtf"}, {".pdf", 4, "application/pdf"}, {".swf", 4, "application/x-shockwave-flash"}, {".mpg", 4, "video/mpeg"}, {".webm", 5, "video/webm"}, {".mpeg", 5, "video/mpeg"}, {".mov", 4, "video/quicktime"}, {".mp4", 4, "video/mp4"}, {".m4v", 4, "video/x-m4v"}, {".asf", 4, "video/x-ms-asf"}, {".avi", 4, "video/x-msvideo"}, {".bmp", 4, "image/bmp"}, {".ttf", 4, "application/x-font-ttf"}, {NULL, 0, NULL} }; #ifndef MONGOOSE_NO_THREADS void *mg_start_thread(void *(*f)(void *), void *p) { return ns_start_thread(f, p); } #endif // MONGOOSE_NO_THREADS #ifdef _WIN32 #ifndef MONGOOSE_NO_FILESYSTEM // Encode 'path' which is assumed UTF-8 string, into UNICODE string. // wbuf and wbuf_len is a target buffer and its length. static void to_wchar(const char *path, wchar_t *wbuf, size_t wbuf_len) { char buf[MAX_PATH_SIZE * 2], buf2[MAX_PATH_SIZE * 2], *p; strncpy(buf, path, sizeof(buf)); buf[sizeof(buf) - 1] = '\0'; // Trim trailing slashes. Leave backslash for paths like "X:\" p = buf + strlen(buf) - 1; while (p > buf && p[-1] != ':' && (p[0] == '\\' || p[0] == '/')) *p-- = '\0'; // Convert to Unicode and back. If doubly-converted string does not // match the original, something is fishy, reject. memset(wbuf, 0, wbuf_len * sizeof(wchar_t)); MultiByteToWideChar(CP_UTF8, 0, buf, -1, wbuf, (int) wbuf_len); WideCharToMultiByte(CP_UTF8, 0, wbuf, (int) wbuf_len, buf2, sizeof(buf2), NULL, NULL); if (strcmp(buf, buf2) != 0) { wbuf[0] = L'\0'; } } static int mg_stat(const char *path, file_stat_t *st) { wchar_t wpath[MAX_PATH_SIZE]; to_wchar(path, wpath, ARRAY_SIZE(wpath)); DBG(("[%ls] -> %d", wpath, _wstati64(wpath, st))); return _wstati64(wpath, st); } static FILE *mg_fopen(const char *path, const char *mode) { wchar_t wpath[MAX_PATH_SIZE], wmode[10]; to_wchar(path, wpath, ARRAY_SIZE(wpath)); to_wchar(mode, wmode, ARRAY_SIZE(wmode)); return _wfopen(wpath, wmode); } static int mg_open(const char *path, int flag) { wchar_t wpath[MAX_PATH_SIZE]; to_wchar(path, wpath, ARRAY_SIZE(wpath)); return _wopen(wpath, flag); } #endif #endif // MONGOOSE_NO_FILESYSTEM // A helper function for traversing a comma separated list of values. // It returns a list pointer shifted to the next value, or NULL if the end // of the list found. // Value is stored in val vector. If value has form "x=y", then eq_val // vector is initialized to point to the "y" part, and val vector length // is adjusted to point only to "x". static const char *next_option(const char *list, struct vec *val, struct vec *eq_val) { if (list == NULL || *list == '\0') { // End of the list list = NULL; } else { val->ptr = list; if ((list = strchr(val->ptr, ',')) != NULL) { // Comma found. Store length and shift the list ptr val->len = list - val->ptr; list++; } else { // This value is the last one list = val->ptr + strlen(val->ptr); val->len = list - val->ptr; } if (eq_val != NULL) { // Value has form "x=y", adjust pointers and lengths // so that val points to "x", and eq_val points to "y". eq_val->len = 0; eq_val->ptr = (const char *) memchr(val->ptr, '=', val->len); if (eq_val->ptr != NULL) { eq_val->ptr++; // Skip over '=' character eq_val->len = val->ptr + val->len - eq_val->ptr; val->len = (eq_val->ptr - val->ptr) - 1; } } } return list; } // Like snprintf(), but never returns negative value, or a value // that is larger than a supplied buffer. static int mg_vsnprintf(char *buf, size_t buflen, const char *fmt, va_list ap) { int n; if (buflen < 1) return 0; n = vsnprintf(buf, buflen, fmt, ap); if (n < 0) { n = 0; } else if (n >= (int) buflen) { n = (int) buflen - 1; } buf[n] = '\0'; return n; } static int mg_snprintf(char *buf, size_t buflen, const char *fmt, ...) { va_list ap; int n; va_start(ap, fmt); n = mg_vsnprintf(buf, buflen, fmt, ap); va_end(ap); return n; } // Check whether full request is buffered. Return: // -1 if request is malformed // 0 if request is not yet fully buffered // >0 actual request length, including last \r\n\r\n static int get_request_len(const char *s, int buf_len) { const unsigned char *buf = (unsigned char *) s; int i; for (i = 0; i < buf_len; i++) { // Control characters are not allowed but >=128 are. // Abort scan as soon as one malformed character is found. if (!isprint(buf[i]) && buf[i] != '\r' && buf[i] != '\n' && buf[i] < 128) { return -1; } else if (buf[i] == '\n' && i + 1 < buf_len && buf[i + 1] == '\n') { return i + 2; } else if (buf[i] == '\n' && i + 2 < buf_len && buf[i + 1] == '\r' && buf[i + 2] == '\n') { return i + 3; } } return 0; } // Skip the characters until one of the delimiters characters found. // 0-terminate resulting word. Skip the rest of the delimiters if any. // Advance pointer to buffer to the next word. Return found 0-terminated word. static char *skip(char **buf, const char *delimiters) { char *p, *begin_word, *end_word, *end_delimiters; begin_word = *buf; end_word = begin_word + strcspn(begin_word, delimiters); end_delimiters = end_word + strspn(end_word, delimiters); for (p = end_word; p < end_delimiters; p++) { *p = '\0'; } *buf = end_delimiters; return begin_word; } // Parse HTTP headers from the given buffer, advance buffer to the point // where parsing stopped. static void parse_http_headers(char **buf, struct mg_connection *ri) { size_t i; for (i = 0; i < ARRAY_SIZE(ri->http_headers); i++) { ri->http_headers[i].name = skip(buf, ": "); ri->http_headers[i].value = skip(buf, "\r\n"); if (ri->http_headers[i].name[0] == '\0') break; ri->num_headers = i + 1; } } static const char *status_code_to_str(int status_code) { switch (status_code) { case 200: return "OK"; case 201: return "Created"; case 204: return "No Content"; case 301: return "Moved Permanently"; case 302: return "Found"; case 304: return "Not Modified"; case 400: return "Bad Request"; case 403: return "Forbidden"; case 404: return "Not Found"; case 405: return "Method Not Allowed"; case 409: return "Conflict"; case 411: return "Length Required"; case 413: return "Request Entity Too Large"; case 415: return "Unsupported Media Type"; case 423: return "Locked"; case 500: return "Server Error"; case 501: return "Not Implemented"; default: return "Server Error"; } } static int call_user(struct connection *conn, enum mg_event ev) { return conn != NULL && conn->server != NULL && conn->server->event_handler != NULL ? conn->server->event_handler(&conn->mg_conn, ev) : MG_FALSE; } static void send_http_error(struct connection *conn, int code, const char *fmt, ...) { const char *message = status_code_to_str(code); const char *rewrites = conn->server->config_options[URL_REWRITES]; char headers[200], body[200]; struct vec a, b; va_list ap; int body_len, headers_len, match_code; conn->mg_conn.status_code = code; // Invoke error handler if it is set if (call_user(conn, MG_HTTP_ERROR) == MG_TRUE) { close_local_endpoint(conn); return; } // Handle error code rewrites while ((rewrites = next_option(rewrites, &a, &b)) != NULL) { if ((match_code = atoi(a.ptr)) > 0 && match_code == code) { struct mg_connection *c = &conn->mg_conn; c->status_code = 302; mg_printf(c, "HTTP/1.1 %d Moved\r\n" "Location: %.*s?code=%d&orig_uri=%s&query_string=%s\r\n\r\n", c->status_code, b.len, b.ptr, code, c->uri, c->query_string == NULL ? "" : c->query_string); close_local_endpoint(conn); return; } } body_len = mg_snprintf(body, sizeof(body), "%d %s\n", code, message); if (fmt != NULL) { va_start(ap, fmt); body_len += mg_vsnprintf(body + body_len, sizeof(body) - body_len, fmt, ap); va_end(ap); } if (code >= 300 && code <= 399) { // 3xx errors do not have body body_len = 0; } headers_len = mg_snprintf(headers, sizeof(headers), "HTTP/1.1 %d %s\r\nContent-Length: %d\r\n" "Content-Type: text/plain\r\n\r\n", code, message, body_len); ns_send(conn->ns_conn, headers, headers_len); ns_send(conn->ns_conn, body, body_len); close_local_endpoint(conn); // This will write to the log file } static void write_chunk(struct connection *conn, const char *buf, int len) { char chunk_size[50]; int n = mg_snprintf(chunk_size, sizeof(chunk_size), "%X\r\n", len); ns_send(conn->ns_conn, chunk_size, n); ns_send(conn->ns_conn, buf, len); ns_send(conn->ns_conn, "\r\n", 2); } int mg_printf(struct mg_connection *conn, const char *fmt, ...) { struct connection *c = MG_CONN_2_CONN(conn); int len; va_list ap; va_start(ap, fmt); len = ns_vprintf(c->ns_conn, fmt, ap); va_end(ap); return len; } #ifndef MONGOOSE_NO_CGI #ifdef _WIN32 struct threadparam { sock_t s; HANDLE hPipe; }; static int wait_until_ready(sock_t sock, int for_read) { fd_set set; FD_ZERO(&set); FD_SET(sock, &set); select(sock + 1, for_read ? &set : 0, for_read ? 0 : &set, 0, 0); return 1; } static void *push_to_stdin(void *arg) { struct threadparam *tp = arg; int n, sent, stop = 0; DWORD k; char buf[IOBUF_SIZE]; while (!stop && wait_until_ready(tp->s, 1) && (n = recv(tp->s, buf, sizeof(buf), 0)) > 0) { if (n == -1 && GetLastError() == WSAEWOULDBLOCK) continue; for (sent = 0; !stop && sent < n; sent += k) { if (!WriteFile(tp->hPipe, buf + sent, n - sent, &k, 0)) stop = 1; } } DBG(("%s", "FORWARED EVERYTHING TO CGI")); CloseHandle(tp->hPipe); free(tp); _endthread(); return NULL; } static void *pull_from_stdout(void *arg) { struct threadparam *tp = arg; int k, stop = 0; DWORD n, sent; char buf[IOBUF_SIZE]; while (!stop && ReadFile(tp->hPipe, buf, sizeof(buf), &n, NULL)) { for (sent = 0; !stop && sent < n; sent += k) { if (wait_until_ready(tp->s, 0) && (k = send(tp->s, buf + sent, n - sent, 0)) <= 0) stop = 1; } } DBG(("%s", "EOF FROM CGI")); CloseHandle(tp->hPipe); shutdown(tp->s, 2); // Without this, IO thread may get truncated data closesocket(tp->s); free(tp); _endthread(); return NULL; } static void spawn_stdio_thread(sock_t sock, HANDLE hPipe, void *(*func)(void *)) { struct threadparam *tp = malloc(sizeof(*tp)); if (tp != NULL) { tp->s = sock; tp->hPipe = hPipe; mg_start_thread(func, tp); } } static void abs_path(const char *utf8_path, char *abs_path, size_t len) { wchar_t buf[MAX_PATH_SIZE], buf2[MAX_PATH_SIZE]; to_wchar(utf8_path, buf, ARRAY_SIZE(buf)); GetFullPathNameW(buf, ARRAY_SIZE(buf2), buf2, NULL); WideCharToMultiByte(CP_UTF8, 0, buf2, wcslen(buf2) + 1, abs_path, len, 0, 0); } static pid_t start_process(char *interp, const char *cmd, const char *env, const char *envp[], const char *dir, sock_t sock) { STARTUPINFOW si = {0}; PROCESS_INFORMATION pi = {0}; HANDLE a[2], b[2], me = GetCurrentProcess(); wchar_t wcmd[MAX_PATH_SIZE], full_dir[MAX_PATH_SIZE]; char buf[MAX_PATH_SIZE], buf4[MAX_PATH_SIZE], buf5[MAX_PATH_SIZE], cmdline[MAX_PATH_SIZE], *p; DWORD flags = DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS; FILE *fp; si.cb = sizeof(si); si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; si.hStdError = GetStdHandle(STD_ERROR_HANDLE); CreatePipe(&a[0], &a[1], NULL, 0); CreatePipe(&b[0], &b[1], NULL, 0); DuplicateHandle(me, a[0], me, &si.hStdInput, 0, TRUE, flags); DuplicateHandle(me, b[1], me, &si.hStdOutput, 0, TRUE, flags); if (interp == NULL && (fp = fopen(cmd, "r")) != NULL) { buf[0] = buf[1] = '\0'; fgets(buf, sizeof(buf), fp); buf[sizeof(buf) - 1] = '\0'; if (buf[0] == '#' && buf[1] == '!') { interp = buf + 2; for (p = interp + strlen(interp); isspace(* (uint8_t *) p) && p > interp; p--) *p = '\0'; } fclose(fp); } if (interp != NULL) { abs_path(interp, buf4, ARRAY_SIZE(buf4)); interp = buf4; } abs_path(dir, buf5, ARRAY_SIZE(buf5)); to_wchar(dir, full_dir, ARRAY_SIZE(full_dir)); mg_snprintf(cmdline, sizeof(cmdline), "%s%s\"%s\"", interp ? interp : "", interp ? " " : "", cmd); to_wchar(cmdline, wcmd, ARRAY_SIZE(wcmd)); if (CreateProcessW(NULL, wcmd, NULL, NULL, TRUE, CREATE_NEW_PROCESS_GROUP, (void *) env, full_dir, &si, &pi) != 0) { spawn_stdio_thread(sock, a[1], push_to_stdin); spawn_stdio_thread(sock, b[0], pull_from_stdout); } else { CloseHandle(a[1]); CloseHandle(b[0]); closesocket(sock); } DBG(("CGI command: [%ls] -> %p", wcmd, pi.hProcess)); CloseHandle(si.hStdOutput); CloseHandle(si.hStdInput); CloseHandle(a[0]); CloseHandle(b[1]); CloseHandle(pi.hThread); CloseHandle(pi.hProcess); return (pid_t) pi.hProcess; } #else static pid_t start_process(const char *interp, const char *cmd, const char *env, const char *envp[], const char *dir, sock_t sock) { char buf[500]; pid_t pid = fork(); (void) env; if (pid == 0) { (void) chdir(dir); (void) dup2(sock, 0); (void) dup2(sock, 1); closesocket(sock); // After exec, all signal handlers are restored to their default values, // with one exception of SIGCHLD. According to POSIX.1-2001 and Linux's // implementation, SIGCHLD's handler will leave unchanged after exec // if it was set to be ignored. Restore it to default action. signal(SIGCHLD, SIG_DFL); if (interp == NULL) { execle(cmd, cmd, NULL, envp); } else { execle(interp, interp, cmd, NULL, envp); } snprintf(buf, sizeof(buf), "Status: 500\r\n\r\n" "500 Server Error: %s%s%s: %s", interp == NULL ? "" : interp, interp == NULL ? "" : " ", cmd, strerror(errno)); send(1, buf, strlen(buf), 0); exit(EXIT_FAILURE); // exec call failed } return pid; } #endif // _WIN32 // This structure helps to create an environment for the spawned CGI program. // Environment is an array of "VARIABLE=VALUE\0" ASCIIZ strings, // last element must be NULL. // However, on Windows there is a requirement that all these VARIABLE=VALUE\0 // strings must reside in a contiguous buffer. The end of the buffer is // marked by two '\0' characters. // We satisfy both worlds: we create an envp array (which is vars), all // entries are actually pointers inside buf. struct cgi_env_block { struct mg_connection *conn; char buf[CGI_ENVIRONMENT_SIZE]; // Environment buffer const char *vars[MAX_CGI_ENVIR_VARS]; // char *envp[] int len; // Space taken int nvars; // Number of variables in envp[] }; // Append VARIABLE=VALUE\0 string to the buffer, and add a respective // pointer into the vars array. static char *addenv(struct cgi_env_block *block, const char *fmt, ...) { int n, space; char *added; va_list ap; // Calculate how much space is left in the buffer space = sizeof(block->buf) - block->len - 2; assert(space >= 0); // Make a pointer to the free space int the buffer added = block->buf + block->len; // Copy VARIABLE=VALUE\0 string into the free space va_start(ap, fmt); n = mg_vsnprintf(added, (size_t) space, fmt, ap); va_end(ap); // Make sure we do not overflow buffer and the envp array if (n > 0 && n + 1 < space && block->nvars < (int) ARRAY_SIZE(block->vars) - 2) { // Append a pointer to the added string into the envp array block->vars[block->nvars++] = added; // Bump up used length counter. Include \0 terminator block->len += n + 1; } return added; } static void addenv2(struct cgi_env_block *blk, const char *name) { const char *s; if ((s = getenv(name)) != NULL) addenv(blk, "%s=%s", name, s); } static void prepare_cgi_environment(struct connection *conn, const char *prog, struct cgi_env_block *blk) { struct mg_connection *ri = &conn->mg_conn; const char *s, *slash; char *p, **opts = conn->server->config_options; int i; blk->len = blk->nvars = 0; blk->conn = ri; if ((s = getenv("SERVER_NAME")) != NULL) { addenv(blk, "SERVER_NAME=%s", s); } else { addenv(blk, "SERVER_NAME=%s", conn->server->local_ip); } addenv(blk, "SERVER_ROOT=%s", opts[DOCUMENT_ROOT]); addenv(blk, "DOCUMENT_ROOT=%s", opts[DOCUMENT_ROOT]); addenv(blk, "SERVER_SOFTWARE=%s/%s", "Mongoose", MONGOOSE_VERSION); // Prepare the environment block addenv(blk, "%s", "GATEWAY_INTERFACE=CGI/1.1"); addenv(blk, "%s", "SERVER_PROTOCOL=HTTP/1.1"); addenv(blk, "%s", "REDIRECT_STATUS=200"); // For PHP // TODO(lsm): fix this for IPv6 case //addenv(blk, "SERVER_PORT=%d", ri->remote_port); addenv(blk, "REQUEST_METHOD=%s", ri->request_method); addenv(blk, "REMOTE_ADDR=%s", ri->remote_ip); addenv(blk, "REMOTE_PORT=%d", ri->remote_port); addenv(blk, "REQUEST_URI=%s%s%s", ri->uri, ri->query_string == NULL ? "" : "?", ri->query_string == NULL ? "" : ri->query_string); // SCRIPT_NAME if (conn->path_info != NULL) { addenv(blk, "SCRIPT_NAME=%.*s", (int) (strlen(ri->uri) - strlen(conn->path_info)), ri->uri); addenv(blk, "PATH_INFO=%s", conn->path_info); } else { s = strrchr(prog, '/'); slash = strrchr(ri->uri, '/'); addenv(blk, "SCRIPT_NAME=%.*s%s", slash == NULL ? 0 : (int) (slash - ri->uri), ri->uri, s == NULL ? prog : s); } addenv(blk, "SCRIPT_FILENAME=%s", prog); addenv(blk, "PATH_TRANSLATED=%s", prog); addenv(blk, "HTTPS=%s", conn->ns_conn->ssl != NULL ? "on" : "off"); if ((s = mg_get_header(ri, "Content-Type")) != NULL) addenv(blk, "CONTENT_TYPE=%s", s); if (ri->query_string != NULL) addenv(blk, "QUERY_STRING=%s", ri->query_string); if ((s = mg_get_header(ri, "Content-Length")) != NULL) addenv(blk, "CONTENT_LENGTH=%s", s); addenv2(blk, "PATH"); addenv2(blk, "TMP"); addenv2(blk, "TEMP"); addenv2(blk, "TMPDIR"); addenv2(blk, "PERLLIB"); addenv2(blk, ENV_EXPORT_TO_CGI); #if defined(_WIN32) addenv2(blk, "COMSPEC"); addenv2(blk, "SYSTEMROOT"); addenv2(blk, "SystemDrive"); addenv2(blk, "ProgramFiles"); addenv2(blk, "ProgramFiles(x86)"); addenv2(blk, "CommonProgramFiles(x86)"); #else addenv2(blk, "LD_LIBRARY_PATH"); #endif // _WIN32 // Add all headers as HTTP_* variables for (i = 0; i < ri->num_headers; i++) { p = addenv(blk, "HTTP_%s=%s", ri->http_headers[i].name, ri->http_headers[i].value); // Convert variable name into uppercase, and change - to _ for (; *p != '=' && *p != '\0'; p++) { if (*p == '-') *p = '_'; *p = (char) toupper(* (unsigned char *) p); } } blk->vars[blk->nvars++] = NULL; blk->buf[blk->len++] = '\0'; assert(blk->nvars < (int) ARRAY_SIZE(blk->vars)); assert(blk->len > 0); assert(blk->len < (int) sizeof(blk->buf)); } static const char cgi_status[] = "HTTP/1.1 200 OK\r\n"; static void open_cgi_endpoint(struct connection *conn, const char *prog) { struct cgi_env_block blk; char dir[MAX_PATH_SIZE]; const char *p; sock_t fds[2]; prepare_cgi_environment(conn, prog, &blk); // CGI must be executed in its own directory. 'dir' must point to the // directory containing executable program, 'p' must point to the // executable program name relative to 'dir'. if ((p = strrchr(prog, '/')) == NULL) { mg_snprintf(dir, sizeof(dir), "%s", "."); } else { mg_snprintf(dir, sizeof(dir), "%.*s", (int) (p - prog), prog); } // Try to create socketpair in a loop until success. ns_socketpair() // can be interrupted by a signal and fail. // TODO(lsm): use sigaction to restart interrupted syscall do { ns_socketpair(fds); } while (fds[0] == INVALID_SOCKET); if (start_process(conn->server->config_options[CGI_INTERPRETER], prog, blk.buf, blk.vars, dir, fds[1]) > 0) { conn->endpoint_type = EP_CGI; conn->endpoint.cgi_conn = ns_add_sock(&conn->server->ns_server, fds[0], conn); conn->endpoint.cgi_conn->flags |= MG_CGI_CONN; ns_send(conn->ns_conn, cgi_status, sizeof(cgi_status) - 1); conn->mg_conn.status_code = 200; conn->ns_conn->flags |= NSF_BUFFER_BUT_DONT_SEND; } else { closesocket(fds[0]); send_http_error(conn, 500, "start_process(%s) failed", prog); } #ifndef _WIN32 closesocket(fds[1]); // On Windows, CGI stdio thread closes that socket #endif } static void on_cgi_data(struct ns_connection *nc) { struct connection *conn = (struct connection *) nc->connection_data; const char *status = "500"; struct mg_connection c; if (!conn) return; // Copy CGI data from CGI socket to the client send buffer ns_send(conn->ns_conn, nc->recv_iobuf.buf, nc->recv_iobuf.len); iobuf_remove(&nc->recv_iobuf, nc->recv_iobuf.len); // If reply has not been parsed yet, parse it if (conn->ns_conn->flags & NSF_BUFFER_BUT_DONT_SEND) { struct iobuf *io = &conn->ns_conn->send_iobuf; int s_len = sizeof(cgi_status) - 1; int len = get_request_len(io->buf + s_len, io->len - s_len); char buf[MAX_REQUEST_SIZE], *s = buf; if (len == 0) return; if (len < 0 || len > (int) sizeof(buf)) { iobuf_remove(io, io->len); send_http_error(conn, 500, "%s", "CGI program sent malformed headers"); } else { memset(&c, 0, sizeof(c)); memcpy(buf, io->buf + s_len, len); buf[len - 1] = '\0'; parse_http_headers(&s, &c); if (mg_get_header(&c, "Location") != NULL) { status = "302"; } else if ((status = (char *) mg_get_header(&c, "Status")) == NULL) { status = "200"; } memcpy(io->buf + 9, status, 3); conn->mg_conn.status_code = atoi(status); } conn->ns_conn->flags &= ~NSF_BUFFER_BUT_DONT_SEND; } } static void forward_post_data(struct connection *conn) { struct iobuf *io = &conn->ns_conn->recv_iobuf; if (conn->endpoint.cgi_conn != NULL) { ns_send(conn->endpoint.cgi_conn, io->buf, io->len); iobuf_remove(io, io->len); } } #endif // !MONGOOSE_NO_CGI static char *mg_strdup(const char *str) { char *copy = (char *) malloc(strlen(str) + 1); if (copy != NULL) { strcpy(copy, str); } return copy; } static int isbyte(int n) { return n >= 0 && n <= 255; } static int parse_net(const char *spec, uint32_t *net, uint32_t *mask) { int n, a, b, c, d, slash = 32, len = 0; if ((sscanf(spec, "%d.%d.%d.%d/%d%n", &a, &b, &c, &d, &slash, &n) == 5 || sscanf(spec, "%d.%d.%d.%d%n", &a, &b, &c, &d, &n) == 4) && isbyte(a) && isbyte(b) && isbyte(c) && isbyte(d) && slash >= 0 && slash < 33) { len = n; *net = ((uint32_t)a << 24) | ((uint32_t)b << 16) | ((uint32_t)c << 8) | d; *mask = slash ? 0xffffffffU << (32 - slash) : 0; } return len; } // Verify given socket address against the ACL. // Return -1 if ACL is malformed, 0 if address is disallowed, 1 if allowed. static int check_acl(const char *acl, uint32_t remote_ip) { int allowed, flag; uint32_t net, mask; struct vec vec; // If any ACL is set, deny by default allowed = acl == NULL ? '+' : '-'; while ((acl = next_option(acl, &vec, NULL)) != NULL) { flag = vec.ptr[0]; if ((flag != '+' && flag != '-') || parse_net(&vec.ptr[1], &net, &mask) == 0) { return -1; } if (net == (remote_ip & mask)) { allowed = flag; } } return allowed == '+'; } static void sockaddr_to_string(char *buf, size_t len, const union socket_address *usa) { buf[0] = '\0'; #if defined(NS_ENABLE_IPV6) inet_ntop(usa->sa.sa_family, usa->sa.sa_family == AF_INET ? (void *) &usa->sin.sin_addr : (void *) &usa->sin6.sin6_addr, buf, len); #elif defined(_WIN32) // Only Windoze Vista (and newer) have inet_ntop() strncpy(buf, inet_ntoa(usa->sin.sin_addr), len); #else inet_ntop(usa->sa.sa_family, (void *) &usa->sin.sin_addr, buf, len); #endif } // Protect against directory disclosure attack by removing '..', // excessive '/' and '\' characters static void remove_double_dots_and_double_slashes(char *s) { char *p = s; while (*s != '\0') { *p++ = *s++; if (s[-1] == '/' || s[-1] == '\\') { // Skip all following slashes, backslashes and double-dots while (s[0] != '\0') { if (s[0] == '/' || s[0] == '\\') { s++; } else if (s[0] == '.' && s[1] == '.') { s += 2; } else { break; } } } } *p = '\0'; } int mg_url_decode(const char *src, int src_len, char *dst, int dst_len, int is_form_url_encoded) { int i, j, a, b; #define HEXTOI(x) (isdigit(x) ? x - '0' : x - 'W') for (i = j = 0; i < src_len && j < dst_len - 1; i++, j++) { if (src[i] == '%' && i < src_len - 2 && isxdigit(* (const unsigned char *) (src + i + 1)) && isxdigit(* (const unsigned char *) (src + i + 2))) { a = tolower(* (const unsigned char *) (src + i + 1)); b = tolower(* (const unsigned char *) (src + i + 2)); dst[j] = (char) ((HEXTOI(a) << 4) | HEXTOI(b)); i += 2; } else if (is_form_url_encoded && src[i] == '+') { dst[j] = ' '; } else { dst[j] = src[i]; } } dst[j] = '\0'; // Null-terminate the destination return i >= src_len ? j : -1; } static int is_valid_http_method(const char *method) { return !strcmp(method, "GET") || !strcmp(method, "POST") || !strcmp(method, "HEAD") || !strcmp(method, "CONNECT") || !strcmp(method, "PUT") || !strcmp(method, "DELETE") || !strcmp(method, "OPTIONS") || !strcmp(method, "PROPFIND") || !strcmp(method, "MKCOL"); } // Parse HTTP request, fill in mg_request structure. // This function modifies the buffer by NUL-terminating // HTTP request components, header names and header values. // Note that len must point to the last \n of HTTP headers. static int parse_http_message(char *buf, int len, struct mg_connection *ri) { int is_request, n; // Reset the connection. Make sure that we don't touch fields that are // set elsewhere: remote_ip, remote_port, server_param ri->request_method = ri->uri = ri->http_version = ri->query_string = NULL; ri->num_headers = ri->status_code = ri->is_websocket = ri->content_len = 0; buf[len - 1] = '\0'; // RFC says that all initial whitespaces should be ingored while (*buf != '\0' && isspace(* (unsigned char *) buf)) { buf++; } ri->request_method = skip(&buf, " "); ri->uri = skip(&buf, " "); ri->http_version = skip(&buf, "\r\n"); // HTTP message could be either HTTP request or HTTP response, e.g. // "GET / HTTP/1.0 ...." or "HTTP/1.0 200 OK ..." is_request = is_valid_http_method(ri->request_method); if ((is_request && memcmp(ri->http_version, "HTTP/", 5) != 0) || (!is_request && memcmp(ri->request_method, "HTTP/", 5) != 0)) { len = -1; } else { if (is_request) { ri->http_version += 5; } parse_http_headers(&buf, ri); if ((ri->query_string = strchr(ri->uri, '?')) != NULL) { *(char *) ri->query_string++ = '\0'; } n = (int) strlen(ri->uri); mg_url_decode(ri->uri, n, (char *) ri->uri, n + 1, 0); remove_double_dots_and_double_slashes((char *) ri->uri); } return len; } static int lowercase(const char *s) { return tolower(* (const unsigned char *) s); } static int mg_strcasecmp(const char *s1, const char *s2) { int diff; do { diff = lowercase(s1++) - lowercase(s2++); } while (diff == 0 && s1[-1] != '\0'); return diff; } static int mg_strncasecmp(const char *s1, const char *s2, size_t len) { int diff = 0; if (len > 0) do { diff = lowercase(s1++) - lowercase(s2++); } while (diff == 0 && s1[-1] != '\0' && --len > 0); return diff; } // Return HTTP header value, or NULL if not found. const char *mg_get_header(const struct mg_connection *ri, const char *s) { int i; for (i = 0; i < ri->num_headers; i++) if (!mg_strcasecmp(s, ri->http_headers[i].name)) return ri->http_headers[i].value; return NULL; } #ifndef MONGOOSE_NO_FILESYSTEM // Perform case-insensitive match of string against pattern static int match_prefix(const char *pattern, int pattern_len, const char *str) { const char *or_str; int len, res, i = 0, j = 0; if ((or_str = (const char *) memchr(pattern, '|', pattern_len)) != NULL) { res = match_prefix(pattern, or_str - pattern, str); return res > 0 ? res : match_prefix(or_str + 1, (pattern + pattern_len) - (or_str + 1), str); } for (; i < pattern_len; i++, j++) { if (pattern[i] == '?' && str[j] != '\0') { continue; } else if (pattern[i] == '$') { return str[j] == '\0' ? j : -1; } else if (pattern[i] == '*') { i++; if (pattern[i] == '*') { i++; len = (int) strlen(str + j); } else { len = (int) strcspn(str + j, "/"); } if (i == pattern_len) { return j + len; } do { res = match_prefix(pattern + i, pattern_len - i, str + j + len); } while (res == -1 && len-- > 0); return res == -1 ? -1 : j + res + len; } else if (lowercase(&pattern[i]) != lowercase(&str[j])) { return -1; } } return j; } static int must_hide_file(struct connection *conn, const char *path) { const char *pw_pattern = "**" PASSWORDS_FILE_NAME "$"; const char *pattern = conn->server->config_options[HIDE_FILES_PATTERN]; return match_prefix(pw_pattern, strlen(pw_pattern), path) > 0 || (pattern != NULL && match_prefix(pattern, strlen(pattern), path) > 0); } // Return 1 if real file has been found, 0 otherwise static int convert_uri_to_file_name(struct connection *conn, char *buf, size_t buf_len, file_stat_t *st) { struct vec a, b; const char *rewrites = conn->server->config_options[URL_REWRITES]; const char *root = conn->server->config_options[DOCUMENT_ROOT]; #ifndef MONGOOSE_NO_CGI const char *cgi_pat = conn->server->config_options[CGI_PATTERN]; char *p; #endif const char *uri = conn->mg_conn.uri; const char *domain = mg_get_header(&conn->mg_conn, "Host"); int match_len, root_len = root == NULL ? 0 : strlen(root); // Perform virtual hosting rewrites if (rewrites != NULL && domain != NULL) { const char *colon = strchr(domain, ':'); int domain_len = colon == NULL ? (int) strlen(domain) : colon - domain; while ((rewrites = next_option(rewrites, &a, &b)) != NULL) { if (a.len > 1 && a.ptr[0] == '@' && a.len == domain_len + 1 && mg_strncasecmp(a.ptr + 1, domain, domain_len) == 0) { root = b.ptr; root_len = b.len; break; } } } // No filesystem access if (root == NULL || root_len == 0) return 0; // Handle URL rewrites mg_snprintf(buf, buf_len, "%.*s%s", root_len, root, uri); rewrites = conn->server->config_options[URL_REWRITES]; // Re-initialize! while ((rewrites = next_option(rewrites, &a, &b)) != NULL) { if ((match_len = match_prefix(a.ptr, a.len, uri)) > 0) { mg_snprintf(buf, buf_len, "%.*s%s", (int) b.len, b.ptr, uri + match_len); break; } } if (stat(buf, st) == 0) return 1; #ifndef MONGOOSE_NO_CGI // Support PATH_INFO for CGI scripts. for (p = buf + strlen(root) + 2; *p != '\0'; p++) { if (*p == '/') { *p = '\0'; if (match_prefix(cgi_pat, strlen(cgi_pat), buf) > 0 && !stat(buf, st)) { DBG(("!!!! [%s]", buf)); *p = '/'; conn->path_info = mg_strdup(p); *p = '\0'; return 1; } *p = '/'; } } #endif return 0; } #endif // MONGOOSE_NO_FILESYSTEM static int should_keep_alive(const struct mg_connection *conn) { struct connection *c = MG_CONN_2_CONN(conn); const char *method = conn->request_method; const char *http_version = conn->http_version; const char *header = mg_get_header(conn, "Connection"); return method != NULL && (!strcmp(method, "GET") || c->endpoint_type == EP_USER) && ((header != NULL && !mg_strcasecmp(header, "keep-alive")) || (header == NULL && http_version && !strcmp(http_version, "1.1"))); } int mg_write(struct mg_connection *c, const void *buf, int len) { struct connection *conn = MG_CONN_2_CONN(c); return ns_send(conn->ns_conn, buf, len); } void mg_send_status(struct mg_connection *c, int status) { if (c->status_code == 0) { c->status_code = status; mg_printf(c, "HTTP/1.1 %d %s\r\n", status, status_code_to_str(status)); } } void mg_send_header(struct mg_connection *c, const char *name, const char *v) { if (c->status_code == 0) { c->status_code = 200; mg_printf(c, "HTTP/1.1 %d %s\r\n", 200, status_code_to_str(200)); } mg_printf(c, "%s: %s\r\n", name, v); } static void terminate_headers(struct mg_connection *c) { struct connection *conn = MG_CONN_2_CONN(c); if (!(conn->ns_conn->flags & MG_HEADERS_SENT)) { mg_send_header(c, "Transfer-Encoding", "chunked"); mg_write(c, "\r\n", 2); conn->ns_conn->flags |= MG_HEADERS_SENT; } } void mg_send_data(struct mg_connection *c, const void *data, int data_len) { terminate_headers(c); write_chunk(MG_CONN_2_CONN(c), (const char *) data, data_len); } void mg_printf_data(struct mg_connection *c, const char *fmt, ...) { struct connection *conn = MG_CONN_2_CONN(c); va_list ap; int len; char mem[IOBUF_SIZE], *buf = mem; terminate_headers(c); va_start(ap, fmt); len = ns_avprintf(&buf, sizeof(mem), fmt, ap); va_end(ap); if (len > 0) { write_chunk((struct connection *) conn, buf, len); } if (buf != mem && buf != NULL) { free(buf); } } #if !defined(MONGOOSE_NO_WEBSOCKET) || !defined(MONGOOSE_NO_AUTH) static int is_big_endian(void) { static const int n = 1; return ((char *) &n)[0] == 0; } #endif #ifndef MONGOOSE_NO_WEBSOCKET // START OF SHA-1 code // Copyright(c) By Steve Reid #define SHA1HANDSOFF #if defined(__sun) #include "solarisfixes.h" #endif union char64long16 { unsigned char c[64]; uint32_t l[16]; }; #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) static uint32_t blk0(union char64long16 *block, int i) { // Forrest: SHA expect BIG_ENDIAN, swap if LITTLE_ENDIAN if (!is_big_endian()) { block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | (rol(block->l[i], 8) & 0x00FF00FF); } return block->l[i]; } #define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ ^block->l[(i+2)&15]^block->l[i&15],1)) #define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(block, i)+0x5A827999+rol(v,5);w=rol(w,30); #define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); #define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); #define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); #define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); typedef struct { uint32_t state[5]; uint32_t count[2]; unsigned char buffer[64]; } SHA1_CTX; static void SHA1Transform(uint32_t state[5], const unsigned char buffer[64]) { uint32_t a, b, c, d, e; union char64long16 block[1]; memcpy(block, buffer, 64); a = state[0]; b = state[1]; c = state[2]; d = state[3]; e = state[4]; R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); state[0] += a; state[1] += b; state[2] += c; state[3] += d; state[4] += e; // Erase working structures. The order of operations is important, // used to ensure that compiler doesn't optimize those out. memset(block, 0, sizeof(block)); a = b = c = d = e = 0; (void) a; (void) b; (void) c; (void) d; (void) e; } static void SHA1Init(SHA1_CTX* context) { context->state[0] = 0x67452301; context->state[1] = 0xEFCDAB89; context->state[2] = 0x98BADCFE; context->state[3] = 0x10325476; context->state[4] = 0xC3D2E1F0; context->count[0] = context->count[1] = 0; } static void SHA1Update(SHA1_CTX* context, const unsigned char* data, uint32_t len) { uint32_t i, j; j = context->count[0]; if ((context->count[0] += len << 3) < j) context->count[1]++; context->count[1] += (len>>29); j = (j >> 3) & 63; if ((j + len) > 63) { memcpy(&context->buffer[j], data, (i = 64-j)); SHA1Transform(context->state, context->buffer); for ( ; i + 63 < len; i += 64) { SHA1Transform(context->state, &data[i]); } j = 0; } else i = 0; memcpy(&context->buffer[j], &data[i], len - i); } static void SHA1Final(unsigned char digest[20], SHA1_CTX* context) { unsigned i; unsigned char finalcount[8], c; for (i = 0; i < 8; i++) { finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)] >> ((3-(i & 3)) * 8) ) & 255); } c = 0200; SHA1Update(context, &c, 1); while ((context->count[0] & 504) != 448) { c = 0000; SHA1Update(context, &c, 1); } SHA1Update(context, finalcount, 8); for (i = 0; i < 20; i++) { digest[i] = (unsigned char) ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255); } memset(context, '\0', sizeof(*context)); memset(&finalcount, '\0', sizeof(finalcount)); } // END OF SHA1 CODE static void base64_encode(const unsigned char *src, int src_len, char *dst) { static const char *b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; int i, j, a, b, c; for (i = j = 0; i < src_len; i += 3) { a = src[i]; b = i + 1 >= src_len ? 0 : src[i + 1]; c = i + 2 >= src_len ? 0 : src[i + 2]; dst[j++] = b64[a >> 2]; dst[j++] = b64[((a & 3) << 4) | (b >> 4)]; if (i + 1 < src_len) { dst[j++] = b64[(b & 15) << 2 | (c >> 6)]; } if (i + 2 < src_len) { dst[j++] = b64[c & 63]; } } while (j % 4 != 0) { dst[j++] = '='; } dst[j++] = '\0'; } static void send_websocket_handshake(struct mg_connection *conn, const char *key) { static const char *magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; char buf[500], sha[20], b64_sha[sizeof(sha) * 2]; SHA1_CTX sha_ctx; mg_snprintf(buf, sizeof(buf), "%s%s", key, magic); SHA1Init(&sha_ctx); SHA1Update(&sha_ctx, (unsigned char *) buf, strlen(buf)); SHA1Final((unsigned char *) sha, &sha_ctx); base64_encode((unsigned char *) sha, sizeof(sha), b64_sha); mg_snprintf(buf, sizeof(buf), "%s%s%s", "HTTP/1.1 101 Switching Protocols\r\n" "Upgrade: websocket\r\n" "Connection: Upgrade\r\n" "Sec-WebSocket-Accept: ", b64_sha, "\r\n\r\n"); mg_write(conn, buf, strlen(buf)); } static int deliver_websocket_frame(struct connection *conn) { // Having buf unsigned char * is important, as it is used below in arithmetic unsigned char *buf = (unsigned char *) conn->ns_conn->recv_iobuf.buf; int i, len, buf_len = conn->ns_conn->recv_iobuf.len, frame_len = 0, mask_len = 0, header_len = 0, data_len = 0, buffered = 0; if (buf_len >= 2) { len = buf[1] & 127; mask_len = buf[1] & 128 ? 4 : 0; if (len < 126 && buf_len >= mask_len) { data_len = len; header_len = 2 + mask_len; } else if (len == 126 && buf_len >= 4 + mask_len) { header_len = 4 + mask_len; data_len = ((((int) buf[2]) << 8) + buf[3]); } else if (buf_len >= 10 + mask_len) { header_len = 10 + mask_len; data_len = (int) (((uint64_t) htonl(* (uint32_t *) &buf[2])) << 32) + htonl(* (uint32_t *) &buf[6]); } } frame_len = header_len + data_len; buffered = frame_len > 0 && frame_len <= buf_len; if (buffered) { conn->mg_conn.content_len = data_len; conn->mg_conn.content = (char *) buf + header_len; conn->mg_conn.wsbits = buf[0]; // Apply mask if necessary if (mask_len > 0) { for (i = 0; i < data_len; i++) { buf[i + header_len] ^= (buf + header_len - mask_len)[i % 4]; } } // Call the handler and remove frame from the iobuf if (call_user(conn, MG_REQUEST) == MG_FALSE) { conn->ns_conn->flags |= NSF_FINISHED_SENDING_DATA; } iobuf_remove(&conn->ns_conn->recv_iobuf, frame_len); } return buffered; } int mg_websocket_write(struct mg_connection* conn, int opcode, const char *data, size_t data_len) { unsigned char *copy; size_t copy_len = 0; int retval = -1; if ((copy = (unsigned char *) malloc(data_len + 10)) == NULL) { return -1; } copy[0] = 0x80 + (opcode & 0x0f); // Frame format: http://tools.ietf.org/html/rfc6455#section-5.2 if (data_len < 126) { // Inline 7-bit length field copy[1] = data_len; memcpy(copy + 2, data, data_len); copy_len = 2 + data_len; } else if (data_len <= 0xFFFF) { // 16-bit length field copy[1] = 126; * (uint16_t *) (copy + 2) = (uint16_t) htons((uint16_t) data_len); memcpy(copy + 4, data, data_len); copy_len = 4 + data_len; } else { // 64-bit length field copy[1] = 127; * (uint32_t *) (copy + 2) = (uint32_t) htonl((uint32_t) ((uint64_t) data_len >> 32)); * (uint32_t *) (copy + 6) = (uint32_t) htonl(data_len & 0xffffffff); memcpy(copy + 10, data, data_len); copy_len = 10 + data_len; } if (copy_len > 0) { retval = mg_write(conn, copy, copy_len); } free(copy); return retval; } static void send_websocket_handshake_if_requested(struct mg_connection *conn) { const char *ver = mg_get_header(conn, "Sec-WebSocket-Version"), *key = mg_get_header(conn, "Sec-WebSocket-Key"); if (ver != NULL && key != NULL) { conn->is_websocket = 1; send_websocket_handshake(conn, key); } } static void ping_idle_websocket_connection(struct connection *conn, time_t t) { if (t - conn->ns_conn->last_io_time > MONGOOSE_USE_WEBSOCKET_PING_INTERVAL) { mg_websocket_write(&conn->mg_conn, 0x9, "", 0); } } #else #define ping_idle_websocket_connection(conn, t) #endif // !MONGOOSE_NO_WEBSOCKET static void write_terminating_chunk(struct connection *conn) { mg_write(&conn->mg_conn, "0\r\n\r\n", 5); } static int call_request_handler(struct connection *conn) { int result; conn->mg_conn.content = conn->ns_conn->recv_iobuf.buf; if ((result = call_user(conn, MG_REQUEST)) == MG_TRUE) { if (conn->ns_conn->flags & MG_HEADERS_SENT) { write_terminating_chunk(conn); } close_local_endpoint(conn); } return result; } const char *mg_get_mime_type(const char *path, const char *default_mime_type) { const char *ext; size_t i, path_len; path_len = strlen(path); for (i = 0; static_builtin_mime_types[i].extension != NULL; i++) { ext = path + (path_len - static_builtin_mime_types[i].ext_len); if (path_len > static_builtin_mime_types[i].ext_len && mg_strcasecmp(ext, static_builtin_mime_types[i].extension) == 0) { return static_builtin_mime_types[i].mime_type; } } return default_mime_type; } #ifndef MONGOOSE_NO_FILESYSTEM // Convert month to the month number. Return -1 on error, or month number static int get_month_index(const char *s) { static const char *month_names[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; int i; for (i = 0; i < (int) ARRAY_SIZE(month_names); i++) if (!strcmp(s, month_names[i])) return i; return -1; } static int num_leap_years(int year) { return year / 4 - year / 100 + year / 400; } // Parse UTC date-time string, and return the corresponding time_t value. static time_t parse_date_string(const char *datetime) { static const unsigned short days_before_month[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; char month_str[32]; int second, minute, hour, day, month, year, leap_days, days; time_t result = (time_t) 0; if (((sscanf(datetime, "%d/%3s/%d %d:%d:%d", &day, month_str, &year, &hour, &minute, &second) == 6) || (sscanf(datetime, "%d %3s %d %d:%d:%d", &day, month_str, &year, &hour, &minute, &second) == 6) || (sscanf(datetime, "%*3s, %d %3s %d %d:%d:%d", &day, month_str, &year, &hour, &minute, &second) == 6) || (sscanf(datetime, "%d-%3s-%d %d:%d:%d", &day, month_str, &year, &hour, &minute, &second) == 6)) && year > 1970 && (month = get_month_index(month_str)) != -1) { leap_days = num_leap_years(year) - num_leap_years(1970); year -= 1970; days = year * 365 + days_before_month[month] + (day - 1) + leap_days; result = days * 24 * 3600 + hour * 3600 + minute * 60 + second; } return result; } // Look at the "path" extension and figure what mime type it has. // Store mime type in the vector. static void get_mime_type(const struct mg_server *server, const char *path, struct vec *vec) { struct vec ext_vec, mime_vec; const char *list, *ext; size_t path_len; path_len = strlen(path); // Scan user-defined mime types first, in case user wants to // override default mime types. list = server->config_options[EXTRA_MIME_TYPES]; while ((list = next_option(list, &ext_vec, &mime_vec)) != NULL) { // ext now points to the path suffix ext = path + path_len - ext_vec.len; if (mg_strncasecmp(ext, ext_vec.ptr, ext_vec.len) == 0) { *vec = mime_vec; return; } } vec->ptr = mg_get_mime_type(path, "text/plain"); vec->len = strlen(vec->ptr); } static const char *suggest_connection_header(const struct mg_connection *conn) { return should_keep_alive(conn) ? "keep-alive" : "close"; } static void construct_etag(char *buf, size_t buf_len, const file_stat_t *st) { mg_snprintf(buf, buf_len, "\"%lx.%" INT64_FMT "\"", (unsigned long) st->st_mtime, (int64_t) st->st_size); } // Return True if we should reply 304 Not Modified. static int is_not_modified(const struct connection *conn, const file_stat_t *stp) { char etag[64]; const char *ims = mg_get_header(&conn->mg_conn, "If-Modified-Since"); const char *inm = mg_get_header(&conn->mg_conn, "If-None-Match"); construct_etag(etag, sizeof(etag), stp); return (inm != NULL && !mg_strcasecmp(etag, inm)) || (ims != NULL && stp->st_mtime <= parse_date_string(ims)); } // For given directory path, substitute it to valid index file. // Return 0 if index file has been found, -1 if not found. // If the file is found, it's stats is returned in stp. static int find_index_file(struct connection *conn, char *path, size_t path_len, file_stat_t *stp) { const char *list = conn->server->config_options[INDEX_FILES]; file_stat_t st; struct vec filename_vec; size_t n = strlen(path), found = 0; // The 'path' given to us points to the directory. Remove all trailing // directory separator characters from the end of the path, and // then append single directory separator character. while (n > 0 && path[n - 1] == '/') { n--; } path[n] = '/'; // Traverse index files list. For each entry, append it to the given // path and see if the file exists. If it exists, break the loop while ((list = next_option(list, &filename_vec, NULL)) != NULL) { // Ignore too long entries that may overflow path buffer if (filename_vec.len > (int) (path_len - (n + 2))) continue; // Prepare full path to the index file strncpy(path + n + 1, filename_vec.ptr, filename_vec.len); path[n + 1 + filename_vec.len] = '\0'; //DBG(("[%s]", path)); // Does it exist? if (!stat(path, &st)) { // Yes it does, break the loop *stp = st; found = 1; break; } } // If no index file exists, restore directory path if (!found) { path[n] = '\0'; } return found; } static int parse_range_header(const char *header, int64_t *a, int64_t *b) { return sscanf(header, "bytes=%" INT64_FMT "-%" INT64_FMT, a, b); } static void gmt_time_string(char *buf, size_t buf_len, time_t *t) { strftime(buf, buf_len, "%a, %d %b %Y %H:%M:%S GMT", gmtime(t)); } static void open_file_endpoint(struct connection *conn, const char *path, file_stat_t *st) { char date[64], lm[64], etag[64], range[64], headers[500]; const char *msg = "OK", *hdr; time_t curtime = time(NULL); int64_t r1, r2; struct vec mime_vec; int n; conn->endpoint_type = EP_FILE; ns_set_close_on_exec(conn->endpoint.fd); conn->mg_conn.status_code = 200; get_mime_type(conn->server, path, &mime_vec); conn->cl = st->st_size; range[0] = '\0'; // If Range: header specified, act accordingly r1 = r2 = 0; hdr = mg_get_header(&conn->mg_conn, "Range"); if (hdr != NULL && (n = parse_range_header(hdr, &r1, &r2)) > 0 && r1 >= 0 && r2 >= 0) { conn->mg_conn.status_code = 206; conn->cl = n == 2 ? (r2 > conn->cl ? conn->cl : r2) - r1 + 1: conn->cl - r1; mg_snprintf(range, sizeof(range), "Content-Range: bytes " "%" INT64_FMT "-%" INT64_FMT "/%" INT64_FMT "\r\n", r1, r1 + conn->cl - 1, (int64_t) st->st_size); msg = "Partial Content"; lseek(conn->endpoint.fd, r1, SEEK_SET); } // Prepare Etag, Date, Last-Modified headers. Must be in UTC, according to // http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3 gmt_time_string(date, sizeof(date), &curtime); gmt_time_string(lm, sizeof(lm), &st->st_mtime); construct_etag(etag, sizeof(etag), st); n = mg_snprintf(headers, sizeof(headers), "HTTP/1.1 %d %s\r\n" "Date: %s\r\n" "Last-Modified: %s\r\n" "Etag: %s\r\n" "Content-Type: %.*s\r\n" "Content-Length: %" INT64_FMT "\r\n" "Connection: %s\r\n" "Accept-Ranges: bytes\r\n" "%s%s\r\n", conn->mg_conn.status_code, msg, date, lm, etag, (int) mime_vec.len, mime_vec.ptr, conn->cl, suggest_connection_header(&conn->mg_conn), range, MONGOOSE_USE_EXTRA_HTTP_HEADERS); ns_send(conn->ns_conn, headers, n); if (!strcmp(conn->mg_conn.request_method, "HEAD")) { conn->ns_conn->flags |= NSF_FINISHED_SENDING_DATA; close(conn->endpoint.fd); conn->endpoint_type = EP_NONE; } } #endif // MONGOOSE_NO_FILESYSTEM static void call_request_handler_if_data_is_buffered(struct connection *conn) { struct iobuf *loc = &conn->ns_conn->recv_iobuf; struct mg_connection *c = &conn->mg_conn; #ifndef MONGOOSE_NO_WEBSOCKET if (conn->mg_conn.is_websocket) { do { } while (deliver_websocket_frame(conn)); } else #endif if ((size_t) loc->len >= c->content_len && call_request_handler(conn) == MG_FALSE) { open_local_endpoint(conn, 1); } } #if !defined(MONGOOSE_NO_DIRECTORY_LISTING) || !defined(MONGOOSE_NO_DAV) #ifdef _WIN32 struct dirent { char d_name[MAX_PATH_SIZE]; }; typedef struct DIR { HANDLE handle; WIN32_FIND_DATAW info; struct dirent result; } DIR; // Implementation of POSIX opendir/closedir/readdir for Windows. static DIR *opendir(const char *name) { DIR *dir = NULL; wchar_t wpath[MAX_PATH_SIZE]; DWORD attrs; if (name == NULL) { SetLastError(ERROR_BAD_ARGUMENTS); } else if ((dir = (DIR *) malloc(sizeof(*dir))) == NULL) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); } else { to_wchar(name, wpath, ARRAY_SIZE(wpath)); attrs = GetFileAttributesW(wpath); if (attrs != 0xFFFFFFFF && ((attrs & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)) { (void) wcscat(wpath, L"\\*"); dir->handle = FindFirstFileW(wpath, &dir->info); dir->result.d_name[0] = '\0'; } else { free(dir); dir = NULL; } } return dir; } static int closedir(DIR *dir) { int result = 0; if (dir != NULL) { if (dir->handle != INVALID_HANDLE_VALUE) result = FindClose(dir->handle) ? 0 : -1; free(dir); } else { result = -1; SetLastError(ERROR_BAD_ARGUMENTS); } return result; } static struct dirent *readdir(DIR *dir) { struct dirent *result = 0; if (dir) { if (dir->handle != INVALID_HANDLE_VALUE) { result = &dir->result; (void) WideCharToMultiByte(CP_UTF8, 0, dir->info.cFileName, -1, result->d_name, sizeof(result->d_name), NULL, NULL); if (!FindNextFileW(dir->handle, &dir->info)) { (void) FindClose(dir->handle); dir->handle = INVALID_HANDLE_VALUE; } } else { SetLastError(ERROR_FILE_NOT_FOUND); } } else { SetLastError(ERROR_BAD_ARGUMENTS); } return result; } #endif // _WIN32 POSIX opendir/closedir/readdir implementation static int scan_directory(struct connection *conn, const char *dir, struct dir_entry **arr) { char path[MAX_PATH_SIZE]; struct dir_entry *p; struct dirent *dp; int arr_size = 0, arr_ind = 0, inc = 100; DIR *dirp; *arr = NULL; if ((dirp = (opendir(dir))) == NULL) return 0; while ((dp = readdir(dirp)) != NULL) { // Do not show current dir and hidden files if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..") || must_hide_file(conn, dp->d_name)) { continue; } mg_snprintf(path, sizeof(path), "%s%c%s", dir, '/', dp->d_name); // Resize the array if nesessary if (arr_ind >= arr_size) { if ((p = (struct dir_entry *) realloc(*arr, (inc + arr_size) * sizeof(**arr))) != NULL) { // Memset new chunk to zero, otherwize st_mtime will have garbage which // can make strftime() segfault, see // http://code.google.com/p/mongoose/issues/detail?id=79 memset(p + arr_size, 0, sizeof(**arr) * inc); *arr = p; arr_size += inc; } } if (arr_ind < arr_size) { (*arr)[arr_ind].conn = conn; (*arr)[arr_ind].file_name = strdup(dp->d_name); stat(path, &(*arr)[arr_ind].st); arr_ind++; } } closedir(dirp); return arr_ind; } static void mg_url_encode(const char *src, char *dst, size_t dst_len) { static const char *dont_escape = "._-$,;~()"; static const char *hex = "0123456789abcdef"; const char *end = dst + dst_len - 1; for (; *src != '\0' && dst < end; src++, dst++) { if (isalnum(*(const unsigned char *) src) || strchr(dont_escape, * (const unsigned char *) src) != NULL) { *dst = *src; } else if (dst + 2 < end) { dst[0] = '%'; dst[1] = hex[(* (const unsigned char *) src) >> 4]; dst[2] = hex[(* (const unsigned char *) src) & 0xf]; dst += 2; } } *dst = '\0'; } #endif // !NO_DIRECTORY_LISTING || !MONGOOSE_NO_DAV #ifndef MONGOOSE_NO_DIRECTORY_LISTING static void print_dir_entry(const struct dir_entry *de) { char size[64], mod[64], href[MAX_PATH_SIZE * 3]; int64_t fsize = de->st.st_size; int is_dir = S_ISDIR(de->st.st_mode); const char *slash = is_dir ? "/" : ""; if (is_dir) { mg_snprintf(size, sizeof(size), "%s", "[DIRECTORY]"); } else { // We use (signed) cast below because MSVC 6 compiler cannot // convert unsigned __int64 to double. if (fsize < 1024) { mg_snprintf(size, sizeof(size), "%d", (int) fsize); } else if (fsize < 0x100000) { mg_snprintf(size, sizeof(size), "%.1fk", (double) fsize / 1024.0); } else if (fsize < 0x40000000) { mg_snprintf(size, sizeof(size), "%.1fM", (double) fsize / 1048576); } else { mg_snprintf(size, sizeof(size), "%.1fG", (double) fsize / 1073741824); } } strftime(mod, sizeof(mod), "%d-%b-%Y %H:%M", localtime(&de->st.st_mtime)); mg_url_encode(de->file_name, href, sizeof(href)); mg_printf_data(&de->conn->mg_conn, "%s%s" " %s  %s\n", de->conn->mg_conn.uri, href, slash, de->file_name, slash, mod, size); } // Sort directory entries by size, or name, or modification time. // On windows, __cdecl specification is needed in case if project is built // with __stdcall convention. qsort always requires __cdels callback. static int __cdecl compare_dir_entries(const void *p1, const void *p2) { const struct dir_entry *a = (const struct dir_entry *) p1, *b = (const struct dir_entry *) p2; const char *qs = a->conn->mg_conn.query_string ? a->conn->mg_conn.query_string : "na"; int cmp_result = 0; if (S_ISDIR(a->st.st_mode) && !S_ISDIR(b->st.st_mode)) { return -1; // Always put directories on top } else if (!S_ISDIR(a->st.st_mode) && S_ISDIR(b->st.st_mode)) { return 1; // Always put directories on top } else if (*qs == 'n') { cmp_result = strcmp(a->file_name, b->file_name); } else if (*qs == 's') { cmp_result = a->st.st_size == b->st.st_size ? 0 : a->st.st_size > b->st.st_size ? 1 : -1; } else if (*qs == 'd') { cmp_result = a->st.st_mtime == b->st.st_mtime ? 0 : a->st.st_mtime > b->st.st_mtime ? 1 : -1; } return qs[1] == 'd' ? -cmp_result : cmp_result; } static void send_directory_listing(struct connection *conn, const char *dir) { struct dir_entry *arr = NULL; int i, num_entries, sort_direction = conn->mg_conn.query_string != NULL && conn->mg_conn.query_string[1] == 'd' ? 'a' : 'd'; mg_send_header(&conn->mg_conn, "Transfer-Encoding", "chunked"); mg_send_header(&conn->mg_conn, "Content-Type", "text/html; charset=utf-8"); mg_printf_data(&conn->mg_conn, "Index of %s" "" "

Index of %s

"
              ""
              ""
              ""
              "",
              conn->mg_conn.uri, conn->mg_conn.uri,
              sort_direction, sort_direction, sort_direction);

  num_entries = scan_directory(conn, dir, &arr);
  qsort(arr, num_entries, sizeof(arr[0]), compare_dir_entries);
  for (i = 0; i < num_entries; i++) {
    print_dir_entry(&arr[i]);
    free(arr[i].file_name);
  }
  free(arr);

  write_terminating_chunk(conn);
  close_local_endpoint(conn);
}
#endif  // MONGOOSE_NO_DIRECTORY_LISTING

#ifndef MONGOOSE_NO_DAV
static void print_props(struct connection *conn, const char *uri,
                        file_stat_t *stp) {
  char mtime[64];

  gmt_time_string(mtime, sizeof(mtime), &stp->st_mtime);
  mg_printf(&conn->mg_conn,
      ""
       "%s"
       ""
        ""
         "%s"
         "%" INT64_FMT ""
         "%s"
        ""
        "HTTP/1.1 200 OK"
       ""
      "\n",
      uri, S_ISDIR(stp->st_mode) ? "" : "",
      (int64_t) stp->st_size, mtime);
}

static void handle_propfind(struct connection *conn, const char *path,
                            file_stat_t *stp) {
  static const char header[] = "HTTP/1.1 207 Multi-Status\r\n"
    "Connection: close\r\n"
    "Content-Type: text/xml; charset=utf-8\r\n\r\n"
    ""
    "\n";
  static const char footer[] = "";
  const char *depth = mg_get_header(&conn->mg_conn, "Depth"),
        *list_dir = conn->server->config_options[ENABLE_DIRECTORY_LISTING];

  conn->mg_conn.status_code = 207;
  ns_send(conn->ns_conn, header, sizeof(header) - 1);

  // Print properties for the requested resource itself
  print_props(conn, conn->mg_conn.uri, stp);

  // If it is a directory, print directory entries too if Depth is not 0
  if (S_ISDIR(stp->st_mode) && !mg_strcasecmp(list_dir, "yes") &&
      (depth == NULL || strcmp(depth, "0") != 0)) {
    struct dir_entry *arr = NULL;
    int i, num_entries = scan_directory(conn, path, &arr);

    for (i = 0; i < num_entries; i++) {
      char buf[MAX_PATH_SIZE], buf2[sizeof(buf) * 3];
      struct dir_entry *de = &arr[i];

      mg_snprintf(buf, sizeof(buf), "%s%s", de->conn->mg_conn.uri,
                  de->file_name);
      mg_url_encode(buf, buf2, sizeof(buf2) - 1);
      print_props(conn, buf, &de->st);
    }
  }

  ns_send(conn->ns_conn, footer, sizeof(footer) - 1);
  close_local_endpoint(conn);
}

static void handle_mkcol(struct connection *conn, const char *path) {
  int status_code = 500;

  if (conn->mg_conn.content_len > 0) {
    status_code = 415;
  } else if (!mkdir(path, 0755)) {
    status_code = 201;
  } else if (errno == EEXIST) {
    status_code = 405;
  } else if (errno == EACCES) {
    status_code = 403;
  } else if (errno == ENOENT) {
    status_code = 409;
  }
  send_http_error(conn, status_code, NULL);
}

static int remove_directory(const char *dir) {
  char path[MAX_PATH_SIZE];
  struct dirent *dp;
  file_stat_t st;
  DIR *dirp;

  if ((dirp = opendir(dir)) == NULL) return 0;

  while ((dp = readdir(dirp)) != NULL) {
    if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) continue;
    mg_snprintf(path, sizeof(path), "%s%c%s", dir, '/', dp->d_name);
    stat(path, &st);
    if (S_ISDIR(st.st_mode)) {
      remove_directory(path);
    } else {
      remove(path);
    }
  }
  closedir(dirp);
  rmdir(dir);

  return 1;
}

static void handle_delete(struct connection *conn, const char *path) {
  file_stat_t st;

  if (stat(path, &st) != 0) {
    send_http_error(conn, 404, NULL);
  } else if (S_ISDIR(st.st_mode)) {
    remove_directory(path);
    send_http_error(conn, 204, NULL);
  } else if (!remove(path) == 0) {
    send_http_error(conn, 204, NULL);
  } else {
    send_http_error(conn, 423, NULL);
  }
}

// For a given PUT path, create all intermediate subdirectories
// for given path. Return 0 if the path itself is a directory,
// or -1 on error, 1 if OK.
static int put_dir(const char *path) {
  char buf[MAX_PATH_SIZE];
  const char *s, *p;
  file_stat_t st;

  // Create intermediate directories if they do not exist
  for (s = p = path + 1; (p = strchr(s, '/')) != NULL; s = ++p) {
    if (p - path >= (int) sizeof(buf)) return -1; // Buffer overflow
    memcpy(buf, path, p - path);
    buf[p - path] = '\0';
    if (stat(buf, &st) != 0 && mkdir(buf, 0755) != 0) return -1;
    if (p[1] == '\0') return 0;  // Path is a directory itself
  }

  return 1;
}

static void handle_put(struct connection *conn, const char *path) {
  file_stat_t st;
  const char *range, *cl_hdr = mg_get_header(&conn->mg_conn, "Content-Length");
  int64_t r1, r2;
  int rc;

  conn->mg_conn.status_code = !stat(path, &st) ? 200 : 201;
  if ((rc = put_dir(path)) == 0) {
    mg_printf(&conn->mg_conn, "HTTP/1.1 %d OK\r\n\r\n",
              conn->mg_conn.status_code);
    close_local_endpoint(conn);
  } else if (rc == -1) {
    send_http_error(conn, 500, "put_dir: %s", strerror(errno));
  } else if (cl_hdr == NULL) {
    send_http_error(conn, 411, NULL);
#ifdef _WIN32
    //On Windows, open() is a macro with 2 params
  } else if ((conn->endpoint.fd =
              open(path, O_RDWR | O_CREAT | O_TRUNC)) < 0) {
#else
  } else if ((conn->endpoint.fd =
              open(path, O_RDWR | O_CREAT | O_TRUNC, 0644)) < 0) {
#endif
    send_http_error(conn, 500, "open(%s): %s", path, strerror(errno));
  } else {
    DBG(("PUT [%s] %d", path, conn->ns_conn->recv_iobuf.len));
    conn->endpoint_type = EP_PUT;
    ns_set_close_on_exec(conn->endpoint.fd);
    range = mg_get_header(&conn->mg_conn, "Content-Range");
    conn->cl = to64(cl_hdr);
    r1 = r2 = 0;
    if (range != NULL && parse_range_header(range, &r1, &r2) > 0) {
      conn->mg_conn.status_code = 206;
      lseek(conn->endpoint.fd, r1, SEEK_SET);
      conn->cl = r2 > r1 ? r2 - r1 + 1: conn->cl - r1;
    }
    mg_printf(&conn->mg_conn, "HTTP/1.1 %d OK\r\nContent-Length: 0\r\n\r\n",
              conn->mg_conn.status_code);
  }
}

static void forward_put_data(struct connection *conn) {
  struct iobuf *io = &conn->ns_conn->recv_iobuf;
  int n = write(conn->endpoint.fd, io->buf, io->len);
  if (n > 0) {
    iobuf_remove(io, n);
    conn->cl -= n;
    if (conn->cl <= 0) {
      close_local_endpoint(conn);
    }
  }
}
#endif //  MONGOOSE_NO_DAV

static void send_options(struct connection *conn) {
  static const char reply[] = "HTTP/1.1 200 OK\r\nAllow: GET, POST, HEAD, "
    "CONNECT, PUT, DELETE, OPTIONS, PROPFIND, MKCOL\r\nDAV: 1\r\n\r\n";
  ns_send(conn->ns_conn, reply, sizeof(reply) - 1);
  conn->ns_conn->flags |= NSF_FINISHED_SENDING_DATA;
}

#ifndef MONGOOSE_NO_AUTH
void mg_send_digest_auth_request(struct mg_connection *c) {
  struct connection *conn = MG_CONN_2_CONN(c);
  c->status_code = 401;
  mg_printf(c,
            "HTTP/1.1 401 Unauthorized\r\n"
            "WWW-Authenticate: Digest qop=\"auth\", "
            "realm=\"%s\", nonce=\"%lu\"\r\n\r\n",
            conn->server->config_options[AUTH_DOMAIN],
            (unsigned long) time(NULL));
  close_local_endpoint(conn);
}

// Use the global passwords file, if specified by auth_gpass option,
// or search for .htpasswd in the requested directory.
static FILE *open_auth_file(struct connection *conn, const char *path) {
  char name[MAX_PATH_SIZE];
  const char *p, *gpass = conn->server->config_options[GLOBAL_AUTH_FILE];
  file_stat_t st;
  FILE *fp = NULL;

  if (gpass != NULL) {
    // Use global passwords file
    fp = fopen(gpass, "r");
  } else if (!stat(path, &st) && S_ISDIR(st.st_mode)) {
    mg_snprintf(name, sizeof(name), "%s%c%s", path, '/', PASSWORDS_FILE_NAME);
    fp = fopen(name, "r");
  } else {
    // Try to find .htpasswd in requested directory.
    if ((p = strrchr(path, '/')) == NULL) p = path;
    mg_snprintf(name, sizeof(name), "%.*s%c%s",
                (int) (p - path), path, '/', PASSWORDS_FILE_NAME);
    fp = fopen(name, "r");
  }

  return fp;
}

#if !defined(HAVE_MD5) && !defined(MONGOOSE_NO_AUTH)
typedef struct MD5Context {
  uint32_t buf[4];
  uint32_t bits[2];
  unsigned char in[64];
} MD5_CTX;

static void byteReverse(unsigned char *buf, unsigned longs) {
  uint32_t t;

  // Forrest: MD5 expect LITTLE_ENDIAN, swap if BIG_ENDIAN
  if (is_big_endian()) {
    do {
      t = (uint32_t) ((unsigned) buf[3] << 8 | buf[2]) << 16 |
        ((unsigned) buf[1] << 8 | buf[0]);
      * (uint32_t *) buf = t;
      buf += 4;
    } while (--longs);
  }
}

#define F1(x, y, z) (z ^ (x & (y ^ z)))
#define F2(x, y, z) F1(z, x, y)
#define F3(x, y, z) (x ^ y ^ z)
#define F4(x, y, z) (y ^ (x | ~z))

#define MD5STEP(f, w, x, y, z, data, s) \
  ( w += f(x, y, z) + data,  w = w<>(32-s),  w += x )

// Start MD5 accumulation.  Set bit count to 0 and buffer to mysterious
// initialization constants.
static void MD5Init(MD5_CTX *ctx) {
  ctx->buf[0] = 0x67452301;
  ctx->buf[1] = 0xefcdab89;
  ctx->buf[2] = 0x98badcfe;
  ctx->buf[3] = 0x10325476;

  ctx->bits[0] = 0;
  ctx->bits[1] = 0;
}

static void MD5Transform(uint32_t buf[4], uint32_t const in[16]) {
  register uint32_t a, b, c, d;

  a = buf[0];
  b = buf[1];
  c = buf[2];
  d = buf[3];

  MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
  MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
  MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
  MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
  MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
  MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
  MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
  MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
  MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
  MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
  MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
  MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
  MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
  MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
  MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
  MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);

  MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
  MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
  MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
  MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
  MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
  MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
  MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
  MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
  MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
  MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
  MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
  MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
  MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
  MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
  MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
  MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);

  MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
  MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
  MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
  MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
  MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
  MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
  MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
  MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
  MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
  MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
  MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
  MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
  MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
  MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
  MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
  MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);

  MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
  MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
  MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
  MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
  MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
  MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
  MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
  MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
  MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
  MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
  MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
  MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
  MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
  MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
  MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
  MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);

  buf[0] += a;
  buf[1] += b;
  buf[2] += c;
  buf[3] += d;
}

static void MD5Update(MD5_CTX *ctx, unsigned char const *buf, unsigned len) {
  uint32_t t;

  t = ctx->bits[0];
  if ((ctx->bits[0] = t + ((uint32_t) len << 3)) < t)
    ctx->bits[1]++;
  ctx->bits[1] += len >> 29;

  t = (t >> 3) & 0x3f;

  if (t) {
    unsigned char *p = (unsigned char *) ctx->in + t;

    t = 64 - t;
    if (len < t) {
      memcpy(p, buf, len);
      return;
    }
    memcpy(p, buf, t);
    byteReverse(ctx->in, 16);
    MD5Transform(ctx->buf, (uint32_t *) ctx->in);
    buf += t;
    len -= t;
  }

  while (len >= 64) {
    memcpy(ctx->in, buf, 64);
    byteReverse(ctx->in, 16);
    MD5Transform(ctx->buf, (uint32_t *) ctx->in);
    buf += 64;
    len -= 64;
  }

  memcpy(ctx->in, buf, len);
}

static void MD5Final(unsigned char digest[16], MD5_CTX *ctx) {
  unsigned count;
  unsigned char *p;
  uint32_t *a;

  count = (ctx->bits[0] >> 3) & 0x3F;

  p = ctx->in + count;
  *p++ = 0x80;
  count = 64 - 1 - count;
  if (count < 8) {
    memset(p, 0, count);
    byteReverse(ctx->in, 16);
    MD5Transform(ctx->buf, (uint32_t *) ctx->in);
    memset(ctx->in, 0, 56);
  } else {
    memset(p, 0, count - 8);
  }
  byteReverse(ctx->in, 14);

  a = (uint32_t *)ctx->in;
  a[14] = ctx->bits[0];
  a[15] = ctx->bits[1];

  MD5Transform(ctx->buf, (uint32_t *) ctx->in);
  byteReverse((unsigned char *) ctx->buf, 4);
  memcpy(digest, ctx->buf, 16);
  memset((char *) ctx, 0, sizeof(*ctx));
}
#endif // !HAVE_MD5



// Stringify binary data. Output buffer must be twice as big as input,
// because each byte takes 2 bytes in string representation
static void bin2str(char *to, const unsigned char *p, size_t len) {
  static const char *hex = "0123456789abcdef";

  for (; len--; p++) {
    *to++ = hex[p[0] >> 4];
    *to++ = hex[p[0] & 0x0f];
  }
  *to = '\0';
}

// Return stringified MD5 hash for list of strings. Buffer must be 33 bytes.
char *mg_md5(char buf[33], ...) {
  unsigned char hash[16];
  const char *p;
  va_list ap;
  MD5_CTX ctx;

  MD5Init(&ctx);

  va_start(ap, buf);
  while ((p = va_arg(ap, const char *)) != NULL) {
    MD5Update(&ctx, (const unsigned char *) p, (unsigned) strlen(p));
  }
  va_end(ap);

  MD5Final(hash, &ctx);
  bin2str(buf, hash, sizeof(hash));
  return buf;
}

// Check the user's password, return 1 if OK
static int check_password(const char *method, const char *ha1, const char *uri,
                          const char *nonce, const char *nc, const char *cnonce,
                          const char *qop, const char *response) {
  char ha2[32 + 1], expected_response[32 + 1];

#if 0
  // Check for authentication timeout
  if ((unsigned long) time(NULL) - (unsigned long) to64(nonce) > 3600 * 2) {
    return 0;
  }
#endif

  mg_md5(ha2, method, ":", uri, NULL);
  mg_md5(expected_response, ha1, ":", nonce, ":", nc,
      ":", cnonce, ":", qop, ":", ha2, NULL);

  return mg_strcasecmp(response, expected_response) == 0 ? MG_TRUE : MG_FALSE;
}


// Authorize against the opened passwords file. Return 1 if authorized.
int mg_authorize_digest(struct mg_connection *c, FILE *fp) {
  struct connection *conn = MG_CONN_2_CONN(c);
  const char *hdr;
  char line[256], f_user[256], ha1[256], f_domain[256], user[100], nonce[100],
       uri[MAX_REQUEST_SIZE], cnonce[100], resp[100], qop[100], nc[100];

  if (c == NULL || fp == NULL) return 0;
  if ((hdr = mg_get_header(c, "Authorization")) == NULL ||
      mg_strncasecmp(hdr, "Digest ", 7) != 0) return 0;
  if (!mg_parse_header(hdr, "username", user, sizeof(user))) return 0;
  if (!mg_parse_header(hdr, "cnonce", cnonce, sizeof(cnonce))) return 0;
  if (!mg_parse_header(hdr, "response", resp, sizeof(resp))) return 0;
  if (!mg_parse_header(hdr, "uri", uri, sizeof(uri))) return 0;
  if (!mg_parse_header(hdr, "qop", qop, sizeof(qop))) return 0;
  if (!mg_parse_header(hdr, "nc", nc, sizeof(nc))) return 0;
  if (!mg_parse_header(hdr, "nonce", nonce, sizeof(nonce))) return 0;

  while (fgets(line, sizeof(line), fp) != NULL) {
    if (sscanf(line, "%[^:]:%[^:]:%s", f_user, f_domain, ha1) == 3 &&
        !strcmp(user, f_user) &&
        // NOTE(lsm): due to a bug in MSIE, we do not compare URIs
        !strcmp(conn->server->config_options[AUTH_DOMAIN], f_domain))
      return check_password(c->request_method, ha1, uri,
                            nonce, nc, cnonce, qop, resp);
  }
  return MG_FALSE;
}


// Return 1 if request is authorised, 0 otherwise.
static int is_authorized(struct connection *conn, const char *path) {
  FILE *fp;
  int authorized = MG_TRUE;

  if ((fp = open_auth_file(conn, path)) != NULL) {
    authorized = mg_authorize_digest(&conn->mg_conn, fp);
    fclose(fp);
  }

  return authorized;
}

static int is_authorized_for_dav(struct connection *conn) {
  const char *auth_file = conn->server->config_options[DAV_AUTH_FILE];
  FILE *fp;
  int authorized = MG_FALSE;

  if (auth_file != NULL && (fp = fopen(auth_file, "r")) != NULL) {
    authorized = mg_authorize_digest(&conn->mg_conn, fp);
    fclose(fp);
  }

  return authorized;
}

static int is_dav_mutation(const struct connection *conn) {
  const char *s = conn->mg_conn.request_method;
  return s && (!strcmp(s, "PUT") || !strcmp(s, "DELETE") ||
               !strcmp(s, "MKCOL"));
}
#endif // MONGOOSE_NO_AUTH

static int parse_header(const char *str, int str_len, const char *var_name,
                        char *buf, size_t buf_size) {
  int ch = ' ', len = 0, n = strlen(var_name);
  const char *p, *end = str + str_len, *s = NULL;

  if (buf != NULL && buf_size > 0) buf[0] = '\0';

  // Find where variable starts
  for (s = str; s != NULL && s + n < end; s++) {
    if ((s == str || s[-1] == ' ' || s[-1] == ',') && s[n] == '=' &&
        !memcmp(s, var_name, n)) break;
  }

  if (s != NULL && &s[n + 1] < end) {
    s += n + 1;
    if (*s == '"' || *s == '\'') ch = *s++;
    p = s;
    while (p < end && p[0] != ch && p[0] != ',' && len < (int) buf_size) {
      if (p[0] == '\\' && p[1] == ch) p++;
      buf[len++] = *p++;
    }
    if (len >= (int) buf_size || (ch != ' ' && *p != ch)) {
      len = 0;
    } else {
      if (len > 0 && s[len - 1] == ',') len--;
      if (len > 0 && s[len - 1] == ';') len--;
      buf[len] = '\0';
    }
  }

  return len;
}

int mg_parse_header(const char *s, const char *var_name, char *buf,
                    size_t buf_size) {
  return parse_header(s, s == NULL ? 0 : strlen(s), var_name, buf, buf_size);
}

#ifdef MONGOOSE_USE_LUA
#ifdef _WIN32
static void *mmap(void *addr, int64_t len, int prot, int flags, int fd,
                  int offset) {
  HANDLE fh = (HANDLE) _get_osfhandle(fd);
  HANDLE mh = CreateFileMapping(fh, 0, PAGE_READONLY, 0, 0, 0);
  void *p = MapViewOfFile(mh, FILE_MAP_READ, 0, 0, (size_t) len);
  CloseHandle(mh);
  return p;
}
#define munmap(x, y)  UnmapViewOfFile(x)
#define MAP_FAILED NULL
#define MAP_PRIVATE 0
#define PROT_READ 0
#else
#include 
#endif

void reg_string(struct lua_State *L, const char *name, const char *val) {
  lua_pushstring(L, name);
  lua_pushstring(L, val);
  lua_rawset(L, -3);
}

void reg_int(struct lua_State *L, const char *name, int val) {
  lua_pushstring(L, name);
  lua_pushinteger(L, val);
  lua_rawset(L, -3);
}

void reg_function(struct lua_State *L, const char *name,
                         lua_CFunction func, struct mg_connection *conn) {
  lua_pushstring(L, name);
  lua_pushlightuserdata(L, conn);
  lua_pushcclosure(L, func, 1);
  lua_rawset(L, -3);
}

static int lua_write(lua_State *L) {
  int i, num_args;
  const char *str;
  size_t size;
  struct mg_connection *conn = (struct mg_connection *)
    lua_touserdata(L, lua_upvalueindex(1));

  num_args = lua_gettop(L);
  for (i = 1; i <= num_args; i++) {
    if (lua_isstring(L, i)) {
      str = lua_tolstring(L, i, &size);
      mg_write(conn, str, size);
    }
  }

  return 0;
}

static int lsp_sock_close(lua_State *L) {
  if (lua_gettop(L) > 0 && lua_istable(L, -1)) {
    lua_getfield(L, -1, "sock");
    closesocket((sock_t) lua_tonumber(L, -1));
  } else {
    return luaL_error(L, "invalid :close() call");
  }
  return 1;
}

static int lsp_sock_recv(lua_State *L) {
  char buf[2000];
  int n;

  if (lua_gettop(L) > 0 && lua_istable(L, -1)) {
    lua_getfield(L, -1, "sock");
    n = recv((sock_t) lua_tonumber(L, -1), buf, sizeof(buf), 0);
    if (n <= 0) {
      lua_pushnil(L);
    } else {
      lua_pushlstring(L, buf, n);
    }
  } else {
    return luaL_error(L, "invalid :close() call");
  }
  return 1;
}

static int lsp_sock_send(lua_State *L) {
  const char *buf;
  size_t len, sent = 0;
  int n, sock;

  if (lua_gettop(L) > 1 && lua_istable(L, -2) && lua_isstring(L, -1)) {
    buf = lua_tolstring(L, -1, &len);
    lua_getfield(L, -2, "sock");
    sock = (int) lua_tonumber(L, -1);
    while (sent < len) {
      if ((n = send(sock, buf + sent, len - sent, 0)) <= 0) break;
      sent += n;
    }
    lua_pushnumber(L, sent);
  } else {
    return luaL_error(L, "invalid :close() call");
  }
  return 1;
}

static const struct luaL_Reg luasocket_methods[] = {
  {"close", lsp_sock_close},
  {"send", lsp_sock_send},
  {"recv", lsp_sock_recv},
  {NULL, NULL}
};

static sock_t conn2(const char *host, int port) {
  struct sockaddr_in sin;
  struct hostent *he = NULL;
  sock_t sock = INVALID_SOCKET;

  if (host != NULL &&
      (he = gethostbyname(host)) != NULL &&
    (sock = socket(AF_INET, SOCK_STREAM, 0)) != INVALID_SOCKET) {
    ns_set_close_on_exec(sock);
    sin.sin_family = AF_INET;
    sin.sin_port = htons((uint16_t) port);
    sin.sin_addr = * (struct in_addr *) he->h_addr_list[0];
    if (connect(sock, (struct sockaddr *) &sin, sizeof(sin)) != 0) {
      closesocket(sock);
      sock = INVALID_SOCKET;
    }
  }
  return sock;
}

static int lsp_connect(lua_State *L) {
  sock_t sock;

  if (lua_isstring(L, -2) && lua_isnumber(L, -1)) {
    sock = conn2(lua_tostring(L, -2), (int) lua_tonumber(L, -1));
    if (sock == INVALID_SOCKET) {
      lua_pushnil(L);
    } else {
      lua_newtable(L);
      reg_int(L, "sock", sock);
      reg_string(L, "host", lua_tostring(L, -4));
      luaL_getmetatable(L, "luasocket");
      lua_setmetatable(L, -2);
    }
  } else {
    return luaL_error(L, "connect(host,port): invalid parameter given.");
  }
  return 1;
}

static void prepare_lua_environment(struct mg_connection *ri, lua_State *L) {
  extern void luaL_openlibs(lua_State *);
  int i;

  luaL_openlibs(L);

  luaL_newmetatable(L, "luasocket");
  lua_newtable(L);
  luaL_newlib(L, luasocket_methods);
  lua_rawset(L, -3);
  lua_pop(L, 1);
  lua_register(L, "connect", lsp_connect);

  if (ri == NULL) return;

  // Register mg module
  lua_newtable(L);
  reg_function(L, "write", lua_write, ri);

  // Export request_info
  lua_pushstring(L, "request_info");
  lua_newtable(L);
  reg_string(L, "request_method", ri->request_method);
  reg_string(L, "uri", ri->uri);
  reg_string(L, "http_version", ri->http_version);
  reg_string(L, "query_string", ri->query_string);
  reg_string(L, "remote_ip", ri->remote_ip);
  reg_int(L, "remote_port", ri->remote_port);
  reg_string(L, "local_ip", ri->local_ip);
  reg_int(L, "local_port", ri->local_port);
  lua_pushstring(L, "content");
  lua_pushlstring(L, ri->content == NULL ? "" : ri->content, ri->content_len);
  lua_rawset(L, -3);
  reg_int(L, "num_headers", ri->num_headers);
  lua_pushstring(L, "http_headers");
  lua_newtable(L);
  for (i = 0; i < ri->num_headers; i++) {
    reg_string(L, ri->http_headers[i].name, ri->http_headers[i].value);
  }
  lua_rawset(L, -3);
  lua_rawset(L, -3);

  lua_setglobal(L, "mg");

  // Register default mg.onerror function
  (void) luaL_dostring(L, "mg.onerror = function(e) mg.write('\\nLua "
                       "error:\\n', debug.traceback(e, 1)) end");
}

static int lua_error_handler(lua_State *L) {
  const char *error_msg =  lua_isstring(L, -1) ?  lua_tostring(L, -1) : "?\n";

  lua_getglobal(L, "mg");
  if (!lua_isnil(L, -1)) {
    lua_getfield(L, -1, "write");   // call mg.write()
    lua_pushstring(L, error_msg);
    lua_pushliteral(L, "\n");
    lua_call(L, 2, 0);
    (void) luaL_dostring(L, "mg.write(debug.traceback(), '\\n')");
  } else {
    printf("Lua error: [%s]\n", error_msg);
    (void) luaL_dostring(L, "print(debug.traceback(), '\\n')");
  }
  // TODO(lsm): leave the stack balanced

  return 0;
}

static void lsp(struct connection *conn, const char *p, int len, lua_State *L) {
  int i, j, pos = 0;

  for (i = 0; i < len; i++) {
    if (p[i] == '<' && p[i + 1] == '?') {
      for (j = i + 1; j < len ; j++) {
        if (p[j] == '?' && p[j + 1] == '>') {
          mg_write(&conn->mg_conn, p + pos, i - pos);
          if (luaL_loadbuffer(L, p + (i + 2), j - (i + 2), "") == 0) {
            lua_pcall(L, 0, LUA_MULTRET, 0);
          }
          pos = j + 2;
          i = pos - 1;
          break;
        }
      }
    }
  }
  if (i > pos) mg_write(&conn->mg_conn, p + pos, i - pos);
}

static void handle_lsp_request(struct connection *conn, const char *path,
                               file_stat_t *st) {
  void *p = MAP_FAILED;
  lua_State *L = NULL;
  FILE *fp = NULL;

  if ((fp = fopen(path, "r")) == NULL ||
      (p = mmap(NULL, st->st_size, PROT_READ, MAP_PRIVATE,
                fileno(fp), 0)) == MAP_FAILED ||
      (L = luaL_newstate()) == NULL) {
    send_http_error(conn, 500, "mmap(%s): %s", path, strerror(errno));
  } else {
    // We're not sending HTTP headers here, Lua page must do it.
    prepare_lua_environment(&conn->mg_conn, L);
    conn->mg_conn.connection_param = L;
    call_user(conn, MG_LUA);
    lua_pushcclosure(L, &lua_error_handler, 0);
    lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS);
    lsp(conn, p, (int) st->st_size, L);
    close_local_endpoint(conn);
  }

  if (L != NULL) lua_close(L);
  if (p != MAP_FAILED) munmap(p, st->st_size);
  if (fp != NULL) fclose(fp);
}
#endif // MONGOOSE_USE_LUA

#ifndef MONGOOSE_NO_SSI
static void send_ssi_file(struct mg_connection *, const char *, FILE *, int);

static void send_file_data(struct mg_connection *conn, FILE *fp) {
  char buf[IOBUF_SIZE];
  int n;
  while ((n = fread(buf, 1, sizeof(buf), fp)) > 0) {
    mg_write(conn, buf, n);
  }
}

static void do_ssi_include(struct mg_connection *conn, const char *ssi,
                           char *tag, int include_level) {
  char file_name[IOBUF_SIZE], path[MAX_PATH_SIZE], *p;
  char **opts = (MG_CONN_2_CONN(conn))->server->config_options;
  FILE *fp;

  // sscanf() is safe here, since send_ssi_file() also uses buffer
  // of size MG_BUF_LEN to get the tag. So strlen(tag) is always < MG_BUF_LEN.
  if (sscanf(tag, " virtual=\"%[^\"]\"", file_name) == 1) {
    // File name is relative to the webserver root
    mg_snprintf(path, sizeof(path), "%s%c%s",
                opts[DOCUMENT_ROOT], '/', file_name);
  } else if (sscanf(tag, " abspath=\"%[^\"]\"", file_name) == 1) {
    // File name is relative to the webserver working directory
    // or it is absolute system path
    mg_snprintf(path, sizeof(path), "%s", file_name);
  } else if (sscanf(tag, " file=\"%[^\"]\"", file_name) == 1 ||
             sscanf(tag, " \"%[^\"]\"", file_name) == 1) {
    // File name is relative to the currect document
    mg_snprintf(path, sizeof(path), "%s", ssi);
    if ((p = strrchr(path, '/')) != NULL) {
      p[1] = '\0';
    }
    mg_snprintf(path + strlen(path), sizeof(path) - strlen(path), "%s",
                file_name);
  } else {
    mg_printf(conn, "Bad SSI #include: [%s]", tag);
    return;
  }

  if ((fp = fopen(path, "rb")) == NULL) {
    mg_printf(conn, "Cannot open SSI #include: [%s]: fopen(%s): %s",
              tag, path, strerror(errno));
  } else {
    ns_set_close_on_exec(fileno(fp));
    if (match_prefix(opts[SSI_PATTERN], strlen(opts[SSI_PATTERN]), path) > 0) {
      send_ssi_file(conn, path, fp, include_level + 1);
    } else {
      send_file_data(conn, fp);
    }
    fclose(fp);
  }
}

#ifndef MONGOOSE_NO_POPEN
static void do_ssi_exec(struct mg_connection *conn, char *tag) {
  char cmd[IOBUF_SIZE];
  FILE *fp;

  if (sscanf(tag, " \"%[^\"]\"", cmd) != 1) {
    mg_printf(conn, "Bad SSI #exec: [%s]", tag);
  } else if ((fp = popen(cmd, "r")) == NULL) {
    mg_printf(conn, "Cannot SSI #exec: [%s]: %s", cmd, strerror(errno));
  } else {
    send_file_data(conn, fp);
    pclose(fp);
  }
}
#endif // !MONGOOSE_NO_POPEN

static void send_ssi_file(struct mg_connection *conn, const char *path,
                          FILE *fp, int include_level) {
  char buf[IOBUF_SIZE];
  int ch, offset, len, in_ssi_tag;

  if (include_level > 10) {
    mg_printf(conn, "SSI #include level is too deep (%s)", path);
    return;
  }

  in_ssi_tag = len = offset = 0;
  while ((ch = fgetc(fp)) != EOF) {
    if (in_ssi_tag && ch == '>') {
      in_ssi_tag = 0;
      buf[len++] = (char) ch;
      buf[len] = '\0';
      assert(len <= (int) sizeof(buf));
      if (len < 6 || memcmp(buf, "
	
	

	
	org.freelan.freelan.pkg
	tap.pkg
	tun.pkg

	
	
		
		
		
	

	
	
		
	
	
		
	
	
		
	

freelan-2.0/packaging/osx/generate_script.py000066400000000000000000000015261252300335000212510ustar00rootroot00000000000000"""A SCons builder for plist files"""


def generate_script_emitter(target, source, env):
    env.Depends(target, env.Value(env['GENERATE_SCRIPT_TEMPLATE']))

    return (target, source)


def generate_script_action(target, source, env):
    template = env['GENERATE_SCRIPT_TEMPLATE']

    for targ in target:
        with open(targ.abspath, 'w') as targf:
            targf.write(
                template.format(
                    commands='\n'.join(source[0].value),
                ),
            )


def generate(env):
    env.Append(GENERATE_SCRIPT_TEMPLATE="""#!/bin/sh

{commands}
""")

    import SCons.Builder

    generate_script_builder = SCons.Builder.Builder(
        action=generate_script_action,
        emitter=generate_script_emitter,
        suffix='.sh',
    )

    env.Append(BUILDERS={'GenerateScript': generate_script_builder})
freelan-2.0/packaging/osx/pkgbuild.py000066400000000000000000000027731252300335000177010ustar00rootroot00000000000000"""A SCons builder for pkgbuild"""

import SCons.Warnings
import SCons.Errors


def pkgbuild_emitter(target, source, env):
    """The emitter"""

    env.Depends(target, env['PKGBUILD_OPTIONS'])
    env.Depends(target, env['PKGBUILD_SCRIPTS'])

    return (target, source)


def pkgbuild_generator(target, source, env, for_signature):
    """The generator"""

    options = env['PKGBUILD_OPTIONS'].value
    options_str = ' '.join(
        '--%s %s' % (key, value)
        for key, value in options.iteritems()
    )

    if env['PKGBUILD_SCRIPTS']:
        options_str = options_str + ' --scripts $PKGBUILD_SCRIPTS'

    return '{executable} {options_str} --root $SOURCE $TARGET'.format(
        executable=env['PKGBUILD'],
        options_str=options_str,
    )


class PkgBuildNotFound(SCons.Warnings.Warning):
    pass


def detect(env):
    try:
        return env['PKGBUILD']
    except KeyError:
        pass

    pkgbuild = env.WhereIs('pkgbuild')

    if pkgbuild:
        return pkgbuild

    raise SCons.Errors.StopError(
        PkgBuildNotFound,
        "Unable to find pkgbuild"
    )


def generate(env):
    env.Append(PKGBUILD=detect(env))
    env.Append(PKGBUILD_SCRIPTS=None)
    env.Append(PKGBUILD_OPTIONS=env.Value({}))

    import SCons.Builder

    pkgbuild_builder = SCons.Builder.Builder(
        generator=pkgbuild_generator,
        emitter=pkgbuild_emitter,
        suffix='.pkg',
    )

    env.Append(BUILDERS={'PkgBuild': pkgbuild_builder})


def exists(env):
    return env.Detect(env['PKGBUILD'])
freelan-2.0/packaging/osx/plist.py000066400000000000000000000005741252300335000172300ustar00rootroot00000000000000"""A SCons builder for plist files"""

import plistlib


def plist_action(target, source, env):
    for targ in target:
        plistlib.writePlist(source[0].value, targ.abspath)


def generate(env):
    import SCons.Builder

    plist_builder = SCons.Builder.Builder(
        action=plist_action,
        suffix='.plist',
    )

    env.Append(BUILDERS={'Plist': plist_builder})
freelan-2.0/packaging/osx/productbuild.py000066400000000000000000000063041252300335000205720ustar00rootroot00000000000000"""A SCons builder for productbuild"""

from xml.dom import minidom

import SCons.Warnings
import SCons.Errors


def get_nodes(element, path):
    if not hasattr(element, 'nodeName'):
        return []

    separator = '/'

    if separator in path:
        tag, subpath = path.split(separator, 1)
    else:
        tag, subpath = path, None

    if tag == '':
        tag = '#document'

    if element.nodeName != tag:
        return []

    if subpath:
        result = []

        for node in element.childNodes:
            result.extend(get_nodes(node, subpath))

        return result

    return [element]


def productbuild_scanner(node, env, paths):
    result = []

    if node.exists():
        document = minidom.parseString(node.get_contents())
        xnodes = get_nodes(document, '/installer-gui-script/pkg-ref')
        packages = [xnode.childNodes[0].nodeValue for xnode in xnodes]

        for package in packages:
            for path in paths:
                package_file = env.Dir(path).File(package)

                if package_file.exists() or package_file.has_builder():
                    result.append(package_file)
                    break

    return result


def productbuild_emitter(target, source, env):
    """The emitter"""

    env.Depends(target, env['PRODUCTBUILD_OPTIONS'])
    env.Depends(target, env['PRODUCTBUILD_RESOURCES'])

    return (target, source)


def productbuild_generator(target, source, env, for_signature):
    """The generator"""

    options = env['PRODUCTBUILD_OPTIONS'].value
    options_str = ' '.join(
        '--%s %s' % (key, value)
        for key, value in options.iteritems()
    )

    if env['PRODUCTBUILD_RESOURCES']:
        options_str = options_str + ' --resources $PRODUCTBUILD_RESOURCES'

    package_path = env['PRODUCTBUILD_PACKAGE_PATH']

    if package_path:
        options_str = options_str + ' ' + ' '.join(
            '--package-path %s' % path
            for path in package_path
        )

    return '{executable} {options_str} --distribution $SOURCE $TARGET'.format(
        executable=env['PRODUCTBUILD'],
        options_str=options_str,
    )


class ProductBuildNotFound(SCons.Warnings.Warning):
    pass


def detect(env):
    try:
        return env['PRODUCTBUILD']
    except KeyError:
        pass

    productbuild = env.WhereIs('productbuild')

    if productbuild:
        return productbuild

    raise SCons.Errors.StopError(
        ProductBuildNotFound,
        "Unable to find productbuild"
    )


def generate(env):
    env.Append(PRODUCTBUILD=detect(env))
    env.Append(PRODUCTBUILD_PACKAGE_PATH=[])
    env.Append(PRODUCTBUILD_RESOURCES=None)
    env.Append(PRODUCTBUILD_OPTIONS=env.Value({}))

    import SCons.Scanner

    env.Append(SCANNERS=SCons.Scanner.Scanner(
        function=productbuild_scanner,
        skeys=['.xml'],
        path_function=SCons.Scanner.FindPathDirs('PRODUCTBUILD_PACKAGE_PATH'),
    ))

    import SCons.Builder

    productbuild_builder = SCons.Builder.Builder(
        generator=productbuild_generator,
        emitter=productbuild_emitter,
        suffix='.pkg',
        src_suffix='.xml',
    )

    env.Append(BUILDERS={'ProductBuild': productbuild_builder})


def exists(env):
    return env.Detect(env['PRODUCTBUILD'])
freelan-2.0/packaging/osx/resources/000077500000000000000000000000001252300335000175275ustar00rootroot00000000000000freelan-2.0/packaging/osx/resources/background.png000066400000000000000000000373211252300335000223620ustar00rootroot00000000000000PNG


IHDR\rftEXtSoftwareAdobe ImageReadyqe<viTXtXML:com.adobe.xmp        :IDATx}%Uw}M`f  a%PETt?3ku1|sNk) 	AU( a3vPu?s|SU8?pp88gpp88gpp88gpp88gpp88gpp88gpp88gpp88gpp88g3p8p83p8p83p8p83p8p83p8p83p8p83pl:ԅ&''	ofv7@rƾiދ-wЇ3<N9slwmO)䴸oڟwwMq+ۥR^/fx\_+ob<ѽ.|&0cbŊp;Unflz	l^?Q"ٌ`oN㹿;I9:Fpr6o"p/=M[Z~b6j>O6Sh❹mөniK;	&#GZ-Z7oq#ضƾO	q5}˸ycp\
,}^|zHA߇:/~wr??=r8pl&gp;
-a1Ty^ccͬa/H~u.aky:޷v5#yfZx|w
pTvB;Sԍܗ3~@=&$&t(/>Q~0@1Ru,8\p(v1^/	m+ot4bw^	'qc3mx.!;-Ɍ*=+g'A=b:;plNPNet涜=~/Kt?Pk486_,;Fz*C0 5n/@Pnt<*ܞwp/^Jy᳡$܋<g͇As7!9 80ʇ]]py@#O򶿡ko?w%wΘK-/3c~.}Q%0F,|;)3'ĶT	ř!#PgQ.?T[i➀?L"#_J*
G8 *<'8-X8,
6?
8.{.Gj|BP|c)($zL2!At_09YBZݢ;{]HU07^I({T^yغ
L$x39jfG!7iWfJ7,{A0vĤ}ohf$愽d!RPDAI>arў;S|ټS~U"fDg2549p~ܽ$s	ƚlWo\cwG5%g;>A(`a/ȚLTD	SAHs0]a=ߥ$:i[ψH
cj~}/Z cQ 0n_}WR$-X")ӤmhN<w^Q9u؏rgsgڷ
=MhbwM#q/t{p'R>%P!0
ɘ݁j0|](xq&qRw3 
	0%"23*q
zٺXjЃ/J$`}V~}@N=	ڙ} />Y_N5Tp-$3ӱ"4o3wWQ5|m%A*/o:sU.q@ro8Q'}l١^{/O^9H0-/PjٞcشX L[
ۉ^nӠkpG%Gat]Ս9~x9znL?Iz#/
nD7P]Ȣ}eV#KB0f+Tm[k5nD7#Bl$))ezƽfO
36\\0=Ρ$Փ/?eFPz|w9*@cMyة6$PvC2
=R1팃Nabm$IfﻸvזcⲼ?.8	rutfso;9f!*ù$FE?y.'+ꄈ_l2@
 <}	p{3Y*1꒥F0'@19+
 '7O_6sx"~`X_Y!էy]0km2 *wo*i3[sw^_SrX)G;A!2c#q\%⛹BUUdf#oD+4,oAJ Ce$X]7SC{2{$*%4Aշ#}NT|:.`8_	rrF`4x3>}oBsT#~ LATyy'ӞKx|)ܜkn7(,دZ	q3j7:ыPT L`|uQ[Dgb
(yK<^,/5M`g^<JW1}%97%E׍rM0\'E:KJ~|TZH@ܞnFCyLnV9NFѶ>^"dIQS˸ ?;hUXԃ/>ݟ~	XކZIhdޅ!~7zwR~Vq0D"#Q>Yd}h,1yݟKx{~Z̡[??C :8ѽmXbTt3*HkW)~&99=v3PQ#Hi2Gp
ie;94wPbX`ja\Hmt6~ԕI;:%BU+J	20$LܮB~x^Y9<2|3/?kWuLJ(E⅋F%ISMB̈bj&%ms[
#EȣcюSx%ȠiG"P}.MXu^K$u-jkEf?§{$bU|R,;nDjොF#  ޫ:Pr(
!	j"4rsR<(XR1uŐSGUATBC,Ɣ,ie]`63cT3h-ު+Io'C4)LǴ+,@E*[HJbm	R*'<`,UFfxF0tc5wo:#X

>D:TN8ҧ*@iV7*j!SГbVn׹m;F4tҼF7V$+ҁzo5Ӂ*j_m{l*-}$JyKƘ:t>綟5uaIv.HJp
/
{hQN->5d|
W(ߕ"Ol֫TF^Z"kOyQE"%qj!I
Gny|g^~f(Y^͛%Pg.CS}LjyRadv0;`4rQDV~65ڈ'a^,(^];'Žu;)zQ#(]7T)>C닸;JI8Hs/$$hŒg\XqKjp}<4k;h{&bSAXi Dbz{/>'"45;ex4fx_1dcKg[/,E6۱YFc9T;&0	A(6Lf;#V@!%hrB3@RSϜ:]
`ˆ!Eota=gs{2oRe`$g?@%lN)"CťDjͣep{DE
SPb _`WjǠ&d4 ǿ_}Qf	X9\:
h6_-:6B@%/ŵ)=MȇuPr2<0`	u%ccjk7?bY1%4{@_:;QۧfaP*c$T/Գ	?iuk`Ԥ3)@Ao*ꥢ..	@|J,^2&F5OJؐfi
Va`r`vMӺ1(CL@3fƽ@azj_<+we=X$Uj$Tacrj
e3Y7k]OE#(K;
H 5vFOFv܈S<"Rj6)WjFi+yD$s$h60[.֮\V;_ᦵpF9qC`$KCʋa[c͛HɼeE;I.
0PItł4i0ÌT* K5}Zџ#HzQʼn#1Dg|6lkb`cJܩzHӈ6Fo(/ %t7Q(S$zkA2_R&R(P2Ĩ5J2ϴtX^Si҄}L@"(gTp!i1N[6R%ցP8#`*Wiu;BCBC|QkUZ'mJ%t_J4NQ	r*Xi$%- L:yUx>X(:0Aj鈺l=wVΐ0\XRQ`$Mf,#_1HEڒQ<}hR>:a3P?PdfQ
̎
"P80IkyRtHHj%Wl@Lir7y	kDh2cMZ5"֙)f-Aps>wPe^l]8"Gfp,@bL&fBn
CҪ

CG=/RTpԎp˜`'it|^OJюJXTSb$&a%!>d*	d_JRN#ZbB$`Lm>&`>s)N]s@;?Knd!48>H@ic&	$e)BJt";|jКeֆ@CP,4S.`(b6h$Ks``6`w3LelǸPbG4
WuHH3*$o
4EE#D
I"ɴV"#EXt:YƭŒf2B<HdޥR[iIn-?V׊d~pނv{єV}ݛ5ɧvr5*vpU^$ŵTb-
;O0r#&+]}A>4LIhWRZhmT1K+f
9.g0R\͌nُ!M-X[U>Zs0ӀyǡwKA#Me~>\@[q;	iҗGM]2c*~[!qQ˜[̢Ywƕ\`SJe
LWp({r	`R=K,%W9BؽI&׷?e
no6a>	@ɱ14 
jz/+LqI0SV*V`E U{^X)H2[~|_}HO|"e]PvRj@Fؘ'+rx(c!`SD4i,	 Xgn*w!kVhdEiQ8Th&?
	 b?VatFR%)+#~7/׸m
bNdaݬ{ 58&.XʪhP珟_]Vft$`U*(4ǔJRv:É8ȉ!4r+>h!ꩳCCWM	9e	E<9@Qf1PX37.Ԯ8*f[0<}9{n

BW݄BV}k`|&/1|?h:?$
Rd
V|RIoxBBYSdK.T-
p#9h*=e(Oӄ^:}H(ad9[OBIs|dd9
ƌp !,s0\%y'*Qu-/}p%jP׎]t$`}0*N4ߟ@&iE/9Ȓڱ^+Uvf0//	:RKJ 2fRmY#aZ(u
+?}|r|rW$ BY.5g8aK8a8WAIlw1yՍS0(]mÆȇ-3sQ}땊P:q1?5|snZw)?įY/)Ռp/!4tlQΐh%kvogTh)ِOf?	?ĈUG0%C3MEf
־ôV#I)@P^~cVp>>V\uMɠXt3a~P_]G$P)ۤl͚q`eި[{Bأ}^,Y%N?S`߹6?6Zl?ˌxGN=|ۘFWT|I4fLᙢ44IAs{`(Pv<^~$Ua]ֺsʦQcaxSq־]#ɠ3M/oyŮf'\ZpUEXԽȲ9h5?ۯTn}ydVUd*I_#/Iy!RPe 
F&64uJ$dw<@Od5m3ddDbKv@i+8uUfպ3uzT#E~(bΌ4J" ?1aGfK^}Ahz%Y*"iހE=
`4'Fud$?ҫ5^fxiEq!7)Amg FЖ2ЈC=3.sQLD:OK˒eܡ	nO9!~OaZPvln.0!F^Q'3ruP{oSF9(0[6:Њ2(ČA(A]:՘1Hdy_ܣOnLA)R/#ϲǔ€k s3.`]V́2?VnCXŒwn)8(EЦ
IFX?UT$8!pI)oIY_,⫍̦%c9VKG4ӀpwH~i2~fpbm+})bY#}3eWhqH;w_=H乏qi}O)p4煣>ė~CO}EG$u4FLS:ߊG5֭ubR)
m}},F#	9A=W.ij20R"Hx0gN^wՉk5
BgyJts㶀V)mͲѲ@BAGXmT-/ZƜf;0GA:kx
k
;5(a
60M
K~?^`v&0ءblEHm~F"xẗ 
kH-5gfeȹ$sC#Ǯc?b6W
ўrJ^Klq}i%_y],uҤut:$uɴ")/~'o?-NFY^`#k*?.n K9{J|k~#?J"],NX7ʤG>q4T??E^mPߓWįbDd?vsZ$Zߐ(@-'~I]ɏ(P D
(Y˝ӏ}?O#(q[T-me*K3
zБoZI,\$Տz	dn$Zɰ|i^0t$/ɛC_@g8}
n
/M
JTb5
cP+,A9#H$`Ql!Ԏ(E%L@Ÿ@>fEG(TW-xb&DB_TImpV!-Ӊ᥇	BҌA
A^W|0fFeKwMDěWai>Rma~oKRdFӀ%vc{e\Lp"
=q=!ɇjD4ߐ4(Wp{(GnB)Wknz. K{ե"3ٓעT x,7dP\_!H
ijޕ$?J/ik߳vN2]l?X$H|~H"p"}Z!L~|2g|zl43Pgp{*7AЭF(%u2]6-ރu/ё)uj_i6ݹCz>nFt?rWފl?OA?2eO.Muo\s<
MBּP0-O6T=bF#O:!f@}
I-E"?\2&!?sM#V$$`VEI^i{w	$b0-?D9,s#ݹх|[e3s)6@]
o4/Hxp`PAh,XETU@	RZU_1/Gq
kU\Ka"*o1v
SOG{=x5,*3
nGA},[|wQg8ht|\ 9{2*^MQ葃^V۸Ʊw_Hu'{DB8݄IPlXSNy}>0	Rf
qc<_gWG~"QzJjp0#/)s	ۨtݣ8H ch:rmK)q>r: `i8'.HJ*Uҭ
H``hԳ=9]<"(iF
T{-1W~Vtt2͠sjku9$cR$.hWW4U4IJ㣶iqZkgQOWnj`06a\%HkhFbJ8~%Wnۊx]&
ϐ: "޴$JRR≦&
K;1Dq|J#5ߑ(ֱU
Lhfs->t_ҷLu6$R[R
D eaPB؇2q0cpon~o1c?FcWs_K|n?إYfrCؕ+LAhku'2?>|e+~u}iR5)FնS9&_`5s06 I|ҷMC\O̲͖2[C<Q|uz1V޸.iG	'KRf|4U	Ij3p^߯e^?	b&؉ߌd
Z=P&,#͊$xlV/lU&*Cl|l#OR
sH[
d	3P/uf#
3=;%Nz|Pϫ8ڜZMu#,yґ@)i+.-߲V7p{8󗈹-64э
ccתiؔ8{`=QwS(1Lm3'9B9I5))e,ɊՅ~?$[M4cemgsqRbH{s{
h[em1êM	65NnsNdWR{w?RlVS\|O+S0&Yg;7,^k]_!2gf/
R^s=chrǟ佸TSrCP%
܉G܎zr,?eg#_Wd)0?PX7@eUwU<@pRYab̛ϬxHtJ:;ݘ@҈Aa5/+qR^*~Y4 IHo5^N``E?j7jPgj#+BSyo|pnl'OkvD]p XuZ`DlyWF*R6j=/RwGP<*l͍SDc=MӝLR?%?CAĐH'Ҙ:޷d!n.Ywz&.=	uDf(2#8
zTܓ@r/NGɁpcL()%xP>fG)%쏑qf8YL4aQްjaHѪ?Rt>BMm2-x"4!4*E>E[4/Gcp,Rc?
etޟ&/YX3Ez+?|=Cx@Ť'fMi|qB]&=v<cFAAfG^ڏ9:ħuiPʊ98flW(W)L#	$3dk%?lwl	Y*K]1cXa=LMo඾˦"&"$8CA/ofԡFo2R+_mP'ʺ3m-"{߉;K,e˖4BiSWԳx,!|ްdER5Z>rs%Kqx@@-#Ahb8,[-lD.]
C亓N3rN5[pS4e	B㷛g|&ĄSiS(+\$Up#p8p83p8p83p8p83p8p83p8p83p8p83p8p83p8p83p8p83?pp88gpp88gpp88gpp88gpp88gpp88gpp88g0b!=YIENDB`freelan-2.0/packaging/osx/resources/conclusion.html.in000066400000000000000000000005431252300335000232000ustar00rootroot00000000000000
	
	
	
		

Installation complete !

Go and edit the configuration file at {configuration_file} to get started !

You may also check the official website for detailed configuration instructions.

freelan-2.0/packaging/osx/resources/license.html000066400000000000000000001107471252300335000220510ustar00rootroot00000000000000 GNU General Public License v3.0 - GNU Project - Free Software Foundation (FSF)

GNU GENERAL PUBLIC LICENSE

Version 3, 29 June 2007

Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

Preamble

The GNU General Public License is a free, copyleft license for software and other kinds of works.

The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.

To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.

For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.

Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.

Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.

The precise terms and conditions for copying, distribution and modification follow.

TERMS AND CONDITIONS

0. Definitions.

“This License” refers to version 3 of the GNU General Public License.

“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.

“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.

To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.

A “covered work” means either the unmodified Program or a work based on the Program.

To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.

To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.

An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.

1. Source Code.

The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.

A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.

The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.

The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.

The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.

The Corresponding Source for a work in source code form is that same work.

2. Basic Permissions.

All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.

You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.

Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.

3. Protecting Users' Legal Rights From Anti-Circumvention Law.

No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.

When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.

4. Conveying Verbatim Copies.

You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.

You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.

5. Conveying Modified Source Versions.

You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:

  • a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
  • b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.
  • c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
  • d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.

A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.

6. Conveying Non-Source Forms.

You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:

  • a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
  • b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
  • c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
  • d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
  • e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.

A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.

A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.

“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.

If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).

The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.

Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.

7. Additional Terms.

“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.

When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.

Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:

  • a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
  • b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
  • c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
  • d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
  • e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
  • f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.

All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.

If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.

Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.

8. Termination.

You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).

However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.

Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.

Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.

9. Acceptance Not Required for Having Copies.

You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.

10. Automatic Licensing of Downstream Recipients.

Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.

An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.

You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.

11. Patents.

A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”.

A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.

Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.

In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.

If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.

If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.

A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.

Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.

12. No Surrender of Others' Freedom.

If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.

13. Use with the GNU Affero General Public License.

Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.

14. Revised Versions of this License.

The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.

If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.

Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.

15. Disclaimer of Warranty.

THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

16. Limitation of Liability.

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

17. Interpretation of Sections 15 and 16.

If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.

END OF TERMS AND CONDITIONS

How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”.

You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>.

The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>.

freelan-2.0/packaging/osx/scripts/000077500000000000000000000000001252300335000172045ustar00rootroot00000000000000freelan-2.0/packaging/osx/scripts/postinstall000077500000000000000000000001311252300335000215010ustar00rootroot00000000000000#!/bin/sh set -e /bin/launchctl load "/Library/LaunchDaemons/org.freelan.freelan.plist" freelan-2.0/packaging/osx/scripts/preinstall000077500000000000000000000002371252300335000213110ustar00rootroot00000000000000#!/bin/sh set -e if /bin/launchctl list "org.freelan.freelan" &> /dev/null; then /bin/launchctl unload "/Library/LaunchDaemons/org.freelan.freelan.plist" fi freelan-2.0/packaging/osx/template.py000066400000000000000000000012671252300335000177100ustar00rootroot00000000000000"""A SCons builder for template files""" def template_emitter(target, source, env): env.Depends(target, env['TEMPLATE_DICT']) return (target, source) def template_action(target, source, env): _dict = env['TEMPLATE_DICT'].value template = source[0].get_contents() with open(target[0].abspath, 'w') as targf: targf.write( template.format(**_dict) ) def generate(env): env.Append(TEMPLATE_DICT=env.Value({})) import SCons.Builder template_builder = SCons.Builder.Builder( action=template_action, emitter=template_emitter, src_suffix='.in', ) env.Append(BUILDERS={'Template': template_builder}) freelan-2.0/packaging/osx/third-party/000077500000000000000000000000001252300335000177645ustar00rootroot00000000000000freelan-2.0/packaging/osx/third-party/tap.pkg000066400000000000000000000614611252300335000212630ustar00rootroot00000000000000xar! xKk@wW/Y+BBKoE,Hrp髗:]I!fg;3;?lmn}Uge10|aKTL. Uz+RiWL,)Ħ@H\#9|F%7&nzѤTBT7+5bhA:MԂ`51ZSKNL X!P\b0a6Aԁ0I+b1Lb>RZYE&S?_Fyr&b뺾ţ}wVr@a;вXd6,=72h-K&CT')7X` vUBPi$F Ph5Z*vm=EOO8}UR((dC+DJTҮ^ÊxDN8pÇ8us$ e^?/?qVv"G%!+i $ X$`w f eރ1\šf|HͥTb@Q|@@VuJ<\4Qd\ J(;H4C)fM3"h,#@Z(>̂fh6Awmd<)+86N'i E %{?iP6cIt8i0)>8(SLjAƺ6@x (H>"hW"($ӳs>Wχj01#2ZkM)3/\,ao(*l֬aK@ mf@8pϜ'UVL4\J9p[jRxJyrD7Bp&1t9> Jj50"(Hp74BZh91AY&SYÄg{_DPcǛ,?@)i&h 0ASGPjz $CBa4hi %HJ{/1>.-]yv=-E9練|@2A\A2"aI gID`brlW519m!5ߑ$ YP#[ -化c2zG)T~L..\">gY3@Q o"sCm(tI̧dD|f02G[wu( y|auѦ4jɯ] V;~"+=$a*3c@xQQ@bBhW.4JmǨ5?^E*X2lZBVV35]XLIWl3ԃhUf$sIU"(HGa3 |SE0t@!lbYڦKK аYҴ m@PEEEA,Ze+Pi*j*Yronn|W˹g̙3gΜn$JPcbcFa( !'5eJ{Q=}N^/S:qz2KeVqqj +(:@g?[~sM&5|C84\v|&1mjp+$//ZfQ v@֕8U1A8oOR-?@ZN;:'>`k2Eנ σyesyq;誓Rˇ3,51!nYtqSs㹶n}Hζ!nmhw{F R[ q @ѧTUB%u=t`1VcMug +=l)EiօE>GVcn˘4Gngc*lŷmv?ܴ51&0]%EN֎5`EE1:URK2ez Veb[@kJZ7A/ǔׯ v,sdVA5ea/6ZHZ&N;$j4V_Bl#KO[y2b 7|2 sPWs1cg!"Ynj5Ԉd˷[3Tm/C*bz«/ndNKʂ1S8ms$MLu'MQ.QR$JAHc?@%r8P-='BJ9H#f<2+evһrc.G$QAǑd-&j-JjʩeTfU^eL'hO\I؄K. ~B Ibiͧ{9QĈjRr c7Kt{R>.ޫX_|Krm|i`xG$!"/qbpRH,C֞`&c,+}$8ծ+ύIPk^5Vc5@ HI_W,p/![RɬEDLcEj#f0ZF1<&vҬX4!@ ,,;l}9Y)b^3]gOH"-V\AZ"ΘqH:8 `_B@TqfisW4^{Ys|=[.(]йԲ셎/<`aps0cȇY"+DO6 +VJmVJagt@ X'm5\Xum_n.}ުYBljoA`hY[\+4כ $ 0_^,֒.up_I4i}j `#Rˬe\KļJTַpv89 \Cj./6P5>Pq@ǵ6£Jb-N" $z!r`vRF-{z Rl'cUZEqjye2!c.;U yCOpΑ4*Q| z{6F*R EGH+EKo&&⽤i \23$*wnlux /$ Y9!dP ef1- ƩxLq !- M9jI~Bf7h0Ev3h`F^=sq&=LTܞl` ASw B&5TW!=zbPFn xw[mۼW p~?FL02 z~M~o73TxّHZYא3J+N6yh"*}T@(x*Dej&/}&Zs!ìPgy=Oťn>VC8w9W~ t82GycUk e0jQlve!rJ:] l س¦hgc+זKH𒭴qOT*Uud]g5՜IGy8tYFe,]٨v"݆jC#Qk& m%G30bszAXn/`B؍Z5cvdž7{d0iG~^hnFmFύxgˁe)1 j3Ag*m.TYBъ.}z^9/#M2pJ-;,Gjl/ iہ !wge91|V\b+pR /.ǥ㸎>qp E4q18.G;i[Y2;..{.gBzNS~zp>*:홫K5: ш=sxHu0G}#݈8V+*C!K7HvQ8]C F6LfK,B*_R~.u|#R#Y'@vSBgMG V,V,qiEd{fۢ>&F k#Hcb .i0#b q@`+CL;S2-~,Ԏ8BkK>?6ؑ!ΦVzvP7`ϮՑ)mRY%Wa)Z˯V;#r$ܿ&zۏvdg3=xHQȮB,%aWy |UBy Ynu$F&^avuWK_#h9/*?-)ƯXdlXmu@"Z+<cclO$jF#S!i$^ˬ%7Ԓdc 8ʿp( M|ر Ũ5e#ObSxt \jeHFX(!.{v˄c$K~ٗYȭnKHA-cL bbB>B?DwPf-lmbkʶ:[jsiM̺YQ6(D\ .*u(ϻrXҜX76cȯ&nwpG~+}['f.? tz$!t~+ #+nr<Ex{"/G4*[zG.=<TE U^N-vA9}^#%W;ǔVP-cAN$ıcXAFs,<=8_EȪȒAa%>8O/Բ˱+dإ8?Biy҃BeIX` ۉgaWT>1;\)j4ױ3E53o9tώ2:ޣ\#]/7 dK}-{W,&f&Eez 8kt?9-GXy_ov !EH19RWChn]q&~>)/殷Г1 n$ O0ٓ^l%fKÛceŁ$AGN8kG밚_OqqZ cR%vHh'mܚF` uK&&ZǗ=ՖibߛS~YGG>)|Գ|g膮Es3|76c k.*گ"{'TDRMtG9]ۃ{R4zQi$Osˈ[ZY[ ;X#lOg4 _{GO 9 'yL<&[ `[8ܓq;:0;5͝'uwu0'^ nna?ÚJ?$0lfy )#5qOiE38Wyƻ }FfzBڵ>hׅXqj8f>gC'l%p& )nM?sL<`ڗ8&bcv]o.^[(/.jNW e8DJ %ܔ8eLH02e(;z~ƿ>X+CRœ I˫7yy@}Ɍ Cn^[>_I.vy0nG6j*זyX`m\p͸X3'JLVcq+wrf~hoT*M&C`|) {W67Mw`_.>EBeH;~ۀ#oĈvʿOc8Ri7?j*)&M}3U/5!p+HOlGp"fEH+',J|'rg&]}$]Xp/8GOOkOt\J}--6)$ tMh-4MyQ핮-]-*Oe.gpmUDr䲸y{;lr 9i'%GdgݧJ ,|^\E%[Q$`*p*e*XQbWb1#%/E?n w Hs]m.eP@wٳa#DN7bQTfG1\}0_vkَ|v #* IʔB70*^ :h Gg9_gD'Y`S3"p$ΠOgڋ8Ufgil@U$g(e5)b34ė}$#9('e"삍K.42vY?[˭R|0tUDz41{`U&>unʃp doޜFqt?[%aC:1Y>)VL$t}p2 C`zfha$f^/w)~ *=+!4IT%zQnJB-s,%' ұwV z=_ yIDo`z߁lԤێZ8{{-ԐE}Dzf5舐,&Ŋ7zcSϏb<J`#Z0~l24΢ :£ј˨gEZA}l6anӜMsqU3o>RSr:ʏZkQ09J=ˬl=ˌ@f @=f:_S1`@%+@SK']ү36jEVE@GqP EG ]N"FT\yrh)f!=uM"CYb-*Kjf3Faٶ5Ym? 8B>ckMw8"R3h5v5JZ8BԦ֦q{n"αD2% âe꣢}S?`QPeTn[@mU;DAL&9὏U-}~֥?X_o% _.V-Yb,.PiđY U~^2kZYcV5lQȇ$1U\NwbdiV"V6狍Ҩ͚!b\ #*m&Kl֋F bۤWi̮90q,KV9`%;SzB18ۨ/[L&"`1vusޘ'6H8eP-f.We\07\*Kc(h⶛*+˨18cEH4hFZoame |IM59Z"V窌*5zBBYA 5z>5뙟# @*SNk2k9EY6 S9iTr4Bآ׫Fe2:&\i!+&Igjk $bhX̚"@JB`ԛj=QKJ_"bċ^ D$NMOKWJ'QJѯDQ#4u$kx%Ww&B1JAaOo/XG^7) ^ 2]e,79G`4 : %cQX29R+(lPL c->4q-S7S0'~ÐN3d#r"ũ~(81tiZ9?MC<0Kh9Ė=YB)2!'kGŧlk驦li4Ny`)~zg֕PYo A)qD7P<W"~\NR(;)^Iqe*obO4& oG<)ά)(ά[z~Ńgu'8Lϣ8>řug~8n' p+((Dcřu(ά8nv?ht,lb$x-w Aq1-& VjO~8>ԚOJqf9zb3PYgS{ӆ7]_8n:23SYGjﶴ<(řugօSY/A)g'QY^Dqf}uL~_vGo(>uT h~(xoP|5?@9bJ4s{z4œ)>tȥ8_MtY3oQGGqf řf)NDwa"1WgKgKS7@qf_eS- W$;7.37GA8h1 >Ds^Lo lt5 Z7_Mf " (}ۇ>#x/Wَx07œ)> 4"&=ş8wW@j~7x]ޡ+ދ>x4<| /gp5Ky<| ÿ?<tvŃxxWޗ$>g<ßx<|?x-ު+< iRXKa6P(VDM s 0"'XBZ PXIa 0Z5]V|FA0#?R=(=%|x3wfn`X"!0v~ `Jk`f  >#p(Ty ln-'iNxyo|0r')_(""ϴ#p`{?Ss%1?~j3_<,>H`K C/=x1О'w%p# Pѓu8/|?k|q0R(!1 "PCC.E`V2&sQ~S Ө} G`J| hx`@} LGK 71V@{CzL0_0| O=W>~\yuaoN CEM ~xm0?z7 =N@L?SxWnK~Nx`9?nb(x!/ p@CXTΈG疳4 C؄a*YD0DIf3~EFIIPu[x3thVGK';ܭrEcj nD{>-PW-˩rY oCN]8,KFi2fŰ<@Z]^AHb]H7 QQDShc\CYE0JgB`{ xb&#vOʥIjuB-NI')GOHI2y2%5ufM~吞c ])Pr-,}Q Bi|x5 N@FFwaGW?*w ϳH$rfGhmRħ:Y)& 4LB4CQz!!w c suF,䛵RtH"iHxZ]R@3{>#{eU*h* "J|d9+*K鳍Q`rJirS1^%A@AHZ"ZQ)@B#tV1ԢkrwKnQ87&_6-Z.{ܫR,1t9ʐޗXK2ahS" %QŬU0ϱ^YR| c4?~[hsdGDy`DTvr獖2Q6VNof/T5dg7b %Csq i$29n 4垓`)!X"^CS_q-%2uƫ5*nil0ZF1Qfӱcj΍-oEEK8,F=xFZTNkQC(E.rQQޣ =aP{gi0lB#r'tZ`1tl՘i8a&JXZ?2><:K\G)Қa9 MA%;gC ajkqc 5[ogB/`mrtabN;*s^ZAgk pΐh~TFL2AA u4ԭ9gE+PJIəGp9N\v #7xl߸:lcK vWe0CPp7UlLu"`1j FEu"ȕsx}BcY*-n@~覶Ї\dP&%ZX fi&.`+Lx\fYQ]2 8d. 83Atǔ̕_&$;_cb(Z> Ls; GT]hְ-̫ty7jUk5y3gbKp7j78TCsFDU0fH{03@K<2uJM:b.pcA˩`$"%>G@F9UuS/ >_^AFMԄWb(O_U }߃W_>## ^x § ||^@ZS' H|ҠD#כ"q?9aZzܔacgCּuu_ntP:0*bȯ?WݸA3/In%k3?ٜw"T 8㧪kw=icZ;}^"Tgڿr4>PtFubs?OHw6S?bh-8Nސ aJo?zk^p~鉵oy,)EMz0#rpS؊/U.Qe,9B#K|jo_l=m^CWOR'0䉷|OK)l ||3:dN(y!m:I154:"j l۱ 1¬^ }$bQ]$ovn^oI<ܵ]T$Z;kx*Y.SK2fxFqZׂS nm,r%".gP(-JoYy4:^fT@%o0bF?޾6駂mqϵnKWkh۩9vn;lxSapD߉~7dox{.ҵGwCzGO?3kUalꒈ^sm&'m+K_(;Unk, i=OQvciO=<_GuE*Ӗ#V/i5؁%K}7; ?g$q80Cc { Ͼݺ8Ef/, KnooϿP#$馢%)[:y4{}6|ǠC_D3tzH~g݌frrݕ{2jw9+oڶN(y&pƱCzQBɪ]cN^MspZXڻwng%UQ{sm?%v3˻?7nr"SG?oN.x1v\ݡ~UӺOe-̈ߔt9եaŧ6y̓oO˿Sz|zq]D9z_vtأJt6̦~}q3&#=f|9 :_K#^9tލvKO|{qsffUjԋ_z[Ǝx*^=/oXqҮ{tؾ6C{ta\ߔuM.ΘBv=ԋMxv+?rpzݳAIܘuʝG {\5lܺQ`~~,=/]#ワ|b|Dl;k,}WxwC?ݺNCjy o-#y[5bܗfw瘔ZIOx>d~10~I\"\ޏ.z1PĄ/eI8V_I~ߙ\?ENU$> q-dlhG@Dņޑrl@ʢ X+|sӜ bJpA6L}}%84,}(L2l̂iӆQm{fC~+_2(덣{Ffdw\'doۼ3׆w|ګ~aw aĻ#N;n~dzg]??~q{3n8L5_v=q eO;н'2Omykڛ:TQO?:[޽ح9u .c㞨St4e[]BEoJ5l7M~\h{^xx9{5yi3ЊphNv:i;Hڪ~襴[qJiօv}]gU+J6Î-l+_r{‰Kg3?|Zay'6e1c?Fڞ{޸82kȨ?Fwꍩ+m'/b#5߉j縣'QftEMyzVMZNcGyϐm_ >7YJ4D|QiT">1}5ȍXڮ JIn>jX%UGNт3 !!hA%)Q$=w|MM"7Tpzl^04{̌KGznOc=>㤧ov?o~M0̩57 {{`QBjmDh䁻 o7ņU'*oڬM,׷}yS4m|cw{:-߲{K>\pbת[|=d٪XʢwږS; 1s?]2;7?kϮ>O=w2ݲ Yevj+z~O$3?:3?`oVYydu_mla //K8m[? J!@һ.x$38ө#CP44D2HV1PKCfFׇF#߄4 hޡǎ|oSCK=*s8m/No^9wܥ~%ɟ9kW{cΕcv*=7jҪSuR]="}a>O yqoV3{.ou_|47g}ѱm_l¢׶о'c̷t=kZ_~#G|͗P+X?vVc$h8&;%<]9PLߜۣh]feUmSr'>R{*PѮO'~X4׶M+%>=N=WyQmc= yHT#5ڭ:x=~y{Զ/ZQ~ jOr7OlxruW]Vơ9 ca 7aomtb궩o46~֯Cj?mF/}}Ώi6G8cߓ?Nzn%sxjR*tqeu /|G]0n͡;u[}ַhf_lZңoͦkaEac&Ҟz=)Ь׎:?oo.N)Sޟg-xbʘl}NJꙟ%;=ӭhkm&Olva۱kG= ;ܤ n QK}F'3Gz $gIºJҝ&eW%t272ھi|o>L2;).' ~sw~|%rjS@%3} ŻTyX_sq5 }?n k^w_redT*:G{%dr'?qelӍk#ow|}KR%ʾڸL5U'vK ڿF4 C>|ɗߘ?6{Żc5w_ո_G *\to?°Aӊ&`m|}}`͝::q}?=3a׎W$>c$McbcF`8IDdvQe\)e~ iV"4E1zH}-Ɲ(!.&ƍ(ODI¡11-F$9 ШIXS보)cBG%'5c N+2GGFb:%UHOFʢS禪4f1C׏e e⽔5&E nt\ qqlvܫiэPv #) ssR*94WD D<]<#yDrlh ).?٪|,$.ŜpRюe4 0PzZurrowCmrU~ʤt>}g+<zJMn0i"R%)VFk4:}o,Ϻ Ksf}a,0!qv̩+#4B4lt%Q f\6[Wcz^T*&Ii >NJ笒֋3Ea'kGM`]胎 ,if,pTU7|g"x'JtɅuȳ ]v9H5t&Ԉ. uKLtο׽u]v7Z}χ|_/"E(4Otny^egO۴L[s`kM<_l6>{tؾ6C{ta\ߔuM.ΘBv=ԋMxv+?rpzݳAIܘuʝG {\5lܺQ`~~,=/]#ワ|b|Dl;k,}WxwC?ݺNCjy o-#y[5bܗfw瘔ZIOx>d~10~I\"\ޏ.z1PĄ/eI8V_I~ߙ\?ENU$> q-dlhG@Dņޑrl@ʢ X+|sӜ bJpA6L}}%84,}(L2l̂iӆQm{fC~+_2(덣{Ffdw\'doۼ3׆w|ګ~aw aĻ#N;n~dzg]??~q{3n8L5_v=q eO;н'2Omykڛ:TQO?:[޽ح9u .c㞨St4e[]BEoJ5l7M~\h{^xx9{5yi3ЊphNv:i;Hڪ~襴[qJiօv}]gU+J6Î-l+_r{‰Kg3?|Zay'6e1c?Fڞ{޸82kȨ?Fwꍩ+m'/b#5߉j縣'QftEMyzVMZNcGyϐm_ >7YJ4D|QiT">1}5ȍXڮ JIn>jX%UGNт3 !!hA%)Q$=w|MM"7Tpzl^04{̌KGznOc=>㤧ov?o~M0̩57 {{`QBjmDh䁻 o7ņU'*oڬM,׷}yS4m|cw{:-߲{K>\pbת[|=d٪XʢwږS; 1s?]2;7?kϮ>O=w2ݲ Yevj+z~O$3?:3?`oVYydu_mla //K8m[? J!@һ.x$38ө#CP44D2HV1PKCfFׇF#߄4 hޡǎ|oSCK=*s8m/No^9wܥ~%ɟ9kW{cΕcv*=7jҪSuR]="}a>O yqoV3{.ou_|47g}ѱm_l¢׶о'c̷t=kZ_~#G|͗P+X?vVc$h8&;%<]9PLߜۣh]feUmSr'>R{*PѮO'~X4׶M+%>=N=WyQmc= yHT#5ڭ:x=~y{Զ/ZQ~ jOr7OlxruW]Vơ9 ca 7aomtb궩o46~֯Cj?mF/}}Ώi6G8cߓ?Nzn%sxjR*tqeu /|G]0n͡;u[}ַhf_lZңoͦkaEac&Ҟz=)Ь׎:?oo.N)Sޟg-xbʘl}NJꙟ%;=ӭhkm&Olva۱kG= ;ܤ n QK}F'3Gz $gIºJҝ&eW%t272ھi|o>L2;).' ~sw~|%rjS@%3} ŻTyX_sq5 }?n k^w_redT*:G{%dr'?qelӍk#ow|}KR%ʾڸL5U'vK ڿF4 C>|ɗߘ?6{Żc5w_ո_G *\to?°Aӊ&`m|}}`͝::q}?=3a׎W$>c$McbcF`8IDdvQe\)e~ iV"4E1zH}-Ɲ(!.&ƍ(ODI¡1freelan-2.0/packaging/osx/third-party/tun.pkg000066400000000000000000000614541252300335000213070ustar00rootroot00000000000000xar! x]k0+B3RP\ؠHLc;NI'NIuP0H:zuΑtl]ܺ-j1h:qmQ-oW31.N7Du D.uE29b΄JK⢕37-JôuR؋ֶ;WI.8M э՝Zj٭2?LwBo6Tt]H&1# Q~c1>>ktpdg7@p &MȍaF<4ЍYᙣTWEe]Lw=d0W[gʶP!*ur\#4J ̱auyBV> ~-zN{a0  oaۺ&u`Balʲ.Cݡ`ma\Ug4Ž{SUpV03e= p-a_MSl=FE$g1Pc$64Ec+4yr)/oʎSQ ?3ֵG?af~q,Ql=]Pf^# ڳЂpˉLEJCh0BY*"KIpiFFwX,lX̍^ϕOG0ₒCΓd0%K%"hN-%\3_ P)s*13́OCb.7Ɖw`0L`>PRI xk p%p)-p hR=BZh91AY&SY`lzaJ֕tJʐ7 @s2 AѠɣFb4<2yF4 2b hɃSBi? 6m5hiF@L C@bh@4Aibj42h  @ DDi#@4@4@4+| Ąm(@iY+ku k !snIinC9uGyBC:-Ajhk~/i텍֜ު]홭4h:11? 6Թp~jƢqa\dh&8~Iρރ5ϸL΢^gAK64n@. @؅&\yU\ʢsTμ9SsUŗR-vB(bAC'gaKqgmu!B9 P.DPtT(*% @@\D8r%pÇ8pü̐/kH+k`gx-͍;i9M aXHi J +Ru)X&͌aJm6vi6Y.LNFa:_?kpq87 E Y@9t84\92/ ?oݙs hZMp=NQb.'1~b:a?qlmuU '뗖dLܾ>p oqjԮ+W`eKcuo^oW>8TOrҘ$jL㕩6gF,q8O!]1xu\Jh?#K<9NڇڕձcJ86}^Uқ9Ab6Z%++7@#1@Vꉲ@Kb1! 5W52 )ߊK•Yj_?i,'3fz:ǜZgId>ZfZhZQPfM懻n>rX7(bm_0}])6&Y58kf3QA ’_ R*%qe|ckD;Gl1#4 V X1roί|RLoJҙy= #gNhlkEI6〥D8]y?9LSЌĹ^=W ai=;i_ϵDT{‡Bn!V _Vl 4fm,y* *5p]ͩ۔:̕3}ћw!9劍ڑ׎5A/EIF"7^Rg/[}"ocoI=I0,^!e417Z\wU"-MH?,PGHo|9OcioX+j9*C~š/j2 w/ )@I/iY Z.7vTRc_?Z^W$1Rz1C)VJ.@&>@Rf/ȇZ'~8J<`$PMFL 2ZeNBR_.N)-4Ԣ,axܻt UdO'*=pA Jfbq_xbk$1U^P A@ӢӈEhNY|@f cX6>pV&h4ʄ8[ <0m/L 0Cn2[eT[ *@WN$\ .2ע2W'G{[͉QdVϺ$s|^iA($C 5  UhwlC`_9b|_KCseE0-γ0ڀFK}?)>5~&ZJ`J&xAu t!@)AAϑZaNd[]UEF 8xb| XtO_ e$=Knd왂Y{_͵cG+VAaCb5Ž `ZHwAS \#,@Wg<2!%"2/1Qc|t^u5a>(q,X&|F ݮx/ >-li=x$!h,s0p-bPX+Z{-i2&QRΥL?׀Qlon7<+^x$# Uc y([dEiq O1\oNq0zua Ǿ`շcZlg롽ԣ)zν%}D1k`kNt~ m TQ.hv '5:ەQTgI=K8 ;B\&Vj0Ih%2TSDq-3TEG7ͼU "-y5_̀SƉޗ]R 9p,a p[@YjmCj}V#mh%[(3N HUť+;Ȥt躠Tbq_2-F;AJƦɩn֡#Z` ,`g4T%<(1v54xǠ0\4MeBy <_ڹuFyt>Q>X-/0m.cP)abwlٿ1v )Lp$IrJ+#.\u(K;mG#pFN#!FrS+ + ~ny.bƐHʆ(,_ED`Ҕ)S`eAZK\`*X#q;ٲ*iW8ZMOS͵t0v@}wLQ@[TQCɫ8G.0 Bvm'N "TFHl1CEpm~IB]53>CF%=YTخwę-@:\_>QCCzA0P\-bOj٤:%M5/wGv?X@ETHv~Quum;yHgN!g^!aKn,TK@Gyѱ,q@$?r q-wSRcWQsAy%2x< rWR^-]6ܭcu0cKc]  ETp{C%cQ n=lMfb_#@vDi~gY'cbQiA \43W6(C<C\VK<&D`I ܯךQn` ti2S=Y 1ȡ3;p1t?6ќ?8~@bZ427:hvF!ÜԙhI9涘 Di6lL+25d@lWv8cz[+ߊW˛{dhfOX5بPZ^ehxUXcjղpRW]P3$>4h#EU)eiu}O6N&i-?@b]U #ݸBJ}\n@x!u4/c/Lq(?Q*zxٓW6uݺpQs0p}5wS»C'V9nereѝ 72Gb7z%#50#IBB:tz^fxȜ`Nwzh2elNB$S% mn!#y%p52_īC*^.bugűˡ--0B"ejeu^ j+'J|8 w`b^ w|'|[8W,߼/–ϕ/\.ͩ7K[B^MvpDS?ENaMk+L .>ëp,!Vc=,:ѱ dJ2e(\Ao6@E{QxDt.Yć^D~nпG~˛5!=^f}=rȏLZ(gAt 85 dzB"Sg@غlIvť,⳶Ϗ&^$aSS*nUj,Jcv8LRIq,4,Nk/h1;t)4cYR.$G|⦚Ǻ.yS,NSN "TLeYֵ}cKƺ4H m{ 6HYL:ݥywe^߂W,h@..3ޣ[(XF'2dwc#x;/y~yNJL(t,$v?{&!vp4^ql[B `{vAmfNh@c_ Z!x Y<౫F"1v,h0/5:t%1-1z#}(%Wl2Våi}v? `/<B;D{k|G1$C]or,(7a?"ﵖ`n.:qGS>j ۂp3%6>ϯ??g7o&'Q&x^APbI6U.А:Sky!H?##f05}a ڹ=P`=7#Zo?0TUnV\bv{!QUk_=ILP@gvY0cM?=o`s7",U$bi|#4M7^ᑇJ0//5 S_-!\<?9n &t9 ݩuuDb{OSS~l-R`G\~`c\w"oaoi9!v;\f3ð??o0pu7gbGCJ힔^CU}K.FSU/y\9ޝ(gpVAs{Ru?#ũq|rΆNxIKvQiȆ:khc@_Kuȷ_I<}$PK/ts_a]Ў8cLd2RG3Rdd{@nXwMg:[=teNK)?g.$Y,>dVRjg^w06Q \%.GSg v`5XG CP):|tdR=XOƗyH^){j|gh-{࡭Fo Y8E ~QO˷|{4-3dk2̷m&ۿ sʭ j3|/2yWyoH?xQ5paRG]ddZҡR:jH"Mgt{ )Pb_4/6v~ɛW/Z z'{mwXat$0BgQ68bEzXPu'2Z?r+TüAmWב;mS]hxK Ex#n\^BsxMST5TD)Xj@.|.FlDžkԫwPtN0>(V_䕯 |ٳzsY|7WWʙ|_~*(ezVVfWe;oǩS)x;Rrn'p=c,h>{1wVlwo!S!<NuCVqMb/A5loA֓tfo,ހ>L>SxXG 6W䵹3xGUIm1Tz~swSGO䝴 k>-<1Okז2b%E!t)m*=ds5vQSS.7IⴙWUEv!- zwraOVU s^!*޵ ¬KcJ?2Nx\bH\ 0ܑuM32ZF~mwJVX4q)gg=; SYV<˜UvG MT<%^tc݇:K۔_9~թ Psk$eYzFSTdךC9$>jo7[2_$]s šp߄pѕ6Bޮz.Z [P't0i%f|#kE10ĘŻQJm[^ާԕmsjE| Yjĭo--ƛ@$ pJTД%KU`BVKЪ]YG,Z 0lCp ō}IȏV0EhJ5np|"+$a7\C=-Cc #h-J(%jޠgxYO^ZIGȯ. W}nQ#m0?D݉e*ಢq%:Qv7ܡr:_sI}ttVbCƸ⚬ M}អ~+SSE|ʓ'jGNPĤZB=*}xgo\4,.)-7z+(bW*fƖ0 J+}q`MǍ?RwlUe͸Dh+@B" ulaQ/#pQC|a:ؒA;a1s}}UK8*bV*{H6!V"uB_ ncjEb`45/M}E]юuuÒ>g <F. M}?]OYOkF_~v*kt^35/ċ(8+r1GWk \YP N(d99̠.C&W34:>$wQ`ɳ:D*uf*ܐ)FyXJ)7(gT9JߠuJȶ^#Vki> RIWDlcF.5|l~N7:tǕTj5`W4z lFPV5F,%ӃZ7,L9V3MPz=v*JdzsZhJ5?PR\+AF=7:eJZ˳d:>R&UyV0.YVjt !·Wߩ?J*>Ge+q`LN @::SI8Q3  RFJϟm/jg뛚1S1jDF2QL<ZƠkZBU`>6q)ٵ Li MTF`ѼdhjR !4HK#( ~BK9}:-yhvtZ=K>/L`J=1"7iH tvٿJBWz~ea/VoyoZ l P$"~"&`(%c(7Ma~1l яRg !>O?aX6+K>_F 8/9X7))5DH_/_NF&fS?G95J+,'p3e!b #PK`:EF( 0@?})\FpfNJXI`n&5h%@?9@/9>aV%j+ R , 0@-Y8@)EF(ʑ~M!PJ@XL`yj \p%5x#_א@sH| e=0>ϡ#R >Bo8Xd=8LplDpY?nSx:[xDpB:R &O'uK |k[b|Fs^Ap9~#qbXVa5, gn6,< Xx4 '\^KYx ϰXd,px}a D NJ19 A_d ςVwOp0\8Ô {r8v8ؿ*\,C DoYх h =ƍp_t7hSz)h g`8 }w {by >=="_` [ _Nx5;;b+<g0.O X8 a#0oH уǀyX~x E?; 0 x s< (m՝1$e İ> н/1acC0$pK b8cX4CT WX pГ<F` OO?~ѱ^]p^ c0\C_0?Co>}@K bx'ګvaG/ O /#A?z Xa:]Ta=VVkA>mbApab:+7 S0M@~zt v`~Gaƭ_MUا?| g?F!\7crl4=A~{>rt/z`8cx=14~~ðJ!6- ޷V(͙112Ao&(=yHxUnK UI+(|!5 MkT\aCP\9R`f=Cr^@|0?SfP:&^XSPiJ $-W0( hJb;ցbPHdjYR@eJJN)3RJC:elnKdSEڑ59 д&̗iԆPbrU鑴AShYm:j6LĤI r3uir`QBJ2(9 ij7SŖMg |5֋p˨d9Jh9L:R:I7Ǿ 9RHM.dMq\BfzB+ZFD12fiȜvJH)i29ha*BkSRqRP̡ : 5kJhڝ ˳\cA%//u{PGzE(Kv9*r:#ҜUJeI*xL'JfTiT.?Hj+sr`S:C4 3M iN(M_@f J$`3zK03B4 \yƲc^tb^ltlK;C*^#IXRs1;N(]XGb b N8u)ЄeJ]>ל:/t/ 䀹?B%JKCUHm44JZGkHMWk#+L"NKlj*T ~>g*E\Ar&\qMj(\uI S6o x\G)6ATc n9|b'yMD9kԖ8B4ztsTjvfT&C`g6VX<%.;QTjR ]s:u>fH`y,M,?T{ى=OfD9&/O-پt:E[J(;V[C)J#&NsI'HYKIuF-r=.s_(gae0)P30M}"zL>13YIfZ:8m@}:IvLaz6)m,IR"OW"sHҴF2mJg0@A@^ԁ.-SjO1@e+a< AThM$o40%FL~4XR2Ls ȑeiHf2T4ҳH##F=evճY;ԪL0iY9 ` /#0Db"ޖb .4e<ǨWͳ%#;i)rѴ+OC#~F\Џg2F( ) zAFO<VT JopHTTN *H4-0]a { գej k }A&lPAun\V`#A<uЁFt hȂrW8:6hal3 cDfMM Ԫ鵟-1@fcN>]sW+e_nm.zlu7L?˃Vʵ=<% OmCKcR߸_9cV/hw[0aXڻp|y%cz zzkIͪ{O_ޢ}_viw\՗G7mѳ Z9b.ӿw-A#vnIiRvіOsP~aVz% d |u yw*c#5)=`d͓#*-4%%(8,ݳ[a;Axjs$y02e,A0$OGЫ̿YvpH\,#,$AkHσ-^&d>w7 C?z#jmݽwxԊ-K yvߐҘ9 7^9z J;{o]U.y]|;6UޔVnqv>oˎ]߯Ψ2CvhCzfK6yv=G]y^?o:Rw}ޘSa IۆVZy'ᯱ=,\U{R>ϯn{w-ѵpD{k)_N:4cxkF R\%K5'o~k1|+Xl#\7:0t)72&$?&v~v띭دqךV˯; iv7}k[C=|kŋz&gKWǛf]ZrW)7FKJ}c,yWHK D汦Ss qw@Rё+<O@Gq;AL=e!AM`Ŵm2G%S˕|,/Fɟ/S/03'=lzL.Wj L(|(5؛2\P@CVUP Av i5LiZ]1E1A[}0kj"5#䠼o~_ޙwz`EK;2ΧkE:UiڽwkoV-^!Q^cvu1K-g}アٍLNImz|c5dsޗoFO~Go~N6_\qϹxnݫ̓[Лw"hҍyܥ<"-M M=ov@uգ :I?[~+OjZ4*7K<&1_4]݄ &h(Aw]~-k~ ۊ b1ߑv|c mSL<6U{FG Wv/8J̆|k^;xTsYܷjGFbԆ!?Ipƴ V%?^jw[T>hqzuÄb_:ίX,yӲG ]O< vW@euzaWЙk.&XdՃw.wx^ם ^揤m!~eO)^wuG|֞p5e "b~Kn~+:\YmXǥF'"p`P7q]4ra *_T ;R[;D%6I~cgCz\K( <𥪧 }*`E{ʰV2JNsj5/@S{xSlLΓKCؖJt_.;vv͔]mom^~~\?W،[Kv}x#t;ܽM1Ϯ o>>mlș Gv}t'ֶ>js3㾘>/f|'ۻۣݷ ]_wCg,yeI~Ňk^c~\;1[s:^Egh^~Ջ;e_ 93 ?M^8Gb}{NjKڞ,i{ lI!f,qL`z1kLؒOtxyn #"&eueȦK{sO-i&6'C]ioot>=˝:W_MpM\G<;~\e ֹٜ{nk*V}sِh5N@.s>9Ժ[ov=_I_O[ϖ|Z ~?a1v6ea亗Mw* c@3wO?ֽ}vUך[ɉ8=oʓ5 WݼGrJ5ym}̹7CwlO p07`H\^,xU(@UNT+gjc>F0R) (ح( ]1wm|MPe06 9_;_ oID3:wOjĥU8NM2=]I~qn?$>N 3KKyo5ᘭlCK+)Y3*fo˾ʉҭgm{MjQ3W;\ꍽ%>g9ۛF;Ϯ[6{oS!Uu#ndn8q+);g޽s։sܳ6m|WVѠE3CiًX^rPr>@Bg7DkҚXÿ3KQE}rKw jlM-: dݜd+CCe}z/ p2Pr{9[ŷY5oucFس`wnO"=·_{X:iLi_iMx׮ ?:mb|h~qzηEX%Ç6-S}z\vk]zTΧ7wdWZ|%_>^>s~}WzQQ_Z~s_}pFyNE!6i]FRgzwWVmUv8sl=^eo/ry wG~D+;Jf,y=n%-VsA`~d6|ߋ "`8<Gm?L3NPF̸'/^^D/ sV]g2vCxymMLԏ(m-Nʝ?Ů<1JxwDݏ~=wV=^g'5$8еu^q]_޸FӢgV$]]ط~T/H[isMЗ~Whb;|鿊<.i[RvqV:c;ܒ&7 AquEƾkDkT ~oN7`•CyޥUVs+wUO-uu c{g_rp{V\3g7&>qoW.v'uߚy3rZust]{p NM%kgʾՖ=~ y{fW%{~35G({oqJQ5-sр֓/4ugî^dĹG?q&u}Vo={a][> 5UnW2u[cSK___wI/ca]od$L+]1  ߌJcQw:j` sJME&{G>Goy\Bt`ۣasWx^-$0|T|gpO֫nZֿ&ͨms;~6'htS3 6jgȒ]6f/^)zzG^v;7:f}\!兑)OvqTU-ъ0cC)7btLֿ<-5=Gw>:'>Y?Ͻ<Wr7wj{{Tzٺ+m?.AQ}?A>\!`BI~hxDdTD0< dlGmB҇le!$A6@Q(aEf0ꔎq PaQ!k:R:,/7;`A_k*ufl@A⼇'M8U*kC4uxrR? ($ĉ|ir҄|PGHxL?i C:5,H "4kc*TrCwq~h|)0'.+y. ΚEK#"h1Ԡ3*Ci00F YϨ SW2 |RG|hzbAFND%K*fG;ڥmu.~ń)_ Xt``f'NH`Vل69T#{NȒ F4ǘ0HH&(u_(sп"*57ɕ^:A1@^MdIRQ*"[s$I?M#΄sf*^DS_Η3}V́.2wRP*4T&.L 7*lUc-/'Ib1eF<+QnwAd-rFX|>MVR% :nc7eڡ!$V x]m5t:yfR@oI:2-#Y0BlV*9yJ&?=4x:ސQKꕺ1`t"#q|wC;md2U~dxnl|*Mn0i?ú,"ED0*ؑMPiuE ļy0ɉ救1N,tQ K #Nт\(%7ite#< x|,]#|P ilue+!ih /] 'PҀFԼ!cywҥ֫GakoΖ@(?[/ \g.@u?&;UPS.<⽵Д{D_8N*hB+E-:KnsZn$:/z^^nSq/؏dmSL<6U{FG Wv/8J̆|k^;xTsYܷjGFbԆ!?Ipƴ V%?^jw[T>hqzuÄb_:ίX,yӲG ]O< vW@euzaWЙk.&XdՃw.wx^ם ^揤m!~eO)^wuG|֞p5e "b~Kn~+:\YmXǥF'"p`P7q]4ra *_T ;R[;D%6I~cgCz\K( <𥪧 }*`E{ʰV2JNsj5/@S{xSlLΓKCؖJt_.;vv͔]mom^~~\?W،[Kv}x#t;ܽM1Ϯ o>>mlș Gv}t'ֶ>js3㾘>/f|'ۻۣݷ ]_wCg,yeI~Ňk^c~\;1[s:^Egh^~Ջ;e_ 93 ?M^8Gb}{NjKڞ,i{ lI!f,qL`z1kLؒOtxyn #"&eueȦK{sO-i&6'C]ioot>=˝:W_MpM\G<;~\e ֹٜ{nk*V}sِh5N@.s>9Ժ[ov=_I_O[ϖ|Z ~?a1v6ea亗Mw* c@3wO?ֽ}vUך[ɉ8=oʓ5 WݼGrJ5ym}̹7CwlO p07`H\^,xU(@UNT+gjc>F0R) (ح( ]1wm|MPe06 9_;_ oID3:wOjĥU8NM2=]I~qn?$>N 3KKyo5ᘭlCK+)Y3*fo˾ʉҭgm{MjQ3W;\ꍽ%>g9ۛF;Ϯ[6{oS!Uu#ndn8q+);g޽s։sܳ6m|WVѠE3CiًX^rPr>@Bg7DkҚXÿ3KQE}rKw jlM-: dݜd+CCe}z/ p2Pr{9[ŷY5oucFس`wnO"=·_{X:iLi_iMx׮ ?:mb|h~qzηEX%Ç6-S}z\vk]zTΧ7wdWZ|%_>^>s~}WzQQ_Z~s_}pFyNE!6i]FRgzwWVmUv8sl=^eo/ry wG~D+;Jf,y=n%-VsA`~d6|ߋ "`8<Gm?L3NPF̸'/^^D/ sV]g2vCxymMLԏ(m-Nʝ?Ů<1JxwDݏ~=wV=^g'5$8еu^q]_޸FӢgV$]]ط~T/H[isMЗ~Whb;|鿊<.i[RvqV:c;ܒ&7 AquEƾkDkT ~oN7`•CyޥUVs+wUO-uu c{g_rp{V\3g7&>qoW.v'uߚy3rZust]{p NM%kgʾՖ=~ y{fW%{~35G({oqJQ5-sр֓/4ugî^dĹG?q&u}Vo={a][> 5UnW2u[cSK___wI/ca]od$L+]1  ߌJcQw:j` sJME&{G>Goy\Bt`ۣasWx^-$0|T|gpO֫nZֿ&ͨms;~6'htS3 6jgȒ]6f/^)zzG^v;7:f}\!兑)OvqTU-ъ0cC)7btLֿ<-5=Gw>:'>Y?Ͻ<Wr7wj{{Tzٺ+m?.AQ}?A>\!`BI~hxDdTD0< dlGmB҇le!$A6@Q(aEf0ꔎq PaQ!k:R:,/7;`A_k*ufl@A⼇'M8U*kC4uxrR? ($ĉ|ir҄|PGfreelan-2.0/packaging/osx/third-party/tuntap_20150118.pkg000066400000000000000000001724521252300335000227760ustar00rootroot00000000000000xar!XxڔWٲ}u#x39)6lcg _d)7ܒ[ZᅬEGuTOį cRƟ?Y&_&_U:[6)/$NP/$(7|YoM{ˣϟO|z̼WS_wS$w9x>t<$.Kʷw9zCQ6? 0cq7ZpD&2~ MGuo/(r;MCnA EʝҮRݕ}Ud[nx@X,mr:y&9+Z+=\}~sA.c@l=dO']\}gӉ,GydqdT!KǃVwTIYEsUڶa:Ρ`TS0j),{n_e) ;0KUa1C'V5-wV\w&XX!PU5ca7a%RPj댍w"Kqqjl}: ՞P;6N/y8JeCSO7Xkc6Q+9 2xˠtt94Ձ]OYRW' OV~r9'[4lEP`qoUѠ\v #,k` ]+bB:5ɫ}!Y1]Ȯ~'od?؍K2ח7)uv|RL s!'l&Č:^TrHDžΪSN'f+OZ^| qf΅זZA»!.n1ݓggfec>1U܉H`YF6adwՃbq,$ЍS0q\Ø7<ꖠ3~Rmzw J !?J~ӣ,xHGʈ2-.EE[Ay*K?\{jU0<,NTaxN!=ڪ“-UvJ#Ecq2`tXTEaPiT[-"cx&8?: Th7]Uk`CHyrGX!j%ۑ ="|p,FP(3%J{8[RQR) K )+F |c. Ԕ)C H[0 H*hG!٦?Fj:PO7kOCv*X<ƼXW,,Nk1z~Cj-*.dWwHϠB޷'jYI1v~յvݶڞ^b;k8x;BXV>rdnf;jc8qf10{1䧓){bWzyaF-K+g]monԁR:[4ǭmqcMzv.Jk MSv:}6!ͪ96ܓQ}jӉ x/λA_pl f-]s?enTBxej@~/WRi%Y4n_*;>%UEoTSt*;D۝{[R ?hsDn"t> 78 U80&{{j75B2q!&㟶ȧi0i{1]oٚw \]T9wk@4b隗YXmK^[\g͈UaĐv3DKCVHܝ)|a8SrQe+4wn'(M OU鄗X4ÙuI@[px3Z7fdhة*Q߅t@)g[>g|[po%rc:̊mh$D&Վ,X }a{1_"16ڥY$.o墕3QJ_ w~ V 72Sl?Z*XO ~%BA^ x ~>A:$=L+23+)D8ʺM4,P4.`(<򄧓Wn΃eAlUu:Cz{0x/z.W_^j:y<φHR"j:l@Ws&! AR#nHF$d0Hwh3 l 3yLOv'ݝNJYjP9?[1 OUQl uI-8t6a]Izz%%0tQ ~se@{9#YZX]$ 7jWcW-jo}9OƁql/puY woܟQ=Fawzar| oG/;AVIns"mt+#Bj?ch+Vh+V致@V9x}P%4@# ;uV'H,Uq79XB7r,m<출DHZ+?e}KljQ S;pA&`Wl@ 21{JMjuJח#Jj*c/J$NfϚ"$: XA B,:Zz)14_VV7cF UQF 3KmcSPyw h " +[qg\kg 59~Šz~W?S]eǿ`D_>_Nr򗓿/'9_?Mn0dߒ? V " Q[d9hzRh+(`&a6r/7r/7r/7r/7r/W˅c!.mK2 J~ٿ"_d6/+-$K*?Wًa}}mS><9CI)UC%N˜]] )%ATvVB3A0=>nx6(yoclYqk©A0>Z 3TrT(FqʗyC۾M]6]z;c|4/4 e2<L8TA$V9HwUs~uW8PAҚ UaQaOGs]0ͷzNtU;Z撗Xt:ݮNV K.t+\ b 22o3ffaL̗nMᯀ*8qUUSWj)'WK@25 ,'b` IpƒŤq==p=l92RYY]^k|9s@C6m7v5?Me 9E7@=ض 14QOIf8>hQGQC8`(qr'A1˷PL<"1C4>h{bVD\'6?j#1%wVX|ث~OYq¾~fxBw#Ajܑ&OKj4{Vcr4P{b\I#W "_qяz*5*V5&H"'P!c3⮟/%/yA~yt_sš~^R-6Lp q[`lϓ2?>h4A?Mk=>sA3%qJ_\~]7 (ٱXL쒔jTM\ChR:ZZS[MKrj CPsEw J|i{;Ii̚foyJN43'e_6T";[ENr&mi @%^tCnM@PN0 7qc[{8 aoOV誅RA%v18/Ʋb} phUT *T'ʉmb̢SB!Eǔ~*[&Y 1!]лb_ EVWڅ.<׮{zoksq餫00 e_lqt3yG%z R13fFf(*6xP5NIC(]R8 E\ߡURKf)u33B@K~iI~X(|s^ -,dP4=}U \$MC/mؽ:{H(κǯk|֣dQ37Ԕ/=@JHʆA>6Rh6~Lꎡ^vbV0Wq} `XHTHLebsiAB7l=@{G7J>7u"9z1lQzkᯓo5t嵵+;x@KJJOdS-MxvumG V)甝5 ʹ`)xEii`k_#:"1O4YBx.3E EoZ[: 2m6lp&D{H X#ş9~]2_R@꾬d[jDl>İ&{^j=GX1? v(mNi&NVtKfxLY00UW|-,T0U00U#0+iGv k.@GM^0.U'0%0#!http://crl.apple.com/root.crl0U0 *Hcd0  *H  B9tkƤ7* D,Ya2Կ;P9jDt[pKl#q-_œpe- xXI (3zvOߨJ Vg/>ă:wmt.#Qo`H»ZFE~' "rorPu=%]6H9;ꐀ.`x S>O2VMxଚBzFXV,*E K4aUD'sNp000  *H 0b1 0 UUS10U  Apple Inc.1&0$U Apple Certification Authority10U Apple Root CA0 060425214036Z 350209214036Z0b1 0 UUS10U  Apple Inc.1&0$U Apple Certification Authority10U Apple Root CA0"0  *H 0 䑩 GP^y-6WLUKl"0>P Af$kУ*z G[73Mir]_%UM] d5#KYPXPg ˬ, op?0C=+I(ε^=: !.t< bqGSU/ApLE~LkPAtb A30XZ2hesg^eIv3ew-z0v0U0U00U+iGv k.@GM^0U#0+iGv k.@GM^0U 00 *Hcd00*+https://www.apple.com/appleca/0+0Reliance on this certificate by any party assumes acceptance of the then applicable standard terms and conditions of use, certificate policy and certification practice statements.0  *H \6L-x팛wvw0O=G7@,ԱؾsdyO4آ>xk}9S 8ıO k+Y |@Vtӷ#;Go$ѷpE'mx~"5%kԢ$#s`[ /DH`8=&g 3j /Sj[dc3w:,V!ںsO6U٧2Bq~RB$*M^cKP 7uu!0w0_Kϓjף0  *H  0y1-0+U $Developer ID Certification Authority1&0$U Apple Certification Authority10U Apple Inc.1 0 UUS0 141101201600Z 191102201600Z010 &,d KS8XL6T9FZ1=0;U 4Developer ID Installer: Mattias Nissler (KS8XL6T9FZ)10U KS8XL6T9FZ10U Mattias Nissler1 0 UDE0"0  *H 0 ^IB\2>P_Ffi/zd+SxTJ:4U,u4l0y`OP/ HĈZ2R_kfq+Қlx]+8)4c<Âo+$f}¹x>N,ձ^چArbsqCdtC&FDv4ނ R,d8yW1R93Ԏwl2AH 00>+2000.+0"http://ocsp.apple.com/ocsp-devid020U=魞v\Gt_CPH0 U00U#0W|-,T0U 00 *Hcd00(+http://www.apple.com/appleca0+0 Reliance on this certificate by any party assumes acceptance of the then applicable standard terms and conditions of use, certificate policy and certification practice statements.0U0U% 0  *Hcd 0 *Hcd0  *H  LX >,&߬Ku/#: :q[+1 OdGN*/0}/ls+gكFĤkE#eW>'htfFnB%&.e9U5*KW_cobl^w^˄`PHm ٢fq*Z [o,gDt]k_BEў]7(hO=9{L2i0Ã0s#,JS9&to1q0m00y1-0+U $Developer ID Certification Authority1&0$U Apple Certification Authority10U Apple Inc.1 0 UUSKϓjף0 +0  *H N*9T[]x@#NwD:yl Mxd$ ?ITFQ)'PNgxr 0@VvK ܆S9C=*L&m-`;bX%$du^Q+>v(6Ut~dѳluvϷKH D@Ps鑸7mRWA|ډLtV *Zjpɡ6iyf/~1 dtN?kxjQb{00Uv#d$*Yu3<١0 U00U#04%N78X&)0U 00 *Hcd00(+http://www.apple.com/appleca0+0 Reliance on this certificate by any party assumes acceptance of the then applicable standard terms and conditions of use, certificate policy and certification practice statements.03U,0*0(&$"http://crl.apple.com/timestamp.crl0U0U% 0 +0  *H  -& jW4#3*ai> Hw}t 6iZKl fݚ$Y0"L@rҵb$`~Fb?RU5EJ(|̇34:k[D5 sbDO YдN|Zi>F4tnn.@ q^z<<,&F t} @[Ela(]e&7kTkۏu w[ai00}LWc0  *H  0b1 0 UUS10U  Apple Inc.1&0$U Apple Certification Authority10U Apple Root CA0 120405120244Z 270405120244Z0|100.U 'Apple Timestamp Certification Authority1&0$U Apple Certification Authority10U Apple Inc.1 0 UUS0"0  *H 0 wg\.#g>B } s@/P'4p <No97ڞecIm] 9 :JidF5ea. =o%L x"!{[ѣ~I; r3,JZr 9Pt(ny_~VVlĮ (tM&By^`EXQI^JMs{Rˣ]klt-D>a>E~4u&@u0Kw00U4%N78X&)0U00U#0+iGv k.@GM^0.U'0%0#!http://crl.apple.com/root.crl0U0 *Hcd 0  *H  6qS#xe[#Ǣϴ(p!93rC=BQu]ˌjj:T}k>mzT_Cv\ N<>r4\g e0B4ӧBsu|QC`ܮ'kg3EoɘMiKEN"W""En?厸F\ɰ:m7(FeoUhR>?&:k22H;Kу000  *H 0b1 0 UUS10U  Apple Inc.1&0$U Apple Certification Authority10U Apple Root CA0 060425214036Z 350209214036Z0b1 0 UUS10U  Apple Inc.1&0$U Apple Certification Authority10U Apple Root CA0"0  *H 0 䑩 GP^y-6WLUKl"0>P Af$kУ*z G[73Mir]_%UM] d5#KYPXPg ˬ, op?0C=+I(ε^=: !.t< bqGSU/ApLE~LkPAtb A30XZ2hesg^eIv3ew-z0v0U0U00U+iGv k.@GM^0U#0+iGv k.@GM^0U 00 *Hcd00*+https://www.apple.com/appleca/0+0Reliance on this certificate by any party assumes acceptance of the then applicable standard terms and conditions of use, certificate policy and certification practice statements.0  *H \6L-x팛wvw0O=G7@,ԱؾsdyO4آ>xk}9S 8ıO k+Y |@Vtӷ#;Go$ѷpE'mx~"5%kԢ$#s`[ /DH`8=&g 3j /Sj[dc3w:,V!ںsO6U٧2Bq~RB$*M^cKP 7uu!1?0;00|100.U 'Apple Timestamp Certification Authority1&0$U Apple Certification Authority10U Apple Inc.1 0 UUSR!=c0 +0 *H  1  *H  0 *H  1 150118155103Z0# *H  1dHk6VT4N0+ *H   10006 )!,A+$nf0  *H w1c7[΁N3ױ4km^ޖi^NʛՄSJIb}M%맦c2{8=H=!S< Fbݜi-}JpVa5egisy17Pߜ=W(wLr]Me8<\Jjr|Z|pdlki쎮f7VWԀF\9w+U S P*BokH)*8ZROgBZh91AY&SY ]_DPXlOP96Q;pA4Ɍ@M ebhDB =MҟOH=Lis$4 SѩM#& 4`L]e~֥NHeAEluu*vֽ9샙]'-J0b\UWfcn{:GaMÜGn 3lqf DCEE٥pwh{DcUjA,P,i.^{ !Kn*JPu7 pnɈ(S&FWs0xl zh /Pg"U"!<( %"0ݖȬ=A⮔Zc0X2mMxZg $s1"K9LE /AA.rױk,3fL9mY^C{Ag]`7wK0Af^Fg0B#ĠƆlL.۲ãAh2bhyllTC|NXn_X78z)t1"=d>@tR5 `P:y0`NSȰVq԰V_9Q NTX\.! [$00lLdJQbdaR[/r2^sO_ z X4On97 1 L&gDX%#q(kFPEYk~p Q܅Pi`gaqI941.p Ai>BZh91AY&SY0x62_0@P 4&C*zT~TE 6Q@gzA(&Fjhi4 44zS4$=F4hiɂ0#M1L$HF(1=LJNDr+P&͓ǧ S5NaE_$V9𣏕xpJv;?^*}SxA ْӮB75PVəB"ǺkCC#vib2E+eQs6Wi_|Tur{{{f|'U8_>h 'rҭz[%5 lzNU[7D)_=0OD]':o_Es fm&\~!}FP-㕎1Rt1p*LoyT>'4Trm/DAIb/`N>3AX:YBcmO՟(wVɨnD:oĂ3*nAQ.1C$ @U'7 'x ѥn8 DΡR`·-/YHm$KOךa8l7IZ^q=K6,{+v"@KMpQ}>HW?zDQC˻2EB;m5#wF{CTU[]M&`m&D)= sQ92J~soVhh;{'ӵ~&;VdF 2.4fu$ hsA@kn25G_x]DoYk9GĬOl^5lNh&g<` R 2lJ0c"\Nz`rKŷuA Ғ!8Y{Np,Ʋ8[$0n[n~r3Q8(hHUf#j@K5C)c VR]-Th64:@a]Sw]BAg+BZh91AY&SY(e2!~=RuzƑMFQ=G=COIQz  = @i=Gdё4ڀѠ4CѲHd2eUTA ItZme]KL/T2jR\X^lfX s&w!p79cѱJ' d~ j2K-gu3L(GKTk:p*|_krAH~QBe JWfoNI ûANN`RPS F^;xZSSˠ6 PB}73_"P!WyB,5aaQѿg"TAcqcǏJ/.%QW?cZ8n\XG>2;6JwHU?Dnu*~aU*q9fi?m#ugz8CxA .x 8ĪY]ykxĀnI N㊖&FvX@fJpK9%]9>[Gy15!σXQ Gu o`<ofݡ(t 銹pHVqڨN%W*ޭCRXdH Җ`jEk0@J&61!: ^smA9:;C)iȆQVʹ;fbHP37ЍW壨Q3 1U< @XvWwN AJ \΂6[\,ŬrZ'?F6G ͔WV8Lt vb14o0ˉ"P_a[%dJDJ=E`J-H!pk5UԠӴΤ Tu3:04Kː'^Mb2,)!sĖ)2ʌ|>ęLAAB)1(ЊG[%]]}zX@Gd4֨о9;"#MQ 2:Al@v'yOQA5`` p)J! w:'EB`2 UO]EsGk!NW{3S}IWFŹTܝMu-@~7mZL|.y ݍzޟǶH(!V/.p Pd BZh91AY&SYniDmgJtJw 0SQj=4FM # hz z@ #S=LLOP4BbM&4iOM4'zOHQhh 4h dɠ@4h2d11Ld4bzM ɐɦM 2idɉL& DBd@hi?O=0jը)bLPAWOAHjZV$,ÐvEhQNFiM ˇʺw v%ɝOou~?Va(G(,CCgj|R*~uz$0b[S̸038)R)b?]P8 P.5>&b뺾ţ}wVr@a;вXd6,=72h-K&CT')7X` vUBPi$F Ph5Z*vm=EOO8}UR((dC+DJTҮ^ÊxDN8pÇ8us$ e^?/?qVv"G%!+i $ X$`w f eރ1\šf|HͥTb@Q|@@VuJ<\4Qd\ J(;H4C)fM3"h,#@Z(>̂fh6Awmd<)+86N'i E %{?iP6cIt8i0)>8(SLjAƺ6@x (H>"hW"($ӳs>Wχj01#2ZkM)3/\,ao(*l֬aK@ mf@8pϜ'UVL4\J9p[jRxJyrD7Bp&1t9> Jj50"(Hp74BZh91AY&SYÄg{_DPcǛ,?@)i&h 0ASGPjz $CBa4hi %HJ{/1>.-]yv=-E9練|@2A\A2"aI gID`brlW519m!5ߑ$ YP#[ -化c2zG)T~L..\">gY3@Q o"sCm(tI̧dD|f02G[wu( y|auѦ4jɯ] V;~"+=$a*3c@xQQ@bBhW.4JmǨ5?^E*X2lZBVV35]XLIWl3ԃhUf$sIU"(HGa3 |SE0t@!lbYڦKK аYҴ m@PEEEA,Ze+Pi*j*Yronn|W˹g̙3gΜn$JPcbcFa( !'5eJ{Q=}N^/S:qz2KeVqqj +(:@g?[~sM&5|C84\v|&1mjp+$//ZfQ v@֕8U1A8oOR-?@ZN;:'>`k2Eנ σyesyq;誓Rˇ3,51!nYtqSs㹶n}Hζ!nmhw{F R[ q @ѧTUB%u=t`1VcMug +=l)EiօE>GVcn˘4Gngc*lŷmv?ܴ51&0]%EN֎5`EE1:URK2ez Veb[@kJZ7A/ǔׯ v,sdVA5ea/6ZHZ&N;$j4V_Bl#KO[y2b 7|2 sPWs1cg!"Ynj5Ԉd˷[3Tm/C*bz«/ndNKʂ1S8ms$MLu'MQ.QR$JAHc?@%r8P-='BJ9H#f<2+evһrc.G$QAǑd-&j-JjʩeTfU^eL'hO\I؄K. ~B Ibiͧ{9QĈjRr c7Kt{R>.ޫX_|Krm|i`xG$!"/qbpRH,C֞`&c,+}$8ծ+ύIPk^5Vc5@ HI_W,p/![RɬEDLcEj#f0ZF1<&vҬX4!@ ,,;l}9Y)b^3]gOH"-V\AZ"ΘqH:8 `_B@TqfisW4^{Ys|=[.(]йԲ셎/<`aps0cȇY"+DO6 +VJmVJagt@ X'm5\Xum_n.}ުYBljoA`hY[\+4כ $ 0_^,֒.up_I4i}j `#Rˬe\KļJTַpv89 \Cj./6P5>Pq@ǵ6£Jb-N" $z!r`vRF-{z Rl'cUZEqjye2!c.;U yCOpΑ4*Q| z{6F*R EGH+EKo&&⽤i \23$*wnlux /$ Y9!dP ef1- ƩxLq !- M9jI~Bf7h0Ev3h`F^=sq&=LTܞl` ASw B&5TW!=zbPFn xw[mۼW p~?FL02 z~M~o73TxّHZYא3J+N6yh"*}T@(x*Dej&/}&Zs!ìPgy=Oťn>VC8w9W~ t82GycUk e0jQlve!rJ:] l س¦hgc+זKH𒭴qOT*Uud]g5՜IGy8tYFe,]٨v"݆jC#Qk& m%G30bszAXn/`B؍Z5cvdž7{d0iG~^hnFmFύxgˁe)1 j3Ag*m.TYBъ.}z^9/#M2pJ-;,Gjl/ iہ !wge91|V\b+pR /.ǥ㸎>qp E4q18.G;i[Y2;..{.gBzNS~zp>*:홫K5: ш=sxHu0G}#݈8V+*C!K7HvQ8]C F6LfK,B*_R~.u|#R#Y'@vSBgMG V,V,qiEd{fۢ>&F k#Hcb .i0#b q@`+CL;S2-~,Ԏ8BkK>?6ؑ!ΦVzvP7`ϮՑ)mRY%Wa)Z˯V;#r$ܿ&zۏvdg3=xHQȮB,%aWy |UBy Ynu$F&^avuWK_#h9/*?-)ƯXdlXmu@"Z+<cclO$jF#S!i$^ˬ%7Ԓdc 8ʿp( M|ر Ũ5e#ObSxt \jeHFX(!.{v˄c$K~ٗYȭnKHA-cL bbB>B?DwPf-lmbkʶ:[jsiM̺YQ6(D\ .*u(ϻrXҜX76cȯ&nwpG~+}['f.? tz$!t~+ #+nr<Ex{"/G4*[zG.=<TE U^N-vA9}^#%W;ǔVP-cAN$ıcXAFs,<=8_EȪȒAa%>8O/Բ˱+dإ8?Biy҃BeIX` ۉgaWT>1;\)j4ױ3E53o9tώ2:ޣ\#]/7 dK}-{W,&f&Eez 8kt?9-GXy_ov !EH19RWChn]q&~>)/殷Г1 n$ O0ٓ^l%fKÛceŁ$AGN8kG밚_OqqZ cR%vHh'mܚF` uK&&ZǗ=ՖibߛS~YGG>)|Գ|g膮Es3|76c k.*گ"{'TDRMtG9]ۃ{R4zQi$Osˈ[ZY[ ;X#lOg4 _{GO 9 'yL<&[ `[8ܓq;:0;5͝'uwu0'^ nna?ÚJ?$0lfy )#5qOiE38Wyƻ }FfzBڵ>hׅXqj8f>gC'l%p& )nM?sL<`ڗ8&bcv]o.^[(/.jNW e8DJ %ܔ8eLH02e(;z~ƿ>X+CRœ I˫7yy@}Ɍ Cn^[>_I.vy0nG6j*זyX`m\p͸X3'JLVcq+wrf~hoT*M&C`|) {W67Mw`_.>EBeH;~ۀ#oĈvʿOc8Ri7?j*)&M}3U/5!p+HOlGp"fEH+',J|'rg&]}$]Xp/8GOOkOt\J}--6)$ tMh-4MyQ핮-]-*Oe.gpmUDr䲸y{;lr 9i'%GdgݧJ ,|^\E%[Q$`*p*e*XQbWb1#%/E?n w Hs]m.eP@wٳa#DN7bQTfG1\}0_vkَ|v #* IʔB70*^ :h Gg9_gD'Y`S3"p$ΠOgڋ8Ufgil@U$g(e5)b34ė}$#9('e"삍K.42vY?[˭R|0tUDz41{`U&>unʃp doޜFqt?[%aC:1Y>)VL$t}p2 C`zfha$f^/w)~ *=+!4IT%zQnJB-s,%' ұwV z=_ yIDo`z߁lԤێZ8{{-ԐE}Dzf5舐,&Ŋ7zcSϏb<J`#Z0~l24΢ :£ј˨gEZA}l6anӜMsqU3o>RSr:ʏZkQ09J=ˬl=ˌ@f @=f:_S1`@%+@SK']ү36jEVE@GqP EG ]N"FT\yrh)f!=uM"CYb-*Kjf3Faٶ5Ym? 8B>ckMw8"R3h5v5JZ8BԦ֦q{n"αD2% âe꣢}S?`QPeTn[@mU;DAL&9὏U-}~֥?X_o% _.V-Yb,.PiđY U~^2kZYcV5lQȇ$1U\NwbdiV"V6狍Ҩ͚!b\ #*m&Kl֋F bۤWi̮90q,KV9`%;SzB18ۨ/[L&"`1vusޘ'6H8eP-f.We\07\*Kc(h⶛*+˨18cEH4hFZoame |IM59Z"V窌*5zBBYA 5z>5뙟# @*SNk2k9EY6 S9iTr4Bآ׫Fe2:&\i!+&Igjk $bhX̚"@JB`ԛj=QKJ_"bċ^ D$NMOKWJ'QJѯDQ#4u$kx%Ww&B1JAaOo/XG^7) ^ 2]e,79G`4 : %cQX29R+(lPL c->4q-S7S0'~ÐN3d#r"ũ~(81tiZ9?MC<0Kh9Ė=YB)2!'kGŧlk驦li4Ny`)~zg֕PYo A)qD7P<W"~\NR(;)^Iqe*obO4& oG<)ά)(ά[z~Ńgu'8Lϣ8>řug~8n' p+((Dcřu(ά8nv?ht,lb$x-w Aq1-& VjO~8>ԚOJqf9zb3PYgS{ӆ7]_8n:23SYGjﶴ<(řugօSY/A)g'QY^Dqf}uL~_vGo(>uT h~(xoP|5?@9bJ4s{z4œ)>tȥ8_MtY3oQGGqf řf)NDwa"1WgKgKS7@qf_eS- W$;7.37GA8h1 >Ds^Lo lt5 Z7_Mf " (}ۇ>#x/Wَx07œ)> 4"&=ş8wW@j~7x]ޡ+ދ>x4<| /gp5Ky<| ÿ?<tvŃxxWޗ$>g<ßx<|?x-ު+< iRXKa6P(VDM s 0"'XBZ PXIa 0Z5]V|FA0#?R=(=%|x3wfn`X"!0v~ `Jk`f  >#p(Ty ln-'iNxyo|0r')_(""ϴ#p`{?Ss%1?~j3_<,>H`K C/=x1О'w%p# Pѓu8/|?k|q0R(!1 "PCC.E`V2&sQ~S Ө} G`J| hx`@} LGK 71V@{CzL0_0| O=W>~\yuaoN CEM ~xm0?z7 =N@L?SxWnK~Nx`9?nb(x!/ p@CXTΈG疳4 C؄a*YD0DIf3~EFIIPu[x3thVGK';ܭrEcj nD{>-PW-˩rY oCN]8,KFi2fŰ<@Z]^AHb]H7 QQDShc\CYE0JgB`{ xb&#vOʥIjuB-NI')GOHI2y2%5ufM~吞c ])Pr-,}Q Bi|x5 N@FFwaGW?*w ϳH$rfGhmRħ:Y)& 4LB4CQz!!w c suF,䛵RtH"iHxZ]R@3{>#{eU*h* "J|d9+*K鳍Q`rJirS1^%A@AHZ"ZQ)@B#tV1ԢkrwKnQ87&_6-Z.{ܫR,1t9ʐޗXK2ahS" %QŬU0ϱ^YR| c4?~[hsdGDy`DTvr獖2Q6VNof/T5dg7b %Csq i$29n 4垓`)!X"^CS_q-%2uƫ5*nil0ZF1Qfӱcj΍-oEEK8,F=xFZTNkQC(E.rQQޣ =aP{gi0lB#r'tZ`1tl՘i8a&JXZ?2><:K\G)Қa9 MA%;gC ajkqc 5[ogB/`mrtabN;*s^ZAgk pΐh~TFL2AA u4ԭ9gE+PJIəGp9N\v #7xl߸:lcK vWe0CPp7UlLu"`1j FEu"ȕsx}BcY*-n@~覶Ї\dP&%ZX fi&.`+Lx\fYQ]2 8d. 83Atǔ̕_&$;_cb(Z> Ls; GT]hְ-̫ty7jUk5y3gbKp7j78TCsFDU0fH{03@K<2uJM:b.pcA˩`$"%>G@F9UuS/ >_^AFMԄWb(O_U }߃W_>## ^x § ||^@ZS' H|ҠD#כ"q?9aZzܔacgCּuu_ntP:0*bȯ?WݸA3/In%k3?ٜw"T 8㧪kw=icZ;}^"Tgڿr4>PtFubs?OHw6S?bh-8Nސ aJo?zk^p~鉵oy,)EMz0#rpS؊/U.Qe,9B#K|jo_l=m^CWOR'0䉷|OK)l ||3:dN(y!m:I154:"j l۱ 1¬^ }$bQ]$ovn^oI<ܵ]T$Z;kx*Y.SK2fxFqZׂS nm,r%".gP(-JoYy4:^fT@%o0bF?޾6駂mqϵnKWkh۩9vn;lxSapD߉~7dox{.ҵGwCzGO?3kUalꒈ^sm&'m+K_(;Unk, i=OQvciO=<_GuE*Ӗ#V/i5؁%K}7; ?g$q80Cc { Ͼݺ8Ef/, KnooϿP#$馢%)[:y4{}6|ǠC_D3tzH~g݌frrݕ{2jw9+oڶN(y&pƱCzQBɪ]cN^MspZXڻwng%UQ{sm?%v3˻?7nr"SG?oN.x1v\ݡ~UӺOe-̈ߔt9եaŧ6y̓oO˿Sz|zq]D9z_vtأJt6̦~}q3&#=f|9 :_K#^9tލvKO|{qsffUjԋ_z[Ǝx*^=/oXqҮ{tؾ6C{ta\ߔuM.ΘBv=ԋMxv+?rpzݳAIܘuʝG {\5lܺQ`~~,=/]#ワ|b|Dl;k,}WxwC?ݺNCjy o-#y[5bܗfw瘔ZIOx>d~10~I\"\ޏ.z1PĄ/eI8V_I~ߙ\?ENU$> q-dlhG@Dņޑrl@ʢ X+|sӜ bJpA6L}}%84,}(L2l̂iӆQm{fC~+_2(덣{Ffdw\'doۼ3׆w|ګ~aw aĻ#N;n~dzg]??~q{3n8L5_v=q eO;н'2Omykڛ:TQO?:[޽ح9u .c㞨St4e[]BEoJ5l7M~\h{^xx9{5yi3ЊphNv:i;Hڪ~襴[qJiօv}]gU+J6Î-l+_r{‰Kg3?|Zay'6e1c?Fڞ{޸82kȨ?Fwꍩ+m'/b#5߉j縣'QftEMyzVMZNcGyϐm_ >7YJ4D|QiT">1}5ȍXڮ JIn>jX%UGNт3 !!hA%)Q$=w|MM"7Tpzl^04{̌KGznOc=>㤧ov?o~M0̩57 {{`QBjmDh䁻 o7ņU'*oڬM,׷}yS4m|cw{:-߲{K>\pbת[|=d٪XʢwږS; 1s?]2;7?kϮ>O=w2ݲ Yevj+z~O$3?:3?`oVYydu_mla //K8m[? J!@һ.x$38ө#CP44D2HV1PKCfFׇF#߄4 hޡǎ|oSCK=*s8m/No^9wܥ~%ɟ9kW{cΕcv*=7jҪSuR]="}a>O yqoV3{.ou_|47g}ѱm_l¢׶о'c̷t=kZ_~#G|͗P+X?vVc$h8&;%<]9PLߜۣh]feUmSr'>R{*PѮO'~X4׶M+%>=N=WyQmc= yHT#5ڭ:x=~y{Զ/ZQ~ jOr7OlxruW]Vơ9 ca 7aomtb궩o46~֯Cj?mF/}}Ώi6G8cߓ?Nzn%sxjR*tqeu /|G]0n͡;u[}ַhf_lZңoͦkaEac&Ҟz=)Ь׎:?oo.N)Sޟg-xbʘl}NJꙟ%;=ӭhkm&Olva۱kG= ;ܤ n QK}F'3Gz $gIºJҝ&eW%t272ھi|o>L2;).' ~sw~|%rjS@%3} ŻTyX_sq5 }?n k^w_redT*:G{%dr'?qelӍk#ow|}KR%ʾڸL5U'vK ڿF4 C>|ɗߘ?6{Żc5w_ո_G *\to?°Aӊ&`m|}}`͝::q}?=3a׎W$>c$McbcF`8IDdvQe\)e~ iV"4E1zH}-Ɲ(!.&ƍ(ODI¡11-F$9 ШIXS보)cBG%'5c N+2GGFb:%UHOFʢS禪4f1C׏e e⽔5&E nt\ qqlvܫiэPv #) ssR*94WD D<]<#yDrlh ).?٪|,$.ŜpRюe4 0PzZurrowCmrU~ʤt>}g+<zJn {Sӛ-YATzhb@#N2o?.H8?w!#JRFqd8YNf˲ZE4B4IILi>qH6h!2eۧ:\Ô٘:dYC)|}篭= 概FJ߫d+֓zDMy蓿w[>Rv5Ybp?XeBZh91AY&SY`lzaJ֕tJʐ7 @s2 AѠɣFb4<2yF4 2b hɃSBi? 6m5hiF@L C@bh@4Aibj42h  @ DDi#@4@4@4+| Ąm(@iY+ku k !snIinC9uGyBC:-Ajhk~/i텍֜ު]홭4h:11? 6Թp~jƢqa\dh&8~Iρރ5ϸL΢^gAK64n@. @؅&\yU\ʢsTμ9SsUŗR-vB(bAC'gaKqgmu!B9 P.DPtT(*% @@\D8r%pÇ8pü̐/kH+k`gx-͍;i9M aXHi J +Ru)X&͌aJm6vi6Y.LNFa:_?kpq87 E Y@9t84\92/ ?oݙs hZMp=NQb.'1~b:a?qlmuU '뗖dLܾ>p oqjԮ+W`eKcuo^oW>8TOrҘ$jL㕩6gF,q8O!]1xu\Jh?#K<9NڇڕձcJ86}^Uқ9Ab6Z%++7@#1@Vꉲ@Kb1! 5W52 )ߊK•Yj_?i,'3fz:ǜZgId>ZfZhZQPfM懻n>rX7(bm_0}])6&Y58kf3QA ’_ R*%qe|ckD;Gl1#4 V X1roί|RLoJҙy= #gNhlkEI6〥D8]y?9LSЌĹ^=W ai=;i_ϵDT{‡Bn!V _Vl 4fm,y* *5p]ͩ۔:̕3}ћw!9劍ڑ׎5A/EIF"7^Rg/[}"ocoI=I0,^!e417Z\wU"-MH?,PGHo|9OcioX+j9*C~š/j2 w/ )@I/iY Z.7vTRc_?Z^W$1Rz1C)VJ.@&>@Rf/ȇZ'~8J<`$PMFL 2ZeNBR_.N)-4Ԣ,axܻt UdO'*=pA Jfbq_xbk$1U^P A@ӢӈEhNY|@f cX6>pV&h4ʄ8[ <0m/L 0Cn2[eT[ *@WN$\ .2ע2W'G{[͉QdVϺ$s|^iA($C 5  UhwlC`_9b|_KCseE0-γ0ڀFK}?)>5~&ZJ`J&xAu t!@)AAϑZaNd[]UEF 8xb| XtO_ e$=Knd왂Y{_͵cG+VAaCb5Ž `ZHwAS \#,@Wg<2!%"2/1Qc|t^u5a>(q,X&|F ݮx/ >-li=x$!h,s0p-bPX+Z{-i2&QRΥL?׀Qlon7<+^x$# Uc y([dEiq O1\oNq0zua Ǿ`շcZlg롽ԣ)zν%}D1k`kNt~ m TQ.hv '5:ەQTgI=K8 ;B\&Vj0Ih%2TSDq-3TEG7ͼU "-y5_̀SƉޗ]R 9p,a p[@YjmCj}V#mh%[(3N HUť+;Ȥt躠Tbq_2-F;AJƦɩn֡#Z` ,`g4T%<(1v54xǠ0\4MeBy <_ڹuFyt>Q>X-/0m.cP)abwlٿ1v )Lp$IrJ+#.\u(K;mG#pFN#!FrS+ + ~ny.bƐHʆ(,_ED`Ҕ)S`eAZK\`*X#q;ٲ*iW8ZMOS͵t0v@}wLQ@[TQCɫ8G.0 Bvm'N "TFHl1CEpm~IB]53>CF%=YTخwę-@:\_>QCCzA0P\-bOj٤:%M5/wGv?X@ETHv~Quum;yHgN!g^!aKn,TK@Gyѱ,q@$?r q-wSRcWQsAy%2x< rWR^-]6ܭcu0cKc]  ETp{C%cQ n=lMfb_#@vDi~gY'cbQiA \43W6(C<C\VK<&D`I ܯךQn` ti2S=Y 1ȡ3;p1t?6ќ?8~@bZ427:hvF!ÜԙhI9涘 Di6lL+25d@lWv8cz[+ߊW˛{dhfOX5بPZ^ehxUXcjղpRW]P3$>4h#EU)eiu}O6N&i-?@b]U #ݸBJ}\n@x!u4/c/Lq(?Q*zxٓW6uݺpQs0p}5wS»C'V9nereѝ 72Gb7z%#50#IBB:tz^fxȜ`Nwzh2elNB$S% mn!#y%p52_īC*^.bugűˡ--0B"ejeu^ j+'J|8 w`b^ w|'|[8W,߼/–ϕ/\.ͩ7K[B^MvpDS?ENaMk+L .>ëp,!Vc=,:ѱ dJ2e(\Ao6@E{QxDt.Yć^D~nпG~˛5!=^f}=rȏLZ(gAt 85 dzB"Sg@غlIvť,⳶Ϗ&^$aSS*nUj,Jcv8LRIq,4,Nk/h1;t)4cYR.$G|⦚Ǻ.yS,NSN "TLeYֵ}cKƺ4H m{ 6HYL:ݥywe^߂W,h@..3ޣ[(XF'2dwc#x;/y~yNJL(t,$v?{&!vp4^ql[B `{vAmfNh@c_ Z!x Y<౫F"1v,h0/5:t%1-1z#}(%Wl2Våi}v? `/<B;D{k|G1$C]or,(7a?"ﵖ`n.:qGS>j ۂp3%6>ϯ??g7o&'Q&x^APbI6U.А:Sky!H?##f05}a ڹ=P`=7#Zo?0TUnV\bv{!QUk_=ILP@gvY0cM?=o`s7",U$bi|#4M7^ᑇJ0//5 S_-!\<?9n &t9 ݩuuDb{OSS~l-R`G\~`c\w"oaoi9!v;\f3ð??o0pu7gbGCJ힔^CU}K.FSU/y\9ޝ(gpVAs{Ru?#ũq|rΆNxIKvQiȆ:khc@_Kuȷ_I<}$PK/ts_a]Ў8cLd2RG3Rdd{@nXwMg:[=teNK)?g.$Y,>dVRjg^w06Q \%.GSg v`5XG CP):|tdR=XOƗyH^){j|gh-{࡭Fo Y8E ~QO˷|{4-3dk2̷m&ۿ sʭ j3|/2yWyoH?xQ5paRG]ddZҡR:jH"Mgt{ )Pb_4/6v~ɛW/Z z'{mwXat$0BgQ68bEzXPu'2Z?r+TüAmWב;mS]hxK Ex#n\^BsxMST5TD)Xj@.|.FlDžkԫwPtN0>(V_䕯 |ٳzsY|7WWʙ|_~*(ezVVfWe;oǩS)x;Rrn'p=c,h>{1wVlwo!S!<NuCVqMb/A5loA֓tfo,ހ>L>SxXG 6W䵹3xGUIm1Tz~swSGO䝴 k>-<1Okז2b%E!t)m*=ds5vQSS.7IⴙWUEv!- zwraOVU s^!*޵ ¬KcJ?2Nx\bH\ 0ܑuM32ZF~mwJVX4q)gg=; SYV<˜UvG MT<%^tc݇:K۔_9~թ Psk$eYzFSTdךC9$>jo7[2_$]s šp߄pѕ6Bޮz.Z [P't0i%f|#kE10ĘŻQJm[^ާԕmsjE| Yjĭo--ƛ@$ pJTД%KU`BVKЪ]YG,Z 0lCp ō}IȏV0EhJ5np|"+$a7\C=-Cc #h-J(%jޠgxYO^ZIGȯ. W}nQ#m0?D݉e*ಢq%:Qv7ܡr:_sI}ttVbCƸ⚬ M}អ~+SSE|ʓ'jGNPĤZB=*}xgo\4,.)-7z+(bW*fƖ0 J+}q`MǍ?RwlUe͸Dh+@B" ulaQ/#pQC|a:ؒA;a1s}}UK8*bV*{H6!V"uB_ ncjEb`45/M}E]юuuÒ>g <F. M}?]OYOkF_~v*kt^35/ċ(8+r1GWk \YP N(d99̠.C&W34:>$wQ`ɳ:D*uf*ܐ)FyXJ)7(gT9JߠuJȶ^#Vki> RIWDlcF.5|l~N7:tǕTj5`W4z lFPV5F,%ӃZ7,L9V3MPz=v*JdzsZhJ5?PR\+AF=7:eJZ˳d:>R&UyV0.YVjt !·Wߩ?J*>Ge+q`LN @::SI8Q3  RFJϟm/jg뛚1S1jDF2QL<ZƠkZBU`>6q)ٵ Li MTF`ѼdhjR !4HK#( ~BK9}:-yhvtZ=K>/L`J=1"7iH tvٿJBWz~ea/VoyoZ l P$"~"&`(%c(7Ma~1l яRg !>O?aX6+K>_F 8/9X7))5DH_/_NF&fS?G95J+,'p3e!b #PK`:EF( 0@?})\FpfNJXI`n&5h%@?9@/9>aV%j+ R , 0@-Y8@)EF(ʑ~M!PJ@XL`yj \p%5x#_א@sH| e=0>ϡ#R >Bo8Xd=8LplDpY?nSx:[xDpB:R &O'uK |k[b|Fs^Ap9~#qbXVa5, gn6,< Xx4 '\^KYx ϰXd,px}a D NJ19 A_d ςVwOp0\8Ô {r8v8ؿ*\,C DoYх h =ƍp_t7hSz)h g`8 }w {by >=="_` [ _Nx5;;b+<g0.O X8 a#0oH уǀyX~x E?; 0 x s< (m՝1$e İ> н/1acC0$pK b8cX4CT WX pГ<F` OO?~ѱ^]p^ c0\C_0?Co>}@K bx'ګvaG/ O /#A?z Xa:]Ta=VVkA>mbApab:+7 S0M@~zt v`~Gaƭ_MUا?| g?F!\7crl4=A~{>rt/z`8cx=14~~ðJ!6- ޷V(͙112Ao&(=yHxUnK UI+(|!5 MkT\aCP\9R`f=Cr^@|0?SfP:&^XSPiJ $-W0( hJb;ցbPHdjYR@eJJN)3RJC:elnKdSEڑ59 д&̗iԆPbrU鑴AShYm:j6LĤI r3uir`QBJ2(9 ij7SŖMg |5֋p˨d9Jh9L:R:I7Ǿ 9RHM.dMq\BfzB+ZFD12fiȜvJH)i29ha*BkSRqRP̡ : 5kJhڝ ˳\cA%//u{PGzE(Kv9*r:#ҜUJeI*xL'JfTiT.?Hj+sr`S:C4 3M iN(M_@f J$`3zK03B4 \yƲc^tb^ltlK;C*^#IXRs1;N(]XGb b N8u)ЄeJ]>ל:/t/ 䀹?B%JKCUHm44JZGkHMWk#+L"NKlj*T ~>g*E\Ar&\qMj(\uI S6o x\G)6ATc n9|b'yMD9kԖ8B4ztsTjvfT&C`g6VX<%.;QTjR ]s:u>fH`y,M,?T{ى=OfD9&/O-پt:E[J(;V[C)J#&NsI'HYKIuF-r=.s_(gae0)P30M}"zL>13YIfZ:8m@}:IvLaz6)m,IR"OW"sHҴF2mJg0@A@^ԁ.-SjO1@e+a< AThM$o40%FL~4XR2Ls ȑeiHf2T4ҳH##F=evճY;ԪL0iY9 ` /#0Db"ޖb .4e<ǨWͳ%#;i)rѴ+OC#~F\Џg2F( ) zAFO<VT JopHTTN *H4-0]a { գej k }A&lPAun\V`#A<uЁFt hȂrW8:6hal3 cDfMM Ԫ鵟-1@fcN>]sW+e_nm.zlu7L?˃Vʵ=<% OmCKcR߸_9cV/hw[0aXڻp|y%cz zzkIͪ{O_ޢ}_viw\՗G7mѳ Z9b.ӿw-A#vnIiRvіOsP~aVz% d |u yw*c#5)=`d͓#*-4%%(8,ݳ[a;Axjs$y02e,A0$OGЫ̿YvpH\,#,$AkHσ-^&d>w7 C?z#jmݽwxԊ-K yvߐҘ9 7^9z J;{o]U.y]|;6UޔVnqv>oˎ]߯Ψ2CvhCzfK6yv=G]y^?o:Rw}ޘSa IۆVZy'ᯱ=,\U{R>ϯn{w-ѵpD{k)_N:4cxkF R\%K5'o~k1|+Xl#\7:0t)72&$?&v~v띭دqךV˯; iv7}k[C=|kŋz&gKWǛf]ZrW)7FKJ}c,yWHK D汦Ss qw@Rё+<O@Gq;AL=e!AM`Ŵm2G%S˕|,/Fɟ/S/03'=lzL.Wj L(|(5؛2\P@CVUP Av i5LiZ]1E1A[}0kj"5#䠼o~_ޙwz`EK;2ΧkE:UiڽwkoV-^!Q^cvu1K-g}アٍLNImz|c5dsޗoFO~Go~N6_\qϹxnݫ̓[Лw"hҍyܥ<"-M M=ov@uգ :I?[~+OjZ4*7K<&1_4]݄ &h(Aw]~-k~ ۊ b1ߑv|c mSL<6U{FG Wv/8J̆|k^;xTsYܷjGFbԆ!?Ipƴ V%?^jw[T>hqzuÄb_:ίX,yӲG ]O< vW@euzaWЙk.&XdՃw.wx^ם ^揤m!~eO)^wuG|֞p5e "b~Kn~+:\YmXǥF'"p`P7q]4ra *_T ;R[;D%6I~cgCz\K( <𥪧 }*`E{ʰV2JNsj5/@S{xSlLΓKCؖJt_.;vv͔]mom^~~\?W،[Kv}x#t;ܽM1Ϯ o>>mlș Gv}t'ֶ>js3㾘>/f|'ۻۣݷ ]_wCg,yeI~Ňk^c~\;1[s:^Egh^~Ջ;e_ 93 ?M^8Gb}{NjKڞ,i{ lI!f,qL`z1kLؒOtxyn #"&eueȦK{sO-i&6'C]ioot>=˝:W_MpM\G<;~\e ֹٜ{nk*V}sِh5N@.s>9Ժ[ov=_I_O[ϖ|Z ~?a1v6ea亗Mw* c@3wO?ֽ}vUך[ɉ8=oʓ5 WݼGrJ5ym}̹7CwlO p07`H\^,xU(@UNT+gjc>F0R) (ح( ]1wm|MPe06 9_;_ oID3:wOjĥU8NM2=]I~qn?$>N 3KKyo5ᘭlCK+)Y3*fo˾ʉҭgm{MjQ3W;\ꍽ%>g9ۛF;Ϯ[6{oS!Uu#ndn8q+);g޽s։sܳ6m|WVѠE3CiًX^rPr>@Bg7DkҚXÿ3KQE}rKw jlM-: dݜd+CCe}z/ p2Pr{9[ŷY5oucFس`wnO"=·_{X:iLi_iMx׮ ?:mb|h~qzηEX%Ç6-S}z\vk]zTΧ7wdWZ|%_>^>s~}WzQQ_Z~s_}pFyNE!6i]FRgzwWVmUv8sl=^eo/ry wG~D+;Jf,y=n%-VsA`~d6|ߋ "`8<Gm?L3NPF̸'/^^D/ sV]g2vCxymMLԏ(m-Nʝ?Ů<1JxwDݏ~=wV=^g'5$8еu^q]_޸FӢgV$]]ط~T/H[isMЗ~Whb;|鿊<.i[RvqV:c;ܒ&7 AquEƾkDkT ~oN7`•CyޥUVs+wUO-uu c{g_rp{V\3g7&>qoW.v'uߚy3rZust]{p NM%kgʾՖ=~ y{fW%{~35G({oqJQ5-sр֓/4ugî^dĹG?q&u}Vo={a][> 5UnW2u[cSK___wI/ca]od$L+]1  ߌJcQw:j` sJME&{G>Goy\Bt`ۣasWx^-$0|T|gpO֫nZֿ&ͨms;~6'htS3 6jgȒ]6f/^)zzG^v;7:f}\!兑)OvqTU-ъ0cC)7btLֿ<-5=Gw>:'>Y?Ͻ<Wr7wj{{Tzٺ+m?.AQ}?A>\!`BI~hxDdTD0< dlGmB҇le!$A6@Q(aEf0ꔎq PaQ!k:R:,/7;`A_k*ufl@A⼇'M8U*kC4uxrR? ($ĉ|ir҄|PGHxL?i C:5,H "4kc*TrCwq~h|)0'.+y. ΚEK#"h1Ԡ3*Ci00F YϨ SW2 |RG|hzbAFND%K*fG;ڥmu.~ń)_ Xt``f'NH`Vل69T#{NȒ F4ǘ0HH&(u_(sп"*57ɕ^:A1@^MdIRQ*"[s$I?M#΄sf*^DS_Η3}V́.2wRP*4T&.L 7*lUc-/'Ib1eF<+QnwAd-rFX|>MVR% :nc7eڡ!$V x]m5t:yfR@oI:2-#Y0BlV*9yJ&?=4x:ސQKꕺ1`t"#q|wC;md2U~dxnl|*An0EiƀaE*%@b6)}mZF]wя{JR{Gq$qJ&$͖e/iD7iJmЦ:XASKA1kVgmX ^Rl'F5}   l2eSA.30v":YP es.5ДG`Nn*hD*Aq S4KBe This distribution contains multiple components, some of which fall under different licenses. By using FreeLAN or any of the bundled components enumerated below, you agree to be bound by the conditions of the license for each respective component. FreeLAN license: ---------------- FreeLAN is distributed under the GPL license version 3 (see Below). TAP-Win32/TAP-Win64 Driver license: ----------------------------------- This device driver was inspired by the CIPE-Win32 driver by Damion K. Wilson. The source and object code of the TAP-Win32/TAP-Win64 driver is Copyright (C) 2002-2010 OpenVPN Technologies, Inc., and is released under the GPL version 2. NSIS License: ------------- Copyright (C) 2002-2003 Joost Verburg This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any distribution. OpenSSL License: ---------------- The OpenSSL toolkit stays under a dual license, i.e. both the conditions of the OpenSSL License and the original SSLeay license apply to the toolkit. See below for the actual license texts. Actually both licenses are BSD-style Open Source licenses. In case of any license issues related to OpenSSL please contact openssl-core@openssl.org. /* ==================================================================== * Copyright (c) 1998-2003 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" * * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please contact * openssl-core@openssl.org. * * 5. Products derived from this software may not be called "OpenSSL" * nor may "OpenSSL" appear in their names without prior written * permission of the OpenSSL Project. * * 6. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit (http://www.openssl.org/)" * * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY * EXPRESSED 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 OpenSSL PROJECT OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This product includes cryptographic software written by Eric Young * (eay@cryptsoft.com). This product includes software written by Tim * Hudson (tjh@cryptsoft.com). * */ Original SSLeay License ----------------------- /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * 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 copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ GNU Public License (GPL) ------------------------ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . freelan-2.0/packaging/windows/README.md000066400000000000000000000006171252300335000176610ustar00rootroot00000000000000# Installers To build the Windows installer, you will need to install the Freelan build tools Python/SCons scripts. Building an installer on Windows also requires [Inno Setup](http://www.jrsoftware.org/isinfo.php). You will also need to compile the `tap-setup.exe` tool from `libasiotap/windows/tap_adapter/tap-setup` using the WDK 7.1. You will find detailed instructions inside this directory. freelan-2.0/packaging/windows/SConstruct000066400000000000000000000024601252300335000204320ustar00rootroot00000000000000"""The SConstruct file""" import os import sys import innosetup sys.path.insert(0, os.path.abspath('../..')) from defines import Defines AddOption( '--arch', dest='arch', nargs=1, action='store', choices=('all', 'x86', 'amd64'), default='all', help='The architecture to build the packages for.', ) env = Environment() innosetup.generate(env) defines = Defines() installers = [] def build_for_arch(arch): TAP_SETUP_TEMPLATE = ( '../../libs/asiotap/windows/tap_adapter/tap-setup/' '{}/tap-setup.exe' ) iscc_defines = { 'NAME': 'freelan', 'PRODUCT_NAME': "FreeLAN", 'VERSION': '.'.join(map(str, ( defines.version.major, defines.version.minor, defines.version.patch ))), 'ARCH': arch, 'XARCH': 'x64' if arch == 'amd64' else 'x86', 'TAP_SETUP': TAP_SETUP_TEMPLATE.format( 'objfre_win7_amd64/amd64' if arch == 'amd64' else 'objfre_wxp_x86/i386' ), } return env.INNOSetup(source='freelan.iss', ISCC_DEFINES=iscc_defines) arch = GetOption('arch') if arch == 'all': for arch in ('x86', 'amd64'): installers.append(build_for_arch(arch)) else: installers.append(build_for_arch(arch)) env.Default(installers) freelan-2.0/packaging/windows/files/000077500000000000000000000000001252300335000175005ustar00rootroot00000000000000freelan-2.0/packaging/windows/files/README.txt000066400000000000000000000015311252300335000211760ustar00rootroot00000000000000Thank you for installing FreeLAN ! ================================== Your FreeLAN installation was successful. Congratulations ! Freelan runs as a Windows service transparently in the background. You can lookfor it in the Control Panel > System and Security > Administrative Tools > Services menu. There is currently no graphical user interface for FreeLAN: FreeLAN will automatically connect to the configured network when your computer starts and will gracefully disconnect when it shuts down. By default, the FreeLAN configuration is very simple and should be modified to fit your needs. It's default location is "\config\freelan.cfg" which should resolve to "C:\Program Files\FreeLAN\config\freelan.cfg" in most cases. See https://github.com/freelan-developers/freelan-all/wiki for a complete guide about how to do that. freelan-2.0/packaging/windows/files/amd64/000077500000000000000000000000001252300335000204135ustar00rootroot00000000000000freelan-2.0/packaging/windows/files/amd64/OemWin2k.inf000066400000000000000000000156751252300335000225620ustar00rootroot00000000000000; **************************************************************************** ; * Copyright (C) 2002-2010 OpenVPN Technologies, Inc. * ; * This program is free software; you can redistribute it and/or modify * ; * it under the terms of the GNU General Public License version 2 * ; * as published by the Free Software Foundation. * ; **************************************************************************** ; SYNTAX CHECKER ; cd \WINDDK\3790\tools\chkinf ; chkinf c:\src\openvpn\tap-win32\i386\oemwin2k.inf ; OUTPUT -> file:///c:/WINDDK/3790/tools/chkinf/htm/c%23+src+openvpn+tap-win32+i386+__OemWin2k.htm ; INSTALL/REMOVE DRIVER ; tapinstall install OemWin2k.inf TAP0901 ; tapinstall update OemWin2k.inf TAP0901 ; tapinstall remove TAP0901 ;********************************************************* ; Note to Developers: ; ; If you are bundling the TAP-Windows driver with your app, ; you should try to rename it in such a way that it will ; not collide with other instances of TAP-Windows defined ; by other apps. Multiple versions of the TAP-Windows ; driver, each installed by different apps, can coexist ; on the same machine if you follow these guidelines. ; NOTE: these instructions assume you are editing the ; generated OemWin2k.inf file, not the source ; OemWin2k.inf.in file which is preprocessed by winconfig ; and uses macro definitions from settings.in. ; ; (1) Rename all tapXXXX instances in this file to ; something different (use at least 5 characters ; for this name!) ; (2) Change the "!define TAP" definition in openvpn.nsi ; to match what you changed tapXXXX to. ; (3) Change TARGETNAME in SOURCES to match what you ; changed tapXXXX to. ; (4) Change TAP_COMPONENT_ID in common.h to match what ; you changed tapXXXX to. ; (5) Change SZDEPENDENCIES in service.h to match what ; you changed tapXXXX to. ; (6) Change DeviceDescription and Provider strings. ; (7) Change PRODUCT_TAP_WIN_DEVICE_DESCRIPTION in constants.h to what you ; set DeviceDescription to. ; ;********************************************************* [Version] Signature = "$Windows NT$" CatalogFile = tap0901.cat ClassGUID = {4d36e972-e325-11ce-bfc1-08002be10318} Provider = %Provider% Class = Net ; This version number should match the version ; number given in SOURCES. DriverVer=07/02/2012,9.00.00.9 [Strings] DeviceDescription = "TAP-Windows Adapter V9" Provider = "TAP-Windows Provider V9" ;---------------------------------------------------------------- ; Manufacturer + Product Section (Done) ;---------------------------------------------------------------- [Manufacturer] %Provider% = tap0901, NTamd64 [tap0901.NTamd64] %DeviceDescription% = tap0901.ndi, tap0901 ;--------------------------------------------------------------- ; Driver Section (Done) ;--------------------------------------------------------------- ;----------------- Characteristics ------------ ; NCF_PHYSICAL = 0x04 ; NCF_VIRTUAL = 0x01 ; NCF_SOFTWARE_ENUMERATED = 0x02 ; NCF_HIDDEN = 0x08 ; NCF_NO_SERVICE = 0x10 ; NCF_HAS_UI = 0x80 ;----------------- Characteristics ------------ [tap0901.ndi] CopyFiles = tap0901.driver, tap0901.files AddReg = tap0901.reg AddReg = tap0901.params.reg Characteristics = 0x81 [tap0901.ndi.Services] AddService = tap0901, 2, tap0901.service [tap0901.reg] HKR, Ndi, Service, 0, "tap0901" HKR, Ndi\Interfaces, UpperRange, 0, "ndis5" HKR, Ndi\Interfaces, LowerRange, 0, "ethernet" HKR, , Manufacturer, 0, "%Provider%" HKR, , ProductName, 0, "%DeviceDescription%" [tap0901.params.reg] HKR, Ndi\params\MTU, ParamDesc, 0, "MTU" HKR, Ndi\params\MTU, Type, 0, "int" HKR, Ndi\params\MTU, Default, 0, "1500" HKR, Ndi\params\MTU, Optional, 0, "0" HKR, Ndi\params\MTU, Min, 0, "100" HKR, Ndi\params\MTU, Max, 0, "1500" HKR, Ndi\params\MTU, Step, 0, "1" HKR, Ndi\params\MediaStatus, ParamDesc, 0, "Media Status" HKR, Ndi\params\MediaStatus, Type, 0, "enum" HKR, Ndi\params\MediaStatus, Default, 0, "0" HKR, Ndi\params\MediaStatus, Optional, 0, "0" HKR, Ndi\params\MediaStatus\enum, "0", 0, "Application Controlled" HKR, Ndi\params\MediaStatus\enum, "1", 0, "Always Connected" HKR, Ndi\params\MAC, ParamDesc, 0, "MAC Address" HKR, Ndi\params\MAC, Type, 0, "edit" HKR, Ndi\params\MAC, Optional, 0, "1" HKR, Ndi\params\AllowNonAdmin, ParamDesc, 0, "Non-Admin Access" HKR, Ndi\params\AllowNonAdmin, Type, 0, "enum" HKR, Ndi\params\AllowNonAdmin, Default, 0, "1" HKR, Ndi\params\AllowNonAdmin, Optional, 0, "0" HKR, Ndi\params\AllowNonAdmin\enum, "0", 0, "Not Allowed" HKR, Ndi\params\AllowNonAdmin\enum, "1", 0, "Allowed" ;---------------------------------------------------------------- ; Service Section ;---------------------------------------------------------------- ;---------- Service Type ------------- ; SERVICE_KERNEL_DRIVER = 0x01 ; SERVICE_WIN32_OWN_PROCESS = 0x10 ;---------- Service Type ------------- ;---------- Start Mode --------------- ; SERVICE_BOOT_START = 0x0 ; SERVICE_SYSTEM_START = 0x1 ; SERVICE_AUTO_START = 0x2 ; SERVICE_DEMAND_START = 0x3 ; SERVICE_DISABLED = 0x4 ;---------- Start Mode --------------- [tap0901.service] DisplayName = %DeviceDescription% ServiceType = 1 StartType = 3 ErrorControl = 1 LoadOrderGroup = NDIS ServiceBinary = %12%\tap0901.sys ;----------------------------------------------------------------- ; File Installation ;----------------------------------------------------------------- ;----------------- Copy Flags ------------ ; COPYFLG_NOSKIP = 0x02 ; COPYFLG_NOVERSIONCHECK = 0x04 ;----------------- Copy Flags ------------ ; SourceDisksNames ; diskid = description[, [tagfile] [, , subdir]] ; 1 = "Intel Driver Disk 1",e100bex.sys,, [SourceDisksNames] 1 = %DeviceDescription%, tap0901.sys ; SourceDisksFiles ; filename_on_source = diskID[, [subdir][, size]] ; e100bex.sys = 1,, ; on distribution disk 1 [SourceDisksFiles] tap0901.sys = 1 [DestinationDirs] tap0901.files = 11 tap0901.driver = 12 [tap0901.files] ; TapPanel.cpl,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK ; cipsrvr.exe,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK [tap0901.driver] tap0901.sys,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK ;--------------------------------------------------------------- ; End ;--------------------------------------------------------------- freelan-2.0/packaging/windows/files/amd64/tap0901.cat000066400000000000000000000244201252300335000222040ustar00rootroot000000000000000)  *H (0(1 0 +0 +7 00  +7 gK(yN  130822124023Z0 +7 0x0R68E462D0045856DB194BBD8BF5136CCABF05ED401c0: +7 1,0*Filetap0901.sys0V +7 1H0F OSAttr02:5.1,2:5.2,2:6.0,2:6.10b +7 1T0RL{C689AAB8-8E78-11D0-8C47-00C04FC295EE}0i +71[0Y04 +70& <<<Obsolete>>>0!0 +hbXVKlʿ@0R823025F02B355B37DF7D7657B0F2B4D3584891A51]0< +7 1.0,Fileoemwin2k.inf0V +7 1H0F OSAttr02:5.1,2:5.2,2:6.0,2:6.10a +71S0Q0, +7<<<Obsolete>>>0!0 +0%+5[7}vWXH0b +7 1T0RL{DE351A42-8E59-11D0-8C47-00C04FC295EE}00 +7 0OSXPX64,Server2003X64,VistaX64,Server2008X64,7X64,Server2008R2X6404 +7 &0$ HWID1tap09010;0# a M'0  *H 01 0 UUS10U Washington10URedmond10U Microsoft Corporation1)0'U Microsoft Code Verification Root0 110415194533Z 210415195533Z0l1 0 UUS10U  DigiCert Inc10U www.digicert.com1+0)U"DigiCert High Assurance EV Root CA0"0  *H 0 sԻ--2?%Iq*Ք4g _i@ķИAY:ܔiGԘ&cd+0U#0b ![Cn TPkҖq0UUN0L0JHFDhttp://crl.microsoft.com/pki/crl/products/MicrosoftCodeVerifRoot.crl0  *H  Yok-J>uELAPٰ*?SV9jcx$y}G ˽fy <ܬ p?x~K`&sa!hcoٟ'Ml$Ƚ؟{9:$Joz9ad>W8zҵ9ն<}k*LLT hXa`}x!unj*ke-/i|3 /uy(j)tJ3QlAsu Yo09o9M=%/Ki~Y\^$=Tv!+f;w^e UZnjZu y&00Jh V~~M_0  *H 0l1 0 UUS10U  DigiCert Inc10U www.digicert.com1+0)U"DigiCert High Assurance EV Root CA0 110211120000Z 260210120000Z0s1 0 UUS10U  DigiCert Inc10U www.digicert.com1200U)DigiCert High Assurance Code Signing CA-10"0  *H 0 #'Ā2_@op6qq:u^#qNg}A?K{8i/:$wYfC &@,L| O&7:"lJa^oyY`)*Ois( ""L1+؄C-P0x<#gW0S0U0U% 0 +0U 00`Hl00:+.http://www.digicert.com/ssl-cps-repository.htm0d+0VRAny use of this Certificate constitutes acceptance of the DigiCert CP/CPS and the Relying Party Agreement which limit liability and are incorporated herein by reference.0U00+s0q0$+0http://ocsp.digicert.com0I+0=http://cacerts.digicert.com/DigiCertHighAssuranceEVRootCA.crt0U00@><:http://crl3.digicert.com/DigiCertHighAssuranceEVRootCA.crl0@><:http://crl4.digicert.com/DigiCertHighAssuranceEVRootCA.crl0UHkX#̔.ed0U#0>iGԘ&cd+0  *H I|`|źKdi)ޘ}@f&3/DU5p 4ӮT.ez2 >l&9ǪFfƳtX4uPD}10tkEv3zHo1V+3"DΌʈ> yCCU\, kxwָښL+ݯLҗƮ_D37/V[Ug4l sJ{5xpzKO"6ɏɷ($8[)RR1GV\{ Aut8\aP䂹#Ѻ:r8xu]4rGV6w$Ub-ҵ^O=[1b39xv%s*ϜvK_KKpLyLW_]8O ]gEփ iOY#Ҫ|Bϑ'ý| ,U"M*!I1GwqܱKKwO/Z)&130/00s1 0 UUS10U  DigiCert Inc10U www.digicert.com1200U)DigiCert High Assurance Code Signing CA-1 Xz덥a [ʖO0 +o0 +7 100 *H  1  +7 0 +7 10  +70# *H  1) [4OA=Qҩ0  *H (666d* pGB7^nCuU3c0NOс>(Vī,͂F=Ezp1FeB^JjGJe.m.jkw"h: e <YxэgiQ.64q6{t(;۸Z2NjQ4E;DRu?freelan-2.0/packaging/windows/files/amd64/tap0901.sys000066400000000000000000001173301252300335000222560ustar00rootroot00000000000000MZ@ !L!This program cannot be run in DOS mode. $Q7Z?dZ?dZ?dSd[?dSdY?dZ>d|?dSd_?dSdY?dSdU?dSd[?dSd[?dSd[?dRichZ?dPEdR"  ^0P<z$ @qp8.textUV h.rdata| p Z@H.datad@.pdataf@HINIT^l .rsrct@B.reloc<x@B@UVWATAUH`$MMADHH?CGH$D3AH\$XHl$0H|$8B؅t HEHu%H$@88 HDËpL$H$LD$@HHHD$ HD$@AH׋HD$@H+H (HL$0HT$8x# sHvD|A HtEy:t&Ht!HD$8LL$0E3HH͉t$(HD$ {@yuMt HD$0IEMt HD$8I$H\$XH`A]A\_^]H\$Ht$WH 3H\$@tBATAPAHL$@6^u"@tL3HL$@BH\$@ H\$@H\$@3HH\$0Ht$8H _H(Htt E3 ^H(DIL‹QA;u3A;rA+LDAA;A vA I̋Au3DDIAPA;rA+щȉA;A vA JDH\$H|$E33HDfDGDC2DLLEfffHA:A-A.A0|A9~AA|AF~ A@A@wAA@wAA@Dà DFAs]uE;'A;IALA2AD;DM2ɸLDE@B H\$H|$H\$H|$2H3E3E3҉fAAE3AH$HYHAs<{uAi<0r<9vA@BFA@ fBJcScȉH\$ UATAUHPMMHtt YHt$pSHH7xD$x5D$y\$zu4Hw#HHT$xf1B1!F~D$@6D$BD$Au/A=wHT$@1Bf1#FH$t ~D$@3D$AD$Bu/A=wHT$@1Bf1#F~D$@D$BD$Au/A=wHT$@1Bf1#F~u/9=wtHH1LE>F~uA=w Ƅ1F~\$8HVD$0H$MHD$(H$MHHD$ OHNLN#fLFHN'fFDHVfHfF-1HH$Ht$pH$HPA]A\]H\$Hl$VATAUH0A@Hc\$xMfILDH HL;tA@ff]H|$PH|$pHH|$ QuH|$PH\$XHl$`H0A]A\^3Ʌ~HffffffLcA8+<t<5tr| A8L;|ƃ?toG t;ut rELMźHH|$(Ld$ .e|Hc8u 8덃눃냺LMHDH|$(Ld$ u uG t;tLI[IsWH H@2HICAC H3AC H3AC H3AC H3AC H3ACH3ACH3ظHHcCt1CD <s@'`RCu3ҍJmHtHpH @HHCH\$8Ht$@@H _LIkIs WH H@2HICAC H3AC H3AC H3AC H3AC H3ACH3ACH3HH=bGt1GD <sy'pQGuH\$8H3HtDH9st HHHu1HtHHHHHKXH@GH\$8Ht$H@Hl$@H _LI[IsIKWH AC 3H3AC HH3AC H3AC H3AC H3ACH3ACH3ظHH|aCt)CD <sm'`PCuH HHtAffffHAH;t HH HuHtHHHHH HHxCH\$8Ht$@HH _H(H `HtfH`H(@UVATHE3@2@2AEtE9 t IA;rA;uHĀA\^]ÉXH$tHHu AcH$H$EAHHDd$ NLHHC4Dc0C>?H{LƃcNL$HT$@H$ƃC8DcHƁǁƁ H[[[IH" IHQHƇt HIt HOOIHH\$0H _@SH HAyH HtQHKHtQHHtQ{`t HKPIH{t HKHHKHHt P{zt HIH [HSVHHhHL`3ALhH3,AP^tVH$ H3#L$0I[0Ik8IsHIA_A^A]A\_ArEEE A;v A>DIHA?+23;,-w,w,,,,,,,, ,+Y,,,,-L,f,,.,-@VATH(MHtt% HD$h3ɉHD$`щH(A\^AsHD$hH(A\^A=w tA4HD$`3H(A\^úH(A\^HD$hAHD$`3H(A\^Át3v 0HD$h3ɺHD$`H(A\^Aʃt'tttF>?F>3F>2 F>1F>0As#HD$`3ɺHD$hH(A\^Ã3ɈFHD$`HD$hH(A\^HD$`LD$hHl$PADLl$ HEIAHHHLmHH+t Av AkHH\$HH|$X?H3A#HMIe/H?H|$XH\$H3ɋHl$PLl$ H(A\^H\$H|$I3E3ME3ۿAB }ED E3A AIffAA |MAAMfffffffA@IfA@3IuLCfffffA@IfA@3IuZtDЋuH\$H|$fH\$Hl$Ht$ ATH LJ&HB&L%3HHM;$8uLHM;$@uɃt/HI;$HuHPI;$Put2X{:u{6u@8k7uHS>I;$HuHSFI;$PuuHVH|$0HH݆LGLO&fHO6 fG FFfGFLGFPfG CGCfGCG:GG ffGI$HII$PI@HCIHCIA3@o7fo8G:`fG;G=I$HHG>I$PGNHGFGOFLGPFPfGTUAVfHHfG8\VHH|$0H\$8Hl$@Ht$HH A\H\$Ht$WATAUHPLHHzz(ucL3E3E3HtCA@(u$AH,AH % DAMMuEY AqEAA(AqF={=VATAP5HL$p;rHL$pHdE3HtrD;smG tHW3H;HH$G(F, D;vH}/H&LLiFLAHD$pHL*EH?H|$@D;tH9/HKKs{|HD$pHPL@LH&*uKff9B u<t3HHD$(D$ DDHQtkr^ff9B uOA8EuIAx uBCffA9Au2HL$pH.~D$(HL$ H0t 61{?HL$pAfЁtit2~uW6HQHeHD$po*HCLHD$(CHD$ DKDDC@HQHS"HQH;SLuQ ;STufQf;SXu3ukHD$pH,93H|$0@8{t"@8tHT$pHHHD$0HC9H;|$ptC,VE3HL$pp8C$3H|$8H|$pH8@8{t?@8t6H9xt*H9yteHHD$8HQHD$pH8HtHT$pHtAH.i3 3H\$xH$HPA]A\_H\$Ht$ WATAUAVAWHH/HH3H$HH$HH$E3AD$LDg0Lg8H @8 AM    tw03Hf7{ AE$HxpFHFHA}rHOCCfAHG8H+HGG#w0|A} r*HG HG@ HGD`HG8 KH*HkGYG#w0&A}rHOC8HG8 H*H)GG#w0aA@8sE$tT@8E$C>$cC@8s<E$@$HPLLAUDŽ$A $A$DŽ$@A@ $A@$DŽ$AA D$xAAD$pC(D$hC D$`C,D$XC$D$PD$H FD$@H FHD$8H$HD$0H)HD$(D$ E3E3HOTG0AMHO8A} @s?H$CCfA$HGK@HGPSDHGHKH#;t%H(HdERE w0CCRCfCVH$CLAfCPH$C`AfCdCCZCfC^ffCffCXHCZHChCbCp݆ffCtC?HoHG8H (HDD. w0oA}@s?H$CCfA$HGK@HGHKDCHCCRCfCVH$CLAfCPH$C`AfCdCCZCfC^ffCffCXHCZHChCbCp݆ffCtC?Hz HG8H'HCCU w0zA}rHGH HG8WH&HwCeCg w02A}@s|@DHGHGHHGHHGH CCfC|ƃH HG8H&HBB w0A}w6@8s|t0DEEHHWU!E]DHG8BH%HbBPB w0 H%H@B.B w03Hc1xHOHu)H^%HBA/ w0Lg8,A tHQD$(Dd$ E33EA1HHWHu)H%HAA9 w0Lg8@8su)H$H{AiAA w0Lg8C?AMHO8LSAEHJD$8D$0HL$(D$ LLHIAL[IAAD$Dg0>H.$H@@l $H$w0E3Lg8H$AMLCZ$<`uLChHO8LSAED$8D$0HT$(D$ MHIAL[IAAD$Dg0>Hm#H@@ $H$w0E3Lg8H$$H-#H?? Lg8#w0uC C(3H.E2AEHG8HOHu4H"H?p? w0Lg83H.A tHAD$(Dd$ E33EA.HGHu4Ht"H? ?w0Lg83H<.Q@8su4H:"H>>w0Lg83H.MH-@8st)@8t H9qtH9pu{LH-MtE3IHaHE-@8std@8t[HQDAA;uI A;rA+H|AA;A vA HH;uH$HGhHHAH!-E H H== w0Lg83H,t_D <s!'-,u&Hx H!== w0Lg8YDH H@8s=t)@8s>;B?        DD$HT$HL$SVWH HHٿ|$XE3IHAh s +Axc9K8|^LcLK8ADD$XDC0HHTMHKFYHHf:T:] H\$@{0E3LC8Ht$HA#LC8C0H|H%::N E3H( H\$@|$XuT$PH)) 3H)H _^[@SH HHtHAHH [&3AHH [@SH Hl$0Ht$8HH|$@HAHH(Ld$HA(HVE3҈F0DZD AEtGALDI;uAJAALDBD;rD+ȋB;r+EuEtH3V0H;HN(@*(Ld$H@t@3HChC0 HC8Ht$8@Hl$0t KE'@H|$@t 3H'H [H\$Hl$Ht$WH H3HO(>'H_G0SuH'DKA@;r+BC;C vC J\W0HO(V'HtH3HHChC0 Hk8 'HO(&HG0QuH*D DAAAA;rA+BA;A vA J\W0HO(&HtHHY&HQuH*D DAAAA;rA+BA;A vA J\Hb&HtE3H˃%H\$0Hl$8Ht$@H _H\$WH H8Q=t2y<u,HIE3E3Һ @u @_%HK]%@{=H\$0H _̀y?t/y|t)#AH;ADuALƁAPfH\$Hl$VWAUAVAWH EHfLf9j DZ3D;YufDZ fD;YuɃrDBE;GufDBfE;GuɃKDE;Gvu fDBfE;Gzt)ff9zf9z zff9rzD9jJ&#D$pA;A;*Ld$PLHfh fxfp@@fA*IfHHL$xAD$AfAD$ AGA$AGfAD$AD$AIfAD$AGAD$ AGfAD$$C&El$&AD$9*ILd$P2H\$XHl$`H A_A^A]_^H\$Ht$WH AHHHL$HWATAPI|"HD$HLH։8HL$HHH@"HPH|$HHQDAA;u3A;rA+H|AA;A vA HH@"Ht#HE3H"H\$0Ht$8H _HL$HE3!H\$0Ht$8H _H\$Ht$WH IH@"HPHQu3*D DAAAA;rA+BA;A vA J\HH@#"Ht%DHSH7E3HF!sH\$0Ht$8H _@SH@HLQA@LBD$8D$0LD$(D$ LLHIAL[IAHdH 21 H@[3A?3҉Q@QDQHHALATfAXHAZAbfAfHAhApfAtA|fLI[WH33HI{ICICICICICICICICICICICICIC8A`u 1 HL$@ t0 HCPLL$0LD$hH$|$(HD$xD$h0H|$pDŽ$H$H$|$ t 0 DH$LD$@t W0 H$t90 HH30H$HĠ_ffH; y/uHfuHH8L U/LF/Hd$ HѹHHXHhHpHx ATH Ld$PIHHHtd$X sN HLMI+I$Ad$X s6\$XL‹Gu HuI<$Ht,HD>HEI$Htd$X s HuI<$H\$0Hl$8Ht$@H|$H3H A\H(AHvLBH3H(H\$Hl$Ht$WH ILL$PHZIHLH3YxHH;w u@4+H @4+HtHH\$0Hl$8Ht$@H _3H;t L9r AsH9uLLH;tH3As H;u H;u H;tI;v H\$WH`MIHMuHd$ E3E333 iHtHtL$MH;D$HBH|$@GHL$0H|$0T$8HHtl$8x HD$0 HT$03/H\$pH`_H8LL$ E3CH8ffHIrSIII@rHكtL+HHMI?Iu9MIItfffHHIuMt HIuffffffIs0HHQHQH@HQHQIHQHQHQufDHHQHQH@HQHQIHQHQHQu $T̃J @SH B@It HzuA&Bx HHu H [̅~LH\$Hl$Ht$WH II@LH@}?tH\$0Hl$8Ht$@H _H\$Hl$Ht$WH A@@IIHt IxuA6~2MLHHŃ?u=**uLHֱ?H\$0Hl$8Ht$@H _@SUVWATAUAWHH;*H3H$xE3MLLHL$XDD$`AEDD$HEDD$@EDD$0DD$PDD$DI;uLD$ 33WI;tA?ADD$8DD$4AA:4H\$XIA;H 'G@ht3@lt@w A?lu I  }A<6uA4u Ia<3uA2u IL`)OuOuO  4 2p 2p`0>`GGGuGGG!.\0 t!\00s!  t 4 \00s!T .\0 tB`1 d/T-4,&p$_   t4!`dt!dkt!kt!dkt!tdkt!4`dt4 B>`-88 d42 p>`!X4u!4 X4u  p`Pd42 p!pKLxu! pKLxu T 4 2 p `! H&Hv!t H&Hv!&HLHu! &HLHu!t dT H&Hv!@23v!t@23vd T42d42p!p`v!4p`vd T2 pd42 p!,t!4,t20, d'4& pcI@@@AlAlA!C`!57y87y8y8!Pv!tdPv!tdPv2-+] fpq`qus.X4uX uut =t@t,t,vvVt`dtdktkt|tltD\tD\Ltpv@t@tC>>0!0 +hbXVKlʿ@0;0# a M'0  *H 01 0 UUS10U Washington10URedmond10U Microsoft Corporation1)0'U Microsoft Code Verification Root0 110415194533Z 210415195533Z0l1 0 UUS10U  DigiCert Inc10U www.digicert.com1+0)U"DigiCert High Assurance EV Root CA0"0  *H 0 sԻ--2?%Iq*Ք4g _i@ķИAY:ܔiGԘ&cd+0U#0b ![Cn TPkҖq0UUN0L0JHFDhttp://crl.microsoft.com/pki/crl/products/MicrosoftCodeVerifRoot.crl0  *H  Yok-J>uELAPٰ*?SV9jcx$y}G ˽fy <ܬ p?x~K`&sa!hcoٟ'Ml$Ƚ؟{9:$Joz9ad>W8zҵ9ն<}k*LLT hXa`}x!unj*ke-/i|3 /uy(j)tJ3QlAsu Yo09o9M=%/Ki~Y\^$=Tv!+f;w^e UZnjZu y&00Jh V~~M_0  *H 0l1 0 UUS10U  DigiCert Inc10U www.digicert.com1+0)U"DigiCert High Assurance EV Root CA0 110211120000Z 260210120000Z0s1 0 UUS10U  DigiCert Inc10U www.digicert.com1200U)DigiCert High Assurance Code Signing CA-10"0  *H 0 #'Ā2_@op6qq:u^#qNg}A?K{8i/:$wYfC &@,L| O&7:"lJa^oyY`)*Ois( ""L1+؄C-P0x<#gW0S0U0U% 0 +0U 00`Hl00:+.http://www.digicert.com/ssl-cps-repository.htm0d+0VRAny use of this Certificate constitutes acceptance of the DigiCert CP/CPS and the Relying Party Agreement which limit liability and are incorporated herein by reference.0U00+s0q0$+0http://ocsp.digicert.com0I+0=http://cacerts.digicert.com/DigiCertHighAssuranceEVRootCA.crt0U00@><:http://crl3.digicert.com/DigiCertHighAssuranceEVRootCA.crl0@><:http://crl4.digicert.com/DigiCertHighAssuranceEVRootCA.crl0UHkX#̔.ed0U#0>iGԘ&cd+0  *H I|`|źKdi)ޘ}@f&3/DU5p 4ӮT.ez2 >l&9ǪFfƳtX4uPD}10tkEv3zHo1V+3"DΌʈ> yCCU\, kxwָښL+ݯLҗƮ_D37/V[Ug4l sJ{5xpzKO"6ɏɷ($8[)RR1GV\{ Aut8\aP䂹#Ѻ:r8xu]4rGV6w$Ub-ҵ^O=[1b39xv%s*ϜvK_KKpLyLW_]8O ]gEփ iOY#Ҫ|Bϑ'ý| ,U"M*!I1GwqܱKKwO/Z)&140000s1 0 UUS10U  DigiCert Inc10U www.digicert.com1200U)DigiCert High Assurance Code Signing CA-1 Xz덥a [ʖO0 +p0 +7 100 *H  1  +70 +7 10  +70# *H  1Zs`/ѧ~LS!v0  *H i?^]B TJȠ?9Ii3\-%; 1h=mʢ'p*0jx}W=3UA S~%0XJsB\@3AIpX*2 !*=* #_/:ܝ!lmԭ|JA&,i *)uXFפreҮ0:{ L>H7LI6I ~O*}Vz塂0  *H  100v0b1 0 UUS10U  DigiCert Inc10U www.digicert.com1!0UDigiCert Assured ID CA-1y[2 60 +]0 *H  1  *H 0 *H  1 130822124019Z0# *H  19H|+W^XpeR0  *H cmmEq\Ԫ˾L8hۥ=&& Ɏ*ݖ$n͇6=,F1-\ݠjWȷlw file:///c:/WINDDK/3790/tools/chkinf/htm/c%23+src+openvpn+tap-win32+i386+__OemWin2k.htm ; INSTALL/REMOVE DRIVER ; tapinstall install OemWin2k.inf TAP0901 ; tapinstall update OemWin2k.inf TAP0901 ; tapinstall remove TAP0901 ;********************************************************* ; Note to Developers: ; ; If you are bundling the TAP-Windows driver with your app, ; you should try to rename it in such a way that it will ; not collide with other instances of TAP-Windows defined ; by other apps. Multiple versions of the TAP-Windows ; driver, each installed by different apps, can coexist ; on the same machine if you follow these guidelines. ; NOTE: these instructions assume you are editing the ; generated OemWin2k.inf file, not the source ; OemWin2k.inf.in file which is preprocessed by winconfig ; and uses macro definitions from settings.in. ; ; (1) Rename all tapXXXX instances in this file to ; something different (use at least 5 characters ; for this name!) ; (2) Change the "!define TAP" definition in openvpn.nsi ; to match what you changed tapXXXX to. ; (3) Change TARGETNAME in SOURCES to match what you ; changed tapXXXX to. ; (4) Change TAP_COMPONENT_ID in common.h to match what ; you changed tapXXXX to. ; (5) Change SZDEPENDENCIES in service.h to match what ; you changed tapXXXX to. ; (6) Change DeviceDescription and Provider strings. ; (7) Change PRODUCT_TAP_WIN_DEVICE_DESCRIPTION in constants.h to what you ; set DeviceDescription to. ; ;********************************************************* [Version] Signature = "$Windows NT$" CatalogFile = tap0901.cat ClassGUID = {4d36e972-e325-11ce-bfc1-08002be10318} Provider = %Provider% Class = Net ; This version number should match the version ; number given in SOURCES. DriverVer=07/02/2012,9.00.00.9 [Strings] DeviceDescription = "TAP-Windows Adapter V9" Provider = "TAP-Windows Provider V9" ;---------------------------------------------------------------- ; Manufacturer + Product Section (Done) ;---------------------------------------------------------------- [Manufacturer] %Provider% = tap0901 [tap0901] %DeviceDescription% = tap0901.ndi, tap0901 ;--------------------------------------------------------------- ; Driver Section (Done) ;--------------------------------------------------------------- ;----------------- Characteristics ------------ ; NCF_PHYSICAL = 0x04 ; NCF_VIRTUAL = 0x01 ; NCF_SOFTWARE_ENUMERATED = 0x02 ; NCF_HIDDEN = 0x08 ; NCF_NO_SERVICE = 0x10 ; NCF_HAS_UI = 0x80 ;----------------- Characteristics ------------ [tap0901.ndi] CopyFiles = tap0901.driver, tap0901.files AddReg = tap0901.reg AddReg = tap0901.params.reg Characteristics = 0x81 [tap0901.ndi.Services] AddService = tap0901, 2, tap0901.service [tap0901.reg] HKR, Ndi, Service, 0, "tap0901" HKR, Ndi\Interfaces, UpperRange, 0, "ndis5" HKR, Ndi\Interfaces, LowerRange, 0, "ethernet" HKR, , Manufacturer, 0, "%Provider%" HKR, , ProductName, 0, "%DeviceDescription%" [tap0901.params.reg] HKR, Ndi\params\MTU, ParamDesc, 0, "MTU" HKR, Ndi\params\MTU, Type, 0, "int" HKR, Ndi\params\MTU, Default, 0, "1500" HKR, Ndi\params\MTU, Optional, 0, "0" HKR, Ndi\params\MTU, Min, 0, "100" HKR, Ndi\params\MTU, Max, 0, "1500" HKR, Ndi\params\MTU, Step, 0, "1" HKR, Ndi\params\MediaStatus, ParamDesc, 0, "Media Status" HKR, Ndi\params\MediaStatus, Type, 0, "enum" HKR, Ndi\params\MediaStatus, Default, 0, "0" HKR, Ndi\params\MediaStatus, Optional, 0, "0" HKR, Ndi\params\MediaStatus\enum, "0", 0, "Application Controlled" HKR, Ndi\params\MediaStatus\enum, "1", 0, "Always Connected" HKR, Ndi\params\MAC, ParamDesc, 0, "MAC Address" HKR, Ndi\params\MAC, Type, 0, "edit" HKR, Ndi\params\MAC, Optional, 0, "1" HKR, Ndi\params\AllowNonAdmin, ParamDesc, 0, "Non-Admin Access" HKR, Ndi\params\AllowNonAdmin, Type, 0, "enum" HKR, Ndi\params\AllowNonAdmin, Default, 0, "1" HKR, Ndi\params\AllowNonAdmin, Optional, 0, "0" HKR, Ndi\params\AllowNonAdmin\enum, "0", 0, "Not Allowed" HKR, Ndi\params\AllowNonAdmin\enum, "1", 0, "Allowed" ;---------------------------------------------------------------- ; Service Section ;---------------------------------------------------------------- ;---------- Service Type ------------- ; SERVICE_KERNEL_DRIVER = 0x01 ; SERVICE_WIN32_OWN_PROCESS = 0x10 ;---------- Service Type ------------- ;---------- Start Mode --------------- ; SERVICE_BOOT_START = 0x0 ; SERVICE_SYSTEM_START = 0x1 ; SERVICE_AUTO_START = 0x2 ; SERVICE_DEMAND_START = 0x3 ; SERVICE_DISABLED = 0x4 ;---------- Start Mode --------------- [tap0901.service] DisplayName = %DeviceDescription% ServiceType = 1 StartType = 3 ErrorControl = 1 LoadOrderGroup = NDIS ServiceBinary = %12%\tap0901.sys ;----------------------------------------------------------------- ; File Installation ;----------------------------------------------------------------- ;----------------- Copy Flags ------------ ; COPYFLG_NOSKIP = 0x02 ; COPYFLG_NOVERSIONCHECK = 0x04 ;----------------- Copy Flags ------------ ; SourceDisksNames ; diskid = description[, [tagfile] [, , subdir]] ; 1 = "Intel Driver Disk 1",e100bex.sys,, [SourceDisksNames] 1 = %DeviceDescription%, tap0901.sys ; SourceDisksFiles ; filename_on_source = diskID[, [subdir][, size]] ; e100bex.sys = 1,, ; on distribution disk 1 [SourceDisksFiles] tap0901.sys = 1 [DestinationDirs] tap0901.files = 11 tap0901.driver = 12 [tap0901.files] ; TapPanel.cpl,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK ; cipsrvr.exe,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK [tap0901.driver] tap0901.sys,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK ;--------------------------------------------------------------- ; End ;--------------------------------------------------------------- freelan-2.0/packaging/windows/files/x86/tap0901.cat000066400000000000000000000243541252300335000217240ustar00rootroot000000000000000( *H (0(1 0 +0 +7 {0w0  +7 Jg20 130822124022Z0 +7 0x0R6E0312B32A4FDF48C0CC8FE18658A2D0737CC2031c0: +7 1,0*Filetap0901.sys0V +7 1H0F OSAttr02:5.1,2:5.2,2:6.0,2:6.10b +7 1T0RL{C689AAB8-8E78-11D0-8C47-00C04FC295EE}0i +71[0Y04 +70& <<<Obsolete>>>0!0 +n*OH̏Xs|0RD65994DD38DE0E1971F8C99A048C46ACC284E8BF1]0< +7 1.0,Fileoemwin2k.inf0V +7 1H0F OSAttr02:5.1,2:5.2,2:6.0,2:6.10a +71S0Q0, +7<<<Obsolete>>>0!0 +Y8qɚF„0b +7 1T0RL{DE351A42-8E59-11D0-8C47-00C04FC295EE}00~ +7 p0nOS`XPX86,Server2003X86,VistaX86,Server2008X86,7X8604 +7 &0$ HWID1tap09010;0# a M'0  *H 01 0 UUS10U Washington10URedmond10U Microsoft Corporation1)0'U Microsoft Code Verification Root0 110415194533Z 210415195533Z0l1 0 UUS10U  DigiCert Inc10U www.digicert.com1+0)U"DigiCert High Assurance EV Root CA0"0  *H 0 sԻ--2?%Iq*Ք4g _i@ķИAY:ܔiGԘ&cd+0U#0b ![Cn TPkҖq0UUN0L0JHFDhttp://crl.microsoft.com/pki/crl/products/MicrosoftCodeVerifRoot.crl0  *H  Yok-J>uELAPٰ*?SV9jcx$y}G ˽fy <ܬ p?x~K`&sa!hcoٟ'Ml$Ƚ؟{9:$Joz9ad>W8zҵ9ն<}k*LLT hXa`}x!unj*ke-/i|3 /uy(j)tJ3QlAsu Yo09o9M=%/Ki~Y\^$=Tv!+f;w^e UZnjZu y&00Jh V~~M_0  *H 0l1 0 UUS10U  DigiCert Inc10U www.digicert.com1+0)U"DigiCert High Assurance EV Root CA0 110211120000Z 260210120000Z0s1 0 UUS10U  DigiCert Inc10U www.digicert.com1200U)DigiCert High Assurance Code Signing CA-10"0  *H 0 #'Ā2_@op6qq:u^#qNg}A?K{8i/:$wYfC &@,L| O&7:"lJa^oyY`)*Ois( ""L1+؄C-P0x<#gW0S0U0U% 0 +0U 00`Hl00:+.http://www.digicert.com/ssl-cps-repository.htm0d+0VRAny use of this Certificate constitutes acceptance of the DigiCert CP/CPS and the Relying Party Agreement which limit liability and are incorporated herein by reference.0U00+s0q0$+0http://ocsp.digicert.com0I+0=http://cacerts.digicert.com/DigiCertHighAssuranceEVRootCA.crt0U00@><:http://crl3.digicert.com/DigiCertHighAssuranceEVRootCA.crl0@><:http://crl4.digicert.com/DigiCertHighAssuranceEVRootCA.crl0UHkX#̔.ed0U#0>iGԘ&cd+0  *H I|`|źKdi)ޘ}@f&3/DU5p 4ӮT.ez2 >l&9ǪFfƳtX4uPD}10tkEv3zHo1V+3"DΌʈ> yCCU\, kxwָښL+ݯLҗƮ_D37/V[Ug4l sJ{5xpzKO"6ɏɷ($8[)RR1GV\{ Aut8\aP䂹#Ѻ:r8xu]4rGV6w$Ub-ҵ^O=[1b39xv%s*ϜvK_KKpLyLW_]8O ]gEփ iOY#Ҫ|Bϑ'ý| ,U"M*!I1GwqܱKKwO/Z)&130/00s1 0 UUS10U  DigiCert Inc10U www.digicert.com1200U)DigiCert High Assurance Code Signing CA-1 Xz덥a [ʖO0 +o0 +7 100 *H  1  +7 0 +7 10  +70# *H  1jG:PrƶzylL0  *H 9h ! 5drva{$OoP8<WuvQ܁<pĆf 8 lɒR':8ay= ]WKeBxك->l9+L/T<= e=4LҵdPyQ6=Y> '?o(.JK3$#^U5ipFz0^Q M5Kt]kñU0ʾ+Jj4ɡ0  *H  100v0b1 0 UUS10U  DigiCert Inc10U www.digicert.com1!0UDigiCert Assured ID CA-1y[2 60 +]0 *H  1  *H 0 *H  1 130822124019Z0# *H  1/}A|xsfag׮0  *H yګ_~Q('͋?=j;kgjP܏d"ZU8o8OnAG(rܲ9gK//p_yKsDI*%~l &ڞ A0wb[۱N3W M6V"`A SCJs;$[*Ue_MSmCI˃O Γd I쑧ZgEM x}ڲ(j elfreelan-2.0/packaging/windows/files/x86/tap0901.sys000066400000000000000000001047301252300335000217700ustar00rootroot00000000000000MZ@h !L!This program cannot be run in DOS mode. $mޗ>ޗ>ޗ>,>ݗ>=>ݗ>ޗ>>>ٗ>>ߗ>:>Η>->ߗ>(>ߗ>Richޗ>PELR  T WRe3WP]e$a40SPT@R.textMN h.rdataHRR@H.data|VV@INIT.VV .rsrc]]@B.relocaa@BU S] VuW}VhSW];VhjEP}]:Et tzuuM8tf VEU RPMQSWE$;E+ȍ8UM|&EtvEPQRG;t},EttPMQURjSWJ;}uEtMEtU_^[]̋UjhThpAdP SVW V1E3PEde33Eu;t{]hTAPAVEPRu18] t/VSMQh9 EEMd Y_^[]]EEMd Y_^[]Ëe3EMd Y_^[]̋UjhUhpAdPSVW V1E3PEdeMt*E t#EjPQR ËeEMd Y_^[]̋UVujP3;u3^]pHH ^]̋UMAVq;u3^];r+ЋE DAQ;Q vQ ^]̋UEWxu3_]PV0N;r+ʉOH;H vH D^_]̋UMSYV13Wt:TK9U u@ITQF;r+QG;r+uԅt E _^[]_^3[]̋US3VufFE 32WJE :tn-ti.td0|9~A|F~Hwnx3ɃwHxwH Ѓ wȃsCu 222B23 2۹E sʃ_^@[]_^2[]̋UQM 3SVufFEE F3WٿC]<{u Eh<0r<9v_^] F_^] ̋UE UE ExE u.Vqwfu f!^] @^] ̋UE MEExEMu0QwUfUf#] @] ̋UQS] V3KW33;ىM] ~hC+E|:I\f3\Tf3U] S;|;}fDf3Mtu_^[]̋USVW} 33~Cu+މ] u] 0;}t03fff҃;|̋E@fpf3΃uE@fpf3΃uǍD_^[tu]̋UVujFPlV#RV'̍FPfNQRfN-^]̋UVu 3W}~09+Htt5t| 9LA;|_^]|9u9_^]̋UVu f9N Uz SVW}ʋ;_GX:@:A;OjGjuX:^u@:Ft!;ueH:NuZ@:FuRECf9Xu@Df9u2Exu)ʋ;uP:u@:Au _[^]_[2^]2^]̋U}$UVut! ;NjFjuH:Ju@:Bt2E SWxffx t VjfVn z8fR } fP@E@@@ލ fX 3fPfPfPfXV|P3:t @NtHC@*@+P-ݹDfX"fϋ}fX$3fH(H,fX&x.3fx2fx4_P6[9M$uP:NtH:N|H>MPBQPFfIcScfHJ^] jh3ң`V;t 3 I`VT|2̋UQEtȉEE3US3ȡ`VV3W<ȍw2ۋκBt/ƃR<s>h'Rָ@ujjtMH_^[]̋UMtЉE3E3E3С`VSVW{E׸@t45Rσ<seh'RǹAuՋM33t79Nt Ƌ6u(tNhQjVEE_^[]̋UQU3M 3M S3 `VVW<3ۍw]ƹAt2փR<s]h'RκBuыU3Ʌt/d$X;tt ȋu]t Z_^[]̡`VthP`V̋UVuFEtHRPFtHRPFptHRP~4t F,P S~t N QRF(tjPP]~Ft HVR^]33̋U V3ʼnEEMSVW}3hSPs+E M = .$DžpP>Dž/fDž DžPSDžDž U38Z1EP$DžDžEP(DžsEP,b==w)t=2EP!= wS=$EPEP EP==EPf@ fDž =wAt'=w.-#=u&_^[M3C)]=t=t+_^[M3)]r ___ ;v _1^[M3(]VPW2)M _^33[(]CfWu4SdűUE V=t-tht MU3^]}sM^]U=wvMUA(3^]^]}M|U3^]=8=9uMEURҋ+t ^]v ^]uSWRhjS2'MUQRS0'EωR_[3^]M Aw+$@E@20"E@21E@22E@23E@2?}sMU^]MˆPU3^]=r =)MU^]̋USVW} 33~Cu+މ] u] 0;}t03fff҃;|̋E@fpf3΃uE@fpf3΃uǍD:_^[tu]̋Ujh8UhpAdP SVW V1E3PEdeE3uN8} y%+3 33%;|d9F|_F]^]PT9RF P$ EVËetVPpV] uF3ۉ^E} ^FtVPpVN ESQWREËeE3ۋu};uU2SNjMd Y_^[] ̋UVuW} tmS^RFFWPFV;NjE R} [t3ɍW8 G G}t G%PS} t 2ҋS_^] E ̋USVW}_RGGPu3(pMA;r+ΉJH;H vH MtWRt!3ҍF82ҋF FS돋RGPu3$pK;r+ΉJH;H vH tW_RtQV랍_hRGlGpPu3$pK;r+ΉJH;H vH tWl_hRtjRVR_^[]̋US] Vu8^1t5~0u/jjt Fh @P Nh @QRVRR^1^[]̋UEx3t,xpt&H|#H<;H8uP@fHDfƀ]̋UVuhTAPIFPMQRUE SW2MVPQ2!u RUHU P;u3"8;r+ML@H;H vH } R_[jtVƴVS^] ERPR^] ̋Ujh`UhpAdPSVW V1E3PEdeEuFMQQM QRjQQVQdҋvPpËetVPpV EMd Y_^[] ̋UE3ɈH3H4H8H+Ћ4;08sjjV}݆fN WfG fFO@NfWDfV CFfKfNS VF:F̍FfNV VHVP VH SV&SV*SN&QS"Q 3F6F7f^8F:`f^;^=V6] V^>V^BV^FVQ^JFNFO_@P^Pf_Dj Rf^T|jVVWfN8;jVV_^[]_^2[]̋UEPtM jlQPM]M j3QP;]̋UQS] VWffEf9C MSys;P:s@:FgSs;WP:F@:F:Aj ;-P:S@:CfEf9Cf9C{fEf9C{M9KC&#U;U;jj*8MEUfF fNfVFFj*V̋EfNVHfN OfNV@fFN WMfV$C&URFN&#j*V_^[]_^2[]̋USVW}RPu3$pK;r+ΉJH;H vH tRtPNQWgjRVR_^[]̋USRVW}tVPpV[Glh FDFF$Vh VƇtWRt GPRW_^[]̋UjhUhpAdPSVW V1E3PEdeuU BEzub3ۉ]];tDHMu(ыHH9 ʋU EuEBMJBz}W39|m8^1dhTAP5GPM QRuE ;uMd Y_^[] ׁ]$Ete;sc@t@ jPRȉME@<;}vtVPpViPQM TR ߋEM};ttVPpVs] ~pKSUC&E*u9f9A u*t!RjF|PVtRQVthzr^f9Q uOE8EuGЀz u?CԋEf9Pu-S.0PRUREPQV] ~3KfQ -tXt.-~6QVE f*V@RFE RtE tjPW뇸ËeE3Md Y_^[] Md Y_^[] ̋UjhUhpAdP0 V1E3ʼnESVWPEdeE} }PuE_`3GG; 8  `8$H8C $m8$p89Kr%G VfV fPO2ҋSEn pV#tVP 9Cr2O  W B O AG2ҋSE pV#tVP9CrW N, G2ҋSEpV#tVPwVҀaŮ$tE͊N2MV0ҀcUEljP R@Pj@Q RAPjpH QPRFPNQV RFPQpVRtVPMQhPhjjSRG Pi\GKO{ F3FEfV EދG N4G HN8G @F<#;tpV tVPVNNFfF fFJE܉F@fVDFTfVXNNV fVRffFZVNV\fFLFRF`NVNd݆fNhF3VG2ҋSE pV. tVP{rqF3NMfF MދW N4W JN8Ft#9~t;tWh0(NHQRFFFDEUR S]EtjPPtjpS}tV_^[]̋UMW33EE;vU9>ƋMt_^[]̋UE vHPE%PE@P 3] ̋US]VuW} vEtMU+щEt;E%WPVE t } u E0;v)MD>vEt E0;_^3[]̋US] Vs35 VWEE{t N3 8N F3 8E@fMUS[ EMt_I[LDEEtE|@GE؃u΀}t$t N3 8%N V3 :E_^[]EɋM WE 9X th VWӋZE MH t N3 8N V3 :EH9S th VW T̋U S39]uSSSSS uM Vu;t;uSSSSS SE;wMWuEuEBuuPus;tMxE EPSYY_^[̋Uujuu uI]SVWT$D$L$URPQQhDd5 V3ĉD$d%D$0XL$,3p t;T$4t;v.4v\ H {uhC C d_^[ËL$At3D$H3Uhp pp> ]D$T$UL$)qqq( ]UVWS33333[_^]Ëj+ 33333USVWjjhDQ _^[]Ul$RQt$ ]̋UE H ]A @tyt$Ix  QPYYu ̋UVMEM >t} ^]̋UG @SVt1u+E*MsC>u=xV*uϰ?[}^[]̋UP V3ʼnEEUS3ۉ;uSSSSSkVu ;uSSSSSMW3-F9u Ȁ XwS3Sj_;$N tJt6t%HHth\PD5)<*u,R;Ӊ k DЉ<*u&R;Ӊk DЉluFu SG ;6u~4uFFu 3u~2uFFu diouxXRit/C?8HHt& 6H@Dž e;thp;taf9HIt43ɋA+҄艵X(VP@u+<0u tR;u ,VDž0u t0BPhPPPtDžBDženHHto HHK8Dž'YIf9t@@;u+ ;u (VI8t@;u+DžDžt>Qƅ0DžDžt utR, t@tBBB@t3@t;|;s؃ځڋu3ۃ} Dž9~ u!u t-RPSWs09~N뽍E+Ft_t΀90tT0@'2< t ffDž\@t=t ƅ-"3@tƅ+tƅ Dž++ uVj YtuWVj0 tf~bPjEPCPCu(9t MYYuP2Y|tWVj u t%3SSSSSE_^M3[ÍIHFF'GrG}GGHSQ0V SQ0VL$ KCk UQPXY]Y[̡ V39hV̋UW39} u9}v E;t83eVu;t}vWWWWWojX>9} u ;t3PV*jEPE Puu } j*XxV ;tE 3^_]̋Ujuuu u\]VD$ u(L$D$ 3؋D$d$ȋd$Gȋ\$T$ D$ ud$ȋD$r;T$ wr;D$v N+D$T$3+D$T$ ؃ʋӋًȋ^%$S%(STAP-Windows Adapter V9c:\users\samuli\tap-windows-github\src\tapdrvr.cState=%s Err=[%s/%d] #O=%d Tx=[%d,%d] Rx=[%d,%d] IrpQ=[%d,%d,%d] PktQ=[%d,%d,%d] InjQ=[%d,%d,%d]\DosDevices\Global\%s%s%s\Device\.tapMACAllowNonAdminMediaStatusMTUNdisVersionMiniportNameZZZN\6\\\[[[[z[d[F[.[[ZZZf\YXYhZZZ:ZZZYYYYYYtYZYDYX,Y\\RPTT     (null)(null)EEE50P( 8PP700WP `h````xpxxppH VTRSDSS|>>>>??/???? 0000000 111#1:1E1O1S1d1n1x1|1N4u44E5M5V5_55555E888888889K9x9}99T:::::;; ;<<=,=====a>h>>>>>>>??%?)?M?[?j?n??00 0|00011,101111111r22222222233%3V3c3g3m33334=4b4r44444V555566"6>6S666666 77K7Z7777777788H8L8P8T8X8\8p8t8x8|8888888)9999999:m:u::::;;;;; <A>^>m>>>>>>??S?s?y?????@@1`2233455q666x99:>>>>>>>>>>>?^??Ph\0h044 55,505L5P5X5\5t5x5555555(6,6666666677 77/7:7H7Q7c7h7o7|77777777$0$ *H $0$1 0 +0h +7Z0X03 +70% <<<Obsolete>>>0!0 +n*OH̏Xs|0;0# a M'0  *H 01 0 UUS10U Washington10URedmond10U Microsoft Corporation1)0'U Microsoft Code Verification Root0 110415194533Z 210415195533Z0l1 0 UUS10U  DigiCert Inc10U www.digicert.com1+0)U"DigiCert High Assurance EV Root CA0"0  *H 0 sԻ--2?%Iq*Ք4g _i@ķИAY:ܔiGԘ&cd+0U#0b ![Cn TPkҖq0UUN0L0JHFDhttp://crl.microsoft.com/pki/crl/products/MicrosoftCodeVerifRoot.crl0  *H  Yok-J>uELAPٰ*?SV9jcx$y}G ˽fy <ܬ p?x~K`&sa!hcoٟ'Ml$Ƚ؟{9:$Joz9ad>W8zҵ9ն<}k*LLT hXa`}x!unj*ke-/i|3 /uy(j)tJ3QlAsu Yo09o9M=%/Ki~Y\^$=Tv!+f;w^e UZnjZu y&00Jh V~~M_0  *H 0l1 0 UUS10U  DigiCert Inc10U www.digicert.com1+0)U"DigiCert High Assurance EV Root CA0 110211120000Z 260210120000Z0s1 0 UUS10U  DigiCert Inc10U www.digicert.com1200U)DigiCert High Assurance Code Signing CA-10"0  *H 0 #'Ā2_@op6qq:u^#qNg}A?K{8i/:$wYfC &@,L| O&7:"lJa^oyY`)*Ois( ""L1+؄C-P0x<#gW0S0U0U% 0 +0U 00`Hl00:+.http://www.digicert.com/ssl-cps-repository.htm0d+0VRAny use of this Certificate constitutes acceptance of the DigiCert CP/CPS and the Relying Party Agreement which limit liability and are incorporated herein by reference.0U00+s0q0$+0http://ocsp.digicert.com0I+0=http://cacerts.digicert.com/DigiCertHighAssuranceEVRootCA.crt0U00@><:http://crl3.digicert.com/DigiCertHighAssuranceEVRootCA.crl0@><:http://crl4.digicert.com/DigiCertHighAssuranceEVRootCA.crl0UHkX#̔.ed0U#0>iGԘ&cd+0  *H I|`|źKdi)ޘ}@f&3/DU5p 4ӮT.ez2 >l&9ǪFfƳtX4uPD}10tkEv3zHo1V+3"DΌʈ> yCCU\, kxwָښL+ݯLҗƮ_D37/V[Ug4l sJ{5xpzKO"6ɏɷ($8[)RR1GV\{ Aut8\aP䂹#Ѻ:r8xu]4rGV6w$Ub-ҵ^O=[1b39xv%s*ϜvK_KKpLyLW_]8O ]gEփ iOY#Ҫ|Bϑ'ý| ,U"M*!I1GwqܱKKwO/Z)&140000s1 0 UUS10U  DigiCert Inc10U www.digicert.com1200U)DigiCert High Assurance Code Signing CA-1 Xz덥a [ʖO0 +p0 +7 100 *H  1  +70 +7 10  +70# *H  1]ESVH6${3Di0  *H [M?ć5fcƏ.k%?eZ=K!0`4Y>UQf׮_Zͬ(z!@spκ,E J?/W`ןoQ@Jq31axCd}Ωoj-s+0  *H  100v0b1 0 UUS10U  DigiCert Inc10U www.digicert.com1!0UDigiCert Assured ID CA-1y[2 60 +]0 *H  1  *H 0 *H  1 130822124018Z0# *H  1Q$zvB]1lmR0  *H A:&15jDGmRR2!  fhޕ,H] 3r;a:E 3*֨h}n.PFcpK%оmQK!U>QVjB:%o G5!E+~h:A6e/tPWPN|ݲ  ;AoSU_} ⑃֫~Vޑ~,ۣhPڿZR(aFrRCNT/[iMSfreelan-2.0/packaging/windows/freelan.iss000066400000000000000000000067311252300335000205410ustar00rootroot00000000000000; General defines #define PRODUCT_NAME "FreeLAN" #define AUTHOR "Julien Kauffmann" #define URL "http://www.freelan.org" ; Tap adapter defines #define TAP "tap0901" #define TAPINF "OemWin2k" [Setup] AppId={{3AE669E7-36C2-48DF-985B-6037F9AF69A8} AppName={#PRODUCT_NAME} AppVersion={#VERSION} AppVerName={#PRODUCT_NAME} {#VERSION} AppPublisher={#AUTHOR} AppPublisherURL={#URL} AppSupportURL={#URL} AppUpdatesURL={#URL} DefaultDirName={pf}\{#PRODUCT_NAME} DefaultGroupName={#PRODUCT_NAME} AllowNoIcons=yes LicenseFile=LICENSE.txt OutputDir=. OutputBaseFilename={#NAME}-{#VERSION}-{#ARCH}-install Compression=lzma SolidCompression=yes ArchitecturesInstallIn64BitMode=x64 WizardSmallImageFile=images\wizard_small.bmp WizardImageFile=images\wizard.bmp [Languages] Name: english; MessagesFile: compiler:Default.isl Name: french; MessagesFile: compiler:Languages\French.isl Name: spanish; MessagesFile: compiler:Languages\Spanish.isl Name: german; MessagesFile: compiler:Languages\German.isl [Files] Source: ..\..\install\{#XARCH}\Release\bin\freelan.exe; DestDir: {app}\bin; Flags: ignoreversion; Components: binaries Source: ..\..\install\{#XARCH}\Release\config\freelan.cfg; DestDir: {app}\config; Flags: ignoreversion onlyifdoesntexist; Components: configuration Source: ..\..\install\{#XARCH}\Release\bin\ssleay32.dll; DestDir: {app}\bin; Flags: ignoreversion; Components: binaries Source: ..\..\install\{#XARCH}\Release\bin\libeay32.dll; DestDir: {app}\bin; Flags: ignoreversion; Components: binaries Source: files\{#ARCH}\{#TAPINF}.inf; DestDir: {app}\driver; Flags: ignoreversion; Components: tap_adapter Source: files\{#ARCH}\{#TAP}.cat; DestDir: {app}\driver; Flags: ignoreversion; Components: tap_adapter Source: files\{#ARCH}\{#TAP}.sys; DestDir: {app}\driver; Flags: ignoreversion; Components: tap_adapter Source: {#TAP_SETUP}; DestDir: {app}\bin; Flags: ignoreversion; Components: tap_adapter Source: files\README.txt; DestDir: {app}; Flags: isreadme ignoreversion [Dirs] Name: {app}\log; Flags: deleteafterinstall; Components: binaries [Tasks] Name: install_service; Description: Register the Windows service.; Flags: checkedonce; Components: binaries; GroupDescription: Windows Service Name: install_tap; Description: Install a tap adapter on this system.; Flags: checkedonce; Components: tap_adapter; GroupDescription: Tap adapter [Components] Name: binaries; Description: Install the {#PRODUCT_NAME} binaries.; Types: custom compact full Name: configuration; Description: Install the sample configuration files.; Types: custom compact full Name: tap_adapter; Description: Install the tap adapter driver and setup scripts.; Types: custom full [Icons] Name: {group}\{cm:UninstallProgram,{#PRODUCT_NAME}}; Filename: {uninstallexe} [UninstallDelete] Type: files; Name: {app}\log\freelan.log [Run] Filename: {app}\bin\tap-setup.exe; Parameters: "install ..\driver\{#TAPINF}.inf {#TAP}"; StatusMsg: "Installing the tap adapter..."; Tasks: install_tap Filename: {app}\bin\freelan.exe; Parameters: "--install"; StatusMsg: "Installing Windows Service..."; Tasks: install_service; Flags: runhidden [UninstallRun] Filename: {app}\bin\freelan.exe; Parameters: "--uninstall"; StatusMsg: "Uninstalling Windows Service..."; Tasks: install_service; Flags: runhidden Filename: {app}\bin\tap-setup.exe; Parameters: "remove {#TAP}"; StatusMsg: "Uninstalling all tap adapters..."; Tasks: install_tap [Registry] Root: HKLM; Subkey: "Software\FreeLAN"; ValueType: string; ValueName: "installation_path"; ValueData: "{app}"; Flags: uninsdeletekey freelan-2.0/packaging/windows/images/000077500000000000000000000000001252300335000176435ustar00rootroot00000000000000freelan-2.0/packaging/windows/images/wizard.bmp000066400000000000000000004556601252300335000216630ustar00rootroot00000000000000BM[6(:z[  ׷mMs@fNIYIZI[I\XiЬFkFkFlFlElElEmEmEmEmEmEmEmZ~ǛYvGfGfGeGeGdGce|άٻÌÚVhI\I\I[IZIYIX>MIYIYIZI[[lѯFjFkFkFkFkFkFlFlElVy{ėغPlGeGdGdGcGcGbHaH`H_H^H^I]I\I\I[IZIYIXr}@MIXIYIZI[RcʣFiFiFjFjFkPsvյ\vGdGcGcGbHaH`H_H_H^I]I\I\I[IZIZIXyIVJWIXIYIZI[pFgFhFhFiFiַGbHbHaH`H_H_H^I]I]I\I[IZIZP`̪`jJVIWIXIYIZͬOmGgGgFgGhFhuIaH_H^H^I]I]I\I[I[TdJVJVJWIXIYcqնGfGfGfGgGgOnӶXlI]I]I\YjÛJUJVJWIXIXIYԷXsGeGeGeGfGfwzI\I\I[^gJUJVJWIXIXSb—GdGdGdGeGeGeI\I[I[x̭JTJUJVJWIWIXbp̨GbGcGcGcGdGd_xI[IZIZp}_hJTJUJVJWJWIX\kHaHaHbHbGcGcGcÛIZIZIYiuJTJTJUJVJWJWIXIYӴ[pH_H_H`HaHaHaHbzǢIZIYIXdoğJTJTJUJVJVJWIXIYIZesʦ̪ŝtReH^H^H^H_H_H`H`H`]s̪IXIXIW^iJTJTJUJVJVJWIXIXIYIZIZI[I[I\I\I]I]I]H^H^H_H_UjбIXJWJVXcJSJTJUJUJVJWIWIXIYIYIZIZI[I[I\I\I\I]I]H^^qչJWJVJUS^вRZJTJUJUJVJWJWIXIXIYIZIZI[I[I[I\I\I]}JVJUJUOYJTJTJUJUJVJWJWIXIXIYIZIZIZI[csٿJUJTJTKTږĜckMXMXMYMZMZL[L[L\Ud|JTJTJSJSհɴ©JSJSJRJRJSJRJQJQLTJQJQJPPWJPJOKOպU[KOKNKNϲ[_KNKMKMʨadKMKMKLĠhjKLKLKKnoKKKKKJտŸ־uuKKKJKJ蚵\>Iw'Gu$Gu#Ft#Ft"Gt!Q{-u}|KJKIKH|_BLz-Lz,My+My*Ly*Lx)Mx)Mx(Mw(Mw'Y4αKIKHKGwtӹQ~2Mz-Lz,My,My+]=oTpS];Mw(Mw'Mw'Mv&Mv%ɩKHKGKGplT5Mz-Mz,Lz,{b־Լx[Mw&Mv&Mv%Ow(KGKFKFidv^Mz-Lz,Lz,Mv%Mv%Mu%hEġKFKELEd]M{-Lz,Lz,wMu%Mu$Mu$ȨKELELDWNvLz,Lz,iN\7Mu%Mu$tTЈYRLEKDKCKCKBLBWL}eJLz,My,ġ|Mu%Mu%Ow'틴KELDLDKCKCLBLBLAKAL@L@L?}T6My,Nz,ͯMu$Mu$Cnd_KDLDKCKCLBLBKAKAK@L@L@L?L>L>`RO{/My+S~2Mu%Mu$Bm[TKCKCKBKBLBVKsj~}qhTGL?L>L=L=LL>]OL7L6L6L5L5L4L4L~3L~3M3dMwȩ׿R{-Mv&Mv%Mv%_;i|vWPx)Mu%Mu%Mu%Nv'˭L=L=L=vZFL6L5L4N5R7jR{̫c@Mv%Mv%Mu%Mu$Mu%Mu%Mu%Mu$Mu%Mu%]9ӺN>L f2fginp:/ <freelan-2.0/packaging/windows/innosetup.py000066400000000000000000000121321252300335000207730ustar00rootroot00000000000000"""A INNO Setup builder for SCons""" import re import os import SCons.Warnings import SCons.Errors def uncomment(text): """Remove all INNO Setup comments from the specified text""" def replacer(match): s = match.group(0) if s.startswith(';'): return '' else: return s pattern = ';.*?$|"[^"]*"|\'[^"]*\'' return re.sub(re.compile(pattern, re.DOTALL | re.MULTILINE), replacer, text) def parse_define(line): """Check if the specified line contains an #define directive""" pattern = r'#(?:\s)*define\s*([\w_]+)(?:\s)*["\']?(.*)["\']' match = re.match(pattern, line, re.IGNORECASE) if match: return (match.group(1), match.group(2)) def replace_defines(text, defines): """Replace defines in the specified text.""" defines = defines.copy() lines = text.split('\n') result = [] for line in lines: define = parse_define(line) if (define): defines.setdefault(define[0], define[1]) for define in defines.items(): line = line.replace('{#%s}' % define[0], define[1]) result.append(line) return '\n'.join(result) def get_config(source, env): """Get a configuration from the specified source.""" import ConfigParser import StringIO config = ConfigParser.ConfigParser() config.readfp( StringIO.StringIO(replace_defines(source.get_contents(), env['ISCC_DEFINES']))) return config def parse_file(line): """Check if the specified line contains an Source: directive""" pattern = r'Source(?:\s)*:\s*([^;]+)(?:\s)*(?:;|$)' match = re.match(pattern, line, re.IGNORECASE) if match: return match.group(1) def get_sections(lines): """Get all the sections and the lines they contain.""" result = {} current_section = None for line in lines: m = re.match(r'\[(\w+)\]', line) if m: current_section = m.group(1) result[current_section] = [] elif current_section: result[current_section].append(line) return result def get_files(source, env): """Get the list of referenced files from the specified source.""" sections = get_sections( replace_defines(uncomment(source.get_contents()), env['ISCC_DEFINES']).split('\n')) result = [] for line in sections.get('Files', []): f = parse_file(line) if f: result.append(env.File(f)) config = get_config(source, env) for images in {'WizardSmallImageFile', 'WizardImageFile'}: image_file = config.get('Setup', 'WizardSmallImageFile') result.append(env.File(image_file)) return result def innosetup_scanner(node, env, path): """The scanner""" return get_files(node, env) def innosetup_emitter(target, source, env): """The emitter""" config = get_config(source[0], env) output_dir = config.get('Setup', 'OutputDir') output_base_filename = config.get('Setup', 'OutputBaseFilename') if output_dir and output_base_filename: target = os.path.join(output_dir, output_base_filename + '.exe') env.Depends(target, env['ISCC']) return (target, source) def innosetup_generator(target, source, env, for_signature): """The generator""" def to_define_option(item): if item[1]: return '"/d%s=%s"' % (item[0], item[1]) else: return '"/d%s"' % item[0] result = '"%s" %s %s %s "/o%s" "/f%s" %s' % \ ( env['ISCC'], ' '.join(env['ISCC_FLAGS']), ' '.join('"/i%s"' % x for x in env['ISCC_PATH']), ' '.join([to_define_option(x) for x in env['ISCC_DEFINES'].iteritems()]), os.path.dirname(str(target[0])), os.path.splitext(os.path.basename(str(target[0])))[0], source[0] ) return result class ISCCNotFound(SCons.Warnings.Warning): pass def detect(env): try: return env['ISCC'] except KeyError: pass iscc = env.WhereIs('iscc.exe') if iscc: return iscc paths = [ os.path.join(os.environ.get('PROGRAMFILES', ''), 'Inno Setup 5'), os.path.join(os.environ.get('PROGRAMFILES(X86)', ''), 'Inno Setup 5'), ] for path in paths: iscc = os.path.join(path, 'iscc.exe') if os.path.exists(iscc): return iscc raise SCons.Errors.StopError( ISCCNotFound, "Unable to find iscc.exe" ) def generate(env): env.Append(ISCC=detect(env)) env.Append(ISCC_PATH=[]) env.Append(ISCC_FLAGS=[]) env.Append(ISCC_DEFINES={}) import SCons.Scanner env.Append(SCANNERS=SCons.Scanner.Scanner( function=innosetup_scanner, skeys=['.iss'], path_function=SCons.Scanner.FindPathDirs('ISCC_PATH') )) import SCons.Builder innosetup_builder = SCons.Builder.Builder( generator=innosetup_generator, emitter=innosetup_emitter, suffix='.exe', src_suffix='.iss' ) env.Append(BUILDERS={'INNOSetup': innosetup_builder}) def exists(env): return env.Detect(env['ISCC']) freelan-2.0/provisioning/000077500000000000000000000000001252300335000155065ustar00rootroot00000000000000freelan-2.0/provisioning/group_vars/000077500000000000000000000000001252300335000176755ustar00rootroot00000000000000freelan-2.0/provisioning/group_vars/load-test-group000066400000000000000000000002231252300335000226430ustar00rootroot00000000000000repository_version: "{{ lookup('pipe', 'git rev-parse --abbrev-ref HEAD') }}" sources_root: "/home/vagrant/sources" local_sources_root: "/vagrant" freelan-2.0/provisioning/group_vars/speed-test-group000066400000000000000000000002231252300335000230240ustar00rootroot00000000000000repository_version: "{{ lookup('pipe', 'git rev-parse --abbrev-ref HEAD') }}" sources_root: "/home/vagrant/sources" local_sources_root: "/vagrant" freelan-2.0/provisioning/host_vars/000077500000000000000000000000001252300335000175165ustar00rootroot00000000000000freelan-2.0/provisioning/host_vars/load-test000066400000000000000000000012001252300335000213260ustar00rootroot00000000000000ca_root: "/home/vagrant/ca" nodes_config_root: "/home/vagrant/nodes" scripts_root: "/home/vagrant/scripts" freelan_nodes: - name: alice ipv4: 9.0.0.1 port: 12000 - name: bob ipv4: 9.0.0.2 port: 12001 - name: chris ipv4: 9.0.0.3 port: 12002 - name: denis ipv4: 9.0.0.4 port: 12003 - name: eleanor ipv4: 9.0.0.5 port: 12004 - name: fred ipv4: 9.0.0.6 port: 12005 - name: greg ipv4: 9.0.0.7 port: 12006 - name: hector ipv4: 9.0.0.8 port: 12007 - name: ian ipv4: 9.0.0.9 port: 12008 - name: julien ipv4: 9.0.0.10 port: 12009 threads_count: 4 freelan-2.0/provisioning/host_vars/speed-test-a000066400000000000000000000001661252300335000217370ustar00rootroot00000000000000vpn_ipv4_address: '9.0.0.1' contacts: - ipv4_address: '192.168.10.21' vpn_ipv4_address: '9.0.0.2' name: 'b' freelan-2.0/provisioning/host_vars/speed-test-b000066400000000000000000000001661252300335000217400ustar00rootroot00000000000000vpn_ipv4_address: '9.0.0.2' contacts: - ipv4_address: '192.168.10.20' vpn_ipv4_address: '9.0.0.1' name: 'a' freelan-2.0/provisioning/playbook.yml000066400000000000000000000003701252300335000200510ustar00rootroot00000000000000--- - name: "Load testing machines" hosts: load-test-group roles: - apt - freelan-build - freelan-load-test - name: "Speed testing machines" hosts: speed-test-group roles: - apt - freelan-build - freelan-speed-test freelan-2.0/provisioning/roles/000077500000000000000000000000001252300335000166325ustar00rootroot00000000000000freelan-2.0/provisioning/roles/apt/000077500000000000000000000000001252300335000174165ustar00rootroot00000000000000freelan-2.0/provisioning/roles/apt/tasks/000077500000000000000000000000001252300335000205435ustar00rootroot00000000000000freelan-2.0/provisioning/roles/apt/tasks/main.yml000066400000000000000000000003321252300335000222100ustar00rootroot00000000000000--- - name: Update the APT repository apt: update_cache=yes sudo: True tags: - needs_internet_connection - name: Upgrade the packages apt: upgrade=full sudo: True tags: - needs_internet_connection freelan-2.0/provisioning/roles/freelan-build/000077500000000000000000000000001252300335000213435ustar00rootroot00000000000000freelan-2.0/provisioning/roles/freelan-build/tasks/000077500000000000000000000000001252300335000224705ustar00rootroot00000000000000freelan-2.0/provisioning/roles/freelan-build/tasks/main.yml000066400000000000000000000007371252300335000241460ustar00rootroot00000000000000--- - name: Install freelan build dependencies apt: name={{ item }} state=present with_items: - g++ - scons - git - libboost-all-dev - libssl-dev - libcurl4-openssl-dev tags: - build sudo: True - name: Checkout freelan sources git: repo={{ local_sources_root }} dest={{ sources_root }} version={{ repository_version }} accept_hostkey=yes tags: - build - name: Build freelan from sources command: chdir={{ sources_root }} scons all freelan-2.0/provisioning/roles/freelan-load-test/000077500000000000000000000000001252300335000221405ustar00rootroot00000000000000freelan-2.0/provisioning/roles/freelan-load-test/tasks/000077500000000000000000000000001252300335000232655ustar00rootroot00000000000000freelan-2.0/provisioning/roles/freelan-load-test/tasks/main.yml000066400000000000000000000034241252300335000247370ustar00rootroot00000000000000--- - name: Install freelan load test dependencies apt: name={{ item }} state=present with_items: - gdb - valgrind - screen sudo: True - name: Create nodes configuration directory file: dest={{ nodes_config_root }} state=directory - name: Create CA directory file: dest={{ ca_root }} state=directory - name: Create nodes scripts directory file: dest={{ scripts_root }} state=directory - name: Create nodes certificates and private keys command: openssl req -new -nodes -x509 -subj "/CN={{ item.name }}" -days 3650 -keyout {{ nodes_config_root }}/{{ item.name }}.key -out {{ nodes_config_root }}/{{ item.name }}.crt -extensions v3_ca creates={{ nodes_config_root }}/{{ item.name }}.crt with_items: freelan_nodes - name: Create nodes configuration files template: src=configuration.cfg dest={{ nodes_config_root }}/{{ item.name }}.cfg with_items: freelan_nodes - name: Create scripts files template: src=launch-script.sh dest={{ scripts_root }}/{{ item.name }}.sh mode=755 with_items: freelan_nodes - name: Create debug scripts files template: src=launch-debug-script.sh dest={{ scripts_root }}/debug-{{ item.name }}.sh mode=755 with_items: freelan_nodes - name: Create detached scripts files template: src=launch-detached-script.sh dest={{ scripts_root }}/detached-{{ item.name }}.sh mode=755 with_items: freelan_nodes - name: Create detached debug scripts files template: src=launch-detached-debug-script.sh dest={{ scripts_root }}/detached-debug-{{ item.name }}.sh mode=755 with_items: freelan_nodes - name: Create all detached script file template: src=launch-all-script.sh dest={{ scripts_root }}/all.sh mode=755 - name: Create all detached debug script file template: src=launch-all-debug-script.sh dest={{ scripts_root }}/all-debug.sh mode=755 freelan-2.0/provisioning/roles/freelan-load-test/templates/000077500000000000000000000000001252300335000241365ustar00rootroot00000000000000freelan-2.0/provisioning/roles/freelan-load-test/templates/configuration.cfg000066400000000000000000000007511252300335000274710ustar00rootroot00000000000000[fscp] listen_on=0.0.0.0:{{ item.port }} # Contacts {% for node in freelan_nodes %} {% if node.name != item.name %} contact=127.0.0.1:{{ node.port }} {% endif %} {% endfor %} [tap_adapter] enabled=no ipv4_address_prefix_length={{ item.ipv4 }}/24 dhcp_server_ipv4_address_prefix_length=9.0.0.0/24 [security] signature_certificate_file={{ nodes_config_root }}/{{ item.name }}.crt signature_private_key_file={{ nodes_config_root }}/{{ item.name }}.key certificate_validation_method=none freelan-2.0/provisioning/roles/freelan-load-test/templates/launch-all-debug-script.sh000066400000000000000000000001571252300335000311030ustar00rootroot00000000000000#!/bin/bash {% for node in freelan_nodes %} {{ scripts_root }}/detached-debug-{{ node.name }}.sh {% endfor %} freelan-2.0/provisioning/roles/freelan-load-test/templates/launch-all-script.sh000066400000000000000000000001511252300335000300110ustar00rootroot00000000000000#!/bin/bash {% for node in freelan_nodes %} {{ scripts_root }}/detached-{{ node.name }}.sh {% endfor %} freelan-2.0/provisioning/roles/freelan-load-test/templates/launch-debug-script.sh000066400000000000000000000002271252300335000303330ustar00rootroot00000000000000#!/bin/bash sudo gdb {{ sources_root }}/build/debug/bin/freelan -ex 'run -c {{ nodes_config_root }}/{{ item.name }}.cfg -f -d -t {{ threads_count }}' freelan-2.0/provisioning/roles/freelan-load-test/templates/launch-detached-debug-script.sh000066400000000000000000000001541252300335000320710ustar00rootroot00000000000000#!/bin/bash screen -S {{ item.name }} -d -m sh -c '{{ scripts_root }}/debug-{{ item.name }}.sh; exec bash' freelan-2.0/provisioning/roles/freelan-load-test/templates/launch-detached-script.sh000066400000000000000000000001461252300335000310060ustar00rootroot00000000000000#!/bin/bash screen -S {{ item.name }} -d -m sh -c '{{ scripts_root }}/{{ item.name }}.sh; exec bash' freelan-2.0/provisioning/roles/freelan-load-test/templates/launch-script.sh000066400000000000000000000002051252300335000272430ustar00rootroot00000000000000#!/bin/bash sudo {{ sources_root }}/install/bin/freelan -c {{ nodes_config_root }}/{{ item.name }}.cfg -f -d -t {{ threads_count }} freelan-2.0/provisioning/roles/freelan-speed-test/000077500000000000000000000000001252300335000223215ustar00rootroot00000000000000freelan-2.0/provisioning/roles/freelan-speed-test/tasks/000077500000000000000000000000001252300335000234465ustar00rootroot00000000000000freelan-2.0/provisioning/roles/freelan-speed-test/tasks/main.yml000066400000000000000000000033411252300335000251160ustar00rootroot00000000000000--- - name: Install freelan load test dependencies apt: name={{ item }} state=present with_items: - screen - iperf sudo: True - name: Create configuration directory file: dest={{ config_root }} state=directory - name: Create scripts directory file: dest={{ scripts_root }} state=directory - name: Create the certificate and private key command: openssl req -new -nodes -x509 -subj "/CN={{ ansible_hostname }}" -days 3650 -keyout {{ key_path }} -out {{ cert_path }} -extensions v3_ca creates={{ cert_path }} - name: Create the configuration file template: src=configuration.cfg dest={{ config_path }} - name: Create launch script file template: src=launch-script.sh dest={{ scripts_root }}/launch.sh mode=755 - name: Create detached launch script file template: src=launch-detached-script.sh dest={{ scripts_root }}/launch-detached.sh mode=755 - name: Create server performance test script file template: src=perf-server-script.sh dest={{ scripts_root }}/perf-server.sh mode=755 - name: Create server detached performance test script file template: src=perf-server-detached-script.sh dest={{ scripts_root }}/perf-server-detached.sh mode=755 - name: Create client performance test script files template: src=perf-client-script.sh dest={{ scripts_root }}/perf-client-{{ item.name }}.sh mode=755 with_items: contacts - name: Create client VPN performance test script files template: src=perf-client-vpn-script.sh dest={{ scripts_root }}/perf-client-vpn-{{ item.name }}.sh mode=755 with_items: contacts - name: Create client VPN performance comparison test script files template: src=perf-client-comparison-script.sh dest={{ scripts_root }}/perf-client-comparison-{{ item.name }}.sh mode=755 with_items: contacts freelan-2.0/provisioning/roles/freelan-speed-test/templates/000077500000000000000000000000001252300335000243175ustar00rootroot00000000000000freelan-2.0/provisioning/roles/freelan-speed-test/templates/configuration.cfg000066400000000000000000000005771252300335000276600ustar00rootroot00000000000000[fscp] listen_on=0.0.0.0:12000 # Contacts {% for contact in contacts %} contact={{ contact.ipv4_address }} {% endfor %} [tap_adapter] enabled=yes ipv4_address_prefix_length={{ vpn_ipv4_address }}/24 dhcp_server_ipv4_address_prefix_length=9.0.0.0/24 [security] signature_certificate_file={{ cert_path }} signature_private_key_file={{ key_path }} certificate_validation_method=none freelan-2.0/provisioning/roles/freelan-speed-test/templates/launch-detached-script.sh000066400000000000000000000001341252300335000311640ustar00rootroot00000000000000#!/bin/bash screen -S client -d -m sh -c "{{ scripts_root }}/launch.sh ${1:-1}; exec bash" freelan-2.0/provisioning/roles/freelan-speed-test/templates/launch-script.sh000066400000000000000000000001371252300335000274300ustar00rootroot00000000000000#!/bin/bash sudo {{ sources_root }}/install/bin/freelan -c {{ config_path }} -f -d -t ${1:-1} freelan-2.0/provisioning/roles/freelan-speed-test/templates/perf-client-comparison-script.sh000066400000000000000000000005751252300335000325440ustar00rootroot00000000000000#!/bin/bash DURATION=1 NOMINAL_SPEED=`iperf -c {{ item.ipv4_address }} -f k -t ${DURATION} -y C | cut -f9 -d,` VPN_SPEED=`iperf -c {{ item.vpn_ipv4_address }} -f k -t ${DURATION} -y C | cut -f9 -d,` SPEED_RATIO=`expr \( ${VPN_SPEED} \* 100 \) / ${NOMINAL_SPEED}` echo "Nominal speed: ${NOMINAL_SPEED} kbits/s" echo "VPN speed: ${VPN_SPEED} kbits/s" echo "Ratio: ${SPEED_RATIO}%" freelan-2.0/provisioning/roles/freelan-speed-test/templates/perf-client-script.sh000066400000000000000000000000561252300335000303660ustar00rootroot00000000000000#!/bin/bash iperf -c {{ item.ipv4_address }} freelan-2.0/provisioning/roles/freelan-speed-test/templates/perf-client-vpn-script.sh000066400000000000000000000000621252300335000311640ustar00rootroot00000000000000#!/bin/bash iperf -c {{ item.vpn_ipv4_address }} freelan-2.0/provisioning/roles/freelan-speed-test/templates/perf-server-detached-script.sh000066400000000000000000000001271252300335000321540ustar00rootroot00000000000000#!/bin/bash screen -S perf -d -m sh -c "{{ scripts_root }}/perf-server.sh; exec bash" freelan-2.0/provisioning/roles/freelan-speed-test/templates/perf-server-script.sh000066400000000000000000000000261252300335000304130ustar00rootroot00000000000000#!/bin/bash iperf -s freelan-2.0/provisioning/roles/freelan-speed-test/vars/000077500000000000000000000000001252300335000232745ustar00rootroot00000000000000freelan-2.0/provisioning/roles/freelan-speed-test/vars/main.yml000066400000000000000000000003221252300335000247400ustar00rootroot00000000000000--- config_root: '/home/vagrant/config' scripts_root: '/home/vagrant/scripts' config_path: '{{ config_root }}/configuration.cfg' cert_path: '{{ config_root }}/local.crt' key_path: '{{ config_root }}/local.key' freelan-2.0/run.sh000077500000000000000000000005241252300335000141240ustar00rootroot00000000000000#!/bin/bash SCRIPTPATH=$( cd $(dirname $0) ; pwd -P ) export LD_LIBRARY_PATH="${SCRIPTPATH}/install/lib" export DYLD_LIBRARY_PATH="${SCRIPTPATH}/install/lib" ${SCRIPTPATH}/install/bin/freelan $@ #valgrind ${SCRIPTPATH}/install/bin/freelan $@ #gdb --args ${SCRIPTPATH}/install/bin/freelan $@ #lldb -- ${SCRIPTPATH}/install/bin/freelan $@ freelan-2.0/samples/000077500000000000000000000000001252300335000144245ustar00rootroot00000000000000freelan-2.0/samples/asiotap/000077500000000000000000000000001252300335000160645ustar00rootroot00000000000000freelan-2.0/samples/asiotap/endpoint/000077500000000000000000000000001252300335000177045ustar00rootroot00000000000000freelan-2.0/samples/asiotap/endpoint/SConscript000066400000000000000000000004251252300335000217170ustar00rootroot00000000000000import os libraries = [ 'asiotap', 'boost_system', 'boost_iostreams', ] Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/asiotap/endpoint/endpoint.cpp000066400000000000000000000102271252300335000222320ustar00rootroot00000000000000/** * \file endpoint.cpp * \author Julien Kauffmann * \brief A endpoint test sample. */ #include #include #include #include #include #include #include int main() { try { asiotap::endpoint ep1 = asiotap::hostname_endpoint("localhost", "1234"); asiotap::endpoint ep2 = asiotap::ipv4_endpoint(boost::asio::ip::address_v4::loopback(), 1234); asiotap::endpoint ep3 = asiotap::ipv6_endpoint(boost::asio::ip::address_v6::loopback(), 1234); asiotap::ipv4_network_address na1 = asiotap::ipv4_network_address(boost::asio::ip::address_v4::loopback(), 24); asiotap::ipv6_network_address na2 = asiotap::ipv6_network_address(boost::asio::ip::address_v6::loopback(), 64); asiotap::ipv4_network_address na3 = asiotap::ipv4_network_address(boost::asio::ip::address_v4::loopback()); asiotap::ipv4_route r1 = asiotap::ipv4_route(na1); asiotap::ipv6_route r2 = asiotap::ipv6_route(na2); asiotap::ipv4_route r3 = asiotap::ipv4_route(na3); // Output std::cout << "ep1: " << ep1 << std::endl; std::cout << "ep2: " << ep2 << std::endl; std::cout << "ep3: " << ep3 << std::endl; std::cout << "na1: " << na1 << std::endl; std::cout << "na2: " << na2 << std::endl; std::cout << "na3: " << na3 << std::endl; std::cout << "r1: " << r1 << std::endl; std::cout << "r2: " << r2 << std::endl; std::cout << "r3: " << r3 << std::endl; // Comparison std::cout << "ep1 == ep2: " << (ep1 == ep2) << std::endl; std::cout << "ep1 != ep2: " << (ep1 != ep2) << std::endl; // Conversions std::cout << boost::lexical_cast("127.0.0.1:45") << std::endl; std::cout << boost::lexical_cast("[3::4:5ae]:78") << std::endl; std::cout << boost::lexical_cast("some.host.com:service") << std::endl; std::cout << boost::lexical_cast("9.0.0.1/24") << std::endl; std::cout << boost::lexical_cast("fe80::1/10") << std::endl; std::cout << boost::lexical_cast("9.0.0.1/24") << std::endl; std::cout << boost::lexical_cast("fe80::1/10") << std::endl; std::cout << boost::lexical_cast("127.0.0.1") << std::endl; std::cout << boost::lexical_cast("fe80::1") << std::endl; std::cout << boost::lexical_cast("9.0.0.1/24") << std::endl; std::cout << boost::lexical_cast("9.0.0.1/24 => 9.0.0.255") << std::endl; std::cout << boost::lexical_cast("fe80::1/10") << std::endl; std::cout << boost::lexical_cast("fe80::1/10 => fe80::ff") << std::endl; std::cout << boost::lexical_cast("9.0.0.1/24") << std::endl; std::cout << boost::lexical_cast("fe80::1/10") << std::endl; std::cout << boost::lexical_cast("127.0.0.1") << std::endl; std::cout << boost::lexical_cast("fe80::1") << std::endl; std::cout << boost::lexical_cast("127.0.0.1 => 127.0.0.255") << std::endl; std::cout << boost::lexical_cast("fe80::1 => fe80::ff") << std::endl; std::cout << boost::lexical_cast("fe80::1/10=>fe80::ff") << std::endl; std::cout << boost::lexical_cast("fe80::1/10 =>fe80::ff") << std::endl; std::cout << boost::lexical_cast("fe80::1/10=> fe80::ff") << std::endl; std::cout << boost::lexical_cast("fe80::1/10\t=>\tfe80::ff") << std::endl; // Create a route from its components. const auto ina = boost::lexical_cast("192.168.0.0/24"); const boost::optional gw = get_network_address(boost::lexical_cast("192.168.0.254")); const auto route = to_ip_route(ina, gw); std::cout << route << std::endl; } catch (std::exception& ex) { std::cerr << "Exception caught: " << ex.what() << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } freelan-2.0/samples/asiotap/proxy/000077500000000000000000000000001252300335000172455ustar00rootroot00000000000000freelan-2.0/samples/asiotap/proxy/SConscript000066400000000000000000000005751252300335000212660ustar00rootroot00000000000000import os import sys libraries = [ 'asiotap', 'executeplus', 'boost_system', 'boost_iostreams', ] if sys.platform.startswith('linux'): libraries.append('netlinkplus') Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/asiotap/proxy/proxy.cpp000066400000000000000000000137101252300335000211340ustar00rootroot00000000000000/** * \file proxy.cpp * \author Julien Kauffmann * \brief A program to test TAP proxies abilities. */ #include #include #include #include #include #include #include #include #include #include static volatile bool signaled = false; static boost::function stop_function = 0; static void signal_handler(int code) { switch (code) { case SIGTERM: case SIGINT: case SIGABRT: if (!signaled && stop_function) { signaled = true; std::cerr << "Signal caught: stopping..." << std::endl; stop_function(); stop_function = 0; } break; default: break; } } static bool register_signal_handlers() { if (signal(SIGTERM, signal_handler) == SIG_ERR) { std::cerr << "Failed to catch SIGTERM signals." << std::endl; return false; } if (signal(SIGINT, signal_handler) == SIG_ERR) { std::cerr << "Failed to catch SIGINT signals." << std::endl; return false; } if (signal(SIGABRT, signal_handler) == SIG_ERR) { std::cerr << "Failed to catch SIGABRT signals." << std::endl; return false; } return true; } static boost::array read_buffer; static boost::array write_buffer; asiotap::osi::filter ethernet_filter; void write_done(asiotap::tap_adapter& tap_adapter, const boost::system::error_code& ec, size_t cnt) { (void) tap_adapter; std::cout << "Write: " << cnt << " bytes. Error: " << ec << std::endl; } void read_done(asiotap::tap_adapter& tap_adapter, const boost::system::error_code& ec, size_t cnt) { std::cout << "Read: " << cnt << " bytes. Error: " << ec << std::endl; if (!ec) { ethernet_filter.parse(boost::asio::buffer(read_buffer, cnt)); tap_adapter.async_read(boost::asio::buffer(read_buffer, sizeof(read_buffer)), boost::bind(&read_done, boost::ref(tap_adapter), _1, _2)); } } void do_write(asiotap::tap_adapter& tap_adapter, boost::asio::const_buffer buffer) { tap_adapter.async_write(boost::asio::buffer(buffer), boost::bind(&write_done, boost::ref(tap_adapter), _1, _2)); } void arp_frame_available(asiotap::tap_adapter& tap_adapter, const asiotap::osi::proxy& arp_proxy, const asiotap::osi::complex_filter::type& arp_filter, asiotap::osi::const_helper arp_helper) { boost::optional buffer = arp_proxy.process_frame(*arp_filter.parent().get_last_helper(), arp_helper, boost::asio::buffer(write_buffer)); if (buffer) { do_write(tap_adapter, *buffer); } } void dhcp_frame_available(asiotap::tap_adapter& tap_adapter, const asiotap::osi::proxy& dhcp_proxy, const asiotap::osi::complex_filter::type& dhcp_filter, asiotap::osi::const_helper dhcp_helper) { boost::optional buffer = dhcp_proxy.process_frame( *dhcp_filter.parent().parent().parent().parent().get_last_helper(), *dhcp_filter.parent().parent().parent().get_last_helper(), *dhcp_filter.parent().parent().get_last_helper(), *dhcp_filter.parent().get_last_helper(), dhcp_helper, boost::asio::buffer(write_buffer) ); if (buffer) { do_write(tap_adapter, *buffer); } } void close_tap_adapter(asiotap::tap_adapter& tap_adapter) { tap_adapter.cancel(); tap_adapter.set_connected_state(false); tap_adapter.close(); } int main() { if (!register_signal_handlers()) { return EXIT_FAILURE; } namespace ba = boost::asio; namespace ao = asiotap::osi; try { ba::io_service _io_service; asiotap::tap_adapter tap_adapter(_io_service, asiotap::tap_adapter_layer::ethernet); stop_function = boost::bind(&close_tap_adapter, boost::ref(tap_adapter)); tap_adapter.open(); tap_adapter.set_connected_state(true); tap_adapter.async_read(ba::buffer(read_buffer, sizeof(read_buffer)), boost::bind(&read_done, boost::ref(tap_adapter), _1, _2)); // The requested address ba::ip::address_v4 dhcp_server_ipv4_address = ba::ip::address_v4::from_string("9.0.0.0"); ba::ip::address_v4 my_ipv4_address = ba::ip::address_v4::from_string("9.0.0.1"); unsigned long my_ipv4_prefix_length = 24; ba::ip::address_v4 other_ipv4_address = ba::ip::address_v4::from_string("9.0.0.2"); // We need some filters ao::complex_filter::type arp_filter(ethernet_filter); ao::complex_filter::type ipv4_filter(ethernet_filter); ao::complex_filter::type udp_filter(ipv4_filter); ao::complex_filter::type bootp_filter(udp_filter); ao::complex_filter::type dhcp_filter(bootp_filter); // We add the ARP proxy ao::proxy arp_proxy; arp_proxy.add_entry(other_ipv4_address, tap_adapter.ethernet_address().data()); arp_filter.add_handler(boost::bind(&arp_frame_available, boost::ref(tap_adapter), boost::cref(arp_proxy), boost::cref(arp_filter), _1)); // We add the DHCP proxy ao::proxy dhcp_proxy; dhcp_proxy.set_hardware_address(tap_adapter.ethernet_address().data()); dhcp_proxy.set_software_address(dhcp_server_ipv4_address); dhcp_proxy.add_entry(tap_adapter.ethernet_address().data(), my_ipv4_address, my_ipv4_prefix_length); dhcp_filter.add_handler(boost::bind(&dhcp_frame_available, boost::ref(tap_adapter), boost::cref(dhcp_proxy), boost::cref(dhcp_filter), _1)); // Let's run ! _io_service.run(); } catch (std::exception& ex) { std::cerr << "Exception caught: " << ex.what() << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } freelan-2.0/samples/asiotap/routes/000077500000000000000000000000001252300335000174055ustar00rootroot00000000000000freelan-2.0/samples/asiotap/routes/SConscript000066400000000000000000000006161252300335000214220ustar00rootroot00000000000000import os import sys libraries = [ 'asiotap', 'executeplus', 'boost_system', 'boost_iostreams', ] if sys.platform.startswith('linux'): libraries.extend([ 'netlinkplus', ]) Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/asiotap/routes/libasiotap_samples_routes.vcxproj000066400000000000000000000255331252300335000263060ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {AC316C25-377E-422E-B0DF-4233840A3C9F} Win32Proj libasiotap_samples_routes Application true v120 Unicode Application true v120 Unicode Application false v120 true Unicode Application false v120 true Unicode true $(SolutionDir)\third-party\install\$(PlatformShortName)\include;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\include;$(IncludePath) $(SolutionDir)\third-party\install\$(PlatformShortName)\lib;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\lib;$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSDK_LibraryPath_x86); $(ProjectDir)\build\$(PlatformShortName)\$(Configuration)\ $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ true $(SolutionDir)\third-party\install\$(PlatformShortName)\include;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\include;$(IncludePath) $(SolutionDir)\third-party\install\$(PlatformShortName)\lib;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\lib;$(VCInstallDir)lib\amd64;$(VCInstallDir)atlmfc\lib\amd64;$(WindowsSDK_LibraryPath_x64); $(ProjectDir)\build\$(PlatformShortName)\$(Configuration)\ $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ false $(SolutionDir)\third-party\install\$(PlatformShortName)\include;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\include;$(IncludePath) $(SolutionDir)\third-party\install\$(PlatformShortName)\lib;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\lib;$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSDK_LibraryPath_x86); $(ProjectDir)\build\$(PlatformShortName)\$(Configuration)\ $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ false $(SolutionDir)\third-party\install\$(PlatformShortName)\include;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\include;$(IncludePath) $(SolutionDir)\third-party\install\$(PlatformShortName)\lib;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\lib;$(VCInstallDir)lib\amd64;$(VCInstallDir)atlmfc\lib\amd64;$(WindowsSDK_LibraryPath_x64); $(ProjectDir)\build\$(PlatformShortName)\$(Configuration)\ $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ Level3 Disabled _SCL_SECURE_NO_WARNINGS;BOOST_ALL_NO_LIB;_WIN32_WINNT=0x0501;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true Console true libboost_system.lib;libboost_thread.lib;libasiotap.lib;Iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) HighestAvailable Level3 Disabled _SCL_SECURE_NO_WARNINGS;BOOST_ALL_NO_LIB;_WIN32_WINNT=0x0501;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true Console true libboost_system.lib;libboost_thread.lib;libasiotap.lib;Iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) HighestAvailable Level3 MaxSpeed true true BOOST_ALL_NO_LIB;_WIN32_WINNT=0x0501;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true Console true true true libboost_system.lib;libboost_thread.lib;libasiotap.lib;Iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) HighestAvailable Level3 MaxSpeed true true BOOST_ALL_NO_LIB;_WIN32_WINNT=0x0501;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true Console true true true libboost_system.lib;libboost_thread.lib;libasiotap.lib;Iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) HighestAvailable freelan-2.0/samples/asiotap/routes/libasiotap_samples_routes.vcxproj.filters000066400000000000000000000016521252300335000277510ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files freelan-2.0/samples/asiotap/routes/routes.cpp000066400000000000000000000105371252300335000214400ustar00rootroot00000000000000/** * \file routes.cpp * \author Julien Kauffmann * \brief A simple routes test program. */ #include #include #include #include #include #include #include #include #include static volatile bool signaled = false; static boost::function stop_function = 0; static void signal_handler(int code) { switch (code) { case SIGTERM: case SIGINT: case SIGABRT: if (!signaled && stop_function) { signaled = true; std::cerr << "Signal caught: stopping..." << std::endl; stop_function(); stop_function = 0; } break; default: break; } } static bool register_signal_handlers() { if (signal(SIGTERM, signal_handler) == SIG_ERR) { std::cerr << "Failed to catch SIGTERM signals." << std::endl; return false; } if (signal(SIGINT, signal_handler) == SIG_ERR) { std::cerr << "Failed to catch SIGINT signals." << std::endl; return false; } if (signal(SIGABRT, signal_handler) == SIG_ERR) { std::cerr << "Failed to catch SIGABRT signals." << std::endl; return false; } return true; } static char my_buf[2048]; void read_done(asiotap::tap_adapter& tap_adapter, const boost::system::error_code& ec, size_t cnt) { if (!ec) { std::cout << "Read: " << cnt << " bytes." << std::endl; tap_adapter.async_read(boost::asio::buffer(my_buf, sizeof(my_buf)), boost::bind(&read_done, boost::ref(tap_adapter), _1, _2)); } else { std::cout << "Read: " << cnt << " bytes. Error: " << ec << std::endl; } } void close_tap_adapter(asiotap::tap_adapter& tap_adapter) { tap_adapter.cancel(); tap_adapter.set_connected_state(false); tap_adapter.close(); } int main() { if (!register_signal_handlers()) { return EXIT_FAILURE; } try { boost::asio::io_service _io_service; asiotap::tap_adapter tap_adapter(_io_service, asiotap::tap_adapter_layer::ip); stop_function = boost::bind(&close_tap_adapter, boost::ref(tap_adapter)); tap_adapter.open(); asiotap::tap_adapter_configuration configuration {}; configuration.ipv4.network_address = { boost::asio::ip::address_v4::from_string("9.0.0.1"), 24 }; configuration.ipv4.remote_address = boost::asio::ip::address_v4::from_string("9.0.0.0"); configuration.ipv6.network_address = { boost::asio::ip::address_v6::from_string("fe80::c887:eb51:aaaa:bbbb"), 64 }; tap_adapter.configure(configuration); tap_adapter.set_connected_state(true); tap_adapter.async_read(boost::asio::buffer(my_buf, sizeof(my_buf)), boost::bind(&read_done, boost::ref(tap_adapter), _1, _2)); const auto addresses = tap_adapter.get_ip_addresses(); std::cout << "Current IP addresses for the interface:" << std::endl; for(auto&& address : addresses) { std::cout << address << std::endl; } std::cout << "Adding routes" << std::endl; asiotap::route_manager rmgr(_io_service); rmgr.set_route_registration_success_handler([](const asiotap::route_manager::route_type& route){ std::cout << "Added route: " << route << std::endl; }); rmgr.set_route_registration_failure_handler([](const asiotap::route_manager::route_type& route, const boost::system::system_error& ex){ std::cout << "Failure adding route (" << route << "): " << ex.what() << std::endl; }); rmgr.set_route_unregistration_success_handler([](const asiotap::route_manager::route_type& route){ std::cout << "Removed route: " << route << std::endl; }); rmgr.set_route_unregistration_failure_handler([](const asiotap::route_manager::route_type& route, const boost::system::system_error& ex){ std::cout << "Failure removing route (" << route << "): " << ex.what() << std::endl; }); { std::cout << "Testing route addition..." << std::endl; const auto r1 = rmgr.get_route_entry(tap_adapter.get_route(asiotap::to_ip_route(boost::asio::ip::address_v4::from_string("9.0.1.0"), 24))); const auto r2 = rmgr.get_route_entry(tap_adapter.get_route(asiotap::to_ip_route(boost::asio::ip::address_v4::from_string("9.0.2.0"), 24, boost::asio::ip::address_v4::from_string("9.0.0.2")))); std::cout << "Press any key now to delete the routes." << std::endl; std::cin.get(); } _io_service.run(); } catch (std::exception& ex) { std::cerr << "Exception caught: " << ex.what() << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } freelan-2.0/samples/asiotap/tap/000077500000000000000000000000001252300335000166505ustar00rootroot00000000000000freelan-2.0/samples/asiotap/tap/SConscript000066400000000000000000000005751252300335000206710ustar00rootroot00000000000000import os import sys libraries = [ 'asiotap', 'executeplus', 'boost_system', 'boost_iostreams', ] if sys.platform.startswith('linux'): libraries.append('netlinkplus') Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/asiotap/tap/libasiotap_samples_tap.vcxproj000066400000000000000000000255251252300335000250150ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {C1A4D2AC-0D8B-420B-8E9A-63B8148DD732} Win32Proj libasiotap_samples_tap Application true v120 Unicode Application true v120 Unicode Application false v120 true Unicode Application false v120 true Unicode true $(SolutionDir)\third-party\install\$(PlatformShortName)\include;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\include;$(IncludePath) $(SolutionDir)\third-party\install\$(PlatformShortName)\lib;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\lib;$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSDK_LibraryPath_x86); $(ProjectDir)\build\$(PlatformShortName)\$(Configuration)\ $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ true $(SolutionDir)\third-party\install\$(PlatformShortName)\include;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\include;$(IncludePath) $(SolutionDir)\third-party\install\$(PlatformShortName)\lib;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\lib;$(VCInstallDir)lib\amd64;$(VCInstallDir)atlmfc\lib\amd64;$(WindowsSDK_LibraryPath_x64); $(ProjectDir)\build\$(PlatformShortName)\$(Configuration)\ $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ false $(SolutionDir)\third-party\install\$(PlatformShortName)\include;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\include;$(IncludePath) $(SolutionDir)\third-party\install\$(PlatformShortName)\lib;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\lib;$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSDK_LibraryPath_x86); $(ProjectDir)\build\$(PlatformShortName)\$(Configuration)\ $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ false $(SolutionDir)\third-party\install\$(PlatformShortName)\include;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\include;$(IncludePath) $(SolutionDir)\third-party\install\$(PlatformShortName)\lib;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\lib;$(VCInstallDir)lib\amd64;$(VCInstallDir)atlmfc\lib\amd64;$(WindowsSDK_LibraryPath_x64); $(ProjectDir)\build\$(PlatformShortName)\$(Configuration)\ $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ Level3 Disabled _SCL_SECURE_NO_WARNINGS;BOOST_ALL_NO_LIB;_WIN32_WINNT=0x0501;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true Console true libboost_system.lib;libboost_thread.lib;libasiotap.lib;Iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) HighestAvailable Level3 Disabled _SCL_SECURE_NO_WARNINGS;BOOST_ALL_NO_LIB;_WIN32_WINNT=0x0501;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true Console true libboost_system.lib;libboost_thread.lib;libasiotap.lib;Iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) HighestAvailable Level3 MaxSpeed true true BOOST_ALL_NO_LIB;_WIN32_WINNT=0x0501;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true Console true true true libboost_system.lib;libboost_thread.lib;libasiotap.lib;Iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) HighestAvailable Level3 MaxSpeed true true BOOST_ALL_NO_LIB;_WIN32_WINNT=0x0501;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true Console true true true libboost_system.lib;libboost_thread.lib;libasiotap.lib;Iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) HighestAvailable freelan-2.0/samples/asiotap/tap/libasiotap_samples_tap.vcxproj.filters000066400000000000000000000016461252300335000264620ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files freelan-2.0/samples/asiotap/tap/tap.cpp000066400000000000000000000172711252300335000201500ustar00rootroot00000000000000/** * \file tap.cpp * \author Julien Kauffmann * \brief A simple TAP test program. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static volatile bool signaled = false; static boost::function stop_function = 0; static void signal_handler(int code) { switch (code) { case SIGTERM: case SIGINT: case SIGABRT: if (!signaled && stop_function) { signaled = true; std::cerr << "Signal caught: stopping..." << std::endl; stop_function(); stop_function = 0; } break; default: break; } } static bool register_signal_handlers() { if (signal(SIGTERM, signal_handler) == SIG_ERR) { std::cerr << "Failed to catch SIGTERM signals." << std::endl; return false; } if (signal(SIGINT, signal_handler) == SIG_ERR) { std::cerr << "Failed to catch SIGINT signals." << std::endl; return false; } if (signal(SIGABRT, signal_handler) == SIG_ERR) { std::cerr << "Failed to catch SIGABRT signals." << std::endl; return false; } return true; } static char my_buf[2048]; void write_done(asiotap::tap_adapter& tap_adapter, const boost::system::error_code& ec, size_t cnt); void read_done(asiotap::tap_adapter& tap_adapter, const boost::system::error_code& ec, size_t cnt); void ethernet_frame_read(asiotap::osi::const_helper frame); void arp_frame_read(asiotap::osi::const_helper frame); void ipv4_frame_read(asiotap::osi::const_helper frame); void ipv6_frame_read(asiotap::osi::const_helper frame); void icmp_frame_read(asiotap::osi::const_helper frame); void udp_frame_read(asiotap::osi::const_helper frame); void bootp_frame_read(asiotap::osi::const_helper frame); void dhcp_frame_read(asiotap::osi::const_helper frame); void write_done(asiotap::tap_adapter& tap_adapter, const boost::system::error_code& ec, size_t cnt) { if (!ec) { std::cout << "Write: " << cnt << " bytes." << std::endl; tap_adapter.async_read(boost::asio::buffer(my_buf, sizeof(my_buf)), boost::bind(&read_done, boost::ref(tap_adapter), _1, _2)); } else { std::cout << "Write: " << cnt << " bytes. Error: " << ec.message() << std::endl; } } void read_done(asiotap::tap_adapter& tap_adapter, const boost::system::error_code& ec, size_t cnt) { if (!ec) { std::cout << "Read: " << cnt << " bytes." << std::endl; namespace ao = asiotap::osi; boost::asio::const_buffer buffer(my_buf, cnt); ao::filter ethernet_filter; ethernet_filter.add_handler(ðernet_frame_read); ao::complex_filter::type arp_filter(ethernet_filter); arp_filter.add_handler(&arp_frame_read); ao::complex_filter::type ipv4_filter(ethernet_filter); ipv4_filter.add_handler(&ipv4_frame_read); ipv4_filter.add_checksum_filter(); ao::complex_filter::type ipv6_filter(ethernet_filter); ipv6_filter.add_handler(&ipv6_frame_read); ao::complex_filter::type icmp_ipv4_filter(ipv4_filter); icmp_ipv4_filter.add_handler(&icmp_frame_read); icmp_ipv4_filter.add_checksum_filter(); ao::complex_filter::type udp_ipv4_filter(ipv4_filter); udp_ipv4_filter.add_handler(&udp_frame_read); udp_ipv4_filter.add_checksum_bridge_filter(); ao::complex_filter::type udp_ipv6_filter(ipv6_filter); udp_ipv6_filter.add_handler(&udp_frame_read); udp_ipv6_filter.add_checksum_bridge_filter(); ao::complex_filter::type bootp_filter(udp_ipv4_filter); bootp_filter.add_handler(&bootp_frame_read); ao::complex_filter::type dhcp_filter(bootp_filter); dhcp_filter.add_handler(&dhcp_frame_read); ethernet_filter.parse(buffer); tap_adapter.async_write(boost::asio::buffer(buffer), boost::bind(&write_done, boost::ref(tap_adapter), _1, _2)); } else { std::cout << "Read: " << cnt << " bytes. Error: " << ec.message() << std::endl; } } void ethernet_frame_read(asiotap::osi::const_helper frame) { (void)frame; std::cout << "Ethernet frame" << std::endl; } void arp_frame_read(asiotap::osi::const_helper frame) { std::cout << "ARP frame: " << frame.sender_logical_address() << std::endl; } void ipv4_frame_read(asiotap::osi::const_helper frame) { std::cout << "IPv4 frame: " << frame.source() << " -> " << frame.destination() << std::endl; } void ipv6_frame_read(asiotap::osi::const_helper frame) { std::cout << "IPv6 frame: " << frame.source() << " -> " << frame.destination() << std::endl; } void icmp_frame_read(asiotap::osi::const_helper frame) { std::cout << "ICMP frame: " << static_cast(frame.type()) << ": " << static_cast(frame.code()) << std::endl; } void udp_frame_read(asiotap::osi::const_helper frame) { std::cout << "UDP frame: " << frame.source() << " -> " << frame.destination() << std::endl; } void bootp_frame_read(asiotap::osi::const_helper frame) { std::cout << "BOOTP frame. Options size: " << boost::asio::buffer_size(frame.options()) << std::endl; } void dhcp_frame_read(asiotap::osi::const_helper frame) { std::cout << "DHCP frame. Options: "; typedef asiotap::osi::const_helper::const_iterator const_iterator; for (const_iterator it = frame.begin(); (it != frame.end()) && (it->tag() != asiotap::osi::dhcp_option::end); ++it) { std::cout << it->tag() << ", "; } std::cout << "end." << std::endl; } void close_tap_adapter(asiotap::tap_adapter& tap_adapter) { tap_adapter.cancel(); tap_adapter.set_connected_state(false); tap_adapter.close(); } int main() { if (!register_signal_handlers()) { return EXIT_FAILURE; } try { boost::asio::io_service _io_service; asiotap::tap_adapter tap_adapter(_io_service, asiotap::tap_adapter_layer::ethernet); stop_function = boost::bind(&close_tap_adapter, boost::ref(tap_adapter)); tap_adapter.open(); asiotap::tap_adapter_configuration configuration {}; configuration.ipv4.network_address = { boost::asio::ip::address_v4::from_string("9.0.0.1"), 24 }; configuration.ipv6.network_address = { boost::asio::ip::address_v6::from_string("fe80::c887:eb51:aaaa:bbbb"), 64 }; tap_adapter.configure(configuration); tap_adapter.set_connected_state(true); tap_adapter.async_read(boost::asio::buffer(my_buf, sizeof(my_buf)), boost::bind(&read_done, boost::ref(tap_adapter), _1, _2)); const auto addresses = tap_adapter.get_ip_addresses(); std::cout << "Current IP addresses for the interface:" << std::endl; for(auto&& address : addresses) { std::cout << address << std::endl; } _io_service.run(); } catch (std::exception& ex) { std::cerr << "Exception caught: " << ex.what() << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } freelan-2.0/samples/asiotap/tun/000077500000000000000000000000001252300335000166725ustar00rootroot00000000000000freelan-2.0/samples/asiotap/tun/SConscript000066400000000000000000000005751252300335000207130ustar00rootroot00000000000000import os import sys libraries = [ 'asiotap', 'executeplus', 'boost_system', 'boost_iostreams', ] if sys.platform.startswith('linux'): libraries.append('netlinkplus') Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/asiotap/tun/libasiotap_samples_tun.vcxproj000066400000000000000000000255251252300335000250610ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {5B6983DF-70BA-4754-B7BD-C4B5EA3F30A7} Win32Proj libasiotap_samples_tun Application true v120 Unicode Application true v120 Unicode Application false v120 true Unicode Application false v120 true Unicode true $(SolutionDir)\third-party\install\$(PlatformShortName)\include;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\include;$(IncludePath) $(SolutionDir)\third-party\install\$(PlatformShortName)\lib;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\lib;$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSDK_LibraryPath_x86); $(ProjectDir)\build\$(PlatformShortName)\$(Configuration)\ $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ true $(SolutionDir)\third-party\install\$(PlatformShortName)\include;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\include;$(IncludePath) $(SolutionDir)\third-party\install\$(PlatformShortName)\lib;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\lib;$(VCInstallDir)lib\amd64;$(VCInstallDir)atlmfc\lib\amd64;$(WindowsSDK_LibraryPath_x64); $(ProjectDir)\build\$(PlatformShortName)\$(Configuration)\ $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ false $(SolutionDir)\third-party\install\$(PlatformShortName)\include;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\include;$(IncludePath) $(SolutionDir)\third-party\install\$(PlatformShortName)\lib;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\lib;$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSDK_LibraryPath_x86); $(ProjectDir)\build\$(PlatformShortName)\$(Configuration)\ $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ false $(SolutionDir)\third-party\install\$(PlatformShortName)\include;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\include;$(IncludePath) $(SolutionDir)\third-party\install\$(PlatformShortName)\lib;$(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\lib;$(VCInstallDir)lib\amd64;$(VCInstallDir)atlmfc\lib\amd64;$(WindowsSDK_LibraryPath_x64); $(ProjectDir)\build\$(PlatformShortName)\$(Configuration)\ $(SolutionDir)\install\$(PlatformShortName)\$(Configuration)\bin\ Level3 Disabled _SCL_SECURE_NO_WARNINGS;BOOST_ALL_NO_LIB;_WIN32_WINNT=0x0501;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true Console true libboost_system.lib;libboost_thread.lib;libasiotap.lib;Iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) HighestAvailable Level3 Disabled _SCL_SECURE_NO_WARNINGS;BOOST_ALL_NO_LIB;_WIN32_WINNT=0x0501;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true Console true libboost_system.lib;libboost_thread.lib;libasiotap.lib;Iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) HighestAvailable Level3 MaxSpeed true true BOOST_ALL_NO_LIB;_WIN32_WINNT=0x0501;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true Console true true true libboost_system.lib;libboost_thread.lib;libasiotap.lib;Iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) HighestAvailable Level3 MaxSpeed true true BOOST_ALL_NO_LIB;_WIN32_WINNT=0x0501;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true Console true true true libboost_system.lib;libboost_thread.lib;libasiotap.lib;Iphlpapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) HighestAvailable freelan-2.0/samples/asiotap/tun/libasiotap_samples_tun.vcxproj.filters000066400000000000000000000016471252300335000265270ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files freelan-2.0/samples/asiotap/tun/tun.cpp000066400000000000000000000155371252300335000202170ustar00rootroot00000000000000/** * \file tun.cpp * \author Julien Kauffmann * \brief A simple TUN test program. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static volatile bool signaled = false; static boost::function stop_function = 0; static void signal_handler(int code) { switch (code) { case SIGTERM: case SIGINT: case SIGABRT: if (!signaled && stop_function) { signaled = true; std::cerr << "Signal caught: stopping..." << std::endl; stop_function(); stop_function = 0; } break; default: break; } } static bool register_signal_handlers() { if (signal(SIGTERM, signal_handler) == SIG_ERR) { std::cerr << "Failed to catch SIGTERM signals." << std::endl; return false; } if (signal(SIGINT, signal_handler) == SIG_ERR) { std::cerr << "Failed to catch SIGINT signals." << std::endl; return false; } if (signal(SIGABRT, signal_handler) == SIG_ERR) { std::cerr << "Failed to catch SIGABRT signals." << std::endl; return false; } return true; } static char my_buf[2048]; void write_done(asiotap::tap_adapter& tap_adapter, const boost::system::error_code& ec, size_t cnt); void read_done(asiotap::tap_adapter& tap_adapter, const boost::system::error_code& ec, size_t cnt); void ipv4_frame_read(asiotap::osi::const_helper frame); void ipv6_frame_read(asiotap::osi::const_helper frame); void icmp_frame_read(asiotap::osi::const_helper frame); void udp_frame_read(asiotap::osi::const_helper frame); void bootp_frame_read(asiotap::osi::const_helper frame); void dhcp_frame_read(asiotap::osi::const_helper frame); void write_done(asiotap::tap_adapter& tap_adapter, const boost::system::error_code& ec, size_t cnt) { if (!ec) { std::cout << "Write: " << cnt << " bytes." << std::endl; tap_adapter.async_read(boost::asio::buffer(my_buf, sizeof(my_buf)), boost::bind(&read_done, boost::ref(tap_adapter), _1, _2)); } else { std::cout << "Write: " << cnt << " bytes. Error: " << ec.message() << std::endl; } } void read_done(asiotap::tap_adapter& tap_adapter, const boost::system::error_code& ec, size_t cnt) { if (!ec) { std::cout << "Read: " << cnt << " bytes." << std::endl; namespace ao = asiotap::osi; boost::asio::const_buffer buffer(my_buf, cnt); ao::filter ipv4_filter; ipv4_filter.add_handler(&ipv4_frame_read); ipv4_filter.add_checksum_filter(); ao::filter ipv6_filter; ipv6_filter.add_handler(&ipv6_frame_read); ao::complex_filter::type icmp_ipv4_filter(ipv4_filter); icmp_ipv4_filter.add_handler(&icmp_frame_read); icmp_ipv4_filter.add_checksum_filter(); ao::complex_filter::type udp_ipv4_filter(ipv4_filter); udp_ipv4_filter.add_handler(&udp_frame_read); udp_ipv4_filter.add_checksum_bridge_filter(); ao::complex_filter::type udp_ipv6_filter(ipv6_filter); udp_ipv6_filter.add_handler(&udp_frame_read); udp_ipv6_filter.add_checksum_bridge_filter(); ao::complex_filter::type bootp_filter(udp_ipv4_filter); bootp_filter.add_handler(&bootp_frame_read); ao::complex_filter::type dhcp_filter(bootp_filter); dhcp_filter.add_handler(&dhcp_frame_read); ipv4_filter.parse(buffer); ipv6_filter.parse(buffer); tap_adapter.async_write(boost::asio::buffer(buffer), boost::bind(&write_done, boost::ref(tap_adapter), _1, _2)); } else { std::cout << "Read: " << cnt << " bytes. Error: " << ec.message() << std::endl; } } void ipv4_frame_read(asiotap::osi::const_helper frame) { std::cout << "IPv4 frame: " << frame.source() << " -> " << frame.destination() << std::endl; } void ipv6_frame_read(asiotap::osi::const_helper frame) { std::cout << "IPv6 frame: " << frame.source() << " -> " << frame.destination() << std::endl; } void icmp_frame_read(asiotap::osi::const_helper frame) { std::cout << "ICMP frame: " << static_cast(frame.type()) << ": " << static_cast(frame.code()) << std::endl; } void udp_frame_read(asiotap::osi::const_helper frame) { std::cout << "UDP frame: " << frame.source() << " -> " << frame.destination() << std::endl; } void bootp_frame_read(asiotap::osi::const_helper frame) { std::cout << "BOOTP frame. Options size: " << boost::asio::buffer_size(frame.options()) << std::endl; } void dhcp_frame_read(asiotap::osi::const_helper frame) { std::cout << "DHCP frame. Options: "; typedef asiotap::osi::const_helper::const_iterator const_iterator; for (const_iterator it = frame.begin(); (it != frame.end()) && (it->tag() != asiotap::osi::dhcp_option::end); ++it) { std::cout << it->tag() << ", "; } std::cout << "end." << std::endl; } void close_tap_adapter(asiotap::tap_adapter& tap_adapter) { tap_adapter.cancel(); tap_adapter.set_connected_state(false); tap_adapter.close(); } int main() { if (!register_signal_handlers()) { return EXIT_FAILURE; } try { boost::asio::io_service _io_service; asiotap::tap_adapter tap_adapter(_io_service, asiotap::tap_adapter_layer::ip); stop_function = boost::bind(&close_tap_adapter, boost::ref(tap_adapter)); tap_adapter.open(); asiotap::tap_adapter_configuration configuration {}; configuration.ipv4.network_address = { boost::asio::ip::address_v4::from_string("9.0.0.1"), 24 }; configuration.ipv4.remote_address = boost::asio::ip::address_v4::from_string("9.0.0.0"); configuration.ipv6.network_address = { boost::asio::ip::address_v6::from_string("fe80::c887:eb51:aaaa:bbbb"), 64 }; tap_adapter.configure(configuration); tap_adapter.set_connected_state(true); tap_adapter.async_read(boost::asio::buffer(my_buf, sizeof(my_buf)), boost::bind(&read_done, boost::ref(tap_adapter), _1, _2)); const auto addresses = tap_adapter.get_ip_addresses(); std::cout << "Current IP addresses for the interface:" << std::endl; for(auto&& address : addresses) { std::cout << address << std::endl; } _io_service.run(); } catch (std::exception& ex) { std::cerr << "Exception caught: " << ex.what() << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } freelan-2.0/samples/cryptoplus/000077500000000000000000000000001252300335000166505ustar00rootroot00000000000000freelan-2.0/samples/cryptoplus/base64/000077500000000000000000000000001252300335000177345ustar00rootroot00000000000000freelan-2.0/samples/cryptoplus/base64/SConscript000066400000000000000000000004171252300335000217500ustar00rootroot00000000000000import os libraries = [ 'cryptoplus', 'crypto', 'boost_system', ] Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/cryptoplus/base64/base64.cpp000066400000000000000000000021641252300335000215270ustar00rootroot00000000000000/** * \file base64.cpp * \author Julien Kauffmann * \brief A base64 sample file. */ #include #include #include #include #include #include #ifndef STDOUT_FILENO #define STDOUT_FILENO 1 #endif #ifdef MSV #include #endif int main() { cryptoplus::crypto_initializer crypto_initializer; cryptoplus::error::error_strings_initializer error_strings_initializer; std::cout << "BASE64 sample" << std::endl; std::cout << "==========" << std::endl; std::cout << std::endl; const std::string original_string = "libcryptoplus is great !"; const std::string encoded_string = cryptoplus::base64_encode(cryptoplus::buffer(original_string)); const std::string decoded_string = cryptoplus::base64_decode(encoded_string).to_string(); std::cout << "Original string: " << original_string << std::endl; std::cout << "Base64 encoded string: " << encoded_string << std::endl; std::cout << "Base64 decoded string: " << decoded_string << std::endl; return EXIT_SUCCESS; } freelan-2.0/samples/cryptoplus/bio/000077500000000000000000000000001252300335000174215ustar00rootroot00000000000000freelan-2.0/samples/cryptoplus/bio/SConscript000066400000000000000000000004171252300335000214350ustar00rootroot00000000000000import os libraries = [ 'cryptoplus', 'crypto', 'boost_system', ] Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/cryptoplus/bio/bio.cpp000066400000000000000000000017761252300335000207110ustar00rootroot00000000000000/** * \file bio.cpp * \author Julien Kauffmann * \brief A bio sample file. */ #include #include #include #include #include #include #ifndef STDOUT_FILENO #define STDOUT_FILENO 1 #endif #ifdef MSV #include #endif int main() { cryptoplus::crypto_initializer crypto_initializer; cryptoplus::error::error_strings_initializer error_strings_initializer; std::cout << "BIO sample" << std::endl; std::cout << "==========" << std::endl; std::cout << std::endl; std::cout << "Type some text that should be converted to base64: " << std::flush; std::string str; std::getline(std::cin, str); cryptoplus::bio::bio_chain bio_chain(BIO_f_base64()); bio_chain.first().push(BIO_new_fd(STDOUT_FILENO, BIO_NOCLOSE)); std::cout << "Result: " << std::flush; bio_chain.first().puts(str); bio_chain.first().flush(); return EXIT_SUCCESS; } freelan-2.0/samples/cryptoplus/cipher/000077500000000000000000000000001252300335000201225ustar00rootroot00000000000000freelan-2.0/samples/cryptoplus/cipher/SConscript000066400000000000000000000004171252300335000221360ustar00rootroot00000000000000import os libraries = [ 'cryptoplus', 'crypto', 'boost_system', ] Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/cryptoplus/cipher/cipher.cpp000066400000000000000000000037251252300335000221070ustar00rootroot00000000000000/** * \file cipher.cpp * \author Julien Kauffmann * \brief A cipher sample file. */ #include #include #include #include #include #include #include #include #include #ifdef MSV #include #endif using cryptoplus::buffer; using cryptoplus::buffer_cast; using cryptoplus::buffer_size; void cipher(const std::string& name) { try { cryptoplus::cipher::cipher_algorithm algorithm(name); buffer data(buffer::storage_type(algorithm.block_size(), 'd')); buffer key(buffer::storage_type(algorithm.key_length(), 'k')); buffer iv(buffer::storage_type(algorithm.iv_length(), 'i')); std::cout << "Cipher: " << name << " (block size: " << algorithm.block_size() << ")" << std::endl; std::cout << "Data: " << data << std::endl; std::cout << "Key: " << key << std::endl; std::cout << "IV: " << iv << std::endl; cryptoplus::cipher::cipher_stream stream(buffer_size(data) + algorithm.block_size()); stream.initialize(algorithm, cryptoplus::cipher::cipher_stream::encrypt, buffer_cast(key), buffer_size(key), buffer_cast(iv)); stream.set_padding(false); stream.append(data); stream.finalize(); std::cout << "Result: " << stream.result() << std::endl; } catch (const boost::system::system_error& ex) { std::cerr << name << ": " << ex.what() << std::endl; } std::cout << std::endl; } int main() { cryptoplus::crypto_initializer crypto_initializer; cryptoplus::algorithms_initializer algorithms_initializer; cryptoplus::error::error_strings_initializer error_strings_initializer; std::cout << "Cipher sample" << std::endl; std::cout << "=============" << std::endl; std::cout << std::endl; cipher("DES"); cipher("AES128"); cipher("AES192"); cipher("AES256"); cipher("blowfish"); return EXIT_SUCCESS; } freelan-2.0/samples/cryptoplus/dh_key/000077500000000000000000000000001252300335000201135ustar00rootroot00000000000000freelan-2.0/samples/cryptoplus/dh_key/SConscript000066400000000000000000000004171252300335000221270ustar00rootroot00000000000000import os libraries = [ 'cryptoplus', 'crypto', 'boost_system', ] Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/cryptoplus/dh_key/dh_key.cpp000066400000000000000000000105621252300335000220660ustar00rootroot00000000000000/** * \file dh_key.cpp * \author Julien Kauffmann * \brief A DH key sample file. */ #include #include #include #include #include #include #include #include #include #ifdef MSV #include #endif using cryptoplus::buffer; namespace { int pem_passphrase_callback(char* buf, int buf_len, int rwflag, void*) { std::cout << "Passphrase (max: " << buf_len << " characters): " << std::flush; std::string passphrase; std::getline(std::cin, passphrase); if (passphrase.empty()) { std::cerr << "Passphrase cannot be empty." << std::endl; return 0; } if (passphrase.size() > static_cast(buf_len)) { std::cerr << "Passphrase cannot exceed " << buf_len << " characters." << std::endl; return 0; } if (rwflag != 0) { std::cout << "Confirm: " << std::flush; std::string passphrase_confirmation; std::getline(std::cin, passphrase_confirmation); if (passphrase_confirmation != passphrase) { std::cerr << "The two passphrases do not match !" << std::endl; return 0; } } std::copy(passphrase.begin(), passphrase.end(), buf); return passphrase.size(); } } int main() { cryptoplus::crypto_initializer crypto_initializer; cryptoplus::algorithms_initializer algorithms_initializer; cryptoplus::error::error_strings_initializer error_strings_initializer; std::cout << "DH sample" << std::endl; std::cout << "=========" << std::endl; std::cout << std::endl; const int bits = 1024; const int generator = 2; std::cout << "Using DH keys of " << bits << " bits." << std::endl; const std::string parameters_filename = "parameters.pem"; boost::shared_ptr parameters_file(fopen(parameters_filename.c_str(), "w"), fclose); if (!parameters_file) { std::cerr << "Unable to open \"" << parameters_filename << "\" for writing." << std::endl; return EXIT_FAILURE; } try { std::cout << "Generating DH parameters. This can take some time..." << std::endl; cryptoplus::pkey::dh_key dh_key = cryptoplus::pkey::dh_key::generate_parameters(bits, generator); int codes = 0; dh_key.check(codes); if (codes != 0) { std::cerr << "Generation failed." << std::endl; if (codes & DH_CHECK_P_NOT_SAFE_PRIME) { std::cerr << "p is not a safe prime." << std::endl; } if (codes & DH_NOT_SUITABLE_GENERATOR) { std::cerr << "g is not a suitable generator." << std::endl; } if (codes & DH_UNABLE_TO_CHECK_GENERATOR) { std::cerr << "g is not a correct generator. Must be either 2 or 5." << std::endl; } return EXIT_FAILURE; } dh_key.write_parameters(parameters_file.get()); std::cout << "DH parameters written succesfully to \"" << parameters_filename << "\"." << std::endl; std::cout << "Done." << std::endl; std::cout << "Generating DH key..." << std::endl; dh_key.generate_key(); std::cout << "Done." << std::endl; parameters_file.reset(fopen(parameters_filename.c_str(), "r"), fclose); if (!parameters_file) { std::cerr << "Unable to open \"" << parameters_filename << "\" for reading." << std::endl; return EXIT_FAILURE; } std::cout << "Trying to read back the DH parameters from \"" << parameters_filename << "\"..." << std::endl; cryptoplus::pkey::dh_key dh_key2 = cryptoplus::pkey::dh_key::from_parameters(parameters_file.get(), pem_passphrase_callback); std::cout << "Done." << std::endl; std::cout << "Generating DH key..." << std::endl; dh_key2.generate_key(); std::cout << "Done." << std::endl; std::cout << "Public key A: " << dh_key.public_key().to_dec() << std::endl; std::cout << "Public key B: " << dh_key2.public_key().to_dec() << std::endl; std::cout << "Computing key A..." << std::endl; buffer key_a = dh_key.compute_key(dh_key2.public_key()); std::cout << "Done." << std::endl; std::cout << "Computing key B..." << std::endl; buffer key_b = dh_key2.compute_key(dh_key.public_key()); std::cout << "Done." << std::endl; std::cout << "Comparing key A and key B: " << ((key_a == key_b) ? "IDENTICAL" : "DIFFERENT") << std::endl; } catch (std::exception& ex) { std::cerr << "Exception: " << ex.what() << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } freelan-2.0/samples/cryptoplus/digest_sign/000077500000000000000000000000001252300335000211475ustar00rootroot00000000000000freelan-2.0/samples/cryptoplus/digest_sign/SConscript000066400000000000000000000004171252300335000231630ustar00rootroot00000000000000import os libraries = [ 'cryptoplus', 'crypto', 'boost_system', ] Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/cryptoplus/digest_sign/digest_sign.cpp000066400000000000000000000051631252300335000241570ustar00rootroot00000000000000/** * \file digest_sign.cpp * \author Julien Kauffmann * \brief A digest sign sample file. */ #include #include #include #include #include #include #include #include #ifdef MSV #include #endif using cryptoplus::buffer; int main() { cryptoplus::crypto_initializer crypto_initializer; cryptoplus::algorithms_initializer algorithms_initializer; cryptoplus::error::error_strings_initializer error_strings_initializer; std::cout << "Digest/Sign sample" << std::endl; std::cout << "==================" << std::endl; std::cout << std::endl; for (auto&& size: { 1024, 2048 }) { std::cout << "Generating a " << size << " bits RSA key. This can take some time..." << std::endl; cryptoplus::pkey::rsa_key rsa_key = cryptoplus::pkey::rsa_key::generate_private_key(size, 17); std::cout << "Done." << std::endl; auto pkey = cryptoplus::pkey::pkey::from_rsa_key(rsa_key); const std::string message = "my authentic message"; const std::vector algorithms { "MD5", "MD4", "SHA1", "SHA", "SHA224", "SHA256", "SHA384", "SHA512", #if OPENSSL_VERSION_NUMBER >= 0x01000000 "whirlpool", #endif "RIPEMD160" }; cryptoplus::hash::message_digest_context ctx; for (auto&& algorithm: algorithms) { try { std::cout << algorithm << ": "; const auto alg = cryptoplus::hash::message_digest_algorithm(algorithm); EVP_PKEY_CTX* evp_ctx = nullptr; ctx.digest_sign_initialize(alg, pkey, &evp_ctx); EVP_PKEY_CTX_set_rsa_padding(evp_ctx, RSA_PKCS1_PSS_PADDING); EVP_PKEY_CTX_set_rsa_pss_saltlen(evp_ctx, -1); ctx.digest_sign_update(message.c_str(), message.size()); const auto result = ctx.digest_sign_finalize(); std::cout << buffer_size(result) << " bytes - " << result; ctx.digest_verify_initialize(alg, pkey, &evp_ctx); EVP_PKEY_CTX_set_rsa_padding(evp_ctx, RSA_PKCS1_PSS_PADDING); EVP_PKEY_CTX_set_rsa_pss_saltlen(evp_ctx, -1); ctx.digest_verify_update(message.c_str(), message.size()); const auto verify = ctx.digest_verify_finalize(result); std::cout << " - " << (verify ? "ok" : "verification failed") << std::endl; } catch (std::exception& ex) { std::cout << std::endl; std::cerr << "Exception: " << ex.what() << std::endl; } } } try { } catch (std::exception& ex) { std::cerr << "Exception: " << ex.what() << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } freelan-2.0/samples/cryptoplus/dsa_key/000077500000000000000000000000001252300335000202675ustar00rootroot00000000000000freelan-2.0/samples/cryptoplus/dsa_key/SConscript000066400000000000000000000004171252300335000223030ustar00rootroot00000000000000import os libraries = [ 'cryptoplus', 'crypto', 'boost_system', ] Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/cryptoplus/dsa_key/dsa_key.cpp000066400000000000000000000123261252300335000224160ustar00rootroot00000000000000/** * \file dsa_key.cpp * \author Julien Kauffmann * \brief A DSA sample file. */ #include #include #include #include #include #include #include #include #include #include #ifndef STDOUT_FILENO #define STDOUT_FILENO 1 #endif #ifdef MSV #include #endif using cryptoplus::buffer; namespace { int pem_passphrase_callback(char* buf, int buf_len, int rwflag, void*) { std::cout << "Passphrase (max: " << buf_len << " characters): " << std::flush; std::string passphrase; std::getline(std::cin, passphrase); if (passphrase.empty()) { std::cerr << "Passphrase cannot be empty." << std::endl; return 0; } if (passphrase.size() > static_cast(buf_len)) { std::cerr << "Passphrase cannot exceed " << buf_len << " characters." << std::endl; return 0; } if (rwflag != 0) { std::cout << "Confirm: " << std::flush; std::string passphrase_confirmation; std::getline(std::cin, passphrase_confirmation); if (passphrase_confirmation != passphrase) { std::cerr << "The two passphrases do not match !" << std::endl; return 0; } } std::copy(passphrase.begin(), passphrase.end(), buf); return passphrase.size(); } } int main() { cryptoplus::crypto_initializer crypto_initializer; cryptoplus::algorithms_initializer algorithms_initializer; cryptoplus::error::error_strings_initializer error_strings_initializer; std::cout << "DSA sample" << std::endl; std::cout << "==========" << std::endl; std::cout << std::endl; const std::string private_key_filename = "private_key.pem"; const std::string parameters_filename = "parameters.pem"; const std::string certificate_public_key_filename = "certificate_public_key.pem"; boost::shared_ptr private_key_file(fopen(private_key_filename.c_str(), "w"), fclose); boost::shared_ptr parameters_file(fopen(parameters_filename.c_str(), "w"), fclose); boost::shared_ptr certificate_public_key_file(fopen(certificate_public_key_filename.c_str(), "w"), fclose); if (!private_key_file) { std::cerr << "Unable to open \"" << private_key_filename << "\" for writing." << std::endl; return EXIT_FAILURE; } if (!parameters_file) { std::cerr << "Unable to open \"" << parameters_filename << "\" for writing." << std::endl; return EXIT_FAILURE; } if (!certificate_public_key_file) { std::cerr << "Unable to open \"" << certificate_public_key_filename << "\" for writing." << std::endl; return EXIT_FAILURE; } try { std::cout << "Generating DSA key. This can take some time..." << std::endl; cryptoplus::pkey::dsa_key dsa_key = cryptoplus::pkey::dsa_key::generate_private_key(1024, NULL, 0, NULL, NULL); std::cout << "Done." << std::endl; dsa_key.write_private_key(private_key_file.get(), cryptoplus::cipher::cipher_algorithm("AES256"), pem_passphrase_callback); std::cout << "Private DSA key written succesfully to \"" << private_key_filename << "\"." << std::endl; dsa_key.write_parameters(parameters_file.get()); std::cout << "DSA parameters written succesfully to \"" << parameters_filename << "\"." << std::endl; dsa_key.write_certificate_public_key(certificate_public_key_file.get()); std::cout << "Certificate public DSA key written succesfully to \"" << certificate_public_key_filename << "\"." << std::endl; } catch (std::exception& ex) { std::cerr << "Exception: " << ex.what() << std::endl; return EXIT_FAILURE; } certificate_public_key_file.reset(); parameters_file.reset(); private_key_file.reset(fopen(private_key_filename.c_str(), "r"), fclose); if (!private_key_file) { std::cerr << "Unable to open \"" << private_key_filename << "\" for reading." << std::endl; return EXIT_FAILURE; } try { std::cout << "Trying to read back the private DSA key from \"" << private_key_filename << "\"..." << std::endl; cryptoplus::pkey::dsa_key dsa_key = cryptoplus::pkey::dsa_key::from_private_key(private_key_file.get(), pem_passphrase_callback); std::cout << "Done." << std::endl; cryptoplus::bio::bio_chain bio_chain(BIO_new_fd(STDOUT_FILENO, BIO_NOCLOSE)); dsa_key.print(bio_chain.first()); const std::string str = "Hello World !"; const std::string hash = "SHA1"; std::cout << "Generating " << hash << " message digest for \"" << str << "\"..." << std::endl; cryptoplus::hash::message_digest_algorithm algorithm(hash); cryptoplus::hash::message_digest_context context; context.initialize(algorithm); context.update(str.c_str(), str.size()); const buffer str_hash = context.finalize(); std::cout << "Done." << std::endl; std::cout << "Generating DSA signature..." << std::endl; const buffer str_sign = dsa_key.sign(str_hash, algorithm.type()); std::cout << "Done." << std::endl; std::cout << "Verifying DSA signature..." << std::endl; dsa_key.verify(str_sign, str_hash, algorithm.type()); std::cout << "Done." << std::endl; } catch (std::exception& ex) { std::cerr << "Exception: " << ex.what() << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } freelan-2.0/samples/cryptoplus/ecdhe/000077500000000000000000000000001252300335000177205ustar00rootroot00000000000000freelan-2.0/samples/cryptoplus/ecdhe/SConscript000066400000000000000000000004171252300335000217340ustar00rootroot00000000000000import os libraries = [ 'cryptoplus', 'crypto', 'boost_system', ] Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/cryptoplus/ecdhe/ecdhe.cpp000066400000000000000000000136201252300335000214760ustar00rootroot00000000000000/** * \file ecdhe.cpp * \author Julien Kauffmann * \brief An elliptic curve DHE sample file. */ #include #include #include #include #include #include #include #ifdef MSV #include #endif using cryptoplus::buffer; namespace { struct named_nid_type { int nid; std::string name; size_t result; std::string error; }; } int main() { cryptoplus::crypto_initializer crypto_initializer; cryptoplus::algorithms_initializer algorithms_initializer; cryptoplus::error::error_strings_initializer error_strings_initializer; std::cout << "ECDHE sample" << std::endl; std::cout << "============" << std::endl; std::cout << std::endl; std::vector named_nids = { { NID_X9_62_c2pnb163v1, "NID_X9_62_c2pnb163v1", 0, "" }, { NID_X9_62_c2pnb163v2, "NID_X9_62_c2pnb163v2", 0, "" }, { NID_X9_62_c2pnb163v3, "NID_X9_62_c2pnb163v3", 0, "" }, { NID_X9_62_c2pnb176v1, "NID_X9_62_c2pnb176v1", 0, "" }, { NID_X9_62_c2tnb191v1, "NID_X9_62_c2tnb191v1", 0, "" }, { NID_X9_62_c2tnb191v2, "NID_X9_62_c2tnb191v2", 0, "" }, { NID_X9_62_c2tnb191v3, "NID_X9_62_c2tnb191v3", 0, "" }, { NID_X9_62_c2pnb208w1, "NID_X9_62_c2pnb208w1", 0, "" }, { NID_X9_62_c2tnb239v1, "NID_X9_62_c2tnb239v1", 0, "" }, { NID_X9_62_c2tnb239v2, "NID_X9_62_c2tnb239v2", 0, "" }, { NID_X9_62_c2tnb239v3, "NID_X9_62_c2tnb239v3", 0, "" }, { NID_X9_62_c2pnb272w1, "NID_X9_62_c2pnb272w1", 0, "" }, { NID_X9_62_c2pnb304w1, "NID_X9_62_c2pnb304w1", 0, "" }, { NID_X9_62_c2tnb359v1, "NID_X9_62_c2tnb359v1", 0, "" }, { NID_X9_62_c2pnb368w1, "NID_X9_62_c2pnb368w1", 0, "" }, { NID_X9_62_c2tnb431r1, "NID_X9_62_c2tnb431r1", 0, "" }, { NID_X9_62_prime256v1, "NID_X9_62_prime256v1", 0, "" }, { NID_secp112r1, "NID_secp112r1", 0, "" }, { NID_secp112r2, "NID_secp112r2", 0, "" }, { NID_secp128r1, "NID_secp128r1", 0, "" }, { NID_secp128r2, "NID_secp128r2", 0, "" }, { NID_secp160k1, "NID_secp160k1", 0, "" }, { NID_secp160r1, "NID_secp160r1", 0, "" }, { NID_secp160r2, "NID_secp160r2", 0, "" }, { NID_secp192k1, "NID_secp192k1", 0, "" }, { NID_secp224k1, "NID_secp224k1", 0, "" }, { NID_secp224r1, "NID_secp224r1", 0, "" }, { NID_secp256k1, "NID_secp256k1", 0, "" }, { NID_secp384r1, "NID_secp384r1", 0, "" }, { NID_secp521r1, "NID_secp521r1", 0, "" }, { NID_sect113r1, "NID_sect113r1", 0, "" }, { NID_sect113r2, "NID_sect113r2", 0, "" }, { NID_sect131r1, "NID_sect131r1", 0, "" }, { NID_sect131r2, "NID_sect131r2", 0, "" }, { NID_sect163k1, "NID_sect163k1", 0, "" }, { NID_sect163r1, "NID_sect163r1", 0, "" }, { NID_sect163r2, "NID_sect163r2", 0, "" }, { NID_sect193r1, "NID_sect193r1", 0, "" }, { NID_sect193r2, "NID_sect193r2", 0, "" }, { NID_sect233k1, "NID_sect233k1", 0, "" }, { NID_sect233r1, "NID_sect233r1", 0, "" }, { NID_sect239k1, "NID_sect239k1", 0, "" }, { NID_sect283k1, "NID_sect283k1", 0, "" }, { NID_sect283r1, "NID_sect283r1", 0, "" }, { NID_sect409k1, "NID_sect409k1", 0, "" }, { NID_sect409r1, "NID_sect409r1", 0, "" }, { NID_sect571k1, "NID_sect571k1", 0, "" }, { NID_sect571r1, "NID_sect571r1", 0, "" }, { NID_wap_wsg_idm_ecid_wtls1, "NID_wap_wsg_idm_ecid_wtls1", 0, "" }, { NID_wap_wsg_idm_ecid_wtls3, "NID_wap_wsg_idm_ecid_wtls3", 0, "" }, { NID_wap_wsg_idm_ecid_wtls4, "NID_wap_wsg_idm_ecid_wtls4", 0, "" }, { NID_wap_wsg_idm_ecid_wtls5, "NID_wap_wsg_idm_ecid_wtls5", 0, "" }, { NID_wap_wsg_idm_ecid_wtls7, "NID_wap_wsg_idm_ecid_wtls7", 0, "" }, { NID_wap_wsg_idm_ecid_wtls8, "NID_wap_wsg_idm_ecid_wtls8", 0, "" }, { NID_wap_wsg_idm_ecid_wtls9, "NID_wap_wsg_idm_ecid_wtls9", 0, "" }, { NID_wap_wsg_idm_ecid_wtls10, "NID_wap_wsg_idm_ecid_wtls10", 0, "" }, { NID_wap_wsg_idm_ecid_wtls11, "NID_wap_wsg_idm_ecid_wtls11", 0, "" }, { NID_wap_wsg_idm_ecid_wtls12, "NID_wap_wsg_idm_ecid_wtls12", 0, "" } }; for (auto&& named_nid : named_nids) { std::cout << "==================================================" << std::endl; std::cout << "Testing with nid: " << named_nid.name << std::endl; std::cout << "==================================================" << std::endl; std::cout << std::endl; try { cryptoplus::pkey::ecdhe_context ctx_a(named_nid.nid); cryptoplus::pkey::ecdhe_context ctx_b(named_nid.nid); const buffer public_key_a = ctx_a.get_public_key(); const buffer public_key_b = ctx_b.get_public_key(); std::cout << "A public key is: " << std::endl << public_key_a.to_string() << std::endl; std::cout << "B public key is: " << std::endl << public_key_b.to_string() << std::endl; if (public_key_a == public_key_b) { std::cout << "Public keys are equal. That's not good." << std::endl; break; } const buffer secret_key_a = ctx_a.derive_secret_key(public_key_b); const buffer secret_key_b = ctx_b.derive_secret_key(public_key_a); std::cout << "A secret key is: " << secret_key_a << std::endl; std::cout << "B secret key is: " << secret_key_b << std::endl; std::cout << "A and B secret keys should be identical: " << ((secret_key_a == secret_key_b) ? "true" : "false") << std::endl; if (secret_key_a == secret_key_b) { named_nid.result = buffer_size(secret_key_a); } } catch (const std::exception& ex) { std::cerr << "Exception: " << ex.what() << std::endl; named_nid.error = ex.what(); } std::cout << std::endl; } std::cout << "Summary of results:" << std::endl; for (auto&& named_nid : named_nids) { if (named_nid.result) { std::cout << named_nid.name << " (nid: " << named_nid.nid << "): " << named_nid.result * 8 << std::endl; } else if (!named_nid.error.empty()) { std::cout << named_nid.name << " (nid: " << named_nid.nid << "): " << named_nid.error << std::endl; } else { std::cout << named_nid.name << " (nid: " << named_nid.nid << "): " << "failed" << std::endl; } } return EXIT_SUCCESS; } freelan-2.0/samples/cryptoplus/hmac/000077500000000000000000000000001252300335000175605ustar00rootroot00000000000000freelan-2.0/samples/cryptoplus/hmac/SConscript000066400000000000000000000004171252300335000215740ustar00rootroot00000000000000import os libraries = [ 'cryptoplus', 'crypto', 'boost_system', ] Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/cryptoplus/hmac/hmac.cpp000066400000000000000000000036721252300335000212040ustar00rootroot00000000000000/** * \file hmac.cpp * \author Julien Kauffmann * \brief A HMAC sample file. */ #include #include #include #include #include #include #include #include #include #ifdef MSV #include #endif using cryptoplus::buffer; void hmac(const std::string& name, const std::string& key, const std::string& data) { try { cryptoplus::hash::message_digest_algorithm algorithm(name); cryptoplus::hash::hmac_context ctx; ctx.initialize(key.c_str(), key.size(), &algorithm); ctx.update(data.c_str(), data.size()); buffer hmac = ctx.finalize(); std::cout << name << ": " << hmac << std::endl; } catch (std::invalid_argument&) { std::cerr << name << ": " << "Unsupported algorithm" << std::endl; } catch (const boost::system::system_error& ex) { std::cerr << name << ": " << ex.what() << std::endl; } } int main() { cryptoplus::crypto_initializer crypto_initializer; cryptoplus::algorithms_initializer algorithms_initializer; cryptoplus::error::error_strings_initializer error_strings_initializer; std::cout << "HMAC sample" << std::endl; std::cout << "===========" << std::endl; std::cout << std::endl; const std::string key = "this is a very long and secret key"; const std::string data = "some data from which we will compute the HMAC"; std::cout << "Key: " << key << std::endl; std::cout << "Data: " << data << std::endl; std::cout << std::endl; hmac("MD5", key, data); hmac("MD4", key, data); hmac("SHA1", key, data); hmac("SHA", key, data); hmac("SHA224", key, data); hmac("SHA256", key, data); hmac("SHA384", key, data); hmac("SHA512", key, data); #if OPENSSL_VERSION_NUMBER >= 0x01000000 hmac("MDC2", key, data); hmac("whirlpool", key, data); #endif hmac("RIPEMD160", key, data); return EXIT_SUCCESS; } freelan-2.0/samples/cryptoplus/message_digest/000077500000000000000000000000001252300335000216335ustar00rootroot00000000000000freelan-2.0/samples/cryptoplus/message_digest/SConscript000066400000000000000000000004171252300335000236470ustar00rootroot00000000000000import os libraries = [ 'cryptoplus', 'crypto', 'boost_system', ] Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/cryptoplus/message_digest/message_digest.cpp000066400000000000000000000037001252300335000253220ustar00rootroot00000000000000/** * \file message_digest.cpp * \author Julien Kauffmann * \brief A message digest sample file. */ #include #include #include #include #include #include #include #include #include #ifdef MSV #include #endif using cryptoplus::buffer; void message_digest(const std::string& name, const std::string& data) { try { cryptoplus::hash::message_digest_algorithm algorithm(name); cryptoplus::hash::message_digest_context ctx; ctx.initialize(algorithm); ctx.update(data.c_str(), data.size()); const buffer message_digest = ctx.finalize(); std::cout << name << ": " << message_digest << std::endl; } catch (std::invalid_argument&) { std::cerr << name << ": " << "Unsupported algorithm" << std::endl; } catch (const boost::system::system_error& ex) { std::cerr << name << ": " << ex.what() << std::endl; } } int main() { cryptoplus::crypto_initializer crypto_initializer; cryptoplus::algorithms_initializer algorithms_initializer; cryptoplus::error::error_strings_initializer error_strings_initializer; std::cout << "Message digest sample" << std::endl; std::cout << "=====================" << std::endl; std::cout << std::endl; const std::string data = "some data from which we will compute the message digest"; std::cout << "Data: " << data << std::endl; std::cout << std::endl; message_digest("MD5", data); message_digest("MD4", data); message_digest("SHA1", data); message_digest("SHA", data); message_digest("SHA224", data); message_digest("SHA256", data); message_digest("SHA384", data); message_digest("SHA512", data); #if OPENSSL_VERSION_NUMBER >= 0x01000000 message_digest("MDC2", data); message_digest("whirlpool", data); #endif message_digest("RIPEMD160", data); return EXIT_SUCCESS; } freelan-2.0/samples/cryptoplus/pbkdf2/000077500000000000000000000000001252300335000200205ustar00rootroot00000000000000freelan-2.0/samples/cryptoplus/pbkdf2/SConscript000066400000000000000000000004171252300335000220340ustar00rootroot00000000000000import os libraries = [ 'cryptoplus', 'crypto', 'boost_system', ] Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/cryptoplus/pbkdf2/pbkdf2.cpp000066400000000000000000000044071252300335000217010ustar00rootroot00000000000000/** * \file pbkdf2.cpp * \author Julien Kauffmann * \brief A PBKDF2 sample file. */ #include #include #include #include #include #include #include #include #include #ifdef MSV #include #endif using cryptoplus::buffer; void pbkdf2(const std::string& name, const std::string& password, const std::string& salt, unsigned int iterations) { try { cryptoplus::hash::message_digest_algorithm algorithm(name); const buffer key = cryptoplus::hash::pbkdf2(password.c_str(), password.size(), salt.c_str(), salt.size(), algorithm, iterations); std::cout << name << ": " << key << std::endl; } catch (std::invalid_argument&) { std::cerr << name << ": " << "Unsupported algorithm" << std::endl; } catch (const boost::system::system_error& ex) { std::cerr << name << ": " << ex.what() << std::endl; } } int main() { cryptoplus::crypto_initializer crypto_initializer; cryptoplus::algorithms_initializer algorithms_initializer; cryptoplus::error::error_strings_initializer error_strings_initializer; std::cout << "PBKDF2 sample" << std::endl; std::cout << "=============" << std::endl; std::cout << std::endl; const std::string password = "this is a very long and secret key"; const std::string salt = "a salt value"; const unsigned int iterations = 1000; std::cout << "Password: " << password << std::endl; std::cout << "Salt: " << salt << std::endl; std::cout << "Iterations: " << iterations << std::endl; std::cout << std::endl; #if OPENSSL_VERSION_NUMBER >= 0x01000000 pbkdf2("MD5", password, salt, iterations); pbkdf2("MD4", password, salt, iterations); #endif pbkdf2("SHA1", password, salt, iterations); #if OPENSSL_VERSION_NUMBER >= 0x01000000 pbkdf2("SHA", password, salt, iterations); pbkdf2("SHA224", password, salt, iterations); pbkdf2("SHA256", password, salt, iterations); pbkdf2("SHA384", password, salt, iterations); pbkdf2("SHA512", password, salt, iterations); pbkdf2("MDC2", password, salt, iterations); pbkdf2("whirlpool", password, salt, iterations); pbkdf2("RIPEMD160", password, salt, iterations); #endif return EXIT_SUCCESS; } freelan-2.0/samples/cryptoplus/pkey/000077500000000000000000000000001252300335000176205ustar00rootroot00000000000000freelan-2.0/samples/cryptoplus/pkey/SConscript000066400000000000000000000004171252300335000216340ustar00rootroot00000000000000import os libraries = [ 'cryptoplus', 'crypto', 'boost_system', ] Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/cryptoplus/pkey/pkey.cpp000066400000000000000000000076141252300335000213040ustar00rootroot00000000000000/** * \file pkey.cpp * \author Julien Kauffmann * \brief A PKEY sample file. */ #include #include #include #include #include #include #include #include #include #ifdef MSV #include #endif namespace { int pem_passphrase_callback(char* buf, int buf_len, int rwflag, void*) { std::cout << "Passphrase (max: " << buf_len << " characters): " << std::flush; std::string passphrase; std::getline(std::cin, passphrase); if (passphrase.empty()) { std::cerr << "Passphrase cannot be empty." << std::endl; return 0; } if (passphrase.size() > static_cast(buf_len)) { std::cerr << "Passphrase cannot exceed " << buf_len << " characters." << std::endl; return 0; } if (rwflag != 0) { std::cout << "Confirm: " << std::flush; std::string passphrase_confirmation; std::getline(std::cin, passphrase_confirmation); if (passphrase_confirmation != passphrase) { std::cerr << "The two passphrases do not match !" << std::endl; return 0; } } std::copy(passphrase.begin(), passphrase.end(), buf); return passphrase.size(); } } int main() { cryptoplus::crypto_initializer crypto_initializer; cryptoplus::algorithms_initializer algorithms_initializer; cryptoplus::error::error_strings_initializer error_strings_initializer; std::cout << "PKEY sample" << std::endl; std::cout << "===========" << std::endl; std::cout << std::endl; const std::string private_key_filename = "private_key.pem"; const std::string certificate_public_key_filename = "certificate_public_key.pem"; cryptoplus::file private_key_file = cryptoplus::file::open(private_key_filename, "w"); cryptoplus::file certificate_public_key_file = cryptoplus::file::open(certificate_public_key_filename, "w"); if (!private_key_file) { std::cerr << "Unable to open \"" << private_key_filename << "\" for writing." << std::endl; return EXIT_FAILURE; } if (!certificate_public_key_file) { std::cerr << "Unable to open \"" << certificate_public_key_filename << "\" for writing." << std::endl; return EXIT_FAILURE; } try { std::cout << "Generating DSA key. This can take some time..." << std::endl; cryptoplus::pkey::dsa_key dsa_key = cryptoplus::pkey::dsa_key::generate_private_key(1024, NULL, 0, NULL, NULL); std::cout << "Done." << std::endl; cryptoplus::pkey::pkey pkey = cryptoplus::pkey::pkey::from_dsa_key(dsa_key); std::cout << "Checking that the type is correct: " << (pkey.is_dsa() ? "OK" : "FAILURE") << std::endl; pkey.write_private_key_pkcs8(private_key_file, cryptoplus::cipher::cipher_algorithm("AES256"), pem_passphrase_callback); std::cout << "Private key written succesfully to \"" << private_key_filename << "\"." << std::endl; pkey.write_certificate_public_key(certificate_public_key_file); std::cout << "Certificate public key written succesfully to \"" << certificate_public_key_filename << "\"." << std::endl; } catch (std::exception& ex) { std::cerr << "Exception: " << ex.what() << std::endl; return EXIT_FAILURE; } certificate_public_key_file = cryptoplus::file(); private_key_file = cryptoplus::file::open(private_key_filename, "r"); if (!private_key_file) { std::cerr << "Unable to open \"" << private_key_filename << "\" for reading." << std::endl; return EXIT_FAILURE; } try { std::cout << "Trying to read back the private key from \"" << private_key_filename << "\"..." << std::endl; cryptoplus::pkey::pkey pkey = cryptoplus::pkey::pkey::from_private_key(private_key_file, pem_passphrase_callback); std::cout << "Done." << std::endl; } catch (std::exception& ex) { std::cerr << "Exception: " << ex.what() << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } freelan-2.0/samples/cryptoplus/random/000077500000000000000000000000001252300335000201305ustar00rootroot00000000000000freelan-2.0/samples/cryptoplus/random/SConscript000066400000000000000000000004171252300335000221440ustar00rootroot00000000000000import os libraries = [ 'cryptoplus', 'crypto', 'boost_system', ] Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/cryptoplus/random/random.cpp000066400000000000000000000013551252300335000221200ustar00rootroot00000000000000/** * \file random.cpp * \author Julien Kauffmann * \brief A random sample file. */ #include #include #include #include #include #include #include #include #ifdef MSV #include #endif using cryptoplus::buffer; int main() { cryptoplus::error::error_strings_initializer error_strings_initializer; std::cout << "Random sample" << std::endl; std::cout << "=============" << std::endl; std::cout << std::endl; buffer bytes = cryptoplus::random::get_random_bytes(16); std::cout << "Random bytes: " << bytes << std::endl; return EXIT_SUCCESS; } freelan-2.0/samples/cryptoplus/rsa_key/000077500000000000000000000000001252300335000203055ustar00rootroot00000000000000freelan-2.0/samples/cryptoplus/rsa_key/SConscript000066400000000000000000000004171252300335000223210ustar00rootroot00000000000000import os libraries = [ 'cryptoplus', 'crypto', 'boost_system', ] Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/cryptoplus/rsa_key/rsa_key.cpp000066400000000000000000000123011252300335000224430ustar00rootroot00000000000000/** * \file rsa_key.cpp * \author Julien Kauffmann * \brief A RSA sample file. */ #include #include #include #include #include #include #include #include #include #include #ifndef STDOUT_FILENO #define STDOUT_FILENO 1 #endif #ifdef MSV #include #endif using cryptoplus::buffer; namespace { int pem_passphrase_callback(char* buf, int buf_len, int rwflag, void*) { std::cout << "Passphrase (max: " << buf_len << " characters): " << std::flush; std::string passphrase; std::getline(std::cin, passphrase); if (passphrase.empty()) { std::cerr << "Passphrase cannot be empty." << std::endl; return 0; } if (passphrase.size() > static_cast(buf_len)) { std::cerr << "Passphrase cannot exceed " << buf_len << " characters." << std::endl; return 0; } if (rwflag != 0) { std::cout << "Confirm: " << std::flush; std::string passphrase_confirmation; std::getline(std::cin, passphrase_confirmation); if (passphrase_confirmation != passphrase) { std::cerr << "The two passphrases do not match !" << std::endl; return 0; } } std::copy(passphrase.begin(), passphrase.end(), buf); return passphrase.size(); } } int main() { cryptoplus::crypto_initializer crypto_initializer; cryptoplus::algorithms_initializer algorithms_initializer; cryptoplus::error::error_strings_initializer error_strings_initializer; std::cout << "RSA sample" << std::endl; std::cout << "==========" << std::endl; std::cout << std::endl; const std::string private_key_filename = "private_key.pem"; const std::string public_key_filename = "public_key.pem"; const std::string certificate_public_key_filename = "certificate_public_key.pem"; boost::shared_ptr private_key_file(fopen(private_key_filename.c_str(), "w"), fclose); boost::shared_ptr public_key_file(fopen(public_key_filename.c_str(), "w"), fclose); boost::shared_ptr certificate_public_key_file(fopen(certificate_public_key_filename.c_str(), "w"), fclose); if (!private_key_file) { std::cerr << "Unable to open \"" << private_key_filename << "\" for writing." << std::endl; return EXIT_FAILURE; } if (!public_key_file) { std::cerr << "Unable to open \"" << public_key_filename << "\" for writing." << std::endl; return EXIT_FAILURE; } if (!certificate_public_key_file) { std::cerr << "Unable to open \"" << certificate_public_key_filename << "\" for writing." << std::endl; return EXIT_FAILURE; } try { std::cout << "Generating RSA key. This can take some time..." << std::endl; cryptoplus::pkey::rsa_key rsa_key = cryptoplus::pkey::rsa_key::generate_private_key(1024, 17); std::cout << "Done." << std::endl; rsa_key.write_private_key(private_key_file.get(), cryptoplus::cipher::cipher_algorithm("AES256"), pem_passphrase_callback); std::cout << "Private RSA key written succesfully to \"" << private_key_filename << "\"." << std::endl; rsa_key.write_public_key(public_key_file.get()); std::cout << "Public RSA key written succesfully to \"" << public_key_filename << "\"." << std::endl; rsa_key.write_certificate_public_key(certificate_public_key_file.get()); std::cout << "Certificate public RSA key written succesfully to \"" << certificate_public_key_filename << "\"." << std::endl; } catch (std::exception& ex) { std::cerr << "Exception: " << ex.what() << std::endl; return EXIT_FAILURE; } certificate_public_key_file.reset(); public_key_file.reset(); private_key_file.reset(fopen(private_key_filename.c_str(), "r"), fclose); if (!private_key_file) { std::cerr << "Unable to open \"" << private_key_filename << "\" for reading." << std::endl; return EXIT_FAILURE; } try { std::cout << "Trying to read back the private RSA key from \"" << private_key_filename << "\"..." << std::endl; cryptoplus::pkey::rsa_key rsa_key = cryptoplus::pkey::rsa_key::from_private_key(private_key_file.get(), pem_passphrase_callback); std::cout << "Done." << std::endl; cryptoplus::bio::bio_chain bio_chain(BIO_new_fd(STDOUT_FILENO, BIO_NOCLOSE)); rsa_key.print(bio_chain.first()); const std::string str = "Hello World !"; const std::string hash = "SHA256"; std::cout << "Generating " << hash << " message digest for \"" << str << "\"..." << std::endl; cryptoplus::hash::message_digest_algorithm algorithm(hash); cryptoplus::hash::message_digest_context context; context.initialize(algorithm); context.update(str.c_str(), str.size()); const buffer str_hash = context.finalize(); std::cout << "Done." << std::endl; std::cout << "Generating RSA signature..." << std::endl; buffer str_sign = rsa_key.sign(str_hash, algorithm.type()); std::cout << "Done." << std::endl; std::cout << "Verifying RSA signature..." << std::endl; rsa_key.verify(str_sign, str_hash, algorithm.type()); std::cout << "Done." << std::endl; } catch (std::exception& ex) { std::cerr << "Exception: " << ex.what() << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } freelan-2.0/samples/cryptoplus/signature/000077500000000000000000000000001252300335000206515ustar00rootroot00000000000000freelan-2.0/samples/cryptoplus/signature/SConscript000066400000000000000000000004171252300335000226650ustar00rootroot00000000000000import os libraries = [ 'cryptoplus', 'crypto', 'boost_system', ] Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/cryptoplus/signature/signature.cpp000066400000000000000000000037251252300335000233650ustar00rootroot00000000000000/** * \file signature.cpp * \author Julien Kauffmann * \brief A message digest signature sample file. */ #include #include #include #include #include #include #include #include #include #include #ifdef MSV #include #endif using cryptoplus::buffer; int main() { cryptoplus::crypto_initializer crypto_initializer; cryptoplus::algorithms_initializer algorithms_initializer; cryptoplus::error::error_strings_initializer error_strings_initializer; std::cout << "Message digest signature sample" << std::endl; std::cout << "===============================" << std::endl; std::cout << std::endl; const std::string data = "some data from which we will compute the message digest"; try { std::cout << "Generating RSA key. This can take some time..." << std::endl; cryptoplus::pkey::rsa_key rsa_key = cryptoplus::pkey::rsa_key::generate_private_key(1024, 17); cryptoplus::pkey::pkey pkey = cryptoplus::pkey::pkey::create(); pkey.set_rsa_key(rsa_key); std::cout << "Data: " << data << std::endl; std::cout << std::endl; cryptoplus::hash::message_digest_algorithm algorithm("SHA256"); cryptoplus::hash::message_digest_context ctx; ctx.sign_initialize(algorithm); ctx.sign_update(data.c_str(), data.size()); buffer signature = ctx.sign_finalize(pkey); std::cout << "Signature: " << signature << std::endl; cryptoplus::hash::message_digest_context ctx2; ctx2.verify_initialize(algorithm); ctx2.verify_update(data.c_str(), data.size()); bool verification = ctx2.verify_finalize(signature, pkey); std::cout << "Verification: " << (verification ? "OK" : "FAILED") << std::endl; } catch (const boost::system::system_error& ex) { std::cerr << ex.what() << std::endl; } return EXIT_SUCCESS; } freelan-2.0/samples/cryptoplus/store/000077500000000000000000000000001252300335000200045ustar00rootroot00000000000000freelan-2.0/samples/cryptoplus/store/README.md000066400000000000000000000007271252300335000212710ustar00rootroot00000000000000# Certificate management You may test for certificate revocation by revoking one certificate or the other issuing the following commands: ## To revoke the intermediate certificate > openssl ca -revoke intermediate.crt > openssl ca -gencrl -cert ca.crt -keyfile ca.key -out ca.crl -crldays 3650 ## To revoke the final certificate > openssl ca -revoke final.crt > openssl ca -gencrl -cert intermediate.crt -keyfile intermediate.key -out intermediate.crl -crldays 3650 freelan-2.0/samples/cryptoplus/store/SConscript000066400000000000000000000004171252300335000220200ustar00rootroot00000000000000import os libraries = [ 'cryptoplus', 'crypto', 'boost_system', ] Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/cryptoplus/store/ca.crl000066400000000000000000000010241252300335000210660ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBXzCByQIBATANBgkqhkiG9w0BAQUFADCBhjELMAkGA1UEBhMCRlIxDzANBgNV BAgMBkFsc2FjZTETMBEGA1UEBwwKU3RyYXNib3VyZzEQMA4GA1UECgwHRnJlZUxB TjEQMA4GA1UECwwHRnJlZUxBTjEtMCsGA1UEAwwkRnJlZUxBTiBTYW1wbGUgQ2Vy dGlmaWNhdGUgQXV0aG9yaXR5Fw0xMTEyMDMxMTI2NDNaFw0yMTExMzAxMTI2NDNa oA4wDDAKBgNVHRQEAwIBAjANBgkqhkiG9w0BAQUFAAOBgQBX/6AvUCxs6/p5DzVu SrWZCms0qo8kte3ZL3a7iwxu5q+QLnlWOZivIBPAAoqVHSaOvm0pSHvI26xeyix7 C0DiuPbyleyrjRz2s0ZgNNqN1x6KE5M3SXV4CcY1rmMp2iZUp4mbYxRAey2Uwlqi mLudlU/IxJFZsizLy/VyUY74DA== -----END X509 CRL----- freelan-2.0/samples/cryptoplus/store/ca.crt000066400000000000000000000016701252300335000211050ustar00rootroot00000000000000-----BEGIN TRUSTED CERTIFICATE----- MIIChTCCAe4CCQDHd6eMaY/AezANBgkqhkiG9w0BAQUFADCBhjELMAkGA1UEBhMC RlIxDzANBgNVBAgMBkFsc2FjZTETMBEGA1UEBwwKU3RyYXNib3VyZzEQMA4GA1UE CgwHRnJlZUxBTjEQMA4GA1UECwwHRnJlZUxBTjEtMCsGA1UEAwwkRnJlZUxBTiBT YW1wbGUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTExMTAxMTE5NTU0NloXDTIx MTAxMDE5NTU0NlowgYYxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIDAZBbHNhY2UxEzAR BgNVBAcMClN0cmFzYm91cmcxEDAOBgNVBAoMB0ZyZWVMQU4xEDAOBgNVBAsMB0Zy ZWVMQU4xLTArBgNVBAMMJEZyZWVMQU4gU2FtcGxlIENlcnRpZmljYXRlIEF1dGhv cml0eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAxa7DifcFxZ1ZoKo6olLV WMRgEozawh04ZGw9Rl4q6+w72T3sDK17Y5oGizX7tnKMUuGa0H+qrTExJKvlcYyh zEPYZ9As6i+YdVl+F5nVmEnDGC3TFInSXObh+7jN+ckDeJ8Raf+q/FuaWlDfJ/uD /qoRTPeaqQU/xYGUQjWbWEsCAwEAATANBgkqhkiG9w0BAQUFAAOBgQC5j/p0dFZX quEmq2+dj7csEJxNjPAi14GSj9zZoEpQeNqIy+wbDEarw8218Ag+GcuV6/cOfHak Nukhcmm7+arqSTD9fRn57RZ7EqRrY2CD9gA09X44MSuvuMd/NMvHkldWBAebcEBM LD7oqhWJMYn0lPsvHBPHhoit9CWXWyh6gA== -----END TRUSTED CERTIFICATE----- freelan-2.0/samples/cryptoplus/store/ca.key000066400000000000000000000016241252300335000211040ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMWuw4n3BcWdWaCq OqJS1VjEYBKM2sIdOGRsPUZeKuvsO9k97Ayte2OaBos1+7ZyjFLhmtB/qq0xMSSr 5XGMocxD2GfQLOovmHVZfheZ1ZhJwxgt0xSJ0lzm4fu4zfnJA3ifEWn/qvxbmlpQ 3yf7g/6qEUz3mqkFP8WBlEI1m1hLAgMBAAECgYADWSBqt8pbPH0GIZv4n9qJNFpE NiqGWyRXXxXymSm08T1aQpg65r1ORI+T0AhBYNNLnBKZMXBcmpawflDWiYE8AsM0 4o/wOYzpBMH07UhAlcNpA9M76vhB/E0gkNXSXSdmGxwgz2FNqRpAi0gEGaYBtarR l/BVxZM6Ae6+D01LYQJBAP/QNI3lBmtOazi5HkqYlFsu5I9b3YUpjoEz9xEYxLw7 Ecel7ZYLTI1aQBfFKFCNiAm6jpoaWUry4IVjDwoernMCQQDF07Keze9qivI4EZ2x rSHpC30iyk0cmr+CBXU2JfCO6ciC9H/BPLygmw1qU8yLkoSKE5Ho0Y9nCwfGDTkn 8iDJAkBeUgJOnzcysYNPMtI8Zu2sgSm8wf53bs8gTGy4XQ2M6aqwljl3rUrYg4JG QWeP699Q1vxlTXnG7K5kABY3gQCJAkEAvv+85nx4Goraf+3qLgC1y9Zu1Cc0Olji a7uvRj9tOd5X3LAJpN1qVTo+wpjz1RH6a4Gnj3y9EsTglYRw2bN5mQJAZ++s/c7J 25dxmZL6/+ASjgVaZGX1W1Rdf01Ogow6OGjHUixKqZfCYXimY7whm4XgaWT1KMEh MZPbM7XKd6lLDw== -----END PRIVATE KEY----- freelan-2.0/samples/cryptoplus/store/demoCA/000077500000000000000000000000001252300335000211345ustar00rootroot00000000000000freelan-2.0/samples/cryptoplus/store/demoCA/cacert.pem000066400000000000000000000016701252300335000231040ustar00rootroot00000000000000-----BEGIN TRUSTED CERTIFICATE----- MIIChTCCAe4CCQDHd6eMaY/AezANBgkqhkiG9w0BAQUFADCBhjELMAkGA1UEBhMC RlIxDzANBgNVBAgMBkFsc2FjZTETMBEGA1UEBwwKU3RyYXNib3VyZzEQMA4GA1UE CgwHRnJlZUxBTjEQMA4GA1UECwwHRnJlZUxBTjEtMCsGA1UEAwwkRnJlZUxBTiBT YW1wbGUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTExMTAxMTE5NTU0NloXDTIx MTAxMDE5NTU0NlowgYYxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIDAZBbHNhY2UxEzAR BgNVBAcMClN0cmFzYm91cmcxEDAOBgNVBAoMB0ZyZWVMQU4xEDAOBgNVBAsMB0Zy ZWVMQU4xLTArBgNVBAMMJEZyZWVMQU4gU2FtcGxlIENlcnRpZmljYXRlIEF1dGhv cml0eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAxa7DifcFxZ1ZoKo6olLV WMRgEozawh04ZGw9Rl4q6+w72T3sDK17Y5oGizX7tnKMUuGa0H+qrTExJKvlcYyh zEPYZ9As6i+YdVl+F5nVmEnDGC3TFInSXObh+7jN+ckDeJ8Raf+q/FuaWlDfJ/uD /qoRTPeaqQU/xYGUQjWbWEsCAwEAATANBgkqhkiG9w0BAQUFAAOBgQC5j/p0dFZX quEmq2+dj7csEJxNjPAi14GSj9zZoEpQeNqIy+wbDEarw8218Ag+GcuV6/cOfHak Nukhcmm7+arqSTD9fRn57RZ7EqRrY2CD9gA09X44MSuvuMd/NMvHkldWBAebcEBM LD7oqhWJMYn0lPsvHBPHhoit9CWXWyh6gA== -----END TRUSTED CERTIFICATE----- freelan-2.0/samples/cryptoplus/store/demoCA/crlnumber000066400000000000000000000000031252300335000230410ustar00rootroot0000000000000003 freelan-2.0/samples/cryptoplus/store/demoCA/index.txt000066400000000000000000000003651252300335000230100ustar00rootroot00000000000000V 121010201037Z 01 unknown /C=FR/ST=Alsace/L=Strasbourg/O=FreeLAN/OU=FreeLAN/CN=FreeLAN Sample Intermediate Certificate Authority V 121010201246Z 02 unknown /C=FR/ST=Alsace/L=Strasbourg/O=FreeLAN/OU=FreeLAN/CN=FreeLAN Sample Final Certificate freelan-2.0/samples/cryptoplus/store/demoCA/index.txt.attr000066400000000000000000000000251252300335000237520ustar00rootroot00000000000000unique_subject = yes freelan-2.0/samples/cryptoplus/store/demoCA/newcerts/000077500000000000000000000000001252300335000227665ustar00rootroot00000000000000freelan-2.0/samples/cryptoplus/store/demoCA/newcerts/01.pem000066400000000000000000000067341252300335000237230ustar00rootroot00000000000000Certificate: Data: Version: 3 (0x2) Serial Number: 1 (0x1) Signature Algorithm: sha1WithRSAEncryption Issuer: C=FR, ST=Alsace, L=Strasbourg, O=FreeLAN, OU=FreeLAN, CN=FreeLAN Sample Certificate Authority Validity Not Before: Oct 11 20:10:37 2011 GMT Not After : Oct 10 20:10:37 2012 GMT Subject: C=FR, ST=Alsace, L=Strasbourg, O=FreeLAN, OU=FreeLAN, CN=FreeLAN Sample Intermediate Certificate Authority Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (1024 bit) Modulus: 00:ee:91:52:94:dc:d4:90:78:77:d8:b8:51:14:e7: c6:51:e2:69:2e:91:5f:e5:be:d9:d2:b9:80:68:fd: b4:d3:aa:75:d9:cd:09:ff:a8:a5:7b:46:e1:e4:01: fb:06:c4:f8:0d:0d:71:02:c8:b7:89:c0:78:5d:60: c8:05:2b:50:eb:32:79:85:f5:7d:6f:fd:10:0f:90: 5e:38:34:de:05:75:ce:f9:2c:9a:1a:b4:42:90:19: 88:27:ad:6e:c4:09:08:8b:1a:b3:ea:ce:19:53:59: 95:b1:64:30:1f:37:48:cb:7a:ed:c5:9e:70:72:0b: 6e:85:c9:70:ea:c4:f5:78:f3 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:TRUE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: CD:E9:55:E2:E6:B4:05:C8:E9:A4:93:AC:97:F1:7A:40:30:97:5E:CF X509v3 Authority Key Identifier: DirName:/C=FR/ST=Alsace/L=Strasbourg/O=FreeLAN/OU=FreeLAN/CN=FreeLAN Sample Certificate Authority serial:C7:77:A7:8C:69:8F:C0:7B Signature Algorithm: sha1WithRSAEncryption 2b:ee:07:aa:a3:98:5b:17:ed:0c:fb:2e:b5:9e:b9:9d:db:b6: 61:47:30:2f:e6:2d:3c:a1:73:1d:96:dd:1d:cd:13:34:ac:44: d6:3a:cd:b2:9c:71:53:5c:ab:23:64:00:14:94:a4:a3:9f:72: e5:07:f4:86:66:c1:63:13:f9:5f:d1:bf:f5:54:1c:d5:02:55: 4e:14:72:80:76:c2:7c:66:51:15:e3:97:9b:dc:70:27:2c:4f: d3:1e:64:69:a4:e1:c6:48:a4:19:29:a3:05:8a:91:1e:5b:d2: 0e:f2:2e:c4:d4:d5:70:91:f8:45:88:f7:ff:15:30:32:64:78: 52:e8 -----BEGIN CERTIFICATE----- MIIDmjCCAwOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhjELMAkGA1UEBhMCRlIx DzANBgNVBAgMBkFsc2FjZTETMBEGA1UEBwwKU3RyYXNib3VyZzEQMA4GA1UECgwH RnJlZUxBTjEQMA4GA1UECwwHRnJlZUxBTjEtMCsGA1UEAwwkRnJlZUxBTiBTYW1w bGUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTExMTAxMTIwMTAzN1oXDTEyMTAx MDIwMTAzN1owgZMxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIDAZBbHNhY2UxEzARBgNV BAcMClN0cmFzYm91cmcxEDAOBgNVBAoMB0ZyZWVMQU4xEDAOBgNVBAsMB0ZyZWVM QU4xOjA4BgNVBAMMMUZyZWVMQU4gU2FtcGxlIEludGVybWVkaWF0ZSBDZXJ0aWZp Y2F0ZSBBdXRob3JpdHkwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO6RUpTc 1JB4d9i4URTnxlHiaS6RX+W+2dK5gGj9tNOqddnNCf+opXtG4eQB+wbE+A0NcQLI t4nAeF1gyAUrUOsyeYX1fW/9EA+QXjg03gV1zvksmhq0QpAZiCetbsQJCIsas+rO GVNZlbFkMB83SMt67cWecHILboXJcOrE9XjzAgMBAAGjggEHMIIBAzAMBgNVHRME BTADAQH/MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZp Y2F0ZTAdBgNVHQ4EFgQUzelV4ua0BcjppJOsl/F6QDCXXs8wgaUGA1UdIwSBnTCB mqGBjKSBiTCBhjELMAkGA1UEBhMCRlIxDzANBgNVBAgMBkFsc2FjZTETMBEGA1UE BwwKU3RyYXNib3VyZzEQMA4GA1UECgwHRnJlZUxBTjEQMA4GA1UECwwHRnJlZUxB TjEtMCsGA1UEAwwkRnJlZUxBTiBTYW1wbGUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 ggkAx3enjGmPwHswDQYJKoZIhvcNAQEFBQADgYEAK+4HqqOYWxftDPsutZ65ndu2 YUcwL+YtPKFzHZbdHc0TNKxE1jrNspxxU1yrI2QAFJSko59y5Qf0hmbBYxP5X9G/ 9VQc1QJVThRygHbCfGZRFeOXm9xwJyxP0x5kaaThxkikGSmjBYqRHlvSDvIuxNTV cJH4RYj3/xUwMmR4Uug= -----END CERTIFICATE----- freelan-2.0/samples/cryptoplus/store/demoCA/newcerts/02.pem000066400000000000000000000063061252300335000237170ustar00rootroot00000000000000Certificate: Data: Version: 3 (0x2) Serial Number: 2 (0x2) Signature Algorithm: sha1WithRSAEncryption Issuer: C=FR, ST=Alsace, L=Strasbourg, O=FreeLAN, OU=FreeLAN, CN=FreeLAN Sample Intermediate Certificate Authority Validity Not Before: Oct 11 20:12:46 2011 GMT Not After : Oct 10 20:12:46 2012 GMT Subject: C=FR, ST=Alsace, L=Strasbourg, O=FreeLAN, OU=FreeLAN, CN=FreeLAN Sample Final Certificate Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (1024 bit) Modulus: 00:ca:c0:52:3f:c1:62:b2:da:3b:b1:c5:58:b2:ac: 55:c6:22:da:75:9a:8b:0b:6c:26:f0:a4:7c:56:d5: 55:28:af:bc:38:17:b9:f7:aa:4b:2e:0d:a5:ad:cd: 86:dc:87:95:fc:ff:27:62:2d:92:d0:18:33:82:24: b8:46:f4:cc:6b:9c:21:f4:24:da:b9:d6:90:39:f3: 0f:22:27:ea:30:fa:e9:79:a5:d8:25:c6:35:5c:bf: f8:31:50:81:22:cf:b2:d9:8e:50:6f:6a:5a:b0:1e: e9:16:e4:91:b8:d5:a2:90:e6:c3:ee:45:5b:37:66: c1:2e:18:0c:56:d8:e3:3a:f7 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:TRUE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 0A:EB:C0:B5:87:E5:E9:09:F5:20:00:B0:2A:F1:BA:07:87:E6:62:20 X509v3 Authority Key Identifier: keyid:CD:E9:55:E2:E6:B4:05:C8:E9:A4:93:AC:97:F1:7A:40:30:97:5E:CF Signature Algorithm: sha1WithRSAEncryption d8:19:af:d2:21:56:ea:be:47:55:a4:24:85:ae:44:79:58:c7: e9:f7:dd:4c:96:34:c4:67:e9:f7:39:ae:5b:6d:74:e9:ec:6d: 37:d8:33:a0:13:f1:5f:62:0c:67:f9:32:ef:e6:a1:e9:f0:12: 96:17:12:68:95:f1:1c:62:db:60:7b:5a:dc:06:1b:ce:c3:ae: 34:27:33:be:d4:2b:7f:4b:32:1d:5e:5a:bd:1a:dc:b4:9d:61: 53:85:56:78:a8:b6:b5:87:11:68:74:f5:fc:d7:12:9f:78:85: 01:90:43:30:fb:39:6a:a1:29:27:8b:19:52:6c:12:4e:a2:df: 34:b5 -----BEGIN CERTIFICATE----- MIIDCzCCAnSgAwIBAgIBAjANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UEBhMCRlIx DzANBgNVBAgMBkFsc2FjZTETMBEGA1UEBwwKU3RyYXNib3VyZzEQMA4GA1UECgwH RnJlZUxBTjEQMA4GA1UECwwHRnJlZUxBTjE6MDgGA1UEAwwxRnJlZUxBTiBTYW1w bGUgSW50ZXJtZWRpYXRlIENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0xMTEwMTEy MDEyNDZaFw0xMjEwMTAyMDEyNDZaMIGCMQswCQYDVQQGEwJGUjEPMA0GA1UECAwG QWxzYWNlMRMwEQYDVQQHDApTdHJhc2JvdXJnMRAwDgYDVQQKDAdGcmVlTEFOMRAw DgYDVQQLDAdGcmVlTEFOMSkwJwYDVQQDDCBGcmVlTEFOIFNhbXBsZSBGaW5hbCBD ZXJ0aWZpY2F0ZTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAysBSP8Fisto7 scVYsqxVxiLadZqLC2wm8KR8VtVVKK+8OBe596pLLg2lrc2G3IeV/P8nYi2S0Bgz giS4RvTMa5wh9CTaudaQOfMPIifqMPrpeaXYJcY1XL/4MVCBIs+y2Y5Qb2pasB7p FuSRuNWikObD7kVbN2bBLhgMVtjjOvcCAwEAAaN+MHwwDAYDVR0TBAUwAwEB/zAs BglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYD VR0OBBYEFArrwLWH5ekJ9SAAsCrxugeH5mIgMB8GA1UdIwQYMBaAFM3pVeLmtAXI 6aSTrJfxekAwl17PMA0GCSqGSIb3DQEBBQUAA4GBANgZr9IhVuq+R1WkJIWuRHlY x+n33UyWNMRn6fc5rlttdOnsbTfYM6AT8V9iDGf5Mu/moenwEpYXEmiV8Rxi22B7 WtwGG87DrjQnM77UK39LMh1eWr0a3LSdYVOFVniotrWHEWh09fzXEp94hQGQQzD7 OWqhKSeLGVJsEk6i3zS1 -----END CERTIFICATE----- freelan-2.0/samples/cryptoplus/store/demoCA/private/000077500000000000000000000000001252300335000226065ustar00rootroot00000000000000freelan-2.0/samples/cryptoplus/store/demoCA/private/cakey.pem000066400000000000000000000016241252300335000244100ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMWuw4n3BcWdWaCq OqJS1VjEYBKM2sIdOGRsPUZeKuvsO9k97Ayte2OaBos1+7ZyjFLhmtB/qq0xMSSr 5XGMocxD2GfQLOovmHVZfheZ1ZhJwxgt0xSJ0lzm4fu4zfnJA3ifEWn/qvxbmlpQ 3yf7g/6qEUz3mqkFP8WBlEI1m1hLAgMBAAECgYADWSBqt8pbPH0GIZv4n9qJNFpE NiqGWyRXXxXymSm08T1aQpg65r1ORI+T0AhBYNNLnBKZMXBcmpawflDWiYE8AsM0 4o/wOYzpBMH07UhAlcNpA9M76vhB/E0gkNXSXSdmGxwgz2FNqRpAi0gEGaYBtarR l/BVxZM6Ae6+D01LYQJBAP/QNI3lBmtOazi5HkqYlFsu5I9b3YUpjoEz9xEYxLw7 Ecel7ZYLTI1aQBfFKFCNiAm6jpoaWUry4IVjDwoernMCQQDF07Keze9qivI4EZ2x rSHpC30iyk0cmr+CBXU2JfCO6ciC9H/BPLygmw1qU8yLkoSKE5Ho0Y9nCwfGDTkn 8iDJAkBeUgJOnzcysYNPMtI8Zu2sgSm8wf53bs8gTGy4XQ2M6aqwljl3rUrYg4JG QWeP699Q1vxlTXnG7K5kABY3gQCJAkEAvv+85nx4Goraf+3qLgC1y9Zu1Cc0Olji a7uvRj9tOd5X3LAJpN1qVTo+wpjz1RH6a4Gnj3y9EsTglYRw2bN5mQJAZ++s/c7J 25dxmZL6/+ASjgVaZGX1W1Rdf01Ogow6OGjHUixKqZfCYXimY7whm4XgaWT1KMEh MZPbM7XKd6lLDw== -----END PRIVATE KEY----- freelan-2.0/samples/cryptoplus/store/demoCA/serial000066400000000000000000000000031252300335000223270ustar00rootroot0000000000000003 freelan-2.0/samples/cryptoplus/store/final.crt000066400000000000000000000063061252300335000216140ustar00rootroot00000000000000Certificate: Data: Version: 3 (0x2) Serial Number: 2 (0x2) Signature Algorithm: sha1WithRSAEncryption Issuer: C=FR, ST=Alsace, L=Strasbourg, O=FreeLAN, OU=FreeLAN, CN=FreeLAN Sample Intermediate Certificate Authority Validity Not Before: Oct 11 20:12:46 2011 GMT Not After : Oct 10 20:12:46 2012 GMT Subject: C=FR, ST=Alsace, L=Strasbourg, O=FreeLAN, OU=FreeLAN, CN=FreeLAN Sample Final Certificate Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (1024 bit) Modulus: 00:ca:c0:52:3f:c1:62:b2:da:3b:b1:c5:58:b2:ac: 55:c6:22:da:75:9a:8b:0b:6c:26:f0:a4:7c:56:d5: 55:28:af:bc:38:17:b9:f7:aa:4b:2e:0d:a5:ad:cd: 86:dc:87:95:fc:ff:27:62:2d:92:d0:18:33:82:24: b8:46:f4:cc:6b:9c:21:f4:24:da:b9:d6:90:39:f3: 0f:22:27:ea:30:fa:e9:79:a5:d8:25:c6:35:5c:bf: f8:31:50:81:22:cf:b2:d9:8e:50:6f:6a:5a:b0:1e: e9:16:e4:91:b8:d5:a2:90:e6:c3:ee:45:5b:37:66: c1:2e:18:0c:56:d8:e3:3a:f7 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:TRUE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 0A:EB:C0:B5:87:E5:E9:09:F5:20:00:B0:2A:F1:BA:07:87:E6:62:20 X509v3 Authority Key Identifier: keyid:CD:E9:55:E2:E6:B4:05:C8:E9:A4:93:AC:97:F1:7A:40:30:97:5E:CF Signature Algorithm: sha1WithRSAEncryption d8:19:af:d2:21:56:ea:be:47:55:a4:24:85:ae:44:79:58:c7: e9:f7:dd:4c:96:34:c4:67:e9:f7:39:ae:5b:6d:74:e9:ec:6d: 37:d8:33:a0:13:f1:5f:62:0c:67:f9:32:ef:e6:a1:e9:f0:12: 96:17:12:68:95:f1:1c:62:db:60:7b:5a:dc:06:1b:ce:c3:ae: 34:27:33:be:d4:2b:7f:4b:32:1d:5e:5a:bd:1a:dc:b4:9d:61: 53:85:56:78:a8:b6:b5:87:11:68:74:f5:fc:d7:12:9f:78:85: 01:90:43:30:fb:39:6a:a1:29:27:8b:19:52:6c:12:4e:a2:df: 34:b5 -----BEGIN CERTIFICATE----- MIIDCzCCAnSgAwIBAgIBAjANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UEBhMCRlIx DzANBgNVBAgMBkFsc2FjZTETMBEGA1UEBwwKU3RyYXNib3VyZzEQMA4GA1UECgwH RnJlZUxBTjEQMA4GA1UECwwHRnJlZUxBTjE6MDgGA1UEAwwxRnJlZUxBTiBTYW1w bGUgSW50ZXJtZWRpYXRlIENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0xMTEwMTEy MDEyNDZaFw0xMjEwMTAyMDEyNDZaMIGCMQswCQYDVQQGEwJGUjEPMA0GA1UECAwG QWxzYWNlMRMwEQYDVQQHDApTdHJhc2JvdXJnMRAwDgYDVQQKDAdGcmVlTEFOMRAw DgYDVQQLDAdGcmVlTEFOMSkwJwYDVQQDDCBGcmVlTEFOIFNhbXBsZSBGaW5hbCBD ZXJ0aWZpY2F0ZTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAysBSP8Fisto7 scVYsqxVxiLadZqLC2wm8KR8VtVVKK+8OBe596pLLg2lrc2G3IeV/P8nYi2S0Bgz giS4RvTMa5wh9CTaudaQOfMPIifqMPrpeaXYJcY1XL/4MVCBIs+y2Y5Qb2pasB7p FuSRuNWikObD7kVbN2bBLhgMVtjjOvcCAwEAAaN+MHwwDAYDVR0TBAUwAwEB/zAs BglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYD VR0OBBYEFArrwLWH5ekJ9SAAsCrxugeH5mIgMB8GA1UdIwQYMBaAFM3pVeLmtAXI 6aSTrJfxekAwl17PMA0GCSqGSIb3DQEBBQUAA4GBANgZr9IhVuq+R1WkJIWuRHlY x+n33UyWNMRn6fc5rlttdOnsbTfYM6AT8V9iDGf5Mu/moenwEpYXEmiV8Rxi22B7 WtwGG87DrjQnM77UK39LMh1eWr0a3LSdYVOFVniotrWHEWh09fzXEp94hQGQQzD7 OWqhKSeLGVJsEk6i3zS1 -----END CERTIFICATE----- freelan-2.0/samples/cryptoplus/store/final.csr000066400000000000000000000012601252300335000216050ustar00rootroot00000000000000-----BEGIN CERTIFICATE REQUEST----- MIIBwzCCASwCAQAwgYIxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIDAZBbHNhY2UxEzAR BgNVBAcMClN0cmFzYm91cmcxEDAOBgNVBAoMB0ZyZWVMQU4xEDAOBgNVBAsMB0Zy ZWVMQU4xKTAnBgNVBAMMIEZyZWVMQU4gU2FtcGxlIEZpbmFsIENlcnRpZmljYXRl MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDKwFI/wWKy2juxxViyrFXGItp1 mosLbCbwpHxW1VUor7w4F7n3qksuDaWtzYbch5X8/ydiLZLQGDOCJLhG9MxrnCH0 JNq51pA58w8iJ+ow+ul5pdglxjVcv/gxUIEiz7LZjlBvalqwHukW5JG41aKQ5sPu RVs3ZsEuGAxW2OM69wIDAQABoAAwDQYJKoZIhvcNAQEFBQADgYEAoZleL7R1j1X/ 0XkOlrEv2Taopyb/UE6kzg19MB6GFXV0keJ1wuDlyx97x3xJjfG+wXtWB2zjpXfK 7ZlE1UzCI2QvwA2oKdGyzjIwvTb0CJvtM3hLLmNUfkBfDKNfBWfkudeqcb7cMEYW 4eY/iuw0ouh6mekeQl/3/rfcyT7uZPc= -----END CERTIFICATE REQUEST----- freelan-2.0/samples/cryptoplus/store/final.key000066400000000000000000000015671252300335000216200ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIICWwIBAAKBgQDKwFI/wWKy2juxxViyrFXGItp1mosLbCbwpHxW1VUor7w4F7n3 qksuDaWtzYbch5X8/ydiLZLQGDOCJLhG9MxrnCH0JNq51pA58w8iJ+ow+ul5pdgl xjVcv/gxUIEiz7LZjlBvalqwHukW5JG41aKQ5sPuRVs3ZsEuGAxW2OM69wIDAQAB AoGAQL0UBiN7nlwsf2DiJ3r7kF6EntSP3T/VVzVONnO701f5o3d/++K2Sqg05MAh db0dWUEnlCO1Ixj3KXEMHiwAMTJaHo8/c45/SPBkYPyNOeGhVtpxcPQnyyVGt+1t EU/SXJOavuPYiqrdqraEzxUHhSnlx4iDj9aVFbMGiRO3P6ECQQDxENiu0nGp74R9 53l5xMnMQP+bxfzwLO2diCuugPGMq3Zsb/iGc7vTqYD/MJ06RBPOzPXesk7PheO7 9+5wI1ZpAkEA10/Udw9RkgJpwpoTMu1FI1Cb9BiHQoLgWwHha21CD1VuwTDbhDfP 3pwsqRLXnVf0G+q4H0aSGPg/OcxgEBOaXwJABNc1wqzvI15v5qdTRSKyequDdnlP TvNYAiXN2r80GoMG6b6F2w1P5DwvHvC294iObUSoW0RxWLFzlT6xRwcuoQJAbOmd wMgH7AK6esyzT3yED5QT/0p1CSjo0kBGRbATzWvaxXCwadZNmP6I/NFiLd4yxfha QL/S4TyZxuPh59/yowJAS8SKnFi9jLexTYy2oda1u9qHu3C7fTiLSXZPZpEVEt1G EDJ8Zj6cn1Fww+lf1OlieBqCg6LzaX/eDFKp8IMNqQ== -----END RSA PRIVATE KEY----- freelan-2.0/samples/cryptoplus/store/intermediate.crl000066400000000000000000000010441252300335000231570ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBbDCB1gIBATANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UEBhMCRlIxDzANBgNV BAgMBkFsc2FjZTETMBEGA1UEBwwKU3RyYXNib3VyZzEQMA4GA1UECgwHRnJlZUxB TjEQMA4GA1UECwwHRnJlZUxBTjE6MDgGA1UEAwwxRnJlZUxBTiBTYW1wbGUgSW50 ZXJtZWRpYXRlIENlcnRpZmljYXRlIEF1dGhvcml0eRcNMTExMjAzMTMwNTE3WhcN MjExMTMwMTMwNTE3WqAOMAwwCgYDVR0UBAMCAQIwDQYJKoZIhvcNAQEFBQADgYEA kPtSrdfOOUdkOOiiCa3o1yJB0Iajr+n7YBLjBwfsV/cJkthXn504q4vkU1hnvWCM vLobNlwBYbI0C3EE/d2LNglKECvWjUyptW25Nf5HCzX/Pmh88amX297PIPJQf4gS LESRhzjzwCMgz5y2Yg90E4q0Bfq4vkK1FBpctyz4KTI= -----END X509 CRL----- freelan-2.0/samples/cryptoplus/store/intermediate.crt000066400000000000000000000067341252300335000232020ustar00rootroot00000000000000Certificate: Data: Version: 3 (0x2) Serial Number: 1 (0x1) Signature Algorithm: sha1WithRSAEncryption Issuer: C=FR, ST=Alsace, L=Strasbourg, O=FreeLAN, OU=FreeLAN, CN=FreeLAN Sample Certificate Authority Validity Not Before: Oct 11 20:10:37 2011 GMT Not After : Oct 10 20:10:37 2012 GMT Subject: C=FR, ST=Alsace, L=Strasbourg, O=FreeLAN, OU=FreeLAN, CN=FreeLAN Sample Intermediate Certificate Authority Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (1024 bit) Modulus: 00:ee:91:52:94:dc:d4:90:78:77:d8:b8:51:14:e7: c6:51:e2:69:2e:91:5f:e5:be:d9:d2:b9:80:68:fd: b4:d3:aa:75:d9:cd:09:ff:a8:a5:7b:46:e1:e4:01: fb:06:c4:f8:0d:0d:71:02:c8:b7:89:c0:78:5d:60: c8:05:2b:50:eb:32:79:85:f5:7d:6f:fd:10:0f:90: 5e:38:34:de:05:75:ce:f9:2c:9a:1a:b4:42:90:19: 88:27:ad:6e:c4:09:08:8b:1a:b3:ea:ce:19:53:59: 95:b1:64:30:1f:37:48:cb:7a:ed:c5:9e:70:72:0b: 6e:85:c9:70:ea:c4:f5:78:f3 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:TRUE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: CD:E9:55:E2:E6:B4:05:C8:E9:A4:93:AC:97:F1:7A:40:30:97:5E:CF X509v3 Authority Key Identifier: DirName:/C=FR/ST=Alsace/L=Strasbourg/O=FreeLAN/OU=FreeLAN/CN=FreeLAN Sample Certificate Authority serial:C7:77:A7:8C:69:8F:C0:7B Signature Algorithm: sha1WithRSAEncryption 2b:ee:07:aa:a3:98:5b:17:ed:0c:fb:2e:b5:9e:b9:9d:db:b6: 61:47:30:2f:e6:2d:3c:a1:73:1d:96:dd:1d:cd:13:34:ac:44: d6:3a:cd:b2:9c:71:53:5c:ab:23:64:00:14:94:a4:a3:9f:72: e5:07:f4:86:66:c1:63:13:f9:5f:d1:bf:f5:54:1c:d5:02:55: 4e:14:72:80:76:c2:7c:66:51:15:e3:97:9b:dc:70:27:2c:4f: d3:1e:64:69:a4:e1:c6:48:a4:19:29:a3:05:8a:91:1e:5b:d2: 0e:f2:2e:c4:d4:d5:70:91:f8:45:88:f7:ff:15:30:32:64:78: 52:e8 -----BEGIN CERTIFICATE----- MIIDmjCCAwOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhjELMAkGA1UEBhMCRlIx DzANBgNVBAgMBkFsc2FjZTETMBEGA1UEBwwKU3RyYXNib3VyZzEQMA4GA1UECgwH RnJlZUxBTjEQMA4GA1UECwwHRnJlZUxBTjEtMCsGA1UEAwwkRnJlZUxBTiBTYW1w bGUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTExMTAxMTIwMTAzN1oXDTEyMTAx MDIwMTAzN1owgZMxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIDAZBbHNhY2UxEzARBgNV BAcMClN0cmFzYm91cmcxEDAOBgNVBAoMB0ZyZWVMQU4xEDAOBgNVBAsMB0ZyZWVM QU4xOjA4BgNVBAMMMUZyZWVMQU4gU2FtcGxlIEludGVybWVkaWF0ZSBDZXJ0aWZp Y2F0ZSBBdXRob3JpdHkwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO6RUpTc 1JB4d9i4URTnxlHiaS6RX+W+2dK5gGj9tNOqddnNCf+opXtG4eQB+wbE+A0NcQLI t4nAeF1gyAUrUOsyeYX1fW/9EA+QXjg03gV1zvksmhq0QpAZiCetbsQJCIsas+rO GVNZlbFkMB83SMt67cWecHILboXJcOrE9XjzAgMBAAGjggEHMIIBAzAMBgNVHRME BTADAQH/MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZp Y2F0ZTAdBgNVHQ4EFgQUzelV4ua0BcjppJOsl/F6QDCXXs8wgaUGA1UdIwSBnTCB mqGBjKSBiTCBhjELMAkGA1UEBhMCRlIxDzANBgNVBAgMBkFsc2FjZTETMBEGA1UE BwwKU3RyYXNib3VyZzEQMA4GA1UECgwHRnJlZUxBTjEQMA4GA1UECwwHRnJlZUxB TjEtMCsGA1UEAwwkRnJlZUxBTiBTYW1wbGUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 ggkAx3enjGmPwHswDQYJKoZIhvcNAQEFBQADgYEAK+4HqqOYWxftDPsutZ65ndu2 YUcwL+YtPKFzHZbdHc0TNKxE1jrNspxxU1yrI2QAFJSko59y5Qf0hmbBYxP5X9G/ 9VQc1QJVThRygHbCfGZRFeOXm9xwJyxP0x5kaaThxkikGSmjBYqRHlvSDvIuxNTV cJH4RYj3/xUwMmR4Uug= -----END CERTIFICATE----- freelan-2.0/samples/cryptoplus/store/intermediate.csr000066400000000000000000000013101252300335000231620ustar00rootroot00000000000000-----BEGIN CERTIFICATE REQUEST----- MIIB1DCCAT0CAQAwgZMxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIDAZBbHNhY2UxEzAR BgNVBAcMClN0cmFzYm91cmcxEDAOBgNVBAoMB0ZyZWVMQU4xEDAOBgNVBAsMB0Zy ZWVMQU4xOjA4BgNVBAMMMUZyZWVMQU4gU2FtcGxlIEludGVybWVkaWF0ZSBDZXJ0 aWZpY2F0ZSBBdXRob3JpdHkwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO6R UpTc1JB4d9i4URTnxlHiaS6RX+W+2dK5gGj9tNOqddnNCf+opXtG4eQB+wbE+A0N cQLIt4nAeF1gyAUrUOsyeYX1fW/9EA+QXjg03gV1zvksmhq0QpAZiCetbsQJCIsa s+rOGVNZlbFkMB83SMt67cWecHILboXJcOrE9XjzAgMBAAGgADANBgkqhkiG9w0B AQUFAAOBgQB0iGdWspMY0J2zEPbIMujBFqkbq5T++nuXZ1m36IBei1b+zgc01L+A jvCQtxN63x0odOCSYLAi7u/i0r/IPb+1nNl+VRuL7Ac4lhdr6WNogWUUjx+n6PSb J6bIa68yJLUU0FxZEUrUoEzmkFMi0qnsvFtZYjgsOMdrqIu1t2XG/Q== -----END CERTIFICATE REQUEST----- freelan-2.0/samples/cryptoplus/store/intermediate.key000066400000000000000000000015671252300335000232010ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIICWwIBAAKBgQDukVKU3NSQeHfYuFEU58ZR4mkukV/lvtnSuYBo/bTTqnXZzQn/ qKV7RuHkAfsGxPgNDXECyLeJwHhdYMgFK1DrMnmF9X1v/RAPkF44NN4Fdc75LJoa tEKQGYgnrW7ECQiLGrPqzhlTWZWxZDAfN0jLeu3FnnByC26FyXDqxPV48wIDAQAB AoGAQ8uIbEVVIrkZVb0LTaWP9jUhLtqhJejWfcu5chynBn+qffqGnOCQJjg+eU0W yRWwaAUp2GCxx7OqgN6/+LgWhjOMjpCoJsZl6nnpMmytcU3ErftXaid0zNGQDRfD HVQPK9tI/EkYk+3qoAnohGLXvtmbfHg+fzuWnaLp+e22YgECQQD+kwSFXN1NrffC 2s+v8/oxvLkkTYl79FnaGNzrvyAILxSoserHWG9QGS2tWXBEWY4YZgFLqP/7TTy/ 9SKD4HJFAkEA7+dbNVAyJ7snM0p/F2Pp5vVHEebiK5BaOqOndc6Uur1QCJgb7dWa 7jwaTgihmNDdsjkq+uAx7KQEgea2VYgN1wJAYTk6n8gwiIspNVSlvtgZtEcUGiY2 nI1ch2u5a5tpm1aHuEmClbFTia6kADFJLAFbwDuswP2BDbOYwOLY1K6yVQJAYNgs YaE2HgPXF0WDeJXE3o81WWyy8JMdWX6nI095isjRfiapX6FTIcjxdX7WfTITzNZ3 Gz9V6AluKGJSSMTbkQJAK8OXcr58x9Vc+i3SvwRSbDTuX9gxXxC5ITlqoQln2UFo Oua9heNebSXEqdL49YgpxULAMX0SJF4XSXn0oUxOAA== -----END RSA PRIVATE KEY----- freelan-2.0/samples/cryptoplus/store/store.cpp000066400000000000000000000071471252300335000216550ustar00rootroot00000000000000/** * \file x509.cpp * \author Julien Kauffmann * \brief A x509 sample file. */ #include #include #include #include #include #include #include #include #ifndef STDOUT_FILENO #define STDOUT_FILENO 1 #endif #ifdef MSV #include #endif namespace { static int my_index = 0; } int verification_callback(int ok, X509_STORE_CTX* ctx) { using namespace cryptoplus; // Create a store_context wrapping instance x509::store_context store_context(ctx); // Get the custom data from the store context unsigned int& verified_count = *static_cast(store_context.get_external_data(my_index)); // Increment the verified_count verified_count++; // Get the currently verified certificate x509::certificate current_cert = store_context.get_current_certificate(); std::cout << "Verifying \"" << current_cert.subject() << "\"..." << std::endl; if (!ok) { long error = store_context.get_error(); int depth = store_context.get_error_depth(); std::string error_str = store_context.get_error_string(); std::cerr << "Error " << error << "(depth: " << depth << "): " << error_str << std::endl; } else { std::cout << "Ok." << std::endl; } return ok; } int main() { cryptoplus::crypto_initializer crypto_initializer; cryptoplus::algorithms_initializer algorithms_initializer; cryptoplus::error::error_strings_initializer error_strings_initializer; std::cout << "Store sample" << std::endl; std::cout << "============" << std::endl; std::cout << std::endl; try { using namespace cryptoplus; // Register a new index // In a real application, you probably want to keep this value in a // highly-accessible context as it is not bound to any particular instance // and will be destroyed when OpenSSL unloads. my_index = x509::store_context::register_index(); // Setup the certificate store x509::store store = x509::store::create(); store.add_certificate(x509::certificate::from_trusted_certificate(file::open("ca.crt"))); store.add_certificate(x509::certificate::from_trusted_certificate(file::open("intermediate.crt"))); store.add_certificate_revocation_list(x509::certificate_revocation_list::from_certificate_revocation_list(file::open("ca.crl"))); store.add_certificate_revocation_list(x509::certificate_revocation_list::from_certificate_revocation_list(file::open("intermediate.crl"))); store.set_verification_flags(X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL); // Load the certificate to verify x509::certificate cert = x509::certificate::from_certificate(file::open("final.crt")); // Create a store context to proceed to verification x509::store_context store_context = x509::store_context::create(); store_context.initialize(store, cert, NULL); // Ensure to set the verification callback *AFTER* you called initialize or it will be ignored. store_context.set_verification_callback(&verification_callback); // Put some custom data in the store context unsigned int verified_count = 0; store_context.set_external_data(my_index, &verified_count); // Verify ! std::cout << "Verify: " << store_context.verify() << std::endl; // Ouput the custom data. std::cout << "Verified certificates count: " << verified_count << std::endl; } catch (std::exception& ex) { std::cerr << "Error: " << ex.what() << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } freelan-2.0/samples/cryptoplus/tls/000077500000000000000000000000001252300335000174525ustar00rootroot00000000000000freelan-2.0/samples/cryptoplus/tls/SConscript000066400000000000000000000004171252300335000214660ustar00rootroot00000000000000import os libraries = [ 'cryptoplus', 'crypto', 'boost_system', ] Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/cryptoplus/tls/tls.cpp000066400000000000000000000034441252300335000207650ustar00rootroot00000000000000/** * \file tls.cpp * \author Julien Kauffmann * \brief A TLS sample file. */ #include #include #include #include #include #include #include #include #ifdef MSV #include #endif int main() { cryptoplus::crypto_initializer crypto_initializer; cryptoplus::algorithms_initializer algorithms_initializer; cryptoplus::error::error_strings_initializer error_strings_initializer; std::cout << "TLS sample" << std::endl; std::cout << "==========" << std::endl; std::cout << std::endl; const std::string key = "this is a very long and secret key"; const std::string label = "some label"; const std::string seed = "some seed"; std::cout << "key: " << key << std::endl; std::cout << "label: " << label << std::endl; std::cout << "seed: " << seed << std::endl; std::cout << std::endl; const std::vector algorithms { "MD5", "MD4", "SHA1", "SHA", "SHA224", "SHA256", "SHA384", "SHA512", #if OPENSSL_VERSION_NUMBER >= 0x01000000 "whirlpool", #endif "RIPEMD160" }; for (auto&& algorithm: algorithms) { const auto alg = cryptoplus::hash::message_digest_algorithm(algorithm); std::cout << "-- " << algorithm << " --" << std::endl; for (size_t size = 2; size < 256; size <<= 1) { try { const auto result = cryptoplus::tls::prf(size, key.c_str(), key.size(), label, seed.c_str(), seed.size(), alg); std::cout << std::setw(3) << std::setfill(' ') << buffer_size(result) << " bytes - " << result << std::endl; } catch (std::exception& ex) { std::cout << std::endl; std::cerr << "Exception: " << ex.what() << std::endl; } } } return EXIT_SUCCESS; } freelan-2.0/samples/cryptoplus/x509/000077500000000000000000000000001252300335000173555ustar00rootroot00000000000000freelan-2.0/samples/cryptoplus/x509/SConscript000066400000000000000000000004171252300335000213710ustar00rootroot00000000000000import os libraries = [ 'cryptoplus', 'crypto', 'boost_system', ] Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/cryptoplus/x509/x509.cpp000066400000000000000000000065031252300335000205720ustar00rootroot00000000000000/** * \file x509.cpp * \author Julien Kauffmann * \brief A x509 sample file. */ #include #include #include #include #include #include #include #include #include #include #include #include #ifndef STDOUT_FILENO #define STDOUT_FILENO 1 #endif #ifdef MSV #include #endif int main() { cryptoplus::crypto_initializer crypto_initializer; cryptoplus::algorithms_initializer algorithms_initializer; cryptoplus::error::error_strings_initializer error_strings_initializer; std::cout << "X509 sample" << std::endl; std::cout << "===========" << std::endl; std::cout << std::endl; try { using namespace cryptoplus; x509::certificate certificate = x509::certificate::create(); // Set the version certificate.set_version(2); // Subject and issuer names certificate.subject().push_back("CN", MBSTRING_ASC, "My common name"); certificate.subject().push_back("C", MBSTRING_ASC, "FR"); certificate.subject().push_back("O", MBSTRING_ASC, "My organization"); std::cout << "Setting subject to: " << certificate.subject() << std::endl; // We copy the data from subject() to issuer(). certificate.set_issuer(certificate.subject()); std::cout << "Setting issuer to: " << certificate.issuer() << std::endl; // Serial number certificate.set_serial_number(asn1::integer::from_long(42)); // Validity asn1::utctime not_before = asn1::utctime::from_ptime(boost::posix_time::second_clock::local_time() - boost::gregorian::years(12)); asn1::utctime not_after = asn1::utctime::from_ptime(boost::posix_time::second_clock::local_time() + boost::posix_time::hours(1)); certificate.set_not_before(not_before); certificate.set_not_after(not_after); // Public key cryptoplus::pkey::rsa_key rsa_key = cryptoplus::pkey::rsa_key::generate_private_key(1024, 17); certificate.set_public_key(pkey::pkey::from_rsa_key(rsa_key)); // X509 extensions // Thanks to Christer Palm for the explanations on this structure. unsigned char ca_true[] = { 0x30, // BER Type (0x30 = SEQUENCE) 0x03, // BER Length (0x03 = 3 bytes) 0x01, // BER Value (for a SEQUENCE this is a variable number of BER elements - here 0x01 means BER Type BOOLEAN) 0x01, // BER Length (0x01 = 1 byte) 0xff // BER Value (0xFF = TRUE - Any non-zero is truthy) }; certificate.push_back(x509::extension::from_nid(NID_basic_constraints, true, asn1::string::from_data(ca_true, sizeof(ca_true)))); // One could also do that //certificate.push_back(x509::extension::from_nconf_nid(NID_basic_constraints, "critical,CA:TRUE")); // Sign the certificate certificate.sign(pkey::pkey::from_rsa_key(rsa_key), hash::message_digest_algorithm(NID_sha1)); // Save the certificate boost::shared_ptr certificate_file(fopen("certificate.crt", "w"), fclose); if (certificate_file) { certificate.write_certificate(certificate_file.get()); } // Let's print the result std::cout << certificate << std::endl; } catch (std::exception& ex) { std::cerr << "Error: " << ex.what() << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } freelan-2.0/samples/fscp/000077500000000000000000000000001252300335000153575ustar00rootroot00000000000000freelan-2.0/samples/fscp/client/000077500000000000000000000000001252300335000166355ustar00rootroot00000000000000freelan-2.0/samples/fscp/client/SConscript000066400000000000000000000006211252300335000206460ustar00rootroot00000000000000import os import sys libraries = [ 'fscp', 'cryptoplus', 'boost_thread', 'boost_system', 'crypto', ] if sys.platform.startswith('linux'): libraries.extend([ 'pthread', ]) Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/fscp/client/alice.crt000066400000000000000000000160731252300335000204330ustar00rootroot00000000000000Certificate: Data: Version: 3 (0x2) Serial Number: 1 (0x1) Signature Algorithm: sha1WithRSAEncryption Issuer: C=FR, ST=Alsace, L=Strasbourg, O=Freelan, CN=ca/emailAddress=contact@freelan.org Validity Not Before: May 5 12:47:11 2012 GMT Not After : May 3 12:47:11 2022 GMT Subject: C=FR, ST=Alsace, O=Freelan, CN=alice/emailAddress=contact@freelan.org Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (4096 bit) Modulus: 00:e3:b4:0d:14:d1:5b:e5:9d:01:67:1e:ba:f9:1c: 61:4a:55:ab:9c:80:c7:9b:35:da:4f:f5:0d:26:e2: 45:82:3e:5c:00:f3:47:b4:da:bd:b3:f8:3b:21:de: 6a:78:bd:8e:57:de:9b:7b:40:07:d3:73:f5:a4:bd: da:85:74:91:c6:e6:d1:e8:6e:a5:21:e9:d4:f6:f9: ff:8f:9d:09:66:5a:de:bd:ec:04:fe:b2:4f:ea:ee: 80:30:eb:28:3b:cc:4a:a9:61:76:9b:5a:96:75:24: 1c:d8:b5:59:81:d0:64:59:b9:f0:3d:f4:b4:8b:99: 14:f4:bc:a2:4b:1c:d6:cc:14:44:51:5f:c6:b6:3c: 3a:fb:af:b2:eb:2c:eb:a5:6c:e2:e1:02:fd:3a:37: f8:be:e8:6f:99:92:e9:64:6e:ea:45:74:2f:87:fa: 9c:08:c6:0c:e9:f8:1a:9e:76:64:52:48:67:a0:be: 65:8e:b1:22:e7:02:3b:9b:3b:ea:0d:bb:94:19:83: 8a:a7:ca:d8:4c:6e:50:bb:e9:69:66:4b:bb:e8:88: 7f:bb:90:36:0c:f4:50:e8:93:c9:9a:77:f9:eb:d3: b8:a1:ff:97:8e:67:31:cd:29:b3:92:9a:18:e4:d1: 3d:68:1d:d9:25:0d:5f:97:cb:77:0a:53:33:6c:c2: 7b:f4:e8:a4:bd:59:8a:c8:c3:df:f7:b8:6f:74:13: dc:9a:7a:f3:ce:01:77:78:f0:95:ed:49:6f:4c:2e: 49:38:42:d6:0c:31:1d:86:82:c8:41:1e:91:9e:1e: 34:57:e8:33:bc:fd:1d:06:8c:af:b3:a7:f2:ad:cb: 61:0d:a9:db:c4:e1:16:83:48:41:43:17:63:e7:c1: 38:62:f1:6e:d3:d0:77:59:d9:5a:b2:e3:48:98:1d: e4:1f:f5:21:07:81:37:75:20:cc:90:be:3e:b2:80: f6:69:3b:35:d5:98:93:31:99:29:c6:e4:f2:55:be: e5:e8:26:42:e9:a0:0e:78:96:b1:ee:c0:67:ae:d7: b4:16:e0:d3:5a:6f:fa:c5:38:63:95:f2:fa:7a:55: b5:93:7e:c8:8a:85:5a:38:89:fc:43:0e:74:10:8b: 0a:a6:66:e9:58:d5:e7:61:98:f7:87:ea:84:ba:6b: 63:cd:7b:2f:91:4d:69:28:7b:46:42:aa:d2:81:f6: ce:9f:4c:75:79:d8:0b:b7:f0:72:24:52:ce:17:57: dd:80:ba:e0:89:45:d3:3b:0f:90:d2:c4:0d:cb:ee: 3a:75:37:c6:d9:ae:88:d4:59:92:4f:53:d7:fc:59: 38:aa:4c:c8:78:13:85:1c:00:89:19:17:aa:94:5c: 12:c3:ab Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 58:35:31:34:C3:FC:87:E7:C4:D7:55:2F:28:A9:86:01:2C:40:1C:67 X509v3 Authority Key Identifier: keyid:42:9C:36:BD:CB:2F:F4:D9:5E:AB:2B:18:24:8B:01:2D:42:C2:E1:47 Signature Algorithm: sha1WithRSAEncryption 01:59:bf:f5:41:48:ae:d6:e1:a4:2f:5f:d5:bd:8b:d0:59:d3: 13:91:9f:23:30:e6:fc:01:65:30:46:50:a7:2e:6a:c5:6f:9b: aa:65:0c:e1:36:c5:c9:30:a6:4d:0c:81:5d:aa:15:cd:c0:9c: 57:9a:ae:7c:6b:b9:45:df:41:d4:16:17:b3:54:62:c8:a5:54: db:dc:4a:ac:76:7e:22:c5:6f:fc:66:9c:b8:4b:c6:75:4a:f2: a8:f1:13:a8:e5:83:69:b0:92:4b:62:9e:12:0c:e1:5f:83:6f: 74:8e:5c:c8:ab:0c:bb:3e:bb:fc:55:3c:d7:88:d5:d4:e3:2e: e9:54:52:a0:15:93:b0:55:cb:6f:8e:4f:7f:7f:db:ca:bc:d8: 6f:96:3b:6d:82:61:02:55:32:30:b8:ff:ea:57:dc:49:48:d1: 3e:47:f1:80:92:41:01:db:95:95:c8:58:b9:b2:59:c9:e2:37: 07:84:cf:f3:be:ab:ed:3b:03:d5:36:61:81:32:46:cb:3b:2d: 28:5e:ab:2a:12:84:63:f1:65:28:6e:ac:68:0a:47:64:ad:d5: e3:80:fb:f6:fe:24:f7:08:7c:75:1f:c4:ad:63:26:92:2b:e8: f9:4a:45:67:aa:84:43:22:44:24:82:37:87:c9:e1:e6:ea:39: e0:1a:21:28:b1:94:f5:3d:5e:1e:10:24:1c:c6:22:c7:cc:1d: 4c:ac:c9:3a:dd:af:dc:0e:c3:43:38:c3:d3:8f:ac:be:c5:2b: 2b:30:e4:d8:ed:3c:4d:be:35:72:41:4e:19:bb:a4:15:5e:16: 21:d7:dc:c4:ba:77:ef:be:f1:bb:c1:f6:9c:c0:ab:fa:25:9e: 13:97:15:45:b5:bd:03:3f:da:11:52:44:59:69:29:4d:a5:14: ca:aa:23:63:17:e7:b6:3a:45:b4:21:2f:4e:7e:80:67:9e:15: 34:71:fd:d1:49:46:d8:e9:1f:7a:9a:a4:50:9d:b4:60:72:97: 4e:52:f8:03:55:c2:33:72:48:b3:5c:37:79:ae:57:9e:9f:ab: c3:fc:e0:76:5b:ec:84:16:3d:be:5f:8a:d5:55:b6:10:9a:d8: 8c:45:a7:90:9c:7a:56:6c:81:f6:62:74:22:91:62:9f:7d:99: 6c:64:69:d6:d3:1f:7d:fb:a3:f5:6c:4a:75:35:d5:7b:b5:a8: e3:c5:71:02:16:59:ce:5b:e7:12:ef:b3:81:24:e8:6f:bb:88: 4e:32:49:fc:a9:96:39:70:71:a3:54:aa:6b:4b:aa:a6:e6:80: 73:a2:b0:0e:d6:2c:3c:4c:c3:98:14:d0:0c:c4:25:56:b8:2f: fa:ef:3d:1b:d4:13:aa:9c -----BEGIN CERTIFICATE----- MIIF0DCCA7igAwIBAgIBATANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJGUjEP MA0GA1UECAwGQWxzYWNlMRMwEQYDVQQHDApTdHJhc2JvdXJnMRAwDgYDVQQKDAdG cmVlbGFuMQswCQYDVQQDDAJjYTEiMCAGCSqGSIb3DQEJARYTY29udGFjdEBmcmVl bGFuLm9yZzAeFw0xMjA1MDUxMjQ3MTFaFw0yMjA1MDMxMjQ3MTFaMGQxCzAJBgNV BAYTAkZSMQ8wDQYDVQQIDAZBbHNhY2UxEDAOBgNVBAoMB0ZyZWVsYW4xDjAMBgNV BAMMBWFsaWNlMSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGZyZWVsYW4ub3JnMIIC IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA47QNFNFb5Z0BZx66+RxhSlWr nIDHmzXaT/UNJuJFgj5cAPNHtNq9s/g7Id5qeL2OV96be0AH03P1pL3ahXSRxubR 6G6lIenU9vn/j50JZlrevewE/rJP6u6AMOsoO8xKqWF2m1qWdSQc2LVZgdBkWbnw PfS0i5kU9LyiSxzWzBREUV/Gtjw6+6+y6yzrpWzi4QL9Ojf4vuhvmZLpZG7qRXQv h/qcCMYM6fgannZkUkhnoL5ljrEi5wI7mzvqDbuUGYOKp8rYTG5Qu+lpZku76Ih/ u5A2DPRQ6JPJmnf569O4of+XjmcxzSmzkpoY5NE9aB3ZJQ1fl8t3ClMzbMJ79Oik vVmKyMPf97hvdBPcmnrzzgF3ePCV7UlvTC5JOELWDDEdhoLIQR6Rnh40V+gzvP0d Boyvs6fyrcthDanbxOEWg0hBQxdj58E4YvFu09B3WdlasuNImB3kH/UhB4E3dSDM kL4+soD2aTs11ZiTMZkpxuTyVb7l6CZC6aAOeJax7sBnrte0FuDTWm/6xThjlfL6 elW1k37IioVaOIn8Qw50EIsKpmbpWNXnYZj3h+qEumtjzXsvkU1pKHtGQqrSgfbO n0x1edgLt/ByJFLOF1fdgLrgiUXTOw+Q0sQNy+46dTfG2a6I1FmST1PX/Fk4qkzI eBOFHACJGReqlFwSw6sCAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0E HxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFFg1MTTD /IfnxNdVLyiphgEsQBxnMB8GA1UdIwQYMBaAFEKcNr3LL/TZXqsrGCSLAS1CwuFH MA0GCSqGSIb3DQEBBQUAA4ICAQABWb/1QUiu1uGkL1/VvYvQWdMTkZ8jMOb8AWUw RlCnLmrFb5uqZQzhNsXJMKZNDIFdqhXNwJxXmq58a7lF30HUFhezVGLIpVTb3Eqs dn4ixW/8Zpy4S8Z1SvKo8ROo5YNpsJJLYp4SDOFfg290jlzIqwy7Prv8VTzXiNXU 4y7pVFKgFZOwVctvjk9/f9vKvNhvljttgmECVTIwuP/qV9xJSNE+R/GAkkEB25WV yFi5slnJ4jcHhM/zvqvtOwPVNmGBMkbLOy0oXqsqEoRj8WUobqxoCkdkrdXjgPv2 /iT3CHx1H8StYyaSK+j5SkVnqoRDIkQkgjeHyeHm6jngGiEosZT1PV4eECQcxiLH zB1MrMk63a/cDsNDOMPTj6y+xSsrMOTY7TxNvjVyQU4Zu6QVXhYh19zEunfvvvG7 wfacwKv6JZ4TlxVFtb0DP9oRUkRZaSlNpRTKqiNjF+e2OkW0IS9OfoBnnhU0cf3R SUbY6R96mqRQnbRgcpdOUvgDVcIzckizXDd5rleen6vD/OB2W+yEFj2+X4rVVbYQ mtiMRaeQnHpWbIH2YnQikWKffZlsZGnW0x99+6P1bEp1NdV7tajjxXECFlnOW+cS 77OBJOhvu4hOMkn8qZY5cHGjVKprS6qm5oBzorAO1iw8TMOYFNAMxCVWuC/67z0b 1BOqnA== -----END CERTIFICATE----- freelan-2.0/samples/fscp/client/alice.csr000066400000000000000000000032701252300335000204250ustar00rootroot00000000000000-----BEGIN CERTIFICATE REQUEST----- MIIEvjCCAqYCAQAweTELMAkGA1UEBhMCRlIxDzANBgNVBAgMBkFsc2FjZTETMBEG A1UEBwwKU3RyYXNib3VyZzEQMA4GA1UECgwHRnJlZWxhbjEOMAwGA1UEAwwFYWxp Y2UxIjAgBgkqhkiG9w0BCQEWE2NvbnRhY3RAZnJlZWxhbi5vcmcwggIiMA0GCSqG SIb3DQEBAQUAA4ICDwAwggIKAoICAQDjtA0U0VvlnQFnHrr5HGFKVaucgMebNdpP 9Q0m4kWCPlwA80e02r2z+Dsh3mp4vY5X3pt7QAfTc/WkvdqFdJHG5tHobqUh6dT2 +f+PnQlmWt697AT+sk/q7oAw6yg7zEqpYXabWpZ1JBzYtVmB0GRZufA99LSLmRT0 vKJLHNbMFERRX8a2PDr7r7LrLOulbOLhAv06N/i+6G+ZkulkbupFdC+H+pwIxgzp +BqedmRSSGegvmWOsSLnAjubO+oNu5QZg4qnythMblC76WlmS7voiH+7kDYM9FDo k8mad/nr07ih/5eOZzHNKbOSmhjk0T1oHdklDV+Xy3cKUzNswnv06KS9WYrIw9/3 uG90E9yaevPOAXd48JXtSW9MLkk4QtYMMR2GgshBHpGeHjRX6DO8/R0GjK+zp/Kt y2ENqdvE4RaDSEFDF2PnwThi8W7T0HdZ2Vqy40iYHeQf9SEHgTd1IMyQvj6ygPZp OzXVmJMxmSnG5PJVvuXoJkLpoA54lrHuwGeu17QW4NNab/rFOGOV8vp6VbWTfsiK hVo4ifxDDnQQiwqmZulY1edhmPeH6oS6a2PNey+RTWkoe0ZCqtKB9s6fTHV52Au3 8HIkUs4XV92AuuCJRdM7D5DSxA3L7jp1N8bZrojUWZJPU9f8WTiqTMh4E4UcAIkZ F6qUXBLDqwIDAQABoAAwDQYJKoZIhvcNAQEFBQADggIBAE7sNQ6PDUJEuhzHIttv gl4w96i7yYKE2eVldPfqT+pFnWJiRwsd+Uqh2sketVNEyyo3zeEcTo9KO+y1Dx/k PkIFh1LKC/8OOhbQF9K91hTBKo1qXIIe0SWMHn9XJF21uIxQRIjaNK3ROkpSuPGU TIAVjyjbKYgsmPcmf6UWrPGT+18zrrqY8wYGTXaA1boweTrfmdZyUAt0nPYD1bLg BYbVcG/2y2i4lDd45UyREuOazzVeyuWOi/stJCPtOsYn4EDaB+JARjAx6Mv+ATmV ygHAd0Emk68XHX54Hj7YxZQihEKuTMYZuoDoalh+ACjOGuwwMKRH7BITBptYu75a 2OJcWF+3Whu1BODswVgq+mIQf4kM8N2wBSSc+xtZRGWkpBTrMPh4o160P4c8ELbW 7n/hBWuf+49H8YVWpHU/JyD+dNShX+o92s2oQRMJkZHIMoAv4CPyfohSysp7syGY sDp4CIe3APcPI3DBEy7jYl+yv1hQ2dwaa5suXjjcSCz52O1fHb+GTXnacBvaAXHv DL993dItQrf+Cc/shXZqRO9Qr4LkWPOVP+P1GApPsh4mwqcPl0u7PBRqNI3U6TeQ OATGTLxADmhugJ3b5JNkSzKl6iEsunU+C+QssiqQdQ81JWCOsh1HxsSs1ydBZCNy VnNFnRMlL9UtbyLq9Gm3aZoo -----END CERTIFICATE REQUEST----- freelan-2.0/samples/fscp/client/alice.key000066400000000000000000000062571252300335000204360ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIIJKwIBAAKCAgEA47QNFNFb5Z0BZx66+RxhSlWrnIDHmzXaT/UNJuJFgj5cAPNH tNq9s/g7Id5qeL2OV96be0AH03P1pL3ahXSRxubR6G6lIenU9vn/j50JZlrevewE /rJP6u6AMOsoO8xKqWF2m1qWdSQc2LVZgdBkWbnwPfS0i5kU9LyiSxzWzBREUV/G tjw6+6+y6yzrpWzi4QL9Ojf4vuhvmZLpZG7qRXQvh/qcCMYM6fgannZkUkhnoL5l jrEi5wI7mzvqDbuUGYOKp8rYTG5Qu+lpZku76Ih/u5A2DPRQ6JPJmnf569O4of+X jmcxzSmzkpoY5NE9aB3ZJQ1fl8t3ClMzbMJ79OikvVmKyMPf97hvdBPcmnrzzgF3 ePCV7UlvTC5JOELWDDEdhoLIQR6Rnh40V+gzvP0dBoyvs6fyrcthDanbxOEWg0hB Qxdj58E4YvFu09B3WdlasuNImB3kH/UhB4E3dSDMkL4+soD2aTs11ZiTMZkpxuTy Vb7l6CZC6aAOeJax7sBnrte0FuDTWm/6xThjlfL6elW1k37IioVaOIn8Qw50EIsK pmbpWNXnYZj3h+qEumtjzXsvkU1pKHtGQqrSgfbOn0x1edgLt/ByJFLOF1fdgLrg iUXTOw+Q0sQNy+46dTfG2a6I1FmST1PX/Fk4qkzIeBOFHACJGReqlFwSw6sCAwEA AQKCAgEAs2GLkKPh/oBys3cdGtSFvJbDDBbTqO2C38yQINrOoW1Y85K0IcDVA6uB ggwC2r2SHp0K5cyqnaVTlgXO2aXcldIO+Un5Iz9f+3U1JEE1P4JEyV/fC3sTxGNB b8hBuOIWy1sxoe96aiwZ4Yr0SXUPKTR3E4fsl7DwNmFIhV3hxYIN1AFcvQG0AcUH cYfA2GBwV40QSsX/Wv4ntNdssCdEvZRrQXdnZu4HDGbdKYrhO4U4xgRYY1IeydgT dxZ7K3hjkrnzCH6faY7aYT7fPqxZCzZFUlColAoAl0id4Oe1ZlgzssN09MVNEXBR vCNTiydfdd9Vyn+/mAi87dBfycVo+inFCO+UOfwH+JFZzPwL3/LW46aVZXHmsLO/ AWKUrJLObyTtw8Y56n7Bw2bu2Gv2TR+D9cfdfjPYwvNmhtEJ1uxP+RjK0b9/iM66 pODWgBsxiZu8MqZgwND3Yz+nJXxSnZ9IMMnujcBBnXHqe2WjcK9xXL/IeJ5HbJ6k Yn6U7gXbgwABpkTf81EkGfuKonBYAYf6zHi9xFwGpd9OSFUuUCwDAbbmkEjDnKQV 55l83lvzmftILe0JR9Rxo5CQbcFV0ScKTym0EZakhn2dyMyVuOb5WSSjxiXZbXEq fORIYtqZRkD2qHW8O8TKpO8UKrUWPZNLWczAb3Jym2VBj4Z2uIECggEBAPNl2ZQy 9FO0hXRgIjyOUYwVGToYRjyA9ltYefFoNK9RepKDXi4ul5+96dUjDVKfJLhLER77 8vUnBcc4QlnTLJBhVFiUjH/UA8HAi/dHJiCWfwNT1v4aS/mbGA4uA6Z08fwl7QFD D/N02B+oivELWm5UA3pdj4tKh6Oqy58ne3fZH9grACj1AXnin9U/M4KGjOO6aT5V nWrsc+fNQBuzesrwDxlQufdfs0AROyJ9wUkVYgVnSQ/kcEYPT2FvX/JuA2Gm7L9A S5YJXEqIfWMuLnoqATLVp/CULU9/fbAR2fIEpFelKsUgRIxXSnolCqsh/L4OMHX0 TBt4hGQ0X3PjWEECggEBAO9+LQn1FZsYY1bdjM7HKDqBys/TZ3wV3TBEIEBPVrtp 3OMWuvErfx38seqycHfEQo7THNB7rV+nASI8JqJ28MsMVgejqAwdNHy4rGlSV13o LfA5J9YH4Nyt4n7QmQW24o3il4enMGpBMVUcKbb97KmtTm5J+pqQZkQ925hZ6Ge2 tGbT/j+RH2w1iCTeADMhr5CD+HXCARYcXsfvTGFMxGJ14V+YxoB8dxnulknySrhB AkaMi1/wBecCddEal3tcbz8xaj9S/Aj8hrTkDUvopxazykZz1jueP+busn8YZWxL oP7ZgYKcfntPVIOnimn9TByBTTugCJcfYK68juwwwOsCggEBAO/EAhzSQQsABoMI fFFo5P34frxS00WgyI5dTuq2+0dFHVic3jbiIOz0WRdjiyk7qiF9mSULjl9fDHse eYYg14J2zm7gDrOReA3yDi8OQInTltUBTwVLhFIjLQQy4dek1gfMmHcox9rM3GX7 Urt2sqOCUVbGObQ+O/XHNwTWEPOTyKHaYjL2f3jA/TBFLQnEX5+pryj/j62Xtem/ sApZuHmXF1iZxEfiVyKilr04YiILVV77SubD4rGxPUI/Q6X+J4iXthoETTFEkUy+ vb3o7VHcdQfNnr0ISsZIUdkTDL4zQm0wQDylt8ED8FL4kFTaiy3xrl1TxXE+PDS1 vt3bM8ECggEBAJ0pQOca5R3NSEtVwjRjrzuNtwjg4zUjp+4nlr59Eh6UnvaLEQx4 jceg7yRkCrgdm8vcMDmEH8b4ch8EOBo/UU79/mqu8/VXKP17tvC6r0iZt6O/7itf KinHFi5AN1rvpAaWHvhPN89SjswaWimSwr6qUyC+/Wx2vBWmPjfhMEj3NbWRAnS2 iFdbXcdLw/fJ8Es2v1KPiGT5Ix2zJH1pgipWzxoLyJ/Cjen/jrJiBLSbPKINUt0X RthM3gHloGi8xOhERkPd8jT3enK0gSFCQHv+agwHshuXgrnKBGqxGMWTb8gt9fY/ OiUzbvOie4uIRG0kUQmCwIBjf+/LH0NRzxcCggEBAJPlKp+nazCac0sHI1KCofKy jYQcUNv99Xa2JQKLSYKcNgSlXBROPwJdZsynMR0IFQugk4Rt+tMaJuLiztJqUJqo /JS2zIgwnHYqECF1ba4Z+Ikr+6nCyQkWsnGBt0KlXhBPy8K5A+kM8dVehbTnwx+w q/odiL1sS+La7o7ocu8SpwQOc558uwYSpDNzl9iEbRsVRvui2+hT3IBUikwLJ0rB 9meAltEXSgI3UK3lSN1UVKd0j4WS4dA10oQXZVxMTa6X/dJL9kcc9XMwPL6V6++U 2J45RzLZGDG8q6EIJ0OAEuEEn1mmKTlw3mWThFiOcIPFAic7YBp6H9/1xU3rO4g= -----END RSA PRIVATE KEY----- freelan-2.0/samples/fscp/client/bob.crt000066400000000000000000000160651252300335000201210ustar00rootroot00000000000000Certificate: Data: Version: 3 (0x2) Serial Number: 2 (0x2) Signature Algorithm: sha1WithRSAEncryption Issuer: C=FR, ST=Alsace, L=Strasbourg, O=Freelan, CN=ca/emailAddress=contact@freelan.org Validity Not Before: May 5 12:47:22 2012 GMT Not After : May 3 12:47:22 2022 GMT Subject: C=FR, ST=Alsace, O=Freelan, CN=bob/emailAddress=contact@freelan.org Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (4096 bit) Modulus: 00:b8:10:26:45:cd:5b:0a:c0:fd:bb:4f:ac:32:88: da:52:06:67:74:8d:4b:b9:9e:8c:1c:e8:26:f3:d5: 86:b2:40:50:56:1d:73:93:0c:5d:bc:b6:2a:e8:da: 43:d2:0b:0d:ab:29:83:5c:23:c5:9e:c6:5f:c2:ad: 1b:e9:ea:78:92:bf:90:c8:0f:c3:27:41:64:1f:92: d3:18:d0:a1:33:ff:ea:92:cc:de:3c:6f:1b:54:16: 36:21:53:6d:4c:e6:b6:1d:2c:51:e2:8c:a4:7a:f5: fa:b1:f9:73:88:6a:f7:87:94:84:95:0f:2e:cd:b0: ae:0c:04:d5:d6:50:7b:6a:24:6d:1b:b4:f7:39:46: fb:71:03:d3:13:25:60:34:9e:78:70:51:bc:d7:a6: 34:d9:97:83:7a:98:db:1d:8a:78:24:de:c4:6f:6f: a0:c6:76:a5:79:cc:af:8a:fd:e8:55:ec:2f:a6:4e: 53:5e:af:34:81:b1:b9:75:1b:e0:ae:f7:22:b6:21: fc:c3:42:ff:5d:c6:ca:73:d6:e4:91:98:45:17:05: 7e:7e:1e:73:c9:c2:33:a7:20:d6:2f:12:09:9a:6d: 83:99:34:5a:c3:95:5b:c7:7c:5b:fe:44:02:ff:a6: 3c:e7:27:76:cb:ea:f7:18:e2:8b:9e:86:3c:5b:82: f4:c5:73:59:4e:3a:bc:08:18:bb:aa:bb:6f:c5:0c: 76:1f:f0:3c:91:d7:c8:af:f1:d3:bc:a6:00:4f:25: f0:f8:ab:8e:89:62:d4:83:0b:65:6e:70:6a:ac:8e: fa:c4:2c:20:70:21:3b:0c:54:46:1e:bc:0a:69:82: e2:e7:e2:06:8c:4f:1f:ab:fd:93:54:63:f9:b9:01: f4:d4:01:7c:b9:ac:a3:c0:95:9a:eb:20:83:fa:f5: 52:65:4e:33:48:e0:e0:cc:6b:c9:df:8c:81:54:8e: 1b:95:cf:4a:f6:99:6f:34:7e:0c:8e:ef:c6:c8:1a: f2:a1:d2:8c:b1:e2:b9:e0:46:f3:2b:f8:2c:fa:5f: 4f:94:77:8b:03:cc:53:f5:63:e6:a4:a0:d3:94:5a: 37:d0:8d:02:28:27:7f:8d:68:c4:6e:d8:85:c4:e7: c5:2e:8f:33:ea:5c:e8:74:25:a3:0a:90:c8:4f:0a: ec:63:19:dc:43:ae:04:aa:31:c6:51:61:9f:5d:b9: eb:ae:dd:83:61:ab:85:f6:50:b5:09:6b:8c:67:2d: 35:b3:64:ea:c1:63:93:b1:03:a3:3a:c6:01:d3:90: 71:97:f0:92:80:a4:3f:19:65:46:91:34:2c:c0:7e: 90:1a:9e:4c:da:a8:9b:0a:7c:39:20:96:22:ec:47: b2:bd:45 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: ED:0A:5C:C6:9B:B9:86:51:92:D8:6E:A0:31:4F:28:F8:FA:DA:56:1D X509v3 Authority Key Identifier: keyid:42:9C:36:BD:CB:2F:F4:D9:5E:AB:2B:18:24:8B:01:2D:42:C2:E1:47 Signature Algorithm: sha1WithRSAEncryption 76:1b:0d:02:09:0d:cc:f9:8c:dc:31:31:69:20:6a:aa:96:1b: cf:a8:cb:a4:4a:d5:34:f7:c0:d5:f0:6a:24:21:8c:13:5a:e2: 1c:b9:1c:15:a7:de:5e:74:f2:c1:3a:99:55:ab:65:a8:70:c7: bc:37:8c:00:13:a1:e8:23:92:af:60:54:c8:46:95:57:96:12: f9:23:26:d8:b5:d7:bd:52:d2:3e:f1:5b:90:d3:c0:54:a3:f2: 6b:2b:f0:89:17:36:f4:6c:55:0e:6d:89:99:e6:e7:c3:5c:06: 65:fa:b0:2b:37:b6:45:eb:d6:b8:a6:73:cc:cc:73:a4:50:d0: 01:dd:23:af:96:02:ad:1a:c4:d7:ce:62:ef:f4:a1:de:ac:c8: a6:ce:13:ca:96:96:8d:50:cf:b7:03:dc:39:ea:88:01:16:14: ab:ca:71:0d:c9:ab:00:bf:18:10:a0:3a:1a:f3:cd:3a:fa:f5: b6:2c:5c:50:b1:fd:6a:73:72:58:dc:01:5e:31:5b:9e:6e:4f: 3d:68:3a:88:b8:f2:9a:91:ae:ec:82:2a:b3:71:05:c2:1b:7c: e6:42:5d:2f:b5:61:9d:d9:25:eb:c5:c4:bd:ac:01:3f:bb:ee: 10:ab:82:bd:50:0f:c5:62:87:87:1f:d2:ca:0a:92:0a:75:5d: 81:f6:7c:d6:a9:f6:52:71:ec:37:32:85:b7:68:c5:ea:a6:80: 14:60:8f:c9:c2:79:7d:12:79:02:24:a8:45:07:1b:0b:fa:67: 82:f8:d7:02:e8:d9:cf:c9:22:9c:fd:f1:ee:0b:d3:f4:46:72: 35:ca:f1:36:56:3e:34:d8:b2:b0:06:e3:a6:f6:c8:39:27:b4: 4b:5e:75:cd:59:cd:7a:2e:b1:66:aa:ec:8f:18:57:ec:07:db: cf:8e:bb:0d:59:e4:aa:93:48:a0:71:e0:0f:b8:4f:d2:04:90: e8:9a:39:16:37:e1:13:dd:1b:c2:a1:a6:59:47:00:77:71:27: b1:c2:d8:ea:5b:36:0c:73:76:8f:06:17:30:b7:6f:ca:90:5e: 5a:81:dc:3e:55:31:60:38:2c:83:d0:5a:cf:df:56:94:cc:a5: 81:cd:c8:03:d7:3b:d2:56:a6:e8:05:f6:af:91:cb:47:cd:62: 7d:40:d3:a3:fa:bf:78:f5:d1:9c:da:72:5b:87:54:62:70:a4: 13:8f:db:4b:23:d1:d1:ba:31:f2:6b:4f:9c:19:6f:e3:e5:d2: b5:41:7c:d3:f1:6b:e8:ad:61:1a:f6:17:13:31:6d:da:2c:48: dd:c2:3f:14:65:08:42:84:d8:a4:78:3f:c6:1b:07:57:49:94: 6a:36:bc:62:ee:11:d3:fb -----BEGIN CERTIFICATE----- MIIFzjCCA7agAwIBAgIBAjANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJGUjEP MA0GA1UECAwGQWxzYWNlMRMwEQYDVQQHDApTdHJhc2JvdXJnMRAwDgYDVQQKDAdG cmVlbGFuMQswCQYDVQQDDAJjYTEiMCAGCSqGSIb3DQEJARYTY29udGFjdEBmcmVl bGFuLm9yZzAeFw0xMjA1MDUxMjQ3MjJaFw0yMjA1MDMxMjQ3MjJaMGIxCzAJBgNV BAYTAkZSMQ8wDQYDVQQIDAZBbHNhY2UxEDAOBgNVBAoMB0ZyZWVsYW4xDDAKBgNV BAMMA2JvYjEiMCAGCSqGSIb3DQEJARYTY29udGFjdEBmcmVlbGFuLm9yZzCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALgQJkXNWwrA/btPrDKI2lIGZ3SN S7mejBzoJvPVhrJAUFYdc5MMXby2KujaQ9ILDaspg1wjxZ7GX8KtG+nqeJK/kMgP wydBZB+S0xjQoTP/6pLM3jxvG1QWNiFTbUzmth0sUeKMpHr1+rH5c4hq94eUhJUP Ls2wrgwE1dZQe2okbRu09zlG+3ED0xMlYDSeeHBRvNemNNmXg3qY2x2KeCTexG9v oMZ2pXnMr4r96FXsL6ZOU16vNIGxuXUb4K73IrYh/MNC/13GynPW5JGYRRcFfn4e c8nCM6cg1i8SCZptg5k0WsOVW8d8W/5EAv+mPOcndsvq9xjii56GPFuC9MVzWU46 vAgYu6q7b8UMdh/wPJHXyK/x07ymAE8l8Pirjoli1IMLZW5waqyO+sQsIHAhOwxU Rh68CmmC4ufiBoxPH6v9k1Rj+bkB9NQBfLmso8CVmusgg/r1UmVOM0jg4Mxryd+M gVSOG5XPSvaZbzR+DI7vxsga8qHSjLHiueBG8yv4LPpfT5R3iwPMU/Vj5qSg05Ra N9CNAignf41oxG7YhcTnxS6PM+pc6HQlowqQyE8K7GMZ3EOuBKoxxlFhn125667d g2GrhfZQtQlrjGctNbNk6sFjk7EDozrGAdOQcZfwkoCkPxllRpE0LMB+kBqeTNqo mwp8OSCWIuxHsr1FAgMBAAGjezB5MAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8W HU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBTtClzGm7mG UZLYbqAxTyj4+tpWHTAfBgNVHSMEGDAWgBRCnDa9yy/02V6rKxgkiwEtQsLhRzAN BgkqhkiG9w0BAQUFAAOCAgEAdhsNAgkNzPmM3DExaSBqqpYbz6jLpErVNPfA1fBq JCGME1riHLkcFafeXnTywTqZVatlqHDHvDeMABOh6COSr2BUyEaVV5YS+SMm2LXX vVLSPvFbkNPAVKPyayvwiRc29GxVDm2Jmebnw1wGZfqwKze2RevWuKZzzMxzpFDQ Ad0jr5YCrRrE185i7/Sh3qzIps4TypaWjVDPtwPcOeqIARYUq8pxDcmrAL8YEKA6 GvPNOvr1tixcULH9anNyWNwBXjFbnm5PPWg6iLjympGu7IIqs3EFwht85kJdL7Vh ndkl68XEvawBP7vuEKuCvVAPxWKHhx/SygqSCnVdgfZ81qn2UnHsNzKFt2jF6qaA FGCPycJ5fRJ5AiSoRQcbC/pngvjXAujZz8kinP3x7gvT9EZyNcrxNlY+NNiysAbj pvbIOSe0S151zVnNei6xZqrsjxhX7Afbz467DVnkqpNIoHHgD7hP0gSQ6Jo5Fjfh E90bwqGmWUcAd3EnscLY6ls2DHN2jwYXMLdvypBeWoHcPlUxYDgsg9Baz99WlMyl gc3IA9c70lam6AX2r5HLR81ifUDTo/q/ePXRnNpyW4dUYnCkE4/bSyPR0box8mtP nBlv4+XStUF80/Fr6K1hGvYXEzFt2ixI3cI/FGUIQoTYpHg/xhsHV0mUaja8Yu4R 0/s= -----END CERTIFICATE----- freelan-2.0/samples/fscp/client/bob.csr000066400000000000000000000032701252300335000201120ustar00rootroot00000000000000-----BEGIN CERTIFICATE REQUEST----- MIIEvDCCAqQCAQAwdzELMAkGA1UEBhMCRlIxDzANBgNVBAgMBkFsc2FjZTETMBEG A1UEBwwKU3RyYXNib3VyZzEQMA4GA1UECgwHRnJlZWxhbjEMMAoGA1UEAwwDYm9i MSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGZyZWVsYW4ub3JnMIICIjANBgkqhkiG 9w0BAQEFAAOCAg8AMIICCgKCAgEAuBAmRc1bCsD9u0+sMojaUgZndI1LuZ6MHOgm 89WGskBQVh1zkwxdvLYq6NpD0gsNqymDXCPFnsZfwq0b6ep4kr+QyA/DJ0FkH5LT GNChM//qkszePG8bVBY2IVNtTOa2HSxR4oykevX6sflziGr3h5SElQ8uzbCuDATV 1lB7aiRtG7T3OUb7cQPTEyVgNJ54cFG816Y02ZeDepjbHYp4JN7Eb2+gxnalecyv iv3oVewvpk5TXq80gbG5dRvgrvcitiH8w0L/XcbKc9bkkZhFFwV+fh5zycIzpyDW LxIJmm2DmTRaw5Vbx3xb/kQC/6Y85yd2y+r3GOKLnoY8W4L0xXNZTjq8CBi7qrtv xQx2H/A8kdfIr/HTvKYATyXw+KuOiWLUgwtlbnBqrI76xCwgcCE7DFRGHrwKaYLi 5+IGjE8fq/2TVGP5uQH01AF8uayjwJWa6yCD+vVSZU4zSODgzGvJ34yBVI4blc9K 9plvNH4Mju/GyBryodKMseK54EbzK/gs+l9PlHeLA8xT9WPmpKDTlFo30I0CKCd/ jWjEbtiFxOfFLo8z6lzodCWjCpDITwrsYxncQ64EqjHGUWGfXbnrrt2DYauF9lC1 CWuMZy01s2TqwWOTsQOjOsYB05Bxl/CSgKQ/GWVGkTQswH6QGp5M2qibCnw5IJYi 7EeyvUUCAwEAAaAAMA0GCSqGSIb3DQEBBQUAA4ICAQCRyyolh0jjd05/rR/HUDR+ zCPE30814nFpvh2w3KKnag/nYju5srNSmsmXZNIv72T/huymtTfMdiKO005mNbYC zN1ycawiaOQiU5gFjJeg1EOGDNTnb9EkNdtgMpQ2DFdQZd+3jjJBIM7b0mOhUtkl Jjth7N56F5vV6szYuXJxtxCdtawK/Wka+omcWWjQsSv9uBr6znipvLXz8pr/UuaD FsluZNUzRwy2xZlk+J/rcUOBfo3y8F2mrvGJlw7ghW6JTDjGn7STuRwkw2aZXDEo yderwSPUgY1bPQeDcAlCdAFpU+zv3pJ7ahf4BwbQhR77QF5JrQt1IzTYP20aFE+l 5jjuo6jxeItpI3c49zqC0bqsY8TxXWZ2CYaW1FGKta28IJcs7Jx6Q6dOi6pQiIHR 0qCuLWUZyN3OCFfVUbxzlzY6xskmILlR+L9Ck00pIShy0FGJg7uF2l3A4oSo2JbQ 5Gqu3U8S4gRQAQ6EvJPfg3fucFKF0tgytnggFLxNHe/CqT2NP2oCH62sWqMcH/LU 8/AehGYJqBbCRVAgleMk2XrbsC7TuCEzQ2vkkrJa7wKlZWFyuQhWiHd3SyNMQfID qvm1ZUljscstqkEHvIAtqJCe14ip6tc0EGhVXaBMckPFwxgqx+2v1wiUzAq7TNwh JrOTfkk8SP/hPTXIGPGsFw== -----END CERTIFICATE REQUEST----- freelan-2.0/samples/fscp/client/bob.key000066400000000000000000000062531252300335000201170ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIIJKQIBAAKCAgEAuBAmRc1bCsD9u0+sMojaUgZndI1LuZ6MHOgm89WGskBQVh1z kwxdvLYq6NpD0gsNqymDXCPFnsZfwq0b6ep4kr+QyA/DJ0FkH5LTGNChM//qksze PG8bVBY2IVNtTOa2HSxR4oykevX6sflziGr3h5SElQ8uzbCuDATV1lB7aiRtG7T3 OUb7cQPTEyVgNJ54cFG816Y02ZeDepjbHYp4JN7Eb2+gxnalecyviv3oVewvpk5T Xq80gbG5dRvgrvcitiH8w0L/XcbKc9bkkZhFFwV+fh5zycIzpyDWLxIJmm2DmTRa w5Vbx3xb/kQC/6Y85yd2y+r3GOKLnoY8W4L0xXNZTjq8CBi7qrtvxQx2H/A8kdfI r/HTvKYATyXw+KuOiWLUgwtlbnBqrI76xCwgcCE7DFRGHrwKaYLi5+IGjE8fq/2T VGP5uQH01AF8uayjwJWa6yCD+vVSZU4zSODgzGvJ34yBVI4blc9K9plvNH4Mju/G yBryodKMseK54EbzK/gs+l9PlHeLA8xT9WPmpKDTlFo30I0CKCd/jWjEbtiFxOfF Lo8z6lzodCWjCpDITwrsYxncQ64EqjHGUWGfXbnrrt2DYauF9lC1CWuMZy01s2Tq wWOTsQOjOsYB05Bxl/CSgKQ/GWVGkTQswH6QGp5M2qibCnw5IJYi7EeyvUUCAwEA AQKCAgALc02+N+k7AQiH14wB1MuoIKfc81FLqdZTkgmiT51Ch4e347sl4bYPIFIJ DFL9xRxDkqCOYddQakzYwoYjBigcEPjDyV89mO7OnAav24K7xmbkXQRSRCMyFvOl HRiGmS+pHvG1I0S0NYsz+S27xdPCRnX9A+XIe/5H1yEqZPVYhA2ZlKdwk77ep/tA jKmwfE9HxX32+Gr/QlK2lL3E17FjscwMlqgs0IK40gf1oJgMiFXqhaLgGAwvKUw9 Qc+3cr5hEDo2N3vFbLF5hVvQxuU9amUVGXXgjklCU2OfqAKa7ccrB7vBwQ/lmBHs /nQlTUUqqCTWyLY4gRdodDdbBgmOB/bBjD2lETop2XXi+31ghEecAP8twza368EA cGmgLrueARy885pOJ0EejtYs63Vrn8+6dsZ6muDdBbRVC72uoVvHoRnYnOiwbbF8 Waxclb+KfrRlXylLv/IQGaZafPM/Y3vERQ/y3oQJGf84dm2qRpFc2o2wOrts8LBw QMH/H9G4Y+04V/JPC9cEy0pSeTqYfpxdwz5hXG+6oKSiZB+nhLh/X6m4dknRKt6z ZsPPjDRyEDxOr6MylkYKvUYqdbNaZ4YrIPWmI1GzpOezx6gzzABg3iy8U4wIqS6Y 2uP/LJ+JI4WRtfpsmLd6aN+WXWgD2J+GZZqzizByfeJ58GwYwQKCAQEA4y1QEhPo TenKSu4wzAMfQS17fe0zBUxVebPqNFXAoXpvI8KPhtmAtOo752lYoNcVjbjwj3ex GM0+SAWkzRqy/XjLZT7SDo4xJJhueL5hivH0BLlckC862FmLKFe84fmI+FmQMkt0 FwxliHNa0qUoXa3c89tfmdA1vKiHNDsQnepP1DP0VBKG1MLD2JCazq55lT9W8RmJ cSxgfXfy1XlaLoVv15RDX5RV4hW8F71VLg14uzb5jDz8c7mnqrMj2oBKrQXYobPW mptLLp7UPUEjVptXKt5d5lPI6HtY93YxIlINdGnGIfIBsYDN1FSzayq3SG1sVJU7 BPN9CFIN8iqBMQKCAQEAz2qAMyF6+SUyJ48tUC/w8dxlnknTzWrDAcsoYxDqSADX lDszewyKXItQkixHViTN2K6cNUTkOlkeAhQoQ+f+zYNmqXE5AkPzdwQ8JQyQ41W7 WIBZ6OM6urcravZZnjiutx4xydbw0w3079soo65P7Sep46Xpc4fJszjwRf65cZmE kaF5wfugDkbcKE/lQRMjf0/mR+SI3NmLHCr0AV0PvigCq8gszWZ5X6SM4y+YH7ti q3x3LrBn+aQsM4F0vdMHEKEaKm52OKxx1FRT/SEqlVoR+QWDToKkBtumsIpf5TGT tjJSLaZokYvsq0GmqeIDSZrsp/fsm6D1GVcQgr1YVQKCAQEAvu6xklAK+ZjZvXpN ptmk5hm85cx7CiPq3vu4hr3fxZfqWurFyHd7dhI7wLXImH3NDqz1+g6F2Kt/gfbE WOHst55TjEdtMnCNmw1GI9MWljnedi34PvKDCZzQmVqMVHxugxR7XdoOuuRfXXxe RBYtQ/bBcm7Y/aSB1Yrq/5n40FBDQb1cx2A+1AjRo219vuHjK+3tO3vUCTtb6Xfr r0Fr6xeZNV3V9jnsqLTNvkIRmkAWTXrZ5+TF5NmPsqcXJiiXGq6EMPu+DXkhihBR nx3k/oBWlaAI2XFntQUec/VxPEAsMMBJlvQYOkBgPenmVdaz7nqRBtHZpcKjPmAA ep0AsQKCAQEAqqjDUM60YvjC2p/ItdisVCR2jBXMqpC0YO5qjZBmY9YlirZnNlBs K5cJNSwvieaAZE/PAVlsu8GFmkpBkxX4pdn/B128fWuxj/SxE/7R2+s3WatJzv/f 269IjxqhRDj5MHwslRlATzeFmDDnsD2FT+k5tLBXdBJ+1/L6Z20d4iVhWX3WM9C4 seaF0LlkNPXtWBxCqlaUcbqg5g1FdTW/9ULwZ60th9dP+Gzo6yjG7xz8I4MmgQju lA4LvFlA18shXgJgCBeZOCpTAlRcQsMeSYKxlQZ/MoL1ORtTfKBuJKN1GQ0wZpUs Js1Nbt92pQLsl4xcOhwY1zhJUo87a4clfQKCAQAcrULRZmhiQKo7NIfF/re+kmtZ tcy1zD8yLX9mr2L0vjEW/tihBLmiMJ75+6OEW0eUUFJVAByldjyfGQvwPHoH3zgl dBpTTZFdD56PZzHroUnQWO+XZSTXz7Rt6CIVl3WF2qTPHErziDZ1feIHOkvD/psI DsIOd2UKSRbijOHp9HlOrUtt7dLpPEKT+va1eDokRhSqIrO/yaiQwIDbJLo0gYnT L9jK6va8K1v9v3bvET7/nEokThLrZtwcGgPR+ia4GIqx2OImXYufUF+AgRi/+H8W jD3ItXpol3iDW0MwXn9bksM1mECbbkXMdrU50Zz6MP/XD2TZKpSLZiXDKY11 -----END RSA PRIVATE KEY----- freelan-2.0/samples/fscp/client/chris.crt000066400000000000000000000160731252300335000204660ustar00rootroot00000000000000Certificate: Data: Version: 3 (0x2) Serial Number: 3 (0x3) Signature Algorithm: sha1WithRSAEncryption Issuer: C=FR, ST=Alsace, L=Strasbourg, O=Freelan, CN=ca/emailAddress=contact@freelan.org Validity Not Before: May 5 12:48:52 2012 GMT Not After : May 3 12:48:52 2022 GMT Subject: C=FR, ST=Alsace, O=Freelan, CN=chris/emailAddress=contact@freelan.org Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (4096 bit) Modulus: 00:de:f1:8a:56:39:10:2c:4b:4f:b7:40:00:ca:ca: cb:12:35:49:dc:6f:f2:37:cb:11:3f:11:f9:e8:e6: 66:f6:63:0d:49:fc:8d:b6:1b:55:a6:62:8f:6b:0c: 01:e5:1c:ac:09:68:f6:3f:7d:40:fc:3d:4f:49:07: c4:54:5e:ae:54:1b:72:16:35:1f:ba:4f:a0:89:04: a1:86:7c:56:16:85:de:7d:1b:ee:f3:e6:2a:fd:99: b9:33:fe:25:c7:00:3e:fd:87:89:41:3b:57:7b:2b: 98:b0:b0:5e:69:9b:6b:fc:4a:9b:7d:4d:f3:3d:1d: f4:34:22:ea:83:5c:40:3a:9f:39:e6:ba:0a:49:86: 7a:ad:d7:c9:2f:22:48:9e:1e:b8:35:af:2e:34:2f: 35:67:d9:6b:56:64:62:a9:c6:d3:f3:11:d0:cd:89: 5d:83:0d:81:d8:94:26:94:1a:cd:90:d2:4d:d9:02: c5:24:bb:71:d6:b2:c7:9f:7b:1b:62:de:34:fb:29: 35:22:e3:5a:99:10:74:80:dd:aa:b4:d4:15:7d:70: 4a:2b:c1:f4:9c:9a:e2:de:2b:df:a9:ac:47:a5:6b: 54:74:34:27:b6:24:86:f6:7c:03:5e:ef:c2:20:ab: ed:56:0c:55:e1:21:ba:e1:cf:83:68:3a:e2:1d:5d: d3:6c:34:44:03:21:a7:89:db:c2:f0:59:f9:28:2a: 19:a3:8b:2b:b5:8f:66:e8:ef:c3:70:f7:4f:a5:c6: 4b:eb:b5:54:d0:50:46:3f:9d:65:13:d7:a6:9c:6c: 21:b4:1c:a7:46:67:06:fa:a9:71:e3:55:96:83:f2: 24:18:70:01:87:57:23:73:58:41:17:c4:ad:1e:ff: 14:bb:d9:fc:f8:23:dd:a0:4d:b2:ca:00:07:32:e2: bb:99:b8:d6:e4:61:51:d2:d2:6a:54:db:2e:4e:42: 26:9e:8d:a0:ab:22:4a:d4:6f:a8:88:b4:7d:35:b8: 0f:3a:2d:05:0d:c4:b8:3d:16:57:c0:44:2a:69:cf: 17:e4:c6:bd:00:ce:53:5d:d3:f8:43:f5:b8:ec:ba: db:6b:7c:75:85:ab:91:44:cf:12:7d:e7:e4:2f:0c: 62:7e:d1:76:42:87:84:23:9f:94:d8:78:cf:02:9b: a3:f8:e5:aa:34:14:49:78:9e:2a:24:35:38:02:1f: 5d:35:b4:fc:e3:06:2c:a5:d8:a7:0b:69:94:7f:ea: 80:c1:90:8a:82:a9:f9:0d:7e:b7:90:04:d6:23:99: 34:77:4f:ea:41:b8:68:95:37:3e:4d:bd:57:59:70: 07:46:c7:d2:47:7a:33:62:59:4f:d5:ee:82:3b:c1: 32:8f:bb Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: A4:5F:B8:B0:91:D1:7E:7F:56:9E:E7:62:CD:D8:11:05:BB:39:4A:BE X509v3 Authority Key Identifier: keyid:42:9C:36:BD:CB:2F:F4:D9:5E:AB:2B:18:24:8B:01:2D:42:C2:E1:47 Signature Algorithm: sha1WithRSAEncryption 95:ee:3a:97:8e:9b:e0:57:08:ac:94:9e:b4:42:cc:0c:f4:e7: f4:92:bd:73:e3:5f:71:34:47:75:90:fe:c2:73:1d:94:30:4b: 5e:e2:1c:ce:91:b1:5d:c2:6a:40:05:14:15:8f:f1:cd:8a:61: af:ce:8a:e4:00:30:91:ca:96:ed:57:f1:07:f0:d7:b0:ac:59: 88:93:2b:aa:62:1a:13:e6:77:7c:e8:8a:9f:12:51:98:67:9d: 68:38:e1:ec:7d:13:e0:c5:7f:f6:f7:fe:91:4f:29:da:de:e0: 73:fc:20:3f:c6:aa:67:4e:3e:ed:bf:2c:c1:8a:35:e5:d9:b4: fe:28:52:72:47:de:d2:20:98:2d:73:ba:79:e7:51:92:22:6c: db:3b:5a:0d:d5:28:e5:a1:b3:42:2b:d0:a2:66:1c:82:f2:f3: d8:16:05:1e:ba:68:a2:3f:95:4d:39:9e:e2:a0:27:4d:0c:07: d0:b3:f9:36:1f:c8:3c:51:8f:48:50:44:e2:12:02:99:26:c5: 64:d2:86:7b:bc:cc:38:a5:86:79:f7:10:7d:29:42:00:de:fe: 90:01:dd:f5:c2:8d:0f:0f:5d:ea:a6:1b:8d:6d:59:f0:d1:dc: d7:cb:47:2e:5c:ee:95:79:89:7a:8c:e0:bf:b4:c4:bc:f9:28: 68:e7:1b:88:b2:55:6c:77:0d:2c:cf:89:55:a4:43:f7:66:aa: 3e:6b:b1:bd:9f:81:11:74:22:2d:44:7d:00:fd:0f:9e:f1:76: ca:fc:15:e6:67:2c:dc:1e:2f:ec:fd:8d:35:42:21:00:6d:86: b5:de:66:04:ad:78:39:7e:30:3b:95:bf:13:e8:28:27:30:4f: a9:bb:ed:22:4d:11:03:de:49:97:d2:03:2e:e3:b1:2f:08:30: 9b:a6:4b:21:b7:8a:63:04:cb:3b:28:2b:f0:b9:fd:c1:05:ae: 16:5a:8e:3a:f3:27:2f:21:3b:0c:f8:12:cc:4b:fe:c1:ca:fc: d2:8d:8c:3d:56:b4:41:8b:b8:f0:ab:a8:55:ca:1c:a2:11:12: 0d:1b:d2:8d:b0:d2:b4:94:43:22:7e:d6:49:0e:0a:0c:1b:c2: ad:ed:df:56:63:5a:16:fe:e7:41:34:76:94:3d:be:8f:10:b8: 95:ac:63:95:f1:5f:75:4a:7b:f0:e1:52:d8:3e:08:67:df:36: 24:94:fa:5b:b6:02:25:fa:e4:20:a2:07:a5:21:24:7e:50:07: 2e:90:0b:ba:56:ff:c2:54:65:10:d4:77:85:9c:f8:61:62:2a: ce:16:09:c0:1e:9b:21:4a:c4:54:b1:97:e6:6b:1a:c9:fd:ef: a0:fc:9e:4b:c4:35:18:09 -----BEGIN CERTIFICATE----- MIIF0DCCA7igAwIBAgIBAzANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJGUjEP MA0GA1UECAwGQWxzYWNlMRMwEQYDVQQHDApTdHJhc2JvdXJnMRAwDgYDVQQKDAdG cmVlbGFuMQswCQYDVQQDDAJjYTEiMCAGCSqGSIb3DQEJARYTY29udGFjdEBmcmVl bGFuLm9yZzAeFw0xMjA1MDUxMjQ4NTJaFw0yMjA1MDMxMjQ4NTJaMGQxCzAJBgNV BAYTAkZSMQ8wDQYDVQQIDAZBbHNhY2UxEDAOBgNVBAoMB0ZyZWVsYW4xDjAMBgNV BAMMBWNocmlzMSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGZyZWVsYW4ub3JnMIIC IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA3vGKVjkQLEtPt0AAysrLEjVJ 3G/yN8sRPxH56OZm9mMNSfyNthtVpmKPawwB5RysCWj2P31A/D1PSQfEVF6uVBty FjUfuk+giQShhnxWFoXefRvu8+Yq/Zm5M/4lxwA+/YeJQTtXeyuYsLBeaZtr/Eqb fU3zPR30NCLqg1xAOp855roKSYZ6rdfJLyJInh64Na8uNC81Z9lrVmRiqcbT8xHQ zYldgw2B2JQmlBrNkNJN2QLFJLtx1rLHn3sbYt40+yk1IuNamRB0gN2qtNQVfXBK K8H0nJri3ivfqaxHpWtUdDQntiSG9nwDXu/CIKvtVgxV4SG64c+DaDriHV3TbDRE AyGnidvC8Fn5KCoZo4srtY9m6O/DcPdPpcZL67VU0FBGP51lE9emnGwhtBynRmcG +qlx41WWg/IkGHABh1cjc1hBF8StHv8Uu9n8+CPdoE2yygAHMuK7mbjW5GFR0tJq VNsuTkImno2gqyJK1G+oiLR9NbgPOi0FDcS4PRZXwEQqac8X5Ma9AM5TXdP4Q/W4 7Lrba3x1hauRRM8SfefkLwxiftF2QoeEI5+U2HjPApuj+OWqNBRJeJ4qJDU4Ah9d NbT84wYspdinC2mUf+qAwZCKgqn5DX63kATWI5k0d0/qQbholTc+Tb1XWXAHRsfS R3ozYllP1e6CO8Eyj7sCAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0E HxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFKRfuLCR 0X5/Vp7nYs3YEQW7OUq+MB8GA1UdIwQYMBaAFEKcNr3LL/TZXqsrGCSLAS1CwuFH MA0GCSqGSIb3DQEBBQUAA4ICAQCV7jqXjpvgVwislJ60QswM9Of0kr1z419xNEd1 kP7Ccx2UMEte4hzOkbFdwmpABRQVj/HNimGvzorkADCRypbtV/EH8NewrFmIkyuq YhoT5nd86IqfElGYZ51oOOHsfRPgxX/29/6RTyna3uBz/CA/xqpnTj7tvyzBijXl 2bT+KFJyR97SIJgtc7p551GSImzbO1oN1SjlobNCK9CiZhyC8vPYFgUeumiiP5VN OZ7ioCdNDAfQs/k2H8g8UY9IUETiEgKZJsVk0oZ7vMw4pYZ59xB9KUIA3v6QAd31 wo0PD13qphuNbVnw0dzXy0cuXO6VeYl6jOC/tMS8+Sho5xuIslVsdw0sz4lVpEP3 Zqo+a7G9n4ERdCItRH0A/Q+e8XbK/BXmZyzcHi/s/Y01QiEAbYa13mYErXg5fjA7 lb8T6CgnME+pu+0iTRED3kmX0gMu47EvCDCbpksht4pjBMs7KCvwuf3BBa4WWo46 8ycvITsM+BLMS/7ByvzSjYw9VrRBi7jwq6hVyhyiERING9KNsNK0lEMiftZJDgoM G8Kt7d9WY1oW/udBNHaUPb6PELiVrGOV8V91Snvw4VLYPghn3zYklPpbtgIl+uQg ogelISR+UAcukAu6Vv/CVGUQ1HeFnPhhYirOFgnAHpshSsRUsZfmaxrJ/e+g/J5L xDUYCQ== -----END CERTIFICATE----- freelan-2.0/samples/fscp/client/chris.csr000066400000000000000000000032701252300335000204600ustar00rootroot00000000000000-----BEGIN CERTIFICATE REQUEST----- MIIEvjCCAqYCAQAweTELMAkGA1UEBhMCRlIxDzANBgNVBAgMBkFsc2FjZTETMBEG A1UEBwwKU3RyYXNib3VyZzEQMA4GA1UECgwHRnJlZWxhbjEOMAwGA1UEAwwFY2hy aXMxIjAgBgkqhkiG9w0BCQEWE2NvbnRhY3RAZnJlZWxhbi5vcmcwggIiMA0GCSqG SIb3DQEBAQUAA4ICDwAwggIKAoICAQDe8YpWORAsS0+3QADKyssSNUncb/I3yxE/ Efno5mb2Yw1J/I22G1WmYo9rDAHlHKwJaPY/fUD8PU9JB8RUXq5UG3IWNR+6T6CJ BKGGfFYWhd59G+7z5ir9mbkz/iXHAD79h4lBO1d7K5iwsF5pm2v8Spt9TfM9HfQ0 IuqDXEA6nznmugpJhnqt18kvIkieHrg1ry40LzVn2WtWZGKpxtPzEdDNiV2DDYHY lCaUGs2Q0k3ZAsUku3HWssefexti3jT7KTUi41qZEHSA3aq01BV9cEorwfScmuLe K9+prEela1R0NCe2JIb2fANe78Igq+1WDFXhIbrhz4NoOuIdXdNsNEQDIaeJ28Lw WfkoKhmjiyu1j2bo78Nw90+lxkvrtVTQUEY/nWUT16acbCG0HKdGZwb6qXHjVZaD 8iQYcAGHVyNzWEEXxK0e/xS72fz4I92gTbLKAAcy4ruZuNbkYVHS0mpU2y5OQiae jaCrIkrUb6iItH01uA86LQUNxLg9FlfARCppzxfkxr0AzlNd0/hD9bjsuttrfHWF q5FEzxJ95+QvDGJ+0XZCh4Qjn5TYeM8Cm6P45ao0FEl4niokNTgCH101tPzjBiyl 2KcLaZR/6oDBkIqCqfkNfreQBNYjmTR3T+pBuGiVNz5NvVdZcAdGx9JHejNiWU/V 7oI7wTKPuwIDAQABoAAwDQYJKoZIhvcNAQEFBQADggIBAAK6k8OcSSNmdvApf5Rz aFWrkDClwaOHFvaIPmtbDxWXW5j8nyB4KZEYDL/CJ+AYCiGonUro7U3F8C90yezL Gr46Qa8aUbH9PxGubypyErUQqDUsdr3fYtUAD9xLacESMUn1aUekRt9DR70UJBo2 Dh4RJtqlpzZdUa4jKaoubYU7u3Nb/Y+R44uZEw/ISUXVcnNajgXSJA7xN+3aBAez pFxUJn6EYUrGHSV+Vg0InZO9an9xeYv+sJnPD1vJTEaXMxZ+k4QIWs2fDNWwm+5W psVYMSAwVlBks/j2HvGSv2fk0tNZ0Ny2Ecu6eTVJG0TZku0edYfE9UezLS2T4ICw 5rFll0tyTZpxeVhw03cilZte83AO81AzJj8GqUhuOpFU7268FYW/QdCOf2F5y/1k EP+nw4dQlQPFS+khUgg6ySqepivZK1ue+TfHyRZDEzX2Nr5rAFbavCC5sCDWnB6H +XewxNWCt/K9kXzAW8SkqfUcUyMS6I/yb2QSmeEmea3xEfk+NDxT90C9ydVz3bKw M3GZTpvLruiNS06JikC/fh2O0SDjWKxUsHSXKPV501fKJLYKHsHpzHW8hw3umCfa NkfaGPyYI0xVD6eRh0qhPyVXB7tnJ+vZnCeY1xjWNOx5GfYXfIqReeZ4jlbna7GZ I7PFAZWCPh0ebZwZG6iTu0zJ -----END CERTIFICATE REQUEST----- freelan-2.0/samples/fscp/client/chris.key000066400000000000000000000062531252300335000204650ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIIJKQIBAAKCAgEA3vGKVjkQLEtPt0AAysrLEjVJ3G/yN8sRPxH56OZm9mMNSfyN thtVpmKPawwB5RysCWj2P31A/D1PSQfEVF6uVBtyFjUfuk+giQShhnxWFoXefRvu 8+Yq/Zm5M/4lxwA+/YeJQTtXeyuYsLBeaZtr/EqbfU3zPR30NCLqg1xAOp855roK SYZ6rdfJLyJInh64Na8uNC81Z9lrVmRiqcbT8xHQzYldgw2B2JQmlBrNkNJN2QLF JLtx1rLHn3sbYt40+yk1IuNamRB0gN2qtNQVfXBKK8H0nJri3ivfqaxHpWtUdDQn tiSG9nwDXu/CIKvtVgxV4SG64c+DaDriHV3TbDREAyGnidvC8Fn5KCoZo4srtY9m 6O/DcPdPpcZL67VU0FBGP51lE9emnGwhtBynRmcG+qlx41WWg/IkGHABh1cjc1hB F8StHv8Uu9n8+CPdoE2yygAHMuK7mbjW5GFR0tJqVNsuTkImno2gqyJK1G+oiLR9 NbgPOi0FDcS4PRZXwEQqac8X5Ma9AM5TXdP4Q/W47Lrba3x1hauRRM8SfefkLwxi ftF2QoeEI5+U2HjPApuj+OWqNBRJeJ4qJDU4Ah9dNbT84wYspdinC2mUf+qAwZCK gqn5DX63kATWI5k0d0/qQbholTc+Tb1XWXAHRsfSR3ozYllP1e6CO8Eyj7sCAwEA AQKCAgEAl+5XbgcZRHZWbvWJFKo61b/HBBiuIuOabzba7qMFi+dYyRD5qh7asbb9 MeBO8kol24vSNNYxETTe8U//tdeISf0iNIwjgR5+sqGbSkE1kcfNJcmBgGlc5tJ5 6jrKl+FNDA3vtaqxJVlChzbKQIIQhzB44l3a482j/FvHIZoek1Sratdh51VkCVDC 5AIjJs6cjslBXYLGjG0YvxlOO5EqI74CY++28HamBGiCGfBiIs2PC9LdcvjizYOs krycnzX7OSaN9aamuSUDoEZv7SeTNZbulP9qqcbL0MhpdgHYGZ0ZQs/AOFqQNy2w RmRyET3ZUgi6BeCssPJwBPoL2iN0zkSU87GAvnO19Q90CwJCAsOTG0AbToue6FCt ajKDGJlFti8FPlH7ok4/BCoo9GEERtHRMv9ZvhiL4qUGCVgxkHFBC/IPJw38JPq0 0HJJUdesso7woCS5TtEWfHRO/LJBF2qUX2u+G8m3Wk31qgwMHjUdc/DkWFfEjvgW GKWMvWiaA6JvlyoKtO2nPJQ87zsviKXpP0FFdOxJkLyKFQiYG/FyU4ULp27t55/Y IQHoxqwcB+cDAcBGNdAHxuFmMcLbNkwQN4wcdLXsp5CYgLxk1v3oR1U35N4RV9wx XS+EPZAxLwP+6FYiHf82XqHXdFUvyGxOzliTtGsu+vjtD6bs5JECggEBAPr60+5J vua9seVnSiWi0+Mynw+GoSiDbeO58SWGseyzIZP9/T/uL08xUYqar27VJXo+Hsuz XWhmdQ9x1yoyCGZU7zoII7WPZejyVT6ww70K0OIhs81ZQRHJruA+U9I0KPS7sLzP /rVKimgJWwmdF3f9BebJjqq5/Xl3uZsueBrzNsIMAeyZ7Ee/iUv0sACA/+lUJYSs hN0M+fc+yRKjjpKCEB2blhOBA1t2BrasRJWC5JjDL9Bg1JcIMCa/gjdraYxSfBEJ diRgA6Mz2m+/WSv/S4diWCY7VYS84yUQqS3ou19Dswj/s2SmzTvaqDZBPyVrtjSq tqlatBbBrvUk0K8CggEBAONnJj6n4ldAjb4yLPHOeDk1rmaGuIUywpgzVybj9Drv qbunsDpZzqNAzvj54iCDYlZa+/weiU6EJn705HWzkPIa5KBL//yGugWJLexByIVT Zjfbm3JIxFkg4zTiKDUo9RUWnlcVOy4O68CGkGkS7auhyJULrTgQrcn1NdSyjW6K DpzkMcns+zvePOW92ABAOolcsH+skR1zdBaTD9WIXsPZBMmGK3s98pJlBve7iGJw cjr9EvAHemTFQAW2KWKkM74BbiA+Bw7AvK7l4T1Mza1NdxrTwcrQ4v3bwsDs5XR2 cRAKBw+89R7EaCqxii/+g73rG/E6aZfLjUKJvONePLUCggEAbUvmFxNOazWYzwoY JCOwmnRlCGHctMPnixBij7EEssufh89IBhs3xwj3NaD/XQi9dWqwBo1p1BkqSTuO M/Xt6oJ6W49H3b1A6B0AOnjIBP88z/1VS8veplxqJ4V9A0FrxIgoA1Gg3lpDw+Kv HpSmr74kX8jOtFKiq88TqRyneTUJV5/bBqpRVz12EPnR26ZRy861N/3ZLlqEUMOq 1M8dO3gghIRI6t14FNBlRA/pHiMOYeg+XkSMz+jk7zre/jtsj4ssNE8mf9jAPMZM DfYKYzqeLasKMDwOleucD3wd8Lw1PNtCkFyqRt7M6Y/jSR1I3ob1piHhwgaZ/n8C LgeGSQKCAQEAnppZzUdwkORgN/Bs8nXL2jL7oVyDI7uEh3z/YwuIUvbHDi/ltLzg Z3KTKIm4Um7wTkSFDZIKuC1pYBDTqtgD1yg0nyyCrREWezfzRJ2ZCoxhdcIASBRC hdtvPHokCve2/+9XnmsbbINRoGT6IZ7nD1b2PCX5uWnAnGQfGGs0Q42cpYZux2Q2 0cmt9ZqUJZCmgxmXrGSijcTxibEmUQsc9UHOmfOvLfTF058M3gn5FJdSxJuv8qN0 lQYSIimr8bWOtQ3wTiKU75AzyVRh5UxFA4NM9/QLbLaGKwJ0cfSIENNvBf3IcQyc dcoM0QIk3FaKchKh2XyhGxMIQgkpKfeXJQKCAQAYib7ORYhjBSwUm4PVFyU0822a nLCHiYQdHJJ6queg37BQCRyiYN75pSbLIaZYtghg7FL6eHCgoLvfdr1iSezIycxA eBEQso8EHBVU7ZVDlNwU2bpm5z0AaB45OUpN5zLnBLhFF0yoDy9EBMxIF7LWELJV 445fSwNm/YM6ogVTh8ChrQjVxgHPMQ82AoHqMZMZD+cVABQFVNN3nOk+L/SDKh5R 0MS4OTwU2W4avoEDmDCBivKKf0bW/hrBsPd5UWpBxKa0wXhWyP7tjvl4YfZNjVnv FSsETspYSbLlgfF3WHV7BIEi8mR7705JXhnX8PWVMYp22uyJPTKLlFeST3B5 -----END RSA PRIVATE KEY----- freelan-2.0/samples/fscp/client/client.cpp000066400000000000000000000367541252300335000206360ustar00rootroot00000000000000/** * \file client.cpp * \author Julien Kauffmann * \brief A simple client. */ #include #include #include #include #include #include #include #include #include #include #include #include #include static boost::mutex output_mutex; using boost::mutex; void signal_handler(const boost::system::error_code& error, int signal_number, boost::function stop_function) { if (!error) { { mutex::scoped_lock lock(output_mutex); std::cerr << "Signal caught (" << signal_number << "): exiting..." << std::endl; } stop_function(); } } static void simple_handler(const std::string& name, const std::string& msg, const boost::system::error_code& ec) { mutex::scoped_lock lock(output_mutex); std::cout << "[" << name << "] " << msg << ": "; if (ec) { std::cout << ec.message(); } else { std::cout << "OK"; } std::cout << std::endl; } static bool on_hello(const std::string& name, fscp::server& server, const fscp::server::ep_type& sender, bool default_accept) { static_cast(server); mutex::scoped_lock lock(output_mutex); std::cout << "[" << name << "] Received HELLO request from " << sender << " (default accept is: " << default_accept << ")" << std::endl; server.async_introduce_to(sender, boost::bind(&simple_handler, name, "async_introduce_to()", _1)); return default_accept; } static void on_hello_response(const std::string& name, fscp::server& server, const fscp::server::ep_type& sender, const boost::system::error_code& ec, const boost::posix_time::time_duration& duration) { mutex::scoped_lock lock(output_mutex); if (ec) { std::cout << "[" << name << "] Received no HELLO response from " << sender << " after " << duration << ": " << ec.message() << std::endl; } else { std::cout << "[" << name << "] Received HELLO response from " << sender << " after " << duration << ": " << ec.message() << std::endl; server.async_introduce_to(sender, boost::bind(&simple_handler, name, "async_introduce_to()", _1)); std::cout << "[" << name << "] Sending a presentation message to " << sender << std::endl; } } static bool on_presentation(const std::string& name, fscp::server& server, const fscp::server::ep_type& sender, fscp::server::cert_type sig_cert, fscp::server::presentation_status_type status) { mutex::scoped_lock lock(output_mutex); std::cout << "[" << name << "] Received PRESENTATION from " << sender << " (" << sig_cert.subject() << ") - " << status << std::endl; server.async_request_session(sender, boost::bind(&simple_handler, name, "async_request_session()", _1)); return true; } static bool on_session_request(const std::string& name, fscp::server& server, const fscp::server::ep_type& sender, const fscp::cipher_suite_list_type&, const fscp::elliptic_curve_list_type&, bool default_accept) { mutex::scoped_lock lock(output_mutex); static_cast(server); std::cout << "[" << name << "] Received SESSION_REQUEST from " << sender << ". Default accept is: " << default_accept << std::endl; return default_accept; } static bool on_session(const std::string& name, fscp::server&, const fscp::server::ep_type& sender, fscp::cipher_suite_type cs, fscp::elliptic_curve_type ec, bool default_accept) { mutex::scoped_lock lock(output_mutex); std::cout << "[" << name << "] Received SESSION from " << sender << " (cipher suite: " << cs << ", elliptic curve: " << ec << ")" << std::endl; return default_accept; } static void on_session_failed(const std::string& name, fscp::server&, const fscp::server::ep_type& host, bool is_new) { mutex::scoped_lock lock(output_mutex); std::cout << "[" << name << "] Session failed with " << host << std::endl; std::cout << "[" << name << "] New session: " << is_new << std::endl; } static void on_session_error(const std::string& name, fscp::server&, const fscp::server::ep_type& host, bool is_new, const std::exception& error) { mutex::scoped_lock lock(output_mutex); std::cout << "[" << name << "] Session error with " << host << ": " << error.what() << std::endl; std::cout << "[" << name << "] New session: " << is_new << std::endl; } static void on_session_established(const std::string& name, fscp::server& server, const fscp::server::ep_type& host, bool is_new, const fscp::cipher_suite_type& cs, const fscp::elliptic_curve_type& ec) { mutex::scoped_lock lock(output_mutex); std::cout << "[" << name << "] Session established with " << host << std::endl; std::cout << "[" << name << "] New session: " << is_new << std::endl; std::cout << "[" << name << "] Cipher suite: " << cs << std::endl; std::cout << "[" << name << "] Elliptic curve: " << ec << std::endl; static const std::string HELLO = "Hello you !"; server.async_send_data(host, fscp::CHANNEL_NUMBER_3, boost::asio::buffer(HELLO), boost::bind(&simple_handler, name, "async_send_data()", _1)); if (name == "alice") { using cryptoplus::file; cryptoplus::x509::certificate cert = cryptoplus::x509::certificate::from_certificate(file::open("chris.crt", "r")); fscp::hash_list_type hash_list; hash_list.insert(fscp::get_certificate_hash(cert)); server.async_send_contact_request(host, hash_list, boost::bind(&simple_handler, name, "async_send_contact_request()", _1)); } } static void on_session_lost(const std::string& name, fscp::server&, const fscp::server::ep_type& host, fscp::server::session_loss_reason reason) { mutex::scoped_lock lock(output_mutex); std::cout << "[" << name << "] Session lost with " << host << " (" << reason << ")" << std::endl; } static void on_data(const std::string& name, fscp::server& server, const fscp::server::ep_type& sender, fscp::channel_number_type channel_number, fscp::SharedBuffer, boost::asio::const_buffer data) { static_cast(server); static std::atomic send_counter; if (channel_number == fscp::CHANNEL_NUMBER_3) { const std::string str_data(boost::asio::buffer_cast(data), boost::asio::buffer_size(data)); mutex::scoped_lock lock(output_mutex); std::cout << "[" << name << "] Received DATA on channel " << static_cast(channel_number) << " from " << sender << ": " << str_data << std::endl; } else if (channel_number == fscp::CHANNEL_NUMBER_4) { const int receive_counter = *boost::asio::buffer_cast(data); mutex::scoped_lock lock(output_mutex); std::cout << "[" << name << "] Received DATA on channel " << static_cast(channel_number) << " from " << sender << ": #" << receive_counter << std::endl; } if ((name == "alice") || (name == "chris")) { const boost::shared_ptr local_counter(new int(send_counter++)); server.async_send_data( sender, fscp::CHANNEL_NUMBER_4, boost::asio::buffer(local_counter.get(), sizeof(int)), [name, local_counter](const boost::system::error_code& ec) { simple_handler(name, "async_send_data()", ec); } ); } } static bool on_contact_request_message(const std::string& name, fscp::server& server, const fscp::server::ep_type& sender, fscp::server::cert_type cert, fscp::hash_type hash, const fscp::server::ep_type& target) { static_cast(server); mutex::scoped_lock lock(output_mutex); std::cout << "[" << name << "] Received CONTACT_REQUEST from " << sender << ": Where is " << cert.subject() << " ? (Answer: " << hash << " is at " << target << ")" << std::endl; return true; } static void on_contact_message(const std::string& name, fscp::server& server, const fscp::server::ep_type& sender, fscp::hash_type hash, const fscp::server::ep_type& target) { mutex::scoped_lock lock(output_mutex); std::cout << "[" << name << "] Received CONTACT from " << sender << ": " << hash << " is at " << target << std::endl; server.async_greet(target, boost::bind(&on_hello_response, name, boost::ref(server), target, _1, _2)); } int main() { cryptoplus::crypto_initializer crypto_initializer; cryptoplus::algorithms_initializer algorithms_initializer; cryptoplus::error::error_strings_initializer error_strings_initializer; try { boost::asio::io_service _io_service; boost::asio::signal_set signals(_io_service, SIGINT, SIGTERM); fscp::logger _logger; using cryptoplus::file; cryptoplus::x509::certificate alice_cert = cryptoplus::x509::certificate::from_certificate(file::open("alice.crt", "r")); cryptoplus::pkey::pkey alice_key = cryptoplus::pkey::pkey::from_private_key(file::open("alice.key", "r")); cryptoplus::x509::certificate bob_cert = cryptoplus::x509::certificate::from_certificate(file::open("bob.crt", "r")); cryptoplus::pkey::pkey bob_key = cryptoplus::pkey::pkey::from_private_key(file::open("bob.key", "r")); cryptoplus::x509::certificate chris_cert = cryptoplus::x509::certificate::from_certificate(file::open("chris.crt", "r")); cryptoplus::pkey::pkey chris_key = cryptoplus::pkey::pkey::from_private_key(file::open("chris.key", "r")); fscp::server alice_server(_io_service, _logger, fscp::identity_store(alice_cert, alice_key)); fscp::server bob_server(_io_service, _logger, fscp::identity_store(bob_cert, bob_key)); fscp::server chris_server(_io_service, _logger, fscp::identity_store(chris_cert, chris_key)); alice_server.set_hello_message_received_callback(boost::bind(&on_hello, "alice", boost::ref(alice_server), _1, _2)); bob_server.set_hello_message_received_callback(boost::bind(&on_hello, "bob", boost::ref(bob_server), _1, _2)); chris_server.set_hello_message_received_callback(boost::bind(&on_hello, "chris", boost::ref(chris_server), _1, _2)); alice_server.set_presentation_message_received_callback(boost::bind(&on_presentation, "alice", boost::ref(alice_server), _1, _2, _3)); bob_server.set_presentation_message_received_callback(boost::bind(&on_presentation, "bob", boost::ref(bob_server), _1, _2, _3)); chris_server.set_presentation_message_received_callback(boost::bind(&on_presentation, "chris", boost::ref(chris_server), _1, _2, _3)); alice_server.set_session_request_message_received_callback(boost::bind(&on_session_request, "alice", boost::ref(alice_server), _1, _2, _3, _4)); bob_server.set_session_request_message_received_callback(boost::bind(&on_session_request, "bob", boost::ref(bob_server), _1, _2, _3, _4)); chris_server.set_session_request_message_received_callback(boost::bind(&on_session_request, "chris", boost::ref(chris_server), _1, _2, _3, _4)); alice_server.set_session_message_received_callback(boost::bind(&on_session, "alice", boost::ref(alice_server), _1, _2, _3, _4)); bob_server.set_session_message_received_callback(boost::bind(&on_session, "bob", boost::ref(bob_server), _1, _2, _3, _4)); chris_server.set_session_message_received_callback(boost::bind(&on_session, "chris", boost::ref(chris_server), _1, _2, _3, _4)); alice_server.set_session_failed_callback(boost::bind(&on_session_failed, "alice", boost::ref(alice_server), _1, _2)); bob_server.set_session_failed_callback(boost::bind(&on_session_failed, "bob", boost::ref(bob_server), _1, _2)); chris_server.set_session_failed_callback(boost::bind(&on_session_failed, "chris", boost::ref(chris_server), _1, _2)); alice_server.set_session_error_callback(boost::bind(&on_session_error, "alice", boost::ref(alice_server), _1, _2, _3)); bob_server.set_session_error_callback(boost::bind(&on_session_error, "bob", boost::ref(bob_server), _1, _2, _3)); chris_server.set_session_error_callback(boost::bind(&on_session_error, "chris", boost::ref(chris_server), _1, _2, _3)); alice_server.set_session_established_callback(boost::bind(&on_session_established, "alice", boost::ref(alice_server), _1, _2, _3, _4)); bob_server.set_session_established_callback(boost::bind(&on_session_established, "bob", boost::ref(bob_server), _1, _2, _3, _4)); chris_server.set_session_established_callback(boost::bind(&on_session_established, "chris", boost::ref(chris_server), _1, _2, _3, _4)); alice_server.set_session_lost_callback(boost::bind(&on_session_lost, "alice", boost::ref(alice_server), _1, _2)); bob_server.set_session_lost_callback(boost::bind(&on_session_lost, "bob", boost::ref(bob_server), _1, _2)); chris_server.set_session_lost_callback(boost::bind(&on_session_lost, "chris", boost::ref(chris_server), _1, _2)); alice_server.set_data_received_callback(boost::bind(&on_data, "alice", boost::ref(alice_server), _1, _2, _3, _4)); bob_server.set_data_received_callback(boost::bind(&on_data, "bob", boost::ref(bob_server), _1, _2, _3, _4)); chris_server.set_data_received_callback(boost::bind(&on_data, "chris", boost::ref(chris_server), _1, _2, _3, _4)); bob_server.set_contact_request_received_callback(boost::bind(&on_contact_request_message, "bob", boost::ref(bob_server), _1, _2, _3, _4)); alice_server.set_contact_received_callback(boost::bind(&on_contact_message, "alice", boost::ref(alice_server), _1, _2, _3)); alice_server.open(boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), 12000)); bob_server.open(boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), 12001)); chris_server.open(boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), 12002)); boost::asio::ip::udp::resolver resolver(_io_service); const boost::asio::ip::udp::resolver::query alice_query("127.0.0.1", "12000"); const boost::asio::ip::udp::resolver::query bob_query("127.0.0.1", "12001"); const boost::asio::ip::udp::resolver::query chris_query("127.0.0.1", "12002"); const boost::asio::ip::udp::endpoint alice_endpoint = *resolver.resolve(alice_query); const boost::asio::ip::udp::endpoint bob_endpoint = *resolver.resolve(bob_query); const boost::asio::ip::udp::endpoint chris_endpoint = *resolver.resolve(chris_query); alice_server.set_presentation(bob_endpoint, bob_cert, cryptoplus::buffer()); alice_server.set_presentation(chris_endpoint, chris_cert, cryptoplus::buffer()); bob_server.set_presentation(alice_endpoint, alice_cert, cryptoplus::buffer()); bob_server.set_presentation(chris_endpoint, chris_cert, cryptoplus::buffer()); chris_server.set_presentation(bob_endpoint, bob_cert, cryptoplus::buffer()); chris_server.set_presentation(chris_endpoint, chris_cert, cryptoplus::buffer()); alice_server.async_greet(bob_endpoint, boost::bind(&on_hello_response, "alice", boost::ref(alice_server), bob_endpoint, _1, _2)); chris_server.async_greet(bob_endpoint, boost::bind(&on_hello_response, "chris", boost::ref(chris_server), bob_endpoint, _1, _2)); auto stop_function = [&](){ alice_server.close(); bob_server.close(); chris_server.close(); }; signals.async_wait(boost::bind(signal_handler, _1, _2, stop_function)); boost::thread_group threads; const unsigned int THREAD_COUNT = boost::thread::hardware_concurrency(); std::cout << "Starting client with " << THREAD_COUNT << " thread(s)." << std::endl; for (std::size_t i = 0; i < THREAD_COUNT; ++i) { threads.create_thread([&_io_service, i, &stop_function, &signals] () { { mutex::scoped_lock lock(output_mutex); std::cout << "Thread #" << i << " started." << std::endl; } try { _io_service.run(); } catch (std::exception& ex) { mutex::scoped_lock lock(output_mutex); std::cout << "Fatal exception occured in thread #" << i << ": " << ex.what() << std::endl; stop_function(); signals.cancel(); } { mutex::scoped_lock lock(output_mutex); std::cout << "Thread #" << i << " stopped." << std::endl; } }); } threads.join_all(); } catch (std::exception& ex) { std::cerr << "Error: " << ex.what() << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } freelan-2.0/samples/fscp/client/denis.crt000066400000000000000000000160731252300335000204600ustar00rootroot00000000000000Certificate: Data: Version: 3 (0x2) Serial Number: 4 (0x4) Signature Algorithm: sha1WithRSAEncryption Issuer: C=FR, ST=Alsace, L=Strasbourg, O=Freelan, CN=ca/emailAddress=contact@freelan.org Validity Not Before: May 5 12:48:56 2012 GMT Not After : May 3 12:48:56 2022 GMT Subject: C=FR, ST=Alsace, O=Freelan, CN=denis/emailAddress=contact@freelan.org Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (4096 bit) Modulus: 00:ba:89:22:1e:b2:60:d8:f0:82:ef:ee:14:67:79: 47:f4:00:40:62:e7:81:3b:43:62:05:e5:13:e2:30: f0:97:6f:47:b3:fc:f9:09:74:3c:7a:c8:23:fa:33: a1:9f:be:7c:72:92:b4:75:f7:83:2f:83:18:79:22: d9:9d:f7:ed:d7:f0:25:6b:03:89:b1:0e:6f:6c:91: fd:c7:b1:f0:d8:3a:f9:85:ff:94:1b:cd:02:e9:e6: f4:2d:5e:c6:8f:f7:8c:13:da:5a:84:9e:f3:38:a9: e7:5c:54:79:74:99:20:53:82:d5:ae:d9:9d:04:f4: 01:9c:53:73:0f:20:b6:d8:fc:89:ac:71:9c:3b:6f: 1c:db:fa:b2:7f:12:03:6e:55:3f:b6:cf:8b:59:24: bd:44:72:e8:b6:03:bc:29:40:6d:54:a8:df:67:5f: 45:e5:98:ac:dc:15:85:26:a0:69:ab:4b:41:64:e2: 1f:59:87:ce:99:2d:3b:8e:f0:94:04:a3:b1:9e:75: 31:c9:a5:84:6d:39:cb:ce:36:10:d4:7c:c9:93:68: 4e:a9:60:fd:c1:29:cc:86:f1:05:4e:71:25:10:25: 20:bc:36:db:40:89:32:4b:20:0e:58:25:96:59:0e: 05:63:71:06:4c:7c:58:f6:3c:3e:9c:9f:5b:74:3f: f3:80:78:78:b1:6c:d9:01:64:c4:4f:55:f0:c6:7d: 18:1c:b6:ca:0f:d2:70:cd:77:a1:9c:28:cb:d0:1e: ce:42:c0:8f:93:4d:84:55:8c:4c:81:6f:ff:fe:f3: 99:a4:7d:f0:70:a5:19:0b:a2:9d:39:18:93:84:e1: 82:bf:d9:cd:72:ed:46:68:44:19:cf:6e:88:88:64: 3b:fb:23:c7:66:f9:af:be:9e:a7:ac:a0:90:f9:1f: d3:16:3d:53:7a:03:73:d2:c9:3f:37:1b:a1:c6:c1: 3a:06:a8:03:f5:a0:14:2e:8f:69:d4:3d:14:ba:20: 96:ae:4f:87:57:f6:3b:76:25:b1:ab:55:3b:ae:96: 5b:94:a9:42:25:3b:f7:b9:23:72:ea:ab:d0:bc:8a: ed:ac:ec:dc:31:04:28:39:59:31:3d:14:96:f7:dc: 8b:d6:b1:65:d2:42:fc:cb:fc:87:a6:4a:1f:0a:11: ef:28:70:11:72:d2:95:3c:7d:b4:17:3c:e2:77:29: 71:64:10:2a:bc:a0:cd:a1:98:69:0d:81:86:da:a7: dc:57:f7:57:af:38:67:bb:83:96:9b:c3:84:ba:2e: 5c:9d:ec:8c:fc:87:1b:27:ac:59:41:8e:03:f8:16: 22:54:27:bb:54:5b:c7:ce:22:ab:2e:5d:bc:34:4c: 14:de:e3 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 1C:67:E3:2C:25:29:02:00:38:3C:A5:B6:E3:A2:37:9C:8F:A5:DB:34 X509v3 Authority Key Identifier: keyid:42:9C:36:BD:CB:2F:F4:D9:5E:AB:2B:18:24:8B:01:2D:42:C2:E1:47 Signature Algorithm: sha1WithRSAEncryption b2:da:83:96:6b:a4:78:9e:c5:bf:75:f3:0a:32:a5:f0:fb:c3: 1a:58:42:bc:a8:29:1b:ac:b9:f6:cd:d1:a4:7c:e2:76:e2:98: e1:96:8f:1b:ad:86:ee:df:41:74:7f:8a:85:f9:77:92:4d:e8: ca:e5:d5:6b:94:58:72:a1:63:03:f6:a3:8c:c0:6d:6d:53:1c: 9a:38:1c:36:5d:6b:0f:cd:8f:d9:8b:e8:f3:eb:ea:b0:b0:0b: c9:de:4c:0d:7e:06:53:1e:e2:78:fb:4a:40:ab:ac:60:6a:e4: 60:7f:78:e1:5f:a7:5c:8b:a8:8f:fc:c8:7b:70:d5:b1:47:05: 12:e9:2c:49:75:1a:29:dc:38:b4:ec:31:43:14:bd:f9:e6:1c: 87:1f:89:0e:08:93:a7:20:28:4c:c4:b2:4d:51:a1:85:c8:11: 4a:f5:b7:9c:70:0b:1f:1f:85:3b:d2:9c:a5:5e:ef:8a:0e:7e: 83:e6:b3:45:44:2b:2a:7f:a9:a2:cf:4d:64:bb:30:d1:48:ad: 03:b0:90:60:e4:54:63:da:3b:ff:74:e1:33:7a:0a:93:45:6c: 2b:86:a9:85:59:11:0b:2b:5c:79:b2:e2:5b:e6:da:b1:1d:4c: 97:a7:44:d9:2f:4c:f9:50:b9:ed:ae:85:eb:e1:d8:d1:a0:ae: 2b:00:47:81:bb:2a:a5:3d:74:d9:dc:f6:93:f9:8d:fb:be:f3: fe:1f:5e:e9:68:3d:27:98:5a:aa:48:22:a3:b2:63:91:40:94: 39:36:86:3b:58:f8:7b:be:d5:24:51:72:b1:4b:18:9e:fe:21: 82:02:06:eb:d7:41:2a:41:a7:6f:ef:0b:b3:2f:2f:1e:da:6a: d2:de:1f:c3:e4:5a:39:57:4a:da:8e:10:bf:99:54:5b:ca:9e: 0c:e5:4c:ce:26:1b:ae:0a:a9:7e:f2:a7:c3:61:6d:56:9c:db: f5:19:56:93:1d:3a:a8:ca:a2:5d:fe:3e:b9:a0:ee:16:b5:c0: b6:67:89:d3:91:aa:b8:43:d1:b8:3c:31:ae:b4:08:72:95:8d: 77:3e:95:d8:f1:25:7c:95:8d:0d:28:ea:ce:02:a9:91:19:77: e7:3d:03:a1:02:12:cc:3a:91:42:20:9b:b5:57:bc:4b:db:22: 5a:9f:31:5c:f0:e8:8c:7b:77:fe:c0:01:22:7d:c5:73:29:24: a0:1f:41:f2:84:2a:6e:9e:1c:61:13:25:48:56:6b:a9:3f:02: 33:6e:f2:21:c8:63:b6:cb:e5:c0:a4:c0:1c:98:13:9f:78:e1: 2d:b8:dd:12:17:43:ad:ec:fe:f7:78:17:bc:ae:8f:76:36:26: 7e:52:69:0a:5d:55:15:41 -----BEGIN CERTIFICATE----- MIIF0DCCA7igAwIBAgIBBDANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJGUjEP MA0GA1UECAwGQWxzYWNlMRMwEQYDVQQHDApTdHJhc2JvdXJnMRAwDgYDVQQKDAdG cmVlbGFuMQswCQYDVQQDDAJjYTEiMCAGCSqGSIb3DQEJARYTY29udGFjdEBmcmVl bGFuLm9yZzAeFw0xMjA1MDUxMjQ4NTZaFw0yMjA1MDMxMjQ4NTZaMGQxCzAJBgNV BAYTAkZSMQ8wDQYDVQQIDAZBbHNhY2UxEDAOBgNVBAoMB0ZyZWVsYW4xDjAMBgNV BAMMBWRlbmlzMSIwIAYJKoZIhvcNAQkBFhNjb250YWN0QGZyZWVsYW4ub3JnMIIC IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuokiHrJg2PCC7+4UZ3lH9ABA YueBO0NiBeUT4jDwl29Hs/z5CXQ8esgj+jOhn758cpK0dfeDL4MYeSLZnfft1/Al awOJsQ5vbJH9x7Hw2Dr5hf+UG80C6eb0LV7Gj/eME9pahJ7zOKnnXFR5dJkgU4LV rtmdBPQBnFNzDyC22PyJrHGcO28c2/qyfxIDblU/ts+LWSS9RHLotgO8KUBtVKjf Z19F5Zis3BWFJqBpq0tBZOIfWYfOmS07jvCUBKOxnnUxyaWEbTnLzjYQ1HzJk2hO qWD9wSnMhvEFTnElECUgvDbbQIkySyAOWCWWWQ4FY3EGTHxY9jw+nJ9bdD/zgHh4 sWzZAWTET1Xwxn0YHLbKD9JwzXehnCjL0B7OQsCPk02EVYxMgW///vOZpH3wcKUZ C6KdORiThOGCv9nNcu1GaEQZz26IiGQ7+yPHZvmvvp6nrKCQ+R/TFj1TegNz0sk/ NxuhxsE6BqgD9aAULo9p1D0UuiCWrk+HV/Y7diWxq1U7rpZblKlCJTv3uSNy6qvQ vIrtrOzcMQQoOVkxPRSW99yL1rFl0kL8y/yHpkofChHvKHARctKVPH20Fzzidylx ZBAqvKDNoZhpDYGG2qfcV/dXrzhnu4OWm8OEui5cneyM/IcbJ6xZQY4D+BYiVCe7 VFvHziKrLl28NEwU3uMCAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0E HxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFBxn4ywl KQIAODyltuOiN5yPpds0MB8GA1UdIwQYMBaAFEKcNr3LL/TZXqsrGCSLAS1CwuFH MA0GCSqGSIb3DQEBBQUAA4ICAQCy2oOWa6R4nsW/dfMKMqXw+8MaWEK8qCkbrLn2 zdGkfOJ24pjhlo8brYbu30F0f4qF+XeSTejK5dVrlFhyoWMD9qOMwG1tUxyaOBw2 XWsPzY/Zi+jz6+qwsAvJ3kwNfgZTHuJ4+0pAq6xgauRgf3jhX6dci6iP/Mh7cNWx RwUS6SxJdRop3Di07DFDFL355hyHH4kOCJOnIChMxLJNUaGFyBFK9beccAsfH4U7 0pylXu+KDn6D5rNFRCsqf6miz01kuzDRSK0DsJBg5FRj2jv/dOEzegqTRWwrhqmF WRELK1x5suJb5tqxHUyXp0TZL0z5ULntroXr4djRoK4rAEeBuyqlPXTZ3PaT+Y37 vvP+H17paD0nmFqqSCKjsmORQJQ5NoY7WPh7vtUkUXKxSxie/iGCAgbr10EqQadv 7wuzLy8e2mrS3h/D5Fo5V0rajhC/mVRbyp4M5UzOJhuuCql+8qfDYW1WnNv1GVaT HTqoyqJd/j65oO4WtcC2Z4nTkaq4Q9G4PDGutAhylY13PpXY8SV8lY0NKOrOAqmR GXfnPQOhAhLMOpFCIJu1V7xL2yJanzFc8OiMe3f+wAEifcVzKSSgH0HyhCpunhxh EyVIVmupPwIzbvIhyGO2y+XApMAcmBOfeOEtuN0SF0Ot7P73eBe8ro92NiZ+UmkK XVUVQQ== -----END CERTIFICATE----- freelan-2.0/samples/fscp/client/denis.csr000066400000000000000000000032701252300335000204520ustar00rootroot00000000000000-----BEGIN CERTIFICATE REQUEST----- MIIEvjCCAqYCAQAweTELMAkGA1UEBhMCRlIxDzANBgNVBAgMBkFsc2FjZTETMBEG A1UEBwwKU3RyYXNib3VyZzEQMA4GA1UECgwHRnJlZWxhbjEOMAwGA1UEAwwFZGVu aXMxIjAgBgkqhkiG9w0BCQEWE2NvbnRhY3RAZnJlZWxhbi5vcmcwggIiMA0GCSqG SIb3DQEBAQUAA4ICDwAwggIKAoICAQC6iSIesmDY8ILv7hRneUf0AEBi54E7Q2IF 5RPiMPCXb0ez/PkJdDx6yCP6M6GfvnxykrR194Mvgxh5Itmd9+3X8CVrA4mxDm9s kf3HsfDYOvmF/5QbzQLp5vQtXsaP94wT2lqEnvM4qedcVHl0mSBTgtWu2Z0E9AGc U3MPILbY/ImscZw7bxzb+rJ/EgNuVT+2z4tZJL1Ecui2A7wpQG1UqN9nX0XlmKzc FYUmoGmrS0Fk4h9Zh86ZLTuO8JQEo7GedTHJpYRtOcvONhDUfMmTaE6pYP3BKcyG 8QVOcSUQJSC8NttAiTJLIA5YJZZZDgVjcQZMfFj2PD6cn1t0P/OAeHixbNkBZMRP VfDGfRgctsoP0nDNd6GcKMvQHs5CwI+TTYRVjEyBb//+85mkffBwpRkLop05GJOE 4YK/2c1y7UZoRBnPboiIZDv7I8dm+a++nqesoJD5H9MWPVN6A3PSyT83G6HGwToG qAP1oBQuj2nUPRS6IJauT4dX9jt2JbGrVTuulluUqUIlO/e5I3Lqq9C8iu2s7Nwx BCg5WTE9FJb33IvWsWXSQvzL/IemSh8KEe8ocBFy0pU8fbQXPOJ3KXFkECq8oM2h mGkNgYbap9xX91evOGe7g5abw4S6Llyd7Iz8hxsnrFlBjgP4FiJUJ7tUW8fOIqsu Xbw0TBTe4wIDAQABoAAwDQYJKoZIhvcNAQEFBQADggIBAAza+WnYdIku39Wj72vd IeIw8jhTMW8vxVHUcPWhru8BKFUG/3mkJdCk04kAsZTfs6f7cTbaROFpNXrBQSIg U4E0AdNxVjLzXIh5cNj31DgImtys2XUFhoQ/YqEtKCHE0a9JRfapHjXyy5iL4sHc hJi521TcU7rfjnJSI+fDHPiQjp8zCYzNn71yOf75xQegA8VppDs+OOfrWK6Go3ys QXgebfPmD/b6KkXAs8DYZc3hRy6eSn+whjGjZFMaEdWI6EaSyqssn9Ay7M7tfBwy nKwqVzzALkruZS12RYnRehnZBxW10gEdw5y4qVHZ0uTLY9FrGJw9GzOdgj8ZRjCl ckq7eov94+qt3kgx4nB7haS28g+AmT+V11eUZTODXsVPOqpoa2b9SIYpNifh6oaJ vhmHW5IM9dCOeg6UgopprM07UVjQm6/Qdme7o6nSFilpN4KDrk6of07pz72P6CNe 9RLolvwtAlfWhygFv6Vk0bcgJs/7Xf2ecmnfVlyXT4YroNX0rnb04aXnH9HCgrxq LJ/nwR7fBhndd1Gri7qLAKpDIbaIFgjWhCfCNYaou5yr9B7yq0YexIvkRz0nfUCY 11obyQyAmS3WPliipXy/DRkEEWySLxhTGoMj8UyDQWnavHc9aDGk6wXyYJYNhFCv NFMm4pE7vcFMdhDz4UTIluIv -----END CERTIFICATE REQUEST----- freelan-2.0/samples/fscp/client/denis.key000066400000000000000000000062531252300335000204570ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIIJJwIBAAKCAgEAuokiHrJg2PCC7+4UZ3lH9ABAYueBO0NiBeUT4jDwl29Hs/z5 CXQ8esgj+jOhn758cpK0dfeDL4MYeSLZnfft1/AlawOJsQ5vbJH9x7Hw2Dr5hf+U G80C6eb0LV7Gj/eME9pahJ7zOKnnXFR5dJkgU4LVrtmdBPQBnFNzDyC22PyJrHGc O28c2/qyfxIDblU/ts+LWSS9RHLotgO8KUBtVKjfZ19F5Zis3BWFJqBpq0tBZOIf WYfOmS07jvCUBKOxnnUxyaWEbTnLzjYQ1HzJk2hOqWD9wSnMhvEFTnElECUgvDbb QIkySyAOWCWWWQ4FY3EGTHxY9jw+nJ9bdD/zgHh4sWzZAWTET1Xwxn0YHLbKD9Jw zXehnCjL0B7OQsCPk02EVYxMgW///vOZpH3wcKUZC6KdORiThOGCv9nNcu1GaEQZ z26IiGQ7+yPHZvmvvp6nrKCQ+R/TFj1TegNz0sk/NxuhxsE6BqgD9aAULo9p1D0U uiCWrk+HV/Y7diWxq1U7rpZblKlCJTv3uSNy6qvQvIrtrOzcMQQoOVkxPRSW99yL 1rFl0kL8y/yHpkofChHvKHARctKVPH20FzzidylxZBAqvKDNoZhpDYGG2qfcV/dX rzhnu4OWm8OEui5cneyM/IcbJ6xZQY4D+BYiVCe7VFvHziKrLl28NEwU3uMCAwEA AQKCAgARU0FXBoxWOeh/bmZ4wdv7/rX8ObJYFccZ8w/ot1DxT8WiIwHibehcIxCs YXVGiAO5BIU8W7PUiuGQBrudn3R41PY0vUxhpIyW0ex3SsCq5LdeScGw31bA8NGH EUFyB7T79xDnNngysB0sBzCMstg8yW8dYVrjJeKsaVfLdOdmufXzjU3Me2J70Aoa IUsuST60tQwlSHNH00Bn/2rPjgtZjKHLUR8F1yte+aS3VLjbzw6Q1yvAPgvjUD8y 5Idq8uVBaXMpXnUxS+fxDDZ99eUnCs4bj0WiVkaH1gT/JyUhHcGvmYy9rsB8F8sd RshzFwlLFilWm0oL/MZ395kf7/ymriBdEg/q0qbtuTlRIivxO2eAhv4apP++KzdQ eP5/xPOd+/oUVP3K3tyqAphRB25l4IPV55Ou5EEbhCzoM/JwvQ+X1D8hURNj55Ci HwrCOJPXcYaBIxgSxWNFw+fgeM98jw2KXlMUQDl5nLposdGBsOPAV1HTRR5jEbit k26p2trdsZsAvi19fOaVf9rneis+8RUwtuf57amLnc5M+4eg63t98ULZOGsipuFg CTjbNaE/gqRIhplvSrZOry00ykE/e81SkFiwEbbJWzM3Vmlm6LSmwij2czK1SSDM f2OYDr4E/CjFym4EliR9w2a8t5GgM7SFc/VPYPqfuJzb6EBzSQKCAQEA96w61Bxw jR1JboTzKkAjbQs79aggjv6Tv90/eNo4t62dC5Vs/NoduOVFwEyZH/Pj/JxJPFwv +pOFMBGnzCGI1e/j6rFR5w+5q8T0ReQX36uWQINryKvL+LtY/koa8LlZvH20cLRI ccEjqGeKIWQU4eo+8API2ZR1J4bTAykdMWM2zWn0Vyim6YYRwuBlgiKBEJYFOD7K G//UWwyGpdhnKdOLmVWtw6V07XZr8pHDPA5kUpphOLYeEzKkQb9qcIxta3g4WKyJ /ghuYiY/+BvC0KxejGOSjt+GDrNu+VVi8W6kwX8crFihWEVYLzOb+oGS7f5v/rjS FcpqIagLvlVQdwKCAQEAwM6vGmX5wBGp1cw0aY0Yest9VKlQ99halzdWIlvNqgc6 HMCXQvCxKAvswE3GclL2ml5K5gpCBdE9wdN9tf9+nWa2p+4UzIqj810s0NA0QVY1 ry/1lBc6zUHqcyj7dCJA7F4yTYAp2Pex6Nt8xUr5Z0lyQ8O+To0hDZnYmI4mlymM W2C/idcMbxvSmldSvm3ZAElRf9K5sxCK80zJi2jMXY+s1IbYwdRBJ8QTeGgC1FgD E37eux9c0PtUFO5+eWX9FLPjREnnVlEpihkk3Mkz7hW2F7wb0HhVQinN3A4jnsAk kDYKcxkI80J49PpT2hbGow9RGjK3/Xwt3xvVPARL9QKCAQAP8bN70jTgsMD4b3Ck CKr/Kxj6EI/ABN2IHXsnkYzTLkcM5tq0UGpXa9MYtRWqe+3yZjFExH6GOBb76DcQ KhyAAUh/5FhscpO2XiCHm056JLawgoVezsh7w7vP6v9e/d+sBb+m/cQoJpHgFoJK 8gFyJb1VgDje4PLFz6Un7+6kLknp4WdMcR6FrA7ap82BGi2K3s2JOGmUcdy+28iT RqIljCvRfDWKgc1MODJs1DtoU1jcBHo7x2WaQMlYPjVg93lX0M53zuu3Qd2xTdsS Yt8gxef0S7i0n+kmayC6xmdvOXs7xa4X3kDMyPILX9wrvUmzLo0RLd7Abl50uje/ UgizAoIBABIvLBqcRYrU36S3ZrYRxZ5HNOHYOje14w1h/bCt4d7IYbW2gE2i78Js JX8Zlr7PjkyO2heKHiH4Uw/Fx5RzrVhhCJccAEAuTzozrndfO55x6AxGxK2b50LW lasY0WZpmJ/yXmIq1UeOTOw+Ty04Xf9c0PcNLhSwgM6MlP4GYiNdmsw/erEgZB7S i/FcjQRCzfWV9KbOlA8MX16E/nk0gBnO5CkDMsxNHXwHpSJ1BNdMGbYsAAu78IAR RCPZPnpqoQzjzmpxYe0lKHrK1kwwecJZr9vbNPBbeQcNdEnt13QwgQJM5n1mfg6b VVcdiO0HuuJEHo0O/YVdweHJ+Tl42kUCggEAfzvpV/z3p528lUep1a1m2adJVtvm Nvz2J+qS+FanuF3yzpV/wxm/jJPLWsxRkQbr/grqaSceXbScfSJExc7V2J8Ly3hs nNI0ytlo4uwOA65E3K6yY5D1P+GlqwSPRFpP7fx5lo50GwwfdE+1q/Mjz19CDK8Q f/e58R1xjXAQkT5cZ2n/E9r7BXh0+AUu6DhRiLwA+iGlI90aBGM4TlA/Nl0oumsA IQzUX8mEBQYUgKOpXVxVKSC3A/T8GwROu7/BMYnG1mvPcz4JAW2Y0L9OO2Zg65+i Wop8CIW22bLgH2b++CiEoL5NI3Nav8PSnyXJIQ4+dA3v1JswowIfyTrhPw== -----END RSA PRIVATE KEY----- freelan-2.0/samples/fscp/schat/000077500000000000000000000000001252300335000164615ustar00rootroot00000000000000freelan-2.0/samples/fscp/schat/SConscript000066400000000000000000000006211252300335000204720ustar00rootroot00000000000000import os import sys libraries = [ 'fscp', 'cryptoplus', 'boost_thread', 'boost_system', 'crypto', ] if sys.platform.startswith('linux'): libraries.extend([ 'pthread', ]) Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/fscp/schat/alice.crt000066400000000000000000000023101252300335000202440ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDWjCCAkICCQCp02w1pasYDjANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJG UjEPMA0GA1UECBMGQWxzYWNlMRMwEQYDVQQHEwpTdHJhc2JvdXJnMRgwFgYDVQQK Ew93d3cuZnJlZWxhbi5vcmcxEDAOBgNVBAsTB2xpYmZzY3AxDjAMBgNVBAMTBWFs aWNlMB4XDTExMDQyODA4MjM0MVoXDTIxMDQyNTA4MjM0MVowbzELMAkGA1UEBhMC RlIxDzANBgNVBAgTBkFsc2FjZTETMBEGA1UEBxMKU3RyYXNib3VyZzEYMBYGA1UE ChMPd3d3LmZyZWVsYW4ub3JnMRAwDgYDVQQLEwdsaWJmc2NwMQ4wDAYDVQQDEwVh bGljZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANibOdleRebXSssm gg++gB/vpuWyJDpHZnN+0ZNC4kfmnH4JZ1ddKtrHonVL6dWNLbb1xjs6LFJHFlhl YvB3e/+AyjuJyWLmPsVPEnCqohwPIUv6I2PxG8xLIkMPDQHOej0C28ylGvXiAJmh SsGDvgLWBBzQU5588/qVdTP3OWLjdYb6LTV22i7vm8ouL8mODOc9vsyM8UrzaGjq 2P/sOchkyUIfTWfUG44ieFUcNZZ7U3Tv4TPvAwU53mO79MonOKcsFdr22YDWMTE4 j/SuHpq7KMDsdqu0keExqx+NJ4bJ/Qk/HeRLL5qqftQaU/UTefYTwwNPGYr35xH7 Hpd56b0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAlTEbe2gCNHA1oRXsHOaF4sm/ +fz9zs6VWDukuZdjggnMK+9ZHBioGTUUWHWI53tbvFVr1GwQ6V+hi/iPqFTkdtir 0QErPDqh32MWXG00AItxSFQIfu87MggMnVpBYNBOEu3kmWHGWu/pmQ59cYzLM4j4 s2kpqPhw02gCReN8H6izO0w483foO78V2PSNOPUlQfkY9bM2CQjYLhReR0X/b+1q MJHdZzY/UyyziXkUplbnuKknRFV0nVwVUdXqGKXgaV6ypfBz1xtDpk30SAx6rn9C C6ZaXlQkDZ+Sfh4FkYf0VUspJCifVt8LWdQOzRhcODH/PsDVhjssXtKkL7HAcg== -----END CERTIFICATE----- freelan-2.0/samples/fscp/schat/alice.csr000066400000000000000000000012241252300335000202460ustar00rootroot00000000000000-----BEGIN CERTIFICATE REQUEST----- MIIBrzCCARgCAQAwbzELMAkGA1UEBhMCRlIxDzANBgNVBAgTBkFsc2FjZTETMBEG A1UEBxMKU3RyYXNib3VyZzEYMBYGA1UEChMPd3d3LmZyZWVsYW4ub3JnMRAwDgYD VQQLEwdsaWJmc2NwMQ4wDAYDVQQDEwVhbGljZTCBnzANBgkqhkiG9w0BAQEFAAOB jQAwgYkCgYEAvXDIShJZQjoEAUiTAX9+clIQtauClLUlFV0Z03WPHtNILKGQys6C 0tnzNg6fy+RuQbXkaAnP4tipx0bLNrBdUXl0BWAcdU3B6HGEt1C6o3qmb06bZ2ho cTvn3z9GlvfCckxjCsttdXaIfebXc3xupemI0GQGfo5P9BrFH33psqsCAwEAAaAA MA0GCSqGSIb3DQEBBQUAA4GBAJdGOr2W52GIzyN4zw3kbrq/hTEt778dkdv+o9Nh rAB9eV0jBaVU5S1f0gyKSv9KJdiPHPRg5vgdXYU7f20CxMNF9U86l8aiCC1pfKGa 5yoCVfAbzcgioIVtFQi9ov45KuGocOHQBc1iyepxt6FCj2U83Rv10tTgD+ExXpM2 kjdw -----END CERTIFICATE REQUEST----- freelan-2.0/samples/fscp/schat/alice.key000066400000000000000000000032171252300335000202530ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEA2Js52V5F5tdKyyaCD76AH++m5bIkOkdmc37Rk0LiR+acfgln V10q2seidUvp1Y0ttvXGOzosUkcWWGVi8Hd7/4DKO4nJYuY+xU8ScKqiHA8hS/oj Y/EbzEsiQw8NAc56PQLbzKUa9eIAmaFKwYO+AtYEHNBTnnzz+pV1M/c5YuN1hvot NXbaLu+byi4vyY4M5z2+zIzxSvNoaOrY/+w5yGTJQh9NZ9QbjiJ4VRw1lntTdO/h M+8DBTneY7v0yic4pywV2vbZgNYxMTiP9K4emrsowOx2q7SR4TGrH40nhsn9CT8d 5Esvmqp+1BpT9RN59hPDA08ZivfnEfsel3npvQIDAQABAoIBAQCdfcfDD3Od013z dc1Na0K3dcWQ70S+Bxor0cLJ4vCqPLf+QBIeiIRXTJ4H0Sl091CM3gjDGZoOPNe3 cAhPNWE4NklUnuuJeEWdqs+KkdaKtkmMd5Rx32ZJ1TtVLMVVUe65G7H7CvUeYLP1 ADxdlc97OmcFGEgkTVAMG816+j+EcOygE2lND3WaeZ2TWFVhZfYEx9pRgHDT1Hpb nuwg8p3jpKhl9agmJEIIFGmNO41pJsbG/xj05USz6W/bDh+/bUbpF5l6HtS43IbY EtHiPnd1lkiDqMadaAXL1ojqRKKiSIR16aoP0cPTfPXgM0uJpLfzNP99GfS7jikk A7ALKPZ1AoGBAP4PIMbvctkdTkhG+JoOUB/QStu3Th9VsCDr1I43+4tj2abLKob5 PfVwtsJqKVscytNPQDwFQBsk4ZlCFUouLqlHDVt6pmhuN0WlPiiEge4AV6QeW7ti ONBp+Gi/8yjsKFCHNhJTN4zwmKfsWw94vpAHmxrN+agabQ+QJPDvPwqfAoGBANpC 2bAF8Lw2E0kCfLpFQGPLSj89OQFlFQsc9RIQugt6lV/K6QfN6uBBf9ZsM9m/DStd 3a0Z7w9IKmQbJSp5hIO3I6xGcyoRQ/5wMwTB9ye446Nwzf81keTvXWET5ssgTSE+ Dsh1IAPrYK7LSeSRN9tQSstoYT9GWn9NYElERsojAoGBALK/thIBms6DPfbAaF0L wPgBNwoLmF2Xjko7YtuFK+hQomwl+Y/pgNxVJ2D2DI7cXR/7XHheQVJXyppn0k7U 22OiaBV63+YN1bmcn3UmdbwcZY1FBsl6O/r29B3PH6glL+AoobSW9DinduB+/TqP e5QepdRgI01Q+na+th8GVVaFAoGBAM6swsnFtkHiyrw12Lnh3akh1Tqw1IwXlaei UgY7RJCeEVhWIfe7649TNqRqbWbhXK0WA1Vo21CTO2Dzu2vPCcZX4zW8uEy7cLE8 uXLl4Q4CK7yWktn5dh9c8gV8/OyXt7GkvAbhseFEP5cE9QG06TmJfGnEe2GZUxR8 xpJaTtYVAoGAUmVC6w+NUod4VdWBOpcldhFLouQ0XQFApWMWckJrz2D5r+a9cbkl vCdZpnDBhMbYAzAvj3TmU7khREVWjuMW82Fdc82/1qdyP2FfnsY4joU5yyE8Za5H tenGLZmsnq3tpmgkFiOx+SyS6O3X5CYn/nnOImK/eo1EoHD3yxlhcDs= -----END RSA PRIVATE KEY----- freelan-2.0/samples/fscp/schat/bob.crt000066400000000000000000000023001252300335000177300ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDVjCCAj4CCQDHTnvDnwaDGjANBgkqhkiG9w0BAQUFADBtMQswCQYDVQQGEwJG UjEPMA0GA1UECBMGQWxzYWNlMRMwEQYDVQQHEwpTdHJhc2JvdXJnMRgwFgYDVQQK Ew93d3cuZnJlZWxhbi5vcmcxEDAOBgNVBAsTB2xpYmZzY3AxDDAKBgNVBAMTA2Jv YjAeFw0xMTA0MjgwODIzNTNaFw0yMTA0MjUwODIzNTNaMG0xCzAJBgNVBAYTAkZS MQ8wDQYDVQQIEwZBbHNhY2UxEzARBgNVBAcTClN0cmFzYm91cmcxGDAWBgNVBAoT D3d3dy5mcmVlbGFuLm9yZzEQMA4GA1UECxMHbGliZnNjcDEMMAoGA1UEAxMDYm9i MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv/b/ZgwsunphuUuRVZ1W e/p/WapsDPGR22SUugTP6/hwdujVLRqkkFZIdKtghbm4kV5k+pjI4XFvulu152YW ENi+XM4tiZDrBQa5BmG9p05a9gLBlSPmdeF/b8VBzcA7+jeByC6gjAWAYvKW1Xoj 8NV/2Sb2wpAd+QjAgg3+pslQAITb1ysgtvn1MAAKKajuSZ0ZxDCb+2bUs4255+// 0WdhzoR9eBXFQBrPUd90MD7WpHoxDPNG2biZQFFRZTQRbqmoTfP1EY4gIepwXiQo UY3UGKAzj+/7/152pkDqZ29av9e0Xm4Q4SPgVKBvErpSm6nh/9V2mLxLGY6TbOr3 IwIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQBDnQA8rurhouurOpSn0puyejdJPTvI 3EH7f8Uxa57CsTDT0vGSZ3R45PeAjljCim2sCtU9FRwHDNNgE1UmEmfy5h7pmbn3 TbaicHWECb/xyZgH2FLGgfCfsLZ13bRbZwEFo7N5PooOC3FhQeRYQ/br0Fu5pQIz NTJ1vRXy52YLwpbv2XiV1UwdtArN+B1g1xJAh9kzzUjeWQWRg+ICC/1FYI2TsVd5 LnFNAAxVDDg/2wageZ9g4LrxJBQFqj5dVV7Naki/2ICS9CbURmd55u3SO4C5ntL0 Wiuu/RgJ3wH+XaCB6+LyWbSTr2zVEPzCzkTuq+p4KyrmpLHvRrZJ9Pwe -----END CERTIFICATE----- freelan-2.0/samples/fscp/schat/bob.csr000066400000000000000000000012241252300335000177330ustar00rootroot00000000000000-----BEGIN CERTIFICATE REQUEST----- MIIBrTCCARYCAQAwbTELMAkGA1UEBhMCRlIxDzANBgNVBAgTBkFsc2FjZTETMBEG A1UEBxMKU3RyYXNib3VyZzEYMBYGA1UEChMPd3d3LmZyZWVsYW4ub3JnMRAwDgYD VQQLEwdsaWJmc2NwMQwwCgYDVQQDEwNib2IwgZ8wDQYJKoZIhvcNAQEBBQADgY0A MIGJAoGBAL52fbZGYfRNKO2r7XRDc7eKz+k/1wEqTmuh1qexwL8Sd40I99RT+9gg rvvocTaTg2WsdmBpyQo3X/6/q6b8zS0LLeDNM7tRmpuX0G+G7svFHsyKAsXsbTN/ fFfEBvJPLk/mZ4FAus/WMLmoJMw95AP6vI7AExiDl7zBf2gHjEe9AgMBAAGgADAN BgkqhkiG9w0BAQUFAAOBgQAZUg6SqsRJ1tZ3GZ2IrNB6QZwvtIduxuzKKT7Qemin LZFPN4NWnH8DDWsTrjg3Hjx9/NOGPFmxaLC/nWcMIjZX7hy0VfzhhkbonZ0tP5da io2JbZG5pHXQnC9E4wq0+wx2AIEeap7PLFNiUe+N1chikIIIJGdUokJ1JB2KzyQ+ sA== -----END CERTIFICATE REQUEST----- freelan-2.0/samples/fscp/schat/bob.key000066400000000000000000000032131252300335000177340ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAv/b/ZgwsunphuUuRVZ1We/p/WapsDPGR22SUugTP6/hwdujV LRqkkFZIdKtghbm4kV5k+pjI4XFvulu152YWENi+XM4tiZDrBQa5BmG9p05a9gLB lSPmdeF/b8VBzcA7+jeByC6gjAWAYvKW1Xoj8NV/2Sb2wpAd+QjAgg3+pslQAITb 1ysgtvn1MAAKKajuSZ0ZxDCb+2bUs4255+//0WdhzoR9eBXFQBrPUd90MD7WpHox DPNG2biZQFFRZTQRbqmoTfP1EY4gIepwXiQoUY3UGKAzj+/7/152pkDqZ29av9e0 Xm4Q4SPgVKBvErpSm6nh/9V2mLxLGY6TbOr3IwIDAQABAoIBAAsJcHW1jXzLPIMi zSBXA3ntVRUar0uvN+udRM/NJwcyKYUsrdUCCyQhUdkjYVFO9EWnX7boweP0WbAl RbggLnSZgZhkYknegySu1kR/qh/MaX5reiXRApcUd/c9KCNkQg6I0nVn+OMUDeWi fPmZJCfcnpUloFpfXtnKnwbbNyDvqKFtbHCYgePUH3KgJ5n1agNg4RfQi+dbI4Q9 sWN5Zs5CWlgwyzThrM/y8W7Oj1H8+bber8ZGFz+WU7Y6fYWnZKYumcecEzOMZT/M Cbs1/q9a367JdilBRXj8YDIAPrd9I8HjRuyabS9a+m3RQGnY91hJ97BiFABRAyny pTV4IcECgYEA5B6o1wZ4I0BjZSDQ/lUaART6NYAcIQO6VDdEAnOrtnzvQMLGjfu6 deDF4aBzMbJbj0QNoHqPJTB8tg+vNDSJCNkh60O3jaJRu6x6Cvw6UGm3CTb2ARpq XlwDFRYfpqgn9tekxr0S/6uYUgbSr+5vOW9U2B4o3g5pWjCgi2afxB8CgYEA120i R0KA0SSmpVd/4Uq0tBTqVUWZZCVlGuN5tTNl1H7JEr3OAqrEo4IiSW4Gv3cS239g swU4Rjwmd0M8OFtFyBHGyjTGz9EZAlbqCqo4ho6YWkJVnVlMFrDRyges5tKVb+4+ SX56eFuUrK/uenJ3lhk4O7ngefC1oERkCI9xTH0CgYAfFjqGCwCmNSkWZ/FzJ1/C 0/wA/HNY4Gws+9cNynuVA9OK7MAoKyzO0ZHF3Jq2JAssK+b7fpgxRjlIijyjDaG7 DfP8Xp8N8xfWTnvXMWY0/SMPY2kE33etYjadUgWALZw8nEh9ONj09IpuazWc+g44 Mn7KcNm64RXkT4ohVRvimwKBgD47NI/JUlUYdVuGL1bxscnj0N3ZQTqA4vglhl8l /eCoz4Uud3ilxDBHw4fa1PAygawO2+xbMap4bdQ+BANzunDVUcvP+y7FhKf8W5fB HJsiTjikuP6/cQ+M/M2T8gqsAqdW939bnh1ut0A7gnS05H7jwi7ev036jz1BBHTE m0IxAoGBAIofelEamY3n+hvM4brPrJIZ8GBBgpP3g+jz5t4j8uINtIbiHFF3ny2R q++RSb4OGAmHsy0erBHmOS24D59l2HV8PHzblNEn7bQPyP3ROdcXZpuRJJVubu9g OAfyAPkjyBVDLTumjW93ZRKLEXvX9feGObopSv+Pz9O3nvxpcpB1 -----END RSA PRIVATE KEY----- freelan-2.0/samples/fscp/schat/schat.cpp000066400000000000000000000246201252300335000202730ustar00rootroot00000000000000/** * \file schat.cpp * \author Julien Kauffmann * \brief A simple chat client. */ #include #include #include #include #include #include #include #include #include #include #include using boost::asio::buffer; using boost::asio::buffer_cast; using boost::asio::buffer_size; static boost::mutex output_mutex; using boost::mutex; void signal_handler(const boost::system::error_code& error, int signal_number, boost::function stop_function) { if (!error) { { mutex::scoped_lock lock(output_mutex); std::cerr << "Signal caught (" << signal_number << "): exiting..." << std::endl; } stop_function(); } } static void simple_handler(const std::string& msg, const boost::system::error_code& ec) { mutex::scoped_lock lock(output_mutex); std::cout << msg << ": " << ec.message() << std::endl; } static bool on_hello(fscp::server& server, const fscp::server::ep_type& sender, bool default_accept) { mutex::scoped_lock lock(output_mutex); std::cout << "Received HELLO request from " << sender << std::endl; server.async_introduce_to(sender, boost::bind(&simple_handler, "async_introduce_to()", _1)); return default_accept; } static void on_hello_response(fscp::server& server, const fscp::server::ep_type& sender, const boost::system::error_code& ec, const boost::posix_time::time_duration& duration) { mutex::scoped_lock lock(output_mutex); if (ec) { std::cout << "Received no HELLO response from " << sender << " after " << duration << ": " << ec.message() << std::endl; } else { std::cout << "Received HELLO response from " << sender << " after " << duration << ": " << ec.message() << std::endl; server.async_introduce_to(sender, boost::bind(&simple_handler, "async_introduce_to()", _1)); std::cout << "Sending a presentation message to " << sender << std::endl; } } static bool on_presentation(fscp::server& server, const fscp::server::ep_type& sender, fscp::server::cert_type sig_cert, fscp::server::presentation_status_type status) { mutex::scoped_lock lock(output_mutex); std::cout << "Received PRESENTATION from " << sender << " (" << sig_cert.subject() << ") - " << status << std::endl; server.async_request_session(sender, boost::bind(&simple_handler, "async_request_session()", _1)); return true; } static bool on_session_request(const fscp::server::ep_type& sender, const fscp::cipher_suite_list_type&, const fscp::elliptic_curve_list_type&, bool default_accept) { mutex::scoped_lock lock(output_mutex); std::cout << "Received SESSION_REQUEST from " << sender << std::endl; return default_accept; } static bool on_session(const fscp::server::ep_type& sender, fscp::cipher_suite_type cs, fscp::elliptic_curve_type ec, bool default_accept) { mutex::scoped_lock lock(output_mutex); std::cout << "Received SESSION from " << sender << ": " << cs << ", " << ec << std::endl; return default_accept; } static void on_session_failed(const fscp::server::ep_type& host, bool is_new) { mutex::scoped_lock lock(output_mutex); std::cout << "Session failed with " << host << std::endl; std::cout << "New session: " << is_new << std::endl; } static void on_session_established(const fscp::server::ep_type& host, bool is_new, const fscp::cipher_suite_type& cs, const fscp::elliptic_curve_type& ec) { mutex::scoped_lock lock(output_mutex); std::cout << "Session established with " << host << std::endl; std::cout << "New session: " << is_new << std::endl; std::cout << "Cipher suite: " << cs << std::endl; std::cout << "Elliptic curve: " << ec << std::endl; } static void on_session_lost(const fscp::server::ep_type& host, fscp::server::session_loss_reason reason) { mutex::scoped_lock lock(output_mutex); std::cout << "Session lost with " << host << " (" << reason << ")" << std::endl; } static void on_data(const fscp::server::ep_type& sender, fscp::channel_number_type channel_number, fscp::SharedBuffer, boost::asio::const_buffer data) { try { mutex::scoped_lock lock(output_mutex); std::cout << sender << " (" << static_cast(channel_number) << "): " << std::string(buffer_cast(data), buffer_size(data)) << std::endl; } catch (std::exception&) { } } void handle_read_line(fscp::server& server, std::string line) { if (line[0] == '!') { std::istringstream iss(line.substr(1)); std::string command; if (iss >> command) { if (command == "connect") { std::string host, port; iss >> host >> port; boost::asio::ip::udp::resolver resolver(server.get_io_service()); boost::asio::ip::udp::resolver::query query(host, port); try { boost::asio::ip::udp::endpoint ep = *resolver.resolve(query); server.async_greet(ep, boost::bind(&on_hello_response, boost::ref(server), ep, _1, _2)); std::cout << "Contacting " << ep << "..." << std::endl; } catch (std::exception& ex) { std::cerr << "Unable to resolve the specified host/port: " << ex.what() << std::endl; } } else if (command == "quit" || command == "exit") { server.close(); } } } else { fscp::SharedBuffer buf(line.size()); std::memcpy(buffer_cast(buf), &line[0], line.size()); server.async_send_data_to_all(fscp::CHANNEL_NUMBER_0, buffer(buf), [buf] (const std::map& results) { mutex::scoped_lock lock(output_mutex); for (std::map::const_iterator result = results.begin(); result != results.end(); ++result) { if (result->second) { std::cout << result->first << ": " << result->second.message() << std::endl; } else { std::cout << result->first << ": message sent successfully." << std::endl; } } }); } } #ifdef BOOST_ASIO_HAS_POSIX_STREAM_DESCRIPTOR void handle_read_input(fscp::server& server, boost::asio::posix::stream_descriptor& input, const boost::system::error_code& ec, boost::asio::streambuf& input_buffer, size_t length) { if (!ec) { std::string line(length - 1, '\0'); input_buffer.sgetn(&line[0], length - 1); input_buffer.consume(1); handle_read_line(server, line); boost::asio::async_read_until(input, input_buffer, '\n', boost::bind(&handle_read_input, boost::ref(server), boost::ref(input), boost::asio::placeholders::error, boost::ref(input_buffer), boost::asio::placeholders::bytes_transferred)); } else { server.close(); } } #endif int main(int argc, char** argv) { try { if (argc != 5) { std::cerr << "Usage: schat " << std::endl; return EXIT_FAILURE; } const std::string certificate_filename(argv[1]); const std::string private_key_filename(argv[2]); const std::string listen_host(argv[3]); const std::string listen_port(argv[4]); cryptoplus::crypto_initializer crypto_initializer; cryptoplus::algorithms_initializer algorithms_initializer; cryptoplus::error::error_strings_initializer error_strings_initializer; boost::asio::io_service io_service; boost::asio::signal_set signals(io_service, SIGINT, SIGTERM); fscp::logger _logger; boost::asio::ip::udp::resolver listen_resolver(io_service); boost::asio::ip::udp::resolver::query listen_query(listen_host, listen_port); boost::asio::ip::udp::endpoint listen_ep = *listen_resolver.resolve(listen_query); cryptoplus::x509::certificate certificate = cryptoplus::x509::certificate::from_certificate(cryptoplus::file::open(certificate_filename, "r")); cryptoplus::pkey::pkey private_key = cryptoplus::pkey::pkey::from_private_key(cryptoplus::file::open(private_key_filename, "r")); const std::string local_name = certificate.subject().find(NID_commonName)->data().str(); fscp::server server(io_service, _logger, fscp::identity_store(certificate, private_key)); server.open(listen_ep); server.set_hello_message_received_callback(boost::bind(&on_hello, boost::ref(server), _1, _2)); server.set_presentation_message_received_callback(boost::bind(&on_presentation, boost::ref(server), _1, _2, _3)); server.set_session_request_message_received_callback(&on_session_request); server.set_session_message_received_callback(&on_session); server.set_session_failed_callback(&on_session_failed); server.set_session_established_callback(&on_session_established); server.set_session_lost_callback(&on_session_lost); server.set_data_received_callback(&on_data); std::cout << "Chat started. Type !quit to exit." << std::endl; #ifdef BOOST_ASIO_HAS_POSIX_STREAM_DESCRIPTOR boost::asio::streambuf input_buffer(512); boost::asio::posix::stream_descriptor input(io_service, ::dup(STDIN_FILENO)); boost::asio::async_read_until(input, input_buffer, '\n', boost::bind(&handle_read_input, boost::ref(server), boost::ref(input), boost::asio::placeholders::error, boost::ref(input_buffer), boost::asio::placeholders::bytes_transferred)); auto stop_function = [&](){ input.close(); }; #else auto stop_function = [&](){ server.close(); }; std::cout << "No POSIX stream descriptors available. Press Ctrl+C twice to exit." << std::endl; char line[512] = {}; while (std::cin.getline(line, sizeof(line))) { server.get_io_service().post(boost::bind(&handle_read_line, boost::ref(server), std::string(line))); } #endif signals.async_wait(boost::bind(signal_handler, _1, _2, stop_function)); boost::thread_group threads; const unsigned int THREAD_COUNT = boost::thread::hardware_concurrency(); std::cout << "Starting client with " << THREAD_COUNT << " thread(s)." << std::endl; for (std::size_t i = 0; i < THREAD_COUNT; ++i) { threads.create_thread([&io_service, i, &stop_function, &signals] () { { mutex::scoped_lock lock(output_mutex); std::cout << "Thread #" << i << " started." << std::endl; } try { io_service.run(); } catch (std::exception& ex) { mutex::scoped_lock lock(output_mutex); std::cout << "Fatal exception occured in thread #" << i << ": " << ex.what() << std::endl; stop_function(); signals.cancel(); } { mutex::scoped_lock lock(output_mutex); std::cout << "Thread #" << i << " stopped." << std::endl; } }); } threads.join_all(); std::cout << "Chat closing..." << std::endl; } catch (std::exception& ex) { std::cerr << "Error: " << ex.what() << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } freelan-2.0/samples/iconvplus/000077500000000000000000000000001252300335000164465ustar00rootroot00000000000000freelan-2.0/samples/iconvplus/basic/000077500000000000000000000000001252300335000175275ustar00rootroot00000000000000freelan-2.0/samples/iconvplus/basic/SConscript000066400000000000000000000005411252300335000215410ustar00rootroot00000000000000import os import sys libraries = [ 'iconvplus', 'boost_system', ] if sys.platform.startswith('darwin'): libraries.extend([ 'iconv', ]) Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/iconvplus/basic/basic.cpp000066400000000000000000000022341252300335000213150ustar00rootroot00000000000000/** * \file basic.cpp * \author Julien Kauffmann * \brief A basic iconv sample. */ #include #include #include #include #include #include int main() { try { std::ifstream latin1_file("material/latin1.txt"); std::ifstream utf8_file("material/utf-8.txt"); #ifdef WINDOWS iconvplus::iconv_instance latin1_to_cp1252("cp1252", "latin1"); iconvplus::iconv_instance utf8_to_wchar_t("wchar_t", "utf-8"); iconvplus::converter(latin1_to_cp1252).convert(latin1_file, std::cout); iconvplus::converter(utf8_to_wchar_t).convert(utf8_file, std::wcout); #elif defined(UNIX) iconvplus::iconv_instance latin1_to_utf8("utf-8", "latin1"); iconvplus::iconv_instance utf8_to_wchar_t("wchar_t", "utf-8"); iconvplus::converter(latin1_to_utf8).convert(latin1_file, std::cout); iconvplus::converter(utf8_to_wchar_t).convert(utf8_file, std::wcout); #endif } catch (std::exception& ex) { std::cerr << "Exception caught: " << ex.what() << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } freelan-2.0/samples/iconvplus/basic/material/000077500000000000000000000000001252300335000213255ustar00rootroot00000000000000freelan-2.0/samples/iconvplus/basic/material/latin1.txt000066400000000000000000000000511252300335000232520ustar00rootroot00000000000000Some latin1 characters: a c'est nble ! freelan-2.0/samples/iconvplus/basic/material/utf-16.txt000066400000000000000000000001021252300335000231010ustar00rootroot00000000000000Some UTF-16 arabic characters: A freelan-2.0/samples/iconvplus/basic/material/utf-32.txt000066400000000000000000000002041252300335000231020ustar00rootroot00000000000000Some UTF-32 arabic characters: A freelan-2.0/samples/iconvplus/basic/material/utf-8.txt000066400000000000000000000000411252300335000230240ustar00rootroot00000000000000Some UTF-8 arabic characters: ف freelan-2.0/samples/kfather/000077500000000000000000000000001252300335000160505ustar00rootroot00000000000000freelan-2.0/samples/kfather/parsing/000077500000000000000000000000001252300335000175135ustar00rootroot00000000000000freelan-2.0/samples/kfather/parsing/SConscript000066400000000000000000000005601252300335000215260ustar00rootroot00000000000000import os import sys libraries = [ 'kfather', 'iconvplus', 'boost_system', ] if sys.platform.startswith('darwin'): libraries.extend([ 'iconv', ]) Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/kfather/parsing/json/000077500000000000000000000000001252300335000204645ustar00rootroot00000000000000freelan-2.0/samples/kfather/parsing/json/arrays.json000066400000000000000000000001211252300335000226520ustar00rootroot00000000000000[] [ ] [1] [1,2] [1, 2] [1 ,2] [ 1 , 2 ] [ 1,2 ] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] freelan-2.0/samples/kfather/parsing/json/constants.json000066400000000000000000000000201252300335000233630ustar00rootroot00000000000000true false null freelan-2.0/samples/kfather/parsing/json/glossary.json000066400000000000000000000007331252300335000232250ustar00rootroot00000000000000{ "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": { "GlossEntry": { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": { "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["GML", "XML"] }, "GlossSee": "markup" } } } } } freelan-2.0/samples/kfather/parsing/json/numbers.json000066400000000000000000000001001252300335000230210ustar00rootroot000000000000000 1 -1 123 -123 1.0 0. 0.1 1. 1.1 3.14159 2e5 2E5 -3.5e-2 1e100 freelan-2.0/samples/kfather/parsing/json/objects.json000066400000000000000000000002431252300335000230070ustar00rootroot00000000000000{"foo":"bar"} {"foo" :"bar"} {"foo": "bar"} { "foo":"bar"} {"foo":"bar" } { "foo" : "bar" } {"foo": 1} {"foo": ["bar"]} {"foo": null} {"foo": true} {"foo": false} freelan-2.0/samples/kfather/parsing/json/strings.json000066400000000000000000000002661252300335000230540ustar00rootroot00000000000000"" "foo" "\"" "\\" "\/" "\b" "\t" "\r" "\t" "some string" "some \"quoted\" string !" "some accèntuéd string !" "a string containing a nice unicode escaped character: \ud834\udd1e" freelan-2.0/samples/kfather/parsing/parsing.cpp000066400000000000000000000023421252300335000216630ustar00rootroot00000000000000/** * \file parsing.cpp * \author Julien Kauffmann * \brief A parsing sample file. */ #include #include #include #include #include #include void parse_sample(json::parser& parser, const std::string& sample) { //json::compact_formatter formatter; json::inline_formatter formatter; //json::pretty_print_formatter formatter; std::cout << "Processing sample \"" << sample << "\"..." << std::endl; std::ifstream file(("json/" + sample + ".json").c_str()); json::value_type value; while (file) { if (parser.parse(value, file)) { formatter.format(std::cout, value); std::cout << std::endl; } else { if ((file >> std::ws).bad()) { std::cerr << "Parsing error." << std::endl; } break; } } } int main() { std::cout << "Parsing sample" << std::endl; std::cout << "=============" << std::endl; std::cout << std::endl; json::parser parser; parse_sample(parser, "constants"); parse_sample(parser, "numbers"); parse_sample(parser, "strings"); parse_sample(parser, "arrays"); parse_sample(parser, "objects"); parse_sample(parser, "glossary"); return EXIT_SUCCESS; } freelan-2.0/samples/netlinkplus/000077500000000000000000000000001252300335000167745ustar00rootroot00000000000000freelan-2.0/samples/netlinkplus/routing/000077500000000000000000000000001252300335000204635ustar00rootroot00000000000000freelan-2.0/samples/netlinkplus/routing/SConscript000066400000000000000000000004311252300335000224730ustar00rootroot00000000000000import os libraries = [ 'netlinkplus', 'boost_system', 'boost_iostreams', ] Import('env dirs name') env = env.Clone() env.Append(LIBS=libraries) samples = env.Program(target=os.path.join(str(dirs['bin']), name), source=env.RGlob('.', ['*.cpp'])) Return('samples') freelan-2.0/samples/netlinkplus/routing/routing.cpp000066400000000000000000000022471252300335000226630ustar00rootroot00000000000000/** * \file routing.cpp * \author Julien Kauffmann * \brief Test the netlink routing functions. */ #include #include #include int main() { try { boost::asio::io_service io_service; netlinkplus::manager manager(io_service); const auto host = boost::asio::ip::address_v4::from_string("8.8.8.8"); const auto route_info = manager.get_route_for(host); std::cout << "Route information to " << host << std::endl; std::cout << "Destination: " << route_info.destination << std::endl; std::cout << "Source: " << route_info.source << std::endl; std::cout << "Input interface: " << route_info.input_interface << std::endl; std::cout << "Output interface: " << route_info.output_interface << std::endl; std::cout << "Gateway: " << (route_info.gateway ? route_info.gateway->to_string() : "") << std::endl; std::cout << "Priority: " << route_info.priority << std::endl; std::cout << "Metric: " << route_info.metric << std::endl; } catch (std::exception& ex) { std::cerr << "Exception caught: " << ex.what() << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } freelan-2.0/scripts/000077500000000000000000000000001252300335000144475ustar00rootroot00000000000000freelan-2.0/scripts/README000066400000000000000000000001111252300335000153200ustar00rootroot00000000000000This folder contains scripts to ease development, testing and debugging. freelan-2.0/scripts/authenticate.sh000077500000000000000000000004631252300335000174670ustar00rootroot00000000000000#!/bin/bash echo "Connection from $FREELAN_REMOTE_HOST:$FREELAN_REMOTE_PORT as '$FREELAN_USERNAME' with password '$FREELAN_PASSWORD'." if [ "$FREELAN_USERNAME" == "" ]; then echo "No username was specified" >&2 exit 1 fi if [ "$FREELAN_PASSWORD" != "ok" ]; then echo "Invalid password" >&2 exit 2 fi freelan-2.0/scripts/start-client.sh000077500000000000000000000005471252300335000174250ustar00rootroot00000000000000#!/bin/bash USERNAME=${1:-client} shift ./install/bin/freelan -f -d --client.enabled=yes --client.disable_peer_verification=yes --client.disable_host_verification=yes --fscp.listen_on=0.0.0.0:12001 --client.username=${USERNAME} --client.password="ok" --client.public_endpoint=0.0.0.0 --client.public_endpoint=:: --client.public_endpoint=localhost:12001 $@ freelan-2.0/scripts/start-server.sh000077500000000000000000000001701252300335000174450ustar00rootroot00000000000000#!/bin/bash ./install/bin/freelan -f -d --server.enabled=yes --server.authentication_script=scripts/authenticate.sh $@ freelan-2.0/third-party/000077500000000000000000000000001252300335000152275ustar00rootroot00000000000000freelan-2.0/third-party/patches/000077500000000000000000000000001252300335000166565ustar00rootroot00000000000000freelan-2.0/third-party/patches/openssl1.0.2a/000077500000000000000000000000001252300335000210615ustar00rootroot00000000000000freelan-2.0/third-party/patches/openssl1.0.2a/crypto/000077500000000000000000000000001252300335000224015ustar00rootroot00000000000000freelan-2.0/third-party/patches/openssl1.0.2a/crypto/asn1/000077500000000000000000000000001252300335000232435ustar00rootroot00000000000000freelan-2.0/third-party/patches/openssl1.0.2a/crypto/asn1/tasn_new.c000066400000000000000000000250121252300335000252250ustar00rootroot00000000000000/* tasn_new.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project * 2000. */ /* ==================================================================== * Copyright (c) 2000-2004 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" * * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please contact * licensing@OpenSSL.org. * * 5. Products derived from this software may not be called "OpenSSL" * nor may "OpenSSL" appear in their names without prior written * permission of the OpenSSL Project. * * 6. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" * * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY * EXPRESSED 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 OpenSSL PROJECT OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This product includes cryptographic software written by Eric Young * (eay@cryptsoft.com). This product includes software written by Tim * Hudson (tjh@cryptsoft.com). * */ #include #include #include #include #include #include static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it, int combine); static void asn1_item_clear(ASN1_VALUE **pval, const ASN1_ITEM *it); static void asn1_template_clear(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt); static void asn1_primitive_clear(ASN1_VALUE **pval, const ASN1_ITEM *it); ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it) { ASN1_VALUE *ret = NULL; if (ASN1_item_ex_new(&ret, it) > 0) return ret; return NULL; } /* Allocate an ASN1 structure */ int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it) { return asn1_item_ex_combine_new(pval, it, 0); } static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it, int combine) { const ASN1_TEMPLATE *tt = NULL; const ASN1_COMPAT_FUNCS *cf; const ASN1_EXTERN_FUNCS *ef; const ASN1_AUX *aux = it->funcs; ASN1_aux_cb *asn1_cb; ASN1_VALUE **pseqval; int i; if (aux && aux->asn1_cb) asn1_cb = aux->asn1_cb; else asn1_cb = 0; #ifdef CRYPTO_MDEBUG if (it->sname) CRYPTO_push_info(it->sname); #endif switch (it->itype) { case ASN1_ITYPE_EXTERN: ef = it->funcs; if (ef && ef->asn1_ex_new) { if (!ef->asn1_ex_new(pval, it)) goto memerr; } break; case ASN1_ITYPE_COMPAT: cf = it->funcs; if (cf && cf->asn1_new) { *pval = cf->asn1_new(); if (!*pval) goto memerr; } break; case ASN1_ITYPE_PRIMITIVE: if (it->templates) { if (!ASN1_template_new(pval, it->templates)) goto memerr; } else if (!ASN1_primitive_new(pval, it)) goto memerr; break; case ASN1_ITYPE_MSTRING: if (!ASN1_primitive_new(pval, it)) goto memerr; break; case ASN1_ITYPE_CHOICE: if (asn1_cb) { i = asn1_cb(ASN1_OP_NEW_PRE, pval, it, NULL); if (!i) goto auxerr; if (i == 2) { #ifdef CRYPTO_MDEBUG if (it->sname) CRYPTO_pop_info(); #endif return 1; } } if (!combine) { *pval = OPENSSL_malloc(it->size); if (!*pval) goto memerr; memset(*pval, 0, it->size); } asn1_set_choice_selector(pval, -1, it); if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it, NULL)) goto auxerr; break; case ASN1_ITYPE_NDEF_SEQUENCE: case ASN1_ITYPE_SEQUENCE: if (asn1_cb) { i = asn1_cb(ASN1_OP_NEW_PRE, pval, it, NULL); if (!i) goto auxerr; if (i == 2) { #ifdef CRYPTO_MDEBUG if (it->sname) CRYPTO_pop_info(); #endif return 1; } } if (!combine) { *pval = OPENSSL_malloc(it->size); if (!*pval) goto memerr; memset(*pval, 0, it->size); asn1_do_lock(pval, 0, it); asn1_enc_init(pval, it); } for (i = 0, tt = it->templates; i < it->tcount; tt++, i++) { pseqval = asn1_get_field_ptr(pval, tt); if (!ASN1_template_new(pseqval, tt)) goto memerr; } if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it, NULL)) goto auxerr; break; } #ifdef CRYPTO_MDEBUG if (it->sname) CRYPTO_pop_info(); #endif return 1; memerr: ASN1err(ASN1_F_ASN1_ITEM_EX_COMBINE_NEW, ERR_R_MALLOC_FAILURE); #ifdef CRYPTO_MDEBUG if (it->sname) CRYPTO_pop_info(); #endif return 0; auxerr: ASN1err(ASN1_F_ASN1_ITEM_EX_COMBINE_NEW, ASN1_R_AUX_ERROR); ASN1_item_ex_free(pval, it); #ifdef CRYPTO_MDEBUG if (it->sname) CRYPTO_pop_info(); #endif return 0; } static void asn1_item_clear(ASN1_VALUE **pval, const ASN1_ITEM *it) { const ASN1_EXTERN_FUNCS *ef; switch (it->itype) { case ASN1_ITYPE_EXTERN: ef = it->funcs; if (ef && ef->asn1_ex_clear) ef->asn1_ex_clear(pval, it); else *pval = NULL; break; case ASN1_ITYPE_PRIMITIVE: if (it->templates) asn1_template_clear(pval, it->templates); else asn1_primitive_clear(pval, it); break; case ASN1_ITYPE_MSTRING: asn1_primitive_clear(pval, it); break; case ASN1_ITYPE_COMPAT: case ASN1_ITYPE_CHOICE: case ASN1_ITYPE_SEQUENCE: case ASN1_ITYPE_NDEF_SEQUENCE: *pval = NULL; break; } } int ASN1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt) { const ASN1_ITEM *it = ASN1_ITEM_ptr(tt->item); int ret; if (tt->flags & ASN1_TFLG_OPTIONAL) { asn1_template_clear(pval, tt); return 1; } /* If ANY DEFINED BY nothing to do */ if (tt->flags & ASN1_TFLG_ADB_MASK) { *pval = NULL; return 1; } #ifdef CRYPTO_MDEBUG if (tt->field_name) CRYPTO_push_info(tt->field_name); #endif /* If SET OF or SEQUENCE OF, its a STACK */ if (tt->flags & ASN1_TFLG_SK_MASK) { STACK_OF(ASN1_VALUE) *skval; skval = sk_ASN1_VALUE_new_null(); if (!skval) { ASN1err(ASN1_F_ASN1_TEMPLATE_NEW, ERR_R_MALLOC_FAILURE); ret = 0; goto done; } *pval = (ASN1_VALUE *)skval; ret = 1; goto done; } /* Otherwise pass it back to the item routine */ ret = asn1_item_ex_combine_new(pval, it, tt->flags & ASN1_TFLG_COMBINE); done: #ifdef CRYPTO_MDEBUG if (it->sname) CRYPTO_pop_info(); #endif return ret; } static void asn1_template_clear(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt) { /* If ADB or STACK just NULL the field */ if (tt->flags & (ASN1_TFLG_ADB_MASK | ASN1_TFLG_SK_MASK)) *pval = NULL; else asn1_item_clear(pval, ASN1_ITEM_ptr(tt->item)); } /* * NB: could probably combine most of the real XXX_new() behaviour and junk * all the old functions. */ int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it) { ASN1_TYPE *typ; ASN1_STRING *str; int utype; if (!it) return 0; if (it->funcs) { const ASN1_PRIMITIVE_FUNCS *pf = it->funcs; if (pf->prim_new) return pf->prim_new(pval, it); } if (it->itype == ASN1_ITYPE_MSTRING) utype = -1; else utype = it->utype; switch (utype) { case V_ASN1_OBJECT: *pval = (ASN1_VALUE *)OBJ_nid2obj(NID_undef); return 1; case V_ASN1_BOOLEAN: *(ASN1_BOOLEAN *)pval = it->size; return 1; case V_ASN1_NULL: *pval = (ASN1_VALUE *)1; return 1; case V_ASN1_ANY: typ = OPENSSL_malloc(sizeof(ASN1_TYPE)); if (!typ) return 0; typ->value.ptr = NULL; typ->type = -1; *pval = (ASN1_VALUE *)typ; break; default: str = ASN1_STRING_type_new(utype); if (it->itype == ASN1_ITYPE_MSTRING && str) str->flags |= ASN1_STRING_FLAG_MSTRING; *pval = (ASN1_VALUE *)str; break; } if (*pval) return 1; return 0; } static void asn1_primitive_clear(ASN1_VALUE **pval, const ASN1_ITEM *it) { int utype; if (it && it->funcs) { const ASN1_PRIMITIVE_FUNCS *pf = it->funcs; if (pf->prim_clear) pf->prim_clear(pval, it); else *pval = NULL; return; } if (!it || (it->itype == ASN1_ITYPE_MSTRING)) utype = -1; else utype = it->utype; if (utype == V_ASN1_BOOLEAN) *(ASN1_BOOLEAN *)pval = it->size; else *pval = NULL; } freelan-2.0/third-party/source/000077500000000000000000000000001252300335000165275ustar00rootroot00000000000000freelan-2.0/third-party/source/libiconv-msvc/000077500000000000000000000000001252300335000213025ustar00rootroot00000000000000freelan-2.0/third-party/source/libiconv-msvc/README.md000066400000000000000000000004251252300335000225620ustar00rootroot00000000000000# libiconv for Visual Studio This code comes from [codeproject](http://www.codeproject.com/Articles/302012/How-to-Build-libiconv-with-Microsoft-Visual-Studio). Thanks to [PARK-Youngho](http://www.codeproject.com/script/Membership/View.aspx?mid=3279933) for his amazing work. freelan-2.0/third-party/source/libiconv-msvc/include/000077500000000000000000000000001252300335000227255ustar00rootroot00000000000000freelan-2.0/third-party/source/libiconv-msvc/include/aliases.h000066400000000000000000002076251252300335000245330ustar00rootroot00000000000000/* ANSI-C code produced by gperf version 3.0.4 */ /* Command-line: gperf -m 10 lib/aliases.gperf */ /* Computed positions: -k'1,3-11,$' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ #error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif #line 1 "lib/aliases.gperf" struct alias { int name; unsigned int encoding_index; }; #define TOTAL_KEYWORDS 347 #define MIN_WORD_LENGTH 2 #define MAX_WORD_LENGTH 45 #define MIN_HASH_VALUE 7 #define MAX_HASH_VALUE 935 /* maximum key range = 929, duplicates = 0 */ #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static unsigned int aliases_hash (register const char *str, register unsigned int len) { static const unsigned short asso_values[] = { 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 16, 62, 936, 73, 0, 5, 2, 47, 4, 1, 168, 8, 12, 357, 936, 936, 936, 936, 936, 936, 112, 123, 3, 14, 34, 71, 142, 147, 0, 258, 79, 39, 122, 4, 0, 109, 936, 76, 1, 54, 147, 114, 180, 102, 3, 10, 936, 936, 936, 936, 34, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936 }; register int hval = len; switch (hval) { default: hval += asso_values[(unsigned char)str[10]]; /*FALLTHROUGH*/ case 10: hval += asso_values[(unsigned char)str[9]]; /*FALLTHROUGH*/ case 9: hval += asso_values[(unsigned char)str[8]]; /*FALLTHROUGH*/ case 8: hval += asso_values[(unsigned char)str[7]]; /*FALLTHROUGH*/ case 7: hval += asso_values[(unsigned char)str[6]]; /*FALLTHROUGH*/ case 6: hval += asso_values[(unsigned char)str[5]]; /*FALLTHROUGH*/ case 5: hval += asso_values[(unsigned char)str[4]]; /*FALLTHROUGH*/ case 4: hval += asso_values[(unsigned char)str[3]]; /*FALLTHROUGH*/ case 3: hval += asso_values[(unsigned char)str[2]]; /*FALLTHROUGH*/ case 2: case 1: hval += asso_values[(unsigned char)str[0]]; break; } return hval + asso_values[(unsigned char)str[len - 1]]; } struct stringpool_t { char stringpool_str7[sizeof("SJIS")]; char stringpool_str9[sizeof("CN")]; char stringpool_str11[sizeof("CP1131")]; char stringpool_str12[sizeof("CP1361")]; char stringpool_str13[sizeof("866")]; char stringpool_str15[sizeof("CP1133")]; char stringpool_str18[sizeof("CP1251")]; char stringpool_str19[sizeof("CP866")]; char stringpool_str20[sizeof("CP1256")]; char stringpool_str21[sizeof("862")]; char stringpool_str22[sizeof("CP1253")]; char stringpool_str24[sizeof("CP936")]; char stringpool_str26[sizeof("CP1255")]; char stringpool_str27[sizeof("CP862")]; char stringpool_str28[sizeof("CP1252")]; char stringpool_str30[sizeof("C99")]; char stringpool_str32[sizeof("CP932")]; char stringpool_str34[sizeof("CP1258")]; char stringpool_str40[sizeof("CP819")]; char stringpool_str41[sizeof("L1")]; char stringpool_str42[sizeof("L6")]; char stringpool_str43[sizeof("L3")]; char stringpool_str45[sizeof("L5")]; char stringpool_str46[sizeof("L2")]; char stringpool_str49[sizeof("L8")]; char stringpool_str53[sizeof("EUCCN")]; char stringpool_str57[sizeof("ISO8859-1")]; char stringpool_str58[sizeof("ISO8859-11")]; char stringpool_str59[sizeof("ISO8859-6")]; char stringpool_str60[sizeof("ISO8859-16")]; char stringpool_str61[sizeof("ISO8859-3")]; char stringpool_str62[sizeof("ISO8859-13")]; char stringpool_str65[sizeof("ISO8859-5")]; char stringpool_str66[sizeof("ISO8859-15")]; char stringpool_str67[sizeof("ISO8859-2")]; char stringpool_str70[sizeof("EUC-CN")]; char stringpool_str73[sizeof("ISO8859-8")]; char stringpool_str74[sizeof("ISO-8859-1")]; char stringpool_str75[sizeof("ISO-8859-11")]; char stringpool_str76[sizeof("ISO-8859-6")]; char stringpool_str77[sizeof("ISO-8859-16")]; char stringpool_str78[sizeof("ISO-8859-3")]; char stringpool_str79[sizeof("ISO-8859-13")]; char stringpool_str81[sizeof("ISO8859-9")]; char stringpool_str82[sizeof("ISO-8859-5")]; char stringpool_str83[sizeof("ISO-8859-15")]; char stringpool_str84[sizeof("ISO-8859-2")]; char stringpool_str85[sizeof("ISO646-CN")]; char stringpool_str86[sizeof("R8")]; char stringpool_str88[sizeof("L4")]; char stringpool_str90[sizeof("ISO-8859-8")]; char stringpool_str91[sizeof("CP949")]; char stringpool_str92[sizeof("ISO_8859-1")]; char stringpool_str93[sizeof("ISO_8859-11")]; char stringpool_str94[sizeof("ISO_8859-6")]; char stringpool_str95[sizeof("ISO_8859-16")]; char stringpool_str96[sizeof("ISO_8859-3")]; char stringpool_str97[sizeof("ISO_8859-13")]; char stringpool_str98[sizeof("ISO-8859-9")]; char stringpool_str99[sizeof("ISO_8859-16:2001")]; char stringpool_str100[sizeof("ISO_8859-5")]; char stringpool_str101[sizeof("ISO_8859-15")]; char stringpool_str102[sizeof("ISO_8859-2")]; char stringpool_str103[sizeof("LATIN1")]; char stringpool_str105[sizeof("LATIN6")]; char stringpool_str106[sizeof("CP154")]; char stringpool_str107[sizeof("LATIN3")]; char stringpool_str108[sizeof("ISO_8859-8")]; char stringpool_str110[sizeof("ISO_8859-15:1998")]; char stringpool_str111[sizeof("LATIN5")]; char stringpool_str112[sizeof("CP1254")]; char stringpool_str113[sizeof("LATIN2")]; char stringpool_str114[sizeof("CSISO2022CN")]; char stringpool_str116[sizeof("ISO_8859-9")]; char stringpool_str117[sizeof("CHINESE")]; char stringpool_str118[sizeof("ISO-IR-6")]; char stringpool_str119[sizeof("LATIN8")]; char stringpool_str120[sizeof("ASCII")]; char stringpool_str121[sizeof("ISO-IR-166")]; char stringpool_str122[sizeof("X0212")]; char stringpool_str124[sizeof("VISCII")]; char stringpool_str125[sizeof("ISO-IR-126")]; char stringpool_str126[sizeof("CSASCII")]; char stringpool_str127[sizeof("ISO-IR-165")]; char stringpool_str129[sizeof("CSVISCII")]; char stringpool_str130[sizeof("ISO-IR-226")]; char stringpool_str131[sizeof("MAC")]; char stringpool_str136[sizeof("ISO-IR-138")]; char stringpool_str137[sizeof("ISO-IR-58")]; char stringpool_str139[sizeof("IBM866")]; char stringpool_str142[sizeof("ISO-2022-CN")]; char stringpool_str143[sizeof("MS936")]; char stringpool_str144[sizeof("LATIN-9")]; char stringpool_str146[sizeof("ISO-IR-159")]; char stringpool_str147[sizeof("IBM862")]; char stringpool_str150[sizeof("US")]; char stringpool_str151[sizeof("ISO8859-4")]; char stringpool_str152[sizeof("ISO8859-14")]; char stringpool_str153[sizeof("ISO_8859-14:1998")]; char stringpool_str154[sizeof("ISO-IR-199")]; char stringpool_str156[sizeof("UHC")]; char stringpool_str157[sizeof("850")]; char stringpool_str159[sizeof("HZ")]; char stringpool_str160[sizeof("IBM819")]; char stringpool_str162[sizeof("ISO-CELTIC")]; char stringpool_str163[sizeof("ELOT_928")]; char stringpool_str164[sizeof("CP1250")]; char stringpool_str165[sizeof("GB2312")]; char stringpool_str166[sizeof("CP850")]; char stringpool_str168[sizeof("ISO-8859-4")]; char stringpool_str169[sizeof("ISO-8859-14")]; char stringpool_str170[sizeof("CP950")]; char stringpool_str171[sizeof("CYRILLIC")]; char stringpool_str176[sizeof("ISO_8859-10:1992")]; char stringpool_str179[sizeof("UCS-2")]; char stringpool_str180[sizeof("TCVN")]; char stringpool_str181[sizeof("ISO-IR-148")]; char stringpool_str185[sizeof("X0201")]; char stringpool_str186[sizeof("ISO_8859-4")]; char stringpool_str187[sizeof("ISO_8859-14")]; char stringpool_str188[sizeof("L10")]; char stringpool_str189[sizeof("ISO-IR-149")]; char stringpool_str191[sizeof("ISO-IR-101")]; char stringpool_str196[sizeof("ISO-2022-CN-EXT")]; char stringpool_str197[sizeof("LATIN4")]; char stringpool_str200[sizeof("ISO-IR-203")]; char stringpool_str201[sizeof("X0208")]; char stringpool_str202[sizeof("KSC_5601")]; char stringpool_str204[sizeof("ISO8859-10")]; char stringpool_str207[sizeof("VISCII1.1-1")]; char stringpool_str209[sizeof("L7")]; char stringpool_str211[sizeof("ISO-IR-14")]; char stringpool_str212[sizeof("PT154")]; char stringpool_str213[sizeof("TIS620")]; char stringpool_str215[sizeof("ISO-IR-109")]; char stringpool_str216[sizeof("CSUNICODE11")]; char stringpool_str217[sizeof("KOI8-T")]; char stringpool_str218[sizeof("RK1048")]; char stringpool_str221[sizeof("ISO-8859-10")]; char stringpool_str222[sizeof("TIS620.2533-1")]; char stringpool_str223[sizeof("ISO646-US")]; char stringpool_str224[sizeof("CSISOLATIN1")]; char stringpool_str226[sizeof("CSISOLATIN6")]; char stringpool_str228[sizeof("CSISOLATIN3")]; char stringpool_str230[sizeof("TIS-620")]; char stringpool_str232[sizeof("CSISOLATIN5")]; char stringpool_str234[sizeof("CSISOLATIN2")]; char stringpool_str235[sizeof("TIS620.2529-1")]; char stringpool_str236[sizeof("CSKZ1048")]; char stringpool_str237[sizeof("CSISOLATINCYRILLIC")]; char stringpool_str238[sizeof("KZ-1048")]; char stringpool_str239[sizeof("ISO_8859-10")]; char stringpool_str241[sizeof("UNICODE-1-1")]; char stringpool_str242[sizeof("UTF-16")]; char stringpool_str245[sizeof("MS-EE")]; char stringpool_str248[sizeof("CSUNICODE")]; char stringpool_str249[sizeof("CSKOI8R")]; char stringpool_str250[sizeof("LATIN10")]; char stringpool_str252[sizeof("UTF-32")]; char stringpool_str254[sizeof("CSUCS4")]; char stringpool_str255[sizeof("UTF-8")]; char stringpool_str259[sizeof("ISO-IR-144")]; char stringpool_str261[sizeof("KOI8-R")]; char stringpool_str262[sizeof("MS-ANSI")]; char stringpool_str263[sizeof("UCS-4")]; char stringpool_str264[sizeof("ISO-IR-110")]; char stringpool_str266[sizeof("IBM-CP1133")]; char stringpool_str267[sizeof("CSIBM866")]; char stringpool_str270[sizeof("KS_C_5601-1989")]; char stringpool_str271[sizeof("CHAR")]; char stringpool_str273[sizeof("EUCKR")]; char stringpool_str277[sizeof("BIG5")]; char stringpool_str278[sizeof("CP874")]; char stringpool_str279[sizeof("ARMSCII-8")]; char stringpool_str282[sizeof("CSBIG5")]; char stringpool_str283[sizeof("UCS-2LE")]; char stringpool_str286[sizeof("IBM850")]; char stringpool_str287[sizeof("US-ASCII")]; char stringpool_str290[sizeof("EUC-KR")]; char stringpool_str293[sizeof("CSGB2312")]; char stringpool_str294[sizeof("BIG-5")]; char stringpool_str295[sizeof("TIS620.2533-0")]; char stringpool_str299[sizeof("CN-BIG5")]; char stringpool_str302[sizeof("MACCYRILLIC")]; char stringpool_str303[sizeof("GBK")]; char stringpool_str304[sizeof("TIS620-0")]; char stringpool_str305[sizeof("MS-CYRL")]; char stringpool_str307[sizeof("CYRILLIC-ASIAN")]; char stringpool_str308[sizeof("ECMA-118")]; char stringpool_str310[sizeof("ISO-IR-179")]; char stringpool_str311[sizeof("GREEK8")]; char stringpool_str315[sizeof("KOREAN")]; char stringpool_str318[sizeof("CSISOLATIN4")]; char stringpool_str321[sizeof("ISO-10646-UCS-2")]; char stringpool_str325[sizeof("UCS-4LE")]; char stringpool_str326[sizeof("PTCP154")]; char stringpool_str330[sizeof("CSISO14JISC6220RO")]; char stringpool_str334[sizeof("CSISO2022KR")]; char stringpool_str336[sizeof("ROMAN8")]; char stringpool_str337[sizeof("ISO-IR-100")]; char stringpool_str340[sizeof("JIS_C6226-1983")]; char stringpool_str344[sizeof("CSISOLATINARABIC")]; char stringpool_str347[sizeof("CP367")]; char stringpool_str350[sizeof("UTF-16LE")]; char stringpool_str351[sizeof("ISO_646.IRV:1991")]; char stringpool_str354[sizeof("CP1257")]; char stringpool_str355[sizeof("MACICELAND")]; char stringpool_str356[sizeof("UTF-32LE")]; char stringpool_str357[sizeof("CSKSC56011987")]; char stringpool_str359[sizeof("ARABIC")]; char stringpool_str362[sizeof("ISO-2022-KR")]; char stringpool_str363[sizeof("ISO-10646-UCS-4")]; char stringpool_str367[sizeof("UCS-2BE")]; char stringpool_str368[sizeof("GB_2312-80")]; char stringpool_str369[sizeof("JP")]; char stringpool_str371[sizeof("MULELAO-1")]; char stringpool_str372[sizeof("CSISO159JISX02121990")]; char stringpool_str373[sizeof("GREEK")]; char stringpool_str375[sizeof("TCVN5712-1")]; char stringpool_str376[sizeof("CSISO58GB231280")]; char stringpool_str378[sizeof("GB18030")]; char stringpool_str379[sizeof("TCVN-5712")]; char stringpool_str384[sizeof("GB_1988-80")]; char stringpool_str385[sizeof("CSPTCP154")]; char stringpool_str386[sizeof("ECMA-114")]; char stringpool_str388[sizeof("CSUNICODE11UTF7")]; char stringpool_str391[sizeof("ANSI_X3.4-1986")]; char stringpool_str392[sizeof("UNICODELITTLE")]; char stringpool_str393[sizeof("ISO8859-7")]; char stringpool_str395[sizeof("CN-GB-ISOIR165")]; char stringpool_str396[sizeof("STRK1048-2002")]; char stringpool_str398[sizeof("ANSI_X3.4-1968")]; char stringpool_str403[sizeof("KOI8-U")]; char stringpool_str406[sizeof("UCS-2-INTERNAL")]; char stringpool_str409[sizeof("UCS-4BE")]; char stringpool_str410[sizeof("ISO-8859-7")]; char stringpool_str411[sizeof("SHIFT-JIS")]; char stringpool_str412[sizeof("CN-GB")]; char stringpool_str413[sizeof("JIS_C6220-1969-RO")]; char stringpool_str415[sizeof("UNICODE-1-1-UTF-7")]; char stringpool_str416[sizeof("WINDOWS-1251")]; char stringpool_str417[sizeof("WINDOWS-1256")]; char stringpool_str418[sizeof("WINDOWS-1253")]; char stringpool_str420[sizeof("WINDOWS-1255")]; char stringpool_str421[sizeof("WINDOWS-1252")]; char stringpool_str422[sizeof("WINDOWS-936")]; char stringpool_str424[sizeof("WINDOWS-1258")]; char stringpool_str425[sizeof("CSEUCKR")]; char stringpool_str426[sizeof("KS_C_5601-1987")]; char stringpool_str428[sizeof("ISO_8859-7")]; char stringpool_str429[sizeof("SHIFT_JIS")]; char stringpool_str433[sizeof("JIS0208")]; char stringpool_str434[sizeof("UTF-16BE")]; char stringpool_str439[sizeof("LATIN7")]; char stringpool_str440[sizeof("UTF-32BE")]; char stringpool_str445[sizeof("MACTHAI")]; char stringpool_str448[sizeof("UCS-4-INTERNAL")]; char stringpool_str449[sizeof("CSISOLATINGREEK")]; char stringpool_str451[sizeof("MACROMAN")]; char stringpool_str452[sizeof("EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE")]; char stringpool_str456[sizeof("EUCTW")]; char stringpool_str457[sizeof("ISO-IR-57")]; char stringpool_str458[sizeof("ISO-IR-157")]; char stringpool_str459[sizeof("ISO-IR-127")]; char stringpool_str461[sizeof("ISO-IR-87")]; char stringpool_str463[sizeof("WINDOWS-1254")]; char stringpool_str464[sizeof("ISO_8859-3:1988")]; char stringpool_str466[sizeof("ISO_8859-5:1988")]; char stringpool_str467[sizeof("IBM367")]; char stringpool_str470[sizeof("ISO_8859-8:1988")]; char stringpool_str471[sizeof("HZ-GB-2312")]; char stringpool_str473[sizeof("EUC-TW")]; char stringpool_str474[sizeof("CSISO57GB1988")]; char stringpool_str475[sizeof("NEXTSTEP")]; char stringpool_str476[sizeof("CSISO2022JP2")]; char stringpool_str478[sizeof("ISO_8859-9:1989")]; char stringpool_str480[sizeof("KOI8-RU")]; char stringpool_str487[sizeof("MACINTOSH")]; char stringpool_str489[sizeof("WINDOWS-1250")]; char stringpool_str492[sizeof("JIS_X0212")]; char stringpool_str500[sizeof("ISO-2022-JP-1")]; char stringpool_str501[sizeof("MACCROATIAN")]; char stringpool_str502[sizeof("HP-ROMAN8")]; char stringpool_str505[sizeof("ISO-2022-JP-2")]; char stringpool_str509[sizeof("ISO_8859-4:1988")]; char stringpool_str510[sizeof("BIG5HKSCS")]; char stringpool_str515[sizeof("ASMO-708")]; char stringpool_str518[sizeof("EUCJP")]; char stringpool_str525[sizeof("BIGFIVE")]; char stringpool_str527[sizeof("BIG5-HKSCS")]; char stringpool_str531[sizeof("MACCENTRALEUROPE")]; char stringpool_str532[sizeof("CSPC862LATINHEBREW")]; char stringpool_str535[sizeof("EUC-JP")]; char stringpool_str542[sizeof("BIG-FIVE")]; char stringpool_str546[sizeof("CSSHIFTJIS")]; char stringpool_str550[sizeof("ISO646-JP")]; char stringpool_str554[sizeof("JISX0201-1976")]; char stringpool_str555[sizeof("JIS_X0201")]; char stringpool_str556[sizeof("CSISOLATINHEBREW")]; char stringpool_str563[sizeof("MACARABIC")]; char stringpool_str564[sizeof("CSISO87JISX0208")]; char stringpool_str571[sizeof("JIS_X0208")]; char stringpool_str575[sizeof("UTF-7")]; char stringpool_str577[sizeof("MACGREEK")]; char stringpool_str579[sizeof("CSISO2022JP")]; char stringpool_str580[sizeof("MS-TURK")]; char stringpool_str581[sizeof("JIS_X0212-1990")]; char stringpool_str584[sizeof("WINDOWS-1257")]; char stringpool_str586[sizeof("JIS_X0208-1983")]; char stringpool_str590[sizeof("MS-GREEK")]; char stringpool_str599[sizeof("CSHPROMAN8")]; char stringpool_str600[sizeof("JAVA")]; char stringpool_str601[sizeof("MS-HEBR")]; char stringpool_str604[sizeof("CSMACINTOSH")]; char stringpool_str607[sizeof("ISO-2022-JP")]; char stringpool_str608[sizeof("CSEUCTW")]; char stringpool_str614[sizeof("GEORGIAN-PS")]; char stringpool_str615[sizeof("UNICODEBIG")]; char stringpool_str617[sizeof("MS_KANJI")]; char stringpool_str620[sizeof("CSPC850MULTILINGUAL")]; char stringpool_str621[sizeof("MACUKRAINE")]; char stringpool_str622[sizeof("ISO_8859-1:1987")]; char stringpool_str623[sizeof("ISO_8859-6:1987")]; char stringpool_str624[sizeof("ISO_8859-7:2003")]; char stringpool_str626[sizeof("GEORGIAN-ACADEMY")]; char stringpool_str627[sizeof("ISO_8859-2:1987")]; char stringpool_str629[sizeof("JIS_X0212.1990-0")]; char stringpool_str657[sizeof("JIS_X0208-1990")]; char stringpool_str664[sizeof("WCHAR_T")]; char stringpool_str673[sizeof("MACROMANIA")]; char stringpool_str676[sizeof("WINDOWS-874")]; char stringpool_str689[sizeof("CSEUCPKDFMTJAPANESE")]; char stringpool_str691[sizeof("MS-ARAB")]; char stringpool_str723[sizeof("UCS-2-SWAPPED")]; char stringpool_str739[sizeof("TCVN5712-1:1993")]; char stringpool_str746[sizeof("HEBREW")]; char stringpool_str765[sizeof("UCS-4-SWAPPED")]; char stringpool_str768[sizeof("JOHAB")]; char stringpool_str786[sizeof("MACTURKISH")]; char stringpool_str790[sizeof("ISO_8859-7:1987")]; char stringpool_str842[sizeof("WINBALTRIM")]; char stringpool_str888[sizeof("BIG5-HKSCS:2001")]; char stringpool_str896[sizeof("BIG5-HKSCS:2008")]; char stringpool_str898[sizeof("CSHALFWIDTHKATAKANA")]; char stringpool_str900[sizeof("BIG5-HKSCS:1999")]; char stringpool_str908[sizeof("MACHEBREW")]; char stringpool_str935[sizeof("BIG5-HKSCS:2004")]; }; static const struct stringpool_t stringpool_contents = { "SJIS", "CN", "CP1131", "CP1361", "866", "CP1133", "CP1251", "CP866", "CP1256", "862", "CP1253", "CP936", "CP1255", "CP862", "CP1252", "C99", "CP932", "CP1258", "CP819", "L1", "L6", "L3", "L5", "L2", "L8", "EUCCN", "ISO8859-1", "ISO8859-11", "ISO8859-6", "ISO8859-16", "ISO8859-3", "ISO8859-13", "ISO8859-5", "ISO8859-15", "ISO8859-2", "EUC-CN", "ISO8859-8", "ISO-8859-1", "ISO-8859-11", "ISO-8859-6", "ISO-8859-16", "ISO-8859-3", "ISO-8859-13", "ISO8859-9", "ISO-8859-5", "ISO-8859-15", "ISO-8859-2", "ISO646-CN", "R8", "L4", "ISO-8859-8", "CP949", "ISO_8859-1", "ISO_8859-11", "ISO_8859-6", "ISO_8859-16", "ISO_8859-3", "ISO_8859-13", "ISO-8859-9", "ISO_8859-16:2001", "ISO_8859-5", "ISO_8859-15", "ISO_8859-2", "LATIN1", "LATIN6", "CP154", "LATIN3", "ISO_8859-8", "ISO_8859-15:1998", "LATIN5", "CP1254", "LATIN2", "CSISO2022CN", "ISO_8859-9", "CHINESE", "ISO-IR-6", "LATIN8", "ASCII", "ISO-IR-166", "X0212", "VISCII", "ISO-IR-126", "CSASCII", "ISO-IR-165", "CSVISCII", "ISO-IR-226", "MAC", "ISO-IR-138", "ISO-IR-58", "IBM866", "ISO-2022-CN", "MS936", "LATIN-9", "ISO-IR-159", "IBM862", "US", "ISO8859-4", "ISO8859-14", "ISO_8859-14:1998", "ISO-IR-199", "UHC", "850", "HZ", "IBM819", "ISO-CELTIC", "ELOT_928", "CP1250", "GB2312", "CP850", "ISO-8859-4", "ISO-8859-14", "CP950", "CYRILLIC", "ISO_8859-10:1992", "UCS-2", "TCVN", "ISO-IR-148", "X0201", "ISO_8859-4", "ISO_8859-14", "L10", "ISO-IR-149", "ISO-IR-101", "ISO-2022-CN-EXT", "LATIN4", "ISO-IR-203", "X0208", "KSC_5601", "ISO8859-10", "VISCII1.1-1", "L7", "ISO-IR-14", "PT154", "TIS620", "ISO-IR-109", "CSUNICODE11", "KOI8-T", "RK1048", "ISO-8859-10", "TIS620.2533-1", "ISO646-US", "CSISOLATIN1", "CSISOLATIN6", "CSISOLATIN3", "TIS-620", "CSISOLATIN5", "CSISOLATIN2", "TIS620.2529-1", "CSKZ1048", "CSISOLATINCYRILLIC", "KZ-1048", "ISO_8859-10", "UNICODE-1-1", "UTF-16", "MS-EE", "CSUNICODE", "CSKOI8R", "LATIN10", "UTF-32", "CSUCS4", "UTF-8", "ISO-IR-144", "KOI8-R", "MS-ANSI", "UCS-4", "ISO-IR-110", "IBM-CP1133", "CSIBM866", "KS_C_5601-1989", "CHAR", "EUCKR", "BIG5", "CP874", "ARMSCII-8", "CSBIG5", "UCS-2LE", "IBM850", "US-ASCII", "EUC-KR", "CSGB2312", "BIG-5", "TIS620.2533-0", "CN-BIG5", "MACCYRILLIC", "GBK", "TIS620-0", "MS-CYRL", "CYRILLIC-ASIAN", "ECMA-118", "ISO-IR-179", "GREEK8", "KOREAN", "CSISOLATIN4", "ISO-10646-UCS-2", "UCS-4LE", "PTCP154", "CSISO14JISC6220RO", "CSISO2022KR", "ROMAN8", "ISO-IR-100", "JIS_C6226-1983", "CSISOLATINARABIC", "CP367", "UTF-16LE", "ISO_646.IRV:1991", "CP1257", "MACICELAND", "UTF-32LE", "CSKSC56011987", "ARABIC", "ISO-2022-KR", "ISO-10646-UCS-4", "UCS-2BE", "GB_2312-80", "JP", "MULELAO-1", "CSISO159JISX02121990", "GREEK", "TCVN5712-1", "CSISO58GB231280", "GB18030", "TCVN-5712", "GB_1988-80", "CSPTCP154", "ECMA-114", "CSUNICODE11UTF7", "ANSI_X3.4-1986", "UNICODELITTLE", "ISO8859-7", "CN-GB-ISOIR165", "STRK1048-2002", "ANSI_X3.4-1968", "KOI8-U", "UCS-2-INTERNAL", "UCS-4BE", "ISO-8859-7", "SHIFT-JIS", "CN-GB", "JIS_C6220-1969-RO", "UNICODE-1-1-UTF-7", "WINDOWS-1251", "WINDOWS-1256", "WINDOWS-1253", "WINDOWS-1255", "WINDOWS-1252", "WINDOWS-936", "WINDOWS-1258", "CSEUCKR", "KS_C_5601-1987", "ISO_8859-7", "SHIFT_JIS", "JIS0208", "UTF-16BE", "LATIN7", "UTF-32BE", "MACTHAI", "UCS-4-INTERNAL", "CSISOLATINGREEK", "MACROMAN", "EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE", "EUCTW", "ISO-IR-57", "ISO-IR-157", "ISO-IR-127", "ISO-IR-87", "WINDOWS-1254", "ISO_8859-3:1988", "ISO_8859-5:1988", "IBM367", "ISO_8859-8:1988", "HZ-GB-2312", "EUC-TW", "CSISO57GB1988", "NEXTSTEP", "CSISO2022JP2", "ISO_8859-9:1989", "KOI8-RU", "MACINTOSH", "WINDOWS-1250", "JIS_X0212", "ISO-2022-JP-1", "MACCROATIAN", "HP-ROMAN8", "ISO-2022-JP-2", "ISO_8859-4:1988", "BIG5HKSCS", "ASMO-708", "EUCJP", "BIGFIVE", "BIG5-HKSCS", "MACCENTRALEUROPE", "CSPC862LATINHEBREW", "EUC-JP", "BIG-FIVE", "CSSHIFTJIS", "ISO646-JP", "JISX0201-1976", "JIS_X0201", "CSISOLATINHEBREW", "MACARABIC", "CSISO87JISX0208", "JIS_X0208", "UTF-7", "MACGREEK", "CSISO2022JP", "MS-TURK", "JIS_X0212-1990", "WINDOWS-1257", "JIS_X0208-1983", "MS-GREEK", "CSHPROMAN8", "JAVA", "MS-HEBR", "CSMACINTOSH", "ISO-2022-JP", "CSEUCTW", "GEORGIAN-PS", "UNICODEBIG", "MS_KANJI", "CSPC850MULTILINGUAL", "MACUKRAINE", "ISO_8859-1:1987", "ISO_8859-6:1987", "ISO_8859-7:2003", "GEORGIAN-ACADEMY", "ISO_8859-2:1987", "JIS_X0212.1990-0", "JIS_X0208-1990", "WCHAR_T", "MACROMANIA", "WINDOWS-874", "CSEUCPKDFMTJAPANESE", "MS-ARAB", "UCS-2-SWAPPED", "TCVN5712-1:1993", "HEBREW", "UCS-4-SWAPPED", "JOHAB", "MACTURKISH", "ISO_8859-7:1987", "WINBALTRIM", "BIG5-HKSCS:2001", "BIG5-HKSCS:2008", "CSHALFWIDTHKATAKANA", "BIG5-HKSCS:1999", "MACHEBREW", "BIG5-HKSCS:2004" }; #define stringpool ((const char *) &stringpool_contents) static const struct alias aliases[] = { {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 308 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str7, ei_sjis}, {-1}, #line 288 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str9, ei_iso646_cn}, {-1}, #line 209 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str11, ei_cp1131}, #line 354 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str12, ei_johab}, #line 207 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str13, ei_cp866}, {-1}, #line 244 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str15, ei_cp1133}, {-1}, {-1}, #line 174 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str18, ei_cp1251}, #line 205 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str19, ei_cp866}, #line 189 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str20, ei_cp1256}, #line 203 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str21, ei_cp862}, #line 180 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str22, ei_cp1253}, {-1}, #line 323 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str24, ei_cp936}, {-1}, #line 186 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str26, ei_cp1255}, #line 201 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str27, ei_cp862}, #line 177 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str28, ei_cp1252}, {-1}, #line 51 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str30, ei_c99}, {-1}, #line 311 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str32, ei_cp932}, {-1}, #line 195 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str34, ei_cp1258}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 57 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str40, ei_iso8859_1}, #line 60 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str41, ei_iso8859_1}, #line 134 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str42, ei_iso8859_10}, #line 76 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str43, ei_iso8859_3}, {-1}, #line 126 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str45, ei_iso8859_9}, #line 68 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str46, ei_iso8859_2}, {-1}, {-1}, #line 151 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str49, ei_iso8859_14}, {-1}, {-1}, {-1}, #line 318 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str53, ei_euc_cn}, {-1}, {-1}, {-1}, #line 62 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str57, ei_iso8859_1}, #line 139 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str58, ei_iso8859_11}, #line 102 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str59, ei_iso8859_6}, #line 166 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str60, ei_iso8859_16}, #line 78 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str61, ei_iso8859_3}, #line 145 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str62, ei_iso8859_13}, {-1}, {-1}, #line 93 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str65, ei_iso8859_5}, #line 159 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str66, ei_iso8859_15}, #line 70 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str67, ei_iso8859_2}, {-1}, {-1}, #line 317 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str70, ei_euc_cn}, {-1}, {-1}, #line 120 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str73, ei_iso8859_8}, #line 53 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str74, ei_iso8859_1}, #line 137 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str75, ei_iso8859_11}, #line 94 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str76, ei_iso8859_6}, #line 160 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str77, ei_iso8859_16}, #line 71 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str78, ei_iso8859_3}, #line 140 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str79, ei_iso8859_13}, {-1}, #line 128 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str81, ei_iso8859_9}, #line 87 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str82, ei_iso8859_5}, #line 154 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str83, ei_iso8859_15}, #line 63 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str84, ei_iso8859_2}, #line 286 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str85, ei_iso646_cn}, #line 227 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str86, ei_hp_roman8}, {-1}, #line 84 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str88, ei_iso8859_4}, {-1}, #line 114 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str90, ei_iso8859_8}, #line 351 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str91, ei_cp949}, #line 54 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str92, ei_iso8859_1}, #line 138 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str93, ei_iso8859_11}, #line 95 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str94, ei_iso8859_6}, #line 161 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str95, ei_iso8859_16}, #line 72 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str96, ei_iso8859_3}, #line 141 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str97, ei_iso8859_13}, #line 121 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str98, ei_iso8859_9}, #line 162 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str99, ei_iso8859_16}, #line 88 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str100, ei_iso8859_5}, #line 155 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str101, ei_iso8859_15}, #line 64 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str102, ei_iso8859_2}, #line 59 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str103, ei_iso8859_1}, {-1}, #line 133 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str105, ei_iso8859_10}, #line 236 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str106, ei_pt154}, #line 75 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str107, ei_iso8859_3}, #line 115 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str108, ei_iso8859_8}, {-1}, #line 156 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str110, ei_iso8859_15}, #line 125 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str111, ei_iso8859_9}, #line 183 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str112, ei_cp1254}, #line 67 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str113, ei_iso8859_2}, #line 328 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str114, ei_iso2022_cn}, {-1}, #line 122 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str116, ei_iso8859_9}, #line 293 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str117, ei_gb2312}, #line 16 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str118, ei_ascii}, #line 150 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str119, ei_iso8859_14}, #line 13 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str120, ei_ascii}, #line 252 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str121, ei_tis620}, #line 282 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str122, ei_jisx0212}, {-1}, #line 255 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str124, ei_viscii}, #line 107 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str125, ei_iso8859_7}, #line 22 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str126, ei_ascii}, #line 294 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str127, ei_isoir165}, {-1}, #line 257 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str129, ei_viscii}, #line 163 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str130, ei_iso8859_16}, #line 212 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str131, ei_mac_roman}, {-1}, {-1}, {-1}, {-1}, #line 117 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str136, ei_iso8859_8}, #line 291 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str137, ei_gb2312}, {-1}, #line 206 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str139, ei_cp866}, {-1}, {-1}, #line 327 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str142, ei_iso2022_cn}, #line 324 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str143, ei_cp936}, #line 158 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str144, ei_iso8859_15}, {-1}, #line 283 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str146, ei_jisx0212}, #line 202 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str147, ei_cp862}, {-1}, {-1}, #line 21 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str150, ei_ascii}, #line 86 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str151, ei_iso8859_4}, #line 153 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str152, ei_iso8859_14}, #line 148 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str153, ei_iso8859_14}, #line 149 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str154, ei_iso8859_14}, {-1}, #line 352 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str156, ei_cp949}, #line 199 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str157, ei_cp850}, {-1}, #line 330 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str159, ei_hz}, #line 58 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str160, ei_iso8859_1}, {-1}, #line 152 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str162, ei_iso8859_14}, #line 109 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str163, ei_iso8859_7}, #line 171 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str164, ei_cp1250}, #line 319 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str165, ei_euc_cn}, #line 197 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str166, ei_cp850}, {-1}, #line 79 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str168, ei_iso8859_4}, #line 146 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str169, ei_iso8859_14}, #line 341 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str170, ei_cp950}, #line 91 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str171, ei_iso8859_5}, {-1}, {-1}, {-1}, {-1}, #line 131 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str176, ei_iso8859_10}, {-1}, {-1}, #line 24 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str179, ei_ucs2}, #line 258 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str180, ei_tcvn}, #line 124 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str181, ei_iso8859_9}, {-1}, {-1}, {-1}, #line 269 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str185, ei_jisx0201}, #line 80 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str186, ei_iso8859_4}, #line 147 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str187, ei_iso8859_14}, #line 165 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str188, ei_iso8859_16}, #line 299 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str189, ei_ksc5601}, {-1}, #line 66 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str191, ei_iso8859_2}, {-1}, {-1}, {-1}, {-1}, #line 329 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str196, ei_iso2022_cn_ext}, #line 83 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str197, ei_iso8859_4}, {-1}, {-1}, #line 157 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str200, ei_iso8859_15}, #line 275 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str201, ei_jisx0208}, #line 296 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str202, ei_ksc5601}, {-1}, #line 136 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str204, ei_iso8859_10}, {-1}, {-1}, #line 256 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str207, ei_viscii}, {-1}, #line 144 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str209, ei_iso8859_13}, {-1}, #line 264 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str211, ei_iso646_jp}, #line 234 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str212, ei_pt154}, #line 247 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str213, ei_tis620}, {-1}, #line 74 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str215, ei_iso8859_3}, #line 30 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str216, ei_ucs2be}, #line 233 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str217, ei_koi8_t}, #line 239 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str218, ei_rk1048}, {-1}, {-1}, #line 129 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str221, ei_iso8859_10}, #line 251 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str222, ei_tis620}, #line 14 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str223, ei_ascii}, #line 61 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str224, ei_iso8859_1}, {-1}, #line 135 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str226, ei_iso8859_10}, {-1}, #line 77 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str228, ei_iso8859_3}, {-1}, #line 246 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str230, ei_tis620}, {-1}, #line 127 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str232, ei_iso8859_9}, {-1}, #line 69 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str234, ei_iso8859_2}, #line 249 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str235, ei_tis620}, #line 242 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str236, ei_rk1048}, #line 92 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str237, ei_iso8859_5}, #line 241 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str238, ei_rk1048}, #line 130 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str239, ei_iso8859_10}, {-1}, #line 29 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str241, ei_ucs2be}, #line 38 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str242, ei_utf16}, {-1}, {-1}, #line 173 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str245, ei_cp1250}, {-1}, {-1}, #line 26 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str248, ei_ucs2}, #line 168 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str249, ei_koi8_r}, #line 164 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str250, ei_iso8859_16}, {-1}, #line 41 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str252, ei_utf32}, {-1}, #line 35 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str254, ei_ucs4}, #line 23 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str255, ei_utf8}, {-1}, {-1}, {-1}, #line 90 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str259, ei_iso8859_5}, {-1}, #line 167 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str261, ei_koi8_r}, #line 179 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str262, ei_cp1252}, #line 33 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str263, ei_ucs4}, #line 82 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str264, ei_iso8859_4}, {-1}, #line 245 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str266, ei_cp1133}, #line 208 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str267, ei_cp866}, {-1}, {-1}, #line 298 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str270, ei_ksc5601}, #line 357 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str271, ei_local_char}, {-1}, #line 349 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str273, ei_euc_kr}, {-1}, {-1}, {-1}, #line 335 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str277, ei_ces_big5}, #line 253 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str278, ei_cp874}, #line 230 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str279, ei_armscii_8}, {-1}, {-1}, #line 340 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str282, ei_ces_big5}, #line 31 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str283, ei_ucs2le}, {-1}, {-1}, #line 198 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str286, ei_cp850}, #line 12 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str287, ei_ascii}, {-1}, {-1}, #line 348 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str290, ei_euc_kr}, {-1}, {-1}, #line 321 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str293, ei_euc_cn}, #line 336 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str294, ei_ces_big5}, #line 250 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str295, ei_tis620}, {-1}, {-1}, {-1}, #line 339 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str299, ei_ces_big5}, {-1}, {-1}, #line 218 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str302, ei_mac_cyrillic}, #line 322 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str303, ei_ces_gbk}, #line 248 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str304, ei_tis620}, #line 176 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str305, ei_cp1251}, {-1}, #line 237 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str307, ei_pt154}, #line 108 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str308, ei_iso8859_7}, {-1}, #line 142 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str310, ei_iso8859_13}, #line 110 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str311, ei_iso8859_7}, {-1}, {-1}, {-1}, #line 301 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str315, ei_ksc5601}, {-1}, {-1}, #line 85 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str318, ei_iso8859_4}, {-1}, {-1}, #line 25 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str321, ei_ucs2}, {-1}, {-1}, {-1}, #line 37 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str325, ei_ucs4le}, #line 235 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str326, ei_pt154}, {-1}, {-1}, {-1}, #line 266 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str330, ei_iso646_jp}, {-1}, {-1}, {-1}, #line 356 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str334, ei_iso2022_kr}, {-1}, #line 226 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str336, ei_hp_roman8}, #line 56 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str337, ei_iso8859_1}, {-1}, {-1}, #line 277 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str340, ei_jisx0208}, {-1}, {-1}, {-1}, #line 101 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str344, ei_iso8859_6}, {-1}, {-1}, #line 19 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str347, ei_ascii}, {-1}, {-1}, #line 40 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str350, ei_utf16le}, #line 15 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str351, ei_ascii}, {-1}, {-1}, #line 192 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str354, ei_cp1257}, #line 215 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str355, ei_mac_iceland}, #line 43 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str356, ei_utf32le}, #line 300 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str357, ei_ksc5601}, {-1}, #line 100 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str359, ei_iso8859_6}, {-1}, {-1}, #line 355 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str362, ei_iso2022_kr}, #line 34 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str363, ei_ucs4}, {-1}, {-1}, {-1}, #line 27 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str367, ei_ucs2be}, #line 290 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str368, ei_gb2312}, #line 265 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str369, ei_iso646_jp}, {-1}, #line 243 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str371, ei_mulelao}, #line 284 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str372, ei_jisx0212}, #line 111 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str373, ei_iso8859_7}, {-1}, #line 260 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str375, ei_tcvn}, #line 292 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str376, ei_gb2312}, {-1}, #line 326 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str378, ei_gb18030}, #line 259 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str379, ei_tcvn}, {-1}, {-1}, {-1}, {-1}, #line 285 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str384, ei_iso646_cn}, #line 238 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str385, ei_pt154}, #line 98 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str386, ei_iso8859_6}, {-1}, #line 46 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str388, ei_utf7}, {-1}, {-1}, #line 18 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str391, ei_ascii}, #line 32 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str392, ei_ucs2le}, #line 113 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str393, ei_iso8859_7}, {-1}, #line 295 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str395, ei_isoir165}, #line 240 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str396, ei_rk1048}, {-1}, #line 17 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str398, ei_ascii}, {-1}, {-1}, {-1}, {-1}, #line 169 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str403, ei_koi8_u}, {-1}, {-1}, #line 47 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str406, ei_ucs2internal}, {-1}, {-1}, #line 36 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str409, ei_ucs4be}, #line 103 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str410, ei_iso8859_7}, #line 307 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str411, ei_sjis}, #line 320 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str412, ei_euc_cn}, #line 262 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str413, ei_iso646_jp}, {-1}, #line 45 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str415, ei_utf7}, #line 175 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str416, ei_cp1251}, #line 190 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str417, ei_cp1256}, #line 181 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str418, ei_cp1253}, {-1}, #line 187 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str420, ei_cp1255}, #line 178 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str421, ei_cp1252}, #line 325 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str422, ei_cp936}, {-1}, #line 196 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str424, ei_cp1258}, #line 350 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str425, ei_euc_kr}, #line 297 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str426, ei_ksc5601}, {-1}, #line 104 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str428, ei_iso8859_7}, #line 306 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str429, ei_sjis}, {-1}, {-1}, {-1}, #line 274 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str433, ei_jisx0208}, #line 39 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str434, ei_utf16be}, {-1}, {-1}, {-1}, {-1}, #line 143 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str439, ei_iso8859_13}, #line 42 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str440, ei_utf32be}, {-1}, {-1}, {-1}, {-1}, #line 224 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str445, ei_mac_thai}, {-1}, {-1}, #line 49 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str448, ei_ucs4internal}, #line 112 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str449, ei_iso8859_7}, {-1}, #line 210 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str451, ei_mac_roman}, #line 304 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str452, ei_euc_jp}, {-1}, {-1}, {-1}, #line 333 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str456, ei_euc_tw}, #line 287 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str457, ei_iso646_cn}, #line 132 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str458, ei_iso8859_10}, #line 97 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str459, ei_iso8859_6}, {-1}, #line 276 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str461, ei_jisx0208}, {-1}, #line 184 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str463, ei_cp1254}, #line 73 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str464, ei_iso8859_3}, {-1}, #line 89 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str466, ei_iso8859_5}, #line 20 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str467, ei_ascii}, {-1}, {-1}, #line 116 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str470, ei_iso8859_8}, #line 331 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str471, ei_hz}, {-1}, #line 332 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str473, ei_euc_tw}, #line 289 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str474, ei_iso646_cn}, #line 229 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str475, ei_nextstep}, #line 316 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str476, ei_iso2022_jp2}, {-1}, #line 123 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str478, ei_iso8859_9}, {-1}, #line 170 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str480, ei_koi8_ru}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 211 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str487, ei_mac_roman}, {-1}, #line 172 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str489, ei_cp1250}, {-1}, {-1}, #line 279 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str492, ei_jisx0212}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 314 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str500, ei_iso2022_jp1}, #line 216 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str501, ei_mac_croatian}, #line 225 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str502, ei_hp_roman8}, {-1}, {-1}, #line 315 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str505, ei_iso2022_jp2}, {-1}, {-1}, {-1}, #line 81 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str509, ei_iso8859_4}, #line 346 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str510, ei_big5hkscs2008}, {-1}, {-1}, {-1}, {-1}, #line 99 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str515, ei_iso8859_6}, {-1}, {-1}, #line 303 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str518, ei_euc_jp}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 338 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str525, ei_ces_big5}, {-1}, #line 345 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str527, ei_big5hkscs2008}, {-1}, {-1}, {-1}, #line 214 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str531, ei_mac_centraleurope}, #line 204 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str532, ei_cp862}, {-1}, {-1}, #line 302 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str535, ei_euc_jp}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 337 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str542, ei_ces_big5}, {-1}, {-1}, {-1}, #line 310 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str546, ei_sjis}, {-1}, {-1}, {-1}, #line 263 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str550, ei_iso646_jp}, {-1}, {-1}, {-1}, #line 268 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str554, ei_jisx0201}, #line 267 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str555, ei_jisx0201}, #line 119 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str556, ei_iso8859_8}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 223 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str563, ei_mac_arabic}, #line 278 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str564, ei_jisx0208}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 271 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str571, ei_jisx0208}, {-1}, {-1}, {-1}, #line 44 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str575, ei_utf7}, {-1}, #line 220 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str577, ei_mac_greek}, {-1}, #line 313 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str579, ei_iso2022_jp}, #line 185 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str580, ei_cp1254}, #line 281 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str581, ei_jisx0212}, {-1}, {-1}, #line 193 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str584, ei_cp1257}, {-1}, #line 272 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str586, ei_jisx0208}, {-1}, {-1}, {-1}, #line 182 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str590, ei_cp1253}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 228 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str599, ei_hp_roman8}, #line 52 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str600, ei_java}, #line 188 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str601, ei_cp1255}, {-1}, {-1}, #line 213 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str604, ei_mac_roman}, {-1}, {-1}, #line 312 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str607, ei_iso2022_jp}, #line 334 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str608, ei_euc_tw}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 232 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str614, ei_georgian_ps}, #line 28 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str615, ei_ucs2be}, {-1}, #line 309 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str617, ei_sjis}, {-1}, {-1}, #line 200 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str620, ei_cp850}, #line 219 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str621, ei_mac_ukraine}, #line 55 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str622, ei_iso8859_1}, #line 96 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str623, ei_iso8859_6}, #line 106 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str624, ei_iso8859_7}, {-1}, #line 231 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str626, ei_georgian_academy}, #line 65 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str627, ei_iso8859_2}, {-1}, #line 280 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str629, ei_jisx0212}, {-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}, #line 273 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str657, ei_jisx0208}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 358 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str664, ei_local_wchar_t}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 217 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str673, ei_mac_romania}, {-1}, {-1}, #line 254 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str676, ei_cp874}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 305 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str689, ei_euc_jp}, {-1}, #line 191 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str691, ei_cp1256}, {-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}, #line 48 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str723, ei_ucs2swapped}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 261 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str739, ei_tcvn}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 118 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str746, ei_iso8859_8}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 50 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str765, ei_ucs4swapped}, {-1}, {-1}, #line 353 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str768, ei_johab}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 221 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str786, ei_mac_turkish}, {-1}, {-1}, {-1}, #line 105 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str790, ei_iso8859_7}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 194 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str842, ei_cp1257}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 343 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str888, ei_big5hkscs2001}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 347 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str896, ei_big5hkscs2008}, {-1}, #line 270 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str898, ei_jisx0201}, {-1}, #line 342 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str900, ei_big5hkscs1999}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 222 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str908, ei_mac_hebrew}, {-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}, #line 344 "lib/aliases.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str935, ei_big5hkscs2004} }; #ifdef __GNUC__ __inline #if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ __attribute__ ((__gnu_inline__)) #endif #endif const struct alias * aliases_lookup (register const char *str, register unsigned int len) { if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register int key = aliases_hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) { register int o = aliases[key].name; if (o >= 0) { register const char *s = o + stringpool; if (*str == *s && !strcmp (str + 1, s + 1)) return &aliases[key]; } } } return 0; } freelan-2.0/third-party/source/libiconv-msvc/include/aliases2.h000066400000000000000000000023671252300335000246110ustar00rootroot00000000000000/* * Copyright (C) 1999-2003, 2008 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef USE_AIX # if defined _AIX # include "aliases_aix_sysaix.h" # else # include "aliases_aix.h" # endif #endif #ifdef USE_OSF1 # if defined __osf__ # include "aliases_osf1_sysosf1.h" # else # include "aliases_osf1.h" # endif #endif #ifdef USE_DOS # include "aliases_dos.h" #endif #ifdef USE_EXTRA # include "aliases_extra.h" #endif freelan-2.0/third-party/source/libiconv-msvc/include/aliases_aix.h000066400000000000000000000011461252300335000253620ustar00rootroot00000000000000 S(aix_0, "CP856", ei_cp856 ) S(aix_1, "CP922", ei_cp922 ) S(aix_2, "CP943", ei_cp943 ) S(aix_3, "CP1046", ei_cp1046 ) S(aix_4, "CP1124", ei_cp1124 ) S(aix_5, "CP1129", ei_cp1129 ) S(aix_6, "CP1161", ei_cp1161 ) S(aix_7, "IBM1161", ei_cp1161 ) S(aix_8, "IBM-1161", ei_cp1161 ) S(aix_9, "CSIBM1161", ei_cp1161 ) S(aix_10, "CP1162", ei_cp1162 ) S(aix_11, "IBM1162", ei_cp1162 ) S(aix_12, "IBM-1162", ei_cp1162 ) S(aix_13, "CSIBM1162", ei_cp1162 ) S(aix_14, "CP1163", ei_cp1163 ) S(aix_15, "IBM1163", ei_cp1163 ) S(aix_16, "IBM-1163", ei_cp1163 ) S(aix_17, "CSIBM1163", ei_cp1163 ) freelan-2.0/third-party/source/libiconv-msvc/include/aliases_aix_sysaix.h000066400000000000000000000014701252300335000267620ustar00rootroot00000000000000 S(aix_0, "CP856", ei_cp856 ) S(aix_1, "IBM-856", ei_cp856 ) S(aix_2, "CP922", ei_cp922 ) S(aix_3, "IBM-922", ei_cp922 ) S(aix_4, "CP943", ei_cp943 ) S(aix_5, "IBM-943", ei_cp943 ) S(aix_6, "CP1046", ei_cp1046 ) S(aix_7, "IBM-1046", ei_cp1046 ) S(aix_8, "CP1124", ei_cp1124 ) S(aix_9, "IBM-1124", ei_cp1124 ) S(aix_10, "CP1129", ei_cp1129 ) S(aix_11, "IBM-1129", ei_cp1129 ) S(aix_12, "CP1161", ei_cp1161 ) S(aix_13, "IBM1161", ei_cp1161 ) S(aix_14, "IBM-1161", ei_cp1161 ) S(aix_15, "CSIBM1161", ei_cp1161 ) S(aix_16, "CP1162", ei_cp1162 ) S(aix_17, "IBM1162", ei_cp1162 ) S(aix_18, "IBM-1162", ei_cp1162 ) S(aix_19, "CSIBM1162", ei_cp1162 ) S(aix_20, "CP1163", ei_cp1163 ) S(aix_21, "IBM1163", ei_cp1163 ) S(aix_22, "IBM-1163", ei_cp1163 ) S(aix_23, "CSIBM1163", ei_cp1163 ) freelan-2.0/third-party/source/libiconv-msvc/include/aliases_dos.h000066400000000000000000000030371252300335000253670ustar00rootroot00000000000000 S(dos_0, "CP437", ei_cp437 ) S(dos_1, "IBM437", ei_cp437 ) S(dos_2, "437", ei_cp437 ) S(dos_3, "CSPC8CODEPAGE437", ei_cp437 ) S(dos_4, "CP737", ei_cp737 ) S(dos_5, "CP775", ei_cp775 ) S(dos_6, "IBM775", ei_cp775 ) S(dos_7, "CSPC775BALTIC", ei_cp775 ) S(dos_8, "CP852", ei_cp852 ) S(dos_9, "IBM852", ei_cp852 ) S(dos_10, "852", ei_cp852 ) S(dos_11, "CSPCP852", ei_cp852 ) S(dos_12, "CP853", ei_cp853 ) S(dos_13, "CP855", ei_cp855 ) S(dos_14, "IBM855", ei_cp855 ) S(dos_15, "855", ei_cp855 ) S(dos_16, "CSIBM855", ei_cp855 ) S(dos_17, "CP857", ei_cp857 ) S(dos_18, "IBM857", ei_cp857 ) S(dos_19, "857", ei_cp857 ) S(dos_20, "CSIBM857", ei_cp857 ) S(dos_21, "CP858", ei_cp858 ) S(dos_22, "CP860", ei_cp860 ) S(dos_23, "IBM860", ei_cp860 ) S(dos_24, "860", ei_cp860 ) S(dos_25, "CSIBM860", ei_cp860 ) S(dos_26, "CP861", ei_cp861 ) S(dos_27, "IBM861", ei_cp861 ) S(dos_28, "861", ei_cp861 ) S(dos_29, "CP-IS", ei_cp861 ) S(dos_30, "CSIBM861", ei_cp861 ) S(dos_31, "CP863", ei_cp863 ) S(dos_32, "IBM863", ei_cp863 ) S(dos_33, "863", ei_cp863 ) S(dos_34, "CSIBM863", ei_cp863 ) S(dos_35, "CP864", ei_cp864 ) S(dos_36, "IBM864", ei_cp864 ) S(dos_37, "CSIBM864", ei_cp864 ) S(dos_38, "CP865", ei_cp865 ) S(dos_39, "IBM865", ei_cp865 ) S(dos_40, "865", ei_cp865 ) S(dos_41, "CSIBM865", ei_cp865 ) S(dos_42, "CP869", ei_cp869 ) S(dos_43, "IBM869", ei_cp869 ) S(dos_44, "869", ei_cp869 ) S(dos_45, "CP-GR", ei_cp869 ) S(dos_46, "CSIBM869", ei_cp869 ) S(dos_47, "CP1125", ei_cp1125 ) freelan-2.0/third-party/source/libiconv-msvc/include/aliases_extra.h000066400000000000000000000010151252300335000257170ustar00rootroot00000000000000 S(extra_0, "EUC-JISX0213", ei_euc_jisx0213 ) S(extra_1, "EUC-JIS-2004", ei_euc_jisx0213 ) S(extra_2, "SHIFT_JISX0213", ei_shift_jisx0213 ) S(extra_3, "SHIFT_JIS-2004", ei_shift_jisx0213 ) S(extra_4, "ISO-2022-JP-3", ei_iso2022_jp3 ) S(extra_5, "ISO-2022-JP-2004", ei_iso2022_jp3 ) S(extra_6, "BIG5-2003", ei_big5_2003 ) S(extra_7, "TDS565", ei_tds565 ) S(extra_8, "ISO-IR-230", ei_tds565 ) S(extra_9, "ATARIST", ei_atarist ) S(extra_10, "ATARI", ei_atarist ) S(extra_11, "RISCOS-LATIN1", ei_riscos1 ) freelan-2.0/third-party/source/libiconv-msvc/include/aliases_osf1.h000066400000000000000000000001201252300335000254400ustar00rootroot00000000000000 S(osf1_0, "DEC-KANJI", ei_dec_kanji ) S(osf1_1, "DEC-HANYU", ei_dec_hanyu ) freelan-2.0/third-party/source/libiconv-msvc/include/aliases_osf1_sysosf1.h000066400000000000000000000002361252300335000271370ustar00rootroot00000000000000 S(osf1_0, "DEC-KANJI", ei_dec_kanji ) S(osf1_1, "DECKANJI", ei_dec_kanji ) S(osf1_2, "DEC-HANYU", ei_dec_hanyu ) S(osf1_3, "DECHANYU", ei_dec_hanyu ) freelan-2.0/third-party/source/libiconv-msvc/include/aliases_sysaix.h000066400000000000000000002203121252300335000261170ustar00rootroot00000000000000/* ANSI-C code produced by gperf version 3.0.4 */ /* Command-line: gperf -m 10 lib/aliases_sysaix.gperf */ /* Computed positions: -k'1,3-11,$' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ #error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif #line 1 "lib/aliases_sysaix.gperf" struct alias { int name; unsigned int encoding_index; }; #define TOTAL_KEYWORDS 356 #define MIN_WORD_LENGTH 2 #define MAX_WORD_LENGTH 45 #define MIN_HASH_VALUE 13 #define MAX_HASH_VALUE 989 /* maximum key range = 977, duplicates = 0 */ #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static unsigned int aliases_hash (register const char *str, register unsigned int len) { static const unsigned short asso_values[] = { 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 13, 112, 990, 73, 4, 7, 6, 55, 8, 5, 171, 10, 23, 255, 990, 990, 990, 990, 990, 990, 147, 128, 4, 9, 125, 130, 5, 75, 4, 402, 69, 7, 125, 18, 4, 44, 990, 76, 4, 25, 195, 191, 161, 120, 22, 15, 990, 990, 990, 990, 27, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990 }; register int hval = len; switch (hval) { default: hval += asso_values[(unsigned char)str[10]]; /*FALLTHROUGH*/ case 10: hval += asso_values[(unsigned char)str[9]]; /*FALLTHROUGH*/ case 9: hval += asso_values[(unsigned char)str[8]]; /*FALLTHROUGH*/ case 8: hval += asso_values[(unsigned char)str[7]]; /*FALLTHROUGH*/ case 7: hval += asso_values[(unsigned char)str[6]]; /*FALLTHROUGH*/ case 6: hval += asso_values[(unsigned char)str[5]]; /*FALLTHROUGH*/ case 5: hval += asso_values[(unsigned char)str[4]]; /*FALLTHROUGH*/ case 4: hval += asso_values[(unsigned char)str[3]]; /*FALLTHROUGH*/ case 3: hval += asso_values[(unsigned char)str[2]]; /*FALLTHROUGH*/ case 2: case 1: hval += asso_values[(unsigned char)str[0]]; break; } return hval + asso_values[(unsigned char)str[len - 1]]; } struct stringpool_t { char stringpool_str13[sizeof("L1")]; char stringpool_str14[sizeof("L6")]; char stringpool_str15[sizeof("L3")]; char stringpool_str16[sizeof("L2")]; char stringpool_str17[sizeof("L5")]; char stringpool_str19[sizeof("L8")]; char stringpool_str20[sizeof("SJIS")]; char stringpool_str23[sizeof("866")]; char stringpool_str24[sizeof("CN")]; char stringpool_str27[sizeof("862")]; char stringpool_str32[sizeof("CP1131")]; char stringpool_str33[sizeof("CP1361")]; char stringpool_str34[sizeof("CP866")]; char stringpool_str36[sizeof("CP1133")]; char stringpool_str37[sizeof("CP1251")]; char stringpool_str38[sizeof("CP862")]; char stringpool_str39[sizeof("CP1256")]; char stringpool_str41[sizeof("CP1253")]; char stringpool_str42[sizeof("GB2312")]; char stringpool_str43[sizeof("CP1252")]; char stringpool_str45[sizeof("CP1255")]; char stringpool_str48[sizeof("CP936")]; char stringpool_str49[sizeof("CP1258")]; char stringpool_str52[sizeof("CP932")]; char stringpool_str53[sizeof("C99")]; char stringpool_str64[sizeof("L4")]; char stringpool_str68[sizeof("LATIN1")]; char stringpool_str69[sizeof("CP819")]; char stringpool_str70[sizeof("LATIN6")]; char stringpool_str72[sizeof("LATIN3")]; char stringpool_str74[sizeof("LATIN2")]; char stringpool_str76[sizeof("LATIN5")]; char stringpool_str80[sizeof("LATIN8")]; char stringpool_str88[sizeof("R8")]; char stringpool_str89[sizeof("ISO8859-1")]; char stringpool_str91[sizeof("ISO8859-6")]; char stringpool_str92[sizeof("HZ")]; char stringpool_str93[sizeof("ISO8859-3")]; char stringpool_str94[sizeof("ISO8859-11")]; char stringpool_str95[sizeof("ISO8859-2")]; char stringpool_str96[sizeof("ISO8859-16")]; char stringpool_str97[sizeof("ISO8859-5")]; char stringpool_str98[sizeof("ISO8859-13")]; char stringpool_str101[sizeof("ISO8859-8")]; char stringpool_str102[sizeof("ISO8859-15")]; char stringpool_str103[sizeof("ISO-8859-1")]; char stringpool_str105[sizeof("ISO-8859-6")]; char stringpool_str107[sizeof("ISO-8859-3")]; char stringpool_str108[sizeof("ISO-8859-11")]; char stringpool_str109[sizeof("ISO-8859-2")]; char stringpool_str110[sizeof("ISO-8859-16")]; char stringpool_str111[sizeof("ISO-8859-5")]; char stringpool_str112[sizeof("ISO-8859-13")]; char stringpool_str115[sizeof("ISO-8859-8")]; char stringpool_str116[sizeof("ISO-8859-15")]; char stringpool_str117[sizeof("ISO_8859-1")]; char stringpool_str118[sizeof("CYRILLIC")]; char stringpool_str119[sizeof("ISO_8859-6")]; char stringpool_str120[sizeof("LATIN-9")]; char stringpool_str121[sizeof("ISO_8859-3")]; char stringpool_str122[sizeof("ISO_8859-11")]; char stringpool_str123[sizeof("ISO_8859-2")]; char stringpool_str124[sizeof("ISO_8859-16")]; char stringpool_str125[sizeof("ISO_8859-5")]; char stringpool_str126[sizeof("ISO_8859-13")]; char stringpool_str127[sizeof("ISO8859-9")]; char stringpool_str128[sizeof("ISO_8859-16:2001")]; char stringpool_str129[sizeof("ISO_8859-8")]; char stringpool_str130[sizeof("ISO_8859-15")]; char stringpool_str131[sizeof("CP154")]; char stringpool_str132[sizeof("ISO-IR-6")]; char stringpool_str133[sizeof("CP949")]; char stringpool_str135[sizeof("ISO646-CN")]; char stringpool_str136[sizeof("MAC")]; char stringpool_str137[sizeof("ISO_8859-15:1998")]; char stringpool_str139[sizeof("CP1254")]; char stringpool_str141[sizeof("ISO-8859-9")]; char stringpool_str143[sizeof("ISO-IR-166")]; char stringpool_str145[sizeof("ISO-IR-126")]; char stringpool_str146[sizeof("GBK")]; char stringpool_str148[sizeof("ISO-IR-226")]; char stringpool_str149[sizeof("ISO-IR-165")]; char stringpool_str150[sizeof("X0212")]; char stringpool_str151[sizeof("ISO-IR-58")]; char stringpool_str152[sizeof("KOI8-T")]; char stringpool_str153[sizeof("BIG5")]; char stringpool_str154[sizeof("ISO-IR-138")]; char stringpool_str155[sizeof("ISO_8859-9")]; char stringpool_str156[sizeof("L10")]; char stringpool_str159[sizeof("850")]; char stringpool_str160[sizeof("IBM866")]; char stringpool_str161[sizeof("CSISO2022CN")]; char stringpool_str163[sizeof("CSBIG5")]; char stringpool_str164[sizeof("IBM862")]; char stringpool_str167[sizeof("BIG-5")]; char stringpool_str168[sizeof("ASCII")]; char stringpool_str169[sizeof("MS936")]; char stringpool_str170[sizeof("LATIN4")]; char stringpool_str171[sizeof("PT154")]; char stringpool_str172[sizeof("IBM-1131")]; char stringpool_str173[sizeof("CP850")]; char stringpool_str174[sizeof("EUCCN")]; char stringpool_str175[sizeof("CP1250")]; char stringpool_str176[sizeof("CSGB2312")]; char stringpool_str177[sizeof("CN-BIG5")]; char stringpool_str178[sizeof("CSASCII")]; char stringpool_str179[sizeof("ISO-2022-CN")]; char stringpool_str180[sizeof("L7")]; char stringpool_str182[sizeof("ISO-IR-159")]; char stringpool_str183[sizeof("IBM-1252")]; char stringpool_str184[sizeof("ISO_8859-14:1998")]; char stringpool_str186[sizeof("CP950")]; char stringpool_str187[sizeof("IBM-921")]; char stringpool_str188[sizeof("EUC-CN")]; char stringpool_str190[sizeof("ISO-2022-CN-EXT")]; char stringpool_str191[sizeof("ISO8859-4")]; char stringpool_str192[sizeof("IBM-932")]; char stringpool_str193[sizeof("TIS620")]; char stringpool_str195[sizeof("IBM819")]; char stringpool_str196[sizeof("ISO8859-14")]; char stringpool_str197[sizeof("ISO-IR-199")]; char stringpool_str199[sizeof("ISO_8859-10:1992")]; char stringpool_str201[sizeof("US")]; char stringpool_str202[sizeof("KSC_5601")]; char stringpool_str203[sizeof("ISO-IR-148")]; char stringpool_str204[sizeof("ISO-CELTIC")]; char stringpool_str205[sizeof("ISO-8859-4")]; char stringpool_str206[sizeof("UHC")]; char stringpool_str207[sizeof("TIS-620")]; char stringpool_str209[sizeof("ISO-IR-101")]; char stringpool_str210[sizeof("ISO-8859-14")]; char stringpool_str211[sizeof("LATIN10")]; char stringpool_str213[sizeof("X0201")]; char stringpool_str216[sizeof("ISO-IR-203")]; char stringpool_str217[sizeof("VISCII")]; char stringpool_str219[sizeof("ISO_8859-4")]; char stringpool_str221[sizeof("PTCP154")]; char stringpool_str224[sizeof("ISO_8859-14")]; char stringpool_str225[sizeof("X0208")]; char stringpool_str226[sizeof("IBM-CP1133")]; char stringpool_str227[sizeof("CSVISCII")]; char stringpool_str229[sizeof("ISO-IR-149")]; char stringpool_str231[sizeof("UCS-2")]; char stringpool_str232[sizeof("ISO8859-10")]; char stringpool_str234[sizeof("RK1048")]; char stringpool_str235[sizeof("GB_2312-80")]; char stringpool_str236[sizeof("CSISOLATIN1")]; char stringpool_str237[sizeof("ISO-IR-14")]; char stringpool_str238[sizeof("CSISOLATIN6")]; char stringpool_str239[sizeof("ELOT_928")]; char stringpool_str240[sizeof("CSISOLATIN3")]; char stringpool_str241[sizeof("KZ-1048")]; char stringpool_str242[sizeof("CSISOLATIN2")]; char stringpool_str243[sizeof("CSISOLATINCYRILLIC")]; char stringpool_str244[sizeof("CSISOLATIN5")]; char stringpool_str246[sizeof("ISO-8859-10")]; char stringpool_str247[sizeof("ISO-IR-109")]; char stringpool_str248[sizeof("CSKZ1048")]; char stringpool_str250[sizeof("CSKOI8R")]; char stringpool_str251[sizeof("GB18030")]; char stringpool_str252[sizeof("CSPTCP154")]; char stringpool_str254[sizeof("KOI8-R")]; char stringpool_str256[sizeof("TCVN")]; char stringpool_str258[sizeof("GB_1988-80")]; char stringpool_str260[sizeof("ISO_8859-10")]; char stringpool_str261[sizeof("MS-CYRL")]; char stringpool_str268[sizeof("CSISO58GB231280")]; char stringpool_str270[sizeof("TIS620.2533-1")]; char stringpool_str271[sizeof("KS_C_5601-1989")]; char stringpool_str272[sizeof("MACCYRILLIC")]; char stringpool_str275[sizeof("HZ-GB-2312")]; char stringpool_str277[sizeof("CN-GB-ISOIR165")]; char stringpool_str278[sizeof("ISO-IR-110")]; char stringpool_str281[sizeof("TIS620-0")]; char stringpool_str283[sizeof("CN-GB")]; char stringpool_str288[sizeof("TIS620.2529-1")]; char stringpool_str293[sizeof("ISO-IR-144")]; char stringpool_str294[sizeof("CSIBM866")]; char stringpool_str298[sizeof("ISO646-US")]; char stringpool_str299[sizeof("IBM850")]; char stringpool_str300[sizeof("CP874")]; char stringpool_str302[sizeof("CYRILLIC-ASIAN")]; char stringpool_str306[sizeof("CSISOLATINGREEK")]; char stringpool_str307[sizeof("CHAR")]; char stringpool_str310[sizeof("BIG5HKSCS")]; char stringpool_str313[sizeof("IBM-850")]; char stringpool_str322[sizeof("MS-ANSI")]; char stringpool_str323[sizeof("CSUCS4")]; char stringpool_str324[sizeof("BIG5-HKSCS")]; char stringpool_str327[sizeof("UCS-4")]; char stringpool_str330[sizeof("ARMSCII-8")]; char stringpool_str335[sizeof("GEORGIAN-PS")]; char stringpool_str338[sizeof("CSISOLATIN4")]; char stringpool_str339[sizeof("TIS620.2533-0")]; char stringpool_str342[sizeof("CSISO2022KR")]; char stringpool_str343[sizeof("MACINTOSH")]; char stringpool_str345[sizeof("ISO-IR-179")]; char stringpool_str347[sizeof("ISO-IR-100")]; char stringpool_str350[sizeof("GREEK8")]; char stringpool_str355[sizeof("EUCKR")]; char stringpool_str358[sizeof("UTF-16")]; char stringpool_str359[sizeof("VISCII1.1-1")]; char stringpool_str360[sizeof("ISO-2022-KR")]; char stringpool_str362[sizeof("CP367")]; char stringpool_str363[sizeof("UTF-8")]; char stringpool_str364[sizeof("UTF-32")]; char stringpool_str369[sizeof("EUC-KR")]; char stringpool_str371[sizeof("CP1257")]; char stringpool_str378[sizeof("CSISO57GB1988")]; char stringpool_str382[sizeof("CSKSC56011987")]; char stringpool_str383[sizeof("US-ASCII")]; char stringpool_str384[sizeof("CSISOLATINARABIC")]; char stringpool_str385[sizeof("ISO_8859-3:1988")]; char stringpool_str386[sizeof("CSUNICODE11")]; char stringpool_str387[sizeof("ISO_8859-5:1988")]; char stringpool_str389[sizeof("ISO_8859-8:1988")]; char stringpool_str390[sizeof("UNICODE-1-1")]; char stringpool_str391[sizeof("MACTHAI")]; char stringpool_str392[sizeof("ROMAN8")]; char stringpool_str393[sizeof("ISO-10646-UCS-2")]; char stringpool_str398[sizeof("GREEK")]; char stringpool_str402[sizeof("LATIN7")]; char stringpool_str404[sizeof("STRK1048-2002")]; char stringpool_str405[sizeof("WINDOWS-1251")]; char stringpool_str406[sizeof("WINDOWS-1256")]; char stringpool_str407[sizeof("WINDOWS-1253")]; char stringpool_str408[sizeof("WINDOWS-1252")]; char stringpool_str409[sizeof("WINDOWS-1255")]; char stringpool_str411[sizeof("WINDOWS-1258")]; char stringpool_str412[sizeof("CHINESE")]; char stringpool_str413[sizeof("NEXTSTEP")]; char stringpool_str415[sizeof("ISO_8859-9:1989")]; char stringpool_str419[sizeof("KS_C_5601-1987")]; char stringpool_str420[sizeof("WINDOWS-936")]; char stringpool_str423[sizeof("ISO8859-7")]; char stringpool_str434[sizeof("ISO_8859-4:1988")]; char stringpool_str436[sizeof("CSPC862LATINHEBREW")]; char stringpool_str437[sizeof("ISO-8859-7")]; char stringpool_str440[sizeof("ARABIC")]; char stringpool_str441[sizeof("ISO-10646-UCS-4")]; char stringpool_str445[sizeof("MULELAO-1")]; char stringpool_str446[sizeof("ECMA-118")]; char stringpool_str448[sizeof("JP")]; char stringpool_str451[sizeof("ISO_8859-7")]; char stringpool_str453[sizeof("TCVN-5712")]; char stringpool_str455[sizeof("TCVN5712-1")]; char stringpool_str456[sizeof("WINDOWS-1254")]; char stringpool_str459[sizeof("KOREAN")]; char stringpool_str461[sizeof("GEORGIAN-ACADEMY")]; char stringpool_str462[sizeof("MACICELAND")]; char stringpool_str469[sizeof("CSISOLATINHEBREW")]; char stringpool_str473[sizeof("ISO-IR-57")]; char stringpool_str474[sizeof("WINDOWS-1250")]; char stringpool_str475[sizeof("ISO-IR-87")]; char stringpool_str477[sizeof("ISO-IR-127")]; char stringpool_str478[sizeof("ISO-IR-157")]; char stringpool_str481[sizeof("EUCTW")]; char stringpool_str483[sizeof("UCS-2LE")]; char stringpool_str487[sizeof("HP-ROMAN8")]; char stringpool_str488[sizeof("IBM367")]; char stringpool_str492[sizeof("KOI8-U")]; char stringpool_str493[sizeof("UNICODEBIG")]; char stringpool_str495[sizeof("EUC-TW")]; char stringpool_str496[sizeof("CSMACINTOSH")]; char stringpool_str497[sizeof("CSUNICODE")]; char stringpool_str498[sizeof("JIS_C6226-1983")]; char stringpool_str501[sizeof("UCS-2-INTERNAL")]; char stringpool_str503[sizeof("ISO_646.IRV:1991")]; char stringpool_str510[sizeof("CSISO14JISC6220RO")]; char stringpool_str511[sizeof("ANSI_X3.4-1986")]; char stringpool_str515[sizeof("IBM-EUCCN")]; char stringpool_str516[sizeof("ANSI_X3.4-1968")]; char stringpool_str518[sizeof("MS-EE")]; char stringpool_str521[sizeof("CSPC850MULTILINGUAL")]; char stringpool_str523[sizeof("CSHPROMAN8")]; char stringpool_str525[sizeof("MACROMAN")]; char stringpool_str531[sizeof("UCS-4LE")]; char stringpool_str536[sizeof("ECMA-114")]; char stringpool_str540[sizeof("UNICODELITTLE")]; char stringpool_str543[sizeof("WCHAR_T")]; char stringpool_str544[sizeof("ISO_8859-1:1987")]; char stringpool_str545[sizeof("ISO_8859-6:1987")]; char stringpool_str546[sizeof("ISO_8859-7:2003")]; char stringpool_str547[sizeof("ISO_8859-2:1987")]; char stringpool_str549[sizeof("UCS-4-INTERNAL")]; char stringpool_str554[sizeof("CSISO159JISX02121990")]; char stringpool_str556[sizeof("CSEUCKR")]; char stringpool_str557[sizeof("CSUNICODE11UTF7")]; char stringpool_str561[sizeof("ASMO-708")]; char stringpool_str563[sizeof("UNICODE-1-1-UTF-7")]; char stringpool_str567[sizeof("JIS_C6220-1969-RO")]; char stringpool_str569[sizeof("KOI8-RU")]; char stringpool_str572[sizeof("WINDOWS-1257")]; char stringpool_str575[sizeof("CSISO2022JP2")]; char stringpool_str579[sizeof("MS-TURK")]; char stringpool_str583[sizeof("MACCROATIAN")]; char stringpool_str584[sizeof("BIG5-HKSCS:2001")]; char stringpool_str585[sizeof("ISO646-JP")]; char stringpool_str586[sizeof("JIS0208")]; char stringpool_str590[sizeof("BIG5-HKSCS:2008")]; char stringpool_str591[sizeof("ISO-2022-JP-1")]; char stringpool_str594[sizeof("ISO-2022-JP-2")]; char stringpool_str599[sizeof("SHIFT-JIS")]; char stringpool_str603[sizeof("BIG5-HKSCS:1999")]; char stringpool_str604[sizeof("UCS-2BE")]; char stringpool_str606[sizeof("MACGREEK")]; char stringpool_str611[sizeof("CSISO2022JP")]; char stringpool_str612[sizeof("UTF-16LE")]; char stringpool_str613[sizeof("SHIFT_JIS")]; char stringpool_str615[sizeof("MS-GREEK")]; char stringpool_str616[sizeof("UTF-32LE")]; char stringpool_str624[sizeof("EUCJP")]; char stringpool_str625[sizeof("MS-HEBR")]; char stringpool_str629[sizeof("ISO-2022-JP")]; char stringpool_str635[sizeof("BIG5-HKSCS:2004")]; char stringpool_str638[sizeof("EUC-JP")]; char stringpool_str648[sizeof("MACARABIC")]; char stringpool_str652[sizeof("UCS-4BE")]; char stringpool_str654[sizeof("UCS-2-SWAPPED")]; char stringpool_str660[sizeof("JIS_X0212")]; char stringpool_str662[sizeof("MACTURKISH")]; char stringpool_str666[sizeof("CSSHIFTJIS")]; char stringpool_str672[sizeof("WINDOWS-874")]; char stringpool_str682[sizeof("CSEUCTW")]; char stringpool_str685[sizeof("UTF-7")]; char stringpool_str696[sizeof("IBM-EUCKR")]; char stringpool_str702[sizeof("UCS-4-SWAPPED")]; char stringpool_str711[sizeof("ISO_8859-7:1987")]; char stringpool_str715[sizeof("BIGFIVE")]; char stringpool_str717[sizeof("TCVN5712-1:1993")]; char stringpool_str723[sizeof("JIS_X0201")]; char stringpool_str729[sizeof("BIG-FIVE")]; char stringpool_str732[sizeof("HEBREW")]; char stringpool_str733[sizeof("UTF-16BE")]; char stringpool_str735[sizeof("JIS_X0208")]; char stringpool_str737[sizeof("UTF-32BE")]; char stringpool_str741[sizeof("JISX0201-1976")]; char stringpool_str748[sizeof("JIS_X0212-1990")]; char stringpool_str752[sizeof("CSISO87JISX0208")]; char stringpool_str753[sizeof("JIS_X0208-1983")]; char stringpool_str771[sizeof("MS-ARAB")]; char stringpool_str797[sizeof("MACCENTRALEUROPE")]; char stringpool_str803[sizeof("CSHALFWIDTHKATAKANA")]; char stringpool_str804[sizeof("MS_KANJI")]; char stringpool_str807[sizeof("MACROMANIA")]; char stringpool_str820[sizeof("JIS_X0208-1990")]; char stringpool_str822[sizeof("IBM-EUCTW")]; char stringpool_str826[sizeof("WINBALTRIM")]; char stringpool_str846[sizeof("EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE")]; char stringpool_str849[sizeof("JIS_X0212.1990-0")]; char stringpool_str874[sizeof("CSEUCPKDFMTJAPANESE")]; char stringpool_str885[sizeof("JOHAB")]; char stringpool_str891[sizeof("JAVA")]; char stringpool_str898[sizeof("MACUKRAINE")]; char stringpool_str965[sizeof("IBM-EUCJP")]; char stringpool_str989[sizeof("MACHEBREW")]; }; static const struct stringpool_t stringpool_contents = { "L1", "L6", "L3", "L2", "L5", "L8", "SJIS", "866", "CN", "862", "CP1131", "CP1361", "CP866", "CP1133", "CP1251", "CP862", "CP1256", "CP1253", "GB2312", "CP1252", "CP1255", "CP936", "CP1258", "CP932", "C99", "L4", "LATIN1", "CP819", "LATIN6", "LATIN3", "LATIN2", "LATIN5", "LATIN8", "R8", "ISO8859-1", "ISO8859-6", "HZ", "ISO8859-3", "ISO8859-11", "ISO8859-2", "ISO8859-16", "ISO8859-5", "ISO8859-13", "ISO8859-8", "ISO8859-15", "ISO-8859-1", "ISO-8859-6", "ISO-8859-3", "ISO-8859-11", "ISO-8859-2", "ISO-8859-16", "ISO-8859-5", "ISO-8859-13", "ISO-8859-8", "ISO-8859-15", "ISO_8859-1", "CYRILLIC", "ISO_8859-6", "LATIN-9", "ISO_8859-3", "ISO_8859-11", "ISO_8859-2", "ISO_8859-16", "ISO_8859-5", "ISO_8859-13", "ISO8859-9", "ISO_8859-16:2001", "ISO_8859-8", "ISO_8859-15", "CP154", "ISO-IR-6", "CP949", "ISO646-CN", "MAC", "ISO_8859-15:1998", "CP1254", "ISO-8859-9", "ISO-IR-166", "ISO-IR-126", "GBK", "ISO-IR-226", "ISO-IR-165", "X0212", "ISO-IR-58", "KOI8-T", "BIG5", "ISO-IR-138", "ISO_8859-9", "L10", "850", "IBM866", "CSISO2022CN", "CSBIG5", "IBM862", "BIG-5", "ASCII", "MS936", "LATIN4", "PT154", "IBM-1131", "CP850", "EUCCN", "CP1250", "CSGB2312", "CN-BIG5", "CSASCII", "ISO-2022-CN", "L7", "ISO-IR-159", "IBM-1252", "ISO_8859-14:1998", "CP950", "IBM-921", "EUC-CN", "ISO-2022-CN-EXT", "ISO8859-4", "IBM-932", "TIS620", "IBM819", "ISO8859-14", "ISO-IR-199", "ISO_8859-10:1992", "US", "KSC_5601", "ISO-IR-148", "ISO-CELTIC", "ISO-8859-4", "UHC", "TIS-620", "ISO-IR-101", "ISO-8859-14", "LATIN10", "X0201", "ISO-IR-203", "VISCII", "ISO_8859-4", "PTCP154", "ISO_8859-14", "X0208", "IBM-CP1133", "CSVISCII", "ISO-IR-149", "UCS-2", "ISO8859-10", "RK1048", "GB_2312-80", "CSISOLATIN1", "ISO-IR-14", "CSISOLATIN6", "ELOT_928", "CSISOLATIN3", "KZ-1048", "CSISOLATIN2", "CSISOLATINCYRILLIC", "CSISOLATIN5", "ISO-8859-10", "ISO-IR-109", "CSKZ1048", "CSKOI8R", "GB18030", "CSPTCP154", "KOI8-R", "TCVN", "GB_1988-80", "ISO_8859-10", "MS-CYRL", "CSISO58GB231280", "TIS620.2533-1", "KS_C_5601-1989", "MACCYRILLIC", "HZ-GB-2312", "CN-GB-ISOIR165", "ISO-IR-110", "TIS620-0", "CN-GB", "TIS620.2529-1", "ISO-IR-144", "CSIBM866", "ISO646-US", "IBM850", "CP874", "CYRILLIC-ASIAN", "CSISOLATINGREEK", "CHAR", "BIG5HKSCS", "IBM-850", "MS-ANSI", "CSUCS4", "BIG5-HKSCS", "UCS-4", "ARMSCII-8", "GEORGIAN-PS", "CSISOLATIN4", "TIS620.2533-0", "CSISO2022KR", "MACINTOSH", "ISO-IR-179", "ISO-IR-100", "GREEK8", "EUCKR", "UTF-16", "VISCII1.1-1", "ISO-2022-KR", "CP367", "UTF-8", "UTF-32", "EUC-KR", "CP1257", "CSISO57GB1988", "CSKSC56011987", "US-ASCII", "CSISOLATINARABIC", "ISO_8859-3:1988", "CSUNICODE11", "ISO_8859-5:1988", "ISO_8859-8:1988", "UNICODE-1-1", "MACTHAI", "ROMAN8", "ISO-10646-UCS-2", "GREEK", "LATIN7", "STRK1048-2002", "WINDOWS-1251", "WINDOWS-1256", "WINDOWS-1253", "WINDOWS-1252", "WINDOWS-1255", "WINDOWS-1258", "CHINESE", "NEXTSTEP", "ISO_8859-9:1989", "KS_C_5601-1987", "WINDOWS-936", "ISO8859-7", "ISO_8859-4:1988", "CSPC862LATINHEBREW", "ISO-8859-7", "ARABIC", "ISO-10646-UCS-4", "MULELAO-1", "ECMA-118", "JP", "ISO_8859-7", "TCVN-5712", "TCVN5712-1", "WINDOWS-1254", "KOREAN", "GEORGIAN-ACADEMY", "MACICELAND", "CSISOLATINHEBREW", "ISO-IR-57", "WINDOWS-1250", "ISO-IR-87", "ISO-IR-127", "ISO-IR-157", "EUCTW", "UCS-2LE", "HP-ROMAN8", "IBM367", "KOI8-U", "UNICODEBIG", "EUC-TW", "CSMACINTOSH", "CSUNICODE", "JIS_C6226-1983", "UCS-2-INTERNAL", "ISO_646.IRV:1991", "CSISO14JISC6220RO", "ANSI_X3.4-1986", "IBM-EUCCN", "ANSI_X3.4-1968", "MS-EE", "CSPC850MULTILINGUAL", "CSHPROMAN8", "MACROMAN", "UCS-4LE", "ECMA-114", "UNICODELITTLE", "WCHAR_T", "ISO_8859-1:1987", "ISO_8859-6:1987", "ISO_8859-7:2003", "ISO_8859-2:1987", "UCS-4-INTERNAL", "CSISO159JISX02121990", "CSEUCKR", "CSUNICODE11UTF7", "ASMO-708", "UNICODE-1-1-UTF-7", "JIS_C6220-1969-RO", "KOI8-RU", "WINDOWS-1257", "CSISO2022JP2", "MS-TURK", "MACCROATIAN", "BIG5-HKSCS:2001", "ISO646-JP", "JIS0208", "BIG5-HKSCS:2008", "ISO-2022-JP-1", "ISO-2022-JP-2", "SHIFT-JIS", "BIG5-HKSCS:1999", "UCS-2BE", "MACGREEK", "CSISO2022JP", "UTF-16LE", "SHIFT_JIS", "MS-GREEK", "UTF-32LE", "EUCJP", "MS-HEBR", "ISO-2022-JP", "BIG5-HKSCS:2004", "EUC-JP", "MACARABIC", "UCS-4BE", "UCS-2-SWAPPED", "JIS_X0212", "MACTURKISH", "CSSHIFTJIS", "WINDOWS-874", "CSEUCTW", "UTF-7", "IBM-EUCKR", "UCS-4-SWAPPED", "ISO_8859-7:1987", "BIGFIVE", "TCVN5712-1:1993", "JIS_X0201", "BIG-FIVE", "HEBREW", "UTF-16BE", "JIS_X0208", "UTF-32BE", "JISX0201-1976", "JIS_X0212-1990", "CSISO87JISX0208", "JIS_X0208-1983", "MS-ARAB", "MACCENTRALEUROPE", "CSHALFWIDTHKATAKANA", "MS_KANJI", "MACROMANIA", "JIS_X0208-1990", "IBM-EUCTW", "WINBALTRIM", "EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE", "JIS_X0212.1990-0", "CSEUCPKDFMTJAPANESE", "JOHAB", "JAVA", "MACUKRAINE", "IBM-EUCJP", "MACHEBREW" }; #define stringpool ((const char *) &stringpool_contents) static const struct alias aliases[] = { {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 60 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str13, ei_iso8859_1}, #line 134 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str14, ei_iso8859_10}, #line 76 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str15, ei_iso8859_3}, #line 68 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str16, ei_iso8859_2}, #line 126 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str17, ei_iso8859_9}, {-1}, #line 152 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str19, ei_iso8859_14}, #line 313 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str20, ei_sjis}, {-1}, {-1}, #line 210 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str23, ei_cp866}, #line 292 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str24, ei_iso646_cn}, {-1}, {-1}, #line 206 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str27, ei_cp862}, {-1}, {-1}, {-1}, {-1}, #line 212 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str32, ei_cp1131}, #line 363 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str33, ei_johab}, #line 208 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str34, ei_cp866}, {-1}, #line 248 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str36, ei_cp1133}, #line 175 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str37, ei_cp1251}, #line 204 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str38, ei_cp862}, #line 191 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str39, ei_cp1256}, {-1}, #line 182 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str41, ei_cp1253}, #line 325 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str42, ei_euc_cn}, #line 178 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str43, ei_cp1252}, {-1}, #line 188 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str45, ei_cp1255}, {-1}, {-1}, #line 330 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str48, ei_cp936}, #line 197 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str49, ei_cp1258}, {-1}, {-1}, #line 316 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str52, ei_cp932}, #line 51 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str53, ei_c99}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 84 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str64, ei_iso8859_4}, {-1}, {-1}, {-1}, #line 59 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str68, ei_iso8859_1}, #line 57 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str69, ei_iso8859_1}, #line 133 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str70, ei_iso8859_10}, {-1}, #line 75 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str72, ei_iso8859_3}, {-1}, #line 67 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str74, ei_iso8859_2}, {-1}, #line 125 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str76, ei_iso8859_9}, {-1}, {-1}, {-1}, #line 151 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str80, ei_iso8859_14}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 231 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str88, ei_hp_roman8}, #line 62 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str89, ei_iso8859_1}, {-1}, #line 102 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str91, ei_iso8859_6}, #line 337 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str92, ei_hz}, #line 78 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str93, ei_iso8859_3}, #line 139 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str94, ei_iso8859_11}, #line 70 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str95, ei_iso8859_2}, #line 167 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str96, ei_iso8859_16}, #line 93 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str97, ei_iso8859_5}, #line 145 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str98, ei_iso8859_13}, {-1}, {-1}, #line 120 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str101, ei_iso8859_8}, #line 160 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str102, ei_iso8859_15}, #line 53 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str103, ei_iso8859_1}, {-1}, #line 94 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str105, ei_iso8859_6}, {-1}, #line 71 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str107, ei_iso8859_3}, #line 137 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str108, ei_iso8859_11}, #line 63 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str109, ei_iso8859_2}, #line 161 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str110, ei_iso8859_16}, #line 87 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str111, ei_iso8859_5}, #line 140 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str112, ei_iso8859_13}, {-1}, {-1}, #line 114 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str115, ei_iso8859_8}, #line 155 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str116, ei_iso8859_15}, #line 54 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str117, ei_iso8859_1}, #line 91 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str118, ei_iso8859_5}, #line 95 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str119, ei_iso8859_6}, #line 159 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str120, ei_iso8859_15}, #line 72 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str121, ei_iso8859_3}, #line 138 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str122, ei_iso8859_11}, #line 64 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str123, ei_iso8859_2}, #line 162 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str124, ei_iso8859_16}, #line 88 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str125, ei_iso8859_5}, #line 141 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str126, ei_iso8859_13}, #line 128 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str127, ei_iso8859_9}, #line 163 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str128, ei_iso8859_16}, #line 115 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str129, ei_iso8859_8}, #line 156 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str130, ei_iso8859_15}, #line 240 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str131, ei_pt154}, #line 16 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str132, ei_ascii}, #line 360 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str133, ei_cp949}, {-1}, #line 290 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str135, ei_iso646_cn}, #line 216 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str136, ei_mac_roman}, #line 157 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str137, ei_iso8859_15}, {-1}, #line 185 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str139, ei_cp1254}, {-1}, #line 121 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str141, ei_iso8859_9}, {-1}, #line 256 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str143, ei_tis620}, {-1}, #line 107 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str145, ei_iso8859_7}, #line 329 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str146, ei_ces_gbk}, {-1}, #line 164 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str148, ei_iso8859_16}, #line 298 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str149, ei_isoir165}, #line 286 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str150, ei_jisx0212}, #line 295 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str151, ei_gb2312}, #line 237 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str152, ei_koi8_t}, #line 343 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str153, ei_ces_big5}, #line 117 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str154, ei_iso8859_8}, #line 122 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str155, ei_iso8859_9}, #line 166 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str156, ei_iso8859_16}, {-1}, {-1}, #line 201 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str159, ei_cp850}, #line 209 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str160, ei_cp866}, #line 335 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str161, ei_iso2022_cn}, {-1}, #line 348 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str163, ei_ces_big5}, #line 205 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str164, ei_cp862}, {-1}, {-1}, #line 344 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str167, ei_ces_big5}, #line 13 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str168, ei_ascii}, #line 331 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str169, ei_cp936}, #line 83 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str170, ei_iso8859_4}, #line 238 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str171, ei_pt154}, #line 213 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str172, ei_cp1131}, #line 199 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str173, ei_cp850}, #line 324 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str174, ei_euc_cn}, #line 172 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str175, ei_cp1250}, #line 327 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str176, ei_euc_cn}, #line 347 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str177, ei_ces_big5}, #line 22 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str178, ei_ascii}, #line 334 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str179, ei_iso2022_cn}, #line 144 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str180, ei_iso8859_13}, {-1}, #line 287 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str182, ei_jisx0212}, #line 181 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str183, ei_cp1252}, #line 149 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str184, ei_iso8859_14}, {-1}, #line 349 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str186, ei_cp950}, #line 146 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str187, ei_iso8859_13}, #line 323 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str188, ei_euc_cn}, {-1}, #line 336 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str190, ei_iso2022_cn_ext}, #line 86 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str191, ei_iso8859_4}, #line 317 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str192, ei_cp932}, #line 251 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str193, ei_tis620}, {-1}, #line 58 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str195, ei_iso8859_1}, #line 154 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str196, ei_iso8859_14}, #line 150 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str197, ei_iso8859_14}, {-1}, #line 131 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str199, ei_iso8859_10}, {-1}, #line 21 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str201, ei_ascii}, #line 300 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str202, ei_ksc5601}, #line 124 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str203, ei_iso8859_9}, #line 153 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str204, ei_iso8859_14}, #line 79 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str205, ei_iso8859_4}, #line 361 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str206, ei_cp949}, #line 250 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str207, ei_tis620}, {-1}, #line 66 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str209, ei_iso8859_2}, #line 147 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str210, ei_iso8859_14}, #line 165 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str211, ei_iso8859_16}, {-1}, #line 273 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str213, ei_jisx0201}, {-1}, {-1}, #line 158 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str216, ei_iso8859_15}, #line 259 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str217, ei_viscii}, {-1}, #line 80 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str219, ei_iso8859_4}, {-1}, #line 239 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str221, ei_pt154}, {-1}, {-1}, #line 148 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str224, ei_iso8859_14}, #line 279 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str225, ei_jisx0208}, #line 249 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str226, ei_cp1133}, #line 261 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str227, ei_viscii}, {-1}, #line 303 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str229, ei_ksc5601}, {-1}, #line 24 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str231, ei_ucs2}, #line 136 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str232, ei_iso8859_10}, {-1}, #line 243 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str234, ei_rk1048}, #line 294 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str235, ei_gb2312}, #line 61 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str236, ei_iso8859_1}, #line 268 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str237, ei_iso646_jp}, #line 135 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str238, ei_iso8859_10}, #line 109 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str239, ei_iso8859_7}, #line 77 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str240, ei_iso8859_3}, #line 245 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str241, ei_rk1048}, #line 69 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str242, ei_iso8859_2}, #line 92 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str243, ei_iso8859_5}, #line 127 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str244, ei_iso8859_9}, {-1}, #line 129 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str246, ei_iso8859_10}, #line 74 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str247, ei_iso8859_3}, #line 246 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str248, ei_rk1048}, {-1}, #line 169 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str250, ei_koi8_r}, #line 333 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str251, ei_gb18030}, #line 242 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str252, ei_pt154}, {-1}, #line 168 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str254, ei_koi8_r}, {-1}, #line 262 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str256, ei_tcvn}, {-1}, #line 289 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str258, ei_iso646_cn}, {-1}, #line 130 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str260, ei_iso8859_10}, #line 177 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str261, ei_cp1251}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 296 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str268, ei_gb2312}, {-1}, #line 255 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str270, ei_tis620}, #line 302 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str271, ei_ksc5601}, #line 222 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str272, ei_mac_cyrillic}, {-1}, {-1}, #line 338 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str275, ei_hz}, {-1}, #line 299 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str277, ei_isoir165}, #line 82 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str278, ei_iso8859_4}, {-1}, {-1}, #line 252 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str281, ei_tis620}, {-1}, #line 326 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str283, ei_euc_cn}, {-1}, {-1}, {-1}, {-1}, #line 253 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str288, ei_tis620}, {-1}, {-1}, {-1}, {-1}, #line 90 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str293, ei_iso8859_5}, #line 211 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str294, ei_cp866}, {-1}, {-1}, {-1}, #line 14 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str298, ei_ascii}, #line 200 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str299, ei_cp850}, #line 257 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str300, ei_cp874}, {-1}, #line 241 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str302, ei_pt154}, {-1}, {-1}, {-1}, #line 112 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str306, ei_iso8859_7}, #line 366 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str307, ei_local_char}, {-1}, {-1}, #line 354 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str310, ei_big5hkscs2008}, {-1}, {-1}, #line 203 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str313, ei_cp850}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 180 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str322, ei_cp1252}, #line 35 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str323, ei_ucs4}, #line 353 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str324, ei_big5hkscs2008}, {-1}, {-1}, #line 33 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str327, ei_ucs4}, {-1}, {-1}, #line 234 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str330, ei_armscii_8}, {-1}, {-1}, {-1}, {-1}, #line 236 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str335, ei_georgian_ps}, {-1}, {-1}, #line 85 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str338, ei_iso8859_4}, #line 254 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str339, ei_tis620}, {-1}, {-1}, #line 365 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str342, ei_iso2022_kr}, #line 215 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str343, ei_mac_roman}, {-1}, #line 142 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str345, ei_iso8859_13}, {-1}, #line 56 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str347, ei_iso8859_1}, {-1}, {-1}, #line 110 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str350, ei_iso8859_7}, {-1}, {-1}, {-1}, {-1}, #line 357 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str355, ei_euc_kr}, {-1}, {-1}, #line 38 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str358, ei_utf16}, #line 260 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str359, ei_viscii}, #line 364 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str360, ei_iso2022_kr}, {-1}, #line 19 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str362, ei_ascii}, #line 23 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str363, ei_utf8}, #line 41 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str364, ei_utf32}, {-1}, {-1}, {-1}, {-1}, #line 356 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str369, ei_euc_kr}, {-1}, #line 194 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str371, ei_cp1257}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 293 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str378, ei_iso646_cn}, {-1}, {-1}, {-1}, #line 304 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str382, ei_ksc5601}, #line 12 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str383, ei_ascii}, #line 101 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str384, ei_iso8859_6}, #line 73 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str385, ei_iso8859_3}, #line 30 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str386, ei_ucs2be}, #line 89 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str387, ei_iso8859_5}, {-1}, #line 116 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str389, ei_iso8859_8}, #line 29 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str390, ei_ucs2be}, #line 228 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str391, ei_mac_thai}, #line 230 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str392, ei_hp_roman8}, #line 25 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str393, ei_ucs2}, {-1}, {-1}, {-1}, {-1}, #line 111 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str398, ei_iso8859_7}, {-1}, {-1}, {-1}, #line 143 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str402, ei_iso8859_13}, {-1}, #line 244 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str404, ei_rk1048}, #line 176 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str405, ei_cp1251}, #line 192 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str406, ei_cp1256}, #line 183 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str407, ei_cp1253}, #line 179 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str408, ei_cp1252}, #line 189 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str409, ei_cp1255}, {-1}, #line 198 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str411, ei_cp1258}, #line 297 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str412, ei_gb2312}, #line 233 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str413, ei_nextstep}, {-1}, #line 123 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str415, ei_iso8859_9}, {-1}, {-1}, {-1}, #line 301 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str419, ei_ksc5601}, #line 332 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str420, ei_cp936}, {-1}, {-1}, #line 113 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str423, ei_iso8859_7}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 81 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str434, ei_iso8859_4}, {-1}, #line 207 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str436, ei_cp862}, #line 103 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str437, ei_iso8859_7}, {-1}, {-1}, #line 100 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str440, ei_iso8859_6}, #line 34 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str441, ei_ucs4}, {-1}, {-1}, {-1}, #line 247 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str445, ei_mulelao}, #line 108 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str446, ei_iso8859_7}, {-1}, #line 269 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str448, ei_iso646_jp}, {-1}, {-1}, #line 104 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str451, ei_iso8859_7}, {-1}, #line 263 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str453, ei_tcvn}, {-1}, #line 264 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str455, ei_tcvn}, #line 186 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str456, ei_cp1254}, {-1}, {-1}, #line 305 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str459, ei_ksc5601}, {-1}, #line 235 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str461, ei_georgian_academy}, #line 219 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str462, ei_mac_iceland}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 119 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str469, ei_iso8859_8}, {-1}, {-1}, {-1}, #line 291 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str473, ei_iso646_cn}, #line 173 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str474, ei_cp1250}, #line 280 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str475, ei_jisx0208}, {-1}, #line 97 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str477, ei_iso8859_6}, #line 132 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str478, ei_iso8859_10}, {-1}, {-1}, #line 340 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str481, ei_euc_tw}, {-1}, #line 31 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str483, ei_ucs2le}, {-1}, {-1}, {-1}, #line 229 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str487, ei_hp_roman8}, #line 20 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str488, ei_ascii}, {-1}, {-1}, {-1}, #line 170 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str492, ei_koi8_u}, #line 28 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str493, ei_ucs2be}, {-1}, #line 339 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str495, ei_euc_tw}, #line 217 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str496, ei_mac_roman}, #line 26 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str497, ei_ucs2}, #line 281 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str498, ei_jisx0208}, {-1}, {-1}, #line 47 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str501, ei_ucs2internal}, {-1}, #line 15 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str503, ei_ascii}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 270 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str510, ei_iso646_jp}, #line 18 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str511, ei_ascii}, {-1}, {-1}, {-1}, #line 328 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str515, ei_euc_cn}, #line 17 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str516, ei_ascii}, {-1}, #line 174 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str518, ei_cp1250}, {-1}, {-1}, #line 202 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str521, ei_cp850}, {-1}, #line 232 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str523, ei_hp_roman8}, {-1}, #line 214 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str525, ei_mac_roman}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 37 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str531, ei_ucs4le}, {-1}, {-1}, {-1}, {-1}, #line 98 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str536, ei_iso8859_6}, {-1}, {-1}, {-1}, #line 32 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str540, ei_ucs2le}, {-1}, {-1}, #line 367 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str543, ei_local_wchar_t}, #line 55 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str544, ei_iso8859_1}, #line 96 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str545, ei_iso8859_6}, #line 106 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str546, ei_iso8859_7}, #line 65 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str547, ei_iso8859_2}, {-1}, #line 49 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str549, ei_ucs4internal}, {-1}, {-1}, {-1}, {-1}, #line 288 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str554, ei_jisx0212}, {-1}, #line 358 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str556, ei_euc_kr}, #line 46 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str557, ei_utf7}, {-1}, {-1}, {-1}, #line 99 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str561, ei_iso8859_6}, {-1}, #line 45 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str563, ei_utf7}, {-1}, {-1}, {-1}, #line 266 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str567, ei_iso646_jp}, {-1}, #line 171 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str569, ei_koi8_ru}, {-1}, {-1}, #line 195 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str572, ei_cp1257}, {-1}, {-1}, #line 322 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str575, ei_iso2022_jp2}, {-1}, {-1}, {-1}, #line 187 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str579, ei_cp1254}, {-1}, {-1}, {-1}, #line 220 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str583, ei_mac_croatian}, #line 351 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str584, ei_big5hkscs2001}, #line 267 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str585, ei_iso646_jp}, #line 278 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str586, ei_jisx0208}, {-1}, {-1}, {-1}, #line 355 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str590, ei_big5hkscs2008}, #line 320 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str591, ei_iso2022_jp1}, {-1}, {-1}, #line 321 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str594, ei_iso2022_jp2}, {-1}, {-1}, {-1}, {-1}, #line 312 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str599, ei_sjis}, {-1}, {-1}, {-1}, #line 350 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str603, ei_big5hkscs1999}, #line 27 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str604, ei_ucs2be}, {-1}, #line 224 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str606, ei_mac_greek}, {-1}, {-1}, {-1}, {-1}, #line 319 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str611, ei_iso2022_jp}, #line 40 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str612, ei_utf16le}, #line 311 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str613, ei_sjis}, {-1}, #line 184 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str615, ei_cp1253}, #line 43 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str616, ei_utf32le}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 307 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str624, ei_euc_jp}, #line 190 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str625, ei_cp1255}, {-1}, {-1}, {-1}, #line 318 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str629, ei_iso2022_jp}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 352 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str635, ei_big5hkscs2004}, {-1}, {-1}, #line 306 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str638, ei_euc_jp}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 227 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str648, ei_mac_arabic}, {-1}, {-1}, {-1}, #line 36 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str652, ei_ucs4be}, {-1}, #line 48 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str654, ei_ucs2swapped}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 283 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str660, ei_jisx0212}, {-1}, #line 225 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str662, ei_mac_turkish}, {-1}, {-1}, {-1}, #line 315 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str666, ei_sjis}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 258 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str672, ei_cp874}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 341 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str682, ei_euc_tw}, {-1}, {-1}, #line 44 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str685, ei_utf7}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 359 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str696, ei_euc_kr}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 50 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str702, ei_ucs4swapped}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 105 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str711, ei_iso8859_7}, {-1}, {-1}, {-1}, #line 346 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str715, ei_ces_big5}, {-1}, #line 265 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str717, ei_tcvn}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 271 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str723, ei_jisx0201}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 345 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str729, ei_ces_big5}, {-1}, {-1}, #line 118 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str732, ei_iso8859_8}, #line 39 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str733, ei_utf16be}, {-1}, #line 275 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str735, ei_jisx0208}, {-1}, #line 42 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str737, ei_utf32be}, {-1}, {-1}, {-1}, #line 272 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str741, ei_jisx0201}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 285 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str748, ei_jisx0212}, {-1}, {-1}, {-1}, #line 282 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str752, ei_jisx0208}, #line 276 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str753, ei_jisx0208}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 193 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str771, ei_cp1256}, {-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}, #line 218 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str797, ei_mac_centraleurope}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 274 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str803, ei_jisx0201}, #line 314 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str804, ei_sjis}, {-1}, {-1}, #line 221 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str807, ei_mac_romania}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 277 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str820, ei_jisx0208}, {-1}, #line 342 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str822, ei_euc_tw}, {-1}, {-1}, {-1}, #line 196 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str826, ei_cp1257}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 308 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str846, ei_euc_jp}, {-1}, {-1}, #line 284 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str849, ei_jisx0212}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 309 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str874, ei_euc_jp}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 362 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str885, ei_johab}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 52 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str891, ei_java}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 223 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str898, ei_mac_ukraine}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 310 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str965, ei_euc_jp}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 226 "lib/aliases_sysaix.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str989, ei_mac_hebrew} }; #ifdef __GNUC__ __inline #if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ __attribute__ ((__gnu_inline__)) #endif #endif const struct alias * aliases_lookup (register const char *str, register unsigned int len) { if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register int key = aliases_hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) { register int o = aliases[key].name; if (o >= 0) { register const char *s = o + stringpool; if (*str == *s && !strcmp (str + 1, s + 1)) return &aliases[key]; } } } return 0; } freelan-2.0/third-party/source/libiconv-msvc/include/aliases_syshpux.h000066400000000000000000002221561252300335000263320ustar00rootroot00000000000000/* ANSI-C code produced by gperf version 3.0.4 */ /* Command-line: gperf -m 10 lib/aliases_syshpux.gperf */ /* Computed positions: -k'1,3-11,$' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ #error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif #line 1 "lib/aliases_syshpux.gperf" struct alias { int name; unsigned int encoding_index; }; #define TOTAL_KEYWORDS 357 #define MIN_WORD_LENGTH 2 #define MAX_WORD_LENGTH 45 #define MIN_HASH_VALUE 9 #define MAX_HASH_VALUE 1038 /* maximum key range = 1030, duplicates = 0 */ #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static unsigned int aliases_hash (register const char *str, register unsigned int len) { static const unsigned short asso_values[] = { 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 0, 112, 1039, 57, 2, 0, 20, 51, 8, 5, 49, 13, 16, 335, 1039, 1039, 1039, 1039, 1039, 1039, 13, 149, 1, 6, 10, 55, 139, 10, 0, 328, 86, 210, 147, 6, 0, 73, 1039, 120, 6, 17, 282, 238, 172, 274, 2, 0, 1039, 1039, 1039, 1039, 34, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039 }; register int hval = len; switch (hval) { default: hval += asso_values[(unsigned char)str[10]]; /*FALLTHROUGH*/ case 10: hval += asso_values[(unsigned char)str[9]]; /*FALLTHROUGH*/ case 9: hval += asso_values[(unsigned char)str[8]]; /*FALLTHROUGH*/ case 8: hval += asso_values[(unsigned char)str[7]]; /*FALLTHROUGH*/ case 7: hval += asso_values[(unsigned char)str[6]]; /*FALLTHROUGH*/ case 6: hval += asso_values[(unsigned char)str[5]]; /*FALLTHROUGH*/ case 5: hval += asso_values[(unsigned char)str[4]]; /*FALLTHROUGH*/ case 4: hval += asso_values[(unsigned char)str[3]]; /*FALLTHROUGH*/ case 3: hval += asso_values[(unsigned char)str[2]]; /*FALLTHROUGH*/ case 2: case 1: hval += asso_values[(unsigned char)str[0]]; break; } return hval + asso_values[(unsigned char)str[len - 1]]; } struct stringpool_t { char stringpool_str9[sizeof("CN")]; char stringpool_str12[sizeof("HZ")]; char stringpool_str16[sizeof("862")]; char stringpool_str17[sizeof("CP1252")]; char stringpool_str19[sizeof("ASCII")]; char stringpool_str21[sizeof("CP1251")]; char stringpool_str22[sizeof("SJIS")]; char stringpool_str24[sizeof("CP862")]; char stringpool_str26[sizeof("866")]; char stringpool_str27[sizeof("CP1256")]; char stringpool_str28[sizeof("CSASCII")]; char stringpool_str29[sizeof("EUCCN")]; char stringpool_str30[sizeof("EUC-CN")]; char stringpool_str33[sizeof("CP1255")]; char stringpool_str34[sizeof("CP866")]; char stringpool_str35[sizeof("CP1131")]; char stringpool_str36[sizeof("C99")]; char stringpool_str38[sizeof("CP1361")]; char stringpool_str39[sizeof("HP15CN")]; char stringpool_str42[sizeof("CP932")]; char stringpool_str43[sizeof("CP1258")]; char stringpool_str50[sizeof("CHINESE")]; char stringpool_str52[sizeof("CP936")]; char stringpool_str53[sizeof("CP819")]; char stringpool_str57[sizeof("CP1253")]; char stringpool_str58[sizeof("ISO88592")]; char stringpool_str59[sizeof("ISO8859-2")]; char stringpool_str60[sizeof("ISO-8859-2")]; char stringpool_str62[sizeof("ISO88591")]; char stringpool_str63[sizeof("ISO8859-1")]; char stringpool_str64[sizeof("ISO-8859-1")]; char stringpool_str66[sizeof("ISO8859-11")]; char stringpool_str67[sizeof("ISO-8859-11")]; char stringpool_str68[sizeof("ISO88596")]; char stringpool_str69[sizeof("ISO8859-6")]; char stringpool_str70[sizeof("ISO-8859-6")]; char stringpool_str71[sizeof("CP1133")]; char stringpool_str72[sizeof("ISO8859-16")]; char stringpool_str73[sizeof("ISO-8859-16")]; char stringpool_str74[sizeof("ISO88595")]; char stringpool_str75[sizeof("ISO8859-5")]; char stringpool_str76[sizeof("ISO-8859-5")]; char stringpool_str77[sizeof("ISO885915")]; char stringpool_str78[sizeof("ISO8859-15")]; char stringpool_str79[sizeof("ISO-8859-15")]; char stringpool_str81[sizeof("ISO-2022-CN")]; char stringpool_str83[sizeof("ISO646-CN")]; char stringpool_str84[sizeof("ISO88598")]; char stringpool_str85[sizeof("ISO8859-8")]; char stringpool_str86[sizeof("ISO-8859-8")]; char stringpool_str88[sizeof("CSISO2022CN")]; char stringpool_str90[sizeof("ISO88599")]; char stringpool_str91[sizeof("ISO8859-9")]; char stringpool_str92[sizeof("ISO-8859-9")]; char stringpool_str94[sizeof("ISO_8859-2")]; char stringpool_str96[sizeof("ISO-2022-CN-EXT")]; char stringpool_str98[sizeof("ISO_8859-1")]; char stringpool_str99[sizeof("ISO8859-3")]; char stringpool_str100[sizeof("ISO-8859-3")]; char stringpool_str101[sizeof("ISO_8859-11")]; char stringpool_str102[sizeof("ISO8859-13")]; char stringpool_str103[sizeof("ISO-8859-13")]; char stringpool_str104[sizeof("ISO_8859-6")]; char stringpool_str105[sizeof("CP949")]; char stringpool_str107[sizeof("ISO_8859-16")]; char stringpool_str109[sizeof("ISO_8859-16:2001")]; char stringpool_str110[sizeof("ISO_8859-5")]; char stringpool_str111[sizeof("ELOT_928")]; char stringpool_str113[sizeof("ISO_8859-15")]; char stringpool_str115[sizeof("CP1257")]; char stringpool_str118[sizeof("CP154")]; char stringpool_str119[sizeof("CP1254")]; char stringpool_str120[sizeof("ISO_8859-8")]; char stringpool_str123[sizeof("ISO_8859-15:1998")]; char stringpool_str126[sizeof("ISO_8859-9")]; char stringpool_str129[sizeof("CP367")]; char stringpool_str130[sizeof("850")]; char stringpool_str131[sizeof("CP1250")]; char stringpool_str134[sizeof("ISO_8859-3")]; char stringpool_str135[sizeof("R8")]; char stringpool_str137[sizeof("ISO_8859-13")]; char stringpool_str138[sizeof("ISO-IR-6")]; char stringpool_str139[sizeof("KOI8-T")]; char stringpool_str140[sizeof("ISO-IR-226")]; char stringpool_str141[sizeof("CP850")]; char stringpool_str142[sizeof("ISO-IR-126")]; char stringpool_str144[sizeof("CP950")]; char stringpool_str147[sizeof("ISO-IR-166")]; char stringpool_str148[sizeof("TIS620")]; char stringpool_str149[sizeof("TIS-620")]; char stringpool_str152[sizeof("MAC")]; char stringpool_str153[sizeof("ISO-IR-165")]; char stringpool_str156[sizeof("ISO88597")]; char stringpool_str157[sizeof("ISO8859-7")]; char stringpool_str158[sizeof("ISO-8859-7")]; char stringpool_str159[sizeof("ISO_8859-10:1992")]; char stringpool_str161[sizeof("ISO8859-4")]; char stringpool_str162[sizeof("ISO-8859-4")]; char stringpool_str163[sizeof("ISO-IR-58")]; char stringpool_str164[sizeof("ISO8859-14")]; char stringpool_str165[sizeof("ISO-8859-14")]; char stringpool_str166[sizeof("ISO_8859-14:1998")]; char stringpool_str167[sizeof("GB2312")]; char stringpool_str170[sizeof("CP874")]; char stringpool_str171[sizeof("IBM862")]; char stringpool_str172[sizeof("ISO-IR-159")]; char stringpool_str176[sizeof("ISO8859-10")]; char stringpool_str177[sizeof("ISO-8859-10")]; char stringpool_str178[sizeof("ISO-IR-138")]; char stringpool_str179[sizeof("MS-ANSI")]; char stringpool_str180[sizeof("ISO-IR-199")]; char stringpool_str181[sizeof("IBM866")]; char stringpool_str182[sizeof("MS-EE")]; char stringpool_str183[sizeof("ARABIC")]; char stringpool_str190[sizeof("PT154")]; char stringpool_str192[sizeof("ISO_8859-7")]; char stringpool_str193[sizeof("ISO-IR-101")]; char stringpool_str195[sizeof("MACTHAI")]; char stringpool_str196[sizeof("ISO_8859-4")]; char stringpool_str198[sizeof("MS936")]; char stringpool_str199[sizeof("ISO_8859-14")]; char stringpool_str200[sizeof("IBM819")]; char stringpool_str202[sizeof("ARMSCII-8")]; char stringpool_str203[sizeof("KSC_5601")]; char stringpool_str206[sizeof("MACINTOSH")]; char stringpool_str207[sizeof("TIS620-0")]; char stringpool_str208[sizeof("ECMA-118")]; char stringpool_str209[sizeof("ISO-IR-148")]; char stringpool_str211[sizeof("ISO_8859-10")]; char stringpool_str212[sizeof("L2")]; char stringpool_str213[sizeof("ISO-IR-179")]; char stringpool_str214[sizeof("L1")]; char stringpool_str215[sizeof("ISO-IR-149")]; char stringpool_str217[sizeof("L6")]; char stringpool_str220[sizeof("L5")]; char stringpool_str221[sizeof("ISO-IR-109")]; char stringpool_str222[sizeof("CSMACINTOSH")]; char stringpool_str225[sizeof("L8")]; char stringpool_str227[sizeof("ISO-IR-203")]; char stringpool_str229[sizeof("KZ-1048")]; char stringpool_str230[sizeof("ISO-IR-127")]; char stringpool_str231[sizeof("CSKZ1048")]; char stringpool_str232[sizeof("L3")]; char stringpool_str233[sizeof("ISO-IR-14")]; char stringpool_str235[sizeof("ISO-IR-57")]; char stringpool_str236[sizeof("TIS620.2529-1")]; char stringpool_str238[sizeof("ISO-IR-157")]; char stringpool_str239[sizeof("LATIN2")]; char stringpool_str240[sizeof("ISO-IR-87")]; char stringpool_str243[sizeof("LATIN1")]; char stringpool_str246[sizeof("CSKSC56011987")]; char stringpool_str247[sizeof("KOREAN")]; char stringpool_str248[sizeof("ISO-IR-110")]; char stringpool_str249[sizeof("LATIN6")]; char stringpool_str250[sizeof("ISO-CELTIC")]; char stringpool_str251[sizeof("VISCII")]; char stringpool_str254[sizeof("CSVISCII")]; char stringpool_str255[sizeof("LATIN5")]; char stringpool_str258[sizeof("CHAR")]; char stringpool_str259[sizeof("KS_C_5601-1989")]; char stringpool_str260[sizeof("TIS620.2533-1")]; char stringpool_str261[sizeof("L7")]; char stringpool_str262[sizeof("RK1048")]; char stringpool_str263[sizeof("L4")]; char stringpool_str264[sizeof("CSISOLATIN2")]; char stringpool_str265[sizeof("LATIN8")]; char stringpool_str266[sizeof("PTCP154")]; char stringpool_str268[sizeof("CSISOLATIN1")]; char stringpool_str271[sizeof("TCVN")]; char stringpool_str272[sizeof("LATIN-9")]; char stringpool_str273[sizeof("CSISOLATINCYRILLIC")]; char stringpool_str274[sizeof("CSISOLATIN6")]; char stringpool_str276[sizeof("IBM367")]; char stringpool_str277[sizeof("GREEK8")]; char stringpool_str279[sizeof("LATIN3")]; char stringpool_str280[sizeof("CSISOLATIN5")]; char stringpool_str281[sizeof("X0212")]; char stringpool_str283[sizeof("CSISOLATINARABIC")]; char stringpool_str284[sizeof("ECMA-114")]; char stringpool_str285[sizeof("ISO-IR-144")]; char stringpool_str286[sizeof("CSPTCP154")]; char stringpool_str287[sizeof("UHC")]; char stringpool_str288[sizeof("IBM850")]; char stringpool_str290[sizeof("US")]; char stringpool_str292[sizeof("KS_C_5601-1987")]; char stringpool_str293[sizeof("UCS-2")]; char stringpool_str295[sizeof("IBM-CP1133")]; char stringpool_str300[sizeof("ASMO-708")]; char stringpool_str303[sizeof("ISO-IR-100")]; char stringpool_str304[sizeof("CSISOLATIN3")]; char stringpool_str308[sizeof("BIG5")]; char stringpool_str309[sizeof("BIG-5")]; char stringpool_str310[sizeof("US-ASCII")]; char stringpool_str311[sizeof("CSBIG5")]; char stringpool_str312[sizeof("CN-BIG5")]; char stringpool_str314[sizeof("GBK")]; char stringpool_str315[sizeof("TIS620.2533-0")]; char stringpool_str316[sizeof("UNICODE-1-1")]; char stringpool_str318[sizeof("ROMAN8")]; char stringpool_str319[sizeof("CSGB2312")]; char stringpool_str323[sizeof("CSUNICODE11")]; char stringpool_str325[sizeof("CSUNICODE")]; char stringpool_str327[sizeof("L10")]; char stringpool_str329[sizeof("TCVN-5712")]; char stringpool_str330[sizeof("HZ-GB-2312")]; char stringpool_str331[sizeof("HP-ROMAN8")]; char stringpool_str332[sizeof("GB_2312-80")]; char stringpool_str333[sizeof("CSIBM866")]; char stringpool_str334[sizeof("TCVN5712-1")]; char stringpool_str335[sizeof("MACCROATIAN")]; char stringpool_str336[sizeof("GREEK")]; char stringpool_str337[sizeof("LATIN7")]; char stringpool_str340[sizeof("X0201")]; char stringpool_str341[sizeof("LATIN4")]; char stringpool_str342[sizeof("EUCKR")]; char stringpool_str343[sizeof("EUC-KR")]; char stringpool_str345[sizeof("KOI8-R")]; char stringpool_str347[sizeof("CSKOI8R")]; char stringpool_str352[sizeof("GB18030")]; char stringpool_str354[sizeof("GB_1988-80")]; char stringpool_str355[sizeof("UTF-16")]; char stringpool_str356[sizeof("LATIN10")]; char stringpool_str362[sizeof("X0208")]; char stringpool_str363[sizeof("UTF-32")]; char stringpool_str364[sizeof("ISO646-US")]; char stringpool_str366[sizeof("CSISOLATIN4")]; char stringpool_str367[sizeof("UTF8")]; char stringpool_str368[sizeof("UTF-8")]; char stringpool_str369[sizeof("UNICODE-1-1-UTF-7")]; char stringpool_str374[sizeof("CSUNICODE11UTF7")]; char stringpool_str376[sizeof("VISCII1.1-1")]; char stringpool_str377[sizeof("EUCTW")]; char stringpool_str378[sizeof("EUC-TW")]; char stringpool_str384[sizeof("WINDOWS-1252")]; char stringpool_str386[sizeof("WINDOWS-1251")]; char stringpool_str389[sizeof("WINDOWS-1256")]; char stringpool_str390[sizeof("WCHAR_T")]; char stringpool_str392[sizeof("WINDOWS-1255")]; char stringpool_str394[sizeof("ISO-2022-KR")]; char stringpool_str395[sizeof("UCS-4")]; char stringpool_str396[sizeof("CSISO57GB1988")]; char stringpool_str397[sizeof("WINDOWS-1258")]; char stringpool_str398[sizeof("CSUCS4")]; char stringpool_str401[sizeof("CSISO2022KR")]; char stringpool_str403[sizeof("JP")]; char stringpool_str404[sizeof("WINDOWS-1253")]; char stringpool_str405[sizeof("STRK1048-2002")]; char stringpool_str406[sizeof("CSHPROMAN8")]; char stringpool_str408[sizeof("CSISO58GB231280")]; char stringpool_str410[sizeof("MACICELAND")]; char stringpool_str412[sizeof("CSISO14JISC6220RO")]; char stringpool_str415[sizeof("JIS_C6226-1983")]; char stringpool_str417[sizeof("ISO-10646-UCS-2")]; char stringpool_str419[sizeof("WINDOWS-936")]; char stringpool_str420[sizeof("BIG5HKSCS")]; char stringpool_str421[sizeof("BIG5-HKSCS")]; char stringpool_str427[sizeof("SHIFT-JIS")]; char stringpool_str433[sizeof("WINDOWS-1257")]; char stringpool_str435[sizeof("WINDOWS-1254")]; char stringpool_str437[sizeof("CN-GB-ISOIR165")]; char stringpool_str439[sizeof("CSSHIFTJIS")]; char stringpool_str440[sizeof("UTF-7")]; char stringpool_str441[sizeof("WINDOWS-1250")]; char stringpool_str442[sizeof("EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE")]; char stringpool_str443[sizeof("CN-GB")]; char stringpool_str444[sizeof("CSISO159JISX02121990")]; char stringpool_str448[sizeof("MACROMAN")]; char stringpool_str449[sizeof("GEORGIAN-ACADEMY")]; char stringpool_str450[sizeof("JIS_C6220-1969-RO")]; char stringpool_str451[sizeof("CSISOLATINHEBREW")]; char stringpool_str454[sizeof("MACARABIC")]; char stringpool_str455[sizeof("ISO_8859-5:1988")]; char stringpool_str460[sizeof("ISO_8859-8:1988")]; char stringpool_str461[sizeof("SHIFT_JIS")]; char stringpool_str464[sizeof("UCS-2BE")]; char stringpool_str466[sizeof("ISO_8859-9:1989")]; char stringpool_str467[sizeof("ISO_8859-3:1988")]; char stringpool_str468[sizeof("ISO-10646-UCS-4")]; char stringpool_str470[sizeof("MACROMANIA")]; char stringpool_str471[sizeof("ISO-2022-JP-2")]; char stringpool_str473[sizeof("ISO-2022-JP-1")]; char stringpool_str477[sizeof("CSISO2022JP2")]; char stringpool_str481[sizeof("JIS0208")]; char stringpool_str483[sizeof("ISO_8859-2:1987")]; char stringpool_str484[sizeof("NEXTSTEP")]; char stringpool_str485[sizeof("ISO_8859-1:1987")]; char stringpool_str488[sizeof("ISO_8859-6:1987")]; char stringpool_str490[sizeof("EUCJP")]; char stringpool_str491[sizeof("EUC-JP")]; char stringpool_str493[sizeof("CSISOLATINGREEK")]; char stringpool_str498[sizeof("ISO_8859-4:1988")]; char stringpool_str503[sizeof("ISO_8859-7:2003")]; char stringpool_str513[sizeof("GEORGIAN-PS")]; char stringpool_str515[sizeof("UCS-4BE")]; char stringpool_str521[sizeof("UTF-16BE")]; char stringpool_str523[sizeof("CSPC862LATINHEBREW")]; char stringpool_str525[sizeof("UCS-2LE")]; char stringpool_str526[sizeof("CSHALFWIDTHKATAKANA")]; char stringpool_str531[sizeof("ANSI_X3.4-1986")]; char stringpool_str532[sizeof("ISO_8859-7:1987")]; char stringpool_str534[sizeof("UTF-32BE")]; char stringpool_str537[sizeof("WINDOWS-874")]; char stringpool_str539[sizeof("ANSI_X3.4-1968")]; char stringpool_str542[sizeof("ISO-2022-JP")]; char stringpool_str544[sizeof("ISO646-JP")]; char stringpool_str549[sizeof("CSISO2022JP")]; char stringpool_str551[sizeof("CYRILLIC")]; char stringpool_str561[sizeof("MACCENTRALEUROPE")]; char stringpool_str563[sizeof("MS-HEBR")]; char stringpool_str566[sizeof("UNICODELITTLE")]; char stringpool_str576[sizeof("UCS-4LE")]; char stringpool_str581[sizeof("CYRILLIC-ASIAN")]; char stringpool_str582[sizeof("UTF-16LE")]; char stringpool_str583[sizeof("ISO_646.IRV:1991")]; char stringpool_str595[sizeof("UTF-32LE")]; char stringpool_str596[sizeof("JAVA")]; char stringpool_str598[sizeof("MS-ARAB")]; char stringpool_str603[sizeof("MULELAO-1")]; char stringpool_str606[sizeof("MS-GREEK")]; char stringpool_str607[sizeof("MACGREEK")]; char stringpool_str608[sizeof("BIGFIVE")]; char stringpool_str609[sizeof("BIG-FIVE")]; char stringpool_str622[sizeof("MS_KANJI")]; char stringpool_str627[sizeof("CSEUCKR")]; char stringpool_str639[sizeof("HEBREW")]; char stringpool_str644[sizeof("UCS-2-SWAPPED")]; char stringpool_str654[sizeof("JOHAB")]; char stringpool_str662[sizeof("CSEUCTW")]; char stringpool_str665[sizeof("UCS-2-INTERNAL")]; char stringpool_str669[sizeof("KOI8-U")]; char stringpool_str685[sizeof("MACUKRAINE")]; char stringpool_str689[sizeof("MACTURKISH")]; char stringpool_str692[sizeof("TCVN5712-1:1993")]; char stringpool_str695[sizeof("UCS-4-SWAPPED")]; char stringpool_str697[sizeof("MS-CYRL")]; char stringpool_str704[sizeof("MACCYRILLIC")]; char stringpool_str705[sizeof("CSISO87JISX0208")]; char stringpool_str707[sizeof("CSEUCPKDFMTJAPANESE")]; char stringpool_str710[sizeof("JIS_X0212")]; char stringpool_str716[sizeof("UCS-4-INTERNAL")]; char stringpool_str736[sizeof("UNICODEBIG")]; char stringpool_str745[sizeof("MS-TURK")]; char stringpool_str757[sizeof("BIG5-HKSCS:2001")]; char stringpool_str760[sizeof("JISX0201-1976")]; char stringpool_str768[sizeof("BIG5-HKSCS:2008")]; char stringpool_str769[sizeof("JIS_X0201")]; char stringpool_str771[sizeof("BIG5-HKSCS:1999")]; char stringpool_str774[sizeof("JIS_X0212-1990")]; char stringpool_str790[sizeof("KOI8-RU")]; char stringpool_str791[sizeof("JIS_X0208")]; char stringpool_str800[sizeof("MACHEBREW")]; char stringpool_str805[sizeof("JIS_X0208-1983")]; char stringpool_str806[sizeof("BIG5-HKSCS:2004")]; char stringpool_str842[sizeof("JIS_X0208-1990")]; char stringpool_str888[sizeof("JIS_X0212.1990-0")]; char stringpool_str991[sizeof("WINBALTRIM")]; char stringpool_str1038[sizeof("CSPC850MULTILINGUAL")]; }; static const struct stringpool_t stringpool_contents = { "CN", "HZ", "862", "CP1252", "ASCII", "CP1251", "SJIS", "CP862", "866", "CP1256", "CSASCII", "EUCCN", "EUC-CN", "CP1255", "CP866", "CP1131", "C99", "CP1361", "HP15CN", "CP932", "CP1258", "CHINESE", "CP936", "CP819", "CP1253", "ISO88592", "ISO8859-2", "ISO-8859-2", "ISO88591", "ISO8859-1", "ISO-8859-1", "ISO8859-11", "ISO-8859-11", "ISO88596", "ISO8859-6", "ISO-8859-6", "CP1133", "ISO8859-16", "ISO-8859-16", "ISO88595", "ISO8859-5", "ISO-8859-5", "ISO885915", "ISO8859-15", "ISO-8859-15", "ISO-2022-CN", "ISO646-CN", "ISO88598", "ISO8859-8", "ISO-8859-8", "CSISO2022CN", "ISO88599", "ISO8859-9", "ISO-8859-9", "ISO_8859-2", "ISO-2022-CN-EXT", "ISO_8859-1", "ISO8859-3", "ISO-8859-3", "ISO_8859-11", "ISO8859-13", "ISO-8859-13", "ISO_8859-6", "CP949", "ISO_8859-16", "ISO_8859-16:2001", "ISO_8859-5", "ELOT_928", "ISO_8859-15", "CP1257", "CP154", "CP1254", "ISO_8859-8", "ISO_8859-15:1998", "ISO_8859-9", "CP367", "850", "CP1250", "ISO_8859-3", "R8", "ISO_8859-13", "ISO-IR-6", "KOI8-T", "ISO-IR-226", "CP850", "ISO-IR-126", "CP950", "ISO-IR-166", "TIS620", "TIS-620", "MAC", "ISO-IR-165", "ISO88597", "ISO8859-7", "ISO-8859-7", "ISO_8859-10:1992", "ISO8859-4", "ISO-8859-4", "ISO-IR-58", "ISO8859-14", "ISO-8859-14", "ISO_8859-14:1998", "GB2312", "CP874", "IBM862", "ISO-IR-159", "ISO8859-10", "ISO-8859-10", "ISO-IR-138", "MS-ANSI", "ISO-IR-199", "IBM866", "MS-EE", "ARABIC", "PT154", "ISO_8859-7", "ISO-IR-101", "MACTHAI", "ISO_8859-4", "MS936", "ISO_8859-14", "IBM819", "ARMSCII-8", "KSC_5601", "MACINTOSH", "TIS620-0", "ECMA-118", "ISO-IR-148", "ISO_8859-10", "L2", "ISO-IR-179", "L1", "ISO-IR-149", "L6", "L5", "ISO-IR-109", "CSMACINTOSH", "L8", "ISO-IR-203", "KZ-1048", "ISO-IR-127", "CSKZ1048", "L3", "ISO-IR-14", "ISO-IR-57", "TIS620.2529-1", "ISO-IR-157", "LATIN2", "ISO-IR-87", "LATIN1", "CSKSC56011987", "KOREAN", "ISO-IR-110", "LATIN6", "ISO-CELTIC", "VISCII", "CSVISCII", "LATIN5", "CHAR", "KS_C_5601-1989", "TIS620.2533-1", "L7", "RK1048", "L4", "CSISOLATIN2", "LATIN8", "PTCP154", "CSISOLATIN1", "TCVN", "LATIN-9", "CSISOLATINCYRILLIC", "CSISOLATIN6", "IBM367", "GREEK8", "LATIN3", "CSISOLATIN5", "X0212", "CSISOLATINARABIC", "ECMA-114", "ISO-IR-144", "CSPTCP154", "UHC", "IBM850", "US", "KS_C_5601-1987", "UCS-2", "IBM-CP1133", "ASMO-708", "ISO-IR-100", "CSISOLATIN3", "BIG5", "BIG-5", "US-ASCII", "CSBIG5", "CN-BIG5", "GBK", "TIS620.2533-0", "UNICODE-1-1", "ROMAN8", "CSGB2312", "CSUNICODE11", "CSUNICODE", "L10", "TCVN-5712", "HZ-GB-2312", "HP-ROMAN8", "GB_2312-80", "CSIBM866", "TCVN5712-1", "MACCROATIAN", "GREEK", "LATIN7", "X0201", "LATIN4", "EUCKR", "EUC-KR", "KOI8-R", "CSKOI8R", "GB18030", "GB_1988-80", "UTF-16", "LATIN10", "X0208", "UTF-32", "ISO646-US", "CSISOLATIN4", "UTF8", "UTF-8", "UNICODE-1-1-UTF-7", "CSUNICODE11UTF7", "VISCII1.1-1", "EUCTW", "EUC-TW", "WINDOWS-1252", "WINDOWS-1251", "WINDOWS-1256", "WCHAR_T", "WINDOWS-1255", "ISO-2022-KR", "UCS-4", "CSISO57GB1988", "WINDOWS-1258", "CSUCS4", "CSISO2022KR", "JP", "WINDOWS-1253", "STRK1048-2002", "CSHPROMAN8", "CSISO58GB231280", "MACICELAND", "CSISO14JISC6220RO", "JIS_C6226-1983", "ISO-10646-UCS-2", "WINDOWS-936", "BIG5HKSCS", "BIG5-HKSCS", "SHIFT-JIS", "WINDOWS-1257", "WINDOWS-1254", "CN-GB-ISOIR165", "CSSHIFTJIS", "UTF-7", "WINDOWS-1250", "EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE", "CN-GB", "CSISO159JISX02121990", "MACROMAN", "GEORGIAN-ACADEMY", "JIS_C6220-1969-RO", "CSISOLATINHEBREW", "MACARABIC", "ISO_8859-5:1988", "ISO_8859-8:1988", "SHIFT_JIS", "UCS-2BE", "ISO_8859-9:1989", "ISO_8859-3:1988", "ISO-10646-UCS-4", "MACROMANIA", "ISO-2022-JP-2", "ISO-2022-JP-1", "CSISO2022JP2", "JIS0208", "ISO_8859-2:1987", "NEXTSTEP", "ISO_8859-1:1987", "ISO_8859-6:1987", "EUCJP", "EUC-JP", "CSISOLATINGREEK", "ISO_8859-4:1988", "ISO_8859-7:2003", "GEORGIAN-PS", "UCS-4BE", "UTF-16BE", "CSPC862LATINHEBREW", "UCS-2LE", "CSHALFWIDTHKATAKANA", "ANSI_X3.4-1986", "ISO_8859-7:1987", "UTF-32BE", "WINDOWS-874", "ANSI_X3.4-1968", "ISO-2022-JP", "ISO646-JP", "CSISO2022JP", "CYRILLIC", "MACCENTRALEUROPE", "MS-HEBR", "UNICODELITTLE", "UCS-4LE", "CYRILLIC-ASIAN", "UTF-16LE", "ISO_646.IRV:1991", "UTF-32LE", "JAVA", "MS-ARAB", "MULELAO-1", "MS-GREEK", "MACGREEK", "BIGFIVE", "BIG-FIVE", "MS_KANJI", "CSEUCKR", "HEBREW", "UCS-2-SWAPPED", "JOHAB", "CSEUCTW", "UCS-2-INTERNAL", "KOI8-U", "MACUKRAINE", "MACTURKISH", "TCVN5712-1:1993", "UCS-4-SWAPPED", "MS-CYRL", "MACCYRILLIC", "CSISO87JISX0208", "CSEUCPKDFMTJAPANESE", "JIS_X0212", "UCS-4-INTERNAL", "UNICODEBIG", "MS-TURK", "BIG5-HKSCS:2001", "JISX0201-1976", "BIG5-HKSCS:2008", "JIS_X0201", "BIG5-HKSCS:1999", "JIS_X0212-1990", "KOI8-RU", "JIS_X0208", "MACHEBREW", "JIS_X0208-1983", "BIG5-HKSCS:2004", "JIS_X0208-1990", "JIS_X0212.1990-0", "WINBALTRIM", "CSPC850MULTILINGUAL" }; #define stringpool ((const char *) &stringpool_contents) static const struct alias aliases[] = { {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 297 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str9, ei_iso646_cn}, {-1}, {-1}, #line 340 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str12, ei_hz}, {-1}, {-1}, {-1}, #line 212 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str16, ei_cp862}, #line 186 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str17, ei_cp1252}, {-1}, #line 13 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str19, ei_ascii}, {-1}, #line 183 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str21, ei_cp1251}, #line 317 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str22, ei_sjis}, {-1}, #line 210 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str24, ei_cp862}, {-1}, #line 216 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str26, ei_cp866}, #line 198 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str27, ei_cp1256}, #line 22 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str28, ei_ascii}, #line 327 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str29, ei_euc_cn}, #line 326 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str30, ei_euc_cn}, {-1}, {-1}, #line 195 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str33, ei_cp1255}, #line 214 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str34, ei_cp866}, #line 218 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str35, ei_cp1131}, #line 52 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str36, ei_c99}, {-1}, #line 364 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str38, ei_johab}, #line 331 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str39, ei_euc_cn}, {-1}, {-1}, #line 320 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str42, ei_cp932}, #line 204 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str43, ei_cp1258}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 302 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str50, ei_gb2312}, {-1}, #line 333 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str52, ei_cp936}, #line 58 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str53, ei_iso8859_1}, {-1}, {-1}, {-1}, #line 189 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str57, ei_cp1253}, #line 73 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str58, ei_iso8859_2}, #line 72 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str59, ei_iso8859_2}, #line 65 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str60, ei_iso8859_2}, {-1}, #line 64 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str62, ei_iso8859_1}, #line 63 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str63, ei_iso8859_1}, #line 54 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str64, ei_iso8859_1}, {-1}, #line 147 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str66, ei_iso8859_11}, #line 145 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str67, ei_iso8859_11}, #line 107 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str68, ei_iso8859_6}, #line 106 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str69, ei_iso8859_6}, #line 98 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str70, ei_iso8859_6}, #line 253 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str71, ei_cp1133}, #line 175 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str72, ei_iso8859_16}, #line 169 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str73, ei_iso8859_16}, #line 97 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str74, ei_iso8859_5}, #line 96 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str75, ei_iso8859_5}, #line 90 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str76, ei_iso8859_5}, #line 168 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str77, ei_iso8859_15}, #line 167 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str78, ei_iso8859_15}, #line 162 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str79, ei_iso8859_15}, {-1}, #line 337 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str81, ei_iso2022_cn}, {-1}, #line 295 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str83, ei_iso646_cn}, #line 127 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str84, ei_iso8859_8}, #line 126 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str85, ei_iso8859_8}, #line 120 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str86, ei_iso8859_8}, {-1}, #line 338 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str88, ei_iso2022_cn}, {-1}, #line 136 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str90, ei_iso8859_9}, #line 135 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str91, ei_iso8859_9}, #line 128 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str92, ei_iso8859_9}, {-1}, #line 66 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str94, ei_iso8859_2}, {-1}, #line 339 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str96, ei_iso2022_cn_ext}, {-1}, #line 55 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str98, ei_iso8859_1}, #line 81 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str99, ei_iso8859_3}, #line 74 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str100, ei_iso8859_3}, #line 146 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str101, ei_iso8859_11}, #line 153 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str102, ei_iso8859_13}, #line 148 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str103, ei_iso8859_13}, #line 99 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str104, ei_iso8859_6}, #line 361 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str105, ei_cp949}, {-1}, #line 170 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str107, ei_iso8859_16}, {-1}, #line 171 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str109, ei_iso8859_16}, #line 91 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str110, ei_iso8859_5}, #line 114 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str111, ei_iso8859_7}, {-1}, #line 163 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str113, ei_iso8859_15}, {-1}, #line 201 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str115, ei_cp1257}, {-1}, {-1}, #line 245 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str118, ei_pt154}, #line 192 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str119, ei_cp1254}, #line 121 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str120, ei_iso8859_8}, {-1}, {-1}, #line 164 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str123, ei_iso8859_15}, {-1}, {-1}, #line 129 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str126, ei_iso8859_9}, {-1}, {-1}, #line 19 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str129, ei_ascii}, #line 208 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str130, ei_cp850}, #line 180 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str131, ei_cp1250}, {-1}, {-1}, #line 75 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str134, ei_iso8859_3}, #line 236 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str135, ei_hp_roman8}, {-1}, #line 149 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str137, ei_iso8859_13}, #line 16 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str138, ei_ascii}, #line 242 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str139, ei_koi8_t}, #line 172 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str140, ei_iso8859_16}, #line 206 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str141, ei_cp850}, #line 112 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str142, ei_iso8859_7}, {-1}, #line 351 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str144, ei_cp950}, {-1}, {-1}, #line 261 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str147, ei_tis620}, #line 256 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str148, ei_tis620}, #line 255 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str149, ei_tis620}, {-1}, {-1}, #line 221 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str152, ei_mac_roman}, #line 303 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str153, ei_isoir165}, {-1}, {-1}, #line 119 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str156, ei_iso8859_7}, #line 118 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str157, ei_iso8859_7}, #line 108 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str158, ei_iso8859_7}, #line 139 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str159, ei_iso8859_10}, {-1}, #line 89 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str161, ei_iso8859_4}, #line 82 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str162, ei_iso8859_4}, #line 300 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str163, ei_gb2312}, #line 161 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str164, ei_iso8859_14}, #line 154 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str165, ei_iso8859_14}, #line 156 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str166, ei_iso8859_14}, #line 328 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str167, ei_euc_cn}, {-1}, {-1}, #line 262 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str170, ei_cp874}, #line 211 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str171, ei_cp862}, #line 292 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str172, ei_jisx0212}, {-1}, {-1}, {-1}, #line 144 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str176, ei_iso8859_10}, #line 137 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str177, ei_iso8859_10}, #line 123 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str178, ei_iso8859_8}, #line 188 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str179, ei_cp1252}, #line 157 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str180, ei_iso8859_14}, #line 215 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str181, ei_cp866}, #line 182 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str182, ei_cp1250}, #line 104 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str183, ei_iso8859_6}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 243 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str190, ei_pt154}, {-1}, #line 109 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str192, ei_iso8859_7}, #line 68 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str193, ei_iso8859_2}, {-1}, #line 233 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str195, ei_mac_thai}, #line 83 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str196, ei_iso8859_4}, {-1}, #line 334 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str198, ei_cp936}, #line 155 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str199, ei_iso8859_14}, #line 59 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str200, ei_iso8859_1}, {-1}, #line 239 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str202, ei_armscii_8}, #line 305 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str203, ei_ksc5601}, {-1}, {-1}, #line 220 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str206, ei_mac_roman}, #line 257 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str207, ei_tis620}, #line 113 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str208, ei_iso8859_7}, #line 131 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str209, ei_iso8859_9}, {-1}, #line 138 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str211, ei_iso8859_10}, #line 70 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str212, ei_iso8859_2}, #line 150 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str213, ei_iso8859_13}, #line 61 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str214, ei_iso8859_1}, #line 308 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str215, ei_ksc5601}, {-1}, #line 142 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str217, ei_iso8859_10}, {-1}, {-1}, #line 133 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str220, ei_iso8859_9}, #line 77 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str221, ei_iso8859_3}, #line 222 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str222, ei_mac_roman}, {-1}, {-1}, #line 159 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str225, ei_iso8859_14}, {-1}, #line 165 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str227, ei_iso8859_15}, {-1}, #line 250 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str229, ei_rk1048}, #line 101 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str230, ei_iso8859_6}, #line 251 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str231, ei_rk1048}, #line 79 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str232, ei_iso8859_3}, #line 273 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str233, ei_iso646_jp}, {-1}, #line 296 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str235, ei_iso646_cn}, #line 258 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str236, ei_tis620}, {-1}, #line 140 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str238, ei_iso8859_10}, #line 69 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str239, ei_iso8859_2}, #line 285 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str240, ei_jisx0208}, {-1}, {-1}, #line 60 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str243, ei_iso8859_1}, {-1}, {-1}, #line 309 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str246, ei_ksc5601}, #line 310 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str247, ei_ksc5601}, #line 85 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str248, ei_iso8859_4}, #line 141 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str249, ei_iso8859_10}, #line 160 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str250, ei_iso8859_14}, #line 264 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str251, ei_viscii}, {-1}, {-1}, #line 266 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str254, ei_viscii}, #line 132 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str255, ei_iso8859_9}, {-1}, {-1}, #line 367 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str258, ei_local_char}, #line 307 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str259, ei_ksc5601}, #line 260 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str260, ei_tis620}, #line 152 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str261, ei_iso8859_13}, #line 248 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str262, ei_rk1048}, #line 87 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str263, ei_iso8859_4}, #line 71 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str264, ei_iso8859_2}, #line 158 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str265, ei_iso8859_14}, #line 244 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str266, ei_pt154}, {-1}, #line 62 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str268, ei_iso8859_1}, {-1}, {-1}, #line 267 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str271, ei_tcvn}, #line 166 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str272, ei_iso8859_15}, #line 95 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str273, ei_iso8859_5}, #line 143 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str274, ei_iso8859_10}, {-1}, #line 20 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str276, ei_ascii}, #line 115 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str277, ei_iso8859_7}, {-1}, #line 78 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str279, ei_iso8859_3}, #line 134 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str280, ei_iso8859_9}, #line 291 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str281, ei_jisx0212}, {-1}, #line 105 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str283, ei_iso8859_6}, #line 102 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str284, ei_iso8859_6}, #line 93 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str285, ei_iso8859_5}, #line 247 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str286, ei_pt154}, #line 362 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str287, ei_cp949}, #line 207 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str288, ei_cp850}, {-1}, #line 21 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str290, ei_ascii}, {-1}, #line 306 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str292, ei_ksc5601}, #line 25 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str293, ei_ucs2}, {-1}, #line 254 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str295, ei_cp1133}, {-1}, {-1}, {-1}, {-1}, #line 103 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str300, ei_iso8859_6}, {-1}, {-1}, #line 57 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str303, ei_iso8859_1}, #line 80 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str304, ei_iso8859_3}, {-1}, {-1}, {-1}, #line 345 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str308, ei_ces_big5}, #line 346 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str309, ei_ces_big5}, #line 12 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str310, ei_ascii}, #line 350 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str311, ei_ces_big5}, #line 349 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str312, ei_ces_big5}, {-1}, #line 332 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str314, ei_ces_gbk}, #line 259 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str315, ei_tis620}, #line 30 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str316, ei_ucs2be}, {-1}, #line 235 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str318, ei_hp_roman8}, #line 330 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str319, ei_euc_cn}, {-1}, {-1}, {-1}, #line 31 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str323, ei_ucs2be}, {-1}, #line 27 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str325, ei_ucs2}, {-1}, #line 174 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str327, ei_iso8859_16}, {-1}, #line 268 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str329, ei_tcvn}, #line 341 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str330, ei_hz}, #line 234 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str331, ei_hp_roman8}, #line 299 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str332, ei_gb2312}, #line 217 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str333, ei_cp866}, #line 269 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str334, ei_tcvn}, #line 225 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str335, ei_mac_croatian}, #line 116 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str336, ei_iso8859_7}, #line 151 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str337, ei_iso8859_13}, {-1}, {-1}, #line 278 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str340, ei_jisx0201}, #line 86 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str341, ei_iso8859_4}, #line 359 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str342, ei_euc_kr}, #line 358 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str343, ei_euc_kr}, {-1}, #line 176 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str345, ei_koi8_r}, {-1}, #line 177 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str347, ei_koi8_r}, {-1}, {-1}, {-1}, {-1}, #line 336 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str352, ei_gb18030}, {-1}, #line 294 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str354, ei_iso646_cn}, #line 39 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str355, ei_utf16}, #line 173 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str356, ei_iso8859_16}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 284 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str362, ei_jisx0208}, #line 42 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str363, ei_utf32}, #line 14 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str364, ei_ascii}, {-1}, #line 88 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str366, ei_iso8859_4}, #line 24 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str367, ei_utf8}, #line 23 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str368, ei_utf8}, #line 46 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str369, ei_utf7}, {-1}, {-1}, {-1}, {-1}, #line 47 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str374, ei_utf7}, {-1}, #line 265 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str376, ei_viscii}, #line 343 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str377, ei_euc_tw}, #line 342 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str378, ei_euc_tw}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 187 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str384, ei_cp1252}, {-1}, #line 184 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str386, ei_cp1251}, {-1}, {-1}, #line 199 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str389, ei_cp1256}, #line 368 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str390, ei_local_wchar_t}, {-1}, #line 196 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str392, ei_cp1255}, {-1}, #line 365 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str394, ei_iso2022_kr}, #line 34 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str395, ei_ucs4}, #line 298 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str396, ei_iso646_cn}, #line 205 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str397, ei_cp1258}, #line 36 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str398, ei_ucs4}, {-1}, {-1}, #line 366 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str401, ei_iso2022_kr}, {-1}, #line 274 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str403, ei_iso646_jp}, #line 190 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str404, ei_cp1253}, #line 249 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str405, ei_rk1048}, #line 237 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str406, ei_hp_roman8}, {-1}, #line 301 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str408, ei_gb2312}, {-1}, #line 224 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str410, ei_mac_iceland}, {-1}, #line 275 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str412, ei_iso646_jp}, {-1}, {-1}, #line 286 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str415, ei_jisx0208}, {-1}, #line 26 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str417, ei_ucs2}, {-1}, #line 335 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str419, ei_cp936}, #line 356 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str420, ei_big5hkscs2008}, #line 355 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str421, ei_big5hkscs2008}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 316 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str427, ei_sjis}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 202 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str433, ei_cp1257}, {-1}, #line 193 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str435, ei_cp1254}, {-1}, #line 304 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str437, ei_isoir165}, {-1}, #line 319 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str439, ei_sjis}, #line 45 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str440, ei_utf7}, #line 181 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str441, ei_cp1250}, #line 313 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str442, ei_euc_jp}, #line 329 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str443, ei_euc_cn}, #line 293 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str444, ei_jisx0212}, {-1}, {-1}, {-1}, #line 219 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str448, ei_mac_roman}, #line 240 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str449, ei_georgian_academy}, #line 271 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str450, ei_iso646_jp}, #line 125 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str451, ei_iso8859_8}, {-1}, {-1}, #line 232 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str454, ei_mac_arabic}, #line 92 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str455, ei_iso8859_5}, {-1}, {-1}, {-1}, {-1}, #line 122 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str460, ei_iso8859_8}, #line 315 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str461, ei_sjis}, {-1}, {-1}, #line 28 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str464, ei_ucs2be}, {-1}, #line 130 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str466, ei_iso8859_9}, #line 76 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str467, ei_iso8859_3}, #line 35 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str468, ei_ucs4}, {-1}, #line 226 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str470, ei_mac_romania}, #line 324 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str471, ei_iso2022_jp2}, {-1}, #line 323 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str473, ei_iso2022_jp1}, {-1}, {-1}, {-1}, #line 325 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str477, ei_iso2022_jp2}, {-1}, {-1}, {-1}, #line 283 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str481, ei_jisx0208}, {-1}, #line 67 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str483, ei_iso8859_2}, #line 238 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str484, ei_nextstep}, #line 56 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str485, ei_iso8859_1}, {-1}, {-1}, #line 100 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str488, ei_iso8859_6}, {-1}, #line 312 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str490, ei_euc_jp}, #line 311 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str491, ei_euc_jp}, {-1}, #line 117 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str493, ei_iso8859_7}, {-1}, {-1}, {-1}, {-1}, #line 84 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str498, ei_iso8859_4}, {-1}, {-1}, {-1}, {-1}, #line 111 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str503, ei_iso8859_7}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 241 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str513, ei_georgian_ps}, {-1}, #line 37 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str515, ei_ucs4be}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 40 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str521, ei_utf16be}, {-1}, #line 213 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str523, ei_cp862}, {-1}, #line 32 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str525, ei_ucs2le}, #line 279 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str526, ei_jisx0201}, {-1}, {-1}, {-1}, {-1}, #line 18 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str531, ei_ascii}, #line 110 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str532, ei_iso8859_7}, {-1}, #line 43 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str534, ei_utf32be}, {-1}, {-1}, #line 263 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str537, ei_cp874}, {-1}, #line 17 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str539, ei_ascii}, {-1}, {-1}, #line 321 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str542, ei_iso2022_jp}, {-1}, #line 272 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str544, ei_iso646_jp}, {-1}, {-1}, {-1}, {-1}, #line 322 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str549, ei_iso2022_jp}, {-1}, #line 94 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str551, ei_iso8859_5}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 223 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str561, ei_mac_centraleurope}, {-1}, #line 197 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str563, ei_cp1255}, {-1}, {-1}, #line 33 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str566, ei_ucs2le}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 38 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str576, ei_ucs4le}, {-1}, {-1}, {-1}, {-1}, #line 246 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str581, ei_pt154}, #line 41 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str582, ei_utf16le}, #line 15 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str583, ei_ascii}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 44 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str595, ei_utf32le}, #line 53 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str596, ei_java}, {-1}, #line 200 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str598, ei_cp1256}, {-1}, {-1}, {-1}, {-1}, #line 252 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str603, ei_mulelao}, {-1}, {-1}, #line 191 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str606, ei_cp1253}, #line 229 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str607, ei_mac_greek}, #line 348 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str608, ei_ces_big5}, #line 347 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str609, ei_ces_big5}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 318 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str622, ei_sjis}, {-1}, {-1}, {-1}, {-1}, #line 360 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str627, ei_euc_kr}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 124 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str639, ei_iso8859_8}, {-1}, {-1}, {-1}, {-1}, #line 49 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str644, ei_ucs2swapped}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 363 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str654, ei_johab}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 344 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str662, ei_euc_tw}, {-1}, {-1}, #line 48 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str665, ei_ucs2internal}, {-1}, {-1}, {-1}, #line 178 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str669, ei_koi8_u}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 228 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str685, ei_mac_ukraine}, {-1}, {-1}, {-1}, #line 230 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str689, ei_mac_turkish}, {-1}, {-1}, #line 270 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str692, ei_tcvn}, {-1}, {-1}, #line 51 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str695, ei_ucs4swapped}, {-1}, #line 185 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str697, ei_cp1251}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 227 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str704, ei_mac_cyrillic}, #line 287 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str705, ei_jisx0208}, {-1}, #line 314 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str707, ei_euc_jp}, {-1}, {-1}, #line 288 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str710, ei_jisx0212}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 50 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str716, ei_ucs4internal}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 29 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str736, ei_ucs2be}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 194 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str745, ei_cp1254}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 353 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str757, ei_big5hkscs2001}, {-1}, {-1}, #line 277 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str760, ei_jisx0201}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 357 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str768, ei_big5hkscs2008}, #line 276 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str769, ei_jisx0201}, {-1}, #line 352 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str771, ei_big5hkscs1999}, {-1}, {-1}, #line 290 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str774, ei_jisx0212}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 179 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str790, ei_koi8_ru}, #line 280 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str791, ei_jisx0208}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 231 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str800, ei_mac_hebrew}, {-1}, {-1}, {-1}, {-1}, #line 281 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str805, ei_jisx0208}, #line 354 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str806, ei_big5hkscs2004}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 282 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str842, ei_jisx0208}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 289 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str888, ei_jisx0212}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 203 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str991, ei_cp1257}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 209 "lib/aliases_syshpux.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str1038, ei_cp850} }; #ifdef __GNUC__ __inline #if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ __attribute__ ((__gnu_inline__)) #endif #endif const struct alias * aliases_lookup (register const char *str, register unsigned int len) { if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register int key = aliases_hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) { register int o = aliases[key].name; if (o >= 0) { register const char *s = o + stringpool; if (*str == *s && !strcmp (str + 1, s + 1)) return &aliases[key]; } } } return 0; } freelan-2.0/third-party/source/libiconv-msvc/include/aliases_sysosf1.h000066400000000000000000002170571252300335000262220ustar00rootroot00000000000000/* ANSI-C code produced by gperf version 3.0.4 */ /* Command-line: gperf -m 10 lib/aliases_sysosf1.gperf */ /* Computed positions: -k'1,3-11,$' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ #error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif #line 1 "lib/aliases_sysosf1.gperf" struct alias { int name; unsigned int encoding_index; }; #define TOTAL_KEYWORDS 352 #define MIN_WORD_LENGTH 2 #define MAX_WORD_LENGTH 45 #define MIN_HASH_VALUE 13 #define MAX_HASH_VALUE 939 /* maximum key range = 927, duplicates = 0 */ #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static unsigned int aliases_hash (register const char *str, register unsigned int len) { static const unsigned short asso_values[] = { 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 13, 100, 940, 73, 4, 7, 6, 55, 8, 5, 156, 10, 23, 295, 940, 940, 940, 940, 940, 940, 115, 165, 4, 6, 104, 115, 13, 53, 4, 304, 95, 7, 150, 18, 4, 75, 940, 76, 50, 25, 141, 173, 137, 120, 6, 5, 940, 940, 940, 940, 27, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940 }; register int hval = len; switch (hval) { default: hval += asso_values[(unsigned char)str[10]]; /*FALLTHROUGH*/ case 10: hval += asso_values[(unsigned char)str[9]]; /*FALLTHROUGH*/ case 9: hval += asso_values[(unsigned char)str[8]]; /*FALLTHROUGH*/ case 8: hval += asso_values[(unsigned char)str[7]]; /*FALLTHROUGH*/ case 7: hval += asso_values[(unsigned char)str[6]]; /*FALLTHROUGH*/ case 6: hval += asso_values[(unsigned char)str[5]]; /*FALLTHROUGH*/ case 5: hval += asso_values[(unsigned char)str[4]]; /*FALLTHROUGH*/ case 4: hval += asso_values[(unsigned char)str[3]]; /*FALLTHROUGH*/ case 3: hval += asso_values[(unsigned char)str[2]]; /*FALLTHROUGH*/ case 2: case 1: hval += asso_values[(unsigned char)str[0]]; break; } return hval + asso_values[(unsigned char)str[len - 1]]; } struct stringpool_t { char stringpool_str13[sizeof("L1")]; char stringpool_str14[sizeof("L6")]; char stringpool_str15[sizeof("L3")]; char stringpool_str16[sizeof("L2")]; char stringpool_str17[sizeof("L5")]; char stringpool_str19[sizeof("L8")]; char stringpool_str23[sizeof("866")]; char stringpool_str24[sizeof("CN")]; char stringpool_str27[sizeof("862")]; char stringpool_str32[sizeof("CP1131")]; char stringpool_str33[sizeof("CP1361")]; char stringpool_str34[sizeof("CP866")]; char stringpool_str36[sizeof("CP1133")]; char stringpool_str37[sizeof("CP1251")]; char stringpool_str38[sizeof("CP862")]; char stringpool_str39[sizeof("CP1256")]; char stringpool_str41[sizeof("CP1253")]; char stringpool_str43[sizeof("CP1252")]; char stringpool_str45[sizeof("CP1255")]; char stringpool_str48[sizeof("CP936")]; char stringpool_str49[sizeof("CP1258")]; char stringpool_str50[sizeof("GB2312")]; char stringpool_str52[sizeof("CP932")]; char stringpool_str53[sizeof("C99")]; char stringpool_str60[sizeof("HZ")]; char stringpool_str64[sizeof("L4")]; char stringpool_str68[sizeof("LATIN1")]; char stringpool_str69[sizeof("CP819")]; char stringpool_str70[sizeof("LATIN6")]; char stringpool_str72[sizeof("LATIN3")]; char stringpool_str74[sizeof("LATIN2")]; char stringpool_str76[sizeof("LATIN5")]; char stringpool_str80[sizeof("LATIN8")]; char stringpool_str88[sizeof("R8")]; char stringpool_str89[sizeof("ISO8859-1")]; char stringpool_str91[sizeof("ISO8859-6")]; char stringpool_str93[sizeof("ISO8859-3")]; char stringpool_str94[sizeof("ISO8859-11")]; char stringpool_str95[sizeof("ISO8859-2")]; char stringpool_str96[sizeof("ISO8859-16")]; char stringpool_str97[sizeof("ISO8859-5")]; char stringpool_str98[sizeof("ISO8859-13")]; char stringpool_str101[sizeof("ISO8859-8")]; char stringpool_str102[sizeof("ISO8859-15")]; char stringpool_str103[sizeof("ISO-8859-1")]; char stringpool_str105[sizeof("ISO-8859-6")]; char stringpool_str107[sizeof("ISO-8859-3")]; char stringpool_str108[sizeof("ISO-8859-11")]; char stringpool_str109[sizeof("ISO-8859-2")]; char stringpool_str110[sizeof("ISO-8859-16")]; char stringpool_str111[sizeof("ISO-8859-5")]; char stringpool_str112[sizeof("ISO-8859-13")]; char stringpool_str115[sizeof("ISO-8859-8")]; char stringpool_str116[sizeof("ISO-8859-15")]; char stringpool_str117[sizeof("ISO_8859-1")]; char stringpool_str118[sizeof("CYRILLIC")]; char stringpool_str119[sizeof("ISO_8859-6")]; char stringpool_str120[sizeof("LATIN-9")]; char stringpool_str121[sizeof("ISO_8859-3")]; char stringpool_str122[sizeof("ISO_8859-11")]; char stringpool_str123[sizeof("ISO_8859-2")]; char stringpool_str124[sizeof("ISO_8859-16")]; char stringpool_str125[sizeof("ISO_8859-5")]; char stringpool_str126[sizeof("ISO_8859-13")]; char stringpool_str127[sizeof("ISO8859-9")]; char stringpool_str128[sizeof("ISO_8859-16:2001")]; char stringpool_str129[sizeof("ISO_8859-8")]; char stringpool_str130[sizeof("ISO_8859-15")]; char stringpool_str131[sizeof("CP154")]; char stringpool_str132[sizeof("ISO-IR-6")]; char stringpool_str133[sizeof("CP949")]; char stringpool_str135[sizeof("ISO646-CN")]; char stringpool_str136[sizeof("ASCII")]; char stringpool_str137[sizeof("ISO_8859-15:1998")]; char stringpool_str139[sizeof("CP1254")]; char stringpool_str141[sizeof("ISO-8859-9")]; char stringpool_str143[sizeof("ISO-IR-166")]; char stringpool_str145[sizeof("ISO-IR-126")]; char stringpool_str148[sizeof("ISO-IR-226")]; char stringpool_str149[sizeof("ISO-IR-165")]; char stringpool_str150[sizeof("X0212")]; char stringpool_str151[sizeof("ISO-IR-58")]; char stringpool_str152[sizeof("UHC")]; char stringpool_str153[sizeof("EUCCN")]; char stringpool_str154[sizeof("ISO-IR-138")]; char stringpool_str155[sizeof("ISO_8859-9")]; char stringpool_str156[sizeof("L10")]; char stringpool_str158[sizeof("SJIS")]; char stringpool_str159[sizeof("850")]; char stringpool_str161[sizeof("MAC")]; char stringpool_str164[sizeof("TACTIS")]; char stringpool_str165[sizeof("L7")]; char stringpool_str167[sizeof("EUC-CN")]; char stringpool_str170[sizeof("LATIN4")]; char stringpool_str173[sizeof("CP850")]; char stringpool_str175[sizeof("CP1250")]; char stringpool_str178[sizeof("KOI8-T")]; char stringpool_str179[sizeof("ISO-2022-CN")]; char stringpool_str182[sizeof("ISO-IR-159")]; char stringpool_str183[sizeof("ISO-CELTIC")]; char stringpool_str184[sizeof("ISO_8859-14:1998")]; char stringpool_str185[sizeof("IBM866")]; char stringpool_str186[sizeof("CP950")]; char stringpool_str189[sizeof("IBM862")]; char stringpool_str190[sizeof("ISO-2022-CN-EXT")]; char stringpool_str191[sizeof("ISO8859-4")]; char stringpool_str192[sizeof("CSASCII")]; char stringpool_str193[sizeof("US")]; char stringpool_str194[sizeof("MS936")]; char stringpool_str196[sizeof("ISO8859-14")]; char stringpool_str197[sizeof("ISO-IR-199")]; char stringpool_str198[sizeof("BIG5")]; char stringpool_str199[sizeof("ISO_8859-10:1992")]; char stringpool_str200[sizeof("KSC5601")]; char stringpool_str202[sizeof("PT154")]; char stringpool_str203[sizeof("ISO-IR-148")]; char stringpool_str205[sizeof("ISO-8859-4")]; char stringpool_str206[sizeof("GBK")]; char stringpool_str207[sizeof("CSISO2022CN")]; char stringpool_str208[sizeof("CSBIG5")]; char stringpool_str209[sizeof("ISO-IR-101")]; char stringpool_str210[sizeof("ISO-8859-14")]; char stringpool_str211[sizeof("LATIN10")]; char stringpool_str212[sizeof("BIG-5")]; char stringpool_str213[sizeof("X0201")]; char stringpool_str216[sizeof("ISO-IR-203")]; char stringpool_str217[sizeof("DECHANZI")]; char stringpool_str218[sizeof("ELOT_928")]; char stringpool_str219[sizeof("ISO_8859-4")]; char stringpool_str220[sizeof("IBM819")]; char stringpool_str221[sizeof("CSGB2312")]; char stringpool_str222[sizeof("CN-BIG5")]; char stringpool_str223[sizeof("UCS-2")]; char stringpool_str224[sizeof("ISO_8859-14")]; char stringpool_str225[sizeof("X0208")]; char stringpool_str228[sizeof("KSC_5601")]; char stringpool_str229[sizeof("ISO-IR-149")]; char stringpool_str232[sizeof("ISO8859-10")]; char stringpool_str234[sizeof("RK1048")]; char stringpool_str237[sizeof("ISO-IR-14")]; char stringpool_str238[sizeof("TCVN")]; char stringpool_str239[sizeof("TIS620")]; char stringpool_str243[sizeof("GB_2312-80")]; char stringpool_str245[sizeof("VISCII")]; char stringpool_str246[sizeof("ISO-8859-10")]; char stringpool_str247[sizeof("ISO-IR-109")]; char stringpool_str250[sizeof("CSISOLATIN1")]; char stringpool_str252[sizeof("CSISOLATIN6")]; char stringpool_str253[sizeof("TIS-620")]; char stringpool_str254[sizeof("CSISOLATIN3")]; char stringpool_str255[sizeof("CSVISCII")]; char stringpool_str256[sizeof("CSISOLATIN2")]; char stringpool_str257[sizeof("CSISOLATINCYRILLIC")]; char stringpool_str258[sizeof("CSISOLATIN5")]; char stringpool_str259[sizeof("GB18030")]; char stringpool_str260[sizeof("ISO_8859-10")]; char stringpool_str264[sizeof("CSKZ1048")]; char stringpool_str266[sizeof("GB_1988-80")]; char stringpool_str267[sizeof("KZ-1048")]; char stringpool_str270[sizeof("MS-CYRL")]; char stringpool_str275[sizeof("CHAR")]; char stringpool_str276[sizeof("CSKOI8R")]; char stringpool_str278[sizeof("ISO-IR-110")]; char stringpool_str280[sizeof("KOI8-R")]; char stringpool_str281[sizeof("MACCYRILLIC")]; char stringpool_str282[sizeof("IBM-CP1133")]; char stringpool_str283[sizeof("PTCP154")]; char stringpool_str285[sizeof("CP874")]; char stringpool_str289[sizeof("UTF-16")]; char stringpool_str293[sizeof("ISO-IR-144")]; char stringpool_str294[sizeof("UTF-8")]; char stringpool_str295[sizeof("UTF-32")]; char stringpool_str297[sizeof("KS_C_5601-1989")]; char stringpool_str298[sizeof("HZ-GB-2312")]; char stringpool_str304[sizeof("TIS620.2533-1")]; char stringpool_str308[sizeof("CSUNICODE11")]; char stringpool_str312[sizeof("UNICODE-1-1")]; char stringpool_str314[sizeof("CSPTCP154")]; char stringpool_str315[sizeof("CSUCS4")]; char stringpool_str316[sizeof("CYRILLIC-ASIAN")]; char stringpool_str319[sizeof("UCS-4")]; char stringpool_str322[sizeof("TIS620.2529-1")]; char stringpool_str324[sizeof("IBM850")]; char stringpool_str327[sizeof("TIS620-0")]; char stringpool_str330[sizeof("ISO-IR-179")]; char stringpool_str332[sizeof("CP367")]; char stringpool_str336[sizeof("ISO646-US")]; char stringpool_str339[sizeof("ISO-10646-UCS-2")]; char stringpool_str341[sizeof("CP1257")]; char stringpool_str342[sizeof("GREEK8")]; char stringpool_str343[sizeof("US-ASCII")]; char stringpool_str347[sizeof("ISO-IR-100")]; char stringpool_str352[sizeof("CSISOLATIN4")]; char stringpool_str354[sizeof("CSISOLATINGREEK")]; char stringpool_str356[sizeof("CSIBM866")]; char stringpool_str359[sizeof("CSISO58GB231280")]; char stringpool_str360[sizeof("EUCKR")]; char stringpool_str361[sizeof("MS-ANSI")]; char stringpool_str362[sizeof("MACTHAI")]; char stringpool_str365[sizeof("CN-GB")]; char stringpool_str366[sizeof("CSISOLATINARABIC")]; char stringpool_str368[sizeof("CN-GB-ISOIR165")]; char stringpool_str369[sizeof("ARMSCII-8")]; char stringpool_str370[sizeof("MACINTOSH")]; char stringpool_str372[sizeof("LATIN7")]; char stringpool_str373[sizeof("TIS620.2533-0")]; char stringpool_str374[sizeof("EUC-KR")]; char stringpool_str375[sizeof("VISCII1.1-1")]; char stringpool_str381[sizeof("JP")]; char stringpool_str385[sizeof("ROMAN8")]; char stringpool_str386[sizeof("ISO-2022-KR")]; char stringpool_str387[sizeof("ISO-10646-UCS-4")]; char stringpool_str393[sizeof("ISO8859-7")]; char stringpool_str395[sizeof("CHINESE")]; char stringpool_str397[sizeof("GEORGIAN-ACADEMY")]; char stringpool_str398[sizeof("CSUNICODE")]; char stringpool_str400[sizeof("WINDOWS-1251")]; char stringpool_str401[sizeof("WINDOWS-1256")]; char stringpool_str402[sizeof("WINDOWS-1253")]; char stringpool_str403[sizeof("WINDOWS-1252")]; char stringpool_str404[sizeof("WINDOWS-1255")]; char stringpool_str406[sizeof("WINDOWS-1258")]; char stringpool_str407[sizeof("ISO-8859-7")]; char stringpool_str410[sizeof("KOI8-U")]; char stringpool_str411[sizeof("CSPC862LATINHEBREW")]; char stringpool_str412[sizeof("EUCTW")]; char stringpool_str413[sizeof("ARABIC")]; char stringpool_str414[sizeof("CSISO2022KR")]; char stringpool_str415[sizeof("WINDOWS-936")]; char stringpool_str416[sizeof("GREEK")]; char stringpool_str417[sizeof("MULELAO-1")]; char stringpool_str418[sizeof("ECMA-118")]; char stringpool_str420[sizeof("TCVN-5712")]; char stringpool_str421[sizeof("ISO_8859-7")]; char stringpool_str422[sizeof("TCVN5712-1")]; char stringpool_str425[sizeof("ISO_8859-3:1988")]; char stringpool_str426[sizeof("EUC-TW")]; char stringpool_str427[sizeof("ISO_8859-5:1988")]; char stringpool_str428[sizeof("MACICELAND")]; char stringpool_str429[sizeof("ISO_8859-8:1988")]; char stringpool_str430[sizeof("KS_C_5601-1987")]; char stringpool_str432[sizeof("KOREAN")]; char stringpool_str433[sizeof("UCS-2LE")]; char stringpool_str437[sizeof("CSISOLATINHEBREW")]; char stringpool_str439[sizeof("CSKSC56011987")]; char stringpool_str441[sizeof("UNICODELITTLE")]; char stringpool_str442[sizeof("GEORGIAN-PS")]; char stringpool_str443[sizeof("ISO-IR-57")]; char stringpool_str445[sizeof("ISO-IR-87")]; char stringpool_str446[sizeof("JIS_C6226-1983")]; char stringpool_str447[sizeof("ISO-IR-127")]; char stringpool_str448[sizeof("ISO-IR-157")]; char stringpool_str449[sizeof("DECKOREAN")]; char stringpool_str451[sizeof("WINDOWS-1254")]; char stringpool_str454[sizeof("CSISO57GB1988")]; char stringpool_str455[sizeof("ISO_8859-9:1989")]; char stringpool_str458[sizeof("HP-ROMAN8")]; char stringpool_str464[sizeof("CSUNICODE11UTF7")]; char stringpool_str465[sizeof("WCHAR_T")]; char stringpool_str468[sizeof("UNICODEBIG")]; char stringpool_str469[sizeof("WINDOWS-1250")]; char stringpool_str470[sizeof("UNICODE-1-1-UTF-7")]; char stringpool_str472[sizeof("UCS-2-INTERNAL")]; char stringpool_str473[sizeof("ISO_646.IRV:1991")]; char stringpool_str474[sizeof("ISO_8859-4:1988")]; char stringpool_str476[sizeof("STRK1048-2002")]; char stringpool_str480[sizeof("MS-EE")]; char stringpool_str481[sizeof("UCS-4LE")]; char stringpool_str483[sizeof("IBM367")]; char stringpool_str487[sizeof("KOI8-RU")]; char stringpool_str491[sizeof("CSMACINTOSH")]; char stringpool_str497[sizeof("BIG5HKSCS")]; char stringpool_str500[sizeof("NEXTSTEP")]; char stringpool_str501[sizeof("UTF-16LE")]; char stringpool_str504[sizeof("CSISO14JISC6220RO")]; char stringpool_str505[sizeof("UTF-32LE")]; char stringpool_str507[sizeof("CSEUCKR")]; char stringpool_str508[sizeof("ECMA-114")]; char stringpool_str511[sizeof("BIG5-HKSCS")]; char stringpool_str513[sizeof("ANSI_X3.4-1986")]; char stringpool_str515[sizeof("JIS_C6220-1969-RO")]; char stringpool_str518[sizeof("ANSI_X3.4-1968")]; char stringpool_str520[sizeof("UCS-4-INTERNAL")]; char stringpool_str523[sizeof("CSPC850MULTILINGUAL")]; char stringpool_str524[sizeof("ISO-2022-JP-1")]; char stringpool_str525[sizeof("CSHPROMAN8")]; char stringpool_str527[sizeof("ISO-2022-JP-2")]; char stringpool_str534[sizeof("JIS0208")]; char stringpool_str539[sizeof("ASMO-708")]; char stringpool_str543[sizeof("MACROMAN")]; char stringpool_str544[sizeof("MACCROATIAN")]; char stringpool_str548[sizeof("CSISO159JISX02121990")]; char stringpool_str549[sizeof("ISO646-JP")]; char stringpool_str552[sizeof("WINDOWS-1257")]; char stringpool_str554[sizeof("CSISO2022JP2")]; char stringpool_str559[sizeof("CSEUCTW")]; char stringpool_str567[sizeof("EUCJP")]; char stringpool_str569[sizeof("ISO_8859-1:1987")]; char stringpool_str570[sizeof("ISO_8859-6:1987")]; char stringpool_str571[sizeof("ISO_8859-7:2003")]; char stringpool_str572[sizeof("ISO_8859-2:1987")]; char stringpool_str581[sizeof("EUC-JP")]; char stringpool_str586[sizeof("UTF-7")]; char stringpool_str591[sizeof("UCS-2BE")]; char stringpool_str593[sizeof("ISO-2022-JP")]; char stringpool_str602[sizeof("MS-TURK")]; char stringpool_str608[sizeof("JIS_X0212")]; char stringpool_str621[sizeof("CSISO2022JP")]; char stringpool_str624[sizeof("SHIFT-JIS")]; char stringpool_str638[sizeof("SHIFT_JIS")]; char stringpool_str639[sizeof("UCS-4BE")]; char stringpool_str644[sizeof("MS-HEBR")]; char stringpool_str646[sizeof("MACARABIC")]; char stringpool_str649[sizeof("MACGREEK")]; char stringpool_str652[sizeof("WINDOWS-874")]; char stringpool_str653[sizeof("CSHALFWIDTHKATAKANA")]; char stringpool_str658[sizeof("MS-GREEK")]; char stringpool_str659[sizeof("UTF-16BE")]; char stringpool_str661[sizeof("MACTURKISH")]; char stringpool_str663[sizeof("UTF-32BE")]; char stringpool_str669[sizeof("CSSHIFTJIS")]; char stringpool_str671[sizeof("JIS_X0201")]; char stringpool_str678[sizeof("HEBREW")]; char stringpool_str683[sizeof("JIS_X0208")]; char stringpool_str685[sizeof("BIGFIVE")]; char stringpool_str689[sizeof("JISX0201-1976")]; char stringpool_str695[sizeof("UCS-2-SWAPPED")]; char stringpool_str696[sizeof("JIS_X0212-1990")]; char stringpool_str699[sizeof("BIG-FIVE")]; char stringpool_str701[sizeof("JIS_X0208-1983")]; char stringpool_str702[sizeof("EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE")]; char stringpool_str707[sizeof("SDECKANJI")]; char stringpool_str711[sizeof("JAVA")]; char stringpool_str721[sizeof("ISO_8859-7:1987")]; char stringpool_str724[sizeof("TCVN5712-1:1993")]; char stringpool_str725[sizeof("MS_KANJI")]; char stringpool_str727[sizeof("MACCENTRALEUROPE")]; char stringpool_str731[sizeof("CSISO87JISX0208")]; char stringpool_str743[sizeof("UCS-4-SWAPPED")]; char stringpool_str761[sizeof("MACROMANIA")]; char stringpool_str765[sizeof("BIG5-HKSCS:2001")]; char stringpool_str768[sizeof("JIS_X0208-1990")]; char stringpool_str771[sizeof("BIG5-HKSCS:2008")]; char stringpool_str784[sizeof("BIG5-HKSCS:1999")]; char stringpool_str785[sizeof("JIS_X0212.1990-0")]; char stringpool_str806[sizeof("MS-ARAB")]; char stringpool_str807[sizeof("JOHAB")]; char stringpool_str816[sizeof("BIG5-HKSCS:2004")]; char stringpool_str821[sizeof("MACUKRAINE")]; char stringpool_str842[sizeof("CSEUCPKDFMTJAPANESE")]; char stringpool_str857[sizeof("WINBALTRIM")]; char stringpool_str939[sizeof("MACHEBREW")]; }; static const struct stringpool_t stringpool_contents = { "L1", "L6", "L3", "L2", "L5", "L8", "866", "CN", "862", "CP1131", "CP1361", "CP866", "CP1133", "CP1251", "CP862", "CP1256", "CP1253", "CP1252", "CP1255", "CP936", "CP1258", "GB2312", "CP932", "C99", "HZ", "L4", "LATIN1", "CP819", "LATIN6", "LATIN3", "LATIN2", "LATIN5", "LATIN8", "R8", "ISO8859-1", "ISO8859-6", "ISO8859-3", "ISO8859-11", "ISO8859-2", "ISO8859-16", "ISO8859-5", "ISO8859-13", "ISO8859-8", "ISO8859-15", "ISO-8859-1", "ISO-8859-6", "ISO-8859-3", "ISO-8859-11", "ISO-8859-2", "ISO-8859-16", "ISO-8859-5", "ISO-8859-13", "ISO-8859-8", "ISO-8859-15", "ISO_8859-1", "CYRILLIC", "ISO_8859-6", "LATIN-9", "ISO_8859-3", "ISO_8859-11", "ISO_8859-2", "ISO_8859-16", "ISO_8859-5", "ISO_8859-13", "ISO8859-9", "ISO_8859-16:2001", "ISO_8859-8", "ISO_8859-15", "CP154", "ISO-IR-6", "CP949", "ISO646-CN", "ASCII", "ISO_8859-15:1998", "CP1254", "ISO-8859-9", "ISO-IR-166", "ISO-IR-126", "ISO-IR-226", "ISO-IR-165", "X0212", "ISO-IR-58", "UHC", "EUCCN", "ISO-IR-138", "ISO_8859-9", "L10", "SJIS", "850", "MAC", "TACTIS", "L7", "EUC-CN", "LATIN4", "CP850", "CP1250", "KOI8-T", "ISO-2022-CN", "ISO-IR-159", "ISO-CELTIC", "ISO_8859-14:1998", "IBM866", "CP950", "IBM862", "ISO-2022-CN-EXT", "ISO8859-4", "CSASCII", "US", "MS936", "ISO8859-14", "ISO-IR-199", "BIG5", "ISO_8859-10:1992", "KSC5601", "PT154", "ISO-IR-148", "ISO-8859-4", "GBK", "CSISO2022CN", "CSBIG5", "ISO-IR-101", "ISO-8859-14", "LATIN10", "BIG-5", "X0201", "ISO-IR-203", "DECHANZI", "ELOT_928", "ISO_8859-4", "IBM819", "CSGB2312", "CN-BIG5", "UCS-2", "ISO_8859-14", "X0208", "KSC_5601", "ISO-IR-149", "ISO8859-10", "RK1048", "ISO-IR-14", "TCVN", "TIS620", "GB_2312-80", "VISCII", "ISO-8859-10", "ISO-IR-109", "CSISOLATIN1", "CSISOLATIN6", "TIS-620", "CSISOLATIN3", "CSVISCII", "CSISOLATIN2", "CSISOLATINCYRILLIC", "CSISOLATIN5", "GB18030", "ISO_8859-10", "CSKZ1048", "GB_1988-80", "KZ-1048", "MS-CYRL", "CHAR", "CSKOI8R", "ISO-IR-110", "KOI8-R", "MACCYRILLIC", "IBM-CP1133", "PTCP154", "CP874", "UTF-16", "ISO-IR-144", "UTF-8", "UTF-32", "KS_C_5601-1989", "HZ-GB-2312", "TIS620.2533-1", "CSUNICODE11", "UNICODE-1-1", "CSPTCP154", "CSUCS4", "CYRILLIC-ASIAN", "UCS-4", "TIS620.2529-1", "IBM850", "TIS620-0", "ISO-IR-179", "CP367", "ISO646-US", "ISO-10646-UCS-2", "CP1257", "GREEK8", "US-ASCII", "ISO-IR-100", "CSISOLATIN4", "CSISOLATINGREEK", "CSIBM866", "CSISO58GB231280", "EUCKR", "MS-ANSI", "MACTHAI", "CN-GB", "CSISOLATINARABIC", "CN-GB-ISOIR165", "ARMSCII-8", "MACINTOSH", "LATIN7", "TIS620.2533-0", "EUC-KR", "VISCII1.1-1", "JP", "ROMAN8", "ISO-2022-KR", "ISO-10646-UCS-4", "ISO8859-7", "CHINESE", "GEORGIAN-ACADEMY", "CSUNICODE", "WINDOWS-1251", "WINDOWS-1256", "WINDOWS-1253", "WINDOWS-1252", "WINDOWS-1255", "WINDOWS-1258", "ISO-8859-7", "KOI8-U", "CSPC862LATINHEBREW", "EUCTW", "ARABIC", "CSISO2022KR", "WINDOWS-936", "GREEK", "MULELAO-1", "ECMA-118", "TCVN-5712", "ISO_8859-7", "TCVN5712-1", "ISO_8859-3:1988", "EUC-TW", "ISO_8859-5:1988", "MACICELAND", "ISO_8859-8:1988", "KS_C_5601-1987", "KOREAN", "UCS-2LE", "CSISOLATINHEBREW", "CSKSC56011987", "UNICODELITTLE", "GEORGIAN-PS", "ISO-IR-57", "ISO-IR-87", "JIS_C6226-1983", "ISO-IR-127", "ISO-IR-157", "DECKOREAN", "WINDOWS-1254", "CSISO57GB1988", "ISO_8859-9:1989", "HP-ROMAN8", "CSUNICODE11UTF7", "WCHAR_T", "UNICODEBIG", "WINDOWS-1250", "UNICODE-1-1-UTF-7", "UCS-2-INTERNAL", "ISO_646.IRV:1991", "ISO_8859-4:1988", "STRK1048-2002", "MS-EE", "UCS-4LE", "IBM367", "KOI8-RU", "CSMACINTOSH", "BIG5HKSCS", "NEXTSTEP", "UTF-16LE", "CSISO14JISC6220RO", "UTF-32LE", "CSEUCKR", "ECMA-114", "BIG5-HKSCS", "ANSI_X3.4-1986", "JIS_C6220-1969-RO", "ANSI_X3.4-1968", "UCS-4-INTERNAL", "CSPC850MULTILINGUAL", "ISO-2022-JP-1", "CSHPROMAN8", "ISO-2022-JP-2", "JIS0208", "ASMO-708", "MACROMAN", "MACCROATIAN", "CSISO159JISX02121990", "ISO646-JP", "WINDOWS-1257", "CSISO2022JP2", "CSEUCTW", "EUCJP", "ISO_8859-1:1987", "ISO_8859-6:1987", "ISO_8859-7:2003", "ISO_8859-2:1987", "EUC-JP", "UTF-7", "UCS-2BE", "ISO-2022-JP", "MS-TURK", "JIS_X0212", "CSISO2022JP", "SHIFT-JIS", "SHIFT_JIS", "UCS-4BE", "MS-HEBR", "MACARABIC", "MACGREEK", "WINDOWS-874", "CSHALFWIDTHKATAKANA", "MS-GREEK", "UTF-16BE", "MACTURKISH", "UTF-32BE", "CSSHIFTJIS", "JIS_X0201", "HEBREW", "JIS_X0208", "BIGFIVE", "JISX0201-1976", "UCS-2-SWAPPED", "JIS_X0212-1990", "BIG-FIVE", "JIS_X0208-1983", "EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE", "SDECKANJI", "JAVA", "ISO_8859-7:1987", "TCVN5712-1:1993", "MS_KANJI", "MACCENTRALEUROPE", "CSISO87JISX0208", "UCS-4-SWAPPED", "MACROMANIA", "BIG5-HKSCS:2001", "JIS_X0208-1990", "BIG5-HKSCS:2008", "BIG5-HKSCS:1999", "JIS_X0212.1990-0", "MS-ARAB", "JOHAB", "BIG5-HKSCS:2004", "MACUKRAINE", "CSEUCPKDFMTJAPANESE", "WINBALTRIM", "MACHEBREW" }; #define stringpool ((const char *) &stringpool_contents) static const struct alias aliases[] = { {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 60 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str13, ei_iso8859_1}, #line 134 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str14, ei_iso8859_10}, #line 76 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str15, ei_iso8859_3}, #line 68 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str16, ei_iso8859_2}, #line 126 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str17, ei_iso8859_9}, {-1}, #line 151 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str19, ei_iso8859_14}, {-1}, {-1}, {-1}, #line 207 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str23, ei_cp866}, #line 289 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str24, ei_iso646_cn}, {-1}, {-1}, #line 203 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str27, ei_cp862}, {-1}, {-1}, {-1}, {-1}, #line 209 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str32, ei_cp1131}, #line 359 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str33, ei_johab}, #line 205 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str34, ei_cp866}, {-1}, #line 244 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str36, ei_cp1133}, #line 174 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str37, ei_cp1251}, #line 201 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str38, ei_cp862}, #line 189 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str39, ei_cp1256}, {-1}, #line 180 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str41, ei_cp1253}, {-1}, #line 177 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str43, ei_cp1252}, {-1}, #line 186 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str45, ei_cp1255}, {-1}, {-1}, #line 326 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str48, ei_cp936}, #line 195 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str49, ei_cp1258}, #line 321 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str50, ei_euc_cn}, {-1}, #line 313 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str52, ei_cp932}, #line 51 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str53, ei_c99}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 333 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str60, ei_hz}, {-1}, {-1}, {-1}, #line 84 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str64, ei_iso8859_4}, {-1}, {-1}, {-1}, #line 59 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str68, ei_iso8859_1}, #line 57 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str69, ei_iso8859_1}, #line 133 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str70, ei_iso8859_10}, {-1}, #line 75 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str72, ei_iso8859_3}, {-1}, #line 67 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str74, ei_iso8859_2}, {-1}, #line 125 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str76, ei_iso8859_9}, {-1}, {-1}, {-1}, #line 150 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str80, ei_iso8859_14}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 227 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str88, ei_hp_roman8}, #line 62 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str89, ei_iso8859_1}, {-1}, #line 102 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str91, ei_iso8859_6}, {-1}, #line 78 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str93, ei_iso8859_3}, #line 139 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str94, ei_iso8859_11}, #line 70 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str95, ei_iso8859_2}, #line 166 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str96, ei_iso8859_16}, #line 93 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str97, ei_iso8859_5}, #line 145 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str98, ei_iso8859_13}, {-1}, {-1}, #line 120 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str101, ei_iso8859_8}, #line 159 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str102, ei_iso8859_15}, #line 53 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str103, ei_iso8859_1}, {-1}, #line 94 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str105, ei_iso8859_6}, {-1}, #line 71 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str107, ei_iso8859_3}, #line 137 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str108, ei_iso8859_11}, #line 63 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str109, ei_iso8859_2}, #line 160 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str110, ei_iso8859_16}, #line 87 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str111, ei_iso8859_5}, #line 140 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str112, ei_iso8859_13}, {-1}, {-1}, #line 114 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str115, ei_iso8859_8}, #line 154 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str116, ei_iso8859_15}, #line 54 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str117, ei_iso8859_1}, #line 91 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str118, ei_iso8859_5}, #line 95 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str119, ei_iso8859_6}, #line 158 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str120, ei_iso8859_15}, #line 72 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str121, ei_iso8859_3}, #line 138 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str122, ei_iso8859_11}, #line 64 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str123, ei_iso8859_2}, #line 161 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str124, ei_iso8859_16}, #line 88 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str125, ei_iso8859_5}, #line 141 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str126, ei_iso8859_13}, #line 128 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str127, ei_iso8859_9}, #line 162 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str128, ei_iso8859_16}, #line 115 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str129, ei_iso8859_8}, #line 155 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str130, ei_iso8859_15}, #line 236 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str131, ei_pt154}, #line 16 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str132, ei_ascii}, #line 355 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str133, ei_cp949}, {-1}, #line 287 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str135, ei_iso646_cn}, #line 13 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str136, ei_ascii}, #line 156 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str137, ei_iso8859_15}, {-1}, #line 183 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str139, ei_cp1254}, {-1}, #line 121 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str141, ei_iso8859_9}, {-1}, #line 252 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str143, ei_tis620}, {-1}, #line 107 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str145, ei_iso8859_7}, {-1}, {-1}, #line 163 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str148, ei_iso8859_16}, #line 295 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str149, ei_isoir165}, #line 283 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str150, ei_jisx0212}, #line 292 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str151, ei_gb2312}, #line 356 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str152, ei_cp949}, #line 320 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str153, ei_euc_cn}, #line 117 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str154, ei_iso8859_8}, #line 122 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str155, ei_iso8859_9}, #line 165 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str156, ei_iso8859_16}, {-1}, #line 310 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str158, ei_sjis}, #line 199 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str159, ei_cp850}, {-1}, #line 212 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str161, ei_mac_roman}, {-1}, {-1}, #line 253 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str164, ei_tis620}, #line 144 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str165, ei_iso8859_13}, {-1}, #line 319 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str167, ei_euc_cn}, {-1}, {-1}, #line 83 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str170, ei_iso8859_4}, {-1}, {-1}, #line 197 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str173, ei_cp850}, {-1}, #line 171 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str175, ei_cp1250}, {-1}, {-1}, #line 233 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str178, ei_koi8_t}, #line 330 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str179, ei_iso2022_cn}, {-1}, {-1}, #line 284 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str182, ei_jisx0212}, #line 152 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str183, ei_iso8859_14}, #line 148 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str184, ei_iso8859_14}, #line 206 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str185, ei_cp866}, #line 344 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str186, ei_cp950}, {-1}, {-1}, #line 202 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str189, ei_cp862}, #line 332 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str190, ei_iso2022_cn_ext}, #line 86 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str191, ei_iso8859_4}, #line 22 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str192, ei_ascii}, #line 21 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str193, ei_ascii}, #line 327 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str194, ei_cp936}, {-1}, #line 153 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str196, ei_iso8859_14}, #line 149 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str197, ei_iso8859_14}, #line 338 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str198, ei_ces_big5}, #line 131 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str199, ei_iso8859_10}, #line 357 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str200, ei_cp949}, {-1}, #line 234 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str202, ei_pt154}, #line 124 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str203, ei_iso8859_9}, {-1}, #line 79 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str205, ei_iso8859_4}, #line 325 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str206, ei_ces_gbk}, #line 331 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str207, ei_iso2022_cn}, #line 343 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str208, ei_ces_big5}, #line 66 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str209, ei_iso8859_2}, #line 146 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str210, ei_iso8859_14}, #line 164 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str211, ei_iso8859_16}, #line 339 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str212, ei_ces_big5}, #line 270 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str213, ei_jisx0201}, {-1}, {-1}, #line 157 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str216, ei_iso8859_15}, #line 324 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str217, ei_euc_cn}, #line 109 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str218, ei_iso8859_7}, #line 80 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str219, ei_iso8859_4}, #line 58 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str220, ei_iso8859_1}, #line 323 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str221, ei_euc_cn}, #line 342 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str222, ei_ces_big5}, #line 24 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str223, ei_ucs2}, #line 147 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str224, ei_iso8859_14}, #line 276 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str225, ei_jisx0208}, {-1}, {-1}, #line 297 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str228, ei_ksc5601}, #line 300 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str229, ei_ksc5601}, {-1}, {-1}, #line 136 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str232, ei_iso8859_10}, {-1}, #line 239 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str234, ei_rk1048}, {-1}, {-1}, #line 265 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str237, ei_iso646_jp}, #line 259 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str238, ei_tcvn}, #line 247 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str239, ei_tis620}, {-1}, {-1}, {-1}, #line 291 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str243, ei_gb2312}, {-1}, #line 256 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str245, ei_viscii}, #line 129 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str246, ei_iso8859_10}, #line 74 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str247, ei_iso8859_3}, {-1}, {-1}, #line 61 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str250, ei_iso8859_1}, {-1}, #line 135 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str252, ei_iso8859_10}, #line 246 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str253, ei_tis620}, #line 77 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str254, ei_iso8859_3}, #line 258 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str255, ei_viscii}, #line 69 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str256, ei_iso8859_2}, #line 92 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str257, ei_iso8859_5}, #line 127 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str258, ei_iso8859_9}, #line 329 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str259, ei_gb18030}, #line 130 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str260, ei_iso8859_10}, {-1}, {-1}, {-1}, #line 242 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str264, ei_rk1048}, {-1}, #line 286 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str266, ei_iso646_cn}, #line 241 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str267, ei_rk1048}, {-1}, {-1}, #line 176 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str270, ei_cp1251}, {-1}, {-1}, {-1}, {-1}, #line 362 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str275, ei_local_char}, #line 168 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str276, ei_koi8_r}, {-1}, #line 82 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str278, ei_iso8859_4}, {-1}, #line 167 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str280, ei_koi8_r}, #line 218 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str281, ei_mac_cyrillic}, #line 245 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str282, ei_cp1133}, #line 235 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str283, ei_pt154}, {-1}, #line 254 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str285, ei_cp874}, {-1}, {-1}, {-1}, #line 38 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str289, ei_utf16}, {-1}, {-1}, {-1}, #line 90 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str293, ei_iso8859_5}, #line 23 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str294, ei_utf8}, #line 41 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str295, ei_utf32}, {-1}, #line 299 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str297, ei_ksc5601}, #line 334 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str298, ei_hz}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 251 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str304, ei_tis620}, {-1}, {-1}, {-1}, #line 30 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str308, ei_ucs2be}, {-1}, {-1}, {-1}, #line 29 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str312, ei_ucs2be}, {-1}, #line 238 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str314, ei_pt154}, #line 35 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str315, ei_ucs4}, #line 237 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str316, ei_pt154}, {-1}, {-1}, #line 33 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str319, ei_ucs4}, {-1}, {-1}, #line 249 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str322, ei_tis620}, {-1}, #line 198 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str324, ei_cp850}, {-1}, {-1}, #line 248 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str327, ei_tis620}, {-1}, {-1}, #line 142 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str330, ei_iso8859_13}, {-1}, #line 19 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str332, ei_ascii}, {-1}, {-1}, {-1}, #line 14 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str336, ei_ascii}, {-1}, {-1}, #line 25 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str339, ei_ucs2}, {-1}, #line 192 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str341, ei_cp1257}, #line 110 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str342, ei_iso8859_7}, #line 12 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str343, ei_ascii}, {-1}, {-1}, {-1}, #line 56 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str347, ei_iso8859_1}, {-1}, {-1}, {-1}, {-1}, #line 85 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str352, ei_iso8859_4}, {-1}, #line 112 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str354, ei_iso8859_7}, {-1}, #line 208 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str356, ei_cp866}, {-1}, {-1}, #line 293 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str359, ei_gb2312}, #line 352 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str360, ei_euc_kr}, #line 179 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str361, ei_cp1252}, #line 224 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str362, ei_mac_thai}, {-1}, {-1}, #line 322 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str365, ei_euc_cn}, #line 101 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str366, ei_iso8859_6}, {-1}, #line 296 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str368, ei_isoir165}, #line 230 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str369, ei_armscii_8}, #line 211 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str370, ei_mac_roman}, {-1}, #line 143 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str372, ei_iso8859_13}, #line 250 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str373, ei_tis620}, #line 351 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str374, ei_euc_kr}, #line 257 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str375, ei_viscii}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 266 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str381, ei_iso646_jp}, {-1}, {-1}, {-1}, #line 226 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str385, ei_hp_roman8}, #line 360 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str386, ei_iso2022_kr}, #line 34 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str387, ei_ucs4}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 113 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str393, ei_iso8859_7}, {-1}, #line 294 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str395, ei_gb2312}, {-1}, #line 231 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str397, ei_georgian_academy}, #line 26 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str398, ei_ucs2}, {-1}, #line 175 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str400, ei_cp1251}, #line 190 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str401, ei_cp1256}, #line 181 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str402, ei_cp1253}, #line 178 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str403, ei_cp1252}, #line 187 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str404, ei_cp1255}, {-1}, #line 196 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str406, ei_cp1258}, #line 103 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str407, ei_iso8859_7}, {-1}, {-1}, #line 169 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str410, ei_koi8_u}, #line 204 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str411, ei_cp862}, #line 336 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str412, ei_euc_tw}, #line 100 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str413, ei_iso8859_6}, #line 361 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str414, ei_iso2022_kr}, #line 328 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str415, ei_cp936}, #line 111 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str416, ei_iso8859_7}, #line 243 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str417, ei_mulelao}, #line 108 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str418, ei_iso8859_7}, {-1}, #line 260 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str420, ei_tcvn}, #line 104 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str421, ei_iso8859_7}, #line 261 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str422, ei_tcvn}, {-1}, {-1}, #line 73 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str425, ei_iso8859_3}, #line 335 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str426, ei_euc_tw}, #line 89 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str427, ei_iso8859_5}, #line 215 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str428, ei_mac_iceland}, #line 116 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str429, ei_iso8859_8}, #line 298 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str430, ei_ksc5601}, {-1}, #line 302 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str432, ei_ksc5601}, #line 31 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str433, ei_ucs2le}, {-1}, {-1}, {-1}, #line 119 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str437, ei_iso8859_8}, {-1}, #line 301 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str439, ei_ksc5601}, {-1}, #line 32 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str441, ei_ucs2le}, #line 232 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str442, ei_georgian_ps}, #line 288 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str443, ei_iso646_cn}, {-1}, #line 277 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str445, ei_jisx0208}, #line 278 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str446, ei_jisx0208}, #line 97 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str447, ei_iso8859_6}, #line 132 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str448, ei_iso8859_10}, #line 354 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str449, ei_euc_kr}, {-1}, #line 184 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str451, ei_cp1254}, {-1}, {-1}, #line 290 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str454, ei_iso646_cn}, #line 123 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str455, ei_iso8859_9}, {-1}, {-1}, #line 225 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str458, ei_hp_roman8}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 46 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str464, ei_utf7}, #line 363 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str465, ei_local_wchar_t}, {-1}, {-1}, #line 28 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str468, ei_ucs2be}, #line 172 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str469, ei_cp1250}, #line 45 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str470, ei_utf7}, {-1}, #line 47 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str472, ei_ucs2internal}, #line 15 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str473, ei_ascii}, #line 81 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str474, ei_iso8859_4}, {-1}, #line 240 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str476, ei_rk1048}, {-1}, {-1}, {-1}, #line 173 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str480, ei_cp1250}, #line 37 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str481, ei_ucs4le}, {-1}, #line 20 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str483, ei_ascii}, {-1}, {-1}, {-1}, #line 170 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str487, ei_koi8_ru}, {-1}, {-1}, {-1}, #line 213 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str491, ei_mac_roman}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 349 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str497, ei_big5hkscs2008}, {-1}, {-1}, #line 229 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str500, ei_nextstep}, #line 40 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str501, ei_utf16le}, {-1}, {-1}, #line 267 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str504, ei_iso646_jp}, #line 43 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str505, ei_utf32le}, {-1}, #line 353 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str507, ei_euc_kr}, #line 98 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str508, ei_iso8859_6}, {-1}, {-1}, #line 348 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str511, ei_big5hkscs2008}, {-1}, #line 18 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str513, ei_ascii}, {-1}, #line 263 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str515, ei_iso646_jp}, {-1}, {-1}, #line 17 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str518, ei_ascii}, {-1}, #line 49 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str520, ei_ucs4internal}, {-1}, {-1}, #line 200 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str523, ei_cp850}, #line 316 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str524, ei_iso2022_jp1}, #line 228 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str525, ei_hp_roman8}, {-1}, #line 317 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str527, ei_iso2022_jp2}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 275 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str534, ei_jisx0208}, {-1}, {-1}, {-1}, {-1}, #line 99 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str539, ei_iso8859_6}, {-1}, {-1}, {-1}, #line 210 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str543, ei_mac_roman}, #line 216 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str544, ei_mac_croatian}, {-1}, {-1}, {-1}, #line 285 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str548, ei_jisx0212}, #line 264 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str549, ei_iso646_jp}, {-1}, {-1}, #line 193 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str552, ei_cp1257}, {-1}, #line 318 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str554, ei_iso2022_jp2}, {-1}, {-1}, {-1}, {-1}, #line 337 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str559, ei_euc_tw}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 304 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str567, ei_euc_jp}, {-1}, #line 55 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str569, ei_iso8859_1}, #line 96 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str570, ei_iso8859_6}, #line 106 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str571, ei_iso8859_7}, #line 65 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str572, ei_iso8859_2}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 303 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str581, ei_euc_jp}, {-1}, {-1}, {-1}, {-1}, #line 44 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str586, ei_utf7}, {-1}, {-1}, {-1}, {-1}, #line 27 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str591, ei_ucs2be}, {-1}, #line 314 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str593, ei_iso2022_jp}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 185 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str602, ei_cp1254}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 280 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str608, ei_jisx0212}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 315 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str621, ei_iso2022_jp}, {-1}, {-1}, #line 309 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str624, ei_sjis}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 308 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str638, ei_sjis}, #line 36 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str639, ei_ucs4be}, {-1}, {-1}, {-1}, {-1}, #line 188 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str644, ei_cp1255}, {-1}, #line 223 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str646, ei_mac_arabic}, {-1}, {-1}, #line 220 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str649, ei_mac_greek}, {-1}, {-1}, #line 255 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str652, ei_cp874}, #line 271 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str653, ei_jisx0201}, {-1}, {-1}, {-1}, {-1}, #line 182 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str658, ei_cp1253}, #line 39 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str659, ei_utf16be}, {-1}, #line 221 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str661, ei_mac_turkish}, {-1}, #line 42 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str663, ei_utf32be}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 312 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str669, ei_sjis}, {-1}, #line 268 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str671, ei_jisx0201}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 118 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str678, ei_iso8859_8}, {-1}, {-1}, {-1}, {-1}, #line 272 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str683, ei_jisx0208}, {-1}, #line 341 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str685, ei_ces_big5}, {-1}, {-1}, {-1}, #line 269 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str689, ei_jisx0201}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 48 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str695, ei_ucs2swapped}, #line 282 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str696, ei_jisx0212}, {-1}, {-1}, #line 340 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str699, ei_ces_big5}, {-1}, #line 273 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str701, ei_jisx0208}, #line 305 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str702, ei_euc_jp}, {-1}, {-1}, {-1}, {-1}, #line 307 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str707, ei_euc_jp}, {-1}, {-1}, {-1}, #line 52 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str711, ei_java}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 105 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str721, ei_iso8859_7}, {-1}, {-1}, #line 262 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str724, ei_tcvn}, #line 311 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str725, ei_sjis}, {-1}, #line 214 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str727, ei_mac_centraleurope}, {-1}, {-1}, {-1}, #line 279 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str731, ei_jisx0208}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 50 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str743, ei_ucs4swapped}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 217 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str761, ei_mac_romania}, {-1}, {-1}, {-1}, #line 346 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str765, ei_big5hkscs2001}, {-1}, {-1}, #line 274 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str768, ei_jisx0208}, {-1}, {-1}, #line 350 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str771, ei_big5hkscs2008}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 345 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str784, ei_big5hkscs1999}, #line 281 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str785, ei_jisx0212}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 191 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str806, ei_cp1256}, #line 358 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str807, ei_johab}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 347 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str816, ei_big5hkscs2004}, {-1}, {-1}, {-1}, {-1}, #line 219 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str821, ei_mac_ukraine}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 306 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str842, ei_euc_jp}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 194 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str857, ei_cp1257}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 222 "lib/aliases_sysosf1.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str939, ei_mac_hebrew} }; #ifdef __GNUC__ __inline #if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ __attribute__ ((__gnu_inline__)) #endif #endif const struct alias * aliases_lookup (register const char *str, register unsigned int len) { if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register int key = aliases_hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) { register int o = aliases[key].name; if (o >= 0) { register const char *s = o + stringpool; if (*str == *s && !strcmp (str + 1, s + 1)) return &aliases[key]; } } } return 0; } freelan-2.0/third-party/source/libiconv-msvc/include/aliases_syssolaris.h000066400000000000000000002227021252300335000270170ustar00rootroot00000000000000/* ANSI-C code produced by gperf version 3.0.4 */ /* Command-line: gperf -m 10 lib/aliases_syssolaris.gperf */ /* Computed positions: -k'1,3-11,$' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ #error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif #line 1 "lib/aliases_syssolaris.gperf" struct alias { int name; unsigned int encoding_index; }; #define TOTAL_KEYWORDS 354 #define MIN_WORD_LENGTH 2 #define MAX_WORD_LENGTH 45 #define MIN_HASH_VALUE 8 #define MAX_HASH_VALUE 1003 /* maximum key range = 996, duplicates = 0 */ #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static unsigned int aliases_hash (register const char *str, register unsigned int len) { static const unsigned short asso_values[] = { 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 2, 112, 1004, 27, 4, 34, 57, 16, 22, 11, 168, 3, 10, 254, 1004, 1004, 1004, 1004, 1004, 1004, 21, 126, 7, 10, 37, 40, 119, 81, 62, 332, 197, 9, 169, 4, 2, 8, 1004, 3, 34, 104, 205, 191, 192, 195, 36, 16, 1004, 1004, 1004, 1004, 3, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004 }; register int hval = len; switch (hval) { default: hval += asso_values[(unsigned char)str[10]]; /*FALLTHROUGH*/ case 10: hval += asso_values[(unsigned char)str[9]]; /*FALLTHROUGH*/ case 9: hval += asso_values[(unsigned char)str[8]]; /*FALLTHROUGH*/ case 8: hval += asso_values[(unsigned char)str[7]]; /*FALLTHROUGH*/ case 7: hval += asso_values[(unsigned char)str[6]]; /*FALLTHROUGH*/ case 6: hval += asso_values[(unsigned char)str[5]]; /*FALLTHROUGH*/ case 5: hval += asso_values[(unsigned char)str[4]]; /*FALLTHROUGH*/ case 4: hval += asso_values[(unsigned char)str[3]]; /*FALLTHROUGH*/ case 3: hval += asso_values[(unsigned char)str[2]]; /*FALLTHROUGH*/ case 2: case 1: hval += asso_values[(unsigned char)str[0]]; break; } return hval + asso_values[(unsigned char)str[len - 1]]; } struct stringpool_t { char stringpool_str8[sizeof("R8")]; char stringpool_str13[sizeof("CN")]; char stringpool_str14[sizeof("L8")]; char stringpool_str15[sizeof("L1")]; char stringpool_str22[sizeof("L6")]; char stringpool_str27[sizeof("L4")]; char stringpool_str28[sizeof("866")]; char stringpool_str30[sizeof("C99")]; char stringpool_str33[sizeof("L5")]; char stringpool_str36[sizeof("646")]; char stringpool_str38[sizeof("CHAR")]; char stringpool_str39[sizeof("CP819")]; char stringpool_str45[sizeof("L2")]; char stringpool_str48[sizeof("CP866")]; char stringpool_str58[sizeof("CP949")]; char stringpool_str60[sizeof("850")]; char stringpool_str61[sizeof("5601")]; char stringpool_str62[sizeof("RK1048")]; char stringpool_str64[sizeof("EUCCN")]; char stringpool_str66[sizeof("L10")]; char stringpool_str67[sizeof("EUC-CN")]; char stringpool_str68[sizeof("L3")]; char stringpool_str70[sizeof("CP154")]; char stringpool_str71[sizeof("PT154")]; char stringpool_str74[sizeof("862")]; char stringpool_str79[sizeof("CP1258")]; char stringpool_str81[sizeof("CP1251")]; char stringpool_str86[sizeof("CP1131")]; char stringpool_str88[sizeof("PTCP154")]; char stringpool_str91[sizeof("CP850")]; char stringpool_str93[sizeof("CP1361")]; char stringpool_str94[sizeof("CP862")]; char stringpool_str95[sizeof("CP1256")]; char stringpool_str98[sizeof("CP950")]; char stringpool_str99[sizeof("HZ")]; char stringpool_str101[sizeof("CP936")]; char stringpool_str105[sizeof("CP1254")]; char stringpool_str117[sizeof("CP1255")]; char stringpool_str119[sizeof("ISO8859-8")]; char stringpool_str121[sizeof("ISO8859-1")]; char stringpool_str122[sizeof("ISO-8859-8")]; char stringpool_str123[sizeof("ISO_8859-8")]; char stringpool_str124[sizeof("ISO-8859-1")]; char stringpool_str125[sizeof("ISO_8859-1")]; char stringpool_str126[sizeof("ISO8859-11")]; char stringpool_str127[sizeof("CP1250")]; char stringpool_str128[sizeof("ISO646-CN")]; char stringpool_str129[sizeof("ISO-8859-11")]; char stringpool_str130[sizeof("ISO_8859-11")]; char stringpool_str133[sizeof("ISO8859-9")]; char stringpool_str135[sizeof("ISO8859-6")]; char stringpool_str136[sizeof("ISO-8859-9")]; char stringpool_str137[sizeof("ISO_8859-9")]; char stringpool_str138[sizeof("ISO-8859-6")]; char stringpool_str139[sizeof("ISO_8859-6")]; char stringpool_str140[sizeof("ISO8859-16")]; char stringpool_str141[sizeof("CP1252")]; char stringpool_str142[sizeof("ISO_8859-16:2001")]; char stringpool_str143[sizeof("ISO-8859-16")]; char stringpool_str144[sizeof("ISO_8859-16")]; char stringpool_str145[sizeof("ISO8859-4")]; char stringpool_str146[sizeof("ISO_8859-14:1998")]; char stringpool_str147[sizeof("CP932")]; char stringpool_str148[sizeof("ISO-8859-4")]; char stringpool_str149[sizeof("ISO_8859-4")]; char stringpool_str150[sizeof("ISO8859-14")]; char stringpool_str152[sizeof("ISO_8859-15:1998")]; char stringpool_str153[sizeof("ISO-8859-14")]; char stringpool_str154[sizeof("ISO_8859-14")]; char stringpool_str157[sizeof("ISO8859-5")]; char stringpool_str160[sizeof("ISO-8859-5")]; char stringpool_str161[sizeof("ISO_8859-5")]; char stringpool_str162[sizeof("ISO8859-15")]; char stringpool_str163[sizeof("ISO-IR-6")]; char stringpool_str165[sizeof("ISO-8859-15")]; char stringpool_str166[sizeof("ISO_8859-15")]; char stringpool_str168[sizeof("SJIS")]; char stringpool_str169[sizeof("ISO-IR-148")]; char stringpool_str170[sizeof("ISO-IR-58")]; char stringpool_str172[sizeof("ISO8859-10")]; char stringpool_str174[sizeof("CYRILLIC")]; char stringpool_str175[sizeof("ISO-8859-10")]; char stringpool_str176[sizeof("ISO_8859-10")]; char stringpool_str177[sizeof("ISO-IR-199")]; char stringpool_str178[sizeof("ISO-IR-14")]; char stringpool_str179[sizeof("L7")]; char stringpool_str180[sizeof("ISO-IR-166")]; char stringpool_str181[sizeof("ISO8859-2")]; char stringpool_str182[sizeof("ISO-IR-101")]; char stringpool_str183[sizeof("ISO-IR-149")]; char stringpool_str184[sizeof("ISO-8859-2")]; char stringpool_str185[sizeof("ISO_8859-2")]; char stringpool_str186[sizeof("MAC")]; char stringpool_str187[sizeof("CP1253")]; char stringpool_str188[sizeof("ISO_8859-10:1992")]; char stringpool_str189[sizeof("ISO-IR-159")]; char stringpool_str191[sizeof("LATIN8")]; char stringpool_str192[sizeof("CP1133")]; char stringpool_str193[sizeof("LATIN1")]; char stringpool_str194[sizeof("ISO-IR-109")]; char stringpool_str195[sizeof("ISO-IR-144")]; char stringpool_str196[sizeof("ANSI-1251")]; char stringpool_str198[sizeof("CNS11643")]; char stringpool_str201[sizeof("CSPTCP154")]; char stringpool_str202[sizeof("ISO-IR-165")]; char stringpool_str203[sizeof("ISO-IR-126")]; char stringpool_str204[sizeof("ELOT_928")]; char stringpool_str205[sizeof("ISO-IR-110")]; char stringpool_str207[sizeof("LATIN6")]; char stringpool_str208[sizeof("LATIN-9")]; char stringpool_str209[sizeof("ROMAN8")]; char stringpool_str210[sizeof("ISO-IR-138")]; char stringpool_str211[sizeof("GB_1988-80")]; char stringpool_str215[sizeof("CP874")]; char stringpool_str217[sizeof("LATIN4")]; char stringpool_str219[sizeof("ASCII")]; char stringpool_str222[sizeof("UHC")]; char stringpool_str223[sizeof("ISO-2022-CN")]; char stringpool_str225[sizeof("CHINESE")]; char stringpool_str227[sizeof("ISO8859-3")]; char stringpool_str228[sizeof("ISO-IR-100")]; char stringpool_str229[sizeof("LATIN5")]; char stringpool_str230[sizeof("ISO-8859-3")]; char stringpool_str231[sizeof("ISO_8859-3")]; char stringpool_str232[sizeof("ISO8859-13")]; char stringpool_str233[sizeof("ISO-IR-226")]; char stringpool_str234[sizeof("CYRILLIC-ASIAN")]; char stringpool_str235[sizeof("ISO-8859-13")]; char stringpool_str236[sizeof("ISO_8859-13")]; char stringpool_str241[sizeof("US")]; char stringpool_str242[sizeof("MS-CYRL")]; char stringpool_str243[sizeof("TIS620")]; char stringpool_str244[sizeof("LATIN10")]; char stringpool_str246[sizeof("TIS-620")]; char stringpool_str250[sizeof("ARABIC")]; char stringpool_str251[sizeof("ECMA-118")]; char stringpool_str252[sizeof("EUCKR")]; char stringpool_str253[sizeof("LATIN2")]; char stringpool_str255[sizeof("EUC-KR")]; char stringpool_str258[sizeof("UTF-8")]; char stringpool_str259[sizeof("KZ-1048")]; char stringpool_str260[sizeof("CSISO2022CN")]; char stringpool_str262[sizeof("CSASCII")]; char stringpool_str263[sizeof("MS936")]; char stringpool_str264[sizeof("IBM819")]; char stringpool_str266[sizeof("MULELAO-1")]; char stringpool_str267[sizeof("X0208")]; char stringpool_str269[sizeof("X0201")]; char stringpool_str271[sizeof("GB18030")]; char stringpool_str272[sizeof("KOREAN")]; char stringpool_str273[sizeof("IBM866")]; char stringpool_str274[sizeof("TIS620-0")]; char stringpool_str276[sizeof("KOI8-R")]; char stringpool_str277[sizeof("ECMA-114")]; char stringpool_str278[sizeof("UCS-4")]; char stringpool_str279[sizeof("UTF-16")]; char stringpool_str281[sizeof("CSKZ1048")]; char stringpool_str283[sizeof("KSC_5601")]; char stringpool_str284[sizeof("CSKOI8R")]; char stringpool_str287[sizeof("MS-EE")]; char stringpool_str288[sizeof("GB2312")]; char stringpool_str291[sizeof("CSUCS4")]; char stringpool_str293[sizeof("BIG5")]; char stringpool_str296[sizeof("BIG-5")]; char stringpool_str297[sizeof("HP-ROMAN8")]; char stringpool_str299[sizeof("LATIN3")]; char stringpool_str304[sizeof("KS_C_5601-1989")]; char stringpool_str306[sizeof("X0212")]; char stringpool_str307[sizeof("TCVN")]; char stringpool_str309[sizeof("ISO-CELTIC")]; char stringpool_str311[sizeof("CSHPROMAN8")]; char stringpool_str314[sizeof("UCS-2")]; char stringpool_str316[sizeof("IBM850")]; char stringpool_str318[sizeof("ISO-IR-203")]; char stringpool_str319[sizeof("IBM862")]; char stringpool_str320[sizeof("GB_2312-80")]; char stringpool_str324[sizeof("CSISOLATIN1")]; char stringpool_str327[sizeof("ISO-2022-CN-EXT")]; char stringpool_str335[sizeof("ISO-IR-179")]; char stringpool_str337[sizeof("CSISOLATINCYRILLIC")]; char stringpool_str338[sizeof("CSISOLATIN6")]; char stringpool_str342[sizeof("JP")]; char stringpool_str346[sizeof("MACICELAND")]; char stringpool_str347[sizeof("UCS-4LE")]; char stringpool_str348[sizeof("CSISOLATIN4")]; char stringpool_str349[sizeof("CSISOLATINARABIC")]; char stringpool_str350[sizeof("UNICODE-1-1")]; char stringpool_str353[sizeof("UTF-16LE")]; char stringpool_str357[sizeof("CSUNICODE11")]; char stringpool_str360[sizeof("CSISOLATIN5")]; char stringpool_str361[sizeof("MS-ANSI")]; char stringpool_str364[sizeof("CSBIG5")]; char stringpool_str365[sizeof("UCS-2LE")]; char stringpool_str367[sizeof("CN-BIG5")]; char stringpool_str372[sizeof("ARMSCII-8")]; char stringpool_str373[sizeof("ISO-10646-UCS-4")]; char stringpool_str378[sizeof("UTF-32")]; char stringpool_str380[sizeof("CSUNICODE")]; char stringpool_str382[sizeof("ISO_8859-8:1988")]; char stringpool_str384[sizeof("CSISOLATIN2")]; char stringpool_str385[sizeof("CN-GB")]; char stringpool_str386[sizeof("ISO646-US")]; char stringpool_str387[sizeof("MACROMAN")]; char stringpool_str389[sizeof("MACCYRILLIC")]; char stringpool_str391[sizeof("ISO-10646-UCS-2")]; char stringpool_str394[sizeof("STRK1048-2002")]; char stringpool_str395[sizeof("ISO_8859-4:1988")]; char stringpool_str396[sizeof("ISO_8859-9:1989")]; char stringpool_str397[sizeof("EUCJP")]; char stringpool_str400[sizeof("EUC-JP")]; char stringpool_str401[sizeof("ISO_8859-5:1988")]; char stringpool_str402[sizeof("GREEK8")]; char stringpool_str403[sizeof("ASMO-708")]; char stringpool_str405[sizeof("PCK")]; char stringpool_str408[sizeof("CSIBM866")]; char stringpool_str409[sizeof("CP1257")]; char stringpool_str411[sizeof("ISO-2022-KR")]; char stringpool_str412[sizeof("GEORGIAN-ACADEMY")]; char stringpool_str415[sizeof("MACCROATIAN")]; char stringpool_str416[sizeof("CP367")]; char stringpool_str419[sizeof("GEORGIAN-PS")]; char stringpool_str423[sizeof("CSGB2312")]; char stringpool_str424[sizeof("VISCII")]; char stringpool_str428[sizeof("MS-HEBR")]; char stringpool_str429[sizeof("UTF-32LE")]; char stringpool_str430[sizeof("CSISOLATIN3")]; char stringpool_str432[sizeof("MACARABIC")]; char stringpool_str436[sizeof("ISO_8859-3:1988")]; char stringpool_str437[sizeof("IBM-CP1133")]; char stringpool_str439[sizeof("TIS620.2529-1")]; char stringpool_str448[sizeof("CSISO2022KR")]; char stringpool_str449[sizeof("ISO8859-7")]; char stringpool_str451[sizeof("MACCENTRALEUROPE")]; char stringpool_str452[sizeof("ISO-8859-7")]; char stringpool_str453[sizeof("ISO_8859-7")]; char stringpool_str455[sizeof("CN-GB-ISOIR165")]; char stringpool_str461[sizeof("ISO646-JP")]; char stringpool_str462[sizeof("KS_C_5601-1987")]; char stringpool_str463[sizeof("US-ASCII")]; char stringpool_str464[sizeof("UCS-4BE")]; char stringpool_str466[sizeof("CSEUCKR")]; char stringpool_str467[sizeof("JIS0208")]; char stringpool_str470[sizeof("UTF-16BE")]; char stringpool_str475[sizeof("MS-ARAB")]; char stringpool_str476[sizeof("CSPC862LATINHEBREW")]; char stringpool_str478[sizeof("KOI8-T")]; char stringpool_str481[sizeof("ISO-IR-87")]; char stringpool_str482[sizeof("UCS-2BE")]; char stringpool_str489[sizeof("MACROMANIA")]; char stringpool_str492[sizeof("UCS-4-INTERNAL")]; char stringpool_str493[sizeof("ISO_646.IRV:1991")]; char stringpool_str495[sizeof("CSVISCII")]; char stringpool_str497[sizeof("VISCII1.1-1")]; char stringpool_str500[sizeof("ISO-IR-57")]; char stringpool_str502[sizeof("NEXTSTEP")]; char stringpool_str503[sizeof("HZ-GB-2312")]; char stringpool_str504[sizeof("CSKSC56011987")]; char stringpool_str505[sizeof("ISO-IR-157")]; char stringpool_str507[sizeof("JIS_C6220-1969-RO")]; char stringpool_str508[sizeof("CSISO58GB231280")]; char stringpool_str509[sizeof("TIS620.2533-1")]; char stringpool_str510[sizeof("UCS-2-INTERNAL")]; char stringpool_str511[sizeof("WINDOWS-1258")]; char stringpool_str512[sizeof("WINDOWS-1251")]; char stringpool_str513[sizeof("MACTHAI")]; char stringpool_str515[sizeof("WCHAR_T")]; char stringpool_str516[sizeof("GBK")]; char stringpool_str517[sizeof("ISO-IR-127")]; char stringpool_str519[sizeof("WINDOWS-1256")]; char stringpool_str520[sizeof("UNICODE-1-1-UTF-7")]; char stringpool_str521[sizeof("LATIN7")]; char stringpool_str523[sizeof("ANSI_X3.4-1968")]; char stringpool_str524[sizeof("WINDOWS-1254")]; char stringpool_str525[sizeof("CSUNICODE11UTF7")]; char stringpool_str530[sizeof("WINDOWS-1255")]; char stringpool_str531[sizeof("ANSI_X3.4-1986")]; char stringpool_str532[sizeof("TIS620.2533-0")]; char stringpool_str533[sizeof("EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE")]; char stringpool_str535[sizeof("WINDOWS-1250")]; char stringpool_str536[sizeof("WINDOWS-936")]; char stringpool_str537[sizeof("EUCTW")]; char stringpool_str540[sizeof("EUC-TW")]; char stringpool_str542[sizeof("WINDOWS-1252")]; char stringpool_str543[sizeof("JIS_C6226-1983")]; char stringpool_str545[sizeof("UCS-4-SWAPPED")]; char stringpool_str546[sizeof("UTF-32BE")]; char stringpool_str547[sizeof("TCVN5712-1")]; char stringpool_str548[sizeof("ISO_8859-1:1987")]; char stringpool_str553[sizeof("MACINTOSH")]; char stringpool_str554[sizeof("ISO-2022-JP-1")]; char stringpool_str555[sizeof("ISO_8859-6:1987")]; char stringpool_str556[sizeof("ISO-2022-JP")]; char stringpool_str560[sizeof("TIS620.2533")]; char stringpool_str563[sizeof("UCS-2-SWAPPED")]; char stringpool_str565[sizeof("WINDOWS-1253")]; char stringpool_str569[sizeof("JAVA")]; char stringpool_str570[sizeof("CSISO57GB1988")]; char stringpool_str572[sizeof("TCVN-5712")]; char stringpool_str578[sizeof("ISO_8859-2:1987")]; char stringpool_str579[sizeof("CSISO14JISC6220RO")]; char stringpool_str583[sizeof("CSMACINTOSH")]; char stringpool_str584[sizeof("ISO-2022-JP-2")]; char stringpool_str588[sizeof("UTF-7")]; char stringpool_str589[sizeof("CSPC850MULTILINGUAL")]; char stringpool_str592[sizeof("GREEK")]; char stringpool_str593[sizeof("CSISO2022JP")]; char stringpool_str594[sizeof("CSISOLATINHEBREW")]; char stringpool_str601[sizeof("ISO_8859-7:2003")]; char stringpool_str616[sizeof("CSISO159JISX02121990")]; char stringpool_str619[sizeof("BIGFIVE")]; char stringpool_str620[sizeof("CSISO2022JP2")]; char stringpool_str622[sizeof("BIG-FIVE")]; char stringpool_str636[sizeof("CSISOLATINGREEK")]; char stringpool_str637[sizeof("HEBREW")]; char stringpool_str641[sizeof("IBM367")]; char stringpool_str647[sizeof("CSHALFWIDTHKATAKANA")]; char stringpool_str650[sizeof("WINDOWS-874")]; char stringpool_str652[sizeof("UNICODELITTLE")]; char stringpool_str663[sizeof("BIG5HKSCS")]; char stringpool_str666[sizeof("BIG5-HKSCS")]; char stringpool_str667[sizeof("JIS_X0208")]; char stringpool_str669[sizeof("JIS_X0201")]; char stringpool_str676[sizeof("WINDOWS-1257")]; char stringpool_str680[sizeof("KOI8-U")]; char stringpool_str684[sizeof("KOI8-RU")]; char stringpool_str691[sizeof("JOHAB")]; char stringpool_str693[sizeof("JISX0201-1976")]; char stringpool_str702[sizeof("JIS_X0208-1990")]; char stringpool_str706[sizeof("JIS_X0212")]; char stringpool_str710[sizeof("JIS_X0212-1990")]; char stringpool_str712[sizeof("ISO_8859-7:1987")]; char stringpool_str713[sizeof("SHIFT-JIS")]; char stringpool_str714[sizeof("SHIFT_JIS")]; char stringpool_str732[sizeof("JIS_X0208-1983")]; char stringpool_str751[sizeof("CSEUCTW")]; char stringpool_str752[sizeof("MACUKRAINE")]; char stringpool_str759[sizeof("UNICODEBIG")]; char stringpool_str769[sizeof("MS-GREEK")]; char stringpool_str774[sizeof("MACGREEK")]; char stringpool_str800[sizeof("CSSHIFTJIS")]; char stringpool_str822[sizeof("JIS_X0212.1990-0")]; char stringpool_str840[sizeof("CSEUCPKDFMTJAPANESE")]; char stringpool_str853[sizeof("MACHEBREW")]; char stringpool_str858[sizeof("MS_KANJI")]; char stringpool_str859[sizeof("TCVN5712-1:1993")]; char stringpool_str869[sizeof("WINBALTRIM")]; char stringpool_str884[sizeof("MS-TURK")]; char stringpool_str894[sizeof("BIG5-HKSCS:2008")]; char stringpool_str895[sizeof("BIG5-HKSCS:2001")]; char stringpool_str901[sizeof("BIG5-HKSCS:1999")]; char stringpool_str907[sizeof("BIG5-HKSCS:2004")]; char stringpool_str917[sizeof("CSISO87JISX0208")]; char stringpool_str953[sizeof("MACTURKISH")]; char stringpool_str1003[sizeof("KO_KR.JOHAP92")]; }; static const struct stringpool_t stringpool_contents = { "R8", "CN", "L8", "L1", "L6", "L4", "866", "C99", "L5", "646", "CHAR", "CP819", "L2", "CP866", "CP949", "850", "5601", "RK1048", "EUCCN", "L10", "EUC-CN", "L3", "CP154", "PT154", "862", "CP1258", "CP1251", "CP1131", "PTCP154", "CP850", "CP1361", "CP862", "CP1256", "CP950", "HZ", "CP936", "CP1254", "CP1255", "ISO8859-8", "ISO8859-1", "ISO-8859-8", "ISO_8859-8", "ISO-8859-1", "ISO_8859-1", "ISO8859-11", "CP1250", "ISO646-CN", "ISO-8859-11", "ISO_8859-11", "ISO8859-9", "ISO8859-6", "ISO-8859-9", "ISO_8859-9", "ISO-8859-6", "ISO_8859-6", "ISO8859-16", "CP1252", "ISO_8859-16:2001", "ISO-8859-16", "ISO_8859-16", "ISO8859-4", "ISO_8859-14:1998", "CP932", "ISO-8859-4", "ISO_8859-4", "ISO8859-14", "ISO_8859-15:1998", "ISO-8859-14", "ISO_8859-14", "ISO8859-5", "ISO-8859-5", "ISO_8859-5", "ISO8859-15", "ISO-IR-6", "ISO-8859-15", "ISO_8859-15", "SJIS", "ISO-IR-148", "ISO-IR-58", "ISO8859-10", "CYRILLIC", "ISO-8859-10", "ISO_8859-10", "ISO-IR-199", "ISO-IR-14", "L7", "ISO-IR-166", "ISO8859-2", "ISO-IR-101", "ISO-IR-149", "ISO-8859-2", "ISO_8859-2", "MAC", "CP1253", "ISO_8859-10:1992", "ISO-IR-159", "LATIN8", "CP1133", "LATIN1", "ISO-IR-109", "ISO-IR-144", "ANSI-1251", "CNS11643", "CSPTCP154", "ISO-IR-165", "ISO-IR-126", "ELOT_928", "ISO-IR-110", "LATIN6", "LATIN-9", "ROMAN8", "ISO-IR-138", "GB_1988-80", "CP874", "LATIN4", "ASCII", "UHC", "ISO-2022-CN", "CHINESE", "ISO8859-3", "ISO-IR-100", "LATIN5", "ISO-8859-3", "ISO_8859-3", "ISO8859-13", "ISO-IR-226", "CYRILLIC-ASIAN", "ISO-8859-13", "ISO_8859-13", "US", "MS-CYRL", "TIS620", "LATIN10", "TIS-620", "ARABIC", "ECMA-118", "EUCKR", "LATIN2", "EUC-KR", "UTF-8", "KZ-1048", "CSISO2022CN", "CSASCII", "MS936", "IBM819", "MULELAO-1", "X0208", "X0201", "GB18030", "KOREAN", "IBM866", "TIS620-0", "KOI8-R", "ECMA-114", "UCS-4", "UTF-16", "CSKZ1048", "KSC_5601", "CSKOI8R", "MS-EE", "GB2312", "CSUCS4", "BIG5", "BIG-5", "HP-ROMAN8", "LATIN3", "KS_C_5601-1989", "X0212", "TCVN", "ISO-CELTIC", "CSHPROMAN8", "UCS-2", "IBM850", "ISO-IR-203", "IBM862", "GB_2312-80", "CSISOLATIN1", "ISO-2022-CN-EXT", "ISO-IR-179", "CSISOLATINCYRILLIC", "CSISOLATIN6", "JP", "MACICELAND", "UCS-4LE", "CSISOLATIN4", "CSISOLATINARABIC", "UNICODE-1-1", "UTF-16LE", "CSUNICODE11", "CSISOLATIN5", "MS-ANSI", "CSBIG5", "UCS-2LE", "CN-BIG5", "ARMSCII-8", "ISO-10646-UCS-4", "UTF-32", "CSUNICODE", "ISO_8859-8:1988", "CSISOLATIN2", "CN-GB", "ISO646-US", "MACROMAN", "MACCYRILLIC", "ISO-10646-UCS-2", "STRK1048-2002", "ISO_8859-4:1988", "ISO_8859-9:1989", "EUCJP", "EUC-JP", "ISO_8859-5:1988", "GREEK8", "ASMO-708", "PCK", "CSIBM866", "CP1257", "ISO-2022-KR", "GEORGIAN-ACADEMY", "MACCROATIAN", "CP367", "GEORGIAN-PS", "CSGB2312", "VISCII", "MS-HEBR", "UTF-32LE", "CSISOLATIN3", "MACARABIC", "ISO_8859-3:1988", "IBM-CP1133", "TIS620.2529-1", "CSISO2022KR", "ISO8859-7", "MACCENTRALEUROPE", "ISO-8859-7", "ISO_8859-7", "CN-GB-ISOIR165", "ISO646-JP", "KS_C_5601-1987", "US-ASCII", "UCS-4BE", "CSEUCKR", "JIS0208", "UTF-16BE", "MS-ARAB", "CSPC862LATINHEBREW", "KOI8-T", "ISO-IR-87", "UCS-2BE", "MACROMANIA", "UCS-4-INTERNAL", "ISO_646.IRV:1991", "CSVISCII", "VISCII1.1-1", "ISO-IR-57", "NEXTSTEP", "HZ-GB-2312", "CSKSC56011987", "ISO-IR-157", "JIS_C6220-1969-RO", "CSISO58GB231280", "TIS620.2533-1", "UCS-2-INTERNAL", "WINDOWS-1258", "WINDOWS-1251", "MACTHAI", "WCHAR_T", "GBK", "ISO-IR-127", "WINDOWS-1256", "UNICODE-1-1-UTF-7", "LATIN7", "ANSI_X3.4-1968", "WINDOWS-1254", "CSUNICODE11UTF7", "WINDOWS-1255", "ANSI_X3.4-1986", "TIS620.2533-0", "EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE", "WINDOWS-1250", "WINDOWS-936", "EUCTW", "EUC-TW", "WINDOWS-1252", "JIS_C6226-1983", "UCS-4-SWAPPED", "UTF-32BE", "TCVN5712-1", "ISO_8859-1:1987", "MACINTOSH", "ISO-2022-JP-1", "ISO_8859-6:1987", "ISO-2022-JP", "TIS620.2533", "UCS-2-SWAPPED", "WINDOWS-1253", "JAVA", "CSISO57GB1988", "TCVN-5712", "ISO_8859-2:1987", "CSISO14JISC6220RO", "CSMACINTOSH", "ISO-2022-JP-2", "UTF-7", "CSPC850MULTILINGUAL", "GREEK", "CSISO2022JP", "CSISOLATINHEBREW", "ISO_8859-7:2003", "CSISO159JISX02121990", "BIGFIVE", "CSISO2022JP2", "BIG-FIVE", "CSISOLATINGREEK", "HEBREW", "IBM367", "CSHALFWIDTHKATAKANA", "WINDOWS-874", "UNICODELITTLE", "BIG5HKSCS", "BIG5-HKSCS", "JIS_X0208", "JIS_X0201", "WINDOWS-1257", "KOI8-U", "KOI8-RU", "JOHAB", "JISX0201-1976", "JIS_X0208-1990", "JIS_X0212", "JIS_X0212-1990", "ISO_8859-7:1987", "SHIFT-JIS", "SHIFT_JIS", "JIS_X0208-1983", "CSEUCTW", "MACUKRAINE", "UNICODEBIG", "MS-GREEK", "MACGREEK", "CSSHIFTJIS", "JIS_X0212.1990-0", "CSEUCPKDFMTJAPANESE", "MACHEBREW", "MS_KANJI", "TCVN5712-1:1993", "WINBALTRIM", "MS-TURK", "BIG5-HKSCS:2008", "BIG5-HKSCS:2001", "BIG5-HKSCS:1999", "BIG5-HKSCS:2004", "CSISO87JISX0208", "MACTURKISH", "KO_KR.JOHAP92" }; #define stringpool ((const char *) &stringpool_contents) static const struct alias aliases[] = { {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 229 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str8, ei_hp_roman8}, {-1}, {-1}, {-1}, {-1}, #line 291 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str13, ei_iso646_cn}, #line 152 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str14, ei_iso8859_14}, #line 61 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str15, ei_iso8859_1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 135 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str22, ei_iso8859_10}, {-1}, {-1}, {-1}, {-1}, #line 85 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str27, ei_iso8859_4}, #line 209 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str28, ei_cp866}, {-1}, #line 52 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str30, ei_c99}, {-1}, {-1}, #line 127 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str33, ei_iso8859_9}, {-1}, {-1}, #line 23 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str36, ei_ascii}, {-1}, #line 364 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str38, ei_local_char}, #line 58 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str39, ei_iso8859_1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 69 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str45, ei_iso8859_2}, {-1}, {-1}, #line 207 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str48, ei_cp866}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 357 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str58, ei_cp949}, {-1}, #line 201 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str60, ei_cp850}, #line 356 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str61, ei_euc_kr}, #line 241 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str62, ei_rk1048}, {-1}, #line 322 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str64, ei_euc_cn}, {-1}, #line 166 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str66, ei_iso8859_16}, #line 321 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str67, ei_euc_cn}, #line 77 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str68, ei_iso8859_3}, {-1}, #line 238 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str70, ei_pt154}, #line 236 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str71, ei_pt154}, {-1}, {-1}, #line 205 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str74, ei_cp862}, {-1}, {-1}, {-1}, {-1}, #line 197 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str79, ei_cp1258}, {-1}, #line 175 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str81, ei_cp1251}, {-1}, {-1}, {-1}, {-1}, #line 211 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str86, ei_cp1131}, {-1}, #line 237 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str88, ei_pt154}, {-1}, {-1}, #line 199 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str91, ei_cp850}, {-1}, #line 360 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str93, ei_johab}, #line 203 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str94, ei_cp862}, #line 191 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str95, ei_cp1256}, {-1}, {-1}, #line 346 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str98, ei_cp950}, #line 334 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str99, ei_hz}, {-1}, #line 327 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str101, ei_cp936}, {-1}, {-1}, {-1}, #line 185 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str105, ei_cp1254}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 188 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str117, ei_cp1255}, {-1}, #line 121 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str119, ei_iso8859_8}, {-1}, #line 63 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str121, ei_iso8859_1}, #line 115 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str122, ei_iso8859_8}, #line 116 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str123, ei_iso8859_8}, #line 54 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str124, ei_iso8859_1}, #line 55 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str125, ei_iso8859_1}, #line 140 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str126, ei_iso8859_11}, #line 172 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str127, ei_cp1250}, #line 289 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str128, ei_iso646_cn}, #line 138 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str129, ei_iso8859_11}, #line 139 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str130, ei_iso8859_11}, {-1}, {-1}, #line 129 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str133, ei_iso8859_9}, {-1}, #line 103 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str135, ei_iso8859_6}, #line 122 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str136, ei_iso8859_9}, #line 123 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str137, ei_iso8859_9}, #line 95 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str138, ei_iso8859_6}, #line 96 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str139, ei_iso8859_6}, #line 167 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str140, ei_iso8859_16}, #line 179 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str141, ei_cp1252}, #line 163 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str142, ei_iso8859_16}, #line 161 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str143, ei_iso8859_16}, #line 162 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str144, ei_iso8859_16}, #line 87 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str145, ei_iso8859_4}, #line 149 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str146, ei_iso8859_14}, #line 315 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str147, ei_cp932}, #line 80 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str148, ei_iso8859_4}, #line 81 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str149, ei_iso8859_4}, #line 154 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str150, ei_iso8859_14}, {-1}, #line 157 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str152, ei_iso8859_15}, #line 147 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str153, ei_iso8859_14}, #line 148 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str154, ei_iso8859_14}, {-1}, {-1}, #line 94 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str157, ei_iso8859_5}, {-1}, {-1}, #line 88 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str160, ei_iso8859_5}, #line 89 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str161, ei_iso8859_5}, #line 160 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str162, ei_iso8859_15}, #line 16 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str163, ei_ascii}, {-1}, #line 155 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str165, ei_iso8859_15}, #line 156 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str166, ei_iso8859_15}, {-1}, #line 311 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str168, ei_sjis}, #line 125 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str169, ei_iso8859_9}, #line 294 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str170, ei_gb2312}, {-1}, #line 137 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str172, ei_iso8859_10}, {-1}, #line 92 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str174, ei_iso8859_5}, #line 130 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str175, ei_iso8859_10}, #line 131 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str176, ei_iso8859_10}, #line 150 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str177, ei_iso8859_14}, #line 267 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str178, ei_iso646_jp}, #line 145 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str179, ei_iso8859_13}, #line 254 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str180, ei_tis620}, #line 71 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str181, ei_iso8859_2}, #line 67 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str182, ei_iso8859_2}, #line 302 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str183, ei_ksc5601}, #line 64 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str184, ei_iso8859_2}, #line 65 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str185, ei_iso8859_2}, #line 214 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str186, ei_mac_roman}, #line 182 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str187, ei_cp1253}, #line 132 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str188, ei_iso8859_10}, #line 286 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str189, ei_jisx0212}, {-1}, #line 151 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str191, ei_iso8859_14}, #line 246 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str192, ei_cp1133}, #line 60 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str193, ei_iso8859_1}, #line 75 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str194, ei_iso8859_3}, #line 91 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str195, ei_iso8859_5}, #line 178 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str196, ei_cp1251}, {-1}, #line 339 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str198, ei_euc_tw}, {-1}, {-1}, #line 240 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str201, ei_pt154}, #line 297 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str202, ei_isoir165}, #line 108 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str203, ei_iso8859_7}, #line 110 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str204, ei_iso8859_7}, #line 83 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str205, ei_iso8859_4}, {-1}, #line 134 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str207, ei_iso8859_10}, #line 159 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str208, ei_iso8859_15}, #line 228 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str209, ei_hp_roman8}, #line 118 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str210, ei_iso8859_8}, #line 288 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str211, ei_iso646_cn}, {-1}, {-1}, {-1}, #line 256 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str215, ei_cp874}, {-1}, #line 84 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str217, ei_iso8859_4}, {-1}, #line 13 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str219, ei_ascii}, {-1}, {-1}, #line 358 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str222, ei_cp949}, #line 331 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str223, ei_iso2022_cn}, {-1}, #line 296 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str225, ei_gb2312}, {-1}, #line 79 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str227, ei_iso8859_3}, #line 57 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str228, ei_iso8859_1}, #line 126 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str229, ei_iso8859_9}, #line 72 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str230, ei_iso8859_3}, #line 73 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str231, ei_iso8859_3}, #line 146 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str232, ei_iso8859_13}, #line 164 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str233, ei_iso8859_16}, #line 239 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str234, ei_pt154}, #line 141 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str235, ei_iso8859_13}, #line 142 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str236, ei_iso8859_13}, {-1}, {-1}, {-1}, {-1}, #line 21 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str241, ei_ascii}, #line 177 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str242, ei_cp1251}, #line 249 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str243, ei_tis620}, #line 165 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str244, ei_iso8859_16}, {-1}, #line 248 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str246, ei_tis620}, {-1}, {-1}, {-1}, #line 101 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str250, ei_iso8859_6}, #line 109 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str251, ei_iso8859_7}, #line 354 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str252, ei_euc_kr}, #line 68 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str253, ei_iso8859_2}, {-1}, #line 353 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str255, ei_euc_kr}, {-1}, {-1}, #line 24 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str258, ei_utf8}, #line 243 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str259, ei_rk1048}, #line 332 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str260, ei_iso2022_cn}, {-1}, #line 22 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str262, ei_ascii}, #line 328 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str263, ei_cp936}, #line 59 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str264, ei_iso8859_1}, {-1}, #line 245 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str266, ei_mulelao}, #line 278 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str267, ei_jisx0208}, {-1}, #line 272 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str269, ei_jisx0201}, {-1}, #line 330 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str271, ei_gb18030}, #line 304 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str272, ei_ksc5601}, #line 208 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str273, ei_cp866}, #line 250 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str274, ei_tis620}, {-1}, #line 168 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str276, ei_koi8_r}, #line 99 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str277, ei_iso8859_6}, #line 34 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str278, ei_ucs4}, #line 39 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str279, ei_utf16}, {-1}, #line 244 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str281, ei_rk1048}, {-1}, #line 299 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str283, ei_ksc5601}, #line 169 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str284, ei_koi8_r}, {-1}, {-1}, #line 174 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str287, ei_cp1250}, #line 323 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str288, ei_euc_cn}, {-1}, {-1}, #line 36 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str291, ei_ucs4}, {-1}, #line 340 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str293, ei_ces_big5}, {-1}, {-1}, #line 341 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str296, ei_ces_big5}, #line 227 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str297, ei_hp_roman8}, {-1}, #line 76 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str299, ei_iso8859_3}, {-1}, {-1}, {-1}, {-1}, #line 301 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str304, ei_ksc5601}, {-1}, #line 285 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str306, ei_jisx0212}, #line 261 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str307, ei_tcvn}, {-1}, #line 153 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str309, ei_iso8859_14}, {-1}, #line 230 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str311, ei_hp_roman8}, {-1}, {-1}, #line 25 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str314, ei_ucs2}, {-1}, #line 200 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str316, ei_cp850}, {-1}, #line 158 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str318, ei_iso8859_15}, #line 204 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str319, ei_cp862}, #line 293 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str320, ei_gb2312}, {-1}, {-1}, {-1}, #line 62 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str324, ei_iso8859_1}, {-1}, {-1}, #line 333 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str327, ei_iso2022_cn_ext}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 143 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str335, ei_iso8859_13}, {-1}, #line 93 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str337, ei_iso8859_5}, #line 136 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str338, ei_iso8859_10}, {-1}, {-1}, {-1}, #line 268 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str342, ei_iso646_jp}, {-1}, {-1}, {-1}, #line 217 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str346, ei_mac_iceland}, #line 38 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str347, ei_ucs4le}, #line 86 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str348, ei_iso8859_4}, #line 102 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str349, ei_iso8859_6}, #line 30 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str350, ei_ucs2be}, {-1}, {-1}, #line 41 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str353, ei_utf16le}, {-1}, {-1}, {-1}, #line 31 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str357, ei_ucs2be}, {-1}, {-1}, #line 128 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str360, ei_iso8859_9}, #line 181 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str361, ei_cp1252}, {-1}, {-1}, #line 345 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str364, ei_ces_big5}, #line 32 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str365, ei_ucs2le}, {-1}, #line 344 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str367, ei_ces_big5}, {-1}, {-1}, {-1}, {-1}, #line 232 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str372, ei_armscii_8}, #line 35 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str373, ei_ucs4}, {-1}, {-1}, {-1}, {-1}, #line 42 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str378, ei_utf32}, {-1}, #line 27 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str380, ei_ucs2}, {-1}, #line 117 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str382, ei_iso8859_8}, {-1}, #line 70 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str384, ei_iso8859_2}, #line 324 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str385, ei_euc_cn}, #line 14 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str386, ei_ascii}, #line 212 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str387, ei_mac_roman}, {-1}, #line 220 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str389, ei_mac_cyrillic}, {-1}, #line 26 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str391, ei_ucs2}, {-1}, {-1}, #line 242 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str394, ei_rk1048}, #line 82 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str395, ei_iso8859_4}, #line 124 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str396, ei_iso8859_9}, #line 306 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str397, ei_euc_jp}, {-1}, {-1}, #line 305 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str400, ei_euc_jp}, #line 90 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str401, ei_iso8859_5}, #line 111 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str402, ei_iso8859_7}, #line 100 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str403, ei_iso8859_6}, {-1}, #line 314 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str405, ei_sjis}, {-1}, {-1}, #line 210 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str408, ei_cp866}, #line 194 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str409, ei_cp1257}, {-1}, #line 362 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str411, ei_iso2022_kr}, #line 233 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str412, ei_georgian_academy}, {-1}, {-1}, #line 218 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str415, ei_mac_croatian}, #line 19 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str416, ei_ascii}, {-1}, {-1}, #line 234 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str419, ei_georgian_ps}, {-1}, {-1}, {-1}, #line 325 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str423, ei_euc_cn}, #line 258 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str424, ei_viscii}, {-1}, {-1}, {-1}, #line 190 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str428, ei_cp1255}, #line 44 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str429, ei_utf32le}, #line 78 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str430, ei_iso8859_3}, {-1}, #line 225 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str432, ei_mac_arabic}, {-1}, {-1}, {-1}, #line 74 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str436, ei_iso8859_3}, #line 247 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str437, ei_cp1133}, {-1}, #line 251 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str439, ei_tis620}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 363 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str448, ei_iso2022_kr}, #line 114 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str449, ei_iso8859_7}, {-1}, #line 216 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str451, ei_mac_centraleurope}, #line 104 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str452, ei_iso8859_7}, #line 105 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str453, ei_iso8859_7}, {-1}, #line 298 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str455, ei_isoir165}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 266 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str461, ei_iso646_jp}, #line 300 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str462, ei_ksc5601}, #line 12 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str463, ei_ascii}, #line 37 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str464, ei_ucs4be}, {-1}, #line 355 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str466, ei_euc_kr}, #line 277 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str467, ei_jisx0208}, {-1}, {-1}, #line 40 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str470, ei_utf16be}, {-1}, {-1}, {-1}, {-1}, #line 193 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str475, ei_cp1256}, #line 206 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str476, ei_cp862}, {-1}, #line 235 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str478, ei_koi8_t}, {-1}, {-1}, #line 279 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str481, ei_jisx0208}, #line 28 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str482, ei_ucs2be}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 219 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str489, ei_mac_romania}, {-1}, {-1}, #line 50 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str492, ei_ucs4internal}, #line 15 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str493, ei_ascii}, {-1}, #line 260 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str495, ei_viscii}, {-1}, #line 259 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str497, ei_viscii}, {-1}, {-1}, #line 290 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str500, ei_iso646_cn}, {-1}, #line 231 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str502, ei_nextstep}, #line 335 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str503, ei_hz}, #line 303 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str504, ei_ksc5601}, #line 133 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str505, ei_iso8859_10}, {-1}, #line 265 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str507, ei_iso646_jp}, #line 295 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str508, ei_gb2312}, #line 253 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str509, ei_tis620}, #line 48 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str510, ei_ucs2internal}, #line 198 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str511, ei_cp1258}, #line 176 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str512, ei_cp1251}, #line 226 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str513, ei_mac_thai}, {-1}, #line 365 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str515, ei_local_wchar_t}, #line 326 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str516, ei_ces_gbk}, #line 98 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str517, ei_iso8859_6}, {-1}, #line 192 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str519, ei_cp1256}, #line 46 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str520, ei_utf7}, #line 144 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str521, ei_iso8859_13}, {-1}, #line 17 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str523, ei_ascii}, #line 186 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str524, ei_cp1254}, #line 47 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str525, ei_utf7}, {-1}, {-1}, {-1}, {-1}, #line 189 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str530, ei_cp1255}, #line 18 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str531, ei_ascii}, #line 252 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str532, ei_tis620}, #line 307 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str533, ei_euc_jp}, {-1}, #line 173 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str535, ei_cp1250}, #line 329 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str536, ei_cp936}, #line 337 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str537, ei_euc_tw}, {-1}, {-1}, #line 336 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str540, ei_euc_tw}, {-1}, #line 180 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str542, ei_cp1252}, #line 280 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str543, ei_jisx0208}, {-1}, #line 51 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str545, ei_ucs4swapped}, #line 43 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str546, ei_utf32be}, #line 263 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str547, ei_tcvn}, #line 56 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str548, ei_iso8859_1}, {-1}, {-1}, {-1}, {-1}, #line 213 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str553, ei_mac_roman}, #line 318 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str554, ei_iso2022_jp1}, #line 97 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str555, ei_iso8859_6}, #line 316 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str556, ei_iso2022_jp}, {-1}, {-1}, {-1}, #line 255 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str560, ei_tis620}, {-1}, {-1}, #line 49 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str563, ei_ucs2swapped}, {-1}, #line 183 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str565, ei_cp1253}, {-1}, {-1}, {-1}, #line 53 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str569, ei_java}, #line 292 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str570, ei_iso646_cn}, {-1}, #line 262 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str572, ei_tcvn}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 66 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str578, ei_iso8859_2}, #line 269 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str579, ei_iso646_jp}, {-1}, {-1}, {-1}, #line 215 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str583, ei_mac_roman}, #line 319 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str584, ei_iso2022_jp2}, {-1}, {-1}, {-1}, #line 45 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str588, ei_utf7}, #line 202 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str589, ei_cp850}, {-1}, {-1}, #line 112 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str592, ei_iso8859_7}, #line 317 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str593, ei_iso2022_jp}, #line 120 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str594, ei_iso8859_8}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 107 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str601, ei_iso8859_7}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 287 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str616, ei_jisx0212}, {-1}, {-1}, #line 343 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str619, ei_ces_big5}, #line 320 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str620, ei_iso2022_jp2}, {-1}, #line 342 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str622, ei_ces_big5}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 113 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str636, ei_iso8859_7}, #line 119 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str637, ei_iso8859_8}, {-1}, {-1}, {-1}, #line 20 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str641, ei_ascii}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 273 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str647, ei_jisx0201}, {-1}, {-1}, #line 257 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str650, ei_cp874}, {-1}, #line 33 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str652, ei_ucs2le}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 351 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str663, ei_big5hkscs2008}, {-1}, {-1}, #line 350 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str666, ei_big5hkscs2008}, #line 274 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str667, ei_jisx0208}, {-1}, #line 270 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str669, ei_jisx0201}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 195 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str676, ei_cp1257}, {-1}, {-1}, {-1}, #line 170 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str680, ei_koi8_u}, {-1}, {-1}, {-1}, #line 171 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str684, ei_koi8_ru}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 359 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str691, ei_johab}, {-1}, #line 271 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str693, ei_jisx0201}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 276 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str702, ei_jisx0208}, {-1}, {-1}, {-1}, #line 282 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str706, ei_jisx0212}, {-1}, {-1}, {-1}, #line 284 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str710, ei_jisx0212}, {-1}, #line 106 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str712, ei_iso8859_7}, #line 310 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str713, ei_sjis}, #line 309 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str714, ei_sjis}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 275 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str732, ei_jisx0208}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 338 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str751, ei_euc_tw}, #line 221 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str752, ei_mac_ukraine}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 29 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str759, ei_ucs2be}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 184 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str769, ei_cp1253}, {-1}, {-1}, {-1}, {-1}, #line 222 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str774, ei_mac_greek}, {-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}, #line 313 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str800, ei_sjis}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 283 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str822, ei_jisx0212}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 308 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str840, ei_euc_jp}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 224 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str853, ei_mac_hebrew}, {-1}, {-1}, {-1}, {-1}, #line 312 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str858, ei_sjis}, #line 264 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str859, ei_tcvn}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 196 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str869, ei_cp1257}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 187 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str884, ei_cp1254}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 352 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str894, ei_big5hkscs2008}, #line 348 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str895, ei_big5hkscs2001}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 347 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str901, ei_big5hkscs1999}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 349 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str907, ei_big5hkscs2004}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 281 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str917, ei_jisx0208}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 223 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str953, ei_mac_turkish}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, #line 361 "lib/aliases_syssolaris.gperf" {(int)(long)&((struct stringpool_t *)0)->stringpool_str1003, ei_johab} }; #ifdef __GNUC__ __inline #if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ __attribute__ ((__gnu_inline__)) #endif #endif const struct alias * aliases_lookup (register const char *str, register unsigned int len) { if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register int key = aliases_hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) { register int o = aliases[key].name; if (o >= 0) { register const char *s = o + stringpool; if (*str == *s && !strcmp (str + 1, s + 1)) return &aliases[key]; } } } return 0; } freelan-2.0/third-party/source/libiconv-msvc/include/armscii_8.h000066400000000000000000000103461252300335000247600ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ARMSCII-8 */ static const unsigned short armscii_8_2uni[96] = { /* 0xa0 */ 0x00a0, 0xfffd, 0x0587, 0x0589, 0x0029, 0x0028, 0x00bb, 0x00ab, 0x2014, 0x002e, 0x055d, 0x002c, 0x002d, 0x058a, 0x2026, 0x055c, /* 0xb0 */ 0x055b, 0x055e, 0x0531, 0x0561, 0x0532, 0x0562, 0x0533, 0x0563, 0x0534, 0x0564, 0x0535, 0x0565, 0x0536, 0x0566, 0x0537, 0x0567, /* 0xc0 */ 0x0538, 0x0568, 0x0539, 0x0569, 0x053a, 0x056a, 0x053b, 0x056b, 0x053c, 0x056c, 0x053d, 0x056d, 0x053e, 0x056e, 0x053f, 0x056f, /* 0xd0 */ 0x0540, 0x0570, 0x0541, 0x0571, 0x0542, 0x0572, 0x0543, 0x0573, 0x0544, 0x0574, 0x0545, 0x0575, 0x0546, 0x0576, 0x0547, 0x0577, /* 0xe0 */ 0x0548, 0x0578, 0x0549, 0x0579, 0x054a, 0x057a, 0x054b, 0x057b, 0x054c, 0x057c, 0x054d, 0x057d, 0x054e, 0x057e, 0x054f, 0x057f, /* 0xf0 */ 0x0550, 0x0580, 0x0551, 0x0581, 0x0552, 0x0582, 0x0553, 0x0583, 0x0554, 0x0584, 0x0555, 0x0585, 0x0556, 0x0586, 0x055a, 0xfffd, }; static int armscii_8_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = armscii_8_2uni[c-0xa0]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char armscii_8_page00[8] = { 0xa5, 0xa4, 0x2a, 0x2b, 0xab, 0xac, 0xa9, 0x2f, /* 0x28-0x2f */ }; static const unsigned char armscii_8_page00_1[32] = { 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char armscii_8_page05[96] = { 0x00, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, /* 0x30-0x37 */ 0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, /* 0x38-0x3f */ 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, /* 0x40-0x47 */ 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, /* 0x48-0x4f */ 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0xfe, 0xb0, 0xaf, 0xaa, 0xb1, 0x00, /* 0x58-0x5f */ 0x00, 0xb3, 0xb5, 0xb7, 0xb9, 0xbb, 0xbd, 0xbf, /* 0x60-0x67 */ 0xc1, 0xc3, 0xc5, 0xc7, 0xc9, 0xcb, 0xcd, 0xcf, /* 0x68-0x6f */ 0xd1, 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, 0xdf, /* 0x70-0x77 */ 0xe1, 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, /* 0x78-0x7f */ 0xf1, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, 0xa2, /* 0x80-0x87 */ 0x00, 0xa3, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ }; static const unsigned char armscii_8_page20[24] = { 0x00, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0x00, /* 0x20-0x27 */ }; static int armscii_8_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0028) { *r = wc; return 1; } else if (wc >= 0x0028 && wc < 0x0030) c = armscii_8_page00[wc-0x0028]; else if (wc >= 0x0030 && wc < 0x00a0) c = wc; else if (wc >= 0x00a0 && wc < 0x00c0) c = armscii_8_page00_1[wc-0x00a0]; else if (wc >= 0x0530 && wc < 0x0590) c = armscii_8_page05[wc-0x0530]; else if (wc >= 0x2010 && wc < 0x2028) c = armscii_8_page20[wc-0x2010]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/ascii.h000066400000000000000000000024031252300335000241650ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ASCII */ static int ascii_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } return RET_ILSEQ; } static int ascii_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x0080) { *r = wc; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/atarist.h000066400000000000000000000152771252300335000245610ustar00rootroot00000000000000/* * Copyright (C) 1999-2005 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * Atari ST */ static const unsigned short atarist_2uni[128] = { /* 0x80 */ 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5, /* 0x90 */ 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, 0x00ff, 0x00d6, 0x00dc, 0x00a2, 0x00a3, 0x00a5, 0x00df, 0x0192, /* 0xa0 */ 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, /* 0xb0 */ 0x00e3, 0x00f5, 0x00d8, 0x00f8, 0x0153, 0x0152, 0x00c0, 0x00c3, 0x00d5, 0x00a8, 0x00b4, 0x2020, 0x00b6, 0x00a9, 0x00ae, 0x2122, /* 0xc0 */ 0x0133, 0x0132, 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05db, 0x05dc, 0x05de, 0x05e0, /* 0xd0 */ 0x05e1, 0x05e2, 0x05e4, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0x05df, 0x05da, 0x05dd, 0x05e3, 0x05e5, 0x00a7, 0x2227, 0x221e, /* 0xe0 */ 0x03b1, 0x03b2, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x222e, 0x03c6, 0x2208, 0x2229, /* 0xf0 */ 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x00b3, 0x00af, }; static int atarist_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) atarist_2uni[c-0x80]; return 1; } static const unsigned char atarist_page00[96] = { 0x00, 0xad, 0x9b, 0x9c, 0x00, 0x9d, 0x00, 0xdd, /* 0xa0-0xa7 */ 0xb9, 0xbd, 0xa6, 0xae, 0xaa, 0x00, 0xbe, 0xff, /* 0xa8-0xaf */ 0xf8, 0xf1, 0xfd, 0xfe, 0xba, 0xe6, 0xbc, 0xfa, /* 0xb0-0xb7 */ 0x00, 0x00, 0xa7, 0xaf, 0xac, 0xab, 0x00, 0xa8, /* 0xb8-0xbf */ 0xb6, 0x00, 0x00, 0xb7, 0x8e, 0x8f, 0x92, 0x80, /* 0xc0-0xc7 */ 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0xa5, 0x00, 0x00, 0x00, 0xb8, 0x99, 0x00, /* 0xd0-0xd7 */ 0xb2, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x9e, /* 0xd8-0xdf */ 0x85, 0xa0, 0x83, 0xb0, 0x84, 0x86, 0x91, 0x87, /* 0xe0-0xe7 */ 0x8a, 0x82, 0x88, 0x89, 0x8d, 0xa1, 0x8c, 0x8b, /* 0xe8-0xef */ 0x00, 0xa4, 0x95, 0xa2, 0x93, 0xb1, 0x94, 0xf6, /* 0xf0-0xf7 */ 0xb3, 0x97, 0xa3, 0x96, 0x81, 0x00, 0x00, 0x98, /* 0xf8-0xff */ }; static const unsigned char atarist_page01[104] = { 0x00, 0x00, 0xc1, 0xc0, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0xb5, 0xb4, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char atarist_page03[56] = { 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0xe8, 0x00, /* 0xa0-0xa7 */ 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x00, 0xe0, 0xe1, 0x00, 0xeb, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0xe3, 0x00, 0x00, 0xe5, 0xe7, 0x00, 0xed, 0x00, /* 0xc0-0xc7 */ }; static const unsigned char atarist_page05[32] = { 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, /* 0xd0-0xd7 */ 0xca, 0xcb, 0xd9, 0xcc, 0xcd, 0xda, 0xce, 0xd8, /* 0xd8-0xdf */ 0xcf, 0xd0, 0xd1, 0xdb, 0xd2, 0xdc, 0xd3, 0xd4, /* 0xe0-0xe7 */ 0xd5, 0xd6, 0xd7, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ }; static const unsigned char atarist_page22[96] = { 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0xdf, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, /* 0x20-0x27 */ 0x00, 0xef, 0x00, 0x00, 0x00, 0x00, 0xec, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0xf0, 0x00, 0x00, 0xf3, 0xf2, 0x00, 0x00, /* 0x60-0x67 */ }; static const unsigned char atarist_page23[24] = { 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0xf4, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static int atarist_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = atarist_page00[wc-0x00a0]; else if (wc >= 0x0130 && wc < 0x0198) c = atarist_page01[wc-0x0130]; else if (wc >= 0x0390 && wc < 0x03c8) c = atarist_page03[wc-0x0390]; else if (wc >= 0x05d0 && wc < 0x05f0) c = atarist_page05[wc-0x05d0]; else if (wc == 0x2020) c = 0xbb; else if (wc == 0x207f) c = 0xfc; else if (wc == 0x2122) c = 0xbf; else if (wc >= 0x2208 && wc < 0x2268) c = atarist_page22[wc-0x2208]; else if (wc >= 0x2310 && wc < 0x2328) c = atarist_page23[wc-0x2310]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/big5.h000066400000000000000000007775561252300335000237570ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * BIG5 */ static const unsigned short big5_2uni_pagea1[6121] = { /* 0xa1 */ 0x3000, 0xff0c, 0x3001, 0x3002, 0xff0e, 0x2022, 0xff1b, 0xff1a, 0xff1f, 0xff01, 0xfe30, 0x2026, 0x2025, 0xfe50, 0xff64, 0xfe52, 0x00b7, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xff5c, 0x2013, 0xfe31, 0x2014, 0xfe33, 0xfffd, 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, 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, 0x203e, 0xfffd, 0xff3f, 0xfffd, 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, 0x223c, 0x2229, 0x222a, 0x22a5, 0x2220, 0x221f, 0x22bf, 0x33d2, 0x33d1, 0x222b, 0x222e, 0x2235, 0x2234, 0x2640, 0x2642, 0x2641, 0x2609, 0x2191, 0x2193, 0x2190, 0x2192, 0x2196, 0x2197, 0x2199, 0x2198, 0x2225, 0x2223, 0xfffd, /* 0xa2 */ 0xfffd, 0xff0f, 0xff3c, 0xff04, 0x00a5, 0x3012, 0x00a2, 0x00a3, 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, 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, 0xfffd, 0x5344, 0xfffd, 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, /* 0xa3 */ 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, 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, 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, /* 0xa4 */ 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, 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, /* 0xa5 */ 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, 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, /* 0xa6 */ 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, 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, /* 0xa7 */ 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, 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, /* 0xa8 */ 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, 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, /* 0xa9 */ 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, 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, /* 0xaa */ 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, 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, /* 0xab */ 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, 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, /* 0xac */ 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, 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, /* 0xad */ 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, 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, /* 0xae */ 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, 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, /* 0xaf */ 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, 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, /* 0xb0 */ 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, 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, /* 0xb1 */ 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, 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, /* 0xb2 */ 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, 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, /* 0xb3 */ 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, 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, /* 0xb4 */ 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, 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, /* 0xb5 */ 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, 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, /* 0xb6 */ 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, 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, /* 0xb7 */ 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, 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, /* 0xb8 */ 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, 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, /* 0xb9 */ 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, 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, /* 0xba */ 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, 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, /* 0xbb */ 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, 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, /* 0xbc */ 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, 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, /* 0xbd */ 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, 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, /* 0xbe */ 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, 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, /* 0xbf */ 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, 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, /* 0xc0 */ 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, 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, /* 0xc1 */ 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, 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, /* 0xc2 */ 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, 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, /* 0xc3 */ 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, 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, /* 0xc4 */ 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, 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, /* 0xc5 */ 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, 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, /* 0xc6 */ 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, 0x30fe, 0x309d, 0x309e, 0x3005, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090, 0x3091, 0x3092, 0x3093, 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, /* 0xc7 */ 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, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 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, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, }; static const unsigned short big5_2uni_pagec9[7652] = { /* 0xc9 */ 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, 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, /* 0xca */ 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, 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, /* 0xcb */ 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, 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, /* 0xcc */ 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, 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, /* 0xcd */ 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, 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, /* 0xce */ 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, 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, /* 0xcf */ 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, 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, /* 0xd0 */ 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, 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, /* 0xd1 */ 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, 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, /* 0xd2 */ 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, 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, /* 0xd3 */ 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, 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, /* 0xd4 */ 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, 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, /* 0xd5 */ 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, 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, /* 0xd6 */ 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, 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, /* 0xd7 */ 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, 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, /* 0xd8 */ 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, 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, /* 0xd9 */ 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, 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, /* 0xda */ 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, 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, /* 0xdb */ 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, 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, /* 0xdc */ 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, 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, /* 0xdd */ 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, 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, /* 0xde */ 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, 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, /* 0xdf */ 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, 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, /* 0xe0 */ 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, 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, /* 0xe1 */ 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, 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, /* 0xe2 */ 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, 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, /* 0xe3 */ 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, 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, /* 0xe4 */ 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, 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, /* 0xe5 */ 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, 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, /* 0xe6 */ 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, 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, /* 0xe7 */ 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, 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, /* 0xe8 */ 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, 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, /* 0xe9 */ 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, 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, /* 0xea */ 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, 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, /* 0xeb */ 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, 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, /* 0xec */ 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, 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, /* 0xed */ 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, 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, /* 0xee */ 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, 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, /* 0xef */ 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, 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, /* 0xf0 */ 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, 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, /* 0xf1 */ 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, 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, /* 0xf2 */ 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, 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, /* 0xf3 */ 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, 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, /* 0xf4 */ 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, 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, /* 0xf5 */ 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, 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, /* 0xf6 */ 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, 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, /* 0xf7 */ 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, 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, /* 0xf8 */ 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, 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, /* 0xf9 */ 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, 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, }; static int big5_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0xa1 && c1 <= 0xc7) || (c1 >= 0xc9 && c1 <= 0xf9)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { unsigned int i = 157 * (c1 - 0xa1) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); unsigned short wc = 0xfffd; if (i < 6280) { if (i < 6121) wc = big5_2uni_pagea1[i]; } else { if (i < 13932) wc = big5_2uni_pagec9[i-6280]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short big5_2charset[13703] = { 0xa246, 0xa247, 0xa244, 0xa1b1, 0xa258, 0xa1d3, 0xa150, 0xa1d1, 0xa1d2, 0xa3be, 0xa3bc, 0xa3bd, 0xa3bf, 0xa3bb, 0xa344, 0xa345, 0xa346, 0xa347, 0xa348, 0xa349, 0xa34a, 0xa34b, 0xa34c, 0xa34d, 0xa34e, 0xa34f, 0xa350, 0xa351, 0xa352, 0xa353, 0xa354, 0xa355, 0xa356, 0xa357, 0xa358, 0xa359, 0xa35a, 0xa35b, 0xa35c, 0xa35d, 0xa35e, 0xa35f, 0xa360, 0xa361, 0xa362, 0xa363, 0xa364, 0xa365, 0xa366, 0xa367, 0xa368, 0xa369, 0xa36a, 0xa36b, 0xa36c, 0xa36d, 0xa36e, 0xa36f, 0xa370, 0xa371, 0xa372, 0xa373, 0xc7b3, 0xc7b1, 0xc7b2, 0xc7b4, 0xc7b5, 0xc7b6, 0xc7b7, 0xc7b8, 0xc7b9, 0xc7ba, 0xc7bb, 0xc7bc, 0xc7bd, 0xc7be, 0xc7bf, 0xc7c0, 0xc7c1, 0xc7c2, 0xc7c3, 0xc7c4, 0xc7c5, 0xc7c6, 0xc7c7, 0xc7c8, 0xc7c9, 0xc7ca, 0xc7cb, 0xc7cc, 0xc7cd, 0xc7cf, 0xc7d0, 0xc7d1, 0xc7d2, 0xc7d3, 0xc7d4, 0xc7d5, 0xc7d6, 0xc7d7, 0xc7d8, 0xc7d9, 0xc7da, 0xc7db, 0xc7dc, 0xc7dd, 0xc7de, 0xc7df, 0xc7e0, 0xc7e1, 0xc7e2, 0xc7e3, 0xc7e4, 0xc7e5, 0xc7e6, 0xc7e7, 0xc7e8, 0xc7ce, 0xa156, 0xa158, 0xa1a5, 0xa1a6, 0xa1a7, 0xa1a8, 0xa145, 0xa14c, 0xa14b, 0xa1ac, 0xa1ab, 0xa1b0, 0xa1c2, 0xa24a, 0xa1c1, 0xa24b, 0xa2b9, 0xa2ba, 0xa2bb, 0xa2bc, 0xa2bd, 0xa2be, 0xa2bf, 0xa2c0, 0xa2c1, 0xa2c2, 0xa1f6, 0xa1f4, 0xa1f7, 0xa1f5, 0xa1f8, 0xa1f9, 0xa1fb, 0xa1fa, 0xa1d4, 0xa1db, 0xa1e8, 0xa1e7, 0xa1fd, 0xa1fc, 0xa1e4, 0xa1e5, 0xa1ec, 0xa1ed, 0xa1ef, 0xa1ee, 0xa1e3, 0xa1dc, 0xa1da, 0xa1dd, 0xa1d8, 0xa1d9, 0xa1e6, 0xa1e9, 0xc7e9, 0xc7ea, 0xc7eb, 0xc7ec, 0xc7ed, 0xc7ee, 0xc7ef, 0xc7f0, 0xc7f1, 0xc7f2, 0xc7f3, 0xc7f4, 0xc7f5, 0xc7f6, 0xc7f7, 0xc7f8, 0xc7f9, 0xc7fa, 0xc7fb, 0xc7fc, 0xa277, 0xa278, 0xa27a, 0xa27b, 0xa27c, 0xa27d, 0xa275, 0xa274, 0xa273, 0xa272, 0xa271, 0xa2a4, 0xa2a5, 0xa2a7, 0xa2a6, 0xa27e, 0xa2a1, 0xa2a3, 0xa2a2, 0xa2ac, 0xa2ad, 0xa2ae, 0xa262, 0xa263, 0xa264, 0xa265, 0xa266, 0xa267, 0xa268, 0xa269, 0xa270, 0xa26f, 0xa26e, 0xa26d, 0xa26c, 0xa26b, 0xa26a, 0xa276, 0xa279, 0xa1bd, 0xa1bc, 0xa1b6, 0xa1b5, 0xa1bf, 0xa1be, 0xa1bb, 0xa1ba, 0xa1b3, 0xa1b7, 0xa1b4, 0xa2a8, 0xa2a9, 0xa2ab, 0xa2aa, 0xa1b9, 0xa1b8, 0xa1f3, 0xa1f0, 0xa1f2, 0xa1f1, 0xa140, 0xa142, 0xa143, 0xa1b2, 0xc6a4, 0xa171, 0xa172, 0xa16d, 0xa16e, 0xa175, 0xa176, 0xa179, 0xa17a, 0xa169, 0xa16a, 0xa245, 0xa165, 0xa166, 0xa1a9, 0xa1aa, 0xa2c3, 0xa2c4, 0xa2c5, 0xa2c6, 0xa2c7, 0xa2c8, 0xa2c9, 0xa2ca, 0xa2cb, 0xc6a5, 0xc6a6, 0xc6a7, 0xc6a8, 0xc6a9, 0xc6aa, 0xc6ab, 0xc6ac, 0xc6ad, 0xc6ae, 0xc6af, 0xc6b0, 0xc6b1, 0xc6b2, 0xc6b3, 0xc6b4, 0xc6b5, 0xc6b6, 0xc6b7, 0xc6b8, 0xc6b9, 0xc6ba, 0xc6bb, 0xc6bc, 0xc6bd, 0xc6be, 0xc6bf, 0xc6c0, 0xc6c1, 0xc6c2, 0xc6c3, 0xc6c4, 0xc6c5, 0xc6c6, 0xc6c7, 0xc6c8, 0xc6c9, 0xc6ca, 0xc6cb, 0xc6cc, 0xc6cd, 0xc6ce, 0xc6cf, 0xc6d0, 0xc6d1, 0xc6d2, 0xc6d3, 0xc6d4, 0xc6d5, 0xc6d6, 0xc6d7, 0xc6d8, 0xc6d9, 0xc6da, 0xc6db, 0xc6dc, 0xc6dd, 0xc6de, 0xc6df, 0xc6e0, 0xc6e1, 0xc6e2, 0xc6e3, 0xc6e4, 0xc6e5, 0xc6e6, 0xc6e7, 0xc6e8, 0xc6e9, 0xc6ea, 0xc6eb, 0xc6ec, 0xc6ed, 0xc6ee, 0xc6ef, 0xc6f0, 0xc6f1, 0xc6f2, 0xc6f3, 0xc6f4, 0xc6f5, 0xc6f6, 0xc6f7, 0xc6a2, 0xc6a3, 0xc6f8, 0xc6f9, 0xc6fa, 0xc6fb, 0xc6fc, 0xc6fd, 0xc6fe, 0xc740, 0xc741, 0xc742, 0xc743, 0xc744, 0xc745, 0xc746, 0xc747, 0xc748, 0xc749, 0xc74a, 0xc74b, 0xc74c, 0xc74d, 0xc74e, 0xc74f, 0xc750, 0xc751, 0xc752, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc759, 0xc75a, 0xc75b, 0xc75c, 0xc75d, 0xc75e, 0xc75f, 0xc760, 0xc761, 0xc762, 0xc763, 0xc764, 0xc765, 0xc766, 0xc767, 0xc768, 0xc769, 0xc76a, 0xc76b, 0xc76c, 0xc76d, 0xc76e, 0xc76f, 0xc770, 0xc771, 0xc772, 0xc773, 0xc774, 0xc775, 0xc776, 0xc777, 0xc778, 0xc779, 0xc77a, 0xc77b, 0xc77c, 0xc77d, 0xc77e, 0xc7a1, 0xc7a2, 0xc7a3, 0xc7a4, 0xc7a5, 0xc7a6, 0xc7a7, 0xc7a8, 0xc7a9, 0xc7aa, 0xc7ab, 0xc7ac, 0xc7ad, 0xc7ae, 0xc7af, 0xc7b0, 0xc6a1, 0xa374, 0xa375, 0xa376, 0xa377, 0xa378, 0xa379, 0xa37a, 0xa37b, 0xa37c, 0xa37d, 0xa37e, 0xa3a1, 0xa3a2, 0xa3a3, 0xa3a4, 0xa3a5, 0xa3a6, 0xa3a7, 0xa3a8, 0xa3a9, 0xa3aa, 0xa3ab, 0xa3ac, 0xa3ad, 0xa3ae, 0xa3af, 0xa3b0, 0xa3b1, 0xa3b2, 0xa3b3, 0xa3b4, 0xa3b5, 0xa3b6, 0xa3b7, 0xa3b8, 0xa3b9, 0xa3ba, 0xa1c0, 0xa255, 0xa256, 0xa250, 0xa251, 0xa252, 0xa254, 0xa257, 0xa253, 0xa1eb, 0xa1ea, 0xa24f, 0xa440, 0xa442, 0xa443, 0xc945, 0xa456, 0xa454, 0xa457, 0xa455, 0xc946, 0xa4a3, 0xc94f, 0xc94d, 0xa4a2, 0xa4a1, 0xa542, 0xa541, 0xa540, 0xa543, 0xa4fe, 0xa5e0, 0xa5e1, 0xa8c3, 0xa458, 0xa4a4, 0xc950, 0xa4a5, 0xc963, 0xa6ea, 0xcbb1, 0xa459, 0xa4a6, 0xa544, 0xc964, 0xc940, 0xa444, 0xa45b, 0xc947, 0xa45c, 0xa4a7, 0xa545, 0xa547, 0xa546, 0xa5e2, 0xa5e3, 0xa8c4, 0xadbc, 0xa441, 0xc941, 0xa445, 0xa45e, 0xa45d, 0xa5e4, 0xa8c5, 0xb0ae, 0xd44b, 0xb6c3, 0xdcb1, 0xdcb2, 0xa446, 0xa4a9, 0xa8c6, 0xa447, 0xc948, 0xa45f, 0xa4aa, 0xa4ac, 0xc951, 0xa4ad, 0xa4ab, 0xa5e5, 0xa8c7, 0xa8c8, 0xab45, 0xa460, 0xa4ae, 0xa5e6, 0xa5e8, 0xa5e7, 0xa6eb, 0xa8c9, 0xa8ca, 0xab46, 0xab47, 0xadbd, 0xdcb3, 0xf6d6, 0xa448, 0xa4b0, 0xa4af, 0xc952, 0xa4b1, 0xa4b7, 0xa4b2, 0xa4b3, 0xc954, 0xc953, 0xa4b5, 0xa4b6, 0xa4b4, 0xa54a, 0xa54b, 0xa54c, 0xa54d, 0xa549, 0xa550, 0xc96a, 0xc966, 0xc969, 0xa551, 0xa561, 0xc968, 0xa54e, 0xa54f, 0xa548, 0xc965, 0xc967, 0xa5f5, 0xc9b0, 0xa5f2, 0xa5f6, 0xc9ba, 0xc9ae, 0xa5f3, 0xc9b2, 0xa5f4, 0xa5f7, 0xa5e9, 0xc9b1, 0xa5f8, 0xc9b5, 0xc9b9, 0xc9b6, 0xc9b3, 0xa5ea, 0xa5ec, 0xa5f9, 0xa5ee, 0xc9ab, 0xa5f1, 0xa5ef, 0xa5f0, 0xc9bb, 0xc9b8, 0xc9af, 0xa5ed, 0xc9ac, 0xa5eb, 0xc9b4, 0xc9b7, 0xc9ad, 0xca66, 0xa742, 0xa6f4, 0xca67, 0xa6f1, 0xa744, 0xa6f9, 0xa6f8, 0xca5b, 0xa6fc, 0xa6f7, 0xca60, 0xca68, 0xca64, 0xa6fa, 0xa6fd, 0xa6ee, 0xa747, 0xca5d, 0xcbbd, 0xa6ec, 0xa743, 0xa6ed, 0xa6f5, 0xa6f6, 0xca62, 0xca5e, 0xa6fb, 0xa6f3, 0xca5a, 0xa6ef, 0xca65, 0xa745, 0xa748, 0xa6f2, 0xa740, 0xa746, 0xa6f0, 0xca63, 0xa741, 0xca69, 0xca5c, 0xa6fe, 0xca5f, 0xca61, 0xa8d8, 0xcbbf, 0xcbcb, 0xa8d0, 0xcbcc, 0xa8cb, 0xa8d5, 0xa8ce, 0xcbb9, 0xa8d6, 0xcbb8, 0xcbbc, 0xcbc3, 0xcbc1, 0xa8de, 0xa8d9, 0xcbb3, 0xcbb5, 0xa8db, 0xa8cf, 0xcbb6, 0xcbc2, 0xcbc9, 0xa8d4, 0xcbbb, 0xcbb4, 0xa8d3, 0xcbb7, 0xa8d7, 0xcbba, 0xa8d2, 0xa8cd, 0xa8dc, 0xcbc4, 0xa8dd, 0xcbc8, 0xcbc6, 0xcbca, 0xa8da, 0xcbbe, 0xcbb2, 0xcbc0, 0xa8d1, 0xcbc5, 0xa8cc, 0xcbc7, 0xab56, 0xab4a, 0xcde0, 0xcde8, 0xab49, 0xab51, 0xab5d, 0xcdee, 0xcdec, 0xcde7, 0xab4b, 0xcded, 0xcde3, 0xab59, 0xab50, 0xab58, 0xcdde, 0xcdea, 0xcde1, 0xab54, 0xcde2, 0xcddd, 0xab5b, 0xab4e, 0xab57, 0xab4d, 0xcddf, 0xcde4, 0xcdeb, 0xab55, 0xab52, 0xcde6, 0xab5a, 0xcde9, 0xcde5, 0xab4f, 0xab5c, 0xab53, 0xab4c, 0xab48, 0xcdef, 0xadd7, 0xadc1, 0xadd1, 0xadd6, 0xd0d0, 0xd0cf, 0xd0d4, 0xd0d5, 0xadc4, 0xadcd, 0xadda, 0xadce, 0xd0c9, 0xadc7, 0xd0ca, 0xaddc, 0xadd3, 0xadbe, 0xadbf, 0xd0dd, 0xb0bf, 0xadcc, 0xadcb, 0xd0cb, 0xadcf, 0xd45b, 0xadc6, 0xd0d6, 0xadd5, 0xadd4, 0xadca, 0xd0ce, 0xd0d7, 0xd0c8, 0xadc9, 0xd0d8, 0xadd2, 0xd0cc, 0xadc0, 0xadc3, 0xadc2, 0xd0d9, 0xadd0, 0xadc5, 0xadd9, 0xaddb, 0xd0d3, 0xadd8, 0xd0db, 0xd0cd, 0xd0dc, 0xd0d1, 0xd0da, 0xd0d2, 0xadc8, 0xd463, 0xd457, 0xb0b3, 0xd45c, 0xd462, 0xb0b2, 0xd455, 0xb0b6, 0xd459, 0xd452, 0xb0b4, 0xd456, 0xb0b9, 0xb0be, 0xd467, 0xd451, 0xb0ba, 0xd466, 0xb0b5, 0xd458, 0xb0b1, 0xd453, 0xd44f, 0xd45d, 0xd450, 0xd44e, 0xd45a, 0xd460, 0xd461, 0xb0b7, 0xd85b, 0xd45e, 0xd44d, 0xd45f, 0xb0c1, 0xd464, 0xb0c0, 0xd44c, 0xd454, 0xd465, 0xb0bc, 0xb0bb, 0xb0b8, 0xb0bd, 0xb0af, 0xb0b0, 0xb3c8, 0xd85e, 0xd857, 0xb3c5, 0xd85f, 0xd855, 0xd858, 0xb3c4, 0xd859, 0xb3c7, 0xd85d, 0xd853, 0xd852, 0xb3c9, 0xb3ca, 0xb3c6, 0xb3cb, 0xd851, 0xd85c, 0xd85a, 0xd854, 0xb3c3, 0xd856, 0xb6ca, 0xb6c4, 0xdcb7, 0xb6cd, 0xdcbd, 0xdcc0, 0xb6c6, 0xb6c7, 0xdcba, 0xb6c5, 0xdcc3, 0xb6cb, 0xdcc4, 0xdcbf, 0xb6cc, 0xdcb4, 0xb6c9, 0xdcb5, 0xdcbe, 0xdcbc, 0xdcb8, 0xb6c8, 0xdcb6, 0xb6ce, 0xdcbb, 0xdcc2, 0xdcb9, 0xdcc1, 0xb9b6, 0xb9b3, 0xb9b4, 0xe0f9, 0xe0f1, 0xb9b2, 0xb9af, 0xe0f2, 0xb9b1, 0xe0f5, 0xe0f7, 0xe0fe, 0xe0fd, 0xe0f8, 0xb9ae, 0xe0f0, 0xb9ac, 0xe0f3, 0xb9b7, 0xe0f6, 0xe0fa, 0xb9b0, 0xb9ad, 0xe0fc, 0xe0fb, 0xb9b5, 0xe0f4, 0xbbf8, 0xe4ec, 0xe4e9, 0xbbf9, 0xbbf7, 0xe4f0, 0xe4ed, 0xe4e6, 0xbbf6, 0xbbfa, 0xe4e7, 0xbbf5, 0xbbfd, 0xe4ea, 0xe4eb, 0xbbfb, 0xbbfc, 0xe4f1, 0xe4ee, 0xe4ef, 0xbeaa, 0xe8f8, 0xbea7, 0xe8f5, 0xbea9, 0xbeab, 0xe8f6, 0xbea8, 0xe8f7, 0xe8f4, 0xc076, 0xecbd, 0xc077, 0xecbb, 0xecbc, 0xecba, 0xecb9, 0xecbe, 0xc075, 0xefb8, 0xefb9, 0xe4e8, 0xefb7, 0xc078, 0xc35f, 0xf1eb, 0xf1ec, 0xc4d7, 0xc4d8, 0xf5c1, 0xf5c0, 0xc56c, 0xc56b, 0xf7d0, 0xa449, 0xa461, 0xa4b9, 0xa4b8, 0xa553, 0xa552, 0xa5fc, 0xa5fb, 0xa5fd, 0xa5fa, 0xa74a, 0xa749, 0xa74b, 0xa8e0, 0xa8df, 0xa8e1, 0xab5e, 0xa259, 0xd0de, 0xa25a, 0xb0c2, 0xa25c, 0xa25b, 0xd860, 0xa25d, 0xb9b8, 0xa25e, 0xa44a, 0xa4ba, 0xa5fe, 0xa8e2, 0xa44b, 0xa4bd, 0xa4bb, 0xa4bc, 0xa640, 0xa74c, 0xa8e4, 0xa8e3, 0xa8e5, 0xaddd, 0xbeac, 0xc94e, 0xa554, 0xa555, 0xa641, 0xca6a, 0xab60, 0xab5f, 0xd0e0, 0xd0df, 0xb0c3, 0xa4be, 0xc955, 0xcbcd, 0xab61, 0xade0, 0xadde, 0xaddf, 0xbead, 0xa556, 0xa642, 0xc9bc, 0xa74d, 0xa74e, 0xca6b, 0xcbce, 0xa8e6, 0xcbcf, 0xd0e2, 0xd0e3, 0xade3, 0xd0e4, 0xd0e1, 0xade4, 0xade2, 0xade1, 0xd0e5, 0xd468, 0xd861, 0xdcc5, 0xe140, 0xbbfe, 0xbeae, 0xe8f9, 0xa44c, 0xa45a, 0xb0c4, 0xb3cd, 0xb9b9, 0xc942, 0xa4bf, 0xa559, 0xa557, 0xa558, 0xa8e7, 0xa44d, 0xa44e, 0xa462, 0xa4c0, 0xa4c1, 0xa4c2, 0xc9be, 0xa55a, 0xc96b, 0xa646, 0xc9bf, 0xa644, 0xa645, 0xc9bd, 0xa647, 0xa643, 0xca6c, 0xaaec, 0xca6d, 0xca6e, 0xa750, 0xa74f, 0xa753, 0xa751, 0xa752, 0xa8ed, 0xa8ec, 0xcbd4, 0xcbd1, 0xcbd2, 0xcbd0, 0xa8ee, 0xa8ea, 0xa8e9, 0xa8eb, 0xa8e8, 0xa8ef, 0xab63, 0xcdf0, 0xcbd3, 0xab68, 0xcdf1, 0xab64, 0xab67, 0xab66, 0xab65, 0xab62, 0xd0e8, 0xade7, 0xd0eb, 0xade5, 0xd0e7, 0xade8, 0xade6, 0xade9, 0xd0e9, 0xd0ea, 0xd0e6, 0xd0ec, 0xb3d1, 0xb0c5, 0xd469, 0xd46b, 0xd46a, 0xd46c, 0xb0c6, 0xb3ce, 0xb3cf, 0xb3d0, 0xb6d0, 0xdcc7, 0xdcc6, 0xdcc8, 0xdcc9, 0xb6d1, 0xb6cf, 0xe141, 0xe142, 0xb9bb, 0xb9ba, 0xe35a, 0xbc40, 0xbc41, 0xbc42, 0xbc44, 0xe4f2, 0xe4f3, 0xbc43, 0xbeaf, 0xbeb0, 0xf1ed, 0xf5c3, 0xf5c2, 0xf7d1, 0xa44f, 0xa55c, 0xa55b, 0xa648, 0xc9c0, 0xa755, 0xa756, 0xa754, 0xa757, 0xca6f, 0xca70, 0xa8f1, 0xcbd5, 0xa8f0, 0xcdf2, 0xab6c, 0xcdf3, 0xab6b, 0xab69, 0xab6a, 0xd0ed, 0xb0c7, 0xd46e, 0xb0ca, 0xd46d, 0xb1e5, 0xb0c9, 0xb0c8, 0xb3d4, 0xb3d3, 0xb3d2, 0xb6d2, 0xb6d5, 0xb6d6, 0xb6d4, 0xb6d3, 0xe143, 0xe144, 0xe4f5, 0xbc45, 0xe4f4, 0xbeb1, 0xecbf, 0xc079, 0xf1ee, 0xc455, 0xa463, 0xa4c3, 0xc956, 0xa4c4, 0xa4c5, 0xa55d, 0xa55e, 0xa649, 0xca71, 0xcbd6, 0xcbd7, 0xab6d, 0xd0ee, 0xb0cc, 0xb0cb, 0xd863, 0xd862, 0xa450, 0xa4c6, 0xa55f, 0xb0cd, 0xc943, 0xc96c, 0xa560, 0xc9c2, 0xa64b, 0xa64a, 0xc9c1, 0xa758, 0xadea, 0xd46f, 0xb6d7, 0xe145, 0xb9bc, 0xe8fa, 0xf3fd, 0xa4c7, 0xcbd8, 0xcdf4, 0xb0d0, 0xb0ce, 0xb0cf, 0xa451, 0xa464, 0xa2cd, 0xa4ca, 0xa4c9, 0xa4c8, 0xa563, 0xa562, 0xc96d, 0xc9c3, 0xa8f5, 0xa8f2, 0xa8f4, 0xa8f3, 0xab6e, 0xb3d5, 0xa452, 0xa4cb, 0xa565, 0xa564, 0xca72, 0xa8f6, 0xc957, 0xa567, 0xa566, 0xa64c, 0xa64d, 0xca73, 0xa759, 0xa75a, 0xa8f7, 0xa8f8, 0xa8f9, 0xab6f, 0xcdf5, 0xadeb, 0xc944, 0xa4cc, 0xc9c4, 0xca74, 0xca75, 0xcbd9, 0xcbda, 0xcdf7, 0xcdf6, 0xcdf9, 0xcdf8, 0xab70, 0xd470, 0xaded, 0xd0ef, 0xadec, 0xd864, 0xb3d6, 0xd865, 0xe146, 0xb9bd, 0xbc46, 0xf1ef, 0xc958, 0xa568, 0xb0d1, 0xa453, 0xa465, 0xa4ce, 0xa4cd, 0xa4cf, 0xa8fb, 0xa8fa, 0xa8fc, 0xab71, 0xadee, 0xe8fb, 0xc24f, 0xa466, 0xa56a, 0xa579, 0xa574, 0xa56f, 0xa56e, 0xa575, 0xa573, 0xa56c, 0xa57a, 0xa56d, 0xa569, 0xa578, 0xa577, 0xa576, 0xa56b, 0xa572, 0xa571, 0xa57b, 0xa570, 0xa653, 0xa659, 0xa655, 0xa65b, 0xc9c5, 0xa658, 0xa64e, 0xa651, 0xa654, 0xa650, 0xa657, 0xa65a, 0xa64f, 0xa652, 0xa656, 0xa65c, 0xca7e, 0xca7b, 0xa767, 0xca7c, 0xa75b, 0xa75d, 0xa775, 0xa770, 0xcaa5, 0xca7d, 0xa75f, 0xa761, 0xcaa4, 0xa768, 0xca78, 0xa774, 0xa776, 0xa75c, 0xa76d, 0xca76, 0xa773, 0xa764, 0xa76e, 0xa76f, 0xca77, 0xa76c, 0xa76a, 0xa76b, 0xa771, 0xcaa1, 0xa75e, 0xa772, 0xcaa3, 0xa766, 0xa763, 0xca7a, 0xa762, 0xcaa6, 0xa765, 0xa769, 0xa760, 0xcaa2, 0xca79, 0xcbeb, 0xcbea, 0xa94f, 0xcbed, 0xcbef, 0xcbe4, 0xcbe7, 0xcbee, 0xa950, 0xcbe1, 0xcbe5, 0xcbe9, 0xce49, 0xa94b, 0xce4d, 0xa8fd, 0xcbe6, 0xa8fe, 0xa94c, 0xa945, 0xa941, 0xcbe2, 0xa944, 0xa949, 0xa952, 0xcbe3, 0xcbdc, 0xa943, 0xcbdd, 0xcbdf, 0xa946, 0xa948, 0xcbdb, 0xcbe0, 0xa951, 0xa94d, 0xcbe8, 0xa953, 0xa94a, 0xcbde, 0xa947, 0xa942, 0xa940, 0xcbec, 0xa94e, 0xce48, 0xcdfb, 0xce4b, 0xcdfd, 0xab78, 0xaba8, 0xab74, 0xaba7, 0xab7d, 0xaba4, 0xab72, 0xcdfc, 0xce43, 0xaba3, 0xce4f, 0xaba5, 0xab79, 0xce45, 0xce42, 0xab77, 0xcdfa, 0xaba6, 0xce4a, 0xab7c, 0xce4c, 0xaba9, 0xab73, 0xab7e, 0xab7b, 0xce40, 0xaba1, 0xce46, 0xce47, 0xab7a, 0xaba2, 0xab76, 0xab75, 0xcdfe, 0xce44, 0xce4e, 0xd144, 0xadfb, 0xd0f1, 0xd0f6, 0xadf4, 0xae40, 0xd0f4, 0xadef, 0xadf9, 0xadfe, 0xd0fb, 0xadfa, 0xadfd, 0xd0fe, 0xadf5, 0xd0f5, 0xd142, 0xd143, 0xadf7, 0xd141, 0xadf3, 0xae43, 0xd0f8, 0xadf1, 0xd146, 0xd0f9, 0xd0fd, 0xadf6, 0xae42, 0xd0fa, 0xadfc, 0xd140, 0xd147, 0xd4a1, 0xd145, 0xae44, 0xadf0, 0xd0fc, 0xd0f3, 0xadf8, 0xd0f2, 0xd0f7, 0xd0f0, 0xae41, 0xd477, 0xb0e4, 0xd4a7, 0xb0e2, 0xb0df, 0xd47c, 0xb0db, 0xd4a2, 0xb0e6, 0xd476, 0xd47b, 0xd47a, 0xadf2, 0xb0e1, 0xd4a5, 0xd4a8, 0xd473, 0xb3e8, 0xd4a9, 0xb0e7, 0xb0d9, 0xb0d6, 0xd47e, 0xb0d3, 0xd4a6, 0xb0da, 0xd4aa, 0xd474, 0xd4a4, 0xb0dd, 0xd475, 0xd478, 0xd47d, 0xb0de, 0xb0dc, 0xb0e8, 0xb0e3, 0xb0d7, 0xb1d2, 0xb0d8, 0xd479, 0xb0e5, 0xb0e0, 0xd4a3, 0xb0d5, 0xb0d4, 0xd471, 0xd472, 0xd86a, 0xb3d7, 0xb3da, 0xd875, 0xb3ee, 0xd878, 0xb3d8, 0xd871, 0xb3de, 0xb3e4, 0xb5bd, 0xb3e2, 0xd86e, 0xb3ef, 0xb3db, 0xb3e3, 0xd876, 0xdcd7, 0xd87b, 0xd86f, 0xd866, 0xd873, 0xd86d, 0xb3e1, 0xd879, 0xb3dd, 0xb3f1, 0xb3ea, 0xb3df, 0xb3dc, 0xb3e7, 0xd87a, 0xd86c, 0xd872, 0xd874, 0xd868, 0xd877, 0xb3d9, 0xd867, 0xb3e0, 0xb3f0, 0xb3ec, 0xd869, 0xb3e6, 0xb3ed, 0xb3e9, 0xb3e5, 0xd870, 0xb3eb, 0xdcd5, 0xdcd1, 0xdce0, 0xdcca, 0xdcd3, 0xb6e5, 0xb6e6, 0xb6de, 0xdcdc, 0xb6e8, 0xdccf, 0xdcce, 0xdccc, 0xdcde, 0xb6dc, 0xdcd8, 0xdccd, 0xb6df, 0xdcd6, 0xb6da, 0xdcd2, 0xdcd9, 0xdcdb, 0xdcdf, 0xb6e3, 0xdccb, 0xb6dd, 0xdcd0, 0xb6d8, 0xb6e4, 0xdcda, 0xb6e0, 0xb6e1, 0xb6e7, 0xb6db, 0xa25f, 0xb6d9, 0xdcd4, 0xb6e2, 0xdcdd, 0xb9cd, 0xb9c8, 0xe155, 0xe151, 0xe14b, 0xb9c2, 0xb9be, 0xe154, 0xb9bf, 0xe14e, 0xe150, 0xe153, 0xb9c4, 0xb9cb, 0xb9c5, 0xe149, 0xb9c6, 0xb9c7, 0xe14c, 0xb9cc, 0xe14a, 0xe14f, 0xb9c3, 0xe148, 0xb9c9, 0xb9c1, 0xb9c0, 0xe14d, 0xe152, 0xb9ca, 0xe147, 0xbc4d, 0xe547, 0xe544, 0xbc47, 0xbc53, 0xbc54, 0xbc4a, 0xe542, 0xbc4c, 0xe4f9, 0xbc52, 0xe546, 0xbc49, 0xe548, 0xbc48, 0xe543, 0xe545, 0xbc4b, 0xe541, 0xe4fa, 0xe4f7, 0xd86b, 0xe4fd, 0xe4f6, 0xe4fc, 0xe4fb, 0xe4f8, 0xbc4f, 0xbc4e, 0xbc50, 0xe4fe, 0xbeb2, 0xe540, 0xe945, 0xe8fd, 0xbebe, 0xe942, 0xbeb6, 0xbeba, 0xe941, 0xbeb9, 0xbeb5, 0xbeb8, 0xbeb3, 0xbebd, 0xe943, 0xe8fe, 0xbebc, 0xe8fc, 0xbebb, 0xe944, 0xe940, 0xbc51, 0xbebf, 0xe946, 0xbeb7, 0xbeb4, 0xecc6, 0xecc8, 0xc07b, 0xecc9, 0xecc7, 0xecc5, 0xecc4, 0xc07d, 0xecc3, 0xc07e, 0xecc1, 0xecc2, 0xc07a, 0xc0a1, 0xc07c, 0xecc0, 0xc250, 0xefbc, 0xefba, 0xefbf, 0xefbd, 0xefbb, 0xefbe, 0xc360, 0xf1f2, 0xf1f3, 0xc456, 0xf1f4, 0xf1f0, 0xf1f5, 0xf1f1, 0xc251, 0xf3fe, 0xf441, 0xc459, 0xf440, 0xc458, 0xc457, 0xc45a, 0xf5c5, 0xf5c6, 0xc4da, 0xc4d9, 0xc4db, 0xf5c4, 0xf6d8, 0xf6d7, 0xc56d, 0xc56f, 0xc56e, 0xf6d9, 0xc5c8, 0xf8a6, 0xc5f1, 0xf8a5, 0xf8ee, 0xc949, 0xa57d, 0xa57c, 0xa65f, 0xa65e, 0xc9c7, 0xa65d, 0xc9c6, 0xa779, 0xcaa9, 0xcaa8, 0xa777, 0xa77a, 0xcaa7, 0xa778, 0xcbf0, 0xcbf1, 0xa954, 0xabaa, 0xd148, 0xd149, 0xae45, 0xae46, 0xd4ac, 0xb0e9, 0xb0eb, 0xd4ab, 0xb0ea, 0xd87c, 0xb3f2, 0xb6e9, 0xb6ea, 0xdce1, 0xb9cf, 0xb9ce, 0xe549, 0xe948, 0xe947, 0xf96b, 0xa467, 0xc959, 0xc96e, 0xc96f, 0xa662, 0xa666, 0xc9c9, 0xa664, 0xa663, 0xc9c8, 0xa665, 0xa661, 0xa660, 0xc9ca, 0xa7a6, 0xa7a3, 0xa77d, 0xcaaa, 0xcaab, 0xa7a1, 0xcaad, 0xa77b, 0xcaae, 0xcaac, 0xa77e, 0xa7a2, 0xa7a5, 0xa7a4, 0xa77c, 0xcaaf, 0xa959, 0xcbfe, 0xa95b, 0xa95a, 0xcc40, 0xa958, 0xa957, 0xcbf5, 0xcbf4, 0xcbf2, 0xcbf7, 0xcbf6, 0xcbf3, 0xcbfc, 0xcbfd, 0xcbfa, 0xcbf8, 0xa956, 0xcbfb, 0xa95c, 0xcc41, 0xcbf9, 0xabab, 0xa955, 0xabac, 0xce54, 0xce5a, 0xabb2, 0xce58, 0xce5e, 0xce55, 0xce59, 0xce5b, 0xce5d, 0xce57, 0xce56, 0xce51, 0xce52, 0xabad, 0xabaf, 0xabae, 0xce53, 0xce5c, 0xabb1, 0xce50, 0xd153, 0xd152, 0xd157, 0xd14e, 0xd151, 0xd150, 0xd154, 0xd158, 0xae47, 0xae4a, 0xd14f, 0xd155, 0xae49, 0xd14a, 0xabb0, 0xd4ba, 0xd156, 0xd14d, 0xae48, 0xd14c, 0xd4b1, 0xb0ec, 0xb0f0, 0xd4c1, 0xd4af, 0xd4bd, 0xb0f1, 0xd4bf, 0xd4c5, 0xd4c9, 0xd4c0, 0xd4b4, 0xd4bc, 0xd4ca, 0xd4c8, 0xd4be, 0xd4b9, 0xd4b2, 0xd8a6, 0xd4b0, 0xb0f5, 0xd4b7, 0xb0f6, 0xb0f2, 0xd4ad, 0xd4c3, 0xd4b5, 0xd4b3, 0xd4c6, 0xb0f3, 0xd4cc, 0xb0ed, 0xb0ef, 0xd4bb, 0xd4b6, 0xae4b, 0xb0ee, 0xd4b8, 0xd4c7, 0xd4cb, 0xd4c2, 0xd4c4, 0xd4ae, 0xd8a1, 0xd8aa, 0xd8a9, 0xb3fa, 0xd8a2, 0xb3fb, 0xb3f9, 0xd8a4, 0xb3f6, 0xd8a8, 0xd8a3, 0xd8a5, 0xd87d, 0xb3f4, 0xd8b2, 0xd8b1, 0xd8ae, 0xb3f3, 0xb3f7, 0xb3f8, 0xd14b, 0xd8ab, 0xb3f5, 0xb0f4, 0xd8ad, 0xd87e, 0xd8b0, 0xd8af, 0xd8b3, 0xdcef, 0xd8ac, 0xd8a7, 0xdce7, 0xb6f4, 0xb6f7, 0xb6f2, 0xdce6, 0xdcea, 0xdce5, 0xb6ec, 0xb6f6, 0xdce2, 0xb6f0, 0xdce9, 0xb6ee, 0xb6ed, 0xdcec, 0xb6ef, 0xdcee, 0xdceb, 0xb6eb, 0xb6f5, 0xdcf0, 0xdce4, 0xdced, 0xdce3, 0xb6f1, 0xb6f3, 0xdce8, 0xdcf1, 0xe15d, 0xb9d0, 0xe163, 0xb9d5, 0xe15f, 0xe166, 0xe157, 0xb9d7, 0xb9d1, 0xe15c, 0xbc55, 0xe15b, 0xe164, 0xb9d2, 0xb9d6, 0xe15a, 0xe160, 0xe165, 0xe156, 0xb9d4, 0xe15e, 0xe162, 0xe168, 0xe158, 0xe161, 0xb9d3, 0xe167, 0xe159, 0xbc59, 0xe54b, 0xbc57, 0xbc56, 0xe54d, 0xe552, 0xe54e, 0xe551, 0xbc5c, 0xbea5, 0xbc5b, 0xe54a, 0xe550, 0xbc5a, 0xe54f, 0xe54c, 0xbc58, 0xe94d, 0xe94f, 0xe94a, 0xbec1, 0xe94c, 0xbec0, 0xe94e, 0xbec3, 0xe950, 0xbec2, 0xe949, 0xe94b, 0xc0a5, 0xeccc, 0xc0a4, 0xeccd, 0xc0a3, 0xeccb, 0xc0a2, 0xecca, 0xc253, 0xc252, 0xf1f6, 0xf1f8, 0xf1f7, 0xc361, 0xc362, 0xc363, 0xf442, 0xc45b, 0xf7d3, 0xf7d2, 0xc5f2, 0xa468, 0xa4d0, 0xa7a7, 0xce5f, 0xb3fc, 0xb3fd, 0xdcf2, 0xb9d8, 0xe169, 0xe553, 0xc95a, 0xcab0, 0xcc42, 0xce60, 0xd159, 0xae4c, 0xf1f9, 0xc4dc, 0xa469, 0xa57e, 0xc970, 0xa667, 0xa668, 0xa95d, 0xb0f7, 0xb9da, 0xb9db, 0xb9d9, 0xa46a, 0xa4d1, 0xa4d3, 0xa4d2, 0xc95b, 0xa4d4, 0xa5a1, 0xc971, 0xa5a2, 0xa669, 0xa66a, 0xc9cb, 0xa7a8, 0xcab1, 0xa961, 0xcc43, 0xa95f, 0xa960, 0xa95e, 0xd15a, 0xabb6, 0xabb5, 0xabb7, 0xabb4, 0xce61, 0xa962, 0xabb3, 0xae4d, 0xae4e, 0xae4f, 0xd4cd, 0xb3fe, 0xd8b4, 0xb0f8, 0xb6f8, 0xb9dd, 0xb9dc, 0xe16a, 0xbc5d, 0xbec4, 0xefc0, 0xf6da, 0xf7d4, 0xa46b, 0xa5a3, 0xa5a4, 0xc9d1, 0xa66c, 0xa66f, 0xc9cf, 0xc9cd, 0xa66e, 0xc9d0, 0xc9d2, 0xc9cc, 0xa671, 0xa670, 0xa66d, 0xa66b, 0xc9ce, 0xa7b3, 0xa7b0, 0xcab6, 0xcab9, 0xcab8, 0xa7aa, 0xa7b2, 0xa7af, 0xcab5, 0xcab3, 0xa7ae, 0xa7a9, 0xa7ac, 0xcab4, 0xcabb, 0xcab7, 0xa7ad, 0xa7b1, 0xa7b4, 0xcab2, 0xcaba, 0xa7ab, 0xa967, 0xa96f, 0xcc4f, 0xcc48, 0xa970, 0xcc53, 0xcc44, 0xcc4b, 0xa966, 0xcc45, 0xa964, 0xcc4c, 0xcc50, 0xa963, 0xcc51, 0xcc4a, 0xcc4d, 0xa972, 0xa969, 0xcc54, 0xcc52, 0xa96e, 0xa96c, 0xcc49, 0xa96b, 0xcc47, 0xcc46, 0xa96a, 0xa968, 0xa971, 0xa96d, 0xa965, 0xcc4e, 0xabb9, 0xabc0, 0xce6f, 0xabb8, 0xce67, 0xce63, 0xce73, 0xce62, 0xabbb, 0xce6c, 0xabbe, 0xabc1, 0xabbc, 0xce70, 0xabbf, 0xae56, 0xce76, 0xce64, 0xce66, 0xce6d, 0xce71, 0xce75, 0xce72, 0xce6b, 0xce6e, 0xce68, 0xabc3, 0xce6a, 0xce69, 0xce74, 0xabba, 0xce65, 0xabc2, 0xabbd, 0xae5c, 0xd162, 0xae5b, 0xd160, 0xae50, 0xae55, 0xd15f, 0xd15c, 0xd161, 0xae51, 0xd15b, 0xae54, 0xae52, 0xd163, 0xae53, 0xae57, 0xae58, 0xae5a, 0xae59, 0xd15d, 0xd15e, 0xd164, 0xd4d4, 0xb0f9, 0xd8c2, 0xd4d3, 0xd4e6, 0xb140, 0xd4e4, 0xb0fe, 0xb0fa, 0xd4ed, 0xd4dd, 0xd4e0, 0xb143, 0xd4ea, 0xd4e2, 0xb0fb, 0xb144, 0xd4e7, 0xd4e5, 0xd4d6, 0xd4eb, 0xd4df, 0xd4da, 0xd4d0, 0xd4ec, 0xd4dc, 0xd4cf, 0xb142, 0xd4e1, 0xd4ee, 0xd4de, 0xd4d2, 0xd4d7, 0xd4ce, 0xb141, 0xd4db, 0xd4d8, 0xb0fc, 0xd4d1, 0xd4e9, 0xb0fd, 0xd4d9, 0xd4d5, 0xd4e8, 0xb440, 0xd8bb, 0xd8b8, 0xd8c9, 0xd8bd, 0xd8ca, 0xb442, 0xd8c6, 0xd8c3, 0xd8c4, 0xd8c7, 0xd8cb, 0xd4e3, 0xd8cd, 0xdd47, 0xb443, 0xd8ce, 0xd8b6, 0xd8c0, 0xd8c5, 0xb441, 0xb444, 0xd8cc, 0xd8cf, 0xd8ba, 0xd8b7, 0xd8b9, 0xd8be, 0xd8bc, 0xb445, 0xd8c8, 0xd8bf, 0xd8c1, 0xd8b5, 0xdcfa, 0xdcf8, 0xb742, 0xb740, 0xdd43, 0xdcf9, 0xdd44, 0xdd40, 0xdcf7, 0xdd46, 0xdcf6, 0xdcfd, 0xb6fe, 0xb6fd, 0xb6fc, 0xdcfb, 0xdd41, 0xb6f9, 0xb741, 0xdcf4, 0xdcfe, 0xdcf3, 0xdcfc, 0xb6fa, 0xdd42, 0xdcf5, 0xb6fb, 0xdd45, 0xe16e, 0xb9e2, 0xb9e1, 0xb9e3, 0xe17a, 0xe170, 0xe176, 0xe16b, 0xe179, 0xe178, 0xe17c, 0xe175, 0xb9de, 0xe174, 0xb9e4, 0xe16d, 0xb9df, 0xe17b, 0xb9e0, 0xe16f, 0xe172, 0xe177, 0xe171, 0xe16c, 0xe173, 0xe555, 0xbc61, 0xe558, 0xe557, 0xe55a, 0xe55c, 0xbc5f, 0xe556, 0xe554, 0xe55d, 0xe55b, 0xe559, 0xe55f, 0xe55e, 0xbc63, 0xbc5e, 0xbc60, 0xbc62, 0xe560, 0xe957, 0xe956, 0xe955, 0xe958, 0xe951, 0xe952, 0xe95a, 0xe953, 0xbec5, 0xe95c, 0xe95b, 0xe954, 0xecd1, 0xc0a8, 0xeccf, 0xecd4, 0xecd3, 0xe959, 0xc0a7, 0xecd2, 0xecce, 0xecd6, 0xecd5, 0xc0a6, 0xecd0, 0xbec6, 0xc254, 0xefc1, 0xf1fa, 0xf1fb, 0xf1fc, 0xc45c, 0xc45d, 0xf443, 0xf5c8, 0xf5c7, 0xf6db, 0xf6dc, 0xf7d5, 0xf8a7, 0xa46c, 0xa46d, 0xa46e, 0xa4d5, 0xa5a5, 0xc9d3, 0xa672, 0xa673, 0xa7b7, 0xa7b8, 0xa7b6, 0xa7b5, 0xa973, 0xcc55, 0xa975, 0xa974, 0xcc56, 0xabc4, 0xae5d, 0xd165, 0xd4f0, 0xb145, 0xb447, 0xd4ef, 0xb446, 0xb9e5, 0xe17d, 0xbec7, 0xc0a9, 0xecd7, 0xc45e, 0xc570, 0xc972, 0xa5a6, 0xc973, 0xa676, 0xa674, 0xa675, 0xa677, 0xa7ba, 0xa7b9, 0xcabc, 0xa7bb, 0xcabd, 0xcc57, 0xcc58, 0xa976, 0xa978, 0xa97a, 0xa977, 0xa97b, 0xa979, 0xabc8, 0xabc5, 0xabc7, 0xabc9, 0xabc6, 0xd166, 0xce77, 0xd168, 0xd167, 0xae63, 0xae5f, 0xae60, 0xae62, 0xae64, 0xae61, 0xae66, 0xae65, 0xb14a, 0xd4f2, 0xd4f1, 0xb149, 0xb148, 0xb147, 0xb14b, 0xb146, 0xd8d5, 0xd8d2, 0xb449, 0xd8d1, 0xd8d6, 0xb44b, 0xd8d4, 0xb448, 0xb44a, 0xd8d3, 0xdd48, 0xdd49, 0xdd4a, 0xb9e6, 0xb9ee, 0xe17e, 0xb9e8, 0xb9ec, 0xe1a1, 0xb9ed, 0xb9e9, 0xb9ea, 0xb9e7, 0xb9eb, 0xbc66, 0xd8d0, 0xbc67, 0xbc65, 0xbc64, 0xe95d, 0xbec8, 0xecd8, 0xecd9, 0xc364, 0xc45f, 0xa46f, 0xa678, 0xabca, 0xd169, 0xae67, 0xb14e, 0xb14d, 0xb14c, 0xb44c, 0xb44d, 0xd8d7, 0xb9ef, 0xbec9, 0xa470, 0xc95c, 0xa4d6, 0xc974, 0xc9d4, 0xa679, 0xa97c, 0xdd4b, 0xa471, 0xa4d7, 0xc9d5, 0xcabe, 0xcabf, 0xa7bc, 0xd8d8, 0xb44e, 0xdd4c, 0xc0aa, 0xa472, 0xa4a8, 0xa4d8, 0xc975, 0xa5a7, 0xa7c0, 0xa7bf, 0xa7bd, 0xa7be, 0xcc59, 0xa97e, 0xa9a1, 0xcc5a, 0xa97d, 0xabce, 0xce78, 0xabcd, 0xabcb, 0xabcc, 0xae6a, 0xae68, 0xd16b, 0xae69, 0xd16a, 0xae5e, 0xd4f3, 0xb150, 0xb151, 0xb14f, 0xb9f0, 0xe1a2, 0xbc68, 0xbc69, 0xe561, 0xc0ab, 0xefc2, 0xefc3, 0xc4dd, 0xf8a8, 0xc94b, 0xa4d9, 0xa473, 0xc977, 0xc976, 0xa67a, 0xc9d7, 0xc9d8, 0xc9d6, 0xc9d9, 0xcac7, 0xcac2, 0xcac4, 0xcac6, 0xcac3, 0xa7c4, 0xcac0, 0xcac1, 0xa7c1, 0xa7c2, 0xcac5, 0xcac8, 0xa7c3, 0xcac9, 0xcc68, 0xcc62, 0xcc5d, 0xa9a3, 0xcc65, 0xcc63, 0xcc5c, 0xcc69, 0xcc6c, 0xcc67, 0xcc60, 0xa9a5, 0xcc66, 0xa9a6, 0xcc61, 0xcc64, 0xcc5b, 0xcc5f, 0xcc6b, 0xa9a7, 0xa9a8, 0xcc5e, 0xcc6a, 0xa9a2, 0xa9a4, 0xceab, 0xcea4, 0xceaa, 0xcea3, 0xcea5, 0xce7d, 0xce7b, 0xceac, 0xcea9, 0xce79, 0xabd0, 0xcea7, 0xcea8, 0xcea6, 0xce7c, 0xce7a, 0xabcf, 0xcea2, 0xce7e, 0xcea1, 0xcead, 0xae6f, 0xae6e, 0xd16c, 0xae6b, 0xd16e, 0xae70, 0xd16f, 0xae73, 0xae71, 0xd170, 0xceae, 0xd172, 0xae6d, 0xae6c, 0xd16d, 0xd171, 0xae72, 0xb153, 0xb152, 0xd4f5, 0xd4f9, 0xd4fb, 0xb154, 0xd4fe, 0xb158, 0xd541, 0xb15a, 0xb156, 0xb15e, 0xb15b, 0xd4f7, 0xb155, 0xd4f6, 0xd4f4, 0xd543, 0xd4f8, 0xb157, 0xd542, 0xb15c, 0xd4fd, 0xd4fc, 0xb15d, 0xd4fa, 0xb159, 0xd544, 0xd540, 0xd8e7, 0xd8ee, 0xd8e3, 0xb451, 0xd8df, 0xd8ef, 0xd8d9, 0xd8ec, 0xd8ea, 0xd8e4, 0xd8ed, 0xd8e6, 0xd8de, 0xd8f0, 0xd8dc, 0xd8e9, 0xd8da, 0xd8f1, 0xb452, 0xd8eb, 0xdd4f, 0xd8dd, 0xb44f, 0xd8e1, 0xb450, 0xd8e0, 0xd8e5, 0xd8e2, 0xd8e8, 0xdd53, 0xdd56, 0xdd4e, 0xdd50, 0xdd55, 0xdd54, 0xb743, 0xd8db, 0xdd52, 0xb744, 0xdd4d, 0xdd51, 0xe1a9, 0xe1b0, 0xe1a7, 0xe1ae, 0xe1a5, 0xe1ad, 0xe1b1, 0xe1a4, 0xe1a8, 0xe1a3, 0xb9f1, 0xe1a6, 0xb9f2, 0xe1ac, 0xe1ab, 0xe1aa, 0xe1af, 0xe565, 0xe567, 0xbc6b, 0xe568, 0xe563, 0xe562, 0xe56c, 0xe56a, 0xbc6a, 0xe56d, 0xe564, 0xe569, 0xe56b, 0xe566, 0xe961, 0xe966, 0xe960, 0xe965, 0xe95e, 0xe968, 0xe964, 0xe969, 0xe963, 0xe95f, 0xe967, 0xe96a, 0xe962, 0xecda, 0xc0af, 0xc0ad, 0xc0ac, 0xc0ae, 0xefc4, 0xf172, 0xf1fd, 0xf444, 0xf445, 0xc460, 0xf5c9, 0xc4de, 0xf5ca, 0xf6de, 0xc572, 0xc571, 0xf6dd, 0xc5c9, 0xf7d6, 0xa474, 0xa67b, 0xc9da, 0xcaca, 0xa8b5, 0xb15f, 0xa475, 0xa5aa, 0xa5a9, 0xa5a8, 0xa7c5, 0xae74, 0xdd57, 0xa476, 0xa477, 0xa478, 0xa4da, 0xabd1, 0xceaf, 0xb453, 0xa479, 0xc95d, 0xa5ab, 0xa5ac, 0xc978, 0xa67c, 0xcacb, 0xa7c6, 0xcacc, 0xa9ae, 0xcc6e, 0xa9ac, 0xa9ab, 0xcc6d, 0xa9a9, 0xcc6f, 0xa9aa, 0xa9ad, 0xabd2, 0xabd4, 0xceb3, 0xceb0, 0xceb1, 0xceb2, 0xceb4, 0xabd3, 0xd174, 0xd173, 0xae76, 0xae75, 0xb162, 0xd546, 0xb161, 0xb163, 0xb160, 0xb455, 0xd545, 0xb456, 0xd8f3, 0xb457, 0xd8f2, 0xb454, 0xdd5a, 0xdd5c, 0xb745, 0xdd5b, 0xdd59, 0xdd58, 0xe1b4, 0xb9f7, 0xb9f5, 0xb9f6, 0xe1b2, 0xe1b3, 0xb9f3, 0xe571, 0xe56f, 0xbc6d, 0xe570, 0xbc6e, 0xbc6c, 0xb9f4, 0xe96d, 0xe96b, 0xe96c, 0xe56e, 0xecdc, 0xc0b0, 0xecdb, 0xefc5, 0xefc6, 0xe96e, 0xf1fe, 0xa47a, 0xa5ad, 0xa67e, 0xc9db, 0xa67d, 0xa9af, 0xb746, 0xa4db, 0xa5ae, 0xabd5, 0xb458, 0xc979, 0xc97a, 0xc9dc, 0xa7c8, 0xcad0, 0xcace, 0xa7c9, 0xcacd, 0xcacf, 0xcad1, 0xa7c7, 0xa9b3, 0xa9b4, 0xa9b1, 0xa9b0, 0xceb8, 0xa9b2, 0xabd6, 0xceb7, 0xceb9, 0xceb6, 0xceba, 0xabd7, 0xae79, 0xd175, 0xd177, 0xae77, 0xd178, 0xae78, 0xd176, 0xceb5, 0xd547, 0xd54a, 0xd54b, 0xd548, 0xb167, 0xb166, 0xb164, 0xb165, 0xd549, 0xb168, 0xb45a, 0xb45b, 0xb45c, 0xdd5d, 0xdd5f, 0xdd61, 0xb748, 0xb747, 0xb459, 0xdd60, 0xdd5e, 0xe1b8, 0xe1b6, 0xe1bc, 0xb9f8, 0xe1bd, 0xe1ba, 0xb9f9, 0xe1b7, 0xe1b5, 0xe1bb, 0xbc70, 0xe573, 0xe1b9, 0xbc72, 0xe574, 0xbc71, 0xbc74, 0xe575, 0xbc6f, 0xbc73, 0xe973, 0xe971, 0xe970, 0xe972, 0xe96f, 0xc366, 0xf446, 0xf447, 0xf5cb, 0xf6df, 0xc655, 0xa9b5, 0xa7ca, 0xabd8, 0xa47b, 0xa4dc, 0xa5af, 0xc9dd, 0xa7cb, 0xcad2, 0xcebb, 0xabd9, 0xb9fa, 0xa47c, 0xa6a1, 0xb749, 0xa47d, 0xa4dd, 0xa4de, 0xa5b1, 0xa5b0, 0xc9de, 0xa6a2, 0xcad3, 0xa7cc, 0xcc71, 0xcc72, 0xcc73, 0xa9b6, 0xa9b7, 0xcc70, 0xa9b8, 0xabda, 0xcebc, 0xd17a, 0xae7a, 0xd179, 0xb169, 0xd54c, 0xb16a, 0xd54d, 0xb45d, 0xdd62, 0xe1bf, 0xe1be, 0xb9fb, 0xbc75, 0xe576, 0xbeca, 0xe974, 0xc0b1, 0xc573, 0xf7d8, 0xcc74, 0xcebd, 0xb16b, 0xd8f4, 0xb74a, 0xc255, 0xa7ce, 0xa7cd, 0xabdb, 0xd17b, 0xb16d, 0xb343, 0xb16e, 0xb16c, 0xb45e, 0xe1c0, 0xb9fc, 0xbc76, 0xc94c, 0xc9df, 0xcad5, 0xa7cf, 0xcad4, 0xa7d0, 0xa9bc, 0xcc77, 0xcc76, 0xa9bb, 0xa9b9, 0xa9ba, 0xcc75, 0xabdd, 0xcebe, 0xabe0, 0xabdc, 0xabe2, 0xabde, 0xabdf, 0xabe1, 0xae7d, 0xae7c, 0xae7b, 0xd54f, 0xb16f, 0xb172, 0xb170, 0xd54e, 0xb175, 0xb171, 0xd550, 0xb174, 0xb173, 0xd8f6, 0xd8f5, 0xb461, 0xb45f, 0xb460, 0xd8f7, 0xb74b, 0xdd64, 0xb74c, 0xdd63, 0xe577, 0xbc78, 0xe1c1, 0xbc77, 0xb9fd, 0xecde, 0xe975, 0xc0b2, 0xecdd, 0xf240, 0xf448, 0xf449, 0xa4df, 0xa5b2, 0xc97b, 0xa7d2, 0xa7d4, 0xc9e2, 0xcad8, 0xcad7, 0xcad6, 0xc9e1, 0xc9e0, 0xa6a4, 0xa7d3, 0xa7d1, 0xa6a3, 0xa9bd, 0xcc78, 0xa9be, 0xcadd, 0xcadf, 0xcade, 0xcc79, 0xcada, 0xa7d8, 0xa7d6, 0xcad9, 0xcadb, 0xcae1, 0xa7d5, 0xcadc, 0xcae5, 0xa9c0, 0xcae2, 0xa7d7, 0xcae0, 0xcae3, 0xa9bf, 0xa9c1, 0xcae4, 0xccaf, 0xcca2, 0xcc7e, 0xccae, 0xcca9, 0xabe7, 0xa9c2, 0xccaa, 0xccad, 0xabe3, 0xccac, 0xa9c3, 0xa9c8, 0xa9c6, 0xcca3, 0xcc7c, 0xcca5, 0xa9cd, 0xccb0, 0xabe4, 0xcca6, 0xabe5, 0xa9c9, 0xcca8, 0xcecd, 0xabe6, 0xcc7b, 0xa9ca, 0xabe8, 0xa9cb, 0xa9c7, 0xa9cc, 0xcca7, 0xcc7a, 0xccab, 0xa9c4, 0xcc7d, 0xcca4, 0xcca1, 0xa9c5, 0xcebf, 0xcec0, 0xceca, 0xd1a1, 0xcecb, 0xabee, 0xcece, 0xcec4, 0xabed, 0xcec6, 0xcec7, 0xcec9, 0xabe9, 0xaea3, 0xcec5, 0xcec1, 0xaea4, 0xcecf, 0xae7e, 0xd17d, 0xcec8, 0xd17c, 0xcec3, 0xcecc, 0xabec, 0xaea1, 0xabf2, 0xaea2, 0xced0, 0xd17e, 0xabeb, 0xaea6, 0xabf1, 0xabf0, 0xabef, 0xaea5, 0xced1, 0xaea7, 0xabea, 0xcec2, 0xb176, 0xd1a4, 0xd1a6, 0xd1a8, 0xaea8, 0xaeae, 0xd553, 0xd1ac, 0xd1a3, 0xb178, 0xd551, 0xaead, 0xaeab, 0xd1ae, 0xd552, 0xd1a5, 0xaeac, 0xd1a9, 0xaeaf, 0xd1ab, 0xaeaa, 0xd1aa, 0xd1ad, 0xd1a7, 0xaea9, 0xb179, 0xd1a2, 0xb177, 0xb17a, 0xd555, 0xd55e, 0xb464, 0xb17c, 0xb1a3, 0xb465, 0xd560, 0xb1aa, 0xd8f9, 0xd556, 0xb1a2, 0xb1a5, 0xb17e, 0xd554, 0xd562, 0xd565, 0xd949, 0xd563, 0xd8fd, 0xb1a1, 0xb1a8, 0xb1ac, 0xd55d, 0xd8f8, 0xd561, 0xb17b, 0xd8fa, 0xd564, 0xd8fc, 0xd559, 0xb462, 0xd557, 0xd558, 0xb1a7, 0xb1a6, 0xd55b, 0xb1ab, 0xd55f, 0xb1a4, 0xd55c, 0xb1a9, 0xb466, 0xb463, 0xd8fb, 0xd55a, 0xb17d, 0xb46b, 0xb46f, 0xd940, 0xb751, 0xb46d, 0xd944, 0xb471, 0xdd65, 0xd946, 0xb753, 0xb469, 0xb46c, 0xd947, 0xd948, 0xd94e, 0xb473, 0xb754, 0xd94a, 0xd94f, 0xd943, 0xb75e, 0xb755, 0xb472, 0xd941, 0xd950, 0xb75d, 0xb470, 0xb74e, 0xd94d, 0xb474, 0xd945, 0xd8fe, 0xb46a, 0xd942, 0xd94b, 0xb74d, 0xb752, 0xb467, 0xd94c, 0xb750, 0xb468, 0xb75c, 0xe1c3, 0xdd70, 0xdd68, 0xe1c2, 0xdd6c, 0xdd6e, 0xdd6b, 0xb75b, 0xdd6a, 0xb75f, 0xe1d2, 0xb75a, 0xba40, 0xdd71, 0xe1c4, 0xb758, 0xdd69, 0xdd6d, 0xb9fe, 0xb74f, 0xdd66, 0xdd67, 0xba41, 0xb757, 0xb759, 0xb756, 0xdd6f, 0xe1c8, 0xe1c9, 0xe1ce, 0xbc7d, 0xe1d5, 0xba47, 0xba46, 0xe1d0, 0xbc7c, 0xe1c5, 0xba45, 0xe1d4, 0xba43, 0xba44, 0xe1d1, 0xe5aa, 0xbc7a, 0xb46e, 0xe1d3, 0xbca3, 0xe1cb, 0xbc7b, 0xbca2, 0xe1c6, 0xe1ca, 0xe1c7, 0xe1cd, 0xba48, 0xbc79, 0xba42, 0xe57a, 0xe1cf, 0xbca1, 0xbca4, 0xe1cc, 0xbc7e, 0xe579, 0xe57e, 0xbece, 0xe578, 0xe9a3, 0xe5a9, 0xbca8, 0xbca6, 0xbecc, 0xe5a6, 0xe5a2, 0xbcac, 0xe978, 0xbcaa, 0xe5a1, 0xe976, 0xe5a5, 0xe5a8, 0xe57d, 0xbcab, 0xbca5, 0xe977, 0xbecd, 0xe5a7, 0xbca7, 0xbca9, 0xe5a4, 0xbcad, 0xe5a3, 0xe57c, 0xe57b, 0xbecb, 0xe5ab, 0xe97a, 0xece0, 0xbed0, 0xe9a2, 0xe97e, 0xece1, 0xbed1, 0xe9a1, 0xe97c, 0xc0b4, 0xecdf, 0xe979, 0xe97b, 0xc0b5, 0xbed3, 0xc0b3, 0xbed2, 0xc0b7, 0xe97d, 0xbecf, 0xefcf, 0xefc7, 0xece7, 0xefc8, 0xece3, 0xc256, 0xece5, 0xece4, 0xc0b6, 0xece2, 0xece6, 0xefd0, 0xefcc, 0xefce, 0xefc9, 0xefca, 0xefcd, 0xefcb, 0xc367, 0xc36a, 0xc369, 0xc368, 0xc461, 0xf44a, 0xc462, 0xf241, 0xc4df, 0xf5cc, 0xc4e0, 0xc574, 0xc5ca, 0xf7d9, 0xf7da, 0xf7db, 0xf9ba, 0xa4e0, 0xc97c, 0xa5b3, 0xa6a6, 0xa6a7, 0xa6a5, 0xa6a8, 0xa7da, 0xa7d9, 0xccb1, 0xa9cf, 0xa9ce, 0xd1af, 0xb1ad, 0xb1ae, 0xb475, 0xdd72, 0xb760, 0xb761, 0xdd74, 0xdd76, 0xdd75, 0xe1d7, 0xe1d6, 0xba49, 0xe1d8, 0xe5ac, 0xbcae, 0xbed4, 0xc0b8, 0xc257, 0xc0b9, 0xa4e1, 0xcae6, 0xccb2, 0xa9d1, 0xa9d0, 0xa9d2, 0xabf3, 0xced2, 0xced3, 0xd1b0, 0xaeb0, 0xb1af, 0xb476, 0xd951, 0xa4e2, 0xa47e, 0xa4e3, 0xc97d, 0xa5b7, 0xa5b6, 0xa5b4, 0xa5b5, 0xa6ab, 0xc9e9, 0xc9eb, 0xa6aa, 0xc9e3, 0xc9e4, 0xc9ea, 0xc9e6, 0xc9e8, 0xa6a9, 0xc9e5, 0xc9ec, 0xc9e7, 0xa7e1, 0xa7ea, 0xa7e8, 0xcaf0, 0xcaed, 0xcaf5, 0xa7e6, 0xcaf6, 0xa7df, 0xcaf3, 0xa7e5, 0xcaef, 0xcaee, 0xa7e3, 0xcaf4, 0xa7e4, 0xa9d3, 0xa7de, 0xcaf1, 0xcae7, 0xa7db, 0xa7ee, 0xcaec, 0xcaf2, 0xa7e0, 0xa7e2, 0xcae8, 0xcae9, 0xcaea, 0xa7ed, 0xa7e7, 0xa7ec, 0xcaeb, 0xa7eb, 0xa7dd, 0xa7dc, 0xa7e9, 0xa9e1, 0xccbe, 0xccb7, 0xa9dc, 0xa9ef, 0xccb3, 0xccba, 0xccbc, 0xccbf, 0xa9ea, 0xccbb, 0xccb4, 0xa9e8, 0xccb8, 0xccc0, 0xa9d9, 0xccbd, 0xa9e3, 0xa9e2, 0xccb6, 0xa9d7, 0xa9d8, 0xa9d6, 0xa9ee, 0xa9e6, 0xa9e0, 0xa9d4, 0xccb9, 0xa9df, 0xa9d5, 0xa9e7, 0xa9f0, 0xced4, 0xa9e4, 0xccb5, 0xa9da, 0xa9dd, 0xa9de, 0xa9ec, 0xa9ed, 0xa9eb, 0xa9e5, 0xa9e9, 0xa9db, 0xabf4, 0xceda, 0xac41, 0xabf8, 0xabfa, 0xac40, 0xcee6, 0xabfd, 0xd1b1, 0xaeb1, 0xac43, 0xced7, 0xcedf, 0xabfe, 0xcede, 0xcedb, 0xcee3, 0xcee5, 0xabf7, 0xabfb, 0xac42, 0xaeb3, 0xcee0, 0xabf9, 0xac45, 0xced9, 0xabfc, 0xaeb2, 0xabf6, 0xced6, 0xcedd, 0xced5, 0xced8, 0xcedc, 0xd1b2, 0xac44, 0xcee1, 0xcee2, 0xcee4, 0xabf5, 0xaec1, 0xd1be, 0xaebf, 0xaec0, 0xd1b4, 0xd1c4, 0xaeb6, 0xd566, 0xd1c6, 0xd1c0, 0xd1b7, 0xd1c9, 0xd1ba, 0xaebc, 0xd57d, 0xd1bd, 0xaebe, 0xaeb5, 0xd1cb, 0xd1bf, 0xaeb8, 0xd1b8, 0xd1b5, 0xd1b6, 0xaeb9, 0xd1c5, 0xd1cc, 0xaebb, 0xd1bc, 0xd1bb, 0xaec3, 0xaec2, 0xaeb4, 0xaeba, 0xaebd, 0xd1c8, 0xd1c2, 0xaeb7, 0xd1b3, 0xd1ca, 0xd1c1, 0xd1c3, 0xd1c7, 0xd567, 0xb1b7, 0xb1cb, 0xb1ca, 0xb1bf, 0xd579, 0xd575, 0xd572, 0xd5a6, 0xb1ba, 0xb1b2, 0xd577, 0xb4a8, 0xb1b6, 0xd5a1, 0xb1cc, 0xb1c9, 0xd57b, 0xd56a, 0xb1c8, 0xd5a3, 0xd569, 0xb1bd, 0xb1c1, 0xd5a2, 0xd573, 0xb1c2, 0xb1bc, 0xd568, 0xb478, 0xd5a5, 0xd571, 0xb1c7, 0xd574, 0xd5a4, 0xb1c6, 0xd952, 0xb1b3, 0xd56f, 0xb1b8, 0xb1c3, 0xb1be, 0xd578, 0xd56e, 0xd56c, 0xd57e, 0xb1b0, 0xb1c4, 0xb1b4, 0xb477, 0xd57c, 0xb1b5, 0xb1b1, 0xb1c0, 0xb1bb, 0xb1b9, 0xd570, 0xb1c5, 0xd56d, 0xd57a, 0xd576, 0xd954, 0xd953, 0xd56b, 0xd964, 0xb47a, 0xd96a, 0xd959, 0xd967, 0xdd77, 0xb47d, 0xd96b, 0xd96e, 0xb47c, 0xd95c, 0xd96d, 0xd96c, 0xb47e, 0xd955, 0xb479, 0xb4a3, 0xb4a1, 0xd969, 0xd95f, 0xb4a5, 0xd970, 0xd968, 0xd971, 0xb4ad, 0xb4ab, 0xd966, 0xd965, 0xd963, 0xd95d, 0xb4a4, 0xb4a2, 0xd1b9, 0xd956, 0xddb7, 0xd957, 0xb47b, 0xb4aa, 0xdd79, 0xb4a6, 0xb4a7, 0xd958, 0xd96f, 0xdd78, 0xd960, 0xd95b, 0xb4a9, 0xd961, 0xd95e, 0xb4ae, 0xb770, 0xdd7c, 0xddb1, 0xddb6, 0xddaa, 0xb76c, 0xddbb, 0xb769, 0xdd7a, 0xdd7b, 0xb762, 0xb76b, 0xdda4, 0xb76e, 0xb76f, 0xdda5, 0xddb2, 0xddb8, 0xb76a, 0xb764, 0xdda3, 0xdd7d, 0xddba, 0xdda8, 0xdda9, 0xdd7e, 0xddb4, 0xddab, 0xddb5, 0xddad, 0xb765, 0xe1d9, 0xb768, 0xb766, 0xddb9, 0xddb0, 0xddac, 0xdda1, 0xba53, 0xddaf, 0xb76d, 0xdda7, 0xdda6, 0xb767, 0xb763, 0xe1ee, 0xddb3, 0xddae, 0xdda2, 0xe1e9, 0xe1da, 0xe1e5, 0xe1ec, 0xba51, 0xb4ac, 0xe1ea, 0xba4c, 0xba4b, 0xe1f1, 0xe1db, 0xe1e8, 0xe1dc, 0xe1e7, 0xba4f, 0xe1eb, 0xd962, 0xe1f2, 0xe1e3, 0xba52, 0xe5ba, 0xbcaf, 0xe1f0, 0xe1ef, 0xba54, 0xe5ad, 0xbcb0, 0xe5ae, 0xe1df, 0xe1e0, 0xe1dd, 0xe1e2, 0xe1de, 0xe1f3, 0xba4e, 0xbcb1, 0xba50, 0xba55, 0xe1e1, 0xe1ed, 0xe1e6, 0xe5b1, 0xba4a, 0xbcb4, 0xe9aa, 0xe5b6, 0xe5b5, 0xe5b7, 0xe5b4, 0xbcb5, 0xbcbb, 0xbcb8, 0xbcb9, 0xe5af, 0xe5b2, 0xe5bc, 0xbcc1, 0xbcbf, 0xe5b3, 0xd95a, 0xbcb2, 0xe5b9, 0xe5b0, 0xbcc2, 0xe5b8, 0xba4d, 0xbcb7, 0xe1e4, 0xbcba, 0xbcbe, 0xbcc0, 0xbcbd, 0xbcbc, 0xbcb6, 0xe5bb, 0xbcb3, 0xbcc3, 0xbed8, 0xbed9, 0xe9a9, 0xbee2, 0xbedf, 0xbed6, 0xbedd, 0xe9ab, 0xbedb, 0xbed5, 0xbedc, 0xe9a8, 0xc0bb, 0xbed7, 0xbede, 0xc0ba, 0xe9a7, 0xe9a6, 0xbee0, 0xbee1, 0xe9a5, 0xe9a4, 0xc0bc, 0xe9ae, 0xbeda, 0xe9ac, 0xc0bd, 0xc0c2, 0xecea, 0xecec, 0xc0bf, 0xeced, 0xece9, 0xeceb, 0xc0c0, 0xc0c3, 0xece8, 0xc0be, 0xc0c1, 0xc259, 0xe9ad, 0xc258, 0xc25e, 0xefd4, 0xc25c, 0xc25d, 0xefd7, 0xefd3, 0xc25a, 0xefd1, 0xc36b, 0xefd5, 0xefd6, 0xefd2, 0xc25b, 0xf242, 0xf245, 0xf246, 0xf244, 0xf247, 0xc36c, 0xf243, 0xf44e, 0xc464, 0xf44d, 0xf44c, 0xf44b, 0xc463, 0xc465, 0xf5cd, 0xc4e2, 0xc4e1, 0xf6e1, 0xf6e0, 0xf6e3, 0xc5cb, 0xc575, 0xf7dd, 0xf6e2, 0xf7dc, 0xc5cd, 0xc5cc, 0xc5f3, 0xf8a9, 0xf8ef, 0xa4e4, 0xd972, 0xe9af, 0xa6ac, 0xcaf7, 0xa7f1, 0xa7ef, 0xa7f0, 0xccc1, 0xa9f1, 0xac46, 0xcee7, 0xcee8, 0xac47, 0xd1ce, 0xaec4, 0xaec5, 0xd1cd, 0xb1d3, 0xb1cf, 0xd5a7, 0xb1d6, 0xb1d5, 0xb1ce, 0xb1d1, 0xb1d4, 0xb1d0, 0xd976, 0xb1cd, 0xb4af, 0xb4b1, 0xb4b2, 0xd975, 0xd978, 0xb4b0, 0xd973, 0xd977, 0xd974, 0xb771, 0xddbc, 0xba56, 0xe1f4, 0xbee3, 0xbcc4, 0xe5bd, 0xbcc5, 0xbcc6, 0xe5bf, 0xe5be, 0xe5c0, 0xe9b1, 0xe9b0, 0xecef, 0xecee, 0xc0c4, 0xc0c5, 0xf248, 0xa4e5, 0xd979, 0xb4b4, 0xb4b3, 0xddbd, 0xefd8, 0xc4e3, 0xf7de, 0xa4e6, 0xaec6, 0xb1d8, 0xb1d7, 0xd97a, 0xd97b, 0xb772, 0xe1f5, 0xba57, 0xe9b2, 0xa4e7, 0xa5b8, 0xa9f2, 0xccc2, 0xcee9, 0xac48, 0xb1d9, 0xd97c, 0xb4b5, 0xb773, 0xe5c1, 0xe5c2, 0xecf0, 0xc25f, 0xf8f0, 0xa4e8, 0xccc3, 0xa9f3, 0xac49, 0xceea, 0xaec7, 0xd1d2, 0xd1d0, 0xd1d1, 0xaec8, 0xd1cf, 0xb1db, 0xb1dc, 0xd5a8, 0xb1dd, 0xb1da, 0xd97d, 0xd97e, 0xddbe, 0xba59, 0xba58, 0xecf1, 0xefd9, 0xf24a, 0xf249, 0xf44f, 0xc95e, 0xac4a, 0xa4e9, 0xa5b9, 0xa6ae, 0xa6ad, 0xa6af, 0xa6b0, 0xc9ee, 0xc9ed, 0xcaf8, 0xa7f2, 0xcafb, 0xcafa, 0xcaf9, 0xcafc, 0xa9f4, 0xccc9, 0xccc5, 0xccce, 0xa9fb, 0xa9f9, 0xccca, 0xccc6, 0xcccd, 0xa9f8, 0xaa40, 0xccc8, 0xccc4, 0xa9fe, 0xcccb, 0xa9f7, 0xcccc, 0xa9fa, 0xa9fc, 0xccd0, 0xcccf, 0xccc7, 0xa9f6, 0xa9f5, 0xa9fd, 0xceef, 0xcef5, 0xac50, 0xac4d, 0xceec, 0xcef1, 0xac53, 0xac4b, 0xcef0, 0xac4e, 0xac51, 0xcef3, 0xac4c, 0xcef8, 0xac4f, 0xac52, 0xceed, 0xcef2, 0xcef6, 0xceee, 0xceeb, 0xcef7, 0xcef4, 0xaed0, 0xaec9, 0xaecc, 0xaecf, 0xd1d5, 0xaeca, 0xd1d3, 0xaece, 0xaecb, 0xd1d6, 0xaecd, 0xd5ac, 0xb1df, 0xd5ab, 0xd5ad, 0xb1de, 0xb1e3, 0xd1d4, 0xd5aa, 0xd5ae, 0xb1e0, 0xd5a9, 0xb1e2, 0xb1e1, 0xd9a7, 0xd9a2, 0xb4b6, 0xb4ba, 0xb4b7, 0xd9a5, 0xd9a8, 0xb4b8, 0xb4b9, 0xb4be, 0xddc7, 0xd9a6, 0xb4bc, 0xd9a3, 0xd9a1, 0xb4bd, 0xd9a4, 0xb779, 0xddbf, 0xb776, 0xb777, 0xb775, 0xddc4, 0xddc3, 0xddc0, 0xb77b, 0xddc2, 0xb4bb, 0xddc6, 0xddc1, 0xb778, 0xb774, 0xb77a, 0xddc5, 0xba5c, 0xe1f8, 0xe1f7, 0xe1f6, 0xba5a, 0xba5b, 0xe5c5, 0xe5c8, 0xbcc8, 0xbcc7, 0xe5c9, 0xe5c4, 0xbcca, 0xe5c6, 0xbcc9, 0xe5c3, 0xe5c7, 0xbee9, 0xbee6, 0xe9bb, 0xe9ba, 0xe9b9, 0xe9b4, 0xe9b5, 0xbee7, 0xbee4, 0xbee8, 0xe9b3, 0xbee5, 0xe9b6, 0xe9b7, 0xe9bc, 0xe9b8, 0xecf2, 0xc0c7, 0xefdc, 0xc0c6, 0xefda, 0xefdb, 0xc260, 0xc36e, 0xf24b, 0xc36d, 0xf451, 0xf452, 0xc466, 0xf450, 0xc4e4, 0xf7df, 0xc5ce, 0xf8aa, 0xf8ab, 0xa4ea, 0xa6b1, 0xa6b2, 0xa7f3, 0xccd1, 0xac54, 0xaed1, 0xb1e4, 0xb0d2, 0xb4bf, 0xb4c0, 0xb3cc, 0xd9a9, 0xb77c, 0xe1fa, 0xe1f9, 0xa4eb, 0xa6b3, 0xccd2, 0xaa42, 0xaa41, 0xcef9, 0xcefa, 0xd1d7, 0xd1d8, 0xaed2, 0xaed3, 0xaed4, 0xd5af, 0xb1e6, 0xb4c2, 0xb4c1, 0xddc8, 0xdf7a, 0xe1fb, 0xe9bd, 0xc261, 0xc467, 0xa4ec, 0xa5bc, 0xa5bd, 0xa5bb, 0xa5be, 0xa5ba, 0xa6b6, 0xc9f6, 0xa6b5, 0xa6b7, 0xc9f1, 0xc9f0, 0xc9f3, 0xc9f2, 0xc9f5, 0xa6b4, 0xc9ef, 0xc9f4, 0xcafd, 0xa7fd, 0xcafe, 0xcb43, 0xa7fc, 0xcb47, 0xcb42, 0xcb45, 0xa7f5, 0xa7f6, 0xa7f7, 0xa7f8, 0xa840, 0xcb41, 0xa7fa, 0xa841, 0xcb40, 0xcb46, 0xa7f9, 0xcb44, 0xa7fb, 0xa7f4, 0xa7fe, 0xaa57, 0xccd4, 0xaa43, 0xaa4d, 0xaa4e, 0xaa46, 0xaa58, 0xaa48, 0xccdc, 0xaa53, 0xccd7, 0xaa49, 0xcce6, 0xcce7, 0xccdf, 0xccd8, 0xaa56, 0xcce4, 0xaa51, 0xaa4f, 0xcce5, 0xcce3, 0xccdb, 0xccd3, 0xccda, 0xaa4a, 0xaa50, 0xaa44, 0xccde, 0xccdd, 0xccd5, 0xaa52, 0xcce1, 0xccd6, 0xaa55, 0xcce8, 0xaa45, 0xaa4c, 0xccd9, 0xcce2, 0xaa54, 0xaa47, 0xaa4b, 0xcce0, 0xcf5b, 0xac5c, 0xac69, 0xcf56, 0xcf4c, 0xac62, 0xcf4a, 0xac5b, 0xcf45, 0xac65, 0xcf52, 0xcefe, 0xcf41, 0xcf44, 0xcefb, 0xcf51, 0xcf61, 0xac60, 0xcf46, 0xcf58, 0xcefd, 0xcf5f, 0xcf60, 0xcf63, 0xcf5a, 0xcf4b, 0xcf53, 0xac66, 0xac59, 0xac61, 0xac6d, 0xac56, 0xac58, 0xcf43, 0xac6a, 0xac63, 0xcf5d, 0xcf40, 0xac6c, 0xac67, 0xcf49, 0xac6b, 0xcf50, 0xcf48, 0xac64, 0xcf5c, 0xcf54, 0xac5e, 0xcf62, 0xcf47, 0xac5a, 0xcf59, 0xcf4f, 0xac5f, 0xcf55, 0xac57, 0xcefc, 0xac68, 0xaee3, 0xac5d, 0xcf4e, 0xcf4d, 0xcf42, 0xcf5e, 0xcf57, 0xac55, 0xd1ec, 0xaeea, 0xd1ed, 0xd1e1, 0xaedf, 0xaeeb, 0xd1da, 0xd1e3, 0xd1eb, 0xd1d9, 0xd1f4, 0xaed5, 0xd1f3, 0xd1ee, 0xd1ef, 0xaedd, 0xaee8, 0xd1e5, 0xd1e6, 0xd1f0, 0xd1e7, 0xd1e2, 0xd1dc, 0xd1dd, 0xd1ea, 0xd1e4, 0xaed6, 0xaeda, 0xd1f2, 0xd1de, 0xaee6, 0xaee2, 0xaee5, 0xaeec, 0xaedb, 0xaee7, 0xd1e9, 0xaee9, 0xaed8, 0xaed7, 0xd1db, 0xd1df, 0xaee0, 0xd1f1, 0xd1e8, 0xd1e0, 0xaee4, 0xaee1, 0xaed9, 0xaedc, 0xd5c4, 0xd5b4, 0xd5b5, 0xd5b9, 0xd5c8, 0xd5c5, 0xd5be, 0xd5bd, 0xb1ed, 0xd5c1, 0xd5d0, 0xd5b0, 0xd5d1, 0xd5c3, 0xd5d5, 0xd5c9, 0xb1ec, 0xd5c7, 0xb1e7, 0xb1fc, 0xb1f2, 0xb1f6, 0xb1f5, 0xd5b1, 0xd5ce, 0xd5d4, 0xd5cc, 0xd5d3, 0xd5c0, 0xd5b2, 0xd5d2, 0xd5c2, 0xb1ea, 0xb1f7, 0xd5cb, 0xb1f0, 0xd5ca, 0xd5b3, 0xb1f8, 0xb1fa, 0xd5cd, 0xb1fb, 0xb1e9, 0xd5ba, 0xd5cf, 0xb1ef, 0xb1f9, 0xd5bc, 0xd5c6, 0xd5b7, 0xd5bb, 0xb1f4, 0xd5b6, 0xb1e8, 0xb1f1, 0xb1ee, 0xd5bf, 0xaede, 0xd9c0, 0xb1eb, 0xb1f3, 0xd9c3, 0xd9d9, 0xd9ce, 0xb4d6, 0xb4d1, 0xd9bd, 0xb4d2, 0xd9cd, 0xd9c6, 0xd9d3, 0xb4ce, 0xd9ab, 0xd9d5, 0xb4c4, 0xd9b3, 0xb4c7, 0xb4c6, 0xb4d7, 0xd9ad, 0xd9cf, 0xd9d0, 0xb4c9, 0xb4c5, 0xd9bb, 0xb4d0, 0xd9b6, 0xd9d1, 0xb4cc, 0xd9c9, 0xd9d6, 0xd9b0, 0xd9b5, 0xd9af, 0xb4cb, 0xd9c2, 0xddde, 0xd9b1, 0xb4cf, 0xd9ba, 0xd9d2, 0xb4ca, 0xd9b7, 0xd9b4, 0xd9c5, 0xb4cd, 0xb4c3, 0xb4d9, 0xd9c8, 0xd9c7, 0xd9ac, 0xb4c8, 0xd9d4, 0xd9bc, 0xd9be, 0xd9cb, 0xd9ca, 0xd9aa, 0xb4d3, 0xb4d5, 0xd9b2, 0xd9b9, 0xd9c1, 0xb4d4, 0xd9b8, 0xd9c4, 0xd9d7, 0xd9cc, 0xd9d8, 0xd9ae, 0xddf2, 0xb7a6, 0xddf0, 0xdddb, 0xdde0, 0xddd9, 0xddec, 0xddcb, 0xddd2, 0xddea, 0xddf4, 0xdddc, 0xddcf, 0xdde2, 0xdde7, 0xddd3, 0xdde4, 0xddd0, 0xddd7, 0xddd8, 0xb7a8, 0xddeb, 0xdde9, 0xddcc, 0xddee, 0xddef, 0xddf1, 0xb7ac, 0xb7a4, 0xd5b8, 0xddd4, 0xdde6, 0xddd5, 0xb7a1, 0xb7b1, 0xdded, 0xb7af, 0xb7ab, 0xddca, 0xb7a3, 0xddcd, 0xb7b0, 0xdddd, 0xddc9, 0xb7a9, 0xdde1, 0xddd1, 0xb7aa, 0xddda, 0xb77e, 0xb4d8, 0xdde3, 0xd9bf, 0xddce, 0xdde8, 0xb7a5, 0xdde5, 0xb7a2, 0xdddf, 0xb7ad, 0xddd6, 0xddf3, 0xb7a7, 0xdec6, 0xb7ae, 0xe24a, 0xe248, 0xe25e, 0xe246, 0xe258, 0xb77d, 0xba5f, 0xe242, 0xe25d, 0xe247, 0xe255, 0xba64, 0xba5d, 0xe25b, 0xe240, 0xe25a, 0xba6f, 0xe251, 0xe261, 0xba6d, 0xe249, 0xba5e, 0xe24b, 0xe259, 0xba67, 0xe244, 0xba6b, 0xba61, 0xe24d, 0xe243, 0xe1fc, 0xe257, 0xba68, 0xe260, 0xe1fd, 0xba65, 0xe253, 0xba66, 0xe245, 0xe250, 0xe24c, 0xe24e, 0xba60, 0xe25f, 0xba6e, 0xe24f, 0xe262, 0xe1fe, 0xe254, 0xba63, 0xba6c, 0xba6a, 0xe241, 0xe256, 0xba69, 0xba62, 0xe252, 0xe25c, 0xe5d5, 0xe5d1, 0xe5cd, 0xe5e1, 0xe5de, 0xbccd, 0xe5e5, 0xe5d4, 0xbcd8, 0xe5db, 0xe5d0, 0xe5da, 0xbcd5, 0xe5ee, 0xe5eb, 0xe5dd, 0xe5ce, 0xe5e2, 0xe5e4, 0xbcd1, 0xe5d8, 0xe5d3, 0xe5ca, 0xbcce, 0xbcd6, 0xe5e7, 0xbcd7, 0xe5cb, 0xe5ed, 0xe5e0, 0xe5e6, 0xbcd4, 0xe5e3, 0xe5ea, 0xbcd9, 0xbcd3, 0xe5dc, 0xe5cf, 0xe5ef, 0xe5cc, 0xe5e8, 0xbcd0, 0xe5d6, 0xe5d7, 0xbccf, 0xbccc, 0xe5d2, 0xbcd2, 0xbccb, 0xe5e9, 0xe5ec, 0xe5d9, 0xe9ca, 0xe9c2, 0xe9be, 0xbef6, 0xbeeb, 0xbef0, 0xbeec, 0xe9cc, 0xe9d7, 0xbeea, 0xe9c4, 0xe9cd, 0xe5df, 0xe9ce, 0xbef1, 0xe9dd, 0xbef5, 0xbef8, 0xe9c0, 0xbef4, 0xe9db, 0xe9dc, 0xe9d2, 0xe9d1, 0xe9c9, 0xe9d3, 0xe9da, 0xe9d9, 0xbeef, 0xbeed, 0xe9cb, 0xe9c8, 0xe9c5, 0xe9d8, 0xbef7, 0xe9d6, 0xbef3, 0xbef2, 0xe9d0, 0xe9bf, 0xe9c1, 0xe9c3, 0xe9d5, 0xe9cf, 0xbeee, 0xe9c6, 0xe9d4, 0xe9c7, 0xc0cf, 0xed45, 0xc0c8, 0xecf5, 0xed41, 0xc0ca, 0xed48, 0xecfc, 0xecf7, 0xed49, 0xecf3, 0xecfe, 0xc0d1, 0xed44, 0xed4a, 0xecfd, 0xc0c9, 0xed40, 0xecf4, 0xc0d0, 0xed47, 0xecf9, 0xc0cc, 0xecfb, 0xecf8, 0xc0d2, 0xecfa, 0xc0cb, 0xc0ce, 0xed43, 0xecf6, 0xed46, 0xed42, 0xc263, 0xefe7, 0xc268, 0xc269, 0xc262, 0xefe6, 0xefe3, 0xefe4, 0xc266, 0xefde, 0xefe2, 0xc265, 0xefdf, 0xc267, 0xc264, 0xefdd, 0xefe1, 0xefe5, 0xf251, 0xf24e, 0xf257, 0xf256, 0xf254, 0xf24f, 0xc372, 0xf250, 0xc371, 0xc0cd, 0xf253, 0xc370, 0xf258, 0xf252, 0xf24d, 0xefe0, 0xc36f, 0xf24c, 0xf456, 0xf455, 0xf255, 0xc468, 0xf459, 0xf45a, 0xf454, 0xf458, 0xf453, 0xf5d1, 0xf457, 0xc4e7, 0xc4e5, 0xf5cf, 0xf5d2, 0xf5ce, 0xf5d0, 0xc4e6, 0xf6e5, 0xf6e6, 0xc576, 0xf6e4, 0xf7e2, 0xc5cf, 0xf7e0, 0xf7e1, 0xf8ac, 0xc656, 0xf8f3, 0xf8f1, 0xf8f2, 0xf8f4, 0xf9bb, 0xa4ed, 0xa6b8, 0xaa59, 0xcce9, 0xcf64, 0xd1f5, 0xd1f7, 0xd1f6, 0xd1f8, 0xb1fd, 0xd5d7, 0xd1f9, 0xd5d6, 0xd5d8, 0xd5d9, 0xd9da, 0xb4db, 0xd9db, 0xd9dd, 0xb4dc, 0xb4da, 0xd9dc, 0xddfa, 0xddf8, 0xddf7, 0xddf6, 0xddf5, 0xb7b2, 0xddf9, 0xba70, 0xe263, 0xe265, 0xba71, 0xe264, 0xbcdb, 0xbcda, 0xe5f0, 0xe9df, 0xe9de, 0xe9e0, 0xbef9, 0xed4b, 0xc0d3, 0xefe8, 0xc26a, 0xf259, 0xc577, 0xa4ee, 0xa5bf, 0xa6b9, 0xa842, 0xaa5a, 0xaa5b, 0xac6e, 0xd1fa, 0xb7b3, 0xe6d1, 0xbefa, 0xc26b, 0xa4ef, 0xa6ba, 0xcceb, 0xaa5c, 0xccea, 0xcf65, 0xac6f, 0xcf66, 0xac70, 0xd1fc, 0xaeee, 0xaeed, 0xd5de, 0xd5dc, 0xd5dd, 0xd5db, 0xd5da, 0xd9de, 0xd9e1, 0xb4de, 0xd9df, 0xb4dd, 0xd9e0, 0xddfb, 0xe266, 0xe267, 0xe268, 0xe5f3, 0xe5f2, 0xbcdc, 0xe5f1, 0xe5f4, 0xe9e1, 0xe9e2, 0xe9e3, 0xed4c, 0xc0d4, 0xc26c, 0xf25a, 0xc4e8, 0xc95f, 0xac71, 0xcf67, 0xaeef, 0xb1fe, 0xb4df, 0xd9e2, 0xb7b5, 0xb7b4, 0xe269, 0xe26a, 0xbcdd, 0xbcde, 0xe9e5, 0xe9e4, 0xefe9, 0xf7e3, 0xa4f0, 0xc960, 0xa5c0, 0xa843, 0xcb48, 0xac72, 0xb7b6, 0xa4f1, 0xcf68, 0xac73, 0xcf69, 0xc0d5, 0xa4f2, 0xccec, 0xcf6a, 0xd242, 0xd241, 0xd1fe, 0xd1fd, 0xd243, 0xd240, 0xb240, 0xb241, 0xb4e0, 0xd9e3, 0xd9e4, 0xd9e5, 0xde41, 0xde42, 0xde40, 0xddfd, 0xddfe, 0xb7b7, 0xe26b, 0xe5f7, 0xe5f6, 0xe5f5, 0xe5f8, 0xe9e7, 0xe9e6, 0xbefb, 0xe9e8, 0xc0d6, 0xed4d, 0xefea, 0xf25b, 0xf6e7, 0xa4f3, 0xa5c2, 0xa5c1, 0xaa5d, 0xc961, 0xc97e, 0xa6bb, 0xc9f7, 0xcb49, 0xcb4a, 0xaa5e, 0xcced, 0xac74, 0xcf6b, 0xcf6c, 0xaef0, 0xaef4, 0xd244, 0xaef3, 0xaef1, 0xaef2, 0xd5df, 0xb242, 0xb4e3, 0xb4e1, 0xb4e2, 0xd9e6, 0xba72, 0xa4f4, 0xc9a1, 0xa5c3, 0xc9a4, 0xa5c6, 0xc9a3, 0xa5c5, 0xa5c4, 0xa844, 0xc9a2, 0xc9f8, 0xc9fc, 0xc9fe, 0xca40, 0xa6c5, 0xa6c6, 0xc9fb, 0xa6c1, 0xc9f9, 0xc9fd, 0xa6c2, 0xa6bd, 0xa6be, 0xa6c4, 0xc9fa, 0xa6bc, 0xa845, 0xa6bf, 0xa6c0, 0xa6c3, 0xcb5b, 0xcb59, 0xcb4c, 0xa851, 0xcb53, 0xa84c, 0xcb4d, 0xcb55, 0xcb52, 0xa84f, 0xcb51, 0xa856, 0xcb5a, 0xa858, 0xa85a, 0xcb4b, 0xa84d, 0xcb5c, 0xa854, 0xa857, 0xcd45, 0xa847, 0xa85e, 0xa855, 0xcb4e, 0xa84a, 0xa859, 0xcb56, 0xa848, 0xa849, 0xcd43, 0xcb4f, 0xa850, 0xa85b, 0xcb5d, 0xcb50, 0xa84e, 0xa853, 0xccee, 0xa85c, 0xcb57, 0xa852, 0xa85d, 0xa846, 0xcb54, 0xa84b, 0xcb58, 0xcd44, 0xaa6a, 0xaa7a, 0xccf5, 0xaa71, 0xcd4b, 0xaa62, 0xaa65, 0xcd42, 0xccf3, 0xccf7, 0xaa6d, 0xaa6f, 0xccfa, 0xaa76, 0xaa68, 0xaa66, 0xaa67, 0xaa75, 0xcd47, 0xaa70, 0xccf9, 0xccfb, 0xaa6e, 0xaa73, 0xccfc, 0xcd4a, 0xac75, 0xaa79, 0xaa63, 0xcd49, 0xcd4d, 0xccf8, 0xcd4f, 0xcd40, 0xaa6c, 0xccf4, 0xaa6b, 0xaa7d, 0xaa72, 0xccf2, 0xcf75, 0xaa78, 0xaa7c, 0xcd41, 0xcd46, 0xaa7e, 0xaa77, 0xaa69, 0xaa5f, 0xaa64, 0xccf6, 0xaa60, 0xcd4e, 0xccf0, 0xccef, 0xccfd, 0xccf1, 0xaa7b, 0xaef5, 0xaa74, 0xccfe, 0xaa61, 0xaca6, 0xcd4c, 0xcf7c, 0xcfa1, 0xcfa4, 0xcf77, 0xcfa7, 0xcfaa, 0xcfac, 0xcf74, 0xac76, 0xac7b, 0xd249, 0xacad, 0xcfa5, 0xcfad, 0xcf7b, 0xcf73, 0xd264, 0xac7e, 0xcfa2, 0xcf78, 0xcf7a, 0xaca5, 0xcf7d, 0xac7d, 0xcf70, 0xcfa8, 0xcfab, 0xac7a, 0xaca8, 0xcf6d, 0xacaa, 0xac78, 0xacae, 0xcfa9, 0xcf6f, 0xacab, 0xd25e, 0xcd48, 0xac7c, 0xac77, 0xcf76, 0xcf6e, 0xacac, 0xaca4, 0xcfa3, 0xaca9, 0xaca7, 0xcf79, 0xaca1, 0xcf71, 0xaca2, 0xaca3, 0xcf72, 0xcfa6, 0xac79, 0xcf7e, 0xd24c, 0xaefd, 0xaf43, 0xd255, 0xd25b, 0xd257, 0xd24a, 0xd24d, 0xd246, 0xd247, 0xaf4a, 0xaefa, 0xd256, 0xd25f, 0xaf45, 0xaef6, 0xaf40, 0xd24e, 0xaf42, 0xd24f, 0xd259, 0xaf44, 0xd268, 0xd248, 0xaefc, 0xaefb, 0xaf48, 0xd245, 0xd266, 0xd25a, 0xd267, 0xd261, 0xd253, 0xd262, 0xd25c, 0xd265, 0xd263, 0xaf49, 0xd254, 0xaef9, 0xaef8, 0xaf41, 0xaf47, 0xd260, 0xaf46, 0xd251, 0xb243, 0xd269, 0xd250, 0xd24b, 0xaefe, 0xaf4b, 0xaef7, 0xd258, 0xd25d, 0xb265, 0xd5e1, 0xd5e5, 0xb252, 0xb250, 0xb247, 0xd5e3, 0xd5e2, 0xb25b, 0xd5e8, 0xb255, 0xd5fa, 0xd647, 0xb244, 0xd5f7, 0xd5f0, 0xb267, 0xd5e0, 0xd5fc, 0xb264, 0xb258, 0xb263, 0xb24e, 0xd5ec, 0xd5fe, 0xd5f6, 0xb24f, 0xb249, 0xd645, 0xd5fd, 0xd640, 0xb251, 0xb259, 0xd642, 0xd5ea, 0xd5fb, 0xd5ef, 0xd644, 0xb25e, 0xb246, 0xb25c, 0xd5f4, 0xd5f2, 0xd5f3, 0xb253, 0xd5ee, 0xd5ed, 0xb248, 0xd5e7, 0xd646, 0xb24a, 0xd5f1, 0xb268, 0xb262, 0xd5e6, 0xb25f, 0xb25d, 0xb266, 0xd5f8, 0xb261, 0xd252, 0xd5f9, 0xb260, 0xd641, 0xb245, 0xd5f5, 0xb257, 0xd5e9, 0xb256, 0xb254, 0xb24c, 0xb24b, 0xd9e7, 0xd643, 0xd5eb, 0xd9fc, 0xb24d, 0xb541, 0xb25a, 0xb4ee, 0xd9f6, 0xb4fc, 0xd9ea, 0xb4eb, 0xb4e7, 0xda49, 0xb4ed, 0xb4f1, 0xb4ec, 0xb4f5, 0xda4d, 0xda44, 0xd9f1, 0xb4fa, 0xb4f4, 0xd9fd, 0xb4e4, 0xda4a, 0xda43, 0xb4e8, 0xd9f7, 0xb4f7, 0xda55, 0xda56, 0xb4e5, 0xda48, 0xb4f9, 0xd9fb, 0xd9ed, 0xd9ee, 0xb4fd, 0xd9f2, 0xd9f9, 0xd9f3, 0xb4fb, 0xb544, 0xd9ef, 0xd9e8, 0xd9e9, 0xd9eb, 0xb4ea, 0xd9f8, 0xb4f8, 0xb542, 0xd9fa, 0xda53, 0xda4b, 0xb4e6, 0xda51, 0xb4f2, 0xb4f0, 0xda57, 0xb4ef, 0xda41, 0xd9f4, 0xd9fe, 0xb547, 0xda45, 0xda42, 0xd9f0, 0xb543, 0xda4f, 0xda4c, 0xda54, 0xb4e9, 0xda40, 0xb546, 0xda47, 0xb4f3, 0xb4f6, 0xda46, 0xb545, 0xd9f5, 0xd5e4, 0xda50, 0xda4e, 0xda52, 0xd9ec, 0xb540, 0xde61, 0xde60, 0xde46, 0xb7bd, 0xde5f, 0xde49, 0xde4a, 0xb7c7, 0xde68, 0xb7c2, 0xde5e, 0xde43, 0xb7c8, 0xb7be, 0xde52, 0xde48, 0xde4b, 0xde63, 0xb7b8, 0xde6a, 0xde62, 0xb7c1, 0xde57, 0xb7cc, 0xb7cb, 0xb7c5, 0xde69, 0xb7b9, 0xde55, 0xde4c, 0xde59, 0xde65, 0xb7cd, 0xb7bb, 0xde54, 0xde4d, 0xb7c4, 0xb7c3, 0xde50, 0xde5a, 0xde64, 0xde47, 0xde51, 0xb7bc, 0xde5b, 0xb7c9, 0xb7c0, 0xde4e, 0xb7bf, 0xde45, 0xde53, 0xde67, 0xb4fe, 0xbab0, 0xde56, 0xe26c, 0xde58, 0xde66, 0xb7c6, 0xde4f, 0xb7ba, 0xb7ca, 0xbcf0, 0xde44, 0xde5d, 0xde5c, 0xe2aa, 0xbaad, 0xe27d, 0xe2a4, 0xbaa2, 0xe26e, 0xbaaf, 0xba77, 0xe26d, 0xe2b0, 0xbab1, 0xe271, 0xe2a3, 0xe273, 0xe2b3, 0xe2af, 0xba75, 0xbaa1, 0xe653, 0xbaae, 0xba7d, 0xe26f, 0xe2ae, 0xbaa3, 0xe2ab, 0xe2b8, 0xe275, 0xe27e, 0xe2b6, 0xe2ac, 0xba7c, 0xe27c, 0xba76, 0xba74, 0xbaa8, 0xe27a, 0xe277, 0xe278, 0xe2b2, 0xe2b7, 0xe2b5, 0xba7a, 0xe2b9, 0xba7e, 0xbaa7, 0xe270, 0xe5fa, 0xe279, 0xba78, 0xbaac, 0xbaa9, 0xba7b, 0xe2a5, 0xe274, 0xbaaa, 0xe2a7, 0xbaa4, 0xbaa6, 0xba73, 0xe2a9, 0xe2a1, 0xe272, 0xbaa5, 0xe2b1, 0xe2b4, 0xe27b, 0xe2a8, 0xba79, 0xbcdf, 0xe2a6, 0xe5f9, 0xe2ad, 0xe276, 0xe644, 0xe64e, 0xbce2, 0xe64d, 0xe659, 0xbce4, 0xe64b, 0xe64f, 0xbcef, 0xe646, 0xbce7, 0xe652, 0xe9f0, 0xbcf3, 0xbcf2, 0xe654, 0xe643, 0xe65e, 0xbced, 0xbce3, 0xe657, 0xe65b, 0xe660, 0xe655, 0xe649, 0xbce6, 0xbce9, 0xbcf1, 0xbcec, 0xe64c, 0xe2a2, 0xe648, 0xe65f, 0xbce8, 0xbceb, 0xe661, 0xbce0, 0xe656, 0xe5fb, 0xe65c, 0xc0df, 0xe64a, 0xbce1, 0xe645, 0xbce5, 0xe5fc, 0xbaab, 0xe641, 0xe65a, 0xe642, 0xe640, 0xbcea, 0xe658, 0xe5fe, 0xe651, 0xe650, 0xe65d, 0xe647, 0xbcee, 0xe9f3, 0xbf49, 0xbefe, 0xea40, 0xe9eb, 0xbf41, 0xe9f7, 0xbf48, 0xbf43, 0xe9f5, 0xed4f, 0xe9fb, 0xea42, 0xe9fa, 0xe9e9, 0xe9f8, 0xea44, 0xea46, 0xbefd, 0xea45, 0xbf44, 0xbf4a, 0xbf47, 0xe9fe, 0xbf46, 0xe9f9, 0xe9ed, 0xe9f2, 0xe9fd, 0xbf45, 0xbf42, 0xbefc, 0xbf40, 0xe9f1, 0xe5fd, 0xe9ec, 0xe9ef, 0xea41, 0xe9f4, 0xe9ea, 0xed4e, 0xea43, 0xe9ee, 0xe9fc, 0xed51, 0xc0e3, 0xc0d7, 0xc0db, 0xed53, 0xed59, 0xed57, 0xc0d9, 0xc0da, 0xc0e1, 0xed5a, 0xed52, 0xc0dc, 0xed56, 0xed55, 0xed5b, 0xc0e2, 0xc0dd, 0xc0e0, 0xed54, 0xc0e4, 0xc0de, 0xc0e5, 0xc0d8, 0xed58, 0xed50, 0xeff7, 0xc271, 0xeff4, 0xeff6, 0xc26f, 0xeff2, 0xeff3, 0xefee, 0xe9f6, 0xefef, 0xc270, 0xefeb, 0xc26d, 0xeff8, 0xc26e, 0xefec, 0xefed, 0xeff1, 0xc273, 0xc272, 0xeff0, 0xc378, 0xf25f, 0xf265, 0xc379, 0xf25c, 0xc376, 0xc373, 0xf267, 0xc377, 0xc374, 0xf25e, 0xf261, 0xf262, 0xf263, 0xf266, 0xeff5, 0xf25d, 0xc375, 0xf264, 0xf268, 0xf260, 0xf45d, 0xc46a, 0xf460, 0xc46b, 0xf468, 0xf45f, 0xf45c, 0xf45e, 0xf462, 0xf465, 0xf464, 0xf467, 0xf45b, 0xc469, 0xf463, 0xf466, 0xf469, 0xf461, 0xf5d3, 0xf5d4, 0xf5d8, 0xf5d9, 0xf5d6, 0xf5d7, 0xf5d5, 0xc4e9, 0xc578, 0xf6eb, 0xf6e8, 0xf6e9, 0xf6ea, 0xc579, 0xf7e5, 0xf7e4, 0xf8af, 0xc5f4, 0xf8ad, 0xf8b0, 0xf8ae, 0xf8f5, 0xc657, 0xc665, 0xf9a3, 0xf96c, 0xf9a2, 0xf9d0, 0xf9d1, 0xa4f5, 0xa6c7, 0xca41, 0xcb5e, 0xa85f, 0xa862, 0xcb5f, 0xa860, 0xa861, 0xcd58, 0xcd5a, 0xcd55, 0xcd52, 0xcd54, 0xaaa4, 0xaaa2, 0xcd56, 0xaaa3, 0xcd53, 0xcd50, 0xaaa1, 0xcd57, 0xcd51, 0xaaa5, 0xcd59, 0xcfaf, 0xcfb3, 0xacb7, 0xcfb6, 0xacaf, 0xacb2, 0xacb4, 0xacb6, 0xacb3, 0xcfb2, 0xcfb1, 0xacb1, 0xcfb4, 0xcfb5, 0xcfae, 0xacb5, 0xacb0, 0xcfb0, 0xd277, 0xd278, 0xd279, 0xaf50, 0xaf4c, 0xd26e, 0xd276, 0xd27b, 0xaf51, 0xd26c, 0xd272, 0xd26b, 0xd275, 0xd271, 0xaf4d, 0xaf4f, 0xd27a, 0xd26a, 0xd26d, 0xd273, 0xd274, 0xd27c, 0xd270, 0xaf4e, 0xb26d, 0xd64e, 0xd650, 0xd64c, 0xd658, 0xd64a, 0xd657, 0xb269, 0xd648, 0xda5b, 0xd652, 0xb26c, 0xd653, 0xd656, 0xd65a, 0xd64f, 0xd654, 0xb26a, 0xb26b, 0xd659, 0xd64d, 0xd649, 0xd65b, 0xd651, 0xd655, 0xd64b, 0xb548, 0xb549, 0xda65, 0xb54f, 0xda59, 0xda62, 0xda58, 0xb54c, 0xda60, 0xda5e, 0xda5f, 0xb54a, 0xda63, 0xda5c, 0xda5a, 0xb54b, 0xda5d, 0xda61, 0xb54d, 0xda64, 0xde70, 0xde77, 0xde79, 0xdea1, 0xb7da, 0xde6b, 0xb7d2, 0xde7a, 0xb7d7, 0xdea2, 0xb7ce, 0xde7d, 0xde6d, 0xde7e, 0xde6c, 0xb7dc, 0xde78, 0xb7cf, 0xdea3, 0xb7d4, 0xde71, 0xb7d9, 0xde7c, 0xde6f, 0xde76, 0xde72, 0xde6e, 0xb7d1, 0xb7d8, 0xb7d6, 0xb7d3, 0xb7db, 0xb7d0, 0xde75, 0xb7d5, 0xb54e, 0xde7b, 0xde73, 0xde74, 0xe2c1, 0xbab4, 0xe2bd, 0xe2c3, 0xe2bf, 0xbab6, 0xe2be, 0xe2c2, 0xe2ba, 0xe2bc, 0xbab5, 0xe2c0, 0xe2bb, 0xbab7, 0xbab2, 0xe2c4, 0xbab3, 0xe667, 0xe664, 0xe670, 0xe66a, 0xe66c, 0xbcf4, 0xe666, 0xe66e, 0xe66d, 0xe66b, 0xe671, 0xbcf7, 0xe668, 0xe66f, 0xbcf5, 0xe663, 0xe665, 0xbcf6, 0xe662, 0xe672, 0xe669, 0xea4a, 0xbf51, 0xea55, 0xea53, 0xbf4b, 0xea49, 0xea4c, 0xea4d, 0xea48, 0xbf55, 0xbf56, 0xea47, 0xea56, 0xea51, 0xbf4f, 0xbf4c, 0xea50, 0xea4e, 0xbf52, 0xea52, 0xbf4d, 0xbf4e, 0xea4f, 0xbf50, 0xea4b, 0xea54, 0xbf53, 0xea57, 0xea58, 0xbf54, 0xc0e7, 0xc0ee, 0xed5c, 0xed62, 0xed60, 0xc0ea, 0xc0e9, 0xc0e6, 0xed5e, 0xc0ec, 0xc0eb, 0xc0e8, 0xed61, 0xed5d, 0xed5f, 0xc0ed, 0xc277, 0xeffb, 0xc274, 0xc275, 0xeffd, 0xc276, 0xeffa, 0xeff9, 0xf26c, 0xeffc, 0xf26d, 0xc37a, 0xf26b, 0xf26a, 0xf269, 0xc37b, 0xc46c, 0xf46a, 0xf46b, 0xf5dc, 0xf5db, 0xc4ea, 0xf5da, 0xf6ec, 0xf6ed, 0xf7e6, 0xf8b1, 0xf8f6, 0xf9bc, 0xc679, 0xf9c6, 0xa4f6, 0xaaa6, 0xaaa7, 0xacb8, 0xc0ef, 0xa4f7, 0xaaa8, 0xaf52, 0xb7dd, 0xa4f8, 0xb26e, 0xbab8, 0xc962, 0xcfb7, 0xd27d, 0xe2c5, 0xc0f0, 0xa4f9, 0xaaa9, 0xcfb8, 0xcfb9, 0xda66, 0xb550, 0xdea4, 0xb7de, 0xe2c6, 0xbcf8, 0xc37c, 0xa4fa, 0xda67, 0xa4fb, 0xa6c9, 0xca42, 0xa6c8, 0xa865, 0xa864, 0xa863, 0xcb60, 0xaaaa, 0xaaab, 0xcd5b, 0xcfba, 0xcfbd, 0xacba, 0xcfbb, 0xacb9, 0xcfbc, 0xacbb, 0xd2a2, 0xd2a1, 0xd27e, 0xaf53, 0xd65d, 0xd65e, 0xb26f, 0xd65c, 0xd65f, 0xb552, 0xb270, 0xb551, 0xda6b, 0xda6a, 0xda68, 0xda69, 0xda6c, 0xdea6, 0xdea5, 0xdea9, 0xdea8, 0xdea7, 0xbab9, 0xe2c9, 0xe2c8, 0xbaba, 0xe2c7, 0xe673, 0xe674, 0xbcf9, 0xea59, 0xea5a, 0xf272, 0xc37d, 0xf271, 0xf270, 0xf26e, 0xf26f, 0xc4eb, 0xf46c, 0xf6ee, 0xf8f7, 0xa4fc, 0xc9a5, 0xa5c7, 0xc9a6, 0xca43, 0xca44, 0xcb66, 0xcb62, 0xcb61, 0xaaac, 0xcb65, 0xa867, 0xcb63, 0xa866, 0xcb67, 0xcb64, 0xcd5f, 0xcfbe, 0xcd5d, 0xcd64, 0xaaad, 0xaab0, 0xcd65, 0xcd61, 0xcd62, 0xcd5c, 0xaaaf, 0xcd5e, 0xaaae, 0xcd63, 0xcd60, 0xcfc2, 0xacbd, 0xacbe, 0xcfc5, 0xcfbf, 0xcfc4, 0xcfc0, 0xacbc, 0xcfc3, 0xcfc1, 0xd2a8, 0xd2a5, 0xd2a7, 0xaf58, 0xaf57, 0xaf55, 0xd2a4, 0xd2a9, 0xaf54, 0xaf56, 0xd2a6, 0xd667, 0xd2a3, 0xd2aa, 0xd662, 0xd666, 0xd665, 0xda6e, 0xda79, 0xd668, 0xd663, 0xda6d, 0xb274, 0xb273, 0xd661, 0xd664, 0xb275, 0xb272, 0xb271, 0xd660, 0xd669, 0xda70, 0xda77, 0xb554, 0xda76, 0xda73, 0xb556, 0xda75, 0xda6f, 0xda71, 0xda74, 0xda72, 0xb555, 0xda78, 0xb553, 0xb7df, 0xdead, 0xdeac, 0xdeaa, 0xb7e2, 0xb7e1, 0xdeae, 0xdeab, 0xe2ca, 0xbabb, 0xb7e0, 0xdeb0, 0xdeaf, 0xe2cd, 0xe2cb, 0xbcfa, 0xbabc, 0xe2cc, 0xe676, 0xbcfb, 0xe675, 0xe67e, 0xe67d, 0xe67b, 0xe67a, 0xe677, 0xe678, 0xe679, 0xe67c, 0xe6a1, 0xea5f, 0xea5c, 0xea5d, 0xbf57, 0xea5b, 0xea61, 0xea60, 0xea5e, 0xed64, 0xed65, 0xc0f1, 0xc0f2, 0xed63, 0xc279, 0xeffe, 0xc278, 0xc37e, 0xc3a1, 0xc46d, 0xf46e, 0xf46d, 0xf5dd, 0xf6ef, 0xc57a, 0xf7e8, 0xf7e7, 0xf7e9, 0xa5c8, 0xcfc6, 0xaf59, 0xb276, 0xd66a, 0xa5c9, 0xc9a7, 0xa4fd, 0xca45, 0xcb6c, 0xcb6a, 0xcb6b, 0xcb68, 0xa868, 0xcb69, 0xcd6d, 0xaab3, 0xcd6b, 0xcd67, 0xcd6a, 0xcd66, 0xaab5, 0xcd69, 0xaab2, 0xaab1, 0xaab4, 0xcd6c, 0xcd68, 0xacc2, 0xacc5, 0xcfce, 0xcfcd, 0xcfcc, 0xacbf, 0xcfd5, 0xcfcb, 0xacc1, 0xd2af, 0xcfd2, 0xcfd0, 0xacc4, 0xcfc8, 0xcfd3, 0xcfca, 0xcfd4, 0xcfd1, 0xcfc9, 0xacc0, 0xcfd6, 0xcfc7, 0xacc3, 0xd2b4, 0xd2ab, 0xd2b6, 0xd2ae, 0xd2b9, 0xd2ba, 0xd2ac, 0xd2b8, 0xd2b5, 0xd2b3, 0xd2b7, 0xaf5f, 0xaf5d, 0xd2b1, 0xd2ad, 0xd2b0, 0xd2bb, 0xd2b2, 0xaf5e, 0xcfcf, 0xaf5a, 0xaf5c, 0xd678, 0xd66d, 0xd66b, 0xd66c, 0xd673, 0xd674, 0xd670, 0xb27b, 0xd675, 0xd672, 0xd66f, 0xb279, 0xd66e, 0xb277, 0xb27a, 0xd671, 0xd679, 0xaf5b, 0xb278, 0xd677, 0xd676, 0xb27c, 0xda7e, 0xdaa1, 0xb560, 0xdaa7, 0xdaa9, 0xdaa2, 0xb55a, 0xdaa6, 0xdaa5, 0xb55b, 0xb561, 0xb562, 0xdaa8, 0xb558, 0xda7d, 0xda7b, 0xdaa3, 0xda7a, 0xb55f, 0xda7c, 0xdaa4, 0xdaaa, 0xb559, 0xb55e, 0xb55c, 0xb55d, 0xb557, 0xb7e9, 0xdeb7, 0xb7e8, 0xdebb, 0xdeb1, 0xdebc, 0xdeb2, 0xdeb3, 0xdebd, 0xdeba, 0xdeb8, 0xdeb9, 0xdeb5, 0xdeb4, 0xdebe, 0xb7e5, 0xdeb6, 0xb7ea, 0xb7e4, 0xb7eb, 0xb7ec, 0xb7e7, 0xb7e6, 0xe2ce, 0xbabe, 0xbabd, 0xe2d3, 0xbcfc, 0xbabf, 0xbac1, 0xe2d4, 0xb7e3, 0xbac0, 0xe2d0, 0xe2d2, 0xe2cf, 0xe2d1, 0xe6ab, 0xe6aa, 0xe6a7, 0xbd40, 0xea62, 0xbd41, 0xe6a6, 0xbcfe, 0xe6a8, 0xe6a5, 0xe6a2, 0xe6a9, 0xe6a3, 0xe6a4, 0xbcfd, 0xed69, 0xea66, 0xea65, 0xea67, 0xed66, 0xbf5a, 0xea63, 0xbf58, 0xbf5c, 0xbf5b, 0xea64, 0xea68, 0xbf59, 0xed6d, 0xc0f5, 0xc27a, 0xc0f6, 0xc0f3, 0xed6a, 0xed68, 0xed6b, 0xed6e, 0xc0f4, 0xed6c, 0xed67, 0xf042, 0xf045, 0xf275, 0xf040, 0xf46f, 0xf046, 0xc3a2, 0xf044, 0xc27b, 0xf041, 0xf043, 0xf047, 0xf276, 0xf274, 0xc3a3, 0xf273, 0xc46e, 0xc4ed, 0xf6f1, 0xc4ec, 0xf6f3, 0xf6f0, 0xf6f2, 0xc5d0, 0xf8b2, 0xa5ca, 0xcd6e, 0xd2bc, 0xd2bd, 0xb27d, 0xdebf, 0xbf5d, 0xc3a4, 0xc57b, 0xf8b3, 0xa5cb, 0xcd6f, 0xa260, 0xcfd7, 0xcfd8, 0xd2be, 0xd2bf, 0xb27e, 0xb2a1, 0xdaab, 0xdec2, 0xdec1, 0xdec0, 0xe2d5, 0xe2d6, 0xe2d7, 0xbac2, 0xe6ad, 0xe6ac, 0xea69, 0xbf5e, 0xbf5f, 0xed72, 0xed6f, 0xed70, 0xed71, 0xf049, 0xf048, 0xc27c, 0xf277, 0xf5de, 0xa5cc, 0xacc6, 0xb2a2, 0xdec3, 0xa5cd, 0xd2c0, 0xb2a3, 0xb563, 0xb564, 0xa5ce, 0xa5cf, 0xca46, 0xa86a, 0xa869, 0xacc7, 0xcfd9, 0xdaac, 0xa5d0, 0xa5d1, 0xa5d2, 0xa5d3, 0xa86b, 0xa86c, 0xcb6e, 0xcb6d, 0xaab6, 0xcd72, 0xcd70, 0xcd71, 0xcfda, 0xcfdb, 0xaccb, 0xacc9, 0xacca, 0xacc8, 0xaf60, 0xaf64, 0xaf63, 0xd2c1, 0xaf62, 0xaf61, 0xd2c2, 0xb2a6, 0xd67b, 0xd67a, 0xb2a4, 0xb2a5, 0xb566, 0xb565, 0xdaae, 0xdaad, 0xb2a7, 0xb7ed, 0xdec5, 0xb7ee, 0xdec4, 0xe2d8, 0xe6ae, 0xbd42, 0xea6a, 0xed73, 0xc3a6, 0xc3a5, 0xc57c, 0xa5d4, 0xcd73, 0xb2a8, 0xe2d9, 0xbac3, 0xcb6f, 0xcb70, 0xcd74, 0xaab8, 0xaab9, 0xaab7, 0xaccf, 0xacd0, 0xaccd, 0xacce, 0xcfdc, 0xcfdd, 0xaccc, 0xd2c3, 0xaf68, 0xaf69, 0xb2ab, 0xd2c9, 0xaf6e, 0xaf6c, 0xd2ca, 0xd2c5, 0xaf6b, 0xaf6a, 0xaf65, 0xd2c8, 0xd2c7, 0xd2c4, 0xaf6d, 0xd2c6, 0xaf66, 0xaf67, 0xb2ac, 0xd6a1, 0xd6a2, 0xb2ad, 0xd67c, 0xd67e, 0xd6a4, 0xd6a3, 0xd67d, 0xb2a9, 0xb2aa, 0xdab6, 0xb56b, 0xb56a, 0xdab0, 0xb568, 0xdab3, 0xb56c, 0xdab4, 0xb56d, 0xdab1, 0xb567, 0xb569, 0xdab5, 0xdab2, 0xdaaf, 0xded2, 0xdec7, 0xb7f0, 0xb7f3, 0xb7f2, 0xb7f7, 0xb7f6, 0xded3, 0xded1, 0xdeca, 0xdece, 0xdecd, 0xb7f4, 0xded0, 0xdecc, 0xded4, 0xdecb, 0xb7f5, 0xb7ef, 0xb7f1, 0xdec9, 0xe2db, 0xbac7, 0xe2df, 0xbac6, 0xe2dc, 0xbac5, 0xdec8, 0xdecf, 0xe2de, 0xbac8, 0xe2e0, 0xe2dd, 0xe2da, 0xe6b1, 0xe6b5, 0xe6b7, 0xe6b3, 0xe6b2, 0xe6b0, 0xbd45, 0xbd43, 0xbd48, 0xbd49, 0xe6b4, 0xbd46, 0xe6af, 0xbd47, 0xbac4, 0xe6b6, 0xbd44, 0xea6c, 0xea6b, 0xea73, 0xea6d, 0xea72, 0xea6f, 0xbf60, 0xea71, 0xbf61, 0xbf62, 0xea70, 0xea6e, 0xc0f8, 0xed74, 0xc0f7, 0xed77, 0xed75, 0xed76, 0xc0f9, 0xf04d, 0xc2a1, 0xf04e, 0xc27d, 0xf04f, 0xc27e, 0xf04c, 0xf050, 0xf04a, 0xc3a7, 0xf278, 0xc3a8, 0xc46f, 0xf04b, 0xc470, 0xc4ee, 0xf5df, 0xc57e, 0xf6f4, 0xc57d, 0xf7ea, 0xc5f5, 0xc5f6, 0xf9cc, 0xacd1, 0xcfde, 0xb56e, 0xb56f, 0xa5d5, 0xa6ca, 0xca47, 0xcb71, 0xa86d, 0xaaba, 0xacd2, 0xacd3, 0xacd4, 0xd6a6, 0xd2cb, 0xaf6f, 0xb2ae, 0xd6a5, 0xdab8, 0xb571, 0xdab7, 0xb570, 0xded5, 0xbd4a, 0xe6bb, 0xe6b8, 0xe6b9, 0xe6ba, 0xed78, 0xf051, 0xf471, 0xf470, 0xf6f5, 0xa5d6, 0xcd75, 0xaf70, 0xb572, 0xded6, 0xe2e1, 0xbd4b, 0xea74, 0xf052, 0xf472, 0xa5d7, 0xaabb, 0xacd7, 0xcfdf, 0xacd8, 0xacd6, 0xacd5, 0xd2cc, 0xaf71, 0xaf72, 0xaf73, 0xb2b0, 0xd6a7, 0xb2af, 0xdab9, 0xb2b1, 0xb573, 0xded7, 0xb7f8, 0xb7f9, 0xbac9, 0xbaca, 0xbd4c, 0xbf64, 0xea75, 0xbf63, 0xed79, 0xc0fa, 0xf053, 0xf473, 0xa5d8, 0xa86e, 0xcd78, 0xcd77, 0xaabc, 0xcd76, 0xaabd, 0xcd79, 0xcfe5, 0xacdb, 0xacda, 0xcfe7, 0xcfe6, 0xacdf, 0xacde, 0xacd9, 0xcfe1, 0xcfe2, 0xcfe3, 0xace0, 0xcfe0, 0xacdc, 0xcfe4, 0xacdd, 0xd2cf, 0xd2d3, 0xd2d1, 0xd2d0, 0xd2d4, 0xd2d5, 0xd2d6, 0xd2ce, 0xd2cd, 0xaf75, 0xaf76, 0xd2d7, 0xd2d2, 0xd6b0, 0xd2d8, 0xaf77, 0xaf74, 0xd6aa, 0xd6a9, 0xd6ab, 0xd6ac, 0xd6ae, 0xd6ad, 0xd6b2, 0xb2b5, 0xb2b2, 0xb2b6, 0xd6a8, 0xb2b7, 0xd6b1, 0xb2b4, 0xd6af, 0xb2b3, 0xdabc, 0xdabe, 0xdaba, 0xdabb, 0xdabf, 0xdac1, 0xdac2, 0xdabd, 0xdac0, 0xb574, 0xdedb, 0xdee0, 0xded8, 0xdedc, 0xdee1, 0xdedd, 0xb7fa, 0xb843, 0xb7fd, 0xded9, 0xdeda, 0xbace, 0xb846, 0xb7fe, 0xb844, 0xb7fc, 0xdedf, 0xb845, 0xdede, 0xb841, 0xb7fb, 0xb842, 0xdee2, 0xe2e6, 0xe2e8, 0xb840, 0xe2e3, 0xbacc, 0xe2e9, 0xbacd, 0xe2e7, 0xe2e2, 0xe2e5, 0xe2ea, 0xbacb, 0xe2e4, 0xbd4e, 0xe6bf, 0xe6be, 0xbd51, 0xbd4f, 0xe6bc, 0xbd4d, 0xe6bd, 0xbd50, 0xea7d, 0xeaa1, 0xea7e, 0xea76, 0xea7a, 0xea79, 0xea77, 0xbf66, 0xbf67, 0xbf65, 0xea78, 0xea7b, 0xea7c, 0xbf68, 0xc140, 0xeda3, 0xc0fc, 0xed7b, 0xc0fe, 0xc141, 0xc0fd, 0xeda2, 0xed7c, 0xc0fb, 0xeda1, 0xed7a, 0xed7e, 0xed7d, 0xf055, 0xc2a4, 0xc2a5, 0xc2a2, 0xc2a3, 0xf054, 0xf27b, 0xc3a9, 0xf279, 0xf27a, 0xf474, 0xf477, 0xf475, 0xf476, 0xf5e0, 0xc4ef, 0xf7eb, 0xf8b4, 0xc5f7, 0xf8f8, 0xf8f9, 0xc666, 0xa5d9, 0xace1, 0xdac3, 0xdee3, 0xa5da, 0xa86f, 0xaabe, 0xcfe8, 0xcfe9, 0xaf78, 0xdac4, 0xb575, 0xb847, 0xc142, 0xeda4, 0xf27c, 0xf478, 0xa5db, 0xcda1, 0xcd7a, 0xcd7c, 0xcd7e, 0xcd7d, 0xcd7b, 0xaabf, 0xace2, 0xcff2, 0xcfed, 0xcfea, 0xcff1, 0xace4, 0xace5, 0xcff0, 0xcfef, 0xcfee, 0xcfeb, 0xcfec, 0xcff3, 0xace3, 0xaf7c, 0xafa4, 0xafa3, 0xd2e1, 0xd2db, 0xd2d9, 0xafa1, 0xd6b9, 0xaf7a, 0xd2de, 0xd2e2, 0xd2e4, 0xd2e0, 0xd2da, 0xafa2, 0xd2df, 0xd2dd, 0xaf79, 0xd2e5, 0xafa5, 0xd2e3, 0xaf7d, 0xd2dc, 0xaf7e, 0xaf7b, 0xb2b9, 0xd6ba, 0xd6b3, 0xd6b5, 0xd6b7, 0xd6b8, 0xd6b6, 0xb2ba, 0xd6bb, 0xd6b4, 0xdac8, 0xb576, 0xdad0, 0xdac5, 0xdad1, 0xdac6, 0xdac7, 0xdacf, 0xdace, 0xdacb, 0xb2b8, 0xb577, 0xdac9, 0xdacc, 0xb578, 0xdacd, 0xdaca, 0xdeee, 0xdef2, 0xb84e, 0xe2f0, 0xb851, 0xdef0, 0xdeed, 0xdee8, 0xdeea, 0xdeeb, 0xdee4, 0xb84d, 0xb84c, 0xb848, 0xdee7, 0xb84f, 0xb850, 0xdee6, 0xdee9, 0xdef1, 0xb84a, 0xb84b, 0xdeef, 0xdee5, 0xe2f2, 0xbad0, 0xe2f4, 0xdeec, 0xe2f6, 0xbad4, 0xe2f7, 0xe2f3, 0xbad1, 0xe2ef, 0xbad3, 0xe2ec, 0xe2f1, 0xe2f5, 0xe2ee, 0xb849, 0xe2eb, 0xbad2, 0xe2ed, 0xbd54, 0xe6c1, 0xbd58, 0xbd56, 0xbacf, 0xe6c8, 0xe6c9, 0xbd53, 0xe6c7, 0xe6ca, 0xbd55, 0xbd52, 0xe6c3, 0xe6c0, 0xe6c5, 0xe6c2, 0xbd59, 0xe6c4, 0xe6c6, 0xbd57, 0xbf6a, 0xeaa8, 0xeaa2, 0xeaa6, 0xeaac, 0xeaad, 0xeaa9, 0xeaaa, 0xeaa7, 0xeaa4, 0xbf6c, 0xbf69, 0xeaa3, 0xeaa5, 0xbf6b, 0xeaab, 0xc146, 0xedaa, 0xeda5, 0xc145, 0xc143, 0xedac, 0xc144, 0xeda8, 0xeda9, 0xeda6, 0xedad, 0xf056, 0xc147, 0xeda7, 0xedae, 0xedab, 0xf05a, 0xf057, 0xc2a6, 0xf05b, 0xf05d, 0xf05c, 0xf058, 0xf059, 0xf2a3, 0xc3aa, 0xf27e, 0xf2a2, 0xf27d, 0xf2a4, 0xf2a1, 0xf47a, 0xf47d, 0xf479, 0xc471, 0xf47b, 0xf47c, 0xf47e, 0xc472, 0xc474, 0xc473, 0xf5e1, 0xf5e3, 0xf5e2, 0xf6f6, 0xf8b5, 0xf8fa, 0xa5dc, 0xcb72, 0xaac0, 0xcda3, 0xaac1, 0xaac2, 0xcda2, 0xcff8, 0xcff7, 0xace6, 0xace9, 0xace8, 0xace7, 0xcff4, 0xcff6, 0xcff5, 0xd2e8, 0xafa7, 0xd2ec, 0xd2eb, 0xd2ea, 0xd2e6, 0xafa6, 0xafaa, 0xafad, 0xafae, 0xd2e7, 0xd2e9, 0xafac, 0xafab, 0xafa9, 0xafa8, 0xd6c2, 0xd6c0, 0xd6bc, 0xb2bb, 0xd6bd, 0xb2bc, 0xd6be, 0xd6bf, 0xd6c1, 0xb2bd, 0xdad5, 0xdad4, 0xdad3, 0xdad2, 0xdef6, 0xb852, 0xdef3, 0xdef5, 0xb853, 0xb854, 0xdef4, 0xe341, 0xe2f9, 0xe2fa, 0xbad7, 0xbad5, 0xbad6, 0xe343, 0xe342, 0xe2fe, 0xe2fd, 0xe2fc, 0xe2fb, 0xe340, 0xe2f8, 0xe6cb, 0xe6d0, 0xe6ce, 0xe6cd, 0xe6cc, 0xe6cf, 0xeaae, 0xbf6d, 0xc148, 0xedb0, 0xc149, 0xedaf, 0xf05f, 0xf05e, 0xc2a7, 0xf2a5, 0xc3ab, 0xf4a1, 0xc5a1, 0xf6f7, 0xf8b7, 0xf8b6, 0xc9a8, 0xacea, 0xaceb, 0xd6c3, 0xb856, 0xa5dd, 0xa872, 0xa871, 0xa870, 0xcda4, 0xaac4, 0xaac3, 0xacee, 0xcffa, 0xcffd, 0xcffb, 0xacec, 0xaced, 0xcff9, 0xcffc, 0xafb5, 0xd2f3, 0xd2f5, 0xd2f4, 0xafb2, 0xd2ef, 0xafb0, 0xafaf, 0xafb3, 0xafb1, 0xafb4, 0xd2f2, 0xd2ed, 0xd2ee, 0xd2f1, 0xd2f0, 0xd6c6, 0xd6c7, 0xd6c5, 0xd6c4, 0xb2be, 0xb57d, 0xdad6, 0xdad8, 0xdada, 0xb57c, 0xb57a, 0xdad7, 0xb57b, 0xdad9, 0xb579, 0xdf41, 0xdef7, 0xdefa, 0xdefe, 0xb85a, 0xdefc, 0xdefb, 0xdef8, 0xdef9, 0xb858, 0xdf40, 0xb857, 0xb85c, 0xb85b, 0xb859, 0xdefd, 0xe349, 0xe348, 0xe344, 0xbad8, 0xe347, 0xe346, 0xbad9, 0xbd5e, 0xe6d2, 0xbd5f, 0xbd5b, 0xbd5d, 0xbd5a, 0xbd5c, 0xeaaf, 0xbf70, 0xeab1, 0xeab0, 0xe345, 0xbf72, 0xbf71, 0xbf6e, 0xbf6f, 0xedb5, 0xedb3, 0xc14a, 0xedb4, 0xedb6, 0xedb2, 0xedb1, 0xf060, 0xc2aa, 0xc2a8, 0xc2a9, 0xf2a6, 0xf2a7, 0xc3ad, 0xc3ac, 0xf4a3, 0xf4a4, 0xf4a2, 0xf6f8, 0xf6f9, 0xa5de, 0xca48, 0xa873, 0xcda5, 0xaac6, 0xaac5, 0xcda6, 0xd040, 0xacef, 0xcffe, 0xacf0, 0xafb6, 0xd2f8, 0xd2f6, 0xd2fc, 0xafb7, 0xd2f7, 0xd2fb, 0xd2f9, 0xd2fa, 0xd6c8, 0xd6ca, 0xb2bf, 0xd6c9, 0xb2c0, 0xb5a2, 0xb5a1, 0xb57e, 0xdadb, 0xdf44, 0xb85d, 0xb85e, 0xdf43, 0xdf42, 0xe34a, 0xbadb, 0xbada, 0xe34b, 0xe34c, 0xbd61, 0xbd60, 0xeab5, 0xe6d3, 0xe6d5, 0xe6d4, 0xeab4, 0xeab2, 0xeab6, 0xeab3, 0xbf73, 0xedb7, 0xc14b, 0xedb8, 0xedb9, 0xc2ab, 0xc2ac, 0xc475, 0xc5d1, 0xa5df, 0xd041, 0xd2fd, 0xafb8, 0xb3ba, 0xb3b9, 0xb5a4, 0xdadd, 0xb5a3, 0xdadc, 0xdf45, 0xbadc, 0xe34d, 0xbadd, 0xc476, 0xf4a5, 0xa6cb, 0xaac7, 0xcda7, 0xacf2, 0xacf1, 0xd042, 0xd043, 0xd340, 0xd342, 0xafb9, 0xd344, 0xd347, 0xd345, 0xd346, 0xd343, 0xd2fe, 0xafba, 0xd348, 0xd341, 0xd6d3, 0xb2c6, 0xd6dc, 0xb2c3, 0xd6d5, 0xb2c7, 0xb2c1, 0xd6d0, 0xd6dd, 0xd6d1, 0xd6ce, 0xb2c5, 0xb2c2, 0xd6d4, 0xd6d7, 0xb2c4, 0xd6d8, 0xb2c8, 0xd6d9, 0xd6cf, 0xd6d6, 0xd6da, 0xd6d2, 0xd6cd, 0xd6cb, 0xd6db, 0xdadf, 0xdae4, 0xdae0, 0xdae6, 0xb5a7, 0xd6cc, 0xdae1, 0xb5a5, 0xdade, 0xb5ac, 0xdae2, 0xb5ab, 0xdae3, 0xb5ad, 0xb5a8, 0xb5ae, 0xb5a9, 0xb5aa, 0xb5a6, 0xdae5, 0xb861, 0xdf50, 0xdf53, 0xdf47, 0xdf4c, 0xdf46, 0xb863, 0xdf4a, 0xdf48, 0xb862, 0xdf4f, 0xdf4e, 0xdf4b, 0xdf4d, 0xdf49, 0xbae1, 0xdf52, 0xb85f, 0xdf51, 0xe35d, 0xbae8, 0xe358, 0xbae7, 0xe34e, 0xe350, 0xbae0, 0xe355, 0xe354, 0xe357, 0xbae5, 0xe352, 0xe351, 0xbae4, 0xbadf, 0xe353, 0xbae2, 0xe359, 0xe35b, 0xe356, 0xe34f, 0xbae3, 0xbd69, 0xbade, 0xe35c, 0xe6d9, 0xbd62, 0xe6db, 0xbd63, 0xbd65, 0xe6de, 0xe6d6, 0xbae6, 0xe6dc, 0xe6d8, 0xb860, 0xbd68, 0xbd64, 0xbd66, 0xbd67, 0xbf76, 0xe6dd, 0xe6d7, 0xbd6a, 0xe6da, 0xeac0, 0xeabb, 0xeac5, 0xbf74, 0xeabd, 0xbf78, 0xeac3, 0xeaba, 0xeab7, 0xeac6, 0xc151, 0xbf79, 0xeac2, 0xeab8, 0xbf77, 0xeabc, 0xbf7b, 0xeab9, 0xeabe, 0xbf7a, 0xeac1, 0xeac4, 0xedcb, 0xedcc, 0xedbc, 0xedc3, 0xedc1, 0xc14f, 0xedc8, 0xeabf, 0xedbf, 0xedc9, 0xc14e, 0xedbe, 0xedbd, 0xedc7, 0xedc4, 0xedc6, 0xedba, 0xedca, 0xc14c, 0xedc5, 0xedce, 0xedc2, 0xc150, 0xc14d, 0xedc0, 0xedbb, 0xedcd, 0xbf75, 0xf063, 0xf061, 0xf067, 0xc2b0, 0xf065, 0xf064, 0xc2b2, 0xf06a, 0xc2b1, 0xf06b, 0xf068, 0xc2ae, 0xf069, 0xf062, 0xc2af, 0xc2ad, 0xf2ab, 0xf066, 0xf06c, 0xf2a8, 0xc3b2, 0xc3b0, 0xf2aa, 0xf2ac, 0xf2a9, 0xc3b1, 0xc3ae, 0xc3af, 0xc3b3, 0xc478, 0xf4aa, 0xf4a9, 0xf4a7, 0xf4a6, 0xf4a8, 0xc477, 0xc479, 0xc4f0, 0xf5e5, 0xf5e4, 0xf6fa, 0xf6fc, 0xf6fe, 0xf6fd, 0xf6fb, 0xc5a3, 0xc5a2, 0xc5d3, 0xc5d2, 0xc5d4, 0xf7ed, 0xf7ec, 0xf8fb, 0xf8b8, 0xf8fc, 0xc658, 0xc659, 0xf96d, 0xc67e, 0xa6cc, 0xcda8, 0xd045, 0xd046, 0xd044, 0xacf3, 0xd047, 0xd048, 0xd049, 0xd349, 0xd34f, 0xd34d, 0xafbb, 0xd34b, 0xd34c, 0xd34e, 0xd34a, 0xb2c9, 0xd6de, 0xb2cb, 0xd6e0, 0xb2ca, 0xd6df, 0xdae8, 0xb5af, 0xdaea, 0xdae7, 0xd6e1, 0xb5b0, 0xdae9, 0xdf56, 0xb864, 0xdf54, 0xb865, 0xdf55, 0xb866, 0xbae9, 0xe361, 0xe35e, 0xe360, 0xbaea, 0xbaeb, 0xe35f, 0xe6df, 0xe6e0, 0xbd6b, 0xe6e2, 0xe6e1, 0xa261, 0xeaca, 0xeacb, 0xeac7, 0xeac8, 0xbf7c, 0xbf7d, 0xeac9, 0xc157, 0xc153, 0xc158, 0xc154, 0xc156, 0xc152, 0xc155, 0xc2b3, 0xedcf, 0xf2ae, 0xf2ad, 0xf4ab, 0xc47a, 0xc47b, 0xf741, 0xf5e6, 0xf740, 0xf8fd, 0xf9a4, 0xa6cd, 0xa874, 0xcda9, 0xaac8, 0xacf6, 0xd04c, 0xacf4, 0xd04a, 0xacf9, 0xacf5, 0xacfa, 0xacf8, 0xd04b, 0xacf7, 0xafbf, 0xafbe, 0xd35a, 0xafc7, 0xd353, 0xd359, 0xafc3, 0xd352, 0xd358, 0xd356, 0xafc2, 0xafc4, 0xd355, 0xafbd, 0xd354, 0xafc8, 0xafc5, 0xafc9, 0xafc6, 0xd351, 0xd350, 0xd357, 0xafc0, 0xafbc, 0xafc1, 0xd6f0, 0xd6e9, 0xb5b5, 0xd6e8, 0xb2cf, 0xb2d6, 0xb2d3, 0xb2d9, 0xb2d8, 0xb2d4, 0xd6e2, 0xd6e5, 0xd6e4, 0xb2d0, 0xd6e6, 0xd6ef, 0xb2d1, 0xd6e3, 0xd6ec, 0xd6ed, 0xb2d2, 0xd6ea, 0xb2d7, 0xb2cd, 0xb2d5, 0xd6e7, 0xb2cc, 0xd6eb, 0xd6ee, 0xdafb, 0xdaf2, 0xb5b2, 0xdaf9, 0xdaf6, 0xdaee, 0xdaf7, 0xb5b4, 0xdaef, 0xdaeb, 0xb86c, 0xdaf4, 0xb5b1, 0xdafa, 0xb5b8, 0xb5ba, 0xdaed, 0xb5b9, 0xdaf0, 0xb5b3, 0xdaf8, 0xdaf1, 0xdaf5, 0xdaf3, 0xb5b6, 0xdaec, 0xb5bb, 0xb2ce, 0xb5b7, 0xb5bc, 0xb868, 0xdf5d, 0xdf5f, 0xdf61, 0xdf65, 0xdf5b, 0xdf59, 0xb86a, 0xdf60, 0xdf64, 0xdf5c, 0xdf58, 0xdf57, 0xdf62, 0xdf5a, 0xdf5e, 0xb86b, 0xb869, 0xdf66, 0xb867, 0xdf63, 0xe372, 0xbaee, 0xe36a, 0xbd78, 0xe374, 0xbaf1, 0xe378, 0xbaf7, 0xe365, 0xe375, 0xe362, 0xe377, 0xe366, 0xbafe, 0xbafb, 0xe376, 0xe370, 0xbaed, 0xbaf5, 0xbaf4, 0xbaf3, 0xbaf9, 0xe363, 0xbafa, 0xe371, 0xbaf6, 0xbaec, 0xe373, 0xbaef, 0xbaf0, 0xbaf8, 0xe368, 0xe367, 0xe364, 0xe36c, 0xe369, 0xe36d, 0xbafd, 0xe379, 0xbaf2, 0xe36e, 0xe36f, 0xe36b, 0xbafc, 0xe6e7, 0xbd70, 0xbd79, 0xbd75, 0xe6e4, 0xbd72, 0xbd76, 0xe6f0, 0xbd6c, 0xe6e8, 0xbd74, 0xe6eb, 0xe6e6, 0xbd73, 0xbd77, 0xe6e5, 0xbd71, 0xe6ef, 0xbd6e, 0xe6ee, 0xe6ed, 0xbd7a, 0xe572, 0xbd6d, 0xe6ec, 0xe6e3, 0xbd7b, 0xe6ea, 0xbd6f, 0xe6e9, 0xbfa2, 0xbfa7, 0xbf7e, 0xead8, 0xeacf, 0xeadb, 0xead3, 0xead9, 0xbfa8, 0xbfa1, 0xeacc, 0xead2, 0xeadc, 0xead5, 0xeada, 0xeace, 0xead6, 0xbfa3, 0xead4, 0xbfa6, 0xbfa5, 0xead0, 0xead1, 0xeacd, 0xead7, 0xbfa4, 0xeade, 0xeadd, 0xedda, 0xedd6, 0xc15f, 0xedd0, 0xc159, 0xc169, 0xeddc, 0xc161, 0xc15d, 0xedd3, 0xc164, 0xc167, 0xedde, 0xc15c, 0xedd5, 0xc165, 0xede0, 0xeddd, 0xedd1, 0xc160, 0xc15a, 0xc168, 0xedd8, 0xc163, 0xedd2, 0xc15e, 0xeddf, 0xc162, 0xc15b, 0xedd9, 0xc166, 0xedd7, 0xeddb, 0xf06e, 0xf074, 0xc2b9, 0xf077, 0xc2b4, 0xc2b5, 0xf06f, 0xf076, 0xf071, 0xc2ba, 0xc2b7, 0xf06d, 0xc2b6, 0xf073, 0xf075, 0xc2b8, 0xf072, 0xf070, 0xf2b8, 0xc3b7, 0xc3b8, 0xc3b4, 0xc3b5, 0xf2b4, 0xf2b2, 0xf2b6, 0xc3ba, 0xf2b7, 0xf2b0, 0xf2af, 0xf2b3, 0xf2b1, 0xc3b6, 0xf2b5, 0xf4ac, 0xc47e, 0xc47d, 0xf4ad, 0xf4af, 0xf4ae, 0xc4a1, 0xf5eb, 0xf5e8, 0xf5e9, 0xf5e7, 0xf5ea, 0xc4f2, 0xf5ec, 0xc4f1, 0xf742, 0xc5d5, 0xc5d7, 0xf7ee, 0xc5d6, 0xf8b9, 0xf940, 0xf942, 0xf8fe, 0xf941, 0xc66c, 0xa6ce, 0xacfb, 0xd26f, 0xafca, 0xb2da, 0xdafc, 0xdafd, 0xeadf, 0xc16a, 0xede1, 0xc2bb, 0xf2ba, 0xf2b9, 0xc4a2, 0xf5ed, 0xf743, 0xc5f8, 0xca49, 0xaac9, 0xa875, 0xd04d, 0xd360, 0xd35b, 0xd35f, 0xd35d, 0xafcb, 0xd35e, 0xd35c, 0xd6f1, 0xdafe, 0xdb40, 0xdf69, 0xdf6a, 0xb86e, 0xb86f, 0xdf68, 0xdf6b, 0xdf67, 0xb86d, 0xbb40, 0xb870, 0xe37a, 0xbd7c, 0xe6f1, 0xbd7d, 0xbfa9, 0xeae2, 0xeae0, 0xeae1, 0xede4, 0xede3, 0xede2, 0xf2bb, 0xc3b9, 0xf2bc, 0xf744, 0xc5f9, 0xf8ba, 0xa6cf, 0xaacb, 0xaaca, 0xd04f, 0xacfc, 0xd04e, 0xd362, 0xafcc, 0xd6f2, 0xd361, 0xb2dc, 0xd6f5, 0xd6f3, 0xd6f4, 0xb2db, 0xdb42, 0xdb43, 0xdb41, 0xb873, 0xdf6d, 0xdf6c, 0xdf6e, 0xb872, 0xb871, 0xe6f2, 0xe6f4, 0xbd7e, 0xe6f3, 0xeae3, 0xbfaa, 0xf079, 0xf078, 0xc3bb, 0xf2bd, 0xc3bd, 0xc3bc, 0xf4b0, 0xf5ee, 0xc4f3, 0xa6d0, 0xd050, 0xacfd, 0xd365, 0xafce, 0xd364, 0xd363, 0xafcd, 0xd6fb, 0xd6fd, 0xd6f6, 0xd6f7, 0xb2dd, 0xd6f8, 0xb2de, 0xd6fc, 0xd6f9, 0xd6fa, 0xb2df, 0xb5be, 0xb5bf, 0xdb44, 0xdf6f, 0xdf70, 0xe37e, 0xbb43, 0xbb41, 0xbb42, 0xe37b, 0xe37c, 0xe37d, 0xe6f9, 0xe6fa, 0xbda1, 0xe6f7, 0xe6f6, 0xe6f8, 0xe6f5, 0xbfad, 0xeae4, 0xbfab, 0xbfac, 0xede6, 0xc16b, 0xede5, 0xefa8, 0xf07a, 0xf07b, 0xc2bc, 0xc2bd, 0xc16c, 0xf2be, 0xf2bf, 0xf4b1, 0xc4a3, 0xa6d1, 0xa6d2, 0xacfe, 0xaacc, 0xafcf, 0xd051, 0xb5c0, 0xa6d3, 0xad41, 0xd052, 0xd053, 0xad40, 0xad42, 0xa6d4, 0xd054, 0xafd1, 0xd366, 0xafd3, 0xafd0, 0xafd2, 0xd741, 0xb2e0, 0xd740, 0xd6fe, 0xdf71, 0xe3a1, 0xbda2, 0xbfae, 0xeae6, 0xeae5, 0xede7, 0xf5ef, 0xa6d5, 0xcb73, 0xcdaa, 0xad43, 0xd055, 0xd368, 0xafd4, 0xd367, 0xafd5, 0xd743, 0xb2e2, 0xd742, 0xd744, 0xb2e1, 0xdb46, 0xdb47, 0xdb45, 0xb5c1, 0xb874, 0xb875, 0xbb45, 0xe3a3, 0xe3a2, 0xbb44, 0xe6fb, 0xe6fc, 0xeae7, 0xc170, 0xc16f, 0xc16d, 0xc16e, 0xc171, 0xf07c, 0xc2bf, 0xc2be, 0xf2c0, 0xf4b2, 0xc5a5, 0xc5a4, 0xa6d6, 0xd1fb, 0xb877, 0xb5c2, 0xb876, 0xbb46, 0xa6d7, 0xc9a9, 0xa6d8, 0xa6d9, 0xcdab, 0xcb76, 0xcb77, 0xa877, 0xcb74, 0xa876, 0xa879, 0xcb75, 0xa87b, 0xa87a, 0xcb78, 0xa878, 0xaad1, 0xaacf, 0xcdad, 0xaace, 0xaad3, 0xaad5, 0xaad2, 0xcdb0, 0xcdac, 0xaad6, 0xaad0, 0xa87c, 0xaad4, 0xcdaf, 0xcdae, 0xaacd, 0xd05b, 0xad47, 0xad48, 0xd05d, 0xd057, 0xd05a, 0xd063, 0xd061, 0xad49, 0xd067, 0xad4c, 0xd064, 0xd05c, 0xd059, 0xdb49, 0xd062, 0xad44, 0xd065, 0xd056, 0xd05f, 0xad46, 0xad4b, 0xd060, 0xad4f, 0xad4d, 0xd058, 0xad4a, 0xd05e, 0xad4e, 0xad45, 0xd066, 0xafda, 0xafe3, 0xafd8, 0xafd6, 0xd36a, 0xafde, 0xafdb, 0xd36c, 0xafdd, 0xd36b, 0xd369, 0xd36e, 0xafe2, 0xafe0, 0xdb48, 0xd36f, 0xd36d, 0xafd7, 0xafd9, 0xafdc, 0xafdf, 0xafe1, 0xd74e, 0xb2e4, 0xd745, 0xd747, 0xd748, 0xd750, 0xd74c, 0xd74a, 0xd74d, 0xd751, 0xb2e5, 0xb2e9, 0xd746, 0xd74f, 0xb2e7, 0xb2e6, 0xd74b, 0xd749, 0xb2e3, 0xb2e8, 0xb5c8, 0xdb51, 0xdb4f, 0xb5ca, 0xdb4a, 0xdfa1, 0xb5c9, 0xdb4e, 0xdb4b, 0xb5c5, 0xb5cb, 0xdb50, 0xb5c7, 0xdb4d, 0xbb47, 0xb5c6, 0xdb4c, 0xb5cc, 0xb5c4, 0xb5c3, 0xdf77, 0xdf75, 0xdf7b, 0xdf73, 0xdfa2, 0xdf78, 0xdf72, 0xb87b, 0xb8a3, 0xdf7d, 0xdf76, 0xb87e, 0xb87c, 0xdf7e, 0xb879, 0xb878, 0xdf79, 0xb87d, 0xb5cd, 0xdf7c, 0xdf74, 0xb87a, 0xb8a1, 0xb8a2, 0xbb4c, 0xbb48, 0xbb4d, 0xe3a6, 0xe3a5, 0xe3a7, 0xbb4a, 0xe3a4, 0xbb4b, 0xe3aa, 0xe3a9, 0xe3a8, 0xbb49, 0xe741, 0xe744, 0xbda8, 0xe743, 0xbda7, 0xbda3, 0xbda4, 0xbda5, 0xe740, 0xe6fe, 0xbda6, 0xe742, 0xe6fd, 0xeae9, 0xeaf3, 0xbfb1, 0xbfb0, 0xeaed, 0xeaef, 0xeaea, 0xeaee, 0xeae8, 0xeaf1, 0xbfaf, 0xeaf0, 0xeaec, 0xeaf2, 0xeaeb, 0xc174, 0xede8, 0xedee, 0xc178, 0xc17a, 0xc177, 0xc176, 0xc175, 0xc173, 0xede9, 0xedec, 0xc172, 0xeded, 0xc179, 0xedeb, 0xedea, 0xc2c0, 0xc2c1, 0xf0a1, 0xf07d, 0xf07e, 0xf2c2, 0xf2c1, 0xc3be, 0xf4b4, 0xc4a4, 0xf4b3, 0xf5f0, 0xf745, 0xc5a6, 0xf943, 0xf944, 0xc5d8, 0xa6da, 0xaad7, 0xdb52, 0xbb4e, 0xc17b, 0xedef, 0xa6db, 0xafe5, 0xafe4, 0xdb53, 0xeaf4, 0xa6dc, 0xad50, 0xdb54, 0xdb55, 0xdb56, 0xbb4f, 0xbfb2, 0xa6dd, 0xaad8, 0xd068, 0xafe6, 0xd370, 0xb2ea, 0xdb57, 0xb8a4, 0xbb50, 0xbfb3, 0xc17c, 0xc2c2, 0xf4b5, 0xa6de, 0xaad9, 0xafe7, 0xd752, 0xb5ce, 0xbb51, 0xe3ab, 0xe745, 0xa6df, 0xb5cf, 0xdfa3, 0xbb52, 0xa6e0, 0xcdb1, 0xd069, 0xad51, 0xd372, 0xafea, 0xafe8, 0xafe9, 0xafeb, 0xd371, 0xd757, 0xd754, 0xd756, 0xb2eb, 0xb2ed, 0xb2ec, 0xd753, 0xb2ee, 0xd755, 0xdb58, 0xdb59, 0xdb5a, 0xdfa6, 0xdfa7, 0xdfa5, 0xdfa8, 0xb8a5, 0xdfa4, 0xbb53, 0xe74a, 0xe746, 0xe749, 0xe74b, 0xe748, 0xe747, 0xeaf5, 0xeaf6, 0xeaf7, 0xbfb4, 0xbfb5, 0xedf1, 0xedf0, 0xedf2, 0xf0a3, 0xf0a2, 0xf2c4, 0xf2c5, 0xf2c3, 0xc4a5, 0xf4b6, 0xf4b7, 0xf746, 0xf7ef, 0xf8bb, 0xa6e1, 0xa87d, 0xc17d, 0xa6e2, 0xd758, 0xdb5b, 0xc641, 0xca4a, 0xca4b, 0xca4d, 0xa6e3, 0xca4e, 0xca4c, 0xcba2, 0xcba3, 0xcb7b, 0xcba1, 0xa8a1, 0xa8a2, 0xcb7c, 0xcb7a, 0xcb79, 0xcb7d, 0xa87e, 0xcb7e, 0xd06a, 0xcdb6, 0xaadc, 0xcdb5, 0xcdb7, 0xaadb, 0xcdbc, 0xaadf, 0xcdb2, 0xcdc0, 0xcdc6, 0xaae6, 0xcdc3, 0xaae3, 0xcdb9, 0xcdbf, 0xcdc1, 0xcdb4, 0xaae2, 0xaadd, 0xcdba, 0xaae4, 0xaae7, 0xaae1, 0xaada, 0xcdbe, 0xcdb8, 0xcdc5, 0xaae9, 0xaae5, 0xaae0, 0xcdbd, 0xafec, 0xcdbb, 0xaade, 0xaae8, 0xcdb3, 0xcdc2, 0xcdc4, 0xad62, 0xad5c, 0xad64, 0xad61, 0xd071, 0xd074, 0xad5d, 0xd06b, 0xad56, 0xad60, 0xad63, 0xad65, 0xd0a2, 0xd077, 0xad55, 0xd0a1, 0xad59, 0xad57, 0xad52, 0xd06f, 0xd07e, 0xd073, 0xd076, 0xd0a5, 0xad66, 0xd07d, 0xad5e, 0xd078, 0xd0a4, 0xd075, 0xd079, 0xd07c, 0xd06d, 0xd0a3, 0xd07b, 0xd06c, 0xd070, 0xad5f, 0xad5a, 0xad53, 0xad58, 0xad54, 0xad67, 0xd06e, 0xd3a5, 0xad5b, 0xd07a, 0xce41, 0xd3a8, 0xaffa, 0xd376, 0xd3a3, 0xd37d, 0xd3b2, 0xd3aa, 0xd37e, 0xd3a9, 0xd378, 0xd37c, 0xd3b5, 0xaffd, 0xd3ad, 0xd3a4, 0xafed, 0xd3b3, 0xd374, 0xd3ac, 0xaffc, 0xaff7, 0xd373, 0xaff5, 0xaff4, 0xaff9, 0xd3ab, 0xaff1, 0xaff8, 0xd072, 0xdb5c, 0xd3a6, 0xd37a, 0xaffb, 0xd37b, 0xd3a1, 0xaffe, 0xd375, 0xd3af, 0xd3ae, 0xd3b6, 0xaff3, 0xaff0, 0xd3b4, 0xd3b0, 0xd3a7, 0xd3a2, 0xaff6, 0xaff2, 0xd377, 0xafee, 0xd3b1, 0xafef, 0xd379, 0xd75e, 0xd760, 0xd765, 0xd779, 0xb2fc, 0xb2f2, 0xd75d, 0xb2fd, 0xb2fe, 0xd768, 0xd76f, 0xd775, 0xd762, 0xd769, 0xb340, 0xd777, 0xd772, 0xb2fa, 0xb2f8, 0xd76e, 0xd76a, 0xd75c, 0xb2ef, 0xd761, 0xd759, 0xb2f7, 0xb2f9, 0xd766, 0xd763, 0xb2f4, 0xd773, 0xb2f1, 0xd764, 0xd77a, 0xd76c, 0xd76b, 0xb2f0, 0xb2fb, 0xb2f3, 0xd75a, 0xd75f, 0xd770, 0xd776, 0xb341, 0xd75b, 0xd767, 0xd76d, 0xb2f6, 0xd778, 0xd771, 0xd774, 0xb2f5, 0xdb6c, 0xdb60, 0xb5d7, 0xdb7d, 0xdba7, 0xdbaa, 0xb5d5, 0xdb68, 0xdba3, 0xdb69, 0xdb77, 0xb5e2, 0xdb73, 0xb5df, 0xdb74, 0xdb5d, 0xdba4, 0xb5e8, 0xdba1, 0xdb75, 0xdbac, 0xdb70, 0xdfc8, 0xdbaf, 0xb5e6, 0xdb6e, 0xdb7a, 0xb5e9, 0xb5d4, 0xdb72, 0xdbad, 0xdb6b, 0xdb64, 0xdb6f, 0xdb63, 0xdb61, 0xb5d0, 0xdba5, 0xdb6a, 0xdba8, 0xdba9, 0xb5d8, 0xb5dd, 0xb5d9, 0xb5e1, 0xdb7e, 0xb5da, 0xdb76, 0xdb66, 0xb5d2, 0xdb5e, 0xdba2, 0xdbab, 0xdb65, 0xb5e0, 0xdbb0, 0xdb71, 0xdb6d, 0xb5d1, 0xb5e5, 0xdb7c, 0xb5e7, 0xdb78, 0xb5dc, 0xb5d6, 0xb5de, 0xb5d3, 0xb5e4, 0xdb79, 0xdb67, 0xdb7b, 0xdb62, 0xdba6, 0xdbae, 0xdb5f, 0xdfc7, 0xdfdd, 0xb855, 0xdfcc, 0xdfca, 0xdfb5, 0xb8a9, 0xdfc5, 0xdfd9, 0xdfc1, 0xb8b1, 0xdfd8, 0xdfbf, 0xb5e3, 0xdfcf, 0xdfc0, 0xdfd6, 0xb8b0, 0xb8a8, 0xdfaa, 0xdfb2, 0xdfcb, 0xdfc3, 0xdfdc, 0xdfc6, 0xb8b6, 0xdfd7, 0xb8ad, 0xdfc9, 0xdfd1, 0xdfb6, 0xdfd0, 0xdfe1, 0xdfb1, 0xdfd2, 0xdfdf, 0xdfab, 0xb5db, 0xdfb9, 0xdfb8, 0xb8af, 0xdfbc, 0xdfbe, 0xdfcd, 0xdfde, 0xb8b2, 0xb8b3, 0xdfb0, 0xb8ab, 0xdfb4, 0xdfda, 0xb8b4, 0xb8ac, 0xb8ae, 0xb8b5, 0xdfe0, 0xdfd3, 0xdfce, 0xdfbb, 0xdfba, 0xb8aa, 0xdfac, 0xb8a7, 0xdfc4, 0xdfad, 0xdfc2, 0xdfb7, 0xdfdb, 0xb8a6, 0xdfb3, 0xdfaf, 0xdfd5, 0xdfae, 0xbb60, 0xe3d3, 0xe3c2, 0xe3ac, 0xe3ca, 0xbb58, 0xe3bb, 0xe3c5, 0xbb5b, 0xe3be, 0xbb59, 0xe3af, 0xe3cd, 0xe3ae, 0xe3c1, 0xe3ad, 0xe3bf, 0xe3c8, 0xe3c6, 0xe3ba, 0xe3b5, 0xe3b3, 0xe3b4, 0xe3c7, 0xe3d2, 0xe3bc, 0xbb5a, 0xe3b7, 0xe3cb, 0xbb5d, 0xe3b6, 0xe3b0, 0xe3c0, 0xbb61, 0xbb55, 0xbb5e, 0xe3b8, 0xe3b2, 0xbb57, 0xdfd4, 0xbb56, 0xe3c3, 0xbb54, 0xbb63, 0xbb5c, 0xe3c4, 0xe3b9, 0xe3b1, 0xe3cc, 0xe3bd, 0xbb62, 0xe3d0, 0xbb5f, 0xe3cf, 0xe3c9, 0xe3ce, 0xe3d1, 0xe773, 0xe774, 0xe767, 0xe766, 0xe762, 0xbdb4, 0xbdac, 0xe776, 0xe775, 0xdfa9, 0xe75f, 0xe763, 0xe75d, 0xe770, 0xe761, 0xe777, 0xe75a, 0xe758, 0xe764, 0xe76e, 0xe769, 0xbdb6, 0xe74f, 0xe76d, 0xbdb7, 0xdfbd, 0xe75b, 0xe752, 0xe755, 0xe77b, 0xe75c, 0xe753, 0xe751, 0xe74e, 0xbdb0, 0xe765, 0xbdaf, 0xbdb3, 0xe760, 0xe768, 0xbda9, 0xe778, 0xe77c, 0xbdab, 0xe757, 0xe76b, 0xe76f, 0xe754, 0xe779, 0xbdb2, 0xbdb1, 0xe74c, 0xbdb5, 0xe772, 0xe756, 0xe76a, 0xe750, 0xe75e, 0xe759, 0xbdad, 0xbdae, 0xe76c, 0xe77d, 0xe77a, 0xe771, 0xe74d, 0xbdaa, 0xeb49, 0xeb40, 0xeb43, 0xbfbb, 0xeb45, 0xeaf9, 0xeb41, 0xeb47, 0xbfb8, 0xbfbc, 0xbfb6, 0xeafb, 0xeb4c, 0xeb46, 0xeafc, 0xeb55, 0xeb4f, 0xeaf8, 0xee46, 0xeafe, 0xbfb7, 0xeb4a, 0xeb54, 0xbfbf, 0xeb51, 0xeafd, 0xeb44, 0xeb48, 0xeb42, 0xeb56, 0xeb53, 0xeb50, 0xbfb9, 0xbfba, 0xbfbe, 0xeafa, 0xeb57, 0xbfbd, 0xeb4d, 0xeb4b, 0xeb4e, 0xee53, 0xee40, 0xee45, 0xee52, 0xee44, 0xedfb, 0xee41, 0xc1a2, 0xedf4, 0xee4d, 0xee4f, 0xedf3, 0xc1a1, 0xee51, 0xee49, 0xc1a8, 0xee50, 0xee42, 0xc1aa, 0xedf9, 0xeb52, 0xee4a, 0xee47, 0xedf5, 0xee55, 0xc1a4, 0xc1a5, 0xedf7, 0xee48, 0xee54, 0xee4b, 0xedfd, 0xc1a7, 0xc1a3, 0xee4c, 0xedfe, 0xee56, 0xedf8, 0xee43, 0xee4e, 0xedfa, 0xedfc, 0xc2cb, 0xedf6, 0xc1a9, 0xc2c4, 0xc17e, 0xc1a6, 0xc2c8, 0xf0b3, 0xf0a9, 0xf0a4, 0xf0aa, 0xf0b4, 0xf0b8, 0xf0b7, 0xc2ca, 0xc2c9, 0xf0ab, 0xf0b9, 0xf0ae, 0xf0a6, 0xf0a8, 0xf0a7, 0xf0ad, 0xf0b2, 0xf0a5, 0xf0ac, 0xf0b1, 0xc2c7, 0xf0af, 0xc2c5, 0xf0b0, 0xc2c3, 0xc2c6, 0xf2d5, 0xf0b5, 0xc3c2, 0xf2cd, 0xf2d1, 0xf2c9, 0xf2cc, 0xf2d4, 0xc3c0, 0xf2d9, 0xf2d2, 0xf2ca, 0xf2da, 0xf2d3, 0xc3c3, 0xc3c4, 0xf2d7, 0xf2cb, 0xc3bf, 0xc3c1, 0xf2c6, 0xf2ce, 0xf2c8, 0xf2d8, 0xf2d6, 0xf2c7, 0xf2cf, 0xf4be, 0xc3c5, 0xf2d0, 0xc4a7, 0xc4a9, 0xc4a6, 0xf4c3, 0xf4bb, 0xf4b9, 0xf4bd, 0xf4ba, 0xf4bf, 0xf4c1, 0xc4aa, 0xc4ac, 0xf4c0, 0xc4ad, 0xc4ab, 0xf4c2, 0xc4a8, 0xc4f4, 0xf5f1, 0xf5f7, 0xc4f6, 0xf4bc, 0xf5f6, 0xf5fd, 0xf5f4, 0xf5fb, 0xf5fa, 0xf4b8, 0xf5f5, 0xf0b6, 0xf5fe, 0xf5f3, 0xf5f8, 0xf5fc, 0xf5f2, 0xf74a, 0xc4f5, 0xf5f9, 0xf7f4, 0xf74b, 0xf749, 0xf747, 0xf748, 0xf74c, 0xc5d9, 0xf7f2, 0xf7f0, 0xf7f5, 0xf7f3, 0xf7f6, 0xc5da, 0xf7f1, 0xf8bc, 0xf945, 0xf946, 0xf947, 0xf9c7, 0xf9bd, 0xca4f, 0xaaea, 0xad68, 0xd3b8, 0xd3b7, 0xb040, 0xb342, 0xd77c, 0xd77b, 0xb5ea, 0xb8b8, 0xb8b7, 0xb8b9, 0xe3d4, 0xe77e, 0xeb58, 0xeb5a, 0xeb59, 0xc1ab, 0xee57, 0xf0ba, 0xf9a5, 0xa6e4, 0xcdc9, 0xcdca, 0xcdc8, 0xcdc7, 0xaaeb, 0xd0a9, 0xd0a7, 0xd0a6, 0xad69, 0xad6b, 0xad6a, 0xd0a8, 0xd3c4, 0xd3c1, 0xd3bf, 0xb041, 0xd3c2, 0xb046, 0xd3bc, 0xd3cb, 0xd3cd, 0xd3bd, 0xb043, 0xd3ce, 0xd3c9, 0xd3bb, 0xd3c0, 0xd3ca, 0xd3c6, 0xd3c3, 0xb048, 0xd3cc, 0xd3be, 0xd3c7, 0xd3b9, 0xb047, 0xb044, 0xd3c5, 0xd3c8, 0xd3ba, 0xb045, 0xb042, 0xb34c, 0xd7a5, 0xb34b, 0xd7a8, 0xd7ab, 0xb348, 0xb346, 0xd77e, 0xd7a9, 0xd7a7, 0xd7a4, 0xd7ac, 0xd7ad, 0xd7af, 0xd7b0, 0xd77d, 0xb345, 0xd7a2, 0xd7a1, 0xd7ae, 0xb347, 0xd7a3, 0xb349, 0xb344, 0xd7a6, 0xb34d, 0xb34a, 0xd7aa, 0xb5f1, 0xdbbf, 0xdbb4, 0xb5ee, 0xdfe7, 0xdbbd, 0xdbb1, 0xb5ec, 0xdbb6, 0xb5ef, 0xdbba, 0xdbb8, 0xb5f2, 0xb5eb, 0xdbb2, 0xdbb5, 0xb5f0, 0xdbb3, 0xdbbe, 0xdbbc, 0xdbb7, 0xdbb9, 0xdbbb, 0xb5ed, 0xdfe8, 0xdfee, 0xdfe4, 0xdfea, 0xb8ba, 0xdfe6, 0xb8c0, 0xb8bf, 0xb8be, 0xdfed, 0xb8c1, 0xb8c2, 0xdfe3, 0xdff0, 0xb8c3, 0xb8bd, 0xb8bc, 0xdfec, 0xb8c4, 0xdfe2, 0xdfe5, 0xdfef, 0xdfeb, 0xe3f4, 0xe3e9, 0xb8bb, 0xbb6a, 0xe3dd, 0xe3f2, 0xe3de, 0xbb65, 0xe3db, 0xe3e4, 0xe3dc, 0xbb67, 0xe3d6, 0xe3f1, 0xbb68, 0xe3ee, 0xe3ef, 0xe3d7, 0xbb6d, 0xe3e6, 0xe3e0, 0xe3e7, 0xe3da, 0xe3f3, 0xe3eb, 0xe3e5, 0xe3d5, 0xbb69, 0xe3ec, 0xbb6c, 0xe3f0, 0xe3ea, 0xbb66, 0xe3e8, 0xe3e2, 0xbb64, 0xe3d9, 0xe3e1, 0xe3ed, 0xe3df, 0xe3e3, 0xbdc1, 0xdfe9, 0xe7b2, 0xe7bb, 0xe7b1, 0xe7ad, 0xe7aa, 0xbdc2, 0xe7a8, 0xbb6b, 0xe7a1, 0xbdc0, 0xe7a7, 0xbdbf, 0xe7ac, 0xe7a9, 0xe7b9, 0xe7b4, 0xe7ae, 0xe7b3, 0xbdbb, 0xe7ab, 0xe7be, 0xe7a2, 0xe7a3, 0xe7ba, 0xbdbc, 0xe7bf, 0xbdbe, 0xe7c0, 0xe7b0, 0xe3d8, 0xe7b6, 0xe7af, 0xe7b8, 0xe7b5, 0xe7a6, 0xbdb9, 0xe7bd, 0xbdba, 0xe7a4, 0xbdbd, 0xeb64, 0xe7b7, 0xe7bc, 0xeb61, 0xbdb8, 0xbfc0, 0xeb6b, 0xeb67, 0xeb65, 0xeb60, 0xeb6f, 0xbfc4, 0xeb5c, 0xeb68, 0xeb69, 0xeb5f, 0xeb5e, 0xeb6c, 0xeb62, 0xeb5d, 0xeb63, 0xeb6e, 0xeb5b, 0xeb6d, 0xeb6a, 0xbfc2, 0xbfc1, 0xbfc3, 0xeb66, 0xf0cb, 0xee59, 0xc1b1, 0xee5d, 0xee5a, 0xee61, 0xee67, 0xee5c, 0xee70, 0xc1ae, 0xee6a, 0xee5f, 0xee6b, 0xee66, 0xee6d, 0xee5e, 0xc1b3, 0xc1b2, 0xee60, 0xee6e, 0xee58, 0xee6c, 0xc1ac, 0xee64, 0xee63, 0xee68, 0xee5b, 0xc1b0, 0xc1b4, 0xee62, 0xee69, 0xc1b5, 0xee65, 0xc1ad, 0xc1af, 0xf0c7, 0xf0c5, 0xf0cc, 0xf0c9, 0xf0cd, 0xf0be, 0xf0c6, 0xf0d1, 0xee6f, 0xf0c2, 0xc2cf, 0xe7a5, 0xf0bd, 0xf0ca, 0xf0c4, 0xf0c1, 0xf0bc, 0xf0bb, 0xf0d0, 0xf0c0, 0xf0bf, 0xc2cd, 0xf0c8, 0xc2cc, 0xc2ce, 0xf0c3, 0xf0cf, 0xf2de, 0xf2df, 0xc3c9, 0xf2dc, 0xc3c6, 0xf2e4, 0xc3ca, 0xf2e6, 0xf2db, 0xf0ce, 0xf2e8, 0xf2dd, 0xc3c7, 0xf2e3, 0xf2e5, 0xf2e0, 0xf2e7, 0xf2e2, 0xf2e1, 0xc3c8, 0xf4c5, 0xf4c6, 0xf4c8, 0xc4ae, 0xc4af, 0xf4c9, 0xf4c7, 0xf4c4, 0xf642, 0xf645, 0xf641, 0xc4fa, 0xf643, 0xc4f9, 0xc4f8, 0xc4f7, 0xf644, 0xf751, 0xf74f, 0xf74e, 0xf640, 0xf750, 0xf646, 0xf74d, 0xf7f9, 0xf7d7, 0xf7f7, 0xc5db, 0xf7f8, 0xf7fa, 0xf8bf, 0xc5fa, 0xf8be, 0xf8bd, 0xc5fb, 0xc65a, 0xf96e, 0xf9a7, 0xf9a6, 0xf9a8, 0xa6e5, 0xd0aa, 0xd3cf, 0xd3d0, 0xdbc0, 0xf647, 0xf8c0, 0xa6e6, 0xad6c, 0xd0ab, 0xd7b1, 0xb34e, 0xdbc2, 0xdbc1, 0xb5f3, 0xb8c5, 0xe7c1, 0xbdc3, 0xbdc4, 0xbfc5, 0xc5fc, 0xa6e7, 0xd0ac, 0xaaed, 0xd0ae, 0xd0ad, 0xad6d, 0xd3d1, 0xd3d8, 0xb049, 0xd3d6, 0xd3d4, 0xd3db, 0xd3d2, 0xd3d3, 0xb04a, 0xb04e, 0xd3dc, 0xb04d, 0xd3da, 0xd3d7, 0xd3d5, 0xb04b, 0xb04c, 0xd3d9, 0xb350, 0xd7b2, 0xb355, 0xd7c2, 0xb354, 0xd7c4, 0xd7b8, 0xb352, 0xd7c3, 0xd7b3, 0xb353, 0xd7bf, 0xd7bb, 0xd7bd, 0xd7b7, 0xd7be, 0xb34f, 0xd7ba, 0xd7b9, 0xd7b5, 0xd7c0, 0xd7bc, 0xd7b4, 0xd7b6, 0xb351, 0xd7c1, 0xb5f6, 0xdbcd, 0xdbc9, 0xdbcb, 0xdbc6, 0xdbc5, 0xdbc3, 0xdbca, 0xdbcc, 0xdbc8, 0xdbc7, 0xb5f4, 0xb5f5, 0xdbcf, 0xb8cd, 0xdff2, 0xdff8, 0xdff3, 0xdff4, 0xdff9, 0xb8cf, 0xb8c7, 0xb8ce, 0xdff1, 0xdbc4, 0xb8ca, 0xb8c8, 0xdff7, 0xdff6, 0xb8c9, 0xb8cb, 0xdff5, 0xb8c6, 0xb8cc, 0xe3f6, 0xbb74, 0xe442, 0xe441, 0xe3fb, 0xbb76, 0xe440, 0xe3f7, 0xe3f8, 0xbb6e, 0xbb70, 0xe3fd, 0xe3f5, 0xbb72, 0xbb71, 0xe3f9, 0xe3fe, 0xe3fc, 0xbb73, 0xe3fa, 0xdbce, 0xbb6f, 0xe7c2, 0xe7c9, 0xbdc6, 0xe7cd, 0xbdca, 0xe7c5, 0xe7c3, 0xe7cc, 0xbdc5, 0xe7cb, 0xbdc7, 0xbdc8, 0xe7c4, 0xbdc9, 0xe7ca, 0xe7c6, 0xe7c7, 0xe7c8, 0xbb75, 0xeb70, 0xeb7c, 0xbfca, 0xeb77, 0xeb79, 0xbfc8, 0xeb71, 0xeb75, 0xeb78, 0xbfc6, 0xbfc9, 0xeb7b, 0xeb73, 0xeb74, 0xeb7a, 0xeb72, 0xeb76, 0xbfc7, 0xee72, 0xee71, 0xc1b7, 0xee77, 0xc1b9, 0xc1b6, 0xee73, 0xc1ba, 0xee74, 0xee75, 0xee78, 0xc1b8, 0xf0d6, 0xf0d9, 0xf0d3, 0xf0d5, 0xf0d4, 0xf0d7, 0xf0d8, 0xee76, 0xf0d2, 0xc3cd, 0xf2ec, 0xf2ef, 0xf2f1, 0xf2ea, 0xf2eb, 0xf2ee, 0xf2f0, 0xc3ce, 0xc3cc, 0xc3cb, 0xf2ed, 0xf2e9, 0xf4ca, 0xc4b0, 0xf4cb, 0xf649, 0xc4fb, 0xf64b, 0xc4fc, 0xf648, 0xf64a, 0xc5a8, 0xf752, 0xc5a7, 0xf7fd, 0xf7fc, 0xf7fb, 0xf948, 0xf949, 0xf94b, 0xf94a, 0xca50, 0xa6e8, 0xad6e, 0xd7c5, 0xb5f7, 0xdffa, 0xc2d0, 0xf2f2, 0xa8a3, 0xb357, 0xb356, 0xdbd0, 0xb5f8, 0xdbd2, 0xdbd1, 0xdffb, 0xb8d0, 0xe443, 0xe446, 0xe445, 0xe444, 0xe7ce, 0xe7d0, 0xe7cf, 0xbfcc, 0xbfcb, 0xc1bb, 0xee79, 0xee7b, 0xee7a, 0xc2d1, 0xf2f4, 0xf2f3, 0xf4cc, 0xc4b1, 0xc4fd, 0xf754, 0xf753, 0xc65b, 0xa8a4, 0xd0af, 0xad6f, 0xd7c8, 0xd7c6, 0xd7c7, 0xdbd4, 0xdbd5, 0xe043, 0xdbd3, 0xdffc, 0xe041, 0xe040, 0xe042, 0xb8d1, 0xdffe, 0xdffd, 0xe044, 0xe449, 0xe447, 0xe448, 0xe7d3, 0xe7d1, 0xe7d2, 0xeb7d, 0xee7c, 0xee7d, 0xc2d2, 0xf2f5, 0xf4cd, 0xc4b2, 0xf64c, 0xf755, 0xc5a9, 0xf7fe, 0xf94c, 0xa8a5, 0xad71, 0xad72, 0xd0b0, 0xd0b1, 0xad70, 0xb054, 0xb052, 0xb051, 0xb058, 0xb050, 0xb059, 0xd3dd, 0xb056, 0xb053, 0xb057, 0xb055, 0xb04f, 0xb35f, 0xb359, 0xd7cc, 0xb35e, 0xb360, 0xb35a, 0xb35b, 0xd7ca, 0xb358, 0xd7cb, 0xb35d, 0xd7c9, 0xb35c, 0xb644, 0xb646, 0xdbd8, 0xb645, 0xb5f9, 0xb5fd, 0xb8e4, 0xe049, 0xdbda, 0xb5fe, 0xdbdd, 0xdbde, 0xb643, 0xdbe0, 0xdbe2, 0xdbe3, 0xdbd7, 0xdbd6, 0xdbe4, 0xb642, 0xdbe1, 0xdbdf, 0xb640, 0xb5fb, 0xb647, 0xdbdb, 0xdbdc, 0xdbd9, 0xb641, 0xb5fc, 0xb5fa, 0xe048, 0xb8df, 0xb8da, 0xb8d5, 0xb8e5, 0xb8d6, 0xb8d2, 0xb8e1, 0xb8de, 0xb8e0, 0xb8d7, 0xb8dc, 0xb8d3, 0xb8d4, 0xe050, 0xe04d, 0xe045, 0xe04a, 0xb8e2, 0xe051, 0xb8e3, 0xb8d9, 0xe047, 0xe04f, 0xe04b, 0xe04e, 0xe04c, 0xb8dd, 0xe046, 0xb8d8, 0xe44c, 0xbb78, 0xbb7b, 0xe44e, 0xbba5, 0xe44d, 0xbb7d, 0xbdcf, 0xe44f, 0xbba4, 0xe44b, 0xbba6, 0xbb79, 0xb8db, 0xbb7c, 0xbb7a, 0xbb7e, 0xbba2, 0xbb77, 0xbba7, 0xbba3, 0xbba1, 0xe44a, 0xbdd6, 0xbdd2, 0xbdd9, 0xe7d6, 0xbdda, 0xe7e2, 0xe7db, 0xbdcb, 0xe7e3, 0xe7dd, 0xbdd5, 0xe7de, 0xbdd4, 0xe7e1, 0xbdce, 0xe7df, 0xe7d5, 0xbdcd, 0xebaa, 0xbdd3, 0xbdd0, 0xbdd8, 0xe7d4, 0xe7d8, 0xbdcc, 0xe7d7, 0xe7d9, 0xe7da, 0xbdd7, 0xe7dc, 0xe7e0, 0xe7e4, 0xbddb, 0xbfd2, 0xeba5, 0xebab, 0xeba8, 0xeb7e, 0xebac, 0xeba1, 0xeba7, 0xbfcd, 0xbfd3, 0xebad, 0xbfcf, 0xbfd9, 0xbfd4, 0xebaf, 0xeba9, 0xbfd0, 0xeba2, 0xbfda, 0xeba3, 0xeba4, 0xbfdb, 0xbfd8, 0xbdd1, 0xbfce, 0xebb0, 0xbfdc, 0xbfd5, 0xebae, 0xbfd1, 0xbfd6, 0xbfd7, 0xc1c3, 0xeea4, 0xeead, 0xeeaa, 0xeeac, 0xc1c0, 0xeea5, 0xeeab, 0xc1bc, 0xeea7, 0xc1c4, 0xeea3, 0xeea8, 0xeeaf, 0xeba6, 0xeea9, 0xeea2, 0xc1bd, 0xeea1, 0xc1be, 0xeeb0, 0xc1bf, 0xeeae, 0xc1c2, 0xee7e, 0xc1c1, 0xeea6, 0xf0dc, 0xf0ea, 0xf0e5, 0xf0e7, 0xf0db, 0xc2d3, 0xf0da, 0xc2d6, 0xc2d5, 0xf0e9, 0xf0e1, 0xf0de, 0xf0e4, 0xf0dd, 0xf0df, 0xf0e8, 0xf0e6, 0xc2d4, 0xf0ed, 0xf0eb, 0xf0e2, 0xf0ec, 0xf0e3, 0xf2f9, 0xc3cf, 0xf341, 0xf64f, 0xc3d6, 0xf0e0, 0xf2f7, 0xc3d2, 0xf2f8, 0xf2fd, 0xc3d4, 0xc3d5, 0xf2f6, 0xf340, 0xf342, 0xf2fa, 0xf2fc, 0xf2fe, 0xf2fb, 0xf343, 0xc3d1, 0xc3d7, 0xc3d3, 0xc3d0, 0xf4d0, 0xc4b7, 0xf4ce, 0xf4d2, 0xf4d3, 0xc4b5, 0xf4d4, 0xf4d1, 0xf4cf, 0xc4b8, 0xc4b4, 0xf4d5, 0xc4b6, 0xc4b3, 0xc4fe, 0xc540, 0xf64e, 0xf64d, 0xf650, 0xf651, 0xc541, 0xf756, 0xf75b, 0xc5aa, 0xf758, 0xf757, 0xf75a, 0xf759, 0xf843, 0xc5dc, 0xf842, 0xf840, 0xf841, 0xc5fe, 0xc5fd, 0xf8c1, 0xf8c2, 0xc640, 0xf94d, 0xf94e, 0xc667, 0xc66d, 0xf9a9, 0xf9c8, 0xa8a6, 0xd7cd, 0xd7ce, 0xe052, 0xe450, 0xe7e5, 0xc1c6, 0xc1c5, 0xf0ee, 0xf344, 0xf844, 0xa8a7, 0xd3de, 0xb05a, 0xb361, 0xe054, 0xe053, 0xbddc, 0xe7e6, 0xbddd, 0xeeb1, 0xc2d7, 0xc676, 0xa8a8, 0xcdcb, 0xd3df, 0xb362, 0xd7cf, 0xd7d0, 0xdbe5, 0xb648, 0xb8e6, 0xe056, 0xe055, 0xe057, 0xe451, 0xe452, 0xbba8, 0xbfdd, 0xbdde, 0xbfde, 0xeeb5, 0xeeb2, 0xeeb4, 0xeeb3, 0xc1c7, 0xf0ef, 0xf346, 0xf345, 0xcba4, 0xb05c, 0xb05b, 0xd3e0, 0xd7d1, 0xdbe7, 0xdbe6, 0xb649, 0xe059, 0xe05a, 0xe058, 0xb8e8, 0xb8e7, 0xbbaa, 0xbba9, 0xe7e7, 0xebb3, 0xebb1, 0xebb2, 0xbfdf, 0xeeb7, 0xeeb6, 0xf0f2, 0xf0f1, 0xf0f0, 0xf347, 0xf9aa, 0xa8a9, 0xad73, 0xad74, 0xb05d, 0xb05e, 0xd3e2, 0xd3e1, 0xd7d2, 0xb368, 0xb366, 0xb363, 0xb367, 0xb365, 0xb364, 0xb64a, 0xdbea, 0xb8ed, 0xb64c, 0xb651, 0xdbec, 0xb653, 0xb652, 0xb655, 0xdbeb, 0xdbe8, 0xb64f, 0xb64b, 0xb64d, 0xdbe9, 0xb654, 0xb650, 0xb64e, 0xb8ef, 0xb8ee, 0xb8ec, 0xb8f0, 0xb8ea, 0xb8eb, 0xb8e9, 0xe05b, 0xe454, 0xbbac, 0xbbad, 0xbbab, 0xe453, 0xe455, 0xe7ea, 0xe7ec, 0xbde7, 0xe7ed, 0xbde0, 0xe7e9, 0xbddf, 0xbde9, 0xbde5, 0xbde6, 0xbde2, 0xe7e8, 0xbde1, 0xe7ee, 0xe7eb, 0xbde8, 0xbde3, 0xbde4, 0xebb5, 0xebb7, 0xebb6, 0xebb8, 0xbfe0, 0xebb4, 0xc1cb, 0xeeb8, 0xc1c8, 0xc1cc, 0xc1ca, 0xc1c9, 0xf0f3, 0xf0f6, 0xf0f5, 0xf0f4, 0xc2d8, 0xf348, 0xf349, 0xc3d8, 0xf34a, 0xc3d9, 0xc4ba, 0xc4b9, 0xf652, 0xc542, 0xf653, 0xf75c, 0xc5ab, 0xc5ac, 0xf845, 0xc642, 0xa8aa, 0xb36a, 0xb369, 0xe05c, 0xe05d, 0xbbae, 0xebb9, 0xbdea, 0xebba, 0xeeb9, 0xa8ab, 0xd0b2, 0xad76, 0xad75, 0xd3e3, 0xb05f, 0xd3e4, 0xd7d5, 0xd7d4, 0xd7d3, 0xdbee, 0xb658, 0xdbed, 0xb657, 0xdbef, 0xb656, 0xe05f, 0xe062, 0xe060, 0xe061, 0xe065, 0xe05e, 0xe066, 0xe063, 0xe064, 0xbbb0, 0xe456, 0xbbaf, 0xe7f2, 0xe7f0, 0xbdeb, 0xe7ef, 0xe7f1, 0xbdec, 0xebbb, 0xebbc, 0xc1cd, 0xf34c, 0xf34e, 0xf34b, 0xf34d, 0xf4d6, 0xf654, 0xf96f, 0xa8ac, 0xad77, 0xd3e5, 0xd3e7, 0xd3e6, 0xd7d8, 0xb36c, 0xd7d6, 0xb36b, 0xd7d9, 0xd7da, 0xd7d7, 0xdbfb, 0xb660, 0xdbf3, 0xdbf9, 0xb65b, 0xb65e, 0xdbf2, 0xb659, 0xdbf6, 0xe06c, 0xb65d, 0xdbf1, 0xdbf7, 0xdbf4, 0xdbfa, 0xdbf0, 0xdbf8, 0xb65c, 0xb65f, 0xdbf5, 0xb65a, 0xb8f2, 0xe068, 0xb8f1, 0xe06f, 0xe06e, 0xb8f8, 0xb8f9, 0xe070, 0xb8f3, 0xe06d, 0xb8f7, 0xe072, 0xe069, 0xe06b, 0xb8f4, 0xe067, 0xe06a, 0xe071, 0xb8f5, 0xe073, 0xb8f6, 0xbbb1, 0xe45b, 0xe461, 0xe459, 0xe462, 0xe458, 0xe45d, 0xe463, 0xe460, 0xe45f, 0xe45e, 0xe457, 0xe45c, 0xe45a, 0xbdf1, 0xbdee, 0xe7fb, 0xe841, 0xe843, 0xe840, 0xe7f8, 0xe7fa, 0xe845, 0xe842, 0xe7fc, 0xe846, 0xe7f9, 0xe844, 0xbdef, 0xbdf5, 0xbdf3, 0xe7f3, 0xbdf4, 0xbdf0, 0xe7f4, 0xe7f6, 0xe7f5, 0xe7fd, 0xe7fe, 0xbdf2, 0xbded, 0xe7f7, 0xebc6, 0xbfe2, 0xebbd, 0xbfe3, 0xbfe6, 0xebc2, 0xebbf, 0xbfe5, 0xebc3, 0xebc4, 0xebbe, 0xebc7, 0xebc0, 0xebc5, 0xbfe4, 0xbfe1, 0xebc1, 0xeebf, 0xc1d0, 0xc1ce, 0xc1d1, 0xc1cf, 0xeebe, 0xeebb, 0xeeba, 0xeebd, 0xeebc, 0xf145, 0xc2de, 0xf0fb, 0xf0fa, 0xc2d9, 0xf141, 0xf140, 0xf0f7, 0xf143, 0xf0fc, 0xc2dd, 0xf0f9, 0xf142, 0xf0f8, 0xc2da, 0xc2dc, 0xf0fd, 0xc2db, 0xf0fe, 0xf144, 0xf352, 0xc3de, 0xf34f, 0xf353, 0xc3db, 0xf351, 0xc3e0, 0xc3dd, 0xf350, 0xc3df, 0xf354, 0xc3da, 0xc4bc, 0xc4be, 0xf4d9, 0xc4bd, 0xf4d7, 0xc3dc, 0xf4d8, 0xc4bb, 0xc543, 0xc545, 0xf656, 0xc544, 0xf655, 0xf761, 0xc5ad, 0xf760, 0xc5ae, 0xf75e, 0xf75d, 0xf762, 0xf763, 0xf846, 0xf75f, 0xf8c6, 0xf8c3, 0xf8c4, 0xf8c5, 0xc65c, 0xf951, 0xf950, 0xf94f, 0xf970, 0xf9be, 0xf9ab, 0xc66e, 0xa8ad, 0xb060, 0xb8fa, 0xbdf6, 0xebc8, 0xc2df, 0xf355, 0xf9ac, 0xa8ae, 0xaaee, 0xad79, 0xad78, 0xb063, 0xd3e8, 0xb061, 0xd3e9, 0xb062, 0xd7df, 0xd7db, 0xb36d, 0xd7de, 0xd7dd, 0xd7dc, 0xb36e, 0xd7e0, 0xd7e1, 0xdc43, 0xdc41, 0xdc45, 0xdc46, 0xdc4c, 0xdc48, 0xdc4a, 0xdc42, 0xdbfc, 0xdc49, 0xdc4b, 0xdc44, 0xdc47, 0xdbfd, 0xb662, 0xdc40, 0xdbfe, 0xb661, 0xb663, 0xb8fd, 0xe075, 0xe077, 0xe076, 0xe07b, 0xb8fb, 0xe078, 0xe074, 0xe079, 0xe07a, 0xb8fc, 0xb8fe, 0xe07c, 0xe467, 0xe466, 0xe464, 0xe465, 0xbbb3, 0xbbb5, 0xbbb2, 0xbbb4, 0xe84d, 0xe84e, 0xe849, 0xe84a, 0xbdf8, 0xbdfd, 0xbdf7, 0xbdfe, 0xbdf9, 0xe84b, 0xe84c, 0xe848, 0xbe40, 0xbdfb, 0xbdfa, 0xbdfc, 0xe847, 0xebca, 0xbfe8, 0xebcc, 0xbfea, 0xebcf, 0xebcb, 0xebc9, 0xebce, 0xbfe9, 0xebcd, 0xbfe7, 0xc1d3, 0xc1d6, 0xeec1, 0xc1d4, 0xeec0, 0xc1d2, 0xc1d5, 0xf146, 0xf147, 0xf148, 0xc2e0, 0xf149, 0xc2e1, 0xc3e2, 0xf358, 0xf359, 0xf357, 0xf356, 0xf35a, 0xc3e1, 0xf4dd, 0xf4db, 0xf4dc, 0xf4de, 0xf4da, 0xf4df, 0xf658, 0xf659, 0xf657, 0xc546, 0xf764, 0xc5af, 0xf765, 0xf848, 0xf847, 0xa8af, 0xb664, 0xb940, 0xbbb6, 0xbfec, 0xbfeb, 0xc3e3, 0xc47c, 0xc547, 0xa8b0, 0xb064, 0xb941, 0xf35b, 0xcba6, 0xa8b1, 0xa8b4, 0xa8b3, 0xa8b2, 0xcba5, 0xcdcd, 0xcdcf, 0xaaef, 0xaaf1, 0xcdcc, 0xcdce, 0xaaf0, 0xcdd1, 0xcdd0, 0xcdd2, 0xd0b6, 0xd0b4, 0xad7c, 0xd0b3, 0xada3, 0xad7e, 0xad7b, 0xada4, 0xad7d, 0xada2, 0xada1, 0xd0b5, 0xad7a, 0xb06a, 0xd3eb, 0xd3f1, 0xb067, 0xb06e, 0xb069, 0xd3ee, 0xd3f0, 0xb06c, 0xd3ea, 0xd3ed, 0xb068, 0xb065, 0xd3ec, 0xb06b, 0xd3ef, 0xb06d, 0xb066, 0xd7e3, 0xd7e6, 0xb370, 0xb37a, 0xb376, 0xd7e4, 0xb37e, 0xb377, 0xb37c, 0xb372, 0xb36f, 0xb371, 0xb37d, 0xd7e5, 0xb375, 0xb378, 0xb374, 0xb379, 0xd7e7, 0xb37b, 0xb373, 0xd7e2, 0xdc4d, 0xb665, 0xdc4f, 0xb667, 0xb669, 0xdc4e, 0xb666, 0xb66a, 0xb668, 0xb947, 0xe0a3, 0xb94f, 0xe07e, 0xb950, 0xb945, 0xe0a1, 0xb94a, 0xe0a2, 0xb943, 0xb942, 0xb94d, 0xb94c, 0xb94b, 0xb949, 0xb94e, 0xe07d, 0xb944, 0xb946, 0xb948, 0xbbb8, 0xbbbb, 0xbbbf, 0xbbb9, 0xbbbe, 0xbbbc, 0xbbb7, 0xbbbd, 0xbbba, 0xe852, 0xbe43, 0xbe41, 0xe853, 0xbe44, 0xbe42, 0xe851, 0xe850, 0xbff0, 0xe84f, 0xbfee, 0xbfed, 0xebd0, 0xbe45, 0xbfef, 0xebd1, 0xbff2, 0xebd2, 0xbff1, 0xc1d8, 0xeec3, 0xc1d7, 0xc1dc, 0xc1da, 0xc1db, 0xc2e3, 0xc1d9, 0xeec2, 0xebd3, 0xc2e2, 0xc2e4, 0xc3e4, 0xc3e5, 0xf4e0, 0xc5de, 0xc5dd, 0xa8b6, 0xca55, 0xb06f, 0xca52, 0xca53, 0xca51, 0xca54, 0xcbaa, 0xcba7, 0xcbac, 0xcba8, 0xa8b7, 0xa8ba, 0xcba9, 0xa8b9, 0xcbab, 0xa8b8, 0xcdd5, 0xcdd7, 0xaaf4, 0xcdd3, 0xcdd6, 0xcdd4, 0xaaf2, 0xaaf5, 0xaaf3, 0xd0b8, 0xd0bc, 0xd0b9, 0xada7, 0xada8, 0xd0bb, 0xd0bd, 0xd0bf, 0xada5, 0xd0be, 0xada6, 0xd7ee, 0xd0ba, 0xd3f2, 0xd3fb, 0xd3f9, 0xd3f4, 0xd3f5, 0xd3fa, 0xd3fc, 0xb071, 0xd3f7, 0xd3f3, 0xb070, 0xb072, 0xd3f6, 0xd3fd, 0xd3f8, 0xb3a1, 0xd7f1, 0xd7e9, 0xd7ef, 0xd7f0, 0xb3a2, 0xd7e8, 0xd7ea, 0xd0b7, 0xd7ec, 0xd7ed, 0xd7eb, 0xb66c, 0xdc56, 0xebd4, 0xdc57, 0xdc54, 0xb3a3, 0xb66e, 0xdc53, 0xdc59, 0xdc58, 0xb66b, 0xdc5c, 0xdc52, 0xdc5b, 0xdc50, 0xdc5a, 0xdc55, 0xb66d, 0xe0aa, 0xe0a5, 0xe0ab, 0xe0a6, 0xe0a4, 0xe0a7, 0xb951, 0xe0a9, 0xe0a8, 0xb952, 0xbbc1, 0xbbc0, 0xe46e, 0xe471, 0xe469, 0xe46d, 0xbbc2, 0xe46c, 0xe46a, 0xe470, 0xe46b, 0xe468, 0xe46f, 0xe859, 0xbe48, 0xf14a, 0xe856, 0xe857, 0xe855, 0xdc51, 0xbe47, 0xe85a, 0xe854, 0xbe46, 0xbe49, 0xe858, 0xebd5, 0xbff3, 0xebd6, 0xebd7, 0xeec4, 0xc1dd, 0xf14b, 0xf14c, 0xf14d, 0xf35d, 0xf35c, 0xf4e2, 0xf4e1, 0xf65b, 0xf65c, 0xf65a, 0xf766, 0xc5b0, 0xa8bb, 0xadaa, 0xada9, 0xb075, 0xb074, 0xd440, 0xd441, 0xd3fe, 0xb073, 0xd7f5, 0xd7f6, 0xd7f2, 0xb3a4, 0xd7f3, 0xd7f4, 0xdc5f, 0xdc61, 0xdc5d, 0xdc60, 0xb66f, 0xdc5e, 0xb670, 0xdd73, 0xb955, 0xb954, 0xb953, 0xe0ac, 0xe0ad, 0xe473, 0xe475, 0xbbc6, 0xbbc3, 0xbbc5, 0xbbc4, 0xe474, 0xe472, 0xe861, 0xe85e, 0xe85f, 0xbe4d, 0xe860, 0xe85b, 0xe85c, 0xbe4a, 0xbe4b, 0xe85d, 0xbe4c, 0xebdb, 0xebdc, 0xebd9, 0xebda, 0xbff4, 0xebd8, 0xeec8, 0xeec5, 0xeec7, 0xc1e0, 0xeecb, 0xc1df, 0xeec9, 0xeecc, 0xeeca, 0xeec6, 0xc1de, 0xf14f, 0xf150, 0xf14e, 0xf152, 0xc2e5, 0xc2e6, 0xf35f, 0xc3e7, 0xf151, 0xf35e, 0xc3e6, 0xf4e5, 0xf4e6, 0xc4bf, 0xf4e4, 0xf4e3, 0xf65d, 0xc548, 0xf849, 0xf8c8, 0xf8c7, 0xc643, 0xc65d, 0xf8c9, 0xf971, 0xc66f, 0xa8bc, 0xaaf6, 0xb956, 0xc4c0, 0xa8bd, 0xadab, 0xb3a5, 0xb671, 0xc2e7, 0xaaf7, 0xd0c1, 0xd0c0, 0xd442, 0xb078, 0xb076, 0xb07a, 0xd444, 0xb079, 0xb077, 0xd443, 0xb3a8, 0xd7fc, 0xb3a7, 0xb3a9, 0xd842, 0xb3ab, 0xd7fe, 0xd840, 0xd7f7, 0xb3aa, 0xd843, 0xd7f9, 0xd7fa, 0xd7f8, 0xb3a6, 0xd841, 0xd7fb, 0xd7fd, 0xdc6d, 0xdc6c, 0xdc6a, 0xdc62, 0xdc71, 0xdc65, 0xdc6f, 0xdc76, 0xdc6e, 0xb679, 0xb675, 0xdc63, 0xdc69, 0xb677, 0xdc68, 0xb678, 0xb67a, 0xdc6b, 0xb672, 0xb673, 0xdc77, 0xdc75, 0xdc74, 0xdc66, 0xdc72, 0xb676, 0xb674, 0xdc73, 0xdc64, 0xdc67, 0xdc70, 0xe4ba, 0xe0b7, 0xe0b0, 0xe0c3, 0xe0cc, 0xe0b3, 0xb961, 0xe0c0, 0xb957, 0xb959, 0xb965, 0xe0b1, 0xb95a, 0xb95c, 0xb966, 0xb95b, 0xb964, 0xe0b9, 0xe0ae, 0xb962, 0xe0b8, 0xb95e, 0xe0ca, 0xb963, 0xe0c8, 0xe0bc, 0xe0c6, 0xb960, 0xe0af, 0xe0c9, 0xe0c4, 0xe0cb, 0xb958, 0xb967, 0xb95d, 0xe0b5, 0xe0bd, 0xe0c1, 0xe0c5, 0xb95f, 0xe0b4, 0xe0b2, 0xe0be, 0xe0bb, 0xe0ba, 0xe0bf, 0xe0c2, 0xe0c7, 0xe478, 0xbbc7, 0xe4a4, 0xe47a, 0xbbcc, 0xbbd0, 0xe4ad, 0xe4b5, 0xe4a6, 0xbbc8, 0xe4aa, 0xe0b6, 0xbbc9, 0xe4b1, 0xe4b6, 0xe4ae, 0xe4b0, 0xe4b9, 0xe4b2, 0xe47e, 0xe4a9, 0xbbd1, 0xbbcd, 0xe47c, 0xe4ab, 0xbbcb, 0xe4a5, 0xbbca, 0xe4b3, 0xe4a2, 0xe479, 0xbbce, 0xe4b8, 0xe47b, 0xe4af, 0xe4ac, 0xe4a7, 0xe477, 0xe476, 0xe4a1, 0xe4b4, 0xbbcf, 0xe4b7, 0xe47d, 0xe4a3, 0xbe52, 0xbe5a, 0xbe55, 0xe8a4, 0xe8a1, 0xe867, 0xbe50, 0xbe4f, 0xbe56, 0xe865, 0xbe54, 0xe871, 0xe863, 0xe864, 0xbe4e, 0xe8a3, 0xbe58, 0xe874, 0xe879, 0xe873, 0xebee, 0xe86f, 0xe877, 0xe875, 0xe868, 0xe862, 0xe87d, 0xbe57, 0xe87e, 0xe878, 0xe86d, 0xe86b, 0xe866, 0xe86e, 0xe87b, 0xe86a, 0xe87a, 0xe8a2, 0xbe53, 0xe876, 0xe87c, 0xe872, 0xe86c, 0xbe51, 0xe4a8, 0xe870, 0xbe59, 0xe869, 0xebf4, 0xbff7, 0xebf3, 0xebf0, 0xec44, 0xbffb, 0xec41, 0xebf8, 0xec43, 0xebe9, 0xebf6, 0xbffd, 0xebe1, 0xebdf, 0xec42, 0xec40, 0xebfe, 0xebed, 0xebec, 0xebe2, 0xc040, 0xebe8, 0xebf2, 0xebfd, 0xc043, 0xec45, 0xc1e8, 0xc045, 0xbffe, 0xebe6, 0xebef, 0xebde, 0xebe0, 0xbff5, 0xc042, 0xbffa, 0xebe7, 0xebf7, 0xebf1, 0xc041, 0xebdd, 0xc1e3, 0xebf9, 0xebfc, 0xbffc, 0xebeb, 0xc044, 0xbff9, 0xbff8, 0xebf5, 0xebfb, 0xbff6, 0xebe4, 0xebfa, 0xebe5, 0xebea, 0xeed2, 0xeed7, 0xc1e5, 0xc1e7, 0xeedd, 0xc1e1, 0xeeec, 0xeee3, 0xeed8, 0xeed9, 0xeee2, 0xc1ee, 0xeee1, 0xeed1, 0xeee0, 0xeed4, 0xeeed, 0xc1ed, 0xc1eb, 0xeed5, 0xeee8, 0xeeda, 0xeee7, 0xeee9, 0xeed0, 0xc1e6, 0xeeea, 0xeede, 0xc1ea, 0xeedb, 0xc1ec, 0xeee4, 0xc1e4, 0xeed6, 0xeee5, 0xeedf, 0xebe3, 0xeee6, 0xeed3, 0xc1e9, 0xeeeb, 0xc1e2, 0xeece, 0xf160, 0xf159, 0xc2e9, 0xf154, 0xf163, 0xf15b, 0xeedc, 0xf165, 0xf155, 0xc2e8, 0xf15f, 0xc2ea, 0xc2f2, 0xc2f0, 0xf161, 0xc2f1, 0xf157, 0xf158, 0xf15d, 0xf162, 0xeecd, 0xc2eb, 0xf16a, 0xf167, 0xf16b, 0xf15e, 0xf15a, 0xf168, 0xf36a, 0xf15c, 0xc2ee, 0xc2ed, 0xeecf, 0xc2ef, 0xf164, 0xf166, 0xc2ec, 0xf169, 0xf153, 0xf156, 0xf373, 0xf363, 0xc3eb, 0xf371, 0xf361, 0xc3ec, 0xf36c, 0xf368, 0xc3f1, 0xf372, 0xf362, 0xf365, 0xc3e9, 0xf374, 0xf36d, 0xf370, 0xc3ef, 0xc3f4, 0xc3f2, 0xf369, 0xf364, 0xc3ed, 0xc3ee, 0xf360, 0xc3ea, 0xc3e8, 0xc3f0, 0xf36f, 0xc3f3, 0xf36b, 0xf375, 0xc3f5, 0xf367, 0xf36e, 0xf4f3, 0xf542, 0xf4f5, 0xf4fc, 0xf366, 0xf4fa, 0xf4e9, 0xf540, 0xc4c3, 0xf4ed, 0xf4fe, 0xf4f4, 0xc4c2, 0xf544, 0xf4f6, 0xf4fb, 0xf4fd, 0xf4e7, 0xf541, 0xf4f2, 0xf4f7, 0xf4eb, 0xf4ef, 0xf543, 0xf4f9, 0xf4e8, 0xf4ec, 0xf4ee, 0xf4f8, 0xc4c1, 0xf4f1, 0xf4ea, 0xf4f0, 0xf661, 0xf666, 0xc54f, 0xf668, 0xc549, 0xf664, 0xf66a, 0xc54e, 0xc54a, 0xc54b, 0xf660, 0xf667, 0xc54d, 0xf665, 0xc54c, 0xf65f, 0xf663, 0xf662, 0xf65e, 0xf669, 0xc5b1, 0xf76d, 0xf770, 0xf76c, 0xf76e, 0xf76f, 0xf769, 0xf76a, 0xf767, 0xf76b, 0xf768, 0xc5b2, 0xc5b3, 0xf84b, 0xf84d, 0xf84c, 0xf84e, 0xc5e0, 0xf84a, 0xc5df, 0xc5e1, 0xf8cb, 0xf8cc, 0xc644, 0xf8ca, 0xf953, 0xf952, 0xf954, 0xc65f, 0xf955, 0xc65e, 0xf956, 0xf972, 0xf975, 0xf974, 0xc668, 0xf973, 0xc672, 0xc670, 0xc671, 0xc677, 0xf9c0, 0xf9c1, 0xf9bf, 0xf9c9, 0xaaf8, 0xd844, 0xdc78, 0xe8a5, 0xf376, 0xaaf9, 0xadac, 0xb07b, 0xd845, 0xd846, 0xb3ac, 0xb67d, 0xdc7a, 0xdc79, 0xb6a3, 0xb67c, 0xdc7b, 0xb67e, 0xb6a2, 0xb6a1, 0xb67b, 0xb968, 0xe0d0, 0xe0ce, 0xe0cf, 0xe0cd, 0xbbd2, 0xbbd5, 0xbbd7, 0xbbd6, 0xbbd3, 0xbbd4, 0xe8a7, 0xe8a6, 0xbe5b, 0xe8a8, 0xe8a9, 0xbe5c, 0xec4d, 0xec4b, 0xeef3, 0xec49, 0xec4a, 0xc046, 0xec46, 0xec4e, 0xec48, 0xec4c, 0xeeef, 0xeef1, 0xeef2, 0xc1f3, 0xeeee, 0xc1f2, 0xeef0, 0xc1ef, 0xc1f0, 0xc1f1, 0xec47, 0xc2f5, 0xf16e, 0xf16c, 0xf16d, 0xc2f3, 0xc2f6, 0xc2f4, 0xf377, 0xf378, 0xc3f6, 0xf545, 0xf547, 0xf546, 0xc4c4, 0xc550, 0xf66d, 0xf66c, 0xf66b, 0xaafa, 0xc9aa, 0xca58, 0xa6e9, 0xca56, 0xca59, 0xca57, 0xcbae, 0xa8c1, 0xa8c2, 0xcbb0, 0xa8bf, 0xcbaf, 0xcbad, 0xa8c0, 0xa8be, 0xcdd8, 0xcddb, 0xaafd, 0xcdda, 0xcdd9, 0xaafc, 0xaafb, 0xab40, 0xcddc, 0xaafe, 0xd0c6, 0xadae, 0xadaf, 0xadb0, 0xd0c7, 0xd0c3, 0xadad, 0xd0c4, 0xd0c5, 0xd0c2, 0xb0a4, 0xb0a1, 0xd445, 0xb0a2, 0xb0a5, 0xd446, 0xb07e, 0xb07c, 0xb07d, 0xb0a3, 0xb3ad, 0xd849, 0xb3b5, 0xd848, 0xd84b, 0xb3b1, 0xd84a, 0xb6ab, 0xb3af, 0xb3b2, 0xb3ae, 0xb3b3, 0xb3b4, 0xb3b0, 0xd847, 0xb6a7, 0xdc7d, 0xdca3, 0xdca2, 0xb6ac, 0xb6a8, 0xb6a9, 0xdc7c, 0xdc7e, 0xdca1, 0xb6a4, 0xb6a6, 0xb6aa, 0xb6a5, 0xe0d3, 0xe0d1, 0xe0d2, 0xb96a, 0xb96b, 0xe0d4, 0xb969, 0xbbd8, 0xbbda, 0xbbd9, 0xe4bb, 0xe4bc, 0xe8ab, 0xe8aa, 0xc047, 0xc048, 0xec4f, 0xc049, 0xeef6, 0xeef4, 0xeef5, 0xc1f4, 0xf16f, 0xc3f7, 0xc1f5, 0xab41, 0xb0a6, 0xd447, 0xd84c, 0xb3b6, 0xb6ad, 0xdca4, 0xdca6, 0xb6af, 0xb6ae, 0xb6b0, 0xb6b1, 0xdca5, 0xb96e, 0xb96f, 0xb96d, 0xbbdb, 0xb96c, 0xe0d5, 0xbbdc, 0xe8ac, 0xec50, 0xc04a, 0xc1f6, 0xf170, 0xf174, 0xc2f9, 0xf171, 0xc2fa, 0xc2f8, 0xf175, 0xc2fb, 0xf173, 0xf379, 0xc2f7, 0xc3f8, 0xf8cd, 0xab42, 0xb3b8, 0xb3b7, 0xb6b2, 0xdca8, 0xdca7, 0xb6b3, 0xe0d9, 0xb973, 0xb970, 0xe0d8, 0xb972, 0xe0d6, 0xb971, 0xe0d7, 0xe4bd, 0xbbdd, 0xe8af, 0xbe5d, 0xe8ad, 0xbe5e, 0xbe5f, 0xe8ae, 0xbe60, 0xec51, 0xc04e, 0xc04b, 0xc050, 0xec53, 0xc04c, 0xec52, 0xc04f, 0xc04d, 0xeef9, 0xeefb, 0xc1f7, 0xeefa, 0xc1f8, 0xeef8, 0xeef7, 0xf177, 0xf176, 0xc2fc, 0xf178, 0xf37e, 0xc3fa, 0xf37d, 0xf37a, 0xc3f9, 0xf37b, 0xf37c, 0xf548, 0xf549, 0xc4c5, 0xc553, 0xf66e, 0xc551, 0xc552, 0xf66f, 0xc5b4, 0xc5b5, 0xf771, 0xc645, 0xf8cf, 0xc647, 0xf8ce, 0xf8d0, 0xc646, 0xf957, 0xf9ad, 0xab43, 0xb974, 0xe4be, 0xe8b0, 0xc051, 0xc052, 0xab44, 0xbe61, 0xc3fb, 0xadb1, 0xc053, 0xc5e2, 0xadb2, 0xd84d, 0xdca9, 0xdcab, 0xdcaa, 0xe0dd, 0xe0da, 0xb975, 0xb976, 0xe0db, 0xe0dc, 0xe4c0, 0xe4c5, 0xbbde, 0xe4bf, 0xe4c1, 0xe4c8, 0xe4c3, 0xe4c7, 0xe4c4, 0xe4c2, 0xe4c6, 0xbbdf, 0xe8b3, 0xe8b1, 0xbe63, 0xbe62, 0xe8b2, 0xbe64, 0xec56, 0xec55, 0xc054, 0xec54, 0xeefc, 0xeefe, 0xef41, 0xef40, 0xc1f9, 0xeefd, 0xf1a1, 0xc2fd, 0xf17d, 0xf1a2, 0xc2fe, 0xf17b, 0xf17e, 0xf17c, 0xf179, 0xc340, 0xf17a, 0xf3a1, 0xf3a3, 0xf3a2, 0xf54a, 0xf54b, 0xf670, 0xc5b7, 0xc5b6, 0xf84f, 0xf850, 0xc648, 0xf8d1, 0xc669, 0xadb3, 0xb6b4, 0xe4ca, 0xe4c9, 0xe8b5, 0xe8b4, 0xc1fa, 0xef43, 0xef42, 0xf1a5, 0xf1a3, 0xf1a6, 0xf1a4, 0xc3fc, 0xf3a4, 0xf3a5, 0xf3a6, 0xf671, 0xf772, 0xf8d2, 0xadb4, 0xec57, 0xef44, 0xadb5, 0xbbe0, 0xec58, 0xc341, 0xf1a7, 0xc3fd, 0xf54c, 0xf54d, 0xc554, 0xf851, 0xadb6, 0xb3bb, 0xb3bc, 0xd84e, 0xb6b5, 0xb6b6, 0xdcac, 0xb6b7, 0xb97a, 0xb97c, 0xe0df, 0xe0e0, 0xe0de, 0xb977, 0xb978, 0xb97b, 0xb979, 0xe4cb, 0xbbe1, 0xbbe2, 0xe8bc, 0xbe67, 0xe8b7, 0xe8b6, 0xe8bb, 0xbe65, 0xc05b, 0xe8b8, 0xe8bd, 0xe8ba, 0xe8b9, 0xbe66, 0xc059, 0xec5a, 0xc055, 0xec5b, 0xec59, 0xc058, 0xc056, 0xc05a, 0xc057, 0xef45, 0xef4a, 0xef46, 0xef49, 0xc1fb, 0xedd4, 0xef48, 0xef47, 0xc344, 0xc342, 0xc345, 0xc343, 0xf1a8, 0xf1a9, 0xf1aa, 0xc346, 0xf3aa, 0xc440, 0xf3a8, 0xc441, 0xf3a7, 0xf3a9, 0xc3fe, 0xf551, 0xf54e, 0xf54f, 0xf550, 0xf672, 0xc556, 0xc555, 0xf774, 0xf773, 0xc5b8, 0xc5e3, 0xc649, 0xc660, 0xf958, 0xf9ae, 0xf9af, 0xadb7, 0xdcad, 0xe0e1, 0xe4cc, 0xe4cd, 0xbbe3, 0xbbe4, 0xe8be, 0xbe68, 0xc1fc, 0xf1ab, 0xc347, 0xf3ad, 0xc442, 0xf3ac, 0xf3ae, 0xf3ab, 0xf675, 0xf552, 0xf553, 0xc4c6, 0xf674, 0xf673, 0xf775, 0xf9b0, 0xadb8, 0xadb9, 0xb0a7, 0xd448, 0xd84f, 0xb6b8, 0xb6bb, 0xb6b9, 0xdcae, 0xb6bd, 0xb6ba, 0xb6bc, 0xb97e, 0xe0e2, 0xe0e3, 0xe8c0, 0xb97d, 0xb9a1, 0xb9a2, 0xe4cf, 0xe4ce, 0xbbe5, 0xbbe6, 0xe4d0, 0xe8bf, 0xbbe8, 0xbe69, 0xbbe7, 0xc05c, 0xe8c1, 0xbe6b, 0xbe6a, 0xe8c2, 0xe8c5, 0xe8c3, 0xe8c4, 0xbe6c, 0xc061, 0xc05f, 0xc05e, 0xec5d, 0xc060, 0xec5c, 0xef4b, 0xec5e, 0xc05d, 0xec5f, 0xef4e, 0xef4c, 0xef4d, 0xef52, 0xc34b, 0xef51, 0xef54, 0xef53, 0xef50, 0xef4f, 0xc1fd, 0xf1ae, 0xf1ad, 0xc34a, 0xc348, 0xc349, 0xf1ac, 0xf3b1, 0xc443, 0xf3b0, 0xf3af, 0xc444, 0xf558, 0xf557, 0xf555, 0xf554, 0xc4c8, 0xc4c7, 0xf559, 0xf776, 0xc5b9, 0xf677, 0xc557, 0xf676, 0xf556, 0xf777, 0xc5e4, 0xc661, 0xf959, 0xf9b1, 0xadba, 0xd850, 0xef55, 0xadbb, 0xe4d2, 0xe4d1, 0xec60, 0xef57, 0xef56, 0xc34c, 0xf3b2, 0xf3b3, 0xc4c9, 0xf9b2, 0xb0a8, 0xb6bf, 0xb6be, 0xe0e4, 0xe0e6, 0xb9a4, 0xe0e5, 0xb9a3, 0xb9a5, 0xe0e7, 0xe4d4, 0xe4d6, 0xe4d5, 0xe4d8, 0xbbe9, 0xe4d7, 0xe4d3, 0xe4d9, 0xe8cc, 0xe8cf, 0xe8d1, 0xe8c7, 0xe8cb, 0xe8c8, 0xbe6e, 0xbe71, 0xbe73, 0xe8c9, 0xe8ca, 0xbe72, 0xe8cd, 0xe8d0, 0xe8ce, 0xbe74, 0xbe70, 0xe8c6, 0xbe6d, 0xbe6f, 0xc063, 0xec66, 0xec64, 0xec63, 0xec69, 0xec68, 0xec67, 0xec62, 0xc062, 0xec61, 0xec65, 0xc064, 0xef5a, 0xef5e, 0xef5b, 0xef5d, 0xef5c, 0xef59, 0xef5f, 0xef62, 0xef60, 0xef61, 0xc240, 0xc1fe, 0xef58, 0xef63, 0xf1b3, 0xf1b6, 0xf1b8, 0xf1b7, 0xf1b1, 0xf1b5, 0xf1b0, 0xf1b2, 0xc34d, 0xf1af, 0xf1b4, 0xf3c0, 0xf3b5, 0xc445, 0xc446, 0xf3b4, 0xf3b9, 0xf3bf, 0xf3b7, 0xf3be, 0xf3bb, 0xf3ba, 0xf3bd, 0xf3b8, 0xf3b6, 0xf3bc, 0xf560, 0xf55e, 0xc4ca, 0xf55d, 0xf563, 0xf561, 0xc4cb, 0xf55c, 0xf55a, 0xf55b, 0xc4cd, 0xf55f, 0xc4cc, 0xf562, 0xf678, 0xf67e, 0xf679, 0xc55b, 0xf6a1, 0xc55a, 0xf67d, 0xf67c, 0xc559, 0xf67b, 0xc558, 0xf67a, 0xf77d, 0xf7a1, 0xf77e, 0xf77b, 0xc5bb, 0xf778, 0xf77c, 0xf7a3, 0xf7a2, 0xf779, 0xf77a, 0xc5ba, 0xf852, 0xc5e7, 0xf853, 0xc5e5, 0xc5e6, 0xf8d3, 0xc64a, 0xf976, 0xc66a, 0xf9b3, 0xc66b, 0xf9b4, 0xf9b5, 0xf9c3, 0xf9c2, 0xc67a, 0xf9cd, 0xb0a9, 0xe0e9, 0xe0e8, 0xbbea, 0xbbeb, 0xe4da, 0xe8d2, 0xec6c, 0xbe75, 0xc065, 0xec6a, 0xec6d, 0xc066, 0xef64, 0xec6b, 0xf1b9, 0xc34e, 0xf3c1, 0xf566, 0xf564, 0xf565, 0xf6a2, 0xc55c, 0xf7a4, 0xc5ea, 0xc5bc, 0xc5e8, 0xc5e9, 0xf8d4, 0xc662, 0xb0aa, 0xf1ba, 0xd449, 0xb9a6, 0xe4db, 0xbbec, 0xe4dc, 0xe8d4, 0xe8d3, 0xc068, 0xbe76, 0xbe77, 0xe8d7, 0xe8d6, 0xe8d5, 0xec6e, 0xec71, 0xec70, 0xec6f, 0xc067, 0xef68, 0xef66, 0xef65, 0xef67, 0xc34f, 0xf1bc, 0xf1bd, 0xc350, 0xf1bb, 0xf3c3, 0xf3c2, 0xf3c5, 0xc447, 0xf3c4, 0xf567, 0xf569, 0xf568, 0xf6a3, 0xf6a6, 0xf6a4, 0xf6a5, 0xf7a5, 0xc5bd, 0xf854, 0xf855, 0xf856, 0xc64b, 0xc663, 0xf9b6, 0xb0ab, 0xbe78, 0xc069, 0xf1be, 0xf7a6, 0xf9c4, 0xd44a, 0xc67b, 0xb0ac, 0xec72, 0xf1bf, 0xf3c6, 0xf6a7, 0xf7a7, 0xb0ad, 0xe4dd, 0xe4de, 0xbbed, 0xbbee, 0xe8d9, 0xbe7a, 0xbe79, 0xe8d8, 0xef69, 0xf1c0, 0xf1c2, 0xf1c1, 0xc353, 0xc352, 0xc351, 0xc55e, 0xf6a8, 0xc55d, 0xf7a9, 0xf7a8, 0xc64c, 0xf8d5, 0xb3bd, 0xe0ea, 0xe4e1, 0xe4df, 0xe4e0, 0xe8e2, 0xe8dd, 0xe8da, 0xe8e1, 0xe8e3, 0xbe7c, 0xe8e0, 0xe8dc, 0xe8db, 0xe8df, 0xe8de, 0xbe7b, 0xec7d, 0xec78, 0xec76, 0xeca1, 0xec77, 0xec73, 0xec79, 0xec74, 0xef72, 0xec75, 0xeca2, 0xec7c, 0xc06a, 0xec7b, 0xec7a, 0xec7e, 0xef6a, 0xef6d, 0xef6c, 0xef74, 0xef6f, 0xef73, 0xef71, 0xef70, 0xef6e, 0xef6b, 0xc243, 0xc242, 0xc244, 0xc241, 0xef75, 0xf1c8, 0xf1cb, 0xf1c9, 0xf1cd, 0xf1ce, 0xf1c6, 0xc358, 0xf1c7, 0xf1c5, 0xf1cc, 0xf1c4, 0xf1c3, 0xc357, 0xc355, 0xc354, 0xf1ca, 0xf3cf, 0xf3d5, 0xc44a, 0xf3d0, 0xf3d3, 0xf3d7, 0xc44b, 0xf3d2, 0xf3ca, 0xf3c9, 0xf3d6, 0xf3cd, 0xf3cb, 0xf3d4, 0xf3cc, 0xc449, 0xc448, 0xf3c7, 0xf3c8, 0xf3d1, 0xf3ce, 0xf56c, 0xf56f, 0xc356, 0xf56d, 0xf573, 0xf571, 0xf56b, 0xf576, 0xf56a, 0xc4cf, 0xf572, 0xf56e, 0xc4ce, 0xf575, 0xf574, 0xf6ab, 0xf6aa, 0xf6b1, 0xf6ad, 0xf6b0, 0xc560, 0xf6ae, 0xf6af, 0xf6a9, 0xf6ac, 0xc55f, 0xc5bf, 0xf7b4, 0xf7af, 0xf7b3, 0xf7b6, 0xf7b2, 0xf7ae, 0xc5c1, 0xf7b1, 0xf7b5, 0xc5c0, 0xf7ac, 0xf570, 0xf7b0, 0xf7ad, 0xf7aa, 0xf7ab, 0xc5be, 0xf85a, 0xf85c, 0xf85f, 0xf85b, 0xf860, 0xf859, 0xf857, 0xc5eb, 0xf85d, 0xc5ed, 0xc5ec, 0xf858, 0xf85e, 0xf8da, 0xc64d, 0xf8db, 0xf8d9, 0xf8d6, 0xf8d8, 0xf8d7, 0xf95a, 0xf95c, 0xf95b, 0xf979, 0xf978, 0xf977, 0xf97a, 0xc673, 0xc674, 0xf9ca, 0xf9ce, 0xb3be, 0xdcaf, 0xe0ed, 0xb9a7, 0xe0eb, 0xe0ec, 0xe4e2, 0xe4e3, 0xbbf1, 0xbbef, 0xe4e4, 0xbbf0, 0xe8e8, 0xe8eb, 0xe8e5, 0xe8ec, 0xe8e4, 0xe8e6, 0xe8e7, 0xe8ea, 0xbea1, 0xe8ef, 0xe8ee, 0xbe7d, 0xe8e9, 0xe8ed, 0xbe7e, 0xecac, 0xc06f, 0xeca7, 0xc06b, 0xeca4, 0xecaa, 0xecad, 0xc070, 0xeca9, 0xeca6, 0xecae, 0xeca5, 0xecab, 0xc06c, 0xeca3, 0xc06d, 0xc06e, 0xeca8, 0xefa9, 0xef7a, 0xef7b, 0xef7e, 0xef7c, 0xef76, 0xef79, 0xefa5, 0xef7d, 0xc245, 0xefa7, 0xefa4, 0xc246, 0xefa6, 0xef77, 0xefa2, 0xefa3, 0xefa1, 0xf1d2, 0xf1d4, 0xf1d7, 0xf1d1, 0xc359, 0xf1d9, 0xf1d0, 0xf1da, 0xf1d6, 0xf1d8, 0xf1dc, 0xf1d5, 0xf1dd, 0xf1d3, 0xf1cf, 0xc35a, 0xf1db, 0xc35b, 0xc44d, 0xef78, 0xf3f1, 0xf3e8, 0xc44f, 0xf3e4, 0xc450, 0xf3ed, 0xf3e7, 0xf3dd, 0xc44e, 0xf3ea, 0xf3e5, 0xf3e6, 0xf3d8, 0xf3df, 0xf3ee, 0xf3eb, 0xf3e3, 0xf3ef, 0xf3de, 0xf3d9, 0xf3ec, 0xf3db, 0xf3e9, 0xf3e0, 0xf3f0, 0xf3dc, 0xc44c, 0xf3da, 0xf3e1, 0xf3e2, 0xf57d, 0xf57b, 0xf5a2, 0xf5ae, 0xf5a5, 0xf57c, 0xf578, 0xf5a7, 0xf57e, 0xf5a3, 0xf57a, 0xf5aa, 0xf577, 0xf5a1, 0xf5a6, 0xf5a8, 0xf5ab, 0xf579, 0xf5af, 0xf5b0, 0xf5a9, 0xf5ad, 0xf5a4, 0xf6c1, 0xf6c4, 0xc561, 0xf6c3, 0xf6c8, 0xf6c6, 0xc562, 0xf6bd, 0xf6b3, 0xf6b2, 0xc564, 0xf6bf, 0xf6c0, 0xf6bc, 0xf6b4, 0xf6b9, 0xf5ac, 0xf6b5, 0xc563, 0xf6bb, 0xf6ba, 0xf6b6, 0xf6c2, 0xf6b7, 0xf7bb, 0xf6c5, 0xf6c7, 0xf6be, 0xf6b8, 0xf7bc, 0xf7be, 0xf7b8, 0xc5c2, 0xf7c5, 0xf7c3, 0xc5c3, 0xf7c2, 0xf7c1, 0xf7ba, 0xf7b7, 0xf7bd, 0xf7c6, 0xf7b9, 0xf7bf, 0xf869, 0xf86e, 0xf864, 0xf867, 0xc5ee, 0xf86b, 0xf872, 0xf7c0, 0xf865, 0xf86f, 0xf873, 0xf86a, 0xf863, 0xf86d, 0xf86c, 0xf871, 0xf870, 0xf7c4, 0xf868, 0xf862, 0xf866, 0xc64e, 0xc64f, 0xf861, 0xf8e6, 0xf8dd, 0xf8e5, 0xf8e2, 0xf8e3, 0xf8dc, 0xf8df, 0xf8e7, 0xf8e1, 0xf8e0, 0xf8de, 0xf8e4, 0xf95d, 0xf95e, 0xf960, 0xf95f, 0xf962, 0xf961, 0xf97c, 0xf97b, 0xf9b7, 0xf9b8, 0xf9c5, 0xc678, 0xc67c, 0xf9cf, 0xc67d, 0xb3bf, 0xc4d0, 0xf6c9, 0xc650, 0xc651, 0xb3c0, 0xe0ee, 0xb9a8, 0xe8f0, 0xecb0, 0xecb1, 0xecaf, 0xefab, 0xefaa, 0xc247, 0xf1df, 0xefac, 0xf1de, 0xf3f3, 0xc451, 0xc453, 0xf3f2, 0xc452, 0xf5b1, 0xf5b3, 0xf5b2, 0xf6ca, 0xc565, 0xc5ef, 0xf8e8, 0xf963, 0xf9d2, 0xb3c1, 0xe4e5, 0xbea2, 0xecb3, 0xecb2, 0xefad, 0xc454, 0xc4d1, 0xf7c7, 0xf9cb, 0xb3c2, 0xbbf2, 0xbea3, 0xf3f4, 0xf874, 0xb6c0, 0xefae, 0xc664, 0xb6c1, 0xbea4, 0xc248, 0xf875, 0xb6c2, 0xe8f1, 0xc072, 0xecb4, 0xecb5, 0xc071, 0xefaf, 0xc24c, 0xc24a, 0xc24b, 0xc249, 0xf1e0, 0xc35c, 0xf5b5, 0xf5b4, 0xf5b7, 0xf5b6, 0xc4d2, 0xf6cb, 0xf6cd, 0xf6cc, 0xc566, 0xf7c8, 0xf876, 0xf877, 0xc5f0, 0xf964, 0xf97d, 0xc675, 0xdcb0, 0xecb6, 0xefb0, 0xf3f5, 0xe0ef, 0xefb1, 0xf1e2, 0xf1e1, 0xf878, 0xc652, 0xf965, 0xf97e, 0xb9a9, 0xe8f2, 0xe8f3, 0xecb7, 0xb9aa, 0xc35d, 0xf1e3, 0xf6cf, 0xc567, 0xf6d0, 0xf6ce, 0xf879, 0xf8e9, 0xb9ab, 0xefb4, 0xefb3, 0xefb2, 0xf1e4, 0xf1e8, 0xf1e7, 0xf1e6, 0xf1e5, 0xc35e, 0xf3f6, 0xf5b9, 0xc4d3, 0xf5b8, 0xf6d1, 0xf7cb, 0xf7ca, 0xc5c4, 0xf7c9, 0xf87c, 0xf87b, 0xf87a, 0xbbf3, 0xecb8, 0xc24d, 0xf3f7, 0xf3f8, 0xf7cc, 0xf87d, 0xf8ea, 0xf966, 0xf9b9, 0xf9d4, 0xbbf4, 0xc24e, 0xf1e9, 0xf3f9, 0xf6d2, 0xf87e, 0xbea6, 0xefb5, 0xf1ea, 0xf3fa, 0xf3fb, 0xf3fc, 0xf5be, 0xf5ba, 0xc568, 0xf5bd, 0xf5bc, 0xc4d4, 0xf5bb, 0xc4d6, 0xc4d5, 0xf6d4, 0xf6d3, 0xc569, 0xc56a, 0xc5c6, 0xf7cd, 0xc5c5, 0xf8a3, 0xf8a4, 0xf8a2, 0xf8a1, 0xc654, 0xf8eb, 0xf8ec, 0xf8ed, 0xc653, 0xf967, 0xf96a, 0xf969, 0xf968, 0xf9d3, 0xc073, 0xc365, 0xf5bf, 0xf6d5, 0xc5c7, 0xf7ce, 0xf9d5, 0xc074, 0xefb6, 0xf7cf, 0xf9a1, 0xc94a, 0xddfc, 0xa14a, 0xa157, 0xa159, 0xa15b, 0xa15f, 0xa160, 0xa163, 0xa164, 0xa167, 0xa168, 0xa16b, 0xa16c, 0xa16f, 0xa170, 0xa173, 0xa174, 0xa177, 0xa178, 0xa17b, 0xa17c, 0xa1c6, 0xa1c7, 0xa1ca, 0xa1cb, 0xa1c8, 0xa1c9, 0xa15c, 0xa14d, 0xa14f, 0xa151, 0xa152, 0xa153, 0xa154, 0xa17d, 0xa17e, 0xa1a1, 0xa1a2, 0xa1a3, 0xa1a4, 0xa1cc, 0xa1cd, 0xa1ce, 0xa1de, 0xa1df, 0xa1e0, 0xa1e1, 0xa1e2, 0xa24c, 0xa24d, 0xa24e, 0xa149, 0xa1ad, 0xa243, 0xa248, 0xa1ae, 0xa15d, 0xa15e, 0xa1af, 0xa1cf, 0xa141, 0xa1d0, 0xa144, 0xa241, 0xa2af, 0xa2b0, 0xa2b1, 0xa2b2, 0xa2b3, 0xa2b4, 0xa2b5, 0xa2b6, 0xa2b7, 0xa2b8, 0xa147, 0xa146, 0xa1d5, 0xa1d7, 0xa1d6, 0xa148, 0xa249, 0xa2cf, 0xa2d0, 0xa2d1, 0xa2d2, 0xa2d3, 0xa2d4, 0xa2d5, 0xa2d6, 0xa2d7, 0xa2d8, 0xa2d9, 0xa2da, 0xa2db, 0xa2dc, 0xa2dd, 0xa2de, 0xa2df, 0xa2e0, 0xa2e1, 0xa2e2, 0xa2e3, 0xa2e4, 0xa2e5, 0xa2e6, 0xa2e7, 0xa2e8, 0xa242, 0xa1c4, 0xa2e9, 0xa2ea, 0xa2eb, 0xa2ec, 0xa2ed, 0xa2ee, 0xa2ef, 0xa2f0, 0xa2f1, 0xa2f2, 0xa2f3, 0xa2f4, 0xa2f5, 0xa2f6, 0xa2f7, 0xa2f8, 0xa2f9, 0xa2fa, 0xa2fb, 0xa2fc, 0xa2fd, 0xa2fe, 0xa340, 0xa341, 0xa342, 0xa343, 0xa161, 0xa155, 0xa162, 0xa14e, }; static const Summary16 big5_uni2indx_page00[16] = { /* 0x0000 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x00ac }, { 4, 0x0083 }, { 7, 0x0000 }, { 7, 0x0080 }, { 8, 0x0000 }, { 8, 0x0080 }, }; static const Summary16 big5_uni2indx_page02[38] = { /* 0x0200 */ { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0e80 }, { 13, 0x0200 }, { 14, 0x0000 }, { 14, 0x0000 }, /* 0x0300 */ { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0xfffe }, { 29, 0x03fb }, { 38, 0xfffe }, { 53, 0x03fb }, { 62, 0x0000 }, { 62, 0x0000 }, { 62, 0x0000 }, /* 0x0400 */ { 62, 0x0002 }, { 63, 0x1ff0 }, { 72, 0xfff8 }, { 85, 0xffff }, { 101, 0xffff }, { 117, 0x0002 }, }; static const Summary16 big5_uni2indx_page20[44] = { /* 0x2000 */ { 118, 0x0000 }, { 118, 0x3318 }, { 124, 0x0064 }, { 127, 0x4824 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, /* 0x2100 */ { 131, 0x0228 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x03ff }, { 144, 0x0000 }, { 144, 0x0000 }, { 144, 0x03cf }, { 152, 0x0000 }, { 152, 0x0000 }, { 152, 0x0000 }, { 152, 0x0000 }, { 152, 0x0000 }, { 152, 0x0000 }, /* 0x2200 */ { 152, 0x0000 }, { 152, 0xc400 }, { 155, 0x4e29 }, { 162, 0x1030 }, { 165, 0x0000 }, { 165, 0x0004 }, { 166, 0x00c3 }, { 170, 0x0000 }, { 170, 0x0000 }, { 170, 0x0000 }, { 170, 0x0020 }, { 171, 0x8000 }, }; static const Summary16 big5_uni2indx_page24[37] = { /* 0x2400 */ { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x03ff }, { 182, 0x3ff0 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, /* 0x2500 */ { 192, 0x1005 }, { 195, 0x1111 }, { 199, 0x1010 }, { 201, 0x1010 }, { 203, 0x0000 }, { 203, 0x4001 }, { 205, 0xe402 }, { 210, 0x000f }, { 214, 0xfffe }, { 229, 0x0030 }, { 231, 0x0003 }, { 233, 0x300c }, { 237, 0xc8c0 }, { 242, 0x0000 }, { 242, 0x003c }, { 246, 0x0000 }, /* 0x2600 */ { 246, 0x0260 }, { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0007 }, }; static const Summary16 big5_uni2indx_page30[62] = { /* 0x3000 */ { 252, 0xff2f }, { 265, 0x6037 }, { 272, 0x03fe }, { 281, 0x0000 }, { 281, 0xfffe }, { 296, 0xffff }, { 312, 0xffff }, { 328, 0xffff }, { 344, 0xffff }, { 360, 0x600f }, { 366, 0xfffe }, { 381, 0xffff }, { 397, 0xffff }, { 413, 0xffff }, { 429, 0xffff }, { 445, 0x407f }, /* 0x3100 */ { 453, 0xffe0 }, { 464, 0xffff }, { 480, 0x03ff }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, /* 0x3200 */ { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0008 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, /* 0x3300 */ { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0xc000 }, { 493, 0x7000 }, { 496, 0x0002 }, { 497, 0x0000 }, { 497, 0x4010 }, { 499, 0x0026 }, }; static const Summary16 big5_uni2indx_page4e[1307] = { /* 0x4e00 */ { 502, 0xff8b }, { 514, 0xc373 }, { 523, 0x6840 }, { 527, 0x1b0f }, { 535, 0xe9ac }, { 544, 0xf34c }, { 553, 0x0200 }, { 554, 0xc008 }, { 557, 0x795c }, { 566, 0xca3e }, { 575, 0x7976 }, { 585, 0x0648 }, { 589, 0x2fdf }, { 601, 0xf7f0 }, { 612, 0x033a }, { 618, 0xa8ff }, /* 0x4f00 */ { 629, 0xef37 }, { 641, 0x233f }, { 650, 0xb004 }, { 654, 0xfd59 }, { 665, 0xf3ca }, { 675, 0xffff }, { 691, 0xde9f }, { 703, 0xfff9 }, { 717, 0xabff }, { 730, 0x7df7 }, { 743, 0xc000 }, { 745, 0x8eec }, { 754, 0xeebf }, { 767, 0xffdb }, { 781, 0xd003 }, { 786, 0x45fa }, /* 0x5000 */ { 795, 0xfae1 }, { 805, 0xdffe }, { 819, 0xbfef }, { 833, 0x10ab }, { 839, 0xffeb }, { 853, 0xfcaa }, { 863, 0xef3f }, { 876, 0x24fd }, { 885, 0x78ad }, { 894, 0x7f76 }, { 906, 0xf00c }, { 912, 0xedff }, { 926, 0xcff6 }, { 938, 0x2cfa }, { 947, 0xf7f9 }, { 960, 0xeb6b }, /* 0x5100 */ { 971, 0x1ffd }, { 983, 0x95bf }, { 994, 0x6677 }, { 1004, 0xbfbf }, { 1018, 0x3bfb }, { 1030, 0xfeb4 }, { 1041, 0x7bae }, { 1052, 0x11e2 }, { 1058, 0xa681 }, { 1064, 0x41be }, { 1072, 0x1435 }, { 1078, 0x72c3 }, { 1086, 0x7d70 }, { 1095, 0x7191 }, { 1102, 0x0003 }, { 1104, 0x276b }, /* 0x5200 */ { 1113, 0x57cb }, { 1123, 0x70cf }, { 1132, 0x4732 }, { 1139, 0x0def }, { 1149, 0x7eda }, { 1160, 0xfc74 }, { 1170, 0xfe06 }, { 1179, 0xbdb4 }, { 1189, 0x3f9f }, { 1201, 0x8bca }, { 1209, 0x7e49 }, { 1218, 0x5800 }, { 1221, 0x228f }, { 1228, 0xebec }, { 1239, 0x8a5c }, { 1246, 0xddbb }, /* 0x5300 */ { 1258, 0xef60 }, { 1267, 0xb6e7 }, { 1278, 0xa40f }, { 1285, 0xf293 }, { 1294, 0x37bb }, { 1305, 0x549e }, { 1313, 0xd04b }, { 1320, 0x9baf }, { 1331, 0xc414 }, { 1336, 0xf7d4 }, { 1347, 0x30b0 }, { 1352, 0x0a14 }, { 1356, 0x2f08 }, { 1362, 0x88d0 }, { 1367, 0xff7e }, { 1381, 0x192f }, /* 0x5400 */ { 1389, 0xffda }, { 1402, 0xfb07 }, { 1412, 0x7ff1 }, { 1424, 0x7beb }, { 1436, 0xc5ef }, { 1447, 0x0010 }, { 1448, 0x99ff }, { 1460, 0xfdff }, { 1475, 0x79d7 }, { 1486, 0x0567 }, { 1493, 0xffe7 }, { 1507, 0xfdcb }, { 1519, 0xc3ff }, { 1531, 0x4040 }, { 1533, 0x6ff7 }, { 1546, 0xbd8e }, /* 0x5500 */ { 1556, 0xdffa }, { 1569, 0x0497 }, { 1575, 0xf4c0 }, { 1582, 0x5bff }, { 1595, 0xed7b }, { 1607, 0xd0e7 }, { 1616, 0x047e }, { 1623, 0xf8e0 }, { 1631, 0xff9f }, { 1645, 0xb73e }, { 1656, 0x7dfe }, { 1669, 0x882e }, { 1675, 0xfffd }, { 1690, 0xbe7f }, { 1703, 0x83fe }, { 1713, 0xf6c4 }, /* 0x5600 */ { 1722, 0xf357 }, { 1733, 0xb8fd }, { 1744, 0xd680 }, { 1750, 0xef7d }, { 1763, 0x5767 }, { 1773, 0x4788 }, { 1779, 0xff7d }, { 1793, 0xc3df }, { 1804, 0xf0ff }, { 1816, 0x37a9 }, { 1825, 0x7de0 }, { 1834, 0x70fc }, { 1843, 0x3f6f }, { 1855, 0xec9a }, { 1864, 0x4cb3 }, { 1872, 0x8681 }, /* 0x5700 */ { 1877, 0x3f9e }, { 1888, 0xdd5c }, { 1898, 0xf70d }, { 1908, 0x4819 }, { 1913, 0xfea3 }, { 1924, 0x0007 }, { 1927, 0xaf56 }, { 1937, 0x38ff }, { 1948, 0x980d }, { 1954, 0xefb8 }, { 1965, 0x403d }, { 1971, 0xb760 }, { 1979, 0xd8ce }, { 1988, 0x9035 }, { 1994, 0x72bf }, { 2005, 0x3fff }, /* 0x5800 */ { 2019, 0x7ff7 }, { 2033, 0x7a11 }, { 2040, 0xf7bb }, { 2053, 0xabff }, { 2066, 0xff00 }, { 2074, 0x6fbe }, { 2086, 0xa93c }, { 2094, 0xfe72 }, { 2105, 0xcfef }, { 2118, 0xf11b }, { 2127, 0xdb6b }, { 2138, 0xf40a }, { 2145, 0xc3e6 }, { 2154, 0xef7e }, { 2167, 0x9b9c }, { 2176, 0xf610 }, /* 0x5900 */ { 2183, 0xf048 }, { 2189, 0x16f4 }, { 2197, 0xfeb5 }, { 2209, 0x5182 }, { 2214, 0xc7b1 }, { 2223, 0x15bb }, { 2232, 0x6e87 }, { 2241, 0xfbdf }, { 2255, 0xe43f }, { 2265, 0x63cd }, { 2274, 0xc1ff }, { 2285, 0x7e7e }, { 2297, 0xfdeb }, { 2310, 0x7d5f }, { 2322, 0x777b }, { 2334, 0xfcfe }, /* 0x5a00 */ { 2347, 0x960b }, { 2354, 0xdbea }, { 2365, 0x6229 }, { 2371, 0x53e8 }, { 2379, 0x37df }, { 2391, 0xfdef }, { 2405, 0x36f5 }, { 2415, 0xbd81 }, { 2423, 0xdc18 }, { 2430, 0xfcbd }, { 2442, 0xd2e4 }, { 2450, 0xffff }, { 2466, 0x3fd7 }, { 2478, 0xffe0 }, { 2489, 0x7f6f }, { 2502, 0xabf8 }, /* 0x5b00 */ { 2512, 0x9bae }, { 2522, 0x6ed9 }, { 2532, 0xf5fb }, { 2545, 0xf115 }, { 2553, 0x79a9 }, { 2562, 0xbdfb }, { 2575, 0x5a3c }, { 2583, 0xadaf }, { 2594, 0xdbba }, { 2605, 0x1fac }, { 2614, 0x71fc }, { 2624, 0x8379 }, { 2632, 0x7cf7 }, { 2644, 0xc35f }, { 2654, 0xdfff }, { 2669, 0x0567 }, /* 0x5c00 */ { 2676, 0xff9a }, { 2688, 0x8467 }, { 2695, 0x1534 }, { 2701, 0xdf8b }, { 2712, 0xf9f3 }, { 2724, 0x3373 }, { 2733, 0xf7bd }, { 2746, 0x5e1a }, { 2754, 0xbf40 }, { 2762, 0xa03f }, { 2770, 0xffff }, { 2786, 0x01eb }, { 2793, 0xdfc0 }, { 2802, 0xcfdd }, { 2814, 0x7500 }, { 2819, 0xabd3 }, /* 0x5d00 */ { 2829, 0xf8c3 }, { 2838, 0xeed6 }, { 2849, 0x43fd }, { 2859, 0xb7ff }, { 2873, 0x5eaf }, { 2884, 0x4227 }, { 2890, 0x9bac }, { 2899, 0xf686 }, { 2908, 0x27d7 }, { 2918, 0xf6bc }, { 2929, 0xf787 }, { 2940, 0x35b7 }, { 2950, 0xaacd }, { 2959, 0xe176 }, { 2968, 0x49e7 }, { 2977, 0xe29f }, /* 0x5e00 */ { 2987, 0x545c }, { 2994, 0xaff2 }, { 3005, 0x2b3f }, { 3015, 0x61d8 }, { 3022, 0xfc3b }, { 3033, 0xbbb8 }, { 3043, 0xffcf }, { 3057, 0x7b7d }, { 3069, 0xbf95 }, { 3080, 0x1ce0 }, { 3086, 0x7dfd }, { 3099, 0x43ff }, { 3110, 0x5ff6 }, { 3122, 0xfffe }, { 3137, 0xd3ef }, { 3149, 0xc4ce }, /* 0x5f00 */ { 3157, 0x8db6 }, { 3166, 0xadbc }, { 3176, 0x63dc }, { 3185, 0x11eb }, { 3193, 0xdf59 }, { 3204, 0x23d0 }, { 3210, 0xbeb4 }, { 3220, 0xf3db }, { 3232, 0x1fe7 }, { 3243, 0xdbc7 }, { 3254, 0xff63 }, { 3266, 0xfae4 }, { 3276, 0xb22b }, { 3284, 0x63f7 }, { 3295, 0xed3b }, { 3306, 0xadba }, /* 0x6000 */ { 3316, 0xfe01 }, { 3324, 0x7eff }, { 3338, 0xfff7 }, { 3353, 0x02bc }, { 3359, 0x32ff }, { 3370, 0xef39 }, { 3381, 0xfffc }, { 3395, 0x8005 }, { 3398, 0x77fb }, { 3411, 0xbcf5 }, { 3422, 0x010d }, { 3426, 0xfff7 }, { 3441, 0xfffb }, { 3456, 0xbf3a }, { 3467, 0x0057 }, { 3472, 0xdfff }, /* 0x6100 */ { 3487, 0xef7b }, { 3500, 0xbd7d }, { 3512, 0xdb88 }, { 3520, 0xc8d4 }, { 3527, 0xfff3 }, { 3541, 0xed7c }, { 3552, 0x5dee }, { 3563, 0x56ff }, { 3575, 0x7e0d }, { 3584, 0xac5f }, { 3594, 0xff96 }, { 3606, 0xd57f }, { 3618, 0x3fee }, { 3630, 0xc140 }, { 3634, 0x6ff9 }, { 3646, 0xffe7 }, /* 0x6200 */ { 3660, 0x779b }, { 3671, 0x8e77 }, { 3681, 0x6ebf }, { 3693, 0xe45d }, { 3702, 0x6fcf }, { 3714, 0x5f1f }, { 3725, 0xe07f }, { 3735, 0xfedf }, { 3749, 0xd7db }, { 3761, 0x01fe }, { 3769, 0xff00 }, { 3777, 0xfb7b }, { 3790, 0xffd4 }, { 3802, 0x1fdf }, { 3814, 0xf800 }, { 3819, 0xffff }, /* 0x6300 */ { 3835, 0xfb8f }, { 3847, 0x007b }, { 3853, 0xbf00 }, { 3860, 0x7f5c }, { 3871, 0xffff }, { 3887, 0x07f3 }, { 3896, 0xeba0 }, { 3904, 0x3de7 }, { 3915, 0xf7bf }, { 3929, 0xfbd7 }, { 3942, 0xffbf }, { 3957, 0x6003 }, { 3961, 0xfffd }, { 3976, 0xbfed }, { 3989, 0xefbb }, { 4002, 0x027f }, /* 0x6400 */ { 4010, 0xfe40 }, { 4018, 0xddfd }, { 4031, 0xfdff }, { 4046, 0xe2f9 }, { 4056, 0x680b }, { 4062, 0xfb1f }, { 4074, 0xfbe3 }, { 4086, 0xaffd }, { 4099, 0x9fa4 }, { 4108, 0xf7ed }, { 4121, 0x7a7d }, { 4132, 0xf80f }, { 4141, 0xeebe }, { 4153, 0x0fd5 }, { 4162, 0xbb5d }, { 4173, 0xfd9f }, /* 0x6500 */ { 4186, 0xf2db }, { 4197, 0x3bf9 }, { 4208, 0xfe7f }, { 4222, 0xebcc }, { 4232, 0x876a }, { 4240, 0x73fa }, { 4251, 0x95fc }, { 4261, 0x9ffc }, { 4273, 0x109f }, { 4280, 0xfaf7 }, { 4293, 0xddb7 }, { 4305, 0xbbcd }, { 4316, 0xf87e }, { 4327, 0xeccd }, { 4337, 0xf366 }, { 4347, 0x3c3f }, /* 0x6600 */ { 4357, 0xfffd }, { 4372, 0xb03f }, { 4381, 0xe9f7 }, { 4393, 0x067e }, { 4401, 0x96ae }, { 4410, 0xfe06 }, { 4419, 0xd576 }, { 4429, 0x5fd7 }, { 4441, 0x3fd1 }, { 4451, 0xa3f3 }, { 4461, 0xcf07 }, { 4470, 0x6fb7 }, { 4482, 0x9fd1 }, { 4492, 0x7f44 }, { 4501, 0x7b59 }, { 4511, 0xd3dd }, /* 0x6700 */ { 4522, 0xaf3b }, { 4533, 0xa9bd }, { 4543, 0x7dcf }, { 4555, 0xff3a }, { 4567, 0xfbe0 }, { 4577, 0xf6eb }, { 4589, 0xb401 }, { 4594, 0xffff }, { 4610, 0x7afa }, { 4621, 0xb7bf }, { 4634, 0xc000 }, { 4636, 0x0ffd }, { 4647, 0xff7f }, { 4662, 0xff1f }, { 4675, 0xfefc }, { 4688, 0x95ff }, /* 0x6800 */ { 4700, 0x0000 }, { 4700, 0xb5dc }, { 4710, 0xef63 }, { 4721, 0x3f3e }, { 4732, 0xfb7f }, { 4746, 0x001b }, { 4750, 0xe800 }, { 4754, 0xfbf6 }, { 4767, 0x9eef }, { 4779, 0xb8df }, { 4790, 0xff9f }, { 4804, 0x003f }, { 4810, 0x7bd0 }, { 4819, 0xf5ff }, { 4833, 0xdfdb }, { 4846, 0x3fff }, /* 0x6900 */ { 4860, 0xfdf0 }, { 4871, 0x00bf }, { 4878, 0x8420 }, { 4881, 0xbbbd }, { 4893, 0xdf37 }, { 4905, 0xffde }, { 4919, 0xff6d }, { 4932, 0x0ff3 }, { 4942, 0x604c }, { 4947, 0x5efb }, { 4959, 0xfffb }, { 4974, 0xfafb }, { 4987, 0xfe5e }, { 4999, 0x0219 }, { 5003, 0x79f4 }, { 5013, 0xf9de }, /* 0x6a00 */ { 5025, 0xa7f7 }, { 5037, 0xebfa }, { 5049, 0x01eb }, { 5056, 0xff34 }, { 5067, 0xebd3 }, { 5078, 0xef73 }, { 5090, 0xafd7 }, { 5102, 0xc040 }, { 5105, 0x72bb }, { 5115, 0xdcff }, { 5128, 0xf17f }, { 5140, 0x2fd8 }, { 5149, 0xb8ec }, { 5158, 0xfe0b }, { 5168, 0xdda3 }, { 5178, 0x1f0b }, /* 0x6b00 */ { 5186, 0x8f1d }, { 5195, 0x47cf }, { 5205, 0xb12b }, { 5213, 0xffde }, { 5227, 0x7fee }, { 5240, 0xda73 }, { 5250, 0x24ff }, { 5260, 0xcbc4 }, { 5268, 0xf75d }, { 5280, 0xcbf2 }, { 5290, 0xecfd }, { 5302, 0xb4ed }, { 5312, 0xbff9 }, { 5325, 0x4ddd }, { 5335, 0x99dd }, { 5345, 0xfb8d }, /* 0x6c00 */ { 5356, 0xbb7f }, { 5369, 0xaf7b }, { 5381, 0xddfb }, { 5394, 0xc959 }, { 5402, 0xfc4f }, { 5413, 0xfab5 }, { 5424, 0xafe3 }, { 5435, 0x6d5f }, { 5446, 0xffff }, { 5462, 0x3f7d }, { 5474, 0x7800 }, { 5478, 0xffdb }, { 5492, 0xb6ff }, { 5505, 0x7eff }, { 5519, 0xfbaf }, { 5532, 0x022f }, /* 0x6d00 */ { 5538, 0xff9b }, { 5551, 0xefc7 }, { 5563, 0xffa5 }, { 5575, 0xffff }, { 5591, 0x0007 }, { 5594, 0xc700 }, { 5599, 0xf7ff }, { 5614, 0xfff1 }, { 5627, 0x7ffd }, { 5641, 0x01bf }, { 5649, 0xdc00 }, { 5654, 0xfdbc }, { 5666, 0xbff5 }, { 5679, 0xffff }, { 5695, 0xff7f }, { 5710, 0x3eff }, /* 0x6e00 */ { 5723, 0x0029 }, { 5726, 0xbe00 }, { 5732, 0xf9ff }, { 5746, 0xff7f }, { 5761, 0x6efb }, { 5773, 0xfd7e }, { 5786, 0xcbff }, { 5799, 0x039e }, { 5806, 0xe300 }, { 5811, 0xfbdd }, { 5824, 0xccff }, { 5836, 0xf6df }, { 5849, 0xffff }, { 5865, 0x117f }, { 5874, 0xf800 }, { 5879, 0xfbf6 }, /* 0x6f00 */ { 5892, 0xe7ef }, { 5905, 0xd73c }, { 5915, 0xfeef }, { 5929, 0xdfef }, { 5943, 0xc00b }, { 5948, 0xedbf }, { 5961, 0xfedf }, { 5975, 0xfdcd }, { 5987, 0x7bf5 }, { 5999, 0x40fd }, { 6007, 0xffff }, { 6023, 0xb75f }, { 6035, 0xffdf }, { 6050, 0xf930 }, { 6058, 0xfbdf }, { 6072, 0xdc97 }, /* 0x7000 */ { 6082, 0xfef3 }, { 6095, 0xbff2 }, { 6107, 0x8fdf }, { 6119, 0xdfbf }, { 6133, 0x177f }, { 6144, 0xede6 }, { 6155, 0x0f7f }, { 6166, 0x3553 }, { 6174, 0x447c }, { 6181, 0x877e }, { 6191, 0xfa12 }, { 6199, 0x45bb }, { 6208, 0xede0 }, { 6217, 0x779e }, { 6228, 0x8017 }, { 6233, 0xbfd9 }, /* 0x7100 */ { 6245, 0x7e55 }, { 6255, 0xde89 }, { 6264, 0xc16f }, { 6273, 0x0447 }, { 6278, 0x7ade }, { 6289, 0xf75d }, { 6301, 0x57ff }, { 6314, 0x2905 }, { 6319, 0x86f7 }, { 6329, 0xfe95 }, { 6340, 0x97b3 }, { 6350, 0xf32f }, { 6361, 0xcfff }, { 6375, 0x9f75 }, { 6386, 0x71f7 }, { 6397, 0xfb17 }, /* 0x7200 */ { 6408, 0x34ee }, { 6417, 0xee19 }, { 6426, 0x37cc }, { 6435, 0xef61 }, { 6445, 0x9fd6 }, { 6456, 0xef4c }, { 6466, 0xd68f }, { 6476, 0xfbdd }, { 6489, 0x7b73 }, { 6500, 0x6def }, { 6512, 0xd7fe }, { 6525, 0xa431 }, { 6531, 0x5e7f }, { 6543, 0x97d7 }, { 6554, 0x0f5b }, { 6563, 0xffd8 }, /* 0x7300 */ { 6575, 0x9d83 }, { 6583, 0x7bce }, { 6594, 0x22ec }, { 6601, 0xdcff }, { 6614, 0x763d }, { 6624, 0xef87 }, { 6635, 0xdfe7 }, { 6648, 0xfded }, { 6661, 0x4fff }, { 6674, 0xa0fc }, { 6682, 0x3b77 }, { 6693, 0xdbfc }, { 6705, 0x3ded }, { 6716, 0x7fdc }, { 6728, 0x6fa9 }, { 6738, 0xf570 }, /* 0x7400 */ { 6747, 0x3ffb }, { 6760, 0x2c40 }, { 6764, 0xff7f }, { 6779, 0x847f }, { 6788, 0xec57 }, { 6798, 0xdeb7 }, { 6810, 0xe69c }, { 6819, 0xf22f }, { 6829, 0x0feb }, { 6839, 0xd5b5 }, { 6849, 0xafeb }, { 6861, 0xede7 }, { 6873, 0x8c2f }, { 6881, 0xfff0 }, { 6893, 0x537f }, { 6904, 0xe8f0 }, /* 0x7500 */ { 6912, 0xb99d }, { 6922, 0xb5ff }, { 6935, 0xff66 }, { 6947, 0xe78f }, { 6958, 0xd981 }, { 6965, 0xbe10 }, { 6972, 0x9c7c }, { 6981, 0xe3c1 }, { 6989, 0x9cd1 }, { 6997, 0x2733 }, { 7005, 0x0cbc }, { 7012, 0xff6d }, { 7025, 0xfcb7 }, { 7037, 0xefb7 }, { 7050, 0xa0df }, { 7059, 0xffff }, /* 0x7600 */ { 7075, 0xbf0b }, { 7085, 0xfe7b }, { 7098, 0xa3ff }, { 7110, 0x353f }, { 7120, 0x13cc }, { 7127, 0x97cd }, { 7137, 0x7637 }, { 7147, 0xfb27 }, { 7158, 0xcfd6 }, { 7169, 0x7e6c }, { 7179, 0xec50 }, { 7186, 0xed31 }, { 7195, 0x677c }, { 7205, 0xfc1c }, { 7214, 0xf6fa }, { 7226, 0x5fbf }, /* 0x7700 */ { 7239, 0x0fba }, { 7248, 0xae2f }, { 7258, 0xa3ad }, { 7267, 0x7ffe }, { 7281, 0xfcf0 }, { 7291, 0xde74 }, { 7301, 0xffef }, { 7316, 0xf200 }, { 7321, 0xfbbf }, { 7335, 0xfea2 }, { 7345, 0x3daf }, { 7356, 0xbcff }, { 7369, 0xf694 }, { 7378, 0x5fb9 }, { 7389, 0xf3ad }, { 7400, 0x3f8f }, /* 0x7800 */ { 7411, 0xf26c }, { 7420, 0xa01f }, { 7427, 0xffef }, { 7442, 0x01bf }, { 7450, 0x7728 }, { 7458, 0x7005 }, { 7463, 0xff35 }, { 7475, 0xda03 }, { 7482, 0xd2f9 }, { 7492, 0xc7fa }, { 7503, 0x3fbf }, { 7516, 0x5c1d }, { 7524, 0xff3a }, { 7536, 0xec33 }, { 7545, 0xb7af }, { 7557, 0xfe9c }, /* 0x7900 */ { 7568, 0x5236 }, { 7575, 0x7a9f }, { 7586, 0xbffa }, { 7599, 0xe722 }, { 7607, 0x9ff7 }, { 7620, 0xfcff }, { 7634, 0x2fbb }, { 7645, 0xb61d }, { 7654, 0xed06 }, { 7662, 0x1dfd }, { 7673, 0x7dd7 }, { 7685, 0xefdf }, { 7699, 0xeb23 }, { 7708, 0xf166 }, { 7717, 0x7ed9 }, { 7728, 0x0dc0 }, /* 0x7a00 */ { 7733, 0x3d3d }, { 7743, 0xdfbf }, { 7757, 0xc945 }, { 7764, 0xba83 }, { 7772, 0x7dd1 }, { 7782, 0x9dd0 }, { 7790, 0x7b87 }, { 7800, 0xcf73 }, { 7811, 0x9ff3 }, { 7823, 0xc3f5 }, { 7833, 0xdf0d }, { 7843, 0xc5fe }, { 7854, 0x0cb3 }, { 7861, 0x8302 }, { 7865, 0xe879 }, { 7874, 0xaec0 }, /* 0x7b00 */ { 7881, 0xc773 }, { 7891, 0x6f0f }, { 7901, 0xfd7d }, { 7914, 0x093f }, { 7922, 0xfff1 }, { 7935, 0x0157 }, { 7941, 0x62fb }, { 7951, 0x01ff }, { 7960, 0xfdb4 }, { 7971, 0x3bf3 }, { 7982, 0xb013 }, { 7988, 0x43b2 }, { 7995, 0x5ed3 }, { 8005, 0xff30 }, { 8015, 0x0fff }, { 8027, 0xeb9f }, /* 0x7c00 */ { 8039, 0xfeef }, { 8053, 0xf203 }, { 8060, 0x3fef }, { 8073, 0xfb89 }, { 8083, 0x37a9 }, { 8092, 0x9e99 }, { 8101, 0xdef9 }, { 8113, 0xa72c }, { 8121, 0x3733 }, { 8130, 0xc1f6 }, { 8139, 0x812e }, { 8145, 0xfe3e }, { 8157, 0x5d20 }, { 8163, 0xf2f7 }, { 8175, 0xd585 }, { 8183, 0x69d7 }, /* 0x7d00 */ { 8193, 0xffff }, { 8209, 0xffff }, { 8225, 0xdb07 }, { 8234, 0xff6f }, { 8248, 0xc4ff }, { 8259, 0xd97f }, { 8271, 0xefce }, { 8283, 0xbe0f }, { 8293, 0xf17b }, { 8304, 0xf05e }, { 8313, 0xf6cf }, { 8325, 0xffb7 }, { 8339, 0x5ef7 }, { 8351, 0xef84 }, { 8360, 0xd7cb }, { 8371, 0x0edf }, /* 0x7e00 */ { 8381, 0xff08 }, { 8390, 0xfcff }, { 8404, 0xee3f }, { 8416, 0xffff }, { 8432, 0x13ff }, { 8443, 0xd7ff }, { 8457, 0xaf0f }, { 8467, 0x7ffd }, { 8481, 0xbdc7 }, { 8492, 0x1ffa }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, /* 0x7f00 */ { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0xe740 }, { 8510, 0xbd38 }, { 8519, 0xf933 }, { 8529, 0x7feb }, { 8542, 0xfeed }, { 8555, 0x7fe8 }, { 8566, 0x7c76 }, { 8576, 0xb3f7 }, { 8588, 0xffef }, { 8603, 0xfeaf }, { 8616, 0xd8b7 }, { 8626, 0xff6f }, { 8640, 0xfbbf }, /* 0x8000 */ { 8654, 0xf8fb }, { 8666, 0xdbf7 }, { 8679, 0x1752 }, { 8686, 0xe2f9 }, { 8696, 0x85c8 }, { 8702, 0x7547 }, { 8711, 0x9090 }, { 8715, 0xe3ef }, { 8727, 0x9ef4 }, { 8737, 0x3f6d }, { 8748, 0xee2e }, { 8758, 0x0536 }, { 8764, 0xf7bc }, { 8776, 0x7ff3 }, { 8789, 0xa07b }, { 8797, 0x7f3f }, /* 0x8100 */ { 8810, 0x0567 }, { 8817, 0xeb60 }, { 8825, 0xbabe }, { 8836, 0x6601 }, { 8841, 0xfcd8 }, { 8851, 0x583f }, { 8860, 0xcaf7 }, { 8871, 0x87df }, { 8882, 0xbfcd }, { 8894, 0xffa0 }, { 8904, 0x5bcd }, { 8914, 0xfebf }, { 8928, 0xb6fd }, { 8940, 0xefa7 }, { 8952, 0x77ef }, { 8965, 0xdf9c }, /* 0x8200 */ { 8976, 0x3fb7 }, { 8988, 0xf877 }, { 8999, 0x9d27 }, { 9008, 0xb7fc }, { 9020, 0xcab5 }, { 9029, 0xdfef }, { 9043, 0xfb5a }, { 9054, 0xf1b6 }, { 9064, 0xec39 }, { 9073, 0xef1f }, { 9085, 0xfbbf }, { 9099, 0x7ffb }, { 9113, 0x000d }, { 9116, 0xdafe }, { 9128, 0xbdfb }, { 9141, 0x4e7f }, /* 0x8300 */ { 9152, 0x33ff }, { 9164, 0x5ac0 }, { 9170, 0xbff5 }, { 9183, 0x9ffe }, { 9196, 0xffbf }, { 9211, 0x005f }, { 9217, 0x0000 }, { 9217, 0xfdf8 }, { 9229, 0xffca }, { 9241, 0x6ffd }, { 9254, 0xcffd }, { 9267, 0xa001 }, { 9270, 0xdfff }, { 9285, 0xfbf2 }, { 9297, 0xdfbf }, { 9311, 0xff7f }, /* 0x8400 */ { 9326, 0xfeda }, { 9338, 0x080f }, { 9343, 0xba08 }, { 9349, 0xbfff }, { 9364, 0x7afd }, { 9376, 0xeed7 }, { 9388, 0xfbeb }, { 9401, 0x67f9 }, { 9412, 0xe044 }, { 9417, 0xff93 }, { 9429, 0xdf97 }, { 9441, 0x9f57 }, { 9452, 0xfef7 }, { 9466, 0x08df }, { 9474, 0xdf80 }, { 9482, 0xfedf }, /* 0x8500 */ { 9496, 0xffc5 }, { 9508, 0xf7fe }, { 9522, 0xfffb }, { 9537, 0x6803 }, { 9542, 0x67fb }, { 9554, 0x6bfa }, { 9565, 0x7fff }, { 9580, 0x5fe2 }, { 9590, 0xffff }, { 9606, 0xff73 }, { 9619, 0x87df }, { 9630, 0xe7fb }, { 9643, 0xebfd }, { 9656, 0xf7a7 }, { 9668, 0xbf7e }, { 9681, 0xefc7 }, /* 0x8600 */ { 9693, 0x1ef3 }, { 9703, 0xdf82 }, { 9712, 0x76ff }, { 9725, 0xdf7e }, { 9738, 0x79c9 }, { 9747, 0xda7d }, { 9758, 0xefbe }, { 9771, 0x1e9b }, { 9780, 0x7ce0 }, { 9788, 0x77fb }, { 9801, 0x87be }, { 9811, 0xfffb }, { 9826, 0x1bff }, { 9838, 0xffdb }, { 9852, 0x3f5c }, { 9862, 0x4fe0 }, /* 0x8700 */ { 9870, 0x7fff }, { 9885, 0x5f0e }, { 9894, 0x77ff }, { 9908, 0xddbf }, { 9921, 0xf04f }, { 9930, 0xffff }, { 9946, 0xffff }, { 9962, 0x0ff8 }, { 9971, 0xa3be }, { 9981, 0xfddf }, { 9995, 0xfc1c }, { 10004, 0xfffd }, { 10019, 0x1f7d }, { 10030, 0xfb9e }, { 10042, 0xbdff }, { 10056, 0xdedc }, /* 0x8800 */ { 10067, 0x3f6f }, { 10079, 0xbafb }, { 10091, 0xdf7f }, { 10105, 0xfbef }, { 10119, 0x7d1b }, { 10129, 0x2eec }, { 10138, 0xaf8e }, { 10148, 0xf2f7 }, { 10160, 0x7b0f }, { 10170, 0xcfee }, { 10182, 0x1d96 }, { 10190, 0x77c6 }, { 10200, 0x7e07 }, { 10209, 0xfff5 }, { 10223, 0xd982 }, { 10230, 0x7fdf }, /* 0x8900 */ { 10244, 0x5ee6 }, { 10254, 0xc7ff }, { 10267, 0xfeee }, { 10280, 0x79ef }, { 10292, 0x9a56 }, { 10300, 0xffcf }, { 10314, 0xfe5f }, { 10327, 0xde5e }, { 10338, 0x896e }, { 10346, 0xf9e8 }, { 10356, 0xf45e }, { 10366, 0xe6c4 }, { 10374, 0x0001 }, { 10375, 0xbe7c }, { 10386, 0x3b7f }, { 10398, 0xdddf }, /* 0x8a00 */ { 10411, 0xd59d }, { 10421, 0xe9ef }, { 10433, 0x34ac }, { 10440, 0xde53 }, { 10450, 0xf573 }, { 10461, 0x4bf7 }, { 10472, 0x7b4f }, { 10483, 0x9eff }, { 10496, 0xb8fe }, { 10507, 0x476e }, { 10516, 0x0dfb }, { 10526, 0xff45 }, { 10537, 0xabfd }, { 10549, 0xfbfe }, { 10563, 0xe9d7 }, { 10574, 0xddff }, /* 0x8b00 */ { 10588, 0xedf7 }, { 10601, 0x7fff }, { 10616, 0xddfd }, { 10629, 0x7eeb }, { 10641, 0xcfe7 }, { 10653, 0xb7ff }, { 10667, 0xbde9 }, { 10678, 0xef91 }, { 10688, 0x5d75 }, { 10698, 0xd77c }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, /* 0x8c00 */ { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0xfa80 }, { 10716, 0xffee }, { 10730, 0xb4f1 }, { 10739, 0xbf76 }, { 10751, 0x2fef }, { 10763, 0xb677 }, { 10774, 0x77bf }, { 10787, 0x9fbf }, { 10800, 0xfffd }, { 10815, 0x95bf }, { 10826, 0xf6ae }, { 10837, 0x75ff }, { 10850, 0x7f3b }, /* 0x8d00 */ { 10862, 0xa7f5 }, { 10873, 0x0af9 }, { 10881, 0x0000 }, { 10881, 0x0000 }, { 10881, 0x0000 }, { 10881, 0x0000 }, { 10881, 0xfbd0 }, { 10891, 0x2bdd }, { 10901, 0xf633 }, { 10911, 0x9a7f }, { 10922, 0xfdab }, { 10934, 0xd6fc }, { 10945, 0xf9e6 }, { 10956, 0xbfeb }, { 10969, 0xdfdf }, { 10983, 0xf41f }, /* 0x8e00 */ { 10993, 0xa6fd }, { 11004, 0xffff }, { 11020, 0x4aff }, { 11031, 0xf37b }, { 11043, 0x7fb7 }, { 11056, 0xfef9 }, { 11069, 0xb6ff }, { 11082, 0x1d5c }, { 11090, 0x7ff6 }, { 11103, 0xe5ff }, { 11116, 0x1f7b }, { 11127, 0x2404 }, { 11130, 0xbe05 }, { 11138, 0xf99e }, { 11149, 0xdbe3 }, { 11160, 0xdff2 }, /* 0x8f00 */ { 11172, 0x6fef }, { 11185, 0xfdff }, { 11200, 0xd679 }, { 11210, 0xcbfc }, { 11221, 0xebfd }, { 11234, 0xefff }, { 11249, 0x001f }, { 11254, 0x0000 }, { 11254, 0x0000 }, { 11254, 0x9800 }, { 11257, 0xe148 }, { 11263, 0x8017 }, { 11268, 0x6a74 }, { 11276, 0x00fe }, { 11283, 0x6d7f }, { 11295, 0xfdf1 }, /* 0x9000 */ { 11307, 0xb87f }, { 11318, 0xfef3 }, { 11331, 0xe01f }, { 11339, 0xf176 }, { 11349, 0xee96 }, { 11359, 0x7b3f }, { 11371, 0xeb8d }, { 11381, 0xfffd }, { 11396, 0xadff }, { 11409, 0xcbb3 }, { 11419, 0x84ef }, { 11428, 0xe17f }, { 11439, 0x4daa }, { 11447, 0xbff0 }, { 11458, 0xbf3f }, { 11471, 0xfe3f }, /* 0x9100 */ { 11484, 0xebff }, { 11498, 0xffd7 }, { 11512, 0xffdf }, { 11527, 0xcf7f }, { 11540, 0xfffb }, { 11555, 0x85ed }, { 11564, 0xd73f }, { 11576, 0x07bc }, { 11584, 0xaeff }, { 11597, 0xfe0f }, { 11608, 0xfdaf }, { 11621, 0x76bf }, { 11633, 0xfaef }, { 11646, 0x37bb }, { 11657, 0x7fdc }, { 11669, 0xa3ba }, /* 0x9200 */ { 11678, 0xb6ff }, { 11691, 0x56f7 }, { 11702, 0x60f8 }, { 11709, 0xe7df }, { 11722, 0xff61 }, { 11733, 0x4cdf }, { 11743, 0xb0fb }, { 11753, 0xff45 }, { 11764, 0x7ded }, { 11776, 0x3ffa }, { 11788, 0x1fff }, { 11801, 0x18fc }, { 11809, 0xffff }, { 11825, 0xe3af }, { 11836, 0xc7d3 }, { 11846, 0xdf83 }, /* 0x9300 */ { 11856, 0xfb57 }, { 11868, 0xef7d }, { 11881, 0xefff }, { 11896, 0x1378 }, { 11903, 0xfec0 }, { 11912, 0x5ff7 }, { 11925, 0x34bb }, { 11934, 0x5ee3 }, { 11944, 0xf70d }, { 11954, 0xeff6 }, { 11967, 0xd7fe }, { 11980, 0x00bf }, { 11987, 0xf59d }, { 11998, 0xf7f7 }, { 12012, 0x51de }, { 12021, 0xffe0 }, /* 0x9400 */ { 12032, 0xfec9 }, { 12043, 0x037f }, { 12052, 0x5f01 }, { 12059, 0xbfef }, { 12073, 0x9ff1 }, { 12084, 0x60a7 }, { 12091, 0xef1d }, { 12102, 0xf1ff }, { 12115, 0x000f }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, /* 0x9500 */ { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x3c80 }, { 12124, 0xfb4d }, { 12135, 0xd91f }, { 12145, 0x7b3a }, { 12155, 0xfee3 }, { 12167, 0x3fe9 }, { 12178, 0xdc7f }, { 12190, 0x003f }, { 12196, 0x0000 }, /* 0x9600 */ { 12196, 0x0000 }, { 12196, 0x5000 }, { 12198, 0xf51f }, { 12209, 0xbe07 }, { 12218, 0xfc1d }, { 12228, 0xf91b }, { 12238, 0xbc1e }, { 12247, 0x71ff }, { 12259, 0x6ff9 }, { 12271, 0x5bbe }, { 12282, 0x5796 }, { 12291, 0x9b1b }, { 12300, 0x7fff }, { 12315, 0xfffc }, { 12329, 0x872e }, { 12337, 0xafe7 }, /* 0x9700 */ { 12349, 0xebf5 }, { 12361, 0xf34f }, { 12372, 0xdffd }, { 12386, 0xe725 }, { 12395, 0x0bdc }, { 12403, 0x5d44 }, { 12410, 0x5747 }, { 12419, 0xfddd }, { 12432, 0xed3f }, { 12444, 0x7790 }, { 12452, 0x7d7f }, { 12465, 0x8ac8 }, { 12471, 0xfafa }, { 12483, 0xf3f9 }, { 12495, 0x202a }, { 12499, 0xef4b }, /* 0x9800 */ { 12510, 0xf5ff }, { 12524, 0x79cf }, { 12535, 0xabd3 }, { 12545, 0x0ba5 }, { 12552, 0xf77a }, { 12564, 0xfb8f }, { 12576, 0x8ebd }, { 12586, 0x001f }, { 12591, 0x0000 }, { 12591, 0x0000 }, { 12591, 0xf300 }, { 12597, 0xfd4e }, { 12608, 0x1a57 }, { 12616, 0x8800 }, { 12618, 0xaeac }, { 12627, 0x7654 }, /* 0x9900 */ { 12635, 0x17ad }, { 12644, 0xcdff }, { 12657, 0xffb2 }, { 12669, 0xf42f }, { 12679, 0x5baa }, { 12688, 0xdbff }, { 12702, 0x0002 }, { 12703, 0x0000 }, { 12703, 0x0000 }, { 12703, 0x73c0 }, { 12710, 0xf9ea }, { 12721, 0x2e3f }, { 12731, 0xfa8e }, { 12741, 0xbbff }, { 12755, 0x76bc }, { 12765, 0xffd3 }, /* 0x9a00 */ { 12778, 0xeefe }, { 12791, 0x7e72 }, { 12801, 0x7ebd }, { 12813, 0xe7f7 }, { 12826, 0xf77f }, { 12840, 0xcefd }, { 12852, 0x0ff5 }, { 12862, 0x0000 }, { 12862, 0x0000 }, { 12862, 0x0000 }, { 12862, 0xa900 }, { 12866, 0xdb9b }, { 12877, 0xa4c7 }, { 12885, 0x917f }, { 12895, 0xf8ca }, { 12904, 0x7ece }, /* 0x9b00 */ { 12915, 0x7d7a }, { 12926, 0xc7e7 }, { 12937, 0xcbbd }, { 12948, 0xdcae }, { 12958, 0xfd7e }, { 12971, 0x8f76 }, { 12981, 0x91d3 }, { 12989, 0x7cf3 }, { 13000, 0x01e5 }, { 13006, 0x4c2f }, { 13014, 0xed77 }, { 13026, 0xa360 }, { 13032, 0x07db }, { 13041, 0x5ef8 }, { 13051, 0x1df7 }, { 13062, 0x2181 }, /* 0x9c00 */ { 13066, 0x6be0 }, { 13074, 0x309c }, { 13080, 0x3b3a }, { 13089, 0xfade }, { 13101, 0x7f53 }, { 13112, 0xc3f5 }, { 13122, 0x61cd }, { 13130, 0x07ba }, { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x26e0 }, { 13144, 0xbefe }, /* 0x9d00 */ { 13157, 0x03f9 }, { 13165, 0xebb5 }, { 13176, 0xe36d }, { 13186, 0xe9cb }, { 13196, 0x9c2f }, { 13205, 0xbfde }, { 13218, 0x9f83 }, { 13227, 0xabbf }, { 13239, 0x1ff7 }, { 13251, 0xffd5 }, { 13264, 0xb7df }, { 13277, 0xdffe }, { 13291, 0xfdae }, { 13303, 0xffef }, { 13318, 0xfb7e }, { 13331, 0xeffd }, /* 0x9e00 */ { 13345, 0xaaff }, { 13357, 0x6ebf }, { 13369, 0x0000 }, { 13369, 0x0000 }, { 13369, 0x0000 }, { 13369, 0x0000 }, { 13369, 0x0000 }, { 13369, 0xb620 }, { 13375, 0x7fcd }, { 13387, 0xbe9e }, { 13398, 0x62b3 }, { 13406, 0x58f1 }, { 13414, 0xf10d }, { 13422, 0xfd7b }, { 13435, 0xe9f1 }, { 13445, 0xbefd }, /* 0x9f00 */ { 13458, 0xc6c3 }, { 13466, 0x5f6d }, { 13477, 0xff3d }, { 13490, 0x69ff }, { 13502, 0xffcf }, { 13516, 0xfbf4 }, { 13528, 0xdcfb }, { 13540, 0x4ff7 }, { 13552, 0x2000 }, { 13553, 0x1137 }, { 13560, 0x0015 }, }; static const Summary16 big5_uni2indx_pagefa[1] = { /* 0xfa00 */ { 13563, 0x3000 }, }; static const Summary16 big5_uni2indx_pagefe[23] = { /* 0xfe00 */ { 13565, 0x0000 }, { 13565, 0x0000 }, { 13565, 0x0000 }, { 13565, 0xfffb }, { 13580, 0xfe1f }, { 13592, 0xfef5 }, { 13605, 0x0e7f }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, /* 0xff00 */ { 13615, 0xff7a }, { 13628, 0xffff }, { 13644, 0xffff }, { 13660, 0x97ff }, { 13673, 0xfffe }, { 13688, 0x3fff }, { 13702, 0x0010 }, }; static int big5_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc >= 0x0000 && wc < 0x0100) summary = &big5_uni2indx_page00[(wc>>4)]; else if (wc >= 0x0200 && wc < 0x0460) summary = &big5_uni2indx_page02[(wc>>4)-0x020]; else if (wc >= 0x2000 && wc < 0x22c0) summary = &big5_uni2indx_page20[(wc>>4)-0x200]; else if (wc >= 0x2400 && wc < 0x2650) summary = &big5_uni2indx_page24[(wc>>4)-0x240]; else if (wc >= 0x3000 && wc < 0x33e0) summary = &big5_uni2indx_page30[(wc>>4)-0x300]; else if (wc >= 0x4e00 && wc < 0x9fb0) summary = &big5_uni2indx_page4e[(wc>>4)-0x4e0]; else if (wc >= 0xfa00 && wc < 0xfa10) summary = &big5_uni2indx_pagefa[(wc>>4)-0xfa0]; else if (wc >= 0xfe00 && wc < 0xff70) summary = &big5_uni2indx_pagefe[(wc>>4)-0xfe0]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' 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); c = big5_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/big5_2003.h000066400000000000000000000471721252300335000244030ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2005 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * BIG5-2003 */ /* * BIG5-2003 is a slightly extended and slightly modified version of BIG5. * It is actually nearer to Microsoft CP950 than to BIG5. The differences * between EASTASIA/OTHER/BIG5.TXT found on ftp.unicode.org and BIG5-2003.TXT * are as follows: * * 1. Some characters in the symbols area (0xA140..0xA2CE) are defined * differently: * * code BIG5.TXT BIG5-2003.TXT * 0xA145 0x2022 # BULLET 0x2027 # HYPHENATION POINT * 0xA14E 0xFF64 # HALFWIDTH IDEOGRAPHIC COMMA * 0xFE51 # SMALL IDEOGRAPHIC COMMA * 0xA156 0x2013 # EN DASH 0x2015 # HORIZONTAL BAR * 0xA15A --- 0x2574 # BOX DRAWINGS LIGHT LEFT * 0xA1C3 --- 0xFFE3 # FULLWIDTH MACRON * 0xA1C5 --- 0x02CD # MODIFIER LETTER LOW MACRON * 0xA1E3 0x223C # TILDE OPERATOR 0xFF5E # FULLWIDTH TILDE * 0xA1F2 0x2641 # EARTH 0x2295 # CIRCLED PLUS * 0xA1F3 0x2609 # SUN 0x2299 # CIRCLED DOT OPERATOR * 0xA1FE --- 0xFF0F # FULLWIDTH SOLIDUS * 0xA240 --- 0xFF3C # FULLWIDTH REVERSE SOLIDUS * 0xA241 0xFF0F # FULLWIDTH SOLIDUS 0x2215 # DIVISION SLASH * 0xA242 0xFF3C # FULLWIDTH REVERSE SOLIDUS * 0xFE68 # SMALL REVERSE SOLIDUS * 0xA244 0x00A5 # YEN SIGN 0xFFE5 # FULLWIDTH YEN SIGN * 0xA246 0x00A2 # CENT SIGN 0xFFE0 # FULLWIDTH CENT SIGN * 0xA247 0x00A3 # POUND SIGN 0xFFE1 # FULLWIDTH POUND SIGN * 0xA2A4 0x2550 # BOX DRAWINGS DOUBLE HORIZONTAL * 0x2501 # BOX DRAWINGS HEAVY HORIZONTAL * 0xA2A5 0x255E # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE * 0x251D # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY * 0xA2A6 0x256A # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE * 0x253F # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY * 0xA2A7 0x2561 # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE * 0x2525 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY * 0xA2CC --- 0x3038 # HANGZHOU NUMERAL TEN * 0xA2CD 0x5344 0x3039 # HANGZHOU NUMERAL TWENTY * 0xA2CE --- 0x303A # HANGZHOU NUMERAL THIRTY * * 2. A control symbols area is added: * * code * 0xA3C0..0xA3E0 U+2400..U+2421 * * 3. The Euro sign is added: * * code * 0xA3E1 0x20AC # EURO SIGN * * 4. Some characters in the main area are defined differently: * * code BIG5.TXT BIG5-2003.TXT * 0xC255 0x5F5D 0x5F5E * * 5. The area 0xC6A1..0xC7FE is organized differently: * * code * 0xC6A1..0xC6BE numerals (was in BIG5.TXT at 0xC7E9..0xC7FC) * 0xC6BF..0xC6D7 radicals * 0xC6D8..0xC6E6 rarely used symbols * 0xC6E7..0xC77A hiragana (U+3041..U+3093, was in BIG5.TXT at 0xC6A5..0xC6F7) * 0xC77B..0xC7F2 katakana (U+30A1..U+30F6, was in BIG5.TXT at 0xC6F8..0xC7B0) * * 6. Some characters are added at 0xF9D6..0xF9DC. * * 7. Box drawing characters are added at 0xF9DD..0xF9FE. * * Note: 4 of these characters are mapped in a non-inversible way, because * Unicode does not yet include the corresponding characters: * * code Unicode approximation * 0xF9FA BOX DRAWINGS DOUBLE ARC DOWN AND RIGHT 0x2554 * 0xF9FB BOX DRAWINGS DOUBLE ARC DOWN AND LEFT 0x2557 * 0xF9FC BOX DRAWINGS DOUBLE ARC UP AND RIGHT 0x255A * 0xF9FD BOX DRAWINGS DOUBLE ARC UP AND LEFT 0x255D * * 8. Private area mappings are added: * * code Unicode * 0x{81..8D}{40..7E,A1..FE} U+EEB8..U+F6B0 * 0x{8E..A0}{40..7E,A1..FE} U+E311..U+EEB7 * 0x{FA..FE}{40..7E,A1..FE} U+E000..U+E310 * * These mappings are not contained in the BSMI Big5-2003 standard. However, * they were contained in a draft of it. */ static const unsigned short big5_2003_2uni_pagea1[314] = { /* 0xa1 */ 0x3000, 0xff0c, 0x3001, 0x3002, 0xff0e, 0x2027, 0xff1b, 0xff1a, 0xff1f, 0xff01, 0xfe30, 0x2026, 0x2025, 0xfe50, 0xfe51, 0xfe52, 0x00b7, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xff5c, 0x2015, 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, 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, 0x203e, 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, /* 0xa2 */ 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, 0x256e, 0x2570, 0x256f, 0x2501, 0x251d, 0x253f, 0x2525, 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, 0x3038, 0x3039, 0x303a, 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, }; static const unsigned short big5_2003_2uni_pagec6[70] = { /* 0xc6a1 */ 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, 0x2f02, 0x2f03, 0x2f05, 0x2f07, 0x2f0c, 0x2f0d, 0x2f0e, 0x2f13, 0x2f16, 0x2f19, 0x2f1b, 0x2f22, 0x2f27, 0x2f2e, 0x2f33, 0x2f34, 0x2f35, 0x2f39, 0x2f3a, 0x2f41, 0x2f46, 0x2f67, 0x2f68, 0x2fa1, 0x2faa, 0x00a8, 0xff3e, 0x30fd, 0x30fe, 0x309d, 0x309e, 0xfffd, 0xfffd, 0x3005, 0x3006, 0x3007, 0x30fc, 0xff3b, 0xff3d, 0x273d, }; static const unsigned short big5_2003_2uni_pagef9[41] = { /* 0xf9d6 */ 0x7881, 0x92b9, 0x88cf, 0x58bb, 0x6052, 0x7ca7, 0x5afa, /* 0xf9dd */ 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, 0x2554, 0x2557, 0x255a, 0x255d, /* not invertible */ 0x2593, }; static int big5_2003_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; /* Code set 0 (ASCII) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (BIG5 extended) */ if (c >= 0x81 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { if (c >= 0xa1) { if (c < 0xa3) { unsigned int i = 157 * (c - 0xa1) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); unsigned short wc = big5_2003_2uni_pagea1[i]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } if (!((c == 0xc6 && c2 >= 0xa1) || c == 0xc7)) { if (!(c == 0xc2 && c2 == 0x55)) { int ret = big5_mbtowc(conv,pwc,s,2); if (ret != RET_ILSEQ) return ret; if (c == 0xa3) { if (c2 >= 0xc0 && c2 <= 0xe1) { *pwc = (c2 == 0xe1 ? 0x20ac : c2 == 0xe0 ? 0x2421 : 0x2340 + c2); return 2; } } else if (c == 0xf9) { if (c2 >= 0xd6) { *pwc = big5_2003_2uni_pagef9[c2-0xd6]; return 2; } } else if (c >= 0xfa) { *pwc = 0xe000 + 157 * (c - 0xfa) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); return 2; } } else { /* c == 0xc2 && c2 == 0x55. */ *pwc = 0x5f5e; return 2; } } else { /* (c == 0xc6 && c2 >= 0xa1) || c == 0xc7. */ unsigned int i = 157 * (c - 0xc6) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); if (i < 133) { /* 63 <= i < 133. */ unsigned short wc = big5_2003_2uni_pagec6[i-63]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } else if (i < 216) { /* 133 <= i < 216. Hiragana. */ *pwc = 0x3041 - 133 + i; return 2; } else if (i < 302) { /* 216 <= i < 302. Katakana. */ *pwc = 0x30a1 - 216 + i; return 2; } } } else { /* 0x81 <= c < 0xa1. */ *pwc = (c >= 0x8e ? 0xdb18 : 0xeeb8) + 157 * (c - 0x81) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); return 2; } } } } return RET_ILSEQ; } static const unsigned char big5_2003_2charset_page25[29] = { /* 0x2550 */ 0xf9, 0xf8, 0xe6, 0xef, 0xdd, 0xe8, 0xf1, 0xdf, 0xec, 0xf5, 0xe3, 0xee, 0xf7, 0xe5, 0xe9, 0xf2, 0xe0, 0xeb, 0xf4, 0xe2, 0xe7, 0xf0, 0xde, 0xed, 0xf6, 0xe4, 0xea, 0xf3, 0xe1, }; static int big5_2003_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; /* Code set 0 (ASCII) */ ret = ascii_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; /* Code set 1 (BIG5 extended) */ switch (wc >> 8) { case 0x00: if (wc == 0x00a8) { buf[0] = 0xc6; buf[1] = 0xd8; ret = 2; break; } if (wc == 0x00a2 || wc == 0x00a3 || wc == 0x00a5) return RET_ILUNI; break; case 0x02: if (wc == 0x02cd) { buf[0] = 0xa1; buf[1] = 0xc5; ret = 2; break; } break; case 0x04: return RET_ILUNI; case 0x20: if (wc == 0x2015) { buf[0] = 0xa1; buf[1] = 0x56; ret = 2; break; } if (wc == 0x2027) { buf[0] = 0xa1; buf[1] = 0x45; ret = 2; break; } if (wc == 0x20ac) { buf[0] = 0xa3; buf[1] = 0xe1; ret = 2; break; } if (wc == 0x2013 || wc == 0x2022) return RET_ILUNI; break; case 0x21: if (wc >= 0x2170 && wc <= 0x2179) { buf[0] = 0xc6; buf[1] = wc - 0x20bb; ret = 2; break; } break; case 0x22: if (wc == 0x2215) { buf[0] = 0xa2; buf[1] = 0x41; ret = 2; break; } if (wc == 0x2295) { buf[0] = 0xa1; buf[1] = 0xf2; ret = 2; break; } if (wc == 0x2299) { buf[0] = 0xa1; buf[1] = 0xf3; ret = 2; break; } if (wc == 0x223c) return RET_ILUNI; break; case 0x24: if (wc <= 0x241f) { buf[0] = 0xa3; buf[1] = wc - 0x2340; ret = 2; break; } if (wc == 0x2421) { buf[0] = 0xa3; buf[1] = 0xe0; ret = 2; break; } if (wc >= 0x2460 && wc <= 0x2469) { buf[0] = 0xc6; buf[1] = wc - 0x23bf; ret = 2; break; } if (wc >= 0x2474 && wc <= 0x247d) { buf[0] = 0xc6; buf[1] = wc - 0x23c9; ret = 2; break; } break; case 0x25: if (wc == 0x2501) { buf[0] = 0xa2; buf[1] = 0xa4; ret = 2; break; } if (wc == 0x251d) { buf[0] = 0xa2; buf[1] = 0xa5; ret = 2; break; } if (wc == 0x2525) { buf[0] = 0xa2; buf[1] = 0xa7; ret = 2; break; } if (wc == 0x253f) { buf[0] = 0xa2; buf[1] = 0xa6; ret = 2; break; } if (wc >= 0x2550 && wc <= 0x256c) { buf[0] = 0xf9; buf[1] = big5_2003_2charset_page25[wc-0x2550]; ret = 2; break; } if (wc == 0x2574) { buf[0] = 0xa1; buf[1] = 0x5a; ret = 2; break; } if (wc == 0x2593) { buf[0] = 0xf9; buf[1] = 0xfe; ret = 2; break; } break; case 0x26: if (wc == 0x2609 || wc == 0x2641) return RET_ILUNI; break; case 0x27: if (wc == 0x273d) { buf[0] = 0xc6; buf[1] = 0xe6; ret = 2; break; } break; case 0x2f: if (wc == 0x2f02) { buf[0] = 0xc6; buf[1] = 0xbf; ret = 2; break; } if (wc == 0x2f03) { buf[0] = 0xc6; buf[1] = 0xc0; ret = 2; break; } if (wc == 0x2f05) { buf[0] = 0xc6; buf[1] = 0xc1; ret = 2; break; } if (wc == 0x2f07) { buf[0] = 0xc6; buf[1] = 0xc2; ret = 2; break; } if (wc == 0x2f0c) { buf[0] = 0xc6; buf[1] = 0xc3; ret = 2; break; } if (wc == 0x2f0d) { buf[0] = 0xc6; buf[1] = 0xc4; ret = 2; break; } if (wc == 0x2f0e) { buf[0] = 0xc6; buf[1] = 0xc5; ret = 2; break; } if (wc == 0x2f13) { buf[0] = 0xc6; buf[1] = 0xc6; ret = 2; break; } if (wc == 0x2f16) { buf[0] = 0xc6; buf[1] = 0xc7; ret = 2; break; } if (wc == 0x2f19) { buf[0] = 0xc6; buf[1] = 0xc8; ret = 2; break; } if (wc == 0x2f1b) { buf[0] = 0xc6; buf[1] = 0xc9; ret = 2; break; } if (wc == 0x2f22) { buf[0] = 0xc6; buf[1] = 0xca; ret = 2; break; } if (wc == 0x2f27) { buf[0] = 0xc6; buf[1] = 0xcb; ret = 2; break; } if (wc == 0x2f2e) { buf[0] = 0xc6; buf[1] = 0xcc; ret = 2; break; } if (wc == 0x2f33) { buf[0] = 0xc6; buf[1] = 0xcd; ret = 2; break; } if (wc == 0x2f34) { buf[0] = 0xc6; buf[1] = 0xce; ret = 2; break; } if (wc == 0x2f35) { buf[0] = 0xc6; buf[1] = 0xcf; ret = 2; break; } if (wc == 0x2f39) { buf[0] = 0xc6; buf[1] = 0xd0; ret = 2; break; } if (wc == 0x2f3a) { buf[0] = 0xc6; buf[1] = 0xd1; ret = 2; break; } if (wc == 0x2f41) { buf[0] = 0xc6; buf[1] = 0xd2; ret = 2; break; } if (wc == 0x2f46) { buf[0] = 0xc6; buf[1] = 0xd3; ret = 2; break; } if (wc == 0x2f67) { buf[0] = 0xc6; buf[1] = 0xd4; ret = 2; break; } if (wc == 0x2f68) { buf[0] = 0xc6; buf[1] = 0xd5; ret = 2; break; } if (wc == 0x2fa1) { buf[0] = 0xc6; buf[1] = 0xd6; ret = 2; break; } if (wc == 0x2faa) { buf[0] = 0xc6; buf[1] = 0xd7; ret = 2; break; } break; case 0x30: if (wc >= 0x3005 && wc <= 0x3007) { buf[0] = 0xc6; buf[1] = wc - 0x2f25; ret = 2; break; } if (wc >= 0x3038 && wc <= 0x303a) { buf[0] = 0xa2; buf[1] = wc - 0x2f6c; ret = 2; break; } if (wc >= 0x3041 && wc <= 0x3093) { if (wc < 0x3059) { buf[0] = 0xc6; buf[1] = wc - 0x2f5a; } else { buf[0] = 0xc7; buf[1] = wc - 0x3019; } ret = 2; break; } if (wc == 0x309d) { buf[0] = 0xc6; buf[1] = 0xdc; ret = 2; break; } if (wc == 0x309e) { buf[0] = 0xc6; buf[1] = 0xdd; ret = 2; break; } if (wc >= 0x30a1 && wc <= 0x30f6) { buf[0] = 0xc7; buf[1] = wc - (wc < 0x30a5 ? 0x3026 : 0x3004); ret = 2; break; } if (wc == 0x30fc) { buf[0] = 0xc6; buf[1] = 0xe3; ret = 2; break; } if (wc == 0x30fd) { buf[0] = 0xc6; buf[1] = 0xda; ret = 2; break; } if (wc == 0x30fe) { buf[0] = 0xc6; buf[1] = 0xdb; ret = 2; break; } break; case 0x53: if (wc == 0x5344) return RET_ILUNI; break; case 0x58: if (wc == 0x58bb) { buf[0] = 0xf9; buf[1] = 0xd9; ret = 2; break; } break; case 0x5a: if (wc == 0x5afa) { buf[0] = 0xf9; buf[1] = 0xdc; ret = 2; break; } break; case 0x5f: if (wc == 0x5f5e) { buf[0] = 0xc2; buf[1] = 0x55; ret = 2; break; } if (wc == 0x5f5d) return RET_ILUNI; break; case 0x60: if (wc == 0x6052) { buf[0] = 0xf9; buf[1] = 0xda; ret = 2; break; } break; case 0x78: if (wc == 0x7881) { buf[0] = 0xf9; buf[1] = 0xd6; ret = 2; break; } break; case 0x7c: if (wc == 0x7ca7) { buf[0] = 0xf9; buf[1] = 0xdb; ret = 2; break; } break; case 0x88: if (wc == 0x88cf) { buf[0] = 0xf9; buf[1] = 0xd8; ret = 2; break; } break; case 0x92: if (wc == 0x92b9) { buf[0] = 0xf9; buf[1] = 0xd7; ret = 2; break; } break; case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7: case 0xe8: case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed: case 0xee: case 0xef: case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: { unsigned int i = wc - 0xe000; if (i < 5809) { unsigned int c1 = i / 157; unsigned int c2 = i % 157; buf[0] = c1 + (c1 < 5 ? 0xfa : c1 < 24 ? 0x89 : 0x69); buf[1] = c2 + (c2 < 0x3f ? 0x40 : 0x62); ret = 2; break; } } break; case 0xfe: if (wc == 0xfe51) { buf[0] = 0xa1; buf[1] = 0x4e; ret = 2; break; } if (wc == 0xfe68) { buf[0] = 0xa2; buf[1] = 0x42; ret = 2; break; } break; case 0xff: if (wc == 0xff0f) { buf[0] = 0xa1; buf[1] = 0xfe; ret = 2; break; } if (wc == 0xff3b) { buf[0] = 0xc6; buf[1] = 0xe4; ret = 2; break; } if (wc == 0xff3c) { buf[0] = 0xa2; buf[1] = 0x40; ret = 2; break; } if (wc == 0xff3d) { buf[0] = 0xc6; buf[1] = 0xe5; ret = 2; break; } if (wc == 0xff3e) { buf[0] = 0xc6; buf[1] = 0xd9; ret = 2; break; } if (wc == 0xff5e) { buf[0] = 0xa1; buf[1] = 0xe3; ret = 2; break; } if (wc == 0xffe0) { buf[0] = 0xa2; buf[1] = 0x46; ret = 2; break; } if (wc == 0xffe1) { buf[0] = 0xa2; buf[1] = 0x47; ret = 2; break; } if (wc == 0xffe3) { buf[0] = 0xa1; buf[1] = 0xc3; ret = 2; break; } if (wc == 0xffe5) { buf[0] = 0xa2; buf[1] = 0x44; ret = 2; break; } if (wc == 0xff64) return RET_ILUNI; break; } if (ret == RET_ILUNI) ret = big5_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]; r[1] = buf[1]; return 2; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/big5hkscs1999.h000066400000000000000000000132151252300335000253160ustar00rootroot00000000000000/* * Copyright (C) 1999-2002, 2006 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * BIG5-HKSCS:1999 */ /* * BIG5-HKSCS:1999 can be downloaded from * http://www.info.gov.hk/digital21/eng/hkscs/download.html * http://www.info.gov.hk/digital21/eng/hkscs/index.html * * It extends BIG5 (without the rows 0xC6..0xC7) through the ranges * * 0x{88..8D}{40..7E,A1..FE} 641 characters * 0x{8E..A0}{40..7E,A1..FE} 2898 characters * 0x{C6..C8}{40..7E,A1..FE} 359 characters * 0xF9{D6..FE} 41 characters * 0x{FA..FE}{40..7E,A1..FE} 763 characters * * Note that some HKSCS characters are not contained in Unicode 3.2 * and are therefore best represented as sequences of Unicode characters: * 0x8862 U+00CA U+0304 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND MACRON * 0x8864 U+00CA U+030C LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND CARON * 0x88A3 U+00EA U+0304 LATIN SMALL LETTER E WITH CIRCUMFLEX AND MACRON * 0x88A5 U+00EA U+030C LATIN SMALL LETTER E WITH CIRCUMFLEX AND CARON */ #include "hkscs1999.h" #include "flushwc.h" static int big5hkscs1999_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { ucs4_t last_wc = conv->istate; if (last_wc) { /* Output the buffered character. */ conv->istate = 0; *pwc = last_wc; return 0; /* Don't advance the input pointer. */ } else { unsigned char c = *s; /* Code set 0 (ASCII) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (BIG5 extended) */ if (c >= 0xa1 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { if (!((c == 0xc6 && c2 >= 0xa1) || c == 0xc7)) { int ret = big5_mbtowc(conv,pwc,s,2); if (ret != RET_ILSEQ) return ret; } } } } { int ret = hkscs1999_mbtowc(conv,pwc,s,n); if (ret != RET_ILSEQ) return ret; } if (c == 0x88) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if (c2 == 0x62 || c2 == 0x64 || c2 == 0xa3 || c2 == 0xa5) { /* It's a composed character. */ ucs4_t wc1 = ((c2 >> 3) << 2) + 0x009a; /* = 0x00ca or 0x00ea */ ucs4_t wc2 = ((c2 & 6) << 2) + 0x02fc; /* = 0x0304 or 0x030c */ /* We cannot output two Unicode characters at once. So, output the first character and buffer the second one. */ *pwc = wc1; conv->istate = wc2; return 2; } } } return RET_ILSEQ; } } #define big5hkscs1999_flushwc normal_flushwc static int big5hkscs1999_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { int count = 0; unsigned char last = conv->ostate; if (last) { /* last is = 0x66 or = 0xa7. */ if (wc == 0x0304 || wc == 0x030c) { /* Output the combined character. */ if (n >= 2) { r[0] = 0x88; r[1] = last + ((wc & 24) >> 2) - 4; /* = 0x62 or 0x64 or 0xa3 or 0xa5 */ conv->ostate = 0; return 2; } else return RET_TOOSMALL; } /* Output the buffered character. */ if (n < 2) return RET_TOOSMALL; r[0] = 0x88; r[1] = last; r += 2; count = 2; } /* Code set 0 (ASCII) */ if (wc < 0x0080) { /* Plain ASCII character. */ if (n > count) { r[0] = (unsigned char) wc; conv->ostate = 0; return count+1; } else return RET_TOOSMALL; } else { unsigned char buf[2]; int ret; /* Code set 1 (BIG5 extended) */ ret = big5_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (!((buf[0] == 0xc6 && buf[1] >= 0xa1) || buf[0] == 0xc7)) { if (n >= count+2) { r[0] = buf[0]; r[1] = buf[1]; conv->ostate = 0; return count+2; } else return RET_TOOSMALL; } } ret = hkscs1999_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if ((wc & ~0x0020) == 0x00ca) { /* A possible first character of a multi-character sequence. We have to buffer it. */ if (!(buf[0] == 0x88 && (buf[1] == 0x66 || buf[1] == 0xa7))) abort(); conv->ostate = buf[1]; /* = 0x66 or = 0xa7 */ return count+0; } if (n >= count+2) { r[0] = buf[0]; r[1] = buf[1]; conv->ostate = 0; return count+2; } else return RET_TOOSMALL; } return RET_ILUNI; } } static int big5hkscs1999_reset (conv_t conv, unsigned char *r, int n) { unsigned char last = conv->ostate; if (last) { if (n < 2) return RET_TOOSMALL; r[0] = 0x88; r[1] = last; /* conv->ostate = 0; will be done by the caller */ return 2; } else return 0; } freelan-2.0/third-party/source/libiconv-msvc/include/big5hkscs2001.h000066400000000000000000000141001252300335000252570ustar00rootroot00000000000000/* * Copyright (C) 1999-2002, 2006 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * BIG5-HKSCS:2001 */ /* * BIG5-HKSCS:2001 can be downloaded from * http://www.info.gov.hk/digital21/eng/hkscs/download.html * http://www.info.gov.hk/digital21/eng/hkscs/index.html * * It extends BIG5-HKSCS:1999 through 116 characters. * * It extends BIG5 (without the rows 0xC6..0xC7) through the ranges * * 0x{88..8D}{40..7E,A1..FE} 757 characters * 0x{8E..A0}{40..7E,A1..FE} 2898 characters * 0x{C6..C8}{40..7E,A1..FE} 359 characters * 0xF9{D6..FE} 41 characters * 0x{FA..FE}{40..7E,A1..FE} 763 characters * * Note that some HKSCS characters are not contained in Unicode 3.2 * and are therefore best represented as sequences of Unicode characters: * 0x8862 U+00CA U+0304 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND MACRON * 0x8864 U+00CA U+030C LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND CARON * 0x88A3 U+00EA U+0304 LATIN SMALL LETTER E WITH CIRCUMFLEX AND MACRON * 0x88A5 U+00EA U+030C LATIN SMALL LETTER E WITH CIRCUMFLEX AND CARON */ #include "hkscs2001.h" #include "flushwc.h" static int big5hkscs2001_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { ucs4_t last_wc = conv->istate; if (last_wc) { /* Output the buffered character. */ conv->istate = 0; *pwc = last_wc; return 0; /* Don't advance the input pointer. */ } else { unsigned char c = *s; /* Code set 0 (ASCII) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (BIG5 extended) */ if (c >= 0xa1 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { if (!((c == 0xc6 && c2 >= 0xa1) || c == 0xc7)) { int ret = big5_mbtowc(conv,pwc,s,2); if (ret != RET_ILSEQ) return ret; } } } } { int ret = hkscs1999_mbtowc(conv,pwc,s,n); if (ret != RET_ILSEQ) return ret; } { int ret = hkscs2001_mbtowc(conv,pwc,s,n); if (ret != RET_ILSEQ) return ret; } if (c == 0x88) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if (c2 == 0x62 || c2 == 0x64 || c2 == 0xa3 || c2 == 0xa5) { /* It's a composed character. */ ucs4_t wc1 = ((c2 >> 3) << 2) + 0x009a; /* = 0x00ca or 0x00ea */ ucs4_t wc2 = ((c2 & 6) << 2) + 0x02fc; /* = 0x0304 or 0x030c */ /* We cannot output two Unicode characters at once. So, output the first character and buffer the second one. */ *pwc = wc1; conv->istate = wc2; return 2; } } } return RET_ILSEQ; } } #define big5hkscs2001_flushwc normal_flushwc static int big5hkscs2001_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { int count = 0; unsigned char last = conv->ostate; if (last) { /* last is = 0x66 or = 0xa7. */ if (wc == 0x0304 || wc == 0x030c) { /* Output the combined character. */ if (n >= 2) { r[0] = 0x88; r[1] = last + ((wc & 24) >> 2) - 4; /* = 0x62 or 0x64 or 0xa3 or 0xa5 */ conv->ostate = 0; return 2; } else return RET_TOOSMALL; } /* Output the buffered character. */ if (n < 2) return RET_TOOSMALL; r[0] = 0x88; r[1] = last; r += 2; count = 2; } /* Code set 0 (ASCII) */ if (wc < 0x0080) { /* Plain ASCII character. */ if (n > count) { r[0] = (unsigned char) wc; conv->ostate = 0; return count+1; } else return RET_TOOSMALL; } else { unsigned char buf[2]; int ret; /* Code set 1 (BIG5 extended) */ ret = big5_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (!((buf[0] == 0xc6 && buf[1] >= 0xa1) || buf[0] == 0xc7)) { if (n >= count+2) { r[0] = buf[0]; r[1] = buf[1]; conv->ostate = 0; return count+2; } else return RET_TOOSMALL; } } ret = hkscs1999_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if ((wc & ~0x0020) == 0x00ca) { /* A possible first character of a multi-character sequence. We have to buffer it. */ if (!(buf[0] == 0x88 && (buf[1] == 0x66 || buf[1] == 0xa7))) abort(); conv->ostate = buf[1]; /* = 0x66 or = 0xa7 */ return count+0; } if (n >= count+2) { r[0] = buf[0]; r[1] = buf[1]; conv->ostate = 0; return count+2; } else return RET_TOOSMALL; } ret = hkscs2001_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n >= count+2) { r[0] = buf[0]; r[1] = buf[1]; conv->ostate = 0; return count+2; } else return RET_TOOSMALL; } return RET_ILUNI; } } static int big5hkscs2001_reset (conv_t conv, unsigned char *r, int n) { unsigned char last = conv->ostate; if (last) { if (n < 2) return RET_TOOSMALL; r[0] = 0x88; r[1] = last; /* conv->ostate = 0; will be done by the caller */ return 2; } else return 0; } freelan-2.0/third-party/source/libiconv-msvc/include/big5hkscs2004.h000066400000000000000000000146721252300335000253000ustar00rootroot00000000000000/* * Copyright (C) 1999-2002, 2006 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * BIG5-HKSCS:2004 */ /* * BIG5-HKSCS:2004 can be downloaded from * http://www.info.gov.hk/digital21/eng/hkscs/download.html * http://www.info.gov.hk/digital21/eng/hkscs/index.html * * It extends BIG5-HKSCS:2001 through 123 characters. * * It extends BIG5 (without the rows 0xC6..0xC7) through the ranges * * 0x{87..8D}{40..7E,A1..FE} 880 characters * 0x{8E..A0}{40..7E,A1..FE} 2898 characters * 0x{C6..C8}{40..7E,A1..FE} 359 characters * 0xF9{D6..FE} 41 characters * 0x{FA..FE}{40..7E,A1..FE} 763 characters * * Note that some HKSCS characters are not contained in Unicode 3.2 * and are therefore best represented as sequences of Unicode characters: * 0x8862 U+00CA U+0304 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND MACRON * 0x8864 U+00CA U+030C LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND CARON * 0x88A3 U+00EA U+0304 LATIN SMALL LETTER E WITH CIRCUMFLEX AND MACRON * 0x88A5 U+00EA U+030C LATIN SMALL LETTER E WITH CIRCUMFLEX AND CARON */ #include "hkscs2004.h" #include "flushwc.h" static int big5hkscs2004_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { ucs4_t last_wc = conv->istate; if (last_wc) { /* Output the buffered character. */ conv->istate = 0; *pwc = last_wc; return 0; /* Don't advance the input pointer. */ } else { unsigned char c = *s; /* Code set 0 (ASCII) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (BIG5 extended) */ if (c >= 0xa1 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { if (!((c == 0xc6 && c2 >= 0xa1) || c == 0xc7)) { int ret = big5_mbtowc(conv,pwc,s,2); if (ret != RET_ILSEQ) return ret; } } } } { int ret = hkscs1999_mbtowc(conv,pwc,s,n); if (ret != RET_ILSEQ) return ret; } { int ret = hkscs2001_mbtowc(conv,pwc,s,n); if (ret != RET_ILSEQ) return ret; } { int ret = hkscs2004_mbtowc(conv,pwc,s,n); if (ret != RET_ILSEQ) return ret; } if (c == 0x88) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if (c2 == 0x62 || c2 == 0x64 || c2 == 0xa3 || c2 == 0xa5) { /* It's a composed character. */ ucs4_t wc1 = ((c2 >> 3) << 2) + 0x009a; /* = 0x00ca or 0x00ea */ ucs4_t wc2 = ((c2 & 6) << 2) + 0x02fc; /* = 0x0304 or 0x030c */ /* We cannot output two Unicode characters at once. So, output the first character and buffer the second one. */ *pwc = wc1; conv->istate = wc2; return 2; } } } return RET_ILSEQ; } } #define big5hkscs2004_flushwc normal_flushwc static int big5hkscs2004_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { int count = 0; unsigned char last = conv->ostate; if (last) { /* last is = 0x66 or = 0xa7. */ if (wc == 0x0304 || wc == 0x030c) { /* Output the combined character. */ if (n >= 2) { r[0] = 0x88; r[1] = last + ((wc & 24) >> 2) - 4; /* = 0x62 or 0x64 or 0xa3 or 0xa5 */ conv->ostate = 0; return 2; } else return RET_TOOSMALL; } /* Output the buffered character. */ if (n < 2) return RET_TOOSMALL; r[0] = 0x88; r[1] = last; r += 2; count = 2; } /* Code set 0 (ASCII) */ if (wc < 0x0080) { /* Plain ASCII character. */ if (n > count) { r[0] = (unsigned char) wc; conv->ostate = 0; return count+1; } else return RET_TOOSMALL; } else { unsigned char buf[2]; int ret; /* Code set 1 (BIG5 extended) */ ret = big5_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (!((buf[0] == 0xc6 && buf[1] >= 0xa1) || buf[0] == 0xc7)) { if (n >= count+2) { r[0] = buf[0]; r[1] = buf[1]; conv->ostate = 0; return count+2; } else return RET_TOOSMALL; } } ret = hkscs1999_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if ((wc & ~0x0020) == 0x00ca) { /* A possible first character of a multi-character sequence. We have to buffer it. */ if (!(buf[0] == 0x88 && (buf[1] == 0x66 || buf[1] == 0xa7))) abort(); conv->ostate = buf[1]; /* = 0x66 or = 0xa7 */ return count+0; } if (n >= count+2) { r[0] = buf[0]; r[1] = buf[1]; conv->ostate = 0; return count+2; } else return RET_TOOSMALL; } ret = hkscs2001_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n >= count+2) { r[0] = buf[0]; r[1] = buf[1]; conv->ostate = 0; return count+2; } else return RET_TOOSMALL; } ret = hkscs2004_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n >= count+2) { r[0] = buf[0]; r[1] = buf[1]; conv->ostate = 0; return count+2; } else return RET_TOOSMALL; } return RET_ILUNI; } } static int big5hkscs2004_reset (conv_t conv, unsigned char *r, int n) { unsigned char last = conv->ostate; if (last) { if (n < 2) return RET_TOOSMALL; r[0] = 0x88; r[1] = last; /* conv->ostate = 0; will be done by the caller */ return 2; } else return 0; } freelan-2.0/third-party/source/libiconv-msvc/include/big5hkscs2008.h000066400000000000000000000154701252300335000253010ustar00rootroot00000000000000/* * Copyright (C) 1999-2002, 2006, 2010 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * BIG5-HKSCS:2008 */ /* * BIG5-HKSCS:2008 can be downloaded from * http://www.ogcio.gov.hk/ccli/eng/hkscs/download.html * http://www.ogcio.gov.hk/ccli/eng/hkscs/introduction.html * * It extends BIG5-HKSCS:2004 through 68 characters. * * It extends BIG5 (without the rows 0xC6..0xC7) through the ranges * * 0x{87..8D}{40..7E,A1..FE} 880 characters * 0x{8E..A0}{40..7E,A1..FE} 2898 characters * 0x{C6..C8}{40..7E,A1..FE} 359 characters * 0xF9{D6..FE} 41 characters * 0x{FA..FE}{40..7E,A1..FE} 763 characters * * Note that some HKSCS characters are not contained in Unicode 3.2 * and are therefore best represented as sequences of Unicode characters: * 0x8862 U+00CA U+0304 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND MACRON * 0x8864 U+00CA U+030C LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND CARON * 0x88A3 U+00EA U+0304 LATIN SMALL LETTER E WITH CIRCUMFLEX AND MACRON * 0x88A5 U+00EA U+030C LATIN SMALL LETTER E WITH CIRCUMFLEX AND CARON */ #include "hkscs2008.h" #include "flushwc.h" static int big5hkscs2008_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { ucs4_t last_wc = conv->istate; if (last_wc) { /* Output the buffered character. */ conv->istate = 0; *pwc = last_wc; return 0; /* Don't advance the input pointer. */ } else { unsigned char c = *s; /* Code set 0 (ASCII) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (BIG5 extended) */ if (c >= 0xa1 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { if (!((c == 0xc6 && c2 >= 0xa1) || c == 0xc7)) { int ret = big5_mbtowc(conv,pwc,s,2); if (ret != RET_ILSEQ) return ret; } } } } { int ret = hkscs1999_mbtowc(conv,pwc,s,n); if (ret != RET_ILSEQ) return ret; } { int ret = hkscs2001_mbtowc(conv,pwc,s,n); if (ret != RET_ILSEQ) return ret; } { int ret = hkscs2004_mbtowc(conv,pwc,s,n); if (ret != RET_ILSEQ) return ret; } { int ret = hkscs2008_mbtowc(conv,pwc,s,n); if (ret != RET_ILSEQ) return ret; } if (c == 0x88) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if (c2 == 0x62 || c2 == 0x64 || c2 == 0xa3 || c2 == 0xa5) { /* It's a composed character. */ ucs4_t wc1 = ((c2 >> 3) << 2) + 0x009a; /* = 0x00ca or 0x00ea */ ucs4_t wc2 = ((c2 & 6) << 2) + 0x02fc; /* = 0x0304 or 0x030c */ /* We cannot output two Unicode characters at once. So, output the first character and buffer the second one. */ *pwc = wc1; conv->istate = wc2; return 2; } } } return RET_ILSEQ; } } #define big5hkscs2008_flushwc normal_flushwc static int big5hkscs2008_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { int count = 0; unsigned char last = conv->ostate; if (last) { /* last is = 0x66 or = 0xa7. */ if (wc == 0x0304 || wc == 0x030c) { /* Output the combined character. */ if (n >= 2) { r[0] = 0x88; r[1] = last + ((wc & 24) >> 2) - 4; /* = 0x62 or 0x64 or 0xa3 or 0xa5 */ conv->ostate = 0; return 2; } else return RET_TOOSMALL; } /* Output the buffered character. */ if (n < 2) return RET_TOOSMALL; r[0] = 0x88; r[1] = last; r += 2; count = 2; } /* Code set 0 (ASCII) */ if (wc < 0x0080) { /* Plain ASCII character. */ if (n > count) { r[0] = (unsigned char) wc; conv->ostate = 0; return count+1; } else return RET_TOOSMALL; } else { unsigned char buf[2]; int ret; /* Code set 1 (BIG5 extended) */ ret = big5_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (!((buf[0] == 0xc6 && buf[1] >= 0xa1) || buf[0] == 0xc7)) { if (n >= count+2) { r[0] = buf[0]; r[1] = buf[1]; conv->ostate = 0; return count+2; } else return RET_TOOSMALL; } } ret = hkscs1999_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if ((wc & ~0x0020) == 0x00ca) { /* A possible first character of a multi-character sequence. We have to buffer it. */ if (!(buf[0] == 0x88 && (buf[1] == 0x66 || buf[1] == 0xa7))) abort(); conv->ostate = buf[1]; /* = 0x66 or = 0xa7 */ return count+0; } if (n >= count+2) { r[0] = buf[0]; r[1] = buf[1]; conv->ostate = 0; return count+2; } else return RET_TOOSMALL; } ret = hkscs2001_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n >= count+2) { r[0] = buf[0]; r[1] = buf[1]; conv->ostate = 0; return count+2; } else return RET_TOOSMALL; } ret = hkscs2004_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n >= count+2) { r[0] = buf[0]; r[1] = buf[1]; conv->ostate = 0; return count+2; } else return RET_TOOSMALL; } ret = hkscs2008_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n >= count+2) { r[0] = buf[0]; r[1] = buf[1]; conv->ostate = 0; return count+2; } else return RET_TOOSMALL; } return RET_ILUNI; } } static int big5hkscs2008_reset (conv_t conv, unsigned char *r, int n) { unsigned char last = conv->ostate; if (last) { if (n < 2) return RET_TOOSMALL; r[0] = 0x88; r[1] = last; /* conv->ostate = 0; will be done by the caller */ return 2; } else return 0; } freelan-2.0/third-party/source/libiconv-msvc/include/c99.h000066400000000000000000000063701252300335000235100ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * C99 * This is ASCII with \uXXXX and \UXXXXXXXX escape sequences, denoting Unicode * characters. See ISO/IEC 9899:1999, section 6.4.3. * The treatment of control characters in the range U+0080..U+009F is not * specified; we pass them through unmodified. */ static int c99_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c; ucs4_t wc; int i; c = s[0]; if (c < 0xa0) { if (c != '\\') { *pwc = c; return 1; } if (n < 2) return RET_TOOFEW(0); c = s[1]; if (c == 'u') { wc = 0; for (i = 2; i < 6; i++) { if (n <= i) return RET_TOOFEW(0); c = s[i]; if (c >= '0' && c <= '9') c -= '0'; else if (c >= 'A' && c <= 'Z') c -= 'A'-10; else if (c >= 'a' && c <= 'z') c -= 'a'-10; else goto simply_backslash; wc |= (ucs4_t) c << (4 * (5-i)); } if ((wc >= 0x00a0 && !(wc >= 0xd800 && wc < 0xe000)) || wc == 0x0024 || wc == 0x0040 || wc == 0x0060) { *pwc = wc; return 6; } } else if (c == 'U') { wc = 0; for (i = 2; i < 10; i++) { if (n <= i) return RET_TOOFEW(0); c = s[i]; if (c >= '0' && c <= '9') c -= '0'; else if (c >= 'A' && c <= 'Z') c -= 'A'-10; else if (c >= 'a' && c <= 'z') c -= 'a'-10; else goto simply_backslash; wc |= (ucs4_t) c << (4 * (9-i)); } if ((wc >= 0x00a0 && !(wc >= 0xd800 && wc < 0xe000)) || wc == 0x0024 || wc == 0x0040 || wc == 0x0060) { *pwc = wc; return 10; } } else goto simply_backslash; } return RET_ILSEQ; simply_backslash: *pwc = '\\'; return 1; } static int c99_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0xa0) { *r = wc; return 1; } else { int result; unsigned char u; if (wc < 0x10000) { result = 6; u = 'u'; } else { result = 10; u = 'U'; } if (n >= result) { int count; r[0] = '\\'; r[1] = u; r += 2; for (count = result-3; count >= 0; count--) { unsigned int i = (wc >> (4*count)) & 0x0f; *r++ = (i < 10 ? '0'+i : 'a'-10+i); } return result; } else return RET_TOOSMALL; } } freelan-2.0/third-party/source/libiconv-msvc/include/canonical.h000066400000000000000000000150341252300335000250300ustar00rootroot00000000000000 (int)(long)&((struct stringpool_t *)0)->stringpool_str287, (int)(long)&((struct stringpool_t *)0)->stringpool_str255, (int)(long)&((struct stringpool_t *)0)->stringpool_str179, (int)(long)&((struct stringpool_t *)0)->stringpool_str367, (int)(long)&((struct stringpool_t *)0)->stringpool_str283, (int)(long)&((struct stringpool_t *)0)->stringpool_str263, (int)(long)&((struct stringpool_t *)0)->stringpool_str409, (int)(long)&((struct stringpool_t *)0)->stringpool_str325, (int)(long)&((struct stringpool_t *)0)->stringpool_str242, (int)(long)&((struct stringpool_t *)0)->stringpool_str434, (int)(long)&((struct stringpool_t *)0)->stringpool_str350, (int)(long)&((struct stringpool_t *)0)->stringpool_str252, (int)(long)&((struct stringpool_t *)0)->stringpool_str440, (int)(long)&((struct stringpool_t *)0)->stringpool_str356, (int)(long)&((struct stringpool_t *)0)->stringpool_str575, (int)(long)&((struct stringpool_t *)0)->stringpool_str406, (int)(long)&((struct stringpool_t *)0)->stringpool_str723, (int)(long)&((struct stringpool_t *)0)->stringpool_str448, (int)(long)&((struct stringpool_t *)0)->stringpool_str765, (int)(long)&((struct stringpool_t *)0)->stringpool_str30, (int)(long)&((struct stringpool_t *)0)->stringpool_str600, (int)(long)&((struct stringpool_t *)0)->stringpool_str74, (int)(long)&((struct stringpool_t *)0)->stringpool_str84, (int)(long)&((struct stringpool_t *)0)->stringpool_str78, (int)(long)&((struct stringpool_t *)0)->stringpool_str168, (int)(long)&((struct stringpool_t *)0)->stringpool_str82, (int)(long)&((struct stringpool_t *)0)->stringpool_str76, (int)(long)&((struct stringpool_t *)0)->stringpool_str410, (int)(long)&((struct stringpool_t *)0)->stringpool_str90, (int)(long)&((struct stringpool_t *)0)->stringpool_str98, (int)(long)&((struct stringpool_t *)0)->stringpool_str221, (int)(long)&((struct stringpool_t *)0)->stringpool_str75, (int)(long)&((struct stringpool_t *)0)->stringpool_str79, (int)(long)&((struct stringpool_t *)0)->stringpool_str169, (int)(long)&((struct stringpool_t *)0)->stringpool_str83, (int)(long)&((struct stringpool_t *)0)->stringpool_str77, (int)(long)&((struct stringpool_t *)0)->stringpool_str261, (int)(long)&((struct stringpool_t *)0)->stringpool_str403, (int)(long)&((struct stringpool_t *)0)->stringpool_str480, (int)(long)&((struct stringpool_t *)0)->stringpool_str164, (int)(long)&((struct stringpool_t *)0)->stringpool_str18, (int)(long)&((struct stringpool_t *)0)->stringpool_str28, (int)(long)&((struct stringpool_t *)0)->stringpool_str22, (int)(long)&((struct stringpool_t *)0)->stringpool_str112, (int)(long)&((struct stringpool_t *)0)->stringpool_str26, (int)(long)&((struct stringpool_t *)0)->stringpool_str20, (int)(long)&((struct stringpool_t *)0)->stringpool_str354, (int)(long)&((struct stringpool_t *)0)->stringpool_str34, (int)(long)&((struct stringpool_t *)0)->stringpool_str166, (int)(long)&((struct stringpool_t *)0)->stringpool_str27, (int)(long)&((struct stringpool_t *)0)->stringpool_str19, (int)(long)&((struct stringpool_t *)0)->stringpool_str11, (int)(long)&((struct stringpool_t *)0)->stringpool_str451, (int)(long)&((struct stringpool_t *)0)->stringpool_str531, (int)(long)&((struct stringpool_t *)0)->stringpool_str355, (int)(long)&((struct stringpool_t *)0)->stringpool_str501, (int)(long)&((struct stringpool_t *)0)->stringpool_str673, (int)(long)&((struct stringpool_t *)0)->stringpool_str302, (int)(long)&((struct stringpool_t *)0)->stringpool_str621, (int)(long)&((struct stringpool_t *)0)->stringpool_str577, (int)(long)&((struct stringpool_t *)0)->stringpool_str786, (int)(long)&((struct stringpool_t *)0)->stringpool_str908, (int)(long)&((struct stringpool_t *)0)->stringpool_str563, (int)(long)&((struct stringpool_t *)0)->stringpool_str445, (int)(long)&((struct stringpool_t *)0)->stringpool_str502, (int)(long)&((struct stringpool_t *)0)->stringpool_str475, (int)(long)&((struct stringpool_t *)0)->stringpool_str279, (int)(long)&((struct stringpool_t *)0)->stringpool_str626, (int)(long)&((struct stringpool_t *)0)->stringpool_str614, (int)(long)&((struct stringpool_t *)0)->stringpool_str217, (int)(long)&((struct stringpool_t *)0)->stringpool_str212, (int)(long)&((struct stringpool_t *)0)->stringpool_str218, (int)(long)&((struct stringpool_t *)0)->stringpool_str371, (int)(long)&((struct stringpool_t *)0)->stringpool_str15, (int)(long)&((struct stringpool_t *)0)->stringpool_str230, (int)(long)&((struct stringpool_t *)0)->stringpool_str278, (int)(long)&((struct stringpool_t *)0)->stringpool_str124, (int)(long)&((struct stringpool_t *)0)->stringpool_str180, (int)(long)&((struct stringpool_t *)0)->stringpool_str413, (int)(long)&((struct stringpool_t *)0)->stringpool_str555, (int)(long)&((struct stringpool_t *)0)->stringpool_str571, (int)(long)&((struct stringpool_t *)0)->stringpool_str492, (int)(long)&((struct stringpool_t *)0)->stringpool_str384, (int)(long)&((struct stringpool_t *)0)->stringpool_str368, (int)(long)&((struct stringpool_t *)0)->stringpool_str127, (int)(long)&((struct stringpool_t *)0)->stringpool_str202, (int)(long)&((struct stringpool_t *)0)->stringpool_str535, (int)(long)&((struct stringpool_t *)0)->stringpool_str429, (int)(long)&((struct stringpool_t *)0)->stringpool_str32, (int)(long)&((struct stringpool_t *)0)->stringpool_str607, (int)(long)&((struct stringpool_t *)0)->stringpool_str500, (int)(long)&((struct stringpool_t *)0)->stringpool_str505, (int)(long)&((struct stringpool_t *)0)->stringpool_str70, (int)(long)&((struct stringpool_t *)0)->stringpool_str303, (int)(long)&((struct stringpool_t *)0)->stringpool_str24, (int)(long)&((struct stringpool_t *)0)->stringpool_str378, (int)(long)&((struct stringpool_t *)0)->stringpool_str142, (int)(long)&((struct stringpool_t *)0)->stringpool_str196, (int)(long)&((struct stringpool_t *)0)->stringpool_str159, (int)(long)&((struct stringpool_t *)0)->stringpool_str473, (int)(long)&((struct stringpool_t *)0)->stringpool_str277, (int)(long)&((struct stringpool_t *)0)->stringpool_str170, (int)(long)&((struct stringpool_t *)0)->stringpool_str900, (int)(long)&((struct stringpool_t *)0)->stringpool_str888, (int)(long)&((struct stringpool_t *)0)->stringpool_str935, (int)(long)&((struct stringpool_t *)0)->stringpool_str527, (int)(long)&((struct stringpool_t *)0)->stringpool_str290, (int)(long)&((struct stringpool_t *)0)->stringpool_str91, (int)(long)&((struct stringpool_t *)0)->stringpool_str768, (int)(long)&((struct stringpool_t *)0)->stringpool_str362, freelan-2.0/third-party/source/libiconv-msvc/include/canonical_aix.h000066400000000000000000000010471252300335000256700ustar00rootroot00000000000000 (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_0, (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_1, (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_2, (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_3, (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_4, (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_5, (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_6, (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_10, (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_14, freelan-2.0/third-party/source/libiconv-msvc/include/canonical_aix_sysaix.h000066400000000000000000000010511252300335000272630ustar00rootroot00000000000000 (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_0, (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_2, (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_4, (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_6, (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_8, (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_10, (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_12, (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_16, (int)(long)&((struct stringpool2_t *)0)->stringpool_aix_20, freelan-2.0/third-party/source/libiconv-msvc/include/canonical_dos.h000066400000000000000000000016361252300335000257000ustar00rootroot00000000000000 (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_0, (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_4, (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_5, (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_8, (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_12, (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_13, (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_17, (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_21, (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_22, (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_26, (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_31, (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_35, (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_38, (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_42, (int)(long)&((struct stringpool2_t *)0)->stringpool_dos_47, freelan-2.0/third-party/source/libiconv-msvc/include/canonical_extra.h000066400000000000000000000006721252300335000262350ustar00rootroot00000000000000 (int)(long)&((struct stringpool2_t *)0)->stringpool_extra_0, (int)(long)&((struct stringpool2_t *)0)->stringpool_extra_2, (int)(long)&((struct stringpool2_t *)0)->stringpool_extra_4, (int)(long)&((struct stringpool2_t *)0)->stringpool_extra_6, (int)(long)&((struct stringpool2_t *)0)->stringpool_extra_7, (int)(long)&((struct stringpool2_t *)0)->stringpool_extra_9, (int)(long)&((struct stringpool2_t *)0)->stringpool_extra_11, freelan-2.0/third-party/source/libiconv-msvc/include/canonical_local.h000066400000000000000000000001721252300335000261770ustar00rootroot00000000000000 (int)(long)&((struct stringpool_t *)0)->stringpool_str271, (int)(long)&((struct stringpool_t *)0)->stringpool_str664, freelan-2.0/third-party/source/libiconv-msvc/include/canonical_local_sysaix.h000066400000000000000000000001721252300335000275770ustar00rootroot00000000000000 (int)(long)&((struct stringpool_t *)0)->stringpool_str307, (int)(long)&((struct stringpool_t *)0)->stringpool_str543, freelan-2.0/third-party/source/libiconv-msvc/include/canonical_local_syshpux.h000066400000000000000000000001721252300335000300020ustar00rootroot00000000000000 (int)(long)&((struct stringpool_t *)0)->stringpool_str258, (int)(long)&((struct stringpool_t *)0)->stringpool_str390, freelan-2.0/third-party/source/libiconv-msvc/include/canonical_local_sysosf1.h000066400000000000000000000001721252300335000276660ustar00rootroot00000000000000 (int)(long)&((struct stringpool_t *)0)->stringpool_str275, (int)(long)&((struct stringpool_t *)0)->stringpool_str465, freelan-2.0/third-party/source/libiconv-msvc/include/canonical_local_syssolaris.h000066400000000000000000000001711252300335000304710ustar00rootroot00000000000000 (int)(long)&((struct stringpool_t *)0)->stringpool_str38, (int)(long)&((struct stringpool_t *)0)->stringpool_str515, freelan-2.0/third-party/source/libiconv-msvc/include/canonical_osf1.h000066400000000000000000000001741252300335000257570ustar00rootroot00000000000000 (int)(long)&((struct stringpool2_t *)0)->stringpool_osf1_0, (int)(long)&((struct stringpool2_t *)0)->stringpool_osf1_1, freelan-2.0/third-party/source/libiconv-msvc/include/canonical_osf1_sysosf1.h000066400000000000000000000001741252300335000274460ustar00rootroot00000000000000 (int)(long)&((struct stringpool2_t *)0)->stringpool_osf1_0, (int)(long)&((struct stringpool2_t *)0)->stringpool_osf1_2, freelan-2.0/third-party/source/libiconv-msvc/include/canonical_sysaix.h000066400000000000000000000150501252300335000264260ustar00rootroot00000000000000 (int)(long)&((struct stringpool_t *)0)->stringpool_str383, (int)(long)&((struct stringpool_t *)0)->stringpool_str363, (int)(long)&((struct stringpool_t *)0)->stringpool_str231, (int)(long)&((struct stringpool_t *)0)->stringpool_str604, (int)(long)&((struct stringpool_t *)0)->stringpool_str483, (int)(long)&((struct stringpool_t *)0)->stringpool_str327, (int)(long)&((struct stringpool_t *)0)->stringpool_str652, (int)(long)&((struct stringpool_t *)0)->stringpool_str531, (int)(long)&((struct stringpool_t *)0)->stringpool_str358, (int)(long)&((struct stringpool_t *)0)->stringpool_str733, (int)(long)&((struct stringpool_t *)0)->stringpool_str612, (int)(long)&((struct stringpool_t *)0)->stringpool_str364, (int)(long)&((struct stringpool_t *)0)->stringpool_str737, (int)(long)&((struct stringpool_t *)0)->stringpool_str616, (int)(long)&((struct stringpool_t *)0)->stringpool_str685, (int)(long)&((struct stringpool_t *)0)->stringpool_str501, (int)(long)&((struct stringpool_t *)0)->stringpool_str654, (int)(long)&((struct stringpool_t *)0)->stringpool_str549, (int)(long)&((struct stringpool_t *)0)->stringpool_str702, (int)(long)&((struct stringpool_t *)0)->stringpool_str53, (int)(long)&((struct stringpool_t *)0)->stringpool_str891, (int)(long)&((struct stringpool_t *)0)->stringpool_str103, (int)(long)&((struct stringpool_t *)0)->stringpool_str109, (int)(long)&((struct stringpool_t *)0)->stringpool_str107, (int)(long)&((struct stringpool_t *)0)->stringpool_str205, (int)(long)&((struct stringpool_t *)0)->stringpool_str111, (int)(long)&((struct stringpool_t *)0)->stringpool_str105, (int)(long)&((struct stringpool_t *)0)->stringpool_str437, (int)(long)&((struct stringpool_t *)0)->stringpool_str115, (int)(long)&((struct stringpool_t *)0)->stringpool_str141, (int)(long)&((struct stringpool_t *)0)->stringpool_str246, (int)(long)&((struct stringpool_t *)0)->stringpool_str108, (int)(long)&((struct stringpool_t *)0)->stringpool_str112, (int)(long)&((struct stringpool_t *)0)->stringpool_str210, (int)(long)&((struct stringpool_t *)0)->stringpool_str116, (int)(long)&((struct stringpool_t *)0)->stringpool_str110, (int)(long)&((struct stringpool_t *)0)->stringpool_str254, (int)(long)&((struct stringpool_t *)0)->stringpool_str492, (int)(long)&((struct stringpool_t *)0)->stringpool_str569, (int)(long)&((struct stringpool_t *)0)->stringpool_str175, (int)(long)&((struct stringpool_t *)0)->stringpool_str37, (int)(long)&((struct stringpool_t *)0)->stringpool_str43, (int)(long)&((struct stringpool_t *)0)->stringpool_str41, (int)(long)&((struct stringpool_t *)0)->stringpool_str139, (int)(long)&((struct stringpool_t *)0)->stringpool_str45, (int)(long)&((struct stringpool_t *)0)->stringpool_str39, (int)(long)&((struct stringpool_t *)0)->stringpool_str371, (int)(long)&((struct stringpool_t *)0)->stringpool_str49, (int)(long)&((struct stringpool_t *)0)->stringpool_str173, (int)(long)&((struct stringpool_t *)0)->stringpool_str38, (int)(long)&((struct stringpool_t *)0)->stringpool_str34, (int)(long)&((struct stringpool_t *)0)->stringpool_str32, (int)(long)&((struct stringpool_t *)0)->stringpool_str525, (int)(long)&((struct stringpool_t *)0)->stringpool_str797, (int)(long)&((struct stringpool_t *)0)->stringpool_str462, (int)(long)&((struct stringpool_t *)0)->stringpool_str583, (int)(long)&((struct stringpool_t *)0)->stringpool_str807, (int)(long)&((struct stringpool_t *)0)->stringpool_str272, (int)(long)&((struct stringpool_t *)0)->stringpool_str898, (int)(long)&((struct stringpool_t *)0)->stringpool_str606, (int)(long)&((struct stringpool_t *)0)->stringpool_str662, (int)(long)&((struct stringpool_t *)0)->stringpool_str989, (int)(long)&((struct stringpool_t *)0)->stringpool_str648, (int)(long)&((struct stringpool_t *)0)->stringpool_str391, (int)(long)&((struct stringpool_t *)0)->stringpool_str487, (int)(long)&((struct stringpool_t *)0)->stringpool_str413, (int)(long)&((struct stringpool_t *)0)->stringpool_str330, (int)(long)&((struct stringpool_t *)0)->stringpool_str461, (int)(long)&((struct stringpool_t *)0)->stringpool_str335, (int)(long)&((struct stringpool_t *)0)->stringpool_str152, (int)(long)&((struct stringpool_t *)0)->stringpool_str171, (int)(long)&((struct stringpool_t *)0)->stringpool_str234, (int)(long)&((struct stringpool_t *)0)->stringpool_str445, (int)(long)&((struct stringpool_t *)0)->stringpool_str36, (int)(long)&((struct stringpool_t *)0)->stringpool_str207, (int)(long)&((struct stringpool_t *)0)->stringpool_str300, (int)(long)&((struct stringpool_t *)0)->stringpool_str217, (int)(long)&((struct stringpool_t *)0)->stringpool_str256, (int)(long)&((struct stringpool_t *)0)->stringpool_str567, (int)(long)&((struct stringpool_t *)0)->stringpool_str723, (int)(long)&((struct stringpool_t *)0)->stringpool_str735, (int)(long)&((struct stringpool_t *)0)->stringpool_str660, (int)(long)&((struct stringpool_t *)0)->stringpool_str258, (int)(long)&((struct stringpool_t *)0)->stringpool_str235, (int)(long)&((struct stringpool_t *)0)->stringpool_str149, (int)(long)&((struct stringpool_t *)0)->stringpool_str202, (int)(long)&((struct stringpool_t *)0)->stringpool_str638, (int)(long)&((struct stringpool_t *)0)->stringpool_str613, (int)(long)&((struct stringpool_t *)0)->stringpool_str52, (int)(long)&((struct stringpool_t *)0)->stringpool_str629, (int)(long)&((struct stringpool_t *)0)->stringpool_str591, (int)(long)&((struct stringpool_t *)0)->stringpool_str594, (int)(long)&((struct stringpool_t *)0)->stringpool_str188, (int)(long)&((struct stringpool_t *)0)->stringpool_str146, (int)(long)&((struct stringpool_t *)0)->stringpool_str48, (int)(long)&((struct stringpool_t *)0)->stringpool_str251, (int)(long)&((struct stringpool_t *)0)->stringpool_str179, (int)(long)&((struct stringpool_t *)0)->stringpool_str190, (int)(long)&((struct stringpool_t *)0)->stringpool_str92, (int)(long)&((struct stringpool_t *)0)->stringpool_str495, (int)(long)&((struct stringpool_t *)0)->stringpool_str153, (int)(long)&((struct stringpool_t *)0)->stringpool_str186, (int)(long)&((struct stringpool_t *)0)->stringpool_str603, (int)(long)&((struct stringpool_t *)0)->stringpool_str584, (int)(long)&((struct stringpool_t *)0)->stringpool_str635, (int)(long)&((struct stringpool_t *)0)->stringpool_str324, (int)(long)&((struct stringpool_t *)0)->stringpool_str369, (int)(long)&((struct stringpool_t *)0)->stringpool_str133, (int)(long)&((struct stringpool_t *)0)->stringpool_str885, (int)(long)&((struct stringpool_t *)0)->stringpool_str360, freelan-2.0/third-party/source/libiconv-msvc/include/canonical_syshpux.h000066400000000000000000000150341252300335000266330ustar00rootroot00000000000000 (int)(long)&((struct stringpool_t *)0)->stringpool_str310, (int)(long)&((struct stringpool_t *)0)->stringpool_str368, (int)(long)&((struct stringpool_t *)0)->stringpool_str293, (int)(long)&((struct stringpool_t *)0)->stringpool_str464, (int)(long)&((struct stringpool_t *)0)->stringpool_str525, (int)(long)&((struct stringpool_t *)0)->stringpool_str395, (int)(long)&((struct stringpool_t *)0)->stringpool_str515, (int)(long)&((struct stringpool_t *)0)->stringpool_str576, (int)(long)&((struct stringpool_t *)0)->stringpool_str355, (int)(long)&((struct stringpool_t *)0)->stringpool_str521, (int)(long)&((struct stringpool_t *)0)->stringpool_str582, (int)(long)&((struct stringpool_t *)0)->stringpool_str363, (int)(long)&((struct stringpool_t *)0)->stringpool_str534, (int)(long)&((struct stringpool_t *)0)->stringpool_str595, (int)(long)&((struct stringpool_t *)0)->stringpool_str440, (int)(long)&((struct stringpool_t *)0)->stringpool_str665, (int)(long)&((struct stringpool_t *)0)->stringpool_str644, (int)(long)&((struct stringpool_t *)0)->stringpool_str716, (int)(long)&((struct stringpool_t *)0)->stringpool_str695, (int)(long)&((struct stringpool_t *)0)->stringpool_str36, (int)(long)&((struct stringpool_t *)0)->stringpool_str596, (int)(long)&((struct stringpool_t *)0)->stringpool_str64, (int)(long)&((struct stringpool_t *)0)->stringpool_str60, (int)(long)&((struct stringpool_t *)0)->stringpool_str100, (int)(long)&((struct stringpool_t *)0)->stringpool_str162, (int)(long)&((struct stringpool_t *)0)->stringpool_str76, (int)(long)&((struct stringpool_t *)0)->stringpool_str70, (int)(long)&((struct stringpool_t *)0)->stringpool_str158, (int)(long)&((struct stringpool_t *)0)->stringpool_str86, (int)(long)&((struct stringpool_t *)0)->stringpool_str92, (int)(long)&((struct stringpool_t *)0)->stringpool_str177, (int)(long)&((struct stringpool_t *)0)->stringpool_str67, (int)(long)&((struct stringpool_t *)0)->stringpool_str103, (int)(long)&((struct stringpool_t *)0)->stringpool_str165, (int)(long)&((struct stringpool_t *)0)->stringpool_str79, (int)(long)&((struct stringpool_t *)0)->stringpool_str73, (int)(long)&((struct stringpool_t *)0)->stringpool_str345, (int)(long)&((struct stringpool_t *)0)->stringpool_str669, (int)(long)&((struct stringpool_t *)0)->stringpool_str790, (int)(long)&((struct stringpool_t *)0)->stringpool_str131, (int)(long)&((struct stringpool_t *)0)->stringpool_str21, (int)(long)&((struct stringpool_t *)0)->stringpool_str17, (int)(long)&((struct stringpool_t *)0)->stringpool_str57, (int)(long)&((struct stringpool_t *)0)->stringpool_str119, (int)(long)&((struct stringpool_t *)0)->stringpool_str33, (int)(long)&((struct stringpool_t *)0)->stringpool_str27, (int)(long)&((struct stringpool_t *)0)->stringpool_str115, (int)(long)&((struct stringpool_t *)0)->stringpool_str43, (int)(long)&((struct stringpool_t *)0)->stringpool_str141, (int)(long)&((struct stringpool_t *)0)->stringpool_str24, (int)(long)&((struct stringpool_t *)0)->stringpool_str34, (int)(long)&((struct stringpool_t *)0)->stringpool_str35, (int)(long)&((struct stringpool_t *)0)->stringpool_str448, (int)(long)&((struct stringpool_t *)0)->stringpool_str561, (int)(long)&((struct stringpool_t *)0)->stringpool_str410, (int)(long)&((struct stringpool_t *)0)->stringpool_str335, (int)(long)&((struct stringpool_t *)0)->stringpool_str470, (int)(long)&((struct stringpool_t *)0)->stringpool_str704, (int)(long)&((struct stringpool_t *)0)->stringpool_str685, (int)(long)&((struct stringpool_t *)0)->stringpool_str607, (int)(long)&((struct stringpool_t *)0)->stringpool_str689, (int)(long)&((struct stringpool_t *)0)->stringpool_str800, (int)(long)&((struct stringpool_t *)0)->stringpool_str454, (int)(long)&((struct stringpool_t *)0)->stringpool_str195, (int)(long)&((struct stringpool_t *)0)->stringpool_str331, (int)(long)&((struct stringpool_t *)0)->stringpool_str484, (int)(long)&((struct stringpool_t *)0)->stringpool_str202, (int)(long)&((struct stringpool_t *)0)->stringpool_str449, (int)(long)&((struct stringpool_t *)0)->stringpool_str513, (int)(long)&((struct stringpool_t *)0)->stringpool_str139, (int)(long)&((struct stringpool_t *)0)->stringpool_str190, (int)(long)&((struct stringpool_t *)0)->stringpool_str262, (int)(long)&((struct stringpool_t *)0)->stringpool_str603, (int)(long)&((struct stringpool_t *)0)->stringpool_str71, (int)(long)&((struct stringpool_t *)0)->stringpool_str149, (int)(long)&((struct stringpool_t *)0)->stringpool_str170, (int)(long)&((struct stringpool_t *)0)->stringpool_str251, (int)(long)&((struct stringpool_t *)0)->stringpool_str271, (int)(long)&((struct stringpool_t *)0)->stringpool_str450, (int)(long)&((struct stringpool_t *)0)->stringpool_str769, (int)(long)&((struct stringpool_t *)0)->stringpool_str791, (int)(long)&((struct stringpool_t *)0)->stringpool_str710, (int)(long)&((struct stringpool_t *)0)->stringpool_str354, (int)(long)&((struct stringpool_t *)0)->stringpool_str332, (int)(long)&((struct stringpool_t *)0)->stringpool_str153, (int)(long)&((struct stringpool_t *)0)->stringpool_str203, (int)(long)&((struct stringpool_t *)0)->stringpool_str491, (int)(long)&((struct stringpool_t *)0)->stringpool_str461, (int)(long)&((struct stringpool_t *)0)->stringpool_str42, (int)(long)&((struct stringpool_t *)0)->stringpool_str542, (int)(long)&((struct stringpool_t *)0)->stringpool_str473, (int)(long)&((struct stringpool_t *)0)->stringpool_str471, (int)(long)&((struct stringpool_t *)0)->stringpool_str30, (int)(long)&((struct stringpool_t *)0)->stringpool_str314, (int)(long)&((struct stringpool_t *)0)->stringpool_str52, (int)(long)&((struct stringpool_t *)0)->stringpool_str352, (int)(long)&((struct stringpool_t *)0)->stringpool_str81, (int)(long)&((struct stringpool_t *)0)->stringpool_str96, (int)(long)&((struct stringpool_t *)0)->stringpool_str12, (int)(long)&((struct stringpool_t *)0)->stringpool_str378, (int)(long)&((struct stringpool_t *)0)->stringpool_str308, (int)(long)&((struct stringpool_t *)0)->stringpool_str144, (int)(long)&((struct stringpool_t *)0)->stringpool_str771, (int)(long)&((struct stringpool_t *)0)->stringpool_str757, (int)(long)&((struct stringpool_t *)0)->stringpool_str806, (int)(long)&((struct stringpool_t *)0)->stringpool_str421, (int)(long)&((struct stringpool_t *)0)->stringpool_str343, (int)(long)&((struct stringpool_t *)0)->stringpool_str105, (int)(long)&((struct stringpool_t *)0)->stringpool_str654, (int)(long)&((struct stringpool_t *)0)->stringpool_str394, freelan-2.0/third-party/source/libiconv-msvc/include/canonical_sysosf1.h000066400000000000000000000150501252300335000265150ustar00rootroot00000000000000 (int)(long)&((struct stringpool_t *)0)->stringpool_str343, (int)(long)&((struct stringpool_t *)0)->stringpool_str294, (int)(long)&((struct stringpool_t *)0)->stringpool_str223, (int)(long)&((struct stringpool_t *)0)->stringpool_str591, (int)(long)&((struct stringpool_t *)0)->stringpool_str433, (int)(long)&((struct stringpool_t *)0)->stringpool_str319, (int)(long)&((struct stringpool_t *)0)->stringpool_str639, (int)(long)&((struct stringpool_t *)0)->stringpool_str481, (int)(long)&((struct stringpool_t *)0)->stringpool_str289, (int)(long)&((struct stringpool_t *)0)->stringpool_str659, (int)(long)&((struct stringpool_t *)0)->stringpool_str501, (int)(long)&((struct stringpool_t *)0)->stringpool_str295, (int)(long)&((struct stringpool_t *)0)->stringpool_str663, (int)(long)&((struct stringpool_t *)0)->stringpool_str505, (int)(long)&((struct stringpool_t *)0)->stringpool_str586, (int)(long)&((struct stringpool_t *)0)->stringpool_str472, (int)(long)&((struct stringpool_t *)0)->stringpool_str695, (int)(long)&((struct stringpool_t *)0)->stringpool_str520, (int)(long)&((struct stringpool_t *)0)->stringpool_str743, (int)(long)&((struct stringpool_t *)0)->stringpool_str53, (int)(long)&((struct stringpool_t *)0)->stringpool_str711, (int)(long)&((struct stringpool_t *)0)->stringpool_str103, (int)(long)&((struct stringpool_t *)0)->stringpool_str109, (int)(long)&((struct stringpool_t *)0)->stringpool_str107, (int)(long)&((struct stringpool_t *)0)->stringpool_str205, (int)(long)&((struct stringpool_t *)0)->stringpool_str111, (int)(long)&((struct stringpool_t *)0)->stringpool_str105, (int)(long)&((struct stringpool_t *)0)->stringpool_str407, (int)(long)&((struct stringpool_t *)0)->stringpool_str115, (int)(long)&((struct stringpool_t *)0)->stringpool_str141, (int)(long)&((struct stringpool_t *)0)->stringpool_str246, (int)(long)&((struct stringpool_t *)0)->stringpool_str108, (int)(long)&((struct stringpool_t *)0)->stringpool_str112, (int)(long)&((struct stringpool_t *)0)->stringpool_str210, (int)(long)&((struct stringpool_t *)0)->stringpool_str116, (int)(long)&((struct stringpool_t *)0)->stringpool_str110, (int)(long)&((struct stringpool_t *)0)->stringpool_str280, (int)(long)&((struct stringpool_t *)0)->stringpool_str410, (int)(long)&((struct stringpool_t *)0)->stringpool_str487, (int)(long)&((struct stringpool_t *)0)->stringpool_str175, (int)(long)&((struct stringpool_t *)0)->stringpool_str37, (int)(long)&((struct stringpool_t *)0)->stringpool_str43, (int)(long)&((struct stringpool_t *)0)->stringpool_str41, (int)(long)&((struct stringpool_t *)0)->stringpool_str139, (int)(long)&((struct stringpool_t *)0)->stringpool_str45, (int)(long)&((struct stringpool_t *)0)->stringpool_str39, (int)(long)&((struct stringpool_t *)0)->stringpool_str341, (int)(long)&((struct stringpool_t *)0)->stringpool_str49, (int)(long)&((struct stringpool_t *)0)->stringpool_str173, (int)(long)&((struct stringpool_t *)0)->stringpool_str38, (int)(long)&((struct stringpool_t *)0)->stringpool_str34, (int)(long)&((struct stringpool_t *)0)->stringpool_str32, (int)(long)&((struct stringpool_t *)0)->stringpool_str543, (int)(long)&((struct stringpool_t *)0)->stringpool_str727, (int)(long)&((struct stringpool_t *)0)->stringpool_str428, (int)(long)&((struct stringpool_t *)0)->stringpool_str544, (int)(long)&((struct stringpool_t *)0)->stringpool_str761, (int)(long)&((struct stringpool_t *)0)->stringpool_str281, (int)(long)&((struct stringpool_t *)0)->stringpool_str821, (int)(long)&((struct stringpool_t *)0)->stringpool_str649, (int)(long)&((struct stringpool_t *)0)->stringpool_str661, (int)(long)&((struct stringpool_t *)0)->stringpool_str939, (int)(long)&((struct stringpool_t *)0)->stringpool_str646, (int)(long)&((struct stringpool_t *)0)->stringpool_str362, (int)(long)&((struct stringpool_t *)0)->stringpool_str458, (int)(long)&((struct stringpool_t *)0)->stringpool_str500, (int)(long)&((struct stringpool_t *)0)->stringpool_str369, (int)(long)&((struct stringpool_t *)0)->stringpool_str397, (int)(long)&((struct stringpool_t *)0)->stringpool_str442, (int)(long)&((struct stringpool_t *)0)->stringpool_str178, (int)(long)&((struct stringpool_t *)0)->stringpool_str202, (int)(long)&((struct stringpool_t *)0)->stringpool_str234, (int)(long)&((struct stringpool_t *)0)->stringpool_str417, (int)(long)&((struct stringpool_t *)0)->stringpool_str36, (int)(long)&((struct stringpool_t *)0)->stringpool_str253, (int)(long)&((struct stringpool_t *)0)->stringpool_str285, (int)(long)&((struct stringpool_t *)0)->stringpool_str245, (int)(long)&((struct stringpool_t *)0)->stringpool_str238, (int)(long)&((struct stringpool_t *)0)->stringpool_str515, (int)(long)&((struct stringpool_t *)0)->stringpool_str671, (int)(long)&((struct stringpool_t *)0)->stringpool_str683, (int)(long)&((struct stringpool_t *)0)->stringpool_str608, (int)(long)&((struct stringpool_t *)0)->stringpool_str266, (int)(long)&((struct stringpool_t *)0)->stringpool_str243, (int)(long)&((struct stringpool_t *)0)->stringpool_str149, (int)(long)&((struct stringpool_t *)0)->stringpool_str228, (int)(long)&((struct stringpool_t *)0)->stringpool_str581, (int)(long)&((struct stringpool_t *)0)->stringpool_str638, (int)(long)&((struct stringpool_t *)0)->stringpool_str52, (int)(long)&((struct stringpool_t *)0)->stringpool_str593, (int)(long)&((struct stringpool_t *)0)->stringpool_str524, (int)(long)&((struct stringpool_t *)0)->stringpool_str527, (int)(long)&((struct stringpool_t *)0)->stringpool_str167, (int)(long)&((struct stringpool_t *)0)->stringpool_str206, (int)(long)&((struct stringpool_t *)0)->stringpool_str48, (int)(long)&((struct stringpool_t *)0)->stringpool_str259, (int)(long)&((struct stringpool_t *)0)->stringpool_str179, (int)(long)&((struct stringpool_t *)0)->stringpool_str190, (int)(long)&((struct stringpool_t *)0)->stringpool_str60, (int)(long)&((struct stringpool_t *)0)->stringpool_str426, (int)(long)&((struct stringpool_t *)0)->stringpool_str198, (int)(long)&((struct stringpool_t *)0)->stringpool_str186, (int)(long)&((struct stringpool_t *)0)->stringpool_str784, (int)(long)&((struct stringpool_t *)0)->stringpool_str765, (int)(long)&((struct stringpool_t *)0)->stringpool_str816, (int)(long)&((struct stringpool_t *)0)->stringpool_str511, (int)(long)&((struct stringpool_t *)0)->stringpool_str374, (int)(long)&((struct stringpool_t *)0)->stringpool_str133, (int)(long)&((struct stringpool_t *)0)->stringpool_str807, (int)(long)&((struct stringpool_t *)0)->stringpool_str386, freelan-2.0/third-party/source/libiconv-msvc/include/canonical_syssolaris.h000066400000000000000000000150501252300335000273210ustar00rootroot00000000000000 (int)(long)&((struct stringpool_t *)0)->stringpool_str463, (int)(long)&((struct stringpool_t *)0)->stringpool_str258, (int)(long)&((struct stringpool_t *)0)->stringpool_str314, (int)(long)&((struct stringpool_t *)0)->stringpool_str482, (int)(long)&((struct stringpool_t *)0)->stringpool_str365, (int)(long)&((struct stringpool_t *)0)->stringpool_str278, (int)(long)&((struct stringpool_t *)0)->stringpool_str464, (int)(long)&((struct stringpool_t *)0)->stringpool_str347, (int)(long)&((struct stringpool_t *)0)->stringpool_str279, (int)(long)&((struct stringpool_t *)0)->stringpool_str470, (int)(long)&((struct stringpool_t *)0)->stringpool_str353, (int)(long)&((struct stringpool_t *)0)->stringpool_str378, (int)(long)&((struct stringpool_t *)0)->stringpool_str546, (int)(long)&((struct stringpool_t *)0)->stringpool_str429, (int)(long)&((struct stringpool_t *)0)->stringpool_str588, (int)(long)&((struct stringpool_t *)0)->stringpool_str510, (int)(long)&((struct stringpool_t *)0)->stringpool_str563, (int)(long)&((struct stringpool_t *)0)->stringpool_str492, (int)(long)&((struct stringpool_t *)0)->stringpool_str545, (int)(long)&((struct stringpool_t *)0)->stringpool_str30, (int)(long)&((struct stringpool_t *)0)->stringpool_str569, (int)(long)&((struct stringpool_t *)0)->stringpool_str124, (int)(long)&((struct stringpool_t *)0)->stringpool_str184, (int)(long)&((struct stringpool_t *)0)->stringpool_str230, (int)(long)&((struct stringpool_t *)0)->stringpool_str148, (int)(long)&((struct stringpool_t *)0)->stringpool_str160, (int)(long)&((struct stringpool_t *)0)->stringpool_str138, (int)(long)&((struct stringpool_t *)0)->stringpool_str452, (int)(long)&((struct stringpool_t *)0)->stringpool_str122, (int)(long)&((struct stringpool_t *)0)->stringpool_str136, (int)(long)&((struct stringpool_t *)0)->stringpool_str175, (int)(long)&((struct stringpool_t *)0)->stringpool_str129, (int)(long)&((struct stringpool_t *)0)->stringpool_str235, (int)(long)&((struct stringpool_t *)0)->stringpool_str153, (int)(long)&((struct stringpool_t *)0)->stringpool_str165, (int)(long)&((struct stringpool_t *)0)->stringpool_str143, (int)(long)&((struct stringpool_t *)0)->stringpool_str276, (int)(long)&((struct stringpool_t *)0)->stringpool_str680, (int)(long)&((struct stringpool_t *)0)->stringpool_str684, (int)(long)&((struct stringpool_t *)0)->stringpool_str127, (int)(long)&((struct stringpool_t *)0)->stringpool_str81, (int)(long)&((struct stringpool_t *)0)->stringpool_str141, (int)(long)&((struct stringpool_t *)0)->stringpool_str187, (int)(long)&((struct stringpool_t *)0)->stringpool_str105, (int)(long)&((struct stringpool_t *)0)->stringpool_str117, (int)(long)&((struct stringpool_t *)0)->stringpool_str95, (int)(long)&((struct stringpool_t *)0)->stringpool_str409, (int)(long)&((struct stringpool_t *)0)->stringpool_str79, (int)(long)&((struct stringpool_t *)0)->stringpool_str91, (int)(long)&((struct stringpool_t *)0)->stringpool_str94, (int)(long)&((struct stringpool_t *)0)->stringpool_str48, (int)(long)&((struct stringpool_t *)0)->stringpool_str86, (int)(long)&((struct stringpool_t *)0)->stringpool_str387, (int)(long)&((struct stringpool_t *)0)->stringpool_str451, (int)(long)&((struct stringpool_t *)0)->stringpool_str346, (int)(long)&((struct stringpool_t *)0)->stringpool_str415, (int)(long)&((struct stringpool_t *)0)->stringpool_str489, (int)(long)&((struct stringpool_t *)0)->stringpool_str389, (int)(long)&((struct stringpool_t *)0)->stringpool_str752, (int)(long)&((struct stringpool_t *)0)->stringpool_str774, (int)(long)&((struct stringpool_t *)0)->stringpool_str953, (int)(long)&((struct stringpool_t *)0)->stringpool_str853, (int)(long)&((struct stringpool_t *)0)->stringpool_str432, (int)(long)&((struct stringpool_t *)0)->stringpool_str513, (int)(long)&((struct stringpool_t *)0)->stringpool_str297, (int)(long)&((struct stringpool_t *)0)->stringpool_str502, (int)(long)&((struct stringpool_t *)0)->stringpool_str372, (int)(long)&((struct stringpool_t *)0)->stringpool_str412, (int)(long)&((struct stringpool_t *)0)->stringpool_str419, (int)(long)&((struct stringpool_t *)0)->stringpool_str478, (int)(long)&((struct stringpool_t *)0)->stringpool_str71, (int)(long)&((struct stringpool_t *)0)->stringpool_str62, (int)(long)&((struct stringpool_t *)0)->stringpool_str266, (int)(long)&((struct stringpool_t *)0)->stringpool_str192, (int)(long)&((struct stringpool_t *)0)->stringpool_str246, (int)(long)&((struct stringpool_t *)0)->stringpool_str215, (int)(long)&((struct stringpool_t *)0)->stringpool_str424, (int)(long)&((struct stringpool_t *)0)->stringpool_str307, (int)(long)&((struct stringpool_t *)0)->stringpool_str507, (int)(long)&((struct stringpool_t *)0)->stringpool_str669, (int)(long)&((struct stringpool_t *)0)->stringpool_str667, (int)(long)&((struct stringpool_t *)0)->stringpool_str706, (int)(long)&((struct stringpool_t *)0)->stringpool_str211, (int)(long)&((struct stringpool_t *)0)->stringpool_str320, (int)(long)&((struct stringpool_t *)0)->stringpool_str202, (int)(long)&((struct stringpool_t *)0)->stringpool_str283, (int)(long)&((struct stringpool_t *)0)->stringpool_str400, (int)(long)&((struct stringpool_t *)0)->stringpool_str714, (int)(long)&((struct stringpool_t *)0)->stringpool_str147, (int)(long)&((struct stringpool_t *)0)->stringpool_str556, (int)(long)&((struct stringpool_t *)0)->stringpool_str554, (int)(long)&((struct stringpool_t *)0)->stringpool_str584, (int)(long)&((struct stringpool_t *)0)->stringpool_str67, (int)(long)&((struct stringpool_t *)0)->stringpool_str516, (int)(long)&((struct stringpool_t *)0)->stringpool_str101, (int)(long)&((struct stringpool_t *)0)->stringpool_str271, (int)(long)&((struct stringpool_t *)0)->stringpool_str223, (int)(long)&((struct stringpool_t *)0)->stringpool_str327, (int)(long)&((struct stringpool_t *)0)->stringpool_str99, (int)(long)&((struct stringpool_t *)0)->stringpool_str540, (int)(long)&((struct stringpool_t *)0)->stringpool_str293, (int)(long)&((struct stringpool_t *)0)->stringpool_str98, (int)(long)&((struct stringpool_t *)0)->stringpool_str901, (int)(long)&((struct stringpool_t *)0)->stringpool_str895, (int)(long)&((struct stringpool_t *)0)->stringpool_str907, (int)(long)&((struct stringpool_t *)0)->stringpool_str666, (int)(long)&((struct stringpool_t *)0)->stringpool_str255, (int)(long)&((struct stringpool_t *)0)->stringpool_str58, (int)(long)&((struct stringpool_t *)0)->stringpool_str691, (int)(long)&((struct stringpool_t *)0)->stringpool_str411, freelan-2.0/third-party/source/libiconv-msvc/include/ces_big5.h000066400000000000000000000035611252300335000245630ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * BIG-5 */ static int ces_big5_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; /* Code set 0 (ASCII) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (BIG5) */ if (c >= 0xa1 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) return big5_mbtowc(conv,pwc,s,2); else return RET_ILSEQ; } } return RET_ILSEQ; } static int ces_big5_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; /* Code set 0 (ASCII) */ ret = ascii_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; /* Code set 1 (BIG5) */ ret = big5_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]; r[1] = buf[1]; return 2; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/ces_gbk.h000066400000000000000000000033661252300335000245030ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2005 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GBK */ static int ces_gbk_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; /* Code set 0 (ASCII or GB 1988-89) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (GBK) */ if (c >= 0x81 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); return gbk_mbtowc(conv,pwc,s,2); } return RET_ILSEQ; } static int ces_gbk_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; /* Code set 0 (ASCII or GB 1988-89) */ ret = ascii_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; /* Code set 1 (GBK) */ ret = gbk_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]; r[1] = buf[1]; return 2; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cjk_variants.h000066400000000000000000007575511252300335000256000ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CJK variants table */ static const unsigned short cjk_variants[12038] = { 0x9e44, 0x1e2a, 0x200b, 0xcb87, 0xaf0c, 0x9e0a, 0x9e0b, 0xd42c, 0x23c1, 0xaf0e, 0x9e04, 0x9e05, 0xa176, 0xd207, 0x2303, 0xa304, 0x1e12, 0x619c, 0xeb57, 0x9e11, 0x2c02, 0xac08, 0x1e17, 0xa34b, 0x1e16, 0xa34b, 0x1e20, 0xa775, 0xb96d, 0x23e2, 0x3a37, 0x3b09, 0xd5c2, 0xb771, 0x4cf8, 0xcd72, 0x1e22, 0xa3be, 0x1e18, 0xa775, 0x1e24, 0xa169, 0x1e1f, 0xa3be, 0xe149, 0x1e21, 0xa169, 0x23b3, 0xa6b4, 0x20a1, 0x2e76, 0xcadd, 0xa5aa, 0x00f6, 0x200b, 0xcb87, 0x3792, 0x3860, 0xb90f, 0xc23f, 0x5c4a, 0x5c50, 0x673b, 0x674a, 0x68a8, 0xe8ce, 0x9e33, 0x9e32, 0xd1e8, 0x40ba, 0xc232, 0x2a6f, 0xee97, 0x3319, 0x34e7, 0xd209, 0xa3ca, 0x2208, 0xd2c5, 0x2efc, 0xdffa, 0x0006, 0x9e94, 0x1e46, 0xe579, 0x1e45, 0xe579, 0x2c1b, 0x2e7a, 0x2e85, 0x6ebc, 0xeebd, 0xcfa9, 0xc0cf, 0x397d, 0xba02, 0x1f17, 0x3500, 0x473e, 0xd846, 0xa5ac, 0x564e, 0xd65d, 0x1e58, 0xb909, 0x1e57, 0xb909, 0x6690, 0x66a0, 0xe6b1, 0xcfd2, 0x60f7, 0x6109, 0x610a, 0xe115, 0xb6f8, 0x2158, 0xa9cb, 0xdcb7, 0x1e82, 0xe1e0, 0x1e7e, 0x1e81, 0xbf27, 0x1e79, 0x1e81, 0x2e72, 0xbf27, 0x6f9c, 0xef9f, 0x1e79, 0x1e7e, 0xbf27, 0x1e71, 0xe1e0, 0x36b8, 0xc7ad, 0xdc6b, 0xc22d, 0x1e8b, 0xa3d3, 0x1e8a, 0xa3d3, 0xaf0d, 0x1e8f, 0x1e90, 0xb5bc, 0x1e8e, 0x1e90, 0x35bc, 0xd667, 0x1e8e, 0x9e8f, 0x1f1d, 0xe6f2, 0x9e44, 0xa6db, 0x2c81, 0x2d57, 0x3b72, 0xbb73, 0x9e99, 0x9e98, 0x1e9c, 0x9e9e, 0x1e9a, 0x9e9e, 0x3589, 0x358a, 0x6f4a, 0xef50, 0x1e9a, 0x9e9c, 0xc10f, 0x1ebe, 0xa166, 0x4522, 0xc523, 0x4546, 0x4552, 0x455d, 0xc55e, 0x9eaf, 0x9eb0, 0x9eab, 0x9eac, 0xa91c, 0xd9aa, 0xd93b, 0xa6b2, 0x9ebb, 0x9eba, 0x1ea1, 0xa166, 0xa104, 0xafce, 0x20cd, 0x22a8, 0xa2d5, 0x1ed8, 0xa0c5, 0xa0d5, 0xdb8e, 0xa0df, 0x21ab, 0x21b0, 0xbc37, 0x2f93, 0xaf9e, 0x9f5b, 0x1f1e, 0xa098, 0x1f96, 0x2d18, 0xad19, 0x1efa, 0xa009, 0x9ec5, 0x20ca, 0xa0f2, 0xa40c, 0x9eed, 0xaf74, 0x214f, 0x6577, 0x6578, 0xe57f, 0xa100, 0xa011, 0x9ede, 0x2047, 0xa3cd, 0x1fa1, 0xa0f9, 0x1ed3, 0xa009, 0x9fc7, 0x2f6c, 0xb58c, 0x9f4e, 0x2023, 0x2f77, 0x2fac, 0x4706, 0xeae3, 0x20a0, 0xc26b, 0xae11, 0x1e51, 0x473e, 0xd846, 0xa12a, 0xa925, 0xb703, 0xa0b4, 0xa005, 0x1e91, 0x1f20, 0xa0b3, 0x1ed0, 0x2098, 0xce56, 0xa049, 0x1f1d, 0xa0b3, 0x9fe5, 0x9fd4, 0xa0b7, 0xa000, 0xa02b, 0xa096, 0x207d, 0xa0de, 0x1f47, 0xcada, 0xa2aa, 0x1f32, 0x1f60, 0xa11e, 0x1f31, 0x1f60, 0xa11e, 0x9f90, 0xd0c4, 0x9f40, 0x9f3c, 0xb014, 0x9f2b, 0xae03, 0x9efe, 0x4b28, 0x5eb0, 0x5ec6, 0x6ab5, 0xead4, 0xa360, 0x6918, 0xe980, 0x1ecf, 0x2f7f, 0xeaf4, 0xa05a, 0x9fab, 0x1f31, 0x1f32, 0x211e, 0xa9b3, 0xa0ad, 0xa0c9, 0xaf8a, 0x3cd5, 0xc04b, 0x2002, 0xae76, 0xaf88, 0xa058, 0x29b7, 0xa9ea, 0xb765, 0x6625, 0x6634, 0x6670, 0xe682, 0xb549, 0x9f35, 0x9ed1, 0x5350, 0xd5a6, 0x9fe0, 0x1ef7, 0xa0f9, 0x9fb6, 0xa0e5, 0x2075, 0xe049, 0xa074, 0xa0d1, 0xa108, 0xa115, 0x9f5e, 0xa102, 0x2118, 0xac3d, 0xc7e6, 0x9fa3, 0xac40, 0xc537, 0x9fe3, 0xccfb, 0x9efc, 0xa101, 0xdf14, 0xc23c, 0x1f23, 0xb093, 0xa16a, 0xcae2, 0x9fa0, 0xda2b, 0x9fee, 0x9fc1, 0x9f21, 0xa114, 0xa13c, 0xa006, 0xa137, 0xa008, 0x2039, 0xa109, 0x1fe2, 0xd129, 0xa036, 0x209a, 0xb548, 0x2079, 0x2099, 0x20c3, 0xa907, 0x4ca5, 0xeb3b, 0x30de, 0xbb23, 0x9f25, 0x1f75, 0xae76, 0x207a, 0x24b1, 0xa592, 0x9f1c, 0x9fe9, 0x9feb, 0x1ed3, 0x9efa, 0xa06c, 0x00f6, 0x1e2a, 0xcb87, 0xd146, 0xa010, 0xa00f, 0x9eec, 0xae78, 0xa0b9, 0x2fa3, 0xd5c9, 0x1eff, 0xc706, 0xa03c, 0x22b5, 0xa2cc, 0x9f26, 0xa25a, 0x9ff1, 0x1fed, 0xa109, 0xa0b5, 0xa024, 0xa0be, 0xd2f1, 0xdcf0, 0x9eee, 0x9f1f, 0x5d0b, 0x5d17, 0xdd5d, 0x9f83, 0xa0c0, 0x9f5c, 0xafa4, 0xe03c, 0x200a, 0xa0af, 0x9fa7, 0x1fa6, 0xe049, 0xa078, 0xa077, 0x1ffb, 0x2099, 0x20c3, 0xa907, 0x2003, 0x24b1, 0xa592, 0xa0c2, 0x1f2a, 0xa0de, 0xa0e8, 0xa11f, 0x4f75, 0x69e1, 0xea82, 0xafac, 0xb770, 0x9f27, 0x1ed0, 0x1f1e, 0xce56, 0x1ffb, 0x2079, 0x20c3, 0xa907, 0x1ff2, 0xb548, 0xafad, 0x1f10, 0xc26b, 0x1e26, 0x2e76, 0xcadd, 0xabb6, 0xa10e, 0xa13b, 0xa110, 0xa132, 0xa13a, 0x9f63, 0xa06c, 0x1f1d, 0x9f20, 0x9f1b, 0xa03a, 0x9f24, 0xa01e, 0xa03e, 0xa059, 0xa07b, 0x1ffb, 0x2079, 0x2099, 0xa907, 0xafb1, 0x9ec5, 0x9f65, 0x9ed9, 0x1ec2, 0x22a8, 0xa2d5, 0x9fa8, 0x9ec6, 0xb55e, 0xc67b, 0x1f2a, 0xa07d, 0x9ec9, 0xa0ed, 0x9fa5, 0xa07e, 0xa0f4, 0x3076, 0x30aa, 0xb0e1, 0xa0e3, 0xe6c7, 0x9ed9, 0xa0e9, 0x1ef7, 0x9fa1, 0x9eea, 0x9fca, 0x9fac, 0x9ebf, 0x9fa9, 0x1fed, 0xa039, 0xa0a4, 0xa0a7, 0x9fe6, 0x9faa, 0x1fad, 0xac3d, 0x1f31, 0x1f32, 0x9f60, 0xa07f, 0xa139, 0x9f18, 0xa0a8, 0x9fea, 0xa127, 0xa0a9, 0xa0a5, 0x9fe8, 0x2150, 0xa152, 0xcc2a, 0xa1f6, 0x406e, 0xc097, 0x214c, 0xa151, 0x224b, 0x22ca, 0xac05, 0x214a, 0xa151, 0xa154, 0x1ee7, 0x6577, 0x6578, 0xe57f, 0x213f, 0xa152, 0x214a, 0xa14c, 0x213f, 0xa150, 0xa14e, 0xa157, 0xa156, 0x1e68, 0xa9cb, 0xeee8, 0xa160, 0xa15c, 0xb5f7, 0x1ea1, 0x9ebe, 0xa185, 0x1e21, 0x9e24, 0x9fde, 0xd62d, 0x2929, 0x6754, 0xe75d, 0x24b2, 0x4b11, 0x65a2, 0x65d7, 0xe5dc, 0xd208, 0x9e0c, 0x530a, 0xd332, 0x4faa, 0xe90a, 0x4363, 0xc378, 0xa180, 0xa17e, 0xa6c5, 0xa18b, 0xae3d, 0xa189, 0xa167, 0x2706, 0x270e, 0xa713, 0xaca1, 0xa184, 0x218c, 0xcb27, 0xa182, 0x218a, 0xcb27, 0x226e, 0xa3e7, 0xa6e7, 0xa192, 0xd0c4, 0xa190, 0xab82, 0x21a9, 0xabeb, 0xdecd, 0xdfb2, 0x2b90, 0xab9c, 0xa85a, 0xb700, 0xabc3, 0x2bbc, 0xabc7, 0xabcc, 0x2199, 0xabeb, 0x2e42, 0xcf83, 0x1ecc, 0x21b0, 0xbc37, 0x3638, 0xef15, 0xe9ae, 0x1ecc, 0x21ab, 0xbc37, 0xa1b4, 0x3c96, 0xd85d, 0xbc7a, 0xa1b1, 0xbcc1, 0xbcef, 0xa1cd, 0xbd0c, 0x21c8, 0xbde8, 0xbd7c, 0xbd82, 0x3053, 0x30bd, 0xbdd2, 0xbdb8, 0x21d6, 0xbe96, 0xa1c0, 0xbdbc, 0xa1bb, 0xbe1b, 0xbe4a, 0xc69a, 0xb817, 0x21c6, 0xbe96, 0x21dc, 0xbf9f, 0x21db, 0xbf9f, 0x4108, 0x4155, 0x4188, 0xc199, 0x2e7e, 0xb73a, 0x21e2, 0xa1e3, 0x21e1, 0xa1e3, 0x21e1, 0xa1e2, 0xecf3, 0xac45, 0x2904, 0xd655, 0x21ec, 0x21ee, 0x68a8, 0x68cc, 0xe8ce, 0xece7, 0x21e8, 0x21ee, 0x68a8, 0x68cc, 0xe8ce, 0x21f4, 0x317f, 0xb191, 0x21e8, 0x21ec, 0x68a8, 0x68cc, 0xe8ce, 0xa1f1, 0xa1ef, 0x2c32, 0x2c34, 0x2c36, 0x2c37, 0xeb50, 0xbac8, 0x21ed, 0x317f, 0xb191, 0xa147, 0x2757, 0x284a, 0xa8a4, 0x2c80, 0xef63, 0x3483, 0xb4ca, 0xa1fe, 0xa1fd, 0xe47f, 0x2202, 0xe1d6, 0x2200, 0xe1d6, 0xa204, 0xa203, 0x221b, 0xa275, 0x1e42, 0xd2c5, 0xb81e, 0xd2bb, 0x2283, 0x2290, 0xc53b, 0xa6ed, 0xb289, 0xa289, 0xa247, 0xa25b, 0x2205, 0x2231, 0x224f, 0x2259, 0xa275, 0xa22a, 0xa22b, 0x2227, 0x223c, 0xa2ab, 0x2226, 0x223c, 0xa2ab, 0x624b, 0x6464, 0xe4c7, 0xa220, 0x2225, 0xaf46, 0x2257, 0x2277, 0x63df, 0xe4f2, 0xa244, 0xe8b3, 0x221b, 0x224f, 0x2259, 0xa275, 0xa241, 0xd8fd, 0xa24e, 0xa23e, 0x2226, 0x2227, 0xa2ab, 0xa28a, 0xa23a, 0xa28c, 0xa274, 0xa234, 0x2264, 0xa291, 0xeb00, 0xa22d, 0xa219, 0x214b, 0x22ca, 0xac05, 0xbe82, 0xbb6c, 0xa239, 0x221b, 0x2231, 0x2259, 0xa275, 0x226e, 0xa3e7, 0x2263, 0x2271, 0x228d, 0x228e, 0x2292, 0x2294, 0x61f0, 0xe1fc, 0x222c, 0x2277, 0x63df, 0xe4f2, 0x221b, 0x2231, 0x224f, 0xa275, 0xa033, 0xa21a, 0xa265, 0x2251, 0x2271, 0x228d, 0x228e, 0x2292, 0x2294, 0x61f0, 0xe1fc, 0x2242, 0xa291, 0xa25d, 0x65b9, 0xe609, 0xa287, 0xa270, 0x218e, 0x2250, 0xa3e7, 0xa269, 0x2251, 0x2263, 0x228d, 0x228e, 0x2292, 0x2294, 0x61f0, 0xe1fc, 0xb72d, 0xa240, 0x2205, 0x221b, 0x2231, 0x224f, 0xa259, 0x222c, 0x2257, 0x63df, 0xe4f2, 0xb22e, 0xa2e6, 0x2212, 0x2290, 0xc53b, 0xcb9a, 0xa267, 0xa218, 0xa23d, 0xa23f, 0x2251, 0x2263, 0x2271, 0x228e, 0x2292, 0x2294, 0x61f0, 0xe1fc, 0x2251, 0x2263, 0x2271, 0x228d, 0x2292, 0x2294, 0x61f0, 0xe1fc, 0x2212, 0x2283, 0xc53b, 0x2242, 0xa264, 0x2251, 0x2263, 0x2271, 0x228d, 0x228e, 0x2294, 0x61f0, 0xe1fc, 0x2251, 0x2263, 0x2271, 0x228d, 0x228e, 0x2292, 0x61f0, 0xe1fc, 0x5cad, 0xdcea, 0x22e7, 0xa2f8, 0xdfa6, 0x4cfc, 0xccff, 0xa2d9, 0xa2f1, 0x1ec2, 0x20cd, 0xa2d5, 0x9f2e, 0x2226, 0x2227, 0xa23c, 0xa2f5, 0xa2c1, 0x22b4, 0x22de, 0xb1a5, 0x22b3, 0x22de, 0xb1a5, 0x2026, 0xa2cc, 0xb548, 0xa2e2, 0xa2b2, 0xb54f, 0x22d1, 0xb555, 0xa2c8, 0xa2c7, 0x214b, 0x224b, 0xac05, 0x22db, 0x22f2, 0xa2f3, 0x2026, 0xa2b5, 0x22c5, 0x2f95, 0x2fa0, 0xb555, 0x1ec2, 0x20cd, 0xa2a8, 0x22d7, 0xb702, 0x22d6, 0xb702, 0xa2a1, 0xa2e9, 0x22cb, 0x22f2, 0xa2f3, 0xd0dc, 0x22b3, 0x22b4, 0xb1a5, 0xb22e, 0xa2bf, 0xb1c3, 0xa27f, 0x229d, 0xa2f8, 0xa2da, 0xa2a2, 0x22cb, 0x22db, 0xa2f3, 0x22cb, 0x22db, 0xa2f2, 0xa2b1, 0x229d, 0xa2e7, 0xa300, 0xa2fb, 0x1e10, 0xa304, 0x1e10, 0xa303, 0xeead, 0x2fe9, 0x3031, 0xb0a4, 0xb3ac, 0x5133, 0xd166, 0xa338, 0x37e9, 0xb7fe, 0x2e00, 0xdfca, 0xa320, 0xa31e, 0xa329, 0xa32d, 0xcbcb, 0x5535, 0xd5cf, 0xa321, 0xa326, 0xa331, 0x3c47, 0xbed9, 0xa32e, 0x2333, 0x2941, 0xa969, 0x2332, 0x2941, 0xa969, 0xa31a, 0xa340, 0x3bc9, 0xe1ab, 0xa33a, 0xe7c6, 0xa352, 0x3607, 0x36fb, 0x6629, 0xe65e, 0xd294, 0x1e16, 0x9e17, 0xa350, 0x2d0b, 0x53ef, 0xd550, 0x2354, 0x23f6, 0xb5ea, 0xa34d, 0xa346, 0x384c, 0xb9d5, 0x234f, 0x23f6, 0xb5ea, 0x2358, 0xa5ae, 0x28f2, 0xdce3, 0x2355, 0xa5ae, 0xb13d, 0xc387, 0x53d4, 0xd514, 0x9f54, 0xc6e7, 0x2365, 0x2877, 0x3ef7, 0x3f9b, 0x4002, 0x597f, 0xee75, 0x2364, 0xd97f, 0xd1e5, 0x585b, 0xd85e, 0xadf5, 0x2918, 0xb23c, 0xae01, 0x237d, 0xc68d, 0xa37b, 0x2dfb, 0xb372, 0xcf37, 0x3064, 0xdcc9, 0xa374, 0x2373, 0xc68d, 0x2388, 0x23b0, 0xaee0, 0xb239, 0x2ef0, 0xaef3, 0x23a4, 0x23af, 0x36a6, 0x36c6, 0x3b74, 0xbb77, 0xc8d4, 0xa382, 0xa3b2, 0x2727, 0xa8d3, 0xa3ad, 0xa399, 0xc825, 0xef8e, 0xad16, 0x23a0, 0xaec1, 0x28e5, 0x2edb, 0x613d, 0xe1d0, 0xa38d, 0xa795, 0xaef3, 0xa3a1, 0x2395, 0xaec1, 0xa39f, 0xaec2, 0xa3b4, 0x2386, 0xb6c6, 0xaec8, 0xaeda, 0x2ecf, 0xaed0, 0xa38c, 0xaedd, 0x2386, 0x36a6, 0x36c6, 0x3b74, 0xbb77, 0x2382, 0xaee0, 0xa389, 0x1e25, 0xa6b4, 0xa3a3, 0xbe90, 0xc9c1, 0xd0b1, 0x60bb, 0x6130, 0xe6a3, 0xa3bb, 0xa3ba, 0x1e1f, 0x9e22, 0x470c, 0xce23, 0x1e09, 0xaf0e, 0x23c3, 0x23c4, 0xa3c5, 0x23c2, 0x23c4, 0xa3c5, 0x23c2, 0x23c3, 0xa3c5, 0x23c2, 0x23c3, 0xa3c4, 0xe749, 0xe746, 0xa3f9, 0xb268, 0x9e41, 0xe6d9, 0x1eee, 0x23db, 0xc08d, 0xb536, 0xa92c, 0xc2ae, 0x467a, 0x467c, 0x6aea, 0xeaee, 0x1e8a, 0x9e8b, 0xcdb4, 0x2909, 0xdb8a, 0x354d, 0xb558, 0x23cd, 0xc08d, 0xac09, 0x4573, 0x4582, 0x4589, 0xc58a, 0x28e1, 0xc77f, 0x1e1b, 0x3a37, 0x3b09, 0xd5c2, 0x218e, 0x2250, 0xa26e, 0x49d6, 0x5879, 0xe6bb, 0xa44c, 0x276e, 0x37b1, 0x3aaf, 0x51fa, 0xe8b1, 0x234f, 0x2354, 0x35ea, 0xd449, 0xd65f, 0x23c8, 0x2606, 0xbb4e, 0xa630, 0x24a9, 0xa4f6, 0x4c72, 0xefa5, 0x25ab, 0xa644, 0xe5a4, 0xaf14, 0x1edd, 0xd855, 0xaf8c, 0x26ae, 0xb6cf, 0xa687, 0xa442, 0xa5ce, 0xb061, 0xa451, 0x252b, 0x2656, 0xda21, 0xa678, 0x5074, 0xd07d, 0x2518, 0x2553, 0x2554, 0x255f, 0x5aec, 0xe5d9, 0x2434, 0xa449, 0x2433, 0xa449, 0xa450, 0xd117, 0xa44d, 0xa44a, 0xa415, 0x3282, 0xc2c2, 0x2433, 0xa434, 0xa43f, 0xa3eb, 0xa43d, 0xa436, 0xa41e, 0xa638, 0xa6c8, 0xa614, 0xa6a6, 0xa504, 0x24e1, 0x5c9f, 0xdd20, 0x24bc, 0xa58e, 0xa4fa, 0xa5c6, 0xa5da, 0xda46, 0xe031, 0xa5dc, 0x2492, 0xda4b, 0xda4d, 0x2611, 0x5656, 0xdb3c, 0xa4e3, 0x248c, 0x30d2, 0xefa2, 0x248a, 0x30d2, 0xefa2, 0xda60, 0x246a, 0xda4b, 0xa6a8, 0xa680, 0xa4a4, 0xa65d, 0xa49c, 0x2400, 0xa4f6, 0xef69, 0x2580, 0xd849, 0x2003, 0x207a, 0xa592, 0x2173, 0xcb11, 0x618e, 0xee79, 0x2459, 0xa58e, 0xa6a5, 0x65a7, 0xeb28, 0xe7ff, 0x2516, 0x255e, 0x45d6, 0xc602, 0xa660, 0xa635, 0xa5f6, 0xa666, 0x2629, 0xdb41, 0xa672, 0xa68c, 0xa665, 0xa5b2, 0x2458, 0x5c9f, 0xdd20, 0xa485, 0xda36, 0x2560, 0x2586, 0x269e, 0x27d1, 0xb08a, 0x2400, 0xa4a9, 0xa45a, 0x5a98, 0xdbf1, 0xa457, 0xd123, 0xd39e, 0xa57a, 0xa523, 0x24d1, 0x255e, 0x45d6, 0xc602, 0x242f, 0x2553, 0x2554, 0x255f, 0x5aec, 0xe5d9, 0xa61c, 0xa5ca, 0xa62e, 0xa5e9, 0xa515, 0xa59a, 0xa59e, 0xa41f, 0xdaaf, 0xaff5, 0xa60a, 0xdb2a, 0xe5ee, 0x242f, 0x2518, 0x2554, 0x255f, 0x5aec, 0xe5d9, 0x242f, 0x2518, 0x2553, 0x255f, 0x5aec, 0xe5d9, 0xa649, 0xa649, 0x24d1, 0x2516, 0x45d6, 0xc602, 0x242f, 0x2518, 0x2553, 0x2554, 0x5aec, 0xe5d9, 0x24f2, 0x2586, 0x269e, 0x27d1, 0xb08a, 0x5854, 0x5858, 0xe29c, 0xa616, 0xa5c7, 0xa6c0, 0x265b, 0x2699, 0x26d3, 0xef67, 0xa613, 0x26c9, 0xcf57, 0xa63d, 0xa62f, 0xa510, 0x24af, 0xd849, 0x6927, 0xe935, 0xdb71, 0x24f2, 0x2560, 0x269e, 0x27d1, 0xb08a, 0x2459, 0xa4bc, 0x267e, 0xc616, 0x2003, 0x207a, 0xa4b1, 0xa524, 0x3198, 0x3199, 0xbb56, 0xa527, 0xa5bb, 0x9e27, 0x2403, 0xa644, 0x9e54, 0x2355, 0xa358, 0x25b7, 0xa674, 0x68df, 0x68e0, 0xe963, 0xa4df, 0x41df, 0xd425, 0x25af, 0xa674, 0xa5a9, 0xa60d, 0xa6b3, 0xef45, 0xa45b, 0xa56c, 0xa51d, 0xa417, 0xa45c, 0xa469, 0xe16a, 0xab60, 0xa637, 0xa522, 0xa6c1, 0xa66f, 0xa4d4, 0xdb30, 0x23f9, 0xbb4e, 0xa540, 0xa5bd, 0x247c, 0xdb3c, 0xa56f, 0xa455, 0xa567, 0x2690, 0x2c1d, 0xc51e, 0xa653, 0xa51b, 0xa6b6, 0xa62f, 0x24d7, 0xdb41, 0xa520, 0x2578, 0xa628, 0xa3fd, 0xa6d1, 0xa4d3, 0xa5e5, 0xa452, 0xa574, 0xb076, 0xdb50, 0x2403, 0xa5ab, 0xa655, 0x2556, 0xa557, 0xa668, 0xa618, 0xa645, 0x241f, 0xda21, 0x256e, 0xa699, 0xa695, 0xa49d, 0xa4d2, 0xdb6b, 0xa4dd, 0xa4d5, 0xa650, 0xdb5f, 0xa5f3, 0xa4d9, 0x25af, 0xa5b7, 0x585c, 0x585f, 0xe053, 0xa428, 0xaf53, 0xa591, 0xa49b, 0xa413, 0xa4dc, 0xa694, 0x2617, 0x2c1d, 0xc51e, 0xa68f, 0xa65c, 0x256e, 0x265b, 0x26d3, 0xef67, 0x24f2, 0x2560, 0x2586, 0x27d1, 0xb08a, 0xbd4f, 0xa6ca, 0xa6c2, 0xa4bd, 0xa456, 0xa499, 0xa411, 0x9eb8, 0xa5be, 0x1e25, 0xa3b3, 0xa624, 0xa6c2, 0xa56d, 0xa5eb, 0x26a3, 0xa6bb, 0xa181, 0xa453, 0x2570, 0xcf57, 0xa6a2, 0xd2cf, 0xd271, 0xa631, 0x256e, 0x2699, 0xef67, 0x26f2, 0x26f4, 0xa70d, 0x26de, 0x26ec, 0x2efb, 0x2efd, 0x5ff4, 0xe025, 0xa6e0, 0x9e96, 0x26d8, 0x26ec, 0x2efb, 0x2efd, 0x5ff4, 0xe025, 0xe856, 0xa6d9, 0x26e3, 0x2718, 0xccf0, 0x26e2, 0x2718, 0xccf0, 0x3df5, 0x3e0a, 0xbe15, 0xa18f, 0xa6f1, 0x26d8, 0x26de, 0x2efb, 0x2efd, 0x5ff4, 0xe025, 0x2213, 0x2712, 0xd597, 0x26f6, 0x26fb, 0x26fd, 0x2700, 0xa70b, 0xc74f, 0xa6ea, 0x26d7, 0x26f4, 0xa70d, 0x26fe, 0x2716, 0xa717, 0x26d7, 0x26f2, 0xa70d, 0xa707, 0x26ef, 0x26fb, 0x26fd, 0x2700, 0xa70b, 0xb5e5, 0x26ef, 0x26f6, 0x26fd, 0x2700, 0xa70b, 0x26ef, 0x26f6, 0x26fb, 0x2700, 0xa70b, 0x26f3, 0x2716, 0xa717, 0x26ef, 0x26f6, 0x26fb, 0x26fd, 0xa70b, 0xa711, 0x2186, 0x270e, 0xa713, 0xa6f5, 0xa70f, 0x26ef, 0x26f6, 0x26fb, 0x26fd, 0xa700, 0x26d7, 0x26f2, 0xa6f4, 0x2186, 0x2706, 0xa713, 0xa708, 0xa703, 0x26ed, 0xd597, 0x2186, 0x2706, 0xa70e, 0x26f3, 0x26fe, 0xa717, 0x26f3, 0x26fe, 0xa716, 0x26e2, 0xa6e3, 0x383e, 0xbb12, 0xa721, 0xa71f, 0x453a, 0xc53c, 0xd056, 0x238b, 0xa8d3, 0xb257, 0xb747, 0xc3ea, 0x2754, 0x27ca, 0xadb3, 0xa8d9, 0x2834, 0xa872, 0x3b7e, 0x3b7f, 0x3b81, 0xbca1, 0xe62f, 0x2c85, 0xe62a, 0x276f, 0x28ca, 0x28de, 0xe62b, 0xaea7, 0xe62c, 0xa78b, 0x2730, 0x27ca, 0xadb3, 0x21f7, 0x284a, 0xa8a4, 0xade0, 0xa805, 0x28b0, 0x28b5, 0x28c7, 0x28dc, 0x4f48, 0xcf4e, 0xa8e2, 0x27bb, 0xa8e9, 0x2862, 0xe696, 0x28b3, 0xe6ab, 0x289c, 0xc908, 0xa802, 0xa803, 0xb1bb, 0xa88c, 0x6640, 0xe641, 0xbce5, 0x23f0, 0xd1fa, 0x274f, 0xe62b, 0xa7a7, 0xa787, 0x1e18, 0x9e20, 0xa7a2, 0xa8a2, 0xa7c0, 0xa8df, 0xa8e0, 0xa8da, 0xa773, 0xa753, 0x2841, 0xa8d8, 0xc561, 0xe67b, 0xa39a, 0xa806, 0x282f, 0x2c27, 0xac2d, 0xa79c, 0xa79b, 0xa8a2, 0xa778, 0xa8be, 0xa770, 0xab88, 0x280a, 0xd056, 0xa88a, 0xa7e1, 0xa8b6, 0xa8cb, 0xa84f, 0xa816, 0x275d, 0xa8e9, 0xa782, 0xc86e, 0xe656, 0x2730, 0x2754, 0xadb3, 0x24f2, 0x2560, 0x2586, 0x269e, 0xb08a, 0xa7d3, 0xa7d2, 0xa852, 0x2864, 0xa8ce, 0xa81d, 0x28c4, 0xe1ce, 0x2824, 0xe684, 0xa7ad, 0xc897, 0xb267, 0x2d0e, 0x2d5c, 0xc895, 0xb383, 0xa763, 0xa764, 0xa75a, 0xa796, 0xd3eb, 0xa7a9, 0xa879, 0x28ae, 0xa8af, 0xa7b4, 0xe67b, 0xa7da, 0x27de, 0xe684, 0x6636, 0xe68e, 0x279a, 0x2c27, 0xac2d, 0x2895, 0xe681, 0xb2a5, 0x273a, 0xa872, 0x454c, 0xc54d, 0x2792, 0xa8d8, 0xa8ea, 0x21f7, 0x2757, 0xa8a4, 0xd314, 0xc57b, 0xa7b2, 0xa851, 0xa850, 0xa7d8, 0xa896, 0xbd82, 0xa8a7, 0xa1a2, 0xd46c, 0xa86b, 0xa75e, 0x27d9, 0xa8ce, 0xe663, 0x46d0, 0xee7d, 0xa861, 0x273a, 0xa834, 0xac18, 0x2364, 0xee75, 0x2811, 0xa8cd, 0x450e, 0x4816, 0xc8da, 0xc245, 0xa7ab, 0xa767, 0x2830, 0xe681, 0xa854, 0xa89e, 0x28bb, 0xc246, 0x2760, 0xc908, 0xa897, 0x277a, 0xa7a1, 0x21f7, 0x2757, 0xa84a, 0xa859, 0x2815, 0xa8af, 0x2815, 0xa8ae, 0x275b, 0x28b5, 0x28dc, 0x4f48, 0xcf4e, 0x275f, 0xe6ab, 0x275b, 0x28b0, 0x28dc, 0x4f48, 0xcf4e, 0xa7af, 0xde87, 0xa899, 0xa7a6, 0x27dc, 0xe1ce, 0xa75b, 0x274f, 0xa8de, 0xa7b1, 0xa8e4, 0xa879, 0x27d9, 0xa864, 0xc4bd, 0x238b, 0xa727, 0x2792, 0xa841, 0xa739, 0xa786, 0x275b, 0x28b0, 0x28b5, 0x4f48, 0xcf4e, 0x274f, 0xa8ca, 0xa784, 0xa785, 0x23e1, 0xc77f, 0xa75c, 0xa8cc, 0x2398, 0x2edb, 0xe13d, 0x275d, 0xa7bb, 0xa846, 0x28ef, 0xa8f5, 0x28ee, 0xa8f5, 0xd072, 0xa8f9, 0x2356, 0xdce3, 0x3bbb, 0xbbbc, 0x28ee, 0xa8ef, 0x28f7, 0xa8fa, 0x28f6, 0xa8fa, 0xa8fc, 0xa8f1, 0x28f6, 0xa8f7, 0x2a7f, 0xd05f, 0xa8f8, 0x2900, 0xabff, 0x28fd, 0xabff, 0xa90a, 0x21e6, 0xd655, 0xe64d, 0x1ffb, 0x2079, 0x2099, 0xa0c3, 0x23d8, 0xdb8a, 0xa902, 0x2fa9, 0x5907, 0xd986, 0xa913, 0xa90f, 0xd641, 0x236f, 0xb23c, 0xa91b, 0xa91a, 0x9eb1, 0xa920, 0xa91f, 0x2923, 0xb8a6, 0x2922, 0xb8a6, 0x9f19, 0x2172, 0x6754, 0xe75d, 0xa3cf, 0xbb80, 0x372c, 0xb94d, 0xbcf0, 0xe82d, 0xbbd4, 0xda87, 0xa93e, 0xa96a, 0xa939, 0x2332, 0x2333, 0xa969, 0xa950, 0xcad2, 0xb7f0, 0xa96e, 0xeede, 0xa942, 0x4287, 0xe029, 0x2968, 0x296c, 0xc34e, 0xaf09, 0xc55a, 0x2967, 0xadb4, 0x2965, 0xadb4, 0x2956, 0x296c, 0xc34e, 0x2332, 0x2333, 0xa941, 0xa93a, 0x2956, 0x2968, 0xc34e, 0xa94b, 0x29b3, 0xab2d, 0x29e6, 0xa9e7, 0x299d, 0x2a24, 0x4ca7, 0xccda, 0x2a66, 0xaa8d, 0xaabd, 0xa9d9, 0x29f8, 0xd505, 0xa9ac, 0xc945, 0xc385, 0xaab8, 0x2986, 0x2a24, 0x4ca7, 0xccda, 0xaaf5, 0xaad7, 0x2aaf, 0xab00, 0xa992, 0x1f60, 0x2976, 0xab2d, 0x1f84, 0xa9ea, 0x2a3f, 0xaa40, 0xaa12, 0xa9ca, 0xa9c9, 0x1e68, 0xa158, 0xa9d7, 0xaa8e, 0xaa30, 0xa9cd, 0xa98a, 0xd591, 0xaa1f, 0x2978, 0xa9e7, 0x2978, 0xa9e6, 0x1f84, 0xa9b7, 0xa9ec, 0xa9eb, 0xaae6, 0x298d, 0xd505, 0xaa63, 0xaa41, 0xaa6d, 0xab08, 0xab0c, 0xab4c, 0xa9c6, 0x2b22, 0xab43, 0x2a2f, 0xaa31, 0xa9e2, 0x2986, 0x299d, 0x4ca7, 0xccda, 0xab2a, 0xab09, 0x2a1b, 0xaa31, 0xa9d2, 0x2a1b, 0xaa2f, 0xaaa7, 0x2afa, 0xaafb, 0x29b8, 0xaa40, 0x29b8, 0x2a3f, 0xaa50, 0xaa04, 0xaa40, 0xa9fb, 0x2987, 0xaa8d, 0xbdeb, 0xaa05, 0x1e3d, 0xee97, 0xaaff, 0x2b30, 0x2b46, 0xab7e, 0xab0b, 0xab38, 0x28fb, 0xd05f, 0x2987, 0xaa66, 0xa9d0, 0xaa32, 0xaabc, 0xab03, 0x29ab, 0xab00, 0xa99b, 0xaaaa, 0xa988, 0x3127, 0xd06d, 0x2b1d, 0xd885, 0xab32, 0xab21, 0xab2a, 0xa9aa, 0xa9ee, 0xab19, 0xa9a9, 0x3194, 0xc644, 0x2a34, 0xaafb, 0x2a34, 0xaafa, 0xaa73, 0x29ab, 0xaaaf, 0xaaad, 0xaa06, 0xaa2d, 0xaa75, 0xaa07, 0xaaf1, 0x2acb, 0xd885, 0xaad2, 0x2a18, 0xab43, 0xab37, 0x2a26, 0xaad4, 0x2976, 0xa9b3, 0x2a74, 0x2b46, 0xab7e, 0xaad0, 0xab24, 0xaa76, 0xb1d2, 0x2a18, 0xab22, 0x2a74, 0x2b30, 0xab7e, 0xaa08, 0xab53, 0xab52, 0xab6b, 0xa5e3, 0x2b78, 0x3569, 0x3585, 0x3586, 0xb588, 0xab7f, 0xab59, 0x2b66, 0x3569, 0x3585, 0x3586, 0xb588, 0xab7d, 0xab7c, 0x2a74, 0x2b30, 0xab46, 0xab6a, 0x2bcd, 0x2bd5, 0x2bd7, 0x2bdc, 0x2be7, 0xc52f, 0xa197, 0x4260, 0x5675, 0xd6c7, 0xca79, 0xa7a8, 0xca81, 0xd089, 0x219d, 0xab9c, 0x219d, 0xab90, 0x2bda, 0x2bf3, 0x2bf6, 0xc3e4, 0x2b9f, 0xabe6, 0x2b9e, 0xabe6, 0xabf5, 0x2bb7, 0xabe9, 0xac4e, 0xb1b2, 0xabae, 0xabab, 0x5b8c, 0xe1bc, 0xa0a2, 0x2ba1, 0xabe9, 0xabc6, 0x21a6, 0xabc7, 0x2bdb, 0xabec, 0x5cd3, 0xdcd4, 0xe1c7, 0xa1a4, 0xabbb, 0x21a6, 0xabbc, 0x6751, 0xe752, 0x66ba, 0x674d, 0x674e, 0x674f, 0x6db4, 0x6e16, 0xee64, 0xa1a8, 0x2b81, 0x2bd5, 0x2bd7, 0x2bdc, 0x2be7, 0xc52f, 0xaebd, 0x2b81, 0x2bcd, 0x2bd7, 0x2bdc, 0x2be7, 0xc52f, 0x2b81, 0x2bcd, 0x2bd5, 0x2bdc, 0x2be7, 0xc52f, 0x2b9d, 0x2bf3, 0x2bf6, 0xc3e4, 0x2bbd, 0xabec, 0x2b81, 0x2bcd, 0x2bd5, 0x2bd7, 0x2be7, 0xc52f, 0xabe2, 0xda67, 0x4aad, 0xcab6, 0xabdd, 0x2b9e, 0xab9f, 0x2b81, 0x2bcd, 0x2bd5, 0x2bd7, 0x2bdc, 0xc52f, 0x2ba1, 0xabb7, 0x2199, 0xa1a9, 0x2bbd, 0xabdb, 0x2b9d, 0x2bda, 0x2bf6, 0xc3e4, 0xaba0, 0x2b9d, 0x2bda, 0x2bf3, 0xc3e4, 0x2bfe, 0xac0d, 0xac0b, 0xac0e, 0x2bf9, 0xac0d, 0x28fd, 0xa900, 0x1e13, 0xac08, 0x214b, 0x224b, 0xa2ca, 0xac07, 0xac06, 0x1e13, 0xac02, 0xa3de, 0xabfb, 0x2bf9, 0xabfe, 0xabfc, 0x2c13, 0x2c14, 0xc23e, 0x2c12, 0x2c14, 0xc23e, 0x2c12, 0x2c13, 0xc23e, 0xa875, 0xac1a, 0xac19, 0x1e48, 0x2e85, 0x6ebc, 0xeebd, 0x2617, 0x2690, 0xc51e, 0xc1ce, 0x2c20, 0x5d7b, 0x6bae, 0x6c7b, 0xec9c, 0x2c1f, 0x5d7b, 0x6bae, 0x6c7b, 0xec9c, 0x2c23, 0x2c24, 0xb023, 0xac22, 0x2c22, 0xb023, 0xac26, 0xac25, 0x279a, 0x282f, 0xac2d, 0xac2b, 0xac29, 0xeb40, 0x279a, 0x282f, 0xac27, 0x21f2, 0x2c34, 0x2c36, 0x2c37, 0xeb50, 0x21f2, 0x2c32, 0x2c36, 0x2c37, 0xeb50, 0x21f2, 0x2c32, 0x2c34, 0x2c37, 0xeb50, 0x21f2, 0x2c32, 0x2c34, 0x2c36, 0xeb50, 0xac4d, 0x1fad, 0x2118, 0xc6e1, 0x1fb7, 0xddfc, 0xac64, 0xac53, 0xa1e5, 0xac4a, 0xac46, 0x6ce5, 0xee1f, 0xac38, 0xaba9, 0x2c5b, 0xae48, 0xac43, 0x2c4f, 0xae48, 0xac6c, 0xac62, 0xac61, 0xac42, 0xac68, 0xac66, 0xac5e, 0xadbc, 0xa1fa, 0x1e97, 0x2d57, 0x3b72, 0xbb73, 0xdc48, 0x2742, 0xe62a, 0xdc3a, 0xad87, 0xad17, 0xacf4, 0xad50, 0x2cf6, 0x2d8b, 0x2d8c, 0x2db9, 0x6666, 0x669d, 0xe6af, 0xa188, 0x2d52, 0x2d53, 0x2dcc, 0x2dd6, 0x2dd7, 0xc89e, 0xadba, 0xadbd, 0xad87, 0xad2c, 0xadcb, 0xada8, 0xada7, 0xacdd, 0xacd2, 0xacfd, 0xada2, 0xada0, 0xad22, 0xadd2, 0xace9, 0xace8, 0xacf0, 0xacef, 0xac98, 0x2d58, 0x2db8, 0xadc6, 0x2c9b, 0x2d8b, 0x2d8c, 0x2db9, 0x6666, 0x669d, 0xe6af, 0xace1, 0xad97, 0xad0d, 0xadae, 0xad08, 0xad07, 0x234e, 0xd3ef, 0xad03, 0x27fc, 0x2d5c, 0xc895, 0xa393, 0xac97, 0x1ed1, 0xad19, 0x1ed1, 0xad18, 0xace5, 0xacbd, 0x2d83, 0xad84, 0xcbcf, 0xac9a, 0x2ca9, 0x2d53, 0xc89e, 0x2ca9, 0x2d52, 0xc89e, 0x1e97, 0x2c81, 0x3b72, 0xbb73, 0x2cf5, 0x2db8, 0xadc6, 0xad94, 0x27fc, 0x2d0e, 0xc895, 0xad81, 0x3e13, 0xbeaa, 0xad73, 0xad6f, 0xad5d, 0xad2d, 0xad2d, 0x2c96, 0xacb4, 0x2c9b, 0x2cf6, 0x2d8c, 0x2db9, 0x6666, 0x669d, 0xe6af, 0x2c9b, 0x2cf6, 0x2d8b, 0x2db9, 0x6666, 0x669d, 0xe6af, 0xad5a, 0xad02, 0xace4, 0xace3, 0xacc4, 0xacc3, 0xad04, 0xe6df, 0x2730, 0x2754, 0xa7ca, 0x2965, 0xa967, 0x2cf5, 0x2d58, 0xadc6, 0x2c9b, 0x2cf6, 0x2d8b, 0x2d8c, 0x6666, 0x669d, 0xe6af, 0xacad, 0xac7f, 0xacb3, 0x2dd3, 0xadd4, 0x2cf5, 0x2d58, 0xadb8, 0xacbf, 0x2ca9, 0x2dd6, 0xadd7, 0xace6, 0xadc5, 0xadc5, 0x2ca9, 0x2dcc, 0xadd7, 0x2ca9, 0x2dcc, 0xadd6, 0xaddd, 0xaddb, 0xa759, 0xade3, 0xade2, 0xe78f, 0xadf0, 0xadef, 0xa36e, 0xd856, 0xadfd, 0x2377, 0xb372, 0xadfa, 0x67cd, 0xe7e8, 0x231d, 0xdfca, 0x2370, 0x2e63, 0xae64, 0x9f48, 0xae25, 0xae2b, 0xcd19, 0xae43, 0xae33, 0x9f16, 0xd88b, 0xcd48, 0xcc3e, 0xcb92, 0x2e5f, 0xb5d8, 0xae05, 0x2e2f, 0xae36, 0xae40, 0xae08, 0xd4c6, 0x2e47, 0x2e5a, 0xae6b, 0x2e26, 0xae36, 0x2f52, 0x3b78, 0xc688, 0xae6c, 0xae10, 0x2e26, 0xae2f, 0xae58, 0xae57, 0xa183, 0xae27, 0x21aa, 0xcf83, 0xae0f, 0x2e2e, 0x2e5a, 0xae6b, 0x2c4f, 0xac5b, 0xce28, 0xae3c, 0xae3b, 0x2e2e, 0x2e47, 0xae6b, 0x2e1c, 0xb5d8, 0xb5d9, 0x2e01, 0xae64, 0x2e01, 0xae63, 0x2e2e, 0x2e47, 0xae5a, 0xae31, 0x1e7e, 0x2e79, 0xb9a6, 0xc9ca, 0x1e26, 0x1f75, 0x2002, 0x20a1, 0x2e77, 0xcadd, 0xae76, 0xa016, 0x2e72, 0xb9a6, 0x9e48, 0xa1e0, 0x2e83, 0x2eb5, 0xaee3, 0x2ef0, 0xaef3, 0x2e7f, 0xaee3, 0x5358, 0xd38a, 0x1e48, 0x2c1b, 0x6ebc, 0xeebd, 0xb176, 0xc240, 0xaeec, 0xaee1, 0xaeab, 0x2fdc, 0xb1c9, 0xaedf, 0xef90, 0x2ec3, 0xaee2, 0xa750, 0xae93, 0x2e7f, 0x53f4, 0x544a, 0xd4ed, 0xaebb, 0x377e, 0x3780, 0x37a9, 0x37d7, 0xb8a5, 0xaeb6, 0xaece, 0xabd3, 0xaedf, 0x2395, 0xa3a0, 0xa3a2, 0x2e9f, 0xaee2, 0xa3a6, 0xaebc, 0x23a9, 0xaed0, 0x23a9, 0xaecf, 0xa3a8, 0x2398, 0x28e5, 0xe13d, 0xa3ae, 0x2e99, 0xaebf, 0x2382, 0xa3b0, 0xae91, 0x2e9f, 0xaec3, 0x2e7f, 0xae83, 0xaeea, 0xaee9, 0xae90, 0x2385, 0x2e81, 0xaef3, 0x2385, 0x239b, 0x2e81, 0xaef0, 0xdfea, 0x26d8, 0x26de, 0x26ec, 0x2efd, 0x5ff4, 0xe025, 0x1e43, 0xdffa, 0x26d8, 0x26de, 0x26ec, 0x2efb, 0x5ff4, 0xe025, 0xe58b, 0x44e3, 0x598d, 0x5fa1, 0x5fa7, 0x5fa8, 0x5fa9, 0xdfaf, 0xc570, 0xb8c4, 0x330a, 0xb335, 0xa958, 0x9e00, 0x9e8c, 0x1e09, 0xa3c1, 0x5cae, 0x5cb3, 0xdd30, 0xaf12, 0xaf11, 0xa40a, 0xaf35, 0x2f4c, 0xc030, 0xcd43, 0xaf33, 0xaf4e, 0xaf2a, 0xaf20, 0xaf3a, 0x2f3e, 0xaf48, 0xaf37, 0xaf3c, 0xaf3b, 0x2f39, 0xaf48, 0xa22b, 0x2f39, 0xaf3e, 0xaf25, 0xaf2f, 0xaf51, 0xaf50, 0x2e30, 0x3b78, 0xc688, 0x2679, 0xc576, 0xaf55, 0x2f54, 0x6304, 0xe332, 0xcbf2, 0x2f5a, 0xbc47, 0x2f59, 0xbc47, 0x2f5c, 0x2f5d, 0xaf5e, 0x2f5b, 0x2f5d, 0xaf5e, 0x2f5b, 0x2f5c, 0xaf5e, 0x2f5b, 0x2f5c, 0xaf5d, 0xaf60, 0x2f5f, 0xd4a6, 0xaf66, 0xaf65, 0xaf72, 0xcdb5, 0xe6d5, 0x1efd, 0xb58c, 0xaf68, 0x9ee2, 0x1eff, 0x2fac, 0xeae3, 0xafb9, 0x1f5b, 0xeaf4, 0x2f83, 0xdfec, 0x2fb0, 0x2fb4, 0xafb5, 0xaf80, 0x2f91, 0x5ff3, 0xe015, 0xc2e5, 0x9f77, 0x9f6a, 0xa40e, 0xe65f, 0x2f84, 0x5ff3, 0xe015, 0x1ece, 0xaf9e, 0x22d1, 0xafa0, 0x1ece, 0xaf93, 0x22d1, 0xaf95, 0xc9a6, 0x201f, 0xd5c9, 0xa065, 0x290d, 0xd986, 0x1eff, 0x208d, 0xaf77, 0xa09c, 0xaf81, 0xa0c4, 0x2fb7, 0x3074, 0xb0b3, 0x2f81, 0xafb5, 0x2f81, 0xafb4, 0x2fb3, 0x3074, 0xb0b3, 0xaf7b, 0xafc4, 0xafc3, 0xb1b6, 0x9ec1, 0x31f4, 0xb1fa, 0xda8c, 0xb07e, 0x2e94, 0xb1c9, 0xb09f, 0xb025, 0xb182, 0x2306, 0x3031, 0xb0a4, 0xb0b4, 0xa538, 0xb13e, 0x31d0, 0xb1f7, 0xb14b, 0xb16b, 0xb1ae, 0xb16a, 0xb0b5, 0xb134, 0x9f42, 0xb091, 0xb190, 0xb056, 0x2c22, 0xac24, 0xafe3, 0xb060, 0x2306, 0x2fe9, 0xb0a4, 0x30e3, 0x3374, 0x4dcf, 0x4deb, 0xce3d, 0xb1df, 0xb1cc, 0xb052, 0xb200, 0xb046, 0x21c4, 0xb0bd, 0xb01d, 0xb02a, 0x241d, 0xb08b, 0x2379, 0xdcc9, 0xd03b, 0xb119, 0x3085, 0xb0a6, 0xb1c7, 0x2fb3, 0x2fb7, 0xb0b3, 0xb0e0, 0x20eb, 0x2641, 0x30aa, 0xb0e1, 0xb15f, 0xb1e8, 0xb137, 0xb0fb, 0x30a9, 0xb0f1, 0xb0f2, 0xafd9, 0x30e5, 0xb142, 0x3111, 0xb139, 0x3071, 0xb0a6, 0x24f2, 0x2560, 0x2586, 0x269e, 0xa7d1, 0xb061, 0xc302, 0xb016, 0x9fd4, 0x3102, 0xda96, 0xdbef, 0xafe2, 0xb0ca, 0x2306, 0x2fe9, 0xb031, 0x3071, 0xb085, 0x307c, 0xb0f1, 0x20eb, 0x3076, 0xb0e1, 0xb164, 0xb1f8, 0xb173, 0xb1ab, 0x2fb3, 0x2fb7, 0xb074, 0xaff0, 0xb005, 0xe5f7, 0x21c4, 0xb053, 0x30a2, 0xea5a, 0x248a, 0x248c, 0xefa2, 0x1ffd, 0xbb23, 0xb075, 0x20eb, 0x3076, 0xb0aa, 0xb03b, 0x307f, 0xb142, 0xb1fc, 0xb158, 0xb1f2, 0xb18a, 0xb11c, 0x3159, 0xb15a, 0xb19a, 0xb163, 0x307c, 0xb0a9, 0xb07d, 0xd822, 0xb07b, 0xd90a, 0x3096, 0xda96, 0x4609, 0xc652, 0x3080, 0xb139, 0xb06a, 0xc231, 0xb0ec, 0xb14d, 0xb181, 0xb1a4, 0xb192, 0x2abf, 0xd06d, 0xb1fc, 0xb006, 0xb07a, 0x3080, 0xb111, 0xb14e, 0xa35a, 0xaffe, 0xe858, 0x307f, 0xb0e5, 0xb817, 0xbbb7, 0xb001, 0xb120, 0x313c, 0x361a, 0xc718, 0x3174, 0xb1fe, 0xb0e8, 0x30ed, 0xb15a, 0x30ed, 0xb159, 0x3078, 0xb185, 0xb0ef, 0xb0ab, 0xb004, 0xb002, 0xb196, 0xd651, 0xb0ad, 0xb151, 0xae86, 0x317d, 0xb21a, 0x317c, 0xb21a, 0xbb32, 0x21ed, 0x21f4, 0xb191, 0xb121, 0xafe7, 0xb15f, 0xb1a9, 0xb0eb, 0xb01c, 0x21ed, 0x21f4, 0xb17f, 0xb126, 0x2af6, 0xc644, 0x316d, 0xb197, 0xb196, 0x259c, 0x3199, 0xbb56, 0x259c, 0x3198, 0xbb56, 0xb0ee, 0xb124, 0x22b3, 0x22b4, 0xa2de, 0xb187, 0xb0af, 0xb003, 0xabaa, 0xafc6, 0xa766, 0xa2e4, 0xb073, 0x2e94, 0xafdc, 0xb03f, 0xb1d4, 0x3000, 0xb1f7, 0xb1e3, 0x2b3e, 0xb1f6, 0xb1cd, 0xb1f5, 0xd499, 0xb03c, 0xb1d1, 0xb1e7, 0xb1e6, 0xb079, 0xb0e9, 0x2fcf, 0xb1ff, 0xb1dc, 0xb1d2, 0x3000, 0xb1d0, 0xb0ac, 0xafcf, 0x30e7, 0xb133, 0xbb22, 0xb151, 0xb1f4, 0xb04b, 0xb207, 0xb206, 0xb214, 0x322f, 0xb232, 0xb20b, 0xb227, 0x3226, 0xb230, 0x317c, 0xb17d, 0xb21e, 0x5ca1, 0xdd22, 0xb21b, 0x3218, 0xb230, 0xb217, 0xb22c, 0xb229, 0x2279, 0xa2e0, 0x320f, 0xb232, 0x3218, 0xb226, 0x320f, 0xb22f, 0x3237, 0xb238, 0x3236, 0xb238, 0x3236, 0xb237, 0xa384, 0xb23e, 0x236f, 0xa918, 0xb23b, 0xb24c, 0xb24b, 0xce94, 0x33e0, 0xcd2e, 0x34b2, 0xb4c8, 0xb2c2, 0xa728, 0x5a17, 0xdbac, 0xb34d, 0xb268, 0xe1e6, 0xa7f7, 0x23c9, 0xb260, 0x32e1, 0xb4f4, 0xb36b, 0xb383, 0xb3da, 0xb4a6, 0xb4fe, 0xb5bc, 0x2448, 0xc2c2, 0xa214, 0xb4ab, 0xb2cb, 0xb2d4, 0xb2d7, 0x32e9, 0xb4c7, 0xb476, 0xb473, 0xb384, 0xb436, 0xdb77, 0xa831, 0xb4e1, 0x32de, 0x4274, 0xd9dd, 0xb255, 0xb4d4, 0xb49a, 0xb29b, 0xb2ff, 0x37b4, 0xb7fa, 0xb428, 0xb29c, 0xb2d6, 0xb2d5, 0xb29d, 0xb2dd, 0xb2dc, 0xb2b5, 0xb4ec, 0x336e, 0xb4da, 0x3269, 0x3304, 0xb4f4, 0xb50f, 0xb3c0, 0xb4c1, 0xb514, 0xb4f0, 0x34a5, 0xc67a, 0x329e, 0xb4c7, 0xb2cf, 0xb39b, 0x32e1, 0xb4f4, 0x2f04, 0xb335, 0x1e3e, 0x34e7, 0xd209, 0xb46f, 0xb523, 0xb397, 0xb4be, 0xb4bb, 0xb33e, 0xb493, 0xb4cb, 0xb49f, 0xb399, 0xb4e0, 0xb3ee, 0xb48f, 0x2f04, 0xb30a, 0xb412, 0xdf13, 0xb31f, 0xb3d2, 0x3405, 0x34b9, 0xb52a, 0x38b1, 0x4975, 0xcd91, 0xb25e, 0xb3d1, 0xd379, 0xb41c, 0xb488, 0xb40d, 0xb4bf, 0xb3db, 0x3417, 0xb4e3, 0xd20d, 0xb26a, 0x32e0, 0xb4da, 0x2377, 0xadfb, 0xb03b, 0x3816, 0xb8f2, 0x27fd, 0xb26b, 0xb2a1, 0xb31c, 0xb323, 0xb302, 0xe1c7, 0xb4d1, 0xa30a, 0xb3ed, 0xb4c4, 0xb451, 0xb4f2, 0xb4a3, 0xb47b, 0xb414, 0xb45c, 0xc8b0, 0xb2e3, 0xb34f, 0xb33f, 0xb26c, 0xb362, 0xb24e, 0xb3b2, 0xb325, 0xd0cc, 0x3416, 0xb447, 0xb52c, 0xb4b3, 0xb519, 0xb4f1, 0xb45f, 0xce3d, 0x3341, 0x34b9, 0xb52a, 0xb784, 0xb35f, 0xb337, 0xb3bb, 0x33fa, 0xb447, 0xb363, 0x335c, 0xd490, 0xb2d3, 0xb498, 0xb528, 0xb2a2, 0x34d5, 0xb51c, 0xb9a8, 0x3444, 0xb51d, 0x3442, 0xb51d, 0xb504, 0x34fa, 0xd96c, 0x33fa, 0xb416, 0xb4ef, 0xb524, 0xb3b4, 0xb3bc, 0xb402, 0x4dcf, 0x4deb, 0xce3d, 0xb4f5, 0xb31a, 0xb2a0, 0xb29f, 0xb3ba, 0x21fb, 0xb4ca, 0xb516, 0xb35e, 0xb326, 0xb491, 0xb490, 0xb320, 0xb42d, 0xb2c8, 0xb322, 0xb4cd, 0xb3b8, 0x32e8, 0xc67a, 0xb26f, 0x4d55, 0x4d76, 0xcedd, 0xb29a, 0x3251, 0xb4c8, 0xb3ff, 0xb506, 0xb4f7, 0xb4fc, 0x3341, 0x3405, 0xb52a, 0xb51b, 0xb31e, 0xb31d, 0xb361, 0xb2e5, 0xb3b3, 0x329e, 0xb2e9, 0x3251, 0xb4b2, 0x21fb, 0xb483, 0xb321, 0xb4a1, 0xb3a5, 0xb2c5, 0x343a, 0xb51c, 0x32e0, 0xb36e, 0xb4fb, 0xb324, 0xb2ac, 0xb363, 0xb52c, 0x1e3e, 0x3319, 0xd209, 0xb2df, 0xb448, 0xb2e7, 0xb401, 0xb3b7, 0x3269, 0x32e1, 0xb304, 0xb469, 0x34b7, 0xd96d, 0xb446, 0xb4de, 0xb4b8, 0xb50a, 0xb270, 0x9e51, 0xb445, 0xb522, 0xb4b5, 0xb51f, 0xb4fd, 0xb2e2, 0xb522, 0xb2e6, 0xb484, 0xb400, 0xb4ba, 0x343a, 0xb4d5, 0x3442, 0xb444, 0xb508, 0x3505, 0xb512, 0xb31b, 0xb44a, 0xb432, 0x3341, 0x3405, 0xb4b9, 0xc234, 0x33fd, 0xb4e5, 0xb535, 0xb534, 0xa3ce, 0xd003, 0x4b27, 0x4b56, 0x4b5e, 0xcba3, 0x1ff2, 0x209a, 0xa2b9, 0x9f8e, 0xb575, 0x23d9, 0xb558, 0xb559, 0xa2c4, 0x22c5, 0xa2d1, 0x5d01, 0xdd25, 0x23d9, 0xb54d, 0xb54e, 0x3582, 0xbb5b, 0xa0d8, 0x2b66, 0x2b78, 0x3585, 0x3586, 0xb588, 0xb578, 0xb54c, 0xb5c9, 0xb570, 0x69c6, 0x69c8, 0x6a45, 0xea71, 0xbb5d, 0x355b, 0xbb5b, 0xbbd9, 0x2b66, 0x2b78, 0x3569, 0x3586, 0xb588, 0x2b66, 0x2b78, 0x3569, 0x3585, 0xb588, 0x2b66, 0x2b78, 0x3569, 0x3585, 0xb586, 0x1e9d, 0x358a, 0x6f4a, 0xef50, 0x1e9d, 0x3589, 0x6f4a, 0xef50, 0x358e, 0xef4b, 0x1efd, 0xaf6c, 0xd9ba, 0x358b, 0xef4b, 0xb595, 0x359e, 0xd7a4, 0xb593, 0x65d8, 0x6b25, 0x6b26, 0x6b2a, 0xeb2d, 0x3594, 0xd7a4, 0xe159, 0xb5ac, 0xb5a9, 0xb5b7, 0xb5b5, 0xb5b2, 0xb5ad, 0x1e8e, 0x1e8f, 0xb275, 0xb5d2, 0xb577, 0xb5c8, 0x4c31, 0xcc4f, 0x2e1c, 0xae5f, 0x2e61, 0xb5db, 0xb5d9, 0xc121, 0xa6f8, 0xd20a, 0x234f, 0x2354, 0xa3f6, 0x35f9, 0xb642, 0x2164, 0x363f, 0xb6e0, 0xb698, 0x35f6, 0xb642, 0xb680, 0xb625, 0xb664, 0xb63b, 0x2347, 0xb6fb, 0xb626, 0xb719, 0xb62c, 0xb6c7, 0xb14e, 0xc6a8, 0xb5fe, 0xb60a, 0xb60f, 0xc0a4, 0xb630, 0xb62f, 0xa1ac, 0xb602, 0x365d, 0xb6f8, 0xb6e8, 0x6855, 0xe86f, 0x35f7, 0xb6e0, 0x35f6, 0xb5f9, 0xb644, 0xb643, 0xb64b, 0xb649, 0xb6ec, 0x3681, 0xb6c9, 0xb6c4, 0xb688, 0xb689, 0xb669, 0x363c, 0xb6f8, 0xb660, 0xb65f, 0xb5ff, 0xb6df, 0xb65a, 0xb69c, 0x3692, 0xc520, 0xb697, 0xb5fa, 0x3653, 0xb6c9, 0xb6ab, 0x4f6a, 0xdfa0, 0xb655, 0xb656, 0xb674, 0x4156, 0xc157, 0x367b, 0x5af3, 0x5c19, 0x65c7, 0xe68c, 0xb5f8, 0xb66e, 0xc545, 0x36ad, 0x36cd, 0xc6a5, 0x2386, 0x23af, 0xb6c6, 0xb6d6, 0xb6c1, 0xb682, 0x36a4, 0xc6a5, 0x1e86, 0xc7ad, 0xb6a8, 0xb654, 0x2386, 0x23a4, 0x23af, 0xb6a6, 0xb619, 0x3653, 0xb681, 0x40a4, 0x4167, 0x41f3, 0xc7be, 0xb6a4, 0xa411, 0xb6a7, 0xb668, 0x35f7, 0xb63f, 0xb63d, 0xb652, 0x3d40, 0x4cac, 0x6eaf, 0x6eb4, 0xeeb9, 0xb6f5, 0xb6f3, 0x1e66, 0x363c, 0xb65d, 0xb6fa, 0xb6f9, 0x2347, 0xb607, 0xb6fe, 0xb6fd, 0xa1a3, 0x22d6, 0xa2d7, 0x9f1a, 0xd8e8, 0xb717, 0xb716, 0xb60e, 0xb722, 0xb71f, 0xb71e, 0xb71b, 0xd0e7, 0x2932, 0xb94d, 0xa273, 0xb72f, 0x372e, 0xd853, 0xc843, 0x3a38, 0xba8f, 0xb736, 0xb735, 0x21e0, 0xba5f, 0xbbba, 0x594d, 0x66d1, 0xe6dc, 0x3a29, 0xbb0a, 0xb87f, 0xa72c, 0x3766, 0x3919, 0xba86, 0xe0a8, 0xb9d3, 0xb89d, 0xb803, 0x9f86, 0xb749, 0xb94a, 0xb9aa, 0x386e, 0xc6c3, 0xa091, 0x9e1c, 0x2eba, 0x3780, 0x37a9, 0x37d7, 0x38a5, 0xeb06, 0xe5c6, 0x2eba, 0x377e, 0x37a9, 0x37d7, 0xb8a5, 0xb975, 0x3406, 0xb9cb, 0xb960, 0x1e2b, 0x3860, 0x390f, 0xb930, 0x5edb, 0x5ef6, 0xdf6d, 0xd3d3, 0xba05, 0xb85d, 0xba1e, 0xb8d7, 0xbaea, 0xb80c, 0xb898, 0xb8d6, 0x2eba, 0x377e, 0x3780, 0x37d7, 0xb8a5, 0x39cd, 0x6397, 0xe453, 0xb953, 0xb89f, 0x23f0, 0x3aaf, 0xd01c, 0x32d0, 0xb7fa, 0xb827, 0xd235, 0xb822, 0xb959, 0x2eba, 0x377e, 0x3780, 0x37a9, 0xb8a5, 0xbac3, 0xbab8, 0xb7fb, 0x231b, 0xb7fe, 0xa948, 0x3801, 0x387a, 0xba6e, 0xb805, 0xb7ff, 0x32d0, 0xb7b4, 0xb7e5, 0xba89, 0x231b, 0xb7e9, 0xb7f9, 0xb894, 0x37f3, 0x387a, 0xba6e, 0x3764, 0xbad4, 0x39ae, 0xd363, 0xb7f5, 0xba19, 0x385f, 0xb8e7, 0xbadb, 0x39de, 0xbaf3, 0xb8df, 0x37a6, 0xbae8, 0x3aaa, 0xbadf, 0x3b04, 0xbb17, 0xba39, 0x337f, 0xb8f2, 0x21d3, 0xb144, 0xa20a, 0xb7cf, 0xb7bb, 0x3a43, 0xcb4f, 0x39d8, 0xba23, 0xd988, 0x271d, 0xbb12, 0xb97f, 0x2353, 0xb9d5, 0xb852, 0xb851, 0xb90e, 0x3a31, 0xbafb, 0xb7a1, 0x3808, 0xb8e7, 0x1e2b, 0x3792, 0xb90f, 0xba48, 0xb968, 0xba94, 0xb9bf, 0x39d7, 0xba4b, 0xba3a, 0xba9c, 0xb9f3, 0xba01, 0xba33, 0x376f, 0xc6c3, 0xba03, 0x37f3, 0x3801, 0xba6e, 0xbf06, 0xb746, 0x3a11, 0xcc17, 0xb9f1, 0x3973, 0xb9d1, 0x4681, 0xc682, 0xb800, 0xb7a7, 0xb761, 0xb7ad, 0x2eba, 0x377e, 0x3780, 0x37a9, 0xb7d7, 0x2922, 0xa923, 0x3346, 0xcd91, 0xbaae, 0xb8f6, 0xb9e4, 0x391c, 0xbaa2, 0xbb1e, 0xaf03, 0x38cb, 0x3ab1, 0x3ac0, 0xc881, 0x38ca, 0x3ab1, 0x3ac0, 0xc881, 0xb936, 0xb7a8, 0xb7a3, 0xb80b, 0xba0a, 0x3808, 0xb85f, 0xca1c, 0x337f, 0xb816, 0xb8be, 0xbac2, 0xc897, 0xb9e8, 0x1e57, 0x9e58, 0xb858, 0x1e2b, 0x3792, 0xb860, 0x47f4, 0xc887, 0xb95a, 0xb749, 0x38c0, 0xbaa2, 0xbadd, 0xb9e7, 0xb9f6, 0xbb0f, 0xba3f, 0xba62, 0xb792, 0xd46e, 0xb8d5, 0xd45a, 0xb768, 0x2932, 0xb72c, 0xb7ab, 0xba62, 0xb7d5, 0xb918, 0xb78f, 0xb986, 0xb966, 0xb965, 0xb862, 0xc243, 0xba9d, 0x9e1a, 0x3885, 0xb9d1, 0xb781, 0xba13, 0x1e50, 0xba02, 0xb842, 0xbb16, 0xb9b2, 0xb961, 0xbaec, 0xbada, 0x3af8, 0xbb05, 0xc253, 0x2e72, 0xae79, 0xb43e, 0xb769, 0x3804, 0xd363, 0xb985, 0xba4a, 0xe198, 0xb864, 0xb9d9, 0x5028, 0xe392, 0xb784, 0xb7aa, 0x3885, 0xb973, 0xb760, 0x39f9, 0xba70, 0x2353, 0xb84c, 0x3865, 0xba4b, 0x3837, 0xba23, 0xb9c7, 0xba9f, 0x3abb, 0xce7f, 0xb80a, 0xbab3, 0xbae7, 0xb8bf, 0xb920, 0xb901, 0xb884, 0xb868, 0xb922, 0xb9d4, 0xb869, 0x1e50, 0xb97d, 0xb879, 0xb79e, 0xb8e5, 0xbad3, 0x3881, 0xcc17, 0xbac1, 0xb97c, 0xb807, 0xb7a2, 0x3837, 0xb9d8, 0x3743, 0xbb0a, 0x3a6b, 0xbace, 0x3aa3, 0xd262, 0x385c, 0xbafb, 0xb86a, 0x1e1b, 0x23e2, 0x3b09, 0xd5c2, 0x3734, 0xba8f, 0xb811, 0xb866, 0xcf47, 0xb92b, 0x3830, 0xcb4f, 0xb861, 0xb9b4, 0x3865, 0xb9d7, 0xb73a, 0x392d, 0xb955, 0x3a2a, 0xbace, 0x37f3, 0x3801, 0xb87a, 0xb9d4, 0xbae5, 0x3ad3, 0x5263, 0xd26a, 0xbade, 0xbaa9, 0xbafd, 0xb749, 0xb7fd, 0x3734, 0xba38, 0xcc37, 0xb863, 0x3a98, 0xd617, 0xba97, 0xb867, 0xb96b, 0xb9da, 0x38c0, 0xb91c, 0xba2f, 0xba81, 0x380e, 0xbadf, 0xb8bc, 0x23f0, 0xb7b1, 0x38ca, 0x38cb, 0x3ac0, 0xc881, 0xb9df, 0xb7e0, 0xb9db, 0x38ca, 0x38cb, 0x3ab1, 0xc881, 0xba12, 0xb8f9, 0xb7dc, 0xa1f3, 0xd030, 0x3a2a, 0xba6b, 0x3a10, 0xba79, 0xb803, 0xbb11, 0xb988, 0xb809, 0xb91f, 0xba7c, 0x380e, 0xbaaa, 0xba71, 0xb9e0, 0xb80c, 0xb7a5, 0xb987, 0xb80a, 0xb989, 0xbb1e, 0x385c, 0xba31, 0xba83, 0x380f, 0xbb17, 0xb989, 0x1e1b, 0x23e2, 0x3a37, 0xd5c2, 0x3743, 0xba29, 0xb924, 0xbad5, 0x271d, 0xb83e, 0xb984, 0x380f, 0xbb04, 0x60c1, 0x6b30, 0xeb31, 0x38c2, 0xbafa, 0x4f3a, 0xcf3c, 0x31fd, 0x3b53, 0x3b61, 0xea69, 0x1ffd, 0x30de, 0xda22, 0xbb5f, 0xbb50, 0xb17e, 0xbb3e, 0xbb58, 0xe4a6, 0xbb35, 0xdb0c, 0x23f9, 0xa606, 0xbb27, 0x3b22, 0xbb61, 0x259c, 0x3198, 0xb199, 0xbb3b, 0x355b, 0xb582, 0xb581, 0xbb24, 0x3b22, 0xbb53, 0x3b68, 0xbb69, 0x3b65, 0xbb69, 0x3b65, 0xbb68, 0xa24d, 0x3e0b, 0x3f80, 0xbf81, 0x6f52, 0xef7f, 0x1e97, 0x2c81, 0x2d57, 0xbb73, 0x1e97, 0x2c81, 0x2d57, 0xbb72, 0x2386, 0x23af, 0xbb77, 0x2386, 0x23af, 0xbb74, 0x2e30, 0x2f52, 0xc688, 0xbb7a, 0xbb79, 0x3bb1, 0xbbb2, 0x273d, 0x3b7f, 0x3b81, 0xbca1, 0x273d, 0x3b7e, 0x3b81, 0xbca1, 0xa92d, 0x273d, 0x3b7e, 0x3b7f, 0xbca1, 0xbba4, 0xbb98, 0xbb9e, 0xbbae, 0xbb8b, 0xbbab, 0xbb92, 0xbbaf, 0xbb87, 0xbb9a, 0xbb93, 0xbba1, 0x3b7c, 0xbbb2, 0x3b7c, 0xbbb1, 0xbbc6, 0xb147, 0xb740, 0x28f3, 0xbbbc, 0x28f3, 0xbbbb, 0xbbc1, 0x3bc0, 0x41ec, 0xdb6d, 0xdf42, 0xbbb4, 0x233b, 0xe1ab, 0xbbcf, 0xbbce, 0x50b2, 0xd8ac, 0xa936, 0xc562, 0xbbd8, 0xbbd7, 0xb583, 0xbbee, 0xbc08, 0xc403, 0xbbdf, 0xbbff, 0xbbf5, 0x4266, 0xc29b, 0xbc0c, 0x3be1, 0xbc0a, 0xbc08, 0xbc07, 0x3c17, 0x3c23, 0xc081, 0x3c14, 0x3c23, 0xc081, 0xe6f0, 0xbc2b, 0x3c14, 0x3c17, 0xc081, 0xbc2c, 0xbc22, 0xbc29, 0xbc33, 0xbc32, 0x3c35, 0xbc3a, 0x3c34, 0xbc3a, 0x1ecc, 0x21ab, 0xa1b0, 0x3c34, 0xbc35, 0x232f, 0x2f59, 0x2f5a, 0xbed9, 0xbf22, 0xbcdb, 0x3c5a, 0xbc61, 0x3c59, 0xbc61, 0x3c59, 0xbc5a, 0xbe6f, 0xbc74, 0xbc73, 0xbd36, 0xa1b3, 0xbef8, 0x3c89, 0xc00b, 0xbc88, 0xbca1, 0xa1b2, 0xbdfb, 0xbe9d, 0x273d, 0x3b7e, 0x3b7f, 0x3b81, 0xbc92, 0x3cfd, 0xbfa4, 0xc043, 0xbf1a, 0xc01d, 0xbdea, 0xbec4, 0xbe22, 0xbf59, 0x3eec, 0xcc04, 0xe63b, 0xbcb2, 0xbcb1, 0xbfd4, 0xe711, 0xa1b5, 0x1f71, 0xc04b, 0xbc4e, 0xbeaf, 0xbfd8, 0xa76d, 0xda3b, 0x3d99, 0xbdda, 0xa1ba, 0xa933, 0xbfa9, 0x3edd, 0xc027, 0xc018, 0xbffc, 0xc009, 0x3e8c, 0x3f51, 0xc67a, 0x3ca2, 0xbfa4, 0xbd87, 0xbf54, 0xa1bd, 0xc051, 0xbf54, 0xbc79, 0xcaaa, 0xb6f2, 0xbd79, 0xbde8, 0xbdfa, 0xbf3f, 0xbf86, 0xbe5e, 0xbeae, 0xbfc1, 0xbe2c, 0xbfae, 0x3e08, 0xbfdf, 0x26a0, 0xc00f, 0xbefb, 0xbe3e, 0xbef8, 0xbfc3, 0xbf6f, 0xbfdc, 0x3ee8, 0x3ff1, 0xbff5, 0xbfa3, 0x3f82, 0x3f84, 0xc013, 0xbf94, 0xbd43, 0xa1c2, 0x21c3, 0xa857, 0xbe7c, 0xbcfe, 0xbe09, 0xbe67, 0x5385, 0xd49e, 0x3cea, 0xbdda, 0xbfe4, 0x3e0e, 0xc006, 0xbf87, 0xbdf6, 0xbf23, 0xbf7f, 0xbe26, 0xbeb3, 0xbe19, 0xbecc, 0xbf64, 0x3f97, 0xc900, 0xbf32, 0x3e0b, 0x3f80, 0x3f81, 0xbfc7, 0xbf04, 0xa1c5, 0xa1c9, 0xbfb1, 0xbe7d, 0xc5f3, 0xa1c4, 0x3cea, 0xbd99, 0xbe0c, 0x21c0, 0xbd44, 0xbca6, 0x2a6c, 0xbedb, 0xbe7b, 0x26e6, 0x3e0a, 0xbe15, 0xbd9e, 0xbe05, 0xbd45, 0xbc97, 0xbdf8, 0xbe34, 0x3d4e, 0xbfdf, 0xbd89, 0x26e6, 0x3df5, 0xbe15, 0x3b6e, 0x3da9, 0x3f80, 0xbf81, 0xbde5, 0xbf2c, 0x3d9c, 0xc006, 0xbf38, 0xbfa0, 0x2d60, 0x3eaa, 0x5c3f, 0xdc40, 0xbf01, 0x26e6, 0x3df5, 0xbe0a, 0xc00b, 0xbef2, 0xbda3, 0xa1cf, 0xbca8, 0xbda1, 0xbeab, 0xbd4b, 0xbe07, 0x6030, 0xe04a, 0xbd51, 0xa1d1, 0xbd48, 0xbd8c, 0xbc64, 0xbdf3, 0xbd85, 0xbdc4, 0xc063, 0x3ebc, 0xbfd5, 0x3ee1, 0xbeff, 0xbfda, 0xa24c, 0xbf70, 0xbffa, 0xbf0a, 0xbf11, 0x3cfc, 0x3f51, 0xc67a, 0xa3b5, 0x3fdb, 0xd499, 0x21c6, 0xa1d6, 0xbf91, 0xbc9f, 0x2d60, 0x3e13, 0x5c3f, 0xdc40, 0xbe29, 0xbd49, 0x3cdd, 0xe061, 0xbda2, 0x4194, 0xe394, 0x3e7f, 0xbfd5, 0xbca7, 0xc06d, 0xbda4, 0xd365, 0xbf77, 0x232f, 0xbc47, 0xbefe, 0xbdeb, 0x3cf7, 0xc027, 0xbeef, 0x404e, 0x4054, 0xc067, 0xc044, 0x3e80, 0xbeff, 0xc005, 0xbffe, 0xbfeb, 0xc064, 0x3d5c, 0x3ff1, 0xbff5, 0xc058, 0xbfa6, 0x3caa, 0xcc04, 0xbede, 0xbe17, 0x2364, 0x3f9b, 0xc002, 0x3c7b, 0xbd52, 0xbd50, 0xbeda, 0x3e80, 0xbee1, 0xbe14, 0xbdaf, 0xb87c, 0xbe87, 0xbe89, 0xc055, 0xbca4, 0xbc49, 0xbd9f, 0x1e79, 0x1e7e, 0x9e81, 0xc1b3, 0xbe0d, 0xbf44, 0xbda8, 0xbe10, 0xbd46, 0xe88d, 0xbf31, 0xc04c, 0xc020, 0xc01f, 0xc032, 0xbff0, 0x3cfc, 0x3e8c, 0xc67a, 0x3d01, 0xbd2f, 0xbca9, 0x3f5c, 0xbff3, 0x3f5b, 0xbff3, 0xbda6, 0xbd54, 0xbe83, 0xc026, 0xbed7, 0xbda0, 0x3b6e, 0x3da9, 0x3e0b, 0xbf81, 0x3b6e, 0x3da9, 0x3e0b, 0xbf80, 0x3d67, 0x3f84, 0xc013, 0x3d67, 0x3f82, 0xc013, 0xbd47, 0xbd9d, 0xbe9c, 0xbd69, 0xbda7, 0xbfb3, 0x2364, 0x3ef7, 0xc002, 0xc03e, 0x21db, 0xa1dc, 0xbe11, 0xbd63, 0x3ca2, 0xbcfd, 0xbeea, 0xbcf6, 0xbd4d, 0xc032, 0xbdc0, 0xbf9a, 0xbd4a, 0xbd53, 0xbda9, 0x4028, 0xc02c, 0xc015, 0xbcb5, 0x3e7f, 0xbebc, 0xbcde, 0x3e81, 0xc02f, 0x3e95, 0xd499, 0xbd55, 0x3d4e, 0xbe08, 0xbd9b, 0xbee5, 0xbf4d, 0x3d5c, 0x3ee8, 0xbff5, 0x3f5b, 0xbf5c, 0x3d5c, 0x3ee8, 0xbff1, 0x65ca, 0xe614, 0xbe85, 0xbcfa, 0xbee4, 0x2364, 0x3ef7, 0xbf9b, 0xbee2, 0x3d9c, 0xbe0e, 0xbcfb, 0x3c88, 0xbe16, 0xbd4f, 0x3d67, 0x3f82, 0xbf84, 0xbfd2, 0xbcf8, 0xbca5, 0xbf47, 0xbf46, 0xbf74, 0x3cf7, 0xbedd, 0x3fd1, 0xc02c, 0x3fd1, 0xc028, 0xbfda, 0xaf25, 0x3f4b, 0xbfb0, 0xbf9c, 0xbca3, 0xbee0, 0x1f71, 0xbcd5, 0xbf45, 0x3edf, 0xc054, 0xc05d, 0xbd12, 0x3edf, 0xc04e, 0xbf13, 0xbee9, 0xc04f, 0xbe7e, 0xbee6, 0xbedf, 0xbec5, 0x2149, 0xc097, 0xc1c8, 0x670a, 0x671b, 0xe748, 0x4ac3, 0xcac8, 0x40fe, 0xdd64, 0x407e, 0xc0d6, 0x407d, 0xc0d6, 0xc1e6, 0xc16c, 0x3c14, 0x3c17, 0xbc23, 0x4210, 0x6229, 0xe46a, 0x23cd, 0xa3db, 0xc08f, 0xc08e, 0x2149, 0xc06e, 0xc152, 0xc197, 0x362d, 0x36cc, 0x4167, 0x41f3, 0xc7be, 0x4832, 0x491f, 0xc92e, 0xc0f1, 0xcf39, 0xeede, 0x1e3a, 0xc232, 0x4149, 0x632c, 0xe34a, 0xc1be, 0xc20d, 0x41d7, 0x421b, 0xc224, 0xc0f4, 0xc16c, 0x9e4c, 0x407d, 0xc07e, 0xc1ed, 0xc159, 0xc169, 0x413c, 0xc1d2, 0x41c1, 0xc217, 0xc1f4, 0xc1d9, 0xc1fc, 0xc1b1, 0xc0af, 0xc0c3, 0xc1a2, 0x407b, 0xdd64, 0xe2b7, 0x21de, 0x4155, 0x4188, 0xc199, 0xe2b2, 0x9e9f, 0x4130, 0xc1c4, 0xc165, 0xc1dc, 0xc1fe, 0x41cc, 0xc1d3, 0xb5e0, 0xc133, 0xc162, 0x4114, 0xc1c4, 0xc126, 0x40e7, 0xc1d2, 0xe35b, 0x40bc, 0x632c, 0xe34a, 0xc16e, 0xc09c, 0x21de, 0x4108, 0x4188, 0xc199, 0xb696, 0xb696, 0xc0df, 0x412d, 0xd315, 0xc115, 0x36cc, 0x40a4, 0x41f3, 0xc7be, 0xc0e6, 0x4080, 0xc0ca, 0xc151, 0x417e, 0xc185, 0x4174, 0xc185, 0x4174, 0xc17e, 0x21de, 0x4108, 0x4155, 0xc199, 0xc1fb, 0xd367, 0x3eb6, 0xe394, 0xc09d, 0x21de, 0x4108, 0x4155, 0xc188, 0xc0fd, 0xc0ed, 0xe88e, 0xbf2b, 0xc1ba, 0xc1b9, 0xc0bd, 0x40e8, 0xc217, 0x4114, 0xc130, 0xc06f, 0x411a, 0xc1d3, 0xac1e, 0x48f7, 0xcca6, 0x40e7, 0xc13c, 0x411a, 0xc1cc, 0xedf0, 0x40c2, 0x421b, 0xc224, 0xc0eb, 0xc116, 0x25b6, 0xd425, 0xc07f, 0xbbc1, 0xc0db, 0x36cc, 0x40a4, 0x4167, 0xc7be, 0xc0e9, 0xc18f, 0xc0ec, 0xc118, 0xd000, 0xc0c1, 0xc089, 0x40e8, 0xc1c1, 0x40c2, 0x41d7, 0xc224, 0x40c2, 0x41d7, 0xc21b, 0x9e89, 0xb11b, 0x1e3a, 0xc0ba, 0xb52b, 0xc23a, 0xc237, 0x9fce, 0x2c12, 0x2c13, 0xac14, 0x9e2c, 0xae8a, 0xb96a, 0xa889, 0xa899, 0xcb3a, 0xc258, 0x4255, 0x4a93, 0x4a97, 0xcabb, 0xb99c, 0x424e, 0x4a93, 0x4a97, 0xcabb, 0xc24d, 0xc25c, 0xc25b, 0xab83, 0x3c02, 0xc29b, 0x1f10, 0xa0a0, 0xb2b5, 0xc27d, 0x42a0, 0xc2a7, 0xc275, 0xc282, 0xc281, 0xa954, 0xc2a2, 0xd366, 0x3c02, 0xc266, 0x427a, 0xc2a7, 0xc28a, 0x427a, 0xc2a0, 0xc2ad, 0xc2ac, 0xa3d0, 0xdc7a, 0x5c7b, 0xdc8b, 0xc2c0, 0xc377, 0xc341, 0xc336, 0xc2b6, 0x2448, 0xb282, 0xc2fd, 0xdc7e, 0xc329, 0xc36e, 0xc370, 0xdc89, 0xaf87, 0xc368, 0xc2f9, 0xc345, 0xc36a, 0xc319, 0xc344, 0xc33b, 0x430d, 0xdc8d, 0xc2ed, 0xc2c8, 0xc318, 0xb08d, 0xc36b, 0xd653, 0xdc8e, 0x42f8, 0xdc8d, 0x431f, 0xc375, 0xc37c, 0xc2fe, 0xc2f0, 0x430e, 0xc375, 0xc380, 0xc33f, 0xc2cc, 0xdc6c, 0xdc93, 0xd75f, 0xc37b, 0xdc92, 0xc366, 0xc371, 0xc2b9, 0xc2f2, 0x4328, 0xd76f, 0xc2b8, 0xc2f1, 0xc2ee, 0xe3e1, 0x2956, 0x2968, 0xa96c, 0xdc98, 0xee9e, 0xc359, 0xc358, 0x217d, 0xc378, 0xc332, 0xc2ec, 0xc2ef, 0x4303, 0xc381, 0xc37a, 0xc2dd, 0xc2de, 0xc335, 0xd3b7, 0x430e, 0xc31f, 0xc2b7, 0x217d, 0xc363, 0xc36d, 0xc32e, 0xc315, 0xdc9b, 0xc321, 0xc36b, 0x583c, 0xdc9c, 0xa999, 0xa35b, 0xc4a3, 0xc4b5, 0xc452, 0xc46a, 0x43cf, 0xc474, 0xcfeb, 0xc44b, 0xc4b0, 0xc3fe, 0xc472, 0xc447, 0xc4bd, 0x4409, 0x4460, 0xc4a2, 0xc3ce, 0xc3cd, 0x43a8, 0xc474, 0xc43a, 0xc4cf, 0x4434, 0xc439, 0x2b9d, 0x2bda, 0x2bf3, 0xabf6, 0xa72d, 0xc4ab, 0x448e, 0xc4d4, 0xc43f, 0xc894, 0xc3b0, 0xbbec, 0xc46f, 0x43cb, 0x4460, 0xc4a2, 0x4483, 0xc4c8, 0xc4a1, 0xc489, 0x4411, 0xc463, 0x4410, 0xc463, 0xe6d5, 0x43e1, 0xc439, 0x43e1, 0xc434, 0xc3d0, 0xc4ca, 0xc3f2, 0xc3b3, 0xc3ae, 0xc39a, 0xc8af, 0x43cb, 0x4409, 0xc4a2, 0x4410, 0xc411, 0xc476, 0xc4a1, 0xd3b9, 0xc39b, 0xc405, 0xc4cc, 0xc3b1, 0x43a8, 0xc3cf, 0xc464, 0xc4a6, 0xc4b8, 0x440d, 0xc4c8, 0xc4bf, 0xc40f, 0x43f1, 0xc4d4, 0x440e, 0xc468, 0x43cb, 0x4409, 0xc460, 0xc391, 0xc477, 0xc3f0, 0xc3af, 0xc399, 0xc478, 0x28d0, 0xc3ba, 0xc487, 0x440d, 0xc483, 0xc4da, 0xc43c, 0xc470, 0xc3d1, 0xc4da, 0x43f1, 0xc48e, 0x44c9, 0xc4d2, 0xaf01, 0xcf38, 0xc515, 0xc50c, 0x4501, 0xcf3e, 0xc506, 0x44f6, 0xcf3e, 0xc4f7, 0xc4ef, 0x287c, 0x4816, 0xc8da, 0xc4ee, 0x4f42, 0xcf4c, 0x2617, 0x2690, 0xac1d, 0xb674, 0x1ea7, 0xc523, 0x1ea7, 0xc522, 0x4a4c, 0x52cf, 0xd607, 0x2b81, 0x2bcd, 0x2bd5, 0x2bd7, 0x2bdc, 0xabe7, 0xe6fb, 0x9fbd, 0x2722, 0xc53c, 0x2212, 0x2283, 0x2290, 0x456b, 0xc575, 0x2722, 0xc53a, 0xc54e, 0xc55d, 0x4559, 0xc571, 0xb6a2, 0x1ea9, 0x4552, 0x455d, 0xc55e, 0xd015, 0x283a, 0xc54d, 0x283a, 0xc54c, 0xc53d, 0xc560, 0x1ea9, 0x4546, 0x455d, 0xc55e, 0x4544, 0xc571, 0xa959, 0x1ea9, 0x4542, 0x4546, 0x4552, 0xc55e, 0x1ea9, 0x4546, 0x4552, 0xc55d, 0xc551, 0xa793, 0xbbd5, 0xc567, 0xc565, 0xc56a, 0xc568, 0x453b, 0xc575, 0xaf02, 0x4544, 0xc559, 0x23e0, 0x4582, 0x4589, 0xc58a, 0xc587, 0x453b, 0xc56b, 0xaf53, 0xc585, 0xa84d, 0x23e0, 0x4573, 0x4589, 0xc58a, 0x457a, 0xc586, 0xc585, 0xc574, 0x23e0, 0x4573, 0x4582, 0xc58a, 0x23e0, 0x4573, 0x4582, 0xc589, 0x458f, 0xde08, 0x458e, 0xde08, 0xc664, 0xc642, 0xc627, 0xc658, 0xc60d, 0xd0ac, 0xc667, 0xc632, 0xc621, 0xc60b, 0x46b0, 0xe764, 0xc5fe, 0xc665, 0xc670, 0xc5d9, 0xc662, 0x24d1, 0x2516, 0x255e, 0xc602, 0xc5c9, 0xc646, 0xc626, 0xc613, 0xc647, 0xd139, 0x45f3, 0xeebb, 0x3dcb, 0x45f2, 0xeebb, 0xc661, 0xc5fa, 0xc5f9, 0xc5b4, 0x24d1, 0x2516, 0x255e, 0xc5d6, 0xc649, 0xc62e, 0x3108, 0xc652, 0xc5af, 0xc5a1, 0xc5ea, 0xa591, 0xc61e, 0xc63b, 0xc617, 0xc5ae, 0xc645, 0xc5e9, 0xc59f, 0xc65f, 0xc671, 0xc606, 0xc5ad, 0xc63b, 0x4618, 0xc63a, 0xc66e, 0xc66d, 0xc597, 0x2af6, 0xb194, 0xc624, 0xc5e8, 0xc5eb, 0xc605, 0x3108, 0xc609, 0x4670, 0xd1c3, 0xc5a0, 0xc669, 0xc62a, 0xc5f4, 0xc5d2, 0xc66c, 0xc596, 0xc5c7, 0xc5ac, 0xc65e, 0xc672, 0xc663, 0xc63f, 0xc63e, 0xd1de, 0x45c8, 0x4655, 0xd1c3, 0xc62b, 0xc66b, 0xc675, 0xc674, 0x23d1, 0x32e8, 0x34a5, 0x3cfc, 0x3e8c, 0x3f51, 0x467c, 0x6166, 0x6197, 0xe1b1, 0xa0dc, 0x23d1, 0xc67a, 0x388d, 0xc682, 0x388d, 0xc681, 0xdc8c, 0x2e30, 0x2f52, 0xbb78, 0xc690, 0x2373, 0xa37d, 0xdccb, 0xc68b, 0xc69a, 0x21d2, 0xc691, 0xc6a1, 0xc69e, 0x36a4, 0xb6ad, 0xb61f, 0x45b1, 0xe764, 0xc6ba, 0x46b8, 0xc6b9, 0xef13, 0x46b2, 0xc6b9, 0x46b2, 0xc6b8, 0xc6b1, 0xef13, 0xc6c8, 0x376f, 0xb86e, 0xc6cd, 0xc6c1, 0x4f3d, 0x6262, 0xe4b5, 0xc897, 0xc6c7, 0xc6de, 0x2869, 0xee7d, 0x46e3, 0xdb7c, 0x5462, 0xd4cb, 0xc6dc, 0xc6e4, 0xcc20, 0xc6d7, 0xc6cf, 0xac3d, 0x46d1, 0xdb7c, 0xc6d8, 0xa362, 0x5361, 0xd62f, 0x1eff, 0xa023, 0xc742, 0x23bf, 0xce23, 0xc798, 0x5996, 0xd9c6, 0xb14e, 0xc71f, 0xc71e, 0xc726, 0xc725, 0xc72f, 0xc7d3, 0x472b, 0xc787, 0xc760, 0x1e51, 0x1f17, 0xd846, 0xd457, 0xc75c, 0xc709, 0xa6f0, 0xc75e, 0xc7bc, 0xc741, 0xc750, 0xc737, 0xc765, 0xc764, 0xd9a9, 0x23e1, 0xa8e1, 0xc7c1, 0xc7b6, 0xc72f, 0xc79e, 0xcff3, 0xc70d, 0xc792, 0xc7aa, 0xc7d2, 0xc7da, 0xc7a0, 0x1e86, 0xb6b8, 0xc7d9, 0xc786, 0xc751, 0x36cc, 0x40a4, 0x4167, 0xc1f3, 0xc785, 0xd499, 0xc7a2, 0xc72c, 0xc7b0, 0xc7a9, 0xcb36, 0x47e7, 0xda20, 0x9faf, 0x47e4, 0xda20, 0xc7ef, 0xc7eb, 0x3917, 0x4887, 0xc8f8, 0xc8ef, 0xc92c, 0x483f, 0x4926, 0x6271, 0x62db, 0xe45b, 0xc8ad, 0xc8bc, 0xc8c7, 0xc88e, 0x287c, 0x450e, 0xc8da, 0xc868, 0xc86f, 0xc8b8, 0xa38e, 0xc8aa, 0xc8d6, 0x40ae, 0x491f, 0xc92e, 0xc92a, 0xc931, 0xc92b, 0x47ff, 0x4926, 0x6271, 0x62db, 0xe45b, 0xc90e, 0xc85c, 0xb731, 0xc8a9, 0xc864, 0xc8fd, 0xc8d1, 0xc904, 0xc841, 0xc856, 0xc817, 0xc912, 0x27c6, 0x48ba, 0xc8bb, 0xc81a, 0xc8e0, 0x6e78, 0x6e7b, 0xee7c, 0x38ca, 0x38cb, 0x3ab1, 0xbac0, 0x3917, 0xc7f4, 0xc919, 0xc815, 0xc3f7, 0x27fc, 0x2d0e, 0xad5c, 0x27e6, 0x3900, 0xc6cc, 0xc8e7, 0xc8e3, 0x2ca9, 0x2d52, 0xad53, 0xe7a8, 0xc855, 0xc827, 0xc800, 0xc459, 0x33bd, 0xde2b, 0x6e78, 0xee7c, 0xc81c, 0x486e, 0xc8bb, 0x486e, 0xc8ba, 0xc801, 0xc920, 0xc812, 0xc859, 0xe695, 0xa387, 0xc82c, 0x287c, 0x450e, 0xc816, 0xc875, 0xc89c, 0xc89b, 0xc7f6, 0xc1d0, 0xc7f4, 0xeec4, 0xc857, 0xbda7, 0xc85a, 0x6669, 0x667a, 0xe6aa, 0x2760, 0xa89c, 0xc840, 0xc86a, 0xc88d, 0x40ae, 0x4832, 0xc92e, 0xc8c1, 0x47ff, 0x483f, 0x6271, 0x62db, 0xe45b, 0xc83a, 0xc83e, 0xc7fe, 0x40ae, 0x4832, 0xc91f, 0xc83b, 0xc93b, 0xc93a, 0xc9ae, 0xc9b4, 0xc9a9, 0xc9a1, 0xa996, 0xc995, 0xc9d8, 0xc9b0, 0xc98e, 0xb346, 0xc9b1, 0xc98d, 0xc984, 0xca1f, 0xc97f, 0xc9aa, 0xc978, 0xc96f, 0xc94e, 0xc943, 0xafa1, 0xc940, 0xc985, 0xc93c, 0xc962, 0xc977, 0xc93f, 0xe6e2, 0xc9c3, 0xa3b6, 0xc9bf, 0xca08, 0x527a, 0x52b8, 0x541f, 0x54fa, 0xd5dd, 0xcc7c, 0xae74, 0x49cc, 0x4a50, 0x67a6, 0x67a7, 0xef9d, 0x49cb, 0x4a50, 0xef9d, 0xca2e, 0xd018, 0x4a09, 0xccb3, 0xcc83, 0xa3ea, 0xe8eb, 0xc955, 0xca4d, 0x4a31, 0xca6a, 0xca2d, 0xca62, 0xca60, 0x4a3e, 0x4a3f, 0x55c1, 0xd5f3, 0xca0e, 0x4a5e, 0xca6d, 0xc9c6, 0x49d4, 0xccb3, 0xca05, 0x4cba, 0xd5ad, 0x4a3a, 0xca49, 0xb8f1, 0xc980, 0xca4c, 0xc9f8, 0xc9cd, 0x49f0, 0xca6a, 0xca3b, 0x4a4f, 0xca69, 0x4a1a, 0xca49, 0xca32, 0x4a01, 0x4a3f, 0x55c1, 0xd5f3, 0x4a01, 0x4a3e, 0x55c1, 0xd5f3, 0x4cd3, 0xdc37, 0xca57, 0x4c87, 0xcce0, 0x4a1a, 0xca3a, 0x4526, 0x4a23, 0x52cf, 0xd607, 0xc9ef, 0x6834, 0xe896, 0x4a33, 0xca69, 0x49cb, 0x49cc, 0xef9d, 0xca61, 0xca42, 0x4a06, 0xca6d, 0xc9fe, 0xca51, 0xc9fd, 0xca70, 0x6839, 0x683a, 0x683d, 0xe893, 0x4a33, 0xca4f, 0x49f0, 0xca31, 0xd3b7, 0x4a06, 0xca5e, 0xca63, 0x4aae, 0xcac6, 0xab86, 0xe631, 0xab8a, 0xcaca, 0xcab3, 0xcac5, 0xcab5, 0x4aaf, 0xcab0, 0x424e, 0x4255, 0x4a97, 0xcabb, 0x424e, 0x4255, 0x4a93, 0xcabb, 0xcac4, 0xcaa9, 0xcaba, 0xcac7, 0xca9d, 0xbd3c, 0xde30, 0x2be0, 0xcab6, 0x4a77, 0xcac6, 0x4a91, 0xcab0, 0x4a91, 0xcaaf, 0xca8a, 0xca8e, 0x2be0, 0xcaad, 0xcaa5, 0x424e, 0x4255, 0x4a93, 0xca97, 0x4076, 0xcac8, 0xca9c, 0xca8d, 0x4a77, 0xcaae, 0xcaa6, 0x4076, 0xcac3, 0xca83, 0xa947, 0x4aea, 0xdc4e, 0x9f2b, 0x6f8d, 0xef92, 0x1e26, 0x20a1, 0xae76, 0x4af6, 0xcaf8, 0x9fdf, 0x5abc, 0xdc0a, 0x4ad6, 0xdc4e, 0x4ade, 0xcaf8, 0x4ade, 0xcaf6, 0xcbea, 0xcbe4, 0x4b4d, 0xcbb0, 0x2173, 0xa4b2, 0xcb46, 0xcb67, 0xcb8d, 0x218a, 0x218c, 0x3547, 0x4b56, 0x4b5e, 0xcba3, 0x9f53, 0x4bc4, 0xd303, 0xc7e2, 0x424b, 0xcb8b, 0x4bed, 0xcc60, 0xcc69, 0xcbb2, 0xcb14, 0xd9d4, 0x4b0b, 0xcbb0, 0x3830, 0xba43, 0xcb7a, 0xcbc9, 0x3547, 0x4b27, 0x4b5e, 0xcba3, 0xcc06, 0xcb82, 0xcbf3, 0xcbe9, 0xcc39, 0xcb8f, 0x3547, 0x4b27, 0x4b56, 0xcba3, 0xcb15, 0xcbe0, 0xcc4c, 0xcb50, 0xcbd4, 0x4c3d, 0x4c56, 0xcc64, 0xcbe0, 0xcc21, 0xcb59, 0xcbe6, 0x00f6, 0x1e2a, 0xa00b, 0xcb3a, 0xcb1f, 0xcb5d, 0xae1a, 0xcc59, 0xa284, 0x3547, 0x4b27, 0x4b56, 0xcb5e, 0x4c00, 0xd536, 0xcbcb, 0xcc5c, 0xcc6e, 0xcc1e, 0xcc2b, 0xcbdb, 0x4b0b, 0xcb4d, 0xcb45, 0xd282, 0x4b35, 0xd303, 0xd483, 0xcb51, 0x2327, 0xcba7, 0xad4c, 0xcc23, 0xcc0d, 0xcb7c, 0xcc46, 0xcbac, 0x4b71, 0xcb7f, 0xcc12, 0xcb03, 0xcb86, 0x4b5b, 0x4c01, 0xcc6d, 0xcafe, 0x4b3c, 0xcc60, 0xcc43, 0xcc5b, 0xcc6c, 0xaf57, 0xcb5a, 0x4ba6, 0xd536, 0x4be9, 0xcc6d, 0x3caa, 0xbeec, 0xcb58, 0xcbd3, 0x4c14, 0xd4d1, 0xcbe1, 0x4c11, 0xd4d1, 0xcc6a, 0x3881, 0xba11, 0xcc2b, 0xcbaa, 0xc6d9, 0xcb80, 0xcbd1, 0xa142, 0x4bab, 0xcc18, 0x35d7, 0xcc4f, 0xba90, 0xcb5c, 0xcb7e, 0xae18, 0x4c52, 0xcc55, 0xcc5f, 0xcbee, 0xcbd7, 0xcb79, 0x35d7, 0xcc31, 0xcc58, 0xcc40, 0x55ae, 0xd5ea, 0xcc40, 0x4b7e, 0xcc64, 0x4c50, 0xd5e4, 0xcb93, 0xcbef, 0xcba8, 0xcc41, 0x4b3c, 0xcbed, 0x4b7e, 0xcc56, 0xcb3e, 0xcc16, 0xcbf1, 0x4be9, 0xcc01, 0xcba9, 0x2401, 0xefa5, 0xccf4, 0xe85e, 0xc9c8, 0xc9d5, 0x4a45, 0xcce0, 0xccb9, 0xeea4, 0xeecf, 0x5083, 0xd085, 0xccf6, 0xccf2, 0xccb5, 0x1ffc, 0xeb3b, 0xc1d0, 0x2986, 0x299d, 0x2a24, 0xccda, 0xccde, 0x36f2, 0x6eaf, 0x6eb4, 0xeeb9, 0xcce7, 0x49d4, 0xca09, 0xcca4, 0xcc8b, 0xca17, 0xccc9, 0xccdd, 0x6762, 0x6eaa, 0x6eab, 0x6eb5, 0xeeba, 0xe931, 0xccbd, 0xe92c, 0x4a40, 0xdc37, 0xe93b, 0x2986, 0x299d, 0x2a24, 0xcca7, 0xccc1, 0xccaa, 0x4a45, 0xcc87, 0xe94e, 0xccae, 0x26e2, 0xa6e3, 0xcc9d, 0xcc74, 0xcc9c, 0x1e1d, 0x4cf9, 0x4d72, 0xce9f, 0x4cf8, 0xce9f, 0xccfe, 0x1fc2, 0x4e18, 0x4e4b, 0xce6b, 0x229f, 0xccff, 0x4cfa, 0xcea0, 0x229f, 0xccfc, 0xceaa, 0xcea3, 0xcea6, 0xcea2, 0xcea1, 0xcea5, 0xcea8, 0xceab, 0xceb9, 0xceb3, 0xcebd, 0xcebe, 0xceaf, 0xceb0, 0xcebc, 0xceb1, 0x4d8b, 0xceae, 0x2e0b, 0xceb8, 0xcea7, 0xceb7, 0xcead, 0x4d4d, 0xceb4, 0xceba, 0xcdb7, 0xcd2e, 0xcdca, 0x4da2, 0xcef8, 0x324e, 0xcd25, 0x4e32, 0x4e8d, 0x4e9d, 0xcf27, 0xcec6, 0xcec2, 0xcec1, 0xcec5, 0xcebb, 0xcecd, 0xcec0, 0xcecb, 0xced0, 0xcecc, 0xcec8, 0xaf26, 0xcec4, 0xcd97, 0x4eca, 0xe77d, 0xae15, 0xcea9, 0x4d93, 0xcecf, 0xcd1d, 0xced7, 0xcec1, 0xced3, 0x34a7, 0x4d76, 0xcedd, 0xce8a, 0xcdea, 0x4e27, 0xcee6, 0x4ed4, 0xd8b4, 0xcede, 0xcedc, 0xceda, 0x4dab, 0x4dda, 0x4ebf, 0xcf10, 0xd32f, 0xced9, 0xced2, 0xced6, 0x4d82, 0xcedf, 0x1e1d, 0xccf8, 0xcedb, 0x4e6a, 0xced8, 0x34a7, 0x4d55, 0xcedd, 0xce36, 0x4e6d, 0xd812, 0xcee2, 0xced1, 0x4d71, 0xcedf, 0xcee1, 0xcee0, 0xcee8, 0xcee3, 0xcd18, 0xcee4, 0xcee5, 0x3346, 0xb8b1, 0x4d4c, 0xcecf, 0xcd45, 0x4e7c, 0xcee7, 0x4e8c, 0x4eed, 0xdce1, 0xcefc, 0xcf0d, 0x4dd1, 0xceff, 0x4d2c, 0xcef8, 0xcefb, 0x4d64, 0x4dda, 0x4ebf, 0xcf10, 0xcef6, 0xcef4, 0xcef9, 0xcefe, 0xceb2, 0xcf51, 0x4e43, 0xcef7, 0x23d5, 0xcf00, 0xaf69, 0xcd23, 0xceb6, 0xcefa, 0xceee, 0xcefd, 0x4e5b, 0xcef0, 0xceeb, 0xcef5, 0xcef2, 0xcf01, 0xcd27, 0xceef, 0xcde1, 0x303b, 0x3460, 0x4deb, 0xce3d, 0xce41, 0x4da0, 0xceff, 0x4dd6, 0xceea, 0xcef1, 0xce83, 0x4dd2, 0xceea, 0xcf03, 0xcf04, 0xcf02, 0x4d64, 0x4dab, 0x4ebf, 0xcf10, 0xcef5, 0xcf09, 0xcf0e, 0xcf14, 0x4dcd, 0xcf17, 0x4e01, 0xcf18, 0xd913, 0xcf0c, 0xcf16, 0xcf13, 0xcd5a, 0x303b, 0x3460, 0x4dcf, 0xce3d, 0xcf05, 0xceac, 0xcf11, 0xcf08, 0xcec3, 0xcf0f, 0xcf07, 0xd1f4, 0x4e15, 0xcf0a, 0x4de3, 0xcf18, 0x4e69, 0xcef3, 0xd426, 0xcf19, 0xcf22, 0xcf12, 0xcec9, 0xcf23, 0x4dfc, 0xcf0a, 0xcf1e, 0x4cfb, 0x4e4b, 0xce6b, 0xcf1a, 0xcf1c, 0xcf1f, 0xcf1b, 0x23bf, 0xc70c, 0x4e31, 0xceb5, 0x4d5b, 0xcee6, 0xae4c, 0xcf1d, 0xcf21, 0xcf29, 0x4e26, 0xceb5, 0x4d2f, 0x4e9d, 0xcf27, 0xcea4, 0xcf26, 0x4d77, 0xe9bd, 0xcf15, 0xcf25, 0x303b, 0x3403, 0x3460, 0x4dcf, 0xcdeb, 0xcee9, 0xcdd0, 0x4db3, 0xcef7, 0x4e70, 0xcf2b, 0xcf2a, 0xce66, 0x4e8e, 0x4e96, 0xcea4, 0x4cfb, 0x4e18, 0xce6b, 0x4e61, 0xcee3, 0xcf2f, 0xcec7, 0xcf2e, 0x1f1e, 0xa098, 0xcffb, 0xcf2d, 0xcdbd, 0xced5, 0x4e4d, 0xcee3, 0xcf0b, 0xce82, 0xce48, 0x4e04, 0xcef3, 0x4d75, 0xced8, 0x4cfb, 0x4e18, 0xce4b, 0x4d78, 0x5327, 0xd812, 0x4f30, 0xe7c1, 0xcf33, 0x4e45, 0x4f2b, 0xcf32, 0xcf34, 0xcece, 0x4d99, 0xcee7, 0xcf24, 0xcf31, 0xb9db, 0xce64, 0xcdd5, 0xe8a3, 0xcf2c, 0x4e98, 0xcf35, 0x4d56, 0xcea9, 0x4d9a, 0x4eed, 0xdce1, 0xcd2f, 0x4e4a, 0x4e96, 0xcea4, 0x4e92, 0xcf20, 0x4e8f, 0xcf20, 0xcf28, 0xb24d, 0x4e4a, 0x4e8e, 0xcea4, 0x4e89, 0xcf35, 0xcf06, 0x4d2f, 0x4e32, 0xcf27, 0x4cf8, 0xccf9, 0xccfe, 0xcd06, 0xcd05, 0xcd02, 0x4e34, 0x4e4a, 0x4e8e, 0xce96, 0xcd07, 0xcd04, 0xcd1a, 0xcd08, 0x4d4b, 0xce8a, 0xcd00, 0xcd09, 0xcdef, 0xcd1c, 0xcd18, 0xcd14, 0xcd15, 0xcd17, 0xcdb1, 0xcd0d, 0xcd1d, 0x4e26, 0xce31, 0xcdb8, 0xcd1b, 0xcd19, 0xcd0b, 0xcd21, 0xcd35, 0xcd16, 0xcd10, 0xcd13, 0x4d64, 0x4dab, 0x4dda, 0xcf10, 0xcd3a, 0x4d32, 0xcd4f, 0xcd31, 0xcdf4, 0xcd44, 0xcd33, 0xcd30, 0xce54, 0xcd42, 0xce10, 0xcd46, 0xcd3c, 0xcd40, 0xcd39, 0xce79, 0x4d4c, 0xcd93, 0xcd3f, 0xcd81, 0xcd68, 0xcd50, 0xcd5d, 0x4e5e, 0xe076, 0xcd70, 0xcd4e, 0x4d75, 0xce6a, 0xcd66, 0xcd62, 0xcd73, 0xcd61, 0x34a7, 0x4d55, 0xcd76, 0xcd5e, 0x4d71, 0xcd82, 0xcd86, 0xcd83, 0xcd79, 0x4d89, 0x4e4d, 0xce61, 0xcd8c, 0xcd8f, 0x4d5b, 0xce27, 0x4d99, 0xce7c, 0xcd88, 0xce3e, 0x4dd2, 0xcdd6, 0xcdbe, 0x4d9a, 0xce8c, 0xcdba, 0xcdcb, 0xcdbd, 0xcdd4, 0xcdc4, 0x4e04, 0xce69, 0xcdad, 0x4dbf, 0xcddc, 0xcdac, 0x4db3, 0xce43, 0x4d2c, 0xcda2, 0xcdaf, 0xcdb9, 0xcda3, 0xcd9c, 0xcdbb, 0xcdb0, 0x4da0, 0xcdd1, 0xcdb4, 0xcdc7, 0xcdd9, 0xcdd7, 0xcdd8, 0xcdec, 0xce9c, 0xcdf9, 0xcdf2, 0xcddd, 0x4dfc, 0xce15, 0xce62, 0xcde6, 0xcd9e, 0xcdde, 0xcdf6, 0x4d64, 0x4dab, 0x4dda, 0xcebf, 0xcdf1, 0xce0b, 0xcde9, 0xcde0, 0xce37, 0xcde8, 0xcde1, 0x4de3, 0xce01, 0xce09, 0xce1b, 0xce1f, 0xce1d, 0xce2b, 0xce17, 0xce1e, 0x4e8f, 0xce92, 0xce2d, 0xce0a, 0xce11, 0xce7d, 0xce39, 0xce35, 0x4d2f, 0x4e32, 0xce9d, 0xce93, 0xce2e, 0xce46, 0x4e45, 0xce70, 0xce88, 0xce5a, 0xce55, 0xce52, 0x4e6e, 0xe7c1, 0xce7e, 0xce70, 0xce6f, 0xce73, 0x4e89, 0xce98, 0x4f3b, 0x4f50, 0xe475, 0xa378, 0xc4e8, 0xc0b0, 0x3b20, 0xcf3c, 0xcf36, 0x3b20, 0xcf3a, 0x46cb, 0x6262, 0xe4b5, 0x44f6, 0xc501, 0x4516, 0xcf4c, 0xba3d, 0x275b, 0x28b0, 0x28b5, 0x28dc, 0xcf4e, 0x4516, 0xcf42, 0x275b, 0x28b0, 0x28b5, 0x28dc, 0xcf48, 0x4f36, 0xe475, 0x4db2, 0x4f52, 0xcf53, 0x4f51, 0xcf53, 0x4f51, 0xcf52, 0x2570, 0x26c9, 0xcf85, 0x4f70, 0xcf78, 0xcf77, 0x3683, 0xdfa0, 0x4f5a, 0xcf78, 0xcf86, 0x208c, 0x69e1, 0xea82, 0xcf80, 0xcf62, 0x4f5a, 0xcf70, 0xcf76, 0x4f88, 0xd98a, 0x21aa, 0xae42, 0xcf57, 0xcf74, 0x4f88, 0x5989, 0xd98a, 0x4f81, 0x4f87, 0x5989, 0xd98a, 0xd288, 0xd288, 0xcf97, 0xcf91, 0xcf90, 0xcf8c, 0xcfa5, 0xcfa8, 0xcfa4, 0xcfa3, 0xcf9f, 0xcfa1, 0x9e49, 0x217b, 0xe90a, 0xcfb9, 0x4fb6, 0xd1bb, 0x4fb4, 0xd1bb, 0xcfae, 0x4fc5, 0xcfe4, 0x4fc4, 0xcfe4, 0xcfe0, 0x9e60, 0xcff9, 0xcffd, 0xcfec, 0xcfc6, 0x4fc4, 0xcfc5, 0xc3a9, 0xcfda, 0xcffa, 0xc796, 0xcfd8, 0xcff1, 0x4e59, 0xe8dc, 0xcfd9, 0xc1ff, 0xb537, 0xd008, 0xd007, 0xd00b, 0xd00a, 0xc54a, 0xc9d0, 0xb7b1, 0xe504, 0xd02e, 0xd5c9, 0xd02c, 0x39c8, 0xe392, 0xd027, 0xd022, 0xbacc, 0xd073, 0xb065, 0xd043, 0xdead, 0x504c, 0x5077, 0xdec4, 0xd076, 0xd03c, 0xd07e, 0x5040, 0x5077, 0xdec4, 0xd079, 0x5068, 0xd06f, 0x2723, 0xa7a9, 0xe5fb, 0x28fb, 0xaa7f, 0x5066, 0x506a, 0xd070, 0x5061, 0x506a, 0xd070, 0x5054, 0xd06f, 0xd075, 0x5061, 0x5066, 0xd070, 0xd06f, 0x2abf, 0xb127, 0xd06f, 0x5054, 0x5068, 0x506b, 0xd06e, 0x5061, 0x5066, 0xd06a, 0xa8f0, 0xd038, 0x242c, 0xd07d, 0xd069, 0xd042, 0x5040, 0x504c, 0xdec4, 0xd04d, 0x242c, 0xd074, 0xd04b, 0x4c9b, 0xd085, 0x4c9b, 0xd083, 0xd088, 0xd087, 0xab8d, 0xd0af, 0x5178, 0xd193, 0xd135, 0xd19a, 0xd0da, 0xc5a3, 0xeaaf, 0x508e, 0xd0bb, 0xa3b7, 0x3bd3, 0xd8ac, 0xe91a, 0xd0af, 0xd14e, 0xd16b, 0xd139, 0x5105, 0x5107, 0xd10b, 0x1f37, 0xa191, 0x51bb, 0xd1bd, 0xb3f9, 0xd0a7, 0xa2dd, 0x585a, 0xeb0d, 0xb727, 0xd156, 0xd1da, 0x511b, 0xde01, 0xd1d9, 0xd1a0, 0x5106, 0xd13a, 0x50c1, 0xd10b, 0x5103, 0xd13a, 0xd0c1, 0xd109, 0xd108, 0x50c1, 0xd105, 0xd1be, 0x51d3, 0x51df, 0xead2, 0xd1cd, 0x5133, 0xd166, 0xd1bf, 0xd1e0, 0xa43b, 0x5173, 0xde0b, 0x50eb, 0xde01, 0xa507, 0x9fee, 0xd131, 0xd12b, 0x2318, 0x5111, 0xd166, 0xd0a1, 0xd161, 0xd1c9, 0x45ee, 0xd0c0, 0x5103, 0xd106, 0xd157, 0xa00e, 0x51c8, 0xd1d8, 0xe183, 0xd0be, 0xd0e8, 0xd13e, 0xd195, 0xd1a3, 0xd136, 0x2318, 0x5111, 0xd133, 0xd0bf, 0xef76, 0xe84b, 0x511a, 0xde0b, 0x50a0, 0xd193, 0xd1a9, 0xd183, 0xea30, 0xeac8, 0xd190, 0xd17d, 0xd182, 0xd1cf, 0x50a0, 0xd178, 0xd158, 0xd0a4, 0xd0f6, 0xd15f, 0xecd5, 0xd17b, 0xe94d, 0x6ac4, 0xead3, 0x4fb4, 0x4fb6, 0x50c6, 0xd1bd, 0x50c6, 0xd1bb, 0xd10d, 0xd113, 0xd1cb, 0x4655, 0xc670, 0x514a, 0xd1d8, 0xd138, 0xd1c0, 0xd110, 0x5191, 0xead5, 0x510f, 0xd1df, 0x514a, 0xd1c8, 0xd0ed, 0xd0ea, 0xd1e2, 0xc66f, 0x510f, 0xd1d3, 0xd114, 0xd1dc, 0xa367, 0x9e34, 0xd1f0, 0xd1ed, 0xcdfb, 0x23f0, 0xa76e, 0xdf3f, 0x9e0e, 0xa174, 0x1e3e, 0x3319, 0xb4e7, 0xb5e7, 0x3368, 0xd20e, 0xd20d, 0xd213, 0xd210, 0x5217, 0x62ea, 0xe4fa, 0x5216, 0x62ea, 0xe4fa, 0xe928, 0xd264, 0xd239, 0x523b, 0xd26b, 0xd266, 0xd259, 0xb7c1, 0xd24a, 0xd229, 0x522e, 0xd26b, 0xd236, 0xd231, 0xba2f, 0x3a79, 0xd26a, 0xd223, 0xd230, 0x3a79, 0xd263, 0x522e, 0xd23b, 0xd271, 0x26cf, 0xd270, 0x5276, 0x5277, 0x5c53, 0xdc54, 0x5273, 0x5277, 0x5c53, 0xdc54, 0x5273, 0x5276, 0x5c53, 0xdc54, 0xd279, 0xd278, 0x49c7, 0x52b8, 0x541f, 0x54fa, 0xd5dd, 0xcbc0, 0x4f8a, 0xcf8b, 0xd28c, 0xd28b, 0xa349, 0xd58c, 0xd56a, 0xd606, 0xd2b2, 0xd2b1, 0x49c7, 0x527a, 0x541f, 0x54b7, 0x54fa, 0x5553, 0xd5dd, 0xa20d, 0xd4ef, 0x1e42, 0xa208, 0xd466, 0xd5f6, 0xd3a7, 0xd407, 0xd4bc, 0xd2e7, 0x26cc, 0x4526, 0x4a4c, 0x5607, 0xd613, 0xd351, 0xd2e2, 0xd2e1, 0xd2ce, 0xa040, 0x55b2, 0xd60b, 0xd393, 0xd3f0, 0x4b35, 0xcbc4, 0x2179, 0xd332, 0xd396, 0xd622, 0xd526, 0xa84b, 0xc162, 0xd354, 0x4e6d, 0xd812, 0xcd65, 0xd438, 0x2179, 0xd30a, 0xd34a, 0xd395, 0xd346, 0x1f9f, 0xd5a6, 0xd2d0, 0xd318, 0x2e84, 0xd38a, 0xd598, 0xd3a2, 0xd558, 0xd4fd, 0xd434, 0xd54e, 0xd588, 0x5415, 0xd5ba, 0x46ea, 0x5569, 0xd62f, 0x3804, 0xb9ae, 0xd477, 0xbece, 0xc296, 0xc192, 0xd541, 0xd5ce, 0xd4c0, 0xd52d, 0xd552, 0xd452, 0xd464, 0x546f, 0x55ac, 0xd5e5, 0xdc46, 0xb357, 0xd510, 0x3d96, 0xd49e, 0x2e84, 0xd358, 0xd2fa, 0xd347, 0xd30e, 0xa50d, 0xd35a, 0xd2cb, 0xd40a, 0xd4ee, 0xd494, 0xd435, 0xd3df, 0xd59f, 0x4372, 0xca6b, 0xd555, 0xc469, 0x6d2c, 0x6daf, 0xee0e, 0x5493, 0xd4f4, 0xd3be, 0xd3bd, 0xd458, 0xb79c, 0x235c, 0xd514, 0xd3b5, 0xa807, 0x234e, 0x2d0b, 0xd550, 0xd2fd, 0xd506, 0x2eb5, 0x544a, 0xd4ed, 0xd445, 0xd2cc, 0xd3b1, 0xd420, 0xd4f1, 0x5360, 0xd5ba, 0xd600, 0xd63f, 0x49c7, 0x527a, 0x52b8, 0x54fa, 0xd5dd, 0xd40c, 0x56cd, 0xd7a2, 0x25b6, 0xc1df, 0xce08, 0xd56d, 0xd5a9, 0x9e07, 0x557f, 0x55fc, 0xd610, 0xd35d, 0xd3b4, 0xd330, 0xd55a, 0xd3f9, 0xa3f6, 0x2eb5, 0x53f4, 0xd4ed, 0xd36d, 0xc740, 0xd3d1, 0xb939, 0xd593, 0x46d6, 0xd4cb, 0xd36e, 0xd2c7, 0xd58a, 0xa85f, 0xb934, 0xd36f, 0xd525, 0xd364, 0xd515, 0xcbc6, 0xd546, 0xd562, 0xd523, 0xd51e, 0xb41c, 0x53bc, 0xd4f4, 0xd3b3, 0x31de, 0x3e95, 0x3fdb, 0xc7c7, 0x3d96, 0xd385, 0xaf60, 0xd533, 0xd2b8, 0xd2cd, 0xd36a, 0xae2d, 0x46d6, 0xd462, 0x4c11, 0xcc14, 0xd5cd, 0xd58a, 0xd63a, 0xd577, 0xe3a3, 0xea40, 0x2eb5, 0x53f4, 0xd44a, 0xd3b2, 0xd2c1, 0xd40d, 0x53bc, 0xd493, 0x49c7, 0x527a, 0x52b8, 0x541f, 0xd5dd, 0xd35c, 0x298d, 0xa9f8, 0xd3f1, 0xd37b, 0xd84a, 0x235c, 0xd3d4, 0xd482, 0xd48c, 0xd48b, 0xd471, 0xd311, 0xd36b, 0xd5bc, 0xd53b, 0xd4a8, 0xeebb, 0x2328, 0xd5cf, 0x4ba6, 0xcc00, 0xd594, 0xd61e, 0xd5fa, 0xd532, 0x55f9, 0xdb6a, 0xd368, 0xd487, 0x554b, 0xd602, 0x554a, 0xd602, 0xd35e, 0x234e, 0xd3ef, 0xd36c, 0xd2b8, 0xd3b8, 0xd35b, 0xd43c, 0xd489, 0xd361, 0xd29c, 0xd427, 0xd580, 0xd604, 0x55f4, 0xd60a, 0xd4e3, 0x5431, 0x55fc, 0xd610, 0xd570, 0xd35f, 0x546a, 0xd4df, 0xd297, 0xa9dc, 0xd460, 0xd537, 0x26ed, 0xa712, 0xd359, 0xd3b6, 0x1f9f, 0xd350, 0xd428, 0x55b0, 0xd60d, 0x536f, 0xd5e5, 0xca17, 0x4c54, 0xd5ea, 0xd5f7, 0x55ab, 0xd60d, 0x52f9, 0xd60b, 0x5360, 0xd415, 0xd52f, 0x4a01, 0x4a3e, 0x4a3f, 0xd5f3, 0x1e1b, 0x23e2, 0x3a37, 0xbb09, 0x201f, 0x2fa3, 0xd024, 0xd4dd, 0xd369, 0x2328, 0xd535, 0xd61a, 0x49c7, 0x527a, 0x52b8, 0x541f, 0xd4fa, 0x563d, 0xd646, 0xcc58, 0x536f, 0xd5ac, 0x4c54, 0xd5ae, 0x4a01, 0x4a3e, 0x4a3f, 0xd5c1, 0x5574, 0xd60a, 0xd2c8, 0xd5af, 0x553c, 0xdb6a, 0xd53a, 0x5431, 0x557f, 0xd610, 0xd41a, 0x554a, 0xd54b, 0xd572, 0xd2a6, 0x4526, 0x4a4c, 0x52cf, 0xd613, 0x5574, 0xd5f4, 0x52f9, 0xd5b2, 0x55ab, 0xd5b0, 0x6a65, 0xeaa5, 0x5431, 0x557f, 0xd5fc, 0x52cf, 0xd607, 0xba97, 0xd5d3, 0xd539, 0xd30f, 0xa170, 0x46ea, 0xd361, 0xd4e0, 0x55df, 0xd646, 0xd41d, 0xa914, 0x55df, 0xd63d, 0x1e55, 0xd65d, 0xd65c, 0xb16e, 0xc307, 0x21e6, 0xa904, 0xa47c, 0x565a, 0xd65b, 0x5657, 0xd65b, 0x5657, 0xd65a, 0xd64f, 0x1e55, 0xd64e, 0xa3f7, 0xd666, 0xd665, 0x9e8f, 0x567a, 0xd7f2, 0xd66f, 0xd7e3, 0xd66c, 0xd768, 0x2b83, 0xd6c7, 0xd66b, 0xd771, 0xe6d6, 0xd766, 0xd806, 0xd755, 0xd7fb, 0xd79e, 0xd801, 0x57a1, 0xd7c1, 0xd739, 0xd72f, 0x5745, 0x5836, 0xd83a, 0xd788, 0xd6d4, 0xd814, 0xd6ba, 0xec8d, 0xd706, 0xd6d4, 0xd6a6, 0x2b83, 0xd675, 0xd831, 0x5424, 0xd7a2, 0x5807, 0xd823, 0xd7f6, 0x5698, 0x56b4, 0xd716, 0xef03, 0xd83b, 0xd7a7, 0xd7c4, 0xd6fa, 0xd7ef, 0xd784, 0xd810, 0xd6f1, 0xd715, 0x5c9d, 0xdd1d, 0xd82d, 0xd6ac, 0xd782, 0xd6fb, 0xd6d4, 0xd778, 0x574b, 0xd81f, 0xd68c, 0xd68b, 0xeb4e, 0x5695, 0x5836, 0xd83a, 0x577f, 0xd805, 0xd7c8, 0xd7ec, 0x5721, 0xd81f, 0xd80d, 0xd680, 0xc32c, 0xd815, 0xd67e, 0xd671, 0xc33f, 0xd67b, 0xd717, 0xd7bb, 0xd811, 0x5747, 0xd805, 0xd7bf, 0xd70b, 0xd6f3, 0xd696, 0xd78e, 0xd78d, 0xd7fb, 0x5827, 0xd839, 0xd682, 0xd68a, 0x5424, 0xd6cd, 0x3594, 0xb59e, 0xd6ef, 0xd7ce, 0xd77c, 0xd780, 0xd68a, 0xd6f0, 0xd7c7, 0xd7c6, 0xd748, 0xd7a8, 0xd828, 0xd80e, 0xd66e, 0xd749, 0xd6f2, 0xd66b, 0xd6cf, 0xd821, 0xd80f, 0x5681, 0xd798, 0xd683, 0x5747, 0xd77f, 0xd67f, 0x56ce, 0xd823, 0xd74e, 0xd7d2, 0xd7f9, 0xd6f4, 0xd77e, 0x4d78, 0x4e6d, 0xd327, 0xd69d, 0xd761, 0x5721, 0xd74b, 0xd7f8, 0xb0f7, 0x56ce, 0xd807, 0x5799, 0xd839, 0xd7cf, 0xd702, 0xd6ca, 0x5695, 0x5745, 0xd83a, 0x5799, 0xd827, 0x5695, 0x5745, 0xd836, 0xd6ee, 0x4383, 0xdc9c, 0xd844, 0xd842, 0xe1c1, 0x1e51, 0x1f17, 0xc73e, 0x24af, 0xa580, 0xd511, 0xb72f, 0x2563, 0x5858, 0xe29c, 0xa40c, 0xadf7, 0x2563, 0x5854, 0xe29c, 0xd0e1, 0x236b, 0xd85e, 0x2675, 0x585f, 0xe053, 0xa1b2, 0x236b, 0xd85b, 0x2675, 0x585c, 0xe053, 0xd864, 0xd863, 0xd8dc, 0xe336, 0xd96f, 0xd89e, 0xa3ea, 0xd8b5, 0xd956, 0x2acb, 0x2b1d, 0xd8ca, 0xd918, 0xae12, 0x596a, 0x67c8, 0xe7e4, 0xd86e, 0x3bd3, 0xd0b2, 0xd972, 0xeef9, 0xd94f, 0x4d5d, 0xd8e4, 0xd87d, 0xd8cc, 0xd8dd, 0xd960, 0xd90c, 0xd885, 0xd8b7, 0x58e1, 0xe1cc, 0xd8e0, 0xd865, 0xd8c5, 0xd8d9, 0x58cf, 0xe1cc, 0xd933, 0xd95d, 0x58b4, 0xd932, 0xd947, 0x5912, 0xd943, 0xb707, 0xd92b, 0xd8f5, 0xd8f4, 0xa236, 0xa90d, 0xb0fc, 0xd8c8, 0xd90f, 0xd90e, 0x58e6, 0xd943, 0xcde5, 0xd886, 0xd938, 0xd94c, 0xd8ed, 0xd8e4, 0xd8e2, 0xd964, 0xd91b, 0x9eb5, 0x58e6, 0xd912, 0xd8e5, 0xd91d, 0xb742, 0xd8af, 0xd974, 0xd884, 0xd8e3, 0xd8c6, 0xd934, 0xd89c, 0xb446, 0xb4f7, 0xd86c, 0xd8ad, 0x5955, 0xd97d, 0xd974, 0x2364, 0xa365, 0x290d, 0xafa9, 0xe738, 0xb838, 0x4f87, 0x4f88, 0xd98a, 0x4f81, 0x4f87, 0x4f88, 0xd989, 0xd9c1, 0xaf01, 0xd9c3, 0xd9c4, 0x599a, 0x59ba, 0xd9c9, 0x5994, 0xd9c5, 0x5993, 0xd9c5, 0x470e, 0xd9c6, 0xd9c7, 0x5990, 0x59ba, 0xd9c9, 0xd9cb, 0xd9cd, 0xd9ce, 0x59bd, 0xd9c8, 0xc779, 0x9eb2, 0xd9ca, 0xd9cf, 0xd9b7, 0xd9d0, 0x59c0, 0xd9c2, 0xd9bc, 0x59b0, 0xd9d1, 0x358d, 0x5990, 0x599a, 0xd9c9, 0xd9b6, 0x59a7, 0xd9c8, 0xd9cc, 0x59b3, 0xd9c2, 0xd98b, 0x59b3, 0xd9c0, 0xd98e, 0xd98f, 0x5993, 0xd994, 0x470e, 0xd996, 0xd998, 0x59a7, 0xd9bd, 0x5990, 0x599a, 0xd9ba, 0xd9ac, 0xd9a1, 0xd9bf, 0xd9a5, 0xd9a6, 0xd9af, 0xd9b2, 0xd9b7, 0xcb4b, 0x59ef, 0xd9f6, 0xb2b5, 0xd9f4, 0xd9e7, 0xd9f8, 0xd9e3, 0x59d7, 0xd9f6, 0xd9de, 0x59d7, 0xd9ef, 0xd9e6, 0x59fd, 0xd9ff, 0x59f9, 0xd9ff, 0x59f9, 0xd9fd, 0x5a01, 0xdba0, 0x5a00, 0xdba0, 0xdba2, 0xdba3, 0xdba1, 0xdbaf, 0xdba7, 0xdba8, 0xdba6, 0xdbb1, 0xdbad, 0xdbaa, 0xdbab, 0x3258, 0xdbac, 0xdbb0, 0xdabe, 0xdbb9, 0xdbb6, 0xdbbc, 0x47e4, 0xc7e7, 0x241f, 0xa656, 0xbb23, 0xdbc0, 0xdbb7, 0xdbbb, 0xdbbf, 0x9fe1, 0xdbbe, 0xdbb8, 0x5b6f, 0xdbd1, 0xdbc9, 0x24ec, 0xdbc3, 0xdbca, 0xbce8, 0x5b49, 0xdbc1, 0xda6c, 0xdbc2, 0x2467, 0xdbcb, 0x246a, 0xa492, 0xa46d, 0xdbb5, 0xdbc8, 0xdbd2, 0xdbcf, 0xdbc4, 0xdbd0, 0xdbc7, 0xdbce, 0xdbc5, 0xdbcd, 0xdb8b, 0xa48f, 0xdbe9, 0xdbe2, 0xdbe3, 0xdbd5, 0xabdf, 0xdbd7, 0xdbe7, 0x5a3d, 0xdbdf, 0xdbe1, 0xdbe0, 0xdbd8, 0x5b6e, 0xdbdd, 0xdbe5, 0xdbe6, 0xdbdc, 0xdbd9, 0xdbd6, 0xdbd4, 0xdbdb, 0xdbd3, 0xa938, 0xdb7d, 0xdb04, 0xafd7, 0xdba4, 0xdbf3, 0xdbf6, 0xdbde, 0x3096, 0xb102, 0x2500, 0xdbf1, 0xdbee, 0xdbed, 0xdbda, 0xdbeb, 0xdbec, 0xdbef, 0xdbf0, 0xdbf5, 0xdbf2, 0x5aac, 0xdbf4, 0x5aaa, 0xdbf4, 0x5b80, 0xdbfb, 0xa531, 0xdc01, 0xdbfe, 0xdc07, 0xdbfd, 0x4ae9, 0xdc0a, 0xda1a, 0xdc03, 0xdc04, 0xdc06, 0xdc08, 0xdbff, 0xdbf7, 0x5aeb, 0xdc0f, 0xdbe4, 0xdbf9, 0xdbfc, 0xdc05, 0xdbba, 0xdc02, 0xdc00, 0xdc0d, 0xdc1e, 0xdc1d, 0x5afc, 0xdc16, 0x5b1a, 0xdc25, 0xdbe8, 0x5b8d, 0xdc14, 0xdc1b, 0xdc10, 0xdb5c, 0x5acc, 0xdc0f, 0x242f, 0x2518, 0x2553, 0x2554, 0x255f, 0xe5d9, 0xdc15, 0xdc18, 0xdbb3, 0x3697, 0xdc19, 0xdc0c, 0x5bbd, 0xe8a8, 0xdbf8, 0xdc1a, 0x5ae0, 0xdc16, 0xdbfa, 0xdc0b, 0xdc12, 0xdc13, 0xda8a, 0xdbcc, 0xdc0e, 0xbb4c, 0xdc1c, 0xdc27, 0xdc11, 0xdc21, 0xdc24, 0xdc26, 0x5ae1, 0xdc25, 0xdbb2, 0xdc22, 0x5b21, 0xdc23, 0x5b20, 0xdc23, 0xdc1f, 0xa546, 0x5b81, 0xdc2a, 0xdc2c, 0x5b7e, 0xdc2b, 0xa5f9, 0xdbb4, 0xdc28, 0x247c, 0xa611, 0xdc29, 0x24d7, 0xa629, 0x5a3c, 0xdbc1, 0xdbb9, 0xdc32, 0xdba5, 0xa642, 0x5b5b, 0xdc2e, 0xdbc6, 0xdc2f, 0xdc2d, 0x5b56, 0xdc2e, 0x5ae9, 0xdc31, 0xa66a, 0x553c, 0xd5f9, 0x2661, 0xdc35, 0xbbc1, 0x5a71, 0xdbdd, 0x5a33, 0xdbd1, 0xdbae, 0xa584, 0x5b93, 0xdba9, 0xdc34, 0xb2a4, 0xdbea, 0x46d1, 0xc6e3, 0xda89, 0x5b2d, 0xdc2b, 0x5aad, 0xdbfb, 0x5b2b, 0xdc2a, 0x5b9a, 0xdd5e, 0xdc09, 0x23d8, 0xa909, 0xda5f, 0x2bb4, 0xe1bc, 0x5ae4, 0xdc14, 0x1ec7, 0x5b90, 0xe6e0, 0x5b8e, 0xe6e0, 0xdc17, 0x5b72, 0xdba9, 0xdc30, 0xdc36, 0x5b83, 0xdd5e, 0xdc20, 0xdc33, 0x5a00, 0xda01, 0xda08, 0xda02, 0xda03, 0xda8d, 0xdb4f, 0xda10, 0xda0c, 0xda0e, 0x5b72, 0xdb93, 0xda15, 0xda16, 0x3258, 0xda17, 0xda13, 0xdb70, 0xda0a, 0xda18, 0xda12, 0xdb1b, 0xdaf1, 0xdb33, 0xda4e, 0xda1d, 0xda25, 0xda31, 0x5a1b, 0xdb4c, 0xdad6, 0xda29, 0xda1f, 0x5af7, 0xe8a8, 0xda2d, 0xda2a, 0xda23, 0x5a3c, 0xdb49, 0xda41, 0xda36, 0xda55, 0xda5b, 0xdb58, 0xda57, 0xda50, 0xda34, 0xda3a, 0xda46, 0xdb05, 0xda5e, 0xda58, 0xda54, 0xda56, 0x5a33, 0xdb6f, 0xda52, 0xda86, 0xda84, 0xda66, 0xda7f, 0xda69, 0xda70, 0xda7c, 0xdaa0, 0xda85, 0xda75, 0x5a71, 0xdb6e, 0xda95, 0xda6c, 0xda6e, 0xda6d, 0xda62, 0xda63, 0xdacd, 0xda72, 0xda73, 0xda6b, 0xdae2, 0xda61, 0xdb78, 0xdaa1, 0xdaa3, 0xda9e, 0xda9a, 0x309e, 0xdaa4, 0xdaa5, 0x2500, 0xda98, 0xdaa8, 0xda91, 0x5aaa, 0xdaac, 0xdaa6, 0xda92, 0xdacb, 0xdaf8, 0xdacf, 0xdafe, 0x5aad, 0xdb80, 0xdad1, 0xdab9, 0xdab2, 0xdac9, 0xdadb, 0xdab0, 0xdad7, 0xdabf, 0xdac2, 0xdad2, 0xdac4, 0xdab6, 0xdac7, 0xdb85, 0x4ae9, 0xdabc, 0xdb00, 0xdaf6, 0xdadc, 0xdb0a, 0x5acc, 0xdaeb, 0xdae7, 0xdb14, 0xdb01, 0xdb02, 0x5ae4, 0xdb8d, 0xdaed, 0x5ae0, 0xdafc, 0xdb92, 0xdaee, 0x3697, 0xdaf3, 0xdafa, 0xdae6, 0xdb0e, 0xdade, 0xdadd, 0xdb28, 0xdb9c, 0xdb16, 0xdb1d, 0x5b20, 0xdb21, 0xdb17, 0x5ae1, 0xdb1a, 0xdb19, 0xdb10, 0xdb39, 0xdb3e, 0x5b2b, 0xdb81, 0x5b2d, 0xdb7e, 0xdb2c, 0xdb5a, 0x5b56, 0xdb5b, 0xdb59, 0xdb95, 0xdb5c, 0xdb4e, 0xdb9e, 0xdb74, 0xdb6b, 0xdb96, 0x4a40, 0xccd3, 0xac88, 0x3e13, 0x3eaa, 0xdc40, 0x3e13, 0x3eaa, 0xdc3f, 0xd373, 0xac82, 0x1e30, 0x5c50, 0x673b, 0xe74a, 0x4ad6, 0xcaea, 0x1e30, 0x5c4a, 0x673b, 0xe74a, 0x5273, 0x5276, 0x5277, 0xdc54, 0x5273, 0x5276, 0x5277, 0xdc53, 0xdc5a, 0xdc58, 0xdc87, 0x9e88, 0xc32a, 0xdc76, 0xdc6e, 0xc2b2, 0xc2b4, 0xdc94, 0xc2c9, 0xef26, 0xdc64, 0xc2e2, 0xc2b4, 0xc683, 0x42f8, 0xc30d, 0xc30a, 0xc32f, 0xc32b, 0xdc7c, 0xc34f, 0xc37e, 0x4383, 0xd83c, 0x56fd, 0xdd1d, 0xdd1e, 0x2458, 0x24e1, 0xdd20, 0xdd1f, 0x321d, 0xdd22, 0xdd21, 0xdd2b, 0xdd27, 0xdd29, 0xdd2a, 0xdd2f, 0xdd23, 0x2295, 0x5cea, 0xdd28, 0x2f10, 0x5cb3, 0xdd30, 0xdd2e, 0xdd33, 0xdd40, 0x2f10, 0x5cae, 0xdd30, 0xdd35, 0xdd2c, 0x9e70, 0xdd37, 0xdd36, 0xdd39, 0xdd34, 0xdd3b, 0xdd38, 0xdd3a, 0xdd32, 0xdd42, 0xdd41, 0xdd3f, 0xdd45, 0xdd44, 0xdd3e, 0x2379, 0xb064, 0xdd3c, 0xc68e, 0x5d13, 0xdd43, 0x5ce4, 0xdd31, 0xdd48, 0xdd4a, 0x2bbe, 0xdcd4, 0x2bbe, 0xdcd3, 0xdd47, 0xdd4a, 0xdd52, 0xdd49, 0x5d0a, 0xdd5e, 0xdd50, 0xdd4f, 0xdd54, 0x4d9a, 0x4e8c, 0xdd53, 0x5d12, 0xdd24, 0x2356, 0xa8f2, 0x5cce, 0xdd31, 0xdd4b, 0xdd55, 0x2295, 0x5cad, 0xdd28, 0xdd4d, 0xdd26, 0xdd4c, 0xa046, 0x5d56, 0xe83c, 0xdd57, 0x5d4d, 0xef4e, 0xdd5a, 0xdd59, 0xdd2d, 0xdd5b, 0xdd5c, 0x3557, 0xdd25, 0xdd3d, 0xdd58, 0xdd5f, 0xdd60, 0x5cdb, 0xdd5e, 0x2050, 0x5d17, 0xdd5d, 0xdd61, 0xdd62, 0xdd46, 0x5ce2, 0xdd24, 0x5ccd, 0xdd43, 0xdd51, 0xdd4e, 0x2050, 0x5d0b, 0xdd5d, 0xdd63, 0xdd43, 0x56fd, 0xdc9d, 0xdc9e, 0xdca0, 0x2458, 0x24e1, 0xdc9f, 0xdca2, 0x321d, 0xdca1, 0xdcac, 0x5ce2, 0xdd12, 0x3557, 0xdd01, 0xdcec, 0xdca8, 0x5cad, 0xdcea, 0xdca9, 0xdcaa, 0xdca7, 0xdcb6, 0xdcfc, 0xdcaf, 0xdcab, 0x2f10, 0x5cae, 0xdcb3, 0x5cce, 0xdce4, 0xdcc1, 0xdcb0, 0xdcbc, 0xdcb4, 0xdcba, 0xdcb8, 0xdcbf, 0xdcbb, 0xdcc0, 0xdcbd, 0xdcca, 0xdd04, 0xdcc8, 0xdcc4, 0xdcb2, 0xdcc3, 0xdcc2, 0x5ccd, 0x5d13, 0xdd1c, 0xdcc7, 0xdcc5, 0xdd10, 0xdcd5, 0xdcd1, 0xdcda, 0x5cd2, 0xdcd6, 0xdce6, 0xdced, 0x5ceb, 0x5cf7, 0xef4e, 0xdd16, 0xdcde, 0xdcdc, 0xdd14, 0xdcd9, 0xdce1, 0xdce0, 0xdce7, 0x5cf4, 0xe83c, 0xdcf5, 0xdd05, 0xdcfb, 0xdcfa, 0xdcfd, 0xdcfe, 0x2050, 0x5d0b, 0xdd17, 0x5b83, 0x5b9a, 0x5cdb, 0xdd0a, 0xdd07, 0xdd08, 0xdd0d, 0xdd0f, 0xdd1b, 0x407b, 0xc0fe, 0xdd6c, 0xdd6a, 0xdd71, 0xdd70, 0xdd99, 0xdd95, 0x2c1f, 0x2c20, 0x6bae, 0x6c7b, 0xec9c, 0xdfdf, 0xdd82, 0xdd81, 0xdda8, 0xdda6, 0xdd76, 0xdd75, 0xdd91, 0xdd8b, 0xde7a, 0x5dc3, 0xde8d, 0xddb2, 0xddb1, 0xde89, 0xde38, 0x5daf, 0xde8d, 0xde4c, 0xde92, 0xdff9, 0xddfa, 0xde29, 0xde10, 0xde82, 0xde7a, 0xde55, 0xde9a, 0xdde5, 0xde8b, 0xac40, 0x50eb, 0xd11b, 0x458e, 0xc58f, 0xde34, 0x511a, 0xd173, 0xde8a, 0xddf5, 0xde64, 0xddf4, 0xde64, 0xc8b0, 0xde93, 0xde91, 0xcaac, 0xde0a, 0xddbb, 0xde4f, 0x5e79, 0xdea2, 0xddc4, 0xde44, 0xdea1, 0xde63, 0xddf8, 0xdff9, 0xde52, 0x5e28, 0xde2a, 0x5e8a, 0xde95, 0x5e4b, 0xdea2, 0x5dac, 0xddf7, 0xdea5, 0xddf6, 0xde84, 0xde83, 0xa8b8, 0xddb8, 0x5e0c, 0x5e70, 0xde95, 0x5dfb, 0xe6ae, 0x5daf, 0xddc3, 0xdeaa, 0xde2f, 0xddde, 0xde2c, 0x5e70, 0xde8a, 0xdeaa, 0xddf9, 0xdea6, 0xde51, 0x5e4b, 0xde79, 0xde7f, 0xde9c, 0x5e8f, 0xde99, 0xdeb3, 0xd03d, 0xdec0, 0x1f53, 0x5ec6, 0x6ab5, 0xead4, 0xdeb2, 0xdeb1, 0xdeac, 0xdeaf, 0x5040, 0x504c, 0xd077, 0x1f53, 0x5eb0, 0x6ab5, 0xead4, 0xdf66, 0xdf67, 0xdf68, 0xa19b, 0xdf6a, 0xdf69, 0xdf6b, 0x3799, 0x5ef6, 0xdf6d, 0xdf6f, 0x5f49, 0xdf6c, 0x5f5f, 0xdf70, 0xdf77, 0xdf78, 0x5f29, 0xdf88, 0xdf71, 0x3799, 0x5edb, 0xdf6d, 0xdf74, 0xdf75, 0xdf7a, 0xdf72, 0xdf76, 0x5f15, 0xdf7b, 0xdf7c, 0xdf5c, 0xdf83, 0xdf82, 0xdf81, 0xdf80, 0xdf7d, 0xdf7e, 0x5f1b, 0xdf86, 0xdf36, 0x5f19, 0xdf84, 0xb33d, 0x1fcc, 0xdf85, 0x5efd, 0xdf7b, 0x5f12, 0xdf84, 0x5f0c, 0xdf86, 0x5f3a, 0xdf8e, 0xdf89, 0xdf8b, 0xdf8d, 0xdf57, 0xdf8a, 0xdf87, 0x5ef0, 0xdf88, 0xdf6e, 0xdf8c, 0xdf6f, 0xdf91, 0xdf8f, 0xdf0f, 0xdf93, 0x5f1c, 0xdf8e, 0xdf90, 0xdf92, 0xdf97, 0xd206, 0x67b1, 0x67dc, 0xe7ec, 0xbbc2, 0x5f96, 0xe38b, 0xdf95, 0xdf98, 0x5ee2, 0xdf6c, 0xdf99, 0xdf7f, 0xdf9a, 0xdf21, 0xdf00, 0x5ee3, 0xdf70, 0xdf94, 0xdf79, 0xdf73, 0xdeca, 0xdecb, 0xdecc, 0xded2, 0xded1, 0xded4, 0x5ee2, 0xdf49, 0x3799, 0x5edb, 0xdef6, 0xdf2a, 0x5edf, 0xdf2d, 0x5ee3, 0xdf5f, 0xdef2, 0xdefb, 0xdf64, 0xdef8, 0xdef9, 0xdefc, 0xdee4, 0xdeeb, 0xdf62, 0xdefa, 0x5efd, 0xdf15, 0xdefe, 0xdf09, 0xdf0a, 0xdf4e, 0xdf08, 0xdf07, 0xdf05, 0xdf03, 0x5f12, 0xdf19, 0xdf14, 0x5f0c, 0xdf1b, 0xdf26, 0x5ef0, 0xdf29, 0xdf1d, 0xdf25, 0xdf1e, 0xdf2c, 0xdf1f, 0x5f1c, 0xdf3a, 0xdf33, 0xdf3b, 0xdf2f, 0xdf3c, 0xdf38, 0xdf61, 0xdf45, 0xdf44, 0xdf3e, 0xdf46, 0xdf4d, 0xdf54, 0x5f9e, 0x5fa4, 0xdfad, 0x5f9d, 0x5fa4, 0xdfad, 0xe5e2, 0x3683, 0xcf6a, 0x2f01, 0x5fa9, 0xdfaf, 0x5f9d, 0x5f9e, 0xdfad, 0xa29e, 0x2f01, 0xdfa8, 0x2f01, 0xdfa7, 0x2f01, 0x5fa1, 0xdfaf, 0xdfae, 0x5f9d, 0x5f9e, 0xdfa4, 0xdfab, 0x2f01, 0x5fa1, 0xdfa9, 0xa19c, 0xdfb6, 0xdfb5, 0x5fba, 0x6089, 0xe08a, 0x5fb9, 0x6089, 0xe08a, 0xe07c, 0x6039, 0xe054, 0xe077, 0xdfc3, 0xdfc2, 0xdfe4, 0xe04e, 0xe081, 0x231d, 0xae00, 0xe04b, 0xe084, 0xe019, 0xe032, 0xe060, 0xe055, 0xe023, 0x5d7f, 0x6045, 0xe072, 0xdfc6, 0xe008, 0xe087, 0xaef8, 0xaf80, 0xe003, 0x2f84, 0x2f91, 0xe015, 0x26d8, 0x26de, 0x26ec, 0x2efb, 0x2efd, 0xe025, 0x5de1, 0xde5f, 0x1e43, 0xaefc, 0xe069, 0xdfef, 0xdfe5, 0xe078, 0xe05c, 0xe052, 0x6013, 0xe05e, 0x6012, 0xe05e, 0x2f84, 0x2f91, 0xdff3, 0xdfd9, 0xdfde, 0x26d8, 0x26de, 0x26ec, 0x2efb, 0x2efd, 0xdff4, 0xe090, 0xa954, 0x3e38, 0xe04a, 0xa468, 0xdfdb, 0x5fbe, 0xe054, 0xe060, 0xe08f, 0xa06a, 0xe06f, 0x5fdf, 0xe072, 0x1fa6, 0xa075, 0x3e38, 0xe030, 0xdfd0, 0xdfc7, 0xe00e, 0x2675, 0x585c, 0xd85f, 0x5fbe, 0xe039, 0xdfdd, 0xe07a, 0xe065, 0xe00a, 0x6012, 0xe013, 0x5fdc, 0xe03a, 0xbeaf, 0xe059, 0xe002, 0xe041, 0x5fdf, 0xe045, 0xced5, 0xdfc1, 0xe009, 0xe057, 0xdfbd, 0xdfc8, 0xdfd8, 0xdfe9, 0x5fb9, 0x5fba, 0xe08a, 0x5fb9, 0x5fba, 0xe089, 0xe03b, 0xe026, 0xe61d, 0xe127, 0xe13a, 0xe0ab, 0xb751, 0xe0a6, 0xe114, 0xe0f5, 0xe112, 0xe134, 0x23b8, 0x6130, 0xe6a3, 0xe0cc, 0x3b1d, 0x6b30, 0xeb31, 0xe0bd, 0x60d2, 0xe0de, 0xe0df, 0xe136, 0xe12d, 0x60ce, 0xe0de, 0xe106, 0x60ce, 0xe0d2, 0xe0cf, 0xe148, 0xe116, 0xe0f6, 0xe0ae, 0xe0e8, 0x1e61, 0x6109, 0x610a, 0xe115, 0xe132, 0xe0d3, 0x1e61, 0x60f7, 0x610a, 0xe115, 0x1e61, 0x60f7, 0x6109, 0xe115, 0xe0b9, 0xe0ac, 0x1e61, 0x60f7, 0x6109, 0xe10a, 0xe0e7, 0xe093, 0xe0d1, 0x23b8, 0x60bb, 0xe6a3, 0xe0f8, 0xe0ba, 0xe0d0, 0xe146, 0xe09d, 0xe147, 0x2398, 0x28e5, 0xaedb, 0xe147, 0xe137, 0x613c, 0xe142, 0xe0e6, 0x9e23, 0xe194, 0xe189, 0xb59f, 0x6196, 0xe19e, 0xe18b, 0x467a, 0x6197, 0xe1b1, 0x616c, 0xe1bb, 0xa5e0, 0x6167, 0xe1bb, 0x61a4, 0xe1ac, 0xe1c5, 0xe1c3, 0x61b8, 0xe1c0, 0xd14c, 0xe195, 0xe154, 0xe91f, 0xe162, 0x24b8, 0xee79, 0xe14b, 0xe187, 0x615d, 0xe19e, 0x467a, 0x6166, 0xe1b1, 0xb9bc, 0x1e11, 0xeb57, 0x615d, 0xe196, 0x6171, 0xe1ac, 0x233b, 0xbbc9, 0x6171, 0xe1a4, 0x467a, 0x6166, 0xe197, 0x617f, 0xe1c0, 0x6167, 0xe16c, 0x2bb4, 0xdb8c, 0x617f, 0xe1b8, 0xd845, 0xe17e, 0xe17d, 0x2bc0, 0xb3a1, 0x61ca, 0xe1cb, 0x61c8, 0xe1cb, 0x61c8, 0xe1ca, 0x58cf, 0xd8e1, 0x27dc, 0xa8c4, 0xa398, 0x61d2, 0xe485, 0x61d1, 0xe485, 0x61da, 0x61fb, 0xe486, 0xe487, 0xe48c, 0x2200, 0xa202, 0xe48a, 0xe489, 0xe48b, 0x61d3, 0xe1fb, 0xe1e1, 0xe488, 0x1e71, 0x9e82, 0xe1dc, 0x621f, 0xe493, 0xe490, 0xb263, 0xe48f, 0xe492, 0xe2e9, 0x2251, 0x2263, 0x2271, 0x228d, 0x228e, 0x2292, 0x2294, 0xe1fc, 0xe497, 0xe48d, 0xe495, 0xe48e, 0x61d3, 0x61da, 0xe486, 0x2251, 0x2263, 0x2271, 0x228d, 0x228e, 0x2292, 0x2294, 0xe1f0, 0xe4af, 0xe4ab, 0xe498, 0xe4ad, 0xe4a5, 0x625b, 0xe4c5, 0xe49a, 0xe4a0, 0xe49d, 0x6264, 0xe4a9, 0xe4a4, 0xe4a3, 0xe491, 0xe49e, 0xe4ae, 0x629e, 0xe4a7, 0xe1e3, 0xe49f, 0xe499, 0xe4ac, 0xe49b, 0xe4aa, 0xe3ba, 0x4089, 0xe46a, 0x6438, 0xe4ce, 0x6268, 0xe4cc, 0xe4c8, 0xe4b6, 0xe4c3, 0xe4b4, 0xe4b9, 0xe4cd, 0xe4b0, 0xe4b8, 0xe4c0, 0xe4bf, 0xe4be, 0x6295, 0x62e8, 0x6421, 0x6435, 0xe4c1, 0xe49c, 0xe4bb, 0xe4ca, 0xe4ca, 0xe4c9, 0x2228, 0xe4c7, 0xe4cb, 0xe4c2, 0xe4b7, 0xe4b3, 0xe4c6, 0x6206, 0xe4c5, 0xe4ba, 0xe348, 0x46cb, 0x4f3d, 0xe4b5, 0x620e, 0xe4a9, 0xe4b2, 0x622e, 0xe4cc, 0xe4bc, 0xe4bd, 0x47ff, 0x483f, 0x4926, 0x62db, 0xe45b, 0x6373, 0x6451, 0x6452, 0xe46c, 0xe4cf, 0xe4f0, 0xe4d2, 0xe4ec, 0xe4ea, 0xe4f6, 0xe4f3, 0xe4dc, 0xe4da, 0xe4e3, 0xe4e8, 0x6244, 0x62e8, 0x6421, 0xe435, 0xe4e2, 0xe4ed, 0x6443, 0xe4eb, 0x62bd, 0xe4e6, 0x2563, 0x5854, 0xd858, 0xe21e, 0xe4d1, 0xe4f7, 0xe4f1, 0xe4df, 0xe4f5, 0xe4e5, 0xe4d5, 0xe4ef, 0xe4d0, 0x6322, 0xe4b1, 0xe47e, 0xe4de, 0xc10a, 0x62ed, 0xe510, 0x4107, 0xe500, 0xe508, 0xe511, 0xe509, 0xe29b, 0xe4dd, 0xe512, 0xe50c, 0xe4a1, 0xe4e4, 0xe4d7, 0xe50b, 0xe4fb, 0x47ff, 0x483f, 0x4926, 0x6271, 0xe45b, 0xe50a, 0x646f, 0xe513, 0x6381, 0xe4d8, 0xe504, 0xe503, 0xe514, 0x6244, 0x6295, 0x6421, 0x6435, 0xe507, 0x61ef, 0xe4d3, 0x5216, 0x5217, 0xe4fa, 0x62b3, 0xe510, 0xe4d6, 0xe506, 0xe502, 0xe4fd, 0x6444, 0xe4f8, 0xe50d, 0xe52f, 0xe4a2, 0xe51e, 0x2f55, 0xe332, 0xe516, 0xe52b, 0xe529, 0x641a, 0xe4d4, 0xe525, 0xe515, 0xe51f, 0xe524, 0x637f, 0xe531, 0xe4ee, 0xe51b, 0xe52c, 0xe52d, 0xe51c, 0x62ad, 0xe4b1, 0xe526, 0xe51a, 0xe520, 0xe521, 0x40bc, 0x4149, 0xe34a, 0xe522, 0xe519, 0x2f55, 0xe304, 0xe530, 0xd868, 0xe486, 0xe4fc, 0xe3e8, 0xe51d, 0xe528, 0xe52a, 0xe494, 0xe534, 0x6260, 0xe533, 0x40bc, 0x4149, 0xe32c, 0xe505, 0xe540, 0xe537, 0xe4e1, 0xe496, 0x4145, 0xe53b, 0xe4ff, 0x6445, 0xe53d, 0xe538, 0xe532, 0xe518, 0xe539, 0x63d3, 0xe52a, 0xe53e, 0x6274, 0x6451, 0x6452, 0xe46c, 0xe52e, 0xe536, 0xe517, 0x649f, 0xe53a, 0xe319, 0xe2e3, 0xe541, 0xe53f, 0xe545, 0xe551, 0xdf44, 0x642e, 0xe570, 0x39c8, 0xd028, 0x3eb6, 0xc194, 0x63c1, 0xe501, 0xb7aa, 0xe549, 0xe524, 0xe548, 0x6543, 0xef12, 0xe4a8, 0xd4e5, 0x6402, 0xe54f, 0xe4e0, 0xe4e9, 0xe53c, 0xe550, 0x63ae, 0xe547, 0x63ad, 0xe547, 0xe552, 0xe54d, 0xe553, 0xe54c, 0xe228, 0xe54e, 0xe396, 0xe55e, 0xe55f, 0xe4fe, 0xe546, 0xe559, 0xe560, 0xe55d, 0xe36f, 0xe4ff, 0xe535, 0xe557, 0xe558, 0xe55b, 0x222c, 0x2257, 0x2277, 0xe4f2, 0x434d, 0xe55c, 0xe556, 0xe542, 0x63fd, 0xe508, 0xe33e, 0xe55a, 0xe4e7, 0xe564, 0xe56a, 0x63e5, 0xe508, 0x63a6, 0xe54f, 0xe4d9, 0xe4f4, 0xe563, 0xe4f9, 0xe566, 0xe561, 0xe50f, 0xe49f, 0xe56b, 0x630f, 0xe4d4, 0x6481, 0xe562, 0xe568, 0x6244, 0x6295, 0x62e8, 0x6435, 0xe4c1, 0xe50e, 0xe50f, 0xe544, 0xe54c, 0x638c, 0xe570, 0xe56f, 0xe56d, 0x6244, 0x6295, 0x62e8, 0x6421, 0xe4c1, 0xe56e, 0x622c, 0xe4ce, 0xe4db, 0xe571, 0x629a, 0xe4eb, 0x62f3, 0xe4f8, 0xe360, 0xe56c, 0xe554, 0x6274, 0x6373, 0x6452, 0xe46c, 0x6274, 0x6373, 0x6451, 0xe46c, 0xb7aa, 0xe572, 0xe527, 0x647d, 0xe4bb, 0x47ff, 0x483f, 0x4926, 0x6271, 0xe2db, 0x6909, 0xe95f, 0xe574, 0xe4c4, 0xe573, 0xa228, 0xe565, 0x4089, 0xe229, 0x6274, 0x6373, 0x6451, 0xe452, 0xe567, 0xe2df, 0xe4a5, 0xe575, 0xe576, 0x4f36, 0xcf50, 0xe54a, 0xe569, 0xe523, 0x645a, 0xe4bb, 0xe2ae, 0xa1ff, 0x641d, 0xe562, 0xe54b, 0x61d1, 0xe1d2, 0x61d3, 0x61fb, 0xe337, 0xe1d4, 0xe1dd, 0xe1d8, 0xe1d7, 0xe1d9, 0xe1d5, 0xe1f7, 0xe1fa, 0xe1e7, 0xe1e4, 0xe212, 0xe1e9, 0xe1e3, 0xe346, 0xe1f9, 0xe35a, 0xe1f5, 0xe203, 0xe223, 0xe208, 0xe226, 0xe245, 0xe20d, 0xe214, 0x6221, 0x637e, 0x6418, 0xe53a, 0xe209, 0xe2c7, 0xe2fc, 0xe211, 0xe210, 0x6205, 0xe470, 0xbb3d, 0xe21e, 0xe3a2, 0x620e, 0xe264, 0xe227, 0xe201, 0xe225, 0xe204, 0xe215, 0xe200, 0xe23a, 0x62ad, 0xe322, 0xe266, 0xe257, 0xe237, 0x46cb, 0x4f3d, 0xe262, 0xe233, 0xe255, 0xe23d, 0xe238, 0xe25e, 0x6246, 0x645a, 0xe47d, 0xe26c, 0xe26d, 0xe240, 0xe23f, 0xe23e, 0x6244, 0x6421, 0xe435, 0xe251, 0xe234, 0xe460, 0x6206, 0xe25b, 0xe25a, 0x2228, 0xe24b, 0xe230, 0xe249, 0x6247, 0xe248, 0xe24d, 0x622e, 0xe268, 0xe239, 0x622c, 0xe438, 0xe276, 0xe2ac, 0xe2a0, 0xe27a, 0xe2e9, 0x630f, 0xe41a, 0xe2aa, 0xe2ee, 0xe2cf, 0xe2e3, 0xe403, 0xe28d, 0xe43a, 0xe285, 0xe2c1, 0xe2b1, 0xe2a6, 0xe3a7, 0xe358, 0xe296, 0xe291, 0xe2cc, 0xe2a9, 0xe29b, 0xe3f5, 0xe293, 0xe3a9, 0xe27f, 0x629a, 0xe443, 0xe27b, 0xe298, 0xe31a, 0xe2ab, 0xe278, 0xe2a5, 0x222c, 0x2257, 0x2277, 0xe3df, 0xe283, 0xe40b, 0xe2a8, 0xe280, 0xe2a3, 0x62f3, 0xe444, 0xe412, 0x5216, 0x5217, 0xe2ea, 0xe2d9, 0xe338, 0xe2f1, 0xe3c8, 0x635e, 0xe3d7, 0xe2b7, 0xe396, 0xe2f0, 0xe2e5, 0x5021, 0xe2e4, 0xe34b, 0xe2ef, 0xe2e8, 0x62b9, 0x63e5, 0xe3fd, 0xe2bc, 0xe2dd, 0xe2d2, 0xe2c5, 0xe2f6, 0xe426, 0x6417, 0xe427, 0x62b3, 0xe2ed, 0xe2bb, 0xe2c3, 0xe2df, 0xe2e6, 0xe312, 0xe306, 0xe37a, 0xe369, 0xe32f, 0xe328, 0xe31b, 0xe321, 0xe340, 0xe301, 0xe315, 0xe329, 0xe32b, 0xe32e, 0xe47c, 0x6318, 0xe39a, 0xe310, 0xe326, 0xe455, 0xe341, 0xe308, 0x6343, 0xe36f, 0xe307, 0xe31f, 0xe320, 0xe375, 0xe2f8, 0xe333, 0xe319, 0xe365, 0xe348, 0xe347, 0xe3d8, 0xe376, 0xe354, 0xe364, 0xe36c, 0x637e, 0xe49f, 0xe35b, 0xe3aa, 0xe360, 0xe370, 0xe384, 0xe34d, 0xe382, 0xe3e4, 0xe3a1, 0xe428, 0xe387, 0xe3cc, 0x63ad, 0xe3ae, 0xe39b, 0xe398, 0xe477, 0xe482, 0x63b8, 0xe42b, 0xe3b3, 0xe3bf, 0x63a6, 0xe402, 0xe3ac, 0xe38a, 0xe3b0, 0xe3b5, 0xe44c, 0xe3e2, 0xe3dc, 0xe3dd, 0xe3cd, 0xe3f0, 0xe3de, 0xe3e1, 0xe3d1, 0xe3c3, 0xe3c7, 0xe3d0, 0xe414, 0x641d, 0xe481, 0xe410, 0xe3f7, 0xe465, 0xe413, 0xe46d, 0xe420, 0xe479, 0xe3f9, 0xe419, 0xe44a, 0xe433, 0xe436, 0xe432, 0x638c, 0xe42e, 0xe43f, 0xe454, 0xe463, 0xe45e, 0xe471, 0xe472, 0x1ee7, 0x214f, 0x6578, 0xe57f, 0x1ee7, 0x214f, 0x6577, 0xe57f, 0x1e45, 0x9e46, 0x1ee7, 0x214f, 0x6577, 0xe578, 0xe5e8, 0xe5e9, 0xe5ea, 0xe5eb, 0x6589, 0xe5ed, 0xe5ec, 0x6587, 0xe5ed, 0xaf00, 0xe5f6, 0xe5f3, 0x65a0, 0xe5f0, 0x6592, 0xe5f2, 0x6591, 0xe5f2, 0xe5f4, 0xe5f5, 0xe5f8, 0x65f9, 0xeb27, 0x658f, 0xe5f0, 0xe602, 0x2173, 0x65d7, 0xe5dc, 0xe601, 0xa408, 0xe600, 0xa4c4, 0xe5fa, 0xe5fd, 0xe603, 0xe606, 0xe5fe, 0x65b2, 0xe605, 0x65b1, 0xe605, 0x65c3, 0xe612, 0xe60a, 0x2266, 0xe609, 0xe60e, 0xe60f, 0xe60d, 0xe608, 0xe60c, 0x65b4, 0xe612, 0xb77f, 0xb697, 0xe5f1, 0x3ff6, 0xe614, 0xe615, 0xe611, 0xe607, 0xe617, 0xe618, 0xe5ff, 0xe616, 0xe619, 0xe5ef, 0x2173, 0x65a2, 0xe5dc, 0x3597, 0x6b25, 0x6b26, 0x6b2a, 0xeb2d, 0x242f, 0x2518, 0x2553, 0x2554, 0x255f, 0xdaec, 0x2173, 0x65a2, 0xe5d7, 0xe61a, 0xe613, 0xe610, 0xdf9f, 0xe61b, 0xe5fc, 0xe580, 0xe582, 0xe583, 0xe586, 0xe588, 0x6587, 0xe589, 0xa54f, 0xe5d6, 0x658f, 0xe5a0, 0xe5c8, 0x6591, 0xe592, 0xe58e, 0xe593, 0xe594, 0xe58c, 0xb0b6, 0xe598, 0x6599, 0xeb27, 0xe5a8, 0xd05e, 0xe5e5, 0xe5a9, 0xe5ad, 0xe5d3, 0xe5a5, 0xe5a3, 0xe5a1, 0xe5ab, 0xeb2e, 0x65b1, 0xe5b2, 0xe5ac, 0xe5cd, 0xe5be, 0x2266, 0xe5b9, 0xe5b6, 0xeb29, 0xe5bf, 0xe5bd, 0xe5bb, 0xe5bc, 0xe5e1, 0xe5cc, 0x65b4, 0xe5c3, 0xe5e0, 0x3ff6, 0xe5ca, 0xe5cb, 0xe5d4, 0xe5d0, 0xe5d2, 0xe5d5, 0x65de, 0xeb2b, 0xe5e4, 0xe61d, 0x6091, 0xe61c, 0xe68a, 0x1f8c, 0x6634, 0x6670, 0xe682, 0x6633, 0xe67d, 0xe638, 0x2347, 0xe65e, 0x2742, 0xac85, 0x274f, 0xa76f, 0xa751, 0xa740, 0xca7d, 0x6626, 0xe67d, 0x1f8c, 0x6625, 0x6670, 0xe682, 0xe663, 0x2826, 0xe68e, 0xe628, 0xbcae, 0x2768, 0xe641, 0x2768, 0xe640, 0xe69b, 0xe678, 0xe6b4, 0xe673, 0xe658, 0xa905, 0x665c, 0x665d, 0xe67f, 0xa7c8, 0xe649, 0x6655, 0xe67f, 0xe655, 0x2347, 0xe629, 0xaf8f, 0x2866, 0xe635, 0xe677, 0x2c9b, 0x2cf6, 0x2d8b, 0x2d8c, 0x2db9, 0x669d, 0xe6af, 0xe695, 0x4906, 0x667a, 0xe6aa, 0x1f8c, 0x6625, 0x6634, 0xe682, 0xe648, 0xe665, 0xe646, 0x4906, 0x6669, 0xe6aa, 0x2794, 0xa819, 0x6626, 0xe633, 0x6655, 0xe65c, 0x2830, 0xa895, 0x1f8c, 0x6625, 0x6634, 0xe670, 0x27de, 0xa824, 0xe61f, 0xb697, 0x2826, 0xe636, 0xe6a8, 0x1e5a, 0x66a0, 0xe6b1, 0x48d2, 0xe668, 0xa75e, 0xe69f, 0xe645, 0x2c9b, 0x2cf6, 0x2d8b, 0x2d8c, 0x2db9, 0x6666, 0xe6af, 0xe699, 0x1e5a, 0x6690, 0xe6b1, 0x23b8, 0x60bb, 0xe130, 0xe68f, 0x4906, 0x6669, 0xe67a, 0x275f, 0xa8b3, 0xde8b, 0x2c9b, 0x2cf6, 0x2d8b, 0x2d8c, 0x2db9, 0x6666, 0xe69d, 0x1e5a, 0x6690, 0xe6a0, 0xea98, 0xe647, 0x66b7, 0xe6b8, 0x66b6, 0xe6b8, 0x66b6, 0xe6b7, 0x2bc9, 0x674d, 0x674e, 0x674f, 0x6db4, 0x6e16, 0xee64, 0xa3ea, 0xe6cb, 0xe6e3, 0x6ceb, 0xed08, 0x20f1, 0xecf8, 0xe6bd, 0xe6dd, 0xe6db, 0x3742, 0xe6dc, 0x2f6b, 0x4431, 0xed70, 0xd67d, 0xa3cc, 0xee1b, 0x66cf, 0xedb5, 0x3742, 0xe6d1, 0xe6cd, 0x6d8f, 0x6dc4, 0xee21, 0xadb2, 0x5b8e, 0xdb90, 0xc9bb, 0xe6be, 0xbc1b, 0x9e91, 0xe742, 0xe717, 0xe741, 0x671a, 0xe727, 0xc535, 0x671a, 0xe727, 0xe73d, 0xeef4, 0x4075, 0x671b, 0xe748, 0xbcbe, 0xe6f6, 0x66fa, 0x66fe, 0xe727, 0x4075, 0x670a, 0xe748, 0xe722, 0xe721, 0x66fa, 0x66fe, 0xe71a, 0xe744, 0xd987, 0x1e30, 0x5c4a, 0x5c50, 0xe74a, 0xe701, 0xe6f7, 0xe6f3, 0xe72d, 0xa3c7, 0x4075, 0x670a, 0xe71b, 0xa3c6, 0x1e30, 0x5c4a, 0x5c50, 0xe73b, 0x2bc9, 0x66ba, 0x674e, 0x674f, 0x6db4, 0x6e16, 0xee64, 0x2bc9, 0x66ba, 0x674d, 0x674f, 0x6db4, 0x6e16, 0xee64, 0x2bc9, 0x66ba, 0x674d, 0x674e, 0x6db4, 0x6e16, 0xee64, 0x2bc8, 0xe752, 0x2bc8, 0xe751, 0xe75a, 0x2172, 0x2929, 0xe75d, 0xe75c, 0xe753, 0xe759, 0x2172, 0x2929, 0xe754, 0x4cc6, 0x6763, 0x6eaa, 0x6eab, 0x6eb5, 0xeeba, 0xe762, 0x45b1, 0xc6b0, 0xe768, 0xe82e, 0xe765, 0x676d, 0xe771, 0x676b, 0x6771, 0xe7e7, 0x676b, 0x676d, 0xe7e7, 0xe7be, 0xcd46, 0x6789, 0xef17, 0x6780, 0xef17, 0xe7b5, 0xe78d, 0xe78c, 0xade9, 0xe7c3, 0xe7bd, 0xe7b9, 0x49cb, 0xe7a7, 0x49cb, 0xe7a6, 0xc89f, 0xe7c9, 0x5f41, 0xe7dc, 0xe7dd, 0xe78b, 0xe79f, 0xe792, 0xe774, 0x4e6e, 0xcf30, 0xe791, 0xa343, 0x589c, 0xe7e4, 0xe7af, 0xe7e6, 0xe7e7, 0x2dff, 0xe7e8, 0xe7e9, 0xe7ea, 0x5f41, 0x67b1, 0xe7ec, 0xe7b2, 0xe7eb, 0x589c, 0xe7c8, 0xe7cb, 0x676d, 0x6771, 0xe7cc, 0x2dff, 0xe7cd, 0xe7d3, 0xe7d9, 0xe7de, 0x5f41, 0xe7dc, 0xe7ee, 0xe7ed, 0xe7f1, 0xe7ef, 0x6f4f, 0xef51, 0xe7fb, 0xe7f5, 0xa4cd, 0xe875, 0xe876, 0xe877, 0xe879, 0xe87a, 0xe878, 0xe87b, 0xe87c, 0xe882, 0xe880, 0xe883, 0xe884, 0xe87d, 0xe881, 0xe87f, 0xe887, 0xe886, 0x6838, 0xe888, 0xe88c, 0xe889, 0x6825, 0xe890, 0x6824, 0xe890, 0xe88f, 0x6830, 0xe88a, 0xa934, 0x6767, 0xe892, 0x682c, 0xe88a, 0xe88b, 0x4a4e, 0xe896, 0xe894, 0x681a, 0xe888, 0x4a68, 0x683a, 0x683d, 0xe893, 0x4a68, 0x6839, 0x683d, 0xe893, 0xe891, 0x5cf4, 0xdd56, 0x4a68, 0x6839, 0x683a, 0xe893, 0xeaed, 0xe897, 0xd16e, 0xe898, 0xe89d, 0xe89a, 0x6854, 0xe89c, 0xe899, 0xe89b, 0x684f, 0xe89c, 0x363e, 0xe86f, 0xa6df, 0xb13f, 0xe8a1, 0x685b, 0xe8a0, 0x685a, 0xe8a0, 0xcc7b, 0xe89f, 0xe8a2, 0xe87e, 0xe8a4, 0xe8a5, 0x363e, 0xe855, 0xe8a6, 0x6885, 0x6ad7, 0xee15, 0xe89e, 0xe8a7, 0xe801, 0xe802, 0xe803, 0xe807, 0xe805, 0xe806, 0x6808, 0xeb1a, 0xe80a, 0xe811, 0xe867, 0xe813, 0xe80e, 0xe812, 0xe80c, 0xe80f, 0xe810, 0x6871, 0xead7, 0xe818, 0xe817, 0x681a, 0xe838, 0xe821, 0x682c, 0xe830, 0xe832, 0xe81c, 0xbf41, 0xc1b2, 0xe826, 0x6824, 0xe825, 0xe83b, 0xe82e, 0x4a68, 0x6839, 0x683a, 0xe83d, 0xe837, 0x4a4e, 0xe834, 0xe846, 0xe84c, 0xe852, 0xe84e, 0xe853, 0x684f, 0xe854, 0xe84d, 0xe873, 0xe862, 0x685a, 0xe85b, 0xe859, 0xe865, 0xce87, 0xe86b, 0xe86c, 0xe870, 0xe874, 0x1e30, 0x21e8, 0x21ec, 0x21ee, 0x5af7, 0x5bbd, 0x68cc, 0xe8ce, 0xe8d0, 0x68b7, 0x68c6, 0x68c8, 0xe8d1, 0xe8d2, 0xa3f0, 0xa22e, 0xe8d3, 0x68ae, 0x68c6, 0xe8c8, 0xe8d4, 0xe8cf, 0xe8d6, 0xe8d5, 0xe8d7, 0x68c4, 0xe8d8, 0x68c3, 0xe8d8, 0x68ae, 0x68b7, 0x68c7, 0x68c8, 0xe8d9, 0xe8c6, 0x68ae, 0x68b7, 0x68c6, 0xe8da, 0x21e8, 0x21ec, 0x21ee, 0x68a8, 0xe8ce, 0x1e30, 0x21e8, 0x21ec, 0x21ee, 0x68a8, 0xe8cc, 0xe8ba, 0xe8ad, 0xe8ae, 0xe8af, 0xe8b6, 0xe8b8, 0xe8bc, 0xe8bb, 0xe8c0, 0x68c3, 0xe8c4, 0xe8c6, 0xe8c8, 0xe8de, 0xcffb, 0xe8db, 0x25b0, 0x68e0, 0xe963, 0x25b0, 0x68df, 0xe963, 0xe910, 0xe965, 0xe964, 0xe966, 0xe957, 0xe968, 0xe96a, 0x49d7, 0xe96b, 0xe90a, 0xe96c, 0x68f2, 0xe96e, 0x68f0, 0xe96d, 0xe8ef, 0x68ee, 0xe96e, 0xe974, 0xe99d, 0xe972, 0xe971, 0xe970, 0xe973, 0xe97a, 0xe978, 0x6920, 0xe97c, 0x645c, 0x695f, 0xe977, 0x217b, 0x4faa, 0xe8ec, 0xe975, 0xe95c, 0xe979, 0xe97b, 0xe8e1, 0xe97d, 0x6927, 0xe981, 0xe97f, 0xe982, 0xe97e, 0x1f59, 0xe980, 0xd0b4, 0xe984, 0xe983, 0xe96f, 0xe18a, 0x6905, 0xe97c, 0xe985, 0x2582, 0x6912, 0x6935, 0xe981, 0x5218, 0xe986, 0xccca, 0xccc7, 0xe967, 0xe959, 0x2582, 0xe927, 0xe989, 0xe987, 0xe967, 0xe98e, 0xccd5, 0xe969, 0xe988, 0xe98f, 0xe98a, 0xe98c, 0xe98d, 0xe992, 0xe990, 0xe991, 0xe993, 0xe988, 0xe994, 0xd1b3, 0xcce6, 0xe965, 0xe976, 0xe8e8, 0xe934, 0xe90d, 0xe98b, 0x645c, 0x6909, 0xe977, 0xe995, 0x25b0, 0x68df, 0xe8e0, 0xe8e3, 0x68e2, 0xe951, 0xe8e5, 0x6933, 0xe939, 0xe8e9, 0xe93c, 0xe8ea, 0xe8eb, 0xe8ed, 0xe8ef, 0x68ee, 0xe8f2, 0xe91e, 0xe8fe, 0xe8fd, 0xe8fc, 0xe8ff, 0xe8f4, 0xe90c, 0xe952, 0x6909, 0xe95f, 0xe904, 0xe90e, 0xe903, 0xe90f, 0x6905, 0xe920, 0xe911, 0xe916, 0xe913, 0x1f59, 0xe918, 0x6912, 0xe927, 0xe915, 0xe91c, 0xe91b, 0xe921, 0xe928, 0xe937, 0x693d, 0xe94b, 0xe936, 0xe93f, 0xe95e, 0xe941, 0xe943, 0xe93a, 0xe93e, 0xe948, 0xe949, 0xe945, 0xe94a, 0xe94c, 0xe962, 0xe8f6, 0xe99f, 0xe99e, 0xea6c, 0xea6d, 0xa1af, 0x69c4, 0xea6e, 0xea5d, 0xea70, 0xea6f, 0xea72, 0xce36, 0x6a62, 0xea74, 0xea73, 0x69b1, 0xea6e, 0x6a5b, 0xea7f, 0x357a, 0x69c8, 0x6a45, 0xea71, 0x357a, 0x69c6, 0x6a45, 0xea71, 0xea7b, 0xea7d, 0xea79, 0xea75, 0xea7e, 0xea80, 0xea78, 0xea76, 0x69de, 0xea7c, 0x69dd, 0xea7c, 0xea77, 0x208c, 0x4f75, 0xea82, 0xea88, 0xea87, 0xea73, 0xea83, 0xea86, 0x6a2e, 0xea51, 0xea8e, 0xea8f, 0xea8b, 0xea8d, 0xea93, 0xea92, 0xea91, 0xea90, 0x6a13, 0x6a57, 0xea8c, 0x6a37, 0xea9a, 0x6a10, 0x6a57, 0xea8c, 0xea9b, 0xea97, 0xea99, 0xea52, 0xea9e, 0xea98, 0x69f5, 0x6a51, 0xea9d, 0xd17e, 0xea7a, 0x6a12, 0xea9a, 0xea9f, 0xea47, 0xeaa1, 0xd4e6, 0xea9c, 0xea96, 0xeaa0, 0xeaa2, 0x357a, 0x69c6, 0x69c8, 0xea71, 0xea3a, 0xea85, 0xea95, 0xea81, 0xeaa3, 0x69f5, 0x6a2e, 0xea9d, 0xea28, 0xea84, 0x6a10, 0x6a13, 0xea8c, 0xb0ca, 0x69c5, 0xea7f, 0xe9b2, 0xeaa4, 0x69bf, 0xea74, 0xeaa7, 0x560e, 0xeaa5, 0xeaa6, 0xbb22, 0xea8a, 0xea89, 0xe9ac, 0xe9ad, 0x69b1, 0xe9c4, 0xe9b4, 0xe9b3, 0x357a, 0x69c6, 0x69c8, 0xea45, 0xe9b9, 0x69c1, 0xe9ee, 0x69bf, 0xea62, 0xe9d4, 0xe9db, 0xe9df, 0xe9d9, 0xe9d2, 0xea36, 0xe9d0, 0x69dd, 0xe9de, 0xe9d1, 0xe9d5, 0x69c5, 0xea5b, 0xe9d8, 0xea4d, 0x208c, 0x4f75, 0xe9e1, 0xe9f0, 0xea55, 0xea4a, 0xe9f1, 0xe9ed, 0xe9e2, 0xea6b, 0xea6a, 0xea01, 0x6a10, 0x6a13, 0xea57, 0xea02, 0xe9f8, 0xe9ff, 0xea0f, 0xea0e, 0xea0d, 0xea05, 0xea4c, 0xea42, 0xea19, 0x66b2, 0xea2d, 0xea24, 0x6a12, 0xea37, 0xea16, 0xea41, 0x6a2e, 0xea51, 0xea2b, 0xea38, 0xea43, 0xea3e, 0xea44, 0xea4f, 0xea5f, 0x560e, 0xea65, 0xea66, 0xea64, 0xd0ae, 0x1f53, 0x5eb0, 0x5ec6, 0xead4, 0xeca0, 0x51b8, 0xead3, 0xeacf, 0xd180, 0xead6, 0xead5, 0xeac5, 0xd10f, 0x51b8, 0xeac4, 0x1f53, 0x5eb0, 0x5ec6, 0xeab5, 0x51cf, 0xeacc, 0xeacb, 0x6871, 0x6885, 0xee15, 0xead9, 0xead8, 0x1eff, 0xaf77, 0xeaf9, 0xeaef, 0x6b02, 0xeb22, 0x23d1, 0xeaee, 0xe83e, 0x23d1, 0xeaea, 0xeae5, 0x1f5b, 0xaf7f, 0xeae4, 0xa243, 0x6ae9, 0x6b13, 0xeb22, 0xb77e, 0xd0e1, 0x6b02, 0xeb22, 0xe87b, 0xeb23, 0x6ae9, 0x6b02, 0xeb13, 0xeb1b, 0x3597, 0x65d8, 0x6b26, 0x6b2a, 0xeb2d, 0x3597, 0x65d8, 0x6b25, 0x6b2a, 0xeb2d, 0x6599, 0xe5f9, 0xa4c4, 0xe60b, 0x3597, 0x65d8, 0x6b25, 0x6b26, 0xeb2d, 0xe61a, 0x3597, 0x65d8, 0x6b25, 0x6b26, 0xeb2a, 0xe604, 0x3b1d, 0x60c1, 0xeb31, 0x3b1d, 0x60c1, 0xeb30, 0xeb39, 0xeb36, 0x1ffc, 0xcca5, 0xac2c, 0xeb58, 0xeb4e, 0x573d, 0xeb49, 0x21f2, 0x2c32, 0x2c34, 0x2c36, 0xac37, 0x1e11, 0xe19c, 0xeb47, 0xec7c, 0xec7d, 0xec7e, 0xec6e, 0xebbb, 0xec80, 0xeeff, 0xec81, 0x6c78, 0xec88, 0xec24, 0xec82, 0xec7f, 0xec84, 0xec85, 0xec86, 0x6bdb, 0xecb7, 0xec8c, 0xec89, 0xec8f, 0xec87, 0xebf9, 0xec90, 0xec8d, 0xec8b, 0xec8a, 0xec92, 0xec98, 0x6bd7, 0x6c76, 0xec9e, 0xec95, 0xec96, 0x6bb7, 0xebf7, 0xec94, 0xec9b, 0xec91, 0x2c1f, 0x2c20, 0x5d7b, 0x6c7b, 0xec9c, 0xec93, 0xecaa, 0x6ba7, 0xebf7, 0xec9d, 0xeb66, 0xebd8, 0xeca7, 0xeca0, 0x6c00, 0xeca9, 0xeca4, 0x6bcb, 0xeca8, 0xebca, 0xecac, 0xecbb, 0xecaf, 0xecad, 0x6b9d, 0xec76, 0xebbe, 0x6b89, 0xecb7, 0xecb4, 0xecb1, 0xecb5, 0xecb2, 0xecb3, 0xecb8, 0xecae, 0xecb0, 0xecb6, 0xecba, 0xec3a, 0x6ba7, 0x6bb7, 0xecc0, 0xeb8f, 0xecab, 0xecca, 0x6bc7, 0xeca9, 0xecc8, 0xec97, 0xecc2, 0x6c28, 0xecbd, 0xecc7, 0x6c0d, 0xecc5, 0x6c0c, 0xecc5, 0xecbe, 0x6c77, 0xecc4, 0xecc6, 0xecc3, 0x6c2e, 0xecc1, 0xecd2, 0xecd1, 0xeccb, 0xeca5, 0xeb73, 0x6c5e, 0xeccf, 0x6c08, 0xecce, 0xecd0, 0xeccd, 0xec1b, 0xeca2, 0x6ccc, 0xef07, 0xecd3, 0xecd8, 0xeca6, 0xeca3, 0x6bf5, 0xecb9, 0xecd7, 0xecdb, 0xecd4, 0xecc9, 0xecd9, 0xecd5, 0x6cd6, 0x6f08, 0xef9e, 0xecdf, 0xecdd, 0xecdd, 0xecdc, 0xecde, 0xec9f, 0xecbc, 0xec25, 0xec8e, 0xec99, 0xece3, 0xece1, 0xece2, 0xecbf, 0xec9a, 0xeb63, 0xece0, 0x6b9d, 0x6bd7, 0xec9e, 0x6c10, 0xecc4, 0x6b72, 0xec88, 0xeca1, 0x2c1f, 0x2c20, 0x5d7b, 0x6bae, 0xec9c, 0xeb5a, 0xeb5b, 0xeb62, 0xeb77, 0xeb68, 0xeb6f, 0xeb74, 0xeb7a, 0xeb81, 0xeb83, 0xeb8e, 0x6b72, 0xec78, 0xeb8b, 0xeb93, 0xeb92, 0xeb8a, 0x56ab, 0xeb91, 0xec5f, 0xeb8d, 0xeb90, 0xebad, 0xeb9a, 0xebb3, 0xebaa, 0xeb9e, 0xeba6, 0xec02, 0xeb9c, 0xec60, 0xec6d, 0xebab, 0x2c1f, 0x2c20, 0x5d7b, 0x6bae, 0xec7b, 0xebba, 0x6b9d, 0xec76, 0xec58, 0x6abe, 0xebc1, 0xec7a, 0xec31, 0xec39, 0xebc9, 0xec23, 0xec37, 0xebc0, 0xebca, 0x6bc7, 0xec00, 0xebb6, 0xebfd, 0xebd2, 0xebd6, 0xebea, 0xebd5, 0xebeb, 0xebe1, 0xebe4, 0xebe7, 0xebdd, 0xebe2, 0xebf0, 0x6b89, 0xebdb, 0xebe8, 0xec3a, 0xebf4, 0xebd4, 0xec5d, 0xec08, 0xec0f, 0xec68, 0xebf7, 0xec1b, 0xec03, 0xec13, 0x6c10, 0xec77, 0x6c0c, 0xec0d, 0xec12, 0xec09, 0xec01, 0xec42, 0xebff, 0xec20, 0x6c32, 0xef07, 0xec2d, 0xec28, 0xec25, 0xec29, 0xec1f, 0xec1c, 0xec33, 0xec3e, 0x51a4, 0xec48, 0x6c49, 0xef08, 0xec3b, 0xec35, 0xec45, 0xec3c, 0xec56, 0x6c53, 0xec54, 0xec57, 0xec52, 0xec6f, 0xec64, 0xec67, 0xec63, 0x2c4c, 0xee1f, 0x21eb, 0xecec, 0xee20, 0x66c1, 0xed08, 0xece7, 0xee24, 0xa1e4, 0xee23, 0xee22, 0xe6c7, 0xee29, 0xee28, 0x66c1, 0xeceb, 0x6d76, 0xee26, 0x6dd7, 0xee25, 0xee30, 0xee35, 0xee33, 0x6e1c, 0xee32, 0xee2e, 0x6d44, 0xee31, 0xee2a, 0xee2f, 0xee2d, 0x53ba, 0xedaf, 0xee38, 0xee39, 0xedc3, 0xee3b, 0xee3f, 0xedfa, 0xee3d, 0xee3a, 0xee3c, 0xed1f, 0xee40, 0xee43, 0xee46, 0xee41, 0xedaa, 0xee48, 0x6d5e, 0xee45, 0x6d5d, 0xee45, 0xee44, 0xee49, 0xee4c, 0xee4f, 0xee50, 0xee4e, 0xe6d5, 0xee4a, 0x6d09, 0xee26, 0xee53, 0x6da4, 0xee4d, 0x6dab, 0xee2b, 0xee51, 0xee52, 0x66de, 0x6dc4, 0xee21, 0xee4b, 0xee59, 0xee55, 0xee57, 0xee56, 0xed7e, 0xee5b, 0xee5c, 0xed59, 0x6d87, 0xee2b, 0xee27, 0x53ba, 0xed2c, 0xee5f, 0x2bc9, 0x66ba, 0x674d, 0x674e, 0x674f, 0x6e16, 0xee64, 0xe6db, 0xee60, 0xee61, 0xee58, 0xee63, 0xee5a, 0xee5a, 0xee62, 0xee5e, 0xed33, 0x66de, 0x6d8f, 0xee21, 0xedcf, 0xedc9, 0xedc8, 0xee5d, 0xedc6, 0xee67, 0xee65, 0x6d0e, 0xee25, 0xee37, 0xee68, 0xee36, 0xee6a, 0xee54, 0xee69, 0xc1d5, 0xee6b, 0x6df4, 0xee47, 0x6df3, 0xee47, 0xee6c, 0xee70, 0x6d3c, 0xee6d, 0xee34, 0xee0a, 0xee6f, 0xedff, 0xee71, 0xd3ba, 0xee72, 0x6871, 0x6ad7, 0xee2c, 0x2bc9, 0x66ba, 0x674d, 0x674e, 0x674f, 0x6db4, 0xee64, 0xee74, 0xee66, 0x66da, 0xee73, 0xed1d, 0xee42, 0xee3e, 0x2c4c, 0xece5, 0xece9, 0x66de, 0x6d8f, 0xedc4, 0xecf6, 0xecf4, 0xecf2, 0x6d0e, 0xedd7, 0x6d09, 0xed76, 0xedac, 0xed07, 0xed06, 0xed23, 0x6d87, 0xedab, 0xee15, 0xed28, 0xed1e, 0xed26, 0xed12, 0xed1f, 0xed1d, 0xed1b, 0xedfd, 0xed15, 0xede5, 0xedd9, 0xed2f, 0xed30, 0xed42, 0xed34, 0xed43, 0xed3f, 0xee1e, 0xed3b, 0xed50, 0xed53, 0xee1d, 0xed51, 0xed60, 0x6d5d, 0xed5e, 0xed52, 0x6df3, 0xedf4, 0xed5c, 0xed61, 0xed72, 0xed93, 0xed6a, 0xed7e, 0xed6f, 0xed6c, 0xed6e, 0xed89, 0xed8a, 0xed77, 0xedeb, 0xed98, 0xeda1, 0xed9a, 0xedbb, 0xed96, 0x6dbf, 0xedc0, 0xeda5, 0xeda9, 0xedca, 0xedc2, 0xedb2, 0xedb9, 0xedba, 0xedc1, 0xedbc, 0x2bc9, 0x66ba, 0x674d, 0x674e, 0x674f, 0x6db4, 0xee16, 0xedd6, 0xee1a, 0xedd3, 0xedda, 0xedef, 0xede6, 0xedf2, 0xedf8, 0xedfa, 0xee07, 0xedf9, 0xee0c, 0xee0f, 0xee1b, 0xee18, 0x2364, 0xa877, 0x4877, 0x48b1, 0xee7c, 0x24b8, 0xe18e, 0xee7e, 0xc877, 0x4877, 0x48b1, 0xee78, 0x2869, 0xc6d0, 0xee7a, 0xee85, 0xeea4, 0xee83, 0xee8f, 0xee87, 0x1e3d, 0xaa6f, 0xc350, 0x4c97, 0xee84, 0xeea6, 0xeea5, 0x6eac, 0xeeb8, 0x4cc6, 0x6762, 0x6eab, 0x6eb5, 0xeeba, 0x4cc6, 0x6762, 0x6eaa, 0x6eb5, 0xeeba, 0x6ea9, 0xeeb8, 0xa305, 0x36f2, 0x4cac, 0x6eb4, 0xeeb9, 0x36f2, 0x4cac, 0x6eaf, 0xeeb9, 0x4cc6, 0x6762, 0x6eaa, 0x6eab, 0xeeba, 0x6ea9, 0xeeac, 0x36f2, 0x4cac, 0x6eaf, 0xeeb4, 0x4cc6, 0x6762, 0x6eaa, 0x6eab, 0xeeb5, 0x45f2, 0x45f3, 0xd534, 0x1e48, 0x2c1b, 0x2e85, 0xeebd, 0x1e48, 0x2c1b, 0x2e85, 0xeebc, 0xeec4, 0x48fa, 0xeec3, 0xeecc, 0xeec9, 0xcc98, 0xeed2, 0xeed1, 0xeed9, 0xeed8, 0xeef1, 0x294c, 0xc0b9, 0xeef6, 0xeeed, 0xa15a, 0xeef7, 0xeef2, 0xeee4, 0xeedb, 0xeeea, 0xe709, 0xeee1, 0xeee9, 0xd8ae, 0xeefe, 0xeefd, 0x6b6d, 0xef0b, 0xef0c, 0xd6d9, 0x6c32, 0xeccc, 0x6c49, 0x6cd6, 0xef9e, 0xef0d, 0xeeff, 0xef02, 0xef09, 0xef11, 0xef0e, 0xe3a1, 0x46b7, 0xc6bc, 0xa1ac, 0x6780, 0xe789, 0xef21, 0xef20, 0xdc82, 0xef39, 0xef34, 0xa5c5, 0x1e9d, 0x3589, 0x358a, 0xef50, 0x358b, 0xb58e, 0x5cf7, 0xdd4d, 0x67f2, 0xef51, 0x1e9d, 0x3589, 0x358a, 0xef4a, 0x67f2, 0xef4f, 0x3b6f, 0xef7f, 0xef54, 0x6f53, 0xef80, 0xef81, 0xef82, 0xef85, 0xef70, 0xef87, 0xef83, 0xef86, 0x6f62, 0xef84, 0x6f61, 0xef84, 0xa1fa, 0xef88, 0x256e, 0x2699, 0xa6d3, 0xa4ac, 0x6f71, 0xef8a, 0xef89, 0xef5a, 0xef6a, 0xef8b, 0xd16d, 0xef8c, 0x3b6f, 0xef52, 0xef54, 0xef55, 0xef57, 0xef5f, 0x6f61, 0xef62, 0xef59, 0xef60, 0xef5c, 0xef66, 0xef6c, 0xef6a, 0xef72, 0xef77, 0x4adc, 0x6f92, 0xef99, 0xa390, 0xae9e, 0x4adc, 0x6f8d, 0xef99, 0xef9a, 0xef9b, 0x6f8d, 0xef92, 0xef94, 0xef95, 0x1e80, 0xef9f, 0x49cb, 0x49cc, 0xca50, 0x6c49, 0xef08, 0x1e80, 0xef9c, 0x248a, 0x248c, 0xb0d2, 0x2401, 0xcc72, }; static const short cjk_variants_indx[0x5200] = { /* 0x4e00 */ 4, -1, -1, -1, 5, 6, -1, 7, -1, 8, 10, 11, 12, -1, 13, -1, 14, 16, 19, 20, -1, -1, 22, 24, 26, -1, 28, 29, 33, 34, -1, 36, 38, 40, 42, 44, 45, 47, 49, 52, -1, -1, 53, 56, 59, -1, -1, -1, 60, -1, 66, 67, 68, -1, -1, -1, -1, -1, 69, -1, -1, 71, 73, -1, -1, 76, 77, 79, 81, 83, 85, -1, 87, 92, -1, -1, 93, -1, -1, -1, 94, 96, -1, -1, 100, 101, -1, 103, 105, -1, 107, -1, -1, -1, -1, -1, 110, 111, -1, -1, -1, -1, 115, -1, 116, -1, -1, -1, -1, -1, -1, -1, 118, 119, -1, -1, -1, -1, -1, -1, -1, 121, -1, -1, -1, -1, 124, -1, 128, 130, 133, -1, -1, -1, 135, -1, 137, 138, 139, 141, 143, -1, 144, 147, 151, 153, -1, -1, 155, -1, 156, 157, 161, 162, 163, -1, 165, 167, 171, 173, -1, 174, -1, -1, -1, -1, -1, 176, -1, 178, -1, 182, 183, -1, -1, 184, 185, 186, 187, -1, -1, 188, -1, -1, 189, -1, 190, 191, -1, -1, 192, 194, -1, 195, 196, -1, -1, 199, 201, 202, -1, 203, -1, -1, 204, -1, 207, 209, 210, 212, -1, 215, -1, -1, -1, -1, 217, 218, -1, -1, -1, 220, 221, -1, -1, -1, 222, -1, -1, -1, -1, 223, -1, -1, 227, -1, 228, 229, 230, -1, -1, -1, -1, -1, -1, -1, -1, 232, -1, -1, 234, -1, 236, 237, 239, 240, /* 0x4f00 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 245, -1, -1, -1, -1, -1, 247, 248, 251, 252, 253, 254, 255, 256, 259, 262, 263, 265, -1, 266, 267, 268, 269, 270, -1, -1, 271, 273, -1, -1, 275, -1, -1, 276, 279, -1, -1, 282, -1, 283, -1, -1, -1, -1, 284, -1, -1, -1, 285, -1, 286, -1, -1, -1, -1, 287, 288, -1, -1, -1, -1, -1, 289, -1, -1, -1, -1, 290, 295, -1, -1, -1, -1, 296, -1, 298, 301, -1, 302, -1, 303, -1, -1, 307, -1, 308, -1, -1, -1, -1, 309, -1, -1, -1, -1, -1, -1, 310, -1, -1, -1, 312, -1, 314, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 315, 316, -1, 318, -1, -1, -1, -1, -1, 319, -1, 323, -1, 324, -1, -1, -1, -1, -1, 325, -1, -1, -1, -1, -1, -1, -1, -1, 326, 328, 329, -1, 331, -1, 332, 333, 335, 336, 337, 338, 339, 340, 341, -1, 343, -1, -1, -1, -1, -1, -1, 344, 345, -1, -1, -1, -1, -1, 346, -1, -1, -1, 347, 348, -1, -1, -1, -1, 349, -1, -1, 350, -1, 351, -1, 352, -1, -1, -1, -1, -1, 353, -1, -1, -1, -1, -1, -1, -1, -1, -1, 355, 356, 357, 358, 359, 360, -1, 361, 362, -1, 363, 364, 365, 366, -1, 367, 369, -1, -1, 371, 372, -1, -1, -1, -1, -1, -1, -1, -1, 374, 378, 380, -1, -1, /* 0x5000 */ 382, -1, 383, 385, -1, 388, 389, -1, 390, 391, 393, 394, -1, -1, 397, 398, 399, 400, -1, -1, -1, -1, 401, -1, -1, -1, -1, -1, -1, -1, 402, 403, -1, -1, -1, 405, 407, -1, 408, -1, -1, -1, -1, 410, -1, -1, -1, -1, -1, -1, -1, 411, -1, -1, 412, -1, -1, 413, 415, -1, 416, -1, 417, -1, 418, -1, -1, -1, -1, -1, 419, 420, -1, 421, -1, -1, -1, -1, -1, -1, 422, -1, -1, -1, -1, -1, -1, -1, 425, 426, 427, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 428, -1, -1, -1, -1, 429, -1, 430, -1, -1, -1, -1, -1, -1, -1, 432, 433, -1, 435, 436, 437, 441, 444, -1, 445, 447, 448, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 449, 452, -1, -1, -1, 453, -1, -1, -1, -1, 454, -1, 455, 458, 462, -1, 464, -1, -1, -1, 465, 467, 470, -1, 471, 472, -1, 473, 474, 475, -1, -1, -1, 476, -1, 477, -1, -1, -1, 478, 480, 481, -1, 482, -1, 483, -1, -1, -1, -1, 484, -1, 485, -1, 486, 487, 491, 492, -1, -1, -1, 493, 494, -1, -1, 495, -1, -1, -1, 498, -1, -1, -1, 499, -1, -1, 500, -1, -1, -1, 501, -1, 502, 504, -1, -1, -1, 505, -1, 506, -1, -1, 507, 508, -1, 509, -1, 512, -1, -1, -1, 513, 514, -1, 515, -1, -1, -1, -1, 516, -1, -1, -1, -1, -1, -1, /* 0x5100 */ 518, 519, 520, -1, 521, -1, -1, -1, 522, 523, -1, -1, -1, -1, 525, -1, 526, -1, -1, -1, 527, 528, -1, -1, 529, -1, -1, -1, -1, -1, 531, 534, -1, -1, -1, -1, -1, -1, -1, 535, -1, -1, 536, -1, -1, -1, -1, -1, -1, -1, 537, -1, -1, -1, -1, 538, -1, 539, 540, 541, 542, -1, -1, 543, -1, -1, 545, -1, -1, -1, -1, 546, -1, 547, 549, 551, 554, -1, 556, 557, 561, 563, 565, -1, 567, -1, 568, 569, 570, -1, 572, -1, 573, -1, -1, -1, 574, -1, -1, -1, 575, -1, 576, 578, -1, 579, 581, -1, -1, -1, -1, -1, 582, -1, 583, 586, 591, -1, 592, -1, -1, 593, -1, 595, -1, 597, 599, -1, 600, 601, 602, 603, 604, 605, 606, -1, 609, 610, 611, 613, 614, -1, 616, 618, 619, 620, 621, -1, -1, -1, -1, 622, -1, 623, -1, 625, 626, 627, -1, -1, -1, -1, 629, 630, 631, -1, 632, -1, 634, 635, 637, 639, 642, -1, -1, 644, 645, 648, 649, 651, 652, 653, -1, -1, -1, -1, 654, 655, -1, 656, -1, -1, 657, -1, 659, 660, 661, 664, 665, -1, 667, 668, -1, -1, -1, 669, -1, 670, -1, 671, 672, 673, -1, -1, 674, -1, -1, -1, -1, 676, 678, -1, 680, -1, 684, 686, 688, 690, 692, 693, 694, -1, 696, -1, -1, 701, 702, 707, 710, 715, -1, 716, 717, 722, 723, -1, 726, 727, -1, -1, 730, 732, -1, 734, 735, 736, /* 0x5200 */ 737, -1, 739, 741, 742, 743, -1, -1, 745, -1, 747, -1, -1, 748, -1, -1, -1, -1, 749, 752, 753, -1, -1, -1, 754, 755, 756, 757, -1, -1, -1, -1, 762, -1, -1, -1, -1, 763, 764, 767, 770, -1, 773, 774, 776, 780, 781, -1, -1, 782, -1, -1, 786, -1, 787, -1, -1, 788, 789, -1, 790, 793, 794, 795, 796, 797, 798, 800, 801, -1, -1, 802, -1, -1, -1, 803, 806, 807, 808, 809, 813, 815, -1, -1, -1, -1, -1, 823, -1, 827, 831, 832, -1, 833, -1, -1, -1, -1, -1, 834, 842, 844, 845, 847, -1, 848, -1, -1, -1, -1, 849, -1, 852, 853, -1, 861, 862, 863, -1, 868, -1, 872, -1, -1, -1, -1, -1, 873, -1, -1, -1, 874, 877, -1, -1, 878, -1, 879, 880, -1, 881, 882, 890, -1, 898, 901, 903, -1, 911, 919, -1, -1, -1, -1, -1, -1, -1, 921, 923, 924, -1, 926, 927, -1, -1, -1, -1, -1, 928, -1, 931, 932, -1, -1, -1, -1, -1, 935, 936, 937, 940, 943, -1, -1, -1, 945, -1, -1, -1, -1, -1, 946, -1, 947, -1, -1, 948, 949, -1, 951, 952, -1, 953, 956, 959, -1, -1, -1, -1, 961, -1, -1, -1, 965, 968, 970, -1, 972, 973, 974, -1, 977, 978, -1, 981, -1, 982, -1, 983, -1, 984, 985, -1, 987, -1, -1, -1, -1, -1, -1, -1, 988, 989, 992, -1, 995, -1, -1, 996, -1, -1, 998, -1, -1, -1, -1, /* 0x5300 */ 999, -1, -1, 1000, 1002, 1004, 1005, -1, -1, -1, 1008, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1009, -1, 1011, 1012, -1, 1014, 1016, -1, 1017, 1018, -1, -1, -1, -1, 1019, 1020, 1021, 1023, -1, -1, -1, 1024, 1025, 1026, -1, 1028, 1029, 1032, -1, -1, -1, -1, 1035, -1, 1036, 1037, -1, -1, -1, -1, 1039, -1, -1, 1040, -1, -1, 1041, 1042, -1, 1046, -1, 1047, -1, 1049, 1050, 1053, 1056, -1, 1057, 1058, 1060, 1063, 1065, -1, 1067, -1, 1069, 1070, 1071, -1, -1, -1, 1073, -1, 1074, -1, 1075, 1082, -1, 1084, -1, -1, -1, 1085, -1, -1, 1087, 1088, 1090, -1, -1, 1091, 1093, -1, -1, 1094, 1096, 1097, -1, 1099, -1, 1100, -1, -1, -1, -1, 1102, -1, 1105, 1106, 1108, 1114, 1115, 1116, -1, 1117, 1119, 1120, 1121, -1, 1122, -1, -1, 1123, -1, 1124, -1, -1, 1126, 1130, 1131, 1132, -1, -1, -1, 1133, 1134, 1136, 1137, 1138, 1139, -1, 1141, -1, 1142, 1143, -1, -1, -1, 1145, 1146, 1147, 1152, -1, 1154, 1155, 1157, 1158, 1159, 1160, 1161, -1, 1164, 1165, -1, -1, 1166, 1168, -1, 1170, 1172, 1175, 1178, 1181, 1184, 1185, 1186, 1187, 1188, -1, 1189, 1190, 1193, 1194, 1195, 1196, -1, 1200, -1, 1202, -1, -1, 1203, 1205, -1, 1207, -1, -1, 1209, -1, 1210, 1214, 1216, -1, -1, -1, -1, 1220, -1, -1, 1223, 1226, -1, -1, -1, -1, 1227, -1, -1, -1, -1, -1, 1232, 1236, -1, 1237, -1, -1, -1, 1240, -1, -1, /* 0x5400 */ 1241, 1243, -1, 1245, -1, -1, -1, -1, 1247, -1, 1248, -1, 1249, -1, 1251, -1, -1, 1252, -1, 1254, -1, 1255, -1, 1256, -1, -1, -1, -1, -1, 1257, 1258, 1259, -1, -1, -1, -1, -1, -1, -1, -1, 1262, -1, -1, -1, 1263, -1, -1, 1265, -1, -1, -1, 1271, 1273, -1, 1275, -1, -1, -1, -1, 1276, -1, 1277, -1, 1278, -1, -1, 1279, -1, -1, -1, -1, -1, 1280, 1282, 1284, -1, 1285, 1286, -1, -1, 1287, 1288, 1289, 1290, -1, 1291, 1292, 1293, 1294, 1297, 1299, 1300, 1301, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1302, 1303, 1304, 1305, -1, -1, 1307, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1308, -1, -1, -1, -1, -1, -1, -1, -1, 1311, -1, -1, -1, -1, 1312, -1, 1315, -1, -1, 1318, -1, -1, 1319, -1, -1, -1, -1, -1, -1, 1321, -1, 1322, 1323, 1324, -1, -1, -1, -1, -1, -1, 1325, -1, -1, -1, -1, 1326, -1, -1, 1328, -1, -1, 1329, -1, 1331, 1334, -1, -1, -1, -1, -1, 1336, -1, -1, -1, 1338, 1340, -1, -1, -1, -1, -1, -1, 1341, -1, -1, -1, -1, -1, -1, -1, -1, 1343, -1, -1, -1, 1344, 1348, 1349, 1350, 1351, -1, 1352, -1, 1354, -1, -1, 1355, 1356, -1, 1357, -1, 1358, -1, 1361, -1, -1, -1, -1, -1, -1, -1, -1, 1362, -1, -1, -1, -1, -1, 1363, -1, -1, -1, 1368, -1, -1, -1, 1370, -1, -1, -1, -1, -1, /* 0x5500 */ 1371, -1, -1, -1, 1373, -1, -1, 1374, -1, -1, -1, -1, -1, 1375, -1, -1, 1376, -1, -1, -1, -1, 1377, 1378, -1, 1382, -1, -1, 1388, -1, 1389, -1, -1, 1390, -1, 1391, 1392, 1393, -1, -1, 1394, -1, -1, -1, 1395, -1, -1, -1, -1, -1, 1396, -1, -1, -1, -1, -1, -1, 1397, -1, -1, -1, -1, -1, -1, -1, 1398, -1, -1, -1, -1, -1, 1399, -1, -1, -1, -1, -1, -1, -1, -1, 1400, -1, -1, -1, 1401, 1407, -1, 1413, 1414, -1, -1, -1, -1, -1, -1, 1415, 1419, 1425, -1, -1, 1430, -1, -1, -1, 1433, -1, -1, -1, -1, 1434, 1435, 1436, 1440, 1441, -1, -1, -1, 1443, -1, -1, -1, 1444, -1, 1445, -1, -1, -1, -1, -1, 1446, -1, 1448, -1, 1450, -1, 1451, -1, -1, -1, -1, -1, -1, -1, 1456, -1, -1, 1458, 1460, -1, -1, -1, -1, -1, -1, -1, 1463, -1, 1464, -1, 1467, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1468, 1469, 1470, 1472, -1, 1473, 1475, 1477, -1, 1480, -1, -1, -1, 1481, 1483, -1, -1, -1, 1485, -1, 1486, 1487, -1, -1, -1, -1, -1, -1, 1488, 1489, 1490, -1, -1, 1491, -1, -1, -1, 1492, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1493, -1, 1494, -1, -1, -1, 1495, -1, -1, 1496, -1, 1497, -1, -1, -1, 1498, -1, 1499, -1, -1, -1, -1, -1, -1, -1, 1500, -1, -1, 1501, -1, -1, 1502, -1, -1, -1, -1, -1, -1, /* 0x5600 */ -1, -1, -1, -1, -1, -1, 1503, -1, -1, -1, 1505, -1, -1, 1506, -1, -1, -1, 1507, -1, 1509, 1510, -1, 1511, 1512, 1515, -1, -1, -1, 1516, -1, -1, -1, -1, -1, -1, -1, 1517, -1, -1, -1, 1518, 1519, -1, -1, -1, -1, 1521, 1522, 1524, 1525, -1, -1, -1, 1526, -1, 1527, 1528, -1, -1, -1, -1, 1529, -1, -1, -1, 1530, 1531, -1, 1532, 1534, -1, -1, -1, 1535, -1, -1, -1, -1, -1, -1, 1537, -1, -1, 1538, -1, 1539, 1540, -1, -1, -1, -1, 1542, 1544, 1545, -1, -1, 1546, 1547, -1, -1, -1, 1548, 1549, -1, 1550, -1, 1551, -1, -1, -1, -1, 1552, -1, -1, 1553, -1, 1554, 1556, -1, -1, 1559, 1560, -1, -1, -1, -1, 1561, -1, 1562, -1, -1, -1, -1, -1, -1, 1563, -1, -1, -1, -1, 1564, -1, -1, 1565, 1566, -1, -1, -1, 1569, 1570, -1, -1, -1, 1571, -1, -1, -1, -1, 1575, -1, 1580, -1, 1581, 1582, -1, 1583, 1584, -1, 1585, -1, -1, -1, -1, -1, 1586, -1, -1, -1, 1587, 1588, 1589, -1, 1591, -1, -1, -1, -1, 1592, -1, -1, -1, -1, 1593, 1594, 1595, -1, -1, 1597, -1, -1, 1598, 1599, 1601, -1, 1602, -1, -1, 1603, -1, 1604, -1, 1605, -1, -1, -1, 1608, 1611, 1617, -1, 1618, -1, -1, 1619, 1625, 1626, -1, 1627, 1630, -1, -1, 1633, 1636, -1, -1, 1637, -1, 1638, 1644, -1, 1647, 1652, 1653, 1654, 1657, 1660, 1663, 1664, -1, 1669, -1, -1, 1670, -1, 1675, 1680, -1, /* 0x5700 */ 1683, -1, -1, 1688, -1, -1, 1689, 1692, 1693, -1, -1, 1694, -1, 1699, 1702, 1705, -1, 1706, 1707, 1709, -1, -1, 1712, 1715, 1718, -1, -1, -1, -1, 1720, -1, 1722, -1, 1723, 1724, 1726, -1, -1, -1, 1727, 1729, -1, -1, -1, 1730, 1731, -1, -1, 1732, -1, -1, -1, -1, -1, -1, -1, -1, 1735, 1736, -1, -1, 1738, -1, -1, 1742, -1, 1743, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1745, 1749, 1750, -1, 1751, 1752, -1, -1, 1755, -1, 1758, 1759, 1760, 1766, 1767, 1769, 1771, 1773, -1, -1, 1775, 1776, -1, 1777, 1778, 1779, -1, -1, -1, -1, 1781, 1782, 1784, 1786, -1, -1, 1787, -1, 1788, -1, -1, 1790, -1, 1791, -1, -1, -1, -1, -1, -1, -1, 1792, -1, 1793, 1794, 1795, 1796, -1, -1, -1, 1797, -1, -1, -1, -1, -1, -1, 1798, 1800, 1801, 1802, 1803, -1, -1, -1, 1804, 1807, 1808, -1, -1, -1, -1, 1809, 1810, -1, -1, -1, 1811, 1812, 1813, 1814, -1, 1816, -1, 1817, -1, 1818, -1, 1819, 1820, -1, 1821, -1, -1, -1, -1, -1, -1, 1822, -1, -1, -1, -1, 1824, -1, -1, -1, -1, -1, 1825, -1, 1826, -1, 1827, -1, -1, -1, -1, -1, -1, 1830, 1835, 1836, -1, -1, -1, -1, 1837, 1838, 1840, -1, 1841, -1, 1843, -1, -1, 1845, -1, -1, -1, -1, 1846, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1847, -1, -1, -1, -1, 1848, 1851, -1, -1, /* 0x5800 */ -1, -1, 1852, 1853, -1, 1854, 1855, 1856, -1, -1, 1857, -1, -1, -1, -1, -1, -1, 1858, -1, -1, -1, 1859, 1861, -1, -1, 1862, -1, -1, -1, 1863, -1, -1, -1, -1, -1, -1, 1864, -1, 1866, -1, -1, -1, -1, -1, -1, -1, -1, 1868, 1871, 1873, -1, -1, 1874, -1, -1, -1, -1, -1, 1876, -1, -1, -1, -1, -1, -1, 1878, -1, -1, -1, -1, 1880, -1, -1, -1, 1881, 1884, -1, 1885, -1, 1886, 1887, 1888, 1889, -1, 1890, -1, -1, 1891, -1, 1892, 1893, -1, -1, -1, -1, 1894, -1, 1895, 1896, -1, 1897, -1, 1899, -1, -1, 1900, -1, 1902, -1, -1, -1, -1, -1, -1, 1903, -1, -1, 1905, -1, 1906, -1, 1908, -1, -1, 1910, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1913, 1914, -1, 1915, -1, -1, -1, -1, -1, -1, -1, -1, 1916, 1918, 1919, -1, 1920, -1, -1, 1922, -1, 1924, -1, -1, -1, 1925, -1, 1927, -1, -1, 1930, -1, -1, -1, -1, -1, -1, 1931, 1933, 1935, -1, -1, 1940, -1, 1942, 1947, -1, 1948, -1, -1, 1949, -1, -1, 1950, -1, -1, -1, -1, -1, 1951, -1, -1, 1953, -1, -1, 1954, 1956, 1957, 1958, 1959, -1, 1961, -1, -1, 1962, -1, -1, -1, -1, 1964, 1966, 1967, -1, 1968, -1, 1973, 1975, 1976, 1977, 1979, -1, 1980, 1981, -1, -1, -1, 1984, 1986, -1, -1, -1, 1987, 1989, 1991, 1992, 1993, 1995, -1, 1997, 1999, 2001, 2003, 2004, 2005, 2007, 2009, 2010, -1, -1, /* 0x5900 */ 2012, -1, 2014, -1, 2015, 2017, -1, 2018, -1, 2022, 2024, -1, -1, 2025, -1, 2028, -1, -1, -1, 2029, 2030, -1, -1, -1, 2031, -1, 2033, 2034, 2035, -1, -1, 2036, 2037, -1, 2038, 2040, -1, 2042, -1, -1, -1, 2043, -1, -1, 2046, 2047, -1, -1, -1, -1, 2048, 2050, 2051, -1, 2052, -1, 2053, 2054, 2055, -1, -1, -1, 2056, -1, -1, 2057, 2060, -1, -1, -1, -1, 2061, 2062, -1, -1, 2063, 2064, -1, -1, -1, 2065, -1, -1, -1, 2066, -1, 2068, -1, 2071, 2072, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2073, -1, 2075, 2077, 2080, 2083, -1, 2084, -1, 2087, -1, -1, -1, -1, -1, -1, -1, 2088, -1, 2090, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2092, 2096, 2098, -1, 2099, -1, -1, 2100, -1, -1, -1, -1, 2102, -1, -1, -1, 2103, -1, -1, 2104, -1, 2105, -1, 2106, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2110, 2111, 2112, 2114, -1, -1, -1, -1, -1, -1, 2115, -1, -1, -1, 2118, 2120, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2122, -1, -1, 2123, 2124, 2125, -1, 2127, -1, -1, 2128, -1, 2129, -1, -1, -1, -1, 2130, -1, 2131, -1, -1, 2132, -1, -1, -1, -1, -1, 2133, -1, -1, -1, 2134, 2136, -1, -1, 2138, 2140, 2141, -1, 2142, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2143, -1, -1, 2145, -1, -1, -1, -1, /* 0x5a00 */ -1, -1, -1, -1, 2146, 2147, 2148, 2149, 2150, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2151, -1, -1, -1, -1, -1, 2152, -1, -1, 2154, -1, -1, -1, 2156, -1, -1, -1, -1, 2157, -1, 2161, -1, -1, -1, -1, -1, -1, 2162, -1, 2163, 2165, 2166, 2168, -1, 2169, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2171, 2173, 2176, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2177, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2178, -1, -1, 2179, -1, -1, -1, -1, -1, 2181, 2182, -1, 2183, -1, -1, -1, 2185, 2186, 2189, 2190, -1, -1, -1, -1, -1, -1, -1, -1, 2191, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2193, 2195, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2196, -1, -1, 2197, -1, -1, 2198, -1, 2199, -1, -1, -1, -1, -1, -1, -1, -1, 2201, -1, -1, -1, 2202, 2203, -1, 2204, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2206, -1, -1, -1, -1, 2208, -1, 2209, -1, 2210, -1, -1, 2211, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2212, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2213, -1, -1, -1, 2214, 2215, -1, -1, -1, 2217, 2219, -1, -1, -1, 2221, /* 0x5b00 */ 2222, -1, -1, 2224, -1, -1, -1, -1, 2225, 2226, -1, 2227, 2228, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2229, -1, -1, -1, 2230, -1, -1, -1, 2232, 2233, -1, 2235, -1, -1, -1, -1, -1, 2236, -1, -1, 2238, -1, -1, 2240, -1, 2243, -1, -1, -1, -1, 2244, 2245, -1, -1, -1, -1, -1, 2246, -1, -1, -1, -1, 2247, -1, -1, 2249, -1, -1, -1, -1, -1, 2252, -1, -1, -1, -1, -1, 2253, 2254, -1, -1, -1, -1, -1, 2255, -1, -1, -1, -1, -1, -1, 2256, -1, -1, -1, -1, -1, 2257, -1, -1, -1, 2262, 2263, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2264, -1, -1, -1, 2269, 2270, 2271, 2274, -1, 2275, 2281, 2282, -1, -1, 2285, -1, 2286, -1, 2287, -1, -1, 2288, -1, -1, 2289, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2291, 2293, 2297, 2299, 2301, 2302, -1, -1, -1, -1, -1, -1, -1, 2304, 2305, 2306, -1, -1, 2307, -1, -1, -1, -1, -1, 2308, -1, 2310, 2311, -1, -1, -1, 2313, 2314, 2316, 2318, -1, 2320, -1, -1, 2321, -1, -1, 2322, 2323, 2325, 2327, -1, -1, 2334, 2335, -1, -1, -1, -1, -1, 2341, -1, 2342, -1, 2348, -1, -1, 2354, 2358, 2360, 2366, -1, 2367, 2368, -1, 2370, -1, -1, -1, 2371, 2373, -1, 2379, -1, 2381, 2383, -1, -1, -1, -1, -1, -1, 2385, -1, 2389, 2390, -1, -1, 2394, -1, 2396, 2397, -1, 2398, 2400, /* 0x5c00 */ -1, -1, 2402, -1, -1, 2404, 2407, 2408, 2409, 2411, -1, 2412, -1, 2413, 2415, -1, -1, -1, 2416, 2419, 2422, -1, -1, -1, 2425, 2426, 2427, 2428, -1, 2432, 2435, 2436, 2441, -1, 2446, 2449, 2450, 2452, 2453, 2454, -1, 2457, -1, 2458, 2459, 2460, -1, -1, -1, -1, 2463, -1, 2468, -1, 2473, 2478, 2483, -1, -1, -1, -1, 2484, -1, -1, 2487, -1, 2489, 2490, -1, 2491, 2492, -1, -1, -1, 2493, -1, 2494, 2496, 2497, 2498, -1, -1, -1, 2500, -1, -1, -1, -1, -1, -1, -1, 2501, -1, -1, 2503, -1, -1, 2504, 2505, -1, 2506, -1, 2507, -1, 2508, -1, -1, -1, 2509, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2510, 2511, 2512, 2516, -1, -1, 2517, -1, -1, 2519, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2520, 2521, 2522, -1, 2523, 2524, -1, -1, -1, -1, -1, 2531, -1, -1, -1, -1, -1, -1, -1, 2532, -1, -1, -1, 2538, -1, -1, -1, -1, -1, 2539, 2540, -1, -1, -1, -1, -1, -1, -1, -1, 2541, -1, 2542, -1, -1, -1, 2543, 2544, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2545, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2546, -1, -1, -1, 2547, -1, 2548, 2549, 2550, 2551, -1, 2552, 2553, -1, -1, -1, -1, -1, 2554, 2555, -1, -1, -1, 2556, 2557, 2560, -1, -1, -1, -1, -1, -1, 2567, -1, -1, /* 0x5d00 */ -1, -1, 2568, 2569, 2570, -1, -1, 2571, 2572, -1, -1, 2573, -1, 2575, 2576, -1, -1, -1, -1, -1, -1, -1, 2579, 2580, 2581, 2583, -1, -1, -1, -1, -1, -1, -1, -1, 2585, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2586, 2587, -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, 2589, -1, -1, -1, 2590, -1, 2591, 2594, -1, -1, -1, 2597, 2601, -1, 2604, -1, 2605, 2608, -1, -1, 2609, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2611, -1, -1, -1, 2612, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2613, -1, 2614, 2615, -1, -1, 2616, -1, -1, -1, 2618, 2625, -1, -1, -1, -1, -1, -1, -1, 2632, -1, -1, 2633, -1, -1, -1, -1, -1, -1, -1, -1, 2634, -1, 2635, -1, -1, -1, -1, 2636, 2637, -1, -1, -1, -1, -1, 2638, -1, -1, -1, 2639, 2640, 2643, -1, -1, -1, 2645, 2648, 2655, -1, 2656, 2657, -1, -1, -1, -1, -1, -1, -1, 2658, 2660, -1, -1, -1, -1, 2663, 2664, -1, -1, -1, -1, -1, 2667, 2668, 2669, -1, 2670, 2673, -1, -1, -1, 2676, -1, 2677, -1, -1, 2678, -1, 2679, 2680, -1, -1, -1, -1, -1, 2681, -1, -1, -1, -1, -1, 2682, 2683, -1, -1, -1, -1, 2684, -1, 2685, -1, -1, 2686, 2687, -1, 2689, -1, 2690, /* 0x5e00 */ 2692, 2694, -1, 2697, -1, 2698, -1, -1, 2699, -1, -1, 2700, -1, -1, -1, 2701, 2702, 2703, 2704, -1, -1, 2705, -1, -1, 2706, -1, 2707, -1, 2708, -1, -1, -1, -1, -1, -1, -1, -1, 2710, 2711, 2713, -1, -1, -1, 2714, -1, 2715, 2716, 2719, 2721, 2724, -1, 2725, -1, -1, 2726, -1, -1, -1, -1, 2728, 2729, 2730, -1, -1, 2731, -1, 2732, 2734, -1, -1, -1, 2735, 2738, -1, -1, -1, 2740, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2741, 2742, -1, 2743, -1, -1, -1, -1, 2746, -1, 2748, -1, 2749, 2751, -1, -1, -1, -1, -1, -1, 2753, 2756, -1, -1, -1, -1, -1, 2757, -1, 2760, -1, 2761, 2767, 2768, 2769, 2771, -1, -1, -1, 2772, 2773, -1, 2776, -1, 2778, 2780, 2782, 2786, -1, -1, -1, 2787, -1, -1, -1, -1, -1, 2788, 2789, -1, 2790, 2791, -1, -1, -1, -1, 2793, -1, -1, -1, -1, 2794, 2795, -1, -1, -1, -1, -1, -1, -1, 2797, -1, -1, -1, 2798, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2799, 2803, -1, -1, -1, 2804, 2809, 2810, 2811, -1, 2812, -1, 2813, 2815, 2816, -1, -1, -1, -1, 2818, -1, -1, -1, -1, -1, 2819, 2820, 2822, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2824, 2825, -1, 2828, -1, 2829, 2831, 2833, 2834, 2836, -1, -1, -1, -1, -1, 2838, 2839, -1, 2840, -1, -1, -1, 2841, -1, -1, 2844, -1, -1, -1, -1, 2848, -1, -1, 2849, 2855, 2857, -1, -1, /* 0x5f00 */ 2863, 2864, 2871, 2872, 2873, -1, -1, -1, -1, 2875, -1, -1, 2876, 2877, 2878, -1, 2880, 2883, 2884, -1, 2885, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2886, -1, -1, -1, -1, 2887, 2889, -1, -1, -1, 2890, -1, -1, -1, -1, 2891, -1, -1, -1, 2892, -1, 2893, -1, 2894, -1, 2895, 2897, 2898, 2899, -1, 2900, -1, -1, -1, -1, -1, -1, -1, 2902, -1, 2903, -1, -1, -1, 2905, -1, 2906, -1, 2907, 2908, 2909, 2912, 2914, 2915, -1, 2918, -1, 2919, 2921, 2923, 2926, 2929, 2932, 2935, 2936, -1, -1, -1, -1, 2938, 2939, -1, 2940, 2941, -1, 2942, 2943, -1, -1, -1, -1, -1, 2945, -1, 2946, -1, -1, 2947, -1, -1, -1, 2950, -1, -1, -1, 2951, 2953, 2955, -1, 2958, 2959, -1, -1, 2962, 2963, -1, 2964, -1, 2965, -1, -1, 2966, -1, 2967, -1, 2970, -1, 2972, -1, -1, -1, -1, -1, -1, -1, -1, 2974, -1, 2976, 2978, -1, 2979, 2981, -1, -1, -1, -1, 2982, -1, -1, 2984, 2987, -1, -1, 2988, 2989, -1, 2990, 2993, 2995, -1, 2997, -1, 3000, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3001, 3002, -1, 3003, -1, -1, -1, -1, -1, -1, -1, 3004, 3005, -1, -1, -1, -1, -1, -1, -1, 3007, -1, 3008, -1, -1, 3009, -1, -1, -1, -1, -1, 3011, 3012, -1, -1, -1, 3013, -1, 3014, -1, -1, -1, -1, -1, -1, 3017, -1, -1, -1, -1, 3018, -1, -1, -1, -1, -1, -1, -1, -1, 3019, -1, /* 0x6000 */ 3020, 3022, 3023, 3024, 3025, 3026, 3027, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3028, -1, 3029, -1, -1, -1, -1, -1, 3030, 3031, -1, -1, -1, -1, -1, 3032, -1, 3034, -1, -1, -1, -1, 3035, -1, -1, -1, -1, -1, -1, 3036, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3039, 3044, -1, -1, 3045, -1, -1, -1, -1, -1, -1, 3046, -1, -1, -1, -1, 3047, -1, -1, -1, -1, -1, -1, 3048, 3049, -1, -1, 3051, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3052, 3053, -1, -1, 3055, 3057, -1, -1, -1, -1, 3058, -1, -1, -1, -1, -1, -1, 3059, -1, 3061, 3062, 3065, 3066, -1, 3070, 3071, 3072, 3073, 3074, 3076, 3077, 3078, 3080, -1, -1, -1, -1, 3082, -1, -1, -1, -1, 3084, 3089, -1, 3090, -1, -1, -1, 3091, -1, 3092, -1, -1, 3093, -1, -1, -1, -1, -1, -1, -1, 3095, 3096, -1, -1, 3097, -1, 3098, -1, 3101, -1, -1, 3103, 3105, 3108, 3109, 3110, -1, 3111, -1, -1, -1, 3112, 3115, 3116, 3117, -1, -1, -1, -1, -1, -1, 3118, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3120, -1, -1, -1, -1, -1, -1, -1, 3122, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3125, -1, 3127, 3128, -1, 3131, -1, 3132, -1, 3134, 3135, 3136, -1, 3137, 3138, 3139, 3141, 3142, -1, 3143, 3145, -1, -1, -1, -1, 3146, -1, -1, -1, 3147, 3148, -1, -1, -1, /* 0x6100 */ -1, -1, 3149, -1, -1, -1, -1, -1, 3151, -1, -1, -1, -1, -1, -1, -1, -1, 3153, -1, -1, -1, -1, -1, -1, -1, 3155, -1, 3156, 3157, -1, -1, -1, 3158, 3159, -1, -1, 3160, -1, 3161, 3162, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3164, 3165, -1, -1, 3166, -1, 3167, -1, -1, 3169, 3170, 3171, 3172, -1, -1, 3173, -1, 3175, -1, -1, 3176, -1, -1, -1, 3177, -1, 3178, 3179, -1, -1, 3182, -1, -1, -1, -1, -1, -1, 3184, 3185, 3187, -1, -1, -1, -1, 3189, -1, -1, -1, 3191, 3192, -1, -1, -1, -1, -1, 3193, 3194, -1, 3195, 3196, -1, -1, -1, -1, 3197, 3198, -1, 3199, -1, -1, -1, -1, -1, 3200, 3202, 3204, 3205, -1, 3208, 3209, -1, -1, 3210, -1, 3211, -1, -1, 3212, -1, -1, -1, -1, -1, 3213, 3214, 3217, -1, 3218, -1, 3220, 3222, 3223, 3226, 3229, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3230, 3231, -1, -1, -1, 3234, -1, 3235, -1, -1, 3236, -1, -1, -1, 3237, -1, -1, -1, 3238, -1, -1, -1, -1, 3239, -1, -1, -1, -1, -1, -1, -1, 3240, -1, -1, -1, 3241, -1, 3242, -1, -1, 3244, 3245, -1, -1, 3246, 3248, 3249, -1, 3251, -1, -1, -1, -1, -1, -1, -1, 3252, -1, 3253, 3254, -1, -1, -1, 3255, -1, -1, 3256, 3257, 3258, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3259, -1, 3260, 3262, 3263, 3264, 3266, -1, 3267, -1, 3268, 3270, 3271, 3272, /* 0x6200 */ 3273, -1, -1, -1, -1, -1, 3274, 3275, -1, -1, -1, 3276, -1, -1, -1, 3277, -1, -1, -1, -1, 3279, -1, -1, 3280, 3281, -1, 3283, 3285, -1, 3286, 3288, -1, -1, -1, -1, -1, -1, -1, 3289, 3291, -1, 3292, -1, -1, 3293, -1, 3294, 3296, 3298, -1, 3300, -1, -1, -1, 3302, 3304, 3306, 3308, -1, 3309, 3310, -1, 3312, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3313, 3314, 3315, 3316, -1, -1, 3318, -1, -1, -1, 3320, -1, 3321, 3322, -1, -1, -1, -1, -1, 3324, -1, 3325, -1, -1, 3326, -1, -1, -1, 3327, 3328, 3330, 3332, 3333, 3334, -1, -1, 3335, 3336, -1, -1, -1, -1, 3337, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3338, -1, -1, -1, -1, -1, -1, 3340, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3341, 3342, 3343, 3344, 3345, 3347, 3348, 3349, 3350, -1, 3351, 3352, -1, -1, -1, -1, -1, -1, 3353, -1, -1, -1, -1, -1, -1, -1, -1, 3354, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3357, -1, -1, 3358, -1, -1, 3359, -1, -1, 3360, -1, -1, -1, 3361, 3362, -1, -1, 3364, 3365, 3366, 3367, 3368, -1, -1, -1, -1, 3369, 3370, 3371, 3372, 3373, 3375, 3378, 3379, -1, 3380, 3381, 3382, 3383, 3385, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3387, /* 0x6300 */ -1, -1, 3388, -1, 3389, -1, -1, -1, -1, -1, 3391, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3393, 3396, 3397, 3398, 3399, 3400, 3401, 3402, 3403, 3404, 3405, 3406, 3407, 3408, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3409, -1, 3411, -1, -1, -1, -1, -1, 3412, 3413, 3414, -1, 3415, -1, -1, -1, -1, 3418, -1, -1, -1, -1, -1, -1, 3421, -1, 3422, -1, -1, -1, -1, -1, -1, -1, 3423, -1, -1, -1, -1, 3424, -1, 3425, 3426, -1, 3427, 3428, 3429, -1, -1, -1, -1, 3431, -1, -1, 3432, -1, -1, 3433, -1, -1, -1, 3435, -1, 3437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3438, -1, -1, -1, 3440, 3442, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3443, -1, 3444, -1, 3445, -1, -1, -1, -1, -1, 3446, -1, -1, -1, 3447, -1, -1, -1, -1, -1, -1, 3448, -1, -1, -1, -1, -1, 3449, 3450, 3451, -1, -1, 3452, 3453, -1, 3454, 3455, 3456, 3457, -1, -1, 3458, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3459, 3460, -1, -1, -1, -1, -1, -1, -1, 3461, 3462, -1, -1, -1, -1, 3463, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3464, 3465, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3466, 3467, -1, -1, 3469, -1, 3470, /* 0x6400 */ 3471, 3472, 3473, 3474, -1, 3475, 3478, -1, -1, -1, -1, -1, -1, 3479, -1, -1, -1, -1, 3480, -1, 3481, -1, 3482, 3484, -1, -1, -1, -1, 3485, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3487, -1, -1, -1, -1, 3488, -1, -1, -1, -1, 3489, -1, -1, -1, 3490, -1, -1, -1, 3491, -1, -1, -1, 3493, -1, -1, -1, 3494, -1, 3496, 3498, 3499, 3501, 3503, -1, 3504, -1, -1, -1, -1, -1, -1, 3505, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3506, -1, -1, 3507, 3508, -1, -1, -1, -1, -1, -1, -1, -1, 3511, -1, -1, -1, -1, -1, 3512, -1, -1, -1, 3513, -1, -1, 3514, -1, -1, -1, -1, 3515, -1, -1, -1, -1, -1, -1, -1, 3516, 3518, -1, -1, -1, 3519, -1, -1, -1, -1, -1, -1, 3520, 3521, 3522, -1, 3523, -1, -1, -1, -1, 3524, -1, 3525, -1, -1, -1, -1, 3526, -1, 3527, -1, 3528, -1, 3529, 3531, 3532, -1, -1, -1, 3535, -1, -1, -1, -1, -1, -1, 3536, 3538, -1, 3539, -1, 3540, 3541, 3542, 3545, 3546, -1, -1, 3547, 3548, -1, 3549, -1, -1, 3550, -1, -1, 3551, 3553, -1, 3555, 3557, -1, 3558, -1, -1, -1, 3559, -1, -1, 3560, 3561, -1, -1, -1, -1, 3563, -1, -1, -1, 3565, -1, 3566, 3567, -1, 3568, -1, 3569, -1, 3570, -1, -1, -1, -1, 3573, -1, -1, 3574, 3575, 3576, 3577, -1, 3578, 3581, -1, 3582, -1, -1, 3584, 3585, 3586, 3587, 3588, -1, /* 0x6500 */ 3589, -1, -1, -1, 3590, 3591, 3592, -1, 3593, -1, 3594, -1, -1, -1, -1, 3595, -1, -1, 3596, -1, 3597, -1, 3598, -1, -1, 3599, -1, 3600, 3601, 3603, -1, 3605, -1, -1, 3606, 3608, 3609, -1, -1, -1, 3610, -1, 3611, 3614, 3615, -1, -1, -1, -1, -1, -1, -1, 3617, 3618, 3619, 3620, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3621, 3625, 3628, -1, -1, 3629, 3630, 3632, 3633, -1, -1, -1, -1, -1, 3634, -1, 3636, 3638, 3640, -1, 3641, -1, -1, 3643, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3644, -1, -1, -1, -1, -1, -1, 3649, -1, -1, -1, -1, 3650, -1, 3651, 3652, -1, 3653, -1, -1, -1, -1, -1, -1, 3657, 3658, 3660, -1, 3661, 3666, -1, 3671, 3676, 3680, 3684, 3686, 3688, 3689, -1, -1, -1, -1, 3691, 3692, 3694, -1, 3695, -1, -1, -1, -1, -1, -1, 3700, 3702, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3703, -1, -1, 3704, 3705, -1, -1, -1, -1, 3706, -1, -1, 3707, -1, 3708, -1, -1, -1, -1, 3709, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3712, 3713, -1, -1, -1, -1, -1, -1, -1, -1, 3714, -1, -1, -1, -1, 3715, 3717, 3719, -1, 3721, -1, -1, -1, -1, 3722, -1, -1, -1, -1, 3723, -1, 3724, -1, -1, 3725, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3728, 3730, 3733, 3734, 3736, -1, -1, -1, 3737, 3738, /* 0x6600 */ -1, -1, 3739, -1, -1, -1, -1, 3740, -1, -1, 3742, -1, -1, -1, 3743, 3744, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3745, 3746, -1, -1, -1, -1, 3747, -1, -1, -1, -1, -1, 3748, 3749, -1, -1, -1, -1, -1, 3750, 3751, -1, 3752, 3753, -1, -1, -1, -1, -1, -1, -1, 3754, -1, -1, 3755, 3756, 3758, 3759, 3761, -1, -1, 3763, 3765, 3766, -1, -1, -1, -1, 3767, -1, 3768, -1, -1, -1, -1, -1, -1, 3769, 3770, 3772, 3773, 3774, -1, -1, -1, 3775, -1, -1, 3776, -1, 3778, 3779, -1, -1, -1, 3780, -1, -1, -1, 3781, 3782, -1, -1, -1, -1, 3783, -1, -1, -1, -1, -1, 3784, -1, -1, -1, -1, -1, -1, 3786, -1, -1, -1, -1, 3787, 3788, 3790, 3791, -1, -1, -1, -1, 3793, 3794, -1, -1, -1, -1, -1, -1, -1, -1, 3795, -1, -1, -1, 3796, 3798, 3803, -1, -1, -1, 3804, -1, -1, -1, -1, -1, 3805, -1, 3806, -1, 3809, 3812, 3813, -1, -1, 3814, -1, 3815, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3817, -1, -1, -1, -1, -1, -1, -1, -1, 3819, -1, -1, 3820, -1, 3821, 3825, -1, 3826, -1, -1, 3828, 3832, -1, 3833, -1, -1, -1, -1, -1, -1, 3834, -1, -1, -1, -1, -1, -1, -1, -1, 3835, 3836, -1, -1, -1, -1, -1, -1, -1, 3838, -1, -1, -1, 3839, -1, -1, -1, -1, -1, 3840, 3845, -1, 3846, -1, -1, 3847, 3850, 3851, 3852, -1, 3854, 3855, -1, /* 0x6700 */ 3856, -1, 3857, 3859, -1, -1, -1, 3860, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3861, 3862, -1, 3863, -1, 3864, -1, -1, 3865, 3866, -1, -1, 3867, -1, -1, -1, -1, 3868, -1, -1, -1, -1, 3869, 3871, 3872, 3873, -1, 3875, -1, -1, 3876, 3878, 3879, -1, -1, -1, 3880, -1, -1, -1, -1, -1, 3882, -1, 3883, 3886, -1, -1, 3888, 3889, -1, 3890, -1, -1, -1, -1, -1, -1, -1, 3893, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3894, 3895, -1, -1, 3896, 3897, 3898, -1, 3899, 3900, -1, -1, -1, -1, -1, 3901, 3903, 3904, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3905, 3911, 3912, 3917, -1, -1, 3918, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3920, -1, -1, 3921, -1, -1, -1, -1, -1, -1, 3925, -1, -1, 3928, -1, 3929, -1, -1, 3930, 3931, 3932, -1, 3933, 3934, 3935, 3936, 3937, 3942, 3945, -1, 3946, -1, -1, -1, 3947, -1, -1, 3950, -1, -1, -1, -1, -1, -1, 3952, -1, -1, -1, -1, -1, 3953, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3954, -1, -1, -1, -1, -1, 3955, -1, 3956, -1, -1, -1, -1, 3961, -1, -1, -1, 3962, -1, -1, -1, -1, 3963, -1, -1, -1, 3964, -1, -1, -1, -1, -1, -1, 3966, -1, -1, 3967, -1, 3970, -1, -1, -1, 3971, 3972, 3974, -1, 3975, 3976, 3978, /* 0x6800 */ 3979, 3980, -1, 3983, 3985, 3987, -1, 3988, 3989, 3991, 3992, 3994, 3995, -1, 3997, 3999, -1, 4001, -1, -1, -1, -1, 4002, 4004, -1, -1, -1, -1, -1, -1, 4006, -1, -1, -1, 4007, -1, -1, -1, -1, 4008, -1, -1, -1, -1, -1, -1, -1, -1, 4009, -1, -1, -1, -1, -1, -1, 4011, 4013, -1, -1, -1, -1, -1, 4014, -1, -1, -1, 4016, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4017, -1, -1, -1, -1, 4019, 4020, -1, -1, -1, -1, -1, 4021, -1, -1, -1, 4022, 4024, -1, 4025, 4027, 4030, 4031, 4032, 4033, 4034, 4036, 4037, 4038, 4039, 4040, -1, -1, -1, 4041, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4043, 4044, -1, 4047, -1, -1, 4048, -1, 4049, -1, -1, 4051, 4052, -1, -1, -1, -1, -1, -1, -1, 4054, -1, -1, -1, -1, -1, -1, 4056, -1, -1, -1, 4057, -1, -1, -1, -1, 4058, -1, 4059, -1, -1, -1, -1, -1, 4060, 4065, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4067, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4069, -1, 4070, 4071, 4072, -1, 4074, -1, 4075, -1, -1, -1, -1, -1, 4076, 4080, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4084, 4085, 4086, -1, -1, -1, -1, -1, -1, -1, 4087, -1, -1, -1, -1, -1, 4088, -1, 4089, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4091, 4092, -1, -1, -1, 4094, -1, -1, 4095, -1, -1, -1, -1, -1, -1, /* 0x6900 */ 4096, 4097, -1, -1, -1, -1, -1, -1, -1, 4098, -1, -1, -1, -1, 4100, 4101, -1, -1, -1, -1, -1, -1, -1, 4104, 4106, 4107, -1, -1, 4108, -1, -1, 4110, 4111, -1, 4112, -1, 4113, -1, -1, -1, -1, -1, -1, 4114, -1, 4115, -1, -1, 4116, -1, -1, -1, 4117, -1, 4118, -1, -1, 4119, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4120, -1, -1, 4121, -1, -1, -1, -1, -1, 4123, -1, 4124, -1, -1, -1, 4125, 4126, -1, -1, -1, -1, -1, 4127, 4128, -1, -1, -1, 4129, 4130, -1, 4131, -1, 4132, 4133, -1, 4134, -1, -1, -1, -1, -1, 4135, -1, 4137, -1, -1, -1, -1, -1, -1, 4138, 4139, -1, 4141, -1, -1, -1, -1, 4142, 4143, 4144, 4145, 4146, 4147, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4149, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4150, -1, 4152, -1, 4153, -1, -1, -1, 4154, -1, -1, -1, 4156, -1, 4157, -1, -1, -1, -1, -1, -1, -1, 4158, -1, -1, 4159, -1, -1, -1, -1, -1, -1, -1, 4160, 4161, -1, -1, 4163, -1, 4164, -1, -1, -1, 4165, -1, 4167, 4168, 4170, -1, 4172, 4174, 4176, 4177, 4178, -1, -1, 4180, 4181, 4182, -1, -1, -1, 4183, -1, -1, 4184, 4185, -1, -1, -1, -1, -1, -1, -1, -1, 4186, -1, 4187, -1, -1, 4188, -1, -1, 4189, -1, -1, -1, -1, -1, -1, /* 0x6a00 */ -1, 4190, 4191, 4193, -1, 4194, -1, -1, -1, -1, 4195, -1, -1, -1, -1, -1, 4196, 4197, 4199, 4200, -1, -1, -1, -1, -1, 4201, -1, -1, -1, -1, 4202, -1, -1, -1, -1, 4203, -1, -1, -1, -1, -1, 4205, 4207, -1, -1, -1, -1, 4209, -1, 4211, -1, 4213, -1, -1, -1, 4214, 4218, 4220, 4221, -1, -1, 4222, -1, 4223, -1, -1, -1, 4224, -1, -1, -1, -1, 4226, -1, 4227, 4228, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4230, -1, -1, 4231, -1, -1, -1, -1, -1, -1, -1, -1, 4233, -1, -1, 4235, -1, 4238, 4239, -1, -1, -1, -1, -1, -1, -1, 4240, -1, -1, 4243, -1, -1, -1, -1, 4244, -1, 4245, -1, -1, 4246, -1, -1, 4247, -1, -1, -1, -1, -1, 4248, 4250, -1, -1, -1, 4251, -1, -1, 4252, 4254, -1, -1, -1, 4255, 4256, -1, 4257, -1, -1, 4258, 4260, -1, -1, -1, -1, -1, 4261, 4262, -1, -1, -1, 4264, 4265, -1, 4267, -1, 4271, -1, -1, -1, -1, 4272, -1, -1, 4273, -1, -1, -1, -1, 4274, 4278, 4279, 4280, -1, -1, -1, -1, 4281, -1, -1, -1, 4282, -1, 4283, -1, -1, -1, -1, 4285, 4287, 4288, -1, -1, -1, -1, 4289, 4290, -1, 4291, 4292, 4293, -1, -1, -1, -1, -1, 4295, -1, 4296, 4297, -1, 4298, -1, 4299, -1, -1, -1, -1, -1, -1, 4300, -1, -1, -1, -1, 4301, -1, 4302, 4303, -1, 4305, -1, -1, /* 0x6b00 */ -1, -1, -1, -1, 4306, 4308, -1, -1, -1, 4309, 4313, -1, -1, -1, -1, 4315, -1, 4316, 4317, -1, -1, -1, 4319, 4320, -1, -1, -1, -1, -1, 4322, 4325, -1, 4327, -1, 4329, 4333, 4336, -1, -1, 4337, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4338, -1, -1, 4339, -1, -1, -1, -1, -1, 4340, -1, 4341, 4342, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4343, -1, 4344, -1, 4346, -1, -1, 4347, -1, -1, 4349, -1, 4352, -1, -1, 4353, -1, 4355, -1, 4356, -1, 4357, -1, -1, -1, 4359, -1, -1, 4361, 4363, -1, -1, 4365, -1, 4366, 4369, -1, -1, 4371, 4375, 4379, -1, -1, 4382, 4385, 4388, 4389, -1, 4390, -1, 4392, 4396, 4400, 4401, -1, -1, -1, -1, -1, 4405, -1, -1, -1, 4406, -1, -1, -1, -1, -1, -1, 4407, 4408, -1, -1, -1, -1, 4409, -1, 4410, -1, -1, -1, 4411, -1, -1, 4412, -1, -1, 4413, -1, -1, -1, -1, -1, -1, 4414, -1, -1, 4415, 4416, -1, 4417, 4419, -1, 4421, -1, -1, 4422, -1, -1, 4423, 4424, 4426, -1, -1, -1, 4428, 4429, 4432, -1, -1, -1, 4433, -1, -1, 4434, -1, -1, -1, -1, 4436, 4437, -1, -1, -1, 4438, 4440, 4441, -1, 4442, 4443, 4444, -1, -1, -1, -1, -1, 4445, -1, 4446, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4447, -1, 4448, -1, -1, -1, -1, -1, -1, 4449, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4450, /* 0x6c00 */ -1, -1, 4451, -1, -1, -1, -1, 4453, 4454, -1, 4456, -1, 4457, -1, -1, -1, -1, -1, -1, -1, 4458, -1, -1, 4461, -1, -1, -1, 4464, -1, -1, -1, -1, -1, -1, 4465, 4466, -1, -1, -1, -1, -1, 4469, -1, 4470, 4471, -1, -1, -1, -1, -1, 4472, 4473, 4474, 4476, -1, 4478, -1, -1, 4481, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4483, -1, 4487, -1, -1, -1, -1, 4488, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4489, 4491, -1, -1, -1, -1, -1, -1, 4493, -1, -1, 4495, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4496, 4497, -1, -1, -1, -1, 4498, 4499, 4500, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4501, 4503, -1, -1, -1, -1, -1, -1, -1, -1, 4504, -1, -1, -1, 4505, 4506, -1, -1, -1, -1, -1, -1, -1, 4507, -1, 4508, 4513, 4515, 4516, 4517, 4518, 4519, 4520, 4521, 4522, -1, -1, -1, 4524, -1, -1, 4525, 4526, -1, -1, 4527, -1, -1, -1, -1, -1, -1, -1, -1, 4528, -1, -1, 4529, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4530, -1, -1, -1, -1, -1, 4532, -1, 4533, 4534, -1, -1, -1, -1, -1, -1, 4535, -1, -1, 4536, -1, 4537, -1, -1, -1, -1, 4539, 4540, -1, -1, -1, -1, -1, 4541, 4542, 4544, -1, 4545, 4546, 4547, 4550, 4552, -1, /* 0x6d00 */ -1, 4553, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4554, -1, -1, -1, -1, -1, 4555, -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, 4556, -1, -1, -1, -1, -1, -1, 4557, -1, -1, -1, -1, -1, 4558, -1, -1, -1, 4559, -1, -1, 4560, 4561, 4562, 4563, 4564, 4565, 4566, 4567, 4568, -1, 4569, 4570, 4572, 4574, 4575, 4576, 4577, 4578, 4579, -1, -1, -1, -1, -1, -1, 4580, -1, -1, -1, -1, -1, -1, 4583, -1, -1, -1, 4584, -1, 4587, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4588, -1, -1, 4589, -1, -1, -1, -1, -1, 4590, -1, -1, 4592, -1, 4593, -1, 4594, -1, -1, 4595, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4596, -1, -1, 4598, -1, 4600, 4601, 4603, 4604, 4605, 4606, 4607, 4608, 4609, 4610, -1, 4611, 4612, 4614, 4615, -1, -1, -1, -1, -1, 4619, -1, -1, -1, -1, -1, -1, -1, -1, 4620, -1, -1, -1, 4621, -1, -1, -1, 4622, -1, -1, -1, 4623, -1, -1, -1, -1, -1, -1, 4624, -1, -1, -1, -1, -1, -1, 4625, -1, -1, -1, -1, -1, -1, -1, 4626, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4628, -1, -1, 4629, -1, 4631, 4632, -1, -1, -1, -1, -1, -1, -1, 4634, -1, 4635, 4638, -1, 4639, -1, 4640, 4641, -1, -1, -1, -1, /* 0x6e00 */ -1, -1, -1, -1, -1, 4642, -1, 4643, 4644, 4646, 4647, 4650, 4654, 4655, 4656, -1, 4658, 4659, -1, 4660, 4664, 4665, 4668, 4669, -1, 4670, -1, 4671, -1, -1, -1, -1, -1, -1, 4672, -1, -1, -1, 4673, -1, -1, 4674, -1, -1, 4675, -1, -1, -1, -1, -1, -1, -1, 4676, -1, -1, -1, 4677, -1, -1, -1, -1, -1, 4679, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4680, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4681, -1, -1, -1, -1, -1, -1, -1, -1, 4682, -1, -1, -1, -1, -1, -1, -1, 4683, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4684, 4685, 4686, 4687, 4688, 4690, 4692, 4693, 4694, -1, 4695, -1, 4696, -1, 4697, -1, -1, 4698, -1, -1, -1, 4701, -1, -1, -1, -1, 4702, 4704, -1, -1, -1, -1, -1, 4706, 4707, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4708, 4712, -1, -1, 4713, 4714, -1, -1, -1, 4716, -1, -1, 4717, -1, -1, -1, -1, -1, 4719, -1, -1, -1, -1, -1, -1, -1, 4721, 4722, -1, -1, -1, -1, -1, -1, 4723, -1, 4724, -1, -1, -1, -1, -1, -1, -1, -1, 4725, -1, 4726, 4728, 4729, -1, 4730, 4732, 4733, 4736, 4737, 4739, -1, 4740, 4741, 4742, -1, 4743, 4746, 4747, -1, 4748, -1, -1, 4750, -1, -1, 4751, -1, -1, -1, -1, 4752, 4755, -1, -1, 4757, -1, -1, 4758, 4759, /* 0x6f00 */ -1, 4761, -1, -1, 4762, -1, 4763, -1, -1, -1, 4764, -1, -1, -1, -1, -1, -1, 4765, -1, 4766, -1, -1, -1, -1, -1, -1, 4767, -1, -1, -1, -1, -1, -1, -1, 4768, 4769, -1, -1, -1, 4770, -1, -1, -1, 4773, 4774, -1, -1, -1, -1, 4775, 4776, -1, -1, -1, -1, -1, 4777, -1, -1, -1, -1, -1, -1, 4778, -1, 4779, -1, -1, 4780, 4781, 4782, 4783, -1, -1, -1, 4784, -1, 4785, -1, -1, -1, 4786, -1, -1, 4789, -1, -1, -1, -1, 4791, -1, 4792, 4794, -1, -1, -1, -1, -1, -1, -1, 4796, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4797, 4798, -1, -1, -1, 4799, -1, -1, 4800, -1, -1, -1, -1, -1, -1, -1, 4801, 4802, 4806, 4810, -1, 4813, -1, 4816, 4817, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4818, -1, -1, 4819, -1, -1, 4820, -1, -1, 4821, 4822, 4825, -1, -1, 4826, 4828, -1, -1, 4829, 4830, -1, 4832, -1, -1, 4833, -1, -1, -1, -1, 4834, -1, 4835, 4836, -1, 4837, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4838, -1, 4839, -1, -1, -1, 4840, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4841, 4843, -1, 4844, 4845, -1, -1, 4847, -1, 4848, 4850, 4852, -1, -1, 4853, -1, -1, -1, -1, 4855, -1, -1, -1, -1, -1, -1, 4856, -1, -1, -1, -1, 4857, 4858, -1, 4861, -1, 4863, 4866, -1, -1, -1, 4868, -1, 4869, -1, 4870, -1, /* 0x7000 */ -1, -1, 4871, -1, -1, 4874, 4875, -1, -1, 4877, -1, 4878, -1, -1, -1, 4880, -1, -1, -1, 4881, -1, 4884, -1, -1, 4885, -1, -1, -1, -1, 4886, -1, 4887, 4888, -1, -1, -1, -1, -1, 4889, 4890, 4892, -1, -1, -1, 4894, -1, -1, 4896, 4897, -1, 4898, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4900, -1, -1, -1, -1, 4901, 4902, -1, -1, -1, -1, -1, -1, 4903, 4905, -1, 4906, 4908, -1, 4909, -1, -1, 4910, 4912, -1, -1, 4913, -1, -1, -1, -1, 4914, -1, -1, -1, -1, -1, 4915, 4916, -1, -1, 4917, -1, -1, -1, -1, -1, 4918, 4919, 4921, -1, -1, -1, -1, -1, 4922, 4925, -1, -1, -1, -1, 4927, -1, 4929, 4931, 4933, 4934, 4935, -1, -1, -1, -1, -1, -1, -1, 4938, -1, -1, -1, 4941, 4943, 4944, -1, -1, -1, -1, -1, -1, -1, 4945, -1, -1, -1, -1, 4947, 4948, -1, -1, -1, -1, -1, -1, 4949, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4954, 4957, 4958, -1, -1, -1, -1, -1, -1, -1, -1, 4959, 4960, -1, 4962, 4965, -1, -1, -1, 4966, 4967, 4970, -1, -1, -1, -1, -1, -1, 4971, -1, -1, -1, -1, 4972, -1, -1, -1, -1, -1, -1, 4973, -1, -1, -1, -1, 4975, -1, -1, -1, 4976, -1, -1, -1, -1, -1, -1, 4977, 4978, 4980, 4982, -1, 4983, 4984, 4985, -1, -1, -1, 4986, -1, -1, 4987, -1, -1, -1, -1, -1, -1, -1, -1, 4988, 4989, -1, /* 0x7100 */ -1, -1, -1, -1, -1, -1, -1, 4991, 4992, -1, 4996, -1, -1, -1, -1, 4997, -1, -1, -1, -1, 4998, 5000, 5001, -1, 5002, -1, 5003, -1, -1, -1, -1, -1, -1, 5005, -1, -1, -1, -1, 5006, -1, -1, -1, -1, -1, -1, 5007, -1, -1, 5008, -1, -1, 5010, -1, -1, -1, -1, -1, -1, -1, -1, 5011, -1, -1, -1, -1, -1, -1, -1, -1, 5013, -1, -1, -1, 5014, -1, -1, -1, -1, -1, -1, -1, 5017, 5018, -1, -1, 5019, 5023, 5024, -1, 5025, -1, -1, -1, -1, -1, -1, -1, -1, 5026, -1, -1, 5028, -1, 5029, -1, 5033, -1, -1, 5034, -1, 5036, -1, -1, -1, -1, -1, 5037, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5039, -1, -1, -1, -1, -1, -1, 5041, -1, -1, 5043, -1, -1, -1, -1, -1, -1, 5047, -1, -1, 5048, -1, 5049, -1, -1, 5051, -1, 5052, -1, -1, -1, -1, -1, -1, -1, -1, 5056, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5057, 5058, 5059, -1, -1, -1, -1, -1, 5060, 5061, -1, -1, -1, 5062, -1, -1, 5063, -1, -1, 5065, -1, -1, -1, 5067, -1, -1, -1, 5068, -1, 5070, -1, 5071, -1, 5073, 5075, -1, 5077, -1, 5078, -1, 5081, -1, -1, 5082, -1, -1, 5083, -1, -1, -1, -1, -1, -1, 5085, -1, -1, -1, -1, -1, 5086, 5087, -1, -1, -1, -1, -1, 5088, 5092, -1, -1, -1, -1, -1, -1, 5093, 5094, -1, 5095, 5096, /* 0x7200 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5097, -1, -1, 5098, -1, -1, -1, -1, -1, -1, 5099, -1, -1, -1, 5101, -1, -1, -1, -1, -1, -1, -1, -1, 5104, -1, -1, -1, -1, -1, -1, -1, -1, 5107, -1, -1, -1, 5108, 5109, -1, 5111, -1, -1, 5112, -1, -1, 5113, -1, 5114, -1, 5115, 5118, 5119, -1, -1, 5120, -1, 5121, 5122, -1, -1, -1, -1, 5123, -1, 5124, 5125, -1, -1, -1, -1, 5129, -1, 5130, -1, -1, 5134, -1, -1, 5135, 5136, -1, -1, -1, 5137, -1, -1, -1, -1, -1, 5138, -1, -1, -1, -1, 5140, -1, -1, -1, -1, -1, -1, -1, -1, 5142, 5143, -1, -1, -1, -1, 5144, -1, -1, 5146, -1, -1, -1, 5147, 5148, -1, -1, -1, -1, 5149, -1, -1, 5150, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5151, -1, -1, -1, -1, 5152, -1, -1, -1, -1, 5154, -1, 5156, -1, -1, -1, -1, 5157, -1, -1, -1, -1, 5159, 5160, 5161, -1, -1, -1, 5162, -1, 5163, -1, 5165, 5166, 5167, 5168, -1, -1, -1, -1, -1, -1, 5169, -1, 5170, -1, -1, -1, -1, -1, 5172, 5173, -1, -1, 5174, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5175, 5176, -1, -1, -1, 5177, -1, -1, 5178, -1, -1, -1, -1, -1, -1, 5179, 5180, 5181, 5182, 5183, 5184, 5185, -1, -1, -1, -1, -1, 5186, 5188, -1, -1, -1, 5189, 5190, -1, /* 0x7300 */ -1, -1, 5191, 5192, -1, -1, -1, 5193, -1, -1, 5194, -1, -1, 5195, 5197, -1, -1, -1, -1, -1, -1, 5199, -1, -1, 5200, 5201, -1, -1, -1, -1, -1, 5202, -1, 5204, -1, -1, -1, -1, -1, -1, 5205, 5206, 5207, 5208, 5209, -1, 5210, 5211, -1, -1, 5212, -1, -1, 5213, 5214, -1, -1, -1, -1, 5215, -1, -1, -1, 5216, -1, 5218, -1, -1, 5219, 5220, -1, -1, -1, -1, -1, -1, -1, 5221, 5222, 5225, 5226, -1, -1, -1, -1, -1, -1, -1, 5227, 5228, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5229, -1, -1, 5231, -1, 5232, -1, 5233, 5234, -1, 5236, 5237, -1, 5238, 5239, 5240, -1, -1, 5241, -1, 5243, 5244, -1, 5246, 5247, 5248, -1, 5249, -1, 5250, 5251, -1, 5252, -1, 5254, -1, 5255, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5256, -1, -1, -1, -1, -1, -1, -1, 5257, 5258, 5259, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5260, 5262, -1, -1, -1, -1, 5263, 5264, 5265, 5266, -1, 5267, -1, -1, -1, -1, -1, -1, 5268, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5269, -1, 5272, 5273, 5274, 5276, 5277, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5278, -1, -1, 5280, -1, -1, -1, -1, -1, 5284, -1, -1, -1, -1, -1, 5285, 5286, 5288, -1, -1, -1, -1, 5289, -1, -1, -1, -1, -1, -1, 5290, -1, /* 0x7400 */ -1, -1, -1, 5291, -1, 5292, -1, -1, -1, 5293, -1, -1, -1, 5296, 5298, 5299, 5300, 5302, -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, 5304, -1, -1, 5305, -1, -1, -1, -1, 5307, 5309, -1, 5310, -1, -1, 5311, -1, -1, -1, -1, -1, -1, -1, 5312, -1, -1, -1, 5313, -1, -1, -1, -1, -1, -1, 5314, -1, -1, -1, -1, -1, -1, 5315, -1, -1, -1, -1, -1, -1, 5316, -1, -1, 5319, 5321, -1, -1, -1, 5322, 5323, 5324, -1, -1, -1, -1, 5325, 5326, -1, 5327, -1, 5328, -1, 5330, 5331, 5332, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5333, -1, -1, -1, 5335, -1, 5336, -1, -1, -1, -1, 5337, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5339, 5341, 5344, -1, -1, 5345, -1, -1, -1, -1, 5346, -1, -1, -1, -1, 5347, -1, -1, -1, -1, 5348, -1, -1, 5349, -1, -1, -1, -1, 5350, -1, 5352, -1, -1, -1, -1, -1, -1, -1, -1, 5353, 5355, 5356, -1, 5357, -1, -1, 5358, -1, -1, 5359, -1, 5360, -1, -1, -1, -1, -1, 5362, -1, -1, -1, -1, -1, -1, -1, -1, 5364, -1, -1, -1, -1, 5365, -1, -1, -1, -1, -1, 5366, 5367, -1, -1, -1, -1, -1, -1, 5368, 5370, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x7500 */ -1, 5371, -1, -1, -1, -1, 5373, -1, -1, -1, -1, -1, 5374, -1, 5375, -1, -1, -1, -1, -1, -1, 5378, 5379, -1, -1, -1, -1, -1, -1, -1, 5381, -1, 5384, -1, 5385, 5387, -1, -1, 5389, -1, -1, -1, -1, -1, -1, -1, -1, 5392, -1, -1, -1, -1, -1, 5398, -1, 5399, -1, -1, 5400, 5402, 5407, 5409, -1, -1, -1, -1, 5410, -1, 5411, 5413, 5414, -1, -1, -1, 5418, -1, 5419, 5421, 5423, -1, -1, 5424, 5425, -1, -1, -1, -1, -1, -1, 5429, 5431, -1, -1, 5432, 5437, -1, 5441, 5442, 5443, -1, -1, 5444, -1, 5445, 5446, -1, 5447, 5448, -1, -1, -1, -1, 5450, 5451, -1, 5453, 5457, 5458, 5460, -1, -1, -1, 5461, 5462, -1, -1, -1, -1, -1, -1, 5463, -1, -1, 5467, 5469, 5470, -1, 5471, 5475, -1, -1, -1, 5479, 5481, -1, -1, -1, -1, -1, -1, 5483, 5484, -1, -1, -1, -1, -1, -1, -1, 5485, 5486, 5487, -1, 5488, -1, -1, -1, -1, -1, -1, -1, -1, 5489, 5490, 5491, 5492, -1, 5493, -1, -1, 5495, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5496, 5497, 5498, -1, -1, -1, -1, -1, -1, -1, -1, 5499, -1, -1, -1, 5500, -1, -1, 5504, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5505, 5506, 5507, 5508, -1, -1, 5509, -1, -1, -1, 5510, 5512, 5515, -1, -1, -1, -1, 5516, 5517, -1, -1, -1, 5518, -1, /* 0x7600 */ -1, -1, 5519, -1, -1, 5523, 5524, -1, -1, 5525, -1, 5527, -1, 5528, -1, -1, -1, -1, -1, 5529, -1, -1, 5530, 5531, 5532, -1, -1, -1, -1, -1, 5533, -1, -1, 5534, -1, -1, 5535, -1, 5536, 5537, -1, -1, 5538, 5539, -1, -1, 5540, -1, -1, -1, 5541, -1, -1, -1, -1, -1, -1, -1, 5542, 5543, -1, -1, 5545, 5546, -1, -1, 5547, -1, 5548, 5550, 5551, 5552, -1, 5553, -1, -1, -1, -1, -1, -1, -1, -1, 5554, -1, -1, 5556, -1, -1, 5558, -1, -1, -1, -1, -1, 5559, 5560, -1, 5561, 5562, 5563, 5564, 5565, -1, 5566, -1, 5567, -1, 5568, 5569, 5570, 5571, 5572, 5573, 5576, 5577, -1, 5578, 5579, -1, -1, -1, -1, 5580, 5590, 5591, -1, -1, -1, -1, 5593, 5595, 5597, -1, -1, -1, -1, 5598, -1, -1, 5601, -1, 5602, 5604, -1, 5605, 5606, -1, -1, -1, -1, -1, -1, -1, -1, 5607, -1, -1, -1, 5609, -1, -1, 5610, -1, -1, -1, 5611, -1, -1, 5613, -1, -1, -1, -1, -1, -1, -1, 5614, 5616, 5617, -1, -1, -1, -1, 5619, 5620, 5622, 5624, -1, 5625, -1, -1, -1, -1, 5626, -1, 5627, -1, -1, -1, 5629, 5630, -1, -1, 5631, 5634, 5635, -1, 5636, 5637, 5639, -1, -1, -1, -1, 5641, 5643, 5644, 5645, -1, -1, 5646, -1, 5647, -1, -1, 5648, -1, 5649, 5651, -1, -1, 5652, -1, -1, 5653, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x7700 */ -1, -1, -1, -1, -1, -1, 5655, -1, -1, 5657, -1, -1, 5658, 5660, 5661, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5663, -1, -1, -1, -1, -1, 5664, 5665, -1, -1, -1, -1, -1, 5666, 5667, -1, -1, -1, -1, 5668, 5669, -1, -1, 5670, -1, -1, -1, -1, -1, -1, -1, 5672, -1, -1, -1, -1, -1, -1, 5673, -1, 5676, 5677, 5678, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5679, 5680, 5681, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5682, -1, 5683, -1, 5684, -1, -1, -1, 5685, 5686, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5687, -1, -1, -1, -1, -1, 5688, -1, -1, -1, -1, -1, 5690, 5691, 5692, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5693, -1, -1, -1, 5694, -1, 5695, -1, -1, -1, -1, -1, 5696, -1, 5697, -1, 5698, -1, -1, -1, -1, -1, -1, 5699, 5700, -1, -1, 5701, -1, -1, 5703, -1, -1, -1, -1, -1, 5704, -1, -1, -1, -1, -1, 5705, -1, 5706, -1, -1, 5710, -1, -1, -1, -1, -1, 5711, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5712, 5713, -1, -1, -1, -1, -1, 5714, 5715, -1, -1, -1, -1, -1, -1, -1, 5716, -1, 5717, -1, 5719, 5720, -1, -1, -1, 5722, -1, -1, -1, 5723, -1, -1, -1, -1, 5724, -1, 5727, -1, -1, -1, -1, -1, -1, -1, 5728, 5729, /* 0x7800 */ 5734, 5735, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5736, -1, -1, 5737, 5738, 5741, -1, -1, 5742, -1, 5743, -1, -1, -1, -1, -1, -1, -1, -1, 5744, -1, 5745, -1, -1, -1, -1, 5746, -1, -1, -1, -1, -1, 5747, -1, -1, -1, -1, -1, -1, -1, 5750, 5751, -1, -1, 5752, 5753, 5758, 5759, -1, 5760, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5761, 5762, 5763, -1, 5764, 5765, -1, 5766, -1, -1, -1, -1, -1, -1, -1, 5767, -1, -1, -1, 5768, -1, 5769, -1, -1, -1, 5770, 5773, -1, -1, -1, -1, -1, 5774, -1, 5775, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5778, -1, -1, -1, -1, -1, 5782, -1, -1, -1, -1, -1, 5784, 5785, -1, -1, -1, -1, -1, 5786, 5787, -1, 5790, -1, -1, -1, 5793, 5794, -1, 5795, 5798, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5799, 5800, -1, -1, 5801, -1, 5802, 5803, 5805, -1, -1, -1, -1, -1, -1, 5807, -1, 5808, 5810, 5812, -1, -1, -1, -1, 5813, -1, -1, -1, -1, -1, 5814, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5815, 5816, -1, 5817, -1, 5818, -1, -1, -1, 5819, -1, -1, -1, -1, -1, 5822, -1, -1, 5823, -1, -1, -1, 5824, -1, -1, -1, -1, -1, -1, -1, 5825, -1, -1, -1, -1, -1, -1, -1, 5826, 5827, -1, 5828, -1, -1, 5829, -1, -1, /* 0x7900 */ 5830, -1, -1, -1, 5831, -1, 5832, -1, 5835, -1, -1, -1, -1, -1, 5837, -1, -1, -1, 5838, -1, -1, -1, -1, -1, -1, 5839, -1, -1, -1, -1, -1, 5840, 5843, -1, -1, -1, -1, -1, 5844, -1, -1, -1, 5849, 5850, 5851, -1, 5852, -1, -1, 5855, -1, -1, -1, -1, -1, -1, -1, -1, 5856, 5857, 5858, -1, -1, 5859, 5860, -1, -1, 5861, -1, 5862, -1, -1, -1, -1, -1, -1, -1, -1, 5863, -1, -1, -1, -1, -1, -1, 5864, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5865, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5866, -1, -1, -1, -1, -1, 5867, -1, 5868, 5869, -1, -1, -1, -1, -1, -1, 5870, 5871, -1, -1, -1, 5872, 5873, -1, -1, -1, -1, -1, -1, -1, 5874, 5875, -1, -1, -1, -1, -1, -1, 5876, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5877, -1, -1, -1, -1, 5878, -1, -1, 5879, 5880, -1, -1, -1, 5881, -1, 5882, 5883, -1, -1, 5884, -1, -1, -1, -1, -1, -1, 5885, -1, -1, -1, 5886, -1, 5887, -1, 5888, -1, -1, 5889, 5890, 5895, -1, 5896, 5897, 5902, 5905, -1, -1, 5906, -1, -1, -1, 5907, 5909, 5910, 5911, 5912, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5913, 5914, -1, -1, -1, -1, -1, -1, -1, 5916, -1, -1, -1, -1, 5917, 5918, -1, /* 0x7a00 */ -1, 5919, -1, -1, -1, 5923, 5924, -1, 5926, 5927, -1, -1, -1, -1, 5929, -1, -1, -1, -1, -1, -1, -1, -1, 5930, -1, -1, 5932, -1, 5934, -1, -1, 5935, -1, -1, -1, 5936, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5937, 5938, -1, -1, 5939, 5941, 5942, -1, -1, -1, -1, -1, -1, 5944, 5946, -1, -1, 5947, 5951, 5955, -1, 5957, -1, -1, 5958, -1, -1, -1, 5960, -1, -1, 5962, 5966, 5967, 5969, 5971, 5974, -1, -1, -1, -1, -1, 5975, -1, -1, -1, -1, -1, -1, 5976, -1, 5978, 5979, 5980, 5981, -1, -1, -1, -1, 5982, 5986, 5988, 5990, -1, 5991, -1, -1, 5993, -1, -1, -1, -1, -1, -1, 5994, -1, 5996, -1, -1, -1, 5997, -1, -1, -1, 5998, -1, 5999, -1, -1, -1, -1, -1, -1, 6000, -1, -1, 6001, 6002, -1, -1, 6003, -1, 6005, -1, -1, -1, 6009, -1, -1, -1, -1, 6013, 6014, -1, -1, -1, -1, -1, -1, -1, 6015, 6016, -1, -1, 6017, 6018, -1, 6019, 6020, 6022, 6024, 6026, -1, -1, 6028, -1, 6029, 6030, -1, -1, -1, 6032, 6033, -1, -1, -1, -1, -1, -1, -1, 6037, 6039, 6040, 6041, 6043, 6044, -1, 6046, -1, -1, -1, -1, -1, -1, -1, 6047, -1, -1, -1, 6048, -1, -1, -1, 6050, -1, 6051, 6053, 6056, -1, -1, -1, 6058, -1, -1, -1, -1, -1, -1, 6059, 6061, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6063, -1, 6065, -1, -1, -1, -1, -1, 6067, -1, /* 0x7b00 */ -1, -1, -1, 6068, -1, -1, -1, -1, -1, -1, -1, 6069, -1, -1, -1, -1, -1, 6071, -1, -1, 6073, 6074, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6075, -1, -1, -1, -1, -1, -1, -1, 6076, 6082, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6083, 6085, -1, -1, -1, 6086, -1, 6088, -1, 6090, -1, -1, -1, -1, -1, -1, 6091, 6092, -1, -1, -1, -1, 6093, -1, 6094, -1, 6096, 6098, 6099, -1, -1, -1, -1, 6100, -1, 6104, 6105, 6106, 6107, 6108, 6109, 6110, -1, -1, -1, -1, -1, -1, -1, -1, 6114, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6115, -1, -1, -1, -1, -1, -1, -1, 6116, 6117, -1, 6118, -1, 6119, 6122, 6123, -1, 6124, -1, -1, -1, 6125, 6126, -1, -1, -1, 6129, -1, 6130, -1, 6131, -1, -1, 6132, 6133, -1, -1, -1, -1, -1, -1, 6134, -1, -1, -1, -1, -1, -1, -1, -1, 6135, -1, -1, 6139, 6141, 6142, 6143, 6144, 6145, 6146, -1, -1, -1, 6147, -1, 6149, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6150, -1, -1, -1, 6151, -1, 6153, -1, -1, 6154, -1, 6155, -1, -1, -1, 6157, -1, 6158, -1, 6159, 6160, -1, -1, 6161, -1, -1, -1, 6162, -1, -1, -1, -1, 6163, 6165, -1, -1, 6166, -1, 6167, -1, -1, 6168, 6171, -1, -1, 6172, 6174, 6175, -1, 6176, 6177, 6178, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x7c00 */ 6179, 6181, -1, -1, 6183, -1, 6185, -1, -1, -1, -1, -1, -1, 6186, -1, -1, -1, 6187, 6189, -1, 6190, -1, 6192, 6193, 6195, -1, -1, -1, -1, -1, 6196, -1, 6197, 6198, -1, 6199, -1, -1, -1, -1, -1, -1, 6200, 6201, -1, -1, -1, -1, -1, 6203, -1, -1, -1, -1, -1, 6205, -1, 6206, -1, -1, -1, 6207, 6208, -1, 6209, 6211, -1, 6212, -1, -1, 6213, -1, -1, -1, -1, -1, 6214, -1, -1, 6215, 6217, -1, 6218, -1, 6219, 6221, 6222, -1, 6224, 6226, -1, 6227, 6228, -1, -1, 6229, 6230, -1, -1, -1, 6232, -1, -1, -1, -1, 6234, 6235, -1, 6236, 6237, 6239, -1, -1, -1, 6240, -1, 6242, -1, -1, -1, -1, -1, -1, 6243, 6244, -1, -1, -1, -1, -1, -1, 6245, -1, -1, -1, 6246, -1, -1, -1, 6248, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6249, 6250, -1, -1, 6251, 6253, 6254, -1, -1, -1, -1, -1, -1, 6255, 6256, 6258, 6259, -1, -1, 6263, -1, 6264, -1, 6268, -1, -1, -1, -1, 6269, -1, 6271, -1, -1, -1, 6272, 6273, -1, -1, 6274, -1, -1, -1, 6275, -1, -1, -1, -1, 6276, 6281, -1, 6282, 6283, -1, -1, -1, -1, -1, -1, -1, -1, 6284, -1, 6286, -1, -1, -1, -1, 6287, -1, -1, 6291, 6292, -1, 6293, -1, -1, -1, -1, -1, 6295, 6296, -1, -1, -1, -1, -1, -1, -1, -1, 6297, -1, 6299, -1, 6300, -1, 6301, -1, 6302, 6306, 6308, 6309, 6313, -1, 6315, 6317, /* 0x7d00 */ 6319, -1, 6320, -1, 6321, 6322, 6323, 6324, 6325, 6326, -1, 6327, -1, 6328, -1, -1, 6329, -1, -1, 6330, 6331, 6332, 6333, 6334, 6335, 6337, 6339, 6340, 6341, 6342, -1, -1, -1, 6344, -1, 6345, -1, 6346, -1, 6347, -1, -1, -1, -1, 6348, -1, 6350, 6352, 6356, 6357, 6358, 6359, -1, 6360, -1, -1, -1, 6361, 6362, -1, 6363, -1, -1, 6364, 6365, -1, 6366, 6367, 6368, 6369, 6370, -1, 6372, -1, -1, 6373, 6374, 6376, 6377, 6378, 6379, -1, -1, -1, -1, 6380, 6383, -1, -1, -1, 6384, 6385, -1, 6387, 6389, -1, -1, 6390, 6391, -1, 6392, 6396, 6397, -1, 6398, -1, -1, -1, -1, -1, -1, -1, 6399, 6400, 6402, 6404, -1, 6405, 6407, 6410, 6411, 6413, -1, -1, -1, -1, -1, -1, -1, 6414, 6415, 6417, -1, -1, 6418, -1, 6419, 6420, -1, 6421, 6422, -1, -1, 6423, -1, 6424, -1, 6426, -1, -1, -1, 6428, -1, 6429, 6431, -1, 6434, -1, 6435, -1, 6436, -1, 6438, 6440, -1, -1, -1, -1, -1, -1, -1, 6441, 6445, 6446, -1, 6447, 6448, 6449, 6450, 6451, 6453, 6455, -1, 6456, 6457, 6458, 6459, 6460, -1, 6461, 6463, 6464, -1, -1, -1, -1, 6465, -1, -1, 6466, -1, -1, 6467, 6468, -1, 6469, -1, 6470, 6474, 6475, 6477, -1, 6479, 6480, 6481, 6483, 6484, 6485, 6486, -1, 6490, 6491, 6492, -1, 6493, 6494, -1, 6496, -1, 6498, 6499, -1, 6500, 6501, 6502, 6503, 6507, -1, -1, 6508, -1, 6509, 6510, -1, 6511, -1, 6512, -1, -1, 6513, -1, 6514, 6515, -1, -1, -1, /* 0x7e00 */ -1, 6517, -1, -1, 6519, -1, -1, -1, 6521, 6522, 6523, 6524, -1, -1, -1, -1, 6525, 6526, -1, -1, -1, 6527, -1, 6529, 6530, -1, -1, 6533, -1, 6534, 6535, 6536, -1, -1, -1, 6537, -1, -1, 6539, 6541, 6543, -1, -1, 6544, -1, 6545, 6546, -1, -1, 6547, 6549, -1, 6552, 6553, 6554, 6556, -1, 6557, -1, -1, -1, 6558, 6563, -1, -1, 6564, -1, 6565, -1, 6567, 6569, -1, 6570, -1, 6571, 6574, -1, 6577, -1, -1, -1, -1, 6579, -1, 6580, 6581, 6582, -1, -1, 6584, 6585, 6586, -1, -1, 6587, -1, -1, 6588, 6590, -1, 6591, -1, 6592, -1, -1, 6593, 6595, 6597, -1, 6600, 6603, 6605, 6606, -1, -1, 6609, -1, -1, -1, -1, -1, 6610, -1, -1, 6611, 6613, 6614, 6615, -1, -1, 6616, 6617, -1, -1, -1, 6618, 6619, 6620, 6622, -1, 6624, 6627, 6628, 6631, -1, -1, 6633, 6635, 6636, -1, 6637, -1, 6640, -1, -1, -1, 6642, 6643, -1, 6646, 6648, 6649, 6650, 6651, 6652, 6656, 6657, 6658, 6659, 6660, 6662, 6663, 6664, 6665, 6666, 6667, 6668, 6669, 6670, 6671, 6672, 6673, 6675, 6676, 6677, 6678, 6679, 6680, 6681, 6682, 6683, 6684, 6688, 6689, 6691, 6692, 6693, 6694, 6695, 6696, 6697, 6698, 6699, 6700, 6701, 6702, 6703, 6704, 6706, 6707, 6708, 6709, 6710, 6711, 6713, 6714, 6715, 6717, 6718, 6719, 6720, 6721, 6724, 6725, 6727, 6728, 6729, 6730, 6733, 6734, 6735, 6737, 6739, 6740, 6741, 6743, -1, 6744, 6746, 6747, 6748, 6749, 6750, 6751, 6753, 6754, 6756, 6757, 6759, 6761, 6762, 6763, 6764, 6765, 6766, 6767, /* 0x7f00 */ 6769, 6770, 6771, 6772, 6773, 6774, 6775, 6776, 6777, 6778, 6779, 6781, 6782, 6783, 6784, 6785, 6786, 6790, 6791, 6792, 6793, 6794, 6795, 6796, 6797, 6799, 6800, 6801, 6802, 6803, 6804, 6805, 6806, 6808, 6809, 6810, 6811, 6812, 6813, 6814, 6817, 6818, 6819, 6820, 6822, 6823, 6824, 6825, 6826, 6828, 6829, 6830, 6831, 6832, 6834, 6837, 6838, 6839, 6840, 6842, 6843, 6845, 6848, -1, -1, -1, 6850, -1, -1, -1, -1, 6852, 6853, -1, -1, -1, 6858, -1, 6860, -1, 6865, 6867, 6870, 6872, -1, -1, -1, 6874, -1, -1, 6877, -1, -1, -1, -1, -1, -1, -1, 6879, -1, -1, -1, -1, -1, -1, -1, 6880, -1, -1, -1, -1, -1, 6882, -1, -1, -1, 6884, 6885, 6888, 6889, 6890, -1, -1, -1, -1, -1, -1, -1, 6892, 6893, -1, 6895, -1, 6897, 6898, 6899, 6902, -1, 6906, 6907, 6908, -1, -1, -1, 6909, 6910, -1, -1, -1, -1, -1, 6911, -1, -1, -1, -1, -1, -1, -1, 6912, -1, 6913, -1, 6914, 6915, 6916, -1, -1, 6917, 6918, 6919, -1, -1, -1, 6921, -1, -1, -1, -1, -1, 6922, -1, 6924, -1, -1, 6926, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6927, 6929, 6931, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6932, -1, -1, -1, -1, -1, 6933, 6934, 6935, -1, -1, -1, -1, -1, 6936, -1, -1, -1, 6937, -1, -1, -1, -1, -1, -1, 6939, 6940, -1, -1, -1, -1, 6941, -1, 6942, -1, -1, -1, -1, -1, 6943, 6944, 6945, -1, 6947, -1, -1, /* 0x8000 */ 6948, -1, -1, 6949, -1, -1, -1, 6950, 6951, -1, 6952, 6953, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6954, -1, -1, 6955, -1, -1, -1, 6956, -1, -1, -1, -1, 6957, 6958, -1, 6959, -1, -1, 6960, 6961, -1, -1, -1, 6963, -1, 6964, -1, 6965, -1, -1, -1, -1, -1, -1, -1, 6966, -1, -1, 6967, 6968, 6969, -1, -1, 6970, -1, 6973, 6974, -1, -1, -1, -1, -1, -1, -1, 6975, 6976, 6979, -1, -1, -1, -1, -1, -1, 6980, -1, 6982, -1, -1, -1, -1, -1, -1, -1, 6984, 6985, -1, 6987, -1, -1, -1, -1, 6990, -1, 6993, 6995, 6996, 6999, -1, 7000, 7002, 7003, 7007, -1, 7010, 7011, 7012, 7014, 7015, 7016, -1, 7019, -1, -1, -1, 7020, 7022, -1, -1, -1, -1, 7023, -1, 7025, -1, 7027, 7028, 7029, -1, -1, -1, -1, 7030, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7031, 7033, -1, -1, 7034, -1, -1, 7035, -1, -1, -1, -1, 7036, -1, 7037, 7038, -1, 7040, 7041, -1, 7043, -1, -1, -1, -1, -1, -1, 7044, -1, -1, 7045, 7046, 7047, 7048, -1, -1, 7051, -1, 7053, -1, -1, -1, -1, -1, 7055, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7056, -1, 7057, -1, -1, -1, -1, 7058, -1, -1, -1, -1, -1, 7060, 7061, -1, 7062, 7063, -1, 7065, -1, -1, -1, -1, -1, -1, -1, -1, 7066, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x8100 */ -1, -1, -1, 7067, -1, 7069, 7071, 7073, 7074, 7075, -1, 7076, -1, 7078, -1, 7079, 7082, 7083, -1, 7085, 7086, -1, -1, 7087, -1, -1, 7088, 7090, -1, -1, -1, -1, -1, -1, -1, 7092, -1, -1, -1, -1, -1, 7093, -1, 7094, -1, -1, -1, -1, -1, 7095, -1, 7096, -1, 7099, 7100, -1, 7101, 7102, 7104, -1, -1, -1, 7106, -1, -1, -1, -1, -1, -1, -1, 7107, -1, -1, -1, 7108, -1, 7110, -1, 7111, -1, -1, -1, -1, -1, -1, -1, 7112, 7113, 7114, -1, -1, -1, -1, -1, -1, 7115, -1, 7116, -1, -1, -1, -1, 7117, -1, -1, -1, -1, 7120, -1, 7121, 7122, -1, -1, -1, -1, 7123, -1, -1, -1, -1, 7125, -1, -1, 7127, -1, 7128, 7129, -1, 7130, -1, 7131, 7132, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7133, 7134, -1, 7135, -1, 7137, -1, -1, -1, -1, 7138, -1, -1, -1, -1, -1, 7139, -1, -1, 7140, 7141, -1, -1, -1, -1, 7142, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7143, -1, -1, -1, -1, 7144, -1, -1, 7146, -1, 7150, 7152, 7153, 7154, -1, -1, 7155, -1, -1, -1, -1, 7157, 7159, -1, 7160, -1, 7161, -1, 7162, -1, -1, -1, 7164, -1, -1, -1, -1, 7166, 7168, 7169, -1, 7170, -1, 7171, 7172, 7174, -1, 7175, -1, -1, 7176, -1, -1, 7177, -1, -1, -1, -1, 7178, -1, -1, 7179, -1, -1, -1, 7180, -1, -1, -1, -1, -1, 7181, -1, -1, -1, -1, -1, /* 0x8200 */ -1, -1, -1, -1, -1, -1, 7183, 7184, 7185, 7186, 7189, -1, -1, 7190, 7192, -1, 7193, -1, -1, 7194, -1, -1, 7195, 7198, 7201, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7202, -1, -1, -1, -1, -1, 7203, -1, -1, -1, -1, 7204, -1, 7206, 7207, -1, -1, -1, 7208, 7209, -1, -1, 7210, -1, 7211, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7213, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7214, -1, -1, -1, -1, -1, -1, -1, -1, 7215, 7216, 7218, -1, 7219, -1, -1, -1, 7220, 7222, -1, -1, -1, -1, 7224, 7225, -1, 7227, -1, -1, 7231, 7235, 7239, 7240, 7241, -1, -1, -1, -1, -1, -1, -1, 7246, -1, -1, -1, -1, -1, 7247, -1, -1, 7249, 7250, -1, -1, -1, -1, -1, -1, -1, 7251, -1, -1, 7252, -1, -1, -1, -1, 7253, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7254, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7255, 7256, -1, -1, -1, -1, -1, 7257, -1, -1, 7264, -1, -1, -1, -1, -1, 7265, -1, -1, -1, 7266, -1, 7268, 7269, -1, -1, 7270, 7271, 7272, 7273, 7274, 7279, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7280, 7281, -1, -1, -1, -1, 7282, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7283, -1, -1, -1, -1, -1, -1, -1, 7284, 7286, -1, -1, 7287, -1, -1, /* 0x8300 */ -1, -1, -1, 7288, -1, -1, -1, -1, -1, -1, 7290, -1, -1, -1, 7292, 7293, -1, 7294, -1, -1, 7295, 7296, -1, -1, 7297, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7298, -1, -1, -1, -1, -1, -1, -1, 7300, 7301, -1, 7302, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7304, 7305, -1, -1, 7306, -1, -1, -1, -1, -1, 7307, 7309, -1, -1, 7310, -1, -1, -1, 7311, 7313, 7314, 7315, 7316, 7317, 7318, 7319, 7320, 7322, -1, 7325, 7327, 7328, 7329, 7330, 7331, 7332, 7333, 7334, 7335, 7336, 7337, 7338, -1, -1, -1, 7341, -1, -1, -1, -1, -1, 7342, -1, 7343, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7344, -1, -1, -1, -1, 7346, -1, -1, -1, -1, -1, -1, -1, -1, 7348, -1, 7349, 7350, -1, -1, -1, -1, -1, -1, -1, 7351, -1, -1, -1, 7352, -1, -1, -1, -1, 7353, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7354, 7355, 7356, 7357, 7358, 7359, 7360, 7362, 7363, 7364, -1, 7367, 7369, 7370, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7371, -1, 7372, 7373, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7375, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7376, -1, -1, -1, 7377, 7380, 7381, -1, -1, 7382, -1, -1, -1, -1, 7385, -1, -1, -1, -1, -1, -1, /* 0x8400 */ -1, -1, -1, -1, -1, -1, -1, 7386, -1, -1, 7387, -1, 7388, 7389, -1, -1, -1, -1, -1, -1, -1, 7390, -1, -1, -1, -1, 7392, -1, -1, 7393, -1, 7394, 7399, -1, -1, -1, 7400, 7402, 7404, 7405, 7406, -1, -1, -1, 7407, -1, -1, -1, -1, 7408, -1, -1, 7411, 7412, -1, -1, 7413, -1, -1, -1, 7414, -1, -1, -1, -1, -1, -1, -1, -1, 7415, -1, -1, -1, 7416, 7417, -1, -1, -1, -1, -1, -1, -1, 7420, -1, -1, -1, -1, 7421, 7422, -1, 7423, -1, -1, -1, -1, -1, 7424, -1, 7425, -1, 7427, -1, 7428, -1, -1, -1, 7429, -1, 7430, -1, 7431, 7432, -1, 7433, -1, -1, -1, -1, -1, 7434, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7435, 7436, -1, -1, -1, 7437, -1, 7438, -1, 7439, 7440, -1, -1, -1, 7441, -1, -1, 7442, 7444, -1, -1, -1, -1, 7445, -1, -1, -1, -1, 7449, -1, -1, -1, -1, -1, -1, -1, 7451, -1, 7452, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7453, -1, -1, -1, -1, 7454, -1, -1, -1, 7455, -1, -1, -1, -1, -1, 7456, -1, -1, -1, -1, 7457, -1, -1, -1, -1, -1, 7459, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7461, -1, 7462, 7463, -1, -1, 7464, -1, 7465, 7466, -1, -1, -1, -1, -1, -1, 7467, 7470, 7471, -1, 7472, -1, -1, 7473, -1, -1, -1, -1, -1, 7475, -1, -1, 7480, -1, -1, /* 0x8500 */ -1, -1, -1, -1, -1, 7481, 7483, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7484, 7485, -1, -1, 7486, 7488, -1, -1, -1, -1, -1, -1, -1, -1, 7489, -1, -1, -1, -1, 7490, -1, 7491, 7492, -1, -1, -1, -1, -1, -1, 7493, -1, 7494, -1, -1, 7495, 7496, 7497, 7498, 7500, 7502, -1, 7503, 7504, 7505, 7506, -1, -1, -1, -1, 7508, -1, -1, -1, -1, 7509, -1, -1, -1, 7510, 7512, -1, -1, 7514, -1, 7515, -1, 7517, 7518, -1, 7519, -1, -1, 7520, -1, 7521, -1, -1, -1, -1, -1, -1, -1, 7522, -1, -1, -1, -1, -1, -1, 7523, 7524, -1, -1, 7525, -1, -1, 7526, -1, 7527, -1, 7528, -1, -1, 7530, -1, -1, -1, -1, -1, -1, -1, 7531, 7534, -1, -1, -1, -1, -1, -1, -1, 7535, -1, 7536, -1, 7538, -1, -1, -1, -1, 7539, -1, 7540, 7541, -1, -1, 7542, 7544, -1, -1, -1, -1, -1, -1, 7545, -1, -1, -1, -1, -1, -1, 7546, -1, -1, 7548, -1, 7549, 7551, 7553, 7554, 7556, 7557, -1, 7559, -1, -1, -1, -1, -1, -1, -1, 7561, -1, 7563, -1, -1, -1, -1, 7564, 7568, -1, -1, -1, -1, -1, -1, 7572, -1, -1, -1, 7575, 7576, 7577, -1, -1, -1, 7579, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7580, -1, 7585, -1, -1, -1, -1, 7587, 7588, -1, -1, -1, -1, 7590, -1, -1, -1, -1, -1, -1, -1, -1, 7592, 7596, -1, 7598, 7599, -1, 7600, 7602, -1, 7603, -1, -1, -1, /* 0x8600 */ 7606, -1, 7607, -1, 7609, -1, 7610, 7611, -1, -1, 7615, 7617, -1, 7619, 7621, -1, 7623, -1, -1, 7626, -1, -1, -1, 7628, -1, -1, 7629, -1, -1, -1, 7630, -1, -1, -1, 7631, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7632, -1, 7633, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7635, -1, -1, 7636, -1, 7638, -1, 7639, -1, -1, -1, -1, 7640, -1, -1, -1, -1, -1, -1, -1, 7642, 7644, -1, 7645, -1, 7646, -1, 7647, 7649, 7650, -1, -1, 7652, 7654, 7656, 7657, -1, 7659, -1, -1, -1, -1, -1, 7660, 7661, 7662, -1, -1, -1, 7663, 7665, -1, 7666, 7667, -1, 7668, -1, -1, -1, 7669, -1, -1, -1, -1, 7671, 7672, -1, 7673, 7674, 7675, 7676, 7677, 7678, 7679, -1, -1, -1, -1, -1, -1, 7680, 7682, 7683, -1, -1, -1, -1, -1, -1, -1, -1, 7684, 7687, -1, 7688, -1, -1, -1, -1, 7689, -1, -1, -1, -1, -1, -1, -1, -1, 7690, -1, -1, -1, -1, 7691, 7692, -1, -1, -1, -1, -1, -1, -1, 7693, -1, -1, -1, -1, -1, 7694, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7695, -1, -1, 7697, -1, -1, 7698, 7700, 7702, -1, -1, -1, -1, 7703, -1, -1, -1, -1, 7706, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7707, 7708, 7709, 7710, 7711, 7712, 7713, -1, -1, -1, -1, -1, 7714, 7715, -1, 7716, -1, -1, /* 0x8700 */ -1, -1, 7718, -1, -1, -1, 7719, -1, -1, -1, -1, 7720, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7721, 7722, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7726, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7727, -1, -1, -1, 7728, -1, -1, -1, -1, -1, -1, -1, 7729, -1, 7732, 7734, 7735, -1, 7736, -1, -1, 7738, -1, -1, -1, -1, -1, -1, 7739, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7740, -1, 7741, -1, -1, -1, -1, 7742, -1, 7743, -1, -1, -1, -1, -1, -1, 7744, -1, 7745, -1, -1, -1, -1, -1, -1, 7746, -1, -1, -1, 7747, -1, 7748, 7749, 7751, -1, 7752, -1, 7753, -1, -1, -1, 7754, -1, -1, -1, -1, 7755, 7756, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7757, 7758, -1, -1, -1, -1, 7760, -1, -1, 7761, 7762, -1, 7764, -1, -1, 7766, 7767, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7768, -1, -1, -1, 7769, -1, 7770, -1, -1, 7771, -1, 7772, 7773, 7774, -1, -1, -1, -1, -1, 7775, 7776, -1, -1, 7777, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7778, -1, -1, -1, -1, -1, -1, -1, -1, 7779, -1, -1, 7780, -1, -1, 7781, -1, -1, -1, 7782, -1, 7783, 7784, -1, 7785, -1, -1, -1, -1, /* 0x8800 */ -1, 7787, -1, -1, -1, 7788, 7790, 7791, -1, -1, -1, -1, -1, 7793, 7794, 7795, 7796, 7797, 7798, -1, 7801, 7802, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7803, -1, 7805, 7806, 7807, -1, -1, -1, 7809, 7811, -1, -1, -1, -1, 7812, -1, -1, -1, 7813, -1, -1, -1, -1, 7814, -1, -1, 7817, 7819, 7822, 7823, -1, -1, -1, -1, -1, 7825, -1, 7826, 7827, 7828, -1, -1, 7831, 7833, -1, -1, -1, -1, -1, -1, -1, -1, 7834, 7835, 7838, 7839, -1, 7840, -1, 7843, 7844, 7846, 7849, 7850, 7852, -1, -1, -1, 7855, 7856, 7857, -1, -1, 7858, -1, -1, -1, 7859, -1, 7860, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7861, -1, -1, -1, 7862, -1, -1, -1, -1, -1, -1, 7863, 7864, 7867, -1, -1, -1, -1, 7868, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7869, -1, 7872, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7873, 7875, 7876, 7877, -1, -1, -1, -1, 7878, 7880, -1, 7881, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7882, 7883, -1, 7884, -1, 7885, -1, 7886, -1, -1, 7887, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7889, -1, -1, 7890, 7891, -1, -1, 7892, 7893, 7895, 7896, 7897, 7899, 7900, -1, 7902, -1, -1, -1, -1, 7903, -1, -1, -1, -1, -1, -1, 7904, 7905, -1, -1, -1, -1, -1, -1, -1, 7906, -1, -1, /* 0x8900 */ -1, -1, -1, -1, -1, -1, -1, 7907, -1, -1, 7908, -1, 7909, -1, 7910, 7911, -1, -1, 7912, 7914, -1, -1, -1, -1, 7915, -1, -1, 7916, -1, 7917, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7918, -1, -1, -1, -1, -1, -1, 7919, 7920, 7921, -1, -1, -1, 7922, -1, -1, 7923, -1, -1, -1, -1, -1, -1, -1, 7924, -1, -1, -1, 7926, -1, -1, -1, -1, 7927, 7928, -1, 7929, -1, -1, -1, -1, -1, 7930, 7931, -1, -1, -1, -1, -1, -1, 7932, -1, -1, 7933, -1, -1, -1, 7934, -1, -1, -1, -1, -1, 7935, -1, 7936, 7937, -1, 7938, -1, -1, 7939, -1, 7940, -1, -1, -1, -1, -1, -1, -1, -1, 7942, -1, 7943, -1, -1, -1, -1, -1, -1, 7945, 7947, 7948, 7949, 7952, 7956, -1, 7957, 7958, 7959, 7960, -1, -1, 7963, 7965, -1, 7967, -1, 7969, -1, 7970, -1, -1, -1, -1, -1, -1, 7973, -1, -1, -1, 7974, 7975, 7976, -1, 7978, 7979, -1, 7980, -1, -1, 7981, 7982, -1, 7983, 7984, -1, -1, 7986, 7987, -1, -1, 7989, -1, 7993, 7994, -1, 7996, 7997, 7999, 8000, 8002, 8003, 8004, 8006, 8008, 8009, 8011, 8014, 8015, 8016, 8017, 8018, 8019, 8020, 8021, -1, -1, 8022, -1, -1, 8023, -1, -1, -1, -1, -1, 8025, 8026, -1, -1, -1, -1, 8027, -1, -1, 8028, 8029, -1, -1, -1, -1, -1, -1, -1, 8030, -1, -1, -1, -1, 8032, -1, 8033, -1, 8035, 8036, -1, -1, -1, 8038, -1, 8040, /* 0x8a00 */ 8042, 8044, 8046, 8047, -1, -1, -1, -1, 8048, -1, 8049, -1, 8050, -1, 8051, -1, 8052, -1, 8053, 8054, -1, 8055, 8056, 8057, 8059, -1, 8060, 8061, -1, 8062, -1, 8063, 8064, 8066, 8068, 8069, -1, 8070, -1, -1, -1, 8071, 8072, 8073, -1, 8074, -1, -1, -1, 8075, -1, 8076, 8078, -1, 8079, -1, -1, -1, 8081, 8082, 8083, 8085, -1, -1, -1, 8086, -1, -1, -1, -1, 8087, -1, -1, -1, -1, 8089, -1, 8091, 8092, -1, 8093, -1, 8094, -1, 8095, 8096, 8097, 8098, 8099, -1, -1, 8100, -1, -1, 8101, 8102, 8103, 8104, 8105, 8106, -1, -1, 8107, 8108, -1, 8109, -1, 8110, 8111, 8113, 8114, -1, 8115, 8116, 8118, 8119, -1, 8120, -1, -1, -1, -1, -1, -1, 8121, -1, -1, 8122, -1, -1, -1, -1, 8123, 8124, 8125, 8126, -1, 8127, 8128, -1, 8129, 8130, -1, -1, -1, 8131, 8132, -1, -1, 8133, 8134, -1, 8136, -1, 8138, -1, -1, -1, 8139, -1, 8140, 8141, -1, 8142, 8143, 8144, 8145, -1, 8146, -1, 8147, -1, 8149, 8151, -1, 8153, 8154, -1, 8155, -1, -1, -1, 8156, -1, -1, 8157, -1, -1, 8158, -1, 8160, 8161, -1, -1, 8162, -1, 8163, -1, -1, 8164, -1, 8165, -1, 8166, 8167, 8169, -1, 8170, -1, 8171, 8172, -1, -1, -1, 8173, 8174, -1, -1, -1, 8175, 8176, 8177, 8178, -1, 8179, 8181, 8183, -1, 8184, -1, 8186, 8187, -1, 8188, -1, 8189, 8191, 8197, 8198, -1, -1, 8199, -1, 8200, -1, -1, 8202, 8203, 8205, -1, 8206, -1, 8207, -1, 8209, -1, /* 0x8b00 */ 8210, 8211, 8212, -1, 8213, 8214, -1, -1, -1, -1, 8215, -1, 8216, -1, 8217, -1, 8218, -1, -1, -1, 8219, -1, 8220, 8221, -1, 8222, 8223, 8225, -1, 8226, -1, -1, 8227, 8229, -1, -1, -1, -1, -1, -1, 8231, -1, 8232, 8233, 8235, 8236, -1, -1, 8238, -1, -1, 8239, -1, -1, -1, -1, -1, 8240, -1, -1, 8241, -1, 8243, -1, -1, 8244, -1, -1, -1, -1, -1, -1, -1, 8246, -1, -1, 8248, -1, 8249, 8250, 8251, -1, -1, -1, -1, -1, 8252, -1, 8254, 8255, 8256, 8257, 8259, -1, -1, 8261, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8262, 8264, -1, 8266, 8267, 8269, 8271, 8272, 8273, -1, 8275, -1, -1, 8276, 8277, -1, -1, -1, 8278, 8280, 8281, -1, 8283, 8285, -1, 8287, -1, 8289, -1, -1, -1, -1, 8290, 8292, 8293, 8295, 8297, -1, 8300, -1, 8302, 8303, -1, 8305, 8306, -1, -1, -1, 8307, -1, 8309, -1, 8310, -1, 8311, 8313, 8314, 8315, 8316, 8317, 8318, 8319, 8320, 8321, 8323, 8324, 8325, 8327, 8328, 8329, 8330, 8331, 8332, 8333, 8334, 8335, 8336, 8337, 8338, 8339, 8341, 8342, 8343, 8344, 8346, 8347, 8348, 8349, 8351, 8352, 8353, 8354, 8355, 8356, 8357, 8358, 8359, 8360, 8361, 8362, 8363, 8364, 8365, 8366, 8368, 8369, 8370, 8371, 8372, 8373, 8374, 8375, 8376, 8377, 8378, 8379, 8381, 8382, 8383, 8384, 8385, 8386, 8387, 8388, 8389, 8390, 8391, 8392, 8393, 8394, 8395, 8396, 8397, 8398, 8400, 8401, 8403, 8404, 8405, 8407, 8408, 8409, 8410, 8411, 8412, 8413, 8415, 8416, 8417, 8418, /* 0x8c00 */ 8419, 8420, 8421, 8422, 8423, 8424, 8425, 8426, 8427, 8428, 8429, 8431, 8432, 8433, 8434, 8435, 8437, 8438, 8439, 8440, 8441, 8443, 8444, 8446, 8447, 8448, 8450, 8451, 8452, 8453, 8454, 8455, 8456, 8457, 8458, 8459, 8461, 8462, 8464, 8465, 8466, 8467, 8468, 8470, 8472, 8473, 8474, 8476, 8477, 8478, 8479, 8480, 8481, 8482, 8483, 8484, -1, -1, 8486, -1, -1, -1, -1, 8487, 8490, -1, -1, -1, -1, -1, 8493, -1, 8494, -1, 8495, -1, -1, -1, 8499, -1, 8501, -1, -1, 8505, 8509, -1, -1, -1, 8513, -1, 8514, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8515, -1, -1, -1, -1, -1, -1, 8516, 8517, -1, 8518, -1, -1, -1, -1, -1, -1, -1, 8519, -1, -1, -1, 8520, 8521, 8522, -1, 8523, -1, -1, -1, 8524, -1, -1, -1, -1, 8525, -1, 8526, -1, 8527, 8528, 8529, 8531, -1, -1, -1, 8532, 8533, 8534, -1, -1, -1, 8535, -1, -1, 8536, 8537, 8539, 8541, 8542, 8545, 8546, 8548, -1, -1, -1, -1, 8549, 8550, 8551, 8552, 8553, 8554, 8555, 8558, 8561, 8562, -1, 8563, 8564, 8567, -1, 8568, 8569, 8570, -1, 8571, 8572, 8573, 8574, -1, 8575, 8576, 8577, 8578, 8579, 8580, 8581, -1, 8582, 8583, 8584, 8586, 8587, -1, 8588, 8590, -1, -1, 8592, 8593, 8594, 8596, 8598, 8599, -1, -1, 8600, 8601, 8602, 8604, -1, 8605, -1, 8606, 8607, 8610, 8612, 8614, -1, 8616, 8617, -1, -1, 8618, 8621, 8622, 8623, -1, -1, 8624, -1, -1, -1, 8625, 8627, -1, 8628, -1, -1, 8630, 8631, 8632, 8633, 8634, -1, /* 0x8d00 */ -1, 8635, -1, -1, 8637, 8638, -1, 8639, 8640, -1, 8641, 8643, -1, 8646, -1, 8647, 8648, -1, 8649, 8651, 8653, -1, 8654, 8655, -1, -1, -1, 8658, 8659, 8660, 8662, 8663, 8664, 8667, 8668, 8670, 8671, 8673, 8675, 8676, 8677, 8679, 8680, 8681, 8682, 8683, 8684, 8685, 8686, 8689, 8691, 8692, 8693, 8694, 8695, 8696, 8697, 8698, 8699, 8700, 8701, 8702, 8703, 8704, 8705, 8706, 8707, 8708, 8711, 8712, 8713, 8714, 8715, 8716, 8717, 8719, 8720, 8721, 8724, 8725, 8726, 8727, 8728, 8729, 8730, 8731, 8732, 8734, 8735, 8736, 8737, 8738, 8739, 8740, 8743, 8747, 8748, 8749, 8750, 8751, 8752, -1, -1, -1, -1, -1, 8754, -1, 8755, -1, -1, -1, 8756, 8757, -1, -1, -1, 8758, 8759, -1, -1, -1, -1, 8760, -1, -1, -1, 8765, -1, 8766, 8767, -1, -1, -1, -1, -1, -1, -1, -1, 8768, -1, -1, -1, -1, -1, 8769, -1, -1, -1, 8770, -1, -1, -1, 8771, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8772, -1, 8773, -1, -1, -1, 8774, -1, -1, 8775, -1, 8777, 8778, -1, -1, -1, -1, -1, 8779, -1, -1, 8780, -1, -1, -1, -1, -1, -1, -1, 8781, 8783, -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, 8784, -1, -1, 8785, -1, -1, -1, 8786, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8787, 8788, 8789, 8790, 8791, 8792, 8793, 8794, 8795, -1, -1, -1, /* 0x8e00 */ -1, 8796, -1, -1, -1, -1, -1, -1, 8798, -1, 8800, 8801, 8803, -1, -1, -1, 8804, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8805, 8806, 8807, 8808, 8809, -1, -1, 8810, 8811, -1, -1, -1, 8812, -1, -1, -1, 8813, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8814, -1, -1, -1, -1, -1, -1, 8815, 8817, -1, -1, 8818, -1, 8819, 8820, -1, -1, 8821, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8822, -1, -1, -1, 8823, 8824, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8826, -1, -1, -1, -1, -1, -1, -1, -1, 8828, 8830, -1, -1, -1, -1, 8832, -1, -1, 8833, 8834, 8835, -1, -1, 8836, -1, 8837, 8838, 8841, -1, 8843, -1, 8845, -1, 8846, 8847, 8848, -1, 8849, -1, -1, -1, 8851, 8852, -1, 8853, -1, -1, -1, -1, 8854, 8855, -1, -1, 8857, 8858, -1, -1, -1, 8859, -1, 8861, 8862, -1, 8863, 8864, 8868, 8869, 8870, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8871, -1, -1, -1, 8872, -1, 8875, -1, -1, -1, 8879, 8880, 8881, 8882, -1, -1, -1, 8883, 8884, -1, 8885, -1, -1, -1, -1, -1, -1, 8886, -1, -1, -1, 8889, -1, -1, 8890, 8892, 8894, -1, -1, -1, -1, -1, -1, 8895, -1, -1, -1, -1, 8896, -1, 8898, -1, -1, -1, 8899, -1, 8902, 8903, 8904, 8905, 8906, 8907, 8909, -1, /* 0x8f00 */ 8910, -1, -1, 8911, -1, 8912, -1, 8913, 8914, 8915, 8916, -1, 8917, -1, -1, 8919, -1, -1, 8920, 8922, 8923, 8925, -1, -1, -1, 8927, -1, 8929, 8931, 8933, 8934, 8935, -1, 8936, -1, -1, -1, 8937, 8938, -1, -1, 8939, 8941, -1, 8942, 8943, -1, 8944, -1, -1, -1, 8945, -1, -1, 8946, -1, 8947, -1, 8948, 8950, 8951, -1, 8952, 8953, -1, 8954, 8957, -1, 8958, 8960, 8961, -1, -1, 8962, -1, -1, -1, 8964, 8965, -1, -1, -1, -1, -1, 8966, -1, -1, 8967, -1, -1, -1, -1, 8968, -1, -1, 8969, -1, 8971, 8972, -1, 8973, -1, 8974, 8975, 8976, 8977, 8978, 8979, 8980, 8982, 8985, 8986, 8988, 8990, 8991, 8992, 8993, 8994, 8995, 8996, 8997, 8998, 8999, 9000, 9002, 9003, 9004, 9005, 9006, 9007, 9008, 9009, 9010, 9012, 9013, 9015, 9016, 9018, 9019, 9020, 9021, 9022, 9023, 9025, 9026, 9027, 9028, 9029, 9030, 9031, 9032, 9033, 9034, 9035, 9036, -1, -1, 9037, 9040, 9043, 9044, 9046, -1, -1, 9049, -1, 9052, 9053, 9055, 9057, -1, 9060, -1, 9061, 9064, 9065, -1, -1, 9068, -1, -1, 9069, 9070, -1, -1, 9071, 9074, -1, -1, 9077, 9078, -1, -1, 9080, 9081, 9082, -1, -1, 9083, 9084, 9085, -1, 9086, -1, -1, -1, -1, -1, 9088, -1, -1, -1, -1, -1, -1, -1, 9089, 9090, -1, 9091, 9092, 9093, 9094, 9095, -1, -1, -1, -1, 9098, 9099, -1, -1, -1, 9100, 9101, -1, 9102, -1, -1, 9103, -1, -1, -1, 9104, 9107, -1, -1, -1, -1, 9113, 9115, -1, -1, -1, -1, -1, /* 0x9000 */ -1, -1, 9117, 9118, -1, -1, -1, -1, 9119, 9120, 9121, -1, -1, -1, 9122, -1, -1, -1, 9123, 9125, -1, 9127, -1, -1, -1, 9130, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9131, -1, 9132, 9138, -1, -1, 9139, -1, -1, -1, -1, -1, -1, 9140, 9142, 9143, -1, -1, -1, -1, -1, -1, 9144, 9146, 9147, 9148, -1, -1, -1, -1, 9149, -1, -1, -1, 9150, -1, -1, -1, 9152, 9154, 9156, -1, -1, 9157, -1, -1, -1, 9158, 9159, 9162, 9164, -1, 9165, -1, 9166, -1, -1, 9167, -1, 9168, -1, 9170, 9172, -1, -1, -1, 9173, -1, -1, -1, 9174, -1, -1, -1, -1, -1, 9175, -1, -1, 9176, -1, -1, -1, 9178, 9179, 9180, -1, 9181, -1, 9182, -1, -1, -1, -1, 9183, -1, -1, 9184, -1, -1, 9185, -1, 9186, 9189, -1, -1, -1, -1, 9192, 9193, 9194, -1, 9195, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9196, -1, -1, -1, -1, -1, -1, -1, -1, 9197, -1, 9198, -1, -1, 9199, 9200, -1, 9201, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9202, 9203, 9204, -1, 9207, -1, -1, -1, 9208, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9211, -1, 9212, 9214, 9215, 9216, 9217, 9219, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9220, 9222, -1, -1, -1, -1, -1, -1, 9223, 9224, 9225, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9226, 9227, 9228, 9232, -1, -1, -1, -1, -1, -1, -1, /* 0x9100 */ -1, -1, -1, -1, -1, -1, 9233, -1, -1, 9234, 9238, -1, -1, -1, -1, -1, -1, -1, 9242, -1, 9243, 9244, 9248, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9249, -1, -1, -1, -1, -1, 9250, -1, -1, 9251, -1, 9254, -1, 9255, -1, 9256, 9257, -1, -1, 9258, -1, 9259, 9260, -1, -1, -1, -1, 9263, -1, -1, -1, 9264, 9265, 9267, 9268, -1, 9269, -1, -1, -1, -1, -1, -1, -1, -1, 9270, -1, -1, -1, -1, 9271, -1, -1, -1, 9272, -1, -1, -1, -1, 9274, -1, -1, -1, 9275, 9278, -1, -1, 9280, -1, 9281, -1, -1, -1, -1, 9283, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9285, 9286, 9287, -1, -1, -1, 9289, -1, -1, -1, 9290, -1, 9291, 9292, 9293, -1, -1, 9294, -1, -1, -1, -1, -1, 9296, 9297, 9298, 9300, 9303, -1, -1, -1, 9304, -1, 9306, -1, -1, -1, -1, -1, 9308, -1, -1, -1, -1, -1, -1, 9310, 9312, -1, -1, -1, -1, 9314, -1, -1, -1, -1, -1, -1, 9317, -1, -1, 9319, 9321, -1, -1, -1, 9323, 9325, -1, 9326, -1, 9327, -1, 9328, 9330, -1, 9332, 9334, 9336, -1, 9338, -1, 9340, 9341, 9343, 9345, 9348, 9349, 9350, 9352, 9353, 9354, 9355, -1, 9357, 9358, -1, -1, 9359, 9361, -1, 9362, 9364, -1, 9365, 9366, -1, 9367, -1, -1, -1, -1, -1, 9368, 9369, -1, -1, -1, -1, 9377, -1, 9378, -1, 9379, 9380, 9381, 9384, -1, -1, -1, /* 0x9200 */ 9392, 9393, -1, 9394, 9395, 9396, 9397, -1, 9399, 9400, -1, -1, -1, 9401, 9402, -1, 9404, 9405, 9406, -1, 9407, 9408, -1, -1, -1, -1, -1, -1, -1, -1, 9409, 9411, -1, 9412, -1, 9413, -1, 9414, 9415, 9416, 9417, 9418, -1, -1, 9420, -1, 9422, -1, 9424, -1, -1, 9425, 9426, -1, -1, 9427, 9428, 9429, 9430, -1, -1, 9431, 9432, 9433, 9434, -1, -1, -1, 9435, 9440, 9441, 9442, 9443, 9444, -1, 9445, -1, 9447, -1, -1, -1, 9448, -1, -1, -1, 9449, -1, 9450, -1, -1, 9451, 9452, -1, -1, 9454, -1, 9455, -1, 9456, -1, 9459, -1, 9461, -1, 9462, -1, -1, -1, 9464, 9465, -1, -1, -1, 9466, -1, -1, 9471, -1, 9475, -1, 9476, -1, 9477, 9478, -1, -1, -1, 9479, 9480, -1, -1, 9481, -1, 9482, -1, -1, -1, -1, -1, -1, -1, 9483, -1, -1, -1, 9484, -1, 9485, -1, 9486, 9490, -1, 9491, -1, 9492, 9494, 9496, -1, 9499, -1, 9500, -1, -1, 9501, -1, 9502, 9503, -1, 9504, 9505, 9506, 9507, 9508, 9509, 9511, -1, -1, 9512, 9513, 9514, -1, -1, -1, 9516, -1, 9518, -1, 9519, 9520, 9521, -1, -1, -1, 9522, -1, 9523, -1, 9524, -1, 9525, -1, -1, -1, -1, 9526, -1, -1, 9527, -1, -1, 9528, -1, -1, -1, -1, -1, -1, 9529, -1, 9530, -1, 9535, -1, 9536, -1, -1, -1, 9538, 9540, 9541, 9542, -1, 9543, 9548, 9550, -1, -1, 9553, 9555, 9556, 9557, 9558, -1, 9559, -1, -1, 9561, -1, 9562, -1, -1, -1, 9563, -1, -1, -1, /* 0x9300 */ -1, 9564, -1, -1, 9565, -1, 9567, 9568, 9569, -1, -1, -1, -1, -1, -1, 9570, 9572, -1, 9573, -1, -1, 9574, -1, -1, 9575, 9576, 9578, 9579, -1, -1, -1, 9580, 9581, 9582, 9583, -1, -1, -1, 9585, -1, 9586, 9587, -1, 9588, 9589, -1, 9592, 9593, -1, -1, 9594, 9596, -1, -1, 9597, 9598, 9599, -1, -1, -1, -1, -1, 9600, -1, 9601, 9602, -1, 9603, -1, -1, 9604, 9605, 9606, -1, 9608, 9611, -1, 9612, -1, -1, -1, -1, -1, -1, 9613, -1, -1, -1, 9614, -1, 9615, 9616, -1, -1, 9618, -1, 9619, -1, -1, -1, 9621, 9622, -1, -1, -1, 9623, -1, -1, 9624, -1, -1, 9625, 9627, -1, -1, 9628, -1, 9632, 9633, -1, -1, -1, 9634, -1, -1, -1, 9635, 9637, -1, 9638, 9639, -1, 9640, -1, -1, 9641, -1, -1, 9642, 9643, 9644, -1, -1, -1, -1, -1, 9646, -1, 9648, -1, 9650, 9652, 9653, -1, 9654, 9655, -1, -1, -1, -1, -1, 9656, 9658, 9659, -1, -1, 9660, 9662, -1, 9663, 9664, -1, 9665, 9666, 9668, -1, 9670, -1, -1, 9671, -1, 9672, -1, -1, 9673, -1, 9674, -1, -1, -1, -1, 9675, -1, 9676, -1, 9677, -1, -1, -1, 9678, 9679, -1, -1, -1, 9680, 9681, -1, -1, 9682, 9683, -1, 9684, -1, -1, -1, 9685, 9686, -1, -1, -1, 9687, 9688, 9689, 9690, -1, 9694, 9696, -1, 9697, 9698, -1, -1, 9700, -1, -1, -1, -1, -1, -1, -1, 9701, -1, -1, -1, -1, 9702, -1, 9703, -1, 9704, -1, -1, -1, 9705, -1, -1, /* 0x9400 */ -1, -1, 9707, 9709, -1, -1, -1, -1, -1, -1, -1, 9710, -1, -1, -1, -1, 9711, -1, 9712, 9713, 9714, -1, -1, 9715, 9716, 9717, 9718, -1, -1, 9720, -1, -1, 9722, 9723, -1, -1, -1, -1, 9728, 9729, 9730, -1, -1, 9731, -1, -1, 9732, -1, -1, -1, 9734, 9735, -1, 9736, 9741, -1, 9742, -1, 9744, -1, -1, -1, -1, 9745, -1, -1, -1, 9746, 9748, 9750, -1, -1, -1, -1, 9751, -1, 9752, -1, -1, -1, -1, 9753, 9757, 9761, 9762, 9763, -1, -1, -1, -1, 9764, 9766, 9771, -1, 9773, -1, 9774, -1, -1, 9775, 9776, 9777, -1, -1, -1, -1, 9778, -1, 9780, 9784, -1, 9785, 9786, 9787, 9788, -1, -1, 9789, -1, 9791, -1, 9792, -1, -1, 9793, 9794, 9796, 9797, -1, 9798, 9800, -1, -1, 9801, 9803, 9806, 9807, 9808, 9809, 9810, 9811, 9812, 9813, 9814, 9815, 9816, 9817, 9818, 9819, 9820, 9821, 9822, 9823, 9824, 9825, 9826, 9827, 9828, 9829, 9830, 9834, 9835, 9836, 9837, 9838, 9839, 9841, 9842, 9843, 9844, 9846, 9847, 9848, 9849, 9850, 9851, 9852, 9853, 9855, 9856, 9857, 9858, 9861, 9862, 9863, 9864, 9865, 9866, 9869, 9870, 9871, 9872, 9873, 9874, 9877, 9878, 9879, 9880, 9882, 9883, 9885, 9886, 9887, 9889, 9890, 9892, 9893, 9895, 9896, 9897, 9898, 9899, 9900, 9902, 9903, 9904, 9905, 9906, 9907, 9908, 9909, 9910, 9911, 9912, 9913, 9914, 9915, 9916, 9917, 9918, 9919, 9920, 9921, 9922, 9923, 9924, 9926, 9927, 9928, 9929, 9930, 9931, 9932, 9936, 9937, 9938, 9939, 9940, 9941, 9943, 9944, 9947, 9948, 9949, 9950, 9951, /* 0x9500 */ 9953, 9954, 9955, 9956, 9957, 9959, 9960, 9961, 9962, 9965, 9966, 9967, 9968, 9969, 9970, 9971, 9973, 9975, 9976, 9977, 9978, 9979, 9980, 9981, 9982, 9983, 9984, 9985, 9986, 9987, 9988, 9989, 9990, 9991, 9992, 9993, 9994, 9996, 9997, 9998, 9999, 10000, 10001, 10003, 10004, 10005, 10006, 10007, 10008, 10009, 10010, 10011, 10012, 10013, 10014, 10015, 10016, 10017, 10018, 10020, 10021, 10022, 10023, 10024, 10025, 10026, 10027, 10028, 10029, 10030, 10031, 10032, 10034, 10035, 10036, 10037, 10038, 10040, 10041, 10042, 10044, 10045, 10046, 10047, 10048, -1, 10049, 10050, 10051, 10052, 10053, 10054, 10055, 10056, 10057, 10058, 10059, 10060, 10061, 10063, 10064, 10065, 10066, 10067, 10068, 10069, 10070, 10071, 10072, 10073, 10074, 10075, 10076, 10078, 10079, 10080, 10081, 10082, 10083, 10084, 10088, 10092, -1, -1, -1, -1, -1, 10094, 10098, -1, 10099, 10100, -1, -1, 10101, 10102, 10104, 10105, -1, 10107, 10108, -1, 10109, 10110, -1, 10112, 10114, 10116, 10117, -1, -1, -1, 10118, 10119, -1, -1, -1, -1, -1, -1, 10121, 10123, 10124, 10127, 10128, 10129, -1, 10130, 10131, 10132, -1, 10133, 10134, 10135, -1, -1, -1, 10136, 10138, -1, 10140, -1, 10142, -1, -1, 10143, -1, 10145, 10146, 10147, 10148, 10149, -1, -1, -1, 10150, -1, -1, 10152, 10153, 10154, -1, 10155, 10157, 10158, 10159, -1, -1, 10160, -1, 10161, 10162, 10163, 10164, 10165, 10166, 10169, 10174, -1, -1, 10180, -1, 10183, -1, 10184, 10185, 10186, -1, 10187, 10188, -1, -1, 10189, 10190, 10191, 10192, 10193, 10194, 10196, 10197, 10198, 10200, 10201, 10203, 10204, 10205, 10206, 10207, 10208, 10209, 10211, 10212, 10213, 10214, 10215, 10216, /* 0x9600 */ 10217, 10218, 10219, 10220, 10221, 10222, 10224, 10225, 10226, 10227, 10229, 10230, 10231, 10232, 10233, 10234, 10235, 10236, 10237, 10239, 10240, 10242, 10243, 10244, 10245, 10246, 10247, 10249, 10250, 10251, -1, 10253, -1, -1, -1, -1, -1, 10254, 10258, -1, 10260, 10261, 10263, 10265, 10267, -1, -1, 10268, -1, 10269, -1, 10270, 10272, 10276, 10277, -1, 10279, -1, -1, 10280, -1, -1, -1, -1, 10281, 10283, -1, -1, -1, 10285, 10286, 10287, 10288, 10289, -1, -1, -1, 10290, -1, -1, -1, -1, -1, -1, -1, 10291, 10294, -1, 10295, -1, -1, -1, 10296, 10298, 10299, 10301, -1, -1, -1, 10302, -1, 10304, 10305, -1, 10312, 10313, -1, -1, -1, -1, -1, -1, 10316, -1, -1, 10320, -1, -1, -1, 10321, 10322, -1, 10323, 10326, -1, 10328, -1, 10330, -1, 10332, 10334, -1, 10338, -1, -1, -1, -1, -1, 10340, -1, 10341, -1, 10342, 10344, 10345, -1, -1, -1, -1, 10348, 10350, -1, -1, 10351, -1, 10352, -1, 10353, -1, 10360, 10361, -1, -1, 10364, -1, -1, -1, -1, 10367, -1, 10368, 10371, -1, -1, 10373, 10374, -1, 10381, 10384, -1, 10385, -1, 10386, 10388, 10390, -1, 10392, 10399, -1, 10400, 10401, -1, -1, 10402, -1, -1, -1, -1, -1, 10404, -1, -1, -1, 10406, -1, 10407, -1, 10408, -1, 10409, -1, -1, -1, 10411, 10414, -1, -1, 10415, 10416, 10417, 10419, 10421, 10422, 10425, 10426, -1, 10428, 10429, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10430, -1, 10431, 10432, -1, -1, 10433, 10434, -1, -1, 10435, 10437, -1, -1, 10438, -1, /* 0x9700 */ -1, 10440, -1, -1, -1, -1, -1, -1, -1, 10441, 10442, -1, -1, -1, -1, -1, -1, 10445, -1, -1, -1, -1, -1, 10446, -1, -1, 10447, 10450, -1, -1, -1, -1, -1, 10453, 10454, -1, -1, -1, -1, 10455, -1, -1, -1, -1, -1, 10458, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10459, -1, -1, 10460, -1, 10464, -1, -1, -1, 10465, 10466, -1, 10467, -1, 10468, -1, 10469, 10472, 10473, -1, -1, 10477, 10484, 10491, -1, 10498, 10500, 10502, 10503, -1, -1, -1, -1, 10506, 10507, -1, 10508, 10509, -1, -1, -1, -1, 10512, 10518, 10519, 10521, -1, 10522, 10523, -1, -1, 10524, -1, 10526, -1, -1, -1, 10529, -1, -1, 10532, -1, -1, -1, -1, -1, -1, -1, -1, 10533, -1, -1, 10534, -1, -1, -1, -1, -1, -1, -1, -1, 10536, -1, 10538, 10539, 10540, -1, 10541, -1, 10542, 10543, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10544, -1, -1, -1, -1, -1, -1, 10545, 10547, 10549, -1, -1, -1, -1, -1, -1, 10550, -1, 10551, 10553, -1, -1, 10554, -1, -1, -1, 10555, -1, -1, -1, 10556, 10557, -1, -1, 10558, -1, 10560, -1, -1, 10561, -1, 10562, 10564, -1, 10565, 10566, 10567, -1, -1, -1, -1, -1, 10569, -1, -1, -1, -1, -1, 10570, -1, -1, 10571, 10574, 10575, -1, -1, -1, -1, -1, 10576, -1, 10578, 10579, 10582, 10584, 10585, 10586, 10587, 10589, 10590, 10591, -1, 10592, 10593, -1, -1, 10595, -1, -1, -1, -1, -1, 10596, -1, -1, -1, 10597, /* 0x9800 */ -1, 10598, 10599, 10600, -1, 10601, 10602, 10603, 10604, -1, 10605, -1, 10606, -1, 10607, 10608, 10609, 10610, 10611, 10612, -1, -1, -1, 10613, 10614, -1, 10615, -1, 10617, -1, -1, -1, -1, 10618, -1, -1, 10619, 10621, 10623, -1, -1, -1, -1, -1, 10624, 10626, 10627, -1, 10629, -1, 10631, -1, 10632, -1, -1, 10634, 10635, 10637, 10641, 10645, 10646, 10648, 10652, -1, -1, -1, -1, -1, -1, -1, 10653, -1, -1, -1, -1, 10654, 10655, 10656, 10657, 10658, -1, -1, 10660, 10661, 10662, 10664, 10666, -1, 10667, 10668, 10669, 10671, -1, -1, 10673, -1, -1, -1, 10674, -1, -1, 10675, -1, 10676, -1, -1, -1, 10677, 10678, -1, -1, 10679, 10681, 10682, -1, 10685, 10686, 10687, 10688, 10689, 10690, 10691, 10692, 10693, 10695, 10696, 10697, 10698, 10699, 10700, 10701, 10702, 10703, 10704, 10706, 10707, 10708, 10710, 10711, 10713, 10714, 10715, 10716, 10717, 10718, 10720, 10721, 10722, 10726, -1, 10727, 10729, 10730, 10731, 10732, 10733, 10734, 10736, 10737, 10738, 10739, 10741, 10742, 10743, 10744, 10745, 10746, 10747, 10748, -1, -1, -1, -1, 10756, 10757, 10761, -1, 10762, -1, 10763, -1, -1, 10764, 10765, 10768, -1, 10769, 10770, 10771, -1, -1, -1, 10772, -1, -1, 10773, 10775, -1, 10777, 10782, 10783, -1, -1, -1, 10787, -1, 10792, 10798, 10799, 10800, 10801, 10802, 10803, 10804, 10805, 10806, 10807, 10809, 10810, 10811, 10812, -1, 10813, 10814, 10817, 10820, 10821, 10822, -1, 10823, -1, -1, 10824, 10825, 10826, 10827, 10829, 10830, 10831, 10833, 10835, -1, 10836, -1, 10838, -1, 10839, -1, -1, -1, -1, -1, 10840, 10841, 10842, 10843, /* 0x9900 */ -1, -1, -1, 10844, 10845, 10846, -1, -1, -1, 10848, 10851, -1, 10854, 10855, 10856, 10857, 10858, 10859, 10860, 10862, -1, 10863, 10864, -1, 10865, -1, 10867, 10868, 10869, -1, 10870, 10871, 10872, 10874, -1, -1, -1, -1, -1, 10875, 10879, -1, -1, -1, 10881, -1, -1, -1, -1, 10882, -1, 10883, 10884, 10885, 10887, 10888, -1, 10889, 10890, 10891, 10892, 10893, 10894, 10895, -1, 10896, -1, 10897, -1, 10898, -1, -1, 10899, 10900, 10901, 10902, 10903, 10904, 10905, -1, -1, 10906, 10907, -1, -1, -1, -1, 10908, -1, 10909, -1, -1, 10910, -1, 10911, 10912, -1, -1, 10915, 10916, 10919, 10920, 10922, 10923, 10925, 10926, 10927, 10928, 10929, 10930, 10931, 10933, 10934, 10935, 10936, 10937, 10938, 10939, 10940, 10941, 10943, 10944, 10945, 10946, 10947, 10949, 10950, 10951, 10952, 10954, 10956, 10957, 10958, 10959, 10960, 10961, 10962, 10964, 10965, 10966, 10967, 10968, 10969, 10970, 10971, 10972, 10973, 10974, 10975, 10976, -1, -1, -1, -1, -1, -1, -1, 10977, 10978, 10979, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10980, 10981, 10982, -1, -1, 10983, 10985, 10986, 10987, -1, -1, -1, -1, 10988, -1, -1, -1, 10989, -1, 10990, -1, 10992, -1, -1, 10993, 10995, 10997, -1, 11001, -1, -1, -1, -1, -1, -1, -1, 11005, 11006, 11007, -1, 11008, 11009, -1, -1, 11010, 11011, -1, 11012, -1, 11013, 11015, 11017, -1, 11018, 11021, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11022, 11023, -1, 11024, 11025, -1, -1, -1, 11026, -1, -1, 11028, -1, -1, -1, -1, -1, -1, 11029, /* 0x9a00 */ -1, 11030, 11031, -1, -1, 11032, -1, -1, -1, -1, -1, -1, -1, 11033, 11034, 11035, 11036, -1, 11039, 11041, -1, -1, 11044, -1, -1, 11045, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11046, -1, -1, -1, 11047, -1, -1, 11048, -1, 11049, 11050, -1, 11053, -1, -1, -1, -1, -1, 11054, 11055, 11057, -1, 11058, -1, -1, -1, 11059, -1, 11060, 11061, 11062, 11063, 11064, 11065, -1, 11069, -1, -1, 11070, -1, 11071, 11072, -1, 11073, -1, 11074, 11077, -1, -1, 11078, -1, 11079, -1, -1, 11082, 11083, -1, 11085, -1, 11086, -1, -1, 11087, -1, 11089, 11090, 11092, -1, -1, 11093, 11094, 11095, 11096, 11097, 11098, 11100, 11101, 11102, 11106, 11107, 11109, 11111, 11112, 11113, 11114, 11115, 11116, 11117, 11118, 11120, 11121, 11122, 11124, 11125, 11126, 11129, 11130, 11131, 11132, 11133, 11134, 11135, 11136, 11137, 11138, 11141, 11142, 11143, 11144, 11145, 11146, 11147, -1, 11148, 11149, 11150, 11151, 11153, 11154, 11156, 11157, 11158, 11160, 11161, 11162, 11163, 11164, 11165, 11166, 11167, 11169, 11170, -1, -1, -1, -1, -1, -1, -1, 11171, -1, -1, -1, -1, -1, 11172, -1, -1, -1, -1, -1, -1, -1, -1, 11176, -1, -1, -1, -1, -1, 11177, 11179, -1, -1, 11180, -1, -1, 11181, 11182, -1, -1, 11183, -1, -1, 11184, 11185, 11187, 11191, 11193, 11194, 11197, 11198, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11199, 11201, 11202, -1, -1, -1, 11203, 11205, -1, -1, 11207, 11208, 11210, -1, -1, -1, -1, 11211, -1, -1, -1, -1, 11213, -1, -1, -1, -1, -1, -1, /* 0x9b00 */ 11214, -1, 11215, -1, -1, -1, 11218, -1, -1, -1, -1, -1, -1, 11219, -1, -1, -1, -1, -1, 11220, -1, -1, -1, -1, -1, -1, 11222, 11223, -1, -1, -1, -1, -1, -1, 11224, 11227, -1, 11228, 11233, 11238, 11240, 11241, 11242, 11247, -1, 11248, 11253, -1, 11254, 11257, -1, -1, -1, -1, 11260, -1, -1, 11261, -1, 11262, -1, -1, -1, -1, 11264, -1, -1, -1, -1, -1, -1, 11265, -1, 11266, -1, -1, -1, -1, 11267, -1, 11269, -1, -1, -1, -1, -1, -1, 11274, 11276, -1, 11277, 11278, -1, -1, -1, -1, -1, -1, 11279, 11280, -1, -1, 11281, -1, 11282, -1, -1, -1, -1, 11283, -1, 11284, -1, -1, 11285, 11287, 11288, -1, -1, 11289, -1, -1, 11290, -1, -1, -1, -1, -1, -1, 11291, -1, 11292, -1, -1, -1, -1, -1, 11293, 11295, 11296, -1, 11297, 11298, 11299, 11300, 11301, 11302, 11303, -1, -1, -1, -1, -1, -1, 11304, -1, 11305, 11306, 11309, -1, -1, -1, -1, -1, -1, -1, 11310, 11311, -1, -1, 11313, 11314, -1, 11315, 11316, -1, -1, -1, -1, 11321, -1, -1, 11322, 11323, -1, -1, 11325, 11326, -1, -1, 11327, -1, 11328, 11329, -1, -1, -1, -1, -1, 11330, -1, 11332, 11333, 11335, -1, -1, -1, -1, -1, -1, 11336, -1, 11337, 11338, 11339, 11340, 11342, -1, -1, 11343, -1, 11345, -1, -1, -1, 11346, 11347, -1, 11348, -1, -1, 11349, 11350, -1, 11351, 11352, -1, -1, -1, -1, 11353, -1, -1, -1, 11354, 11355, -1, 11356, -1, 11359, -1, -1, -1, 11360, -1, 11361, /* 0x9c00 */ 11362, 11364, 11365, 11366, -1, -1, -1, -1, 11367, 11369, -1, -1, 11370, 11372, -1, 11374, 11375, -1, 11377, 11378, -1, -1, -1, -1, -1, -1, -1, 11379, 11381, -1, -1, 11382, 11383, -1, -1, 11384, 11385, 11386, -1, -1, 11388, 11390, -1, -1, -1, 11391, 11392, -1, -1, 11393, 11394, 11396, -1, 11397, -1, 11398, -1, 11399, 11400, 11402, 11403, -1, 11404, -1, -1, -1, 11405, -1, -1, 11406, -1, -1, 11407, 11408, -1, -1, -1, -1, -1, -1, -1, -1, 11411, 11412, 11413, -1, 11414, 11415, 11416, -1, -1, -1, -1, 11417, 11418, 11419, 11420, -1, -1, 11421, 11422, -1, -1, 11423, 11424, -1, -1, -1, -1, 11425, 11426, 11427, -1, -1, -1, -1, -1, -1, 11428, 11431, 11433, -1, 11435, 11436, 11441, 11442, 11443, 11444, 11445, 11446, 11447, -1, 11448, 11449, 11450, 11451, 11452, 11454, 11455, 11456, 11457, 11458, 11460, 11461, 11462, 11463, 11464, 11465, 11466, 11467, 11468, 11469, 11470, 11471, 11472, 11473, 11474, 11479, 11480, 11482, 11483, 11485, 11486, 11487, 11488, 11489, 11490, 11491, 11492, 11493, 11495, 11496, 11497, 11498, 11499, 11500, 11501, 11502, 11503, 11504, 11505, 11506, 11507, 11508, 11510, 11511, 11512, 11513, 11514, 11515, 11516, 11517, 11518, 11519, 11520, 11521, 11522, 11524, 11526, 11527, 11528, 11529, 11530, 11531, 11532, 11534, 11535, 11536, 11537, 11538, 11539, 11540, 11541, 11542, 11544, 11546, 11547, 11548, -1, 11549, 11550, 11551, 11553, 11554, 11555, 11556, 11557, 11558, -1, 11559, -1, 11561, -1, 11563, -1, 11564, 11566, -1, -1, -1, -1, -1, 11567, 11568, 11569, -1, 11570, -1, 11571, -1, -1, -1, -1, -1, -1, -1, /* 0x9d00 */ -1, -1, -1, -1, -1, -1, 11572, 11573, 11574, 11576, -1, -1, -1, -1, 11578, -1, -1, -1, 11580, -1, -1, 11581, -1, -1, -1, -1, -1, 11582, -1, 11583, 11585, 11586, -1, -1, -1, 11588, -1, -1, 11589, -1, 11590, -1, -1, -1, 11591, -1, -1, 11593, 11594, -1, -1, 11595, 11596, -1, -1, -1, -1, -1, -1, 11597, 11598, -1, -1, 11599, -1, -1, 11600, 11601, 11602, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11603, 11604, 11605, 11606, -1, -1, -1, -1, -1, 11607, -1, -1, 11608, 11609, 11611, -1, 11613, 11614, -1, -1, -1, -1, -1, -1, -1, -1, 11615, -1, 11616, -1, 11617, 11618, 11619, -1, 11620, -1, -1, -1, 11621, 11623, -1, -1, -1, -1, -1, -1, 11624, -1, -1, -1, -1, -1, -1, -1, -1, 11626, -1, 11628, 11629, -1, -1, -1, -1, 11630, -1, -1, -1, 11633, -1, -1, 11634, -1, 11635, -1, 11636, -1, -1, -1, -1, -1, -1, 11637, -1, -1, 11638, 11639, -1, -1, -1, 11640, 11641, 11642, 11644, -1, -1, 11645, -1, -1, 11647, -1, 11648, 11655, -1, -1, -1, 11656, 11657, 11658, 11659, -1, -1, 11660, 11661, 11662, 11663, 11664, 11665, -1, 11668, -1, 11669, 11670, 11671, -1, -1, -1, -1, 11672, -1, -1, -1, 11673, -1, -1, 11674, 11675, -1, 11677, 11678, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11679, 11680, -1, -1, -1, -1, 11681, -1, -1, -1, 11682, 11683, -1, 11684, 11685, 11687, -1, -1, -1, 11689, 11690, 11691, -1, -1, 11693, -1, 11694, /* 0x9e00 */ -1, -1, -1, -1, -1, -1, -1, 11695, -1, -1, 11696, -1, 11697, -1, 11698, 11699, -1, -1, -1, -1, -1, 11700, 11703, -1, 11710, -1, 11711, 11712, 11714, 11715, 11716, 11717, 11719, 11720, 11723, 11724, 11725, 11726, 11728, 11730, 11731, 11732, 11733, 11734, 11736, 11737, 11738, 11739, 11740, 11741, 11742, 11743, 11744, 11745, 11746, 11747, 11748, 11749, 11750, 11751, 11752, 11753, 11754, 11755, 11756, 11757, 11758, 11759, 11760, 11761, 11763, 11764, 11766, 11767, 11768, 11769, 11770, 11771, 11772, 11773, 11774, 11775, 11776, 11777, 11778, 11779, 11780, 11781, 11782, 11783, 11784, 11786, 11787, 11788, 11789, 11790, 11791, 11792, 11793, 11794, 11795, 11802, 11803, 11804, 11805, 11806, 11807, 11808, 11809, 11810, -1, 11811, 11812, 11813, 11814, 11815, 11816, 11817, -1, -1, 11819, 11822, 11824, 11825, 11826, 11829, 11831, -1, -1, -1, -1, 11832, 11833, 11834, -1, 11835, -1, -1, -1, -1, -1, -1, -1, 11836, -1, -1, -1, -1, -1, -1, -1, 11837, -1, -1, -1, -1, -1, -1, 11839, -1, -1, -1, -1, -1, 11840, 11842, 11843, -1, -1, 11844, 11846, 11851, 11856, 11858, -1, 11859, -1, -1, -1, -1, 11863, 11867, -1, -1, 11872, 11874, 11878, 11883, 11886, 11890, -1, -1, -1, -1, -1, 11894, 11895, -1, -1, -1, -1, 11897, -1, -1, 11898, -1, -1, 11899, -1, 11900, 11901, -1, -1, -1, -1, -1, 11902, 11903, -1, 11904, -1, -1, 11905, -1, -1, 11907, -1, -1, 11908, -1, -1, -1, 11909, 11910, 11911, -1, -1, 11912, -1, -1, -1, 11913, 11914, -1, 11915, -1, 11916, 11917, -1, 11918, -1, -1, -1, 11919, 11920, 11921, /* 0x9f00 */ -1, -1, 11923, 11924, -1, -1, -1, 11925, 11927, 11930, -1, 11931, 11932, 11933, 11934, -1, -1, 11935, 11936, 11937, -1, 11939, -1, 11940, -1, -1, -1, -1, -1, -1, -1, -1, 11942, 11943, -1, -1, -1, -1, 11944, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11945, -1, -1, -1, -1, 11946, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11947, -1, -1, -1, -1, 11948, 11952, -1, -1, 11954, 11956, 11958, 11962, 11964, 11966, 11967, 11969, -1, 11970, -1, 11971, 11972, -1, 11973, -1, -1, 11974, 11975, 11976, 11978, 11980, -1, -1, 11981, 11982, -1, 11985, 11986, -1, 11988, -1, -1, -1, 11989, 11990, 11991, -1, -1, -1, 11992, 11993, -1, -1, -1, -1, -1, -1, -1, 11994, 11996, 11997, 11998, 11999, 12000, 12002, 12003, 12004, 12005, 12006, 12007, 12008, 12009, 12010, 12013, -1, 12014, -1, 12015, -1, 12018, 12019, -1, -1, -1, 12020, 12022, 12023, 12024, 12026, 12029, 12031, -1, -1, 12033, -1, -1, 12036, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }; freelan-2.0/third-party/source/libiconv-msvc/include/cns11643.h000066400000000000000000000027461252300335000242710ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CNS 11643-1992 */ /* ISO-2022-CN and EUC-TW use CNS 11643-1992 planes 1 to 7. We also * have a table for the older plane 15. We use a trick to keep the * Unicode -> CNS 11643 table as small as possible (see cns11643_inv.h). */ #include "cns11643_1.h" #include "cns11643_2.h" #include "cns11643_3.h" #include "cns11643_4.h" #include "cns11643_5.h" #include "cns11643_6.h" #include "cns11643_7.h" #include "cns11643_15.h" #include "cns11643_inv.h" /* Returns the plane number (1,...,7,15) in r[0], the two bytes in r[1],r[2]. */ #define cns11643_wctomb cns11643_inv_wctomb freelan-2.0/third-party/source/libiconv-msvc/include/cns11643_1.h000066400000000000000000001454461252300335000245160ustar00rootroot00000000000000/* * Copyright (C) 1999-2005 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CNS 11643-1992 plane 1 */ static const unsigned short cns11643_1_2uni_page21[500] = { /* 0x21 */ 0x3000, 0xff0c, 0x3001, 0x3002, 0xff0e, 0x30fb, 0xff1b, 0xff1a, 0xff1f, 0xff01, 0xfe30, 0x2026, 0x2025, 0xfe50, 0xfe51, 0xfe52, 0x00b7, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xfe31, 0x2014, 0xfe32, 0x2013, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 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, 0xfe5b, 0xfe5c, 0xfe5d, 0xfe5e, 0x2018, 0x2019, 0x201c, 0x201d, 0x301d, 0x301e, 0x2032, 0x2035, 0xff03, 0xff06, 0xff0a, 0x203b, 0x00a7, 0x3003, 0x25cb, 0x25cf, 0x25b3, 0x25b2, 0x25ce, 0x2606, 0x2605, 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25bd, 0x25bc, /* 0x22 */ 0x32a3, 0x2105, 0x203e, 0xfffd, 0xff3f, 0xfffd, 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, 0xfe66, 0xfe65, 0x223c, 0x2229, 0x222a, 0x22a5, 0x2220, 0x221f, 0x22bf, 0x33d2, 0x33d1, 0x222b, 0x222e, 0x2235, 0x2234, 0x2640, 0x2642, 0x2641, 0x2609, 0x2191, 0x2193, 0x2192, 0x2190, 0x2196, 0x2197, 0x2199, 0x2198, 0x2016, 0xff5c, 0xff0f, 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, /* 0x23 */ 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, 0x256e, 0x2570, 0x256f, 0x2550, 0x255e, 0x256a, 0x2561, 0x25e2, 0x25e3, 0x25e5, 0x25e4, 0x2571, 0x2572, 0x2573, 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x24 */ 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, 0xfffd, 0x5344, 0xfffd, 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, 0xff57, 0xff58, 0xff59, 0xff5a, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, /* 0x25 */ 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, 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, /* 0x26 */ 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, }; static const unsigned short cns11643_1_2uni_page42[34] = { /* 0x42 */ 0x2400, 0x2401, 0x2402, 0x2403, 0x2404, 0x2405, 0x2406, 0x2407, 0x2408, 0x2409, 0x240a, 0x240b, 0x240c, 0x240d, 0x240e, 0x240f, 0x2410, 0x2411, 0x2412, 0x2413, 0x2414, 0x2415, 0x2416, 0x2417, 0x2418, 0x2419, 0x241a, 0x241b, 0x241c, 0x241d, 0x241e, 0x241f, 0x2421, 0x20ac, }; static const unsigned short cns11643_1_2uni_page44[5401] = { /* 0x44 */ 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, 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, /* 0x45 */ 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, 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, /* 0x46 */ 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, 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, /* 0x47 */ 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, 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, /* 0x48 */ 0x5e74, 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, /* 0x49 */ 0x4f63, 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, 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, /* 0x4a */ 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, 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, /* 0x4b */ 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, 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, /* 0x4c */ 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, 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, /* 0x4d */ 0x5c48, 0x5c45, 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, /* 0x4e */ 0x6615, 0x660a, 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, 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, /* 0x4f */ 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, 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, /* 0x50 */ 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, 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, /* 0x51 */ 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, 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, /* 0x52 */ 0x6d31, 0x6d1e, 0x6d17, 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, /* 0x53 */ 0x7f8e, 0x7fbf, 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, 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, /* 0x54 */ 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, 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, /* 0x55 */ 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, 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, /* 0x56 */ 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, 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, /* 0x57 */ 0x781d, 0x7834, 0x7837, 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, 0x8004, 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, /* 0x58 */ 0x8340, 0x8331, 0x8328, 0x8343, 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, 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, /* 0x59 */ 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, 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, /* 0x5a */ 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, 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, /* 0x5b */ 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, 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, /* 0x5c */ 0x7406, 0x73fe, 0x740d, 0x74e0, 0x74f6, 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, /* 0x5d */ 0x8389, 0x83a0, 0x8377, 0x837b, 0x837c, 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, 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, /* 0x5e */ 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, 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, /* 0x5f */ 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, 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, /* 0x60 */ 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, 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, /* 0x61 */ 0x7a0d, 0x7a08, 0x7a0b, 0x7a05, 0x7a00, 0x7a98, 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, /* 0x62 */ 0x8a3b, 0x8a60, 0x8a55, 0x8a5e, 0x8a3c, 0x8a41, 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, 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, /* 0x63 */ 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, 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, /* 0x64 */ 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, 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, /* 0x65 */ 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, 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, /* 0x66 */ 0x8171, 0x8170, 0x8178, 0x8165, 0x816e, 0x8173, 0x816b, 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, /* 0x67 */ 0x8de4, 0x8de6, 0x8eb2, 0x8f03, 0x8f09, 0x8efe, 0x8f0a, 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, 0x98fd, 0x98fe, 0x99b3, 0x99b1, 0x99b4, 0x9ae1, 0x9ce9, 0x9e82, 0x9f0e, 0x9f13, 0x9f20, 0x50e7, 0x50ee, 0x50e5, 0x50d6, 0x50ed, 0x50da, 0x50d5, 0x50cf, 0x50d1, 0x50f1, 0x50ce, 0x50e9, 0x5162, /* 0x68 */ 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, 0x613f, 0x614b, 0x6177, 0x6162, 0x6163, 0x615f, 0x615a, 0x6158, 0x6175, 0x622a, 0x6487, 0x6458, 0x6454, 0x64a4, 0x6478, 0x645f, 0x647a, 0x6451, 0x6467, 0x6434, 0x646d, 0x647b, 0x6572, 0x65a1, /* 0x69 */ 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, 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, /* 0x6a */ 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, 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, /* 0x6b */ 0x8aa6, 0x8a8c, 0x8a9e, 0x8aa3, 0x8a8d, 0x8aa1, 0x8a93, 0x8aa4, 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, 0x92ac, 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, /* 0x6c */ 0x5100, 0x50fb, 0x50f5, 0x50f9, 0x5102, 0x5108, 0x5109, 0x5105, 0x51dc, 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, 0x617c, 0x6170, 0x616b, 0x617e, 0x61a7, 0x6190, 0x61ab, 0x618e, 0x61ac, 0x619a, 0x61a4, 0x6194, 0x61ae, 0x622e, 0x6469, 0x646f, 0x6479, 0x649e, 0x64b2, 0x6488, 0x6490, 0x64b0, /* 0x6d */ 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, 0x747e, 0x7480, 0x757f, 0x7620, 0x7629, 0x761f, 0x7624, 0x7626, 0x7621, 0x7622, 0x769a, 0x76ba, 0x76e4, 0x778e, 0x7787, 0x778c, 0x7791, 0x778b, 0x78cb, 0x78c5, 0x78ba, 0x78ca, /* 0x6e */ 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, 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, /* 0x6f */ 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, 0x8f25, 0x9069, 0x906e, 0x9068, 0x906d, 0x9077, 0x9130, 0x912d, 0x9127, 0x9131, 0x9187, 0x9189, 0x918b, 0x9183, 0x92c5, 0x92bb, 0x92b7, 0x92ea, 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, /* 0x70 */ 0x9aee, 0x9aef, 0x9b27, 0x9b45, 0x9b44, 0x9b77, 0x9b6f, 0x9d06, 0x9d09, 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, /* 0x71 */ 0x6a35, 0x6a5f, 0x6a48, 0x6b59, 0x6b77, 0x6c05, 0x6fc2, 0x6fb1, 0x6fa1, 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, 0x7e11, 0x7e08, 0x7e1b, 0x7e23, 0x7e1e, 0x7e1d, 0x7e09, 0x7e10, 0x7f79, 0x7fb2, 0x7ff0, 0x7ff1, 0x7fee, 0x8028, 0x81b3, 0x81a9, 0x81a8, 0x81fb, 0x8208, 0x8258, 0x8259, 0x854a, /* 0x72 */ 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, 0x9310, 0x9326, 0x9321, 0x9315, 0x932e, 0x9319, 0x95bb, 0x96a7, 0x96a8, 0x96aa, 0x96d5, 0x970e, 0x9711, 0x9716, 0x970d, 0x9713, 0x970f, 0x975b, 0x975c, 0x9766, 0x9798, 0x9830, /* 0x73 */ 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, 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, /* 0x74 */ 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, 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, /* 0x75 */ 0x81c2, 0x81c0, 0x81bf, 0x81bd, 0x81c9, 0x81be, 0x81e8, 0x8209, 0x8271, 0x85aa, 0x8584, 0x857e, 0x859c, 0x8591, 0x8594, 0x85af, 0x859b, 0x8587, 0x85a8, 0x858a, 0x85a6, 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, /* 0x76 */ 0x96b1, 0x96b8, 0x96d6, 0x971c, 0x971e, 0x97a0, 0x97d3, 0x9846, 0x98b6, 0x9935, 0x9a01, 0x99ff, 0x9bae, 0x9bab, 0x9baa, 0x9bad, 0x9d3b, 0x9d3f, 0x9e8b, 0x9ecf, 0x9ede, 0x9edc, 0x9edd, 0x9edb, 0x9f3e, 0x9f4b, 0x53e2, 0x5695, 0x56ae, 0x58d9, 0x58d8, 0x5b38, 0x5f5e, 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, 0x7652, 0x77bd, 0x77bf, 0x77bb, 0x77bc, 0x790e, 0x79ae, 0x7a61, 0x7a62, 0x7a60, 0x7ac4, 0x7ac5, 0x7c2b, 0x7c27, 0x7c2a, 0x7c1e, 0x7c23, 0x7c21, 0x7ce7, 0x7e54, /* 0x77 */ 0x7e55, 0x7e5e, 0x7e5a, 0x7e61, 0x7e52, 0x7e59, 0x7f48, 0x7ff9, 0x7ffb, 0x8077, 0x8076, 0x81cd, 0x81cf, 0x820a, 0x85cf, 0x85a9, 0x85cd, 0x85d0, 0x85c9, 0x85b0, 0x85ba, 0x85b9, 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, 0x97ad, 0x97f9, 0x984d, 0x984f, 0x984c, 0x984e, 0x9853, 0x98ba, 0x993e, 0x993f, 0x993d, 0x992e, 0x99a5, 0x9a0e, 0x9ac1, 0x9b03, 0x9b06, 0x9b4f, 0x9b4e, 0x9b4d, 0x9bca, /* 0x78 */ 0x9bc9, 0x9bfd, 0x9bc8, 0x9bc0, 0x9d51, 0x9d5d, 0x9d60, 0x9ee0, 0x9f15, 0x9f2c, 0x5133, 0x56a5, 0x56a8, 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, 0x737a, 0x74bd, 0x74ca, 0x74e3, 0x7587, 0x7586, 0x765f, 0x7661, 0x77c7, 0x7919, 0x79b1, 0x7a6b, 0x7a69, 0x7c3e, 0x7c3f, 0x7c38, 0x7c3d, 0x7c37, 0x7c40, 0x7e6b, 0x7e6d, 0x7e79, 0x7e69, 0x7e6a, 0x7e73, 0x7f85, 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, /* 0x79 */ 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, 0x9858, 0x985b, 0x98bc, 0x9945, 0x9949, 0x9a16, 0x9a19, 0x9b0d, 0x9be8, 0x9be7, 0x9bd6, 0x9bdb, 0x9d89, 0x9d61, 0x9d72, 0x9d6a, 0x9d6c, 0x9e92, 0x9e97, 0x9e93, 0x9eb4, 0x52f8, 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, /* 0x7a */ 0x792b, 0x7ac7, 0x7af6, 0x7c4c, 0x7c43, 0x7c4d, 0x7cef, 0x7cf0, 0x8fae, 0x7e7d, 0x7e7c, 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, /* 0x7b */ 0x8617, 0x862d, 0x861a, 0x8823, 0x8822, 0x8821, 0x881f, 0x896a, 0x896c, 0x89bd, 0x8b74, 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, 0x79b3, 0x7c60, 0x7c5f, 0x807e, 0x807d, 0x81df, 0x8972, 0x896f, 0x89fc, 0x8b80, 0x8d16, 0x8d17, 0x8e91, 0x8e93, 0x8f61, 0x9148, 0x9444, 0x9451, 0x9452, 0x973d, /* 0x7c */ 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, 0x8b96, 0x8277, 0x8d1b, 0x91c0, 0x946a, 0x9742, 0x9748, 0x9744, 0x97c6, 0x9870, 0x9a5f, 0x9b22, 0x9b58, 0x9c5f, 0x9df9, 0x9dfa, 0x9e7c, 0x9e7d, 0x9f07, 0x9f77, /* 0x7d */ 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, }; static int cns11643_1_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x21 && c1 <= 0x27) || (c1 == 0x42) || (c1 >= 0x44 && c1 <= 0x7d)) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x21 && c2 < 0x7f) { unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); unsigned short wc = 0xfffd; if (i < 3102) { if (i < 500) wc = cns11643_1_2uni_page21[i]; else if (i == 571) wc = 0x4ea0; else if (i == 578) wc = 0x51ab; else if (i == 583) wc = 0x52f9; } else if (i < 3290) { if (i < 3136) wc = cns11643_1_2uni_page42[i-3102]; } else { if (i < 8691) wc = cns11643_1_2uni_page44[i-3290]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } freelan-2.0/third-party/source/libiconv-msvc/include/cns11643_15.h000066400000000000000000001754371252300335000246060ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CNS 11643-1992 plane 15 */ static const unsigned short cns11643_15_2uni_page21[7169] = { /* 0x21 */ 0x5302, 0x538c, 0x53d4, 0x54a5, 0x5392, 0x5393, 0x53d8, 0x53d9, 0x54a7, 0x592b, 0x592c, 0x592d, 0x5930, 0x592e, 0x59ab, 0x1a01, 0x5c2d, 0x5c6d, 0xfa34, 0x5d0f, 0x52fd, 0x5e9d, 0x64a2, 0x68d4, 0x6e56, 0x6ec3, 0x7314, 0x52fd, 0x9a1a, 0x530f, 0x5310, 0x539a, 0x539b, 0x52fd, 0x54ac, 0x0036, 0x5397, 0x5846, 0x0e4f, 0x5876, 0x5877, 0x58ae, 0x593a, 0x597d, 0x6ec5, 0x5ea8, 0x52fd, 0x1afa, 0x6541, 0x6542, 0x68d8, 0x68d9, 0x69aa, 0x69ab, 0x6c42, 0x6c41, 0x5099, 0x6ec6, 0x52fd, 0x7035, 0x7036, 0x7037, 0xfa83, 0xb64d, 0x52fd, 0x74b5, 0x7617, 0x7782, 0x86b6, 0x2d49, 0x8f72, 0x985c, 0x98a8, 0x45b7, 0x68e3, 0x0006, 0x52fd, 0x53e6, 0x5444, 0x5445, 0x1729, 0x003e, 0x54c4, 0x54c5, 0x54c6, 0x54c7, 0x54c8, 0x54c9, 0x54ca, 0x54d4, 0x587d, 0xb572, 0x58b2, 0x58b4, /* 0x22 */ 0x5982, 0x59c7, 0x59c8, 0x52fd, 0x5b3c, 0x5b3d, 0x5b3e, 0x5b3f, 0xfa24, 0x5bd3, 0x5447, 0x1a4e, 0x5d3d, 0x5de2, 0x5eb8, 0x5eb9, 0x5ec2, 0x5eba, 0x5ec6, 0x5ebb, 0x64ad, 0x654c, 0x654d, 0x52fd, 0x69b2, 0x69b3, 0x69b4, 0x69b5, 0x6cc3, 0x6cc4, 0x6cc5, 0x6cc6, 0x6cc7, 0x52fd, 0x6ece, 0x6f30, 0x7047, 0x7048, 0x2281, 0x735c, 0x52fd, 0x735f, 0x7618, 0x7619, 0x767e, 0x2410, 0x78b0, 0x7d75, 0x2568, 0x7d76, 0x8341, 0x8442, 0x52fd, 0x86bd, 0x2842, 0x2840, 0x18ea, 0x8e1e, 0x8e1f, 0x8f87, 0x2d62, 0x8f78, 0x9488, 0x9489, 0x948a, 0x9917, 0x9915, 0x52fd, 0x52fd, 0x3291, 0xa3e5, 0xa909, 0xaa3b, 0xaa4f, 0x52fd, 0xb92e, 0xb92f, 0xbdff, 0xbdfd, 0xbdfe, 0x45bb, 0x45bc, 0x52fd, 0x5323, 0x53ea, 0x542a, 0x5449, 0x544a, 0x544b, 0x54df, 0x54e0, 0x54e1, 0x54e2, 0x58c1, /* 0x23 */ 0x54e3, 0x54e4, 0x54e5, 0x58c0, 0x54e6, 0x54f7, 0x52fd, 0x54e7, 0x54e8, 0x54e9, 0x54ea, 0x54eb, 0x580e, 0x5880, 0x5881, 0x58ba, 0x58bb, 0x58bc, 0x58bd, 0x593f, 0x5940, 0x5988, 0xfa1f, 0x5b46, 0x52fd, 0x5b47, 0x5b48, 0x5c36, 0x5c72, 0x5c96, 0x5d47, 0x5de7, 0x5e34, 0x5e35, 0x5e36, 0x5e37, 0x5ee3, 0x5ee4, 0x5ee5, 0x5eeb, 0x0175, 0x5ee6, 0x5ee7, 0x5ee8, 0x52fd, 0x52fd, 0x64b9, 0x1de8, 0x64ba, 0x1e5b, 0x6563, 0x6564, 0x52fd, 0x6565, 0x52fd, 0x6566, 0x657c, 0x6567, 0xfa5a, 0x6859, 0x68e9, 0x68ea, 0x68eb, 0x68ec, 0x68ed, 0x68ee, 0x68ef, 0x69bf, 0x69cb, 0x69c3, 0x69d5, 0x69c4, 0x69c5, 0x69d3, 0x69c6, 0x69c7, 0x69c8, 0x69c9, 0x69ca, 0x6c4a, 0x52fd, 0x6cd1, 0x6e61, 0x6f37, 0x52fd, 0x7064, 0x7066, 0x2299, 0x7067, 0x7068, 0x7069, 0x2297, 0x7073, 0x706a, /* 0x24 */ 0x706b, 0x2862, 0x52fd, 0x7372, 0x043c, 0x74b9, 0x761c, 0x7636, 0x76bc, 0x76be, 0x76bf, 0x76c0, 0x7787, 0x78dc, 0x78dd, 0x78f5, 0x78de, 0x78df, 0xfa9e, 0x78e0, 0x78e1, 0x78e2, 0x7d2c, 0x7d2d, 0x25a4, 0x7da9, 0x7d9c, 0x7d9d, 0x7d9e, 0x7d9f, 0x7da0, 0x7da1, 0x7da2, 0x52fd, 0x7da3, 0x7da4, 0x7da7, 0x8342, 0x8393, 0x8451, 0x52fd, 0x8452, 0x8444, 0x8453, 0x8622, 0x86c6, 0x86c7, 0x86c9, 0xfadd, 0x86ca, 0x2866, 0x86c8, 0x8e24, 0x8e25, 0x8e26, 0x52fd, 0x8e27, 0x8e28, 0x52fd, 0x8f58, 0xfafb, 0x8fa7, 0x8f88, 0x8f89, 0x8fa5, 0x8fa8, 0x8fa9, 0x8faa, 0x8fab, 0x8fac, 0x8fad, 0x2da3, 0x8f79, 0x52fd, 0x9494, 0x9495, 0x9496, 0x09a5, 0x52fd, 0x9497, 0x307f, 0x9498, 0x984e, 0x984f, 0x9919, 0x52fd, 0x9a41, 0xfb2a, 0x9bf7, 0x9f04, 0x9f19, 0x9f17, 0xa340, 0xa3ec, /* 0x25 */ 0xa71b, 0xa71c, 0x36f6, 0xa90e, 0xaa52, 0xadd8, 0xb126, 0xb574, 0x52fd, 0xb575, 0xbcc6, 0xbe0b, 0xbe0c, 0xbe0d, 0xbe0e, 0xbe0f, 0xbe10, 0x45c8, 0xd759, 0xd75a, 0xd983, 0xd984, 0xd985, 0x52fd, 0x4af5, 0xe120, 0xe121, 0xe122, 0xe123, 0xe124, 0xe129, 0x53f4, 0x52fd, 0x688f, 0x5451, 0x17ab, 0x5517, 0x5518, 0x555b, 0x5519, 0x551a, 0x0053, 0x551b, 0x551c, 0x551d, 0x551e, 0x551f, 0x5520, 0x5521, 0x578b, 0x5788, 0x222d, 0x5885, 0xb587, 0x58c7, 0x594c, 0x594d, 0x59fc, 0x59fd, 0x59fe, 0x59ff, 0x52fd, 0x52fd, 0x5b56, 0x5b57, 0x5b58, 0x5b59, 0x5bdc, 0x5bdd, 0x5c73, 0x5c9d, 0x5ca1, 0x5c9e, 0x5c9f, 0x5ca0, 0x5ce6, 0x5d51, 0x5d52, 0x5e3d, 0x5f22, 0x1b9c, 0x5f23, 0x5f24, 0x5f25, 0x5f26, 0x5f27, 0x5f28, 0x5f29, 0x5f2a, 0x5f2b, 0x52fd, 0x5f40, 0x5f2c, 0x5f2d, /* 0x26 */ 0x5f2e, 0x5f2f, 0x5f30, 0x64d0, 0x65a8, 0x6594, 0x6595, 0x6596, 0x6597, 0x6598, 0x659c, 0x659b, 0x52fd, 0x65a1, 0x65a0, 0x6599, 0x659a, 0x65a7, 0x1e88, 0x6864, 0x52fd, 0x6900, 0x6901, 0x52fd, 0x52fd, 0x69e5, 0x69e9, 0x69fb, 0x69fc, 0x69ea, 0x69eb, 0x69ec, 0x69ed, 0x69ee, 0x69ef, 0x69fa, 0x69f0, 0x69f1, 0x69f2, 0x69f3, 0x69f4, 0x6c52, 0x6c53, 0x6c54, 0x6c55, 0x6c58, 0x6c56, 0x52fd, 0x6cdd, 0x6cde, 0x6ce3, 0x6cdf, 0x6ce0, 0x6e22, 0x6e23, 0x6e68, 0x6edf, 0x00ac, 0x6f44, 0x7094, 0x7095, 0x7096, 0x7097, 0x7098, 0x7099, 0xfa79, 0x709a, 0x709b, 0x709d, 0x709e, 0x709f, 0x70a0, 0x72f3, 0x72f2, 0x731f, 0x7388, 0x748f, 0x7490, 0x52fd, 0x74fd, 0x74fe, 0x74ff, 0x7500, 0x7501, 0x791a, 0x52fd, 0x78e3, 0x78e4, 0x78e5, 0x78e6, 0x78e7, 0x78eb, 0x78e8, 0x78e9, /* 0x27 */ 0x78ea, 0x791d, 0x7ca4, 0x7ca3, 0x7dd4, 0x7dc6, 0x7dc7, 0x7dc8, 0x7dc9, 0x7dca, 0x7dcb, 0x7dcc, 0x7dcd, 0x05de, 0x7dce, 0x25c3, 0x81b8, 0x81b9, 0x81ba, 0x836e, 0x83db, 0x83dc, 0x8468, 0x8469, 0x846a, 0x846b, 0x846c, 0x846d, 0x846e, 0x2719, 0x8624, 0x8625, 0x52fd, 0x8700, 0x86e5, 0x86f9, 0x86e7, 0x86e8, 0x86e9, 0x86fe, 0x86ea, 0x86eb, 0x86ec, 0x0749, 0x86ed, 0x28a1, 0x86ee, 0x28a6, 0x86ef, 0x52fd, 0x8717, 0x86f0, 0x86f1, 0x8b94, 0x8c5b, 0x8c5c, 0x8c5d, 0x8e2f, 0x0891, 0x8e30, 0x8e31, 0x8e32, 0x8e33, 0x8fcc, 0x8fcd, 0x8fce, 0x8fae, 0x8faf, 0x8fb0, 0x08d3, 0x8fcf, 0x8fd0, 0x8fd1, 0x8fd2, 0x8fd3, 0x52fd, 0x8fd4, 0x09a9, 0x94a6, 0x94a7, 0x94a8, 0x94b0, 0x94a9, 0x94aa, 0x94ab, 0x94ac, 0x94ad, 0x97fb, 0x97fc, 0x52fd, 0x992d, 0x992e, 0x9950, 0x992f, /* 0x28 */ 0x9930, 0x9a65, 0x9be6, 0x9c0c, 0x9c02, 0x9c03, 0x9c04, 0x9c05, 0x9c06, 0x52fd, 0x9ec0, 0x9f24, 0x9f25, 0xa016, 0xa032, 0xa720, 0xa721, 0xa722, 0xa723, 0x36fe, 0xa725, 0xa919, 0xa924, 0xa91a, 0xa91b, 0xa91c, 0xa91d, 0xfb52, 0xa91e, 0xaa5a, 0xaa5b, 0xaa5c, 0xaa5d, 0xaa5e, 0xac31, 0x52fd, 0xb129, 0x52fd, 0xb288, 0xb289, 0xb589, 0x3d57, 0xb656, 0xb7d1, 0xb7e6, 0xb832, 0xb833, 0xb952, 0xb953, 0x0ed5, 0xb954, 0xb955, 0x52fd, 0x52fd, 0xbe29, 0xbe2a, 0xbe2b, 0xbe2c, 0xbe2d, 0xfb92, 0xbe2e, 0xbe2f, 0xbe30, 0xbe31, 0xbe32, 0xbe33, 0x3ec5, 0xbe34, 0xc49b, 0xc523, 0xc524, 0x52fd, 0xc525, 0xc527, 0xc916, 0xcfa0, 0xd76f, 0x45df, 0xd770, 0xd771, 0x45dc, 0x138c, 0xd772, 0xd773, 0xd774, 0xd99c, 0xd9aa, 0xd99d, 0xd99e, 0x0c99, 0xd9ab, 0xd99f, 0xe135, 0xe138, /* 0x29 */ 0xf68d, 0x5335, 0x5336, 0xadee, 0x53b4, 0xf9c9, 0x5432, 0x5455, 0x5544, 0x5545, 0x5546, 0x5547, 0x17e4, 0x5548, 0x5549, 0x52fd, 0x554a, 0x554b, 0x554c, 0x554d, 0x554e, 0x554f, 0x5550, 0x5551, 0xb599, 0x58d1, 0x52fd, 0x58d2, 0x58d3, 0x58d4, 0x58d5, 0x5a21, 0x5a22, 0x5a23, 0x5b68, 0x5b69, 0x5b6a, 0x5be2, 0x5c45, 0x5cec, 0x5ced, 0x5cee, 0x5cef, 0x52fd, 0x5d62, 0x5d63, 0x5df4, 0x536f, 0x5e44, 0x5e45, 0x5f79, 0x1c1b, 0x5f7a, 0x5f7b, 0x5f7c, 0x5f7d, 0x5f7e, 0x5f7f, 0x5f80, 0x0188, 0x52fd, 0x5f81, 0x5f82, 0x5f83, 0x5f84, 0x5f85, 0x5f86, 0x5f87, 0x5f8f, 0x5f88, 0x5f89, 0x65c5, 0x65c6, 0x1eaa, 0x65c7, 0x65c8, 0x65c9, 0x65ca, 0x65cb, 0x65cc, 0x1eab, 0x65cd, 0x65ce, 0x65e3, 0x65cf, 0x65d0, 0x65d1, 0x65d2, 0x65d3, 0x65c4, 0x65d4, 0x65d5, 0x65d6, 0x6820, /* 0x2a */ 0x6821, 0x691a, 0x6912, 0x6914, 0x6915, 0x6916, 0x6919, 0x6917, 0x6918, 0x02c9, 0xfa61, 0x52fd, 0x6a12, 0x6a13, 0x6a14, 0x6a15, 0x6a16, 0x6a17, 0x6a18, 0x6a19, 0x6c61, 0x6c62, 0x6c63, 0x6cf5, 0x21a9, 0x6cf6, 0x6cf7, 0x6cf8, 0x6e29, 0x0517, 0x6f5d, 0x6f57, 0x6f58, 0x6f59, 0x6f5a, 0x6f5b, 0x70bb, 0x70d1, 0x70bc, 0x70bd, 0xbbdf, 0x70d0, 0x70be, 0x70bf, 0x70c0, 0x70c1, 0x70c2, 0x70c3, 0x70c4, 0xbe6c, 0x73a1, 0x73a2, 0x73a3, 0x7493, 0x750d, 0x750f, 0x750e, 0x7510, 0x7511, 0x7512, 0xfa95, 0x77e5, 0x792f, 0x52fd, 0x7957, 0x7930, 0x7968, 0x792b, 0x7931, 0x7958, 0xfaa2, 0x7932, 0x7959, 0x52fd, 0x795a, 0x7933, 0x795b, 0x795c, 0x795d, 0x791e, 0x7cae, 0x7caf, 0x7d3b, 0x7d3c, 0x7d3d, 0x7e07, 0x7e08, 0x7e09, 0x7e0a, 0x7e0b, 0x7e0c, 0x7e0d, 0x7e0e, 0x7e0f, /* 0x2b */ 0x7e10, 0x7e22, 0x7e11, 0x7e12, 0x7e13, 0x7e14, 0x7e15, 0x7e16, 0x7e17, 0x7e18, 0xfab8, 0x52fd, 0x8346, 0x8347, 0x8348, 0x83e1, 0x8481, 0x8483, 0x5f75, 0x52fd, 0x8485, 0x8486, 0x862a, 0xfad1, 0x862b, 0x866b, 0x8718, 0x8719, 0x871a, 0x52fd, 0x871b, 0x871c, 0x871d, 0x871e, 0x871f, 0x8720, 0x8721, 0x8722, 0x8723, 0x2911, 0x8724, 0x8725, 0x8726, 0x8727, 0x8728, 0x8729, 0x872a, 0x8cef, 0x8e49, 0x8e4a, 0x8e4b, 0x8e4c, 0x8e4d, 0x8e4e, 0x8e4f, 0x8e50, 0x8e51, 0x8e52, 0x8e53, 0x8e54, 0x8e5a, 0x8e55, 0x8f5f, 0x9002, 0x9003, 0x9004, 0x9005, 0x8fd5, 0x9006, 0x9007, 0x8fd6, 0x9008, 0x9009, 0x900a, 0x900b, 0x8fd7, 0x900c, 0x900d, 0x94c8, 0x94c9, 0x94ca, 0x94cb, 0x94cc, 0x94cd, 0x94ce, 0x94cf, 0x94d0, 0x94d1, 0x94d2, 0x3451, 0x94d3, 0x94d4, 0x94d5, 0x94d6, /* 0x2c */ 0x94d7, 0x94e2, 0x94d8, 0x9804, 0x9805, 0x9806, 0x52fd, 0x9943, 0x9944, 0x9a84, 0x9a8f, 0x9a85, 0x9a86, 0x9c2f, 0x9c1a, 0x9c1b, 0x9c1c, 0x0abd, 0x9c1d, 0x9c1e, 0x9c1f, 0x9c20, 0x9c21, 0x9c22, 0xfb2c, 0x9c23, 0x9c24, 0x9c0e, 0x9c25, 0x9c2b, 0x9c2c, 0x9c0b, 0x9dee, 0x52fd, 0x9ec3, 0x9ed8, 0x9ed9, 0x9f38, 0x9f39, 0x9f3a, 0x9f3b, 0x3453, 0x9f3c, 0x9f3d, 0x9f3e, 0x9f3f, 0x9f40, 0xa048, 0xa04c, 0xa228, 0xa251, 0xa252, 0xa34c, 0xa423, 0xfb45, 0xa424, 0xa731, 0xa732, 0xa733, 0x3718, 0xa734, 0xa735, 0xa736, 0xa740, 0xa737, 0x52fd, 0xa738, 0xa73d, 0xa938, 0xa939, 0xa93a, 0xa93b, 0xa93c, 0xa94c, 0xaa73, 0xaa74, 0x0d33, 0xaa75, 0xaa76, 0xaa79, 0xac41, 0xac42, 0xac43, 0xad5b, 0x52fd, 0x39d7, 0x8ba6, 0xad5c, 0xade5, 0xade6, 0xade7, 0xade8, 0xaded, 0xb130, /* 0x2d */ 0x3b7e, 0xb131, 0xb294, 0xb651, 0xb6fd, 0xb6fe, 0xb7e9, 0x52fd, 0xb9b3, 0xb984, 0xb994, 0x52fd, 0xb99c, 0x52fd, 0xb985, 0xbc00, 0xbc37, 0xbc57, 0xbe54, 0xbe68, 0xbe55, 0xbe5c, 0xbe56, 0xbe57, 0xbe58, 0xbe59, 0xbe5a, 0xbe5b, 0xc534, 0x407e, 0xc535, 0x52fd, 0xc539, 0xc536, 0xc537, 0xc538, 0xc8e5, 0xc959, 0x52fd, 0xc93a, 0xc93b, 0xd028, 0xd189, 0x52fd, 0xd18a, 0xd18b, 0xd18c, 0xd18d, 0xd2bc, 0xd5a3, 0x1344, 0xd5a4, 0xd793, 0xd794, 0xd795, 0xd796, 0xd797, 0xd9b9, 0xe14f, 0xe150, 0xe151, 0xe376, 0x52fd, 0x53fb, 0x5383, 0x5438, 0x545d, 0x5571, 0x52fd, 0x5577, 0x5578, 0xfa07, 0x55c3, 0x5579, 0x557a, 0x557b, 0x557c, 0x5572, 0x557d, 0x55a0, 0x557e, 0x557f, 0x5580, 0x5581, 0x5582, 0x5583, 0x559e, 0x5584, 0x5585, 0x5586, 0x5587, 0x5588, 0x5793, 0x5794, /* 0x2e */ 0x5795, 0x57ef, 0x57f0, 0x52fd, 0x588d, 0x588f, 0x5890, 0x5891, 0x5892, 0x58de, 0x58e1, 0x5953, 0x1966, 0x5a4a, 0x5a4b, 0x5a4c, 0x5a51, 0x5a4d, 0x5a48, 0x5b74, 0x5b75, 0x5c20, 0x5c21, 0x5ca5, 0x5ca6, 0x5d73, 0x5d74, 0x5e50, 0x5e51, 0x5e52, 0x5e53, 0x5fdb, 0x5fdc, 0x1c20, 0x5fdd, 0x5fde, 0x5fff, 0x52fd, 0x52fd, 0x5fdf, 0x5fe0, 0x1c21, 0x5fe1, 0x5fe2, 0x5fe3, 0x5fe4, 0x5fe5, 0x5fe6, 0x5fe7, 0x5fe8, 0x5fe9, 0x5fea, 0x6607, 0x6608, 0x6609, 0x660a, 0x660b, 0x660c, 0x660d, 0x1ed7, 0x661a, 0x660e, 0x660f, 0x6610, 0x661c, 0x6827, 0x6866, 0x6898, 0x6899, 0x6933, 0x6924, 0x6925, 0x6926, 0x52fd, 0x02e1, 0x6a3e, 0xfa64, 0x6a3f, 0x6a57, 0x6a40, 0x6a41, 0x6a58, 0x6a42, 0x6a43, 0x6a44, 0x6a45, 0x6a46, 0x02e2, 0x6a47, 0x6c6b, 0x6c6c, 0x6d10, 0x6d11, 0x21be, /* 0x2f */ 0x6e75, 0x6eef, 0x6f6a, 0x6f6b, 0x52fd, 0x6f6c, 0x6f6d, 0x6f6e, 0x70ef, 0x70f0, 0x70f1, 0x70f2, 0x70f3, 0x70f4, 0x70f5, 0x70ff, 0x70f6, 0x7102, 0x70f7, 0x7322, 0x73c4, 0x73c3, 0x7528, 0x047c, 0x7620, 0x7625, 0x7622, 0x7623, 0x76eb, 0x04e3, 0x77f9, 0x77fa, 0x7999, 0x799a, 0x799b, 0x7963, 0x52fd, 0x795e, 0x795f, 0x7960, 0x799c, 0x7961, 0x799d, 0x7e54, 0x7e55, 0x7e56, 0x7e57, 0x7e58, 0x7e59, 0x7e5a, 0x7e19, 0x7e6a, 0x7e5b, 0x7e5c, 0x7e5d, 0x7e66, 0x52fd, 0x7e5e, 0x7e5f, 0x7e1a, 0x7e60, 0x7e61, 0x52fd, 0x7e62, 0x7e1b, 0x7e63, 0xb710, 0xb711, 0x834c, 0x839b, 0x83eb, 0x83ec, 0x83ed, 0x83ee, 0x84a3, 0x84a8, 0x84a6, 0x06ec, 0x862f, 0x8630, 0x8631, 0x8632, 0x8633, 0x874f, 0x8751, 0x8752, 0x877d, 0x8753, 0x8754, 0x8755, 0x8756, 0x8757, 0x8758, 0x8759, /* 0x30 */ 0x875a, 0x875b, 0x875c, 0x2957, 0x875d, 0x875e, 0x875f, 0x876f, 0x8760, 0x8761, 0x8762, 0x8763, 0x8772, 0x8764, 0x52fd, 0x876e, 0x8bb5, 0x8e65, 0x8e66, 0x8e67, 0x8e68, 0x8e69, 0x8e6a, 0x8e6b, 0x8e6c, 0x900e, 0x9043, 0x52fd, 0x900f, 0x9044, 0x9045, 0x9046, 0x9047, 0x9048, 0x9049, 0x9010, 0x904a, 0x904b, 0x904c, 0x904d, 0x08df, 0x904e, 0x904f, 0x9050, 0x9051, 0x9052, 0x9053, 0x9054, 0x9055, 0x9056, 0x9057, 0x9058, 0x9059, 0x905a, 0x901d, 0x905b, 0x905c, 0x905d, 0xfb06, 0x52fd, 0x94fe, 0x94ff, 0x9500, 0x9501, 0x9502, 0x9503, 0x9504, 0x9505, 0x9506, 0x9507, 0x9518, 0x9508, 0x9509, 0x94f3, 0x950a, 0x950b, 0x951b, 0x950c, 0x950d, 0x950e, 0x950f, 0x9510, 0x980f, 0x9861, 0x9879, 0x9ac1, 0x9aac, 0x9aad, 0x9c43, 0x9c44, 0x9c45, 0x9c46, 0x9c47, 0x9c48, /* 0x31 */ 0x9c49, 0x9c64, 0x9c4a, 0x9c4b, 0x9c4c, 0x9c4d, 0x0ac7, 0xfb2d, 0x9e39, 0x9f57, 0x9f58, 0x9f59, 0x9f5f, 0x9f5a, 0xa06a, 0xa22b, 0xa25d, 0xa25e, 0xa25f, 0x52fd, 0xa260, 0xa261, 0xa358, 0xa359, 0xa44a, 0xa44b, 0xa44c, 0xa44d, 0xa44e, 0xa757, 0xa6b3, 0xa6b4, 0xa76e, 0xa75b, 0xa75c, 0x52fd, 0xa75d, 0xa75e, 0x52fd, 0xa76c, 0xa93d, 0xa954, 0xa93e, 0xa955, 0xa956, 0xa93f, 0xa957, 0xa958, 0xa959, 0xa95a, 0xa95b, 0xa95c, 0xaa88, 0xaa89, 0x52fd, 0xac58, 0xac59, 0xac5a, 0x52fd, 0xad67, 0xad68, 0xad69, 0xad6a, 0x52fd, 0xad6b, 0xad6c, 0xadfe, 0xadff, 0xae00, 0xae01, 0xae02, 0xae03, 0xae04, 0xae05, 0xb139, 0xb13a, 0xb13b, 0xb13c, 0x52fd, 0x52fd, 0xb2b2, 0xb2b3, 0xb2b4, 0xb2b5, 0xb2b6, 0xb2b7, 0xb2b8, 0x3d3c, 0xb5a2, 0xb661, 0xb662, 0xb714, 0x52fd, 0xb7eb, /* 0x32 */ 0xb842, 0xb848, 0x52fd, 0xb843, 0xb84e, 0xb844, 0xb845, 0xb9b4, 0xb9b5, 0x52fd, 0x52fd, 0x52fd, 0xb9b6, 0x52fd, 0xbbe1, 0xbc05, 0x52fd, 0x3e73, 0xbe9a, 0x52fd, 0xbe9b, 0xbe9c, 0xbe9d, 0xbe9e, 0xbe9f, 0xfb9a, 0xbea0, 0xbea1, 0xbea2, 0xbeb5, 0xbea3, 0xbea4, 0x52fd, 0xbea5, 0xbea6, 0xbea7, 0xbea8, 0xbeaf, 0xbea9, 0xbeaa, 0xbeab, 0xbeac, 0xbead, 0xbeb3, 0x52fd, 0xc4a0, 0xc556, 0xc934, 0x1127, 0xc93c, 0xcb0c, 0x52fd, 0xcf3e, 0xcfa3, 0xd030, 0xd031, 0xd197, 0xd198, 0xd199, 0xd19a, 0xd19b, 0xd5b2, 0xd5ab, 0xd5ac, 0xd9fc, 0xd9e8, 0xd9e9, 0xd9ea, 0xdaf1, 0xdc3f, 0xdfce, 0xe16d, 0xe16e, 0xe16f, 0xe170, 0xe171, 0xe172, 0xe173, 0x4bbe, 0xe378, 0xeb3a, 0x5467, 0x27fa, 0x5464, 0x5465, 0x5607, 0x55c4, 0x55c5, 0x55c6, 0x55c7, 0x55c8, 0x55c9, 0x55e5, 0x55ca, /* 0x33 */ 0x55cb, 0x52fd, 0x55cc, 0x55cd, 0x55ce, 0x55cf, 0x55d0, 0x5797, 0x579a, 0x579b, 0x58ea, 0x58ec, 0x58ed, 0x58f7, 0x58ee, 0x58ef, 0x595b, 0x595c, 0x595d, 0x5a6d, 0x5a6e, 0x52fd, 0x5a6f, 0x5b81, 0x5b82, 0x5c4f, 0x5cad, 0xda0a, 0x5d7e, 0x5e69, 0x6054, 0x6055, 0x6056, 0x6057, 0x01ab, 0x6058, 0x6059, 0x605a, 0x605b, 0x605c, 0x605d, 0x52fd, 0x52fd, 0x605e, 0x605f, 0x663b, 0x6636, 0x663c, 0x663d, 0x663e, 0x663f, 0x6640, 0x6641, 0x6642, 0x024b, 0x6643, 0x6644, 0x6645, 0x6637, 0x52fd, 0x52fd, 0x6646, 0x6647, 0x6648, 0x6649, 0x682d, 0x68a5, 0x693d, 0x693f, 0x6c6e, 0x6ae7, 0x6a75, 0x6a76, 0x6a77, 0x6a78, 0x6a79, 0x6a7a, 0x6a7b, 0x6a7c, 0x6a8e, 0x6a7d, 0x6a7e, 0x2072, 0x6a7f, 0x6a80, 0x6a81, 0x6a82, 0x6a83, 0x6a84, 0x6a85, 0x6a86, 0x6a87, 0x6a88, 0x6a89, /* 0x34 */ 0x6a8a, 0x6a8b, 0x6a8c, 0x6c6f, 0x6c70, 0x6c71, 0x6c72, 0x6d2a, 0x6d2b, 0x6d2c, 0x6d2d, 0x6d2e, 0x6d2f, 0x6d30, 0x6d31, 0x6e83, 0x6f84, 0x6f85, 0x6f93, 0x52fd, 0x6f86, 0x6f87, 0x6f88, 0x6f89, 0x6f8a, 0x6f8b, 0x7136, 0x7138, 0x7139, 0x713a, 0x03e2, 0x713b, 0x713c, 0x713d, 0x713e, 0x713f, 0x52fd, 0x7140, 0x7141, 0x7142, 0x73de, 0x73df, 0x73e0, 0x73e1, 0x754a, 0x754b, 0x754c, 0x754d, 0x754e, 0x754f, 0x7550, 0x7627, 0x76f9, 0x76fa, 0x76fb, 0x7798, 0x7799, 0x779a, 0x52fd, 0x781e, 0x799e, 0x79f7, 0x799f, 0x79a0, 0x79f0, 0x79f8, 0x79f9, 0x79a1, 0x79a2, 0x79a3, 0x79a4, 0x79a5, 0x79fa, 0x79fb, 0x79fc, 0x79fd, 0x79fe, 0x7a1f, 0x79ff, 0x7a00, 0x7a8c, 0x7a01, 0x7cc2, 0x7cc3, 0x52fd, 0x7cd3, 0x7d4e, 0x7eaf, 0x7eb0, 0x7eb1, 0x7eb2, 0x7eb3, 0x7ec6, 0x7eb4, /* 0x35 */ 0x52fd, 0x7eb5, 0x7eb6, 0x7eb7, 0x7eb8, 0x7eb9, 0x7eba, 0x7ebb, 0x7ebc, 0x7ebd, 0x7ebe, 0x7ebf, 0x7ec1, 0x7ec0, 0x7ec2, 0x7ec3, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x835a, 0x8350, 0x8351, 0x8378, 0x83f8, 0x83f9, 0x84c6, 0x84cb, 0x84cc, 0x84cd, 0x84ce, 0x84cf, 0x84d0, 0x84d1, 0x84d2, 0x84d3, 0x84d4, 0x84d5, 0x52fd, 0x8637, 0x8638, 0x8673, 0x8790, 0x8791, 0x87bf, 0x8792, 0x8793, 0x8794, 0x8795, 0x8796, 0x8797, 0x8798, 0x8799, 0x29bd, 0x879a, 0x879b, 0x879c, 0x879d, 0x879e, 0x879f, 0x87a0, 0x87a1, 0x87a2, 0x87a3, 0x87a4, 0x87a5, 0x52fd, 0x87a6, 0x87a7, 0x8bbf, 0x8bc0, 0x8bc1, 0x8bc2, 0x8bc3, 0x8bc4, 0x8bc5, 0x8bc6, 0x8c75, 0x8d43, 0x8d12, 0x8d9f, 0x8d91, 0xfaf6, 0x8d92, 0x8d93, 0x8d94, 0x8e7e, 0x8e7f, 0x8e80, 0x8e81, 0x8e82, 0x8f4c, 0x8f63, /* 0x36 */ 0x90c0, 0x90c1, 0x90c2, 0x953a, 0x90c3, 0x90c4, 0x90c5, 0x90c6, 0x2e15, 0x90c7, 0x52fd, 0x90c8, 0x9073, 0x90c9, 0x90ca, 0x90cb, 0x90cc, 0x90cd, 0x090e, 0x52fd, 0x52fd, 0x90ce, 0x90cf, 0x90d0, 0x90d1, 0x90d2, 0x90d3, 0x90d4, 0x90d5, 0x953b, 0x953c, 0x953d, 0x953e, 0x52fd, 0x953f, 0x9540, 0x9541, 0x9542, 0x9543, 0x09c1, 0x9544, 0x9545, 0x9559, 0x9546, 0x9547, 0x9548, 0x52fd, 0x9549, 0x9813, 0x9882, 0x9883, 0x9966, 0x9967, 0x9c65, 0x3313, 0x9c66, 0x0ad9, 0x9c75, 0x9c74, 0x9c67, 0x9c6d, 0x9c76, 0x9c68, 0x9c69, 0x9c6a, 0x9c6b, 0x9c4f, 0x9c6c, 0x9df8, 0x9e45, 0x33f8, 0x9e46, 0x9ee4, 0x9f85, 0x9f6f, 0x9f70, 0xa082, 0xa083, 0xa084, 0xa08b, 0xa22d, 0xa268, 0xa269, 0xa277, 0xa264, 0xa26a, 0x52fd, 0xa2f2, 0xa2e2, 0xa363, 0xa364, 0xa365, 0xa366, 0x3a3d, /* 0x37 */ 0xa367, 0xa368, 0x35d8, 0x52fd, 0xa472, 0xa47d, 0xa669, 0xa784, 0xa786, 0xa787, 0xa788, 0xa79e, 0x52fd, 0xa789, 0xa78a, 0xa796, 0xa78b, 0xa78c, 0xa78d, 0xa979, 0xa983, 0xa97a, 0xa95d, 0xa97b, 0x52fd, 0xaa9f, 0x0d48, 0xaaa0, 0xaaa1, 0xaaa2, 0x38fc, 0xac6a, 0xac6b, 0xac6c, 0xac6d, 0xac6e, 0xad78, 0x52fd, 0xad79, 0xad7c, 0xae21, 0xae22, 0xae23, 0xae24, 0x3a39, 0xae25, 0xae26, 0xb151, 0xb152, 0xb156, 0x52fd, 0x3c4b, 0xb2e1, 0x52fd, 0x52fd, 0xb2d6, 0xb2d7, 0xb2d8, 0xb2d9, 0xb5b5, 0xb66c, 0xb66f, 0xb670, 0xb7bc, 0xb7bd, 0xb7ed, 0xb85b, 0xb85c, 0xb85d, 0xb85e, 0xb986, 0xb987, 0xb9ed, 0x52fd, 0xb9ee, 0x52fd, 0xbc0e, 0xbc0f, 0x52fd, 0xbd2d, 0xbd2a, 0xbd2e, 0xbdcc, 0xbef9, 0xbefa, 0xbefb, 0xbefc, 0x3fb9, 0xbefd, 0xbf1b, 0xbefe, 0xbeff, 0xbf00, 0xbf01, /* 0x38 */ 0xbf02, 0xbf03, 0xbf21, 0xbf04, 0xbf05, 0xbf06, 0xbf07, 0xbf08, 0xbf09, 0xbf0a, 0xbf0b, 0xbf0c, 0xbf0d, 0xbf0e, 0xbf0f, 0xbf10, 0xbf11, 0xbf12, 0xbf13, 0xbf14, 0xbf15, 0xc57b, 0xc57c, 0xc57d, 0xc57e, 0x40cf, 0xc57f, 0xc580, 0xc566, 0xc581, 0xc582, 0xc583, 0xc8b2, 0x52fd, 0xc97f, 0xc972, 0xc95a, 0xcaeb, 0xcb15, 0x52fd, 0xcb16, 0xfbca, 0xcb17, 0x52fd, 0xcbc5, 0xcbc6, 0xcbc7, 0xcc88, 0xcc89, 0x52fd, 0xcc8a, 0xcc8b, 0xcc8c, 0xcc8d, 0xcedf, 0x52fd, 0xd03b, 0xd03c, 0xd03d, 0xd03e, 0xd03f, 0xd040, 0xd041, 0xd042, 0xd15c, 0xd1af, 0xd1a9, 0xd1aa, 0xd1ab, 0xd1ac, 0xd1b5, 0xd1ad, 0xd1ae, 0xd2e2, 0xd524, 0x44ae, 0xd5c4, 0x52fd, 0xd7ea, 0xd7d3, 0xd7d4, 0xd7d5, 0xd986, 0x52fd, 0xd987, 0xd9fd, 0xdb05, 0xdc49, 0xdf5f, 0xdfd3, 0xdfd5, 0xe18a, 0xe18b, 0xe18c, /* 0x39 */ 0xe18d, 0xe18e, 0xe18f, 0xe190, 0xe191, 0xe192, 0xe193, 0xe37d, 0xe37e, 0x4beb, 0x52fd, 0x52fd, 0xe4ec, 0xe55b, 0xef87, 0xef86, 0x52fd, 0x5346, 0x5347, 0x5402, 0x546d, 0x546e, 0x546f, 0x560d, 0x560e, 0x560f, 0x5610, 0x5611, 0x5612, 0x5613, 0x5614, 0x579f, 0x57a0, 0x57a1, 0x57a3, 0x5821, 0x5822, 0x867c, 0x5895, 0x5896, 0x5961, 0x5967, 0x5a91, 0x5a92, 0x5a93, 0x5a94, 0x5b8a, 0x5b8b, 0x5bf7, 0x5c24, 0x5cb0, 0x5cb1, 0x5d8e, 0x5e04, 0x5e6a, 0x5e6b, 0x5e6c, 0x5e6d, 0x60e8, 0x610c, 0x60e9, 0x60ea, 0x610d, 0x52fd, 0x60eb, 0x60ec, 0x60ed, 0x60ee, 0x60ef, 0x60f0, 0x60f1, 0x60f2, 0x6116, 0x60f3, 0x6104, 0x611d, 0x60f4, 0x60f5, 0x60f6, 0x60f7, 0x1cb0, 0x6502, 0x6503, 0x6504, 0x669a, 0x667c, 0x66c5, 0x667d, 0x667e, 0x667f, 0x6680, 0x6681, 0x1f40, 0x1f42, /* 0x3a */ 0x6682, 0x6683, 0x6684, 0x6685, 0x6686, 0x6687, 0x68ae, 0x694d, 0x6ab0, 0x6adc, 0x6ab6, 0x6ab7, 0x6ab8, 0x6ab9, 0x6aba, 0x6abb, 0x6adb, 0x6abc, 0x6abd, 0x6abe, 0x52fd, 0x6abf, 0x6ac0, 0x6ac1, 0x6ac2, 0x6ac3, 0x6ace, 0x0301, 0x6ad9, 0x6ac4, 0x6ac5, 0x6ada, 0x6ac6, 0x6ac7, 0x6ac8, 0x6ac9, 0x6aca, 0x6c7e, 0x6c7b, 0x6d4e, 0x6d4f, 0x6d50, 0x6d51, 0x6d52, 0x6d53, 0x6d54, 0x6d55, 0x6e8f, 0x6efc, 0x6fa6, 0x6fa7, 0x6fa8, 0x7023, 0x718b, 0x52fd, 0x718c, 0x718d, 0x718e, 0x718f, 0x71a4, 0x5899, 0x7324, 0x7346, 0x7347, 0x7348, 0x73fd, 0x73fe, 0x52fd, 0x756e, 0x757c, 0x756f, 0x7570, 0x7571, 0x7572, 0x7629, 0x762a, 0x765f, 0x77a2, 0x7830, 0x782b, 0x7a61, 0x7a02, 0x7a03, 0x7a04, 0x7a05, 0x7a06, 0x7a07, 0x52fd, 0x7a08, 0x7a09, 0x7a62, 0x7a0a, 0x7a0b, 0x7a0c, /* 0x3b */ 0x7a0d, 0x7a0e, 0x7a63, 0x7a27, 0x7a0f, 0x52fd, 0x7a1b, 0x7a64, 0x7a10, 0x7a11, 0x7a81, 0x7a12, 0x7a65, 0x7a13, 0x7cce, 0x7f29, 0x7ec4, 0x7f2a, 0x52fd, 0x7f2b, 0x7f2c, 0x7f2d, 0x7f2e, 0x7f2f, 0x7f30, 0x7f31, 0x7f32, 0x7f33, 0x7f34, 0x52fd, 0x7f35, 0x7f36, 0x7ee3, 0x7f37, 0x7f38, 0x7f39, 0x7f3a, 0x7f3b, 0x7f4d, 0x7f3c, 0x7f3d, 0x7f3e, 0x52fd, 0x81d0, 0x81d1, 0x8355, 0x8402, 0x8404, 0x84fc, 0x8507, 0x84fd, 0x84fe, 0x52fd, 0x84ff, 0x8500, 0x8508, 0x8501, 0x8502, 0x8535, 0x8503, 0x8504, 0x52fd, 0x863b, 0x8689, 0x8681, 0x8682, 0xba33, 0x87eb, 0x87ec, 0x52fd, 0x87ed, 0x87ee, 0x87ef, 0x52fd, 0x87f0, 0x87f1, 0x87f2, 0x2a2b, 0x87f3, 0x2a16, 0x87f4, 0x87f5, 0x534b, 0x87f6, 0x87f7, 0x87f8, 0x87f9, 0x87fa, 0x87fb, 0x87fc, 0x87fd, 0x87fe, 0x87ff, 0x8800, /* 0x3c */ 0x2a1b, 0x8801, 0x8802, 0x8803, 0x8804, 0x8805, 0x8806, 0x8807, 0x2a27, 0x8808, 0x8809, 0x880a, 0x880b, 0x880c, 0x880d, 0x8bd7, 0x8bd8, 0x8d29, 0x8d9c, 0x8df8, 0x8e98, 0x8ea4, 0x8e99, 0x8e9a, 0x8e9b, 0x8e97, 0x8e9c, 0x2cf5, 0x8e9d, 0x52fd, 0x8e9e, 0x8e9f, 0x8f65, 0x90d6, 0x0920, 0x9132, 0x9133, 0x9134, 0x2e82, 0x9135, 0x9136, 0x9137, 0x90d7, 0x52fd, 0x90d8, 0x9138, 0x9139, 0x913a, 0x913b, 0x913c, 0x913d, 0x913e, 0x913f, 0x9140, 0x90d9, 0x9141, 0x9142, 0x0921, 0x9143, 0x9144, 0x2e7a, 0x957c, 0x957d, 0x957e, 0x957f, 0x9580, 0x9581, 0x9582, 0x52fd, 0x9583, 0x9584, 0x9585, 0x9586, 0x95a5, 0x9587, 0x9588, 0x9589, 0x958a, 0x958b, 0x958c, 0x958d, 0x958e, 0x52fd, 0x52fd, 0x958f, 0x52fd, 0x9590, 0x9591, 0x9592, 0x9593, 0x9594, 0x9595, 0x52fd, 0x3129, /* 0x3d */ 0x9596, 0x9856, 0x9857, 0x98e1, 0x990e, 0x990f, 0x997a, 0x997b, 0x998b, 0x9af2, 0x9af3, 0x9c93, 0x9c94, 0x9c95, 0x9c96, 0x9c97, 0x9cad, 0x9c98, 0x9cab, 0x9c7b, 0x9c99, 0x9c9a, 0x9c9b, 0x9c85, 0x9c9c, 0x9c9d, 0x0ada, 0x52fd, 0x9cac, 0x9c79, 0x9c9e, 0x9ca4, 0x9dfd, 0x9eeb, 0x9eea, 0x9f8f, 0x9f90, 0x9f86, 0x9f87, 0x9f88, 0xa0ac, 0xa0ad, 0xa2ec, 0xa373, 0xa374, 0x52fd, 0xa4aa, 0xa4ab, 0xa4ac, 0xa6d1, 0xa6d7, 0xa7b9, 0xa7ba, 0xa7bb, 0xa7bc, 0xa98e, 0xa98f, 0xa990, 0xa97c, 0xa991, 0xa992, 0xa993, 0xa994, 0xfb54, 0xa99a, 0xa995, 0xa996, 0xa997, 0xaabd, 0xaac7, 0xaabe, 0x52fd, 0xaabf, 0x52fd, 0xac93, 0x6d5e, 0xad86, 0xad87, 0xad88, 0xad89, 0xae41, 0xae42, 0xae43, 0xae44, 0xae45, 0xae46, 0xae4a, 0xae47, 0xae48, 0xae49, 0xb16b, 0xb166, 0x52fd, 0xb167, /* 0x3e */ 0x3bab, 0xb168, 0x3bac, 0x52fd, 0xb2fd, 0xb2fe, 0xb2ff, 0xb300, 0xb301, 0xb302, 0xb303, 0xb304, 0xb305, 0xb306, 0xb533, 0xb5c2, 0xb5d0, 0xfb74, 0xb695, 0xb696, 0xb735, 0xb736, 0xb867, 0xb868, 0xb869, 0xb86a, 0xb872, 0xb86b, 0xb86c, 0xb86d, 0xb86e, 0xb86f, 0xba22, 0x52fd, 0x52fd, 0xba23, 0xba41, 0xba24, 0xba25, 0xba26, 0xba27, 0xba28, 0xba29, 0xb9b7, 0x52fd, 0x52fd, 0x52fd, 0xbcda, 0xbdcf, 0xbdda, 0xbf89, 0xbfb7, 0xbf8a, 0xbf8b, 0xc05e, 0xbf8c, 0x52fd, 0xbf8d, 0xbf8e, 0xbf8f, 0xbf90, 0xbf91, 0xbf92, 0xbf93, 0xbf94, 0xbfb6, 0xbf95, 0xbf96, 0xbf97, 0x3ff7, 0x52fd, 0xbf98, 0xbf99, 0xbf9a, 0x0fea, 0x52fd, 0xbf9b, 0xbfbd, 0xbf9c, 0xbf9d, 0xbf9e, 0xbf9f, 0xbfc0, 0xbfa0, 0xbfa1, 0xbfa2, 0xbfa3, 0xbfa4, 0xbfa5, 0xbfa6, 0xbfa7, 0xbfa8, 0xbfa9, 0xbfaa, /* 0x3f */ 0x52fd, 0xc4b4, 0xc4b5, 0xc4b6, 0xc5b9, 0xc5ba, 0xc5bb, 0xc591, 0xc5bc, 0xc8ee, 0xc8ef, 0xc996, 0xc997, 0xc973, 0xc998, 0xc999, 0xcaed, 0xcaee, 0xcbde, 0xccb0, 0xccb1, 0xccb2, 0xccb3, 0xccb4, 0xccb5, 0xccb6, 0xfbce, 0xccb7, 0xcee3, 0xcfb9, 0xd055, 0xd07e, 0xd056, 0xd057, 0xd058, 0xd059, 0xd05a, 0x52fd, 0xd1c4, 0xd1c5, 0xd1c6, 0xd1c7, 0xd1c8, 0xd1c9, 0xd1ee, 0xd1cf, 0xd1ca, 0xd1cb, 0xd1cc, 0xd309, 0xfbda, 0xd303, 0xd52f, 0xd530, 0xd531, 0xd532, 0xd80e, 0xd80f, 0xd810, 0xd811, 0xd812, 0x52fd, 0xd813, 0xd814, 0xd815, 0xd7ff, 0xda1f, 0xda20, 0xda21, 0xda2d, 0x52fd, 0xdb1b, 0xdb1c, 0xdb1d, 0xdb1e, 0xdc53, 0xdc54, 0xdc55, 0xdc56, 0xdc64, 0xdc59, 0xdc57, 0x52fd, 0xdc58, 0xdf6b, 0x1489, 0x52fd, 0xdfe7, 0xdfe8, 0xdfe9, 0xdfea, 0xdfeb, 0xdfec, 0x4a96, /* 0x40 */ 0xdfed, 0xe1b1, 0xe1b4, 0x52fd, 0xe38a, 0xe38d, 0xe38c, 0xe4f2, 0xe4f3, 0x52fd, 0x7408, 0xe717, 0x15b2, 0xe89f, 0xe9a0, 0x52fd, 0xeb6d, 0x837d, 0xf290, 0xf8c4, 0x534c, 0x5474, 0x5475, 0x5476, 0x5649, 0x564a, 0x564b, 0x564c, 0x564d, 0x564e, 0x564f, 0x5650, 0x5651, 0x5652, 0x5653, 0x5654, 0x5655, 0x5656, 0x57a4, 0x57a9, 0x582a, 0x582b, 0x5ab3, 0x5ac1, 0x5b98, 0x5bfb, 0x5bfc, 0x5cbc, 0x5d96, 0x5e0a, 0x52fd, 0x61a2, 0x52fd, 0x6181, 0x6182, 0x6183, 0x6184, 0x6185, 0x6186, 0x6187, 0x6188, 0x6189, 0x618a, 0x618b, 0x618c, 0x1cf1, 0x618d, 0x61d1, 0x6514, 0x66c9, 0x66ca, 0x66cb, 0xedfd, 0x66cc, 0x66cd, 0x66ce, 0x66cf, 0x66d0, 0x66d1, 0x66d2, 0x66d3, 0x66d4, 0x66d5, 0x6871, 0x534d, 0x6962, 0x6b0e, 0x6afe, 0x6aff, 0x6b00, 0x52fd, 0x6b01, 0x6b02, 0x6b03, /* 0x41 */ 0x6b15, 0x6b04, 0x6b05, 0x52fd, 0x6c87, 0x6c89, 0x6d6e, 0x6d6f, 0x6d70, 0x6d71, 0xfa6e, 0x6d72, 0x6d73, 0x6d74, 0x6e9d, 0x6fb8, 0x6fb9, 0x6fba, 0x71c2, 0x71c3, 0x71d5, 0x71c4, 0x71c0, 0x71c5, 0x71c6, 0x758a, 0x758b, 0x758c, 0x7664, 0xae8c, 0x2441, 0x770d, 0x77a8, 0x783b, 0x783c, 0x783d, 0x783e, 0x783f, 0x7840, 0x7a66, 0x7acb, 0x7ab7, 0x7ab8, 0x7ab9, 0x7aba, 0x7a67, 0x7abb, 0x7a68, 0x7a69, 0x7a6a, 0x7abc, 0x52fd, 0x7cdb, 0x7f81, 0x7f82, 0x7f83, 0x7f84, 0x7f85, 0x7f86, 0x7f87, 0x7f88, 0x7f89, 0xfabf, 0x7f8a, 0x7f8b, 0x52fd, 0x7f8c, 0x7f8d, 0x7f8e, 0x7f8f, 0x7f90, 0x7fa1, 0x7f91, 0x81d6, 0x829f, 0x8358, 0x8385, 0x840b, 0x840c, 0x8537, 0x8538, 0xface, 0x8539, 0x853a, 0x853b, 0x853c, 0x853d, 0x853e, 0x8540, 0x8541, 0x8542, 0x52fd, 0x8543, 0x868a, /* 0x42 */ 0x868b, 0x8890, 0x8859, 0x885b, 0x885c, 0x885d, 0x885e, 0x2a8a, 0x885f, 0x8860, 0x8861, 0x8862, 0x8863, 0x8864, 0x8893, 0x8865, 0x8866, 0x8867, 0x8868, 0x8869, 0x886a, 0x886b, 0x8895, 0x886c, 0x886d, 0x886e, 0x886f, 0x2a8c, 0x8870, 0x8871, 0x8872, 0x8873, 0x8874, 0x8875, 0x8876, 0x8877, 0x8878, 0x8879, 0x2a80, 0x887a, 0x2a7f, 0x887b, 0x88a9, 0x887c, 0x8bf1, 0x8beb, 0x8c8a, 0x8d3d, 0x8da6, 0x8da7, 0x8eba, 0x52fd, 0x8ebb, 0x8ebc, 0x8ebd, 0x9191, 0x9192, 0x9193, 0x9194, 0x9195, 0x9196, 0x9197, 0x90da, 0x9198, 0x9199, 0x919a, 0x52fd, 0x52fd, 0x919b, 0x919c, 0x919d, 0x919e, 0x919f, 0x91a0, 0x91bf, 0x91a1, 0x91a2, 0x91a3, 0x91a4, 0x91a5, 0x91a6, 0x91a7, 0x915b, 0xfb0d, 0x91a8, 0x95cb, 0x52fd, 0x09da, 0x95cc, 0x964f, 0x95cd, 0x95ce, 0x95cf, 0x964e, /* 0x43 */ 0x95d0, 0x95d1, 0x95d2, 0x52fd, 0x95d3, 0x95d4, 0x95d5, 0x95d6, 0x95d7, 0x95d8, 0x95d9, 0x95fa, 0x95da, 0x95db, 0xfb1c, 0x95dc, 0x52fd, 0x52fd, 0x95dd, 0x95de, 0x95df, 0x95e0, 0x95e1, 0x95e2, 0x95e3, 0x95e4, 0x95e5, 0x09db, 0x95e6, 0x95e7, 0x988e, 0x9998, 0x9999, 0x52fd, 0x9b0a, 0x52fd, 0x9b26, 0x9b27, 0x9cbd, 0x9cdf, 0x0ae2, 0x9cbe, 0x9cde, 0x9cbf, 0x9cc0, 0x9cc1, 0x9cc2, 0x9c9f, 0x9cc3, 0x9cc4, 0x9cc5, 0x9cc6, 0x9cc7, 0x0ae3, 0x9cc8, 0x9cc9, 0x9ce3, 0x9cca, 0x9ccb, 0x9ccc, 0x9ccd, 0x9cce, 0x9ccf, 0x9cd0, 0x9cd1, 0x9cd2, 0x9cd3, 0xfb2f, 0x9cd4, 0x9e04, 0x9e65, 0x9eee, 0x9fa0, 0x9fa1, 0xa0dd, 0xa0de, 0xa283, 0xa2fa, 0xa37f, 0xa380, 0xa4e8, 0xa4e9, 0xa4ea, 0x88a6, 0xa6e1, 0x52fd, 0xa7db, 0xa7dc, 0xa7dd, 0xa7de, 0xa7df, 0xa7e0, 0xa7e1, 0xa7e2, /* 0x44 */ 0xa7e3, 0xa7e4, 0xa7e5, 0xa7e6, 0x379c, 0xa7e7, 0xa9b0, 0xa998, 0xa9b1, 0xa999, 0xa9b2, 0xa9b3, 0xa9b4, 0xa9b5, 0xa9b6, 0xa9b7, 0xa9b8, 0xa9b9, 0xaae2, 0xaae3, 0xaae4, 0xaae5, 0xaae6, 0xaae7, 0xaae8, 0xaae9, 0xacad, 0xaccf, 0xacae, 0xacaf, 0xacb0, 0xacb1, 0xad92, 0xad93, 0xad94, 0xae79, 0x3a7b, 0xae7a, 0xae7b, 0xae7c, 0xae7d, 0xae7e, 0xae7f, 0xae80, 0xae81, 0xae82, 0xae83, 0xae84, 0xb197, 0xb184, 0xb185, 0xb189, 0xb186, 0xb187, 0xb32c, 0xb32d, 0xb32e, 0xb32f, 0xb330, 0xb331, 0xb332, 0xb333, 0xb334, 0xb335, 0xb336, 0xb337, 0xb5d2, 0xb744, 0xb800, 0xb883, 0xb884, 0xfb86, 0xba7a, 0xba7b, 0xba7c, 0xba7d, 0xba7e, 0x52fd, 0xba7f, 0xba87, 0xba80, 0xbd43, 0xc034, 0x1249, 0xc035, 0xc036, 0xc037, 0xc038, 0xc039, 0xc03a, 0xc03b, 0xc03c, 0xc03d, 0xc03e, /* 0x45 */ 0xc03f, 0xc040, 0xc041, 0xc042, 0xc043, 0xc044, 0xc045, 0xc046, 0xc047, 0xc048, 0xc049, 0xc04a, 0x52fd, 0xc04b, 0xc04c, 0xc04d, 0xc04e, 0xc5e7, 0xc5e8, 0xc5e9, 0xc5ea, 0xc5eb, 0xc5ec, 0xc5ed, 0xc5ee, 0xc8f7, 0xc99a, 0xc9cd, 0xfbc8, 0xc9a3, 0xc9ce, 0xcb31, 0xcb32, 0xcb33, 0xcce4, 0x52fd, 0xcce5, 0xcce6, 0xcfc8, 0xd074, 0xd075, 0xd076, 0xd077, 0xd078, 0xd079, 0xd07a, 0xd161, 0xd1df, 0xd1e0, 0xd1e1, 0xd1e2, 0xd1e3, 0xd1e4, 0xd1e5, 0xd1e6, 0x12f3, 0xd331, 0xd53d, 0xd53e, 0xd53f, 0xd5f4, 0xd5f5, 0xd5f6, 0x52fd, 0xd717, 0xd841, 0xd842, 0xd843, 0xd844, 0xd845, 0xd846, 0xd847, 0xd848, 0xd849, 0xd84a, 0xd84b, 0x46d2, 0xd9ba, 0xda44, 0xdc2a, 0xdc6d, 0x4774, 0xfbe7, 0xdc7e, 0xdc6e, 0xdc6f, 0xdc70, 0xdc71, 0xdc76, 0xdf79, 0x4aa0, 0x52fd, 0xe004, 0xdff8, /* 0x46 */ 0xe005, 0xe1da, 0xe1db, 0xe1dc, 0xe1dd, 0xe1de, 0xe1df, 0xe1e0, 0xe1e1, 0xe3c5, 0xe39a, 0xe39b, 0xe39c, 0xe4d8, 0xe4d9, 0xe4da, 0xe56e, 0x1557, 0xe76b, 0xd083, 0x52fd, 0xe9d6, 0xe9bd, 0x52fd, 0x852e, 0xedfc, 0xf053, 0xf0b7, 0xf58c, 0xf68e, 0xf5ff, 0x5376, 0x5406, 0x547e, 0x5684, 0x5685, 0x5686, 0x5687, 0x5688, 0x56a7, 0x5689, 0x568a, 0x568b, 0x568c, 0x568d, 0x568e, 0x568f, 0x56a3, 0x5690, 0x5691, 0x5692, 0x5693, 0x56ac, 0x5694, 0x5695, 0x5696, 0x57aa, 0x57ab, 0x589e, 0x18a9, 0x5908, 0x5909, 0x5968, 0x5969, 0x596a, 0x599a, 0x5ad9, 0x5ada, 0x5adb, 0x5ba8, 0x5c01, 0x5c28, 0x5c77, 0x5cbd, 0x5cbe, 0x6260, 0x5da0, 0x5da2, 0x5e0f, 0x5e85, 0x61fe, 0x61ff, 0x6200, 0x6201, 0x6216, 0x6202, 0x6203, 0x6204, 0x6205, 0x6206, 0x6207, 0x6208, 0x6222, 0x6209, /* 0x47 */ 0x620a, 0x620b, 0x620c, 0x6214, 0x6229, 0x616e, 0x620d, 0x620e, 0x620f, 0x6210, 0x6211, 0x6212, 0x6213, 0x651b, 0x651c, 0x651d, 0x6713, 0x66ff, 0x6700, 0x6701, 0x6702, 0x6703, 0x6704, 0x670a, 0x6705, 0x6706, 0x6707, 0x6708, 0x683a, 0x6873, 0x696f, 0x6970, 0x6971, 0x5352, 0x52fd, 0x6d9a, 0x6b60, 0xfa69, 0x6b2b, 0x6b24, 0x6b2c, 0x6b2d, 0x6b2e, 0x6b2f, 0x6b30, 0x6b31, 0x6b32, 0x6b33, 0x6b34, 0x6b35, 0x6b45, 0x6b36, 0x6c92, 0x6c93, 0x6d88, 0x6d89, 0x6d8a, 0x6d8b, 0x6e3f, 0x52fd, 0x6fca, 0x71f6, 0x71f7, 0x71f8, 0x71f9, 0x742b, 0x52fd, 0x74a4, 0x74ce, 0x52fd, 0x759e, 0x759f, 0x75a0, 0x75a1, 0x75a2, 0x75a3, 0x75a4, 0x75a5, 0x75a6, 0x7718, 0x7860, 0x7861, 0x7862, 0x7863, 0x7864, 0x7abd, 0x7abe, 0x7b0b, 0x7abf, 0x7ac0, 0x52fd, 0x7b0c, 0x7a8d, 0x7b0d, /* 0x48 */ 0x7b0e, 0x7b5e, 0x7b0f, 0x7b10, 0x7ac1, 0x7b11, 0x52fd, 0x7ac2, 0x7cea, 0x7ceb, 0x7fe3, 0x7fe4, 0x7fe5, 0x7fe6, 0x7fe7, 0x7f92, 0x804a, 0x52fd, 0x7fe8, 0x7fe9, 0x7fea, 0x8001, 0x7feb, 0x7fec, 0x7fef, 0x7fed, 0x7fee, 0x7ff0, 0x7ff1, 0x7ff2, 0x7ff3, 0x7ff4, 0x7ff5, 0x7ff6, 0x7ff7, 0x7ff8, 0x7ff9, 0x7ffe, 0x7ffa, 0x7ffb, 0x7ffc, 0x8563, 0x8564, 0x8565, 0x8566, 0x8567, 0x8568, 0x890b, 0x890d, 0x07bc, 0x890e, 0x890f, 0x07a4, 0x8914, 0x88d4, 0x88d5, 0x88d6, 0x88d7, 0x88d8, 0x88d9, 0x88da, 0x88db, 0x88dc, 0x88dd, 0x88de, 0x88df, 0x88e0, 0x88e1, 0x88e2, 0x88e3, 0x88e4, 0x88e5, 0x88e6, 0x88e7, 0x88e8, 0x88e9, 0x88ea, 0x88eb, 0x88ec, 0x89ec, 0x88ed, 0x88ee, 0x88ef, 0x8900, 0x88f0, 0x8c04, 0x52fd, 0x8c05, 0xfaf3, 0x8db5, 0xfaf9, 0x8ed6, 0x8ed7, 0x8ed8, /* 0x49 */ 0x8ed9, 0x91a9, 0x9200, 0x9201, 0x9202, 0x9203, 0x9204, 0x9205, 0x9206, 0x923f, 0x9207, 0x9208, 0x9209, 0x920a, 0x91b6, 0x920b, 0x920c, 0x52fd, 0x52fd, 0x920d, 0x52fd, 0x920e, 0x920f, 0x9210, 0x9211, 0x9212, 0x9235, 0x9213, 0x9214, 0x91aa, 0x52fd, 0x92c1, 0x9215, 0x9216, 0x9217, 0x961e, 0x961f, 0x9620, 0x9621, 0x52fd, 0x9622, 0x9623, 0x3195, 0x9624, 0x9625, 0x9626, 0x9627, 0x9628, 0x9629, 0x962a, 0x962b, 0x9607, 0x962c, 0x962d, 0x962e, 0x09e8, 0x52fd, 0x962f, 0x9630, 0x9648, 0x9631, 0x9632, 0x3198, 0x9633, 0x52fd, 0x9634, 0x9635, 0x9636, 0x9859, 0x9891, 0x98e7, 0x99b8, 0x99b9, 0x99ba, 0x99bb, 0x99c8, 0x9b4d, 0x9b89, 0x9b50, 0x9b28, 0x9cfb, 0x9cfc, 0x9cfd, 0x9cfe, 0x9cff, 0x3378, 0x9d00, 0x9d01, 0x9d02, 0x9ce4, 0x9ce5, 0x9d03, 0x9d04, 0x9d05, /* 0x4a */ 0x9d06, 0x9d07, 0x9d13, 0x9d08, 0x9d09, 0x9ce6, 0x9d0a, 0x9d0b, 0x9d0c, 0x9e0b, 0x9ef4, 0x9f0a, 0x9fb1, 0xa11d, 0xfb3b, 0xa28b, 0xa28c, 0xa28f, 0xa28d, 0xa28e, 0xa306, 0xa386, 0xa522, 0xa523, 0xa524, 0xa525, 0xa526, 0xa527, 0xa528, 0xa6f1, 0x37b9, 0xa823, 0xa812, 0x52fd, 0xa813, 0xa814, 0xa815, 0xa816, 0xa817, 0xa818, 0xa819, 0xa84b, 0xa81a, 0xa81b, 0xa81c, 0x52fd, 0xa81d, 0xa81e, 0xa81f, 0xa820, 0xa9ca, 0x75ac, 0xa9cb, 0xa9cc, 0xa9cd, 0xa9ce, 0x52fd, 0xa9cf, 0xab10, 0xab11, 0xab12, 0xab13, 0xab14, 0xab0f, 0xab15, 0xab16, 0xab17, 0x3933, 0xab18, 0xacc6, 0xad9f, 0xada0, 0xada4, 0xada1, 0xaeb5, 0xaeb6, 0xaeb7, 0xaeb8, 0xaeb9, 0xaeba, 0xaed0, 0xaec6, 0xaebb, 0xaebc, 0xaebd, 0xaebe, 0xaebf, 0xaec0, 0xaec1, 0xaec2, 0xfb60, 0xb1a7, 0xb1a8, 0xb1a9, /* 0x4b */ 0xb1aa, 0xb1ab, 0xb1ac, 0xb1bc, 0xb1ad, 0xb1ae, 0x3bc0, 0xb1af, 0xb1b0, 0xb1b1, 0x3bc1, 0xb1b4, 0xb1b2, 0xb366, 0xb367, 0xb368, 0xb369, 0xb36a, 0xb36b, 0xb36c, 0xb36d, 0xb36e, 0xb36f, 0x52fd, 0xb53e, 0xb53f, 0xb540, 0xb5e8, 0xb752, 0xb753, 0xb754, 0xb755, 0xb891, 0xb892, 0xb893, 0xb894, 0xb895, 0xb896, 0xb897, 0xb898, 0x52fd, 0xb899, 0xb89a, 0xb89b, 0xbab7, 0xbab8, 0xbab9, 0x52fd, 0xbaba, 0xbabb, 0xbabd, 0x52fd, 0xbabc, 0xfb88, 0xfb87, 0xbbeb, 0xbbec, 0xbc16, 0xbc44, 0xbce3, 0xbd58, 0xbd53, 0xbd54, 0xbde0, 0xc0b1, 0xc0b2, 0xc0b3, 0xc0ea, 0x52fd, 0xc0b4, 0xc0f0, 0xc0b5, 0xc0b6, 0xc0b7, 0xc0b8, 0xc0b9, 0xc0ba, 0xc0bb, 0xc0bc, 0xc0bd, 0xc0be, 0xc0bf, 0xc0c0, 0xc0c1, 0xc0c2, 0xc0c3, 0x52fd, 0xc0c4, 0xc0c5, 0xc0c6, 0xc0fc, 0xc0c7, 0xc0c8, 0xc0c9, /* 0x4c */ 0xc0ca, 0xc0cb, 0xc0cc, 0xc184, 0xc0cd, 0xc0ce, 0xc0cf, 0xc0d0, 0xc0d1, 0xc0d2, 0xc4ca, 0xc4cb, 0xc636, 0xc637, 0xc69f, 0xc638, 0xc639, 0xc63a, 0x4144, 0xc9be, 0xc9f0, 0xc9bf, 0xc9c0, 0xcaf7, 0xcaf8, 0xcafa, 0xcb43, 0xcb44, 0xcd0f, 0xcd10, 0xcd11, 0xcd12, 0x43ad, 0xcd13, 0xcd14, 0xcd15, 0xcd16, 0x52fd, 0x52fd, 0xcfd3, 0xcfd7, 0x52fd, 0xd0b0, 0xd098, 0xd090, 0xd091, 0xd092, 0xd097, 0xd093, 0xd164, 0xd201, 0xd202, 0xd203, 0xd204, 0xd205, 0xd206, 0xd207, 0xd35a, 0xd35b, 0xd54e, 0xd54f, 0xd550, 0xd619, 0xd61a, 0xd61b, 0x52fd, 0xd61c, 0x52fd, 0xd719, 0xd71a, 0x1386, 0xdc8a, 0xd86e, 0xd86f, 0x4664, 0xd870, 0xd871, 0xd872, 0xd873, 0xd874, 0xd875, 0xd876, 0xdb3a, 0xdb3b, 0xdb3c, 0xdb5a, 0xdb3d, 0xdb42, 0xdc8b, 0xdca0, 0xdc8c, 0xdc8d, 0xdc8e, 0xdcab, /* 0x4d */ 0xdc8f, 0x4777, 0xdc90, 0xdc91, 0xdc92, 0xdcaa, 0x47af, 0xdc93, 0xdc94, 0xdc9e, 0xdca8, 0x52fd, 0x52fd, 0xe200, 0xe201, 0xe202, 0xe203, 0xe204, 0xe205, 0xe2c4, 0xe2c5, 0x52fd, 0xe3ae, 0xe3b2, 0x52fd, 0x52fd, 0xe4f7, 0xe513, 0xe69e, 0xe785, 0xa680, 0xe7c8, 0xeb41, 0xeb81, 0xeb82, 0xeb83, 0xeb84, 0xedc4, 0xedc5, 0xedc6, 0xef95, 0xef96, 0xef97, 0xf058, 0xf059, 0x52fd, 0xf2a9, 0xf2aa, 0xf2ab, 0xf58e, 0xf603, 0xf6b3, 0x5e82, 0x5353, 0x5483, 0x5484, 0x5485, 0x56cc, 0x56cd, 0x56ce, 0x56cf, 0x56d0, 0x52fd, 0x56d1, 0x56d2, 0x56da, 0x57b3, 0x57b4, 0x52fd, 0x5913, 0x590e, 0x596b, 0x5c03, 0x5c61, 0x5cc1, 0x5cc2, 0x5db5, 0x5440, 0x6298, 0x6299, 0x629a, 0x629b, 0x629c, 0x629d, 0x629e, 0x629f, 0x62ee, 0x62a0, 0x62a1, 0x6286, 0x6525, 0x6734, 0x6735, 0x6751, /* 0x4e */ 0x672d, 0x9662, 0x6754, 0x6752, 0x026d, 0x6736, 0x6737, 0x6738, 0x6739, 0x673a, 0x673b, 0x6768, 0x673c, 0x026e, 0x6877, 0x8596, 0x697e, 0x697f, 0x6b69, 0x6b6a, 0x6b6b, 0x6b6c, 0x6b6d, 0x6b6e, 0x6b6f, 0x6b5d, 0x6b70, 0x6b85, 0x6b71, 0x6b72, 0x6b73, 0x6b74, 0x6b75, 0x6b76, 0x6b84, 0x6b77, 0x6b83, 0x6c9a, 0x6da7, 0x6da8, 0x6da9, 0x6daa, 0x6dab, 0x6dac, 0x6db7, 0x6dad, 0x6dae, 0x52fd, 0x6e45, 0x6fd3, 0x6fd4, 0x6fd5, 0x6fd6, 0x6fd7, 0x7226, 0x7227, 0x7228, 0x52fd, 0x7229, 0x722a, 0x7305, 0x2364, 0x74d0, 0x75b7, 0x52fd, 0x75b8, 0x75b9, 0x7722, 0x7723, 0x7873, 0x7874, 0x7b8f, 0x7b12, 0x7b13, 0x7b14, 0x7b15, 0x7b16, 0x7b17, 0x7b18, 0x7b61, 0x7b66, 0x7b67, 0x7b19, 0x7b68, 0x7b1a, 0x7b69, 0x7d04, 0x7d05, 0x52fd, 0x7d06, 0x7cfd, 0x8050, 0x8051, 0x8052, /* 0x4f */ 0x8053, 0x8054, 0x8055, 0x8063, 0xfac4, 0x8056, 0x8057, 0x8058, 0x8059, 0x805a, 0x805b, 0x52fd, 0x805c, 0x805d, 0x805e, 0x805f, 0x82d7, 0x52fd, 0x8360, 0x8361, 0x8417, 0x8439, 0x858f, 0x85c8, 0x8590, 0x8591, 0x8698, 0x8699, 0x8944, 0x8945, 0x8946, 0x8959, 0x89ee, 0x2b2b, 0x8947, 0x8948, 0x52fd, 0x8949, 0x894a, 0x894b, 0x894c, 0x894d, 0x894e, 0x894f, 0x8950, 0x8951, 0x8952, 0x8953, 0x8954, 0x8955, 0x8956, 0x8c15, 0x8c9a, 0x8d58, 0x8dfc, 0x8dfd, 0x9286, 0x9287, 0x9288, 0x9289, 0x928a, 0x928b, 0x928c, 0x52fd, 0x931f, 0x928d, 0x928e, 0x928f, 0x9290, 0x9291, 0x9292, 0x9293, 0xfb11, 0x9294, 0x9295, 0x91ca, 0x9218, 0x52fd, 0x9296, 0x9297, 0x9298, 0x9299, 0x929a, 0x929b, 0x929c, 0x929d, 0x929e, 0x929f, 0x2f46, 0x52fd, 0x92a0, 0x92a1, 0x2f9a, 0x92b7, /* 0x50 */ 0x52fd, 0x9696, 0x9668, 0x9669, 0x968c, 0x966a, 0x966b, 0x966c, 0x966d, 0x966e, 0x966f, 0x967f, 0x9684, 0x9670, 0x9671, 0x9685, 0x9672, 0x9673, 0x9674, 0x9675, 0x9676, 0x52fd, 0x9677, 0x9678, 0x9679, 0x967a, 0x967b, 0x967c, 0xfb1e, 0x9894, 0x99d5, 0x9b29, 0x9d2b, 0x9d2c, 0x9d2d, 0x9d2e, 0x9d2f, 0x9d30, 0x9d3e, 0x9d31, 0x9d32, 0x9d33, 0x9d34, 0x9d35, 0x9e11, 0x0b53, 0x9fc0, 0xa142, 0xa143, 0xa144, 0xa145, 0xa146, 0xa38c, 0xa38d, 0xa38e, 0xa38f, 0xa390, 0xa391, 0xa563, 0xa564, 0xa565, 0x52fd, 0xfb4a, 0x52fd, 0xa6f6, 0xa836, 0xa837, 0xa82c, 0xa838, 0xa839, 0x52fd, 0xa83a, 0xa9e3, 0xa9e2, 0xa9f5, 0xab47, 0x52fd, 0xab48, 0xab49, 0xab4a, 0xab4b, 0xab4c, 0xada8, 0xada9, 0xadaa, 0x52fd, 0xaf0b, 0xaf06, 0xaf73, 0xaf0c, 0xaf0d, 0xaf0e, 0xaf0f, 0xaf10, /* 0x51 */ 0x52fd, 0xaf11, 0xfb62, 0xaf12, 0xaf14, 0xaf15, 0xaf16, 0x52fd, 0xaf13, 0xaf17, 0xb1d9, 0xb1da, 0xb1db, 0x52fd, 0xb1dc, 0xb3a6, 0xb3a7, 0xb3a8, 0xb3a9, 0xb3aa, 0xb3ab, 0x52fd, 0xfb6d, 0xb3ac, 0xb3ad, 0xb3ae, 0x52fd, 0x52fd, 0xb3af, 0xb3b0, 0xb3b1, 0xb544, 0xb545, 0xb5f7, 0xb5f8, 0xb76b, 0xb76c, 0xb761, 0xb812, 0xb8af, 0xb8b0, 0xb8b1, 0xb8b2, 0xb8b3, 0xb8b4, 0xb8b5, 0xb8b6, 0xb922, 0xbaea, 0xbaeb, 0xbaec, 0xbaed, 0x0f3d, 0xbbed, 0xbc1b, 0xbc47, 0xbce8, 0xbdd0, 0xbde7, 0xbde8, 0xbde9, 0xc14e, 0xc14f, 0xc150, 0xc172, 0xc151, 0xc152, 0xfba7, 0x1026, 0xc153, 0xc154, 0xc155, 0xc156, 0xc157, 0xc177, 0xc158, 0xc159, 0xc15a, 0xc15b, 0xc15c, 0xc16e, 0xc15d, 0x1027, 0x52fd, 0xc15e, 0x1028, 0xc15f, 0x52fd, 0xc4d7, 0xc689, 0xc68a, 0x52fd, 0xfbbe, 0xc68b, /* 0x52 */ 0xc68c, 0xc68d, 0xc68e, 0xfbbc, 0xc68f, 0x52fd, 0xc69a, 0xc690, 0xc691, 0xc692, 0xc693, 0xca12, 0xc9f1, 0x52fd, 0xcafe, 0xcafb, 0xcb57, 0xcd49, 0xcd4a, 0xcd4b, 0xcd4c, 0x52fd, 0xcd4d, 0xcd59, 0xcd4e, 0xcd4f, 0xcef4, 0xcf65, 0xd0a6, 0xd0a7, 0xd0a8, 0xd222, 0xd223, 0xd38b, 0xd38c, 0xd38d, 0xd38e, 0xd558, 0x52fd, 0xd559, 0xd63b, 0xd63c, 0xd63d, 0xd63e, 0xd748, 0xd894, 0xd895, 0xd896, 0xd897, 0xd898, 0xda7d, 0xd9fe, 0xda7e, 0xda7f, 0x52fd, 0xdb5b, 0xdb5c, 0xdce4, 0xdcc1, 0xdcfd, 0xdcc2, 0xdcd6, 0xdcc3, 0xdcc4, 0x52fd, 0xdcdc, 0xdcc5, 0xdcc6, 0xdcc7, 0xdce1, 0xdcc8, 0xdcc9, 0xdcca, 0xdccb, 0x47f2, 0xdccc, 0xdccd, 0xe035, 0xe036, 0xe047, 0xe037, 0xe21b, 0xe21c, 0xe21d, 0xe21e, 0xe21f, 0xe220, 0xe27b, 0xe27a, 0xe2fe, 0xe3c6, 0xe3c7, 0xe3c8, 0xe3c9, /* 0x53 */ 0xe3ca, 0x52fd, 0xe7a0, 0xe7a1, 0xe8cc, 0xe8cd, 0xe9f1, 0xe9d7, 0xeb42, 0xeb46, 0xeba3, 0xeba5, 0xeba6, 0xedcb, 0xedcc, 0xee26, 0xee27, 0xee28, 0xee29, 0xefae, 0xefaf, 0xefb0, 0xf073, 0x52fd, 0xf07c, 0xf074, 0x52fd, 0xf280, 0xf075, 0x4c79, 0x52fd, 0xf2cf, 0x52fd, 0xf68f, 0x5970, 0x5385, 0x5697, 0x56f6, 0x56f7, 0x56f8, 0x56fa, 0x56fb, 0x57ba, 0x57bb, 0x57bc, 0x57bd, 0x5834, 0x5835, 0x58a2, 0x5914, 0x5911, 0x596e, 0x596f, 0x5b08, 0x5bb8, 0x5d09, 0x5dbd, 0x5dbe, 0x5e88, 0x62fe, 0x1d7a, 0x62ff, 0x6300, 0x6301, 0x6302, 0x6303, 0x6304, 0x6305, 0x6306, 0x52fd, 0x6307, 0x6308, 0x6309, 0x630a, 0x630b, 0x630c, 0x630d, 0x630e, 0x630f, 0x52fd, 0x52fd, 0x52fd, 0x652c, 0x676b, 0x52fd, 0x676c, 0x6787, 0x676d, 0x6878, 0x698b, 0x6ba4, 0x6ba5, 0x6ba6, 0x6ba7, /* 0x54 */ 0x6bbe, 0x6ba8, 0x6ba9, 0x6baa, 0x6b8d, 0x6bab, 0x6bac, 0x6bbf, 0x52fd, 0x032c, 0x6bad, 0x6bae, 0x6ca4, 0x6ca5, 0x6dc7, 0x6dc8, 0x6dc9, 0xd0bc, 0x6dca, 0x6dcb, 0x6dcc, 0x6dcd, 0x6dce, 0x6f19, 0x6fe6, 0x724c, 0x724d, 0x724e, 0x7306, 0x52fd, 0x75cd, 0x75ce, 0x75cf, 0x75d0, 0x245c, 0x7881, 0x7882, 0x5833, 0x7b6a, 0x7b6b, 0x7bb2, 0x7b6c, 0x7b6d, 0x7bcc, 0x7bae, 0x7bb3, 0x7b91, 0x52fd, 0x7b6e, 0x7bb4, 0x7b6f, 0x80c9, 0x80a7, 0x80a8, 0x80a9, 0x80aa, 0x80ab, 0x80ac, 0x80ad, 0x80ae, 0x80af, 0x80b0, 0x8060, 0x80b1, 0x81e1, 0x82e3, 0x82f6, 0x26d9, 0x85af, 0x85b0, 0x85b1, 0x85ba, 0x85b2, 0x85b3, 0x864c, 0x52fd, 0x86a0, 0x86a1, 0x89b0, 0x89b1, 0x89b2, 0x89b3, 0x89b4, 0xfaeb, 0x89b5, 0x89b6, 0x89b7, 0x89b8, 0x89b9, 0x89ba, 0x2b72, 0x89bb, 0x89bc, 0x89bd, /* 0x55 */ 0x89be, 0x89bf, 0x89df, 0x89c0, 0x89c1, 0x89c2, 0x89c3, 0x89c4, 0x2b78, 0x52fd, 0x89c5, 0x89c6, 0x89c7, 0x89c8, 0x89c9, 0x89ca, 0x8a3c, 0x89cb, 0x89cc, 0x89cd, 0x89ce, 0x89cf, 0x89d0, 0x89d1, 0x2c5a, 0x8c1d, 0x8c1e, 0x8d64, 0x8d65, 0x8dc5, 0x8dc6, 0x8dc7, 0x8dff, 0x8eff, 0x8f00, 0x8f01, 0x8f02, 0x92f5, 0x935c, 0x92f6, 0x92f7, 0x92b0, 0x92f8, 0x92f9, 0x935d, 0x9350, 0x92fa, 0x92fb, 0x92a2, 0x92fc, 0x92fd, 0x92fe, 0x92ff, 0xfb13, 0x9300, 0xfb1f, 0x96c1, 0x96c2, 0x96c3, 0x96c4, 0x96c5, 0x96c6, 0x96c7, 0x96c8, 0x96c9, 0x96ca, 0x96cb, 0xe3ef, 0x96d7, 0x96cc, 0x96cd, 0x96ce, 0x9722, 0x96cf, 0x96d0, 0x52fd, 0x96d1, 0x96d2, 0x96e9, 0x96d3, 0x96d4, 0x96d5, 0x9838, 0x633b, 0x9b7d, 0x586f, 0x9ba1, 0x9d53, 0x9d54, 0x0afb, 0x9d55, 0x9d3c, 0x9d56, 0x52fd, /* 0x56 */ 0x9d66, 0x0afc, 0x9d57, 0x9d58, 0x9d59, 0x9d5a, 0x9d5b, 0x9d67, 0x9d5c, 0x52fd, 0x52fd, 0x9d6a, 0x9d5d, 0x9d3d, 0x9d5e, 0x9d65, 0x9fe1, 0x9fcd, 0xf311, 0xa16f, 0xa170, 0xa31a, 0xa39a, 0xa39b, 0xa39c, 0xa39e, 0xa39f, 0xfb3f, 0xa58e, 0x52fd, 0xa6fd, 0x52fd, 0xa85e, 0xa85f, 0xa860, 0xa865, 0xa867, 0xa868, 0xa869, 0x52fd, 0xa86a, 0xa88f, 0xa86b, 0xa86c, 0xa86d, 0xa9f7, 0xa9f8, 0xa9f9, 0xa9e4, 0xa9fa, 0xabb1, 0xab75, 0xab76, 0xacff, 0xad00, 0xad01, 0xad02, 0xad03, 0xadae, 0xadad, 0xaf51, 0xaf52, 0x52fd, 0xaf53, 0xaf54, 0xaf55, 0xaf56, 0xaf57, 0xaf58, 0xaf59, 0xaf5a, 0xaf5b, 0xaf5c, 0xaf5d, 0xaf5e, 0xaf5f, 0xaf60, 0xaf61, 0xaf62, 0xaf63, 0xaf64, 0xaf4c, 0xaf66, 0xb1f1, 0xb1f2, 0xb3f2, 0xb3f3, 0xb3f4, 0xb3f5, 0xb3f6, 0xb3f7, 0xb3f8, 0xb3f9, 0xb3fa, /* 0x57 */ 0xb54c, 0xb54b, 0xb61b, 0xb6ce, 0xb6b3, 0xb77f, 0xfb79, 0xfb7c, 0xb81a, 0xb8c4, 0xb8c5, 0xb8c6, 0xb8c7, 0xb8c8, 0xb8c9, 0x52fd, 0xbb19, 0xbb1c, 0xbb1a, 0xbc4c, 0xbc8e, 0xbd7e, 0xc1eb, 0xc1ec, 0xc1ed, 0xc1ee, 0xc1ef, 0xc1f0, 0xc1f1, 0xc1d8, 0xc1d9, 0xc1da, 0xc1db, 0xc1f2, 0xc1f3, 0xc1f4, 0xc207, 0x52fd, 0xfbac, 0x52fd, 0xc1f5, 0xc215, 0x52fd, 0xc1f6, 0xc1f7, 0xc1f8, 0xc1f9, 0xc1fa, 0xc1fb, 0xc1fc, 0xc1fd, 0xc1fe, 0xc2a7, 0xc1ff, 0xc200, 0xc201, 0xc202, 0xc203, 0xc204, 0xc205, 0xc4e9, 0xc4ea, 0xc4eb, 0xc6de, 0xc6df, 0x52fd, 0xc6e0, 0xc6e1, 0xc6e2, 0xc6e3, 0xca3e, 0xca3f, 0xca40, 0xca41, 0xcb71, 0xcb72, 0xcb73, 0xcd88, 0xcd89, 0xcd8a, 0xcd8b, 0xcd8c, 0xcd8d, 0xcd8e, 0xcd8f, 0xcd90, 0xcd91, 0xcd92, 0x52fd, 0xcff1, 0xd0be, 0xd0bf, 0xd0c0, 0xd0c1, /* 0x58 */ 0xd0c2, 0xd0c3, 0xd16e, 0xd237, 0xd257, 0xd238, 0xd239, 0xd23a, 0xd23b, 0xd23c, 0xd23d, 0xd23e, 0xd227, 0xd23f, 0x52fd, 0x52fd, 0xd3c0, 0xd3c1, 0x44be, 0xd567, 0x52fd, 0xd568, 0xd658, 0xd665, 0xd659, 0xd65a, 0xd724, 0xd8cd, 0xd8ce, 0xd8cf, 0xd8d2, 0xda9f, 0xda22, 0xdb7d, 0xdb7e, 0xdcff, 0xdd25, 0xdd00, 0xdd01, 0x483b, 0xdd02, 0xdd03, 0xdd04, 0x5128, 0xdd05, 0xdd06, 0xdd07, 0xdd16, 0xdd08, 0xdd17, 0xdd09, 0xdd0a, 0x4840, 0xdd0b, 0xdd0c, 0xdd29, 0x483a, 0xdd0d, 0x52fd, 0xdd0e, 0xdd10, 0xdd11, 0xdd1d, 0xdd12, 0xdd13, 0x52fd, 0xdd14, 0xdd15, 0xdf8d, 0xe054, 0xe055, 0xe056, 0xe233, 0xe234, 0xe235, 0xe236, 0xe2fa, 0xe3e3, 0xe3e6, 0xe3ed, 0xe3e7, 0xe3e8, 0xe3e9, 0xe3ea, 0xe3eb, 0xe527, 0xe520, 0xfbf8, 0xe72a, 0xe7c9, 0x52fd, 0xe7ca, 0xe7cb, 0xe7d9, /* 0x59 */ 0xe7cc, 0xe7cd, 0xe7ce, 0x52fd, 0xe8e1, 0xea1b, 0xea1c, 0xea1d, 0xea1e, 0xeb47, 0xebd1, 0xebc9, 0xedd0, 0xedd1, 0xee3f, 0xee40, 0xee41, 0xfc09, 0xee42, 0xefc4, 0xf09b, 0xf092, 0xf093, 0x4c96, 0xf094, 0xf095, 0x52fd, 0x52fd, 0xf2f3, 0xf2f4, 0xf2f5, 0xf2f6, 0xf560, 0xf59e, 0xf5a0, 0xf5a1, 0xf61c, 0xf69f, 0x5356, 0x5712, 0x571f, 0x5715, 0x5716, 0x5717, 0xfa0c, 0x5718, 0x57c2, 0x57c3, 0x57c4, 0x58a1, 0x591b, 0x591c, 0x5971, 0x5b13, 0x5e17, 0x5e8f, 0x635f, 0x6360, 0x63ac, 0x52fd, 0x52fd, 0x6361, 0x6362, 0x6363, 0x6364, 0x6365, 0x52fd, 0x6799, 0x679a, 0x679b, 0x679c, 0x679d, 0x679e, 0x679f, 0x67a0, 0x6bda, 0x6bdb, 0x6bdc, 0x6bdd, 0x6bde, 0x6bdf, 0x6dd5, 0x6dd6, 0x6dd7, 0x6dd8, 0x6de0, 0x6eb4, 0x52fd, 0x726e, 0x726f, 0x7270, 0x7463, 0x52fd, 0x75d5, /* 0x5a */ 0x75d6, 0x75d7, 0x75d8, 0x7730, 0x7bb5, 0x7bb6, 0x7bc1, 0x7bf7, 0x05a0, 0x7bcb, 0x7be8, 0x52fd, 0x7be9, 0x7bb7, 0x7d15, 0x80e6, 0x80e7, 0x80e8, 0x80e9, 0x80ea, 0x80eb, 0xfaca, 0x830b, 0x830c, 0x8364, 0x85d4, 0x85d5, 0x85d6, 0x85d8, 0x86a5, 0x535b, 0x8a0f, 0x8a10, 0x52fd, 0x8a11, 0x8a12, 0x8a13, 0x8a14, 0x8a15, 0x8a16, 0x8a17, 0x8a18, 0x8a19, 0x8a1a, 0x8a2f, 0x8a1b, 0x8a1c, 0x8a3f, 0x8a1d, 0x8a1e, 0x8a2c, 0x8a1f, 0x8c24, 0x8ca4, 0x8ca5, 0xb551, 0x8dfe, 0x8f11, 0x8f12, 0x8f13, 0x8f54, 0x935e, 0x9321, 0x933f, 0x9340, 0x9341, 0x9342, 0x9343, 0x9344, 0x9320, 0x9345, 0x52fd, 0x9346, 0x93b0, 0x9347, 0x9357, 0x9301, 0x93b1, 0x935a, 0x9348, 0x9704, 0x9705, 0x31f5, 0x974f, 0x9750, 0x9706, 0x9707, 0x9708, 0x9709, 0x970a, 0x970b, 0x970c, 0x970d, 0x970e, /* 0x5b */ 0x970f, 0x9710, 0x9711, 0x9833, 0x9834, 0x9835, 0x98fc, 0x98fd, 0x9bb0, 0x9bb1, 0x9bb2, 0x9bb3, 0x0b01, 0x9d7b, 0x9d7c, 0x9d7d, 0x9d7e, 0x9d7f, 0x9d80, 0x9d81, 0x9d82, 0x9ef9, 0x9fda, 0xa1a1, 0x52fd, 0x52fd, 0xa3ad, 0xa3ae, 0x52fd, 0xa5c8, 0xa5c9, 0xa5ca, 0xa882, 0xa883, 0xa884, 0xa885, 0xa886, 0xa887, 0xa888, 0xa889, 0xa88a, 0x52fd, 0xaa07, 0xaa08, 0xaa01, 0xaa09, 0xaa02, 0xaa0a, 0xaa0b, 0xaa0c, 0xaba7, 0xab98, 0xab99, 0xab9a, 0xab9b, 0xab9c, 0x3950, 0xab9d, 0xad1a, 0xadb2, 0xafb0, 0xafb1, 0x3b14, 0xafb2, 0xafb3, 0xafb4, 0xafb5, 0xafb6, 0xafc0, 0xafb7, 0xafb8, 0xafb9, 0xafba, 0xb01d, 0xb20c, 0xb20d, 0xb20e, 0xb235, 0xb20f, 0xb210, 0xb211, 0xb212, 0xb422, 0xb423, 0xb424, 0x52fd, 0xb425, 0xb426, 0xb427, 0xb428, 0xb429, 0xb42a, 0xb42b, 0xb42c, /* 0x5c */ 0xb42d, 0xb42e, 0xb552, 0xb553, 0xb619, 0xb6bf, 0xb78b, 0xb78c, 0xb823, 0xb824, 0xb8f1, 0xb8d8, 0xfb7f, 0xbb4e, 0xbb4f, 0xbb55, 0xbb50, 0xbb51, 0xbb52, 0xbb53, 0xbb02, 0xbb54, 0xbbf1, 0xbc24, 0xbdd1, 0xc27c, 0xc27d, 0xc27e, 0xc27f, 0xc280, 0xc29f, 0xc281, 0xc282, 0xc283, 0xc284, 0xc285, 0xc286, 0xc287, 0xc288, 0xc29b, 0xc289, 0xc28a, 0xc28b, 0xc28c, 0x52fd, 0xc2a1, 0xc28d, 0xc28e, 0xc4f3, 0xc4f4, 0xc4f5, 0xc724, 0xc725, 0xc726, 0xc727, 0xc728, 0xc729, 0xc72a, 0x52fd, 0xc72b, 0xc8cd, 0xc901, 0x788d, 0xca70, 0xcb80, 0xcb81, 0xcdc0, 0xcdc1, 0xcdc2, 0xcdc3, 0xcdc4, 0xcdc5, 0xcdc6, 0xcdc7, 0xcdc8, 0xcffe, 0x52fd, 0xd0d9, 0xd0dc, 0xd0da, 0xd175, 0xd258, 0xd259, 0xd25a, 0xd25b, 0xd25c, 0xd3ec, 0x131a, 0xd3f3, 0xd572, 0xd573, 0xd682, 0xd683, 0xd72a, /* 0x5d */ 0xd72b, 0xd72c, 0xd72d, 0xd8f6, 0xd900, 0xd8f7, 0xd8f8, 0xd8f9, 0x52fd, 0xdb94, 0xdb95, 0xdb96, 0xdc1b, 0xdd86, 0xdd4c, 0xdd4d, 0xdd83, 0x52fd, 0xdd82, 0xdd4e, 0xdd4f, 0xdd50, 0xdd51, 0xdd81, 0x4887, 0xdd52, 0xdd53, 0xdd54, 0xdd55, 0x52fd, 0xdd56, 0xdd57, 0x4885, 0xdd58, 0xdd5b, 0xdd5c, 0xdd5d, 0xdd5e, 0xdd5f, 0xdd60, 0xdd61, 0xdd7c, 0xdd62, 0x143c, 0x52fd, 0xdd63, 0xdd64, 0xe073, 0xe245, 0xe246, 0xe247, 0xe24c, 0xe312, 0x52fd, 0xe313, 0xe439, 0xe403, 0xe40d, 0xe530, 0xe5d5, 0xe6c0, 0xe7f2, 0xe7f3, 0xe7f4, 0xe7f5, 0xe7f6, 0xe7f7, 0xe8fa, 0xe8fb, 0xea45, 0xea46, 0xeb49, 0xebe7, 0xebe8, 0xedd8, 0xedd9, 0xee55, 0xee56, 0xee57, 0xefda, 0xefdb, 0xefdc, 0xf0b8, 0xf0b9, 0xf0ba, 0x4cb1, 0xf0bb, 0xf289, 0xf0bc, 0xf330, 0xf331, 0xf332, 0xf333, 0x52fd, /* 0x5e */ 0xf334, 0xf335, 0xf336, 0x4e47, 0xf337, 0xf5b2, 0xf690, 0xf626, 0xf6a2, 0xf738, 0x52fd, 0x572e, 0x52fd, 0x572f, 0x5730, 0x572a, 0x572b, 0x57c9, 0x5837, 0x5920, 0x5972, 0x5b1f, 0x5c65, 0x5cca, 0x5dc0, 0x5dc1, 0x5dc2, 0x63b7, 0x63b8, 0x63b9, 0x63ba, 0x63bb, 0x52fd, 0x52fd, 0x63bc, 0x63bd, 0x63be, 0x63f2, 0x67b5, 0x67b7, 0x67b8, 0x63df, 0x67b9, 0x67d5, 0x67ba, 0x67bb, 0x684a, 0x6bf2, 0x6bf3, 0x6bf4, 0x6bfa, 0x6bf5, 0x6c02, 0x6de2, 0x6de3, 0x728e, 0x728b, 0x75e4, 0x75eb, 0x75e5, 0x7735, 0x7893, 0x7bea, 0x7beb, 0x52fd, 0x7bec, 0x7bed, 0x7c17, 0x7bee, 0x7bef, 0x7bf0, 0x810e, 0x810f, 0x8110, 0x8119, 0x8118, 0x8111, 0x8112, 0x8113, 0xfac7, 0x8114, 0x8115, 0x066b, 0x8116, 0x8365, 0x85ea, 0x85eb, 0x85ec, 0x85ed, 0x52fd, 0x85ee, 0x86ac, 0x8ac2, 0x8a69, /* 0x5f */ 0x8a81, 0x8a6a, 0x8a6b, 0x8a6c, 0x8a6d, 0x8a6e, 0x8a6f, 0x8a70, 0x07f4, 0x8a71, 0x8a72, 0x8a73, 0x8a8c, 0x8a74, 0x8a75, 0x8a76, 0x8f24, 0x8f2a, 0x938e, 0x93af, 0x938f, 0x9390, 0x9391, 0x52fd, 0x9392, 0x9393, 0x9394, 0x9395, 0x9396, 0x9397, 0x9398, 0x9399, 0x939a, 0x939b, 0x939c, 0x9739, 0x973b, 0x973a, 0x973c, 0x973d, 0x973e, 0x973f, 0x9770, 0x9740, 0x9741, 0x9bc0, 0x9bc1, 0x9da4, 0x9d97, 0x9da5, 0x9d98, 0x9d99, 0x9d9a, 0x52fd, 0x9d9b, 0x9da6, 0x9d9c, 0x9d9d, 0x9d9e, 0x9d9f, 0xddce, 0x9dc8, 0x9da0, 0x9e19, 0x9f0d, 0xa3bf, 0xa5e9, 0xa5ea, 0xa8a2, 0xa8a3, 0xa8a4, 0xa8a5, 0xa8a6, 0xaa15, 0xaa17, 0xabbf, 0xabc0, 0xabc1, 0xabc2, 0xabc3, 0xabc4, 0xabc5, 0x6c0d, 0xad23, 0xadbe, 0xb003, 0xb004, 0xb005, 0xb006, 0xb007, 0xb008, 0xb009, 0xb00a, 0xb00b, /* 0x60 */ 0xb00c, 0xb020, 0xb00d, 0xb00e, 0xb00f, 0x52fd, 0xb226, 0xb227, 0xb228, 0xb45d, 0xb45e, 0xb45f, 0xb460, 0xb461, 0xb462, 0xb463, 0xb464, 0xb465, 0xb557, 0xb6cf, 0xb6d0, 0xb799, 0xb79a, 0xb8ea, 0xb8eb, 0xb8ec, 0xbb7e, 0xbb7f, 0xbb80, 0x52fd, 0x52fd, 0xbb81, 0xbb82, 0xbbf3, 0xbc25, 0xbc9f, 0xbca0, 0xbcf3, 0xbd00, 0xc2eb, 0xc2ec, 0xc2ed, 0xc2ee, 0xc2ef, 0x52fd, 0x105c, 0xc2f0, 0xc2f1, 0xc2f2, 0xc2f3, 0xc2f4, 0xc2f5, 0xc2f9, 0xc2fa, 0xc2fb, 0xc2fc, 0xc2fd, 0xc2fe, 0xc2ff, 0xc300, 0xfbae, 0xc301, 0xc302, 0xc503, 0xc786, 0xc779, 0x52fd, 0xc77a, 0xc77b, 0xc77c, 0xc784, 0xc77d, 0xc77e, 0xc77f, 0xca86, 0xca87, 0xcb00, 0xcb01, 0xcb88, 0xcb89, 0xcb8a, 0xcdf5, 0x52fd, 0xce25, 0xcdf6, 0xd0eb, 0xd0ec, 0xd0ed, 0xd0ee, 0x1287, 0xd0ef, 0xd0f0, 0xd26c, 0xd421, /* 0x61 */ 0xd422, 0xd423, 0xd424, 0xd425, 0xd426, 0xd57b, 0xd57c, 0xd691, 0xd692, 0xd693, 0xd90e, 0xd90f, 0xd910, 0xdbb3, 0xdc36, 0xddc6, 0xdda1, 0xdda2, 0x48b9, 0xdda3, 0xddcc, 0xdda4, 0xdda5, 0xdda6, 0xddcb, 0xdda7, 0x52fd, 0xdda8, 0xdda9, 0xddaa, 0x52fd, 0xddab, 0xddac, 0xddad, 0x48bf, 0xddae, 0xddaf, 0xddb0, 0xe08c, 0xe08d, 0xe08e, 0xfbf1, 0xe092, 0xe08f, 0xe252, 0xe253, 0xe254, 0xe255, 0xe429, 0x52fd, 0xe5f3, 0xe5f4, 0xe80d, 0xe80e, 0xe80f, 0xe810, 0xe914, 0xea71, 0xea72, 0xec0f, 0xec04, 0xec06, 0x52fd, 0xec07, 0xeddc, 0xeddd, 0xee6d, 0xee79, 0xee6e, 0x52fd, 0xefec, 0xf0dd, 0xf0de, 0xf0df, 0xf0e0, 0xf0e1, 0xf0e2, 0xf0e3, 0xf0e4, 0xf13a, 0xf0e5, 0x4ccf, 0xf0e6, 0xf36b, 0xf36c, 0x974e, 0x4e64, 0xf5bd, 0xf5be, 0xf5bf, 0xf634, 0x4fbf, 0xf812, 0x5740, /* 0x62 */ 0x5741, 0x6402, 0x6403, 0x6404, 0x6405, 0x6406, 0x67d7, 0x67cc, 0x6998, 0x6c06, 0x6c07, 0x6caf, 0x6cb0, 0x6dea, 0x6df2, 0x72a2, 0x72a3, 0x72a4, 0x7476, 0x75f5, 0x75f6, 0x75f7, 0x52fd, 0x7c3b, 0x7c25, 0x7c3a, 0x7c3c, 0x7c3d, 0x7c3e, 0x8137, 0x8138, 0x8139, 0x813a, 0x813b, 0x813c, 0x813d, 0x813e, 0x813f, 0x814b, 0x52fd, 0x8140, 0x8322, 0x8367, 0x83d3, 0x85fa, 0x52fd, 0x8abc, 0x52fd, 0x52fd, 0x8aa5, 0x0807, 0x8ab6, 0x52fd, 0x8aa6, 0x8abb, 0x8aa7, 0x8aa8, 0x8aa9, 0x8aaa, 0x8aab, 0x8aac, 0x8abf, 0x8aad, 0x8aae, 0x8aaf, 0x8c2e, 0x8e00, 0x939d, 0x939e, 0x93cb, 0x93cc, 0x93cd, 0x93ce, 0x93cf, 0x52fd, 0x939f, 0x93d0, 0x93d1, 0x93d2, 0x93d3, 0x93d4, 0x52fd, 0x52fd, 0x975d, 0x975e, 0x975f, 0x9760, 0x0b05, 0x9dba, 0x9dbc, 0x0b06, 0x9db5, 0x9dbd, 0x9db6, /* 0x63 */ 0x9db7, 0x9db8, 0x9da8, 0xfb32, 0x9efe, 0x9efc, 0xa1e1, 0xa3c4, 0xa3c5, 0xa614, 0xa8ae, 0xa8af, 0xa8b0, 0xa8b1, 0xa8b9, 0xabe7, 0xb046, 0x52fd, 0xb047, 0xb048, 0xb049, 0xb01e, 0xb01f, 0xb04a, 0xb04b, 0xb04c, 0xb04d, 0xb04e, 0x52fd, 0xb246, 0xb24b, 0xb490, 0xb491, 0x52fd, 0xb492, 0xb493, 0xb494, 0xb55b, 0xb8f2, 0xb8f8, 0xb8f9, 0xbb94, 0xbba4, 0xbb97, 0xbb98, 0xbc29, 0xbcae, 0xbdaf, 0xc359, 0xc35a, 0x52fd, 0xc35b, 0xc35c, 0xc35d, 0xc35e, 0xc35f, 0xc360, 0xc361, 0xc2aa, 0xc362, 0xc363, 0xc364, 0xc365, 0xc366, 0xc367, 0xc368, 0xc369, 0xc36a, 0xc36b, 0xc36c, 0xc36d, 0xc36e, 0xc36f, 0x52fd, 0xc7b2, 0xc7b3, 0xc7b4, 0x10f9, 0xc7b5, 0xc7b6, 0xc7b7, 0xc7b8, 0xc7b9, 0xc7ba, 0xc7bb, 0xca88, 0x42b8, 0xce19, 0xce1a, 0xce1b, 0xcf16, 0xd10c, 0xd10d, 0xd10e, /* 0x64 */ 0xd10f, 0x52fd, 0xd283, 0xd284, 0xd285, 0xd583, 0xd584, 0xd6b0, 0x52fd, 0xd926, 0xd927, 0xd936, 0xd928, 0xd929, 0x52fd, 0x52fd, 0xdde7, 0xdde8, 0xdde9, 0x1453, 0xddea, 0xddeb, 0x52fd, 0xddec, 0xdded, 0xddee, 0xddef, 0xddf0, 0xddf1, 0xde0c, 0xddf2, 0xddf3, 0xddf4, 0xddf5, 0xddf6, 0xddf7, 0xddf8, 0xe0a3, 0xe0a4, 0xe0a5, 0xe0a6, 0xe0a7, 0x52fd, 0xe25c, 0x52fd, 0xe44b, 0xe4e1, 0xe615, 0x52fd, 0xe616, 0xe617, 0xe82c, 0xe82d, 0xe922, 0xe923, 0xea96, 0xea97, 0x52fd, 0xec2e, 0xec30, 0xec31, 0x52fd, 0xeddf, 0xee8b, 0xee8c, 0x52fd, 0xee8d, 0xeffc, 0xeffd, 0xeffe, 0xefff, 0xf117, 0xf12d, 0xf118, 0x4cf3, 0xf119, 0x52fd, 0xf112, 0xf11a, 0xf11b, 0xf11c, 0x1669, 0x52fd, 0xf397, 0x16e5, 0xf398, 0xf399, 0x52fd, 0xf6c4, 0x574f, 0x57cd, 0x5dc7, 0x641c, 0x641d, /* 0x65 */ 0x641e, 0x67e7, 0x67e9, 0x67ea, 0x67eb, 0x6c15, 0x6ff1, 0x6ff2, 0x72b6, 0x78a0, 0x7c4a, 0x7d20, 0x8160, 0x8161, 0x8141, 0x8162, 0x8603, 0x8604, 0x8ad9, 0x8ada, 0x8adb, 0x8adc, 0x8add, 0x52fd, 0x8ade, 0x8adf, 0x8ae0, 0x8ae1, 0x8ae2, 0x0812, 0x8ae3, 0x52fd, 0x8f31, 0x9405, 0x9406, 0x9407, 0x9772, 0x978a, 0x978b, 0x9788, 0x52fd, 0x978c, 0x978d, 0x978e, 0x978f, 0x9790, 0x9842, 0x9843, 0x52fd, 0x9dc1, 0x9dc2, 0x9dc3, 0x9dc4, 0xa3cb, 0xa622, 0x52fd, 0x52fd, 0xa8c3, 0xa8c4, 0xa8c5, 0xa8c6, 0xaa1e, 0xaa25, 0xabf3, 0xabf4, 0x52fd, 0xabf5, 0xad38, 0xad48, 0xadca, 0x3b4f, 0xb07a, 0xb07b, 0xb255, 0xb256, 0xb4b1, 0xb4b2, 0xb4b3, 0x52fd, 0xb4b4, 0xb4b5, 0xb7a4, 0xb900, 0xb901, 0xb902, 0xbbac, 0x52fd, 0xbcb3, 0xc3b6, 0xc3b7, 0xc3b8, 0xc3b9, 0xc3ba, 0xc3bb, /* 0x66 */ 0xc3bc, 0xc3bd, 0xc3be, 0xc3bf, 0xc3c0, 0xc3c1, 0xc3c2, 0xc3c3, 0xc3c4, 0xc3c5, 0xc3c6, 0xc3c7, 0xc7e3, 0xc7e4, 0xc7e5, 0xc7e6, 0xc7e7, 0x52fd, 0xcab5, 0xcaa1, 0xcb95, 0xce3b, 0xce3c, 0xce3d, 0xce3e, 0xcf14, 0xd120, 0xd121, 0xd122, 0xd123, 0xd124, 0xd296, 0xd297, 0xd298, 0xd494, 0xd495, 0xd496, 0xd497, 0xd498, 0xd58f, 0xd590, 0xd6bc, 0xd73b, 0xd93d, 0x52fd, 0xdbdf, 0xdc1e, 0xde23, 0xde24, 0xde49, 0xde25, 0xde26, 0xde27, 0xde28, 0x4925, 0xde29, 0xde2a, 0xde2e, 0xde2f, 0xde4e, 0xde30, 0xfbeb, 0xde31, 0xde32, 0xde33, 0xde34, 0xde35, 0xde36, 0x52fd, 0xde37, 0xde50, 0xde38, 0x52fd, 0xde39, 0xde3a, 0xde3b, 0xde3c, 0xde3d, 0xde3e, 0xe0b8, 0xe0b9, 0xe262, 0xe263, 0xe341, 0xe46d, 0x52fd, 0xe652, 0xe637, 0xe6db, 0xe83f, 0xe934, 0xeb5b, 0xec46, 0xec5a, /* 0x67 */ 0xec5b, 0xede1, 0xede2, 0xede3, 0xede4, 0xeea7, 0xeea8, 0xeea9, 0xf00f, 0xf02b, 0xf156, 0xf157, 0xf158, 0xf15e, 0xf159, 0xf15a, 0xf15b, 0xf15c, 0x52fd, 0xf168, 0x52fd, 0xf42c, 0xf3e2, 0xf3f3, 0xf5d2, 0xf656, 0xf6ce, 0xf761, 0xf99b, 0xf9b4, 0x575c, 0xfa10, 0x57d2, 0x5871, 0x5973, 0x5b2c, 0x5e94, 0x52fd, 0x643f, 0x6440, 0x67f9, 0x67fa, 0x67fd, 0x67fb, 0x6c1c, 0x6c1d, 0x6dff, 0x6e00, 0x6ff7, 0x9ffe, 0x52fd, 0x77b6, 0x7c54, 0x8177, 0x8179, 0x817a, 0x817b, 0x8369, 0x8b02, 0x8b03, 0x8b04, 0x8b05, 0x8b06, 0x8b07, 0x8b08, 0x8b09, 0x8b0a, 0x8b0b, 0x8b35, 0x52fd, 0x8f39, 0x941e, 0x941f, 0x9420, 0x9421, 0x52fd, 0x9422, 0x9423, 0x9424, 0x942c, 0x97b3, 0x97b5, 0x97b6, 0x97b7, 0x97b8, 0x9dd0, 0x9ffa, 0xa207, 0xa2bd, 0xa3d7, 0xa3d2, 0xa8db, 0xa8d6, 0x575d, /* 0x68 */ 0xad43, 0xadcf, 0xb0a3, 0xb0a4, 0xb0a5, 0xb0a6, 0xb0a7, 0xb0a8, 0xb0a9, 0xb25d, 0xb25e, 0xb4c9, 0xb4ca, 0xb4cb, 0xb4cc, 0xb906, 0xb907, 0x52fd, 0xbbc5, 0xbbf5, 0xbcb4, 0xbcb8, 0xbcb5, 0xc3fd, 0x1077, 0xc3fe, 0xc3ff, 0xc400, 0xc401, 0xc402, 0xc403, 0xc409, 0xc404, 0xc405, 0xc406, 0xc407, 0xc811, 0xc812, 0xc813, 0xc814, 0xc815, 0x4277, 0xcb98, 0xcb99, 0xd13c, 0xd12d, 0xd12e, 0x52fd, 0xd4bb, 0xd4bc, 0x1378, 0xd73d, 0xd947, 0xd948, 0xd949, 0xd94a, 0xdae1, 0xdae7, 0xdbeb, 0xdc20, 0xdc38, 0xde62, 0xde67, 0xde68, 0xde69, 0xde6a, 0xde6b, 0xde6d, 0xde6e, 0xde6f, 0xde70, 0xde71, 0xde72, 0xde8f, 0xde73, 0xde74, 0xde75, 0xde76, 0xde77, 0xe0c9, 0xe0ca, 0x4ae6, 0xe0cb, 0xe0cc, 0xe0cd, 0xe351, 0x52fd, 0x52fd, 0xe545, 0xe859, 0xe85a, 0xe85b, 0xe940, 0xeacf, /* 0x69 */ 0xeb5e, 0xec7b, 0xed93, 0xeebc, 0xf016, 0xf030, 0x52fd, 0xf18d, 0xf18e, 0x4d2f, 0xf18f, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf195, 0xf196, 0xf423, 0xf414, 0xf5db, 0xf70a, 0xf8ce, 0x5766, 0x5768, 0x5767, 0x57d3, 0x6463, 0x6804, 0x699e, 0x6c26, 0x6c2a, 0x7c6c, 0x7c64, 0x818f, 0x8190, 0x8334, 0x860e, 0x8b25, 0x8b26, 0x8b27, 0x52fd, 0x8b28, 0x2c0c, 0x52fd, 0x8b29, 0x8b2a, 0x8b2b, 0x8b2c, 0x8f3e, 0x9442, 0x9443, 0x9433, 0x97c1, 0x97c2, 0x97c3, 0x9dd6, 0x9dd7, 0xa8e1, 0xa8e2, 0xaa2b, 0xadd1, 0xb0cc, 0xb0cd, 0xb0ce, 0xb0cf, 0xb4de, 0xb4df, 0xb4e0, 0xb4e1, 0xbbf6, 0xc42c, 0x52fd, 0xc454, 0xc42d, 0xc42e, 0xc841, 0xc842, 0xcac7, 0xcba0, 0xcba1, 0xce70, 0xce71, 0xce72, 0x52fd, 0xd134, 0xd135, 0xd136, 0xd2a6, 0xd4cc, 0x52fd, 0xd599, 0xdbf4, 0xde9b, /* 0x6a */ 0xde9e, 0xde9f, 0xdea0, 0xdea1, 0xdea2, 0xdea3, 0xdea4, 0xdea5, 0xdea6, 0xdea7, 0xdea8, 0xe0db, 0xe0dc, 0xe0dd, 0xe0d7, 0xe0de, 0xe0df, 0xe359, 0xe746, 0xe865, 0xe949, 0x52fd, 0xeadd, 0xec95, 0xec96, 0xec97, 0xeed4, 0xeed6, 0xf026, 0x4d47, 0x1688, 0xf1c8, 0xf1c5, 0xf1c6, 0xf1c7, 0xf451, 0xf452, 0xf453, 0xf454, 0xf455, 0xf5de, 0x52fd, 0x576d, 0x57d5, 0x6472, 0x74ae, 0x760f, 0x7c6b, 0x7c6d, 0x7c6e, 0x7c78, 0x8198, 0x8199, 0x819a, 0x8b44, 0x8b5c, 0x8b45, 0x8e01, 0x9458, 0x9459, 0x945a, 0x52fd, 0x97d9, 0x97d6, 0x9dda, 0x9ddf, 0x9ddb, 0xa003, 0xa8ef, 0x3836, 0xaa33, 0xadd2, 0xb0e1, 0xb26f, 0xb564, 0xb90e, 0xc450, 0xc451, 0xc452, 0xc856, 0xc857, 0xc858, 0x52fd, 0xce81, 0xce82, 0xcf1d, 0xcf1e, 0xd143, 0xd2aa, 0xdbfd, 0x52fd, 0xdec6, 0xdec7, 0xded9, /* 0x6b */ 0xded7, 0x52fd, 0xdec8, 0xdec9, 0xdeca, 0xdecb, 0xdeda, 0x52fd, 0xdecc, 0xdecd, 0xdece, 0xdecf, 0xded0, 0xded1, 0xdebc, 0xe0e1, 0xe0e2, 0xe0e3, 0xe4a9, 0xe54e, 0xe877, 0x52fd, 0x52fd, 0xecac, 0xecad, 0xedb6, 0xeee5, 0xf1f8, 0xf1ea, 0xf28d, 0xf1eb, 0xf495, 0x576e, 0x57d8, 0x6483, 0x69a3, 0x6c30, 0x6e0f, 0x7c79, 0x7c7a, 0x81a7, 0x81a8, 0x81a9, 0x81aa, 0x8619, 0x8b50, 0x8b51, 0x8b52, 0x2c15, 0x8b68, 0x8b53, 0x8b54, 0x9be2, 0x9ddc, 0xac15, 0xac16, 0xad4f, 0xb0f5, 0xb0f6, 0xb0f7, 0xb4f4, 0xb7cc, 0xb90f, 0xc466, 0xc467, 0x52fd, 0xc468, 0xcba4, 0xce8b, 0xce8c, 0xd4fa, 0xdee6, 0xdeed, 0xdeee, 0xdeef, 0xdef0, 0xdefe, 0xe0e7, 0xe0e8, 0xe4b3, 0xe4e4, 0xe883, 0xedec, 0x52fd, 0xf216, 0x52fd, 0x52fd, 0xf217, 0xf4c3, 0xf4ac, 0xf5ed, 0x52fd, 0x52fd, 0xf8b4, /* 0x6c */ 0x52fd, 0x648a, 0x648b, 0x6c34, 0x6e14, 0x72df, 0x77bb, 0x7c7f, 0x7c81, 0x81ad, 0x81ae, 0x8b62, 0x8b6e, 0x52fd, 0x946e, 0x52fd, 0x9a17, 0x9de6, 0x9f10, 0xac19, 0x52fd, 0xb910, 0xbdf2, 0xc476, 0xc477, 0xce95, 0xce96, 0xdf00, 0xdf01, 0xdf31, 0xfbed, 0xdf1c, 0xe36d, 0xeef4, 0xeef5, 0xf03d, 0xf232, 0xf233, 0xf5f4, 0x52fd, 0x5773, 0x6c37, 0x52fd, 0x8b71, 0xb10f, 0x52fd, 0xb10e, 0xb911, 0xc485, 0xdf14, 0xdf15, 0xdf16, 0xdf17, 0xdf18, 0xdf19, 0xdf1a, 0xe4c3, 0xf242, 0xf243, 0xf244, 0xf248, 0xf4fb, 0x69a5, 0x6cb8, 0x81b2, 0x833d, 0x8b72, 0x97e7, 0x97e8, 0xa659, 0xaa3a, 0xb114, 0xb4ff, 0xbcc0, 0xc48d, 0x1084, 0xc48e, 0x52fd, 0xdf22, 0x52fd, 0x52fd, 0xef04, 0xef29, 0xf251, 0xf266, 0xf50e, 0xfc13, 0x52fd, 0x649b, 0x649c, 0x7616, 0x7c86, 0x7c87, 0x52fd, /* 0x6d */ 0xdf2c, 0xdf30, 0xdf28, 0xe95f, 0x52fd, 0x947e, 0xb119, 0xd50a, 0xdf36, 0xe0fc, 0xf26d, 0xf26e, 0xf9c6, 0x1ab5, 0x8b7b, 0xb506, 0xc89f, 0xf532, 0xd50d, 0x7c8b, 0xdf3b, 0x52fd, 0xf53d, 0xdf3c, 0xdf3d, }; static const ucs4_t cns11643_15_2uni_upages[253] = { 0x03400, 0x03500, 0x03600, 0x03700, 0x03800, 0x03900, 0x03a00, 0x03b00, 0x03c00, 0x03d00, 0x03e00, 0x03f00, 0x04000, 0x04100, 0x04300, 0x04400, 0x04500, 0x04600, 0x04700, 0x04800, 0x04900, 0x04a00, 0x04c00, 0x04f00, 0x05100, 0x05200, 0x05300, 0x05400, 0x05500, 0x05600, 0x05700, 0x05800, 0x05a00, 0x05b00, 0x05c00, 0x05e00, 0x05f00, 0x06200, 0x06500, 0x06600, 0x06700, 0x06800, 0x06900, 0x06a00, 0x06b00, 0x06c00, 0x06e00, 0x06f00, 0x07000, 0x07100, 0x07300, 0x07400, 0x07500, 0x07600, 0x07700, 0x07800, 0x07900, 0x07a00, 0x07b00, 0x07c00, 0x07d00, 0x07f00, 0x08200, 0x08300, 0x08600, 0x08700, 0x08900, 0x08a00, 0x08e00, 0x08f00, 0x09000, 0x09200, 0x09300, 0x09400, 0x09500, 0x09600, 0x09b00, 0x09c00, 0x09d00, 0x09e00, 0x09f00, 0x0fa00, 0x0ff00, 0x20000, 0x20100, 0x20200, 0x20300, 0x20400, 0x20500, 0x20600, 0x20700, 0x20800, 0x20900, 0x20a00, 0x20b00, 0x20c00, 0x20d00, 0x20e00, 0x20f00, 0x21000, 0x21100, 0x21200, 0x21300, 0x21400, 0x21500, 0x21600, 0x21700, 0x21800, 0x21900, 0x21a00, 0x21b00, 0x21c00, 0x21d00, 0x21e00, 0x21f00, 0x22000, 0x22100, 0x22200, 0x22300, 0x22400, 0x22500, 0x22600, 0x22700, 0x22800, 0x22900, 0x22a00, 0x22b00, 0x22c00, 0x22d00, 0x22e00, 0x22f00, 0x23000, 0x23100, 0x23200, 0x23300, 0x23400, 0x23500, 0x23600, 0x23700, 0x23800, 0x23900, 0x23a00, 0x23b00, 0x23c00, 0x23d00, 0x23e00, 0x23f00, 0x24000, 0x24100, 0x24200, 0x24300, 0x24400, 0x24500, 0x24600, 0x24700, 0x24800, 0x24900, 0x24a00, 0x24b00, 0x24c00, 0x24d00, 0x24e00, 0x24f00, 0x25000, 0x25100, 0x25200, 0x25300, 0x25400, 0x25500, 0x25600, 0x25700, 0x25800, 0x25900, 0x25a00, 0x25b00, 0x25c00, 0x25d00, 0x25e00, 0x25f00, 0x26000, 0x26100, 0x26200, 0x26300, 0x26400, 0x26500, 0x26600, 0x26700, 0x26800, 0x26900, 0x26a00, 0x26b00, 0x26c00, 0x26d00, 0x26e00, 0x26f00, 0x27000, 0x27100, 0x27200, 0x27300, 0x27400, 0x27500, 0x27600, 0x27700, 0x27800, 0x27900, 0x27a00, 0x27b00, 0x27c00, 0x27d00, 0x27e00, 0x27f00, 0x28000, 0x28100, 0x28200, 0x28300, 0x28400, 0x28500, 0x28600, 0x28700, 0x28800, 0x28900, 0x28a00, 0x28b00, 0x28c00, 0x28d00, 0x28e00, 0x28f00, 0x29000, 0x29100, 0x29200, 0x29300, 0x29400, 0x29500, 0x29600, 0x29700, 0x29800, 0x29900, 0x29a00, 0x29b00, 0x29c00, 0x29d00, 0x29e00, 0x29f00, 0x2a000, 0x2a100, 0x2a200, 0x2a300, 0x2a400, 0x2a500, 0x2a600, 0x2f800, 0x2f900, 0x2fa00, }; static int cns11643_15_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x21 && c1 <= 0x6d)) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x21 && c2 < 0x7f) { unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); ucs4_t wc = 0xfffd; unsigned short swc; { if (i < 7169) swc = cns11643_15_2uni_page21[i], wc = cns11643_15_2uni_upages[swc>>8] | (swc & 0xff); } if (wc != 0xfffd) { *pwc = wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } freelan-2.0/third-party/source/libiconv-msvc/include/cns11643_2.h000066400000000000000000002004631252300335000245060ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CNS 11643-1992 plane 2 */ static const unsigned short cns11643_2_2uni_page21[7650] = { /* 0x21 */ 0x4e42, 0x4e5c, 0x51f5, 0x531a, 0x5382, 0x4e07, 0x4e0c, 0x4e47, 0x4e8d, 0x56d7, 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, 0x5209, 0x531c, 0x534c, 0x5722, 0x5723, 0x5917, 0x592f, 0x5b81, 0x5b84, 0x5c12, 0x5c3b, 0x5c74, 0x5c73, 0x5e04, 0x5e80, 0x5e82, 0x5fc9, 0x6209, 0x6250, 0x6c15, 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, 0x5210, 0x52a6, /* 0x22 */ 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, 0x6537, 0x65ef, 0x65ee, 0x673e, 0x6739, 0x6738, 0x673b, 0x673a, 0x673f, 0x673c, 0x6733, 0x6c18, 0x6c46, 0x6c52, 0x6c5c, 0x6c4f, 0x6c4a, 0x6c54, 0x6c4b, 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, /* 0x23 */ 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, 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, /* 0x24 */ 0x5fe3, 0x5ffa, 0x5fef, 0x5ff7, 0x5ffb, 0x6000, 0x5ff4, 0x623a, 0x6283, 0x628c, 0x628e, 0x628f, 0x6294, 0x6287, 0x6271, 0x627b, 0x627a, 0x6270, 0x6281, 0x6288, 0x6277, 0x627d, 0x6272, 0x6274, 0x65f0, 0x65f4, 0x65f3, 0x65f2, 0x65f5, 0x6745, 0x6747, 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, /* 0x25 */ 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, /* 0x26 */ 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, 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, /* 0x27 */ 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, 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, /* 0x28 */ 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, 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, /* 0x29 */ 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, 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, /* 0x2a */ 0x5cdb, 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, /* 0x2b */ 0x67ba, 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, 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, /* 0x2c */ 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, 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, /* 0x2d */ 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, 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, /* 0x2e */ 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, 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, /* 0x2f */ 0x605a, 0x6067, 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, /* 0x30 */ 0x6be6, 0x6be4, 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, 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, /* 0x31 */ 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, 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, /* 0x32 */ 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, 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, /* 0x33 */ 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, 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, /* 0x34 */ 0x5530, 0x5552, 0x5545, 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, /* 0x35 */ 0x5d26, 0x5d25, 0x5d0f, 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, 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, /* 0x36 */ 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, 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, /* 0x37 */ 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, 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, 0x7b3b, 0x7b34, 0x7b25, 0x7b30, 0x7b22, 0x7b24, 0x7b33, 0x7b18, 0x7b2a, 0x7b1d, 0x7b31, 0x7b2b, 0x7b2d, 0x7b2f, 0x7b32, 0x7b38, /* 0x38 */ 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, 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, 0x8659, /* 0x39 */ 0x8656, 0x86bf, 0x86b7, 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, /* 0x3a */ 0x91e4, 0x91f9, 0x91ea, 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, 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, /* 0x3b */ 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, 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, /* 0x3c */ 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, 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, /* 0x3d */ 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, 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, /* 0x3e */ 0x742c, 0x7430, 0x742b, 0x7416, 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, 0x7b47, 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, /* 0x3f */ 0x7d4e, 0x7f3e, 0x7f3f, 0x7f65, 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, 0x83d5, 0x83fa, 0x83c7, 0x83d1, 0x83ea, 0x8413, 0x839a, 0x83c3, 0x83ec, 0x83ee, 0x83c4, 0x83fb, 0x83d7, 0x83e2, 0x841b, 0x83db, 0x83fe, 0x86d8, 0x86e2, 0x86e6, 0x86d3, 0x86e3, 0x86da, 0x86ea, 0x86dd, 0x86eb, 0x86dc, /* 0x40 */ 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, 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, /* 0x41 */ 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, 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, /* 0x42 */ 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, 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, /* 0x43 */ 0x63eb, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, 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, /* 0x44 */ 0x6b48, 0x6b41, 0x6b9b, 0x6bfb, 0x6bfc, 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, 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, /* 0x45 */ 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, 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, /* 0x46 */ 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, 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, /* 0x47 */ 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, 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, /* 0x48 */ 0x8f07, 0x8f08, 0x8f02, 0x8f0b, 0x9052, 0x903f, 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, /* 0x49 */ 0x50d3, 0x50ec, 0x50f0, 0x50ef, 0x50e3, 0x50e0, 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, 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, /* 0x4a */ 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, 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, /* 0x4b */ 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, 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, /* 0x4c */ 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, 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, /* 0x4d */ 0x7da1, 0x7dc9, 0x7f73, 0x7fe2, 0x7fe3, 0x7fe5, 0x7fde, 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, /* 0x4e */ 0x88f2, 0x88fa, 0x88fe, 0x88ee, 0x88fc, 0x88f6, 0x88fb, 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, 0x92a6, 0x929a, 0x92ab, 0x9279, 0x9297, 0x927f, 0x92a3, 0x92ee, 0x928e, 0x9282, 0x9295, 0x92a2, 0x927d, 0x9288, 0x92a1, 0x928a, 0x9286, 0x928c, 0x9299, 0x92a7, 0x927e, 0x9287, 0x92a9, 0x929d, /* 0x4f */ 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, 0x565a, 0x5640, 0x5633, 0x563d, 0x562c, 0x563e, 0x5638, 0x562a, 0x563a, 0x571a, 0x58ab, 0x589d, 0x58b1, 0x58a0, 0x58a3, 0x58af, 0x58ac, 0x58a5, 0x58a1, 0x58ff, 0x5aff, 0x5af4, 0x5afd, 0x5af7, /* 0x50 */ 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, 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, /* 0x51 */ 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, 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, /* 0x52 */ 0x735e, 0x735f, 0x7360, 0x735d, 0x735b, 0x7361, 0x735a, 0x7359, 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, /* 0x53 */ 0x7fea, 0x7fec, 0x7fe6, 0x7fe8, 0x8064, 0x8067, 0x81a3, 0x819f, 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, 0x8756, 0x8763, 0x8764, 0x8777, 0x87e1, 0x8773, 0x8758, 0x8754, 0x875b, 0x8752, 0x8761, 0x875a, 0x8751, 0x875e, 0x876d, 0x876a, 0x8750, 0x874e, 0x875f, 0x875d, 0x876f, 0x876c, 0x877a, /* 0x54 */ 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, 0x8e14, 0x8e12, 0x8e18, 0x8e13, 0x8e1c, 0x8e17, 0x8e1a, 0x8f2c, 0x8f24, 0x8f18, 0x8f1a, 0x8f20, 0x8f23, 0x8f16, 0x8f17, 0x9073, 0x9070, 0x906f, 0x9067, 0x906b, 0x912f, 0x912b, 0x9129, /* 0x55 */ 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, 0x92b5, 0x92e1, 0x9325, 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, /* 0x56 */ 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, 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, /* 0x57 */ 0x5fbc, 0x5fbb, 0x619d, 0x61a8, 0x6196, 0x61c5, 0x61b4, 0x61c6, 0x61c1, 0x61cc, 0x61ba, 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, /* 0x58 */ 0x6fca, 0x6fa8, 0x7004, 0x6fa5, 0x6fae, 0x6fba, 0x6fac, 0x6faa, 0x6fcf, 0x6fbf, 0x6fb8, 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, 0x7797, 0x78dd, 0x78e9, 0x78e5, 0x78ea, 0x78de, 0x78e3, 0x78db, 0x78e1, 0x78e2, 0x78ed, 0x78df, 0x78e0, 0x79a4, 0x7a44, 0x7a48, 0x7a47, 0x7ab6, 0x7ab8, 0x7ab5, /* 0x59 */ 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, 0x8540, 0x8546, 0x8564, 0x8541, 0x8562, 0x8544, 0x8551, 0x8547, 0x8563, 0x853e, 0x855b, 0x8571, 0x854e, 0x856e, 0x8575, 0x8555, 0x8567, 0x8560, 0x858c, 0x8566, /* 0x5a */ 0x855d, 0x8554, 0x8565, 0x856c, 0x8663, 0x8665, 0x8664, 0x87a4, 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, 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, /* 0x5b */ 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, 0x9313, 0x92f9, 0x92f7, 0x9334, 0x9302, 0x9324, 0x92ff, 0x9329, 0x9339, 0x9335, 0x932a, 0x9314, 0x930c, 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, /* 0x5c */ 0x9b80, 0x9b85, 0x9b87, 0x9b7c, 0x9b7e, 0x9b7b, 0x9b82, 0x9b93, 0x9b92, 0x9b90, 0x9b7a, 0x9b95, 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, 0x61c3, 0x61b5, 0x61bc, 0x61e7, 0x61e0, 0x61e5, 0x61e4, 0x61e8, 0x61de, 0x64ef, 0x64e9, 0x64e3, 0x64eb, 0x64e4, 0x64e8, 0x6581, 0x6580, 0x65b6, 0x65da, 0x66d2, 0x6a8d, /* 0x5d */ 0x6a96, 0x6a81, 0x6aa5, 0x6a89, 0x6a9f, 0x6a9b, 0x6aa1, 0x6a9e, 0x6a87, 0x6a93, 0x6a8e, 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, 0x77b4, 0x77b1, 0x77a8, 0x77f0, 0x78f3, 0x78fd, 0x7902, 0x78fb, 0x78fc, 0x78ff, 0x78f2, 0x7905, 0x78f9, 0x78fe, 0x7904, 0x79ab, 0x79a8, 0x7a5c, 0x7a5b, 0x7a56, /* 0x5e */ 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, 0x8577, 0x857c, 0x8589, 0x85a1, 0x857a, 0x8578, 0x8557, 0x858e, 0x8596, 0x8586, 0x858d, 0x8599, 0x859d, 0x8581, 0x85a2, 0x8582, 0x8588, 0x8585, 0x8579, /* 0x5f */ 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, 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, /* 0x60 */ 0x937c, 0x9358, 0x935c, 0x9376, 0x9349, 0x9350, 0x9351, 0x9360, 0x936d, 0x938f, 0x934c, 0x936a, 0x9379, 0x9357, 0x9355, 0x9352, 0x934f, 0x9371, 0x9377, 0x937b, 0x9361, 0x935e, 0x9363, 0x9367, 0x934e, 0x9359, 0x95c7, 0x95c0, 0x95c9, 0x95c3, 0x95c5, 0x95b7, 0x96ae, 0x96b0, 0x96ac, 0x9720, 0x971f, 0x9718, 0x971d, 0x9719, 0x979a, 0x97a1, 0x979c, 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, /* 0x61 */ 0x9ba2, 0x9ba0, 0x9baf, 0x9d33, 0x9d41, 0x9d67, 0x9d36, 0x9d2e, 0x9d2f, 0x9d31, 0x9d38, 0x9d30, 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, /* 0x62 */ 0x7000, 0x6ffb, 0x7026, 0x6ffc, 0x6ff7, 0x700a, 0x7201, 0x71ff, 0x71f9, 0x7203, 0x71fd, 0x7376, 0x74b8, 0x74c0, 0x74b5, 0x74c1, 0x74be, 0x74b6, 0x74bb, 0x74c2, 0x7514, 0x7513, 0x765c, 0x7664, 0x7659, 0x7650, 0x7653, 0x7657, 0x765a, 0x76a6, 0x76bd, 0x76ec, 0x77c2, 0x77ba, 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, 0x81d0, 0x825f, 0x825e, 0x85b4, 0x85c6, 0x85c0, 0x85c3, 0x85c2, 0x85b3, 0x85b5, 0x85bd, 0x85c7, 0x85c4, 0x85bf, 0x85cb, 0x85ce, 0x85c8, 0x85c5, 0x85b1, 0x85b6, /* 0x63 */ 0x85d2, 0x8624, 0x85b8, 0x85b7, 0x85be, 0x8669, 0x87e7, 0x87e6, 0x87e2, 0x87db, 0x87eb, 0x87ea, 0x87e5, 0x87df, 0x87f3, 0x87e4, 0x87d4, 0x87dc, 0x87d3, 0x87ed, 0x87d8, 0x87e3, 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, 0x8e5b, 0x8e5a, 0x8e61, 0x8e5d, 0x8e69, 0x8e54, 0x8f46, 0x8f47, 0x8f48, 0x8f4b, 0x9128, 0x913a, 0x913b, 0x913e, 0x91a8, 0x91a5, 0x91a7, 0x91af, 0x91aa, 0x93b5, 0x938c, /* 0x64 */ 0x9392, 0x93b7, 0x939b, 0x939d, 0x9389, 0x93a7, 0x938e, 0x93aa, 0x939e, 0x93a6, 0x9395, 0x9388, 0x9399, 0x939f, 0x9380, 0x938d, 0x93b1, 0x9391, 0x93b2, 0x93a4, 0x93a8, 0x93b4, 0x93a3, 0x95d2, 0x95d3, 0x95d1, 0x96b3, 0x96d7, 0x96da, 0x5dc2, 0x96df, 0x96d8, 0x96dd, 0x9723, 0x9722, 0x9725, 0x97ac, 0x97ae, 0x97a8, 0x97ab, 0x97a4, 0x97aa, 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, /* 0x65 */ 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, 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, 0x720c, 0x720a, 0x7207, 0x7202, 0x7205, 0x72a5, 0x72a6, 0x72a4, 0x72a3, 0x72a1, 0x74cb, 0x74c5, /* 0x66 */ 0x74b7, 0x74c3, 0x7516, 0x7660, 0x77c9, 0x77ca, 0x77c4, 0x77f1, 0x791d, 0x791b, 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, 0x820b, 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, /* 0x67 */ 0x89b6, 0x89f6, 0x8b50, 0x8b48, 0x8b4a, 0x8b40, 0x8b53, 0x8b56, 0x8b54, 0x8b4b, 0x8b55, 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, 0x93a5, 0x93e7, 0x957d, 0x95da, 0x95db, 0x96e1, 0x9729, 0x972b, 0x972c, 0x9728, 0x9726, 0x97b3, 0x97b7, 0x97b6, 0x97dd, 0x97de, 0x97df, 0x985c, 0x9859, 0x985d, 0x9857, 0x98bf, 0x98bd, 0x98bb, 0x98be, 0x9948, 0x9947, 0x9943, 0x99a6, 0x99a7, /* 0x68 */ 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, 0x56b5, 0x56b3, 0x58e3, 0x5b45, 0x5dc6, 0x5dc7, 0x5eee, 0x5eef, 0x5fc0, 0x5fc1, 0x61f9, 0x6517, 0x6516, 0x6515, 0x6513, 0x65df, 0x66e8, 0x66e3, 0x66e4, /* 0x69 */ 0x6af3, 0x6af0, 0x6aea, 0x6ae8, 0x6af9, 0x6af1, 0x6aee, 0x6aef, 0x703c, 0x7035, 0x702f, 0x7037, 0x7034, 0x7031, 0x7042, 0x7038, 0x703f, 0x703a, 0x7039, 0x702a, 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, 0x79b2, 0x7a6e, 0x7a6c, 0x7a6d, 0x7af7, 0x7c49, 0x7c48, 0x7c4a, 0x7c47, 0x7c45, 0x7cee, 0x7e7b, 0x7e7e, 0x7e81, 0x7e80, 0x7fba, 0x7fff, 0x8079, 0x81db, 0x81d9, 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, /* 0x6a */ 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, 0x943c, 0x940a, 0x93ff, 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, /* 0x6b */ 0x9c07, 0x9c0e, 0x9c06, 0x9c17, 0x9c14, 0x9c09, 0x9d9f, 0x9d99, 0x9da4, 0x9d9d, 0x9d92, 0x9d98, 0x9d90, 0x9d9b, 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, /* 0x6c */ 0x8618, 0x862a, 0x8626, 0x861f, 0x8623, 0x861c, 0x8619, 0x8627, 0x862e, 0x8621, 0x8620, 0x8629, 0x861e, 0x8625, 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, 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, 0x9a3f, 0x9acd, 0x9b15, 0x9b17, 0x9b18, 0x9b16, 0x9b3a, 0x9b52, 0x9c2b, 0x9c1d, 0x9c1c, 0x9c2c, 0x9c23, 0x9c28, 0x9c29, 0x9c24, 0x9c21, 0x9db7, /* 0x6d */ 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, 0x7cf4, 0x7cf1, 0x7e91, 0x7f4f, 0x7f87, 0x81de, 0x826b, 0x8634, 0x8635, 0x8633, 0x862c, 0x8632, 0x8636, 0x882c, 0x8828, 0x8826, 0x882a, 0x8825, /* 0x6e */ 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, 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, /* 0x6f */ 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, 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, /* 0x70 */ 0x9df3, 0x9de8, 0x9ded, 0x9ec2, 0x9ed0, 0x9ef2, 0x9ef3, 0x9f06, 0x9f1c, 0x9f38, 0x9f37, 0x9f36, 0x9f43, 0x9f4f, 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, /* 0x71 */ 0x6b18, 0x6b19, 0x6b17, 0x6b1a, 0x7062, 0x7226, 0x72aa, 0x77d8, 0x77d9, 0x7939, 0x7c69, 0x7c6b, 0x7cf6, 0x7e9a, 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, 0x9b2e, 0x9c74, 0x9c73, 0x9c71, 0x9c75, 0x9e14, 0x9e13, 0x9ef6, 0x9f0a, 0x9fa4, 0x7068, 0x7065, 0x7cf7, 0x866a, 0x883e, 0x883d, 0x883f, 0x8b9e, 0x8c9c, 0x8ea9, 0x8ec9, 0x974b, 0x9873, 0x9874, 0x98cc, /* 0x72 */ 0x9961, 0x99ab, 0x9a64, 0x9a66, 0x9a67, 0x9b24, 0x9e15, 0x9e17, 0x9f48, 0x6207, 0x6b1e, 0x7227, 0x864c, 0x8ea8, 0x9482, 0x9480, 0x9481, 0x9a69, 0x9a68, 0x9e19, 0x864b, 0x8b9f, 0x9483, 0x9c79, 0x9eb7, 0x7675, 0x9a6b, 0x9c7a, 0x9e1d, 0x7069, 0x706a, 0x7229, 0x9ea4, 0x9f7e, 0x9f49, 0x9f98, }; static int cns11643_2_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x21 && c1 <= 0x72)) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x21 && c2 < 0x7f) { unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); unsigned short wc = 0xfffd; { if (i < 7650) wc = cns11643_2_2uni_page21[i]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } freelan-2.0/third-party/source/libiconv-msvc/include/cns11643_3.h000066400000000000000000001600071252300335000245060ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CNS 11643-1992 plane 3 */ static const unsigned short cns11643_3_2uni_page21[6148] = { /* 0x21 */ 0x1a28, 0x1a36, 0x1a3f, 0x1a85, 0x1a05, 0x1a04, 0x1d82, 0x1d96, 0x1f38, 0x1f69, 0x1fb6, 0x1a2a, 0x1a87, 0x1a49, 0x1de2, 0x1a46, 0x1a8f, 0x1abc, 0x1abe, 0x1d66, 0x1de3, 0x1e04, 0x1e9c, 0x1f44, 0x2502, 0x250a, 0x2780, 0x29db, 0x2a7a, 0x2a7f, 0x2af4, 0x2b50, 0x2b51, 0x2b61, 0x621d, 0x6d0b, 0x1a63, 0x1a62, 0x1aa3, 0x1d85, 0x1ac5, 0x1acf, 0x1ace, 0x1acc, 0x1d84, 0x1d86, 0x8517, 0x00c5, 0x1de4, 0x1e05, 0x1e9e, 0x1e9d, 0x1efd, 0x1f00, 0x1f3a, 0x0139, 0x1f46, 0x1f5d, 0x1f86, 0x1fb7, 0x0155, 0x1fcc, 0x015b, 0x1fce, 0x2321, 0x03a2, 0x2a00, 0x2b0c, 0x2e37, 0x2e38, 0x3134, 0x3135, 0x31e0, 0x0a26, 0x3f8d, 0x1a97, 0x1ae0, 0x0032, 0x6ea9, 0x1ae7, 0x0033, 0x1ae6, 0x0034, 0x02a2, 0x0031, 0x00b0, 0x22d8, 0x1d8b, 0x1d8c, 0x1d99, 0x1de5, 0x8550, 0x1e0b, 0x00dc, /* 0x22 */ 0x021e, 0x1f04, 0x1f03, 0x1f07, 0x852a, 0x1f1e, 0x1f5f, 0x1f6d, 0x1f89, 0x1fba, 0x1fd0, 0x0165, 0x1ff6, 0x1ff7, 0x1ff9, 0x0164, 0x1ff4, 0x021d, 0x0226, 0x2324, 0x2504, 0x2518, 0x2532, 0x2530, 0x2534, 0x028e, 0x2575, 0x034a, 0x2782, 0x27f9, 0x2814, 0x038b, 0x03a6, 0x03a4, 0x03a5, 0x03a7, 0x042f, 0x0432, 0x2a81, 0x2a83, 0x2b0d, 0x2b52, 0x04d4, 0x2bca, 0x2bc7, 0x2e39, 0x05c5, 0x2e4f, 0x31e7, 0x332f, 0x377a, 0x3839, 0x08ba, 0x08b9, 0x3837, 0x3844, 0x3845, 0x3f8c, 0x4192, 0x4276, 0x5c93, 0x5c92, 0x14b3, 0x15ba, 0x1a21, 0x1a20, 0x1a22, 0x1a68, 0x1a89, 0x1a98, 0x1af9, 0x1aef, 0x003b, 0x003c, 0x1af8, 0x1b06, 0x1b03, 0x1afc, 0x1aee, 0x1b16, 0x0039, 0x1b28, 0x1b1c, 0x1b07, 0x1b1a, 0x1afa, 0x1b17, 0x1d4a, 0x00b2, 0x1d72, 0x8515, 0x1db4, 0x1db3, 0x1db2, /* 0x23 */ 0x00c7, 0x1de8, 0x002b, 0x1e14, 0x1e0f, 0x1e15, 0x1e18, 0x1ea8, 0x852c, 0x1f4b, 0x1f4f, 0x013b, 0x1f50, 0x0144, 0x1f8b, 0x0142, 0x1fbe, 0x015c, 0x1fd2, 0x2016, 0x1fff, 0x0167, 0x2000, 0x0166, 0x2005, 0x2013, 0x2015, 0x853b, 0x021f, 0x22e3, 0x2335, 0x2336, 0x2331, 0x2332, 0x24ee, 0x2505, 0x1a54, 0x028f, 0x2536, 0x0290, 0x02a8, 0x02a4, 0x257a, 0x02a3, 0x2586, 0x033d, 0x034c, 0x2786, 0x2b53, 0x2818, 0x038c, 0x283d, 0x2878, 0x03a8, 0x03ad, 0x03af, 0x7746, 0x2880, 0x0429, 0x2a08, 0x0436, 0x0471, 0x0470, 0x046f, 0x2af5, 0x2b0e, 0x04a9, 0x04aa, 0x04fb, 0x2bd3, 0x2bda, 0x04fc, 0x2bdb, 0x05ae, 0x2e0f, 0x2e5d, 0x2e5f, 0x2e67, 0x2e57, 0x6b50, 0x06c3, 0x31eb, 0x31ea, 0x0730, 0x3337, 0x0741, 0x3332, 0x3336, 0x3722, 0x37ce, 0x088c, 0x3858, 0x3851, 0x3877, /* 0x24 */ 0x383c, 0x08bb, 0x385a, 0x7c86, 0x3853, 0x3c6f, 0x3c72, 0x3c6e, 0x8535, 0x09a1, 0x3c73, 0x3eb1, 0x3eb2, 0x0aa8, 0x3f8f, 0x0aaa, 0x0aab, 0x0c96, 0x453c, 0x0dc2, 0x4c8d, 0x4c8e, 0x1093, 0x4e7b, 0x1094, 0x5971, 0x5bb9, 0x5c96, 0x5c9a, 0x15bb, 0x1a24, 0x1a71, 0x851b, 0x1a9c, 0x1b45, 0x1b4a, 0x1b39, 0x1b37, 0x0043, 0x1b32, 0x1b42, 0x0042, 0x1b44, 0x1b4b, 0x0044, 0x1b40, 0x1b35, 0x1b31, 0x1d51, 0x850e, 0x1d50, 0x1d4e, 0x00b3, 0x00b7, 0x1d9d, 0x00c8, 0x1db5, 0x1db8, 0x1dec, 0x1e23, 0x1e27, 0x1e26, 0x1e1f, 0x1e2b, 0x1e20, 0x1eb4, 0x1eb3, 0x0118, 0x1f25, 0x1f3b, 0x1f74, 0x0147, 0x0146, 0x0145, 0x016b, 0x0169, 0x204d, 0x0172, 0x0171, 0x203a, 0x016c, 0x016f, 0x2044, 0x204c, 0x2023, 0x201a, 0x2032, 0x204b, 0x2021, 0x0173, 0x2034, 0x2049, 0x2050, 0x2022, /* 0x25 */ 0x203f, 0x2051, 0x205a, 0x202f, 0x0176, 0x22e9, 0x22f2, 0x22f3, 0x22ef, 0x22ed, 0x22ec, 0x22e6, 0x2348, 0x0227, 0x2344, 0x233f, 0x233c, 0x2353, 0x2356, 0x0230, 0x235f, 0x2343, 0x2358, 0x2357, 0x0229, 0x022a, 0x022f, 0x2346, 0x022c, 0x233d, 0x022d, 0x2342, 0x2354, 0x2355, 0x24f1, 0x24f2, 0x24f0, 0x250b, 0x6aa6, 0x22f1, 0x253d, 0x0293, 0x2594, 0x258c, 0x02ad, 0x259c, 0x02ac, 0x02ab, 0x259f, 0x02a9, 0x259b, 0x02ae, 0x2589, 0x259a, 0x02aa, 0x3188, 0x034e, 0x278d, 0x0350, 0x27fe, 0x27ff, 0x27fd, 0x282b, 0x03b2, 0x2884, 0x288e, 0x289c, 0x03b5, 0x03b6, 0x2885, 0x29f5, 0x2a09, 0x0439, 0x043b, 0x2a0b, 0x0472, 0x2a92, 0x2a90, 0x2b03, 0x04ac, 0x2b1e, 0x2b63, 0x0508, 0x2be7, 0x2bfe, 0x2be6, 0x2bdc, 0x2bce, 0x0503, 0x2bfc, 0x2bdf, 0x2bec, 0x2bf6, 0x79d7, /* 0x26 */ 0x2bf2, 0x2bf0, 0x2bf9, 0x050b, 0x2e13, 0x05af, 0x85b2, 0x2e3b, 0x2e3c, 0x2e82, 0x05ce, 0x05cb, 0x05cc, 0x2e78, 0x2e8b, 0x05cd, 0x2e9e, 0x2ea5, 0x2e9b, 0x2e9c, 0x2e99, 0x2e8d, 0x2e85, 0x2e9d, 0x2e75, 0x0680, 0x06af, 0x06d3, 0x31f6, 0x06d5, 0x06d4, 0x06d7, 0x32f5, 0x335b, 0x0742, 0x3354, 0x3352, 0x0744, 0x3358, 0x3344, 0x334a, 0x3361, 0x08c6, 0x387f, 0x3891, 0x389e, 0x08c0, 0x386e, 0x387c, 0x389f, 0x3875, 0x08be, 0x3856, 0x38a2, 0x3879, 0x08ca, 0x38a1, 0x08c4, 0x38aa, 0x38a0, 0x08c2, 0x3c79, 0x3c77, 0x3c7e, 0x09a4, 0x3c75, 0x3c7b, 0x3e64, 0x0a29, 0x3ebb, 0x3ebc, 0x3ec7, 0x3eb9, 0x3ebe, 0x3eb6, 0x0a60, 0x0a5e, 0x3f98, 0x0aad, 0x0aae, 0x0aac, 0x0b57, 0x4193, 0x4280, 0x0bdd, 0x4283, 0x42c0, 0x42c1, 0x0c0e, 0x0c97, 0x43f4, 0x43f5, 0x0d27, 0x46cc, /* 0x27 */ 0x46cd, 0x48fa, 0x4c9f, 0x4c91, 0x4c97, 0x4c94, 0x1095, 0x4e86, 0x4e8c, 0x868f, 0x4e95, 0x1098, 0x526c, 0x119d, 0x5bb5, 0x5bbe, 0x5bc7, 0x148a, 0x5bc1, 0x5ca9, 0x5ca4, 0x14b5, 0x14b6, 0x14b7, 0x5ca8, 0x6227, 0x6226, 0x622b, 0x6233, 0x6234, 0x6229, 0x1a3d, 0x0028, 0x1a9d, 0x1b93, 0x1b8a, 0x004d, 0x0049, 0x1b6d, 0x1b8e, 0x1ba0, 0x1ba2, 0x1ba1, 0x1b9f, 0x1ba3, 0x6f09, 0x1b72, 0x0051, 0x1b8c, 0x1d56, 0x850f, 0x8511, 0x1d90, 0x00cb, 0x00ca, 0x00cc, 0x1ded, 0x1dfe, 0x1e2f, 0x71ec, 0x1e3c, 0x1e34, 0x1e39, 0x1eb9, 0x1eb5, 0x1ebf, 0x1f55, 0x013d, 0x1f76, 0x1f7a, 0x1f93, 0x0148, 0x1fc1, 0x1fc2, 0x1fd5, 0x2085, 0x0178, 0x205f, 0x2093, 0x2089, 0x2079, 0x6afe, 0x208f, 0x2069, 0x206d, 0x017a, 0x2094, 0x206a, 0x208a, 0x0177, 0x22fd, 0x22fb, 0x22f8, 0x0221, /* 0x28 */ 0x22fc, 0x22f6, 0x2365, 0x2381, 0x2363, 0x2367, 0x0231, 0x236e, 0x2378, 0x237f, 0x0233, 0x0234, 0x24f3, 0x254b, 0x254c, 0x02c1, 0x02b0, 0x02b4, 0x25ad, 0x02b8, 0x25c4, 0x02bc, 0x25c2, 0x25b0, 0x02bf, 0x02b5, 0x02b1, 0x02bd, 0x25bf, 0x02bb, 0x25c9, 0x25b8, 0x25ac, 0x02b3, 0x02b6, 0x02ba, 0x25b7, 0x25d7, 0x02b7, 0x2760, 0x0340, 0x2796, 0x279e, 0x2794, 0x279f, 0x279d, 0x0352, 0x2800, 0x2819, 0x0390, 0x0391, 0x2849, 0x284a, 0x03be, 0x28bb, 0x28c1, 0x03c0, 0x03c1, 0x03b9, 0x28b9, 0x289e, 0x28b4, 0x28ba, 0x29f6, 0x2a13, 0x2a12, 0x2a77, 0x0479, 0x2a98, 0x047b, 0x2a99, 0x2a9d, 0x2af8, 0x04a0, 0x2af9, 0x0029, 0x2b06, 0x2b21, 0x04ae, 0x2b25, 0x2b55, 0x04cd, 0x04cb, 0x04d9, 0x2b84, 0x2b83, 0x2c30, 0x2c07, 0x050c, 0x2c36, 0x0501, 0x0505, 0x0502, 0x2be9, /* 0x29 */ 0x2c3d, 0x2c08, 0x0513, 0x0511, 0x2eba, 0x2eb2, 0x05e4, 0x2eb7, 0x2ee4, 0x2ea7, 0x05da, 0x05d5, 0x05d3, 0x2ed5, 0x2ee1, 0x2edd, 0x2ea6, 0x2ec1, 0x2ec5, 0x2ec0, 0x2edf, 0x2ee0, 0x2ede, 0x05d6, 0x3189, 0x06b4, 0x31a6, 0x31ba, 0x06d9, 0x31ff, 0x06d8, 0x3217, 0x3218, 0x3201, 0x31fe, 0x0733, 0x330c, 0x0748, 0x336b, 0x3396, 0x3382, 0x338a, 0x0747, 0x33a3, 0x074b, 0x33a2, 0x338f, 0x074a, 0x33f9, 0x3380, 0x3726, 0x3727, 0x3768, 0x3769, 0x085a, 0x3781, 0x37b4, 0x37d1, 0x088e, 0x08b4, 0x381c, 0x08cd, 0x08cc, 0x08cf, 0x08cb, 0x08ce, 0x3897, 0x386c, 0x38df, 0x08d2, 0x38ea, 0x08d1, 0x38e4, 0x38d8, 0x38b2, 0x38ce, 0x38c8, 0x09a6, 0x3c8b, 0x3c88, 0x3c90, 0x3c8f, 0x09aa, 0x3c87, 0x3c89, 0x3c8d, 0x3c81, 0x09a8, 0x3c8c, 0x0a13, 0x0a1a, 0x3e40, 0x0a1d, 0x0a1e, /* 0x2a */ 0x3e65, 0x3e66, 0x3e68, 0x0a65, 0x0a66, 0x3ecd, 0x3ed3, 0x3edb, 0x0a64, 0x3ecf, 0x3fa7, 0x3fa3, 0x3f9e, 0x0ab0, 0x3faf, 0x0ab3, 0x0ab5, 0x3faa, 0x3f9c, 0x0b19, 0x4142, 0x4144, 0x413b, 0x4141, 0x783f, 0x419b, 0x419e, 0x0b75, 0x45c4, 0x45c3, 0x45c6, 0x0d2b, 0x0d2c, 0x45c7, 0x0d2d, 0x45ca, 0x802e, 0x0dc3, 0x46cf, 0x4876, 0x4874, 0x48ff, 0x48fc, 0x00ba, 0x0f50, 0x4b59, 0x4ca8, 0x0fd3, 0x0fd0, 0x4cb0, 0x0fdc, 0x4cb3, 0x0fd2, 0x4ca4, 0x4cb6, 0x4ca7, 0x4cac, 0x0fdb, 0x4ca6, 0x1f67, 0x4e0e, 0x4ec4, 0x4f3e, 0x4e9c, 0x10a5, 0x109f, 0x109a, 0x109c, 0x10a2, 0x4eaa, 0x109b, 0x4ec9, 0x10a3, 0x109d, 0x4ea6, 0x4eb2, 0x1188, 0x121a, 0x148d, 0x5bcc, 0x5bd9, 0x5bca, 0x5bd8, 0x5bcf, 0x5cb7, 0x14b8, 0x5cad, 0x5cb9, 0x6237, 0x15c3, 0x6241, 0x623e, 0x62b6, 0x6351, /* 0x2b */ 0x6363, 0x1a57, 0x1a79, 0x1ab2, 0x1ab0, 0x1aaf, 0x1ab1, 0x1bd2, 0x1bd5, 0x005d, 0x1bbe, 0x1bb8, 0x1bb0, 0x1bb1, 0x1bc8, 0x005a, 0x0057, 0x1bc6, 0x1bcc, 0x1be5, 0x1be3, 0x1bb4, 0x1d6a, 0x00b8, 0x1d9f, 0x00c2, 0x1dc1, 0x00cf, 0x1dc2, 0x1dc3, 0x1e45, 0x1e48, 0x00e7, 0x00e9, 0x1e4f, 0x1052, 0x00e8, 0x1ec5, 0x1eca, 0x1ec4, 0x1f27, 0x1f58, 0x1f7d, 0x014a, 0x1fdd, 0x1fdc, 0x1fda, 0x1fd9, 0x20b9, 0x0180, 0x20d0, 0x20b4, 0x20ca, 0x0187, 0x20a3, 0x20da, 0x20a4, 0x0184, 0x20b2, 0x209e, 0x209f, 0x20b5, 0x0182, 0x0181, 0x20cd, 0x0183, 0x20cc, 0x0222, 0x2300, 0x23ac, 0x2391, 0x238e, 0x238d, 0x2392, 0x23a1, 0x2390, 0x23a6, 0x23a8, 0x023b, 0x239c, 0x2396, 0x23a7, 0x023a, 0x0238, 0x0239, 0x0236, 0x24f5, 0x0285, 0x2509, 0x2508, 0x0854, 0x2552, 0x029a, 0x02c4, /* 0x2c */ 0x25df, 0x02c5, 0x25eb, 0x25ef, 0x25f0, 0x25d5, 0x260d, 0x2604, 0x25f9, 0x2602, 0x25f8, 0x25e2, 0x25d9, 0x25e7, 0x276a, 0x0354, 0x0355, 0x27ab, 0x0356, 0x281b, 0x282f, 0x0396, 0x323c, 0x0395, 0x0394, 0x03c4, 0x28d1, 0x28dc, 0x28e6, 0x28e1, 0x28cd, 0x857a, 0x28e2, 0x28dd, 0x28e5, 0x29fb, 0x29fa, 0x2a1e, 0x0444, 0x2aa1, 0x047d, 0x047e, 0x2afc, 0x2afb, 0x2b2f, 0x04b2, 0x04b6, 0x2b66, 0x8599, 0x04dc, 0x04df, 0x2c5c, 0x0528, 0x2c4e, 0x2c51, 0x0519, 0x0510, 0x2c23, 0x2c31, 0x2c7c, 0x2c52, 0x052c, 0x2c60, 0x2c4a, 0x2c61, 0x051b, 0x2e18, 0x05c2, 0x05ef, 0x05e3, 0x05e5, 0x05ea, 0x05e6, 0x05ee, 0x2f1f, 0x2f17, 0x2eea, 0x2f21, 0x2f04, 0x2f05, 0x05e8, 0x3131, 0x3144, 0x3140, 0x0685, 0x3142, 0x31be, 0x06e0, 0x3229, 0x321b, 0x06dd, 0x3223, 0x322c, 0x321a, /* 0x2d */ 0x3230, 0x323b, 0x321e, 0x3237, 0x3238, 0x06e1, 0x330e, 0x0751, 0x0755, 0x33e8, 0x33d6, 0x0752, 0x33c7, 0x33bc, 0x3452, 0x33bf, 0x33d5, 0x33fe, 0x4f63, 0x33fb, 0x85df, 0x33b1, 0x3401, 0x3405, 0x3400, 0x33d7, 0x0c9e, 0x372a, 0x376b, 0x0852, 0x085e, 0x0860, 0x085f, 0x37e1, 0x0892, 0x08d6, 0x3923, 0x38ff, 0x3914, 0x3905, 0x3913, 0x3906, 0x3921, 0x08de, 0x3915, 0x38af, 0x38f4, 0x3902, 0x3945, 0x85fe, 0x3926, 0x08d9, 0x3944, 0x08dd, 0x3924, 0x3ca5, 0x09ac, 0x3ca3, 0x09b0, 0x3ca2, 0x3cbb, 0x3ca0, 0x3caa, 0x09af, 0x09ae, 0x3ca8, 0x3cb6, 0x3cb2, 0x3ca7, 0x09ad, 0x09ab, 0x3cb9, 0x3e2e, 0x0a16, 0x3e3c, 0x0a30, 0x3e6d, 0x0a33, 0x0a31, 0x3ee7, 0x3eed, 0x0a6e, 0x3eec, 0x3ee5, 0x3ee2, 0x0ab1, 0x3fc4, 0x3fbd, 0x3fcf, 0x3fc9, 0x3fc1, 0x3fd0, 0x0ab7, 0x3fce, /* 0x2e */ 0x40ed, 0x40eb, 0x0b1a, 0x40ef, 0x4149, 0x4150, 0x4146, 0x414a, 0x0b59, 0x414d, 0x41a6, 0x0b7a, 0x0b78, 0x0b7b, 0x41a8, 0x0bde, 0x0bec, 0x42c7, 0x42ff, 0x0c1e, 0x42fd, 0x43e6, 0x440a, 0x0c9b, 0x4404, 0x440b, 0x4407, 0x0c9d, 0x4415, 0x4408, 0x0cfd, 0x45d3, 0x45d4, 0x45d0, 0x45d7, 0x467c, 0x0d94, 0x0d93, 0x467d, 0x4683, 0x4682, 0x0dc6, 0x46d4, 0x46d5, 0x46d3, 0x46d0, 0x46d2, 0x46fe, 0x46fc, 0x4877, 0x487c, 0x487b, 0x0eb8, 0x866a, 0x0eb7, 0x0eb9, 0x0f53, 0x7f33, 0x0f52, 0x0f51, 0x4b8f, 0x4cd3, 0x0fe3, 0x4ccb, 0x4cd2, 0x0fe2, 0x4d09, 0x4ce2, 0x4cdf, 0x4cc6, 0x1063, 0x4e24, 0x4ef7, 0x4ed8, 0x4edd, 0x10aa, 0x10a6, 0x4ef8, 0x4efc, 0x10a8, 0x10a9, 0x4ee9, 0x10ab, 0x4eee, 0x10ac, 0x4ed0, 0x4f0e, 0x4ee2, 0x4f0b, 0x4efd, 0x1d79, 0x5276, 0x119e, 0x5278, /* 0x2f */ 0x119f, 0x11a0, 0x5275, 0x527d, 0x120f, 0x5442, 0x5466, 0x121c, 0x558c, 0x5605, 0x12ae, 0x5606, 0x12b0, 0x589f, 0x13d4, 0x5bf1, 0x5be7, 0x5be9, 0x5bef, 0x5cc2, 0x5cbc, 0x14bb, 0x5cc6, 0x5cc0, 0x14c1, 0x14c2, 0x5ccd, 0x5cc9, 0x14be, 0x5cc4, 0x14e5, 0x6181, 0x15c6, 0x68ec, 0x1c32, 0x1bf9, 0x1c1d, 0x1bff, 0x1c04, 0x1bf0, 0x1c03, 0x122e, 0x1c02, 0x1bfc, 0x1bf2, 0x1c24, 0x1c08, 0x1c36, 0x1c2e, 0x0065, 0x1c10, 0x1c38, 0x1c39, 0x1bfd, 0x1c56, 0x1bfb, 0x1da3, 0x1da6, 0x1da1, 0x00d1, 0x00d0, 0x1dc7, 0x1dc9, 0x1e60, 0x1e64, 0x1e59, 0x1e65, 0x1e67, 0x1e57, 0x1e63, 0x00ee, 0x1e53, 0x00ef, 0x1ecf, 0x011e, 0x1ece, 0x1ed0, 0x1ed1, 0x1ecc, 0x014b, 0x014d, 0x0156, 0x210d, 0x20f4, 0x0192, 0x2113, 0x20ef, 0x20f5, 0x20f9, 0x2102, 0x2100, 0x0193, 0x0190, 0x2118, /* 0x30 */ 0x20f0, 0x20f6, 0x8541, 0x0197, 0x2119, 0x0223, 0x2305, 0x23c9, 0x023f, 0x23b7, 0x23cd, 0x0243, 0x0242, 0x0244, 0x23be, 0x23bb, 0x0245, 0x23db, 0x23c8, 0x23c4, 0x23c5, 0x23d1, 0x23ca, 0x23c0, 0x02d9, 0x02de, 0x2621, 0x262a, 0x02cf, 0x261d, 0x02cd, 0x260b, 0x02dd, 0x02ce, 0x02d3, 0x02d6, 0x2622, 0x02dc, 0x02d1, 0x2624, 0x02d0, 0x2614, 0x2631, 0x02d5, 0x262f, 0x261a, 0x2612, 0x02d4, 0x02db, 0x2626, 0x762e, 0x0343, 0x27bc, 0x27bb, 0x27b7, 0x2805, 0x2806, 0x2852, 0x2853, 0x03cd, 0x03d1, 0x28fa, 0x28eb, 0x03ca, 0x28f3, 0x28f5, 0x28e9, 0x28ef, 0x03d4, 0x2a2a, 0x2a30, 0x2a2e, 0x2a2c, 0x2a2f, 0x2aaf, 0x2aa9, 0x0486, 0x2afd, 0x2b32, 0x2b8e, 0x2b93, 0x2b8f, 0x2c4f, 0x2c99, 0x0533, 0x2c7e, 0x0537, 0x2c74, 0x2c4b, 0x2c73, 0x2c75, 0x052a, 0x051f, 0x2c56, /* 0x31 */ 0x2ca9, 0x2c8b, 0x2ca6, 0x0539, 0x2c93, 0x2cae, 0x2c9e, 0x2ca7, 0x2e45, 0x05f2, 0x05f8, 0x2f2e, 0x05f7, 0x2f52, 0x2f30, 0x2f5b, 0x05f4, 0x2f19, 0x2f1b, 0x05f1, 0x2f31, 0x2f5d, 0x2f37, 0x2f35, 0x2f53, 0x05f5, 0x2f5c, 0x2f3f, 0x314b, 0x0687, 0x0f69, 0x318b, 0x06b6, 0x319a, 0x3250, 0x3246, 0x324e, 0x3240, 0x06e9, 0x324b, 0x3248, 0x06eb, 0x3260, 0x3244, 0x324d, 0x0734, 0x3437, 0x3424, 0x0762, 0x075c, 0x341b, 0x3436, 0x0760, 0x342c, 0x3419, 0x3456, 0x3447, 0x343e, 0x341e, 0x85e1, 0x3415, 0x3422, 0x3427, 0x3459, 0x3458, 0x3455, 0x3430, 0x3423, 0x372e, 0x372b, 0x3730, 0x376c, 0x0861, 0x378b, 0x087f, 0x37e9, 0x37ea, 0x37e5, 0x396b, 0x08e5, 0x08e6, 0x3973, 0x3957, 0x08e9, 0x08f3, 0x395d, 0x3956, 0x398f, 0x395b, 0x391c, 0x399a, 0x399b, 0x3999, 0x08ee, /* 0x32 */ 0x3981, 0x3971, 0x08ed, 0x08ec, 0x3972, 0x395c, 0x3996, 0x3cc4, 0x3cdb, 0x3ccc, 0x3cd0, 0x3ce3, 0x3cdf, 0x09b3, 0x3cd6, 0x3cee, 0x3cd5, 0x09b5, 0x0a27, 0x0a35, 0x0a36, 0x3e7a, 0x0a71, 0x3ef5, 0x3f02, 0x0ab8, 0x0ac2, 0x3fe2, 0x3fec, 0x3fd5, 0x3ff9, 0x3fdf, 0x3fe6, 0x0ac8, 0x0ac0, 0x0ac1, 0x0ac4, 0x3fe4, 0x3fe1, 0x40f3, 0x0b1f, 0x0b1c, 0x0b1d, 0x0b4d, 0x4156, 0x4155, 0x4158, 0x4157, 0x415e, 0x41c3, 0x0b87, 0x0b82, 0x41b4, 0x0b7d, 0x41b1, 0x0bdf, 0x0c00, 0x42cb, 0x42cc, 0x432a, 0x0c20, 0x4316, 0x430f, 0x0c22, 0x0c24, 0x433f, 0x432b, 0x430e, 0x4324, 0x0c21, 0x4321, 0x4318, 0x43dd, 0x0ca4, 0x0ca5, 0x4424, 0x4436, 0x0d01, 0x4558, 0x4559, 0x0d03, 0x4562, 0x45da, 0x45d9, 0x0d37, 0x45e1, 0x45e5, 0x45e8, 0x45db, 0x0d38, 0x45e2, 0x45f0, 0x0d99, 0x0d98, /* 0x33 */ 0x0d97, 0x0dc9, 0x46da, 0x46dd, 0x0dc7, 0x46db, 0x46dc, 0x0dd9, 0x0ddb, 0x470d, 0x470b, 0x4714, 0x488e, 0x4886, 0x0e7b, 0x4887, 0x4883, 0x488b, 0x0e7c, 0x0ebd, 0x0ebc, 0x0ec3, 0x4924, 0x0ec1, 0x0ebf, 0x0ec4, 0x4925, 0x4b62, 0x4b93, 0x4b99, 0x4b97, 0x0f7e, 0x0f7f, 0x4bc4, 0x4bc6, 0x4c0a, 0x0fb4, 0x0fb3, 0x4c40, 0x4c3c, 0x4c3b, 0x4cf6, 0x4cff, 0x4cee, 0x4d04, 0x4d03, 0x4d07, 0x8683, 0x0fe6, 0x4cf7, 0x1059, 0x105a, 0x4e2d, 0x1064, 0x4e27, 0x4e29, 0x4f1f, 0x4f57, 0x10b4, 0x10b9, 0x10b7, 0x10b5, 0x4f21, 0x10c1, 0x10b1, 0x4f18, 0x4f58, 0x10b3, 0x10ba, 0x118c, 0x118b, 0x118d, 0x5284, 0x529f, 0x529b, 0x5289, 0x52a6, 0x5292, 0x528f, 0x52a0, 0x544f, 0x5478, 0x547a, 0x546e, 0x547b, 0x5484, 0x5473, 0x1278, 0x1277, 0x560d, 0x560b, 0x5619, 0x12b2, 0x13d6, /* 0x34 */ 0x5ad0, 0x1445, 0x1492, 0x1495, 0x5bf9, 0x5c09, 0x5c08, 0x14c6, 0x5cde, 0x5d51, 0x14e7, 0x14e8, 0x5ddb, 0x5ddf, 0x5dde, 0x5dd6, 0x5de0, 0x6185, 0x6260, 0x6259, 0x15cb, 0x6256, 0x15cd, 0x15f1, 0x62bd, 0x1722, 0x0021, 0x1c42, 0x1c59, 0x006f, 0x1c44, 0x1c66, 0x1c52, 0x1c54, 0x1c71, 0x1c50, 0x1c7b, 0x1c7c, 0x1c58, 0x0070, 0x0064, 0x1c79, 0x1c6c, 0x1c78, 0x1da8, 0x1dd1, 0x1dcf, 0x1e68, 0x1e76, 0x1ed4, 0x012d, 0x1fa0, 0x1fc4, 0x0158, 0x2158, 0x214c, 0x2168, 0x01a6, 0x2149, 0x01a4, 0x019f, 0x215d, 0x2129, 0x73ae, 0x2154, 0x2153, 0x01a3, 0x215a, 0x01a0, 0x213a, 0x213f, 0x212b, 0x23ea, 0x024a, 0x23ef, 0x0247, 0x0248, 0x23dd, 0x23fe, 0x8555, 0x23de, 0x23e6, 0x0249, 0x23e8, 0x23ff, 0x2403, 0x24f7, 0x34a6, 0x251f, 0x029e, 0x255b, 0x255d, 0x255e, 0x7537, /* 0x35 */ 0x02e8, 0x262b, 0x02ec, 0x263b, 0x02ed, 0x02e6, 0x2661, 0x263a, 0x266e, 0x264b, 0x266b, 0x02eb, 0x02e7, 0x2645, 0x264e, 0x2668, 0x263d, 0x2671, 0x263f, 0x266f, 0x2675, 0x02e9, 0x2673, 0x262c, 0x2659, 0x2654, 0x264f, 0x2663, 0x035c, 0x035d, 0x27c8, 0x0360, 0x27c3, 0x035b, 0x285b, 0x2861, 0x0399, 0x2921, 0x290a, 0x2909, 0x03d8, 0x292c, 0x2908, 0x03da, 0x03dd, 0x292a, 0x2915, 0x03e0, 0x2910, 0x2913, 0x03e5, 0x292f, 0x2918, 0x03d7, 0x29e3, 0x2a39, 0x2a35, 0x2a3a, 0x2a32, 0x044e, 0x048c, 0x0488, 0x858d, 0x2abb, 0x2aba, 0x2b34, 0x2b39, 0x04ce, 0x859c, 0x04e5, 0x04e6, 0x2c98, 0x0532, 0x2cd0, 0x0540, 0x0547, 0x054c, 0x2cd7, 0x2caa, 0x0535, 0x2ca1, 0x2ca4, 0x0530, 0x2cee, 0x0543, 0x2ce7, 0x054d, 0x2ce8, 0x2cde, 0x05b7, 0x05f3, 0x2f7e, 0x2f8b, 0x0602, /* 0x36 */ 0x060b, 0x2f79, 0x2f86, 0x2f93, 0x0604, 0x2f73, 0x2f6a, 0x85ba, 0x2f6c, 0x0608, 0x2f7f, 0x05fc, 0x2fb2, 0x2fba, 0x05ff, 0x0600, 0x2f66, 0x2f74, 0x068b, 0x315a, 0x068d, 0x314e, 0x314d, 0x318d, 0x318e, 0x31ad, 0x06ca, 0x31c7, 0x31ca, 0x06cb, 0x31c9, 0x85cb, 0x31e3, 0x3257, 0x06f3, 0x3263, 0x3267, 0x331a, 0x3319, 0x3316, 0x0736, 0x076a, 0x349e, 0x34b6, 0x3498, 0x3473, 0x076b, 0x349a, 0x348e, 0x34b7, 0x34db, 0x34a5, 0x346c, 0x34c1, 0x3484, 0x0771, 0x0768, 0x3495, 0x347a, 0x3499, 0x0772, 0x34b8, 0x34b9, 0x3470, 0x082e, 0x3735, 0x0862, 0x3790, 0x37bb, 0x37ed, 0x0898, 0x08b5, 0x08eb, 0x39c1, 0x39c3, 0x39ce, 0x08fb, 0x08f8, 0x39ad, 0x3a04, 0x08f5, 0x39b9, 0x0908, 0x39e7, 0x8607, 0x3a08, 0x3a06, 0x090a, 0x3a0a, 0x39b0, 0x0906, 0x39f8, 0x3a0c, 0x08fd, /* 0x37 */ 0x39b1, 0x08fa, 0x3a02, 0x3a07, 0x3a09, 0x3a01, 0x3a17, 0x39ff, 0x3a12, 0x09ba, 0x09b9, 0x3d03, 0x3d07, 0x3d01, 0x3cf5, 0x3cf1, 0x3d08, 0x3cf2, 0x3d0f, 0x09bb, 0x3cfe, 0x0a18, 0x0a40, 0x0a3d, 0x3f1a, 0x3f10, 0x3f0e, 0x4002, 0x3ff3, 0x0acd, 0x0ac9, 0x3ffb, 0x0acb, 0x0aca, 0x0ace, 0x411b, 0x4123, 0x4161, 0x4168, 0x0b5e, 0x4167, 0x41d3, 0x0b91, 0x0b8c, 0x4290, 0x0be1, 0x0c02, 0x42d5, 0x42d7, 0x42d6, 0x4330, 0x0c2b, 0x4326, 0x0c2a, 0x4340, 0x0a14, 0x431e, 0x0cad, 0x0ca3, 0x0cab, 0x4447, 0x0caf, 0x444b, 0x4451, 0x444f, 0x4442, 0x4446, 0x0d04, 0x456e, 0x456c, 0x45f2, 0x0d44, 0x45f1, 0x45f5, 0x45f3, 0x45f9, 0x0d3d, 0x0d47, 0x0d9c, 0x469a, 0x4693, 0x4691, 0x46e1, 0x0de0, 0x0de4, 0x4721, 0x471c, 0x4716, 0x4717, 0x4736, 0x471f, 0x0e80, 0x4893, 0x4899, /* 0x38 */ 0x489a, 0x489c, 0x0eca, 0x4949, 0x0ed4, 0x4934, 0x4937, 0x0ed2, 0x492d, 0x0ecb, 0x494c, 0x0ece, 0x0ed3, 0x4948, 0x0f44, 0x0f48, 0x4b3b, 0x0f45, 0x0f81, 0x0f86, 0x0f85, 0x4c08, 0x4c1a, 0x0fa3, 0x4c1d, 0x0fb5, 0x4c49, 0x4c45, 0x4c44, 0x489b, 0x0ffa, 0x0ff9, 0x4d2a, 0x4d2e, 0x0ffb, 0x0ff2, 0x4d31, 0x0fef, 0x4d1a, 0x4d34, 0x4d17, 0x105b, 0x1066, 0x10ce, 0x4f1d, 0x4f71, 0x4f84, 0x4f80, 0x4f72, 0x4fa1, 0x01b4, 0x4f79, 0x4f91, 0x10c8, 0x4f9f, 0x4fad, 0x10d1, 0x10c5, 0x4f23, 0x10d2, 0x4f85, 0x4f9c, 0x4fb7, 0x5258, 0x525a, 0x118f, 0x5257, 0x52b2, 0x11a7, 0x52ae, 0x11a5, 0x11a4, 0x1211, 0x5445, 0x549c, 0x5494, 0x54a3, 0x548f, 0x54a5, 0x54a9, 0x54a6, 0x548a, 0x54a0, 0x5490, 0x5592, 0x5591, 0x5594, 0x12b5, 0x5626, 0x5632, 0x5628, 0x12b4, 0x12bd, 0x561c, /* 0x39 */ 0x12bb, 0x562b, 0x5620, 0x12b9, 0x5629, 0x12c2, 0x12be, 0x12ba, 0x5621, 0x583a, 0x06b7, 0x585b, 0x5858, 0x587c, 0x1358, 0x58a6, 0x58ae, 0x58ad, 0x5965, 0x139b, 0x597e, 0x139c, 0x597c, 0x597f, 0x597a, 0x59bd, 0x13da, 0x13de, 0x59c0, 0x59bb, 0x5aad, 0x5aaf, 0x5ad6, 0x144d, 0x1446, 0x1447, 0x144b, 0x144c, 0x5ad9, 0x1448, 0x1499, 0x5c12, 0x5c0e, 0x5c25, 0x149b, 0x5c13, 0x5cee, 0x14ce, 0x5cab, 0x5cf7, 0x14eb, 0x5d59, 0x5d54, 0x5df2, 0x5df0, 0x5de5, 0x5df6, 0x151c, 0x158c, 0x6187, 0x15d1, 0x625a, 0x15d6, 0x15d3, 0x626e, 0x15d4, 0x15d0, 0x15d5, 0x6279, 0x160b, 0x64e1, 0x64e6, 0x17c6, 0x6ac4, 0x6ad2, 0x1a80, 0x0024, 0x1a81, 0x1c8f, 0x1c97, 0x1c88, 0x1c89, 0x0074, 0x007a, 0x1c81, 0x1d60, 0x7064, 0x00c3, 0x2a42, 0x1dd3, 0x00d4, 0x00d5, 0x1dd2, 0x1dd6, /* 0x3a */ 0x1e73, 0x00fb, 0x1e70, 0x00f7, 0x0132, 0x8533, 0x1fa8, 0x1fa6, 0x1fc5, 0x2197, 0x21de, 0x01ba, 0x01bf, 0x2196, 0x21b4, 0x01c7, 0x2185, 0x01b7, 0x219b, 0x21a0, 0x01b9, 0x2159, 0x01c3, 0x2186, 0x01bd, 0x01d0, 0x21af, 0x217a, 0x01c1, 0x01be, 0x01cd, 0x219e, 0x01cb, 0x21a9, 0x230f, 0x230e, 0x241a, 0x024f, 0x241f, 0x0253, 0x243c, 0x2418, 0x243e, 0x2426, 0x0255, 0x243a, 0x7464, 0x2422, 0x0251, 0x24fb, 0x2563, 0x2564, 0x029f, 0x26a8, 0x26a3, 0x2682, 0x2688, 0x26a1, 0x2685, 0x2698, 0x02fe, 0x2699, 0x02fb, 0x2689, 0x2681, 0x2696, 0x2680, 0x02f1, 0x02f5, 0x2691, 0x02ef, 0x0304, 0x0303, 0x02f4, 0x26cf, 0x02f3, 0x0302, 0x02f7, 0x02fa, 0x02fd, 0x02ee, 0x2687, 0x26a0, 0x02f0, 0x2679, 0x02f2, 0x2686, 0x26ab, 0x26aa, 0x26a4, 0x268d, 0x267e, 0x0344, 0x27d5, /* 0x3b */ 0x0362, 0x0377, 0x09c9, 0x281e, 0x285f, 0x285e, 0x2944, 0x293e, 0x03e8, 0x2948, 0x291c, 0x03ef, 0x295b, 0x294d, 0x03e6, 0x03ed, 0x2957, 0x03e7, 0x2953, 0x294f, 0x03eb, 0x293b, 0x2946, 0x042d, 0x0455, 0x2a46, 0x2a47, 0x0453, 0x2a48, 0x2ac0, 0x2abd, 0x2abf, 0x0490, 0x2b11, 0x04be, 0x2b3e, 0x2b3b, 0x04bd, 0x2b3a, 0x04cf, 0x04d0, 0x04ec, 0x2ba7, 0x054b, 0x2cea, 0x0548, 0x2d07, 0x2d22, 0x2d0c, 0x0555, 0x0551, 0x2cb3, 0x2cd6, 0x2cd2, 0x054e, 0x2ce3, 0x2ce5, 0x2ce9, 0x056b, 0x055e, 0x2d11, 0x2cfd, 0x0560, 0x0567, 0x2d1e, 0x2d20, 0x2d21, 0x2e1e, 0x05b8, 0x2fe2, 0x2fde, 0x2fe6, 0x0614, 0x060f, 0x0607, 0x0613, 0x2ff8, 0x0617, 0x2ffe, 0x2fc1, 0x2fbf, 0x2ff7, 0x2fd1, 0x315f, 0x3160, 0x3161, 0x069a, 0x06b8, 0x31d1, 0x06f7, 0x06f8, 0x327d, 0x326b, 0x327f, /* 0x3c */ 0x06fd, 0x06f5, 0x3273, 0x3281, 0x326d, 0x3269, 0x06fa, 0x0738, 0x331e, 0x34ed, 0x0787, 0x0780, 0x0788, 0x0779, 0x3503, 0x077c, 0x34fe, 0x34e5, 0x351e, 0x3502, 0x0783, 0x0785, 0x3509, 0x34ca, 0x3500, 0x85e5, 0x3501, 0x3518, 0x34e2, 0x34cf, 0x077b, 0x352e, 0x34c5, 0x34ff, 0x0786, 0x351c, 0x34c3, 0x0834, 0x376f, 0x0855, 0x376e, 0x0868, 0x37be, 0x089c, 0x37f4, 0x382d, 0x08fc, 0x39b6, 0x3a75, 0x3a1e, 0x091a, 0x3a18, 0x0917, 0x3a48, 0x091b, 0x3a4f, 0x0913, 0x3a42, 0x3a6a, 0x3a70, 0x39fe, 0x0905, 0x0907, 0x3a6d, 0x091c, 0x3a7b, 0x3a7e, 0x3a59, 0x0911, 0x3a57, 0x0916, 0x3a80, 0x3a50, 0x0915, 0x3a29, 0x3a76, 0x3a2a, 0x3a4c, 0x3d2a, 0x09cb, 0x3d35, 0x3d2c, 0x3d37, 0x3d1d, 0x09c5, 0x09c2, 0x3d38, 0x09cd, 0x3d34, 0x3d2b, 0x3d33, 0x3d27, 0x3d24, 0x09ca, /* 0x3d */ 0x3d2d, 0x3e32, 0x3e83, 0x3e82, 0x3e87, 0x3f06, 0x3f24, 0x3f38, 0x3f2a, 0x3f2c, 0x3f2b, 0x0a83, 0x3f2f, 0x3f28, 0x4017, 0x0ad6, 0x0ad5, 0x4019, 0x4038, 0x0ad1, 0x401f, 0x4014, 0x403c, 0x3ff7, 0x401c, 0x4015, 0x4018, 0x4039, 0x40f9, 0x4124, 0x8634, 0x0b52, 0x0b5f, 0x416e, 0x416d, 0x4171, 0x418e, 0x0b95, 0x41e5, 0x0b9d, 0x0b98, 0x0b9e, 0x0b96, 0x4294, 0x42b3, 0x0c03, 0x42d9, 0x0c2f, 0x4348, 0x4349, 0x4343, 0x0c31, 0x0c33, 0x4342, 0x43df, 0x0cb4, 0x4463, 0x4476, 0x0cb0, 0x445f, 0x4466, 0x4566, 0x4571, 0x0d08, 0x0d07, 0x4576, 0x4584, 0x4575, 0x45ff, 0x4607, 0x0d4e, 0x460e, 0x4609, 0x0d50, 0x0d52, 0x0da1, 0x0da3, 0x0da5, 0x0dcc, 0x46e7, 0x46e2, 0x4755, 0x0def, 0x0dea, 0x4743, 0x4757, 0x476c, 0x4742, 0x4753, 0x0ded, 0x4741, 0x0e85, 0x0e84, 0x48a7, /* 0x3e */ 0x48a0, 0x48a6, 0x48a4, 0x4974, 0x0edb, 0x4959, 0x0ed9, 0x4960, 0x4957, 0x496c, 0x497e, 0x4964, 0x0ed7, 0x495a, 0x495d, 0x0eda, 0x0ede, 0x0ed8, 0x4976, 0x494d, 0x4975, 0x0ed5, 0x4bd3, 0x4bd6, 0x0f9c, 0x0f9d, 0x4c60, 0x4c4e, 0x4d45, 0x4d3b, 0x0ffe, 0x4d48, 0x4d42, 0x4d49, 0x4d40, 0x4d14, 0x4d41, 0x1007, 0x4def, 0x4df6, 0x4e03, 0x106a, 0x4fed, 0x10e7, 0x4fda, 0x5018, 0x4fd2, 0x5008, 0x10e2, 0x5000, 0x10df, 0x10e1, 0x10e5, 0x5017, 0x4f46, 0x5014, 0x4fd3, 0x5005, 0x501f, 0x5002, 0x5016, 0x4fcd, 0x4fe6, 0x1191, 0x525d, 0x52d5, 0x52e1, 0x11b4, 0x11b0, 0x11b5, 0x11ae, 0x52ee, 0x5447, 0x5446, 0x122d, 0x122c, 0x54bb, 0x122b, 0x54bf, 0x54b4, 0x1229, 0x54b5, 0x127f, 0x559a, 0x5643, 0x12c9, 0x12cb, 0x565a, 0x12c5, 0x12c6, 0x12ca, 0x5635, 0x5638, 0x5642, /* 0x3f */ 0x5649, 0x565d, 0x564b, 0x563d, 0x12d2, 0x12d0, 0x132d, 0x1335, 0x5860, 0x585e, 0x587f, 0x587e, 0x5883, 0x136c, 0x58b1, 0x5987, 0x139d, 0x13a0, 0x5988, 0x5983, 0x13a2, 0x139f, 0x5986, 0x598b, 0x5982, 0x59ca, 0x59d2, 0x13eb, 0x13e2, 0x59d4, 0x59c9, 0x5ab0, 0x1436, 0x1432, 0x1450, 0x5af2, 0x5ae4, 0x5af3, 0x5aea, 0x144f, 0x5afd, 0x1452, 0x5b9d, 0x5c2b, 0x5c2a, 0x149e, 0x5c28, 0x5c29, 0x5c2c, 0x14a0, 0x149c, 0x5c3a, 0x5c30, 0x5c37, 0x5c3b, 0x14d1, 0x5d0a, 0x14ef, 0x14f0, 0x14f1, 0x5dfe, 0x5e20, 0x151d, 0x5e0b, 0x151f, 0x5e18, 0x5e22, 0x151e, 0x5e1b, 0x5e08, 0x1520, 0x5e0e, 0x5e13, 0x158e, 0x1591, 0x6195, 0x83dd, 0x1590, 0x15d7, 0x628c, 0x627b, 0x627f, 0x6281, 0x15d9, 0x6282, 0x15f4, 0x15f6, 0x0160, 0x15f5, 0x15f3, 0x62ee, 0x62ed, 0x160c, 0x62ec, /* 0x40 */ 0x635f, 0x636f, 0x1651, 0x636d, 0x16a6, 0x16a7, 0x16a8, 0x1727, 0x1724, 0x1725, 0x64f0, 0x172a, 0x1774, 0x17c7, 0x66a9, 0x17e7, 0x17ed, 0x66e0, 0x1ab7, 0x002e, 0x007b, 0x1ccc, 0x1cbc, 0x007c, 0x1caa, 0x1cb9, 0x007d, 0x1cab, 0x1cc3, 0x1ccd, 0x1d7e, 0x1e7e, 0x1e79, 0x00fd, 0x8523, 0x1ee1, 0x1ee0, 0x1ee7, 0x1f80, 0x1fab, 0x1faa, 0x1fa9, 0x1fe0, 0x21ea, 0x01da, 0x21d7, 0x01d6, 0x01db, 0x21c1, 0x2315, 0x025b, 0x246c, 0x025c, 0x245c, 0x2450, 0x2461, 0x246a, 0x2469, 0x2456, 0x2460, 0x2466, 0x245f, 0x2523, 0x2566, 0x2568, 0x0306, 0x030b, 0x26ce, 0x030d, 0x26c5, 0x26c3, 0x030a, 0x0313, 0x26d0, 0x0310, 0x0312, 0x0309, 0x0308, 0x0311, 0x030f, 0x2774, 0x2776, 0x27dc, 0x27d7, 0x27da, 0x27db, 0x0367, 0x2820, 0x296d, 0x2966, 0x03f6, 0x2964, 0x296e, 0x857e, /* 0x41 */ 0x2960, 0x2b42, 0x2b5a, 0x2b6e, 0x0564, 0x056c, 0x2d30, 0x2d3a, 0x2d2a, 0x2d43, 0x2d19, 0x2d31, 0x056d, 0x2d3d, 0x057a, 0x0575, 0x060d, 0x3008, 0x3032, 0x3038, 0x061e, 0x3031, 0x061b, 0x3019, 0x062a, 0x3011, 0x061f, 0x0622, 0x3029, 0x301d, 0x0625, 0x0627, 0x0629, 0x303c, 0x0624, 0x3046, 0x3047, 0x0628, 0x0626, 0x303a, 0x3007, 0x0623, 0x316b, 0x069f, 0x3170, 0x316d, 0x06b1, 0x31e4, 0x3293, 0x0703, 0x0707, 0x070c, 0x0706, 0x328f, 0x0704, 0x0709, 0x3292, 0x0705, 0x328e, 0x0708, 0x3546, 0x0796, 0x079c, 0x079f, 0x079b, 0x0798, 0x0799, 0x0794, 0x3531, 0x078d, 0x07a3, 0x353e, 0x0793, 0x357c, 0x3543, 0x0792, 0x3573, 0x85e8, 0x3555, 0x078e, 0x078c, 0x3585, 0x354d, 0x3550, 0x3547, 0x3567, 0x3536, 0x3564, 0x3561, 0x079a, 0x357d, 0x3744, 0x3740, 0x3771, /* 0x42 */ 0x3773, 0x379c, 0x086a, 0x086d, 0x0884, 0x37c1, 0x08a0, 0x37fa, 0x3831, 0x3832, 0x091d, 0x0926, 0x3ab8, 0x3aa8, 0x0933, 0x3a91, 0x3abb, 0x0938, 0x3a9a, 0x0930, 0x0928, 0x3aa9, 0x0927, 0x092a, 0x3ab5, 0x3a6c, 0x3ae8, 0x0931, 0x3add, 0x3ada, 0x3ae6, 0x3aac, 0x0934, 0x092e, 0x093b, 0x3ad9, 0x3ae3, 0x3ae9, 0x3adb, 0x0929, 0x3d6f, 0x09d2, 0x09d8, 0x3d48, 0x09cf, 0x3d4a, 0x3d6b, 0x09d9, 0x3d4f, 0x3d57, 0x3d74, 0x09ce, 0x09d3, 0x09d0, 0x3d45, 0x3d51, 0x3d6d, 0x07a1, 0x3e51, 0x3e50, 0x3e4e, 0x0a47, 0x3f41, 0x0a8b, 0x3f2e, 0x3f46, 0x0ad4, 0x4027, 0x0ade, 0x4048, 0x4053, 0x403d, 0x0adf, 0x405d, 0x4056, 0x0ad7, 0x401e, 0x4047, 0x4043, 0x4058, 0x4049, 0x0ae1, 0x404c, 0x4045, 0x403e, 0x0b2f, 0x4101, 0x411e, 0x0b62, 0x0b63, 0x417a, 0x41ee, 0x4202, 0x4297, /* 0x43 */ 0x4298, 0x0be2, 0x0c04, 0x0c43, 0x435d, 0x4364, 0x4353, 0x4358, 0x4482, 0x4490, 0x448a, 0x0cbe, 0x447a, 0x447d, 0x0cba, 0x448b, 0x4478, 0x0cbc, 0x864e, 0x448d, 0x4488, 0x4492, 0x4481, 0x457e, 0x4583, 0x0d0d, 0x0d0e, 0x0d11, 0x4580, 0x0d0f, 0x0d12, 0x0d55, 0x460f, 0x0d59, 0x0d5b, 0x461d, 0x0d57, 0x46a1, 0x46a4, 0x0dce, 0x46e9, 0x46ea, 0x0dfe, 0x4762, 0x476b, 0x0dfc, 0x475e, 0x0df5, 0x4779, 0x0df9, 0x0dfa, 0x476f, 0x4768, 0x0e88, 0x0e89, 0x48ae, 0x0e8a, 0x0e87, 0x0e8b, 0x48b0, 0x0ee6, 0x4990, 0x0eed, 0x498a, 0x0ee5, 0x498b, 0x4999, 0x4995, 0x0ee0, 0x4987, 0x4978, 0x4997, 0x4989, 0x4998, 0x0ee1, 0x0f5b, 0x0f5c, 0x4ba3, 0x0f8f, 0x0f8b, 0x0f8d, 0x4bdd, 0x4c57, 0x0fb9, 0x4d63, 0x4d6a, 0x4d6c, 0x100f, 0x1019, 0x1013, 0x4d5d, 0x4d75, 0x1018, 0x4d5f, /* 0x44 */ 0x1016, 0x4d7d, 0x4d6d, 0x1053, 0x868d, 0x4e41, 0x504f, 0x5084, 0x10f6, 0x507f, 0x10f5, 0x5048, 0x502a, 0x507b, 0x5072, 0x5064, 0x502e, 0x505c, 0x5053, 0x10f7, 0x5041, 0x50c8, 0x10f0, 0x5062, 0x5080, 0x503e, 0x5083, 0x5071, 0x10f9, 0x504a, 0x5055, 0x5058, 0x1192, 0x1195, 0x1196, 0x52fc, 0x52fd, 0x5315, 0x11b9, 0x5316, 0x52ff, 0x11bd, 0x11b8, 0x1212, 0x5458, 0x54cf, 0x54e0, 0x1280, 0x1281, 0x129a, 0x1298, 0x55e7, 0x566a, 0x5680, 0x12d4, 0x566f, 0x5665, 0x12da, 0x5678, 0x567d, 0x5688, 0x12d6, 0x12db, 0x5664, 0x567e, 0x12dc, 0x5667, 0x5863, 0x5888, 0x1371, 0x58cd, 0x1372, 0x58c9, 0x13a8, 0x59ed, 0x13f0, 0x86db, 0x13f1, 0x13fd, 0x1438, 0x1437, 0x1439, 0x5ab1, 0x1455, 0x1453, 0x5b04, 0x5b9e, 0x5ba0, 0x5c43, 0x5c46, 0x5c48, 0x5c45, 0x5c40, 0x5c4c, /* 0x45 */ 0x14d5, 0x14bd, 0x5d0c, 0x5d13, 0x5d15, 0x14f5, 0x5d6b, 0x5d67, 0x5e5d, 0x5e55, 0x5e35, 0x1521, 0x5e59, 0x5e2f, 0x5e3c, 0x5e8f, 0x5e5c, 0x5e6a, 0x5e62, 0x5e5f, 0x5e6b, 0x5e6e, 0x5e3b, 0x5e44, 0x5e41, 0x619a, 0x1592, 0x6199, 0x15de, 0x15db, 0x15da, 0x628f, 0x15df, 0x6296, 0x15f9, 0x15f8, 0x15fa, 0x62f4, 0x62fc, 0x160e, 0x6355, 0x1643, 0x6379, 0x1656, 0x1653, 0x169e, 0x63ee, 0x63f5, 0x16a9, 0x640b, 0x16fa, 0x64f3, 0x1731, 0x1730, 0x64f7, 0x64ff, 0x64f5, 0x1732, 0x64ec, 0x64f1, 0x1729, 0x172e, 0x659a, 0x1776, 0x66e2, 0x673d, 0x675d, 0x68e8, 0x18a5, 0x68eb, 0x68ef, 0x68ee, 0x6a81, 0x6b14, 0x1cd0, 0x1cd9, 0x1cdc, 0x1cd8, 0x008c, 0x1ce1, 0x1ceb, 0x008b, 0x0089, 0x1cf4, 0x1ce2, 0x1cde, 0x008d, 0x0086, 0x00d7, 0x1df4, 0x0104, 0x0107, 0x0103, 0x1eed, /* 0x46 */ 0x1eea, 0x0122, 0x1f32, 0x0151, 0x1fae, 0x1fb0, 0x0161, 0x21fb, 0x2203, 0x220b, 0x01e9, 0x2207, 0x01e5, 0x21f8, 0x01e4, 0x2228, 0x221e, 0x01e3, 0x2218, 0x2211, 0x2251, 0x2205, 0x2317, 0x2492, 0x0265, 0x248c, 0x0263, 0x2478, 0x2484, 0x2473, 0x24ad, 0x2497, 0x2495, 0x2477, 0x2472, 0x2496, 0x248d, 0x2510, 0x028c, 0x256c, 0x031a, 0x26e7, 0x0315, 0x26e4, 0x0320, 0x0321, 0x26ef, 0x2226, 0x031c, 0x031b, 0x26f0, 0x297b, 0x03fe, 0x2983, 0x0404, 0x0401, 0x298b, 0x298c, 0x0400, 0x2978, 0x2a52, 0x046d, 0x0493, 0x2ad0, 0x2acf, 0x04a1, 0x2bb3, 0x2bb4, 0x0576, 0x0579, 0x0572, 0x2d7b, 0x0583, 0x2d6f, 0x2d81, 0x2d3c, 0x2d42, 0x2d38, 0x2d33, 0x85a6, 0x2d60, 0x2d69, 0x2d7d, 0x2d86, 0x2e2c, 0x2e28, 0x0638, 0x304c, 0x0630, 0x3057, 0x307c, 0x0634, 0x063a, 0x3055, /* 0x47 */ 0x3062, 0x3071, 0x306a, 0x3056, 0x303b, 0x3081, 0x0635, 0x304f, 0x307e, 0x3064, 0x063f, 0x0640, 0x0632, 0x0631, 0x0636, 0x3171, 0x7aba, 0x070f, 0x32a5, 0x329a, 0x329c, 0x0710, 0x32a6, 0x070d, 0x32a4, 0x358f, 0x35c5, 0x35c8, 0x3592, 0x35b2, 0x07a9, 0x07b4, 0x07ac, 0x35e3, 0x35c0, 0x35d6, 0x35d1, 0x359f, 0x35a2, 0x35d2, 0x07b8, 0x07ae, 0x7bf3, 0x35e1, 0x35d5, 0x359d, 0x07b3, 0x07ba, 0x3598, 0x083f, 0x3774, 0x37a1, 0x093c, 0x3af0, 0x3af3, 0x0942, 0x0940, 0x3b1b, 0x3b0c, 0x3b1d, 0x3b34, 0x3b28, 0x3b17, 0x093e, 0x3b44, 0x3b42, 0x3b04, 0x3b11, 0x3afa, 0x3b4a, 0x3d91, 0x3d8e, 0x09e1, 0x3d8b, 0x3d8d, 0x3d7f, 0x3d8c, 0x3d7e, 0x3d7c, 0x3d83, 0x09e6, 0x3d88, 0x09e0, 0x0a15, 0x3e94, 0x0a93, 0x3f55, 0x3f53, 0x3f4f, 0x3f54, 0x406c, 0x4065, 0x4066, 0x4061, /* 0x48 */ 0x406b, 0x4068, 0x4076, 0x0ae7, 0x4060, 0x7e0f, 0x4074, 0x4106, 0x420e, 0x0bad, 0x4207, 0x0bae, 0x0be3, 0x42b9, 0x0bf5, 0x42b7, 0x42e2, 0x0c06, 0x4374, 0x4377, 0x4376, 0x4375, 0x0c4f, 0x4378, 0x4371, 0x0c54, 0x437a, 0x3d5b, 0x437b, 0x44a6, 0x44ae, 0x44b8, 0x0ccb, 0x0ce3, 0x0cc9, 0x44b1, 0x44af, 0x0d13, 0x4589, 0x4587, 0x0d15, 0x0d61, 0x4629, 0x0d66, 0x462a, 0x0d64, 0x462d, 0x462c, 0x0d60, 0x4632, 0x0d63, 0x46ec, 0x46f0, 0x4781, 0x479e, 0x4783, 0x0e0a, 0x4792, 0x0e04, 0x47a3, 0x479f, 0x4793, 0x0e07, 0x4786, 0x48b8, 0x48b7, 0x0e8d, 0x0e8f, 0x0e90, 0x0e92, 0x0eec, 0x49c8, 0x49b6, 0x866c, 0x49d1, 0x0ee7, 0x49a8, 0x49ab, 0x0ef2, 0x49b3, 0x49cd, 0x0eee, 0x49cf, 0x49a4, 0x0eef, 0x0f4c, 0x4b41, 0x4b6f, 0x4b71, 0x0f5e, 0x0f5f, 0x0f76, 0x0f74, 0x0f72, /* 0x49 */ 0x0f90, 0x4c23, 0x4c5b, 0x0fbe, 0x4c61, 0x4c5f, 0x4d81, 0x1026, 0x1025, 0x4d84, 0x4e13, 0x1074, 0x4e4a, 0x4e4c, 0x10fd, 0x1105, 0x1101, 0x50bd, 0x5095, 0x1109, 0x5092, 0x50c3, 0x110c, 0x5096, 0x50a5, 0x50b5, 0x50b3, 0x50a3, 0x50e4, 0x50d8, 0x50d5, 0x110d, 0x50b7, 0x50ad, 0x50da, 0x5093, 0x5336, 0x11c0, 0x11c5, 0x11c9, 0x533d, 0x532b, 0x5347, 0x5339, 0x11d5, 0x5345, 0x531d, 0x1241, 0x54ff, 0x54ea, 0x1233, 0x54f5, 0x123a, 0x5500, 0x54ed, 0x5503, 0x54e9, 0x1240, 0x1242, 0x55ea, 0x12e8, 0x569b, 0x568e, 0x56a2, 0x12e4, 0x569c, 0x5694, 0x5690, 0x56a9, 0x56ac, 0x12e7, 0x569f, 0x12e6, 0x12e1, 0x569d, 0x1339, 0x5867, 0x135c, 0x1375, 0x58d0, 0x58d6, 0x58d4, 0x5998, 0x599a, 0x5997, 0x13ae, 0x13b0, 0x13fa, 0x5a0b, 0x5a08, 0x5a01, 0x5ab4, 0x5ab3, 0x145b, /* 0x4a */ 0x5ba1, 0x5ba2, 0x14a5, 0x5c5a, 0x14a2, 0x5c61, 0x5c5f, 0x14db, 0x14da, 0x5d25, 0x5d7b, 0x5d76, 0x5d7c, 0x1524, 0x5e89, 0x5ef6, 0x5eb1, 0x5ead, 0x5e92, 0x5e81, 0x5e84, 0x1526, 0x5eae, 0x5e90, 0x5e9e, 0x1598, 0x1596, 0x159a, 0x61a2, 0x61a7, 0x1597, 0x15e1, 0x15e0, 0x15e3, 0x15e2, 0x62a0, 0x629d, 0x629f, 0x62d0, 0x15fb, 0x62d1, 0x1612, 0x1614, 0x6359, 0x1645, 0x6364, 0x165c, 0x165d, 0x16b8, 0x6419, 0x16ba, 0x6414, 0x6415, 0x641a, 0x1703, 0x1735, 0x1736, 0x1739, 0x6506, 0x172d, 0x64f8, 0x6501, 0x177a, 0x65be, 0x65bc, 0x65b7, 0x65b6, 0x65c0, 0x1778, 0x65b8, 0x177b, 0x177c, 0x177e, 0x65c4, 0x177d, 0x65bf, 0x17c9, 0x66da, 0x66e4, 0x66e9, 0x66e8, 0x66ea, 0x66e5, 0x17f3, 0x6726, 0x181a, 0x1819, 0x6740, 0x181f, 0x18a6, 0x18a7, 0x18a8, 0x18ab, 0x18a9, /* 0x4b */ 0x192e, 0x6abd, 0x195e, 0x0095, 0x0093, 0x0092, 0x1d0e, 0x0096, 0x1cf7, 0x0097, 0x1cfc, 0x1d0d, 0x1d01, 0x1dda, 0x1dd9, 0x1ddb, 0x1e86, 0x1e8e, 0x1eee, 0x1f33, 0x1fb1, 0x01f5, 0x2247, 0x222d, 0x2254, 0x01ea, 0x224b, 0x2252, 0x2231, 0x2244, 0x2256, 0x2250, 0x222b, 0x01f3, 0x224d, 0x2237, 0x224f, 0x24a2, 0x24b7, 0x0269, 0x24b2, 0x026b, 0x24aa, 0x24b5, 0x24b0, 0x026c, 0x24b4, 0x24a4, 0x24a7, 0x0268, 0x2526, 0x26fe, 0x0328, 0x2704, 0x0326, 0x26fc, 0x0325, 0x2706, 0x270a, 0x26fa, 0x270d, 0x2700, 0x270e, 0x036b, 0x040f, 0x0408, 0x2991, 0x040c, 0x298f, 0x2990, 0x2998, 0x29a4, 0x299b, 0x29a3, 0x2996, 0x29e4, 0x2a5a, 0x0460, 0x0462, 0x2a5e, 0x0498, 0x2bb8, 0x2d57, 0x2d5c, 0x2da6, 0x2d95, 0x2d88, 0x058a, 0x2da3, 0x2d8f, 0x0584, 0x2d64, 0x057f, 0x2d59, /* 0x4c */ 0x2d78, 0x0582, 0x2d85, 0x2d87, 0x2d9e, 0x0596, 0x0589, 0x2d98, 0x2d9c, 0x058d, 0x05bc, 0x2e2f, 0x3080, 0x309b, 0x308e, 0x308d, 0x3094, 0x30c6, 0x0644, 0x30a8, 0x3083, 0x063c, 0x30b9, 0x3086, 0x30b4, 0x30af, 0x3091, 0x064e, 0x30aa, 0x30a1, 0x30a7, 0x32b6, 0x32b3, 0x0714, 0x32bc, 0x32ac, 0x0715, 0x32ad, 0x360e, 0x07ce, 0x361c, 0x361a, 0x07e0, 0x07c2, 0x360b, 0x07bf, 0x35ef, 0x360c, 0x35f0, 0x3622, 0x07c4, 0x35d8, 0x07cf, 0x3612, 0x35fa, 0x07c8, 0x362a, 0x07cc, 0x3610, 0x07cd, 0x07c7, 0x3629, 0x35f9, 0x35ea, 0x362c, 0x3624, 0x18b7, 0x35e9, 0x3752, 0x374f, 0x3753, 0x0843, 0x08b6, 0x3b10, 0x3b65, 0x3b75, 0x0951, 0x094a, 0x094d, 0x0956, 0x3bd0, 0x0953, 0x3b5c, 0x3b3d, 0x3b71, 0x0959, 0x3b91, 0x3b0b, 0x3b79, 0x3b81, 0x3b8f, 0x094e, 0x3b59, 0x3b74, /* 0x4d */ 0x09ee, 0x3dae, 0x09ec, 0x3da3, 0x3dad, 0x09eb, 0x09ef, 0x3dab, 0x3da6, 0x3da2, 0x09ed, 0x1ef2, 0x3e57, 0x3e55, 0x3e99, 0x3f4b, 0x407a, 0x0af2, 0x0aef, 0x0af1, 0x408c, 0x4084, 0x0aed, 0x0af0, 0x4082, 0x4093, 0x407b, 0x0aee, 0x4109, 0x181b, 0x0b50, 0x0b66, 0x0284, 0x0bb8, 0x0bf6, 0x438a, 0x0c57, 0x4390, 0x0c5e, 0x44c6, 0x44d3, 0x44c0, 0x44d2, 0x44c7, 0x44c2, 0x0d19, 0x459f, 0x459d, 0x459e, 0x0d70, 0x4641, 0x0d6e, 0x4638, 0x463a, 0x4642, 0x0d72, 0x0d76, 0x463e, 0x46b0, 0x47ae, 0x47b3, 0x0e12, 0x0e1f, 0x47bf, 0x0e11, 0x0e16, 0x47cd, 0x0e19, 0x47b2, 0x0e24, 0x0e14, 0x0e25, 0x0e95, 0x0e96, 0x0e93, 0x0e94, 0x48c4, 0x48cd, 0x48c2, 0x48c6, 0x48c3, 0x48c9, 0x48c7, 0x0ea0, 0x49f8, 0x0efb, 0x49ed, 0x49e2, 0x0efc, 0x0f00, 0x0ef8, 0x49dc, 0x4a02, 0x4a01, /* 0x4e */ 0x0ef9, 0x49d6, 0x0f04, 0x49e4, 0x49fe, 0x0f03, 0x4a00, 0x49fc, 0x49fd, 0x0ef3, 0x49f5, 0x49ff, 0x0efa, 0x49eb, 0x49e5, 0x4b78, 0x4bae, 0x4be7, 0x0fbf, 0x4c65, 0x4c6a, 0x4c66, 0x4c68, 0x4c6b, 0x4d94, 0x4da1, 0x4d92, 0x4d96, 0x4d93, 0x1079, 0x1110, 0x5101, 0x1114, 0x50f8, 0x110e, 0x50f5, 0x111a, 0x5104, 0x1119, 0x1121, 0x1123, 0x111f, 0x511b, 0x5103, 0x5133, 0x5134, 0x50ed, 0x1125, 0x112b, 0x5135, 0x1116, 0x5105, 0x1122, 0x111b, 0x11ce, 0x11cf, 0x537d, 0x11cb, 0x11d1, 0x11cc, 0x5371, 0x1217, 0x545c, 0x54e6, 0x550f, 0x551b, 0x1251, 0x55a9, 0x55a5, 0x55ee, 0x56b1, 0x12ed, 0x56cc, 0x56ce, 0x12f4, 0x56b7, 0x12f1, 0x56b5, 0x56e9, 0x56b4, 0x12f8, 0x56b3, 0x56c1, 0x56af, 0x56ca, 0x56d0, 0x132f, 0x135e, 0x135d, 0x588e, 0x1376, 0x1377, 0x58e9, 0x58db, /* 0x4f */ 0x137e, 0x58eb, 0x59a4, 0x13b6, 0x59a2, 0x599d, 0x13b3, 0x13fc, 0x1403, 0x1400, 0x5a2a, 0x5a28, 0x140a, 0x1402, 0x5ab8, 0x5ab6, 0x5ab9, 0x5ab7, 0x5b22, 0x5b2b, 0x5b27, 0x5b19, 0x5ba4, 0x1487, 0x5bb3, 0x14a6, 0x5c71, 0x5c6a, 0x14a9, 0x14de, 0x5d88, 0x5d8c, 0x5ebf, 0x5eb8, 0x5ebe, 0x5edc, 0x5ee5, 0x152e, 0x152d, 0x5ed4, 0x5ed6, 0x1530, 0x5eda, 0x5eed, 0x5ef3, 0x5edb, 0x152b, 0x5eb9, 0x5ee2, 0x5eeb, 0x61af, 0x159e, 0x61b2, 0x61b3, 0x159f, 0x15e5, 0x15e4, 0x62a3, 0x62a5, 0x15fd, 0x15fc, 0x1617, 0x1619, 0x630a, 0x1618, 0x6387, 0x6389, 0x638c, 0x63ef, 0x642a, 0x6422, 0x16bf, 0x641f, 0x173c, 0x6519, 0x176b, 0x65ca, 0x65da, 0x1783, 0x1781, 0x1780, 0x65de, 0x65c8, 0x65e0, 0x17ca, 0x66b6, 0x66b5, 0x17ce, 0x66f4, 0x17f6, 0x676b, 0x6769, 0x6772, 0x6763, /* 0x50 */ 0x1839, 0x690d, 0x18ae, 0x6901, 0x690c, 0x18b5, 0x68f8, 0x18b3, 0x18b4, 0x68fe, 0x6902, 0x6a84, 0x1922, 0x6aab, 0x6aaa, 0x1d1d, 0x1d16, 0x0099, 0x1d2b, 0x1d1e, 0x1d1b, 0x1e90, 0x1e94, 0x1f14, 0x7289, 0x0202, 0x2267, 0x0201, 0x227b, 0x02a1, 0x225f, 0x2261, 0x01fd, 0x0273, 0x0274, 0x0270, 0x0276, 0x0275, 0x0272, 0x24c3, 0x24ca, 0x24bb, 0x24c0, 0x24c4, 0x2501, 0x271f, 0x2718, 0x2711, 0x2715, 0x0329, 0x2712, 0x271c, 0x032a, 0x2722, 0x2779, 0x29a6, 0x0416, 0x29b3, 0x29ab, 0x2aea, 0x0499, 0x2b5b, 0x04d3, 0x04f5, 0x2db7, 0x2dce, 0x2db9, 0x2dbd, 0x2dcf, 0x2dc0, 0x2d99, 0x2d97, 0x0594, 0x2dbb, 0x2dd0, 0x2dc4, 0x2e31, 0x0656, 0x30d3, 0x30c0, 0x0659, 0x0658, 0x0655, 0x0652, 0x30dc, 0x30d1, 0x30c8, 0x0657, 0x30d5, 0x32c3, 0x071b, 0x071c, 0x32bf, 0x32c5, /* 0x51 */ 0x0719, 0x32cd, 0x32c1, 0x3306, 0x073f, 0x3324, 0x3663, 0x3642, 0x3652, 0x07db, 0x3643, 0x3633, 0x07e2, 0x366c, 0x3657, 0x07d7, 0x364c, 0x366e, 0x07de, 0x07e5, 0x07e4, 0x07e6, 0x07d6, 0x3637, 0x07df, 0x3671, 0x364a, 0x3636, 0x07dc, 0x3653, 0x07da, 0x3645, 0x3670, 0x07d3, 0x07d0, 0x365c, 0x3758, 0x3757, 0x0886, 0x0887, 0x08ad, 0x08b7, 0x0958, 0x096a, 0x3bbb, 0x0962, 0x0961, 0x3bbe, 0x0969, 0x096c, 0x0965, 0x3bb5, 0x3bd3, 0x3b9f, 0x0966, 0x3bb7, 0x3bf5, 0x3db7, 0x09f5, 0x3dbb, 0x09f4, 0x3dd1, 0x09f7, 0x3dba, 0x09f8, 0x3db6, 0x3dcc, 0x09fb, 0x09fc, 0x3dd3, 0x409b, 0x0af5, 0x0af8, 0x4096, 0x40a2, 0x409d, 0x410a, 0x410e, 0x0b3c, 0x4181, 0x422c, 0x4237, 0x4236, 0x423b, 0x0bc5, 0x42a1, 0x0c62, 0x0c63, 0x4398, 0x0c67, 0x4396, 0x0c66, 0x0cd9, 0x0cdb, /* 0x52 */ 0x44d6, 0x44eb, 0x0cd8, 0x44dc, 0x0d1b, 0x45a5, 0x45a9, 0x6434, 0x4653, 0x4645, 0x0d79, 0x464f, 0x0d7d, 0x46bd, 0x46bb, 0x46f1, 0x0e2c, 0x0e37, 0x47ec, 0x47ed, 0x0e30, 0x0e9a, 0x48d3, 0x1600, 0x48e1, 0x0f05, 0x4a19, 0x0f07, 0x0f09, 0x0f0a, 0x4a27, 0x4a26, 0x0f79, 0x0fc2, 0x4c6e, 0x4daf, 0x1038, 0x1037, 0x4dad, 0x1021, 0x4daa, 0x4e18, 0x105e, 0x113d, 0x1137, 0x1140, 0x516f, 0x514c, 0x111d, 0x5142, 0x1133, 0x515c, 0x5170, 0x515f, 0x1135, 0x515a, 0x514b, 0x513f, 0x538a, 0x11d8, 0x538b, 0x53a1, 0x538e, 0x11dc, 0x11de, 0x5399, 0x545e, 0x545f, 0x5524, 0x55a7, 0x56ea, 0x56fd, 0x56f9, 0x56e3, 0x56e5, 0x12fa, 0x12fb, 0x56ec, 0x133d, 0x133b, 0x133f, 0x135f, 0x58f2, 0x137f, 0x58ef, 0x1384, 0x59a6, 0x13bc, 0x1414, 0x140f, 0x5a3b, 0x5a43, 0x140e, 0x5a32, /* 0x53 */ 0x5b31, 0x5b30, 0x1460, 0x5b2d, 0x5b3c, 0x5ba7, 0x5ba5, 0x14ab, 0x14ac, 0x14aa, 0x5d37, 0x5d95, 0x5d8e, 0x1504, 0x5d96, 0x1508, 0x5f45, 0x5f0a, 0x1533, 0x1534, 0x5efd, 0x5f17, 0x5f1c, 0x5f07, 0x5f31, 0x5f32, 0x5f2c, 0x5f30, 0x5f03, 0x5f05, 0x15a2, 0x61c2, 0x15a4, 0x61b8, 0x15a5, 0x61c1, 0x15a7, 0x15a6, 0x15e7, 0x62ab, 0x62b7, 0x15ff, 0x15fe, 0x6315, 0x6314, 0x161d, 0x161c, 0x630c, 0x6317, 0x1667, 0x6393, 0x1694, 0x63d2, 0x16c5, 0x16c8, 0x6436, 0x6431, 0x6433, 0x643c, 0x642e, 0x643a, 0x16c9, 0x643d, 0x16c7, 0x64b5, 0x6522, 0x6523, 0x6520, 0x651c, 0x651d, 0x176c, 0x65a0, 0x178a, 0x65ef, 0x65e8, 0x65eb, 0x1788, 0x1787, 0x1786, 0x65e1, 0x65e6, 0x17cf, 0x17d0, 0x66f8, 0x66f5, 0x181c, 0x1823, 0x6783, 0x6794, 0x6784, 0x1849, 0x678b, 0x678f, 0x1843, /* 0x54 */ 0x678c, 0x1848, 0x6789, 0x1847, 0x678e, 0x1846, 0x183f, 0x1844, 0x6924, 0x690f, 0x18be, 0x6913, 0x690a, 0x18c2, 0x18ba, 0x18bc, 0x18c6, 0x692a, 0x691a, 0x18c8, 0x6927, 0x6916, 0x6921, 0x1923, 0x6a85, 0x6aac, 0x6ac6, 0x6ac5, 0x6ad7, 0x6b53, 0x009d, 0x1d28, 0x1d27, 0x1ddf, 0x0124, 0x1f35, 0x1fb3, 0x0207, 0x228a, 0x227d, 0x2289, 0x0279, 0x24cd, 0x24d0, 0x0278, 0x272b, 0x2733, 0x2729, 0x2735, 0x2731, 0x2737, 0x2836, 0x29be, 0x0419, 0x29b9, 0x041c, 0x29bb, 0x0418, 0x2de2, 0x2ddb, 0x2ddd, 0x2ddc, 0x2dda, 0x85af, 0x2dd9, 0x05bd, 0x065d, 0x30df, 0x065a, 0x065e, 0x30e1, 0x065c, 0x30ee, 0x065b, 0x31b5, 0x32d4, 0x32d5, 0x0721, 0x32d0, 0x32d1, 0x32ce, 0x32d7, 0x0720, 0x0732, 0x367d, 0x368a, 0x07f2, 0x36a7, 0x07f5, 0x3699, 0x3682, 0x3688, 0x07ee, 0x07ec, /* 0x55 */ 0x3686, 0x07ea, 0x3698, 0x369d, 0x07ed, 0x07f3, 0x368f, 0x07f6, 0x36aa, 0x0848, 0x375d, 0x0849, 0x380a, 0x0975, 0x3bd7, 0x3bd6, 0x3be5, 0x096f, 0x097b, 0x0973, 0x3bd9, 0x3bda, 0x3bea, 0x0970, 0x3bf6, 0x7d39, 0x0978, 0x3de3, 0x09fe, 0x3de9, 0x0a00, 0x3deb, 0x3def, 0x3df3, 0x3dea, 0x0a01, 0x8621, 0x0a55, 0x0a56, 0x0a9d, 0x3f71, 0x0af9, 0x40ae, 0x0aff, 0x40b3, 0x0afd, 0x40ac, 0x0b43, 0x0b41, 0x4183, 0x4245, 0x424e, 0x4244, 0x42a3, 0x42a5, 0x43a6, 0x43a4, 0x0c6f, 0x43a9, 0x43af, 0x0c8a, 0x0ce5, 0x0ce6, 0x44f0, 0x44f8, 0x44f1, 0x0d7f, 0x4649, 0x0db5, 0x0db6, 0x0dbb, 0x46c2, 0x46f2, 0x46f3, 0x47fa, 0x0e40, 0x47f6, 0x47fc, 0x4818, 0x4808, 0x4812, 0x0e9d, 0x0e9c, 0x48db, 0x48da, 0x0f0f, 0x0f11, 0x0f0d, 0x4a2c, 0x4a4d, 0x0f14, 0x0f13, 0x4b46, 0x4bf6, /* 0x56 */ 0x4c2b, 0x4c74, 0x4db8, 0x4dc8, 0x1082, 0x1083, 0x114d, 0x5192, 0x5193, 0x114f, 0x517f, 0x51ab, 0x5197, 0x114c, 0x1151, 0x51ac, 0x11ee, 0x11e8, 0x18cb, 0x53ce, 0x11eb, 0x53cd, 0x11e2, 0x11e6, 0x53c1, 0x53b1, 0x53c7, 0x11ec, 0x5540, 0x1259, 0x553f, 0x5539, 0x125d, 0x5543, 0x1257, 0x125b, 0x1256, 0x55ab, 0x12fe, 0x571f, 0x5709, 0x570c, 0x1300, 0x1301, 0x5840, 0x1342, 0x5896, 0x1360, 0x58f6, 0x58f7, 0x141d, 0x5a46, 0x5a4f, 0x143e, 0x1469, 0x1465, 0x5b3d, 0x5b41, 0x5f66, 0x5f78, 0x5f5d, 0x5f69, 0x5f74, 0x5f7d, 0x5f6e, 0x5f72, 0x5f73, 0x5f62, 0x5f48, 0x5f53, 0x5f5f, 0x5f68, 0x1538, 0x5f7f, 0x5f6b, 0x15ae, 0x61c4, 0x15ad, 0x62af, 0x62ad, 0x62b2, 0x1602, 0x161f, 0x631a, 0x631b, 0x1622, 0x1620, 0x86f5, 0x166c, 0x639b, 0x639f, 0x1668, 0x166d, 0x166e, /* 0x57 */ 0x16a0, 0x16ce, 0x16d0, 0x16d1, 0x16cb, 0x6440, 0x16d2, 0x6447, 0x16d3, 0x64b7, 0x1720, 0x174e, 0x174b, 0x1772, 0x1770, 0x65a2, 0x1792, 0x178f, 0x6600, 0x65f3, 0x1790, 0x8437, 0x65f5, 0x17d9, 0x17d5, 0x66bd, 0x6700, 0x6702, 0x17fa, 0x6734, 0x6749, 0x679f, 0x184b, 0x67a3, 0x67cd, 0x6799, 0x679d, 0x18d0, 0x18ce, 0x6939, 0x18cf, 0x6944, 0x18c4, 0x18cc, 0x6935, 0x18d2, 0x1935, 0x6aaf, 0x0a03, 0x1d2f, 0x009e, 0x00af, 0x6b8e, 0x020c, 0x229f, 0x229b, 0x229e, 0x2296, 0x2294, 0x22a0, 0x027c, 0x273b, 0x0330, 0x0331, 0x273a, 0x29c1, 0x2b4d, 0x2b5d, 0x2df3, 0x05a1, 0x059e, 0x0668, 0x0661, 0x30f6, 0x30e5, 0x30ea, 0x30e7, 0x3105, 0x0665, 0x30f9, 0x0666, 0x066a, 0x06ab, 0x36ab, 0x36ed, 0x36b2, 0x36b0, 0x36b5, 0x36be, 0x36c1, 0x36c8, 0x07f9, 0x36c0, 0x36bc, /* 0x58 */ 0x36b1, 0x36c4, 0x36bf, 0x0858, 0x088a, 0x3c08, 0x3c03, 0x3bfd, 0x3c10, 0x3c02, 0x3c13, 0x0a04, 0x3dfa, 0x3e00, 0x40b9, 0x40bc, 0x0b02, 0x425b, 0x4251, 0x424f, 0x42eb, 0x43b8, 0x0c79, 0x43b9, 0x43c1, 0x43c0, 0x43be, 0x450b, 0x0ceb, 0x4507, 0x450a, 0x4508, 0x0ce9, 0x450d, 0x4506, 0x4515, 0x45af, 0x0d20, 0x0d21, 0x0d81, 0x46f5, 0x0e4d, 0x0e59, 0x482e, 0x0e58, 0x481b, 0x81d1, 0x481a, 0x4824, 0x0ea5, 0x0ea9, 0x48e6, 0x48e3, 0x0f1a, 0x0f19, 0x4a5d, 0x4a4f, 0x4a66, 0x4a5b, 0x4b47, 0x4bb4, 0x0f96, 0x0f98, 0x0f97, 0x4bfa, 0x4c2e, 0x82df, 0x0fc8, 0x4dce, 0x1043, 0x1045, 0x4e19, 0x1152, 0x1157, 0x51cc, 0x51b2, 0x1155, 0x51bb, 0x51c1, 0x1156, 0x1158, 0x11f2, 0x53e9, 0x53ee, 0x53f0, 0x53d6, 0x540e, 0x53da, 0x5548, 0x554a, 0x554e, 0x554d, 0x55b1, 0x55b0, /* 0x59 */ 0x55b3, 0x1307, 0x5738, 0x5732, 0x1308, 0x572d, 0x130a, 0x5734, 0x0f1b, 0x5729, 0x5874, 0x1361, 0x1362, 0x5903, 0x13c2, 0x13c6, 0x59a9, 0x5a58, 0x141e, 0x1425, 0x5abf, 0x5ac1, 0x5b4a, 0x5bac, 0x14b0, 0x5c89, 0x5d3d, 0x5d3c, 0x5da9, 0x5fa0, 0x153d, 0x5f90, 0x153e, 0x5f93, 0x5f8b, 0x5fad, 0x5fbb, 0x5fb8, 0x1546, 0x1545, 0x5f9c, 0x61d8, 0x61d7, 0x1603, 0x1626, 0x1627, 0x635d, 0x63a9, 0x63da, 0x1698, 0x16ad, 0x16d5, 0x16da, 0x6454, 0x16d9, 0x6455, 0x644b, 0x16dd, 0x643f, 0x64b9, 0x1715, 0x1716, 0x1717, 0x1721, 0x6538, 0x6536, 0x6540, 0x174c, 0x653b, 0x6539, 0x65a4, 0x1796, 0x1798, 0x6608, 0x660c, 0x179b, 0x6610, 0x17ff, 0x6707, 0x1825, 0x67d2, 0x184f, 0x67c2, 0x67bb, 0x67cc, 0x67cb, 0x1856, 0x1854, 0x694d, 0x6963, 0x694e, 0x18d8, 0x6950, 0x6955, /* 0x5a */ 0x18d7, 0x695e, 0x1926, 0x6a90, 0x6ab2, 0x6ab1, 0x1938, 0x6aca, 0x6b02, 0x6b27, 0x6b26, 0x198a, 0x22af, 0x24e0, 0x24dc, 0x0334, 0x2739, 0x0335, 0x856a, 0x277c, 0x27f3, 0x8570, 0x03a1, 0x286b, 0x29c4, 0x310b, 0x3108, 0x310a, 0x066c, 0x066d, 0x31dc, 0x0729, 0x072a, 0x32e1, 0x32df, 0x36ce, 0x36d4, 0x36e3, 0x36d7, 0x36e2, 0x0800, 0x0808, 0x0806, 0x0805, 0x36d8, 0x36d5, 0x36d2, 0x08b1, 0x0988, 0x3c1e, 0x3c2c, 0x3c25, 0x3bf3, 0x3e04, 0x3e08, 0x3e15, 0x0a09, 0x40c4, 0x40c9, 0x40c7, 0x40c8, 0x42a9, 0x43c6, 0x43c5, 0x4518, 0x451a, 0x4520, 0x0d22, 0x4666, 0x4664, 0x466a, 0x0dd5, 0x0e61, 0x0e5d, 0x0e62, 0x0e4f, 0x0e60, 0x4835, 0x4834, 0x0eaa, 0x0f22, 0x4a6c, 0x0f21, 0x4a6e, 0x4a71, 0x1046, 0x4dd4, 0x4dd6, 0x4e1a, 0x4e62, 0x4e65, 0x4e76, 0x51db, 0x51d6, /* 0x5b */ 0x1162, 0x51e7, 0x1160, 0x1164, 0x51f4, 0x86b6, 0x53fd, 0x53d5, 0x5407, 0x11f6, 0x540f, 0x53f8, 0x86c1, 0x1219, 0x5587, 0x1291, 0x55b5, 0x55f5, 0x130d, 0x573f, 0x5743, 0x574c, 0x1365, 0x590b, 0x5a6b, 0x5a68, 0x5a70, 0x5a75, 0x5a77, 0x143f, 0x5ac3, 0x154b, 0x5fe9, 0x5fea, 0x5fcb, 0x5fc5, 0x5fc6, 0x1548, 0x5fed, 0x5fd3, 0x1552, 0x5fe5, 0x154a, 0x1551, 0x5fdb, 0x5feb, 0x5fe0, 0x5fc1, 0x1550, 0x154c, 0x61dd, 0x15ee, 0x1604, 0x1606, 0x162d, 0x162e, 0x162f, 0x167b, 0x1678, 0x1677, 0x63b2, 0x63b4, 0x63b1, 0x63b5, 0x63f2, 0x16a2, 0x16a1, 0x16e3, 0x6456, 0x171a, 0x1719, 0x1757, 0x6544, 0x179e, 0x6626, 0x661f, 0x6618, 0x6621, 0x6617, 0x17dd, 0x6709, 0x1805, 0x1828, 0x67c5, 0x67df, 0x1860, 0x67e3, 0x1866, 0x67e9, 0x67ee, 0x1867, 0x1868, 0x6966, 0x697a, /* 0x5c */ 0x18de, 0x696e, 0x6991, 0x6983, 0x6976, 0x697e, 0x696d, 0x18e1, 0x6a95, 0x6ae3, 0x1969, 0x1977, 0x6b03, 0x6b04, 0x8719, 0x6b17, 0x00a6, 0x1d36, 0x00a5, 0x1f36, 0x0214, 0x2742, 0x0336, 0x0338, 0x2744, 0x2746, 0x277e, 0x29ca, 0x29c8, 0x29cc, 0x2af0, 0x0670, 0x3185, 0x32e5, 0x32e7, 0x072b, 0x0811, 0x080a, 0x36f4, 0x080d, 0x36e9, 0x0816, 0x0810, 0x0809, 0x080e, 0x087a, 0x3c3d, 0x098c, 0x3c36, 0x0991, 0x3e16, 0x0a0a, 0x3e12, 0x3e0f, 0x3e17, 0x3e11, 0x3e0b, 0x0a08, 0x0a0b, 0x40cd, 0x40d0, 0x40cc, 0x40ce, 0x40d1, 0x0b07, 0x4189, 0x0cf2, 0x466f, 0x484b, 0x4844, 0x4855, 0x0eae, 0x0f24, 0x0f26, 0x0f27, 0x4a7f, 0x5771, 0x0f99, 0x4c2f, 0x4c7a, 0x4c7b, 0x4c7c, 0x115f, 0x116a, 0x1171, 0x51fc, 0x5210, 0x5202, 0x116c, 0x116f, 0x51ee, 0x5203, 0x1168, 0x520d, /* 0x5d */ 0x5213, 0x5208, 0x520f, 0x5418, 0x5412, 0x1201, 0x1268, 0x5567, 0x5565, 0x55bb, 0x5769, 0x5762, 0x1313, 0x576e, 0x1316, 0x5761, 0x1318, 0x5764, 0x574d, 0x5851, 0x1389, 0x13c8, 0x5a83, 0x5ac6, 0x1484, 0x601f, 0x1554, 0x6004, 0x6017, 0x6008, 0x6005, 0x1556, 0x5ff3, 0x601e, 0x6002, 0x601a, 0x601b, 0x6027, 0x601c, 0x155a, 0x62b5, 0x1605, 0x1607, 0x6333, 0x1631, 0x6334, 0x6331, 0x63b8, 0x63ba, 0x16a3, 0x63fc, 0x16eb, 0x171c, 0x64c3, 0x175a, 0x654d, 0x175b, 0x662f, 0x17a6, 0x17aa, 0x17a5, 0x66c9, 0x17e1, 0x66c8, 0x66c4, 0x672a, 0x6738, 0x6750, 0x182a, 0x680a, 0x67fb, 0x6804, 0x67fc, 0x67fe, 0x1872, 0x186f, 0x1873, 0x6802, 0x67f6, 0x681b, 0x67f9, 0x6815, 0x6810, 0x67ff, 0x6800, 0x680c, 0x186b, 0x18e6, 0x6995, 0x69a5, 0x18e9, 0x18ec, 0x18e8, 0x18f0, /* 0x5e */ 0x6a98, 0x6ac1, 0x198c, 0x6b5a, 0x1d64, 0x22bb, 0x0215, 0x24e6, 0x2749, 0x27f7, 0x0371, 0x0426, 0x29d0, 0x04c6, 0x2bc2, 0x05a8, 0x3111, 0x0673, 0x36ff, 0x36fe, 0x36fd, 0x0815, 0x3701, 0x0998, 0x0997, 0x3c4b, 0x3c4d, 0x3c47, 0x40d3, 0x4268, 0x4267, 0x0bd7, 0x0c80, 0x43d1, 0x4530, 0x4532, 0x452e, 0x0d88, 0x6b9d, 0x46c9, 0x46c8, 0x0e69, 0x4856, 0x4851, 0x0e6b, 0x0f29, 0x0f28, 0x4a85, 0x4a89, 0x4a8e, 0x4a84, 0x105f, 0x4e6a, 0x522b, 0x522f, 0x5228, 0x1174, 0x5216, 0x5215, 0x521d, 0x541a, 0x1202, 0x126a, 0x1294, 0x55bc, 0x5775, 0x577c, 0x138a, 0x5911, 0x5912, 0x5b5c, 0x5dbb, 0x1564, 0x5ff4, 0x155e, 0x1561, 0x602d, 0x1565, 0x1566, 0x62e4, 0x6337, 0x6336, 0x6367, 0x63be, 0x63bd, 0x63e2, 0x6468, 0x6466, 0x64c8, 0x64ca, 0x64c7, 0x64dc, 0x175f, 0x654f, /* 0x5f */ 0x65a9, 0x663c, 0x17af, 0x663b, 0x66ce, 0x180d, 0x6714, 0x6753, 0x187c, 0x682e, 0x187a, 0x681f, 0x1876, 0x1879, 0x187d, 0x1877, 0x69b0, 0x69bd, 0x18f6, 0x18f1, 0x69ae, 0x69c4, 0x6a7b, 0x0c0b, 0x1929, 0x6a9e, 0x196f, 0x6b05, 0x199a, 0x6b69, 0x6ba1, 0x22c7, 0x231d, 0x274a, 0x29d3, 0x0469, 0x2b72, 0x2e02, 0x05ab, 0x2e35, 0x3127, 0x311e, 0x311f, 0x072c, 0x072d, 0x3707, 0x3706, 0x0817, 0x099a, 0x3c54, 0x3e1c, 0x3e20, 0x46f8, 0x0e6e, 0x485d, 0x4858, 0x0f2c, 0x4a92, 0x4b4e, 0x0fca, 0x1178, 0x1206, 0x5427, 0x1207, 0x5781, 0x5783, 0x1320, 0x5844, 0x1353, 0x13ce, 0x147a, 0x1479, 0x6042, 0x604d, 0x6054, 0x604e, 0x156b, 0x6043, 0x1567, 0x156d, 0x633c, 0x6340, 0x63c0, 0x1685, 0x16b0, 0x16f3, 0x1763, 0x655a, 0x6651, 0x17b6, 0x66dd, 0x1882, 0x187f, 0x6838, /* 0x60 */ 0x1886, 0x6845, 0x683a, 0x1884, 0x6835, 0x18fc, 0x18fd, 0x18fa, 0x6af1, 0x1987, 0x6b93, 0x1e9a, 0x021a, 0x0219, 0x5241, 0x29d7, 0x0675, 0x3128, 0x081a, 0x081b, 0x0819, 0x3c53, 0x3c59, 0x099c, 0x3e21, 0x0a10, 0x426f, 0x4537, 0x45b5, 0x4862, 0x485e, 0x48f5, 0x117b, 0x117c, 0x523d, 0x1208, 0x542d, 0x5589, 0x578d, 0x5787, 0x5790, 0x591a, 0x5a99, 0x1441, 0x14e3, 0x1572, 0x605f, 0x1573, 0x1568, 0x6056, 0x6061, 0x605b, 0x605a, 0x605c, 0x6065, 0x1635, 0x6341, 0x1688, 0x169d, 0x646e, 0x646c, 0x646d, 0x0e75, 0x65aa, 0x665c, 0x6658, 0x66de, 0x188f, 0x684f, 0x6851, 0x188e, 0x6853, 0x1905, 0x1904, 0x18ff, 0x69fc, 0x6b39, 0x199e, 0x1d3e, 0x0154, 0x22d2, 0x0281, 0x274f, 0x3714, 0x0cfa, 0x4672, 0x4673, 0x0f32, 0x1270, 0x126e, 0x5791, 0x86d6, 0x147c, 0x5dbf, /* 0x61 */ 0x1575, 0x606c, 0x1574, 0x1577, 0x62e6, 0x6345, 0x1637, 0x63c8, 0x63e4, 0x655d, 0x17ba, 0x6721, 0x1811, 0x672c, 0x6757, 0x1892, 0x1899, 0x685d, 0x6861, 0x6865, 0x6a08, 0x190a, 0x192a, 0x192b, 0x1944, 0x1979, 0x6b45, 0x00aa, 0x0348, 0x2e05, 0x32ef, 0x371b, 0x371d, 0x3e25, 0x3e24, 0x486d, 0x0eb4, 0x5242, 0x5249, 0x120d, 0x5578, 0x558a, 0x5797, 0x1354, 0x589b, 0x591c, 0x1430, 0x5aa2, 0x1609, 0x1638, 0x1636, 0x168b, 0x16f7, 0x1766, 0x17bd, 0x181e, 0x686c, 0x1896, 0x686f, 0x190d, 0x6a0e, 0x1973, 0x6b08, 0x6b1d, 0x6ba3, 0x033b, 0x033c, 0x2b60, 0x371c, 0x09a0, 0x0cfb, 0x6cfd, 0x48f3, 0x1181, 0x579b, 0x5aa7, 0x5dc4, 0x1578, 0x607a, 0x168d, 0x1773, 0x6661, 0x6663, 0x66d7, 0x6876, 0x19a6, 0x6ba5, 0x05ad, 0x3c67, 0x0a11, 0x3eab, 0x524a, 0x557d, 0x579d, /* 0x62 */ 0x5853, 0x5b65, 0x607b, 0x1639, 0x64cd, 0x64dd, 0x17bf, 0x6730, 0x6a16, 0x190f, 0x19a7, 0x19b5, 0x0bdc, 0x1431, 0x62e7, 0x6a18, 0x6aa2, 0x19a8, 0x6b7c, 0x0d25, 0x4a9e, 0x6084, 0x17c1, 0x6a1c, 0x0d90, 0x4871, 0x63ca, 0x1296, 0x147f, 0x1910, 0x6aa3, 0x160a, 0x687b, 0x6b97, 0x1912, 0x163a, 0x6350, 0x163b, }; static const unsigned short cns11643_3_2uni_page64[292] = { /* 0x64 */ 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x1b66, 0x1b68, 0x1be7, 0x1c3f, 0x6cfd, 0x1ca6, 0x1d0f, 0x1e3e, 0x1f24, 0x1f65, 0x1f9b, 0x1d7f, 0x20cb, 0x2173, 0x2171, 0x216b, 0x21f4, 0x2222, 0x2220, 0x2292, 0x22ba, 0x2291, 0x22b0, 0x2359, 0x238a, 0x240f, 0x2412, 0x2413, 0x2447, 0x249b, 0x2500, 0x254d, 0x26d1, 0x26d3, 0x2767, 0x2857, 0x2877, 0x28d5, 0x2975, 0x298e, 0x29a5, 0x29b6, 0x29bf, 0x2a65, 0x2acd, 0x2aed, 0x2b94, 0x2b9a, 0x2bba, 0x2d25, 0x2d50, 0x2ea3, 0x2f60, 0x2f64, 0x2fb6, /* 0x65 */ 0x3003, 0x30b6, 0x311a, 0x4625, 0x2821, 0x32e2, 0x3302, 0x33a4, 0x33ac, 0x3410, 0x3406, 0x345e, 0x345a, 0x352c, 0x3529, 0x362d, 0x3677, 0x367a, 0x36ca, 0x36e6, 0x36f5, 0x370d, 0x370e, 0x37dc, 0x37dd, 0x37f6, 0x381e, 0x3863, 0x39a5, 0x3a0f, 0x3a8a, 0x3a84, 0x3a8b, 0x3a7c, 0x3b4c, 0x3b48, 0x3b49, 0x3b9d, 0x3b99, 0x3bf8, 0x3c2e, 0x3c2d, 0x3c5c, 0x45cc, 0x3cbf, 0x3cea, 0x3ce5, 0x3d11, 0x3d12, 0x3d3f, 0x3d39, 0x3d3b, 0x3d3d, 0x3d77, 0x3d75, 0x3d76, 0x3d71, 0x3d96, 0x3d93, 0x3db4, 0x3ddd, 0x3dde, 0x3e0e, 0x2511, 0x3e18, 0x3f47, 0x3f48, 0x3fef, 0x4012, 0x403b, 0x40a4, 0x408d, 0x40b4, 0x4273, 0x4277, 0x42bc, 0x4419, 0x441b, 0x443d, 0x4453, 0x4454, 0x4458, 0x44b7, 0x44d8, 0x44ee, 0x4522, 0x454d, 0x4586, 0x4599, 0x45a3, 0x45bc, 0x46a7, 0x4737, 0x4759, /* 0x66 */ 0x47d0, 0x482f, 0x4832, 0x4842, 0x484e, 0x4868, 0x48a9, 0x48ed, 0x49d0, 0x4a07, 0x49d3, 0x4a64, 0x4b40, 0x6cfd, 0x4c41, 0x4c63, 0x4cbb, 0x3311, 0x3325, 0x4e48, 0x4f10, 0x4f62, 0x4f12, 0x5021, 0x501e, 0x50e2, 0x50de, 0x50e1, 0x5173, 0x51d4, 0x51f5, 0x5237, 0x5245, 0x5272, 0x534a, 0x53a9, 0x53a5, 0x53f5, 0x5434, 0x5450, 0x5487, 0x5554, 0x5584, 0x5703, 0x5852, 0x58d8, 0x590c, 0x5918, 0x59b0, 0x5abc, 0x5ad5, 0x5baa, 0x5c9c, 0x6cfd, 0x5d5c, 0x5e2b, 0x5e21, 0x5e73, 0x5ef4, 0x5ef5, 0x5f3f, 0x5f42, 0x5f86, 0x5fbe, 0x5fbc, 0x5fbd, 0x5ff1, 0x5ff2, 0x5fef, 0x6022, 0x6023, 0x6024, 0x6067, 0x6066, 0x6197, 0x61ce, 0x61e7, 0x633b, 0x634d, 0x64e4, 0x6542, 0x671d, 0x6798, 0x6cfd, 0x6949, 0x3049, 0x2a71, 0x2a85, 0x2dd3, 0x650e, 0x4c02, 0x441e, 0x6cfd, 0x6cfd, /* 0x67 */ 0x2128, 0x2172, 0x21ba, 0x21f0, 0x21ee, 0x22b8, 0x22b9, 0x22c4, 0x4c53, 0x5eb0, }; static const ucs4_t cns11643_3_2uni_upages[136] = { 0x03400, 0x03500, 0x03600, 0x03700, 0x03800, 0x03900, 0x03a00, 0x03b00, 0x03c00, 0x03d00, 0x03e00, 0x03f00, 0x04000, 0x04100, 0x04200, 0x04300, 0x04400, 0x04500, 0x04600, 0x04700, 0x04800, 0x04900, 0x04a00, 0x04b00, 0x04c00, 0x04d00, 0x04e00, 0x04f00, 0x05000, 0x05100, 0x05200, 0x05300, 0x05400, 0x05500, 0x05600, 0x05700, 0x05800, 0x05900, 0x05a00, 0x05b00, 0x05c00, 0x05d00, 0x05e00, 0x05f00, 0x06000, 0x06100, 0x06200, 0x06300, 0x06400, 0x06500, 0x06600, 0x06700, 0x06800, 0x06900, 0x06a00, 0x06b00, 0x06c00, 0x06d00, 0x06e00, 0x06f00, 0x07000, 0x07100, 0x07200, 0x07300, 0x07400, 0x07500, 0x07600, 0x07700, 0x07800, 0x07900, 0x07a00, 0x07b00, 0x07c00, 0x07d00, 0x07e00, 0x07f00, 0x08000, 0x08100, 0x08200, 0x08300, 0x08400, 0x08500, 0x08600, 0x08700, 0x08800, 0x08900, 0x08a00, 0x08b00, 0x08c00, 0x08d00, 0x08e00, 0x08f00, 0x09000, 0x09100, 0x09200, 0x09300, 0x09400, 0x09500, 0x09600, 0x09700, 0x09800, 0x09900, 0x09a00, 0x09b00, 0x09c00, 0x09d00, 0x09e00, 0x09f00, 0x0ff00, 0x20000, 0x20100, 0x20200, 0x20500, 0x20600, 0x20b00, 0x20d00, 0x21300, 0x21600, 0x21700, 0x21d00, 0x22300, 0x22500, 0x23000, 0x23500, 0x23c00, 0x24000, 0x24a00, 0x25100, 0x25900, 0x25c00, 0x26500, 0x28c00, 0x29900, 0x2f800, 0x2f900, 0x2fa00, }; static int cns11643_3_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x21 && c1 <= 0x62) || (c1 >= 0x64 && c1 <= 0x67)) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x21 && c2 < 0x7f) { unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); ucs4_t wc = 0xfffd; unsigned short swc; if (i < 6298) { if (i < 6148) swc = cns11643_3_2uni_page21[i], wc = cns11643_3_2uni_upages[swc>>8] | (swc & 0xff); } else { if (i < 6590) swc = cns11643_3_2uni_page64[i-6298], wc = cns11643_3_2uni_upages[swc>>8] | (swc & 0xff); } if (wc != 0xfffd) { *pwc = wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } freelan-2.0/third-party/source/libiconv-msvc/include/cns11643_4.h000066400000000000000000000036661252300335000245160ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CNS 11643-1992 plane 4 */ /* * The table has been split into two parts. Each part's entries fit it 16 bits. * But the combined table would need 17 bits per entry. */ #include "cns11643_4a.h" #include "cns11643_4b.h" static int cns11643_4_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x21 && c1 <= 0x6e)) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x21 && c2 < 0x7f) { unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); ucs4_t wc = 0xfffd; unsigned short swc; { if (i < 2914) swc = cns11643_4a_2uni_page21[i], wc = cns11643_4a_2uni_upages[swc>>8] | (swc & 0xff); else if (i < 7298) swc = cns11643_4b_2uni_page40[i-2914], wc = cns11643_4b_2uni_upages[swc>>8] | (swc & 0xff); } if (wc != 0xfffd) { *pwc = wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } freelan-2.0/third-party/source/libiconv-msvc/include/cns11643_4a.h000066400000000000000000000655671252300335000246670ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CNS 11643-1992 plane 4 part a */ static const unsigned short cns11643_4a_2uni_page21[2914] = { /* 0x21 */ 0x5a86, 0x1840, 0x1841, 0x185a, 0x75e8, 0x1802, 0x1829, 0x5b0e, 0x6027, 0x1c02, 0x013e, 0x27dc, 0x5f3c, 0x6075, 0xd128, 0x1d42, 0x1d6a, 0x2552, 0x6f3c, 0xd175, 0xd178, 0x29c4, 0x2c4c, 0x39ad, 0x1812, 0x182f, 0x1896, 0x18d0, 0x1b42, 0x1b83, 0xd119, 0x60a5, 0x60aa, 0x630f, 0x640e, 0x1d83, 0x1db8, 0x659c, 0x659b, 0x6a3c, 0x2328, 0x71c2, 0x2623, 0x2801, 0x2900, 0x87b4, 0x08b8, 0x376c, 0x392b, 0x1b88, 0x4879, 0x51b6, 0x1817, 0x5a65, 0x000c, 0x5bb2, 0x0030, 0x18e2, 0x18db, 0x5e77, 0x5f42, 0x1bad, 0x6033, 0x1bf7, 0x00da, 0x60af, 0x6236, 0x0113, 0x1d1b, 0x1d88, 0x1d87, 0x6522, 0x1dcf, 0x1dfd, 0x0163, 0x1de7, 0x20dc, 0x69a3, 0x20d9, 0x2125, 0x2127, 0x2333, 0x2613, 0x7225, 0x7224, 0x2675, 0x7652, 0x7789, 0x7abf, 0x05c4, 0x05c3, 0x2ff1, 0x87b5, 0xa24c, /* 0x22 */ 0x4552, 0xc714, 0xc712, 0x0001, 0x5aa3, 0x5aa2, 0x1851, 0x186a, 0x5bb6, 0x190c, 0x5bb5, 0x5bb4, 0x18fe, 0x191b, 0x5bc2, 0x5bb8, 0x003a, 0x5e79, 0x00ab, 0x1b73, 0x5f08, 0x1b8e, 0x5f7a, 0x5fb6, 0x60bd, 0x60b7, 0x60bc, 0x00dd, 0x60c4, 0x60c9, 0x1ca5, 0x0115, 0x1ca7, 0x1ca4, 0x6330, 0x6383, 0x6385, 0x6412, 0x6434, 0x1dbd, 0x64e4, 0x64de, 0x652a, 0x1e02, 0x65af, 0x65b4, 0x65b3, 0x65b1, 0x212b, 0x231b, 0x2335, 0x6cde, 0x02a7, 0x02a5, 0x6db8, 0x6db0, 0x02a6, 0x6fc2, 0x59fd, 0x2617, 0x037c, 0x722a, 0x2670, 0x267d, 0x03a9, 0x75e9, 0x27e9, 0x7657, 0x0434, 0x0435, 0x77b6, 0x77d7, 0x77de, 0x04a8, 0x2919, 0x291c, 0x2975, 0x7ac2, 0x7bab, 0x04ff, 0x29c8, 0x7e8f, 0x05c7, 0x05c6, 0x05c8, 0x7f6d, 0x82b5, 0x06d0, 0x06d1, 0x87c0, 0x87bf, 0x0859, 0x8bb9, 0x8d1c, /* 0x23 */ 0x3412, 0x08bd, 0x8e80, 0x9184, 0x9185, 0x0a28, 0x39b3, 0x9524, 0x0aa9, 0x3a90, 0x3c36, 0xaa4c, 0x0fcc, 0xb1f6, 0x4881, 0x51b8, 0xc370, 0x14b4, 0xc375, 0xc717, 0x1823, 0x0016, 0x002c, 0x5bf1, 0x192e, 0x5bda, 0x1b4f, 0x5fb9, 0x1bba, 0x00df, 0x00e0, 0x1c22, 0x60ce, 0x60d2, 0x60d0, 0x0117, 0x6243, 0x1caf, 0x1cb0, 0x1cb1, 0x624d, 0x6334, 0x012f, 0x63d9, 0x1d64, 0x6418, 0x1dd3, 0x6538, 0x016a, 0x65d7, 0x0170, 0x016d, 0x65dc, 0x65cb, 0x65d6, 0x65d8, 0x016e, 0x65d1, 0xd13e, 0xd13c, 0x65d2, 0x022b, 0x0228, 0x6a59, 0x59fd, 0x233f, 0x6ce5, 0x6ce6, 0x0292, 0x6ce8, 0x238b, 0x6dbd, 0x2391, 0x2395, 0x6dbe, 0x6f49, 0x033f, 0x6fcd, 0x258a, 0x034f, 0x0374, 0x715e, 0x71d0, 0x037d, 0x7306, 0x03b7, 0x03a3, 0x03b0, 0x03b1, 0x2687, 0x03ab, 0x737c, 0x7371, 0x75ef, /* 0x24 */ 0x043a, 0x0437, 0x280d, 0x0438, 0x0440, 0x778d, 0x77b7, 0x288e, 0x049f, 0x7933, 0x797f, 0x297a, 0x7bf2, 0x0504, 0x0509, 0x0506, 0x04fd, 0x050a, 0x0507, 0x7f2a, 0x7f8b, 0x05ca, 0x7f83, 0x7f8a, 0x2c90, 0x05c9, 0x7f8e, 0x2c9a, 0x82b6, 0x2e3c, 0x2e3a, 0x067f, 0x2e98, 0x84d8, 0x06d2, 0x8556, 0x87d2, 0x3065, 0xd1db, 0x0743, 0x87c2, 0x8a87, 0x8a81, 0x8bc2, 0x8bbc, 0x8d23, 0x08c1, 0x8e93, 0x08c5, 0x09a3, 0x918d, 0x918e, 0x0a2a, 0x0a5f, 0x953b, 0x954d, 0x0a5d, 0x9534, 0x9531, 0x96f2, 0x96f0, 0x0b17, 0x9a15, 0x9b28, 0x0b71, 0x0b72, 0x9c25, 0x9de7, 0x0c0f, 0x9de9, 0xa017, 0x40c2, 0x0d91, 0xa96c, 0xa980, 0xaa4b, 0x0fb2, 0x0fcf, 0x0fce, 0x469e, 0xafde, 0xaffb, 0x47eb, 0xb051, 0x4889, 0x1096, 0xb201, 0xb202, 0x4896, 0xb205, 0x4887, 0xb203, 0x1097, 0xc151, /* 0x25 */ 0x51c0, 0x148b, 0x51c3, 0xc153, 0xc37a, 0xc378, 0xc376, 0xc379, 0xc38f, 0xc37c, 0x5578, 0xc71b, 0xc71c, 0x5625, 0x8f92, 0x1875, 0x1874, 0x5b2e, 0x5b2c, 0x002d, 0x5c0c, 0x1999, 0x5c0b, 0x0050, 0x004b, 0x5c05, 0x004f, 0x004c, 0xd105, 0x1971, 0x1b53, 0x1bbf, 0x5fc2, 0x5fc3, 0x1bc0, 0x6048, 0x1bee, 0x6046, 0x00e4, 0x00e3, 0x60ea, 0x00e1, 0x60eb, 0x00e2, 0x60ee, 0x1c3d, 0x0119, 0x1cbd, 0x1d0c, 0x62d8, 0x9a1e, 0x63df, 0x63de, 0x0141, 0x4537, 0x644f, 0x1dc0, 0x015e, 0x660d, 0x6608, 0x0179, 0x6609, 0x1e6e, 0x1e83, 0x6612, 0x6665, 0x1e5e, 0x1e5d, 0x217e, 0x2179, 0x6a89, 0x217a, 0x216c, 0x6a84, 0x6a9e, 0x6a8b, 0x0232, 0x2187, 0x6c62, 0x231d, 0x0294, 0x2346, 0x0297, 0x6cf9, 0x2343, 0x6cf7, 0x0296, 0x0298, 0x6d06, 0x6ddd, 0x02b2, 0x6dd9, 0x6ddf, 0x6de2, /* 0x26 */ 0x02b9, 0x2561, 0x2566, 0x5af1, 0x2590, 0x0375, 0x037f, 0x037e, 0x2629, 0x038f, 0x723f, 0x723e, 0x730b, 0x03bd, 0x26b2, 0x7383, 0x03bb, 0x03bc, 0x7386, 0x26c0, 0x767c, 0x043d, 0x043e, 0x0474, 0x77f7, 0x047a, 0x0476, 0x0478, 0x0475, 0x77fb, 0x793b, 0x04af, 0x04b0, 0x04c7, 0x04cc, 0x7bf9, 0x7bca, 0x0516, 0x7bff, 0x0512, 0x051d, 0x7c09, 0x7c03, 0x0515, 0x050f, 0x0514, 0x2a1f, 0x29e2, 0x7c10, 0x7e9a, 0x7e9f, 0x05b0, 0x05bf, 0x05c0, 0x7f87, 0x05d2, 0x05d9, 0x82b7, 0x067a, 0x8308, 0x82f9, 0x0681, 0x0682, 0x82f4, 0x2f16, 0x2ef9, 0x06da, 0xad57, 0x3088, 0x87d6, 0x309b, 0xd1de, 0x306e, 0x309e, 0x87d4, 0x0822, 0x081f, 0x8a90, 0x8a8d, 0x0821, 0x3324, 0x8b60, 0x8bce, 0x8bcf, 0x085c, 0x337d, 0x8bd1, 0x087d, 0x088d, 0x088f, 0x34e6, 0x8eca, 0x34cb, 0x08d0, /* 0x27 */ 0x8eb7, 0x08d8, 0x8eb2, 0x8ebb, 0x8eb9, 0x34b5, 0x09a7, 0x919e, 0x3797, 0x91b2, 0x379b, 0x0a12, 0x936f, 0x93ac, 0x0a2f, 0x9423, 0x396b, 0x0a2e, 0x0a2c, 0x0a5c, 0x956c, 0x39d5, 0x9532, 0x955e, 0x0a62, 0x0a67, 0x0ab4, 0x96fb, 0x9929, 0x99bd, 0x9a1f, 0x3c43, 0x7941, 0x9a1d, 0x3c9c, 0x9b31, 0x9b2f, 0x0bea, 0x9d43, 0x0bfb, 0x9d41, 0x0c14, 0x9df5, 0x0c13, 0x0c12, 0x0c10, 0x0c11, 0x9df2, 0x0c86, 0x3ee4, 0x0c98, 0xa01e, 0xa254, 0x0d2a, 0xa256, 0xa329, 0xa327, 0xa328, 0x41ce, 0x0eb5, 0xa979, 0xa97e, 0xabb6, 0xabb7, 0x4613, 0x0fd6, 0x0fd8, 0x46b7, 0x0fd9, 0x0fd4, 0x0fd7, 0xd281, 0x46b9, 0x59fd, 0xad4d, 0x47e4, 0x47fd, 0x480f, 0x1060, 0xb109, 0xb108, 0x109e, 0x10a1, 0xb21e, 0xb21a, 0xb223, 0xb215, 0xb219, 0xb216, 0x48bf, 0x48ca, 0xb214, 0xb218, 0x48c1, /* 0x28 */ 0x10a0, 0xb51f, 0xb6dd, 0xb6df, 0xc169, 0x51d0, 0x59fd, 0xc16c, 0x14b9, 0xc393, 0x52ae, 0xc395, 0xc394, 0xc391, 0xc397, 0xc730, 0x15c1, 0x15c2, 0x5638, 0xd318, 0x001c, 0x5c31, 0x005e, 0x19bc, 0x0059, 0x005c, 0x5c36, 0x005f, 0x19e9, 0x19bd, 0x19e2, 0x1b58, 0x5fc9, 0x5fca, 0x00ce, 0x6118, 0x6112, 0x6119, 0x6110, 0x6116, 0x1cc6, 0x625f, 0x1cc8, 0x62df, 0x6317, 0x1d28, 0x633c, 0x1d29, 0x63ea, 0x63e9, 0x641c, 0x6458, 0x6464, 0x64f3, 0x015f, 0x6697, 0x0185, 0x665a, 0x6659, 0x0186, 0x668e, 0x21b4, 0x6abc, 0x21a9, 0x0287, 0x6d0d, 0x6cfc, 0x6d0c, 0x6e07, 0x6e0a, 0x02ca, 0x6e02, 0x02c3, 0x6e26, 0x6e08, 0x6e1d, 0x02c2, 0x2568, 0x6f4e, 0x0341, 0x6fed, 0x6fee, 0x6fef, 0x0380, 0x0381, 0x7250, 0x724c, 0x0393, 0x0392, 0x724f, 0x03c5, 0x73d4, 0x59fd, 0x73b0, /* 0x29 */ 0x0446, 0x0441, 0x0445, 0x0442, 0x043f, 0x76a5, 0x7809, 0x0482, 0x0481, 0x047f, 0x04a5, 0x292b, 0x04b3, 0x04b5, 0x79f3, 0x79d7, 0x298d, 0x04da, 0x7adc, 0x04db, 0x050d, 0x2a18, 0x050e, 0x7c0b, 0x051e, 0x0525, 0x0526, 0x051c, 0x0521, 0x2a57, 0x2a48, 0x0527, 0x051a, 0x7c3a, 0x7c0d, 0x7c11, 0x2a38, 0x7c20, 0x7c01, 0x0524, 0x7c37, 0xd1a3, 0x2a71, 0x7eaa, 0x05c1, 0x05e1, 0x7fe7, 0x7fe8, 0x2d12, 0x05eb, 0x7ff5, 0x05e2, 0x05d7, 0x05e9, 0x8035, 0x7fe6, 0x2d0a, 0x7ff8, 0x2d23, 0x7ff1, 0x0684, 0x8314, 0x8315, 0x8309, 0x06b5, 0x06bc, 0x06dc, 0x06de, 0x06df, 0x857b, 0x2f2a, 0x857e, 0x8766, 0x8767, 0x880a, 0x0754, 0x30e0, 0x30be, 0x0753, 0x0824, 0x0825, 0x3329, 0x0828, 0x0827, 0x8a9c, 0x8b62, 0x8be1, 0x8bde, 0x8bdf, 0x8be9, 0x088b, 0x8ee4, 0x8ef7, 0x08dc, /* 0x2a */ 0x3543, 0x8eea, 0x8ef6, 0x8f12, 0xd201, 0x37a6, 0x09b2, 0x37c0, 0x91d9, 0x392f, 0x935f, 0x0a1b, 0x9373, 0x0a32, 0x3971, 0x943f, 0x9578, 0x0a6b, 0x957d, 0x0a6c, 0x0a6d, 0x9712, 0x0ab9, 0x0aba, 0x0b09, 0x0b0a, 0x992f, 0x3bea, 0x0b1b, 0x9930, 0x99db, 0x3c20, 0x0b58, 0x9a29, 0x0b5a, 0xd236, 0x9b40, 0x0b77, 0x9b3d, 0x9b3e, 0x0b79, 0x3ca9, 0x9b38, 0x3d85, 0x9c48, 0x0beb, 0x9cd0, 0x0bfd, 0x0bfc, 0x3e06, 0x0c15, 0x0c18, 0x3df6, 0x0c16, 0x0c17, 0x0c19, 0x3e00, 0x0c1b, 0x9e0e, 0x9e09, 0x3e02, 0x9e07, 0x0c87, 0x9f5f, 0x9f60, 0x0c9c, 0xa02a, 0x0c9a, 0xa029, 0x0cff, 0x0cfe, 0xa14d, 0x0d31, 0x0d2e, 0x0d30, 0x0d32, 0xa26c, 0x59fd, 0x0d2f, 0xa267, 0x0d95, 0x0d96, 0xa339, 0xa334, 0xa459, 0x0dc5, 0x0e7a, 0xa923, 0x0f42, 0xa982, 0x0f54, 0xa983, 0xa9a8, 0xaa55, /* 0x2b */ 0xaaf9, 0xaaf8, 0xaafc, 0xaafa, 0x4609, 0xd27a, 0x0f9f, 0x0fa0, 0x0fa2, 0x0fe0, 0xad74, 0x0fe1, 0xad6b, 0xad71, 0x0fdf, 0xad76, 0xb10e, 0x1062, 0x1061, 0xb110, 0xb10f, 0x10a7, 0xb238, 0xb239, 0xb23a, 0x48da, 0xb237, 0xb23e, 0x490a, 0x1189, 0xb49c, 0xb52a, 0xb53a, 0xb52b, 0xb528, 0xb6aa, 0xb70f, 0x121d, 0xb710, 0xb8e6, 0x132a, 0xbd25, 0xbe8e, 0x13d3, 0x1442, 0x1443, 0xc18b, 0x1491, 0xc18c, 0xc19a, 0x1490, 0x14bf, 0xc3b3, 0x14bc, 0xc3b2, 0x14c0, 0x15c7, 0x15c5, 0x5655, 0xc744, 0x5652, 0x1835, 0x5b58, 0x5ca7, 0x1a34, 0x1a01, 0x5c63, 0x1a0a, 0x0066, 0x5c6a, 0x5c65, 0x5c6b, 0x00ad, 0x5eed, 0x5fd9, 0x613b, 0x6132, 0x1c58, 0x6135, 0x6131, 0x613e, 0x6143, 0x6136, 0x626d, 0x011d, 0x62e4, 0x0131, 0x1d2b, 0x63f4, 0x014c, 0x6469, 0x646b, 0x0195, 0x0191, /* 0x2c */ 0x0194, 0x66bf, 0x66c3, 0x66ae, 0x018f, 0x1eec, 0x66b1, 0x1f15, 0x1efe, 0x66bb, 0x66af, 0x66b0, 0x1ee3, 0x1f16, 0x0240, 0x6aef, 0x0241, 0x6aed, 0x21d3, 0x6af0, 0x6c93, 0x6d34, 0x6d2b, 0x2359, 0x2427, 0x02d8, 0x02d2, 0x02da, 0x2428, 0x2410, 0x02d7, 0x240e, 0x0342, 0x0357, 0x7004, 0x7003, 0x7002, 0x25af, 0x7005, 0x25ba, 0x25b1, 0x7000, 0x7174, 0x0378, 0x0382, 0x0397, 0x7265, 0x7263, 0x03c9, 0x73d7, 0x03c8, 0x03d6, 0x03cc, 0x73e8, 0x03d0, 0x73db, 0x73d8, 0x03ce, 0x03c7, 0x26fc, 0x7409, 0x03cf, 0x03cb, 0x26f2, 0x26fe, 0x73e5, 0x73e7, 0x27f8, 0x763f, 0x0447, 0x76c0, 0x0448, 0x76b9, 0x76ba, 0x0483, 0x0485, 0x0484, 0x7820, 0x794f, 0x292c, 0x04b8, 0x04bc, 0x7a91, 0x7a90, 0x7aee, 0x7af3, 0x7aec, 0x7af1, 0x7aeb, 0x7af2, 0x7af4, 0x7aed, 0x7c41, 0x7c48, /* 0x2d */ 0x7c45, 0x0531, 0x0534, 0x0536, 0x2a82, 0x7c7f, 0x7c8b, 0x0523, 0x7c3b, 0x7c4e, 0x053a, 0x2a91, 0x2a8f, 0x7c7c, 0x05b4, 0x05b5, 0x05ed, 0x05ec, 0x05d8, 0x7ff0, 0x8036, 0x803f, 0x8043, 0x8031, 0x8034, 0x8046, 0x05f6, 0x05e7, 0x802f, 0x82c3, 0x067c, 0x067b, 0x8336, 0x0688, 0x2e47, 0x2e4c, 0x8321, 0xd1c8, 0x2e8a, 0x8473, 0x06be, 0x84e6, 0x06e7, 0x06e5, 0x06ee, 0x30e1, 0x314a, 0x883f, 0x0759, 0x075e, 0x886b, 0x075a, 0x313f, 0x0761, 0x0758, 0x075b, 0x30bd, 0x8871, 0x075f, 0xd1e2, 0x082a, 0x082d, 0x8ab0, 0x0823, 0x082b, 0x082c, 0x8bf3, 0x087e, 0xd1f5, 0x0893, 0x0899, 0x8d61, 0x8d5f, 0x08b3, 0x08e7, 0x08ea, 0x8f28, 0x8f1e, 0x8f29, 0xd202, 0x8eeb, 0x8f66, 0x09b4, 0x91f6, 0x37c9, 0x0a17, 0x9360, 0x9377, 0x93bb, 0x0a21, 0x93bc, 0x0a38, 0x0a37, 0x0a74, /* 0x2e */ 0x0a73, 0x0a75, 0x95a2, 0x95b2, 0x959e, 0x0a76, 0x0a78, 0x973a, 0x9738, 0x3aba, 0x0b0c, 0x0b20, 0x0b1e, 0x9a4d, 0x0b5b, 0x9a5e, 0x0b5c, 0x9b17, 0x0b83, 0x3cc6, 0x0b80, 0x0b81, 0x0b7e, 0x0b88, 0x0b85, 0x0b89, 0x0b7f, 0x0b8e, 0x9b64, 0x9b67, 0x0b84, 0x3cb7, 0x3d8c, 0x9c59, 0x3d8d, 0x9cda, 0x0bee, 0x0bed, 0x0bfe, 0x9d51, 0x0bff, 0x9d55, 0x9e3b, 0x9e34, 0x0c23, 0x9e37, 0x3e17, 0x9e31, 0x3e1c, 0x0c1f, 0x9e3f, 0x9e59, 0x3e14, 0x9f61, 0x0c8f, 0x0c90, 0xa058, 0xa062, 0xa050, 0x0ca0, 0xa051, 0x0ca6, 0x0c9f, 0xa046, 0x0ca7, 0x0ca1, 0xa12d, 0x0d02, 0x0d36, 0xa348, 0xa351, 0xa34a, 0xa34f, 0xa350, 0xa349, 0xa463, 0x0dc8, 0xa466, 0xa460, 0x0dd8, 0x420c, 0x0ddd, 0x0ddc, 0xa4f1, 0x0dd7, 0xa507, 0x0dda, 0x0eba, 0xa79b, 0xa7a3, 0xa79d, 0x0ebe, 0x0ec2, 0x0ebb, /* 0x2f */ 0x0ec0, 0xa7a9, 0xa7a7, 0xa7a4, 0x4423, 0xa7ba, 0x77c1, 0xa926, 0x0f43, 0x0f55, 0xa994, 0xa993, 0x0f57, 0x0f68, 0x4598, 0x4590, 0xab07, 0xab0d, 0xab02, 0xab0c, 0xab09, 0xab08, 0xab13, 0x0fa1, 0xabd2, 0x463a, 0xac3e, 0xac3c, 0xad67, 0xad9e, 0x0fea, 0xadad, 0x0fe7, 0xadd9, 0xad42, 0xada3, 0xada0, 0x0fe8, 0x0fe9, 0xad7c, 0xb004, 0x1054, 0xb058, 0xb060, 0xb0c9, 0xb0c8, 0x4826, 0x1065, 0xb11c, 0xb11a, 0x108a, 0xb274, 0x10b0, 0xb26e, 0xb26f, 0xb279, 0x10bc, 0x492e, 0xb277, 0x4955, 0x491a, 0x10b8, 0x493d, 0xb27c, 0x10b2, 0xb270, 0x4930, 0x10bd, 0xb27a, 0xb282, 0x118a, 0x4b51, 0x11a1, 0xb544, 0x11a2, 0xb543, 0x4b88, 0xb545, 0x1215, 0xb725, 0xb71f, 0x1220, 0x1273, 0xb8e8, 0x4d8e, 0x4d8d, 0xb909, 0xb9b7, 0xb9b9, 0xba64, 0xba63, 0x4e09, 0x4e14, 0x12b1, /* 0x30 */ 0xba62, 0xba65, 0x132b, 0xbbac, 0x1345, 0xbd2a, 0x1397, 0x1398, 0xbe96, 0x13d5, 0xbfc2, 0xd2de, 0x1493, 0x1496, 0x5207, 0x1494, 0xc1aa, 0xc1b0, 0x14c7, 0x14c5, 0xc3d4, 0xc3cd, 0xc3d6, 0x14c4, 0xc4f0, 0x5579, 0x5584, 0x15ce, 0x15ca, 0x15cc, 0x5657, 0x15c9, 0x56ba, 0x59fd, 0xd04b, 0x5b62, 0x006e, 0x5cb7, 0x1a67, 0x5cac, 0x5cab, 0x0071, 0x5cc1, 0x00bb, 0x00d3, 0x5fe8, 0x6169, 0x615d, 0x615f, 0x00f3, 0x00ed, 0x00f5, 0x6164, 0x6162, 0x00f1, 0x00f2, 0x00f6, 0x0120, 0x62f9, 0x0128, 0x62ee, 0x1d18, 0x1d2c, 0x1d59, 0x63ab, 0x63ac, 0x63aa, 0x1d68, 0x1d7e, 0x6486, 0x647a, 0x1da1, 0x6728, 0x01a1, 0x1f5b, 0x01aa, 0x01a9, 0x6731, 0x01b5, 0x01a5, 0x01a8, 0x1f42, 0x01a7, 0x1f47, 0x672d, 0xd143, 0x1f3d, 0x672b, 0x6732, 0x1f60, 0x21eb, 0x6b29, 0x6b26, 0x6b53, /* 0x31 */ 0x024d, 0x6b33, 0x6b34, 0x6c9d, 0x029c, 0x235f, 0x6d41, 0x02ea, 0x02e5, 0x6e91, 0x6e69, 0x256f, 0x7022, 0x035e, 0x7034, 0xd16d, 0x712e, 0x0386, 0x0384, 0x71f4, 0x265a, 0x7428, 0x03d9, 0x741c, 0x03de, 0x7411, 0x7424, 0x7415, 0x03db, 0x7416, 0x7454, 0x7423, 0x75ff, 0x0431, 0x76cf, 0x76d0, 0x044b, 0x76ce, 0x0449, 0x044a, 0x044c, 0x77c7, 0x785c, 0x048a, 0x7836, 0x0489, 0x048b, 0x7843, 0x04bb, 0x29a2, 0x299d, 0x04e4, 0x7b2a, 0x7b01, 0x29a3, 0x7b0b, 0x7b0f, 0x053b, 0x052e, 0x053e, 0x0546, 0x0553, 0x7cdf, 0x0544, 0x7cd2, 0x053f, 0x0542, 0x054f, 0x7ccd, 0x0552, 0x054a, 0x2ac2, 0x7cdb, 0x055a, 0x2aa5, 0x0549, 0x7ccf, 0x2c1c, 0x7ec0, 0x2c1d, 0x0603, 0x8081, 0x8082, 0x808a, 0x80a8, 0x808c, 0x2d95, 0x2d9a, 0x0601, 0x0606, 0x05fb, 0x05f9, 0x808e, 0x0605, /* 0x32 */ 0x05fa, 0x808b, 0x2da6, 0x8096, 0x05fe, 0x80cc, 0x067d, 0x068c, 0x834f, 0x834a, 0x2e50, 0x068e, 0x834b, 0x833d, 0x2e52, 0x8344, 0x8349, 0x849e, 0x84f3, 0x2ec8, 0x84f5, 0x06f0, 0x06f2, 0x85b3, 0x2f58, 0x06f1, 0x06e6, 0x85e5, 0x85b6, 0xd1d8, 0x3188, 0x8886, 0x076f, 0x076d, 0x0769, 0x88b6, 0x8885, 0x076e, 0x88ab, 0x082f, 0x0830, 0x0863, 0x8c0d, 0x8c8b, 0x8c8c, 0x33b8, 0x0880, 0x33b9, 0x089a, 0x0894, 0x0896, 0x0895, 0x0897, 0x8d72, 0x08f4, 0x08fe, 0x8f8f, 0x0901, 0x8f79, 0x0902, 0x8f77, 0x08f9, 0x8f90, 0x8f88, 0x8f80, 0x8f9e, 0x08f6, 0x08f7, 0x8f82, 0x8f34, 0x8f89, 0x08ff, 0x8f85, 0x8f7e, 0x8f7a, 0x8fa6, 0x360b, 0x8fb5, 0x91f4, 0x09bf, 0x09bc, 0x3805, 0x9229, 0x9226, 0x922a, 0x09be, 0x09c0, 0x937e, 0x0a3b, 0x0a39, 0x945b, 0x9461, 0x9460, 0x0a3c, /* 0x33 */ 0x959b, 0x3a14, 0x3a04, 0x95c3, 0x0a7d, 0x95cd, 0x0a7f, 0x0a7a, 0x0a7c, 0x3a05, 0x0a7e, 0x3a15, 0x3a0d, 0x0a80, 0x0abf, 0x0ac3, 0x9754, 0x9759, 0x0acc, 0x0b0e, 0x0b0d, 0x98f5, 0x0b26, 0x0b24, 0x0b25, 0x0b23, 0x0b21, 0x0b29, 0x9a69, 0x9a65, 0x0b8f, 0x0b8d, 0x9b7c, 0x0b8b, 0x0b92, 0x9b80, 0x0b90, 0x9c65, 0x0bef, 0x0bf0, 0x9cdf, 0x9d60, 0x0c01, 0x9d5e, 0x0c2e, 0x0c2d, 0x3e2e, 0x0c28, 0x0c29, 0x0c2c, 0x9e8f, 0x9e61, 0x9e5a, 0x3e41, 0x0c88, 0x9f67, 0x0c92, 0x0c91, 0x3eea, 0x9fbb, 0x3f44, 0x0ca9, 0x0cac, 0x0cae, 0x0caa, 0x0d06, 0x0d05, 0x0d4a, 0x0d3e, 0x0d3c, 0x0d3b, 0xa29b, 0x0d42, 0x0d41, 0x0d43, 0xa2a9, 0x0d45, 0xa366, 0x0d9a, 0x0d9b, 0x0d9f, 0x0d9e, 0xa472, 0xa476, 0xa514, 0x0dde, 0x0de2, 0x0de6, 0xa50f, 0x4229, 0x0de3, 0x4227, 0x0ddf, 0xa641, /* 0x34 */ 0xa646, 0x439d, 0xa64b, 0xa643, 0x0e7e, 0x0ec9, 0x0ecc, 0xa7c6, 0x0ed1, 0xa7c7, 0x0ed0, 0xa7ce, 0x0ecf, 0x0ec8, 0xa7c9, 0x0ecd, 0xa7cb, 0xa7c5, 0x0f49, 0x0f47, 0x0f58, 0x0f6b, 0x0f6c, 0x0f6a, 0xaa69, 0x0f80, 0x0f82, 0x0f84, 0x45c8, 0x0f83, 0xab1e, 0xabba, 0x0fb6, 0xac52, 0xac51, 0xac53, 0xad9f, 0xaddb, 0x4726, 0x0ff1, 0xade3, 0x0ff6, 0x0ff3, 0x0ff0, 0x471c, 0xadd7, 0xade9, 0x4728, 0x0ff5, 0x0ff4, 0x0ff7, 0xadde, 0xaddc, 0xb03c, 0xd28b, 0x1055, 0xb122, 0xb132, 0xb123, 0x108b, 0x10cb, 0x10c2, 0xb2d4, 0xb2c8, 0xb2bc, 0x10ca, 0x10cc, 0xb2cd, 0x10c7, 0x10c9, 0x4970, 0xb2be, 0x10c6, 0xb340, 0xb2d6, 0x10c3, 0x4982, 0xb2bd, 0x49ac, 0xb2ba, 0x10c4, 0xb2c0, 0xd29b, 0xd29d, 0xb2c1, 0xb4a6, 0xb4a5, 0xb4a8, 0x11a9, 0x4bad, 0x11a8, 0x11a6, 0xb55f, 0xb570, /* 0x35 */ 0xb56a, 0xb565, 0xb567, 0xb56f, 0xb587, 0x4bca, 0x4c51, 0xb73d, 0xb743, 0x1222, 0xb740, 0x1226, 0x1224, 0x1225, 0x4c9d, 0x122a, 0x1274, 0xb918, 0x1279, 0x4d90, 0x127a, 0xb919, 0xb9c1, 0x4dd8, 0x4dd7, 0x1297, 0xb9bc, 0xb9c8, 0x4e2e, 0xba71, 0x12bc, 0xba6e, 0x12b3, 0xba78, 0x12bf, 0x12b7, 0xd2cd, 0xba7a, 0xbbb1, 0xbbaf, 0xbbb0, 0x1334, 0x1346, 0x1348, 0x4f59, 0xbca8, 0xbca6, 0x1356, 0x1367, 0xbd48, 0xbd45, 0x1368, 0x1399, 0x139a, 0xbea0, 0xbea4, 0x13d8, 0xbfd4, 0x13db, 0x13dc, 0x13dd, 0x13d7, 0xbfd2, 0xc022, 0x1449, 0x144a, 0x50da, 0xc0b7, 0xc0cc, 0x5233, 0xc1e6, 0x5218, 0x149a, 0xc1c8, 0x14cd, 0x14ca, 0xc3f4, 0x14cb, 0xc3ed, 0x14cf, 0xc37e, 0xd2e3, 0x14cc, 0x14ea, 0x14ed, 0xc4f9, 0xc4fd, 0x14e9, 0xc507, 0x151a, 0x53ef, 0x158d, 0x15d2, 0xc778, /* 0x36 */ 0xc77a, 0xc779, 0xc88a, 0x15f2, 0xc97b, 0xcad5, 0xcae9, 0x163d, 0xcaeb, 0x163e, 0x16f8, 0x1723, 0x58d9, 0x18b4, 0x5b6c, 0x1aa0, 0x1a90, 0x0075, 0x1a86, 0x1a84, 0x5cfa, 0x1a8a, 0x0076, 0x0073, 0x1a9f, 0x1aa1, 0x5d18, 0x1a93, 0x00bd, 0x5ff6, 0x1bd5, 0x618a, 0x6189, 0x00f9, 0x617f, 0x6188, 0x00fa, 0x6183, 0x6184, 0x6198, 0x6163, 0x6187, 0x0121, 0xd127, 0x0129, 0x62f5, 0x6350, 0x0138, 0x014e, 0x6487, 0x648a, 0x6565, 0x67b7, 0x67c1, 0x67c7, 0x01c8, 0x01bc, 0x67c5, 0x67cb, 0x1f90, 0x67d1, 0x01bb, 0x01c2, 0x01c0, 0x67b8, 0x67ca, 0x01ca, 0x67de, 0x01c9, 0x67ce, 0x01b8, 0x2110, 0x2217, 0x6b68, 0x024e, 0x6b6b, 0x2244, 0x0250, 0x222b, 0x6b6a, 0x2245, 0x6b66, 0x6b77, 0x6b96, 0x6b6e, 0xd156, 0x028a, 0x6d57, 0x2365, 0x6d56, 0x6e9c, 0x6e9e, 0x02fc, 0x02f9, /* 0x37 */ 0x6ea1, 0x0363, 0x7042, 0x25cf, 0x7046, 0x703e, 0x7133, 0x0387, 0x0388, 0x71fa, 0x039a, 0x7297, 0x729b, 0x72aa, 0x2756, 0x7473, 0x747c, 0x03e9, 0x7486, 0x03ea, 0x2754, 0x0450, 0x76f3, 0x76f0, 0x0456, 0x0452, 0x044f, 0x0454, 0x0451, 0x76ec, 0x78af, 0x048e, 0x048f, 0x7864, 0x7868, 0x795a, 0x293d, 0x7b1f, 0x7b25, 0x04ed, 0x04eb, 0x29a4, 0x7cc6, 0x7cd6, 0x7cc3, 0x0562, 0x7d2c, 0x055d, 0x7d2e, 0x7d5e, 0x7d33, 0x0561, 0x0565, 0x055c, 0x7d2d, 0x7d46, 0x055f, 0x7cc1, 0x7d3a, 0x7ecc, 0x809d, 0x8083, 0x80f6, 0x2dec, 0x0616, 0x060a, 0x80f8, 0x060e, 0x0612, 0x80fe, 0x80f3, 0x0611, 0x80eb, 0x80fa, 0x0610, 0x8107, 0x80fc, 0x0609, 0x2dfa, 0x0615, 0x2dd4, 0x8372, 0x8373, 0x8374, 0x0691, 0x0695, 0x0693, 0x0692, 0x068f, 0x835f, 0x8360, 0x84aa, 0x8534, 0x06f6, /* 0x38 */ 0x85b4, 0x06fb, 0x85f0, 0x2f75, 0x06f9, 0x860d, 0x85f3, 0x860f, 0x301c, 0x077d, 0x88c9, 0x077a, 0x077f, 0x88c5, 0x0778, 0x88d7, 0x88cc, 0x31d9, 0x88e7, 0x0770, 0x0782, 0x88c1, 0x0784, 0x88e8, 0x0833, 0x8acb, 0x0832, 0x0836, 0x8ac8, 0x8b7a, 0x0856, 0x8b79, 0x8b7e, 0x0867, 0x8c1b, 0x0865, 0x0864, 0x0866, 0x8c1f, 0x8c19, 0x0881, 0x0882, 0x0883, 0x089e, 0x8d89, 0x33f1, 0x089d, 0x8d8b, 0x090f, 0x0912, 0x9009, 0x8ffe, 0x9000, 0x0910, 0x0918, 0x900b, 0x0914, 0x0919, 0x3637, 0x59fd, 0x904a, 0x367d, 0x3686, 0x09c8, 0x09c4, 0x09c6, 0x9279, 0x09c7, 0x09c3, 0x926c, 0x9299, 0xd21b, 0x9262, 0x9314, 0x0a19, 0x0a1c, 0x93c8, 0x93d7, 0x940c, 0x0a41, 0x9470, 0x0a42, 0x0a43, 0x9471, 0x95df, 0x95e4, 0x0a82, 0x95e7, 0x0a81, 0x0a94, 0x0a84, 0x9790, 0x0ad2, 0x0b0f, /* 0x39 */ 0x0b22, 0x994c, 0x0b27, 0x0b2a, 0x3bfa, 0x0b28, 0x994f, 0x0b60, 0x9a7d, 0x9a7e, 0x9a7c, 0x3c72, 0x9a8d, 0x9b19, 0x0b9b, 0x0b9c, 0x9bc0, 0x0b93, 0x0b94, 0x3cdc, 0x0ba0, 0x0b99, 0x9bb6, 0x0ba1, 0x9ba8, 0x0bf1, 0x9ceb, 0x9ce7, 0x9d6f, 0x9ec7, 0x0c36, 0x9e9f, 0x0c37, 0x0c3f, 0x0c3c, 0x9ec4, 0x0c34, 0x0c39, 0x0c3b, 0x0c35, 0x0c30, 0x0c32, 0x0c38, 0x0c3e, 0x0c3a, 0x9e9b, 0x9e97, 0x9ec5, 0x9f6b, 0x9fce, 0x0cb6, 0x3f67, 0xa0b1, 0xa0ae, 0xa0b0, 0x0cb3, 0x0d09, 0x4077, 0xa23e, 0xa2b5, 0xa2ba, 0x0d4c, 0xa2b2, 0xa2b4, 0x0d53, 0x0d4d, 0x0d51, 0x0d4f, 0x419b, 0xa377, 0x0da2, 0xa386, 0xa37b, 0x0dcd, 0xa47e, 0xa52e, 0x0de7, 0xa52f, 0x0df0, 0xa537, 0x0de9, 0x0dec, 0xa532, 0x0de8, 0x0dee, 0x0e02, 0xa536, 0xa539, 0xa535, 0xa65c, 0x0e82, 0x0e83, 0x0e86, 0xa67b, /* 0x3a */ 0xa661, 0xa7ee, 0xa7eb, 0xa7ef, 0xa820, 0x442a, 0x4465, 0x0f4a, 0xa930, 0x0f5a, 0x4564, 0xa9be, 0x0f6e, 0xaa67, 0xaa7c, 0x0f70, 0x0f6f, 0xab24, 0x0f8a, 0x0f87, 0x0f88, 0xab29, 0xabef, 0x4620, 0x0fb7, 0x0ffd, 0x4720, 0xae0d, 0x1005, 0x473c, 0x1008, 0x1003, 0x1002, 0x1004, 0x0739, 0x1009, 0x0fff, 0xae64, 0x473f, 0xae15, 0x0ffc, 0x1001, 0x100a, 0x47f0, 0x47f5, 0x106b, 0x106c, 0xb135, 0xb136, 0xb134, 0xb137, 0xb347, 0xb32b, 0x10de, 0xb341, 0xb343, 0x10db, 0xb342, 0x10dd, 0x10e3, 0xb332, 0x10e0, 0x10d9, 0x10d8, 0x10e4, 0xb344, 0xb34a, 0x10da, 0x10ef, 0xd2a0, 0x4a15, 0x49be, 0xb354, 0xb36e, 0xb352, 0x10d7, 0x11b3, 0x11bb, 0x4be5, 0x11b2, 0x4bd2, 0x11ad, 0xb592, 0x11af, 0xd2b8, 0x4be0, 0xb5bf, 0x1216, 0x1228, 0x1223, 0x4cb3, 0xb741, 0xb769, 0xb765, /* 0x3b */ 0x1275, 0x127e, 0x127c, 0xb922, 0xb91d, 0xb9d2, 0xb9da, 0xb9db, 0x12ce, 0x12cd, 0x12cf, 0x4e53, 0xbaa4, 0xba9e, 0x4e37, 0x4e47, 0x4e5c, 0xba9d, 0x12c4, 0x12cc, 0x12c8, 0x12c7, 0xbaad, 0xbaa6, 0xbaa7, 0xbbb3, 0xbbe0, 0xbc35, 0xbc37, 0x135a, 0x136a, 0xbd4a, 0x136b, 0x136d, 0x136f, 0xbe5e, 0x139e, 0xbec0, 0x13a4, 0x13a3, 0x13e4, 0x13e8, 0x13e9, 0x13e0, 0x13e3, 0xbff9, 0x13ea, 0x13e1, 0x13ed, 0x1434, 0x1435, 0x1451, 0x50f0, 0xc1f0, 0x149d, 0xc1f3, 0xc21b, 0xc1f2, 0xc1fb, 0xc41c, 0xc413, 0x14d0, 0xc40f, 0x14ee, 0xc516, 0xc511, 0xc512, 0x14f2, 0xc50e, 0x541d, 0x1588, 0xc667, 0xc6f2, 0xc6da, 0x158f, 0xc6dc, 0x15d8, 0xc894, 0xc89b, 0xc892, 0xc89a, 0xc988, 0xc986, 0x163f, 0xcaef, 0x1652, 0x576b, 0xcb5e, 0x1650, 0xcc58, 0x16b1, 0xcc56, 0xcc54, 0x16f9, /* 0x3c */ 0xcd9b, 0xce96, 0xcea4, 0x1726, 0x1728, 0xce9a, 0xcf12, 0x0080, 0x1ac0, 0x0081, 0x5d6b, 0x007e, 0x007f, 0x5d37, 0x5d3c, 0xd10a, 0x5ef7, 0x00be, 0x5f66, 0x00d6, 0x61a9, 0x61ae, 0x61ad, 0x61c8, 0x61a5, 0x61b0, 0x6295, 0x1ce5, 0x6325, 0x0134, 0x6499, 0x1daf, 0x6574, 0x6570, 0x656f, 0x6841, 0x6854, 0x01d5, 0x01d8, 0x6840, 0x6838, 0x01d4, 0x1fd8, 0x01d9, 0x6852, 0x683a, 0x6857, 0xd14a, 0x6859, 0x2111, 0x2267, 0x6bb4, 0x6bc0, 0x025d, 0x2243, 0x025e, 0x0259, 0x6b75, 0x025a, 0x02a0, 0x6d60, 0x6d47, 0x0305, 0x6ef0, 0x0307, 0x6eef, 0x030e, 0x030c, 0x6eec, 0x6f83, 0x0345, 0x6f84, 0x6f8f, 0x0364, 0x7061, 0x0365, 0x7069, 0x25dd, 0x0366, 0x7062, 0x0389, 0x03ec, 0x03f1, 0x2770, 0x276a, 0x03f0, 0x03f8, 0x2774, 0x275f, 0x74ae, 0x2761, 0x2773, 0x74b2, 0x03f2, /* 0x3d */ 0x03f4, 0x770b, 0x0458, 0x7710, 0x770d, 0x045a, 0x0459, 0x0457, 0x045b, 0x2850, 0x787f, 0x7881, 0x04a6, 0x04c2, 0x04c1, 0x293f, 0x7a0b, 0x7b4e, 0x04ef, 0x29b0, 0x7dea, 0x7d45, 0x0568, 0x2b35, 0x2b2d, 0x0573, 0x056e, 0x0574, 0x2b02, 0x0566, 0x7d28, 0x7d5d, 0x7edc, 0x05b9, 0x2c26, 0x7ed4, 0x060c, 0x8164, 0x8168, 0x0620, 0x8162, 0x061d, 0x8161, 0x061c, 0x8166, 0x0621, 0x061a, 0x0619, 0x80f2, 0x8169, 0x8167, 0x067e, 0x839a, 0x839b, 0x8385, 0x839c, 0x069d, 0x83a4, 0x069e, 0x069c, 0x2e6e, 0x8399, 0x8386, 0x8390, 0x8481, 0x84ae, 0x2eb1, 0x2ed4, 0x06cd, 0x8538, 0x070b, 0x070a, 0x2f85, 0x893b, 0x078f, 0x3272, 0x0795, 0x0790, 0x0791, 0x894c, 0x323a, 0x07b9, 0x8947, 0x8935, 0x0797, 0x079e, 0x8933, 0x078b, 0x8982, 0x8940, 0x083b, 0x083a, 0x083c, 0x083d, /* 0x3e */ 0x0839, 0x083e, 0x086b, 0x086c, 0x8c36, 0x8d0e, 0x08a2, 0x08a1, 0x089f, 0x8dad, 0x8daa, 0x9017, 0x092d, 0x9067, 0x0936, 0x092b, 0x9072, 0x0937, 0xd20a, 0x9061, 0x90b0, 0x36ad, 0x0925, 0x092f, 0x092c, 0x906e, 0x9064, 0x0932, 0x908c, 0x9066, 0x3695, 0x906b, 0x905f, 0x9074, 0x9065, 0x92bb, 0x92be, 0x09d5, 0x92b9, 0x09d4, 0x09d6, 0x92ef, 0x09d1, 0x3943, 0x93da, 0x0a46, 0x398f, 0x9490, 0x95e9, 0x0a8c, 0x0a8a, 0x0a88, 0x9611, 0x960d, 0x95ed, 0x9621, 0x0add, 0x9781, 0x97b1, 0x9901, 0x0b2d, 0x995e, 0x9962, 0x0b2e, 0x0b2c, 0x0b2b, 0x0b30, 0x995b, 0x0b4e, 0x9a96, 0x9a93, 0x0b64, 0x0b61, 0x9a92, 0x3c75, 0xd239, 0x0b70, 0x0ba6, 0x0ba4, 0x9bc4, 0x9bc7, 0x9bc3, 0x0ba8, 0x0ba2, 0x9bc8, 0x0ba7, 0x3cec, 0x0ba5, 0x9bca, 0x0ba9, 0x9bc5, 0x9bcf, 0x9bdc, 0x9c7c, /* 0x3f */ 0x9d01, 0x0c3d, 0x9ed3, 0x9edc, 0x0c44, 0x0c45, 0x0c46, 0x9ed4, 0x3e57, 0x9ecc, 0x0c47, 0x0c48, 0x0c42, 0x9ed6, 0x9edb, 0x0c41, 0x9ed5, 0x9fd9, 0x0c94, 0x9fdd, 0x9fdc, 0x9fe0, 0xa0cc, 0x0cc0, 0x0cb8, 0x0cc1, 0x0cc2, 0x0cbb, 0x0cbd, 0x0cbf, 0x0cb9, 0x0cb7, 0xa0d2, 0x0cc7, 0xa0d3, 0x0d0c, 0x0d0b, 0x407b, 0x0d10, 0xa18d, 0x0d5d, 0x4121, 0x0d5a, 0x0d58, 0x0d56, 0xa2d8, 0x0d54, 0x4116, 0xa2bc, 0x0da8, 0x0da7, 0x0dcf, 0x0dd0, 0xa48a, 0x41e8, 0xa48b, 0xa48d, 0x0dd1, 0x0deb, 0xa553, 0x0dfb, 0x426a, 0xa559, 0x0dfd, 0x0df8, 0x0df7, 0x0e00, 0xa556, 0xa557, 0x0df6, 0x425f, 0xa673, 0xa81b, 0x0edf, 0xa821, 0xa816, 0xa818, 0x0ee2, 0x0ee4, 0xa844, 0x4482, 0xa826, 0x0ee3, 0xa936, 0x0f59, 0x0f71, 0x0f8e, 0x0f8c, 0xab3a, 0x0fa4, 0xabf4, 0x4655, 0x1014, 0xae62, }; static const ucs4_t cns11643_4a_2uni_upages[212] = { 0x03400, 0x03500, 0x03600, 0x03700, 0x03800, 0x03900, 0x03a00, 0x03b00, 0x03c00, 0x03d00, 0x03e00, 0x03f00, 0x04000, 0x04100, 0x04200, 0x04300, 0x04400, 0x04500, 0x04600, 0x04700, 0x04800, 0x04900, 0x04a00, 0x04b00, 0x04e00, 0x04f00, 0x05000, 0x05100, 0x05200, 0x05300, 0x05400, 0x05500, 0x05600, 0x05700, 0x05800, 0x05900, 0x05a00, 0x05b00, 0x05c00, 0x05d00, 0x05e00, 0x05f00, 0x06000, 0x06100, 0x06200, 0x06300, 0x06500, 0x06600, 0x06700, 0x06800, 0x06900, 0x06b00, 0x06c00, 0x06d00, 0x06e00, 0x07000, 0x07100, 0x07200, 0x07300, 0x07400, 0x07500, 0x07600, 0x07700, 0x07800, 0x07900, 0x07a00, 0x07b00, 0x07c00, 0x07d00, 0x07f00, 0x08000, 0x08100, 0x08200, 0x08300, 0x08400, 0x08600, 0x08800, 0x08900, 0x08a00, 0x08c00, 0x08e00, 0x08f00, 0x09000, 0x09100, 0x09200, 0x09500, 0x09600, 0x09700, 0x09a00, 0x0ff00, 0x20000, 0x20100, 0x20200, 0x20300, 0x20400, 0x20500, 0x20600, 0x20700, 0x20800, 0x20900, 0x20a00, 0x20b00, 0x20c00, 0x20d00, 0x20e00, 0x21100, 0x21200, 0x21300, 0x21500, 0x21600, 0x21700, 0x21900, 0x21a00, 0x21b00, 0x21c00, 0x21d00, 0x21e00, 0x21f00, 0x22000, 0x22100, 0x22200, 0x22300, 0x22400, 0x22500, 0x22600, 0x22700, 0x22900, 0x22a00, 0x22b00, 0x22c00, 0x22e00, 0x22f00, 0x23000, 0x23100, 0x23200, 0x23300, 0x23400, 0x23500, 0x23800, 0x23900, 0x23a00, 0x23b00, 0x23c00, 0x23d00, 0x23e00, 0x24100, 0x24200, 0x24500, 0x24600, 0x24700, 0x24800, 0x24900, 0x24a00, 0x24b00, 0x24c00, 0x24d00, 0x24f00, 0x25000, 0x25100, 0x25300, 0x25400, 0x25600, 0x25700, 0x25900, 0x25a00, 0x25b00, 0x25e00, 0x25f00, 0x26000, 0x26200, 0x26300, 0x26400, 0x26500, 0x26600, 0x26700, 0x26800, 0x26900, 0x26a00, 0x26b00, 0x26c00, 0x27100, 0x27200, 0x27500, 0x27600, 0x27700, 0x27800, 0x27900, 0x27b00, 0x27c00, 0x27d00, 0x27e00, 0x27f00, 0x28200, 0x28400, 0x28500, 0x28600, 0x28700, 0x28800, 0x28c00, 0x28e00, 0x28f00, 0x29000, 0x29100, 0x29200, 0x29400, 0x29500, 0x29600, 0x29a00, 0x29d00, 0x2f800, 0x2f900, 0x2fa00, }; freelan-2.0/third-party/source/libiconv-msvc/include/cns11643_4b.h000066400000000000000000001163731252300335000246600ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CNS 11643-1992 plane 4 part b */ static const unsigned short cns11643_4b_2uni_page40[4384] = { /* 0x40 */ 0xb65b, 0xb66a, 0x1011, 0xb668, 0x101b, 0x1012, 0x100e, 0x1015, 0x3f68, 0x1010, 0xb681, 0x1017, 0x4046, 0x4043, 0x1070, 0x10ed, 0xbae7, 0x10ee, 0xbae6, 0xbad1, 0xbb11, 0x4181, 0xbad0, 0xbad9, 0xbb0a, 0x10f4, 0xbada, 0xbadd, 0xbac8, 0xbae2, 0xbae9, 0xbacb, 0x417c, 0xbacc, 0xbac1, 0x416a, 0xbade, 0x4188, 0x10f2, 0x10f8, 0x10f3, 0xbb51, 0xbb12, 0x10fa, 0xbae0, 0xbb2b, 0xf6b4, 0xc0d8, 0xc0d1, 0x4410, 0xc0d2, 0xc0cd, 0x441f, 0x11b6, 0x11b7, 0xc13d, 0x440f, 0xc0ca, 0x11ba, 0xc0cb, 0x11bc, 0xc0d7, 0xc3f4, 0x123b, 0x45d3, 0x122f, 0xc487, 0xc48b, 0xc483, 0x1237, 0x1299, 0xc7c5, 0xc7d2, 0xc7c6, 0xc7d3, 0x12d9, 0x12d8, 0x12d7, 0xc7f0, 0xc7cd, 0xc7cc, 0xc7dc, 0xc7d6, 0x1336, 0xc9e6, 0xca41, 0xca3f, 0x4987, 0xcac5, 0xcac0, 0xcac6, 0xcabe, 0xcabf, 0x49c6, /* 0x41 */ 0x1370, 0xcb63, 0xccd3, 0xccda, 0xccd5, 0x13a5, 0x13a6, 0x13a9, 0x13ee, 0x1454, 0xd0ee, 0x1457, 0xd0fc, 0xd214, 0x14a1, 0xd323, 0xd322, 0xd330, 0xd4b5, 0x14d3, 0xd538, 0x14d4, 0xd53f, 0x14d7, 0x4dcc, 0x4e6d, 0x4e70, 0x14f7, 0x14f6, 0x14f9, 0x14f8, 0x4f58, 0x4f42, 0x4f68, 0x4f69, 0xd768, 0xd767, 0x4f43, 0xd765, 0x4f47, 0x158a, 0xda75, 0xdaf7, 0xdaf3, 0xdaf6, 0x1594, 0xdb00, 0x1593, 0xdaff, 0xdaf5, 0x529d, 0x15dd, 0x15dc, 0x15f7, 0x53cf, 0xde92, 0xe006, 0x1642, 0xe007, 0xe06b, 0x1654, 0xe06c, 0x1655, 0xe193, 0x168f, 0xe194, 0x54f4, 0x16b4, 0x16b3, 0xe262, 0xe263, 0x5509, 0xe25f, 0xe264, 0xe25b, 0xe259, 0x16fb, 0x16fd, 0xe3a4, 0xe3ac, 0x55ab, 0x16fc, 0xe4b5, 0x172c, 0x172f, 0xe4ae, 0x172b, 0xe4c5, 0x1733, 0x1734, 0x55fb, 0xe63b, 0x57ac, 0x57ae, /* 0x42 */ 0x57aa, 0x17e8, 0xe8bf, 0xea2b, 0xea84, 0xea80, 0xeb4d, 0xeb4f, 0x585c, 0xeb4c, 0xed92, 0x195d, 0x1ad2, 0x0085, 0x0088, 0x5fae, 0x5f79, 0x008e, 0x0084, 0x5f71, 0x1adf, 0x5fb3, 0x0083, 0x5f2c, 0x5f77, 0x612f, 0x63c3, 0x0102, 0x63cd, 0x0106, 0x0105, 0x63c9, 0x00fe, 0x0101, 0x0100, 0x63ce, 0x64a5, 0x64a0, 0x64fe, 0x6559, 0x669a, 0x01e7, 0x1e19, 0x68e4, 0x68d7, 0x68dc, 0x01e6, 0x68e7, 0x01ed, 0x01e2, 0x01eb, 0x68e5, 0x01e8, 0x01ec, 0x1e0a, 0x0224, 0x1f9a, 0x6e14, 0x0262, 0x6df1, 0x0261, 0x0260, 0x0264, 0x028b, 0x6fb6, 0x706e, 0x706c, 0x7081, 0x7142, 0x0319, 0x0316, 0x0318, 0x0322, 0x711a, 0x031d, 0x0317, 0x031e, 0x7127, 0x7125, 0x7117, 0x711c, 0x713d, 0x7120, 0x0369, 0x036a, 0x7381, 0x036c, 0x037a, 0x038a, 0x7509, 0x75c6, 0x75c4, 0x039c, 0x75c5, /* 0x43 */ 0x03fd, 0x03f9, 0x76ef, 0x03ff, 0x76df, 0x76de, 0x76ee, 0x76f5, 0x76ec, 0x03fc, 0x76dd, 0x2385, 0x03fb, 0x0402, 0x045f, 0x2456, 0x045e, 0x045d, 0x045c, 0x7822, 0x2451, 0x0492, 0x7997, 0x7995, 0x0494, 0x0495, 0x04d1, 0x7ba9, 0x04f1, 0x7c53, 0x25b1, 0x7c56, 0x7c55, 0x0577, 0x056f, 0x7de3, 0x7de2, 0x0587, 0x057d, 0x057c, 0x057e, 0x0585, 0x058b, 0x0586, 0x0580, 0x5dfd, 0x7da9, 0x0578, 0xf5ab, 0x7e33, 0x7e0a, 0x05ba, 0x8059, 0x0633, 0x81bc, 0x062d, 0x81c4, 0x81c7, 0x81c6, 0x0637, 0x275a, 0x2763, 0x81b8, 0x81da, 0x062e, 0x81b7, 0x81c0, 0x063d, 0x81cd, 0x06a0, 0x84bc, 0x84ab, 0x06a3, 0x8586, 0x299b, 0x875a, 0x29a3, 0x070e, 0x299e, 0x8843, 0x07b6, 0x89ac, 0x07ab, 0x07ad, 0x07a6, 0x89be, 0x2ab8, 0x07aa, 0x2aba, 0x07b1, 0x89ab, 0x07a8, 0x07af, 0x07b0, /* 0x44 */ 0x07a7, 0x07b2, 0x079d, 0x07a5, 0x07b5, 0x743e, 0x2ac7, 0x2ad7, 0x8cf9, 0x0841, 0x8cf3, 0x8cf7, 0x2c70, 0x8e45, 0x8e48, 0x0872, 0x2c9d, 0x086f, 0x0871, 0x8e44, 0x0885, 0x8eaf, 0x8eb1, 0x08a4, 0x08a5, 0x08a6, 0x8fcf, 0x08a8, 0x8fcb, 0x8fcd, 0x08a3, 0x9050, 0x91ec, 0x921a, 0x2d16, 0x2d24, 0x91d8, 0x0943, 0x91d0, 0x91d1, 0x093d, 0x0945, 0x917b, 0x91d2, 0x0944, 0x91d4, 0x91e7, 0x91df, 0x91de, 0x2d45, 0x91d9, 0x91cf, 0x950d, 0x09e3, 0x2f79, 0x5dfd, 0x09df, 0x09e4, 0x2f7a, 0x09e5, 0x9538, 0x3054, 0x0a22, 0x0a4a, 0x98a9, 0x0a49, 0x0a44, 0x0a4b, 0x0a87, 0x0a89, 0x0a92, 0x0a91, 0x0a90, 0x0a8e, 0x993e, 0x9946, 0x9aed, 0xf630, 0x0b12, 0x0b10, 0x0b11, 0x9c6c, 0x0b32, 0x0b34, 0x0b37, 0x0b33, 0x0b36, 0x0b35, 0x0b65, 0x9dac, 0x337c, 0x337b, 0x9ec9, 0x3412, /* 0x45 */ 0x0bb0, 0x9f12, 0x0baf, 0x0baa, 0x9efd, 0x9f01, 0x9f11, 0x0bab, 0x9f89, 0x9f05, 0x9efe, 0x9f0b, 0x9f20, 0x9f04, 0xa088, 0x0bf3, 0xa102, 0x0bf4, 0xa103, 0x34b6, 0x34e0, 0x0c08, 0x0c4e, 0x0c55, 0x0c4b, 0xa229, 0xa23b, 0x0c4d, 0x3573, 0xa206, 0x0c52, 0x3572, 0x0c4c, 0x3570, 0x0c50, 0x0c53, 0xa203, 0x0c51, 0xa378, 0xa379, 0xa37d, 0x0c89, 0xa37f, 0x0c95, 0x0ccc, 0x0cc8, 0x0cce, 0xa432, 0x0cca, 0xa400, 0x369d, 0xa422, 0x0ccd, 0xa5a9, 0x0d5c, 0x0d67, 0x0d69, 0x0d65, 0x0d62, 0xa704, 0x3827, 0x3835, 0xf659, 0x0daa, 0xa8b8, 0xa99b, 0x0dd2, 0x39a2, 0x0e03, 0x0e0c, 0xaa92, 0x0e09, 0x0e06, 0x0e05, 0x3989, 0xaa8f, 0x0e0b, 0x0e08, 0xaa98, 0x39a5, 0xaaae, 0x0e8e, 0xad9d, 0x3ab6, 0x0ee8, 0xaf49, 0xaf50, 0xaf46, 0x0eea, 0xaf4e, 0x3ba5, 0x3bc3, 0xaf55, 0x0ee9, /* 0x46 */ 0x0eeb, 0xaf64, 0x0ef0, 0xb138, 0x0f4b, 0x3dab, 0x0f73, 0x0f75, 0x0f92, 0x0f91, 0x0f93, 0x3e25, 0x0fa7, 0x0fa6, 0x0fa8, 0x0faa, 0xb3fe, 0x0fa9, 0x3e59, 0x0fbb, 0x0fbc, 0x0fba, 0x0fbd, 0x1027, 0x3f85, 0xb6a6, 0x1024, 0x101e, 0x101f, 0x101d, 0x1020, 0x1023, 0x1029, 0x1022, 0xb69c, 0xb699, 0x101c, 0x3f8e, 0x1028, 0xb6b5, 0xb6a3, 0xb6a0, 0xb6a7, 0xb69b, 0xb8df, 0xb8e1, 0x1071, 0x1073, 0x1072, 0xb94d, 0x1102, 0xbbf3, 0xbb6f, 0xbb69, 0x10fe, 0x41be, 0xbb6b, 0xbb78, 0xbb87, 0x1108, 0xbb85, 0xbb82, 0xbb90, 0x1107, 0x1104, 0xbb80, 0xbb67, 0x1100, 0x10fc, 0xbb61, 0x1144, 0xbb93, 0x10f1, 0xbbf2, 0xbb86, 0x41a6, 0x1106, 0xbfcd, 0xbfc4, 0x11c6, 0x11c3, 0x11c1, 0x11c2, 0xc10f, 0x11c4, 0x11c7, 0xc10d, 0x11bf, 0x11d2, 0xc173, 0x11ca, 0xf6ba, 0xc10a, 0x442f, /* 0x47 */ 0xc108, 0xc113, 0x1213, 0xc3f8, 0x1230, 0x123e, 0x1239, 0xc4ab, 0xc4a8, 0x123c, 0x123f, 0xc4a5, 0x1234, 0x123d, 0xc4c3, 0xc4a4, 0x1238, 0xc4d4, 0xc4ba, 0xc5f1, 0x46a0, 0x1282, 0xc63f, 0x1283, 0xc6ea, 0x129b, 0xc7f7, 0x12e0, 0x12dd, 0xc7fa, 0xc7f5, 0x12de, 0xc7fe, 0x12e3, 0x12e5, 0xc800, 0x4797, 0x12e2, 0xc802, 0xc7fb, 0xc807, 0x12df, 0xc81a, 0x132e, 0xc9b8, 0x1337, 0x1338, 0xc9e9, 0xc9eb, 0xca50, 0xca4f, 0x498b, 0xcb86, 0x0162, 0xcb8e, 0x1394, 0x1393, 0x13ab, 0x13ad, 0xccf0, 0xccfb, 0x13f5, 0x13f7, 0xce42, 0x13f6, 0x13f8, 0xce85, 0x13fb, 0x13f9, 0x1458, 0x145a, 0xd105, 0x1459, 0x4c0f, 0x1485, 0x14a4, 0x14d8, 0x14d9, 0xd54b, 0x14dd, 0x14c8, 0xd563, 0x14fa, 0x14fb, 0x4f75, 0x1527, 0x4f9f, 0x152a, 0x1525, 0xd799, 0x1528, 0xda81, 0xdb17, 0xdb10, /* 0x48 */ 0xdb12, 0x52a6, 0x1595, 0x539a, 0xdcfa, 0xdcf3, 0xdcf2, 0xdcf5, 0xdcf6, 0xddbb, 0xddc2, 0xdea7, 0x160f, 0x1611, 0xdea8, 0xdea3, 0x1610, 0xdeaa, 0x1615, 0x1613, 0x5457, 0xdfdc, 0x1647, 0x1646, 0xe00f, 0x1659, 0x165b, 0xe079, 0x165e, 0xe07f, 0xe085, 0x165a, 0x1691, 0x1692, 0x1690, 0x1693, 0xe21b, 0x54f7, 0x16be, 0xe277, 0xe276, 0xe298, 0x16bc, 0x16bb, 0x16b7, 0x16b9, 0xe27a, 0x1701, 0x16fe, 0xe3bc, 0xe3ba, 0x1702, 0xe3b6, 0x16ff, 0x55b0, 0xe3b4, 0x1700, 0xe4cf, 0x1737, 0x173a, 0x176f, 0x1777, 0x1779, 0x56c6, 0xe67b, 0x17c8, 0xe81c, 0xe821, 0xe81d, 0xe8c0, 0x17f2, 0xe8ff, 0x17f1, 0x17f0, 0x5862, 0xeb56, 0x1834, 0xeda1, 0xeda2, 0xeda6, 0xf056, 0xf057, 0x192c, 0x192d, 0xf101, 0xf1ed, 0xf71c, 0xf3f2, 0x1afa, 0x5fb8, 0x0091, 0x5fc0, 0x0094, 0x5fb7, /* 0x49 */ 0x5fe1, 0x00c4, 0x010a, 0x63e8, 0x1c85, 0x64b2, 0x0152, 0x66ae, 0x0159, 0x026f, 0x697e, 0x01f2, 0x01f4, 0x1e43, 0x6976, 0x01f1, 0x1e3c, 0x6996, 0x026a, 0x6e20, 0x6e21, 0x6e23, 0x6e29, 0x7077, 0x7151, 0x0324, 0x7156, 0x0323, 0x7188, 0x7159, 0x7155, 0x0327, 0x7297, 0x7298, 0x036d, 0x21ed, 0x036e, 0x036f, 0x73a1, 0x73a3, 0x2235, 0x039f, 0x040a, 0x0406, 0x040e, 0x770a, 0x040d, 0x0405, 0x773d, 0x770c, 0x040b, 0x0410, 0x042e, 0x783d, 0x7839, 0x79b0, 0x79b2, 0x79ae, 0x0496, 0x0497, 0x04c4, 0x2547, 0x04c5, 0x7b20, 0x04d2, 0x7c6e, 0x7c6d, 0x7c6a, 0x0581, 0x7e32, 0x058e, 0x0590, 0x058f, 0x7e39, 0x0591, 0x0595, 0x0593, 0x7da3, 0x266d, 0x7e7f, 0x7e35, 0x7e3d, 0x7ff4, 0x7ff5, 0x063b, 0x0648, 0x8248, 0x8228, 0x0646, 0x0647, 0x8227, 0x8232, 0x822c, 0x064c, /* 0x4a */ 0x822e, 0x064a, 0x0650, 0x0643, 0x8223, 0x8231, 0xf5c5, 0x0649, 0x06a6, 0x06a5, 0x06a4, 0x84c9, 0x8589, 0x06b9, 0x85bb, 0x06ce, 0x06cf, 0x0713, 0x8897, 0x8893, 0x8a28, 0x07c6, 0x07c5, 0x07ca, 0x07d9, 0x07c1, 0x8a18, 0x8a3b, 0x2af5, 0x8a27, 0x8a24, 0x8a1b, 0x8a31, 0x07cb, 0x8a26, 0x8aa3, 0x8a3f, 0x8a22, 0x8a19, 0x2b03, 0x8a41, 0x8a2b, 0x2b65, 0x0842, 0x8d0c, 0x2c75, 0x0874, 0x0873, 0x8e4e, 0x8eb9, 0x8efa, 0x8fe9, 0x8fe8, 0x8fe4, 0x2d8a, 0x2d56, 0x0952, 0x925f, 0x925d, 0x9252, 0x0950, 0x9274, 0x094b, 0x9246, 0x094c, 0x096d, 0x92aa, 0x2d98, 0x924a, 0x9259, 0x924b, 0x094f, 0x2d68, 0x09f0, 0x9550, 0x3034, 0x3045, 0x0a4d, 0x0a4c, 0x98d0, 0x0a4f, 0x0a4e, 0x0a50, 0x98cc, 0x315c, 0x0a96, 0x3156, 0x9964, 0x9965, 0x0a97, 0x0a95, 0x0a98, 0x995c, 0x9b15, /* 0x4b */ 0x0aec, 0x0aeb, 0x0b13, 0x0b14, 0x0b38, 0x0b3a, 0x0b39, 0x9c79, 0x0b68, 0x0b67, 0x9dc5, 0x9db8, 0x9f2c, 0x0bbe, 0x0bbc, 0x9f37, 0x9f35, 0x9f31, 0x0bbb, 0x9f2f, 0x0bba, 0x9f2b, 0x0bb9, 0x0bb7, 0x9f2d, 0x9f2a, 0x0bc1, 0xa095, 0x0bf7, 0xa23e, 0x0c60, 0xa247, 0xa245, 0x0c59, 0x0c5c, 0x0c5a, 0x0c58, 0xa252, 0x0c5b, 0xa270, 0xa250, 0xa258, 0xa251, 0xa23d, 0x0c5d, 0xa241, 0xa20c, 0xa23c, 0xa386, 0xa383, 0xa389, 0xa3f3, 0x0cd4, 0x0cd3, 0x36bf, 0x0cd2, 0x36bd, 0xa42d, 0x0cd7, 0x0cd1, 0x36e4, 0x0cd5, 0xa5c5, 0xf655, 0x0d6d, 0x0d6f, 0x3834, 0x0d75, 0x0d6c, 0x0d74, 0xa743, 0x0d73, 0xa737, 0xa745, 0x3836, 0x0dac, 0xa8e5, 0xa9a6, 0xaadb, 0x0e10, 0xaada, 0xaae6, 0x39ba, 0x39bc, 0x0e0f, 0x39c8, 0x0e23, 0x39c3, 0x0e1d, 0x39b6, 0x0e0e, 0xaaf8, 0xaae9, 0x0e15, /* 0x4c */ 0x39c2, 0x0e13, 0xaae8, 0xaaf6, 0x0e1b, 0x39c5, 0x0e22, 0x0e26, 0xaae7, 0x39bd, 0x39b0, 0x0e21, 0x0e1c, 0x0e17, 0xaad5, 0x0e1a, 0x39bb, 0xadd3, 0xadc7, 0xadd1, 0x0e99, 0xadc3, 0x0e97, 0xaf80, 0xaf98, 0x0efd, 0xaf84, 0x0ef6, 0x0efe, 0x0ef5, 0x0eff, 0x0ef7, 0xaf97, 0xaf83, 0xaf81, 0x0f01, 0x3c04, 0xaf8c, 0xb142, 0xb2ab, 0x0f77, 0xb2a3, 0xb2a6, 0xb35c, 0xb369, 0xb367, 0x0fab, 0xb48b, 0xb4a8, 0x0fc0, 0xb6d8, 0x1031, 0x102e, 0xf689, 0xb6dc, 0x102c, 0xb6e0, 0xb6e5, 0x1032, 0x102f, 0x102b, 0x102d, 0x1033, 0xb818, 0xb819, 0x3ff1, 0x1057, 0x105c, 0x107b, 0xb95f, 0xb95e, 0x107a, 0xbc02, 0x4222, 0x1113, 0x111e, 0x1117, 0x1120, 0x112a, 0x1111, 0x1115, 0x110f, 0x1118, 0x4238, 0xbc12, 0xbc36, 0x112c, 0x4232, 0xf6a8, 0x4210, 0xbc23, 0xbc03, 0x111c, 0xbc00, /* 0x4d */ 0x1129, 0xbc46, 0xbc61, 0x1112, 0x424f, 0x1197, 0xc184, 0x4472, 0xc16b, 0xc162, 0xc156, 0xc16a, 0xc152, 0xc155, 0x11d4, 0x11d0, 0x447c, 0xc161, 0xf6bb, 0xc158, 0xc177, 0x11d3, 0x1214, 0xc4d7, 0x1246, 0x1245, 0xc4de, 0x1243, 0xc4df, 0x460d, 0x1244, 0x1248, 0xc4d1, 0x1247, 0xc4e2, 0xc4e1, 0xc4dd, 0x4608, 0x1249, 0x1285, 0xc64b, 0x1284, 0xc64e, 0x129d, 0xc6fc, 0x129e, 0x12a0, 0xc6fa, 0x129c, 0xc6fb, 0x129f, 0xc6fe, 0x12f7, 0x12ea, 0xc831, 0x12ef, 0x12e9, 0x12f3, 0x12f0, 0x12eb, 0xc838, 0x12ec, 0x12f2, 0x12f5, 0x12ee, 0xc83a, 0xc9bb, 0x133a, 0x134b, 0xca59, 0x134a, 0x134c, 0xcadb, 0xcadf, 0xcae2, 0x1379, 0x137b, 0x1378, 0xcb9e, 0xcba1, 0x13b5, 0xcd10, 0x13b4, 0x13b7, 0x4a9e, 0x1409, 0x13fe, 0x1408, 0x1407, 0xce76, 0xce7f, 0xce7d, 0x1406, 0x1404, /* 0x4e */ 0x1405, 0x13ff, 0x140b, 0xce82, 0xd057, 0x143b, 0x145d, 0x145c, 0x145f, 0x145e, 0x4c28, 0xd12e, 0x4c21, 0x1483, 0xd38b, 0xd38d, 0x14a7, 0x4d66, 0x4d6c, 0xd390, 0x14a8, 0xd4ec, 0xd56f, 0xd56b, 0xd571, 0xd578, 0x4df6, 0x14e0, 0x14df, 0x14fe, 0x14fc, 0x14ff, 0x14fd, 0xd7ad, 0x152c, 0x4fec, 0x4fba, 0x4fe3, 0x4fbd, 0x159d, 0xdb2f, 0x52b4, 0xdd78, 0x1640, 0xdff8, 0xe019, 0x165f, 0xe09b, 0xe094, 0xe097, 0xe099, 0xe1a6, 0xe1a4, 0xe1a7, 0x54d1, 0xe295, 0x16c0, 0x5523, 0xe290, 0x16c1, 0x16c6, 0xe29b, 0xe3c4, 0x1704, 0x1705, 0xe3c6, 0x560b, 0x173e, 0x173d, 0x1740, 0x173f, 0xe4e3, 0x1742, 0xe4df, 0xe4dd, 0xe4e7, 0x1784, 0x1782, 0x177f, 0x1785, 0xe82d, 0xe82c, 0x17cc, 0x57b2, 0x17cb, 0x17cd, 0xe834, 0xe838, 0x57db, 0xe91d, 0x17f5, 0xe91a, 0xe91b, 0xe914, /* 0x4f */ 0x57f0, 0xe917, 0xea21, 0x1820, 0x1821, 0xeaaa, 0xeaa1, 0x1837, 0x183e, 0x5873, 0x183d, 0x586e, 0xeb63, 0xeb79, 0xeb60, 0x5865, 0xeb62, 0x183c, 0xeb61, 0x1838, 0x586a, 0xeb70, 0x586d, 0xeb6a, 0x183b, 0xedc8, 0x18b0, 0xedc5, 0xedbe, 0xedc2, 0x18ad, 0x18b2, 0x18b8, 0x5a0b, 0xedc7, 0x18af, 0xedb0, 0xedca, 0x191a, 0x5b76, 0x1920, 0x1921, 0x1930, 0x5ba8, 0x192f, 0xf10d, 0xf107, 0xf196, 0xf1ef, 0x195f, 0x1960, 0xf21e, 0xf21d, 0x5c11, 0xf390, 0x5feb, 0x008a, 0x1b19, 0x009c, 0x5fee, 0x009a, 0x5fef, 0x5fec, 0x63fa, 0x010c, 0x010b, 0x010d, 0x1c92, 0x6504, 0x69d3, 0x01fe, 0x69d1, 0x69fa, 0x01ff, 0x01fb, 0x01fc, 0x0209, 0x69c8, 0x0200, 0x69d5, 0x1e75, 0x69cd, 0x69d2, 0x69fb, 0x6c2a, 0x6e88, 0x6e61, 0x0271, 0x6e63, 0x6e62, 0x206f, 0x5e57, 0x71c8, 0x7198, /* 0x50 */ 0x032b, 0x73c1, 0x773f, 0x7741, 0x0414, 0x0411, 0x0412, 0x7852, 0x0463, 0x785e, 0x046e, 0x049a, 0x79c7, 0x049b, 0x7a70, 0x7b27, 0x04c8, 0x7b71, 0x7bb0, 0x04f6, 0x7e42, 0x7e43, 0x26a5, 0x058c, 0x0597, 0x05a2, 0x26a0, 0x7e57, 0x7e9d, 0x8289, 0x828d, 0x828b, 0x8280, 0x8292, 0x828a, 0x82c8, 0x0654, 0x828f, 0x8293, 0x8291, 0x06a8, 0x84f2, 0x84de, 0x06a9, 0x85c8, 0x28b4, 0x28d8, 0x29c2, 0x0718, 0x0717, 0x071d, 0x87a7, 0x87a1, 0x0731, 0x8a8c, 0x8a7f, 0x07d8, 0x07d5, 0x8a7b, 0x8a95, 0x8a99, 0x07e1, 0x8a8e, 0x07d4, 0x8ada, 0x8a8a, 0x8a9c, 0x07e3, 0x8a7e, 0x0844, 0x0845, 0x8d1a, 0x8e55, 0x0876, 0x0875, 0x8e60, 0x2ca8, 0x0888, 0x08aa, 0x8ffb, 0x08ab, 0x08ac, 0x8ffd, 0x0957, 0x2d83, 0x0960, 0x095d, 0x096b, 0x92d0, 0x0963, 0x0967, 0x92c5, 0x095e, 0x92d2, /* 0x51 */ 0x9311, 0x2dc5, 0x2fcd, 0x09f9, 0x09f3, 0x95ad, 0x95a4, 0x95a9, 0x95b0, 0x959d, 0x09f6, 0x9798, 0x309c, 0x0a51, 0x0a53, 0x0a52, 0x9992, 0x0a9b, 0x998a, 0x0a9c, 0x998d, 0x9996, 0x0af7, 0x3299, 0x328f, 0x3291, 0x9b45, 0x9b4b, 0x9c0f, 0x9c16, 0x0b3b, 0x9c8a, 0x0b3e, 0x0b3d, 0x9dc9, 0x0b69, 0x9dc8, 0x9dca, 0x9f64, 0x0bc3, 0x0bc4, 0x0bc7, 0x9f5d, 0x9f63, 0x3439, 0x0bc6, 0x342e, 0x0bc8, 0x9f88, 0xa03a, 0xa039, 0x349f, 0x34a0, 0x0be6, 0x0bf8, 0xa117, 0xa193, 0x0c07, 0xa195, 0x0c64, 0x0c68, 0xa276, 0x3594, 0x0c65, 0x35ae, 0xa280, 0xa27b, 0x0c69, 0xa248, 0xa2a8, 0xa288, 0xa38b, 0xa38a, 0xa38c, 0xa3fc, 0x0cda, 0x0ce0, 0x36e6, 0xa458, 0x0cde, 0xa451, 0xa455, 0xa453, 0x0d1c, 0x0d1d, 0x0d1a, 0xa5dc, 0x0d7b, 0x0d7a, 0x0d7c, 0xa75c, 0x0d78, 0x0d77, 0xa765, /* 0x52 */ 0xf65a, 0x0db1, 0xa8ee, 0x0db2, 0x0db0, 0xa8f0, 0x38bc, 0xa8f2, 0x0e36, 0xab35, 0x0e2e, 0xab22, 0x39d6, 0xab20, 0x0e34, 0xab2d, 0xab28, 0xab26, 0xab3c, 0x0e2a, 0xab38, 0x0e33, 0x0e2d, 0x0e2f, 0x0e31, 0x0e2b, 0x0e32, 0xab2a, 0x0e35, 0xab1a, 0xab30, 0xaae3, 0xab19, 0xade9, 0xade7, 0x3acf, 0xafd6, 0xafc4, 0x0f08, 0xaf87, 0x0f06, 0xafc7, 0xafd9, 0x3c18, 0xafdf, 0x0f4d, 0x0f61, 0xb20a, 0xb201, 0xb2b1, 0x0f78, 0xb2c1, 0x0f94, 0x0f95, 0xb376, 0xb40d, 0xb40e, 0x0fc1, 0x0fc3, 0x3e6d, 0xb707, 0x1039, 0xb709, 0xb716, 0x103a, 0x103b, 0x1035, 0x1036, 0xb70e, 0x103c, 0x3f90, 0xb706, 0xb81e, 0xb84a, 0x1058, 0x107c, 0x107d, 0x108d, 0x108c, 0xbca6, 0xbc91, 0x113b, 0x113f, 0xbcb8, 0xbc96, 0x1132, 0x112d, 0xbcc5, 0x112f, 0x1139, 0x112e, 0x113a, 0xbd0a, 0x1136, /* 0x53 */ 0x1131, 0x113e, 0x1138, 0x4252, 0x1134, 0xbcb2, 0x1141, 0xbcb7, 0xbcb4, 0xbc89, 0xbc8d, 0x1130, 0xbc87, 0xbcc2, 0xbc9c, 0xbc92, 0x1143, 0xbcca, 0x4250, 0xbc8a, 0xbfe0, 0x1198, 0xbfe6, 0xbfe5, 0x44a0, 0xc1a5, 0xc1b3, 0x4486, 0x11da, 0x11d7, 0xc1b5, 0xc1af, 0x4495, 0xc1b0, 0xc1cc, 0x448c, 0xc1a2, 0xc1be, 0xc1c6, 0xc1ac, 0xc1ae, 0x1218, 0x4560, 0xf6c3, 0xc508, 0xc505, 0x1252, 0x4628, 0xc4fe, 0x124e, 0x4620, 0xc500, 0x124f, 0x1250, 0xc664, 0xc668, 0x46a8, 0x1286, 0x1287, 0x1289, 0xc66a, 0xc669, 0xc70d, 0xc712, 0x12a2, 0x12a3, 0xc70f, 0x12a1, 0xc867, 0xc879, 0xc872, 0xc866, 0xc87c, 0x12f9, 0x12fd, 0xc868, 0xc885, 0xc876, 0xc874, 0xc871, 0xc864, 0x133e, 0x133c, 0xc9f8, 0x134d, 0xca6c, 0x134e, 0xcaeb, 0x1381, 0x1383, 0x1382, 0xcbb8, 0x1380, 0x1388, /* 0x54 */ 0xcd2d, 0xcd2e, 0xcd28, 0xcd29, 0xcd31, 0x13b9, 0xcd2f, 0xcd2a, 0x4b3a, 0xcea4, 0xceb7, 0xcebf, 0x1411, 0x140d, 0x1410, 0x1413, 0xd063, 0x143c, 0x1462, 0x1463, 0xd167, 0xd3be, 0xf6e0, 0xd595, 0xd59c, 0x1503, 0x1506, 0x1502, 0x1501, 0xd671, 0xd672, 0x1505, 0xd66f, 0x4e94, 0x5011, 0xd7f1, 0x5037, 0x1536, 0xd7e8, 0x1535, 0x5043, 0xf6ea, 0x15a1, 0x15a3, 0xdb49, 0xdb64, 0x15a0, 0xdb48, 0x15ea, 0x53a6, 0x15e8, 0xdd2c, 0xdde1, 0xddef, 0xdec0, 0x1621, 0x161b, 0xded7, 0xded4, 0x1649, 0x1648, 0xe0ad, 0x5495, 0x1662, 0x1661, 0x1664, 0x1660, 0x1663, 0xe0ae, 0xe0ac, 0x5496, 0x1666, 0x16ac, 0x16ab, 0xe227, 0xe2ae, 0x16c3, 0xe2b0, 0x16c4, 0x5525, 0xe2c0, 0xe2c4, 0x1708, 0x1709, 0x170a, 0x1706, 0x1707, 0x1741, 0xe507, 0x1745, 0xe4fd, 0x1743, 0x1744, 0x5626, /* 0x55 */ 0x5634, 0x1747, 0xf704, 0xe61b, 0xe61c, 0x1771, 0xe6b2, 0xe6b4, 0xe6b7, 0xe6b1, 0xe6b3, 0xe6ae, 0x178b, 0x17d4, 0x17d3, 0x17d1, 0x57ba, 0x17d2, 0xe83f, 0xe936, 0x17f7, 0x17f8, 0xe931, 0xe93b, 0xe935, 0xe93a, 0xe937, 0xea22, 0xea36, 0xea32, 0x1822, 0xeac0, 0x1845, 0x1841, 0x5881, 0x1840, 0x588a, 0xeb85, 0x587f, 0x1842, 0xeb89, 0x18c1, 0x18c5, 0xede1, 0x18bb, 0x18b9, 0x18bd, 0x18c9, 0xee0a, 0x5a11, 0xee09, 0x18bf, 0x18c7, 0xede8, 0x18c3, 0x1924, 0x1931, 0x1933, 0xf118, 0x1932, 0x1934, 0x1952, 0x1961, 0x5bd9, 0x197a, 0x1982, 0x5c3c, 0xf3c5, 0x1b23, 0x600d, 0x600c, 0x6021, 0x1b2c, 0x6216, 0x640e, 0x010f, 0x1c95, 0x6417, 0x0123, 0x0125, 0x6a48, 0x0206, 0x0208, 0x1e88, 0x6a55, 0x6a49, 0x6a4c, 0x1e8b, 0x6a4f, 0x6a3d, 0x027a, 0x0277, 0x6e8a, 0x6ea8, /* 0x56 */ 0x708a, 0x032e, 0x71cb, 0x032f, 0x71d5, 0x78d4, 0x041b, 0x0413, 0x775c, 0x7775, 0x0466, 0x7861, 0x0465, 0x7096, 0x04f7, 0x7c8a, 0x7ed0, 0x26e1, 0x26d7, 0x7e49, 0x7ecf, 0x059c, 0x82d6, 0x827f, 0x0653, 0x82d2, 0x82cf, 0x8506, 0x8509, 0x06ba, 0x28a3, 0x0722, 0x29d3, 0x8b06, 0x8af1, 0x8b04, 0x2b8b, 0x8afa, 0x8af4, 0x07eb, 0x07dd, 0x8af9, 0x07ef, 0x8a8b, 0x8b03, 0x0847, 0x0846, 0x8da2, 0x0878, 0x2cac, 0x0889, 0x900c, 0x900b, 0x0968, 0x0976, 0x0974, 0x0979, 0x9324, 0x097a, 0x0977, 0xf614, 0x0971, 0x9325, 0x0972, 0x95f6, 0x09ff, 0x95fb, 0x0a05, 0x9732, 0x97fb, 0x0a54, 0x98f2, 0x98f3, 0x0a9e, 0x0a9f, 0x3174, 0x999c, 0x9b72, 0x0afa, 0x9b74, 0x0b44, 0x0b3f, 0x0b40, 0x9c86, 0x0b42, 0x9c8e, 0x9c90, 0x0b51, 0x9ccd, 0x9cf7, 0x9dd6, 0x9f84, 0x9f95, 0x9f8a, /* 0x57 */ 0x3440, 0x0bca, 0x9f97, 0x3441, 0x0bce, 0x0bc9, 0xa0a0, 0xa0a1, 0xa122, 0xa1a6, 0xa1a4, 0x0c09, 0x34e8, 0x0c6c, 0x0c6e, 0x0c70, 0x0c6d, 0x0c6b, 0x0c71, 0x0c72, 0xa2af, 0xa2b0, 0xa2bd, 0x0c8c, 0x0ce4, 0xa476, 0x0ce1, 0xa47b, 0xa479, 0x36f6, 0x0ce7, 0x3700, 0x0ce2, 0x0d1f, 0xa5ee, 0xa5f1, 0x0d7e, 0xa794, 0x0d80, 0x3859, 0x3855, 0xa791, 0x0db9, 0x0db7, 0x0db8, 0xa910, 0x0dba, 0x38f4, 0xa9af, 0x0dd3, 0x0e3f, 0x3a04, 0x0e45, 0x0e41, 0x3a15, 0x0e42, 0x0e43, 0x0e3b, 0x0e38, 0xab7b, 0xab77, 0x0e3a, 0x39f5, 0xab80, 0xabc6, 0x0e3c, 0xab7c, 0xab90, 0x0e3e, 0xaba3, 0xab7d, 0xabbd, 0x0e9e, 0x0e9f, 0x0ea1, 0xae13, 0x0e9b, 0x0f12, 0xb011, 0xb044, 0xb00d, 0x0f18, 0x0f0c, 0xb214, 0x0f62, 0xb2b8, 0x0f7a, 0xb2b7, 0xb383, 0x0fae, 0x0faf, 0xb414, 0x0fad, 0xb41c, /* 0x58 */ 0x0fc4, 0x0fc7, 0x0fc6, 0x0fc5, 0xb4d4, 0xb4d5, 0x3fc1, 0x1040, 0xb743, 0xb742, 0x103f, 0x1041, 0xf68a, 0xb741, 0xb84e, 0x107f, 0xb987, 0x1086, 0x1081, 0x1080, 0x108e, 0x114a, 0xbd39, 0x1147, 0xbd8f, 0xbd2a, 0x114b, 0x1146, 0x114e, 0x427d, 0xbd2b, 0x42a5, 0xbd50, 0x1148, 0xbd6e, 0x1145, 0xbd3b, 0xbd53, 0xbd5f, 0xbd2f, 0xbd30, 0xbd38, 0xbd4c, 0xbff1, 0x11db, 0x11e7, 0x11e4, 0xc207, 0xc216, 0x11e1, 0xc214, 0x11e9, 0xc1fb, 0x11e5, 0x11e0, 0x11e3, 0xc1f8, 0xc210, 0xc21d, 0xc1ff, 0xc20b, 0xc204, 0x11ea, 0xc1fe, 0xc3ff, 0x463a, 0x1254, 0x1258, 0x125c, 0xc523, 0x1255, 0x128b, 0x128c, 0x12a6, 0x12a5, 0xc72a, 0xc8a0, 0xc898, 0xc89c, 0x12ff, 0xc89e, 0xc8a6, 0xc8b5, 0xc8b0, 0x1330, 0x1340, 0x1341, 0xcaf9, 0xcaf5, 0x1386, 0xcbd2, 0x13bf, 0x13bd, 0xcd50, /* 0x59 */ 0xcd4e, 0xcd4b, 0xcd52, 0xcd4d, 0x13be, 0x1419, 0xcee4, 0x141c, 0xceda, 0x141b, 0x1417, 0x1418, 0x4b51, 0xcedf, 0xcee8, 0x143d, 0x146a, 0x1466, 0xd170, 0xd172, 0x1467, 0xd177, 0x1468, 0x14ad, 0x14ae, 0xd3e6, 0xd5aa, 0x14d6, 0x1509, 0xd68c, 0x4e98, 0xd689, 0x150c, 0x150a, 0xd832, 0x153b, 0x153a, 0x5084, 0x5081, 0xd87a, 0x506f, 0xda9e, 0xdaa0, 0xdb70, 0x15af, 0x15aa, 0x15ab, 0xdb6e, 0xdb66, 0x15b1, 0xdb65, 0x15ac, 0x15ec, 0xdd7f, 0xdde0, 0x1601, 0xddff, 0xdef6, 0xdef7, 0xdef5, 0x1623, 0xdefc, 0x1624, 0x161e, 0xdef9, 0x164a, 0x1665, 0x166a, 0xe0ca, 0xe0c3, 0xe0c6, 0x1669, 0xe1b8, 0xe1bd, 0x1695, 0xe1bc, 0xe205, 0xe2e0, 0xe2e9, 0x5542, 0xe2df, 0xe2ec, 0x16cc, 0xe2e5, 0xe2de, 0xf700, 0x16cf, 0xe2f0, 0xe2e3, 0x170f, 0xe3ec, 0x170e, 0x170b, 0x1710, /* 0x5a */ 0x170d, 0x170c, 0xe3f2, 0xe3ef, 0xe3e9, 0xe4fb, 0x1746, 0x1748, 0x5637, 0x1749, 0xe537, 0xe6de, 0x1791, 0x178e, 0xe6da, 0x17d8, 0x17d6, 0xe84b, 0x17da, 0xe849, 0x17d7, 0xe8d5, 0x57ff, 0x17f9, 0xe952, 0xe947, 0x17fc, 0xe948, 0xeacc, 0xead0, 0x58a9, 0x184a, 0x58a7, 0x184e, 0x58b3, 0x58ac, 0x58b0, 0xeb86, 0xeba7, 0xeba3, 0x589c, 0xebb6, 0xebad, 0xee13, 0x5a3c, 0x5a1c, 0x5a3a, 0x18d3, 0x18cd, 0x18d1, 0xee17, 0xee22, 0x5a32, 0x5a34, 0xee49, 0xee26, 0xf70c, 0xee3c, 0xee28, 0xf0a8, 0x5bc7, 0xf1fb, 0x1962, 0xf232, 0xf2d6, 0xf348, 0x1983, 0x5c3f, 0xf3c6, 0x1992, 0x009f, 0x00a0, 0x6025, 0x6026, 0x6024, 0x6033, 0x6170, 0x0127, 0x6790, 0x020b, 0x6a95, 0x6aa1, 0x6a92, 0x6a8f, 0x6a9f, 0x6a96, 0x6a98, 0x6a9d, 0x6aa0, 0x028d, 0x7097, 0x71eb, 0x0370, 0x7787, /* 0x5b */ 0x24eb, 0x7b32, 0x059a, 0x059f, 0x059d, 0x7ed8, 0x7efb, 0x7f06, 0x059b, 0x7ed1, 0x26d5, 0xf5b0, 0x0660, 0x0664, 0x0669, 0x0663, 0x0667, 0x0662, 0x82f6, 0x8304, 0x82fe, 0x2802, 0x82ff, 0x82f7, 0x8518, 0x06ac, 0x8514, 0x85cd, 0x8620, 0x87de, 0x0726, 0x0723, 0x0725, 0x8b45, 0x8b53, 0x07f8, 0x8b4b, 0x8b55, 0x8b41, 0x07f7, 0x07fb, 0x07fa, 0x8b5c, 0x8b54, 0x8e71, 0x8ed0, 0x08b0, 0x08af, 0x9053, 0x9329, 0x937e, 0x097e, 0x9379, 0x097d, 0x0980, 0x9370, 0x936a, 0x097f, 0x0986, 0x9385, 0x9364, 0x2e12, 0x9378, 0x0981, 0x9632, 0x9627, 0x962f, 0x0a24, 0x0a58, 0x0a57, 0x0aa0, 0x99ba, 0x0afe, 0x9b71, 0x9b8c, 0x0b15, 0x9c1a, 0x0b47, 0x0b46, 0x9c98, 0x9de4, 0x0b6b, 0x0b6c, 0x3385, 0x3454, 0x9fc2, 0x0bcc, 0x9fba, 0x3455, 0x9fc8, 0x0bcb, 0x34a7, 0x34a8, 0x0bf9, /* 0x5c */ 0xa1b9, 0xa1b8, 0xa1a5, 0xa2e2, 0x0c78, 0x0c7a, 0x0c75, 0xa2d9, 0x0c76, 0x0c77, 0xa2ac, 0xa2dd, 0x0cea, 0x0cee, 0x0ced, 0xa49d, 0x0cec, 0x370f, 0xa611, 0xa603, 0x0d84, 0x0d85, 0x0d83, 0xa7ee, 0x0dbc, 0x0dbd, 0x0dd4, 0xaba4, 0xabd8, 0xabdd, 0xabde, 0x0e55, 0xabe7, 0x0e50, 0x0e4c, 0x0e48, 0xabd4, 0x0e53, 0xabce, 0x0e57, 0x0e54, 0x0e4e, 0x0e4a, 0x0e51, 0xabf1, 0xabd3, 0x0e49, 0x0e4b, 0x0e63, 0xabca, 0xabe9, 0x0ea7, 0x0ea6, 0x0ea4, 0xae1a, 0xae41, 0xf668, 0x3ae4, 0x3ae5, 0xb03d, 0xb040, 0x3c65, 0x3c4e, 0x0f17, 0xb043, 0x0f16, 0xb03f, 0xb03c, 0x0f63, 0xb221, 0xb220, 0x3d82, 0xb2c6, 0x0f7b, 0x0f7c, 0xb2d1, 0xb2ca, 0xb38e, 0xb391, 0x0fb0, 0x3e2d, 0xb4e3, 0xb788, 0x1042, 0xb770, 0x1044, 0xb89d, 0xb99d, 0xb991, 0xb998, 0xb999, 0x1088, 0x108f, 0x1153, /* 0x5d */ 0x115b, 0xbdbf, 0x1159, 0xbdae, 0xbdb1, 0xbdcc, 0xbe04, 0x42ca, 0xbe16, 0xbdcd, 0x1154, 0x42bc, 0xbde0, 0xbdcb, 0xbdd4, 0xbdc9, 0xbfff, 0x1199, 0xbffd, 0xc257, 0xc252, 0xc250, 0xc245, 0xc24d, 0x11f1, 0xc253, 0x11ef, 0xc282, 0xc244, 0xc3ce, 0xc3cf, 0xc3d2, 0xc402, 0xc54f, 0xc558, 0x1262, 0xc543, 0x1263, 0xc552, 0x1260, 0x1261, 0x125f, 0xc549, 0xc553, 0xc54d, 0x128d, 0xc684, 0x128e, 0xc683, 0xc732, 0xc8e2, 0x1309, 0xc8e4, 0xc8d3, 0x1305, 0xc8d5, 0xc8dd, 0x1303, 0x1306, 0xc8ec, 0xc8e6, 0xc8d2, 0xc8fa, 0xc8da, 0x1331, 0xca06, 0xca04, 0x134f, 0xca7b, 0xcb04, 0xcb02, 0x1366, 0x49ff, 0x13c4, 0xcd60, 0x13c3, 0x13c1, 0x13c5, 0xcf07, 0xcf05, 0xcf0c, 0x1421, 0xcf5a, 0x141f, 0x1422, 0xcf1a, 0x1427, 0x1420, 0xd18a, 0x146d, 0x146c, 0x146b, 0x146f, 0x1470, /* 0x5e */ 0xd18c, 0xd409, 0xd6a6, 0x4ea6, 0xd6ac, 0xd6a9, 0x1542, 0xd88b, 0x50b6, 0xd88c, 0x1544, 0x1540, 0xd888, 0xd889, 0x153f, 0xd893, 0x50ab, 0x158b, 0xdb83, 0xdd4f, 0x1625, 0x1628, 0xdf20, 0x5421, 0xe036, 0xe0e2, 0x1675, 0x1672, 0xe0ee, 0x166f, 0xe0e7, 0xe0e9, 0x1676, 0x1671, 0x54a7, 0xe0df, 0x1697, 0xe1c7, 0x16d7, 0xe309, 0x16d6, 0xe301, 0x16d8, 0x16dc, 0x16db, 0x16d4, 0x553e, 0x1713, 0x1711, 0x1714, 0xe405, 0xe40c, 0xe578, 0xe55d, 0x1751, 0x1750, 0x1753, 0x1754, 0x1752, 0xe55e, 0xe560, 0xe567, 0x176d, 0xf705, 0xe6f4, 0x1795, 0x1799, 0xe6f1, 0x179a, 0xe6fa, 0x1793, 0x1797, 0xe6f8, 0xe6f9, 0xe709, 0xe6fd, 0xe6f7, 0x17dc, 0xe859, 0x17fd, 0xe960, 0xe968, 0x17fe, 0x1800, 0x1802, 0x1801, 0x1803, 0xe96a, 0xea14, 0xea3e, 0xeae4, 0x1827, 0x1826, 0x1824, /* 0x5f */ 0x184c, 0x58bc, 0x1850, 0x1855, 0x1853, 0x58b7, 0x1852, 0xebd2, 0x1857, 0x58be, 0x1858, 0x18d6, 0xee58, 0xee50, 0x18d4, 0xee5c, 0x18da, 0x18d9, 0xcf19, 0x5a62, 0x18d5, 0x18e4, 0xf70e, 0x18dc, 0x191b, 0x5b8f, 0x1937, 0x1936, 0x194b, 0x5bcb, 0x1966, 0x1976, 0xf2df, 0x197e, 0x197d, 0x197f, 0x1984, 0x198b, 0xf3d9, 0x1994, 0x00a1, 0x0111, 0x6566, 0x0210, 0x1ea9, 0x6ae1, 0x6aef, 0x6ae8, 0x6c33, 0x2013, 0x71fe, 0x0332, 0x21f4, 0x73ef, 0x73ec, 0x75ec, 0x779c, 0x0420, 0x7799, 0x7870, 0x786e, 0x049d, 0x7b41, 0x26ec, 0x26ef, 0x7f02, 0x7f01, 0x05a5, 0x801b, 0x8323, 0x8325, 0x8324, 0x8326, 0x8333, 0x832f, 0x858f, 0x8856, 0x0802, 0x07fe, 0x0801, 0x2bd6, 0x0803, 0x07ff, 0x8b99, 0x0804, 0xf5ed, 0x084a, 0x8ed9, 0x0987, 0x93b7, 0x0984, 0x93b6, 0x0985, 0x3009, /* 0x60 */ 0x9654, 0x9657, 0x967a, 0x0a59, 0x3179, 0x9b8e, 0x32c6, 0x9b90, 0x9bb9, 0x0b04, 0x0b49, 0x0b48, 0x9def, 0x0b6d, 0x0bd2, 0x0bd3, 0x9fe2, 0x0bd1, 0x9fd6, 0x9fd8, 0x9fda, 0x9fde, 0x0be7, 0x0c0a, 0x35c3, 0xa308, 0xa304, 0xa30a, 0xa30b, 0xa302, 0x0cf0, 0xa4aa, 0xa4c1, 0x371f, 0xa7d7, 0xa7d9, 0x3865, 0xa7de, 0xa7da, 0x0dbe, 0x0dbf, 0xa92a, 0x38c6, 0x3a3a, 0xac31, 0x3a36, 0xac2b, 0xac2c, 0xac29, 0xac2e, 0x0e5e, 0xac27, 0xac28, 0x0e5b, 0xac5f, 0xac30, 0xac24, 0x3aeb, 0x0eab, 0xae3a, 0x0eac, 0xae39, 0xae40, 0xb080, 0xb084, 0x0f1f, 0x0f1d, 0xb075, 0xb076, 0x0f1c, 0xb07c, 0x0f1e, 0xb078, 0xb09b, 0xb07e, 0xb15a, 0x0f64, 0xb22c, 0x3d84, 0xb39c, 0xb747, 0xb78a, 0x1048, 0x1047, 0xb827, 0xbe4a, 0x115e, 0x1161, 0xbe27, 0x42e0, 0x42f3, 0xbe2e, 0xbe26, 0xc008, /* 0x61 */ 0x11f7, 0xc2bd, 0xc296, 0x11f4, 0x11f8, 0x451e, 0xc2be, 0xc28e, 0xc574, 0x1264, 0xc580, 0x1292, 0x128f, 0x1290, 0x46b4, 0x1293, 0x12a8, 0xc73c, 0xc73d, 0x12a9, 0xc73a, 0xc742, 0x46f9, 0xc924, 0xc906, 0x4844, 0x130e, 0xc915, 0x130f, 0xc902, 0xc90c, 0x130b, 0xc908, 0xc90a, 0xc905, 0xc91c, 0x1310, 0x1351, 0xca82, 0x1350, 0xca86, 0x1363, 0xcc03, 0xcd7b, 0x13c7, 0xcd7a, 0x4b71, 0x1424, 0x1426, 0x4b6e, 0xcf80, 0x4b79, 0xcf58, 0x4bc4, 0x1474, 0x1473, 0x1472, 0xd1aa, 0xd1ab, 0xd236, 0xd24a, 0x14b1, 0x4d8c, 0xd5d6, 0x150e, 0x1511, 0x1510, 0x150f, 0x1512, 0x1549, 0x50c9, 0x154f, 0x154d, 0xd903, 0xd8cf, 0x1555, 0xdb9f, 0xdba2, 0xde2a, 0xde2f, 0xdf44, 0xdf40, 0x162c, 0x162b, 0xe111, 0xe10f, 0x1679, 0xe10d, 0xe107, 0xe103, 0x167a, 0x54b0, 0x1699, 0x169a, /* 0x62 */ 0xe235, 0x16ae, 0x16af, 0xe304, 0x16e4, 0x16e1, 0x16de, 0x16e6, 0x16df, 0xe326, 0x16e7, 0x16e2, 0x16e0, 0xe31e, 0x16e5, 0x555a, 0xe40e, 0x1718, 0xe41d, 0xe41e, 0xe41f, 0x1756, 0xe588, 0x5646, 0xe58d, 0xe591, 0xe580, 0x176e, 0xe654, 0xe655, 0x179d, 0x17a0, 0x179c, 0xe725, 0xe71a, 0x17a1, 0x17a2, 0x179f, 0x17df, 0x17de, 0x57c3, 0x17ea, 0xe988, 0x1806, 0xe97a, 0x1804, 0x580f, 0xe980, 0xeb1e, 0xebfc, 0xec25, 0x185f, 0x58f4, 0x58fa, 0x185c, 0xec0b, 0x185e, 0xec06, 0xec04, 0x58dd, 0x1859, 0xebf9, 0xec00, 0x1864, 0x185d, 0x1862, 0xec02, 0x1865, 0xec07, 0x58ed, 0x185b, 0x58ef, 0xeeb5, 0x18dd, 0xee87, 0x18df, 0xee93, 0xf70f, 0x18e2, 0xeebe, 0xf066, 0x1927, 0xf0c7, 0xf0cf, 0x5b96, 0x193a, 0x193c, 0xf13d, 0x1939, 0xf13c, 0xf147, 0x193d, 0x193b, 0x5bb3, /* 0x63 */ 0x194c, 0xf1c3, 0x1968, 0x5be2, 0xf31b, 0x1980, 0x1985, 0xf3c9, 0x1995, 0xf3dd, 0x1996, 0xf493, 0x5c8f, 0x603d, 0x00a4, 0x0112, 0x1eb1, 0x0225, 0x6ee6, 0x2141, 0x0337, 0x73f7, 0x77b0, 0x77ae, 0x5dfd, 0x0468, 0x0467, 0x049e, 0x7c9f, 0x7c9e, 0x7f30, 0x05aa, 0x7f4f, 0x05a9, 0x05a4, 0x7f27, 0x7f51, 0x0671, 0x066f, 0x8351, 0x8354, 0x8356, 0x8527, 0x06ad, 0x8524, 0x2bf6, 0x080c, 0x2bf2, 0x080b, 0x8bec, 0x8bc4, 0x080f, 0x0879, 0x93f8, 0x93f6, 0x93f7, 0x93ed, 0x098d, 0x098f, 0x93f4, 0x93ef, 0x098e, 0x0a0c, 0x967f, 0x96a2, 0x967e, 0x0aa6, 0x99c5, 0x0aa3, 0x0aa4, 0x0aa5, 0x3388, 0x0b6e, 0x9ff1, 0x9ff2, 0x0bfa, 0xa12f, 0x0c7c, 0x0c7e, 0x0c7b, 0x0c7d, 0xa323, 0xa329, 0x0c8d, 0x0cf4, 0x0cf3, 0xa61b, 0xa7eb, 0x0d89, 0xa7ea, 0xa933, 0x0dc0, 0xac63, 0x0e65, /* 0x64 */ 0xac92, 0xac65, 0x0ead, 0x0f25, 0xb0a0, 0xf670, 0xb15e, 0x0fc9, 0xb7aa, 0x104a, 0xb7a9, 0x4067, 0x1089, 0xbe9c, 0x1166, 0x1170, 0xbe92, 0x116d, 0x1169, 0x1167, 0xbe86, 0x1172, 0x430e, 0x116e, 0xbe83, 0x119c, 0x11fc, 0x11fd, 0x1204, 0x11ff, 0xf6c2, 0x11fe, 0x1200, 0xc2ce, 0x1266, 0x1269, 0xc593, 0x12aa, 0x12ab, 0x1317, 0xc92e, 0xc927, 0xc928, 0x1315, 0x485e, 0x1312, 0x4a0e, 0xcc18, 0xcc16, 0xcd8d, 0x13ca, 0xcd8e, 0x13c9, 0x13cb, 0xcd90, 0xcd8f, 0xcf81, 0x1429, 0x1428, 0xcf8a, 0xcf8c, 0xd08d, 0x1440, 0x1475, 0x1476, 0xd1b2, 0x1488, 0xd5d9, 0x4eb6, 0x1557, 0x5101, 0xd90d, 0x155f, 0xd913, 0x511d, 0x1558, 0x155b, 0xd91b, 0x512f, 0xdbac, 0x15b3, 0xdbb3, 0x15ef, 0xdf5e, 0x1630, 0xdf60, 0xdf68, 0xdf63, 0xdf69, 0xdf67, 0x1641, 0x164b, 0xe128, 0x167d, /* 0x65 */ 0xe12e, 0xe130, 0x167c, 0xe126, 0xe131, 0xe141, 0x54e0, 0xe1da, 0x54db, 0xf6fa, 0xe20b, 0x5561, 0xe334, 0xe333, 0x16e8, 0x16ea, 0x16e9, 0xe339, 0xe33b, 0xe340, 0xe430, 0x171b, 0xe432, 0xe437, 0x1755, 0x564a, 0x1759, 0x1758, 0xe581, 0xe59f, 0xe5a7, 0x17a4, 0x17a3, 0xe744, 0xe747, 0xe748, 0xe73d, 0x5733, 0x17a7, 0xe749, 0x17e0, 0xe880, 0xe9a0, 0xe99d, 0x1808, 0x180a, 0x1809, 0xe99c, 0xea47, 0xeb07, 0x1871, 0x590f, 0x186c, 0xec49, 0x5911, 0xec44, 0x5903, 0x5901, 0x186e, 0xecdf, 0x5916, 0xec4c, 0x5dfd, 0xec4f, 0x18e0, 0x18ee, 0xeec1, 0x18eb, 0xeeb9, 0xeecb, 0xeecf, 0xeec4, 0x5a93, 0x18ea, 0x18ef, 0x18e7, 0xeeca, 0xeec3, 0xf0d0, 0xf151, 0x1948, 0x1949, 0xf1a8, 0xf1c7, 0xf1c6, 0x194d, 0xf1ca, 0xf202, 0x1955, 0xf25d, 0xf25a, 0x196a, 0x196c, 0xf259, /* 0x66 */ 0x196b, 0xf2cc, 0xf31c, 0xf3cc, 0x1998, 0x1999, 0x1997, 0xf3e8, 0xf3ec, 0xf3ea, 0xf4ad, 0xf4b0, 0x605f, 0x6058, 0x6057, 0x1d5b, 0x6793, 0x0216, 0x6b3b, 0x1ebf, 0x6b34, 0x6ef2, 0x0339, 0x73fd, 0x751d, 0x0425, 0x23ce, 0x7a04, 0x7b48, 0x7f58, 0x834f, 0x0674, 0x836e, 0x8372, 0x06ae, 0x852e, 0x8bfc, 0x8bf4, 0x9036, 0x940e, 0x0992, 0x0994, 0x9414, 0x0995, 0x9419, 0x0a0d, 0x96a6, 0x0a25, 0x9bc9, 0x9bc0, 0x9bcc, 0x9c1b, 0x9caa, 0x9ca8, 0xa003, 0x0bd5, 0x0bd6, 0x34ac, 0x0be8, 0xa135, 0x0c7f, 0x35d2, 0x0cf5, 0x0cf6, 0x0cf7, 0xa4d9, 0x0d24, 0x0d8d, 0x0d8a, 0xa93f, 0xa93d, 0x0e6c, 0x0e66, 0x0e6a, 0xac8b, 0x0e67, 0x0e6d, 0x0e68, 0x3a52, 0xac68, 0xac8a, 0xae58, 0xae57, 0xb0ce, 0xb0bc, 0xb0c0, 0xb0c1, 0xb0bf, 0xb0ab, 0xb15f, 0x0f65, 0xb3a6, 0x0f9a, 0xb429, /* 0x67 */ 0x0fb1, 0x104b, 0x104d, 0x104c, 0x104e, 0xb7b8, 0x1173, 0x1175, 0xbedd, 0xbed6, 0xf6b1, 0xbed5, 0xbee7, 0xbed8, 0xc2ec, 0x1203, 0xc300, 0xc307, 0xc2fd, 0xc2f1, 0xc2ff, 0xc5aa, 0xc5b0, 0xc948, 0x131e, 0xc953, 0x4873, 0xc94d, 0x1319, 0x131c, 0x131a, 0x131d, 0x4876, 0xc943, 0xc950, 0x1343, 0x1352, 0xca8c, 0xcc27, 0x1395, 0xcd99, 0x13cc, 0xcfb1, 0x142b, 0xcfb0, 0xcfaa, 0xcfac, 0x142a, 0x4bc7, 0x1477, 0xd1c8, 0xd1ca, 0xd442, 0xd5e0, 0xd6e7, 0xd6e8, 0xd6e6, 0x1513, 0x1514, 0x5134, 0xd95b, 0xd956, 0x155d, 0xd95a, 0x1560, 0x513e, 0x1562, 0xdab8, 0xdbc5, 0x15b2, 0x15f0, 0xde48, 0xdf7d, 0xdf7c, 0xdf81, 0xdf82, 0xdf62, 0x164c, 0xe145, 0x1682, 0x54bc, 0x1681, 0x169b, 0xe1e3, 0x16a4, 0x16ee, 0x16ec, 0xe350, 0x16ed, 0xe34f, 0x16f0, 0x16ef, 0xe439, 0x171d, /* 0x68 */ 0xe43a, 0x1760, 0x175e, 0x175d, 0xe5c1, 0xe74e, 0xe76e, 0x17b1, 0x17ab, 0x17ac, 0x17ad, 0xe771, 0x17ae, 0xe88c, 0xe889, 0x17e2, 0xe8e5, 0xe9b3, 0xe9b6, 0xe9b4, 0xea4d, 0x5839, 0xeb13, 0xec78, 0x592a, 0x187b, 0x5926, 0x1878, 0x1875, 0x5927, 0xec72, 0x18f2, 0x18f4, 0x18f3, 0x5ac0, 0x5ac9, 0xf075, 0xf0da, 0xf0d7, 0x193f, 0x193e, 0x1940, 0x194e, 0x1957, 0x1959, 0x1958, 0xf716, 0xf269, 0xf267, 0x196e, 0xf266, 0xf26f, 0xf271, 0x5bec, 0xf2cf, 0xf323, 0x1981, 0x1986, 0xf3a5, 0x198f, 0xf3fe, 0xf3fb, 0xf3fd, 0x5c68, 0x199b, 0x19b1, 0x19b3, 0x6b6d, 0x033a, 0x7405, 0x7520, 0x0427, 0x77c8, 0x77c9, 0x046a, 0x05ac, 0x8627, 0x0818, 0x8c1e, 0x8d36, 0x084c, 0x943d, 0x0996, 0x99d7, 0x0b4a, 0x9cad, 0x9e00, 0x0c81, 0xa33a, 0x0c83, 0x0cf9, 0x0cf8, 0xa626, 0x0d8e, /* 0x69 */ 0x0d8f, 0x0dc1, 0xacb7, 0xacb6, 0xacc0, 0x0e70, 0xac9b, 0x0e71, 0xb0d8, 0x0f2a, 0x0f2d, 0x0f7d, 0x3e32, 0x3e31, 0xb7c0, 0x104f, 0xb7bf, 0xb9bf, 0x1090, 0xbf20, 0xbed0, 0xbf0e, 0x1179, 0xbf1d, 0xbf1e, 0xbf15, 0xbf14, 0xc31e, 0xc32c, 0x1205, 0xc5b9, 0xc5b8, 0xc5b6, 0xc69e, 0xc69c, 0xc74d, 0x46fd, 0xc96e, 0xc960, 0x1321, 0xc964, 0xc962, 0xb0e5, 0x1332, 0xcda3, 0x13cd, 0x13cf, 0xd1d2, 0xd1d5, 0x4d8e, 0x1516, 0x1515, 0x15b5, 0x1608, 0xde55, 0x1632, 0xdf93, 0x1633, 0x1634, 0x163c, 0xe156, 0x54c2, 0xe1e9, 0x169c, 0xe245, 0x16f4, 0x16f2, 0xe47c, 0x1762, 0xe5d3, 0x1761, 0x1764, 0x17b5, 0x574b, 0x17b4, 0xe78e, 0xe897, 0x17e3, 0xe89b, 0xe899, 0x581c, 0x180e, 0xe9cf, 0x581b, 0xea59, 0x182c, 0x182b, 0xeb20, 0xeb23, 0xeb2a, 0x1885, 0x1881, 0x187e, 0x1883, /* 0x6a */ 0x1880, 0xecb0, 0x5942, 0xef2f, 0x5ad4, 0x18fb, 0x18f7, 0xef32, 0xef43, 0xef3f, 0xef39, 0x18f8, 0xef30, 0xf0dd, 0xf1da, 0xf1db, 0x195a, 0xf284, 0xf27f, 0xf272, 0xf280, 0xf2ee, 0x1978, 0xf32a, 0xf322, 0xf371, 0xf3cd, 0x199d, 0x199c, 0xf40f, 0xf418, 0x606a, 0x00a9, 0x00bf, 0x1ed0, 0x1ecf, 0x740c, 0x23da, 0x7ca6, 0x0677, 0x0676, 0x8537, 0x06bb, 0x29ea, 0x8ee2, 0x099b, 0x96bc, 0x0a0f, 0x0a5b, 0x9bd5, 0x0b4c, 0x0b6f, 0x0bd9, 0xa012, 0x0c82, 0xa34b, 0xa341, 0xa3a1, 0xa4ec, 0x0e74, 0x0e72, 0xacd4, 0xacd8, 0xacd9, 0x0e73, 0xacda, 0xae6c, 0xae6d, 0x0eb1, 0x0f2e, 0xb0e7, 0xb0eb, 0xb0ec, 0xb162, 0x0f4e, 0xb42b, 0xb50d, 0xb7cd, 0xb9c3, 0xbf3f, 0xbf3c, 0xbf3e, 0xbf3d, 0xbf3a, 0xbf38, 0xc344, 0xc345, 0x120b, 0xc348, 0xc350, 0x126c, 0x4889, 0xc978, 0xc979, /* 0x6b */ 0x138b, 0xcc3e, 0x13d0, 0x142d, 0xd454, 0x14e4, 0x1571, 0xd9b9, 0x5158, 0x156f, 0xde5f, 0x1687, 0x16a5, 0xe372, 0xe375, 0x171e, 0x1765, 0x17b9, 0x17b7, 0x17b8, 0x17e4, 0xe8a3, 0xe8a5, 0xe9dc, 0xe9dd, 0xea5a, 0x188c, 0x1889, 0x188a, 0xecdb, 0xecdc, 0x188b, 0xefab, 0xef84, 0xef76, 0x1901, 0x18fe, 0x5ae7, 0x1903, 0x1906, 0xef83, 0x5aea, 0x5af1, 0xf07f, 0x191d, 0x1943, 0xf173, 0xf1ad, 0xf1b0, 0x194f, 0xf20f, 0xf20c, 0x195b, 0x1970, 0xf379, 0x1988, 0xf377, 0xf37a, 0x1989, 0x5c44, 0xf432, 0xf427, 0xf42a, 0xf42c, 0x5c6d, 0xf428, 0xf429, 0xf438, 0x642f, 0x6b7b, 0x740d, 0x23d9, 0x77d6, 0x77d5, 0x83a1, 0x8c4c, 0x099e, 0x099f, 0x0aa7, 0x0b4b, 0x0bdb, 0x0bda, 0xa0c0, 0x35d6, 0x0c8e, 0x0e76, 0xacf4, 0x0f30, 0x0f2f, 0xb0f0, 0x0f66, 0xb23f, 0x117e, 0xc35d, /* 0x6c */ 0xc372, 0xc362, 0x453a, 0xc366, 0x4675, 0x126f, 0xc988, 0x13d1, 0x142f, 0xcfe8, 0xcfe4, 0x14b2, 0x1518, 0x1517, 0xd6ff, 0x1576, 0xdfaf, 0xdfae, 0x164f, 0x1689, 0xe1f2, 0xe248, 0xe381, 0xe37e, 0x16f5, 0x171f, 0xe452, 0xe5ef, 0x575d, 0x17e5, 0xe8ad, 0xe9e6, 0x1810, 0xe9ed, 0x180f, 0xe9e9, 0xea61, 0xea60, 0xeb33, 0x182f, 0x1830, 0x5964, 0xed0b, 0xed08, 0x1893, 0x1894, 0xed07, 0x1907, 0x1909, 0x1908, 0xefca, 0x190b, 0xefc6, 0x5b0a, 0xf084, 0xf0eb, 0xf17d, 0x1950, 0x1971, 0xf29b, 0xf2a2, 0xf2a1, 0xf2a0, 0xf29c, 0x197b, 0x197c, 0xf380, 0x5c73, 0xf440, 0x19a1, 0xf439, 0xf43c, 0x19a0, 0x19a2, 0x64ca, 0x021b, 0x6b89, 0x0282, 0x853c, 0x8d40, 0x9463, 0x9469, 0x0be9, 0xa353, 0x0c84, 0x35e1, 0xa817, 0xa81a, 0xad00, 0x0eb3, 0x0f34, 0x0f33, 0x1180, 0xc36f, /* 0x6d */ 0xc6ab, 0x12ad, 0xc991, 0x1344, 0x1355, 0xcdb1, 0x13d2, 0xcfef, 0xdbf1, 0xdbf2, 0xdfb7, 0xdfb5, 0x168a, 0xe386, 0xe45a, 0x1767, 0xe7c6, 0xe7cb, 0x17e6, 0xe8b2, 0x1813, 0xe9f3, 0x582d, 0xed27, 0x1897, 0x5b0c, 0xefd5, 0xefd8, 0x190c, 0xefec, 0xf087, 0xf0f2, 0x1946, 0x195c, 0x1974, 0x1972, 0xf2ad, 0xf2b0, 0xf2fd, 0x5c1f, 0xf387, 0xf44a, 0x19a4, 0x19a3, 0xf44e, 0xf449, 0xf451, 0xf44d, 0x19b4, 0x6072, 0x0136, 0x7416, 0x8c6d, 0x8d41, 0x08b2, 0x9471, 0x9474, 0x0b16, 0x3a70, 0x0e77, 0xae7c, 0x117f, 0xbf8a, 0xc756, 0x147d, 0x5179, 0xd9fa, 0x544a, 0x168c, 0xe45b, 0x1768, 0x17be, 0x1815, 0xeff5, 0xeff0, 0xf0f3, 0xf17f, 0xf213, 0x1975, 0x19a5, 0x7419, 0x7f85, 0x83b0, 0x9477, 0xa4ff, 0x0e78, 0x0f35, 0x3c9d, 0x1182, 0xbf87, 0x1183, 0xbf8b, 0x1271, 0xc99e, /* 0x6e */ 0x147e, 0x168e, 0xe38f, 0x5660, 0x1769, 0xe639, 0xe7d4, 0xe8f1, 0xea02, 0xea6b, 0xeb40, 0x189a, 0x189b, 0xf010, 0xf2be, 0xf2b9, 0x1990, 0xf464, 0x5c9e, 0x9be9, 0xbf90, 0x1186, 0x1185, 0xc01c, 0x120e, 0xc392, 0xc6ae, 0xc9a3, 0x1519, 0xdfc9, 0x17c0, 0xe7d8, 0xeb44, 0xf024, 0x5bf8, 0x5c3a, 0x5c7d, 0xf470, 0xf4d3, 0x0c0d, 0x1816, 0xf2c3, 0x19a9, 0x19aa, 0x0c85, 0xad21, 0xb9ca, 0xc39c, 0xea73, 0xf186, 0xf3c1, 0xea09, 0x5c96, 0xf4d5, 0x17c2, 0x1831, 0x1911, 0x19ab, 0x189c, 0xdfd4, }; static const ucs4_t cns11643_4b_2uni_upages[248] = { 0x03400, 0x03500, 0x03600, 0x03700, 0x03800, 0x03900, 0x03a00, 0x03b00, 0x03c00, 0x03d00, 0x03e00, 0x03f00, 0x04000, 0x04100, 0x04200, 0x04300, 0x04400, 0x04500, 0x04600, 0x04700, 0x04800, 0x04900, 0x04a00, 0x04b00, 0x04c00, 0x04d00, 0x05000, 0x05100, 0x05200, 0x05300, 0x05600, 0x05800, 0x05900, 0x05b00, 0x05c00, 0x05d00, 0x05e00, 0x05f00, 0x06100, 0x06400, 0x06500, 0x06600, 0x06900, 0x06a00, 0x06b00, 0x06f00, 0x07000, 0x07100, 0x07200, 0x07300, 0x07400, 0x07500, 0x07600, 0x07700, 0x07800, 0x07900, 0x07a00, 0x07b00, 0x07c00, 0x07d00, 0x07e00, 0x07f00, 0x08000, 0x08100, 0x08200, 0x08400, 0x08500, 0x08600, 0x08700, 0x08800, 0x08900, 0x08a00, 0x08b00, 0x08c00, 0x08d00, 0x08e00, 0x08f00, 0x09000, 0x09100, 0x09200, 0x09300, 0x09400, 0x09500, 0x09600, 0x09700, 0x09800, 0x09900, 0x09a00, 0x09b00, 0x09c00, 0x09d00, 0x09e00, 0x09f00, 0x0ff00, 0x20000, 0x20300, 0x20400, 0x20500, 0x20600, 0x20700, 0x20800, 0x20900, 0x20a00, 0x20b00, 0x20e00, 0x20f00, 0x21000, 0x21100, 0x21200, 0x21300, 0x21400, 0x21500, 0x21600, 0x21800, 0x21900, 0x21a00, 0x21b00, 0x21c00, 0x21e00, 0x21f00, 0x22100, 0x22200, 0x22300, 0x22400, 0x22500, 0x22700, 0x22800, 0x22900, 0x22a00, 0x22c00, 0x22d00, 0x22e00, 0x22f00, 0x23000, 0x23100, 0x23200, 0x23300, 0x23500, 0x23600, 0x23700, 0x23800, 0x23900, 0x23a00, 0x23b00, 0x23c00, 0x23e00, 0x23f00, 0x24000, 0x24100, 0x24300, 0x24400, 0x24500, 0x24600, 0x24800, 0x24900, 0x24a00, 0x24b00, 0x24c00, 0x24d00, 0x24e00, 0x24f00, 0x25000, 0x25200, 0x25300, 0x25500, 0x25600, 0x25700, 0x25800, 0x25900, 0x25a00, 0x25b00, 0x25c00, 0x25d00, 0x25e00, 0x25f00, 0x26000, 0x26100, 0x26200, 0x26300, 0x26400, 0x26500, 0x26600, 0x26700, 0x26800, 0x26900, 0x26a00, 0x26c00, 0x26d00, 0x26e00, 0x26f00, 0x27000, 0x27100, 0x27200, 0x27300, 0x27400, 0x27500, 0x27600, 0x27700, 0x27800, 0x27900, 0x27a00, 0x27b00, 0x27c00, 0x27d00, 0x27e00, 0x27f00, 0x28000, 0x28100, 0x28200, 0x28300, 0x28400, 0x28500, 0x28600, 0x28700, 0x28800, 0x28900, 0x28a00, 0x28b00, 0x28c00, 0x28d00, 0x28e00, 0x28f00, 0x29000, 0x29100, 0x29200, 0x29300, 0x29400, 0x29500, 0x29600, 0x29700, 0x29800, 0x29900, 0x29a00, 0x29b00, 0x29c00, 0x29d00, 0x29e00, 0x29f00, 0x2a000, 0x2a100, 0x2a200, 0x2a300, 0x2a400, 0x2a500, 0x2a600, 0x2f800, 0x2f900, 0x2fa00, }; freelan-2.0/third-party/source/libiconv-msvc/include/cns11643_5.h000066400000000000000000002244741252300335000245210ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CNS 11643-1992 plane 5 */ static const unsigned short cns11643_5_2uni_page21[8603] = { /* 0x21 */ 0x3bd1, 0x3bcb, 0x3bc9, 0x3c0c, 0x3b00, 0x3b87, 0x3c0d, 0x3c0f, 0xe21d, 0x5e98, 0x3bd2, 0x3c11, 0x3b7e, 0x45d3, 0x5052, 0x57fe, 0x60a9, 0x7442, 0x3b09, 0x3bd6, 0x3fdd, 0x3fdc, 0x4002, 0x4073, 0x4176, 0x41a7, 0x41a8, 0x4333, 0x43cc, 0x450d, 0x452c, 0x461b, 0x015a, 0x461d, 0x4699, 0x4d3e, 0x582d, 0x582f, 0x5e99, 0x6eb3, 0x74b6, 0x761b, 0x7fef, 0x83e9, 0x3b14, 0x3b94, 0x3be1, 0x4006, 0x404a, 0x4044, 0x4131, 0x417a, 0x41ad, 0x41ae, 0x41b1, 0x4338, 0x4337, 0x447d, 0x447e, 0x452d, 0x4532, 0x4623, 0x4626, 0xe23a, 0x46a0, 0x51a8, 0x543f, 0x54bc, 0x56c4, 0x583b, 0x5b19, 0x5b18, 0x5cb3, 0x5eaa, 0x5fbe, 0x60ac, 0x6525, 0x6566, 0x656b, 0x7443, 0x74b5, 0x75ec, 0x7776, 0x08bc, 0x8114, 0x50dc, 0x821c, 0x821d, 0x9fd0, 0xa112, 0xa5f3, 0xc169, 0x15b9, 0xc911, /* 0x22 */ 0xc915, 0xc910, 0xc913, 0x3ba4, 0x3ba5, 0x3cd0, 0x3cba, 0x3ccb, 0x407b, 0x4186, 0x41bb, 0x41ba, 0x41c3, 0x41b9, 0x41c0, 0x00de, 0x4339, 0x433b, 0x4341, 0x43d1, 0x43cf, 0x43d2, 0x442e, 0x446e, 0x448c, 0x4488, 0x4535, 0x0143, 0x453a, 0x453b, 0x4538, 0x4539, 0x462e, 0x462c, 0x46c8, 0x46b5, 0x46ad, 0x46b0, 0x46ab, 0x4cb3, 0x4ca9, 0x51bb, 0x51b9, 0x565a, 0x56cd, 0x572b, 0x5805, 0x03ac, 0x03aa, 0x5851, 0x584b, 0x5aea, 0x5aed, 0x5b36, 0x5b62, 0x5b56, 0x5b55, 0x5b64, 0x5b58, 0x1c07, 0x5cda, 0x5cd8, 0x5ead, 0x5eab, 0x5fc0, 0x5fc3, 0x60b3, 0x60b7, 0x60ba, 0x1dcb, 0x04fe, 0x60c7, 0x60b5, 0x648e, 0x6573, 0x656c, 0x6574, 0xe2b4, 0x6572, 0x6571, 0x6582, 0x6570, 0x6c3f, 0x6eba, 0x6eb8, 0x74b7, 0x8223, 0x8221, 0x822b, 0x8226, 0x8222, 0x8825, 0x8be4, 0x8f15, /* 0x23 */ 0x9fe4, 0xa133, 0xa12a, 0xa132, 0xa129, 0xa5fb, 0xb45b, 0xb45c, 0xb728, 0xc16f, 0xc16d, 0xc16b, 0xc16e, 0xc916, 0x3b22, 0x3c16, 0x3c48, 0x3cd8, 0x3d00, 0x0041, 0x3f80, 0x3fe4, 0x00b4, 0x3fe7, 0x400c, 0x4053, 0x40b7, 0x45e8, 0x41d1, 0x41e5, 0x41d8, 0x41d6, 0x41da, 0x41d9, 0x41d5, 0x41e6, 0x41d4, 0x41d3, 0x4344, 0x43d6, 0x43d7, 0x4413, 0x3afd, 0x4470, 0x4492, 0x44db, 0x44da, 0x4541, 0x4543, 0x4633, 0x46f6, 0x46d4, 0x46dd, 0x46d0, 0x4704, 0x46d9, 0x46db, 0x4705, 0x46d3, 0x46e1, 0x4d80, 0x4d77, 0x4d81, 0x4d82, 0x4d83, 0xe25c, 0x5061, 0x5060, 0x51d8, 0x51d6, 0x51d7, 0x8105, 0x544d, 0x5448, 0x56d6, 0x56cf, 0x56d9, 0x56d8, 0x573d, 0x03b3, 0x5854, 0x585b, 0x585c, 0x03b4, 0x5859, 0x5858, 0x585a, 0x5855, 0x5856, 0x5882, 0x5af0, 0x5b1c, 0x5b6a, 0x5b69, /* 0x24 */ 0x5b71, 0x5b67, 0x5b6c, 0x5b6e, 0x5b79, 0x5c8b, 0x5cb8, 0x5ce7, 0x5ce8, 0x5ce4, 0x5ce6, 0x5ce5, 0x5cf0, 0x5e83, 0x5eb7, 0x5ebb, 0x5eb9, 0x5ec5, 0x5f53, 0x5fc4, 0x5fc6, 0x5fcb, 0x60c8, 0xe29f, 0x60c9, 0x60db, 0x6494, 0x6595, 0x6588, 0x658d, 0x69ec, 0x69ee, 0x69f1, 0x6c2e, 0x6c49, 0x6e5f, 0x6ed1, 0x6ecb, 0x7385, 0x081d, 0x744a, 0x7447, 0x744b, 0x74bb, 0x74c4, 0x087c, 0x7602, 0x7782, 0x7791, 0x778f, 0x7792, 0x7c8f, 0x7c91, 0x7cb4, 0x7c92, 0x7ff4, 0x80aa, 0x8235, 0x8237, 0x823d, 0x823c, 0x822f, 0x8230, 0x83f8, 0x83ef, 0x8626, 0x0b55, 0x8826, 0x8827, 0x8a41, 0x8ac6, 0x8ac7, 0x8beb, 0x8be8, 0x8bea, 0x8f1a, 0x8f19, 0x0d26, 0x9423, 0x9424, 0x9925, 0xa135, 0xa134, 0xa507, 0xad1d, 0xb2e1, 0xb6ab, 0xbf60, 0xc177, 0xc17d, 0x15bc, 0xc91e, 0xc91a, 0xc91d, /* 0x25 */ 0x3b6b, 0x3c2d, 0x3c4c, 0x3d2a, 0x004a, 0x3d15, 0x3d2c, 0x3d06, 0x3d08, 0x3d0a, 0x004e, 0x4056, 0x4084, 0x00c9, 0x40c6, 0x41f5, 0x4209, 0x41f8, 0x41e8, 0x41fb, 0x41e9, 0x41f6, 0x1ab7, 0x1ab8, 0x4352, 0x1ab6, 0x1aba, 0x4354, 0x4351, 0x4439, 0x443a, 0x4498, 0x454e, 0x017b, 0x4736, 0x470c, 0x4710, 0x4732, 0x4711, 0x4718, 0x471c, 0x471a, 0x4719, 0x470b, 0x470f, 0x471d, 0x4721, 0x4713, 0x471b, 0x4715, 0x0220, 0x4cd1, 0x4cc8, 0x4d8d, 0x4db5, 0x0289, 0x0295, 0x50f8, 0x51e0, 0x51e1, 0x02be, 0x51de, 0x51fe, 0x51dc, 0x5201, 0x51fd, 0x5200, 0x54d7, 0x54d6, 0x54d9, 0x5665, 0x56d2, 0x56dc, 0x56e1, 0x56de, 0x5742, 0x574b, 0x03c3, 0x588e, 0x5891, 0x588b, 0x5890, 0x5888, 0x5889, 0x5884, 0x58aa, 0x5b8d, 0x5b8f, 0x5b7d, 0x5b7f, 0x5b7b, 0x5b80, 0x5b7e, 0x5b83, /* 0x26 */ 0x5b81, 0x5b86, 0x5b8a, 0x5cbd, 0x5cbe, 0x0477, 0x5cf4, 0x5cf3, 0x5d02, 0x5cf6, 0x5cf5, 0x5cf2, 0x5d04, 0x5e3d, 0x5ec6, 0x5f89, 0x5fd4, 0x5fd6, 0x5fd2, 0x60fa, 0x6106, 0x610c, 0x610a, 0x610f, 0x652f, 0x05d4, 0x65b7, 0x65be, 0x65bc, 0x65e2, 0x6a06, 0x69f7, 0x6a07, 0x69f6, 0x7635, 0x6c5f, 0x6c65, 0x6c64, 0x6c61, 0x6c5a, 0x6c5d, 0xe2d7, 0x6ed7, 0x6ed5, 0x6ede, 0x6ee1, 0x6ee0, 0x6ed9, 0x074c, 0x6eda, 0x6edf, 0x6ef6, 0x6f03, 0x0820, 0x7393, 0x738b, 0x7391, 0x7392, 0x738a, 0x7389, 0x738f, 0x7456, 0x7459, 0x74ca, 0x74cc, 0x085b, 0x74d0, 0x74cd, 0x74d6, 0x74cb, 0x7583, 0x7582, 0x7606, 0x762a, 0x762c, 0x762b, 0x7629, 0x77bd, 0x77b3, 0x77be, 0x77c0, 0x77b5, 0x77b6, 0x7c9d, 0x7c9f, 0x8120, 0x0a2d, 0x811e, 0x811c, 0x8132, 0x811f, 0x812b, 0x8121, 0x8126, /* 0x27 */ 0x8124, 0x811d, 0x8127, 0x825b, 0x8259, 0x8280, 0x8255, 0x8250, 0x825a, 0x8256, 0x8263, 0x8252, 0x8258, 0x0a63, 0x8239, 0x83f9, 0x8628, 0x0b18, 0x86bc, 0x86d6, 0x8705, 0x8720, 0x0b74, 0x8833, 0x8a46, 0x8a42, 0x8a43, 0x8a47, 0x8acb, 0x8b42, 0x8b45, 0x8bfd, 0x8bf4, 0x8bf9, 0x8bfa, 0x8e5e, 0x8f1d, 0x0d28, 0x9258, 0x9255, 0x9557, 0x9558, 0x95d9, 0x95dc, 0x95db, 0x9927, 0x9a85, 0x9a87, 0x9a8a, 0x9d8b, 0x9e4f, 0xa030, 0xa02f, 0xa168, 0xa149, 0x0fda, 0xa148, 0xa13f, 0xa14b, 0xa15c, 0xa146, 0xa140, 0xa50d, 0xa61b, 0xa61d, 0xa617, 0x10a4, 0xa622, 0xb0a7, 0xb108, 0xb306, 0xbf7d, 0x148e, 0xbf63, 0xbf64, 0xbf7f, 0xbf6b, 0xbf7c, 0xbf68, 0xbf65, 0xbf6a, 0xc198, 0xc199, 0xc1ae, 0xc92b, 0xc92d, 0xc931, 0xc92e, 0xc92f, 0x3b6d, 0x3c31, 0x3d2d, 0x3d39, 0x3d38, /* 0x28 */ 0x005b, 0x3d3a, 0x3d35, 0x3d62, 0x3fea, 0x3feb, 0x4015, 0x40cc, 0x40c8, 0x40cd, 0x40db, 0x40cb, 0x4211, 0x4226, 0x4362, 0x435e, 0x4361, 0x4441, 0x443f, 0x4475, 0x7465, 0x4649, 0x44eb, 0x451a, 0x4557, 0x476b, 0x47a9, 0x4754, 0x4762, 0x47aa, 0x4758, 0x4772, 0x4763, 0x4773, 0x478b, 0x478c, 0x475c, 0x4751, 0x4716, 0x4760, 0x4761, 0x475e, 0x475d, 0x4764, 0x4753, 0x475f, 0x475b, 0x476e, 0x4755, 0x4752, 0x4768, 0x4cd2, 0x4cd6, 0x4cd3, 0x4db8, 0x4dbb, 0x4deb, 0x4de8, 0x4db6, 0x4dea, 0x4de7, 0x4de9, 0x5091, 0x5110, 0x510e, 0x510f, 0x520b, 0x5203, 0x522b, 0x5209, 0x5228, 0x522c, 0x5225, 0x5227, 0x520f, 0x54e9, 0x54ec, 0x0353, 0x5627, 0x5673, 0x56e2, 0x56e6, 0xe276, 0x5761, 0x5751, 0x5812, 0x580e, 0x58ad, 0x58af, 0x58b1, 0x58d3, 0x5b94, 0x5b92, 0x5b90, /* 0x29 */ 0x5b9d, 0x5b93, 0x5b95, 0x5b98, 0x5b97, 0x0480, 0xe28a, 0x5d07, 0x5d0b, 0x5d08, 0x5ed9, 0x5ed5, 0x5fd7, 0x5fdf, 0x04dd, 0x5fde, 0x5fe3, 0x5fe2, 0x04de, 0x6147, 0x0522, 0x613d, 0x6138, 0x6544, 0x653a, 0x65b8, 0x662a, 0x6600, 0x65f3, 0x65f2, 0x65eb, 0x65fa, 0x65ed, 0x65ec, 0x65ff, 0x65fb, 0x1f06, 0x664e, 0x65ef, 0x65f7, 0x6a10, 0x6a11, 0x6a0c, 0x6a0b, 0x6bdd, 0x6c30, 0x06db, 0x6c7a, 0x6c77, 0x6e28, 0x6e27, 0x6e65, 0x6f0e, 0x6f0b, 0x6f41, 0x6f13, 0x6f0f, 0x6f12, 0x6f30, 0x73a0, 0x73a3, 0x739e, 0x7397, 0x73a1, 0x739d, 0x739b, 0x7463, 0x74e3, 0x74e4, 0x74e6, 0x74e7, 0x74dd, 0x2185, 0x74ec, 0x74e5, 0x74f1, 0x763b, 0x7639, 0x763a, 0x763c, 0x763d, 0x7647, 0x763f, 0x7644, 0x7748, 0x7749, 0x7760, 0x77e3, 0x77e9, 0x77f0, 0x08da, 0x08db, 0x77f2, 0x77ed, /* 0x2a */ 0x77ec, 0x77e6, 0x7816, 0x08d7, 0x7cbc, 0x7cbe, 0x7cc0, 0x7ce0, 0x8000, 0x8002, 0x7ffe, 0x805e, 0x80b3, 0x80b7, 0x813a, 0x8139, 0x813e, 0x8138, 0x813d, 0x814f, 0x826e, 0x825f, 0x8281, 0x8282, 0x8271, 0x827b, 0x8279, 0x8277, 0x8273, 0x826f, 0x8297, 0x827e, 0x83fc, 0x8411, 0x8432, 0x8431, 0x8410, 0x85ec, 0x85eb, 0x862c, 0x862d, 0x86da, 0x872e, 0x872c, 0x872a, 0x8733, 0x874b, 0x8818, 0x8842, 0x883b, 0x883f, 0x8841, 0x8843, 0x883c, 0x8a4c, 0x8a4a, 0x8a49, 0x8a56, 0x8acf, 0x8b47, 0x8b48, 0x8b46, 0x8c1b, 0x8c11, 0x8c14, 0x8c1d, 0x8c17, 0x8c1e, 0x8c0b, 0x8c1c, 0x8c12, 0x8c16, 0x8c0d, 0x8c15, 0x8c13, 0x8c18, 0x0c1a, 0x8eac, 0x8f44, 0x8f2c, 0x8f45, 0x9266, 0x926e, 0x9265, 0x9268, 0x9284, 0x9438, 0x943b, 0x943a, 0x943f, 0x95df, 0x95dd, 0x95de, 0x95e2, /* 0x2b */ 0x0dd6, 0x992c, 0x992f, 0x9a8f, 0x9a90, 0x9a8c, 0x9a93, 0x9d25, 0x9d88, 0x9da7, 0x9ef7, 0x9fbb, 0xa038, 0xa039, 0xa037, 0xa114, 0xa16e, 0xa17b, 0x0fde, 0xa16c, 0xa17f, 0xa178, 0xa17a, 0xa16f, 0x0fe5, 0xa3fe, 0xa648, 0xa64b, 0xa641, 0xa649, 0xa63b, 0xad2d, 0xb0e3, 0xb11a, 0xb10d, 0xb113, 0xb111, 0xb11c, 0x1272, 0xb3b5, 0x12af, 0xb729, 0xb7a1, 0xb824, 0xbabb, 0xbda1, 0xbf83, 0xbf8d, 0xbf87, 0xbf85, 0xbf8a, 0xbfa3, 0xbf89, 0xbf84, 0xbfa2, 0xc1b1, 0xc1b0, 0xc1af, 0xc1b6, 0xc1c9, 0xc1ca, 0xc1c8, 0xc1b4, 0xc759, 0xc7c9, 0xc941, 0xc94c, 0x15c4, 0xc945, 0xc95a, 0x3bb9, 0x3d94, 0x3d6e, 0x3da2, 0x3d67, 0x0063, 0x3da3, 0x3d76, 0x3d6c, 0x3d64, 0x3da5, 0x3d30, 0x3da6, 0x3d69, 0x3da4, 0x3f90, 0x405f, 0x4060, 0x40da, 0x40d8, 0x40dd, 0x00ec, 0x4259, 0x425b, /* 0x2c */ 0x425a, 0x4239, 0x4234, 0x4244, 0x4233, 0x423c, 0x4258, 0x426a, 0x436f, 0x4372, 0x4370, 0x4371, 0x436e, 0x43f0, 0x43eb, 0x4449, 0x444c, 0x44f5, 0x4520, 0x456a, 0x4572, 0x464b, 0x465d, 0x4750, 0x47f9, 0x47fa, 0x47fb, 0x4823, 0x47b7, 0x4822, 0x47b5, 0x47c4, 0x47b4, 0x47ef, 0x0198, 0x47cd, 0x47f0, 0x47b8, 0x47cb, 0x47f1, 0x47ba, 0x4803, 0x47f8, 0x47b6, 0x47bc, 0x47b3, 0x4821, 0x47f7, 0x47c2, 0x47be, 0x47c9, 0x47bd, 0x47ce, 0x47b9, 0x47c7, 0x47ca, 0x47cc, 0x4826, 0x4ce4, 0x4ce0, 0x4cf0, 0x4dec, 0x4e24, 0x4e18, 0x4e2f, 0x4e25, 0x5028, 0x5022, 0x506a, 0x3c57, 0x5094, 0x5092, 0x509c, 0x5122, 0x5130, 0x511d, 0x5123, 0x5235, 0x5233, 0x522f, 0x524d, 0x5231, 0x525b, 0x525a, 0x5232, 0x525c, 0x5259, 0x525d, 0x5469, 0x546d, 0x5d32, 0x0358, 0x550a, 0x5520, /* 0x2d */ 0x551f, 0x550d, 0x56e8, 0x56ec, 0x5777, 0x5770, 0x5771, 0x58f8, 0x58d6, 0x58d9, 0x58de, 0x58d5, 0x58e1, 0x03d3, 0x58e2, 0x58dd, 0x58e0, 0x590e, 0x5908, 0x58dc, 0x590a, 0x590c, 0x5bb4, 0x5bb1, 0x5bb6, 0x5bbc, 0x5d1d, 0x5d24, 0x5d19, 0x5d1b, 0x5d22, 0x5d1a, 0x5d1c, 0x5d21, 0x5ee6, 0x5ee4, 0x5ee7, 0x5eea, 0x04e2, 0xe29b, 0x5ff0, 0x5ff5, 0x5fef, 0x6142, 0x616e, 0x613c, 0x6197, 0x618c, 0x6181, 0x6171, 0x61ce, 0x61ba, 0x617a, 0x617e, 0x0554, 0x6172, 0x61bb, 0x052f, 0x6173, 0x6182, 0x05b6, 0x64ba, 0x64b8, 0x654b, 0x6548, 0x662b, 0x65f4, 0x662c, 0x6642, 0x6648, 0x6644, 0x6645, 0x663c, 0x6637, 0x6633, 0x6641, 0x6632, 0x6687, 0x6a27, 0x6a23, 0x6a2d, 0x6a1f, 0x6a2c, 0x6a28, 0x6b75, 0x6b74, 0x6be7, 0x6c32, 0x6c31, 0x6c99, 0x6c96, 0x6c98, 0x6c9d, 0x6c92, /* 0x2e */ 0x6c94, 0x6c95, 0x6c97, 0xa1b9, 0x0735, 0x6f11, 0x6f3b, 0x6f79, 0x6f42, 0x6f43, 0x075d, 0x6f78, 0x73ac, 0x0829, 0x73b1, 0x73b4, 0x73b3, 0x73af, 0x73aa, 0x73b2, 0x7468, 0x74f2, 0x74fe, 0x74f8, 0x74f9, 0x74ff, 0x74f5, 0x74f7, 0x74fd, 0x7500, 0x7588, 0x766e, 0x765d, 0x7663, 0x7660, 0x7761, 0x7837, 0x7871, 0x7823, 0x7822, 0x781f, 0x7825, 0x7cfd, 0x7d11, 0x7d23, 0x7cf0, 0x7cef, 0x800e, 0x800c, 0x80ba, 0x0a1f, 0x8152, 0x8155, 0x8153, 0x8154, 0x8151, 0x8158, 0x82b0, 0x829f, 0x0a72, 0x82a1, 0x829a, 0x82be, 0x82a0, 0x8437, 0x0b0b, 0x85f1, 0x85f2, 0x8634, 0x8637, 0x8635, 0x5e8c, 0x86df, 0x874c, 0x874e, 0x8764, 0x8763, 0x8736, 0x8858, 0x8868, 0x885b, 0x885f, 0x8859, 0x8865, 0x8860, 0x885e, 0x8ad5, 0x8ad6, 0x8b4e, 0x8b52, 0x8c35, 0x8c39, 0x8c58, 0x8c41, /* 0x2f */ 0x8c57, 0x8c38, 0x8c3d, 0x8c32, 0x8c44, 0xe344, 0x8e63, 0x8e62, 0x8eb8, 0x8eb0, 0x8eb1, 0x8f4d, 0x8f63, 0x8f70, 0x8f4b, 0x8f4f, 0x8f4e, 0x8f53, 0x8f47, 0x0ca2, 0x8f54, 0x8f52, 0x8f59, 0x8f7e, 0x912b, 0x912e, 0x927f, 0x927e, 0x9281, 0x9283, 0x9447, 0x9454, 0x944d, 0x944c, 0x944b, 0x9457, 0x9565, 0x9564, 0x9561, 0x9562, 0x95f0, 0x95f3, 0x95f9, 0x95f4, 0x95f5, 0x95ef, 0x95f8, 0x95fc, 0x95f7, 0x95fd, 0x9617, 0x9934, 0x9936, 0x9938, 0x9aaf, 0x9aae, 0x9aac, 0x9aa2, 0x9d28, 0x69c2, 0x9d9c, 0x9db3, 0x9d90, 0x9f06, 0x9f04, 0x9f0b, 0x9f05, 0xa040, 0xa04f, 0xa1ab, 0xa19d, 0xa1b8, 0xa1b2, 0xa1d2, 0xa1cf, 0xa1a2, 0x0fec, 0xa1a5, 0xa1a9, 0xa1a7, 0xa1d0, 0xa402, 0xa4cf, 0xa4d0, 0xa516, 0xa519, 0xa675, 0xa671, 0xa691, 0xa672, 0xa68e, 0xa66d, 0xa688, 0xa673, /* 0x30 */ 0x10bb, 0xa681, 0xa676, 0xa67b, 0xa67f, 0xa690, 0xa678, 0xad4b, 0xad48, 0xad5b, 0xad51, 0xad3d, 0xad40, 0xad46, 0xad4d, 0xad3b, 0xad4a, 0xad41, 0xad3e, 0xad4e, 0xb0ac, 0xb0e6, 0xb0e9, 0xb129, 0x1221, 0xb133, 0xb12e, 0xb11e, 0x121f, 0xe3c5, 0xb122, 0xb127, 0xb2e7, 0xb30b, 0xb466, 0xb6ad, 0xb6ae, 0x3038, 0xb72b, 0xb72a, 0xb82c, 0xb82d, 0x1391, 0x1396, 0xb98f, 0xb993, 0xbac6, 0xbac5, 0xbd15, 0xbd13, 0xbdb1, 0xbda9, 0x31ce, 0xbfa8, 0xbfab, 0xbfbe, 0xbfac, 0xbfa9, 0xbfa6, 0xbfc1, 0xc1cc, 0xc1d1, 0xc1d3, 0xc1e4, 0xc1cb, 0xc1e1, 0xc1d2, 0xc1e3, 0xc1cf, 0xc1d0, 0xc1e5, 0xc20e, 0xc7cc, 0xc7ca, 0xc7cb, 0xc95c, 0xc961, 0xc95d, 0xc959, 0xcb77, 0xd184, 0x3b41, 0x3bfd, 0x3c1a, 0x3c63, 0x3db6, 0x3db2, 0x3de9, 0x3de7, 0x3dd6, 0x3e30, 0x3dec, 0x3ddd, 0x3de8, /* 0x31 */ 0x3db0, 0x3db5, 0x3de1, 0x3f98, 0x3f99, 0x00bc, 0x4093, 0x40e5, 0x00d8, 0x4260, 0x425e, 0x00f4, 0x437b, 0x43f1, 0x43f3, 0x457f, 0xe238, 0x4657, 0x4658, 0x4839, 0x48a7, 0x4835, 0x4860, 0x4851, 0x4862, 0x4842, 0x483c, 0x4843, 0x48ab, 0x48a9, 0x48b4, 0x4879, 0x486a, 0x483b, 0x48aa, 0x4833, 0x4837, 0x4827, 0x48a8, 0x4870, 0x482f, 0x4836, 0x48b5, 0x4830, 0x483a, 0x4838, 0x48b1, 0x48ac, 0x482e, 0x4875, 0x48b0, 0x4cf7, 0x4d00, 0x4cf1, 0x4cf3, 0x4e60, 0x4e61, 0x4e32, 0x4e2d, 0x4e4a, 0x4e2a, 0x5067, 0x50a2, 0x50a3, 0x509e, 0x50a4, 0x5144, 0x5132, 0x529b, 0x5298, 0x5299, 0x529a, 0x5266, 0x5262, 0x526b, 0x8062, 0x5267, 0x553b, 0x5523, 0x5529, 0x567e, 0x56f3, 0x0385, 0x56f5, 0x0383, 0x5780, 0x577e, 0x577c, 0x577f, 0x577d, 0x5781, 0x5925, 0x5929, 0x5917, /* 0x32 */ 0x5963, 0x5967, 0x5965, 0x592a, 0x5968, 0x5926, 0x5964, 0x591b, 0x5962, 0x5969, 0x5afe, 0x5b44, 0x5b42, 0x5bb7, 0x5bd2, 0x5bd4, 0x5bd7, 0x5bdc, 0x5bd1, 0x5bd5, 0x5bcd, 0x5bd8, 0x5c9a, 0x5d42, 0x5d35, 0x5d58, 0x5d34, 0x5d3c, 0x5d3b, 0x5d3e, 0x5d3d, 0x5d5a, 0x5d41, 0x5d38, 0x5d45, 0x5d33, 0x5e26, 0x04ba, 0x5ef7, 0x5eef, 0x5ef0, 0x5eee, 0x5f9d, 0x6006, 0x6011, 0x6008, 0x6002, 0x600a, 0x6007, 0x6191, 0x618e, 0x6185, 0x61e8, 0x6217, 0x61d4, 0x0569, 0x61c4, 0x61d5, 0x0545, 0x61d8, 0x6180, 0x61de, 0x6242, 0x64c7, 0x64bf, 0x668d, 0x6689, 0x6690, 0x669a, 0x66c8, 0x6692, 0x66a1, 0x6684, 0x6a57, 0x6a47, 0x6a77, 0x6a3a, 0x6a50, 0x6a42, 0x6a43, 0x6aa3, 0x6b77, 0x6cb2, 0x6ce2, 0x6cbd, 0x6e74, 0x6f82, 0x6fb8, 0x076c, 0x6fba, 0x6fb9, 0x6fbb, 0x6f87, 0xe2e4, /* 0x33 */ 0x6f83, 0x6fb7, 0x3b43, 0x73ce, 0x73ba, 0x7473, 0x7509, 0x750a, 0x750b, 0x7507, 0x7505, 0x750e, 0x7597, 0x7677, 0x767b, 0x767a, 0x7674, 0x7679, 0x7886, 0x78f5, 0x78a5, 0x789d, 0x78be, 0x7896, 0x78e1, 0x78a4, 0x78a1, 0x78f6, 0x0904, 0x788d, 0x788b, 0x7878, 0x7898, 0x790a, 0x7d5d, 0x7d27, 0x7d5f, 0x80c0, 0x80c1, 0x816d, 0x815e, 0x818a, 0x8162, 0x8164, 0x0a3a, 0x82c0, 0x82ca, 0x82d1, 0x0a79, 0x82c7, 0x82ce, 0x2309, 0x82c5, 0x8436, 0x8457, 0x8477, 0x85f6, 0x85f7, 0x8655, 0x8644, 0x863e, 0x8642, 0x8652, 0x86e1, 0x8708, 0x8768, 0x8767, 0x0b5d, 0xe337, 0x887e, 0x8893, 0x8879, 0x8881, 0x887d, 0x887b, 0x8894, 0x0b8a, 0x8a66, 0x8ad9, 0x8ae0, 0xe33e, 0x8b5f, 0x8c5f, 0x8c5e, 0x8c68, 0x0c27, 0x8c88, 0x8c6a, 0x8c6c, 0x8c66, 0x8c67, 0x8c89, 0x8c60, 0x8c85, /* 0x34 */ 0x3e2a, 0x8e68, 0x8eb9, 0x8eba, 0x8ebe, 0x8f6f, 0x8f80, 0x8f74, 0x8f81, 0x8f7a, 0x8f9c, 0x8f73, 0x8f82, 0x8f7f, 0x8fa7, 0x8f79, 0x8f78, 0x8f7d, 0x8fa8, 0x8f7c, 0x9168, 0x914e, 0x929e, 0x0d46, 0x0d40, 0x9298, 0x0d3f, 0x9285, 0x929c, 0x92c5, 0x929a, 0x9468, 0x9465, 0x9467, 0x9461, 0x9460, 0x0d9d, 0x0dcb, 0x957b, 0x0de1, 0x9619, 0x960e, 0x9631, 0x9612, 0x9610, 0x9615, 0x963f, 0x961d, 0x961e, 0x994d, 0x9948, 0x9945, 0x9942, 0x9949, 0x994a, 0x9947, 0x0e7f, 0x994c, 0x9acd, 0x9ad5, 0x9ac4, 0x9aca, 0x9ac3, 0x0f46, 0x9d29, 0x9db4, 0x9e6d, 0x9e66, 0x9e6a, 0x9f15, 0x9fd3, 0x9fec, 0xa055, 0x101a, 0xa1d6, 0xa1d8, 0xa251, 0xa1e0, 0xa203, 0xa204, 0xa1da, 0xa1ea, 0xa202, 0xa1d3, 0xa1e4, 0xa1e5, 0xa43b, 0xa466, 0xa52c, 0xa521, 0xa526, 0xa5d4, 0xa5d5, 0xa5d9, /* 0x35 */ 0xa6d5, 0xa6eb, 0xa6c5, 0x10d3, 0xa727, 0xa6f0, 0xa6b9, 0xa718, 0xa6ee, 0x10d0, 0xa6b7, 0xa6bb, 0xa6ef, 0xa6b8, 0xa6df, 0xa6da, 0xa6e3, 0xa6c9, 0xa6ec, 0xaca4, 0x118e, 0xaca3, 0xad5e, 0xad61, 0xad62, 0xad63, 0xad8e, 0xad69, 0xad6b, 0xad85, 0xad8d, 0xad64, 0xad6d, 0xb14c, 0xb149, 0xb147, 0xb148, 0xb142, 0xb145, 0xb15b, 0xb15d, 0xb146, 0xb313, 0xb31a, 0xb30e, 0xb30f, 0xb31b, 0xb312, 0xb3c3, 0xb3be, 0xb3bd, 0xb479, 0xb47c, 0x12c3, 0x12b6, 0xb480, 0xb475, 0xb49b, 0x2f2f, 0xb474, 0x12c0, 0x12b8, 0x5b41, 0x5f94, 0xb730, 0xb7a7, 0xb7a5, 0xb7a4, 0xb83a, 0xb95b, 0xb99f, 0xb9a8, 0xb9b3, 0xb9a1, 0xb9a7, 0xb9b2, 0xb99d, 0xb9a3, 0xb9a2, 0xbaef, 0xbad9, 0x13d9, 0xbad5, 0xbadd, 0xbada, 0xbaee, 0xbad7, 0xbd1a, 0xbd19, 0xbd18, 0xbdb3, 0xbdbf, 0xbdbb, 0xbdc0, /* 0x36 */ 0xbdb9, 0xbdb8, 0xbdd5, 0xbf11, 0xbf10, 0xbfc3, 0xbfc2, 0xbfe9, 0xbfcd, 0xbfe5, 0xbfca, 0xbfc7, 0xbfe8, 0xc1f1, 0xc20c, 0xc1ef, 0xc1ee, 0xc1f3, 0xc20d, 0xc1f6, 0xc1f0, 0x14ec, 0xc2f5, 0xc2f4, 0xc2f8, 0xc2fe, 0xc411, 0xc422, 0xc442, 0xc75c, 0xc75a, 0xc75d, 0xc7d1, 0xc7d0, 0xc975, 0xc97b, 0xca89, 0xcf4d, 0xd189, 0xd192, 0xd18c, 0xd188, 0xd367, 0xd368, 0x3e21, 0x3df2, 0x3e09, 0x3df8, 0x3df0, 0x3df3, 0x3df5, 0x3dfb, 0x3df7, 0x3def, 0x3e0b, 0x3fa2, 0x40f5, 0x40f3, 0x40f4, 0x40f2, 0x4198, 0x4268, 0x4280, 0x4285, 0x428e, 0x428f, 0x3df4, 0x4286, 0x42a4, 0x4386, 0x4389, 0x4387, 0x4385, 0x1adc, 0x4388, 0x45ff, 0x4666, 0x01cc, 0x48c3, 0x01a2, 0x48c4, 0x493b, 0x48e7, 0x48f8, 0x48fb, 0x01b6, 0x48be, 0x48c6, 0x01c5, 0x01c6, 0x48fc, 0x48c0, 0x4933, 0x48c9, /* 0x37 */ 0x48fe, 0x48da, 0x48cc, 0x48bb, 0x48fd, 0x48df, 0x48cd, 0x48c2, 0x48c8, 0x4932, 0x492d, 0x48d2, 0x4931, 0x48d3, 0x492e, 0x48cf, 0x4cff, 0x4d09, 0x4cfc, 0x4e72, 0x4eaa, 0x4eab, 0x4ea7, 0x4e7b, 0x4e76, 0x4ea8, 0x4eac, 0x0283, 0x1b21, 0x50aa, 0x4503, 0x50ac, 0x50ad, 0x50ab, 0x5150, 0x5158, 0x52dd, 0x02f8, 0x52ae, 0x52a2, 0x52ab, 0x52e3, 0x52af, 0x52e0, 0x52e4, 0x02f6, 0x52a7, 0x52aa, 0x52e2, 0x52e1, 0x52df, 0x52ad, 0x52e5, 0x52d1, 0x52ac, 0x52d5, 0x52a3, 0x529f, 0x5479, 0x5476, 0x5543, 0x553d, 0x5547, 0x5544, 0x553f, 0x555b, 0x567f, 0x579a, 0x579c, 0x039b, 0x581e, 0x5988, 0x596a, 0x5976, 0x5972, 0x5970, 0x597e, 0x596c, 0x596f, 0x5975, 0x5977, 0x5978, 0x598a, 0x5979, 0x5994, 0x5b01, 0x5c05, 0x5bf1, 0x5bee, 0x5bef, 0x5c04, 0x1c3f, 0x5bfa, 0x5c07, /* 0x38 */ 0x5bf4, 0x5bf5, 0x5c9c, 0x5d6d, 0x5d69, 0x5d66, 0x5d62, 0x5d46, 0x048d, 0x5d65, 0x5d5d, 0x5d5e, 0x5d5f, 0x5e8e, 0x5f02, 0x5f06, 0x5f04, 0x5f03, 0x5f62, 0x6027, 0x6021, 0x6020, 0x6024, 0x6029, 0x6031, 0x6023, 0x6022, 0x61dc, 0x624d, 0x61e5, 0x61d3, 0x61ee, 0x61e6, 0x0556, 0x6236, 0x6240, 0x633f, 0x623d, 0x6244, 0x055b, 0x625f, 0x6229, 0x6249, 0x628a, 0x622a, 0x6287, 0x624c, 0x6231, 0x6248, 0x622b, 0x623b, 0x6241, 0x61c9, 0x6234, 0x6253, 0x6235, 0x6247, 0x6238, 0x64d1, 0x64d2, 0x6551, 0x6555, 0x6552, 0x6553, 0x668f, 0x66f4, 0x6747, 0x670d, 0x671c, 0x66fb, 0x6719, 0x66f7, 0x66f9, 0x66f5, 0x66e9, 0x670a, 0x66ee, 0x670b, 0x66fd, 0x6706, 0x6702, 0x6716, 0x6718, 0x66f0, 0x69d4, 0x6a66, 0x6a6a, 0x6a75, 0x6a76, 0x6a80, 0x6a6d, 0x0696, 0x6a69, 0x6a67, /* 0x39 */ 0x6a68, 0x6a5d, 0x6ba4, 0x6bfe, 0x6bfd, 0x6cec, 0x6ce9, 0x6d21, 0x6ceb, 0x6ce7, 0x6cf2, 0x6d20, 0x6e7a, 0x702d, 0x702e, 0x6fca, 0x702f, 0x6fc8, 0x077e, 0x6fcb, 0x6fc3, 0x6f84, 0x6fd2, 0x6fc6, 0x0781, 0x6fcf, 0x6fd5, 0x6fd4, 0x6fdd, 0x702b, 0x70a3, 0x6fdb, 0x702c, 0x7013, 0x0835, 0x73d1, 0x73cc, 0x73d5, 0x73c9, 0x73cf, 0x73d2, 0x747b, 0x747c, 0x7523, 0x751d, 0x751c, 0x751e, 0x7522, 0x7524, 0x7520, 0x7518, 0x7521, 0x7688, 0x768a, 0x7694, 0x768f, 0x768e, 0x7690, 0x089b, 0x76a7, 0x7764, 0x0900, 0x7918, 0x7914, 0x791d, 0x7905, 0x78ff, 0x791b, 0x791a, 0x7919, 0x7903, 0x790e, 0x7947, 0x7904, 0x795a, 0x7907, 0x7920, 0x7d6a, 0x7d66, 0x7d7a, 0x7d65, 0x7daf, 0x80cd, 0x80cf, 0x80d1, 0x80ce, 0x815f, 0x8177, 0x8174, 0x8188, 0x8175, 0x8189, 0x8172, 0x82c6, /* 0x3a */ 0x82ea, 0x82e0, 0x8307, 0x82e6, 0x82e5, 0x82dd, 0x82e3, 0x82da, 0x84ae, 0x847e, 0x847d, 0x847f, 0x0ad3, 0x84d9, 0x85fa, 0x85fb, 0x864d, 0x8654, 0x8651, 0x8650, 0x8898, 0x8895, 0x889d, 0x88c1, 0x889a, 0x889b, 0x0b9f, 0x889c, 0x88d7, 0x88a4, 0x8896, 0x88a0, 0x8a31, 0x8ae9, 0x8b6e, 0x8c9a, 0x8ca5, 0x8c94, 0x8ca6, 0x8c99, 0x8c8b, 0x8c98, 0x8c91, 0x8c8c, 0x8ca1, 0x8ca3, 0x8cc6, 0x8e6f, 0x8e6d, 0x8e6a, 0x8e6c, 0x8e71, 0x8e6e, 0x8edf, 0x8fac, 0x8faa, 0x0cb1, 0x8fb5, 0x8fad, 0x8fb2, 0x8fb3, 0x8fab, 0x8fb6, 0x8fc7, 0x8fc6, 0x916c, 0x9170, 0x92b3, 0x0d4b, 0x948c, 0x9481, 0x9483, 0x947d, 0x9485, 0x9490, 0x94a2, 0x948d, 0x948f, 0x947e, 0x948a, 0x947f, 0x9476, 0x9487, 0x9478, 0x9580, 0x9582, 0x9581, 0x9583, 0x965a, 0x9634, 0x962c, 0x962a, 0x9640, 0x962d, /* 0x3b */ 0x9633, 0x962b, 0x964b, 0x283f, 0x963c, 0x995a, 0x9977, 0x9960, 0x9afa, 0x9af9, 0x9afc, 0x0ed6, 0x9af5, 0x9ae8, 0x9b09, 0x9ae7, 0x9ae6, 0x9ae9, 0x9d32, 0x9d2c, 0x9dbd, 0x9dbc, 0x9e7a, 0x9e7e, 0x9e79, 0x0f89, 0x9f23, 0x9f30, 0x9f28, 0x9fd4, 0xa5ce, 0x9ff1, 0x9ff0, 0xa060, 0xa065, 0xa1a8, 0xa20a, 0xa21b, 0xa212, 0xa207, 0xa24f, 0xa20e, 0xa252, 0xa216, 0x1000, 0xa253, 0xa254, 0xe384, 0xa256, 0xa46d, 0xa472, 0xa52f, 0xa72a, 0x10dc, 0xa763, 0xa784, 0xa7af, 0xa745, 0xa770, 0xa756, 0xa716, 0xa73d, 0xa738, 0xa76f, 0xa777, 0xa72e, 0xa731, 0xa74c, 0xa75f, 0xa775, 0xa739, 0xa73a, 0xa72c, 0xa72d, 0xa73f, 0xa72f, 0xa730, 0xa73e, 0x2ad0, 0x1190, 0xacb2, 0xadb7, 0xad8f, 0x11b1, 0xad96, 0xad9e, 0xad97, 0xad95, 0xada5, 0xad98, 0x2be7, 0xada3, 0xad9a, 0xadad, /* 0x3c */ 0xada6, 0xadb6, 0xad99, 0xadaf, 0xadac, 0x11aa, 0xad9f, 0xad94, 0xb0eb, 0xb16f, 0xb16d, 0xb17e, 0xb16c, 0xb161, 0xb163, 0xb16b, 0xb15e, 0xb13e, 0xb164, 0xb1ad, 0x127d, 0xb320, 0xb3d1, 0xb3d5, 0xb4ae, 0xb4af, 0xb49f, 0xb4a8, 0xb4ca, 0xb6e1, 0xb739, 0xb738, 0xb73b, 0xb7ad, 0xb7b5, 0xb7af, 0xb7b1, 0xb7ae, 0xb7b4, 0xb7b0, 0xb84b, 0xb851, 0xb84c, 0x1369, 0xb860, 0xb9be, 0xb9b9, 0xb9b7, 0xb9b6, 0x13a1, 0xb9bd, 0xb9b8, 0xb9c1, 0xbaf7, 0xbaf3, 0xbaf4, 0xbafb, 0xbafd, 0xbaf5, 0x13e7, 0xbafa, 0xbb14, 0x13ec, 0xbaf2, 0xbafc, 0xbb00, 0x13df, 0xbd2b, 0xbd29, 0xbd2e, 0x1433, 0xbdd7, 0xbddb, 0xbdd9, 0xbdd8, 0xbde6, 0xbdd6, 0xbdd1, 0xbde7, 0xbdd0, 0xbddc, 0xbfed, 0xc01a, 0xc019, 0xc016, 0xbfec, 0xbfef, 0xbfee, 0xbff4, 0xc02f, 0xc230, 0xc219, 0xc218, 0xc211, /* 0x3d */ 0xc216, 0xc212, 0xc210, 0xc214, 0xc30c, 0xc30d, 0xc410, 0xc429, 0xc428, 0xc765, 0xc766, 0xc7de, 0xc7df, 0xc7e0, 0xc7d9, 0xc7db, 0xc7d8, 0xc7e3, 0xc7d7, 0xc9a6, 0xc9a7, 0xc9bf, 0xc9a8, 0xc99f, 0xc9a1, 0xc9a2, 0xc9ad, 0xc9a3, 0xc9a0, 0xcb83, 0xcb85, 0xcb82, 0xcb84, 0xccee, 0xcd5d, 0xce92, 0xcf55, 0xcf53, 0xe3fc, 0xcf51, 0xcf52, 0xcf50, 0xd09d, 0xd187, 0xd197, 0xd19b, 0xd19d, 0xd369, 0xd511, 0x17ee, 0xd77a, 0x1832, 0x6d44, 0x3bc6, 0x3e40, 0x3e2e, 0x3e68, 0x3e2d, 0x3e34, 0x3e32, 0x3e69, 0x3e31, 0x3e6a, 0x3e3e, 0x3e6f, 0x3e75, 0x3ff6, 0x4020, 0x4028, 0x4067, 0x40fb, 0x40fe, 0x40fc, 0x40fd, 0x40ff, 0x40fa, 0x42ac, 0x42af, 0x42b1, 0x00fc, 0x42bf, 0x42be, 0x42a7, 0x42aa, 0x4394, 0x4393, 0x4399, 0x012a, 0x43fa, 0x4456, 0x4522, 0x4591, 0x4592, 0x4608, /* 0x3e */ 0x4606, 0x48d6, 0x4937, 0x494b, 0x49ce, 0x49d0, 0x4939, 0x4964, 0x49cf, 0x4946, 0x4966, 0x4956, 0x4943, 0x494a, 0x4958, 0x4965, 0x495a, 0x495b, 0x4955, 0x4950, 0x494c, 0x49cd, 0x4951, 0x4947, 0x01d3, 0x4953, 0x4962, 0x49cc, 0x01d7, 0x497f, 0x494d, 0x4d0a, 0x4d0c, 0x4d0f, 0x4ebb, 0x4eb9, 0x4eeb, 0x4eae, 0x4ec1, 0x4eea, 0x4ebe, 0x4ebf, 0x4eba, 0x4eb7, 0x4eb3, 0x4ee9, 0x506e, 0x50af, 0x50b3, 0x50b2, 0x5168, 0x5169, 0x516a, 0x52de, 0x52eb, 0x5311, 0x52ed, 0x52e9, 0x52f7, 0x52f4, 0x52ea, 0x5312, 0x52e8, 0x5313, 0x548e, 0x5486, 0x5563, 0x5565, 0x5699, 0x57c2, 0x57ae, 0x57b0, 0x57ad, 0x59b4, 0x59d1, 0x59ad, 0x03f3, 0x59bd, 0x59b7, 0x59ab, 0x59af, 0x59c1, 0x59b5, 0x5c0f, 0x5c0e, 0x5c1c, 0x5c13, 0x5c0a, 0x5c1e, 0x5c14, 0x5c1a, 0x5ccb, 0x5d87, 0x5d93, /* 0x3f */ 0x0491, 0x5d84, 0x5d85, 0x5d92, 0x5d80, 0x5e2b, 0x5e63, 0x5f0a, 0x04c0, 0x5f66, 0x6034, 0x6033, 0x604d, 0x6289, 0x6257, 0x1e17, 0x624a, 0x0563, 0x6239, 0x623f, 0x6290, 0x628f, 0x62b2, 0x629f, 0x6295, 0x62a1, 0x629c, 0x628e, 0x62a0, 0x62ae, 0x6296, 0x62ca, 0x62ac, 0x0570, 0x62a6, 0x6297, 0x6293, 0x3eb6, 0x64d6, 0x64e0, 0x64d8, 0x6556, 0x676e, 0x677e, 0x6774, 0x6777, 0x6780, 0x677a, 0x676b, 0x675f, 0x6776, 0x67b0, 0x6763, 0x6a92, 0x6a82, 0x6a9d, 0x6a94, 0x6a83, 0x6a8b, 0x6a84, 0x6b57, 0x6b84, 0x6bb5, 0x6c09, 0x6ce6, 0x0702, 0x6d25, 0x6d51, 0x6e3e, 0xe2da, 0x6e85, 0x703f, 0x7042, 0x7038, 0x703a, 0x704e, 0x7045, 0x7039, 0x7037, 0x7044, 0xe2e7, 0x70a4, 0x703d, 0x7041, 0x73df, 0x73de, 0x73ca, 0x73e9, 0x73e2, 0x73e0, 0x7489, 0x7487, 0x7532, 0x7533, /* 0x40 */ 0x75ac, 0x75f9, 0x760d, 0x76b9, 0x795e, 0x796a, 0x0935, 0x7981, 0x7969, 0x79ac, 0x7980, 0x7975, 0x7971, 0x7976, 0x796f, 0x7db6, 0x7e03, 0x7dbf, 0x7e01, 0x7db2, 0x7dc4, 0x80db, 0x80dc, 0x80d8, 0xd172, 0x81b5, 0x81a8, 0x818f, 0x819e, 0x818e, 0x82de, 0x82e2, 0x8320, 0x831d, 0x831a, 0x8319, 0x832b, 0x8318, 0x8310, 0x830e, 0x8324, 0x831f, 0x8313, 0x8335, 0x8483, 0x0ae0, 0x84d7, 0x8602, 0x8603, 0x865c, 0x865f, 0x86c7, 0x879a, 0x8797, 0x87a3, 0x88f7, 0x88c6, 0x88cc, 0x88d6, 0x88cd, 0x88f9, 0x88d9, 0x88d8, 0x0b9a, 0x88d1, 0x88ce, 0x88d5, 0x0ba3, 0x88d4, 0x88f8, 0x8a7a, 0x8a79, 0x8a7f, 0x8af3, 0x8af5, 0x8af6, 0x8af4, 0x8af7, 0x0c05, 0x8b79, 0x8c9c, 0x8cdf, 0x8cf5, 0x8cff, 0x8cd1, 0x8cda, 0x8ccf, 0x8ccd, 0x8cde, 0x8cd8, 0x75ad, 0x8ce0, 0x8cfe, 0x8c9e, /* 0x41 */ 0x8e75, 0x8e73, 0x8e72, 0x8ed8, 0x8fd0, 0x8fd6, 0x8fd7, 0x8fca, 0x8fcd, 0x918a, 0x9189, 0x918b, 0x92d3, 0x92da, 0x92ce, 0x92d2, 0x0d5e, 0x92d4, 0x92d7, 0x92d5, 0x92fb, 0x92cd, 0x92fa, 0x92d6, 0x0da6, 0x949b, 0x949e, 0x949d, 0x94a4, 0x949f, 0x94a5, 0x94a8, 0x958f, 0x958c, 0x9595, 0x9660, 0x9655, 0x965c, 0x966f, 0x9651, 0x9661, 0x96a7, 0x965e, 0x9662, 0x9654, 0x966e, 0x9652, 0x9658, 0x966d, 0x965f, 0x966c, 0x9650, 0x965d, 0x968e, 0x9972, 0x9978, 0x9975, 0x9976, 0x997c, 0x997e, 0x997d, 0x9b15, 0x9b14, 0x9b1d, 0x9b1c, 0x9b23, 0x9b57, 0x9dc8, 0x0f5d, 0x9dc9, 0x9dc5, 0x9e87, 0x9e8a, 0x9e94, 0x9f39, 0x9f40, 0x9f3e, 0x9f38, 0x9fd6, 0x0fb8, 0xa077, 0xa078, 0xa07d, 0xa1dd, 0xa25e, 0xa277, 0xa2d4, 0xa266, 0xa25f, 0xa273, 0xa272, 0xa297, 0xa25a, 0xa296, /* 0x42 */ 0xa25d, 0xa265, 0xa270, 0xa275, 0xa274, 0xa25c, 0xa260, 0x1034, 0xa26d, 0xa441, 0xa53c, 0xa53e, 0x106f, 0xa549, 0xa6e4, 0xa80c, 0xa815, 0xa80e, 0xa7d4, 0xa7c7, 0xa814, 0xa7db, 0xa85f, 0xa7ed, 0xa809, 0xa7cf, 0xa7ff, 0xa81a, 0xa7f5, 0xa7ee, 0xa7e5, 0xa80d, 0xa7df, 0xa7ec, 0xa7d7, 0xa82c, 0xa7cd, 0xa7e3, 0xa800, 0xa7eb, 0xa7fd, 0xa80f, 0xa82d, 0xa850, 0xa7fe, 0xa7c4, 0xa7e1, 0xa7f9, 0xacbb, 0xacbc, 0x1194, 0x1193, 0xacba, 0xadd0, 0xadd6, 0xadce, 0xade1, 0xadd5, 0xadcf, 0xadd3, 0x2c14, 0xadd4, 0xb0b5, 0xb190, 0xb1a1, 0xb181, 0xb185, 0xb16e, 0xb188, 0xb182, 0xb186, 0xb18f, 0xb189, 0xb180, 0xb184, 0x2dd1, 0xb329, 0xb32b, 0xb32a, 0xb330, 0xb3e2, 0xb3e3, 0xb3e1, 0xb4d5, 0xb4c4, 0xb4c9, 0xb4e0, 0xb4df, 0xb4cb, 0xb4dd, 0xb4e8, 0xb4d4, 0xb51c, 0xb6b5, /* 0x43 */ 0xb6b6, 0xb6e5, 0xb745, 0xb749, 0xb740, 0xb746, 0xb744, 0xb74a, 0xb7c9, 0xb7c4, 0xb7c2, 0xb868, 0x30cb, 0xb882, 0xb86b, 0xb867, 0xb86c, 0xb86d, 0xb871, 0x1392, 0xb9d7, 0xb9d2, 0xb9d9, 0x13aa, 0xb9bc, 0xb9dd, 0xb9d6, 0x13a7, 0xb9d8, 0xbb20, 0xbb16, 0xbb18, 0xbb15, 0xbb19, 0xbb27, 0xbb50, 0xbb1d, 0xbb2c, 0xbb1c, 0xbb29, 0xbb2b, 0xbb24, 0x13ef, 0xbb28, 0xbd39, 0xbdf2, 0xbdf0, 0x31ed, 0xbded, 0xbdef, 0xbdea, 0xbe01, 0xbfbc, 0xc05c, 0xc05b, 0xc05a, 0xc026, 0xc243, 0xc233, 0xc23a, 0xc237, 0xc236, 0xc23c, 0xc234, 0xc24a, 0xc23b, 0xc235, 0xc23d, 0xc240, 0xc23e, 0xc217, 0xc326, 0xc324, 0xc310, 0xc336, 0xc325, 0x1522, 0xc466, 0xc77f, 0xc77a, 0xc7fb, 0xc7fd, 0xc7fc, 0xc7fa, 0xc9d6, 0xc9d2, 0xc9c8, 0xc9c2, 0xc9c7, 0xc9cd, 0xc9c1, 0xc9c6, 0xc9cc, 0xcaa1, /* 0x44 */ 0xcb95, 0xcb94, 0xcb97, 0xcb96, 0xcb93, 0xcba1, 0xcd09, 0xcd08, 0xcd67, 0xcd65, 0xcd62, 0xcd61, 0xce97, 0xcf01, 0xcf19, 0xcf18, 0xcf5c, 0xcf67, 0xcf6c, 0x16b5, 0xe3fd, 0xcf66, 0xcf61, 0xcf6e, 0xcf5d, 0xcf5a, 0xd0a2, 0xd0a9, 0xd0a5, 0xd0a6, 0xd0b2, 0xd0a3, 0xd1ac, 0xd1aa, 0xd1af, 0xd1ab, 0xd1b1, 0xd1c6, 0xd1ad, 0xd1b9, 0xd370, 0x1775, 0xd70c, 0xd781, 0xd783, 0xd77e, 0xd851, 0xda99, 0xda94, 0xda95, 0xddfe, 0xdf18, 0x3c05, 0x3e72, 0x0082, 0x3e99, 0x3fad, 0x4106, 0x42c2, 0x42cb, 0x42d5, 0x42d2, 0x42cc, 0x42d7, 0x42c5, 0x42ca, 0x1aec, 0x43a2, 0x43a3, 0x43a1, 0x1ae8, 0x43a6, 0x43a4, 0x43ff, 0x4400, 0x0135, 0x4506, 0x4525, 0x459f, 0x467f, 0x49ea, 0x49eb, 0x49de, 0x4a18, 0x49e0, 0x49e8, 0x49df, 0x49f1, 0x49ec, 0x4a1a, 0x49e6, 0x49e1, 0x4a5d, 0x3b77, /* 0x45 */ 0x4a1e, 0x01f0, 0x4a80, 0x4d17, 0x4f1d, 0x4ef7, 0x4eef, 0x4eee, 0x4eed, 0x4ef5, 0x4f1e, 0x50bd, 0x92ff, 0x50be, 0x516d, 0x5176, 0x534c, 0x5319, 0x5348, 0x531e, 0x534a, 0x5349, 0x5326, 0x5495, 0x5585, 0x557e, 0x5597, 0x557d, 0x5642, 0x569e, 0x570c, 0x570b, 0x570e, 0x57cf, 0x59d8, 0x59e0, 0x59e8, 0x59e9, 0x59e2, 0x59e1, 0x59da, 0x59e3, 0x59d9, 0x59f0, 0x59e7, 0x59e4, 0x5c23, 0x5c31, 0x5c33, 0x5c0c, 0xa4e0, 0x5c26, 0x5c24, 0x5c32, 0x5c27, 0x5c21, 0x5c30, 0x5ca2, 0x5ccc, 0x5d96, 0xe28f, 0x5d98, 0x5d9c, 0x5d9b, 0x5e6b, 0x5f12, 0x5f14, 0x605a, 0x6054, 0x6051, 0x605e, 0x6058, 0x04f0, 0x6059, 0x629a, 0x62f2, 0x62ad, 0x6320, 0x62f1, 0x62f0, 0x62f3, 0x62f4, 0x62e9, 0x62fe, 0x632e, 0x62e8, 0x62e7, 0x62ff, 0x62f5, 0x64e5, 0x64e7, 0x64e6, 0x64e9, 0x6558, /* 0x46 */ 0x676c, 0x67d9, 0x063e, 0x67cb, 0x0639, 0x67be, 0x67b5, 0x67d1, 0x67c2, 0x67b6, 0x67d3, 0xe2c2, 0x69da, 0x06a2, 0x6aae, 0x06a1, 0x6aac, 0x6aa9, 0x6aba, 0x6aa7, 0x6ab3, 0x6abd, 0x6ab1, 0x6c0e, 0x6c11, 0x6c0f, 0x6d52, 0x6d6a, 0x6d54, 0x6d55, 0x6d53, 0x6d57, 0xe2d0, 0x6d5b, 0x6d58, 0x6d59, 0x073b, 0x70b8, 0x70b5, 0x70bf, 0x70c1, 0x70bb, 0x07b7, 0x70c3, 0x70ad, 0x70a8, 0x70ae, 0x70aa, 0x70d0, 0x70b1, 0x70bc, 0x70b7, 0x70b0, 0x70fa, 0x70fb, 0x70b9, 0x7407, 0x73fc, 0x73ff, 0x73f2, 0x73f8, 0x73f4, 0x0857, 0x0870, 0x75ae, 0x760f, 0x7610, 0xd5c1, 0x76c7, 0x76c6, 0x76ce, 0x08a7, 0x76dc, 0x79d5, 0x79d3, 0x7a20, 0x79e2, 0x79f1, 0x79db, 0x79ea, 0x79eb, 0x79e1, 0x79ff, 0x79d6, 0x79e0, 0x79d7, 0x79e5, 0x0954, 0x7e1b, 0x7e10, 0x7e0f, 0x7e0e, 0x7e39, 0x7e0a, /* 0x47 */ 0x7e14, 0x7e0c, 0x8023, 0x805a, 0x80e2, 0x8193, 0x81b0, 0x81ab, 0x81bd, 0x81b1, 0x818d, 0x81ad, 0x81aa, 0x81ac, 0x81bc, 0x81c9, 0x8347, 0x8362, 0x8340, 0x8344, 0x833f, 0x8343, 0x833d, 0x8360, 0x835f, 0x833a, 0x8342, 0x835e, 0x835d, 0x84bc, 0x84e0, 0x84ee, 0x84eb, 0x850d, 0x8609, 0x860c, 0x8669, 0x8674, 0x8667, 0x0b31, 0x2427, 0x87ad, 0x88ff, 0x8916, 0x8908, 0x8909, 0x8900, 0x88fc, 0x8913, 0x8914, 0x890a, 0xd33e, 0x8929, 0x8917, 0x893b, 0x88fb, 0x0bbf, 0x890e, 0x0be4, 0x8b08, 0x8d1b, 0x8d1a, 0x8d19, 0x8d02, 0x0c4a, 0x8d17, 0x8d07, 0x8d13, 0x8d09, 0x8d0a, 0x8d12, 0x8daa, 0x8d38, 0x8e7b, 0x8e7c, 0x8e7a, 0x8eea, 0x8eeb, 0x8eef, 0x8ef0, 0x9009, 0x9002, 0x9001, 0x902b, 0x9007, 0x0ccf, 0x9028, 0x8ffb, 0x902a, 0x8ffe, 0x9004, 0x9029, 0x900a, 0x268c, /* 0x48 */ 0x91c2, 0x2691, 0x91a6, 0x0d14, 0x6ac6, 0x5707, 0x930a, 0x92fd, 0x9306, 0x930d, 0x9309, 0x930b, 0x9300, 0x9305, 0x933d, 0x94d5, 0x94bf, 0x94ba, 0x94c7, 0x9598, 0x959a, 0x0e0d, 0x96a4, 0x969c, 0x969d, 0x96a2, 0x9696, 0x9695, 0x96a5, 0x96aa, 0x96ad, 0x969a, 0x96a3, 0x9697, 0x9690, 0x96af, 0x968d, 0x0e01, 0x96a8, 0x96ee, 0x99a3, 0x9999, 0x99a1, 0x999c, 0x99a4, 0x99cb, 0x9b56, 0x9b48, 0x9b59, 0x9b4a, 0x9b5c, 0x0ef1, 0x9b4f, 0x9b4d, 0x9b5d, 0x9d3a, 0x9de3, 0x9de1, 0x9dde, 0x9e97, 0x9e9a, 0x9f48, 0x9f4a, 0x9f4c, 0x9f4e, 0x9f4f, 0x9f4b, 0x9f4d, 0x9f47, 0x9f51, 0x9fda, 0x9ff9, 0x9ffc, 0x9ffb, 0x9ffd, 0x9ff8, 0x9ffa, 0xa08a, 0xa08e, 0xa088, 0xa089, 0xa08d, 0xa090, 0xe37e, 0xa21c, 0xa2ab, 0xa2a4, 0xa2a8, 0xa2ad, 0xa29f, 0xa29a, 0xa2b0, 0xa2a5, 0xa2d5, /* 0x49 */ 0xa2a2, 0xa2b2, 0xa29d, 0xa2a1, 0xa415, 0xa442, 0xa473, 0xa484, 0xa4dd, 0xa55c, 0xa54c, 0x1076, 0xa54b, 0xa767, 0xa8a8, 0xa87f, 0xa88d, 0xa88b, 0xa8f7, 0xa8a9, 0xa8f4, 0xa89a, 0xa88c, 0xa895, 0xa87e, 0xa877, 0x110a, 0x1103, 0xa871, 0xa8fd, 0xa888, 0xa899, 0xa86d, 0xa8d4, 0xa891, 0xa87d, 0xa863, 0xa875, 0xa8f9, 0xa88e, 0xa874, 0xa8d9, 0xa866, 0xa8fa, 0xa8f5, 0x2b60, 0xacc1, 0xacc9, 0xae03, 0xae2c, 0xae34, 0xae17, 0xae09, 0xae04, 0xae06, 0xae1a, 0xae0e, 0xae27, 0xae05, 0xae07, 0xae19, 0xae14, 0xae0c, 0xae1d, 0xae22, 0xae23, 0xb0bb, 0xb0bc, 0xb0ba, 0xb1a9, 0xb1b5, 0xb1ac, 0xb1aa, 0xb1af, 0xb1b7, 0x1235, 0x1236, 0xb33d, 0xb345, 0xb348, 0xb33c, 0xb33e, 0xb3ec, 0xb3ed, 0xb3e9, 0xb50a, 0xb50b, 0xb4f8, 0xb504, 0xb4f6, 0xb4f9, 0xb753, 0xb752, 0xb760, /* 0x4a */ 0xb763, 0xb7ce, 0xb7cd, 0xb7d0, 0xb7cc, 0xb887, 0xb88d, 0xb89d, 0x1373, 0xb963, 0xb9f4, 0xb9f1, 0xb9ff, 0xb9f5, 0xb9fc, 0xb9f2, 0xb9f6, 0x13b1, 0xb9fa, 0x13af, 0xbb2e, 0xbb45, 0xbb43, 0xbb51, 0xbb4c, 0xbb73, 0xbb47, 0xbb4b, 0xbb4f, 0x13f4, 0xbb44, 0xbb4d, 0xbb4e, 0xbb4a, 0xbb41, 0xbb52, 0xbb9f, 0xbb54, 0xbb59, 0xbba2, 0xbd4b, 0xbd48, 0xbe0d, 0xbe1f, 0xbe08, 0xbe0e, 0xbe1d, 0xbe04, 0xbf18, 0xbf1b, 0xc066, 0xc062, 0xc083, 0xc067, 0xc262, 0xc24f, 0xc24e, 0xc267, 0xc253, 0xc24d, 0xc24c, 0xc268, 0xc251, 0x14dc, 0xc258, 0xc25b, 0xc250, 0xc26a, 0xc339, 0xc338, 0xc482, 0xc484, 0xc486, 0xc780, 0xc786, 0xc825, 0xc811, 0x1599, 0xc80e, 0xc815, 0xc80f, 0xc818, 0xc80d, 0xc813, 0xc816, 0xc819, 0xca08, 0xc9f7, 0xc9fb, 0xc9fc, 0xcab4, 0xcabe, 0xcac1, 0xcba6, /* 0x4b */ 0xcba5, 0xcba2, 0xcba4, 0xcd12, 0xcd0e, 0xcd7a, 0xcd78, 0xcd7d, 0xcd7e, 0xcd81, 0xcd83, 0xcd80, 0xcd82, 0xce9b, 0xce99, 0xce9c, 0xce9a, 0xcea1, 0xcf1a, 0xcf1c, 0xcf8a, 0xcf79, 0xcf73, 0xcf75, 0xcf7c, 0xcf78, 0xcf60, 0xcf83, 0xcf70, 0x16b6, 0x16bd, 0xcf87, 0xcf84, 0xcf7b, 0xcf7e, 0xcf74, 0xd0b9, 0xd0b8, 0xd0b7, 0xd0b5, 0xd1cc, 0xd1ce, 0xd1d1, 0x3504, 0xd1cb, 0x359b, 0xd37e, 0xd37a, 0xd377, 0xd38c, 0xd3e1, 0xd520, 0xd51e, 0xd5c2, 0xd60f, 0xd600, 0x17f4, 0xd610, 0xd70d, 0xd70e, 0xd78e, 0xd78d, 0xd78a, 0xd78b, 0xd78c, 0xd78f, 0xd857, 0x1835, 0xd855, 0xd85b, 0xdaac, 0xdaa7, 0xdaa0, 0xda9e, 0x18aa, 0xdd8d, 0x191f, 0xde93, 0xde94, 0xde92, 0x3c81, 0x3ed6, 0x3ec3, 0x3ee4, 0x3ee2, 0x3f09, 0x3ebf, 0x3ec8, 0x3ec7, 0x3fb5, 0x3fb2, 0x410c, 0x410b, 0x410a, /* 0x4c */ 0x4105, 0x42d3, 0x42e6, 0x42e9, 0x42f0, 0x42ea, 0x42e7, 0x43b1, 0x43b3, 0x43b4, 0x43b0, 0x445c, 0x445d, 0x445e, 0x44c0, 0x45af, 0x0150, 0x4686, 0x4683, 0x4684, 0x4a5c, 0x4a70, 0x4a8c, 0x4a7b, 0x4a66, 0x4a79, 0x4a63, 0x4ac5, 0x4a6b, 0x4a6d, 0x4a72, 0x4a69, 0x4a75, 0x4a89, 0x4ac6, 0x4aa5, 0x3ee7, 0x4a6a, 0x4a97, 0x4f5a, 0x4f5c, 0x4f59, 0x4f24, 0x4f25, 0x4f30, 0x4f58, 0x4f31, 0x5076, 0x50c1, 0x5185, 0x517d, 0x5365, 0x5387, 0x5352, 0x5354, 0x538a, 0x5350, 0x5386, 0x534f, 0x5368, 0x549d, 0x55a0, 0x55ba, 0x55bd, 0x55b8, 0x56a6, 0x037b, 0x57de, 0x57d8, 0x57d1, 0x5a13, 0x0409, 0x5a0e, 0x5a1b, 0x5a3a, 0x0407, 0x5a1c, 0x5a12, 0x5a16, 0x5a1a, 0x4f48, 0x5c4b, 0x5c37, 0x5c36, 0x5c38, 0x5c3a, 0x5c49, 0x5c3c, 0x5c4a, 0x5db1, 0x5dc2, 0x5db5, 0x5dc4, 0x5db6, /* 0x4d */ 0x5f1e, 0x5f1f, 0x5faf, 0x606b, 0x606f, 0x6292, 0x62e4, 0x632c, 0x62ef, 0x1e84, 0x634f, 0x6352, 0x6350, 0x633a, 0x6337, 0x6347, 0x6364, 0x6340, 0x633c, 0x6345, 0x6341, 0x64f3, 0x05bb, 0x67c1, 0x67b4, 0x064b, 0x682a, 0x6822, 0x6829, 0x064d, 0x683e, 0x683c, 0x6830, 0x6ac7, 0x6ad5, 0x6ad6, 0x6ad3, 0x6ace, 0x6ac8, 0x6b5c, 0x6b5f, 0x6b62, 0x06c2, 0x6bbd, 0x6bbf, 0x6d5c, 0x6db6, 0x071a, 0x6d9d, 0x6d7f, 0x0712, 0x6d94, 0x6d81, 0x6e47, 0x6e46, 0x073c, 0x6e94, 0x7175, 0x711a, 0x712a, 0x7132, 0x7117, 0x7123, 0x7174, 0x07c3, 0x7176, 0x712e, 0x7125, 0x7120, 0x7171, 0x7116, 0x7170, 0x712c, 0x712f, 0x711f, 0x7164, 0x07c0, 0x7408, 0x7414, 0x740a, 0x740b, 0x754f, 0x7559, 0x7554, 0x7551, 0x75b6, 0x76ec, 0x76ed, 0x76ea, 0x79ee, 0x7a5a, 0x7a73, 0x7a65, 0x7a61, /* 0x4e */ 0x7a55, 0x7a6b, 0x7a64, 0x7a5b, 0x7a4c, 0x7a6f, 0x7a84, 0x7a70, 0x7e5d, 0x7e57, 0x7e66, 0x7e53, 0x7e98, 0x7e97, 0x8028, 0x80eb, 0x80ea, 0x80e8, 0x80ec, 0x80ef, 0x81d1, 0x81ca, 0x229f, 0x81cf, 0x81cd, 0x81ce, 0x8370, 0x8367, 0x8373, 0x836d, 0x8376, 0x8379, 0x836a, 0x838b, 0x8372, 0x8371, 0x836e, 0x837a, 0x8516, 0x8539, 0x853b, 0x8610, 0x8696, 0x867b, 0x867c, 0x867d, 0x87be, 0x895c, 0x8938, 0x8939, 0x892e, 0x8934, 0x8932, 0x895b, 0x8933, 0x893c, 0x0be5, 0x8b0e, 0x8b0f, 0x8b10, 0x8b87, 0x8d5b, 0x8d53, 0x0c5f, 0x8d5c, 0x8d3f, 0x8d59, 0x8d4a, 0x8d44, 0x8d4c, 0x8d40, 0x8d5f, 0x8d5e, 0x8d4e, 0x8d54, 0x8d43, 0x8d87, 0x8e82, 0x8e85, 0x9031, 0x9047, 0x902e, 0x902f, 0x9048, 0x9034, 0x0d18, 0x409f, 0x9332, 0x9336, 0x9333, 0x9331, 0x9340, 0x9341, 0x94dd, /* 0x4f */ 0x94d2, 0x94d9, 0x0dad, 0x94df, 0x94db, 0x94d8, 0x94d3, 0x94de, 0x94e0, 0x94d4, 0x94d7, 0x94da, 0x95a7, 0x96fe, 0x96dd, 0x9740, 0x96e2, 0x0e1e, 0x96d6, 0x96de, 0x96ef, 0x0e27, 0x96eb, 0x96ea, 0x96e4, 0x96d1, 0x0e18, 0x96ec, 0x96fa, 0x96d9, 0x96f3, 0x96e1, 0x96dc, 0x96e5, 0x96df, 0x96d4, 0x0e20, 0x9705, 0x99d6, 0x99d5, 0x99d0, 0x99c8, 0x99c4, 0x99c9, 0x99cd, 0x99d2, 0x99cc, 0x99ca, 0x9ba0, 0x9b92, 0x0ef4, 0x0f02, 0x9b8b, 0x9ba1, 0x9b95, 0x9b88, 0x9b86, 0x9b8d, 0x9b85, 0x9b91, 0x9b89, 0x9ba2, 0x9df0, 0x9df3, 0x9df4, 0x9def, 0x9e06, 0x9ea2, 0x9f5e, 0x9f63, 0x9f60, 0x9f5b, 0x9f7b, 0x9f58, 0x9f59, 0x9f5d, 0xa005, 0xa006, 0xa002, 0xa003, 0xa004, 0xa0a2, 0xa0a7, 0xa0a6, 0xa0a4, 0xa0ac, 0xa0a9, 0xa2e7, 0xa301, 0xa2df, 0xa2d9, 0xa2e3, 0xa30f, 0xa41a, /* 0x50 */ 0xa445, 0xa448, 0xa47b, 0xa485, 0xa486, 0xa4fe, 0xa4ff, 0xa564, 0xa571, 0xa572, 0xa561, 0xa562, 0xa56c, 0xa560, 0xa55d, 0xa563, 0xa567, 0xa901, 0xa92a, 0xa930, 0xa906, 0xa97d, 0xa922, 0xa9b9, 0xa90a, 0xa910, 0xa88f, 0xa980, 0xa913, 0xa92e, 0xa918, 0xa917, 0xa91a, 0xa914, 0xa947, 0xa963, 0xa938, 0x1124, 0xa97f, 0xa921, 0xa937, 0xa931, 0xa91b, 0xa9a5, 0xaa6c, 0xacd3, 0xae88, 0xae6e, 0xae5c, 0xae74, 0xae54, 0xae83, 0x2c70, 0xae65, 0xae60, 0xae70, 0xae6f, 0xae6d, 0xae72, 0xae6c, 0xae76, 0xae75, 0xae59, 0xaec7, 0xb0c1, 0xb0f9, 0xb1e3, 0xb1e7, 0xb1d6, 0xb1cf, 0xb1da, 0xb1e9, 0xb1d2, 0xb355, 0xb34f, 0xb34d, 0xb351, 0xb356, 0xb3f9, 0xb3f8, 0xb406, 0xb403, 0xb409, 0xb3f7, 0xb3f5, 0xb547, 0xb545, 0xb53e, 0xb546, 0xb529, 0xb534, 0xb53f, 0xb544, 0xb535, /* 0x51 */ 0xb55a, 0xb52a, 0xb533, 0xb537, 0xb543, 0xb539, 0xb530, 0xb55d, 0xb532, 0xb527, 0xb6bd, 0xb6ba, 0xb6bc, 0xb6f1, 0xb6f0, 0xb761, 0xb75c, 0xb758, 0xb75d, 0xb7da, 0xb7d9, 0xb7dd, 0xb7dc, 0xb7de, 0x137d, 0xb8a0, 0xb8a2, 0xba0f, 0xba13, 0xba12, 0xba11, 0xba14, 0xba19, 0xba0e, 0xba17, 0xba21, 0xba20, 0xba16, 0xbb78, 0x3137, 0xbb87, 0xbb79, 0xbb80, 0xbb77, 0xbb81, 0xbb46, 0xbb7a, 0xbb9c, 0xbb83, 0xbb84, 0xbbad, 0xbb9d, 0xbb9e, 0xbd55, 0xbe36, 0xbe2b, 0xbe27, 0xbe46, 0xbe2c, 0xbe45, 0xbe33, 0xbe2d, 0xbe34, 0xbe22, 0x1464, 0xbf1f, 0xc0b3, 0xc08c, 0xc08f, 0xc0af, 0xc0ad, 0xc08e, 0xc0ac, 0xc0b0, 0xc0b1, 0xc0ae, 0xc099, 0xc1eb, 0xc274, 0xc275, 0xc28e, 0xc26d, 0xc270, 0xc28c, 0xc34f, 0xc351, 0xc358, 0xc34c, 0xc34e, 0xc415, 0xc4be, 0xc4db, 0xc4b3, 0xc4ae, /* 0x52 */ 0xc787, 0xc78a, 0xc788, 0xc78b, 0xc78c, 0xc844, 0xc82d, 0xc82a, 0xc831, 0xc82c, 0xc845, 0xc830, 0xc829, 0xc846, 0xc9f4, 0xca14, 0xca10, 0xca0f, 0xca12, 0xca0b, 0xca0c, 0xca0a, 0xca13, 0xca0e, 0xcad9, 0xcad0, 0x3403, 0xcbc1, 0xcbbf, 0xcbbd, 0xcbbc, 0xcbba, 0xcbbb, 0xcbd1, 0xcbbe, 0xcbd0, 0xcbb9, 0xcd1a, 0xcd1c, 0xcd1b, 0xcd91, 0xcd96, 0xcd9f, 0xcd9c, 0xcd9a, 0xcd9d, 0xcead, 0xcea5, 0xceae, 0xcf03, 0xcf26, 0xcf20, 0xcf23, 0xcf24, 0xcf21, 0xcf28, 0xcf25, 0xcf1e, 0xcf94, 0xcf93, 0xcf8f, 0xcf9a, 0xcfad, 0x16c2, 0xd0ca, 0xd0c5, 0xd1bb, 0xd1e1, 0xd1ea, 0xd1e4, 0xd1ed, 0xd1e6, 0xd1e0, 0xd1e8, 0xd1e5, 0xd31a, 0xd394, 0xd396, 0xd39e, 0xd395, 0xd3a1, 0xd38e, 0xd39b, 0xd392, 0xd397, 0xd399, 0xd393, 0xd532, 0xd52f, 0xd52e, 0xd533, 0xd61c, 0xd61e, 0xd611, /* 0x53 */ 0xd620, 0xd61f, 0xd619, 0xd616, 0xd7ac, 0xd7b9, 0xd7b3, 0xd7a6, 0xd7a2, 0xd7a9, 0xd7a7, 0xd86c, 0xd86d, 0xd869, 0xd880, 0xd866, 0xd865, 0xd871, 0xd86b, 0xdabd, 0xdac1, 0xdad3, 0xdab6, 0x18ac, 0xdab9, 0xdad4, 0xdab7, 0xdadb, 0xdab8, 0xdac0, 0xdabc, 0xdad5, 0xdabf, 0xdac3, 0xdac9, 0xdd58, 0xdd90, 0xdd95, 0xdd97, 0xde09, 0xde08, 0xde06, 0xde05, 0xde10, 0xde97, 0xde95, 0xdeee, 0xdf1f, 0xe41a, 0x564b, 0x3c8e, 0x3ee8, 0x3ef0, 0x3ef4, 0x3f06, 0x3eed, 0x009b, 0x3ee9, 0x3f00, 0x3fb8, 0x406d, 0x4304, 0x4301, 0x4303, 0x4302, 0x1af6, 0x0126, 0x4462, 0x45ba, 0x4613, 0x4ade, 0x4ad7, 0x4ae4, 0x4ace, 0x4ae3, 0x4add, 0x4b3a, 0x4adb, 0x4ad6, 0x4ae0, 0x4ad4, 0x4acb, 0x4ae1, 0x4ac9, 0x4adf, 0x4b3c, 0x4afc, 0x4acf, 0x4f79, 0x4f76, 0x4f78, 0x5187, 0x539c, 0x53b1, /* 0x54 */ 0x53c1, 0x539a, 0x5392, 0x0daf, 0x53c2, 0x5396, 0x53c0, 0x5391, 0x5395, 0x54a2, 0x55c3, 0x55c0, 0x55c2, 0x468a, 0x56b0, 0x5716, 0x5a46, 0x5a4a, 0x5a3e, 0x5a45, 0x5a42, 0x0415, 0x5a5b, 0x5a44, 0x5b04, 0x7b22, 0x5c55, 0x5c57, 0x5c51, 0x5c4e, 0x5c5a, 0x5dc6, 0x5dc3, 0x049c, 0x5dc5, 0x5dcc, 0x5e71, 0x5f26, 0x5fb2, 0x607a, 0x6084, 0x607b, 0x6374, 0x638c, 0x6351, 0x6348, 0x638d, 0x6392, 0x6398, 0x6393, 0x63b0, 0x634e, 0x6396, 0x6397, 0x639c, 0x63ca, 0x6833, 0x6883, 0x6884, 0x689a, 0x688c, 0x20cc, 0x6899, 0x69e0, 0x6ae4, 0x6af8, 0x6aed, 0x6af3, 0x6af4, 0x6af5, 0x6afd, 0x6c19, 0x6d9e, 0x6dc4, 0x6d9f, 0x6e9b, 0x6e9f, 0x6e9a, 0x71aa, 0x719d, 0x7192, 0x71a2, 0x71af, 0x71eb, 0x71a0, 0x71a1, 0x7194, 0x7198, 0x718f, 0x7187, 0x7184, 0x71a9, 0x717c, 0x7418, /* 0x55 */ 0x755f, 0x7562, 0x7561, 0x75c0, 0x7615, 0x76fc, 0x76f9, 0x7ac8, 0x7ac9, 0x7ade, 0x7aca, 0x7ae2, 0x0964, 0x096e, 0x7b04, 0x7acc, 0x7add, 0x7ae4, 0x7ad3, 0x7ac7, 0x7ac6, 0x095f, 0x7b37, 0x7ed8, 0x7eee, 0x7eb2, 0x7ea3, 0x7eb3, 0x7eed, 0x7ef8, 0x8031, 0x805b, 0x8066, 0x8069, 0x8096, 0x809b, 0x80f7, 0x80f3, 0x80f4, 0x80f5, 0x81e2, 0x81e7, 0x81e5, 0x81e9, 0x81e6, 0x81e3, 0x8374, 0x837f, 0x838f, 0x8390, 0x8397, 0x83a3, 0x838e, 0x8398, 0x838c, 0x8542, 0x8544, 0x8569, 0x8543, 0x8568, 0x0af6, 0x868d, 0x8688, 0x868b, 0x8689, 0x87cc, 0x881f, 0x8980, 0x895e, 0x8967, 0x8968, 0x8965, 0x254a, 0x8974, 0x8969, 0x8961, 0x8962, 0x896c, 0x8993, 0x8986, 0x8a9d, 0x8a9b, 0x8b1b, 0x8b16, 0x8b19, 0x8b14, 0x8b18, 0x8b15, 0x8b99, 0x8b98, 0x8d5d, 0x8d89, 0x8d7a, 0x8d7d, /* 0x56 */ 0x8d4b, 0x0c73, 0x8d78, 0x8d7f, 0x8d77, 0x8d7e, 0x8d79, 0x8dab, 0x8d7c, 0x8d74, 0x8d75, 0x8da7, 0x8e8d, 0x904e, 0x9066, 0x9061, 0x904d, 0x904f, 0x0cdd, 0x9054, 0x907c, 0x91da, 0x91de, 0x91d8, 0x91dd, 0x91df, 0x9366, 0x9362, 0x935f, 0x9364, 0x9363, 0x9360, 0x9388, 0x936a, 0x9367, 0x9387, 0x933f, 0x936c, 0x936e, 0x93ad, 0x94f1, 0x94f4, 0x94f6, 0x94f5, 0x94f8, 0x94fb, 0x94ec, 0x94ef, 0x94ed, 0x27b9, 0x94f7, 0x94f9, 0x94fd, 0x95b1, 0x9736, 0x971b, 0x9732, 0x9742, 0x974d, 0x971f, 0x9721, 0x971c, 0x9731, 0x972e, 0x9747, 0x973b, 0x9741, 0x9718, 0x9739, 0x971d, 0x9727, 0x9723, 0x28d7, 0x99ee, 0x99e8, 0x99e5, 0x99ef, 0x99e4, 0x99ec, 0x99f0, 0x9bd7, 0x9bd8, 0x9bd4, 0x9bca, 0x9bd2, 0x9bcb, 0x9bd3, 0x9be6, 0x9be2, 0x9d49, 0x9d48, 0x9dff, 0x9e09, 0x9eb0, /* 0x57 */ 0x9eaf, 0x9f7c, 0x9f78, 0x9f7a, 0x9f72, 0x9f79, 0x9f7e, 0xa00c, 0xa00b, 0xa0cd, 0xa0be, 0xa0bc, 0xa0bf, 0xa0c0, 0xa0bd, 0xa338, 0xa308, 0xa305, 0xa33b, 0xa310, 0xa30c, 0xa30d, 0xa304, 0xa33a, 0xa313, 0xa337, 0xa339, 0xa41f, 0xa44b, 0xa4ee, 0xa575, 0xa578, 0xa57c, 0xa574, 0xa576, 0xa5ea, 0xa5eb, 0xa8fb, 0xa919, 0xa9a7, 0xa98c, 0xa9dc, 0xa998, 0xa9be, 0xa99e, 0xaa0f, 0xa99f, 0xa9dd, 0xa993, 0xa9bb, 0xa9b6, 0xa990, 0xa9a1, 0xa9bd, 0xa9de, 0xa93a, 0xaa22, 0xa997, 0xa994, 0xa9c3, 0xa98e, 0xa9a8, 0xa999, 0xa9ad, 0xa99b, 0xa9a2, 0xaa21, 0xa9ac, 0xaa0e, 0xaa31, 0xace1, 0xacde, 0xacdf, 0xacdc, 0xacdd, 0xacec, 0xace7, 0xae69, 0xaeb8, 0xaea1, 0xaea8, 0xaeba, 0xaec2, 0xaea6, 0xaea4, 0xaea3, 0xaeab, 0xaebc, 0xaeb7, 0xaebf, 0xaead, 0xaeb1, 0xaeca, 0xaec4, /* 0x58 */ 0xaeb9, 0xb0c8, 0xb0c6, 0xb0c7, 0xb20a, 0xb20d, 0xb1fb, 0xb203, 0xb202, 0xb1fc, 0xb1f9, 0xb1f8, 0xb36e, 0xb363, 0xb362, 0xb361, 0xb36b, 0x1288, 0xb36f, 0xb366, 0xb36c, 0xb40e, 0xb415, 0xb416, 0xb410, 0xb417, 0xb411, 0xb56e, 0xb56c, 0xb587, 0xb583, 0xb563, 0xb5dc, 0xb6c0, 0xb6f7, 0xb6fa, 0xb770, 0xb76a, 0xb768, 0xb769, 0xb784, 0xb7ec, 0xb7e7, 0xb7ee, 0xb8ba, 0xb8b2, 0xb8b5, 0xb8cb, 0x430b, 0xb8d0, 0xb96d, 0xb96c, 0x13bb, 0xba45, 0xba46, 0xba34, 0xba2c, 0xba35, 0xba44, 0x13ba, 0xba76, 0xbbb1, 0xbbaa, 0xbba1, 0xbbb2, 0x1412, 0xbba6, 0xbbb5, 0xbbb4, 0xbbb8, 0xbbaf, 0xbbb0, 0xbba3, 0xbd62, 0xbd64, 0xbe56, 0xbe51, 0xbe4f, 0xbe68, 0xbe4c, 0xbe50, 0x1461, 0xbe48, 0xbe4a, 0xbf21, 0xc0e3, 0xc0b9, 0xc0de, 0xc0b7, 0xc0e1, 0xc0b6, 0xc0b5, 0xc0df, 0x14e1, /* 0x59 */ 0xc297, 0xc29a, 0xc29b, 0xc298, 0xc292, 0xc293, 0xc2d7, 0xc273, 0xc36b, 0xc374, 0xc378, 0xc36d, 0xc418, 0xc4e9, 0xc4f5, 0xc4ea, 0xc52e, 0xc4e7, 0xc4fe, 0xc4e5, 0xc536, 0xc4f0, 0xc4e6, 0xc52c, 0xc789, 0xc795, 0xc793, 0xc84d, 0xc84a, 0xc84f, 0xc850, 0xc84b, 0xca2a, 0xca2b, 0xca2f, 0xca2e, 0xca7c, 0xcaed, 0xcae2, 0xcbe0, 0xcbdc, 0xcbda, 0xcbd6, 0xcbf4, 0xcbd9, 0xcbd5, 0xcd22, 0xcd21, 0xcd24, 0xcd25, 0xcd26, 0xcd23, 0xcdaa, 0xcdaf, 0xcdb0, 0xcdab, 0xceaf, 0xceb7, 0xceb5, 0xceb2, 0xceb3, 0xcf2b, 0xcfd8, 0xcfc2, 0xcfaf, 0xcfbc, 0xcfb8, 0xcfbe, 0xcfb7, 0xcfb4, 0xcfbf, 0xcfb3, 0xcfb1, 0xcfbb, 0xcfbd, 0xcfd6, 0xcfdd, 0xd0d8, 0xd0d3, 0xd0d5, 0xd0e3, 0xd0e2, 0xd0d9, 0xd0de, 0xd0df, 0xd0da, 0xd0d4, 0xd1f3, 0xd1e2, 0xd20d, 0xd201, 0xd205, 0xd21a, 0xd203, /* 0x5a */ 0xd21f, 0xd216, 0xd1fa, 0xd1fc, 0xd20a, 0x359f, 0xd3bc, 0xd3ca, 0xd3b6, 0xd3c7, 0xd3bf, 0x1789, 0xd3b9, 0x178c, 0xd3b0, 0xd3b8, 0xd3bd, 0xd391, 0xd3bb, 0xd3be, 0xd53e, 0xd53d, 0xd638, 0xd63d, 0xd639, 0xd633, 0xd733, 0xd7bb, 0xd7c6, 0xd7c5, 0xd7c7, 0xd7cb, 0xd7a8, 0xd7c8, 0xd7be, 0xd7c1, 0xd7bd, 0xd882, 0xd89e, 0xd881, 0xd884, 0x368d, 0xd896, 0xd88e, 0xd888, 0xd887, 0xdae0, 0xdb0d, 0xdadf, 0xdae4, 0xdae2, 0xdadd, 0xdaec, 0xdade, 0xdae7, 0xdaea, 0xdae3, 0xdd5c, 0x3977, 0xdd5d, 0xdd9c, 0xde1d, 0xde9d, 0xde9e, 0xde9b, 0xdeb5, 0xdeb9, 0xdeb6, 0xdef3, 0xdef2, 0xdef4, 0xdf26, 0xdf27, 0xdf25, 0xe006, 0xe00b, 0xe03a, 0xe03c, 0x3f0a, 0x3f0b, 0x3fbf, 0x3ffd, 0x4118, 0xccdf, 0x8e90, 0x419e, 0x42fc, 0x4310, 0x430f, 0x430d, 0x43b9, 0x43b7, 0x43ba, 0x440a, /* 0x5b */ 0x4b41, 0x4b8b, 0x4b46, 0x4b53, 0x4be2, 0x4b3f, 0x4a7c, 0x4b4b, 0x4b4e, 0x4b8a, 0x4b47, 0x4f93, 0xb8ce, 0x4f8c, 0x4faf, 0x4fc9, 0x50c6, 0x50c8, 0x5191, 0x53cf, 0x53d4, 0x53ce, 0x55dd, 0x55d4, 0x5a49, 0x5a63, 0x5a5d, 0x041a, 0x5a67, 0x5abb, 0x5a60, 0x5a80, 0x5c5f, 0x5c60, 0x5dda, 0x5dd2, 0x5ddd, 0x608e, 0x6088, 0x606c, 0x639e, 0x63c9, 0x63a4, 0x0598, 0x63d9, 0x63d2, 0x63da, 0x63dd, 0x63ce, 0x63fc, 0x6514, 0x6560, 0x68d7, 0x68cb, 0x68cd, 0x68d5, 0x69e7, 0x6b00, 0x6b0a, 0x6b0f, 0x6b02, 0x6b01, 0x6c1d, 0x6dca, 0x6dcb, 0x6dcd, 0x6e4f, 0x6e9c, 0x7180, 0x720d, 0x7202, 0x07f1, 0x7207, 0x71f7, 0x71f8, 0x71fd, 0x7224, 0x71fb, 0x7239, 0x723a, 0x7422, 0x21a9, 0x756a, 0x756d, 0x7574, 0x770e, 0x7adf, 0x7b2b, 0x7ae3, 0x7b26, 0x7b2a, 0x7b23, 0x7b35, 0x7b4a, /* 0x5c */ 0x7efd, 0x7f00, 0x7f1e, 0x7eff, 0x809e, 0x80fa, 0x81f1, 0x8395, 0x83a8, 0x83a6, 0x856e, 0x8583, 0x856d, 0x868f, 0x0b6a, 0x87df, 0x87d5, 0x87e0, 0x87d3, 0x87d8, 0x898c, 0x254b, 0x8994, 0x8996, 0x8985, 0x898f, 0x89a9, 0x898e, 0x8990, 0x89b8, 0x89c3, 0x89bb, 0x8aa5, 0x8aa2, 0x25a2, 0x8aa3, 0x8bb5, 0x8bac, 0x8ba8, 0x8dad, 0x8db8, 0x8db4, 0x8dae, 0x8db6, 0x1085, 0x8dc1, 0x8dbf, 0x8e92, 0x8f00, 0x8f01, 0x9075, 0x9072, 0x9078, 0x9070, 0x907e, 0x907d, 0x907f, 0x91ef, 0x936d, 0x938e, 0x938f, 0x938a, 0x938d, 0x9395, 0x938b, 0x938c, 0x93b0, 0x9393, 0x94fc, 0x9515, 0x950e, 0x9518, 0x9511, 0x950d, 0x95bb, 0x95b3, 0x0e39, 0x97a1, 0x979a, 0x9784, 0x97a0, 0x9786, 0x979d, 0x97aa, 0x9778, 0x978d, 0x978a, 0x97a6, 0x977a, 0x9797, 0x9788, 0x978e, 0x0e3d, 0x0e44, /* 0x5d */ 0x9776, 0x9781, 0x9785, 0x9775, 0x97a8, 0x978f, 0x9791, 0x97a2, 0x979c, 0x9789, 0x977f, 0x9796, 0x9779, 0x979f, 0x97a7, 0x0e46, 0x9787, 0x979b, 0x97a5, 0x978b, 0x97c9, 0x99ff, 0x9a03, 0x9a00, 0x9a02, 0x9a04, 0x9a05, 0x99e6, 0x9a1f, 0x9c14, 0x0f0e, 0x9c0c, 0x9c0f, 0x9c19, 0x9c0b, 0x9c13, 0x9bd5, 0x0f10, 0x9c1c, 0x9d50, 0x9d4e, 0x9e12, 0x9eb9, 0x9f85, 0x9f88, 0x9f90, 0xa013, 0xa0d0, 0xa0d1, 0xa0d2, 0xa0d7, 0xa0d6, 0xa0e5, 0xa346, 0xa36b, 0xa345, 0xa33f, 0xa33e, 0x103e, 0xa36a, 0xa368, 0xa34c, 0xa423, 0xa422, 0xa497, 0xa491, 0x95b5, 0xa498, 0xa49c, 0xa589, 0x1084, 0xa58b, 0xa58a, 0xa58d, 0xa58e, 0xa588, 0xaa4e, 0xaa44, 0xaa37, 0xaa75, 0xaa54, 0xaa76, 0xaa34, 0xaa6b, 0xaa32, 0xaa57, 0xaa52, 0xaa45, 0x1149, 0xa9b1, 0xaa4b, 0xaa47, 0xaa33, 0xaa40, /* 0x5e */ 0xaa3c, 0xaa43, 0xaa4f, 0xaa55, 0xaa41, 0xaab2, 0xaac0, 0xaf34, 0xaef9, 0xaf19, 0xaf0d, 0xaefa, 0xaf1e, 0xaf1f, 0xaf0e, 0xaf40, 0xaf08, 0x11df, 0xaf13, 0xaf4c, 0x11f0, 0xb0cc, 0xb0cb, 0xb224, 0xb225, 0xb23d, 0xb220, 0xb227, 0xb226, 0xb21d, 0xb21e, 0xb232, 0xb26c, 0xb259, 0x128a, 0xb37a, 0xb379, 0xb41b, 0xb42e, 0xb423, 0xb420, 0xb41f, 0xb5b6, 0xb5b9, 0xb5a1, 0xb5a3, 0xb5a8, 0xb5af, 0xb59a, 0xb599, 0xb5a2, 0xb59d, 0x1302, 0xb5ab, 0xb6c9, 0xb6fe, 0xb700, 0xb6fc, 0xb707, 0xb775, 0xb772, 0xb773, 0xb774, 0xb7fa, 0xb7fc, 0xb7f8, 0xb7f6, 0xb7fb, 0xb8cd, 0xb8d1, 0xb8cf, 0xb974, 0xb972, 0xb973, 0xba54, 0xba51, 0x13c0, 0xba53, 0xba49, 0xba4c, 0xba4a, 0xba4f, 0xba56, 0xbc00, 0xbbd5, 0xbbd7, 0xbbff, 0xbbd9, 0xbbe3, 0xbbd3, 0x1415, 0xbbd8, 0xbbd4, 0xbbde, /* 0x5f */ 0xbd71, 0xbe74, 0xbe88, 0xbe7f, 0xbe6b, 0xbe87, 0xbe79, 0xbe78, 0xbe89, 0xbe80, 0xbe76, 0xbf29, 0xbf28, 0xbf2f, 0xc0e5, 0xc104, 0xc103, 0xc0f0, 0xc0e8, 0xc0ea, 0xc0f1, 0xc101, 0xc102, 0xc2a9, 0xc2ab, 0xc2b7, 0xc2b6, 0x14e2, 0xc3a0, 0xc38e, 0xc386, 0xc387, 0xc385, 0xc38b, 0xc388, 0xc390, 0xc41a, 0xc434, 0xc537, 0xc52f, 0xc530, 0xc539, 0xc534, 0xc533, 0xc585, 0xc584, 0xc53a, 0xc79f, 0xc869, 0xc86c, 0xc86a, 0xc867, 0xc86b, 0xca3f, 0xca40, 0xcb0b, 0xcbd2, 0xcbf8, 0xcc01, 0xcbfa, 0xcc16, 0xe3f6, 0xcd2c, 0xcd2d, 0xcd2f, 0xcd2e, 0xcdc1, 0xcdf5, 0xcdc4, 0xcdde, 0xcdcc, 0xcdd2, 0xcdc2, 0xcdcd, 0xcdcf, 0xcddd, 0xcdc8, 0xceba, 0xcebe, 0xcebf, 0xcf2e, 0xcf30, 0xcfe7, 0xcfee, 0xcfe8, 0xcfe6, 0xcfe2, 0xcfe4, 0xcffb, 0xcffc, 0xcfea, 0xd0ed, 0xd0f6, 0xd0f3, /* 0x60 */ 0xd0f4, 0xd0f1, 0xd0f7, 0xd0f5, 0xd0ea, 0xd0eb, 0xd200, 0xd22c, 0xd212, 0xd23d, 0xd233, 0x174d, 0xd230, 0xd240, 0xd231, 0xd257, 0x174a, 0xd235, 0xd232, 0xd22d, 0xd236, 0xd238, 0xd262, 0xd25f, 0xd28a, 0xd3d6, 0xd3d8, 0xd3dd, 0xd3e4, 0xd3e3, 0xd54d, 0xd5d7, 0xd64a, 0xd64c, 0xd650, 0xd64b, 0xd64e, 0xd64f, 0xd739, 0xd7d2, 0xd7cd, 0xd7d3, 0xd7e1, 0xd7ce, 0xd7d5, 0xd7dd, 0xd7d4, 0xd7cf, 0xd8cb, 0xd8a6, 0xd8c2, 0xd8a5, 0xd8a9, 0xd8a2, 0xd8a4, 0xd8b0, 0xd8cc, 0xd8af, 0xd8bf, 0xdb24, 0xdb1a, 0xdb14, 0xdb3a, 0xdb20, 0xdb1b, 0xdb21, 0xdb25, 0xdb1e, 0xdb3f, 0xdb40, 0xdb18, 0xdb2c, 0xdb15, 0xdb2d, 0xdb1f, 0xdb29, 0xdb4b, 0xddb3, 0xdda5, 0xdda7, 0xddab, 0xdda6, 0xddaa, 0xde22, 0xde23, 0xdea1, 0xdea3, 0xdea0, 0xdebd, 0xdeba, 0xdefa, 0xdef8, 0xdefc, 0xdef6, /* 0x61 */ 0xdf34, 0xdf43, 0x1963, 0xdfd4, 0xe00d, 0xe043, 0xe041, 0xe03d, 0xe040, 0xe03e, 0xe03f, 0xe046, 0x1993, 0xe0d4, 0x3f35, 0x3f36, 0x3f32, 0x3f3a, 0x3fc8, 0x4036, 0x411e, 0x411d, 0x411f, 0x431c, 0x431d, 0x4320, 0x010e, 0x43c0, 0x4b9a, 0x4b93, 0x4bdd, 0x020a, 0x4ba3, 0x4ba9, 0x4b9c, 0x4b9b, 0x020d, 0x4b97, 0x4fb1, 0x4fca, 0x4fb3, 0x4fcd, 0x53ea, 0x53ee, 0x53ef, 0x55df, 0x5650, 0x56bb, 0x5a88, 0x5a89, 0x5a8c, 0x5a85, 0x5a5e, 0x5a94, 0x5a95, 0x5c6b, 0x5c6a, 0x5c69, 0x5de3, 0x5df1, 0x5f37, 0x5f33, 0x6091, 0x608f, 0x6097, 0x63d4, 0x63de, 0x63d3, 0x63e0, 0x6443, 0x640b, 0x63ff, 0x6404, 0x6407, 0x68f9, 0x68fa, 0x68fb, 0x68f8, 0x6b12, 0x6b10, 0x6c1f, 0x6ddf, 0x6de3, 0x6e52, 0x6ea9, 0x7265, 0x7287, 0x7242, 0x7252, 0x724c, 0x719f, 0x7201, 0x7248, 0x724f, /* 0x62 */ 0x727e, 0x724d, 0x7258, 0x7247, 0x725e, 0x7249, 0x724e, 0x725d, 0x725a, 0x7286, 0x7251, 0x7429, 0x74a6, 0x74a7, 0x7570, 0x756f, 0x75d3, 0x75d2, 0x7728, 0x771b, 0x771a, 0x771c, 0x7721, 0x7b32, 0x7b66, 0x7b7d, 0x7b73, 0x7b7f, 0x7b65, 0x7b80, 0x7b61, 0x7b75, 0x7b6e, 0x7b67, 0x7b71, 0x7b6c, 0x7b63, 0x7b62, 0x7b83, 0x7bb2, 0x7b81, 0x7b6f, 0x7b6b, 0x7b82, 0x7b8a, 0x7f29, 0x7f30, 0x7f31, 0x8097, 0x8100, 0x80ff, 0x83b6, 0x83b5, 0x83c3, 0x858d, 0x8618, 0x869c, 0x869a, 0x8699, 0x89b7, 0x89c4, 0x89c6, 0x89c7, 0x89bc, 0x89c0, 0x89c5, 0x89cd, 0x89c1, 0x89be, 0x8aa7, 0x8ab8, 0x8b23, 0x0c74, 0x8de8, 0x8dde, 0x8de3, 0x8def, 0x8ddc, 0x8de4, 0x8de1, 0x8de5, 0x8e95, 0x8e94, 0x8e93, 0x8e8e, 0x9098, 0x909c, 0x9099, 0x90a0, 0x909e, 0x9204, 0x93d3, 0x93b4, 0x93bb, /* 0x63 */ 0x93b7, 0x93b8, 0x93bd, 0x93b6, 0x93b9, 0x93b5, 0x9522, 0x9521, 0x95c3, 0x95bc, 0x97ff, 0x97e5, 0x97f7, 0x97d2, 0x9800, 0x97db, 0x97f0, 0x97e2, 0x97cd, 0x0e56, 0x97e1, 0x97f2, 0x97dc, 0x97cc, 0x97d6, 0x97f3, 0x97fa, 0x97f6, 0x97ec, 0x97ea, 0x97e3, 0x97d0, 0x0e5a, 0x9795, 0x97d5, 0x97f4, 0x97cb, 0x97da, 0x97c8, 0x97df, 0x97f5, 0x97cf, 0x97c7, 0x97d7, 0x9a24, 0x0ea3, 0x9a1c, 0x9a21, 0x9a1e, 0x9a18, 0x9a1b, 0x0ea8, 0x9c46, 0x9c4b, 0x9c48, 0x9c47, 0x9c67, 0x9c54, 0x9e15, 0x9e22, 0x9ec5, 0x9e29, 0x9ec7, 0x9f8d, 0xa01b, 0xa020, 0xa0e2, 0xa0e7, 0xa0e8, 0xa0e1, 0xa372, 0xa37b, 0xa374, 0xa371, 0xa379, 0xa375, 0xa390, 0xa377, 0xa37d, 0xa44f, 0xa450, 0xa4a3, 0xa4a2, 0xa4f4, 0xa594, 0xa59a, 0xa59b, 0xa5a7, 0xa597, 0xa595, 0xa592, 0xa59c, 0xa596, 0xaab6, /* 0x64 */ 0xaab8, 0xaab0, 0xab18, 0xaac5, 0xaab5, 0xaac2, 0xab06, 0xab19, 0xaab9, 0xab15, 0xaad6, 0xaaac, 0x113c, 0xaac6, 0xaab3, 0xaac3, 0xaaca, 0xaacf, 0xaabd, 0xaace, 0xab14, 0xaaba, 0xab1a, 0xaac1, 0xaabb, 0x119b, 0x119a, 0xad01, 0xacfc, 0xaf5a, 0xaf54, 0xaf61, 0xaf5c, 0xaf55, 0xaf4a, 0xaf4b, 0xaf51, 0xaf69, 0xaf6b, 0x2cf1, 0xaf66, 0xaf58, 0xaf5d, 0xaf67, 0xaf56, 0xaf88, 0xaf64, 0xaf4e, 0xb257, 0xb25a, 0xb251, 0xb24a, 0xb24b, 0x125e, 0xb247, 0xb26f, 0xb26a, 0xb26b, 0xb246, 0xb26d, 0xb254, 0xb26e, 0xb24c, 0xb378, 0xb386, 0xb382, 0x12a7, 0xb5e1, 0xb5e5, 0xb5db, 0xb5de, 0xb5d7, 0xb703, 0xb77c, 0xb77e, 0xb805, 0xb807, 0xb8e6, 0xb8e1, 0xb8fb, 0xb8e5, 0xb8e7, 0xb8df, 0xb8ff, 0xb976, 0xba63, 0xba66, 0xba65, 0xba5e, 0xba64, 0xba6b, 0xba5f, 0xba67, 0xba68, /* 0x65 */ 0xbc08, 0xbc09, 0xbc17, 0xbc15, 0xbc1b, 0xbc0b, 0xbc28, 0xbc0e, 0xbc18, 0xbc53, 0xbc45, 0xbc0d, 0xbc0a, 0xbc13, 0xbc4a, 0xbd79, 0xbea1, 0xbe8d, 0xbea2, 0xbe90, 0x146e, 0xbf31, 0xbf30, 0xc11f, 0xc119, 0xc10c, 0xc11e, 0xc11d, 0xc107, 0xc266, 0xc2c5, 0xc2ba, 0xc2bd, 0xc2c2, 0xc2c3, 0xc2bf, 0x150d, 0xc3a1, 0xc3a2, 0xc3a8, 0xc3a3, 0xc3aa, 0xc3af, 0xc3b9, 0xc437, 0xc58f, 0x1543, 0xc58e, 0xc587, 0xc58a, 0xc592, 0xc597, 0xc59f, 0xc605, 0xc7a9, 0xc7a7, 0xc88a, 0xc882, 0xc885, 0xc88b, 0xc889, 0xc881, 0xc880, 0xc887, 0xc886, 0xca4d, 0xcb1c, 0xcb1f, 0xcc21, 0xcc1d, 0xcc22, 0xcbfe, 0xcc1b, 0xcc3a, 0xcc37, 0xcc17, 0xcc38, 0xcc26, 0xcc18, 0xcd34, 0xcd35, 0xcd32, 0x1673, 0xcde1, 0xcdfd, 0xcde3, 0xcde8, 0xcdf9, 0xcdff, 0xcdfe, 0x1674, 0xcde0, 0xce00, 0x1670, /* 0x66 */ 0xcdec, 0xcde4, 0xcdef, 0xcdfa, 0xceca, 0xcf31, 0xcf32, 0xcf34, 0xcf41, 0xd000, 0xd006, 0xd008, 0xd005, 0xd003, 0xd00b, 0xd002, 0xd00a, 0xd0f0, 0xd113, 0xd10a, 0xd10f, 0xd111, 0xd108, 0xd10b, 0xd112, 0xd10d, 0xd25b, 0xd263, 0xd261, 0xd268, 0xd25a, 0xd34e, 0xd34d, 0xd350, 0xd3fc, 0xd412, 0xd3f5, 0xd41e, 0xd3f0, 0xd3f3, 0xd3f2, 0xd401, 0xd3ef, 0xd3ee, 0xd416, 0xd3f6, 0xd3fb, 0xd41c, 0x17db, 0xd55d, 0xd560, 0xd566, 0xd55f, 0xd561, 0xd55b, 0xd562, 0xd557, 0xd669, 0xd66b, 0xd661, 0xd677, 0xd65f, 0xd663, 0xd662, 0xd665, 0xd7ef, 0xd7e2, 0xd800, 0xd7e8, 0xd7f2, 0xd7e7, 0x1829, 0xd7e5, 0xd8d5, 0xd8d0, 0xd8da, 0xd8d3, 0x1851, 0xd8d9, 0xd8cf, 0xd8d6, 0xd8d8, 0xd8f5, 0xd8ce, 0xd8d7, 0xd8f4, 0xd8cd, 0xd901, 0x36ba, 0xdb52, 0xdb55, 0xdb5a, 0xdb4d, 0xdb54, /* 0x67 */ 0xdb53, 0xdb5e, 0xdb67, 0xdb65, 0xdb4e, 0x18db, 0xdb4f, 0xdb61, 0xdb6e, 0xdb51, 0xdb5b, 0xdd63, 0xddb7, 0xddb6, 0xddc3, 0xddbb, 0xddb5, 0xde2e, 0xde30, 0xde33, 0xde31, 0xdea4, 0xdec1, 0xdebb, 0xdebe, 0xdf00, 0xdeff, 0xdf40, 0x1965, 0xdf3f, 0xdf44, 0x1964, 0x1967, 0xdfdb, 0xe00f, 0xe011, 0xe04e, 0xe04d, 0xe04b, 0xe04c, 0xe095, 0x3f3b, 0x3f45, 0x3f44, 0x3f3e, 0x3f3c, 0x3f3f, 0x3fcc, 0x3fce, 0x4122, 0x4123, 0x419f, 0x43c5, 0x43c4, 0x4be9, 0x4b99, 0x0211, 0x4be6, 0x4be7, 0x4bf7, 0x4fd2, 0x0333, 0x53fd, 0x540c, 0x540b, 0x57ed, 0x0421, 0x0422, 0x5a9b, 0x5b0a, 0x5c6f, 0x5c75, 0x5df2, 0x5df8, 0x5f3e, 0x6424, 0x640e, 0x6416, 0x6418, 0x6410, 0x6431, 0x6444, 0x05a6, 0x6429, 0x642f, 0x644b, 0x6436, 0x05a3, 0x6934, 0x6900, 0x692b, 0x6b20, 0x6b21, 0x6b1e, /* 0x68 */ 0x6b1d, 0x6df5, 0x6df2, 0x6df6, 0x7290, 0x729d, 0x729c, 0x7292, 0x7294, 0x72d1, 0x7293, 0x72b7, 0x7297, 0x72b0, 0x729f, 0x72c9, 0x742d, 0x742c, 0x7577, 0x772c, 0x7bc0, 0x7bb9, 0x7f53, 0x8040, 0x8202, 0x81fb, 0x0aa1, 0x858b, 0x85ae, 0x85ab, 0x86a1, 0xddcd, 0x87ea, 0x89dd, 0x89dc, 0x89d9, 0x8aab, 0x8aac, 0x8aad, 0x8ab2, 0x8b2c, 0x8b2b, 0x8bc2, 0x8e00, 0x8e0d, 0x8e06, 0x8dff, 0x8e03, 0x8e01, 0x8e10, 0x8e0f, 0x8e05, 0x8e98, 0x8e97, 0x8e96, 0x8e99, 0x90ac, 0x90ab, 0x9212, 0x93d8, 0x93df, 0x93d6, 0x952d, 0x9532, 0x983f, 0x982f, 0x9826, 0x983a, 0x9839, 0x0e5f, 0x983b, 0x9835, 0x982a, 0x9821, 0x9838, 0x9837, 0x9834, 0x0e5c, 0x9822, 0x9836, 0x9844, 0x9a45, 0x9a3b, 0x9a36, 0x9a42, 0x9c7a, 0x9c86, 0x9c8b, 0x9c7f, 0x9c81, 0x9e2a, 0x9ed5, 0x9f9f, 0x9f9d, /* 0x69 */ 0xa026, 0xa0f4, 0xa0f5, 0xa315, 0xa38e, 0xa38f, 0xa426, 0xa4a7, 0xa4af, 0xa5ad, 0xa5ac, 0xa5ab, 0xa5aa, 0xab2f, 0xab21, 0xab23, 0xaba3, 0xab49, 0xab3a, 0xab48, 0xab2d, 0xab25, 0xab29, 0xab32, 0xab34, 0xab24, 0xab2c, 0xab4b, 0xab3b, 0xab20, 0xab28, 0xaf98, 0x11f5, 0xaf97, 0x2d04, 0xaf9d, 0xafa8, 0xb0d5, 0xb277, 0xb278, 0xb272, 0xb273, 0xb302, 0xb43b, 0xb5fe, 0xb60b, 0xb5ff, 0xb607, 0x1311, 0x130c, 0xb630, 0xb6cd, 0xb6cf, 0xb710, 0xb70a, 0xb783, 0xb815, 0xb80e, 0xb80c, 0xb902, 0xb8fe, 0xb905, 0xb915, 0xb908, 0xba7f, 0xba77, 0xba7c, 0xba82, 0xba7e, 0xba78, 0xba7d, 0xba79, 0xba81, 0xbc4b, 0xbc63, 0xbc64, 0xbc56, 0xbc54, 0xbc4e, 0xbc10, 0xbc4f, 0xbc57, 0xbc5e, 0xbc51, 0xbc6a, 0xbc69, 0xbead, 0xbea4, 0xbeac, 0xbea9, 0xbeae, 0x3f4c, 0xc150, 0xc135, /* 0x6a */ 0xc132, 0xc2d8, 0xc2d1, 0xc2cf, 0xc2be, 0xc3d5, 0xc3c1, 0xc3c6, 0xc3c3, 0xc3c2, 0xc3c0, 0xc3c5, 0xc3c7, 0xc3bf, 0xc3c4, 0xc3d4, 0xc590, 0xc5d2, 0x154e, 0xc5d4, 0xc7af, 0xc7ae, 0xc7b2, 0xc7ad, 0xc89c, 0xc8a0, 0xc8b6, 0xca3d, 0xca56, 0xca82, 0xcb28, 0xcb2b, 0xcc3c, 0xcc3e, 0xcc3f, 0xcc42, 0xcc3d, 0xcc41, 0xcc3b, 0xcc49, 0xcc43, 0xcd39, 0xcd38, 0xce22, 0xce08, 0xce0c, 0xce06, 0xce13, 0xce04, 0xce20, 0xce1d, 0xce05, 0xce0a, 0xced6, 0xced7, 0xcf36, 0xcf37, 0xd023, 0xd022, 0xd020, 0xd01a, 0xd01d, 0xd11c, 0xd120, 0xd177, 0xd27f, 0xd28b, 0xd27d, 0xd299, 0xd284, 0xd289, 0xd285, 0xd283, 0xd286, 0xd29e, 0xd353, 0xd417, 0x1794, 0xd419, 0xd420, 0xd41f, 0xd423, 0xd418, 0xd421, 0xd429, 0xd424, 0xd426, 0xd55e, 0xd56f, 0xd56e, 0xd574, 0xd572, 0xd573, 0xd67d, /* 0x6b */ 0xd67e, 0xd685, 0xd67f, 0xd684, 0xd744, 0xd7f5, 0xd7f8, 0xd803, 0xd7f6, 0xd928, 0x1863, 0xd939, 0xd8fb, 0xd90e, 0xd8fd, 0xd91f, 0x1861, 0xd903, 0x36d8, 0xd910, 0x185a, 0xd90d, 0xd927, 0xd941, 0xdb72, 0xdb78, 0xdb80, 0x18e3, 0xdb85, 0xdb7b, 0x387c, 0xdb7d, 0xdb91, 0xdb88, 0xdbaa, 0xdb8d, 0xdb89, 0xdb95, 0xdb9b, 0xdb8c, 0xdb9e, 0xdb7c, 0xdb86, 0xdb84, 0xdd68, 0xddc5, 0xddc4, 0xddc9, 0xddc6, 0xde42, 0xde45, 0xde41, 0xde44, 0xdea6, 0xdec2, 0xdf42, 0xdf49, 0xdf48, 0xdf4a, 0xdf4c, 0xdf4b, 0xe017, 0xe018, 0xe015, 0xe052, 0xe054, 0xe053, 0xe09a, 0xe09b, 0xe0dc, 0xe0e4, 0xe191, 0x19af, 0xe1ba, 0x3f51, 0x3f5b, 0x3fcf, 0x6e05, 0x4c13, 0x4c15, 0x4c14, 0x4c23, 0x0213, 0x4c11, 0x4c12, 0x0280, 0x4ff0, 0x519b, 0x5412, 0x5416, 0x5417, 0x54b5, 0x57f4, 0x5ab1, /* 0x6c */ 0x5c79, 0x5dff, 0x5dfc, 0x5dfb, 0x5f3f, 0x5f44, 0x609d, 0x6432, 0x644c, 0x642b, 0x645a, 0x651f, 0x6901, 0x692d, 0x6927, 0x6959, 0x695a, 0x694d, 0x6958, 0x6b23, 0x6b25, 0x6b2b, 0x6dff, 0x6eae, 0x72cb, 0x72ca, 0x72d0, 0x72ce, 0x72cc, 0x72d8, 0x72c6, 0x72d2, 0x72cf, 0x72c8, 0x7617, 0x19b0, 0x7bc4, 0xcd40, 0x7be9, 0x7bf2, 0x7bfc, 0x7bea, 0x7beb, 0x7bfd, 0x7f78, 0x7f77, 0x7f73, 0x7f9e, 0x7f79, 0x80a2, 0x8103, 0x8204, 0x8205, 0x83ce, 0x85bf, 0x89f6, 0x89f7, 0x8b31, 0x8b30, 0x8bc9, 0x8bc7, 0x8e1c, 0x8e28, 0x8e1a, 0x8e1e, 0x8e1b, 0x8e1f, 0x90bf, 0x90bb, 0x90bc, 0x90c0, 0x921a, 0x93ef, 0x93ec, 0x93e9, 0x93f0, 0x93fe, 0x9534, 0x986a, 0x9895, 0x986c, 0x9872, 0x9867, 0x9860, 0x986b, 0x985e, 0x986f, 0x9866, 0x2946, 0x9862, 0x985d, 0x985c, 0xe365, 0x9a50, /* 0x6d */ 0x9c9f, 0x0f23, 0x9c9e, 0x9ca6, 0x9e35, 0x9e38, 0x9e36, 0x9e3a, 0x9edc, 0xa37c, 0xa3ab, 0x1049, 0xa3a8, 0xa3a7, 0xa42b, 0xa42c, 0xa428, 0x442b, 0xa4a9, 0xa4aa, 0xa4ab, 0xa4f8, 0xa5b1, 0xa5f0, 0xa5ef, 0xaba8, 0xab8b, 0xab94, 0xab9e, 0xab8f, 0xab88, 0xab7e, 0xab81, 0xab30, 0xab9b, 0xab82, 0xab90, 0xab85, 0xab7f, 0xaba9, 0xabde, 0xad0d, 0x11fa, 0xafcf, 0xafcb, 0xafd8, 0xafdd, 0xafd3, 0xafd0, 0xafd5, 0xafd6, 0xb0d6, 0xb292, 0xb295, 0xe0cb, 0xb28d, 0xb29b, 0xb29d, 0xb28f, 0xb29e, 0xb2a6, 0xb396, 0xb392, 0xb616, 0xb62a, 0xb629, 0xb62c, 0xb715, 0xb712, 0xb711, 0xb713, 0xb788, 0xb78b, 0xb78a, 0xb787, 0xb817, 0xb816, 0xb81a, 0xb919, 0xb917, 0xba91, 0xba94, 0xbc8b, 0xbc90, 0xbc8f, 0xbc86, 0xbc83, 0xbc8e, 0xbc87, 0xbca8, 0xbc85, 0xbca6, 0xbc82, 0xbca7, /* 0x6e */ 0xbeb9, 0xbeb7, 0xbeb4, 0xbeb6, 0xbeb3, 0xbec6, 0xc13c, 0xc140, 0xc138, 0xc291, 0xc2a6, 0xc2da, 0xc3da, 0xc3d8, 0xc3d9, 0xc3db, 0xc3d7, 0xc616, 0xc612, 0xc61f, 0x1559, 0xc614, 0xc61a, 0xc610, 0xc7b3, 0xc8ae, 0xc8c1, 0xc8b0, 0xc8af, 0xc8b1, 0xc8ad, 0xc8b2, 0xc8c4, 0xcb3c, 0xcb3f, 0xcc61, 0xcc66, 0xcd3c, 0xcd3b, 0xce2c, 0x167e, 0xce2a, 0xce3e, 0xce2f, 0xce32, 0xce27, 0xce29, 0xce40, 0xcedf, 0xcede, 0xcf3c, 0xcf3b, 0xcf3e, 0xd021, 0xd046, 0xd03c, 0xd036, 0xd038, 0xd035, 0xd131, 0xd136, 0xd12d, 0xd133, 0xd12f, 0xd12e, 0xd135, 0xd2ac, 0xd2a9, 0xd2a6, 0x17a8, 0xd44c, 0xd443, 0xd441, 0xd44f, 0xd442, 0xd451, 0x17a9, 0xd440, 0xd450, 0xd445, 0xd44a, 0xd44b, 0xd583, 0xd582, 0xd581, 0xd5e0, 0xd698, 0xd69f, 0xd69b, 0xd69a, 0xd699, 0xd696, 0xd6ae, 0xd69e, /* 0x6f */ 0xd809, 0xd80d, 0xd94e, 0xd94a, 0xd94d, 0xd940, 0xd93e, 0xd948, 0xd942, 0xd962, 0xd945, 0xd951, 0xdbc6, 0xdbd0, 0xdbc0, 0xdbb7, 0xdbc2, 0xdbbc, 0xdbc5, 0xdbdc, 0xdbdb, 0xdbd2, 0xdbc7, 0xdbb6, 0xdbc9, 0xdbcc, 0xdbd1, 0xdbcd, 0xdbda, 0xdbba, 0xdbd3, 0xdbce, 0xdbf6, 0xdbbd, 0xdbdd, 0xdbc8, 0xdc0d, 0xdc35, 0xdd71, 0xdd6e, 0xdd6f, 0xddd6, 0xde4c, 0xde4f, 0xde54, 0xde53, 0xdec9, 0xdec8, 0xdf03, 0x1954, 0xdf04, 0x1956, 0xdf57, 0xdf52, 0xdf53, 0x196d, 0xdf56, 0xdf5c, 0xdf55, 0xe064, 0xe05d, 0xe05e, 0xe0a2, 0xe0a3, 0x198e, 0xe0e7, 0xe0e6, 0xe198, 0xe1ac, 0xe1af, 0xe1ae, 0x3f59, 0x40a9, 0x432a, 0x43c7, 0x4c41, 0x4c37, 0x4c35, 0x4c33, 0x4c39, 0x4c32, 0x4fff, 0x5001, 0x4ff8, 0x541b, 0x5419, 0x56bf, 0x5abc, 0x5abe, 0x5abd, 0x5c7d, 0x5f46, 0x5f47, 0x60a4, /* 0x70 */ 0x6521, 0x6562, 0x6986, 0x0672, 0x6b2f, 0x6b31, 0x0814, 0x72f8, 0x72f5, 0x72f9, 0x72f2, 0x72fa, 0x72f3, 0x7314, 0x72fd, 0x730f, 0x730e, 0x7301, 0x7437, 0x7435, 0x7434, 0x7431, 0x757a, 0x757b, 0x7737, 0x7c2b, 0x7bfb, 0x7c16, 0x7c13, 0x0993, 0x7c11, 0x7c0f, 0x7c1b, 0x7c38, 0x7fa4, 0x8209, 0x8207, 0x820b, 0x83d3, 0x83d1, 0x83d8, 0x861d, 0x86a9, 0x86d0, 0xad15, 0x8a02, 0x8a05, 0x8a01, 0x8a00, 0x8e2e, 0x8e30, 0x8e2f, 0x8e31, 0x90d2, 0x90d3, 0x9402, 0x9540, 0x9542, 0x953b, 0x95ce, 0x9898, 0x988f, 0x9894, 0x9891, 0x0e6f, 0x98ba, 0x9890, 0x9886, 0x989a, 0x988c, 0x9893, 0x9887, 0x9888, 0x9897, 0x988d, 0x989c, 0x98bd, 0x9a3c, 0x9a59, 0x0eb0, 0x9cd1, 0x9cbb, 0x9cbe, 0x9d5d, 0x9ee2, 0xa105, 0xa3ba, 0x012e, 0xa3f4, 0xa4b2, 0xa4f9, 0xa5b7, 0xa5b6, 0xab89, /* 0x71 */ 0xabf9, 0xabd9, 0xabe8, 0xabd4, 0xabdb, 0xabe2, 0xabdf, 0xabd1, 0xabe9, 0xabea, 0xad13, 0xad11, 0xaffa, 0xaff8, 0xaff4, 0xaffb, 0xb00e, 0xb002, 0xb00f, 0xb290, 0xb2ad, 0xb2a9, 0xb448, 0xb65a, 0xb64f, 0xb64e, 0xb655, 0xb654, 0xb64a, 0xb6d5, 0xb718, 0xb78d, 0xb81d, 0xb819, 0xb926, 0xb928, 0xb92b, 0xb97d, 0xbaa0, 0xba9a, 0xba9b, 0xbcb5, 0xbcad, 0xbcb2, 0xbd94, 0xbec9, 0xc14e, 0xc14f, 0xc144, 0xc152, 0xc3e9, 0xc439, 0x1569, 0x337e, 0xc8c7, 0xc8d3, 0xc8c6, 0xc8c3, 0x15b4, 0xc8d2, 0xca66, 0xcc7f, 0xcc80, 0xcc84, 0xcc85, 0xcce3, 0x164d, 0xcd41, 0xcd44, 0xcd43, 0xce4e, 0xce4f, 0x1683, 0xce49, 0xce4a, 0xce4b, 0xce43, 0xcee0, 0xcee5, 0xcee1, 0xcee6, 0xcee2, 0xcf0c, 0xcf40, 0xd049, 0xd04a, 0xd054, 0xd04c, 0xd055, 0xd056, 0xd13b, 0xd13d, 0xd2a4, 0xd2a8, /* 0x72 */ 0xd2c3, 0xd2bf, 0xd2c8, 0xd2c2, 0xd2ca, 0xd2cc, 0xd2c9, 0xd2be, 0xd2cd, 0xd2c7, 0xd2c5, 0xd35d, 0x17b0, 0xd46c, 0xd46b, 0xd470, 0xd46d, 0xd46f, 0xd489, 0xd484, 0xd58d, 0xd58a, 0xd58e, 0xd591, 0xd6b5, 0xd6b1, 0xd6af, 0xd6b9, 0xd6b7, 0xd6b0, 0x180c, 0xd717, 0x1818, 0xd74f, 0xd819, 0xd810, 0xd818, 0xd811, 0xd81c, 0xd812, 0xd976, 0xd971, 0x3720, 0xd97a, 0xd97f, 0x3722, 0xd973, 0xd9ab, 0x371e, 0xd977, 0xd974, 0xd97e, 0xd99b, 0xd984, 0xd97c, 0xdc29, 0xdc2b, 0xdc0e, 0xdc00, 0xdc0b, 0xdbfe, 0xdbfa, 0xdc17, 0xdbff, 0xdc0c, 0xdc0f, 0x18f5, 0xdc02, 0xdc01, 0xdbfc, 0xdc49, 0xdc06, 0xdc12, 0xdc13, 0xdd78, 0xde5b, 0xde62, 0xde5f, 0xde5d, 0xdeab, 0xded5, 0xded4, 0xded3, 0xdf07, 0xdf6c, 0xdf70, 0xdf6e, 0xdf68, 0xdf6d, 0xdf77, 0xdf6a, 0xdfce, 0xdfec, 0xe069, /* 0x73 */ 0xe068, 0xe0a6, 0xe0a9, 0xe0aa, 0xe100, 0xe10d, 0xe0f8, 0xe0fc, 0xe10a, 0xe0f7, 0xe101, 0xe1b6, 0xe1bb, 0xe1b7, 0xe1b9, 0xe1ca, 0x3f69, 0x4125, 0x4c59, 0x5007, 0x5009, 0x5422, 0x5607, 0x5604, 0x6e0f, 0x57f8, 0x5ac7, 0x5ad1, 0x5c7e, 0x5e08, 0x5f4a, 0xe298, 0x5fb9, 0x6988, 0x6991, 0x6984, 0x6973, 0x6989, 0x6985, 0x6b33, 0x6e13, 0x731d, 0x731f, 0x731c, 0x7320, 0x731a, 0x731b, 0x7439, 0x74af, 0x75e5, 0x773c, 0x7c37, 0x7c3a, 0x7fbb, 0x0a0e, 0x8210, 0x820d, 0x86af, 0x8711, 0x0bd8, 0x8a0d, 0x8a0c, 0x8a0b, 0x8bd4, 0x8e3d, 0x8e3e, 0x8e3b, 0x8e43, 0x8e40, 0x8e46, 0x8f11, 0x90dd, 0x90df, 0x90ea, 0x924a, 0x9406, 0x98c1, 0x98b9, 0x98c6, 0x98b8, 0x98bb, 0x98c8, 0x98c5, 0x98bf, 0x98c7, 0x98c4, 0x9a65, 0x9a67, 0x9cd7, 0x9cdb, 0x9cd4, 0x9cd6, 0x9ee8, 0xa10a, /* 0x74 */ 0xa5bd, 0xa5be, 0xac1a, 0xac0d, 0xac0f, 0xac1b, 0xac10, 0xac11, 0xac13, 0xad18, 0xb020, 0xb01f, 0xb023, 0xb01d, 0xb037, 0xb025, 0xb024, 0xb02a, 0xb027, 0xb033, 0xb028, 0xb034, 0xb2ba, 0x2e70, 0xb39d, 0xb44c, 0xb65c, 0xb66a, 0xb65d, 0xb665, 0xb663, 0xb65e, 0xb719, 0xb797, 0xb93f, 0xb933, 0xb932, 0xbaa1, 0xbaa5, 0xbaa4, 0xbaa2, 0xbcc1, 0x142c, 0xbcc7, 0xbcc4, 0xbcc6, 0xbcc5, 0xbcd4, 0xbcca, 0xc153, 0xc3f1, 0xc421, 0x156e, 0xc6b7, 0xc692, 0xc8d4, 0xca44, 0xcc98, 0xcc9b, 0xcc91, 0xcc95, 0xcc9a, 0xcc92, 0xce53, 0xce57, 0x1686, 0xce5c, 0xce5d, 0xce64, 0xceea, 0xceed, 0xcf42, 0xcf43, 0xd064, 0xd061, 0xd060, 0xd17d, 0xd2d4, 0xd2d5, 0xd2d9, 0xd487, 0xd499, 0xd48c, 0xd48a, 0xd48f, 0x17b3, 0xd48b, 0xd482, 0xd49b, 0x17eb, 0xd6c8, 0xd6c4, 0xd6cc, 0xd6c7, /* 0x75 */ 0xd6c3, 0xd6c6, 0xd6cb, 0xd6ca, 0xd6c9, 0xd6cd, 0xd753, 0xd821, 0xd829, 0xd81d, 0xd824, 0xd828, 0x3743, 0xd9b1, 0xd9b2, 0xd9b5, 0xd9d6, 0xd9af, 0xd9ca, 0xd9b8, 0xe412, 0xe411, 0xdc45, 0xdc47, 0xdc34, 0xdc6e, 0xdc42, 0xdc31, 0xdc2e, 0xdc56, 0xdc38, 0xdc37, 0xdc4b, 0xdc2d, 0xdc33, 0xdc36, 0x38e0, 0xdc48, 0xdddc, 0x1942, 0xde66, 0xde6d, 0xde63, 0xde64, 0x1941, 0xde67, 0xded9, 0xdf0b, 0xdf7e, 0xdf8b, 0xe026, 0xe02c, 0xe029, 0xe06f, 0xe06b, 0xe06d, 0xe06e, 0xe11c, 0xe111, 0xe110, 0xe124, 0xe112, 0xe115, 0xe117, 0x19ac, 0x3f6f, 0x40ab, 0x432e, 0x43c9, 0x4696, 0x4c85, 0x51a0, 0x542b, 0x5e0d, 0x6b36, 0x3afd, 0x072f, 0x072e, 0x6eb1, 0x734a, 0x7337, 0x733c, 0x7338, 0x733a, 0x733e, 0x7349, 0x084d, 0x087b, 0x7580, 0x757f, 0x75e3, 0x773f, 0x7c52, 0x7c4e, /* 0x76 */ 0x7c4a, 0x7c4b, 0x7fd5, 0x85d8, 0x8620, 0x86b3, 0x86b1, 0x86b0, 0x8a17, 0x8bd9, 0x8e49, 0x8f13, 0x90ed, 0x90eb, 0x90ee, 0x940a, 0x940b, 0x954a, 0x98d5, 0x98d7, 0x98de, 0x98dc, 0x98ee, 0x9a70, 0x0eb2, 0x9cd9, 0x9ed7, 0xa3cb, 0xa3c7, 0xa4fc, 0xac3b, 0xac39, 0xac4b, 0xac43, 0xac40, 0xac46, 0xb04d, 0xb043, 0xb047, 0xb04b, 0xb055, 0xb052, 0xb65f, 0x1322, 0xb67c, 0xb67b, 0xbaa8, 0xbaa9, 0xbcde, 0xbcd7, 0xbcdd, 0xbcd6, 0xbcd8, 0xbd9b, 0xbee0, 0xbee8, 0xbee6, 0xc3f8, 0xc3fb, 0xc6bb, 0x3259, 0xc6b8, 0x1570, 0xc7c1, 0xc7c0, 0xcca4, 0xccab, 0xcd4d, 0xce65, 0xce67, 0xce6a, 0xce66, 0xce69, 0xd073, 0xd080, 0xd06f, 0xd071, 0xd2e4, 0xd2e6, 0xd2e7, 0xd4a0, 0xd4a4, 0xd5a2, 0xd5a7, 0xd5a4, 0xd6de, 0xd6db, 0xd758, 0xd75c, 0xd82f, 0xd82e, 0xd9dd, 0xd9e4, 0xd9d8, /* 0x77 */ 0xd9e7, 0xd9da, 0xd975, 0x1895, 0xdc79, 0xdc80, 0xdc7f, 0xdc7c, 0xdc75, 0xdc7b, 0xdc82, 0x1900, 0xdc89, 0xdc74, 0xdc7d, 0xdc7a, 0xdc86, 0xdca8, 0xdc72, 0x1902, 0xdc8b, 0xdc91, 0xdcb3, 0xdc81, 0xdd82, 0xdde1, 0xdde3, 0xdde2, 0xde76, 0xde74, 0xde72, 0xde75, 0xdf0e, 0xdf0d, 0xdf94, 0xdf92, 0xdf93, 0xdf91, 0xdf8f, 0xdf95, 0xdfd0, 0xdff7, 0xe076, 0xe0af, 0x199f, 0xe126, 0xe125, 0xe12d, 0xe1a0, 0xe1c3, 0x3fd7, 0x45cc, 0x4c79, 0x4c7a, 0x5015, 0x5adb, 0x5c85, 0x6470, 0x647b, 0x69a5, 0x699f, 0x6e17, 0x6eb2, 0x7339, 0x7340, 0x734e, 0x743e, 0x75e8, 0x75e7, 0x7c66, 0x7c61, 0x7fda, 0x8214, 0x83df, 0x8a18, 0x8b39, 0x8b3a, 0x9230, 0x9232, 0x940e, 0x954c, 0x98e8, 0x98f1, 0x98eb, 0x98ec, 0x9a74, 0x9a73, 0x9cf1, 0x9e42, 0x9e3e, 0x9e41, 0xa02c, 0xa3d2, 0xa4bb, /* 0x78 */ 0xac58, 0xac57, 0xac56, 0xac5a, 0x117d, 0xb061, 0xb068, 0xb065, 0xb05f, 0xb064, 0xb05e, 0xb05b, 0xb067, 0xb2c3, 0xb3a2, 0xb453, 0xb67d, 0xb720, 0xbaae, 0xbaaf, 0xbab0, 0xbce7, 0xbce6, 0xbce9, 0xbef1, 0xbeeb, 0xbeea, 0xbee9, 0xc163, 0xc402, 0xc3fe, 0xc6de, 0xc7c2, 0xc8e6, 0xca5d, 0xccad, 0xce75, 0xce72, 0xce77, 0x16f6, 0xd151, 0xd2e8, 0xd2ed, 0xd2ee, 0xd4b9, 0xd4a1, 0xd4b6, 0xd5ae, 0xd6e8, 0x1812, 0xd71e, 0xd831, 0xd832, 0x1891, 0xda0e, 0xda12, 0xda09, 0xda05, 0x1890, 0xda03, 0xda1f, 0xda0d, 0xda0c, 0xda04, 0xda0a, 0xdcc2, 0xdcbf, 0xdcc9, 0xdcb2, 0xdcc1, 0xdcaf, 0xdcb4, 0xdcb0, 0xdcb6, 0xdcb7, 0xdcbb, 0xdcb1, 0xddf0, 0xde78, 0xde7a, 0xde79, 0xdee4, 0xdee6, 0xdf9f, 0xdf9d, 0xdf98, 0xdf99, 0xdff9, 0xe030, 0xe082, 0xe081, 0xe0b3, 0xe07f, 0xe13a, /* 0x79 */ 0xe13e, 0xe148, 0x4c86, 0x5436, 0x5613, 0x5722, 0x5add, 0x60a7, 0x647d, 0x0679, 0x6e1c, 0x7365, 0x7360, 0x7367, 0x084e, 0x761a, 0x85e3, 0x9234, 0x9418, 0x9552, 0x98fc, 0x9a79, 0x9a78, 0x9a76, 0x9cfa, 0x9cf8, 0xa02d, 0xa3d6, 0xa4bd, 0xa4bf, 0xa4be, 0xac44, 0xac70, 0xac62, 0xac6e, 0xb06e, 0xb07c, 0xb074, 0xb078, 0xb070, 0xb079, 0xb071, 0xb2cc, 0xb3a7, 0xb3a6, 0xb693, 0xb721, 0xb79c, 0xbd9d, 0xbef4, 0xbef3, 0xc8f0, 0xccb8, 0xccb6, 0xccbd, 0xce73, 0xce82, 0xd087, 0xd156, 0xd159, 0xd2f6, 0xd4c9, 0xd4c5, 0xd4c7, 0xd4ca, 0xd4c2, 0xd4c4, 0xd6f2, 0xd6f0, 0xd83b, 0xd83a, 0xda26, 0xda28, 0xda34, 0xda2d, 0xdcd7, 0xdcd2, 0xdcd6, 0xdcdc, 0xdcd3, 0xdcd1, 0xdd86, 0x191e, 0xddef, 0xddee, 0xdee8, 0xdfac, 0xdfa9, 0xdfaa, 0xdfab, 0xdffb, 0xe033, 0xe088, 0xe0b6, /* 0x7a */ 0xe0b7, 0xe0d0, 0xe0cf, 0xe14f, 0xe159, 0xe14c, 0x5618, 0x5ae0, 0x7369, 0x7c73, 0x7c72, 0x85e8, 0x90fb, 0x941c, 0x9909, 0x990a, 0x9908, 0x9a7d, 0x9a7f, 0x9d67, 0xac7a, 0xac7b, 0xb2d1, 0xe3cb, 0xb69d, 0xb79d, 0xbcfc, 0xbcfb, 0xbcfd, 0xbef5, 0xbef6, 0xc70f, 0xc71d, 0xccc7, 0xccc1, 0xccbf, 0xcd54, 0xce7f, 0xcef5, 0xd08a, 0xd08c, 0xd15c, 0xd365, 0xd4cf, 0xd4d0, 0xd5b8, 0xd6fa, 0xd766, 0xda40, 0xda41, 0x3772, 0xdcf7, 0xdcf3, 0xdcef, 0xdcf4, 0xdced, 0xdcf2, 0xdcf1, 0xdcf9, 0xdfb4, 0xdffc, 0xe0bc, 0xe15e, 0xe15b, 0xe15f, 0xe15d, 0xe1cf, 0xe1ce, 0x543a, 0x5ae1, 0x5e15, 0x5e14, 0x7c78, 0x7c79, 0x7fe6, 0x86b8, 0x8a22, 0x90fe, 0xa3db, 0xa506, 0xa5c8, 0xac89, 0xb086, 0xb3ad, 0xb699, 0xb6d8, 0xb723, 0xb823, 0xbab5, 0xbef9, 0xc407, 0xc71e, 0xc8fb, 0xca72, /* 0x7b */ 0xca73, 0xce87, 0xcf49, 0xd15d, 0xd2f8, 0xd703, 0xda4e, 0xda4d, 0xda50, 0xda55, 0xdd09, 0xdd07, 0xdd0c, 0xdd03, 0xdd06, 0xdd0b, 0xdd0a, 0xdd89, 0xdfbb, 0xdfff, 0xe036, 0xe08b, 0xe166, 0xe169, 0xe167, 0xe1c2, 0xe1d2, 0x5ae2, 0x0428, 0x6488, 0x6e5b, 0x7376, 0x7c7d, 0x80a6, 0x8e5a, 0x9917, 0xa3dc, 0xac8f, 0xb094, 0xb095, 0xbab6, 0xbd04, 0xc2ee, 0xce8a, 0xcef9, 0xd707, 0xd71f, 0xd72a, 0xd845, 0xda5c, 0xda5b, 0xda61, 0xda5d, 0xdd18, 0xdd1f, 0xde83, 0xdf16, 0xdf14, 0xdfbf, 0xdfc0, 0xe173, 0xe1c0, 0x5017, 0x6489, 0x941e, 0x941f, 0x9554, 0x9918, 0x9d05, 0xac95, 0xb098, 0xb09b, 0xb459, 0xbd08, 0xbf01, 0xccce, 0xcefa, 0xd5be, 0xd847, 0xda6a, 0xda69, 0xda68, 0xda67, 0xdd25, 0xdd28, 0xdfc4, 0xe037, 0xe08d, 0xe08c, 0x1991, 0xe320, 0x9922, 0x9a82, 0xb2d9, /* 0x7c */ 0xc738, 0xcefb, 0xd4e1, 0xd772, 0xd848, 0xda6c, 0xda70, 0xdd31, 0xdd30, 0xe179, 0x9923, 0xa3f8, 0xd774, 0xda73, 0xdd34, 0xde87, 0xdeb2, 0xe0c2, 0xe17d, 0x5ae5, 0xce8c, 0xda77, 0xda75, 0xdd38, 0xdd3a, 0xe183, 0xe181, 0x7c80, 0xac99, 0x1187, 0xcf4a, 0xd84a, 0xdd3c, 0xe1c8, 0x9104, 0xb3af, 0xe189, 0xddfa, 0xd161, 0xdd3f, 0xac93, 0xdfc9, 0xb2de, 0xce91, 0xe18e, 0xe18d, 0xac98, 0xa4c5, 0xe1a5, }; static const ucs4_t cns11643_5_2uni_upages[229] = { 0x03400, 0x03500, 0x03600, 0x03700, 0x03800, 0x03900, 0x03a00, 0x03b00, 0x03c00, 0x03d00, 0x03e00, 0x03f00, 0x04000, 0x04100, 0x04200, 0x04300, 0x04400, 0x04500, 0x04600, 0x04700, 0x04800, 0x04900, 0x04a00, 0x04b00, 0x04c00, 0x04d00, 0x05200, 0x05900, 0x05e00, 0x05f00, 0x06100, 0x06300, 0x06400, 0x06b00, 0x07200, 0x07300, 0x07500, 0x07600, 0x07900, 0x07a00, 0x07b00, 0x07c00, 0x08300, 0x08600, 0x08700, 0x08800, 0x08900, 0x08a00, 0x08c00, 0x08e00, 0x09400, 0x09500, 0x09700, 0x09900, 0x09b00, 0x09c00, 0x09d00, 0x09e00, 0x0ff00, 0x20000, 0x20100, 0x20200, 0x20300, 0x20400, 0x20500, 0x20600, 0x20700, 0x20800, 0x20900, 0x20a00, 0x20b00, 0x20c00, 0x20d00, 0x20e00, 0x20f00, 0x21000, 0x21100, 0x21200, 0x21300, 0x21400, 0x21500, 0x21600, 0x21700, 0x21800, 0x21900, 0x21a00, 0x21b00, 0x21c00, 0x21d00, 0x21e00, 0x21f00, 0x22000, 0x22100, 0x22200, 0x22300, 0x22400, 0x22500, 0x22600, 0x22700, 0x22800, 0x22900, 0x22a00, 0x22b00, 0x22c00, 0x22d00, 0x22e00, 0x22f00, 0x23000, 0x23100, 0x23200, 0x23300, 0x23400, 0x23500, 0x23600, 0x23700, 0x23800, 0x23900, 0x23a00, 0x23b00, 0x23c00, 0x23d00, 0x23e00, 0x23f00, 0x24000, 0x24100, 0x24200, 0x24300, 0x24400, 0x24500, 0x24600, 0x24700, 0x24800, 0x24900, 0x24a00, 0x24b00, 0x24c00, 0x24d00, 0x24e00, 0x24f00, 0x25000, 0x25100, 0x25200, 0x25300, 0x25400, 0x25500, 0x25600, 0x25700, 0x25800, 0x25900, 0x25a00, 0x25b00, 0x25c00, 0x25d00, 0x25e00, 0x25f00, 0x26000, 0x26100, 0x26200, 0x26300, 0x26400, 0x26500, 0x26600, 0x26700, 0x26800, 0x26900, 0x26a00, 0x26b00, 0x26c00, 0x26d00, 0x26e00, 0x26f00, 0x27000, 0x27100, 0x27200, 0x27300, 0x27400, 0x27500, 0x27600, 0x27700, 0x27800, 0x27900, 0x27a00, 0x27b00, 0x27c00, 0x27d00, 0x27e00, 0x27f00, 0x28000, 0x28100, 0x28200, 0x28300, 0x28400, 0x28500, 0x28600, 0x28700, 0x28800, 0x28900, 0x28a00, 0x28b00, 0x28c00, 0x28d00, 0x28e00, 0x28f00, 0x29000, 0x29100, 0x29200, 0x29300, 0x29400, 0x29500, 0x29600, 0x29700, 0x29800, 0x29900, 0x29a00, 0x29b00, 0x29c00, 0x29d00, 0x29e00, 0x29f00, 0x2a000, 0x2a100, 0x2a200, 0x2a300, 0x2a400, 0x2a500, 0x2a600, 0x2f800, 0x2f900, 0x2fa00, }; static int cns11643_5_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x21 && c1 <= 0x7c)) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x21 && c2 < 0x7f) { unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); ucs4_t wc = 0xfffd; unsigned short swc; { if (i < 8603) swc = cns11643_5_2uni_page21[i], wc = cns11643_5_2uni_upages[swc>>8] | (swc & 0xff); } if (wc != 0xfffd) { *pwc = wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } freelan-2.0/third-party/source/libiconv-msvc/include/cns11643_6.h000066400000000000000000001576571252300335000245320ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CNS 11643-1992 plane 6 */ static const unsigned short cns11643_6_2uni_page21[6388] = { /* 0x21 */ 0xc902, 0x3362, 0x0005, 0x3388, 0x33d0, 0x33cf, 0x341e, 0x341f, 0x3420, 0x3c0e, 0x3c2c, 0x3361, 0x3304, 0x3305, 0x3303, 0x0004, 0xc901, 0x337d, 0x338d, 0x34a3, 0x34a4, 0x37db, 0x3800, 0xc91e, 0x39a3, 0x3b32, 0x013f, 0x3dd4, 0x3dd5, 0x4e23, 0x552c, 0x557a, 0x3803, 0x3307, 0x3308, 0x338f, 0x339c, 0x33d5, 0x3412, 0x3413, 0x3414, 0x3421, 0x34a8, 0x34a6, 0x3776, 0x3801, 0x383d, 0xc914, 0x383e, 0x3929, 0x3977, 0x3978, 0x39a6, 0x39a9, 0x39ac, 0x3b34, 0x3804, 0x3c7b, 0x3d10, 0x392f, 0x3dd7, 0x3e1c, 0x3e1f, 0x3e1a, 0xc936, 0x3e1e, 0x3e9e, 0x3e9a, 0x43a0, 0x43a1, 0x47d2, 0x47d3, 0x4bb9, 0x4d1d, 0x4d55, 0x4eff, 0x51e7, 0x042a, 0x5211, 0x5213, 0x5212, 0x53af, 0x53b1, 0xc990, 0x552d, 0x557b, 0x559d, 0x559a, 0x04a7, 0x559f, 0x55a0, 0x559c, 0x56bd, 0x04fa, /* 0x22 */ 0x57aa, 0x626c, 0x6291, 0x6d74, 0x756a, 0xca29, 0x8605, 0x8f6b, 0x8f6a, 0x33e0, 0x3312, 0x0000, 0x337f, 0x33a0, 0x3399, 0x3395, 0x339e, 0x33df, 0x33de, 0x34af, 0x34ad, 0x34b0, 0x37df, 0x3843, 0x3841, 0x3848, 0x3875, 0xc91a, 0x3932, 0x397b, 0x3979, 0x39b3, 0x00db, 0x3ea7, 0x39b2, 0x39b0, 0x39b4, 0xc929, 0x3bcd, 0x3bce, 0xc92b, 0x3c10, 0x3c80, 0x3cd3, 0x3d30, 0x3398, 0x3d2f, 0x3d31, 0x3dda, 0x3dd9, 0x3e27, 0x3e28, 0x3e21, 0x3e25, 0x3ea6, 0x3ea2, 0x3ea1, 0x3ea4, 0xc939, 0x3eaa, 0x3ea5, 0x3ea3, 0x3364, 0x443f, 0x4444, 0x471b, 0x4753, 0x4784, 0x4786, 0x47d5, 0xc960, 0x4b3e, 0x4b40, 0x4dca, 0x4dc9, 0x4e26, 0x4f00, 0x4f31, 0x4f3c, 0x4f30, 0x4f33, 0x4f32, 0x4f38, 0x5234, 0x5253, 0x5254, 0x53b4, 0x53b2, 0x552f, 0x55a5, 0x55a7, 0x55a4, 0x55a8, 0x55a9, /* 0x23 */ 0x55a2, 0x55a3, 0x55a6, 0x5681, 0x5680, 0x57ad, 0x5c24, 0x5c65, 0x5c68, 0x5c69, 0x633c, 0x633b, 0x655d, 0x6a44, 0x7182, 0x74f1, 0x756b, 0x771b, 0x78eb, 0x7bba, 0x7bd3, 0x7d13, 0x8922, 0x97f4, 0xab0f, 0xab10, 0x3807, 0xc10b, 0xc10a, 0x3319, 0x331a, 0x3318, 0x3366, 0x3382, 0x33a8, 0x33e5, 0x33e7, 0x33e4, 0x3415, 0x3423, 0x3424, 0x3443, 0x34c3, 0x34bc, 0x34bb, 0x0038, 0x34b7, 0x34b9, 0x34cf, 0xc90d, 0x377a, 0x377b, 0x37e1, 0x37e0, 0x3809, 0x384d, 0xc916, 0x384b, 0x3879, 0x38b1, 0x3936, 0x3935, 0x3937, 0x3938, 0x397f, 0x3980, 0x3981, 0x9653, 0x397e, 0x39cd, 0x39bf, 0x39be, 0x39c2, 0x39b8, 0x39c1, 0x2030, 0x3c31, 0x3c2f, 0x3c6f, 0x3c82, 0x013a, 0x3c87, 0x3c86, 0x3c8d, 0x3c94, 0x3cd7, 0x3cd4, 0x3cd8, 0x3d16, 0x3d14, 0x3d2e, 0x3d36, 0x3d37, 0x51ee, /* 0x24 */ 0x3de0, 0x3de5, 0x3ddf, 0x3e2b, 0x3e29, 0x3e2d, 0x3e2f, 0x3eb7, 0x3ec9, 0x3ec1, 0x3eca, 0x3eb2, 0x3eac, 0x3eae, 0x43b2, 0x43a8, 0x43b0, 0x43a7, 0xc951, 0x4452, 0x444a, 0x4756, 0x4755, 0x475f, 0x475e, 0x4788, 0xc95d, 0x47dd, 0x47e2, 0x47e1, 0x47df, 0x47e0, 0x48af, 0x48b1, 0x48ba, 0x4b45, 0x4b43, 0x4bbd, 0x4bc8, 0xc96c, 0x4bbe, 0x4bbf, 0xc974, 0x4d59, 0x4e29, 0x4e2c, 0x4e2f, 0x4e2d, 0x4e2e, 0x4f04, 0x4f02, 0x4f01, 0x4f40, 0x4f4a, 0x4f3f, 0x4f4f, 0x4f41, 0x4f4e, 0x51eb, 0x51ec, 0x33ac, 0x525b, 0x5263, 0x525a, 0x5259, 0x53dc, 0x53db, 0x53d9, 0x53e0, 0x53dd, 0x3320, 0x55b0, 0x55b1, 0x55b2, 0x55b6, 0x5651, 0x5652, 0x5650, 0x5684, 0x04c9, 0x5683, 0x57c3, 0x57b8, 0x57b9, 0x57b2, 0x5b90, 0x5c26, 0x5c29, 0x5c6e, 0x6340, 0x633e, 0x6341, 0x655e, 0x65bb, /* 0x25 */ 0x65bc, 0x65b9, 0xc9ef, 0x6980, 0x084f, 0x6a45, 0x6aba, 0x6abd, 0x6d56, 0x6d55, 0x6d75, 0x6d77, 0x6d81, 0xc9fa, 0x6d83, 0x6d8b, 0x6d84, 0x7186, 0x7183, 0x718b, 0x756d, 0x7616, 0x7728, 0x78ea, 0x7bd4, 0x7c03, 0x7d15, 0x7f3d, 0x7f3e, 0x8416, 0xca4c, 0x8606, 0x874d, 0x8f22, 0x8f73, 0x8f6d, 0x8f6e, 0x91b1, 0x384e, 0x932d, 0x0fcd, 0x95f9, 0x9652, 0x9800, 0x97fc, 0x97fa, 0x1092, 0x97f7, 0x97f8, 0xca90, 0xcac4, 0xa627, 0xab11, 0x33ae, 0xad50, 0xad4f, 0xad4d, 0xaf71, 0xcae2, 0xaf72, 0xb518, 0x3d44, 0x3321, 0x3367, 0x33af, 0x33b0, 0x3329, 0x3417, 0x3422, 0xc903, 0x3325, 0x3428, 0x34ff, 0x34d9, 0x34db, 0x34de, 0x34f2, 0x34fe, 0x34f4, 0x34dd, 0x0045, 0xc904, 0x3501, 0x34dc, 0x377d, 0x3781, 0x377e, 0x377f, 0x37e5, 0x380f, 0x00b5, 0x380a, 0x00b6, 0x380b, /* 0x26 */ 0x3851, 0x3852, 0x3850, 0x38b8, 0x393d, 0x393e, 0x393c, 0x3987, 0x39d7, 0x39db, 0x39cf, 0x39e0, 0x3b4c, 0x3b42, 0x3bd4, 0x3c11, 0x3c14, 0x3c15, 0x3c12, 0x3c33, 0x3c35, 0x0137, 0x3c71, 0x0130, 0x3c91, 0x3c93, 0x3c95, 0x3cdc, 0x3d42, 0x3d40, 0x83a6, 0x3de6, 0x448f, 0x3e32, 0xc937, 0x3e31, 0x3ef5, 0x3ecd, 0x3ede, 0x3ed5, 0x3eda, 0x3eee, 0x3eec, 0x3ecf, 0x3ece, 0xc93d, 0x3ecc, 0x3ef3, 0x43c1, 0x43c4, 0x43c6, 0x43b4, 0x43c3, 0x43b8, 0x43bb, 0x43b7, 0x43bc, 0x43bf, 0x43c7, 0x43be, 0x4460, 0x445d, 0x4476, 0x446c, 0x4475, 0x445b, 0x4471, 0x4473, 0x4461, 0x445a, 0x4462, 0x4472, 0x445f, 0x4458, 0x471e, 0x4758, 0x478b, 0x478a, 0x47f4, 0x47f0, 0x48d2, 0x48cd, 0x48ce, 0x48bc, 0x48d0, 0x4b46, 0x4b47, 0x033e, 0x034d, 0x0351, 0x4bce, 0x4bcf, 0x4bcc, 0x4bcb, /* 0x27 */ 0xc972, 0x4d60, 0x4d5f, 0x4d5d, 0x4dd4, 0x4e3a, 0x4e38, 0x4e3c, 0x4e36, 0x4f08, 0x4f7e, 0x4f5e, 0x4f6e, 0x4f53, 0x4f70, 0x4f57, 0x4f5d, 0x4f63, 0x4f7a, 0x4f79, 0x4f93, 0xc981, 0x521d, 0x5268, 0x5273, 0x5274, 0x5266, 0x526f, 0x5275, 0x527a, 0x5270, 0x526d, 0x5265, 0x538a, 0x53ed, 0x53e9, 0x53e3, 0x53ef, 0x0473, 0x53ea, 0x5531, 0xc991, 0x5538, 0x9820, 0x5535, 0x553a, 0x5581, 0x5580, 0x55b8, 0x55c1, 0x55ba, 0x5688, 0x56cf, 0x56ca, 0x56c7, 0x56c5, 0x56c8, 0x56d0, 0x56c9, 0x57bb, 0x57b6, 0x57bd, 0xc99d, 0x57b4, 0x57c1, 0x57d1, 0x57d2, 0x57cc, 0x57d4, 0x57cb, 0x57ce, 0x57d5, 0x57d8, 0x5b95, 0x5b93, 0x5b99, 0x5b96, 0x05be, 0x5c89, 0x5c94, 0x5c91, 0x5c8f, 0x5c84, 0x5c97, 0x5c86, 0x5c85, 0x5c8c, 0x60f2, 0x60ed, 0x60ef, 0x62d9, 0x6346, 0x6347, 0x634b, /* 0x28 */ 0x6350, 0x634a, 0x634e, 0x634c, 0x6348, 0x6563, 0x6561, 0x6562, 0x6560, 0x65c3, 0x65c5, 0x65c1, 0x65d0, 0xc9dc, 0x6982, 0x081e, 0x6986, 0x6984, 0x6a4c, 0x6a48, 0x6ab8, 0x6abf, 0x6ac1, 0x6ac6, 0x6ac5, 0x6ac7, 0x6ac0, 0x6ac3, 0x6bed, 0x6c03, 0x6c22, 0x6c21, 0x6d9f, 0x6d90, 0x6d9e, 0x08c8, 0x6da0, 0x6d94, 0x6d95, 0x6da1, 0x08c3, 0x08c7, 0x719a, 0x7190, 0x74f2, 0x74f3, 0x756e, 0x75ab, 0x75a9, 0x761a, 0x7618, 0x761b, 0x7760, 0x774c, 0x7742, 0x7733, 0x773f, 0x773e, 0x7738, 0x7743, 0x7746, 0x7736, 0x78ee, 0x78f5, 0x78f4, 0x0b56, 0x7c1b, 0x0140, 0x7d2b, 0x7d29, 0x7d2a, 0x7d2e, 0x803f, 0x80e6, 0x83a7, 0x83a8, 0x8418, 0x8608, 0x8750, 0x8753, 0x8a56, 0x8a55, 0x8f6f, 0x8f7f, 0x91b3, 0x933a, 0x9338, 0x9337, 0x9336, 0x3854, 0xca80, 0x95dd, 0x95fc, 0x95fa, /* 0x29 */ 0x9633, 0x9804, 0x9807, 0x9808, 0x9806, 0x9809, 0xca91, 0xca93, 0x9d1e, 0xcad2, 0xad0b, 0xad43, 0xad52, 0xad58, 0xad5e, 0xaf68, 0xaf8d, 0xaf82, 0xaf7b, 0xb358, 0x15bd, 0xc900, 0x332c, 0x332e, 0x480b, 0x332d, 0x3369, 0x33b2, 0x33b6, 0x33a9, 0x33ed, 0x3419, 0x344f, 0x3516, 0x3503, 0x350e, 0x3504, 0x3507, 0x3510, 0x3527, 0x3528, 0x350d, 0x3529, 0x350f, 0x3522, 0x3511, 0x3785, 0x3784, 0x3783, 0x378a, 0x3786, 0x3810, 0x3858, 0x385a, 0x3a0c, 0x38c4, 0x38c5, 0x3947, 0x3949, 0x394a, 0x394b, 0x53bb, 0x398d, 0x398b, 0x3a07, 0x3a06, 0xc920, 0x39ef, 0x39f0, 0x39ed, 0x39f9, 0x3a02, 0x39e7, 0x39f4, 0x39f7, 0x39f1, 0x3b53, 0x3b55, 0x011a, 0x3bda, 0x3bd9, 0x012c, 0x3c38, 0x3c99, 0x3ca2, 0x3c9c, 0x3c9a, 0x3c9b, 0x3ce5, 0x3ce3, 0x3ce1, 0x3ce0, 0x3ce2, 0x3ce4, /* 0x2a */ 0x32fd, 0x3ce8, 0xc92f, 0x3d13, 0x3d56, 0x3d4b, 0x3d4a, 0x3d4d, 0x3d4c, 0x0149, 0x3dea, 0x3de9, 0x3deb, 0x3dec, 0x3e3a, 0x3e3c, 0x3e39, 0x3e3b, 0x3f14, 0x3f0e, 0x3f35, 0x3f0a, 0x3f3f, 0x3f38, 0x017c, 0x3f4e, 0x3f17, 0xc93f, 0x3f1e, 0x43b6, 0x43ce, 0x43ca, 0x43cb, 0x43cc, 0x43c9, 0x44b4, 0x44ac, 0x4488, 0x4486, 0x448c, 0x4493, 0x448a, 0x44a4, 0x4487, 0x44a5, 0x44a6, 0x4485, 0x44a3, 0x448e, 0x471f, 0x4763, 0x478d, 0x47fa, 0x47fb, 0x4809, 0x47fe, 0x47ff, 0x4802, 0x4804, 0x47fd, 0x4805, 0x48f9, 0x48f7, 0x48db, 0x48da, 0x4b51, 0x4b50, 0x4b57, 0x4be2, 0x4bd8, 0x4bda, 0x4bdc, 0x4d20, 0x4d1f, 0x4d69, 0x4ddd, 0x4e40, 0x4e41, 0x4e43, 0x4f0d, 0x4f0c, 0x4f87, 0x4fa9, 0x4f92, 0x4f85, 0x03bf, 0x4f8c, 0x4fa2, 0x4f8f, 0x4f8a, 0x03ba, 0x4f8d, 0x51f1, 0x5237, /* 0x2b */ 0x528b, 0x5287, 0x5282, 0x538e, 0x53bc, 0x53f8, 0x53fa, 0x53eb, 0x53f9, 0x53fc, 0x5405, 0x551b, 0x551d, 0x551e, 0xc992, 0x553c, 0x553e, 0x5584, 0x55c8, 0x55c9, 0x55d3, 0x55c7, 0x55d2, 0x5655, 0xc996, 0x568c, 0x568a, 0x56d5, 0x56d3, 0x04d8, 0x56d8, 0x57d0, 0x57ee, 0x57f1, 0x57fb, 0x57d3, 0x57ec, 0x57cd, 0x5815, 0x5826, 0x580e, 0x5827, 0x582a, 0x5800, 0x5804, 0x5828, 0x5808, 0x5814, 0x5b9b, 0x05b2, 0x5ba1, 0x5b9d, 0x5ba0, 0x5b9e, 0x5ba2, 0x5b9c, 0x5c32, 0x5c34, 0x5c93, 0x5c96, 0x5c90, 0x5cb4, 0x5cb5, 0xc9b6, 0x5cb6, 0x5cc2, 0xc9b5, 0x5cba, 0x5c92, 0x60fb, 0x6105, 0x60f3, 0x60fe, 0x60fd, 0x755d, 0x60fa, 0x6243, 0x6295, 0x6294, 0x06c4, 0x636f, 0x6373, 0x635c, 0x635b, 0x6366, 0x6374, 0x6363, 0x6367, 0x6360, 0x6362, 0x6371, 0x6372, 0x635e, 0x6523, /* 0x2c */ 0x6526, 0x6564, 0xc9d6, 0x65f2, 0x6601, 0x65dd, 0x65dc, 0x65db, 0x65f3, 0x65fd, 0x65d8, 0x65f8, 0x65fb, 0x6983, 0x698c, 0x698e, 0x6a49, 0x6a54, 0x6a52, 0x6a4e, 0x6a58, 0x6a51, 0x6a55, 0x6a53, 0x6a57, 0x6a50, 0x6a4f, 0x6a4d, 0x6ad2, 0x6ad3, 0x6ac9, 0x6ad4, 0x6bef, 0xc9f8, 0x33b1, 0x6c05, 0x6c04, 0x6c2e, 0x6c2d, 0x6d45, 0x6d5b, 0x6d5a, 0x6d59, 0x6d9d, 0x6d8e, 0x6dbc, 0x6ddd, 0x6dba, 0xc9fd, 0x6dd8, 0x6dcb, 0x6dd9, 0x6dda, 0x6dc4, 0x6db8, 0x6dbf, 0x6ddb, 0x6dc1, 0xc9fc, 0x6dc5, 0xca19, 0x71b1, 0x71af, 0xca18, 0x74f7, 0x74f6, 0x74f8, 0x7550, 0x7551, 0x7571, 0x7570, 0x75b0, 0x75af, 0x75ae, 0x75ad, 0x7625, 0x762c, 0x7622, 0x7633, 0x7634, 0x0a2b, 0x773a, 0x7740, 0x7768, 0x0a61, 0x7764, 0x775c, 0x7757, 0x7753, 0x774f, 0x7751, 0x7754, 0x7766, 0x23dd, /* 0x2d */ 0x0ab2, 0x790d, 0x7908, 0xca2b, 0x78fa, 0x7aea, 0x7b2a, 0x7bbb, 0x7bd5, 0x7bd7, 0x4fa4, 0x33f0, 0x33b5, 0x7c06, 0x7c28, 0x7c22, 0x7c21, 0x5656, 0x7c23, 0x43cd, 0x7d30, 0x7d34, 0x7fc9, 0x7fca, 0x7fc8, 0xca3d, 0x8044, 0x80f3, 0xca41, 0x80f8, 0x80fc, 0x80f6, 0x80fb, 0x80f7, 0x8100, 0x8102, 0xca40, 0xca4d, 0x8424, 0x860d, 0x0d29, 0x8762, 0x8930, 0x892b, 0x892a, 0x0d92, 0x892d, 0x8ada, 0x8c28, 0x8d86, 0x8f77, 0x8f7c, 0x9050, 0x904e, 0x90f2, 0x91b2, 0x91ce, 0x91cf, 0x91e5, 0x6607, 0x9235, 0x9231, 0x9313, 0x932b, 0x932c, 0x9345, 0x9360, 0x9341, 0x9358, 0x9347, 0x935b, 0x9350, 0xca82, 0x935f, 0x934a, 0x9356, 0x9343, 0x9344, 0x9351, 0x95fd, 0x9634, 0x9635, 0x9654, 0x9655, 0x970c, 0x970b, 0x970a, 0x97f9, 0x9835, 0x9824, 0x9813, 0x981c, 0x9869, 0x9825, /* 0x2e */ 0x9821, 0xca95, 0xca96, 0xca98, 0x9d20, 0x9fa9, 0x9fa8, 0x9fde, 0xa009, 0xa00a, 0xa00b, 0xa1e3, 0xa207, 0xa2b2, 0xa2b3, 0xa35d, 0xa858, 0xa886, 0xa887, 0xa9b9, 0xa9b8, 0xad0c, 0xad44, 0xad66, 0xad80, 0xad75, 0xad6d, 0xad7e, 0xad67, 0xad81, 0xad77, 0xafa8, 0xafa2, 0xafa5, 0xaf9b, 0xb357, 0xb50f, 0xb532, 0xb52c, 0xb533, 0xb8e7, 0x336e, 0x33b7, 0x33f6, 0x33f2, 0x33f3, 0x3817, 0x3430, 0x3454, 0x3453, 0x3552, 0x353d, 0x353c, 0x3534, 0x3533, 0x3554, 0x352f, 0x0058, 0x3555, 0x353f, 0x3537, 0x3556, 0x3561, 0x3558, 0xc906, 0x353b, 0x3532, 0x352e, 0x353e, 0x333b, 0x378c, 0x378d, 0x3813, 0x3816, 0x3812, 0x385b, 0x388a, 0x38d7, 0x38ce, 0x3950, 0x3951, 0x394f, 0x398e, 0x398f, 0x39f2, 0xc921, 0x3a28, 0x3a1a, 0x3a25, 0x3a1d, 0x3a14, 0x3a20, 0x3a1f, 0x3a1b, /* 0x2f */ 0x3a17, 0x3a15, 0x3a1c, 0x3a13, 0xc925, 0x3b60, 0x011c, 0x3b66, 0x3be3, 0x3bde, 0x3be0, 0x3be1, 0x3c1a, 0x3c1b, 0x3c18, 0x3c1c, 0x3c19, 0x3c42, 0x3c40, 0x3c3e, 0x3c44, 0x3c74, 0x3c43, 0xc92d, 0x3cf2, 0x3d1b, 0x3d19, 0x3d1e, 0xc930, 0x3d5e, 0x3d66, 0x3d5d, 0x3d5a, 0x3d5f, 0x3d60, 0x3d5b, 0x3d5c, 0x3d59, 0x3df0, 0x3df1, 0x3e43, 0x3e40, 0x3e42, 0x3e41, 0x3e3f, 0x3f57, 0x3f69, 0x3f6f, 0x3fab, 0x3f71, 0x3f93, 0x3f56, 0x3f90, 0x3f6d, 0x3f6c, 0x3f70, 0x3f66, 0x3f67, 0x43d7, 0x43b5, 0x43db, 0x43d8, 0x43d5, 0x43d4, 0x44ba, 0x44b7, 0x44be, 0x44b9, 0x0237, 0x44e0, 0x44dd, 0x44de, 0x7918, 0x44d8, 0x44bd, 0x44db, 0x471d, 0x4725, 0x4921, 0x490c, 0x4929, 0x492d, 0x491b, 0x490e, 0x491f, 0x4904, 0x491c, 0x4905, 0x4906, 0x4920, 0x490d, 0x492a, 0x4923, 0x4911, /* 0x30 */ 0x4b5c, 0x4b66, 0x4b5b, 0x4b4f, 0x4b5e, 0x4b5d, 0x4bf1, 0x4bea, 0x4bf4, 0x4beb, 0x4bf0, 0x4bfa, 0x4bfb, 0x4d28, 0x4d2c, 0x4d6b, 0x4d2a, 0x4d6a, 0x4d6f, 0x4ddb, 0x4de0, 0x7fd1, 0x4de3, 0x4de5, 0x4de7, 0x4e4d, 0x4e55, 0x4e54, 0x4e53, 0x4e52, 0x4e4e, 0x4e60, 0x53c0, 0x4f0f, 0x4f11, 0x4f13, 0x4fc6, 0x4fb3, 0x4fc7, 0x4fd2, 0x4fb8, 0x4fac, 0x4fae, 0x4fcf, 0x4fc5, 0xc97b, 0x4fcc, 0x4fab, 0x4fc9, 0x4fb9, 0x51fb, 0x51f8, 0x51f7, 0x51f9, 0x5220, 0x523b, 0x5239, 0x529e, 0x529a, 0x52aa, 0x52ab, 0x52af, 0x5296, 0x52a9, 0x52a6, 0x5291, 0x0443, 0x52ae, 0x529f, 0x52ac, 0x52a0, 0x5392, 0x5391, 0x53bf, 0x5417, 0x540a, 0x540c, 0x554a, 0x5546, 0x5534, 0x5545, 0x5543, 0x5544, 0xc993, 0x5587, 0x5586, 0x558a, 0x55da, 0x55d8, 0x04b4, 0x3818, 0x3434, 0x55d6, 0x55d4, /* 0x31 */ 0x5654, 0x5659, 0x565a, 0x5657, 0x04e0, 0x56dd, 0x56e9, 0x56e0, 0x5805, 0x5812, 0x5813, 0x5807, 0x5816, 0x5823, 0x5802, 0xc9a1, 0x584a, 0x5836, 0x5840, 0x5856, 0x5843, 0xc9a0, 0x584b, 0x5846, 0x583e, 0x5849, 0x5ba7, 0x5bb6, 0x5ba6, 0x5ba8, 0x5bac, 0x5ba9, 0x5bab, 0x5c38, 0x5c37, 0x5c39, 0x5c41, 0x5c3e, 0x5cc0, 0x5cbb, 0x5cbf, 0x5cbd, 0x5cfe, 0x5d1e, 0x5cee, 0x5cfc, 0xc9b7, 0x5cf9, 0x5d06, 0x5ce4, 0x5ce9, 0x5ce5, 0x5d03, 0x5cfd, 0x5d49, 0x60be, 0x610a, 0x8626, 0x6118, 0x610d, 0x610f, 0x610e, 0x6120, 0x6271, 0x6299, 0x62e2, 0x62df, 0x62de, 0x6378, 0x6379, 0x06e4, 0x637c, 0x637d, 0x6384, 0x638b, 0x638a, 0xc9d2, 0x6389, 0x652c, 0x6529, 0x656c, 0x2104, 0x6609, 0x6608, 0x660c, 0x660d, 0x6610, 0x0826, 0x699f, 0x6998, 0x69a2, 0x699a, 0x6ad5, 0x6ae2, /* 0x32 */ 0x6af0, 0x6aea, 0x6aeb, 0x6aed, 0x6ae8, 0x6ae0, 0x6b85, 0x6b86, 0x6bf0, 0x5046, 0x6c45, 0x6c38, 0x6c3e, 0x6c42, 0x6c40, 0x6d47, 0x6d5c, 0x6d5e, 0x6db4, 0x6dc2, 0x6e14, 0x6de5, 0x6e15, 0x6e11, 0xc9ff, 0x6dee, 0x6de7, 0x6df5, 0x6df4, 0x6de8, 0x6e01, 0x6def, 0x6df1, 0xca00, 0x71db, 0x71bf, 0x71da, 0x71c7, 0x71dd, 0xca1a, 0x71eb, 0x71e1, 0x71c1, 0x71bd, 0x7507, 0x74fd, 0x7501, 0x750a, 0x7503, 0x7572, 0x7574, 0x7575, 0x75b2, 0x75b1, 0x75b4, 0x764c, 0x7642, 0x7640, 0x7649, 0x763c, 0x764d, 0x764a, 0x763b, 0x7761, 0x7774, 0xca26, 0x777f, 0x777a, 0x7788, 0x777c, 0x0a6f, 0x7770, 0x790f, 0x7928, 0x7913, 0x792a, 0x7aed, 0x7aef, 0x7b2e, 0x7bc1, 0x7bdd, 0x3e47, 0x7c2d, 0x7c2b, 0x7c35, 0x7c2f, 0x7c31, 0x7c34, 0xca35, 0x7c30, 0x7d3a, 0x7d39, 0x7d37, 0x7d4b, /* 0x33 */ 0x7d54, 0x7d4d, 0x7d51, 0x7d47, 0x7f27, 0x7f50, 0x7f4d, 0x7f4e, 0x7f54, 0x7fd2, 0x7fce, 0x804b, 0x8049, 0x8105, 0x810f, 0x8119, 0xca43, 0x8106, 0x810c, 0x8129, 0x8104, 0x8108, 0x8125, 0x0c1c, 0x8103, 0x8127, 0x8110, 0x810a, 0xca42, 0x985d, 0x83aa, 0x83ab, 0x83a9, 0x8441, 0x843a, 0x843c, 0x842b, 0x8449, 0x8615, 0x0d00, 0x8616, 0xca53, 0x8631, 0x6d4a, 0x873c, 0x877c, 0x876d, 0x876a, 0x8763, 0x876b, 0x877b, 0x8764, 0x877a, 0x8769, 0x876f, 0x8937, 0x8935, 0x893c, 0x8936, 0x893d, 0x893e, 0x8ae1, 0x8ae0, 0x8c2d, 0x8c2b, 0x8d8d, 0x8d92, 0x0eb6, 0x8d8e, 0xca6b, 0x8d91, 0x8d96, 0x8f7b, 0x8f78, 0x8f81, 0x8f96, 0x8fa3, 0x8f95, 0x8f97, 0x9054, 0x9052, 0x90f5, 0x9100, 0x90fb, 0x90f4, 0x90f6, 0x91e8, 0x91ea, 0x933e, 0x933d, 0x933b, 0x9380, 0x0fe4, 0x9388, /* 0x34 */ 0x9381, 0x9382, 0x93ce, 0x9383, 0x9377, 0x9379, 0x9373, 0x936d, 0x9370, 0x938d, 0x9375, 0x938c, 0x936a, 0x9391, 0x9389, 0x938e, 0x44dc, 0x95ff, 0x9659, 0x96c7, 0x9712, 0x9714, 0x9713, 0x97cb, 0x9842, 0x10ad, 0x983d, 0x2aff, 0x9840, 0x9844, 0x9862, 0x9843, 0x983f, 0x9845, 0x983c, 0xca97, 0x9846, 0x9847, 0xcab3, 0x9c9e, 0x9c9d, 0x9d2c, 0x9d29, 0x9d2f, 0x9d2e, 0x9d30, 0x9fe1, 0x9fe2, 0xa00e, 0xa019, 0xa012, 0xa2b4, 0xa5da, 0xa726, 0xa859, 0xa85a, 0xa888, 0xa9c0, 0xa9ba, 0xaba0, 0xcadd, 0xaba2, 0xad86, 0x2fec, 0xad9d, 0xad88, 0xad8f, 0xad8e, 0xad9b, 0xafc1, 0xafc3, 0xafc4, 0xaf96, 0xafc7, 0xafc6, 0xafbf, 0x14c3, 0xb20f, 0xb555, 0xb542, 0xb546, 0xb54b, 0xb543, 0xb553, 0xb548, 0xb549, 0xb54a, 0xb54e, 0x7bde, 0x3991, 0xbb4b, 0xbd80, 0xbd81, 0xbd83, /* 0x35 */ 0x358a, 0xbd82, 0x5542, 0x3c22, 0x3370, 0x3371, 0x33bc, 0x4f18, 0x33be, 0x33ba, 0x33f8, 0x3437, 0x3435, 0x3dfc, 0x3456, 0x3459, 0x345e, 0x356d, 0x3591, 0x3592, 0x3568, 0x3566, 0x3573, 0x0067, 0x3596, 0x358b, 0x358c, 0x3796, 0x37ee, 0x381c, 0x381a, 0x3819, 0x381b, 0x385d, 0x385e, 0xc918, 0x38dc, 0x38e2, 0x3952, 0x3992, 0x3a30, 0x3a52, 0x3a42, 0x3a41, 0x3a45, 0x3a37, 0x3a40, 0x3a3f, 0x3a3d, 0x3a38, 0x3a3a, 0x3a49, 0x3b6b, 0x3b78, 0x3b79, 0xc926, 0x3b6c, 0x3be9, 0x3be6, 0x3be5, 0x3bea, 0x3be7, 0x3be8, 0x3c1f, 0x3c4b, 0x3c4a, 0x3c53, 0x3c76, 0x3ca3, 0x3ca4, 0x3cf6, 0x3cf3, 0x3cf9, 0x3cf7, 0x3cfc, 0x3d1d, 0x3d6d, 0x3d71, 0x3d6c, 0x3d6e, 0x3d70, 0x3d6f, 0x3d67, 0x3d68, 0x3dfa, 0x3df9, 0x3e4e, 0x19de, 0x3e4d, 0x3e4f, 0x3e4a, 0x3e4c, 0x0196, 0xc942, /* 0x36 */ 0x3fee, 0x3fb2, 0x3fc0, 0x3fc1, 0x3ff4, 0x3fc8, 0x3fc5, 0x3fc6, 0x3fad, 0x43e2, 0x43ea, 0x43e3, 0x43e1, 0x44f7, 0x4501, 0x4512, 0x44f6, 0x44f1, 0x451f, 0x44ee, 0xc952, 0x44f3, 0x4515, 0x4516, 0x4517, 0x44f8, 0x4519, 0x44f2, 0x44f4, 0x44f5, 0x4513, 0x4506, 0x4726, 0x4724, 0x475a, 0x60c8, 0x4797, 0x4795, 0x479a, 0x481f, 0x3dfb, 0x4829, 0x4820, 0xc962, 0xc963, 0x494c, 0x4930, 0x4938, 0x493d, 0x4951, 0x494f, 0x494a, 0x4934, 0x4936, 0x1b30, 0x4b6a, 0x4b68, 0x4c1c, 0x4c0e, 0x4c1e, 0x0359, 0x4c09, 0x4c08, 0x4c13, 0x4c01, 0x4c0f, 0x4c14, 0x4c06, 0x4c07, 0x1cb2, 0xc973, 0x0376, 0x4d79, 0x4dea, 0x4ded, 0x4de9, 0x4dee, 0x4e68, 0x4e64, 0x4e67, 0x4e72, 0x4e62, 0x4e74, 0x4e79, 0x4f19, 0x4f17, 0x4f15, 0x4f16, 0x4fe6, 0x8fa4, 0x4fee, 0x03d2, 0x4fdf, 0x4fe4, /* 0x37 */ 0x4fda, 0x4fea, 0x4fed, 0x4fe3, 0x4fe9, 0x51fd, 0x3957, 0x5221, 0x52c6, 0x52b8, 0x52cb, 0xc985, 0x52bd, 0x52b5, 0x52bb, 0x52bf, 0x52be, 0x52b2, 0x52c1, 0x52c2, 0x5399, 0x53c6, 0x542c, 0x542d, 0x5425, 0x541e, 0x541f, 0x5423, 0x5550, 0x554e, 0x554d, 0x5552, 0x55e9, 0x55ec, 0x55e8, 0x5658, 0x565c, 0x565b, 0x568f, 0x6a72, 0x56f6, 0x5700, 0x56fc, 0x56f8, 0x56ea, 0x56fe, 0x56f7, 0x56fd, 0x5870, 0x5862, 0x5844, 0x0520, 0x584d, 0x584c, 0x583f, 0x5866, 0x5835, 0x0529, 0x5834, 0x588d, 0x5884, 0x0538, 0x5886, 0x5889, 0x5887, 0x5883, 0x5875, 0x5879, 0x58af, 0x58b0, 0x5bb7, 0x5bbb, 0x5bb9, 0x5c46, 0x5c47, 0x5c45, 0x5cea, 0x5cf6, 0x5d68, 0x5d39, 0xc9b9, 0x5d3d, 0x5d3b, 0x5d4d, 0x5d30, 0x5d4a, 0x5d3e, 0x5d40, 0x5d4c, 0x5d47, 0x5d38, 0x5d52, 0x5d3a, 0x5d53, /* 0x38 */ 0x60c4, 0x60c1, 0x611c, 0x611d, 0x612a, 0x611e, 0x612f, 0x6122, 0x612e, 0x6125, 0x0689, 0x06b0, 0x624a, 0x624b, 0x6276, 0x06bf, 0x62e8, 0x62ef, 0x62e9, 0x06c5, 0x62ea, 0xc9cc, 0x06ea, 0x639b, 0x639e, 0x6393, 0x63a7, 0x639c, 0x63a0, 0x639a, 0x63ab, 0x63be, 0x63a9, 0x652d, 0x656e, 0x6644, 0x663d, 0x663a, 0x6668, 0x663c, 0x666a, 0xc9e0, 0x6638, 0x6665, 0x6639, 0x666d, 0x6636, 0xc9e3, 0x663e, 0x667e, 0x6637, 0x6999, 0x69a9, 0x69ad, 0x69a7, 0x69a8, 0x6a66, 0x6a69, 0x6a6d, 0x6a67, 0x6a6b, 0x6a6a, 0x6aee, 0x6b01, 0x6b03, 0x6af4, 0x6afb, 0x0837, 0x6af6, 0x6afc, 0x6bf4, 0x6c08, 0x6c0a, 0x6c09, 0x6c6d, 0x6c62, 0x6c41, 0x6c5e, 0x6c5c, 0x6df3, 0x6e26, 0x08e4, 0x6e39, 0xca04, 0x6e6c, 0x6e2b, 0x6e2e, 0x6e3b, 0x6e5e, 0x6efb, 0x6e27, 0x6e24, 0x6e69, 0x6e30, /* 0x39 */ 0xca05, 0x6e62, 0x6e38, 0x6e35, 0x6e2a, 0x6e2c, 0x6e68, 0x6e31, 0x6e2f, 0x6e2d, 0x6e3a, 0x6e36, 0xca03, 0x6e21, 0x6e3c, 0x6e20, 0x6e64, 0x6e3e, 0x08e8, 0x71f7, 0x7212, 0x71f1, 0x71f5, 0x7222, 0x71f2, 0x71df, 0x7215, 0x7216, 0x757a, 0x7576, 0x75be, 0x0a20, 0x75bd, 0x7609, 0x7608, 0x7657, 0x77a3, 0x77bf, 0x77b8, 0x77af, 0x779c, 0x77a5, 0x7772, 0x7775, 0x779d, 0x7799, 0x77b9, 0x794e, 0x7939, 0x793b, 0x7935, 0x793c, 0x7955, 0x7af0, 0x7af3, 0x7af4, 0x7b3b, 0x7b3c, 0x7b3a, 0x7b36, 0x7c07, 0x3feb, 0x7c55, 0x7c50, 0x7c4f, 0x7c52, 0x7c56, 0x33bd, 0x7c32, 0x7d63, 0x7d6b, 0x7d66, 0x7d57, 0x7d5d, 0x0b86, 0x7d6d, 0x7d61, 0x7d69, 0x7d5a, 0x7d5c, 0x7d62, 0x7f2a, 0x7f29, 0x7f58, 0x7f5a, 0x7fd7, 0x7fdb, 0x7fdc, 0x7fdd, 0x7fd8, 0x8054, 0x805b, 0x805c, 0x8053, /* 0x3a */ 0x804f, 0x8056, 0x8050, 0x805a, 0x806b, 0x8136, 0x8153, 0x813a, 0x813c, 0x813e, 0x8149, 0x8140, 0xca46, 0xca47, 0x8364, 0x8365, 0x83b5, 0x83b6, 0x83b2, 0x8448, 0x844a, 0x8472, 0x8469, 0x845a, 0x844c, 0x862c, 0x8630, 0x864b, 0x8649, 0x8642, 0x8644, 0x864a, 0x864f, 0x8792, 0xca57, 0x8797, 0x8780, 0x8782, 0x8786, 0x8953, 0x895e, 0x8952, 0x895b, 0x894e, 0x8a6d, 0x8a6e, 0x8afa, 0x8af6, 0x8afb, 0x8c33, 0x8c3d, 0x8c37, 0x8c3e, 0x8c35, 0x8d9a, 0x8dab, 0x8da6, 0x8db0, 0x8d99, 0x8da0, 0x8d9e, 0x8da8, 0x8da1, 0x8daa, 0x8dad, 0x8dbb, 0x8d9c, 0x8da5, 0x33b3, 0x8f27, 0x8f8d, 0x8f8e, 0x8f8f, 0x8f92, 0x0f56, 0x8f91, 0x8fad, 0x9057, 0x9058, 0x905e, 0x905d, 0x905c, 0x905b, 0x0f67, 0x910a, 0x9103, 0x910e, 0x91b8, 0x924d, 0x923f, 0x9247, 0x924b, 0x924a, 0x923d, /* 0x3b */ 0x2838, 0x9241, 0x924c, 0x2881, 0x9362, 0x9369, 0x9361, 0x0fd1, 0x93aa, 0x93a6, 0x93ac, 0x93bd, 0x93bb, 0x93a4, 0x93ba, 0x939a, 0x0feb, 0x93a1, 0x93c1, 0x95e0, 0x960a, 0x9603, 0x9606, 0x9639, 0x963a, 0x9636, 0x965b, 0x965f, 0x965e, 0x9667, 0x9661, 0x9662, 0x965d, 0x96ca, 0x96cc, 0x96ce, 0x9718, 0x971d, 0x971f, 0x9720, 0x9717, 0x9715, 0x981f, 0x9827, 0x9826, 0x5010, 0x988b, 0x98ae, 0x988a, 0xca99, 0x9892, 0x9889, 0x9887, 0x10b6, 0x988f, 0x9884, 0x9883, 0x988c, 0x9893, 0x988d, 0x9898, 0x987d, 0x987e, 0x98d2, 0x9880, 0x9899, 0x9cac, 0x9d50, 0x9d55, 0x9d42, 0x9d3f, 0x9d3c, 0x11a3, 0x9d4c, 0x9d49, 0x9d57, 0x9d58, 0x9d4f, 0x9d5c, 0x9d47, 0xcab7, 0x9fab, 0x1210, 0x9faf, 0x9fad, 0x9fe8, 0x9fe7, 0xa030, 0xa026, 0xa02f, 0xa028, 0xa02b, 0xa01d, 0xa02d, /* 0x3c */ 0xa020, 0xa02a, 0xa02c, 0xa035, 0xa021, 0xa023, 0xa024, 0xa036, 0xa037, 0xa1e9, 0xa2ba, 0xa2b8, 0xcacc, 0xa36d, 0xa36a, 0xa368, 0xa369, 0xa36b, 0xa361, 0xa5dc, 0xa5db, 0xa62d, 0xa62c, 0xa6a2, 0xa72b, 0xa732, 0xcad7, 0xa894, 0xa892, 0xa890, 0xa9c9, 0xa9c4, 0xa9c1, 0xa9c3, 0xa9cd, 0xab14, 0xaba7, 0xabaf, 0xabaa, 0xad0d, 0xad54, 0xad5b, 0xad61, 0xadae, 0xadb3, 0xadc0, 0xadc4, 0xadbf, 0xadcb, 0xadad, 0xada7, 0xada4, 0xadbd, 0xadaf, 0xadb2, 0xada5, 0xafe7, 0xafe0, 0xafce, 0xafde, 0xafd5, 0xafdf, 0xafd9, 0xb0f2, 0xb223, 0xb240, 0x151b, 0xb23e, 0x1587, 0xb3cf, 0x3e54, 0xb55b, 0xb558, 0xb562, 0xb55f, 0xb567, 0xb563, 0xb55e, 0xb560, 0xb685, 0xb686, 0xb687, 0xb8e8, 0xb8e6, 0xbd71, 0xbd85, 0xcb02, 0xbd86, 0xbe10, 0x3cf8, 0x33bf, 0x3e61, 0x33fe, 0x33fc, /* 0x3d */ 0x3439, 0x3461, 0x3460, 0x35e2, 0x35ea, 0x35e3, 0x35b4, 0x35ae, 0x35be, 0x35b8, 0x35a8, 0x35aa, 0x35a9, 0x35b3, 0x35d5, 0x35ad, 0x35b9, 0x35bb, 0x35b1, 0x35c2, 0xc908, 0x35eb, 0x35ba, 0x35d2, 0x35d4, 0x37f1, 0x381d, 0xc912, 0x3862, 0x388c, 0x38e6, 0x38e7, 0x395a, 0x3958, 0x3959, 0x3996, 0x3997, 0x3a61, 0x3a67, 0x3a71, 0x3a65, 0x3a7d, 0x3a7e, 0x3b7d, 0x3b84, 0x3b7c, 0x3b7e, 0x3b7f, 0x3b80, 0x3bef, 0x3bf4, 0x3c1e, 0x3c4e, 0x3cfb, 0x3cfa, 0x3cfd, 0xc931, 0xc932, 0x3d79, 0x3d7c, 0x3d7d, 0x3d84, 0x3d7b, 0x3d78, 0x0157, 0x3e5e, 0x3e5a, 0x3e5c, 0x3e59, 0x3e55, 0x3e63, 0x3e56, 0x3e5f, 0x3e60, 0x3e5b, 0x404a, 0x4065, 0x40b3, 0x402c, 0x4077, 0x403d, 0x4052, 0x4061, 0x402a, 0x403e, 0x4034, 0x4029, 0x40b2, 0x40ad, 0x4040, 0x4053, 0xc944, 0x403f, 0x4041, /* 0x3e */ 0x4072, 0x43f6, 0x43f5, 0x43f4, 0x43f2, 0x43f9, 0x4527, 0x4554, 0x4555, 0x452e, 0xc954, 0xc953, 0x452c, 0x4538, 0x4539, 0x4531, 0x454f, 0x4573, 0x4530, 0x452b, 0x4551, 0x472c, 0x475b, 0x475c, 0x4768, 0x476c, 0x476b, 0x4769, 0x479f, 0x4838, 0x483c, 0x483a, 0x4835, 0x029d, 0x4839, 0x4836, 0x483b, 0x4960, 0x4961, 0x4963, 0x4964, 0x4994, 0x4993, 0x495e, 0x4968, 0x496a, 0x4965, 0xc966, 0x4990, 0x495f, 0x4972, 0xc965, 0x4c3c, 0x4c27, 0x4c24, 0x4c26, 0x4c25, 0x035f, 0x4c28, 0x4c36, 0x4d31, 0x4d30, 0x4d34, 0x4d81, 0x4d7d, 0x4d82, 0x4d80, 0x0379, 0x35d3, 0x4df2, 0x4e66, 0x4e8c, 0x4e7b, 0x4e83, 0x0398, 0x4e8e, 0x4e7a, 0x4e92, 0x4e91, 0x4e82, 0x4f1b, 0x4f1c, 0x5027, 0x5021, 0x03dc, 0x1d2b, 0x5043, 0x03df, 0x5018, 0x507b, 0x501a, 0x504b, 0x504a, 0x504d, /* 0x3f */ 0x504f, 0x5019, 0x5035, 0x5013, 0x5052, 0x5014, 0x501e, 0x502c, 0x5020, 0x5022, 0x5012, 0x501f, 0x5200, 0x5223, 0x5240, 0x5243, 0x52e4, 0x52db, 0x52ea, 0x52dd, 0x52cc, 0x52d9, 0x52e8, 0x52f6, 0x52e3, 0x52d3, 0x52da, 0x52d6, 0x52e7, 0x543a, 0x543f, 0x5440, 0x5448, 0x5459, 0x5437, 0x5444, 0xc98c, 0xc98b, 0x5455, 0x5439, 0x5554, 0x5555, 0x5556, 0x5557, 0x5558, 0x5559, 0x558d, 0x55f2, 0x55f8, 0x55f5, 0x55f6, 0x55fc, 0x55fe, 0x55f1, 0x55fd, 0x565e, 0x5696, 0x5697, 0x569c, 0x569b, 0x5695, 0xc99a, 0x571a, 0x5709, 0x5704, 0x570e, 0x571c, 0x5718, 0x570d, 0x5710, 0x570c, 0x5703, 0x587b, 0x58a6, 0x5877, 0x5888, 0x5874, 0x58da, 0x5876, 0x5878, 0x588a, 0x588f, 0x587d, 0x5890, 0x58ed, 0x58d9, 0x58d0, 0x591a, 0x58d7, 0x58e2, 0x58e1, 0x58c5, 0x58e0, 0x58ca, /* 0x40 */ 0x5925, 0x58cc, 0xc9b3, 0x5bc6, 0x5bc1, 0x5c4d, 0x5d4b, 0x5d64, 0x5d95, 0x5d99, 0xc9bc, 0x5d94, 0x5da2, 0x5dae, 0x5d9e, 0x5da7, 0x5d86, 0x05fd, 0x5da4, 0x5d91, 0x5d93, 0xc9bb, 0x5d88, 0x60cd, 0x60ca, 0x613f, 0x6140, 0x6146, 0x6141, 0x6145, 0x6158, 0x613b, 0x6148, 0x624e, 0x6252, 0x624f, 0x627b, 0x627a, 0x62a0, 0x629f, 0x62fb, 0x62f7, 0x63b8, 0x63b9, 0x63bb, 0x63b7, 0x06f4, 0x63ba, 0x06ef, 0x63da, 0x63b5, 0x63bf, 0x63bc, 0x63c0, 0xc9d3, 0xc9d9, 0x6575, 0x6579, 0x6576, 0x6635, 0x6640, 0x66c0, 0x6681, 0x66ad, 0x66af, 0x66ac, 0x668f, 0x66a8, 0x66aa, 0x66a9, 0x6688, 0x667f, 0x6680, 0x66bc, 0x69ae, 0x69bb, 0x69bd, 0x0831, 0x6a78, 0x6a74, 0x6b0c, 0x6b11, 0x6b08, 0x6b06, 0x6b10, 0x6b8f, 0x6b90, 0x6b8d, 0x6b8e, 0x6b96, 0x6b95, 0x6c0b, 0x6c0c, 0x6c7c, /* 0x41 */ 0x6c73, 0x6c75, 0x6c76, 0x6c7d, 0x6c78, 0x6c71, 0x6d4b, 0x6d4e, 0x6e33, 0x6e32, 0x0903, 0x6e91, 0x6ee7, 0x6ee9, 0x6ea2, 0x6e94, 0x6e87, 0x6ea3, 0x6edd, 0x6e7b, 0x6e83, 0x6e81, 0x6edf, 0x6e7c, 0x6ee4, 0x6ee2, 0x6e93, 0x6e7d, 0x6ebf, 0x6e9b, 0x6e8e, 0x6e9f, 0x0909, 0x6e8c, 0x6e7f, 0x6e9c, 0x6e84, 0x6e42, 0x6ee6, 0x7251, 0x724a, 0x7264, 0x7225, 0x722f, 0x722e, 0x722b, 0x7228, 0x7232, 0x722d, 0x7231, 0x7239, 0x722c, 0x7261, 0x7511, 0x7510, 0x7512, 0x7553, 0x7555, 0x757b, 0x7581, 0x757d, 0x757c, 0x75c2, 0x75c5, 0xca22, 0x75c4, 0xca23, 0x766b, 0x7668, 0x0a3e, 0x765c, 0x765d, 0x766a, 0xca24, 0x7c76, 0x7776, 0x0a77, 0x77c4, 0x77cb, 0x77c8, 0x77d4, 0x77d5, 0x77c9, 0x77d7, 0x0a7b, 0x7978, 0x795a, 0x795b, 0x795c, 0x7956, 0x7958, 0x7971, 0x96d4, 0x7b40, /* 0x42 */ 0xca33, 0x7b3f, 0x7b43, 0x7b41, 0x7be2, 0x7be0, 0x7be3, 0x7c66, 0x7c73, 0x7c6c, 0x7c71, 0x7c6a, 0x7c6d, 0x7c6e, 0x7c6b, 0x7d8c, 0x7d77, 0xca3a, 0x7d7f, 0x7d89, 0x7d7a, 0x7d85, 0x7d78, 0x7d8a, 0x7d86, 0x7f2c, 0x7f67, 0x7f5b, 0x7fe5, 0x7fe1, 0x8061, 0x8069, 0x806a, 0x8165, 0x816d, 0x8163, 0x8186, 0x815c, 0x8162, 0xca48, 0x8179, 0x8169, 0x8170, 0x8176, 0x815d, 0x8187, 0x816e, 0x8171, 0x817c, 0x8173, 0x815b, 0x816b, 0x83bf, 0x83c1, 0x83bd, 0x83c9, 0x83bc, 0x83c2, 0x83c0, 0x8492, 0x84a9, 0x848f, 0x8476, 0x847b, 0x8475, 0x84a4, 0x8664, 0x873d, 0x87af, 0x0d3a, 0xca58, 0x879d, 0x8799, 0x87b1, 0x8963, 0x8962, 0x8964, 0x8969, 0x0da0, 0x8a75, 0x8a73, 0x8a71, 0x8a74, 0x8b0c, 0x8b16, 0x0de5, 0x8b11, 0x8b1f, 0x8b1a, 0x8b0d, 0x8b1b, 0x8b13, 0x8c4e, 0x8c55, /* 0x43 */ 0x8c50, 0x0e7d, 0x8dd2, 0x8dd3, 0x8dd1, 0x8df1, 0x8ddc, 0x8dc8, 0x8dcc, 0x8dd0, 0x8dcf, 0x8ddf, 0x8f2b, 0x8f2e, 0x8f2d, 0x8f9d, 0x8f9e, 0x8f9f, 0x8fa9, 0x8fa0, 0x8f98, 0x8fa1, 0x8fab, 0x8faf, 0x906e, 0x905f, 0x905a, 0x0f6d, 0x9065, 0x9068, 0x9072, 0x9117, 0x9116, 0x9118, 0x9119, 0x911a, 0x9122, 0x911b, 0x911c, 0x91be, 0x91ee, 0x925a, 0x9250, 0x9258, 0x9254, 0x9257, 0x9256, 0x9315, 0x939b, 0x9393, 0x9392, 0x9372, 0x9398, 0x9399, 0x93df, 0x0ff8, 0x93d5, 0x2958, 0x93d4, 0x93f3, 0x93f4, 0x93e7, 0x93e1, 0x93e6, 0x93eb, 0x93ec, 0x35db, 0x1050, 0x960d, 0x960c, 0x4d2f, 0x9668, 0x9665, 0x966b, 0x9669, 0x96d1, 0x96d3, 0x9727, 0x9728, 0x1068, 0x1067, 0x9724, 0x97d7, 0x98ca, 0x98c7, 0xca9e, 0x98d8, 0x98e1, 0x98c6, 0x98f8, 0x98c3, 0x98f4, 0x9917, 0x98ea, /* 0x44 */ 0x98cb, 0x9886, 0x98c4, 0x98d9, 0x9919, 0x98c2, 0x98e2, 0x10cf, 0x98de, 0x98ed, 0xca9c, 0x10cd, 0x991d, 0x98dd, 0x98db, 0x98e8, 0x98e9, 0x98bf, 0x98e0, 0x98d1, 0x98dc, 0x98ce, 0x991e, 0x98cc, 0x98f2, 0x98f3, 0xca9f, 0xcaa2, 0xcaa3, 0xcaa1, 0x9cab, 0x9caa, 0x9ca7, 0x9ca9, 0x9d88, 0x9d75, 0x9d60, 0x9d6c, 0x9d73, 0x11ab, 0x9d6e, 0x9d74, 0x9d76, 0x9d68, 0x9d77, 0x9d86, 0x9fea, 0xa051, 0xa050, 0xa058, 0xa04d, 0xa04f, 0xa04e, 0xa05c, 0xa052, 0xa044, 0xa04a, 0xa04b, 0xa1ea, 0xa210, 0xa211, 0xa2cd, 0xa2bf, 0xa2c4, 0xa2d0, 0xa2ce, 0xa2c0, 0xa2c2, 0xa2cf, 0xa2c9, 0xa2bb, 0xa397, 0xa392, 0xa36f, 0xa37e, 0xa39a, 0x12c1, 0xa386, 0xa373, 0x2d24, 0xa377, 0xa38f, 0xa370, 0xa381, 0xa382, 0xa399, 0xa37d, 0xa37f, 0xa37b, 0xa387, 0xa5b2, 0xa62f, 0xa634, 0xa62e, /* 0x45 */ 0xa632, 0x1347, 0xa6aa, 0x1357, 0xa6a9, 0xa738, 0xa736, 0xa737, 0xa747, 0xa733, 0xa739, 0xa735, 0xa744, 0xa8a5, 0xa8a6, 0xa89e, 0xa9e3, 0xa9df, 0xa9d3, 0xa9f1, 0xa9e4, 0xa9e0, 0xa9d6, 0x2ec3, 0xa9e6, 0xa9d8, 0xa9de, 0xa9db, 0xa9dc, 0xab1b, 0xab1f, 0xab1d, 0xab1c, 0xab1e, 0xab20, 0xab21, 0x144e, 0xabb6, 0xabbc, 0xabc6, 0xabc7, 0xabba, 0xabbe, 0xabbd, 0xabb5, 0xabb4, 0xad0f, 0xad62, 0xadeb, 0xadd9, 0xade4, 0xadd7, 0xadd8, 0xadd6, 0xadce, 0xaddd, 0xade7, 0xadd2, 0xadc5, 0xadc9, 0xaddb, 0xaf92, 0xaf8a, 0xaf8b, 0xaf89, 0xb008, 0xb003, 0xb006, 0xb005, 0xaff5, 0xb00b, 0xaffb, 0xb0fc, 0xb101, 0xb102, 0xb0fa, 0xb108, 0xb0f7, 0xb100, 0xb0ff, 0xb106, 0xb0f6, 0xb0fb, 0xb10a, 0xb225, 0xb243, 0xb244, 0xb364, 0xb362, 0xb35e, 0xb35b, 0xb3d6, 0x3372, 0x33c2, /* 0x46 */ 0xb577, 0xb582, 0xb57c, 0xb57d, 0xb586, 0xb581, 0xb584, 0xb576, 0xb583, 0xb57f, 0xb57e, 0xb688, 0xb68d, 0xb68b, 0xb691, 0xb68f, 0xb77c, 0xb779, 0xb77a, 0xb8ea, 0xbb4c, 0xbc99, 0x35d1, 0xbd8b, 0xbd8d, 0xbd8a, 0xbd8e, 0xbe11, 0x5456, 0xcb15, 0x3374, 0x33c3, 0x33c4, 0x341b, 0x345f, 0x346a, 0x3469, 0x346b, 0x360c, 0x35f6, 0x35ed, 0x3629, 0x35fe, 0x35f1, 0x3617, 0x35ff, 0x35ee, 0x35fd, 0x361c, 0x35fc, 0x3600, 0x3620, 0x0077, 0x35f9, 0x3667, 0x3608, 0x379e, 0x37f3, 0x3825, 0x3827, 0x381f, 0x3865, 0x3863, 0x3894, 0x3897, 0x38f1, 0x395f, 0x3962, 0x18f2, 0x3960, 0xc922, 0x3a8c, 0x3a82, 0x3a90, 0x3a8b, 0x3a8d, 0x3a81, 0x3a9d, 0x3b8e, 0x3b8f, 0x3b92, 0x3c23, 0x3c52, 0xc92e, 0x3d00, 0x3d01, 0x3d02, 0x3d1f, 0x3d8c, 0x3d89, 0x3d8b, 0x3d88, 0x3d8d, 0x3d8f, /* 0x47 */ 0x9085, 0x3e00, 0x3e05, 0x3e01, 0x3e68, 0x3e6e, 0x3e67, 0x3e75, 0x1ab6, 0xc945, 0x40d7, 0xc946, 0x3348, 0x40d4, 0x40d8, 0xc947, 0xc948, 0x40ba, 0xc949, 0x40db, 0x40bf, 0x4135, 0x40bc, 0x40d9, 0x01c4, 0x40dd, 0x4100, 0x40d5, 0x4130, 0x40bd, 0x40dc, 0x43fd, 0x43fe, 0x4407, 0x7517, 0x456f, 0x4569, 0x4570, 0x4567, 0x45a9, 0x4595, 0x4590, 0x456c, 0x4597, 0x4571, 0x0252, 0x4574, 0x456d, 0x458e, 0x472f, 0xc61b, 0x47a9, 0x484e, 0xc95f, 0x485a, 0x4848, 0x4855, 0x484c, 0x4849, 0x484f, 0x484a, 0x49d6, 0x49a0, 0x49a9, 0xc967, 0x499d, 0x49d4, 0x49a4, 0x49a8, 0x49a6, 0x49e6, 0x4b7d, 0x4b77, 0x4b7a, 0x4c41, 0x4c49, 0x4c59, 0x4c45, 0x4c48, 0x4c40, 0x4d8e, 0x4d95, 0x4d90, 0x4df7, 0x4df8, 0x4df6, 0x4dfb, 0x4e9e, 0x4e9d, 0x4e99, 0xc977, 0x4ea3, 0x4ea9, 0x4e98, /* 0x48 */ 0x4ea0, 0x4e96, 0x4e94, 0x4e95, 0x4e9f, 0x4ea1, 0x4f21, 0x4f1d, 0x4f1f, 0x506d, 0xc97c, 0x509a, 0x5092, 0x507a, 0x507d, 0x50a1, 0x509d, 0x5099, 0x506b, 0x506e, 0xc97d, 0x5245, 0xc984, 0x52fb, 0x52eb, 0x52f2, 0x52f9, 0xc986, 0x52f8, 0x52ed, 0x5301, 0x52f7, 0x5306, 0x539b, 0x53ca, 0x046b, 0x1ec3, 0x546b, 0x546c, 0x5474, 0x5467, 0x545b, 0x5460, 0x5476, 0x5463, 0x5461, 0x5528, 0x555b, 0x555e, 0x5560, 0x555d, 0x555c, 0x55f4, 0x5600, 0x5608, 0x5607, 0x5601, 0x5605, 0x5664, 0x5663, 0x569e, 0x56a0, 0x56a1, 0x569f, 0x5726, 0x572d, 0x5728, 0x571d, 0x58ec, 0x58e3, 0x58eb, 0x5916, 0x58c8, 0x931b, 0x58e9, 0x58e4, 0x5924, 0x58d1, 0x0541, 0x58dd, 0x58c2, 0x58cb, 0x58c7, 0x58e7, 0x0550, 0x58ea, 0x594b, 0xc9a5, 0x5960, 0x597d, 0x593e, 0xc9a4, 0x5952, 0x594e, /* 0x49 */ 0x593c, 0x5932, 0x5930, 0x5923, 0x5bca, 0x5bcb, 0x5bc9, 0x5bc8, 0x5bcd, 0x5d98, 0x5da0, 0x5d9f, 0x5d9c, 0x5da3, 0x5d97, 0xc9be, 0x5df1, 0x5e09, 0x5e03, 0x5dea, 0x5e45, 0x5ded, 0x5e05, 0x5e1a, 0x5e15, 0x5e01, 0x5dec, 0x5e0e, 0x5e17, 0x5e42, 0x5e12, 0x5e10, 0x5def, 0x5dff, 0x5e00, 0x5e0c, 0x5e0f, 0x5e04, 0x5e08, 0x5e14, 0x5e43, 0xc9bd, 0x5e1b, 0x5e11, 0x5e13, 0x60cf, 0x60ce, 0x616f, 0x616e, 0x617a, 0x6170, 0x6164, 0x615e, 0x616c, 0xc9c9, 0x615b, 0x6161, 0x6165, 0x627f, 0x6280, 0x627c, 0x62a7, 0x62a6, 0x62a1, 0x06c0, 0x62a8, 0x62a3, 0x62a2, 0x62ad, 0x62a5, 0x6301, 0x62ff, 0x62fc, 0x6300, 0x6335, 0x63ee, 0x63ef, 0x63f6, 0x63e8, 0x63ea, 0x63e3, 0x641f, 0x06fc, 0x63e4, 0x63fa, 0x63f1, 0x63fb, 0xc9d4, 0x653d, 0x653c, 0x0079, 0x6578, 0x6577, 0x100b, /* 0x4a */ 0x66d1, 0x66c7, 0x66df, 0x66d0, 0x66e0, 0x66d6, 0x66d8, 0x6716, 0x670e, 0x66d9, 0x670f, 0x6711, 0x66cd, 0x6689, 0x66ce, 0x6714, 0x66da, 0x6712, 0x66d3, 0x66c2, 0x66e1, 0x66e9, 0x66ea, 0x66de, 0x6715, 0x69d9, 0x69d6, 0x69cd, 0x69d0, 0x69d3, 0xc9f0, 0x6a82, 0x6a85, 0x6a7f, 0x6a7d, 0x6a81, 0x6a83, 0x6a84, 0xada0, 0x6b28, 0x6b0f, 0x6b17, 0x6b1a, 0x6b25, 0xc9f7, 0x6b9b, 0x6b99, 0x6c92, 0x6c8c, 0x6c95, 0x6c8d, 0x6ca3, 0x6c93, 0x6c91, 0x6edb, 0x6e99, 0x6e9a, 0x6f08, 0x6f4c, 0x6f0d, 0x6f01, 0x6f4e, 0x6f02, 0x6f4d, 0x6f21, 0x6efc, 0xca09, 0x6e8a, 0xca08, 0x6e95, 0x6f11, 0x6f12, 0x6f46, 0x6f1c, 0x6f49, 0x6f0c, 0x091e, 0x6f13, 0x6f16, 0x6efd, 0x6f0f, 0x6f1f, 0x7230, 0x726e, 0x726b, 0x729b, 0x727b, 0x7263, 0x7297, 0x726d, 0x729c, 0x7298, 0x726f, 0x7267, /* 0x4b */ 0x7269, 0x7515, 0x7563, 0x7586, 0x758a, 0x7587, 0x7588, 0x7585, 0x7589, 0x75ca, 0x75c7, 0x75cb, 0x75cc, 0x75c9, 0x760d, 0x7683, 0x7684, 0x7678, 0x7682, 0x7673, 0x7679, 0x768c, 0x77d0, 0x77cf, 0x77d2, 0x77d9, 0x77cc, 0x77eb, 0x77fd, 0x77ec, 0x77e8, 0x77f8, 0x77fa, 0xca27, 0x0a85, 0x77e1, 0x77fb, 0x78e7, 0xca2e, 0x79a5, 0x7991, 0x79a6, 0x797c, 0x7992, 0x79a2, 0x79a0, 0x7afc, 0x7afe, 0x7b57, 0x7b53, 0x7b58, 0x7be7, 0x7c8e, 0xca38, 0x7c83, 0x7c8b, 0x7c84, 0x0b97, 0x7da2, 0x7db7, 0x7da9, 0x7da5, 0x7d9f, 0x7daa, 0x7d97, 0x7da1, 0x7d9e, 0x7dab, 0x7d99, 0x7da3, 0x7f30, 0x7f32, 0x7f2f, 0x7f70, 0x7f6c, 0x7f6f, 0x7fe8, 0x7fee, 0x7fea, 0x806d, 0x8076, 0x8070, 0x8071, 0x806c, 0x81eb, 0x81b5, 0x8196, 0x8190, 0x818d, 0xca49, 0x81a2, 0x81b0, 0x8192, 0x81a0, /* 0x4c */ 0x8193, 0x81c3, 0x818e, 0x81b6, 0x819d, 0x8195, 0x81b3, 0x81a4, 0x8370, 0x83d4, 0x0c93, 0x83cf, 0x3470, 0x8494, 0x2561, 0x84c0, 0x84b4, 0x84c1, 0x0cb2, 0x84bd, 0x84af, 0x8677, 0x8678, 0x866b, 0x866d, 0x866e, 0x8672, 0x866f, 0x8671, 0x62ab, 0x868c, 0x873f, 0x87b6, 0x87b7, 0x2606, 0x87bb, 0x87b8, 0x3a9c, 0x87b9, 0x2601, 0x898b, 0x897a, 0x8984, 0x8988, 0x8991, 0x8979, 0x898e, 0x8980, 0x8982, 0x897c, 0x0da4, 0x8a84, 0x8a7f, 0x0df2, 0x8b3b, 0x8b71, 0x8b3d, 0x8b30, 0x0df1, 0x8b3e, 0x8b38, 0x8c5e, 0x8c64, 0x0e81, 0x8c5d, 0x8c6d, 0x8c4f, 0x8c62, 0x8c5f, 0x8dec, 0x8df2, 0x8df4, 0x8df7, 0x8df6, 0x8e07, 0x8ded, 0x8dea, 0x8df0, 0x8df8, 0x8df3, 0x0edc, 0xca72, 0x8f31, 0x8f2f, 0x8fb6, 0x8fae, 0x8faa, 0x8fbf, 0x8fcc, 0x8fc7, 0x9983, 0x9080, 0x907b, 0x907f, /* 0x4d */ 0x907d, 0x9083, 0xca78, 0x9146, 0x912d, 0x9125, 0x9126, 0x912c, 0x9137, 0x9131, 0x9133, 0x9132, 0x9127, 0x912a, 0x912e, 0x912f, 0x91c0, 0x9271, 0x9261, 0x9262, 0x9266, 0x9318, 0x93c5, 0x93c3, 0x93c4, 0x93c2, 0x93ae, 0x9410, 0x9408, 0x941f, 0x943a, 0x943b, 0x9436, 0x940c, 0x9406, 0x942a, 0x9457, 0x9450, 0x9420, 0xca85, 0x942c, 0x9421, 0x940b, 0x9419, 0x9435, 0x9418, 0x940f, 0x9413, 0x9455, 0x9439, 0x941a, 0x100c, 0x9417, 0x95e4, 0x95e9, 0x758b, 0x9610, 0x9612, 0x963f, 0x966e, 0x7518, 0xca8c, 0x96d6, 0x96d5, 0x96d7, 0x3e02, 0x106d, 0x9731, 0x9730, 0x973a, 0x9885, 0x986b, 0x9948, 0x994b, 0x9937, 0x997b, 0x996c, 0x9985, 0x9965, 0x9936, 0x9986, 0x9934, 0x9968, 0x995a, 0x9958, 0x9972, 0x996a, 0x98d3, 0x993c, 0x9933, 0x993b, 0x994d, 0x994f, 0x997c, /* 0x4e */ 0x99b0, 0x995b, 0x9955, 0x9964, 0x996b, 0x9953, 0x10e6, 0x9957, 0x995e, 0x996d, 0x9935, 0x9969, 0x9959, 0x9966, 0x9950, 0x9951, 0x995c, 0x9a5d, 0x9987, 0x9978, 0x9949, 0x994e, 0x98f1, 0x9973, 0x9988, 0x98cf, 0xcaa4, 0x9cb1, 0x9cb3, 0x9d9c, 0x9da4, 0x9d90, 0x9db8, 0x9da0, 0x9d9d, 0x9da8, 0x9da9, 0xcab9, 0x9db1, 0x9d93, 0x9d9b, 0x9da2, 0x9da1, 0x9db0, 0x9da7, 0x9fb3, 0x2b49, 0x9fb4, 0x9ff1, 0x9fed, 0x9fec, 0xa068, 0xa075, 0xa06a, 0xa062, 0xa067, 0xa060, 0xa077, 0xa05f, 0xa079, 0xa223, 0xa221, 0xa21c, 0x2c99, 0xa21f, 0xa21e, 0xa2d6, 0xa2d3, 0xa2d9, 0xa2d7, 0xa2d4, 0xa2dc, 0xa2d8, 0xa3a3, 0x12d1, 0xa3be, 0xa3a9, 0xa3a1, 0xa3a0, 0xa3ab, 0xa3a2, 0xa3ba, 0xa3c2, 0xa39c, 0xa3bb, 0xa3aa, 0xa3ac, 0xa3a5, 0xa3c1, 0x132c, 0xa5e2, 0xa636, 0xa63d, 0xa63a, /* 0x4f */ 0x5661, 0xa648, 0xa63c, 0xa6b7, 0xa6ac, 0xa6b3, 0xa6b6, 0xa6b2, 0x136e, 0xa75d, 0xa749, 0xa74e, 0xa74f, 0xa74d, 0xa75c, 0xa85d, 0xa8bb, 0xa8ce, 0xa8bf, 0xa8ba, 0xa8c3, 0x13e5, 0xaa06, 0xa9f8, 0xa9fe, 0xaa13, 0xa9f6, 0x13e6, 0xab34, 0xab2d, 0xab2a, 0xab35, 0xab2c, 0xabd4, 0xabda, 0xabd3, 0xabd2, 0xabce, 0xabcf, 0x149f, 0xadfd, 0xae0b, 0xadfe, 0xadf8, 0xadf7, 0xae17, 0xadfa, 0xadf9, 0xae00, 0xadf5, 0xadf1, 0xae03, 0xae05, 0xae1c, 0xafac, 0xaf9a, 0xafad, 0xafa0, 0xb01b, 0xb025, 0xb024, 0xb026, 0xb027, 0xb028, 0xb02a, 0xb01a, 0xb02e, 0xb015, 0xb115, 0xb114, 0xb117, 0xb118, 0xb10f, 0xb113, 0xb10b, 0xb122, 0x457a, 0xb226, 0x301f, 0xb251, 0xb24d, 0xb24e, 0xb24a, 0xb24b, 0xb24c, 0xb250, 0xb262, 0xb24f, 0xb252, 0xb368, 0xb369, 0xb3e5, 0xb3f0, 0xb3e1, /* 0x50 */ 0xb3e2, 0xcaf2, 0xb5a5, 0xb5a9, 0xb5a4, 0xb5af, 0xb5ac, 0xb5ae, 0xb5aa, 0xb695, 0xb699, 0xb693, 0xb69d, 0xb698, 0xb69c, 0xb697, 0x160d, 0xb789, 0xb787, 0xb8d7, 0xb8ed, 0xb8f1, 0xb8f0, 0xb905, 0xb903, 0xb904, 0xb95f, 0xbb57, 0xbc9c, 0xbca1, 0xbc9a, 0xbd8f, 0xbd93, 0xbd9e, 0xbda3, 0xbd98, 0xbd99, 0xbd95, 0xbe6e, 0xbe6a, 0xbff4, 0xbff7, 0xc179, 0xc38f, 0xc391, 0xc40b, 0xc802, 0x3384, 0x3404, 0x3480, 0x362f, 0x363f, 0x363b, 0x3662, 0x3644, 0x3633, 0x365f, 0x362b, 0xc909, 0x3639, 0x3636, 0x3648, 0x3635, 0x366c, 0x3658, 0x363a, 0x37a8, 0x37f4, 0x3829, 0x389a, 0x3900, 0x3abb, 0x3abd, 0x3ab7, 0x3ab2, 0x00f8, 0x3aa8, 0x3aab, 0x3aa6, 0x3abc, 0x3b97, 0x3b96, 0x3bf8, 0x1913, 0x3c51, 0x0133, 0x3cb5, 0x3cb4, 0x3cb6, 0x013c, 0x3cb7, 0x3d05, 0x3d23, 0x3d95, /* 0x51 */ 0x3d98, 0x014f, 0x3d94, 0x3d93, 0x3e07, 0x3e73, 0x3e71, 0x3e72, 0x3e78, 0x415f, 0x416a, 0x4167, 0x416b, 0x4169, 0x418e, 0x4149, 0x4180, 0x01dc, 0x4144, 0x418f, 0x4145, 0xc94c, 0x414f, 0x4163, 0x4136, 0x4148, 0x415c, 0x4193, 0x4161, 0x4160, 0x414e, 0x415e, 0x413f, 0x41a4, 0x1ae0, 0x4168, 0x440b, 0x4411, 0x440d, 0x440e, 0x45c2, 0xc957, 0x45b0, 0x45c3, 0x45c8, 0x4565, 0x45d7, 0x45bd, 0x45b8, 0x45b6, 0x45c7, 0x45bc, 0x45b1, 0x45af, 0xc95b, 0x4735, 0x4730, 0x475d, 0x3e76, 0x476f, 0x47b0, 0xc95e, 0x47b4, 0x485c, 0x485d, 0x4a08, 0x49ee, 0x4a0b, 0x49f2, 0x49fd, 0x49f1, 0x4a10, 0xc968, 0x4a14, 0x4b8b, 0x4b8c, 0x4b85, 0x4c7a, 0x4c6c, 0x4c60, 0x4c67, 0x4c66, 0x4c6a, 0x4c5f, 0x4c6d, 0x4c68, 0x4c64, 0x4d3a, 0x4d3b, 0x4d39, 0x4e02, 0x4e04, 0x4e03, 0x4eb4, /* 0x52 */ 0x4eb3, 0x4ebb, 0x4eac, 0x4eb6, 0x4eb1, 0x4eaf, 0x4eb5, 0x4ebe, 0x4eb2, 0x4f24, 0x50b6, 0x50b9, 0x50ac, 0x50b0, 0x50d7, 0x50bb, 0x50fe, 0x50cb, 0xc97f, 0x03f5, 0x50b3, 0x50be, 0x50cd, 0x50bc, 0x50ba, 0x50c7, 0x5316, 0x531b, 0x5317, 0x5315, 0x539f, 0xc98e, 0x5482, 0x5483, 0x548e, 0x546a, 0x5489, 0x5494, 0x5486, 0x5490, 0x5562, 0x5590, 0x560c, 0x560f, 0x04c3, 0x56a5, 0x56a7, 0x56a6, 0x56a4, 0x5735, 0x5738, 0x5736, 0x5743, 0x5747, 0x5737, 0x5943, 0x59a2, 0x5951, 0x5972, 0x596d, 0x592f, 0x5954, 0x596e, 0x5955, 0x5937, 0x594f, 0x5950, 0x1f39, 0x599e, 0xc9a8, 0x59b3, 0x59a7, 0x0571, 0x59f9, 0x5991, 0xc9a7, 0x59b6, 0x59dd, 0x5999, 0x5bdf, 0x5bd5, 0x77f5, 0x5e28, 0x5e40, 0x5e71, 0x5e98, 0x5e95, 0x5e65, 0x5e78, 0x5e7f, 0x5e60, 0x5e7c, 0x5e96, 0x5e6a, /* 0x53 */ 0x5e79, 0x5e73, 0x5e72, 0x5e7b, 0x5e70, 0x60d5, 0x60d7, 0x618f, 0x6189, 0x619e, 0x6187, 0x61a0, 0x618d, 0x6188, 0x617f, 0x618c, 0x6193, 0x6259, 0xbcb0, 0x62b1, 0x81f4, 0x62af, 0x62b2, 0x6308, 0x630a, 0x6336, 0x6337, 0xc9cf, 0x0701, 0x6436, 0x6429, 0x644a, 0x6426, 0x6428, 0x6424, 0x642a, 0x6448, 0x6544, 0x6584, 0x658c, 0x66c4, 0x66dc, 0x6787, 0x6753, 0x677f, 0x6731, 0x6751, 0x674b, 0x6752, 0x6780, 0x67a5, 0x6781, 0x6743, 0x6734, 0x6736, 0x6732, 0x6748, 0x6749, 0x673c, 0x674d, 0x674a, 0xc9e6, 0x678a, 0x6746, 0x673e, 0x6783, 0x6750, 0x67b4, 0x69f0, 0x69e4, 0x69e3, 0x69e5, 0x69e6, 0x69e7, 0x69e1, 0x69ef, 0x69e8, 0x69dd, 0x6a03, 0x6a88, 0x6b26, 0x6b16, 0x6b3b, 0x6b2f, 0x6b39, 0x6b34, 0xc9f4, 0x6b35, 0x6b31, 0x6b38, 0x3e81, 0x6baa, 0x6ba3, 0x6ba4, /* 0x54 */ 0x6ba0, 0x6ba1, 0x6ba9, 0x6ba5, 0x6caf, 0x6cb1, 0x6cab, 0x6cae, 0x6cb0, 0x6cb3, 0x6cac, 0x6ca9, 0x6cb2, 0x6ca8, 0x6cb4, 0x6cc2, 0x6d4f, 0x6d66, 0x6f1e, 0x6f15, 0x6f10, 0x6f7f, 0x6f7e, 0x6f60, 0x6fcc, 0x6fb2, 0x6f62, 0x6f8d, 0x6f8e, 0x6f77, 0x6f7c, 0x6f8f, 0x6f5d, 0x6f6d, 0x6f63, 0x6faf, 0x6f90, 0x6f7d, 0x6f7a, 0x6f06, 0xca0b, 0x6f68, 0x6fb4, 0x6f78, 0x6fb1, 0x22d7, 0xca0c, 0x0941, 0x72e8, 0x72e9, 0x72c0, 0x09d7, 0x72ea, 0x72b7, 0x72ba, 0x72b5, 0xca1d, 0x72b4, 0x72bc, 0x72c6, 0x72b8, 0x72bd, 0x72c2, 0x734d, 0x72f0, 0x72c7, 0x72c1, 0x72c3, 0x72f1, 0x72ec, 0x09e2, 0x751c, 0x7520, 0x7558, 0x7565, 0x7564, 0x758c, 0x758d, 0x75d9, 0x75e0, 0x7610, 0x7694, 0x7692, 0x7696, 0x7695, 0x76bf, 0x76a0, 0x0a45, 0x77f4, 0x77f6, 0x77dc, 0x243d, 0x7816, 0x7815, /* 0x55 */ 0x781c, 0x780f, 0x782c, 0x7814, 0x7825, 0x7817, 0x7812, 0x781e, 0x7980, 0x79a8, 0x79af, 0x79d6, 0x79e2, 0x79b4, 0x79b3, 0x79b0, 0x79b2, 0x79a1, 0x7b60, 0x7b66, 0x7b61, 0x7b4e, 0x7b5d, 0x7b63, 0x7be6, 0x7bef, 0x7bec, 0x7c98, 0x7ca7, 0x7c94, 0x7c95, 0x7c91, 0x7c9d, 0x7c99, 0x7c9b, 0x7c9c, 0x7d1d, 0x7d1c, 0x7dd0, 0x7de0, 0x7dcb, 0x7ddb, 0x7dda, 0x7dc2, 0x7dd3, 0x7de5, 0x7f7d, 0x7f7b, 0x7fff, 0x0bf2, 0x7ff9, 0x8077, 0x807c, 0x8078, 0x807b, 0x807a, 0x81d2, 0x81cb, 0x81c9, 0x81ce, 0x81e4, 0x81ca, 0x81d0, 0x61a5, 0x0c49, 0x81d9, 0x81ee, 0x81dd, 0x8200, 0x81e1, 0x83de, 0x83e2, 0x83da, 0x84ce, 0xca4f, 0x84cf, 0x84da, 0x84d1, 0x84d4, 0x84ed, 0x84cb, 0x84d5, 0x84f1, 0x869c, 0x8688, 0x8741, 0x87d0, 0x87f7, 0x87cf, 0x87d1, 0x87db, 0x87de, 0x87f8, 0x87dc, /* 0x56 */ 0x87d9, 0x89a0, 0x89b2, 0x89a1, 0x89aa, 0x89a9, 0x0da9, 0x89a6, 0x899c, 0x89b5, 0x89a7, 0x8a8e, 0x8a90, 0x8a91, 0x8b85, 0x8b5b, 0x8b70, 0x8b64, 0x8b67, 0x8b63, 0x8b77, 0x8b68, 0x8b65, 0x8b6a, 0x8b78, 0x8b66, 0x8c88, 0x8c9e, 0x8c74, 0x8c7a, 0x8c79, 0x8c8b, 0x8c7f, 0x8e13, 0x8e1e, 0x8e17, 0x8e1a, 0x8e22, 0x8e43, 0x8e19, 0x8e1f, 0x8e27, 0x8e12, 0x8e24, 0x8e25, 0x365e, 0x8f35, 0x8f34, 0x8fd1, 0x8fc4, 0x8fca, 0x8fc6, 0x8fcb, 0x8fcd, 0x8fe2, 0x9089, 0x908b, 0x9086, 0x9088, 0x908d, 0x913b, 0x913c, 0x913d, 0x91f5, 0x9279, 0x9275, 0x9282, 0x927f, 0x9285, 0x9276, 0x927c, 0x927e, 0x927b, 0x9280, 0x927a, 0x5748, 0x0fcb, 0x931d, 0x93f6, 0x93f7, 0x93f9, 0x9463, 0x946c, 0x946e, 0x9414, 0x100d, 0x9467, 0x946f, 0x9469, 0x9476, 0x9495, 0x9471, 0x9461, 0x9478, /* 0x57 */ 0x946b, 0x9485, 0x9484, 0x9614, 0x9676, 0x89b6, 0x9675, 0x9674, 0x96e2, 0x973f, 0x9744, 0x973d, 0x9747, 0x9748, 0x97db, 0x97dc, 0x97dd, 0x98e5, 0x98e6, 0x99c2, 0x9a2e, 0x9a1d, 0x99f8, 0x99f0, 0x99f6, 0x99c5, 0x99c6, 0x99fc, 0x9a52, 0x9a2f, 0x9a10, 0x99f3, 0x99d2, 0x99ea, 0x99dc, 0x9a1b, 0x99fb, 0x99c3, 0x9a16, 0x9a07, 0x99c9, 0x99d8, 0x9a30, 0x9a13, 0x9a31, 0x99fa, 0x99f2, 0x9ae3, 0x99d5, 0x9a01, 0x99f1, 0x9a1c, 0x99d6, 0x9a08, 0x9a0b, 0x9a17, 0x9a20, 0x99ca, 0x9a32, 0x9a05, 0x99e4, 0x99ce, 0x9a33, 0x9a02, 0x9a19, 0x9a1e, 0x99d3, 0x99f7, 0x99e8, 0x9a1f, 0x99f4, 0x9ad8, 0x9cbf, 0x9cbe, 0x9cbd, 0x9ddc, 0x9ddd, 0x9dab, 0x9dc9, 0x9dc8, 0x9ddf, 0x9dd9, 0x9ddb, 0x9dcc, 0x9de0, 0x9def, 0x9df3, 0x9dae, 0x9e01, 0x9fb7, 0x9fb9, 0x9fb6, 0x9fb8, 0x9ff6, /* 0x58 */ 0x9ff3, 0x9ff5, 0x9ff2, 0xa091, 0xa09d, 0xa09b, 0xa092, 0xa08d, 0xa09e, 0xa08c, 0x1231, 0xcac7, 0xa095, 0xcac6, 0xa08a, 0xa08e, 0xa09c, 0xa1ef, 0xa22d, 0xa252, 0xa235, 0xa228, 0xa22e, 0xa2e5, 0xa3ea, 0xa3f1, 0xa3eb, 0xa3d8, 0xa3d0, 0xa3f3, 0xa3db, 0xa3ce, 0x12d5, 0xa3da, 0xa3d7, 0xa3e1, 0xa3f2, 0xa3c8, 0xa3d9, 0xa3de, 0xa3d1, 0xa3e7, 0xa3cf, 0xa5b7, 0xa647, 0xa642, 0xa643, 0xcad3, 0xa6c3, 0xa6c1, 0xa6c7, 0xa764, 0xa76a, 0xa766, 0xa750, 0xa76e, 0xa765, 0x69ec, 0xa77f, 0xcad5, 0xa79a, 0xa769, 0xa772, 0xa76f, 0xa77d, 0xa770, 0xa860, 0xa8c2, 0xa8e7, 0xa8d1, 0xa8eb, 0xa8d4, 0xa8dc, 0xa8db, 0xaa37, 0xaa25, 0xaa1f, 0xaa1e, 0xaa21, 0xaa1b, 0xaa17, 0xaa22, 0xaa2a, 0xaa1a, 0xaa2d, 0xaa23, 0xaa26, 0xaa36, 0xa9ff, 0xab3a, 0xab40, 0xab42, 0xab38, 0xab3b, /* 0x59 */ 0xab3c, 0xab43, 0xabe8, 0x1456, 0xabf9, 0xabeb, 0xabf1, 0xabe9, 0xabec, 0xad15, 0xad47, 0xad46, 0xad45, 0xae24, 0xae56, 0xae21, 0xae27, 0xae4d, 0xae31, 0xae1e, 0xae2c, 0xae4f, 0xae2b, 0xae53, 0xae51, 0xae54, 0xae29, 0xae50, 0xae1f, 0xae32, 0xae2a, 0xae1d, 0xae28, 0xae2e, 0xae2d, 0xafbc, 0xafbb, 0xafbd, 0xcae4, 0xb047, 0xb041, 0xcae5, 0xb049, 0x14f4, 0xb12e, 0xb127, 0xb26a, 0xb27b, 0xb273, 0xb275, 0xb269, 0xb279, 0xb272, 0xb376, 0xb377, 0xb374, 0xb373, 0xb402, 0xb3fe, 0xb401, 0xb3f9, 0xb3f4, 0xb5d3, 0xb5d5, 0xb5d8, 0xb5c3, 0xb5ca, 0xb5d0, 0xb5cb, 0xb5ce, 0xb5c5, 0xb5e6, 0xb5c4, 0xb5c0, 0xb5d4, 0xb5e8, 0xb676, 0xb6a2, 0xb6ae, 0xb6a8, 0xb6a3, 0xb6a7, 0xb696, 0xb6a9, 0xb6a5, 0xb6af, 0xb6a4, 0xb6ab, 0xb6aa, 0xb6a6, 0xb6a0, 0xb798, 0xb8db, 0xb8f6, /* 0x5a */ 0xb8f5, 0xb90c, 0xb90a, 0x3175, 0xb968, 0xb963, 0xb966, 0x1658, 0xb964, 0xb96a, 0xb969, 0xba95, 0xbb02, 0xbb6a, 0xbb5e, 0xbb68, 0xbb69, 0xbb65, 0xcafe, 0xbca7, 0xbcae, 0xbca8, 0xbcb3, 0xbd9c, 0xbda9, 0xbdb6, 0xbdb3, 0xbdb2, 0xcb03, 0xbdb8, 0xbdc0, 0xbdbf, 0xbdba, 0xbda8, 0xbe3c, 0xbe72, 0xbe71, 0xbe75, 0xbe73, 0xbf17, 0xbf15, 0xbf16, 0xbf1b, 0xbffa, 0xbff9, 0xc12c, 0xc185, 0xc182, 0xc17f, 0xc17d, 0xc188, 0x72f3, 0xc24e, 0xc250, 0xc393, 0xc397, 0xc398, 0xc39b, 0xc39c, 0xc396, 0xc58b, 0xc5fd, 0xc5fc, 0xcb17, 0x6a8b, 0x3408, 0x3407, 0x3673, 0x36a2, 0x36af, 0x3682, 0x367b, 0x3674, 0x36b0, 0x3676, 0x36b9, 0x369e, 0x36b1, 0x36a1, 0x36b2, 0x366e, 0xc90b, 0x0087, 0x3678, 0x367a, 0x3683, 0x369a, 0x37f8, 0x3831, 0x3869, 0x3868, 0x389c, 0x3904, 0x3999, /* 0x5b */ 0x3ac7, 0x3ac6, 0x3adc, 0x3ac4, 0x3ad8, 0x3ad4, 0x3adf, 0x3ad1, 0x3ad0, 0x3ad6, 0x3acf, 0x3bad, 0x3baf, 0x3ba7, 0x3bfd, 0x3c5b, 0x3c5a, 0x3d07, 0x3d9d, 0x3d9b, 0x3dab, 0x3da4, 0x3d9c, 0x3d9e, 0x3da5, 0x3daa, 0x3da6, 0x3e0e, 0x3e7e, 0x3e7c, 0x41ee, 0x41d5, 0x41e9, 0x4142, 0x41e2, 0x4223, 0x41d9, 0x41d4, 0x41e3, 0x4215, 0x41ef, 0x41f0, 0x41d6, 0x41dd, 0x41f6, 0x421c, 0x41d8, 0x41db, 0x41da, 0x41ed, 0x4611, 0x4415, 0x4418, 0x441a, 0x441f, 0x4416, 0xc94d, 0x4419, 0xc94b, 0x45f0, 0x4609, 0x461b, 0xa5e7, 0x45f6, 0x45f4, 0x45b5, 0x4610, 0x45f2, 0x4615, 0x45f3, 0x45f8, 0x4739, 0x473b, 0x4736, 0x460e, 0x4772, 0x4774, 0x47b9, 0x47b7, 0x47b8, 0x4872, 0x486b, 0x4a1d, 0x4a37, 0x4a22, 0x4a43, 0x4a4d, 0x4a38, 0x4a5b, 0x4a79, 0x4a1b, 0x49f3, 0x4b91, 0x4c7b, /* 0x5c */ 0x4c94, 0xc96f, 0x4c96, 0x4c7f, 0x4c8f, 0x4c84, 0x4c7c, 0x4c8e, 0x4c90, 0x4c98, 0x4c83, 0x4c80, 0x4c93, 0x4c82, 0x32fd, 0x4d3d, 0x4d41, 0x4da1, 0x4d9f, 0x4e0a, 0x4e0d, 0x4ec8, 0x4ec9, 0x4ec7, 0x4ecd, 0x4f25, 0x50b1, 0x50dc, 0xc980, 0x50e5, 0x50f4, 0x50bf, 0x50db, 0x50ea, 0x50f2, 0x03fa, 0x50f1, 0x50ed, 0x50e6, 0x5202, 0xc982, 0x5325, 0x5318, 0x531f, 0x5320, 0x53cf, 0x549d, 0x5499, 0x54a8, 0x5568, 0x5566, 0x5567, 0x5591, 0x5613, 0x5615, 0x561d, 0x5616, 0x5619, 0x566b, 0x5668, 0x566a, 0x566d, 0x5669, 0x56aa, 0x5757, 0x5752, 0x5750, 0x575f, 0x5767, 0x574f, 0x04f2, 0x575b, 0x575c, 0x575d, 0x5a1f, 0x599d, 0x59b1, 0x59b0, 0x5994, 0x59c3, 0x59af, 0x59a8, 0x59dc, 0x5998, 0x59c4, 0x59a4, 0x59ab, 0x59aa, 0x59a5, 0x5a21, 0x59eb, 0x59e6, 0x59f7, 0x59f8, /* 0x5d */ 0x59fc, 0x59fa, 0x59e0, 0xc9aa, 0x59f6, 0xc9a9, 0x59e1, 0x5bec, 0x5be2, 0x5be4, 0x5bf9, 0x5e6f, 0x6b4c, 0x5ebb, 0x5ee1, 0x5f00, 0x5ed8, 0x062f, 0x5ed6, 0x5ee2, 0x5ec3, 0x5eb3, 0x5ed2, 0xc9c1, 0x5ece, 0x5ed0, 0x5ed5, 0x5eb9, 0x5eba, 0x5ecf, 0x5ebd, 0x60db, 0x61aa, 0x61ad, 0x61b8, 0x61b6, 0x61b5, 0x61af, 0x61b4, 0x61b7, 0x61a8, 0x61b9, 0x61be, 0x6282, 0x62bc, 0x62b8, 0x62b6, 0x62b9, 0x06c1, 0x6310, 0x6427, 0x6469, 0x6470, 0x6456, 0x646b, 0x647a, 0x646c, 0x646d, 0xc9d5, 0x94c1, 0x658d, 0x6590, 0x67b6, 0x6810, 0x6812, 0x67ba, 0x67bd, 0x6805, 0x67c2, 0x6807, 0x67f5, 0xc9e9, 0x67af, 0x67f4, 0x67f7, 0x67f8, 0x6811, 0x69f6, 0x69f5, 0x69fb, 0x6a01, 0x6a00, 0x6a02, 0x69fe, 0x69fa, 0x69fd, 0x0840, 0x6b37, 0x6b49, 0x6b4b, 0x6b46, 0x6b47, 0x6bb3, 0x6bb2, /* 0x5e */ 0x6bb0, 0x6bb7, 0x6c11, 0x6ccc, 0x6cdf, 0x6cd3, 0x6cd5, 0x6cdb, 0x6cc5, 0x6cc8, 0x6cc9, 0x6ce2, 0x6cca, 0x6cd1, 0x6cd2, 0x6cdd, 0x6f6c, 0x6f73, 0x7021, 0x6ff0, 0x701f, 0x703b, 0x7022, 0x7023, 0x6fe8, 0x6fdd, 0x093f, 0x701b, 0x6fed, 0xca0e, 0x6ff2, 0x0946, 0x6fdc, 0x6fe9, 0x701d, 0x6fda, 0x6fe6, 0x7313, 0x7315, 0x7316, 0x733c, 0x730b, 0x731c, 0x733a, 0x733d, 0x739a, 0x731d, 0x7309, 0x7308, 0x733b, 0x7522, 0x7526, 0x7525, 0x7524, 0x369b, 0x758f, 0x7590, 0x75e6, 0x75e3, 0x75e5, 0x7611, 0xca25, 0x76ae, 0x76be, 0x76b4, 0x76b3, 0x76af, 0x7691, 0x76c2, 0x76b6, 0x76b2, 0x7857, 0x783b, 0x7858, 0x7851, 0x7841, 0x7839, 0x0a8f, 0x7859, 0x7845, 0x7861, 0x78e8, 0x79fa, 0x79ea, 0x79ef, 0x79f2, 0x79f0, 0x7b08, 0x7b70, 0x7b6a, 0x7b73, 0x7b68, 0x7bc8, 0x7bf2, /* 0x5f */ 0x3e7b, 0x7cae, 0x7cab, 0x7cb5, 0x7caf, 0x7cb2, 0x7cb6, 0x7cb0, 0x7d1e, 0x7e03, 0x7e06, 0x7e1f, 0x0bac, 0x7e0f, 0x7e02, 0x7e19, 0x7e18, 0x7e22, 0x7e15, 0x7e07, 0x7e0d, 0x7e24, 0x7e0c, 0x7e1e, 0x7f89, 0x7f8a, 0x800a, 0x800b, 0x8007, 0x8004, 0x8009, 0x8084, 0x8083, 0x8218, 0x8214, 0x8205, 0x8216, 0x820e, 0x8211, 0x8208, 0x820b, 0x8215, 0x8085, 0x8237, 0x822a, 0x820d, 0x820f, 0x837e, 0x8376, 0x8377, 0x83ec, 0x84fc, 0x8508, 0x84ff, 0x8503, 0x8510, 0x8505, 0x8506, 0x84fa, 0x86c7, 0x86c0, 0x86c3, 0x86a7, 0x86a8, 0x86ab, 0x86c1, 0x86aa, 0x86c8, 0x8743, 0x8802, 0x880e, 0x8801, 0x87fe, 0x8803, 0x0d68, 0x8822, 0x8821, 0x8807, 0x8808, 0x880c, 0x89ca, 0x89bc, 0x89be, 0x89bd, 0xca5c, 0x89bb, 0x89b9, 0x0dab, 0x89c5, 0x8a99, 0x8b6b, 0x8b93, 0x8b94, 0x8ba9, /* 0x60 */ 0x8ba0, 0x8ba6, 0xca61, 0x8bab, 0x8b9e, 0x8b9b, 0x8b91, 0x8b99, 0x8cb6, 0x8cb8, 0x8c9a, 0x0e91, 0x8c98, 0x8c9b, 0x8cb3, 0x8ca2, 0x54aa, 0x8ca0, 0x8c9f, 0x8e5b, 0x8e70, 0x8e54, 0x8e71, 0x8e65, 0x8e51, 0x8e9d, 0x8e61, 0x8e5a, 0x8e74, 0x8e4c, 0x8e4b, 0x8e5e, 0x8e58, 0x8e53, 0x8e52, 0x8f3b, 0x8f39, 0x8fd6, 0x8fe7, 0x8fd7, 0x8fd8, 0x8fd9, 0x8fda, 0x8fdb, 0x8fdc, 0x8fe0, 0x8fe4, 0x8fdd, 0x8ff5, 0x8ff1, 0x9098, 0x909d, 0x9099, 0x9150, 0x9149, 0x27e4, 0x9162, 0x91d7, 0x9201, 0x91f7, 0xca7d, 0x928c, 0x929c, 0x2888, 0x931f, 0x931e, 0x943d, 0x943f, 0x9411, 0x9459, 0x943e, 0x9458, 0x9500, 0x949e, 0x94b6, 0x94aa, 0x94af, 0x94ac, 0x1030, 0x94c0, 0x94a9, 0x3e10, 0x95ee, 0x9677, 0x9679, 0x967a, 0x967d, 0x967f, 0x9683, 0x9678, 0x967e, 0x96e4, 0x96e6, 0x96e5, /* 0x61 */ 0x105d, 0x974e, 0x9759, 0x1075, 0xca8e, 0x974f, 0x974a, 0x97e3, 0x97de, 0x97e2, 0x9974, 0x99ac, 0x9961, 0x9962, 0x9976, 0x997a, 0x9979, 0x9960, 0x9a64, 0x9b81, 0x9adf, 0x9a84, 0x9a8a, 0x9a92, 0x9a79, 0x9ade, 0x9a98, 0x9a6c, 0x9ae1, 0xcaa5, 0x9a7c, 0x9a72, 0x9a81, 0x9ae0, 0x9a65, 0x10ff, 0x9a6a, 0x9a97, 0x9aaa, 0x9ad3, 0x9aab, 0x9a6e, 0x9aac, 0x9a76, 0x9a7b, 0x9aad, 0xcaa6, 0x9a94, 0x9ad7, 0x9a70, 0x9ad5, 0x9af1, 0x9a7a, 0x9a68, 0x9a96, 0x110b, 0x9a73, 0x9aae, 0x9add, 0x9ada, 0x9aaf, 0x9ab0, 0x9adb, 0x9a62, 0x9af8, 0x9cc2, 0x9cc7, 0x9cc8, 0x9cc5, 0x9cc3, 0x9cc6, 0x9dde, 0x11c8, 0x9e11, 0x9e15, 0x9e28, 0x9e21, 0x9e2d, 0x9e51, 0x9e2b, 0x9e16, 0x9e24, 0x9e35, 0x9e1f, 0x9e12, 0x9e10, 0x9e80, 0x9e3b, 0x9e29, 0x9e2a, 0x9e1b, 0x9e18, 0x9e20, 0x9e3f, /* 0x62 */ 0x9e1c, 0x9e26, 0x9e0b, 0x9fbe, 0x9fc4, 0x9fbd, 0x9ffa, 0x9ffb, 0xa0b1, 0xa0b2, 0xa0b0, 0xa0b9, 0xa0a6, 0xa0bd, 0xa0b6, 0xa0b8, 0xa0b4, 0xa0b3, 0xa0a7, 0xa0ae, 0xa0bc, 0xa1f2, 0xa1f3, 0xa1f4, 0xa23b, 0xa240, 0xa246, 0xa2f0, 0xa2ee, 0xa2e8, 0xa2f1, 0xa2eb, 0xa2ef, 0xa3fc, 0xa420, 0xa409, 0xa406, 0xa403, 0xcacf, 0xa419, 0xa424, 0xa41b, 0xa41d, 0xa3fd, 0xa41e, 0xa3f4, 0xa401, 0xa408, 0xa405, 0xa423, 0xa3ff, 0xa5ea, 0xa64d, 0xa64e, 0xa656, 0xa657, 0xa651, 0xa655, 0xa654, 0xa6cb, 0xa6d4, 0xa6d1, 0xa6cf, 0xa6d2, 0xa6ca, 0xa6d6, 0xa78b, 0xa788, 0xa785, 0xa789, 0x4c9b, 0xa7bb, 0xa78c, 0x1374, 0xa799, 0xa78a, 0xa8ec, 0xa8ef, 0xa8f9, 0xa909, 0xa8f8, 0xa8f3, 0xa900, 0xa91d, 0x13ac, 0xa8fd, 0xaa48, 0xaa5c, 0xaa55, 0xaa5e, 0xaa49, 0xaa63, 0xaa60, 0xaa53, /* 0x63 */ 0xaa62, 0xaa40, 0xab49, 0xab4a, 0xab4c, 0xab4d, 0xac0a, 0xac06, 0xac2f, 0xac21, 0xac07, 0xac09, 0xac02, 0xac16, 0xac03, 0xac0b, 0xac0f, 0xae60, 0xae68, 0xae5e, 0xae5d, 0xae63, 0xae5f, 0xae64, 0xae78, 0xae61, 0xae69, 0xae65, 0xafda, 0xafe6, 0xafdb, 0xafdc, 0xb039, 0xb057, 0xb055, 0xb065, 0xb061, 0xb054, 0xb145, 0xb141, 0xb13e, 0xb137, 0xb212, 0xb213, 0xb22c, 0xb296, 0xcae9, 0xb29c, 0xb29d, 0xb285, 0xcae8, 0xb29f, 0xb2a3, 0xb382, 0xb383, 0xcaee, 0xb41d, 0xb414, 0xb41f, 0xb420, 0xb547, 0xb580, 0xb5c9, 0xb5f9, 0xb606, 0xb5f0, 0xb5f8, 0xb5ef, 0xb5fd, 0xb5f1, 0xb5fe, 0xb6b8, 0xb6c0, 0xb6c3, 0xb6b5, 0xb6b6, 0xb6c9, 0xcaf3, 0xb6bd, 0xb6ba, 0xb6bf, 0xb6b3, 0xb6c6, 0xb6b2, 0xb6bc, 0xb6b7, 0xb6b9, 0xb6c8, 0xb7b5, 0xb7b3, 0x1616, 0xb7ac, 0xb7a9, 0xb7ad, /* 0x64 */ 0xb911, 0xb90d, 0xb916, 0xb989, 0xb97c, 0xb98b, 0xb97b, 0xb988, 0xb984, 0xba9d, 0xba98, 0xbb88, 0xbb86, 0xbb82, 0xbb8b, 0xcaff, 0xbb71, 0xbb72, 0xbb81, 0xbb8c, 0xbb80, 0xbb89, 0xbcbb, 0xbcc1, 0xbcbe, 0xcb01, 0xbcbd, 0xbdc1, 0xbdb4, 0xbdb7, 0xbdc8, 0x173b, 0xbdd3, 0xbdd0, 0xbdb0, 0xbdca, 0xbdcd, 0xbe15, 0xbe19, 0xbe17, 0xbe3f, 0xbe40, 0xbe44, 0xbe7c, 0xbe78, 0xbe79, 0xbe88, 0xcb06, 0xbe89, 0xbe7d, 0xbf23, 0xbf24, 0xbf26, 0xbf22, 0xbf27, 0xbf1f, 0xbfc9, 0xbfc3, 0xc00a, 0xc00b, 0xc004, 0x17ef, 0xc003, 0xc001, 0xc009, 0xc10f, 0xc12e, 0xc12d, 0xc191, 0xc199, 0xc19e, 0xc190, 0xc194, 0xc19d, 0xc198, 0xc19b, 0xc19c, 0xc19a, 0xc254, 0xc39d, 0xc39f, 0xc3a3, 0xc3a4, 0xc3a5, 0xc602, 0xc717, 0xc71b, 0xc719, 0xc7d1, 0x4737, }; static const ucs4_t cns11643_6_2uni_upages[204] = { 0x03400, 0x03500, 0x03600, 0x03700, 0x03800, 0x03900, 0x03a00, 0x03b00, 0x03c00, 0x03d00, 0x03e00, 0x03f00, 0x04000, 0x04100, 0x04200, 0x04300, 0x04400, 0x04500, 0x04600, 0x04700, 0x04800, 0x04900, 0x04a00, 0x04b00, 0x05100, 0x05300, 0x05500, 0x05a00, 0x05b00, 0x05d00, 0x05e00, 0x06100, 0x06500, 0x06800, 0x06e00, 0x07200, 0x07300, 0x07800, 0x07a00, 0x07f00, 0x08000, 0x08100, 0x08200, 0x08800, 0x08900, 0x08a00, 0x08d00, 0x08f00, 0x09200, 0x09700, 0x0ff00, 0x20000, 0x20100, 0x20200, 0x20300, 0x20400, 0x20500, 0x20600, 0x20700, 0x20800, 0x20900, 0x20a00, 0x20b00, 0x20c00, 0x20d00, 0x20e00, 0x20f00, 0x21100, 0x21200, 0x21300, 0x21400, 0x21500, 0x21600, 0x21700, 0x21800, 0x21900, 0x21a00, 0x21b00, 0x21c00, 0x21d00, 0x21e00, 0x21f00, 0x22000, 0x22100, 0x22200, 0x22300, 0x22400, 0x22500, 0x22600, 0x22700, 0x22800, 0x22900, 0x22a00, 0x22b00, 0x22c00, 0x22d00, 0x22e00, 0x22f00, 0x23000, 0x23100, 0x23200, 0x23300, 0x23400, 0x23500, 0x23600, 0x23800, 0x23900, 0x23a00, 0x23b00, 0x23c00, 0x23d00, 0x23e00, 0x23f00, 0x24100, 0x24200, 0x24300, 0x24400, 0x24500, 0x24600, 0x24700, 0x24800, 0x24900, 0x24a00, 0x24b00, 0x24c00, 0x24d00, 0x24e00, 0x24f00, 0x25000, 0x25100, 0x25200, 0x25300, 0x25400, 0x25500, 0x25600, 0x25700, 0x25800, 0x25900, 0x25a00, 0x25b00, 0x25e00, 0x25f00, 0x26000, 0x26200, 0x26300, 0x26400, 0x26500, 0x26600, 0x26700, 0x26800, 0x26900, 0x26a00, 0x26b00, 0x26c00, 0x26d00, 0x26e00, 0x27100, 0x27200, 0x27300, 0x27500, 0x27600, 0x27700, 0x27800, 0x27900, 0x27a00, 0x27b00, 0x27c00, 0x27d00, 0x27e00, 0x27f00, 0x28000, 0x28200, 0x28300, 0x28400, 0x28500, 0x28600, 0x28700, 0x28800, 0x28900, 0x28c00, 0x28d00, 0x28e00, 0x28f00, 0x29000, 0x29100, 0x29200, 0x29300, 0x29400, 0x29500, 0x29600, 0x29800, 0x29a00, 0x29b00, 0x29c00, 0x29d00, 0x29f00, 0x2a000, 0x2a200, 0x2a300, 0x2a400, 0x2a500, 0x2f800, 0x2f900, 0x2fa00, }; static int cns11643_6_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x21 && c1 <= 0x64)) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x21 && c2 < 0x7f) { unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); ucs4_t wc = 0xfffd; unsigned short swc; { if (i < 6388) swc = cns11643_6_2uni_page21[i], wc = cns11643_6_2uni_upages[swc>>8] | (swc & 0xff); } if (wc != 0xfffd) { *pwc = wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } freelan-2.0/third-party/source/libiconv-msvc/include/cns11643_7.h000066400000000000000000001621571252300335000245220ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CNS 11643-1992 plane 7 */ static const unsigned short cns11643_7_2uni_page21[6539] = { /* 0x21 */ 0x2b55, 0x2c82, 0x2c89, 0x2c87, 0x2dbe, 0x2dbd, 0x2dca, 0x2dd4, 0x2dbc, 0x2dc4, 0x2dc1, 0x2dc2, 0x2dd7, 0x2d70, 0x2dba, 0x2de3, 0x2dbb, 0x2eb1, 0x2eb6, 0x2eb0, 0x2f6c, 0x300d, 0x3007, 0x31f1, 0x31f5, 0x31ed, 0x31ef, 0x31eb, 0x31ec, 0x31ee, 0x3207, 0x33c4, 0x3408, 0x34b3, 0x34ad, 0x34b0, 0x3511, 0x2c8a, 0x3683, 0x367a, 0x3682, 0x3668, 0x3671, 0x36b0, 0x36af, 0x01f6, 0x366c, 0x366f, 0x3662, 0x3665, 0x3681, 0x367f, 0x3664, 0x3673, 0x366e, 0x3667, 0x3674, 0x367d, 0x3678, 0x3685, 0x36aa, 0x3688, 0x36a6, 0xc34e, 0x368a, 0x3684, 0x1a55, 0x3924, 0x3922, 0x3923, 0x3a32, 0x3a5b, 0x3a4f, 0x0267, 0x3a26, 0x3a3e, 0x3a42, 0x3a47, 0x3a22, 0x309b, 0x3a4a, 0x3a1f, 0x3a49, 0x3a2b, 0x3a33, 0xc358, 0x3a2a, 0x3a28, 0x3b3d, 0x3b3c, 0x3bbf, 0x3c79, 0x3c80, 0x3c7c, /* 0x22 */ 0x3c7a, 0x3c78, 0x3d82, 0x3d5c, 0x3d5a, 0x3d4b, 0x3d7c, 0x3d7f, 0x3d1f, 0x3d89, 0x3d8b, 0x3d57, 0x3d7e, 0x3d7d, 0x3d53, 0x3f9f, 0x3fbc, 0x3fa5, 0x3f86, 0x3fdc, 0x3fa4, 0x3fb6, 0x3fa2, 0x3fb4, 0x4048, 0x4046, 0x40a7, 0x4114, 0x4112, 0x4111, 0x41e1, 0x41d0, 0x4226, 0x4228, 0x4229, 0x432f, 0x430d, 0x4325, 0x4314, 0x433c, 0x430b, 0x4311, 0x4330, 0x4318, 0x4319, 0x4336, 0x4317, 0x4310, 0x4315, 0x4403, 0x4429, 0x444c, 0x453f, 0x453e, 0x4534, 0x4542, 0x4535, 0x31f3, 0x45cd, 0x45d1, 0x45d2, 0x46ad, 0x46ba, 0x46c1, 0x46bb, 0x46b4, 0x46bc, 0x476c, 0x4792, 0x4821, 0x4824, 0x5f19, 0x48ad, 0x48ae, 0x48ab, 0x48ac, 0x4970, 0x4976, 0x4971, 0x4977, 0x1c7f, 0x4aec, 0x4b1c, 0x4afb, 0x4aee, 0x4be2, 0x4afd, 0x4b1e, 0x4b3b, 0x4b4a, 0xc3ae, 0x0592, 0x4b7d, 0x4b56, /* 0x23 */ 0x4b44, 0x4b4b, 0x4cfa, 0x4ce8, 0x4cf8, 0x4cff, 0x4cf7, 0x4cf6, 0x4cfe, 0x4d07, 0x4d5d, 0x4ed4, 0xc3c3, 0x4ec8, 0x4ec5, 0xc3c0, 0x4ec9, 0x4f4d, 0x4f20, 0x4f36, 0x4f35, 0x4f88, 0x4f25, 0x4f21, 0x4f26, 0x0645, 0x4f3f, 0x4f3b, 0x4f24, 0x4f43, 0x4f4e, 0x4f4f, 0x4f44, 0x4f40, 0x4f41, 0x4f39, 0x4f2b, 0x50dd, 0x50de, 0x51cd, 0x51cb, 0x51db, 0x51d8, 0x51d9, 0x51d2, 0x51ca, 0x51d1, 0x51d4, 0x51f9, 0x51d0, 0x525e, 0x525d, 0x528a, 0x5314, 0x5483, 0x5484, 0x549b, 0x5482, 0x547d, 0x547c, 0x5499, 0x547e, 0x549a, 0x5495, 0x547b, 0x5486, 0x5548, 0x5592, 0x56b2, 0x5742, 0x5772, 0x5715, 0x5730, 0x5743, 0x575b, 0x571d, 0x5773, 0x572d, 0x07c9, 0x5721, 0x571c, 0xc3ea, 0x5729, 0x571e, 0x5733, 0x5a10, 0x5a0e, 0xc3f1, 0x5a0d, 0x5a11, 0x5a12, 0x5a17, 0x5a09, 0x5a0f, /* 0x24 */ 0x5a98, 0x5a94, 0x5a96, 0x5a99, 0x5a95, 0x5a97, 0x5b50, 0x5b52, 0x5b4d, 0x5b57, 0x5b53, 0x5b56, 0x5bb8, 0x5c12, 0x5cf1, 0x5cf0, 0x5cee, 0x5cef, 0x5ce5, 0x5ceb, 0x5ce7, 0x5cf2, 0x5ce6, 0x5cf7, 0x5d09, 0x5d6b, 0x5d6a, 0x5e79, 0x5ecd, 0x5eef, 0x5ee4, 0x5ee3, 0x5f6c, 0x5f67, 0x5f62, 0x5f58, 0x5f69, 0x5fab, 0x5f57, 0x5fad, 0x5f54, 0x5fae, 0x5f76, 0x5f49, 0x5f45, 0x5f4f, 0xc40f, 0x5f50, 0x5f7d, 0x5f44, 0x5f66, 0x5f48, 0x5fa3, 0x5f51, 0x5f53, 0xc410, 0x5f60, 0x5f47, 0x5f5e, 0x5f85, 0x5fac, 0x5f6d, 0x5f75, 0x5fa8, 0x0955, 0x5f43, 0x5f4e, 0x5f5c, 0x5f56, 0x5f6e, 0x5f63, 0x5f6a, 0x6256, 0x6212, 0x625c, 0x6258, 0x6255, 0x627e, 0x62a8, 0x6211, 0x6259, 0x625a, 0x6267, 0x6254, 0x625b, 0x62f0, 0x6429, 0x642c, 0x642a, 0x6427, 0x6467, 0x6468, 0x6493, 0x6495, /* 0x25 */ 0x649a, 0x64ee, 0x64f1, 0x64ed, 0x64e9, 0x65cb, 0x65df, 0x65db, 0x673c, 0x674e, 0x676c, 0x677b, 0x677c, 0x6783, 0x676b, 0x6766, 0x6763, 0x67a0, 0x6785, 0x6768, 0x67a2, 0x68ec, 0x0ae8, 0x68e7, 0x6910, 0x6918, 0x693a, 0x691a, 0x6938, 0x6941, 0x691b, 0x6914, 0x691c, 0x691d, 0x6a12, 0x6a0d, 0x6a07, 0x6a7e, 0x6a7f, 0x34b9, 0x6a80, 0x6a7a, 0x6af3, 0x6bb9, 0x6bbb, 0x6bba, 0x6bbd, 0x6bb7, 0x6bbf, 0x6c21, 0x6d3a, 0x6d3d, 0x6d36, 0x6d49, 0x6d81, 0x0bb6, 0x6d3f, 0x6d4d, 0x6d3e, 0x0bbd, 0x6d30, 0x6d4f, 0x6e37, 0x6e98, 0x6e99, 0x6f11, 0x6f0d, 0x6f88, 0x6f8a, 0x701c, 0x7055, 0x7056, 0x7062, 0x7057, 0x7042, 0x7010, 0x704d, 0x705a, 0x7066, 0x7046, 0x4b7e, 0x704f, 0x80f9, 0x7187, 0x7184, 0x71f4, 0x71f5, 0x71f2, 0x71f7, 0x7345, 0xc450, 0x7349, 0x7335, 0x72fd, /* 0x26 */ 0x7330, 0x7343, 0x7346, 0x0cd6, 0x7333, 0x74c6, 0xc456, 0x74d4, 0x8dd8, 0x74e0, 0x36a7, 0x7544, 0x2d98, 0x7654, 0x763e, 0x7635, 0x763a, 0x0d71, 0x7634, 0x7639, 0x7646, 0x765a, 0x765b, 0x763c, 0x77dc, 0x77d6, 0x77d0, 0xc45e, 0x78ac, 0xc45d, 0x78a5, 0x79f4, 0x7a24, 0x79e0, 0x79fd, 0x79f2, 0x79fc, 0x7a02, 0x79f1, 0x79ff, 0x79d2, 0x79d8, 0x79d3, 0x79f9, 0xc463, 0x79ed, 0x79f7, 0x79f0, 0x79d7, 0x7a09, 0x79f5, 0x7cc2, 0x7cc5, 0x7ccf, 0x0e98, 0x7cc1, 0x7cc6, 0x7cd4, 0x7cce, 0x7e9b, 0x7e99, 0x7e8f, 0x7eb7, 0x7e82, 0x7e93, 0x7eb4, 0x7ec1, 0x7e90, 0x7e9a, 0x7e94, 0x7e9c, 0x7eb5, 0xc46f, 0xc46e, 0x7e9f, 0x7e8e, 0x7e9e, 0x803c, 0x8047, 0x8041, 0x80eb, 0x80ec, 0x80ed, 0x80ee, 0x80df, 0x80f2, 0x810d, 0x810e, 0x2c86, 0x81a9, 0x81a4, 0x81a5, 0x825f, 0x825a, /* 0x27 */ 0x8266, 0x8268, 0x826a, 0x8264, 0x8265, 0x82c1, 0x82d8, 0xc47b, 0x82d9, 0x8309, 0x83aa, 0x83a3, 0x83b9, 0x77e2, 0x83a5, 0x83ab, 0x8420, 0x8589, 0x858b, 0x85db, 0x85e4, 0x85ef, 0x85e2, 0x85e9, 0x85f0, 0x85f3, 0x85dd, 0x861e, 0x871d, 0x8746, 0x877c, 0x8780, 0x8781, 0x8782, 0x8787, 0x8788, 0x878a, 0x878c, 0x87e7, 0x87eb, 0x87ea, 0x8868, 0x886b, 0x8869, 0x8866, 0x886a, 0x8865, 0x88e5, 0x88e4, 0x88e6, 0x8918, 0x8a24, 0x8a48, 0x8a2f, 0x8a7e, 0x8989, 0x8a1e, 0x8a49, 0x8a26, 0x8a09, 0x8a34, 0x8a2d, 0x8a4a, 0x8a15, 0xc4a9, 0x8a33, 0x8a28, 0x8a27, 0x8a20, 0x8a2b, 0x8a29, 0x8a6a, 0x8a0b, 0x8a0e, 0x8a1c, 0x89ff, 0xc4aa, 0x8a35, 0x8a11, 0x8a4b, 0x8a4c, 0x8a1f, 0x8a0f, 0x8a39, 0x8a68, 0x8a1d, 0x8a08, 0x8a0c, 0x8a0d, 0x8a62, 0x8aaf, 0x8a32, 0x8a2c, 0x8a64, /* 0x28 */ 0x8a04, 0x8a16, 0x8a4d, 0x8a07, 0x8aae, 0x8dd4, 0x8dd1, 0x8dd5, 0x8dd0, 0x8f71, 0x8f5d, 0x8f5b, 0x8f7a, 0xc4bd, 0x8f7f, 0x8f79, 0x8f67, 0x8f9e, 0x8f94, 0x8f64, 0x8f5e, 0x8f81, 0x8f5a, 0x8f57, 0x8f7c, 0x8f98, 0x8f66, 0x8f7e, 0x8f82, 0x8f68, 0x8f5f, 0x8f63, 0x8f97, 0x11cd, 0x8f53, 0x8f7b, 0x8f7d, 0x8f78, 0x9006, 0x91c0, 0x91c2, 0x91c3, 0x92dc, 0x92e6, 0x92ec, 0x92f2, 0x92e8, 0x92eb, 0x92ea, 0x92e5, 0x92e0, 0x92d0, 0x92d8, 0x92d5, 0x92d3, 0x92e4, 0x92f3, 0x92db, 0x932f, 0x93f9, 0x945d, 0x945b, 0x944c, 0x9458, 0x9460, 0x9453, 0x9450, 0x9507, 0x9508, 0x94f4, 0x94f6, 0x9504, 0x94fd, 0x9505, 0x9628, 0x9656, 0x9642, 0x965c, 0x963d, 0x962f, 0x962b, 0x9658, 0x9661, 0x962c, 0x9651, 0x9650, 0x963c, 0x9636, 0x12f6, 0x9660, 0x965b, 0x962e, 0x9640, 0x965f, /* 0x29 */ 0x9626, 0x962d, 0x965e, 0x963b, 0x97ef, 0x97f3, 0x97ee, 0x97ed, 0x985a, 0x9862, 0x985b, 0x985f, 0x985e, 0x9864, 0x98e0, 0x98e1, 0x98e5, 0x99a5, 0x999b, 0x999f, 0x999c, 0x137a, 0x99aa, 0x99a4, 0x99a3, 0x9a67, 0x9b26, 0x9b1a, 0x13b8, 0x9b1c, 0x9b15, 0x9b1b, 0x9b18, 0x9b1e, 0x9b25, 0xc4dc, 0x9c7b, 0x9c75, 0x9c93, 0x9c8f, 0x9c7c, 0x9c9b, 0x9c88, 0x9c91, 0x9c7e, 0x1401, 0x9c86, 0x9e5b, 0x9e54, 0x9f35, 0x9f40, 0x9f37, 0x9f29, 0x9f26, 0x9f23, 0x9f30, 0x9f20, 0x9f28, 0x9f32, 0x9f2a, 0x9f31, 0x9f24, 0x9f41, 0x9f42, 0x9f43, 0x9f25, 0x9f38, 0xa01c, 0xa01d, 0xa01e, 0xa0f6, 0xa1a5, 0xa189, 0xa19d, 0xa18a, 0xa187, 0xa1ab, 0xa186, 0xa19e, 0xa193, 0xa1a1, 0xa188, 0xa1a3, 0xa19f, 0xa1a0, 0xa2ff, 0xa300, 0xa302, 0xa2f8, 0xa2f7, 0xa301, 0xa387, 0xa389, 0xa376, /* 0x2a */ 0xa36e, 0xa377, 0xa382, 0xa385, 0xa383, 0xa384, 0xa457, 0xa44b, 0xa456, 0xa45d, 0xa460, 0xa44d, 0xa455, 0xa454, 0xa453, 0xa450, 0xa463, 0xa462, 0xa517, 0xa516, 0xa52d, 0xa5d9, 0xa5bf, 0x152f, 0xa5b2, 0xa5ac, 0xa5b0, 0xa5cf, 0xa5b8, 0x1531, 0xa5d3, 0xa5b1, 0xa5af, 0xa5ce, 0xa5b4, 0xa5b7, 0xa5d5, 0x159c, 0xa938, 0xa928, 0xa93f, 0xa940, 0xa941, 0xa933, 0xa92b, 0xa92e, 0xab11, 0xab18, 0xab17, 0xab19, 0xab16, 0x15e6, 0xab0d, 0xab26, 0xab79, 0xabd8, 0xabf3, 0xabd7, 0xabcc, 0xabcf, 0xabcb, 0xabd1, 0xabce, 0xabd4, 0xabd5, 0xabd3, 0xabd6, 0xabcd, 0xabda, 0xabd2, 0xabde, 0xaccc, 0xacb8, 0xacb7, 0xacc2, 0xacc3, 0xadfa, 0xadf9, 0xae1f, 0xae1d, 0x6282, 0xaea6, 0xae90, 0xae9e, 0xae98, 0xae93, 0xae92, 0xaea5, 0xae95, 0xafa9, 0xafa8, 0xafaa, 0xafab, 0xafac, /* 0x2b */ 0xb01f, 0xb022, 0xb0aa, 0xb096, 0xb091, 0xb0ab, 0xb0a2, 0xb0a4, 0xb09d, 0xb097, 0xb07d, 0xb09f, 0xb09c, 0xb099, 0xb0a6, 0xb092, 0xb0a7, 0xb1c9, 0xb1c8, 0xb1c7, 0xb1cb, 0xb274, 0xb2c9, 0x1738, 0xb2d2, 0xb2db, 0xb2eb, 0xb2e9, 0xb2ef, 0xb2ee, 0xb2f9, 0xb2de, 0xb416, 0xb445, 0xb47f, 0xb498, 0xb49f, 0xb486, 0xb490, 0xb49a, 0xb49d, 0xb48d, 0xb49c, 0xb4a0, 0xb4a7, 0xb48f, 0xb641, 0xb635, 0xb637, 0xb630, 0xb63a, 0xb636, 0xc508, 0xb6ca, 0xb712, 0xb715, 0xb722, 0xb713, 0xb718, 0xb721, 0xb810, 0xb820, 0xb82f, 0xb8a5, 0xb8a3, 0xb8b6, 0xb8ab, 0xb968, 0xb967, 0xb96f, 0xb977, 0xb964, 0xb978, 0x183a, 0xb976, 0xb96e, 0x18b1, 0xbbd0, 0xbbb3, 0xbbcb, 0xbbd6, 0xbbb1, 0xbbb4, 0xbbd7, 0xbbc6, 0xbbba, 0xbbd1, 0xbbd2, 0xbbb5, 0xbbc4, 0xbbcc, 0xbbbb, 0xbbb2, 0xbe5b, /* 0x2c */ 0xbe5a, 0xbe59, 0xbe99, 0xbe94, 0xbe96, 0xbe93, 0xbe91, 0xbe8f, 0xbe98, 0xbf0c, 0xbf0a, 0xbf0e, 0xbf12, 0xbf11, 0xbf0b, 0xbf9a, 0x1947, 0xbfb4, 0x1951, 0xc01c, 0xc020, 0xc021, 0xc0d3, 0xc0d2, 0xc138, 0x2afd, 0x6bcf, 0x2c1d, 0x2c92, 0x2c8f, 0x2c8c, 0x2dea, 0x2eb9, 0x2f6e, 0x2fa0, 0xaddd, 0x3012, 0x3017, 0x306d, 0x3205, 0x31fb, 0x31fd, 0x3206, 0x3200, 0x31ff, 0x31fe, 0x32b6, 0x3305, 0x3307, 0x34bc, 0x34bb, 0x358b, 0x3587, 0x97fb, 0x36e7, 0x36e6, 0x36e2, 0xa1d3, 0x36d9, 0x36ca, 0x3712, 0x3710, 0x36dc, 0x36d0, 0x368b, 0x3713, 0x4d10, 0x36da, 0xc34f, 0x36fd, 0x36e5, 0x36cc, 0x3739, 0x36c7, 0x36d8, 0x3a60, 0x3a64, 0x3a86, 0x3a5e, 0x3a66, 0x3a5f, 0x3a77, 0x3a82, 0x3a96, 0x3b3e, 0x3b79, 0x3b7a, 0x3c88, 0x3c89, 0x3c8c, 0x62e0, 0x3c7b, 0x3c86, 0x3d94, /* 0x2d */ 0x3d97, 0x3db7, 0x3db5, 0x3db8, 0x3d93, 0x3db2, 0x3db4, 0x3d99, 0x3dc3, 0x3d9d, 0x3d9b, 0x3da3, 0x0347, 0x3e9f, 0x3e9e, 0x3ea3, 0x3ea0, 0x3ea1, 0x3fc5, 0x3fc6, 0x3fbe, 0x3fc4, 0x3fbf, 0x404c, 0x404a, 0x40b1, 0x4115, 0x4117, 0x4110, 0x4118, 0x41e0, 0x41df, 0x4227, 0x4343, 0x4348, 0x431d, 0x4350, 0x4358, 0x4347, 0x4354, 0x4353, 0x4340, 0x4355, 0x0417, 0x435a, 0x4870, 0x455b, 0x454d, 0x4556, 0x454f, 0xc387, 0x4559, 0xc388, 0x4554, 0x4553, 0x4550, 0x46b3, 0x476e, 0x04a3, 0x476f, 0x4793, 0x4829, 0x4825, 0x4828, 0x486f, 0x54b8, 0xc397, 0x48b3, 0x4979, 0x497e, 0x497c, 0x4983, 0xc3ac, 0x4b00, 0x4b34, 0x4b65, 0x4b36, 0x4ba7, 0x4b59, 0x4b58, 0x4b31, 0x4b62, 0x4b38, 0x4b73, 0x4b3e, 0x4b55, 0x4b54, 0x4b95, 0xc3ad, 0x4ba5, 0x4b94, 0x4b9a, 0x4b9b, 0x4b99, /* 0x2e */ 0x4b9f, 0x4b53, 0x4d12, 0x4d0a, 0x4d09, 0x4d0c, 0x4d0b, 0x4d0e, 0x4d0d, 0x4d08, 0x4f38, 0x4f3a, 0x4f37, 0x4f3d, 0x4f2d, 0x4f82, 0x4f95, 0x4f87, 0x4f9d, 0x4fb5, 0x4f81, 0x4fc7, 0x4f9b, 0x4f98, 0x4f94, 0x4f86, 0x4f90, 0x4f34, 0x4f8e, 0x4f85, 0x4fa6, 0x4f96, 0x51ea, 0x51df, 0x54bd, 0x51f7, 0x51eb, 0x51e0, 0x51e8, 0x51e1, 0x51e9, 0x51ee, 0x51e5, 0x51ec, 0x5263, 0x52c6, 0x52c2, 0x52c1, 0x52c0, 0x52c3, 0x5318, 0x54ae, 0x54a3, 0x54c5, 0x54a0, 0x54b4, 0x54a5, 0x071e, 0x54a4, 0x54a8, 0x54a6, 0x57a8, 0x578d, 0x5782, 0x579e, 0x5789, 0x5783, 0x5791, 0x57a6, 0x579a, 0x5790, 0x5785, 0x577d, 0xc3ec, 0x579b, 0x57a5, 0x57f0, 0x5796, 0x5788, 0x57d6, 0x57d8, 0x5786, 0x57a4, 0x5797, 0x5a1c, 0x5a19, 0x5a9e, 0x5a9f, 0x5a9d, 0x5a9c, 0x5b5d, 0x5b5e, 0x5b73, 0x5b63, /* 0x2f */ 0x5bbe, 0x5bc1, 0x5bbc, 0x5bbf, 0x5bbb, 0x5bbd, 0x5c13, 0x5c14, 0x5cf8, 0x5cfa, 0x5d06, 0x5cfe, 0x5d51, 0x600b, 0x5ff1, 0x5fa9, 0x5fd5, 0x5fdc, 0x5fcb, 0x5ff2, 0x605f, 0x5fdb, 0x5fd6, 0x5fd9, 0x5fd1, 0x5fcf, 0x5fd8, 0x5fe0, 0x5fd4, 0x5ff3, 0x6005, 0x5fce, 0x5ff4, 0xc412, 0x5fda, 0x600e, 0x6006, 0x5fd7, 0x5fcd, 0x6007, 0x5fe1, 0x6008, 0x62be, 0x62ef, 0x62d9, 0x62da, 0x1fd7, 0x62a0, 0x62df, 0x629e, 0x62bf, 0x62af, 0x62a7, 0x62aa, 0x62f4, 0x62ae, 0x62b5, 0x62b8, 0x62db, 0x62c0, 0x62b7, 0x62a2, 0x62dd, 0x62a1, 0x62a5, 0x62b4, 0x62a6, 0x62ab, 0x62ac, 0x629f, 0x62b1, 0x62fc, 0x642e, 0x6430, 0x6499, 0x64f8, 0x64f6, 0x65f4, 0x65eb, 0x65e1, 0x65e4, 0x6775, 0x6769, 0x0a9a, 0x6799, 0x679e, 0x6794, 0x6793, 0x6791, 0x6919, 0x6917, 0x6949, 0x6947, 0x6948, /* 0x30 */ 0x6952, 0x6940, 0x6963, 0x6946, 0x695f, 0x6a0e, 0x6a85, 0x6a87, 0x6acb, 0x6acc, 0x6ac9, 0x6bcb, 0x41e7, 0x6c20, 0x6d5f, 0x6d60, 0x6d6a, 0x6d76, 0x6d73, 0x6d71, 0x6d66, 0x0bc2, 0x6d6b, 0x6d79, 0x6d7b, 0x6e3c, 0x6e9e, 0x6e9c, 0x6f1c, 0x6f1e, 0x6f21, 0x6f96, 0x6fa1, 0x6fb6, 0x6fa0, 0x6f94, 0x6f97, 0x7081, 0x7086, 0x70c0, 0x708a, 0xc44b, 0x7085, 0x7095, 0x7049, 0x7082, 0x7084, 0x4b78, 0x7090, 0x70b1, 0x71fe, 0x71fb, 0x7350, 0x7356, 0x735a, 0x734c, 0x0cdc, 0x7357, 0x74e1, 0x74d9, 0x74db, 0x74f4, 0x7545, 0x7547, 0x7674, 0x766b, 0x7668, 0x7669, 0x7679, 0xc45b, 0x7680, 0x7681, 0x7661, 0x7670, 0x766f, 0x7673, 0x765d, 0x77fa, 0x0db3, 0x77f3, 0x780a, 0x7817, 0xc45f, 0x78b0, 0x7a3e, 0x7a46, 0x7a4f, 0x7a44, 0x7a69, 0x7a33, 0x7a2f, 0x7a4e, 0x7a3a, 0x7a2b, /* 0x31 */ 0x7aa9, 0x7a50, 0x7a45, 0x7a37, 0x7a25, 0x7a2c, 0x7a3f, 0x7a34, 0x7a29, 0x7a1e, 0x7a3d, 0x7ced, 0xc466, 0x7cf3, 0x7cea, 0x7ceb, 0x7ecc, 0x7ece, 0x7ed0, 0x7ee3, 0x7ee0, 0x7ed1, 0x7edc, 0x7edd, 0x7ef0, 0x7edb, 0x7ee5, 0x7ef1, 0x7ec9, 0x7ee8, 0x7ee7, 0x7ec8, 0x7ede, 0x7ecd, 0x7ec5, 0x7ec6, 0x7ee4, 0x7ec3, 0x80fb, 0x80fc, 0x80fe, 0x8103, 0x8100, 0x80fd, 0x8105, 0x8113, 0x81a7, 0x81b4, 0x8270, 0x8274, 0x8271, 0x8275, 0x827d, 0x8273, 0x82c4, 0x82c3, 0x82de, 0x82dd, 0x8311, 0x830f, 0x8310, 0x83c3, 0x83c2, 0x83ca, 0x83c1, 0x8423, 0x85b1, 0x8624, 0x8611, 0x8625, 0x860a, 0x861f, 0x8620, 0x8614, 0x8628, 0x8603, 0x8612, 0x860b, 0x8617, 0x4d11, 0x8749, 0x8789, 0x8790, 0x878f, 0x8796, 0x8795, 0x8793, 0x87ed, 0x87f0, 0x62de, 0x8885, 0x8877, 0x887a, 0x8884, /* 0x32 */ 0x8879, 0x887d, 0x887b, 0x88ed, 0x88ec, 0x89f6, 0x899b, 0x8a9d, 0x8b11, 0x8ac4, 0x8ac8, 0x8adf, 0x8abf, 0x8ab3, 0x8aba, 0x8b10, 0x8b06, 0x8a88, 0x8a9a, 0x8ae0, 0x8acc, 0x8ab5, 0x8ae1, 0x8abc, 0x8ac6, 0x8b0b, 0x8aa4, 0x8a95, 0x8aa3, 0x8ae2, 0x8acd, 0x8ae3, 0x8aab, 0x8acb, 0x8a8f, 0xc4ab, 0x8aa9, 0x8b24, 0x8ae4, 0x8b12, 0x8ae5, 0x8b67, 0x8aaa, 0x8aa0, 0x8ae6, 0x8ac1, 0x8ae7, 0x8b0d, 0x8a86, 0x8ab0, 0x8a8b, 0x8ae8, 0x8ac9, 0x8b19, 0x8ac0, 0x8b0c, 0x8ae9, 0x8aea, 0x8ded, 0x8de3, 0x8de4, 0x8de8, 0x8dd2, 0x8de2, 0x2466, 0x8fcf, 0x8fd1, 0x8fc3, 0x8fc9, 0x8fea, 0x8fb4, 0x8fdc, 0x8fbd, 0x8fe6, 0x8fc8, 0x8fec, 0x8fb2, 0x8fa9, 0x8fd3, 0x8fc0, 0x8fe9, 0x8fd5, 0x11d9, 0x8fc5, 0x11dd, 0x8fcb, 0x8fd0, 0x8fd2, 0x8fe4, 0x8fe8, 0x8fcd, 0x8fb6, 0x8faa, 0x8fd4, /* 0x33 */ 0xa049, 0x8fc1, 0x8fdd, 0x8fce, 0x91c9, 0x91ca, 0x92fd, 0x92d9, 0x92ff, 0x9304, 0x92fa, 0x9306, 0x9315, 0x9311, 0x9307, 0x930b, 0x93fc, 0x93fd, 0x946d, 0x9465, 0x9514, 0x9513, 0x950c, 0x950b, 0x9518, 0x9522, 0x967d, 0x966f, 0x9675, 0x967b, 0x9680, 0x967f, 0x9696, 0x966d, 0x966b, 0x9686, 0x9673, 0x9662, 0x9677, 0x9681, 0x9669, 0x9682, 0x9697, 0x9684, 0x12fc, 0x9678, 0xc4d0, 0x967a, 0x966a, 0x9665, 0x967e, 0x9694, 0x97c2, 0x97c1, 0x97f9, 0x9871, 0x986b, 0x986d, 0x986f, 0x986e, 0x98f2, 0x98e8, 0x98ef, 0x98e9, 0x98ea, 0x98ed, 0x98f3, 0x98e6, 0x99c9, 0x99b4, 0x99b3, 0x99b9, 0x99ca, 0x99b1, 0x99b6, 0x99c7, 0x99c4, 0x99b7, 0x9a6f, 0x9b33, 0x9b32, 0x9b1f, 0xc4d9, 0x9b2b, 0x9b30, 0x9b36, 0x9b42, 0x9b41, 0xc4d8, 0x9ca5, 0x9cab, 0x9ca9, 0x9cb3, 0x9ca7, /* 0x34 */ 0x9ca0, 0x9cd2, 0x9ca8, 0x9cb6, 0x9cac, 0x9cae, 0x9ce6, 0x9e65, 0x9f47, 0x9f63, 0x9f4d, 0x9f5f, 0x9f4b, 0x9f60, 0x9f49, 0x9f53, 0xc4df, 0x263a, 0x9f57, 0x9f4e, 0x9f52, 0x9f54, 0xa020, 0xa022, 0xa1c1, 0xa1d7, 0xa1d5, 0xa1c4, 0xa1d0, 0xa1bb, 0xa1e2, 0xa1cb, 0xa1b8, 0xa1bf, 0xa1d8, 0xa1c0, 0xa1ba, 0xa1b4, 0xa1bc, 0xa1d4, 0xa1ed, 0xa1c2, 0xa1d9, 0xa1cc, 0xa32f, 0xa323, 0xa396, 0xa38d, 0xa39e, 0xa399, 0xa483, 0x1507, 0xa46a, 0xa469, 0xa475, 0xa46c, 0xa480, 0xa46e, 0xa481, 0xa477, 0xa476, 0xa473, 0xa470, 0xa484, 0xa519, 0xa5f2, 0x273d, 0xa5ec, 0xa5eb, 0xa5f6, 0xa5ef, 0xa5f4, 0xa5ee, 0xa5f3, 0xa5ed, 0xa89b, 0xa898, 0xa894, 0x3a7a, 0xa89a, 0xc4f0, 0xa94c, 0x15a8, 0xa957, 0xa951, 0xa962, 0xa952, 0xa95c, 0xa953, 0xc4ef, 0xaa85, 0xab2d, 0xab3e, 0xab30, /* 0x35 */ 0xab7d, 0xabe6, 0xabf6, 0xabe4, 0xabe9, 0xabec, 0xabf2, 0xabe8, 0xabe3, 0xabeb, 0xabf0, 0xabea, 0xabe7, 0xabfd, 0xabe5, 0xabee, 0xabf5, 0xabf9, 0xabf1, 0xabf4, 0xc4f4, 0xac11, 0xacde, 0xacd8, 0xacdd, 0xacdb, 0xacd3, 0xace1, 0xadde, 0xadfc, 0xae28, 0xaeb7, 0xaeb8, 0xaec7, 0xaeb2, 0xaea9, 0xaeb9, 0xaebc, 0xaeb3, 0xaed1, 0xafb0, 0xafb1, 0xafb6, 0xb004, 0xb02c, 0xb0c1, 0xb09e, 0xb0ba, 0x16ca, 0xb0d1, 0xb0d3, 0xb0d4, 0xb0d5, 0xb0c5, 0xb0b6, 0xb0b2, 0xb0b5, 0xb0c3, 0xb0b9, 0xb0c6, 0xb1d6, 0xb1e0, 0xb1db, 0xb1d7, 0xb1dd, 0xb315, 0xb30c, 0xb30f, 0xb30e, 0xb2fe, 0xb304, 0xb30b, 0xb302, 0xb2ff, 0xb308, 0xb310, 0xb317, 0xb313, 0xb306, 0xb309, 0xb424, 0xb426, 0xb425, 0xb448, 0xb4b5, 0xb4d2, 0xb4d5, 0xb4c4, 0xb4af, 0xb4ad, 0xb4c1, 0xb4c0, 0xb4cc, 0xb4cd, /* 0x36 */ 0xb4c3, 0xb4c8, 0xb4c5, 0xb4ba, 0xb4d0, 0xb4c2, 0xb4ce, 0x178d, 0xb643, 0xb642, 0xb640, 0xb631, 0xb6cf, 0xb6ce, 0xb730, 0xb734, 0xb732, 0xb743, 0xb73c, 0xb811, 0xb835, 0xb834, 0xb837, 0xb831, 0xb8bf, 0xb8bc, 0xb8c2, 0xb8c9, 0xb983, 0xb98b, 0xb9a0, 0xb98d, 0xb98c, 0xb99a, 0xb98a, 0xb991, 0xbbf1, 0xbc0f, 0xbc01, 0xbc07, 0xbc0c, 0x18c0, 0xbbdc, 0xbbee, 0xbbf7, 0xbbf2, 0xbbf8, 0xbbeb, 0x18ca, 0xbbe6, 0xbbed, 0xbbe9, 0xbc08, 0xbc00, 0xbbe5, 0xbbfc, 0xbe61, 0xbe5e, 0xbe5f, 0x1925, 0xbe9b, 0xbf16, 0xbf15, 0xbf20, 0xbf14, 0xbf1a, 0xbf17, 0xbf9c, 0x194a, 0xbff1, 0x1953, 0xbff0, 0xc028, 0xc024, 0xc02a, 0xc02b, 0xc0d5, 0xc104, 0xc105, 0xc191, 0xc192, 0xc2a6, 0x2c09, 0x2e22, 0x2e1a, 0x2e0e, 0x2e1b, 0x2e08, 0x6fb3, 0xc31c, 0x309d, 0x3212, 0x321e, 0x32bb, /* 0x37 */ 0x32bf, 0x32bc, 0x3308, 0x3309, 0x3363, 0x33c8, 0x5828, 0x358e, 0x358d, 0x3743, 0x374d, 0x376d, 0x3742, 0x3752, 0x3751, 0x3769, 0x3750, 0x3756, 0x376c, 0x3744, 0x3745, 0x376b, 0x0205, 0x3768, 0x3757, 0x392e, 0x3931, 0x392d, 0x3a8b, 0x3ab2, 0x3a8d, 0x3aa3, 0x3aa4, 0x3a90, 0x3a89, 0x3a8e, 0x3a92, 0x3b7b, 0x3c90, 0x3c8f, 0x3de9, 0x3dcd, 0x3dc5, 0x3dd0, 0x3dc9, 0x3dd1, 0x3dc7, 0x3dd2, 0x3d5f, 0x3de1, 0x3dcc, 0x3dc6, 0x3de4, 0x3ea9, 0x3fd3, 0x3fda, 0x3fd2, 0x3fdb, 0x404d, 0x404e, 0x411c, 0x41e8, 0x436c, 0x435f, 0x4366, 0x4364, 0x4378, 0x4365, 0x436d, 0x4361, 0x437a, 0x4407, 0x4566, 0x4568, 0x4562, 0x46d3, 0x46d4, 0x46d1, 0x46dc, 0x4773, 0x4772, 0x482d, 0x482c, 0x482f, 0x4872, 0x48b4, 0x4989, 0x4bcd, 0x4ba6, 0x4ba2, 0x4ba0, 0x4b46, 0x4ba1, 0x8657, /* 0x38 */ 0x4ba3, 0x4bb1, 0x4bdb, 0x4bf6, 0x4bdc, 0x4bd6, 0x4d13, 0x4f9c, 0x4f97, 0x4fd8, 0x4fe4, 0x4fd4, 0x4fe5, 0x4fdb, 0x4fd0, 0x4fda, 0x4fcc, 0x4fdc, 0x4fed, 0x4fd3, 0x4fd1, 0x4fce, 0x4fd9, 0x4fdd, 0xc3c6, 0x50e6, 0x50e5, 0x50e9, 0x51ff, 0x51fe, 0x520e, 0x528c, 0x52ca, 0x52cb, 0x531a, 0x54d7, 0x54cf, 0x54d0, 0x54c9, 0x54cc, 0x54d3, 0x55a4, 0x55a3, 0x5781, 0x5826, 0x57f3, 0x5827, 0x57f2, 0x57ff, 0x57f5, 0x57fc, 0x580e, 0x07f0, 0x57f6, 0x5800, 0x5823, 0x5805, 0x5825, 0x5808, 0x5850, 0x5a25, 0x5a20, 0x5a23, 0x5a21, 0x5aa1, 0x5b69, 0x5b6c, 0x5b68, 0x5b6b, 0x5bcc, 0x5bcd, 0x5d10, 0x5d0d, 0x5d0a, 0x5d16, 0x5d14, 0x5d52, 0x6028, 0x602e, 0x602c, 0x604d, 0x6049, 0x6031, 0x6030, 0x6033, 0x602d, 0x6036, 0x603e, 0x602f, 0x6027, 0x6034, 0x604c, 0x62fe, 0x6312, /* 0x39 */ 0x631f, 0x6317, 0x62f5, 0x6315, 0x62f7, 0x0a02, 0x437d, 0x62fa, 0x62f9, 0x634b, 0x649c, 0x649d, 0x0a23, 0x65f0, 0x65f6, 0x65ef, 0x679d, 0x679a, 0x67a7, 0x67af, 0x67aa, 0x6964, 0x6986, 0x6975, 0x6970, 0x6984, 0x696b, 0x6985, 0x696c, 0x6a17, 0x6a94, 0x6a93, 0x6bd2, 0x6bd7, 0x6bd4, 0x6da6, 0x6da7, 0x6d9c, 0x6d8b, 0x6d8d, 0x6d98, 0x6db9, 0x6d9b, 0x6d9d, 0x6d99, 0x6da8, 0x6d91, 0x6d87, 0x6d9a, 0x6ea6, 0x6f1f, 0x6fa7, 0x6fb1, 0x6fb2, 0x6fb7, 0x70d0, 0x70b3, 0x70b5, 0x70c4, 0x70c3, 0x70bc, 0x70b2, 0x70ba, 0x70bb, 0x70c2, 0x70cd, 0x70be, 0x70b7, 0x718f, 0x7203, 0x7204, 0x7371, 0x7377, 0x7374, 0x738b, 0x737a, 0xc451, 0x738c, 0x7373, 0x74ff, 0x74fb, 0x74fd, 0x74f0, 0x74f3, 0x74fc, 0x74f2, 0x7692, 0x769e, 0x76ae, 0x7696, 0x7814, 0x7812, 0x7813, 0x7816, /* 0x3a */ 0x780f, 0x78b6, 0x78bd, 0x7a8c, 0x7aae, 0x7aac, 0x7aab, 0x7a99, 0x7a92, 0x7abb, 0x7a9e, 0x7a7e, 0x7aaf, 0x7abc, 0x7a98, 0x7d01, 0x7d09, 0x7d06, 0xc467, 0x7d07, 0x7d08, 0x7ecf, 0x7f0e, 0x7f32, 0x0f15, 0x7f12, 0x7f16, 0x7f17, 0x7f1b, 0x7f15, 0x7f31, 0x7f18, 0x7f1a, 0x7f10, 0x7f0a, 0x7f09, 0x804f, 0xc473, 0x810f, 0x8110, 0xc475, 0x8128, 0x8111, 0x8116, 0x8117, 0x8102, 0x81bb, 0x81ba, 0x81c3, 0x81bc, 0x828a, 0x8284, 0x8286, 0x82e0, 0x8317, 0x8318, 0x831e, 0x8315, 0x83d3, 0x83da, 0x83d9, 0x85e6, 0x85f4, 0x85e1, 0x8669, 0x8640, 0x8658, 0x866c, 0x864d, 0x8721, 0x8799, 0x87f1, 0x5f68, 0x8886, 0x8b5b, 0x8b5c, 0x8b77, 0x8b2c, 0xc4ad, 0x8b58, 0x8b64, 0x8b61, 0x8b48, 0x8b97, 0x8b59, 0x8b29, 0x8b62, 0x8b2e, 0x8b68, 0x8b90, 0x8b3a, 0x8b3d, 0x8b5e, 0x8b46, /* 0x3b */ 0x8b69, 0x8b65, 0x8b3e, 0x8b49, 0x8b56, 0x8be1, 0x8b78, 0x8b79, 0x8b66, 0x8b4a, 0x8b35, 0x8b7a, 0x8b92, 0x8b60, 0x8b36, 0x8b51, 0x8b42, 0x115d, 0x8b3f, 0x8b7b, 0x8b5d, 0x8b94, 0x8b6a, 0xc4b5, 0x8df2, 0x8fbb, 0x901b, 0x901a, 0x9033, 0x9017, 0x900a, 0x9015, 0x9012, 0x9001, 0x902d, 0x8ffd, 0x9023, 0x9005, 0x9011, 0x9000, 0x901c, 0x9035, 0x902e, 0x9036, 0x34bf, 0x902f, 0x900c, 0x9009, 0x9031, 0x8ffc, 0x900f, 0x9018, 0x9002, 0x9200, 0x931f, 0x9337, 0x125a, 0x9338, 0x932b, 0x932e, 0x9321, 0x9330, 0x9329, 0x9331, 0xc4c9, 0x9301, 0x932c, 0x9322, 0x93ff, 0x9477, 0x9467, 0x947f, 0x947d, 0x947b, 0x947e, 0x951e, 0x951c, 0x9521, 0x9526, 0x9527, 0x9529, 0x952c, 0x951d, 0x952b, 0x96bf, 0x96a4, 0x96aa, 0x96ae, 0x969f, 0x96d0, 0x96b1, 0x96ad, 0x969b, 0x96b2, /* 0x3c */ 0x96a9, 0x96b3, 0x96b4, 0x96ba, 0x96a5, 0x96b7, 0x96ac, 0x96cb, 0x96cf, 0x97c6, 0x9801, 0x97ff, 0x97fd, 0x9877, 0x9878, 0x9876, 0x98f7, 0x99cc, 0x1385, 0x99d4, 0x99d7, 0x99d5, 0x99d6, 0x99d3, 0x9b5d, 0x9b55, 0x9ce0, 0x9d48, 0x9cee, 0x9cdb, 0x9ce7, 0x9cd6, 0x9ce5, 0x9ce1, 0x9cdd, 0x9ce2, 0x9e70, 0x9e66, 0x9e6f, 0x9e6e, 0x9f81, 0x9f69, 0x9f6e, 0x9f6d, 0x9f6c, 0x9f84, 0x9f85, 0x9f71, 0x9f73, 0x9f6a, 0x9f6f, 0x9f7b, 0xa16a, 0xa17c, 0xa17d, 0xa181, 0xa1fa, 0xa205, 0xa1eb, 0xa1fb, 0xa1e9, 0xa1ef, 0xa1fc, 0xa1e7, 0xc4e1, 0xa1ee, 0xa1fd, 0xa332, 0xa3a7, 0xa3b5, 0xa3b1, 0xa3b9, 0xa3a8, 0xa3b3, 0xc4e6, 0xa48a, 0xa491, 0xa48d, 0xa499, 0x150b, 0xa49a, 0xa49b, 0xa492, 0xa48f, 0xa4ab, 0x6bdb, 0x1539, 0xa675, 0xa631, 0xa638, 0x1537, 0xa635, 0xa669, 0xa63b, /* 0x3d */ 0xa63d, 0xa66c, 0xa679, 0xa63c, 0xa63e, 0xa897, 0xa8a5, 0xa8a2, 0xa89d, 0xa8a1, 0xa968, 0xa96f, 0xa96d, 0xa972, 0xa975, 0xa977, 0xa979, 0xaab5, 0xaaea, 0xaaab, 0xab43, 0xab41, 0xab42, 0xac09, 0xac08, 0xac06, 0xac01, 0xac03, 0xac00, 0xac04, 0xac0a, 0xac0e, 0xac0d, 0xac07, 0xac0f, 0xac14, 0xac02, 0xac15, 0xac0c, 0xac10, 0xac05, 0xacfd, 0xacff, 0xad04, 0xad00, 0xad09, 0xae2b, 0xc4f7, 0xae31, 0xaedb, 0xaec5, 0xaed3, 0xaece, 0x166b, 0xaec9, 0xaebf, 0xaecb, 0xaec0, 0xaed0, 0xaed4, 0xafc1, 0xafb9, 0xafbb, 0xafc3, 0xafc9, 0xb007, 0xb02d, 0xb0f8, 0xb0e1, 0xb0fa, 0xb0ef, 0xb0fd, 0x16cd, 0xb0eb, 0xb0f1, 0xb0ed, 0xb0fe, 0xb1f8, 0xb203, 0xb1ee, 0xb1e8, 0xb201, 0xb2ec, 0xb322, 0xb314, 0xb334, 0xb32f, 0xb339, 0xb341, 0xb33c, 0xb349, 0xb358, 0xb33a, 0xb342, /* 0x3e */ 0xb33f, 0xb422, 0xb423, 0xb44a, 0xb4dc, 0xb4d9, 0xb4db, 0xb4e2, 0xc507, 0xb4df, 0xb4e0, 0xb4d7, 0xb64f, 0xb646, 0xb653, 0xb655, 0xb64e, 0xb64a, 0xb64c, 0xb663, 0xb751, 0xb753, 0xb758, 0xb74d, 0xb75a, 0xb749, 0xb75d, 0xb812, 0xb83c, 0xb8d1, 0xb8df, 0xb8d6, 0xb8d8, 0xb8e0, 0xb8d9, 0xb9b1, 0xb9ac, 0xb9aa, 0xb9ee, 0xb9bd, 0x184d, 0xb9c3, 0xb9a8, 0xb9ae, 0xb9ab, 0xbc1d, 0xbc27, 0xbc38, 0xbc12, 0xbc48, 0xbc2b, 0xbc16, 0xbc19, 0xbc3d, 0xbc23, 0xbc2a, 0xbe64, 0xbead, 0xbeac, 0xc514, 0xbeb1, 0xbeaf, 0xbf2c, 0xbf24, 0xbf25, 0xbf28, 0xbff9, 0xbff7, 0xbffd, 0xbffe, 0xc039, 0xc033, 0xc0d7, 0xc0d8, 0xc0e4, 0x3aa1, 0xc10e, 0xc13b, 0xc144, 0xc142, 0xc194, 0xc193, 0xc1d5, 0xc2a7, 0x2e31, 0x2e23, 0x2e28, 0x2e27, 0x2ec6, 0x2fa3, 0x3021, 0x321b, 0x0110, 0x32c1, /* 0x3f */ 0x32c3, 0x332a, 0x3369, 0x3427, 0x37b6, 0x37a7, 0x37a4, 0x37a6, 0x3790, 0x379e, 0x3794, 0x37a8, 0x37a5, 0x37a2, 0x3791, 0x027b, 0x3abc, 0x3abd, 0x3ab4, 0x3ab0, 0x3ae4, 0x3b45, 0x3b4b, 0x3b7e, 0x3b7f, 0x3b7d, 0x3bc3, 0x3dfc, 0x3df7, 0x3df0, 0x3ded, 0x3df1, 0x3df8, 0x3fe9, 0x41eb, 0x041d, 0x4390, 0x438d, 0x4386, 0x4391, 0x438a, 0x4408, 0x4450, 0x46ea, 0x46e6, 0x46e2, 0x46e7, 0x46ed, 0x46e1, 0x4834, 0x4876, 0x4875, 0x4873, 0x48b5, 0x4990, 0x4992, 0x4be1, 0x4bdf, 0x4bd5, 0x4bf2, 0x4bfe, 0x4c13, 0x4c2e, 0x4d19, 0x5008, 0x1df5, 0x5005, 0x5009, 0x5006, 0x5003, 0x4ffd, 0x4ffc, 0x5002, 0x5042, 0x521a, 0x5211, 0x5215, 0x5216, 0x52cc, 0x52cf, 0x52d0, 0x5322, 0x531e, 0x5321, 0x54e5, 0x0727, 0x5554, 0x54ef, 0x5553, 0x5551, 0x55ad, 0x5867, 0x5868, 0x58a4, /* 0x40 */ 0x5877, 0x5889, 0x5844, 0x588b, 0x5879, 0x585b, 0x5843, 0x5857, 0x584a, 0x587c, 0x5846, 0x587b, 0x5856, 0x5aa8, 0x5b76, 0x5b72, 0x5bd6, 0x5bd8, 0x5bd1, 0x5d22, 0x5d20, 0x5d23, 0x5d1e, 0x5d6e, 0x60a3, 0x6077, 0x60a6, 0x606d, 0x60a2, 0x607c, 0x6084, 0x6068, 0x6074, 0x6086, 0x60a5, 0x607b, 0x607a, 0x6069, 0x6072, 0x6076, 0x634a, 0x6337, 0x632a, 0x632d, 0x6346, 0x6328, 0x6326, 0x6342, 0x632c, 0x6338, 0x632b, 0x6333, 0x6345, 0x6439, 0x65f9, 0x65fa, 0x67b8, 0x67b7, 0x67bb, 0x67b9, 0x67b4, 0x696f, 0x6987, 0x698f, 0x69a2, 0x69a3, 0xc431, 0x6a9b, 0x6a9d, 0x6ace, 0x0bcf, 0x6dbd, 0x6dbf, 0x6d92, 0x0bcd, 0x6def, 0x6dc9, 0x6ea4, 0x6ea8, 0x6eaa, 0x6f28, 0x6f24, 0x6f25, 0x6f26, 0x6fa9, 0x6fba, 0x6fbe, 0x6fbc, 0x6fc0, 0x70f0, 0x70df, 0x70e0, 0x70ed, 0x70db, /* 0x41 */ 0x70fb, 0x70b9, 0x70da, 0x70eb, 0x70ec, 0x739a, 0x739f, 0x739b, 0x7397, 0x73a1, 0x750f, 0x7505, 0x7548, 0x0d82, 0x76bc, 0x76ba, 0x78bf, 0x7b01, 0x7ae8, 0x7aef, 0x7ae4, 0x7ae6, 0x7b02, 0x7aeb, 0x7ae0, 0x7aed, 0x7ad9, 0xc464, 0x7b14, 0x7aee, 0x0e52, 0x7b13, 0x7af9, 0x7af8, 0x7d25, 0xc469, 0x7d19, 0x7d20, 0x7d43, 0x7d3f, 0x7f45, 0x7f4c, 0x7f49, 0x7f4f, 0x7f41, 0x7f3e, 0x7f4d, 0x7f52, 0x7f4a, 0x7f4e, 0x7f73, 0x7f42, 0x7f51, 0x7f55, 0x7f50, 0x7f6c, 0x2afd, 0x7f6a, 0x7f53, 0x7f68, 0x8055, 0x8056, 0x811c, 0x811d, 0x2280, 0x811e, 0x8123, 0x811f, 0x81e1, 0x81cd, 0x81cb, 0x81cc, 0x81c8, 0x81c9, 0x829b, 0x8294, 0x8292, 0x8296, 0x8293, 0x8295, 0x828f, 0x831d, 0x8322, 0x8321, 0x83e9, 0x83ef, 0x83e0, 0x83e6, 0x83e4, 0x8629, 0x862c, 0x8676, 0x8683, 0x8678, /* 0x42 */ 0x863c, 0x6343, 0x867a, 0x1051, 0x86f2, 0x879e, 0x879b, 0x879a, 0x87f6, 0x87f5, 0x88a5, 0x8893, 0x88a4, 0x8a82, 0x8ac7, 0x8bb7, 0x8c1d, 0x8be2, 0x8bd7, 0x8be3, 0x8be4, 0x8bbc, 0x8bd3, 0x115a, 0x8b5a, 0x8bd2, 0x8b2d, 0xc4af, 0x8bc4, 0x8bd0, 0x8be5, 0x8c05, 0x8c07, 0x8be6, 0x8c1b, 0x8be7, 0x8bd8, 0x8bbe, 0x8c17, 0x8bb4, 0x8bd9, 0x8be8, 0x8bad, 0x8baf, 0x8bc8, 0x8be9, 0x8bea, 0x8dfe, 0x8dfb, 0x8e00, 0x9072, 0x9070, 0x9046, 0x9059, 0x905e, 0x9048, 0x904f, 0x9071, 0x9060, 0x905f, 0x906e, 0x9073, 0xc4c0, 0xc4bf, 0x9047, 0x906d, 0x906f, 0x9081, 0x906c, 0x9078, 0x9083, 0x9049, 0x9068, 0x9074, 0x9063, 0x906a, 0x8685, 0x9065, 0x9062, 0x90c8, 0x91d0, 0x91d4, 0x91d1, 0x9203, 0x9342, 0x9363, 0x9356, 0x935b, 0x9355, 0x9350, 0x932d, 0x9344, 0x9348, 0x9345, /* 0x43 */ 0x9382, 0x1265, 0x9362, 0x9485, 0x948d, 0x9536, 0x952f, 0x9531, 0x9537, 0x96a7, 0x96d9, 0x96f0, 0x96f2, 0x96fd, 0x96e8, 0x96eb, 0x96ee, 0x96e0, 0x96e9, 0x96ed, 0x96d6, 0x96f8, 0x96d4, 0x96df, 0x96e7, 0x96d8, 0x96e3, 0x96ef, 0x970f, 0x97ca, 0x3b46, 0x9805, 0x980c, 0x980d, 0x987f, 0x9880, 0x9881, 0x9901, 0x9903, 0x99f2, 0x99e2, 0x99e3, 0x99de, 0x99e9, 0x99e8, 0x99e0, 0x9a01, 0x99f5, 0x99e4, 0x2501, 0x9a77, 0x9b74, 0x9b6f, 0x9b62, 0x9b61, 0x9b6d, 0x9b73, 0x9b6a, 0x9b69, 0x9d12, 0x9d2d, 0x9d14, 0x9d0f, 0x9d29, 0x9d16, 0x9d03, 0x9d46, 0x9d5c, 0x9d11, 0x9d06, 0x9cdc, 0x9d2b, 0x9d2a, 0x9d2c, 0x9d27, 0x9e7a, 0x9f9c, 0x9f99, 0x9f95, 0x9f8b, 0x9f98, 0x9f96, 0xa032, 0xa1a4, 0xa1aa, 0xa21b, 0x14af, 0xa20d, 0xa21c, 0xa20a, 0xa220, 0xa208, 0xa21a, 0xa213, /* 0x44 */ 0xa211, 0xa35d, 0xa35f, 0xa35e, 0xa360, 0xa3bb, 0xa3bc, 0xa3c1, 0xa3c0, 0xa3c8, 0xa3ce, 0xa4a7, 0xa4b2, 0xa4b6, 0xa4a5, 0xa4ba, 0xa4b5, 0xa4ad, 0xa4a4, 0xa4d3, 0xa4b0, 0xa4b1, 0xa51d, 0xa68d, 0x1541, 0xa691, 0xa6b6, 0xa6b7, 0xa6bd, 0xa6bc, 0xa696, 0xa694, 0xa6a0, 0xa8a8, 0xa8a6, 0xa984, 0xa996, 0xa988, 0xa99a, 0xaad1, 0xaacf, 0xab50, 0xab51, 0xab4e, 0xab80, 0xab81, 0xac1b, 0xac17, 0xac20, 0xac19, 0xac1a, 0xac21, 0xac1e, 0xac18, 0xac1d, 0x1629, 0xad2d, 0xad24, 0xad27, 0xad2e, 0xad25, 0xad1c, 0xad19, 0x162a, 0xad23, 0xad1f, 0xad1a, 0xad2b, 0xad1e, 0xade0, 0xae33, 0xaee6, 0xaefc, 0xaee5, 0xaef8, 0xaef6, 0xaeea, 0xaef2, 0xaeed, 0xaeeb, 0xaef0, 0xaef1, 0xafc6, 0xafc8, 0xafce, 0xafc5, 0x1696, 0xafcb, 0xb113, 0xb114, 0xb107, 0xb10c, 0xb21a, 0x1712, /* 0x45 */ 0xb217, 0xb206, 0xb216, 0xb207, 0xb210, 0xb209, 0xb219, 0xb215, 0xb36e, 0xb33b, 0xb33e, 0xb36c, 0xb365, 0xb364, 0xb359, 0xb37c, 0xb370, 0xb379, 0xb42c, 0xb452, 0xb451, 0xb44c, 0xb500, 0xb510, 0xb513, 0xb4ff, 0xb4fe, 0xb4ed, 0xb65a, 0xb658, 0xb65c, 0xb6da, 0xb778, 0xb75e, 0xb767, 0xb764, 0xb813, 0xb823, 0xb841, 0xb83f, 0xb840, 0xb8ed, 0xb8e3, 0xb8ea, 0xb8f0, 0xb8e6, 0xb8e9, 0xb8f1, 0xb8ee, 0xb9d4, 0xb9d1, 0xb9dc, 0xb9ec, 0xbc69, 0xbc6d, 0xbc57, 0xbc66, 0xbcf9, 0xbc4a, 0xbc60, 0xbc56, 0xbc59, 0xbc4c, 0xbc6a, 0xbc62, 0xbc63, 0xbc70, 0xbc5f, 0xc50d, 0xbc64, 0xbc5d, 0xbc68, 0xbc9f, 0xbeba, 0xbeb8, 0xbebc, 0xbeb9, 0xbeb4, 0xbf3b, 0xbf2d, 0xbf38, 0xbf2f, 0xbf32, 0xc041, 0xc0cb, 0xc0de, 0xc0dd, 0xc0da, 0xc0dc, 0xc110, 0xc14f, 0xc149, 0xc198, 0xc196, /* 0x46 */ 0xc197, 0xc1c7, 0x2c9c, 0xc1da, 0xc1d8, 0xc2a8, 0x2c0a, 0x2c9d, 0x2ecb, 0x2f38, 0x2f39, 0x2fa6, 0x3223, 0x3222, 0x3221, 0x33ce, 0x3592, 0x3591, 0x37ec, 0x37e0, 0x37ed, 0x3808, 0x37e5, 0x37ee, 0x37e4, 0x37eb, 0x37e3, 0x37ea, 0x380a, 0xc359, 0x3ad1, 0x3ae3, 0x3ad4, 0x3ad0, 0x3ad9, 0x027e, 0x1be1, 0x3ada, 0x3ad3, 0x3b4c, 0x3b4d, 0x3b7c, 0x3b80, 0x3bcc, 0x3dff, 0x3e08, 0xc108, 0x3e01, 0xc36b, 0x3e00, 0x3fed, 0x3ff3, 0x3fee, 0x3ff1, 0x3ff0, 0x3fde, 0x4051, 0x4382, 0x43a9, 0x4398, 0x439d, 0x439a, 0x439e, 0x439f, 0x43a6, 0x43a7, 0x4409, 0x442f, 0x4571, 0x456d, 0x4572, 0x46ef, 0x46f0, 0x483b, 0x4839, 0x483c, 0x4838, 0x6afd, 0x483a, 0x4878, 0x4879, 0x4877, 0x4998, 0x499c, 0x4999, 0x499a, 0x4c11, 0x4c0a, 0x4bfd, 0x4c0f, 0x4c19, 0x4c03, 0x4c15, 0x4c0c, /* 0x47 */ 0x4c09, 0x4c12, 0x4c34, 0x4c2a, 0x4c08, 0x4c2d, 0x4c28, 0xc3b1, 0x4c2c, 0x4c26, 0x4c33, 0x05a7, 0x4d1a, 0x4d1e, 0x5007, 0x502c, 0x5032, 0x5028, 0x5031, 0x5029, 0x5030, 0x502a, 0x5044, 0x502e, 0x52d1, 0x5324, 0x54f7, 0x54f4, 0x54f3, 0x54f8, 0x58b5, 0x5896, 0x5898, 0x5895, 0x5891, 0x58b2, 0x589e, 0x5859, 0x58a3, 0x589a, 0x589b, 0x0f20, 0x7f83, 0x5bda, 0x5bdf, 0x5c16, 0x5d1f, 0x5d2d, 0x5d2e, 0x5d2b, 0x60b8, 0x60bb, 0x60bf, 0x60ba, 0x60d5, 0x60e3, 0x60c1, 0x60be, 0x60bd, 0x60b4, 0x60c2, 0x60a1, 0x6087, 0x60d7, 0x60ca, 0x60b5, 0x60da, 0x60d9, 0x60b3, 0x60d8, 0x6367, 0x6371, 0x6362, 0x635c, 0x6368, 0x6352, 0x6356, 0x3809, 0x2e42, 0x64a0, 0x6600, 0x65fe, 0x65ff, 0x67cb, 0xc428, 0x67ca, 0x67a9, 0x67c8, 0x69b4, 0x69ac, 0x69aa, 0x69a9, 0x6b0e, 0x6be9, /* 0x48 */ 0x6bed, 0x6bf2, 0x6beb, 0x6bee, 0x6de8, 0x6ddb, 0x6dd7, 0x6de3, 0x6de5, 0x6dee, 0x6dd5, 0x6eb3, 0x6f2d, 0x6fc1, 0x6fc3, 0x710c, 0x710e, 0x7107, 0x7117, 0x7109, 0x7116, 0x719a, 0x719c, 0x73b4, 0x73b7, 0x73b3, 0x3b4e, 0x7513, 0x7514, 0x76e6, 0x76dc, 0x76e8, 0x76e5, 0x782e, 0x782c, 0x782b, 0x78cd, 0x7b3d, 0x7b32, 0x7b2d, 0x7b45, 0x7b3e, 0x7b50, 0x7b25, 0x7b53, 0x7b23, 0x7d37, 0x7d38, 0x7d47, 0x7d3d, 0x7d3e, 0x7d49, 0x7d4a, 0x7d1d, 0x21e9, 0x7fa5, 0x7f8c, 0x7f8d, 0x7f89, 0x7f96, 0x7f85, 0x7f8f, 0x7f77, 0x7f8e, 0x7f82, 0x7f8a, 0x7f88, 0x7f7b, 0x7f97, 0x7f7d, 0x7f79, 0x8059, 0x8124, 0x812d, 0x812e, 0x812b, 0xc476, 0x81da, 0x81d8, 0x81d6, 0x8287, 0x82a0, 0x8328, 0x8325, 0x831f, 0x83f3, 0x83f7, 0x83f6, 0x862b, 0x865b, 0x8648, 0x23cb, 0x865c, 0x866d, /* 0x49 */ 0x869d, 0x8699, 0x868c, 0x8691, 0x869b, 0x869a, 0x869c, 0x8695, 0x868d, 0x8696, 0x86a5, 0x872a, 0x87a1, 0x87a4, 0x87ad, 0x88a9, 0x88ae, 0x88b0, 0x8c0d, 0x8b63, 0x8b71, 0x8c51, 0x8c54, 0x8c2a, 0x8c44, 0x8c55, 0x8c99, 0x8c39, 0x8c3f, 0x8c3e, 0x8c4f, 0x8c4d, 0x8c35, 0x8c40, 0x8c31, 0x8bd5, 0x8c2b, 0x8c33, 0x8c41, 0x8c56, 0x8c4c, 0x8c46, 0x8c3c, 0x8c45, 0x8c43, 0x8c3d, 0x8c70, 0x8c57, 0x8c38, 0x8c58, 0x1165, 0x8c37, 0x8e07, 0x8e06, 0x8e09, 0x90ab, 0x9090, 0x9093, 0x90bc, 0x90a9, 0x909e, 0x90bf, 0x90aa, 0x9091, 0x90a4, 0x909a, 0x90a7, 0x90a1, 0x909c, 0x90a2, 0x909b, 0x909f, 0x9094, 0x908f, 0x8ef0, 0x9092, 0x9095, 0x90a5, 0x90a6, 0x9204, 0x939c, 0x9379, 0x937a, 0x937e, 0x937b, 0x9371, 0x9381, 0x937f, 0x937c, 0x937d, 0x9375, 0x9376, 0x948e, 0x948f, /* 0x4a */ 0x953e, 0x953f, 0x9540, 0x9541, 0x1304, 0x970d, 0x9717, 0x9710, 0x970e, 0x96ea, 0x971d, 0x9703, 0x9722, 0x9704, 0x9700, 0x9720, 0x9721, 0x9723, 0x9713, 0x9709, 0x9711, 0x97cb, 0x97ce, 0x97d0, 0x97cc, 0x97d4, 0x3adb, 0x9809, 0x980b, 0x9885, 0x9906, 0x990d, 0x1364, 0x9914, 0x990f, 0x9a09, 0x9a14, 0x9a0b, 0x99fc, 0x9a04, 0x9a0a, 0x9a00, 0x99fd, 0x9a07, 0x9a06, 0x9a11, 0x9a79, 0x9a78, 0x9b88, 0x9b80, 0x9b8b, 0x9d59, 0x9d61, 0x9d75, 0x1423, 0x9d55, 0x9d5b, 0x9d5f, 0x9d52, 0x9d62, 0x9d72, 0x9d5d, 0x9d68, 0x9d71, 0x9d65, 0x9d66, 0x9d67, 0x9d76, 0x9d4c, 0x9d60, 0x9d74, 0x9d50, 0x9e8a, 0x9e81, 0x9e86, 0x9e7f, 0x9e80, 0x9fa5, 0x9fa7, 0x9fa8, 0x9fa6, 0x9faf, 0x7f95, 0x9fb1, 0xa035, 0xa039, 0xa1c3, 0xa230, 0xa22a, 0xa22b, 0xa22d, 0xa22e, 0xa22c, 0xa223, /* 0x4b */ 0xa221, 0xa222, 0xa36c, 0xa381, 0xa38f, 0xa380, 0xa3d0, 0xa3cd, 0xa3d5, 0xa3d4, 0xa4d1, 0xa4be, 0xa4cb, 0xa4ce, 0xa4bd, 0xa4d0, 0xa704, 0xa6d5, 0xa6d0, 0xa6d3, 0xa6fb, 0xa6d8, 0xa6d1, 0xa6fd, 0xa6d9, 0xa6d6, 0xa6e6, 0xa6f9, 0xa9a1, 0xa99d, 0xa99e, 0x28d9, 0xaaff, 0xab5f, 0xab57, 0xab60, 0xab59, 0xac2c, 0xac25, 0xac27, 0xac30, 0xac24, 0xac26, 0xac2d, 0xac2e, 0xac29, 0xac31, 0xad45, 0xad47, 0xad52, 0xad4a, 0xad50, 0xad46, 0xad4f, 0xad4e, 0xad53, 0xaf21, 0xaf09, 0xaf1a, 0xaf1b, 0x7115, 0xaf10, 0xc4f9, 0xaf14, 0xaf0e, 0xaf12, 0xaf0b, 0xafcf, 0xafd2, 0xafd0, 0xafd4, 0xafd3, 0xafd1, 0x3518, 0xc4fb, 0xb009, 0xb11c, 0xb127, 0xb125, 0xb11b, 0xb129, 0xb11f, 0xb130, 0xb124, 0xb128, 0xb119, 0xb12f, 0xb224, 0xb221, 0xb225, 0xb226, 0xb227, 0xb276, 0xb366, /* 0x4c */ 0xb375, 0xb369, 0xb37e, 0xb38f, 0xb374, 0x8e10, 0xb3ad, 0xb42b, 0xb42a, 0xb458, 0xb522, 0xb51d, 0xb52b, 0xb52c, 0xb52d, 0xb533, 0xb51b, 0xb527, 0xb52a, 0xb528, 0xb53b, 0xb67e, 0xb671, 0xb679, 0xb678, 0xb670, 0xb66d, 0xb67d, 0xb675, 0xb676, 0xb6de, 0xb766, 0xb783, 0xb787, 0xb77b, 0xb789, 0xb786, 0xb782, 0xb77c, 0xb781, 0xb843, 0xb845, 0xb8f7, 0xb8f9, 0xb8fa, 0xba05, 0xb9fe, 0xba0f, 0xb9ff, 0xb9fa, 0xba09, 0xba20, 0xba0c, 0xba3c, 0xba22, 0xb9f8, 0xba0a, 0xba08, 0xb9f7, 0xbc8e, 0xbc77, 0xbc8b, 0xbcb4, 0xbc8a, 0xbc9a, 0xbc79, 0xbc83, 0xbc7f, 0xbca1, 0xbc8f, 0xbca3, 0xbc81, 0xbc94, 0xbc7e, 0xbc82, 0xbc90, 0xbca5, 0xbcad, 0xbc9d, 0xbe67, 0xbe69, 0xbecb, 0xbec8, 0xbed1, 0xbf40, 0xbf4b, 0xbf49, 0xbf46, 0xbf3e, 0xbf43, 0xbf3f, 0xbfa5, 0xbfa7, 0xc04e, /* 0x4d */ 0xc04d, 0x499b, 0xc0e5, 0xc0e1, 0xc0e2, 0xc116, 0xc114, 0xc51b, 0xc159, 0xc151, 0xc15f, 0xc14a, 0xc157, 0xc158, 0xc1ca, 0xc1db, 0xc1de, 0xc1e0, 0xc1e1, 0xc1df, 0xc1e2, 0xc1e3, 0xc292, 0xc2bf, 0xc2be, 0x2c0b, 0x2e52, 0x2e4e, 0x00b9, 0xc313, 0x2fa7, 0x3226, 0x3227, 0x32c6, 0x330b, 0x336a, 0x3378, 0x381a, 0x3816, 0x3819, 0x3817, 0x381b, 0x3818, 0x3820, 0x3937, 0x3aec, 0x3b81, 0xae3d, 0x3e0f, 0x3ead, 0x3ffb, 0x4052, 0x43af, 0x43b7, 0x43b2, 0x4578, 0x45ac, 0x4700, 0x46fe, 0x4702, 0x46fd, 0x4703, 0x4840, 0x4843, 0x4842, 0x48b7, 0x49a2, 0x4c00, 0x4c35, 0x4c41, 0x4c05, 0x2e53, 0x4c50, 0x4c4e, 0x4c53, 0x5053, 0x5050, 0x5057, 0x505f, 0x5055, 0x50ea, 0x5226, 0xb430, 0x522a, 0x5228, 0x522c, 0x522d, 0x52d4, 0x5507, 0x5558, 0x5559, 0x58c5, 0x58cd, 0x58c7, /* 0x4e */ 0x58e8, 0x084b, 0x5a32, 0xc297, 0x5bde, 0x5d32, 0x34c8, 0xc415, 0x60f1, 0x60f0, 0x60ec, 0x6109, 0x60f9, 0x60f5, 0x60fe, 0x6374, 0x6381, 0x637c, 0x6375, 0x6389, 0x6382, 0x6397, 0x6386, 0x637d, 0x6393, 0x639c, 0x6376, 0x6380, 0x6445, 0x30a1, 0x6603, 0x67c9, 0x67cd, 0x67d0, 0x69ad, 0x69c5, 0x6aa2, 0x6bec, 0x6bf6, 0x6bf3, 0x6df3, 0x6dfa, 0x6df9, 0x6df5, 0x6df4, 0x6df8, 0x6eb6, 0x6eb4, 0x6f32, 0x6fcd, 0x6fc8, 0x6fce, 0x6fca, 0x712a, 0x7121, 0x711d, 0x73bd, 0x73be, 0x73c2, 0x0cf1, 0x73c9, 0x751f, 0x76f1, 0x76ed, 0x76f2, 0x76e0, 0x76f7, 0x7830, 0x7837, 0x7831, 0x7836, 0x78c8, 0x7b6d, 0x7b69, 0x7b7d, 0x7b61, 0x7b70, 0x7b71, 0x7b73, 0x7b76, 0x7b75, 0x7b78, 0x7b79, 0x7b64, 0x7b6e, 0x7d51, 0x7d4f, 0x7d22, 0x7faf, 0x7faa, 0x7fa3, 0x7f9d, 0x7f9c, 0x7fa1, /* 0x4f */ 0x7fb6, 0x7fac, 0x7fa2, 0x7fa7, 0x7fb0, 0x7fa9, 0x7fc3, 0x8131, 0x8132, 0x8133, 0x8134, 0x8137, 0x813c, 0x81d9, 0x81dd, 0x81de, 0x81df, 0x81e0, 0x82a5, 0x82aa, 0x82a2, 0x82a3, 0x8404, 0x8403, 0x83fe, 0x8428, 0x86af, 0x86ad, 0x86a6, 0x87ac, 0x87a5, 0x87b0, 0x87b1, 0x8801, 0x88b2, 0x88d2, 0x88f1, 0x8bd1, 0x8c47, 0x8cc9, 0x8ca7, 0x8cc8, 0x8c95, 0x8c8e, 0x8c91, 0x8c7d, 0x8cee, 0x8c8d, 0x8c8c, 0x8cb0, 0x8c96, 0x8c42, 0x8c7c, 0x8cb1, 0x8cb2, 0x8c84, 0x8c9d, 0x8ca1, 0x8c98, 0x8cb3, 0x8c22, 0x8c7b, 0x8c8a, 0x8cce, 0x8c80, 0x8c97, 0x8cb4, 0x8cb5, 0x8c9a, 0x8c9f, 0x8c93, 0x8e12, 0x8e0b, 0x8e0e, 0x90a3, 0x90cc, 0x90dc, 0x90e1, 0x90de, 0x90d2, 0x90db, 0x90d9, 0x90d7, 0x90d4, 0x90c9, 0x90eb, 0x90da, 0x90d1, 0x9104, 0x90ca, 0x90e2, 0x91d7, 0x938c, 0x9399, /* 0x50 */ 0x93a2, 0x9396, 0x9394, 0x939f, 0x1267, 0x938e, 0x9403, 0x9494, 0x9493, 0x9544, 0x972f, 0x9735, 0x972b, 0x9732, 0x972d, 0x9736, 0x1314, 0x9731, 0x9712, 0x9733, 0x971f, 0x9734, 0x9740, 0x973f, 0x9741, 0x97d3, 0x9889, 0x9918, 0x9910, 0x9a1a, 0x9a25, 0x9a1e, 0x9b92, 0x9b95, 0x9b93, 0x9d84, 0x9d9a, 0x9d89, 0x9d8d, 0x9d88, 0x9d91, 0x9d9b, 0x9d9c, 0xb148, 0x9e8e, 0x9e92, 0x9fc5, 0x9fc1, 0x9fb8, 0x9fbe, 0x9fb5, 0x9fc7, 0xa03c, 0x1489, 0xa1ec, 0xa23f, 0xa239, 0xa237, 0xa3a1, 0xa394, 0xa3a0, 0xa3de, 0xa3db, 0xa3df, 0xa3dc, 0xa4d6, 0xa4dc, 0xa4dd, 0xa4e0, 0xa4e3, 0xa4e1, 0xa718, 0xa719, 0xa753, 0xc4ec, 0xa744, 0xa70e, 0xa70f, 0xa747, 0xa717, 0xa71d, 0xa711, 0xa8b4, 0xa8b6, 0xa9b7, 0xa9be, 0xa9c2, 0xa9b4, 0xab31, 0xab15, 0xab83, 0xac3b, 0xac36, 0xac42, /* 0x51 */ 0xac50, 0xac40, 0xac34, 0xac38, 0xac3d, 0xac3e, 0xac35, 0xac3a, 0xac46, 0xac37, 0xac39, 0xac45, 0xad77, 0xad5d, 0xad6a, 0xad76, 0xad6b, 0xad6c, 0xad65, 0xad64, 0xad71, 0xad5f, 0xad72, 0xadfe, 0xadff, 0xae3e, 0xaf2b, 0xaf36, 0xaf2d, 0xaf39, 0xaf3f, 0xaf3b, 0xaf33, 0xaf42, 0xaf3a, 0xafd5, 0xafd8, 0xafd9, 0xb00d, 0xb00a, 0xb039, 0xb03a, 0xb13d, 0xb145, 0xb13a, 0xb137, 0xb13e, 0xb142, 0xb387, 0xb38c, 0xb382, 0xb36b, 0xb3a0, 0xb39a, 0xb390, 0xb38e, 0xb3a1, 0xb3bd, 0xb3b2, 0xb3b5, 0xb3b7, 0xb3aa, 0xb3a2, 0xb3a5, 0xb3ae, 0xb3ab, 0xb3bc, 0xb432, 0xb45a, 0xb564, 0xb55c, 0xb54d, 0xb53f, 0xb53e, 0xb552, 0xb558, 0xb557, 0xb55e, 0xb553, 0xb554, 0xb556, 0xab65, 0xb684, 0xb685, 0xb686, 0xb797, 0xb7a1, 0xb7a2, 0x180b, 0xc50a, 0xb7a3, 0xb7a6, 0x1817, 0xb815, /* 0x52 */ 0xb824, 0xb84a, 0xb849, 0xb848, 0xb84b, 0xb90e, 0xb562, 0xb90b, 0xb90a, 0xb908, 0xb906, 0xba43, 0xba47, 0xba3f, 0xba46, 0xba50, 0x186d, 0xba4b, 0x1870, 0xba52, 0xbcd7, 0xbcbf, 0xbcd8, 0xbce0, 0xbce7, 0xbcb8, 0xbcd5, 0xbcef, 0xbce6, 0xbce4, 0xbcd4, 0xbcd6, 0xbcea, 0x18ed, 0xbcbb, 0xbce9, 0xc510, 0xbe6d, 0xbe70, 0xbe73, 0xbe72, 0xbed4, 0xbece, 0xbed5, 0xbf5a, 0xbf58, 0xbf52, 0xbf50, 0xbf55, 0xbf4e, 0xbf4d, 0xbfcb, 0xbfcc, 0xbfcd, 0xbfd1, 0xc058, 0xc063, 0xc05e, 0xc054, 0xc05b, 0xc0e9, 0xc0e7, 0xc0e8, 0xc11d, 0xc167, 0xc15a, 0xc15c, 0xc15b, 0xc161, 0xc1a1, 0x198d, 0xc1a4, 0xc1e9, 0xc1ef, 0xc1e5, 0xc1f5, 0xc1eb, 0xc1ed, 0xc296, 0xc295, 0xc2b3, 0xc2b5, 0xc2b1, 0x00a7, 0x2e4d, 0x3024, 0x322b, 0x33cf, 0x34c9, 0x3836, 0x3831, 0x3854, 0x383a, 0x3838, /* 0x53 */ 0x3939, 0x3938, 0x3af4, 0x3af3, 0x3af6, 0x3afc, 0x3af5, 0x3af1, 0x3c9c, 0x3e18, 0x3e1a, 0x3ffc, 0x3ffe, 0x4003, 0x4053, 0x422b, 0x43c6, 0x43c1, 0x457b, 0x4706, 0x4849, 0x48b8, 0x49a3, 0x4c52, 0x4c4d, 0x4c5f, 0x4c5e, 0x4c61, 0x4d23, 0x508c, 0x506f, 0x5075, 0x5074, 0x5071, 0x5070, 0x506c, 0x5326, 0x5508, 0x1e07, 0x58f0, 0x58ef, 0x58fb, 0x5910, 0x590c, 0x58f6, 0x58fe, 0x5b7c, 0x5be1, 0x5d38, 0x5d6f, 0x6118, 0x6115, 0x611c, 0x6110, 0x6135, 0xc417, 0x6117, 0x611d, 0x6126, 0x6128, 0x6129, 0x612a, 0x611a, 0xc416, 0x4707, 0x63ab, 0x63ac, 0x63a1, 0x63ae, 0x63a3, 0x63a7, 0x6448, 0x6504, 0x65fd, 0x0a5a, 0x6608, 0x67d2, 0x69c6, 0x69be, 0x6a1c, 0x6aa6, 0x6aa7, 0x6aab, 0x6b00, 0x6bfb, 0x6bfc, 0x6bf9, 0x6c01, 0x6e06, 0x6e04, 0xc43c, 0x6f34, 0x7136, 0x7132, /* 0x54 */ 0x7142, 0x712d, 0x7135, 0x73d8, 0x7523, 0x7520, 0x7701, 0x7700, 0x7703, 0xc2bc, 0x783c, 0x7841, 0x7835, 0x78c9, 0x7b8e, 0x7b9e, 0x7b99, 0x7bb4, 0x7baa, 0x7b9f, 0x7b96, 0x7b9d, 0x7bc3, 0x7b74, 0x7bab, 0x0eaf, 0x7d63, 0x7d5b, 0x7d5a, 0x7fc5, 0x7fc4, 0x7fcf, 0x7fc8, 0x7fa4, 0x7fbd, 0x7fd3, 0x8060, 0x813b, 0x81e3, 0x81e7, 0x82a8, 0x82ac, 0x82a9, 0x832a, 0x8408, 0x8409, 0x86b9, 0x88c1, 0x88c2, 0x88b8, 0x8ce1, 0x8ceb, 0x8ce5, 0x8cfa, 0x8ce4, 0x8d0b, 0x8cd7, 0x8cef, 0x8ce0, 0x8cec, 0x8cfb, 0xc4b0, 0x8cd3, 0x8ce6, 0x8cfc, 0x8ce3, 0x8ccf, 0x8cda, 0x8cdc, 0x8cd2, 0x8ca4, 0x116b, 0x8e17, 0x8e16, 0x90f2, 0x90fc, 0x9118, 0x90f6, 0x90fe, 0x90f3, 0x90f7, 0x9101, 0x90f9, 0x9106, 0x90f5, 0x9110, 0x90df, 0x9103, 0x9108, 0x91d8, 0x9205, 0x9397, 0x93b3, 0x93ae, /* 0x55 */ 0x93af, 0x93a7, 0x93b1, 0x93a8, 0x93ac, 0x93ab, 0x9404, 0x949a, 0x954a, 0x9742, 0x9758, 0x974b, 0x9745, 0x9749, 0x974c, 0x9759, 0x9756, 0x131b, 0x9746, 0x9744, 0x975b, 0x9769, 0x988e, 0x988f, 0x991e, 0x86bc, 0x9a2f, 0x9b9e, 0x9b9d, 0x9b9f, 0x9b9c, 0x9db4, 0x9dae, 0x9dab, 0x9db3, 0x9daf, 0x9dc2, 0x9e93, 0x9e95, 0x9e96, 0x9e97, 0x9fcf, 0x9fce, 0x9fcb, 0xa04b, 0xa246, 0xa243, 0xa245, 0xa251, 0xa3ae, 0xa3af, 0xa3b0, 0xa3b8, 0xa3e2, 0xa3e3, 0xa3e6, 0xa4ed, 0xa4ea, 0xa53a, 0xa759, 0xa784, 0xa75f, 0xa77c, 0xa75c, 0xa758, 0xa755, 0xa75d, 0xa77e, 0xa780, 0xa783, 0xa757, 0x1563, 0xa75e, 0xa8ba, 0xa9d5, 0xab58, 0xab68, 0xab67, 0xac4a, 0xac4c, 0xac52, 0xac49, 0xac4e, 0xac47, 0xac4d, 0xac4b, 0xac4f, 0xad7e, 0xad87, 0xad83, 0xad89, 0x69ca, 0xad86, 0xad88, /* 0x56 */ 0xae47, 0xae42, 0xae49, 0xae48, 0x1680, 0x1684, 0x167f, 0xaf44, 0xaf51, 0xaf46, 0xaf47, 0xafe4, 0xb00f, 0xb03f, 0xb14b, 0xb157, 0xb152, 0x16f1, 0xb151, 0xb158, 0xb15e, 0xb153, 0xb15d, 0xb14d, 0xb23c, 0xb23f, 0xb246, 0xb23e, 0xb244, 0xb245, 0xb241, 0xb238, 0xb242, 0xb243, 0xb27a, 0xb3a3, 0xb3ba, 0xb3c0, 0xb3c4, 0xb3c6, 0xb3cb, 0xb461, 0xb57a, 0xb573, 0xb572, 0xb574, 0xb580, 0xb581, 0x2947, 0xb695, 0xb68f, 0xb690, 0xb692, 0xb694, 0xb68b, 0xb6e6, 0xb7b2, 0xb7b8, 0xb7bd, 0xb7be, 0xb7ce, 0xb7ba, 0xb816, 0xb826, 0xb825, 0xb84c, 0xb850, 0xb84e, 0xb851, 0xb852, 0xb914, 0xb915, 0xb91b, 0xba82, 0xba99, 0xba9a, 0xba7d, 0xba85, 0xba86, 0xba9c, 0xba79, 0xba7b, 0xba80, 0xba83, 0xba81, 0xbd1e, 0xbd1b, 0xbd2a, 0xbcfb, 0xbd05, 0xbd20, 0xbd11, 0xbd04, 0xbcfd, /* 0x57 */ 0xbd03, 0xbd10, 0xbd18, 0xbd0a, 0xbd4e, 0xbd09, 0xbd07, 0xbd1c, 0x191c, 0xbe77, 0xbe76, 0xbed8, 0xbed9, 0xbf61, 0xbf5c, 0xbf5e, 0xbf60, 0xbfaa, 0xbfd6, 0xbfd8, 0xc009, 0xc008, 0xc06b, 0xc065, 0xc073, 0xc074, 0xc0ed, 0xc124, 0xc125, 0xc16a, 0xc1a7, 0xc1a8, 0xc20b, 0xc1fa, 0xc1f9, 0xc1ff, 0xc204, 0xc1f6, 0xc205, 0xc299, 0xc2ab, 0xc2bd, 0xc2b8, 0x00a8, 0x2e64, 0x2e5a, 0x2f72, 0x337a, 0x3595, 0x385f, 0x3861, 0x385e, 0x385a, 0x385c, 0x385d, 0x386e, 0x3857, 0x3858, 0x3b02, 0x3b0b, 0x3b08, 0x3b51, 0x3e25, 0x3e28, 0x3e23, 0x3e21, 0x3e24, 0x3e29, 0x4006, 0x400a, 0x43ca, 0x43cc, 0x43cb, 0x43cf, 0x457f, 0x457c, 0x45d6, 0x4709, 0x470b, 0x4776, 0x487d, 0x49a5, 0x4c5b, 0x4c5c, 0x4c5d, 0x4c65, 0x506d, 0x5082, 0x5083, 0x5087, 0x5095, 0x508a, 0x52d6, 0x5328, /* 0x58 */ 0x550d, 0x592e, 0xc3ee, 0x592d, 0x5921, 0x5919, 0x5a3b, 0x5a3c, 0x5a3a, 0x5b7e, 0x5d3b, 0x6147, 0x6139, 0x6134, 0x6136, 0x6146, 0x613b, 0x6141, 0x6145, 0x63c0, 0x63c4, 0x63ba, 0x63bd, 0x63be, 0x64a3, 0x660c, 0x67d9, 0x69cd, 0x6aae, 0x6bff, 0x6c24, 0x6ebb, 0x6ebc, 0x6f36, 0x6fd5, 0x6fd3, 0x6fd6, 0x713c, 0x713f, 0x73de, 0x73e3, 0x7527, 0x7529, 0x0d8b, 0x7705, 0x7707, 0x770c, 0x78d0, 0x7bbe, 0x7bbc, 0x7bd0, 0x7bc2, 0x7bb5, 0x7bc9, 0x7d66, 0x0f2b, 0x7fd5, 0x7fe2, 0x7fdc, 0x7fe3, 0x7fda, 0x7fc2, 0x7fe8, 0x81e9, 0x82af, 0x82ad, 0x82ae, 0x840b, 0x86c1, 0x87b6, 0x87b9, 0x88c0, 0x8ca5, 0x8d28, 0x8d22, 0x8d29, 0x8d18, 0x8d1f, 0x8d1c, 0x8d12, 0x8d2a, 0x117a, 0x8d21, 0x8d2b, 0x8d17, 0x8cf0, 0x8d16, 0x8d23, 0x912b, 0x9126, 0x913d, 0x9122, 0x913a, 0x9131, /* 0x59 */ 0x9132, 0x9154, 0x9121, 0x9135, 0x1209, 0x912e, 0x9130, 0x912f, 0x9136, 0x91da, 0x91d9, 0x93bb, 0x93bc, 0x93b7, 0x93c2, 0x93bd, 0x93b2, 0x126d, 0x7144, 0x7bd1, 0x9752, 0x976b, 0x9767, 0x131f, 0x9761, 0x976c, 0x9751, 0x9774, 0x9777, 0x976f, 0x976d, 0x9768, 0xc4d1, 0x9784, 0x9890, 0x9892, 0x9893, 0x991f, 0x9a31, 0x9a38, 0x9a39, 0x9a37, 0x9bab, 0x9dc3, 0x9dc8, 0x9dcb, 0x9dcf, 0x9e98, 0x9fd4, 0x9fd3, 0x9fd8, 0x9fd9, 0x9fdd, 0x9fd1, 0x9fd6, 0xa03e, 0xa258, 0xa257, 0xa255, 0xa3c4, 0xa3e4, 0xa4ee, 0xa4ef, 0xa4f3, 0xa4f2, 0xa4f0, 0xa7ab, 0xa79a, 0xa7af, 0xa797, 0x156a, 0x156c, 0xa7bf, 0xa794, 0xa793, 0xa8be, 0xa8bb, 0xa8bc, 0xa9d9, 0xab6c, 0xac53, 0xac54, 0xac5b, 0xac58, 0xac56, 0xac57, 0xad9f, 0xad94, 0xad96, 0xad97, 0xae4a, 0xae4b, 0xaf55, 0xaf5a, /* 0x5a */ 0xaf5e, 0xaf5f, 0xaf59, 0xaf5b, 0xaf58, 0xaf54, 0xafe8, 0xafeb, 0xafec, 0xb013, 0xb166, 0xb16b, 0xb162, 0xb169, 0xb163, 0xb15f, 0xb14e, 0xb248, 0xb24a, 0xb3e3, 0xb3db, 0xb3d8, 0xb3d6, 0xb586, 0xb590, 0xb591, 0xb588, 0xb594, 0xb583, 0x17b2, 0xb59c, 0xb58d, 0xb585, 0xb698, 0xb69a, 0xb69c, 0xb6e7, 0xb7c5, 0xb7d0, 0xb7d1, 0xb819, 0xb827, 0x181d, 0xb854, 0xb92d, 0xb922, 0x182d, 0xb91f, 0xbabd, 0xbaae, 0xbabb, 0xbaad, 0xbabc, 0xbab9, 0xbab4, 0xbacb, 0xbab7, 0xbab3, 0xbaba, 0xbab6, 0xbacd, 0xbabe, 0xbac9, 0xc50b, 0xbd5f, 0xbd3b, 0xbd61, 0xbd5c, 0xbd8a, 0xbd5a, 0xbd4d, 0xbd46, 0xbd44, 0xbd3d, 0xbd40, 0xbd3c, 0xbd8c, 0xbd41, 0xbd4c, 0xbd3e, 0xbd4a, 0xbe7c, 0xbe7a, 0xbf65, 0xbf6e, 0xbf69, 0xbf6a, 0xbf6f, 0xbf6c, 0xbf70, 0xbf68, 0xbf6b, 0x1945, 0xbfac, /* 0x5b */ 0xbfde, 0xbfdd, 0xbfdc, 0x63c5, 0xc08c, 0xc083, 0xc082, 0xc088, 0xc085, 0xc081, 0xc0f5, 0xc0ef, 0xc0f4, 0xc0f2, 0xc0f6, 0xc0f3, 0xc0f0, 0xc0f1, 0xc12b, 0xc127, 0xc128, 0xc16c, 0xc1ae, 0xc20e, 0xc21b, 0xc216, 0xc21f, 0xc222, 0xc220, 0xc221, 0xc214, 0xc213, 0xc29d, 0xc29c, 0xc29e, 0xc29f, 0x2e6b, 0x32c8, 0x3878, 0x3876, 0x3870, 0x3871, 0x3b0a, 0x3e2c, 0x4711, 0x487e, 0x4c57, 0x4c66, 0x4c69, 0x4c67, 0x4c68, 0x4c71, 0x4c6f, 0xbfae, 0x508b, 0x5096, 0x5235, 0x523a, 0x526b, 0x5516, 0x5943, 0x5946, 0x593f, 0x593b, 0x593d, 0x5ab1, 0x5ab2, 0x5be4, 0x5d40, 0x615d, 0x6151, 0x614d, 0x614c, 0x615b, 0x63d4, 0x63d2, 0x63ca, 0x63c8, 0x63d0, 0x63c9, 0x6449, 0x64a4, 0x6612, 0x660f, 0x6611, 0x67db, 0x67dd, 0x67dc, 0x69d4, 0x6a21, 0x6ab2, 0x6c04, 0x6c02, 0x6e11, /* 0x5c */ 0x6e16, 0x6e10, 0x6ebe, 0x8e1a, 0x714c, 0x714a, 0x73f2, 0x73f1, 0x752a, 0x752c, 0x752f, 0x7531, 0x7711, 0x7712, 0x784b, 0x7bdb, 0x7bd6, 0x7bdd, 0x7be2, 0x7be4, 0x7be0, 0x7bdf, 0x7be3, 0x7d6e, 0x7d71, 0x7fe9, 0x7fea, 0x8063, 0x81eb, 0x81ea, 0x86bd, 0x86bb, 0x86c6, 0x86cc, 0x86c8, 0x63cf, 0x86c9, 0x86ca, 0x86cf, 0x86d0, 0x87ba, 0x87fb, 0x8803, 0x88c4, 0x8d49, 0x8d53, 0x8d36, 0x8d4a, 0x8d41, 0x8d4e, 0x8d19, 0x8d4d, 0x8d45, 0x8d4c, 0x8d47, 0x8d48, 0x8d4f, 0x8d37, 0x8d42, 0x914a, 0x9146, 0x120a, 0x9149, 0x914f, 0x9151, 0x914c, 0x120c, 0x9206, 0x9551, 0x977a, 0x9783, 0x977e, 0x977f, 0x9780, 0x6ab5, 0x9891, 0x9894, 0x9895, 0x9921, 0x9920, 0x9a3d, 0x9a40, 0x9a46, 0x9a84, 0x9bac, 0x9bad, 0x142e, 0x9dda, 0x9dd9, 0x9fe2, 0x9fe1, 0x9fe3, 0x9fe4, 0x9fde, /* 0x5d */ 0x9fdf, 0xa241, 0xa259, 0xa25c, 0xa25a, 0xa3e8, 0xa4f6, 0xa4fc, 0xa4f7, 0xa4fa, 0xa4f9, 0xa7c4, 0xa7be, 0xa7d2, 0xa7bd, 0xa795, 0xa7d4, 0xa9e4, 0xac61, 0xac62, 0xac63, 0xac64, 0xac60, 0xac5c, 0xac5d, 0xac5e, 0xada5, 0xada6, 0xae4c, 0xaf68, 0xaf6e, 0xaf71, 0xaf6b, 0xaf6f, 0xafee, 0xaff1, 0xaff0, 0xafef, 0xb015, 0xb014, 0xab6e, 0xb047, 0xb17c, 0xb17a, 0xb174, 0xb176, 0xb16e, 0xb178, 0xb16d, 0xb16c, 0xb24e, 0xb3d7, 0xb3ea, 0xb3e5, 0xb464, 0xb5b3, 0xb5a3, 0xb5a5, 0xb5a7, 0xb5a2, 0xb59f, 0xb5a6, 0xb59e, 0xb5a8, 0xb6a9, 0xb6a6, 0xb6aa, 0xb6ab, 0xb6a0, 0xb6a1, 0xb6a8, 0xb6e8, 0xb6e9, 0xb6ea, 0xb7e4, 0xb7df, 0xb7e0, 0xb828, 0xb85d, 0xb85b, 0xb856, 0xb857, 0xb85f, 0xb862, 0xbae1, 0xbae3, 0xbade, 0xbad9, 0xbae8, 0xbaf2, 0xbaf6, 0xbae6, 0xbaf4, 0xbaf5, /* 0x5e */ 0xbae5, 0xbae2, 0x188d, 0xbd96, 0xbdaa, 0xbd97, 0xbd70, 0xbda1, 0xbd9d, 0xbda9, 0xbd6f, 0xbd7e, 0xbd94, 0xbd9a, 0xbd73, 0xbd87, 0xbd71, 0xbd77, 0xbd88, 0xbd8d, 0xbd85, 0xbd78, 0xbdad, 0xbe80, 0xbe81, 0xbee5, 0xbee7, 0xbf7c, 0xbfaf, 0xbfe1, 0xc096, 0xc0a3, 0xc090, 0xc0f8, 0xc12e, 0xc175, 0xc17e, 0xc17d, 0xc17b, 0xc178, 0xc1b0, 0xc234, 0xc236, 0xc230, 0xc51d, 0xc22e, 0xc237, 0x34ce, 0x3597, 0x3598, 0x387c, 0x387e, 0x387d, 0x387f, 0x3b0f, 0x3ca4, 0x3e31, 0x3e2e, 0x3e2f, 0x3e32, 0x422c, 0x43d4, 0x43dc, 0x43d8, 0x440e, 0x4583, 0x4584, 0x4712, 0x4c72, 0x4c7c, 0x4c7e, 0x50a6, 0x50a0, 0x509e, 0x50a2, 0x532a, 0x5518, 0x594d, 0x5958, 0x595b, 0x7714, 0xc3f2, 0x5be6, 0x6164, 0x6168, 0x6160, 0x6162, 0x63d7, 0x644b, 0x67e0, 0x6a22, 0x6c05, 0x6e19, 0x6e1a, /* 0x5f */ 0x6ec3, 0x6fd8, 0x6fdc, 0x714f, 0x73f7, 0x73f4, 0x73f8, 0x7713, 0x7850, 0x7bf0, 0x7be9, 0x7bef, 0x7bed, 0x7bea, 0x7bf8, 0x7c05, 0x7bf2, 0x7d72, 0x0f31, 0x7ff9, 0x7ff3, 0x7ff6, 0x7ff2, 0x7ff7, 0x8066, 0x8065, 0x8140, 0xc477, 0x86d1, 0x86d3, 0x8804, 0x8d59, 0x8d60, 0x8d5b, 0x8d5d, 0x8d5e, 0x8d69, 0x8d5c, 0x8d61, 0x8d6a, 0x8d5f, 0x914e, 0x915c, 0x9160, 0x9163, 0x91db, 0x93ca, 0x93c9, 0x93c8, 0x94a5, 0x94a3, 0x978e, 0x9787, 0x9789, 0x9785, 0x9786, 0x978f, 0x978a, 0x9790, 0x9898, 0x989b, 0x9a47, 0x9a49, 0x9a48, 0x9de5, 0x9dea, 0x9ded, 0x9ff0, 0x9fef, 0x9ff2, 0x9fec, 0xa040, 0xa260, 0xa25f, 0xa3eb, 0xa3ec, 0xa500, 0xa501, 0xa7e2, 0xa7df, 0xa7e0, 0xa7e1, 0xa7e3, 0xa8c3, 0xa9eb, 0xa9ea, 0xab61, 0xab71, 0xac6b, 0xac68, 0xac69, 0xac67, 0xadb0, 0xadb1, /* 0x60 */ 0xadb2, 0xae51, 0xaf74, 0xb17f, 0xb184, 0xb253, 0xb254, 0xb3f0, 0xb3f4, 0xb3f1, 0xb437, 0xb5bf, 0x17bc, 0x17bb, 0xb5bd, 0xb5be, 0xb5b7, 0xb5c0, 0xb5ba, 0xb5b8, 0xb5bc, 0xb5bb, 0xb6eb, 0xb7e7, 0xb81d, 0xb81c, 0xb863, 0x484b, 0xb938, 0xb936, 0xb934, 0xb937, 0xbb06, 0xbb1c, 0xbb02, 0xbb1d, 0xbb1e, 0xbae0, 0xbb11, 0xbb18, 0xbb21, 0xbb20, 0xbb10, 0xbdbd, 0xbdae, 0xbdb5, 0xbdb8, 0xbdb9, 0xbdbe, 0xbdc4, 0xbdbc, 0xbdba, 0xbe83, 0xbeea, 0xbeec, 0xbf7e, 0xbf7b, 0xbfe5, 0xc0a7, 0xc09e, 0xc09a, 0xc12f, 0xc131, 0xc183, 0xc1b5, 0xc246, 0xc241, 0xc243, 0xc23d, 0xc242, 0xc23b, 0xc247, 0x336b, 0x33d0, 0x388e, 0x4011, 0xc371, 0xc389, 0x484c, 0x532b, 0x594f, 0x595e, 0x5963, 0x596b, 0x5a3f, 0x5be9, 0x616d, 0x616b, 0x616a, 0xbb2a, 0x63e0, 0x63dd, 0x63e1, 0x63de, /* 0x61 */ 0x63dc, 0x644d, 0x6616, 0x67e3, 0x69e5, 0x69e4, 0x6e1d, 0x754b, 0xc2c1, 0x784e, 0x78d6, 0x7bfd, 0x7c07, 0x7bfe, 0x7c03, 0x7c0b, 0x7bff, 0x7d7a, 0x7d77, 0x7ffb, 0x8143, 0x81ed, 0x87bc, 0x63df, 0x8805, 0x88c6, 0x88c5, 0x8d74, 0x8d73, 0x8d72, 0x8d78, 0x9173, 0x917a, 0x6e1c, 0x9176, 0x9175, 0x9177, 0x93cf, 0x93ce, 0x93cd, 0x94a8, 0x9798, 0x9792, 0x9794, 0x989a, 0x9bb4, 0x9deb, 0x9df4, 0x9df3, 0x9dee, 0x9df2, 0x9df0, 0xa264, 0xa805, 0xa7fb, 0xa7fc, 0xa9f3, 0xac6c, 0xadba, 0xaf79, 0xaf7e, 0xaf78, 0xaff4, 0xb016, 0xb257, 0xb5c8, 0xb5c3, 0xb5ce, 0xb6b3, 0xb6ed, 0xb6ee, 0xb7f1, 0xb7f8, 0x1814, 0xb864, 0xb865, 0xbb35, 0xbb29, 0xbb2c, 0xbb31, 0xbb2b, 0xbb2e, 0xbb25, 0xbdda, 0xbde0, 0xbdd4, 0xbde1, 0xbddd, 0xbfe7, 0xc012, 0xc0ae, 0xc0af, 0xc186, 0xc185, /* 0x62 */ 0xc1d1, 0xc258, 0xc23f, 0xc252, 0xc24b, 0xc253, 0xc250, 0xc256, 0xc257, 0xc2cd, 0xc2cb, 0x3231, 0x3230, 0x33d1, 0x021c, 0x3892, 0x3890, 0x388f, 0x3893, 0x3891, 0x0372, 0x4713, 0x487f, 0x50ac, 0x6170, 0x63e5, 0x6a23, 0x6a24, 0x6c08, 0x6c07, 0x6e1f, 0x6e20, 0x6e21, 0x6fe1, 0x7154, 0x7157, 0x7155, 0x73fa, 0x7538, 0x8d86, 0x7537, 0x7853, 0x7d7e, 0x7d7b, 0xc471, 0x7ffd, 0x7ffc, 0x8146, 0x8732, 0x88c7, 0x8d71, 0x8d83, 0x8d6f, 0x8d7e, 0x8d7d, 0x8d81, 0x8d7c, 0x918a, 0x917e, 0x9180, 0x917d, 0x917f, 0x9182, 0x93d4, 0x93d0, 0x93d2, 0x9555, 0x979b, 0x979a, 0x9a4e, 0x9df1, 0x9ff8, 0x9ffd, 0xa25e, 0xa266, 0xa505, 0xa80a, 0xa80b, 0xa80e, 0xa80d, 0xa811, 0xa809, 0xa810, 0xa80c, 0xa812, 0xa8c4, 0xa9f7, 0xa9f8, 0xab6a, 0xab6b, 0xadc0, 0xadc2, 0xaf85, 0xaf80, /* 0x63 */ 0xaf84, 0xaf81, 0xadc4, 0xb18b, 0xb18d, 0xb18e, 0xb6b7, 0xb6b9, 0xb6ef, 0xb7fb, 0xb7ff, 0xb867, 0xb868, 0xb869, 0xb93f, 0xbb3c, 0xbb4c, 0xbb3d, 0xbb3e, 0xbb3f, 0xbb3b, 0xbdff, 0x190e, 0xbdf6, 0xbdee, 0xbdfc, 0xbdf8, 0xbe01, 0xbdfa, 0xbe88, 0xbf80, 0xc011, 0xc0fe, 0xc100, 0xc135, 0x6f3c, 0xc1bd, 0xc1bb, 0xc25c, 0xc25a, 0xc2d1, 0xc2d0, 0x340b, 0x5973, 0x3e39, 0x401a, 0x43e3, 0x4587, 0x4777, 0x4778, 0x50b1, 0x596a, 0x5974, 0x5beb, 0x617b, 0x64a5, 0x67e4, 0x6c0b, 0x6c0e, 0x6c0c, 0x7539, 0x7c10, 0x7c11, 0x7c16, 0x7d81, 0x7d80, 0x7ffe, 0x8001, 0x8000, 0x8147, 0x81ef, 0x8d88, 0x918b, 0x918d, 0x9187, 0x9185, 0x918f, 0x9184, 0x9188, 0x918e, 0x918c, 0x93d7, 0x93d6, 0x979f, 0x4588, 0x9e03, 0x9ffe, 0xa3ef, 0xa509, 0xa508, 0xa820, 0xa824, 0xa81f, 0xac70, /* 0x64 */ 0xae56, 0xaff7, 0xaff8, 0xaff6, 0xb190, 0xb25e, 0xb3f7, 0xb5d6, 0xb5d5, 0xb6bb, 0xb6f0, 0xb801, 0xb86c, 0xb941, 0xb942, 0xbb4f, 0xbb53, 0xbb58, 0xbe12, 0xbe04, 0xbe13, 0xbe05, 0xbe0d, 0xbf82, 0xbf81, 0xc0b5, 0xc0ba, 0xc1be, 0xc265, 0xc263, 0xc26e, 0xc26a, 0xc26c, 0xc2c4, 0x336c, 0x97a5, 0x4012, 0x484d, 0x551f, 0x5977, 0x5978, 0x5d44, 0x617c, 0x63eb, 0x63ea, 0x63ec, 0x64a7, 0x6619, 0x6e23, 0x2074, 0x7401, 0x7c1c, 0x8003, 0x8148, 0x86da, 0x8d91, 0x8d92, 0x9196, 0x9197, 0x9191, 0x9193, 0x93d8, 0x93d5, 0x9557, 0x9558, 0x97a2, 0x9e05, 0x9ffa, 0xa50c, 0xa50a, 0xa82e, 0xa829, 0xa82f, 0xa8c5, 0xac72, 0xadc8, 0xae5a, 0xae59, 0xaf89, 0xaf88, 0xb5db, 0xb5d9, 0xb5da, 0xb6bc, 0x17ec, 0xb806, 0xb805, 0xb86f, 0xb86d, 0xb870, 0xbb60, 0xbb5e, 0xbb63, 0xbb5a, /* 0x65 */ 0xbb5f, 0xbe19, 0xbe1d, 0xbe1b, 0xbe22, 0xbe1c, 0xbe1e, 0xbef7, 0xbf84, 0xc015, 0xc0b8, 0xc0c1, 0xc101, 0xc10a, 0xc1d2, 0xc275, 0xc274, 0xc272, 0x34d0, 0x401b, 0x4410, 0x4779, 0x63ed, 0x6ab9, 0x6e24, 0x6ec5, 0x7403, 0x814a, 0x86f7, 0x87c1, 0x87c2, 0x8d94, 0x9199, 0x919a, 0x955a, 0x97a8, 0x9825, 0x989e, 0xa041, 0xa832, 0xa833, 0xadcb, 0xadca, 0xadcc, 0xb193, 0xb5e0, 0xb871, 0xbb6b, 0xbe2b, 0xbe29, 0xbe1a, 0xbe26, 0xbe27, 0xbe2a, 0xbef8, 0x6f3d, 0xc276, 0x3b18, 0x597a, 0x617f, 0x0e79, 0x81f0, 0x8d9a, 0x8d96, 0x919e, 0x919d, 0x91dc, 0x93da, 0x9e0b, 0xa002, 0xa042, 0xa267, 0xaf8b, 0xb5e2, 0xbb71, 0xbe2f, 0xbe2e, 0xc0c6, 0xc18e, 0xc27b, 0xc277, 0xc278, 0xc27c, 0x597c, 0x8007, 0x8d97, 0x97d9, 0xa50d, 0xa50e, 0xb5e3, 0xb5e4, 0xb6f3, 0xb875, 0xbe37, /* 0x66 */ 0xbe35, 0xc18f, 0xc280, 0xc27f, 0xc2d4, 0x50b4, 0xbfec, 0xab75, 0x6c10, 0x8069, 0x91a4, 0x93db, 0xadd1, 0xaf8d, 0xbb76, 0xbe39, 0xc284, 0xc282, 0x34d2, 0x63ee, 0x6c11, 0x7d84, 0xab74, 0xaf8f, 0xaf8e, 0xbe3b, 0x32cb, 0xc288, 0xc286, 0x555c, 0x71a4, 0xac75, 0xc28b, 0x3b19, 0x989f, 0xb5e5, 0xbe40, 0x6c12, 0xbefb, 0xc28c, 0x71a5, 0xb877, 0xb878, 0xc2d6, 0x93df, 0xadd2, 0x3b1a, 0x97a9, 0xadd3, 0xc0ca, 0x87c4, 0x94b1, 0xb264, }; static const ucs4_t cns11643_7_2uni_upages[198] = { 0x03400, 0x03500, 0x03600, 0x03700, 0x03800, 0x03900, 0x03a00, 0x03b00, 0x03c00, 0x03d00, 0x03e00, 0x03f00, 0x04000, 0x04100, 0x04200, 0x04300, 0x04400, 0x04500, 0x04600, 0x04700, 0x04800, 0x04900, 0x04a00, 0x04b00, 0x04c00, 0x04d00, 0x05600, 0x05800, 0x06100, 0x06400, 0x06700, 0x07100, 0x07600, 0x07c00, 0x07f00, 0x08100, 0x08600, 0x08d00, 0x08f00, 0x09300, 0x09500, 0x09a00, 0x0ff00, 0x20000, 0x20100, 0x20300, 0x20400, 0x20500, 0x20600, 0x20700, 0x20800, 0x20900, 0x20a00, 0x20b00, 0x20f00, 0x21000, 0x21100, 0x21200, 0x21400, 0x21500, 0x21600, 0x21800, 0x21900, 0x21a00, 0x21b00, 0x21c00, 0x21d00, 0x21f00, 0x22000, 0x22100, 0x22200, 0x22300, 0x22400, 0x22500, 0x22700, 0x22800, 0x22900, 0x22a00, 0x22c00, 0x22d00, 0x22e00, 0x22f00, 0x23000, 0x23100, 0x23200, 0x23300, 0x23500, 0x23600, 0x23700, 0x23800, 0x23900, 0x23a00, 0x23b00, 0x23c00, 0x23e00, 0x23f00, 0x24000, 0x24100, 0x24300, 0x24400, 0x24500, 0x24600, 0x24700, 0x24800, 0x24900, 0x24a00, 0x24b00, 0x24c00, 0x24d00, 0x24e00, 0x24f00, 0x25000, 0x25200, 0x25300, 0x25400, 0x25500, 0x25600, 0x25700, 0x25800, 0x25900, 0x25a00, 0x25b00, 0x25c00, 0x25d00, 0x25e00, 0x25f00, 0x26000, 0x26100, 0x26200, 0x26300, 0x26400, 0x26500, 0x26600, 0x26700, 0x26800, 0x26900, 0x26a00, 0x26d00, 0x26e00, 0x26f00, 0x27000, 0x27100, 0x27200, 0x27300, 0x27400, 0x27500, 0x27600, 0x27700, 0x27800, 0x27900, 0x27a00, 0x27b00, 0x27c00, 0x27d00, 0x27e00, 0x27f00, 0x28000, 0x28100, 0x28200, 0x28300, 0x28400, 0x28500, 0x28600, 0x28700, 0x28800, 0x28900, 0x28a00, 0x28b00, 0x28c00, 0x28d00, 0x28e00, 0x28f00, 0x29000, 0x29100, 0x29200, 0x29300, 0x29400, 0x29500, 0x29600, 0x29700, 0x29800, 0x29900, 0x29a00, 0x29b00, 0x29c00, 0x29d00, 0x29e00, 0x29f00, 0x2a000, 0x2a100, 0x2a200, 0x2a300, 0x2a400, 0x2a500, 0x2a600, 0x2f800, 0x2f900, 0x2fa00, }; static int cns11643_7_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x21 && c1 <= 0x66)) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x21 && c2 < 0x7f) { unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); ucs4_t wc = 0xfffd; unsigned short swc; { if (i < 6539) swc = cns11643_7_2uni_page21[i], wc = cns11643_7_2uni_upages[swc>>8] | (swc & 0xff); } if (wc != 0xfffd) { *pwc = wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } freelan-2.0/third-party/source/libiconv-msvc/include/cns11643_inv.h000066400000000000000000035155001252300335000251450ustar00rootroot00000000000000/* * Copyright (C) 1999-2005 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CNS 11643-1992 planes 1-7, CNS 11643-1986 plane 15 */ static const unsigned char cns11643_inv_2charset[3*55442] = { 0x1,0x21,0x70, 0x1,0x22,0x78, 0x1,0x22,0x34, 0x1,0x21,0x31, 0x1,0x22,0x32, 0x1,0x22,0x33, 0x1,0x25,0x6f, 0x1,0x25,0x6d, 0x1,0x25,0x6e, 0x1,0x25,0x70, 0x1,0x25,0x6c, 0x1,0x24,0x75, 0x1,0x24,0x76, 0x1,0x24,0x77, 0x1,0x24,0x78, 0x1,0x24,0x79, 0x1,0x24,0x7a, 0x1,0x24,0x7b, 0x1,0x24,0x7c, 0x1,0x24,0x7d, 0x1,0x24,0x7e, 0x1,0x25,0x21, 0x1,0x25,0x22, 0x1,0x25,0x23, 0x1,0x25,0x24, 0x1,0x25,0x25, 0x1,0x25,0x26, 0x1,0x25,0x27, 0x1,0x25,0x28, 0x1,0x25,0x29, 0x1,0x25,0x2a, 0x1,0x25,0x2b, 0x1,0x25,0x2c, 0x1,0x25,0x2d, 0x1,0x25,0x2e, 0x1,0x25,0x2f, 0x1,0x25,0x30, 0x1,0x25,0x31, 0x1,0x25,0x32, 0x1,0x25,0x33, 0x1,0x25,0x34, 0x1,0x25,0x35, 0x1,0x25,0x36, 0x1,0x25,0x37, 0x1,0x25,0x38, 0x1,0x25,0x39, 0x1,0x25,0x3a, 0x1,0x25,0x3b, 0x1,0x25,0x3c, 0x1,0x25,0x3d, 0x1,0x25,0x3e, 0x1,0x25,0x3f, 0x1,0x25,0x40, 0x1,0x25,0x41, 0x1,0x25,0x42, 0x1,0x25,0x43, 0x1,0x25,0x44, 0x1,0x25,0x45, 0x1,0x25,0x46, 0x1,0x21,0x39, 0x1,0x21,0x37, 0x1,0x22,0x5d, 0x1,0x21,0x64, 0x1,0x21,0x65, 0x1,0x21,0x66, 0x1,0x21,0x67, 0x1,0x21,0x2d, 0x1,0x21,0x2c, 0x1,0x21,0x6a, 0x1,0x21,0x6b, 0x1,0x21,0x6f, 0x1,0x22,0x23, 0x1,0x42,0x42, 0x1,0x22,0x6a, 0x1,0x22,0x22, 0x1,0x22,0x6b, 0x1,0x24,0x2b, 0x1,0x24,0x2c, 0x1,0x24,0x2d, 0x1,0x24,0x2e, 0x1,0x24,0x2f, 0x1,0x24,0x30, 0x1,0x24,0x31, 0x1,0x24,0x32, 0x1,0x24,0x33, 0x1,0x24,0x34, 0x1,0x26,0x35, 0x1,0x26,0x36, 0x1,0x26,0x37, 0x1,0x26,0x38, 0x1,0x26,0x39, 0x1,0x26,0x3a, 0x1,0x26,0x3b, 0x1,0x26,0x3c, 0x1,0x26,0x3d, 0x1,0x26,0x3e, 0x1,0x22,0x58, 0x1,0x22,0x55, 0x1,0x22,0x57, 0x1,0x22,0x56, 0x1,0x22,0x59, 0x1,0x22,0x5a, 0x1,0x22,0x5c, 0x1,0x22,0x5b, 0x1,0x22,0x61, 0x1,0x22,0x35, 0x1,0x22,0x3c, 0x1,0x22,0x49, 0x1,0x22,0x48, 0x1,0x22,0x45, 0x1,0x22,0x46, 0x1,0x22,0x4d, 0x1,0x22,0x4e, 0x1,0x22,0x50, 0x1,0x22,0x4f, 0x1,0x22,0x44, 0x1,0x22,0x3d, 0x1,0x22,0x3b, 0x1,0x22,0x3e, 0x1,0x22,0x39, 0x1,0x22,0x3a, 0x1,0x22,0x47, 0x1,0x22,0x4a, 0x1,0x42,0x21, 0x1,0x42,0x22, 0x1,0x42,0x23, 0x1,0x42,0x24, 0x1,0x42,0x25, 0x1,0x42,0x26, 0x1,0x42,0x27, 0x1,0x42,0x28, 0x1,0x42,0x29, 0x1,0x42,0x2a, 0x1,0x42,0x2b, 0x1,0x42,0x2c, 0x1,0x42,0x2d, 0x1,0x42,0x2e, 0x1,0x42,0x2f, 0x1,0x42,0x30, 0x1,0x42,0x31, 0x1,0x42,0x32, 0x1,0x42,0x33, 0x1,0x42,0x34, 0x1,0x42,0x35, 0x1,0x42,0x36, 0x1,0x42,0x37, 0x1,0x42,0x38, 0x1,0x42,0x39, 0x1,0x42,0x3a, 0x1,0x42,0x3b, 0x1,0x42,0x3c, 0x1,0x42,0x3d, 0x1,0x42,0x3e, 0x1,0x42,0x3f, 0x1,0x42,0x40, 0x1,0x42,0x41, 0x1,0x26,0x21, 0x1,0x26,0x22, 0x1,0x26,0x23, 0x1,0x26,0x24, 0x1,0x26,0x25, 0x1,0x26,0x26, 0x1,0x26,0x27, 0x1,0x26,0x28, 0x1,0x26,0x29, 0x1,0x26,0x2a, 0x1,0x26,0x2b, 0x1,0x26,0x2c, 0x1,0x26,0x2d, 0x1,0x26,0x2e, 0x1,0x26,0x2f, 0x1,0x26,0x30, 0x1,0x26,0x31, 0x1,0x26,0x32, 0x1,0x26,0x33, 0x1,0x26,0x34, 0x1,0x23,0x39, 0x1,0x23,0x3a, 0x1,0x23,0x3c, 0x1,0x23,0x3d, 0x1,0x23,0x3e, 0x1,0x23,0x3f, 0x1,0x23,0x37, 0x1,0x23,0x36, 0x1,0x23,0x35, 0x1,0x23,0x34, 0x1,0x23,0x33, 0x1,0x23,0x44, 0x1,0x23,0x45, 0x1,0x23,0x47, 0x1,0x23,0x46, 0x1,0x23,0x40, 0x1,0x23,0x41, 0x1,0x23,0x43, 0x1,0x23,0x42, 0x1,0x23,0x4c, 0x1,0x23,0x4d, 0x1,0x23,0x4e, 0x1,0x23,0x24, 0x1,0x23,0x25, 0x1,0x23,0x26, 0x1,0x23,0x27, 0x1,0x23,0x28, 0x1,0x23,0x29, 0x1,0x23,0x2a, 0x1,0x23,0x2b, 0x1,0x23,0x32, 0x1,0x23,0x31, 0x1,0x23,0x30, 0x1,0x23,0x2f, 0x1,0x23,0x2e, 0x1,0x23,0x2d, 0x1,0x23,0x2c, 0x1,0x23,0x38, 0x1,0x23,0x3b, 0x1,0x21,0x7c, 0x1,0x21,0x7b, 0x1,0x21,0x75, 0x1,0x21,0x74, 0x1,0x21,0x7e, 0x1,0x21,0x7d, 0x1,0x21,0x7a, 0x1,0x21,0x79, 0x1,0x21,0x72, 0x1,0x21,0x76, 0x1,0x21,0x73, 0x1,0x23,0x48, 0x1,0x23,0x49, 0x1,0x23,0x4b, 0x1,0x23,0x4a, 0x1,0x21,0x78, 0x1,0x21,0x77, 0x1,0x22,0x54, 0x1,0x22,0x51, 0x1,0x22,0x53, 0x1,0x22,0x52, 0x1,0x21,0x21, 0x1,0x21,0x23, 0x1,0x21,0x24, 0x1,0x21,0x71, 0x1,0x21,0x52, 0x1,0x21,0x53, 0x1,0x21,0x4e, 0x1,0x21,0x4f, 0x1,0x21,0x56, 0x1,0x21,0x57, 0x1,0x21,0x5a, 0x1,0x21,0x5b, 0x1,0x21,0x4a, 0x1,0x21,0x4b, 0x1,0x22,0x65, 0x1,0x21,0x46, 0x1,0x21,0x47, 0x1,0x21,0x68, 0x1,0x21,0x69, 0x1,0x24,0x35, 0x1,0x24,0x36, 0x1,0x24,0x37, 0x1,0x24,0x38, 0x1,0x24,0x39, 0x1,0x24,0x3a, 0x1,0x24,0x3b, 0x1,0x24,0x3c, 0x1,0x24,0x3d, 0x1,0x21,0x26, 0x1,0x25,0x47, 0x1,0x25,0x48, 0x1,0x25,0x49, 0x1,0x25,0x4a, 0x1,0x25,0x4b, 0x1,0x25,0x4c, 0x1,0x25,0x4d, 0x1,0x25,0x4e, 0x1,0x25,0x4f, 0x1,0x25,0x50, 0x1,0x25,0x51, 0x1,0x25,0x52, 0x1,0x25,0x53, 0x1,0x25,0x54, 0x1,0x25,0x55, 0x1,0x25,0x56, 0x1,0x25,0x57, 0x1,0x25,0x58, 0x1,0x25,0x59, 0x1,0x25,0x5a, 0x1,0x25,0x5b, 0x1,0x25,0x5c, 0x1,0x25,0x5d, 0x1,0x25,0x5e, 0x1,0x25,0x5f, 0x1,0x25,0x60, 0x1,0x25,0x61, 0x1,0x25,0x62, 0x1,0x25,0x63, 0x1,0x25,0x64, 0x1,0x25,0x65, 0x1,0x25,0x66, 0x1,0x25,0x67, 0x1,0x25,0x68, 0x1,0x25,0x69, 0x1,0x25,0x6a, 0x1,0x25,0x6b, 0x1,0x22,0x21, 0x1,0x22,0x75, 0x1,0x22,0x76, 0x1,0x22,0x70, 0x1,0x22,0x71, 0x1,0x22,0x72, 0x1,0x22,0x74, 0x1,0x22,0x77, 0x1,0x22,0x73, 0x1,0x22,0x4c, 0x1,0x22,0x4b, 0x1,0x22,0x6f, 0x6,0x22,0x2c, 0x4,0x22,0x24, 0x6,0x21,0x30, 0x6,0x21,0x23, 0xf,0x21,0x6c, 0x4,0x21,0x57, 0x4,0x23,0x36, 0x4,0x28,0x35, 0x3,0x34,0x3b, 0x3,0x39,0x6d, 0x3,0x27,0x41, 0x3,0x28,0x6c, 0x3,0x23,0x23, 0x4,0x23,0x37, 0x4,0x25,0x34, 0x3,0x40,0x34, 0x4,0x21,0x59, 0x3,0x21,0x75, 0x3,0x21,0x6e, 0x3,0x21,0x71, 0x3,0x21,0x73, 0xf,0x21,0x44, 0x6,0x23,0x4e, 0x3,0x22,0x71, 0x4,0x22,0x31, 0x3,0x22,0x69, 0x3,0x22,0x6a, 0xf,0x21,0x72, 0x5,0x23,0x34, 0x3,0x24,0x4a, 0x3,0x24,0x47, 0x3,0x24,0x4d, 0x6,0x25,0x71, 0x3,0x27,0x46, 0x5,0x25,0x25, 0x4,0x25,0x39, 0x4,0x25,0x3c, 0x3,0x27,0x45, 0x5,0x25,0x2b, 0x4,0x25,0x3b, 0x4,0x25,0x38, 0x3,0x27,0x50, 0xf,0x25,0x4a, 0x3,0x2b,0x31, 0x6,0x2e,0x5a, 0x4,0x28,0x39, 0x3,0x2b,0x30, 0x5,0x28,0x21, 0x4,0x28,0x3a, 0x3,0x2b,0x2a, 0x4,0x28,0x37, 0x4,0x28,0x3c, 0x5,0x2b,0x6c, 0x3,0x34,0x49, 0x3,0x2f,0x52, 0x4,0x2b,0x65, 0x6,0x35,0x38, 0x4,0x30,0x45, 0x3,0x34,0x3e, 0x3,0x34,0x48, 0x4,0x30,0x4a, 0x4,0x36,0x38, 0x3,0x39,0x73, 0x4,0x36,0x32, 0x4,0x36,0x37, 0x6,0x46,0x55, 0x6,0x49,0x7b, 0x3,0x39,0x74, 0x3,0x40,0x35, 0x3,0x40,0x38, 0x3,0x40,0x3b, 0x4,0x3c,0x2c, 0x4,0x3c,0x2d, 0x4,0x3c,0x28, 0x4,0x3c,0x2a, 0x5,0x44,0x57, 0x4,0x42,0x37, 0x4,0x42,0x33, 0x4,0x42,0x2e, 0x3,0x45,0x78, 0x6,0x5a,0x73, 0x4,0x42,0x2f, 0x3,0x45,0x73, 0x4,0x4f,0x59, 0x3,0x45,0x72, 0x3,0x45,0x6f, 0x3,0x45,0x77, 0x4,0x42,0x32, 0x4,0x48,0x7b, 0x3,0x4b,0x26, 0x3,0x4b,0x25, 0x4,0x48,0x7d, 0x3,0x4b,0x24, 0x3,0x4b,0x28, 0x3,0x4b,0x2a, 0x3,0x50,0x32, 0x4,0x4f,0x5d, 0x5,0x53,0x59, 0x4,0x4f,0x5b, 0x3,0x54,0x3f, 0x3,0x57,0x53, 0x4,0x5a,0x67, 0x4,0x5a,0x68, 0x4,0x5f,0x49, 0x4,0x63,0x2f, 0x3,0x5c,0x33, 0x3,0x5c,0x31, 0x7,0x52,0x74, 0x7,0x57,0x4c, 0x4,0x6a,0x41, 0x3,0x61,0x3c, 0x4,0x22,0x33, 0xf,0x26,0x5a, 0x4,0x2b,0x69, 0x3,0x57,0x54, 0x3,0x21,0x76, 0x3,0x22,0x79, 0x3,0x24,0x55, 0x5,0x23,0x37, 0x6,0x25,0x7b, 0x6,0x25,0x7d, 0x3,0x24,0x56, 0x3,0x2b,0x38, 0x7,0x4d,0x3d, 0x3,0x2a,0x4c, 0x4,0x30,0x4c, 0x5,0x31,0x26, 0x4,0x36,0x3d, 0x4,0x3c,0x32, 0x4,0x6a,0x42, 0x3,0x2b,0x3a, 0x3,0x39,0x78, 0x4,0x49,0x22, 0x3,0x21,0x50, 0x3,0x23,0x21, 0x3,0x24,0x58, 0x5,0x25,0x2e, 0x3,0x27,0x57, 0x3,0x27,0x56, 0x3,0x27,0x58, 0x4,0x28,0x43, 0x3,0x2b,0x3c, 0x3,0x2f,0x5d, 0x3,0x2f,0x5c, 0x4,0x30,0x4d, 0x3,0x39,0x7b, 0x3,0x39,0x7c, 0x4,0x3c,0x34, 0x3,0x45,0x79, 0x5,0x31,0x29, 0x4,0x21,0x61, 0x6,0x22,0x41, 0x3,0x21,0x7e, 0x4,0x22,0x3c, 0x5,0x22,0x30, 0x4,0x23,0x3e, 0x4,0x23,0x3f, 0x4,0x25,0x4a, 0x4,0x25,0x4c, 0x4,0x25,0x48, 0x4,0x25,0x47, 0x3,0x2b,0x41, 0x3,0x2b,0x45, 0x3,0x2b,0x42, 0x5,0x2b,0x7c, 0x4,0x30,0x53, 0x3,0x2f,0x67, 0x3,0x2f,0x69, 0x4,0x30,0x57, 0x4,0x30,0x58, 0x4,0x30,0x52, 0x5,0x31,0x2c, 0x4,0x30,0x54, 0x4,0x30,0x59, 0x3,0x3a,0x24, 0x6,0x50,0x6c, 0x4,0x36,0x42, 0x4,0x36,0x45, 0x3,0x3a,0x22, 0x5,0x3d,0x70, 0x3,0x40,0x42, 0x4,0x42,0x41, 0x4,0x42,0x43, 0x4,0x42,0x42, 0x4,0x42,0x3c, 0x3,0x45,0x7d, 0x3,0x45,0x7b, 0x4,0x42,0x3f, 0x4,0x42,0x3e, 0x3,0x45,0x7c, 0x4,0x49,0x23, 0x4,0x4f,0x62, 0x4,0x4f,0x61, 0x4,0x4f,0x63, 0x5,0x61,0x3b, 0x4,0x55,0x6c, 0x7,0x3e,0x7d, 0x4,0x5f,0x4a, 0x4,0x63,0x30, 0x4,0x21,0x64, 0x4,0x22,0x40, 0x4,0x23,0x44, 0x3,0x24,0x64, 0x4,0x25,0x4f, 0x6,0x29,0x6f, 0x6,0x2f,0x27, 0x4,0x2b,0x75, 0x3,0x2f,0x6b, 0x4,0x30,0x5a, 0x4,0x36,0x4b, 0x3,0x46,0x22, 0x4,0x55,0x6f, 0x3,0x54,0x43, 0x4,0x55,0x70, 0x5,0x53,0x63, 0x4,0x5a,0x6e, 0x4,0x30,0x5c, 0x4,0x36,0x4d, 0x5,0x3d,0x78, 0x6,0x29,0x72, 0x3,0x34,0x53, 0x5,0x70,0x78, 0x4,0x23,0x4b, 0x6,0x26,0x38, 0x4,0x2b,0x77, 0x3,0x3a,0x25, 0x6,0x50,0x76, 0x4,0x3c,0x3e, 0x5,0x44,0x6c, 0x4,0x6d,0x53, 0x6,0x26,0x36, 0x4,0x36,0x50, 0x3,0x21,0x58, 0x6,0x23,0x71, 0x3,0x23,0x2c, 0x6,0x50,0x7a, 0x3,0x27,0x64, 0x4,0x21,0x2b, 0x6,0x21,0x3b, 0x6,0x28,0x64, 0x4,0x25,0x56, 0x3,0x23,0x30, 0x5,0x22,0x3c, 0x3,0x23,0x2e, 0x3,0x24,0x6a, 0x3,0x24,0x69, 0x3,0x24,0x68, 0x3,0x27,0x68, 0x6,0x2a,0x2a, 0x3,0x2b,0x4c, 0x3,0x2f,0x70, 0x4,0x2b,0x7a, 0x3,0x2f,0x71, 0x4,0x36,0x51, 0x6,0x51,0x22, 0x5,0x4c,0x31, 0x3,0x46,0x24, 0x4,0x49,0x27, 0x3,0x60,0x70, 0x3,0x21,0x5d, 0x3,0x2f,0x72, 0x6,0x3d,0x61, 0x3,0x34,0x56, 0x4,0x49,0x29, 0x5,0x21,0x41, 0x3,0x21,0x5f, 0x3,0x23,0x32, 0x4,0x25,0x5a, 0x4,0x28,0x57, 0x3,0x3f,0x78, 0x3,0x46,0x27, 0x4,0x47,0x56, 0x4,0x21,0x6b, 0x3,0x22,0x30, 0x3,0x22,0x2c, 0x3,0x23,0x38, 0x3,0x23,0x36, 0x3,0x24,0x6c, 0x4,0x23,0x51, 0x3,0x24,0x6b, 0x3,0x24,0x71, 0x4,0x23,0x54, 0x4,0x23,0x59, 0x3,0x24,0x72, 0x4,0x23,0x53, 0x3,0x24,0x6f, 0x3,0x24,0x6e, 0x3,0x24,0x7a, 0xf,0x23,0x49, 0x3,0x25,0x25, 0x3,0x27,0x7a, 0x3,0x27,0x6d, 0x4,0x25,0x5d, 0x3,0x27,0x76, 0x5,0x25,0x42, 0x6,0x2a,0x39, 0x3,0x2b,0x52, 0x3,0x2b,0x60, 0x3,0x2b,0x5f, 0x3,0x2b,0x62, 0x3,0x2b,0x5a, 0x4,0x28,0x59, 0x4,0x28,0x5c, 0x3,0x2b,0x56, 0xf,0x29,0x5c, 0x4,0x2c,0x25, 0x3,0x2f,0x7d, 0x4,0x2b,0x7e, 0x3,0x2f,0x75, 0x3,0x2f,0x7c, 0x4,0x2c,0x21, 0x4,0x2b,0x7d, 0x6,0x35,0x7d, 0x3,0x30,0x24, 0x5,0x2c,0x43, 0x3,0x34,0x5d, 0x3,0x34,0x65, 0x4,0x30,0x6a, 0x5,0x36,0x70, 0x3,0x34,0x63, 0x3,0x34,0x5c, 0x4,0x30,0x70, 0x3,0x34,0x5a, 0x4,0x30,0x73, 0x4,0x30,0x71, 0x4,0x30,0x6d, 0x4,0x30,0x6c, 0xf,0x33,0x43, 0x3,0x38,0x53, 0x4,0x30,0x6f, 0x5,0x36,0x76, 0x3,0x3a,0x32, 0x4,0x36,0x67, 0x3,0x3a,0x35, 0x3,0x3a,0x2c, 0x4,0x36,0x5e, 0x4,0x36,0x59, 0x3,0x3a,0x39, 0x3,0x3a,0x3e, 0x3,0x3a,0x2d, 0x4,0x36,0x60, 0x3,0x3a,0x3d, 0x4,0x36,0x5f, 0x3,0x3a,0x37, 0x6,0x47,0x39, 0x5,0x36,0x79, 0x5,0x36,0x7a, 0x3,0x3a,0x30, 0x4,0x36,0x58, 0x4,0x36,0x65, 0x4,0x36,0x63, 0x3,0x3a,0x41, 0x5,0x36,0x6e, 0x3,0x3a,0x3f, 0x3,0x3a,0x3a, 0x5,0x3e,0x39, 0x4,0x3c,0x4a, 0x4,0x3c,0x46, 0x3,0x40,0x4f, 0x5,0x3e,0x3d, 0x4,0x3c,0x47, 0x4,0x3c,0x4c, 0x3,0x40,0x4d, 0x3,0x40,0x50, 0x6,0x51,0x32, 0x4,0x42,0x52, 0x3,0x46,0x32, 0x3,0x46,0x2f, 0x3,0x46,0x2d, 0x4,0x42,0x4f, 0x4,0x42,0x4a, 0x4,0x42,0x55, 0x3,0x46,0x2b, 0x3,0x4b,0x3a, 0x4,0x42,0x53, 0x4,0x42,0x56, 0x4,0x42,0x51, 0x5,0x45,0x22, 0x4,0x49,0x30, 0x4,0x49,0x2c, 0x3,0x4b,0x42, 0x4,0x49,0x2d, 0x3,0x4b,0x36, 0x7,0x21,0x4e, 0x4,0x4f,0x6b, 0x4,0x4f,0x6c, 0x3,0x50,0x41, 0x4,0x4f,0x67, 0x4,0x4f,0x6a, 0x4,0x4f,0x6f, 0x3,0x50,0x3c, 0x3,0x50,0x3a, 0x7,0x37,0x37, 0x4,0x55,0x72, 0x3,0x54,0x46, 0x4,0x55,0x73, 0x4,0x4f,0x6d, 0x5,0x61,0x40, 0x4,0x5a,0x70, 0x3,0x57,0x56, 0x5,0x61,0x45, 0x4,0x5f,0x4c, 0x5,0x67,0x59, 0x5,0x6b,0x73, 0x3,0x5c,0x35, 0x3,0x5e,0x27, 0x4,0x66,0x32, 0x3,0x60,0x2e, 0x3,0x60,0x2d, 0x4,0x6c,0x6c, 0x7,0x62,0x2f, 0x3,0x22,0x32, 0x3,0x22,0x21, 0x3,0x23,0x3d, 0x5,0x25,0x53, 0x3,0x27,0x7e, 0x3,0x2b,0x64, 0x3,0x30,0x26, 0x4,0x42,0x58, 0x4,0x63,0x32, 0x3,0x22,0x33, 0x3,0x25,0x2e, 0x4,0x23,0x5f, 0x3,0x25,0x39, 0x3,0x25,0x3a, 0x4,0x23,0x5e, 0x3,0x25,0x3d, 0x3,0x25,0x3f, 0x3,0x25,0x3b, 0x3,0x25,0x34, 0x3,0x28,0x27, 0x4,0x25,0x6d, 0x3,0x28,0x2b, 0x3,0x28,0x2c, 0x3,0x2b,0x76, 0x6,0x2f,0x65, 0x3,0x2b,0x74, 0x3,0x2b,0x75, 0x3,0x2b,0x73, 0x3,0x2b,0x6f, 0x3,0x30,0x29, 0x4,0x2c,0x2f, 0x4,0x2c,0x31, 0x3,0x30,0x2d, 0x3,0x30,0x2c, 0x3,0x30,0x2e, 0x3,0x30,0x31, 0x3,0x34,0x6c, 0x3,0x34,0x6d, 0x3,0x34,0x73, 0x3,0x34,0x6a, 0xf,0x33,0x57, 0x4,0x31,0x21, 0x4,0x36,0x6b, 0x3,0x3a,0x46, 0x4,0x36,0x6e, 0x3,0x3a,0x51, 0x6,0x47,0x4e, 0x3,0x3a,0x48, 0x3,0x3a,0x4d, 0x4,0x3c,0x59, 0x4,0x3c,0x5b, 0x3,0x40,0x53, 0x3,0x40,0x55, 0x4,0x3c,0x56, 0x4,0x3c,0x58, 0x4,0x42,0x5e, 0x4,0x42,0x5d, 0x4,0x42,0x5b, 0x3,0x46,0x3b, 0x4,0x42,0x5f, 0x3,0x46,0x39, 0x7,0x21,0x6a, 0x3,0x4b,0x52, 0x3,0x4b,0x48, 0x4,0x49,0x33, 0x3,0x4b,0x4a, 0x3,0x4b,0x4e, 0xf,0x4e,0x25, 0xf,0x4e,0x2e, 0x4,0x49,0x2a, 0x3,0x50,0x44, 0x4,0x4f,0x78, 0x3,0x50,0x47, 0x3,0x50,0x42, 0x3,0x50,0x43, 0x3,0x50,0x46, 0x3,0x50,0x45, 0x4,0x55,0x7c, 0x3,0x54,0x4d, 0x3,0x54,0x4a, 0x4,0x55,0x7b, 0x7,0x3f,0x30, 0x3,0x57,0x5d, 0x7,0x46,0x44, 0x5,0x6b,0x76, 0x3,0x60,0x72, 0x4,0x6c,0x6e, 0x5,0x37,0x3c, 0x3,0x4d,0x41, 0x3,0x2b,0x78, 0x4,0x28,0x61, 0x5,0x25,0x58, 0x4,0x36,0x77, 0x4,0x42,0x60, 0x3,0x46,0x47, 0x4,0x5a,0x7a, 0x3,0x22,0x3a, 0x3,0x23,0x46, 0x3,0x23,0x48, 0x4,0x23,0x65, 0x3,0x25,0x4a, 0x4,0x25,0x71, 0x5,0x25,0x59, 0x4,0x25,0x77, 0x4,0x25,0x73, 0x4,0x25,0x78, 0x3,0x2b,0x7d, 0x4,0x31,0x25, 0x6,0x3e,0x42, 0x3,0x34,0x7a, 0x3,0x3a,0x55, 0x4,0x3c,0x5c, 0x3,0x50,0x3e, 0x3,0x21,0x74, 0x3,0x23,0x4c, 0x3,0x23,0x4a, 0x4,0x22,0x56, 0x4,0x22,0x59, 0x4,0x22,0x55, 0x3,0x23,0x49, 0x3,0x25,0x52, 0x3,0x25,0x57, 0x3,0x25,0x50, 0x3,0x25,0x4f, 0x3,0x25,0x4d, 0x3,0x25,0x54, 0x3,0x28,0x31, 0x3,0x28,0x3b, 0x4,0x25,0x7b, 0x3,0x28,0x42, 0x3,0x28,0x32, 0x3,0x28,0x3a, 0x3,0x28,0x43, 0x3,0x28,0x47, 0x3,0x28,0x34, 0x4,0x26,0x21, 0x3,0x28,0x44, 0x3,0x28,0x3e, 0x3,0x28,0x36, 0x3,0x28,0x3c, 0x5,0x25,0x5d, 0x3,0x28,0x39, 0x3,0x28,0x30, 0x4,0x28,0x6d, 0x4,0x28,0x69, 0x3,0x2b,0x7e, 0x3,0x2c,0x22, 0xf,0x2a,0x2a, 0x4,0x28,0x67, 0x3,0x30,0x3f, 0x3,0x30,0x42, 0x3,0x30,0x3d, 0x3,0x30,0x49, 0x3,0x30,0x47, 0x4,0x2c,0x3b, 0x3,0x30,0x43, 0x3,0x30,0x50, 0x3,0x30,0x4c, 0x3,0x30,0x44, 0x4,0x2c,0x3f, 0x4,0x2c,0x3a, 0x3,0x30,0x39, 0x4,0x2c,0x3c, 0x3,0x30,0x51, 0x3,0x30,0x46, 0x3,0x30,0x41, 0x3,0x30,0x3a, 0xf,0x2e,0x6b, 0xf,0x2e,0x78, 0x4,0x31,0x29, 0x3,0x35,0x26, 0x3,0x35,0x2d, 0x3,0x35,0x21, 0x3,0x35,0x36, 0x4,0x31,0x28, 0x3,0x35,0x2c, 0x3,0x35,0x23, 0x3,0x35,0x25, 0x3,0x3a,0x71, 0x3,0x3a,0x67, 0x3,0x3a,0x74, 0x3,0x3a,0x64, 0x3,0x3a,0x76, 0x3,0x3a,0x6c, 0x3,0x3a,0x6a, 0x3,0x3a,0x65, 0x5,0x37,0x4e, 0x3,0x3a,0x6e, 0x5,0x37,0x46, 0x4,0x36,0x7e, 0x3,0x3a,0x6f, 0x3,0x3a,0x5f, 0x4,0x36,0x7d, 0x3,0x3a,0x70, 0x3,0x3a,0x5d, 0xf,0x3a,0x3c, 0x3,0x3a,0x6d, 0x3,0x3a,0x69, 0x3,0x3a,0x68, 0x4,0x3c,0x5f, 0x3,0x40,0x62, 0x4,0x3c,0x61, 0x3,0x40,0x6e, 0x3,0x40,0x6d, 0x3,0x40,0x68, 0x3,0x40,0x63, 0x4,0x3c,0x64, 0x3,0x40,0x65, 0x4,0x3c,0x63, 0x3,0x40,0x70, 0x3,0x40,0x6b, 0x3,0x40,0x6f, 0x3,0x40,0x6c, 0x3,0x40,0x69, 0x3,0x46,0x4b, 0x4,0x42,0x67, 0x4,0x42,0x6c, 0x4,0x42,0x68, 0x4,0x42,0x66, 0x3,0x46,0x49, 0x3,0x46,0x52, 0x3,0x46,0x51, 0x4,0x42,0x6b, 0x4,0x42,0x6d, 0x3,0x46,0x4d, 0x3,0x46,0x4e, 0x4,0x42,0x69, 0x4,0x49,0x3c, 0x4,0x49,0x3a, 0x3,0x4b,0x59, 0x3,0x4b,0x57, 0x4,0x49,0x40, 0x3,0x4b,0x55, 0x3,0x50,0x52, 0x3,0x50,0x55, 0x4,0x50,0x21, 0xf,0x54,0x2a, 0x4,0x56,0x22, 0x4,0x56,0x24, 0x3,0x57,0x5f, 0x3,0x57,0x60, 0x4,0x5f,0x54, 0x5,0x67,0x5e, 0x3,0x5a,0x30, 0x3,0x5a,0x32, 0x3,0x5c,0x37, 0x4,0x63,0x35, 0x3,0x5c,0x38, 0x4,0x66,0x37, 0x4,0x68,0x65, 0x3,0x61,0x62, 0x3,0x61,0x63, 0x3,0x23,0x4e, 0x6,0x26,0x78, 0x4,0x23,0x6d, 0x3,0x28,0x49, 0x4,0x28,0x70, 0x4,0x2c,0x41, 0x3,0x30,0x54, 0x3,0x3a,0x7d, 0x4,0x3c,0x67, 0x7,0x2d,0x2d, 0x3,0x61,0x3d, 0x3,0x22,0x3c, 0x3,0x23,0x4f, 0x6,0x26,0x79, 0x3,0x25,0x59, 0x4,0x23,0x70, 0x3,0x25,0x5b, 0x6,0x26,0x7a, 0x3,0x28,0x4f, 0x5,0x28,0x6e, 0x3,0x2c,0x30, 0x3,0x2c,0x31, 0x3,0x2c,0x33, 0x4,0x2c,0x42, 0x5,0x2c,0x7c, 0x6,0x36,0x5d, 0x3,0x35,0x42, 0x3,0x35,0x3d, 0x3,0x35,0x3e, 0x4,0x31,0x2e, 0x6,0x3e,0x5a, 0x3,0x35,0x40, 0x3,0x3b,0x21, 0x4,0x37,0x22, 0x4,0x3c,0x6a, 0x4,0x3c,0x6c, 0x4,0x3c,0x6f, 0x3,0x40,0x77, 0x4,0x42,0x74, 0x4,0x42,0x75, 0x3,0x4b,0x60, 0x4,0x42,0x77, 0x4,0x49,0x43, 0x4,0x49,0x45, 0x4,0x49,0x46, 0x4,0x5a,0x7d, 0x3,0x5e,0x2b, 0x7,0x62,0x35, 0x4,0x23,0x71, 0x4,0x26,0x26, 0x6,0x36,0x68, 0x3,0x3b,0x22, 0x4,0x2c,0x4c, 0x6,0x3e,0x64, 0x4,0x42,0x78, 0x5,0x4c,0x63, 0x4,0x22,0x5d, 0x4,0x23,0x74, 0x4,0x26,0x28, 0x4,0x26,0x27, 0x4,0x28,0x74, 0x4,0x28,0x75, 0x4,0x2c,0x4d, 0x5,0x31,0x75, 0x4,0x31,0x33, 0x5,0x31,0x73, 0x4,0x31,0x32, 0x4,0x37,0x28, 0x4,0x37,0x29, 0x4,0x3c,0x71, 0x4,0x42,0x79, 0x3,0x22,0x40, 0x3,0x23,0x53, 0x4,0x26,0x2a, 0x3,0x28,0x52, 0x3,0x28,0x53, 0x4,0x28,0x79, 0x4,0x28,0x78, 0x3,0x2c,0x39, 0x3,0x2c,0x38, 0x3,0x2c,0x36, 0x4,0x2c,0x4e, 0x6,0x3e,0x6b, 0x3,0x35,0x45, 0x4,0x37,0x2b, 0x5,0x37,0x66, 0x4,0x42,0x7d, 0x4,0x49,0x4a, 0x3,0x5a,0x37, 0x3,0x21,0x62, 0x4,0x23,0x77, 0x3,0x22,0x42, 0x3,0x22,0x43, 0x3,0x22,0x41, 0x3,0x22,0x44, 0x3,0x23,0x56, 0x4,0x22,0x61, 0x5,0x22,0x51, 0x4,0x23,0x7b, 0x5,0x22,0x50, 0x3,0x23,0x57, 0x3,0x23,0x58, 0x4,0x23,0x78, 0x4,0x23,0x79, 0x3,0x25,0x60, 0x5,0x23,0x70, 0x5,0x23,0x74, 0x3,0x25,0x64, 0x3,0x25,0x65, 0x4,0x23,0x76, 0x3,0x28,0x5b, 0x6,0x2a,0x7b, 0x4,0x26,0x31, 0x4,0x26,0x32, 0x4,0x26,0x2e, 0x3,0x28,0x56, 0x6,0x2a,0x76, 0x3,0x28,0x59, 0x3,0x28,0x5a, 0x5,0x25,0x6e, 0x3,0x2c,0x3a, 0x4,0x28,0x7b, 0x4,0x2c,0x5b, 0x4,0x2c,0x53, 0x4,0x2c,0x51, 0x3,0x30,0x60, 0x4,0x2c,0x5f, 0x4,0x2c,0x55, 0x3,0x30,0x5c, 0x4,0x2c,0x5a, 0x4,0x2c,0x5e, 0x4,0x2c,0x57, 0x3,0x30,0x5d, 0x6,0x36,0x7c, 0x5,0x2d,0x2e, 0x3,0x30,0x65, 0x4,0x2c,0x54, 0x3,0x35,0x56, 0x3,0x35,0x49, 0x4,0x31,0x37, 0x3,0x35,0x4c, 0x4,0x31,0x3d, 0x6,0x3e,0x75, 0x3,0x35,0x4d, 0x4,0x31,0x39, 0x6,0x3e,0x78, 0x3,0x35,0x50, 0xf,0x34,0x3f, 0x3,0x35,0x53, 0x3,0x3b,0x2f, 0x3,0x3b,0x32, 0x3,0x3b,0x29, 0x4,0x37,0x32, 0x4,0x37,0x34, 0x3,0x3b,0x35, 0x4,0x3c,0x72, 0x3,0x3b,0x30, 0x3,0x3b,0x2c, 0x4,0x3c,0x76, 0x4,0x3c,0x73, 0x4,0x3c,0x7e, 0x5,0x3e,0x6d, 0x4,0x3d,0x21, 0x6,0x52,0x34, 0x3,0x40,0x7b, 0x4,0x3c,0x77, 0x4,0x43,0x22, 0x6,0x5c,0x44, 0x4,0x43,0x2d, 0x4,0x43,0x2a, 0x4,0x43,0x21, 0x3,0x46,0x55, 0x4,0x43,0x24, 0x3,0x46,0x5b, 0x3,0x46,0x58, 0x4,0x43,0x2e, 0x3,0x46,0x57, 0x4,0x49,0x50, 0x4,0x49,0x4c, 0x5,0x4c,0x6c, 0x3,0x4b,0x62, 0x5,0x4c,0x68, 0x4,0x49,0x4b, 0x4,0x49,0x53, 0x3,0x4b,0x64, 0x4,0x49,0x4f, 0x4,0x49,0x4d, 0x3,0x4b,0x61, 0x4,0x49,0x54, 0x4,0x50,0x26, 0x4,0x50,0x27, 0x4,0x56,0x28, 0x4,0x50,0x25, 0x5,0x54,0x36, 0x3,0x50,0x59, 0x7,0x2d,0x4c, 0x3,0x54,0x5a, 0x3,0x54,0x56, 0x5,0x5b,0x3c, 0x4,0x56,0x27, 0x3,0x54,0x58, 0x7,0x3f,0x44, 0x4,0x5f,0x5a, 0x5,0x67,0x63, 0x5,0x67,0x64, 0x4,0x66,0x3a, 0x3,0x5e,0x2c, 0x4,0x68,0x68, 0x5,0x7b,0x3d, 0x3,0x23,0x5b, 0x6,0x21,0x6e, 0x3,0x3b,0x38, 0x4,0x49,0x55, 0x3,0x22,0x45, 0x4,0x31,0x42, 0x3,0x22,0x46, 0x4,0x22,0x65, 0x4,0x22,0x66, 0x3,0x23,0x5d, 0x4,0x24,0x22, 0x4,0x24,0x24, 0x3,0x25,0x69, 0x4,0x24,0x21, 0x3,0x25,0x6a, 0xf,0x24,0x25, 0x4,0x26,0x36, 0x4,0x26,0x37, 0x4,0x29,0x25, 0x4,0x24,0x25, 0x4,0x29,0x22, 0x4,0x29,0x24, 0x6,0x30,0x63, 0x3,0x2c,0x47, 0x4,0x29,0x23, 0x4,0x29,0x21, 0x4,0x2c,0x66, 0x4,0x2c,0x68, 0x4,0x31,0x47, 0x4,0x31,0x48, 0x4,0x31,0x45, 0x4,0x31,0x49, 0x3,0x35,0x5c, 0x4,0x37,0x3b, 0x4,0x37,0x36, 0x4,0x37,0x3d, 0x4,0x37,0x3a, 0x3,0x3b,0x3c, 0x4,0x37,0x3c, 0x3,0x3b,0x39, 0x4,0x37,0x39, 0x4,0x3d,0x28, 0x4,0x3d,0x23, 0x4,0x3d,0x27, 0x4,0x3d,0x26, 0x4,0x3d,0x29, 0x4,0x43,0x33, 0x4,0x43,0x32, 0x4,0x43,0x31, 0x4,0x43,0x2f, 0x3,0x4b,0x6e, 0x3,0x4b,0x6f, 0x4,0x50,0x29, 0x4,0x56,0x2d, 0x4,0x56,0x2b, 0x4,0x63,0x3b, 0x4,0x63,0x3a, 0x3,0x5f,0x44, 0x4,0x68,0x6b, 0x6,0x48,0x44, 0x3,0x46,0x5e, 0x4,0x50,0x2b, 0x3,0x23,0x60, 0x3,0x23,0x5f, 0x3,0x23,0x5e, 0x3,0x25,0x6c, 0x6,0x27,0x47, 0x4,0x26,0x38, 0x4,0x26,0x3d, 0x4,0x26,0x3b, 0x5,0x26,0x26, 0x4,0x26,0x3c, 0x3,0x28,0x64, 0x4,0x26,0x3a, 0x3,0x28,0x66, 0xf,0x2f,0x38, 0x3,0x2c,0x49, 0x3,0x2c,0x4a, 0x4,0x29,0x2a, 0x5,0x29,0x26, 0x4,0x29,0x29, 0x4,0x29,0x28, 0x4,0x2c,0x6b, 0x4,0x2c,0x6d, 0x4,0x2c,0x6c, 0x3,0x30,0x6d, 0x3,0x35,0x5e, 0x4,0x31,0x4e, 0x4,0x31,0x4c, 0x4,0x31,0x4f, 0x3,0x35,0x5d, 0x5,0x38,0x29, 0x4,0x37,0x40, 0x4,0x37,0x41, 0x3,0x3b,0x41, 0x5,0x3f,0x21, 0x4,0x43,0x36, 0x3,0x46,0x5f, 0x4,0x43,0x39, 0x4,0x43,0x3a, 0x4,0x49,0x5b, 0x4,0x49,0x5c, 0x3,0x4b,0x71, 0x3,0x50,0x5d, 0x4,0x50,0x2c, 0x4,0x50,0x2e, 0x5,0x54,0x42, 0x4,0x5f,0x5e, 0x4,0x63,0x3c, 0x4,0x24,0x29, 0x3,0x28,0x6a, 0x3,0x46,0x62, 0x7,0x2d,0x5b, 0x4,0x29,0x2b, 0x4,0x3d,0x2d, 0x6,0x21,0x79, 0x4,0x22,0x6a, 0x3,0x23,0x63, 0x3,0x23,0x64, 0x3,0x25,0x70, 0x3,0x28,0x6f, 0x4,0x26,0x40, 0x4,0x26,0x41, 0x3,0x2c,0x4e, 0x4,0x29,0x2d, 0x6,0x30,0x7a, 0x4,0x29,0x2e, 0x3,0x2c,0x4f, 0x4,0x2c,0x71, 0x5,0x32,0x46, 0x4,0x31,0x51, 0x4,0x2c,0x72, 0x3,0x3b,0x46, 0x3,0x3b,0x43, 0x5,0x3f,0x29, 0x4,0x3d,0x2f, 0x4,0x3d,0x2e, 0x6,0x52,0x4d, 0x4,0x49,0x5d, 0x4,0x49,0x5f, 0x3,0x5e,0x2e, 0x4,0x26,0x42, 0x4,0x50,0x31, 0x6,0x24,0x70, 0x3,0x28,0x73, 0x4,0x26,0x43, 0x3,0x28,0x72, 0x3,0x35,0x64, 0x3,0x3b,0x48, 0x3,0x3b,0x49, 0x4,0x43,0x3b, 0x4,0x49,0x61, 0x3,0x50,0x5f, 0x3,0x22,0x4b, 0x6,0x2b,0x3e, 0x3,0x28,0x74, 0x4,0x29,0x32, 0x4,0x29,0x34, 0x3,0x2c,0x52, 0x5,0x29,0x2f, 0x5,0x29,0x33, 0x3,0x2c,0x53, 0x6,0x31,0x25, 0x5,0x2d,0x47, 0xf,0x2f,0x3e, 0x4,0x31,0x54, 0x3,0x35,0x66, 0x3,0x35,0x67, 0x4,0x37,0x49, 0x3,0x3b,0x4a, 0x4,0x37,0x48, 0x4,0x3d,0x33, 0x5,0x45,0x69, 0x4,0x43,0x3d, 0x6,0x5c,0x67, 0x3,0x50,0x60, 0x4,0x50,0x34, 0x4,0x56,0x2f, 0x6,0x21,0x7e, 0x3,0x23,0x65, 0x3,0x23,0x68, 0x4,0x24,0x31, 0x5,0x22,0x67, 0x4,0x22,0x70, 0x3,0x28,0x7b, 0x3,0x28,0x7d, 0x3,0x25,0x79, 0x4,0x24,0x2e, 0x3,0x28,0x7c, 0x4,0x24,0x30, 0x4,0x24,0x33, 0x3,0x25,0x73, 0x4,0x24,0x2f, 0x4,0x24,0x32, 0x3,0x26,0x24, 0x3,0x28,0x79, 0x4,0x29,0x35, 0x4,0x29,0x37, 0x4,0x26,0x4d, 0x3,0x2c,0x59, 0x3,0x29,0x24, 0x4,0x26,0x48, 0x3,0x29,0x23, 0x4,0x26,0x4e, 0x4,0x26,0x4c, 0x4,0x26,0x46, 0xf,0x2a,0x3e, 0x3,0x2c,0x58, 0x4,0x29,0x41, 0x3,0x2c,0x62, 0x4,0x29,0x3c, 0x4,0x26,0x49, 0x4,0x29,0x39, 0x3,0x30,0x7d, 0x6,0x37,0x54, 0x4,0x29,0x3d, 0x5,0x29,0x35, 0x4,0x2d,0x28, 0x4,0x29,0x48, 0x4,0x29,0x3a, 0x4,0x29,0x3b, 0x4,0x29,0x40, 0x3,0x2c,0x55, 0x6,0x37,0x5a, 0x3,0x30,0x7c, 0x3,0x2c,0x5e, 0x4,0x31,0x5b, 0x5,0x2d,0x5a, 0x3,0x35,0x73, 0x4,0x2d,0x22, 0x3,0x35,0x69, 0x3,0x30,0x75, 0x4,0x2d,0x23, 0x3,0x35,0x70, 0x4,0x2d,0x24, 0x3,0x30,0x77, 0x6,0x37,0x5e, 0x3,0x31,0x24, 0x4,0x2d,0x2b, 0x4,0x31,0x5a, 0x4,0x31,0x5c, 0x4,0x31,0x62, 0x3,0x35,0x6b, 0x6,0x48,0x6f, 0x4,0x31,0x63, 0x3,0x35,0x75, 0x4,0x31,0x60, 0x5,0x32,0x5b, 0x4,0x31,0x5d, 0x3,0x35,0x6c, 0x3,0x3b,0x4e, 0x4,0x31,0x6c, 0x4,0x31,0x67, 0x3,0x3b,0x4c, 0x3,0x35,0x6d, 0x3,0x35,0x77, 0x3,0x3b,0x57, 0x4,0x31,0x64, 0x6,0x48,0x75, 0x3,0x3b,0x53, 0x4,0x31,0x66, 0x4,0x31,0x5e, 0x5,0x2d,0x57, 0x3,0x3b,0x52, 0x5,0x38,0x42, 0x4,0x31,0x6a, 0x5,0x38,0x48, 0x4,0x37,0x56, 0x4,0x37,0x50, 0x3,0x3b,0x5c, 0x4,0x37,0x59, 0x3,0x3b,0x5f, 0x4,0x37,0x54, 0x4,0x37,0x4e, 0x5,0x3f,0x32, 0x3,0x41,0x25, 0x4,0x37,0x55, 0x4,0x3d,0x3e, 0x3,0x3b,0x60, 0x4,0x3d,0x37, 0x5,0x32,0x58, 0x3,0x3b,0x5b, 0x3,0x41,0x26, 0x3,0x41,0x2d, 0x4,0x3d,0x3b, 0x4,0x43,0x43, 0x5,0x3f,0x42, 0x6,0x52,0x69, 0x3,0x46,0x67, 0x4,0x3d,0x3a, 0x4,0x3d,0x3c, 0x3,0x41,0x30, 0x3,0x46,0x65, 0x4,0x43,0x42, 0x4,0x43,0x50, 0x3,0x46,0x66, 0x3,0x41,0x2f, 0x4,0x43,0x48, 0x4,0x43,0x47, 0x4,0x43,0x49, 0x3,0x4b,0x7d, 0x4,0x43,0x4d, 0x4,0x49,0x65, 0x3,0x4c,0x22, 0x3,0x46,0x69, 0x3,0x4b,0x7b, 0x4,0x43,0x4a, 0x4,0x43,0x4c, 0x4,0x43,0x46, 0x3,0x4c,0x27, 0x3,0x4b,0x78, 0x4,0x43,0x4b, 0x4,0x50,0x38, 0x3,0x4c,0x2a, 0x4,0x49,0x67, 0x4,0x49,0x69, 0x4,0x49,0x68, 0x4,0x49,0x6b, 0x7,0x22,0x7c, 0x4,0x49,0x6d, 0x3,0x50,0x69, 0x4,0x49,0x6c, 0x3,0x4c,0x26, 0x4,0x50,0x39, 0x5,0x5b,0x4c, 0x4,0x5b,0x23, 0x4,0x5b,0x29, 0x4,0x56,0x36, 0x4,0x5b,0x25, 0x3,0x57,0x67, 0x4,0x5b,0x24, 0xf,0x5a,0x29, 0x3,0x57,0x66, 0x4,0x50,0x3a, 0x5,0x67,0x78, 0x4,0x63,0x43, 0x4,0x5f,0x64, 0x5,0x67,0x73, 0x7,0x47,0x2c, 0x3,0x5e,0x30, 0x4,0x63,0x42, 0x4,0x63,0x40, 0x3,0x5f,0x47, 0x4,0x68,0x6c, 0x3,0x61,0x78, 0x3,0x23,0x6a, 0x3,0x26,0x26, 0x4,0x26,0x54, 0x6,0x2b,0x52, 0x4,0x2d,0x2f, 0x4,0x2d,0x30, 0x5,0x2d,0x5d, 0x3,0x35,0x7a, 0x3,0x3b,0x65, 0x4,0x3d,0x42, 0x4,0x43,0x54, 0x5,0x4d,0x37, 0x3,0x4c,0x2b, 0x3,0x54,0x62, 0x6,0x27,0x6e, 0x4,0x26,0x55, 0x4,0x26,0x56, 0x4,0x29,0x4d, 0x3,0x2c,0x64, 0x4,0x21,0x7b, 0x4,0x21,0x7a, 0x3,0x22,0x4f, 0x4,0x22,0x74, 0x4,0x22,0x73, 0x4,0x22,0x75, 0x4,0x24,0x3a, 0x4,0x24,0x36, 0x3,0x26,0x2c, 0x3,0x26,0x2d, 0x3,0x26,0x30, 0x3,0x26,0x2b, 0x4,0x26,0x58, 0x3,0x29,0x2d, 0x5,0x26,0x3a, 0x3,0x29,0x2c, 0x3,0x29,0x38, 0x4,0x29,0x55, 0x4,0x2d,0x33, 0x4,0x26,0x59, 0x3,0x29,0x2b, 0xf,0x27,0x2e, 0x4,0x29,0x4e, 0x4,0x29,0x54, 0x3,0x2c,0x66, 0x3,0x29,0x27, 0x3,0x2c,0x67, 0x3,0x2c,0x69, 0x4,0x2d,0x3c, 0x3,0x2c,0x71, 0x4,0x29,0x56, 0x3,0x2c,0x68, 0x4,0x29,0x52, 0x4,0x2d,0x32, 0x4,0x2d,0x31, 0x3,0x2c,0x6a, 0x3,0x2c,0x65, 0x3,0x31,0x34, 0x3,0x31,0x2a, 0x3,0x35,0x7b, 0x3,0x31,0x31, 0x3,0x31,0x3a, 0x4,0x2d,0x3b, 0x3,0x31,0x2d, 0x3,0x31,0x2b, 0x4,0x31,0x7c, 0x4,0x32,0x21, 0x4,0x31,0x7b, 0x3,0x36,0x2c, 0x6,0x40,0x32, 0x4,0x32,0x25, 0x3,0x36,0x2f, 0x3,0x36,0x30, 0x4,0x31,0x79, 0x3,0x35,0x7e, 0x4,0x31,0x71, 0x3,0x36,0x25, 0x4,0x31,0x7e, 0x4,0x31,0x7a, 0x3,0x3b,0x6b, 0x3,0x36,0x2a, 0x4,0x37,0x6e, 0x4,0x37,0x62, 0x3,0x36,0x21, 0x4,0x3d,0x45, 0x3,0x41,0x31, 0x4,0x37,0x64, 0x3,0x3b,0x6a, 0x4,0x37,0x6b, 0x4,0x37,0x68, 0x4,0x37,0x65, 0x3,0x3b,0x6c, 0x3,0x3b,0x69, 0x4,0x37,0x70, 0x4,0x37,0x61, 0x3,0x3b,0x6e, 0x4,0x3d,0x50, 0x4,0x3d,0x4f, 0x3,0x41,0x37, 0x4,0x3d,0x4c, 0x4,0x3d,0x4a, 0x3,0x41,0x35, 0x3,0x41,0x3b, 0x4,0x3d,0x48, 0x4,0x3d,0x4e, 0x3,0x41,0x3c, 0x3,0x41,0x4a, 0x3,0x41,0x43, 0x3,0x41,0x3f, 0x3,0x41,0x47, 0x3,0x41,0x40, 0x3,0x41,0x46, 0x3,0x41,0x41, 0x3,0x41,0x39, 0x4,0x43,0x58, 0x4,0x43,0x61, 0x6,0x5d,0x32, 0x3,0x46,0x79, 0x3,0x47,0x2e, 0x3,0x47,0x2d, 0x4,0x43,0x56, 0x3,0x46,0x7c, 0x3,0x47,0x27, 0x3,0x47,0x2f, 0x4,0x43,0x5c, 0x3,0x46,0x77, 0x5,0x46,0x25, 0x3,0x46,0x7d, 0x4,0x49,0x75, 0x3,0x4c,0x36, 0x4,0x43,0x64, 0x5,0x46,0x23, 0x3,0x47,0x2b, 0x3,0x47,0x2c, 0x4,0x4a,0x24, 0x3,0x4c,0x33, 0x7,0x23,0x3a, 0x4,0x49,0x79, 0x4,0x49,0x7a, 0x4,0x49,0x76, 0x4,0x4a,0x28, 0x4,0x4a,0x22, 0x5,0x4d,0x3a, 0x4,0x49,0x7e, 0x5,0x4d,0x3e, 0x3,0x4c,0x3c, 0x4,0x4a,0x23, 0x3,0x50,0x74, 0x4,0x56,0x39, 0x4,0x50,0x45, 0x3,0x50,0x73, 0x3,0x50,0x6e, 0x3,0x50,0x78, 0x3,0x50,0x72, 0x3,0x50,0x71, 0x3,0x54,0x65, 0x3,0x54,0x6a, 0x3,0x54,0x68, 0x3,0x54,0x63, 0x3,0x54,0x66, 0x4,0x5b,0x2d, 0x3,0x57,0x69, 0x4,0x5b,0x32, 0x4,0x5b,0x30, 0x4,0x5b,0x2e, 0x3,0x57,0x6f, 0x3,0x57,0x71, 0x4,0x5b,0x31, 0x3,0x57,0x68, 0x4,0x5b,0x2f, 0x3,0x57,0x72, 0xf,0x5e,0x73, 0x3,0x5a,0x3d, 0x3,0x5a,0x3e, 0x4,0x63,0x47, 0x3,0x5c,0x40, 0x4,0x63,0x46, 0x5,0x70,0x24, 0x3,0x5e,0x32, 0x4,0x66,0x40, 0x3,0x60,0x31, 0x4,0x6a,0x49, 0x4,0x6a,0x48, 0x5,0x79,0x2a, 0x4,0x26,0x5b, 0x4,0x2d,0x40, 0x4,0x2d,0x3f, 0x4,0x32,0x27, 0x4,0x3d,0x54, 0x4,0x24,0x40, 0x3,0x26,0x3a, 0x4,0x26,0x5e, 0x4,0x26,0x5f, 0x4,0x29,0x5d, 0x3,0x2c,0x75, 0x3,0x31,0x3e, 0x4,0x2d,0x42, 0x6,0x38,0x2b, 0x3,0x36,0x33, 0x4,0x32,0x28, 0x3,0x36,0x35, 0x4,0x32,0x2c, 0x4,0x37,0x79, 0x4,0x37,0x75, 0x4,0x37,0x78, 0x4,0x37,0x77, 0x4,0x37,0x76, 0x5,0x38,0x7c, 0x3,0x3b,0x77, 0x4,0x3d,0x5c, 0x4,0x3d,0x59, 0x4,0x3d,0x5b, 0x3,0x41,0x4c, 0x4,0x43,0x66, 0x5,0x46,0x30, 0x5,0x46,0x2e, 0x4,0x43,0x69, 0x4,0x4a,0x2b, 0x4,0x4a,0x2a, 0x4,0x4a,0x29, 0x4,0x50,0x49, 0x4,0x50,0x4c, 0x3,0x57,0x73, 0x4,0x5b,0x3a, 0x4,0x63,0x4c, 0x4,0x66,0x43, 0x3,0x26,0x3b, 0x6,0x38,0x2c, 0x3,0x41,0x4f, 0x3,0x29,0x3a, 0x4,0x29,0x61, 0x3,0x31,0x41, 0x3,0x39,0x2b, 0x3,0x3b,0x78, 0x4,0x4a,0x2e, 0x4,0x56,0x3e, 0x4,0x6a,0x4b, 0x4,0x29,0x62, 0x4,0x2d,0x49, 0x6,0x38,0x30, 0x6,0x49,0x61, 0x6,0x5d,0x51, 0x5,0x4d,0x4b, 0x3,0x23,0x71, 0x6,0x2b,0x70, 0x6,0x38,0x34, 0x3,0x36,0x3b, 0x3,0x36,0x3e, 0x4,0x3d,0x65, 0x4,0x4a,0x30, 0x4,0x4a,0x31, 0x4,0x22,0x78, 0x4,0x22,0x79, 0x4,0x24,0x43, 0x3,0x26,0x3c, 0x3,0x26,0x3f, 0x3,0x26,0x3e, 0x3,0x26,0x40, 0x3,0x29,0x3f, 0x3,0x29,0x3d, 0x4,0x26,0x63, 0x5,0x29,0x4f, 0x4,0x29,0x63, 0x3,0x2c,0x7b, 0x4,0x29,0x64, 0x4,0x29,0x65, 0x3,0x2c,0x78, 0x3,0x2d,0x26, 0x6,0x31,0x67, 0x4,0x2d,0x4c, 0x4,0x32,0x3b, 0x4,0x2d,0x4b, 0x3,0x31,0x47, 0x6,0x38,0x37, 0x3,0x31,0x4a, 0xf,0x2f,0x6e, 0x4,0x2d,0x4d, 0x6,0x40,0x51, 0x4,0x32,0x36, 0x4,0x32,0x3a, 0x4,0x32,0x37, 0x3,0x36,0x43, 0x6,0x40,0x4f, 0x3,0x3c,0x22, 0x4,0x37,0x7e, 0x3,0x3b,0x7a, 0x3,0x3b,0x7b, 0x4,0x38,0x25, 0x3,0x3c,0x27, 0x4,0x38,0x22, 0x6,0x49,0x73, 0x3,0x3c,0x21, 0x6,0x53,0x3d, 0x5,0x3f,0x62, 0x3,0x41,0x52, 0x3,0x41,0x57, 0x3,0x41,0x5a, 0x3,0x41,0x55, 0x3,0x41,0x53, 0x3,0x41,0x5c, 0x3,0x41,0x58, 0x4,0x3d,0x68, 0x4,0x3d,0x67, 0x3,0x41,0x54, 0x3,0x47,0x38, 0x4,0x43,0x6e, 0x3,0x47,0x32, 0x3,0x47,0x36, 0x5,0x4d,0x53, 0x4,0x4a,0x32, 0x3,0x4c,0x42, 0x3,0x4c,0x45, 0x4,0x50,0x52, 0x4,0x50,0x51, 0x3,0x51,0x21, 0x5,0x4d,0x50, 0x3,0x50,0x7b, 0x3,0x50,0x7c, 0x4,0x50,0x53, 0x7,0x2e,0x5a, 0x3,0x54,0x73, 0x3,0x54,0x6e, 0x4,0x56,0x40, 0x4,0x5b,0x40, 0x4,0x5b,0x41, 0x4,0x5b,0x3f, 0x7,0x3f,0x76, 0x3,0x5a,0x40, 0x3,0x5a,0x41, 0x3,0x5c,0x44, 0x3,0x5f,0x4c, 0x3,0x5f,0x4d, 0x5,0x75,0x6e, 0x5,0x75,0x6d, 0x3,0x23,0x74, 0x4,0x50,0x56, 0x3,0x54,0x74, 0x3,0x29,0x44, 0x3,0x31,0x4e, 0x5,0x2e,0x25, 0x3,0x36,0x49, 0x3,0x3c,0x28, 0x4,0x3a,0x43, 0x5,0x46,0x45, 0x5,0x4d,0x58, 0x3,0x51,0x25, 0x3,0x23,0x76, 0x3,0x26,0x43, 0x4,0x24,0x48, 0x3,0x26,0x46, 0x3,0x29,0x4b, 0x3,0x29,0x46, 0xf,0x27,0x4c, 0x3,0x29,0x50, 0x3,0x29,0x4d, 0x5,0x26,0x51, 0x3,0x2d,0x28, 0x3,0x2d,0x2c, 0x4,0x29,0x6f, 0x4,0x29,0x6c, 0x3,0x2d,0x29, 0x4,0x2d,0x57, 0x4,0x2d,0x51, 0x4,0x2d,0x54, 0x4,0x2d,0x58, 0x3,0x31,0x52, 0x5,0x2e,0x2b, 0x4,0x2d,0x52, 0x4,0x2d,0x5b, 0x3,0x31,0x55, 0x4,0x2d,0x56, 0x3,0x31,0x51, 0x3,0x36,0x59, 0x4,0x32,0x43, 0x3,0x36,0x4a, 0x3,0x36,0x4f, 0x5,0x32,0x79, 0x4,0x32,0x42, 0x4,0x32,0x46, 0x4,0x32,0x41, 0x4,0x38,0x34, 0x3,0x36,0x58, 0x3,0x36,0x5d, 0x4,0x38,0x2f, 0x3,0x3c,0x2e, 0x4,0x38,0x2c, 0x3,0x3c,0x3f, 0x3,0x3c,0x30, 0x4,0x38,0x2a, 0x5,0x39,0x33, 0x4,0x38,0x2d, 0x3,0x3c,0x2c, 0x5,0x39,0x39, 0x4,0x38,0x35, 0x3,0x3c,0x35, 0x4,0x38,0x37, 0x3,0x3c,0x36, 0x3,0x3c,0x43, 0x3,0x3c,0x2b, 0x3,0x3c,0x2d, 0x4,0x3d,0x78, 0x3,0x41,0x71, 0x3,0x41,0x66, 0x3,0x41,0x70, 0x4,0x3d,0x6b, 0x4,0x3d,0x6e, 0x4,0x3d,0x6f, 0x3,0x41,0x6c, 0x3,0x41,0x69, 0x3,0x41,0x64, 0x4,0x3d,0x6d, 0x3,0x41,0x5e, 0x4,0x3d,0x75, 0x3,0x41,0x62, 0x3,0x41,0x63, 0x3,0x41,0x7a, 0x3,0x41,0x61, 0x3,0x41,0x5f, 0x4,0x44,0x23, 0x4,0x3d,0x76, 0x3,0x41,0x60, 0x3,0x42,0x5a, 0x3,0x41,0x67, 0xf,0x48,0x55, 0x4,0x44,0x24, 0x4,0x43,0x75, 0x4,0x44,0x21, 0x4,0x43,0x7c, 0x3,0x47,0x3f, 0x4,0x43,0x78, 0x4,0x43,0x73, 0x3,0x47,0x41, 0x4,0x43,0x74, 0x3,0x47,0x4a, 0x4,0x43,0x7d, 0x4,0x43,0x7e, 0x4,0x43,0x7a, 0x4,0x44,0x22, 0x3,0x47,0x4f, 0x3,0x47,0x40, 0x4,0x44,0x25, 0x4,0x43,0x71, 0x5,0x46,0x4b, 0x3,0x47,0x49, 0x4,0x3d,0x72, 0x3,0x47,0x50, 0xf,0x48,0x52, 0x3,0x4c,0x4e, 0x5,0x4d,0x6d, 0x4,0x4a,0x3a, 0x3,0x4c,0x4c, 0x5,0x4d,0x61, 0x3,0x4c,0x53, 0x4,0x4a,0x37, 0x4,0x4a,0x36, 0x3,0x4c,0x5d, 0x3,0x4c,0x58, 0x7,0x23,0x6f, 0x4,0x4a,0x38, 0x4,0x4a,0x42, 0x3,0x4c,0x5a, 0x3,0x4c,0x5c, 0x3,0x4c,0x48, 0x3,0x4c,0x55, 0x3,0x51,0x43, 0x3,0x51,0x42, 0x4,0x50,0x60, 0x4,0x50,0x5a, 0x3,0x51,0x37, 0x3,0x51,0x30, 0x4,0x50,0x59, 0x4,0x4a,0x39, 0x3,0x51,0x3f, 0x3,0x51,0x2a, 0x3,0x51,0x3d, 0x4,0x56,0x49, 0x3,0x51,0x33, 0x3,0x51,0x39, 0x3,0x4c,0x4b, 0x4,0x50,0x5e, 0x3,0x51,0x2d, 0x4,0x50,0x64, 0x3,0x51,0x35, 0x3,0x51,0x34, 0x3,0x51,0x36, 0x3,0x55,0x22, 0x4,0x56,0x48, 0x3,0x54,0x7e, 0x3,0x55,0x25, 0x3,0x54,0x7d, 0x4,0x56,0x4b, 0x7,0x38,0x55, 0x5,0x5b,0x68, 0x3,0x54,0x77, 0x3,0x55,0x26, 0xf,0x5f,0x29, 0x3,0x54,0x79, 0x3,0x55,0x28, 0x4,0x5b,0x48, 0x4,0x5b,0x44, 0x3,0x57,0x7c, 0x4,0x5b,0x4a, 0x4,0x5b,0x49, 0x4,0x5f,0x6f, 0x4,0x5f,0x73, 0x3,0x5a,0x49, 0x4,0x5f,0x70, 0x4,0x5f,0x6e, 0x4,0x5f,0x72, 0x4,0x5f,0x75, 0x3,0x5a,0x4c, 0x3,0x5a,0x4b, 0xf,0x62,0x53, 0x3,0x5a,0x4a, 0x3,0x5c,0x4c, 0x3,0x5c,0x46, 0x4,0x63,0x51, 0x4,0x63,0x4f, 0x3,0x5c,0x48, 0x3,0x5c,0x4d, 0x4,0x63,0x54, 0x3,0x5c,0x4b, 0x3,0x5c,0x45, 0xf,0x65,0x3e, 0x5,0x70,0x27, 0x3,0x5e,0x36, 0x3,0x5c,0x4a, 0x3,0x5f,0x50, 0x4,0x68,0x6e, 0x3,0x60,0x35, 0x3,0x60,0x33, 0x3,0x60,0x34, 0x5,0x24,0x48, 0x6,0x28,0x30, 0x4,0x26,0x6d, 0x5,0x26,0x56, 0x4,0x26,0x70, 0x4,0x26,0x6c, 0x4,0x2d,0x60, 0x4,0x29,0x70, 0x4,0x29,0x71, 0x6,0x31,0x78, 0x4,0x29,0x74, 0x4,0x29,0x73, 0x5,0x2e,0x2e, 0x4,0x2d,0x5d, 0x4,0x2d,0x61, 0x4,0x2d,0x62, 0x4,0x2d,0x5e, 0x3,0x36,0x61, 0x4,0x32,0x48, 0x4,0x32,0x49, 0x6,0x40,0x6e, 0x4,0x38,0x3b, 0x4,0x38,0x39, 0x3,0x3c,0x46, 0x5,0x39,0x43, 0x4,0x38,0x3c, 0x6,0x38,0x64, 0x4,0x3e,0x21, 0x4,0x3d,0x7c, 0x4,0x3d,0x7b, 0x4,0x3d,0x7d, 0x4,0x3d,0x7e, 0x4,0x3e,0x22, 0x3,0x47,0x52, 0x6,0x5d,0x77, 0x4,0x44,0x2a, 0x4,0x4a,0x4c, 0x3,0x4c,0x68, 0x4,0x50,0x66, 0x4,0x50,0x67, 0x4,0x56,0x4f, 0x4,0x56,0x4e, 0x3,0x55,0x2a, 0x3,0x55,0x2c, 0x4,0x5f,0x77, 0x7,0x4e,0x22, 0x4,0x68,0x71, 0x5,0x75,0x77, 0x5,0x79,0x2f, 0x6,0x25,0x25, 0x3,0x2d,0x3e, 0x3,0x2b,0x7b, 0x3,0x3c,0x48, 0x4,0x38,0x3f, 0x5,0x46,0x5f, 0x3,0x58,0x24, 0x4,0x22,0x7c, 0x3,0x29,0x57, 0x5,0x26,0x62, 0x4,0x26,0x75, 0x3,0x2d,0x3f, 0x3,0x2d,0x41, 0x3,0x2d,0x40, 0x3,0x31,0x69, 0x3,0x36,0x63, 0x4,0x32,0x4a, 0x4,0x38,0x45, 0x4,0x38,0x44, 0x4,0x38,0x46, 0x4,0x38,0x42, 0x3,0x3c,0x4a, 0x3,0x42,0x23, 0x4,0x3e,0x23, 0x4,0x3e,0x24, 0x3,0x42,0x24, 0x4,0x44,0x32, 0x5,0x46,0x60, 0x4,0x44,0x33, 0x4,0x44,0x30, 0x4,0x4a,0x50, 0x4,0x4a,0x4f, 0x4,0x50,0x6b, 0x4,0x50,0x6a, 0x4,0x56,0x51, 0x4,0x63,0x55, 0x3,0x5c,0x4e, 0x5,0x75,0x78, 0x5,0x24,0x4e, 0x4,0x26,0x78, 0x4,0x2d,0x64, 0x3,0x31,0x6b, 0x4,0x32,0x4f, 0x4,0x38,0x49, 0x4,0x38,0x4a, 0x4,0x38,0x4b, 0x3,0x42,0x25, 0x4,0x44,0x35, 0x3,0x51,0x47, 0x3,0x51,0x48, 0x4,0x50,0x6e, 0x4,0x56,0x53, 0x3,0x58,0x25, 0x4,0x29,0x7b, 0x3,0x23,0x7b, 0x4,0x26,0x79, 0x3,0x29,0x5b, 0x4,0x26,0x7a, 0xf,0x27,0x5b, 0x3,0x2d,0x43, 0x4,0x2d,0x66, 0x4,0x32,0x52, 0x4,0x32,0x54, 0x4,0x32,0x53, 0x4,0x32,0x55, 0x3,0x36,0x67, 0x4,0x2d,0x67, 0x4,0x32,0x51, 0x5,0x39,0x5b, 0x3,0x3c,0x4c, 0x4,0x38,0x4f, 0x4,0x38,0x4c, 0x4,0x3e,0x29, 0x3,0x42,0x27, 0x4,0x3e,0x28, 0x4,0x3e,0x27, 0x4,0x44,0x3f, 0x4,0x44,0x38, 0x4,0x44,0x39, 0x4,0x44,0x3a, 0x5,0x46,0x68, 0x4,0x44,0x3c, 0x4,0x50,0x6f, 0x4,0x50,0x71, 0x4,0x50,0x72, 0x3,0x51,0x49, 0x4,0x5b,0x50, 0x4,0x5b,0x4f, 0x3,0x5a,0x50, 0x4,0x6d,0x57, 0x4,0x2d,0x6a, 0x3,0x29,0x5c, 0x3,0x36,0x68, 0x3,0x4c,0x69, 0x3,0x51,0x4a, 0x4,0x21,0x4f, 0x3,0x22,0x56, 0x3,0x22,0x55, 0x3,0x24,0x22, 0x5,0x21,0x74, 0x4,0x23,0x22, 0x3,0x26,0x54, 0x3,0x26,0x4f, 0x4,0x24,0x4f, 0x3,0x26,0x5d, 0x6,0x28,0x49, 0x3,0x26,0x5a, 0x4,0x24,0x51, 0x3,0x26,0x4b, 0x6,0x28,0x4a, 0x6,0x28,0x44, 0x3,0x26,0x58, 0x3,0x29,0x61, 0x3,0x29,0x5f, 0x3,0x29,0x5e, 0x3,0x29,0x62, 0x3,0x29,0x60, 0x4,0x26,0x7e, 0x3,0x29,0x68, 0x3,0x29,0x66, 0xf,0x27,0x66, 0x3,0x2d,0x44, 0x5,0x2a,0x24, 0x4,0x27,0x22, 0x3,0x2d,0x54, 0x5,0x29,0x7b, 0x5,0x29,0x7c, 0x4,0x29,0x7e, 0x3,0x2d,0x56, 0x3,0x2d,0x4c, 0xf,0x30,0x49, 0x6,0x38,0x72, 0x3,0x31,0x70, 0x3,0x31,0x71, 0x4,0x2d,0x6b, 0x6,0x39,0x33, 0x3,0x31,0x74, 0x4,0x2d,0x6c, 0x3,0x36,0x69, 0x3,0x32,0x24, 0x3,0x32,0x23, 0x3,0x31,0x7e, 0x3,0x31,0x75, 0x4,0x32,0x57, 0x3,0x36,0x71, 0x4,0x32,0x63, 0x4,0x32,0x64, 0x3,0x36,0x6e, 0x4,0x32,0x5e, 0x3,0x37,0x22, 0x3,0x36,0x6d, 0x3,0x3c,0x4f, 0x3,0x36,0x7e, 0x4,0x32,0x58, 0x4,0x32,0x68, 0x5,0x39,0x5e, 0x4,0x32,0x5a, 0x4,0x32,0x5c, 0x6,0x41,0x2b, 0x5,0x33,0x3d, 0x3,0x3c,0x5e, 0x3,0x36,0x7b, 0x3,0x3c,0x5f, 0x3,0x36,0x73, 0x6,0x41,0x41, 0x3,0x36,0x78, 0xf,0x36,0x33, 0x4,0x38,0x51, 0x4,0x38,0x56, 0x3,0x3c,0x65, 0x4,0x38,0x52, 0x3,0x3c,0x59, 0x4,0x38,0x59, 0x3,0x3c,0x6a, 0x3,0x3c,0x67, 0x3,0x3c,0x55, 0x4,0x38,0x57, 0x4,0x38,0x5a, 0x3,0x3c,0x53, 0x3,0x3c,0x57, 0x3,0x3c,0x61, 0x3,0x42,0x2b, 0x6,0x4a,0x6d, 0xf,0x3c,0x43, 0xf,0x3c,0x5a, 0x4,0x3e,0x37, 0x3,0x42,0x2c, 0x3,0x42,0x37, 0x3,0x42,0x35, 0x3,0x42,0x48, 0x3,0x42,0x38, 0x4,0x3e,0x30, 0x4,0x3e,0x39, 0x4,0x3e,0x2d, 0x3,0x42,0x42, 0x4,0x3e,0x38, 0x3,0x42,0x34, 0x3,0x42,0x3c, 0x4,0x3e,0x3c, 0x3,0x42,0x2f, 0x3,0x42,0x41, 0x5,0x40,0x27, 0x4,0x3e,0x2f, 0x4,0x3e,0x32, 0x3,0x42,0x32, 0x3,0x42,0x43, 0x3,0x47,0x55, 0x4,0x44,0x49, 0x3,0x47,0x60, 0x6,0x5e,0x3b, 0x3,0x47,0x59, 0x6,0x54,0x50, 0x3,0x47,0x58, 0x4,0x44,0x46, 0x4,0x44,0x4d, 0x4,0x44,0x4a, 0x6,0x5e,0x40, 0x3,0x4c,0x6e, 0x4,0x4a,0x5f, 0x4,0x4a,0x61, 0x3,0x4c,0x6f, 0x3,0x4c,0x7c, 0x4,0x4a,0x68, 0x4,0x4a,0x5d, 0x3,0x4c,0x6d, 0x4,0x4a,0x59, 0x3,0x4c,0x72, 0x5,0x46,0x78, 0x7,0x24,0x61, 0x3,0x4c,0x70, 0x4,0x50,0x74, 0x3,0x51,0x4b, 0x3,0x4c,0x76, 0x4,0x50,0x77, 0x4,0x50,0x7d, 0x5,0x55,0x36, 0x4,0x50,0x76, 0x3,0x51,0x4f, 0x3,0x51,0x4e, 0x4,0x50,0x7a, 0x5,0x55,0x2d, 0x3,0x51,0x53, 0x3,0x51,0x57, 0x4,0x50,0x7b, 0x4,0x56,0x56, 0x3,0x51,0x51, 0x3,0x51,0x4c, 0x4,0x50,0x78, 0x3,0x51,0x52, 0x4,0x4a,0x62, 0x5,0x55,0x2e, 0x3,0x55,0x32, 0x3,0x55,0x38, 0x4,0x56,0x5e, 0x4,0x56,0x60, 0x3,0x55,0x34, 0x4,0x56,0x58, 0x3,0x55,0x2e, 0x4,0x56,0x57, 0x4,0x56,0x5c, 0x3,0x55,0x3b, 0x4,0x56,0x59, 0x4,0x56,0x5b, 0x3,0x55,0x33, 0x4,0x5b,0x56, 0x4,0x5b,0x54, 0x4,0x5b,0x5a, 0x4,0x5b,0x57, 0x4,0x5b,0x60, 0x4,0x5f,0x7b, 0x4,0x5f,0x7d, 0x4,0x5b,0x5b, 0x4,0x5f,0x79, 0x3,0x5a,0x51, 0x3,0x5c,0x50, 0x4,0x63,0x5a, 0x4,0x63,0x5e, 0x4,0x63,0x5b, 0x3,0x5c,0x52, 0x4,0x66,0x49, 0x5,0x70,0x3e, 0x4,0x66,0x4a, 0x4,0x66,0x4c, 0x4,0x68,0x73, 0x3,0x5e,0x39, 0x3,0x5e,0x38, 0x3,0x5f,0x51, 0x4,0x6a,0x4e, 0x3,0x60,0x38, 0x4,0x6b,0x6d, 0x4,0x6b,0x6e, 0x3,0x61,0x66, 0x3,0x24,0x2a, 0x4,0x24,0x52, 0x3,0x26,0x61, 0xf,0x24,0x6e, 0x3,0x29,0x6e, 0x4,0x27,0x27, 0x3,0x29,0x78, 0xf,0x27,0x6e, 0x3,0x29,0x73, 0x3,0x2d,0x67, 0x3,0x2d,0x59, 0x3,0x2d,0x66, 0x3,0x2d,0x61, 0x3,0x2d,0x60, 0x3,0x2d,0x5b, 0x4,0x2a,0x27, 0x3,0x32,0x2e, 0x4,0x2d,0x73, 0x3,0x32,0x32, 0x3,0x37,0x2b, 0x3,0x37,0x2a, 0x3,0x37,0x34, 0x4,0x32,0x71, 0x4,0x32,0x76, 0x4,0x32,0x70, 0x4,0x32,0x77, 0xf,0x36,0x48, 0x3,0x3c,0x76, 0x4,0x38,0x65, 0x4,0x38,0x61, 0x3,0x3c,0x75, 0x4,0x38,0x62, 0x4,0x38,0x64, 0x4,0x38,0x60, 0x3,0x3b,0x23, 0x3,0x3c,0x7e, 0x3,0x3c,0x70, 0x3,0x3c,0x78, 0x3,0x42,0x54, 0x3,0x42,0x4d, 0x3,0x42,0x56, 0x4,0x3e,0x4b, 0x3,0x42,0x4a, 0x3,0x42,0x55, 0x4,0x3e,0x48, 0x4,0x3e,0x46, 0x4,0x3e,0x49, 0x6,0x54,0x54, 0x3,0x42,0x4b, 0x3,0x42,0x50, 0xf,0x42,0x78, 0xf,0x43,0x3c, 0x4,0x44,0x59, 0x3,0x47,0x73, 0x3,0x47,0x69, 0x6,0x54,0x67, 0x4,0x44,0x56, 0x4,0x44,0x5a, 0x4,0x44,0x5c, 0x3,0x47,0x71, 0xf,0x49,0x58, 0x3,0x4d,0x26, 0x3,0x4d,0x23, 0x3,0x4d,0x2b, 0x3,0x4d,0x21, 0x3,0x4d,0x27, 0x4,0x4a,0x6a, 0x4,0x51,0x25, 0x3,0x51,0x5d, 0x3,0x51,0x5b, 0x4,0x51,0x2b, 0x3,0x51,0x5f, 0x3,0x51,0x61, 0x4,0x51,0x24, 0x3,0x51,0x64, 0x3,0x51,0x65, 0x3,0x55,0x3d, 0x4,0x56,0x62, 0x3,0x55,0x3f, 0x3,0x55,0x44, 0x7,0x39,0x26, 0x3,0x57,0x51, 0x3,0x58,0x2c, 0x4,0x56,0x64, 0x3,0x5c,0x5a, 0x3,0x5a,0x59, 0x3,0x5c,0x54, 0x3,0x5c,0x5b, 0x4,0x63,0x5f, 0x4,0x66,0x4e, 0x5,0x73,0x57, 0x4,0x6a,0x50, 0x3,0x60,0x3a, 0x3,0x61,0x7a, 0x4,0x27,0x2c, 0x3,0x29,0x7a, 0x3,0x37,0x58, 0x3,0x47,0x74, 0x3,0x2d,0x6a, 0x4,0x2d,0x76, 0x3,0x37,0x36, 0x4,0x38,0x6b, 0x3,0x29,0x7b, 0x4,0x2a,0x2c, 0x4,0x38,0x6c, 0x3,0x29,0x7d, 0x3,0x29,0x7e, 0x5,0x2e,0x53, 0x6,0x39,0x40, 0x4,0x2d,0x7a, 0x4,0x44,0x5f, 0x7,0x39,0x2d, 0x4,0x5b,0x64, 0x4,0x66,0x50, 0x3,0x21,0x6a, 0x3,0x32,0x33, 0x4,0x23,0x26, 0x3,0x26,0x65, 0x4,0x24,0x55, 0x6,0x2c,0x71, 0x4,0x27,0x33, 0x5,0x26,0x77, 0x4,0x27,0x32, 0x4,0x27,0x2f, 0x3,0x2d,0x6c, 0x3,0x2d,0x6f, 0x4,0x2a,0x2e, 0x3,0x2d,0x6e, 0x3,0x32,0x34, 0x3,0x32,0x35, 0x4,0x2d,0x7d, 0x4,0x2d,0x7c, 0x4,0x32,0x7a, 0x5,0x33,0x4d, 0x4,0x32,0x79, 0x4,0x32,0x7e, 0x3,0x37,0x38, 0x6,0x41,0x66, 0x3,0x37,0x37, 0x4,0x38,0x70, 0x4,0x38,0x72, 0x4,0x38,0x73, 0x4,0x44,0x63, 0x6,0x54,0x78, 0x4,0x3e,0x4e, 0x3,0x42,0x5e, 0x4,0x44,0x62, 0x4,0x44,0x60, 0x4,0x44,0x64, 0x4,0x4a,0x6f, 0x4,0x4a,0x6e, 0x4,0x4a,0x72, 0x4,0x4a,0x71, 0x4,0x4a,0x73, 0x4,0x51,0x2e, 0x4,0x51,0x30, 0x4,0x51,0x2f, 0x4,0x56,0x67, 0x3,0x55,0x46, 0x3,0x55,0x47, 0x4,0x5b,0x66, 0x4,0x5b,0x65, 0x4,0x60,0x24, 0x7,0x53,0x6b, 0x4,0x6a,0x51, 0x4,0x27,0x34, 0x4,0x24,0x59, 0x3,0x26,0x6d, 0x4,0x24,0x56, 0x3,0x26,0x6c, 0x6,0x2c,0x75, 0x4,0x27,0x39, 0x5,0x27,0x2e, 0x3,0x2a,0x29, 0x3,0x2a,0x24, 0x3,0x2a,0x25, 0x4,0x27,0x3a, 0x4,0x2a,0x32, 0x4,0x2a,0x34, 0x4,0x2a,0x35, 0x3,0x2d,0x72, 0x6,0x32,0x67, 0x3,0x32,0x37, 0x5,0x2e,0x5c, 0x4,0x2e,0x21, 0x4,0x2d,0x7e, 0x4,0x2e,0x22, 0x4,0x2e,0x26, 0x6,0x41,0x6d, 0x4,0x2e,0x27, 0x5,0x33,0x51, 0x4,0x33,0x28, 0x6,0x41,0x75, 0x4,0x33,0x29, 0x4,0x33,0x25, 0x4,0x33,0x2b, 0x4,0x33,0x27, 0x4,0x33,0x2e, 0x4,0x38,0x79, 0x4,0x38,0x77, 0x3,0x3d,0x2c, 0x4,0x38,0x7b, 0x6,0x4b,0x43, 0x4,0x44,0x65, 0x4,0x3e,0x54, 0x4,0x44,0x66, 0x4,0x3e,0x53, 0x3,0x42,0x60, 0x4,0x3e,0x52, 0x4,0x44,0x6a, 0x6,0x5e,0x6e, 0x4,0x44,0x69, 0x4,0x44,0x68, 0x4,0x44,0x67, 0x3,0x47,0x76, 0x4,0x38,0x7a, 0x4,0x4a,0x7b, 0x4,0x4a,0x76, 0x4,0x4a,0x7a, 0x4,0x4a,0x7c, 0x7,0x2f,0x74, 0x4,0x51,0x32, 0x4,0x51,0x34, 0x3,0x55,0x48, 0x4,0x56,0x6a, 0x4,0x56,0x6b, 0x4,0x5b,0x67, 0x5,0x68,0x3b, 0x4,0x63,0x65, 0x4,0x63,0x66, 0x4,0x63,0x67, 0x4,0x63,0x63, 0x4,0x6b,0x6f, 0x3,0x24,0x2e, 0x4,0x23,0x29, 0x3,0x24,0x30, 0x3,0x24,0x31, 0x3,0x26,0x71, 0x3,0x26,0x6f, 0x3,0x26,0x70, 0x3,0x2a,0x2e, 0x3,0x2d,0x76, 0x6,0x2d,0x21, 0x3,0x2a,0x30, 0x4,0x27,0x3b, 0x3,0x2a,0x31, 0x3,0x2d,0x7d, 0x3,0x32,0x3a, 0x4,0x2a,0x37, 0x4,0x2a,0x38, 0xf,0x2c,0x32, 0x4,0x33,0x2f, 0x3,0x32,0x43, 0x3,0x32,0x44, 0x3,0x32,0x3b, 0x4,0x33,0x30, 0x3,0x32,0x45, 0xf,0x31,0x27, 0x3,0x32,0x42, 0x3,0x37,0x3f, 0x3,0x37,0x42, 0x3,0x37,0x41, 0x4,0x33,0x33, 0x3,0x37,0x3e, 0x3,0x37,0x43, 0x3,0x3d,0x34, 0x4,0x38,0x7d, 0x5,0x3a,0x2d, 0x3,0x42,0x63, 0x3,0x3d,0x31, 0x3,0x3d,0x30, 0x3,0x42,0x6c, 0xf,0x36,0x59, 0xf,0x3d,0x3b, 0x4,0x3e,0x59, 0x3,0x42,0x65, 0x3,0x42,0x69, 0x5,0x40,0x4e, 0x3,0x42,0x72, 0xf,0x43,0x49, 0xf,0x43,0x56, 0x3,0x48,0x24, 0x7,0x25,0x37, 0x4,0x4b,0x22, 0x4,0x4b,0x21, 0x3,0x4d,0x37, 0x3,0x4d,0x3c, 0x3,0x4d,0x33, 0x3,0x4d,0x38, 0x3,0x4d,0x34, 0x3,0x4d,0x32, 0x3,0x51,0x68, 0x5,0x55,0x5d, 0x4,0x51,0x37, 0x3,0x51,0x69, 0x3,0x55,0x4a, 0x4,0x56,0x6f, 0xf,0x55,0x7a, 0xf,0x56,0x22, 0x3,0x55,0x4e, 0x4,0x5b,0x69, 0x3,0x55,0x4c, 0xf,0x5b,0x2d, 0x3,0x58,0x31, 0x4,0x60,0x2a, 0xf,0x62,0x78, 0xf,0x62,0x7b, 0x3,0x5c,0x61, 0x4,0x2a,0x39, 0x4,0x2a,0x3a, 0x5,0x2e,0x62, 0x4,0x2e,0x2b, 0x4,0x33,0x35, 0x4,0x33,0x34, 0x4,0x38,0x7e, 0x4,0x44,0x70, 0x4,0x44,0x71, 0x4,0x44,0x6f, 0x4,0x4b,0x23, 0x4,0x4b,0x24, 0x4,0x5b,0x6c, 0x4,0x6d,0x5a, 0x4,0x24,0x5e, 0x5,0x27,0x32, 0x3,0x2a,0x34, 0x3,0x2e,0x23, 0x4,0x2a,0x3d, 0x3,0x32,0x4a, 0x3,0x32,0x4b, 0x4,0x2e,0x2d, 0x3,0x32,0x49, 0x4,0x2e,0x2c, 0x4,0x33,0x3b, 0x4,0x39,0x21, 0x4,0x33,0x3a, 0x4,0x33,0x38, 0x4,0x33,0x39, 0x4,0x33,0x37, 0x4,0x39,0x23, 0x4,0x39,0x26, 0x4,0x33,0x3c, 0x4,0x39,0x24, 0x4,0x3e,0x62, 0x4,0x3e,0x61, 0x4,0x3e,0x5d, 0x4,0x3e,0x60, 0x3,0x42,0x76, 0x4,0x3e,0x63, 0x5,0x47,0x48, 0x4,0x44,0x73, 0x4,0x44,0x76, 0x4,0x44,0x74, 0x4,0x44,0x78, 0x4,0x44,0x77, 0x4,0x44,0x75, 0x4,0x4b,0x25, 0x4,0x4b,0x27, 0x4,0x4b,0x26, 0x4,0x51,0x3f, 0x3,0x51,0x6f, 0x4,0x51,0x42, 0x4,0x51,0x41, 0x4,0x56,0x72, 0x4,0x56,0x73, 0x3,0x55,0x51, 0x4,0x56,0x75, 0x3,0x55,0x50, 0x4,0x56,0x71, 0x4,0x5b,0x6f, 0x4,0x5b,0x6e, 0x4,0x60,0x2c, 0x4,0x60,0x2b, 0x4,0x68,0x75, 0x4,0x6b,0x70, 0x4,0x6a,0x53, 0x3,0x32,0x4c, 0x4,0x3e,0x65, 0x3,0x4d,0x3f, 0x4,0x56,0x78, 0x3,0x3d,0x40, 0xf,0x50,0x4e, 0x5,0x24,0x63, 0x6,0x28,0x62, 0x3,0x26,0x72, 0x4,0x2a,0x41, 0x3,0x2e,0x29, 0x4,0x2a,0x43, 0x4,0x2e,0x2f, 0x4,0x2e,0x31, 0x5,0x33,0x64, 0x3,0x37,0x48, 0x3,0x3d,0x41, 0x4,0x39,0x28, 0x4,0x3e,0x69, 0x3,0x42,0x79, 0x3,0x42,0x7a, 0x4,0x3e,0x68, 0x4,0x44,0x79, 0x3,0x4d,0x40, 0x4,0x4b,0x2a, 0x4,0x4b,0x29, 0x4,0x51,0x44, 0x5,0x5c,0x2f, 0x4,0x5b,0x72, 0x4,0x5b,0x73, 0x4,0x60,0x2e, 0x4,0x63,0x69, 0x4,0x6a,0x54, 0x4,0x3e,0x6d, 0x4,0x24,0x61, 0x4,0x24,0x62, 0x5,0x27,0x37, 0x3,0x2a,0x3c, 0x4,0x2a,0x46, 0x3,0x2e,0x2d, 0x4,0x2a,0x49, 0x3,0x2e,0x2c, 0x3,0x2e,0x2e, 0x3,0x32,0x56, 0x4,0x2e,0x37, 0x4,0x2e,0x3b, 0x4,0x2e,0x35, 0x4,0x2e,0x36, 0x3,0x32,0x54, 0x4,0x2e,0x33, 0x4,0x2e,0x3f, 0x4,0x2e,0x39, 0x6,0x39,0x6b, 0x3,0x32,0x53, 0x4,0x2e,0x38, 0x4,0x2e,0x3a, 0x5,0x33,0x6d, 0x4,0x33,0x42, 0x3,0x37,0x4c, 0x4,0x33,0x40, 0x4,0x2e,0x3c, 0x4,0x33,0x3f, 0x4,0x33,0x45, 0x3,0x37,0x4b, 0x4,0x33,0x43, 0x4,0x39,0x32, 0x4,0x39,0x33, 0x3,0x3d,0x46, 0x3,0x3d,0x4b, 0x6,0x4b,0x5a, 0x3,0x3d,0x49, 0x4,0x39,0x36, 0x5,0x40,0x60, 0x4,0x39,0x2f, 0x4,0x39,0x30, 0x3,0x3d,0x48, 0x3,0x3d,0x4a, 0x5,0x3a,0x3b, 0x4,0x39,0x35, 0x4,0x39,0x38, 0x4,0x3e,0x74, 0x5,0x40,0x64, 0x4,0x3e,0x6f, 0x4,0x3e,0x78, 0x4,0x3e,0x6e, 0x4,0x3e,0x76, 0x4,0x3e,0x73, 0x4,0x3e,0x7a, 0x4,0x45,0x24, 0x4,0x45,0x28, 0x6,0x5f,0x2d, 0x3,0x48,0x2a, 0x3,0x48,0x2c, 0x4,0x45,0x23, 0x4,0x45,0x21, 0x7,0x25,0x58, 0x4,0x4b,0x38, 0x3,0x4d,0x42, 0x4,0x4b,0x37, 0x4,0x4b,0x35, 0x4,0x4b,0x33, 0x4,0x4b,0x2f, 0x7,0x25,0x5c, 0x4,0x4b,0x2e, 0x5,0x47,0x59, 0x4,0x4b,0x3b, 0x7,0x30,0x36, 0x4,0x51,0x48, 0x4,0x51,0x49, 0x3,0x51,0x75, 0x4,0x51,0x4e, 0x4,0x51,0x4a, 0x4,0x51,0x50, 0x4,0x57,0x26, 0x4,0x57,0x22, 0x4,0x5b,0x7b, 0x4,0x5b,0x77, 0x7,0x40,0x6b, 0x4,0x57,0x25, 0x7,0x40,0x67, 0x4,0x60,0x32, 0x4,0x60,0x2f, 0x4,0x60,0x30, 0x4,0x66,0x58, 0x4,0x66,0x59, 0x3,0x5e,0x40, 0x5,0x73,0x5c, 0x4,0x6a,0x55, 0x4,0x6b,0x72, 0x4,0x6b,0x71, 0x3,0x62,0x2d, 0x3,0x26,0x75, 0x3,0x2e,0x30, 0x3,0x32,0x58, 0x3,0x37,0x4e, 0x3,0x43,0x22, 0x3,0x48,0x2d, 0x5,0x47,0x5b, 0x5,0x4e,0x59, 0x4,0x51,0x56, 0x4,0x60,0x37, 0x4,0x66,0x5b, 0x4,0x6c,0x73, 0x4,0x27,0x46, 0x4,0x2a,0x4e, 0x3,0x2e,0x31, 0x4,0x2e,0x46, 0x4,0x2e,0x45, 0x4,0x33,0x47, 0x4,0x33,0x48, 0x4,0x39,0x3a, 0x6,0x55,0x52, 0x4,0x45,0x30, 0x4,0x45,0x32, 0x3,0x48,0x2f, 0x3,0x4d,0x43, 0x4,0x4b,0x3d, 0x4,0x51,0x57, 0x4,0x5b,0x7e, 0x4,0x63,0x6c, 0x4,0x27,0x48, 0x4,0x2a,0x51, 0x4,0x2a,0x50, 0x4,0x2e,0x47, 0x4,0x2e,0x49, 0x3,0x32,0x59, 0x4,0x33,0x4b, 0x3,0x37,0x4f, 0x3,0x3d,0x4e, 0x3,0x43,0x23, 0x5,0x40,0x6f, 0x3,0x48,0x32, 0x4,0x51,0x5a, 0x4,0x45,0x36, 0x4,0x57,0x2c, 0x4,0x60,0x38, 0x3,0x5f,0x38, 0x4,0x6e,0x48, 0x3,0x26,0x79, 0x4,0x24,0x65, 0x4,0x27,0x4e, 0x4,0x27,0x4f, 0x4,0x27,0x4d, 0x4,0x27,0x4c, 0x4,0x27,0x4a, 0x4,0x2a,0x53, 0x4,0x2a,0x56, 0x4,0x2a,0x57, 0x4,0x2a,0x54, 0x4,0x2a,0x58, 0x5,0x2a,0x6d, 0x4,0x2a,0x5a, 0x6,0x33,0x38, 0x3,0x2e,0x34, 0x4,0x2e,0x52, 0x3,0x32,0x5d, 0x3,0x32,0x66, 0x3,0x32,0x60, 0x4,0x2e,0x4d, 0x3,0x32,0x61, 0x5,0x33,0x76, 0x4,0x33,0x50, 0x4,0x33,0x51, 0x3,0x37,0x56, 0x3,0x37,0x54, 0x4,0x33,0x52, 0x4,0x33,0x4e, 0x4,0x33,0x4d, 0x3,0x3d,0x50, 0x4,0x39,0x49, 0x3,0x3d,0x54, 0x4,0x39,0x4a, 0x3,0x3d,0x55, 0x4,0x39,0x45, 0x4,0x39,0x48, 0x4,0x39,0x3f, 0x4,0x39,0x41, 0x4,0x39,0x4b, 0x4,0x39,0x46, 0x4,0x39,0x4d, 0x4,0x39,0x47, 0x4,0x39,0x43, 0x4,0x3f,0x22, 0x4,0x39,0x4c, 0x4,0x39,0x42, 0x4,0x3f,0x30, 0x4,0x3f,0x2d, 0x3,0x43,0x24, 0x4,0x3f,0x25, 0x4,0x3f,0x26, 0x4,0x3f,0x27, 0x4,0x3f,0x2b, 0x4,0x3f,0x2c, 0x6,0x55,0x61, 0x5,0x47,0x61, 0x4,0x45,0x39, 0x4,0x45,0x41, 0x4,0x45,0x3c, 0x4,0x45,0x37, 0x3,0x48,0x37, 0x4,0x45,0x43, 0x4,0x45,0x46, 0x4,0x45,0x3f, 0x4,0x45,0x44, 0x3,0x48,0x3a, 0x4,0x45,0x38, 0x3,0x4d,0x45, 0x4,0x4b,0x45, 0x4,0x4b,0x42, 0x4,0x4b,0x44, 0x4,0x4b,0x47, 0x4,0x4b,0x43, 0x4,0x4b,0x4d, 0x3,0x4d,0x47, 0x5,0x4e,0x60, 0x4,0x4b,0x3f, 0x3,0x51,0x77, 0x3,0x51,0x78, 0x4,0x51,0x5c, 0x4,0x51,0x60, 0x3,0x51,0x7c, 0x3,0x51,0x7a, 0x4,0x51,0x5d, 0x4,0x51,0x64, 0x4,0x57,0x32, 0x4,0x57,0x2e, 0x4,0x57,0x31, 0x4,0x57,0x2f, 0x3,0x55,0x5a, 0x4,0x57,0x30, 0x4,0x57,0x33, 0x4,0x57,0x34, 0x5,0x56,0x22, 0x5,0x62,0x69, 0x4,0x5c,0x27, 0x4,0x5c,0x29, 0x4,0x5c,0x2a, 0x4,0x5c,0x25, 0x3,0x58,0x37, 0x4,0x5c,0x26, 0x4,0x63,0x70, 0x4,0x63,0x6e, 0x4,0x63,0x71, 0x4,0x63,0x6f, 0x4,0x66,0x5d, 0x3,0x5e,0x41, 0x4,0x68,0x78, 0x4,0x6a,0x57, 0x4,0x68,0x7a, 0x4,0x6c,0x75, 0x4,0x6e,0x4d, 0x4,0x27,0x51, 0x4,0x2a,0x5f, 0x4,0x33,0x57, 0x4,0x45,0x4a, 0x3,0x55,0x5d, 0x4,0x57,0x38, 0x4,0x63,0x74, 0x4,0x6b,0x75, 0x4,0x2e,0x57, 0x4,0x2e,0x58, 0x4,0x33,0x5a, 0x4,0x33,0x59, 0x6,0x4c,0x2b, 0x4,0x3f,0x33, 0x4,0x45,0x4c, 0x3,0x24,0x32, 0x3,0x26,0x7a, 0x4,0x27,0x53, 0xf,0x28,0x7a, 0x4,0x2a,0x64, 0x3,0x2e,0x38, 0x4,0x2a,0x62, 0x3,0x2e,0x3c, 0x3,0x2d,0x3b, 0x4,0x2e,0x5f, 0x4,0x2e,0x5c, 0x4,0x2e,0x62, 0x5,0x2f,0x34, 0x3,0x37,0x5b, 0x3,0x32,0x6a, 0x3,0x32,0x6b, 0x4,0x2e,0x5e, 0x4,0x2e,0x61, 0x4,0x33,0x5e, 0x4,0x33,0x61, 0x3,0x37,0x5c, 0x4,0x33,0x5f, 0x3,0x37,0x5a, 0x4,0x33,0x60, 0x3,0x37,0x5e, 0x3,0x3d,0x5b, 0x5,0x3a,0x59, 0x6,0x4c,0x33, 0x4,0x39,0x58, 0x3,0x3d,0x58, 0x4,0x39,0x53, 0x4,0x3f,0x40, 0x4,0x3f,0x39, 0x4,0x3f,0x3f, 0x3,0x43,0x2f, 0x4,0x3f,0x3c, 0x3,0x43,0x32, 0x4,0x3f,0x3d, 0x3,0x43,0x2c, 0x4,0x3f,0x3e, 0x4,0x3f,0x38, 0x4,0x3f,0x3a, 0x4,0x3f,0x3b, 0x4,0x3f,0x42, 0x4,0x45,0x4e, 0x3,0x48,0x43, 0x4,0x45,0x51, 0x3,0x48,0x41, 0x4,0x45,0x4d, 0x4,0x45,0x55, 0x4,0x45,0x4f, 0x5,0x47,0x76, 0x4,0x4b,0x5c, 0x4,0x4b,0x58, 0x4,0x4b,0x56, 0x4,0x4b,0x55, 0x4,0x4b,0x5e, 0x7,0x26,0x24, 0x4,0x4b,0x5b, 0x3,0x52,0x23, 0x3,0x51,0x7d, 0x4,0x51,0x6c, 0x3,0x51,0x7e, 0x7,0x30,0x59, 0x5,0x56,0x33, 0x4,0x51,0x70, 0x4,0x51,0x6d, 0x4,0x57,0x3b, 0x4,0x57,0x41, 0x3,0x48,0x42, 0x4,0x57,0x39, 0x3,0x55,0x5e, 0x3,0x55,0x5f, 0x4,0x57,0x3f, 0x3,0x58,0x41, 0x4,0x5c,0x2d, 0x3,0x58,0x3d, 0x4,0x5c,0x31, 0x4,0x5c,0x2f, 0x4,0x5c,0x2e, 0x4,0x60,0x3f, 0x7,0x4e,0x5c, 0x3,0x5c,0x63, 0x4,0x63,0x76, 0x4,0x63,0x75, 0x4,0x66,0x5f, 0x4,0x66,0x60, 0x4,0x66,0x61, 0x4,0x68,0x7c, 0x4,0x68,0x7b, 0x3,0x60,0x75, 0x3,0x61,0x67, 0x3,0x2e,0x3f, 0x4,0x2a,0x67, 0x4,0x2a,0x66, 0x6,0x33,0x48, 0x3,0x32,0x6e, 0x4,0x2e,0x64, 0x3,0x32,0x71, 0x3,0x37,0x64, 0x4,0x33,0x63, 0x4,0x33,0x62, 0x3,0x3d,0x61, 0x3,0x3d,0x60, 0x4,0x39,0x59, 0x4,0x3f,0x45, 0x4,0x3f,0x44, 0x3,0x43,0x3a, 0x3,0x43,0x3b, 0x3,0x43,0x3e, 0x4,0x3f,0x47, 0x3,0x43,0x3c, 0x3,0x43,0x3f, 0x3,0x48,0x46, 0x5,0x48,0x24, 0x3,0x48,0x49, 0x5,0x4e,0x76, 0x3,0x4d,0x4e, 0x4,0x51,0x76, 0x3,0x52,0x25, 0x4,0x51,0x74, 0x4,0x51,0x75, 0x4,0x57,0x42, 0x3,0x58,0x46, 0x3,0x58,0x47, 0x3,0x5a,0x64, 0x4,0x66,0x63, 0x3,0x62,0x34, 0x5,0x24,0x6e, 0x3,0x26,0x7d, 0x5,0x27,0x46, 0x6,0x2d,0x49, 0x4,0x27,0x56, 0x3,0x2a,0x40, 0x3,0x2a,0x41, 0x3,0x2a,0x43, 0x4,0x2a,0x6a, 0x4,0x2a,0x6f, 0x4,0x2a,0x6b, 0x4,0x2a,0x69, 0x4,0x2a,0x6c, 0xf,0x2c,0x6d, 0x4,0x2e,0x65, 0x3,0x32,0x75, 0x3,0x32,0x7a, 0x6,0x42,0x66, 0x4,0x33,0x67, 0x4,0x33,0x66, 0x3,0x37,0x6d, 0x4,0x33,0x65, 0x5,0x34,0x3b, 0x5,0x34,0x39, 0x4,0x33,0x6a, 0x4,0x33,0x69, 0x4,0x33,0x6b, 0x3,0x37,0x68, 0x4,0x33,0x6d, 0x5,0x34,0x38, 0x3,0x37,0x6e, 0xf,0x37,0x3b, 0x4,0x33,0x64, 0x5,0x3a,0x65, 0x4,0x39,0x5e, 0x4,0x39,0x62, 0x3,0x3d,0x67, 0x4,0x39,0x64, 0x3,0x3d,0x6a, 0x4,0x39,0x63, 0x3,0x3d,0x6b, 0x4,0x39,0x61, 0x4,0x3f,0x4f, 0x3,0x43,0x40, 0x4,0x3f,0x4d, 0x3,0x43,0x45, 0x4,0x3f,0x4c, 0x3,0x43,0x42, 0x4,0x3f,0x4b, 0x3,0x43,0x43, 0x4,0x45,0x57, 0x4,0x3f,0x49, 0x5,0x41,0x31, 0x3,0x48,0x51, 0x3,0x48,0x4a, 0x4,0x45,0x5b, 0x3,0x48,0x53, 0x3,0x48,0x4e, 0x4,0x45,0x5a, 0x3,0x48,0x4c, 0x4,0x45,0x58, 0x6,0x5f,0x6b, 0x4,0x45,0x59, 0x4,0x4b,0x65, 0x4,0x4b,0x61, 0x3,0x4d,0x54, 0x4,0x4b,0x62, 0x3,0x4d,0x52, 0x7,0x26,0x32, 0x3,0x4d,0x58, 0x4,0x4b,0x68, 0x4,0x4b,0x66, 0x4,0x4b,0x64, 0x3,0x4d,0x59, 0x4,0x51,0x7d, 0x4,0x51,0x7c, 0x3,0x52,0x2b, 0x4,0x51,0x79, 0x4,0x51,0x78, 0x4,0x51,0x7a, 0x3,0x52,0x2d, 0x4,0x57,0x45, 0x3,0x55,0x63, 0x4,0x57,0x47, 0x3,0x58,0x48, 0x7,0x41,0x2e, 0x4,0x5c,0x37, 0x4,0x5c,0x35, 0x4,0x5c,0x36, 0x3,0x5e,0x46, 0x4,0x63,0x79, 0x4,0x66,0x65, 0x7,0x58,0x4c, 0x4,0x66,0x64, 0x4,0x68,0x7e, 0x4,0x69,0x21, 0x3,0x62,0x39, 0x4,0x24,0x69, 0x6,0x2d,0x4e, 0x3,0x2e,0x46, 0x3,0x2e,0x45, 0x4,0x2a,0x71, 0x4,0x2a,0x72, 0x3,0x33,0x21, 0x3,0x32,0x7e, 0x3,0x32,0x7d, 0x4,0x33,0x6f, 0x4,0x33,0x70, 0x3,0x37,0x6f, 0x5,0x34,0x45, 0x4,0x33,0x72, 0x4,0x33,0x71, 0x6,0x42,0x6f, 0x3,0x3d,0x6c, 0x4,0x39,0x67, 0x3,0x3d,0x6d, 0x6,0x4c,0x53, 0x3,0x3d,0x6e, 0x5,0x41,0x39, 0x4,0x3f,0x53, 0x4,0x3f,0x52, 0x6,0x56,0x27, 0x4,0x45,0x60, 0x6,0x5f,0x78, 0x4,0x4b,0x6c, 0x5,0x4f,0x23, 0x5,0x54,0x24, 0x4,0x52,0x25, 0x4,0x52,0x22, 0x4,0x52,0x24, 0x7,0x30,0x6f, 0x3,0x55,0x65, 0x3,0x55,0x66, 0x4,0x57,0x4c, 0x4,0x57,0x4d, 0x4,0x57,0x4b, 0x4,0x57,0x4f, 0x3,0x55,0x67, 0x4,0x5c,0x39, 0x4,0x5c,0x3a, 0x4,0x60,0x48, 0x4,0x60,0x49, 0x4,0x63,0x7c, 0x4,0x69,0x22, 0x3,0x24,0x34, 0x3,0x2a,0x46, 0x4,0x2a,0x76, 0x3,0x2e,0x4a, 0x3,0x33,0x25, 0x4,0x2e,0x6d, 0x3,0x33,0x22, 0x5,0x34,0x46, 0x3,0x3d,0x6f, 0x4,0x39,0x6a, 0x3,0x43,0x48, 0x4,0x3f,0x54, 0x4,0x3f,0x55, 0x4,0x3f,0x5a, 0x4,0x45,0x63, 0x4,0x57,0x52, 0x4,0x5c,0x3b, 0x3,0x5a,0x68, 0x5,0x2b,0x21, 0x4,0x2e,0x75, 0x4,0x2e,0x70, 0x3,0x33,0x28, 0x4,0x2e,0x77, 0x3,0x33,0x29, 0x4,0x2e,0x73, 0x4,0x2e,0x72, 0x4,0x33,0x76, 0x4,0x33,0x7d, 0x3,0x37,0x74, 0x5,0x34,0x48, 0x4,0x33,0x77, 0x4,0x33,0x7b, 0x3,0x37,0x75, 0x6,0x42,0x76, 0x4,0x33,0x78, 0x4,0x39,0x6d, 0x4,0x39,0x74, 0x4,0x39,0x71, 0x3,0x3d,0x74, 0x4,0x3f,0x5b, 0x4,0x39,0x72, 0x3,0x3d,0x7a, 0x4,0x39,0x75, 0x3,0x3d,0x73, 0x4,0x39,0x6f, 0x6,0x4c,0x5b, 0x6,0x4c,0x56, 0x3,0x43,0x50, 0x4,0x3f,0x66, 0x4,0x3f,0x62, 0x4,0x3f,0x61, 0x3,0x43,0x52, 0x3,0x43,0x53, 0x4,0x3f,0x5d, 0x3,0x43,0x4e, 0x4,0x3f,0x60, 0x3,0x43,0x4b, 0x4,0x3f,0x63, 0x5,0x48,0x46, 0x4,0x39,0x76, 0x4,0x45,0x65, 0x3,0x48,0x5b, 0x4,0x45,0x6a, 0x4,0x45,0x69, 0x3,0x48,0x5f, 0x4,0x45,0x6e, 0x4,0x45,0x68, 0x3,0x48,0x59, 0x4,0x45,0x6d, 0x4,0x45,0x66, 0x5,0x48,0x36, 0x4,0x4b,0x7b, 0x4,0x4b,0x75, 0x4,0x4b,0x70, 0x3,0x4d,0x61, 0x3,0x4d,0x5e, 0x4,0x4c,0x22, 0x3,0x4d,0x67, 0x4,0x4b,0x7e, 0x3,0x4d,0x62, 0x4,0x4c,0x2e, 0x5,0x4f,0x3b, 0x3,0x4d,0x64, 0x4,0x4c,0x30, 0x4,0x4c,0x25, 0x4,0x4c,0x2d, 0x4,0x4b,0x79, 0x5,0x4f,0x32, 0x3,0x4d,0x5f, 0x5,0x4f,0x45, 0x4,0x4c,0x2c, 0x4,0x4c,0x27, 0x4,0x4b,0x77, 0x3,0x4d,0x66, 0x3,0x4d,0x68, 0x4,0x4c,0x28, 0x5,0x4f,0x36, 0x4,0x52,0x34, 0x4,0x52,0x3a, 0x3,0x52,0x31, 0x4,0x52,0x37, 0x4,0x52,0x2b, 0x4,0x52,0x38, 0x3,0x52,0x35, 0x4,0x52,0x39, 0x4,0x52,0x3b, 0x4,0x52,0x36, 0x4,0x52,0x2f, 0x4,0x52,0x3d, 0x4,0x52,0x29, 0x3,0x52,0x32, 0x4,0x57,0x5b, 0x5,0x5c,0x6d, 0x4,0x57,0x5e, 0x4,0x57,0x5a, 0x4,0x57,0x62, 0x5,0x5c,0x7d, 0x4,0x57,0x65, 0x4,0x57,0x53, 0x3,0x55,0x6c, 0x4,0x57,0x56, 0x4,0x57,0x58, 0x4,0x57,0x59, 0x5,0x5c,0x7e, 0x4,0x57,0x55, 0x5,0x5d,0x30, 0x4,0x5c,0x44, 0x4,0x5c,0x4f, 0x4,0x5c,0x4b, 0x4,0x5c,0x50, 0x4,0x5c,0x43, 0x3,0x58,0x4a, 0x4,0x5c,0x4a, 0x3,0x5a,0x6c, 0x4,0x5c,0x42, 0x4,0x5c,0x4c, 0x7,0x41,0x3f, 0x4,0x5c,0x46, 0x4,0x5c,0x49, 0x4,0x5c,0x40, 0x5,0x63,0x34, 0x4,0x5c,0x48, 0x3,0x58,0x4d, 0x3,0x58,0x4b, 0x5,0x63,0x41, 0x4,0x60,0x56, 0x5,0x68,0x6e, 0x3,0x5a,0x6a, 0x4,0x60,0x53, 0x5,0x68,0x66, 0x3,0x5a,0x6d, 0x3,0x5a,0x69, 0x3,0x5a,0x6b, 0x4,0x5c,0x51, 0x4,0x63,0x7e, 0x4,0x66,0x69, 0x4,0x66,0x6c, 0x4,0x66,0x6e, 0x3,0x5e,0x4a, 0x4,0x66,0x6a, 0x3,0x5e,0x4d, 0x4,0x66,0x68, 0x4,0x66,0x6d, 0x3,0x5f,0x56, 0x5,0x70,0x61, 0x4,0x69,0x26, 0x4,0x69,0x28, 0x4,0x6a,0x5d, 0x4,0x6a,0x61, 0x4,0x6a,0x5c, 0x3,0x60,0x5f, 0x4,0x6b,0x76, 0x4,0x6d,0x5c, 0x4,0x6d,0x76, 0x7,0x65,0x5d, 0x4,0x2a,0x77, 0x3,0x33,0x2f, 0x3,0x33,0x33, 0x6,0x43,0x22, 0x4,0x34,0x25, 0x5,0x34,0x59, 0x3,0x37,0x7c, 0x6,0x4c,0x60, 0x4,0x39,0x7b, 0x4,0x39,0x7c, 0x3,0x3d,0x7d, 0x3,0x3d,0x7c, 0x4,0x39,0x7d, 0x3,0x43,0x5a, 0x3,0x43,0x56, 0x3,0x43,0x57, 0x3,0x43,0x59, 0x3,0x43,0x5b, 0x3,0x48,0x63, 0x4,0x45,0x72, 0x3,0x48,0x64, 0x3,0x48,0x65, 0x6,0x60,0x2c, 0x3,0x48,0x66, 0x3,0x4d,0x6b, 0x3,0x4d,0x6c, 0x3,0x4d,0x69, 0x3,0x4d,0x6a, 0x4,0x4c,0x37, 0x7,0x26,0x57, 0x4,0x4c,0x35, 0x3,0x52,0x36, 0x4,0x57,0x6d, 0x3,0x55,0x73, 0x3,0x55,0x72, 0x4,0x57,0x69, 0x4,0x57,0x6a, 0x3,0x4d,0x74, 0x4,0x57,0x6b, 0x5,0x63,0x4e, 0x4,0x5c,0x56, 0x3,0x58,0x52, 0x4,0x5c,0x55, 0x4,0x5c,0x54, 0x5,0x63,0x54, 0x3,0x58,0x53, 0x3,0x5a,0x70, 0x4,0x60,0x5b, 0x4,0x60,0x5d, 0x4,0x64,0x23, 0x3,0x5c,0x68, 0x7,0x54,0x3a, 0x5,0x70,0x70, 0x4,0x6a,0x65, 0x5,0x76,0x39, 0x4,0x6c,0x7a, 0x3,0x61,0x45, 0x4,0x27,0x5c, 0x6,0x33,0x64, 0x3,0x2e,0x57, 0x3,0x2e,0x55, 0x3,0x2e,0x58, 0x4,0x2e,0x78, 0x4,0x2e,0x7e, 0x3,0x33,0x35, 0x3,0x33,0x34, 0x4,0x2e,0x7c, 0x3,0x33,0x39, 0x4,0x2f,0x21, 0x3,0x33,0x38, 0x4,0x2e,0x7d, 0x3,0x33,0x36, 0x3,0x33,0x3a, 0x4,0x34,0x2e, 0x4,0x34,0x26, 0x3,0x38,0x23, 0x3,0x38,0x2a, 0x4,0x34,0x27, 0x4,0x34,0x30, 0x3,0x38,0x2c, 0x4,0x34,0x2d, 0x4,0x34,0x2b, 0x4,0x34,0x29, 0x3,0x38,0x28, 0x3,0x38,0x2d, 0x3,0x38,0x25, 0x3,0x3e,0x36, 0x5,0x3b,0x2c, 0x3,0x3e,0x2d, 0x3,0x3e,0x32, 0x3,0x3e,0x27, 0x3,0x3e,0x30, 0x3,0x3e,0x25, 0x6,0x4c,0x71, 0x3,0x3e,0x31, 0x4,0x3f,0x6a, 0x3,0x43,0x65, 0x3,0x43,0x6b, 0x4,0x3f,0x6e, 0x4,0x3f,0x73, 0x4,0x3f,0x6f, 0x3,0x43,0x61, 0x3,0x43,0x5d, 0x3,0x48,0x6c, 0x4,0x45,0x75, 0x4,0x45,0x7e, 0x4,0x45,0x79, 0x4,0x46,0x21, 0x3,0x48,0x67, 0x3,0x43,0x5f, 0x3,0x48,0x72, 0x3,0x48,0x75, 0x4,0x46,0x23, 0x5,0x48,0x54, 0x3,0x48,0x6f, 0x3,0x4e,0x2a, 0x5,0x4f,0x53, 0x4,0x4c,0x3e, 0x4,0x4c,0x3c, 0x4,0x4c,0x40, 0x3,0x4d,0x7b, 0x3,0x4e,0x21, 0x3,0x4e,0x2d, 0x3,0x4d,0x76, 0x3,0x4d,0x79, 0x4,0x4c,0x3a, 0x4,0x4c,0x3d, 0x4,0x4c,0x3f, 0x3,0x4d,0x7a, 0x4,0x4c,0x44, 0x5,0x4f,0x54, 0x3,0x4e,0x26, 0x3,0x4e,0x23, 0x3,0x52,0x3a, 0x4,0x52,0x49, 0x3,0x52,0x3c, 0x4,0x52,0x47, 0x3,0x52,0x3d, 0x3,0x52,0x3e, 0x4,0x57,0x73, 0x3,0x55,0x78, 0x5,0x5d,0x3f, 0x3,0x55,0x76, 0x5,0x5d,0x46, 0x3,0x55,0x77, 0x4,0x57,0x6e, 0x3,0x55,0x7c, 0x3,0x55,0x7b, 0x7,0x3a,0x39, 0x4,0x5c,0x62, 0x4,0x5c,0x60, 0x4,0x57,0x72, 0x3,0x58,0x57, 0x3,0x58,0x56, 0x3,0x59,0x29, 0x4,0x60,0x66, 0x4,0x60,0x63, 0x4,0x60,0x68, 0x4,0x60,0x62, 0x7,0x47,0x4a, 0x3,0x5a,0x73, 0x3,0x5a,0x71, 0x5,0x6d,0x22, 0x3,0x5c,0x69, 0x4,0x64,0x24, 0x3,0x5c,0x6a, 0x3,0x5c,0x6b, 0x3,0x5e,0x4f, 0x3,0x5e,0x4e, 0x4,0x69,0x2a, 0x7,0x58,0x58, 0x3,0x5f,0x59, 0x4,0x69,0x2b, 0x4,0x6a,0x66, 0x4,0x6b,0x79, 0x4,0x6b,0x78, 0x7,0x5f,0x33, 0x3,0x60,0x78, 0x4,0x6c,0x7c, 0x4,0x6c,0x7b, 0x4,0x6d,0x77, 0x4,0x2a,0x79, 0x4,0x2f,0x29, 0x3,0x38,0x2f, 0x3,0x38,0x32, 0x5,0x34,0x60, 0x4,0x34,0x34, 0x3,0x38,0x30, 0x4,0x34,0x33, 0x4,0x3a,0x28, 0x4,0x46,0x25, 0x3,0x48,0x76, 0x4,0x52,0x4e, 0x4,0x6a,0x6b, 0xf,0x21,0x47, 0x3,0x2a,0x4d, 0x3,0x2e,0x5c, 0x3,0x2e,0x5b, 0x3,0x2e,0x59, 0x4,0x2a,0x7b, 0x4,0x2f,0x2a, 0x6,0x3a,0x6b, 0x4,0x2f,0x2d, 0x4,0x34,0x35, 0x4,0x3f,0x75, 0x4,0x3a,0x2a, 0x3,0x43,0x6c, 0x3,0x43,0x6d, 0x5,0x41,0x65, 0x3,0x48,0x7a, 0x3,0x48,0x7b, 0x4,0x52,0x4f, 0x4,0x57,0x75, 0x4,0x5c,0x65, 0x4,0x60,0x6d, 0x4,0x66,0x7b, 0x4,0x6b,0x7b, 0x6,0x3a,0x74, 0x4,0x2f,0x2e, 0x3,0x31,0x3f, 0x4,0x34,0x38, 0x4,0x34,0x36, 0x4,0x34,0x37, 0x6,0x43,0x3c, 0x4,0x3a,0x2d, 0x4,0x3a,0x31, 0x4,0x3a,0x30, 0x4,0x3f,0x76, 0x3,0x48,0x7e, 0x4,0x46,0x27, 0x3,0x48,0x7d, 0x4,0x46,0x28, 0x3,0x48,0x7c, 0x4,0x4c,0x49, 0x4,0x52,0x53, 0x3,0x52,0x41, 0x4,0x57,0x77, 0x4,0x5c,0x6a, 0x4,0x5c,0x6b, 0x4,0x69,0x2c, 0x3,0x33,0x40, 0x3,0x33,0x41, 0x4,0x34,0x3a, 0x3,0x38,0x33, 0x4,0x34,0x3b, 0x4,0x34,0x3e, 0x4,0x34,0x3c, 0x3,0x38,0x35, 0x3,0x38,0x34, 0x4,0x3a,0x34, 0x4,0x3a,0x35, 0x5,0x3b,0x3a, 0x4,0x3a,0x33, 0x3,0x43,0x70, 0x4,0x3f,0x78, 0x3,0x43,0x71, 0x4,0x3f,0x77, 0x3,0x43,0x6f, 0x3,0x49,0x21, 0x4,0x46,0x2a, 0x4,0x46,0x29, 0x4,0x46,0x2b, 0x4,0x52,0x55, 0x4,0x52,0x56, 0x3,0x58,0x5e, 0x3,0x58,0x60, 0x3,0x58,0x5f, 0x3,0x5c,0x6e, 0x4,0x66,0x7d, 0x3,0x3e,0x39, 0x3,0x3e,0x3a, 0x4,0x2b,0x27, 0x4,0x2b,0x28, 0x4,0x2f,0x38, 0x4,0x2b,0x29, 0x3,0x38,0x38, 0x4,0x3f,0x7a, 0x4,0x46,0x2e, 0x4,0x46,0x2d, 0x4,0x46,0x2f, 0x4,0x46,0x32, 0x4,0x46,0x30, 0x4,0x4c,0x4f, 0x4,0x57,0x7d, 0x4,0x57,0x7a, 0x4,0x57,0x7b, 0x4,0x5c,0x70, 0x4,0x67,0x21, 0x4,0x24,0x6d, 0x3,0x33,0x46, 0x3,0x33,0x45, 0x3,0x38,0x3a, 0x4,0x34,0x41, 0x4,0x3a,0x39, 0x5,0x41,0x70, 0x3,0x43,0x74, 0x4,0x46,0x36, 0x4,0x46,0x34, 0x4,0x46,0x35, 0x4,0x46,0x37, 0x3,0x49,0x24, 0x3,0x4e,0x33, 0x4,0x4c,0x52, 0x4,0x52,0x5a, 0x3,0x52,0x42, 0x4,0x52,0x5b, 0x4,0x58,0x21, 0x4,0x58,0x24, 0x4,0x58,0x23, 0x4,0x58,0x22, 0x3,0x58,0x64, 0x4,0x64,0x28, 0x3,0x5f,0x5c, 0x6,0x56,0x6d, 0x4,0x23,0x2d, 0x6,0x25,0x49, 0x4,0x24,0x6f, 0x4,0x24,0x6e, 0x3,0x2a,0x51, 0x6,0x3b,0x28, 0x3,0x2a,0x55, 0x3,0x2a,0x50, 0x4,0x27,0x66, 0xf,0x28,0x52, 0x4,0x27,0x62, 0x4,0x27,0x67, 0x4,0x27,0x63, 0x4,0x27,0x65, 0x5,0x27,0x58, 0x3,0x2a,0x5a, 0x3,0x2a,0x53, 0x5,0x2b,0x33, 0x4,0x2b,0x2f, 0x4,0x2b,0x2a, 0x4,0x2b,0x2c, 0x3,0x2e,0x62, 0x3,0x2e,0x5f, 0x6,0x33,0x7d, 0x5,0x2b,0x39, 0x3,0x33,0x51, 0x4,0x2f,0x41, 0x4,0x2f,0x46, 0x4,0x2f,0x47, 0x4,0x2f,0x3f, 0x6,0x3b,0x31, 0x5,0x2f,0x6d, 0x3,0x38,0x46, 0x4,0x34,0x4c, 0x4,0x34,0x48, 0x3,0x38,0x44, 0x4,0x34,0x4b, 0x4,0x34,0x52, 0x4,0x34,0x51, 0x4,0x34,0x4a, 0x4,0x34,0x53, 0x6,0x43,0x58, 0x3,0x38,0x40, 0x3,0x38,0x3f, 0x3,0x38,0x43, 0x4,0x3a,0x49, 0x4,0x3a,0x3a, 0x3,0x3e,0x3f, 0x4,0x3a,0x45, 0x5,0x3b,0x4d, 0x4,0x3a,0x4a, 0x4,0x3a,0x41, 0x4,0x3a,0x40, 0x4,0x3a,0x42, 0x4,0x3a,0x3d, 0x3,0x3e,0x46, 0x4,0x3a,0x3f, 0x4,0x3a,0x44, 0x4,0x3a,0x4b, 0x6,0x49,0x7e, 0x6,0x4d,0x54, 0x6,0x56,0x76, 0x4,0x40,0x27, 0x3,0x43,0x78, 0x4,0x40,0x2a, 0x4,0x40,0x23, 0x4,0x40,0x26, 0x3,0x43,0x7a, 0x4,0x3f,0x7d, 0x4,0x40,0x28, 0x3,0x44,0x21, 0x4,0x40,0x2c, 0x3,0x43,0x7d, 0x3,0x43,0x79, 0x5,0x34,0x6a, 0x4,0x40,0x25, 0x4,0x46,0x45, 0x4,0x46,0x3e, 0x4,0x46,0x3c, 0x4,0x46,0x3d, 0x4,0x46,0x3f, 0x3,0x52,0x48, 0x4,0x46,0x42, 0x4,0x46,0x40, 0x4,0x46,0x3b, 0x3,0x49,0x29, 0x3,0x49,0x28, 0x4,0x46,0x38, 0x4,0x46,0x47, 0x4,0x46,0x41, 0x4,0x4c,0x5d, 0x4,0x4c,0x58, 0x4,0x4c,0x5e, 0x4,0x4c,0x55, 0x4,0x4c,0x5c, 0x6,0x60,0x6f, 0x4,0x4c,0x54, 0x4,0x4c,0x5b, 0x4,0x4c,0x5f, 0x5,0x42,0x28, 0x4,0x52,0x63, 0x4,0x52,0x64, 0x3,0x52,0x46, 0x3,0x52,0x45, 0x4,0x52,0x5e, 0x4,0x52,0x61, 0x4,0x52,0x62, 0x4,0x52,0x66, 0xf,0x51,0x55, 0x5,0x5d,0x5b, 0x4,0x58,0x2b, 0x4,0x58,0x28, 0x4,0x58,0x2c, 0x4,0x5c,0x74, 0x3,0x58,0x66, 0x4,0x5c,0x76, 0x3,0x58,0x67, 0x3,0x5a,0x76, 0x4,0x60,0x74, 0x4,0x60,0x73, 0x5,0x6d,0x2c, 0x4,0x64,0x2a, 0x4,0x67,0x22, 0x4,0x67,0x24, 0x4,0x67,0x23, 0x4,0x67,0x25, 0x4,0x69,0x30, 0x6,0x43,0x64, 0x7,0x42,0x24, 0x3,0x2b,0x44, 0x3,0x44,0x24, 0x4,0x2f,0x4a, 0x4,0x34,0x58, 0x4,0x4c,0x63, 0x4,0x52,0x6b, 0x3,0x33,0x53, 0x3,0x33,0x54, 0x3,0x38,0x4a, 0x4,0x4c,0x64, 0x6,0x61,0x21, 0x3,0x52,0x4b, 0x3,0x5e,0x54, 0x4,0x27,0x6f, 0x4,0x2b,0x33, 0x4,0x2b,0x32, 0x3,0x2e,0x67, 0x3,0x33,0x56, 0x4,0x2f,0x50, 0x3,0x38,0x4b, 0x6,0x43,0x71, 0x6,0x43,0x70, 0x3,0x3e,0x4a, 0x4,0x3a,0x4e, 0x4,0x3a,0x4f, 0x6,0x4d,0x63, 0x5,0x42,0x2d, 0x4,0x40,0x2f, 0x4,0x46,0x4f, 0x4,0x46,0x51, 0x4,0x46,0x50, 0x3,0x49,0x2c, 0x6,0x61,0x24, 0x5,0x49,0x2c, 0x3,0x4e,0x3e, 0x4,0x4c,0x68, 0x4,0x4c,0x65, 0x4,0x52,0x6c, 0x4,0x52,0x6d, 0x4,0x58,0x30, 0x4,0x58,0x34, 0x4,0x58,0x33, 0x3,0x56,0x25, 0x3,0x56,0x26, 0x5,0x5d,0x67, 0x5,0x5c,0x4d, 0x4,0x58,0x32, 0x4,0x5c,0x7c, 0x4,0x64,0x2d, 0x4,0x2f,0x53, 0x4,0x34,0x5c, 0x4,0x52,0x6f, 0x4,0x52,0x6e, 0x4,0x58,0x35, 0x4,0x5c,0x7d, 0x4,0x69,0x33, 0x6,0x25,0x4f, 0x3,0x24,0x37, 0x3,0x24,0x39, 0x3,0x27,0x27, 0x4,0x24,0x76, 0x4,0x24,0x7d, 0x3,0x27,0x2c, 0x3,0x2a,0x63, 0x3,0x2a,0x67, 0x3,0x2a,0x64, 0x3,0x2a,0x6a, 0x4,0x27,0x72, 0x3,0x2a,0x62, 0x4,0x28,0x21, 0x4,0x27,0x73, 0x3,0x2a,0x65, 0x3,0x2a,0x69, 0x5,0x27,0x63, 0x3,0x2a,0x61, 0x3,0x2e,0x6d, 0x4,0x2b,0x36, 0x3,0x2e,0x70, 0x3,0x2e,0x71, 0x3,0x2e,0x6c, 0x3,0x2e,0x73, 0x3,0x2e,0x75, 0x6,0x34,0x3a, 0x4,0x2f,0x55, 0x3,0x33,0x61, 0x4,0x2f,0x61, 0x3,0x33,0x64, 0x3,0x33,0x5b, 0x3,0x33,0x5e, 0x6,0x3b,0x56, 0x3,0x33,0x5d, 0x4,0x2f,0x5e, 0x3,0x33,0x5c, 0x3,0x33,0x65, 0x5,0x30,0x21, 0x4,0x2f,0x59, 0x4,0x2f,0x64, 0x3,0x33,0x60, 0x4,0x34,0x5e, 0x4,0x34,0x6c, 0x4,0x34,0x71, 0x3,0x38,0x5a, 0x4,0x34,0x69, 0x4,0x34,0x65, 0x3,0x38,0x56, 0x4,0x34,0x66, 0x4,0x34,0x62, 0x4,0x34,0x5d, 0x4,0x34,0x63, 0x6,0x44,0x2c, 0x3,0x38,0x4c, 0x6,0x44,0x28, 0x5,0x35,0x2a, 0x3,0x38,0x59, 0x3,0x38,0x5c, 0x5,0x35,0x24, 0x4,0x3a,0x6c, 0x4,0x3a,0x60, 0x4,0x3a,0x5f, 0x4,0x3a,0x64, 0x4,0x3a,0x59, 0x5,0x3b,0x56, 0x4,0x3a,0x5b, 0x4,0x3a,0x56, 0x3,0x3e,0x53, 0x4,0x3a,0x5e, 0x3,0x3e,0x54, 0x3,0x3e,0x51, 0x4,0x3a,0x5c, 0x4,0x3a,0x61, 0x3,0x3e,0x55, 0x6,0x4e,0x27, 0x3,0x3e,0x4c, 0xf,0x3e,0x6b, 0x4,0x40,0x30, 0x4,0x40,0x32, 0x4,0x3a,0x65, 0x3,0x44,0x37, 0x4,0x46,0x69, 0x4,0x40,0x47, 0x4,0x40,0x49, 0x4,0x40,0x3a, 0x3,0x44,0x2b, 0x3,0x44,0x29, 0x3,0x44,0x34, 0x4,0x40,0x48, 0x3,0x44,0x3d, 0x4,0x40,0x4c, 0x4,0x46,0x65, 0x3,0x49,0x2f, 0x4,0x46,0x57, 0x6,0x61,0x44, 0x4,0x46,0x64, 0x3,0x49,0x31, 0x4,0x46,0x53, 0x5,0x49,0x3c, 0x4,0x46,0x61, 0x3,0x49,0x30, 0x4,0x46,0x6d, 0x4,0x46,0x60, 0x4,0x46,0x5c, 0x3,0x49,0x34, 0x5,0x49,0x3b, 0x6,0x61,0x58, 0x3,0x49,0x37, 0x3,0x49,0x40, 0x3,0x4e,0x43, 0x4,0x4c,0x72, 0x3,0x4e,0x3f, 0x4,0x4c,0x70, 0x4,0x4d,0x24, 0x4,0x4c,0x6b, 0x3,0x4e,0x41, 0x4,0x4c,0x71, 0x3,0x4e,0x53, 0x4,0x4c,0x6d, 0x4,0x4c,0x73, 0x3,0x4e,0x47, 0x3,0x4e,0x45, 0x3,0x4e,0x56, 0x4,0x4c,0x7d, 0x3,0x52,0x51, 0x4,0x4c,0x6c, 0x3,0x4e,0x4a, 0x4,0x4c,0x6e, 0x3,0x4e,0x48, 0x3,0x4e,0x55, 0x3,0x4e,0x49, 0x5,0x50,0x46, 0x3,0x4e,0x50, 0xf,0x51,0x65, 0xf,0x51,0x73, 0xf,0x51,0x76, 0x4,0x4d,0x21, 0x4,0x4c,0x6f, 0x3,0x4e,0x51, 0x4,0x4c,0x77, 0x4,0x52,0x77, 0x4,0x52,0x7b, 0x4,0x52,0x79, 0x4,0x53,0x2c, 0x4,0x53,0x21, 0x4,0x52,0x76, 0x3,0x52,0x53, 0x4,0x53,0x25, 0x3,0x52,0x57, 0x4,0x52,0x7e, 0x3,0x52,0x4d, 0x4,0x53,0x23, 0x4,0x52,0x7a, 0x4,0x52,0x7c, 0x4,0x52,0x72, 0x5,0x64,0x2d, 0x3,0x52,0x4c, 0x4,0x53,0x22, 0x4,0x52,0x73, 0x3,0x52,0x4e, 0x4,0x53,0x27, 0x4,0x53,0x31, 0x4,0x46,0x67, 0x4,0x58,0x44, 0x4,0x58,0x3c, 0x4,0x58,0x38, 0x4,0x58,0x42, 0x5,0x5d,0x79, 0x4,0x58,0x36, 0x4,0x58,0x3b, 0x3,0x56,0x2e, 0x3,0x56,0x27, 0x4,0x58,0x3d, 0x3,0x56,0x2a, 0x3,0x56,0x2f, 0x3,0x58,0x69, 0x4,0x5c,0x7e, 0x4,0x5d,0x2b, 0x3,0x58,0x6d, 0x3,0x58,0x70, 0x3,0x58,0x6a, 0x3,0x58,0x71, 0x4,0x5d,0x23, 0x7,0x42,0x38, 0x4,0x5d,0x21, 0xf,0x60,0x4e, 0x7,0x3b,0x32, 0x4,0x60,0x77, 0x3,0x5c,0x73, 0x3,0x5b,0x23, 0x4,0x60,0x78, 0x3,0x5b,0x21, 0x3,0x5b,0x24, 0x7,0x49,0x53, 0x4,0x64,0x2f, 0x4,0x64,0x34, 0x3,0x5c,0x7d, 0x4,0x64,0x33, 0x3,0x5c,0x74, 0x7,0x54,0x68, 0x3,0x5c,0x79, 0x4,0x64,0x32, 0x4,0x64,0x38, 0x3,0x5c,0x7a, 0x4,0x64,0x30, 0x3,0x5c,0x75, 0x4,0x64,0x36, 0x4,0x67,0x27, 0x3,0x5e,0x59, 0x4,0x67,0x28, 0xf,0x68,0x39, 0x3,0x5f,0x5d, 0x4,0x69,0x37, 0x7,0x58,0x72, 0x3,0x60,0x41, 0x3,0x60,0x42, 0x5,0x78,0x25, 0x4,0x6b,0x7d, 0x4,0x6d,0x5e, 0x4,0x6c,0x7d, 0x3,0x61,0x6a, 0x4,0x6d,0x79, 0x4,0x6d,0x7b, 0xf,0x6c,0x6c, 0x4,0x6e,0x37, 0x4,0x6e,0x36, 0x5,0x7c,0x3e, 0x3,0x2a,0x6d, 0x4,0x2b,0x3e, 0x4,0x2f,0x67, 0x3,0x33,0x67, 0x3,0x33,0x66, 0x3,0x33,0x68, 0x5,0x35,0x35, 0x3,0x38,0x62, 0x5,0x3b,0x70, 0x3,0x3e,0x60, 0x3,0x44,0x41, 0x5,0x42,0x54, 0x5,0x42,0x53, 0x3,0x44,0x42, 0x3,0x44,0x43, 0x4,0x4d,0x26, 0x4,0x53,0x36, 0x4,0x5d,0x32, 0x5,0x64,0x3b, 0x5,0x64,0x3a, 0x4,0x64,0x3a, 0x3,0x27,0x2e, 0x3,0x2e,0x7d, 0x3,0x2f,0x21, 0x3,0x2f,0x22, 0x4,0x2f,0x69, 0x4,0x2f,0x6b, 0x6,0x3b,0x69, 0x3,0x38,0x68, 0x3,0x38,0x67, 0x4,0x34,0x7c, 0x3,0x38,0x65, 0x4,0x34,0x7b, 0x4,0x34,0x79, 0x5,0x3c,0x26, 0x6,0x44,0x48, 0x4,0x3a,0x72, 0x3,0x3e,0x67, 0x4,0x3a,0x74, 0x3,0x3e,0x65, 0x5,0x3b,0x74, 0x4,0x3a,0x70, 0x4,0x3a,0x6d, 0x3,0x3e,0x64, 0x3,0x3e,0x66, 0x4,0x40,0x56, 0x4,0x40,0x57, 0x3,0x44,0x4b, 0x3,0x44,0x47, 0x4,0x40,0x5b, 0x4,0x3a,0x6e, 0x4,0x40,0x5d, 0x3,0x44,0x4a, 0x4,0x46,0x78, 0x3,0x49,0x46, 0x4,0x46,0x72, 0x4,0x46,0x73, 0x4,0x46,0x71, 0x4,0x46,0x75, 0x3,0x49,0x47, 0x4,0x46,0x70, 0x4,0x46,0x76, 0x6,0x61,0x69, 0x3,0x49,0x48, 0x4,0x46,0x7b, 0x3,0x4e,0x5a, 0x3,0x4e,0x5c, 0x7,0x28,0x42, 0x3,0x4e,0x57, 0x3,0x4e,0x58, 0x4,0x4d,0x30, 0x3,0x4e,0x5b, 0x4,0x46,0x79, 0x4,0x4d,0x36, 0x4,0x4d,0x2f, 0x3,0x49,0x4d, 0x4,0x53,0x3e, 0x3,0x52,0x5c, 0x7,0x32,0x73, 0x4,0x53,0x3d, 0x4,0x58,0x4d, 0x3,0x52,0x60, 0x7,0x32,0x75, 0x3,0x52,0x61, 0x5,0x5e,0x32, 0x4,0x58,0x57, 0x4,0x58,0x52, 0x3,0x56,0x37, 0x4,0x58,0x58, 0x4,0x58,0x4f, 0x4,0x58,0x56, 0x3,0x56,0x38, 0x4,0x58,0x4e, 0x3,0x56,0x32, 0x4,0x58,0x54, 0x4,0x58,0x5f, 0x3,0x56,0x35, 0x3,0x56,0x3c, 0x3,0x56,0x31, 0x4,0x5d,0x3b, 0x5,0x5e,0x35, 0x4,0x5d,0x39, 0x3,0x58,0x72, 0x4,0x61,0x24, 0x5,0x69,0x41, 0x3,0x5b,0x2a, 0x4,0x61,0x21, 0x4,0x61,0x25, 0xf,0x63,0x6e, 0x5,0x6d,0x4b, 0x4,0x64,0x3b, 0x4,0x64,0x3c, 0x4,0x64,0x40, 0x4,0x64,0x3e, 0x4,0x64,0x41, 0x3,0x5d,0x26, 0x3,0x5e,0x5e, 0x4,0x67,0x30, 0x4,0x64,0x3d, 0x4,0x69,0x3e, 0x3,0x5f,0x5e, 0x3,0x5f,0x60, 0x3,0x60,0x44, 0x7,0x59,0x25, 0x7,0x5c,0x5e, 0x4,0x6a,0x78, 0x7,0x5c,0x63, 0x3,0x61,0x48, 0x4,0x6e,0x39, 0x3,0x2f,0x25, 0x6,0x3b,0x73, 0x3,0x38,0x69, 0x3,0x44,0x4c, 0x4,0x47,0x23, 0x4,0x4d,0x37, 0x4,0x2f,0x6f, 0x4,0x3a,0x78, 0x3,0x4e,0x5e, 0x4,0x53,0x4a, 0x3,0x5b,0x2e, 0x3,0x2a,0x6e, 0x3,0x2f,0x28, 0x4,0x2b,0x46, 0x5,0x30,0x3d, 0x4,0x2f,0x72, 0x5,0x30,0x39, 0x4,0x35,0x2a, 0x4,0x3a,0x7a, 0x4,0x35,0x2d, 0x4,0x35,0x2e, 0x4,0x35,0x2c, 0xf,0x32,0x51, 0x4,0x3a,0x79, 0x3,0x3e,0x71, 0x4,0x35,0x30, 0x3,0x3e,0x6e, 0x3,0x3e,0x6c, 0x3,0x3e,0x6b, 0x3,0x2f,0x4a, 0x4,0x40,0x62, 0x4,0x47,0x25, 0x6,0x58,0x2b, 0x3,0x49,0x53, 0x4,0x47,0x2d, 0x5,0x49,0x6c, 0x5,0x49,0x6d, 0x4,0x40,0x66, 0x4,0x47,0x31, 0x4,0x47,0x27, 0x3,0x49,0x55, 0x4,0x40,0x60, 0x4,0x47,0x2a, 0x4,0x47,0x2e, 0x4,0x47,0x26, 0x4,0x47,0x2b, 0x3,0x49,0x5a, 0x3,0x49,0x50, 0x3,0x49,0x5b, 0x4,0x4d,0x3c, 0x4,0x4d,0x3f, 0x4,0x4d,0x3a, 0x4,0x4d,0x39, 0x4,0x4d,0x42, 0x4,0x4d,0x40, 0x4,0x4d,0x47, 0x4,0x53,0x52, 0x4,0x53,0x55, 0x4,0x53,0x56, 0x3,0x4e,0x63, 0x4,0x53,0x4f, 0x4,0x58,0x63, 0x4,0x58,0x67, 0x3,0x56,0x45, 0x3,0x56,0x43, 0x4,0x58,0x64, 0x3,0x56,0x3e, 0x7,0x3b,0x59, 0x3,0x56,0x44, 0x4,0x58,0x65, 0x3,0x56,0x41, 0x5,0x64,0x56, 0x4,0x5d,0x4a, 0x4,0x5d,0x48, 0x4,0x5d,0x49, 0x4,0x5d,0x44, 0x4,0x5d,0x46, 0x4,0x61,0x2a, 0x7,0x43,0x22, 0x4,0x64,0x43, 0x7,0x50,0x25, 0x3,0x5d,0x27, 0x4,0x64,0x44, 0x3,0x5e,0x5f, 0x4,0x6a,0x7b, 0x7,0x59,0x32, 0x3,0x60,0x7a, 0x4,0x6c,0x26, 0x3,0x60,0x79, 0x4,0x6d,0x7d, 0x5,0x2b,0x47, 0x4,0x2f,0x73, 0x4,0x35,0x31, 0x4,0x3b,0x21, 0x3,0x33,0x79, 0x3,0x33,0x78, 0x4,0x35,0x33, 0x4,0x35,0x35, 0x4,0x3b,0x23, 0x5,0x3c,0x35, 0x4,0x3b,0x22, 0x3,0x3e,0x73, 0x3,0x44,0x50, 0x3,0x44,0x51, 0x4,0x47,0x36, 0x4,0x47,0x38, 0x4,0x4d,0x4a, 0x4,0x4d,0x48, 0x4,0x53,0x5a, 0x4,0x53,0x5b, 0x5,0x58,0x32, 0x4,0x53,0x5c, 0x5,0x5e,0x43, 0x4,0x58,0x68, 0x4,0x58,0x69, 0x4,0x5d,0x4e, 0x4,0x5d,0x50, 0x4,0x61,0x2d, 0x4,0x61,0x2e, 0x3,0x5b,0x30, 0x4,0x61,0x2c, 0x4,0x61,0x30, 0x3,0x5e,0x60, 0x3,0x62,0x3c, 0x4,0x35,0x3a, 0x3,0x44,0x53, 0x4,0x40,0x67, 0x3,0x44,0x52, 0x4,0x47,0x3a, 0x4,0x4d,0x51, 0x4,0x4d,0x4c, 0x4,0x4d,0x4e, 0x4,0x4d,0x53, 0x4,0x4d,0x4f, 0x4,0x53,0x64, 0x4,0x53,0x61, 0x4,0x53,0x62, 0x4,0x58,0x6b, 0x4,0x58,0x6a, 0x5,0x64,0x63, 0x4,0x61,0x31, 0x4,0x61,0x34, 0x4,0x64,0x46, 0x4,0x64,0x47, 0x4,0x6d,0x22, 0x3,0x2f,0x2b, 0x5,0x2b,0x49, 0x3,0x2f,0x2d, 0x4,0x2f,0x7e, 0x3,0x33,0x7d, 0x4,0x35,0x41, 0x3,0x38,0x7c, 0x3,0x38,0x78, 0x5,0x35,0x57, 0x4,0x35,0x44, 0x5,0x35,0x5e, 0x3,0x39,0x24, 0x3,0x39,0x28, 0x3,0x39,0x21, 0x4,0x35,0x3f, 0x3,0x38,0x7d, 0x3,0x39,0x27, 0x4,0x35,0x43, 0x5,0x35,0x5d, 0x6,0x44,0x6d, 0x3,0x39,0x26, 0x5,0x35,0x56, 0x4,0x3b,0x33, 0x3,0x3e,0x79, 0x3,0x3e,0x7a, 0x4,0x3b,0x36, 0x4,0x3b,0x35, 0x3,0x3e,0x76, 0x3,0x3e,0x7b, 0x3,0x3e,0x77, 0x4,0x3b,0x34, 0x4,0x3b,0x2a, 0x4,0x3b,0x29, 0x4,0x3b,0x2b, 0x3,0x3f,0x26, 0x6,0x4e,0x6b, 0x3,0x3f,0x25, 0x3,0x44,0x57, 0x6,0x58,0x41, 0x3,0x44,0x5e, 0x4,0x40,0x6e, 0x4,0x40,0x6d, 0x4,0x40,0x6c, 0x3,0x44,0x5a, 0x3,0x44,0x5f, 0x3,0x44,0x62, 0x4,0x47,0x3d, 0x4,0x47,0x40, 0x4,0x47,0x4a, 0x4,0x47,0x3c, 0x3,0x49,0x6a, 0x4,0x47,0x46, 0x4,0x47,0x42, 0x3,0x49,0x61, 0x4,0x47,0x43, 0x3,0x49,0x69, 0x3,0x49,0x67, 0x3,0x49,0x5d, 0x4,0x4d,0x59, 0x4,0x4d,0x56, 0x4,0x4d,0x5c, 0x4,0x4d,0x5e, 0x3,0x4e,0x68, 0x4,0x4d,0x61, 0x4,0x4d,0x58, 0x4,0x4d,0x5b, 0x3,0x4e,0x6d, 0x4,0x4d,0x5f, 0x4,0x4d,0x5a, 0x3,0x4e,0x6b, 0x4,0x4d,0x60, 0x7,0x28,0x79, 0x4,0x4d,0x55, 0x3,0x4e,0x71, 0x4,0x53,0x6a, 0x3,0x52,0x6c, 0x3,0x52,0x6d, 0x7,0x33,0x4d, 0x4,0x53,0x6b, 0x3,0x56,0x47, 0x4,0x58,0x70, 0x3,0x56,0x4b, 0x3,0x56,0x4c, 0x5,0x5e,0x55, 0x4,0x5d,0x5a, 0x7,0x4a,0x25, 0x4,0x5d,0x57, 0x4,0x5d,0x5b, 0x3,0x59,0x22, 0x3,0x59,0x25, 0x4,0x5d,0x54, 0x3,0x59,0x27, 0x4,0x61,0x40, 0x5,0x69,0x52, 0x3,0x5b,0x33, 0x4,0x61,0x3b, 0x4,0x61,0x3d, 0x4,0x61,0x45, 0x5,0x69,0x51, 0x4,0x64,0x4e, 0x3,0x5d,0x2d, 0x7,0x50,0x31, 0x4,0x64,0x4c, 0x3,0x5d,0x2f, 0x4,0x64,0x48, 0x3,0x5d,0x31, 0x4,0x67,0x3d, 0x4,0x67,0x3f, 0x7,0x55,0x32, 0x4,0x67,0x3e, 0x4,0x67,0x40, 0x4,0x67,0x39, 0x7,0x59,0x38, 0x3,0x5f,0x63, 0x4,0x69,0x48, 0x5,0x76,0x4c, 0x4,0x2b,0x49, 0x4,0x30,0x23, 0x6,0x4e,0x7a, 0x3,0x3f,0x27, 0x4,0x47,0x4c, 0x3,0x4e,0x77, 0x4,0x58,0x75, 0x4,0x5d,0x61, 0x4,0x69,0x4c, 0x4,0x35,0x4a, 0x3,0x3f,0x28, 0x4,0x40,0x74, 0x4,0x47,0x4e, 0x4,0x47,0x4f, 0x3,0x49,0x6c, 0x4,0x4d,0x64, 0x3,0x52,0x70, 0x4,0x53,0x73, 0x3,0x52,0x6f, 0x4,0x53,0x72, 0x3,0x52,0x71, 0x4,0x58,0x76, 0x4,0x58,0x77, 0x3,0x56,0x4e, 0x4,0x67,0x44, 0x4,0x6d,0x24, 0x4,0x30,0x25, 0x4,0x35,0x4b, 0x6,0x45,0x22, 0x4,0x35,0x4c, 0xf,0x44,0x74, 0x4,0x4d,0x67, 0x4,0x4d,0x65, 0x4,0x4d,0x68, 0x4,0x53,0x75, 0x4,0x53,0x77, 0x4,0x5d,0x64, 0x4,0x61,0x48, 0x4,0x61,0x46, 0x4,0x67,0x45, 0x3,0x5f,0x65, 0x3,0x61,0x4c, 0x4,0x6d,0x25, 0x4,0x35,0x50, 0x6,0x45,0x24, 0x3,0x39,0x2f, 0x4,0x3b,0x3e, 0x3,0x49,0x6e, 0x3,0x4e,0x79, 0x3,0x4e,0x78, 0x3,0x52,0x72, 0x3,0x56,0x50, 0x3,0x59,0x2c, 0x3,0x59,0x2d, 0x4,0x61,0x4a, 0x7,0x4a,0x41, 0x3,0x5b,0x37, 0x4,0x5d,0x68, 0x4,0x35,0x51, 0x4,0x35,0x54, 0x5,0x3c,0x4c, 0x4,0x3b,0x3f, 0x4,0x3b,0x41, 0x3,0x3f,0x2e, 0x4,0x3b,0x42, 0x6,0x4f,0x29, 0x4,0x3b,0x43, 0x4,0x41,0x21, 0x3,0x44,0x66, 0x3,0x44,0x68, 0x5,0x4a,0x29, 0x6,0x62,0x6a, 0x3,0x49,0x6f, 0x3,0x4e,0x7b, 0x3,0x4e,0x7c, 0x4,0x4d,0x6e, 0x4,0x4d,0x6c, 0x7,0x29,0x36, 0x4,0x4d,0x6d, 0x5,0x51,0x39, 0x3,0x4f,0x21, 0x3,0x52,0x74, 0x4,0x53,0x7d, 0x4,0x53,0x79, 0x4,0x53,0x7b, 0x4,0x53,0x7a, 0x3,0x52,0x76, 0x7,0x3c,0x33, 0x4,0x58,0x7a, 0xf,0x60,0x7a, 0x4,0x53,0x7e, 0x3,0x5d,0x35, 0x3,0x5e,0x64, 0x4,0x6b,0x21, 0x5,0x30,0x4b, 0x5,0x43,0x34, 0x4,0x47,0x59, 0x4,0x47,0x58, 0x4,0x67,0x48, 0x5,0x30,0x4c, 0x4,0x30,0x27, 0x4,0x30,0x28, 0x4,0x35,0x55, 0x4,0x35,0x56, 0x3,0x39,0x34, 0x3,0x39,0x36, 0x3,0x3f,0x31, 0x4,0x3b,0x45, 0x3,0x3f,0x36, 0x3,0x3f,0x32, 0x5,0x3c,0x52, 0x3,0x3f,0x35, 0x4,0x3b,0x48, 0x4,0x3b,0x47, 0x4,0x41,0x26, 0x4,0x41,0x27, 0x5,0x43,0x3c, 0x3,0x44,0x6a, 0x4,0x41,0x28, 0x5,0x43,0x38, 0x4,0x47,0x5a, 0x6,0x62,0x75, 0x4,0x47,0x5b, 0x3,0x49,0x76, 0x5,0x4a,0x34, 0x3,0x49,0x77, 0x5,0x4a,0x32, 0x3,0x4f,0x27, 0x4,0x4d,0x73, 0x4,0x4d,0x71, 0x3,0x4f,0x24, 0x4,0x4d,0x74, 0x7,0x29,0x3d, 0x4,0x54,0x26, 0x5,0x58,0x5c, 0x5,0x58,0x55, 0x3,0x52,0x78, 0x4,0x58,0x7d, 0x4,0x59,0x25, 0x4,0x58,0x7c, 0x5,0x5e,0x6d, 0x4,0x5d,0x6d, 0x3,0x59,0x2f, 0x4,0x5d,0x6c, 0x4,0x5d,0x6a, 0x4,0x5d,0x6e, 0x3,0x59,0x30, 0x4,0x61,0x4d, 0x3,0x5d,0x36, 0x4,0x64,0x55, 0x4,0x64,0x53, 0x4,0x64,0x56, 0x4,0x67,0x4a, 0x4,0x69,0x4e, 0x3,0x5f,0x66, 0x4,0x69,0x4f, 0x4,0x6b,0x23, 0x4,0x6c,0x28, 0x4,0x6d,0x27, 0x4,0x2b,0x4c, 0x3,0x2f,0x2f, 0x4,0x30,0x2a, 0x3,0x33,0x7e, 0x4,0x35,0x5e, 0x4,0x35,0x59, 0x5,0x35,0x72, 0x3,0x39,0x3b, 0x4,0x35,0x5b, 0x4,0x35,0x5c, 0x4,0x35,0x5d, 0x3,0x39,0x3c, 0x5,0x3c,0x63, 0x4,0x3b,0x4c, 0x4,0x3b,0x50, 0x3,0x3f,0x3d, 0x4,0x3b,0x4d, 0x4,0x3b,0x49, 0x6,0x4f,0x36, 0x6,0x4f,0x3c, 0x5,0x3c,0x5c, 0x4,0x3b,0x4a, 0x4,0x3b,0x4b, 0x4,0x3b,0x4f, 0x3,0x3f,0x3c, 0x5,0x3c,0x5f, 0x4,0x3b,0x51, 0x4,0x41,0x29, 0x5,0x43,0x4b, 0x3,0x44,0x6c, 0x3,0x44,0x6e, 0xf,0x45,0x58, 0x5,0x4a,0x3e, 0x4,0x47,0x5e, 0x4,0x47,0x61, 0x4,0x47,0x5f, 0x4,0x47,0x62, 0x4,0x47,0x65, 0x3,0x49,0x78, 0x4,0x47,0x64, 0x3,0x4f,0x28, 0x3,0x44,0x6f, 0x4,0x4d,0x77, 0x4,0x4e,0x22, 0x3,0x4f,0x2a, 0x7,0x29,0x4e, 0x3,0x4f,0x2e, 0x3,0x4f,0x29, 0x4,0x4d,0x7e, 0x4,0x4e,0x21, 0x4,0x4d,0x7d, 0x4,0x4d,0x79, 0x4,0x4d,0x78, 0x4,0x4d,0x76, 0x3,0x4f,0x2d, 0x4,0x4e,0x23, 0x4,0x54,0x2e, 0x3,0x52,0x7d, 0x3,0x52,0x7a, 0x4,0x54,0x2f, 0x4,0x54,0x2d, 0x5,0x58,0x62, 0x4,0x54,0x30, 0x3,0x52,0x79, 0x5,0x5e,0x7b, 0x4,0x59,0x2b, 0x4,0x59,0x2c, 0x4,0x59,0x26, 0xf,0x5c,0x78, 0x4,0x59,0x2a, 0x4,0x59,0x28, 0x3,0x56,0x53, 0x3,0x59,0x33, 0x4,0x5d,0x74, 0x4,0x5d,0x78, 0x4,0x5d,0x72, 0x4,0x5d,0x75, 0x7,0x4a,0x57, 0x4,0x61,0x50, 0x3,0x59,0x34, 0x4,0x61,0x51, 0x4,0x5d,0x77, 0x4,0x64,0x5b, 0x4,0x64,0x5a, 0x4,0x67,0x50, 0x4,0x67,0x4c, 0x5,0x74,0x4b, 0x4,0x6b,0x24, 0x7,0x5c,0x77, 0x4,0x6c,0x29, 0x3,0x61,0x4f, 0x3,0x62,0x2e, 0x3,0x3f,0x42, 0x5,0x3c,0x67, 0x4,0x3b,0x52, 0x4,0x3b,0x53, 0x3,0x3f,0x41, 0x3,0x44,0x71, 0x3,0x44,0x70, 0x3,0x44,0x72, 0x4,0x4e,0x26, 0x4,0x54,0x32, 0x4,0x59,0x30, 0x3,0x56,0x56, 0x3,0x5b,0x3e, 0x4,0x64,0x5f, 0x3,0x60,0x4c, 0x4,0x2b,0x4d, 0x4,0x2b,0x4e, 0xf,0x2d,0x53, 0x3,0x34,0x22, 0x3,0x39,0x43, 0x3,0x39,0x44, 0x3,0x39,0x48, 0x4,0x35,0x61, 0x4,0x35,0x62, 0x3,0x39,0x45, 0x3,0x39,0x46, 0x3,0x39,0x42, 0x6,0x45,0x45, 0x3,0x3f,0x48, 0x3,0x3f,0x43, 0x4,0x3b,0x54, 0x3,0x3f,0x4a, 0x3,0x44,0x75, 0x4,0x41,0x2a, 0x3,0x44,0x74, 0x6,0x59,0x24, 0x4,0x41,0x2c, 0x4,0x47,0x66, 0x4,0x47,0x69, 0x4,0x47,0x67, 0x3,0x49,0x7e, 0x4,0x4e,0x28, 0x4,0x4e,0x27, 0x4,0x4e,0x2a, 0x4,0x4e,0x29, 0x3,0x53,0x23, 0x5,0x58,0x72, 0x4,0x54,0x33, 0x4,0x54,0x34, 0x5,0x51,0x61, 0x3,0x56,0x58, 0x4,0x59,0x32, 0x4,0x59,0x35, 0x4,0x59,0x37, 0x3,0x56,0x57, 0x4,0x59,0x31, 0x4,0x5d,0x7c, 0x4,0x5d,0x7b, 0x4,0x5d,0x7a, 0x5,0x65,0x35, 0x4,0x5d,0x7d, 0x4,0x5d,0x7e, 0x4,0x61,0x59, 0x4,0x61,0x58, 0x4,0x61,0x57, 0x4,0x64,0x60, 0x4,0x64,0x61, 0x4,0x67,0x52, 0xf,0x68,0x53, 0x3,0x5f,0x68, 0x3,0x5f,0x67, 0x3,0x60,0x7d, 0x4,0x6d,0x61, 0x4,0x6e,0x21, 0x3,0x62,0x3d, 0x4,0x4e,0x2e, 0x3,0x5d,0x39, 0x4,0x47,0x6b, 0xf,0x4c,0x67, 0x3,0x4f,0x38, 0x4,0x64,0x63, 0x7,0x50,0x56, 0x3,0x27,0x32, 0x4,0x25,0x22, 0xf,0x28,0x72, 0x3,0x2a,0x6f, 0x5,0x27,0x69, 0x4,0x2b,0x53, 0x4,0x2b,0x50, 0x3,0x34,0x23, 0x4,0x30,0x2d, 0x4,0x30,0x30, 0x3,0x34,0x24, 0x4,0x30,0x2e, 0x3,0x39,0x49, 0x4,0x35,0x69, 0x3,0x39,0x4d, 0x3,0x3f,0x53, 0x4,0x3b,0x57, 0x3,0x3f,0x4e, 0x6,0x4f,0x48, 0x3,0x3f,0x52, 0x4,0x41,0x2f, 0x3,0x4a,0x25, 0x4,0x47,0x6c, 0x3,0x4a,0x23, 0x3,0x4f,0x3a, 0x4,0x4e,0x31, 0x4,0x4e,0x35, 0x3,0x4f,0x3d, 0x3,0x53,0x2a, 0x3,0x53,0x28, 0x3,0x53,0x29, 0x4,0x59,0x38, 0x4,0x59,0x39, 0x7,0x43,0x77, 0x3,0x59,0x39, 0x4,0x61,0x5e, 0x4,0x6c,0x2c, 0x3,0x22,0x5f, 0x4,0x23,0x32, 0x3,0x27,0x36, 0x3,0x27,0x37, 0x3,0x27,0x38, 0x3,0x2a,0x76, 0x4,0x28,0x29, 0x3,0x2f,0x36, 0x4,0x2b,0x56, 0x3,0x45,0x22, 0x3,0x2f,0x3d, 0x4,0x2b,0x54, 0x4,0x2b,0x58, 0x3,0x2f,0x39, 0x3,0x2f,0x3a, 0x6,0x34,0x6d, 0x4,0x30,0x38, 0x4,0x30,0x34, 0x3,0x34,0x28, 0x4,0x30,0x33, 0x4,0x47,0x71, 0x4,0x35,0x6c, 0x4,0x35,0x6e, 0x4,0x35,0x73, 0x4,0x35,0x6b, 0x3,0x39,0x50, 0x4,0x35,0x70, 0x4,0x3b,0x5e, 0x3,0x3f,0x58, 0x4,0x41,0x34, 0x4,0x41,0x36, 0x3,0x45,0x21, 0x4,0x59,0x3c, 0x4,0x41,0x38, 0x4,0x47,0x6d, 0x4,0x47,0x6e, 0x3,0x4a,0x29, 0x3,0x4a,0x28, 0x5,0x4a,0x60, 0x4,0x47,0x70, 0x3,0x4f,0x3e, 0x4,0x4e,0x3d, 0x4,0x4e,0x3c, 0x5,0x58,0x7e, 0x5,0x5f,0x3c, 0x3,0x60,0x4d, 0x4,0x6b,0x26, 0x3,0x2f,0x3f, 0x3,0x34,0x2b, 0x3,0x34,0x2c, 0x4,0x35,0x78, 0x4,0x35,0x74, 0x3,0x39,0x53, 0x5,0x36,0x36, 0x4,0x35,0x75, 0x4,0x3b,0x60, 0x3,0x3f,0x5a, 0x3,0x3f,0x5b, 0x3,0x3f,0x5c, 0x4,0x3b,0x64, 0x6,0x59,0x4c, 0x3,0x45,0x26, 0x4,0x41,0x3d, 0x4,0x41,0x3c, 0x4,0x41,0x3f, 0x4,0x41,0x3e, 0x4,0x47,0x73, 0x4,0x47,0x74, 0x4,0x4e,0x3f, 0x4,0x4e,0x41, 0x4,0x4e,0x3e, 0x4,0x4e,0x40, 0x4,0x54,0x3d, 0x4,0x54,0x3c, 0x4,0x54,0x3a, 0x3,0x53,0x2e, 0x4,0x54,0x40, 0x4,0x54,0x3b, 0x7,0x34,0x54, 0x3,0x53,0x30, 0x4,0x59,0x3d, 0x4,0x59,0x42, 0x7,0x3c,0x70, 0x4,0x59,0x41, 0x5,0x65,0x45, 0x4,0x61,0x61, 0x4,0x61,0x64, 0x4,0x61,0x63, 0x4,0x61,0x62, 0x4,0x61,0x65, 0x4,0x67,0x5a, 0x4,0x67,0x5b, 0x4,0x69,0x54, 0x4,0x69,0x53, 0x4,0x6c,0x2e, 0x4,0x6c,0x2d, 0x4,0x6e,0x3d, 0x4,0x35,0x7a, 0x6,0x3c,0x63, 0x3,0x39,0x5a, 0x3,0x3f,0x5f, 0x3,0x3f,0x64, 0x3,0x3f,0x61, 0x3,0x3f,0x67, 0x3,0x45,0x2c, 0x5,0x43,0x6d, 0x3,0x4a,0x2e, 0x4,0x47,0x79, 0x3,0x4a,0x36, 0x4,0x47,0x76, 0x4,0x47,0x7b, 0x4,0x47,0x78, 0x3,0x4f,0x4f, 0x4,0x4e,0x43, 0x3,0x4f,0x47, 0x3,0x4f,0x46, 0x7,0x2a,0x38, 0x3,0x4f,0x4a, 0x7,0x2a,0x3e, 0x3,0x53,0x33, 0x3,0x53,0x34, 0x4,0x54,0x48, 0x4,0x54,0x46, 0x7,0x3c,0x7b, 0x3,0x56,0x69, 0x7,0x3c,0x77, 0x4,0x59,0x45, 0x4,0x59,0x44, 0xf,0x5d,0x4c, 0x3,0x59,0x3f, 0x3,0x59,0x41, 0x4,0x5e,0x2f, 0x4,0x5e,0x2c, 0x7,0x44,0x39, 0x4,0x5e,0x27, 0x5,0x65,0x4f, 0x4,0x5e,0x2b, 0x3,0x59,0x48, 0x3,0x59,0x47, 0x3,0x5b,0x46, 0x4,0x61,0x66, 0x3,0x5b,0x4b, 0x3,0x5b,0x40, 0x3,0x5b,0x52, 0x4,0x61,0x69, 0x5,0x6a,0x33, 0x4,0x61,0x68, 0x3,0x5b,0x51, 0x3,0x5b,0x4c, 0x3,0x5b,0x49, 0xf,0x64,0x34, 0x3,0x5d,0x3b, 0x4,0x61,0x6c, 0x3,0x5d,0x40, 0x4,0x64,0x66, 0x4,0x64,0x6c, 0x5,0x6e,0x35, 0x3,0x5d,0x48, 0x4,0x64,0x6d, 0x4,0x67,0x5f, 0x3,0x5e,0x6b, 0x4,0x64,0x69, 0x4,0x67,0x61, 0x3,0x5e,0x6c, 0x4,0x67,0x63, 0x7,0x55,0x68, 0x3,0x5e,0x69, 0x3,0x5e,0x6e, 0x3,0x5e,0x6f, 0x3,0x5f,0x6f, 0x3,0x60,0x51, 0x5,0x71,0x55, 0x7,0x59,0x67, 0x3,0x5f,0x6d, 0x7,0x59,0x68, 0x3,0x5f,0x70, 0x5,0x74,0x55, 0x4,0x6b,0x2a, 0x5,0x76,0x5f, 0x4,0x6b,0x27, 0x3,0x60,0x4e, 0x3,0x60,0x50, 0x3,0x61,0x23, 0x3,0x61,0x21, 0x4,0x6c,0x30, 0x3,0x61,0x24, 0x3,0x61,0x6e, 0x6,0x3c,0x65, 0x4,0x3b,0x67, 0xf,0x3f,0x76, 0x4,0x41,0x49, 0x4,0x5e,0x32, 0x3,0x39,0x5b, 0x4,0x35,0x7c, 0x3,0x3f,0x6a, 0x4,0x3b,0x6b, 0x3,0x3f,0x6e, 0x3,0x3f,0x6b, 0x3,0x45,0x3b, 0x4,0x41,0x50, 0x4,0x41,0x4e, 0x4,0x48,0x23, 0x3,0x4a,0x3b, 0x3,0x4a,0x3f, 0x3,0x4a,0x3a, 0x5,0x4a,0x6e, 0x3,0x4a,0x3c, 0x7,0x2a,0x46, 0x4,0x4e,0x48, 0x3,0x4f,0x54, 0x3,0x4f,0x57, 0x4,0x54,0x4f, 0x4,0x54,0x4b, 0x3,0x53,0x3f, 0x4,0x54,0x4c, 0x3,0x53,0x41, 0x3,0x53,0x43, 0x3,0x53,0x46, 0x3,0x53,0x45, 0x7,0x34,0x73, 0x4,0x59,0x4e, 0x4,0x59,0x4f, 0x4,0x59,0x54, 0x3,0x56,0x6e, 0x3,0x56,0x6c, 0x4,0x59,0x4d, 0x4,0x59,0x52, 0x4,0x67,0x66, 0x4,0x64,0x71, 0x5,0x71,0x5b, 0x4,0x69,0x55, 0x5,0x21,0x7d, 0x3,0x22,0x60, 0x3,0x24,0x3e, 0x5,0x24,0x7b, 0x6,0x29,0x35, 0x4,0x28,0x31, 0x4,0x28,0x32, 0x3,0x2a,0x7a, 0x5,0x2b,0x64, 0x4,0x2b,0x5a, 0x3,0x2f,0x41, 0x4,0x2b,0x59, 0x4,0x30,0x40, 0x4,0x30,0x3d, 0x3,0x34,0x35, 0x4,0x30,0x3e, 0x3,0x34,0x37, 0x4,0x30,0x3c, 0x3,0x39,0x63, 0x3,0x39,0x5d, 0x4,0x35,0x7d, 0x3,0x39,0x60, 0x3,0x39,0x62, 0x3,0x39,0x64, 0x3,0x39,0x5f, 0x3,0x3f,0x6f, 0x4,0x3b,0x6d, 0x3,0x3f,0x74, 0x3,0x45,0x3f, 0x3,0x45,0x3e, 0x4,0x41,0x55, 0x4,0x41,0x54, 0x3,0x45,0x3d, 0x3,0x45,0x41, 0x3,0x4a,0x41, 0x3,0x4a,0x40, 0x3,0x4a,0x43, 0x3,0x4a,0x42, 0x3,0x4f,0x59, 0x3,0x4f,0x58, 0x7,0x2a,0x54, 0x3,0x53,0x47, 0x4,0x54,0x53, 0x4,0x54,0x51, 0x4,0x59,0x55, 0x3,0x5b,0x54, 0x4,0x64,0x73, 0x4,0x67,0x67, 0x3,0x34,0x38, 0x4,0x36,0x24, 0x3,0x3f,0x7a, 0x3,0x3f,0x76, 0x3,0x3f,0x79, 0x3,0x3f,0x77, 0x4,0x41,0x56, 0x3,0x45,0x44, 0x3,0x45,0x43, 0x3,0x45,0x45, 0x3,0x4a,0x48, 0x3,0x4f,0x5d, 0x3,0x4f,0x5c, 0x3,0x53,0x4b, 0x3,0x53,0x4a, 0x3,0x52,0x38, 0x4,0x59,0x58, 0x3,0x56,0x72, 0x3,0x59,0x4c, 0x3,0x5b,0x55, 0x3,0x5d,0x4a, 0x3,0x5b,0x56, 0x3,0x5d,0x4b, 0x4,0x69,0x56, 0x3,0x61,0x51, 0x3,0x62,0x40, 0x3,0x39,0x66, 0x3,0x3f,0x7d, 0x6,0x50,0x31, 0x3,0x45,0x48, 0x4,0x48,0x2d, 0x4,0x48,0x31, 0x4,0x48,0x2e, 0x3,0x4a,0x4a, 0x4,0x48,0x34, 0x3,0x4a,0x4b, 0x4,0x48,0x33, 0x6,0x63,0x7b, 0x3,0x4f,0x5e, 0x3,0x4f,0x61, 0x3,0x4f,0x5f, 0x4,0x54,0x59, 0x3,0x53,0x4f, 0x3,0x53,0x4e, 0x4,0x59,0x60, 0x3,0x56,0x73, 0x3,0x56,0x77, 0x4,0x54,0x58, 0x3,0x56,0x76, 0x4,0x59,0x5d, 0x4,0x59,0x5f, 0x4,0x5e,0x35, 0x3,0x59,0x4d, 0x3,0x59,0x4e, 0x4,0x5e,0x36, 0x7,0x44,0x58, 0x7,0x44,0x60, 0x4,0x61,0x74, 0x4,0x61,0x73, 0x3,0x5b,0x57, 0x3,0x5b,0x58, 0x3,0x5b,0x59, 0x4,0x64,0x75, 0x3,0x5d,0x4d, 0x4,0x69,0x58, 0x4,0x69,0x5a, 0x4,0x69,0x5b, 0x3,0x60,0x58, 0x3,0x61,0x53, 0x3,0x61,0x27, 0x3,0x61,0x52, 0x3,0x62,0x24, 0x3,0x62,0x44, 0x3,0x62,0x46, 0x4,0x69,0x5c, 0x4,0x36,0x28, 0x4,0x36,0x2a, 0x4,0x3b,0x74, 0x4,0x4e,0x4c, 0x4,0x64,0x7b, 0x4,0x41,0x5a, 0x3,0x45,0x4a, 0x3,0x4a,0x4d, 0x4,0x48,0x38, 0x4,0x48,0x37, 0x4,0x54,0x5d, 0x4,0x54,0x5c, 0x4,0x59,0x62, 0x4,0x64,0x7c, 0x4,0x67,0x6e, 0x5,0x71,0x63, 0x4,0x6c,0x33, 0x4,0x3b,0x79, 0x3,0x40,0x23, 0x4,0x3b,0x76, 0x3,0x45,0x4d, 0x4,0x41,0x5d, 0x4,0x41,0x5f, 0x3,0x45,0x4c, 0xf,0x46,0x32, 0x6,0x5a,0x28, 0x4,0x48,0x3a, 0x4,0x48,0x40, 0x4,0x48,0x3b, 0x3,0x4a,0x4f, 0x3,0x4a,0x50, 0x4,0x48,0x3d, 0x4,0x4e,0x4f, 0x4,0x54,0x63, 0x4,0x54,0x61, 0x4,0x54,0x60, 0x4,0x54,0x64, 0x4,0x54,0x62, 0x4,0x59,0x63, 0x4,0x54,0x68, 0x3,0x53,0x52, 0x3,0x56,0x7c, 0x4,0x59,0x68, 0x4,0x59,0x64, 0x7,0x3d,0x56, 0x3,0x56,0x79, 0x3,0x56,0x7d, 0x3,0x56,0x7e, 0x4,0x5e,0x3e, 0x5,0x65,0x7e, 0x4,0x5e,0x42, 0x4,0x5e,0x3c, 0x5,0x65,0x73, 0x5,0x65,0x7b, 0x4,0x5e,0x3b, 0x4,0x5e,0x41, 0x3,0x5b,0x5c, 0x3,0x5b,0x5b, 0x4,0x61,0x77, 0x4,0x61,0x7b, 0x3,0x5b,0x5a, 0x4,0x65,0x23, 0x4,0x64,0x7e, 0x5,0x6e,0x49, 0x7,0x56,0x27, 0x7,0x56,0x25, 0x4,0x67,0x72, 0x4,0x67,0x70, 0x5,0x71,0x69, 0x7,0x56,0x26, 0x3,0x5f,0x74, 0x5,0x74,0x62, 0x4,0x6b,0x2c, 0x3,0x60,0x5a, 0x4,0x6c,0x34, 0x4,0x6d,0x2d, 0x3,0x61,0x54, 0x4,0x6d,0x65, 0x3,0x61,0x70, 0x4,0x6e,0x22, 0x4,0x41,0x61, 0x4,0x48,0x43, 0x4,0x48,0x41, 0x4,0x48,0x42, 0x4,0x48,0x44, 0x3,0x53,0x54, 0x4,0x59,0x6b, 0x7,0x44,0x77, 0x4,0x5e,0x45, 0x3,0x59,0x52, 0x4,0x61,0x7d, 0x4,0x61,0x7e, 0x4,0x67,0x73, 0x4,0x69,0x60, 0x3,0x60,0x5b, 0x3,0x45,0x4e, 0x3,0x57,0x21, 0x3,0x5b,0x63, 0x3,0x5b,0x62, 0x3,0x5d,0x52, 0x4,0x67,0x75, 0x4,0x6b,0x2d, 0x3,0x40,0x25, 0x3,0x40,0x26, 0x3,0x40,0x27, 0x3,0x45,0x51, 0x4,0x54,0x6a, 0x4,0x54,0x69, 0x3,0x59,0x53, 0x4,0x62,0x22, 0x4,0x62,0x23, 0x3,0x5f,0x75, 0x4,0x3b,0x7b, 0xf,0x40,0x2d, 0x4,0x41,0x65, 0x4,0x41,0x64, 0x5,0x44,0x34, 0x5,0x4b,0x3e, 0x4,0x48,0x4d, 0x3,0x4a,0x51, 0x4,0x48,0x4e, 0x3,0x4a,0x53, 0x4,0x48,0x4c, 0x4,0x48,0x4b, 0x5,0x4b,0x3f, 0x4,0x48,0x47, 0x3,0x4f,0x68, 0x4,0x4e,0x59, 0x4,0x4e,0x5c, 0x5,0x52,0x60, 0x4,0x54,0x6d, 0x4,0x54,0x6f, 0x3,0x53,0x56, 0x4,0x4e,0x5d, 0x3,0x53,0x60, 0x3,0x53,0x57, 0x3,0x53,0x5e, 0x7,0x35,0x51, 0x3,0x57,0x25, 0x4,0x59,0x73, 0x7,0x3d,0x69, 0x3,0x57,0x22, 0x4,0x59,0x77, 0x3,0x57,0x23, 0x3,0x57,0x24, 0x3,0x57,0x27, 0x3,0x57,0x29, 0x4,0x5e,0x4e, 0x3,0x59,0x54, 0x4,0x5e,0x49, 0x4,0x5e,0x47, 0x4,0x5e,0x4b, 0x3,0x59,0x57, 0x3,0x59,0x55, 0x4,0x5e,0x4d, 0x4,0x5e,0x4c, 0x3,0x59,0x5a, 0x4,0x62,0x27, 0x4,0x62,0x29, 0x4,0x62,0x2d, 0x4,0x62,0x26, 0x4,0x62,0x2c, 0x3,0x5b,0x64, 0x4,0x62,0x25, 0x4,0x62,0x2f, 0x4,0x62,0x28, 0x4,0x62,0x2b, 0x4,0x65,0x2f, 0x4,0x65,0x31, 0x4,0x65,0x30, 0x3,0x5d,0x54, 0x4,0x67,0x77, 0x4,0x67,0x79, 0x4,0x67,0x76, 0x4,0x67,0x7c, 0x4,0x67,0x7b, 0x7,0x56,0x32, 0x4,0x69,0x63, 0x3,0x5f,0x76, 0x4,0x69,0x62, 0x4,0x6c,0x39, 0x5,0x78,0x48, 0x3,0x61,0x55, 0x4,0x36,0x2b, 0x4,0x3b,0x7e, 0x3,0x45,0x53, 0x4,0x41,0x6d, 0x4,0x41,0x72, 0x4,0x41,0x6e, 0x4,0x48,0x51, 0x4,0x48,0x56, 0x4,0x48,0x59, 0x4,0x48,0x50, 0x4,0x48,0x54, 0x3,0x4a,0x57, 0x4,0x4e,0x60, 0x4,0x4e,0x61, 0x4,0x54,0x76, 0x4,0x54,0x77, 0x4,0x54,0x73, 0x4,0x54,0x74, 0x4,0x54,0x75, 0x4,0x59,0x7d, 0x4,0x5a,0x22, 0x4,0x5a,0x21, 0x4,0x59,0x7c, 0x4,0x59,0x7a, 0x4,0x59,0x7e, 0x4,0x5e,0x51, 0x7,0x44,0x7e, 0x4,0x5e,0x50, 0x4,0x5e,0x52, 0x3,0x59,0x5d, 0x3,0x59,0x5e, 0x3,0x59,0x5f, 0x4,0x62,0x32, 0x3,0x5b,0x67, 0x3,0x5b,0x66, 0x4,0x65,0x36, 0x3,0x5d,0x55, 0x4,0x67,0x7e, 0x4,0x6b,0x30, 0x4,0x6c,0x3a, 0x3,0x57,0x2b, 0x3,0x59,0x60, 0x3,0x34,0x3a, 0x4,0x36,0x2c, 0x3,0x40,0x29, 0x3,0x40,0x2a, 0x4,0x3c,0x24, 0x3,0x40,0x28, 0x4,0x3c,0x25, 0x3,0x45,0x5d, 0x3,0x40,0x2c, 0x4,0x41,0x77, 0x4,0x41,0x74, 0x3,0x4a,0x5c, 0x3,0x45,0x5e, 0x4,0x41,0x75, 0x3,0x45,0x56, 0x3,0x45,0x55, 0x3,0x45,0x5a, 0x4,0x41,0x79, 0x4,0x41,0x7a, 0x3,0x4a,0x58, 0x3,0x4a,0x59, 0x4,0x48,0x5b, 0x7,0x2b,0x38, 0x3,0x4a,0x5a, 0x4,0x48,0x5c, 0x6,0x64,0x40, 0x3,0x4f,0x6a, 0x4,0x4e,0x65, 0x4,0x4e,0x64, 0x4,0x4e,0x67, 0x4,0x4e,0x66, 0x4,0x54,0x78, 0x4,0x4e,0x69, 0x4,0x54,0x7c, 0x4,0x54,0x7d, 0x4,0x54,0x7a, 0x4,0x5a,0x27, 0x4,0x55,0x22, 0x4,0x5a,0x28, 0x4,0x5a,0x2a, 0x5,0x60,0x31, 0x3,0x57,0x2d, 0x3,0x59,0x64, 0x5,0x60,0x2c, 0x3,0x57,0x2c, 0x4,0x5e,0x58, 0x4,0x5e,0x57, 0x4,0x5e,0x5b, 0x4,0x5e,0x59, 0x4,0x5e,0x5a, 0x4,0x65,0x39, 0x4,0x62,0x36, 0x3,0x5b,0x68, 0x4,0x65,0x3c, 0x4,0x65,0x3b, 0x3,0x5d,0x57, 0x3,0x5d,0x59, 0x4,0x68,0x24, 0x4,0x68,0x23, 0x3,0x5e,0x7d, 0x4,0x68,0x22, 0x4,0x69,0x67, 0x4,0x69,0x65, 0x3,0x5f,0x77, 0x4,0x69,0x68, 0x4,0x6b,0x31, 0x3,0x61,0x56, 0x4,0x6d,0x30, 0x4,0x6d,0x67, 0x4,0x6e,0x25, 0x3,0x4f,0x6c, 0x3,0x53,0x67, 0x4,0x5e,0x5f, 0x4,0x62,0x3c, 0x4,0x48,0x5d, 0x3,0x57,0x2f, 0x4,0x55,0x26, 0x3,0x57,0x2e, 0x3,0x61,0x71, 0x3,0x40,0x2d, 0x5,0x44,0x4a, 0x3,0x45,0x60, 0x4,0x48,0x5e, 0x3,0x4a,0x65, 0x4,0x48,0x5f, 0x3,0x4a,0x5f, 0x3,0x4a,0x67, 0x3,0x4a,0x68, 0x3,0x4a,0x6b, 0x3,0x4a,0x69, 0x4,0x4e,0x6f, 0x3,0x4f,0x71, 0x3,0x4f,0x70, 0x4,0x4e,0x6e, 0x3,0x4f,0x6f, 0x4,0x4e,0x6d, 0x4,0x4e,0x70, 0x3,0x53,0x6f, 0x3,0x53,0x6e, 0x3,0x53,0x6d, 0x5,0x5a,0x2c, 0x3,0x53,0x69, 0x4,0x55,0x2d, 0x5,0x5a,0x2e, 0x7,0x36,0x28, 0x4,0x5a,0x2e, 0x3,0x57,0x32, 0x3,0x57,0x35, 0x4,0x5a,0x2d, 0x3,0x57,0x31, 0x4,0x5e,0x67, 0x5,0x6a,0x6e, 0x4,0x5e,0x62, 0x3,0x59,0x68, 0x4,0x5e,0x68, 0x3,0x59,0x69, 0x4,0x5e,0x63, 0x4,0x5e,0x65, 0x3,0x59,0x6c, 0x4,0x62,0x41, 0x4,0x62,0x3f, 0x3,0x5b,0x6a, 0x4,0x62,0x46, 0x4,0x62,0x40, 0x4,0x62,0x44, 0x4,0x62,0x45, 0x4,0x65,0x41, 0x4,0x65,0x40, 0x3,0x5d,0x5d, 0x3,0x5d,0x5b, 0x4,0x65,0x47, 0x5,0x6e,0x66, 0x5,0x6e,0x6d, 0x3,0x5d,0x5c, 0x4,0x68,0x29, 0x4,0x68,0x2a, 0x4,0x68,0x2b, 0x4,0x68,0x2d, 0x3,0x5f,0x23, 0x5,0x72,0x2d, 0x4,0x68,0x28, 0x7,0x5a,0x3e, 0x5,0x74,0x76, 0x4,0x69,0x6b, 0x4,0x69,0x69, 0x3,0x5f,0x7a, 0x4,0x6b,0x33, 0x4,0x6b,0x34, 0x4,0x6b,0x32, 0x3,0x61,0x2b, 0x7,0x60,0x2e, 0x7,0x60,0x2d, 0x3,0x61,0x57, 0x4,0x6d,0x68, 0x3,0x62,0x27, 0x4,0x6e,0x3f, 0x3,0x62,0x37, 0x4,0x6e,0x57, 0x3,0x39,0x69, 0x3,0x40,0x2e, 0x4,0x48,0x62, 0x3,0x4a,0x6d, 0x3,0x4f,0x75, 0x4,0x4e,0x75, 0x4,0x4e,0x73, 0x4,0x4e,0x76, 0x3,0x4f,0x78, 0x3,0x53,0x72, 0x3,0x53,0x73, 0x4,0x55,0x30, 0x4,0x55,0x32, 0x4,0x55,0x2f, 0x4,0x55,0x2e, 0x3,0x57,0x39, 0x4,0x5a,0x31, 0x4,0x5a,0x35, 0x4,0x5a,0x30, 0x3,0x57,0x38, 0x4,0x5a,0x33, 0x5,0x66,0x51, 0x4,0x5e,0x6e, 0x3,0x5b,0x70, 0x4,0x62,0x48, 0x4,0x62,0x47, 0x4,0x65,0x49, 0x3,0x5d,0x5f, 0x4,0x68,0x30, 0x4,0x69,0x6e, 0x4,0x6b,0x35, 0x4,0x6c,0x3e, 0x4,0x6d,0x33, 0x3,0x40,0x30, 0x4,0x42,0x22, 0x4,0x62,0x4a, 0x5,0x74,0x7a, 0x7,0x64,0x75, 0x3,0x40,0x31, 0x5,0x3d,0x52, 0x6,0x64,0x5e, 0x4,0x48,0x6a, 0x4,0x48,0x69, 0x4,0x48,0x67, 0x3,0x4a,0x74, 0x5,0x4b,0x59, 0x4,0x4e,0x7b, 0x3,0x4f,0x7a, 0x4,0x55,0x35, 0x4,0x55,0x36, 0x4,0x5a,0x38, 0x3,0x57,0x3d, 0x4,0x5a,0x3b, 0x4,0x5e,0x70, 0x4,0x5e,0x73, 0x3,0x59,0x6e, 0x4,0x5e,0x74, 0x4,0x5e,0x76, 0x4,0x5e,0x75, 0x4,0x5e,0x77, 0x4,0x62,0x4e, 0x3,0x5b,0x72, 0x4,0x62,0x4c, 0x4,0x65,0x4d, 0x4,0x65,0x4f, 0x4,0x65,0x4e, 0x7,0x51,0x79, 0x5,0x72,0x3f, 0x3,0x5f,0x26, 0x4,0x69,0x72, 0x4,0x6c,0x43, 0x4,0x6c,0x41, 0x3,0x61,0x2d, 0x5,0x78,0x52, 0x4,0x6d,0x35, 0x7,0x61,0x6a, 0x4,0x6d,0x69, 0x4,0x6e,0x49, 0x7,0x51,0x7d, 0x5,0x72,0x41, 0x3,0x4a,0x77, 0x3,0x4a,0x76, 0x3,0x4d,0x3e, 0x3,0x53,0x76, 0x7,0x5a,0x4b, 0x3,0x61,0x58, 0x3,0x4a,0x79, 0x4,0x4f,0x24, 0x4,0x4f,0x25, 0x4,0x55,0x3f, 0x3,0x53,0x77, 0x4,0x5e,0x7e, 0x3,0x59,0x70, 0x4,0x5e,0x7d, 0x4,0x5e,0x7c, 0x3,0x5b,0x73, 0x5,0x66,0x68, 0x3,0x5d,0x65, 0x4,0x69,0x77, 0x4,0x69,0x76, 0x7,0x5a,0x4f, 0x4,0x6c,0x48, 0x4,0x6c,0x49, 0x4,0x6e,0x58, 0x5,0x3d,0x54, 0x4,0x48,0x6d, 0x5,0x4b,0x64, 0x4,0x4f,0x28, 0x4,0x4f,0x34, 0x3,0x50,0x21, 0x7,0x2b,0x6a, 0x4,0x4f,0x39, 0x4,0x4f,0x32, 0x4,0x4f,0x2b, 0x4,0x4f,0x29, 0x3,0x54,0x27, 0x4,0x55,0x44, 0x4,0x55,0x42, 0x4,0x55,0x48, 0x3,0x53,0x7e, 0x3,0x54,0x28, 0x4,0x55,0x41, 0x3,0x54,0x26, 0x3,0x54,0x24, 0x3,0x54,0x22, 0x3,0x53,0x7b, 0x4,0x5a,0x40, 0x3,0x57,0x41, 0x4,0x5f,0x21, 0x7,0x3e,0x49, 0x4,0x5a,0x42, 0x3,0x59,0x72, 0x4,0x5f,0x23, 0x5,0x66,0x6e, 0x4,0x5f,0x27, 0x4,0x5f,0x25, 0x3,0x59,0x78, 0x4,0x5f,0x24, 0x3,0x59,0x77, 0x4,0x5f,0x29, 0x4,0x5f,0x2b, 0x4,0x62,0x5d, 0x5,0x6b,0x35, 0x4,0x62,0x67, 0x4,0x62,0x57, 0x4,0x62,0x61, 0x4,0x62,0x59, 0x4,0x62,0x54, 0x3,0x5b,0x76, 0x5,0x6b,0x31, 0x4,0x62,0x62, 0x5,0x6b,0x2b, 0x4,0x62,0x60, 0x4,0x62,0x64, 0x3,0x5b,0x78, 0x3,0x5b,0x7b, 0x3,0x5b,0x7c, 0xf,0x64,0x72, 0x3,0x5d,0x77, 0x4,0x65,0x55, 0x7,0x52,0x31, 0x4,0x65,0x5b, 0x3,0x5d,0x6c, 0x7,0x52,0x33, 0x4,0x65,0x53, 0x3,0x5d,0x6b, 0x3,0x5d,0x6d, 0x4,0x68,0x3d, 0x3,0x5f,0x2d, 0x3,0x5f,0x30, 0x4,0x68,0x3c, 0x3,0x5f,0x2e, 0x3,0x5f,0x2b, 0x4,0x68,0x3a, 0x3,0x5f,0x29, 0x3,0x5f,0x2f, 0x4,0x69,0x7d, 0x3,0x5f,0x7d, 0x4,0x6a,0x21, 0x4,0x69,0x7c, 0x3,0x5f,0x7c, 0x4,0x69,0x7e, 0x3,0x60,0x24, 0x4,0x69,0x7b, 0x3,0x60,0x21, 0xf,0x6a,0x3f, 0x4,0x6b,0x3c, 0x4,0x6b,0x3d, 0x4,0x6b,0x40, 0x4,0x6b,0x3b, 0x7,0x5e,0x23, 0x3,0x60,0x67, 0x3,0x60,0x64, 0x5,0x78,0x5b, 0x5,0x78,0x56, 0x3,0x61,0x30, 0x4,0x6c,0x4d, 0x4,0x6c,0x4e, 0x5,0x77,0x24, 0x3,0x61,0x5a, 0x4,0x6d,0x39, 0x3,0x61,0x31, 0x4,0x6e,0x2c, 0x4,0x6e,0x2d, 0x4,0x6e,0x5b, 0x3,0x45,0x65, 0x3,0x4a,0x7a, 0x3,0x4a,0x7b, 0x3,0x4a,0x7c, 0x3,0x4a,0x7e, 0x5,0x4b,0x6b, 0x3,0x4a,0x7d, 0x5,0x53,0x38, 0x4,0x4f,0x3f, 0x3,0x50,0x23, 0x4,0x4f,0x44, 0x4,0x4f,0x3b, 0x7,0x2b,0x6d, 0x4,0x4f,0x40, 0x3,0x50,0x28, 0x3,0x50,0x29, 0x3,0x50,0x26, 0x3,0x4c,0x63, 0x4,0x4f,0x41, 0x4,0x55,0x4e, 0x3,0x54,0x2f, 0x4,0x55,0x4d, 0x3,0x54,0x30, 0x4,0x55,0x4f, 0x3,0x54,0x2b, 0x4,0x55,0x54, 0x7,0x36,0x4a, 0x4,0x55,0x4a, 0x3,0x54,0x2e, 0x4,0x55,0x57, 0x3,0x57,0x4b, 0x4,0x55,0x4b, 0x3,0x54,0x31, 0x4,0x55,0x55, 0x3,0x54,0x34, 0x4,0x55,0x50, 0x7,0x36,0x51, 0x3,0x56,0x33, 0x3,0x57,0x4c, 0x4,0x5a,0x51, 0x3,0x57,0x47, 0x3,0x57,0x49, 0x3,0x57,0x46, 0x4,0x5a,0x52, 0x3,0x57,0x4e, 0x4,0x5a,0x50, 0x4,0x5f,0x2f, 0x4,0x5f,0x35, 0x4,0x5f,0x2c, 0x3,0x5a,0x21, 0x3,0x59,0x7c, 0x4,0x5f,0x32, 0x4,0x5f,0x31, 0x5,0x67,0x26, 0x4,0x5f,0x38, 0x4,0x62,0x6a, 0x3,0x5c,0x21, 0x4,0x62,0x6c, 0x4,0x65,0x61, 0x3,0x5c,0x28, 0x4,0x62,0x6f, 0x5,0x6b,0x3c, 0x4,0x5f,0x36, 0xf,0x64,0x75, 0x3,0x5d,0x78, 0x4,0x65,0x6c, 0x3,0x5d,0x7d, 0x3,0x5d,0x7b, 0x4,0x65,0x6a, 0x4,0x65,0x64, 0x3,0x5d,0x7c, 0x7,0x52,0x42, 0x4,0x65,0x62, 0x4,0x65,0x6b, 0x3,0x5d,0x7e, 0x3,0x5f,0x34, 0x4,0x68,0x40, 0x4,0x68,0x42, 0x4,0x68,0x41, 0x5,0x72,0x63, 0x3,0x5f,0x33, 0x4,0x6a,0x27, 0x4,0x6a,0x2c, 0x3,0x60,0x28, 0x4,0x6a,0x26, 0x3,0x60,0x26, 0x3,0x60,0x27, 0x4,0x6b,0x45, 0x3,0x60,0x6b, 0x5,0x77,0x2c, 0x4,0x6b,0x44, 0x5,0x77,0x34, 0x4,0x6b,0x47, 0x3,0x60,0x6a, 0x3,0x60,0x69, 0x4,0x6b,0x48, 0x4,0x6c,0x50, 0x4,0x6c,0x52, 0x4,0x6c,0x51, 0x3,0x61,0x36, 0x4,0x6c,0x54, 0x4,0x6d,0x3d, 0x3,0x61,0x5c, 0x7,0x63,0x37, 0x3,0x62,0x2a, 0x3,0x62,0x3e, 0x4,0x6e,0x59, 0x3,0x62,0x43, 0x4,0x4f,0x47, 0x4,0x5f,0x39, 0x7,0x57,0x29, 0x4,0x6b,0x4d, 0x5,0x79,0x73, 0x5,0x4b,0x6d, 0x4,0x4f,0x49, 0x4,0x4f,0x4a, 0x3,0x50,0x2d, 0x3,0x54,0x38, 0x4,0x55,0x58, 0x7,0x36,0x5c, 0x3,0x5a,0x23, 0x4,0x62,0x72, 0x3,0x5f,0x39, 0x3,0x61,0x37, 0x3,0x61,0x38, 0x4,0x48,0x73, 0x4,0x48,0x74, 0x3,0x4b,0x21, 0x4,0x4f,0x4d, 0x4,0x4f,0x4b, 0x4,0x55,0x59, 0x4,0x55,0x5c, 0x4,0x55,0x5a, 0x4,0x55,0x5d, 0x3,0x57,0x4f, 0x4,0x5f,0x3c, 0x4,0x5f,0x3b, 0x3,0x5a,0x27, 0x4,0x62,0x79, 0x4,0x62,0x76, 0x4,0x62,0x7d, 0x4,0x62,0x77, 0x4,0x62,0x7c, 0x4,0x68,0x49, 0x4,0x68,0x48, 0x4,0x68,0x4a, 0x5,0x75,0x4d, 0x5,0x75,0x48, 0x4,0x6b,0x4e, 0x3,0x61,0x39, 0x7,0x5a,0x7d, 0x4,0x6d,0x41, 0x7,0x2c,0x31, 0x4,0x65,0x71, 0x4,0x65,0x72, 0x7,0x36,0x65, 0x4,0x5f,0x3d, 0x4,0x63,0x21, 0x4,0x65,0x76, 0x4,0x68,0x4b, 0x4,0x6b,0x52, 0x4,0x6c,0x5a, 0x7,0x2c,0x33, 0x4,0x55,0x5e, 0x7,0x36,0x67, 0x5,0x6f,0x52, 0x4,0x65,0x79, 0x5,0x6f,0x54, 0x4,0x68,0x4c, 0x4,0x68,0x4e, 0x4,0x68,0x4d, 0x4,0x6a,0x31, 0x4,0x6b,0x55, 0x4,0x6d,0x42, 0x4,0x42,0x2c, 0x3,0x4b,0x23, 0x4,0x4f,0x52, 0x4,0x4f,0x53, 0x4,0x55,0x5f, 0x4,0x5a,0x5f, 0x5,0x61,0x23, 0x5,0x67,0x40, 0x5,0x67,0x3d, 0x4,0x5f,0x3f, 0x5,0x67,0x41, 0x4,0x63,0x23, 0x3,0x5c,0x2b, 0x4,0x65,0x7c, 0x4,0x66,0x21, 0x4,0x65,0x7d, 0x5,0x6f,0x58, 0x4,0x68,0x52, 0x3,0x5f,0x3b, 0x4,0x6b,0x56, 0x4,0x6c,0x5b, 0x4,0x6d,0x44, 0x3,0x61,0x5e, 0x4,0x6d,0x43, 0x4,0x6d,0x6f, 0x4,0x5f,0x40, 0x3,0x5c,0x2c, 0x4,0x6a,0x37, 0x3,0x61,0x3a, 0x4,0x55,0x61, 0x4,0x6c,0x61, 0x4,0x6c,0x62, 0x4,0x5f,0x43, 0x4,0x5f,0x42, 0x4,0x5f,0x44, 0x4,0x63,0x26, 0x4,0x68,0x59, 0x4,0x55,0x62, 0x4,0x5a,0x63, 0x4,0x5f,0x45, 0x4,0x63,0x27, 0x4,0x68,0x5a, 0x3,0x60,0x2a, 0x4,0x6b,0x58, 0x4,0x6b,0x5b, 0x3,0x5a,0x2c, 0x4,0x5f,0x46, 0x3,0x5e,0x23, 0x7,0x52,0x67, 0x5,0x6f,0x61, 0x4,0x68,0x5c, 0x4,0x6e,0x31, 0x5,0x7b,0x7a, 0x4,0x5a,0x66, 0x5,0x61,0x2d, 0x4,0x5f,0x48, 0x4,0x63,0x29, 0x4,0x63,0x2b, 0x4,0x66,0x27, 0x4,0x66,0x25, 0x4,0x66,0x26, 0x3,0x5f,0x3d, 0x4,0x68,0x61, 0x4,0x6a,0x3d, 0x4,0x6a,0x3c, 0x3,0x60,0x6e, 0x5,0x77,0x4d, 0x4,0x6c,0x69, 0x4,0x6c,0x66, 0x4,0x6c,0x6a, 0x4,0x6d,0x4c, 0x4,0x6d,0x4b, 0x4,0x6d,0x70, 0x3,0x61,0x76, 0x3,0x62,0x2b, 0x3,0x62,0x32, 0x4,0x6e,0x4b, 0x4,0x6e,0x4c, 0x4,0x6e,0x5a, 0x5,0x75,0x61, 0x5,0x6b,0x69, 0x5,0x6c,0x44, 0x4,0x68,0x62, 0x4,0x68,0x63, 0x4,0x6d,0x51, 0x3,0x62,0x2c, 0x1,0x44,0x21, 0x1,0x44,0x23, 0x4,0x21,0x26, 0x1,0x44,0x24, 0x3,0x21,0x26, 0x3,0x21,0x25, 0x2,0x21,0x26, 0x1,0x44,0x37, 0x1,0x44,0x35, 0x1,0x44,0x38, 0x1,0x44,0x36, 0x2,0x21,0x27, 0x1,0x44,0x62, 0x2,0x21,0x2f, 0x2,0x21,0x2d, 0x1,0x44,0x61, 0x1,0x44,0x60, 0x4,0x21,0x39, 0x1,0x45,0x62, 0x1,0x45,0x61, 0x1,0x45,0x60, 0x4,0x21,0x55, 0x1,0x45,0x63, 0x1,0x45,0x5f, 0x1,0x47,0x22, 0x1,0x47,0x23, 0x3,0x22,0x62, 0x3,0x22,0x61, 0x3,0x22,0x63, 0x4,0x23,0x35, 0x3,0x24,0x3f, 0x1,0x4b,0x64, 0x3,0x21,0x21, 0x4,0x21,0x27, 0x3,0x21,0x2c, 0x1,0x44,0x39, 0x1,0x44,0x63, 0x2,0x21,0x30, 0x4,0x21,0x3a, 0x1,0x44,0x64, 0x2,0x21,0x43, 0x1,0x48,0x6b, 0x2,0x25,0x31, 0x4,0x2b,0x5e, 0x3,0x21,0x22, 0x1,0x44,0x3a, 0x1,0x44,0x65, 0x1,0x45,0x64, 0x2,0x21,0x44, 0x3,0x27,0x40, 0x3,0x21,0x23, 0x4,0x21,0x22, 0x4,0x21,0x23, 0x2,0x21,0x21, 0x1,0x44,0x25, 0x1,0x44,0x3c, 0x3,0x21,0x30, 0x2,0x21,0x28, 0x1,0x44,0x3d, 0x3,0x21,0x2e, 0x1,0x44,0x66, 0x1,0x45,0x65, 0x1,0x45,0x67, 0x1,0x45,0x66, 0x4,0x22,0x27, 0x1,0x47,0x24, 0x1,0x47,0x25, 0x3,0x23,0x45, 0x1,0x4b,0x65, 0x3,0x2b,0x22, 0x1,0x53,0x7d, 0x1,0x44,0x22, 0x4,0x21,0x24, 0x2,0x21,0x22, 0x1,0x44,0x26, 0x1,0x44,0x3f, 0x1,0x44,0x3e, 0x3,0x21,0x46, 0x3,0x21,0x45, 0x3,0x22,0x64, 0x1,0x47,0x26, 0x4,0x22,0x28, 0x3,0x24,0x40, 0x1,0x4b,0x66, 0x4,0x25,0x31, 0x4,0x25,0x30, 0x3,0x2b,0x23, 0x1,0x58,0x71, 0x2,0x33,0x4e, 0x3,0x39,0x6c, 0x3,0x39,0x6e, 0x1,0x63,0x2a, 0x2,0x41,0x56, 0x2,0x41,0x57, 0x3,0x21,0x24, 0x1,0x44,0x27, 0x3,0x21,0x2d, 0x1,0x44,0x68, 0x3,0x22,0x65, 0x1,0x4b,0x67, 0x1,0x44,0x28, 0x2,0x21,0x29, 0x1,0x44,0x40, 0x3,0x21,0x31, 0x1,0x44,0x69, 0x1,0x44,0x6b, 0x2,0x21,0x31, 0x1,0x44,0x6c, 0x1,0x44,0x6a, 0x4,0x21,0x3b, 0x3,0x21,0x6c, 0x3,0x22,0x66, 0x1,0x47,0x27, 0x1,0x4b,0x68, 0x3,0x24,0x42, 0x3,0x27,0x42, 0x1,0x4b,0x69, 0x1,0x4f,0x67, 0x1,0x27,0x28, 0x1,0x44,0x41, 0x1,0x44,0x6d, 0x3,0x21,0x47, 0x1,0x47,0x28, 0x1,0x47,0x2a, 0x1,0x47,0x29, 0x1,0x48,0x6c, 0x1,0x4b,0x6a, 0x1,0x4b,0x6b, 0x1,0x4f,0x68, 0x1,0x4f,0x69, 0x3,0x2b,0x26, 0x3,0x2b,0x25, 0x3,0x2b,0x27, 0x3,0x2b,0x24, 0x1,0x53,0x7e, 0x4,0x36,0x2e, 0x2,0x41,0x58, 0x3,0x40,0x33, 0x2,0x6d,0x44, 0x1,0x44,0x29, 0x3,0x21,0x32, 0x3,0x21,0x33, 0x1,0x44,0x6f, 0x1,0x44,0x6e, 0x2,0x21,0x32, 0x1,0x44,0x70, 0x1,0x44,0x76, 0x3,0x21,0x49, 0x1,0x44,0x71, 0x1,0x44,0x72, 0x2,0x21,0x34, 0x2,0x21,0x33, 0x1,0x44,0x74, 0x1,0x44,0x75, 0x3,0x21,0x4c, 0x1,0x44,0x73, 0x3,0x21,0x4b, 0x3,0x21,0x4a, 0x4,0x21,0x3c, 0x1,0x45,0x6a, 0x1,0x45,0x6b, 0x1,0x45,0x6c, 0x1,0x45,0x6d, 0x1,0x45,0x69, 0x1,0x45,0x70, 0x2,0x21,0x4a, 0x4,0x21,0x5b, 0x2,0x21,0x46, 0x2,0x21,0x49, 0x1,0x45,0x71, 0x1,0x46,0x23, 0x3,0x21,0x6d, 0x2,0x21,0x48, 0x4,0x21,0x5a, 0x1,0x45,0x6e, 0x1,0x45,0x6f, 0x1,0x45,0x68, 0x3,0x21,0x72, 0x3,0x21,0x70, 0x2,0x21,0x45, 0x2,0x21,0x47, 0x3,0x22,0x6f, 0x3,0x22,0x68, 0x1,0x47,0x37, 0x2,0x21,0x6f, 0x1,0x47,0x34, 0x1,0x47,0x38, 0x2,0x21,0x79, 0x2,0x21,0x6d, 0x1,0x47,0x35, 0x2,0x21,0x71, 0x3,0x22,0x6b, 0x3,0x22,0x67, 0x3,0x22,0x76, 0x1,0x47,0x36, 0x3,0x22,0x6e, 0x1,0x47,0x39, 0x4,0x22,0x2d, 0x1,0x47,0x2b, 0x2,0x21,0x70, 0x1,0x47,0x3a, 0x2,0x21,0x74, 0x3,0x22,0x6d, 0x2,0x21,0x78, 0x2,0x21,0x75, 0x3,0x22,0x6c, 0x3,0x22,0x74, 0x2,0x21,0x72, 0x1,0x47,0x2c, 0x1,0x47,0x2e, 0x1,0x47,0x3b, 0x4,0x22,0x2a, 0x1,0x47,0x30, 0x2,0x21,0x6a, 0x1,0x47,0x33, 0x1,0x47,0x31, 0x1,0x47,0x32, 0x2,0x21,0x7a, 0x2,0x21,0x77, 0x2,0x21,0x6e, 0x1,0x47,0x2f, 0x3,0x22,0x70, 0x3,0x22,0x77, 0x2,0x21,0x6b, 0x1,0x47,0x2d, 0x3,0x22,0x75, 0x4,0x22,0x2e, 0x3,0x22,0x73, 0x2,0x21,0x73, 0x2,0x21,0x76, 0x3,0x22,0x72, 0xf,0x21,0x71, 0x2,0x21,0x6c, 0x2,0x23,0x28, 0x4,0x23,0x39, 0x1,0x49,0x24, 0x1,0x48,0x75, 0x3,0x24,0x50, 0x3,0x24,0x48, 0x2,0x23,0x29, 0x1,0x48,0x72, 0x3,0x24,0x4f, 0x1,0x49,0x26, 0x3,0x24,0x46, 0x1,0x48,0x7a, 0x3,0x24,0x45, 0x1,0x48,0x79, 0x2,0x22,0x7b, 0x1,0x48,0x7d, 0x1,0x48,0x78, 0x2,0x23,0x22, 0x2,0x23,0x2a, 0x3,0x24,0x4e, 0x2,0x23,0x26, 0x3,0x24,0x49, 0x1,0x48,0x7b, 0x3,0x24,0x4b, 0x3,0x24,0x43, 0x1,0x48,0x7e, 0x1,0x48,0x6f, 0x1,0x49,0x29, 0x2,0x22,0x7d, 0x3,0x24,0x44, 0x3,0x24,0x4c, 0x2,0x25,0x3d, 0x1,0x48,0x6d, 0x1,0x49,0x25, 0x1,0x48,0x6e, 0x1,0x48,0x76, 0x1,0x48,0x77, 0x2,0x23,0x24, 0x2,0x22,0x7e, 0x1,0x48,0x7c, 0x1,0x48,0x74, 0x2,0x22,0x7a, 0x1,0x48,0x70, 0x2,0x23,0x27, 0x1,0x49,0x27, 0x1,0x49,0x2a, 0x1,0x48,0x73, 0x1,0x49,0x22, 0x1,0x49,0x28, 0x1,0x48,0x71, 0x2,0x23,0x25, 0x1,0x49,0x23, 0x2,0x23,0x2b, 0x2,0x22,0x7c, 0x1,0x49,0x21, 0x2,0x23,0x21, 0x3,0x64,0x48, 0x2,0x23,0x23, 0x3,0x64,0x49, 0x1,0x4b,0x79, 0x2,0x25,0x3f, 0x2,0x25,0x4b, 0x1,0x4b,0x71, 0x3,0x27,0x47, 0x2,0x25,0x4c, 0x1,0x4b,0x6c, 0x1,0x4b,0x76, 0x4,0x25,0x3e, 0x3,0x27,0x4f, 0x1,0x4b,0x6f, 0x2,0x25,0x39, 0x1,0x4b,0x77, 0x2,0x25,0x38, 0x2,0x25,0x3c, 0x2,0x25,0x43, 0x2,0x25,0x41, 0x1,0x4c,0x21, 0x1,0x4b,0x7a, 0x2,0x25,0x33, 0x2,0x25,0x35, 0x1,0x4b,0x7c, 0x1,0x4b,0x70, 0x2,0x25,0x36, 0x2,0x25,0x42, 0x2,0x25,0x49, 0x1,0x4b,0x75, 0x2,0x25,0x3b, 0x2,0x25,0x34, 0x1,0x4b,0x74, 0x2,0x25,0x37, 0x1,0x4b,0x78, 0x2,0x25,0x3a, 0x3,0x27,0x44, 0x1,0x4b,0x73, 0x3,0x27,0x51, 0x1,0x4b,0x6e, 0x3,0x27,0x48, 0x1,0x4b,0x7d, 0x2,0x25,0x44, 0x1,0x4b,0x7e, 0x2,0x25,0x48, 0x3,0x27,0x43, 0x2,0x25,0x46, 0x2,0x25,0x4a, 0x1,0x4b,0x7b, 0x2,0x25,0x3e, 0x2,0x25,0x32, 0x4,0x25,0x36, 0x2,0x25,0x40, 0x1,0x4b,0x72, 0x2,0x25,0x45, 0x1,0x4b,0x6d, 0x2,0x25,0x47, 0x3,0x27,0x4c, 0x3,0x27,0x49, 0x3,0x27,0x4b, 0x3,0x27,0x4a, 0x3,0x27,0x4d, 0xf,0x25,0x44, 0x1,0x4f,0x78, 0x1,0x4f,0x6c, 0x3,0x2b,0x2d, 0x3,0x2b,0x2e, 0x2,0x29,0x22, 0x2,0x29,0x2a, 0x3,0x2b,0x36, 0x1,0x4f,0x6b, 0x1,0x4f,0x73, 0x1,0x50,0x21, 0x3,0x2b,0x2c, 0x2,0x29,0x30, 0x2,0x29,0x2e, 0x2,0x29,0x29, 0x4,0x28,0x38, 0x4,0x28,0x3e, 0x3,0x2b,0x2b, 0x1,0x4f,0x6d, 0x2,0x29,0x2f, 0x2,0x29,0x25, 0x1,0x4f,0x7b, 0x1,0x4f,0x72, 0x1,0x4f,0x7a, 0x2,0x28,0x7e, 0x3,0x2b,0x32, 0x2,0x29,0x2c, 0x3,0x2b,0x2f, 0x2,0x29,0x23, 0x1,0x4f,0x76, 0x2,0x29,0x24, 0x3,0x2b,0x33, 0x2,0x28,0x7d, 0x1,0x4f,0x7d, 0x1,0x4f,0x70, 0x1,0x4f,0x79, 0x1,0x4f,0x6f, 0x3,0x2b,0x28, 0x2,0x29,0x21, 0x2,0x29,0x26, 0x3,0x2b,0x29, 0x2,0x29,0x2d, 0x1,0x4f,0x77, 0x1,0x4f,0x74, 0x2,0x29,0x28, 0x1,0x4f,0x7c, 0x2,0x29,0x2b, 0x2,0x29,0x27, 0x1,0x4f,0x71, 0x1,0x4f,0x7e, 0x1,0x4f,0x75, 0x1,0x4f,0x6e, 0x1,0x4f,0x6a, 0x4,0x28,0x3f, 0x3,0x2b,0x35, 0xf,0x29,0x2d, 0x3,0x2b,0x34, 0x3,0x64,0x4a, 0x4,0x28,0x3d, 0x2,0x29,0x31, 0x1,0x54,0x3a, 0x1,0x54,0x24, 0x3,0x2f,0x48, 0x1,0x54,0x34, 0x3,0x2f,0x4d, 0x1,0x54,0x39, 0x2,0x2d,0x71, 0x2,0x2d,0x70, 0x2,0x2d,0x75, 0x2,0x2d,0x76, 0x1,0x54,0x27, 0x3,0x2f,0x44, 0x1,0x54,0x30, 0x3,0x2f,0x58, 0x3,0x2f,0x4c, 0x3,0x2f,0x56, 0x1,0x54,0x3d, 0x3,0x2f,0x46, 0x1,0x54,0x31, 0x4,0x2b,0x62, 0x3,0x2f,0x4b, 0x3,0x2f,0x49, 0x3,0x2f,0x47, 0x2,0x2d,0x6a, 0x1,0x54,0x2a, 0x2,0x2d,0x6b, 0x3,0x2f,0x4f, 0x1,0x54,0x3f, 0x4,0x2b,0x64, 0x1,0x54,0x36, 0x1,0x54,0x21, 0x1,0x54,0x22, 0x2,0x2d,0x7e, 0x1,0x59,0x24, 0x3,0x2f,0x53, 0x1,0x54,0x2f, 0x1,0x54,0x2e, 0x2,0x2d,0x6c, 0x1,0x54,0x32, 0x2,0x33,0x5e, 0x1,0x54,0x29, 0x2,0x2d,0x77, 0x1,0x54,0x38, 0x1,0x54,0x37, 0x1,0x54,0x2d, 0x2,0x2d,0x6f, 0x2,0x2d,0x78, 0x3,0x2f,0x45, 0x2,0x2d,0x69, 0x1,0x54,0x2c, 0x2,0x2d,0x79, 0x1,0x54,0x35, 0x2,0x2d,0x6d, 0x1,0x54,0x23, 0x3,0x2f,0x4e, 0x1,0x54,0x26, 0x1,0x54,0x25, 0x2,0x2d,0x7a, 0x1,0x54,0x33, 0x1,0x54,0x28, 0x1,0x54,0x3c, 0x1,0x54,0x3e, 0x2,0x2d,0x74, 0x1,0x54,0x3b, 0x3,0x2f,0x51, 0x2,0x2d,0x7c, 0x2,0x2d,0x6e, 0x2,0x2d,0x7d, 0x3,0x2f,0x43, 0x2,0x2d,0x72, 0x4,0x2b,0x61, 0x2,0x2d,0x7b, 0x3,0x2f,0x50, 0x2,0x2d,0x73, 0x3,0x2f,0x54, 0x3,0x2f,0x55, 0x1,0x54,0x2b, 0x3,0x64,0x4b, 0x2,0x33,0x66, 0x2,0x33,0x5a, 0x3,0x34,0x3c, 0x1,0x58,0x76, 0x3,0x34,0x3f, 0x2,0x33,0x5f, 0x2,0x33,0x65, 0x1,0x58,0x75, 0x2,0x33,0x58, 0x1,0x58,0x79, 0x2,0x33,0x5c, 0x2,0x33,0x55, 0x1,0x58,0x77, 0x2,0x33,0x59, 0x1,0x58,0x7c, 0x1,0x59,0x23, 0x3,0x34,0x44, 0x2,0x33,0x6a, 0x3,0x34,0x41, 0x2,0x33,0x54, 0x3,0x34,0x42, 0x1,0x58,0x7d, 0x3,0x2f,0x57, 0x2,0x33,0x69, 0x3,0x34,0x47, 0x3,0x34,0x3d, 0x1,0x58,0x78, 0x2,0x33,0x5b, 0x1,0x58,0x74, 0x2,0x33,0x56, 0x2,0x33,0x52, 0x2,0x33,0x60, 0x2,0x33,0x53, 0x2,0x33,0x51, 0x2,0x33,0x5d, 0x2,0x33,0x63, 0x2,0x33,0x64, 0x1,0x58,0x7a, 0x3,0x34,0x40, 0x4,0x30,0x47, 0x2,0x3a,0x3f, 0x2,0x33,0x61, 0x2,0x33,0x50, 0x2,0x33,0x62, 0x3,0x34,0x4b, 0x1,0x59,0x26, 0x2,0x33,0x67, 0x1,0x59,0x25, 0x2,0x33,0x4f, 0x3,0x34,0x43, 0x2,0x33,0x57, 0x2,0x33,0x68, 0x1,0x59,0x21, 0x1,0x58,0x7e, 0x1,0x58,0x7b, 0x1,0x59,0x22, 0x3,0x34,0x4c, 0x3,0x34,0x4a, 0x1,0x58,0x72, 0x3,0x34,0x45, 0x3,0x34,0x46, 0x1,0x58,0x73, 0x1,0x5e,0x2e, 0x3,0x39,0x75, 0x2,0x3a,0x42, 0x2,0x3a,0x3b, 0x4,0x36,0x34, 0x1,0x5e,0x2b, 0x4,0x36,0x33, 0x2,0x3a,0x43, 0x3,0x39,0x71, 0x3,0x39,0x72, 0x4,0x36,0x36, 0x2,0x3a,0x39, 0x2,0x3a,0x3c, 0x1,0x5e,0x2a, 0x2,0x3a,0x3d, 0x3,0x39,0x6f, 0x4,0x36,0x31, 0x1,0x5e,0x2d, 0x2,0x3a,0x41, 0x4,0x36,0x3c, 0x2,0x3a,0x37, 0x2,0x3a,0x36, 0x1,0x5e,0x2f, 0x3,0x39,0x70, 0x1,0x5e,0x30, 0x1,0x5e,0x2c, 0x1,0x5e,0x31, 0x2,0x3a,0x35, 0x2,0x3a,0x40, 0x2,0x3a,0x3e, 0x2,0x3a,0x38, 0x4,0x36,0x39, 0x4,0x36,0x30, 0x4,0x36,0x3a, 0x1,0x5e,0x29, 0x2,0x3a,0x3a, 0x3,0x64,0x4d, 0x3,0x40,0x39, 0x3,0x40,0x3c, 0x1,0x63,0x31, 0x1,0x63,0x2b, 0x2,0x41,0x5c, 0x1,0x63,0x34, 0x2,0x41,0x62, 0x2,0x41,0x65, 0x1,0x63,0x2d, 0x1,0x63,0x2e, 0x2,0x41,0x5f, 0x1,0x63,0x2c, 0x2,0x41,0x68, 0x1,0x63,0x32, 0x2,0x41,0x69, 0x3,0x40,0x3a, 0x2,0x41,0x64, 0x1,0x63,0x33, 0x3,0x40,0x37, 0x2,0x41,0x59, 0x1,0x63,0x30, 0x2,0x41,0x5a, 0x4,0x3c,0x29, 0x2,0x41,0x63, 0x2,0x41,0x61, 0x3,0x40,0x3d, 0x2,0x41,0x5d, 0x1,0x63,0x2f, 0x2,0x41,0x5b, 0x1,0x63,0x35, 0x2,0x41,0x60, 0x2,0x41,0x67, 0x2,0x41,0x5e, 0x2,0x41,0x66, 0x3,0x40,0x36, 0x3,0x40,0x3e, 0x1,0x67,0x7c, 0x1,0x67,0x79, 0x3,0x45,0x6b, 0x1,0x67,0x7a, 0x4,0x42,0x2d, 0x2,0x49,0x21, 0x2,0x48,0x77, 0x1,0x67,0x78, 0x1,0x67,0x75, 0x2,0x48,0x78, 0x3,0x45,0x6e, 0x3,0x45,0x6c, 0x1,0x67,0x77, 0x2,0x48,0x7b, 0x3,0x45,0x6d, 0x2,0x48,0x7d, 0x3,0x45,0x76, 0x4,0x42,0x35, 0x2,0x49,0x26, 0x3,0x45,0x70, 0x3,0x45,0x75, 0x2,0x49,0x25, 0x2,0x48,0x7e, 0x1,0x67,0x74, 0x2,0x48,0x76, 0x1,0x67,0x72, 0x2,0x48,0x79, 0x1,0x67,0x7d, 0x2,0x48,0x7c, 0x3,0x45,0x71, 0x2,0x49,0x22, 0x1,0x67,0x76, 0x1,0x67,0x73, 0x2,0x49,0x24, 0x2,0x49,0x23, 0x1,0x67,0x7b, 0x2,0x48,0x7a, 0x3,0x45,0x74, 0x1,0x6c,0x23, 0x2,0x4f,0x54, 0x3,0x4b,0x29, 0x2,0x4f,0x51, 0x1,0x6c,0x24, 0x4,0x48,0x79, 0x1,0x6c,0x22, 0x3,0x4b,0x2b, 0x2,0x4f,0x58, 0x2,0x4f,0x55, 0x2,0x4f,0x4e, 0x1,0x6c,0x21, 0x3,0x4b,0x2d, 0x1,0x6c,0x25, 0x2,0x4f,0x4f, 0x1,0x6b,0x7e, 0x1,0x6c,0x28, 0x2,0x4f,0x52, 0x2,0x4f,0x53, 0x1,0x6c,0x26, 0x1,0x6c,0x27, 0x2,0x4f,0x59, 0x2,0x4f,0x56, 0x2,0x4f,0x57, 0x3,0x4b,0x2c, 0x3,0x4b,0x27, 0x3,0x64,0x4e, 0x1,0x70,0x33, 0x2,0x56,0x43, 0x1,0x70,0x30, 0x2,0x56,0x40, 0x1,0x70,0x32, 0x1,0x70,0x34, 0x3,0x50,0x31, 0x2,0x56,0x41, 0x1,0x70,0x31, 0x4,0x4f,0x5a, 0x2,0x56,0x42, 0x3,0x50,0x35, 0x2,0x56,0x3f, 0x3,0x50,0x30, 0x3,0x50,0x34, 0x1,0x73,0x41, 0x2,0x5c,0x49, 0x1,0x73,0x42, 0x2,0x5c,0x47, 0x4,0x55,0x65, 0x2,0x5c,0x48, 0x2,0x5c,0x46, 0x2,0x5c,0x45, 0x3,0x54,0x41, 0x3,0x54,0x40, 0x2,0x5c,0x4a, 0x1,0x73,0x40, 0x3,0x50,0x33, 0x4,0x55,0x69, 0x2,0x61,0x44, 0x2,0x61,0x45, 0x3,0x57,0x52, 0x2,0x4f,0x50, 0x2,0x61,0x43, 0x1,0x73,0x43, 0x1,0x78,0x2b, 0x2,0x65,0x37, 0x2,0x65,0x38, 0x3,0x5c,0x32, 0x1,0x7a,0x62, 0x1,0x7a,0x63, 0x2,0x6b,0x4f, 0x2,0x6b,0x4e, 0x1,0x7b,0x58, 0x1,0x7b,0x57, 0x2,0x6e,0x7d, 0x3,0x60,0x6f, 0x1,0x44,0x2a, 0x1,0x44,0x42, 0x1,0x44,0x78, 0x4,0x21,0x3d, 0x1,0x44,0x77, 0x1,0x45,0x73, 0x1,0x45,0x72, 0x1,0x47,0x3e, 0x1,0x47,0x3d, 0x1,0x47,0x3f, 0x1,0x47,0x3c, 0x3,0x22,0x78, 0x1,0x49,0x2c, 0x1,0x49,0x2b, 0x1,0x49,0x2d, 0x3,0x24,0x54, 0x4,0x23,0x3b, 0x3,0x24,0x53, 0x3,0x24,0x51, 0x1,0x4c,0x23, 0x4,0x25,0x3f, 0x1,0x4c,0x22, 0x1,0x4c,0x24, 0x3,0x27,0x52, 0x1,0x50,0x22, 0x4,0x28,0x40, 0x1,0x22,0x79, 0x2,0x2e,0x21, 0x1,0x22,0x7a, 0x1,0x59,0x27, 0x1,0x22,0x7c, 0x1,0x22,0x7b, 0x2,0x3a,0x44, 0x3,0x39,0x76, 0x1,0x22,0x7d, 0x1,0x67,0x7e, 0x1,0x22,0x7e, 0x3,0x5e,0x25, 0x1,0x44,0x2b, 0x3,0x21,0x34, 0x1,0x44,0x79, 0x1,0x47,0x40, 0x1,0x4c,0x25, 0x3,0x2b,0x37, 0x1,0x44,0x2c, 0x1,0x44,0x7c, 0x1,0x44,0x7a, 0x1,0x44,0x7b, 0x1,0x47,0x41, 0x3,0x22,0x7a, 0x4,0x22,0x34, 0x1,0x49,0x2e, 0x1,0x4c,0x27, 0x1,0x4c,0x26, 0x1,0x4c,0x28, 0x3,0x2e,0x7b, 0x1,0x54,0x40, 0x3,0x40,0x3f, 0x3,0x64,0x53, 0x1,0x70,0x35, 0x3,0x21,0x27, 0x4,0x21,0x3e, 0x3,0x21,0x4d, 0x3,0x21,0x48, 0x3,0x21,0x4e, 0x2,0x21,0x2e, 0x4,0x21,0x52, 0x1,0x45,0x74, 0x1,0x45,0x75, 0x3,0x21,0x78, 0x3,0x21,0x79, 0x1,0x47,0x42, 0x4,0x22,0x36, 0x2,0x23,0x2c, 0x3,0x27,0x55, 0x1,0x50,0x24, 0x1,0x50,0x23, 0x2,0x2e,0x23, 0x2,0x2e,0x22, 0x1,0x59,0x28, 0x3,0x21,0x28, 0x1,0x44,0x7d, 0x2,0x21,0x35, 0x3,0x21,0x7a, 0x3,0x24,0x57, 0x2,0x25,0x4d, 0x3,0x2b,0x39, 0x1,0x50,0x25, 0x3,0x2f,0x5b, 0x1,0x54,0x43, 0x3,0x2f,0x59, 0x1,0x54,0x41, 0x1,0x54,0x42, 0x3,0x2f,0x5a, 0x3,0x34,0x4d, 0xf,0x46,0x5c, 0x1,0x70,0x36, 0x1,0x27,0x2f, 0x1,0x45,0x76, 0x4,0x21,0x5e, 0x1,0x47,0x43, 0x2,0x21,0x7b, 0x3,0x22,0x7e, 0x3,0x22,0x7d, 0x3,0x22,0x7c, 0x3,0x24,0x59, 0x1,0x49,0x2f, 0x1,0x49,0x30, 0x3,0x24,0x5a, 0x2,0x23,0x2d, 0x4,0x23,0x3d, 0x2,0x25,0x4e, 0x1,0x4c,0x29, 0x2,0x25,0x4f, 0x4,0x25,0x40, 0x4,0x25,0x43, 0x3,0x2b,0x3b, 0x3,0x2b,0x3d, 0x3,0x2b,0x3e, 0x2,0x2e,0x25, 0x2,0x2e,0x26, 0x1,0x54,0x46, 0x3,0x2f,0x5e, 0x2,0x2e,0x27, 0x3,0x2f,0x5f, 0x2,0x2e,0x24, 0x1,0x54,0x47, 0x1,0x54,0x45, 0x1,0x54,0x44, 0x2,0x2e,0x28, 0x3,0x34,0x4f, 0x2,0x33,0x6b, 0x3,0x34,0x4e, 0x3,0x39,0x7d, 0x3,0x39,0x7a, 0x2,0x3a,0x45, 0x4,0x36,0x3f, 0x3,0x39,0x7e, 0x2,0x41,0x6a, 0x2,0x49,0x27, 0x3,0x4b,0x2f, 0x3,0x4b,0x2e, 0x3,0x4b,0x30, 0x1,0x6c,0x29, 0x1,0x70,0x37, 0x2,0x56,0x44, 0x3,0x54,0x42, 0x1,0x44,0x2d, 0x1,0x44,0x3b, 0x3,0x21,0x2f, 0x3,0x21,0x35, 0x3,0x21,0x51, 0x3,0x21,0x7b, 0x3,0x23,0x22, 0xf,0x22,0x59, 0x3,0x24,0x5b, 0x3,0x27,0x59, 0x4,0x25,0x45, 0x1,0x59,0x29, 0x1,0x5e,0x33, 0x6,0x46,0x65, 0x1,0x68,0x21, 0x3,0x45,0x7a, 0x2,0x21,0x23, 0x1,0x44,0x7e, 0x4,0x21,0x60, 0x1,0x45,0x79, 0x1,0x45,0x77, 0x1,0x45,0x78, 0x1,0x4c,0x2a, 0x3,0x27,0x5a, 0x1,0x44,0x2e, 0x1,0x44,0x2f, 0x4,0x21,0x2a, 0x1,0x44,0x43, 0x3,0x21,0x36, 0x3,0x21,0x52, 0x1,0x45,0x21, 0x1,0x45,0x22, 0x1,0x45,0x23, 0x2,0x21,0x4c, 0x1,0x45,0x7a, 0x3,0x21,0x7d, 0x2,0x21,0x4b, 0x1,0x47,0x47, 0x3,0x23,0x25, 0x2,0x21,0x7d, 0x1,0x47,0x45, 0x1,0x47,0x46, 0x2,0x21,0x7c, 0x3,0x23,0x24, 0x3,0x23,0x26, 0x1,0x47,0x48, 0x1,0x47,0x44, 0x3,0x23,0x27, 0x2,0x23,0x2e, 0x1,0x4f,0x4f, 0x2,0x23,0x2f, 0x3,0x24,0x5f, 0x3,0x24,0x61, 0x2,0x23,0x30, 0x4,0x23,0x40, 0x3,0x24,0x5c, 0x1,0x49,0x32, 0x1,0x49,0x31, 0x3,0x24,0x5e, 0x3,0x24,0x5d, 0x1,0x49,0x35, 0x1,0x49,0x33, 0x1,0x49,0x34, 0x3,0x24,0x60, 0x1,0x4c,0x30, 0x3,0x27,0x5b, 0x1,0x4c,0x2f, 0x2,0x25,0x54, 0x2,0x25,0x51, 0x2,0x25,0x52, 0x3,0x27,0x5e, 0x2,0x25,0x50, 0x1,0x4c,0x31, 0x1,0x4c,0x2d, 0x1,0x4c,0x2c, 0x3,0x27,0x5f, 0x1,0x4c,0x2e, 0x1,0x4c,0x2b, 0x3,0x27,0x5d, 0x4,0x25,0x4e, 0x3,0x64,0x4f, 0x1,0x4c,0x32, 0x1,0x50,0x27, 0x2,0x29,0x32, 0x3,0x2b,0x3f, 0x2,0x25,0x53, 0x1,0x50,0x2c, 0x3,0x2b,0x40, 0x2,0x29,0x33, 0x1,0x50,0x28, 0x1,0x50,0x2b, 0x1,0x50,0x2a, 0x1,0x50,0x29, 0x1,0x50,0x26, 0x3,0x2b,0x43, 0x2,0x2e,0x2b, 0x3,0x2f,0x68, 0x1,0x54,0x4a, 0x2,0x2e,0x2e, 0x1,0x54,0x48, 0x3,0x2f,0x65, 0x4,0x2b,0x6e, 0x3,0x2f,0x62, 0x2,0x2e,0x2a, 0x1,0x54,0x4b, 0x1,0x54,0x49, 0x1,0x54,0x4c, 0x2,0x2e,0x2c, 0x2,0x2e,0x2d, 0x3,0x2f,0x60, 0x2,0x2e,0x29, 0x2,0x2e,0x2f, 0x3,0x2f,0x66, 0x3,0x2f,0x61, 0x3,0x2f,0x63, 0xf,0x2e,0x2d, 0x3,0x2f,0x64, 0x3,0x34,0x50, 0x1,0x5e,0x37, 0x1,0x59,0x2a, 0x2,0x33,0x6c, 0x2,0x33,0x6e, 0x2,0x33,0x6d, 0x2,0x33,0x6f, 0x1,0x59,0x2b, 0x3,0x3a,0x23, 0x1,0x5e,0x34, 0x3,0x3a,0x21, 0x1,0x5e,0x35, 0x1,0x5e,0x36, 0x3,0x34,0x51, 0x1,0x63,0x37, 0x2,0x41,0x6c, 0x3,0x40,0x41, 0x2,0x41,0x6b, 0x2,0x41,0x6d, 0x2,0x41,0x6e, 0x1,0x63,0x38, 0x3,0x40,0x40, 0x1,0x63,0x36, 0x2,0x49,0x28, 0x2,0x49,0x29, 0x1,0x68,0x23, 0x1,0x68,0x22, 0x2,0x4c,0x61, 0x4,0x49,0x25, 0x3,0x4b,0x31, 0x1,0x6c,0x2a, 0x1,0x6c,0x2b, 0x1,0x6c,0x2c, 0x1,0x6c,0x2e, 0x2,0x4f,0x5a, 0x2,0x4f,0x5b, 0x1,0x6c,0x2d, 0x3,0x4b,0x32, 0x3,0x50,0x36, 0x1,0x70,0x38, 0x4,0x4f,0x64, 0x1,0x70,0x39, 0x3,0x50,0x37, 0x4,0x55,0x6d, 0x2,0x65,0x39, 0x2,0x6b,0x51, 0x2,0x6b,0x50, 0x2,0x6e,0x7e, 0x3,0x60,0x2c, 0x1,0x44,0x30, 0x3,0x21,0x37, 0x3,0x21,0x54, 0x3,0x21,0x53, 0x1,0x45,0x7c, 0x1,0x45,0x7b, 0x1,0x47,0x49, 0x4,0x22,0x42, 0x4,0x22,0x3f, 0x2,0x21,0x7e, 0x4,0x22,0x41, 0x3,0x23,0x28, 0x1,0x49,0x37, 0x1,0x49,0x38, 0x1,0x49,0x36, 0x1,0x49,0x39, 0x2,0x23,0x31, 0x2,0x23,0x32, 0x4,0x23,0x46, 0x4,0x23,0x47, 0x4,0x23,0x48, 0x3,0x24,0x63, 0x3,0x24,0x62, 0x3,0x27,0x61, 0x5,0x25,0x3a, 0x5,0x25,0x37, 0x5,0x25,0x38, 0x3,0x27,0x60, 0x5,0x25,0x3b, 0x1,0x4c,0x34, 0x2,0x25,0x55, 0x4,0x25,0x50, 0x1,0x4c,0x33, 0x3,0x27,0x62, 0x2,0x29,0x34, 0x1,0x50,0x30, 0x2,0x29,0x35, 0x1,0x50,0x2f, 0x3,0x2b,0x48, 0x3,0x2b,0x46, 0x4,0x28,0x49, 0x1,0x50,0x2d, 0x4,0x28,0x4b, 0x1,0x50,0x2e, 0x3,0x2b,0x47, 0x3,0x2f,0x6f, 0x2,0x2e,0x30, 0x3,0x2f,0x6c, 0x3,0x2f,0x6a, 0x3,0x2f,0x6d, 0x3,0x2f,0x6e, 0x1,0x59,0x2c, 0x2,0x33,0x71, 0x3,0x34,0x52, 0x1,0x59,0x2f, 0x2,0x33,0x70, 0x1,0x5b,0x2b, 0x1,0x59,0x2e, 0x1,0x59,0x2d, 0x1,0x5e,0x3a, 0x5,0x36,0x6a, 0x1,0x5e,0x39, 0x1,0x5e,0x38, 0x1,0x63,0x39, 0x3,0x40,0x45, 0x3,0x40,0x44, 0x1,0x63,0x3c, 0x1,0x63,0x3d, 0x1,0x63,0x3b, 0x4,0x3c,0x3c, 0x1,0x63,0x3a, 0x3,0x40,0x46, 0x5,0x44,0x67, 0x2,0x49,0x2a, 0x3,0x46,0x21, 0x2,0x49,0x2b, 0x5,0x44,0x63, 0x3,0x45,0x7e, 0x3,0x4b,0x33, 0x2,0x4f,0x5d, 0x1,0x6c,0x2f, 0x2,0x4f,0x5c, 0x3,0x4d,0x2c, 0x1,0x70,0x3a, 0x2,0x5c,0x4b, 0x1,0x73,0x44, 0x5,0x53,0x62, 0x2,0x65,0x3a, 0x1,0x79,0x61, 0x1,0x27,0x34, 0x1,0x44,0x44, 0x1,0x45,0x24, 0x2,0x21,0x36, 0x3,0x21,0x55, 0x1,0x45,0x25, 0x1,0x45,0x26, 0x3,0x21,0x56, 0xf,0x21,0x30, 0x3,0x22,0x23, 0x3,0x22,0x22, 0x1,0x45,0x7d, 0x1,0x45,0x7e, 0x3,0x22,0x24, 0x1,0x47,0x4a, 0x2,0x23,0x33, 0x2,0x25,0x56, 0x2,0x25,0x57, 0x4,0x25,0x51, 0x1,0x50,0x31, 0x2,0x2e,0x31, 0x1,0x59,0x31, 0x1,0x59,0x30, 0x2,0x3a,0x47, 0x2,0x3a,0x46, 0x6,0x50,0x74, 0x3,0x50,0x38, 0x1,0x44,0x31, 0x1,0x45,0x27, 0x1,0x46,0x21, 0x4,0x30,0x5e, 0x1,0x59,0x32, 0x2,0x21,0x24, 0x4,0x21,0x65, 0x2,0x21,0x4d, 0x1,0x46,0x22, 0x3,0x22,0x26, 0x2,0x22,0x22, 0x1,0x47,0x4c, 0x1,0x47,0x4b, 0x2,0x22,0x21, 0x1,0x49,0x3a, 0x3,0x64,0x50, 0x3,0x24,0x65, 0x3,0x2b,0x49, 0x4,0x28,0x4e, 0x4,0x28,0x50, 0x1,0x54,0x4d, 0x4,0x2b,0x78, 0x4,0x30,0x5f, 0x2,0x33,0x72, 0x1,0x63,0x3e, 0x2,0x49,0x2c, 0x1,0x68,0x24, 0x3,0x46,0x23, 0x3,0x4b,0x34, 0x2,0x56,0x45, 0x3,0x54,0x44, 0x3,0x5c,0x34, 0x2,0x68,0x6a, 0x3,0x21,0x29, 0x1,0x45,0x28, 0x3,0x21,0x57, 0x3,0x24,0x66, 0x2,0x25,0x58, 0x2,0x29,0x36, 0x1,0x59,0x35, 0x1,0x59,0x33, 0x1,0x59,0x34, 0x1,0x44,0x32, 0x4,0x21,0x30, 0x1,0x44,0x45, 0x1,0x24,0x3f, 0x1,0x45,0x2b, 0x3,0x21,0x59, 0x1,0x45,0x2a, 0x1,0x45,0x29, 0x1,0x46,0x25, 0x1,0x46,0x24, 0x3,0x23,0x2a, 0x2,0x21,0x4e, 0x2,0x22,0x23, 0xf,0x22,0x2c, 0x3,0x23,0x2b, 0x3,0x23,0x2d, 0x1,0x4c,0x38, 0x1,0x4c,0x35, 0x1,0x4c,0x37, 0x1,0x4c,0x36, 0x3,0x27,0x63, 0x1,0x50,0x32, 0x3,0x2b,0x4a, 0x4,0x30,0x60, 0x1,0x5e,0x3b, 0x4,0x66,0x30, 0x1,0x44,0x33, 0x3,0x21,0x5a, 0x1,0x45,0x2c, 0x3,0x22,0x27, 0x1,0x46,0x27, 0x1,0x46,0x26, 0x2,0x23,0x34, 0x4,0x23,0x4d, 0x3,0x64,0x51, 0x1,0x4c,0x39, 0x3,0x2a,0x5c, 0x4,0x30,0x64, 0x3,0x21,0x2a, 0x4,0x21,0x31, 0x2,0x21,0x37, 0x3,0x22,0x28, 0x1,0x46,0x29, 0x1,0x46,0x28, 0x1,0x47,0x4d, 0x1,0x47,0x4e, 0x2,0x23,0x35, 0x1,0x49,0x3b, 0x3,0x24,0x67, 0x1,0x49,0x3c, 0x3,0x27,0x65, 0x1,0x4c,0x3a, 0x1,0x4c,0x3b, 0x1,0x4c,0x3c, 0x3,0x27,0x66, 0x1,0x50,0x33, 0x2,0x29,0x37, 0x3,0x2b,0x4b, 0x4,0x30,0x65, 0x1,0x54,0x4e, 0x3,0x40,0x47, 0x2,0x21,0x25, 0x4,0x21,0x44, 0x1,0x45,0x2d, 0x3,0x21,0x5b, 0x4,0x21,0x67, 0x4,0x21,0x66, 0x3,0x22,0x29, 0x2,0x22,0x24, 0x3,0x23,0x2f, 0x2,0x23,0x36, 0x2,0x23,0x37, 0x2,0x25,0x59, 0x3,0x27,0x67, 0x2,0x25,0x5a, 0x2,0x29,0x39, 0x2,0x29,0x38, 0x2,0x29,0x3b, 0x2,0x29,0x3a, 0x1,0x50,0x34, 0x3,0x64,0x52, 0x2,0x33,0x73, 0x1,0x54,0x50, 0x2,0x2e,0x32, 0x1,0x54,0x4f, 0x3,0x34,0x54, 0x4,0x30,0x68, 0x2,0x3a,0x48, 0x1,0x5e,0x3c, 0x3,0x3a,0x28, 0x2,0x3a,0x49, 0x3,0x3a,0x27, 0x3,0x40,0x4a, 0x3,0x40,0x49, 0x3,0x40,0x48, 0x2,0x49,0x2d, 0x1,0x68,0x25, 0x3,0x46,0x25, 0x4,0x3c,0x40, 0x3,0x46,0x26, 0x3,0x4b,0x35, 0x1,0x6c,0x30, 0x3,0x54,0x45, 0x2,0x65,0x3b, 0xf,0x6d,0x2e, 0x3,0x21,0x2b, 0x3,0x21,0x5c, 0x4,0x21,0x45, 0x2,0x21,0x38, 0x3,0x22,0x2a, 0x1,0x46,0x2a, 0x4,0x22,0x48, 0x3,0x23,0x31, 0x4,0x25,0x59, 0x3,0x27,0x69, 0x3,0x27,0x6a, 0x1,0x59,0x36, 0x3,0x34,0x55, 0x3,0x3a,0x29, 0x1,0x44,0x34, 0x1,0x44,0x46, 0x1,0x45,0x2f, 0x1,0x45,0x2e, 0x3,0x21,0x5e, 0x1,0x45,0x30, 0x3,0x21,0x60, 0x4,0x21,0x69, 0x3,0x22,0x2b, 0x3,0x23,0x33, 0x4,0x23,0x4f, 0x1,0x4c,0x3e, 0x3,0x27,0x6b, 0x1,0x4c,0x3d, 0x1,0x4c,0x3f, 0x3,0x2b,0x50, 0x3,0x2b,0x4f, 0x1,0x50,0x35, 0x3,0x2b,0x4e, 0x3,0x2b,0x4d, 0x6,0x35,0x78, 0x1,0x54,0x51, 0x3,0x40,0x4b, 0x2,0x56,0x46, 0x1,0x76,0x3b, 0x1,0x44,0x47, 0x1,0x46,0x2c, 0x1,0x46,0x3b, 0x1,0x46,0x36, 0x4,0x21,0x6c, 0x1,0x46,0x31, 0x1,0x46,0x30, 0x1,0x46,0x37, 0x1,0x46,0x35, 0x1,0x46,0x2e, 0x1,0x46,0x3c, 0x1,0x46,0x2f, 0x1,0x46,0x2b, 0x1,0x46,0x3a, 0x1,0x46,0x39, 0x1,0x46,0x38, 0x1,0x46,0x2d, 0x3,0x22,0x31, 0x1,0x46,0x34, 0x3,0x22,0x2d, 0x3,0x22,0x2e, 0x1,0x46,0x33, 0x3,0x22,0x2f, 0xf,0x21,0x50, 0x1,0x46,0x3d, 0x1,0x46,0x32, 0x4,0x21,0x6a, 0x3,0x23,0x35, 0x3,0x23,0x37, 0x1,0x47,0x54, 0x4,0x22,0x4c, 0x1,0x47,0x5a, 0x1,0x47,0x56, 0x3,0x23,0x39, 0x1,0x47,0x5c, 0x2,0x22,0x25, 0x1,0x47,0x59, 0x1,0x47,0x4f, 0x1,0x47,0x52, 0x1,0x47,0x55, 0x1,0x47,0x51, 0x1,0x47,0x58, 0x1,0x47,0x5b, 0x1,0x47,0x50, 0x1,0x47,0x53, 0x1,0x47,0x57, 0x1,0x47,0x5d, 0x3,0x23,0x3a, 0x3,0x23,0x3b, 0x3,0x23,0x34, 0x2,0x23,0x40, 0x2,0x23,0x3d, 0x3,0x24,0x76, 0x1,0x49,0x49, 0x2,0x23,0x3e, 0x1,0x49,0x3d, 0x1,0x49,0x3f, 0x1,0x49,0x57, 0x1,0x49,0x52, 0x3,0x24,0x79, 0x3,0x24,0x7e, 0x3,0x24,0x75, 0x2,0x23,0x45, 0x2,0x23,0x3f, 0x1,0x49,0x41, 0x1,0x49,0x43, 0x2,0x23,0x44, 0x1,0x49,0x4a, 0x2,0x23,0x3a, 0x1,0x49,0x56, 0x1,0x49,0x58, 0x1,0x49,0x3e, 0x1,0x49,0x4f, 0x3,0x25,0x24, 0x2,0x23,0x38, 0x1,0x49,0x55, 0x3,0x24,0x77, 0x1,0x49,0x46, 0x3,0x24,0x7b, 0x1,0x49,0x50, 0x1,0x49,0x51, 0x2,0x23,0x39, 0x1,0x49,0x4e, 0x1,0x49,0x4c, 0x3,0x24,0x70, 0x1,0x49,0x4d, 0x1,0x49,0x53, 0x2,0x23,0x41, 0x1,0x49,0x40, 0x3,0x25,0x21, 0x1,0x49,0x54, 0x2,0x23,0x43, 0x1,0x49,0x48, 0x1,0x49,0x45, 0x3,0x24,0x73, 0x2,0x23,0x3c, 0x1,0x49,0x44, 0x2,0x23,0x46, 0x1,0x49,0x47, 0x3,0x24,0x7c, 0x1,0x49,0x4b, 0x3,0x24,0x78, 0x3,0x24,0x74, 0x3,0x24,0x6d, 0x1,0x49,0x42, 0x2,0x23,0x42, 0x3,0x24,0x7d, 0x3,0x25,0x22, 0x2,0x23,0x3b, 0x3,0x25,0x23, 0x4,0x25,0x64, 0x4,0x25,0x63, 0x3,0x27,0x6e, 0x2,0x25,0x6b, 0x2,0x25,0x6a, 0x1,0x4c,0x51, 0x2,0x25,0x6d, 0x2,0x25,0x6f, 0x2,0x25,0x64, 0x2,0x25,0x67, 0x2,0x25,0x6e, 0x1,0x4c,0x52, 0x3,0x27,0x74, 0x3,0x27,0x78, 0x2,0x25,0x61, 0x2,0x25,0x65, 0x3,0x27,0x75, 0x4,0x25,0x5f, 0x2,0x25,0x69, 0x2,0x29,0x4a, 0x1,0x4c,0x4d, 0x2,0x29,0x4e, 0x1,0x4c,0x40, 0x2,0x25,0x66, 0x1,0x4c,0x41, 0x1,0x4c,0x4e, 0x1,0x4c,0x47, 0x1,0x4c,0x43, 0x3,0x27,0x71, 0x2,0x25,0x62, 0x1,0x4c,0x46, 0x1,0x4c,0x4b, 0x1,0x4c,0x54, 0x2,0x25,0x63, 0x2,0x25,0x5c, 0x1,0x4c,0x45, 0x2,0x25,0x5d, 0x2,0x25,0x5f, 0x4,0x25,0x60, 0x1,0x4c,0x48, 0x3,0x27,0x6c, 0x1,0x4c,0x4a, 0x2,0x25,0x5b, 0x2,0x25,0x60, 0x3,0x27,0x70, 0x3,0x27,0x79, 0x1,0x4c,0x53, 0x1,0x4c,0x4f, 0x2,0x25,0x68, 0x1,0x4c,0x55, 0x3,0x27,0x73, 0x1,0x4c,0x4c, 0x2,0x25,0x5e, 0x1,0x4c,0x49, 0x3,0x27,0x6f, 0x3,0x27,0x77, 0x1,0x4c,0x44, 0x1,0x4c,0x42, 0x2,0x25,0x6c, 0x1,0x4c,0x50, 0xf,0x25,0x71, 0x3,0x2b,0x5c, 0x3,0x2b,0x5d, 0x2,0x29,0x49, 0x2,0x29,0x3d, 0x2,0x29,0x4c, 0x3,0x2b,0x57, 0x3,0x2b,0x59, 0x2,0x29,0x3f, 0x1,0x50,0x3c, 0x1,0x50,0x4a, 0x1,0x50,0x38, 0x1,0x50,0x49, 0x1,0x50,0x41, 0x1,0x50,0x46, 0x1,0x50,0x36, 0x2,0x29,0x3e, 0x2,0x29,0x44, 0x1,0x50,0x45, 0x2,0x29,0x50, 0x1,0x50,0x47, 0x3,0x2b,0x5b, 0x1,0x50,0x3d, 0x3,0x2b,0x54, 0x3,0x2b,0x5e, 0x2,0x29,0x46, 0x2,0x29,0x43, 0x1,0x50,0x3b, 0x3,0x2b,0x51, 0x2,0x29,0x3c, 0x1,0x50,0x48, 0x2,0x29,0x4b, 0x1,0x50,0x40, 0x2,0x29,0x4d, 0x1,0x50,0x4b, 0x1,0x50,0x37, 0x1,0x50,0x42, 0x1,0x50,0x3f, 0x2,0x29,0x41, 0x1,0x50,0x43, 0x2,0x29,0x47, 0x2,0x29,0x48, 0x1,0x50,0x3e, 0x1,0x50,0x44, 0x1,0x50,0x3a, 0x3,0x2b,0x55, 0x3,0x64,0x54, 0x3,0x2b,0x63, 0x3,0x2b,0x61, 0x1,0x50,0x39, 0x2,0x29,0x40, 0x3,0x2b,0x53, 0x2,0x29,0x45, 0x3,0x2b,0x58, 0x2,0x29,0x4f, 0x2,0x2e,0x46, 0x1,0x54,0x5e, 0x2,0x2e,0x34, 0x4,0x2c,0x2d, 0x2,0x2e,0x39, 0x1,0x54,0x57, 0x1,0x54,0x62, 0x2,0x2e,0x37, 0x1,0x54,0x52, 0x1,0x54,0x5c, 0x1,0x54,0x61, 0x2,0x2e,0x3e, 0x4,0x2c,0x26, 0x1,0x54,0x5d, 0x1,0x54,0x60, 0x3,0x2f,0x77, 0x3,0x30,0x21, 0x2,0x2e,0x41, 0x1,0x54,0x58, 0x2,0x2e,0x38, 0x3,0x2f,0x74, 0x3,0x2f,0x78, 0x3,0x30,0x22, 0x2,0x2e,0x44, 0x2,0x2e,0x45, 0x3,0x2f,0x79, 0x1,0x54,0x5a, 0x2,0x2e,0x43, 0x1,0x54,0x56, 0x1,0x54,0x65, 0x4,0x2c,0x29, 0x2,0x2e,0x3b, 0x3,0x2f,0x7b, 0x1,0x54,0x54, 0x3,0x2f,0x7a, 0x2,0x2e,0x48, 0x2,0x2e,0x3c, 0x2,0x2e,0x40, 0x1,0x54,0x59, 0x1,0x54,0x64, 0x2,0x2e,0x3d, 0x1,0x54,0x5f, 0x2,0x2e,0x42, 0x2,0x2e,0x49, 0x2,0x34,0x24, 0x3,0x2f,0x73, 0x2,0x2e,0x47, 0x1,0x54,0x66, 0x1,0x54,0x53, 0x2,0x2e,0x3f, 0x2,0x2e,0x36, 0x3,0x2f,0x76, 0x1,0x54,0x5b, 0x4,0x2c,0x28, 0x4,0x2c,0x2e, 0x2,0x2e,0x35, 0x3,0x2f,0x7e, 0x3,0x30,0x25, 0x2,0x2e,0x3a, 0xf,0x29,0x54, 0xf,0x2e,0x42, 0xf,0x2e,0x4a, 0x2,0x2e,0x33, 0x1,0x54,0x63, 0x3,0x67,0x21, 0x3,0x34,0x5f, 0x2,0x33,0x7a, 0x3,0x34,0x68, 0x1,0x59,0x49, 0x2,0x34,0x2a, 0x1,0x59,0x47, 0x1,0x59,0x44, 0x2,0x34,0x21, 0x1,0x59,0x40, 0x2,0x34,0x25, 0x1,0x59,0x4b, 0x2,0x33,0x79, 0x2,0x33,0x7e, 0x2,0x33,0x7d, 0x1,0x54,0x55, 0x1,0x59,0x46, 0x2,0x34,0x28, 0x3,0x34,0x66, 0x2,0x34,0x2b, 0x2,0x33,0x76, 0x4,0x30,0x77, 0x1,0x5e,0x4e, 0x3,0x34,0x67, 0x2,0x34,0x2c, 0x1,0x59,0x4c, 0x4,0x30,0x72, 0x1,0x59,0x3e, 0x1,0x59,0x3b, 0x2,0x34,0x23, 0x1,0x59,0x38, 0x4,0x30,0x74, 0x2,0x34,0x29, 0x3,0x34,0x5b, 0x1,0x59,0x3f, 0x2,0x34,0x2d, 0x3,0x34,0x58, 0x2,0x33,0x77, 0x2,0x34,0x27, 0x1,0x59,0x42, 0x2,0x33,0x78, 0x2,0x33,0x7b, 0x2,0x34,0x22, 0x3,0x34,0x62, 0x3,0x34,0x61, 0x1,0x59,0x43, 0x1,0x59,0x41, 0x1,0x59,0x4d, 0x3,0x34,0x57, 0x3,0x3a,0x36, 0x3,0x34,0x64, 0x4,0x30,0x6b, 0x1,0x59,0x48, 0x3,0x34,0x5e, 0x1,0x59,0x3c, 0x1,0x5a,0x76, 0x4,0x30,0x7a, 0x1,0x59,0x3d, 0x2,0x33,0x7c, 0x1,0x59,0x4a, 0x1,0x59,0x45, 0x2,0x34,0x26, 0x1,0x59,0x3a, 0x3,0x34,0x59, 0x1,0x59,0x39, 0x3,0x64,0x57, 0x3,0x64,0x56, 0x3,0x67,0x22, 0x3,0x64,0x55, 0x2,0x33,0x74, 0x2,0x33,0x75, 0x2,0x3a,0x4e, 0x3,0x3a,0x3c, 0x1,0x5e,0x3d, 0x1,0x5e,0x40, 0x2,0x3a,0x59, 0x1,0x5e,0x54, 0x2,0x3a,0x5c, 0x1,0x5e,0x3e, 0x2,0x3a,0x55, 0x1,0x5e,0x44, 0x1,0x5e,0x4a, 0x1,0x61,0x43, 0x3,0x3a,0x31, 0x3,0x3a,0x38, 0x1,0x5e,0x48, 0x2,0x3a,0x52, 0x1,0x5e,0x55, 0x1,0x5e,0x41, 0x1,0x5e,0x49, 0x2,0x3a,0x5a, 0x2,0x41,0x7c, 0x2,0x3a,0x5f, 0x2,0x3a,0x53, 0x4,0x36,0x5c, 0x2,0x3a,0x4a, 0x2,0x3a,0x57, 0x2,0x3a,0x51, 0x1,0x5e,0x47, 0x2,0x3a,0x5d, 0x3,0x3a,0x2e, 0x3,0x3a,0x2a, 0x1,0x5e,0x43, 0x1,0x5e,0x57, 0x1,0x5e,0x50, 0x3,0x3a,0x33, 0x1,0x5e,0x45, 0x1,0x5e,0x42, 0x3,0x3a,0x40, 0x1,0x5e,0x4d, 0x3,0x3a,0x34, 0x2,0x3a,0x5e, 0x2,0x3a,0x50, 0x2,0x3a,0x56, 0x2,0x3a,0x58, 0x2,0x3a,0x4c, 0x2,0x3a,0x5b, 0x1,0x5e,0x3f, 0x2,0x3a,0x4b, 0x3,0x3a,0x42, 0x1,0x5e,0x46, 0x1,0x5e,0x56, 0x1,0x5e,0x52, 0x2,0x3a,0x4d, 0x1,0x5e,0x4c, 0x3,0x3a,0x3b, 0xf,0x39,0x71, 0x1,0x5e,0x53, 0x1,0x5e,0x4f, 0x1,0x5e,0x4b, 0x3,0x3a,0x2f, 0x2,0x3a,0x54, 0x6,0x47,0x29, 0x3,0x67,0x23, 0x1,0x5e,0x51, 0x2,0x41,0x7a, 0x2,0x41,0x76, 0x3,0x40,0x51, 0x2,0x42,0x27, 0x2,0x41,0x6f, 0x2,0x41,0x78, 0x1,0x63,0x4c, 0x1,0x63,0x4d, 0x1,0x63,0x45, 0x2,0x42,0x23, 0x1,0x63,0x4f, 0x2,0x41,0x74, 0x2,0x41,0x73, 0x2,0x41,0x71, 0x2,0x42,0x25, 0x1,0x63,0x43, 0x2,0x41,0x7d, 0x2,0x41,0x72, 0x1,0x63,0x46, 0x2,0x41,0x7b, 0x1,0x63,0x41, 0x2,0x41,0x77, 0x2,0x41,0x7e, 0x2,0x42,0x22, 0x3,0x40,0x4e, 0x4,0x3c,0x4b, 0x2,0x42,0x26, 0x1,0x63,0x4a, 0x2,0x41,0x70, 0x1,0x63,0x44, 0x2,0x41,0x75, 0x3,0x3a,0x2b, 0x1,0x63,0x3f, 0x6,0x51,0x43, 0x1,0x63,0x4b, 0x2,0x42,0x21, 0x1,0x63,0x47, 0x1,0x63,0x48, 0x1,0x63,0x4e, 0x1,0x63,0x42, 0x1,0x23,0x21, 0x1,0x63,0x40, 0x2,0x41,0x79, 0x3,0x40,0x4c, 0x3,0x67,0x25, 0x1,0x63,0x49, 0x3,0x67,0x24, 0xf,0x40,0x62, 0x2,0x42,0x24, 0x3,0x64,0x58, 0x1,0x68,0x35, 0x1,0x68,0x30, 0x3,0x46,0x2e, 0x2,0x49,0x3c, 0x2,0x49,0x38, 0x3,0x46,0x28, 0x2,0x49,0x32, 0x1,0x68,0x2a, 0x1,0x68,0x26, 0x2,0x49,0x3b, 0x1,0x68,0x27, 0x2,0x49,0x35, 0x2,0x49,0x37, 0x3,0x46,0x29, 0x2,0x49,0x3a, 0x3,0x46,0x36, 0x1,0x68,0x2c, 0x3,0x46,0x2c, 0x1,0x68,0x33, 0x1,0x68,0x2d, 0x4,0x42,0x57, 0x3,0x46,0x2a, 0x2,0x49,0x30, 0x1,0x68,0x2e, 0x1,0x68,0x2f, 0x2,0x49,0x33, 0x1,0x68,0x34, 0x3,0x46,0x34, 0x2,0x49,0x31, 0x2,0x49,0x36, 0x1,0x68,0x2b, 0x2,0x49,0x2f, 0x1,0x68,0x31, 0x1,0x68,0x29, 0x3,0x46,0x33, 0x4,0x42,0x4b, 0x1,0x68,0x28, 0x2,0x49,0x34, 0x2,0x49,0x39, 0x3,0x46,0x31, 0x1,0x68,0x32, 0x3,0x64,0x5a, 0x3,0x64,0x59, 0x3,0x46,0x50, 0x2,0x49,0x2e, 0x3,0x46,0x30, 0x1,0x6c,0x37, 0x2,0x4f,0x6e, 0x3,0x4b,0x41, 0x2,0x4f,0x6b, 0x3,0x4b,0x38, 0x1,0x6c,0x31, 0x1,0x6c,0x3d, 0x1,0x6c,0x3e, 0x3,0x4b,0x3d, 0x1,0x6c,0x34, 0x2,0x4f,0x69, 0x1,0x6c,0x36, 0x2,0x4f,0x61, 0x1,0x6c,0x3c, 0x3,0x4b,0x44, 0x2,0x4f,0x6d, 0x1,0x6c,0x33, 0x2,0x4f,0x6f, 0x1,0x6c,0x32, 0x4,0x49,0x31, 0x2,0x4f,0x6a, 0x2,0x4f,0x6c, 0x1,0x6c,0x35, 0x2,0x4f,0x68, 0x2,0x4f,0x62, 0x2,0x4f,0x5f, 0x4,0x49,0x2e, 0x3,0x4b,0x3e, 0x2,0x3a,0x4f, 0x2,0x4f,0x65, 0x3,0x4b,0x37, 0x2,0x4f,0x5e, 0x2,0x4f,0x64, 0x2,0x4f,0x63, 0x3,0x4b,0x3b, 0x2,0x4f,0x60, 0x3,0x4b,0x43, 0x1,0x6c,0x39, 0x3,0x4b,0x45, 0x3,0x4b,0x40, 0x3,0x46,0x35, 0x3,0x4b,0x3c, 0x1,0x6c,0x38, 0x3,0x4b,0x39, 0x7,0x21,0x63, 0x3,0x4b,0x3f, 0x1,0x6c,0x3a, 0x2,0x4f,0x66, 0x1,0x70,0x3b, 0x2,0x4f,0x67, 0x2,0x56,0x4f, 0x3,0x50,0x3f, 0x2,0x56,0x48, 0x3,0x50,0x40, 0x1,0x70,0x47, 0x2,0x56,0x4c, 0x1,0x70,0x3f, 0x1,0x70,0x43, 0x2,0x56,0x4b, 0x3,0x50,0x3b, 0x1,0x70,0x42, 0x1,0x70,0x3e, 0x1,0x70,0x41, 0x1,0x70,0x3c, 0x1,0x70,0x46, 0x2,0x56,0x4d, 0x2,0x56,0x49, 0x1,0x70,0x45, 0x2,0x56,0x47, 0x1,0x70,0x44, 0x2,0x56,0x4e, 0x2,0x56,0x4a, 0x1,0x6c,0x3b, 0x4,0x4f,0x71, 0x1,0x70,0x48, 0x2,0x56,0x50, 0x1,0x70,0x40, 0x1,0x70,0x3d, 0xf,0x53,0x5d, 0x3,0x50,0x3d, 0x3,0x54,0x48, 0x2,0x5c,0x52, 0x2,0x5c,0x54, 0x1,0x73,0x46, 0x2,0x5c,0x55, 0x2,0x5c,0x53, 0x2,0x5c,0x51, 0x2,0x5c,0x50, 0x1,0x73,0x48, 0x2,0x5c,0x4f, 0x1,0x73,0x49, 0x4,0x55,0x74, 0x3,0x54,0x49, 0x3,0x54,0x47, 0x4,0x55,0x78, 0x2,0x5c,0x4d, 0x2,0x5c,0x4e, 0x1,0x73,0x45, 0x1,0x73,0x4a, 0x1,0x73,0x47, 0x3,0x64,0x5d, 0x3,0x64,0x5b, 0x2,0x5c,0x4c, 0x3,0x57,0x5b, 0x1,0x76,0x3c, 0x3,0x57,0x5a, 0x2,0x61,0x48, 0x2,0x61,0x46, 0x2,0x61,0x4b, 0x2,0x61,0x49, 0x3,0x57,0x58, 0x2,0x61,0x47, 0x2,0x61,0x4a, 0x3,0x57,0x59, 0x3,0x57,0x57, 0x3,0x57,0x5c, 0x1,0x78,0x2c, 0x2,0x65,0x3e, 0x2,0x65,0x3f, 0x1,0x78,0x2d, 0x4,0x5f,0x4d, 0x2,0x65,0x40, 0x2,0x65,0x3c, 0x2,0x65,0x41, 0x2,0x65,0x3d, 0x1,0x76,0x3d, 0x3,0x5a,0x2d, 0x3,0x64,0x5e, 0x4,0x63,0x31, 0x2,0x68,0x6b, 0x2,0x68,0x6d, 0x1,0x79,0x64, 0x2,0x68,0x6c, 0x1,0x79,0x63, 0x1,0x79,0x62, 0x3,0x67,0x26, 0x3,0x67,0x27, 0x3,0x64,0x5c, 0x3,0x5e,0x26, 0x1,0x79,0x65, 0x2,0x6b,0x53, 0x2,0x6b,0x54, 0x4,0x66,0x34, 0x1,0x7a,0x65, 0x1,0x7a,0x64, 0x1,0x7a,0x66, 0x2,0x6b,0x52, 0x3,0x67,0x28, 0x2,0x6d,0x46, 0x2,0x6d,0x45, 0x3,0x5f,0x40, 0x1,0x7b,0x59, 0x1,0x7b,0x5b, 0x1,0x7b,0x5a, 0x2,0x6d,0x47, 0x1,0x7c,0x34, 0x2,0x70,0x34, 0x4,0x6a,0x44, 0x4,0x6a,0x43, 0x1,0x7c,0x5d, 0x3,0x60,0x71, 0x2,0x70,0x33, 0x2,0x70,0x7c, 0x2,0x21,0x2a, 0x3,0x21,0x77, 0x4,0x21,0x6f, 0x1,0x46,0x3f, 0x1,0x46,0x3e, 0x4,0x21,0x6d, 0x1,0x47,0x60, 0x1,0x47,0x5f, 0x2,0x22,0x27, 0x1,0x47,0x5e, 0x2,0x22,0x26, 0x3,0x23,0x3e, 0x1,0x49,0x5b, 0x2,0x23,0x49, 0x3,0x25,0x2c, 0x2,0x23,0x48, 0xf,0x23,0x50, 0x3,0x25,0x26, 0x1,0x49,0x59, 0x1,0x49,0x5c, 0x3,0x25,0x2b, 0x3,0x25,0x2a, 0x2,0x23,0x47, 0x3,0x25,0x29, 0x1,0x49,0x5a, 0x3,0x25,0x48, 0x3,0x25,0x27, 0x3,0x25,0x28, 0x3,0x28,0x22, 0x2,0x25,0x70, 0x3,0x27,0x7d, 0x2,0x25,0x71, 0x1,0x4c,0x56, 0x3,0x27,0x7c, 0x3,0x28,0x21, 0x3,0x27,0x7b, 0x1,0x50,0x4c, 0x3,0x2b,0x65, 0x2,0x2e,0x4a, 0x2,0x2e,0x4b, 0x1,0x54,0x67, 0x1,0x54,0x68, 0x3,0x30,0x27, 0x2,0x34,0x2f, 0x1,0x59,0x4e, 0x1,0x59,0x50, 0x2,0x34,0x2e, 0x1,0x59,0x4f, 0x2,0x3a,0x60, 0x1,0x5e,0x58, 0x3,0x3a,0x44, 0x3,0x3a,0x43, 0x4,0x36,0x68, 0x4,0x3c,0x52, 0x1,0x63,0x50, 0x1,0x63,0x51, 0x2,0x42,0x28, 0x3,0x40,0x52, 0x1,0x68,0x37, 0x3,0x46,0x37, 0x1,0x68,0x36, 0x2,0x4f,0x70, 0x2,0x56,0x52, 0x2,0x56,0x51, 0x3,0x5f,0x41, 0x2,0x71,0x5a, 0x1,0x44,0x48, 0x2,0x21,0x39, 0x3,0x21,0x61, 0x2,0x21,0x4f, 0x2,0x21,0x50, 0x3,0x22,0x34, 0x4,0x21,0x70, 0x4,0x21,0x71, 0x1,0x47,0x63, 0x1,0x47,0x67, 0x2,0x22,0x29, 0x4,0x22,0x51, 0x1,0x47,0x65, 0x1,0x47,0x64, 0x2,0x22,0x28, 0x1,0x47,0x66, 0x1,0x47,0x62, 0x3,0x23,0x41, 0x3,0x23,0x42, 0x1,0x47,0x61, 0x2,0x22,0x2a, 0x3,0x23,0x3f, 0x3,0x23,0x40, 0x1,0x49,0x66, 0x3,0x25,0x31, 0x3,0x25,0x3e, 0x1,0x49,0x63, 0x3,0x25,0x30, 0x1,0x49,0x5f, 0x2,0x23,0x4a, 0x3,0x25,0x40, 0x3,0x25,0x36, 0x3,0x25,0x2f, 0x2,0x23,0x4b, 0x3,0x25,0x3c, 0x1,0x49,0x61, 0x3,0x25,0x2d, 0x2,0x23,0x4d, 0x1,0x49,0x5d, 0x2,0x23,0x4e, 0x2,0x23,0x4c, 0x1,0x49,0x60, 0x1,0x49,0x62, 0x1,0x49,0x65, 0x1,0x49,0x64, 0x1,0x49,0x5e, 0x2,0x23,0x4f, 0x3,0x25,0x32, 0x3,0x25,0x41, 0x3,0x25,0x42, 0x3,0x25,0x33, 0x3,0x25,0x38, 0x3,0x25,0x37, 0x3,0x64,0x5f, 0xf,0x23,0x52, 0x3,0x25,0x35, 0x1,0x4c,0x5b, 0x2,0x25,0x7e, 0x3,0x28,0x25, 0x1,0x4c,0x5d, 0x3,0x28,0x23, 0x1,0x4c,0x5c, 0x3,0x28,0x26, 0x2,0x26,0x21, 0x1,0x4c,0x5a, 0x1,0x4c,0x59, 0x2,0x25,0x75, 0x4,0x25,0x69, 0x2,0x25,0x74, 0x3,0x28,0x28, 0x2,0x25,0x72, 0x2,0x25,0x77, 0x2,0x25,0x76, 0x2,0x25,0x73, 0x2,0x25,0x7c, 0x2,0x25,0x7d, 0x2,0x25,0x7a, 0x2,0x25,0x78, 0x1,0x4c,0x58, 0x3,0x28,0x29, 0x4,0x25,0x66, 0x4,0x25,0x68, 0x2,0x25,0x7b, 0x1,0x4c,0x5e, 0x2,0x26,0x22, 0x4,0x25,0x65, 0x3,0x28,0x2a, 0x2,0x25,0x79, 0x3,0x28,0x24, 0x1,0x50,0x4d, 0x1,0x4c,0x57, 0x4,0x25,0x6e, 0xf,0x26,0x33, 0x3,0x64,0x60, 0x1,0x50,0x4e, 0x2,0x29,0x55, 0x3,0x2b,0x69, 0x3,0x2b,0x68, 0x2,0x29,0x5b, 0x3,0x2b,0x6c, 0x3,0x2b,0x67, 0x3,0x2b,0x6a, 0x1,0x50,0x54, 0x2,0x29,0x59, 0x2,0x29,0x5f, 0x3,0x2b,0x71, 0x2,0x29,0x56, 0x2,0x29,0x5a, 0x2,0x29,0x5c, 0x2,0x29,0x5e, 0x2,0x29,0x58, 0x3,0x2b,0x70, 0x2,0x29,0x57, 0x2,0x29,0x52, 0x2,0x29,0x53, 0x1,0x50,0x4f, 0x3,0x2b,0x6b, 0x1,0x50,0x51, 0x1,0x50,0x50, 0x2,0x29,0x54, 0x2,0x29,0x5d, 0x3,0x2b,0x6d, 0x3,0x2b,0x72, 0x3,0x2b,0x6e, 0x4,0x28,0x60, 0xf,0x29,0x6a, 0xf,0x29,0x71, 0x3,0x2b,0x66, 0x1,0x50,0x53, 0x4,0x28,0x5e, 0x2,0x29,0x51, 0x2,0x2e,0x55, 0x3,0x30,0x2a, 0x2,0x2e,0x54, 0x2,0x2e,0x59, 0x2,0x2e,0x50, 0x3,0x30,0x30, 0x2,0x2e,0x53, 0x2,0x2e,0x52, 0x3,0x30,0x2f, 0x2,0x2e,0x56, 0x3,0x30,0x38, 0x2,0x2e,0x5a, 0x1,0x54,0x69, 0x1,0x54,0x6c, 0x3,0x30,0x34, 0x3,0x30,0x35, 0x2,0x2e,0x51, 0x2,0x2e,0x57, 0x3,0x30,0x33, 0x3,0x30,0x28, 0x3,0x30,0x37, 0x1,0x54,0x6b, 0x2,0x2e,0x4c, 0x3,0x30,0x2b, 0x1,0x50,0x52, 0x2,0x34,0x3d, 0x2,0x2e,0x58, 0x3,0x30,0x36, 0x2,0x2e,0x4f, 0x4,0x2c,0x33, 0x1,0x54,0x6a, 0x2,0x2e,0x4e, 0xf,0x2e,0x5c, 0x3,0x30,0x32, 0x2,0x34,0x34, 0x3,0x34,0x6e, 0x3,0x34,0x71, 0x1,0x59,0x51, 0x1,0x59,0x55, 0x2,0x34,0x44, 0x2,0x34,0x32, 0x2,0x34,0x40, 0x1,0x59,0x56, 0x2,0x34,0x42, 0x3,0x34,0x72, 0x2,0x34,0x48, 0x3,0x34,0x74, 0x2,0x34,0x4c, 0x3,0x34,0x69, 0x4,0x30,0x7b, 0x2,0x34,0x43, 0x2,0x34,0x37, 0x2,0x34,0x3f, 0x3,0x34,0x6b, 0x2,0x34,0x4d, 0x2,0x34,0x4b, 0x2,0x34,0x41, 0x2,0x34,0x3c, 0x2,0x34,0x35, 0x2,0x3a,0x68, 0x2,0x34,0x33, 0x1,0x59,0x5a, 0x2,0x34,0x3a, 0x1,0x59,0x5b, 0x1,0x59,0x57, 0x2,0x34,0x30, 0x2,0x34,0x46, 0x2,0x34,0x38, 0x3,0x34,0x6f, 0x3,0x34,0x75, 0x2,0x34,0x36, 0x2,0x34,0x49, 0x1,0x59,0x58, 0x3,0x34,0x76, 0x2,0x34,0x4f, 0x1,0x59,0x52, 0x1,0x59,0x54, 0x2,0x34,0x3e, 0x2,0x34,0x39, 0x1,0x54,0x6d, 0x1,0x59,0x53, 0x2,0x34,0x3b, 0x2,0x34,0x4a, 0x2,0x34,0x4e, 0x2,0x34,0x45, 0x3,0x64,0x61, 0x2,0x34,0x47, 0x3,0x64,0x62, 0x3,0x64,0x63, 0x2,0x34,0x31, 0x4,0x36,0x69, 0x3,0x3a,0x4a, 0x2,0x3a,0x63, 0x3,0x3a,0x45, 0x2,0x3a,0x6c, 0x2,0x3a,0x6b, 0x1,0x5e,0x60, 0x2,0x3a,0x64, 0x3,0x3a,0x47, 0x1,0x5e,0x61, 0x1,0x5e,0x5f, 0x3,0x3a,0x50, 0x2,0x3a,0x66, 0x1,0x5e,0x5c, 0x2,0x3a,0x6a, 0x3,0x3a,0x4c, 0x2,0x3a,0x65, 0x2,0x3a,0x67, 0x2,0x3a,0x61, 0x1,0x5e,0x5a, 0x4,0x36,0x6f, 0x2,0x3a,0x74, 0x2,0x3a,0x73, 0x2,0x3a,0x70, 0x1,0x5e,0x59, 0x1,0x5e,0x5d, 0x1,0x5e,0x5e, 0x2,0x2e,0x4d, 0x2,0x3a,0x6d, 0x1,0x5e,0x5b, 0x1,0x59,0x59, 0x2,0x3a,0x6f, 0x2,0x3a,0x62, 0x2,0x3a,0x72, 0x2,0x3a,0x71, 0x3,0x3a,0x4e, 0x2,0x3a,0x75, 0x3,0x3a,0x49, 0x2,0x42,0x36, 0x3,0x3a,0x4b, 0x2,0x3a,0x6e, 0xf,0x39,0x7d, 0xf,0x39,0x7e, 0x4,0x3c,0x57, 0x4,0x36,0x6d, 0x4,0x36,0x71, 0x3,0x64,0x64, 0x2,0x3a,0x69, 0x2,0x42,0x2e, 0x1,0x63,0x5b, 0x1,0x63,0x5e, 0x1,0x63,0x59, 0x2,0x42,0x2d, 0x2,0x42,0x31, 0x2,0x42,0x2c, 0x3,0x40,0x57, 0x1,0x63,0x53, 0x1,0x63,0x5d, 0x2,0x42,0x29, 0x1,0x63,0x57, 0x2,0x42,0x30, 0x3,0x40,0x5b, 0x1,0x63,0x55, 0x1,0x63,0x54, 0x2,0x42,0x33, 0x1,0x63,0x56, 0x2,0x42,0x35, 0x3,0x40,0x56, 0x2,0x42,0x32, 0x1,0x63,0x52, 0x3,0x40,0x5e, 0x3,0x40,0x5c, 0x3,0x40,0x58, 0x1,0x63,0x5c, 0x2,0x42,0x37, 0x2,0x42,0x2b, 0x2,0x42,0x34, 0x3,0x40,0x5d, 0x4,0x3c,0x53, 0x2,0x42,0x2a, 0x3,0x40,0x5a, 0x3,0x40,0x59, 0x1,0x63,0x58, 0x3,0x40,0x54, 0x1,0x63,0x5a, 0x2,0x42,0x2f, 0x2,0x42,0x38, 0x3,0x46,0x43, 0x3,0x46,0x3e, 0x2,0x49,0x44, 0x1,0x68,0x38, 0x2,0x49,0x4a, 0x3,0x46,0x42, 0x3,0x46,0x3c, 0x1,0x68,0x3d, 0x2,0x49,0x46, 0x2,0x49,0x4d, 0x2,0x49,0x3e, 0x1,0x68,0x3f, 0x1,0x68,0x39, 0x2,0x49,0x43, 0x1,0x6c,0x3f, 0x2,0x49,0x42, 0x2,0x49,0x4b, 0x1,0x68,0x3a, 0x3,0x46,0x3d, 0x1,0x68,0x3e, 0x2,0x49,0x41, 0x2,0x49,0x47, 0x2,0x49,0x4c, 0x2,0x49,0x3d, 0x1,0x68,0x3c, 0x2,0x49,0x45, 0x3,0x46,0x3a, 0x3,0x46,0x45, 0x2,0x49,0x49, 0x2,0x49,0x4f, 0x2,0x49,0x3f, 0x2,0x49,0x48, 0x3,0x46,0x38, 0x1,0x68,0x3b, 0x2,0x49,0x4e, 0x3,0x46,0x41, 0x3,0x46,0x44, 0x3,0x46,0x40, 0x2,0x49,0x40, 0x4,0x42,0x59, 0x3,0x64,0x65, 0x1,0x6c,0x43, 0x2,0x4f,0x72, 0x1,0x6c,0x41, 0x1,0x6c,0x40, 0x2,0x4f,0x74, 0x2,0x4f,0x79, 0x3,0x4b,0x46, 0x2,0x4f,0x75, 0x3,0x4b,0x50, 0x2,0x4f,0x78, 0x1,0x6c,0x46, 0x3,0x4b,0x51, 0x1,0x70,0x2e, 0x1,0x6c,0x45, 0x3,0x4b,0x4b, 0x2,0x4f,0x71, 0x2,0x4f,0x77, 0x3,0x46,0x3f, 0x1,0x6c,0x44, 0x2,0x4f,0x76, 0x3,0x4b,0x4d, 0x2,0x4f,0x73, 0x3,0x4b,0x49, 0x1,0x6c,0x42, 0x3,0x4b,0x4f, 0x3,0x4b,0x4c, 0x3,0x4b,0x47, 0x2,0x56,0x57, 0x3,0x50,0x4a, 0x2,0x56,0x59, 0x2,0x56,0x54, 0x1,0x70,0x4a, 0x2,0x56,0x56, 0x3,0x50,0x4b, 0x1,0x70,0x49, 0x2,0x56,0x58, 0x3,0x50,0x48, 0x3,0x50,0x4c, 0x1,0x70,0x4c, 0x2,0x56,0x5a, 0x1,0x70,0x4b, 0x2,0x56,0x53, 0x2,0x56,0x55, 0x3,0x50,0x49, 0x3,0x54,0x4b, 0x1,0x73,0x4e, 0x2,0x5c,0x58, 0x3,0x54,0x4c, 0x1,0x73,0x4d, 0x2,0x5c,0x59, 0x1,0x73,0x4c, 0x2,0x5c,0x57, 0x1,0x73,0x4b, 0x2,0x5c,0x56, 0x1,0x76,0x3f, 0x1,0x76,0x3e, 0x2,0x65,0x42, 0x2,0x65,0x44, 0x3,0x5a,0x2f, 0x2,0x65,0x43, 0x1,0x78,0x2e, 0x1,0x78,0x2f, 0x3,0x5a,0x2e, 0x7,0x46,0x45, 0x1,0x78,0x30, 0x2,0x68,0x6e, 0x1,0x79,0x66, 0x3,0x5e,0x28, 0x2,0x6f,0x22, 0x2,0x6f,0x21, 0x1,0x7c,0x5e, 0x1,0x44,0x49, 0x1,0x45,0x31, 0x3,0x23,0x43, 0x1,0x49,0x67, 0x3,0x25,0x45, 0x3,0x25,0x43, 0x3,0x25,0x44, 0x3,0x28,0x2d, 0x2,0x29,0x60, 0x3,0x2b,0x77, 0x3,0x34,0x77, 0x1,0x5e,0x62, 0x1,0x5e,0x63, 0x3,0x3a,0x52, 0x2,0x42,0x39, 0x1,0x68,0x40, 0x2,0x49,0x50, 0x2,0x4f,0x7a, 0x3,0x64,0x66, 0x3,0x50,0x4d, 0x3,0x21,0x39, 0x2,0x21,0x3a, 0x3,0x22,0x35, 0x3,0x23,0x44, 0x2,0x23,0x50, 0x3,0x2b,0x7a, 0x3,0x2b,0x79, 0x3,0x21,0x3a, 0x3,0x25,0x46, 0x2,0x26,0x23, 0x2,0x29,0x61, 0x2,0x2e,0x5b, 0x1,0x54,0x6e, 0x3,0x46,0x46, 0x3,0x65,0x60, 0x2,0x65,0x45, 0x4,0x5f,0x52, 0x1,0x7a,0x67, 0x1,0x44,0x4a, 0x1,0x46,0x40, 0x2,0x21,0x51, 0x3,0x22,0x36, 0x1,0x47,0x68, 0x1,0x47,0x69, 0x4,0x22,0x52, 0x1,0x4c,0x5f, 0x4,0x25,0x70, 0x3,0x34,0x79, 0x1,0x59,0x5c, 0x5,0x37,0x3d, 0x1,0x68,0x42, 0x3,0x40,0x5f, 0x1,0x68,0x43, 0x1,0x68,0x41, 0x3,0x4b,0x53, 0x1,0x44,0x4b, 0x4,0x21,0x49, 0x1,0x45,0x32, 0x1,0x45,0x34, 0x1,0x45,0x33, 0x2,0x21,0x3b, 0x1,0x45,0x35, 0x1,0x46,0x41, 0x2,0x21,0x52, 0x3,0x22,0x38, 0x1,0x46,0x42, 0x3,0x22,0x37, 0x4,0x21,0x72, 0x3,0x22,0x39, 0x4,0x22,0x53, 0x3,0x23,0x47, 0x1,0x47,0x6a, 0x1,0x47,0x6b, 0x2,0x22,0x2b, 0x3,0x25,0x49, 0x1,0x49,0x68, 0x4,0x23,0x62, 0x2,0x23,0x51, 0x4,0x25,0x75, 0x1,0x4c,0x63, 0x2,0x26,0x24, 0x4,0x25,0x72, 0x1,0x4c,0x61, 0x1,0x4c,0x62, 0x1,0x4c,0x60, 0x2,0x2e,0x5c, 0x3,0x28,0x2e, 0x3,0x28,0x2f, 0x3,0x64,0x67, 0x1,0x50,0x58, 0x1,0x50,0x57, 0x1,0x50,0x59, 0x1,0x50,0x56, 0x3,0x2b,0x7c, 0x2,0x29,0x62, 0x1,0x4c,0x64, 0x1,0x50,0x55, 0x1,0x54,0x6f, 0x1,0x54,0x70, 0x4,0x2c,0x38, 0x1,0x54,0x71, 0x3,0x34,0x7b, 0x2,0x34,0x50, 0x3,0x34,0x7c, 0x3,0x34,0x7d, 0x4,0x31,0x26, 0x1,0x5e,0x64, 0x2,0x3a,0x76, 0x1,0x59,0x5d, 0x3,0x3a,0x53, 0x3,0x3a,0x54, 0x4,0x36,0x79, 0x3,0x40,0x60, 0x1,0x63,0x5f, 0x3,0x40,0x61, 0x1,0x68,0x45, 0x1,0x68,0x44, 0x2,0x49,0x51, 0x3,0x46,0x48, 0x1,0x6c,0x47, 0x1,0x70,0x4d, 0x4,0x4f,0x7b, 0x2,0x61,0x4c, 0x2,0x6d,0x48, 0x2,0x6f,0x23, 0x1,0x44,0x4c, 0x1,0x46,0x43, 0x3,0x22,0x3b, 0x1,0x46,0x44, 0x2,0x22,0x31, 0x1,0x47,0x6d, 0x1,0x47,0x70, 0x3,0x23,0x4b, 0x2,0x22,0x2f, 0x2,0x22,0x2d, 0x1,0x47,0x6f, 0x2,0x22,0x30, 0x2,0x22,0x32, 0x2,0x22,0x2c, 0x1,0x47,0x72, 0x1,0x47,0x71, 0x1,0x47,0x6e, 0x1,0x47,0x6c, 0x2,0x22,0x2e, 0x3,0x23,0x4d, 0x3,0x25,0x55, 0x1,0x49,0x73, 0x4,0x23,0x67, 0x3,0x25,0x4c, 0x1,0x49,0x70, 0x2,0x23,0x56, 0x2,0x23,0x59, 0x2,0x23,0x58, 0x4,0x23,0x69, 0x1,0x49,0x6a, 0x1,0x49,0x72, 0x3,0x25,0x4b, 0x4,0x23,0x6a, 0x1,0x49,0x6f, 0x2,0x23,0x55, 0x2,0x23,0x53, 0x1,0x49,0x6e, 0x3,0x25,0x56, 0x3,0x25,0x53, 0x3,0x25,0x4e, 0x1,0x49,0x69, 0x1,0x49,0x6c, 0x3,0x25,0x51, 0x2,0x23,0x54, 0x2,0x23,0x5b, 0x2,0x23,0x57, 0x1,0x49,0x6d, 0x1,0x49,0x71, 0x1,0x49,0x74, 0x2,0x23,0x52, 0x2,0x23,0x5a, 0x1,0x49,0x6b, 0x3,0x28,0x41, 0x3,0x28,0x33, 0x1,0x4c,0x69, 0x1,0x4c,0x71, 0x3,0x28,0x38, 0x2,0x26,0x30, 0x2,0x26,0x29, 0x1,0x4c,0x72, 0x2,0x26,0x34, 0x2,0x26,0x25, 0x2,0x26,0x2c, 0x3,0x28,0x45, 0x3,0x28,0x40, 0x1,0x4c,0x68, 0x2,0x26,0x26, 0x1,0x4c,0x66, 0x2,0x26,0x2d, 0x2,0x26,0x31, 0x1,0x4c,0x65, 0x3,0x28,0x3d, 0x2,0x26,0x32, 0x2,0x26,0x2b, 0x3,0x28,0x37, 0x2,0x26,0x2e, 0x3,0x28,0x35, 0x1,0x4c,0x74, 0x1,0x4c,0x6b, 0x2,0x26,0x35, 0x2,0x26,0x33, 0x3,0x28,0x3f, 0x1,0x4c,0x70, 0x1,0x4c,0x6e, 0x2,0x26,0x2a, 0x1,0x4c,0x6d, 0x2,0x26,0x28, 0x2,0x26,0x27, 0x1,0x4c,0x6c, 0x1,0x4c,0x6a, 0x1,0x4c,0x73, 0x1,0x4c,0x6f, 0x1,0x4c,0x67, 0x3,0x2c,0x26, 0x2,0x26,0x2f, 0x3,0x28,0x46, 0x1,0x50,0x5b, 0x3,0x2c,0x2d, 0x1,0x50,0x62, 0x2,0x29,0x70, 0x1,0x50,0x5a, 0x2,0x29,0x68, 0x2,0x29,0x64, 0x3,0x2c,0x21, 0x2,0x29,0x74, 0x2,0x29,0x63, 0x3,0x2c,0x2c, 0x1,0x50,0x5d, 0x2,0x29,0x6d, 0x1,0x50,0x60, 0x1,0x50,0x63, 0x3,0x2c,0x2e, 0x1,0x50,0x5e, 0x2,0x29,0x71, 0x1,0x50,0x61, 0x3,0x2c,0x23, 0x1,0x54,0x78, 0x2,0x29,0x77, 0x2,0x29,0x65, 0x3,0x2c,0x24, 0x3,0x2c,0x25, 0x2,0x29,0x67, 0x2,0x29,0x6e, 0x2,0x29,0x72, 0x2,0x29,0x76, 0x2,0x29,0x73, 0x2,0x29,0x6c, 0x2,0x29,0x6f, 0x3,0x2c,0x2b, 0x3,0x2c,0x29, 0x2,0x29,0x69, 0x1,0x50,0x65, 0x2,0x29,0x6b, 0x2,0x29,0x6a, 0x2,0x29,0x75, 0x1,0x50,0x5c, 0x2,0x29,0x66, 0x1,0x50,0x64, 0x3,0x2c,0x2a, 0x1,0x50,0x5f, 0x3,0x2c,0x28, 0x1,0x54,0x7e, 0x2,0x2e,0x64, 0x3,0x30,0x40, 0x1,0x54,0x7d, 0x3,0x2c,0x27, 0x4,0x2c,0x40, 0x2,0x2e,0x62, 0x4,0x2c,0x3e, 0x1,0x54,0x72, 0x3,0x30,0x4f, 0x1,0x54,0x77, 0x3,0x30,0x4a, 0x2,0x2e,0x61, 0x2,0x2e,0x5e, 0x2,0x2e,0x63, 0x1,0x54,0x73, 0x2,0x2e,0x5d, 0x3,0x30,0x4e, 0x1,0x54,0x76, 0x1,0x54,0x74, 0x3,0x30,0x3e, 0x2,0x2e,0x65, 0x1,0x54,0x75, 0x1,0x54,0x79, 0x3,0x30,0x3b, 0x3,0x30,0x45, 0x1,0x54,0x7a, 0x3,0x30,0x48, 0x1,0x54,0x7c, 0x3,0x30,0x52, 0x4,0x2c,0x39, 0x4,0x2c,0x3d, 0x1,0x54,0x7b, 0x3,0x30,0x3c, 0x3,0x35,0x22, 0x3,0x35,0x38, 0x2,0x2e,0x5f, 0x2,0x2e,0x60, 0x3,0x30,0x4d, 0x6,0x36,0x57, 0x3,0x30,0x4b, 0x2,0x2e,0x66, 0x2,0x34,0x57, 0x1,0x59,0x5e, 0x2,0x3b,0x26, 0x2,0x34,0x56, 0x2,0x34,0x69, 0x3,0x35,0x28, 0x3,0x35,0x24, 0x1,0x59,0x64, 0x3,0x35,0x31, 0x2,0x34,0x67, 0x3,0x35,0x33, 0x1,0x59,0x63, 0x1,0x59,0x5f, 0x2,0x34,0x70, 0x2,0x34,0x60, 0x2,0x34,0x63, 0x3,0x35,0x2e, 0x1,0x59,0x67, 0x2,0x34,0x6d, 0x2,0x34,0x65, 0x1,0x59,0x60, 0x1,0x59,0x68, 0x3,0x35,0x2a, 0x2,0x34,0x6a, 0x2,0x34,0x68, 0x3,0x35,0x2f, 0x3,0x35,0x3b, 0x2,0x34,0x59, 0x2,0x34,0x6e, 0x2,0x34,0x62, 0x2,0x34,0x5d, 0x3,0x35,0x3a, 0x2,0x34,0x53, 0x2,0x34,0x6f, 0x2,0x34,0x5f, 0x2,0x34,0x52, 0x3,0x35,0x39, 0x1,0x59,0x66, 0x2,0x34,0x64, 0x2,0x34,0x71, 0x2,0x34,0x61, 0x2,0x34,0x55, 0x2,0x34,0x5a, 0x2,0x34,0x51, 0x3,0x35,0x27, 0x1,0x59,0x65, 0x3,0x35,0x3c, 0x2,0x34,0x5e, 0x2,0x34,0x5b, 0x1,0x59,0x61, 0x2,0x34,0x54, 0x3,0x35,0x30, 0x2,0x34,0x6c, 0x1,0x59,0x62, 0x3,0x35,0x2b, 0x2,0x34,0x5c, 0x2,0x34,0x58, 0x3,0x35,0x29, 0x3,0x35,0x34, 0x2,0x34,0x6b, 0x3,0x35,0x32, 0xf,0x33,0x73, 0x3,0x35,0x37, 0x3,0x35,0x35, 0x1,0x5e,0x65, 0x2,0x3a,0x7d, 0x3,0x3a,0x75, 0x2,0x3a,0x7a, 0x2,0x3b,0x2d, 0x2,0x3b,0x21, 0x2,0x3b,0x2e, 0x3,0x3a,0x7c, 0x1,0x5e,0x67, 0x3,0x3a,0x63, 0x3,0x3a,0x61, 0x3,0x3a,0x58, 0x2,0x3b,0x2a, 0x2,0x3b,0x27, 0x3,0x3a,0x5b, 0x3,0x3a,0x77, 0x3,0x3a,0x72, 0x3,0x3a,0x59, 0x3,0x3a,0x60, 0x2,0x3b,0x28, 0x2,0x3b,0x2b, 0x2,0x3b,0x2f, 0x3,0x3a,0x7b, 0x2,0x34,0x66, 0x2,0x3b,0x31, 0x2,0x42,0x4d, 0x3,0x3a,0x66, 0x1,0x5e,0x68, 0x2,0x3b,0x32, 0x2,0x3a,0x78, 0x2,0x3b,0x24, 0x3,0x3a,0x62, 0x2,0x3b,0x29, 0x3,0x3a,0x5c, 0x3,0x3a,0x5e, 0x1,0x5e,0x66, 0x1,0x5e,0x69, 0x2,0x3b,0x30, 0x2,0x3b,0x33, 0x2,0x3a,0x7c, 0x2,0x3a,0x79, 0x3,0x3a,0x73, 0x3,0x3a,0x5a, 0x2,0x3a,0x7b, 0x3,0x3a,0x57, 0x3,0x3a,0x7a, 0x2,0x3b,0x22, 0x2,0x3a,0x7e, 0x1,0x5e,0x6a, 0x3,0x3a,0x56, 0x2,0x3b,0x2c, 0x3,0x3a,0x79, 0x3,0x3a,0x78, 0x2,0x3b,0x23, 0x2,0x3b,0x25, 0x2,0x3a,0x77, 0x2,0x42,0x41, 0x2,0x42,0x3f, 0x1,0x63,0x68, 0x1,0x63,0x66, 0x2,0x42,0x49, 0x2,0x42,0x40, 0x2,0x42,0x4a, 0x2,0x42,0x46, 0x2,0x42,0x3e, 0x2,0x42,0x4c, 0x2,0x42,0x3d, 0x2,0x42,0x44, 0x1,0x63,0x65, 0x1,0x63,0x64, 0x1,0x63,0x63, 0x2,0x42,0x42, 0x2,0x42,0x47, 0x1,0x63,0x60, 0x1,0x63,0x67, 0x3,0x40,0x67, 0x2,0x42,0x3b, 0x3,0x40,0x66, 0x2,0x42,0x45, 0x2,0x42,0x3a, 0x2,0x42,0x43, 0x1,0x63,0x61, 0x2,0x42,0x48, 0x2,0x42,0x3c, 0x1,0x63,0x62, 0x2,0x42,0x4b, 0x3,0x40,0x64, 0x3,0x3a,0x6b, 0x3,0x40,0x6a, 0x3,0x64,0x68, 0x3,0x64,0x69, 0x2,0x49,0x55, 0x1,0x68,0x4a, 0x1,0x68,0x49, 0x1,0x68,0x4b, 0x2,0x49,0x61, 0x2,0x49,0x57, 0x2,0x49,0x5d, 0x2,0x49,0x52, 0x2,0x49,0x60, 0x2,0x49,0x5f, 0x2,0x49,0x63, 0x2,0x49,0x5c, 0x1,0x68,0x46, 0x2,0x49,0x5b, 0x1,0x68,0x4c, 0x3,0x46,0x4c, 0x2,0x49,0x54, 0x1,0x68,0x47, 0x3,0x46,0x4a, 0x2,0x49,0x62, 0x1,0x68,0x48, 0x2,0x49,0x56, 0x2,0x49,0x59, 0x2,0x49,0x5e, 0x2,0x49,0x58, 0x2,0x49,0x53, 0x3,0x46,0x4f, 0x3,0x46,0x53, 0x2,0x49,0x5a, 0x2,0x4f,0x7c, 0x1,0x6c,0x4b, 0x2,0x50,0x21, 0x2,0x4f,0x7e, 0x2,0x50,0x23, 0x2,0x50,0x25, 0x3,0x4b,0x5c, 0x1,0x6c,0x49, 0x3,0x4b,0x58, 0x2,0x4f,0x7d, 0x3,0x4b,0x54, 0x2,0x4f,0x7b, 0x3,0x4b,0x5e, 0x2,0x50,0x26, 0x2,0x50,0x24, 0x2,0x50,0x22, 0x3,0x4b,0x56, 0x2,0x50,0x28, 0x3,0x4b,0x5a, 0x2,0x50,0x27, 0x1,0x6c,0x4d, 0x1,0x6c,0x48, 0x3,0x4b,0x5b, 0x1,0x6c,0x4a, 0x1,0x6c,0x4c, 0x3,0x4b,0x5d, 0x3,0x4b,0x5f, 0x2,0x50,0x29, 0x2,0x56,0x61, 0x3,0x50,0x50, 0x3,0x50,0x53, 0x2,0x56,0x60, 0x2,0x56,0x5f, 0x3,0x50,0x51, 0x2,0x56,0x62, 0x2,0x56,0x5b, 0x3,0x50,0x4f, 0x2,0x56,0x5c, 0x2,0x56,0x64, 0x2,0x56,0x5d, 0x3,0x50,0x54, 0x1,0x70,0x4e, 0x2,0x56,0x66, 0x3,0x50,0x4e, 0x2,0x56,0x65, 0x2,0x56,0x5e, 0x3,0x50,0x56, 0x2,0x5c,0x5d, 0x1,0x73,0x51, 0x2,0x5c,0x5b, 0x2,0x5c,0x60, 0x2,0x5c,0x5f, 0x2,0x56,0x63, 0x3,0x54,0x50, 0x1,0x73,0x50, 0x3,0x54,0x4e, 0x2,0x5c,0x5e, 0x2,0x5c,0x5a, 0x2,0x5c,0x62, 0x2,0x5c,0x61, 0x1,0x73,0x4f, 0x3,0x54,0x52, 0x2,0x5c,0x5c, 0x3,0x54,0x4f, 0x1,0x70,0x4f, 0x3,0x54,0x51, 0x3,0x54,0x53, 0x1,0x76,0x40, 0x3,0x5a,0x31, 0x3,0x57,0x61, 0x3,0x57,0x5e, 0x2,0x61,0x4d, 0x2,0x65,0x46, 0x2,0x65,0x47, 0x2,0x65,0x48, 0x1,0x79,0x67, 0x4,0x63,0x34, 0x3,0x5c,0x36, 0x1,0x79,0x68, 0x3,0x5c,0x39, 0x2,0x68,0x6f, 0x3,0x5c,0x3a, 0x2,0x6b,0x56, 0x2,0x6b,0x55, 0x3,0x5e,0x29, 0x3,0x5f,0x42, 0x2,0x6d,0x49, 0x2,0x6d,0x4a, 0x2,0x6f,0x24, 0x2,0x70,0x35, 0x3,0x60,0x73, 0x1,0x44,0x4d, 0x1,0x44,0x4e, 0x4,0x21,0x32, 0x1,0x44,0x4f, 0x1,0x45,0x36, 0x1,0x46,0x45, 0x2,0x22,0x33, 0x1,0x47,0x73, 0x1,0x47,0x74, 0x1,0x49,0x77, 0x1,0x49,0x78, 0x1,0x49,0x76, 0x1,0x49,0x75, 0x1,0x4c,0x75, 0x3,0x28,0x48, 0x4,0x26,0x22, 0x2,0x26,0x36, 0x1,0x4c,0x77, 0x1,0x4c,0x76, 0x2,0x26,0x37, 0x4,0x26,0x23, 0x3,0x64,0x6a, 0x4,0x28,0x6e, 0x1,0x50,0x66, 0x3,0x2c,0x2f, 0x1,0x55,0x21, 0x2,0x2e,0x67, 0x2,0x34,0x73, 0x4,0x31,0x2c, 0x1,0x59,0x69, 0x1,0x5e,0x6c, 0x2,0x34,0x72, 0x1,0x5e,0x6b, 0x3,0x40,0x71, 0x1,0x68,0x4d, 0x3,0x40,0x72, 0x2,0x49,0x64, 0x1,0x70,0x50, 0x3,0x50,0x57, 0x1,0x73,0x52, 0x2,0x5c,0x63, 0x3,0x5a,0x34, 0x1,0x79,0x69, 0x3,0x5c,0x3b, 0x1,0x7b,0x5c, 0x3,0x21,0x3b, 0x2,0x21,0x53, 0x3,0x22,0x3d, 0x1,0x46,0x46, 0x2,0x21,0x54, 0x1,0x47,0x77, 0x3,0x23,0x50, 0x1,0x47,0x75, 0x1,0x47,0x76, 0x1,0x47,0x78, 0x4,0x23,0x6f, 0x1,0x49,0x7a, 0x1,0x49,0x79, 0x3,0x25,0x5a, 0x2,0x23,0x5c, 0x1,0x49,0x7b, 0x4,0x26,0x25, 0x2,0x23,0x5d, 0x2,0x26,0x38, 0x3,0x28,0x4c, 0x2,0x26,0x39, 0x3,0x28,0x4a, 0x1,0x4c,0x78, 0x1,0x4c,0x7a, 0x1,0x4c,0x7c, 0x1,0x4c,0x79, 0x1,0x4c,0x7d, 0x1,0x4c,0x7b, 0x3,0x28,0x4e, 0x3,0x28,0x4b, 0x3,0x28,0x4d, 0x1,0x50,0x6a, 0x1,0x50,0x67, 0x1,0x50,0x69, 0x1,0x50,0x6b, 0x1,0x50,0x68, 0x2,0x2e,0x68, 0x2,0x29,0x78, 0xf,0x2a,0x39, 0x3,0x2c,0x32, 0x2,0x2e,0x6a, 0x2,0x2e,0x69, 0x1,0x55,0x27, 0x4,0x2c,0x46, 0x1,0x55,0x23, 0x4,0x2c,0x49, 0x6,0x36,0x66, 0x1,0x55,0x24, 0x1,0x55,0x26, 0x1,0x55,0x28, 0x1,0x55,0x25, 0x3,0x30,0x57, 0x1,0x55,0x2a, 0x1,0x55,0x29, 0x4,0x2c,0x48, 0x3,0x30,0x56, 0x3,0x30,0x55, 0xf,0x2e,0x7e, 0x1,0x59,0x6e, 0x2,0x34,0x75, 0x2,0x34,0x74, 0x1,0x59,0x6d, 0x3,0x35,0x41, 0x1,0x59,0x6c, 0x1,0x59,0x6b, 0x1,0x59,0x6f, 0x1,0x59,0x6a, 0x3,0x35,0x3f, 0x2,0x3b,0x39, 0x2,0x3b,0x36, 0x1,0x5e,0x6e, 0x2,0x3b,0x35, 0x2,0x3b,0x3a, 0x4,0x37,0x24, 0x1,0x5e,0x70, 0x2,0x3b,0x38, 0x1,0x5e,0x6d, 0x1,0x5e,0x6f, 0x2,0x3b,0x37, 0x3,0x3a,0x7e, 0x2,0x42,0x4e, 0x3,0x40,0x74, 0x2,0x42,0x4f, 0x2,0x42,0x50, 0x3,0x40,0x75, 0x3,0x40,0x76, 0x3,0x40,0x73, 0x4,0x3c,0x6e, 0x1,0x68,0x4e, 0x1,0x68,0x56, 0x2,0x49,0x65, 0x1,0x68,0x50, 0x1,0x68,0x54, 0x2,0x49,0x66, 0x1,0x68,0x55, 0x1,0x68,0x51, 0x1,0x68,0x52, 0x1,0x68,0x4f, 0x1,0x68,0x53, 0x1,0x6c,0x50, 0x2,0x3b,0x34, 0x1,0x6c,0x51, 0x1,0x6c,0x4f, 0x4,0x49,0x44, 0x1,0x6c,0x4e, 0x2,0x56,0x67, 0x1,0x70,0x51, 0x2,0x5c,0x64, 0x2,0x5c,0x65, 0x3,0x5a,0x35, 0x4,0x5f,0x55, 0x1,0x78,0x31, 0x1,0x79,0x6a, 0x3,0x5e,0x2a, 0x1,0x44,0x50, 0x3,0x22,0x3e, 0x1,0x47,0x79, 0x3,0x25,0x5e, 0x3,0x25,0x5c, 0x3,0x25,0x5d, 0x3,0x28,0x50, 0x1,0x50,0x6c, 0x2,0x2e,0x6b, 0x1,0x55,0x2b, 0x3,0x30,0x58, 0x3,0x30,0x59, 0x1,0x59,0x72, 0x1,0x59,0x71, 0x1,0x59,0x70, 0x1,0x5e,0x71, 0x1,0x5e,0x72, 0x2,0x3b,0x3b, 0x1,0x68,0x57, 0x1,0x70,0x52, 0x1,0x44,0x51, 0x2,0x21,0x3c, 0x1,0x45,0x37, 0x2,0x21,0x55, 0x4,0x21,0x73, 0x3,0x22,0x3f, 0x2,0x22,0x34, 0x1,0x47,0x7a, 0x4,0x22,0x5c, 0x3,0x23,0x52, 0x3,0x28,0x51, 0x1,0x4c,0x7e, 0x3,0x2c,0x34, 0x3,0x3b,0x24, 0x2,0x42,0x51, 0x3,0x40,0x78, 0x3,0x65,0x25, 0x1,0x44,0x52, 0x4,0x21,0x4b, 0x1,0x45,0x38, 0x2,0x22,0x35, 0x2,0x23,0x5e, 0x4,0x26,0x29, 0x2,0x23,0x5f, 0x3,0x25,0x5f, 0x1,0x49,0x7c, 0xf,0x25,0x54, 0x3,0x2c,0x35, 0x2,0x3b,0x3c, 0x1,0x5e,0x73, 0x2,0x42,0x52, 0x4,0x49,0x49, 0x3,0x54,0x54, 0x1,0x73,0x53, 0x1,0x44,0x53, 0x1,0x44,0x67, 0x1,0x45,0x39, 0x2,0x21,0x56, 0x1,0x46,0x47, 0x3,0x23,0x54, 0x1,0x4a,0x22, 0x1,0x4a,0x21, 0x1,0x49,0x7d, 0x1,0x49,0x7e, 0x2,0x26,0x3a, 0x1,0x4d,0x22, 0x1,0x4d,0x23, 0x2,0x26,0x3b, 0x1,0x4d,0x21, 0x3,0x28,0x54, 0x3,0x28,0x55, 0x1,0x50,0x70, 0x2,0x29,0x79, 0x1,0x50,0x6f, 0x1,0x50,0x6d, 0x1,0x50,0x6e, 0x1,0x55,0x2e, 0x1,0x55,0x2c, 0x3,0x30,0x5a, 0x3,0x30,0x5b, 0x2,0x2e,0x6d, 0x1,0x55,0x2d, 0x2,0x2e,0x6c, 0x3,0x64,0x6b, 0x1,0x55,0x22, 0x2,0x34,0x76, 0x4,0x31,0x35, 0x3,0x35,0x43, 0x1,0x59,0x74, 0x1,0x59,0x75, 0x3,0x3b,0x26, 0x3,0x3b,0x25, 0x1,0x59,0x73, 0x3,0x35,0x44, 0x1,0x68,0x58, 0x2,0x49,0x67, 0x1,0x6c,0x52, 0x1,0x6c,0x53, 0x2,0x50,0x2a, 0x1,0x73,0x54, 0x2,0x61,0x4e, 0x2,0x61,0x4f, 0x3,0x5a,0x38, 0x1,0x7a,0x68, 0x2,0x70,0x36, 0x2,0x21,0x2b, 0x1,0x45,0x3a, 0x4,0x22,0x5f, 0x1,0x44,0x54, 0x2,0x21,0x58, 0x2,0x21,0x57, 0x4,0x21,0x76, 0x3,0x64,0x6c, 0x3,0x23,0x55, 0x1,0x47,0x7b, 0x2,0x22,0x37, 0x2,0x22,0x38, 0x2,0x22,0x36, 0x4,0x22,0x60, 0x2,0x22,0x39, 0x3,0x23,0x5a, 0xf,0x22,0x47, 0x3,0x25,0x61, 0x3,0x25,0x66, 0x2,0x23,0x67, 0x4,0x23,0x7a, 0x2,0x23,0x62, 0x2,0x23,0x64, 0x2,0x23,0x66, 0x2,0x23,0x63, 0x1,0x4a,0x26, 0x2,0x23,0x60, 0x3,0x25,0x62, 0x2,0x23,0x61, 0x1,0x4a,0x23, 0x1,0x4a,0x24, 0x2,0x23,0x65, 0x2,0x23,0x68, 0x1,0x4a,0x25, 0x2,0x23,0x69, 0xf,0x23,0x7c, 0xf,0x23,0x78, 0x3,0x25,0x63, 0x2,0x26,0x49, 0x3,0x28,0x5d, 0x2,0x26,0x43, 0x2,0x26,0x3e, 0x1,0x4d,0x25, 0x2,0x26,0x46, 0x2,0x26,0x44, 0x2,0x26,0x3d, 0x2,0x26,0x4a, 0x2,0x26,0x4d, 0x2,0x26,0x48, 0x2,0x26,0x41, 0x1,0x4d,0x27, 0x2,0x26,0x47, 0x1,0x4d,0x28, 0x2,0x26,0x42, 0x2,0x26,0x45, 0x2,0x26,0x3c, 0x2,0x26,0x40, 0x2,0x26,0x4c, 0x1,0x4d,0x29, 0x4,0x26,0x2f, 0x1,0x4d,0x2a, 0x3,0x28,0x5e, 0x2,0x26,0x3f, 0x2,0x26,0x4b, 0x1,0x4d,0x24, 0x1,0x4d,0x26, 0x3,0x28,0x5c, 0x3,0x28,0x5f, 0x3,0x28,0x57, 0x4,0x26,0x34, 0x3,0x28,0x58, 0x2,0x2a,0x2c, 0x2,0x2a,0x25, 0x2,0x2a,0x2b, 0x2,0x2a,0x24, 0x2,0x2a,0x26, 0x2,0x29,0x7e, 0x2,0x29,0x7c, 0x3,0x2c,0x3f, 0x2,0x2a,0x2d, 0x2,0x2a,0x2a, 0x2,0x29,0x7a, 0x3,0x2c,0x3b, 0x1,0x50,0x72, 0x2,0x2a,0x28, 0x2,0x2a,0x29, 0x3,0x64,0x6d, 0x2,0x2a,0x27, 0x2,0x29,0x7d, 0x2,0x29,0x7b, 0x1,0x50,0x71, 0x2,0x2a,0x23, 0x2,0x2a,0x21, 0x3,0x2c,0x3c, 0x3,0x2c,0x42, 0x2,0x2a,0x22, 0x2,0x2a,0x2e, 0x3,0x2c,0x3e, 0x3,0x2c,0x41, 0x3,0x2c,0x43, 0x3,0x2c,0x3d, 0x1,0x55,0x33, 0x3,0x30,0x63, 0x1,0x55,0x32, 0x3,0x30,0x5f, 0x2,0x2e,0x6e, 0x1,0x55,0x2f, 0x2,0x2e,0x70, 0x3,0x30,0x64, 0x1,0x55,0x34, 0x2,0x2e,0x71, 0x4,0x2c,0x60, 0x3,0x30,0x61, 0x1,0x55,0x37, 0x3,0x30,0x62, 0x1,0x55,0x35, 0x2,0x2e,0x72, 0x2,0x2a,0x2f, 0x2,0x2e,0x74, 0x3,0x30,0x5e, 0x1,0x55,0x31, 0x4,0x2c,0x5c, 0x1,0x55,0x30, 0x4,0x2c,0x61, 0x2,0x2e,0x6f, 0x2,0x2e,0x73, 0x1,0x55,0x36, 0x1,0x59,0x77, 0x1,0x59,0x76, 0x3,0x35,0x4b, 0x3,0x35,0x48, 0x3,0x35,0x47, 0x2,0x34,0x78, 0x2,0x34,0x7c, 0x2,0x34,0x7e, 0x1,0x59,0x78, 0x2,0x35,0x23, 0x3,0x35,0x51, 0x1,0x59,0x7c, 0x2,0x35,0x25, 0x3,0x35,0x52, 0x1,0x59,0x7e, 0x3,0x35,0x4f, 0x1,0x59,0x7a, 0x1,0x5a,0x24, 0x3,0x35,0x55, 0x1,0x5a,0x21, 0x2,0x34,0x7a, 0x1,0x59,0x79, 0x3,0x3b,0x2b, 0x2,0x34,0x79, 0x2,0x34,0x77, 0x2,0x35,0x27, 0x2,0x34,0x7b, 0x3,0x35,0x46, 0x1,0x59,0x7b, 0x2,0x35,0x26, 0x1,0x5a,0x22, 0x2,0x35,0x22, 0x2,0x35,0x21, 0x1,0x5a,0x23, 0x2,0x34,0x7d, 0x1,0x59,0x7d, 0x3,0x35,0x4e, 0x6,0x3e,0x76, 0x3,0x35,0x4a, 0x2,0x35,0x28, 0x3,0x35,0x54, 0x2,0x35,0x24, 0x2,0x3b,0x4b, 0x2,0x3b,0x52, 0x2,0x3b,0x47, 0x1,0x5e,0x76, 0x2,0x3b,0x43, 0x2,0x3b,0x53, 0x2,0x3b,0x3d, 0x2,0x3b,0x50, 0x2,0x3b,0x4e, 0x2,0x3b,0x48, 0x3,0x3b,0x36, 0x2,0x3b,0x51, 0x2,0x3b,0x4a, 0x3,0x3b,0x28, 0x2,0x3b,0x42, 0x2,0x3b,0x54, 0x2,0x3b,0x40, 0x2,0x3b,0x4d, 0x2,0x3b,0x3e, 0x3,0x3b,0x27, 0x2,0x3b,0x55, 0x3,0x3b,0x37, 0x1,0x5e,0x77, 0x3,0x3b,0x2a, 0x2,0x3b,0x4f, 0x2,0x42,0x55, 0x2,0x3b,0x41, 0x1,0x5e,0x74, 0x3,0x3b,0x2e, 0x2,0x3b,0x45, 0x3,0x3b,0x34, 0x1,0x5e,0x75, 0x2,0x3b,0x44, 0x2,0x3b,0x49, 0x3,0x3b,0x33, 0x4,0x37,0x35, 0x2,0x3b,0x46, 0x4,0x37,0x2f, 0x3,0x3b,0x31, 0x2,0x3b,0x4c, 0x3,0x3b,0x2d, 0x2,0x42,0x59, 0x4,0x3c,0x79, 0x3,0x41,0x21, 0x4,0x3c,0x7b, 0x2,0x42,0x5c, 0x2,0x42,0x54, 0x3,0x40,0x7c, 0x2,0x42,0x56, 0x3,0x40,0x7a, 0x2,0x42,0x5b, 0x2,0x42,0x5a, 0x1,0x63,0x69, 0x4,0x3c,0x75, 0x2,0x3b,0x3f, 0x2,0x42,0x58, 0x3,0x40,0x79, 0x3,0x40,0x7d, 0x1,0x63,0x6a, 0x4,0x3c,0x74, 0x2,0x42,0x53, 0x2,0x42,0x57, 0x4,0x3c,0x7c, 0x4,0x3c,0x78, 0x3,0x64,0x6e, 0x2,0x49,0x6e, 0x3,0x46,0x5c, 0x2,0x49,0x75, 0x2,0x49,0x6c, 0x3,0x46,0x54, 0x2,0x49,0x73, 0x2,0x49,0x6a, 0x2,0x49,0x72, 0x2,0x49,0x76, 0x2,0x49,0x69, 0x2,0x49,0x6d, 0x2,0x49,0x68, 0x3,0x46,0x56, 0x1,0x68,0x59, 0x4,0x43,0x2c, 0x2,0x49,0x6b, 0x1,0x68,0x5a, 0x2,0x49,0x71, 0x2,0x49,0x70, 0x2,0x49,0x6f, 0x3,0x46,0x59, 0x3,0x46,0x5a, 0x2,0x49,0x74, 0x3,0x64,0x6f, 0x3,0x4b,0x65, 0x3,0x4b,0x66, 0x3,0x4b,0x63, 0x2,0x50,0x2e, 0x2,0x50,0x30, 0x1,0x6c,0x55, 0x2,0x50,0x31, 0x3,0x4b,0x6b, 0x2,0x50,0x2c, 0x3,0x4b,0x67, 0x2,0x50,0x2b, 0x2,0x50,0x35, 0x3,0x4b,0x69, 0x2,0x50,0x33, 0x1,0x6c,0x54, 0x2,0x50,0x36, 0x2,0x50,0x2d, 0x2,0x50,0x32, 0x2,0x50,0x34, 0x2,0x50,0x2f, 0x3,0x4b,0x6a, 0x3,0x4b,0x68, 0x3,0x64,0x70, 0x3,0x50,0x58, 0x2,0x56,0x6b, 0x2,0x56,0x70, 0x2,0x56,0x6a, 0x2,0x56,0x6f, 0x3,0x50,0x5b, 0x2,0x56,0x68, 0x2,0x56,0x72, 0x2,0x56,0x6e, 0x2,0x56,0x73, 0x2,0x56,0x6d, 0x2,0x56,0x69, 0x2,0x56,0x71, 0x3,0x50,0x5a, 0x2,0x56,0x74, 0x2,0x56,0x6c, 0x3,0x64,0x71, 0x2,0x5c,0x66, 0x1,0x73,0x58, 0x3,0x54,0x57, 0x1,0x73,0x56, 0x3,0x54,0x59, 0x1,0x73,0x55, 0x1,0x73,0x57, 0x3,0x54,0x55, 0x3,0x64,0x72, 0x2,0x61,0x50, 0x3,0x57,0x62, 0x2,0x64,0x3e, 0x2,0x65,0x49, 0x3,0x5a,0x39, 0x2,0x68,0x70, 0x2,0x68,0x71, 0x3,0x5c,0x3d, 0x1,0x79,0x6b, 0x3,0x5c,0x3c, 0x2,0x6b,0x57, 0x3,0x5c,0x3e, 0x1,0x7a,0x69, 0x4,0x66,0x3b, 0x2,0x6b,0x58, 0x3,0x5e,0x2d, 0x2,0x6d,0x4c, 0x1,0x7b,0x5e, 0x3,0x5f,0x43, 0x1,0x7b,0x5d, 0x2,0x6d,0x4b, 0x1,0x7c,0x35, 0x3,0x60,0x30, 0x2,0x6f,0x25, 0x4,0x6b,0x68, 0x4,0x6a,0x46, 0x3,0x21,0x3c, 0x4,0x21,0x2c, 0x1,0x44,0x55, 0x1,0x47,0x7c, 0x2,0x22,0x3a, 0x2,0x23,0x6a, 0x1,0x4b,0x56, 0x1,0x5a,0x25, 0x3,0x35,0x57, 0x3,0x4b,0x6c, 0x1,0x44,0x56, 0x1,0x46,0x4a, 0x1,0x46,0x49, 0x1,0x46,0x48, 0x4,0x22,0x63, 0x1,0x4a,0x27, 0x1,0x55,0x38, 0x2,0x42,0x5d, 0x1,0x44,0x57, 0x1,0x44,0x58, 0x1,0x44,0x59, 0x1,0x45,0x3b, 0x3,0x25,0x67, 0x3,0x28,0x60, 0x1,0x50,0x73, 0x4,0x2c,0x64, 0x2,0x2a,0x30, 0x3,0x2c,0x45, 0x3,0x2c,0x44, 0x1,0x5e,0x78, 0x1,0x44,0x5a, 0x2,0x21,0x3d, 0x3,0x21,0x63, 0x4,0x21,0x4c, 0x1,0x46,0x4b, 0x1,0x46,0x4c, 0x2,0x21,0x59, 0x1,0x47,0x7d, 0x5,0x22,0x5c, 0x3,0x23,0x5c, 0x3,0x25,0x68, 0x2,0x23,0x6b, 0x3,0x25,0x6b, 0x1,0x4a,0x28, 0x4,0x24,0x23, 0x2,0x23,0x6c, 0x1,0x4d,0x30, 0x3,0x28,0x62, 0x3,0x28,0x61, 0x2,0x26,0x4f, 0x1,0x4d,0x2e, 0x1,0x4d,0x2d, 0x2,0x26,0x4e, 0x1,0x4d,0x2b, 0x2,0x26,0x50, 0x1,0x4d,0x2c, 0x1,0x4d,0x2f, 0x1,0x50,0x74, 0x3,0x2c,0x46, 0x1,0x50,0x76, 0x2,0x2a,0x34, 0x2,0x2a,0x31, 0x2,0x2a,0x32, 0x2,0x2a,0x33, 0x2,0x2a,0x35, 0x1,0x50,0x75, 0x2,0x2e,0x76, 0x2,0x2e,0x75, 0x3,0x30,0x66, 0x1,0x55,0x3a, 0x3,0x30,0x69, 0x1,0x55,0x39, 0x3,0x30,0x68, 0x3,0x30,0x6a, 0x3,0x30,0x67, 0x3,0x35,0x5b, 0x1,0x5a,0x28, 0x2,0x35,0x2a, 0x3,0x35,0x59, 0x1,0x5a,0x27, 0x1,0x5a,0x29, 0x1,0x5a,0x26, 0x3,0x35,0x58, 0x3,0x35,0x5a, 0x1,0x5e,0x7a, 0x2,0x35,0x29, 0x5,0x37,0x7c, 0x1,0x5e,0x7b, 0x2,0x3b,0x57, 0x3,0x39,0x79, 0x1,0x5e,0x7c, 0x2,0x3b,0x56, 0x1,0x5e,0x79, 0x3,0x3b,0x3a, 0x3,0x3b,0x3b, 0x3,0x3b,0x3d, 0x2,0x42,0x60, 0x2,0x42,0x62, 0x1,0x63,0x6b, 0x2,0x42,0x61, 0x2,0x42,0x5f, 0x2,0x42,0x5e, 0x4,0x3d,0x2a, 0x4,0x43,0x35, 0x3,0x46,0x5d, 0x2,0x49,0x79, 0x1,0x68,0x5f, 0x1,0x68,0x5d, 0x4,0x43,0x30, 0x1,0x68,0x5e, 0x2,0x49,0x77, 0x2,0x49,0x78, 0x3,0x4b,0x6d, 0x1,0x68,0x5b, 0x2,0x50,0x3a, 0x2,0x50,0x38, 0x3,0x4b,0x70, 0x1,0x6c,0x57, 0x2,0x50,0x39, 0x1,0x6c,0x58, 0x1,0x6c,0x56, 0x1,0x68,0x5c, 0xf,0x4e,0x5e, 0x3,0x64,0x73, 0x2,0x56,0x77, 0x2,0x56,0x75, 0x2,0x56,0x76, 0x2,0x50,0x37, 0x2,0x5c,0x68, 0x1,0x73,0x59, 0x2,0x5c,0x67, 0x2,0x61,0x51, 0x2,0x61,0x52, 0x2,0x56,0x78, 0x2,0x65,0x4a, 0x3,0x66,0x77, 0x1,0x44,0x5b, 0x1,0x46,0x4d, 0x1,0x48,0x21, 0x2,0x22,0x3b, 0x1,0x47,0x7e, 0x3,0x28,0x63, 0x1,0x4d,0x31, 0x1,0x63,0x6c, 0x3,0x21,0x3d, 0x1,0x45,0x3c, 0x1,0x46,0x4e, 0x1,0x50,0x77, 0x1,0x5e,0x7d, 0x3,0x21,0x3e, 0x2,0x21,0x5a, 0x3,0x22,0x47, 0x2,0x21,0x5b, 0x3,0x22,0x48, 0x2,0x22,0x3c, 0x3,0x66,0x78, 0x1,0x4a,0x2a, 0x2,0x23,0x70, 0x2,0x23,0x6e, 0x1,0x4a,0x2b, 0x2,0x23,0x6d, 0x2,0x23,0x6f, 0x2,0x23,0x71, 0x4,0x24,0x28, 0x1,0x4a,0x29, 0x3,0x25,0x6e, 0x3,0x25,0x6d, 0x1,0x4d,0x35, 0x1,0x4d,0x36, 0x1,0x4d,0x33, 0x3,0x28,0x65, 0x3,0x28,0x67, 0x1,0x4d,0x32, 0x2,0x2a,0x39, 0x1,0x4d,0x34, 0x3,0x28,0x68, 0x1,0x50,0x78, 0x3,0x2c,0x48, 0x2,0x2a,0x38, 0x2,0x2a,0x3a, 0x2,0x2a,0x37, 0x2,0x2a,0x3b, 0x1,0x50,0x79, 0x1,0x55,0x3d, 0x2,0x2e,0x77, 0x3,0x30,0x6c, 0x2,0x2e,0x79, 0x1,0x55,0x3b, 0x2,0x2e,0x7a, 0x1,0x55,0x3c, 0x2,0x2e,0x78, 0x3,0x30,0x6b, 0x2,0x2a,0x36, 0x2,0x35,0x2b, 0x2,0x35,0x2e, 0x2,0x35,0x2f, 0x2,0x35,0x2c, 0x1,0x5a,0x2d, 0x1,0x5a,0x2c, 0x1,0x5a,0x2a, 0x1,0x5a,0x2b, 0x2,0x35,0x2d, 0x3,0x35,0x61, 0x3,0x35,0x60, 0x3,0x3b,0x3f, 0x1,0x5a,0x2e, 0x3,0x3b,0x40, 0x3,0x3b,0x3e, 0x1,0x5f,0x21, 0x1,0x5f,0x22, 0x6,0x48,0x45, 0x1,0x5f,0x23, 0x2,0x42,0x63, 0x2,0x42,0x65, 0x2,0x42,0x67, 0x1,0x63,0x6e, 0x1,0x63,0x6d, 0x1,0x5e,0x7e, 0x2,0x42,0x66, 0x2,0x42,0x64, 0x3,0x64,0x74, 0x2,0x49,0x7d, 0x3,0x46,0x61, 0x3,0x46,0x60, 0x2,0x49,0x7b, 0x2,0x4a,0x23, 0x1,0x68,0x60, 0x2,0x4a,0x24, 0x2,0x4a,0x21, 0x1,0x68,0x61, 0x2,0x49,0x7c, 0x2,0x49,0x7a, 0x2,0x4a,0x22, 0x1,0x6c,0x5a, 0x2,0x50,0x3c, 0x2,0x49,0x7e, 0x1,0x6c,0x5c, 0x2,0x50,0x3d, 0x1,0x6c,0x5b, 0x1,0x6c,0x5e, 0x2,0x50,0x3e, 0x1,0x6c,0x59, 0x1,0x6c,0x5d, 0x2,0x56,0x7d, 0x2,0x56,0x7b, 0x2,0x56,0x7a, 0x2,0x56,0x7c, 0x2,0x56,0x79, 0x3,0x50,0x5c, 0x4,0x5b,0x21, 0x1,0x78,0x33, 0x3,0x64,0x75, 0x2,0x68,0x72, 0x2,0x68,0x73, 0x3,0x5c,0x3f, 0x2,0x6b,0x59, 0x2,0x6d,0x4d, 0x1,0x7d,0x22, 0x3,0x21,0x3f, 0x3,0x23,0x61, 0x1,0x4d,0x37, 0x1,0x4a,0x2c, 0x3,0x28,0x69, 0x3,0x28,0x6b, 0x1,0x50,0x7a, 0x3,0x2c,0x4c, 0x3,0x2c,0x4b, 0x3,0x30,0x6e, 0x1,0x44,0x5c, 0x1,0x45,0x3d, 0x4,0x21,0x4d, 0x1,0x46,0x4f, 0x2,0x22,0x3d, 0x3,0x25,0x6f, 0x1,0x4a,0x2d, 0x2,0x23,0x72, 0x3,0x28,0x6d, 0x2,0x2a,0x3c, 0x1,0x50,0x7b, 0x1,0x68,0x62, 0x1,0x44,0x5d, 0x3,0x21,0x64, 0x3,0x22,0x49, 0x3,0x23,0x62, 0x1,0x48,0x22, 0xf,0x22,0x4e, 0x3,0x3b,0x42, 0x1,0x63,0x6f, 0x1,0x44,0x5e, 0x1,0x45,0x3e, 0x1,0x45,0x3f, 0x1,0x46,0x51, 0x1,0x46,0x50, 0x4,0x22,0x6b, 0x2,0x22,0x3e, 0x1,0x48,0x23, 0x4,0x22,0x6c, 0x2,0x23,0x73, 0x3,0x25,0x71, 0x1,0x4a,0x2e, 0x3,0x28,0x6e, 0x2,0x26,0x52, 0x2,0x26,0x53, 0x2,0x26,0x54, 0x3,0x28,0x70, 0x1,0x4d,0x38, 0x1,0x4d,0x39, 0x2,0x26,0x51, 0x1,0x4d,0x3a, 0x4,0x29,0x2c, 0x4,0x2c,0x70, 0x1,0x50,0x7c, 0x2,0x2a,0x3d, 0x3,0x2c,0x4d, 0x2,0x2e,0x7c, 0x1,0x55,0x3e, 0x3,0x30,0x6f, 0x2,0x2e,0x7b, 0x3,0x35,0x62, 0x1,0x5a,0x2f, 0x2,0x35,0x30, 0x1,0x5a,0x30, 0x2,0x35,0x31, 0x3,0x35,0x63, 0x3,0x3b,0x47, 0x3,0x3b,0x45, 0x1,0x5f,0x24, 0x4,0x37,0x45, 0x3,0x3b,0x44, 0x4,0x3d,0x30, 0x2,0x42,0x68, 0xf,0x41,0x3f, 0x3,0x41,0x22, 0x2,0x4a,0x26, 0x2,0x4a,0x25, 0x1,0x68,0x63, 0x4,0x49,0x5e, 0x1,0x6c,0x5f, 0x2,0x50,0x3f, 0x1,0x70,0x53, 0x2,0x56,0x7e, 0x1,0x73,0x5a, 0x3,0x57,0x63, 0x1,0x7b,0x5f, 0x2,0x6f,0x27, 0x3,0x21,0x40, 0x3,0x21,0x41, 0x3,0x22,0x4a, 0x3,0x23,0x51, 0x2,0x26,0x55, 0x3,0x28,0x71, 0x2,0x2a,0x3e, 0x1,0x5a,0x31, 0x2,0x3b,0x58, 0x1,0x63,0x70, 0x3,0x41,0x23, 0x3,0x50,0x5e, 0xf,0x54,0x43, 0x3,0x57,0x64, 0x1,0x76,0x41, 0x3,0x61,0x64, 0x3,0x21,0x42, 0x1,0x4a,0x30, 0x3,0x25,0x72, 0x1,0x4a,0x2f, 0x1,0x50,0x7d, 0x3,0x2c,0x50, 0x2,0x2e,0x7d, 0x1,0x5a,0x33, 0x1,0x5d,0x29, 0x1,0x5a,0x34, 0x1,0x5a,0x32, 0x1,0x5f,0x25, 0x3,0x41,0x24, 0x2,0x4a,0x27, 0x1,0x68,0x64, 0x1,0x6c,0x60, 0x3,0x5f,0x45, 0x2,0x21,0x2c, 0x2,0x22,0x3f, 0x4,0x22,0x6d, 0x2,0x23,0x75, 0x1,0x4a,0x31, 0x2,0x23,0x74, 0x1,0x4a,0x32, 0x4,0x24,0x2c, 0x1,0x4d,0x3e, 0x2,0x26,0x58, 0x2,0x26,0x57, 0x1,0x4d,0x3d, 0x1,0x4d,0x3b, 0x1,0x4d,0x3c, 0x2,0x26,0x56, 0x3,0x28,0x76, 0x3,0x28,0x75, 0x1,0x51,0x21, 0x2,0x2a,0x3f, 0x1,0x51,0x24, 0x1,0x50,0x7e, 0x1,0x51,0x26, 0x1,0x51,0x22, 0x1,0x51,0x23, 0x1,0x51,0x25, 0x4,0x29,0x31, 0x3,0x30,0x70, 0x3,0x30,0x72, 0x1,0x55,0x41, 0x1,0x55,0x40, 0x1,0x55,0x3f, 0x3,0x30,0x71, 0x3,0x64,0x76, 0x2,0x35,0x33, 0x1,0x5a,0x35, 0x1,0x5a,0x38, 0x1,0x5a,0x36, 0x3,0x64,0x77, 0x2,0x35,0x32, 0x1,0x5a,0x3b, 0x4,0x31,0x53, 0x1,0x5a,0x37, 0x2,0x35,0x34, 0x1,0x5a,0x3a, 0x1,0x5a,0x39, 0x4,0x31,0x52, 0x4,0x31,0x57, 0x4,0x37,0x4a, 0x2,0x3b,0x5a, 0x2,0x3b,0x59, 0x3,0x3b,0x4b, 0x1,0x5f,0x28, 0x1,0x5f,0x26, 0x1,0x5f,0x27, 0x2,0x3b,0x5b, 0x1,0x63,0x71, 0x2,0x42,0x6a, 0x1,0x63,0x72, 0x2,0x42,0x69, 0x4,0x3d,0x34, 0x4,0x43,0x3f, 0x2,0x50,0x40, 0x3,0x46,0x63, 0x3,0x46,0x64, 0x1,0x6c,0x62, 0x2,0x4a,0x28, 0x1,0x6c,0x61, 0x3,0x4b,0x72, 0x1,0x68,0x65, 0x3,0x64,0x78, 0x2,0x57,0x22, 0x2,0x57,0x21, 0x1,0x73,0x5b, 0x2,0x5c,0x69, 0x2,0x65,0x4b, 0x2,0x68,0x74, 0x2,0x68,0x75, 0x3,0x5e,0x2f, 0x1,0x45,0x40, 0x4,0x21,0x36, 0x1,0x46,0x52, 0x3,0x22,0x4d, 0x4,0x22,0x71, 0x2,0x21,0x5c, 0x3,0x22,0x4c, 0x5,0x22,0x66, 0x1,0x4a,0x34, 0x1,0x4a,0x36, 0x3,0x25,0x78, 0x2,0x22,0x42, 0x2,0x23,0x78, 0x2,0x23,0x77, 0x2,0x23,0x76, 0x3,0x23,0x66, 0x2,0x22,0x41, 0x2,0x22,0x40, 0x1,0x48,0x25, 0x1,0x4a,0x35, 0x1,0x4a,0x33, 0x1,0x48,0x24, 0x3,0x23,0x67, 0x3,0x23,0x69, 0x3,0x25,0x77, 0x1,0x4d,0x3f, 0x2,0x26,0x59, 0x3,0x25,0x7b, 0x1,0x4d,0x40, 0x2,0x23,0x7d, 0x4,0x26,0x50, 0x2,0x24,0x21, 0x2,0x23,0x7e, 0x2,0x26,0x5a, 0x3,0x25,0x76, 0x3,0x25,0x74, 0x2,0x23,0x7a, 0x3,0x28,0x7e, 0x1,0x4a,0x3a, 0x1,0x4a,0x38, 0x3,0x25,0x7c, 0x2,0x23,0x79, 0x2,0x23,0x7b, 0x2,0x24,0x23, 0x3,0x26,0x22, 0x1,0x4a,0x37, 0x3,0x26,0x21, 0x2,0x23,0x7c, 0x2,0x24,0x27, 0x1,0x4d,0x42, 0x3,0x25,0x7d, 0x2,0x24,0x24, 0x1,0x4a,0x39, 0x3,0x26,0x23, 0x2,0x24,0x22, 0x2,0x24,0x25, 0x3,0x25,0x7a, 0x1,0x4d,0x41, 0x3,0x25,0x75, 0x1,0x4d,0x43, 0x2,0x24,0x26, 0x3,0x28,0x78, 0x3,0x29,0x22, 0x2,0x26,0x6e, 0x2,0x26,0x61, 0x2,0x26,0x5f, 0x2,0x26,0x6d, 0x2,0x26,0x68, 0x1,0x51,0x2b, 0x1,0x4d,0x44, 0x2,0x26,0x69, 0x2,0x26,0x6c, 0x1,0x51,0x27, 0x2,0x26,0x6b, 0x1,0x4d,0x45, 0x1,0x4d,0x4a, 0x1,0x4d,0x48, 0x2,0x26,0x62, 0x4,0x29,0x36, 0x2,0x26,0x5d, 0x2,0x26,0x64, 0x1,0x4d,0x4f, 0x2,0x26,0x6f, 0x1,0x51,0x28, 0x2,0x26,0x65, 0x4,0x26,0x4f, 0x1,0x51,0x29, 0x1,0x4d,0x4b, 0x2,0x26,0x67, 0x3,0x2c,0x5a, 0x2,0x2a,0x4e, 0x1,0x51,0x2a, 0x2,0x26,0x5c, 0x1,0x4d,0x4c, 0x1,0x51,0x2c, 0x1,0x4d,0x4d, 0x1,0x4d,0x49, 0x1,0x4d,0x4e, 0x2,0x26,0x66, 0x2,0x26,0x5b, 0x2,0x26,0x6a, 0x1,0x4d,0x46, 0x3,0x28,0x77, 0x3,0x2c,0x5b, 0x2,0x26,0x5e, 0x2,0x26,0x63, 0x2,0x26,0x60, 0x1,0x4d,0x47, 0x3,0x28,0x7a, 0x2,0x2a,0x40, 0x4,0x29,0x45, 0x2,0x2a,0x41, 0x3,0x29,0x21, 0x2,0x2a,0x4b, 0x2,0x2f,0x23, 0x2,0x2a,0x4c, 0x1,0x51,0x32, 0x2,0x2a,0x4f, 0x2,0x2a,0x45, 0x1,0x51,0x31, 0x2,0x2a,0x47, 0x4,0x29,0x3f, 0x2,0x2a,0x48, 0x3,0x2c,0x60, 0x3,0x30,0x79, 0x2,0x2a,0x4a, 0x1,0x51,0x2d, 0x3,0x2c,0x56, 0x3,0x30,0x73, 0x1,0x55,0x45, 0x3,0x2c,0x57, 0x3,0x2c,0x5d, 0x2,0x2a,0x46, 0x2,0x2a,0x42, 0x1,0x55,0x46, 0x3,0x30,0x7e, 0x4,0x29,0x3e, 0x2,0x2a,0x50, 0x1,0x55,0x42, 0x2,0x2f,0x21, 0x2,0x2a,0x49, 0x3,0x2c,0x54, 0x2,0x2e,0x7e, 0x2,0x2a,0x44, 0x2,0x2a,0x4d, 0x3,0x2c,0x5f, 0x3,0x2c,0x61, 0x1,0x51,0x30, 0x1,0x55,0x43, 0x1,0x51,0x36, 0x1,0x55,0x44, 0x2,0x2a,0x51, 0x2,0x2f,0x22, 0x1,0x51,0x2f, 0x1,0x55,0x48, 0x1,0x51,0x35, 0x1,0x51,0x34, 0x1,0x51,0x33, 0x1,0x55,0x47, 0x2,0x2a,0x52, 0x1,0x55,0x49, 0x1,0x51,0x2e, 0x4,0x29,0x4b, 0x2,0x2a,0x43, 0x3,0x30,0x7a, 0x3,0x30,0x78, 0x3,0x30,0x7b, 0x3,0x2c,0x5c, 0x3,0x30,0x76, 0x1,0x5a,0x3c, 0x2,0x2f,0x26, 0x2,0x2f,0x28, 0x4,0x2d,0x25, 0x2,0x2f,0x2a, 0x1,0x55,0x4a, 0x1,0x55,0x50, 0x2,0x35,0x37, 0x2,0x2f,0x2e, 0x2,0x2f,0x25, 0x1,0x5a,0x3e, 0x2,0x35,0x35, 0x3,0x31,0x22, 0x1,0x55,0x4f, 0x1,0x55,0x4d, 0x2,0x2f,0x30, 0x4,0x2d,0x2d, 0x2,0x35,0x36, 0x4,0x2d,0x2c, 0x2,0x2f,0x27, 0x3,0x31,0x25, 0x1,0x55,0x4e, 0x2,0x2f,0x2b, 0x1,0x55,0x51, 0x2,0x2f,0x2d, 0x3,0x35,0x68, 0x3,0x30,0x74, 0x1,0x55,0x4c, 0x2,0x2f,0x2c, 0x2,0x2f,0x2f, 0x2,0x2f,0x29, 0x3,0x31,0x27, 0x1,0x55,0x4b, 0x1,0x5a,0x3f, 0x3,0x35,0x71, 0x2,0x2f,0x24, 0x1,0x5a,0x3d, 0x3,0x35,0x72, 0x4,0x31,0x6b, 0x3,0x31,0x23, 0x3,0x31,0x28, 0x1,0x5a,0x40, 0x3,0x31,0x21, 0x3,0x35,0x6f, 0x3,0x31,0x26, 0x2,0x35,0x39, 0x2,0x35,0x42, 0x1,0x5f,0x2b, 0x3,0x3b,0x54, 0x1,0x5a,0x42, 0x1,0x5a,0x47, 0x1,0x5f,0x2c, 0x2,0x35,0x44, 0x1,0x5a,0x4e, 0x2,0x3b,0x5d, 0x2,0x35,0x3a, 0x1,0x5a,0x46, 0x1,0x5a,0x49, 0x1,0x5a,0x44, 0x2,0x35,0x38, 0x2,0x35,0x46, 0x2,0x35,0x49, 0x2,0x3b,0x6c, 0x4,0x31,0x68, 0x2,0x35,0x47, 0x2,0x3b,0x61, 0x1,0x5a,0x45, 0x1,0x5a,0x4c, 0x1,0x5a,0x50, 0x2,0x35,0x41, 0x2,0x3b,0x5c, 0x2,0x35,0x45, 0x1,0x5a,0x41, 0x2,0x3b,0x5e, 0x2,0x35,0x48, 0x2,0x3b,0x60, 0x2,0x35,0x3d, 0x3,0x35,0x6a, 0x1,0x5f,0x29, 0x3,0x3b,0x56, 0x2,0x35,0x3b, 0x2,0x35,0x3c, 0x1,0x5a,0x4b, 0x3,0x3b,0x55, 0x3,0x35,0x6e, 0x1,0x5a,0x4a, 0x2,0x35,0x3f, 0x1,0x5a,0x4f, 0x2,0x35,0x43, 0x1,0x5a,0x48, 0x2,0x35,0x40, 0x3,0x35,0x79, 0x1,0x5a,0x4d, 0x1,0x5f,0x2d, 0x1,0x5f,0x2a, 0x2,0x3b,0x5f, 0x3,0x3b,0x58, 0x2,0x35,0x3e, 0x3,0x3b,0x59, 0x1,0x5a,0x43, 0x3,0x35,0x76, 0x3,0x35,0x78, 0x3,0x3b,0x5a, 0x3,0x3b,0x4d, 0x3,0x35,0x74, 0x1,0x5f,0x32, 0x1,0x5f,0x36, 0x2,0x3b,0x63, 0x1,0x63,0x77, 0x1,0x5f,0x34, 0x2,0x3b,0x67, 0x1,0x5f,0x38, 0x2,0x42,0x6b, 0x2,0x3b,0x69, 0x1,0x63,0x79, 0x1,0x5f,0x30, 0x1,0x5f,0x33, 0x2,0x3b,0x6a, 0x3,0x3b,0x5e, 0x2,0x3b,0x6b, 0x2,0x3b,0x71, 0x1,0x5f,0x3a, 0x1,0x63,0x7a, 0x4,0x3d,0x3d, 0x2,0x3b,0x6d, 0x2,0x3b,0x72, 0x2,0x3b,0x66, 0x1,0x64,0x26, 0x3,0x3b,0x4f, 0x1,0x63,0x7b, 0x1,0x5f,0x39, 0x2,0x3b,0x64, 0x2,0x3b,0x73, 0x3,0x3b,0x51, 0x1,0x64,0x25, 0x1,0x5f,0x37, 0x1,0x63,0x74, 0x2,0x3b,0x70, 0x3,0x3b,0x5d, 0x1,0x5f,0x3b, 0x2,0x3b,0x68, 0x2,0x3b,0x62, 0x1,0x5f,0x31, 0x2,0x3b,0x65, 0x5,0x3f,0x30, 0x2,0x3b,0x6e, 0x3,0x41,0x2b, 0x1,0x63,0x73, 0x1,0x63,0x78, 0x1,0x5f,0x2e, 0x2,0x3b,0x6f, 0x3,0x3b,0x61, 0x1,0x63,0x76, 0x3,0x3b,0x62, 0x3,0x3b,0x63, 0x3,0x3b,0x50, 0x1,0x5f,0x2f, 0x3,0x64,0x79, 0x1,0x64,0x24, 0x2,0x4a,0x2a, 0x2,0x42,0x76, 0x3,0x41,0x29, 0x2,0x42,0x6e, 0x2,0x4a,0x29, 0x4,0x3d,0x39, 0x2,0x42,0x72, 0x2,0x42,0x74, 0x3,0x41,0x27, 0x3,0x41,0x2c, 0x2,0x42,0x71, 0x3,0x46,0x6f, 0x1,0x64,0x23, 0x4,0x3d,0x38, 0x2,0x42,0x70, 0x1,0x64,0x27, 0x3,0x46,0x6e, 0x6,0x52,0x64, 0x3,0x41,0x28, 0x2,0x4a,0x39, 0x3,0x46,0x6c, 0x3,0x41,0x2e, 0x1,0x64,0x22, 0x1,0x68,0x67, 0x2,0x42,0x77, 0x2,0x4a,0x2b, 0x3,0x46,0x6d, 0x3,0x41,0x2a, 0x1,0x63,0x7e, 0x2,0x42,0x6f, 0x2,0x42,0x73, 0x1,0x68,0x66, 0x1,0x63,0x75, 0x2,0x42,0x6c, 0x2,0x42,0x6d, 0x1,0x68,0x68, 0x1,0x63,0x7d, 0x1,0x64,0x21, 0x1,0x63,0x7c, 0x2,0x42,0x75, 0x3,0x64,0x7a, 0x2,0x4a,0x2f, 0x2,0x4a,0x30, 0x2,0x4a,0x35, 0x1,0x6c,0x67, 0x2,0x4a,0x3c, 0x3,0x4b,0x73, 0x1,0x68,0x6e, 0x3,0x4b,0x7e, 0x1,0x68,0x6d, 0x2,0x4a,0x37, 0x3,0x4b,0x74, 0x1,0x6c,0x66, 0x2,0x4a,0x2c, 0x1,0x68,0x6c, 0x3,0x46,0x71, 0x2,0x4a,0x3b, 0x1,0x68,0x6a, 0x1,0x68,0x6b, 0x3,0x4b,0x7c, 0x2,0x4a,0x38, 0x2,0x50,0x51, 0x1,0x6c,0x64, 0x1,0x5f,0x35, 0x3,0x46,0x72, 0x2,0x4a,0x3a, 0x1,0x6c,0x6b, 0x2,0x4a,0x32, 0x4,0x49,0x6f, 0x1,0x6c,0x65, 0x3,0x46,0x6a, 0x1,0x6c,0x6a, 0x2,0x4a,0x2d, 0x2,0x4a,0x31, 0x2,0x4a,0x2e, 0x2,0x4a,0x34, 0x1,0x68,0x6f, 0x1,0x6c,0x63, 0x1,0x68,0x69, 0x3,0x4c,0x21, 0x2,0x50,0x43, 0x2,0x4a,0x36, 0x3,0x46,0x68, 0x1,0x6c,0x69, 0x3,0x46,0x73, 0x1,0x6c,0x6c, 0x7,0x22,0x71, 0x2,0x4a,0x33, 0x3,0x46,0x6b, 0x1,0x6c,0x68, 0x2,0x50,0x42, 0x5,0x4d,0x2a, 0x3,0x4c,0x23, 0x3,0x46,0x74, 0x3,0x4c,0x24, 0x3,0x4b,0x77, 0x2,0x50,0x47, 0x1,0x70,0x57, 0x2,0x50,0x41, 0x2,0x57,0x2e, 0x2,0x50,0x50, 0x1,0x6c,0x70, 0x3,0x4b,0x7a, 0x1,0x6c,0x6e, 0x1,0x70,0x55, 0x2,0x50,0x4d, 0x2,0x50,0x49, 0x1,0x6c,0x74, 0x3,0x4b,0x76, 0x2,0x57,0x25, 0x3,0x50,0x68, 0x3,0x4c,0x28, 0x3,0x50,0x67, 0x1,0x6c,0x72, 0x2,0x50,0x48, 0x3,0x4c,0x29, 0x2,0x57,0x23, 0x3,0x4c,0x25, 0x2,0x50,0x4c, 0x4,0x50,0x3b, 0x2,0x50,0x4f, 0x2,0x50,0x46, 0x3,0x4b,0x79, 0x1,0x6c,0x73, 0x4,0x50,0x37, 0x3,0x4b,0x75, 0x1,0x6c,0x6d, 0x2,0x57,0x24, 0x1,0x70,0x56, 0x2,0x50,0x4e, 0x1,0x6c,0x6f, 0x1,0x6c,0x71, 0x2,0x50,0x4b, 0x1,0x6c,0x75, 0x2,0x50,0x4a, 0x2,0x50,0x45, 0x2,0x50,0x44, 0x1,0x70,0x54, 0x2,0x50,0x52, 0x2,0x57,0x27, 0x2,0x5c,0x6b, 0x1,0x70,0x59, 0x3,0x50,0x61, 0x2,0x57,0x2d, 0x3,0x50,0x63, 0x2,0x57,0x2b, 0x3,0x50,0x6a, 0x2,0x5c,0x6c, 0x3,0x50,0x64, 0x1,0x70,0x5a, 0x2,0x57,0x2c, 0x3,0x50,0x66, 0x2,0x57,0x29, 0x1,0x73,0x5d, 0x2,0x5c,0x6a, 0x3,0x50,0x6c, 0x2,0x57,0x26, 0x2,0x57,0x28, 0x1,0x73,0x5e, 0x1,0x70,0x5c, 0x1,0x73,0x5c, 0x1,0x70,0x5b, 0x1,0x73,0x60, 0x2,0x57,0x2a, 0x1,0x70,0x58, 0x3,0x50,0x62, 0x3,0x50,0x65, 0x3,0x50,0x6b, 0x3,0x66,0x79, 0x4,0x5b,0x2b, 0x2,0x61,0x5b, 0x4,0x56,0x33, 0x2,0x61,0x53, 0x3,0x54,0x61, 0x3,0x54,0x5f, 0x3,0x54,0x5c, 0x3,0x54,0x5e, 0x3,0x54,0x5d, 0x2,0x5c,0x72, 0x2,0x61,0x54, 0x2,0x5c,0x6e, 0x4,0x56,0x32, 0x3,0x54,0x5b, 0x1,0x76,0x42, 0x2,0x5c,0x70, 0x2,0x5c,0x6f, 0x1,0x73,0x5f, 0x2,0x5c,0x6d, 0x2,0x5c,0x71, 0x2,0x61,0x5c, 0x2,0x61,0x58, 0x2,0x61,0x5a, 0x4,0x5f,0x60, 0x2,0x61,0x55, 0x2,0x61,0x56, 0x4,0x5f,0x61, 0x2,0x61,0x59, 0x2,0x61,0x57, 0x1,0x78,0x34, 0x3,0x57,0x65, 0x1,0x78,0x37, 0x1,0x78,0x36, 0x1,0x78,0x35, 0x1,0x79,0x6c, 0x2,0x68,0x76, 0x1,0x79,0x6d, 0x2,0x65,0x4c, 0x1,0x7a,0x6a, 0x2,0x6b,0x5a, 0x1,0x7a,0x6b, 0x1,0x7b,0x60, 0x1,0x7c,0x36, 0x2,0x6f,0x28, 0x3,0x5f,0x46, 0x2,0x6f,0x29, 0x2,0x6f,0x2a, 0x3,0x61,0x3e, 0x2,0x72,0x2a, 0x1,0x45,0x41, 0x2,0x21,0x5d, 0x1,0x46,0x53, 0x1,0x48,0x27, 0x1,0x48,0x28, 0x1,0x48,0x26, 0x3,0x23,0x6b, 0x1,0x48,0x29, 0x1,0x4a,0x3c, 0x1,0x4a,0x3b, 0x3,0x26,0x25, 0x2,0x26,0x70, 0x1,0x4d,0x51, 0x1,0x4d,0x50, 0x3,0x2c,0x63, 0x2,0x2f,0x31, 0x1,0x5a,0x51, 0x1,0x5a,0x52, 0x4,0x31,0x6e, 0x4,0x31,0x70, 0x3,0x3b,0x64, 0x1,0x5f,0x3c, 0x2,0x42,0x78, 0x1,0x64,0x28, 0x1,0x64,0x29, 0x2,0x42,0x7a, 0x2,0x42,0x7c, 0x2,0x42,0x7b, 0x4,0x3d,0x43, 0x2,0x4a,0x3e, 0x3,0x46,0x76, 0x2,0x4a,0x3d, 0x1,0x68,0x70, 0x2,0x4a,0x3f, 0x3,0x46,0x75, 0x2,0x50,0x53, 0x1,0x6c,0x76, 0x3,0x4c,0x2c, 0x1,0x70,0x5d, 0x3,0x50,0x6d, 0x1,0x73,0x61, 0x1,0x76,0x43, 0x1,0x73,0x62, 0x3,0x5f,0x48, 0x1,0x45,0x42, 0x3,0x21,0x65, 0x3,0x21,0x66, 0x3,0x22,0x4e, 0x2,0x24,0x28, 0x3,0x26,0x28, 0x3,0x26,0x29, 0x2,0x26,0x71, 0x1,0x4d,0x53, 0x1,0x4d,0x52, 0x1,0x4d,0x54, 0x1,0x51,0x37, 0x2,0x2a,0x53, 0x2,0x2a,0x54, 0x3,0x31,0x29, 0x2,0x2f,0x32, 0x1,0x55,0x52, 0x1,0x5a,0x53, 0x1,0x5f,0x3d, 0x2,0x3b,0x74, 0x1,0x45,0x43, 0x4,0x21,0x37, 0x1,0x44,0x5f, 0x1,0x45,0x44, 0x3,0x22,0x50, 0x2,0x21,0x5e, 0x1,0x46,0x57, 0x1,0x46,0x56, 0x1,0x46,0x54, 0x1,0x46,0x55, 0x3,0x23,0x6f, 0x1,0x48,0x2c, 0x2,0x22,0x49, 0x2,0x22,0x4b, 0x1,0x48,0x2b, 0x2,0x22,0x43, 0x3,0x23,0x6c, 0x2,0x22,0x44, 0x3,0x23,0x6d, 0x2,0x22,0x4a, 0x2,0x22,0x46, 0x2,0x22,0x48, 0x1,0x48,0x2a, 0x2,0x22,0x45, 0x2,0x22,0x4c, 0x2,0x22,0x47, 0x3,0x23,0x6e, 0xf,0x22,0x51, 0x1,0x4a,0x43, 0x1,0x4a,0x4c, 0x1,0x4a,0x4a, 0x2,0x24,0x32, 0x2,0x24,0x2f, 0x2,0x24,0x37, 0x1,0x4a,0x48, 0x2,0x24,0x38, 0x3,0x26,0x39, 0x1,0x4a,0x41, 0x2,0x24,0x35, 0x3,0x26,0x2e, 0x1,0x4a,0x47, 0x2,0x24,0x31, 0x2,0x24,0x30, 0x1,0x4a,0x45, 0x2,0x24,0x36, 0x1,0x4a,0x46, 0x1,0x4d,0x55, 0x1,0x4a,0x40, 0x2,0x24,0x33, 0x3,0x26,0x2a, 0x2,0x24,0x29, 0x1,0x4a,0x3d, 0x3,0x26,0x37, 0x1,0x4a,0x50, 0x2,0x24,0x2e, 0x2,0x24,0x34, 0x1,0x4a,0x42, 0x1,0x4a,0x44, 0x3,0x26,0x2f, 0x2,0x24,0x2a, 0x3,0x26,0x36, 0x2,0x24,0x2b, 0x2,0x24,0x2c, 0x4,0x24,0x39, 0x1,0x4a,0x4f, 0x1,0x4a,0x49, 0x1,0x4a,0x4e, 0x2,0x24,0x2d, 0x1,0x4a,0x4d, 0x1,0x4a,0x3f, 0x1,0x4a,0x3e, 0x1,0x4a,0x4b, 0x3,0x26,0x35, 0x4,0x24,0x3c, 0x3,0x26,0x33, 0x3,0x26,0x34, 0x3,0x26,0x38, 0x3,0x26,0x31, 0x3,0x64,0x7b, 0xf,0x24,0x39, 0x3,0x26,0x32, 0x3,0x29,0x31, 0x3,0x29,0x2a, 0x1,0x4d,0x63, 0x2,0x26,0x7d, 0x2,0x26,0x76, 0x1,0x4d,0x5e, 0x1,0x4d,0x71, 0x2,0x26,0x72, 0x2,0x26,0x79, 0x2,0x26,0x7b, 0x2,0x26,0x7e, 0x1,0x4d,0x6c, 0x3,0x29,0x26, 0x2,0x26,0x7a, 0x2,0x26,0x73, 0x1,0x4d,0x6a, 0x2,0x26,0x77, 0x3,0x29,0x28, 0x2,0x27,0x21, 0x1,0x4d,0x5b, 0x3,0x29,0x25, 0x2,0x26,0x7c, 0x1,0x4d,0x65, 0x1,0x4d,0x64, 0x2,0x26,0x75, 0x1,0x4d,0x59, 0x3,0x29,0x34, 0x3,0x29,0x32, 0x1,0x4d,0x5a, 0xf,0x27,0x30, 0x1,0x4d,0x58, 0x3,0x29,0x33, 0x1,0x4d,0x70, 0x1,0x4d,0x68, 0x1,0x4d,0x62, 0x1,0x4d,0x56, 0x2,0x26,0x78, 0x1,0x4d,0x61, 0x1,0x4d,0x57, 0x1,0x4d,0x69, 0x1,0x4d,0x72, 0x2,0x2a,0x55, 0x1,0x4d,0x66, 0x2,0x26,0x74, 0x1,0x4d,0x5c, 0x1,0x4d,0x5f, 0x1,0x4d,0x60, 0x3,0x29,0x2e, 0x1,0x4d,0x6e, 0x1,0x4d,0x6f, 0x1,0x4d,0x6d, 0x1,0x4d,0x67, 0x1,0x4d,0x6b, 0x1,0x4d,0x5d, 0x1,0x51,0x38, 0x3,0x29,0x30, 0x3,0x29,0x37, 0x3,0x29,0x35, 0x3,0x29,0x36, 0x3,0x29,0x2f, 0x3,0x29,0x29, 0x3,0x2c,0x6d, 0x2,0x2a,0x5b, 0x1,0x51,0x44, 0x1,0x51,0x3c, 0x1,0x51,0x3e, 0x1,0x51,0x43, 0x2,0x2a,0x67, 0x1,0x51,0x41, 0x2,0x2f,0x33, 0x1,0x55,0x53, 0x1,0x51,0x46, 0x2,0x2a,0x58, 0x2,0x2a,0x60, 0x1,0x51,0x42, 0x2,0x2a,0x5f, 0x2,0x2a,0x5c, 0x2,0x2a,0x64, 0x2,0x2a,0x66, 0x1,0x51,0x3b, 0x1,0x51,0x3f, 0x1,0x51,0x45, 0x1,0x55,0x55, 0x2,0x2a,0x61, 0x1,0x51,0x3d, 0x1,0x51,0x48, 0x2,0x2a,0x5a, 0x3,0x2c,0x6f, 0x3,0x2c,0x70, 0x5,0x29,0x45, 0x1,0x51,0x40, 0x1,0x55,0x54, 0x1,0x51,0x3a, 0x4,0x29,0x59, 0x2,0x2a,0x57, 0x2,0x2a,0x5e, 0x2,0x2a,0x56, 0x2,0x2a,0x59, 0x2,0x2a,0x5d, 0x2,0x2f,0x34, 0x1,0x51,0x47, 0x4,0x29,0x51, 0x2,0x2a,0x62, 0x2,0x2a,0x63, 0x2,0x2a,0x65, 0x1,0x51,0x39, 0x3,0x2c,0x6c, 0x3,0x31,0x32, 0x3,0x31,0x33, 0x3,0x2c,0x6b, 0x3,0x2c,0x6e, 0x4,0x29,0x5b, 0x1,0x55,0x63, 0x2,0x2f,0x40, 0x1,0x55,0x61, 0x1,0x55,0x62, 0x2,0x2f,0x36, 0x2,0x2f,0x46, 0x3,0x31,0x2c, 0x1,0x55,0x58, 0x3,0x31,0x2f, 0x3,0x31,0x35, 0x2,0x35,0x4a, 0x2,0x2f,0x48, 0x2,0x2f,0x42, 0x3,0x31,0x38, 0x2,0x2f,0x39, 0x3,0x31,0x37, 0x2,0x2f,0x4b, 0x2,0x2f,0x3c, 0x1,0x55,0x5e, 0x2,0x35,0x61, 0x2,0x2f,0x3f, 0x1,0x55,0x60, 0x1,0x55,0x57, 0x3,0x31,0x3c, 0x2,0x2f,0x4d, 0x2,0x2f,0x41, 0x1,0x55,0x5a, 0x2,0x2f,0x3a, 0x2,0x2f,0x37, 0x2,0x2f,0x38, 0x1,0x55,0x5b, 0x2,0x2f,0x47, 0x2,0x2f,0x4e, 0x1,0x55,0x5d, 0x2,0x2f,0x3e, 0x2,0x2f,0x3d, 0x1,0x55,0x65, 0x1,0x55,0x64, 0x1,0x55,0x56, 0x1,0x55,0x5c, 0x1,0x55,0x5f, 0x2,0x2f,0x4a, 0x3,0x31,0x2e, 0x3,0x31,0x39, 0x2,0x2f,0x44, 0x1,0x55,0x59, 0x2,0x2f,0x35, 0x2,0x2f,0x4c, 0x2,0x2f,0x43, 0x2,0x2f,0x45, 0x2,0x2f,0x49, 0x3,0x31,0x30, 0x3,0x31,0x3b, 0x3,0x31,0x36, 0x3,0x64,0x7c, 0x3,0x64,0x7d, 0x2,0x35,0x4b, 0x3,0x36,0x31, 0x1,0x5a,0x5b, 0x1,0x5a,0x6f, 0x1,0x5a,0x6e, 0x3,0x36,0x27, 0x1,0x5a,0x63, 0x3,0x36,0x29, 0x2,0x35,0x5d, 0x2,0x35,0x59, 0x2,0x35,0x56, 0x2,0x35,0x68, 0x1,0x5a,0x5e, 0x1,0x5a,0x56, 0x3,0x36,0x26, 0x3,0x36,0x32, 0x2,0x35,0x5b, 0x1,0x5f,0x4d, 0x1,0x5a,0x5a, 0x2,0x35,0x63, 0x3,0x36,0x22, 0x1,0x5a,0x70, 0x1,0x5a,0x6d, 0x2,0x35,0x5f, 0x2,0x35,0x4e, 0x3,0x35,0x7c, 0x3,0x36,0x2b, 0x1,0x5a,0x6c, 0x2,0x35,0x65, 0x2,0x35,0x4d, 0x1,0x5a,0x61, 0x1,0x5a,0x65, 0x2,0x35,0x64, 0x3,0x36,0x23, 0x2,0x35,0x57, 0x1,0x5a,0x66, 0x1,0x5a,0x60, 0x2,0x35,0x4c, 0x3,0x35,0x7d, 0x1,0x5f,0x3f, 0x2,0x35,0x67, 0x2,0x35,0x55, 0x1,0x5a,0x6b, 0x2,0x35,0x58, 0x2,0x35,0x66, 0x1,0x5a,0x6a, 0x3,0x36,0x24, 0x2,0x3b,0x75, 0x4,0x31,0x77, 0x1,0x5a,0x57, 0x2,0x35,0x53, 0x1,0x5a,0x5c, 0x1,0x5a,0x67, 0x4,0x31,0x78, 0x1,0x5a,0x62, 0x2,0x35,0x5c, 0x2,0x35,0x52, 0x2,0x35,0x50, 0x2,0x35,0x62, 0x1,0x5a,0x54, 0x1,0x5a,0x68, 0x1,0x5a,0x58, 0x1,0x5f,0x3e, 0x2,0x35,0x60, 0x1,0x5a,0x59, 0x4,0x32,0x23, 0x1,0x5a,0x55, 0x1,0x5a,0x64, 0x1,0x5a,0x5f, 0x1,0x5a,0x5d, 0x2,0x35,0x54, 0x1,0x5a,0x69, 0x2,0x35,0x51, 0x2,0x35,0x5e, 0x2,0x35,0x5a, 0x2,0x3b,0x77, 0x2,0x3b,0x76, 0x3,0x36,0x2d, 0x3,0x64,0x7e, 0x3,0x36,0x2e, 0x2,0x35,0x4f, 0x2,0x3c,0x29, 0x3,0x3b,0x71, 0x1,0x5f,0x41, 0x3,0x3b,0x70, 0x2,0x3c,0x2f, 0x2,0x3b,0x7c, 0x2,0x3c,0x2c, 0x2,0x42,0x7d, 0x1,0x5f,0x44, 0x2,0x3c,0x30, 0x2,0x3c,0x33, 0x1,0x5f,0x43, 0x2,0x3c,0x21, 0x2,0x3c,0x32, 0x2,0x3c,0x31, 0x1,0x5f,0x45, 0x2,0x3b,0x78, 0x1,0x5f,0x40, 0x1,0x5f,0x48, 0x3,0x3b,0x73, 0x1,0x5f,0x46, 0x2,0x3c,0x2e, 0x4,0x37,0x71, 0x2,0x3c,0x24, 0x1,0x5f,0x4a, 0x2,0x3c,0x35, 0x2,0x3c,0x2d, 0x2,0x3c,0x36, 0x1,0x5f,0x52, 0x1,0x5f,0x50, 0x2,0x3c,0x2b, 0x2,0x3c,0x2a, 0x3,0x3b,0x67, 0x2,0x3c,0x28, 0x2,0x3c,0x22, 0x1,0x5f,0x49, 0x3,0x3b,0x66, 0x1,0x5f,0x47, 0x2,0x2f,0x3b, 0x2,0x3b,0x79, 0x3,0x3b,0x68, 0x2,0x43,0x3d, 0x2,0x3b,0x7a, 0x1,0x5f,0x42, 0x1,0x5f,0x4f, 0x2,0x43,0x21, 0x4,0x37,0x60, 0x1,0x5f,0x4b, 0x1,0x5f,0x4c, 0x2,0x3b,0x7b, 0x2,0x3c,0x34, 0x2,0x42,0x7e, 0x2,0x3c,0x25, 0x2,0x3b,0x7e, 0x1,0x5f,0x4e, 0x2,0x3c,0x26, 0x2,0x3c,0x23, 0x3,0x3b,0x72, 0x3,0x3b,0x6d, 0x1,0x5f,0x53, 0x4,0x37,0x6f, 0x3,0x3b,0x6f, 0x3,0x65,0x21, 0x1,0x64,0x38, 0x3,0x41,0x49, 0x3,0x41,0x32, 0x2,0x43,0x24, 0x2,0x43,0x37, 0x2,0x43,0x3c, 0x2,0x43,0x30, 0x1,0x64,0x34, 0x2,0x43,0x41, 0x1,0x64,0x31, 0x2,0x43,0x22, 0x3,0x41,0x3a, 0x2,0x43,0x23, 0x1,0x64,0x2a, 0x1,0x64,0x33, 0x2,0x43,0x2a, 0x1,0x64,0x36, 0x1,0x64,0x37, 0x2,0x43,0x2b, 0x3,0x41,0x38, 0x2,0x43,0x38, 0x2,0x43,0x3e, 0x1,0x64,0x32, 0x3,0x41,0x3e, 0x1,0x64,0x2c, 0x2,0x43,0x29, 0x2,0x43,0x25, 0x2,0x43,0x40, 0x2,0x43,0x2e, 0x2,0x43,0x2f, 0x2,0x43,0x26, 0x2,0x43,0x3a, 0x2,0x43,0x31, 0x2,0x43,0x3b, 0x2,0x43,0x33, 0x3,0x41,0x3d, 0x1,0x64,0x2d, 0x2,0x4a,0x40, 0x1,0x64,0x30, 0x1,0x64,0x2e, 0x2,0x43,0x3f, 0x2,0x43,0x36, 0x2,0x43,0x32, 0x3,0x41,0x36, 0x3,0x41,0x33, 0x2,0x43,0x27, 0x1,0x68,0x7a, 0x2,0x43,0x35, 0x1,0x64,0x35, 0x2,0x43,0x2d, 0x3,0x41,0x34, 0x2,0x43,0x2c, 0x3,0x41,0x48, 0x3,0x47,0x25, 0x3,0x41,0x42, 0x1,0x64,0x2f, 0x1,0x64,0x2b, 0x2,0x4a,0x55, 0x2,0x43,0x39, 0x2,0x43,0x34, 0x2,0x43,0x28, 0x3,0x41,0x44, 0x3,0x41,0x45, 0x3,0x66,0x76, 0x2,0x4a,0x50, 0x3,0x46,0x78, 0x2,0x4a,0x41, 0x2,0x4a,0x4c, 0x3,0x47,0x28, 0x2,0x4a,0x53, 0x1,0x68,0x78, 0x1,0x5f,0x51, 0x2,0x4a,0x51, 0x1,0x68,0x73, 0x3,0x46,0x7e, 0x3,0x47,0x24, 0x3,0x46,0x7a, 0x1,0x68,0x72, 0x2,0x4a,0x58, 0x4,0x43,0x5d, 0x2,0x4a,0x42, 0x2,0x4a,0x4f, 0x2,0x4a,0x43, 0x2,0x4a,0x4e, 0x1,0x68,0x76, 0x2,0x4a,0x52, 0x2,0x3c,0x27, 0x3,0x47,0x21, 0x4,0x43,0x5e, 0x3,0x47,0x2a, 0x2,0x4a,0x59, 0x2,0x4a,0x4a, 0x1,0x68,0x79, 0x2,0x50,0x61, 0x1,0x6c,0x77, 0x3,0x47,0x23, 0x2,0x4a,0x57, 0x2,0x4a,0x56, 0x1,0x68,0x7b, 0x2,0x50,0x54, 0x1,0x6c,0x78, 0x2,0x50,0x55, 0x3,0x47,0x22, 0x2,0x4a,0x46, 0x2,0x4a,0x47, 0x2,0x4a,0x44, 0x2,0x4a,0x49, 0x2,0x4a,0x45, 0x2,0x4a,0x5a, 0x1,0x68,0x75, 0x1,0x6c,0x79, 0x1,0x68,0x77, 0x1,0x68,0x7c, 0x3,0x46,0x7b, 0x2,0x4a,0x48, 0x3,0x47,0x29, 0x2,0x4a,0x54, 0x3,0x4c,0x2d, 0x3,0x47,0x26, 0x2,0x4a,0x4d, 0x3,0x4c,0x35, 0x2,0x50,0x58, 0x3,0x4c,0x38, 0x1,0x68,0x71, 0x1,0x6c,0x7c, 0x2,0x57,0x35, 0x2,0x50,0x5d, 0x2,0x50,0x5c, 0x2,0x50,0x5e, 0x3,0x4c,0x30, 0x3,0x4c,0x2f, 0x2,0x50,0x5b, 0x1,0x6c,0x7d, 0x3,0x4c,0x3b, 0x1,0x6d,0x25, 0x1,0x6d,0x22, 0x3,0x4c,0x31, 0x1,0x6d,0x23, 0x2,0x50,0x56, 0x2,0x50,0x59, 0x2,0x50,0x63, 0x1,0x6d,0x2b, 0x1,0x6d,0x29, 0x3,0x4c,0x2e, 0x2,0x50,0x5a, 0x2,0x3b,0x7d, 0x1,0x6c,0x7a, 0x2,0x50,0x60, 0x2,0x50,0x57, 0x3,0x4c,0x3e, 0x1,0x6d,0x2c, 0x2,0x50,0x5f, 0x1,0x68,0x74, 0x1,0x6d,0x21, 0x2,0x4a,0x4b, 0x3,0x4c,0x3f, 0x3,0x4c,0x34, 0x1,0x6d,0x24, 0x3,0x4c,0x3d, 0x1,0x6d,0x28, 0x1,0x6d,0x2a, 0x1,0x6d,0x27, 0x1,0x6d,0x26, 0x3,0x4c,0x3a, 0x1,0x6c,0x7e, 0x2,0x50,0x62, 0x1,0x6c,0x7b, 0x1,0x6d,0x2d, 0x3,0x4c,0x39, 0x3,0x65,0x22, 0x3,0x4c,0x37, 0x1,0x70,0x61, 0x1,0x70,0x62, 0x2,0x57,0x34, 0x1,0x70,0x6b, 0x1,0x70,0x68, 0x3,0x50,0x70, 0x1,0x70,0x5f, 0x1,0x70,0x66, 0x2,0x57,0x36, 0x1,0x70,0x64, 0x1,0x70,0x5e, 0x3,0x4c,0x32, 0x1,0x70,0x65, 0x3,0x50,0x77, 0x2,0x57,0x33, 0x1,0x73,0x64, 0x1,0x70,0x60, 0x5,0x54,0x5e, 0x1,0x70,0x67, 0x1,0x73,0x63, 0x2,0x57,0x32, 0x2,0x57,0x31, 0x3,0x50,0x76, 0x1,0x70,0x69, 0x3,0x50,0x6f, 0x1,0x70,0x6a, 0x3,0x50,0x79, 0x2,0x57,0x30, 0x2,0x57,0x2f, 0x1,0x73,0x65, 0x2,0x57,0x39, 0x1,0x70,0x63, 0x2,0x57,0x37, 0x3,0x50,0x75, 0x3,0x54,0x64, 0x1,0x73,0x66, 0x3,0x54,0x67, 0x1,0x73,0x6b, 0x2,0x5c,0x75, 0x2,0x5c,0x77, 0x3,0x57,0x6b, 0x1,0x73,0x68, 0x3,0x57,0x6d, 0x2,0x5c,0x78, 0x2,0x5c,0x74, 0x3,0x57,0x6c, 0x2,0x5c,0x76, 0x1,0x73,0x69, 0x1,0x73,0x6c, 0x3,0x54,0x69, 0x2,0x5c,0x73, 0x1,0x73,0x67, 0x1,0x73,0x6a, 0x1,0x76,0x45, 0x2,0x57,0x38, 0x1,0x76,0x44, 0x7,0x3f,0x62, 0x3,0x57,0x6a, 0x1,0x76,0x4a, 0x2,0x61,0x60, 0x3,0x57,0x70, 0x1,0x76,0x48, 0x1,0x76,0x49, 0x2,0x61,0x63, 0x2,0x61,0x5f, 0x1,0x76,0x46, 0x2,0x61,0x5d, 0x1,0x78,0x38, 0x2,0x61,0x61, 0x4,0x5b,0x36, 0x2,0x61,0x62, 0x2,0x61,0x5e, 0x3,0x57,0x6e, 0x1,0x76,0x47, 0x2,0x65,0x4d, 0x3,0x5a,0x3b, 0x2,0x65,0x50, 0x3,0x5a,0x3c, 0x3,0x5a,0x3a, 0x2,0x65,0x51, 0x2,0x65,0x4f, 0x2,0x65,0x52, 0x1,0x78,0x39, 0x2,0x65,0x4e, 0x3,0x5e,0x31, 0x2,0x68,0x7a, 0x1,0x79,0x6f, 0x2,0x68,0x79, 0x2,0x68,0x78, 0x2,0x68,0x77, 0x1,0x79,0x6e, 0x1,0x79,0x70, 0x3,0x65,0x23, 0x2,0x6b,0x5b, 0x1,0x7a,0x6d, 0x1,0x7a,0x6c, 0x3,0x5f,0x4a, 0x3,0x5f,0x4b, 0x2,0x6d,0x4f, 0x2,0x6d,0x4e, 0x2,0x6d,0x51, 0x1,0x7c,0x37, 0x1,0x7b,0x61, 0x2,0x6f,0x2c, 0x2,0x6d,0x50, 0x3,0x5f,0x49, 0x3,0x60,0x32, 0x2,0x6f,0x2b, 0x1,0x7c,0x39, 0x1,0x7c,0x38, 0x1,0x7c,0x5f, 0x2,0x70,0x37, 0x2,0x70,0x7d, 0x1,0x45,0x45, 0x6,0x23,0x6c, 0x3,0x2c,0x72, 0x2,0x3c,0x37, 0x2,0x57,0x3a, 0x3,0x21,0x67, 0x3,0x21,0x68, 0x1,0x48,0x2d, 0x2,0x22,0x4d, 0x1,0x4a,0x53, 0x1,0x4a,0x51, 0x4,0x24,0x3f, 0x1,0x4a,0x52, 0x4,0x24,0x3e, 0x2,0x27,0x22, 0x1,0x4d,0x73, 0x1,0x51,0x49, 0x3,0x2c,0x74, 0x2,0x2a,0x68, 0x3,0x2c,0x76, 0x2,0x2a,0x69, 0x3,0x2c,0x73, 0x1,0x51,0x4a, 0x2,0x2f,0x50, 0x4,0x2d,0x43, 0x1,0x55,0x66, 0x1,0x55,0x67, 0x2,0x2f,0x4f, 0x3,0x31,0x3d, 0x4,0x2d,0x44, 0x3,0x36,0x37, 0x3,0x36,0x36, 0x1,0x5a,0x77, 0x4,0x32,0x2b, 0x1,0x5a,0x73, 0x4,0x32,0x2f, 0x2,0x35,0x69, 0x1,0x5a,0x7a, 0x1,0x5a,0x79, 0x1,0x5a,0x72, 0x1,0x5a,0x75, 0x1,0x5a,0x78, 0x1,0x5a,0x74, 0x3,0x36,0x34, 0x2,0x3c,0x3b, 0x1,0x5a,0x71, 0x1,0x5f,0x54, 0x3,0x3b,0x74, 0x3,0x3b,0x75, 0x3,0x3b,0x76, 0x1,0x5f,0x56, 0x1,0x5f,0x57, 0x2,0x3c,0x3a, 0x2,0x3c,0x3d, 0x1,0x5f,0x55, 0x2,0x3c,0x38, 0x2,0x3c,0x3c, 0x2,0x3c,0x39, 0x3,0x41,0x4b, 0x1,0x64,0x39, 0x3,0x41,0x4e, 0x4,0x3d,0x5d, 0x2,0x43,0x42, 0x3,0x41,0x4d, 0x3,0x47,0x30, 0x1,0x68,0x7d, 0x2,0x4a,0x5b, 0x1,0x70,0x6c, 0x1,0x6d,0x2e, 0x2,0x50,0x64, 0x1,0x6d,0x2f, 0x1,0x6d,0x30, 0x2,0x50,0x66, 0x2,0x50,0x65, 0x2,0x50,0x67, 0x2,0x57,0x3c, 0x2,0x57,0x3b, 0x2,0x5c,0x7a, 0x2,0x5c,0x79, 0x1,0x73,0x6d, 0x1,0x73,0x6e, 0x2,0x65,0x53, 0x3,0x5c,0x41, 0x1,0x45,0x46, 0x3,0x25,0x58, 0x3,0x29,0x39, 0x4,0x2d,0x47, 0x3,0x31,0x40, 0x2,0x3c,0x3e, 0x3,0x36,0x38, 0x3,0x36,0x39, 0x1,0x5f,0x59, 0x1,0x5f,0x58, 0x2,0x43,0x43, 0x2,0x61,0x64, 0x1,0x7a,0x6e, 0x2,0x6f,0x2d, 0x1,0x45,0x47, 0x4,0x24,0x41, 0x1,0x55,0x68, 0x3,0x31,0x42, 0x1,0x5a,0x7c, 0x1,0x5a,0x7b, 0x2,0x3c,0x3f, 0x2,0x3c,0x40, 0x1,0x64,0x3a, 0x2,0x4a,0x5c, 0x1,0x68,0x7e, 0x2,0x57,0x3d, 0x4,0x56,0x3f, 0x1,0x45,0x48, 0x1,0x46,0x58, 0x3,0x29,0x3b, 0x1,0x4d,0x74, 0x2,0x27,0x23, 0x2,0x2a,0x6a, 0x1,0x51,0x4b, 0x1,0x5a,0x7d, 0x3,0x36,0x3a, 0x2,0x3c,0x41, 0x1,0x5f,0x5a, 0x1,0x64,0x3b, 0x4,0x3d,0x63, 0x2,0x50,0x68, 0x2,0x50,0x69, 0x4,0x50,0x4e, 0x3,0x54,0x6b, 0x2,0x5c,0x7b, 0x1,0x76,0x4b, 0x2,0x70,0x7e, 0x1,0x45,0x49, 0x3,0x29,0x3c, 0x2,0x27,0x24, 0x1,0x4d,0x75, 0x1,0x51,0x4c, 0x3,0x2c,0x77, 0x2,0x2a,0x6b, 0x1,0x55,0x69, 0x2,0x2f,0x54, 0x2,0x2f,0x52, 0x2,0x2f,0x53, 0x1,0x55,0x6a, 0x2,0x2f,0x51, 0x3,0x36,0x3c, 0x4,0x32,0x34, 0x3,0x36,0x3f, 0x3,0x36,0x3d, 0x1,0x5b,0x21, 0x1,0x5b,0x22, 0x2,0x35,0x6a, 0x1,0x5b,0x23, 0x1,0x5a,0x7e, 0x2,0x3c,0x42, 0x3,0x3b,0x79, 0x2,0x3c,0x43, 0x2,0x43,0x44, 0x4,0x3d,0x64, 0x1,0x69,0x22, 0x1,0x69,0x21, 0x4,0x50,0x4f, 0xf,0x54,0x64, 0x2,0x5c,0x7c, 0x2,0x61,0x65, 0x3,0x5a,0x3f, 0x2,0x65,0x55, 0x2,0x65,0x54, 0x2,0x68,0x7b, 0x3,0x21,0x69, 0x2,0x21,0x3e, 0x1,0x51,0x4d, 0x3,0x36,0x41, 0x3,0x41,0x50, 0x1,0x45,0x4a, 0x1,0x46,0x59, 0x3,0x22,0x51, 0x1,0x48,0x2f, 0x1,0x48,0x2e, 0x3,0x23,0x73, 0x3,0x23,0x72, 0x1,0x48,0x30, 0x1,0x48,0x31, 0x2,0x22,0x4f, 0x2,0x22,0x4e, 0x2,0x24,0x39, 0x1,0x4a,0x54, 0x2,0x24,0x3c, 0x2,0x24,0x3b, 0x2,0x24,0x3a, 0x2,0x24,0x3d, 0x3,0x26,0x3d, 0x4,0x26,0x62, 0x1,0x4d,0x76, 0x2,0x27,0x2a, 0x2,0x27,0x26, 0x2,0x27,0x2f, 0x3,0x29,0x43, 0x3,0x29,0x3e, 0x1,0x4d,0x7d, 0x3,0x29,0x42, 0x1,0x4d,0x7b, 0x2,0x27,0x2b, 0x2,0x27,0x27, 0x2,0x27,0x2e, 0x1,0x4d,0x7a, 0x1,0x4e,0x23, 0x2,0x27,0x29, 0x2,0x27,0x25, 0x1,0x4e,0x22, 0x2,0x27,0x2c, 0x1,0x4d,0x79, 0x2,0x27,0x2d, 0x1,0x4d,0x7c, 0x1,0x4d,0x7e, 0x2,0x27,0x31, 0x2,0x27,0x30, 0x2,0x27,0x28, 0x1,0x4d,0x78, 0x1,0x4d,0x77, 0x1,0x4e,0x21, 0x4,0x26,0x61, 0x3,0x29,0x40, 0x3,0x29,0x41, 0xf,0x27,0x3e, 0x3,0x2c,0x7e, 0x3,0x2c,0x7a, 0x2,0x2a,0x70, 0x2,0x2a,0x76, 0x3,0x2d,0x23, 0x1,0x51,0x53, 0x1,0x51,0x50, 0x2,0x2a,0x6d, 0x2,0x2a,0x72, 0x3,0x2c,0x7c, 0x1,0x51,0x56, 0x1,0x51,0x4e, 0x2,0x2a,0x71, 0x1,0x51,0x51, 0x1,0x51,0x54, 0x3,0x2c,0x79, 0x4,0x29,0x67, 0x2,0x2a,0x74, 0x3,0x2c,0x7d, 0x1,0x51,0x4f, 0x2,0x2a,0x79, 0x1,0x51,0x52, 0x3,0x2d,0x21, 0x1,0x51,0x55, 0x2,0x2a,0x6e, 0x2,0x2a,0x73, 0x2,0x2a,0x77, 0x2,0x2a,0x6f, 0x2,0x2a,0x6c, 0x3,0x2d,0x24, 0x3,0x2d,0x25, 0x2,0x2a,0x78, 0x2,0x2a,0x75, 0x3,0x2d,0x22, 0x3,0x2c,0x37, 0x3,0x31,0x46, 0x1,0x55,0x72, 0x1,0x55,0x6b, 0x1,0x55,0x6e, 0x3,0x31,0x4c, 0x1,0x55,0x71, 0x3,0x31,0x44, 0x2,0x2f,0x57, 0x3,0x31,0x49, 0x1,0x55,0x6c, 0x2,0x2f,0x55, 0x3,0x31,0x48, 0x1,0x55,0x70, 0x3,0x31,0x4d, 0x3,0x31,0x45, 0x1,0x55,0x6d, 0x3,0x31,0x43, 0x2,0x2f,0x58, 0x1,0x55,0x6f, 0x3,0x36,0x42, 0x4,0x32,0x39, 0x2,0x35,0x6e, 0x1,0x5b,0x25, 0x2,0x35,0x6d, 0x2,0x35,0x6f, 0x1,0x5b,0x24, 0x1,0x5b,0x29, 0x2,0x2f,0x56, 0x3,0x31,0x4b, 0x2,0x35,0x6c, 0x2,0x35,0x70, 0x3,0x36,0x44, 0x1,0x5b,0x26, 0x2,0x35,0x6b, 0x1,0x5b,0x28, 0x3,0x36,0x45, 0x1,0x5b,0x27, 0x3,0x3c,0x26, 0x2,0x3c,0x4a, 0x3,0x3b,0x7d, 0x2,0x3c,0x45, 0x3,0x3c,0x25, 0x1,0x5f,0x5b, 0x1,0x5f,0x5f, 0x1,0x5f,0x5c, 0x2,0x3c,0x48, 0x2,0x3c,0x4b, 0x3,0x3c,0x23, 0x1,0x5f,0x5d, 0x4,0x38,0x24, 0x1,0x5f,0x5e, 0x1,0x5f,0x63, 0x2,0x43,0x4d, 0x2,0x3c,0x49, 0x1,0x5f,0x61, 0x2,0x3c,0x46, 0x2,0x3c,0x44, 0x3,0x3b,0x7c, 0x1,0x5f,0x62, 0x3,0x3b,0x7e, 0x2,0x3c,0x47, 0x3,0x3c,0x24, 0x1,0x64,0x41, 0x4,0x3d,0x69, 0x2,0x43,0x45, 0x1,0x64,0x3e, 0x1,0x64,0x3f, 0x1,0x64,0x3d, 0x2,0x43,0x4a, 0x2,0x43,0x49, 0x2,0x43,0x46, 0x1,0x64,0x43, 0x3,0x41,0x5b, 0x3,0x41,0x56, 0x2,0x43,0x48, 0x1,0x5f,0x60, 0x3,0x41,0x59, 0x3,0x41,0x51, 0x2,0x43,0x4c, 0x2,0x43,0x47, 0x1,0x64,0x40, 0x1,0x64,0x3c, 0x1,0x64,0x42, 0x2,0x43,0x4b, 0x3,0x47,0x34, 0x4,0x43,0x6b, 0x3,0x47,0x35, 0x1,0x69,0x25, 0x4,0x43,0x6f, 0x2,0x4a,0x5f, 0x2,0x4a,0x5e, 0x2,0x4a,0x5d, 0x1,0x69,0x23, 0x4,0x43,0x6d, 0x3,0x47,0x39, 0x3,0x47,0x33, 0x3,0x47,0x37, 0x1,0x69,0x24, 0x2,0x50,0x6c, 0x2,0x50,0x6f, 0x1,0x6d,0x32, 0x3,0x4c,0x44, 0x3,0x4c,0x46, 0x1,0x6d,0x31, 0x2,0x50,0x70, 0x2,0x50,0x6b, 0x1,0x6d,0x34, 0x2,0x50,0x6d, 0x3,0x4c,0x41, 0x1,0x6d,0x33, 0x2,0x50,0x6a, 0x3,0x4c,0x40, 0x2,0x50,0x6e, 0x1,0x70,0x72, 0x1,0x70,0x6f, 0x2,0x57,0x46, 0x2,0x57,0x45, 0x3,0x4c,0x43, 0x2,0x57,0x44, 0x2,0x57,0x3f, 0x3,0x50,0x7d, 0x2,0x57,0x40, 0x3,0x51,0x23, 0x4,0x50,0x50, 0x3,0x50,0x7a, 0x1,0x70,0x70, 0x3,0x50,0x7e, 0x1,0x70,0x6d, 0x1,0x70,0x71, 0x2,0x57,0x3e, 0x1,0x70,0x6e, 0x2,0x57,0x41, 0x2,0x57,0x42, 0x2,0x57,0x47, 0x3,0x51,0x22, 0x3,0x54,0x71, 0x2,0x57,0x43, 0x3,0x54,0x6f, 0x3,0x54,0x70, 0x2,0x5c,0x7d, 0x4,0x56,0x41, 0x3,0x54,0x6c, 0x3,0x54,0x6d, 0x1,0x73,0x70, 0x3,0x54,0x72, 0x2,0x61,0x68, 0x1,0x73,0x6f, 0x2,0x61,0x66, 0x2,0x61,0x67, 0x1,0x76,0x4c, 0x1,0x78,0x3b, 0x2,0x65,0x56, 0x3,0x5a,0x43, 0x1,0x78,0x3a, 0x3,0x5a,0x42, 0x3,0x65,0x26, 0x2,0x68,0x7d, 0x2,0x68,0x7e, 0x3,0x5c,0x42, 0x1,0x79,0x71, 0x3,0x5c,0x43, 0x2,0x68,0x7c, 0x1,0x7a,0x6f, 0x4,0x6a,0x4c, 0x2,0x6f,0x2e, 0x1,0x7c,0x3a, 0x2,0x70,0x38, 0x2,0x70,0x39, 0x3,0x61,0x3f, 0x1,0x45,0x4b, 0x4,0x21,0x7c, 0x1,0x48,0x32, 0x1,0x48,0x33, 0x1,0x4a,0x55, 0x3,0x26,0x41, 0x2,0x27,0x32, 0x1,0x51,0x57, 0x1,0x55,0x73, 0x1,0x5b,0x2a, 0xf,0x32,0x73, 0x1,0x59,0x37, 0x1,0x5f,0x64, 0x1,0x5f,0x65, 0x1,0x5e,0x32, 0x2,0x3c,0x4c, 0x3,0x65,0x27, 0x1,0x64,0x44, 0x2,0x4a,0x61, 0x2,0x4a,0x60, 0x3,0x51,0x24, 0x7,0x53,0x47, 0x1,0x45,0x4c, 0x1,0x48,0x34, 0x2,0x27,0x33, 0x1,0x4e,0x25, 0x3,0x29,0x45, 0x1,0x4e,0x24, 0x3,0x2d,0x27, 0x2,0x2a,0x7a, 0x2,0x2a,0x7b, 0x3,0x66,0x32, 0x2,0x2f,0x59, 0x2,0x2f,0x5a, 0x1,0x55,0x74, 0x1,0x55,0x75, 0x3,0x36,0x48, 0x1,0x55,0x76, 0x2,0x35,0x71, 0x3,0x36,0x47, 0x3,0x36,0x46, 0x1,0x5b,0x2c, 0x4,0x38,0x29, 0x1,0x5f,0x67, 0x3,0x3c,0x29, 0x1,0x5f,0x66, 0x2,0x43,0x4e, 0x2,0x46,0x41, 0x2,0x4a,0x62, 0x2,0x57,0x48, 0x3,0x51,0x26, 0x3,0x66,0x33, 0x1,0x76,0x4d, 0x1,0x79,0x72, 0x1,0x45,0x4d, 0x1,0x46,0x5c, 0x1,0x46,0x5d, 0x1,0x46,0x5b, 0x1,0x46,0x5e, 0x1,0x46,0x5a, 0x3,0x22,0x52, 0x1,0x48,0x37, 0x3,0x23,0x77, 0x2,0x22,0x57, 0x1,0x48,0x36, 0x1,0x48,0x38, 0x3,0x23,0x78, 0x3,0x23,0x75, 0x2,0x22,0x52, 0x2,0x22,0x51, 0x2,0x22,0x54, 0x2,0x22,0x53, 0x2,0x22,0x56, 0x1,0x48,0x35, 0x2,0x22,0x50, 0x2,0x22,0x55, 0xf,0x22,0x58, 0xf,0x22,0x57, 0x3,0x26,0x48, 0x2,0x24,0x3e, 0x1,0x4a,0x5f, 0x2,0x24,0x3f, 0x2,0x24,0x43, 0x1,0x4a,0x5e, 0x3,0x26,0x49, 0x2,0x24,0x47, 0x2,0x24,0x42, 0x2,0x24,0x45, 0x1,0x4a,0x57, 0x1,0x4a,0x58, 0x1,0x4a,0x59, 0x1,0x4a,0x5a, 0x3,0x26,0x45, 0x1,0x4a,0x61, 0x3,0x26,0x44, 0x2,0x24,0x41, 0x1,0x4a,0x5c, 0x1,0x4a,0x62, 0x3,0x26,0x47, 0x2,0x24,0x40, 0x2,0x24,0x46, 0x3,0x26,0x42, 0x1,0x4a,0x5b, 0x2,0x24,0x44, 0x1,0x4a,0x5d, 0x1,0x4a,0x56, 0x1,0x4a,0x60, 0x3,0x26,0x4a, 0xf,0x24,0x22, 0x4,0x24,0x46, 0xf,0x24,0x53, 0x1,0x4e,0x3a, 0x3,0x29,0x47, 0x2,0x27,0x35, 0x1,0x4e,0x26, 0x4,0x26,0x69, 0x1,0x4e,0x30, 0x1,0x4e,0x31, 0x1,0x4e,0x29, 0x1,0x4e,0x3b, 0x1,0x4e,0x2b, 0x2,0x27,0x3d, 0x1,0x4e,0x36, 0x2,0x27,0x38, 0x1,0x4e,0x2c, 0x2,0x27,0x47, 0x2,0x27,0x48, 0x2,0x27,0x40, 0x2,0x27,0x39, 0x1,0x4e,0x39, 0x2,0x27,0x45, 0x1,0x4e,0x34, 0x1,0x4e,0x32, 0x3,0x29,0x52, 0x2,0x27,0x46, 0x3,0x29,0x49, 0x2,0x27,0x44, 0x2,0x27,0x3c, 0x2,0x27,0x34, 0x2,0x27,0x3b, 0x1,0x4e,0x2d, 0x4,0x26,0x65, 0x1,0x4e,0x33, 0x3,0x29,0x4a, 0x1,0x4e,0x27, 0x2,0x27,0x3f, 0x2,0x27,0x3e, 0x2,0x27,0x36, 0x3,0x29,0x4f, 0x1,0x4e,0x35, 0x2,0x27,0x42, 0x2,0x27,0x37, 0x1,0x4e,0x38, 0x2,0x27,0x49, 0x1,0x4e,0x28, 0x3,0x29,0x48, 0x1,0x4e,0x2f, 0x2,0x27,0x3a, 0x2,0x27,0x43, 0x1,0x4e,0x37, 0x4,0x26,0x67, 0x1,0x4e,0x2a, 0x1,0x4e,0x2e, 0x4,0x26,0x6a, 0x2,0x27,0x41, 0xf,0x27,0x4e, 0x3,0x29,0x4e, 0x3,0x29,0x4c, 0x3,0x65,0x28, 0xf,0x27,0x50, 0x3,0x65,0x29, 0x2,0x2b,0x3d, 0x1,0x51,0x5f, 0x1,0x51,0x6c, 0x3,0x2d,0x36, 0x2,0x2b,0x38, 0x2,0x2b,0x2e, 0x1,0x51,0x65, 0x2,0x2b,0x2c, 0x1,0x51,0x5e, 0x2,0x2b,0x27, 0x1,0x51,0x68, 0x2,0x2b,0x34, 0x2,0x2b,0x21, 0x2,0x2b,0x23, 0x3,0x2d,0x2e, 0x4,0x2d,0x59, 0x4,0x29,0x6e, 0x3,0x2d,0x30, 0x2,0x2b,0x26, 0x2,0x2a,0x7c, 0x2,0x2b,0x33, 0x2,0x2b,0x43, 0x1,0x51,0x63, 0x2,0x2b,0x28, 0x2,0x2b,0x3a, 0x3,0x2d,0x2d, 0x2,0x2a,0x7e, 0x2,0x2b,0x41, 0x2,0x2b,0x42, 0x2,0x2b,0x45, 0x2,0x2b,0x3c, 0x2,0x2b,0x2d, 0x2,0x2b,0x35, 0x1,0x51,0x69, 0x1,0x51,0x5c, 0x1,0x51,0x64, 0x1,0x51,0x70, 0x1,0x51,0x59, 0x1,0x51,0x5b, 0x3,0x2d,0x31, 0x3,0x2d,0x2b, 0x3,0x2d,0x3a, 0x2,0x2b,0x25, 0x1,0x51,0x6d, 0x1,0x51,0x66, 0x2,0x2b,0x3f, 0x2,0x2b,0x22, 0x1,0x51,0x6f, 0x1,0x51,0x6a, 0x2,0x2b,0x2b, 0x4,0x29,0x6d, 0x4,0x2d,0x4e, 0x1,0x51,0x6e, 0x2,0x2b,0x32, 0x2,0x2b,0x2a, 0x1,0x51,0x67, 0x2,0x2b,0x3e, 0x2,0x2b,0x36, 0x3,0x2d,0x2a, 0x1,0x51,0x61, 0x2,0x2b,0x44, 0x2,0x2b,0x29, 0x1,0x51,0x5d, 0x2,0x2b,0x3b, 0x2,0x2b,0x31, 0x1,0x51,0x62, 0x2,0x2b,0x37, 0x1,0x51,0x5a, 0x2,0x2a,0x7d, 0x1,0x51,0x6b, 0x1,0x56,0x27, 0x1,0x51,0x60, 0x2,0x2b,0x30, 0x2,0x2b,0x2f, 0x2,0x2b,0x24, 0x3,0x29,0x51, 0x2,0x2b,0x40, 0x3,0x2d,0x34, 0x2,0x2b,0x39, 0x3,0x2d,0x32, 0x1,0x51,0x58, 0x3,0x2d,0x39, 0x3,0x2d,0x37, 0x6,0x31,0x72, 0x3,0x2d,0x38, 0x3,0x65,0x2b, 0x3,0x65,0x2a, 0xf,0x2b,0x48, 0x2,0x2f,0x6e, 0x1,0x56,0x2e, 0x2,0x2f,0x6f, 0x3,0x31,0x5d, 0x2,0x2f,0x63, 0x1,0x56,0x23, 0x1,0x56,0x2f, 0x3,0x31,0x57, 0x2,0x2f,0x5c, 0x3,0x31,0x53, 0x2,0x2f,0x65, 0x2,0x2f,0x6d, 0x3,0x31,0x5b, 0x2,0x2f,0x5b, 0x2,0x2f,0x76, 0x1,0x55,0x77, 0x3,0x31,0x5e, 0x3,0x31,0x64, 0x3,0x31,0x50, 0x2,0x2f,0x75, 0x2,0x2f,0x70, 0x3,0x31,0x5f, 0x2,0x2f,0x71, 0x1,0x56,0x21, 0x1,0x56,0x2c, 0x2,0x2f,0x67, 0x3,0x31,0x56, 0x2,0x2f,0x68, 0x2,0x2f,0x72, 0x2,0x2f,0x69, 0x3,0x31,0x63, 0x2,0x2f,0x64, 0x2,0x2f,0x5e, 0x2,0x2f,0x5f, 0x2,0x2f,0x6c, 0x2,0x2f,0x66, 0x3,0x31,0x54, 0x3,0x31,0x4f, 0x1,0x55,0x78, 0x1,0x55,0x7c, 0x2,0x2f,0x74, 0x2,0x2f,0x60, 0x1,0x56,0x2a, 0x1,0x56,0x26, 0x3,0x31,0x5a, 0x4,0x2d,0x55, 0x1,0x56,0x29, 0x1,0x56,0x30, 0x1,0x55,0x7d, 0x1,0x56,0x2b, 0x2,0x2f,0x6b, 0x1,0x56,0x2d, 0x1,0x55,0x7a, 0x3,0x31,0x59, 0x1,0x55,0x79, 0x2,0x2f,0x5d, 0x4,0x2d,0x4f, 0x2,0x2f,0x61, 0x1,0x56,0x24, 0x2,0x2f,0x73, 0x2,0x2f,0x6a, 0x2,0x2f,0x62, 0x1,0x56,0x28, 0x1,0x56,0x25, 0x3,0x2d,0x2f, 0x1,0x55,0x7b, 0x1,0x55,0x7e, 0x3,0x31,0x62, 0x3,0x31,0x58, 0xf,0x30,0x24, 0x3,0x31,0x61, 0x3,0x31,0x60, 0x3,0x65,0x2d, 0x3,0x65,0x2c, 0x2,0x36,0x28, 0x3,0x36,0x55, 0x2,0x35,0x76, 0x2,0x35,0x77, 0x2,0x35,0x7b, 0x3,0x36,0x60, 0x2,0x36,0x2c, 0x2,0x36,0x29, 0x3,0x36,0x4e, 0x2,0x36,0x22, 0x2,0x36,0x21, 0x1,0x5b,0x33, 0x2,0x36,0x25, 0x2,0x36,0x34, 0x2,0x35,0x72, 0x3,0x36,0x5b, 0x2,0x36,0x35, 0x2,0x36,0x27, 0x2,0x36,0x39, 0x2,0x36,0x2d, 0x1,0x5b,0x32, 0x2,0x36,0x2b, 0x1,0x5b,0x2d, 0x1,0x5b,0x42, 0x1,0x5b,0x38, 0x3,0x36,0x57, 0x1,0x5b,0x3c, 0x1,0x5b,0x3b, 0x2,0x35,0x73, 0x4,0x32,0x3f, 0x2,0x36,0x32, 0x2,0x36,0x38, 0x2,0x36,0x30, 0x2,0x36,0x37, 0x3,0x36,0x51, 0x2,0x36,0x24, 0x2,0x35,0x74, 0x2,0x36,0x36, 0x2,0x36,0x26, 0x1,0x5b,0x30, 0x1,0x5b,0x3d, 0x3,0x36,0x5a, 0x2,0x36,0x2f, 0x1,0x5b,0x36, 0x3,0x36,0x4d, 0x3,0x36,0x5c, 0x3,0x36,0x50, 0x2,0x36,0x2e, 0x2,0x35,0x75, 0x1,0x5b,0x3e, 0x3,0x36,0x4b, 0x1,0x5b,0x40, 0x2,0x36,0x31, 0x1,0x5b,0x41, 0x1,0x5b,0x2f, 0x2,0x35,0x7c, 0x2,0x36,0x33, 0x3,0x36,0x54, 0x3,0x34,0x78, 0x1,0x5b,0x35, 0x1,0x5b,0x3f, 0x2,0x35,0x7e, 0x2,0x36,0x2a, 0x2,0x35,0x79, 0x2,0x35,0x7d, 0x1,0x5b,0x3a, 0x2,0x35,0x78, 0x1,0x5b,0x2e, 0x1,0x5b,0x37, 0x1,0x5b,0x34, 0x2,0x36,0x23, 0x1,0x56,0x22, 0x2,0x3c,0x63, 0x1,0x5b,0x31, 0x3,0x36,0x4c, 0x3,0x36,0x52, 0x3,0x36,0x5e, 0x3,0x36,0x5f, 0xf,0x35,0x57, 0x3,0x36,0x56, 0x3,0x3c,0x45, 0x1,0x5b,0x39, 0x3,0x3c,0x41, 0x2,0x3c,0x66, 0x2,0x3c,0x7c, 0x2,0x3c,0x71, 0x1,0x5f,0x7b, 0x3,0x3c,0x38, 0x1,0x5f,0x76, 0x2,0x3c,0x60, 0x1,0x5f,0x77, 0x2,0x3c,0x70, 0x3,0x3c,0x3e, 0x2,0x3c,0x69, 0x2,0x3c,0x76, 0x1,0x5f,0x73, 0x2,0x3c,0x4e, 0x2,0x3c,0x78, 0x1,0x5f,0x69, 0x2,0x3c,0x56, 0x1,0x5f,0x6c, 0x1,0x5f,0x6b, 0x4,0x38,0x32, 0x1,0x5f,0x7c, 0x3,0x36,0x53, 0x2,0x3c,0x50, 0x2,0x3c,0x72, 0x2,0x3c,0x73, 0x1,0x5f,0x6e, 0x1,0x5f,0x6a, 0x2,0x3c,0x5e, 0x3,0x3c,0x3d, 0x1,0x5f,0x75, 0x2,0x3c,0x59, 0x3,0x3c,0x32, 0x2,0x3c,0x74, 0x1,0x5f,0x71, 0x2,0x3c,0x6c, 0x2,0x3c,0x79, 0x2,0x3c,0x53, 0x2,0x3c,0x58, 0x2,0x3c,0x52, 0x3,0x3c,0x2a, 0x1,0x5f,0x70, 0x2,0x3c,0x65, 0x2,0x43,0x64, 0x2,0x3c,0x54, 0x1,0x5f,0x74, 0x2,0x3c,0x5d, 0x2,0x3c,0x75, 0x1,0x5f,0x6f, 0x2,0x3c,0x5a, 0x2,0x3c,0x57, 0x2,0x3c,0x68, 0x1,0x5f,0x72, 0x1,0x5f,0x68, 0x1,0x5f,0x7e, 0x2,0x3c,0x6b, 0x2,0x3c,0x6a, 0x3,0x3c,0x31, 0x3,0x3c,0x42, 0x3,0x3c,0x39, 0x3,0x3c,0x3b, 0x3,0x3c,0x34, 0x3,0x3c,0x2f, 0x2,0x3c,0x4f, 0x1,0x5f,0x6d, 0x2,0x3c,0x77, 0x2,0x3c,0x5f, 0x2,0x3c,0x61, 0x3,0x3c,0x37, 0x2,0x3c,0x6e, 0x2,0x3c,0x6d, 0x2,0x3c,0x4d, 0x1,0x5f,0x78, 0x1,0x5f,0x7a, 0x2,0x3c,0x55, 0x2,0x3c,0x5c, 0x2,0x3c,0x64, 0x1,0x5f,0x79, 0x2,0x3c,0x5b, 0x2,0x3c,0x67, 0x2,0x3c,0x7a, 0xf,0x3b,0x70, 0x2,0x3c,0x6f, 0x3,0x3c,0x3c, 0xf,0x3c,0x21, 0x3,0x3c,0x44, 0x3,0x3c,0x33, 0x2,0x3c,0x7b, 0xf,0x3c,0x29, 0x3,0x65,0x2f, 0x2,0x3c,0x51, 0xf,0x3b,0x6e, 0x3,0x65,0x2e, 0x3,0x3c,0x40, 0x2,0x43,0x78, 0x1,0x64,0x4c, 0x3,0x41,0x65, 0x2,0x43,0x76, 0x2,0x43,0x61, 0x2,0x43,0x66, 0x2,0x43,0x5f, 0x3,0x41,0x77, 0x2,0x43,0x72, 0x2,0x43,0x51, 0x2,0x43,0x58, 0x4,0x3d,0x71, 0x2,0x43,0x70, 0x2,0x43,0x7a, 0x2,0x43,0x62, 0x3,0x41,0x68, 0x2,0x43,0x55, 0x2,0x43,0x68, 0x2,0x43,0x6d, 0x2,0x43,0x59, 0x3,0x41,0x6b, 0x2,0x43,0x6a, 0x2,0x43,0x56, 0x3,0x41,0x5d, 0x3,0x41,0x75, 0x2,0x43,0x5d, 0x2,0x43,0x5e, 0x1,0x64,0x4e, 0x2,0x43,0x71, 0x2,0x43,0x6f, 0x3,0x41,0x73, 0x2,0x43,0x52, 0x2,0x43,0x74, 0x3,0x41,0x74, 0x2,0x43,0x75, 0x2,0x43,0x77, 0x1,0x64,0x52, 0x1,0x64,0x4a, 0x3,0x41,0x6f, 0x2,0x35,0x7a, 0x2,0x43,0x5a, 0x2,0x43,0x6c, 0x2,0x43,0x5b, 0x1,0x64,0x47, 0x1,0x64,0x57, 0x2,0x43,0x73, 0x1,0x64,0x55, 0x1,0x64,0x51, 0x2,0x43,0x50, 0x1,0x64,0x49, 0x3,0x41,0x79, 0x2,0x43,0x53, 0x1,0x64,0x56, 0x3,0x41,0x78, 0x2,0x43,0x63, 0x2,0x43,0x4f, 0x3,0x41,0x76, 0x1,0x64,0x4f, 0x2,0x43,0x67, 0x2,0x43,0x57, 0x1,0x64,0x50, 0x2,0x43,0x60, 0x1,0x64,0x46, 0x1,0x5f,0x7d, 0x2,0x43,0x69, 0x2,0x3c,0x62, 0x2,0x43,0x54, 0x4,0x3d,0x6c, 0x3,0x41,0x6d, 0x2,0x43,0x6e, 0x1,0x64,0x4b, 0x2,0x43,0x6b, 0x1,0x64,0x48, 0x2,0x43,0x65, 0x1,0x64,0x53, 0x2,0x43,0x5c, 0x2,0x43,0x79, 0x3,0x41,0x6a, 0x3,0x41,0x7b, 0xf,0x42,0x49, 0xf,0x42,0x47, 0x1,0x64,0x4d, 0x2,0x45,0x2c, 0x3,0x41,0x72, 0x1,0x64,0x54, 0xf,0x42,0x28, 0xf,0x42,0x3c, 0x2,0x4a,0x70, 0x2,0x4a,0x6e, 0x3,0x47,0x3a, 0x2,0x4b,0x26, 0x2,0x4a,0x6c, 0x3,0x47,0x3d, 0x2,0x4a,0x7e, 0x1,0x64,0x45, 0x1,0x69,0x28, 0x2,0x4a,0x68, 0x2,0x4b,0x25, 0x3,0x47,0x51, 0x2,0x4a,0x6d, 0x2,0x4a,0x7b, 0x1,0x69,0x2d, 0x1,0x69,0x26, 0x3,0x47,0x4e, 0x2,0x4b,0x23, 0x3,0x47,0x46, 0x2,0x4a,0x66, 0x2,0x4b,0x22, 0x3,0x47,0x47, 0x1,0x69,0x38, 0x2,0x4a,0x77, 0x2,0x4b,0x29, 0x1,0x69,0x36, 0x2,0x4a,0x6f, 0x1,0x69,0x27, 0x2,0x4a,0x71, 0x2,0x4b,0x21, 0x1,0x69,0x30, 0x2,0x4a,0x6a, 0x1,0x69,0x34, 0x1,0x69,0x2a, 0x2,0x4a,0x73, 0x2,0x4a,0x69, 0x2,0x4a,0x63, 0x3,0x47,0x3e, 0x2,0x4a,0x7d, 0x1,0x69,0x31, 0x2,0x4b,0x28, 0x2,0x4a,0x64, 0x1,0x69,0x2e, 0x4,0x43,0x77, 0x2,0x4a,0x79, 0x4,0x43,0x79, 0x1,0x69,0x2f, 0x2,0x4a,0x6b, 0x2,0x4a,0x76, 0x2,0x4a,0x72, 0x2,0x4a,0x74, 0x3,0x47,0x43, 0x1,0x69,0x29, 0x2,0x4b,0x27, 0x1,0x69,0x37, 0x2,0x4a,0x75, 0x3,0x47,0x3b, 0x2,0x4b,0x2a, 0x4,0x44,0x27, 0x3,0x47,0x3c, 0x2,0x4a,0x65, 0x2,0x4a,0x7a, 0x1,0x69,0x2c, 0x1,0x69,0x35, 0x1,0x69,0x33, 0x2,0x4a,0x67, 0x2,0x4a,0x7c, 0x1,0x69,0x32, 0x3,0x47,0x45, 0x3,0x47,0x48, 0x1,0x69,0x2b, 0x2,0x4a,0x78, 0x3,0x47,0x4d, 0x3,0x47,0x44, 0x4,0x44,0x28, 0x3,0x4c,0x54, 0x2,0x4b,0x24, 0x3,0x47,0x4c, 0x2,0x50,0x7c, 0x3,0x47,0x42, 0x2,0x50,0x78, 0x2,0x50,0x74, 0x2,0x51,0x2a, 0x2,0x51,0x27, 0x1,0x6d,0x37, 0x3,0x4c,0x64, 0x3,0x4c,0x60, 0x2,0x51,0x2e, 0x2,0x50,0x7b, 0x1,0x6d,0x42, 0x2,0x51,0x24, 0x3,0x4c,0x4f, 0x3,0x4c,0x51, 0x2,0x50,0x77, 0x2,0x51,0x23, 0x1,0x6d,0x3f, 0x2,0x51,0x37, 0x4,0x4a,0x3d, 0x2,0x51,0x34, 0x2,0x51,0x26, 0x2,0x50,0x75, 0x3,0x4c,0x5f, 0x3,0x4c,0x57, 0x2,0x51,0x2b, 0x2,0x51,0x2d, 0x1,0x6d,0x3b, 0x2,0x51,0x21, 0x2,0x50,0x7a, 0x2,0x50,0x71, 0x1,0x6d,0x38, 0x1,0x6d,0x40, 0x4,0x4a,0x48, 0x2,0x51,0x30, 0x1,0x6d,0x41, 0x2,0x50,0x72, 0x2,0x51,0x36, 0x2,0x51,0x29, 0x2,0x51,0x2f, 0x1,0x6d,0x3e, 0x3,0x4c,0x4d, 0x3,0x4c,0x50, 0x2,0x51,0x2c, 0x3,0x4c,0x47, 0x2,0x51,0x33, 0x3,0x4c,0x5b, 0x1,0x6d,0x43, 0x3,0x4c,0x56, 0x1,0x6d,0x3d, 0x2,0x51,0x25, 0x2,0x50,0x76, 0x2,0x51,0x38, 0x2,0x50,0x73, 0x2,0x51,0x31, 0x1,0x6d,0x3a, 0x3,0x4c,0x4a, 0x2,0x50,0x7d, 0x3,0x4c,0x49, 0x2,0x50,0x7e, 0x1,0x6d,0x39, 0x1,0x6d,0x36, 0x2,0x50,0x79, 0x1,0x6d,0x3c, 0x3,0x4c,0x52, 0x1,0x6d,0x35, 0x3,0x4c,0x62, 0x2,0x51,0x32, 0x2,0x51,0x35, 0x2,0x51,0x22, 0x2,0x57,0x55, 0x3,0x4c,0x5e, 0x3,0x4c,0x59, 0xf,0x4f,0x42, 0x3,0x4c,0x61, 0x3,0x65,0x30, 0x2,0x57,0x4d, 0x3,0x51,0x2c, 0x2,0x57,0x49, 0x1,0x71,0x21, 0x3,0x51,0x3c, 0x3,0x51,0x38, 0x1,0x70,0x74, 0x1,0x70,0x79, 0x1,0x70,0x75, 0x2,0x57,0x57, 0x2,0x57,0x62, 0x1,0x70,0x73, 0x2,0x57,0x4f, 0x2,0x57,0x58, 0x2,0x51,0x28, 0x2,0x57,0x59, 0x3,0x51,0x28, 0x3,0x51,0x2b, 0x1,0x70,0x7a, 0x3,0x51,0x40, 0x2,0x57,0x68, 0x1,0x70,0x7e, 0x1,0x71,0x23, 0x2,0x57,0x4b, 0x3,0x51,0x3b, 0x1,0x70,0x7d, 0x3,0x51,0x31, 0x2,0x57,0x66, 0x2,0x57,0x67, 0x2,0x57,0x5d, 0x2,0x57,0x5c, 0x2,0x57,0x54, 0x3,0x51,0x29, 0x3,0x51,0x3e, 0x2,0x57,0x5e, 0x2,0x57,0x65, 0x2,0x57,0x64, 0x3,0x51,0x2f, 0x1,0x70,0x78, 0x1,0x70,0x76, 0x2,0x57,0x56, 0x2,0x57,0x53, 0x3,0x51,0x44, 0x2,0x57,0x50, 0x2,0x57,0x63, 0x1,0x71,0x22, 0x2,0x57,0x61, 0x1,0x70,0x7c, 0x1,0x70,0x7b, 0x3,0x51,0x27, 0x2,0x57,0x5b, 0x4,0x4a,0x4b, 0x2,0x57,0x4a, 0x2,0x57,0x4c, 0x2,0x57,0x4e, 0x2,0x57,0x60, 0x2,0x57,0x5a, 0x1,0x70,0x77, 0x3,0x51,0x2e, 0x2,0x57,0x51, 0x3,0x51,0x32, 0x2,0x57,0x5f, 0x3,0x51,0x41, 0x3,0x51,0x3a, 0xf,0x54,0x7b, 0x2,0x57,0x52, 0x3,0x65,0x31, 0xf,0x55,0x29, 0x3,0x65,0x32, 0x3,0x54,0x75, 0x1,0x73,0x78, 0x2,0x5d,0x31, 0x1,0x73,0x71, 0x2,0x5d,0x22, 0x3,0x54,0x7b, 0x2,0x5d,0x2d, 0x1,0x73,0x73, 0x2,0x5d,0x34, 0x3,0x55,0x21, 0x2,0x5d,0x29, 0x3,0x54,0x7c, 0x2,0x5d,0x24, 0x3,0x54,0x76, 0x4,0x56,0x45, 0x2,0x5d,0x35, 0x2,0x5c,0x7e, 0x2,0x5d,0x2b, 0x3,0x55,0x27, 0x1,0x73,0x7a, 0x2,0x5d,0x30, 0x2,0x5d,0x36, 0x2,0x5d,0x2a, 0x1,0x73,0x72, 0x2,0x5d,0x2c, 0x2,0x5d,0x21, 0x1,0x73,0x79, 0x3,0x55,0x23, 0x3,0x54,0x7a, 0x2,0x5d,0x33, 0x2,0x5d,0x26, 0x1,0x73,0x75, 0x3,0x55,0x24, 0x2,0x5d,0x28, 0x2,0x5d,0x25, 0x1,0x73,0x7b, 0x2,0x5d,0x27, 0x1,0x73,0x74, 0x1,0x73,0x77, 0x2,0x5d,0x2f, 0x2,0x5d,0x23, 0x2,0x5d,0x32, 0x3,0x54,0x78, 0x2,0x5d,0x2e, 0x3,0x55,0x29, 0x3,0x57,0x74, 0x1,0x76,0x4f, 0x2,0x61,0x73, 0x1,0x76,0x54, 0x1,0x76,0x55, 0x3,0x57,0x77, 0x3,0x58,0x21, 0x3,0x57,0x76, 0x1,0x76,0x4e, 0x2,0x61,0x72, 0x3,0x57,0x78, 0x2,0x61,0x6f, 0x2,0x61,0x70, 0x1,0x76,0x52, 0x2,0x61,0x6a, 0x2,0x61,0x6e, 0x1,0x76,0x51, 0x3,0x57,0x7e, 0x2,0x61,0x6b, 0x3,0x57,0x79, 0x3,0x58,0x23, 0x3,0x57,0x7d, 0x3,0x57,0x7a, 0x1,0x76,0x53, 0x1,0x76,0x50, 0x3,0x58,0x22, 0x2,0x61,0x69, 0x2,0x61,0x6d, 0x2,0x61,0x71, 0x3,0x57,0x7b, 0x3,0x65,0x33, 0x2,0x65,0x5c, 0x2,0x65,0x59, 0x2,0x65,0x62, 0x3,0x5a,0x44, 0x2,0x65,0x61, 0x2,0x65,0x5f, 0x2,0x65,0x5a, 0x3,0x5a,0x4f, 0x1,0x78,0x3f, 0x3,0x5a,0x45, 0x3,0x5a,0x4e, 0x4,0x5f,0x71, 0x3,0x5a,0x47, 0x3,0x5a,0x4d, 0x2,0x65,0x5b, 0x1,0x78,0x3e, 0x1,0x73,0x76, 0x2,0x65,0x5e, 0x1,0x78,0x3d, 0x2,0x65,0x63, 0x2,0x65,0x5d, 0x2,0x65,0x58, 0x2,0x61,0x6c, 0x3,0x5a,0x48, 0x3,0x5a,0x46, 0x1,0x78,0x3c, 0x3,0x65,0x34, 0x2,0x65,0x57, 0x2,0x69,0x24, 0x3,0x5c,0x49, 0x2,0x69,0x23, 0x2,0x65,0x60, 0x1,0x79,0x73, 0x3,0x57,0x75, 0x2,0x69,0x27, 0x2,0x69,0x28, 0x2,0x69,0x22, 0x2,0x69,0x26, 0x4,0x63,0x50, 0x2,0x69,0x21, 0x3,0x5c,0x47, 0x3,0x65,0x35, 0x4,0x63,0x4e, 0x2,0x6b,0x5f, 0x2,0x69,0x25, 0x1,0x7a,0x72, 0x1,0x7a,0x70, 0x2,0x6b,0x5d, 0x3,0x5e,0x35, 0x3,0x5e,0x34, 0x3,0x5e,0x33, 0x2,0x6b,0x60, 0x3,0x5e,0x37, 0x2,0x6b,0x5c, 0x2,0x6b,0x5e, 0x1,0x7a,0x71, 0x3,0x5f,0x4f, 0x3,0x5f,0x4e, 0x2,0x6d,0x53, 0x2,0x6d,0x54, 0x1,0x7b,0x62, 0x2,0x6d,0x52, 0xf,0x69,0x4c, 0x3,0x65,0x36, 0x3,0x65,0x37, 0x2,0x6f,0x31, 0x1,0x7c,0x3b, 0x2,0x6f,0x2f, 0x2,0x6f,0x30, 0x2,0x70,0x3a, 0x3,0x60,0x74, 0xf,0x6b,0x51, 0x1,0x7d,0x23, 0x2,0x71,0x23, 0x2,0x71,0x21, 0x2,0x71,0x22, 0x2,0x71,0x24, 0x3,0x61,0x40, 0x3,0x61,0x65, 0x3,0x61,0x41, 0x2,0x72,0x2b, 0x1,0x45,0x4e, 0x1,0x48,0x39, 0x3,0x23,0x79, 0x1,0x4e,0x3c, 0x4,0x26,0x71, 0x2,0x27,0x4a, 0x3,0x29,0x53, 0x3,0x29,0x54, 0x2,0x2b,0x46, 0x4,0x29,0x72, 0x3,0x2d,0x3c, 0x3,0x31,0x66, 0x2,0x2f,0x77, 0x2,0x2f,0x79, 0x3,0x31,0x65, 0x2,0x2f,0x78, 0x3,0x31,0x67, 0x2,0x2f,0x7a, 0x1,0x5b,0x43, 0x2,0x36,0x3b, 0x2,0x2f,0x7b, 0x3,0x36,0x62, 0x2,0x36,0x3a, 0x2,0x36,0x3c, 0x2,0x36,0x3d, 0x2,0x3c,0x7d, 0x1,0x60,0x22, 0x2,0x3c,0x7e, 0x2,0x3d,0x22, 0x1,0x60,0x23, 0x1,0x60,0x21, 0x2,0x3d,0x21, 0x3,0x41,0x7d, 0x2,0x44,0x22, 0x2,0x43,0x7e, 0x2,0x43,0x7d, 0x3,0x41,0x7c, 0x2,0x43,0x7c, 0x2,0x43,0x7b, 0x1,0x64,0x58, 0x2,0x44,0x21, 0x1,0x69,0x39, 0x2,0x4b,0x2b, 0x2,0x4b,0x2d, 0x1,0x69,0x3a, 0x2,0x4b,0x2c, 0x1,0x6d,0x45, 0x3,0x4c,0x66, 0x1,0x6d,0x44, 0x2,0x51,0x39, 0x3,0x4c,0x65, 0x3,0x4c,0x67, 0x2,0x57,0x6a, 0x2,0x57,0x69, 0x2,0x57,0x6b, 0x3,0x51,0x46, 0x3,0x51,0x45, 0x1,0x71,0x24, 0xf,0x55,0x39, 0x2,0x5d,0x37, 0x1,0x73,0x7c, 0x3,0x55,0x2b, 0x2,0x61,0x74, 0x1,0x76,0x56, 0x2,0x65,0x64, 0x1,0x7b,0x63, 0x1,0x45,0x4f, 0x1,0x46,0x5f, 0x1,0x48,0x3a, 0x1,0x4a,0x63, 0x1,0x4e,0x3d, 0x1,0x4e,0x3e, 0x3,0x29,0x55, 0x3,0x29,0x56, 0x1,0x51,0x71, 0x3,0x2d,0x3d, 0x3,0x31,0x68, 0x2,0x2f,0x7c, 0x3,0x3c,0x49, 0x3,0x3c,0x47, 0x4,0x44,0x2d, 0x3,0x41,0x7e, 0x1,0x64,0x59, 0x3,0x42,0x21, 0x3,0x47,0x53, 0x4,0x4a,0x4e, 0x2,0x52,0x59, 0x1,0x71,0x25, 0x1,0x76,0x57, 0x1,0x45,0x50, 0x3,0x22,0x53, 0x1,0x48,0x3b, 0x4,0x26,0x76, 0x2,0x27,0x4c, 0x1,0x4e,0x3f, 0x2,0x27,0x4b, 0x3,0x29,0x58, 0x2,0x2b,0x47, 0x1,0x51,0x72, 0x2,0x2b,0x48, 0x5,0x29,0x69, 0x1,0x51,0x73, 0x2,0x2f,0x7e, 0x1,0x56,0x32, 0x1,0x56,0x31, 0x3,0x31,0x6a, 0x2,0x36,0x42, 0x2,0x36,0x40, 0x2,0x36,0x41, 0x2,0x36,0x3f, 0x3,0x36,0x64, 0x2,0x36,0x3e, 0x2,0x3d,0x23, 0x2,0x3d,0x26, 0x1,0x60,0x25, 0x2,0x3d,0x24, 0x1,0x60,0x24, 0x2,0x3d,0x25, 0x2,0x44,0x23, 0x3,0x42,0x22, 0x4,0x44,0x31, 0x2,0x4b,0x2e, 0x2,0x4b,0x2f, 0x2,0x4b,0x30, 0x3,0x47,0x54, 0x2,0x51,0x3c, 0x2,0x51,0x3b, 0x1,0x6d,0x46, 0x2,0x51,0x3a, 0x2,0x51,0x3d, 0x2,0x57,0x6c, 0x4,0x50,0x6d, 0x5,0x5b,0x72, 0x2,0x57,0x6d, 0x2,0x57,0x6e, 0x4,0x56,0x52, 0x2,0x5d,0x38, 0x1,0x73,0x7d, 0x1,0x76,0x58, 0x2,0x65,0x65, 0x1,0x7a,0x73, 0x2,0x21,0x3f, 0x3,0x29,0x59, 0x1,0x51,0x74, 0x2,0x2b,0x49, 0x1,0x56,0x33, 0x4,0x32,0x4e, 0x4,0x32,0x50, 0x1,0x5b,0x44, 0x3,0x36,0x65, 0x1,0x60,0x26, 0x2,0x3d,0x27, 0x3,0x3c,0x4b, 0x1,0x64,0x5b, 0x1,0x64,0x5a, 0x3,0x42,0x26, 0x2,0x4b,0x31, 0x2,0x4b,0x32, 0x1,0x6d,0x47, 0x1,0x6d,0x48, 0x2,0x57,0x70, 0x2,0x57,0x6f, 0x2,0x61,0x75, 0x2,0x6f,0x32, 0x1,0x45,0x51, 0x2,0x21,0x40, 0x1,0x46,0x60, 0x3,0x23,0x7a, 0x1,0x4a,0x64, 0x2,0x24,0x48, 0x3,0x29,0x5a, 0x1,0x51,0x75, 0x1,0x64,0x5c, 0x1,0x45,0x52, 0x2,0x2b,0x4a, 0x1,0x51,0x76, 0x2,0x2b,0x4b, 0x1,0x73,0x7e, 0x1,0x45,0x53, 0x3,0x65,0x38, 0x3,0x65,0x39, 0x2,0x27,0x4d, 0x2,0x2b,0x4c, 0x3,0x2d,0x42, 0x2,0x30,0x25, 0x2,0x30,0x24, 0x2,0x30,0x22, 0x3,0x31,0x6e, 0x2,0x30,0x21, 0x2,0x30,0x26, 0x2,0x30,0x23, 0x3,0x31,0x6c, 0x3,0x31,0x6d, 0x1,0x5b,0x45, 0x1,0x5b,0x46, 0x3,0x36,0x66, 0x1,0x60,0x27, 0x2,0x3d,0x28, 0x4,0x38,0x4e, 0x2,0x3d,0x29, 0x2,0x3d,0x2a, 0x3,0x3c,0x4d, 0xf,0x3c,0x3c, 0x3,0x65,0x3a, 0x2,0x44,0x27, 0x2,0x44,0x28, 0x2,0x44,0x26, 0x3,0x42,0x28, 0x2,0x44,0x24, 0x2,0x44,0x25, 0x1,0x64,0x5d, 0x2,0x4b,0x33, 0x2,0x51,0x40, 0x2,0x51,0x3f, 0x2,0x51,0x3e, 0x2,0x51,0x41, 0x2,0x57,0x72, 0x2,0x57,0x71, 0x1,0x71,0x26, 0x2,0x57,0x73, 0x1,0x74,0x21, 0x2,0x5d,0x39, 0x3,0x55,0x2d, 0x2,0x61,0x76, 0x2,0x65,0x66, 0x2,0x6d,0x55, 0x1,0x45,0x54, 0x1,0x46,0x62, 0x1,0x46,0x61, 0x4,0x23,0x21, 0x1,0x4e,0x40, 0x2,0x21,0x41, 0x2,0x21,0x5f, 0x1,0x48,0x3c, 0x2,0x22,0x58, 0x2,0x24,0x49, 0x2,0x24,0x4a, 0x1,0x4e,0x41, 0x3,0x29,0x5d, 0x2,0x27,0x4e, 0x3,0x65,0x3b, 0x1,0x51,0x77, 0x2,0x2b,0x4d, 0x2,0x2b,0x4e, 0x1,0x56,0x34, 0x1,0x56,0x38, 0x2,0x30,0x27, 0x1,0x56,0x37, 0x1,0x56,0x35, 0x1,0x56,0x36, 0x2,0x36,0x43, 0x1,0x5b,0x47, 0x1,0x60,0x2a, 0x3,0x3c,0x4e, 0x1,0x60,0x28, 0x1,0x60,0x29, 0x2,0x3d,0x2b, 0x3,0x42,0x29, 0x3,0x42,0x2a, 0x1,0x69,0x3b, 0x1,0x45,0x55, 0x2,0x21,0x60, 0x3,0x22,0x57, 0x1,0x46,0x63, 0x3,0x22,0x54, 0x2,0x21,0x63, 0x3,0x24,0x21, 0x1,0x46,0x66, 0x2,0x21,0x62, 0x1,0x46,0x65, 0x1,0x46,0x64, 0x1,0x4a,0x65, 0x2,0x21,0x61, 0x3,0x22,0x58, 0x3,0x22,0x59, 0x2,0x22,0x59, 0xf,0x21,0x66, 0x2,0x22,0x5d, 0x2,0x22,0x5f, 0x2,0x22,0x60, 0x1,0x48,0x46, 0x1,0x48,0x47, 0x2,0x22,0x5c, 0x1,0x48,0x42, 0x3,0x23,0x7d, 0x2,0x22,0x5a, 0x3,0x24,0x25, 0x2,0x22,0x5e, 0x1,0x48,0x43, 0x3,0x26,0x55, 0x1,0x48,0x3e, 0x3,0x23,0x7c, 0x1,0x48,0x3f, 0x3,0x24,0x23, 0x1,0x48,0x45, 0x2,0x22,0x5b, 0x1,0x48,0x3d, 0x1,0x4a,0x66, 0x1,0x48,0x40, 0x1,0x48,0x41, 0x1,0x48,0x44, 0xf,0x22,0x5d, 0x3,0x65,0x3c, 0x2,0x24,0x5b, 0x2,0x24,0x59, 0x2,0x24,0x4c, 0x1,0x4a,0x72, 0x2,0x24,0x53, 0x1,0x4a,0x6d, 0x2,0x24,0x4d, 0x3,0x29,0x64, 0x2,0x24,0x55, 0x3,0x26,0x50, 0x2,0x24,0x52, 0x1,0x4a,0x70, 0x2,0x24,0x51, 0x1,0x4a,0x77, 0x2,0x24,0x5a, 0x1,0x4a,0x79, 0x3,0x26,0x53, 0x1,0x4a,0x7b, 0x3,0x23,0x7e, 0x2,0x24,0x4b, 0x3,0x26,0x57, 0x1,0x4a,0x6e, 0x2,0x24,0x5c, 0x3,0x26,0x51, 0x1,0x4a,0x75, 0x1,0x4a,0x78, 0x3,0x26,0x4c, 0x2,0x27,0x65, 0x1,0x4a,0x68, 0x1,0x4b,0x21, 0x1,0x4a,0x76, 0x2,0x24,0x4e, 0x1,0x4a,0x6b, 0x1,0x4a,0x7a, 0x2,0x24,0x56, 0x1,0x4a,0x69, 0x1,0x4a,0x6a, 0x2,0x27,0x63, 0x2,0x24,0x4f, 0x1,0x4a,0x71, 0x1,0x4a,0x7c, 0x2,0x24,0x5d, 0x2,0x24,0x50, 0x1,0x4a,0x6f, 0x3,0x26,0x4d, 0x1,0x4a,0x74, 0x2,0x27,0x4f, 0x1,0x4a,0x7d, 0x2,0x24,0x57, 0x1,0x4a,0x73, 0x3,0x29,0x63, 0x1,0x4a,0x7e, 0x1,0x4a,0x67, 0x2,0x24,0x54, 0x1,0x4a,0x6c, 0x2,0x24,0x58, 0x2,0x27,0x64, 0x3,0x26,0x4e, 0x3,0x26,0x52, 0x3,0x26,0x5c, 0x3,0x26,0x59, 0x3,0x26,0x56, 0xf,0x24,0x68, 0x3,0x26,0x5b, 0x1,0x4e,0x4d, 0x1,0x4e,0x5d, 0x2,0x27,0x56, 0x1,0x4e,0x54, 0x3,0x2d,0x4e, 0x2,0x27,0x6b, 0x1,0x4e,0x45, 0x3,0x29,0x6b, 0x1,0x4e,0x48, 0x2,0x27,0x62, 0x4,0x27,0x26, 0x2,0x27,0x54, 0x2,0x27,0x58, 0x1,0x4e,0x50, 0x1,0x4e,0x52, 0x2,0x27,0x5b, 0x1,0x4e,0x59, 0x1,0x4e,0x4b, 0x1,0x4e,0x49, 0x1,0x4e,0x4a, 0x1,0x4e,0x58, 0x2,0x27,0x67, 0x1,0x4e,0x53, 0x2,0x27,0x5a, 0x2,0x27,0x5c, 0x1,0x4e,0x51, 0x1,0x4e,0x56, 0x2,0x27,0x5d, 0x2,0x27,0x6a, 0x3,0x29,0x6d, 0x1,0x51,0x78, 0x1,0x4e,0x5c, 0x4,0x26,0x7d, 0x1,0x4e,0x46, 0x2,0x27,0x69, 0x3,0x29,0x6c, 0x2,0x27,0x6d, 0x2,0x27,0x59, 0x2,0x27,0x6f, 0x2,0x27,0x60, 0x1,0x4e,0x4f, 0x2,0x27,0x55, 0x1,0x4e,0x4e, 0x1,0x4e,0x60, 0x1,0x4e,0x55, 0x3,0x29,0x6a, 0x2,0x27,0x53, 0x2,0x2b,0x57, 0x1,0x4e,0x5b, 0x1,0x4e,0x5f, 0x2,0x27,0x61, 0x2,0x27,0x66, 0x3,0x29,0x65, 0x1,0x4e,0x61, 0x1,0x4e,0x5a, 0x1,0x4e,0x4c, 0x1,0x4e,0x42, 0x3,0x29,0x69, 0x1,0x4e,0x47, 0x4,0x26,0x7b, 0x2,0x27,0x57, 0x1,0x4e,0x43, 0x2,0x27,0x6e, 0x3,0x29,0x67, 0x2,0x27,0x51, 0x2,0x27,0x50, 0x2,0x27,0x5e, 0x2,0x27,0x52, 0x1,0x4e,0x5e, 0x1,0x56,0x39, 0x1,0x4e,0x57, 0x2,0x27,0x5f, 0x1,0x4e,0x44, 0x3,0x2d,0x4f, 0x1,0x52,0x29, 0x2,0x27,0x6c, 0x3,0x2d,0x46, 0x2,0x2b,0x5e, 0x2,0x2b,0x61, 0x3,0x2d,0x50, 0x2,0x2b,0x64, 0x2,0x2b,0x59, 0x3,0x2d,0x48, 0x3,0x2d,0x4a, 0x2,0x2b,0x67, 0x2,0x2b,0x6a, 0x2,0x2b,0x6c, 0x2,0x2b,0x56, 0x1,0x51,0x79, 0x1,0x51,0x7e, 0x2,0x30,0x2c, 0x1,0x52,0x30, 0x2,0x2b,0x65, 0x2,0x2b,0x6d, 0x2,0x2b,0x5d, 0x2,0x2b,0x55, 0x3,0x2d,0x49, 0x3,0x2d,0x47, 0x3,0x2d,0x4d, 0x2,0x30,0x47, 0x1,0x52,0x23, 0x2,0x2b,0x62, 0x2,0x2b,0x5a, 0x2,0x2b,0x5c, 0x1,0x52,0x28, 0x3,0x31,0x7a, 0x2,0x2b,0x5f, 0x1,0x52,0x22, 0x2,0x2b,0x52, 0x2,0x2b,0x68, 0x3,0x2d,0x4b, 0x2,0x2b,0x6b, 0x3,0x2d,0x45, 0x3,0x2d,0x57, 0x1,0x51,0x7d, 0x3,0x2d,0x53, 0x1,0x52,0x2b, 0x2,0x2b,0x4f, 0x1,0x52,0x2d, 0x1,0x51,0x7b, 0x1,0x52,0x31, 0x2,0x2b,0x69, 0x2,0x2b,0x51, 0x1,0x52,0x2e, 0x2,0x30,0x41, 0x2,0x27,0x68, 0x1,0x52,0x21, 0x1,0x51,0x7a, 0x2,0x2b,0x58, 0x2,0x2b,0x50, 0x1,0x52,0x2f, 0x1,0x52,0x27, 0x2,0x2b,0x63, 0x1,0x52,0x2c, 0x1,0x52,0x2a, 0x2,0x2b,0x5b, 0x1,0x52,0x24, 0x2,0x2b,0x53, 0x1,0x52,0x25, 0x1,0x52,0x26, 0x2,0x2b,0x54, 0x2,0x2b,0x66, 0x1,0x51,0x7c, 0x2,0x2b,0x60, 0x4,0x2a,0x21, 0x3,0x2d,0x55, 0x3,0x2d,0x51, 0x3,0x31,0x77, 0x3,0x31,0x73, 0x2,0x30,0x2f, 0x1,0x56,0x41, 0x1,0x56,0x46, 0x3,0x31,0x79, 0x3,0x32,0x26, 0x3,0x31,0x76, 0x2,0x30,0x38, 0x2,0x30,0x3e, 0x2,0x30,0x3a, 0x2,0x30,0x2d, 0x2,0x30,0x30, 0x2,0x30,0x29, 0x2,0x30,0x2a, 0x1,0x56,0x4d, 0x1,0x56,0x3e, 0x2,0x30,0x39, 0x2,0x30,0x42, 0x1,0x56,0x48, 0x1,0x56,0x3a, 0x3,0x31,0x6f, 0x1,0x56,0x43, 0x2,0x30,0x31, 0x1,0x56,0x45, 0x2,0x30,0x32, 0x2,0x30,0x3c, 0x3,0x32,0x22, 0x3,0x32,0x25, 0x3,0x31,0x72, 0x1,0x56,0x47, 0x2,0x30,0x4b, 0x2,0x30,0x2b, 0x1,0x56,0x40, 0x1,0x56,0x3f, 0x1,0x56,0x4b, 0x2,0x30,0x28, 0x2,0x30,0x49, 0x2,0x30,0x3d, 0x2,0x30,0x4a, 0x2,0x30,0x44, 0x2,0x30,0x36, 0x2,0x30,0x45, 0x3,0x32,0x21, 0x2,0x30,0x3f, 0x2,0x30,0x48, 0x2,0x30,0x46, 0x1,0x56,0x4c, 0x2,0x30,0x37, 0x1,0x56,0x3d, 0x1,0x56,0x3c, 0x1,0x56,0x44, 0x1,0x56,0x4a, 0x2,0x30,0x43, 0x1,0x56,0x49, 0x2,0x30,0x34, 0x1,0x5b,0x48, 0x3,0x31,0x78, 0x2,0x30,0x4c, 0x2,0x30,0x33, 0x2,0x30,0x2e, 0x1,0x56,0x42, 0x1,0x56,0x4e, 0x1,0x56,0x3b, 0x3,0x32,0x27, 0x2,0x30,0x3b, 0x2,0x30,0x40, 0x3,0x31,0x7d, 0x3,0x31,0x7b, 0x3,0x31,0x7c, 0x3,0x65,0x3d, 0x1,0x5b,0x6a, 0x2,0x36,0x45, 0x2,0x36,0x49, 0x3,0x36,0x6f, 0x1,0x5b,0x57, 0x1,0x5b,0x55, 0x3,0x36,0x7a, 0x3,0x37,0x21, 0x1,0x5b,0x4c, 0x2,0x36,0x47, 0x2,0x36,0x46, 0x1,0x5b,0x60, 0x3,0x3c,0x50, 0x2,0x36,0x4c, 0x1,0x5b,0x5a, 0x3,0x36,0x72, 0x2,0x36,0x5e, 0x2,0x36,0x6a, 0x1,0x5b,0x49, 0x2,0x36,0x5b, 0x2,0x36,0x54, 0x1,0x5b,0x6c, 0x2,0x36,0x44, 0x3,0x36,0x6a, 0x2,0x36,0x60, 0x3,0x36,0x6b, 0x1,0x5b,0x69, 0x1,0x5b,0x5d, 0x1,0x5b,0x68, 0x1,0x5b,0x53, 0x2,0x36,0x50, 0x2,0x36,0x62, 0x2,0x36,0x5a, 0x1,0x5b,0x54, 0x1,0x5b,0x4e, 0x2,0x36,0x68, 0x3,0x36,0x6c, 0x2,0x36,0x61, 0x2,0x36,0x63, 0x1,0x5b,0x56, 0x1,0x5b,0x5e, 0x2,0x36,0x65, 0x2,0x36,0x4e, 0x2,0x36,0x5f, 0x2,0x36,0x53, 0x2,0x36,0x67, 0x1,0x5b,0x63, 0x1,0x5b,0x4b, 0x1,0x5b,0x61, 0x2,0x36,0x58, 0x2,0x36,0x56, 0x2,0x36,0x57, 0x1,0x5b,0x58, 0x2,0x36,0x52, 0x2,0x36,0x51, 0x1,0x5b,0x4d, 0x2,0x36,0x4b, 0x2,0x36,0x69, 0x1,0x5b,0x4f, 0x2,0x36,0x55, 0x1,0x5b,0x6d, 0x3,0x36,0x74, 0x1,0x5b,0x67, 0x2,0x36,0x4a, 0x1,0x5b,0x64, 0x1,0x5b,0x62, 0x1,0x5b,0x6b, 0x2,0x36,0x5c, 0x1,0x5b,0x66, 0x2,0x30,0x35, 0x2,0x36,0x5d, 0x1,0x5b,0x65, 0x2,0x36,0x64, 0x1,0x5b,0x4a, 0x2,0x36,0x59, 0x1,0x5b,0x5c, 0x2,0x36,0x4d, 0x1,0x5b,0x5b, 0x3,0x36,0x7c, 0x1,0x5b,0x59, 0x1,0x5b,0x51, 0x1,0x5b,0x50, 0x2,0x3d,0x2c, 0x2,0x36,0x66, 0x3,0x3c,0x5d, 0x3,0x37,0x28, 0x2,0x36,0x4f, 0x3,0x37,0x26, 0x3,0x37,0x23, 0x2,0x3d,0x41, 0x3,0x36,0x70, 0x1,0x5b,0x52, 0x3,0x36,0x77, 0x3,0x37,0x24, 0x3,0x36,0x76, 0x3,0x37,0x25, 0x3,0x36,0x79, 0x4,0x32,0x6d, 0x3,0x36,0x7d, 0x3,0x65,0x3e, 0x3,0x37,0x29, 0xf,0x36,0x29, 0x3,0x37,0x27, 0x3,0x3c,0x54, 0x1,0x60,0x47, 0x1,0x5b,0x5f, 0x1,0x60,0x35, 0x2,0x3d,0x3b, 0x1,0x60,0x43, 0x3,0x3c,0x52, 0x2,0x3d,0x2f, 0x1,0x60,0x32, 0x1,0x60,0x2e, 0x2,0x3d,0x4d, 0x1,0x60,0x34, 0x1,0x60,0x38, 0x1,0x60,0x33, 0x1,0x60,0x3c, 0x2,0x3d,0x51, 0x2,0x3d,0x48, 0x3,0x3c,0x6b, 0x3,0x3c,0x6d, 0x2,0x3d,0x36, 0x1,0x60,0x41, 0x1,0x60,0x3b, 0x2,0x3d,0x42, 0x1,0x60,0x2b, 0x2,0x3d,0x4e, 0x2,0x3d,0x47, 0x1,0x60,0x2f, 0x2,0x3d,0x3c, 0x1,0x60,0x3e, 0x2,0x3d,0x59, 0x2,0x3d,0x5a, 0x4,0x38,0x5b, 0x1,0x60,0x2c, 0x2,0x3d,0x4c, 0x1,0x60,0x40, 0x2,0x3d,0x40, 0x2,0x3d,0x32, 0x2,0x3d,0x33, 0x1,0x60,0x44, 0x2,0x3d,0x37, 0x2,0x3d,0x3e, 0x2,0x3d,0x38, 0x3,0x3c,0x5a, 0x1,0x60,0x42, 0x1,0x60,0x4a, 0x2,0x3d,0x34, 0x2,0x3d,0x2d, 0x2,0x3d,0x2e, 0x3,0x3c,0x56, 0x2,0x3d,0x30, 0x1,0x60,0x31, 0x2,0x3d,0x3d, 0x3,0x3c,0x6e, 0x1,0x60,0x3f, 0x1,0x60,0x48, 0x3,0x3c,0x58, 0x3,0x3c,0x69, 0x2,0x3d,0x3f, 0x2,0x3d,0x57, 0x2,0x3d,0x4f, 0x1,0x60,0x2d, 0x2,0x3d,0x55, 0x1,0x60,0x39, 0x3,0x3c,0x66, 0x1,0x60,0x37, 0x3,0x3c,0x64, 0x2,0x3d,0x5b, 0x1,0x60,0x36, 0x2,0x3d,0x45, 0x2,0x3d,0x39, 0x2,0x3d,0x43, 0x1,0x60,0x4d, 0x2,0x3d,0x49, 0x2,0x3d,0x46, 0x2,0x3d,0x35, 0x1,0x60,0x49, 0x2,0x3d,0x53, 0x2,0x3d,0x50, 0x2,0x3d,0x58, 0x1,0x60,0x30, 0x2,0x3d,0x44, 0x1,0x60,0x4c, 0x3,0x3c,0x5b, 0x2,0x3d,0x4b, 0x3,0x42,0x3a, 0x3,0x3c,0x60, 0x1,0x60,0x3a, 0x1,0x60,0x3d, 0x3,0x3c,0x5c, 0x2,0x3d,0x4a, 0x1,0x60,0x4b, 0x2,0x3d,0x3a, 0x2,0x36,0x48, 0x3,0x3c,0x51, 0x3,0x3c,0x6c, 0x2,0x3d,0x54, 0x2,0x3d,0x52, 0x2,0x3d,0x56, 0xf,0x3c,0x5d, 0x3,0x3c,0x62, 0x3,0x65,0x42, 0x4,0x38,0x5e, 0x3,0x3c,0x63, 0x3,0x3c,0x68, 0xf,0x3c,0x47, 0x3,0x65,0x40, 0x4,0x38,0x5f, 0x2,0x3d,0x31, 0x1,0x60,0x46, 0x3,0x65,0x3f, 0x3,0x65,0x41, 0x2,0x44,0x47, 0x2,0x44,0x46, 0x2,0x44,0x2c, 0x1,0x64,0x63, 0x3,0x42,0x30, 0x2,0x44,0x45, 0x2,0x44,0x2f, 0x2,0x44,0x30, 0x4,0x3e,0x3f, 0x1,0x64,0x6d, 0x2,0x44,0x4e, 0x1,0x64,0x68, 0x2,0x44,0x44, 0x3,0x42,0x33, 0x2,0x44,0x29, 0x1,0x64,0x6e, 0x1,0x64,0x64, 0x2,0x44,0x38, 0x2,0x44,0x2e, 0x2,0x44,0x31, 0x2,0x44,0x49, 0x1,0x64,0x5e, 0x2,0x44,0x50, 0x2,0x44,0x48, 0x1,0x64,0x67, 0x2,0x44,0x3d, 0x1,0x64,0x72, 0x3,0x42,0x2e, 0x3,0x42,0x36, 0x1,0x64,0x71, 0x1,0x64,0x6b, 0x3,0x42,0x40, 0x4,0x3e,0x36, 0x2,0x44,0x4f, 0x1,0x64,0x5f, 0x2,0x44,0x3b, 0x2,0x44,0x32, 0x2,0x44,0x3f, 0x2,0x44,0x4b, 0x1,0x64,0x73, 0x3,0x42,0x39, 0x1,0x64,0x61, 0x2,0x44,0x3a, 0x3,0x42,0x2d, 0x2,0x44,0x33, 0x1,0x64,0x6a, 0x3,0x42,0x31, 0x1,0x64,0x69, 0x2,0x44,0x36, 0x2,0x44,0x40, 0x2,0x44,0x4a, 0x2,0x44,0x2d, 0x2,0x44,0x37, 0x1,0x64,0x62, 0x2,0x44,0x41, 0x1,0x64,0x6f, 0x1,0x64,0x66, 0x2,0x44,0x34, 0x1,0x64,0x65, 0x2,0x44,0x2b, 0x2,0x44,0x39, 0x2,0x44,0x4d, 0x1,0x60,0x45, 0x1,0x69,0x57, 0x2,0x44,0x3c, 0x2,0x4b,0x34, 0x2,0x44,0x3e, 0x2,0x44,0x4c, 0x1,0x64,0x6c, 0x2,0x44,0x35, 0x1,0x64,0x60, 0x1,0x64,0x70, 0x1,0x6d,0x5a, 0x2,0x44,0x2a, 0x6,0x54,0x4e, 0x2,0x44,0x43, 0x3,0x42,0x44, 0x3,0x42,0x3e, 0x3,0x42,0x47, 0x2,0x44,0x42, 0x3,0x42,0x3d, 0x3,0x42,0x45, 0x3,0x42,0x3f, 0x3,0x42,0x3b, 0x3,0x42,0x46, 0x2,0x4b,0x50, 0x1,0x69,0x54, 0x2,0x4b,0x45, 0x2,0x4b,0x4a, 0x1,0x69,0x49, 0x3,0x47,0x56, 0x2,0x4b,0x36, 0x1,0x69,0x56, 0x3,0x47,0x57, 0x1,0x69,0x40, 0x2,0x4b,0x35, 0x2,0x4b,0x56, 0x1,0x69,0x58, 0x2,0x4b,0x39, 0x2,0x4b,0x49, 0x3,0x47,0x65, 0x2,0x4b,0x3b, 0x2,0x4b,0x59, 0x2,0x4b,0x55, 0x1,0x69,0x3e, 0x1,0x69,0x48, 0x2,0x51,0x5b, 0x1,0x69,0x55, 0x1,0x69,0x46, 0x2,0x4b,0x37, 0x3,0x47,0x63, 0x2,0x4b,0x54, 0x1,0x69,0x4a, 0x2,0x4b,0x51, 0x2,0x4b,0x5e, 0x2,0x4b,0x3d, 0x2,0x4b,0x46, 0x3,0x4c,0x78, 0x3,0x47,0x5b, 0x2,0x4b,0x5c, 0x2,0x4b,0x52, 0x1,0x69,0x45, 0x3,0x4c,0x6a, 0x3,0x47,0x64, 0x2,0x4b,0x44, 0x1,0x69,0x3f, 0x1,0x69,0x3d, 0x1,0x69,0x4f, 0x4,0x44,0x43, 0x3,0x47,0x5f, 0x2,0x4b,0x42, 0x2,0x4b,0x3f, 0x2,0x4b,0x40, 0x3,0x47,0x5a, 0x2,0x4b,0x58, 0x3,0x47,0x5c, 0x2,0x4b,0x5d, 0x2,0x4b,0x5b, 0x1,0x69,0x43, 0x2,0x4b,0x5f, 0x1,0x69,0x47, 0x1,0x69,0x4e, 0x4,0x44,0x44, 0x2,0x4b,0x38, 0x2,0x51,0x43, 0x2,0x4b,0x41, 0x3,0x47,0x5e, 0x1,0x69,0x41, 0x1,0x69,0x53, 0x1,0x69,0x50, 0x1,0x69,0x44, 0x2,0x4b,0x4b, 0x2,0x4b,0x3c, 0x1,0x69,0x51, 0x2,0x4b,0x4d, 0x1,0x69,0x4b, 0x1,0x69,0x4d, 0x1,0x69,0x3c, 0x3,0x47,0x5d, 0x2,0x4b,0x4f, 0x2,0x4b,0x47, 0x2,0x4b,0x3a, 0x1,0x69,0x4c, 0x2,0x4b,0x57, 0x2,0x4b,0x5a, 0x2,0x4b,0x43, 0x2,0x4b,0x4e, 0x3,0x4c,0x74, 0x1,0x69,0x42, 0x1,0x6d,0x49, 0x2,0x4b,0x4c, 0x2,0x51,0x42, 0x3,0x47,0x62, 0x2,0x4b,0x53, 0x3,0x47,0x61, 0x4,0x44,0x52, 0xf,0x4f,0x79, 0x3,0x65,0x44, 0x3,0x65,0x45, 0x3,0x47,0x66, 0x3,0x65,0x43, 0x2,0x4b,0x3e, 0x2,0x51,0x4c, 0x2,0x51,0x56, 0x1,0x6d,0x4c, 0x2,0x51,0x55, 0x2,0x51,0x61, 0x1,0x6d,0x4e, 0x2,0x51,0x53, 0x4,0x4a,0x58, 0x2,0x51,0x57, 0x1,0x6d,0x59, 0x3,0x4c,0x7d, 0x2,0x51,0x4e, 0x1,0x6d,0x51, 0x3,0x4c,0x73, 0x2,0x51,0x5a, 0x2,0x57,0x7b, 0x1,0x6d,0x5d, 0x1,0x6d,0x5c, 0x2,0x51,0x5c, 0x2,0x51,0x4b, 0x2,0x51,0x66, 0x1,0x6d,0x57, 0x3,0x4c,0x6b, 0x1,0x6d,0x4d, 0x2,0x51,0x5f, 0x4,0x4a,0x69, 0x2,0x51,0x63, 0x2,0x51,0x68, 0x2,0x51,0x5d, 0x2,0x51,0x51, 0x1,0x6d,0x50, 0x1,0x6d,0x53, 0x1,0x6d,0x5b, 0x1,0x6d,0x56, 0x3,0x4c,0x75, 0x2,0x51,0x54, 0x2,0x4b,0x48, 0x3,0x4c,0x7e, 0x3,0x4c,0x6c, 0x2,0x51,0x50, 0x2,0x51,0x67, 0x1,0x6d,0x52, 0x3,0x4c,0x79, 0x1,0x6d,0x55, 0x2,0x51,0x69, 0x1,0x6d,0x4a, 0x2,0x51,0x5e, 0x2,0x51,0x44, 0x2,0x51,0x64, 0x1,0x74,0x2a, 0x3,0x4c,0x7a, 0x2,0x51,0x52, 0x4,0x50,0x75, 0x1,0x6d,0x4b, 0x2,0x51,0x4d, 0x1,0x6d,0x4f, 0x2,0x51,0x45, 0x1,0x69,0x52, 0x2,0x51,0x49, 0x4,0x4a,0x57, 0x2,0x51,0x62, 0x2,0x51,0x4a, 0x2,0x51,0x48, 0x1,0x6d,0x54, 0x3,0x4c,0x7b, 0x2,0x51,0x60, 0x3,0x4c,0x77, 0x2,0x51,0x47, 0x2,0x51,0x59, 0x2,0x51,0x58, 0x2,0x51,0x65, 0x2,0x51,0x4f, 0x1,0x6d,0x58, 0x4,0x4a,0x64, 0x3,0x65,0x47, 0xf,0x4f,0x7d, 0x3,0x65,0x46, 0x2,0x57,0x7e, 0x3,0x51,0x56, 0x1,0x71,0x33, 0x1,0x71,0x29, 0x2,0x58,0x2c, 0x2,0x57,0x76, 0x1,0x71,0x2b, 0x2,0x58,0x24, 0x1,0x71,0x32, 0x1,0x71,0x2d, 0x2,0x58,0x22, 0x2,0x5d,0x3b, 0x2,0x58,0x28, 0x2,0x58,0x2e, 0x2,0x58,0x27, 0x2,0x57,0x74, 0x2,0x58,0x25, 0x2,0x58,0x30, 0x2,0x58,0x32, 0x1,0x71,0x28, 0x2,0x58,0x31, 0x1,0x71,0x2e, 0x1,0x71,0x34, 0x3,0x51,0x54, 0x1,0x71,0x31, 0x3,0x51,0x58, 0x2,0x58,0x2b, 0x1,0x71,0x30, 0x2,0x58,0x26, 0x3,0x51,0x4d, 0x2,0x57,0x78, 0x2,0x57,0x7d, 0x3,0x51,0x50, 0x2,0x58,0x2a, 0x1,0x71,0x2f, 0x1,0x71,0x2c, 0x1,0x71,0x27, 0x1,0x71,0x2a, 0x2,0x57,0x7c, 0x4,0x51,0x22, 0x2,0x51,0x46, 0x2,0x57,0x77, 0x2,0x57,0x7a, 0x2,0x58,0x2d, 0x2,0x58,0x21, 0x2,0x57,0x75, 0x2,0x5d,0x3a, 0x2,0x58,0x2f, 0x2,0x57,0x79, 0x2,0x58,0x29, 0x3,0x4c,0x71, 0x3,0x51,0x55, 0x2,0x5d,0x3d, 0x1,0x74,0x2e, 0x3,0x55,0x30, 0x3,0x55,0x2f, 0x1,0x74,0x22, 0x3,0x55,0x35, 0x3,0x55,0x36, 0x1,0x74,0x26, 0x2,0x5d,0x3f, 0x2,0x5d,0x45, 0x2,0x5d,0x43, 0x1,0x74,0x24, 0x1,0x74,0x25, 0x1,0x74,0x2c, 0x2,0x5d,0x46, 0x2,0x5d,0x3e, 0x1,0x74,0x27, 0x3,0x55,0x31, 0x2,0x5d,0x42, 0x2,0x5d,0x41, 0x2,0x5d,0x47, 0x1,0x74,0x2d, 0x3,0x55,0x37, 0x1,0x74,0x28, 0x1,0x74,0x2b, 0x2,0x5d,0x40, 0x1,0x74,0x2f, 0x1,0x74,0x29, 0x1,0x74,0x30, 0x1,0x74,0x23, 0x2,0x5d,0x44, 0x3,0x5a,0x55, 0x2,0x5d,0x3c, 0x3,0x51,0x59, 0x3,0x55,0x39, 0x2,0x62,0x25, 0x3,0x65,0x48, 0x1,0x76,0x5d, 0x2,0x62,0x22, 0x2,0x62,0x24, 0x3,0x58,0x28, 0x1,0x76,0x5b, 0x2,0x61,0x7e, 0x2,0x62,0x21, 0x2,0x61,0x7a, 0x3,0x58,0x2a, 0x3,0x58,0x27, 0x2,0x58,0x23, 0x2,0x61,0x7b, 0x1,0x76,0x5c, 0x2,0x61,0x77, 0x3,0x58,0x26, 0x1,0x76,0x59, 0x2,0x62,0x26, 0x1,0x76,0x5a, 0x2,0x61,0x78, 0x2,0x61,0x79, 0x2,0x61,0x7d, 0x1,0x76,0x5f, 0x3,0x58,0x29, 0x1,0x76,0x5e, 0x4,0x5b,0x5e, 0x3,0x58,0x2b, 0x2,0x61,0x7c, 0x1,0x78,0x45, 0x2,0x65,0x6a, 0x2,0x65,0x70, 0x1,0x78,0x46, 0x2,0x65,0x67, 0x1,0x78,0x43, 0x1,0x78,0x40, 0x2,0x65,0x72, 0x1,0x78,0x44, 0x3,0x5a,0x52, 0x1,0x78,0x41, 0x2,0x65,0x69, 0x2,0x65,0x6c, 0x2,0x65,0x6d, 0x2,0x65,0x6e, 0x2,0x65,0x71, 0x3,0x5a,0x54, 0x2,0x62,0x23, 0x2,0x65,0x68, 0x1,0x78,0x42, 0x2,0x65,0x6f, 0x2,0x69,0x34, 0x2,0x65,0x6b, 0x3,0x5a,0x53, 0x3,0x65,0x4a, 0x3,0x65,0x49, 0x2,0x69,0x2b, 0x1,0x79,0x75, 0x2,0x69,0x2e, 0x1,0x79,0x76, 0x2,0x69,0x37, 0x2,0x69,0x2d, 0x2,0x69,0x2a, 0x3,0x5c,0x51, 0x2,0x69,0x2c, 0x2,0x69,0x30, 0x2,0x69,0x33, 0x2,0x69,0x32, 0x2,0x69,0x36, 0x2,0x69,0x29, 0x3,0x5c,0x4f, 0x1,0x79,0x74, 0x2,0x69,0x31, 0x2,0x69,0x35, 0x2,0x69,0x38, 0x2,0x69,0x2f, 0x2,0x6b,0x61, 0x2,0x6b,0x62, 0x2,0x6b,0x66, 0x2,0x6b,0x67, 0x3,0x5e,0x3c, 0x2,0x6b,0x64, 0x2,0x6b,0x65, 0x2,0x6b,0x63, 0x3,0x5e,0x3a, 0x1,0x7a,0x74, 0x3,0x5e,0x3b, 0x1,0x7b,0x64, 0x2,0x6d,0x59, 0x3,0x60,0x36, 0x3,0x5f,0x52, 0x2,0x6d,0x56, 0x2,0x6d,0x57, 0x2,0x6d,0x58, 0x1,0x7b,0x65, 0x3,0x60,0x37, 0x2,0x6f,0x34, 0x2,0x6f,0x33, 0x3,0x65,0x4b, 0x2,0x70,0x3d, 0x1,0x7c,0x60, 0x2,0x70,0x3b, 0x2,0x70,0x3e, 0x2,0x70,0x3c, 0x2,0x71,0x25, 0x1,0x7d,0x24, 0x1,0x7d,0x32, 0x2,0x71,0x71, 0x2,0x71,0x5b, 0x3,0x61,0x79, 0x2,0x71,0x70, 0x2,0x72,0x3e, 0x2,0x72,0x3f, 0x1,0x45,0x56, 0x4,0x21,0x50, 0x3,0x24,0x28, 0x3,0x24,0x26, 0x1,0x48,0x48, 0x2,0x22,0x61, 0x3,0x24,0x27, 0x3,0x24,0x2b, 0x2,0x24,0x5e, 0x3,0x26,0x62, 0x1,0x4b,0x22, 0x3,0x26,0x5f, 0x1,0x4b,0x25, 0x3,0x26,0x5e, 0x2,0x24,0x5f, 0x3,0x26,0x63, 0x1,0x4b,0x23, 0x1,0x4b,0x24, 0x3,0x26,0x60, 0xf,0x24,0x71, 0x3,0x29,0x77, 0x2,0x27,0x78, 0x2,0x27,0x7a, 0x2,0x27,0x75, 0x2,0x27,0x72, 0x2,0x27,0x74, 0x3,0x29,0x74, 0x3,0x29,0x70, 0x3,0x29,0x75, 0x1,0x4e,0x65, 0x3,0x29,0x6f, 0x3,0x29,0x79, 0x3,0x29,0x76, 0x1,0x4e,0x63, 0x3,0x29,0x72, 0x3,0x29,0x71, 0x2,0x27,0x76, 0x1,0x4e,0x64, 0x2,0x27,0x73, 0x2,0x27,0x70, 0x1,0x4e,0x62, 0x2,0x27,0x77, 0x4,0x27,0x29, 0x2,0x27,0x71, 0x1,0x4e,0x66, 0x2,0x27,0x79, 0x4,0x27,0x2b, 0x2,0x2b,0x6f, 0x3,0x2d,0x5e, 0x2,0x2b,0x73, 0x3,0x2d,0x5c, 0x3,0x2d,0x5a, 0x1,0x52,0x3a, 0x3,0x2d,0x58, 0x4,0x2a,0x26, 0x3,0x2d,0x65, 0x3,0x2d,0x62, 0x2,0x2b,0x76, 0x3,0x2d,0x5f, 0x1,0x52,0x32, 0x1,0x52,0x35, 0x1,0x52,0x37, 0x1,0x52,0x39, 0x1,0x52,0x36, 0x2,0x2b,0x72, 0x2,0x2b,0x71, 0x3,0x2d,0x64, 0x1,0x52,0x34, 0x2,0x2b,0x74, 0x2,0x2b,0x75, 0x3,0x2d,0x63, 0x2,0x2b,0x6e, 0x1,0x52,0x38, 0x3,0x2d,0x68, 0x1,0x52,0x33, 0x3,0x2d,0x5d, 0x2,0x2b,0x70, 0x3,0x65,0x4d, 0x4,0x2a,0x28, 0x3,0x32,0x28, 0x2,0x30,0x5a, 0x2,0x30,0x5b, 0x2,0x30,0x5c, 0x1,0x56,0x53, 0x4,0x2d,0x75, 0x1,0x56,0x4f, 0x2,0x30,0x51, 0x3,0x32,0x2a, 0x2,0x30,0x59, 0x2,0x30,0x5e, 0x1,0x56,0x54, 0x3,0x32,0x2b, 0x2,0x30,0x4f, 0x2,0x30,0x55, 0x2,0x30,0x4e, 0x2,0x30,0x58, 0x3,0x32,0x31, 0x3,0x32,0x2f, 0x2,0x30,0x54, 0x1,0x56,0x50, 0x1,0x56,0x52, 0x2,0x30,0x5d, 0x3,0x32,0x29, 0x2,0x30,0x4d, 0x2,0x30,0x50, 0x2,0x30,0x56, 0x3,0x32,0x2d, 0x2,0x30,0x57, 0x2,0x30,0x5f, 0x2,0x30,0x53, 0x3,0x32,0x2c, 0x1,0x56,0x51, 0x3,0x65,0x4f, 0x3,0x65,0x4e, 0x3,0x32,0x30, 0x1,0x5b,0x72, 0x2,0x36,0x71, 0x3,0x37,0x30, 0x3,0x37,0x32, 0x2,0x36,0x73, 0x2,0x36,0x6f, 0x3,0x37,0x2f, 0x2,0x36,0x7b, 0x2,0x36,0x6d, 0x2,0x36,0x7a, 0x1,0x5b,0x6e, 0x2,0x36,0x6b, 0x2,0x3d,0x5f, 0x2,0x36,0x75, 0x1,0x5b,0x71, 0x3,0x37,0x35, 0x2,0x36,0x76, 0x2,0x36,0x79, 0x3,0x37,0x2e, 0x2,0x36,0x7d, 0x3,0x37,0x2c, 0x2,0x36,0x72, 0x4,0x32,0x72, 0x2,0x36,0x77, 0x3,0x37,0x2d, 0x3,0x37,0x31, 0x1,0x5b,0x6f, 0x1,0x5b,0x70, 0x2,0x36,0x7c, 0x2,0x36,0x70, 0x2,0x36,0x6c, 0x2,0x36,0x7e, 0x3,0x37,0x33, 0x2,0x36,0x74, 0x3,0x65,0x50, 0x3,0x65,0x51, 0x2,0x36,0x78, 0x2,0x36,0x6e, 0x1,0x60,0x4e, 0x1,0x60,0x4f, 0x2,0x3d,0x69, 0x1,0x60,0x55, 0x3,0x3c,0x74, 0x2,0x3d,0x5d, 0x2,0x3d,0x66, 0x2,0x3d,0x5c, 0x1,0x60,0x52, 0x2,0x3d,0x64, 0x2,0x3d,0x62, 0x3,0x3c,0x7d, 0x2,0x3d,0x63, 0x1,0x60,0x50, 0x3,0x3c,0x7c, 0x2,0x3d,0x67, 0xf,0x3c,0x7e, 0x3,0x3c,0x6f, 0x3,0x3c,0x7a, 0x3,0x3c,0x72, 0x3,0x3d,0x21, 0x2,0x3d,0x60, 0x2,0x3d,0x5e, 0x1,0x60,0x51, 0x2,0x3d,0x61, 0x2,0x3d,0x65, 0x3,0x3c,0x7b, 0x3,0x3c,0x79, 0x3,0x3c,0x71, 0x1,0x60,0x53, 0x3,0x3c,0x73, 0x3,0x3c,0x77, 0x3,0x65,0x53, 0x2,0x3d,0x68, 0x3,0x65,0x54, 0x3,0x65,0x55, 0x3,0x65,0x52, 0x2,0x44,0x56, 0x2,0x44,0x5d, 0x2,0x44,0x5f, 0x2,0x44,0x65, 0x3,0x42,0x57, 0x1,0x65,0x22, 0x2,0x44,0x51, 0x3,0x42,0x4c, 0x1,0x64,0x78, 0x3,0x42,0x4e, 0x2,0x44,0x60, 0x1,0x64,0x7d, 0x2,0x44,0x66, 0x1,0x64,0x74, 0x3,0x42,0x51, 0x2,0x44,0x63, 0x3,0x42,0x58, 0x2,0x44,0x53, 0x2,0x44,0x64, 0x2,0x44,0x52, 0x1,0x65,0x24, 0x3,0x42,0x52, 0x2,0x44,0x5e, 0x1,0x64,0x75, 0x2,0x44,0x67, 0x3,0x48,0x3c, 0x1,0x64,0x7a, 0x2,0x44,0x57, 0x1,0x65,0x21, 0x2,0x44,0x62, 0x2,0x44,0x55, 0x2,0x44,0x5c, 0x2,0x44,0x58, 0x2,0x44,0x54, 0x1,0x64,0x77, 0x1,0x64,0x7e, 0x1,0x64,0x7c, 0x1,0x64,0x79, 0x1,0x65,0x23, 0x1,0x64,0x76, 0x2,0x44,0x5b, 0x3,0x42,0x4f, 0x1,0x64,0x7b, 0x3,0x42,0x59, 0x1,0x60,0x54, 0x3,0x42,0x49, 0x2,0x44,0x61, 0x3,0x65,0x59, 0x2,0x44,0x59, 0x3,0x42,0x53, 0x3,0x65,0x57, 0x3,0x65,0x58, 0x3,0x65,0x56, 0x2,0x44,0x5a, 0x4,0x44,0x57, 0x4,0x44,0x5b, 0x2,0x4b,0x67, 0x3,0x47,0x6f, 0x1,0x69,0x5b, 0x3,0x47,0x6e, 0x3,0x47,0x6c, 0x2,0x4b,0x63, 0x2,0x4b,0x69, 0x2,0x4b,0x65, 0x3,0x47,0x70, 0x1,0x69,0x5d, 0x2,0x4b,0x64, 0x2,0x4b,0x68, 0x2,0x4b,0x60, 0x3,0x47,0x72, 0x2,0x4b,0x62, 0x1,0x69,0x5c, 0x3,0x47,0x6a, 0x3,0x47,0x6d, 0x3,0x47,0x6b, 0x3,0x47,0x68, 0x2,0x4b,0x66, 0x2,0x4b,0x61, 0x3,0x47,0x67, 0x1,0x69,0x5e, 0x3,0x65,0x5b, 0x1,0x69,0x59, 0xf,0x49,0x4b, 0x3,0x65,0x5a, 0x2,0x4b,0x6a, 0xf,0x49,0x5f, 0x1,0x69,0x5a, 0x2,0x51,0x6f, 0x2,0x51,0x6c, 0x2,0x51,0x78, 0x2,0x51,0x72, 0x2,0x51,0x74, 0x1,0x6d,0x5e, 0x2,0x51,0x6e, 0x2,0x51,0x76, 0x3,0x4d,0x2a, 0x3,0x4d,0x24, 0x2,0x51,0x75, 0x2,0x51,0x73, 0x3,0x4d,0x29, 0x2,0x51,0x79, 0x1,0x6d,0x61, 0x2,0x51,0x70, 0x2,0x51,0x77, 0x3,0x4d,0x28, 0x1,0x6d,0x5f, 0x3,0x4d,0x25, 0x3,0x4d,0x22, 0x2,0x51,0x6b, 0x2,0x51,0x6d, 0x1,0x6d,0x60, 0x2,0x51,0x6a, 0x2,0x51,0x7a, 0x3,0x65,0x5c, 0x2,0x51,0x71, 0x3,0x51,0x62, 0x3,0x51,0x5a, 0x2,0x58,0x36, 0x1,0x71,0x3b, 0x3,0x51,0x60, 0x3,0x51,0x5c, 0x2,0x58,0x41, 0x2,0x58,0x3f, 0x1,0x71,0x35, 0x2,0x58,0x35, 0x2,0x58,0x38, 0x2,0x58,0x39, 0x2,0x58,0x34, 0x1,0x71,0x3f, 0x1,0x71,0x40, 0x2,0x58,0x33, 0x2,0x58,0x42, 0x2,0x58,0x3d, 0x1,0x71,0x39, 0x1,0x71,0x36, 0x2,0x58,0x3c, 0x2,0x58,0x3a, 0x3,0x51,0x63, 0x4,0x51,0x23, 0x1,0x71,0x3c, 0x2,0x58,0x3e, 0x1,0x71,0x37, 0x3,0x51,0x5e, 0x1,0x71,0x38, 0x3,0x51,0x66, 0x2,0x58,0x3b, 0x1,0x71,0x3a, 0x2,0x58,0x37, 0x7,0x2f,0x4f, 0x2,0x58,0x40, 0x1,0x71,0x3d, 0x2,0x58,0x43, 0x2,0x58,0x44, 0x1,0x71,0x3e, 0x3,0x65,0x5d, 0x3,0x65,0x5e, 0x1,0x74,0x32, 0x1,0x74,0x39, 0x2,0x5d,0x48, 0x2,0x5d,0x4e, 0x3,0x55,0x3c, 0x2,0x5d,0x4c, 0x1,0x74,0x35, 0x1,0x74,0x34, 0x1,0x74,0x31, 0x2,0x5d,0x4a, 0x3,0x55,0x3e, 0x3,0x55,0x43, 0x3,0x55,0x40, 0x1,0x74,0x37, 0x1,0x74,0x36, 0x1,0x74,0x33, 0x3,0x55,0x41, 0x2,0x5d,0x4d, 0x2,0x5d,0x49, 0x2,0x5d,0x4b, 0x3,0x55,0x42, 0x1,0x74,0x38, 0xf,0x5a,0x73, 0x1,0x76,0x63, 0x2,0x62,0x29, 0x3,0x58,0x2d, 0x1,0x76,0x60, 0x1,0x76,0x61, 0x2,0x62,0x2b, 0x1,0x76,0x62, 0x2,0x62,0x28, 0x3,0x58,0x2e, 0x2,0x62,0x27, 0x2,0x65,0x76, 0x2,0x62,0x2a, 0x3,0x5a,0x56, 0x2,0x65,0x77, 0x1,0x78,0x47, 0x2,0x65,0x75, 0x3,0x5a,0x57, 0x4,0x5f,0x7e, 0x2,0x65,0x74, 0x3,0x5c,0x59, 0x2,0x65,0x73, 0x1,0x78,0x48, 0x3,0x65,0x5f, 0x3,0x5c,0x56, 0x1,0x79,0x77, 0x3,0x5c,0x58, 0x3,0x5c,0x55, 0x2,0x69,0x39, 0x2,0x69,0x3a, 0x3,0x5a,0x58, 0x3,0x5c,0x53, 0x3,0x5c,0x57, 0x3,0x65,0x61, 0x2,0x6b,0x6a, 0x2,0x6b,0x69, 0x1,0x7a,0x75, 0x3,0x5f,0x53, 0x2,0x6b,0x68, 0x2,0x6d,0x5a, 0x2,0x6d,0x5b, 0x3,0x5f,0x54, 0x3,0x60,0x39, 0x2,0x6f,0x35, 0x2,0x70,0x3f, 0x3,0x61,0x43, 0x3,0x61,0x42, 0x2,0x71,0x26, 0x2,0x72,0x2c, 0x1,0x7d,0x46, 0x2,0x72,0x40, 0x1,0x45,0x57, 0x4,0x21,0x51, 0x1,0x4e,0x67, 0x1,0x4e,0x68, 0x3,0x2d,0x69, 0x4,0x2a,0x2a, 0x1,0x52,0x3b, 0x3,0x3d,0x22, 0x4,0x4a,0x6c, 0x1,0x74,0x3a, 0x1,0x45,0x58, 0x1,0x4e,0x69, 0x1,0x56,0x55, 0x1,0x65,0x25, 0x1,0x45,0x59, 0x3,0x2d,0x6b, 0x1,0x5b,0x73, 0x1,0x69,0x5f, 0x2,0x21,0x42, 0x3,0x29,0x7c, 0x2,0x2b,0x77, 0x2,0x30,0x60, 0x4,0x3e,0x4c, 0x2,0x4b,0x6b, 0x4,0x4a,0x6d, 0x1,0x74,0x3b, 0x1,0x45,0x5a, 0x1,0x4e,0x6a, 0x2,0x2b,0x78, 0x2,0x2b,0x79, 0x2,0x3d,0x6a, 0x1,0x60,0x56, 0x3,0x42,0x5d, 0x2,0x44,0x68, 0x3,0x42,0x5c, 0x3,0x42,0x5b, 0x1,0x65,0x26, 0x2,0x4b,0x6c, 0x4,0x44,0x5e, 0x3,0x4d,0x2e, 0x1,0x6d,0x62, 0x3,0x4d,0x2d, 0x1,0x78,0x49, 0x1,0x45,0x5b, 0x2,0x3d,0x6b, 0x1,0x45,0x5c, 0x1,0x48,0x4a, 0x2,0x22,0x62, 0x1,0x48,0x49, 0x1,0x4b,0x28, 0x1,0x4b,0x27, 0x1,0x4b,0x26, 0x2,0x24,0x60, 0x3,0x26,0x64, 0x3,0x2a,0x21, 0x3,0x2a,0x22, 0x1,0x4e,0x6b, 0x3,0x2a,0x23, 0x1,0x4e,0x6c, 0x2,0x27,0x7b, 0x4,0x27,0x31, 0x2,0x2b,0x7a, 0x3,0x2d,0x6d, 0x2,0x2b,0x7d, 0x1,0x52,0x3d, 0x2,0x2b,0x7b, 0x4,0x2a,0x2f, 0x1,0x52,0x3c, 0x2,0x2b,0x7c, 0x1,0x52,0x3e, 0x2,0x30,0x63, 0x2,0x30,0x62, 0x2,0x30,0x61, 0x1,0x56,0x56, 0x3,0x32,0x36, 0x2,0x37,0x22, 0x2,0x37,0x23, 0x1,0x5b,0x74, 0x2,0x37,0x21, 0x2,0x37,0x24, 0x1,0x60,0x58, 0x1,0x5b,0x75, 0x3,0x3d,0x24, 0x3,0x3d,0x23, 0x1,0x60,0x57, 0x2,0x3d,0x6f, 0x2,0x3d,0x6e, 0x3,0x3d,0x25, 0x2,0x3d,0x6c, 0x2,0x3d,0x6d, 0x2,0x3d,0x70, 0x2,0x44,0x6a, 0x2,0x44,0x69, 0x2,0x44,0x6d, 0x4,0x3e,0x4f, 0x2,0x44,0x6c, 0x2,0x44,0x6b, 0x1,0x69,0x60, 0x2,0x4b,0x6f, 0x3,0x47,0x75, 0x2,0x4b,0x6e, 0x1,0x69,0x61, 0x2,0x4b,0x6d, 0x2,0x51,0x7b, 0x3,0x4d,0x2f, 0x2,0x51,0x7c, 0x1,0x6d,0x63, 0x4,0x51,0x2d, 0x2,0x58,0x45, 0x2,0x58,0x46, 0x5,0x4e,0x37, 0x2,0x65,0x7c, 0x1,0x78,0x4a, 0x2,0x65,0x7b, 0x2,0x65,0x7a, 0x2,0x65,0x78, 0x2,0x65,0x79, 0x1,0x7a,0x76, 0x2,0x69,0x3b, 0x2,0x6d,0x5c, 0x2,0x71,0x27, 0x3,0x61,0x7b, 0x1,0x45,0x5d, 0x4,0x21,0x38, 0x2,0x21,0x64, 0x1,0x46,0x67, 0x2,0x21,0x65, 0x3,0x24,0x2c, 0x3,0x24,0x2d, 0x4,0x23,0x27, 0x2,0x22,0x63, 0x2,0x22,0x64, 0x3,0x26,0x6b, 0x3,0x26,0x69, 0x2,0x24,0x66, 0x3,0x26,0x66, 0x3,0x26,0x67, 0x2,0x24,0x62, 0x3,0x26,0x6a, 0x2,0x24,0x61, 0x1,0x4e,0x6d, 0x2,0x24,0x65, 0x1,0x4b,0x2a, 0x2,0x24,0x63, 0x1,0x4b,0x29, 0x2,0x24,0x67, 0x2,0x24,0x64, 0x3,0x26,0x68, 0x2,0x28,0x21, 0x2,0x2b,0x7e, 0x2,0x27,0x7d, 0x2,0x28,0x26, 0x3,0x2a,0x26, 0x1,0x4e,0x6e, 0x3,0x2a,0x2a, 0x1,0x4e,0x71, 0x2,0x28,0x27, 0x2,0x28,0x23, 0x3,0x2a,0x27, 0x2,0x28,0x24, 0x4,0x27,0x36, 0x2,0x27,0x7c, 0x1,0x4e,0x70, 0x2,0x27,0x7e, 0x1,0x4e,0x6f, 0x2,0x28,0x25, 0x3,0x2a,0x28, 0x2,0x28,0x22, 0x6,0x2c,0x7e, 0x2,0x2c,0x24, 0x1,0x52,0x40, 0x1,0x52,0x41, 0x3,0x2d,0x75, 0x2,0x2c,0x27, 0x2,0x2c,0x21, 0x3,0x2d,0x74, 0x2,0x2c,0x26, 0x3,0x2d,0x70, 0x2,0x2c,0x22, 0x1,0x52,0x3f, 0x2,0x2c,0x25, 0x2,0x2c,0x23, 0x3,0x2d,0x73, 0x3,0x2d,0x71, 0x2,0x30,0x69, 0x2,0x30,0x66, 0x3,0x32,0x38, 0x2,0x30,0x68, 0x1,0x56,0x5b, 0x1,0x56,0x5a, 0x1,0x56,0x58, 0x2,0x30,0x65, 0x2,0x30,0x6a, 0x1,0x56,0x57, 0x1,0x56,0x59, 0x2,0x30,0x67, 0x2,0x37,0x2c, 0x2,0x30,0x64, 0x2,0x30,0x6b, 0x3,0x32,0x39, 0x4,0x33,0x23, 0x4,0x33,0x2a, 0x3,0x3d,0x26, 0x2,0x37,0x27, 0x2,0x37,0x2b, 0x5,0x33,0x54, 0x2,0x37,0x2a, 0x2,0x3d,0x72, 0x2,0x3d,0x7d, 0x4,0x33,0x2d, 0x3,0x37,0x3b, 0x2,0x37,0x2d, 0x3,0x37,0x3a, 0x2,0x37,0x28, 0x2,0x3d,0x71, 0x1,0x5b,0x79, 0x4,0x33,0x22, 0x4,0x33,0x2c, 0x1,0x5b,0x78, 0x2,0x37,0x26, 0x2,0x37,0x29, 0x1,0x5b,0x7a, 0x3,0x37,0x39, 0x1,0x5b,0x77, 0x1,0x5b,0x76, 0x2,0x37,0x25, 0x2,0x37,0x2e, 0x2,0x3d,0x74, 0x2,0x3d,0x7b, 0x3,0x3d,0x27, 0x1,0x60,0x5a, 0x2,0x3d,0x7a, 0x2,0x3d,0x77, 0x3,0x3d,0x2e, 0x1,0x60,0x5c, 0x3,0x3d,0x29, 0x3,0x3d,0x2b, 0x3,0x3d,0x2a, 0x2,0x3d,0x79, 0x3,0x42,0x61, 0x3,0x3d,0x2d, 0x2,0x3d,0x73, 0x2,0x3d,0x75, 0x2,0x3d,0x78, 0x2,0x3d,0x76, 0x1,0x60,0x5b, 0x2,0x3d,0x7c, 0x1,0x60,0x59, 0x1,0x65,0x27, 0x3,0x3d,0x28, 0x2,0x44,0x71, 0x2,0x44,0x70, 0x2,0x44,0x6e, 0x6,0x54,0x7c, 0x1,0x65,0x2a, 0x1,0x65,0x29, 0x2,0x44,0x72, 0x3,0x42,0x5f, 0x2,0x44,0x6f, 0x2,0x4b,0x70, 0x1,0x69,0x62, 0x1,0x65,0x28, 0x3,0x42,0x62, 0x3,0x65,0x62, 0x3,0x65,0x63, 0x2,0x44,0x74, 0x2,0x44,0x73, 0x3,0x4d,0x30, 0x2,0x4b,0x73, 0x2,0x4b,0x71, 0x1,0x6d,0x64, 0x3,0x47,0x79, 0x1,0x69,0x63, 0x2,0x4b,0x72, 0x2,0x51,0x7e, 0x3,0x47,0x78, 0x3,0x47,0x7a, 0x3,0x47,0x77, 0x4,0x4a,0x77, 0x1,0x6d,0x65, 0x2,0x51,0x7d, 0x2,0x52,0x28, 0x2,0x52,0x27, 0x2,0x52,0x25, 0x4,0x4a,0x75, 0x2,0x52,0x24, 0x2,0x52,0x21, 0x2,0x52,0x22, 0x2,0x52,0x23, 0x2,0x52,0x26, 0x2,0x52,0x29, 0x2,0x58,0x4b, 0x2,0x58,0x48, 0x2,0x58,0x49, 0x1,0x71,0x41, 0x2,0x58,0x47, 0x2,0x58,0x4d, 0x2,0x58,0x4c, 0x2,0x58,0x4a, 0x2,0x5d,0x50, 0x2,0x5d,0x51, 0x1,0x74,0x3c, 0x3,0x55,0x49, 0x1,0x74,0x3d, 0x2,0x5d,0x4f, 0x4,0x56,0x6c, 0x1,0x76,0x65, 0x2,0x62,0x2c, 0x1,0x76,0x64, 0x1,0x78,0x4b, 0x4,0x60,0x25, 0x1,0x78,0x4c, 0x1,0x79,0x78, 0x2,0x69,0x3d, 0x2,0x69,0x3c, 0x2,0x6b,0x6b, 0x2,0x6d,0x5d, 0x1,0x7b,0x66, 0x2,0x6f,0x37, 0x2,0x6f,0x36, 0x2,0x6f,0x38, 0x1,0x46,0x68, 0x2,0x2c,0x28, 0x1,0x56,0x5c, 0x1,0x5b,0x7b, 0x2,0x37,0x2f, 0x1,0x46,0x69, 0x2,0x21,0x66, 0x1,0x45,0x5e, 0x3,0x22,0x5a, 0x3,0x21,0x6b, 0x2,0x22,0x65, 0x3,0x24,0x2f, 0x4,0x23,0x2a, 0xf,0x22,0x66, 0x2,0x24,0x6c, 0x2,0x24,0x6a, 0x2,0x24,0x6b, 0x2,0x24,0x68, 0x1,0x4b,0x2b, 0x2,0x24,0x69, 0x3,0x26,0x6e, 0x3,0x2a,0x33, 0x2,0x28,0x2f, 0x3,0x2a,0x2d, 0x1,0x4e,0x74, 0x2,0x28,0x2d, 0x2,0x28,0x29, 0x2,0x28,0x2c, 0x3,0x2a,0x2c, 0x2,0x28,0x28, 0x1,0x4e,0x76, 0x2,0x28,0x2b, 0x3,0x2a,0x2b, 0x1,0x4e,0x73, 0x1,0x4e,0x72, 0x3,0x2a,0x32, 0x1,0x4e,0x75, 0x2,0x28,0x2e, 0x2,0x28,0x2a, 0x3,0x2a,0x2f, 0x1,0x52,0x45, 0x1,0x52,0x48, 0x2,0x2c,0x30, 0x2,0x2c,0x2f, 0x2,0x2c,0x2e, 0x1,0x52,0x42, 0x2,0x2c,0x37, 0x2,0x2c,0x2d, 0x4,0x2e,0x2a, 0x1,0x52,0x44, 0x2,0x30,0x70, 0x3,0x2d,0x78, 0x2,0x2c,0x34, 0x2,0x2c,0x32, 0x1,0x52,0x47, 0x3,0x2d,0x7b, 0x2,0x2c,0x2a, 0x2,0x2c,0x35, 0x3,0x2d,0x77, 0x2,0x2c,0x2c, 0x2,0x2c,0x36, 0x2,0x2c,0x33, 0x2,0x2c,0x2b, 0x3,0x2d,0x7a, 0x1,0x52,0x43, 0x2,0x2c,0x38, 0x2,0x2c,0x29, 0x1,0x52,0x46, 0x3,0x2d,0x7e, 0x3,0x2d,0x79, 0x3,0x2d,0x7c, 0x2,0x30,0x75, 0x2,0x30,0x6c, 0x2,0x30,0x77, 0x3,0x32,0x3e, 0x2,0x30,0x6f, 0x2,0x30,0x7a, 0x2,0x30,0x7b, 0x2,0x30,0x6d, 0x2,0x30,0x79, 0x2,0x30,0x76, 0x2,0x30,0x74, 0x2,0x30,0x78, 0x1,0x56,0x62, 0x3,0x32,0x40, 0x1,0x56,0x60, 0x3,0x32,0x47, 0x3,0x32,0x3c, 0x2,0x30,0x72, 0x3,0x32,0x46, 0x2,0x30,0x6e, 0x3,0x32,0x41, 0x2,0x30,0x71, 0x2,0x30,0x7c, 0x2,0x30,0x73, 0x1,0x56,0x61, 0x2,0x2c,0x31, 0x3,0x32,0x3d, 0x1,0x56,0x5d, 0x1,0x56,0x5f, 0x3,0x65,0x64, 0x3,0x37,0x3d, 0x2,0x37,0x3d, 0x2,0x37,0x32, 0x2,0x37,0x30, 0x3,0x3d,0x38, 0x2,0x37,0x31, 0x3,0x32,0x3f, 0x2,0x37,0x38, 0x3,0x37,0x40, 0x2,0x37,0x39, 0x2,0x37,0x35, 0x1,0x5c,0x22, 0x2,0x37,0x3a, 0x2,0x37,0x37, 0x2,0x37,0x34, 0x3,0x37,0x3c, 0x1,0x5b,0x7e, 0x2,0x37,0x33, 0x1,0x5b,0x7c, 0x1,0x5c,0x21, 0x2,0x37,0x36, 0x2,0x37,0x3e, 0x1,0x56,0x5e, 0x1,0x5b,0x7d, 0x2,0x37,0x3c, 0x2,0x37,0x3b, 0x1,0x5c,0x23, 0x3,0x65,0x65, 0xf,0x36,0x57, 0x3,0x3d,0x36, 0x3,0x3d,0x3a, 0x2,0x3e,0x24, 0x3,0x3d,0x2f, 0x3,0x3d,0x3b, 0x3,0x3d,0x32, 0x2,0x3e,0x25, 0x1,0x60,0x66, 0x3,0x3d,0x39, 0x2,0x3e,0x2b, 0x3,0x42,0x6d, 0x3,0x3d,0x35, 0x2,0x3e,0x2d, 0x2,0x3e,0x26, 0x1,0x60,0x60, 0x2,0x3e,0x2a, 0x2,0x3e,0x29, 0x1,0x60,0x61, 0x1,0x60,0x67, 0x3,0x42,0x64, 0x1,0x60,0x68, 0x2,0x3e,0x2c, 0x1,0x60,0x5e, 0x2,0x3e,0x23, 0x2,0x3e,0x21, 0x2,0x3e,0x27, 0x2,0x3d,0x7e, 0x1,0x60,0x65, 0x2,0x3e,0x22, 0x2,0x3e,0x28, 0x2,0x3e,0x2e, 0x1,0x60,0x5f, 0x1,0x60,0x64, 0x1,0x60,0x62, 0x1,0x60,0x63, 0x3,0x3d,0x33, 0x3,0x3d,0x3c, 0x1,0x60,0x5d, 0x3,0x65,0x66, 0x3,0x3d,0x37, 0x3,0x42,0x68, 0x3,0x42,0x75, 0x1,0x65,0x31, 0x2,0x44,0x7b, 0x1,0x65,0x30, 0x2,0x45,0x21, 0x3,0x42,0x6f, 0x2,0x44,0x75, 0x3,0x42,0x74, 0x2,0x45,0x22, 0x3,0x42,0x6e, 0x3,0x42,0x66, 0x3,0x42,0x71, 0x2,0x44,0x76, 0x2,0x44,0x77, 0x3,0x42,0x73, 0x2,0x45,0x23, 0x2,0x44,0x7e, 0x2,0x44,0x7c, 0x2,0x44,0x7d, 0x2,0x44,0x79, 0x2,0x44,0x78, 0x3,0x42,0x67, 0x2,0x45,0x24, 0x1,0x65,0x2d, 0x3,0x42,0x6b, 0x2,0x44,0x7a, 0x3,0x42,0x70, 0x1,0x65,0x32, 0x1,0x65,0x2c, 0x1,0x65,0x33, 0x1,0x65,0x34, 0x3,0x42,0x6a, 0x1,0x65,0x2f, 0x1,0x65,0x2e, 0x3,0x48,0x25, 0x3,0x47,0x7e, 0x2,0x4b,0x74, 0x1,0x69,0x65, 0x1,0x69,0x64, 0x3,0x47,0x7c, 0x3,0x47,0x7d, 0x2,0x4b,0x79, 0x3,0x48,0x22, 0x1,0x6d,0x66, 0x1,0x69,0x66, 0x3,0x48,0x21, 0x3,0x47,0x7b, 0x1,0x69,0x68, 0x2,0x4b,0x7a, 0x1,0x65,0x2b, 0x1,0x69,0x67, 0x2,0x4b,0x76, 0x2,0x4b,0x78, 0x2,0x4b,0x75, 0x3,0x48,0x27, 0x2,0x4b,0x77, 0x3,0x48,0x23, 0xf,0x49,0x76, 0x2,0x52,0x33, 0x3,0x4d,0x31, 0x3,0x4d,0x3b, 0x2,0x52,0x32, 0x2,0x52,0x2f, 0x1,0x6d,0x69, 0x2,0x58,0x4e, 0x1,0x6d,0x6a, 0x2,0x52,0x2e, 0x3,0x4d,0x39, 0x1,0x6d,0x68, 0x3,0x4d,0x36, 0x2,0x52,0x30, 0x2,0x52,0x2d, 0x2,0x52,0x2a, 0x2,0x52,0x31, 0x2,0x52,0x2b, 0x2,0x52,0x2c, 0x1,0x6d,0x67, 0x3,0x4d,0x35, 0x3,0x65,0x68, 0x4,0x51,0x39, 0x2,0x5d,0x55, 0x4,0x51,0x3a, 0x2,0x58,0x52, 0x3,0x4d,0x3a, 0x2,0x58,0x51, 0x2,0x58,0x53, 0x3,0x51,0x6a, 0x2,0x5d,0x52, 0x1,0x71,0x44, 0x4,0x51,0x38, 0x2,0x58,0x4f, 0x3,0x51,0x67, 0x1,0x71,0x42, 0x3,0x51,0x6c, 0x1,0x71,0x46, 0x1,0x71,0x45, 0x2,0x58,0x50, 0x2,0x58,0x54, 0x3,0x51,0x6b, 0x1,0x71,0x43, 0x3,0x65,0x67, 0x2,0x5d,0x59, 0x1,0x74,0x40, 0x1,0x76,0x66, 0x1,0x74,0x41, 0x1,0x74,0x3e, 0x2,0x5d,0x56, 0x2,0x5d,0x54, 0x3,0x55,0x4f, 0x2,0x5d,0x57, 0x3,0x55,0x4b, 0x2,0x5d,0x5a, 0x1,0x74,0x3f, 0x2,0x5d,0x58, 0x2,0x5d,0x53, 0x3,0x55,0x4d, 0x3,0x65,0x69, 0x2,0x62,0x2f, 0x2,0x62,0x32, 0x2,0x66,0x21, 0x2,0x62,0x2d, 0x3,0x58,0x2f, 0x2,0x69,0x3e, 0x2,0x62,0x33, 0x3,0x58,0x30, 0x1,0x78,0x4d, 0x2,0x62,0x31, 0x1,0x76,0x67, 0x2,0x62,0x2e, 0x2,0x62,0x30, 0x2,0x62,0x34, 0x2,0x66,0x22, 0x3,0x5a,0x5a, 0x2,0x65,0x7e, 0x4,0x60,0x27, 0x3,0x5a,0x5c, 0x3,0x5a,0x5d, 0x3,0x5a,0x5b, 0x1,0x78,0x4e, 0x2,0x65,0x7d, 0x3,0x5c,0x5e, 0x3,0x5c,0x5c, 0x3,0x5c,0x5f, 0x1,0x79,0x79, 0x3,0x5c,0x5d, 0x3,0x5c,0x60, 0x3,0x5e,0x3d, 0x1,0x7a,0x78, 0x2,0x6d,0x5f, 0x1,0x7a,0x77, 0x2,0x6d,0x61, 0x2,0x6d,0x5e, 0x2,0x6d,0x60, 0x1,0x7c,0x3c, 0x2,0x70,0x40, 0x1,0x46,0x6a, 0x2,0x28,0x30, 0x2,0x30,0x7d, 0x2,0x30,0x7e, 0x1,0x5c,0x24, 0x2,0x45,0x25, 0x1,0x71,0x47, 0x1,0x78,0x4f, 0x1,0x7b,0x67, 0x2,0x70,0x41, 0x1,0x46,0x6b, 0x2,0x28,0x31, 0x1,0x23,0x22, 0x4,0x2a,0x3c, 0x3,0x2e,0x22, 0x2,0x2c,0x39, 0x3,0x2e,0x21, 0x2,0x2c,0x3a, 0x3,0x2e,0x24, 0x3,0x32,0x48, 0x2,0x31,0x21, 0x2,0x31,0x22, 0x1,0x5c,0x25, 0x1,0x5c,0x26, 0xf,0x36,0x67, 0x3,0x3d,0x3d, 0x4,0x39,0x25, 0x2,0x3e,0x2f, 0x2,0x45,0x28, 0x2,0x45,0x27, 0x2,0x45,0x26, 0x2,0x4b,0x7b, 0x3,0x42,0x77, 0x2,0x4b,0x7c, 0x2,0x4b,0x7d, 0x1,0x69,0x69, 0x3,0x48,0x28, 0x2,0x52,0x35, 0x2,0x52,0x34, 0x3,0x4d,0x3d, 0x3,0x51,0x6d, 0x2,0x58,0x55, 0x1,0x71,0x48, 0x1,0x71,0x49, 0x3,0x51,0x6e, 0x2,0x5d,0x5e, 0x2,0x5d,0x5b, 0x2,0x5d,0x5c, 0x2,0x5d,0x5d, 0x2,0x62,0x36, 0x2,0x62,0x35, 0x1,0x76,0x68, 0x2,0x66,0x23, 0x2,0x6b,0x6c, 0x1,0x46,0x6c, 0x1,0x52,0x49, 0x3,0x37,0x44, 0x1,0x5c,0x27, 0x2,0x45,0x29, 0x3,0x42,0x78, 0x1,0x46,0x6d, 0x4,0x2a,0x40, 0x2,0x31,0x23, 0x1,0x5c,0x28, 0x3,0x37,0x45, 0x3,0x3d,0x3e, 0x1,0x60,0x69, 0x1,0x60,0x6a, 0x5,0x47,0x49, 0x1,0x46,0x6e, 0x1,0x46,0x6f, 0x2,0x22,0x66, 0x1,0x4b,0x2d, 0x1,0x4b,0x2c, 0x1,0x52,0x4a, 0x2,0x2c,0x3b, 0x2,0x3e,0x30, 0x1,0x46,0x70, 0x1,0x46,0x71, 0x1,0x46,0x72, 0x1,0x46,0x73, 0x4,0x23,0x2b, 0x1,0x4b,0x2e, 0x1,0x4b,0x2f, 0x2,0x24,0x6e, 0x2,0x24,0x6d, 0x3,0x2a,0x37, 0x1,0x4e,0x77, 0x2,0x28,0x34, 0x2,0x28,0x32, 0x2,0x28,0x33, 0x3,0x2a,0x38, 0x3,0x2a,0x35, 0x4,0x27,0x40, 0x3,0x2a,0x36, 0x3,0x2e,0x27, 0x2,0x2c,0x3c, 0x2,0x2c,0x3d, 0x3,0x2e,0x25, 0x3,0x2e,0x28, 0x1,0x52,0x4e, 0x1,0x52,0x4c, 0x3,0x2e,0x2a, 0x1,0x52,0x4d, 0x1,0x52,0x4b, 0x3,0x2e,0x26, 0xf,0x2b,0x7a, 0xf,0x2c,0x4a, 0x1,0x56,0x63, 0x3,0x32,0x4e, 0x3,0x32,0x4d, 0x3,0x32,0x50, 0x3,0x32,0x4f, 0x1,0x56,0x67, 0x1,0x56,0x66, 0x2,0x31,0x24, 0x1,0x56,0x65, 0x1,0x56,0x64, 0x3,0x32,0x51, 0x2,0x31,0x25, 0x3,0x37,0x46, 0x1,0x5c,0x2b, 0x2,0x37,0x40, 0x2,0x37,0x3f, 0x1,0x5c,0x29, 0x1,0x5c,0x2a, 0x3,0x37,0x49, 0x3,0x37,0x47, 0x1,0x60,0x6c, 0x1,0x60,0x6b, 0x2,0x3e,0x32, 0x3,0x3d,0x43, 0x3,0x3d,0x42, 0x2,0x3e,0x31, 0x1,0x5c,0x2c, 0x3,0x3d,0x44, 0x4,0x39,0x2c, 0x4,0x3e,0x6b, 0x1,0x65,0x35, 0x2,0x45,0x2b, 0x1,0x65,0x36, 0x2,0x45,0x2a, 0x3,0x42,0x7b, 0x4,0x44,0x7c, 0x4,0x44,0x7b, 0x2,0x4b,0x7e, 0x2,0x52,0x36, 0x1,0x6d,0x6b, 0x2,0x58,0x56, 0x3,0x51,0x70, 0x3,0x55,0x52, 0x2,0x5d,0x5f, 0x4,0x5b,0x74, 0x1,0x78,0x51, 0x1,0x78,0x50, 0x4,0x63,0x68, 0x3,0x5c,0x62, 0x1,0x7b,0x68, 0x1,0x46,0x74, 0x2,0x28,0x35, 0x3,0x3d,0x45, 0x1,0x5c,0x2d, 0x2,0x4c,0x21, 0x1,0x69,0x6a, 0x3,0x22,0x5b, 0x3,0x26,0x73, 0x2,0x24,0x6f, 0x2,0x24,0x70, 0x2,0x28,0x36, 0x1,0x4e,0x79, 0x1,0x4e,0x7a, 0x3,0x2a,0x3a, 0x4,0x27,0x43, 0x1,0x4e,0x78, 0x3,0x2a,0x3b, 0x1,0x52,0x52, 0x1,0x52,0x53, 0x1,0x52,0x50, 0x1,0x52,0x51, 0x3,0x2e,0x2b, 0x2,0x2c,0x3e, 0x3,0x2e,0x2f, 0x4,0x2a,0x4a, 0x2,0x2c,0x3f, 0x1,0x52,0x4f, 0x2,0x31,0x26, 0x3,0x32,0x57, 0x1,0x56,0x6b, 0x1,0x56,0x6c, 0x3,0x32,0x55, 0x1,0x5c,0x30, 0x2,0x31,0x2c, 0x4,0x2e,0x40, 0x1,0x56,0x71, 0x1,0x56,0x6f, 0x2,0x31,0x2d, 0x2,0x31,0x28, 0x1,0x56,0x6e, 0x1,0x56,0x6d, 0x1,0x56,0x68, 0x2,0x31,0x2b, 0x2,0x31,0x2a, 0x2,0x31,0x27, 0x1,0x56,0x70, 0x3,0x32,0x52, 0x2,0x31,0x29, 0x1,0x56,0x69, 0x4,0x2e,0x34, 0x1,0x56,0x6a, 0x1,0x5c,0x31, 0x2,0x37,0x44, 0x2,0x37,0x45, 0x1,0x5c,0x32, 0x2,0x37,0x41, 0x2,0x37,0x43, 0x2,0x37,0x47, 0x2,0x37,0x46, 0x2,0x37,0x42, 0x3,0x37,0x4a, 0x1,0x5c,0x2e, 0x1,0x5c,0x2f, 0x2,0x3e,0x3a, 0x1,0x60,0x71, 0x1,0x60,0x70, 0x2,0x3e,0x34, 0x1,0x60,0x6e, 0x4,0x39,0x34, 0x2,0x3e,0x37, 0x1,0x60,0x72, 0x2,0x3e,0x38, 0x1,0x60,0x73, 0x2,0x3e,0x35, 0x1,0x60,0x6d, 0x1,0x60,0x6f, 0x2,0x3e,0x39, 0x3,0x3d,0x47, 0x2,0x3e,0x36, 0x2,0x3e,0x33, 0x4,0x3e,0x77, 0x2,0x45,0x38, 0x3,0x42,0x7c, 0x2,0x45,0x2d, 0x1,0x65,0x38, 0x1,0x65,0x3b, 0x1,0x65,0x3a, 0x1,0x65,0x3f, 0x1,0x65,0x3e, 0x2,0x45,0x39, 0x2,0x45,0x37, 0x2,0x45,0x30, 0x2,0x45,0x34, 0x2,0x45,0x33, 0x1,0x65,0x3c, 0x2,0x45,0x36, 0x2,0x45,0x32, 0x2,0x45,0x3a, 0x2,0x45,0x31, 0x1,0x65,0x3d, 0x1,0x65,0x37, 0x1,0x65,0x39, 0x3,0x42,0x7d, 0x2,0x45,0x2f, 0x3,0x48,0x2b, 0x2,0x4c,0x23, 0x1,0x69,0x6e, 0x2,0x4c,0x27, 0x1,0x69,0x6d, 0x2,0x4c,0x24, 0x1,0x69,0x6c, 0x3,0x48,0x29, 0x2,0x45,0x2e, 0x2,0x45,0x35, 0x2,0x4c,0x26, 0x4,0x44,0x7e, 0x1,0x69,0x6f, 0x2,0x4c,0x28, 0x2,0x4c,0x25, 0x2,0x4c,0x22, 0x2,0x52,0x39, 0x2,0x52,0x3d, 0x2,0x52,0x3f, 0x2,0x52,0x3b, 0x2,0x52,0x3a, 0x2,0x52,0x38, 0x1,0x6d,0x6e, 0x1,0x6d,0x6c, 0x1,0x6d,0x71, 0x1,0x6d,0x72, 0x2,0x52,0x3c, 0x1,0x6d,0x6f, 0x2,0x52,0x37, 0x1,0x6d,0x70, 0x1,0x69,0x6b, 0x2,0x52,0x3e, 0x1,0x6d,0x6d, 0x3,0x51,0x71, 0x2,0x58,0x58, 0x4,0x51,0x4f, 0x2,0x58,0x57, 0x2,0x58,0x5f, 0x2,0x58,0x59, 0x2,0x58,0x5e, 0x2,0x58,0x5b, 0x1,0x71,0x4a, 0x2,0x58,0x5d, 0x3,0x51,0x73, 0x3,0x51,0x72, 0x1,0x71,0x4b, 0x4,0x51,0x4d, 0x1,0x71,0x4c, 0x3,0x51,0x74, 0x2,0x58,0x5c, 0x2,0x58,0x5a, 0x4,0x57,0x21, 0x4,0x57,0x24, 0x1,0x74,0x43, 0x2,0x5d,0x60, 0x3,0x55,0x55, 0x3,0x55,0x53, 0x1,0x74,0x42, 0x2,0x5d,0x63, 0x2,0x5d,0x61, 0x2,0x5d,0x62, 0x5,0x55,0x69, 0x5,0x5c,0x36, 0x1,0x74,0x44, 0x3,0x55,0x54, 0x3,0x58,0x34, 0x2,0x62,0x3a, 0x3,0x58,0x33, 0x1,0x76,0x6b, 0x2,0x62,0x3b, 0x4,0x5b,0x75, 0x4,0x5b,0x79, 0x1,0x76,0x69, 0x2,0x62,0x3c, 0x1,0x76,0x6a, 0x2,0x62,0x39, 0x2,0x62,0x3d, 0x3,0x58,0x32, 0x2,0x62,0x37, 0x1,0x78,0x52, 0x2,0x66,0x24, 0x1,0x78,0x53, 0x1,0x79,0x7a, 0x2,0x62,0x38, 0x1,0x79,0x7b, 0x3,0x5e,0x3f, 0x3,0x5e,0x3e, 0x1,0x7a,0x79, 0x2,0x6b,0x6d, 0x1,0x7b,0x6a, 0x2,0x6d,0x62, 0x1,0x7b,0x69, 0x3,0x60,0x3b, 0x2,0x6f,0x39, 0x1,0x7c,0x61, 0x1,0x7c,0x62, 0x3,0x65,0x6a, 0x7,0x64,0x52, 0x2,0x72,0x3a, 0x3,0x22,0x5c, 0x3,0x65,0x6b, 0x1,0x52,0x54, 0x2,0x2c,0x40, 0x1,0x60,0x74, 0x1,0x60,0x75, 0x1,0x46,0x75, 0x1,0x48,0x4b, 0x2,0x22,0x67, 0x3,0x26,0x74, 0x2,0x24,0x71, 0x1,0x4b,0x30, 0x3,0x26,0x76, 0x1,0x4e,0x7b, 0x4,0x2a,0x4c, 0x1,0x52,0x55, 0x1,0x52,0x56, 0x1,0x52,0x57, 0x2,0x37,0x49, 0x2,0x31,0x2e, 0x1,0x56,0x72, 0x4,0x2e,0x41, 0x4,0x2e,0x43, 0x1,0x5c,0x33, 0x2,0x37,0x48, 0x3,0x37,0x4d, 0x2,0x3e,0x3c, 0x1,0x60,0x77, 0x3,0x3d,0x4c, 0x2,0x3e,0x3b, 0x1,0x60,0x76, 0x3,0x42,0x7e, 0x3,0x43,0x21, 0x2,0x45,0x3b, 0x1,0x6d,0x73, 0x2,0x52,0x43, 0x2,0x52,0x40, 0x2,0x52,0x41, 0x2,0x52,0x42, 0x4,0x51,0x54, 0x4,0x51,0x55, 0x3,0x51,0x76, 0x5,0x5c,0x43, 0x3,0x55,0x56, 0x2,0x5d,0x64, 0x3,0x55,0x57, 0x2,0x62,0x3e, 0x4,0x5b,0x7c, 0x4,0x5b,0x7d, 0x3,0x5a,0x5e, 0x2,0x69,0x40, 0x2,0x69,0x3f, 0x4,0x66,0x5a, 0x2,0x6d,0x63, 0x1,0x46,0x76, 0x2,0x28,0x37, 0x1,0x56,0x73, 0x3,0x3d,0x4d, 0x1,0x60,0x78, 0x2,0x45,0x3c, 0x4,0x45,0x34, 0x3,0x48,0x30, 0x2,0x4c,0x29, 0x3,0x48,0x2e, 0x1,0x6d,0x74, 0x2,0x58,0x60, 0x3,0x65,0x6c, 0x2,0x62,0x3f, 0x2,0x69,0x41, 0x1,0x46,0x77, 0x3,0x26,0x77, 0x3,0x26,0x78, 0x1,0x4e,0x7c, 0x1,0x52,0x5a, 0x2,0x2c,0x41, 0x1,0x52,0x5b, 0x1,0x52,0x59, 0x3,0x2e,0x32, 0x1,0x52,0x58, 0x2,0x31,0x2f, 0x1,0x56,0x74, 0x3,0x32,0x5a, 0x3,0x32,0x5b, 0x1,0x56,0x75, 0x1,0x56,0x76, 0x1,0x5c,0x35, 0x2,0x37,0x4a, 0x1,0x5c,0x34, 0x3,0x37,0x50, 0x3,0x37,0x52, 0x3,0x37,0x51, 0xf,0x37,0x23, 0x3,0x3d,0x4f, 0x2,0x3e,0x3d, 0x1,0x5c,0x36, 0x1,0x60,0x79, 0x2,0x45,0x3d, 0x1,0x65,0x40, 0x1,0x65,0x41, 0x4,0x45,0x35, 0x1,0x69,0x70, 0x3,0x48,0x31, 0x1,0x69,0x71, 0x1,0x6d,0x75, 0x1,0x71,0x4e, 0x2,0x58,0x61, 0x1,0x71,0x4d, 0x4,0x57,0x2d, 0x2,0x5d,0x65, 0x1,0x74,0x45, 0x3,0x58,0x35, 0x2,0x62,0x40, 0x2,0x69,0x42, 0x1,0x46,0x78, 0x1,0x4b,0x31, 0x2,0x28,0x3a, 0x2,0x28,0x39, 0x1,0x4e,0x7d, 0x2,0x28,0x38, 0x1,0x4e,0x7e, 0x2,0x28,0x3b, 0x4,0x2a,0x55, 0x2,0x2c,0x47, 0x1,0x52,0x5e, 0x1,0x52,0x5d, 0x2,0x2c,0x49, 0x2,0x2c,0x48, 0x1,0x52,0x62, 0x3,0x2e,0x35, 0x1,0x52,0x61, 0x3,0x2e,0x33, 0x4,0x2a,0x59, 0x1,0x52,0x5c, 0x4,0x2a,0x5d, 0x2,0x2c,0x43, 0x2,0x2c,0x44, 0x2,0x2c,0x45, 0x4,0x2a,0x52, 0x1,0x52,0x63, 0x2,0x2c,0x42, 0x1,0x52,0x5f, 0x2,0x2c,0x46, 0x1,0x52,0x60, 0x3,0x32,0x64, 0x3,0x32,0x5f, 0x2,0x31,0x32, 0x2,0x31,0x36, 0x2,0x31,0x34, 0x2,0x31,0x33, 0x4,0x2e,0x55, 0x2,0x31,0x37, 0x3,0x32,0x5e, 0x4,0x2e,0x4f, 0x3,0x32,0x68, 0x2,0x31,0x38, 0x2,0x31,0x39, 0x2,0x31,0x31, 0x4,0x2e,0x51, 0x2,0x31,0x30, 0x3,0x37,0x59, 0x1,0x56,0x78, 0x1,0x56,0x79, 0x3,0x32,0x67, 0x2,0x31,0x3a, 0x2,0x31,0x35, 0x3,0x32,0x65, 0x2,0x37,0x53, 0x3,0x37,0x55, 0x2,0x31,0x3b, 0x1,0x56,0x7a, 0x1,0x56,0x77, 0x3,0x32,0x5c, 0x3,0x32,0x63, 0x2,0x37,0x4d, 0x4,0x33,0x4f, 0x2,0x37,0x4c, 0x3,0x37,0x53, 0x2,0x37,0x4e, 0x2,0x37,0x4f, 0x2,0x37,0x51, 0x2,0x37,0x50, 0x2,0x37,0x55, 0x1,0x5c,0x3a, 0x1,0x5c,0x37, 0x1,0x5c,0x3b, 0x2,0x37,0x4b, 0x1,0x5c,0x3c, 0x2,0x37,0x54, 0x1,0x5c,0x39, 0x2,0x37,0x52, 0x1,0x5c,0x38, 0x3,0x32,0x62, 0x3,0x37,0x57, 0x4,0x33,0x56, 0x3,0x3d,0x56, 0x3,0x3d,0x53, 0x2,0x3e,0x40, 0x2,0x3e,0x42, 0x2,0x3e,0x3e, 0x2,0x3e,0x3f, 0x3,0x3d,0x51, 0x3,0x3d,0x52, 0x2,0x3e,0x43, 0x2,0x3e,0x45, 0x2,0x3e,0x46, 0x2,0x3e,0x41, 0x2,0x3e,0x44, 0x1,0x60,0x7a, 0x2,0x45,0x41, 0x3,0x43,0x27, 0x2,0x45,0x46, 0x2,0x45,0x3e, 0x2,0x45,0x42, 0x4,0x3f,0x29, 0x3,0x43,0x28, 0x2,0x45,0x47, 0x2,0x45,0x43, 0x1,0x65,0x42, 0x1,0x65,0x4a, 0x3,0x43,0x25, 0x1,0x65,0x45, 0x2,0x45,0x3f, 0x2,0x45,0x40, 0x1,0x69,0x75, 0x1,0x65,0x4d, 0x1,0x65,0x46, 0x3,0x43,0x26, 0x1,0x65,0x4b, 0x1,0x65,0x44, 0x2,0x45,0x45, 0x1,0x65,0x4c, 0x2,0x45,0x44, 0x1,0x65,0x48, 0x1,0x65,0x43, 0x1,0x65,0x49, 0x2,0x45,0x48, 0x2,0x4c,0x2e, 0x2,0x4c,0x30, 0x4,0x45,0x42, 0x3,0x48,0x39, 0x4,0x45,0x40, 0x4,0x45,0x3d, 0x3,0x48,0x33, 0x3,0x48,0x36, 0x3,0x48,0x35, 0x3,0x48,0x34, 0x3,0x48,0x38, 0x1,0x65,0x47, 0x3,0x48,0x3b, 0x3,0x48,0x3d, 0x2,0x4c,0x2b, 0x1,0x69,0x73, 0x2,0x4c,0x31, 0x1,0x69,0x74, 0x2,0x4c,0x2f, 0x2,0x4c,0x2a, 0x2,0x4c,0x2d, 0x2,0x4c,0x32, 0x1,0x69,0x72, 0x2,0x4c,0x2c, 0x1,0x6d,0x77, 0x2,0x52,0x47, 0x2,0x52,0x46, 0x3,0x4d,0x44, 0x1,0x6d,0x7a, 0x1,0x6d,0x78, 0x2,0x52,0x44, 0x1,0x6d,0x76, 0x2,0x52,0x45, 0x3,0x4d,0x46, 0x1,0x6d,0x79, 0x4,0x51,0x5f, 0x2,0x58,0x69, 0x3,0x51,0x7b, 0x2,0x58,0x6b, 0x3,0x51,0x79, 0x2,0x58,0x6a, 0x2,0x58,0x62, 0x2,0x58,0x66, 0x2,0x58,0x65, 0x2,0x58,0x63, 0x1,0x71,0x50, 0x1,0x71,0x51, 0x1,0x71,0x4f, 0x2,0x58,0x64, 0x2,0x58,0x67, 0x2,0x58,0x68, 0x3,0x55,0x59, 0x1,0x71,0x52, 0x3,0x55,0x58, 0x1,0x74,0x4a, 0x2,0x5d,0x6d, 0x3,0x55,0x5b, 0x1,0x74,0x47, 0x2,0x5d,0x67, 0x1,0x74,0x49, 0x1,0x74,0x4b, 0x4,0x51,0x61, 0x3,0x55,0x5c, 0x1,0x74,0x48, 0x2,0x5d,0x6c, 0x2,0x5d,0x68, 0x1,0x74,0x46, 0x2,0x5d,0x6b, 0x2,0x5d,0x66, 0x2,0x5d,0x6a, 0x2,0x5d,0x69, 0x3,0x58,0x36, 0x3,0x58,0x38, 0x2,0x62,0x42, 0x1,0x76,0x6e, 0x1,0x76,0x6f, 0x1,0x76,0x6c, 0x3,0x58,0x3b, 0x1,0x76,0x6d, 0x3,0x58,0x3a, 0x3,0x58,0x39, 0x2,0x62,0x41, 0x4,0x60,0x39, 0x2,0x66,0x27, 0x3,0x5a,0x60, 0x3,0x5a,0x5f, 0x1,0x78,0x54, 0x2,0x66,0x25, 0x2,0x66,0x26, 0x2,0x69,0x43, 0x2,0x69,0x46, 0x2,0x69,0x44, 0x2,0x69,0x45, 0x2,0x6b,0x6e, 0x3,0x5e,0x42, 0x4,0x66,0x5e, 0x1,0x7a,0x7a, 0x2,0x6f,0x3a, 0x2,0x70,0x42, 0x4,0x6b,0x74, 0x1,0x7c,0x63, 0x2,0x71,0x28, 0x2,0x71,0x29, 0x1,0x7d,0x33, 0x1,0x46,0x79, 0x1,0x52,0x64, 0x3,0x32,0x69, 0x2,0x3e,0x47, 0x3,0x3d,0x57, 0x2,0x45,0x49, 0x4,0x6c,0x76, 0x1,0x46,0x7a, 0x1,0x4b,0x32, 0x4,0x27,0x52, 0x1,0x4f,0x21, 0x3,0x2e,0x36, 0x2,0x2c,0x4a, 0x2,0x2c,0x4b, 0x1,0x56,0x7b, 0x4,0x33,0x5b, 0x2,0x3e,0x48, 0x1,0x60,0x7b, 0x1,0x65,0x4e, 0x1,0x74,0x4c, 0x2,0x5d,0x6e, 0x2,0x66,0x28, 0x2,0x69,0x47, 0x1,0x46,0x7b, 0x3,0x26,0x7b, 0x3,0x26,0x7c, 0xf,0x25,0x23, 0x2,0x28,0x41, 0x2,0x28,0x3c, 0x2,0x28,0x3e, 0x2,0x28,0x40, 0x2,0x28,0x3f, 0x2,0x28,0x3d, 0x1,0x4f,0x22, 0xf,0x28,0x34, 0x1,0x52,0x65, 0x2,0x2c,0x54, 0x3,0x2e,0x39, 0x2,0x2c,0x4f, 0x2,0x2c,0x4c, 0x3,0x2e,0x3b, 0x3,0x2e,0x3e, 0x2,0x2c,0x53, 0x3,0x2e,0x37, 0x3,0x2e,0x3a, 0x1,0x52,0x67, 0x1,0x52,0x68, 0x2,0x2c,0x52, 0x2,0x2c,0x51, 0x2,0x2c,0x50, 0x2,0x2c,0x4d, 0x2,0x2c,0x4e, 0x2,0x2c,0x55, 0x1,0x52,0x66, 0x3,0x2e,0x3d, 0xf,0x2c,0x5c, 0x3,0x65,0x6d, 0x3,0x65,0x6e, 0x1,0x57,0x21, 0x3,0x66,0x7c, 0x1,0x57,0x27, 0x1,0x57,0x26, 0x2,0x31,0x44, 0x2,0x31,0x3e, 0x2,0x31,0x3c, 0x3,0x32,0x6c, 0x1,0x57,0x24, 0x2,0x37,0x5c, 0x1,0x56,0x7d, 0x2,0x31,0x41, 0x2,0x31,0x45, 0x2,0x31,0x47, 0x2,0x31,0x43, 0x2,0x31,0x3d, 0x1,0x57,0x25, 0x2,0x31,0x42, 0x2,0x31,0x40, 0x1,0x56,0x7c, 0x2,0x31,0x48, 0x1,0x57,0x28, 0x2,0x31,0x46, 0x1,0x57,0x22, 0x2,0x31,0x3f, 0x3,0x32,0x6d, 0x1,0x57,0x23, 0x1,0x56,0x7e, 0x3,0x65,0x6f, 0x3,0x37,0x62, 0x1,0x5c,0x3e, 0x4,0x33,0x5d, 0x2,0x37,0x5d, 0x3,0x37,0x63, 0x3,0x37,0x5d, 0x2,0x37,0x56, 0x2,0x37,0x58, 0x2,0x37,0x5a, 0x3,0x37,0x5f, 0x2,0x37,0x5b, 0x2,0x37,0x59, 0x1,0x5c,0x3f, 0x3,0x37,0x61, 0x2,0x37,0x5e, 0x3,0x37,0x60, 0x2,0x37,0x57, 0x3,0x65,0x70, 0x3,0x65,0x71, 0x3,0x65,0x72, 0x2,0x3e,0x4c, 0x1,0x60,0x7c, 0x2,0x3e,0x54, 0x3,0x3d,0x5c, 0x2,0x3e,0x49, 0x6,0x4c,0x2f, 0x2,0x3e,0x55, 0x3,0x3d,0x59, 0x2,0x3e,0x4a, 0x2,0x3e,0x4b, 0x3,0x3d,0x5d, 0x4,0x39,0x54, 0x2,0x3e,0x53, 0x2,0x3e,0x52, 0x2,0x3e,0x4f, 0x1,0x5c,0x3d, 0x1,0x60,0x7d, 0x2,0x3e,0x4d, 0x2,0x3e,0x50, 0x1,0x60,0x7e, 0x2,0x3e,0x51, 0x2,0x3e,0x4e, 0x3,0x3d,0x5a, 0x3,0x43,0x31, 0x2,0x45,0x54, 0x3,0x43,0x2d, 0x2,0x45,0x58, 0x1,0x65,0x55, 0x3,0x43,0x2e, 0x2,0x4c,0x38, 0x1,0x65,0x58, 0x2,0x45,0x56, 0x3,0x43,0x37, 0x3,0x43,0x29, 0x2,0x45,0x53, 0x2,0x45,0x4e, 0x2,0x45,0x50, 0x2,0x45,0x51, 0x2,0x45,0x4a, 0x3,0x43,0x35, 0x1,0x65,0x54, 0x3,0x43,0x2b, 0x3,0x43,0x30, 0x1,0x65,0x53, 0x3,0x43,0x34, 0x1,0x65,0x4f, 0x2,0x45,0x4d, 0x3,0x43,0x2a, 0x1,0x65,0x56, 0x3,0x43,0x36, 0x1,0x65,0x57, 0x2,0x45,0x4c, 0x2,0x45,0x4f, 0x2,0x45,0x57, 0x1,0x65,0x51, 0x1,0x65,0x52, 0x2,0x45,0x55, 0x2,0x45,0x4b, 0xf,0x44,0x25, 0x4,0x45,0x53, 0x2,0x4c,0x3a, 0x1,0x69,0x77, 0x2,0x4c,0x3c, 0x2,0x45,0x52, 0x2,0x4c,0x3e, 0x1,0x69,0x7b, 0x2,0x4c,0x3f, 0x2,0x4c,0x3b, 0x3,0x48,0x3e, 0x1,0x69,0x78, 0x2,0x4c,0x37, 0x1,0x69,0x7a, 0x2,0x4c,0x34, 0x2,0x4c,0x39, 0x2,0x4c,0x3d, 0x2,0x4c,0x36, 0x3,0x48,0x3f, 0x3,0x48,0x45, 0x1,0x65,0x50, 0x3,0x48,0x44, 0x2,0x4c,0x33, 0x1,0x69,0x79, 0x2,0x4c,0x35, 0x3,0x65,0x73, 0x3,0x48,0x40, 0xf,0x4a,0x3f, 0x1,0x6d,0x7d, 0x2,0x52,0x49, 0x1,0x6e,0x23, 0x4,0x4b,0x59, 0x1,0x6e,0x21, 0x4,0x4b,0x57, 0x3,0x4d,0x4a, 0x1,0x69,0x76, 0x3,0x4d,0x4d, 0x2,0x52,0x50, 0x2,0x52,0x51, 0x1,0x6d,0x7c, 0x3,0x4d,0x48, 0x3,0x4d,0x4c, 0x2,0x52,0x4f, 0x2,0x52,0x52, 0x1,0x6d,0x7e, 0x1,0x6d,0x7b, 0x2,0x52,0x4b, 0x2,0x52,0x48, 0x2,0x52,0x4d, 0x2,0x52,0x4a, 0x1,0x6e,0x24, 0x2,0x52,0x4c, 0x3,0x4d,0x4b, 0x3,0x4d,0x49, 0x2,0x52,0x4e, 0x1,0x6e,0x22, 0x3,0x52,0x21, 0x3,0x65,0x74, 0x1,0x71,0x54, 0x2,0x58,0x72, 0x3,0x52,0x24, 0x2,0x58,0x6c, 0x2,0x58,0x70, 0x2,0x58,0x76, 0x2,0x58,0x77, 0x2,0x58,0x73, 0x2,0x58,0x74, 0x2,0x58,0x71, 0x4,0x4b,0x5d, 0x2,0x58,0x6e, 0x4,0x51,0x6e, 0x1,0x71,0x56, 0x1,0x71,0x53, 0x2,0x58,0x6d, 0x2,0x58,0x6f, 0x3,0x52,0x22, 0x1,0x71,0x55, 0x2,0x58,0x75, 0x3,0x65,0x75, 0x1,0x74,0x50, 0x3,0x55,0x60, 0x3,0x55,0x62, 0x2,0x5d,0x75, 0x2,0x5d,0x6f, 0x1,0x74,0x4f, 0x4,0x57,0x3e, 0x1,0x74,0x4d, 0x3,0x55,0x61, 0x2,0x5d,0x77, 0x1,0x74,0x4e, 0x2,0x5d,0x72, 0x2,0x5d,0x73, 0x2,0x5d,0x70, 0x2,0x5d,0x78, 0x2,0x5d,0x74, 0x4,0x57,0x40, 0x1,0x74,0x51, 0x2,0x5d,0x71, 0x2,0x5d,0x79, 0x2,0x5d,0x76, 0x3,0x58,0x43, 0x3,0x58,0x3e, 0x3,0x58,0x40, 0x2,0x62,0x46, 0x3,0x58,0x3f, 0x3,0x58,0x3c, 0x2,0x62,0x43, 0x3,0x58,0x42, 0x1,0x76,0x70, 0x4,0x5c,0x32, 0x2,0x62,0x47, 0x2,0x62,0x49, 0x2,0x62,0x48, 0x2,0x62,0x44, 0x2,0x62,0x45, 0x3,0x58,0x44, 0x2,0x66,0x2d, 0x3,0x5a,0x61, 0x1,0x78,0x55, 0x3,0x5a,0x62, 0x2,0x66,0x2a, 0x2,0x66,0x2c, 0x2,0x66,0x29, 0x2,0x66,0x2e, 0x4,0x60,0x42, 0x3,0x5a,0x63, 0x2,0x66,0x2b, 0x3,0x65,0x76, 0x2,0x69,0x49, 0x2,0x69,0x4c, 0x2,0x69,0x48, 0x1,0x79,0x7c, 0x2,0x69,0x4a, 0x2,0x69,0x4b, 0x2,0x69,0x4d, 0x1,0x79,0x7d, 0x1,0x7a,0x21, 0x1,0x79,0x7e, 0x2,0x6b,0x6f, 0x3,0x5e,0x45, 0x2,0x6b,0x71, 0x3,0x5e,0x43, 0x2,0x6b,0x70, 0x3,0x5e,0x44, 0x2,0x6d,0x64, 0xf,0x6a,0x66, 0x3,0x60,0x3c, 0x2,0x70,0x43, 0x2,0x71,0x2a, 0x1,0x46,0x7c, 0x3,0x24,0x33, 0x2,0x24,0x72, 0x1,0x4f,0x23, 0x2,0x28,0x43, 0x1,0x4f,0x24, 0x1,0x4f,0x25, 0x2,0x28,0x42, 0x2,0x2c,0x5a, 0x2,0x2c,0x59, 0x1,0x52,0x69, 0x1,0x52,0x6c, 0x1,0x52,0x6b, 0x1,0x52,0x6a, 0x2,0x2c,0x56, 0x2,0x2c,0x58, 0x2,0x2c,0x57, 0x3,0x65,0x77, 0x2,0x31,0x4b, 0x1,0x57,0x2a, 0x2,0x31,0x4f, 0x2,0x31,0x4e, 0x2,0x31,0x4d, 0x2,0x31,0x49, 0x1,0x57,0x29, 0x1,0x57,0x2d, 0x1,0x57,0x30, 0x3,0x32,0x6f, 0x3,0x32,0x70, 0x1,0x57,0x31, 0x2,0x31,0x4a, 0x2,0x31,0x4c, 0x1,0x57,0x2f, 0x1,0x57,0x2e, 0x1,0x57,0x2c, 0x1,0x57,0x2b, 0x2,0x37,0x65, 0x3,0x32,0x72, 0x2,0x37,0x63, 0x2,0x37,0x5f, 0x1,0x5c,0x40, 0x3,0x3d,0x5e, 0x2,0x37,0x60, 0x1,0x5c,0x41, 0x2,0x37,0x61, 0x2,0x37,0x62, 0x2,0x37,0x64, 0x3,0x37,0x66, 0x1,0x5c,0x42, 0x3,0x37,0x65, 0x2,0x3e,0x59, 0x3,0x3d,0x5f, 0x2,0x3e,0x58, 0x2,0x3e,0x57, 0x2,0x3e,0x56, 0x3,0x3d,0x64, 0x3,0x3d,0x62, 0x4,0x39,0x5a, 0x2,0x45,0x5c, 0x1,0x65,0x59, 0x4,0x3f,0x46, 0x2,0x45,0x59, 0x2,0x45,0x5b, 0x3,0x43,0x38, 0x1,0x65,0x5a, 0x3,0x43,0x3d, 0x1,0x65,0x5b, 0x2,0x45,0x5a, 0x3,0x43,0x39, 0x3,0x3d,0x63, 0x3,0x65,0x78, 0x3,0x48,0x48, 0x2,0x4c,0x48, 0x3,0x48,0x47, 0x2,0x4c,0x41, 0x2,0x4c,0x42, 0x5,0x47,0x7e, 0x1,0x69,0x7e, 0x1,0x69,0x7c, 0x1,0x69,0x7d, 0x2,0x4c,0x4a, 0x5,0x48,0x22, 0x2,0x4c,0x49, 0x2,0x4c,0x46, 0x2,0x4c,0x45, 0x2,0x4c,0x44, 0x2,0x4c,0x43, 0x2,0x4c,0x47, 0x2,0x4c,0x40, 0x3,0x65,0x79, 0x2,0x52,0x53, 0x2,0x52,0x58, 0x2,0x52,0x56, 0x3,0x4d,0x50, 0x3,0x4d,0x51, 0x3,0x4d,0x4f, 0x2,0x52,0x55, 0x2,0x52,0x54, 0x2,0x52,0x57, 0x3,0x65,0x7a, 0x2,0x58,0x78, 0x3,0x52,0x26, 0x1,0x71,0x57, 0x1,0x74,0x52, 0x2,0x5d,0x7b, 0x3,0x52,0x27, 0x1,0x74,0x53, 0x2,0x5d,0x7a, 0x2,0x62,0x4b, 0x2,0x62,0x4a, 0x1,0x76,0x71, 0x3,0x58,0x45, 0x2,0x66,0x2f, 0x1,0x78,0x56, 0x2,0x69,0x4e, 0x1,0x7b,0x6b, 0x2,0x6d,0x65, 0x3,0x60,0x3d, 0x2,0x70,0x45, 0x2,0x70,0x44, 0x2,0x21,0x67, 0x1,0x52,0x6d, 0x1,0x52,0x6e, 0x2,0x37,0x66, 0x3,0x65,0x7b, 0x1,0x65,0x5d, 0x1,0x46,0x7d, 0x1,0x4b,0x35, 0x1,0x4b,0x34, 0x1,0x4b,0x33, 0x4,0x24,0x68, 0x3,0x2a,0x3e, 0x3,0x2a,0x3d, 0x2,0x28,0x44, 0x3,0x2a,0x3f, 0x3,0x2a,0x42, 0x1,0x4f,0x27, 0x1,0x4f,0x26, 0x3,0x2a,0x44, 0x1,0x52,0x71, 0x3,0x65,0x4c, 0x2,0x2c,0x5c, 0x2,0x2c,0x5f, 0x2,0x2c,0x5d, 0x3,0x2e,0x42, 0x1,0x52,0x6f, 0x1,0x52,0x70, 0x3,0x2e,0x40, 0x3,0x2e,0x41, 0x2,0x2c,0x5b, 0x2,0x2c,0x5e, 0x3,0x2e,0x43, 0x1,0x57,0x38, 0x3,0x32,0x74, 0x3,0x32,0x73, 0x3,0x32,0x79, 0x2,0x31,0x56, 0x2,0x31,0x58, 0x2,0x31,0x57, 0x1,0x57,0x35, 0x2,0x31,0x52, 0x3,0x32,0x76, 0x3,0x32,0x7b, 0x1,0x57,0x33, 0x1,0x57,0x32, 0x3,0x32,0x77, 0x1,0x57,0x36, 0x1,0x57,0x34, 0x3,0x32,0x78, 0x1,0x57,0x37, 0x2,0x31,0x55, 0x2,0x31,0x50, 0x2,0x31,0x51, 0x2,0x31,0x54, 0x2,0x31,0x53, 0x3,0x32,0x7c, 0x3,0x37,0x69, 0x3,0x37,0x67, 0x3,0x37,0x6b, 0x3,0x37,0x6a, 0x2,0x37,0x69, 0x2,0x37,0x6a, 0x2,0x37,0x68, 0x3,0x37,0x6c, 0x2,0x37,0x67, 0x1,0x5c,0x43, 0xf,0x37,0x3f, 0x3,0x3d,0x65, 0x1,0x61,0x25, 0x6,0x4c,0x48, 0x2,0x3e,0x5a, 0x2,0x3e,0x5c, 0x2,0x3e,0x5e, 0x1,0x61,0x24, 0x6,0x4c,0x43, 0x3,0x3d,0x66, 0x1,0x61,0x22, 0x3,0x3d,0x69, 0x2,0x3e,0x5b, 0x1,0x61,0x23, 0x2,0x3e,0x5d, 0x1,0x61,0x21, 0x3,0x3d,0x68, 0x3,0x43,0x41, 0x2,0x45,0x66, 0x2,0x45,0x5d, 0x2,0x45,0x60, 0x2,0x45,0x64, 0x1,0x65,0x61, 0x2,0x45,0x62, 0x4,0x3f,0x50, 0x2,0x45,0x61, 0x2,0x45,0x5e, 0x2,0x45,0x5f, 0x1,0x65,0x5f, 0x2,0x45,0x65, 0x1,0x65,0x5e, 0x3,0x43,0x44, 0x1,0x65,0x63, 0x1,0x65,0x62, 0x1,0x65,0x60, 0x4,0x3f,0x4a, 0x2,0x45,0x63, 0x3,0x65,0x24, 0x2,0x4c,0x50, 0x4,0x45,0x5d, 0x2,0x4c,0x4f, 0x3,0x48,0x4b, 0x3,0x48,0x4d, 0x2,0x4c,0x4b, 0x3,0x48,0x50, 0x3,0x48,0x4f, 0x1,0x6a,0x21, 0x2,0x4c,0x4e, 0x2,0x4c,0x4d, 0x1,0x6a,0x22, 0x3,0x48,0x52, 0xf,0x4a,0x64, 0x4,0x4b,0x63, 0x4,0x45,0x5e, 0x4,0x4b,0x6b, 0x1,0x6e,0x29, 0x3,0x4d,0x55, 0x2,0x52,0x5a, 0x3,0x4d,0x56, 0x1,0x6e,0x2a, 0x1,0x6e,0x26, 0x1,0x6e,0x28, 0x3,0x4d,0x5a, 0x1,0x6e,0x25, 0x1,0x6e,0x27, 0x3,0x4d,0x53, 0x3,0x4d,0x57, 0x2,0x58,0x79, 0x3,0x52,0x2a, 0x1,0x71,0x5a, 0x2,0x58,0x7b, 0x2,0x58,0x7a, 0x3,0x55,0x64, 0x2,0x4c,0x4c, 0x1,0x71,0x5c, 0x1,0x71,0x5b, 0x1,0x71,0x58, 0x1,0x71,0x59, 0x3,0x52,0x2c, 0xf,0x5b,0x59, 0x3,0x52,0x29, 0x2,0x5e,0x22, 0x4,0x57,0x49, 0x2,0x5d,0x7e, 0x1,0x74,0x54, 0x2,0x5e,0x21, 0x4,0x57,0x48, 0x2,0x5e,0x23, 0x2,0x5d,0x7d, 0x2,0x5d,0x7c, 0x2,0x62,0x4c, 0x1,0x76,0x74, 0x1,0x76,0x72, 0x1,0x76,0x73, 0x3,0x5a,0x66, 0x4,0x60,0x45, 0x3,0x5a,0x65, 0x2,0x66,0x30, 0x2,0x66,0x31, 0x1,0x78,0x58, 0x3,0x5a,0x67, 0x1,0x78,0x57, 0x2,0x69,0x50, 0x2,0x69,0x51, 0x2,0x69,0x4f, 0x3,0x5c,0x64, 0x2,0x6d,0x66, 0x2,0x6d,0x67, 0x3,0x60,0x76, 0x3,0x60,0x77, 0x1,0x46,0x7e, 0x2,0x22,0x68, 0x1,0x4b,0x36, 0x2,0x28,0x45, 0x1,0x4f,0x29, 0x1,0x4f,0x28, 0x2,0x28,0x46, 0x3,0x2e,0x44, 0x3,0x2e,0x47, 0x2,0x2c,0x61, 0x1,0x52,0x72, 0x2,0x2c,0x60, 0x1,0x52,0x73, 0x3,0x2e,0x49, 0x3,0x2e,0x48, 0x1,0x57,0x39, 0x2,0x31,0x5b, 0x2,0x31,0x59, 0x2,0x31,0x5f, 0x1,0x57,0x3a, 0x2,0x31,0x5a, 0x2,0x31,0x5e, 0x2,0x31,0x5c, 0x2,0x31,0x5d, 0x2,0x37,0x6b, 0x2,0x37,0x6d, 0x3,0x37,0x72, 0x1,0x5c,0x44, 0x3,0x37,0x71, 0x2,0x37,0x6c, 0x1,0x5c,0x45, 0x1,0x61,0x28, 0x1,0x61,0x27, 0x1,0x61,0x26, 0x2,0x3e,0x5f, 0x3,0x37,0x70, 0x4,0x39,0x65, 0x2,0x45,0x69, 0x1,0x65,0x64, 0x1,0x65,0x65, 0x3,0x43,0x46, 0x2,0x45,0x68, 0x2,0x45,0x67, 0x3,0x43,0x47, 0x3,0x65,0x7c, 0x2,0x4c,0x51, 0x1,0x6a,0x24, 0x1,0x6a,0x23, 0x2,0x4c,0x52, 0x2,0x4c,0x53, 0x1,0x6e,0x2c, 0x1,0x6e,0x2b, 0x3,0x4d,0x5b, 0x2,0x59,0x21, 0x2,0x52,0x5b, 0x2,0x52,0x5d, 0x2,0x52,0x5c, 0x2,0x58,0x7e, 0x2,0x58,0x7c, 0x2,0x59,0x22, 0x2,0x58,0x7d, 0x5,0x56,0x52, 0x1,0x71,0x5d, 0x3,0x52,0x2f, 0x4,0x52,0x27, 0x3,0x52,0x2e, 0x2,0x5e,0x24, 0x1,0x74,0x55, 0x2,0x5e,0x25, 0x2,0x5e,0x26, 0x3,0x55,0x68, 0x1,0x76,0x75, 0x1,0x76,0x76, 0x4,0x60,0x4b, 0x1,0x7a,0x22, 0x3,0x5e,0x49, 0x3,0x5e,0x48, 0x1,0x7c,0x3d, 0x1,0x47,0x21, 0x3,0x26,0x7e, 0x3,0x27,0x21, 0x4,0x27,0x5b, 0x3,0x2a,0x47, 0x3,0x2e,0x4e, 0x2,0x2c,0x62, 0x3,0x2e,0x4f, 0x3,0x2e,0x4d, 0x3,0x2e,0x4b, 0x3,0x2e,0x4c, 0xf,0x2c,0x76, 0x2,0x31,0x60, 0x1,0x57,0x3b, 0x3,0x33,0x23, 0x3,0x33,0x26, 0x3,0x33,0x27, 0x3,0x33,0x24, 0x1,0x5d,0x7e, 0x1,0x5d,0x7d, 0x3,0x37,0x73, 0x3,0x3d,0x71, 0x1,0x61,0x2a, 0x2,0x3e,0x61, 0x1,0x61,0x29, 0x2,0x3e,0x60, 0x3,0x3d,0x70, 0x4,0x3f,0x57, 0x3,0x43,0x49, 0x3,0x43,0x4a, 0x2,0x45,0x6a, 0x3,0x48,0x54, 0x1,0x6a,0x25, 0x2,0x4c,0x54, 0x1,0x6a,0x26, 0x3,0x48,0x55, 0x3,0x52,0x30, 0x3,0x55,0x69, 0x3,0x55,0x6a, 0x4,0x57,0x50, 0x3,0x58,0x49, 0x1,0x7a,0x23, 0x2,0x69,0x52, 0x3,0x5f,0x55, 0x1,0x48,0x4c, 0x1,0x4f,0x2a, 0x2,0x28,0x47, 0x3,0x2e,0x51, 0x1,0x52,0x75, 0x3,0x2e,0x50, 0x1,0x52,0x74, 0x2,0x2c,0x63, 0x2,0x2c,0x64, 0x2,0x31,0x62, 0x2,0x31,0x64, 0x1,0x57,0x3c, 0x2,0x31,0x66, 0x2,0x31,0x69, 0x2,0x31,0x67, 0x3,0x33,0x2b, 0x4,0x2e,0x71, 0x3,0x33,0x2a, 0x2,0x31,0x68, 0x2,0x31,0x65, 0x2,0x31,0x61, 0x1,0x57,0x3d, 0x2,0x31,0x6a, 0x2,0x31,0x63, 0x3,0x33,0x2c, 0x3,0x37,0x78, 0x3,0x37,0x79, 0x2,0x37,0x76, 0x1,0x5c,0x4b, 0x2,0x38,0x21, 0x1,0x5c,0x48, 0x3,0x37,0x77, 0x2,0x37,0x78, 0x1,0x5c,0x4c, 0x3,0x37,0x7b, 0x1,0x5c,0x46, 0x3,0x37,0x76, 0x2,0x37,0x73, 0x2,0x38,0x22, 0x2,0x37,0x74, 0x2,0x37,0x71, 0x1,0x5c,0x4a, 0x4,0x33,0x7c, 0x1,0x5c,0x47, 0x4,0x33,0x7a, 0x2,0x37,0x77, 0x2,0x37,0x7a, 0x1,0x5c,0x49, 0x2,0x37,0x7b, 0x1,0x5c,0x4d, 0x2,0x37,0x7c, 0x2,0x37,0x72, 0x2,0x37,0x79, 0x2,0x37,0x7d, 0x2,0x37,0x75, 0x2,0x37,0x70, 0x2,0x37,0x6e, 0x3,0x37,0x7a, 0x3,0x65,0x7d, 0x2,0x37,0x7e, 0xf,0x37,0x4d, 0x2,0x37,0x6f, 0xf,0x36,0x7e, 0x5,0x3b,0x24, 0x2,0x3e,0x68, 0x3,0x3d,0x7b, 0x3,0x3d,0x78, 0x3,0x3d,0x75, 0x2,0x3e,0x64, 0x2,0x3e,0x6a, 0x1,0x61,0x2d, 0x2,0x3e,0x63, 0x2,0x3e,0x65, 0x1,0x61,0x2b, 0x2,0x3e,0x62, 0x1,0x61,0x32, 0x2,0x3e,0x66, 0x1,0x61,0x31, 0x2,0x3e,0x67, 0x1,0x61,0x33, 0x1,0x61,0x2e, 0x1,0x61,0x34, 0x1,0x61,0x2f, 0x3,0x3d,0x79, 0x1,0x61,0x30, 0x3,0x3d,0x72, 0x1,0x61,0x2c, 0x3,0x3d,0x76, 0x2,0x3e,0x69, 0x3,0x65,0x7e, 0x3,0x43,0x4f, 0x4,0x3f,0x67, 0x1,0x65,0x68, 0x2,0x45,0x75, 0x3,0x43,0x4c, 0x2,0x45,0x78, 0x2,0x45,0x6c, 0x2,0x45,0x71, 0x2,0x45,0x6b, 0x1,0x65,0x6a, 0x3,0x43,0x55, 0x2,0x45,0x6f, 0x4,0x3f,0x5e, 0x3,0x43,0x4d, 0x3,0x3d,0x77, 0x2,0x45,0x6d, 0x1,0x65,0x69, 0x3,0x43,0x54, 0x2,0x45,0x74, 0x2,0x45,0x73, 0x2,0x45,0x70, 0x2,0x45,0x72, 0x2,0x45,0x6e, 0x1,0x6a,0x2a, 0x2,0x45,0x77, 0x1,0x65,0x66, 0x2,0x45,0x76, 0x3,0x43,0x51, 0xf,0x44,0x45, 0x3,0x48,0x56, 0x2,0x4c,0x64, 0x3,0x48,0x58, 0x1,0x6a,0x31, 0x2,0x4c,0x5f, 0x3,0x48,0x60, 0x1,0x6a,0x30, 0x2,0x4c,0x55, 0x4,0x45,0x6b, 0x2,0x4c,0x57, 0x1,0x6a,0x29, 0x2,0x4c,0x5c, 0x2,0x4c,0x5b, 0x2,0x4c,0x5e, 0x1,0x6a,0x2e, 0x2,0x4c,0x59, 0x2,0x4c,0x58, 0x3,0x48,0x5a, 0x3,0x48,0x5e, 0x1,0x6a,0x2d, 0x1,0x6a,0x28, 0x2,0x4c,0x5a, 0x1,0x6a,0x2b, 0x2,0x4c,0x60, 0x2,0x4c,0x62, 0x2,0x4c,0x5d, 0x2,0x4c,0x56, 0x1,0x6a,0x2c, 0x3,0x48,0x57, 0x3,0x48,0x5d, 0x1,0x6e,0x34, 0x1,0x6a,0x27, 0x4,0x45,0x64, 0x3,0x48,0x5c, 0x2,0x4c,0x63, 0x4,0x45,0x70, 0x2,0x52,0x61, 0x1,0x6e,0x2d, 0x3,0x4d,0x5c, 0x2,0x52,0x63, 0x4,0x4c,0x2b, 0x1,0x6e,0x2e, 0x3,0x4d,0x65, 0x3,0x4d,0x5d, 0x1,0x6e,0x30, 0x2,0x52,0x66, 0x4,0x4b,0x7a, 0x2,0x52,0x5e, 0x1,0x6a,0x2f, 0x2,0x52,0x64, 0x4,0x4b,0x73, 0x4,0x4c,0x31, 0x4,0x4b,0x74, 0x4,0x4c,0x2a, 0x2,0x52,0x60, 0x3,0x4d,0x60, 0x1,0x65,0x67, 0x1,0x6e,0x33, 0x4,0x4c,0x21, 0x4,0x4b,0x78, 0x1,0x6e,0x2f, 0x4,0x4c,0x26, 0x1,0x6e,0x31, 0x1,0x6e,0x32, 0x4,0x4b,0x76, 0x1,0x71,0x60, 0x2,0x52,0x65, 0x2,0x52,0x5f, 0x1,0x6e,0x35, 0x3,0x4d,0x63, 0x2,0x52,0x62, 0x3,0x66,0x21, 0x2,0x59,0x2c, 0x2,0x59,0x27, 0x4,0x52,0x2d, 0x5,0x56,0x69, 0x2,0x59,0x31, 0x1,0x71,0x5e, 0x2,0x59,0x29, 0x1,0x71,0x62, 0x2,0x59,0x2f, 0x2,0x59,0x26, 0x2,0x59,0x23, 0x2,0x59,0x32, 0x1,0x74,0x5b, 0x1,0x71,0x63, 0x2,0x59,0x2e, 0x2,0x59,0x24, 0x1,0x71,0x61, 0x2,0x59,0x28, 0x1,0x71,0x65, 0x2,0x59,0x25, 0x2,0x59,0x2a, 0x1,0x71,0x64, 0x2,0x59,0x2d, 0x2,0x59,0x30, 0x3,0x52,0x33, 0x3,0x52,0x34, 0x2,0x5e,0x38, 0x2,0x5e,0x39, 0x2,0x5e,0x29, 0x2,0x5e,0x30, 0x2,0x5e,0x2e, 0x4,0x57,0x5f, 0x3,0x55,0x6d, 0x1,0x74,0x59, 0x2,0x5e,0x35, 0x2,0x59,0x2b, 0x3,0x55,0x6b, 0x2,0x5e,0x2c, 0x3,0x55,0x6e, 0x2,0x5e,0x36, 0x1,0x74,0x58, 0x2,0x5e,0x2b, 0x2,0x5e,0x2a, 0x2,0x5e,0x34, 0x2,0x5e,0x31, 0x2,0x5e,0x33, 0x4,0x57,0x54, 0x2,0x5e,0x27, 0x2,0x5e,0x37, 0x1,0x74,0x56, 0x3,0x55,0x70, 0x2,0x5e,0x32, 0x2,0x5e,0x3b, 0x2,0x5e,0x2f, 0x1,0x74,0x5a, 0x1,0x74,0x57, 0x2,0x5e,0x2d, 0x2,0x5e,0x28, 0x2,0x5e,0x3a, 0x1,0x71,0x5f, 0x3,0x55,0x71, 0xf,0x5b,0x5f, 0x4,0x57,0x57, 0x3,0x55,0x6f, 0x2,0x62,0x4f, 0x3,0x58,0x50, 0x3,0x58,0x4e, 0x2,0x62,0x4d, 0x2,0x62,0x53, 0x1,0x76,0x7a, 0x2,0x62,0x51, 0x2,0x62,0x50, 0x1,0x76,0x7c, 0x2,0x62,0x56, 0x1,0x76,0x7b, 0x3,0x58,0x51, 0x2,0x62,0x57, 0x2,0x62,0x54, 0x1,0x76,0x78, 0x2,0x62,0x55, 0x2,0x62,0x4e, 0x1,0x76,0x79, 0x1,0x76,0x77, 0x2,0x66,0x35, 0x2,0x62,0x52, 0x3,0x58,0x4c, 0x3,0x66,0x22, 0x2,0x62,0x58, 0x3,0x66,0x23, 0x2,0x66,0x32, 0x3,0x5a,0x6f, 0x3,0x5a,0x6e, 0x4,0x60,0x4e, 0x1,0x78,0x5d, 0x1,0x78,0x5b, 0x2,0x66,0x34, 0x4,0x60,0x4c, 0x2,0x66,0x36, 0x2,0x66,0x33, 0x1,0x78,0x5c, 0x1,0x78,0x59, 0x1,0x78,0x5a, 0x1,0x78,0x5e, 0x3,0x66,0x24, 0x1,0x7a,0x25, 0x3,0x5c,0x66, 0x2,0x69,0x57, 0x5,0x6c,0x79, 0x2,0x69,0x56, 0x2,0x69,0x54, 0x2,0x69,0x53, 0x2,0x69,0x55, 0x3,0x5c,0x65, 0x1,0x7a,0x24, 0x1,0x7a,0x26, 0x3,0x66,0x25, 0xf,0x65,0x67, 0x1,0x7a,0x7b, 0x3,0x5e,0x4c, 0x4,0x66,0x6f, 0x2,0x6b,0x73, 0x2,0x6b,0x72, 0x3,0x5c,0x67, 0x3,0x5e,0x4b, 0x2,0x6d,0x68, 0x3,0x5f,0x58, 0x2,0x6d,0x6a, 0x2,0x6d,0x6c, 0x2,0x6d,0x6b, 0x2,0x6d,0x69, 0x3,0x5f,0x57, 0x3,0x60,0x3f, 0x1,0x7b,0x6d, 0x1,0x7b,0x6c, 0x3,0x60,0x3e, 0x1,0x7c,0x3f, 0x1,0x7c,0x3e, 0x1,0x7c,0x40, 0x2,0x6f,0x3c, 0x2,0x6f,0x3b, 0x3,0x66,0x26, 0x2,0x71,0x2b, 0x2,0x70,0x46, 0x2,0x71,0x2c, 0x1,0x7d,0x25, 0x3,0x61,0x44, 0x1,0x7d,0x26, 0x2,0x71,0x5c, 0x4,0x6d,0x5b, 0x3,0x62,0x3a, 0x1,0x7d,0x4b, 0x1,0x48,0x4d, 0x3,0x2a,0x49, 0x2,0x28,0x48, 0x3,0x2a,0x48, 0x3,0x2e,0x52, 0x2,0x2c,0x66, 0x2,0x2c,0x67, 0x2,0x2c,0x65, 0x3,0x2e,0x54, 0x3,0x2e,0x53, 0x1,0x52,0x76, 0xf,0x2d,0x21, 0x2,0x2c,0x68, 0x2,0x2c,0x69, 0x2,0x2c,0x6a, 0x3,0x33,0x31, 0x2,0x31,0x6b, 0x2,0x31,0x71, 0x3,0x33,0x2e, 0x3,0x33,0x30, 0x2,0x31,0x6f, 0x1,0x57,0x3e, 0x2,0x31,0x6d, 0x3,0x33,0x32, 0x2,0x31,0x6e, 0x2,0x31,0x70, 0x3,0x33,0x2d, 0x2,0x31,0x6c, 0x1,0x5c,0x4e, 0x3,0x37,0x7d, 0x2,0x38,0x23, 0x1,0x5c,0x50, 0x2,0x38,0x25, 0x1,0x5c,0x4f, 0x2,0x38,0x24, 0x3,0x37,0x7e, 0x3,0x38,0x21, 0x3,0x38,0x3e, 0x3,0x38,0x22, 0x4,0x34,0x22, 0x2,0x3e,0x6c, 0x1,0x61,0x35, 0x3,0x3e,0x21, 0x2,0x3e,0x6e, 0x2,0x3e,0x6b, 0x2,0x38,0x26, 0x3,0x3e,0x23, 0x1,0x61,0x36, 0x3,0x3e,0x22, 0x3,0x3d,0x7e, 0x2,0x3e,0x6d, 0x3,0x66,0x27, 0xf,0x3e,0x21, 0xf,0x3e,0x23, 0x3,0x43,0x58, 0x2,0x45,0x7b, 0x3,0x43,0x5c, 0x1,0x65,0x6b, 0x2,0x45,0x79, 0x1,0x65,0x6c, 0x2,0x45,0x7a, 0x1,0x65,0x6d, 0x4,0x45,0x74, 0x3,0x48,0x62, 0x3,0x48,0x61, 0x1,0x6a,0x32, 0x2,0x4c,0x68, 0x2,0x4c,0x65, 0x2,0x4c,0x67, 0x1,0x6a,0x33, 0x1,0x6a,0x34, 0x2,0x4c,0x66, 0xf,0x4b,0x27, 0xf,0x4b,0x2b, 0x3,0x4d,0x6f, 0x3,0x4d,0x71, 0x3,0x4d,0x6d, 0x2,0x52,0x67, 0x3,0x4d,0x70, 0x3,0x4d,0x73, 0x2,0x52,0x68, 0x3,0x4d,0x72, 0x1,0x6e,0x36, 0x2,0x52,0x6a, 0x2,0x52,0x69, 0x3,0x4d,0x6e, 0x1,0x23,0x23, 0x4,0x52,0x44, 0x2,0x59,0x36, 0x2,0x59,0x37, 0x2,0x59,0x33, 0x3,0x52,0x37, 0x2,0x59,0x34, 0x1,0x71,0x66, 0x1,0x71,0x67, 0x2,0x59,0x35, 0x1,0x74,0x61, 0x3,0x55,0x75, 0x3,0x55,0x74, 0x1,0x74,0x5d, 0x1,0x74,0x62, 0x1,0x74,0x5e, 0x1,0x74,0x60, 0x1,0x74,0x5c, 0x3,0x52,0x39, 0x1,0x74,0x5f, 0x3,0x58,0x55, 0x4,0x5c,0x5a, 0x4,0x5c,0x5b, 0x3,0x58,0x54, 0x1,0x76,0x7d, 0x2,0x5e,0x3c, 0x7,0x48,0x57, 0x2,0x66,0x38, 0x4,0x60,0x5a, 0x2,0x66,0x37, 0x3,0x66,0x28, 0x2,0x69,0x58, 0x1,0x7a,0x27, 0x1,0x7a,0x28, 0x2,0x6d,0x6e, 0x2,0x6b,0x74, 0x3,0x61,0x69, 0x2,0x6d,0x6d, 0x3,0x60,0x40, 0x2,0x71,0x2d, 0x2,0x71,0x72, 0x1,0x48,0x4e, 0x3,0x27,0x22, 0x1,0x4b,0x37, 0x3,0x2a,0x4b, 0x2,0x28,0x49, 0x1,0x4f,0x2b, 0x3,0x2a,0x4a, 0x1,0x52,0x79, 0x2,0x2c,0x6d, 0x1,0x52,0x77, 0x2,0x2c,0x6b, 0x1,0x52,0x7c, 0x1,0x52,0x78, 0x1,0x52,0x7d, 0x1,0x52,0x7b, 0x2,0x2c,0x6c, 0x1,0x52,0x7a, 0x1,0x57,0x42, 0x1,0x57,0x41, 0x2,0x31,0x7c, 0x1,0x57,0x4a, 0x2,0x31,0x75, 0x2,0x31,0x7b, 0x1,0x57,0x46, 0x2,0x31,0x74, 0x2,0x31,0x7a, 0x2,0x31,0x78, 0x1,0x57,0x45, 0x1,0x57,0x47, 0x2,0x31,0x77, 0x1,0x57,0x40, 0x2,0x31,0x76, 0x1,0x57,0x4b, 0x1,0x57,0x48, 0x1,0x57,0x4c, 0x1,0x57,0x49, 0x2,0x31,0x73, 0x2,0x31,0x72, 0x2,0x31,0x79, 0x1,0x57,0x43, 0x1,0x57,0x3f, 0x1,0x57,0x44, 0x4,0x2f,0x25, 0x3,0x33,0x37, 0x3,0x33,0x3b, 0x2,0x38,0x35, 0x2,0x38,0x2e, 0x4,0x3a,0x26, 0x1,0x61,0x3b, 0x2,0x38,0x2d, 0x3,0x38,0x29, 0x1,0x5c,0x54, 0x1,0x5c,0x5b, 0x1,0x5c,0x58, 0x1,0x5c,0x5e, 0x1,0x5c,0x5d, 0x1,0x5c,0x59, 0x3,0x38,0x26, 0x2,0x38,0x27, 0x2,0x38,0x2a, 0x3,0x38,0x27, 0x2,0x38,0x29, 0x1,0x5c,0x55, 0x2,0x38,0x2b, 0x2,0x38,0x34, 0x1,0x5c,0x56, 0x2,0x38,0x28, 0x2,0x38,0x31, 0x2,0x38,0x32, 0x1,0x5c,0x57, 0x2,0x38,0x2f, 0x1,0x5c,0x5c, 0x1,0x5c,0x52, 0x1,0x5c,0x5a, 0x2,0x38,0x2c, 0x1,0x5c,0x51, 0x2,0x38,0x30, 0x3,0x38,0x2e, 0x3,0x38,0x24, 0x2,0x38,0x33, 0xf,0x37,0x54, 0x3,0x38,0x2b, 0x3,0x3e,0x34, 0x2,0x3f,0x21, 0x2,0x3e,0x76, 0x1,0x61,0x38, 0x2,0x3e,0x7d, 0x2,0x3e,0x7a, 0x2,0x3e,0x72, 0x2,0x3e,0x7b, 0x1,0x61,0x3a, 0x2,0x3e,0x73, 0x3,0x3e,0x29, 0x2,0x3e,0x6f, 0x3,0x3e,0x26, 0x3,0x3e,0x2e, 0x1,0x65,0x73, 0x2,0x3e,0x78, 0x3,0x3e,0x2f, 0x1,0x61,0x37, 0x2,0x3e,0x7e, 0x3,0x3e,0x28, 0x1,0x61,0x3e, 0x1,0x61,0x40, 0x2,0x3e,0x71, 0x3,0x3e,0x2c, 0x4,0x3a,0x27, 0x1,0x61,0x3f, 0x2,0x3e,0x74, 0x1,0x61,0x39, 0x2,0x3e,0x7c, 0x2,0x3e,0x75, 0x2,0x3e,0x79, 0x3,0x3e,0x2a, 0x2,0x3e,0x77, 0x1,0x61,0x3c, 0x2,0x3e,0x70, 0x1,0x61,0x41, 0x1,0x5c,0x53, 0x1,0x61,0x3d, 0x1,0x61,0x42, 0x3,0x3e,0x24, 0x3,0x3e,0x35, 0x3,0x3e,0x33, 0x3,0x43,0x67, 0x1,0x65,0x6f, 0x2,0x46,0x24, 0x2,0x46,0x26, 0x2,0x46,0x28, 0x2,0x46,0x2c, 0x3,0x3e,0x2b, 0x2,0x46,0x22, 0x2,0x45,0x7e, 0x1,0x65,0x71, 0x4,0x3f,0x71, 0x2,0x46,0x27, 0x2,0x46,0x2b, 0x2,0x46,0x23, 0x2,0x45,0x7d, 0x3,0x43,0x66, 0x2,0x45,0x7c, 0x3,0x43,0x69, 0x3,0x43,0x60, 0x3,0x43,0x62, 0x2,0x46,0x29, 0x2,0x46,0x21, 0x2,0x46,0x25, 0x1,0x65,0x72, 0x3,0x43,0x5e, 0x1,0x65,0x70, 0x2,0x46,0x2d, 0x1,0x65,0x6e, 0x2,0x46,0x2a, 0x3,0x43,0x64, 0x2,0x4c,0x79, 0x3,0x43,0x68, 0x3,0x43,0x6a, 0x3,0x43,0x63, 0x1,0x6a,0x37, 0x2,0x4c,0x71, 0x1,0x6e,0x43, 0x2,0x4c,0x7b, 0x1,0x6a,0x3a, 0x2,0x4d,0x21, 0x1,0x6a,0x40, 0x2,0x4c,0x6c, 0x3,0x48,0x74, 0x4,0x45,0x7b, 0x2,0x4c,0x7c, 0x2,0x4c,0x69, 0x3,0x48,0x6d, 0x2,0x4c,0x7e, 0x2,0x4c,0x6d, 0x3,0x48,0x6e, 0x1,0x6a,0x47, 0x1,0x6a,0x44, 0x2,0x4c,0x7d, 0x2,0x4c,0x77, 0x1,0x6a,0x36, 0x1,0x6a,0x3e, 0x1,0x6a,0x3d, 0x3,0x48,0x70, 0x1,0x6a,0x3c, 0x1,0x6a,0x42, 0x3,0x48,0x69, 0x2,0x4c,0x6a, 0x1,0x6a,0x43, 0x2,0x4c,0x78, 0x1,0x6a,0x3f, 0x1,0x6a,0x35, 0x2,0x4c,0x7a, 0x1,0x6a,0x38, 0x1,0x6a,0x39, 0x1,0x6a,0x41, 0x2,0x4c,0x6f, 0x2,0x4c,0x6e, 0x2,0x4c,0x6b, 0x4,0x45,0x7c, 0x2,0x4c,0x73, 0x2,0x4c,0x70, 0x2,0x4c,0x74, 0x1,0x6a,0x46, 0x3,0x48,0x68, 0x2,0x4d,0x22, 0x1,0x6a,0x3b, 0x2,0x4c,0x75, 0x2,0x4c,0x76, 0x3,0x48,0x71, 0x2,0x4c,0x72, 0x3,0x48,0x73, 0x3,0x66,0x29, 0x3,0x48,0x6b, 0x1,0x6a,0x45, 0x3,0x66,0x2b, 0x3,0x4e,0x22, 0x2,0x52,0x6f, 0x1,0x6e,0x3b, 0x1,0x6e,0x44, 0x1,0x6e,0x40, 0x2,0x52,0x6c, 0x3,0x4d,0x7c, 0x1,0x6e,0x3d, 0x1,0x6e,0x41, 0x2,0x52,0x78, 0x1,0x6e,0x37, 0x2,0x52,0x70, 0x3,0x4d,0x78, 0x1,0x6e,0x3f, 0x3,0x4e,0x24, 0x3,0x4e,0x2f, 0x2,0x52,0x73, 0x2,0x52,0x6e, 0x1,0x6e,0x3e, 0x1,0x6e,0x42, 0x2,0x52,0x6d, 0x3,0x4e,0x2e, 0x1,0x6e,0x3c, 0x3,0x4d,0x77, 0x2,0x52,0x77, 0x1,0x6e,0x39, 0x2,0x52,0x76, 0x2,0x52,0x75, 0x1,0x6e,0x45, 0x2,0x50,0x3b, 0x1,0x6e,0x38, 0x3,0x4e,0x2b, 0x2,0x52,0x74, 0x2,0x52,0x6b, 0x3,0x4d,0x75, 0x1,0x6e,0x46, 0x2,0x52,0x72, 0x1,0x6e,0x3a, 0x3,0x4e,0x28, 0x3,0x4e,0x29, 0x3,0x4e,0x25, 0x3,0x4e,0x2c, 0x3,0x4e,0x27, 0x3,0x4d,0x7e, 0x3,0x4d,0x7d, 0x2,0x52,0x71, 0x4,0x4c,0x45, 0x3,0x66,0x2a, 0x1,0x71,0x6a, 0x1,0x71,0x6f, 0x1,0x71,0x68, 0x2,0x59,0x44, 0x2,0x59,0x3b, 0x2,0x59,0x47, 0x2,0x59,0x3f, 0x2,0x59,0x45, 0x1,0x71,0x70, 0x1,0x71,0x69, 0x2,0x59,0x38, 0x2,0x59,0x3e, 0x2,0x59,0x48, 0x2,0x59,0x41, 0x2,0x59,0x46, 0x2,0x59,0x3a, 0x4,0x52,0x4c, 0x3,0x52,0x3b, 0x2,0x59,0x42, 0x1,0x71,0x6b, 0x2,0x59,0x40, 0x1,0x71,0x6e, 0x1,0x71,0x6d, 0x2,0x59,0x3c, 0x2,0x59,0x3d, 0x2,0x59,0x39, 0x2,0x59,0x43, 0x1,0x71,0x6c, 0x2,0x59,0x4a, 0x2,0x59,0x49, 0x3,0x52,0x40, 0x3,0x52,0x3f, 0x2,0x5e,0x47, 0x2,0x5e,0x43, 0x1,0x74,0x69, 0x3,0x55,0x79, 0x2,0x5e,0x3d, 0x1,0x74,0x63, 0x1,0x74,0x73, 0x2,0x5e,0x49, 0x1,0x74,0x6b, 0x1,0x74,0x67, 0x2,0x5e,0x40, 0x1,0x74,0x6e, 0x1,0x74,0x71, 0x2,0x5e,0x4b, 0x1,0x74,0x66, 0x2,0x5e,0x42, 0x1,0x74,0x6f, 0x2,0x5e,0x4d, 0x2,0x5e,0x4a, 0x2,0x5e,0x3e, 0x1,0x74,0x6a, 0x1,0x74,0x64, 0x1,0x74,0x72, 0x2,0x5e,0x45, 0x1,0x74,0x6d, 0x2,0x5e,0x3f, 0x1,0x74,0x68, 0x2,0x5e,0x4c, 0x1,0x74,0x6c, 0x1,0x74,0x65, 0x2,0x5e,0x46, 0x1,0x74,0x70, 0x2,0x5e,0x44, 0x2,0x5e,0x48, 0x3,0x55,0x7a, 0x4,0x5c,0x5f, 0x3,0x58,0x59, 0x2,0x62,0x5a, 0x2,0x62,0x60, 0x1,0x77,0x25, 0x2,0x62,0x63, 0x1,0x76,0x7e, 0x1,0x77,0x21, 0x2,0x62,0x5b, 0x2,0x62,0x62, 0x2,0x62,0x5d, 0x1,0x77,0x26, 0x1,0x77,0x23, 0x3,0x58,0x5b, 0x2,0x62,0x59, 0x3,0x58,0x58, 0x1,0x77,0x22, 0x2,0x62,0x5f, 0x2,0x62,0x61, 0x1,0x77,0x24, 0x2,0x62,0x5e, 0x2,0x62,0x5c, 0x3,0x66,0x2c, 0x4,0x5c,0x5e, 0x3,0x58,0x5a, 0x2,0x66,0x42, 0x1,0x78,0x62, 0x1,0x78,0x63, 0x1,0x78,0x5f, 0x3,0x5a,0x72, 0x1,0x78,0x60, 0x3,0x5a,0x74, 0x2,0x66,0x3e, 0x2,0x66,0x3c, 0x3,0x5a,0x75, 0x2,0x66,0x40, 0x1,0x78,0x64, 0x2,0x66,0x41, 0x2,0x66,0x3a, 0x2,0x66,0x39, 0x2,0x66,0x3d, 0x2,0x66,0x3b, 0x1,0x78,0x61, 0x2,0x66,0x3f, 0x2,0x69,0x59, 0x1,0x7a,0x2b, 0x1,0x7a,0x2a, 0x2,0x69,0x5a, 0x3,0x5c,0x6c, 0x2,0x69,0x5c, 0x2,0x69,0x5b, 0x1,0x7a,0x2c, 0x3,0x5e,0x53, 0x3,0x5e,0x50, 0x2,0x6b,0x79, 0x2,0x6b,0x76, 0x2,0x6b,0x77, 0x3,0x5e,0x51, 0x2,0x6b,0x75, 0x2,0x6b,0x78, 0x1,0x7a,0x7d, 0x2,0x6b,0x7a, 0x3,0x5e,0x52, 0x1,0x7a,0x7c, 0x2,0x6d,0x6f, 0x3,0x5f,0x5a, 0x1,0x7c,0x41, 0x1,0x7c,0x43, 0x2,0x6f,0x3d, 0x1,0x7c,0x42, 0x2,0x70,0x47, 0x2,0x71,0x2f, 0x2,0x71,0x31, 0x2,0x71,0x2e, 0x2,0x71,0x30, 0x1,0x7d,0x39, 0x4,0x6d,0x78, 0x3,0x62,0x35, 0x1,0x48,0x4f, 0x4,0x25,0x57, 0x1,0x52,0x7e, 0x2,0x30,0x52, 0x1,0x57,0x4d, 0x3,0x38,0x31, 0xf,0x31,0x78, 0x1,0x5c,0x5f, 0x2,0x3f,0x22, 0x2,0x3f,0x23, 0x3,0x66,0x2d, 0x3,0x48,0x77, 0x2,0x59,0x4b, 0x1,0x74,0x74, 0x2,0x5e,0x4e, 0x3,0x55,0x7d, 0x3,0x58,0x5c, 0x1,0x77,0x27, 0x2,0x66,0x44, 0x2,0x66,0x43, 0x1,0x7a,0x2d, 0x2,0x6b,0x7b, 0x3,0x5f,0x5b, 0x2,0x6d,0x70, 0x1,0x7c,0x64, 0x2,0x22,0x69, 0x4,0x22,0x21, 0x1,0x4f,0x2c, 0x1,0x4b,0x38, 0xf,0x28,0x4a, 0x2,0x2c,0x6e, 0x3,0x2a,0x4e, 0x2,0x32,0x24, 0x2,0x31,0x7d, 0x2,0x32,0x23, 0x2,0x32,0x21, 0x1,0x57,0x4e, 0x2,0x32,0x22, 0x2,0x31,0x7e, 0x3,0x33,0x3c, 0x2,0x38,0x36, 0x4,0x3a,0x2b, 0x2,0x3f,0x24, 0x2,0x3f,0x25, 0x2,0x46,0x30, 0x2,0x46,0x31, 0x1,0x65,0x75, 0x1,0x65,0x76, 0x2,0x46,0x2f, 0x2,0x46,0x32, 0x2,0x46,0x2e, 0x1,0x65,0x74, 0x3,0x48,0x78, 0x1,0x6a,0x48, 0x3,0x48,0x79, 0x1,0x65,0x77, 0x2,0x4d,0x23, 0x1,0x6e,0x47, 0x2,0x52,0x79, 0x1,0x6e,0x48, 0x3,0x4e,0x30, 0x1,0x71,0x71, 0x2,0x59,0x4e, 0x2,0x59,0x4c, 0x2,0x59,0x4d, 0x2,0x5e,0x51, 0x2,0x5e,0x50, 0x2,0x5e,0x4f, 0x7,0x41,0x61, 0x4,0x5c,0x68, 0x2,0x66,0x45, 0x4,0x60,0x6f, 0x1,0x78,0x65, 0x2,0x66,0x46, 0x2,0x6d,0x71, 0x1,0x7c,0x65, 0x2,0x70,0x48, 0x1,0x48,0x50, 0x1,0x4f,0x2e, 0x1,0x4f,0x2d, 0x2,0x2c,0x70, 0x1,0x53,0x21, 0x3,0x2e,0x5d, 0x4,0x2f,0x30, 0x2,0x2c,0x6f, 0x2,0x32,0x26, 0x3,0x33,0x3d, 0x1,0x57,0x4f, 0x2,0x38,0x37, 0x2,0x32,0x25, 0x3,0x33,0x3f, 0x4,0x2f,0x2f, 0x3,0x33,0x3e, 0x1,0x5c,0x61, 0x2,0x38,0x3a, 0x2,0x38,0x38, 0x2,0x38,0x39, 0x1,0x5c,0x60, 0x2,0x3f,0x27, 0x2,0x3f,0x28, 0x2,0x3f,0x26, 0x3,0x43,0x6e, 0x1,0x65,0x7a, 0x2,0x46,0x34, 0x2,0x46,0x33, 0x2,0x46,0x35, 0x1,0x65,0x79, 0x1,0x65,0x78, 0x4,0x46,0x26, 0x2,0x52,0x7a, 0x2,0x52,0x7c, 0x3,0x4e,0x31, 0x1,0x6e,0x49, 0x2,0x52,0x7b, 0x2,0x59,0x4f, 0x1,0x71,0x72, 0x2,0x62,0x65, 0x3,0x58,0x5d, 0x2,0x62,0x64, 0x1,0x78,0x66, 0x2,0x66,0x47, 0x1,0x78,0x68, 0x1,0x78,0x67, 0x2,0x69,0x5d, 0x2,0x6b,0x7c, 0x1,0x7a,0x7e, 0x1,0x48,0x51, 0x2,0x2c,0x71, 0x1,0x53,0x22, 0x2,0x32,0x29, 0x1,0x57,0x51, 0x2,0x32,0x28, 0x2,0x32,0x27, 0x3,0x33,0x42, 0x1,0x57,0x50, 0x3,0x33,0x43, 0x2,0x38,0x40, 0x4,0x34,0x3d, 0x2,0x38,0x42, 0x2,0x38,0x3b, 0x2,0x38,0x3c, 0x1,0x5c,0x62, 0x2,0x38,0x3d, 0x1,0x5c,0x63, 0x2,0x38,0x41, 0x2,0x38,0x3e, 0x2,0x38,0x3f, 0x1,0x5c,0x64, 0x3,0x3e,0x37, 0x1,0x61,0x44, 0x1,0x61,0x45, 0x3,0x3e,0x38, 0x2,0x3f,0x29, 0x2,0x46,0x36, 0x2,0x46,0x37, 0x3,0x43,0x72, 0x2,0x4d,0x27, 0x1,0x6a,0x4b, 0x1,0x6a,0x49, 0x1,0x6a,0x4a, 0x2,0x4d,0x24, 0x2,0x4d,0x25, 0x6,0x60,0x58, 0x2,0x4d,0x26, 0x2,0x53,0x23, 0x3,0x4e,0x32, 0x2,0x53,0x24, 0x1,0x6e,0x4a, 0x2,0x53,0x21, 0x2,0x52,0x7e, 0x2,0x53,0x22, 0x2,0x52,0x7d, 0x1,0x71,0x75, 0x2,0x59,0x50, 0x1,0x71,0x73, 0x1,0x71,0x74, 0x2,0x5e,0x53, 0x1,0x74,0x75, 0x2,0x5e,0x52, 0x2,0x61,0x34, 0x3,0x55,0x7e, 0x2,0x62,0x66, 0x2,0x62,0x67, 0x1,0x77,0x28, 0x3,0x58,0x61, 0x1,0x77,0x29, 0x1,0x74,0x76, 0x2,0x66,0x48, 0x2,0x66,0x49, 0x2,0x69,0x5e, 0x1,0x7a,0x2e, 0x1,0x48,0x52, 0x3,0x66,0x7b, 0x1,0x48,0x53, 0x1,0x57,0x53, 0x1,0x4f,0x2f, 0x1,0x57,0x52, 0x2,0x2c,0x72, 0x3,0x38,0x36, 0x4,0x2b,0x25, 0x3,0x33,0x44, 0x1,0x61,0x46, 0x1,0x48,0x54, 0x1,0x53,0x24, 0x2,0x2c,0x73, 0x2,0x2c,0x74, 0x1,0x53,0x23, 0x1,0x53,0x25, 0x1,0x48,0x55, 0x4,0x27,0x61, 0x2,0x2c,0x75, 0x1,0x57,0x55, 0x2,0x32,0x2a, 0x1,0x57,0x57, 0x1,0x57,0x54, 0x1,0x57,0x56, 0x3,0x38,0x37, 0x2,0x38,0x45, 0x1,0x5c,0x65, 0x3,0x38,0x39, 0x2,0x38,0x44, 0x2,0x38,0x43, 0x4,0x3a,0x38, 0x2,0x46,0x38, 0x3,0x49,0x22, 0x2,0x4d,0x28, 0x4,0x46,0x2c, 0x1,0x6e,0x4b, 0x1,0x71,0x76, 0x2,0x59,0x52, 0x2,0x59,0x51, 0x3,0x56,0x21, 0x2,0x5e,0x54, 0x4,0x5c,0x71, 0x3,0x58,0x62, 0x3,0x5c,0x6f, 0x2,0x6b,0x7d, 0x4,0x69,0x2e, 0x4,0x69,0x2d, 0x1,0x48,0x56, 0x2,0x24,0x73, 0x2,0x28,0x4a, 0x1,0x53,0x26, 0x2,0x2c,0x76, 0x6,0x3b,0x21, 0x2,0x32,0x2c, 0x4,0x2f,0x3a, 0x3,0x33,0x49, 0x3,0x33,0x48, 0x1,0x57,0x58, 0x2,0x32,0x2b, 0x1,0x57,0x59, 0x3,0x33,0x47, 0x3,0x66,0x2f, 0x2,0x38,0x47, 0x3,0x38,0x3d, 0x3,0x38,0x3c, 0x1,0x5c,0x67, 0x2,0x38,0x46, 0x2,0x38,0x48, 0x3,0x38,0x3b, 0x1,0x5c,0x66, 0x3,0x3e,0x3c, 0x2,0x3f,0x2b, 0x2,0x3f,0x2c, 0x2,0x3f,0x2a, 0x1,0x61,0x47, 0x3,0x67,0x29, 0x4,0x3f,0x7c, 0x1,0x65,0x7b, 0x3,0x43,0x73, 0x1,0x65,0x7c, 0x4,0x46,0x33, 0x1,0x6a,0x4d, 0x3,0x49,0x23, 0x2,0x4d,0x2a, 0x2,0x4d,0x29, 0x1,0x6a,0x4c, 0x3,0x49,0x26, 0x3,0x3e,0x3b, 0x3,0x49,0x25, 0x3,0x66,0x30, 0x2,0x53,0x25, 0x3,0x4e,0x34, 0x3,0x4e,0x36, 0x2,0x53,0x26, 0x3,0x4e,0x37, 0x3,0x4e,0x35, 0x3,0x4e,0x38, 0x2,0x59,0x53, 0x4,0x52,0x5c, 0x3,0x52,0x43, 0x1,0x74,0x7a, 0x1,0x74,0x79, 0x1,0x74,0x77, 0x1,0x74,0x78, 0x1,0x74,0x7b, 0x3,0x56,0x22, 0x2,0x62,0x68, 0x1,0x77,0x2b, 0x1,0x77,0x2a, 0x2,0x66,0x4a, 0x2,0x69,0x5f, 0x3,0x5c,0x70, 0x3,0x5c,0x71, 0x3,0x5c,0x72, 0x1,0x7b,0x6f, 0x1,0x7b,0x6e, 0x1,0x48,0x57, 0x6,0x3b,0x24, 0x2,0x2f,0x7d, 0x1,0x65,0x7e, 0x1,0x61,0x48, 0x1,0x65,0x7d, 0x1,0x6a,0x4e, 0x6,0x60,0x60, 0x1,0x48,0x58, 0x2,0x21,0x68, 0x1,0x48,0x59, 0x1,0x48,0x5a, 0x3,0x24,0x35, 0x3,0x24,0x36, 0x2,0x28,0x4b, 0x2,0x24,0x76, 0x3,0x27,0x24, 0x2,0x24,0x77, 0x1,0x4b,0x3a, 0x3,0x27,0x26, 0x2,0x24,0x74, 0x1,0x4b,0x39, 0x3,0x27,0x25, 0x1,0x4b,0x3c, 0x2,0x24,0x75, 0x1,0x4b,0x3e, 0x1,0x4b,0x3d, 0x2,0x24,0x78, 0x1,0x4b,0x3b, 0x4,0x24,0x70, 0x3,0x27,0x23, 0x1,0x4f,0x34, 0x1,0x4f,0x32, 0x2,0x28,0x4d, 0x3,0x2a,0x56, 0x1,0x4f,0x31, 0x3,0x2a,0x5b, 0x3,0x2a,0x58, 0x3,0x2a,0x4f, 0x1,0x4f,0x36, 0x1,0x4f,0x38, 0x1,0x4f,0x35, 0x3,0x2a,0x59, 0x2,0x28,0x50, 0x2,0x28,0x4c, 0x1,0x4f,0x39, 0x3,0x2a,0x52, 0x1,0x4f,0x33, 0x1,0x4b,0x3f, 0x3,0x2a,0x54, 0x1,0x4f,0x37, 0x2,0x28,0x4f, 0x3,0x2a,0x57, 0x4,0x27,0x64, 0x2,0x28,0x4e, 0x4,0x27,0x69, 0x1,0x4f,0x30, 0x3,0x66,0x31, 0x2,0x2c,0x7c, 0x1,0x53,0x2a, 0x1,0x53,0x2b, 0x2,0x2c,0x7e, 0x3,0x2e,0x66, 0x2,0x2c,0x78, 0x2,0x2c,0x7b, 0x2,0x2d,0x26, 0x2,0x2d,0x24, 0x3,0x2e,0x60, 0x1,0x53,0x2c, 0x2,0x2d,0x2a, 0x1,0x53,0x2f, 0x2,0x2d,0x27, 0x2,0x2c,0x7d, 0x2,0x2c,0x7a, 0x3,0x2e,0x61, 0x3,0x2e,0x5e, 0x2,0x3f,0x2e, 0x2,0x2d,0x25, 0x1,0x53,0x27, 0x2,0x2d,0x28, 0x2,0x2c,0x77, 0x2,0x2d,0x22, 0x1,0x53,0x29, 0x1,0x53,0x2e, 0x2,0x2d,0x23, 0x1,0x53,0x32, 0x1,0x53,0x30, 0x3,0x2e,0x65, 0x2,0x2c,0x79, 0x1,0x53,0x2d, 0x3,0x2e,0x64, 0x2,0x2d,0x21, 0x1,0x53,0x31, 0x1,0x53,0x28, 0x2,0x2d,0x29, 0x1,0x57,0x5e, 0x3,0x33,0x4c, 0x1,0x57,0x67, 0x1,0x57,0x5c, 0x1,0x57,0x5a, 0x2,0x32,0x2e, 0x1,0x57,0x62, 0x1,0x57,0x5f, 0x2,0x32,0x30, 0x3,0x33,0x4a, 0x3,0x33,0x52, 0x1,0x57,0x61, 0x2,0x32,0x2f, 0x2,0x32,0x2d, 0x2,0x32,0x32, 0x1,0x57,0x66, 0x1,0x57,0x64, 0x2,0x3f,0x2d, 0x3,0x33,0x4b, 0x2,0x32,0x33, 0x2,0x32,0x31, 0x1,0x57,0x5b, 0x3,0x33,0x4e, 0x3,0x33,0x4d, 0x1,0x57,0x5d, 0x1,0x57,0x60, 0x3,0x33,0x4f, 0x1,0x57,0x63, 0x3,0x2e,0x63, 0x1,0x57,0x65, 0x3,0x3e,0x44, 0x2,0x38,0x52, 0x1,0x5c,0x69, 0x3,0x38,0x49, 0x2,0x38,0x49, 0x2,0x38,0x4b, 0x3,0x38,0x47, 0x2,0x38,0x4c, 0x4,0x34,0x4d, 0x2,0x38,0x54, 0x2,0x38,0x50, 0x2,0x38,0x4e, 0x4,0x3a,0x3b, 0x2,0x38,0x51, 0x2,0x38,0x55, 0x1,0x5c,0x6a, 0x1,0x5c,0x6e, 0x2,0x38,0x4a, 0x4,0x34,0x47, 0x2,0x38,0x53, 0x4,0x34,0x50, 0x1,0x5c,0x6c, 0x3,0x38,0x41, 0x1,0x5c,0x6b, 0x2,0x38,0x4f, 0x2,0x38,0x4d, 0x3,0x38,0x42, 0x1,0x5c,0x68, 0x1,0x5c,0x6d, 0x3,0x38,0x45, 0x3,0x38,0x48, 0x1,0x61,0x4e, 0x2,0x3f,0x36, 0x3,0x3e,0x3e, 0x4,0x3a,0x3e, 0x2,0x3f,0x34, 0x1,0x61,0x50, 0x4,0x3a,0x47, 0x3,0x3e,0x43, 0x3,0x3e,0x45, 0x3,0x3e,0x41, 0x2,0x3f,0x2f, 0x2,0x46,0x46, 0x3,0x3e,0x3d, 0x1,0x61,0x4f, 0x2,0x3f,0x33, 0x3,0x3e,0x40, 0x3,0x3e,0x42, 0x2,0x3f,0x30, 0x1,0x61,0x4b, 0x1,0x61,0x51, 0x2,0x3f,0x35, 0x1,0x61,0x4d, 0x2,0x3f,0x32, 0x1,0x6a,0x4f, 0x1,0x61,0x4c, 0x2,0x3f,0x31, 0x1,0x61,0x52, 0x1,0x61,0x4a, 0x1,0x61,0x49, 0x6,0x43,0x5a, 0x2,0x46,0x3e, 0x2,0x46,0x3c, 0x3,0x43,0x7b, 0x2,0x46,0x42, 0x3,0x43,0x7e, 0x2,0x46,0x3a, 0x2,0x46,0x47, 0x2,0x46,0x3f, 0x3,0x43,0x75, 0x2,0x46,0x39, 0x1,0x66,0x24, 0x1,0x66,0x2a, 0x2,0x46,0x44, 0x4,0x40,0x29, 0x2,0x46,0x3d, 0x3,0x43,0x76, 0x1,0x66,0x27, 0x3,0x43,0x77, 0x3,0x44,0x23, 0x1,0x66,0x25, 0x2,0x46,0x45, 0x1,0x66,0x22, 0x1,0x66,0x21, 0x2,0x46,0x40, 0x1,0x66,0x26, 0x1,0x61,0x53, 0x3,0x43,0x7c, 0x2,0x46,0x43, 0x2,0x46,0x3b, 0x1,0x66,0x23, 0x1,0x66,0x28, 0x1,0x66,0x29, 0x3,0x44,0x22, 0x1,0x6a,0x54, 0x1,0x6a,0x50, 0x3,0x49,0x27, 0x1,0x6a,0x55, 0x2,0x4d,0x2d, 0x3,0x49,0x2a, 0x4,0x46,0x39, 0x2,0x4d,0x2c, 0x2,0x4d,0x2e, 0x1,0x6a,0x52, 0x2,0x4d,0x2b, 0x1,0x6a,0x53, 0x2,0x4d,0x31, 0x2,0x4d,0x30, 0x2,0x4d,0x2f, 0x4,0x46,0x46, 0x1,0x6a,0x51, 0x4,0x52,0x67, 0x3,0x4e,0x3b, 0x3,0x4e,0x3d, 0x3,0x4e,0x39, 0x2,0x53,0x2a, 0x3,0x4e,0x3c, 0x2,0x53,0x2d, 0x1,0x6e,0x51, 0x2,0x53,0x2c, 0x1,0x6e,0x50, 0x1,0x6e,0x4c, 0x1,0x6e,0x4d, 0x1,0x6e,0x4e, 0x2,0x53,0x29, 0x2,0x53,0x28, 0x1,0x6e,0x4f, 0x3,0x4e,0x3a, 0x2,0x53,0x2b, 0x2,0x53,0x27, 0x2,0x59,0x55, 0x2,0x59,0x5f, 0x1,0x71,0x79, 0x1,0x71,0x78, 0x3,0x52,0x49, 0x2,0x59,0x59, 0x2,0x59,0x5b, 0x3,0x52,0x47, 0x2,0x59,0x56, 0x3,0x52,0x44, 0x2,0x59,0x5a, 0x2,0x59,0x54, 0x2,0x59,0x5d, 0x1,0x71,0x77, 0x2,0x59,0x5c, 0x2,0x59,0x58, 0x2,0x59,0x5e, 0x3,0x56,0x23, 0x2,0x59,0x57, 0x1,0x74,0x7e, 0x2,0x5e,0x55, 0x2,0x5e,0x5b, 0x1,0x75,0x24, 0x1,0x75,0x26, 0x1,0x75,0x23, 0x1,0x75,0x22, 0x4,0x58,0x27, 0x1,0x75,0x21, 0x1,0x74,0x7d, 0x2,0x5e,0x56, 0x2,0x5e,0x59, 0x1,0x74,0x7c, 0x2,0x5e,0x5a, 0x3,0x56,0x24, 0x1,0x75,0x25, 0x2,0x5e,0x58, 0x7,0x48,0x7c, 0x2,0x5e,0x57, 0x1,0x77,0x2c, 0x3,0x58,0x65, 0x1,0x77,0x2d, 0x2,0x62,0x6b, 0x2,0x62,0x69, 0x2,0x62,0x6a, 0x3,0x5a,0x77, 0x2,0x66,0x4c, 0x3,0x5a,0x78, 0x2,0x66,0x4b, 0x1,0x78,0x69, 0x2,0x69,0x61, 0x1,0x7a,0x2f, 0x2,0x69,0x60, 0x2,0x6b,0x7e, 0x2,0x6d,0x72, 0x1,0x7b,0x70, 0x2,0x71,0x32, 0x2,0x71,0x33, 0x1,0x7c,0x44, 0x1,0x48,0x5b, 0x4,0x27,0x6c, 0x1,0x4f,0x3a, 0x2,0x3f,0x37, 0x1,0x6a,0x56, 0x1,0x75,0x27, 0x2,0x5e,0x5c, 0x1,0x48,0x5c, 0x4,0x24,0x73, 0x1,0x57,0x69, 0x1,0x57,0x68, 0x2,0x3f,0x38, 0x3,0x3e,0x47, 0x4,0x3a,0x4c, 0x4,0x4c,0x62, 0x2,0x59,0x60, 0x1,0x48,0x5d, 0x1,0x53,0x33, 0x4,0x3a,0x4d, 0x3,0x3e,0x48, 0x2,0x3f,0x39, 0x2,0x3f,0x3a, 0x2,0x3f,0x3b, 0x1,0x6a,0x57, 0x1,0x71,0x7a, 0x1,0x48,0x5e, 0x4,0x27,0x6d, 0x1,0x4f,0x3b, 0x2,0x2d,0x2b, 0x1,0x57,0x6a, 0x2,0x32,0x34, 0x1,0x5c,0x6f, 0x3,0x3e,0x49, 0x2,0x3f,0x3c, 0x1,0x66,0x2b, 0x1,0x6a,0x58, 0x1,0x71,0x7b, 0x1,0x75,0x28, 0x1,0x77,0x2e, 0x2,0x66,0x4d, 0x1,0x48,0x5f, 0x1,0x4f,0x3c, 0x3,0x2a,0x5d, 0x4,0x27,0x6e, 0x1,0x57,0x6b, 0x2,0x38,0x56, 0x1,0x61,0x54, 0x3,0x49,0x2b, 0x1,0x6a,0x59, 0x2,0x4d,0x32, 0x2,0x53,0x2e, 0x3,0x52,0x4a, 0x3,0x58,0x68, 0x3,0x5a,0x79, 0x1,0x48,0x60, 0x1,0x61,0x55, 0x2,0x46,0x48, 0x1,0x6a,0x5a, 0x1,0x48,0x61, 0x2,0x28,0x51, 0x2,0x2d,0x2c, 0x1,0x53,0x34, 0x3,0x2e,0x68, 0x2,0x32,0x36, 0x4,0x2f,0x4f, 0x3,0x33,0x57, 0x1,0x57,0x6e, 0x3,0x33,0x58, 0x1,0x57,0x6c, 0x1,0x57,0x6d, 0x1,0x57,0x6f, 0x3,0x33,0x55, 0x2,0x32,0x35, 0x2,0x38,0x5b, 0x2,0x38,0x58, 0x2,0x38,0x5a, 0x1,0x5c,0x70, 0x1,0x5c,0x72, 0x1,0x5c,0x71, 0x2,0x38,0x57, 0x1,0x5c,0x73, 0x2,0x38,0x59, 0x2,0x3f,0x3d, 0x2,0x3f,0x3e, 0x2,0x3f,0x3f, 0x2,0x46,0x4b, 0x3,0x44,0x26, 0x2,0x46,0x4c, 0x4,0x40,0x2e, 0x2,0x46,0x4a, 0x2,0x46,0x4d, 0x4,0x40,0x2d, 0x1,0x66,0x2c, 0x3,0x66,0x34, 0x2,0x46,0x49, 0x3,0x49,0x2d, 0x1,0x6a,0x5b, 0x3,0x49,0x2e, 0x2,0x53,0x33, 0x2,0x53,0x2f, 0x2,0x53,0x32, 0x2,0x53,0x34, 0x2,0x53,0x31, 0x2,0x53,0x30, 0x2,0x59,0x61, 0x2,0x59,0x62, 0x2,0x59,0x63, 0x1,0x71,0x7c, 0x1,0x71,0x7d, 0x2,0x5e,0x5e, 0x2,0x5e,0x5d, 0x2,0x5e,0x5f, 0x2,0x62,0x6d, 0x2,0x62,0x6c, 0x2,0x66,0x4f, 0x3,0x5a,0x7a, 0x2,0x66,0x50, 0x2,0x66,0x4e, 0x3,0x5a,0x7b, 0x1,0x7a,0x30, 0x4,0x64,0x2c, 0x2,0x69,0x62, 0x2,0x69,0x63, 0x3,0x5e,0x55, 0x2,0x6d,0x73, 0x2,0x6f,0x3e, 0x2,0x70,0x49, 0x1,0x48,0x62, 0x1,0x4b,0x40, 0x1,0x75,0x29, 0x1,0x48,0x63, 0xf,0x32,0x32, 0x2,0x38,0x5c, 0x2,0x3f,0x40, 0x3,0x5a,0x7c, 0x1,0x7c,0x6c, 0x2,0x22,0x6a, 0x4,0x21,0x53, 0x3,0x24,0x38, 0x2,0x22,0x6b, 0x2,0x22,0x6d, 0x1,0x48,0x64, 0x2,0x22,0x6e, 0x2,0x22,0x6c, 0x4,0x23,0x2f, 0x2,0x25,0x22, 0x2,0x25,0x23, 0x2,0x24,0x7b, 0x3,0x27,0x28, 0x4,0x24,0x7b, 0x4,0x24,0x75, 0x2,0x25,0x21, 0x1,0x4b,0x42, 0x3,0x27,0x29, 0x1,0x4b,0x43, 0x2,0x24,0x7c, 0x2,0x24,0x7a, 0x2,0x24,0x79, 0x2,0x24,0x7d, 0x1,0x4b,0x41, 0x2,0x24,0x7e, 0x2,0x2d,0x2d, 0x3,0x27,0x2b, 0x4,0x24,0x79, 0x2,0x28,0x56, 0x1,0x4f,0x3f, 0x2,0x28,0x55, 0x2,0x28,0x57, 0x3,0x2a,0x60, 0x1,0x4f,0x3e, 0x2,0x28,0x5c, 0x1,0x4f,0x42, 0x2,0x28,0x52, 0x2,0x28,0x60, 0x2,0x28,0x66, 0x1,0x4f,0x49, 0x2,0x28,0x63, 0x1,0x4f,0x46, 0x3,0x2a,0x6b, 0x2,0x28,0x59, 0x2,0x28,0x5f, 0x2,0x28,0x61, 0x3,0x2a,0x66, 0x2,0x28,0x54, 0x1,0x4f,0x45, 0x1,0x4f,0x40, 0x2,0x28,0x5a, 0x1,0x4f,0x47, 0x1,0x4f,0x4a, 0x1,0x4f,0x44, 0x3,0x2a,0x6c, 0x1,0x4f,0x3d, 0x2,0x28,0x5e, 0x2,0x28,0x58, 0x2,0x28,0x65, 0x1,0x4f,0x4c, 0x1,0x4f,0x48, 0x1,0x4f,0x43, 0x2,0x28,0x5d, 0x1,0x57,0x70, 0x2,0x28,0x5b, 0x1,0x4f,0x41, 0x1,0x4f,0x4b, 0x4,0x27,0x7a, 0x2,0x28,0x53, 0x4,0x27,0x7e, 0x2,0x28,0x62, 0x2,0x28,0x64, 0x3,0x2a,0x5e, 0xf,0x28,0x63, 0x3,0x2a,0x68, 0x4,0x27,0x7b, 0x3,0x2e,0x76, 0x1,0x53,0x45, 0x1,0x53,0x3f, 0x1,0x53,0x47, 0x1,0x53,0x44, 0x2,0x2d,0x34, 0x2,0x2d,0x37, 0x1,0x53,0x40, 0x3,0x2e,0x6a, 0x2,0x2d,0x2e, 0x4,0x2b,0x3a, 0x1,0x53,0x39, 0x1,0x53,0x43, 0x3,0x2e,0x6b, 0x1,0x53,0x46, 0x1,0x53,0x48, 0x2,0x2d,0x43, 0x2,0x2d,0x3a, 0x3,0x2e,0x78, 0x1,0x53,0x38, 0x2,0x2d,0x42, 0x1,0x53,0x3c, 0x1,0x53,0x3a, 0x1,0x53,0x35, 0x2,0x2d,0x32, 0x3,0x2e,0x72, 0x2,0x2d,0x41, 0x2,0x2d,0x36, 0x2,0x2d,0x39, 0x2,0x2d,0x46, 0x3,0x2e,0x74, 0x1,0x53,0x49, 0x2,0x2d,0x40, 0x1,0x53,0x41, 0x2,0x2d,0x3b, 0x2,0x2d,0x45, 0x2,0x2d,0x38, 0x2,0x2d,0x3c, 0x2,0x2d,0x3f, 0x3,0x2e,0x69, 0x3,0x2e,0x6e, 0x2,0x2d,0x30, 0x2,0x2d,0x44, 0x2,0x2d,0x3e, 0x3,0x2e,0x6f, 0x3,0x2e,0x7a, 0x2,0x2d,0x2f, 0x6,0x34,0x3c, 0x2,0x2d,0x33, 0x1,0x53,0x42, 0x1,0x53,0x3d, 0x1,0x53,0x36, 0x1,0x53,0x3b, 0x1,0x53,0x37, 0x1,0x53,0x4a, 0x2,0x2d,0x31, 0x2,0x32,0x47, 0x1,0x53,0x3e, 0x4,0x2b,0x3d, 0x3,0x2e,0x79, 0x2,0x2d,0x3d, 0x2,0x29,0x42, 0x3,0x2e,0x77, 0x3,0x66,0x35, 0x3,0x66,0x37, 0x2,0x32,0x4a, 0x1,0x57,0x7e, 0x3,0x33,0x62, 0x2,0x32,0x3a, 0x4,0x2f,0x5d, 0x2,0x32,0x45, 0x2,0x32,0x41, 0x3,0x38,0x4d, 0x2,0x32,0x54, 0x3,0x33,0x59, 0x2,0x32,0x4c, 0x3,0x33,0x5f, 0x2,0x32,0x42, 0x3,0x38,0x5b, 0x2,0x32,0x4b, 0x2,0x32,0x3c, 0x2,0x32,0x40, 0x2,0x32,0x57, 0x1,0x58,0x23, 0x2,0x32,0x4f, 0x2,0x32,0x46, 0x1,0x57,0x71, 0x2,0x32,0x55, 0x2,0x32,0x38, 0x4,0x2f,0x5a, 0x2,0x32,0x4e, 0x4,0x2f,0x63, 0x1,0x58,0x22, 0x1,0x57,0x7b, 0x2,0x32,0x37, 0x1,0x57,0x79, 0x1,0x57,0x78, 0x1,0x57,0x7d, 0x2,0x32,0x4d, 0x1,0x57,0x75, 0x1,0x57,0x7c, 0x2,0x2d,0x35, 0x2,0x3f,0x41, 0x2,0x32,0x48, 0x4,0x2f,0x5f, 0x3,0x2a,0x5f, 0x2,0x32,0x3e, 0x1,0x58,0x21, 0x2,0x32,0x3f, 0x2,0x32,0x43, 0x1,0x58,0x24, 0x2,0x32,0x39, 0x2,0x32,0x51, 0x3,0x3e,0x57, 0x2,0x32,0x50, 0x2,0x32,0x58, 0x1,0x57,0x77, 0x1,0x57,0x74, 0x2,0x32,0x56, 0x2,0x32,0x52, 0x2,0x32,0x49, 0x2,0x32,0x44, 0x1,0x57,0x7a, 0x1,0x57,0x76, 0x2,0x32,0x3b, 0x1,0x57,0x72, 0x2,0x32,0x53, 0x1,0x57,0x73, 0x4,0x2f,0x5c, 0x2,0x32,0x3d, 0x3,0x33,0x5a, 0x3,0x33,0x63, 0x3,0x66,0x36, 0x3,0x2d,0x33, 0x4,0x34,0x67, 0x3,0x38,0x4e, 0x3,0x38,0x51, 0x2,0x38,0x62, 0x2,0x38,0x64, 0x2,0x38,0x69, 0x2,0x38,0x7d, 0x1,0x5d,0x23, 0x1,0x5c,0x77, 0x3,0x38,0x54, 0x2,0x38,0x61, 0x1,0x5d,0x24, 0x1,0x5d,0x25, 0x2,0x38,0x6c, 0x2,0x38,0x73, 0x2,0x38,0x79, 0x3,0x38,0x50, 0x2,0x38,0x66, 0x4,0x34,0x6d, 0x2,0x38,0x6d, 0x3,0x38,0x4f, 0x3,0x38,0x5d, 0x1,0x5d,0x26, 0x2,0x38,0x7b, 0x2,0x38,0x76, 0x1,0x5d,0x21, 0x1,0x5c,0x7d, 0x2,0x38,0x72, 0x2,0x38,0x6e, 0x2,0x38,0x60, 0x1,0x5c,0x74, 0x2,0x38,0x65, 0x2,0x38,0x5d, 0x3,0x38,0x55, 0x1,0x5c,0x7c, 0x1,0x5c,0x7e, 0x2,0x38,0x6a, 0x2,0x38,0x67, 0x1,0x5c,0x79, 0x2,0x38,0x77, 0x1,0x5c,0x76, 0x2,0x38,0x68, 0x2,0x3f,0x6a, 0x2,0x38,0x70, 0x3,0x38,0x5e, 0x2,0x38,0x6f, 0x1,0x5c,0x75, 0x3,0x38,0x57, 0x1,0x5d,0x22, 0x3,0x38,0x52, 0x1,0x5c,0x78, 0x2,0x38,0x5e, 0x2,0x38,0x63, 0x2,0x38,0x74, 0x2,0x38,0x7a, 0x1,0x5d,0x27, 0x2,0x38,0x5f, 0x2,0x38,0x6b, 0x2,0x38,0x71, 0x1,0x5c,0x7b, 0x4,0x34,0x6f, 0x3,0x38,0x58, 0x2,0x38,0x7c, 0x2,0x38,0x75, 0x2,0x38,0x78, 0x3,0x38,0x5f, 0xf,0x37,0x78, 0x1,0x5c,0x7a, 0x4,0x3a,0x68, 0x2,0x3f,0x51, 0x2,0x3f,0x45, 0x1,0x61,0x5d, 0x2,0x3f,0x62, 0x2,0x3f,0x6b, 0x2,0x3f,0x6e, 0x1,0x61,0x5b, 0x2,0x3f,0x4d, 0x2,0x3f,0x66, 0x2,0x3f,0x4e, 0x2,0x3f,0x5c, 0x1,0x61,0x68, 0x2,0x3f,0x58, 0x1,0x61,0x65, 0x3,0x3e,0x5e, 0x2,0x3f,0x59, 0x2,0x3f,0x42, 0x5,0x3b,0x6f, 0x2,0x3f,0x67, 0x3,0x3e,0x4f, 0x3,0x3e,0x59, 0x1,0x61,0x6e, 0x2,0x3f,0x64, 0x2,0x3f,0x5a, 0x2,0x3f,0x70, 0x2,0x3f,0x55, 0x2,0x46,0x6d, 0x3,0x3e,0x4d, 0x2,0x3f,0x73, 0x1,0x61,0x6c, 0x2,0x3f,0x53, 0x2,0x3f,0x5f, 0x1,0x61,0x6f, 0x1,0x61,0x5a, 0x2,0x3f,0x57, 0x2,0x3f,0x71, 0x2,0x3f,0x50, 0x2,0x3f,0x49, 0x2,0x3f,0x54, 0x3,0x3e,0x5f, 0x2,0x3f,0x48, 0x2,0x3f,0x46, 0x1,0x61,0x56, 0x2,0x3f,0x68, 0x2,0x3f,0x4f, 0x2,0x3f,0x6c, 0x3,0x3e,0x4b, 0x2,0x3f,0x6d, 0x1,0x61,0x5e, 0x1,0x61,0x63, 0x1,0x61,0x5f, 0x1,0x61,0x67, 0x2,0x3f,0x63, 0x1,0x61,0x60, 0x2,0x3f,0x5b, 0x2,0x3f,0x4b, 0xf,0x3e,0x66, 0x1,0x61,0x58, 0x2,0x3f,0x43, 0x2,0x3f,0x65, 0x2,0x3f,0x6f, 0x2,0x3f,0x4a, 0x1,0x61,0x66, 0x2,0x3f,0x74, 0x2,0x3f,0x56, 0x3,0x3e,0x52, 0x2,0x3f,0x52, 0x3,0x3e,0x5c, 0x1,0x61,0x57, 0x1,0x61,0x6b, 0x3,0x3e,0x5a, 0x2,0x3f,0x61, 0x1,0x61,0x6d, 0x3,0x3e,0x50, 0x2,0x3f,0x5d, 0x1,0x61,0x62, 0x1,0x61,0x5c, 0x1,0x61,0x64, 0x1,0x61,0x59, 0x1,0x61,0x6a, 0x2,0x3f,0x5e, 0x2,0x3f,0x4c, 0x2,0x3f,0x60, 0x2,0x3f,0x47, 0x2,0x3f,0x69, 0x3,0x3e,0x58, 0x4,0x3a,0x67, 0x3,0x3e,0x5d, 0x3,0x3e,0x56, 0x3,0x3e,0x4e, 0x2,0x3f,0x72, 0x3,0x66,0x39, 0x3,0x3e,0x5b, 0x3,0x66,0x38, 0x2,0x3f,0x44, 0x2,0x46,0x6c, 0x3,0x44,0x2d, 0x2,0x47,0x24, 0x1,0x65,0x5c, 0x2,0x46,0x71, 0x3,0x44,0x31, 0x2,0x46,0x6f, 0x2,0x46,0x5a, 0x1,0x66,0x30, 0x2,0x46,0x6a, 0x2,0x46,0x7e, 0x2,0x46,0x66, 0x1,0x66,0x38, 0x2,0x46,0x7d, 0x2,0x46,0x64, 0x1,0x61,0x69, 0x2,0x46,0x74, 0x2,0x46,0x65, 0x2,0x46,0x7b, 0x1,0x66,0x37, 0x1,0x66,0x2f, 0x3,0x44,0x3a, 0x2,0x46,0x4f, 0x2,0x46,0x57, 0x3,0x44,0x35, 0x2,0x46,0x70, 0x2,0x46,0x68, 0x2,0x47,0x23, 0x2,0x46,0x6b, 0x1,0x66,0x3d, 0x2,0x46,0x7c, 0x3,0x44,0x2c, 0x1,0x66,0x34, 0x3,0x44,0x3e, 0x2,0x46,0x6e, 0x2,0x46,0x76, 0x2,0x46,0x5b, 0x2,0x46,0x75, 0x3,0x44,0x27, 0x2,0x47,0x28, 0x2,0x46,0x56, 0x2,0x46,0x77, 0x3,0x44,0x33, 0x2,0x47,0x26, 0x3,0x44,0x3f, 0x2,0x46,0x50, 0x1,0x61,0x61, 0x3,0x44,0x40, 0x2,0x46,0x5e, 0x2,0x46,0x5d, 0x1,0x66,0x36, 0x3,0x44,0x32, 0x2,0x46,0x61, 0x2,0x46,0x63, 0x2,0x46,0x72, 0x2,0x47,0x25, 0x1,0x66,0x39, 0x3,0x44,0x38, 0x1,0x66,0x3a, 0x3,0x44,0x30, 0x2,0x46,0x55, 0x1,0x66,0x32, 0x2,0x46,0x59, 0x2,0x47,0x21, 0x1,0x66,0x3b, 0x4,0x40,0x44, 0x1,0x66,0x33, 0x1,0x66,0x35, 0x1,0x66,0x3c, 0x2,0x47,0x27, 0x2,0x46,0x78, 0x2,0x46,0x73, 0x3,0x44,0x3c, 0x3,0x44,0x2f, 0x2,0x46,0x60, 0x2,0x46,0x5f, 0x1,0x66,0x31, 0x2,0x46,0x51, 0x1,0x66,0x2e, 0x2,0x46,0x69, 0x2,0x46,0x52, 0x2,0x46,0x67, 0x3,0x44,0x2e, 0x4,0x40,0x41, 0x2,0x46,0x5c, 0x2,0x47,0x22, 0x3,0x44,0x2a, 0x3,0x44,0x39, 0x4,0x40,0x36, 0x1,0x66,0x2d, 0x3,0x44,0x3b, 0x3,0x44,0x28, 0x2,0x46,0x58, 0x4,0x40,0x46, 0x2,0x46,0x54, 0x2,0x46,0x7a, 0x2,0x46,0x53, 0x1,0x6a,0x68, 0x2,0x4d,0x5a, 0x3,0x49,0x35, 0x3,0x49,0x44, 0x2,0x4d,0x49, 0x3,0x49,0x33, 0x3,0x49,0x38, 0x2,0x4d,0x33, 0x2,0x4d,0x51, 0x1,0x6a,0x60, 0x2,0x4d,0x42, 0x2,0x4d,0x4c, 0x1,0x6a,0x63, 0x2,0x4d,0x45, 0x1,0x6a,0x61, 0x2,0x4d,0x36, 0x2,0x4d,0x54, 0x2,0x4d,0x35, 0x2,0x4d,0x48, 0x3,0x49,0x3c, 0x2,0x4d,0x34, 0x3,0x49,0x39, 0x4,0x46,0x6c, 0x2,0x4d,0x46, 0x2,0x4d,0x4f, 0x2,0x4d,0x4d, 0x2,0x4d,0x41, 0x2,0x4d,0x3c, 0x2,0x4d,0x3a, 0x3,0x49,0x42, 0x2,0x4d,0x3b, 0x2,0x4d,0x4e, 0x2,0x4d,0x59, 0x2,0x4d,0x43, 0x1,0x6a,0x62, 0x3,0x49,0x3b, 0x2,0x4d,0x3e, 0x3,0x49,0x3a, 0x2,0x4d,0x52, 0x3,0x49,0x41, 0x1,0x6a,0x65, 0x2,0x4d,0x3d, 0x2,0x4d,0x37, 0x2,0x4d,0x47, 0x1,0x6a,0x69, 0x3,0x49,0x32, 0x4,0x46,0x58, 0x1,0x6a,0x5d, 0x1,0x6a,0x66, 0x2,0x4d,0x3f, 0x2,0x4d,0x39, 0x3,0x49,0x36, 0x1,0x6a,0x5f, 0x2,0x46,0x79, 0x1,0x6a,0x5e, 0x2,0x4d,0x4a, 0x3,0x44,0x36, 0x1,0x6a,0x5c, 0x1,0x6a,0x6b, 0x1,0x6a,0x64, 0x2,0x4d,0x4b, 0x2,0x4d,0x40, 0x2,0x4d,0x38, 0x2,0x4d,0x53, 0x2,0x4d,0x44, 0x1,0x6a,0x6a, 0x2,0x4d,0x57, 0x1,0x6a,0x67, 0x2,0x4d,0x56, 0x3,0x49,0x3f, 0x2,0x4d,0x50, 0x2,0x4d,0x55, 0x3,0x49,0x3e, 0x3,0x49,0x43, 0x2,0x4d,0x58, 0x3,0x66,0x3b, 0x3,0x66,0x3c, 0x3,0x66,0x3a, 0x3,0x49,0x3d, 0x2,0x53,0x5c, 0x2,0x53,0x5d, 0x2,0x53,0x50, 0x2,0x53,0x4f, 0x2,0x53,0x4b, 0x1,0x6e,0x5d, 0x3,0x4e,0x4f, 0x1,0x6e,0x55, 0x2,0x53,0x5f, 0x2,0x53,0x5e, 0x2,0x46,0x4e, 0x2,0x53,0x48, 0x2,0x53,0x4c, 0x2,0x53,0x46, 0x3,0x4e,0x44, 0x2,0x53,0x59, 0x2,0x53,0x4a, 0x3,0x4e,0x42, 0x2,0x53,0x60, 0x2,0x53,0x43, 0x2,0x53,0x41, 0x2,0x53,0x4d, 0x2,0x53,0x57, 0x2,0x53,0x52, 0x1,0x6e,0x5f, 0x2,0x53,0x38, 0x3,0x4e,0x40, 0x2,0x53,0x56, 0x3,0x4e,0x4c, 0x3,0x4e,0x46, 0x3,0x4e,0x54, 0x1,0x6e,0x60, 0x2,0x46,0x62, 0x2,0x53,0x44, 0x2,0x53,0x3b, 0x2,0x53,0x3e, 0x2,0x53,0x64, 0x2,0x53,0x45, 0x2,0x53,0x3c, 0x2,0x53,0x3a, 0x2,0x53,0x37, 0x4,0x4c,0x7a, 0x1,0x6e,0x59, 0x2,0x53,0x4e, 0x1,0x6e,0x58, 0x1,0x6e,0x5c, 0x2,0x53,0x49, 0x2,0x53,0x51, 0x1,0x6e,0x52, 0x2,0x53,0x61, 0x2,0x53,0x65, 0x1,0x6e,0x54, 0x3,0x4e,0x4b, 0x2,0x53,0x40, 0x2,0x53,0x54, 0x2,0x53,0x58, 0x2,0x53,0x3d, 0x2,0x53,0x62, 0x1,0x6e,0x5b, 0x4,0x4c,0x6a, 0x1,0x6e,0x5a, 0x2,0x53,0x35, 0x1,0x6e,0x5e, 0x2,0x53,0x5b, 0x2,0x53,0x3f, 0x2,0x53,0x53, 0x2,0x53,0x39, 0x2,0x53,0x47, 0x2,0x53,0x42, 0x1,0x6e,0x56, 0x1,0x6e,0x57, 0x2,0x53,0x55, 0x2,0x53,0x66, 0x2,0x53,0x63, 0x2,0x53,0x5a, 0x4,0x4c,0x78, 0x3,0x4e,0x4d, 0x3,0x4e,0x4e, 0x3,0x4e,0x52, 0x4,0x4c,0x74, 0x2,0x53,0x36, 0x1,0x6e,0x53, 0x2,0x59,0x74, 0x3,0x52,0x5a, 0x2,0x59,0x6b, 0x2,0x59,0x6e, 0x3,0x52,0x52, 0x1,0x72,0x25, 0x2,0x59,0x70, 0x2,0x59,0x65, 0x2,0x59,0x6c, 0x2,0x59,0x72, 0x1,0x72,0x22, 0x1,0x72,0x26, 0x1,0x71,0x7e, 0x3,0x52,0x59, 0x3,0x52,0x50, 0x2,0x59,0x67, 0x2,0x59,0x77, 0x4,0x4d,0x25, 0x4,0x53,0x33, 0x2,0x59,0x71, 0x4,0x53,0x24, 0x2,0x59,0x68, 0x2,0x5a,0x22, 0x2,0x59,0x7a, 0x2,0x59,0x64, 0x2,0x5e,0x72, 0x2,0x59,0x6a, 0x1,0x72,0x21, 0x3,0x52,0x58, 0x2,0x59,0x75, 0x3,0x52,0x54, 0x2,0x5a,0x21, 0x1,0x72,0x29, 0x3,0x52,0x56, 0x2,0x59,0x7c, 0x2,0x59,0x69, 0x2,0x59,0x6f, 0x2,0x59,0x73, 0x2,0x59,0x6d, 0x2,0x5a,0x23, 0x2,0x59,0x7e, 0x2,0x59,0x7b, 0x1,0x72,0x23, 0x1,0x72,0x24, 0x1,0x72,0x28, 0x2,0x59,0x66, 0x2,0x5a,0x24, 0x1,0x72,0x27, 0x2,0x59,0x78, 0x3,0x52,0x4f, 0x3,0x52,0x55, 0x2,0x59,0x76, 0x3,0x66,0x3d, 0x2,0x59,0x79, 0x2,0x5f,0x21, 0x2,0x5e,0x6c, 0x2,0x5e,0x71, 0x2,0x5e,0x7e, 0x2,0x5e,0x70, 0x2,0x5e,0x68, 0x2,0x5e,0x6d, 0x4,0x58,0x3e, 0x1,0x75,0x2c, 0x3,0x56,0x2b, 0x2,0x5e,0x61, 0x2,0x5e,0x79, 0x2,0x5e,0x7b, 0x2,0x5e,0x60, 0x1,0x75,0x2b, 0x2,0x5e,0x7d, 0x2,0x5e,0x75, 0x1,0x75,0x32, 0x2,0x5e,0x7c, 0x2,0x5e,0x6e, 0x1,0x75,0x34, 0x2,0x5e,0x66, 0x2,0x59,0x7d, 0x2,0x5e,0x76, 0x2,0x5e,0x73, 0x2,0x5e,0x62, 0x2,0x5f,0x23, 0x1,0x75,0x2e, 0x3,0x56,0x28, 0x3,0x56,0x29, 0x1,0x75,0x2f, 0x2,0x5e,0x64, 0x2,0x5e,0x74, 0x3,0x56,0x2d, 0x2,0x5f,0x22, 0x2,0x5e,0x77, 0x2,0x5e,0x6a, 0x1,0x75,0x31, 0x1,0x75,0x2d, 0x2,0x5e,0x78, 0x2,0x5e,0x6b, 0x2,0x5f,0x24, 0x2,0x5e,0x65, 0x2,0x5e,0x6f, 0x2,0x5e,0x7a, 0x2,0x5e,0x67, 0x2,0x5e,0x69, 0x4,0x58,0x40, 0x1,0x75,0x35, 0x2,0x5e,0x63, 0x1,0x75,0x33, 0x1,0x77,0x30, 0x1,0x75,0x2a, 0x3,0x56,0x2c, 0x3,0x56,0x30, 0x1,0x75,0x30, 0x1,0x77,0x34, 0x2,0x62,0x7d, 0x3,0x58,0x6c, 0x2,0x62,0x73, 0x2,0x62,0x6e, 0x2,0x62,0x74, 0x2,0x62,0x7e, 0x2,0x63,0x24, 0x2,0x63,0x23, 0x1,0x77,0x36, 0x1,0x77,0x35, 0x3,0x58,0x6e, 0x4,0x5d,0x2c, 0x2,0x62,0x75, 0x2,0x63,0x25, 0x2,0x62,0x78, 0x2,0x62,0x70, 0x3,0x58,0x6f, 0x2,0x62,0x72, 0x2,0x62,0x71, 0x2,0x62,0x77, 0x2,0x62,0x7c, 0x2,0x62,0x6f, 0x2,0x62,0x76, 0x2,0x62,0x7b, 0x1,0x77,0x33, 0x4,0x5d,0x28, 0x2,0x62,0x79, 0x3,0x58,0x6b, 0x1,0x77,0x31, 0x2,0x62,0x7a, 0x1,0x77,0x2f, 0x1,0x77,0x32, 0x2,0x66,0x60, 0x2,0x63,0x21, 0x3,0x66,0x3e, 0x1,0x78,0x6d, 0x3,0x5a,0x7e, 0x2,0x66,0x58, 0x2,0x66,0x5c, 0x2,0x66,0x54, 0x2,0x66,0x57, 0x3,0x5a,0x7d, 0x2,0x66,0x5f, 0x1,0x78,0x6b, 0x2,0x66,0x64, 0x2,0x66,0x5d, 0x4,0x60,0x7a, 0x2,0x66,0x55, 0x2,0x66,0x65, 0x2,0x66,0x5e, 0x1,0x78,0x6e, 0x1,0x78,0x6f, 0x2,0x66,0x62, 0x3,0x5b,0x22, 0x2,0x66,0x56, 0x1,0x78,0x6a, 0x1,0x78,0x6c, 0x2,0x66,0x51, 0x2,0x66,0x59, 0x2,0x66,0x53, 0x3,0x5c,0x7b, 0x2,0x66,0x63, 0x2,0x66,0x61, 0x2,0x66,0x52, 0x2,0x66,0x5a, 0x4,0x60,0x7b, 0x3,0x5b,0x25, 0x3,0x66,0x3f, 0x2,0x69,0x6a, 0x1,0x78,0x70, 0x2,0x66,0x5b, 0x1,0x7a,0x32, 0x1,0x7a,0x34, 0x1,0x7a,0x31, 0x3,0x5c,0x76, 0x2,0x69,0x6f, 0x2,0x69,0x67, 0x2,0x69,0x65, 0x2,0x69,0x69, 0x2,0x69,0x66, 0x3,0x5c,0x78, 0x3,0x5c,0x7c, 0x2,0x69,0x6b, 0x2,0x69,0x6d, 0x1,0x7a,0x35, 0x1,0x7a,0x37, 0x3,0x5d,0x22, 0x2,0x69,0x6c, 0x1,0x7a,0x38, 0x1,0x7a,0x36, 0x2,0x69,0x6e, 0x3,0x5c,0x7e, 0x4,0x64,0x37, 0x3,0x5d,0x23, 0x3,0x5c,0x77, 0x1,0x7a,0x33, 0x3,0x5d,0x21, 0x3,0x5e,0x5b, 0x3,0x5e,0x5a, 0x1,0x7b,0x21, 0x2,0x6c,0x21, 0x2,0x6c,0x27, 0x1,0x7b,0x23, 0x2,0x69,0x68, 0x2,0x6c,0x26, 0x3,0x5e,0x5c, 0x2,0x6c,0x2d, 0x2,0x6c,0x24, 0x2,0x6c,0x2b, 0x2,0x6c,0x2a, 0x2,0x69,0x64, 0x2,0x6c,0x25, 0x2,0x63,0x22, 0x2,0x6c,0x2e, 0x2,0x6c,0x23, 0x2,0x6c,0x28, 0x3,0x5e,0x58, 0x2,0x6c,0x2c, 0x2,0x6c,0x22, 0x3,0x5e,0x56, 0x2,0x6d,0x77, 0x1,0x7b,0x22, 0x2,0x6c,0x29, 0x3,0x5e,0x57, 0x2,0x6f,0x43, 0x2,0x6d,0x78, 0x2,0x6d,0x76, 0x2,0x6d,0x74, 0x2,0x6d,0x75, 0x2,0x6d,0x79, 0x3,0x66,0x40, 0x1,0x7c,0x45, 0x2,0x6f,0x41, 0x2,0x6f,0x3f, 0x2,0x6f,0x44, 0x2,0x6f,0x42, 0x3,0x60,0x43, 0x2,0x6f,0x45, 0x1,0x7c,0x46, 0x2,0x6f,0x40, 0x3,0x60,0x2f, 0x3,0x61,0x46, 0x2,0x70,0x4a, 0x3,0x66,0x41, 0x2,0x71,0x34, 0x2,0x71,0x35, 0x2,0x71,0x36, 0x3,0x61,0x47, 0x3,0x61,0x7c, 0x2,0x72,0x35, 0x2,0x72,0x2d, 0x2,0x22,0x6f, 0x1,0x4f,0x4d, 0x1,0x53,0x4b, 0x4,0x2f,0x68, 0x2,0x32,0x5a, 0x2,0x32,0x59, 0x1,0x58,0x25, 0x1,0x5d,0x28, 0x2,0x39,0x21, 0x3,0x38,0x63, 0x3,0x38,0x60, 0x2,0x38,0x7e, 0x3,0x38,0x61, 0x1,0x61,0x70, 0x1,0x66,0x3f, 0x3,0x3e,0x61, 0x1,0x66,0x3e, 0x1,0x66,0x40, 0x5,0x49,0x4e, 0x2,0x4d,0x5b, 0x2,0x53,0x67, 0x2,0x5a,0x25, 0x2,0x5a,0x27, 0x2,0x5a,0x26, 0x7,0x32,0x61, 0x1,0x75,0x36, 0x2,0x5f,0x25, 0x2,0x63,0x26, 0x2,0x71,0x73, 0x1,0x48,0x65, 0x3,0x27,0x2d, 0x2,0x28,0x69, 0x2,0x28,0x6a, 0x2,0x28,0x68, 0x2,0x28,0x67, 0x1,0x4f,0x4e, 0x3,0x66,0x42, 0x2,0x2d,0x4a, 0x2,0x2d,0x48, 0x3,0x2f,0x23, 0x3,0x2e,0x7c, 0x2,0x2d,0x47, 0x3,0x2e,0x7e, 0x1,0x53,0x4c, 0x1,0x53,0x4e, 0x1,0x53,0x4d, 0x2,0x2d,0x49, 0x3,0x2f,0x24, 0xf,0x2d,0x3e, 0x3,0x33,0x69, 0x2,0x32,0x66, 0x2,0x32,0x63, 0x2,0x32,0x61, 0x4,0x2f,0x6d, 0x3,0x33,0x6c, 0x1,0x58,0x26, 0x2,0x32,0x64, 0x1,0x58,0x2b, 0x2,0x32,0x5e, 0x2,0x32,0x6d, 0x3,0x33,0x6f, 0x2,0x32,0x6f, 0x2,0x32,0x5f, 0x3,0x33,0x6e, 0x1,0x58,0x28, 0x2,0x32,0x70, 0x2,0x32,0x6b, 0x2,0x32,0x5d, 0x2,0x32,0x62, 0x2,0x32,0x6c, 0x2,0x32,0x68, 0x2,0x32,0x65, 0x3,0x33,0x6b, 0x1,0x58,0x2d, 0x2,0x32,0x6e, 0x2,0x32,0x60, 0x3,0x33,0x6a, 0x3,0x33,0x70, 0x2,0x32,0x69, 0x2,0x32,0x5b, 0x1,0x58,0x2c, 0x1,0x58,0x29, 0x2,0x32,0x67, 0x3,0x33,0x6d, 0x2,0x32,0x6a, 0x2,0x32,0x5c, 0x1,0x58,0x2a, 0x1,0x58,0x27, 0x4,0x34,0x7a, 0x3,0x38,0x66, 0x1,0x5d,0x32, 0x2,0x39,0x28, 0x1,0x5d,0x31, 0x3,0x38,0x64, 0x2,0x39,0x2b, 0x2,0x39,0x2e, 0x1,0x5d,0x2e, 0x1,0x5d,0x2c, 0x2,0x39,0x23, 0x2,0x39,0x2c, 0x2,0x39,0x2a, 0x2,0x39,0x27, 0x2,0x39,0x2f, 0x2,0x39,0x30, 0x2,0x39,0x32, 0x2,0x39,0x33, 0x2,0x39,0x22, 0x1,0x5d,0x2b, 0x2,0x39,0x25, 0x2,0x39,0x24, 0x2,0x39,0x31, 0x1,0x5d,0x2d, 0x2,0x39,0x26, 0x1,0x5d,0x2f, 0x1,0x5d,0x2a, 0x2,0x39,0x29, 0x1,0x5d,0x33, 0x4,0x35,0x26, 0x1,0x5d,0x30, 0x2,0x39,0x2d, 0xf,0x38,0x3a, 0x1,0x61,0x77, 0x2,0x40,0x25, 0x4,0x3a,0x71, 0x2,0x3f,0x78, 0x1,0x61,0x74, 0x3,0x3e,0x62, 0x2,0x47,0x2e, 0x2,0x40,0x23, 0x2,0x3f,0x75, 0x1,0x61,0x72, 0x2,0x3f,0x7a, 0x1,0x61,0x75, 0x2,0x3f,0x7e, 0x2,0x3f,0x7c, 0x1,0x61,0x78, 0x1,0x61,0x71, 0x4,0x3a,0x76, 0x3,0x3e,0x63, 0x2,0x3f,0x76, 0x2,0x3f,0x79, 0x1,0x61,0x76, 0x4,0x3a,0x6f, 0x2,0x3f,0x77, 0x5,0x3b,0x7b, 0x2,0x40,0x24, 0x2,0x40,0x22, 0x2,0x3f,0x7b, 0x2,0x3f,0x7d, 0x2,0x40,0x21, 0x1,0x61,0x73, 0x3,0x3e,0x68, 0x2,0x47,0x2f, 0x2,0x47,0x35, 0x2,0x47,0x2b, 0x2,0x47,0x31, 0x1,0x66,0x41, 0x2,0x47,0x2d, 0x1,0x66,0x47, 0x3,0x44,0x44, 0x3,0x44,0x45, 0x1,0x66,0x46, 0x3,0x44,0x49, 0x1,0x66,0x45, 0x2,0x47,0x34, 0x1,0x66,0x48, 0x1,0x66,0x49, 0x2,0x47,0x2a, 0x2,0x47,0x37, 0x1,0x66,0x4a, 0x1,0x66,0x44, 0x1,0x66,0x43, 0x2,0x47,0x33, 0x1,0x66,0x4b, 0x2,0x47,0x29, 0x2,0x47,0x2c, 0x2,0x47,0x36, 0x2,0x47,0x32, 0x4,0x40,0x59, 0x4,0x40,0x52, 0x2,0x4d,0x7b, 0x2,0x4d,0x70, 0x1,0x66,0x42, 0x5,0x42,0x5d, 0x3,0x44,0x46, 0x3,0x44,0x48, 0x1,0x6a,0x72, 0x2,0x4d,0x64, 0x2,0x4d,0x79, 0x2,0x4d,0x65, 0x1,0x6a,0x6d, 0x3,0x49,0x4f, 0x2,0x4d,0x62, 0x4,0x40,0x55, 0x2,0x4d,0x6b, 0x2,0x4d,0x63, 0x1,0x6a,0x6f, 0x2,0x4d,0x5d, 0x2,0x4d,0x78, 0x1,0x6a,0x70, 0x2,0x4d,0x75, 0x2,0x4d,0x76, 0x2,0x4d,0x5e, 0x1,0x6a,0x75, 0x2,0x4d,0x6d, 0x3,0x49,0x4a, 0x2,0x4d,0x67, 0x2,0x4d,0x6e, 0x2,0x4d,0x61, 0x4,0x46,0x7e, 0x2,0x4d,0x7a, 0x2,0x4d,0x72, 0x2,0x4d,0x6c, 0x2,0x4d,0x5c, 0x1,0x6a,0x71, 0x2,0x4d,0x73, 0x3,0x49,0x45, 0x1,0x6a,0x74, 0x2,0x4d,0x77, 0x3,0x49,0x4c, 0x2,0x4d,0x71, 0x1,0x6a,0x6e, 0x2,0x4d,0x6f, 0x3,0x49,0x49, 0x2,0x4d,0x69, 0x1,0x6a,0x6c, 0x2,0x4d,0x60, 0x2,0x4d,0x68, 0x2,0x4d,0x74, 0x2,0x4d,0x66, 0xf,0x4c,0x33, 0x3,0x49,0x4e, 0x2,0x4d,0x6a, 0x3,0x49,0x4b, 0x3,0x66,0x43, 0x1,0x6e,0x6a, 0x2,0x47,0x30, 0x2,0x53,0x79, 0x2,0x54,0x24, 0x2,0x53,0x78, 0x2,0x53,0x74, 0x2,0x53,0x71, 0x1,0x6e,0x6b, 0x2,0x53,0x6f, 0x1,0x6a,0x73, 0x2,0x53,0x68, 0x1,0x6e,0x69, 0x2,0x53,0x6e, 0x1,0x6e,0x68, 0x2,0x53,0x73, 0x2,0x53,0x70, 0x2,0x54,0x22, 0x2,0x53,0x7b, 0x2,0x53,0x75, 0x2,0x53,0x7a, 0x1,0x6e,0x64, 0x2,0x53,0x72, 0x2,0x54,0x27, 0x2,0x53,0x69, 0x2,0x53,0x6a, 0x2,0x54,0x23, 0x1,0x6e,0x65, 0x2,0x54,0x28, 0x1,0x6e,0x67, 0x2,0x54,0x29, 0x2,0x53,0x77, 0x2,0x4d,0x5f, 0x2,0x53,0x7d, 0x2,0x53,0x76, 0x2,0x54,0x21, 0x2,0x53,0x7c, 0x5,0x50,0x55, 0x3,0x4e,0x5d, 0x4,0x4d,0x28, 0x2,0x53,0x6d, 0x1,0x6e,0x62, 0x2,0x54,0x26, 0x1,0x6e,0x63, 0x2,0x53,0x6b, 0x1,0x6e,0x66, 0x2,0x5a,0x32, 0x2,0x53,0x7e, 0x2,0x54,0x25, 0x4,0x4d,0x31, 0x3,0x4e,0x59, 0x2,0x5a,0x2f, 0x1,0x6e,0x61, 0x1,0x72,0x2a, 0x2,0x5a,0x39, 0x2,0x5a,0x35, 0x4,0x53,0x3c, 0x2,0x5a,0x33, 0x2,0x5a,0x2e, 0x2,0x5a,0x3d, 0x3,0x52,0x5b, 0x3,0x52,0x5d, 0x4,0x53,0x44, 0x1,0x72,0x2e, 0x3,0x52,0x5f, 0x2,0x5a,0x2a, 0x2,0x5a,0x36, 0x2,0x5a,0x37, 0x2,0x5a,0x2d, 0x2,0x5a,0x2c, 0x2,0x5a,0x3a, 0x4,0x53,0x41, 0x2,0x5a,0x30, 0x2,0x5a,0x2b, 0x2,0x5a,0x31, 0x3,0x52,0x62, 0x2,0x5a,0x3c, 0x2,0x5a,0x29, 0x2,0x5a,0x3b, 0x2,0x5a,0x38, 0x1,0x72,0x2c, 0x1,0x72,0x2b, 0x4,0x53,0x39, 0x3,0x52,0x5e, 0x1,0x72,0x2d, 0x2,0x5a,0x34, 0x2,0x5a,0x28, 0x3,0x66,0x45, 0x3,0x66,0x44, 0x2,0x5f,0x27, 0x1,0x75,0x3c, 0x2,0x5f,0x2b, 0x2,0x5f,0x28, 0x2,0x5f,0x2f, 0x2,0x5f,0x35, 0x2,0x5f,0x2a, 0x3,0x56,0x3a, 0x2,0x5f,0x3e, 0x1,0x75,0x39, 0x2,0x5f,0x38, 0x2,0x5f,0x2d, 0x2,0x5f,0x39, 0x2,0x5f,0x34, 0x2,0x5f,0x3b, 0x2,0x5f,0x2c, 0x1,0x75,0x3e, 0x1,0x75,0x3d, 0x2,0x5f,0x2e, 0x2,0x5f,0x3c, 0x2,0x5f,0x26, 0x2,0x5f,0x3a, 0x1,0x75,0x37, 0x3,0x56,0x39, 0x2,0x5f,0x32, 0x2,0x5f,0x31, 0x2,0x5f,0x36, 0x2,0x5f,0x29, 0x1,0x75,0x3b, 0x3,0x56,0x3b, 0x1,0x75,0x3f, 0x2,0x5f,0x30, 0x2,0x5f,0x37, 0x1,0x75,0x40, 0x2,0x5f,0x33, 0x3,0x56,0x36, 0x3,0x56,0x34, 0x1,0x75,0x38, 0x1,0x75,0x3a, 0x2,0x63,0x33, 0x2,0x63,0x31, 0x3,0x5b,0x28, 0x3,0x58,0x76, 0x2,0x63,0x37, 0x2,0x63,0x35, 0x2,0x63,0x38, 0x3,0x58,0x78, 0x2,0x63,0x2a, 0x2,0x63,0x32, 0x2,0x63,0x3c, 0x2,0x5f,0x3d, 0x2,0x63,0x2e, 0x1,0x77,0x3a, 0x2,0x53,0x6c, 0x2,0x63,0x29, 0x2,0x63,0x36, 0x2,0x63,0x30, 0x2,0x63,0x2d, 0x2,0x63,0x28, 0x2,0x63,0x27, 0x2,0x63,0x3b, 0x3,0x58,0x73, 0x2,0x63,0x2c, 0x2,0x63,0x2b, 0x1,0x77,0x38, 0x2,0x63,0x34, 0x3,0x58,0x74, 0x1,0x77,0x37, 0x3,0x58,0x75, 0x5,0x64,0x48, 0x1,0x77,0x39, 0x2,0x63,0x2f, 0x2,0x63,0x3a, 0x3,0x66,0x46, 0x2,0x66,0x69, 0x2,0x66,0x6a, 0x3,0x5b,0x2c, 0x1,0x78,0x74, 0x2,0x66,0x67, 0x1,0x78,0x71, 0x2,0x66,0x6f, 0x3,0x5b,0x27, 0x1,0x78,0x75, 0x2,0x66,0x71, 0x2,0x66,0x66, 0x2,0x63,0x39, 0x2,0x66,0x73, 0x2,0x66,0x68, 0x5,0x69,0x43, 0x1,0x78,0x72, 0x2,0x66,0x6e, 0x3,0x5b,0x29, 0x2,0x66,0x70, 0x2,0x66,0x6b, 0x2,0x66,0x72, 0x2,0x66,0x6d, 0x2,0x66,0x6c, 0x1,0x78,0x73, 0x3,0x58,0x77, 0x3,0x5b,0x2b, 0x2,0x69,0x71, 0x2,0x69,0x72, 0x3,0x5d,0x25, 0x2,0x69,0x74, 0x1,0x7a,0x39, 0x1,0x7a,0x3a, 0x2,0x69,0x75, 0x2,0x69,0x73, 0x3,0x5d,0x24, 0x2,0x69,0x70, 0x3,0x5e,0x5d, 0x2,0x6c,0x31, 0x2,0x6c,0x34, 0x2,0x6c,0x30, 0x4,0x61,0x26, 0x1,0x7b,0x27, 0x2,0x6c,0x32, 0x1,0x7b,0x26, 0x1,0x7b,0x25, 0x1,0x7b,0x24, 0x2,0x6c,0x33, 0x2,0x6d,0x7e, 0x2,0x6d,0x7c, 0x3,0x5f,0x5f, 0x2,0x6d,0x7b, 0x2,0x6c,0x2f, 0x2,0x6d,0x7d, 0x2,0x6c,0x35, 0x2,0x6d,0x7a, 0x3,0x60,0x45, 0x2,0x6f,0x48, 0x2,0x6f,0x26, 0x2,0x6f,0x46, 0x1,0x7c,0x47, 0x2,0x6f,0x47, 0x2,0x6f,0x49, 0x3,0x66,0x47, 0x2,0x70,0x4d, 0x1,0x7c,0x66, 0x2,0x70,0x4c, 0x2,0x70,0x4b, 0x1,0x7c,0x67, 0x4,0x6c,0x23, 0x1,0x7d,0x27, 0x2,0x71,0x5d, 0x2,0x71,0x75, 0x2,0x71,0x74, 0x2,0x71,0x76, 0x1,0x48,0x66, 0x2,0x2d,0x4b, 0x3,0x2f,0x26, 0x2,0x32,0x71, 0x2,0x32,0x72, 0x3,0x38,0x6a, 0x3,0x3e,0x6a, 0x3,0x3e,0x69, 0x2,0x40,0x26, 0x6,0x4e,0x4f, 0x2,0x6c,0x36, 0x2,0x70,0x4e, 0x1,0x48,0x67, 0x1,0x53,0x4f, 0x2,0x2d,0x4c, 0x3,0x33,0x71, 0x3,0x66,0x48, 0x4,0x35,0x27, 0x2,0x39,0x34, 0x1,0x5d,0x34, 0x2,0x40,0x28, 0x2,0x40,0x27, 0x1,0x61,0x79, 0x3,0x44,0x4d, 0x1,0x66,0x4c, 0x2,0x54,0x2a, 0x1,0x6e,0x6c, 0x3,0x4e,0x5f, 0x1,0x6e,0x6d, 0x3,0x52,0x63, 0x3,0x52,0x64, 0x4,0x53,0x4b, 0x1,0x72,0x2f, 0x1,0x7c,0x68, 0x1,0x48,0x68, 0x3,0x2f,0x27, 0x2,0x2d,0x4d, 0x1,0x4f,0x50, 0x2,0x2d,0x4f, 0x2,0x2d,0x4e, 0x1,0x53,0x50, 0x2,0x32,0x73, 0x3,0x33,0x74, 0x2,0x32,0x7a, 0x1,0x58,0x2e, 0x2,0x32,0x78, 0x2,0x32,0x76, 0x3,0x33,0x77, 0x2,0x32,0x7d, 0x2,0x32,0x74, 0x2,0x32,0x75, 0x1,0x58,0x2f, 0x3,0x33,0x72, 0x1,0x58,0x33, 0x3,0x33,0x73, 0x3,0x33,0x75, 0x2,0x32,0x7e, 0x1,0x58,0x32, 0x2,0x32,0x7c, 0x2,0x32,0x79, 0x2,0x32,0x77, 0x1,0x58,0x30, 0x1,0x58,0x31, 0x2,0x32,0x7b, 0x3,0x33,0x76, 0x3,0x66,0x49, 0x1,0x5d,0x36, 0x2,0x39,0x35, 0x3,0x38,0x72, 0x1,0x5d,0x3b, 0x2,0x39,0x45, 0x1,0x5d,0x3a, 0x2,0x39,0x47, 0x3,0x38,0x6e, 0x3,0x38,0x74, 0x2,0x39,0x3b, 0x1,0x5d,0x38, 0x2,0x39,0x46, 0x3,0x38,0x6c, 0x2,0x39,0x36, 0x1,0x5d,0x39, 0x2,0x39,0x42, 0x2,0x39,0x3e, 0x2,0x39,0x40, 0x2,0x39,0x3a, 0x2,0x39,0x41, 0x3,0x38,0x6b, 0x4,0x35,0x2f, 0x1,0x5d,0x35, 0x2,0x39,0x3d, 0x3,0x38,0x73, 0x2,0x39,0x3c, 0x2,0x39,0x38, 0x3,0x38,0x6d, 0x2,0x39,0x43, 0x3,0x38,0x6f, 0x3,0x38,0x71, 0x2,0x39,0x3f, 0x2,0x39,0x37, 0x3,0x38,0x70, 0x2,0x39,0x39, 0x1,0x5d,0x37, 0x2,0x39,0x44, 0x1,0x61,0x7c, 0x2,0x40,0x33, 0x4,0x3a,0x7b, 0x3,0x3e,0x70, 0x3,0x3e,0x72, 0x2,0x40,0x2f, 0x2,0x40,0x31, 0x2,0x40,0x2c, 0x2,0x40,0x2b, 0x2,0x40,0x29, 0x3,0x3e,0x6d, 0x2,0x40,0x30, 0x2,0x40,0x32, 0x2,0x40,0x2e, 0x3,0x3e,0x6f, 0x2,0x40,0x2d, 0x1,0x61,0x7a, 0x1,0x61,0x7b, 0x2,0x40,0x35, 0x1,0x66,0x54, 0x2,0x47,0x39, 0x2,0x47,0x3f, 0x2,0x47,0x3a, 0x2,0x47,0x3b, 0x3,0x44,0x4e, 0x2,0x47,0x40, 0x5,0x42,0x6c, 0x1,0x66,0x56, 0x4,0x40,0x61, 0x1,0x66,0x4e, 0x1,0x66,0x55, 0x2,0x47,0x38, 0x2,0x40,0x2a, 0x1,0x66,0x51, 0x1,0x66,0x4f, 0x2,0x47,0x3e, 0x2,0x47,0x3d, 0x1,0x66,0x50, 0x1,0x66,0x52, 0x2,0x47,0x3c, 0x1,0x66,0x4d, 0x3,0x44,0x4f, 0x1,0x66,0x53, 0x3,0x4e,0x60, 0x2,0x4d,0x7d, 0x1,0x6a,0x7c, 0x3,0x49,0x59, 0x3,0x49,0x52, 0x2,0x4e,0x2a, 0x2,0x4e,0x29, 0x3,0x49,0x57, 0x2,0x4e,0x24, 0x1,0x6a,0x7e, 0x2,0x4e,0x28, 0x2,0x4d,0x7e, 0x2,0x4e,0x21, 0x1,0x6a,0x76, 0x1,0x6a,0x78, 0x3,0x49,0x54, 0x2,0x4e,0x26, 0x2,0x4d,0x7c, 0x1,0x6a,0x7a, 0x1,0x6a,0x79, 0x2,0x4e,0x22, 0x2,0x4e,0x27, 0x2,0x4e,0x25, 0x1,0x6a,0x7b, 0x2,0x4e,0x23, 0x3,0x49,0x51, 0x3,0x49,0x56, 0x2,0x40,0x34, 0x1,0x6a,0x77, 0x3,0x49,0x58, 0x2,0x54,0x2b, 0x2,0x54,0x32, 0x1,0x6e,0x6f, 0x4,0x4d,0x46, 0x2,0x54,0x36, 0x1,0x6e,0x73, 0x2,0x54,0x2e, 0x2,0x54,0x2c, 0x4,0x4d,0x3e, 0x2,0x54,0x35, 0x3,0x4e,0x61, 0x1,0x6e,0x6e, 0x2,0x54,0x34, 0x1,0x6e,0x70, 0x1,0x6e,0x71, 0x2,0x54,0x2d, 0x1,0x6e,0x72, 0x2,0x54,0x33, 0x2,0x54,0x2f, 0x2,0x54,0x30, 0x2,0x54,0x31, 0x1,0x6a,0x7d, 0x3,0x4e,0x62, 0x2,0x5a,0x3e, 0x2,0x5a,0x4a, 0x4,0x53,0x53, 0x1,0x72,0x34, 0x2,0x5a,0x45, 0x2,0x5a,0x47, 0x3,0x52,0x65, 0x1,0x72,0x32, 0x2,0x5a,0x3f, 0x2,0x5a,0x43, 0x4,0x53,0x50, 0x2,0x5a,0x46, 0x1,0x72,0x30, 0x1,0x72,0x33, 0x2,0x5a,0x49, 0x2,0x5a,0x41, 0x2,0x5a,0x42, 0x2,0x5a,0x48, 0x2,0x5a,0x40, 0x2,0x5a,0x44, 0x1,0x72,0x31, 0x2,0x5f,0x40, 0x2,0x5f,0x3f, 0x1,0x75,0x42, 0x2,0x5f,0x45, 0x1,0x75,0x44, 0x3,0x56,0x40, 0x4,0x58,0x62, 0x1,0x75,0x41, 0x2,0x5f,0x41, 0x1,0x75,0x45, 0x2,0x5f,0x42, 0x3,0x56,0x3f, 0x3,0x56,0x3d, 0x2,0x5f,0x43, 0x2,0x5f,0x46, 0x3,0x56,0x42, 0x1,0x75,0x43, 0x2,0x63,0x41, 0x3,0x58,0x79, 0x2,0x63,0x44, 0x3,0x58,0x7a, 0x2,0x63,0x3e, 0x2,0x63,0x40, 0x3,0x58,0x7c, 0x3,0x58,0x7b, 0x2,0x63,0x3f, 0x2,0x63,0x42, 0x2,0x63,0x43, 0x2,0x5f,0x44, 0x2,0x63,0x3d, 0x3,0x66,0x4a, 0x1,0x78,0x78, 0x2,0x66,0x77, 0x2,0x66,0x7a, 0x2,0x66,0x7c, 0x2,0x66,0x75, 0x2,0x66,0x76, 0x2,0x66,0x79, 0x2,0x66,0x7b, 0x1,0x78,0x79, 0x1,0x78,0x77, 0x1,0x78,0x76, 0x2,0x66,0x78, 0x2,0x66,0x74, 0x2,0x69,0x76, 0x1,0x7a,0x3b, 0x3,0x5d,0x29, 0x2,0x69,0x77, 0x3,0x5d,0x28, 0x2,0x6c,0x38, 0x1,0x7b,0x28, 0x2,0x6c,0x3a, 0x1,0x7b,0x29, 0x2,0x6c,0x37, 0x2,0x6c,0x39, 0x1,0x7b,0x72, 0x5,0x74,0x38, 0x2,0x6e,0x21, 0x1,0x7b,0x71, 0x2,0x6f,0x4c, 0x2,0x6f,0x4b, 0x4,0x6c,0x25, 0x2,0x6f,0x4a, 0xf,0x68,0x4a, 0x3,0x61,0x49, 0x2,0x71,0x37, 0x2,0x71,0x38, 0x2,0x71,0x3a, 0x2,0x71,0x39, 0x3,0x61,0x7d, 0x2,0x22,0x70, 0x1,0x48,0x69, 0x1,0x53,0x51, 0x2,0x39,0x48, 0x1,0x61,0x7d, 0x3,0x66,0x4b, 0x2,0x47,0x41, 0x1,0x77,0x3b, 0x3,0x5b,0x2f, 0x2,0x66,0x7d, 0x3,0x60,0x46, 0x3,0x61,0x4a, 0x1,0x4b,0x44, 0x3,0x2f,0x29, 0x4,0x2f,0x76, 0x4,0x2f,0x75, 0x1,0x5d,0x3d, 0x4,0x35,0x34, 0x3,0x38,0x76, 0x3,0x38,0x75, 0x1,0x5d,0x3c, 0x3,0x38,0x77, 0x2,0x40,0x36, 0x1,0x61,0x7e, 0x2,0x40,0x38, 0x2,0x40,0x37, 0x6,0x4e,0x60, 0x3,0x3e,0x74, 0x2,0x47,0x42, 0x1,0x66,0x57, 0x2,0x4e,0x2b, 0x2,0x4e,0x2e, 0x2,0x4e,0x2d, 0x4,0x47,0x35, 0x2,0x4e,0x2c, 0x2,0x54,0x37, 0x2,0x54,0x39, 0x2,0x54,0x38, 0x3,0x4e,0x65, 0x1,0x72,0x36, 0x3,0x52,0x66, 0x4,0x53,0x59, 0x3,0x4e,0x64, 0x1,0x72,0x35, 0x3,0x56,0x46, 0x1,0x75,0x46, 0x2,0x5f,0x47, 0x2,0x5f,0x49, 0x2,0x5f,0x48, 0x3,0x58,0x7e, 0x3,0x58,0x7d, 0x1,0x77,0x3c, 0x3,0x59,0x21, 0x4,0x61,0x2f, 0x3,0x5b,0x31, 0x2,0x67,0x21, 0x2,0x66,0x7e, 0xf,0x63,0x77, 0x2,0x69,0x78, 0x1,0x7a,0x3c, 0x3,0x5d,0x2a, 0x3,0x5e,0x61, 0x1,0x7b,0x2a, 0x2,0x6e,0x23, 0x2,0x6e,0x22, 0x1,0x7d,0x28, 0x1,0x4b,0x45, 0x2,0x2d,0x50, 0x1,0x53,0x52, 0x2,0x39,0x4b, 0x2,0x39,0x49, 0x4,0x35,0x39, 0x4,0x35,0x38, 0x2,0x39,0x4a, 0x2,0x40,0x3a, 0x2,0x40,0x3b, 0x2,0x47,0x49, 0x2,0x40,0x39, 0x2,0x47,0x43, 0x2,0x47,0x47, 0x2,0x47,0x46, 0x2,0x47,0x48, 0x1,0x66,0x58, 0x2,0x47,0x45, 0x2,0x47,0x44, 0x2,0x47,0x4a, 0x3,0x44,0x54, 0x2,0x4e,0x31, 0x2,0x4e,0x2f, 0x3,0x49,0x5c, 0x2,0x4e,0x30, 0x2,0x54,0x3c, 0x2,0x54,0x3a, 0x3,0x4e,0x66, 0x2,0x54,0x3b, 0x2,0x5a,0x4b, 0x2,0x5f,0x4a, 0x2,0x5f,0x4b, 0x1,0x77,0x3d, 0x3,0x5b,0x32, 0x2,0x67,0x22, 0x2,0x69,0x79, 0x1,0x7a,0x3d, 0x4,0x61,0x37, 0x2,0x6c,0x3b, 0x2,0x6e,0x24, 0x1,0x7b,0x73, 0x4,0x69,0x45, 0x2,0x6f,0x4d, 0x2,0x71,0x3b, 0x1,0x4b,0x46, 0x1,0x53,0x54, 0x1,0x53,0x55, 0x2,0x2d,0x51, 0x3,0x2f,0x2a, 0x3,0x2f,0x2c, 0x2,0x2d,0x52, 0x1,0x53,0x53, 0x4,0x2f,0x7c, 0x1,0x58,0x39, 0x3,0x33,0x7b, 0x1,0x58,0x37, 0x3,0x33,0x7a, 0x1,0x58,0x36, 0x1,0x58,0x3d, 0x1,0x58,0x35, 0x1,0x58,0x3e, 0x2,0x33,0x21, 0x1,0x58,0x3b, 0x4,0x2f,0x7d, 0x1,0x58,0x38, 0x1,0x58,0x3c, 0x1,0x58,0x3a, 0x1,0x58,0x34, 0x3,0x33,0x7c, 0x1,0x5d,0x45, 0x3,0x38,0x7e, 0x1,0x5d,0x3f, 0x2,0x39,0x4f, 0x1,0x5d,0x44, 0x3,0x39,0x23, 0x3,0x39,0x29, 0x1,0x5d,0x46, 0x1,0x5d,0x40, 0x6,0x44,0x70, 0x1,0x5d,0x41, 0x3,0x38,0x79, 0x2,0x39,0x4d, 0x3,0x38,0x7b, 0x3,0x39,0x25, 0x1,0x5d,0x3e, 0x3,0x39,0x22, 0x2,0x39,0x4e, 0x1,0x5d,0x43, 0x4,0x35,0x3d, 0x5,0x35,0x5b, 0x2,0x39,0x4c, 0x1,0x5d,0x42, 0x3,0x38,0x7a, 0x1,0x62,0x2b, 0x3,0x3e,0x7c, 0x1,0x62,0x2d, 0x4,0x3b,0x2f, 0x3,0x3e,0x7d, 0x2,0x40,0x3e, 0x1,0x62,0x2c, 0x1,0x62,0x21, 0x1,0x62,0x25, 0x3,0x3f,0x24, 0x1,0x66,0x6b, 0x2,0x47,0x4f, 0x2,0x40,0x40, 0x1,0x62,0x26, 0x3,0x3e,0x7e, 0x3,0x3e,0x75, 0x2,0x40,0x43, 0x2,0x40,0x44, 0x1,0x62,0x2a, 0x4,0x3b,0x30, 0x2,0x40,0x46, 0x3,0x3f,0x21, 0x2,0x40,0x48, 0x3,0x3f,0x23, 0x2,0x40,0x49, 0x2,0x40,0x3d, 0x2,0x40,0x3c, 0x2,0x40,0x4a, 0x1,0x62,0x29, 0x2,0x40,0x47, 0x2,0x40,0x45, 0x4,0x3b,0x2c, 0x1,0x62,0x27, 0x1,0x62,0x23, 0x1,0x62,0x2e, 0x2,0x40,0x41, 0x2,0x40,0x42, 0x2,0x40,0x3f, 0x3,0x3e,0x78, 0x1,0x62,0x28, 0x4,0x3b,0x31, 0x3,0x3f,0x22, 0x1,0x62,0x24, 0x1,0x62,0x22, 0x2,0x47,0x4e, 0x1,0x66,0x66, 0x1,0x66,0x61, 0x3,0x44,0x60, 0x3,0x44,0x59, 0x1,0x66,0x5c, 0x3,0x44,0x63, 0x1,0x66,0x6c, 0x1,0x66,0x5d, 0x3,0x44,0x55, 0x1,0x66,0x59, 0x1,0x66,0x68, 0x1,0x66,0x65, 0x1,0x66,0x67, 0x3,0x44,0x58, 0x1,0x66,0x5e, 0x1,0x66,0x63, 0x1,0x66,0x5a, 0x1,0x66,0x5b, 0x2,0x47,0x56, 0x2,0x47,0x53, 0x2,0x47,0x4b, 0x2,0x47,0x50, 0x3,0x44,0x5b, 0x1,0x66,0x69, 0x2,0x47,0x57, 0x1,0x66,0x6a, 0x1,0x66,0x60, 0x3,0x44,0x5c, 0x3,0x44,0x61, 0x2,0x47,0x4d, 0x3,0x44,0x56, 0x2,0x47,0x55, 0x2,0x47,0x51, 0x2,0x47,0x54, 0x2,0x47,0x52, 0x1,0x66,0x64, 0x2,0x47,0x4c, 0x1,0x66,0x5f, 0x3,0x44,0x5d, 0x2,0x4e,0x34, 0x1,0x6b,0x22, 0x1,0x6b,0x25, 0x3,0x49,0x5f, 0x2,0x4e,0x36, 0x3,0x49,0x64, 0x1,0x6b,0x2d, 0x2,0x4e,0x35, 0x1,0x6b,0x27, 0x3,0x49,0x63, 0x1,0x6e,0x78, 0x2,0x4e,0x37, 0x4,0x47,0x45, 0x1,0x6b,0x2c, 0x2,0x4e,0x33, 0x1,0x6b,0x2e, 0x3,0x49,0x5e, 0x3,0x49,0x62, 0x3,0x49,0x6b, 0x1,0x6b,0x23, 0x3,0x49,0x68, 0x1,0x66,0x62, 0x1,0x6b,0x26, 0x3,0x49,0x60, 0x1,0x6b,0x24, 0x1,0x6b,0x28, 0x1,0x6b,0x2a, 0x1,0x6b,0x21, 0x1,0x6b,0x2f, 0x1,0x6b,0x2b, 0x3,0x49,0x65, 0x1,0x6b,0x29, 0x2,0x4e,0x32, 0x3,0x49,0x66, 0xf,0x4c,0x41, 0x3,0x4e,0x74, 0x1,0x6f,0x21, 0x3,0x4e,0x67, 0x1,0x6e,0x7b, 0x3,0x4e,0x72, 0x3,0x4e,0x70, 0x3,0x4e,0x6e, 0x1,0x6f,0x24, 0x3,0x4e,0x6c, 0x2,0x54,0x3f, 0x1,0x6f,0x25, 0x2,0x54,0x4b, 0x2,0x54,0x44, 0x1,0x6e,0x74, 0x2,0x54,0x4c, 0x2,0x54,0x46, 0x1,0x6e,0x7e, 0x2,0x54,0x47, 0x3,0x4e,0x73, 0x1,0x6e,0x7d, 0x2,0x54,0x4a, 0x1,0x6e,0x77, 0x2,0x54,0x48, 0x2,0x54,0x3e, 0x1,0x6e,0x76, 0x2,0x5a,0x56, 0x1,0x6e,0x7c, 0x3,0x4e,0x75, 0x1,0x6e,0x79, 0x3,0x4e,0x69, 0x1,0x6f,0x23, 0x3,0x4e,0x6a, 0x2,0x54,0x3d, 0x3,0x4e,0x76, 0x2,0x54,0x41, 0x1,0x6e,0x75, 0x2,0x54,0x40, 0x2,0x54,0x42, 0x2,0x54,0x43, 0x1,0x6f,0x22, 0x2,0x54,0x45, 0x2,0x54,0x49, 0x2,0x54,0x4d, 0x1,0x6f,0x26, 0x1,0x72,0x3c, 0x2,0x5a,0x51, 0x2,0x5a,0x57, 0x2,0x5a,0x54, 0x2,0x5a,0x4c, 0x2,0x5a,0x58, 0x2,0x5a,0x4d, 0x3,0x52,0x6a, 0x2,0x5a,0x53, 0x3,0x52,0x6b, 0x1,0x72,0x37, 0x1,0x72,0x3d, 0x2,0x5a,0x59, 0x3,0x4e,0x6f, 0x3,0x52,0x67, 0x1,0x72,0x39, 0x3,0x52,0x6e, 0x1,0x72,0x43, 0x1,0x72,0x3e, 0x2,0x5a,0x5b, 0x2,0x5a,0x55, 0x1,0x72,0x3a, 0x2,0x5a,0x4e, 0x1,0x72,0x44, 0x2,0x5a,0x4f, 0x2,0x5a,0x50, 0x1,0x72,0x45, 0x1,0x72,0x42, 0x1,0x6e,0x7a, 0x3,0x52,0x69, 0x1,0x72,0x38, 0x2,0x5a,0x5c, 0x1,0x72,0x46, 0x3,0x52,0x68, 0x1,0x72,0x3f, 0x2,0x5a,0x5a, 0x1,0x72,0x3b, 0x1,0x72,0x40, 0x1,0x72,0x41, 0x3,0x66,0x4c, 0x1,0x75,0x4e, 0x2,0x5f,0x50, 0x2,0x5f,0x59, 0x2,0x5f,0x56, 0x2,0x5f,0x58, 0x3,0x56,0x49, 0x1,0x75,0x4b, 0x2,0x5f,0x51, 0x3,0x56,0x4a, 0x2,0x5f,0x57, 0x1,0x75,0x47, 0x2,0x5f,0x53, 0x1,0x75,0x4f, 0x2,0x5f,0x4f, 0x2,0x5f,0x54, 0x2,0x5f,0x5b, 0x2,0x5a,0x52, 0x2,0x5f,0x55, 0x2,0x5f,0x4e, 0x1,0x75,0x48, 0x2,0x5f,0x4d, 0x1,0x75,0x49, 0x2,0x5f,0x5c, 0x1,0x75,0x4a, 0x2,0x5f,0x5a, 0x1,0x75,0x4d, 0x2,0x5f,0x4c, 0x3,0x56,0x48, 0x1,0x75,0x4c, 0x2,0x5f,0x52, 0x2,0x63,0x47, 0x2,0x63,0x55, 0x2,0x63,0x50, 0x2,0x63,0x52, 0x2,0x63,0x46, 0x1,0x77,0x3e, 0x3,0x59,0x2a, 0x2,0x63,0x45, 0x1,0x77,0x41, 0x1,0x77,0x40, 0x3,0x59,0x26, 0x2,0x63,0x54, 0x2,0x63,0x4c, 0x2,0x63,0x49, 0x2,0x63,0x4f, 0x3,0x59,0x24, 0x2,0x63,0x48, 0x3,0x59,0x28, 0x2,0x63,0x4a, 0x2,0x63,0x53, 0x2,0x63,0x51, 0x3,0x59,0x23, 0x1,0x77,0x3f, 0x2,0x63,0x58, 0x2,0x63,0x56, 0x2,0x63,0x4d, 0x2,0x63,0x57, 0x2,0x63,0x4e, 0x3,0x5b,0x34, 0x2,0x67,0x26, 0x1,0x78,0x7a, 0x2,0x67,0x2d, 0x3,0x5b,0x35, 0x4,0x61,0x3a, 0x2,0x6c,0x3e, 0x1,0x79,0x23, 0x2,0x63,0x4b, 0x2,0x67,0x24, 0x1,0x78,0x7d, 0x2,0x67,0x25, 0x2,0x67,0x2a, 0x3,0x5b,0x36, 0x3,0x5d,0x33, 0x1,0x79,0x21, 0x1,0x79,0x22, 0x2,0x67,0x23, 0x2,0x67,0x2c, 0x2,0x67,0x2e, 0x2,0x67,0x27, 0x2,0x67,0x29, 0x2,0x67,0x2b, 0x2,0x67,0x28, 0x2,0x67,0x2f, 0x1,0x78,0x7c, 0x1,0x79,0x24, 0x1,0x78,0x7e, 0x1,0x78,0x7b, 0x2,0x69,0x7c, 0x4,0x64,0x4d, 0x1,0x7a,0x42, 0x2,0x69,0x7a, 0x3,0x5d,0x30, 0x3,0x5d,0x2c, 0x2,0x69,0x7e, 0x3,0x5d,0x32, 0x2,0x6a,0x21, 0x1,0x7a,0x40, 0x2,0x6a,0x22, 0x2,0x69,0x7d, 0x3,0x5d,0x2b, 0x2,0x69,0x7b, 0x1,0x7a,0x43, 0x1,0x7a,0x3f, 0x2,0x6a,0x23, 0x3,0x5d,0x2e, 0x1,0x7a,0x41, 0x1,0x7a,0x3e, 0x3,0x5c,0x6d, 0x4,0x67,0x3b, 0x1,0x7b,0x2b, 0x3,0x5e,0x62, 0x4,0x67,0x41, 0x1,0x7b,0x2c, 0x2,0x6c,0x3d, 0x2,0x6c,0x3c, 0x2,0x6c,0x3f, 0x2,0x6c,0x40, 0x3,0x5e,0x63, 0x1,0x7b,0x2d, 0x2,0x6e,0x25, 0x2,0x6e,0x2a, 0x1,0x7b,0x74, 0x3,0x5f,0x61, 0x2,0x6e,0x27, 0x3,0x5f,0x62, 0x2,0x6e,0x26, 0x2,0x6e,0x29, 0x2,0x6e,0x28, 0x3,0x60,0x48, 0x2,0x6f,0x51, 0x4,0x6a,0x7c, 0x1,0x7c,0x48, 0x2,0x6f,0x50, 0x2,0x6f,0x4e, 0x3,0x60,0x47, 0x2,0x6f,0x4f, 0x3,0x60,0x49, 0x3,0x60,0x7b, 0x1,0x7c,0x6a, 0x1,0x7c,0x69, 0x2,0x70,0x4f, 0x2,0x70,0x50, 0x1,0x7c,0x6b, 0x3,0x61,0x4b, 0x2,0x71,0x3c, 0x2,0x71,0x3d, 0x1,0x7d,0x34, 0x3,0x61,0x6b, 0x1,0x7d,0x3a, 0x3,0x61,0x7e, 0x2,0x71,0x77, 0x2,0x72,0x36, 0x1,0x4b,0x47, 0x5,0x30,0x46, 0x2,0x39,0x50, 0x3,0x39,0x2a, 0x2,0x39,0x51, 0x2,0x47,0x58, 0x2,0x4e,0x38, 0x2,0x54,0x4e, 0x1,0x75,0x51, 0x3,0x56,0x4d, 0x1,0x75,0x50, 0x2,0x63,0x59, 0x2,0x67,0x30, 0x3,0x5f,0x64, 0x2,0x6f,0x52, 0x1,0x4b,0x48, 0x2,0x33,0x22, 0x1,0x58,0x3f, 0x1,0x5d,0x47, 0x2,0x47,0x5a, 0x2,0x47,0x59, 0x1,0x6f,0x27, 0x2,0x54,0x4f, 0x1,0x6f,0x28, 0x2,0x5f,0x5d, 0x1,0x77,0x42, 0x3,0x5d,0x34, 0x3,0x66,0x4d, 0x3,0x62,0x21, 0x1,0x7d,0x43, 0x1,0x4b,0x49, 0x2,0x28,0x6b, 0x2,0x33,0x23, 0x3,0x39,0x2d, 0x4,0x35,0x4d, 0x1,0x5d,0x48, 0x3,0x39,0x2c, 0x2,0x39,0x52, 0x2,0x39,0x53, 0x3,0x3f,0x2a, 0x2,0x40,0x4b, 0x3,0x3f,0x29, 0x1,0x62,0x2f, 0x1,0x66,0x6d, 0x3,0x44,0x64, 0x2,0x47,0x5c, 0x2,0x47,0x5b, 0x2,0x47,0x5d, 0x3,0x49,0x6d, 0x2,0x4e,0x39, 0x2,0x4e,0x3a, 0x1,0x6b,0x30, 0x1,0x72,0x47, 0x1,0x6f,0x29, 0x1,0x72,0x48, 0x2,0x5f,0x61, 0x2,0x5f,0x5e, 0x2,0x5f,0x60, 0x2,0x5f,0x5f, 0x1,0x75,0x52, 0x3,0x59,0x2b, 0x2,0x63,0x5a, 0x2,0x67,0x32, 0x2,0x67,0x31, 0x2,0x25,0x24, 0x1,0x58,0x41, 0x1,0x58,0x40, 0x2,0x33,0x24, 0x3,0x39,0x2e, 0x2,0x39,0x54, 0x3,0x3f,0x2c, 0x3,0x3f,0x2b, 0x2,0x40,0x4d, 0x2,0x40,0x4c, 0x1,0x62,0x30, 0x3,0x3f,0x2d, 0x2,0x47,0x5f, 0x2,0x47,0x60, 0x2,0x47,0x5e, 0x4,0x40,0x78, 0x3,0x44,0x65, 0x1,0x66,0x6f, 0x1,0x66,0x6e, 0x4,0x47,0x54, 0x1,0x6b,0x32, 0x1,0x6b,0x31, 0x3,0x4e,0x7a, 0x2,0x54,0x50, 0x2,0x5a,0x5f, 0x2,0x5a,0x5d, 0x2,0x5a,0x5e, 0x1,0x72,0x49, 0x2,0x5f,0x63, 0x2,0x5f,0x62, 0x3,0x56,0x4f, 0x2,0x63,0x5d, 0x2,0x63,0x5c, 0x2,0x63,0x5b, 0x2,0x67,0x33, 0x3,0x61,0x4d, 0x2,0x71,0x78, 0x1,0x4b,0x4a, 0x1,0x53,0x56, 0x3,0x2f,0x2e, 0x1,0x53,0x57, 0x1,0x58,0x42, 0x1,0x58,0x43, 0x2,0x33,0x26, 0x2,0x33,0x25, 0x2,0x39,0x55, 0x3,0x39,0x30, 0x1,0x5d,0x4e, 0x1,0x5d,0x4c, 0x1,0x5d,0x49, 0x1,0x5d,0x4d, 0x1,0x5d,0x4b, 0x1,0x5d,0x4a, 0x3,0x39,0x32, 0x3,0x39,0x31, 0x1,0x62,0x31, 0x2,0x40,0x50, 0x3,0x3f,0x2f, 0x1,0x66,0x74, 0x1,0x62,0x33, 0x1,0x62,0x38, 0x2,0x40,0x52, 0x1,0x62,0x3a, 0x1,0x62,0x39, 0x1,0x62,0x3c, 0x2,0x40,0x51, 0x2,0x40,0x4e, 0x1,0x62,0x36, 0x1,0x62,0x32, 0x1,0x62,0x34, 0x2,0x40,0x4f, 0x1,0x62,0x3b, 0x1,0x62,0x37, 0x1,0x62,0x35, 0x1,0x66,0x76, 0x1,0x66,0x75, 0x1,0x66,0x73, 0x1,0x66,0x77, 0x4,0x40,0x7e, 0x1,0x66,0x71, 0x1,0x66,0x72, 0x3,0x44,0x69, 0x1,0x66,0x70, 0x5,0x43,0x2d, 0x2,0x47,0x61, 0x3,0x44,0x67, 0x2,0x4e,0x3c, 0x3,0x49,0x70, 0x1,0x6b,0x34, 0x1,0x6b,0x35, 0x1,0x6b,0x33, 0x3,0x49,0x72, 0x2,0x4e,0x3b, 0x3,0x49,0x71, 0x2,0x4e,0x3d, 0x3,0x66,0x4e, 0x2,0x54,0x53, 0x2,0x54,0x55, 0x3,0x4e,0x7e, 0x1,0x6f,0x32, 0x2,0x54,0x56, 0x1,0x6f,0x2b, 0x2,0x54,0x52, 0x1,0x6f,0x2a, 0x1,0x6f,0x34, 0x1,0x6f,0x30, 0x1,0x6f,0x31, 0x1,0x6f,0x2d, 0x2,0x54,0x51, 0x1,0x6f,0x2c, 0x2,0x54,0x57, 0x2,0x54,0x54, 0x3,0x4e,0x7d, 0x1,0x6f,0x33, 0x3,0x4f,0x22, 0x1,0x6f,0x2e, 0x1,0x6f,0x2f, 0x2,0x5a,0x61, 0x3,0x52,0x75, 0x2,0x5a,0x63, 0x2,0x5a,0x62, 0x3,0x52,0x73, 0x2,0x5a,0x64, 0x1,0x72,0x4a, 0x2,0x5a,0x60, 0x3,0x56,0x51, 0x3,0x56,0x52, 0x1,0x75,0x56, 0x2,0x5f,0x64, 0x1,0x75,0x53, 0x1,0x75,0x57, 0x1,0x75,0x55, 0x1,0x75,0x54, 0x2,0x63,0x5e, 0x4,0x5d,0x69, 0x2,0x63,0x61, 0x7,0x43,0x52, 0x2,0x63,0x60, 0x3,0x59,0x2e, 0x2,0x63,0x5f, 0x1,0x77,0x43, 0x2,0x67,0x34, 0x2,0x67,0x35, 0x1,0x79,0x25, 0x2,0x67,0x36, 0x1,0x79,0x26, 0x3,0x5b,0x38, 0x3,0x66,0x4f, 0x1,0x7a,0x45, 0x4,0x64,0x4f, 0x1,0x7a,0x44, 0x2,0x6c,0x41, 0x3,0x5e,0x65, 0x3,0x5e,0x66, 0x1,0x7b,0x2e, 0x2,0x6c,0x42, 0x2,0x6e,0x2b, 0x1,0x7b,0x75, 0x1,0x7b,0x76, 0x3,0x66,0x50, 0x2,0x6f,0x53, 0x3,0x60,0x4a, 0x1,0x7c,0x6d, 0x3,0x61,0x4e, 0x1,0x4b,0x4b, 0x3,0x39,0x33, 0x1,0x5d,0x50, 0x1,0x5d,0x4f, 0x2,0x47,0x62, 0x2,0x47,0x63, 0x1,0x6b,0x36, 0x2,0x5a,0x65, 0x1,0x6f,0x35, 0x2,0x5a,0x66, 0x2,0x5f,0x65, 0x1,0x4b,0x4c, 0x3,0x24,0x3a, 0x2,0x2d,0x53, 0x1,0x53,0x59, 0x1,0x53,0x58, 0x2,0x33,0x27, 0x1,0x58,0x44, 0x2,0x33,0x28, 0x2,0x39,0x58, 0x3,0x39,0x39, 0x2,0x39,0x57, 0x3,0x39,0x37, 0x2,0x39,0x56, 0x3,0x39,0x35, 0x3,0x39,0x38, 0x2,0x40,0x54, 0x1,0x62,0x3f, 0x3,0x3f,0x39, 0x3,0x3f,0x34, 0x2,0x40,0x53, 0x1,0x62,0x3e, 0x3,0x3f,0x37, 0x3,0x3f,0x30, 0x3,0x3f,0x33, 0x2,0x40,0x55, 0x1,0x62,0x3d, 0x3,0x3f,0x38, 0x2,0x47,0x65, 0x2,0x47,0x68, 0x2,0x47,0x66, 0x2,0x47,0x67, 0x2,0x47,0x6b, 0x2,0x47,0x64, 0x2,0x47,0x6c, 0x2,0x47,0x69, 0x2,0x47,0x6a, 0x1,0x6b,0x38, 0x2,0x4e,0x3e, 0x3,0x49,0x75, 0x3,0x49,0x73, 0x1,0x6b,0x37, 0x3,0x49,0x74, 0x2,0x54,0x5b, 0x2,0x54,0x59, 0x3,0x4f,0x26, 0x4,0x4d,0x75, 0x1,0x6f,0x36, 0x2,0x54,0x58, 0x2,0x54,0x5a, 0x3,0x4f,0x25, 0x1,0x6f,0x37, 0x3,0x4f,0x23, 0x2,0x5a,0x67, 0x3,0x52,0x77, 0x2,0x5a,0x68, 0x1,0x75,0x58, 0x3,0x59,0x31, 0x2,0x67,0x38, 0x2,0x67,0x3a, 0x2,0x67,0x37, 0x2,0x67,0x39, 0x2,0x6a,0x24, 0x2,0x6c,0x43, 0x3,0x66,0x51, 0x2,0x71,0x5e, 0x1,0x4b,0x4d, 0x1,0x53,0x5a, 0x2,0x33,0x29, 0x2,0x33,0x2b, 0x2,0x33,0x2a, 0x2,0x39,0x5b, 0x1,0x5d,0x52, 0x3,0x39,0x3e, 0x2,0x39,0x59, 0x3,0x39,0x3a, 0x1,0x5d,0x51, 0x2,0x39,0x5c, 0x3,0x39,0x3d, 0x2,0x39,0x5d, 0x2,0x39,0x5a, 0x6,0x45,0x38, 0x2,0x40,0x61, 0x1,0x62,0x47, 0x2,0x40,0x59, 0x2,0x40,0x5f, 0x3,0x3f,0x3f, 0x3,0x3f,0x3a, 0x1,0x62,0x42, 0x1,0x62,0x45, 0x2,0x40,0x58, 0x1,0x62,0x40, 0x2,0x40,0x5c, 0x2,0x47,0x72, 0x1,0x62,0x44, 0x3,0x3f,0x3b, 0x2,0x40,0x57, 0x3,0x3f,0x3e, 0x2,0x40,0x5d, 0x2,0x40,0x5a, 0x2,0x40,0x60, 0x2,0x40,0x56, 0x2,0x40,0x5e, 0x1,0x62,0x43, 0x1,0x62,0x46, 0x2,0x40,0x5b, 0x1,0x62,0x41, 0x1,0x66,0x79, 0x2,0x47,0x6e, 0x1,0x66,0x78, 0x2,0x47,0x75, 0x2,0x47,0x74, 0x1,0x67,0x21, 0x1,0x67,0x22, 0x2,0x47,0x76, 0x1,0x66,0x7a, 0x2,0x47,0x73, 0x1,0x66,0x7e, 0x2,0x47,0x78, 0x2,0x47,0x6f, 0x3,0x44,0x6b, 0x2,0x47,0x71, 0x1,0x66,0x7b, 0x2,0x47,0x6d, 0x2,0x47,0x70, 0x2,0x47,0x77, 0x1,0x66,0x7c, 0x2,0x47,0x79, 0x1,0x66,0x7d, 0x1,0x6b,0x39, 0x2,0x4e,0x43, 0x2,0x4e,0x49, 0x2,0x4e,0x41, 0x2,0x4e,0x4a, 0x3,0x49,0x7b, 0x2,0x4e,0x40, 0x2,0x4e,0x45, 0x2,0x4e,0x4b, 0x2,0x4e,0x48, 0x2,0x4e,0x47, 0x2,0x4e,0x46, 0x3,0x49,0x7a, 0x2,0x4e,0x3f, 0x2,0x4e,0x44, 0x3,0x49,0x79, 0x2,0x4e,0x42, 0x1,0x6f,0x3c, 0x1,0x6f,0x39, 0x2,0x54,0x64, 0x2,0x54,0x69, 0x2,0x54,0x6b, 0x2,0x54,0x68, 0x2,0x54,0x61, 0x2,0x54,0x63, 0x2,0x54,0x6d, 0x2,0x54,0x6a, 0x2,0x54,0x65, 0x2,0x54,0x6e, 0x2,0x54,0x62, 0x2,0x54,0x6c, 0x1,0x6f,0x3a, 0x1,0x6f,0x40, 0x1,0x6f,0x3e, 0x2,0x54,0x5c, 0x1,0x6f,0x3f, 0x1,0x6f,0x3b, 0x2,0x54,0x5d, 0x2,0x54,0x5f, 0x2,0x54,0x5e, 0x2,0x54,0x66, 0x2,0x54,0x67, 0x3,0x4f,0x2c, 0x1,0x6f,0x3d, 0x3,0x4f,0x2b, 0x1,0x6f,0x38, 0x2,0x54,0x60, 0x2,0x5a,0x72, 0x1,0x72,0x4c, 0x3,0x52,0x7e, 0x2,0x5a,0x69, 0x1,0x72,0x4d, 0x1,0x72,0x50, 0x2,0x5a,0x6e, 0x5,0x51,0x48, 0x2,0x5a,0x6b, 0x1,0x72,0x4f, 0x4,0x54,0x29, 0x3,0x52,0x7b, 0x2,0x5a,0x6f, 0x2,0x5a,0x70, 0x2,0x5a,0x6a, 0x2,0x5a,0x73, 0x2,0x5a,0x6c, 0x2,0x5a,0x71, 0x1,0x72,0x4e, 0x3,0x52,0x7c, 0x1,0x72,0x4b, 0x2,0x5a,0x6d, 0x3,0x56,0x54, 0x2,0x5f,0x6b, 0x1,0x75,0x5b, 0x1,0x75,0x59, 0x1,0x75,0x5c, 0x1,0x75,0x5a, 0x2,0x5f,0x6a, 0x2,0x5f,0x67, 0x2,0x5f,0x66, 0x3,0x56,0x55, 0x2,0x5f,0x69, 0x4,0x59,0x2d, 0x2,0x5f,0x68, 0x2,0x63,0x6f, 0x1,0x77,0x49, 0x2,0x63,0x66, 0x2,0x63,0x65, 0x3,0x59,0x32, 0x1,0x77,0x44, 0x2,0x63,0x6b, 0x2,0x63,0x6a, 0x2,0x63,0x62, 0x2,0x63,0x6d, 0x2,0x63,0x67, 0x1,0x77,0x48, 0x2,0x63,0x64, 0x2,0x63,0x6c, 0x2,0x63,0x63, 0x1,0x77,0x45, 0x1,0x77,0x47, 0x2,0x63,0x68, 0x1,0x77,0x46, 0x2,0x63,0x69, 0x3,0x5b,0x3a, 0x2,0x63,0x6e, 0x2,0x67,0x3e, 0x3,0x5b,0x39, 0x1,0x79,0x2b, 0x2,0x67,0x3b, 0x4,0x61,0x52, 0x2,0x67,0x3f, 0x3,0x5b,0x3b, 0x4,0x61,0x4f, 0x1,0x79,0x28, 0x2,0x67,0x3d, 0x1,0x79,0x2d, 0x3,0x5b,0x3c, 0x1,0x79,0x2a, 0x3,0x5b,0x3d, 0x2,0x67,0x3c, 0x4,0x61,0x54, 0x1,0x79,0x2c, 0x2,0x67,0x40, 0x1,0x79,0x27, 0x1,0x7a,0x47, 0x1,0x7a,0x49, 0x3,0x5d,0x37, 0x2,0x6a,0x27, 0x1,0x7a,0x48, 0x2,0x6a,0x25, 0x1,0x79,0x29, 0x2,0x6a,0x26, 0x1,0x7a,0x46, 0x1,0x7b,0x2f, 0x1,0x7b,0x31, 0x2,0x6c,0x45, 0x1,0x7b,0x30, 0x2,0x6c,0x44, 0x2,0x6e,0x30, 0x1,0x7b,0x77, 0x2,0x6e,0x2f, 0x1,0x7b,0x78, 0x2,0x6e,0x2d, 0x2,0x6e,0x2c, 0x2,0x6e,0x31, 0x2,0x6e,0x32, 0x2,0x6f,0x54, 0x3,0x60,0x4b, 0x2,0x6e,0x2e, 0x2,0x70,0x54, 0x2,0x70,0x51, 0x2,0x70,0x52, 0x2,0x70,0x53, 0x1,0x7d,0x29, 0x3,0x61,0x50, 0x2,0x71,0x40, 0x2,0x71,0x3f, 0x2,0x71,0x3e, 0x2,0x71,0x5f, 0x3,0x61,0x6c, 0x2,0x72,0x2e, 0x2,0x71,0x79, 0x1,0x7d,0x3b, 0x1,0x4b,0x4e, 0x1,0x58,0x45, 0x3,0x39,0x3f, 0xf,0x38,0x6c, 0x3,0x39,0x40, 0x3,0x3f,0x40, 0x3,0x44,0x73, 0x1,0x67,0x23, 0x3,0x49,0x7d, 0x3,0x49,0x7c, 0x3,0x4f,0x30, 0x3,0x4f,0x32, 0x3,0x4f,0x2f, 0x3,0x4f,0x31, 0x1,0x6f,0x41, 0x3,0x66,0x52, 0x2,0x5a,0x74, 0xf,0x58,0x33, 0x3,0x59,0x35, 0x1,0x77,0x4a, 0x3,0x59,0x36, 0x2,0x67,0x41, 0x3,0x5b,0x3f, 0x4,0x61,0x56, 0x3,0x5d,0x38, 0x4,0x67,0x51, 0x2,0x71,0x7a, 0x1,0x4b,0x4f, 0x1,0x4f,0x51, 0x1,0x53,0x5c, 0x1,0x53,0x5b, 0x5,0x30,0x55, 0x1,0x58,0x48, 0x3,0x34,0x21, 0x2,0x33,0x2c, 0x1,0x58,0x46, 0x2,0x33,0x2d, 0x1,0x58,0x47, 0x3,0x66,0x53, 0x3,0x39,0x41, 0x2,0x39,0x62, 0x2,0x39,0x5e, 0x3,0x39,0x47, 0x4,0x35,0x63, 0x1,0x5d,0x53, 0x2,0x39,0x61, 0x2,0x39,0x60, 0x2,0x39,0x5f, 0x1,0x5d,0x54, 0x2,0x39,0x63, 0x2,0x39,0x64, 0x3,0x3f,0x45, 0x2,0x40,0x68, 0x2,0x40,0x66, 0x2,0x40,0x6a, 0x2,0x40,0x6b, 0x2,0x40,0x71, 0x3,0x3f,0x47, 0x2,0x40,0x6d, 0x2,0x40,0x6f, 0x5,0x43,0x50, 0x2,0x40,0x67, 0x2,0x40,0x62, 0x4,0x3b,0x55, 0x2,0x40,0x6e, 0x3,0x3f,0x44, 0x3,0x3f,0x46, 0x2,0x40,0x70, 0x2,0x40,0x69, 0x2,0x40,0x6c, 0x2,0x40,0x63, 0x1,0x62,0x49, 0x2,0x40,0x65, 0x2,0x40,0x64, 0x1,0x62,0x48, 0x1,0x62,0x4a, 0x3,0x3f,0x49, 0x1,0x67,0x26, 0x2,0x47,0x7b, 0x2,0x47,0x7d, 0x2,0x47,0x7c, 0x2,0x48,0x23, 0x1,0x67,0x24, 0x3,0x44,0x76, 0x2,0x47,0x7e, 0x2,0x47,0x7a, 0x2,0x48,0x21, 0x2,0x48,0x22, 0x1,0x67,0x25, 0x1,0x67,0x27, 0x2,0x48,0x24, 0x2,0x4e,0x4f, 0x2,0x4e,0x4e, 0x4,0x47,0x6a, 0x2,0x4e,0x4c, 0x2,0x4e,0x4d, 0x1,0x6b,0x3b, 0x1,0x6b,0x3d, 0x1,0x6b,0x3a, 0x1,0x6b,0x3c, 0x2,0x54,0x75, 0x2,0x54,0x76, 0x2,0x54,0x71, 0x3,0x4f,0x36, 0x2,0x54,0x72, 0x1,0x6f,0x43, 0x1,0x6f,0x48, 0x1,0x6f,0x42, 0x1,0x6f,0x49, 0x1,0x6f,0x44, 0x2,0x54,0x73, 0x4,0x4e,0x2d, 0x3,0x4f,0x33, 0x2,0x54,0x74, 0x2,0x54,0x70, 0x1,0x6f,0x4a, 0x1,0x6f,0x46, 0x3,0x4f,0x35, 0x4,0x4e,0x2b, 0x1,0x6f,0x45, 0x1,0x6f,0x47, 0x3,0x4f,0x34, 0x2,0x54,0x6f, 0x3,0x53,0x24, 0x2,0x5a,0x76, 0x1,0x72,0x52, 0x3,0x53,0x22, 0x3,0x53,0x21, 0x2,0x5a,0x78, 0x1,0x72,0x54, 0x2,0x5a,0x7b, 0x2,0x5a,0x77, 0x2,0x5a,0x75, 0x2,0x5a,0x7a, 0x1,0x72,0x53, 0x2,0x5a,0x79, 0x7,0x34,0x32, 0x1,0x72,0x51, 0x3,0x53,0x25, 0x3,0x56,0x59, 0x1,0x75,0x5e, 0x1,0x75,0x61, 0x2,0x5f,0x6d, 0x3,0x56,0x5a, 0x1,0x75,0x5f, 0x2,0x5f,0x6c, 0x1,0x75,0x5d, 0x1,0x75,0x60, 0x2,0x63,0x70, 0x2,0x63,0x71, 0x2,0x63,0x72, 0x1,0x77,0x4b, 0x3,0x59,0x37, 0x2,0x63,0x73, 0x1,0x77,0x4c, 0x1,0x79,0x2f, 0x2,0x67,0x44, 0x2,0x67,0x45, 0x2,0x67,0x43, 0x2,0x67,0x42, 0x2,0x67,0x46, 0x1,0x79,0x2e, 0x2,0x6a,0x2b, 0x2,0x6a,0x29, 0x2,0x6a,0x2a, 0x2,0x6a,0x2c, 0x2,0x6a,0x28, 0x2,0x6a,0x2d, 0x2,0x6c,0x47, 0x3,0x5e,0x67, 0x2,0x6c,0x48, 0x2,0x6c,0x46, 0x1,0x7b,0x32, 0x2,0x6e,0x33, 0x1,0x7b,0x79, 0x2,0x6e,0x34, 0x2,0x6f,0x56, 0x2,0x6f,0x55, 0x3,0x62,0x22, 0x1,0x4b,0x50, 0x1,0x62,0x4b, 0x3,0x3f,0x4b, 0x3,0x44,0x77, 0x1,0x67,0x28, 0x3,0x44,0x78, 0x3,0x4a,0x21, 0x3,0x4a,0x22, 0x1,0x6b,0x3e, 0x3,0x4f,0x37, 0x3,0x53,0x27, 0x1,0x72,0x56, 0x3,0x53,0x26, 0x1,0x72,0x55, 0x3,0x66,0x54, 0x3,0x59,0x38, 0x1,0x79,0x30, 0x1,0x7a,0x29, 0x1,0x7b,0x33, 0x1,0x4b,0x51, 0x1,0x58,0x49, 0x1,0x67,0x29, 0x3,0x4f,0x39, 0x2,0x67,0x47, 0x3,0x27,0x2f, 0x4,0x21,0x54, 0xf,0x21,0x6a, 0x4,0x23,0x30, 0x3,0x24,0x3b, 0xf,0x22,0x71, 0xf,0x22,0x72, 0x3,0x27,0x30, 0x2,0x25,0x26, 0x4,0x25,0x21, 0x3,0x27,0x33, 0x1,0x4b,0x52, 0x4,0x25,0x23, 0x1,0x4b,0x55, 0x1,0x4b,0x54, 0x1,0x4b,0x53, 0x3,0x27,0x31, 0xf,0x25,0x32, 0x2,0x25,0x25, 0x3,0x2a,0x72, 0x2,0x28,0x6d, 0x3,0x2a,0x70, 0x2,0x28,0x6f, 0x1,0x4f,0x52, 0x3,0x2a,0x74, 0x4,0x28,0x26, 0x1,0x4f,0x54, 0x2,0x28,0x6c, 0x2,0x28,0x6e, 0x1,0x4f,0x53, 0x2,0x28,0x71, 0x2,0x28,0x70, 0x2,0x28,0x72, 0x3,0x2a,0x73, 0x3,0x2a,0x71, 0xf,0x28,0x71, 0xf,0x28,0x6e, 0x2,0x2d,0x57, 0x2,0x2d,0x55, 0x1,0x53,0x5f, 0x2,0x2d,0x54, 0x1,0x53,0x64, 0x1,0x53,0x61, 0x1,0x53,0x5e, 0x3,0x2f,0x31, 0x1,0x53,0x65, 0x3,0x2f,0x32, 0x1,0x53,0x60, 0x1,0x53,0x63, 0x6,0x34,0x60, 0x1,0x53,0x62, 0x2,0x2d,0x56, 0x3,0x2f,0x33, 0x1,0x53,0x5d, 0x3,0x2f,0x30, 0x1,0x58,0x4f, 0x2,0x33,0x2f, 0x2,0x33,0x35, 0x1,0x58,0x4c, 0x1,0x58,0x53, 0x3,0x34,0x25, 0x1,0x58,0x4e, 0x2,0x33,0x32, 0x2,0x33,0x34, 0x1,0x58,0x51, 0x2,0x33,0x2e, 0x2,0x33,0x31, 0x1,0x58,0x4d, 0x1,0x58,0x4a, 0x2,0x33,0x30, 0x1,0x58,0x50, 0x2,0x33,0x33, 0x1,0x58,0x52, 0x1,0x58,0x4b, 0x4,0x30,0x2f, 0x3,0x34,0x27, 0x3,0x34,0x26, 0x2,0x39,0x66, 0x2,0x39,0x69, 0x1,0x5d,0x56, 0x3,0x39,0x4b, 0x1,0x5d,0x60, 0x1,0x5d,0x5c, 0x2,0x39,0x67, 0x3,0x39,0x4a, 0x3,0x39,0x4e, 0x1,0x5d,0x64, 0x1,0x5d,0x5d, 0x1,0x5d,0x62, 0x1,0x5d,0x58, 0x4,0x35,0x68, 0x1,0x5d,0x55, 0x1,0x5d,0x57, 0x1,0x5d,0x63, 0x2,0x39,0x68, 0x1,0x5d,0x5b, 0x1,0x5d,0x5e, 0x1,0x5d,0x5a, 0x1,0x5d,0x5f, 0x2,0x39,0x6a, 0x1,0x5d,0x61, 0x1,0x5d,0x59, 0x2,0x39,0x65, 0x3,0x39,0x4c, 0x3,0x3f,0x4f, 0x3,0x3f,0x50, 0x3,0x3f,0x4d, 0x3,0x3f,0x4c, 0x3,0x3f,0x51, 0x2,0x40,0x72, 0x1,0x62,0x4c, 0x2,0x40,0x74, 0x3,0x3f,0x55, 0x1,0x62,0x4e, 0x1,0x62,0x50, 0x4,0x35,0x66, 0x2,0x40,0x73, 0x1,0x62,0x4d, 0x1,0x62,0x51, 0x3,0x3f,0x56, 0x1,0x62,0x4f, 0x3,0x3f,0x54, 0x3,0x3f,0x57, 0x1,0x67,0x2f, 0x2,0x48,0x29, 0x1,0x67,0x37, 0x2,0x48,0x26, 0x3,0x44,0x7d, 0x1,0x67,0x38, 0x1,0x67,0x2d, 0x3,0x44,0x79, 0x2,0x48,0x27, 0x3,0x44,0x7c, 0x3,0x44,0x7a, 0x1,0x67,0x32, 0x3,0x44,0x7b, 0x2,0x48,0x28, 0x1,0x67,0x2b, 0x1,0x67,0x2a, 0x3,0x44,0x7e, 0x1,0x67,0x35, 0x1,0x67,0x34, 0x1,0x67,0x33, 0x1,0x67,0x31, 0x1,0x67,0x36, 0x2,0x48,0x25, 0x1,0x67,0x2c, 0x1,0x67,0x2e, 0x1,0x67,0x30, 0x1,0x6b,0x40, 0x1,0x6b,0x43, 0x3,0x4a,0x24, 0x1,0x6b,0x47, 0x1,0x6b,0x41, 0x1,0x6b,0x46, 0x1,0x6b,0x44, 0x3,0x4a,0x27, 0x1,0x6b,0x3f, 0x3,0x4a,0x26, 0x1,0x6b,0x45, 0x1,0x6b,0x42, 0xf,0x4c,0x6b, 0x4,0x4e,0x32, 0x2,0x54,0x7a, 0x1,0x6f,0x4d, 0x1,0x6f,0x4b, 0x3,0x4f,0x3c, 0x2,0x54,0x7b, 0x4,0x4e,0x33, 0x1,0x6f,0x4e, 0x1,0x6f,0x4c, 0x2,0x54,0x79, 0x2,0x54,0x78, 0x3,0x4f,0x3b, 0x1,0x72,0x5a, 0x2,0x54,0x77, 0x1,0x72,0x58, 0x1,0x72,0x57, 0x2,0x5a,0x7c, 0x1,0x6f,0x4f, 0x1,0x72,0x59, 0x2,0x5a,0x7d, 0x1,0x72,0x5c, 0x2,0x5a,0x7e, 0x1,0x72,0x5b, 0x1,0x75,0x63, 0x2,0x5f,0x6f, 0x1,0x75,0x62, 0x1,0x75,0x67, 0x1,0x75,0x65, 0x1,0x75,0x66, 0x1,0x77,0x4e, 0x1,0x75,0x64, 0x2,0x5f,0x6e, 0x2,0x5b,0x21, 0x1,0x77,0x4d, 0x1,0x77,0x4f, 0x3,0x59,0x3a, 0x1,0x79,0x31, 0x1,0x79,0x32, 0x4,0x61,0x5f, 0x2,0x6a,0x2e, 0x4,0x69,0x52, 0x1,0x7c,0x4a, 0x1,0x7c,0x49, 0x1,0x4b,0x57, 0x3,0x22,0x5e, 0x3,0x22,0x5d, 0x2,0x22,0x75, 0x1,0x58,0x54, 0x3,0x24,0x3c, 0x2,0x22,0x72, 0x2,0x22,0x73, 0x2,0x22,0x71, 0x3,0x24,0x3d, 0x2,0x22,0x74, 0x3,0x66,0x55, 0x2,0x25,0x2a, 0x2,0x25,0x27, 0x2,0x25,0x2c, 0x2,0x25,0x28, 0x1,0x4b,0x58, 0x1,0x4b,0x5b, 0x3,0x27,0x35, 0x2,0x25,0x29, 0x1,0x4b,0x5a, 0x2,0x25,0x2b, 0x3,0x27,0x39, 0x3,0x27,0x34, 0x1,0x4b,0x59, 0x3,0x39,0x51, 0x3,0x2a,0x77, 0x4,0x28,0x2b, 0x2,0x28,0x75, 0x2,0x28,0x77, 0x1,0x4f,0x57, 0x2,0x28,0x73, 0x2,0x28,0x76, 0x2,0x28,0x74, 0x1,0x4f,0x55, 0x1,0x4f,0x58, 0x3,0x2a,0x75, 0x1,0x4f,0x56, 0x3,0x2a,0x78, 0x3,0x2f,0x35, 0x2,0x2d,0x59, 0x2,0x2d,0x5d, 0x2,0x2d,0x5a, 0x3,0x2f,0x38, 0x1,0x53,0x68, 0x3,0x2f,0x34, 0x1,0x53,0x69, 0x3,0x2f,0x3e, 0x2,0x2d,0x5c, 0x3,0x2f,0x37, 0x2,0x2d,0x5e, 0x2,0x2d,0x60, 0x3,0x2f,0x3c, 0x1,0x53,0x66, 0x2,0x2d,0x5f, 0x4,0x41,0x39, 0x3,0x2f,0x3b, 0x1,0x53,0x67, 0xf,0x45,0x6d, 0x2,0x39,0x71, 0x2,0x2d,0x5b, 0x2,0x33,0x36, 0x2,0x33,0x3f, 0x2,0x33,0x3d, 0x2,0x33,0x38, 0x2,0x33,0x39, 0x2,0x33,0x3e, 0x2,0x33,0x40, 0x1,0x58,0x56, 0x3,0x34,0x29, 0x2,0x33,0x3b, 0x2,0x33,0x37, 0x1,0x58,0x55, 0x1,0x58,0x57, 0x2,0x33,0x3a, 0x2,0x33,0x41, 0x2,0x33,0x3c, 0x1,0x5d,0x65, 0x2,0x39,0x74, 0x2,0x39,0x6c, 0x2,0x39,0x72, 0x2,0x39,0x73, 0x1,0x5d,0x66, 0x3,0x39,0x4f, 0x2,0x39,0x6b, 0x2,0x39,0x6d, 0x2,0x2d,0x58, 0x2,0x39,0x6f, 0x2,0x39,0x70, 0x2,0x39,0x6e, 0x1,0x62,0x53, 0x4,0x4e,0x3b, 0x3,0x39,0x52, 0x2,0x40,0x7b, 0x2,0x5b,0x22, 0x2,0x40,0x7c, 0x2,0x40,0x79, 0x1,0x5d,0x67, 0x1,0x62,0x55, 0x2,0x40,0x78, 0x2,0x40,0x7e, 0x2,0x40,0x7d, 0x1,0x62,0x52, 0x2,0x41,0x23, 0x2,0x40,0x77, 0x2,0x41,0x22, 0x2,0x40,0x75, 0x2,0x41,0x21, 0x2,0x40,0x7a, 0x1,0x62,0x54, 0x3,0x3f,0x59, 0x2,0x48,0x30, 0x3,0x45,0x23, 0x2,0x48,0x2b, 0x2,0x48,0x31, 0x2,0x48,0x2c, 0x2,0x48,0x2a, 0x2,0x48,0x2d, 0x1,0x67,0x39, 0x3,0x45,0x24, 0x2,0x48,0x2f, 0x3,0x45,0x25, 0x2,0x48,0x2e, 0x1,0x67,0x3a, 0x1,0x6b,0x49, 0x1,0x6b,0x48, 0x2,0x4e,0x56, 0x2,0x4e,0x59, 0x2,0x4e,0x51, 0x2,0x4e,0x55, 0x1,0x6b,0x4a, 0x2,0x4e,0x54, 0x2,0x4e,0x52, 0x2,0x4e,0x58, 0x2,0x4e,0x53, 0x2,0x4e,0x50, 0x2,0x4e,0x57, 0x3,0x4a,0x2a, 0x2,0x55,0x23, 0x1,0x6f,0x52, 0x2,0x63,0x74, 0x2,0x54,0x7e, 0x2,0x55,0x21, 0x2,0x54,0x7d, 0x2,0x40,0x76, 0x1,0x6f,0x51, 0x2,0x55,0x24, 0x2,0x54,0x7c, 0x1,0x6f,0x50, 0x1,0x6f,0x53, 0x2,0x55,0x22, 0x2,0x5b,0x23, 0x1,0x72,0x5d, 0x2,0x5b,0x24, 0x2,0x5b,0x25, 0x3,0x53,0x2b, 0x2,0x5f,0x70, 0x1,0x75,0x68, 0x2,0x63,0x75, 0x2,0x63,0x76, 0x3,0x59,0x3c, 0x3,0x59,0x3b, 0x2,0x63,0x77, 0x2,0x67,0x49, 0x2,0x67,0x48, 0x2,0x6a,0x30, 0x2,0x6a,0x2f, 0x2,0x6c,0x4a, 0x2,0x6c,0x4b, 0x2,0x6c,0x49, 0x2,0x6e,0x35, 0x1,0x7b,0x7a, 0x1,0x4b,0x5c, 0x1,0x53,0x6b, 0x1,0x53,0x6a, 0x1,0x58,0x5a, 0x1,0x58,0x59, 0x2,0x33,0x43, 0x2,0x33,0x44, 0x2,0x33,0x42, 0x3,0x34,0x2a, 0x1,0x58,0x58, 0x2,0x39,0x78, 0x3,0x39,0x55, 0x2,0x39,0x79, 0x2,0x39,0x75, 0x1,0x5d,0x68, 0x2,0x39,0x76, 0x3,0x39,0x54, 0x2,0x39,0x77, 0x3,0x66,0x57, 0x2,0x41,0x26, 0x2,0x41,0x28, 0x2,0x41,0x24, 0x2,0x41,0x27, 0x1,0x62,0x56, 0x2,0x41,0x25, 0x1,0x62,0x57, 0x3,0x45,0x28, 0x2,0x42,0x79, 0x1,0x67,0x3d, 0x1,0x67,0x3c, 0x3,0x45,0x27, 0x1,0x67,0x3b, 0x4,0x41,0x3a, 0x2,0x48,0x32, 0x2,0x48,0x33, 0x4,0x41,0x3b, 0x2,0x4e,0x5b, 0x2,0x4e,0x5d, 0x1,0x6b,0x4e, 0x1,0x6b,0x4b, 0x3,0x4a,0x2c, 0x1,0x6b,0x4d, 0x1,0x6b,0x4c, 0x2,0x4e,0x5c, 0x2,0x4e,0x5a, 0x3,0x4a,0x2b, 0x3,0x4a,0x2d, 0x2,0x55,0x2b, 0x2,0x55,0x28, 0x2,0x55,0x29, 0x1,0x6f,0x57, 0x2,0x55,0x2a, 0x2,0x55,0x25, 0x2,0x55,0x26, 0x1,0x6f,0x54, 0x3,0x4f,0x3f, 0x1,0x6f,0x55, 0x2,0x55,0x27, 0x1,0x6f,0x56, 0x3,0x4f,0x40, 0x2,0x5b,0x29, 0x3,0x53,0x2d, 0x2,0x5b,0x2a, 0x2,0x5b,0x27, 0x2,0x5b,0x28, 0x1,0x72,0x5e, 0x2,0x5b,0x26, 0x4,0x54,0x42, 0x3,0x53,0x2c, 0x3,0x53,0x2f, 0x4,0x59,0x3f, 0x2,0x5f,0x74, 0x2,0x5f,0x71, 0x2,0x5f,0x73, 0x1,0x75,0x6b, 0x2,0x5f,0x77, 0x1,0x75,0x6a, 0x2,0x5f,0x75, 0x2,0x5f,0x78, 0x2,0x5f,0x76, 0x2,0x5f,0x72, 0x1,0x75,0x69, 0x2,0x63,0x79, 0x4,0x5e,0x24, 0x2,0x63,0x7a, 0x2,0x63,0x78, 0x3,0x59,0x3d, 0x2,0x63,0x7c, 0x1,0x77,0x50, 0x1,0x77,0x51, 0x2,0x67,0x4b, 0x1,0x79,0x34, 0x2,0x63,0x7b, 0x2,0x67,0x4a, 0x1,0x79,0x33, 0x2,0x6a,0x33, 0x2,0x6a,0x34, 0x1,0x7a,0x4a, 0x2,0x6a,0x32, 0x4,0x64,0x65, 0x2,0x6a,0x31, 0x2,0x6c,0x4c, 0x1,0x7b,0x34, 0x3,0x5e,0x68, 0x2,0x6f,0x57, 0x2,0x70,0x56, 0x2,0x70,0x55, 0x3,0x60,0x7e, 0x1,0x7c,0x6e, 0x1,0x7d,0x2a, 0x2,0x70,0x57, 0x2,0x71,0x60, 0x3,0x61,0x6d, 0x1,0x7d,0x3c, 0x1,0x4b,0x5d, 0x1,0x4f,0x59, 0x1,0x67,0x3e, 0x1,0x7a,0x4b, 0x1,0x4b,0x5e, 0x1,0x53,0x6c, 0x1,0x5d,0x69, 0x1,0x62,0x58, 0x1,0x77,0x52, 0x1,0x4f,0x5a, 0x2,0x2d,0x62, 0x2,0x2d,0x61, 0x2,0x33,0x45, 0x3,0x34,0x30, 0x1,0x58,0x5d, 0x1,0x58,0x5b, 0x1,0x58,0x5f, 0x2,0x33,0x47, 0x3,0x34,0x2d, 0x1,0x58,0x5e, 0x1,0x58,0x5c, 0x3,0x34,0x2f, 0x3,0x34,0x2e, 0x3,0x34,0x31, 0x2,0x33,0x46, 0x1,0x5d,0x6c, 0x2,0x3a,0x21, 0x3,0x39,0x58, 0x1,0x5d,0x6b, 0x1,0x5d,0x6d, 0x2,0x3a,0x26, 0x1,0x5d,0x6f, 0x2,0x3a,0x23, 0x2,0x3a,0x24, 0x2,0x39,0x7a, 0x1,0x5d,0x6e, 0x2,0x3a,0x27, 0x4,0x35,0x7b, 0x3,0x39,0x57, 0x2,0x39,0x7c, 0x3,0x39,0x56, 0x2,0x39,0x7d, 0x2,0x39,0x7b, 0x1,0x5d,0x6a, 0x3,0x39,0x59, 0x2,0x3a,0x25, 0x2,0x39,0x7e, 0x2,0x3a,0x22, 0x2,0x41,0x34, 0x3,0x3f,0x5d, 0x2,0x41,0x33, 0x2,0x41,0x31, 0x2,0x41,0x29, 0x2,0x41,0x38, 0x2,0x41,0x2c, 0x2,0x41,0x36, 0x2,0x41,0x3d, 0x2,0x41,0x35, 0x1,0x62,0x60, 0x3,0x3f,0x66, 0x1,0x62,0x5c, 0x2,0x41,0x2a, 0x3,0x3f,0x60, 0x2,0x41,0x30, 0x1,0x62,0x5e, 0x3,0x3f,0x68, 0x2,0x41,0x2f, 0x1,0x62,0x5f, 0x1,0x62,0x61, 0x2,0x41,0x32, 0x3,0x3f,0x69, 0x1,0x62,0x59, 0x1,0x62,0x5a, 0x2,0x41,0x3e, 0x2,0x41,0x3c, 0x3,0x3f,0x62, 0x2,0x41,0x3b, 0x2,0x41,0x2d, 0x3,0x3f,0x65, 0x2,0x41,0x39, 0x4,0x3b,0x66, 0x1,0x62,0x5d, 0x6,0x4f,0x6f, 0x3,0x3f,0x5e, 0x3,0x66,0x59, 0x3,0x3f,0x63, 0x1,0x62,0x5b, 0x2,0x41,0x3a, 0x2,0x41,0x2b, 0x2,0x41,0x2e, 0x2,0x41,0x37, 0x3,0x66,0x58, 0x2,0x4f,0x22, 0x2,0x48,0x3d, 0x3,0x45,0x2e, 0x2,0x48,0x36, 0x2,0x48,0x49, 0x2,0x48,0x52, 0x2,0x48,0x39, 0x1,0x67,0x49, 0x3,0x45,0x2b, 0x2,0x48,0x46, 0x1,0x67,0x3f, 0x1,0x67,0x41, 0x1,0x67,0x4d, 0x2,0x48,0x37, 0x3,0x45,0x37, 0x3,0x45,0x2f, 0x1,0x67,0x42, 0x1,0x67,0x44, 0x1,0x67,0x4e, 0x1,0x67,0x43, 0x3,0x45,0x39, 0x4,0x41,0x41, 0x4,0x41,0x46, 0x3,0x45,0x38, 0x1,0x67,0x4c, 0x2,0x48,0x3f, 0x4,0x41,0x48, 0x2,0x48,0x34, 0x1,0x67,0x4a, 0x2,0x48,0x3e, 0x1,0x67,0x46, 0x2,0x48,0x50, 0x1,0x67,0x4b, 0x2,0x48,0x4e, 0x2,0x48,0x42, 0x2,0x48,0x4c, 0x1,0x67,0x48, 0x2,0x48,0x35, 0x2,0x48,0x4f, 0x2,0x48,0x4a, 0x3,0x45,0x2a, 0x2,0x48,0x51, 0x1,0x67,0x40, 0x4,0x41,0x40, 0x3,0x45,0x2d, 0x1,0x67,0x4f, 0x1,0x67,0x45, 0x3,0x45,0x31, 0x3,0x45,0x29, 0x2,0x48,0x3b, 0x3,0x45,0x34, 0x2,0x48,0x43, 0x2,0x48,0x47, 0x3,0x45,0x33, 0x2,0x48,0x4b, 0x1,0x67,0x47, 0x2,0x48,0x3a, 0x2,0x48,0x38, 0x2,0x48,0x44, 0x4,0x41,0x42, 0x4,0x41,0x43, 0x3,0x45,0x32, 0x3,0x45,0x35, 0x2,0x48,0x41, 0x2,0x48,0x40, 0x3,0x45,0x36, 0x2,0x48,0x45, 0x2,0x48,0x48, 0x2,0x48,0x4d, 0x3,0x66,0x5a, 0xf,0x45,0x72, 0x4,0x47,0x75, 0x2,0x4e,0x60, 0xf,0x4d,0x22, 0x1,0x6b,0x4f, 0x2,0x4e,0x6a, 0x2,0x4e,0x62, 0x1,0x6b,0x55, 0x1,0x6b,0x59, 0x2,0x4e,0x73, 0x2,0x4e,0x7b, 0x2,0x4e,0x6c, 0x1,0x6b,0x51, 0x3,0x4a,0x34, 0x2,0x4e,0x70, 0x2,0x48,0x3c, 0x3,0x4a,0x35, 0x1,0x6b,0x52, 0x2,0x4e,0x77, 0x2,0x4e,0x7c, 0x2,0x4e,0x74, 0x3,0x4a,0x2f, 0x2,0x4e,0x76, 0x2,0x4f,0x21, 0x2,0x4e,0x78, 0x2,0x4e,0x66, 0x2,0x4e,0x6f, 0x3,0x45,0x30, 0x3,0x4a,0x38, 0x1,0x6b,0x5a, 0x3,0x4a,0x33, 0x1,0x6b,0x56, 0x2,0x4e,0x64, 0x2,0x4e,0x71, 0x1,0x6b,0x54, 0x2,0x4e,0x6b, 0x1,0x6b,0x53, 0x2,0x4e,0x79, 0x2,0x4e,0x68, 0x2,0x4e,0x61, 0x1,0x6b,0x57, 0x2,0x4e,0x7e, 0x3,0x4a,0x39, 0x4,0x47,0x77, 0x2,0x4e,0x63, 0x2,0x4e,0x75, 0x2,0x4e,0x72, 0x2,0x4e,0x6d, 0x2,0x4e,0x5f, 0x2,0x4e,0x5e, 0x2,0x4e,0x67, 0x2,0x4e,0x7a, 0x1,0x6b,0x58, 0x2,0x4e,0x7d, 0x2,0x4e,0x65, 0x2,0x4e,0x69, 0x1,0x6b,0x50, 0x3,0x4a,0x32, 0x3,0x4a,0x37, 0xf,0x4d,0x27, 0x3,0x67,0x2a, 0x3,0x4a,0x31, 0x1,0x6f,0x63, 0x1,0x6f,0x5e, 0x2,0x55,0x4d, 0x2,0x55,0x49, 0x2,0x55,0x31, 0x1,0x6f,0x5a, 0x3,0x4f,0x42, 0x3,0x4f,0x50, 0x4,0x4e,0x45, 0x1,0x6f,0x59, 0x1,0x6f,0x5f, 0x4,0x4e,0x47, 0x3,0x4f,0x43, 0x3,0x4f,0x41, 0x2,0x55,0x2f, 0x1,0x6f,0x5d, 0x2,0x55,0x3b, 0x2,0x55,0x2d, 0x2,0x55,0x2e, 0x1,0x6f,0x58, 0x2,0x55,0x4c, 0x1,0x6f,0x61, 0x2,0x55,0x3e, 0x2,0x55,0x43, 0x2,0x55,0x3d, 0x2,0x5b,0x3c, 0x2,0x55,0x39, 0x2,0x55,0x41, 0x2,0x55,0x3f, 0x2,0x55,0x32, 0x2,0x55,0x2c, 0x2,0x55,0x47, 0x1,0x6f,0x60, 0x2,0x55,0x48, 0x3,0x4f,0x48, 0x2,0x55,0x42, 0x3,0x4f,0x49, 0x2,0x55,0x37, 0x2,0x55,0x35, 0x2,0x55,0x30, 0x3,0x4f,0x4b, 0x3,0x4f,0x4e, 0x3,0x4f,0x44, 0x2,0x55,0x38, 0x2,0x55,0x45, 0x2,0x55,0x34, 0x2,0x55,0x44, 0x2,0x55,0x4a, 0x3,0x4f,0x51, 0x4,0x4e,0x46, 0x1,0x6f,0x5c, 0x3,0x4f,0x45, 0x2,0x55,0x40, 0x2,0x55,0x46, 0x2,0x55,0x3c, 0x2,0x55,0x36, 0x1,0x6f,0x5b, 0x3,0x4f,0x52, 0x4,0x4e,0x44, 0x3,0x4f,0x4c, 0x2,0x4e,0x6e, 0x2,0x55,0x3a, 0x1,0x6f,0x62, 0x2,0x55,0x33, 0xf,0x52,0x6b, 0x3,0x4f,0x4d, 0x3,0x66,0x5b, 0x3,0x66,0x5c, 0x3,0x4a,0x30, 0x2,0x5b,0x41, 0x1,0x72,0x61, 0x2,0x5b,0x40, 0x2,0x5b,0x3e, 0x2,0x5b,0x50, 0x1,0x72,0x65, 0x3,0x53,0x35, 0x2,0x5b,0x4d, 0x2,0x5b,0x45, 0x2,0x5b,0x4f, 0x2,0x5b,0x37, 0x2,0x5b,0x43, 0x3,0x53,0x3d, 0x1,0x72,0x67, 0x3,0x53,0x3e, 0x2,0x5b,0x2f, 0x3,0x53,0x38, 0x2,0x5b,0x2d, 0x2,0x5b,0x4e, 0x3,0x53,0x32, 0x2,0x5b,0x4c, 0x2,0x5b,0x4b, 0x2,0x5b,0x3b, 0x2,0x5b,0x3a, 0x2,0x5b,0x30, 0x1,0x72,0x69, 0x4,0x54,0x43, 0x2,0x5b,0x36, 0x2,0x5b,0x3f, 0x2,0x5b,0x4a, 0x1,0x72,0x6c, 0x2,0x5b,0x51, 0x3,0x53,0x36, 0x1,0x75,0x73, 0x1,0x72,0x6e, 0x1,0x72,0x68, 0x2,0x5b,0x34, 0x3,0x53,0x37, 0x2,0x5b,0x3d, 0x2,0x5b,0x2c, 0x2,0x5b,0x2e, 0x1,0x72,0x5f, 0x1,0x72,0x6b, 0x1,0x72,0x64, 0x2,0x5b,0x35, 0x2,0x5b,0x44, 0x2,0x55,0x4b, 0x1,0x72,0x6a, 0x2,0x5b,0x2b, 0x1,0x75,0x6e, 0x2,0x5b,0x46, 0x2,0x5b,0x49, 0x1,0x72,0x66, 0x3,0x53,0x3b, 0x2,0x5b,0x39, 0x1,0x72,0x6d, 0x1,0x72,0x63, 0x3,0x53,0x3c, 0x3,0x53,0x39, 0x3,0x53,0x3a, 0x1,0x72,0x62, 0x2,0x5b,0x42, 0x2,0x5b,0x48, 0x1,0x72,0x60, 0x4,0x54,0x45, 0x2,0x5b,0x32, 0x2,0x5b,0x47, 0xf,0x58,0x59, 0xf,0x58,0x48, 0x2,0x5b,0x33, 0x7,0x34,0x63, 0x3,0x66,0x5d, 0xf,0x58,0x55, 0x3,0x66,0x5e, 0x4,0x54,0x49, 0x3,0x53,0x31, 0x2,0x5b,0x38, 0x2,0x5f,0x7e, 0x3,0x56,0x65, 0x2,0x60,0x25, 0x1,0x75,0x70, 0x1,0x75,0x72, 0x2,0x60,0x2b, 0x1,0x75,0x6c, 0x2,0x60,0x39, 0x2,0x60,0x31, 0x2,0x60,0x26, 0x2,0x60,0x27, 0x2,0x60,0x30, 0x3,0x56,0x66, 0x1,0x75,0x79, 0x2,0x60,0x2f, 0x2,0x5f,0x7d, 0x2,0x60,0x2e, 0x2,0x60,0x22, 0x2,0x60,0x3a, 0x1,0x75,0x78, 0x1,0x75,0x76, 0x2,0x60,0x23, 0x3,0x56,0x5d, 0x2,0x60,0x36, 0x3,0x56,0x67, 0x2,0x60,0x28, 0x2,0x60,0x35, 0x3,0x56,0x64, 0x2,0x60,0x37, 0x2,0x5f,0x7c, 0x1,0x75,0x71, 0x3,0x56,0x5b, 0x2,0x60,0x38, 0x3,0x56,0x68, 0x3,0x56,0x5e, 0x2,0x60,0x2c, 0x3,0x56,0x6b, 0x1,0x75,0x75, 0x2,0x60,0x29, 0x3,0x56,0x61, 0x4,0x59,0x49, 0x1,0x75,0x77, 0x2,0x60,0x32, 0x3,0x56,0x62, 0x3,0x56,0x63, 0x3,0x56,0x5f, 0x1,0x75,0x6f, 0x2,0x60,0x24, 0x2,0x60,0x33, 0x3,0x56,0x5c, 0x2,0x60,0x2d, 0x2,0x5b,0x31, 0x2,0x60,0x34, 0x2,0x60,0x21, 0x3,0x56,0x60, 0x1,0x75,0x74, 0x3,0x56,0x6a, 0x2,0x64,0x2f, 0x4,0x59,0x47, 0x1,0x75,0x6d, 0x2,0x5f,0x7a, 0x4,0x59,0x46, 0xf,0x5d,0x41, 0x3,0x66,0x5f, 0xf,0x5d,0x39, 0x2,0x64,0x2c, 0x2,0x64,0x25, 0x1,0x77,0x54, 0x3,0x59,0x43, 0x2,0x63,0x7e, 0x2,0x64,0x30, 0x2,0x64,0x27, 0x2,0x60,0x2a, 0x3,0x59,0x40, 0x2,0x64,0x32, 0x2,0x64,0x21, 0x3,0x59,0x42, 0x1,0x77,0x53, 0x2,0x64,0x2b, 0x1,0x77,0x55, 0x1,0x77,0x5d, 0x1,0x77,0x5b, 0x2,0x64,0x2d, 0x1,0x77,0x5c, 0x2,0x64,0x23, 0x3,0x59,0x49, 0x2,0x64,0x24, 0x2,0x64,0x29, 0x2,0x64,0x2e, 0x3,0x59,0x3e, 0x2,0x5f,0x79, 0x1,0x77,0x56, 0x2,0x64,0x37, 0x2,0x64,0x34, 0x2,0x67,0x61, 0x2,0x64,0x2a, 0x2,0x64,0x26, 0x2,0x64,0x35, 0x2,0x67,0x56, 0x2,0x64,0x28, 0x4,0x5e,0x31, 0x1,0x77,0x59, 0x3,0x59,0x44, 0x1,0x77,0x58, 0x2,0x5f,0x7b, 0x1,0x77,0x5a, 0x2,0x64,0x31, 0x2,0x64,0x33, 0x1,0x77,0x57, 0x2,0x64,0x36, 0x2,0x63,0x7d, 0x4,0x5e,0x29, 0x2,0x64,0x22, 0x3,0x59,0x46, 0xf,0x61,0x33, 0x3,0x59,0x45, 0x3,0x66,0x61, 0x3,0x66,0x62, 0x3,0x66,0x60, 0xf,0x61,0x43, 0x2,0x67,0x5f, 0x3,0x5b,0x50, 0x2,0x67,0x4f, 0x1,0x79,0x38, 0x2,0x67,0x5d, 0x3,0x5b,0x44, 0x3,0x5b,0x45, 0x2,0x67,0x4d, 0x1,0x79,0x39, 0x4,0x61,0x67, 0x2,0x67,0x58, 0x3,0x5b,0x43, 0x2,0x67,0x54, 0x1,0x79,0x3e, 0x2,0x67,0x5e, 0x2,0x67,0x4e, 0x2,0x67,0x51, 0x1,0x79,0x36, 0x2,0x67,0x60, 0x3,0x5b,0x48, 0x2,0x67,0x59, 0x2,0x67,0x5c, 0x1,0x79,0x3c, 0x1,0x79,0x41, 0x1,0x79,0x3f, 0x2,0x67,0x55, 0x2,0x67,0x50, 0x3,0x5b,0x4d, 0x1,0x79,0x3a, 0x1,0x79,0x3b, 0x2,0x67,0x4c, 0x1,0x79,0x37, 0x3,0x5b,0x4f, 0x1,0x79,0x35, 0x1,0x79,0x3d, 0x2,0x67,0x5b, 0x1,0x79,0x40, 0x3,0x5b,0x4a, 0x2,0x67,0x57, 0x2,0x67,0x62, 0x1,0x79,0x42, 0x3,0x5b,0x41, 0x3,0x5b,0x42, 0x3,0x5b,0x4e, 0x2,0x67,0x53, 0x3,0x5b,0x47, 0x2,0x67,0x5a, 0x3,0x66,0x65, 0x3,0x66,0x63, 0x3,0x66,0x64, 0x3,0x5d,0x41, 0x3,0x5e,0x6a, 0x2,0x6a,0x41, 0x2,0x6a,0x50, 0x2,0x6a,0x43, 0x2,0x6a,0x4a, 0x2,0x67,0x52, 0x2,0x6a,0x48, 0x2,0x6a,0x37, 0x2,0x6a,0x4e, 0x1,0x7a,0x4e, 0x2,0x6a,0x3b, 0x2,0x6a,0x4d, 0x2,0x6a,0x42, 0x4,0x64,0x67, 0x3,0x5d,0x43, 0x1,0x7a,0x4d, 0x3,0x5d,0x3c, 0x3,0x5d,0x3f, 0x2,0x6a,0x52, 0x2,0x6a,0x44, 0x3,0x5d,0x3e, 0x2,0x6a,0x49, 0x2,0x6a,0x4c, 0x2,0x6a,0x35, 0x2,0x6a,0x4f, 0x2,0x6a,0x40, 0x2,0x6a,0x45, 0x2,0x6a,0x39, 0x2,0x6a,0x3d, 0x2,0x6a,0x51, 0x2,0x6a,0x47, 0x2,0x6a,0x36, 0x2,0x6a,0x3a, 0x2,0x6a,0x3c, 0x2,0x6a,0x46, 0x3,0x5d,0x3d, 0x1,0x7a,0x4c, 0x2,0x6a,0x3f, 0x3,0x5d,0x44, 0x3,0x5d,0x45, 0x3,0x5d,0x47, 0x4,0x64,0x6b, 0x3,0x5d,0x42, 0x3,0x5d,0x3a, 0x2,0x6a,0x38, 0x3,0x66,0x66, 0x3,0x66,0x67, 0x3,0x66,0x68, 0xf,0x66,0x57, 0x3,0x5d,0x46, 0x2,0x6a,0x3e, 0x2,0x6c,0x50, 0x2,0x6c,0x54, 0x1,0x7b,0x3b, 0x2,0x6c,0x56, 0x3,0x5e,0x6d, 0x1,0x7b,0x35, 0x4,0x64,0x6f, 0x2,0x6c,0x52, 0x2,0x6c,0x58, 0x1,0x7b,0x3a, 0x1,0x7b,0x36, 0x4,0x67,0x5c, 0x1,0x7b,0x37, 0x2,0x6c,0x4f, 0x2,0x6c,0x55, 0x1,0x7b,0x39, 0x2,0x6c,0x53, 0x1,0x7b,0x38, 0x2,0x6c,0x4e, 0x2,0x6a,0x4b, 0x2,0x6c,0x51, 0x4,0x67,0x62, 0x2,0x6c,0x4d, 0x2,0x6c,0x57, 0x3,0x5f,0x69, 0x3,0x5f,0x6e, 0x1,0x7b,0x7b, 0x2,0x6e,0x3c, 0x2,0x6e,0x3f, 0x2,0x6e,0x3b, 0x2,0x6e,0x3d, 0x2,0x6e,0x3e, 0x2,0x6e,0x38, 0x2,0x6e,0x39, 0x2,0x6e,0x36, 0x3,0x5f,0x6a, 0x3,0x5f,0x6c, 0x2,0x6e,0x3a, 0x2,0x6e,0x37, 0x1,0x7b,0x7c, 0x1,0x7b,0x7d, 0x3,0x5f,0x6b, 0x2,0x6f,0x59, 0x3,0x60,0x52, 0x2,0x6f,0x5b, 0x4,0x6b,0x29, 0x5,0x76,0x5d, 0x3,0x60,0x55, 0x3,0x60,0x54, 0x3,0x60,0x56, 0x2,0x6f,0x5a, 0x2,0x6f,0x5c, 0x3,0x60,0x4f, 0x1,0x7c,0x4c, 0x3,0x60,0x53, 0x2,0x6f,0x58, 0x1,0x7c,0x4b, 0x1,0x7c,0x4d, 0x3,0x60,0x57, 0x3,0x66,0x6a, 0x3,0x66,0x69, 0x2,0x70,0x59, 0x2,0x70,0x5a, 0x1,0x7c,0x6f, 0x2,0x70,0x58, 0x3,0x61,0x22, 0x2,0x71,0x42, 0x2,0x71,0x41, 0x2,0x71,0x43, 0x1,0x7d,0x2c, 0x2,0x71,0x44, 0x1,0x7d,0x2b, 0x2,0x71,0x45, 0x2,0x71,0x61, 0x2,0x71,0x64, 0x2,0x71,0x63, 0x1,0x7d,0x35, 0x2,0x71,0x62, 0x4,0x6d,0x62, 0x3,0x61,0x6f, 0x3,0x62,0x23, 0x1,0x7d,0x3f, 0x1,0x7d,0x3d, 0x1,0x7d,0x3e, 0x1,0x7d,0x44, 0x2,0x72,0x30, 0x2,0x72,0x31, 0x2,0x72,0x2f, 0x2,0x72,0x37, 0x3,0x62,0x36, 0x1,0x4f,0x5b, 0x4,0x25,0x2b, 0x4,0x30,0x3a, 0x2,0x3a,0x28, 0x2,0x41,0x3f, 0x2,0x55,0x4e, 0x2,0x67,0x63, 0x5,0x71,0x56, 0x1,0x4f,0x5c, 0x3,0x2f,0x40, 0x1,0x53,0x6d, 0x1,0x58,0x60, 0x4,0x30,0x3b, 0x3,0x34,0x32, 0x2,0x3a,0x29, 0x3,0x39,0x5c, 0x2,0x3a,0x2a, 0x1,0x5d,0x70, 0x1,0x62,0x64, 0x2,0x41,0x41, 0x2,0x41,0x40, 0x1,0x62,0x68, 0x1,0x62,0x63, 0x2,0x41,0x42, 0x1,0x62,0x65, 0x1,0x62,0x67, 0x1,0x62,0x66, 0x1,0x62,0x62, 0x3,0x3f,0x6c, 0xf,0x3f,0x7e, 0x3,0x66,0x6b, 0x1,0x67,0x50, 0x3,0x45,0x3c, 0x3,0x45,0x3a, 0x2,0x48,0x56, 0x2,0x48,0x54, 0x4,0x41,0x53, 0x2,0x48,0x55, 0x2,0x48,0x53, 0xf,0x45,0x7b, 0x1,0x6b,0x5b, 0x3,0x4a,0x3d, 0x1,0x6b,0x5e, 0x1,0x6b,0x60, 0x1,0x6b,0x5f, 0x4,0x48,0x22, 0x3,0x4a,0x3e, 0x1,0x6b,0x5c, 0x1,0x6b,0x5d, 0x2,0x55,0x50, 0x2,0x55,0x4f, 0x1,0x6f,0x64, 0x2,0x55,0x51, 0x3,0x4f,0x53, 0x2,0x55,0x52, 0x1,0x6f,0x65, 0x3,0x4f,0x55, 0x3,0x4f,0x56, 0x4,0x4e,0x4a, 0x2,0x5b,0x59, 0x2,0x5b,0x57, 0x2,0x60,0x40, 0x3,0x53,0x42, 0x2,0x5b,0x55, 0x2,0x5b,0x56, 0x1,0x72,0x6f, 0x2,0x5b,0x52, 0x2,0x5b,0x5a, 0x2,0x5b,0x54, 0x2,0x5b,0x58, 0x2,0x60,0x3c, 0x3,0x53,0x44, 0x3,0x53,0x40, 0x2,0x60,0x3e, 0x3,0x56,0x6d, 0x2,0x60,0x3f, 0x1,0x75,0x7e, 0x2,0x60,0x3b, 0x1,0x75,0x7d, 0x2,0x60,0x3d, 0x1,0x75,0x7a, 0x1,0x75,0x7b, 0x1,0x75,0x7c, 0x2,0x5b,0x53, 0x3,0x66,0x6c, 0x1,0x77,0x60, 0x2,0x64,0x3a, 0x2,0x64,0x38, 0x2,0x64,0x39, 0x1,0x77,0x5e, 0x1,0x77,0x61, 0x1,0x77,0x5f, 0x3,0x59,0x4b, 0x3,0x59,0x4a, 0x7,0x4b,0x40, 0x2,0x67,0x64, 0x2,0x67,0x65, 0x1,0x79,0x43, 0x3,0x5b,0x53, 0x2,0x6a,0x53, 0x2,0x6a,0x55, 0x2,0x6a,0x54, 0x1,0x7a,0x4f, 0x1,0x7b,0x3c, 0x2,0x6c,0x5b, 0x2,0x6c,0x5a, 0x2,0x6c,0x59, 0xf,0x68,0x72, 0x3,0x66,0x6d, 0xf,0x25,0x39, 0x1,0x4f,0x5d, 0x3,0x21,0x43, 0x2,0x21,0x69, 0x2,0x22,0x78, 0x1,0x48,0x6a, 0x2,0x22,0x76, 0x2,0x22,0x79, 0x2,0x22,0x77, 0x4,0x25,0x2e, 0x3,0x27,0x3b, 0x3,0x27,0x3a, 0x2,0x25,0x2e, 0x3,0x27,0x3f, 0x1,0x4b,0x62, 0x3,0x27,0x3c, 0x1,0x4b,0x63, 0x2,0x25,0x30, 0x1,0x4b,0x60, 0x2,0x25,0x2f, 0x2,0x25,0x2d, 0x1,0x4b,0x61, 0x1,0x4b,0x5f, 0x3,0x27,0x3d, 0x3,0x27,0x3e, 0x3,0x2a,0x79, 0x4,0x28,0x33, 0x2,0x28,0x78, 0x2,0x28,0x7b, 0x1,0x4f,0x60, 0x2,0x28,0x7a, 0x2,0x28,0x79, 0x3,0x2a,0x7c, 0x1,0x4f,0x5f, 0x1,0x4f,0x5e, 0x3,0x2a,0x7b, 0x1,0x4f,0x62, 0x2,0x28,0x7c, 0x1,0x4f,0x61, 0x2,0x2d,0x67, 0x1,0x53,0x6f, 0x1,0x53,0x70, 0x1,0x53,0x71, 0x2,0x2d,0x68, 0x2,0x2d,0x64, 0x1,0x53,0x6e, 0x2,0x2d,0x65, 0x4,0x2b,0x5d, 0x2,0x2d,0x66, 0x2,0x2d,0x63, 0x4,0x2b,0x5b, 0x3,0x34,0x36, 0x4,0x30,0x3f, 0x1,0x58,0x67, 0x3,0x34,0x34, 0x3,0x39,0x5e, 0x1,0x58,0x64, 0x2,0x33,0x48, 0x1,0x58,0x65, 0x1,0x58,0x68, 0x2,0x33,0x49, 0x3,0x34,0x33, 0x1,0x58,0x63, 0x1,0x58,0x61, 0x1,0x58,0x62, 0x1,0x58,0x66, 0x1,0x5d,0x71, 0x2,0x3a,0x2d, 0x1,0x5d,0x79, 0x2,0x3a,0x2c, 0x3,0x39,0x61, 0x2,0x3a,0x2f, 0x1,0x5d,0x75, 0x2,0x3a,0x2e, 0x1,0x62,0x70, 0x1,0x5d,0x73, 0x1,0x5d,0x76, 0x1,0x5d,0x72, 0x1,0x5d,0x77, 0x1,0x5d,0x78, 0x1,0x5d,0x74, 0x3,0x39,0x65, 0x3,0x3f,0x71, 0x2,0x3a,0x2b, 0x1,0x62,0x6c, 0x2,0x41,0x44, 0x3,0x3f,0x72, 0x2,0x41,0x48, 0x3,0x3f,0x73, 0x3,0x3f,0x75, 0x2,0x41,0x47, 0x1,0x62,0x71, 0x1,0x62,0x6d, 0x1,0x62,0x6e, 0x2,0x41,0x43, 0x2,0x41,0x45, 0x2,0x41,0x46, 0x1,0x62,0x69, 0x1,0x62,0x6b, 0x3,0x3f,0x70, 0x1,0x62,0x6f, 0x1,0x62,0x6a, 0x3,0x45,0x40, 0x2,0x48,0x59, 0x2,0x48,0x57, 0x2,0x48,0x58, 0x1,0x67,0x52, 0x1,0x67,0x53, 0x3,0x45,0x42, 0x2,0x48,0x5a, 0x1,0x67,0x51, 0x1,0x6b,0x61, 0x4,0x48,0x24, 0x1,0x6b,0x63, 0x1,0x6b,0x62, 0x3,0x4a,0x45, 0x2,0x4f,0x23, 0x3,0x4a,0x46, 0x3,0x4a,0x44, 0x2,0x4f,0x24, 0x2,0x55,0x54, 0x3,0x4f,0x5a, 0x2,0x55,0x53, 0x3,0x4f,0x5b, 0x4,0x54,0x52, 0x1,0x72,0x70, 0x1,0x72,0x71, 0x2,0x5b,0x5b, 0x1,0x72,0x72, 0x3,0x53,0x48, 0x2,0x60,0x43, 0x3,0x56,0x70, 0x2,0x60,0x41, 0x3,0x56,0x6f, 0x2,0x60,0x42, 0x1,0x76,0x21, 0x3,0x56,0x71, 0x2,0x64,0x3b, 0x1,0x79,0x44, 0x3,0x5d,0x49, 0x3,0x2a,0x7d, 0x3,0x53,0x49, 0x1,0x76,0x22, 0x1,0x4f,0x63, 0x4,0x30,0x41, 0x1,0x58,0x69, 0x2,0x33,0x4a, 0x3,0x34,0x39, 0xf,0x32,0x6f, 0x2,0x3a,0x30, 0x1,0x5d,0x7a, 0x1,0x62,0x72, 0x2,0x41,0x49, 0x2,0x41,0x4b, 0x1,0x62,0x74, 0x1,0x62,0x73, 0x1,0x62,0x75, 0x1,0x62,0x76, 0x2,0x41,0x4a, 0x1,0x67,0x56, 0x1,0x67,0x57, 0x1,0x67,0x55, 0x1,0x6b,0x64, 0x1,0x67,0x54, 0x2,0x48,0x5b, 0x4,0x41,0x57, 0x3,0x4a,0x47, 0x3,0x4a,0x49, 0x1,0x6b,0x65, 0x2,0x55,0x55, 0x2,0x5b,0x5c, 0x1,0x72,0x73, 0x1,0x76,0x23, 0x2,0x64,0x3c, 0x2,0x64,0x40, 0x1,0x77,0x64, 0x2,0x64,0x3d, 0x1,0x77,0x65, 0x1,0x77,0x63, 0x2,0x64,0x41, 0x1,0x77,0x66, 0x2,0x64,0x3f, 0x2,0x67,0x66, 0x1,0x77,0x62, 0x1,0x79,0x45, 0x3,0x5e,0x70, 0x2,0x70,0x5b, 0x3,0x61,0x25, 0x3,0x62,0x2f, 0x1,0x4f,0x64, 0x1,0x5d,0x7c, 0x1,0x5d,0x7b, 0xf,0x39,0x2a, 0x3,0x3f,0x7e, 0x3,0x3f,0x7c, 0x3,0x3f,0x7b, 0x1,0x62,0x77, 0x2,0x41,0x4d, 0x2,0x41,0x4c, 0x1,0x62,0x78, 0x3,0x45,0x46, 0x2,0x48,0x5f, 0x1,0x67,0x5b, 0x1,0x67,0x58, 0x2,0x48,0x5e, 0x1,0x67,0x5a, 0x2,0x48,0x5c, 0x1,0x67,0x59, 0x3,0x45,0x47, 0x2,0x48,0x5d, 0x2,0x4f,0x25, 0x1,0x6b,0x66, 0x2,0x55,0x58, 0x5,0x52,0x3b, 0x1,0x6f,0x66, 0x2,0x55,0x56, 0x1,0x6f,0x67, 0x1,0x6f,0x68, 0x2,0x55,0x57, 0x1,0x6f,0x69, 0x3,0x4f,0x60, 0x2,0x5b,0x5d, 0x3,0x53,0x50, 0x1,0x72,0x77, 0x1,0x72,0x74, 0x1,0x72,0x79, 0x2,0x5b,0x5f, 0x1,0x72,0x75, 0x2,0x5b,0x5e, 0x1,0x72,0x78, 0x3,0x53,0x4d, 0x3,0x53,0x4c, 0x1,0x72,0x76, 0x3,0x53,0x51, 0x2,0x60,0x46, 0x2,0x60,0x48, 0x3,0x56,0x74, 0x3,0x56,0x75, 0x1,0x76,0x24, 0x2,0x60,0x47, 0x1,0x76,0x25, 0x2,0x60,0x45, 0x2,0x60,0x44, 0x4,0x5e,0x38, 0x2,0x64,0x43, 0x2,0x64,0x42, 0x1,0x77,0x67, 0x2,0x64,0x44, 0x2,0x67,0x6b, 0x1,0x79,0x47, 0x2,0x67,0x6a, 0x2,0x67,0x67, 0x1,0x79,0x46, 0x2,0x67,0x68, 0x2,0x67,0x69, 0x2,0x6a,0x56, 0x2,0x6a,0x57, 0x1,0x7a,0x50, 0x3,0x5d,0x4f, 0x1,0x7b,0x3f, 0x3,0x5d,0x4c, 0x3,0x5d,0x4e, 0x2,0x6c,0x5c, 0x3,0x5e,0x72, 0x3,0x5e,0x71, 0x1,0x7b,0x3d, 0x1,0x7b,0x3e, 0x2,0x6c,0x5d, 0x3,0x66,0x6e, 0x3,0x5f,0x71, 0x1,0x7b,0x7e, 0x1,0x7c,0x21, 0x2,0x6e,0x40, 0x3,0x5f,0x72, 0x3,0x60,0x59, 0x1,0x7c,0x70, 0x2,0x70,0x5d, 0x1,0x7c,0x72, 0x3,0x61,0x26, 0x2,0x70,0x5c, 0x2,0x70,0x5e, 0x1,0x7c,0x71, 0x2,0x71,0x46, 0x4,0x6d,0x64, 0x2,0x71,0x7b, 0x3,0x66,0x6f, 0x3,0x62,0x45, 0x3,0x2a,0x7e, 0x1,0x4f,0x65, 0x3,0x45,0x49, 0x1,0x67,0x5c, 0x4,0x48,0x35, 0x2,0x4f,0x26, 0x3,0x4a,0x4c, 0x2,0x55,0x59, 0x1,0x72,0x7a, 0x1,0x72,0x7b, 0x3,0x59,0x4f, 0x1,0x4f,0x66, 0x3,0x40,0x21, 0x1,0x6f,0x6a, 0x1,0x79,0x48, 0x1,0x53,0x72, 0x3,0x2b,0x21, 0x3,0x4a,0x4e, 0x1,0x72,0x7c, 0x3,0x5e,0x73, 0x1,0x7c,0x4e, 0x1,0x53,0x73, 0x2,0x3a,0x31, 0x4,0x3b,0x77, 0x2,0x41,0x4e, 0x3,0x40,0x24, 0x2,0x41,0x50, 0x3,0x40,0x22, 0x2,0x41,0x4f, 0x2,0x48,0x63, 0x2,0x48,0x60, 0x1,0x67,0x5d, 0x6,0x5a,0x24, 0x1,0x67,0x5e, 0x2,0x48,0x61, 0x2,0x48,0x62, 0x3,0x45,0x4b, 0x2,0x4f,0x28, 0x2,0x4f,0x2d, 0x1,0x6b,0x67, 0x2,0x4f,0x27, 0x2,0x4f,0x29, 0x2,0x4f,0x30, 0x2,0x4f,0x2b, 0x2,0x4f,0x2f, 0x2,0x4f,0x2c, 0x2,0x4f,0x2a, 0x2,0x4f,0x2e, 0x1,0x6b,0x68, 0x3,0x4f,0x62, 0x2,0x55,0x5c, 0x3,0x4f,0x63, 0x2,0x55,0x5a, 0x1,0x6f,0x6c, 0x3,0x4f,0x64, 0x1,0x6f,0x6b, 0x2,0x55,0x5b, 0x1,0x6f,0x6d, 0x3,0x53,0x53, 0x2,0x5b,0x62, 0x4,0x54,0x5f, 0x4,0x54,0x67, 0x2,0x5b,0x61, 0x1,0x72,0x7d, 0x2,0x5b,0x60, 0x2,0x60,0x49, 0x3,0x56,0x7a, 0x2,0x60,0x4b, 0x2,0x60,0x4d, 0x2,0x60,0x4c, 0x3,0x56,0x7b, 0x1,0x76,0x26, 0x2,0x60,0x4a, 0x2,0x64,0x4b, 0x1,0x77,0x68, 0x2,0x64,0x49, 0x2,0x64,0x4c, 0x1,0x77,0x69, 0x4,0x5e,0x43, 0x2,0x64,0x47, 0x3,0x59,0x50, 0x2,0x64,0x4a, 0x2,0x64,0x48, 0x2,0x64,0x45, 0x1,0x77,0x6a, 0x2,0x64,0x46, 0x4,0x61,0x7c, 0x3,0x5b,0x5f, 0x3,0x5b,0x5d, 0x2,0x67,0x6c, 0x3,0x5b,0x5e, 0x3,0x5b,0x60, 0x2,0x67,0x6e, 0x2,0x67,0x6d, 0x3,0x5d,0x50, 0x2,0x6a,0x58, 0x3,0x5d,0x51, 0x2,0x6a,0x59, 0x4,0x67,0x71, 0x3,0x5e,0x75, 0x3,0x5e,0x74, 0x2,0x6c,0x5e, 0x3,0x5f,0x73, 0x1,0x7c,0x23, 0x4,0x69,0x5e, 0x1,0x7c,0x22, 0x2,0x6f,0x5d, 0x2,0x6f,0x5e, 0x1,0x7c,0x73, 0x2,0x70,0x5f, 0x3,0x61,0x28, 0x1,0x7d,0x36, 0x3,0x62,0x3b, 0x1,0x53,0x74, 0x1,0x62,0x79, 0x2,0x4f,0x32, 0x2,0x4f,0x31, 0x2,0x55,0x5e, 0x2,0x55,0x5d, 0x4,0x4e,0x57, 0x3,0x53,0x55, 0x1,0x76,0x27, 0x2,0x60,0x4f, 0x2,0x60,0x4e, 0x2,0x64,0x4f, 0x2,0x64,0x4d, 0x2,0x64,0x50, 0x2,0x64,0x4e, 0x3,0x59,0x51, 0x4,0x65,0x29, 0x1,0x79,0x49, 0x2,0x67,0x6f, 0x2,0x67,0x70, 0x2,0x67,0x71, 0x4,0x65,0x27, 0x2,0x6c,0x5f, 0x3,0x5e,0x76, 0x2,0x6e,0x41, 0x3,0x61,0x29, 0x2,0x70,0x60, 0x1,0x53,0x75, 0x3,0x45,0x4f, 0x3,0x4f,0x65, 0x2,0x5b,0x63, 0x2,0x60,0x50, 0x3,0x5b,0x61, 0x1,0x53,0x76, 0x4,0x41,0x63, 0x3,0x45,0x50, 0x1,0x6b,0x69, 0x4,0x48,0x46, 0x2,0x5b,0x64, 0x1,0x77,0x6b, 0x2,0x64,0x51, 0x1,0x79,0x4a, 0x3,0x5d,0x53, 0x2,0x6a,0x5a, 0x2,0x6a,0x5b, 0x1,0x7b,0x40, 0x2,0x6f,0x5f, 0x1,0x53,0x77, 0x1,0x5e,0x21, 0x1,0x5e,0x22, 0x2,0x3a,0x32, 0x1,0x62,0x7a, 0x1,0x62,0x7b, 0x2,0x41,0x51, 0x1,0x62,0x7c, 0x4,0x41,0x68, 0x1,0x67,0x62, 0x3,0x45,0x52, 0x1,0x67,0x64, 0x2,0x48,0x65, 0x2,0x48,0x66, 0x2,0x48,0x64, 0x1,0x67,0x5f, 0x1,0x67,0x60, 0x1,0x67,0x63, 0x1,0x67,0x61, 0x3,0x4a,0x54, 0x3,0x4a,0x55, 0x2,0x4f,0x33, 0x1,0x6b,0x6a, 0x1,0x6b,0x6b, 0x3,0x4a,0x52, 0x3,0x4a,0x56, 0x2,0x55,0x65, 0x1,0x6f,0x70, 0x2,0x55,0x60, 0x2,0x55,0x5f, 0x3,0x4f,0x69, 0x2,0x55,0x64, 0x1,0x6f,0x6e, 0x3,0x4f,0x67, 0x4,0x4e,0x5a, 0x1,0x73,0x26, 0x4,0x54,0x70, 0x2,0x55,0x61, 0x2,0x55,0x66, 0x2,0x55,0x63, 0x2,0x55,0x62, 0x3,0x4f,0x66, 0x1,0x6f,0x6f, 0x1,0x73,0x24, 0x3,0x53,0x5c, 0x2,0x5b,0x66, 0x1,0x72,0x7e, 0x3,0x53,0x59, 0x2,0x5b,0x67, 0x3,0x53,0x5a, 0x3,0x52,0x28, 0x2,0x5b,0x65, 0x3,0x53,0x58, 0x1,0x73,0x23, 0x1,0x73,0x21, 0x1,0x73,0x25, 0x3,0x53,0x5d, 0x1,0x73,0x22, 0x3,0x53,0x5b, 0x3,0x53,0x5f, 0x4,0x5e,0x4f, 0x3,0x59,0x5b, 0x3,0x57,0x26, 0x2,0x60,0x51, 0x4,0x59,0x70, 0x2,0x60,0x56, 0x2,0x60,0x52, 0x2,0x60,0x55, 0x1,0x76,0x28, 0x3,0x57,0x28, 0x2,0x5e,0x41, 0x2,0x60,0x54, 0x2,0x60,0x53, 0x3,0x59,0x59, 0x1,0x77,0x6e, 0x1,0x77,0x6c, 0x1,0x77,0x6f, 0x1,0x77,0x6d, 0x2,0x64,0x52, 0x2,0x64,0x53, 0x2,0x64,0x54, 0x1,0x77,0x70, 0x3,0x59,0x56, 0x3,0x59,0x58, 0x3,0x5b,0x65, 0x2,0x67,0x75, 0x1,0x79,0x4c, 0x2,0x67,0x73, 0x4,0x62,0x30, 0x1,0x79,0x4d, 0x2,0x67,0x72, 0x2,0x67,0x74, 0x1,0x79,0x4b, 0x2,0x6a,0x5f, 0x2,0x6a,0x5c, 0x4,0x65,0x2c, 0x2,0x6a,0x5d, 0x2,0x6a,0x5e, 0x2,0x6c,0x60, 0x1,0x7b,0x42, 0x3,0x5e,0x78, 0x1,0x7b,0x41, 0x3,0x5e,0x77, 0x2,0x6e,0x43, 0x2,0x6e,0x42, 0x1,0x7c,0x24, 0x3,0x60,0x5d, 0x3,0x60,0x5e, 0x3,0x60,0x5c, 0x1,0x7c,0x4f, 0x1,0x7c,0x74, 0x1,0x7d,0x2d, 0x2,0x71,0x47, 0x2,0x71,0x7c, 0x2,0x71,0x7d, 0x1,0x53,0x78, 0x2,0x41,0x52, 0x4,0x41,0x71, 0x2,0x48,0x67, 0x2,0x4f,0x34, 0x2,0x4f,0x35, 0x1,0x6b,0x6c, 0x4,0x48,0x57, 0x1,0x6b,0x6d, 0x2,0x55,0x67, 0x1,0x6f,0x71, 0x3,0x53,0x61, 0x1,0x76,0x29, 0x3,0x57,0x2a, 0x2,0x64,0x55, 0x3,0x59,0x5c, 0x1,0x77,0x71, 0x2,0x67,0x78, 0x1,0x79,0x4e, 0x2,0x67,0x77, 0x2,0x67,0x79, 0x2,0x67,0x76, 0x2,0x6c,0x63, 0x2,0x6a,0x60, 0x2,0x6a,0x61, 0x3,0x5d,0x56, 0x1,0x7a,0x51, 0x2,0x6c,0x62, 0x3,0x5e,0x7b, 0x3,0x5e,0x79, 0x2,0x6c,0x61, 0x3,0x5e,0x7a, 0x2,0x6e,0x44, 0x2,0x71,0x7e, 0x3,0x62,0x25, 0x1,0x53,0x79, 0x3,0x5e,0x7c, 0x3,0x62,0x26, 0x1,0x53,0x7a, 0x3,0x39,0x67, 0x1,0x58,0x6a, 0x2,0x33,0x4b, 0x3,0x66,0x70, 0x2,0x3a,0x33, 0x3,0x39,0x68, 0x1,0x62,0x7d, 0x1,0x63,0x22, 0x1,0x62,0x7e, 0x2,0x41,0x53, 0x3,0x45,0x5b, 0x1,0x63,0x24, 0x1,0x63,0x21, 0x3,0x40,0x2b, 0x3,0x45,0x5c, 0x1,0x63,0x23, 0x3,0x45,0x54, 0x1,0x67,0x66, 0x3,0x45,0x59, 0x2,0x48,0x68, 0x3,0x45,0x57, 0x3,0x4a,0x5d, 0x2,0x48,0x69, 0x2,0x55,0x69, 0x4,0x41,0x7b, 0x1,0x67,0x65, 0x1,0x67,0x67, 0x1,0x67,0x68, 0x3,0x45,0x58, 0x2,0x4f,0x37, 0x3,0x4a,0x5e, 0x2,0x4f,0x36, 0x1,0x6b,0x6e, 0x5,0x4b,0x4c, 0x1,0x6b,0x6f, 0x3,0x4a,0x5b, 0x2,0x4f,0x38, 0x2,0x55,0x68, 0x1,0x6b,0x71, 0x1,0x6f,0x72, 0x4,0x4e,0x63, 0x1,0x6b,0x70, 0x3,0x66,0x7a, 0x1,0x73,0x27, 0x2,0x55,0x6a, 0x1,0x6f,0x74, 0x1,0x6f,0x73, 0x2,0x55,0x6b, 0x2,0x55,0x6e, 0x2,0x55,0x6c, 0x2,0x55,0x6d, 0x1,0x6f,0x75, 0x3,0x4f,0x6b, 0x1,0x73,0x2c, 0x1,0x73,0x2a, 0x3,0x53,0x65, 0x3,0x53,0x66, 0x1,0x73,0x29, 0x2,0x5b,0x69, 0x3,0x53,0x64, 0x1,0x73,0x2b, 0x3,0x53,0x62, 0x3,0x53,0x63, 0x2,0x5b,0x68, 0x2,0x60,0x57, 0x4,0x54,0x7e, 0x2,0x5b,0x6a, 0x1,0x73,0x28, 0x2,0x5b,0x6b, 0x2,0x60,0x5a, 0x2,0x60,0x58, 0x2,0x60,0x59, 0x2,0x60,0x5e, 0x1,0x77,0x75, 0x2,0x60,0x5d, 0x2,0x60,0x60, 0x2,0x60,0x5f, 0x2,0x60,0x5c, 0x2,0x60,0x5b, 0x4,0x55,0x21, 0x1,0x76,0x2a, 0x3,0x59,0x62, 0x4,0x5a,0x29, 0x3,0x59,0x61, 0x3,0x59,0x66, 0x2,0x64,0x58, 0x3,0x59,0x65, 0x2,0x64,0x57, 0x1,0x77,0x74, 0x1,0x77,0x72, 0x1,0x77,0x73, 0x3,0x59,0x63, 0x2,0x64,0x56, 0x3,0x66,0x71, 0x2,0x67,0x7c, 0x3,0x5b,0x69, 0x1,0x79,0x4f, 0x4,0x62,0x38, 0x2,0x67,0x7b, 0x2,0x67,0x7a, 0x1,0x79,0x50, 0x4,0x65,0x3a, 0x2,0x6a,0x66, 0x2,0x6a,0x65, 0x3,0x5d,0x58, 0x2,0x6a,0x63, 0x3,0x5e,0x7e, 0x2,0x6a,0x62, 0x1,0x7a,0x53, 0x1,0x7a,0x52, 0x2,0x6a,0x67, 0x2,0x6e,0x45, 0x1,0x7c,0x25, 0x2,0x6c,0x65, 0x1,0x7b,0x43, 0x2,0x6c,0x64, 0x2,0x6a,0x64, 0x3,0x5f,0x78, 0x2,0x6e,0x46, 0x1,0x7c,0x50, 0x3,0x61,0x2a, 0x1,0x7d,0x2e, 0x2,0x71,0x48, 0x4,0x6e,0x24, 0x2,0x72,0x21, 0x1,0x53,0x7b, 0x2,0x3a,0x34, 0x2,0x60,0x61, 0x1,0x53,0x7c, 0x3,0x45,0x5f, 0x5,0x4b,0x4e, 0x2,0x4f,0x3a, 0x2,0x4f,0x39, 0x2,0x5b,0x6c, 0x5,0x5a,0x26, 0x3,0x53,0x68, 0x2,0x60,0x63, 0x3,0x57,0x30, 0x2,0x60,0x62, 0x3,0x59,0x67, 0x1,0x77,0x76, 0x2,0x67,0x7d, 0x2,0x67,0x7e, 0x1,0x7a,0x54, 0x3,0x5f,0x21, 0x3,0x60,0x60, 0x2,0x72,0x22, 0x1,0x58,0x6b, 0x1,0x63,0x26, 0x1,0x63,0x25, 0x2,0x48,0x6a, 0x2,0x48,0x6c, 0x1,0x67,0x6a, 0x2,0x48,0x6b, 0x1,0x67,0x69, 0x1,0x67,0x6b, 0x2,0x48,0x6d, 0x3,0x4a,0x63, 0x3,0x4a,0x62, 0x3,0x4a,0x66, 0x2,0x4f,0x3c, 0x2,0x4f,0x3e, 0x2,0x4f,0x3d, 0x3,0x4a,0x61, 0x2,0x4f,0x40, 0x3,0x4a,0x60, 0x3,0x4a,0x6c, 0x3,0x4a,0x64, 0x1,0x6b,0x72, 0x2,0x4f,0x3f, 0x2,0x4f,0x3b, 0x3,0x4a,0x6a, 0x4,0x48,0x60, 0x2,0x4f,0x41, 0x3,0x4f,0x73, 0x2,0x55,0x75, 0x3,0x4f,0x6d, 0x2,0x55,0x78, 0x2,0x55,0x7a, 0x2,0x55,0x70, 0x2,0x55,0x74, 0x2,0x55,0x71, 0x1,0x6f,0x77, 0x1,0x6f,0x7a, 0x1,0x6f,0x7c, 0x2,0x55,0x72, 0x2,0x55,0x73, 0x1,0x6f,0x7b, 0x2,0x55,0x76, 0x2,0x55,0x79, 0x2,0x55,0x77, 0x1,0x6f,0x7d, 0x3,0x4f,0x6e, 0x1,0x6f,0x79, 0x2,0x55,0x6f, 0x1,0x6f,0x76, 0x3,0x4f,0x72, 0x1,0x6f,0x78, 0x3,0x4f,0x74, 0x3,0x53,0x70, 0x1,0x73,0x2e, 0x2,0x5b,0x72, 0x2,0x5b,0x70, 0x2,0x5b,0x6f, 0x3,0x53,0x71, 0x2,0x5b,0x75, 0x3,0x53,0x6b, 0x2,0x5b,0x74, 0x2,0x5b,0x73, 0x3,0x53,0x6c, 0x2,0x5b,0x6e, 0x1,0x73,0x2d, 0x2,0x5b,0x6d, 0x3,0x53,0x6a, 0x2,0x5b,0x71, 0x1,0x73,0x2f, 0x3,0x57,0x34, 0x2,0x60,0x66, 0x3,0x57,0x37, 0x2,0x60,0x6a, 0x2,0x60,0x67, 0x2,0x60,0x69, 0x2,0x60,0x68, 0x2,0x60,0x65, 0x2,0x60,0x6b, 0x2,0x60,0x6e, 0x2,0x60,0x6c, 0x2,0x60,0x6d, 0x1,0x76,0x2c, 0x3,0x57,0x33, 0x1,0x76,0x2b, 0x2,0x60,0x64, 0x2,0x60,0x6f, 0x2,0x64,0x5d, 0x2,0x64,0x60, 0x2,0x64,0x62, 0x2,0x64,0x61, 0x3,0x59,0x6a, 0x2,0x64,0x5b, 0x2,0x64,0x5f, 0x2,0x64,0x5a, 0x3,0x59,0x6b, 0x2,0x64,0x5c, 0x1,0x77,0x77, 0x2,0x64,0x59, 0x3,0x59,0x6d, 0x2,0x64,0x5e, 0x2,0x68,0x2d, 0x2,0x68,0x22, 0x1,0x79,0x51, 0x3,0x5b,0x6f, 0x3,0x5b,0x6d, 0x1,0x79,0x52, 0x2,0x68,0x21, 0x2,0x68,0x26, 0x2,0x68,0x2c, 0x2,0x68,0x24, 0x2,0x68,0x2b, 0x3,0x5b,0x6c, 0x2,0x68,0x28, 0x3,0x5b,0x6e, 0x2,0x68,0x27, 0x2,0x68,0x2a, 0x2,0x68,0x25, 0x2,0x68,0x23, 0x3,0x5b,0x6b, 0x2,0x68,0x29, 0x2,0x6a,0x6e, 0x2,0x6a,0x6c, 0x1,0x7a,0x55, 0x2,0x6a,0x6b, 0x2,0x6a,0x71, 0x2,0x6a,0x6f, 0x3,0x5d,0x5a, 0x1,0x7a,0x56, 0x2,0x6a,0x6a, 0x2,0x6a,0x68, 0x4,0x65,0x46, 0x2,0x6a,0x69, 0x1,0x7a,0x58, 0x2,0x6a,0x6d, 0x1,0x7a,0x57, 0x2,0x6a,0x70, 0x2,0x6c,0x66, 0x2,0x6c,0x6c, 0x3,0x5f,0x24, 0x3,0x5f,0x22, 0x2,0x6c,0x67, 0x1,0x7b,0x47, 0x2,0x6c,0x6d, 0x1,0x7b,0x46, 0x2,0x6c,0x6b, 0x2,0x6c,0x6a, 0x1,0x7b,0x45, 0x2,0x6c,0x69, 0x1,0x7b,0x44, 0x2,0x6c,0x68, 0x7,0x56,0x51, 0x2,0x6e,0x4c, 0x2,0x6e,0x4e, 0x2,0x6e,0x4d, 0x4,0x69,0x6a, 0x2,0x6e,0x4a, 0x1,0x7c,0x27, 0x2,0x6e,0x47, 0x2,0x6e,0x4b, 0x2,0x6e,0x50, 0x3,0x5f,0x79, 0x2,0x6e,0x4f, 0x2,0x6e,0x48, 0x2,0x6e,0x49, 0x1,0x7c,0x26, 0x2,0x6f,0x60, 0x1,0x7c,0x53, 0x3,0x60,0x62, 0x2,0x6f,0x61, 0x1,0x7c,0x51, 0x1,0x7c,0x52, 0x3,0x60,0x61, 0x4,0x6c,0x3d, 0x2,0x70,0x61, 0x1,0x7c,0x75, 0x2,0x71,0x65, 0x3,0x61,0x72, 0x1,0x7d,0x37, 0x3,0x61,0x73, 0x2,0x72,0x23, 0x1,0x7d,0x38, 0x2,0x72,0x24, 0x2,0x72,0x25, 0x2,0x72,0x33, 0x2,0x72,0x32, 0x1,0x7d,0x47, 0x2,0x72,0x3b, 0x1,0x58,0x6c, 0x3,0x40,0x2f, 0x4,0x42,0x21, 0x2,0x48,0x6f, 0x4,0x41,0x7d, 0x2,0x48,0x6e, 0x4,0x41,0x7e, 0x1,0x6b,0x73, 0x1,0x6b,0x74, 0x2,0x4f,0x42, 0x4,0x4e,0x74, 0x2,0x55,0x7b, 0x2,0x5b,0x78, 0x3,0x4f,0x77, 0x3,0x4f,0x76, 0x1,0x6f,0x7e, 0x1,0x73,0x30, 0x2,0x5b,0x76, 0x4,0x55,0x31, 0x2,0x5b,0x79, 0x1,0x73,0x31, 0x3,0x57,0x3a, 0x2,0x60,0x70, 0x2,0x5b,0x77, 0x2,0x64,0x63, 0x1,0x77,0x78, 0x2,0x68,0x2e, 0x4,0x62,0x49, 0x3,0x5d,0x61, 0x2,0x6a,0x74, 0x2,0x6a,0x72, 0x3,0x5d,0x60, 0x3,0x5d,0x5e, 0x2,0x6a,0x73, 0x2,0x6c,0x6e, 0x3,0x5f,0x25, 0x1,0x7b,0x48, 0x2,0x6e,0x51, 0x1,0x7c,0x56, 0x1,0x7c,0x28, 0x1,0x7c,0x54, 0x1,0x7c,0x55, 0x2,0x70,0x62, 0x1,0x7d,0x2f, 0x3,0x61,0x74, 0x1,0x58,0x6d, 0x4,0x36,0x2d, 0x3,0x4a,0x6e, 0x4,0x4e,0x79, 0x2,0x64,0x64, 0x3,0x5f,0x7b, 0x3,0x60,0x63, 0x2,0x33,0x4c, 0x3,0x40,0x32, 0x1,0x67,0x6c, 0x3,0x45,0x61, 0x2,0x4f,0x43, 0x3,0x4a,0x6f, 0x3,0x4a,0x73, 0x1,0x6b,0x75, 0x2,0x4f,0x44, 0x3,0x4a,0x71, 0x3,0x4a,0x70, 0x3,0x4a,0x72, 0x2,0x55,0x7d, 0x2,0x55,0x7c, 0x1,0x73,0x33, 0x1,0x70,0x21, 0x1,0x70,0x22, 0x4,0x4f,0x21, 0x2,0x56,0x22, 0x2,0x56,0x21, 0x2,0x55,0x7e, 0x3,0x4f,0x79, 0x3,0x53,0x75, 0x2,0x5b,0x7a, 0x2,0x5b,0x7d, 0x3,0x53,0x74, 0x2,0x5b,0x7c, 0x2,0x5b,0x7b, 0x1,0x73,0x32, 0x2,0x60,0x74, 0x2,0x60,0x72, 0x2,0x60,0x71, 0x4,0x5a,0x37, 0x3,0x57,0x3b, 0x2,0x60,0x73, 0x3,0x57,0x3c, 0x1,0x77,0x79, 0x2,0x64,0x66, 0x2,0x64,0x67, 0x1,0x77,0x7a, 0x3,0x59,0x6f, 0x2,0x64,0x65, 0x3,0x5b,0x71, 0x2,0x68,0x30, 0x2,0x68,0x2f, 0x2,0x68,0x32, 0x1,0x79,0x53, 0x2,0x68,0x31, 0x4,0x62,0x4f, 0x2,0x6a,0x75, 0x2,0x6a,0x77, 0x2,0x6a,0x76, 0x3,0x5f,0x27, 0x2,0x6c,0x6f, 0x2,0x6c,0x72, 0x2,0x6c,0x70, 0x2,0x6c,0x71, 0x2,0x6e,0x52, 0x1,0x7c,0x29, 0x4,0x69,0x74, 0x4,0x69,0x71, 0x3,0x66,0x72, 0x2,0x6f,0x62, 0x2,0x6f,0x63, 0x2,0x6f,0x64, 0x3,0x61,0x2c, 0x1,0x7c,0x76, 0x1,0x7d,0x30, 0x2,0x72,0x26, 0x1,0x58,0x6e, 0x3,0x4a,0x75, 0x1,0x70,0x23, 0x1,0x73,0x34, 0x2,0x64,0x68, 0x3,0x5d,0x62, 0x2,0x6e,0x53, 0x3,0x61,0x2e, 0x4,0x6d,0x37, 0x2,0x71,0x66, 0x2,0x33,0x4d, 0x3,0x62,0x28, 0x1,0x7d,0x48, 0x1,0x58,0x6f, 0x2,0x5b,0x7e, 0x3,0x57,0x3e, 0x2,0x64,0x69, 0x2,0x68,0x33, 0x3,0x5d,0x63, 0x4,0x68,0x36, 0x2,0x6c,0x73, 0x2,0x6e,0x54, 0x1,0x58,0x70, 0x3,0x45,0x62, 0x2,0x4f,0x45, 0x2,0x4f,0x46, 0x3,0x4a,0x78, 0x1,0x6b,0x76, 0x1,0x6b,0x77, 0x2,0x56,0x24, 0x1,0x70,0x25, 0x1,0x70,0x24, 0x2,0x56,0x23, 0x2,0x60,0x75, 0x3,0x57,0x3f, 0x2,0x64,0x6a, 0x2,0x64,0x6c, 0x2,0x64,0x6b, 0x1,0x77,0x7d, 0x1,0x77,0x7c, 0x1,0x77,0x7b, 0x3,0x5d,0x64, 0x1,0x7b,0x4a, 0x2,0x6c,0x74, 0x3,0x5f,0x28, 0x1,0x7b,0x49, 0x2,0x6e,0x56, 0x2,0x6e,0x55, 0x3,0x61,0x2f, 0x1,0x7c,0x77, 0x2,0x70,0x63, 0x1,0x5e,0x23, 0x2,0x48,0x70, 0x4,0x42,0x29, 0x3,0x45,0x63, 0x2,0x4f,0x49, 0x2,0x4f,0x47, 0x2,0x4f,0x48, 0x4,0x48,0x6b, 0x3,0x4f,0x7e, 0x2,0x56,0x2d, 0x4,0x4f,0x30, 0x2,0x56,0x28, 0x2,0x56,0x25, 0x2,0x56,0x2c, 0x3,0x4f,0x7c, 0x4,0x4f,0x35, 0x3,0x4f,0x7b, 0x2,0x56,0x2e, 0x4,0x4f,0x37, 0x4,0x4f,0x2c, 0x1,0x70,0x27, 0x2,0x56,0x2b, 0x2,0x56,0x27, 0x3,0x4f,0x7d, 0x4,0x4f,0x2a, 0x2,0x56,0x26, 0x2,0x56,0x2a, 0x2,0x56,0x29, 0x1,0x70,0x26, 0xf,0x53,0x3e, 0x2,0x5c,0x2b, 0x2,0x5c,0x26, 0x2,0x5c,0x24, 0x2,0x5c,0x2d, 0x2,0x5c,0x25, 0x4,0x55,0x47, 0x2,0x5c,0x21, 0x4,0x55,0x43, 0x2,0x5c,0x27, 0x3,0x53,0x78, 0x3,0x53,0x7a, 0x2,0x5c,0x22, 0x2,0x60,0x7e, 0x2,0x5c,0x23, 0x2,0x5c,0x2e, 0x3,0x54,0x23, 0x4,0x55,0x45, 0x3,0x53,0x7c, 0x3,0x54,0x21, 0x5,0x5a,0x4a, 0x3,0x54,0x25, 0x3,0x53,0x7d, 0x2,0x5c,0x2a, 0x1,0x73,0x35, 0x2,0x5c,0x29, 0x2,0x5c,0x28, 0x3,0x53,0x79, 0x2,0x5c,0x2c, 0xf,0x59,0x38, 0x3,0x66,0x73, 0x3,0x57,0x44, 0x2,0x60,0x76, 0x2,0x60,0x79, 0x4,0x5a,0x49, 0x3,0x57,0x45, 0x2,0x60,0x78, 0x3,0x57,0x40, 0x2,0x61,0x22, 0x2,0x60,0x7b, 0x2,0x61,0x21, 0x3,0x57,0x42, 0x2,0x60,0x7d, 0x2,0x60,0x7c, 0x2,0x60,0x7a, 0x4,0x5a,0x41, 0x2,0x60,0x77, 0x4,0x5a,0x3f, 0x1,0x76,0x2f, 0x1,0x76,0x2e, 0x4,0x5a,0x44, 0x1,0x76,0x30, 0x1,0x76,0x2d, 0x2,0x61,0x23, 0x4,0x5a,0x45, 0xf,0x5d,0x76, 0x4,0x5a,0x43, 0x2,0x64,0x72, 0x2,0x64,0x75, 0x4,0x5f,0x26, 0x2,0x64,0x73, 0x2,0x64,0x77, 0x5,0x66,0x79, 0x3,0x59,0x74, 0x4,0x5f,0x22, 0x2,0x64,0x78, 0x4,0x5f,0x2a, 0x2,0x64,0x70, 0x1,0x78,0x24, 0x2,0x64,0x71, 0x3,0x59,0x73, 0x2,0x64,0x6f, 0x2,0x64,0x76, 0x3,0x5b,0x74, 0x2,0x64,0x6e, 0x2,0x64,0x6d, 0x1,0x78,0x23, 0x1,0x78,0x21, 0x1,0x77,0x7e, 0x3,0x59,0x76, 0x3,0x59,0x75, 0x3,0x57,0x43, 0xf,0x61,0x72, 0x3,0x59,0x71, 0x2,0x64,0x74, 0x2,0x68,0x3c, 0x2,0x68,0x42, 0x1,0x79,0x56, 0x2,0x68,0x3d, 0x5,0x6b,0x33, 0x2,0x68,0x40, 0x2,0x68,0x44, 0x1,0x79,0x57, 0x2,0x68,0x3f, 0x4,0x62,0x5c, 0x2,0x68,0x37, 0x3,0x5b,0x75, 0x2,0x68,0x36, 0x2,0x68,0x43, 0x2,0x68,0x3a, 0x3,0x5b,0x77, 0x2,0x68,0x38, 0x2,0x68,0x41, 0x2,0x68,0x39, 0x1,0x79,0x55, 0x1,0x79,0x54, 0x3,0x5b,0x79, 0x2,0x68,0x34, 0x2,0x68,0x35, 0x2,0x68,0x3e, 0x4,0x62,0x66, 0x3,0x5b,0x7a, 0x4,0x62,0x68, 0x2,0x68,0x3b, 0xf,0x64,0x6b, 0x4,0x62,0x55, 0x3,0x5d,0x6f, 0x2,0x6a,0x7a, 0x2,0x6a,0x7d, 0x3,0x5d,0x71, 0x4,0x62,0x56, 0x3,0x5d,0x67, 0x3,0x5d,0x69, 0x1,0x78,0x22, 0x3,0x5d,0x6a, 0x3,0x5d,0x74, 0x3,0x5d,0x75, 0x4,0x65,0x5a, 0x3,0x5d,0x6e, 0x4,0x65,0x59, 0x3,0x5d,0x68, 0x2,0x6a,0x7b, 0x2,0x6b,0x23, 0x2,0x6b,0x21, 0x2,0x6a,0x79, 0x2,0x6b,0x26, 0x3,0x5d,0x66, 0x2,0x6a,0x78, 0x3,0x5d,0x76, 0x1,0x7a,0x5a, 0x2,0x6b,0x22, 0x4,0x65,0x54, 0x3,0x5d,0x73, 0x4,0x65,0x57, 0x2,0x6a,0x7c, 0x1,0x7a,0x59, 0x2,0x6b,0x25, 0x3,0x5d,0x72, 0x4,0x65,0x5d, 0x2,0x6b,0x24, 0x3,0x5d,0x70, 0x2,0x6c,0x77, 0x2,0x6c,0x76, 0x5,0x72,0x51, 0x3,0x5f,0x2c, 0x5,0x72,0x4b, 0x2,0x6c,0x7d, 0x5,0x72,0x4e, 0x2,0x6c,0x79, 0x2,0x6c,0x7c, 0x1,0x7b,0x4c, 0x4,0x68,0x3b, 0x4,0x68,0x3e, 0x2,0x6c,0x7a, 0x2,0x6c,0x7b, 0x4,0x68,0x39, 0x2,0x6c,0x75, 0x2,0x6c,0x78, 0x1,0x7b,0x4b, 0x3,0x5f,0x2a, 0xf,0x69,0x2a, 0x1,0x7c,0x2b, 0x2,0x6e,0x61, 0x2,0x6e,0x5c, 0x2,0x6e,0x60, 0x3,0x60,0x25, 0x2,0x6e,0x63, 0x2,0x6e,0x5f, 0x3,0x5f,0x7e, 0x2,0x6e,0x5b, 0x3,0x60,0x23, 0x1,0x7c,0x2d, 0x2,0x6e,0x5e, 0x2,0x6e,0x62, 0x1,0x7c,0x2c, 0x2,0x6e,0x59, 0x2,0x6a,0x7e, 0x2,0x6e,0x5d, 0x4,0x6a,0x23, 0x5,0x75,0x2d, 0x2,0x6e,0x5a, 0x3,0x60,0x22, 0x2,0x6e,0x57, 0xf,0x6a,0x3e, 0x2,0x6e,0x58, 0x1,0x7c,0x2a, 0x2,0x6f,0x68, 0x2,0x6f,0x6a, 0x2,0x6f,0x6d, 0x2,0x6f,0x69, 0x2,0x6f,0x6e, 0x3,0x60,0x65, 0x2,0x6f,0x67, 0x3,0x60,0x66, 0x2,0x6f,0x65, 0x3,0x60,0x68, 0x1,0x7c,0x57, 0x2,0x6f,0x6b, 0x1,0x7c,0x59, 0x1,0x7c,0x58, 0x2,0x6f,0x66, 0x2,0x6f,0x6c, 0x3,0x61,0x32, 0x2,0x70,0x68, 0x1,0x7c,0x78, 0x2,0x70,0x69, 0x3,0x61,0x33, 0x2,0x70,0x67, 0x2,0x70,0x64, 0x4,0x6c,0x4a, 0x3,0x61,0x34, 0x2,0x70,0x66, 0x2,0x70,0x65, 0x2,0x71,0x49, 0x3,0x61,0x59, 0x2,0x71,0x4b, 0x2,0x71,0x4a, 0x3,0x61,0x5b, 0x2,0x71,0x69, 0x5,0x7a,0x53, 0x2,0x71,0x68, 0x2,0x71,0x67, 0x2,0x71,0x6a, 0x3,0x61,0x75, 0x1,0x7d,0x40, 0x1,0x7d,0x41, 0x2,0x72,0x38, 0x2,0x72,0x3c, 0x3,0x62,0x41, 0x1,0x5e,0x24, 0x2,0x41,0x54, 0x2,0x48,0x73, 0x3,0x45,0x64, 0x1,0x67,0x6d, 0x2,0x48,0x71, 0x3,0x45,0x66, 0x3,0x2f,0x42, 0x2,0x48,0x72, 0x3,0x45,0x68, 0x3,0x45,0x67, 0x2,0x4f,0x4a, 0x2,0x4f,0x4b, 0x1,0x6b,0x7a, 0x1,0x6b,0x78, 0x2,0x4f,0x4c, 0x1,0x6b,0x79, 0x2,0x56,0x33, 0x3,0x50,0x27, 0x2,0x56,0x36, 0x2,0x56,0x30, 0x2,0x56,0x37, 0x2,0x56,0x2f, 0x2,0x56,0x31, 0x3,0x50,0x2a, 0x2,0x56,0x32, 0x2,0x56,0x35, 0x3,0x50,0x24, 0x3,0x50,0x2b, 0x1,0x70,0x2a, 0x2,0x56,0x3a, 0x2,0x56,0x39, 0x1,0x70,0x28, 0x2,0x56,0x34, 0x2,0x56,0x38, 0x1,0x70,0x29, 0x3,0x54,0x2d, 0x4,0x4f,0x42, 0x3,0x50,0x25, 0x3,0x50,0x22, 0x3,0x54,0x2a, 0x2,0x5c,0x38, 0x4,0x55,0x52, 0x1,0x73,0x3a, 0x3,0x54,0x2c, 0x2,0x5c,0x33, 0x1,0x73,0x36, 0x3,0x54,0x36, 0x2,0x5c,0x30, 0x2,0x5c,0x36, 0x2,0x5c,0x39, 0x3,0x54,0x33, 0x1,0x73,0x3b, 0x4,0x5a,0x4e, 0x2,0x5c,0x35, 0x2,0x5c,0x32, 0x2,0x5c,0x3a, 0x2,0x5c,0x31, 0x3,0x54,0x37, 0x2,0x5c,0x37, 0x1,0x73,0x37, 0x3,0x54,0x29, 0x2,0x5c,0x2f, 0x1,0x73,0x38, 0x3,0x54,0x35, 0x1,0x73,0x39, 0x2,0x5c,0x34, 0x3,0x54,0x32, 0x2,0x61,0x35, 0x2,0x61,0x28, 0x2,0x61,0x29, 0x2,0x61,0x2c, 0x2,0x61,0x2a, 0x4,0x5a,0x55, 0x2,0x61,0x24, 0x4,0x5a,0x56, 0x3,0x57,0x4d, 0x2,0x61,0x27, 0x2,0x61,0x31, 0x2,0x61,0x2b, 0x3,0x57,0x48, 0x4,0x5a,0x4f, 0x1,0x76,0x31, 0x4,0x5a,0x4d, 0x2,0x61,0x33, 0x2,0x61,0x30, 0x1,0x76,0x32, 0x2,0x61,0x32, 0x2,0x61,0x25, 0x2,0x61,0x2e, 0x2,0x61,0x2f, 0x3,0x57,0x4a, 0x2,0x61,0x2d, 0xf,0x5e,0x24, 0x3,0x66,0x75, 0x2,0x64,0x7c, 0x2,0x64,0x7e, 0x2,0x65,0x23, 0x3,0x59,0x79, 0x3,0x59,0x7b, 0x2,0x64,0x7b, 0x3,0x59,0x7d, 0x1,0x78,0x25, 0x2,0x65,0x25, 0x2,0x64,0x7a, 0x2,0x65,0x26, 0x3,0x59,0x7e, 0x2,0x65,0x22, 0x2,0x65,0x24, 0x2,0x65,0x28, 0x2,0x65,0x21, 0x2,0x65,0x29, 0x2,0x64,0x7d, 0x2,0x64,0x79, 0x1,0x78,0x26, 0x3,0x5a,0x22, 0x2,0x65,0x27, 0x1,0x78,0x27, 0x1,0x79,0x59, 0x4,0x5f,0x34, 0x3,0x59,0x7a, 0xf,0x61,0x77, 0x3,0x5b,0x7d, 0x2,0x61,0x26, 0x2,0x68,0x5e, 0x2,0x68,0x55, 0x1,0x79,0x5b, 0x2,0x68,0x51, 0x1,0x79,0x5c, 0x3,0x5c,0x27, 0x3,0x5c,0x22, 0x2,0x68,0x5a, 0x2,0x68,0x54, 0x2,0x68,0x4a, 0x1,0x79,0x5a, 0x2,0x68,0x57, 0x2,0x68,0x52, 0x2,0x68,0x53, 0x3,0x5c,0x25, 0x2,0x68,0x45, 0x2,0x68,0x4c, 0x2,0x68,0x5b, 0x3,0x5b,0x7e, 0x2,0x68,0x58, 0x5,0x6b,0x3f, 0x2,0x68,0x50, 0x3,0x5c,0x26, 0x2,0x68,0x5c, 0x2,0x68,0x4b, 0x2,0x68,0x46, 0x2,0x68,0x59, 0x3,0x5c,0x24, 0x2,0x68,0x48, 0x2,0x68,0x56, 0x2,0x68,0x4d, 0x2,0x68,0x5d, 0x2,0x68,0x49, 0x1,0x79,0x58, 0x2,0x68,0x47, 0x2,0x68,0x4e, 0x2,0x68,0x4f, 0x2,0x6b,0x2d, 0x3,0x5c,0x23, 0x2,0x6b,0x2b, 0x4,0x65,0x69, 0x2,0x6b,0x30, 0x3,0x5d,0x79, 0x2,0x6b,0x3c, 0x2,0x6b,0x33, 0x2,0x6b,0x2c, 0x2,0x6b,0x28, 0x2,0x6b,0x35, 0x2,0x6b,0x2e, 0x2,0x6b,0x31, 0x2,0x6b,0x2a, 0x2,0x6b,0x38, 0x2,0x6b,0x27, 0x2,0x6b,0x2f, 0x2,0x6b,0x34, 0x2,0x6b,0x36, 0x2,0x6b,0x39, 0x2,0x6b,0x29, 0x3,0x5d,0x7a, 0x2,0x6b,0x3d, 0x2,0x6b,0x3e, 0x2,0x6b,0x37, 0x2,0x6b,0x3b, 0x2,0x6b,0x32, 0x2,0x6d,0x2f, 0x2,0x6d,0x32, 0x3,0x5f,0x35, 0x1,0x7b,0x4d, 0x3,0x5f,0x31, 0x2,0x6d,0x31, 0x2,0x6d,0x36, 0x2,0x6d,0x34, 0x1,0x7b,0x4e, 0x2,0x6d,0x2b, 0x2,0x6d,0x21, 0x2,0x6c,0x7e, 0x1,0x7b,0x50, 0x2,0x6d,0x2d, 0x2,0x6d,0x2e, 0x2,0x6d,0x2a, 0x2,0x6d,0x22, 0x3,0x5f,0x32, 0x2,0x6d,0x27, 0x2,0x6b,0x3a, 0x4,0x68,0x43, 0x2,0x6d,0x23, 0x1,0x7b,0x4f, 0x2,0x6d,0x29, 0x3,0x5f,0x36, 0x2,0x6d,0x28, 0x2,0x6d,0x24, 0x2,0x6d,0x30, 0x4,0x68,0x44, 0x2,0x6d,0x25, 0x2,0x6e,0x68, 0x2,0x6d,0x33, 0x2,0x6d,0x35, 0x2,0x6d,0x2c, 0x2,0x6d,0x26, 0x2,0x6e,0x69, 0x2,0x6e,0x6b, 0x2,0x6e,0x65, 0x1,0x7c,0x2e, 0x4,0x6a,0x25, 0x2,0x6e,0x72, 0x2,0x6e,0x70, 0x1,0x7c,0x2f, 0x2,0x6e,0x6f, 0x2,0x6e,0x6e, 0x2,0x6e,0x67, 0x2,0x6e,0x64, 0x2,0x6e,0x6a, 0x2,0x6e,0x73, 0x2,0x6e,0x66, 0x2,0x6e,0x6c, 0x5,0x75,0x45, 0x2,0x6f,0x77, 0x2,0x6f,0x7c, 0x2,0x6f,0x72, 0x2,0x6f,0x75, 0x1,0x7c,0x5a, 0x2,0x6f,0x79, 0x4,0x6b,0x46, 0x2,0x70,0x22, 0x2,0x6e,0x6d, 0x4,0x6b,0x4a, 0x2,0x6f,0x73, 0x2,0x6f,0x7d, 0x2,0x70,0x23, 0x2,0x6f,0x78, 0x2,0x6f,0x71, 0x2,0x6f,0x7b, 0x4,0x6b,0x4b, 0x2,0x6f,0x7a, 0x2,0x70,0x21, 0x2,0x6f,0x7e, 0x2,0x6e,0x71, 0x2,0x6f,0x76, 0x2,0x6f,0x70, 0x2,0x6f,0x74, 0x1,0x7c,0x79, 0x1,0x7c,0x7a, 0x2,0x6f,0x6f, 0x3,0x60,0x6c, 0x2,0x70,0x74, 0x2,0x70,0x6b, 0x2,0x70,0x73, 0x2,0x70,0x70, 0x2,0x70,0x71, 0x2,0x70,0x6a, 0x2,0x70,0x6d, 0x2,0x70,0x75, 0x2,0x70,0x6f, 0x2,0x70,0x6e, 0x2,0x70,0x6c, 0x3,0x61,0x35, 0x2,0x70,0x72, 0x4,0x6c,0x56, 0x2,0x71,0x4c, 0x4,0x6d,0x3a, 0x2,0x71,0x4d, 0x3,0x61,0x5d, 0x2,0x71,0x4f, 0x2,0x71,0x4e, 0x2,0x71,0x51, 0x2,0x71,0x50, 0x2,0x71,0x6c, 0x2,0x71,0x6b, 0x2,0x72,0x27, 0x3,0x62,0x29, 0x2,0x72,0x28, 0x3,0x62,0x30, 0x2,0x72,0x34, 0x1,0x7d,0x45, 0x1,0x7d,0x49, 0x3,0x62,0x38, 0x2,0x72,0x3d, 0x1,0x7d,0x4a, 0x1,0x5e,0x25, 0x4,0x4f,0x48, 0x5,0x5a,0x5b, 0x1,0x7a,0x5b, 0x2,0x6d,0x37, 0x3,0x5f,0x37, 0x1,0x7c,0x7b, 0x1,0x7c,0x7c, 0x1,0x5e,0x26, 0x2,0x48,0x74, 0x3,0x45,0x69, 0x1,0x67,0x6e, 0x2,0x56,0x3b, 0x3,0x50,0x2c, 0x3,0x54,0x39, 0x2,0x5c,0x3c, 0x2,0x5c,0x3d, 0x2,0x5c,0x3b, 0x2,0x61,0x37, 0x2,0x61,0x36, 0x1,0x76,0x33, 0x2,0x65,0x2b, 0x2,0x61,0x38, 0x2,0x65,0x2a, 0x4,0x5f,0x3a, 0x3,0x5a,0x24, 0x2,0x68,0x60, 0x1,0x79,0x5d, 0x1,0x79,0x5f, 0x2,0x68,0x5f, 0x3,0x5c,0x29, 0x4,0x62,0x75, 0x1,0x79,0x5e, 0x3,0x5e,0x21, 0x2,0x6b,0x3f, 0x2,0x6b,0x41, 0x2,0x6b,0x40, 0x2,0x6d,0x38, 0x1,0x7b,0x51, 0x3,0x5f,0x3a, 0x1,0x7c,0x5b, 0x2,0x70,0x76, 0x2,0x71,0x52, 0x3,0x62,0x31, 0x3,0x62,0x3f, 0x2,0x72,0x41, 0x1,0x5e,0x27, 0x3,0x25,0x47, 0x2,0x4f,0x4d, 0x4,0x4f,0x4c, 0x1,0x70,0x2b, 0x3,0x50,0x2f, 0x3,0x50,0x2e, 0x3,0x54,0x3a, 0x2,0x5c,0x3f, 0x2,0x5c,0x3e, 0x3,0x57,0x50, 0x2,0x61,0x39, 0x3,0x5a,0x26, 0x3,0x5a,0x25, 0x4,0x62,0x7e, 0x1,0x79,0x60, 0x1,0x7a,0x5c, 0x2,0x6e,0x74, 0x2,0x72,0x39, 0x1,0x5e,0x28, 0x1,0x6b,0x7b, 0x3,0x4b,0x22, 0x1,0x70,0x2c, 0xf,0x61,0x7c, 0x2,0x68,0x61, 0x3,0x5e,0x22, 0x2,0x70,0x24, 0x1,0x63,0x27, 0x3,0x39,0x6a, 0x3,0x54,0x3c, 0x3,0x54,0x3b, 0x4,0x5a,0x5d, 0x2,0x61,0x3a, 0x3,0x5a,0x28, 0x4,0x5f,0x3e, 0x1,0x7d,0x31, 0x1,0x63,0x28, 0x1,0x70,0x2d, 0x1,0x76,0x34, 0x2,0x70,0x25, 0x1,0x63,0x29, 0x3,0x39,0x6b, 0x2,0x56,0x3c, 0x1,0x73,0x3d, 0x2,0x5c,0x40, 0x2,0x5c,0x41, 0x3,0x54,0x3d, 0x1,0x73,0x3c, 0x4,0x55,0x60, 0x2,0x61,0x3b, 0x1,0x76,0x38, 0x1,0x76,0x36, 0x1,0x76,0x37, 0x1,0x76,0x35, 0x2,0x65,0x2c, 0x1,0x78,0x28, 0x4,0x63,0x24, 0x3,0x5c,0x2a, 0x2,0x6b,0x43, 0x2,0x6b,0x42, 0x2,0x6b,0x45, 0x2,0x6b,0x44, 0x1,0x7a,0x5d, 0x2,0x6d,0x39, 0x4,0x68,0x56, 0x2,0x6d,0x3b, 0x2,0x6d,0x3a, 0x1,0x7b,0x52, 0x2,0x6e,0x75, 0x3,0x60,0x29, 0x2,0x70,0x26, 0x2,0x70,0x27, 0x1,0x7c,0x5c, 0x2,0x71,0x53, 0x2,0x71,0x6d, 0x1,0x7d,0x42, 0x4,0x6e,0x43, 0x2,0x41,0x55, 0x2,0x5c,0x42, 0x2,0x61,0x3c, 0x2,0x68,0x62, 0x2,0x48,0x75, 0x3,0x27,0x72, 0x2,0x61,0x3d, 0x2,0x65,0x2e, 0x2,0x65,0x2d, 0x3,0x5a,0x29, 0x3,0x5c,0x2d, 0x3,0x5c,0x2e, 0x3,0x5f,0x3c, 0x2,0x70,0x28, 0x1,0x7c,0x7d, 0x3,0x61,0x5f, 0x2,0x71,0x54, 0x2,0x71,0x6e, 0x1,0x67,0x6f, 0x2,0x56,0x3d, 0x2,0x56,0x3e, 0x4,0x4f,0x56, 0x2,0x5c,0x43, 0x1,0x67,0x70, 0x3,0x45,0x6a, 0x1,0x78,0x29, 0x2,0x65,0x2f, 0x3,0x5c,0x30, 0x2,0x6d,0x3d, 0x1,0x7b,0x53, 0x2,0x6d,0x3e, 0x2,0x6d,0x3c, 0x2,0x70,0x29, 0x3,0x61,0x60, 0x2,0x70,0x77, 0x4,0x6d,0x48, 0x1,0x67,0x71, 0x2,0x61,0x40, 0x2,0x61,0x3f, 0x2,0x61,0x3e, 0x2,0x65,0x30, 0x3,0x5a,0x2b, 0x3,0x5a,0x2a, 0x2,0x65,0x34, 0x2,0x65,0x33, 0x2,0x65,0x32, 0x2,0x65,0x31, 0x1,0x78,0x2a, 0x2,0x68,0x63, 0x2,0x6b,0x47, 0x1,0x7a,0x5e, 0x2,0x6b,0x46, 0x2,0x6d,0x3f, 0x2,0x6e,0x78, 0x2,0x6e,0x77, 0x1,0x7c,0x30, 0x2,0x6e,0x76, 0x2,0x70,0x2c, 0x2,0x70,0x2b, 0x2,0x70,0x2a, 0x3,0x60,0x6d, 0x4,0x6e,0x44, 0x1,0x6b,0x7c, 0x4,0x55,0x63, 0x2,0x5c,0x44, 0x1,0x76,0x39, 0x4,0x5a,0x64, 0x2,0x68,0x64, 0x2,0x68,0x65, 0x2,0x6e,0x79, 0x2,0x70,0x2d, 0x4,0x6b,0x5c, 0x3,0x61,0x3b, 0x2,0x70,0x78, 0x2,0x71,0x55, 0x2,0x72,0x29, 0x2,0x72,0x43, 0x1,0x6b,0x7d, 0x1,0x76,0x3a, 0x2,0x65,0x35, 0x2,0x68,0x66, 0x2,0x6d,0x40, 0x2,0x70,0x2e, 0x3,0x23,0x70, 0x1,0x70,0x2f, 0x3,0x54,0x3e, 0x2,0x61,0x41, 0x2,0x65,0x36, 0x2,0x68,0x67, 0x2,0x68,0x68, 0x2,0x68,0x69, 0x2,0x6b,0x4c, 0x3,0x5e,0x24, 0x2,0x6b,0x48, 0x1,0x7b,0x54, 0x2,0x6b,0x4b, 0x2,0x6b,0x4a, 0x1,0x7a,0x5f, 0x2,0x6b,0x49, 0x1,0x7a,0x61, 0x1,0x7a,0x60, 0x2,0x6d,0x42, 0x2,0x6d,0x41, 0x1,0x7b,0x55, 0x1,0x7b,0x56, 0x4,0x68,0x60, 0x3,0x5f,0x3e, 0x1,0x7c,0x32, 0x2,0x6e,0x7a, 0x1,0x7c,0x31, 0x4,0x6b,0x61, 0x2,0x70,0x31, 0x2,0x70,0x32, 0x2,0x70,0x30, 0x2,0x70,0x2f, 0x1,0x7d,0x21, 0x4,0x6c,0x64, 0x2,0x70,0x79, 0x2,0x70,0x7a, 0x2,0x70,0x7b, 0x1,0x7c,0x7e, 0x2,0x71,0x56, 0x2,0x71,0x59, 0x2,0x71,0x58, 0x2,0x71,0x57, 0x3,0x62,0x33, 0x4,0x6e,0x45, 0x2,0x72,0x42, 0x1,0x73,0x3e, 0x3,0x57,0x55, 0x4,0x63,0x2d, 0x1,0x78,0x32, 0x2,0x6b,0x4d, 0x2,0x6d,0x43, 0x3,0x60,0x2b, 0x1,0x7c,0x33, 0x2,0x6e,0x7b, 0x4,0x6e,0x55, 0x3,0x62,0x42, 0x2,0x72,0x44, 0xf,0x21,0x59, 0x1,0x73,0x3f, 0x3,0x5e,0x47, 0x4,0x6e,0x33, 0x2,0x61,0x42, 0x3,0x5f,0x3f, 0x2,0x6e,0x7c, 0x3,0x61,0x61, 0x2,0x71,0x6f, 0x3,0x61,0x77, 0xf,0x58,0x4c, 0x1,0x21,0x2b, 0x1,0x21,0x36, 0x1,0x21,0x38, 0x1,0x21,0x40, 0x1,0x21,0x41, 0x1,0x21,0x44, 0x1,0x21,0x45, 0x1,0x21,0x48, 0x1,0x21,0x49, 0x1,0x21,0x4c, 0x1,0x21,0x4d, 0x1,0x21,0x50, 0x1,0x21,0x51, 0x1,0x21,0x54, 0x1,0x21,0x55, 0x1,0x21,0x58, 0x1,0x21,0x59, 0x1,0x21,0x5c, 0x1,0x21,0x5d, 0x1,0x22,0x27, 0x1,0x22,0x28, 0x1,0x22,0x2b, 0x1,0x22,0x2c, 0x1,0x22,0x29, 0x1,0x22,0x2a, 0x1,0x21,0x2e, 0x1,0x21,0x2f, 0x1,0x21,0x30, 0x1,0x21,0x32, 0x1,0x21,0x33, 0x1,0x21,0x34, 0x1,0x21,0x35, 0x1,0x21,0x5e, 0x1,0x21,0x5f, 0x1,0x21,0x60, 0x1,0x21,0x61, 0x1,0x21,0x62, 0x1,0x21,0x63, 0x1,0x22,0x2d, 0x1,0x22,0x2e, 0x1,0x22,0x2f, 0x1,0x22,0x3f, 0x1,0x22,0x40, 0x1,0x22,0x41, 0x1,0x22,0x43, 0x1,0x22,0x42, 0x1,0x22,0x62, 0x1,0x22,0x6c, 0x1,0x22,0x6d, 0x1,0x22,0x6e, 0x1,0x21,0x2a, 0x1,0x21,0x6c, 0x1,0x22,0x63, 0x1,0x22,0x68, 0x1,0x21,0x6d, 0x1,0x21,0x3e, 0x1,0x21,0x3f, 0x1,0x21,0x6e, 0x1,0x22,0x30, 0x1,0x21,0x22, 0x1,0x22,0x31, 0x1,0x21,0x25, 0x1,0x22,0x5f, 0x1,0x24,0x21, 0x1,0x24,0x22, 0x1,0x24,0x23, 0x1,0x24,0x24, 0x1,0x24,0x25, 0x1,0x24,0x26, 0x1,0x24,0x27, 0x1,0x24,0x28, 0x1,0x24,0x29, 0x1,0x24,0x2a, 0x1,0x21,0x28, 0x1,0x21,0x27, 0x1,0x22,0x36, 0x1,0x22,0x38, 0x1,0x22,0x37, 0x1,0x21,0x29, 0x1,0x22,0x69, 0x1,0x24,0x41, 0x1,0x24,0x42, 0x1,0x24,0x43, 0x1,0x24,0x44, 0x1,0x24,0x45, 0x1,0x24,0x46, 0x1,0x24,0x47, 0x1,0x24,0x48, 0x1,0x24,0x49, 0x1,0x24,0x4a, 0x1,0x24,0x4b, 0x1,0x24,0x4c, 0x1,0x24,0x4d, 0x1,0x24,0x4e, 0x1,0x24,0x4f, 0x1,0x24,0x50, 0x1,0x24,0x51, 0x1,0x24,0x52, 0x1,0x24,0x53, 0x1,0x24,0x54, 0x1,0x24,0x55, 0x1,0x24,0x56, 0x1,0x24,0x57, 0x1,0x24,0x58, 0x1,0x24,0x59, 0x1,0x24,0x5a, 0x1,0x22,0x60, 0x1,0x22,0x25, 0x1,0x24,0x5b, 0x1,0x24,0x5c, 0x1,0x24,0x5d, 0x1,0x24,0x5e, 0x1,0x24,0x5f, 0x1,0x24,0x60, 0x1,0x24,0x61, 0x1,0x24,0x62, 0x1,0x24,0x63, 0x1,0x24,0x64, 0x1,0x24,0x65, 0x1,0x24,0x66, 0x1,0x24,0x67, 0x1,0x24,0x68, 0x1,0x24,0x69, 0x1,0x24,0x6a, 0x1,0x24,0x6b, 0x1,0x24,0x6c, 0x1,0x24,0x6d, 0x1,0x24,0x6e, 0x1,0x24,0x6f, 0x1,0x24,0x70, 0x1,0x24,0x71, 0x1,0x24,0x72, 0x1,0x24,0x73, 0x1,0x24,0x74, 0x1,0x21,0x42, 0x1,0x22,0x5e, 0x1,0x21,0x43, 0x1,0x22,0x66, 0x1,0x22,0x67, 0x1,0x22,0x64, 0x5,0x21,0x25, 0xf,0x21,0x21, 0x6,0x21,0x2f, 0x6,0x21,0x2d, 0x6,0x21,0x2e, 0x6,0x21,0x42, 0x6,0x21,0x43, 0x5,0x21,0x33, 0x3,0x21,0x44, 0xf,0x21,0x3e, 0xf,0x21,0x3f, 0x6,0x22,0x2b, 0x5,0x21,0x4d, 0x6,0x23,0x40, 0x6,0x23,0x3e, 0x6,0x23,0x3f, 0x6,0x24,0x67, 0x6,0x25,0x5f, 0x5,0x23,0x2f, 0xf,0x22,0x74, 0x6,0x25,0x67, 0x6,0x25,0x63, 0x6,0x29,0x37, 0x6,0x29,0x3a, 0x6,0x29,0x38, 0xf,0x29,0x22, 0xf,0x29,0x23, 0x6,0x2e,0x66, 0x5,0x30,0x72, 0x5,0x33,0x23, 0xf,0x39,0x32, 0xf,0x39,0x33, 0x6,0x47,0x2d, 0xf,0x3b,0x73, 0xf,0x40,0x35, 0xf,0x40,0x75, 0xf,0x47,0x42, 0xf,0x4d,0x56, 0x7,0x21,0x21, 0xf,0x59,0x47, 0x4,0x4f,0x7c, 0xf,0x5a,0x3f, 0x6,0x21,0x2c, 0x6,0x21,0x22, 0x6,0x22,0x5f, 0x4,0x21,0x56, 0x6,0x23,0x41, 0x6,0x25,0x60, 0x6,0x29,0x3b, 0x5,0x25,0x21, 0x5,0x27,0x7a, 0x6,0x2e,0x4a, 0xf,0x29,0x50, 0x6,0x35,0x25, 0x6,0x35,0x26, 0x6,0x45,0x7d, 0x6,0x46,0x3f, 0xf,0x46,0x40, 0x5,0x44,0x7e, 0x6,0x21,0x32, 0x5,0x21,0x2d, 0x6,0x22,0x2d, 0x6,0x23,0x42, 0xf,0x2d,0x61, 0x6,0x50,0x50, 0xf,0x53,0x44, 0x4,0x21,0x21, 0x5,0x21,0x26, 0x6,0x21,0x24, 0xf,0x21,0x22, 0x6,0x21,0x33, 0x6,0x21,0x44, 0xf,0x21,0x25, 0xf,0x21,0x26, 0x5,0x21,0x4e, 0x6,0x22,0x30, 0xf,0x21,0x45, 0x6,0x22,0x4e, 0x6,0x22,0x2f, 0xf,0x21,0x40, 0xf,0x21,0x41, 0x6,0x21,0x45, 0x6,0x22,0x31, 0x6,0x22,0x2e, 0x4,0x22,0x26, 0x4,0x22,0x25, 0x5,0x22,0x24, 0x5,0x22,0x25, 0x6,0x23,0x43, 0x6,0x29,0x3e, 0x6,0x24,0x5d, 0x6,0x25,0x56, 0x6,0x25,0x61, 0x6,0x25,0x62, 0x6,0x2c,0x43, 0x6,0x29,0x3c, 0x6,0x3a,0x65, 0xf,0x29,0x25, 0x6,0x2d,0x2d, 0x6,0x29,0x3d, 0x6,0x2e,0x4b, 0x5,0x2b,0x67, 0x6,0x35,0x2a, 0x6,0x35,0x27, 0x6,0x39,0x64, 0x6,0x35,0x29, 0x6,0x3c,0x7b, 0x6,0x45,0x7e, 0x6,0x46,0x40, 0x6,0x46,0x41, 0x5,0x3d,0x56, 0x5,0x21,0x23, 0x5,0x21,0x22, 0x6,0x21,0x26, 0x6,0x21,0x25, 0x5,0x21,0x21, 0x5,0x21,0x2b, 0xf,0x21,0x23, 0x6,0x21,0x46, 0x5,0x21,0x34, 0xf,0x21,0x27, 0xf,0x21,0x28, 0x6,0x22,0x33, 0x6,0x22,0x32, 0x6,0x22,0x2a, 0x5,0x21,0x4f, 0x6,0x23,0x46, 0x6,0x23,0x44, 0xf,0x21,0x6e, 0x6,0x23,0x45, 0xf,0x22,0x75, 0x6,0x29,0x3f, 0x6,0x2d,0x2c, 0x4,0x26,0x24, 0x6,0x2e,0x4d, 0x6,0x2e,0x4e, 0xf,0x25,0x40, 0x6,0x2e,0x4c, 0x6,0x35,0x2b, 0xf,0x2d,0x60, 0x6,0x3c,0x7e, 0x5,0x30,0x73, 0x6,0x3c,0x7d, 0xf,0x39,0x34, 0x6,0x50,0x51, 0x5,0x44,0x55, 0xf,0x46,0x41, 0x6,0x5a,0x63, 0x6,0x5a,0x62, 0x7,0x36,0x73, 0x7,0x46,0x27, 0x7,0x4d,0x3a, 0x5,0x21,0x24, 0x5,0x21,0x27, 0x4,0x21,0x28, 0x5,0x21,0x28, 0x5,0x21,0x2c, 0x6,0x21,0x47, 0x6,0x21,0x48, 0x6,0x21,0x49, 0x6,0x23,0x47, 0x5,0x23,0x30, 0x6,0x25,0x64, 0x6,0x29,0x40, 0x5,0x30,0x74, 0x6,0x46,0x42, 0x7,0x2c,0x3c, 0x6,0x21,0x27, 0x6,0x21,0x28, 0x6,0x21,0x29, 0x6,0x21,0x4a, 0x6,0x25,0x65, 0x6,0x23,0x48, 0x6,0x23,0x49, 0x6,0x25,0x68, 0xf,0x22,0x76, 0x4,0x25,0x33, 0x5,0x25,0x22, 0x4,0x25,0x32, 0x6,0x2e,0x50, 0x5,0x27,0x7b, 0xf,0x29,0x27, 0x6,0x30,0x7c, 0x6,0x35,0x2d, 0x6,0x35,0x2c, 0xf,0x2d,0x62, 0x6,0x3d,0x21, 0xf,0x4d,0x6e, 0x6,0x23,0x4a, 0xf,0x21,0x6f, 0xf,0x21,0x70, 0xf,0x22,0x2b, 0x5,0x23,0x31, 0xf,0x22,0x77, 0xf,0x22,0x78, 0xf,0x22,0x79, 0x5,0x25,0x23, 0x6,0x29,0x41, 0xf,0x25,0x43, 0x6,0x2e,0x52, 0x6,0x2e,0x51, 0xf,0x29,0x28, 0x6,0x35,0x2f, 0x5,0x2c,0x66, 0x4,0x2b,0x5f, 0x6,0x35,0x30, 0xf,0x2d,0x63, 0x6,0x35,0x31, 0x6,0x46,0x43, 0x6,0x3d,0x23, 0x6,0x3d,0x22, 0x4,0x30,0x44, 0x5,0x30,0x75, 0xf,0x32,0x74, 0xf,0x32,0x75, 0xf,0x32,0x72, 0x6,0x46,0x45, 0x6,0x46,0x44, 0x6,0x46,0x46, 0x4,0x36,0x2f, 0xf,0x39,0x35, 0xf,0x39,0x36, 0xf,0x39,0x37, 0x6,0x4c,0x2d, 0xf,0x40,0x36, 0xf,0x40,0x37, 0xf,0x40,0x38, 0xf,0x46,0x42, 0x6,0x50,0x52, 0x5,0x4b,0x71, 0x7,0x21,0x22, 0xf,0x4d,0x57, 0xf,0x4d,0x58, 0xf,0x4d,0x59, 0x7,0x26,0x79, 0x7,0x21,0x24, 0x7,0x21,0x23, 0x7,0x21,0x46, 0x7,0x2c,0x3f, 0x5,0x53,0x53, 0x7,0x2c,0x3e, 0x7,0x2c,0x3d, 0x7,0x46,0x23, 0x7,0x46,0x28, 0x6,0x21,0x34, 0x6,0x21,0x35, 0xf,0x21,0x24, 0x6,0x21,0x4c, 0xf,0x21,0x29, 0x6,0x21,0x4b, 0x3,0x21,0x6f, 0xf,0x21,0x43, 0x6,0x22,0x35, 0x6,0x22,0x34, 0x6,0x22,0x36, 0x4,0x21,0x58, 0x4,0x22,0x2c, 0x4,0x22,0x2b, 0x4,0x22,0x29, 0x6,0x23,0x4f, 0x4,0x22,0x30, 0x6,0x23,0x50, 0x5,0x22,0x27, 0x6,0x23,0x4d, 0x6,0x23,0x4c, 0x4,0x22,0x2f, 0x6,0x23,0x4b, 0xf,0x21,0x73, 0xf,0x21,0x74, 0xf,0x21,0x75, 0xf,0x21,0x76, 0xf,0x21,0x77, 0xf,0x21,0x78, 0xf,0x21,0x79, 0x5,0x22,0x28, 0x6,0x23,0x51, 0x5,0x22,0x26, 0xf,0x21,0x7a, 0x5,0x23,0x32, 0x6,0x25,0x6a, 0x4,0x23,0x3a, 0x6,0x25,0x6b, 0x6,0x25,0x74, 0x6,0x25,0x70, 0x6,0x25,0x6c, 0xf,0x22,0x7a, 0xf,0x22,0x7b, 0xf,0x22,0x7c, 0xf,0x22,0x7d, 0xf,0x23,0x21, 0xf,0x23,0x22, 0xf,0x23,0x23, 0xf,0x23,0x25, 0xf,0x23,0x28, 0xf,0x23,0x29, 0xf,0x23,0x2a, 0xf,0x23,0x2b, 0xf,0x23,0x2c, 0x4,0x23,0x38, 0x6,0x25,0x6d, 0x6,0x25,0x6f, 0xf,0x23,0x26, 0x6,0x25,0x6e, 0x6,0x25,0x69, 0x5,0x23,0x33, 0x6,0x25,0x73, 0x6,0x29,0x43, 0x6,0x29,0x45, 0x4,0x25,0x3a, 0x5,0x25,0x28, 0x6,0x29,0x46, 0x5,0x25,0x29, 0x3,0x27,0x4e, 0x5,0x25,0x2a, 0x4,0x25,0x37, 0x4,0x25,0x35, 0x6,0x29,0x4a, 0x6,0x29,0x44, 0x6,0x29,0x4c, 0x6,0x29,0x47, 0x6,0x29,0x4e, 0x5,0x25,0x26, 0x6,0x29,0x42, 0xf,0x25,0x45, 0xf,0x25,0x46, 0xf,0x25,0x48, 0xf,0x25,0x49, 0xf,0x25,0x4b, 0xf,0x25,0x4c, 0xf,0x25,0x4d, 0xf,0x25,0x4e, 0xf,0x25,0x4f, 0xf,0x25,0x50, 0xf,0x25,0x51, 0x6,0x29,0x4d, 0x6,0x29,0x48, 0x6,0x29,0x49, 0x6,0x29,0x4b, 0x5,0x25,0x24, 0x5,0x25,0x27, 0x5,0x27,0x7c, 0x6,0x2e,0x64, 0x6,0x2e,0x59, 0x5,0x2b,0x72, 0x4,0x28,0x36, 0x6,0x2e,0x63, 0x6,0x2e,0x57, 0x6,0x2e,0x56, 0x5,0x28,0x23, 0x4,0x28,0x3b, 0x6,0x2e,0x5d, 0x5,0x27,0x7e, 0x5,0x27,0x7d, 0x5,0x28,0x22, 0x6,0x2e,0x62, 0x6,0x2e,0x55, 0x6,0x2e,0x54, 0x6,0x2e,0x65, 0x6,0x2e,0x5c, 0xf,0x29,0x29, 0xf,0x29,0x2a, 0xf,0x29,0x2b, 0xf,0x29,0x2c, 0xf,0x29,0x2e, 0xf,0x29,0x2f, 0xf,0x29,0x31, 0xf,0x29,0x32, 0xf,0x29,0x33, 0xf,0x29,0x34, 0xf,0x29,0x35, 0xf,0x29,0x36, 0xf,0x29,0x37, 0xf,0x29,0x38, 0x6,0x2e,0x53, 0x6,0x2e,0x58, 0x6,0x2e,0x5b, 0x6,0x2e,0x5e, 0x6,0x2e,0x60, 0xf,0x25,0x47, 0x6,0x2e,0x5f, 0x5,0x28,0x24, 0x4,0x2b,0x63, 0x5,0x2b,0x70, 0x4,0x2b,0x67, 0x6,0x35,0x36, 0x5,0x2b,0x6b, 0x6,0x35,0x35, 0x5,0x2b,0x74, 0x4,0x2b,0x66, 0x4,0x2b,0x68, 0x5,0x2b,0x6f, 0x6,0x35,0x32, 0x5,0x2b,0x69, 0xf,0x2d,0x64, 0xf,0x2d,0x6e, 0x6,0x35,0x37, 0x5,0x2b,0x6e, 0xf,0x2d,0x66, 0xf,0x2d,0x67, 0xf,0x2d,0x6a, 0xf,0x2d,0x6b, 0xf,0x2d,0x6c, 0xf,0x2d,0x6d, 0xf,0x2d,0x6f, 0xf,0x2d,0x71, 0xf,0x2d,0x72, 0xf,0x2d,0x73, 0xf,0x2d,0x74, 0xf,0x2d,0x75, 0xf,0x2d,0x76, 0xf,0x2d,0x78, 0xf,0x2d,0x79, 0xf,0x2d,0x7a, 0xf,0x2d,0x7b, 0xf,0x2d,0x7c, 0x6,0x35,0x21, 0x6,0x35,0x3a, 0x6,0x35,0x3b, 0x6,0x35,0x33, 0x6,0x35,0x34, 0x5,0x2b,0x68, 0x6,0x35,0x39, 0xf,0x2d,0x77, 0xf,0x2d,0x70, 0x5,0x2b,0x6a, 0x5,0x2b,0x6d, 0x5,0x2b,0x75, 0x5,0x2b,0x71, 0x5,0x2b,0x73, 0x4,0x2b,0x60, 0x6,0x3d,0x2b, 0x6,0x3d,0x2d, 0x6,0x3d,0x2c, 0x4,0x30,0x49, 0x4,0x30,0x48, 0x6,0x3d,0x30, 0x6,0x3d,0x28, 0x5,0x31,0x21, 0x6,0x3d,0x33, 0x5,0x30,0x77, 0x6,0x3d,0x2e, 0x6,0x3d,0x27, 0x5,0x31,0x22, 0x5,0x30,0x76, 0x4,0x30,0x46, 0x6,0x3d,0x2a, 0x6,0x3d,0x31, 0x6,0x3d,0x37, 0x6,0x3d,0x32, 0x6,0x3d,0x29, 0x4,0x30,0x4b, 0x6,0x3d,0x34, 0xf,0x2d,0x69, 0xf,0x32,0x77, 0xf,0x32,0x78, 0xf,0x32,0x79, 0xf,0x32,0x7a, 0xf,0x32,0x7b, 0xf,0x32,0x7c, 0xf,0x32,0x7e, 0xf,0x33,0x21, 0xf,0x33,0x23, 0xf,0x33,0x24, 0xf,0x33,0x25, 0xf,0x33,0x26, 0xf,0x33,0x27, 0x6,0x46,0x37, 0x6,0x3d,0x38, 0x6,0x3e,0x65, 0x6,0x3d,0x39, 0x6,0x3d,0x2f, 0x5,0x30,0x7a, 0x6,0x43,0x63, 0x5,0x30,0x7d, 0x5,0x31,0x23, 0x6,0x3d,0x24, 0x6,0x3d,0x26, 0xf,0x32,0x7d, 0x5,0x30,0x79, 0x5,0x30,0x7e, 0x5,0x30,0x78, 0x6,0x3d,0x25, 0x6,0x3d,0x36, 0x5,0x30,0x7c, 0x6,0x46,0x49, 0x6,0x46,0x4f, 0x5,0x36,0x56, 0x5,0x36,0x51, 0x6,0x46,0x4c, 0x5,0x36,0x4e, 0x5,0x36,0x52, 0x5,0x36,0x63, 0x5,0x36,0x53, 0x6,0x46,0x48, 0x5,0x36,0x55, 0x5,0x36,0x50, 0x6,0x46,0x56, 0x4,0x36,0x35, 0x5,0x36,0x54, 0x6,0x46,0x52, 0x6,0x46,0x50, 0x6,0x46,0x4b, 0x6,0x46,0x4e, 0x6,0x46,0x53, 0xf,0x32,0x76, 0x6,0x46,0x58, 0x5,0x36,0x4f, 0x5,0x36,0x57, 0x6,0x46,0x47, 0xf,0x39,0x38, 0xf,0x39,0x39, 0xf,0x39,0x3a, 0xf,0x39,0x3b, 0xf,0x39,0x3c, 0xf,0x39,0x3d, 0xf,0x39,0x3e, 0xf,0x39,0x3f, 0x6,0x46,0x4d, 0x4,0x36,0x3b, 0x6,0x46,0x51, 0x6,0x46,0x54, 0x5,0x36,0x4d, 0x6,0x46,0x4a, 0x5,0x34,0x21, 0x6,0x50,0x5a, 0x4,0x42,0x38, 0x5,0x3d,0x5a, 0x5,0x3d,0x58, 0x6,0x50,0x53, 0x5,0x30,0x7b, 0x5,0x3d,0x5e, 0x5,0x3d,0x5c, 0x6,0x50,0x58, 0x5,0x3d,0x5b, 0x6,0x50,0x5f, 0x6,0x50,0x5d, 0x4,0x3c,0x2e, 0x6,0x50,0x5c, 0x6,0x50,0x62, 0x6,0x50,0x55, 0x4,0x3c,0x2f, 0x5,0x3d,0x60, 0x6,0x50,0x54, 0x5,0x3d,0x57, 0x6,0x50,0x57, 0x6,0x50,0x5e, 0xf,0x40,0x39, 0xf,0x40,0x3a, 0xf,0x40,0x3b, 0xf,0x40,0x3c, 0xf,0x40,0x3d, 0xf,0x40,0x3e, 0xf,0x40,0x3f, 0xf,0x40,0x40, 0xf,0x40,0x41, 0xf,0x40,0x42, 0xf,0x40,0x43, 0xf,0x40,0x44, 0xf,0x40,0x45, 0xf,0x40,0x46, 0x6,0x50,0x61, 0x6,0x56,0x4e, 0x6,0x50,0x59, 0x6,0x50,0x56, 0x6,0x46,0x57, 0x5,0x3d,0x59, 0x5,0x3d,0x5d, 0x5,0x3d,0x5f, 0x4,0x3c,0x2b, 0x6,0x50,0x60, 0x6,0x5a,0x71, 0x5,0x3d,0x61, 0x7,0x21,0x2e, 0x4,0x42,0x34, 0x5,0x44,0x56, 0x6,0x5a,0x64, 0x6,0x5a,0x69, 0x5,0x3d,0x62, 0x6,0x5a,0x6b, 0x4,0x42,0x39, 0x6,0x5a,0x74, 0x4,0x42,0x31, 0x6,0x5a,0x75, 0x6,0x5a,0x68, 0x6,0x5a,0x67, 0x6,0x5a,0x76, 0xf,0x46,0x43, 0xf,0x46,0x44, 0xf,0x46,0x45, 0xf,0x46,0x46, 0xf,0x46,0x47, 0xf,0x46,0x49, 0xf,0x46,0x4a, 0xf,0x46,0x4b, 0xf,0x46,0x4c, 0xf,0x46,0x4d, 0xf,0x46,0x4e, 0xf,0x46,0x4f, 0xf,0x46,0x51, 0xf,0x46,0x52, 0xf,0x46,0x53, 0xf,0x46,0x54, 0xf,0x46,0x56, 0xf,0x46,0x57, 0xf,0x46,0x58, 0xf,0x53,0x45, 0x7,0x26,0x2d, 0x5,0x44,0x58, 0x6,0x5a,0x77, 0x6,0x5e,0x57, 0x6,0x5a,0x6d, 0x6,0x5a,0x6f, 0x6,0x5a,0x65, 0xf,0x46,0x50, 0xf,0x46,0x48, 0xf,0x46,0x55, 0x4,0x42,0x30, 0x6,0x5a,0x66, 0x6,0x5a,0x6a, 0x6,0x5a,0x6e, 0x6,0x5a,0x70, 0x4,0x42,0x36, 0x5,0x3f,0x46, 0x4,0x48,0x7e, 0x4,0x48,0x7a, 0x6,0x5a,0x6c, 0x7,0x21,0x2f, 0x7,0x21,0x31, 0x7,0x21,0x29, 0x7,0x21,0x26, 0x7,0x21,0x25, 0x5,0x4b,0x77, 0x4,0x48,0x7c, 0x7,0x21,0x2b, 0x7,0x21,0x2c, 0x5,0x4b,0x73, 0x7,0x21,0x2a, 0x5,0x4b,0x79, 0x5,0x4b,0x78, 0x7,0x21,0x27, 0xf,0x4d,0x5a, 0xf,0x4d,0x5b, 0xf,0x4d,0x5c, 0xf,0x4d,0x5d, 0xf,0x4d,0x5e, 0xf,0x4d,0x60, 0xf,0x4d,0x61, 0x7,0x21,0x28, 0x5,0x4b,0x72, 0x7,0x21,0x2d, 0xf,0x4d,0x62, 0x4,0x49,0x21, 0x5,0x4b,0x75, 0x7,0x21,0x30, 0x5,0x4b,0x74, 0x5,0x4c,0x45, 0x5,0x53,0x54, 0x5,0x53,0x5a, 0x7,0x2c,0x40, 0x4,0x4f,0x58, 0x4,0x4f,0x5f, 0x5,0x53,0x58, 0x4,0x4f,0x5c, 0x4,0x4f,0x5e, 0x5,0x53,0x55, 0x5,0x53,0x56, 0xf,0x53,0x46, 0xf,0x53,0x47, 0xf,0x53,0x48, 0xf,0x53,0x49, 0xf,0x53,0x4a, 0x5,0x53,0x5b, 0x5,0x53,0x57, 0x7,0x36,0x78, 0x5,0x4b,0x76, 0x5,0x5a,0x6f, 0x5,0x5a,0x70, 0x4,0x55,0x67, 0x4,0x55,0x66, 0x7,0x36,0x76, 0xf,0x59,0x48, 0xf,0x59,0x4a, 0xf,0x59,0x4b, 0xf,0x59,0x4c, 0xf,0x59,0x4e, 0x7,0x36,0x75, 0x7,0x36,0x77, 0xf,0x59,0x49, 0x4,0x55,0x68, 0x7,0x36,0x74, 0x7,0x3e,0x76, 0x4,0x5a,0x6b, 0x4,0x5a,0x69, 0x4,0x5a,0x6a, 0x7,0x3e,0x78, 0x7,0x3e,0x77, 0xf,0x5e,0x30, 0xf,0x5e,0x31, 0xf,0x5e,0x2c, 0xf,0x5e,0x2e, 0xf,0x5e,0x2f, 0x7,0x3e,0x75, 0x5,0x61,0x31, 0x4,0x5a,0x6c, 0x5,0x61,0x2f, 0x5,0x61,0x30, 0x5,0x61,0x32, 0x5,0x67,0x4a, 0x5,0x67,0x4e, 0x4,0x63,0x2e, 0x5,0x67,0x4d, 0x5,0x67,0x4f, 0xf,0x61,0x7e, 0xf,0x62,0x21, 0x7,0x47,0x6f, 0x5,0x67,0x4c, 0x5,0x67,0x4b, 0x5,0x69,0x7c, 0x7,0x52,0x75, 0x7,0x4d,0x3c, 0xf,0x64,0x7a, 0x5,0x6b,0x6b, 0x7,0x4d,0x3b, 0x7,0x4d,0x68, 0x4,0x66,0x2f, 0x4,0x66,0x2e, 0x5,0x6f,0x68, 0x7,0x57,0x4e, 0x5,0x6b,0x6c, 0xf,0x67,0x3f, 0xf,0x67,0x7e, 0x4,0x66,0x2d, 0x7,0x57,0x4d, 0xf,0x69,0x38, 0xf,0x69,0x3a, 0xf,0x69,0x39, 0x5,0x73,0x31, 0x4,0x6a,0x40, 0x7,0x5b,0x45, 0xf,0x6a,0x4b, 0xf,0x6b,0x41, 0x5,0x75,0x62, 0x4,0x6d,0x52, 0xf,0x6c,0x49, 0x6,0x21,0x4d, 0x4,0x21,0x5c, 0x4,0x22,0x32, 0x6,0x23,0x53, 0x6,0x23,0x54, 0x6,0x25,0x75, 0x6,0x25,0x77, 0x6,0x25,0x78, 0x5,0x23,0x35, 0x6,0x25,0x76, 0x6,0x29,0x51, 0x6,0x29,0x50, 0x6,0x29,0x4f, 0x6,0x29,0x53, 0xf,0x25,0x53, 0x6,0x29,0x52, 0xf,0x25,0x52, 0x6,0x2e,0x67, 0x6,0x2e,0x68, 0x5,0x2b,0x76, 0xf,0x2d,0x7d, 0xf,0x2d,0x7e, 0xf,0x2e,0x21, 0x6,0x35,0x3c, 0xf,0x33,0x28, 0x5,0x31,0x24, 0x5,0x31,0x25, 0xf,0x33,0x29, 0xf,0x33,0x2a, 0x6,0x46,0x59, 0xf,0x39,0x40, 0xf,0x39,0x41, 0xf,0x39,0x42, 0x5,0x36,0x58, 0xf,0x39,0x43, 0xf,0x40,0x47, 0x6,0x50,0x63, 0xf,0x40,0x48, 0xf,0x46,0x59, 0xf,0x46,0x5a, 0x5,0x44,0x59, 0x7,0x21,0x34, 0x7,0x21,0x32, 0x5,0x4b,0x7b, 0xf,0x4d,0x63, 0xf,0x4d,0x64, 0x5,0x4b,0x7a, 0x7,0x21,0x33, 0x5,0x53,0x5c, 0x7,0x2c,0x41, 0xf,0x53,0x4b, 0xf,0x53,0x4c, 0xf,0x53,0x4d, 0xf,0x53,0x4e, 0x5,0x5a,0x71, 0xf,0x59,0x4f, 0xf,0x59,0x50, 0xf,0x59,0x51, 0x7,0x3e,0x79, 0x5,0x61,0x33, 0xf,0x5e,0x32, 0x7,0x46,0x29, 0x5,0x67,0x50, 0xf,0x64,0x7b, 0x5,0x67,0x51, 0x5,0x6b,0x6d, 0xf,0x67,0x41, 0xf,0x69,0x3b, 0xf,0x6a,0x4c, 0x5,0x77,0x53, 0xf,0x6b,0x42, 0x6,0x21,0x36, 0x5,0x21,0x36, 0x5,0x21,0x35, 0x6,0x22,0x37, 0x6,0x23,0x56, 0x6,0x23,0x55, 0x5,0x23,0x36, 0x6,0x25,0x79, 0x5,0x23,0x38, 0x5,0x28,0x25, 0x5,0x28,0x26, 0x4,0x2b,0x6a, 0x6,0x35,0x3d, 0xf,0x2e,0x22, 0xf,0x2e,0x23, 0x6,0x3d,0x3a, 0x6,0x46,0x5a, 0x6,0x50,0x64, 0x5,0x3d,0x63, 0x4,0x3c,0x31, 0x6,0x5a,0x78, 0x5,0x5a,0x72, 0x6,0x21,0x37, 0x6,0x21,0x4e, 0x5,0x21,0x37, 0x6,0x21,0x41, 0x6,0x21,0x59, 0x5,0x21,0x50, 0x6,0x23,0x3b, 0x4,0x22,0x35, 0x6,0x23,0x57, 0x6,0x25,0x7c, 0x6,0x25,0x7e, 0x5,0x23,0x39, 0xf,0x23,0x2d, 0x6,0x25,0x7a, 0x6,0x29,0x54, 0x6,0x2e,0x6b, 0x6,0x2e,0x69, 0x5,0x28,0x27, 0x6,0x2e,0x6a, 0x6,0x2e,0x4f, 0x6,0x30,0x7b, 0x6,0x35,0x40, 0x6,0x35,0x3f, 0x6,0x35,0x41, 0x6,0x35,0x3e, 0x6,0x3d,0x3b, 0x6,0x46,0x5d, 0x5,0x3d,0x64, 0xf,0x39,0x44, 0xf,0x39,0x45, 0x6,0x46,0x5b, 0x6,0x46,0x5c, 0x5,0x3d,0x65, 0x6,0x50,0x65, 0xf,0x40,0x49, 0xf,0x40,0x4a, 0x4,0x42,0x3a, 0x6,0x5a,0x79, 0xf,0x54,0x46, 0xf,0x53,0x4f, 0xf,0x53,0x50, 0x5,0x61,0x34, 0xf,0x5e,0x33, 0x7,0x46,0x2a, 0x7,0x46,0x2b, 0x4,0x21,0x2d, 0x6,0x21,0x4f, 0x6,0x21,0x51, 0x6,0x22,0x39, 0x4,0x21,0x5d, 0x6,0x22,0x38, 0x5,0x21,0x52, 0xf,0x21,0x46, 0x6,0x22,0x3a, 0x5,0x21,0x51, 0x6,0x23,0x5a, 0x6,0x23,0x58, 0x6,0x25,0x47, 0x6,0x26,0x23, 0x6,0x26,0x21, 0x6,0x26,0x22, 0x5,0x23,0x3a, 0x6,0x28,0x7a, 0x5,0x25,0x2c, 0x6,0x29,0x55, 0x6,0x29,0x56, 0x6,0x2e,0x6c, 0x6,0x35,0x42, 0x6,0x35,0x43, 0x5,0x2b,0x77, 0x5,0x2b,0x78, 0x6,0x3d,0x3d, 0x6,0x46,0x5f, 0x3,0x39,0x77, 0x6,0x46,0x5e, 0x4,0x3c,0x33, 0x5,0x3d,0x66, 0x6,0x5a,0x7b, 0x6,0x5a,0x7a, 0x7,0x21,0x35, 0x5,0x53,0x5d, 0x7,0x2c,0x42, 0xf,0x55,0x76, 0x4,0x5a,0x6d, 0xf,0x67,0x42, 0x7,0x57,0x4f, 0x5,0x21,0x38, 0x6,0x22,0x3b, 0xf,0x21,0x48, 0xf,0x21,0x49, 0x6,0x23,0x5b, 0x4,0x22,0x37, 0x5,0x22,0x29, 0xf,0x21,0x7b, 0xf,0x23,0x2e, 0xf,0x23,0x2f, 0x5,0x25,0x2d, 0xf,0x25,0x55, 0x6,0x2e,0x6d, 0x6,0x3d,0x3e, 0xf,0x2e,0x25, 0xf,0x2e,0x26, 0xf,0x2e,0x27, 0xf,0x2e,0x28, 0xf,0x2e,0x29, 0x5,0x31,0x27, 0x6,0x46,0x60, 0xf,0x39,0x47, 0xf,0x39,0x48, 0x6,0x46,0x61, 0xf,0x3a,0x5d, 0x6,0x50,0x66, 0x6,0x5a,0x7c, 0xf,0x46,0x5b, 0x5,0x4e,0x77, 0x7,0x2c,0x43, 0xf,0x59,0x52, 0xf,0x53,0x51, 0x7,0x3e,0x7a, 0x7,0x46,0x2c, 0x7,0x4d,0x3f, 0x5,0x6f,0x69, 0x5,0x75,0x63, 0xf,0x21,0x4a, 0x6,0x23,0x5c, 0xf,0x21,0x7d, 0xf,0x21,0x7e, 0x4,0x22,0x38, 0x5,0x23,0x3b, 0x6,0x26,0x24, 0x4,0x23,0x3c, 0xf,0x23,0x30, 0xf,0x23,0x31, 0xf,0x23,0x32, 0xf,0x23,0x33, 0xf,0x23,0x24, 0xf,0x22,0x7e, 0x4,0x25,0x41, 0x4,0x25,0x42, 0x6,0x29,0x58, 0x6,0x29,0x59, 0x5,0x25,0x2f, 0xf,0x25,0x57, 0x5,0x28,0x29, 0x4,0x28,0x41, 0x4,0x28,0x42, 0x5,0x28,0x2c, 0x5,0x28,0x28, 0x5,0x28,0x2a, 0x6,0x2e,0x6f, 0xf,0x29,0x3a, 0xf,0x29,0x3c, 0xf,0x29,0x3d, 0xf,0x29,0x3e, 0xf,0x29,0x3f, 0x6,0x2e,0x6e, 0x5,0x2b,0x7a, 0x4,0x2b,0x6b, 0x5,0x2b,0x79, 0x5,0x28,0x2b, 0x6,0x35,0x45, 0x5,0x2b,0x7b, 0xf,0x2e,0x2a, 0xf,0x2e,0x2b, 0x6,0x35,0x46, 0x5,0x31,0x28, 0x6,0x3d,0x3f, 0x6,0x3d,0x40, 0x4,0x30,0x4e, 0xf,0x33,0x2b, 0xf,0x33,0x2c, 0xf,0x33,0x2d, 0xf,0x33,0x2f, 0xf,0x33,0x30, 0x6,0x46,0x62, 0x5,0x36,0x5c, 0x5,0x36,0x5a, 0x5,0x36,0x5b, 0x5,0x36,0x59, 0x4,0x36,0x3e, 0xf,0x33,0x2e, 0x5,0x3d,0x6c, 0x5,0x3d,0x67, 0x5,0x3d,0x69, 0x5,0x3d,0x6a, 0x5,0x3d,0x68, 0x5,0x3d,0x6b, 0x6,0x50,0x67, 0x6,0x5a,0x7d, 0x5,0x4c,0x21, 0x5,0x44,0x5a, 0x7,0x21,0x37, 0xf,0x46,0x5d, 0xf,0x46,0x5e, 0x5,0x4b,0x7e, 0x5,0x4b,0x7d, 0x5,0x4b,0x7c, 0x7,0x21,0x36, 0xf,0x4d,0x67, 0xf,0x53,0x53, 0x7,0x2c,0x45, 0xf,0x4d,0x66, 0xf,0x53,0x52, 0x4,0x55,0x6a, 0x7,0x2c,0x46, 0x5,0x5a,0x73, 0xf,0x59,0x53, 0xf,0x59,0x54, 0x5,0x61,0x36, 0x5,0x61,0x35, 0x5,0x61,0x37, 0xf,0x5e,0x34, 0x7,0x3e,0x7b, 0x5,0x67,0x52, 0x5,0x67,0x53, 0x7,0x52,0x76, 0x5,0x73,0x32, 0x4,0x21,0x29, 0x6,0x21,0x52, 0xf,0x21,0x2a, 0xf,0x21,0x2b, 0xf,0x21,0x2c, 0xf,0x21,0x2e, 0x6,0x21,0x5c, 0xf,0x21,0x2d, 0x5,0x21,0x53, 0x6,0x22,0x3d, 0x4,0x21,0x5f, 0x6,0x23,0x5e, 0x6,0x23,0x5d, 0x6,0x23,0x5f, 0x6,0x23,0x60, 0xf,0x21,0x4b, 0x6,0x26,0x27, 0x6,0x26,0x25, 0x6,0x26,0x26, 0xf,0x23,0x34, 0xf,0x23,0x35, 0x4,0x25,0x46, 0x6,0x29,0x5a, 0x4,0x25,0x44, 0x6,0x29,0x5b, 0x6,0x29,0x5c, 0x6,0x29,0x5d, 0xf,0x25,0x58, 0xf,0x25,0x59, 0x6,0x2e,0x72, 0x6,0x2e,0x70, 0x6,0x2e,0x71, 0x6,0x35,0x47, 0xf,0x2e,0x2c, 0x6,0x37,0x27, 0x6,0x3d,0x42, 0x6,0x3d,0x43, 0x6,0x3d,0x41, 0xf,0x33,0x31, 0xf,0x33,0x32, 0xf,0x33,0x33, 0x6,0x46,0x63, 0x6,0x46,0x66, 0xf,0x39,0x49, 0x6,0x46,0x64, 0xf,0x39,0x4a, 0xf,0x46,0x5f, 0xf,0x46,0x60, 0xf,0x46,0x61, 0xf,0x4d,0x68, 0x7,0x2c,0x47, 0xf,0x53,0x54, 0xf,0x53,0x55, 0xf,0x53,0x43, 0xf,0x59,0x55, 0xf,0x5e,0x35, 0xf,0x67,0x43, 0x4,0x21,0x2e, 0x5,0x21,0x39, 0x6,0x21,0x53, 0x6,0x21,0x54, 0x6,0x22,0x3f, 0x5,0x21,0x54, 0x6,0x22,0x3e, 0xf,0x21,0x4c, 0x6,0x23,0x65, 0x6,0x23,0x61, 0x6,0x23,0x62, 0x6,0x23,0x63, 0xf,0x22,0x21, 0x5,0x22,0x2a, 0x6,0x26,0x28, 0xf,0x23,0x36, 0x6,0x29,0x60, 0x6,0x29,0x5f, 0x6,0x2e,0x73, 0x6,0x2e,0x74, 0x6,0x34,0x7a, 0x6,0x35,0x48, 0x6,0x3d,0x44, 0x6,0x3d,0x45, 0x5,0x36,0x5d, 0x6,0x5a,0x7e, 0xf,0x46,0x62, 0x7,0x21,0x70, 0x7,0x36,0x7b, 0x5,0x5a,0x76, 0x5,0x67,0x54, 0x7,0x4e,0x3e, 0x6,0x21,0x39, 0x4,0x21,0x40, 0x6,0x21,0x55, 0x5,0x21,0x3a, 0x5,0x21,0x3b, 0x6,0x21,0x56, 0x4,0x21,0x41, 0xf,0x21,0x2f, 0x6,0x21,0x57, 0x5,0x21,0x55, 0x5,0x21,0x56, 0x4,0x21,0x62, 0x6,0x22,0x44, 0x5,0x21,0x57, 0x6,0x22,0x43, 0x6,0x22,0x40, 0x6,0x22,0x45, 0x4,0x22,0x3a, 0x6,0x23,0x6a, 0x5,0x22,0x2e, 0x5,0x22,0x2c, 0x5,0x22,0x2b, 0x4,0x22,0x3b, 0x4,0x22,0x39, 0x6,0x23,0x68, 0x6,0x23,0x67, 0x5,0x22,0x2f, 0x6,0x23,0x6b, 0x6,0x23,0x69, 0x5,0x22,0x2d, 0x4,0x22,0x3d, 0xf,0x22,0x22, 0xf,0x22,0x23, 0x4,0x22,0x3e, 0x6,0x23,0x66, 0x4,0x23,0x41, 0x6,0x26,0x2b, 0x4,0x23,0x43, 0x5,0x23,0x3d, 0x4,0x23,0x42, 0x5,0x23,0x46, 0x5,0x23,0x45, 0x5,0x23,0x43, 0x5,0x23,0x40, 0x6,0x26,0x29, 0x5,0x23,0x3f, 0x5,0x23,0x42, 0x5,0x23,0x41, 0x6,0x26,0x2a, 0x6,0x26,0x2c, 0x5,0x23,0x3e, 0x5,0x23,0x44, 0x6,0x29,0x69, 0x5,0x25,0x33, 0x5,0x25,0x35, 0x4,0x25,0x49, 0x4,0x25,0x4b, 0x3,0x27,0x5c, 0x6,0x29,0x66, 0x4,0x25,0x4d, 0x6,0x29,0x64, 0x6,0x29,0x65, 0x6,0x29,0x6c, 0x6,0x2e,0x75, 0x6,0x29,0x6a, 0x5,0x25,0x30, 0x5,0x25,0x36, 0x6,0x29,0x6b, 0x5,0x25,0x32, 0x6,0x29,0x67, 0x5,0x25,0x34, 0xf,0x25,0x5a, 0xf,0x25,0x5b, 0xf,0x25,0x5c, 0xf,0x25,0x5d, 0x6,0x29,0x68, 0x6,0x29,0x62, 0x6,0x29,0x61, 0x5,0x25,0x31, 0x6,0x29,0x57, 0x4,0x28,0x47, 0x5,0x28,0x2d, 0x4,0x28,0x45, 0x6,0x2f,0x24, 0x6,0x2e,0x7b, 0x6,0x2f,0x22, 0x4,0x28,0x48, 0x6,0x2f,0x21, 0x4,0x28,0x44, 0x4,0x28,0x46, 0x6,0x2e,0x78, 0x6,0x2e,0x7e, 0x6,0x2f,0x23, 0x6,0x2e,0x7a, 0x6,0x2e,0x7d, 0x6,0x2e,0x7c, 0xf,0x29,0x40, 0xf,0x29,0x41, 0xf,0x29,0x42, 0x6,0x2e,0x79, 0x5,0x28,0x2e, 0x6,0x2e,0x77, 0x6,0x35,0x49, 0x4,0x2b,0x70, 0x4,0x2b,0x6d, 0x5,0x2c,0x25, 0x5,0x2c,0x23, 0x4,0x2b,0x6f, 0x4,0x2b,0x73, 0x6,0x35,0x4e, 0x6,0x35,0x52, 0x5,0x2c,0x22, 0x6,0x35,0x53, 0x4,0x2b,0x6c, 0x5,0x2c,0x26, 0x6,0x35,0x51, 0x4,0x2b,0x71, 0x6,0x35,0x50, 0x6,0x35,0x4f, 0x6,0x35,0x4c, 0x6,0x35,0x4b, 0x4,0x2b,0x72, 0x5,0x2c,0x24, 0x6,0x35,0x4d, 0xf,0x2e,0x33, 0x6,0x35,0x54, 0xf,0x2e,0x2e, 0xf,0x2e,0x2f, 0xf,0x2e,0x30, 0xf,0x2e,0x32, 0xf,0x2e,0x31, 0x6,0x35,0x4a, 0x5,0x2c,0x27, 0x5,0x2b,0x7d, 0x5,0x2c,0x21, 0x5,0x2b,0x7e, 0x4,0x30,0x50, 0x5,0x31,0x2b, 0x4,0x30,0x51, 0x5,0x31,0x2a, 0x6,0x3d,0x46, 0x4,0x30,0x56, 0x4,0x36,0x49, 0x4,0x30,0x55, 0x6,0x3d,0x49, 0x6,0x3d,0x47, 0x5,0x36,0x5e, 0x4,0x30,0x4f, 0x5,0x2c,0x28, 0xf,0x33,0x34, 0xf,0x33,0x35, 0xf,0x33,0x37, 0x6,0x3d,0x48, 0x6,0x3d,0x4a, 0x6,0x3d,0x4b, 0x4,0x36,0x43, 0x5,0x36,0x5f, 0x6,0x46,0x6d, 0x6,0x46,0x69, 0x4,0x36,0x46, 0x4,0x36,0x47, 0x5,0x36,0x60, 0x5,0x36,0x64, 0x4,0x36,0x4a, 0x4,0x36,0x44, 0x4,0x36,0x41, 0x4,0x36,0x40, 0x6,0x46,0x6b, 0x6,0x46,0x68, 0x6,0x46,0x6c, 0x5,0x36,0x61, 0x5,0x36,0x62, 0x6,0x46,0x6a, 0xf,0x39,0x4b, 0xf,0x39,0x4c, 0xf,0x39,0x4d, 0xf,0x39,0x4e, 0x4,0x36,0x48, 0x6,0x4c,0x46, 0x6,0x46,0x6e, 0x5,0x36,0x65, 0x4,0x3c,0x39, 0x6,0x50,0x6f, 0x5,0x3d,0x73, 0x6,0x50,0x6d, 0x4,0x3c,0x35, 0x5,0x3d,0x74, 0x6,0x50,0x6e, 0x5,0x3d,0x6d, 0x4,0x3c,0x37, 0x4,0x3c,0x36, 0x5,0x3d,0x6e, 0x4,0x3c,0x3a, 0x5,0x3d,0x6f, 0x6,0x50,0x6b, 0xf,0x40,0x4b, 0x6,0x50,0x6a, 0x6,0x50,0x68, 0x6,0x50,0x70, 0x6,0x50,0x69, 0x5,0x3d,0x72, 0x5,0x3d,0x71, 0xf,0x40,0x4c, 0x5,0x44,0x5b, 0x4,0x42,0x3b, 0x6,0x5b,0x24, 0x5,0x44,0x61, 0x6,0x5b,0x22, 0x6,0x5b,0x21, 0x4,0x3c,0x38, 0x4,0x42,0x40, 0x5,0x44,0x62, 0x5,0x44,0x5c, 0x5,0x44,0x5f, 0x4,0x42,0x3d, 0x4,0x42,0x44, 0x6,0x5b,0x2b, 0x6,0x5b,0x29, 0x6,0x5b,0x28, 0x5,0x44,0x5e, 0x5,0x4c,0x22, 0x6,0x5b,0x26, 0x5,0x44,0x5d, 0x6,0x5b,0x2a, 0x5,0x44,0x60, 0x6,0x5b,0x25, 0xf,0x46,0x63, 0xf,0x46,0x64, 0xf,0x46,0x65, 0x6,0x5b,0x23, 0x6,0x5b,0x27, 0x5,0x4c,0x23, 0x5,0x4c,0x27, 0x4,0x49,0x24, 0x5,0x4c,0x24, 0x5,0x4c,0x26, 0x7,0x21,0x3c, 0x7,0x21,0x3d, 0x7,0x21,0x3a, 0x7,0x21,0x3e, 0x7,0x21,0x3b, 0x5,0x4c,0x25, 0x7,0x21,0x38, 0x7,0x22,0x5a, 0x7,0x21,0x39, 0x4,0x4f,0x60, 0x7,0x2c,0x49, 0x5,0x5a,0x77, 0x7,0x2c,0x4a, 0x7,0x2c,0x4e, 0x7,0x2c,0x4d, 0x7,0x2c,0x4c, 0x5,0x53,0x5f, 0x5,0x53,0x61, 0x5,0x53,0x60, 0x5,0x53,0x5e, 0x7,0x2c,0x48, 0x7,0x2c,0x4b, 0x7,0x21,0x3f, 0xf,0x53,0x56, 0x5,0x58,0x51, 0x5,0x5a,0x7a, 0x4,0x55,0x6b, 0x5,0x5a,0x79, 0x5,0x5a,0x78, 0x7,0x36,0x7c, 0xf,0x59,0x56, 0x4,0x55,0x6e, 0x7,0x3e,0x7c, 0x5,0x61,0x38, 0x5,0x61,0x39, 0x7,0x36,0x7d, 0xf,0x5e,0x36, 0x5,0x61,0x3a, 0x7,0x46,0x2f, 0x7,0x46,0x2e, 0x7,0x46,0x2d, 0x7,0x4d,0x40, 0x7,0x4d,0x41, 0x5,0x6f,0x6a, 0x7,0x52,0x77, 0xf,0x67,0x44, 0x5,0x75,0x64, 0x4,0x6b,0x65, 0x7,0x62,0x2d, 0x7,0x62,0x2c, 0x6,0x21,0x3a, 0x5,0x21,0x3c, 0x6,0x21,0x58, 0x4,0x21,0x63, 0x5,0x21,0x59, 0x5,0x21,0x58, 0x5,0x22,0x31, 0x5,0x22,0x32, 0xf,0x22,0x25, 0xf,0x22,0x26, 0xf,0x22,0x27, 0xf,0x22,0x28, 0x5,0x22,0x33, 0x6,0x26,0x2e, 0x4,0x23,0x45, 0x5,0x23,0x47, 0xf,0x23,0x38, 0xf,0x23,0x3a, 0xf,0x23,0x3b, 0x6,0x26,0x2d, 0x4,0x23,0x49, 0x5,0x25,0x3d, 0x5,0x25,0x39, 0x6,0x29,0x6d, 0x5,0x25,0x3c, 0x6,0x29,0x6e, 0xf,0x25,0x60, 0xf,0x25,0x61, 0xf,0x25,0x62, 0xf,0x25,0x63, 0x5,0x28,0x30, 0x4,0x28,0x4a, 0x6,0x2f,0x26, 0x5,0x28,0x31, 0x5,0x28,0x2f, 0x6,0x2f,0x28, 0xf,0x29,0x43, 0xf,0x29,0x44, 0xf,0x29,0x45, 0x6,0x35,0x55, 0x6,0x35,0x59, 0x4,0x2b,0x74, 0x5,0x2c,0x2d, 0x5,0x2c,0x29, 0x5,0x2c,0x2b, 0x5,0x2c,0x2c, 0x5,0x2c,0x2a, 0xf,0x2e,0x34, 0xf,0x2e,0x35, 0x6,0x35,0x56, 0x6,0x35,0x57, 0x5,0x31,0x2d, 0x6,0x3d,0x4e, 0x6,0x3d,0x4c, 0x6,0x3d,0x4f, 0x6,0x3d,0x50, 0x6,0x3d,0x51, 0xf,0x33,0x38, 0xf,0x33,0x39, 0x6,0x3d,0x4d, 0x5,0x36,0x69, 0x5,0x36,0x66, 0x5,0x36,0x68, 0x5,0x36,0x6b, 0x5,0x36,0x67, 0xf,0x39,0x4f, 0xf,0x39,0x50, 0x6,0x46,0x6f, 0x6,0x46,0x70, 0x6,0x46,0x71, 0x5,0x3d,0x76, 0x5,0x3d,0x75, 0x4,0x3c,0x3b, 0x6,0x50,0x72, 0x6,0x50,0x71, 0xf,0x40,0x4d, 0x5,0x3d,0x77, 0x4,0x42,0x46, 0x5,0x44,0x66, 0x5,0x44,0x64, 0x5,0x44,0x65, 0x5,0x44,0x69, 0x4,0x42,0x45, 0x5,0x44,0x68, 0x6,0x5b,0x2e, 0xf,0x46,0x66, 0x6,0x5b,0x2c, 0x6,0x5b,0x2d, 0x5,0x4c,0x2b, 0x5,0x4c,0x28, 0x4,0x49,0x26, 0x5,0x4c,0x29, 0x5,0x4c,0x2a, 0x7,0x2c,0x4f, 0x5,0x5a,0x7c, 0xf,0x53,0x57, 0x5,0x5a,0x7b, 0x5,0x5a,0x7d, 0x7,0x36,0x7e, 0x7,0x37,0x22, 0x7,0x37,0x21, 0x5,0x61,0x3c, 0x7,0x3e,0x7e, 0x7,0x3f,0x21, 0x5,0x67,0x56, 0x5,0x67,0x55, 0x7,0x4d,0x42, 0x5,0x6f,0x6b, 0x7,0x5b,0x46, 0x5,0x75,0x65, 0x4,0x6c,0x6b, 0x7,0x66,0x3b, 0x5,0x21,0x3d, 0x6,0x22,0x47, 0x6,0x22,0x48, 0x5,0x22,0x35, 0x5,0x22,0x34, 0x5,0x22,0x36, 0xf,0x22,0x2a, 0x6,0x26,0x2f, 0x5,0x23,0x48, 0x5,0x23,0x49, 0x4,0x25,0x52, 0x6,0x29,0x71, 0x6,0x29,0x70, 0xf,0x25,0x64, 0xf,0x25,0x65, 0x6,0x2f,0x2a, 0x4,0x28,0x4c, 0x6,0x2f,0x2b, 0x6,0x2f,0x2c, 0xf,0x29,0x46, 0x6,0x2f,0x29, 0x4,0x2b,0x76, 0x6,0x35,0x5c, 0x6,0x35,0x5b, 0x6,0x35,0x5e, 0x6,0x35,0x5f, 0x6,0x35,0x5a, 0x6,0x35,0x5d, 0x5,0x2c,0x2f, 0x4,0x30,0x5d, 0x6,0x3d,0x52, 0x5,0x2c,0x2e, 0x5,0x31,0x2e, 0x5,0x31,0x2f, 0x6,0x3d,0x53, 0x4,0x36,0x4e, 0xf,0x39,0x51, 0x6,0x50,0x73, 0x4,0x30,0x5b, 0x5,0x3d,0x79, 0xf,0x40,0x4e, 0xf,0x40,0x4f, 0x6,0x5b,0x2f, 0x4,0x42,0x47, 0x5,0x44,0x6a, 0x5,0x44,0x6b, 0xf,0x46,0x67, 0xf,0x4d,0x69, 0x4,0x4f,0x65, 0x7,0x2c,0x50, 0x7,0x2c,0x51, 0x7,0x37,0x23, 0x7,0x37,0x24, 0x5,0x5a,0x7e, 0x7,0x4d,0x43, 0x6,0x21,0x2a, 0x4,0x21,0x42, 0x6,0x22,0x4a, 0x6,0x26,0x30, 0x6,0x26,0x33, 0x5,0x23,0x4a, 0x6,0x26,0x31, 0x6,0x26,0x32, 0x4,0x28,0x4d, 0x6,0x2f,0x2f, 0x6,0x2f,0x31, 0x6,0x2f,0x2d, 0x6,0x2f,0x2e, 0x6,0x2f,0x30, 0x6,0x3d,0x54, 0x6,0x35,0x60, 0xf,0x2e,0x36, 0xf,0x2e,0x37, 0x6,0x35,0x24, 0x6,0x46,0x72, 0xf,0x39,0x52, 0x4,0x3c,0x3d, 0xf,0x46,0x68, 0x7,0x3f,0x22, 0x5,0x6d,0x32, 0x6,0x21,0x2b, 0xf,0x21,0x31, 0x5,0x22,0x37, 0x6,0x23,0x6e, 0x4,0x22,0x43, 0x6,0x23,0x6d, 0x6,0x26,0x34, 0x4,0x23,0x4a, 0x6,0x26,0x35, 0xf,0x23,0x3c, 0x6,0x29,0x73, 0x5,0x25,0x3e, 0x5,0x25,0x3f, 0x4,0x28,0x4f, 0x6,0x2f,0x34, 0x5,0x28,0x33, 0x6,0x2f,0x33, 0x5,0x28,0x32, 0x6,0x2f,0x32, 0x6,0x2f,0x37, 0x6,0x2f,0x35, 0xf,0x29,0x47, 0x5,0x2c,0x30, 0x6,0x35,0x62, 0x6,0x35,0x61, 0x5,0x2c,0x31, 0x6,0x3d,0x55, 0xf,0x33,0x3a, 0x4,0x36,0x4f, 0x6,0x50,0x75, 0x6,0x46,0x73, 0x6,0x35,0x63, 0x5,0x3d,0x7a, 0x4,0x42,0x48, 0x6,0x5b,0x31, 0x6,0x5b,0x30, 0x5,0x4c,0x2c, 0x5,0x4c,0x2d, 0x5,0x4c,0x2e, 0xf,0x4d,0x6a, 0x5,0x53,0x64, 0x7,0x37,0x25, 0xf,0x5e,0x37, 0x4,0x5f,0x4b, 0x7,0x3f,0x23, 0x7,0x4d,0x44, 0x7,0x60,0x69, 0x7,0x64,0x43, 0xf,0x21,0x32, 0x5,0x22,0x38, 0x6,0x23,0x6f, 0x5,0x23,0x4c, 0x6,0x26,0x37, 0xf,0x23,0x3d, 0xf,0x25,0x66, 0x6,0x2f,0x36, 0x5,0x28,0x34, 0x6,0x35,0x64, 0xf,0x46,0x69, 0x7,0x4d,0x45, 0x7,0x57,0x50, 0x6,0x21,0x5a, 0x5,0x21,0x5a, 0x5,0x21,0x5b, 0x6,0x22,0x4b, 0x6,0x23,0x70, 0x4,0x22,0x44, 0x4,0x22,0x45, 0x6,0x23,0x73, 0x6,0x23,0x72, 0x5,0x22,0x3a, 0x5,0x22,0x39, 0x6,0x23,0x74, 0x6,0x26,0x39, 0x5,0x23,0x4d, 0x6,0x26,0x3a, 0x6,0x23,0x75, 0x6,0x26,0x3b, 0xf,0x23,0x3e, 0x5,0x25,0x40, 0x6,0x29,0x74, 0x6,0x29,0x77, 0x6,0x29,0x78, 0x6,0x29,0x76, 0xf,0x25,0x67, 0xf,0x25,0x69, 0xf,0x25,0x6a, 0xf,0x25,0x6b, 0xf,0x25,0x68, 0x6,0x29,0x75, 0x6,0x35,0x65, 0x6,0x35,0x66, 0xf,0x2e,0x38, 0xf,0x2e,0x39, 0x4,0x30,0x63, 0x4,0x30,0x61, 0x4,0x30,0x62, 0xf,0x33,0x3b, 0xf,0x39,0x53, 0xf,0x39,0x54, 0x6,0x50,0x78, 0x6,0x50,0x77, 0x6,0x50,0x79, 0x6,0x50,0x7b, 0xf,0x40,0x50, 0xf,0x46,0x6a, 0xf,0x46,0x6b, 0x5,0x4c,0x2f, 0xf,0x4d,0x6b, 0xf,0x4d,0x6c, 0x7,0x21,0x40, 0x7,0x37,0x26, 0xf,0x5e,0x38, 0x7,0x46,0x30, 0x7,0x52,0x78, 0x7,0x60,0x6a, 0x7,0x62,0x2e, 0x6,0x22,0x4c, 0x6,0x23,0x77, 0x6,0x23,0x76, 0x6,0x23,0x78, 0x4,0x23,0x4c, 0x5,0x23,0x4f, 0x5,0x23,0x4e, 0x6,0x26,0x3c, 0x4,0x25,0x55, 0x4,0x25,0x54, 0x6,0x29,0x7c, 0x6,0x29,0x7b, 0x6,0x29,0x7d, 0x6,0x29,0x7a, 0x6,0x29,0x7e, 0x6,0x29,0x79, 0xf,0x25,0x6c, 0x6,0x2a,0x22, 0x4,0x28,0x52, 0x4,0x28,0x51, 0x5,0x28,0x37, 0xf,0x29,0x48, 0xf,0x29,0x49, 0xf,0x29,0x4a, 0xf,0x29,0x4b, 0x6,0x2f,0x39, 0x6,0x35,0x68, 0x4,0x2b,0x79, 0x5,0x2c,0x32, 0x6,0x35,0x67, 0x6,0x35,0x6a, 0x6,0x3c,0x7a, 0x6,0x35,0x69, 0x6,0x3d,0x57, 0x6,0x3d,0x56, 0x6,0x35,0x6b, 0x6,0x3d,0x58, 0x6,0x46,0x75, 0x6,0x46,0x76, 0x6,0x46,0x77, 0x5,0x37,0x3f, 0x6,0x50,0x7c, 0x5,0x44,0x6d, 0x6,0x5b,0x32, 0x7,0x21,0x41, 0xf,0x53,0x58, 0x7,0x63,0x4b, 0x5,0x21,0x3e, 0x4,0x21,0x43, 0xf,0x21,0x34, 0x6,0x21,0x5b, 0x4,0x22,0x46, 0x6,0x2a,0x24, 0x6,0x23,0x7a, 0x6,0x23,0x79, 0x4,0x23,0x4e, 0x6,0x2f,0x3b, 0x5,0x28,0x38, 0x6,0x2f,0x3a, 0x4,0x28,0x53, 0x6,0x35,0x6c, 0x6,0x2f,0x3c, 0x6,0x46,0x78, 0x5,0x2c,0x33, 0x5,0x3d,0x7b, 0x6,0x50,0x7d, 0x5,0x44,0x6e, 0x7,0x3f,0x24, 0x5,0x21,0x3f, 0x5,0x21,0x5c, 0x6,0x23,0x7b, 0x6,0x22,0x4f, 0x6,0x22,0x4d, 0x6,0x22,0x50, 0x5,0x21,0x5d, 0x4,0x22,0x47, 0x5,0x22,0x3b, 0x6,0x23,0x7c, 0x6,0x23,0x7d, 0x5,0x22,0x3f, 0x5,0x22,0x40, 0x5,0x22,0x3d, 0x5,0x22,0x3e, 0xf,0x22,0x2d, 0x6,0x26,0x3e, 0x5,0x23,0x50, 0x6,0x26,0x3d, 0x5,0x23,0x51, 0x6,0x25,0x5e, 0xf,0x23,0x3f, 0x6,0x2a,0x27, 0x6,0x2a,0x26, 0x6,0x2a,0x29, 0x6,0x2a,0x28, 0x5,0x25,0x41, 0x4,0x25,0x58, 0xf,0x25,0x6d, 0xf,0x25,0x6e, 0x6,0x2a,0x25, 0x5,0x28,0x39, 0x4,0x28,0x54, 0x6,0x2f,0x46, 0x6,0x2f,0x41, 0x6,0x2f,0x44, 0x6,0x2f,0x45, 0x6,0x2f,0x40, 0x6,0x2f,0x3e, 0x6,0x2f,0x42, 0x6,0x2f,0x43, 0xf,0x29,0x4d, 0xf,0x29,0x4e, 0x4,0x28,0x55, 0x6,0x2f,0x3f, 0x6,0x35,0x73, 0x6,0x35,0x74, 0x4,0x2b,0x7b, 0x5,0x2c,0x34, 0x4,0x2b,0x7c, 0x6,0x35,0x6f, 0x6,0x35,0x6d, 0x6,0x35,0x70, 0x6,0x35,0x72, 0x6,0x35,0x71, 0x6,0x35,0x6e, 0x5,0x2c,0x35, 0xf,0x2e,0x3a, 0xf,0x2e,0x3b, 0x6,0x3d,0x60, 0x6,0x3d,0x5b, 0x4,0x30,0x67, 0x6,0x3d,0x5f, 0x6,0x3d,0x5c, 0x6,0x3d,0x5d, 0xf,0x33,0x3d, 0x5,0x31,0x30, 0x6,0x3d,0x5e, 0x4,0x30,0x66, 0x4,0x36,0x52, 0x6,0x46,0x7c, 0x6,0x46,0x7a, 0x4,0x36,0x53, 0x6,0x46,0x7b, 0x6,0x46,0x79, 0x6,0x46,0x7d, 0xf,0x39,0x55, 0x6,0x46,0x7e, 0x5,0x3d,0x7c, 0x5,0x3d,0x7d, 0x6,0x51,0x24, 0x6,0x51,0x23, 0x6,0x50,0x7e, 0xf,0x40,0x51, 0x6,0x51,0x21, 0x4,0x3c,0x3f, 0x4,0x42,0x49, 0x6,0x5b,0x34, 0x6,0x5b,0x37, 0x6,0x5b,0x33, 0x6,0x5b,0x38, 0x5,0x44,0x6f, 0xf,0x46,0x6d, 0xf,0x46,0x6e, 0x6,0x5b,0x36, 0x6,0x5b,0x39, 0x6,0x5b,0x3b, 0x6,0x5b,0x3a, 0x6,0x5b,0x35, 0x7,0x21,0x43, 0x4,0x49,0x28, 0x5,0x4c,0x30, 0x7,0x21,0x44, 0x7,0x21,0x42, 0xf,0x4d,0x6d, 0x7,0x25,0x48, 0x5,0x53,0x65, 0x7,0x2c,0x53, 0x7,0x2c,0x52, 0xf,0x53,0x59, 0xf,0x53,0x5a, 0x7,0x3b,0x4d, 0xf,0x5e,0x39, 0xf,0x5e,0x3a, 0xf,0x5e,0x3b, 0xf,0x64,0x7c, 0x7,0x4e,0x27, 0x7,0x52,0x79, 0x5,0x77,0x54, 0x7,0x5e,0x50, 0x7,0x65,0x33, 0x7,0x66,0x33, 0x5,0x21,0x2e, 0x6,0x21,0x3c, 0x6,0x21,0x3d, 0x6,0x21,0x5d, 0x6,0x22,0x52, 0x6,0x22,0x51, 0x4,0x22,0x4a, 0x6,0x24,0x23, 0x6,0x24,0x21, 0xf,0x22,0x2e, 0x4,0x22,0x49, 0x6,0x24,0x22, 0x6,0x26,0x40, 0xf,0x23,0x40, 0x5,0x23,0x3c, 0x6,0x2a,0x2c, 0x6,0x2a,0x2b, 0x6,0x2a,0x2d, 0x6,0x2a,0x2e, 0x6,0x2f,0x47, 0x6,0x2f,0x48, 0x4,0x28,0x56, 0xf,0x29,0x4f, 0x6,0x35,0x76, 0x6,0x35,0x75, 0x6,0x36,0x49, 0x6,0x35,0x2e, 0x5,0x36,0x6c, 0x6,0x47,0x22, 0x6,0x47,0x24, 0x6,0x4d,0x62, 0xf,0x39,0x56, 0x6,0x47,0x23, 0x5,0x3e,0x21, 0x6,0x51,0x25, 0x5,0x3d,0x7e, 0xf,0x40,0x52, 0x6,0x5b,0x3c, 0xf,0x46,0x6f, 0x6,0x60,0x72, 0x7,0x21,0x45, 0x5,0x53,0x66, 0xf,0x59,0x57, 0x7,0x4b,0x6a, 0x6,0x21,0x60, 0x5,0x21,0x40, 0x6,0x21,0x5e, 0x5,0x21,0x42, 0x6,0x21,0x62, 0x6,0x21,0x5f, 0x6,0x22,0x55, 0x4,0x21,0x68, 0x5,0x21,0x5e, 0x6,0x22,0x56, 0x5,0x21,0x5f, 0x6,0x22,0x53, 0x6,0x22,0x54, 0x6,0x24,0x25, 0x4,0x22,0x4b, 0x6,0x24,0x24, 0x5,0x22,0x42, 0x6,0x24,0x26, 0x5,0x22,0x41, 0x6,0x24,0x27, 0x6,0x26,0x44, 0x6,0x26,0x42, 0x5,0x23,0x52, 0xf,0x23,0x41, 0xf,0x23,0x42, 0xf,0x23,0x43, 0xf,0x23,0x44, 0x4,0x23,0x50, 0x6,0x2a,0x31, 0x6,0x2a,0x2f, 0x6,0x2a,0x32, 0x6,0x2a,0x30, 0xf,0x25,0x6f, 0x6,0x2f,0x4d, 0x6,0x2f,0x4a, 0x6,0x2f,0x4c, 0x6,0x2f,0x4b, 0x6,0x2f,0x49, 0xf,0x29,0x51, 0xf,0x29,0x52, 0x6,0x32,0x72, 0x5,0x28,0x36, 0x6,0x35,0x7b, 0x5,0x2c,0x36, 0x6,0x35,0x7c, 0x6,0x35,0x79, 0x6,0x35,0x77, 0x6,0x35,0x7a, 0xf,0x2e,0x3c, 0xf,0x2e,0x3d, 0xf,0x2e,0x3e, 0xf,0x2e,0x3f, 0x6,0x3c,0x67, 0x6,0x3d,0x66, 0x6,0x3d,0x68, 0x5,0x31,0x32, 0x5,0x31,0x33, 0x6,0x3d,0x65, 0x6,0x3d,0x63, 0x6,0x3d,0x6b, 0x6,0x3d,0x64, 0x5,0x2c,0x37, 0x6,0x3d,0x62, 0x6,0x3d,0x69, 0x6,0x3d,0x6a, 0x6,0x3c,0x7c, 0x6,0x3d,0x67, 0x4,0x36,0x54, 0x5,0x36,0x6d, 0x6,0x47,0x27, 0x6,0x47,0x25, 0xf,0x33,0x3e, 0xf,0x39,0x57, 0xf,0x39,0x58, 0xf,0x39,0x59, 0xf,0x39,0x5a, 0x6,0x47,0x26, 0x4,0x3c,0x43, 0x4,0x3c,0x42, 0x6,0x51,0x27, 0x6,0x51,0x28, 0x6,0x51,0x26, 0x4,0x3c,0x41, 0x6,0x47,0x28, 0x6,0x51,0x5b, 0x6,0x51,0x29, 0x6,0x5f,0x21, 0x6,0x5b,0x3e, 0x6,0x5b,0x3d, 0x5,0x44,0x70, 0x6,0x53,0x7b, 0xf,0x4d,0x55, 0x5,0x4c,0x33, 0x5,0x4c,0x34, 0xf,0x46,0x70, 0x5,0x4c,0x32, 0x7,0x2c,0x55, 0xf,0x53,0x5b, 0x3,0x50,0x39, 0x5,0x54,0x2e, 0x7,0x2c,0x54, 0x7,0x37,0x29, 0x7,0x37,0x28, 0xf,0x59,0x58, 0x4,0x5a,0x6f, 0x7,0x46,0x32, 0x7,0x46,0x31, 0x4,0x66,0x31, 0xf,0x67,0x45, 0x7,0x57,0x51, 0x5,0x75,0x66, 0x7,0x5e,0x51, 0x7,0x5e,0x52, 0x5,0x21,0x43, 0x6,0x21,0x64, 0x4,0x21,0x47, 0x4,0x21,0x46, 0xf,0x21,0x36, 0x6,0x21,0x63, 0x5,0x21,0x61, 0x6,0x22,0x59, 0x6,0x22,0x58, 0x6,0x22,0x5e, 0x6,0x22,0x5a, 0x6,0x22,0x5d, 0x6,0x22,0x57, 0x6,0x22,0x42, 0xf,0x21,0x4e, 0x6,0x22,0x5c, 0x5,0x22,0x47, 0x6,0x24,0x2d, 0x5,0x22,0x45, 0x6,0x24,0x2e, 0x4,0x22,0x4d, 0x5,0x22,0x46, 0x4,0x22,0x50, 0x6,0x24,0x2c, 0x4,0x22,0x4f, 0x4,0x22,0x4e, 0x5,0x22,0x44, 0x6,0x24,0x28, 0xf,0x22,0x2f, 0xf,0x22,0x30, 0xf,0x22,0x32, 0xf,0x22,0x34, 0x6,0x24,0x2a, 0xf,0x22,0x31, 0xf,0x22,0x33, 0x5,0x22,0x43, 0x6,0x24,0x29, 0x6,0x24,0x2b, 0x4,0x23,0x56, 0x6,0x26,0x4f, 0x6,0x26,0x46, 0x6,0x26,0x4d, 0x6,0x26,0x4c, 0x5,0x23,0x56, 0x4,0x23,0x5a, 0x4,0x23,0x5d, 0x5,0x23,0x5b, 0x5,0x23,0x54, 0x6,0x26,0x48, 0x4,0x23,0x57, 0x4,0x23,0x52, 0x4,0x23,0x58, 0x5,0x23,0x58, 0x6,0x26,0x49, 0x5,0x23,0x59, 0x4,0x23,0x55, 0x5,0x23,0x55, 0x6,0x26,0x47, 0x5,0x23,0x5c, 0xf,0x23,0x45, 0xf,0x23,0x46, 0xf,0x23,0x47, 0xf,0x23,0x4a, 0xf,0x23,0x4b, 0xf,0x23,0x4c, 0xf,0x23,0x48, 0x6,0x26,0x4b, 0x6,0x26,0x4a, 0x6,0x26,0x50, 0x6,0x26,0x45, 0x5,0x23,0x53, 0x5,0x23,0x57, 0x5,0x23,0x5a, 0x4,0x25,0x5c, 0x4,0x25,0x5e, 0x6,0x2a,0x36, 0x5,0x25,0x4c, 0x5,0x25,0x44, 0x4,0x25,0x5b, 0x6,0x2a,0x34, 0x5,0x25,0x4d, 0x5,0x25,0x45, 0x5,0x25,0x47, 0x4,0x25,0x61, 0x5,0x25,0x50, 0x6,0x2a,0x33, 0x5,0x25,0x52, 0x5,0x28,0x47, 0x6,0x2a,0x3b, 0x5,0x25,0x48, 0x5,0x25,0x4b, 0x5,0x25,0x4a, 0x5,0x25,0x51, 0x5,0x25,0x49, 0x5,0x25,0x4e, 0x6,0x2a,0x3d, 0x5,0x25,0x4f, 0xf,0x25,0x70, 0xf,0x25,0x72, 0xf,0x25,0x73, 0xf,0x25,0x74, 0xf,0x25,0x75, 0xf,0x25,0x76, 0xf,0x25,0x77, 0xf,0x25,0x78, 0xf,0x25,0x79, 0xf,0x25,0x7a, 0xf,0x25,0x7d, 0xf,0x25,0x7e, 0xf,0x26,0x21, 0xf,0x26,0x22, 0xf,0x26,0x23, 0x5,0x25,0x46, 0x6,0x2a,0x35, 0x5,0x25,0x43, 0x6,0x2a,0x38, 0x6,0x2a,0x37, 0xf,0x25,0x7c, 0x6,0x2a,0x3a, 0x5,0x2c,0x38, 0x5,0x28,0x46, 0x5,0x28,0x52, 0x5,0x28,0x4d, 0x5,0x28,0x3c, 0x5,0x28,0x51, 0x6,0x2f,0x54, 0x6,0x2f,0x4e, 0x5,0x28,0x3f, 0x4,0x28,0x5b, 0x4,0x28,0x5a, 0x5,0x28,0x4f, 0x5,0x28,0x45, 0x5,0x28,0x4b, 0x5,0x28,0x4a, 0x5,0x28,0x4e, 0x5,0x28,0x48, 0x5,0x28,0x49, 0x5,0x28,0x3d, 0x5,0x28,0x41, 0x5,0x28,0x4c, 0x4,0x25,0x62, 0x6,0x2f,0x59, 0x6,0x2f,0x5a, 0x5,0x28,0x53, 0x6,0x2f,0x4f, 0x5,0x28,0x3a, 0x6,0x2f,0x57, 0x6,0x2f,0x56, 0x5,0x28,0x50, 0x6,0x2f,0x50, 0x6,0x2f,0x58, 0x6,0x2f,0x52, 0x5,0x28,0x40, 0x5,0x28,0x42, 0xf,0x2b,0x33, 0xf,0x29,0x53, 0xf,0x29,0x55, 0xf,0x29,0x56, 0xf,0x29,0x57, 0xf,0x29,0x58, 0xf,0x29,0x59, 0xf,0x29,0x5a, 0xf,0x29,0x5b, 0xf,0x29,0x5e, 0xf,0x29,0x5f, 0xf,0x29,0x60, 0xf,0x29,0x61, 0xf,0x29,0x62, 0xf,0x29,0x63, 0xf,0x29,0x64, 0xf,0x29,0x66, 0xf,0x29,0x67, 0x5,0x28,0x43, 0x5,0x28,0x44, 0x4,0x28,0x5d, 0xf,0x29,0x65, 0x6,0x2f,0x55, 0x6,0x2f,0x53, 0x4,0x28,0x58, 0x5,0x28,0x3b, 0x5,0x28,0x3e, 0x6,0x2f,0x51, 0x6,0x36,0x29, 0x4,0x2c,0x24, 0x4,0x2c,0x2b, 0x4,0x2c,0x2c, 0x4,0x2c,0x27, 0x6,0x36,0x22, 0x5,0x2c,0x4e, 0x5,0x2c,0x41, 0x5,0x2c,0x3f, 0x5,0x2c,0x4c, 0x5,0x2c,0x3d, 0x5,0x2c,0x46, 0x5,0x2c,0x56, 0x5,0x2c,0x49, 0x4,0x2c,0x2a, 0x5,0x2c,0x4d, 0x5,0x2c,0x54, 0x5,0x2c,0x52, 0x4,0x2c,0x22, 0x6,0x36,0x23, 0x6,0x36,0x24, 0x5,0x2c,0x51, 0x4,0x2c,0x23, 0x5,0x2c,0x40, 0x6,0x36,0x27, 0x6,0x36,0x28, 0x5,0x2c,0x57, 0x6,0x36,0x26, 0x5,0x2c,0x53, 0x5,0x2c,0x58, 0x5,0x2c,0x47, 0x5,0x2c,0x59, 0x5,0x2c,0x44, 0x5,0x2c,0x55, 0xf,0x2e,0x40, 0xf,0x2e,0x41, 0xf,0x2e,0x43, 0xf,0x2e,0x44, 0xf,0x2e,0x48, 0xf,0x2e,0x49, 0xf,0x2e,0x4b, 0xf,0x2e,0x4c, 0xf,0x2e,0x4d, 0xf,0x2e,0x4e, 0xf,0x2e,0x4f, 0xf,0x2e,0x50, 0xf,0x2e,0x51, 0xf,0x2e,0x52, 0xf,0x2e,0x53, 0xf,0x2e,0x54, 0x6,0x39,0x5e, 0x6,0x36,0x21, 0x5,0x2c,0x42, 0x5,0x2c,0x45, 0x5,0x2c,0x48, 0x6,0x36,0x25, 0x5,0x2c,0x50, 0x5,0x2c,0x4b, 0x5,0x2c,0x39, 0x5,0x2c,0x3a, 0x5,0x2c,0x3b, 0xf,0x2e,0x45, 0x5,0x2c,0x4a, 0x5,0x2c,0x4f, 0x5,0x2c,0x3e, 0x5,0x2c,0x3c, 0x5,0x2c,0x5a, 0x5,0x31,0x46, 0x4,0x30,0x69, 0x6,0x3d,0x77, 0x6,0x3d,0x74, 0x4,0x30,0x78, 0x6,0x3d,0x6f, 0x4,0x30,0x75, 0x5,0x31,0x51, 0x5,0x31,0x49, 0x5,0x31,0x4c, 0x4,0x30,0x6e, 0x4,0x30,0x79, 0x5,0x31,0x44, 0x6,0x3d,0x76, 0x5,0x31,0x36, 0x5,0x31,0x4a, 0x5,0x31,0x45, 0x5,0x31,0x4e, 0x5,0x31,0x34, 0x5,0x31,0x4d, 0x5,0x31,0x42, 0x5,0x31,0x3b, 0x6,0x3d,0x71, 0x6,0x3d,0x75, 0x6,0x3d,0x7d, 0x6,0x3d,0x7a, 0x6,0x3d,0x7e, 0x5,0x31,0x3a, 0x5,0x31,0x3c, 0x6,0x3d,0x6c, 0x5,0x31,0x38, 0x6,0x3d,0x72, 0x6,0x3d,0x7b, 0xf,0x33,0x3f, 0xf,0x33,0x40, 0xf,0x33,0x41, 0xf,0x33,0x42, 0xf,0x33,0x44, 0xf,0x33,0x45, 0xf,0x33,0x46, 0xf,0x33,0x47, 0xf,0x33,0x48, 0xf,0x33,0x49, 0xf,0x33,0x4c, 0xf,0x33,0x4d, 0x5,0x31,0x37, 0x6,0x3d,0x73, 0x5,0x31,0x39, 0x6,0x3d,0x6d, 0x5,0x31,0x41, 0x5,0x31,0x48, 0x6,0x3e,0x21, 0x5,0x31,0x52, 0x6,0x3d,0x70, 0x5,0x31,0x40, 0x5,0x31,0x35, 0x5,0x31,0x47, 0x5,0x31,0x3e, 0x5,0x31,0x43, 0x5,0x31,0x3d, 0x5,0x31,0x50, 0x6,0x3d,0x79, 0x3,0x34,0x60, 0x5,0x31,0x53, 0x5,0x31,0x4f, 0x6,0x3d,0x78, 0x6,0x3d,0x6e, 0x5,0x31,0x3f, 0x5,0x31,0x4b, 0x4,0x36,0x55, 0x4,0x36,0x61, 0x6,0x47,0x32, 0x5,0x37,0x24, 0x6,0x47,0x37, 0x6,0x47,0x3e, 0x5,0x36,0x77, 0x6,0x47,0x35, 0x5,0x36,0x7c, 0x4,0x36,0x56, 0x5,0x37,0x28, 0x5,0x36,0x6f, 0x5,0x36,0x71, 0x4,0x36,0x5a, 0x5,0x36,0x78, 0x4,0x36,0x57, 0x5,0x37,0x29, 0x5,0x36,0x7e, 0x4,0x36,0x62, 0x4,0x36,0x5b, 0x5,0x37,0x23, 0x5,0x37,0x27, 0x4,0x36,0x66, 0x5,0x37,0x30, 0x4,0x36,0x5d, 0x5,0x37,0x2c, 0x5,0x37,0x2e, 0x6,0x47,0x2e, 0x6,0x47,0x3c, 0x5,0x3e,0x22, 0x6,0x47,0x2b, 0x6,0x47,0x2f, 0x6,0x47,0x38, 0x5,0x37,0x22, 0x6,0x47,0x34, 0x6,0x47,0x3f, 0x6,0x47,0x3a, 0x4,0x36,0x64, 0x5,0x37,0x26, 0x5,0x36,0x73, 0xf,0x39,0x5b, 0xf,0x39,0x5d, 0xf,0x39,0x5e, 0xf,0x39,0x61, 0xf,0x39,0x62, 0xf,0x39,0x63, 0xf,0x39,0x64, 0xf,0x39,0x65, 0xf,0x39,0x66, 0xf,0x39,0x67, 0xf,0x39,0x68, 0xf,0x39,0x6a, 0xf,0x39,0x6d, 0xf,0x39,0x6e, 0xf,0x39,0x6f, 0xf,0x39,0x70, 0x5,0x36,0x74, 0x5,0x36,0x75, 0x5,0x36,0x7b, 0x5,0x37,0x25, 0x5,0x37,0x21, 0x6,0x47,0x3b, 0xf,0x39,0x6b, 0xf,0x39,0x5c, 0xf,0x39,0x5f, 0xf,0x39,0x69, 0xf,0x39,0x6c, 0x5,0x37,0x2b, 0x5,0x37,0x2f, 0x6,0x47,0x3d, 0x5,0x37,0x2d, 0x5,0x37,0x2a, 0x5,0x36,0x7d, 0x6,0x47,0x36, 0x6,0x51,0x39, 0x5,0x3e,0x23, 0x4,0x3c,0x49, 0x5,0x3e,0x27, 0x4,0x3c,0x4e, 0x5,0x36,0x72, 0x6,0x51,0x41, 0x4,0x3c,0x48, 0x4,0x3c,0x44, 0x6,0x5b,0x42, 0x5,0x3e,0x2d, 0x6,0x51,0x33, 0x6,0x51,0x35, 0x5,0x3e,0x2a, 0x5,0x3e,0x38, 0x6,0x51,0x3a, 0x6,0x51,0x30, 0x5,0x3e,0x2e, 0x5,0x3e,0x24, 0x5,0x3e,0x35, 0x5,0x3e,0x3f, 0x6,0x51,0x3f, 0x6,0x51,0x37, 0x5,0x3e,0x34, 0x5,0x3e,0x37, 0x4,0x3c,0x4d, 0x5,0x3e,0x3a, 0x4,0x3c,0x45, 0x5,0x3e,0x33, 0x5,0x3e,0x2c, 0x4,0x3c,0x4f, 0x5,0x3e,0x2f, 0x4,0x3c,0x51, 0x5,0x3e,0x31, 0x5,0x3e,0x32, 0x6,0x51,0x3b, 0x6,0x51,0x40, 0x6,0x51,0x2a, 0x6,0x51,0x3e, 0x6,0x51,0x3d, 0x5,0x3e,0x3b, 0x6,0x51,0x38, 0x5,0x3e,0x28, 0x5,0x3e,0x30, 0x5,0x3e,0x2b, 0x6,0x51,0x2c, 0x6,0x51,0x44, 0x6,0x51,0x2e, 0x6,0x51,0x2b, 0x6,0x51,0x2d, 0xf,0x47,0x26, 0x5,0x3e,0x3e, 0x6,0x51,0x31, 0xf,0x40,0x56, 0xf,0x40,0x57, 0xf,0x40,0x58, 0xf,0x40,0x59, 0xf,0x40,0x5a, 0xf,0x40,0x5b, 0xf,0x40,0x5c, 0xf,0x40,0x5d, 0xf,0x40,0x5e, 0xf,0x40,0x5f, 0xf,0x40,0x60, 0xf,0x40,0x61, 0xf,0x40,0x63, 0x6,0x51,0x2f, 0x6,0x51,0x34, 0x6,0x51,0x3c, 0xf,0x40,0x54, 0x6,0x51,0x42, 0x5,0x3e,0x3c, 0x5,0x3e,0x36, 0x5,0x3e,0x25, 0x5,0x3e,0x29, 0x5,0x3e,0x26, 0xf,0x40,0x64, 0x6,0x5b,0x46, 0x6,0x5b,0x40, 0x6,0x5b,0x4b, 0x4,0x42,0x4d, 0x6,0x5b,0x4f, 0x6,0x5b,0x45, 0x6,0x5b,0x51, 0x6,0x5b,0x50, 0x4,0x42,0x4e, 0x6,0x5b,0x4c, 0x5,0x44,0x73, 0x5,0x44,0x77, 0x5,0x44,0x75, 0x5,0x44,0x7c, 0x6,0x5b,0x43, 0x6,0x5b,0x47, 0x4,0x42,0x4c, 0x4,0x42,0x54, 0x5,0x44,0x7b, 0x4,0x42,0x50, 0x5,0x44,0x76, 0x6,0x5b,0x41, 0x5,0x44,0x71, 0x5,0x44,0x72, 0x5,0x44,0x79, 0x6,0x5b,0x52, 0x6,0x5b,0x3f, 0x6,0x5b,0x49, 0x6,0x5b,0x4a, 0x5,0x44,0x78, 0x6,0x5b,0x4d, 0xf,0x46,0x71, 0xf,0x46,0x72, 0xf,0x46,0x73, 0xf,0x46,0x74, 0xf,0x46,0x76, 0xf,0x46,0x77, 0xf,0x46,0x78, 0xf,0x46,0x79, 0xf,0x46,0x7a, 0xf,0x46,0x7b, 0xf,0x46,0x7c, 0xf,0x46,0x7e, 0xf,0x47,0x21, 0xf,0x47,0x22, 0xf,0x47,0x23, 0xf,0x47,0x27, 0xf,0x47,0x28, 0xf,0x47,0x29, 0xf,0x47,0x2a, 0xf,0x47,0x2b, 0xf,0x47,0x2c, 0xf,0x47,0x2d, 0xf,0x47,0x24, 0x6,0x5b,0x48, 0xf,0x46,0x75, 0x5,0x44,0x74, 0x5,0x44,0x7a, 0x6,0x5b,0x4e, 0x5,0x45,0x21, 0xf,0x46,0x7d, 0x6,0x5b,0x44, 0xf,0x47,0x25, 0x5,0x4c,0x35, 0x5,0x44,0x7d, 0xf,0x46,0x6c, 0x7,0x21,0x51, 0x5,0x4c,0x3b, 0x7,0x21,0x55, 0x7,0x21,0x52, 0x5,0x4c,0x39, 0x7,0x21,0x58, 0x7,0x21,0x4a, 0x5,0x4c,0x40, 0x5,0x4c,0x46, 0x5,0x4c,0x3d, 0x7,0x21,0x4f, 0x5,0x4c,0x3e, 0x7,0x21,0x57, 0x7,0x21,0x50, 0x5,0x4c,0x36, 0x7,0x21,0x4b, 0x5,0x4c,0x3f, 0x7,0x21,0x56, 0x7,0x21,0x59, 0x5,0x4c,0x41, 0x4,0x49,0x2f, 0x7,0x21,0x5b, 0x5,0x4c,0x3a, 0x7,0x21,0x48, 0x5,0x4c,0x38, 0x5,0x5b,0x27, 0x7,0x21,0x5a, 0x4,0x49,0x2b, 0x7,0x21,0x54, 0x5,0x45,0x23, 0x7,0x21,0x53, 0x7,0x21,0x49, 0x7,0x21,0x47, 0x7,0x21,0x62, 0x7,0x21,0x5c, 0xf,0x4d,0x7a, 0x7,0x21,0x5e, 0x5,0x4c,0x42, 0x7,0x21,0x61, 0x7,0x2c,0x61, 0x5,0x4c,0x37, 0x4,0x49,0x32, 0x5,0x4c,0x47, 0xf,0x4d,0x6f, 0xf,0x4d,0x70, 0xf,0x4d,0x71, 0xf,0x4d,0x72, 0xf,0x4d,0x73, 0xf,0x4d,0x74, 0xf,0x4d,0x75, 0xf,0x4d,0x76, 0xf,0x4d,0x78, 0xf,0x4d,0x79, 0x5,0x4c,0x44, 0x7,0x21,0x5f, 0x7,0x26,0x2b, 0x7,0x21,0x5d, 0x7,0x21,0x4d, 0x7,0x21,0x4c, 0x5,0x4c,0x3c, 0x5,0x4c,0x43, 0x7,0x2c,0x6a, 0x4,0x4f,0x6e, 0x5,0x53,0x74, 0x7,0x2c,0x5c, 0x5,0x53,0x72, 0x7,0x2c,0x68, 0x4,0x4f,0x72, 0x5,0x53,0x6a, 0x5,0x53,0x78, 0x7,0x2c,0x60, 0x4,0x4f,0x68, 0x4,0x4f,0x73, 0x4,0x4f,0x66, 0x5,0x53,0x71, 0x4,0x4f,0x70, 0x5,0x53,0x6f, 0x5,0x53,0x68, 0x7,0x2c,0x6b, 0x7,0x2c,0x5b, 0x7,0x2c,0x64, 0x5,0x53,0x6e, 0x7,0x2c,0x5f, 0x5,0x53,0x6c, 0x5,0x53,0x67, 0x5,0x53,0x75, 0x5,0x53,0x70, 0x5,0x53,0x73, 0x7,0x2c,0x59, 0x5,0x53,0x6b, 0x5,0x53,0x69, 0x7,0x2c,0x67, 0x7,0x2c,0x58, 0x7,0x2c,0x57, 0xf,0x4d,0x77, 0x4,0x4f,0x69, 0x4,0x4f,0x74, 0x5,0x53,0x77, 0x7,0x2c,0x66, 0xf,0x53,0x5c, 0xf,0x53,0x5e, 0xf,0x53,0x5f, 0xf,0x53,0x60, 0xf,0x53,0x61, 0xf,0x53,0x62, 0xf,0x53,0x63, 0xf,0x53,0x64, 0xf,0x53,0x65, 0xf,0x53,0x67, 0xf,0x53,0x68, 0xf,0x53,0x69, 0xf,0x53,0x6a, 0xf,0x53,0x6b, 0xf,0x53,0x6c, 0xf,0x53,0x6d, 0xf,0x53,0x6e, 0xf,0x53,0x6f, 0x7,0x2c,0x5e, 0x7,0x2c,0x5d, 0x7,0x2c,0x62, 0x7,0x2c,0x69, 0x5,0x53,0x6d, 0xf,0x55,0x74, 0x5,0x53,0x76, 0x4,0x55,0x7a, 0x5,0x5b,0x26, 0x5,0x5b,0x21, 0x7,0x37,0x2d, 0x7,0x37,0x2a, 0x7,0x37,0x34, 0x7,0x37,0x35, 0x5,0x5b,0x23, 0x5,0x5b,0x2b, 0x4,0x55,0x71, 0x4,0x55,0x76, 0x5,0x5b,0x28, 0x4,0x55,0x77, 0x7,0x37,0x2b, 0x5,0x5b,0x29, 0x4,0x55,0x79, 0x7,0x37,0x31, 0x7,0x37,0x2f, 0x7,0x37,0x2e, 0x5,0x5b,0x24, 0x4,0x55,0x75, 0x7,0x37,0x32, 0x7,0x37,0x39, 0xf,0x59,0x59, 0xf,0x59,0x5a, 0xf,0x59,0x5e, 0xf,0x59,0x5f, 0xf,0x59,0x60, 0xf,0x59,0x61, 0xf,0x59,0x62, 0x7,0x37,0x38, 0x7,0x37,0x30, 0x7,0x37,0x36, 0x7,0x37,0x33, 0x7,0x37,0x2c, 0x5,0x5b,0x2a, 0x5,0x5b,0x22, 0x4,0x5a,0x74, 0x7,0x3f,0x29, 0x7,0x3f,0x2f, 0x4,0x5a,0x73, 0x5,0x61,0x3e, 0x7,0x3f,0x2b, 0x4,0x5a,0x71, 0x4,0x5a,0x76, 0x5,0x61,0x46, 0x4,0x5a,0x77, 0x5,0x67,0x58, 0x5,0x61,0x3d, 0x5,0x61,0x44, 0x5,0x61,0x43, 0x4,0x5a,0x78, 0x7,0x3f,0x2a, 0x4,0x5a,0x75, 0x4,0x5a,0x79, 0x4,0x5a,0x72, 0x7,0x3f,0x2e, 0x5,0x61,0x41, 0x7,0x3f,0x27, 0x7,0x3f,0x2d, 0x7,0x3f,0x28, 0x7,0x3f,0x26, 0x7,0x3f,0x2c, 0x5,0x61,0x42, 0xf,0x59,0x5b, 0x7,0x3f,0x25, 0xf,0x5e,0x3c, 0xf,0x5e,0x3d, 0xf,0x5e,0x3e, 0xf,0x5e,0x3f, 0xf,0x5e,0x40, 0xf,0x5e,0x43, 0xf,0x5e,0x44, 0xf,0x5e,0x45, 0x5,0x61,0x3f, 0xf,0x5e,0x4a, 0x7,0x46,0x34, 0x4,0x5f,0x4e, 0x5,0x5b,0x25, 0x7,0x46,0x3b, 0x7,0x46,0x39, 0x7,0x46,0x37, 0x5,0x67,0x5a, 0x5,0x67,0x5b, 0x4,0x5f,0x50, 0x5,0x67,0x57, 0x7,0x46,0x3c, 0x7,0x46,0x3a, 0x7,0x46,0x33, 0x7,0x46,0x35, 0x7,0x46,0x38, 0x4,0x5f,0x4f, 0xf,0x5e,0x46, 0x5,0x67,0x5c, 0xf,0x62,0x22, 0xf,0x62,0x23, 0xf,0x62,0x24, 0xf,0x62,0x25, 0xf,0x62,0x26, 0x7,0x46,0x36, 0x7,0x47,0x6e, 0x7,0x46,0x3d, 0x5,0x6b,0x74, 0x5,0x6b,0x75, 0x5,0x6b,0x6f, 0x5,0x6b,0x71, 0x5,0x6b,0x70, 0x7,0x4d,0x47, 0x7,0x4d,0x49, 0x7,0x4d,0x4b, 0x7,0x4d,0x48, 0x7,0x4d,0x46, 0x7,0x4d,0x4a, 0xf,0x64,0x7d, 0xf,0x64,0x7e, 0xf,0x65,0x21, 0x7,0x4d,0x4c, 0x5,0x6b,0x72, 0x7,0x52,0x7b, 0x5,0x6f,0x71, 0x5,0x6f,0x6f, 0x4,0x66,0x35, 0x5,0x6f,0x6e, 0x7,0x52,0x7a, 0x5,0x6f,0x6d, 0x7,0x52,0x7e, 0x5,0x6f,0x70, 0x7,0x52,0x7d, 0x4,0x66,0x33, 0xf,0x67,0x47, 0xf,0x67,0x48, 0x5,0x6f,0x6c, 0x7,0x52,0x7c, 0x7,0x57,0x59, 0x7,0x57,0x5a, 0x5,0x73,0x33, 0x7,0x57,0x55, 0x7,0x57,0x56, 0x7,0x57,0x57, 0x7,0x57,0x54, 0x7,0x57,0x52, 0x7,0x57,0x53, 0xf,0x69,0x3c, 0x4,0x68,0x64, 0x7,0x57,0x58, 0x7,0x5b,0x49, 0x7,0x5b,0x4a, 0xf,0x6a,0x4d, 0x7,0x5b,0x48, 0x7,0x5b,0x47, 0x5,0x77,0x55, 0x5,0x77,0x56, 0x4,0x6b,0x66, 0x7,0x5e,0x53, 0x7,0x5e,0x55, 0x7,0x5e,0x54, 0x7,0x5e,0x56, 0xf,0x6b,0x43, 0x5,0x75,0x67, 0x5,0x79,0x23, 0x4,0x6c,0x6d, 0xf,0x6c,0x22, 0xf,0x6c,0x23, 0x7,0x60,0x6b, 0x7,0x62,0x32, 0x7,0x62,0x31, 0x7,0x62,0x34, 0x7,0x62,0x30, 0x7,0x62,0x33, 0xf,0x6c,0x79, 0xf,0x6c,0x7a, 0x6,0x21,0x65, 0x6,0x21,0x66, 0xf,0x21,0x37, 0x4,0x21,0x6e, 0x6,0x24,0x32, 0x6,0x24,0x30, 0x5,0x22,0x49, 0xf,0x22,0x35, 0x6,0x24,0x31, 0x6,0x24,0x2f, 0x5,0x22,0x48, 0x6,0x26,0x54, 0x6,0x2f,0x5c, 0x6,0x2a,0x3e, 0x6,0x26,0x58, 0x6,0x26,0x56, 0xf,0x23,0x4f, 0xf,0x23,0x51, 0x6,0x26,0x57, 0x6,0x26,0x59, 0x6,0x26,0x5c, 0x6,0x26,0x5a, 0x6,0x26,0x51, 0x6,0x26,0x55, 0x6,0x26,0x52, 0x6,0x26,0x53, 0x6,0x26,0x5b, 0x5,0x25,0x55, 0x6,0x2a,0x43, 0x6,0x2a,0x40, 0x6,0x2a,0x41, 0x6,0x2a,0x42, 0x6,0x2d,0x34, 0x6,0x2a,0x3f, 0xf,0x26,0x24, 0x5,0x25,0x54, 0x5,0x28,0x54, 0x5,0x28,0x56, 0x6,0x2f,0x60, 0x6,0x2f,0x5f, 0x5,0x28,0x55, 0x6,0x2f,0x5b, 0x6,0x2f,0x5e, 0x6,0x2f,0x5d, 0x5,0x2c,0x5c, 0x6,0x36,0x2d, 0x6,0x36,0x2a, 0x6,0x36,0x2c, 0x5,0x2c,0x5b, 0x6,0x36,0x2b, 0x5,0x2c,0x5d, 0x5,0x31,0x56, 0x6,0x3e,0x25, 0x5,0x31,0x57, 0x6,0x3e,0x24, 0x6,0x3e,0x23, 0x6,0x3e,0x22, 0x5,0x31,0x54, 0x6,0x3e,0x26, 0x5,0x37,0x33, 0x6,0x47,0x40, 0x6,0x47,0x41, 0x5,0x37,0x31, 0x5,0x31,0x55, 0xf,0x39,0x72, 0xf,0x39,0x73, 0xf,0x39,0x74, 0x6,0x47,0x42, 0x5,0x37,0x32, 0x5,0x3e,0x40, 0x6,0x51,0x45, 0x5,0x3e,0x41, 0x6,0x51,0x47, 0x6,0x51,0x48, 0x5,0x3e,0x42, 0x6,0x51,0x46, 0xf,0x40,0x65, 0x6,0x5b,0x54, 0x6,0x5b,0x58, 0x5,0x45,0x24, 0x6,0x5b,0x55, 0x6,0x5b,0x5a, 0x6,0x5b,0x56, 0xf,0x47,0x2e, 0xf,0x47,0x2f, 0xf,0x47,0x30, 0x6,0x5b,0x57, 0x7,0x21,0x65, 0x7,0x21,0x66, 0x7,0x21,0x64, 0xf,0x4d,0x7b, 0x4,0x4f,0x75, 0xf,0x53,0x73, 0x7,0x37,0x3c, 0x7,0x37,0x3a, 0x7,0x37,0x3b, 0x4,0x5f,0x51, 0x7,0x4d,0x4d, 0x7,0x53,0x22, 0x7,0x53,0x21, 0x4,0x21,0x48, 0x5,0x21,0x44, 0x6,0x22,0x60, 0xf,0x21,0x51, 0xf,0x21,0x52, 0x6,0x22,0x61, 0x6,0x24,0x35, 0xf,0x22,0x36, 0xf,0x22,0x37, 0x6,0x24,0x34, 0x6,0x26,0x6a, 0x4,0x23,0x60, 0x6,0x26,0x66, 0x6,0x26,0x62, 0x6,0x26,0x5e, 0x6,0x26,0x69, 0x6,0x26,0x5d, 0x6,0x26,0x65, 0x6,0x26,0x67, 0xf,0x23,0x53, 0xf,0x23,0x54, 0xf,0x23,0x56, 0xf,0x23,0x58, 0xf,0x23,0x5a, 0x6,0x26,0x60, 0x6,0x26,0x63, 0x6,0x26,0x68, 0x6,0x26,0x64, 0x6,0x26,0x61, 0x6,0x26,0x5f, 0x5,0x23,0x5e, 0xf,0x23,0x59, 0x5,0x23,0x5d, 0x5,0x23,0x5f, 0x5,0x23,0x60, 0x5,0x23,0x61, 0x4,0x25,0x6a, 0x6,0x2a,0x4f, 0x6,0x2a,0x47, 0x6,0x2a,0x4c, 0x6,0x2a,0x46, 0x4,0x25,0x67, 0x6,0x2a,0x4a, 0x4,0x25,0x6c, 0x6,0x2a,0x48, 0x5,0x25,0x56, 0x6,0x2a,0x51, 0x6,0x26,0x41, 0x6,0x2a,0x49, 0xf,0x26,0x26, 0xf,0x26,0x27, 0xf,0x26,0x28, 0xf,0x26,0x29, 0xf,0x26,0x2a, 0xf,0x26,0x30, 0xf,0x26,0x31, 0xf,0x26,0x2c, 0xf,0x26,0x2b, 0x4,0x25,0x6b, 0xf,0x26,0x2f, 0xf,0x26,0x2e, 0x6,0x2a,0x50, 0x6,0x2a,0x4b, 0x6,0x2a,0x4d, 0x6,0x2a,0x4e, 0xf,0x26,0x32, 0xf,0x26,0x25, 0x6,0x2a,0x45, 0x6,0x2a,0x44, 0x5,0x25,0x57, 0x5,0x28,0x5b, 0x6,0x2f,0x62, 0x5,0x28,0x57, 0x6,0x2f,0x64, 0x6,0x2f,0x61, 0x5,0x28,0x58, 0x4,0x28,0x5f, 0x6,0x2f,0x6b, 0x6,0x2f,0x63, 0xf,0x29,0x7a, 0xf,0x29,0x68, 0xf,0x29,0x69, 0xf,0x29,0x6b, 0xf,0x29,0x6c, 0xf,0x29,0x6d, 0xf,0x29,0x6e, 0xf,0x29,0x6f, 0xf,0x29,0x70, 0xf,0x29,0x72, 0xf,0x29,0x73, 0xf,0x29,0x75, 0xf,0x29,0x76, 0xf,0x29,0x77, 0xf,0x29,0x78, 0xf,0x29,0x79, 0xf,0x29,0x7b, 0xf,0x29,0x7c, 0xf,0x29,0x7d, 0x6,0x2f,0x6a, 0x6,0x2f,0x6c, 0x6,0x34,0x31, 0x6,0x2f,0x67, 0x6,0x2f,0x68, 0x6,0x2f,0x66, 0xf,0x29,0x74, 0x5,0x28,0x5d, 0x5,0x28,0x5a, 0x5,0x28,0x5e, 0x5,0x28,0x5c, 0x5,0x28,0x59, 0x5,0x2c,0x5e, 0x4,0x2c,0x32, 0x6,0x36,0x34, 0x4,0x2c,0x30, 0x4,0x2c,0x34, 0x6,0x36,0x32, 0x6,0x36,0x3c, 0x6,0x36,0x36, 0x6,0x36,0x3d, 0x6,0x36,0x3e, 0x6,0x36,0x31, 0x6,0x36,0x2e, 0x6,0x36,0x3a, 0x6,0x36,0x2f, 0x6,0x36,0x40, 0xf,0x2e,0x55, 0xf,0x2e,0x56, 0xf,0x2e,0x57, 0xf,0x2e,0x58, 0xf,0x2e,0x59, 0xf,0x2e,0x5a, 0xf,0x2e,0x5b, 0xf,0x2e,0x5e, 0xf,0x2e,0x5f, 0xf,0x2e,0x60, 0x6,0x36,0x30, 0x6,0x36,0x3f, 0x6,0x36,0x37, 0x6,0x36,0x38, 0x6,0x36,0x39, 0x5,0x2c,0x60, 0x6,0x36,0x3b, 0xf,0x2e,0x5d, 0xf,0x2e,0x61, 0x6,0x36,0x33, 0x5,0x2c,0x5f, 0x5,0x2c,0x62, 0x4,0x30,0x7d, 0x6,0x3e,0x27, 0x4,0x30,0x7c, 0x5,0x31,0x5d, 0x6,0x3e,0x34, 0x6,0x3e,0x2d, 0x5,0x31,0x5b, 0x6,0x3e,0x2a, 0x5,0x2c,0x61, 0x6,0x3e,0x33, 0x6,0x3e,0x30, 0x5,0x31,0x5a, 0x4,0x31,0x22, 0x4,0x31,0x23, 0xf,0x33,0x4f, 0xf,0x33,0x5b, 0x6,0x3e,0x2e, 0x6,0x3e,0x2f, 0xf,0x33,0x4e, 0xf,0x33,0x50, 0xf,0x33,0x51, 0xf,0x33,0x52, 0xf,0x33,0x53, 0xf,0x33,0x54, 0xf,0x33,0x55, 0xf,0x33,0x56, 0xf,0x33,0x58, 0xf,0x33,0x59, 0xf,0x33,0x5a, 0xf,0x33,0x5e, 0xf,0x33,0x5f, 0xf,0x33,0x60, 0xf,0x33,0x61, 0x5,0x31,0x5c, 0x6,0x3e,0x31, 0x6,0x3e,0x35, 0x4,0x30,0x7e, 0x6,0x3e,0x28, 0x6,0x3e,0x29, 0x5,0x31,0x58, 0x5,0x31,0x59, 0x3,0x3a,0x4f, 0x6,0x51,0x4e, 0x4,0x36,0x72, 0x6,0x47,0x47, 0x4,0x36,0x6a, 0x6,0x47,0x45, 0x4,0x36,0x70, 0x4,0x36,0x6c, 0x6,0x47,0x4b, 0x6,0x47,0x50, 0x4,0x36,0x75, 0x6,0x47,0x44, 0x6,0x47,0x46, 0x6,0x47,0x4d, 0x5,0x37,0x34, 0x6,0x3e,0x32, 0x6,0x47,0x4f, 0x4,0x3c,0x5a, 0x5,0x37,0x39, 0x4,0x36,0x73, 0x6,0x4f,0x6d, 0x5,0x37,0x38, 0xf,0x39,0x76, 0xf,0x39,0x78, 0xf,0x39,0x79, 0xf,0x39,0x7a, 0xf,0x39,0x7b, 0xf,0x39,0x7c, 0xf,0x3a,0x21, 0xf,0x3a,0x22, 0xf,0x3a,0x23, 0xf,0x3a,0x24, 0xf,0x3a,0x25, 0xf,0x3a,0x26, 0x6,0x47,0x51, 0x6,0x47,0x4a, 0x6,0x47,0x49, 0x4,0x36,0x74, 0x6,0x47,0x4c, 0xf,0x39,0x75, 0x5,0x37,0x37, 0x5,0x37,0x3a, 0x6,0x47,0x48, 0x5,0x37,0x35, 0x5,0x37,0x36, 0x5,0x37,0x3b, 0x5,0x3e,0x46, 0x6,0x51,0x56, 0x6,0x51,0x4b, 0x6,0x51,0x55, 0x5,0x3e,0x4d, 0x4,0x3c,0x54, 0x6,0x5b,0x62, 0x6,0x51,0x52, 0x5,0x3e,0x4c, 0x6,0x51,0x51, 0x5,0x3e,0x44, 0x5,0x3e,0x4b, 0x5,0x3e,0x43, 0x6,0x51,0x54, 0x6,0x51,0x50, 0x5,0x3e,0x49, 0x5,0x3e,0x4a, 0x4,0x3c,0x55, 0x5,0x3e,0x47, 0x6,0x51,0x49, 0x6,0x51,0x4c, 0xf,0x39,0x77, 0x6,0x51,0x53, 0x6,0x51,0x4d, 0xf,0x40,0x66, 0xf,0x40,0x67, 0xf,0x40,0x68, 0xf,0x40,0x6a, 0xf,0x40,0x6b, 0xf,0x40,0x6c, 0xf,0x40,0x6d, 0xf,0x40,0x6e, 0xf,0x40,0x6f, 0xf,0x40,0x70, 0xf,0x40,0x71, 0xf,0x40,0x72, 0xf,0x40,0x73, 0x6,0x51,0x4f, 0x5,0x3e,0x4e, 0x5,0x3e,0x48, 0x5,0x3e,0x45, 0x5,0x45,0x29, 0x5,0x45,0x28, 0x5,0x45,0x27, 0x6,0x5b,0x5c, 0x4,0x42,0x5c, 0x6,0x5b,0x64, 0x6,0x5b,0x66, 0x6,0x5b,0x61, 0x5,0x45,0x2a, 0x6,0x5b,0x60, 0x5,0x45,0x26, 0x6,0x5b,0x67, 0xf,0x47,0x32, 0xf,0x47,0x33, 0xf,0x47,0x34, 0xf,0x47,0x35, 0xf,0x47,0x36, 0xf,0x47,0x37, 0xf,0x47,0x39, 0xf,0x47,0x3a, 0xf,0x47,0x3b, 0xf,0x47,0x3c, 0x6,0x5b,0x5d, 0xf,0x47,0x38, 0x6,0x5b,0x6b, 0x6,0x5b,0x63, 0x6,0x5b,0x53, 0xf,0x47,0x31, 0x4,0x42,0x5a, 0x6,0x5b,0x65, 0x6,0x5b,0x5e, 0x5,0x45,0x25, 0x5,0x45,0x2b, 0x7,0x21,0x72, 0x4,0x49,0x34, 0x4,0x49,0x35, 0x7,0x21,0x6f, 0x4,0x49,0x36, 0x5,0x4c,0x4b, 0x5,0x4c,0x4c, 0x7,0x21,0x6b, 0x7,0x21,0x78, 0x4,0x49,0x37, 0x7,0x21,0x77, 0x7,0x21,0x74, 0xf,0x4e,0x21, 0x5,0x4c,0x4d, 0x5,0x4c,0x4f, 0x7,0x21,0x67, 0x7,0x21,0x75, 0xf,0x4d,0x7c, 0xf,0x4d,0x7d, 0xf,0x4e,0x26, 0xf,0x4e,0x27, 0xf,0x4e,0x28, 0xf,0x4e,0x29, 0xf,0x4e,0x2a, 0xf,0x4e,0x2b, 0xf,0x4e,0x2d, 0x7,0x21,0x6c, 0x7,0x21,0x6d, 0x7,0x21,0x6e, 0x5,0x4c,0x71, 0x7,0x21,0x73, 0x7,0x21,0x71, 0x7,0x21,0x69, 0xf,0x4d,0x7e, 0xf,0x4e,0x24, 0xf,0x4e,0x23, 0x5,0x4c,0x4e, 0x5,0x4c,0x4a, 0x5,0x4c,0x48, 0x7,0x21,0x68, 0x5,0x4c,0x49, 0x7,0x2c,0x6f, 0x7,0x2c,0x71, 0x7,0x2c,0x6c, 0x4,0x4f,0x77, 0x4,0x4f,0x7a, 0x4,0x4f,0x79, 0x7,0x2c,0x6d, 0x7,0x2c,0x70, 0xf,0x4e,0x2c, 0xf,0x53,0x74, 0xf,0x53,0x76, 0xf,0x53,0x78, 0x5,0x53,0x7a, 0x7,0x2c,0x72, 0x5,0x53,0x7b, 0x5,0x53,0x79, 0x7,0x34,0x6f, 0x7,0x2c,0x73, 0x7,0x2c,0x6e, 0xf,0x53,0x77, 0x4,0x4f,0x76, 0x7,0x37,0x43, 0x4,0x55,0x7d, 0x7,0x37,0x3d, 0x5,0x5b,0x2e, 0x7,0x37,0x3f, 0x7,0x37,0x44, 0x7,0x37,0x42, 0x7,0x37,0x45, 0x5,0x5b,0x2c, 0x7,0x2c,0x74, 0xf,0x59,0x64, 0xf,0x59,0x65, 0xf,0x59,0x66, 0xf,0x59,0x67, 0xf,0x59,0x68, 0xf,0x59,0x69, 0xf,0x59,0x6a, 0xf,0x59,0x6b, 0x7,0x3e,0x6c, 0x7,0x37,0x40, 0x7,0x37,0x41, 0x4,0x55,0x7e, 0x5,0x5b,0x2f, 0x7,0x3f,0x34, 0x5,0x61,0x47, 0x7,0x37,0x3e, 0x5,0x61,0x49, 0x7,0x3f,0x33, 0xf,0x5e,0x47, 0xf,0x5e,0x48, 0xf,0x5e,0x49, 0xf,0x5e,0x4b, 0xf,0x5e,0x4d, 0xf,0x5e,0x4e, 0x7,0x3f,0x31, 0x7,0x3f,0x32, 0x5,0x5b,0x30, 0x5,0x61,0x48, 0xf,0x62,0x28, 0x5,0x61,0x4a, 0x7,0x46,0x42, 0x7,0x46,0x3f, 0x5,0x67,0x5d, 0x7,0x46,0x47, 0x7,0x46,0x41, 0xf,0x5e,0x4c, 0xf,0x62,0x27, 0x7,0x46,0x43, 0x7,0x46,0x46, 0x7,0x4a,0x3b, 0x7,0x46,0x40, 0x7,0x3f,0x35, 0x4,0x63,0x33, 0xf,0x65,0x22, 0xf,0x65,0x23, 0xf,0x65,0x24, 0xf,0x65,0x25, 0x7,0x4d,0x4e, 0x5,0x6b,0x77, 0x7,0x53,0x28, 0x4,0x66,0x36, 0x7,0x53,0x24, 0x7,0x53,0x23, 0x7,0x53,0x27, 0x7,0x53,0x25, 0x5,0x6f,0x74, 0xf,0x67,0x49, 0xf,0x67,0x4a, 0xf,0x67,0x4c, 0x7,0x53,0x26, 0xf,0x67,0x4b, 0x5,0x6f,0x72, 0x5,0x6f,0x73, 0x7,0x57,0x5b, 0xf,0x69,0x3d, 0x5,0x73,0x34, 0x7,0x57,0x5d, 0x5,0x73,0x35, 0x7,0x5b,0x4b, 0x7,0x57,0x5c, 0x7,0x5e,0x57, 0x5,0x77,0x57, 0x5,0x7b,0x5f, 0x7,0x65,0x5a, 0x7,0x66,0x42, 0x7,0x66,0x4f, 0x6,0x22,0x62, 0x6,0x2f,0x6d, 0x6,0x26,0x6b, 0x6,0x2a,0x52, 0xf,0x29,0x7e, 0xf,0x2a,0x21, 0x5,0x2c,0x64, 0x6,0x36,0x42, 0x6,0x2f,0x6e, 0x6,0x36,0x41, 0xf,0x2e,0x62, 0x5,0x2c,0x63, 0x6,0x3e,0x36, 0xf,0x33,0x62, 0x6,0x47,0x52, 0x6,0x51,0x59, 0x6,0x51,0x58, 0x6,0x5b,0x6a, 0x6,0x64,0x7a, 0x6,0x5b,0x68, 0xf,0x47,0x3d, 0x6,0x5b,0x69, 0x7,0x21,0x7a, 0x7,0x21,0x79, 0x7,0x2c,0x75, 0x7,0x3f,0x36, 0x7,0x43,0x3f, 0xf,0x5e,0x4f, 0x7,0x3f,0x37, 0x7,0x46,0x48, 0x7,0x46,0x49, 0x7,0x48,0x3b, 0x7,0x57,0x5e, 0x5,0x21,0x2f, 0x6,0x22,0x63, 0x6,0x24,0x37, 0x6,0x24,0x36, 0x6,0x26,0x6c, 0xf,0x23,0x5c, 0x6,0x36,0x43, 0x6,0x3e,0x37, 0x6,0x3e,0x38, 0x6,0x51,0x5a, 0x6,0x24,0x39, 0x6,0x24,0x38, 0x5,0x23,0x64, 0x5,0x23,0x63, 0x4,0x25,0x6f, 0x6,0x2a,0x53, 0xf,0x26,0x34, 0xf,0x2e,0x63, 0x5,0x31,0x5e, 0x6,0x3e,0x39, 0x6,0x3e,0x3c, 0x5,0x2c,0x65, 0x6,0x3e,0x3b, 0x6,0x3e,0x3a, 0x5,0x3e,0x4f, 0x6,0x51,0x5c, 0xf,0x40,0x74, 0x6,0x5b,0x6c, 0xf,0x47,0x3e, 0x6,0x5b,0x6d, 0x5,0x4c,0x50, 0xf,0x4e,0x2f, 0xf,0x53,0x79, 0x7,0x2c,0x76, 0x7,0x2c,0x77, 0x7,0x37,0x46, 0x7,0x46,0x4a, 0x7,0x3f,0x3a, 0x7,0x3f,0x38, 0x7,0x3f,0x39, 0x7,0x46,0x4b, 0x7,0x4d,0x4f, 0x6,0x22,0x64, 0x6,0x22,0x65, 0x6,0x24,0x3a, 0x6,0x26,0x6e, 0x6,0x26,0x6d, 0x6,0x2a,0x54, 0xf,0x25,0x42, 0x5,0x28,0x5f, 0x5,0x2c,0x68, 0x4,0x2c,0x35, 0x5,0x2c,0x67, 0x6,0x36,0x46, 0x6,0x36,0x45, 0xf,0x2e,0x64, 0xf,0x2e,0x65, 0x6,0x36,0x47, 0x5,0x2c,0x69, 0x4,0x31,0x24, 0x5,0x31,0x61, 0x6,0x3e,0x3d, 0x5,0x31,0x5f, 0x5,0x31,0x60, 0x5,0x31,0x62, 0xf,0x33,0x63, 0x6,0x47,0x54, 0x5,0x37,0x3e, 0x5,0x37,0x42, 0x5,0x37,0x40, 0x5,0x37,0x41, 0xf,0x3a,0x27, 0x5,0x3e,0x50, 0x6,0x51,0x5d, 0x5,0x3e,0x52, 0x5,0x3e,0x51, 0x6,0x51,0x5f, 0x4,0x42,0x61, 0x6,0x5b,0x6f, 0x6,0x5b,0x70, 0x6,0x5b,0x6e, 0x5,0x45,0x2c, 0x5,0x45,0x2e, 0x7,0x21,0x7b, 0x5,0x4c,0x51, 0x7,0x3f,0x3b, 0x5,0x5b,0x31, 0x5,0x5b,0x32, 0x7,0x46,0x4c, 0x6,0x21,0x67, 0x6,0x21,0x68, 0xf,0x21,0x38, 0x6,0x22,0x66, 0xf,0x21,0x53, 0xf,0x21,0x54, 0x5,0x21,0x76, 0x6,0x24,0x3c, 0x4,0x22,0x54, 0x6,0x24,0x3f, 0x6,0x24,0x40, 0x6,0x24,0x3e, 0x6,0x24,0x3d, 0xf,0x21,0x6b, 0x4,0x23,0x63, 0x4,0x23,0x64, 0x4,0x23,0x66, 0xf,0x23,0x5d, 0xf,0x23,0x5e, 0xf,0x23,0x5f, 0xf,0x23,0x60, 0xf,0x23,0x61, 0xf,0x23,0x62, 0xf,0x23,0x63, 0x6,0x26,0x70, 0x6,0x26,0x6f, 0x4,0x25,0x76, 0x5,0x25,0x5a, 0x4,0x25,0x74, 0x6,0x2a,0x55, 0x6,0x2a,0x56, 0x4,0x28,0x63, 0x6,0x2a,0x5c, 0x6,0x2a,0x58, 0x6,0x2a,0x59, 0xf,0x26,0x36, 0xf,0x26,0x37, 0x6,0x2a,0x5a, 0x6,0x2a,0x5b, 0x6,0x2a,0x5d, 0x4,0x25,0x79, 0x6,0x2a,0x57, 0x6,0x29,0x39, 0x4,0x28,0x64, 0x4,0x28,0x62, 0x5,0x28,0x61, 0x5,0x28,0x62, 0x5,0x28,0x60, 0xf,0x2a,0x23, 0xf,0x2a,0x24, 0xf,0x2a,0x25, 0xf,0x2a,0x26, 0xf,0x2a,0x28, 0xf,0x2a,0x29, 0xf,0x2a,0x27, 0xf,0x2a,0x22, 0x5,0x2c,0x6c, 0x6,0x36,0x48, 0x6,0x36,0x4b, 0x5,0x2c,0x6a, 0x5,0x2c,0x6d, 0xf,0x2e,0x67, 0xf,0x2e,0x68, 0xf,0x2e,0x69, 0x6,0x36,0x4a, 0x4,0x2c,0x37, 0x5,0x2c,0x6b, 0x5,0x31,0x64, 0xf,0x2e,0x66, 0x4,0x2c,0x36, 0x6,0x3e,0x41, 0x6,0x3e,0x44, 0x3,0x34,0x7e, 0x6,0x3e,0x3e, 0x6,0x3e,0x43, 0x6,0x3e,0x40, 0x6,0x3e,0x45, 0x6,0x3e,0x3f, 0xf,0x33,0x64, 0xf,0x33,0x65, 0x4,0x31,0x27, 0x5,0x31,0x63, 0x4,0x3c,0x5e, 0x6,0x47,0x58, 0x6,0x47,0x5b, 0x6,0x47,0x5d, 0x6,0x47,0x5a, 0xf,0x3a,0x28, 0x6,0x47,0x55, 0x6,0x47,0x5c, 0x5,0x37,0x43, 0x6,0x47,0x59, 0x4,0x36,0x7a, 0x4,0x36,0x78, 0x5,0x37,0x44, 0x6,0x47,0x57, 0x6,0x51,0x60, 0x6,0x51,0x61, 0x4,0x3c,0x5d, 0xf,0x40,0x76, 0x5,0x3e,0x53, 0x5,0x3e,0x54, 0x5,0x3e,0x55, 0x6,0x5b,0x72, 0x4,0x42,0x63, 0x5,0x45,0x2f, 0x4,0x42,0x62, 0xf,0x47,0x3f, 0xf,0x47,0x40, 0xf,0x47,0x41, 0x6,0x5b,0x71, 0x5,0x45,0x30, 0x4,0x49,0x38, 0x7,0x22,0x22, 0x7,0x21,0x7c, 0x7,0x22,0x21, 0x7,0x2c,0x7c, 0x7,0x21,0x7e, 0x5,0x4c,0x53, 0xf,0x4e,0x31, 0xf,0x4e,0x32, 0x7,0x21,0x7d, 0x4,0x42,0x64, 0x5,0x4c,0x52, 0x7,0x2c,0x7d, 0x5,0x53,0x7c, 0x7,0x2c,0x78, 0x7,0x2c,0x79, 0x4,0x56,0x21, 0xf,0x53,0x7a, 0x7,0x2c,0x7a, 0x7,0x37,0x48, 0x7,0x37,0x47, 0x5,0x5b,0x33, 0x4,0x56,0x2e, 0x4,0x5a,0x7b, 0xf,0x62,0x29, 0x5,0x6b,0x78, 0x7,0x53,0x29, 0xf,0x69,0x3e, 0x5,0x75,0x68, 0xf,0x6b,0x44, 0x7,0x5e,0x58, 0xf,0x6c,0x5f, 0x5,0x21,0x62, 0xf,0x21,0x55, 0xf,0x21,0x56, 0x6,0x24,0x41, 0x4,0x22,0x58, 0x6,0x24,0x42, 0xf,0x22,0x39, 0xf,0x22,0x3a, 0xf,0x22,0x3b, 0xf,0x22,0x3c, 0x4,0x22,0x57, 0x5,0x22,0x4b, 0x6,0x24,0x43, 0x5,0x22,0x4a, 0x6,0x26,0x74, 0x4,0x23,0x68, 0x4,0x23,0x6b, 0xf,0x23,0x64, 0xf,0x23,0x66, 0xf,0x23,0x68, 0xf,0x23,0x69, 0xf,0x23,0x6b, 0xf,0x23,0x6c, 0xf,0x23,0x6d, 0xf,0x23,0x6e, 0xf,0x23,0x6f, 0xf,0x23,0x65, 0x6,0x26,0x72, 0x6,0x26,0x73, 0x6,0x26,0x75, 0x6,0x26,0x71, 0xf,0x23,0x6a, 0xf,0x23,0x67, 0x5,0x23,0x66, 0x5,0x23,0x67, 0x5,0x23,0x65, 0x4,0x25,0x7c, 0x6,0x2a,0x61, 0x6,0x2a,0x60, 0x5,0x25,0x60, 0x4,0x25,0x7a, 0x5,0x25,0x5e, 0x4,0x25,0x7d, 0x5,0x25,0x5b, 0x5,0x25,0x5c, 0x4,0x25,0x7e, 0xf,0x26,0x3a, 0xf,0x26,0x3b, 0xf,0x26,0x3e, 0xf,0x26,0x3f, 0xf,0x26,0x40, 0xf,0x26,0x41, 0xf,0x26,0x42, 0xf,0x26,0x43, 0xf,0x26,0x45, 0xf,0x26,0x46, 0xf,0x26,0x47, 0xf,0x26,0x48, 0xf,0x26,0x49, 0x6,0x2a,0x5f, 0x6,0x2a,0x5e, 0xf,0x26,0x44, 0xf,0x26,0x3c, 0xf,0x26,0x3d, 0x5,0x25,0x62, 0x5,0x25,0x5f, 0x5,0x25,0x63, 0x5,0x25,0x61, 0x4,0x28,0x68, 0x5,0x28,0x64, 0x6,0x2f,0x76, 0x6,0x2f,0x78, 0x6,0x2f,0x79, 0x4,0x28,0x65, 0x4,0x28,0x6b, 0x5,0x28,0x66, 0x4,0x28,0x66, 0x5,0x28,0x63, 0x6,0x2f,0x70, 0x6,0x2f,0x7b, 0x6,0x2f,0x74, 0x5,0x28,0x6b, 0x6,0x2f,0x7e, 0xf,0x2a,0x2d, 0xf,0x2a,0x2e, 0xf,0x2a,0x2f, 0xf,0x2a,0x30, 0xf,0x2a,0x31, 0xf,0x2a,0x32, 0xf,0x2a,0x33, 0xf,0x2a,0x34, 0x6,0x2f,0x73, 0x6,0x2f,0x77, 0x4,0x28,0x6c, 0x6,0x2f,0x75, 0x6,0x2f,0x7a, 0x6,0x2f,0x6f, 0x6,0x2f,0x7d, 0x5,0x28,0x69, 0x4,0x28,0x6a, 0x5,0x28,0x6a, 0x5,0x28,0x67, 0x6,0x2f,0x71, 0x6,0x2f,0x7c, 0x5,0x28,0x65, 0x5,0x28,0x68, 0x6,0x2f,0x72, 0x3,0x30,0x53, 0x5,0x2c,0x70, 0x6,0x36,0x4f, 0x5,0x2c,0x72, 0x5,0x2c,0x75, 0x5,0x2c,0x6f, 0x6,0x36,0x55, 0x5,0x2c,0x6e, 0x6,0x36,0x56, 0x6,0x36,0x50, 0x6,0x36,0x51, 0xf,0x2e,0x6c, 0xf,0x2e,0x6e, 0xf,0x2e,0x70, 0xf,0x2e,0x71, 0xf,0x2e,0x73, 0xf,0x2e,0x74, 0xf,0x2e,0x75, 0xf,0x2e,0x76, 0xf,0x2e,0x77, 0xf,0x2e,0x79, 0x6,0x36,0x54, 0x6,0x36,0x4e, 0x5,0x2c,0x71, 0x6,0x36,0x53, 0x6,0x36,0x52, 0xf,0x2e,0x6f, 0xf,0x2e,0x72, 0x5,0x2c,0x77, 0x5,0x2c,0x74, 0x5,0x2c,0x73, 0x5,0x2c,0x76, 0x5,0x2c,0x78, 0x6,0x3e,0x4c, 0x6,0x3e,0x52, 0x6,0x3e,0x46, 0x6,0x3e,0x47, 0x5,0x31,0x6a, 0x6,0x3e,0x48, 0x6,0x3e,0x49, 0x6,0x3e,0x4f, 0x5,0x31,0x69, 0x5,0x31,0x6d, 0x6,0x3e,0x4d, 0x4,0x31,0x2b, 0x6,0x3e,0x4e, 0x5,0x31,0x6b, 0x6,0x3e,0x53, 0xf,0x33,0x68, 0xf,0x33,0x69, 0xf,0x33,0x6a, 0xf,0x33,0x6b, 0xf,0x33,0x6c, 0xf,0x33,0x6d, 0xf,0x33,0x6e, 0xf,0x33,0x6f, 0xf,0x33,0x71, 0xf,0x33,0x72, 0xf,0x33,0x74, 0xf,0x33,0x75, 0xf,0x33,0x76, 0xf,0x33,0x77, 0xf,0x33,0x78, 0xf,0x33,0x79, 0xf,0x33,0x7a, 0xf,0x33,0x7b, 0xf,0x33,0x7c, 0xf,0x33,0x7d, 0xf,0x33,0x7e, 0xf,0x34,0x21, 0xf,0x34,0x22, 0xf,0x34,0x23, 0xf,0x33,0x70, 0x6,0x3e,0x51, 0x4,0x31,0x2a, 0x6,0x3e,0x4b, 0x6,0x3e,0x4a, 0x5,0x31,0x66, 0x5,0x31,0x67, 0x5,0x31,0x68, 0x5,0x31,0x65, 0x4,0x36,0x7b, 0x6,0x47,0x62, 0x4,0x36,0x7c, 0x5,0x37,0x5a, 0x6,0x47,0x5f, 0x4,0x37,0x21, 0x5,0x37,0x48, 0x5,0x37,0x59, 0x6,0x47,0x64, 0x6,0x47,0x66, 0x5,0x37,0x4f, 0x6,0x47,0x65, 0x6,0x47,0x60, 0x5,0x37,0x50, 0x5,0x37,0x49, 0x5,0x37,0x57, 0x5,0x37,0x54, 0x5,0x37,0x47, 0x5,0x37,0x4b, 0xf,0x3a,0x29, 0xf,0x3a,0x2b, 0xf,0x3a,0x2c, 0xf,0x3a,0x2d, 0xf,0x3a,0x2e, 0xf,0x3a,0x2f, 0xf,0x3a,0x30, 0xf,0x3a,0x32, 0xf,0x3a,0x33, 0xf,0x3a,0x34, 0xf,0x3a,0x36, 0xf,0x3a,0x37, 0xf,0x3a,0x38, 0xf,0x3a,0x39, 0xf,0x3a,0x3a, 0xf,0x3a,0x3e, 0xf,0x3a,0x3f, 0xf,0x3a,0x41, 0xf,0x3a,0x42, 0xf,0x3a,0x43, 0xf,0x3a,0x44, 0xf,0x3a,0x45, 0xf,0x3a,0x3b, 0x5,0x37,0x56, 0x6,0x47,0x63, 0x5,0x37,0x58, 0x6,0x47,0x5e, 0xf,0x3a,0x3d, 0xf,0x3a,0x40, 0xf,0x3a,0x31, 0xf,0x3a,0x2a, 0x5,0x37,0x45, 0x5,0x3e,0x56, 0x5,0x37,0x53, 0x5,0x37,0x4c, 0x5,0x37,0x52, 0x5,0x37,0x51, 0x5,0x37,0x4a, 0x5,0x37,0x4d, 0x5,0x37,0x55, 0x6,0x47,0x67, 0xf,0x33,0x67, 0x5,0x3e,0x5f, 0x5,0x3e,0x5a, 0x5,0x3e,0x5d, 0x5,0x3e,0x57, 0x4,0x3c,0x65, 0x5,0x3e,0x59, 0x6,0x51,0x63, 0x4,0x3c,0x62, 0x4,0x3c,0x60, 0x6,0x51,0x67, 0x6,0x51,0x65, 0x6,0x5b,0x7c, 0x5,0x3e,0x5c, 0x5,0x3e,0x5b, 0x6,0x51,0x66, 0xf,0x40,0x78, 0xf,0x40,0x79, 0xf,0x40,0x7a, 0xf,0x40,0x7c, 0xf,0x40,0x7d, 0xf,0x40,0x7e, 0xf,0x41,0x22, 0xf,0x41,0x23, 0x6,0x51,0x62, 0x6,0x51,0x64, 0xf,0x40,0x77, 0x6,0x51,0x68, 0x5,0x3e,0x58, 0x5,0x3e,0x5e, 0x5,0x3e,0x60, 0x6,0x51,0x6a, 0xf,0x41,0x21, 0x4,0x42,0x70, 0x5,0x45,0x32, 0x4,0x42,0x6a, 0x6,0x5b,0x7b, 0x4,0x42,0x71, 0x6,0x5b,0x73, 0x5,0x45,0x34, 0x7,0x22,0x29, 0x4,0x42,0x73, 0x6,0x5b,0x75, 0xf,0x47,0x48, 0x4,0x42,0x6f, 0x5,0x45,0x37, 0x4,0x42,0x6e, 0xf,0x47,0x47, 0xf,0x47,0x49, 0xf,0x47,0x4a, 0xf,0x47,0x4b, 0xf,0x47,0x4c, 0xf,0x47,0x4d, 0xf,0x47,0x4e, 0xf,0x47,0x4f, 0xf,0x47,0x50, 0xf,0x47,0x51, 0xf,0x47,0x52, 0xf,0x47,0x54, 0x6,0x5b,0x74, 0x6,0x5b,0x78, 0x4,0x42,0x72, 0x4,0x42,0x65, 0x6,0x5b,0x76, 0xf,0x47,0x53, 0x5,0x45,0x33, 0x5,0x45,0x36, 0x5,0x45,0x35, 0x7,0x22,0x26, 0x5,0x45,0x31, 0x6,0x5b,0x77, 0x5,0x4c,0x5b, 0x5,0x4c,0x59, 0x4,0x49,0x39, 0x5,0x4c,0x56, 0x7,0x22,0x2f, 0x5,0x4c,0x57, 0x4,0x49,0x3f, 0x4,0x49,0x3b, 0x7,0x22,0x2c, 0x4,0x49,0x3e, 0x7,0x22,0x25, 0x6,0x5b,0x79, 0x7,0x22,0x24, 0xf,0x4e,0x3a, 0x7,0x37,0x51, 0xf,0x47,0x45, 0x5,0x4c,0x54, 0x5,0x4c,0x5c, 0xf,0x4e,0x33, 0xf,0x4e,0x34, 0xf,0x4e,0x35, 0xf,0x4e,0x36, 0xf,0x4e,0x37, 0xf,0x4e,0x38, 0xf,0x4e,0x39, 0xf,0x4e,0x3b, 0xf,0x4e,0x3d, 0xf,0x4e,0x3e, 0xf,0x4e,0x3f, 0xf,0x4e,0x40, 0xf,0x4e,0x41, 0xf,0x4e,0x42, 0xf,0x4e,0x44, 0x6,0x5b,0x7a, 0x7,0x22,0x27, 0x7,0x22,0x2e, 0x7,0x22,0x2d, 0x7,0x22,0x28, 0x7,0x22,0x23, 0xf,0x4e,0x45, 0xf,0x4e,0x43, 0xf,0x4e,0x3c, 0x5,0x4c,0x5a, 0x5,0x4c,0x55, 0x4,0x49,0x3d, 0x7,0x22,0x2a, 0x5,0x4c,0x58, 0x7,0x22,0x2b, 0xf,0x54,0x25, 0x5,0x54,0x28, 0x5,0x54,0x23, 0x7,0x2d,0x25, 0x7,0x2c,0x7e, 0x5,0x54,0x29, 0x5,0x54,0x26, 0x7,0x2d,0x21, 0x4,0x4f,0x7e, 0x7,0x2d,0x28, 0x5,0x54,0x22, 0x7,0x2d,0x2b, 0x5,0x53,0x7d, 0x7,0x2d,0x2a, 0x7,0x2d,0x2c, 0xf,0x53,0x7b, 0xf,0x53,0x7c, 0xf,0x53,0x7d, 0xf,0x53,0x7e, 0xf,0x54,0x22, 0xf,0x54,0x23, 0xf,0x54,0x24, 0xf,0x54,0x26, 0xf,0x54,0x27, 0xf,0x54,0x2b, 0xf,0x54,0x2c, 0x5,0x53,0x7e, 0x7,0x2d,0x26, 0x7,0x2d,0x27, 0x7,0x2d,0x23, 0x7,0x2d,0x22, 0x7,0x2d,0x24, 0xf,0x54,0x21, 0xf,0x54,0x28, 0x5,0x54,0x27, 0x5,0x54,0x21, 0x5,0x54,0x25, 0x7,0x2d,0x29, 0x7,0x37,0x4b, 0x7,0x37,0x54, 0x7,0x37,0x4f, 0x4,0x4f,0x7d, 0x7,0x37,0x4d, 0x4,0x56,0x23, 0x7,0x37,0x53, 0x7,0x37,0x4a, 0x5,0x5b,0x36, 0x5,0x5b,0x34, 0x7,0x37,0x4c, 0x7,0x37,0x4e, 0x7,0x37,0x50, 0x5,0x5b,0x35, 0x4,0x56,0x25, 0xf,0x59,0x6c, 0xf,0x59,0x6d, 0xf,0x59,0x6e, 0xf,0x59,0x6f, 0xf,0x59,0x70, 0xf,0x59,0x71, 0x7,0x37,0x52, 0x7,0x37,0x55, 0x7,0x37,0x49, 0x5,0x61,0x4b, 0x4,0x5a,0x7c, 0x7,0x3f,0x3f, 0x5,0x61,0x4c, 0x5,0x61,0x4d, 0x7,0x3f,0x3e, 0x7,0x3f,0x40, 0xf,0x5e,0x50, 0xf,0x5e,0x51, 0xf,0x5e,0x52, 0xf,0x5e,0x54, 0x7,0x3f,0x3d, 0x7,0x3f,0x41, 0xf,0x5e,0x53, 0x7,0x3f,0x3c, 0x5,0x67,0x5f, 0x4,0x5f,0x53, 0x7,0x46,0x4d, 0x7,0x46,0x52, 0x7,0x46,0x50, 0xf,0x5e,0x55, 0xf,0x62,0x2a, 0xf,0x62,0x2b, 0x7,0x46,0x4e, 0x5,0x67,0x61, 0x5,0x67,0x60, 0xf,0x5f,0x73, 0x7,0x4d,0x51, 0x5,0x6b,0x79, 0xf,0x65,0x26, 0x5,0x6b,0x7a, 0x5,0x6b,0x7b, 0x7,0x53,0x2a, 0x5,0x6f,0x76, 0x7,0x53,0x2b, 0x5,0x6f,0x75, 0xf,0x67,0x4d, 0xf,0x67,0x4e, 0x7,0x57,0x62, 0x5,0x73,0x36, 0x7,0x57,0x61, 0x7,0x57,0x63, 0x7,0x57,0x5f, 0xf,0x69,0x3f, 0x7,0x57,0x60, 0x7,0x57,0x64, 0xf,0x69,0x40, 0x5,0x75,0x69, 0x7,0x5b,0x4c, 0x7,0x5e,0x5a, 0x7,0x5e,0x5b, 0xf,0x6b,0x45, 0x7,0x5e,0x59, 0x7,0x5e,0x5c, 0xf,0x6c,0x24, 0x5,0x79,0x24, 0xf,0x6c,0x4a, 0x7,0x63,0x4d, 0x5,0x7a,0x65, 0x4,0x21,0x33, 0x6,0x22,0x68, 0x5,0x21,0x63, 0x6,0x22,0x69, 0xf,0x21,0x58, 0xf,0x21,0x57, 0x6,0x24,0x45, 0x6,0x24,0x44, 0x6,0x26,0x76, 0x6,0x26,0x77, 0x5,0x23,0x6a, 0x4,0x23,0x6c, 0xf,0x23,0x70, 0x5,0x23,0x69, 0x4,0x28,0x6f, 0x6,0x30,0x24, 0x6,0x2a,0x63, 0x6,0x2a,0x62, 0xf,0x26,0x4a, 0xf,0x26,0x4b, 0xf,0x26,0x4c, 0xf,0x26,0x4d, 0xf,0x26,0x4f, 0x6,0x2a,0x64, 0xf,0x26,0x4e, 0x6,0x30,0x23, 0x6,0x30,0x21, 0x6,0x30,0x26, 0x6,0x30,0x25, 0xf,0x2a,0x35, 0xf,0x2a,0x36, 0xf,0x2a,0x37, 0x6,0x30,0x22, 0x6,0x36,0x59, 0x5,0x2c,0x79, 0x6,0x36,0x58, 0xf,0x2e,0x7a, 0xf,0x2e,0x7b, 0x5,0x2c,0x7a, 0xf,0x33,0x66, 0xf,0x34,0x24, 0xf,0x34,0x25, 0xf,0x34,0x26, 0xf,0x34,0x27, 0x5,0x37,0x5c, 0x6,0x47,0x69, 0x5,0x37,0x5b, 0x6,0x47,0x6a, 0xf,0x3a,0x47, 0x6,0x47,0x68, 0xf,0x3a,0x46, 0x4,0x3c,0x66, 0x4,0x3c,0x68, 0x6,0x51,0x6d, 0x5,0x3e,0x62, 0xf,0x41,0x25, 0xf,0x41,0x26, 0x6,0x51,0x6b, 0x6,0x51,0x6c, 0x5,0x3e,0x61, 0x4,0x3c,0x69, 0x6,0x5b,0x7d, 0xf,0x47,0x55, 0xf,0x47,0x56, 0x5,0x45,0x38, 0x4,0x49,0x41, 0x4,0x49,0x42, 0xf,0x4e,0x46, 0x5,0x4c,0x5d, 0x7,0x2d,0x2f, 0x7,0x2d,0x2e, 0x7,0x2d,0x31, 0x7,0x2d,0x32, 0x5,0x54,0x2a, 0x7,0x2d,0x30, 0xf,0x54,0x2d, 0xf,0x54,0x2e, 0x7,0x37,0x56, 0x7,0x4d,0x52, 0xf,0x62,0x2c, 0xf,0x62,0x2d, 0x5,0x6b,0x7c, 0xf,0x6c,0x60, 0x6,0x21,0x69, 0x5,0x21,0x64, 0x6,0x24,0x46, 0x6,0x24,0x49, 0x6,0x24,0x4a, 0x4,0x22,0x5a, 0xf,0x22,0x3d, 0xf,0x22,0x3e, 0xf,0x22,0x3f, 0xf,0x22,0x40, 0xf,0x22,0x41, 0x6,0x24,0x47, 0x6,0x26,0x7e, 0x6,0x26,0x7d, 0x4,0x23,0x6e, 0x6,0x26,0x7b, 0x6,0x26,0x7c, 0xf,0x23,0x72, 0x5,0x25,0x65, 0x5,0x25,0x64, 0x6,0x2a,0x66, 0x5,0x25,0x66, 0x6,0x2a,0x67, 0x6,0x2a,0x68, 0xf,0x26,0x51, 0xf,0x26,0x52, 0xf,0x26,0x54, 0xf,0x26,0x55, 0x6,0x2a,0x65, 0xf,0x26,0x53, 0x5,0x28,0x6c, 0x6,0x30,0x28, 0x6,0x30,0x2a, 0x5,0x28,0x6d, 0x4,0x28,0x71, 0x4,0x28,0x72, 0x4,0x28,0x73, 0x6,0x30,0x2b, 0x6,0x30,0x27, 0x6,0x30,0x29, 0xf,0x2a,0x38, 0xf,0x2a,0x3a, 0xf,0x2a,0x3b, 0xf,0x2a,0x3c, 0x6,0x30,0x2c, 0x6,0x30,0x2d, 0x4,0x2c,0x4a, 0x6,0x36,0x61, 0x4,0x2c,0x45, 0x4,0x2c,0x44, 0x4,0x2c,0x43, 0x4,0x2c,0x47, 0x6,0x36,0x64, 0x6,0x36,0x65, 0x6,0x36,0x5f, 0x6,0x36,0x5e, 0x5,0x2c,0x7d, 0x5,0x2d,0x22, 0x6,0x36,0x5b, 0x6,0x36,0x62, 0xf,0x2e,0x7c, 0xf,0x2e,0x7d, 0x6,0x36,0x60, 0x6,0x36,0x63, 0x6,0x36,0x5a, 0x6,0x36,0x5c, 0x5,0x2d,0x21, 0x5,0x2c,0x7e, 0x4,0x31,0x2d, 0x5,0x31,0x6f, 0x6,0x3e,0x57, 0x6,0x3e,0x59, 0x6,0x3e,0x58, 0x6,0x3e,0x56, 0x6,0x3e,0x5b, 0x5,0x31,0x70, 0xf,0x34,0x28, 0xf,0x34,0x29, 0xf,0x34,0x2a, 0xf,0x34,0x2b, 0xf,0x34,0x2c, 0xf,0x34,0x2d, 0xf,0x34,0x2e, 0xf,0x34,0x2f, 0x4,0x31,0x2f, 0x6,0x3e,0x5c, 0x5,0x31,0x6e, 0x6,0x3e,0x55, 0x5,0x37,0x5e, 0x4,0x37,0x26, 0x5,0x37,0x61, 0x6,0x47,0x70, 0x6,0x47,0x6b, 0x4,0x37,0x23, 0x5,0x37,0x5d, 0x5,0x37,0x60, 0x6,0x47,0x6e, 0x4,0x37,0x25, 0x5,0x37,0x5f, 0x6,0x47,0x6f, 0x6,0x47,0x6c, 0xf,0x3a,0x48, 0xf,0x3a,0x49, 0xf,0x3a,0x4a, 0xf,0x3a,0x4b, 0xf,0x3a,0x4c, 0xf,0x3a,0x4d, 0xf,0x3a,0x4e, 0xf,0x3a,0x4f, 0x6,0x47,0x6d, 0x5,0x37,0x62, 0xf,0x3d,0x6c, 0x6,0x51,0x74, 0x6,0x51,0x70, 0x4,0x3c,0x6b, 0x4,0x3c,0x70, 0x5,0x3e,0x63, 0x6,0x51,0x77, 0x5,0x3e,0x64, 0x6,0x51,0x72, 0x6,0x51,0x71, 0x6,0x51,0x76, 0x4,0x3c,0x6d, 0x6,0x51,0x73, 0x6,0x51,0x6f, 0x6,0x51,0x75, 0xf,0x41,0x27, 0xf,0x41,0x28, 0xf,0x41,0x29, 0xf,0x41,0x2a, 0xf,0x41,0x2c, 0xf,0x41,0x2d, 0xf,0x41,0x2e, 0x6,0x51,0x6e, 0x6,0x5b,0x7e, 0x6,0x5c,0x27, 0x5,0x45,0x3c, 0x5,0x45,0x3a, 0x6,0x5c,0x24, 0x6,0x5c,0x2c, 0x4,0x42,0x76, 0x6,0x5c,0x2e, 0x6,0x5c,0x2b, 0x6,0x5c,0x26, 0x5,0x45,0x39, 0x7,0x22,0x33, 0xf,0x47,0x57, 0xf,0x47,0x58, 0xf,0x47,0x59, 0xf,0x47,0x5a, 0x6,0x5c,0x28, 0x6,0x5c,0x25, 0x6,0x5c,0x29, 0x6,0x5c,0x2d, 0x6,0x5c,0x21, 0x6,0x5c,0x23, 0x5,0x45,0x3b, 0x6,0x5c,0x2a, 0xf,0x47,0x44, 0x6,0x62,0x67, 0x7,0x22,0x30, 0x5,0x4c,0x5e, 0x4,0x49,0x47, 0x7,0x22,0x37, 0x4,0x49,0x48, 0x7,0x22,0x35, 0x7,0x22,0x32, 0xf,0x4e,0x47, 0xf,0x4e,0x48, 0xf,0x4e,0x49, 0xf,0x4e,0x4a, 0xf,0x4e,0x4b, 0xf,0x4e,0x4c, 0xf,0x4e,0x4e, 0xf,0x4e,0x4f, 0x7,0x22,0x38, 0x7,0x22,0x36, 0xf,0x4e,0x4d, 0x5,0x4c,0x61, 0x5,0x4c,0x5f, 0x7,0x22,0x31, 0x5,0x4c,0x60, 0x7,0x2d,0x35, 0x7,0x2d,0x37, 0x5,0x54,0x2c, 0x4,0x50,0x22, 0x5,0x54,0x2d, 0x5,0x54,0x2b, 0x7,0x2d,0x36, 0x7,0x2d,0x33, 0x7,0x2d,0x34, 0xf,0x54,0x2f, 0xf,0x54,0x30, 0xf,0x54,0x31, 0xf,0x54,0x33, 0xf,0x54,0x34, 0xf,0x54,0x35, 0xf,0x54,0x36, 0xf,0x54,0x37, 0x7,0x37,0x59, 0x7,0x37,0x57, 0x5,0x5b,0x38, 0xf,0x59,0x72, 0xf,0x59,0x73, 0xf,0x59,0x74, 0xf,0x59,0x75, 0x7,0x37,0x58, 0x7,0x37,0x5a, 0x7,0x22,0x34, 0x5,0x5b,0x37, 0x7,0x46,0x58, 0x5,0x61,0x4e, 0xf,0x59,0x76, 0xf,0x5e,0x56, 0xf,0x5e,0x57, 0x7,0x3f,0x42, 0xf,0x62,0x2e, 0x4,0x5f,0x57, 0x7,0x46,0x53, 0x7,0x46,0x55, 0x4,0x5f,0x56, 0x7,0x46,0x57, 0x7,0x46,0x56, 0xf,0x62,0x2f, 0x7,0x46,0x54, 0x4,0x63,0x36, 0x7,0x4d,0x53, 0x7,0x53,0x2c, 0x4,0x66,0x38, 0x7,0x53,0x2d, 0xf,0x67,0x4f, 0xf,0x67,0x50, 0x7,0x53,0x2e, 0x5,0x73,0x38, 0x4,0x68,0x66, 0x7,0x57,0x65, 0x5,0x73,0x37, 0x7,0x57,0x66, 0x4,0x6a,0x45, 0x4,0x6b,0x67, 0xf,0x6b,0x46, 0x7,0x60,0x6c, 0x7,0x64,0x45, 0x5,0x79,0x25, 0xf,0x6c,0x25, 0x4,0x6d,0x54, 0x5,0x7a,0x27, 0x4,0x6d,0x71, 0x7,0x63,0x4e, 0x7,0x65,0x34, 0x6,0x21,0x6a, 0x6,0x2a,0x6a, 0x6,0x2a,0x69, 0xf,0x26,0x56, 0xf,0x26,0x57, 0x5,0x28,0x6f, 0x6,0x30,0x2e, 0xf,0x2a,0x3d, 0x6,0x30,0x31, 0x6,0x30,0x2f, 0x4,0x31,0x31, 0x6,0x43,0x67, 0x6,0x3e,0x5e, 0x6,0x3e,0x5d, 0x4,0x37,0x27, 0x6,0x3e,0x5f, 0x6,0x51,0x7a, 0x6,0x51,0x78, 0x6,0x51,0x79, 0x6,0x5c,0x30, 0x4,0x44,0x26, 0xf,0x47,0x5b, 0x6,0x5c,0x31, 0x5,0x45,0x3d, 0xf,0x4e,0x51, 0x7,0x22,0x3a, 0x7,0x22,0x39, 0x7,0x2d,0x39, 0x5,0x53,0x52, 0x7,0x2d,0x38, 0x7,0x37,0x5b, 0x7,0x37,0x5c, 0x5,0x61,0x4f, 0x7,0x46,0x59, 0x7,0x4d,0x54, 0x7,0x53,0x2f, 0x6,0x21,0x6b, 0xf,0x21,0x39, 0x6,0x24,0x4c, 0x5,0x22,0x4c, 0x6,0x27,0x24, 0x4,0x23,0x72, 0x6,0x27,0x23, 0x6,0x27,0x22, 0xf,0x23,0x73, 0x5,0x25,0x67, 0xf,0x26,0x58, 0x6,0x2a,0x6b, 0x6,0x30,0x32, 0x6,0x30,0x30, 0x6,0x30,0x33, 0x5,0x28,0x70, 0x4,0x2c,0x4b, 0xf,0x2f,0x21, 0x6,0x36,0x69, 0x6,0x3e,0x61, 0x5,0x31,0x71, 0x5,0x37,0x63, 0x6,0x3e,0x63, 0x6,0x3e,0x60, 0x6,0x3e,0x62, 0xf,0x34,0x30, 0x6,0x47,0x71, 0xf,0x3a,0x50, 0x6,0x47,0x73, 0x6,0x47,0x72, 0x5,0x3e,0x65, 0xf,0x41,0x2f, 0x5,0x45,0x3e, 0x6,0x5c,0x33, 0x6,0x5c,0x32, 0x5,0x4c,0x62, 0x7,0x22,0x3b, 0x5,0x54,0x2f, 0x7,0x2d,0x3a, 0xf,0x59,0x77, 0x5,0x61,0x50, 0x5,0x6f,0x77, 0x4,0x21,0x4a, 0xf,0x21,0x3a, 0x5,0x21,0x65, 0xf,0x21,0x4d, 0xf,0x21,0x5a, 0x6,0x22,0x6b, 0x6,0x22,0x6a, 0x5,0x22,0x4d, 0xf,0x22,0x43, 0x5,0x23,0x6c, 0x4,0x23,0x73, 0x5,0x25,0x68, 0x6,0x27,0x25, 0x5,0x23,0x6b, 0x5,0x23,0x6e, 0x5,0x23,0x6d, 0x6,0x30,0x34, 0x5,0x25,0x69, 0x6,0x2a,0x6c, 0x5,0x25,0x6b, 0xf,0x26,0x59, 0x6,0x30,0x35, 0x5,0x25,0x6a, 0x5,0x28,0x71, 0x6,0x30,0x37, 0x6,0x30,0x38, 0x5,0x28,0x72, 0x6,0x30,0x39, 0x5,0x2d,0x23, 0x6,0x36,0x6c, 0x6,0x36,0x6a, 0x5,0x2d,0x24, 0x6,0x36,0x6b, 0x6,0x36,0x6d, 0xf,0x2f,0x22, 0x6,0x3e,0x66, 0x5,0x31,0x72, 0x4,0x31,0x34, 0x5,0x31,0x74, 0x6,0x47,0x76, 0x6,0x47,0x74, 0x6,0x47,0x75, 0x4,0x37,0x2a, 0x6,0x47,0x77, 0xf,0x3a,0x51, 0x6,0x51,0x7b, 0x6,0x51,0x7d, 0x6,0x51,0x7c, 0x5,0x48,0x26, 0x4,0x42,0x7a, 0x6,0x5c,0x34, 0x5,0x45,0x40, 0x5,0x45,0x3f, 0x6,0x5c,0x35, 0x5,0x45,0x41, 0x7,0x2d,0x3d, 0x7,0x22,0x3e, 0x7,0x22,0x3d, 0x7,0x22,0x3c, 0x7,0x2d,0x3b, 0x5,0x54,0x30, 0x7,0x2d,0x3c, 0x7,0x2d,0x3e, 0xf,0x54,0x38, 0x7,0x37,0x5d, 0x4,0x66,0x39, 0x4,0x68,0x67, 0x5,0x79,0x26, 0x6,0x21,0x3e, 0x4,0x21,0x75, 0x4,0x21,0x74, 0x6,0x22,0x6c, 0x6,0x24,0x4d, 0x4,0x22,0x5e, 0x5,0x22,0x4e, 0x6,0x24,0x4e, 0x6,0x24,0x50, 0x6,0x24,0x51, 0x6,0x24,0x4f, 0xf,0x22,0x44, 0x6,0x27,0x29, 0xf,0x23,0x74, 0x6,0x27,0x27, 0x6,0x27,0x26, 0x6,0x27,0x28, 0x5,0x23,0x6f, 0x4,0x26,0x2c, 0x4,0x26,0x2b, 0x6,0x2a,0x6d, 0x6,0x2a,0x6e, 0x5,0x25,0x6c, 0x6,0x2a,0x6f, 0xf,0x26,0x5b, 0x5,0x25,0x6d, 0x4,0x28,0x77, 0x6,0x30,0x3a, 0x6,0x30,0x3f, 0x4,0x28,0x7a, 0x4,0x28,0x76, 0x5,0x28,0x75, 0x6,0x30,0x3e, 0x6,0x30,0x3d, 0x6,0x30,0x3c, 0x6,0x30,0x3b, 0xf,0x2a,0x40, 0xf,0x2a,0x41, 0xf,0x2a,0x42, 0xf,0x2a,0x43, 0xf,0x2a,0x44, 0xf,0x2a,0x3f, 0x6,0x30,0x40, 0x5,0x28,0x74, 0x6,0x36,0x72, 0x4,0x2c,0x50, 0x6,0x36,0x6f, 0x4,0x2c,0x4f, 0x6,0x3e,0x67, 0x6,0x36,0x70, 0x6,0x36,0x6e, 0xf,0x2f,0x23, 0xf,0x2f,0x24, 0xf,0x2f,0x26, 0xf,0x2f,0x27, 0xf,0x2f,0x28, 0x5,0x2d,0x26, 0x5,0x2d,0x27, 0x6,0x36,0x71, 0x6,0x36,0x73, 0x5,0x2d,0x25, 0x6,0x36,0x74, 0x6,0x3e,0x6d, 0x6,0x3e,0x69, 0x5,0x31,0x78, 0x5,0x31,0x7a, 0x5,0x31,0x77, 0x5,0x31,0x79, 0x5,0x31,0x76, 0x5,0x31,0x7b, 0x6,0x3e,0x70, 0x6,0x3e,0x6a, 0xf,0x34,0x31, 0xf,0x34,0x32, 0xf,0x34,0x35, 0xf,0x34,0x36, 0xf,0x34,0x37, 0xf,0x34,0x38, 0xf,0x34,0x39, 0xf,0x34,0x3a, 0x6,0x3e,0x68, 0x6,0x3e,0x6c, 0x6,0x3e,0x6f, 0x6,0x3e,0x6e, 0xf,0x34,0x33, 0x6,0x48,0x23, 0x6,0x48,0x24, 0x6,0x48,0x22, 0x4,0x37,0x2c, 0x6,0x47,0x7e, 0x6,0x47,0x7a, 0x5,0x37,0x64, 0x4,0x37,0x2d, 0x5,0x37,0x65, 0x6,0x47,0x79, 0x6,0x47,0x78, 0x6,0x48,0x25, 0x6,0x48,0x21, 0x6,0x48,0x26, 0x6,0x47,0x7c, 0xf,0x3a,0x52, 0xf,0x3a,0x53, 0xf,0x3a,0x54, 0x6,0x47,0x7d, 0x4,0x37,0x2e, 0x6,0x52,0x23, 0x5,0x3e,0x69, 0x5,0x3e,0x67, 0x6,0x52,0x26, 0x5,0x3e,0x68, 0x6,0x52,0x25, 0x6,0x52,0x29, 0x6,0x52,0x21, 0x6,0x51,0x7e, 0x6,0x52,0x27, 0x6,0x52,0x24, 0xf,0x41,0x30, 0xf,0x41,0x31, 0xf,0x41,0x32, 0x6,0x52,0x22, 0x6,0x52,0x28, 0x5,0x3e,0x66, 0x4,0x42,0x7c, 0x4,0x42,0x7e, 0x4,0x42,0x7b, 0x6,0x5c,0x38, 0x6,0x5c,0x36, 0x6,0x5c,0x37, 0xf,0x47,0x5d, 0x6,0x5c,0x39, 0x5,0x45,0x42, 0x7,0x22,0x40, 0x5,0x4c,0x66, 0xf,0x4e,0x52, 0xf,0x4e,0x53, 0xf,0x4e,0x54, 0xf,0x4e,0x55, 0xf,0x4e,0x56, 0x5,0x4c,0x65, 0x5,0x4c,0x64, 0x7,0x2d,0x40, 0x7,0x2d,0x3f, 0x7,0x22,0x3f, 0xf,0x54,0x39, 0x7,0x30,0x2d, 0x7,0x37,0x5e, 0x7,0x3f,0x43, 0x4,0x5f,0x58, 0x5,0x67,0x62, 0xf,0x65,0x27, 0xf,0x65,0x28, 0x5,0x6b,0x7d, 0xf,0x67,0x51, 0x5,0x73,0x3a, 0x5,0x21,0x30, 0x6,0x21,0x6c, 0x6,0x22,0x6d, 0x6,0x24,0x54, 0x6,0x24,0x53, 0x6,0x24,0x52, 0x5,0x22,0x4f, 0x4,0x23,0x75, 0x6,0x27,0x2a, 0x4,0x26,0x2d, 0x6,0x2a,0x71, 0x6,0x2a,0x70, 0x5,0x28,0x77, 0x6,0x30,0x42, 0x6,0x30,0x43, 0x5,0x28,0x76, 0x6,0x30,0x44, 0x6,0x36,0x77, 0x6,0x36,0x78, 0x6,0x36,0x76, 0x6,0x35,0x28, 0x6,0x36,0x75, 0x6,0x3e,0x71, 0x6,0x3e,0x72, 0x6,0x48,0x28, 0x5,0x37,0x67, 0x6,0x48,0x29, 0x6,0x48,0x27, 0xf,0x3a,0x55, 0x6,0x52,0x2a, 0x6,0x5c,0x3a, 0x7,0x22,0x41, 0x7,0x2d,0x41, 0x7,0x22,0x42, 0x7,0x22,0x43, 0x7,0x53,0x30, 0x7,0x5e,0x5d, 0x5,0x21,0x45, 0x5,0x21,0x46, 0x6,0x22,0x70, 0x6,0x22,0x6e, 0x6,0x22,0x72, 0x6,0x22,0x71, 0xf,0x21,0x5c, 0xf,0x21,0x5d, 0xf,0x21,0x5e, 0x6,0x22,0x73, 0x5,0x21,0x66, 0x6,0x22,0x6f, 0x6,0x24,0x57, 0x6,0x24,0x55, 0x6,0x24,0x59, 0x3,0x23,0x59, 0xf,0x22,0x45, 0xf,0x22,0x46, 0x6,0x24,0x56, 0x5,0x22,0x53, 0x6,0x24,0x5a, 0x6,0x24,0x58, 0x5,0x22,0x52, 0x6,0x27,0x2e, 0x5,0x23,0x71, 0x5,0x23,0x78, 0x5,0x23,0x79, 0x6,0x27,0x30, 0x5,0x23,0x76, 0x5,0x23,0x75, 0x5,0x23,0x77, 0x5,0x23,0x72, 0x5,0x23,0x73, 0x6,0x27,0x31, 0x6,0x27,0x2c, 0x6,0x27,0x32, 0xf,0x23,0x76, 0xf,0x23,0x77, 0xf,0x23,0x79, 0xf,0x23,0x7a, 0xf,0x23,0x7b, 0xf,0x23,0x7e, 0xf,0x24,0x21, 0x6,0x27,0x2d, 0x6,0x27,0x2f, 0x4,0x23,0x7d, 0xf,0x23,0x7d, 0x6,0x27,0x34, 0x6,0x27,0x33, 0x4,0x23,0x7c, 0x6,0x27,0x2b, 0x5,0x23,0x7a, 0x4,0x26,0x30, 0x5,0x25,0x75, 0x6,0x2a,0x75, 0x4,0x26,0x33, 0x6,0x2a,0x72, 0x5,0x25,0x73, 0x5,0x25,0x74, 0x6,0x2a,0x7a, 0x5,0x25,0x71, 0x6,0x2a,0x77, 0x6,0x2a,0x7c, 0x5,0x25,0x6f, 0x6,0x2a,0x79, 0x5,0x25,0x72, 0x5,0x25,0x70, 0x6,0x2a,0x74, 0x6,0x27,0x35, 0xf,0x26,0x5c, 0xf,0x26,0x5d, 0xf,0x26,0x5e, 0xf,0x26,0x5f, 0xf,0x26,0x60, 0xf,0x26,0x61, 0xf,0x26,0x63, 0xf,0x26,0x64, 0xf,0x26,0x65, 0xf,0x26,0x66, 0xf,0x26,0x67, 0xf,0x26,0x68, 0x6,0x2a,0x78, 0x6,0x2d,0x2b, 0x6,0x2a,0x73, 0x5,0x25,0x76, 0x6,0x30,0x50, 0x6,0x30,0x4a, 0x5,0x28,0x78, 0x6,0x30,0x4b, 0x5,0x28,0x79, 0x4,0x28,0x7e, 0x5,0x28,0x7a, 0x6,0x30,0x46, 0x6,0x30,0x49, 0x6,0x30,0x52, 0xf,0x2a,0x45, 0xf,0x2a,0x47, 0xf,0x2a,0x48, 0xf,0x2a,0x4b, 0xf,0x2a,0x4c, 0xf,0x2a,0x4d, 0xf,0x2a,0x4e, 0xf,0x2a,0x4f, 0xf,0x2a,0x50, 0xf,0x2a,0x51, 0x6,0x30,0x4d, 0x6,0x30,0x45, 0x6,0x30,0x47, 0x6,0x30,0x51, 0x6,0x30,0x4f, 0x6,0x30,0x4c, 0xf,0x2a,0x4a, 0xf,0x2a,0x46, 0x6,0x30,0x48, 0x5,0x28,0x7b, 0x4,0x28,0x7c, 0x5,0x2d,0x2c, 0x5,0x2d,0x29, 0x4,0x2c,0x52, 0x4,0x2c,0x59, 0x5,0x2d,0x2a, 0x6,0x37,0x21, 0x4,0x2c,0x58, 0x5,0x2d,0x34, 0x5,0x2d,0x30, 0x5,0x2d,0x2b, 0x6,0x36,0x7d, 0x5,0x2d,0x31, 0x5,0x2d,0x2d, 0x5,0x2d,0x2f, 0x6,0x37,0x24, 0x6,0x36,0x7e, 0x4,0x2c,0x62, 0x6,0x36,0x79, 0x4,0x2c,0x63, 0x4,0x2c,0x56, 0x6,0x37,0x25, 0x6,0x37,0x22, 0x6,0x37,0x23, 0x6,0x36,0x7b, 0xf,0x2f,0x29, 0xf,0x2f,0x2a, 0xf,0x2f,0x2b, 0xf,0x2f,0x2c, 0xf,0x2f,0x2d, 0xf,0x2f,0x2e, 0xf,0x2f,0x2f, 0xf,0x2f,0x31, 0xf,0x2f,0x33, 0x5,0x2d,0x28, 0xf,0x2f,0x30, 0xf,0x2f,0x32, 0x5,0x2d,0x33, 0x4,0x2c,0x5d, 0x5,0x2d,0x35, 0x5,0x2d,0x36, 0x5,0x2d,0x32, 0x6,0x3b,0x4e, 0x4,0x31,0x3a, 0x6,0x3f,0x2b, 0x6,0x3f,0x24, 0x6,0x3f,0x26, 0x4,0x31,0x3c, 0x4,0x31,0x3e, 0x5,0x31,0x7e, 0x6,0x3e,0x79, 0x6,0x3f,0x22, 0x6,0x3e,0x7b, 0x5,0x32,0x28, 0x4,0x31,0x38, 0x6,0x3f,0x27, 0x6,0x3f,0x2c, 0x6,0x3f,0x29, 0x6,0x3e,0x74, 0x6,0x3f,0x2a, 0x4,0x31,0x40, 0x4,0x31,0x3b, 0x5,0x31,0x7c, 0x5,0x32,0x26, 0x6,0x3e,0x73, 0x4,0x31,0x36, 0x5,0x31,0x7d, 0x5,0x32,0x24, 0x6,0x3f,0x28, 0x6,0x3f,0x23, 0xf,0x34,0x3b, 0xf,0x34,0x3c, 0xf,0x34,0x3d, 0xf,0x34,0x3e, 0xf,0x34,0x40, 0xf,0x34,0x41, 0xf,0x34,0x42, 0xf,0x34,0x43, 0xf,0x34,0x44, 0xf,0x34,0x46, 0xf,0x34,0x47, 0xf,0x34,0x48, 0x6,0x3e,0x77, 0x6,0x32,0x2a, 0x6,0x3e,0x7d, 0x6,0x3e,0x7c, 0x6,0x3e,0x7e, 0x6,0x3f,0x21, 0x6,0x3f,0x25, 0x4,0x31,0x3f, 0x5,0x32,0x29, 0x5,0x32,0x21, 0x5,0x32,0x27, 0x5,0x32,0x23, 0x5,0x32,0x22, 0x5,0x32,0x25, 0x5,0x32,0x2a, 0x5,0x37,0x69, 0x6,0x48,0x33, 0x5,0x37,0x6e, 0x6,0x48,0x2a, 0x6,0x48,0x34, 0x5,0x37,0x6f, 0x5,0x37,0x6c, 0x5,0x37,0x6b, 0x4,0x37,0x30, 0x5,0x37,0x70, 0x5,0x37,0x6a, 0x5,0x37,0x71, 0x5,0x37,0x72, 0x5,0x37,0x74, 0x6,0x48,0x2e, 0x6,0x3e,0x7a, 0x4,0x37,0x31, 0x6,0x48,0x2f, 0x5,0x37,0x6d, 0x4,0x37,0x33, 0x5,0x37,0x68, 0x5,0x37,0x73, 0xf,0x3a,0x56, 0xf,0x3a,0x58, 0xf,0x3a,0x59, 0xf,0x3a,0x5a, 0xf,0x3a,0x5b, 0x6,0x48,0x2d, 0x5,0x37,0x75, 0x6,0x48,0x32, 0x6,0x48,0x2c, 0x6,0x48,0x31, 0x6,0x48,0x30, 0xf,0x3a,0x5c, 0x5,0x3e,0x70, 0x6,0x52,0x2d, 0x5,0x3e,0x6c, 0x4,0x3c,0x7a, 0x5,0x3e,0x71, 0x6,0x52,0x2e, 0x6,0x5c,0x3b, 0x4,0x3c,0x7d, 0x6,0x52,0x35, 0x5,0x3e,0x6a, 0x5,0x3e,0x73, 0x6,0x52,0x2b, 0x5,0x3e,0x6f, 0x6,0x52,0x2c, 0x6,0x52,0x39, 0x6,0x52,0x30, 0x6,0x52,0x38, 0x5,0x3e,0x6e, 0x6,0x52,0x36, 0x6,0x5c,0x40, 0xf,0x41,0x37, 0x5,0x3e,0x72, 0xf,0x41,0x33, 0xf,0x41,0x34, 0xf,0x41,0x36, 0xf,0x41,0x38, 0xf,0x41,0x39, 0x6,0x52,0x3a, 0x6,0x52,0x32, 0x6,0x52,0x37, 0x5,0x3e,0x6b, 0xf,0x41,0x35, 0x6,0x52,0x2f, 0x5,0x45,0x43, 0x5,0x45,0x4b, 0x5,0x45,0x49, 0x6,0x5c,0x41, 0x6,0x5c,0x3c, 0x4,0x43,0x2b, 0x4,0x43,0x26, 0x4,0x43,0x25, 0x5,0x45,0x44, 0x5,0x45,0x48, 0x5,0x45,0x47, 0x5,0x45,0x4a, 0x5,0x45,0x4e, 0x6,0x5c,0x3e, 0x6,0x5c,0x47, 0x5,0x45,0x4d, 0x5,0x45,0x45, 0x5,0x45,0x46, 0x6,0x5c,0x42, 0x4,0x43,0x29, 0x6,0x5c,0x46, 0x4,0x43,0x27, 0x4,0x43,0x23, 0x5,0x45,0x4c, 0x6,0x5c,0x45, 0x6,0x5c,0x43, 0x6,0x5c,0x3f, 0x4,0x43,0x28, 0xf,0x47,0x5e, 0xf,0x47,0x5f, 0xf,0x47,0x60, 0xf,0x47,0x61, 0x6,0x52,0x31, 0x4,0x49,0x4e, 0x7,0x22,0x49, 0x4,0x49,0x52, 0x7,0x22,0x45, 0x5,0x4c,0x69, 0x7,0x22,0x50, 0x7,0x22,0x4a, 0x5,0x4c,0x6e, 0x5,0x4c,0x67, 0x7,0x22,0x47, 0x7,0x22,0x51, 0x5,0x4c,0x6f, 0x7,0x22,0x4f, 0x7,0x22,0x4c, 0x7,0x22,0x4d, 0x5,0x4c,0x70, 0x5,0x4c,0x6a, 0x5,0x4c,0x6d, 0x7,0x2d,0x44, 0x7,0x22,0x46, 0xf,0x4e,0x57, 0xf,0x4e,0x58, 0xf,0x4e,0x59, 0xf,0x4e,0x5b, 0xf,0x4e,0x5c, 0x7,0x22,0x44, 0x7,0x22,0x4b, 0x7,0x22,0x4e, 0x5,0x4c,0x6b, 0x7,0x22,0x48, 0x4,0x49,0x51, 0x5,0x54,0x33, 0x4,0x50,0x23, 0x7,0x2d,0x4a, 0x4,0x50,0x24, 0x5,0x54,0x35, 0x7,0x2d,0x42, 0x5,0x54,0x38, 0x5,0x54,0x34, 0x5,0x54,0x31, 0x7,0x2d,0x47, 0x7,0x2d,0x43, 0x5,0x5b,0x39, 0x5,0x54,0x32, 0xf,0x54,0x3a, 0xf,0x54,0x3b, 0xf,0x54,0x3c, 0x7,0x2d,0x45, 0x7,0x2d,0x49, 0x7,0x2d,0x48, 0x7,0x2d,0x4b, 0x7,0x2d,0x46, 0x7,0x2d,0x4d, 0x5,0x54,0x37, 0x4,0x56,0x29, 0x5,0x5b,0x3b, 0x5,0x61,0x55, 0x7,0x37,0x60, 0x5,0x5b,0x3f, 0x7,0x37,0x66, 0x5,0x5b,0x3a, 0x7,0x37,0x62, 0x7,0x37,0x64, 0x7,0x37,0x61, 0x5,0x5b,0x3d, 0x7,0x37,0x5f, 0x7,0x37,0x65, 0xf,0x59,0x79, 0xf,0x59,0x7a, 0xf,0x59,0x7b, 0x4,0x56,0x2a, 0x7,0x37,0x63, 0x7,0x37,0x67, 0x7,0x39,0x27, 0x5,0x5b,0x40, 0x7,0x46,0x5a, 0x5,0x61,0x54, 0x7,0x3f,0x47, 0x4,0x5a,0x7e, 0x5,0x61,0x51, 0x5,0x61,0x52, 0x7,0x3f,0x49, 0xf,0x5e,0x59, 0x5,0x61,0x53, 0x7,0x3f,0x46, 0xf,0x5e,0x58, 0x7,0x3f,0x45, 0x7,0x3f,0x48, 0x5,0x61,0x56, 0x5,0x61,0x57, 0x7,0x46,0x5c, 0x4,0x5f,0x5b, 0x7,0x46,0x5e, 0x5,0x67,0x65, 0x4,0x5f,0x59, 0x7,0x46,0x5d, 0x7,0x46,0x5f, 0x7,0x46,0x60, 0xf,0x62,0x30, 0xf,0x62,0x31, 0xf,0x62,0x32, 0x7,0x46,0x61, 0x7,0x46,0x62, 0x7,0x46,0x5b, 0x4,0x63,0x38, 0x7,0x4d,0x55, 0x4,0x63,0x37, 0x5,0x6b,0x7e, 0x7,0x4d,0x57, 0xf,0x65,0x29, 0x7,0x4d,0x56, 0x5,0x5b,0x3e, 0x5,0x6f,0x78, 0x5,0x6f,0x7a, 0x5,0x6f,0x79, 0x7,0x53,0x32, 0x7,0x53,0x31, 0x5,0x73,0x3b, 0x4,0x68,0x69, 0x4,0x68,0x6a, 0x7,0x57,0x67, 0x7,0x57,0x69, 0x7,0x57,0x68, 0x7,0x57,0x6a, 0x5,0x73,0x3c, 0x7,0x5e,0x5e, 0x4,0x6b,0x6a, 0x4,0x6b,0x69, 0x7,0x5e,0x60, 0x5,0x77,0x58, 0x7,0x5e,0x5f, 0x5,0x79,0x27, 0xf,0x6c,0x26, 0x5,0x7a,0x28, 0x5,0x7a,0x66, 0x5,0x7b,0x3c, 0x7,0x63,0x4f, 0x5,0x7c,0x34, 0x6,0x21,0x6d, 0x4,0x21,0x25, 0x4,0x22,0x62, 0x5,0x22,0x54, 0x6,0x24,0x5b, 0x6,0x24,0x5c, 0x5,0x22,0x55, 0x6,0x23,0x7e, 0x4,0x23,0x7e, 0x5,0x23,0x7b, 0x6,0x2a,0x7d, 0xf,0x26,0x6a, 0xf,0x26,0x69, 0x6,0x30,0x55, 0x6,0x30,0x54, 0x6,0x30,0x56, 0x6,0x30,0x53, 0x6,0x37,0x26, 0x5,0x32,0x2b, 0x4,0x31,0x41, 0x6,0x3f,0x2d, 0x5,0x37,0x76, 0x6,0x5c,0x48, 0x7,0x22,0x52, 0x5,0x54,0x39, 0xf,0x4e,0x5d, 0xf,0x54,0x3d, 0x7,0x37,0x68, 0x7,0x3f,0x4a, 0x7,0x46,0x63, 0x5,0x67,0x66, 0x7,0x5e,0x61, 0x7,0x65,0x35, 0x6,0x21,0x6f, 0x6,0x21,0x71, 0x6,0x21,0x70, 0xf,0x21,0x3b, 0x5,0x21,0x68, 0x5,0x21,0x67, 0x5,0x23,0x7c, 0x6,0x27,0x37, 0xf,0x26,0x6b, 0x6,0x30,0x57, 0x6,0x37,0x28, 0xf,0x2f,0x34, 0x6,0x3f,0x2e, 0xf,0x3a,0x5e, 0x7,0x22,0x53, 0x7,0x46,0x64, 0x6,0x22,0x74, 0x5,0x22,0x56, 0x6,0x2a,0x7e, 0x6,0x30,0x59, 0x6,0x30,0x58, 0x4,0x2c,0x65, 0x6,0x3f,0x2f, 0x5,0x35,0x5f, 0x5,0x32,0x2d, 0x6,0x3f,0x30, 0x5,0x32,0x2c, 0x6,0x48,0x36, 0xf,0x3a,0x5f, 0xf,0x3a,0x60, 0xf,0x3a,0x61, 0x7,0x22,0x54, 0x7,0x3f,0x4b, 0x4,0x21,0x77, 0x6,0x22,0x75, 0x6,0x22,0x76, 0x5,0x22,0x59, 0x5,0x22,0x58, 0x4,0x22,0x64, 0x5,0x22,0x5b, 0x6,0x24,0x61, 0x6,0x24,0x60, 0x6,0x24,0x5e, 0xf,0x22,0x48, 0xf,0x22,0x4a, 0x5,0x22,0x57, 0x6,0x24,0x5f, 0x5,0x22,0x5a, 0x6,0x27,0x41, 0x6,0x27,0x3b, 0x5,0x24,0x22, 0x6,0x27,0x38, 0x5,0x23,0x7e, 0x5,0x23,0x7d, 0x5,0x24,0x23, 0x6,0x27,0x40, 0x5,0x24,0x24, 0x6,0x27,0x3c, 0x6,0x27,0x3f, 0x5,0x24,0x21, 0xf,0x24,0x24, 0x6,0x27,0x39, 0x6,0x27,0x3a, 0x6,0x27,0x3d, 0x5,0x24,0x25, 0x6,0x27,0x3e, 0x5,0x25,0x7b, 0x4,0x26,0x35, 0x5,0x25,0x79, 0x5,0x25,0x7d, 0x5,0x25,0x7a, 0x5,0x25,0x7c, 0x5,0x26,0x21, 0x6,0x2b,0x23, 0x5,0x25,0x7e, 0x5,0x26,0x22, 0x6,0x2b,0x22, 0xf,0x26,0x6c, 0x5,0x26,0x23, 0x6,0x2b,0x21, 0x5,0x25,0x77, 0x5,0x25,0x78, 0x5,0x28,0x7e, 0x6,0x30,0x62, 0x5,0x28,0x7d, 0x5,0x29,0x22, 0x5,0x28,0x7c, 0x5,0x29,0x23, 0x6,0x30,0x5f, 0x5,0x29,0x25, 0x5,0x29,0x24, 0x6,0x30,0x5b, 0x5,0x29,0x21, 0x6,0x30,0x5a, 0x6,0x30,0x65, 0x6,0x30,0x67, 0xf,0x2a,0x53, 0xf,0x2a,0x54, 0xf,0x2a,0x55, 0x4,0x29,0x26, 0x6,0x30,0x61, 0x6,0x30,0x60, 0x6,0x30,0x5c, 0x6,0x30,0x5d, 0x6,0x30,0x66, 0x6,0x30,0x64, 0x6,0x30,0x5e, 0x5,0x2d,0x38, 0x6,0x37,0x32, 0x5,0x2d,0x37, 0x6,0x37,0x2e, 0x5,0x2d,0x39, 0x5,0x32,0x2e, 0x6,0x37,0x2a, 0x4,0x2c,0x69, 0x4,0x2c,0x6a, 0x6,0x37,0x2f, 0x5,0x2d,0x3a, 0x6,0x37,0x2d, 0x6,0x37,0x31, 0x6,0x37,0x30, 0x4,0x2c,0x67, 0x6,0x37,0x33, 0x6,0x37,0x34, 0xf,0x2f,0x36, 0xf,0x2f,0x35, 0x6,0x37,0x29, 0x6,0x37,0x2b, 0x6,0x3f,0x35, 0x5,0x32,0x35, 0x4,0x31,0x46, 0x4,0x31,0x43, 0x4,0x31,0x44, 0x5,0x32,0x33, 0x5,0x32,0x2f, 0x6,0x3f,0x3a, 0x5,0x32,0x30, 0x5,0x32,0x34, 0x6,0x3f,0x3c, 0x5,0x32,0x31, 0x5,0x32,0x36, 0x6,0x3f,0x36, 0x6,0x3f,0x3b, 0x6,0x3f,0x32, 0x5,0x32,0x32, 0x6,0x3f,0x34, 0xf,0x34,0x49, 0xf,0x34,0x4a, 0xf,0x34,0x4b, 0xf,0x34,0x4c, 0x6,0x3f,0x39, 0x6,0x3f,0x31, 0x6,0x3f,0x3d, 0x6,0x3f,0x37, 0x6,0x3f,0x33, 0x6,0x48,0x39, 0x4,0x37,0x3e, 0x6,0x48,0x3e, 0x5,0x37,0x79, 0x5,0x37,0x7a, 0x4,0x37,0x38, 0x5,0x37,0x78, 0x6,0x48,0x3a, 0x4,0x37,0x37, 0x5,0x38,0x21, 0x5,0x38,0x22, 0x6,0x3f,0x38, 0x6,0x48,0x40, 0x6,0x48,0x3d, 0x6,0x48,0x3b, 0x5,0x37,0x7d, 0x6,0x48,0x38, 0xf,0x3a,0x62, 0xf,0x3a,0x63, 0x6,0x48,0x3f, 0x5,0x37,0x7b, 0x5,0x37,0x77, 0x6,0x48,0x41, 0x5,0x37,0x7e, 0xf,0x40,0x2b, 0x5,0x3e,0x78, 0x4,0x3d,0x22, 0x5,0x45,0x52, 0x4,0x3d,0x25, 0x5,0x3e,0x75, 0x5,0x3e,0x74, 0x4,0x3d,0x24, 0x5,0x3e,0x77, 0x5,0x3e,0x7a, 0x6,0x52,0x3e, 0x6,0x52,0x3b, 0x6,0x52,0x3d, 0x6,0x5c,0x4b, 0x5,0x3e,0x7b, 0x6,0x52,0x3c, 0x5,0x3e,0x76, 0x5,0x3e,0x79, 0x6,0x5c,0x4c, 0x6,0x5c,0x4d, 0x5,0x45,0x58, 0x4,0x43,0x34, 0x5,0x45,0x4f, 0x5,0x45,0x55, 0x6,0x5c,0x4a, 0x5,0x45,0x54, 0x5,0x45,0x57, 0xf,0x47,0x62, 0x5,0x45,0x59, 0x5,0x45,0x50, 0x5,0x45,0x56, 0x5,0x45,0x51, 0x7,0x22,0x57, 0x7,0x22,0x59, 0x5,0x4c,0x74, 0x5,0x4c,0x73, 0x5,0x4c,0x75, 0x4,0x49,0x57, 0x5,0x4c,0x76, 0x5,0x4c,0x78, 0x4,0x49,0x56, 0x7,0x22,0x56, 0x7,0x22,0x55, 0x7,0x22,0x58, 0x5,0x4c,0x77, 0x5,0x4c,0x79, 0x5,0x4c,0x72, 0x7,0x2d,0x50, 0x5,0x54,0x3e, 0x7,0x2d,0x52, 0x7,0x2d,0x58, 0x5,0x54,0x3d, 0x4,0x50,0x28, 0x7,0x2d,0x57, 0x7,0x2d,0x56, 0x5,0x54,0x3b, 0x7,0x2d,0x51, 0x5,0x54,0x3c, 0x7,0x2d,0x54, 0x5,0x54,0x3f, 0x7,0x2d,0x4f, 0x4,0x50,0x2a, 0x5,0x5b,0x41, 0x5,0x5b,0x42, 0x4,0x56,0x2c, 0x7,0x37,0x6b, 0xf,0x59,0x7c, 0x7,0x37,0x69, 0x7,0x37,0x6a, 0x5,0x61,0x5a, 0x5,0x61,0x59, 0x5,0x61,0x58, 0x7,0x46,0x66, 0x4,0x5f,0x5d, 0x5,0x67,0x67, 0x4,0x5f,0x5c, 0x7,0x46,0x65, 0x7,0x46,0x67, 0x5,0x67,0x68, 0xf,0x62,0x33, 0x7,0x4d,0x58, 0x5,0x6c,0x21, 0x7,0x53,0x33, 0x7,0x57,0x6c, 0x5,0x6f,0x7b, 0x5,0x73,0x3d, 0x7,0x57,0x6b, 0x7,0x5e,0x62, 0x7,0x5e,0x63, 0x5,0x77,0x59, 0x7,0x63,0x50, 0x7,0x63,0x75, 0x4,0x21,0x78, 0x6,0x27,0x42, 0x5,0x24,0x26, 0x4,0x24,0x26, 0x6,0x2b,0x24, 0xf,0x26,0x6d, 0xf,0x26,0x6e, 0x6,0x30,0x69, 0x6,0x30,0x68, 0xf,0x2a,0x56, 0x6,0x37,0x35, 0x5,0x32,0x37, 0x6,0x48,0x42, 0x5,0x38,0x23, 0x6,0x52,0x3f, 0x5,0x45,0x5a, 0xf,0x47,0x64, 0x7,0x4d,0x59, 0xf,0x6a,0x4e, 0x6,0x21,0x72, 0x6,0x21,0x73, 0x6,0x22,0x78, 0x5,0x21,0x69, 0x6,0x22,0x77, 0xf,0x21,0x62, 0x4,0x22,0x67, 0x4,0x24,0x27, 0x5,0x24,0x27, 0xf,0x24,0x26, 0x6,0x29,0x5e, 0x6,0x2b,0x25, 0x5,0x26,0x24, 0x5,0x26,0x25, 0x6,0x30,0x6a, 0x6,0x30,0x41, 0x4,0x2f,0x27, 0x6,0x37,0x36, 0x4,0x31,0x4a, 0x6,0x48,0x43, 0x5,0x3e,0x7c, 0x5,0x45,0x5b, 0x7,0x22,0x5b, 0xf,0x47,0x65, 0x6,0x5c,0x4e, 0xf,0x4e,0x5f, 0x7,0x22,0x5c, 0x7,0x22,0x5d, 0x4,0x56,0x26, 0x7,0x57,0x6d, 0x4,0x22,0x68, 0x5,0x22,0x5e, 0x6,0x24,0x64, 0x5,0x22,0x5d, 0x6,0x24,0x63, 0x6,0x24,0x62, 0x6,0x24,0x66, 0x4,0x22,0x69, 0x6,0x24,0x65, 0x6,0x27,0x45, 0x5,0x24,0x2a, 0x5,0x24,0x2c, 0x5,0x24,0x2b, 0x5,0x24,0x28, 0x5,0x24,0x29, 0x6,0x27,0x44, 0x6,0x27,0x48, 0x6,0x2b,0x28, 0x6,0x27,0x43, 0x6,0x27,0x46, 0x5,0x24,0x2d, 0x5,0x26,0x2c, 0x5,0x26,0x28, 0x5,0x26,0x27, 0x5,0x26,0x2b, 0x5,0x26,0x2a, 0x4,0x26,0x39, 0x6,0x2b,0x26, 0x6,0x2b,0x29, 0x6,0x2b,0x27, 0x4,0x26,0x3e, 0x6,0x2b,0x2a, 0xf,0x26,0x70, 0xf,0x26,0x71, 0xf,0x26,0x72, 0xf,0x26,0x73, 0xf,0x26,0x74, 0x5,0x26,0x29, 0x5,0x26,0x2d, 0x6,0x2b,0x2b, 0x5,0x29,0x28, 0x5,0x29,0x2a, 0x4,0x29,0x27, 0x6,0x30,0x6c, 0x5,0x29,0x29, 0x6,0x30,0x6d, 0xf,0x2a,0x57, 0xf,0x2a,0x59, 0xf,0x2a,0x58, 0xf,0x2a,0x5a, 0xf,0x2a,0x5b, 0xf,0x2a,0x5c, 0x6,0x30,0x6b, 0x5,0x2d,0x3d, 0x5,0x2d,0x40, 0x5,0x2d,0x3e, 0x5,0x2d,0x41, 0x5,0x2d,0x3b, 0x6,0x37,0x3a, 0x6,0x37,0x3b, 0x4,0x2c,0x6e, 0x5,0x2d,0x42, 0x5,0x2d,0x3f, 0x6,0x37,0x3c, 0x5,0x2d,0x3c, 0x6,0x37,0x39, 0xf,0x2f,0x37, 0x6,0x37,0x37, 0x6,0x37,0x38, 0x5,0x2c,0x7b, 0x5,0x32,0x44, 0x5,0x32,0x3b, 0x5,0x32,0x39, 0x4,0x31,0x4d, 0x6,0x3f,0x43, 0x5,0x32,0x42, 0x6,0x3f,0x48, 0x6,0x3f,0x3e, 0x5,0x32,0x3d, 0x5,0x32,0x3c, 0x5,0x32,0x3f, 0x5,0x32,0x3e, 0x6,0x3f,0x3f, 0x6,0x3f,0x40, 0x5,0x32,0x41, 0x5,0x32,0x38, 0x4,0x31,0x50, 0x6,0x3f,0x44, 0x5,0x32,0x43, 0x5,0x38,0x28, 0x6,0x3f,0x41, 0xf,0x34,0x4d, 0xf,0x34,0x4e, 0xf,0x34,0x4f, 0xf,0x34,0x50, 0xf,0x34,0x51, 0xf,0x34,0x52, 0xf,0x34,0x53, 0x6,0x3f,0x47, 0x6,0x46,0x3d, 0x5,0x32,0x3a, 0x6,0x3f,0x42, 0x5,0x32,0x40, 0x6,0x48,0x4a, 0x4,0x31,0x4b, 0x5,0x38,0x2b, 0x5,0x38,0x2c, 0x5,0x38,0x2d, 0x6,0x48,0x4b, 0x6,0x48,0x4e, 0x5,0x38,0x27, 0x6,0x48,0x4d, 0x4,0x37,0x42, 0x5,0x38,0x2a, 0x5,0x38,0x26, 0x6,0x48,0x49, 0x4,0x37,0x43, 0x5,0x38,0x25, 0x6,0x52,0x44, 0x6,0x48,0x46, 0x6,0x48,0x47, 0x5,0x38,0x24, 0xf,0x3a,0x65, 0xf,0x3a,0x67, 0xf,0x3a,0x68, 0xf,0x3a,0x69, 0xf,0x3a,0x6a, 0x6,0x48,0x48, 0x6,0x48,0x4c, 0xf,0x3a,0x66, 0x4,0x3d,0x2b, 0x5,0x3f,0x25, 0x4,0x3d,0x2c, 0x6,0x52,0x41, 0x6,0x52,0x42, 0x5,0x3f,0x22, 0x5,0x3f,0x23, 0x6,0x52,0x47, 0x5,0x3e,0x7d, 0x6,0x52,0x45, 0xf,0x41,0x3a, 0xf,0x41,0x3b, 0xf,0x41,0x3c, 0x6,0x52,0x43, 0x6,0x52,0x48, 0x5,0x3f,0x24, 0x5,0x3e,0x7e, 0x6,0x52,0x46, 0x4,0x43,0x38, 0x5,0x45,0x5c, 0x4,0x43,0x37, 0x5,0x45,0x5e, 0x6,0x5c,0x50, 0x5,0x45,0x60, 0x5,0x45,0x5f, 0x6,0x5c,0x4f, 0xf,0x47,0x67, 0xf,0x47,0x68, 0xf,0x47,0x69, 0xf,0x47,0x6a, 0xf,0x47,0x6b, 0xf,0x47,0x6c, 0xf,0x47,0x6d, 0xf,0x47,0x6e, 0xf,0x47,0x6f, 0x6,0x5c,0x51, 0x6,0x60,0x31, 0xf,0x4a,0x54, 0x7,0x22,0x5e, 0x4,0x49,0x5a, 0x4,0x37,0x3f, 0x4,0x49,0x58, 0x5,0x4c,0x7a, 0x4,0x49,0x59, 0x7,0x2d,0x59, 0x7,0x22,0x62, 0x5,0x4c,0x7c, 0x5,0x4c,0x7e, 0xf,0x4e,0x60, 0xf,0x4e,0x62, 0xf,0x4e,0x63, 0x7,0x22,0x5f, 0x7,0x22,0x61, 0x7,0x22,0x63, 0x7,0x22,0x60, 0x5,0x4c,0x7b, 0x5,0x54,0x41, 0x5,0x4c,0x7d, 0x5,0x54,0x43, 0x5,0x54,0x40, 0x4,0x50,0x2d, 0x5,0x54,0x44, 0xf,0x54,0x3f, 0xf,0x54,0x40, 0xf,0x54,0x41, 0xf,0x54,0x42, 0x7,0x37,0x6e, 0x5,0x5b,0x44, 0x7,0x37,0x6c, 0x7,0x37,0x6d, 0xf,0x59,0x7e, 0xf,0x5a,0x21, 0xf,0x5a,0x22, 0xf,0x5a,0x23, 0x5,0x5b,0x43, 0x7,0x37,0x6f, 0x5,0x5b,0x45, 0x7,0x3f,0x51, 0x7,0x3f,0x4e, 0x5,0x61,0x5b, 0xf,0x5e,0x5a, 0xf,0x5e,0x5c, 0x7,0x3f,0x4d, 0x7,0x3f,0x4f, 0x7,0x3f,0x4c, 0xf,0x5e,0x5b, 0x7,0x3f,0x50, 0x7,0x46,0x68, 0x7,0x46,0x69, 0x5,0x61,0x5c, 0x5,0x67,0x69, 0xf,0x62,0x34, 0xf,0x62,0x35, 0xf,0x62,0x36, 0x5,0x67,0x6a, 0x5,0x6c,0x24, 0x5,0x6c,0x23, 0x7,0x4d,0x5d, 0x7,0x4d,0x5b, 0x5,0x6c,0x22, 0x7,0x4d,0x5a, 0x7,0x4d,0x5c, 0x7,0x4d,0x5e, 0x4,0x66,0x3c, 0x7,0x53,0x34, 0x7,0x53,0x61, 0x5,0x73,0x3e, 0x7,0x57,0x6e, 0x7,0x57,0x6f, 0x5,0x75,0x6a, 0xf,0x6a,0x4f, 0x7,0x5b,0x4d, 0x7,0x5e,0x64, 0x7,0x62,0x36, 0x5,0x7a,0x68, 0x5,0x7a,0x67, 0xf,0x6c,0x7b, 0xf,0x21,0x63, 0xf,0x22,0x4b, 0xf,0x22,0x4c, 0x6,0x2b,0x2c, 0xf,0x24,0x27, 0x6,0x2b,0x2d, 0x6,0x2b,0x2e, 0xf,0x2f,0x39, 0xf,0x2f,0x3b, 0xf,0x2f,0x3c, 0xf,0x2f,0x3a, 0x5,0x32,0x45, 0xf,0x34,0x54, 0x6,0x48,0x4f, 0xf,0x3a,0x6b, 0xf,0x3a,0x6c, 0x5,0x3f,0x26, 0x6,0x21,0x3f, 0x6,0x21,0x75, 0x6,0x22,0x79, 0x6,0x27,0x49, 0x4,0x24,0x2a, 0x6,0x30,0x70, 0x6,0x27,0x4d, 0xf,0x24,0x28, 0x6,0x27,0x4b, 0x6,0x27,0x4e, 0x4,0x26,0x3f, 0x6,0x2b,0x30, 0x5,0x26,0x2e, 0x6,0x2b,0x31, 0x3,0x2a,0x39, 0x4,0x27,0x41, 0x6,0x35,0x23, 0x6,0x30,0x72, 0x6,0x30,0x73, 0x6,0x30,0x71, 0x6,0x30,0x6f, 0x6,0x30,0x6e, 0x6,0x37,0x3f, 0x6,0x37,0x3e, 0x4,0x2c,0x6f, 0x6,0x37,0x3d, 0x6,0x37,0x40, 0x6,0x3f,0x49, 0x6,0x3f,0x4a, 0x6,0x3f,0x4b, 0x6,0x3f,0x4c, 0x6,0x3f,0x4d, 0x6,0x3f,0x4e, 0x4,0x37,0x44, 0x6,0x48,0x50, 0x6,0x48,0x54, 0x6,0x48,0x53, 0x6,0x48,0x51, 0xf,0x3a,0x6d, 0x6,0x48,0x52, 0x6,0x52,0x49, 0x5,0x3f,0x27, 0xf,0x41,0x3d, 0x6,0x5c,0x53, 0x6,0x5c,0x54, 0x6,0x5c,0x52, 0x5,0x45,0x61, 0x7,0x22,0x64, 0x7,0x2d,0x5a, 0x7,0x2d,0x5c, 0x4,0x50,0x2f, 0x5,0x54,0x45, 0x7,0x37,0x71, 0x7,0x37,0x70, 0x7,0x57,0x70, 0x7,0x63,0x51, 0x7,0x63,0x52, 0x7,0x65,0x36, 0x6,0x21,0x40, 0x6,0x21,0x76, 0xf,0x22,0x4d, 0x4,0x24,0x2b, 0x6,0x27,0x50, 0x6,0x27,0x4f, 0x5,0x24,0x2e, 0x6,0x2b,0x32, 0x6,0x30,0x76, 0x6,0x30,0x75, 0x6,0x30,0x77, 0x5,0x2e,0x68, 0x6,0x3f,0x4f, 0x5,0x38,0x2e, 0x6,0x52,0x4a, 0x6,0x5c,0x55, 0x7,0x22,0x65, 0x7,0x2d,0x5d, 0x5,0x21,0x2a, 0x5,0x21,0x47, 0x6,0x21,0x78, 0x6,0x21,0x7c, 0x6,0x21,0x77, 0x6,0x21,0x7a, 0x6,0x21,0x7b, 0x6,0x23,0x21, 0x6,0x23,0x22, 0x6,0x22,0x7c, 0x6,0x22,0x7a, 0x6,0x23,0x23, 0x6,0x22,0x7b, 0x6,0x22,0x7d, 0x6,0x22,0x7e, 0x5,0x21,0x6a, 0x5,0x22,0x60, 0x5,0x22,0x5f, 0x6,0x24,0x68, 0x6,0x24,0x69, 0x6,0x24,0x6a, 0x6,0x24,0x6b, 0x5,0x24,0x2f, 0x6,0x27,0x51, 0x5,0x24,0x31, 0x6,0x27,0x53, 0x5,0x24,0x30, 0xf,0x24,0x29, 0xf,0x24,0x2a, 0xf,0x24,0x2b, 0xf,0x24,0x2c, 0x6,0x27,0x52, 0x5,0x24,0x32, 0x5,0x26,0x2f, 0x6,0x2b,0x36, 0x6,0x2b,0x33, 0x6,0x2b,0x34, 0x6,0x2b,0x37, 0x6,0x2b,0x35, 0x6,0x30,0x7e, 0x5,0x29,0x2c, 0x6,0x30,0x7d, 0x4,0x29,0x30, 0x6,0x30,0x79, 0x5,0x29,0x2b, 0x6,0x30,0x78, 0x5,0x2d,0x44, 0x5,0x2d,0x43, 0x5,0x2d,0x45, 0x6,0x37,0x43, 0x6,0x37,0x41, 0x5,0x2d,0x46, 0xf,0x2f,0x3d, 0x6,0x37,0x42, 0x5,0x32,0x4a, 0x5,0x32,0x48, 0x5,0x32,0x49, 0x6,0x3f,0x56, 0x6,0x3f,0x50, 0x4,0x29,0x2f, 0x6,0x48,0x55, 0x6,0x3f,0x52, 0x6,0x3f,0x53, 0x5,0x32,0x47, 0x6,0x3f,0x51, 0xf,0x34,0x55, 0xf,0x34,0x56, 0xf,0x34,0x57, 0x6,0x3f,0x54, 0x6,0x3f,0x57, 0x6,0x3f,0x55, 0x6,0x48,0x56, 0x6,0x48,0x59, 0x5,0x38,0x2f, 0x5,0x38,0x32, 0x5,0x38,0x31, 0x6,0x48,0x5a, 0x5,0x38,0x30, 0x6,0x48,0x58, 0x6,0x48,0x57, 0x5,0x3f,0x28, 0x4,0x3d,0x31, 0x6,0x52,0x4b, 0xf,0x41,0x40, 0x6,0x52,0x4c, 0x5,0x45,0x62, 0x6,0x5c,0x56, 0x5,0x45,0x63, 0x6,0x5c,0x57, 0x6,0x5c,0x59, 0xf,0x47,0x70, 0x6,0x5c,0x5a, 0x6,0x5c,0x58, 0x5,0x4d,0x21, 0x5,0x4d,0x22, 0x4,0x49,0x60, 0x7,0x22,0x66, 0xf,0x4e,0x64, 0xf,0x4e,0x65, 0x7,0x22,0x67, 0x7,0x2d,0x5f, 0x5,0x54,0x46, 0x4,0x50,0x30, 0x7,0x2d,0x60, 0x7,0x2d,0x5e, 0x7,0x37,0x73, 0x7,0x37,0x72, 0x7,0x37,0x74, 0xf,0x5a,0x24, 0x4,0x5b,0x22, 0x5,0x61,0x5e, 0x7,0x3f,0x52, 0xf,0x5e,0x5d, 0x5,0x61,0x5d, 0x7,0x46,0x6d, 0x7,0x46,0x6b, 0x7,0x46,0x6f, 0x7,0x46,0x6a, 0x7,0x46,0x6c, 0x5,0x67,0x6b, 0x5,0x6c,0x25, 0x7,0x4d,0x5f, 0x4,0x5f,0x5f, 0x7,0x4d,0x61, 0x7,0x4d,0x60, 0x5,0x6c,0x26, 0x5,0x6f,0x7c, 0x5,0x6f,0x7d, 0x4,0x66,0x3d, 0x7,0x53,0x35, 0x5,0x73,0x3f, 0x7,0x60,0x3c, 0x7,0x60,0x6f, 0x7,0x64,0x46, 0x6,0x24,0x6e, 0x6,0x24,0x6c, 0x6,0x24,0x6d, 0x5,0x24,0x33, 0x6,0x31,0x21, 0x6,0x2b,0x38, 0x6,0x2d,0x32, 0x6,0x31,0x24, 0x6,0x37,0x44, 0x6,0x31,0x22, 0x6,0x31,0x23, 0x6,0x37,0x46, 0x6,0x37,0x45, 0x6,0x3f,0x58, 0x6,0x4f,0x21, 0x5,0x38,0x33, 0x6,0x48,0x5c, 0x6,0x48,0x5b, 0x5,0x3f,0x2a, 0x6,0x5c,0x5c, 0x6,0x5c,0x5f, 0x6,0x5c,0x5d, 0x6,0x5c,0x5b, 0x6,0x5c,0x5e, 0x7,0x2d,0x61, 0x7,0x2d,0x4e, 0x4,0x50,0x32, 0x7,0x37,0x75, 0x7,0x3f,0x55, 0x7,0x3f,0x54, 0x7,0x3f,0x53, 0x7,0x46,0x72, 0x7,0x46,0x70, 0x7,0x46,0x71, 0x7,0x57,0x71, 0x7,0x5b,0x4e, 0x7,0x62,0x37, 0x6,0x23,0x25, 0x6,0x23,0x24, 0xf,0x21,0x64, 0x6,0x24,0x71, 0x6,0x24,0x6f, 0xf,0x24,0x2d, 0x6,0x27,0x54, 0x5,0x26,0x30, 0x6,0x2b,0x3b, 0x6,0x2b,0x3a, 0x6,0x37,0x47, 0x4,0x2c,0x74, 0x4,0x2c,0x73, 0x5,0x35,0x60, 0x6,0x3f,0x5d, 0x6,0x3f,0x59, 0x6,0x3f,0x5a, 0xf,0x34,0x58, 0xf,0x34,0x59, 0xf,0x34,0x5a, 0x6,0x3f,0x5c, 0x6,0x3f,0x5b, 0x5,0x32,0x4b, 0x6,0x48,0x5d, 0x6,0x48,0x60, 0x6,0x48,0x5e, 0x6,0x48,0x5f, 0xf,0x3a,0x6e, 0x6,0x52,0x51, 0x6,0x52,0x4e, 0x6,0x52,0x50, 0x6,0x52,0x4f, 0xf,0x41,0x41, 0x4,0x43,0x3c, 0x6,0x5c,0x60, 0x7,0x22,0x6b, 0x7,0x22,0x6c, 0x7,0x22,0x69, 0x7,0x22,0x6a, 0x5,0x4d,0x23, 0x4,0x50,0x33, 0x5,0x54,0x47, 0x7,0x2d,0x64, 0x7,0x37,0x76, 0x7,0x3f,0x56, 0xf,0x67,0x54, 0x7,0x4d,0x62, 0x7,0x53,0x36, 0x5,0x73,0x41, 0xf,0x6c,0x27, 0x6,0x21,0x7d, 0x5,0x21,0x6b, 0x4,0x21,0x79, 0x5,0x22,0x61, 0x4,0x22,0x6e, 0x5,0x22,0x62, 0x5,0x24,0x34, 0x6,0x27,0x58, 0x5,0x24,0x35, 0x6,0x27,0x57, 0x6,0x27,0x59, 0x6,0x27,0x5b, 0x6,0x27,0x56, 0x5,0x24,0x36, 0x6,0x27,0x55, 0x6,0x27,0x5a, 0x5,0x26,0x33, 0x6,0x2b,0x3d, 0x5,0x26,0x31, 0x6,0x2b,0x3c, 0x5,0x26,0x32, 0x5,0x29,0x2d, 0x6,0x2b,0x3f, 0x4,0x29,0x33, 0x6,0x31,0x26, 0x5,0x29,0x30, 0x5,0x29,0x2e, 0x6,0x31,0x28, 0x5,0x29,0x32, 0x5,0x29,0x31, 0xf,0x2a,0x5e, 0x6,0x31,0x27, 0x6,0x37,0x4d, 0x4,0x2c,0x79, 0x4,0x2c,0x77, 0x4,0x2c,0x7c, 0x4,0x2c,0x75, 0x5,0x2d,0x4b, 0x5,0x2d,0x49, 0x4,0x2c,0x78, 0x4,0x2c,0x7a, 0x4,0x2c,0x76, 0x4,0x2c,0x7b, 0x5,0x2d,0x4a, 0x6,0x37,0x49, 0x6,0x37,0x4f, 0x6,0x37,0x4c, 0xf,0x2f,0x3f, 0xf,0x2f,0x40, 0x6,0x37,0x4b, 0x6,0x37,0x50, 0x6,0x37,0x4e, 0x6,0x37,0x4a, 0x4,0x31,0x56, 0x5,0x32,0x4f, 0x6,0x3f,0x68, 0x6,0x3f,0x61, 0x5,0x32,0x4c, 0x5,0x32,0x51, 0x5,0x32,0x4e, 0x6,0x3f,0x60, 0x5,0x32,0x50, 0x4,0x31,0x58, 0x6,0x3f,0x67, 0x6,0x3f,0x65, 0x6,0x3f,0x62, 0x4,0x31,0x59, 0x6,0x3f,0x66, 0x5,0x32,0x4d, 0x6,0x3f,0x64, 0x6,0x3f,0x5f, 0x6,0x3f,0x63, 0x6,0x48,0x64, 0xf,0x34,0x5c, 0x4,0x37,0x46, 0x5,0x38,0x36, 0x5,0x38,0x35, 0x5,0x38,0x3b, 0x5,0x38,0x3a, 0x5,0x38,0x37, 0x4,0x37,0x47, 0x6,0x48,0x61, 0x5,0x38,0x34, 0x6,0x48,0x63, 0x5,0x38,0x38, 0x4,0x31,0x55, 0xf,0x3a,0x70, 0x6,0x48,0x62, 0xf,0x3a,0x6f, 0x5,0x38,0x39, 0x5,0x3f,0x2c, 0x5,0x3f,0x2b, 0x6,0x52,0x52, 0x6,0x52,0x54, 0x6,0x52,0x57, 0x6,0x52,0x53, 0xf,0x41,0x42, 0xf,0x41,0x43, 0xf,0x41,0x44, 0xf,0x41,0x45, 0xf,0x41,0x46, 0xf,0x41,0x47, 0x6,0x52,0x55, 0x6,0x52,0x56, 0x6,0x56,0x6c, 0x5,0x3f,0x2d, 0x4,0x3d,0x32, 0x6,0x5c,0x66, 0x6,0x5c,0x63, 0x5,0x45,0x66, 0x6,0x5c,0x62, 0x4,0x43,0x3e, 0x5,0x45,0x65, 0x4,0x43,0x41, 0x4,0x43,0x40, 0x6,0x5c,0x61, 0x5,0x45,0x68, 0x5,0x45,0x6a, 0x5,0x45,0x64, 0x6,0x5c,0x68, 0x6,0x5c,0x69, 0x6,0x5c,0x6a, 0x5,0x45,0x67, 0x6,0x5c,0x64, 0xf,0x47,0x71, 0xf,0x47,0x72, 0xf,0x47,0x73, 0xf,0x47,0x74, 0xf,0x47,0x75, 0x6,0x5c,0x65, 0x4,0x49,0x64, 0x5,0x4d,0x24, 0x5,0x5b,0x48, 0x4,0x49,0x63, 0x4,0x49,0x62, 0x5,0x4d,0x25, 0x7,0x22,0x6d, 0x7,0x22,0x6f, 0xf,0x4e,0x66, 0xf,0x4e,0x67, 0x7,0x22,0x6e, 0x7,0x22,0x70, 0x7,0x2d,0x65, 0x5,0x54,0x48, 0x5,0x54,0x4a, 0x7,0x2d,0x67, 0x7,0x2d,0x66, 0xf,0x54,0x44, 0xf,0x54,0x45, 0x7,0x2d,0x68, 0x5,0x54,0x49, 0x5,0x5b,0x47, 0x7,0x37,0x77, 0x4,0x56,0x30, 0xf,0x5c,0x5f, 0x5,0x5b,0x46, 0x5,0x61,0x60, 0x7,0x3f,0x57, 0x5,0x61,0x5f, 0x7,0x3f,0x58, 0xf,0x5e,0x5e, 0x5,0x61,0x61, 0x7,0x46,0x73, 0x7,0x46,0x75, 0x7,0x46,0x76, 0x7,0x4d,0x22, 0x7,0x46,0x74, 0x5,0x6c,0x27, 0x4,0x63,0x3e, 0x4,0x63,0x3d, 0xf,0x65,0x2a, 0x7,0x4d,0x63, 0x7,0x53,0x37, 0x5,0x6f,0x7e, 0x7,0x57,0x72, 0x4,0x6a,0x47, 0x5,0x79,0x28, 0x5,0x21,0x31, 0x6,0x22,0x21, 0x4,0x22,0x6f, 0x5,0x21,0x6c, 0x6,0x23,0x26, 0xf,0x22,0x4f, 0x6,0x24,0x75, 0x5,0x22,0x63, 0x6,0x27,0x60, 0x5,0x22,0x69, 0x6,0x27,0x5d, 0x5,0x22,0x64, 0x6,0x24,0x73, 0x6,0x24,0x74, 0x5,0x22,0x65, 0x6,0x27,0x5c, 0x6,0x27,0x5e, 0x6,0x27,0x61, 0x6,0x24,0x72, 0x5,0x22,0x68, 0x5,0x24,0x37, 0x5,0x24,0x39, 0x4,0x26,0x45, 0x6,0x27,0x66, 0x6,0x27,0x64, 0x6,0x2b,0x46, 0x6,0x27,0x67, 0x6,0x2b,0x40, 0x6,0x27,0x62, 0x6,0x27,0x63, 0x6,0x2b,0x44, 0x6,0x27,0x65, 0x6,0x27,0x68, 0x3,0x25,0x7e, 0x6,0x27,0x69, 0x5,0x24,0x3a, 0xf,0x24,0x2e, 0xf,0x24,0x2f, 0xf,0x24,0x31, 0xf,0x24,0x32, 0xf,0x24,0x34, 0xf,0x24,0x35, 0xf,0x24,0x36, 0xf,0x26,0x77, 0xf,0x26,0x78, 0xf,0x26,0x79, 0xf,0x26,0x7a, 0xf,0x26,0x7b, 0xf,0x26,0x7d, 0xf,0x26,0x7e, 0xf,0x27,0x21, 0xf,0x26,0x7c, 0x6,0x2b,0x45, 0x6,0x2b,0x41, 0x6,0x2b,0x42, 0x4,0x24,0x2d, 0xf,0x24,0x30, 0x4,0x26,0x44, 0x5,0x26,0x34, 0x6,0x2b,0x43, 0x4,0x26,0x47, 0x6,0x2b,0x4c, 0x4,0x29,0x47, 0x6,0x31,0x2f, 0x4,0x26,0x4b, 0x6,0x2b,0x4d, 0x6,0x31,0x29, 0x5,0x26,0x35, 0x6,0x31,0x2c, 0x6,0x2b,0x4f, 0x4,0x26,0x4a, 0x5,0x26,0x37, 0x4,0x29,0x38, 0x5,0x26,0x36, 0x4,0x29,0x43, 0x6,0x2b,0x49, 0x5,0x26,0x38, 0x4,0x26,0x51, 0x4,0x29,0x44, 0x6,0x31,0x2a, 0x6,0x31,0x2b, 0x6,0x2b,0x50, 0x6,0x2b,0x47, 0x6,0x31,0x2d, 0xf,0x26,0x75, 0xf,0x27,0x22, 0xf,0x2a,0x70, 0x4,0x29,0x46, 0x6,0x31,0x2e, 0x6,0x2b,0x48, 0x6,0x2b,0x4a, 0x6,0x2b,0x4e, 0x6,0x2b,0x4b, 0xf,0x2a,0x64, 0xf,0x2a,0x5f, 0xf,0x2a,0x62, 0xf,0x2a,0x65, 0xf,0x2a,0x68, 0xf,0x2a,0x6c, 0x6,0x37,0x5b, 0x6,0x37,0x59, 0x6,0x31,0x32, 0x4,0x29,0x49, 0x5,0x29,0x37, 0x4,0x29,0x42, 0x4,0x2d,0x29, 0x5,0x2d,0x4e, 0x5,0x29,0x36, 0x6,0x31,0x39, 0x6,0x37,0x57, 0x6,0x31,0x33, 0x4,0x2c,0x7d, 0x5,0x2d,0x4c, 0x6,0x31,0x35, 0x6,0x37,0x53, 0x4,0x2d,0x21, 0x6,0x31,0x38, 0x5,0x29,0x34, 0x4,0x2c,0x7e, 0x6,0x31,0x3a, 0x6,0x31,0x31, 0x6,0x31,0x37, 0x6,0x37,0x56, 0x6,0x37,0x55, 0x4,0x2d,0x2a, 0x6,0x31,0x34, 0xf,0x2a,0x61, 0xf,0x2a,0x66, 0xf,0x2a,0x69, 0xf,0x2a,0x6b, 0xf,0x2a,0x6d, 0xf,0x2a,0x6e, 0xf,0x2a,0x6f, 0xf,0x2f,0x46, 0xf,0x2f,0x47, 0xf,0x2f,0x48, 0xf,0x2f,0x4a, 0x6,0x37,0x52, 0xf,0x2f,0x44, 0x6,0x37,0x58, 0xf,0x2a,0x63, 0x5,0x2d,0x4d, 0x6,0x37,0x51, 0x5,0x2d,0x52, 0x5,0x2d,0x58, 0x5,0x2d,0x5b, 0x6,0x3f,0x6d, 0x6,0x37,0x63, 0x6,0x3f,0x6f, 0x6,0x3f,0x6b, 0x6,0x3f,0x70, 0x6,0x37,0x64, 0x5,0x2d,0x55, 0x6,0x3f,0x69, 0x4,0x2d,0x2e, 0x6,0x3f,0x73, 0x5,0x2d,0x56, 0x4,0x2d,0x26, 0x5,0x32,0x5d, 0x5,0x2d,0x51, 0x5,0x2d,0x5c, 0x6,0x37,0x62, 0x6,0x37,0x5d, 0x5,0x32,0x54, 0x6,0x37,0x5f, 0x6,0x37,0x61, 0x6,0x3f,0x6c, 0x6,0x37,0x60, 0x6,0x3f,0x71, 0x4,0x2d,0x27, 0x5,0x2d,0x50, 0x6,0x37,0x5c, 0x5,0x32,0x53, 0x6,0x3f,0x72, 0x6,0x3f,0x74, 0x5,0x32,0x52, 0x5,0x2d,0x4f, 0xf,0x2f,0x41, 0xf,0x2f,0x42, 0xf,0x2f,0x43, 0xf,0x2f,0x49, 0xf,0x2f,0x4b, 0xf,0x34,0x5d, 0xf,0x34,0x5f, 0xf,0x34,0x60, 0xf,0x34,0x64, 0xf,0x34,0x65, 0xf,0x34,0x66, 0xf,0x34,0x67, 0xf,0x34,0x68, 0x6,0x3f,0x6a, 0x6,0x37,0x65, 0x6,0x37,0x66, 0x5,0x2d,0x54, 0x5,0x2d,0x59, 0x4,0x37,0x5a, 0x6,0x48,0x71, 0x4,0x37,0x4d, 0x5,0x32,0x59, 0x6,0x3f,0x7c, 0x4,0x37,0x4b, 0x6,0x48,0x73, 0x6,0x48,0x69, 0x5,0x38,0x55, 0x6,0x3f,0x7e, 0x6,0x48,0x72, 0x6,0x40,0x22, 0x4,0x31,0x65, 0x5,0x2d,0x53, 0x4,0x31,0x6d, 0x6,0x3f,0x77, 0x6,0x48,0x6e, 0x4,0x31,0x61, 0x5,0x38,0x3f, 0x5,0x32,0x57, 0x5,0x32,0x5a, 0x4,0x37,0x4c, 0x6,0x3f,0x79, 0x5,0x32,0x5c, 0x6,0x3f,0x76, 0x6,0x3f,0x6e, 0x4,0x31,0x69, 0x5,0x38,0x3c, 0x6,0x48,0x70, 0x5,0x32,0x5e, 0x4,0x31,0x5f, 0x6,0x3f,0x7d, 0x6,0x3f,0x7b, 0x6,0x3f,0x7a, 0x6,0x48,0x66, 0x6,0x48,0x6c, 0x5,0x38,0x3e, 0x5,0x38,0x41, 0x6,0x48,0x74, 0x5,0x32,0x55, 0x6,0x48,0x6b, 0x6,0x48,0x76, 0x6,0x48,0x67, 0x6,0x48,0x65, 0x6,0x3f,0x75, 0x5,0x38,0x40, 0xf,0x34,0x61, 0xf,0x34,0x5e, 0xf,0x34,0x62, 0xf,0x34,0x63, 0xf,0x34,0x69, 0xf,0x34,0x6a, 0xf,0x34,0x6b, 0xf,0x34,0x6c, 0xf,0x34,0x6d, 0xf,0x34,0x6f, 0xf,0x34,0x70, 0xf,0x34,0x72, 0xf,0x3a,0x72, 0xf,0x3a,0x73, 0xf,0x3a,0x74, 0xf,0x3a,0x75, 0xf,0x3a,0x76, 0xf,0x3a,0x77, 0xf,0x3a,0x79, 0xf,0x3a,0x7a, 0xf,0x3a,0x7c, 0xf,0x3a,0x7d, 0xf,0x3a,0x7e, 0xf,0x3b,0x21, 0xf,0x3b,0x22, 0xf,0x3b,0x25, 0xf,0x3b,0x29, 0xf,0x3b,0x2a, 0xf,0x3b,0x2c, 0xf,0x3b,0x2e, 0x6,0x48,0x68, 0x5,0x32,0x56, 0x6,0x3f,0x78, 0xf,0x3b,0x27, 0xf,0x34,0x6e, 0x6,0x49,0x24, 0x6,0x48,0x6d, 0x6,0x40,0x21, 0xf,0x3b,0x24, 0x4,0x3d,0x3f, 0x5,0x38,0x4a, 0x5,0x38,0x4d, 0x5,0x38,0x52, 0x4,0x37,0x4f, 0x4,0x37,0x57, 0x4,0x37,0x51, 0x6,0x52,0x5d, 0x6,0x49,0x23, 0x5,0x38,0x50, 0x6,0x49,0x22, 0x4,0x37,0x53, 0x5,0x38,0x56, 0x5,0x38,0x58, 0x5,0x38,0x43, 0x6,0x52,0x61, 0x5,0x38,0x5a, 0x5,0x3f,0x33, 0x4,0x37,0x5b, 0x5,0x38,0x53, 0x6,0x49,0x21, 0x5,0x38,0x46, 0x6,0x48,0x7b, 0x5,0x3f,0x34, 0x5,0x38,0x44, 0x5,0x38,0x54, 0x5,0x32,0x5f, 0x6,0x52,0x58, 0x5,0x38,0x47, 0x4,0x3d,0x36, 0x4,0x37,0x58, 0x5,0x38,0x59, 0x5,0x38,0x51, 0x5,0x38,0x4b, 0x5,0x3f,0x31, 0x6,0x48,0x77, 0x5,0x38,0x4f, 0x5,0x38,0x3d, 0x6,0x48,0x7e, 0x6,0x52,0x62, 0x6,0x52,0x63, 0x6,0x52,0x5a, 0x6,0x48,0x7d, 0x5,0x38,0x57, 0x6,0x52,0x5e, 0x6,0x52,0x60, 0x5,0x3f,0x2f, 0x4,0x3d,0x40, 0x4,0x37,0x52, 0x5,0x38,0x49, 0x6,0x48,0x79, 0xf,0x3a,0x71, 0xf,0x3a,0x7b, 0xf,0x3b,0x23, 0xf,0x3b,0x28, 0xf,0x3b,0x2d, 0xf,0x41,0x48, 0xf,0x41,0x4e, 0xf,0x41,0x50, 0xf,0x41,0x51, 0xf,0x41,0x52, 0x6,0x52,0x5c, 0x6,0x52,0x5f, 0x6,0x52,0x5b, 0x6,0x48,0x7a, 0xf,0x3b,0x2b, 0x5,0x38,0x4e, 0x5,0x3f,0x2e, 0x5,0x38,0x4c, 0xf,0x34,0x71, 0xf,0x47,0x7d, 0x5,0x3f,0x3c, 0x5,0x3f,0x36, 0x5,0x3f,0x35, 0x6,0x52,0x6b, 0x5,0x4d,0x26, 0x5,0x3f,0x45, 0x6,0x5c,0x6f, 0x5,0x3f,0x39, 0x5,0x3f,0x3f, 0x5,0x3f,0x44, 0x6,0x5c,0x74, 0x6,0x52,0x6f, 0x5,0x45,0x6b, 0x5,0x3f,0x3b, 0x6,0x5c,0x6c, 0x6,0x52,0x65, 0x5,0x3f,0x38, 0x5,0x3f,0x3d, 0x5,0x3f,0x3a, 0x6,0x52,0x59, 0x4,0x49,0x6e, 0x6,0x5c,0x76, 0x6,0x5c,0x79, 0x5,0x3f,0x43, 0x6,0x52,0x68, 0x6,0x5c,0x72, 0x4,0x43,0x4f, 0x6,0x5c,0x78, 0x6,0x5c,0x77, 0x5,0x3f,0x41, 0x5,0x45,0x6d, 0x5,0x3f,0x3e, 0x6,0x5c,0x71, 0x6,0x5c,0x6e, 0x6,0x5c,0x6d, 0x5,0x3f,0x37, 0x6,0x52,0x67, 0x6,0x52,0x6d, 0xf,0x41,0x4a, 0xf,0x41,0x4b, 0xf,0x41,0x4c, 0xf,0x41,0x4d, 0xf,0x41,0x4f, 0xf,0x41,0x53, 0xf,0x47,0x76, 0xf,0x47,0x77, 0xf,0x47,0x79, 0xf,0x47,0x7a, 0xf,0x48,0x25, 0xf,0x48,0x28, 0x6,0x5c,0x70, 0x6,0x5c,0x75, 0x5,0x3f,0x40, 0xf,0x41,0x49, 0x6,0x5c,0x73, 0x6,0x52,0x6e, 0x6,0x5d,0x23, 0x6,0x5d,0x27, 0x4,0x43,0x45, 0x4,0x43,0x44, 0x5,0x4d,0x27, 0x6,0x5c,0x7c, 0x5,0x45,0x77, 0x5,0x45,0x76, 0x5,0x45,0x73, 0x4,0x3d,0x35, 0x6,0x5c,0x7b, 0x7,0x22,0x72, 0x7,0x22,0x75, 0x5,0x4d,0x29, 0x5,0x45,0x70, 0x5,0x45,0x6f, 0x5,0x45,0x6c, 0x5,0x45,0x71, 0x5,0x45,0x72, 0x5,0x45,0x79, 0x6,0x5d,0x25, 0x6,0x5c,0x7d, 0x6,0x5c,0x7e, 0x6,0x52,0x6a, 0x6,0x5d,0x22, 0x7,0x22,0x74, 0x6,0x5d,0x21, 0x7,0x22,0x77, 0x5,0x45,0x74, 0x5,0x45,0x78, 0x7,0x2d,0x6a, 0x4,0x43,0x53, 0xf,0x47,0x78, 0xf,0x47,0x7c, 0xf,0x47,0x7e, 0xf,0x48,0x21, 0xf,0x48,0x23, 0xf,0x48,0x24, 0xf,0x48,0x26, 0xf,0x4e,0x69, 0xf,0x4e,0x6a, 0xf,0x4e,0x6b, 0xf,0x4e,0x6c, 0xf,0x4e,0x6d, 0xf,0x4e,0x6e, 0xf,0x4e,0x6f, 0xf,0x4e,0x73, 0xf,0x4e,0x75, 0x7,0x22,0x73, 0x7,0x22,0x78, 0x6,0x5c,0x6b, 0x5,0x45,0x6e, 0x6,0x5c,0x7a, 0x5,0x4d,0x28, 0x5,0x45,0x75, 0x7,0x2d,0x71, 0x4,0x49,0x66, 0x4,0x43,0x52, 0x7,0x2d,0x6b, 0x4,0x49,0x71, 0x7,0x2d,0x6d, 0x5,0x4d,0x2f, 0x7,0x2d,0x73, 0x4,0x49,0x6a, 0x5,0x4d,0x2e, 0x7,0x22,0x79, 0x5,0x4d,0x33, 0x4,0x49,0x72, 0x7,0x2d,0x75, 0x5,0x38,0x45, 0x5,0x4d,0x32, 0x5,0x4d,0x35, 0x4,0x50,0x35, 0x4,0x50,0x36, 0x7,0x23,0x21, 0x5,0x4d,0x34, 0x7,0x37,0x7c, 0x5,0x4d,0x30, 0x5,0x54,0x4e, 0x4,0x56,0x34, 0x7,0x22,0x7a, 0x7,0x23,0x22, 0x5,0x54,0x54, 0x5,0x4d,0x2b, 0x5,0x4d,0x2d, 0x5,0x54,0x4d, 0x5,0x4d,0x2c, 0x7,0x2e,0x22, 0x7,0x2d,0x77, 0x7,0x2d,0x76, 0x7,0x22,0x7e, 0x4,0x50,0x3c, 0x7,0x2d,0x70, 0x7,0x2d,0x6f, 0xf,0x48,0x22, 0xf,0x4e,0x70, 0x7,0x2d,0x72, 0x5,0x4d,0x31, 0x7,0x2d,0x6c, 0xf,0x4e,0x71, 0xf,0x4e,0x72, 0xf,0x4e,0x74, 0xf,0x4e,0x76, 0xf,0x54,0x47, 0xf,0x54,0x48, 0xf,0x54,0x4a, 0xf,0x54,0x4b, 0xf,0x54,0x51, 0xf,0x54,0x53, 0x7,0x2d,0x74, 0x5,0x54,0x4b, 0x7,0x30,0x50, 0x7,0x22,0x7d, 0x7,0x25,0x71, 0x4,0x49,0x70, 0x5,0x54,0x4c, 0x5,0x54,0x4f, 0xf,0x4e,0x68, 0xf,0x54,0x4f, 0x5,0x54,0x50, 0x5,0x54,0x52, 0x7,0x2d,0x7b, 0x7,0x2d,0x78, 0x5,0x54,0x55, 0x5,0x54,0x56, 0x5,0x54,0x51, 0x7,0x2d,0x7e, 0x7,0x2d,0x7c, 0x7,0x2d,0x7d, 0x5,0x54,0x57, 0x4,0x50,0x3d, 0x5,0x5b,0x49, 0x7,0x2e,0x21, 0x7,0x37,0x7b, 0x7,0x37,0x7d, 0x7,0x37,0x7a, 0x7,0x38,0x21, 0x5,0x5b,0x4b, 0x7,0x2d,0x7a, 0x7,0x37,0x79, 0x7,0x2d,0x6e, 0xf,0x54,0x4d, 0x5,0x54,0x53, 0x7,0x38,0x22, 0xf,0x54,0x49, 0xf,0x54,0x4e, 0xf,0x54,0x52, 0xf,0x5a,0x25, 0xf,0x5a,0x26, 0xf,0x5a,0x2e, 0xf,0x5a,0x27, 0x5,0x5b,0x4a, 0x5,0x54,0x58, 0xf,0x5a,0x2a, 0xf,0x54,0x4c, 0x7,0x37,0x78, 0x5,0x5b,0x51, 0x4,0x56,0x35, 0x4,0x56,0x31, 0x4,0x5b,0x2a, 0x5,0x5b,0x4e, 0x5,0x61,0x64, 0x5,0x61,0x62, 0x7,0x3f,0x5b, 0x7,0x38,0x26, 0x4,0x5b,0x26, 0x5,0x5b,0x4d, 0x5,0x5b,0x4f, 0x7,0x38,0x23, 0x7,0x38,0x25, 0x5,0x5b,0x50, 0x5,0x61,0x63, 0x7,0x3f,0x5a, 0x5,0x61,0x65, 0x7,0x3f,0x59, 0x7,0x22,0x76, 0xf,0x5a,0x2b, 0xf,0x5a,0x2d, 0xf,0x5e,0x5f, 0xf,0x5e,0x60, 0xf,0x5e,0x62, 0xf,0x5e,0x63, 0xf,0x5e,0x65, 0xf,0x5e,0x66, 0xf,0x5e,0x67, 0x7,0x3f,0x5c, 0x7,0x38,0x24, 0xf,0x5a,0x28, 0x4,0x5b,0x27, 0x5,0x5b,0x52, 0x7,0x46,0x79, 0x7,0x3f,0x5d, 0x5,0x61,0x68, 0x7,0x4d,0x64, 0x4,0x5f,0x63, 0x4,0x5f,0x62, 0x7,0x46,0x7c, 0x5,0x61,0x69, 0x7,0x4d,0x67, 0x4,0x5b,0x28, 0x5,0x61,0x6a, 0x7,0x47,0x25, 0x7,0x47,0x21, 0x7,0x46,0x78, 0x5,0x61,0x67, 0x7,0x46,0x7e, 0x5,0x67,0x6d, 0x7,0x46,0x7a, 0x5,0x67,0x70, 0x7,0x46,0x77, 0x7,0x47,0x22, 0x7,0x3f,0x5e, 0x7,0x46,0x7d, 0x5,0x67,0x6e, 0xf,0x5e,0x64, 0x5,0x67,0x6f, 0x7,0x46,0x7b, 0x5,0x67,0x6c, 0xf,0x62,0x39, 0x7,0x47,0x2a, 0x4,0x63,0x44, 0x7,0x47,0x27, 0x5,0x67,0x74, 0x7,0x47,0x24, 0x5,0x6c,0x2a, 0x7,0x47,0x29, 0x7,0x47,0x26, 0x7,0x3f,0x5f, 0x5,0x67,0x75, 0x4,0x63,0x3f, 0x5,0x67,0x71, 0x5,0x6c,0x28, 0x7,0x47,0x2b, 0x7,0x47,0x23, 0x7,0x4d,0x65, 0x5,0x67,0x77, 0xf,0x62,0x3a, 0xf,0x62,0x38, 0xf,0x62,0x3b, 0xf,0x62,0x3c, 0xf,0x62,0x3d, 0x7,0x4d,0x66, 0x5,0x61,0x66, 0x5,0x67,0x72, 0xf,0x65,0x2b, 0x5,0x67,0x76, 0x5,0x6c,0x29, 0x7,0x53,0x39, 0x7,0x4d,0x6a, 0x4,0x63,0x41, 0x7,0x4d,0x69, 0x4,0x63,0x45, 0x7,0x53,0x38, 0x7,0x4d,0x6b, 0xf,0x67,0x55, 0x7,0x5b,0x4f, 0x4,0x66,0x3e, 0x5,0x6c,0x2b, 0x7,0x57,0x73, 0x7,0x57,0x74, 0x7,0x57,0x75, 0x7,0x53,0x3b, 0x7,0x53,0x3a, 0x7,0x53,0x3c, 0xf,0x69,0x42, 0x7,0x57,0x76, 0x7,0x5b,0x50, 0x7,0x5b,0x52, 0x7,0x5b,0x53, 0x7,0x5b,0x51, 0xf,0x6a,0x50, 0xf,0x69,0x41, 0xf,0x6a,0x51, 0xf,0x6a,0x52, 0x7,0x5b,0x55, 0x5,0x77,0x5a, 0x7,0x5b,0x54, 0x7,0x5e,0x65, 0xf,0x6a,0x53, 0xf,0x6b,0x47, 0xf,0x6b,0x48, 0x5,0x77,0x5b, 0x7,0x5e,0x66, 0x5,0x79,0x29, 0x7,0x5e,0x67, 0xf,0x6c,0x28, 0xf,0x6c,0x29, 0x4,0x6d,0x72, 0xf,0x6c,0x7c, 0xf,0x6c,0x7d, 0x5,0x7b,0x3e, 0x5,0x7b,0x60, 0xf,0x6d,0x34, 0x5,0x22,0x6a, 0x4,0x22,0x72, 0x6,0x24,0x76, 0x6,0x27,0x6b, 0x5,0x24,0x3b, 0x6,0x27,0x6a, 0x6,0x27,0x6d, 0x6,0x27,0x6c, 0x4,0x26,0x52, 0x6,0x2b,0x51, 0x6,0x2b,0x58, 0x6,0x2b,0x54, 0x6,0x2b,0x56, 0x4,0x26,0x53, 0x6,0x2b,0x55, 0x6,0x2b,0x53, 0x6,0x2b,0x57, 0xf,0x27,0x24, 0xf,0x27,0x23, 0x6,0x31,0x3d, 0x6,0x31,0x3b, 0x6,0x31,0x3e, 0x6,0x31,0x40, 0x4,0x29,0x4c, 0x6,0x31,0x41, 0x6,0x31,0x3f, 0xf,0x2a,0x71, 0xf,0x2a,0x72, 0x6,0x31,0x3c, 0x6,0x37,0x67, 0x5,0x2d,0x5f, 0x6,0x37,0x69, 0x5,0x2d,0x5e, 0x6,0x37,0x68, 0x5,0x32,0x61, 0x4,0x31,0x6f, 0x6,0x40,0x25, 0xf,0x34,0x73, 0xf,0x34,0x74, 0x6,0x40,0x24, 0x5,0x32,0x60, 0x6,0x49,0x28, 0x6,0x49,0x27, 0x6,0x49,0x25, 0x6,0x49,0x26, 0x4,0x37,0x5c, 0x6,0x49,0x29, 0xf,0x3b,0x2f, 0x5,0x38,0x5b, 0x5,0x38,0x5c, 0xf,0x34,0x76, 0x4,0x3d,0x44, 0x6,0x52,0x71, 0x5,0x3f,0x47, 0x5,0x3f,0x49, 0xf,0x41,0x55, 0x4,0x3d,0x41, 0x6,0x52,0x70, 0x5,0x3f,0x48, 0x6,0x5d,0x29, 0x6,0x5d,0x2a, 0x5,0x45,0x7a, 0x5,0x45,0x7c, 0x5,0x45,0x7b, 0x7,0x23,0x24, 0x5,0x45,0x7d, 0xf,0x48,0x29, 0xf,0x48,0x2a, 0x6,0x5d,0x28, 0x5,0x4d,0x36, 0x4,0x49,0x73, 0x4,0x49,0x74, 0x7,0x23,0x28, 0x7,0x23,0x27, 0x7,0x23,0x25, 0x6,0x5d,0x2b, 0x7,0x23,0x23, 0xf,0x4e,0x7b, 0x7,0x23,0x29, 0x7,0x23,0x26, 0xf,0x4e,0x77, 0xf,0x4e,0x78, 0xf,0x4e,0x7a, 0x7,0x23,0x2a, 0x7,0x2e,0x2a, 0x7,0x2e,0x25, 0x7,0x2e,0x24, 0x7,0x2e,0x27, 0x7,0x2e,0x26, 0x7,0x2e,0x29, 0x7,0x2e,0x28, 0x7,0x2c,0x63, 0x7,0x31,0x70, 0x7,0x2e,0x23, 0x7,0x38,0x27, 0x5,0x5b,0x53, 0xf,0x5a,0x2f, 0x7,0x3f,0x60, 0x7,0x47,0x2d, 0x4,0x5f,0x65, 0x7,0x47,0x2e, 0x5,0x6c,0x2c, 0xf,0x65,0x2c, 0x5,0x70,0x21, 0x7,0x53,0x3d, 0x6,0x23,0x27, 0x5,0x21,0x6d, 0x6,0x24,0x77, 0x6,0x24,0x78, 0x4,0x24,0x34, 0xf,0x24,0x37, 0xf,0x24,0x38, 0x5,0x26,0x39, 0x6,0x2b,0x59, 0x6,0x2b,0x5a, 0x6,0x31,0x43, 0x6,0x31,0x42, 0x6,0x31,0x44, 0x5,0x29,0x39, 0xf,0x2a,0x73, 0xf,0x2a,0x74, 0xf,0x2a,0x75, 0x6,0x31,0x46, 0x6,0x31,0x45, 0x5,0x29,0x38, 0x6,0x37,0x6c, 0x6,0x37,0x6a, 0x6,0x37,0x6b, 0x5,0x2d,0x61, 0x5,0x2d,0x60, 0x6,0x40,0x26, 0xf,0x34,0x77, 0x5,0x38,0x5d, 0x5,0x38,0x5f, 0x5,0x38,0x60, 0x5,0x38,0x5e, 0x5,0x3f,0x4a, 0x5,0x45,0x7e, 0x4,0x43,0x55, 0x7,0x23,0x2b, 0x5,0x5b,0x54, 0x5,0x70,0x22, 0x6,0x23,0x28, 0x5,0x21,0x6e, 0x6,0x23,0x29, 0x6,0x23,0x2a, 0x5,0x21,0x6f, 0x5,0x22,0x6c, 0x4,0x22,0x76, 0x6,0x24,0x79, 0x5,0x22,0x72, 0x5,0x22,0x70, 0x5,0x22,0x6f, 0x5,0x22,0x6b, 0x5,0x22,0x6d, 0xf,0x22,0x50, 0xf,0x22,0x52, 0x5,0x22,0x71, 0x4,0x24,0x37, 0x6,0x27,0x73, 0x6,0x27,0x76, 0x6,0x27,0x75, 0x4,0x26,0x57, 0x5,0x24,0x3d, 0x6,0x27,0x6f, 0x4,0x24,0x38, 0x4,0x24,0x35, 0x6,0x27,0x77, 0x5,0x24,0x3e, 0x4,0x24,0x3b, 0x6,0x27,0x72, 0x6,0x2b,0x5d, 0x6,0x27,0x71, 0x6,0x2b,0x65, 0x6,0x2b,0x5b, 0x6,0x27,0x70, 0x5,0x24,0x3c, 0x6,0x2b,0x5c, 0x6,0x27,0x74, 0xf,0x24,0x3b, 0xf,0x24,0x3c, 0xf,0x24,0x3d, 0xf,0x24,0x3e, 0xf,0x24,0x3f, 0xf,0x24,0x40, 0xf,0x24,0x41, 0xf,0x24,0x43, 0xf,0x24,0x44, 0xf,0x24,0x45, 0xf,0x24,0x3a, 0x6,0x2b,0x5e, 0x6,0x2b,0x5f, 0x6,0x2b,0x61, 0x5,0x26,0x3b, 0x5,0x29,0x3a, 0x6,0x2b,0x64, 0x6,0x31,0x48, 0x5,0x26,0x3d, 0x6,0x31,0x4a, 0x5,0x26,0x3c, 0x6,0x31,0x49, 0x6,0x31,0x47, 0x6,0x2b,0x62, 0xf,0x27,0x26, 0xf,0x27,0x27, 0xf,0x27,0x28, 0xf,0x27,0x29, 0xf,0x27,0x2a, 0xf,0x27,0x2b, 0xf,0x27,0x2c, 0xf,0x27,0x2d, 0xf,0x27,0x2f, 0xf,0x27,0x25, 0x5,0x26,0x3e, 0x6,0x31,0x52, 0x6,0x31,0x54, 0x4,0x29,0x58, 0x4,0x29,0x4f, 0x4,0x29,0x50, 0x6,0x31,0x53, 0x6,0x37,0x6d, 0x5,0x29,0x3f, 0x5,0x29,0x42, 0x5,0x29,0x41, 0x6,0x31,0x4d, 0x5,0x29,0x47, 0x4,0x2d,0x34, 0x4,0x29,0x5c, 0x5,0x29,0x3e, 0x5,0x29,0x3d, 0x5,0x2d,0x63, 0x4,0x29,0x53, 0x6,0x37,0x6e, 0x5,0x29,0x48, 0x4,0x29,0x5a, 0x6,0x31,0x50, 0x5,0x29,0x40, 0x5,0x29,0x44, 0x6,0x31,0x4e, 0x6,0x31,0x56, 0x6,0x31,0x4b, 0x5,0x29,0x43, 0x5,0x29,0x3c, 0x6,0x31,0x55, 0x6,0x31,0x51, 0xf,0x2a,0x76, 0xf,0x2a,0x77, 0xf,0x2a,0x78, 0xf,0x2a,0x79, 0xf,0x2a,0x7a, 0xf,0x2a,0x7b, 0xf,0x2a,0x7c, 0xf,0x2a,0x7d, 0xf,0x2a,0x7e, 0xf,0x2b,0x21, 0xf,0x2b,0x23, 0xf,0x2b,0x24, 0xf,0x2b,0x25, 0xf,0x2b,0x26, 0xf,0x2b,0x27, 0xf,0x2b,0x28, 0xf,0x2b,0x29, 0xf,0x2b,0x2a, 0xf,0x2f,0x53, 0xf,0x2f,0x5c, 0xf,0x2f,0x61, 0x6,0x31,0x4c, 0xf,0x2b,0x22, 0x5,0x29,0x3b, 0x5,0x2d,0x62, 0x5,0x2d,0x64, 0x4,0x2d,0x3d, 0x6,0x37,0x75, 0x4,0x2d,0x38, 0x5,0x2d,0x6d, 0x5,0x2d,0x6b, 0x4,0x2d,0x39, 0x4,0x29,0x57, 0x4,0x2d,0x35, 0x5,0x2d,0x6a, 0x6,0x37,0x7b, 0x6,0x37,0x70, 0x6,0x37,0x7d, 0x6,0x37,0x73, 0x5,0x2d,0x69, 0x6,0x37,0x72, 0x6,0x37,0x77, 0x4,0x2d,0x36, 0x6,0x37,0x78, 0x5,0x2d,0x6c, 0x5,0x2d,0x65, 0x4,0x2d,0x37, 0x5,0x2d,0x67, 0x5,0x2d,0x68, 0x4,0x2d,0x3a, 0x6,0x37,0x7a, 0x5,0x2d,0x66, 0x6,0x31,0x57, 0x6,0x37,0x76, 0x6,0x40,0x27, 0x6,0x37,0x79, 0x6,0x37,0x74, 0x5,0x29,0x46, 0x6,0x37,0x7c, 0x6,0x37,0x7e, 0xf,0x2f,0x4c, 0xf,0x2f,0x4d, 0xf,0x2f,0x4e, 0xf,0x2f,0x4f, 0xf,0x2f,0x50, 0xf,0x2f,0x51, 0xf,0x2f,0x52, 0xf,0x2f,0x55, 0xf,0x2f,0x56, 0xf,0x2f,0x57, 0xf,0x2f,0x5a, 0xf,0x2f,0x5b, 0xf,0x2f,0x5d, 0xf,0x2f,0x5e, 0xf,0x2f,0x60, 0xf,0x2f,0x62, 0x6,0x40,0x28, 0xf,0x2f,0x58, 0x6,0x37,0x6f, 0xf,0x2f,0x54, 0x4,0x31,0x72, 0x4,0x31,0x73, 0x4,0x37,0x5e, 0x5,0x32,0x69, 0x6,0x40,0x31, 0x5,0x2d,0x6e, 0x6,0x40,0x37, 0x5,0x32,0x63, 0x4,0x31,0x74, 0x4,0x32,0x22, 0x4,0x31,0x76, 0x5,0x32,0x62, 0x4,0x31,0x7d, 0x5,0x38,0x61, 0x5,0x32,0x64, 0x6,0x40,0x34, 0x5,0x32,0x67, 0x6,0x40,0x35, 0x6,0x40,0x2c, 0x6,0x40,0x29, 0x4,0x32,0x24, 0x6,0x49,0x2f, 0x6,0x49,0x2a, 0x6,0x40,0x2a, 0x5,0x32,0x65, 0x6,0x49,0x2d, 0x4,0x37,0x5d, 0x6,0x40,0x2f, 0x6,0x49,0x2c, 0x6,0x49,0x2b, 0x5,0x32,0x68, 0x6,0x40,0x2d, 0x6,0x49,0x2e, 0x6,0x40,0x33, 0x6,0x40,0x30, 0x4,0x31,0x75, 0x6,0x40,0x2e, 0xf,0x34,0x78, 0xf,0x34,0x79, 0xf,0x34,0x7a, 0xf,0x34,0x7b, 0xf,0x34,0x7c, 0xf,0x34,0x7e, 0xf,0x35,0x22, 0xf,0x35,0x23, 0xf,0x35,0x24, 0xf,0x35,0x25, 0xf,0x35,0x26, 0xf,0x35,0x27, 0xf,0x35,0x28, 0xf,0x35,0x29, 0xf,0x35,0x2a, 0xf,0x35,0x2b, 0xf,0x35,0x2c, 0xf,0x35,0x2e, 0xf,0x35,0x2d, 0xf,0x35,0x2f, 0xf,0x35,0x30, 0xf,0x3b,0x31, 0xf,0x34,0x7d, 0x5,0x32,0x66, 0x4,0x32,0x26, 0xf,0x3b,0x41, 0x5,0x38,0x6b, 0x6,0x49,0x34, 0x4,0x37,0x69, 0x6,0x49,0x3b, 0x6,0x49,0x36, 0x5,0x38,0x6d, 0x6,0x49,0x41, 0x5,0x38,0x74, 0x6,0x49,0x31, 0x4,0x3d,0x51, 0x4,0x37,0x67, 0x5,0x38,0x62, 0x5,0x38,0x6a, 0x4,0x37,0x5f, 0x5,0x38,0x68, 0x4,0x37,0x63, 0x5,0x38,0x69, 0x4,0x37,0x6a, 0x5,0x38,0x66, 0x4,0x37,0x6d, 0x5,0x38,0x6f, 0x4,0x37,0x66, 0x6,0x49,0x42, 0x6,0x49,0x43, 0x6,0x49,0x3a, 0x5,0x38,0x71, 0x6,0x49,0x33, 0x6,0x49,0x46, 0x6,0x49,0x37, 0x5,0x38,0x70, 0x4,0x37,0x6c, 0x6,0x49,0x47, 0x6,0x49,0x32, 0x5,0x38,0x6c, 0x5,0x38,0x6e, 0x6,0x49,0x44, 0x5,0x38,0x64, 0x6,0x49,0x3c, 0x6,0x49,0x45, 0x6,0x49,0x40, 0x6,0x49,0x4c, 0x6,0x49,0x3f, 0x6,0x49,0x4d, 0x6,0x49,0x48, 0x6,0x49,0x39, 0x5,0x38,0x72, 0x6,0x49,0x3d, 0x5,0x38,0x73, 0x5,0x38,0x67, 0x6,0x49,0x38, 0x6,0x49,0x4b, 0x5,0x38,0x65, 0x6,0x52,0x73, 0xf,0x3b,0x30, 0xf,0x3b,0x32, 0xf,0x3b,0x34, 0xf,0x3b,0x35, 0xf,0x3b,0x36, 0xf,0x3b,0x37, 0xf,0x3b,0x38, 0xf,0x3b,0x39, 0xf,0x3b,0x3a, 0xf,0x3b,0x3b, 0xf,0x3b,0x3c, 0xf,0x3b,0x3d, 0xf,0x3b,0x3f, 0xf,0x3b,0x40, 0xf,0x3b,0x42, 0xf,0x3b,0x43, 0xf,0x3b,0x44, 0xf,0x3b,0x45, 0xf,0x3b,0x46, 0xf,0x3b,0x48, 0xf,0x3b,0x49, 0xf,0x3b,0x4a, 0x6,0x52,0x74, 0x6,0x49,0x3e, 0x6,0x49,0x49, 0x6,0x49,0x35, 0x5,0x38,0x63, 0xf,0x3b,0x47, 0x5,0x3f,0x52, 0x6,0x52,0x7b, 0x4,0x3d,0x4b, 0x4,0x3d,0x49, 0x5,0x3f,0x55, 0x4,0x3d,0x46, 0x6,0x52,0x78, 0x4,0x3d,0x4d, 0x4,0x3d,0x53, 0x4,0x3d,0x47, 0x4,0x3d,0x52, 0x6,0x52,0x7e, 0x5,0x3f,0x51, 0x5,0x46,0x21, 0x5,0x3f,0x4b, 0x6,0x5d,0x2c, 0x6,0x53,0x25, 0x6,0x52,0x75, 0x6,0x53,0x23, 0x6,0x53,0x22, 0x5,0x3f,0x4d, 0x5,0x3f,0x53, 0x5,0x3f,0x4e, 0x6,0x52,0x79, 0x6,0x53,0x21, 0x5,0x3f,0x50, 0x6,0x53,0x24, 0x6,0x52,0x7c, 0x5,0x3f,0x4c, 0x6,0x52,0x7a, 0x5,0x3f,0x4f, 0xf,0x41,0x56, 0xf,0x41,0x57, 0xf,0x41,0x58, 0xf,0x41,0x59, 0xf,0x41,0x5a, 0xf,0x41,0x5b, 0xf,0x41,0x5c, 0xf,0x41,0x5d, 0xf,0x41,0x5e, 0xf,0x41,0x60, 0xf,0x41,0x61, 0xf,0x41,0x63, 0xf,0x41,0x64, 0xf,0x41,0x65, 0xf,0x41,0x66, 0xf,0x41,0x67, 0xf,0x41,0x69, 0xf,0x48,0x30, 0x6,0x52,0x77, 0x6,0x52,0x7d, 0x6,0x52,0x76, 0xf,0x41,0x68, 0x5,0x3f,0x54, 0x6,0x5d,0x36, 0x5,0x4d,0x39, 0x5,0x46,0x27, 0x5,0x46,0x2a, 0x4,0x43,0x62, 0x4,0x43,0x5f, 0x6,0x5d,0x3c, 0x6,0x5d,0x3d, 0x6,0x5d,0x2e, 0x4,0x43,0x57, 0x6,0x5d,0x3f, 0x5,0x46,0x26, 0x4,0x43,0x63, 0x5,0x4d,0x38, 0x5,0x46,0x29, 0x6,0x5d,0x35, 0x4,0x43,0x59, 0x7,0x23,0x2f, 0x4,0x43,0x5b, 0x4,0x43,0x5a, 0x7,0x23,0x2e, 0x7,0x23,0x31, 0x5,0x46,0x24, 0x4,0x43,0x65, 0x6,0x5d,0x39, 0x6,0x5d,0x3e, 0x6,0x5d,0x3a, 0x5,0x46,0x28, 0x6,0x5d,0x37, 0x5,0x46,0x2b, 0x7,0x23,0x2c, 0x6,0x5d,0x3b, 0x6,0x5d,0x33, 0x6,0x5d,0x31, 0x5,0x46,0x22, 0x4,0x43,0x60, 0x6,0x5d,0x2f, 0x6,0x5d,0x34, 0xf,0x48,0x2b, 0xf,0x48,0x2c, 0xf,0x48,0x2d, 0xf,0x48,0x2e, 0xf,0x48,0x2f, 0xf,0x48,0x33, 0xf,0x48,0x34, 0xf,0x48,0x35, 0xf,0x48,0x37, 0xf,0x48,0x38, 0xf,0x48,0x3a, 0xf,0x48,0x3b, 0xf,0x48,0x39, 0xf,0x48,0x3c, 0xf,0x48,0x3d, 0xf,0x48,0x3e, 0xf,0x48,0x3f, 0xf,0x48,0x40, 0xf,0x48,0x41, 0xf,0x48,0x42, 0xf,0x48,0x43, 0xf,0x48,0x44, 0xf,0x48,0x45, 0xf,0x48,0x47, 0xf,0x48,0x48, 0xf,0x48,0x49, 0xf,0x48,0x46, 0x6,0x5d,0x30, 0xf,0x48,0x36, 0x7,0x23,0x33, 0x7,0x23,0x38, 0x5,0x4d,0x3c, 0x4,0x4a,0x25, 0x7,0x23,0x3d, 0x7,0x23,0x37, 0x7,0x23,0x39, 0x4,0x49,0x7b, 0x4,0x49,0x78, 0x5,0x4d,0x3d, 0x5,0x4d,0x3b, 0x7,0x23,0x45, 0x4,0x49,0x7d, 0x7,0x2e,0x2f, 0x4,0x4a,0x21, 0x5,0x4d,0x41, 0x4,0x4a,0x26, 0x4,0x49,0x7c, 0x5,0x54,0x59, 0x7,0x2e,0x3c, 0x7,0x23,0x35, 0x7,0x23,0x34, 0x7,0x2e,0x2d, 0x7,0x2e,0x2b, 0x7,0x23,0x44, 0x7,0x2e,0x2c, 0x7,0x23,0x3c, 0x5,0x4d,0x40, 0x7,0x2e,0x2e, 0x5,0x4d,0x3f, 0x7,0x23,0x3b, 0x7,0x23,0x42, 0x7,0x23,0x43, 0x7,0x23,0x3e, 0x7,0x23,0x41, 0x4,0x49,0x77, 0xf,0x48,0x31, 0x7,0x23,0x32, 0x7,0x23,0x3f, 0x7,0x23,0x40, 0xf,0x4e,0x7c, 0xf,0x4e,0x7d, 0xf,0x4e,0x7e, 0xf,0x4f,0x21, 0xf,0x4f,0x22, 0xf,0x4f,0x23, 0xf,0x4f,0x26, 0xf,0x4f,0x27, 0xf,0x4f,0x28, 0xf,0x4f,0x29, 0xf,0x4f,0x2a, 0xf,0x4f,0x2b, 0xf,0x4f,0x2d, 0xf,0x4f,0x2e, 0xf,0x4f,0x2f, 0xf,0x4f,0x30, 0xf,0x54,0x5f, 0xf,0x4f,0x24, 0x4,0x56,0x38, 0x4,0x50,0x41, 0x7,0x2e,0x35, 0x7,0x2e,0x30, 0x5,0x54,0x5a, 0x5,0x54,0x5b, 0x7,0x2e,0x3e, 0x7,0x2e,0x3a, 0x7,0x2e,0x32, 0x7,0x23,0x36, 0x4,0x50,0x3e, 0x4,0x50,0x43, 0x4,0x50,0x40, 0x5,0x54,0x5d, 0x4,0x50,0x3f, 0x7,0x2e,0x3d, 0x4,0x50,0x46, 0x7,0x2e,0x3b, 0x4,0x50,0x48, 0x4,0x50,0x42, 0x4,0x50,0x47, 0x7,0x2e,0x39, 0x7,0x2e,0x31, 0x7,0x2e,0x40, 0x7,0x38,0x29, 0x7,0x2e,0x38, 0x5,0x54,0x5f, 0x5,0x54,0x5c, 0x7,0x2e,0x37, 0x7,0x38,0x28, 0x7,0x2e,0x33, 0x7,0x2e,0x3f, 0xf,0x54,0x55, 0xf,0x54,0x56, 0xf,0x54,0x57, 0xf,0x54,0x58, 0xf,0x54,0x59, 0xf,0x54,0x5a, 0xf,0x54,0x5b, 0xf,0x54,0x5c, 0xf,0x54,0x5d, 0xf,0x54,0x5e, 0xf,0x54,0x60, 0x7,0x2e,0x34, 0x7,0x2e,0x36, 0x4,0x50,0x44, 0xf,0x54,0x54, 0x5,0x5b,0x56, 0x7,0x38,0x31, 0x5,0x5b,0x57, 0x7,0x38,0x36, 0x4,0x56,0x3b, 0x7,0x38,0x2f, 0x7,0x38,0x35, 0x4,0x56,0x3a, 0x7,0x38,0x34, 0x7,0x38,0x2c, 0x5,0x5b,0x58, 0x4,0x56,0x37, 0x5,0x5b,0x55, 0x7,0x38,0x2a, 0x7,0x38,0x37, 0x7,0x38,0x30, 0x7,0x38,0x2e, 0x7,0x38,0x32, 0x7,0x38,0x38, 0x7,0x38,0x2b, 0x7,0x38,0x2d, 0xf,0x5a,0x30, 0xf,0x5a,0x31, 0xf,0x5a,0x32, 0xf,0x5a,0x33, 0xf,0x5a,0x34, 0xf,0x5a,0x35, 0x7,0x38,0x33, 0x4,0x5b,0x33, 0x4,0x5b,0x38, 0x5,0x61,0x6e, 0x5,0x61,0x6b, 0x5,0x61,0x6c, 0x5,0x61,0x6d, 0x7,0x3f,0x68, 0x7,0x3f,0x67, 0x4,0x5b,0x35, 0x4,0x5b,0x37, 0x5,0x67,0x7a, 0x5,0x6c,0x2d, 0x7,0x3f,0x69, 0x7,0x3f,0x66, 0x4,0x5b,0x34, 0x7,0x3f,0x63, 0x7,0x3f,0x65, 0x7,0x47,0x2f, 0x7,0x3f,0x61, 0x7,0x3f,0x64, 0xf,0x5e,0x68, 0xf,0x5e,0x69, 0xf,0x5e,0x6a, 0xf,0x5e,0x6d, 0xf,0x5e,0x6e, 0xf,0x5e,0x6f, 0xf,0x5e,0x71, 0xf,0x5e,0x72, 0xf,0x5e,0x74, 0xf,0x5e,0x6c, 0xf,0x5e,0x6b, 0x4,0x5f,0x66, 0x4,0x5f,0x68, 0x4,0x5f,0x67, 0x4,0x5f,0x69, 0x5,0x6c,0x2f, 0x7,0x47,0x32, 0x7,0x47,0x34, 0x7,0x47,0x36, 0x5,0x67,0x7b, 0x7,0x47,0x30, 0x5,0x6c,0x2e, 0x7,0x47,0x38, 0x4,0x5f,0x6b, 0x7,0x47,0x35, 0x7,0x47,0x33, 0x7,0x47,0x31, 0x4,0x5f,0x6a, 0x5,0x67,0x79, 0xf,0x62,0x3e, 0xf,0x62,0x3f, 0xf,0x62,0x40, 0xf,0x62,0x41, 0xf,0x62,0x42, 0xf,0x62,0x43, 0xf,0x62,0x44, 0xf,0x62,0x45, 0xf,0x62,0x46, 0xf,0x62,0x49, 0xf,0x65,0x2f, 0x7,0x3f,0x6a, 0x7,0x47,0x37, 0xf,0x62,0x47, 0x5,0x6c,0x32, 0x4,0x66,0x3f, 0x7,0x4d,0x6d, 0x4,0x63,0x48, 0x7,0x4d,0x6c, 0x4,0x63,0x49, 0x7,0x4d,0x70, 0x4,0x63,0x4a, 0x7,0x4d,0x6e, 0x5,0x6c,0x33, 0x5,0x6c,0x30, 0x5,0x6c,0x31, 0x7,0x4d,0x6f, 0xf,0x65,0x2d, 0xf,0x65,0x2e, 0xf,0x65,0x30, 0x7,0x53,0x44, 0x7,0x57,0x77, 0x4,0x66,0x41, 0x7,0x53,0x3f, 0x7,0x53,0x43, 0x7,0x53,0x42, 0x4,0x66,0x42, 0x5,0x73,0x45, 0x7,0x53,0x41, 0x7,0x53,0x40, 0xf,0x67,0x56, 0xf,0x67,0x57, 0xf,0x67,0x58, 0xf,0x67,0x59, 0x7,0x57,0x78, 0x7,0x57,0x79, 0x5,0x73,0x44, 0x5,0x73,0x47, 0x5,0x70,0x23, 0x7,0x57,0x7a, 0x5,0x73,0x42, 0x5,0x73,0x46, 0x7,0x57,0x7c, 0x7,0x5b,0x57, 0x7,0x53,0x3e, 0xf,0x69,0x43, 0xf,0x69,0x44, 0x5,0x73,0x43, 0x7,0x57,0x7b, 0x7,0x5b,0x58, 0xf,0x6a,0x54, 0xf,0x6a,0x55, 0xf,0x6a,0x56, 0x7,0x5e,0x6a, 0x5,0x77,0x5d, 0x7,0x5e,0x69, 0x4,0x6b,0x6b, 0x7,0x5e,0x6b, 0x5,0x77,0x5c, 0x7,0x5e,0x68, 0xf,0x6b,0x49, 0xf,0x6b,0x4a, 0xf,0x6b,0x4b, 0xf,0x6b,0x4c, 0x7,0x62,0x38, 0xf,0x6c,0x2a, 0xf,0x6c,0x2b, 0x4,0x6d,0x73, 0x7,0x63,0x53, 0xf,0x6c,0x61, 0x7,0x66,0x26, 0x4,0x22,0x77, 0x4,0x24,0x3d, 0x4,0x26,0x5a, 0xf,0x27,0x31, 0xf,0x27,0x32, 0xf,0x27,0x33, 0x6,0x31,0x58, 0x6,0x38,0x22, 0x5,0x2f,0x5c, 0x4,0x2d,0x3e, 0x6,0x38,0x21, 0x6,0x36,0x44, 0x6,0x40,0x39, 0x6,0x40,0x38, 0x6,0x49,0x4f, 0x6,0x49,0x4e, 0xf,0x3b,0x4c, 0xf,0x3b,0x4d, 0x5,0x38,0x75, 0x6,0x53,0x26, 0xf,0x41,0x6a, 0x6,0x53,0x27, 0x5,0x46,0x2d, 0x6,0x5d,0x40, 0x7,0x23,0x46, 0x7,0x23,0x47, 0x5,0x54,0x60, 0xf,0x54,0x61, 0x7,0x38,0x3b, 0x7,0x38,0x3a, 0x5,0x5b,0x59, 0x7,0x38,0x3c, 0x7,0x4d,0x71, 0x5,0x24,0x3f, 0x6,0x27,0x79, 0x5,0x24,0x40, 0x6,0x27,0x7a, 0x5,0x24,0x41, 0x6,0x27,0x78, 0x6,0x2b,0x68, 0x4,0x26,0x60, 0x5,0x26,0x42, 0x5,0x26,0x40, 0x4,0x26,0x5d, 0x6,0x2b,0x6c, 0x6,0x2b,0x66, 0x6,0x2b,0x6a, 0x6,0x2b,0x69, 0x6,0x2b,0x67, 0x5,0x26,0x3f, 0x5,0x26,0x41, 0x4,0x26,0x5c, 0x4,0x29,0x60, 0x6,0x31,0x59, 0x5,0x29,0x4c, 0x5,0x29,0x4b, 0x6,0x31,0x5c, 0x6,0x31,0x5e, 0x6,0x31,0x5d, 0x5,0x29,0x49, 0x5,0x29,0x4a, 0x4,0x29,0x5e, 0x4,0x29,0x5f, 0x6,0x31,0x5b, 0x6,0x38,0x23, 0x6,0x38,0x24, 0x6,0x38,0x26, 0x5,0x2d,0x72, 0x6,0x31,0x5f, 0x4,0x2d,0x45, 0x6,0x38,0x28, 0x5,0x2d,0x70, 0x6,0x38,0x2a, 0x5,0x2d,0x6f, 0x5,0x2d,0x74, 0x6,0x38,0x25, 0x5,0x2d,0x73, 0x5,0x2d,0x71, 0x6,0x38,0x29, 0x6,0x38,0x27, 0x4,0x2d,0x41, 0x5,0x32,0x6d, 0x6,0x40,0x40, 0x4,0x32,0x2e, 0x6,0x40,0x3a, 0x6,0x40,0x3b, 0x6,0x40,0x3d, 0x5,0x32,0x6f, 0x5,0x32,0x70, 0x4,0x32,0x30, 0x6,0x40,0x3e, 0x6,0x40,0x3c, 0x5,0x32,0x6b, 0x6,0x40,0x41, 0x4,0x32,0x31, 0x4,0x32,0x2a, 0x4,0x32,0x2d, 0x4,0x32,0x29, 0x5,0x32,0x6e, 0xf,0x35,0x31, 0xf,0x35,0x32, 0xf,0x35,0x33, 0xf,0x35,0x34, 0xf,0x35,0x35, 0x5,0x32,0x6a, 0x6,0x40,0x3f, 0x6,0x49,0x58, 0x5,0x39,0x22, 0x6,0x49,0x55, 0x4,0x37,0x7a, 0x4,0x37,0x7b, 0x6,0x49,0x59, 0x6,0x49,0x54, 0x6,0x49,0x5a, 0x5,0x38,0x76, 0x5,0x38,0x7e, 0x5,0x39,0x21, 0x5,0x38,0x7d, 0x5,0x38,0x77, 0x6,0x49,0x56, 0x5,0x38,0x7b, 0x6,0x49,0x51, 0x6,0x49,0x50, 0x6,0x49,0x53, 0x4,0x37,0x72, 0x4,0x37,0x73, 0x4,0x37,0x74, 0x5,0x38,0x78, 0x5,0x38,0x79, 0x5,0x32,0x6c, 0x6,0x49,0x52, 0x6,0x53,0x2f, 0x5,0x38,0x7a, 0x5,0x3f,0x57, 0x5,0x3f,0x5a, 0x5,0x3f,0x5c, 0x4,0x3d,0x57, 0x4,0x3d,0x5f, 0x6,0x53,0x2b, 0x6,0x53,0x2e, 0x6,0x53,0x29, 0x5,0x3f,0x5b, 0x6,0x53,0x30, 0x6,0x53,0x2d, 0x6,0x53,0x28, 0x4,0x3d,0x60, 0x5,0x3f,0x56, 0x6,0x53,0x31, 0x5,0x3f,0x59, 0x4,0x3d,0x5e, 0x4,0x3d,0x55, 0x4,0x3d,0x56, 0x4,0x3d,0x58, 0x5,0x3f,0x58, 0x6,0x53,0x2a, 0xf,0x41,0x6b, 0x6,0x53,0x2c, 0x5,0x32,0x71, 0x4,0x3d,0x5a, 0x6,0x55,0x60, 0x5,0x46,0x34, 0x6,0x5d,0x49, 0x5,0x46,0x32, 0x6,0x5d,0x41, 0x4,0x43,0x68, 0x5,0x46,0x31, 0x6,0x5d,0x42, 0x5,0x46,0x2f, 0x6,0x5d,0x46, 0x5,0x46,0x37, 0x5,0x46,0x35, 0x6,0x5d,0x47, 0x6,0x5d,0x45, 0x6,0x5d,0x44, 0x6,0x5d,0x48, 0x6,0x5d,0x43, 0x6,0x5d,0x4a, 0x5,0x46,0x33, 0x4,0x43,0x67, 0x5,0x46,0x36, 0x6,0x5d,0x4b, 0x5,0x48,0x25, 0x5,0x4d,0x42, 0x5,0x4d,0x47, 0x4,0x4a,0x2c, 0x7,0x23,0x4e, 0x7,0x23,0x49, 0x7,0x23,0x48, 0x5,0x4d,0x46, 0x7,0x23,0x52, 0x7,0x23,0x4f, 0x7,0x23,0x4d, 0x5,0x4d,0x45, 0x7,0x23,0x50, 0x5,0x4d,0x43, 0x5,0x4d,0x44, 0xf,0x4f,0x31, 0x7,0x23,0x4b, 0x7,0x23,0x4c, 0x7,0x23,0x4a, 0x4,0x50,0x4b, 0x7,0x2e,0x42, 0x7,0x2e,0x46, 0x7,0x2e,0x48, 0xf,0x54,0x62, 0x5,0x54,0x61, 0x7,0x2e,0x4b, 0x7,0x2e,0x47, 0x7,0x2e,0x49, 0x7,0x2e,0x41, 0x7,0x2e,0x45, 0x7,0x2e,0x4c, 0x5,0x54,0x63, 0x7,0x2e,0x4a, 0x4,0x50,0x4a, 0x5,0x54,0x64, 0x5,0x54,0x65, 0x5,0x54,0x66, 0xf,0x54,0x63, 0x7,0x2e,0x44, 0x5,0x54,0x62, 0x7,0x23,0x51, 0x5,0x54,0x67, 0x7,0x38,0x3e, 0x7,0x38,0x3d, 0x5,0x5b,0x5a, 0x5,0x5b,0x5e, 0x5,0x5b,0x5d, 0x4,0x56,0x3c, 0x4,0x56,0x3d, 0x5,0x5b,0x5b, 0xf,0x5a,0x37, 0xf,0x5a,0x38, 0x7,0x38,0x3f, 0x5,0x5b,0x5c, 0x5,0x61,0x70, 0x7,0x3f,0x6c, 0x5,0x61,0x6f, 0x4,0x5b,0x3b, 0x7,0x3f,0x6d, 0x7,0x3f,0x6e, 0x4,0x5b,0x39, 0x7,0x3f,0x6b, 0x5,0x68,0x21, 0x5,0x67,0x7e, 0x5,0x67,0x7c, 0x5,0x67,0x7d, 0xf,0x62,0x4a, 0x5,0x6c,0x34, 0x4,0x63,0x4d, 0x5,0x6c,0x35, 0x7,0x4d,0x72, 0x4,0x63,0x4b, 0x7,0x4d,0x75, 0x7,0x4d,0x74, 0x5,0x6c,0x36, 0x7,0x4d,0x76, 0x7,0x4d,0x77, 0x4,0x66,0x44, 0x5,0x70,0x25, 0x5,0x70,0x26, 0x5,0x73,0x48, 0xf,0x69,0x45, 0x7,0x5b,0x59, 0x5,0x75,0x6b, 0x4,0x6a,0x4a, 0x7,0x5b,0x5a, 0x4,0x6c,0x6f, 0xf,0x6c,0x62, 0xf,0x22,0x53, 0xf,0x24,0x46, 0x6,0x2b,0x6d, 0xf,0x2b,0x2d, 0xf,0x2b,0x2e, 0xf,0x2b,0x2f, 0x6,0x38,0x2d, 0x6,0x38,0x2e, 0xf,0x2f,0x65, 0x6,0x40,0x42, 0x6,0x40,0x44, 0xf,0x35,0x37, 0xf,0x35,0x38, 0x6,0x40,0x43, 0xf,0x3b,0x4e, 0x5,0x3f,0x5d, 0xf,0x41,0x6c, 0x6,0x53,0x32, 0xf,0x35,0x36, 0x5,0x4d,0x48, 0x7,0x23,0x54, 0x7,0x23,0x53, 0x5,0x4d,0x49, 0xf,0x4f,0x33, 0xf,0x4f,0x34, 0x5,0x4d,0x4a, 0x7,0x2e,0x4d, 0xf,0x5a,0x39, 0xf,0x5e,0x75, 0xf,0x62,0x4b, 0xf,0x67,0x5a, 0x7,0x5b,0x5b, 0x6,0x22,0x22, 0xf,0x27,0x34, 0x6,0x31,0x60, 0x4,0x2d,0x48, 0x5,0x2d,0x76, 0x5,0x2d,0x75, 0x6,0x38,0x2f, 0x5,0x32,0x72, 0xf,0x35,0x39, 0x6,0x40,0x46, 0x6,0x40,0x45, 0x6,0x49,0x5d, 0xf,0x40,0x32, 0x6,0x49,0x5b, 0x6,0x49,0x5c, 0x4,0x3d,0x61, 0x6,0x5d,0x4c, 0x5,0x3f,0x5e, 0xf,0x41,0x6d, 0x4,0x43,0x6a, 0x4,0x4a,0x2d, 0x7,0x23,0x55, 0x7,0x38,0x40, 0x4,0x5f,0x6c, 0x6,0x22,0x23, 0xf,0x24,0x47, 0x6,0x2b,0x6f, 0x6,0x2b,0x6e, 0x6,0x31,0x61, 0xf,0x2f,0x66, 0x4,0x32,0x32, 0x6,0x40,0x48, 0x6,0x40,0x47, 0x6,0x49,0x60, 0x6,0x49,0x64, 0x6,0x49,0x63, 0x5,0x39,0x23, 0x6,0x49,0x66, 0x6,0x49,0x5f, 0x6,0x49,0x5e, 0x6,0x49,0x62, 0x4,0x37,0x7c, 0x6,0x4c,0x3e, 0x6,0x49,0x65, 0x4,0x3d,0x62, 0x6,0x53,0x36, 0x6,0x53,0x34, 0x6,0x53,0x37, 0x5,0x3f,0x5f, 0x6,0x5d,0x4f, 0x6,0x5d,0x4e, 0x6,0x5d,0x50, 0x3,0x47,0x31, 0x4,0x4a,0x2f, 0x6,0x5d,0x4d, 0x5,0x4d,0x4c, 0x5,0x4d,0x4d, 0x7,0x2e,0x51, 0x7,0x2e,0x50, 0x7,0x2e,0x4f, 0x7,0x2e,0x52, 0x7,0x2e,0x4e, 0x4,0x50,0x4d, 0x7,0x38,0x41, 0x7,0x38,0x42, 0x7,0x3f,0x6f, 0x4,0x5b,0x3c, 0x7,0x3f,0x70, 0x7,0x3f,0x71, 0x7,0x47,0x39, 0xf,0x62,0x4c, 0x7,0x4d,0x78, 0x7,0x57,0x7d, 0x4,0x24,0x42, 0x6,0x27,0x7b, 0xf,0x27,0x35, 0xf,0x27,0x36, 0x5,0x29,0x4d, 0x6,0x31,0x64, 0x6,0x31,0x63, 0xf,0x2b,0x30, 0x6,0x31,0x62, 0x4,0x2d,0x4a, 0x5,0x2d,0x77, 0x6,0x38,0x31, 0x6,0x38,0x33, 0x6,0x38,0x35, 0xf,0x2f,0x67, 0xf,0x2f,0x68, 0xf,0x2f,0x69, 0xf,0x2f,0x6a, 0x6,0x38,0x32, 0x4,0x32,0x33, 0x4,0x32,0x35, 0x6,0x40,0x4a, 0xf,0x35,0x3a, 0xf,0x35,0x3b, 0x6,0x40,0x49, 0x6,0x49,0x69, 0x5,0x39,0x25, 0x5,0x39,0x24, 0x6,0x49,0x68, 0x6,0x49,0x6a, 0x6,0x49,0x67, 0xf,0x3b,0x4f, 0xf,0x3b,0x50, 0x6,0x53,0x38, 0x5,0x3f,0x60, 0x6,0x53,0x39, 0xf,0x41,0x6e, 0xf,0x41,0x6f, 0x5,0x46,0x38, 0x5,0x46,0x3a, 0x6,0x5d,0x52, 0x5,0x46,0x39, 0x7,0x23,0x56, 0xf,0x4f,0x35, 0x7,0x2e,0x53, 0x5,0x54,0x68, 0x7,0x38,0x43, 0x5,0x5b,0x5f, 0x7,0x3f,0x73, 0x5,0x61,0x71, 0x4,0x5b,0x3d, 0x7,0x3f,0x74, 0x7,0x3f,0x72, 0x7,0x47,0x3a, 0x7,0x53,0x45, 0x4,0x68,0x6d, 0x7,0x57,0x7e, 0x7,0x5e,0x6c, 0x7,0x60,0x70, 0x5,0x24,0x42, 0x5,0x29,0x4e, 0x5,0x2d,0x79, 0x5,0x2d,0x78, 0x4,0x37,0x7d, 0x6,0x49,0x6b, 0x6,0x53,0x3a, 0x6,0x53,0x3b, 0x4,0x3d,0x66, 0xf,0x4f,0x36, 0x6,0x23,0x2c, 0x6,0x23,0x2b, 0x6,0x24,0x7b, 0x5,0x22,0x73, 0x6,0x24,0x7a, 0x6,0x24,0x7c, 0xf,0x22,0x54, 0xf,0x24,0x4b, 0x6,0x27,0x7c, 0x6,0x27,0x7d, 0x6,0x28,0x25, 0x5,0x24,0x43, 0x6,0x28,0x22, 0x6,0x27,0x7e, 0x6,0x28,0x24, 0x6,0x28,0x23, 0x6,0x28,0x21, 0xf,0x24,0x48, 0xf,0x24,0x4a, 0xf,0x24,0x4c, 0x4,0x24,0x44, 0x5,0x26,0x48, 0x6,0x2b,0x74, 0x6,0x2b,0x73, 0x5,0x26,0x49, 0x6,0x2b,0x7d, 0x5,0x26,0x44, 0x6,0x2b,0x79, 0x5,0x26,0x47, 0x6,0x2b,0x7a, 0x6,0x2b,0x77, 0x5,0x26,0x46, 0x5,0x26,0x45, 0x6,0x2b,0x75, 0x6,0x2b,0x78, 0xf,0x27,0x37, 0xf,0x27,0x38, 0xf,0x27,0x39, 0xf,0x27,0x3a, 0xf,0x27,0x3b, 0xf,0x27,0x3c, 0xf,0x27,0x3d, 0x6,0x2b,0x71, 0x6,0x2b,0x7b, 0x6,0x2b,0x7c, 0x6,0x2b,0x72, 0x6,0x2b,0x76, 0x5,0x29,0x51, 0x6,0x31,0x65, 0x6,0x31,0x66, 0x5,0x29,0x50, 0x4,0x29,0x66, 0x6,0x31,0x68, 0x6,0x31,0x69, 0x4,0x29,0x68, 0xf,0x2b,0x31, 0xf,0x2b,0x32, 0x6,0x31,0x6a, 0xf,0x2b,0x35, 0xf,0x2b,0x36, 0x6,0x31,0x6e, 0x6,0x31,0x6c, 0x6,0x31,0x6b, 0x5,0x2d,0x7e, 0x6,0x38,0x3a, 0x5,0x2e,0x21, 0x5,0x2e,0x22, 0x5,0x2d,0x7b, 0x5,0x2e,0x23, 0x5,0x2d,0x7c, 0x5,0x2d,0x7a, 0x6,0x38,0x3e, 0x6,0x38,0x38, 0x6,0x38,0x3c, 0x5,0x2d,0x7d, 0x6,0x38,0x39, 0x6,0x38,0x3d, 0xf,0x2f,0x6b, 0xf,0x2f,0x6d, 0x6,0x38,0x3b, 0xf,0x2f,0x6c, 0x6,0x38,0x41, 0x6,0x38,0x3f, 0x5,0x32,0x73, 0x4,0x32,0x38, 0x4,0x38,0x21, 0x6,0x40,0x53, 0x4,0x32,0x3d, 0x6,0x40,0x4e, 0x6,0x40,0x4b, 0x6,0x40,0x4c, 0x6,0x40,0x50, 0x6,0x40,0x4d, 0x6,0x40,0x55, 0x5,0x32,0x75, 0x6,0x38,0x40, 0x6,0x40,0x54, 0x6,0x40,0x56, 0xf,0x35,0x3c, 0xf,0x35,0x3d, 0xf,0x35,0x3e, 0xf,0x35,0x3f, 0xf,0x35,0x40, 0xf,0x35,0x41, 0xf,0x35,0x42, 0xf,0x35,0x43, 0xf,0x35,0x44, 0xf,0x35,0x45, 0xf,0x35,0x46, 0xf,0x35,0x47, 0x6,0x40,0x52, 0x5,0x32,0x74, 0x6,0x49,0x71, 0x6,0x49,0x74, 0x4,0x32,0x3c, 0x5,0x3f,0x61, 0x5,0x39,0x2a, 0x6,0x49,0x6f, 0x5,0x39,0x27, 0x6,0x49,0x70, 0x5,0x39,0x29, 0x5,0x39,0x26, 0x6,0x49,0x6c, 0x6,0x49,0x6d, 0x4,0x38,0x23, 0x6,0x49,0x76, 0x5,0x39,0x2b, 0x4,0x38,0x27, 0x6,0x49,0x6e, 0x6,0x49,0x75, 0x6,0x49,0x77, 0xf,0x3b,0x51, 0xf,0x3b,0x53, 0xf,0x3b,0x54, 0xf,0x3b,0x56, 0xf,0x3b,0x57, 0xf,0x3b,0x59, 0xf,0x3b,0x5a, 0xf,0x3b,0x5c, 0xf,0x3b,0x5d, 0xf,0x3b,0x52, 0xf,0x3b,0x58, 0x4,0x38,0x26, 0x4,0x38,0x28, 0x6,0x49,0x72, 0x5,0x39,0x2c, 0x5,0x39,0x28, 0x6,0x53,0x43, 0x5,0x3f,0x63, 0x6,0x53,0x41, 0x6,0x5d,0x53, 0x6,0x53,0x42, 0x6,0x53,0x3f, 0x6,0x53,0x44, 0xf,0x46,0x39, 0xf,0x3b,0x5b, 0x6,0x53,0x3e, 0xf,0x41,0x70, 0xf,0x41,0x71, 0xf,0x41,0x73, 0xf,0x41,0x74, 0xf,0x41,0x75, 0xf,0x41,0x76, 0xf,0x41,0x77, 0xf,0x41,0x78, 0xf,0x41,0x79, 0xf,0x41,0x7a, 0xf,0x41,0x7b, 0xf,0x41,0x7d, 0x5,0x3d,0x55, 0x6,0x53,0x45, 0x6,0x53,0x40, 0x5,0x3f,0x64, 0x5,0x46,0x3b, 0x5,0x46,0x3f, 0x5,0x46,0x3d, 0x5,0x46,0x3e, 0x6,0x5d,0x56, 0x5,0x46,0x40, 0x5,0x46,0x43, 0x5,0x46,0x44, 0x4,0x43,0x6c, 0x5,0x46,0x42, 0x5,0x4d,0x4e, 0xf,0x48,0x4a, 0xf,0x48,0x4b, 0xf,0x48,0x4c, 0xf,0x48,0x4d, 0xf,0x48,0x4e, 0xf,0x48,0x4f, 0x6,0x5d,0x54, 0x5,0x46,0x3c, 0x6,0x5d,0x57, 0x6,0x5d,0x59, 0x6,0x5d,0x5a, 0x6,0x5d,0x55, 0x6,0x5d,0x58, 0x7,0x23,0x61, 0x7,0x23,0x5c, 0x7,0x23,0x5b, 0x7,0x23,0x5e, 0x5,0x4d,0x52, 0x5,0x4d,0x55, 0x7,0x23,0x5a, 0x7,0x23,0x57, 0x7,0x23,0x58, 0x7,0x23,0x62, 0xf,0x4f,0x37, 0xf,0x4f,0x39, 0xf,0x4f,0x3a, 0x5,0x4d,0x54, 0x7,0x23,0x60, 0xf,0x4e,0x30, 0x7,0x23,0x5d, 0x7,0x23,0x5f, 0x7,0x23,0x59, 0x5,0x4d,0x51, 0x5,0x54,0x69, 0x5,0x54,0x6b, 0x7,0x2e,0x57, 0x4,0x50,0x55, 0x7,0x2e,0x55, 0x7,0x2e,0x5b, 0x7,0x2e,0x59, 0x7,0x2e,0x5d, 0x4,0x50,0x54, 0x7,0x2e,0x5c, 0x7,0x2e,0x54, 0xf,0x54,0x65, 0xf,0x54,0x66, 0xf,0x54,0x67, 0xf,0x54,0x69, 0xf,0x54,0x6a, 0x7,0x2e,0x58, 0x5,0x4d,0x4f, 0x7,0x2d,0x62, 0xf,0x54,0x68, 0x7,0x2e,0x43, 0x5,0x54,0x6a, 0x7,0x2e,0x56, 0xf,0x4f,0x38, 0x7,0x38,0x47, 0x5,0x5b,0x60, 0x5,0x5b,0x61, 0x7,0x38,0x48, 0x5,0x5b,0x62, 0x7,0x38,0x45, 0x7,0x38,0x46, 0x7,0x38,0x49, 0xf,0x5a,0x3a, 0xf,0x5a,0x3b, 0xf,0x5a,0x3c, 0x7,0x38,0x44, 0xf,0x5a,0x3d, 0x4,0x5b,0x3e, 0x5,0x61,0x72, 0x5,0x61,0x73, 0x7,0x3f,0x75, 0xf,0x5e,0x76, 0xf,0x5e,0x77, 0xf,0x5e,0x78, 0xf,0x5e,0x79, 0xf,0x5e,0x7b, 0x7,0x3f,0x78, 0x5,0x68,0x23, 0x7,0x47,0x3d, 0x7,0x47,0x3c, 0x5,0x68,0x22, 0x5,0x68,0x24, 0x7,0x47,0x3b, 0x7,0x47,0x3e, 0xf,0x62,0x4d, 0x5,0x6c,0x37, 0xf,0x65,0x31, 0xf,0x65,0x32, 0x5,0x6b,0x6e, 0x7,0x4d,0x79, 0x7,0x53,0x46, 0x7,0x58,0x21, 0xf,0x69,0x46, 0x5,0x73,0x39, 0x5,0x73,0x49, 0x7,0x5b,0x5c, 0x5,0x77,0x5e, 0x7,0x5e,0x6d, 0xf,0x6b,0x4d, 0x5,0x79,0x2b, 0x7,0x64,0x47, 0xf,0x24,0x4d, 0x6,0x2b,0x7e, 0xf,0x27,0x3f, 0xf,0x27,0x40, 0x6,0x2c,0x21, 0x5,0x29,0x53, 0x5,0x29,0x52, 0x6,0x31,0x70, 0xf,0x2b,0x37, 0xf,0x2b,0x39, 0x6,0x31,0x6f, 0x6,0x38,0x42, 0xf,0x2f,0x6f, 0xf,0x2f,0x70, 0xf,0x2f,0x71, 0xf,0x2f,0x72, 0xf,0x2f,0x73, 0xf,0x35,0x49, 0xf,0x35,0x4a, 0xf,0x3b,0x5f, 0x6,0x49,0x7a, 0x6,0x49,0x79, 0x5,0x3f,0x65, 0x4,0x43,0x70, 0x6,0x53,0x46, 0x5,0x4d,0x57, 0x5,0x4d,0x56, 0x7,0x23,0x63, 0xf,0x54,0x6b, 0x5,0x5b,0x63, 0x7,0x3f,0x7a, 0x5,0x61,0x74, 0x7,0x3f,0x79, 0x7,0x3f,0x77, 0x4,0x5f,0x6d, 0x7,0x4d,0x7a, 0x7,0x4d,0x7b, 0x5,0x7b,0x3f, 0x7,0x66,0x3e, 0x6,0x23,0x2d, 0x6,0x24,0x7d, 0x5,0x24,0x44, 0x6,0x28,0x29, 0x6,0x28,0x27, 0x6,0x28,0x28, 0x6,0x28,0x26, 0x6,0x2c,0x22, 0x5,0x29,0x54, 0x4,0x29,0x69, 0x4,0x29,0x6a, 0xf,0x2b,0x3a, 0x6,0x31,0x71, 0x6,0x38,0x43, 0xf,0x35,0x4b, 0x5,0x32,0x76, 0x6,0x40,0x59, 0x6,0x40,0x5b, 0x6,0x49,0x7d, 0x6,0x49,0x7c, 0x6,0x40,0x5a, 0x5,0x39,0x2d, 0xf,0x39,0x46, 0xf,0x3b,0x61, 0xf,0x3b,0x62, 0x6,0x53,0x47, 0x5,0x3f,0x67, 0xf,0x3b,0x60, 0xf,0x41,0x7e, 0xf,0x42,0x21, 0x6,0x53,0x48, 0x6,0x5d,0x5d, 0x6,0x5d,0x5e, 0x7,0x23,0x64, 0x4,0x4a,0x34, 0x5,0x4d,0x59, 0x4,0x4a,0x33, 0xf,0x4f,0x3b, 0xf,0x4f,0x3c, 0x5,0x54,0x6e, 0x5,0x54,0x6c, 0x5,0x5b,0x64, 0x5,0x54,0x6d, 0xf,0x54,0x6d, 0xf,0x54,0x6e, 0x7,0x38,0x4b, 0x7,0x38,0x4a, 0xf,0x5a,0x3e, 0x5,0x61,0x75, 0xf,0x5e,0x7c, 0x7,0x3f,0x7b, 0x5,0x6c,0x38, 0x5,0x75,0x6f, 0x5,0x77,0x5f, 0x5,0x21,0x48, 0x4,0x21,0x4e, 0x4,0x21,0x7d, 0xf,0x21,0x65, 0x5,0x22,0x75, 0x6,0x25,0x22, 0x5,0x22,0x74, 0x6,0x24,0x7e, 0x6,0x25,0x21, 0xf,0x22,0x56, 0x4,0x22,0x7b, 0x4,0x22,0x7a, 0x6,0x28,0x2c, 0x4,0x24,0x49, 0x6,0x28,0x2a, 0x6,0x28,0x2b, 0xf,0x24,0x4e, 0xf,0x24,0x4f, 0xf,0x24,0x54, 0xf,0x24,0x50, 0xf,0x24,0x52, 0x5,0x24,0x46, 0x6,0x28,0x2d, 0x5,0x24,0x45, 0x4,0x24,0x45, 0x4,0x26,0x6b, 0x5,0x26,0x4c, 0x4,0x26,0x66, 0x5,0x26,0x4b, 0x6,0x2c,0x2b, 0x5,0x26,0x50, 0x5,0x26,0x52, 0x6,0x2c,0x28, 0x6,0x2c,0x27, 0x6,0x2c,0x26, 0x5,0x26,0x4d, 0x5,0x26,0x53, 0x5,0x26,0x4f, 0x5,0x26,0x4e, 0xf,0x27,0x43, 0xf,0x27,0x45, 0xf,0x27,0x46, 0xf,0x27,0x47, 0xf,0x27,0x49, 0xf,0x27,0x4a, 0xf,0x27,0x4b, 0xf,0x27,0x4d, 0xf,0x27,0x4f, 0xf,0x27,0x51, 0xf,0x27,0x54, 0xf,0x27,0x55, 0x6,0x2c,0x24, 0x6,0x2c,0x29, 0x5,0x26,0x54, 0x6,0x2c,0x2c, 0xf,0x27,0x44, 0x6,0x2c,0x2d, 0x6,0x2c,0x2a, 0xf,0x27,0x48, 0xf,0x27,0x42, 0x6,0x2c,0x25, 0x5,0x26,0x55, 0x6,0x2d,0x5c, 0x6,0x31,0x74, 0x6,0x31,0x73, 0x4,0x29,0x6b, 0x5,0x29,0x56, 0x6,0x31,0x75, 0x6,0x31,0x76, 0x5,0x29,0x55, 0x5,0x29,0x59, 0x6,0x31,0x77, 0x5,0x2e,0x26, 0x5,0x29,0x5a, 0x5,0x29,0x58, 0xf,0x27,0x53, 0xf,0x2b,0x3b, 0xf,0x2b,0x3c, 0xf,0x2b,0x3d, 0xf,0x2b,0x3f, 0xf,0x2b,0x40, 0xf,0x2b,0x41, 0xf,0x2b,0x42, 0xf,0x2b,0x43, 0xf,0x2b,0x44, 0xf,0x2b,0x45, 0xf,0x2b,0x46, 0xf,0x2b,0x47, 0xf,0x2b,0x49, 0xf,0x2b,0x4a, 0xf,0x2b,0x4b, 0xf,0x2b,0x4c, 0xf,0x2b,0x4d, 0xf,0x2b,0x4e, 0xf,0x2b,0x4f, 0x5,0x29,0x5b, 0x6,0x40,0x5c, 0x6,0x38,0x4f, 0x6,0x38,0x53, 0x6,0x38,0x4b, 0x6,0x38,0x4d, 0x6,0x38,0x46, 0x5,0x2e,0x27, 0x6,0x38,0x48, 0x6,0x38,0x45, 0x6,0x38,0x51, 0x4,0x2d,0x50, 0x6,0x40,0x5d, 0x5,0x29,0x57, 0x5,0x2e,0x29, 0x5,0x2e,0x2a, 0x6,0x38,0x44, 0xf,0x2f,0x74, 0xf,0x2f,0x75, 0xf,0x2f,0x76, 0xf,0x2f,0x78, 0xf,0x2f,0x79, 0xf,0x2f,0x7a, 0xf,0x2f,0x7b, 0xf,0x2f,0x7c, 0xf,0x2f,0x7d, 0xf,0x2f,0x7e, 0xf,0x30,0x21, 0xf,0x30,0x22, 0xf,0x30,0x23, 0xf,0x30,0x25, 0xf,0x30,0x26, 0xf,0x30,0x27, 0xf,0x30,0x29, 0xf,0x30,0x2a, 0xf,0x30,0x2b, 0xf,0x30,0x2c, 0xf,0x30,0x2e, 0x6,0x38,0x4c, 0x6,0x38,0x47, 0x6,0x38,0x49, 0x4,0x2d,0x53, 0x6,0x38,0x4e, 0xf,0x30,0x30, 0xf,0x30,0x28, 0x4,0x2d,0x5a, 0xf,0x30,0x2d, 0x5,0x2e,0x2c, 0x5,0x2e,0x28, 0xf,0x2f,0x77, 0x6,0x38,0x52, 0x6,0x40,0x68, 0x6,0x40,0x69, 0x6,0x40,0x5f, 0x5,0x32,0x77, 0x5,0x33,0x21, 0x5,0x39,0x36, 0x4,0x32,0x45, 0x4,0x32,0x40, 0x5,0x32,0x7d, 0x6,0x40,0x67, 0x6,0x4a,0x2e, 0x6,0x40,0x63, 0xf,0x35,0x4c, 0xf,0x35,0x4d, 0xf,0x35,0x4f, 0xf,0x35,0x50, 0xf,0x35,0x51, 0xf,0x35,0x52, 0xf,0x35,0x53, 0xf,0x35,0x54, 0xf,0x35,0x55, 0xf,0x35,0x56, 0xf,0x35,0x58, 0xf,0x35,0x59, 0xf,0x35,0x5a, 0xf,0x35,0x5b, 0xf,0x35,0x5c, 0xf,0x35,0x5d, 0xf,0x35,0x5e, 0xf,0x35,0x5f, 0xf,0x35,0x60, 0xf,0x35,0x61, 0xf,0x35,0x62, 0xf,0x35,0x63, 0xf,0x35,0x65, 0xf,0x35,0x66, 0x6,0x40,0x64, 0x6,0x40,0x66, 0x6,0x40,0x65, 0x4,0x32,0x47, 0x6,0x40,0x62, 0x6,0x40,0x60, 0x6,0x40,0x61, 0x4,0x32,0x44, 0x5,0x33,0x22, 0x5,0x32,0x78, 0x5,0x32,0x7b, 0x5,0x32,0x7a, 0x5,0x32,0x7c, 0x6,0x40,0x6a, 0xf,0x35,0x4e, 0x6,0x40,0x5e, 0x4,0x38,0x36, 0x6,0x4a,0x34, 0x5,0x39,0x35, 0x6,0x53,0x49, 0x4,0x38,0x2e, 0x5,0x39,0x38, 0x6,0x4a,0x22, 0x5,0x39,0x32, 0x4,0x38,0x2b, 0x5,0x39,0x30, 0x5,0x39,0x34, 0x4,0x38,0x31, 0x6,0x4a,0x2d, 0x6,0x4a,0x2f, 0x5,0x39,0x3a, 0x6,0x4a,0x24, 0x6,0x4a,0x21, 0x5,0x39,0x37, 0x6,0x4a,0x33, 0x5,0x39,0x3c, 0x5,0x39,0x3b, 0x6,0x4a,0x26, 0x4,0x38,0x30, 0x6,0x4a,0x27, 0x6,0x4a,0x2a, 0x6,0x4a,0x31, 0x5,0x39,0x40, 0x6,0x53,0x4a, 0x5,0x39,0x3d, 0x6,0x4a,0x38, 0x6,0x4a,0x23, 0x6,0x4a,0x25, 0x6,0x4a,0x35, 0x4,0x38,0x33, 0x4,0x38,0x38, 0x6,0x4a,0x36, 0x6,0x4a,0x37, 0xf,0x3b,0x64, 0xf,0x3b,0x65, 0xf,0x3b,0x67, 0xf,0x3b,0x68, 0xf,0x3b,0x69, 0xf,0x3b,0x6b, 0xf,0x3b,0x6c, 0xf,0x3b,0x6d, 0xf,0x3b,0x6f, 0xf,0x3b,0x71, 0xf,0x3b,0x72, 0xf,0x3b,0x74, 0xf,0x3b,0x75, 0xf,0x3b,0x76, 0xf,0x3b,0x77, 0xf,0x3b,0x78, 0xf,0x3b,0x79, 0xf,0x3b,0x7a, 0xf,0x3b,0x7b, 0xf,0x3b,0x7c, 0xf,0x3b,0x7d, 0xf,0x3b,0x7e, 0xf,0x3c,0x22, 0xf,0x3c,0x23, 0xf,0x3c,0x24, 0xf,0x3c,0x25, 0xf,0x3c,0x26, 0xf,0x3c,0x27, 0xf,0x3c,0x28, 0xf,0x3c,0x2a, 0xf,0x3c,0x2b, 0xf,0x3c,0x2c, 0xf,0x3c,0x2d, 0xf,0x3c,0x2e, 0xf,0x3c,0x2f, 0x6,0x4a,0x29, 0x6,0x4a,0x2b, 0x6,0x4a,0x2c, 0x6,0x4a,0x32, 0x5,0x39,0x42, 0x6,0x4a,0x30, 0x6,0x4a,0x39, 0x6,0x4a,0x28, 0x5,0x39,0x3e, 0x5,0x39,0x41, 0x5,0x39,0x2e, 0x5,0x39,0x2f, 0x5,0x39,0x31, 0x6,0x53,0x4e, 0x6,0x53,0x58, 0x4,0x3d,0x77, 0x6,0x53,0x56, 0x4,0x3d,0x74, 0x6,0x53,0x57, 0x5,0x3f,0x6f, 0x5,0x3f,0x6a, 0x5,0x3f,0x6e, 0x5,0x3f,0x6b, 0x4,0x3d,0x6a, 0x6,0x53,0x5b, 0x5,0x3f,0x73, 0x6,0x53,0x61, 0x5,0x3f,0x68, 0x4,0x3d,0x7a, 0x5,0x3f,0x74, 0x5,0x3f,0x69, 0x6,0x53,0x55, 0x5,0x3f,0x70, 0x5,0x3f,0x6d, 0x6,0x53,0x60, 0x4,0x3d,0x73, 0x6,0x53,0x59, 0x6,0x53,0x5a, 0x6,0x53,0x5d, 0x6,0x53,0x50, 0x4,0x3d,0x70, 0x6,0x53,0x5c, 0x5,0x3f,0x6c, 0x6,0x53,0x63, 0x6,0x53,0x4f, 0x6,0x53,0x51, 0x6,0x53,0x4c, 0xf,0x42,0x23, 0xf,0x42,0x24, 0xf,0x42,0x25, 0xf,0x42,0x26, 0xf,0x42,0x27, 0xf,0x42,0x29, 0xf,0x42,0x2a, 0xf,0x42,0x2b, 0xf,0x42,0x2c, 0xf,0x42,0x2d, 0xf,0x42,0x2e, 0xf,0x42,0x30, 0xf,0x42,0x31, 0xf,0x42,0x32, 0xf,0x42,0x33, 0xf,0x42,0x34, 0xf,0x42,0x35, 0xf,0x42,0x36, 0xf,0x42,0x38, 0xf,0x42,0x39, 0xf,0x42,0x3a, 0xf,0x42,0x3b, 0xf,0x42,0x3d, 0xf,0x42,0x3e, 0xf,0x42,0x3f, 0xf,0x42,0x40, 0xf,0x42,0x41, 0xf,0x42,0x42, 0xf,0x42,0x43, 0xf,0x42,0x44, 0xf,0x42,0x45, 0xf,0x42,0x46, 0xf,0x42,0x48, 0xf,0x42,0x4a, 0xf,0x42,0x4c, 0x6,0x53,0x4d, 0x6,0x53,0x52, 0x6,0x53,0x54, 0x4,0x3d,0x79, 0x6,0x53,0x62, 0x6,0x53,0x4b, 0x6,0x53,0x5f, 0xf,0x42,0x22, 0xf,0x42,0x2f, 0xf,0x42,0x37, 0x5,0x39,0x3f, 0x5,0x3f,0x72, 0x6,0x53,0x53, 0xf,0x43,0x74, 0x5,0x46,0x4e, 0xf,0x42,0x4b, 0x5,0x46,0x50, 0x4,0x43,0x7b, 0x4,0x43,0x72, 0x5,0x46,0x4d, 0x5,0x46,0x4f, 0x6,0x5d,0x69, 0x5,0x46,0x55, 0x5,0x46,0x52, 0x7,0x23,0x65, 0x6,0x53,0x64, 0x5,0x46,0x47, 0x6,0x5d,0x5f, 0x5,0x46,0x54, 0x5,0x46,0x46, 0x5,0x46,0x58, 0x6,0x5d,0x62, 0x5,0x46,0x4a, 0x5,0x46,0x53, 0x6,0x5d,0x63, 0x4,0x43,0x76, 0x5,0x46,0x48, 0x5,0x46,0x49, 0x6,0x5d,0x65, 0x5,0x46,0x4c, 0x5,0x46,0x51, 0xf,0x48,0x57, 0xf,0x48,0x58, 0xf,0x48,0x59, 0xf,0x48,0x5a, 0xf,0x48,0x5b, 0xf,0x48,0x5c, 0xf,0x48,0x5d, 0xf,0x48,0x5e, 0xf,0x48,0x5f, 0xf,0x48,0x60, 0xf,0x48,0x61, 0xf,0x48,0x62, 0xf,0x48,0x63, 0xf,0x48,0x64, 0xf,0x48,0x65, 0xf,0x48,0x66, 0xf,0x48,0x67, 0xf,0x48,0x68, 0xf,0x48,0x69, 0xf,0x48,0x6a, 0xf,0x48,0x6b, 0xf,0x48,0x6c, 0xf,0x48,0x6d, 0xf,0x48,0x6e, 0xf,0x48,0x6f, 0xf,0x48,0x71, 0xf,0x48,0x72, 0xf,0x48,0x73, 0xf,0x48,0x75, 0x3,0x47,0x4b, 0x6,0x5d,0x6a, 0x6,0x5d,0x67, 0x6,0x5d,0x6b, 0x6,0x5d,0x6c, 0x5,0x46,0x56, 0x5,0x46,0x57, 0xf,0x48,0x74, 0x6,0x5d,0x64, 0x6,0x5d,0x66, 0xf,0x48,0x50, 0xf,0x48,0x51, 0xf,0x48,0x53, 0xf,0x48,0x54, 0x6,0x5d,0x60, 0x6,0x5d,0x6d, 0x6,0x5d,0x61, 0xf,0x48,0x56, 0x7,0x23,0x68, 0x5,0x4d,0x67, 0x5,0x4d,0x5e, 0x4,0x4a,0x3b, 0x4,0x4a,0x47, 0x5,0x4d,0x5b, 0x4,0x4a,0x40, 0x7,0x23,0x71, 0x7,0x23,0x6c, 0x7,0x23,0x74, 0x5,0x4d,0x6b, 0x5,0x4d,0x65, 0x7,0x23,0x70, 0x4,0x4a,0x46, 0x5,0x4d,0x5f, 0x4,0x4a,0x3f, 0x5,0x4d,0x64, 0x4,0x4a,0x43, 0x4,0x4a,0x3e, 0x4,0x4a,0x35, 0x7,0x23,0x73, 0x5,0x4d,0x5c, 0x4,0x4a,0x4a, 0x5,0x4d,0x69, 0x7,0x23,0x6e, 0x5,0x4d,0x63, 0x5,0x4d,0x6a, 0x7,0x23,0x69, 0x4,0x4a,0x41, 0x5,0x4d,0x5d, 0x7,0x23,0x75, 0x4,0x4a,0x3c, 0x4,0x4a,0x45, 0x4,0x4a,0x49, 0x7,0x23,0x66, 0x7,0x23,0x6a, 0xf,0x4f,0x3d, 0xf,0x4f,0x3e, 0xf,0x4f,0x3f, 0xf,0x4f,0x43, 0xf,0x4f,0x44, 0xf,0x4f,0x46, 0xf,0x4f,0x47, 0xf,0x4f,0x48, 0xf,0x4f,0x49, 0xf,0x4f,0x4a, 0xf,0x4f,0x4b, 0xf,0x4f,0x4c, 0xf,0x4f,0x4d, 0xf,0x4f,0x4e, 0xf,0x4f,0x4f, 0xf,0x4f,0x50, 0xf,0x4f,0x51, 0xf,0x4f,0x52, 0xf,0x4f,0x53, 0xf,0x4f,0x40, 0x7,0x23,0x6b, 0x5,0x4d,0x6c, 0x5,0x4d,0x68, 0x5,0x4d,0x66, 0x7,0x23,0x67, 0x7,0x23,0x6d, 0x5,0x4d,0x60, 0x5,0x4d,0x5a, 0x5,0x4d,0x62, 0x4,0x50,0x5b, 0x5,0x54,0x7d, 0x7,0x2e,0x69, 0x4,0x50,0x65, 0x4,0x50,0x58, 0x5,0x5b,0x65, 0x7,0x38,0x4c, 0x7,0x2e,0x60, 0x7,0x2e,0x63, 0x5,0x54,0x7b, 0x7,0x2e,0x68, 0x7,0x2e,0x72, 0x5,0x54,0x7a, 0x7,0x2e,0x6f, 0x7,0x2e,0x62, 0x4,0x50,0x62, 0x4,0x56,0x4c, 0x4,0x50,0x57, 0x7,0x2e,0x5f, 0x4,0x50,0x5f, 0x5,0x54,0x79, 0x7,0x2e,0x67, 0x7,0x2e,0x64, 0x5,0x54,0x71, 0x5,0x54,0x77, 0x4,0x50,0x5c, 0x7,0x2e,0x6e, 0x7,0x2e,0x74, 0x5,0x54,0x78, 0x4,0x50,0x5d, 0x7,0x2e,0x66, 0x7,0x2e,0x6b, 0x4,0x50,0x63, 0x5,0x54,0x70, 0x7,0x2e,0x61, 0x5,0x61,0x7b, 0x5,0x54,0x75, 0x5,0x54,0x76, 0x5,0x54,0x72, 0x4,0x4a,0x44, 0x7,0x2e,0x73, 0x7,0x2e,0x6c, 0x7,0x2e,0x65, 0x7,0x2e,0x5e, 0x5,0x54,0x7c, 0x5,0x54,0x6f, 0x5,0x54,0x73, 0xf,0x54,0x6f, 0xf,0x54,0x70, 0xf,0x54,0x71, 0xf,0x54,0x72, 0xf,0x54,0x73, 0xf,0x54,0x75, 0xf,0x54,0x76, 0xf,0x54,0x77, 0xf,0x54,0x78, 0xf,0x54,0x79, 0xf,0x54,0x7a, 0xf,0x54,0x7c, 0xf,0x54,0x7d, 0xf,0x54,0x7e, 0xf,0x55,0x21, 0xf,0x55,0x22, 0xf,0x55,0x24, 0xf,0x55,0x25, 0xf,0x55,0x26, 0xf,0x55,0x27, 0xf,0x55,0x28, 0xf,0x55,0x2b, 0xf,0x55,0x2c, 0xf,0x55,0x2d, 0xf,0x55,0x2e, 0xf,0x55,0x2f, 0xf,0x55,0x30, 0xf,0x55,0x32, 0xf,0x55,0x33, 0xf,0x55,0x34, 0xf,0x55,0x35, 0xf,0x55,0x36, 0xf,0x55,0x37, 0xf,0x55,0x38, 0x7,0x2e,0x70, 0x7,0x2e,0x71, 0x4,0x50,0x61, 0xf,0x55,0x23, 0x5,0x54,0x74, 0xf,0x48,0x70, 0xf,0x4f,0x41, 0x7,0x2e,0x6d, 0x4,0x56,0x43, 0x7,0x38,0x50, 0x7,0x38,0x4e, 0x4,0x56,0x47, 0x7,0x38,0x52, 0x7,0x38,0x56, 0x5,0x5b,0x6a, 0x5,0x5b,0x6b, 0x4,0x56,0x4a, 0x4,0x56,0x46, 0x5,0x5b,0x6e, 0x7,0x38,0x53, 0x5,0x5b,0x6c, 0x7,0x38,0x51, 0x7,0x38,0x57, 0x5,0x61,0x7c, 0x5,0x5b,0x67, 0x4,0x56,0x4d, 0x4,0x56,0x44, 0x7,0x38,0x59, 0x4,0x56,0x42, 0x5,0x5b,0x69, 0x7,0x38,0x5b, 0x5,0x5b,0x66, 0x7,0x38,0x54, 0xf,0x5a,0x40, 0xf,0x5a,0x41, 0xf,0x5a,0x43, 0xf,0x5a,0x44, 0xf,0x5a,0x45, 0xf,0x5a,0x46, 0xf,0x5a,0x47, 0xf,0x5a,0x48, 0xf,0x5a,0x49, 0xf,0x5a,0x4a, 0xf,0x5a,0x4b, 0xf,0x5a,0x4c, 0xf,0x5a,0x4e, 0xf,0x5a,0x4f, 0xf,0x5a,0x51, 0xf,0x5a,0x52, 0xf,0x5a,0x54, 0x7,0x38,0x58, 0x5,0x5b,0x6d, 0x7,0x38,0x5a, 0x7,0x38,0x4d, 0x7,0x38,0x4f, 0x7,0x37,0x27, 0xf,0x5a,0x53, 0xf,0x5a,0x4d, 0x5,0x5b,0x6f, 0x5,0x5b,0x70, 0xf,0x55,0x31, 0xf,0x5a,0x50, 0x4,0x5b,0x47, 0x5,0x61,0x78, 0x7,0x40,0x27, 0x7,0x40,0x23, 0x4,0x5b,0x42, 0x7,0x40,0x2b, 0x5,0x62,0x24, 0x5,0x61,0x7d, 0x5,0x62,0x26, 0x7,0x40,0x29, 0x4,0x5b,0x45, 0x5,0x61,0x7a, 0x5,0x62,0x22, 0x5,0x62,0x27, 0x5,0x61,0x7e, 0x7,0x38,0x5c, 0x5,0x62,0x2b, 0x5,0x61,0x79, 0x4,0x5b,0x43, 0x4,0x5b,0x4c, 0x4,0x5b,0x46, 0x7,0x40,0x2d, 0x7,0x40,0x28, 0x5,0x62,0x23, 0x7,0x47,0x46, 0x5,0x62,0x29, 0x7,0x40,0x26, 0x4,0x5b,0x4b, 0x5,0x62,0x28, 0x5,0x62,0x25, 0x5,0x61,0x76, 0x7,0x3f,0x7c, 0x7,0x3f,0x7d, 0xf,0x5e,0x7e, 0xf,0x5f,0x22, 0xf,0x5f,0x23, 0xf,0x5f,0x24, 0xf,0x5f,0x25, 0xf,0x5f,0x26, 0xf,0x5f,0x27, 0xf,0x5f,0x28, 0xf,0x5f,0x2a, 0xf,0x5f,0x2b, 0xf,0x5f,0x2c, 0xf,0x5f,0x2e, 0xf,0x5f,0x2f, 0xf,0x5f,0x30, 0x7,0x40,0x21, 0x7,0x40,0x25, 0x7,0x40,0x2c, 0x7,0x40,0x2a, 0x5,0x62,0x21, 0xf,0x5f,0x21, 0x5,0x62,0x2a, 0x5,0x61,0x77, 0x7,0x40,0x22, 0x7,0x40,0x24, 0xf,0x5f,0x2d, 0x5,0x68,0x25, 0x7,0x47,0x43, 0x5,0x68,0x28, 0x5,0x68,0x2b, 0x5,0x68,0x29, 0x7,0x47,0x42, 0x7,0x47,0x40, 0x5,0x68,0x2d, 0x7,0x47,0x41, 0x4,0x5f,0x74, 0x7,0x47,0x48, 0x7,0x47,0x49, 0x5,0x68,0x27, 0x5,0x68,0x26, 0x7,0x47,0x45, 0x5,0x68,0x2f, 0x7,0x47,0x47, 0x7,0x3f,0x7e, 0xf,0x62,0x52, 0xf,0x62,0x56, 0xf,0x62,0x58, 0xf,0x62,0x59, 0xf,0x62,0x5a, 0xf,0x62,0x5b, 0xf,0x62,0x5c, 0xf,0x62,0x5d, 0xf,0x62,0x5f, 0xf,0x62,0x60, 0xf,0x62,0x61, 0x5,0x68,0x2e, 0x7,0x47,0x44, 0x7,0x47,0x3f, 0xf,0x62,0x54, 0x5,0x68,0x2c, 0xf,0x62,0x57, 0xf,0x62,0x4f, 0xf,0x62,0x5e, 0xf,0x5e,0x7d, 0x4,0x63,0x53, 0x7,0x4d,0x7c, 0x5,0x6c,0x3f, 0x7,0x4d,0x7e, 0x5,0x6c,0x42, 0x5,0x68,0x30, 0x5,0x6c,0x3a, 0x5,0x6c,0x39, 0x5,0x6c,0x3d, 0x7,0x4d,0x7d, 0x5,0x6c,0x3c, 0x5,0x6c,0x41, 0x5,0x6c,0x3b, 0x5,0x68,0x2a, 0x5,0x6c,0x40, 0x5,0x6c,0x3e, 0xf,0x65,0x33, 0xf,0x65,0x34, 0xf,0x65,0x35, 0xf,0x65,0x36, 0xf,0x65,0x37, 0xf,0x65,0x39, 0xf,0x65,0x3a, 0xf,0x65,0x3b, 0xf,0x65,0x3c, 0xf,0x65,0x3d, 0xf,0x65,0x3f, 0x7,0x4e,0x21, 0x4,0x63,0x52, 0x7,0x53,0x49, 0x7,0x53,0x48, 0x5,0x70,0x2b, 0x5,0x70,0x2d, 0x4,0x66,0x46, 0x5,0x70,0x29, 0x7,0x53,0x4d, 0x5,0x70,0x28, 0x5,0x70,0x2a, 0x5,0x70,0x2c, 0x7,0x53,0x4a, 0x4,0x66,0x45, 0x5,0x70,0x2f, 0x7,0x53,0x4e, 0x5,0x70,0x32, 0xf,0x67,0x5b, 0xf,0x67,0x5c, 0xf,0x67,0x5d, 0xf,0x67,0x5e, 0xf,0x67,0x5f, 0xf,0x67,0x60, 0xf,0x67,0x61, 0xf,0x67,0x62, 0xf,0x67,0x63, 0xf,0x67,0x64, 0x7,0x53,0x4c, 0x5,0x70,0x31, 0x5,0x70,0x30, 0x7,0x53,0x4b, 0x5,0x70,0x2e, 0x7,0x58,0x26, 0x5,0x73,0x4e, 0x5,0x73,0x4f, 0x5,0x73,0x4c, 0x5,0x73,0x4a, 0x4,0x68,0x6f, 0x5,0x73,0x4b, 0x5,0x73,0x4d, 0x7,0x58,0x25, 0xf,0x69,0x47, 0xf,0x69,0x48, 0xf,0x69,0x49, 0xf,0x69,0x4b, 0xf,0x69,0x4e, 0xf,0x69,0x4f, 0xf,0x69,0x50, 0xf,0x69,0x51, 0x7,0x58,0x24, 0x7,0x58,0x22, 0xf,0x67,0x65, 0x5,0x75,0x71, 0x5,0x75,0x73, 0x5,0x77,0x60, 0x5,0x75,0x74, 0x7,0x5b,0x60, 0x5,0x75,0x72, 0x7,0x5b,0x61, 0x5,0x75,0x75, 0x7,0x5b,0x5f, 0x5,0x77,0x61, 0x7,0x5b,0x5d, 0xf,0x6a,0x57, 0xf,0x6a,0x59, 0x7,0x5b,0x5e, 0x5,0x75,0x76, 0x5,0x75,0x70, 0x4,0x6b,0x6c, 0x7,0x5e,0x6e, 0x5,0x77,0x62, 0x7,0x60,0x71, 0xf,0x6b,0x4e, 0xf,0x6b,0x4f, 0xf,0x6b,0x50, 0xf,0x6b,0x53, 0xf,0x6b,0x54, 0x7,0x5e,0x6f, 0x7,0x5e,0x70, 0xf,0x6a,0x58, 0x7,0x60,0x72, 0x5,0x79,0x2d, 0xf,0x6c,0x2c, 0x7,0x60,0x73, 0x5,0x79,0x2c, 0x5,0x79,0x2e, 0xf,0x6b,0x52, 0x5,0x7a,0x29, 0x7,0x63,0x54, 0x7,0x60,0x74, 0x4,0x6d,0x55, 0xf,0x6c,0x2d, 0xf,0x6c,0x4c, 0xf,0x6c,0x63, 0x7,0x63,0x4c, 0x7,0x63,0x55, 0x5,0x7b,0x40, 0x7,0x64,0x48, 0x7,0x64,0x49, 0x7,0x65,0x5b, 0xf,0x6d,0x2f, 0x7,0x65,0x74, 0x6,0x25,0x24, 0x4,0x24,0x4b, 0x6,0x28,0x2f, 0x6,0x2c,0x2e, 0x6,0x28,0x32, 0x5,0x24,0x47, 0x6,0x28,0x31, 0x4,0x24,0x4a, 0x5,0x26,0x5c, 0x5,0x26,0x5b, 0x5,0x26,0x58, 0x6,0x2c,0x2f, 0x4,0x26,0x6f, 0x6,0x2c,0x30, 0x5,0x26,0x5d, 0x4,0x26,0x6e, 0x5,0x26,0x59, 0x5,0x26,0x5a, 0x5,0x26,0x57, 0xf,0x27,0x56, 0x5,0x29,0x5f, 0x6,0x31,0x7a, 0x6,0x38,0x54, 0x6,0x31,0x7c, 0x5,0x29,0x62, 0x4,0x29,0x75, 0x5,0x29,0x61, 0x5,0x29,0x5e, 0x6,0x31,0x79, 0x5,0x29,0x5c, 0x5,0x29,0x60, 0x6,0x31,0x7b, 0x5,0x29,0x5d, 0xf,0x2c,0x77, 0x6,0x38,0x57, 0x6,0x38,0x58, 0x6,0x38,0x55, 0x5,0x2e,0x33, 0x5,0x2e,0x2d, 0x6,0x38,0x56, 0x6,0x40,0x6b, 0x5,0x2e,0x32, 0x4,0x2d,0x5f, 0x5,0x2e,0x2f, 0x5,0x2e,0x34, 0x5,0x2e,0x31, 0x5,0x2e,0x30, 0xf,0x30,0x31, 0x5,0x33,0x25, 0x6,0x40,0x6c, 0x6,0x40,0x6d, 0xf,0x35,0x67, 0xf,0x35,0x68, 0xf,0x35,0x69, 0xf,0x35,0x6a, 0xf,0x35,0x6b, 0xf,0x35,0x6c, 0xf,0x35,0x6d, 0xf,0x35,0x6e, 0x4,0x38,0x3d, 0x5,0x39,0x47, 0x5,0x3f,0x77, 0x4,0x38,0x3a, 0x5,0x39,0x45, 0x6,0x4a,0x3c, 0x5,0x33,0x24, 0x5,0x39,0x48, 0x6,0x4a,0x3d, 0x5,0x39,0x44, 0x5,0x39,0x49, 0x6,0x4a,0x3e, 0x5,0x39,0x46, 0x6,0x4a,0x3b, 0xf,0x3c,0x30, 0xf,0x3c,0x31, 0x6,0x4a,0x3a, 0x6,0x53,0x6e, 0x5,0x3f,0x76, 0x5,0x3f,0x75, 0x5,0x3f,0x7a, 0x6,0x53,0x6b, 0x5,0x3f,0x79, 0x6,0x53,0x67, 0x6,0x53,0x66, 0x6,0x53,0x68, 0x6,0x53,0x69, 0x6,0x53,0x6a, 0x6,0x53,0x6d, 0x5,0x3f,0x78, 0xf,0x42,0x4e, 0x6,0x58,0x5a, 0x6,0x53,0x6c, 0x6,0x53,0x65, 0xf,0x42,0x4d, 0x5,0x46,0x5c, 0x4,0x44,0x2b, 0x5,0x46,0x5e, 0x6,0x5d,0x6f, 0x6,0x5d,0x6e, 0x4,0x44,0x2c, 0x5,0x46,0x5d, 0x4,0x44,0x29, 0x6,0x5d,0x75, 0x6,0x5d,0x70, 0x5,0x46,0x5a, 0x6,0x5d,0x76, 0x6,0x5d,0x74, 0x5,0x46,0x5b, 0x6,0x5d,0x72, 0x6,0x5d,0x71, 0x6,0x5d,0x73, 0x6,0x53,0x6f, 0xf,0x48,0x76, 0xf,0x48,0x78, 0x5,0x46,0x59, 0x5,0x4d,0x6e, 0x7,0x23,0x7d, 0x5,0x4d,0x70, 0x5,0x4d,0x71, 0x4,0x4a,0x4d, 0x7,0x23,0x79, 0x7,0x23,0x77, 0x7,0x23,0x7e, 0x7,0x23,0x76, 0x7,0x23,0x7a, 0x7,0x23,0x7b, 0x5,0x4d,0x6f, 0xf,0x4f,0x54, 0x7,0x23,0x7c, 0x5,0x54,0x7e, 0x7,0x2e,0x76, 0x4,0x50,0x68, 0x7,0x2e,0x75, 0xf,0x55,0x3a, 0xf,0x55,0x3b, 0x7,0x38,0x5e, 0x7,0x38,0x60, 0x5,0x5b,0x71, 0x7,0x38,0x5f, 0xf,0x5a,0x55, 0x7,0x38,0x5d, 0x5,0x62,0x2c, 0x5,0x68,0x32, 0x5,0x68,0x31, 0xf,0x62,0x62, 0x5,0x70,0x36, 0x7,0x4e,0x23, 0x5,0x70,0x35, 0x5,0x70,0x34, 0x4,0x68,0x70, 0x5,0x70,0x33, 0x5,0x73,0x50, 0x7,0x58,0x29, 0x7,0x58,0x27, 0x7,0x58,0x28, 0x5,0x77,0x63, 0x7,0x60,0x75, 0x4,0x6c,0x70, 0x4,0x6d,0x56, 0x5,0x21,0x32, 0x5,0x21,0x70, 0x6,0x23,0x2e, 0x6,0x25,0x26, 0x5,0x24,0x4a, 0x6,0x28,0x34, 0x6,0x2c,0x31, 0x5,0x24,0x49, 0x5,0x24,0x4b, 0x6,0x28,0x33, 0x6,0x2c,0x3c, 0x6,0x2c,0x34, 0x6,0x2c,0x3b, 0x6,0x2c,0x3a, 0x6,0x2c,0x36, 0x6,0x2c,0x33, 0x6,0x2c,0x38, 0x6,0x2c,0x32, 0x6,0x2c,0x37, 0x5,0x26,0x5e, 0x6,0x2c,0x39, 0x6,0x2c,0x35, 0x5,0x26,0x5f, 0xf,0x27,0x57, 0xf,0x27,0x58, 0xf,0x27,0x59, 0x4,0x26,0x72, 0x4,0x29,0x76, 0x5,0x29,0x63, 0x5,0x28,0x35, 0x6,0x38,0x59, 0x6,0x38,0x5c, 0x5,0x2e,0x35, 0x6,0x38,0x5a, 0x6,0x38,0x5e, 0x6,0x38,0x5d, 0x6,0x38,0x5b, 0x6,0x37,0x48, 0x5,0x33,0x26, 0x6,0x40,0x70, 0xf,0x35,0x6f, 0x6,0x40,0x6f, 0x4,0x38,0x40, 0x4,0x38,0x3e, 0x5,0x39,0x4a, 0x5,0x39,0x4b, 0x6,0x4a,0x43, 0x4,0x38,0x41, 0x6,0x4a,0x42, 0x6,0x4a,0x44, 0x6,0x4a,0x40, 0x6,0x4a,0x45, 0x6,0x4a,0x46, 0x6,0x4a,0x41, 0x5,0x3f,0x7c, 0x6,0x53,0x70, 0x5,0x3f,0x7b, 0xf,0x42,0x4f, 0x6,0x5a,0x61, 0x7,0x24,0x22, 0x7,0x24,0x25, 0x7,0x24,0x23, 0x7,0x24,0x26, 0x7,0x24,0x21, 0x7,0x24,0x24, 0xf,0x4f,0x55, 0x7,0x2e,0x7a, 0x7,0x2e,0x79, 0x7,0x2e,0x77, 0x7,0x2e,0x78, 0x7,0x38,0x61, 0x4,0x56,0x50, 0xf,0x5a,0x56, 0xf,0x5a,0x57, 0x5,0x62,0x2d, 0x5,0x62,0x2e, 0x7,0x40,0x2e, 0x5,0x73,0x51, 0x7,0x5b,0x62, 0x7,0x5b,0x63, 0x5,0x21,0x71, 0x5,0x21,0x49, 0x5,0x22,0x76, 0x6,0x28,0x35, 0x4,0x22,0x7d, 0x6,0x25,0x27, 0x5,0x24,0x4c, 0x4,0x24,0x4d, 0x6,0x25,0x28, 0x6,0x28,0x36, 0x6,0x28,0x3b, 0x6,0x28,0x37, 0x4,0x24,0x4c, 0x6,0x28,0x3c, 0x5,0x24,0x4d, 0x6,0x28,0x39, 0x6,0x28,0x38, 0x6,0x28,0x3a, 0x6,0x2c,0x3f, 0x5,0x26,0x60, 0x5,0x26,0x66, 0x5,0x26,0x61, 0x5,0x26,0x64, 0x4,0x26,0x73, 0x4,0x26,0x74, 0x5,0x26,0x63, 0x4,0x26,0x77, 0x6,0x2c,0x3d, 0x6,0x2c,0x3e, 0x6,0x2c,0x40, 0x6,0x31,0x7d, 0x5,0x26,0x65, 0x5,0x29,0x68, 0x4,0x29,0x78, 0x4,0x29,0x79, 0x6,0x32,0x26, 0x4,0x29,0x77, 0x6,0x31,0x7e, 0x5,0x29,0x64, 0x5,0x29,0x65, 0x5,0x29,0x6b, 0x5,0x29,0x66, 0x5,0x29,0x67, 0x6,0x32,0x25, 0x4,0x29,0x7a, 0x6,0x32,0x22, 0x6,0x32,0x23, 0x5,0x29,0x6a, 0x6,0x32,0x24, 0x6,0x38,0x5f, 0xf,0x2b,0x50, 0x6,0x32,0x21, 0x5,0x29,0x6c, 0x5,0x2e,0x36, 0x4,0x2d,0x63, 0x6,0x38,0x62, 0x5,0x2e,0x3b, 0x6,0x38,0x65, 0x5,0x2e,0x3c, 0x5,0x2e,0x38, 0x5,0x2e,0x39, 0x6,0x38,0x63, 0x6,0x38,0x66, 0x5,0x2e,0x3d, 0x5,0x2e,0x37, 0x5,0x2e,0x3a, 0x5,0x2e,0x3e, 0x6,0x38,0x60, 0x6,0x38,0x61, 0x5,0x33,0x2b, 0x6,0x40,0x74, 0x5,0x33,0x2a, 0x6,0x40,0x73, 0x5,0x33,0x27, 0x5,0x33,0x28, 0x5,0x33,0x29, 0x6,0x40,0x71, 0x4,0x32,0x4b, 0x5,0x33,0x2c, 0x6,0x4a,0x49, 0x6,0x40,0x75, 0x6,0x40,0x72, 0xf,0x35,0x71, 0x6,0x53,0x72, 0x6,0x4a,0x4a, 0x5,0x39,0x53, 0x4,0x38,0x48, 0x6,0x4a,0x4b, 0x4,0x38,0x43, 0x5,0x39,0x4e, 0x5,0x39,0x4d, 0x5,0x39,0x4f, 0x4,0x38,0x47, 0x5,0x39,0x52, 0x5,0x39,0x54, 0x5,0x39,0x50, 0x5,0x39,0x4c, 0x5,0x39,0x51, 0x6,0x4a,0x4c, 0x6,0x53,0x71, 0x6,0x4a,0x48, 0xf,0x3c,0x32, 0x6,0x53,0x74, 0x6,0x53,0x79, 0x5,0x3f,0x7d, 0x5,0x3f,0x7e, 0x6,0x53,0x76, 0x6,0x53,0x78, 0x4,0x3e,0x25, 0x6,0x5d,0x78, 0x6,0x53,0x7a, 0x6,0x53,0x75, 0x6,0x53,0x73, 0xf,0x42,0x50, 0xf,0x35,0x70, 0x4,0x44,0x34, 0x4,0x44,0x2e, 0x6,0x5d,0x7b, 0x6,0x5d,0x7c, 0x4,0x44,0x2f, 0x6,0x5d,0x79, 0x6,0x5d,0x7a, 0x6,0x5d,0x2d, 0x7,0x24,0x29, 0x4,0x4a,0x51, 0x5,0x4d,0x72, 0x7,0x24,0x27, 0x5,0x4d,0x75, 0x7,0x24,0x28, 0x7,0x24,0x2b, 0x5,0x4d,0x74, 0x4,0x50,0x69, 0x7,0x24,0x2c, 0x7,0x24,0x2a, 0xf,0x4f,0x56, 0x5,0x4d,0x73, 0x7,0x2e,0x7b, 0x7,0x2e,0x7c, 0x5,0x55,0x21, 0x4,0x50,0x6c, 0x5,0x55,0x23, 0x5,0x55,0x22, 0x7,0x2e,0x7e, 0xf,0x55,0x3c, 0xf,0x55,0x3d, 0x7,0x38,0x64, 0x7,0x38,0x62, 0x5,0x5b,0x73, 0x7,0x38,0x65, 0x7,0x38,0x63, 0x5,0x5b,0x74, 0x5,0x62,0x30, 0x5,0x62,0x2f, 0x4,0x5b,0x4d, 0x7,0x40,0x30, 0x7,0x2e,0x7d, 0x5,0x5b,0x75, 0x7,0x40,0x2f, 0x5,0x68,0x33, 0x5,0x70,0x37, 0x5,0x70,0x38, 0x7,0x53,0x4f, 0x7,0x58,0x2a, 0x5,0x75,0x7a, 0x5,0x75,0x79, 0x5,0x26,0x68, 0x5,0x26,0x67, 0x6,0x32,0x27, 0x6,0x32,0x28, 0x5,0x2e,0x3f, 0x4,0x32,0x4c, 0x4,0x32,0x4d, 0x6,0x40,0x78, 0x6,0x40,0x79, 0x6,0x40,0x76, 0x6,0x40,0x77, 0xf,0x35,0x73, 0xf,0x35,0x75, 0xf,0x35,0x76, 0xf,0x35,0x77, 0x6,0x40,0x7b, 0x6,0x40,0x7a, 0x5,0x33,0x2d, 0x6,0x4a,0x4f, 0x6,0x4a,0x4e, 0xf,0x3c,0x33, 0xf,0x35,0x72, 0x6,0x54,0x21, 0x6,0x54,0x22, 0x6,0x53,0x7d, 0x6,0x53,0x7e, 0x6,0x54,0x24, 0xf,0x42,0x51, 0xf,0x42,0x52, 0x6,0x54,0x23, 0x6,0x53,0x7c, 0x5,0x40,0x21, 0x5,0x40,0x7b, 0x5,0x46,0x61, 0x4,0x44,0x36, 0x6,0x5e,0x21, 0x4,0x44,0x37, 0x6,0x5d,0x7e, 0x6,0x5d,0x7d, 0xf,0x48,0x7a, 0x5,0x4d,0x76, 0x6,0x5e,0x22, 0x7,0x24,0x2d, 0x4,0x4a,0x52, 0x7,0x2f,0x25, 0x7,0x2f,0x23, 0x7,0x2f,0x26, 0x7,0x2f,0x21, 0x7,0x2f,0x24, 0x5,0x55,0x24, 0x7,0x2f,0x22, 0xf,0x55,0x3e, 0xf,0x55,0x3f, 0xf,0x55,0x40, 0x7,0x38,0x66, 0x7,0x38,0x67, 0x4,0x5b,0x4e, 0x7,0x40,0x33, 0x5,0x62,0x32, 0x5,0x62,0x31, 0x7,0x40,0x31, 0x7,0x40,0x32, 0x4,0x5f,0x78, 0x7,0x47,0x4c, 0x7,0x4e,0x25, 0x7,0x47,0x4d, 0x7,0x53,0x50, 0x4,0x6a,0x4d, 0x5,0x75,0x7b, 0x7,0x5b,0x64, 0x5,0x73,0x52, 0x7,0x5e,0x73, 0x5,0x77,0x65, 0x5,0x77,0x64, 0x7,0x60,0x76, 0x7,0x63,0x56, 0x5,0x21,0x72, 0x6,0x28,0x3d, 0x6,0x2c,0x41, 0x6,0x32,0x29, 0x6,0x38,0x67, 0xf,0x3c,0x34, 0x5,0x40,0x22, 0x4,0x4a,0x53, 0xf,0x4f,0x57, 0xf,0x4f,0x58, 0xf,0x5a,0x59, 0xf,0x55,0x41, 0xf,0x62,0x63, 0xf,0x6a,0x5a, 0x5,0x24,0x4f, 0x6,0x28,0x3e, 0x6,0x2c,0x45, 0x6,0x2c,0x44, 0x5,0x26,0x69, 0x6,0x38,0x68, 0x6,0x38,0x6a, 0x6,0x38,0x69, 0x6,0x40,0x7c, 0x6,0x40,0x7d, 0x5,0x40,0x23, 0x4,0x3e,0x26, 0x5,0x46,0x62, 0x5,0x46,0x63, 0x6,0x5e,0x23, 0x7,0x24,0x2e, 0x7,0x2f,0x27, 0x7,0x2f,0x28, 0x5,0x55,0x25, 0x7,0x47,0x4e, 0x5,0x6c,0x43, 0x5,0x79,0x30, 0x5,0x21,0x4a, 0x4,0x22,0x7e, 0xf,0x22,0x5a, 0xf,0x22,0x5b, 0x6,0x28,0x40, 0x6,0x28,0x3f, 0x4,0x24,0x4e, 0xf,0x24,0x55, 0xf,0x24,0x56, 0xf,0x24,0x57, 0xf,0x24,0x59, 0xf,0x24,0x5a, 0x5,0x26,0x6d, 0x5,0x26,0x6a, 0x5,0x26,0x6c, 0x5,0x26,0x6b, 0x6,0x2c,0x47, 0x6,0x2c,0x46, 0xf,0x27,0x5a, 0xf,0x27,0x5c, 0xf,0x27,0x5d, 0xf,0x27,0x5e, 0xf,0x27,0x5f, 0x5,0x26,0x43, 0x6,0x32,0x2c, 0x5,0x29,0x6e, 0x5,0x29,0x6f, 0x5,0x29,0x6d, 0x5,0x29,0x70, 0x5,0x29,0x71, 0x6,0x32,0x2d, 0x5,0x29,0x73, 0x6,0x32,0x2f, 0x6,0x38,0x6d, 0x6,0x32,0x2e, 0x5,0x29,0x74, 0x6,0x32,0x2b, 0x5,0x29,0x72, 0xf,0x2b,0x51, 0xf,0x2b,0x52, 0xf,0x2b,0x53, 0xf,0x2b,0x54, 0xf,0x2b,0x55, 0xf,0x2b,0x56, 0xf,0x2b,0x57, 0xf,0x2b,0x58, 0xf,0x2b,0x59, 0xf,0x2b,0x5a, 0xf,0x2b,0x5b, 0xf,0x2b,0x5c, 0xf,0x2b,0x5e, 0xf,0x2b,0x5d, 0x6,0x38,0x6f, 0x5,0x2e,0x41, 0x6,0x38,0x6e, 0x4,0x2d,0x69, 0x5,0x2e,0x43, 0x4,0x2d,0x68, 0x6,0x38,0x6c, 0x5,0x2e,0x42, 0xf,0x30,0x32, 0xf,0x30,0x33, 0xf,0x30,0x34, 0xf,0x30,0x35, 0xf,0x30,0x36, 0xf,0x30,0x37, 0xf,0x30,0x38, 0xf,0x30,0x39, 0x6,0x38,0x6b, 0x5,0x2e,0x40, 0x6,0x41,0x26, 0x4,0x32,0x56, 0x6,0x41,0x21, 0x5,0x33,0x31, 0x6,0x41,0x22, 0x6,0x41,0x23, 0x5,0x33,0x2e, 0x6,0x41,0x25, 0x5,0x33,0x32, 0x5,0x33,0x30, 0x5,0x33,0x2f, 0x6,0x40,0x7e, 0x6,0x41,0x24, 0xf,0x35,0x78, 0xf,0x35,0x79, 0xf,0x35,0x7a, 0xf,0x35,0x7b, 0xf,0x35,0x7c, 0x5,0x39,0x55, 0x4,0x38,0x4d, 0x5,0x39,0x56, 0x4,0x38,0x50, 0x6,0x4a,0x51, 0x6,0x4a,0x53, 0x5,0x39,0x59, 0x5,0x39,0x58, 0x5,0x39,0x5a, 0x6,0x4a,0x56, 0x6,0x4a,0x50, 0x6,0x4a,0x55, 0x5,0x39,0x57, 0x6,0x4a,0x52, 0xf,0x3c,0x3a, 0xf,0x3c,0x35, 0xf,0x3c,0x37, 0xf,0x3c,0x38, 0xf,0x3c,0x39, 0xf,0x3c,0x3b, 0xf,0x3c,0x3d, 0xf,0x3c,0x3f, 0xf,0x3c,0x40, 0x6,0x4a,0x54, 0xf,0x3c,0x36, 0x5,0x39,0x5c, 0x6,0x54,0x2e, 0x6,0x54,0x2c, 0x4,0x3e,0x2b, 0x6,0x54,0x27, 0x6,0x54,0x2b, 0x4,0x3e,0x2a, 0x6,0x54,0x28, 0x6,0x54,0x25, 0x6,0x54,0x29, 0x6,0x54,0x26, 0x6,0x54,0x2d, 0x6,0x54,0x2a, 0x6,0x54,0x2f, 0x5,0x40,0x24, 0xf,0x42,0x53, 0xf,0x42,0x55, 0xf,0x42,0x56, 0xf,0x42,0x57, 0x6,0x54,0x30, 0x6,0x5e,0x29, 0x5,0x46,0x66, 0x5,0x46,0x65, 0x6,0x5e,0x2a, 0x6,0x5e,0x2b, 0x6,0x5e,0x2d, 0x4,0x44,0x3d, 0x6,0x5e,0x24, 0x4,0x44,0x3e, 0x5,0x46,0x67, 0x4,0x44,0x3b, 0x6,0x5e,0x2e, 0x6,0x5e,0x2f, 0x6,0x5e,0x26, 0x6,0x5e,0x27, 0xf,0x48,0x7c, 0xf,0x48,0x7d, 0xf,0x48,0x7e, 0xf,0x49,0x21, 0x6,0x5e,0x28, 0x5,0x46,0x69, 0x6,0x5e,0x30, 0x6,0x5e,0x25, 0x6,0x5e,0x2c, 0x4,0x4a,0x56, 0x7,0x24,0x33, 0x7,0x24,0x37, 0x7,0x24,0x35, 0x4,0x4a,0x55, 0x4,0x4a,0x54, 0x5,0x4d,0x79, 0x7,0x24,0x34, 0x5,0x4d,0x77, 0x5,0x4d,0x78, 0x7,0x24,0x31, 0x7,0x24,0x32, 0x7,0x24,0x30, 0x7,0x24,0x2f, 0x7,0x24,0x36, 0x7,0x24,0x38, 0x7,0x2f,0x29, 0x5,0x55,0x27, 0x7,0x2f,0x2a, 0x4,0x50,0x70, 0x5,0x55,0x26, 0x4,0x50,0x73, 0x7,0x2f,0x2c, 0xf,0x55,0x42, 0xf,0x55,0x43, 0xf,0x55,0x44, 0xf,0x55,0x45, 0x7,0x2f,0x2b, 0x7,0x24,0x39, 0x7,0x38,0x6a, 0x4,0x56,0x55, 0x4,0x56,0x54, 0x7,0x38,0x69, 0x5,0x5b,0x76, 0x7,0x38,0x68, 0xf,0x5a,0x5a, 0xf,0x5a,0x5b, 0xf,0x5a,0x5c, 0x7,0x38,0x6c, 0x7,0x38,0x6b, 0x5,0x62,0x35, 0x5,0x62,0x34, 0x5,0x62,0x36, 0x7,0x40,0x37, 0x7,0x47,0x4f, 0x7,0x40,0x35, 0x5,0x62,0x37, 0x7,0x40,0x34, 0x7,0x40,0x36, 0xf,0x5f,0x31, 0x5,0x62,0x33, 0xf,0x5f,0x32, 0x7,0x47,0x52, 0x5,0x68,0x34, 0x7,0x47,0x50, 0x7,0x47,0x51, 0xf,0x65,0x41, 0x7,0x4e,0x26, 0x4,0x66,0x47, 0x5,0x70,0x39, 0x7,0x53,0x51, 0xf,0x67,0x67, 0x7,0x58,0x2b, 0x5,0x73,0x53, 0xf,0x69,0x52, 0x5,0x75,0x7c, 0x7,0x5b,0x65, 0x7,0x64,0x4a, 0x6,0x2c,0x48, 0x6,0x32,0x30, 0x5,0x29,0x75, 0x5,0x29,0x76, 0x6,0x33,0x4c, 0x6,0x41,0x27, 0xf,0x35,0x7d, 0x6,0x41,0x28, 0x6,0x54,0x31, 0x4,0x44,0x40, 0x7,0x2f,0x2d, 0x7,0x38,0x6d, 0x4,0x5b,0x51, 0xf,0x5a,0x5d, 0x6,0x25,0x2a, 0x6,0x25,0x29, 0xf,0x24,0x5c, 0x6,0x2c,0x4b, 0x6,0x2c,0x4a, 0x6,0x2c,0x49, 0x6,0x32,0x31, 0x6,0x32,0x32, 0xf,0x2b,0x5f, 0x5,0x29,0x77, 0x5,0x2e,0x44, 0xf,0x35,0x7e, 0x5,0x39,0x5d, 0xf,0x3c,0x41, 0x6,0x54,0x32, 0x7,0x24,0x3b, 0x7,0x24,0x3a, 0x7,0x40,0x38, 0x7,0x53,0x52, 0xf,0x21,0x67, 0x6,0x22,0x24, 0x6,0x25,0x2b, 0x5,0x21,0x73, 0x6,0x25,0x2c, 0xf,0x22,0x5e, 0xf,0x24,0x69, 0x4,0x23,0x23, 0x6,0x25,0x2d, 0x5,0x24,0x50, 0x6,0x25,0x2f, 0x6,0x25,0x31, 0x3,0x24,0x24, 0xf,0x22,0x5c, 0xf,0x24,0x5f, 0xf,0x24,0x60, 0x6,0x25,0x30, 0x6,0x2c,0x4d, 0x5,0x24,0x52, 0x6,0x28,0x42, 0x5,0x24,0x51, 0x5,0x24,0x53, 0x4,0x24,0x50, 0x6,0x28,0x46, 0x6,0x28,0x47, 0x6,0x2c,0x4c, 0x6,0x28,0x43, 0x6,0x28,0x41, 0x6,0x28,0x45, 0x6,0x28,0x48, 0xf,0x24,0x61, 0xf,0x24,0x5e, 0xf,0x24,0x62, 0xf,0x24,0x63, 0xf,0x24,0x64, 0xf,0x24,0x65, 0xf,0x24,0x66, 0xf,0x24,0x67, 0xf,0x27,0x63, 0xf,0x27,0x64, 0xf,0x27,0x65, 0x4,0x27,0x23, 0x5,0x26,0x6f, 0x6,0x32,0x33, 0x5,0x26,0x72, 0x5,0x26,0x73, 0x4,0x27,0x21, 0x6,0x2c,0x57, 0x4,0x27,0x25, 0x6,0x2c,0x50, 0x4,0x27,0x24, 0x6,0x2c,0x4e, 0x5,0x26,0x6e, 0x5,0x26,0x70, 0x6,0x2c,0x58, 0x5,0x26,0x71, 0x6,0x2c,0x5a, 0x6,0x32,0x34, 0x6,0x2c,0x56, 0x6,0x2c,0x5c, 0x4,0x26,0x7c, 0x6,0x2c,0x53, 0xf,0x27,0x60, 0xf,0x27,0x61, 0xf,0x27,0x62, 0xf,0x27,0x67, 0xf,0x27,0x68, 0xf,0x27,0x69, 0xf,0x27,0x6a, 0xf,0x27,0x6b, 0xf,0x27,0x6d, 0xf,0x2b,0x64, 0xf,0x2b,0x67, 0xf,0x2b,0x6c, 0x6,0x2c,0x52, 0x6,0x2c,0x54, 0x6,0x2c,0x55, 0x6,0x2c,0x59, 0x6,0x2c,0x4f, 0x5,0x29,0x78, 0x4,0x29,0x7c, 0x6,0x32,0x36, 0x5,0x2a,0x22, 0x6,0x32,0x3b, 0x6,0x32,0x3e, 0x5,0x29,0x79, 0x4,0x2a,0x22, 0x4,0x2d,0x71, 0x5,0x2a,0x21, 0x5,0x29,0x7e, 0x6,0x32,0x3a, 0x6,0x32,0x40, 0x5,0x29,0x7a, 0x6,0x32,0x41, 0x5,0x29,0x7d, 0x6,0x38,0x70, 0x6,0x32,0x3d, 0x6,0x32,0x3c, 0x4,0x2a,0x23, 0x4,0x29,0x7d, 0x6,0x32,0x3f, 0xf,0x2b,0x60, 0xf,0x2b,0x61, 0xf,0x2b,0x62, 0xf,0x2b,0x63, 0xf,0x2b,0x65, 0xf,0x2b,0x66, 0xf,0x2b,0x68, 0xf,0x2b,0x69, 0xf,0x2b,0x6a, 0xf,0x2b,0x6b, 0xf,0x2b,0x6d, 0xf,0x2b,0x6e, 0xf,0x30,0x3a, 0xf,0x30,0x3d, 0xf,0x30,0x44, 0x6,0x32,0x38, 0x4,0x2a,0x24, 0x6,0x32,0x35, 0x6,0x32,0x37, 0x5,0x2a,0x23, 0xf,0x30,0x57, 0x4,0x2d,0x6e, 0x5,0x2e,0x49, 0x6,0x39,0x30, 0x6,0x39,0x2e, 0x5,0x2e,0x48, 0x5,0x2e,0x47, 0x6,0x38,0x7c, 0x5,0x2e,0x4a, 0x6,0x38,0x71, 0x6,0x38,0x7b, 0x4,0x2d,0x6d, 0x4,0x2d,0x6f, 0x6,0x39,0x25, 0x6,0x38,0x76, 0x6,0x39,0x26, 0x6,0x39,0x2a, 0x6,0x38,0x77, 0x6,0x39,0x29, 0x6,0x38,0x7e, 0x6,0x39,0x28, 0x6,0x41,0x2a, 0x6,0x41,0x29, 0x4,0x32,0x66, 0x6,0x39,0x24, 0x6,0x39,0x2c, 0x5,0x2e,0x45, 0x6,0x39,0x23, 0x6,0x38,0x73, 0x6,0x39,0x2b, 0x6,0x38,0x78, 0x6,0x39,0x2f, 0x6,0x39,0x32, 0x6,0x41,0x46, 0xf,0x30,0x3b, 0xf,0x30,0x3e, 0xf,0x30,0x3f, 0xf,0x30,0x40, 0xf,0x30,0x41, 0xf,0x30,0x42, 0xf,0x30,0x43, 0xf,0x30,0x45, 0xf,0x30,0x46, 0xf,0x30,0x47, 0xf,0x30,0x48, 0xf,0x30,0x4a, 0xf,0x30,0x4b, 0xf,0x30,0x4c, 0xf,0x30,0x4d, 0xf,0x30,0x4e, 0xf,0x30,0x4f, 0xf,0x30,0x50, 0xf,0x30,0x51, 0xf,0x30,0x52, 0xf,0x30,0x53, 0xf,0x30,0x54, 0xf,0x30,0x55, 0xf,0x30,0x56, 0xf,0x30,0x58, 0xf,0x30,0x59, 0xf,0x30,0x5a, 0x6,0x38,0x79, 0x6,0x39,0x22, 0x6,0x39,0x31, 0x4,0x2d,0x72, 0x6,0x39,0x27, 0x6,0x38,0x7d, 0x6,0x38,0x75, 0x5,0x2e,0x46, 0xf,0x36,0x2d, 0x4,0x32,0x5d, 0x5,0x33,0x40, 0x4,0x32,0x5b, 0x4,0x32,0x6b, 0x6,0x41,0x34, 0x6,0x41,0x38, 0x6,0x41,0x3c, 0x4,0x32,0x6a, 0x6,0x41,0x43, 0x4,0x32,0x61, 0x6,0x41,0x36, 0x4,0x32,0x65, 0x6,0x41,0x35, 0x6,0x41,0x45, 0x4,0x32,0x69, 0x5,0x33,0x33, 0x6,0x41,0x31, 0x4,0x32,0x60, 0x4,0x32,0x67, 0x6,0x4a,0x64, 0x5,0x33,0x3f, 0x6,0x41,0x42, 0x5,0x33,0x3e, 0x6,0x41,0x3f, 0x4,0x32,0x59, 0x4,0x32,0x5f, 0x6,0x41,0x2c, 0x4,0x25,0x2f, 0x6,0x41,0x3b, 0x6,0x41,0x30, 0x6,0x4a,0x66, 0x5,0x33,0x38, 0x5,0x33,0x41, 0x6,0x4a,0x58, 0x6,0x4a,0x59, 0x6,0x41,0x3e, 0x6,0x41,0x44, 0x5,0x33,0x36, 0x4,0x32,0x62, 0x6,0x41,0x40, 0x5,0x33,0x3b, 0x6,0x41,0x2f, 0x6,0x41,0x32, 0x5,0x33,0x3a, 0x5,0x33,0x35, 0x4,0x32,0x6c, 0x4,0x32,0x6e, 0x5,0x33,0x37, 0x6,0x41,0x3d, 0xf,0x36,0x21, 0xf,0x36,0x22, 0xf,0x36,0x23, 0xf,0x36,0x25, 0xf,0x36,0x26, 0xf,0x36,0x27, 0xf,0x36,0x28, 0xf,0x36,0x2a, 0xf,0x36,0x2c, 0xf,0x36,0x2e, 0xf,0x36,0x2f, 0xf,0x36,0x30, 0xf,0x36,0x31, 0xf,0x36,0x32, 0xf,0x36,0x36, 0xf,0x36,0x37, 0xf,0x36,0x38, 0xf,0x36,0x39, 0xf,0x36,0x3a, 0xf,0x36,0x3b, 0xf,0x36,0x3c, 0xf,0x36,0x3d, 0xf,0x3c,0x42, 0xf,0x3c,0x4b, 0xf,0x3c,0x4d, 0xf,0x3c,0x57, 0xf,0x42,0x5f, 0x6,0x4a,0x57, 0x6,0x41,0x33, 0x6,0x41,0x37, 0x5,0x33,0x39, 0x6,0x41,0x3a, 0x6,0x41,0x39, 0x6,0x41,0x47, 0x6,0x41,0x2d, 0x6,0x41,0x2e, 0x5,0x33,0x34, 0x5,0x33,0x3c, 0x6,0x38,0x7a, 0x6,0x4a,0x62, 0x6,0x4a,0x70, 0x4,0x38,0x54, 0x5,0x39,0x63, 0x4,0x38,0x55, 0x6,0x4a,0x5d, 0x6,0x4a,0x5f, 0x5,0x39,0x67, 0x5,0x39,0x6a, 0x5,0x39,0x62, 0x6,0x54,0x48, 0x5,0x39,0x6c, 0x6,0x4a,0x5a, 0x4,0x38,0x53, 0x5,0x33,0x42, 0x4,0x38,0x58, 0x6,0x4a,0x6c, 0x6,0x4a,0x5c, 0x5,0x39,0x68, 0x6,0x4a,0x71, 0x6,0x54,0x35, 0x6,0x4a,0x67, 0x6,0x4a,0x68, 0x6,0x4a,0x6e, 0x5,0x39,0x60, 0x6,0x54,0x34, 0x6,0x4a,0x6f, 0x4,0x3e,0x2c, 0x5,0x39,0x5f, 0x5,0x39,0x66, 0x5,0x39,0x65, 0x5,0x39,0x64, 0x6,0x4a,0x6a, 0x5,0x39,0x61, 0x6,0x54,0x33, 0x6,0x4a,0x72, 0x5,0x39,0x6d, 0x6,0x4a,0x61, 0xf,0x3c,0x44, 0xf,0x3c,0x45, 0xf,0x3c,0x46, 0xf,0x3c,0x48, 0xf,0x3c,0x49, 0xf,0x3c,0x4a, 0xf,0x3c,0x4e, 0xf,0x3c,0x4f, 0xf,0x3c,0x50, 0xf,0x3c,0x51, 0xf,0x3c,0x52, 0xf,0x3c,0x53, 0xf,0x3c,0x54, 0xf,0x3c,0x55, 0xf,0x3c,0x56, 0xf,0x3c,0x58, 0xf,0x3c,0x59, 0xf,0x3c,0x5b, 0xf,0x3c,0x5c, 0x6,0x4a,0x69, 0x5,0x39,0x69, 0x6,0x4a,0x6b, 0x4,0x38,0x5d, 0x6,0x4a,0x5b, 0x6,0x4a,0x60, 0x6,0x4a,0x5e, 0x5,0x39,0x6b, 0xf,0x42,0x73, 0x6,0x54,0x41, 0x5,0x40,0x25, 0x4,0x3e,0x41, 0x6,0x54,0x38, 0x4,0x3e,0x34, 0x6,0x54,0x3b, 0x6,0x54,0x43, 0x4,0x3e,0x3b, 0x4,0x3e,0x43, 0x4,0x3e,0x3e, 0x4,0x3e,0x2e, 0x6,0x54,0x4a, 0x5,0x40,0x29, 0x5,0x40,0x26, 0x4,0x3e,0x40, 0x6,0x5e,0x31, 0x6,0x54,0x42, 0x4,0x3e,0x3a, 0x5,0x40,0x2f, 0x5,0x40,0x2d, 0x4,0x3e,0x31, 0x6,0x5e,0x32, 0x4,0x3e,0x42, 0x5,0x40,0x2c, 0x5,0x40,0x2e, 0x6,0x54,0x3e, 0x6,0x54,0x4c, 0x7,0x24,0x3c, 0x6,0x54,0x47, 0x4,0x44,0x4b, 0x6,0x54,0x3f, 0x6,0x54,0x46, 0x6,0x54,0x37, 0x6,0x54,0x36, 0x5,0x40,0x2b, 0x5,0x40,0x28, 0x4,0x3e,0x3d, 0x6,0x54,0x3c, 0x6,0x54,0x3d, 0x6,0x54,0x40, 0x6,0x54,0x45, 0xf,0x42,0x58, 0xf,0x42,0x59, 0xf,0x42,0x5a, 0xf,0x42,0x5b, 0xf,0x42,0x5c, 0xf,0x42,0x5d, 0xf,0x42,0x5e, 0xf,0x42,0x60, 0xf,0x42,0x61, 0xf,0x42,0x62, 0xf,0x42,0x65, 0xf,0x42,0x66, 0xf,0x42,0x67, 0xf,0x42,0x68, 0xf,0x42,0x69, 0xf,0x42,0x6a, 0xf,0x42,0x6c, 0xf,0x42,0x6d, 0xf,0x42,0x6e, 0xf,0x42,0x6f, 0xf,0x42,0x70, 0xf,0x42,0x71, 0xf,0x42,0x72, 0xf,0x42,0x75, 0xf,0x49,0x22, 0xf,0x49,0x3e, 0x5,0x40,0x2a, 0x6,0x54,0x44, 0x4,0x3e,0x35, 0x6,0x54,0x4d, 0x6,0x54,0x3a, 0x6,0x54,0x4b, 0xf,0x49,0x2f, 0xf,0x42,0x6b, 0xf,0x4f,0x6c, 0x6,0x54,0x39, 0x7,0x24,0x3d, 0x4,0x44,0x54, 0x4,0x44,0x47, 0x4,0x44,0x48, 0x4,0x44,0x4c, 0x5,0x46,0x6b, 0x4,0x44,0x4e, 0x5,0x46,0x6a, 0x5,0x46,0x74, 0x5,0x46,0x76, 0x4,0x44,0x45, 0x4,0x44,0x53, 0x6,0x5e,0x44, 0x5,0x46,0x6f, 0x6,0x5e,0x41, 0x6,0x5e,0x3a, 0x4,0x44,0x51, 0x4,0x44,0x50, 0x5,0x46,0x75, 0x5,0x46,0x72, 0x5,0x46,0x6d, 0x7,0x24,0x40, 0x7,0x24,0x3f, 0x5,0x46,0x77, 0x6,0x5e,0x45, 0x4,0x44,0x4f, 0x6,0x5e,0x39, 0x6,0x5e,0x42, 0x5,0x46,0x70, 0x5,0x46,0x71, 0x4,0x44,0x41, 0x6,0x5e,0x3d, 0x5,0x4d,0x7a, 0x7,0x24,0x3e, 0x6,0x5e,0x34, 0x5,0x46,0x6e, 0x6,0x5e,0x3f, 0x5,0x46,0x73, 0xf,0x49,0x23, 0xf,0x49,0x24, 0xf,0x49,0x25, 0xf,0x49,0x26, 0xf,0x49,0x27, 0xf,0x49,0x28, 0xf,0x49,0x29, 0xf,0x49,0x2b, 0xf,0x49,0x2c, 0xf,0x49,0x2d, 0xf,0x49,0x2e, 0xf,0x49,0x30, 0xf,0x49,0x31, 0xf,0x49,0x34, 0xf,0x49,0x36, 0xf,0x49,0x37, 0xf,0x49,0x38, 0xf,0x49,0x39, 0xf,0x49,0x3a, 0xf,0x49,0x3c, 0xf,0x49,0x3d, 0xf,0x49,0x41, 0xf,0x49,0x42, 0xf,0x49,0x43, 0xf,0x4f,0x6d, 0x7,0x22,0x68, 0x4,0x44,0x42, 0x6,0x5e,0x3c, 0x6,0x5e,0x43, 0x6,0x5e,0x35, 0x5,0x46,0x6c, 0x6,0x5e,0x33, 0x6,0x5e,0x37, 0x6,0x5e,0x38, 0xf,0x49,0x3b, 0x6,0x5e,0x36, 0xf,0x49,0x2a, 0x7,0x24,0x62, 0x7,0x24,0x52, 0x7,0x24,0x4d, 0x4,0x4a,0x60, 0x7,0x24,0x5a, 0x7,0x24,0x54, 0x7,0x24,0x4c, 0x4,0x4a,0x65, 0x4,0x4a,0x67, 0x5,0x4e,0x25, 0x7,0x24,0x63, 0x7,0x24,0x4e, 0x7,0x24,0x50, 0x7,0x24,0x56, 0x4,0x4a,0x5c, 0x7,0x24,0x57, 0x7,0x24,0x49, 0x5,0x4e,0x21, 0x7,0x24,0x65, 0x7,0x24,0x47, 0x7,0x24,0x44, 0x4,0x4a,0x66, 0x5,0x4d,0x7b, 0x5,0x4e,0x24, 0x7,0x24,0x64, 0x4,0x4a,0x5b, 0x7,0x24,0x5b, 0x4,0x4a,0x5a, 0x7,0x24,0x59, 0x5,0x4d,0x7e, 0x7,0x24,0x43, 0x7,0x24,0x67, 0x5,0x4e,0x23, 0x5,0x4d,0x7d, 0x7,0x24,0x53, 0x7,0x24,0x42, 0x7,0x3a,0x69, 0x7,0x24,0x45, 0x7,0x24,0x68, 0x5,0x4e,0x22, 0x7,0x24,0x41, 0x7,0x24,0x5e, 0x7,0x24,0x66, 0x5,0x4e,0x26, 0x5,0x4e,0x28, 0x5,0x4d,0x7c, 0x4,0x4a,0x5e, 0x7,0x24,0x5f, 0x7,0x24,0x4b, 0x7,0x24,0x51, 0x5,0x4e,0x27, 0x7,0x24,0x5c, 0xf,0x4f,0x59, 0xf,0x4f,0x5a, 0xf,0x4f,0x5b, 0xf,0x4f,0x5c, 0xf,0x4f,0x5d, 0xf,0x4f,0x5e, 0xf,0x4f,0x5f, 0xf,0x4f,0x62, 0xf,0x4f,0x63, 0xf,0x4f,0x64, 0xf,0x4f,0x65, 0xf,0x4f,0x66, 0xf,0x4f,0x67, 0xf,0x4f,0x68, 0xf,0x4f,0x6a, 0xf,0x4f,0x6b, 0xf,0x4f,0x6f, 0xf,0x4f,0x70, 0xf,0x4f,0x71, 0xf,0x4f,0x72, 0xf,0x4f,0x73, 0xf,0x4f,0x74, 0xf,0x4f,0x75, 0xf,0x4f,0x76, 0xf,0x4f,0x77, 0xf,0x4f,0x78, 0xf,0x4f,0x7b, 0xf,0x4f,0x7c, 0xf,0x55,0x51, 0x7,0x24,0x55, 0x7,0x24,0x60, 0x7,0x2f,0x30, 0x4,0x4a,0x63, 0x7,0x24,0x46, 0x7,0x24,0x5d, 0x7,0x24,0x48, 0x7,0x24,0x4a, 0xf,0x55,0x4a, 0xf,0x4f,0x7e, 0xf,0x49,0x40, 0x4,0x50,0x7c, 0x5,0x55,0x35, 0x5,0x55,0x34, 0x5,0x55,0x28, 0x5,0x55,0x29, 0x5,0x55,0x2b, 0x7,0x2f,0x33, 0x5,0x55,0x30, 0x7,0x2f,0x47, 0x7,0x2f,0x40, 0x7,0x2f,0x3a, 0x4,0x50,0x79, 0x7,0x2f,0x39, 0x4,0x50,0x7e, 0x5,0x55,0x33, 0x7,0x2f,0x3d, 0x7,0x2f,0x31, 0x7,0x2f,0x37, 0x7,0x2f,0x46, 0x7,0x2f,0x3b, 0x7,0x2f,0x38, 0x7,0x2f,0x43, 0x7,0x2f,0x36, 0x7,0x2f,0x32, 0x5,0x55,0x31, 0x5,0x55,0x2a, 0x5,0x5b,0x77, 0x7,0x2f,0x3c, 0x7,0x2f,0x49, 0x5,0x55,0x2c, 0x5,0x5b,0x79, 0x5,0x55,0x32, 0x7,0x2f,0x2f, 0x7,0x2f,0x34, 0x7,0x2f,0x3e, 0x7,0x2f,0x41, 0xf,0x55,0x46, 0xf,0x55,0x48, 0xf,0x55,0x49, 0xf,0x55,0x4b, 0xf,0x55,0x4c, 0xf,0x55,0x4f, 0xf,0x55,0x50, 0xf,0x55,0x52, 0xf,0x55,0x53, 0xf,0x55,0x54, 0xf,0x55,0x55, 0xf,0x55,0x57, 0xf,0x5a,0x6d, 0x5,0x55,0x2f, 0x7,0x2f,0x3f, 0x7,0x2f,0x45, 0x7,0x2f,0x48, 0x7,0x2f,0x4a, 0x7,0x2f,0x2e, 0x7,0x2f,0x44, 0x4,0x51,0x21, 0xf,0x4f,0x61, 0xf,0x5a,0x66, 0xf,0x5a,0x5f, 0x5,0x54,0x3a, 0x5,0x5b,0x7c, 0x4,0x56,0x5a, 0x4,0x56,0x5f, 0x5,0x5b,0x7a, 0x7,0x38,0x7a, 0x7,0x38,0x6e, 0x4,0x5b,0x52, 0x5,0x5b,0x7b, 0x5,0x5b,0x78, 0x7,0x38,0x70, 0x7,0x38,0x76, 0x7,0x38,0x6f, 0x7,0x38,0x79, 0x7,0x38,0x74, 0x7,0x38,0x73, 0x5,0x62,0x38, 0x7,0x38,0x75, 0x7,0x38,0x7b, 0x5,0x5b,0x7d, 0x7,0x38,0x77, 0x5,0x55,0x37, 0x3,0x55,0x3a, 0x7,0x38,0x78, 0xf,0x5a,0x60, 0xf,0x5a,0x61, 0xf,0x5a,0x62, 0xf,0x5a,0x63, 0xf,0x5a,0x64, 0xf,0x5a,0x65, 0xf,0x5a,0x67, 0xf,0x5a,0x69, 0xf,0x5a,0x6b, 0xf,0x5a,0x70, 0x7,0x38,0x72, 0x5,0x5b,0x7e, 0x7,0x38,0x7c, 0x7,0x38,0x71, 0xf,0x55,0x4e, 0xf,0x5a,0x6c, 0xf,0x5a,0x6f, 0xf,0x55,0x47, 0xf,0x55,0x4d, 0xf,0x5a,0x5e, 0x7,0x2f,0x35, 0x5,0x62,0x3f, 0x5,0x62,0x46, 0x5,0x62,0x45, 0x4,0x5b,0x5d, 0x5,0x62,0x3d, 0x5,0x62,0x39, 0x5,0x62,0x42, 0x7,0x40,0x40, 0x7,0x40,0x46, 0x4,0x5b,0x59, 0x5,0x62,0x4b, 0x5,0x62,0x44, 0x7,0x40,0x3c, 0x5,0x62,0x41, 0x5,0x62,0x4a, 0x4,0x5b,0x58, 0x5,0x62,0x43, 0x7,0x40,0x47, 0x5,0x62,0x3b, 0x7,0x40,0x41, 0x5,0x62,0x40, 0x7,0x40,0x48, 0x7,0x40,0x3a, 0x4,0x5b,0x5f, 0x4,0x5b,0x55, 0x7,0x40,0x45, 0x7,0x40,0x44, 0x7,0x40,0x3e, 0x5,0x62,0x3a, 0x4,0x5b,0x53, 0x5,0x62,0x3c, 0x5,0x62,0x3e, 0x5,0x62,0x49, 0x5,0x62,0x4c, 0x5,0x62,0x47, 0x7,0x40,0x3f, 0x4,0x5b,0x5c, 0x7,0x40,0x42, 0x7,0x47,0x5f, 0x5,0x62,0x4d, 0xf,0x5f,0x33, 0xf,0x5f,0x35, 0xf,0x5f,0x36, 0xf,0x5f,0x37, 0xf,0x5f,0x39, 0xf,0x5f,0x3a, 0xf,0x5f,0x3b, 0xf,0x5f,0x3c, 0xf,0x5f,0x3d, 0xf,0x5f,0x3e, 0xf,0x5f,0x3f, 0xf,0x5f,0x40, 0xf,0x5f,0x41, 0xf,0x5f,0x42, 0xf,0x5f,0x43, 0xf,0x62,0x64, 0xf,0x62,0x65, 0xf,0x62,0x6c, 0x7,0x47,0x5e, 0x7,0x40,0x3d, 0x7,0x40,0x39, 0x7,0x40,0x43, 0x7,0x40,0x3b, 0xf,0x5f,0x34, 0xf,0x5a,0x6a, 0xf,0x5a,0x6e, 0x5,0x62,0x48, 0x7,0x47,0x65, 0x7,0x47,0x5c, 0x7,0x47,0x62, 0x4,0x5f,0x7c, 0x4,0x5f,0x7a, 0x7,0x47,0x53, 0x5,0x68,0x36, 0x7,0x47,0x56, 0x7,0x47,0x54, 0x7,0x47,0x5b, 0x7,0x47,0x5a, 0x7,0x47,0x55, 0x5,0x68,0x35, 0x7,0x47,0x59, 0x7,0x47,0x5d, 0x5,0x6c,0x45, 0x7,0x47,0x61, 0xf,0x62,0x66, 0xf,0x62,0x67, 0xf,0x62,0x68, 0xf,0x62,0x69, 0xf,0x62,0x6a, 0xf,0x62,0x6d, 0xf,0x62,0x6e, 0xf,0x62,0x6f, 0xf,0x62,0x70, 0xf,0x62,0x71, 0x7,0x47,0x57, 0x7,0x47,0x60, 0x7,0x47,0x66, 0x7,0x47,0x64, 0x7,0x47,0x63, 0x7,0x47,0x58, 0x5,0x6c,0x47, 0x5,0x6c,0x4a, 0x5,0x6c,0x4b, 0x7,0x4e,0x2b, 0x4,0x63,0x59, 0x4,0x63,0x5d, 0x7,0x4e,0x2a, 0x7,0x4e,0x29, 0x5,0x6c,0x48, 0x4,0x63,0x5c, 0x7,0x4e,0x2e, 0x4,0x63,0x57, 0x4,0x63,0x58, 0x4,0x63,0x56, 0x7,0x4e,0x2d, 0x5,0x70,0x3b, 0x5,0x6c,0x49, 0x5,0x6c,0x4c, 0x7,0x4e,0x2f, 0xf,0x65,0x42, 0xf,0x65,0x43, 0xf,0x65,0x44, 0x7,0x4e,0x2c, 0x4,0x66,0x48, 0x5,0x70,0x40, 0x7,0x53,0x56, 0x5,0x70,0x3f, 0x5,0x70,0x3d, 0x4,0x66,0x4b, 0x7,0x53,0x54, 0x5,0x70,0x3c, 0x7,0x53,0x59, 0x7,0x53,0x53, 0x4,0x66,0x4d, 0x7,0x53,0x5f, 0x5,0x70,0x41, 0x7,0x53,0x55, 0x7,0x53,0x5a, 0xf,0x67,0x68, 0xf,0x67,0x69, 0xf,0x67,0x6a, 0xf,0x67,0x6b, 0xf,0x67,0x6d, 0xf,0x67,0x6e, 0xf,0x67,0x6f, 0x7,0x53,0x5b, 0x7,0x53,0x5c, 0x7,0x53,0x5d, 0x7,0x53,0x5e, 0x5,0x70,0x3a, 0xf,0x67,0x70, 0xf,0x69,0x55, 0x7,0x58,0x2e, 0x7,0x53,0x57, 0x7,0x58,0x2f, 0x5,0x73,0x54, 0x5,0x70,0x42, 0x7,0x58,0x2d, 0x5,0x73,0x55, 0x7,0x58,0x31, 0x4,0x68,0x72, 0x7,0x58,0x32, 0xf,0x69,0x53, 0xf,0x69,0x54, 0x7,0x58,0x33, 0x7,0x58,0x30, 0x7,0x58,0x2c, 0x5,0x76,0x21, 0x5,0x76,0x22, 0x7,0x5b,0x69, 0x7,0x5b,0x68, 0x5,0x75,0x7e, 0x7,0x5b,0x67, 0x5,0x75,0x7d, 0xf,0x6a,0x5b, 0xf,0x6a,0x5c, 0xf,0x6a,0x5d, 0x7,0x5b,0x6a, 0x7,0x5b,0x66, 0x7,0x5e,0x76, 0x5,0x77,0x67, 0x7,0x5e,0x77, 0x4,0x6c,0x71, 0x7,0x5e,0x74, 0x5,0x77,0x66, 0x7,0x5e,0x75, 0x4,0x6c,0x72, 0x7,0x60,0x79, 0x7,0x60,0x78, 0x7,0x60,0x77, 0xf,0x6c,0x2f, 0x7,0x62,0x39, 0x4,0x6d,0x58, 0x5,0x7a,0x2b, 0x5,0x7a,0x2a, 0x4,0x6d,0x59, 0x4,0x6d,0x74, 0x5,0x7a,0x69, 0x5,0x7a,0x6a, 0x7,0x63,0x57, 0x7,0x64,0x4b, 0x5,0x7b,0x41, 0xf,0x6d,0x26, 0x7,0x65,0x5c, 0x5,0x7c,0x3c, 0x6,0x23,0x2f, 0x6,0x25,0x33, 0x4,0x23,0x24, 0x4,0x23,0x25, 0x6,0x25,0x32, 0xf,0x22,0x5f, 0xf,0x22,0x60, 0xf,0x22,0x61, 0x6,0x25,0x34, 0x4,0x24,0x53, 0x4,0x24,0x54, 0x5,0x24,0x54, 0x6,0x28,0x4c, 0x5,0x24,0x55, 0x5,0x24,0x57, 0xf,0x24,0x6b, 0xf,0x24,0x6c, 0xf,0x24,0x6d, 0xf,0x24,0x70, 0xf,0x24,0x72, 0x6,0x28,0x4b, 0x5,0x26,0x74, 0x4,0x27,0x28, 0x5,0x26,0x75, 0xf,0x27,0x6f, 0xf,0x27,0x70, 0xf,0x27,0x71, 0xf,0x27,0x73, 0xf,0x27,0x74, 0xf,0x27,0x75, 0xf,0x27,0x76, 0xf,0x27,0x77, 0x6,0x2c,0x5f, 0xf,0x27,0x72, 0x6,0x2c,0x5e, 0x4,0x27,0x2a, 0x5,0x24,0x56, 0x5,0x2a,0x25, 0x6,0x32,0x4c, 0x5,0x2a,0x26, 0x6,0x32,0x44, 0x5,0x2a,0x27, 0x6,0x32,0x4b, 0x6,0x32,0x46, 0xf,0x2b,0x6f, 0xf,0x2b,0x70, 0xf,0x2b,0x71, 0xf,0x2b,0x72, 0xf,0x2b,0x73, 0xf,0x2b,0x74, 0xf,0x2b,0x75, 0xf,0x2b,0x76, 0xf,0x2b,0x77, 0xf,0x2b,0x78, 0xf,0x2b,0x79, 0xf,0x2b,0x7b, 0xf,0x2b,0x7c, 0xf,0x2b,0x7d, 0xf,0x2b,0x7e, 0xf,0x2c,0x21, 0xf,0x2c,0x23, 0x4,0x2a,0x29, 0x6,0x32,0x45, 0x6,0x32,0x43, 0x6,0x32,0x47, 0x6,0x39,0x3a, 0x5,0x2a,0x28, 0x6,0x32,0x4a, 0xf,0x2c,0x22, 0x6,0x32,0x49, 0x5,0x2e,0x4f, 0x5,0x2e,0x4e, 0x6,0x39,0x36, 0x6,0x39,0x39, 0xf,0x30,0x6a, 0x4,0x32,0x6f, 0x6,0x39,0x37, 0x4,0x2d,0x74, 0x6,0x39,0x34, 0x5,0x2e,0x4b, 0xf,0x30,0x5d, 0xf,0x30,0x5e, 0xf,0x30,0x5f, 0xf,0x30,0x60, 0xf,0x30,0x61, 0xf,0x30,0x62, 0xf,0x30,0x63, 0xf,0x30,0x64, 0xf,0x30,0x65, 0xf,0x30,0x66, 0xf,0x30,0x68, 0xf,0x30,0x69, 0xf,0x30,0x6b, 0xf,0x30,0x6c, 0xf,0x30,0x6e, 0xf,0x30,0x6f, 0xf,0x30,0x70, 0xf,0x30,0x71, 0xf,0x30,0x72, 0x5,0x2e,0x4c, 0x6,0x39,0x35, 0x6,0x39,0x3b, 0x6,0x39,0x3c, 0xf,0x30,0x67, 0xf,0x30,0x6d, 0x6,0x39,0x38, 0x5,0x2e,0x4d, 0x6,0x41,0x4b, 0x4,0x32,0x74, 0x5,0x33,0x44, 0x6,0x41,0x4f, 0x4,0x32,0x73, 0x4,0x32,0x75, 0x6,0x41,0x4e, 0x6,0x41,0x54, 0x6,0x41,0x51, 0x6,0x41,0x4d, 0x6,0x41,0x4c, 0x6,0x4a,0x73, 0x6,0x41,0x52, 0x6,0x41,0x50, 0x6,0x41,0x53, 0xf,0x36,0x24, 0xf,0x36,0x3e, 0xf,0x36,0x3f, 0xf,0x36,0x40, 0xf,0x36,0x41, 0xf,0x36,0x43, 0xf,0x36,0x44, 0xf,0x36,0x45, 0xf,0x36,0x46, 0xf,0x36,0x47, 0xf,0x36,0x49, 0xf,0x36,0x4a, 0xf,0x36,0x4c, 0xf,0x36,0x4d, 0xf,0x36,0x4e, 0xf,0x36,0x50, 0x6,0x41,0x49, 0x6,0x41,0x48, 0xf,0x36,0x4b, 0x5,0x33,0x43, 0x5,0x33,0x45, 0x6,0x41,0x55, 0x4,0x38,0x69, 0x6,0x4a,0x78, 0x6,0x41,0x4a, 0x5,0x39,0x71, 0x5,0x39,0x6f, 0x6,0x4a,0x7e, 0x6,0x4b,0x21, 0x5,0x39,0x6e, 0x6,0x4a,0x75, 0x4,0x38,0x66, 0x6,0x4a,0x7a, 0x6,0x4a,0x74, 0x6,0x4a,0x7d, 0x4,0x38,0x63, 0x5,0x39,0x70, 0x6,0x4a,0x77, 0xf,0x3c,0x5e, 0xf,0x3c,0x5f, 0xf,0x3c,0x60, 0xf,0x3c,0x61, 0xf,0x3c,0x62, 0xf,0x3c,0x63, 0xf,0x3c,0x64, 0xf,0x3c,0x66, 0xf,0x3c,0x67, 0xf,0x3c,0x68, 0xf,0x3c,0x69, 0xf,0x3c,0x6b, 0xf,0x3c,0x6c, 0xf,0x3c,0x6d, 0xf,0x3c,0x6e, 0xf,0x3c,0x6f, 0xf,0x3c,0x70, 0xf,0x3c,0x71, 0xf,0x3c,0x72, 0xf,0x3c,0x75, 0xf,0x3c,0x77, 0xf,0x3c,0x78, 0xf,0x3c,0x79, 0xf,0x3c,0x7a, 0xf,0x3c,0x7b, 0xf,0x3c,0x7c, 0xf,0x3d,0x21, 0x6,0x4a,0x79, 0x6,0x4a,0x7c, 0x4,0x38,0x67, 0x6,0x4a,0x76, 0x6,0x4a,0x7b, 0xf,0x3c,0x6a, 0x5,0x39,0x72, 0x5,0x40,0x34, 0x6,0x54,0x5a, 0x6,0x54,0x58, 0x5,0x40,0x30, 0x6,0x54,0x56, 0x6,0x54,0x5d, 0x4,0x3e,0x47, 0x6,0x54,0x57, 0x4,0x3e,0x44, 0x6,0x54,0x5b, 0x6,0x54,0x5e, 0x4,0x3e,0x45, 0x5,0x40,0x32, 0x6,0x54,0x53, 0x6,0x54,0x63, 0x6,0x54,0x5f, 0x6,0x54,0x64, 0x5,0x40,0x35, 0x6,0x54,0x5c, 0x6,0x54,0x62, 0xf,0x42,0x76, 0xf,0x42,0x79, 0xf,0x42,0x7b, 0xf,0x42,0x7c, 0xf,0x42,0x7d, 0xf,0x43,0x21, 0xf,0x43,0x22, 0xf,0x43,0x23, 0xf,0x43,0x25, 0xf,0x43,0x26, 0xf,0x43,0x27, 0xf,0x43,0x28, 0xf,0x43,0x29, 0xf,0x43,0x2a, 0xf,0x43,0x2b, 0xf,0x43,0x2d, 0xf,0x43,0x2e, 0xf,0x43,0x30, 0xf,0x43,0x33, 0xf,0x43,0x34, 0xf,0x43,0x35, 0xf,0x43,0x36, 0xf,0x43,0x37, 0xf,0x43,0x38, 0xf,0x43,0x39, 0xf,0x43,0x3a, 0xf,0x43,0x3b, 0xf,0x43,0x3d, 0xf,0x43,0x3e, 0x6,0x54,0x51, 0x6,0x54,0x52, 0x6,0x54,0x55, 0x6,0x54,0x66, 0x4,0x3e,0x4a, 0x6,0x54,0x61, 0x6,0x54,0x65, 0x6,0x5a,0x54, 0xf,0x43,0x2c, 0x5,0x40,0x33, 0x5,0x40,0x31, 0xf,0x49,0x54, 0x6,0x5e,0x51, 0x6,0x5e,0x50, 0x5,0x46,0x7e, 0x6,0x5e,0x4a, 0x5,0x47,0x22, 0x4,0x44,0x55, 0x5,0x46,0x7c, 0x5,0x46,0x7b, 0x5,0x46,0x7a, 0x7,0x24,0x70, 0x7,0x24,0x6a, 0x6,0x5e,0x46, 0x5,0x47,0x21, 0x6,0x5e,0x47, 0x6,0x5e,0x48, 0x5,0x46,0x79, 0x6,0x5e,0x4b, 0x6,0x5e,0x4f, 0xf,0x49,0x44, 0xf,0x49,0x45, 0xf,0x49,0x46, 0xf,0x49,0x47, 0xf,0x49,0x49, 0xf,0x49,0x4a, 0xf,0x49,0x4c, 0xf,0x49,0x4d, 0xf,0x49,0x4e, 0xf,0x49,0x4f, 0xf,0x49,0x50, 0xf,0x49,0x51, 0xf,0x49,0x52, 0xf,0x49,0x53, 0xf,0x49,0x55, 0xf,0x49,0x56, 0xf,0x49,0x57, 0xf,0x49,0x5a, 0xf,0x49,0x5b, 0xf,0x49,0x5d, 0xf,0x49,0x5e, 0xf,0x49,0x60, 0xf,0x49,0x62, 0xf,0x49,0x63, 0xf,0x49,0x64, 0x4,0x44,0x5d, 0x5,0x46,0x7d, 0x6,0x5e,0x4c, 0x6,0x5e,0x52, 0x6,0x5e,0x49, 0x6,0x5e,0x4d, 0xf,0x49,0x5c, 0x6,0x54,0x60, 0xf,0x42,0x7e, 0xf,0x42,0x7a, 0x4,0x4a,0x6b, 0x5,0x4e,0x2c, 0x7,0x24,0x74, 0x7,0x24,0x6d, 0x7,0x24,0x69, 0x5,0x4e,0x2a, 0x7,0x24,0x6c, 0x7,0x24,0x71, 0x7,0x24,0x72, 0x7,0x24,0x75, 0x7,0x24,0x6b, 0x5,0x4e,0x29, 0xf,0x4e,0x22, 0x5,0x4e,0x2b, 0x7,0x24,0x73, 0xf,0x50,0x23, 0xf,0x50,0x24, 0xf,0x50,0x26, 0xf,0x50,0x27, 0xf,0x50,0x28, 0xf,0x50,0x29, 0xf,0x50,0x2a, 0xf,0x50,0x2b, 0xf,0x50,0x2e, 0xf,0x50,0x2f, 0xf,0x50,0x31, 0xf,0x50,0x32, 0xf,0x50,0x33, 0xf,0x50,0x34, 0xf,0x50,0x35, 0xf,0x50,0x37, 0xf,0x50,0x38, 0xf,0x50,0x39, 0xf,0x50,0x3a, 0xf,0x50,0x3b, 0xf,0x50,0x3c, 0x7,0x24,0x6e, 0xf,0x50,0x2c, 0x7,0x2a,0x71, 0xf,0x50,0x2d, 0xf,0x50,0x30, 0xf,0x50,0x25, 0xf,0x50,0x22, 0x5,0x4e,0x2e, 0x5,0x4e,0x2d, 0x6,0x5e,0x4e, 0x4,0x51,0x2a, 0x7,0x2f,0x52, 0x7,0x2f,0x66, 0x7,0x2f,0x50, 0x7,0x2f,0x60, 0x7,0x2f,0x5e, 0x5,0x55,0x3b, 0x4,0x51,0x27, 0x7,0x2f,0x61, 0x7,0x2f,0x63, 0x7,0x2f,0x55, 0x7,0x24,0x6f, 0x4,0x51,0x28, 0x7,0x2f,0x56, 0x7,0x2f,0x64, 0x7,0x2f,0x65, 0x4,0x51,0x26, 0x7,0x2f,0x58, 0x7,0x2f,0x54, 0x4,0x51,0x29, 0x7,0x2f,0x67, 0x5,0x55,0x3a, 0x5,0x55,0x3c, 0x7,0x2f,0x62, 0x7,0x2f,0x59, 0x7,0x2f,0x5d, 0x7,0x2f,0x5a, 0x7,0x2f,0x4b, 0x7,0x2f,0x53, 0x7,0x2f,0x5c, 0xf,0x55,0x59, 0xf,0x55,0x5a, 0xf,0x55,0x5b, 0xf,0x55,0x5c, 0xf,0x55,0x5d, 0xf,0x55,0x5e, 0xf,0x55,0x5f, 0xf,0x55,0x60, 0xf,0x55,0x61, 0xf,0x55,0x62, 0xf,0x55,0x63, 0xf,0x55,0x66, 0xf,0x55,0x67, 0xf,0x55,0x68, 0xf,0x55,0x6a, 0xf,0x55,0x6b, 0xf,0x55,0x6d, 0xf,0x55,0x6e, 0xf,0x55,0x70, 0xf,0x55,0x71, 0xf,0x55,0x72, 0xf,0x55,0x65, 0x5,0x55,0x38, 0x7,0x2f,0x4d, 0x7,0x2f,0x4e, 0x7,0x2f,0x5b, 0x7,0x2f,0x5f, 0x7,0x31,0x7a, 0x7,0x2f,0x51, 0x7,0x2c,0x7b, 0xf,0x55,0x6f, 0x5,0x55,0x3d, 0x5,0x55,0x39, 0x7,0x2f,0x4c, 0x7,0x24,0x76, 0x7,0x2f,0x57, 0x7,0x39,0x23, 0x4,0x56,0x61, 0x7,0x39,0x25, 0x5,0x55,0x3e, 0x7,0x39,0x29, 0x7,0x39,0x28, 0x4,0x56,0x63, 0x7,0x2f,0x68, 0x5,0x5c,0x21, 0x7,0x38,0x7d, 0x5,0x5c,0x24, 0x5,0x5c,0x22, 0xf,0x5a,0x71, 0xf,0x5a,0x72, 0xf,0x5a,0x76, 0xf,0x5a,0x77, 0xf,0x5a,0x78, 0xf,0x5a,0x79, 0xf,0x5a,0x7a, 0xf,0x5a,0x7b, 0xf,0x5a,0x7c, 0xf,0x5a,0x7d, 0xf,0x5a,0x7e, 0xf,0x5b,0x21, 0xf,0x5b,0x22, 0xf,0x5b,0x23, 0x7,0x38,0x7e, 0x7,0x39,0x24, 0x7,0x39,0x22, 0x5,0x5c,0x23, 0x7,0x39,0x21, 0xf,0x55,0x69, 0x7,0x40,0x4f, 0x4,0x5b,0x62, 0x7,0x40,0x4e, 0x5,0x62,0x4e, 0x7,0x40,0x4b, 0x7,0x40,0x53, 0x7,0x40,0x51, 0x7,0x40,0x4c, 0x4,0x5b,0x63, 0x5,0x62,0x4f, 0x5,0x62,0x50, 0x4,0x5b,0x61, 0x7,0x40,0x54, 0x7,0x40,0x4a, 0x7,0x40,0x52, 0xf,0x5f,0x44, 0xf,0x5f,0x46, 0xf,0x5f,0x45, 0xf,0x5f,0x47, 0xf,0x5f,0x48, 0xf,0x5f,0x49, 0xf,0x5f,0x4a, 0xf,0x5f,0x4c, 0xf,0x5f,0x4d, 0x7,0x40,0x50, 0x7,0x42,0x22, 0x7,0x40,0x55, 0x7,0x40,0x4d, 0x7,0x40,0x49, 0x7,0x39,0x2a, 0xf,0x61,0x76, 0xf,0x5a,0x74, 0xf,0x5a,0x75, 0x7,0x47,0x6c, 0x5,0x68,0x37, 0x4,0x60,0x21, 0x7,0x47,0x6d, 0x4,0x60,0x22, 0x7,0x47,0x6a, 0xf,0x62,0x74, 0xf,0x62,0x75, 0xf,0x62,0x76, 0xf,0x62,0x77, 0x7,0x47,0x69, 0x7,0x47,0x67, 0x7,0x47,0x6b, 0xf,0x5f,0x4b, 0x7,0x47,0x68, 0xf,0x65,0x45, 0x5,0x6c,0x4f, 0x7,0x4e,0x30, 0x7,0x4e,0x33, 0x7,0x4e,0x3b, 0x5,0x6c,0x4e, 0x5,0x6c,0x4d, 0x5,0x6c,0x51, 0x4,0x60,0x23, 0x7,0x4e,0x32, 0x7,0x4e,0x38, 0x4,0x63,0x62, 0x4,0x63,0x60, 0x7,0x4e,0x3c, 0x7,0x4e,0x31, 0x7,0x4e,0x35, 0x7,0x4e,0x37, 0xf,0x65,0x48, 0x7,0x4e,0x34, 0xf,0x65,0x46, 0xf,0x65,0x47, 0xf,0x65,0x4a, 0xf,0x65,0x4b, 0xf,0x65,0x4c, 0xf,0x65,0x4d, 0xf,0x65,0x4e, 0x7,0x4e,0x39, 0x7,0x4e,0x36, 0x7,0x4e,0x3a, 0x5,0x6c,0x50, 0x7,0x53,0x64, 0x4,0x63,0x61, 0x7,0x53,0x66, 0x5,0x70,0x43, 0x4,0x66,0x4f, 0x7,0x53,0x67, 0x7,0x53,0x62, 0x7,0x53,0x63, 0x7,0x53,0x65, 0xf,0x67,0x71, 0xf,0x67,0x72, 0xf,0x67,0x73, 0xf,0x67,0x74, 0xf,0x67,0x75, 0x7,0x58,0x36, 0x5,0x73,0x56, 0x4,0x6a,0x4f, 0x7,0x58,0x37, 0x7,0x58,0x38, 0x7,0x58,0x34, 0xf,0x69,0x56, 0xf,0x69,0x57, 0xf,0x69,0x58, 0x7,0x58,0x35, 0x7,0x5b,0x24, 0x7,0x5b,0x6e, 0x7,0x5b,0x70, 0x7,0x5b,0x6d, 0x7,0x5c,0x44, 0x7,0x5b,0x6f, 0x7,0x5b,0x6c, 0x7,0x5b,0x6b, 0x5,0x76,0x23, 0xf,0x6a,0x60, 0x7,0x5e,0x78, 0xf,0x6a,0x5f, 0x5,0x77,0x68, 0x7,0x61,0x21, 0x7,0x60,0x7c, 0x7,0x60,0x7e, 0x7,0x61,0x38, 0x7,0x60,0x7b, 0x7,0x60,0x7d, 0x7,0x62,0x3a, 0x5,0x7a,0x6b, 0xf,0x6c,0x64, 0xf,0x6c,0x65, 0x7,0x64,0x4d, 0x7,0x64,0x4c, 0x7,0x64,0x4e, 0x7,0x65,0x37, 0x7,0x66,0x34, 0x5,0x21,0x4b, 0x6,0x23,0x30, 0x6,0x28,0x4d, 0x6,0x28,0x4e, 0x5,0x24,0x58, 0x6,0x2c,0x62, 0x6,0x2c,0x61, 0x6,0x2c,0x63, 0xf,0x27,0x78, 0xf,0x27,0x79, 0x6,0x32,0x4e, 0x5,0x2a,0x2b, 0x5,0x2a,0x29, 0x6,0x32,0x4f, 0x5,0x2a,0x2a, 0x6,0x32,0x51, 0xf,0x2c,0x24, 0xf,0x2c,0x25, 0xf,0x2c,0x26, 0x6,0x32,0x4d, 0x6,0x32,0x50, 0x5,0x2e,0x51, 0x5,0x2e,0x50, 0xf,0x30,0x73, 0x6,0x41,0x57, 0x6,0x41,0x56, 0x6,0x41,0x58, 0xf,0x36,0x51, 0x4,0x38,0x6a, 0x6,0x4b,0x22, 0x6,0x47,0x43, 0x6,0x4d,0x5d, 0x6,0x54,0x68, 0x6,0x54,0x69, 0x6,0x5e,0x53, 0x5,0x47,0x23, 0x6,0x5e,0x56, 0x6,0x5e,0x55, 0x6,0x5e,0x54, 0x7,0x24,0x7a, 0x5,0x4e,0x2f, 0x7,0x24,0x77, 0x7,0x24,0x79, 0x7,0x24,0x78, 0x7,0x2f,0x69, 0x7,0x2f,0x6a, 0x5,0x55,0x3f, 0x4,0x56,0x65, 0xf,0x5b,0x24, 0xf,0x5b,0x25, 0xf,0x5b,0x26, 0xf,0x55,0x73, 0x7,0x40,0x56, 0x5,0x68,0x38, 0xf,0x65,0x4f, 0xf,0x65,0x50, 0x7,0x4e,0x3d, 0x7,0x53,0x68, 0x7,0x5b,0x71, 0x7,0x5e,0x79, 0x7,0x61,0x22, 0xf,0x24,0x73, 0xf,0x24,0x74, 0x6,0x2c,0x64, 0x6,0x2c,0x65, 0x6,0x41,0x59, 0x6,0x41,0x5a, 0xf,0x3d,0x22, 0xf,0x3d,0x23, 0x6,0x54,0x6a, 0xf,0x49,0x65, 0x5,0x47,0x24, 0x5,0x55,0x40, 0xf,0x21,0x68, 0x6,0x2b,0x6b, 0x5,0x2a,0x2c, 0x4,0x2a,0x2b, 0x4,0x2d,0x77, 0xf,0x30,0x74, 0x5,0x31,0x6c, 0x6,0x4b,0x23, 0x6,0x54,0x6c, 0x6,0x54,0x6b, 0x5,0x55,0x41, 0x7,0x24,0x7b, 0x7,0x24,0x7c, 0x5,0x55,0x42, 0x6,0x22,0x25, 0x6,0x23,0x31, 0x6,0x25,0x35, 0x6,0x28,0x4f, 0x4,0x27,0x2d, 0x6,0x2c,0x67, 0x6,0x2c,0x66, 0x6,0x32,0x52, 0x4,0x2a,0x2d, 0x6,0x32,0x53, 0x6,0x32,0x54, 0x6,0x39,0x3e, 0x4,0x2d,0x78, 0xf,0x30,0x75, 0x6,0x39,0x3d, 0x6,0x41,0x5b, 0x6,0x41,0x5e, 0x6,0x41,0x5d, 0x4,0x32,0x78, 0x6,0x41,0x5c, 0xf,0x36,0x52, 0xf,0x36,0x53, 0x6,0x4b,0x28, 0x6,0x4b,0x24, 0x6,0x4b,0x26, 0x6,0x4b,0x27, 0x6,0x4b,0x29, 0x6,0x4b,0x25, 0x6,0x4d,0x58, 0x6,0x54,0x6d, 0x6,0x54,0x6e, 0xf,0x43,0x3f, 0x6,0x5e,0x58, 0x6,0x5e,0x59, 0xf,0x49,0x66, 0x7,0x24,0x7d, 0xf,0x50,0x3e, 0x7,0x24,0x7e, 0x5,0x55,0x43, 0x5,0x62,0x51, 0x4,0x51,0x2c, 0x7,0x2f,0x6b, 0x7,0x25,0x21, 0x5,0x55,0x44, 0x7,0x39,0x2b, 0x7,0x39,0x2c, 0x5,0x5c,0x25, 0x7,0x47,0x70, 0x5,0x6c,0x52, 0x7,0x58,0x39, 0x7,0x5b,0x72, 0x7,0x63,0x58, 0x5,0x7b,0x42, 0x7,0x64,0x4f, 0xf,0x21,0x69, 0x6,0x28,0x51, 0x5,0x24,0x59, 0x6,0x28,0x50, 0x4,0x27,0x2e, 0x6,0x2c,0x6b, 0x6,0x2c,0x6a, 0x6,0x2c,0x69, 0x6,0x2c,0x68, 0x6,0x32,0x56, 0x6,0x32,0x55, 0x5,0x2a,0x2d, 0x6,0x32,0x57, 0x5,0x2a,0x2e, 0x5,0x2e,0x52, 0x4,0x2d,0x79, 0x4,0x2d,0x7b, 0x6,0x39,0x41, 0x6,0x39,0x3f, 0x5,0x33,0x46, 0x5,0x33,0x47, 0x6,0x41,0x5f, 0x6,0x41,0x62, 0x6,0x41,0x60, 0x6,0x4b,0x2b, 0x4,0x38,0x6d, 0x6,0x4b,0x2e, 0x6,0x4b,0x2a, 0x6,0x4b,0x2c, 0x6,0x4b,0x2d, 0x5,0x39,0x73, 0x5,0x39,0x76, 0x5,0x39,0x74, 0x5,0x39,0x75, 0x4,0x38,0x6e, 0x5,0x40,0x38, 0x6,0x54,0x6f, 0x4,0x3e,0x4d, 0x5,0x40,0x36, 0x5,0x40,0x37, 0x6,0x54,0x70, 0xf,0x3d,0x24, 0x5,0x47,0x25, 0x6,0x5e,0x5b, 0x6,0x5e,0x5c, 0x6,0x5e,0x5a, 0xf,0x49,0x67, 0x5,0x4e,0x32, 0x7,0x25,0x25, 0x5,0x4e,0x31, 0x5,0x4e,0x30, 0x5,0x4e,0x33, 0x7,0x25,0x24, 0x7,0x25,0x22, 0x5,0x4e,0x34, 0x7,0x25,0x23, 0x5,0x55,0x46, 0x5,0x55,0x47, 0x5,0x55,0x48, 0x7,0x2f,0x6d, 0x5,0x55,0x45, 0x7,0x2f,0x6c, 0x5,0x5c,0x26, 0x4,0x56,0x66, 0xf,0x5b,0x27, 0xf,0x5b,0x28, 0x5,0x62,0x53, 0x5,0x62,0x52, 0x5,0x6c,0x53, 0x7,0x53,0x69, 0x5,0x23,0x68, 0x6,0x39,0x43, 0x6,0x39,0x42, 0x4,0x38,0x6f, 0x6,0x4b,0x2f, 0xf,0x3d,0x25, 0xf,0x3d,0x26, 0x6,0x54,0x71, 0x6,0x5e,0x5d, 0x5,0x21,0x75, 0xf,0x22,0x63, 0x6,0x25,0x36, 0xf,0x22,0x62, 0x6,0x28,0x53, 0xf,0x24,0x75, 0x6,0x28,0x52, 0x6,0x28,0x54, 0x5,0x26,0x79, 0x5,0x27,0x22, 0x5,0x26,0x78, 0x5,0x26,0x7b, 0x5,0x26,0x76, 0x5,0x26,0x7d, 0x6,0x2c,0x6e, 0x4,0x27,0x30, 0x5,0x27,0x21, 0x6,0x2c,0x6c, 0x5,0x26,0x7e, 0x5,0x27,0x23, 0x5,0x26,0x7c, 0x6,0x2c,0x6d, 0xf,0x27,0x7b, 0xf,0x27,0x7c, 0xf,0x27,0x7e, 0xf,0x28,0x21, 0x5,0x26,0x7a, 0x6,0x2c,0x6f, 0x6,0x2c,0x70, 0x5,0x2a,0x32, 0x5,0x2a,0x30, 0x5,0x2a,0x2f, 0x6,0x32,0x5f, 0x6,0x32,0x5c, 0x5,0x2a,0x33, 0x5,0x2a,0x31, 0x4,0x2a,0x30, 0x6,0x32,0x5a, 0x6,0x32,0x59, 0xf,0x2c,0x28, 0xf,0x2c,0x29, 0x6,0x32,0x5b, 0x6,0x32,0x5e, 0x6,0x32,0x58, 0x6,0x32,0x5d, 0x5,0x2a,0x34, 0xf,0x27,0x7d, 0x5,0x2e,0x58, 0x5,0x2e,0x54, 0x5,0x2e,0x56, 0x5,0x2e,0x57, 0x5,0x2e,0x55, 0x6,0x39,0x44, 0x5,0x2e,0x59, 0x4,0x32,0x7b, 0x6,0x41,0x67, 0x6,0x41,0x68, 0x5,0x33,0x49, 0x5,0x39,0x77, 0x4,0x32,0x7d, 0x4,0x32,0x7c, 0x5,0x33,0x4b, 0x5,0x33,0x4c, 0xf,0x36,0x54, 0xf,0x36,0x55, 0x6,0x41,0x65, 0x6,0x41,0x69, 0x6,0x41,0x64, 0x5,0x33,0x48, 0x4,0x38,0x71, 0x4,0x38,0x74, 0x5,0x39,0x7d, 0x6,0x4b,0x34, 0x5,0x39,0x79, 0x5,0x39,0x7b, 0x5,0x39,0x78, 0x6,0x4b,0x32, 0x6,0x4b,0x35, 0xf,0x3d,0x27, 0xf,0x3d,0x28, 0x6,0x4b,0x33, 0x6,0x4b,0x30, 0x6,0x4b,0x31, 0x5,0x39,0x7a, 0x5,0x39,0x7c, 0x5,0x33,0x4a, 0xf,0x3d,0x29, 0x6,0x4b,0x36, 0x5,0x47,0x2b, 0x5,0x40,0x3e, 0x5,0x40,0x3c, 0x4,0x3e,0x50, 0x6,0x5e,0x64, 0x6,0x54,0x73, 0x5,0x47,0x26, 0x6,0x54,0x72, 0x6,0x54,0x75, 0x6,0x54,0x74, 0xf,0x43,0x40, 0xf,0x43,0x41, 0x5,0x40,0x3d, 0x6,0x54,0x77, 0x5,0x40,0x3b, 0x4,0x44,0x61, 0x5,0x47,0x2d, 0x5,0x47,0x28, 0x5,0x47,0x2e, 0x5,0x47,0x2c, 0x6,0x5e,0x5f, 0x6,0x5e,0x63, 0x5,0x47,0x27, 0x5,0x47,0x2a, 0x6,0x5e,0x67, 0x6,0x5e,0x62, 0x6,0x5e,0x61, 0x5,0x40,0x3a, 0x6,0x5e,0x66, 0xf,0x49,0x68, 0xf,0x49,0x69, 0xf,0x49,0x6a, 0xf,0x49,0x6b, 0x5,0x47,0x2f, 0x5,0x47,0x29, 0x6,0x5e,0x60, 0x6,0x54,0x76, 0x6,0x5e,0x65, 0xf,0x49,0x6c, 0x5,0x47,0x30, 0x5,0x4e,0x36, 0x7,0x25,0x26, 0x4,0x4a,0x74, 0x5,0x4e,0x39, 0x5,0x4e,0x3a, 0x5,0x4e,0x38, 0x4,0x4a,0x70, 0x5,0x4e,0x35, 0xf,0x50,0x3f, 0x7,0x25,0x28, 0x7,0x25,0x27, 0x7,0x2f,0x70, 0x5,0x55,0x49, 0x5,0x55,0x4e, 0x7,0x2f,0x71, 0x5,0x55,0x4b, 0x5,0x55,0x4d, 0x5,0x55,0x4a, 0x5,0x55,0x4c, 0x7,0x2f,0x6f, 0x7,0x39,0x30, 0x7,0x39,0x2e, 0x5,0x5c,0x27, 0x4,0x56,0x68, 0x4,0x56,0x69, 0x7,0x2f,0x6e, 0x7,0x39,0x2f, 0x7,0x40,0x57, 0x7,0x40,0x58, 0x5,0x68,0x3a, 0x7,0x53,0x6a, 0x7,0x47,0x72, 0x7,0x47,0x73, 0x7,0x47,0x71, 0x5,0x68,0x39, 0x7,0x4e,0x3f, 0x5,0x6c,0x54, 0x5,0x6c,0x55, 0x5,0x70,0x45, 0x7,0x53,0x6c, 0x5,0x70,0x44, 0x5,0x70,0x46, 0x7,0x58,0x3a, 0x5,0x73,0x59, 0x7,0x5b,0x74, 0x5,0x73,0x58, 0x7,0x5b,0x75, 0x7,0x5b,0x73, 0x5,0x77,0x69, 0x7,0x61,0x23, 0xf,0x6c,0x31, 0x7,0x64,0x50, 0xf,0x21,0x3d, 0x6,0x23,0x32, 0x5,0x21,0x77, 0x5,0x21,0x78, 0x5,0x22,0x78, 0x5,0x22,0x7b, 0x5,0x22,0x77, 0x4,0x23,0x28, 0x5,0x22,0x7a, 0x6,0x25,0x37, 0x5,0x22,0x79, 0x5,0x24,0x5e, 0x5,0x24,0x5f, 0x4,0x24,0x5b, 0x4,0x27,0x37, 0x6,0x28,0x58, 0x4,0x24,0x5a, 0x5,0x24,0x5a, 0x6,0x28,0x5e, 0x5,0x24,0x5b, 0x6,0x28,0x5b, 0x5,0x27,0x2f, 0x6,0x2c,0x72, 0x4,0x24,0x57, 0x5,0x24,0x5d, 0x5,0x24,0x5c, 0x6,0x28,0x5a, 0x6,0x28,0x59, 0x6,0x2c,0x73, 0xf,0x24,0x77, 0x6,0x28,0x57, 0x6,0x28,0x5c, 0x6,0x28,0x5d, 0x6,0x28,0x56, 0x4,0x24,0x58, 0x6,0x2c,0x7a, 0x5,0x27,0x28, 0x6,0x2c,0x7b, 0x5,0x27,0x2c, 0x6,0x2c,0x79, 0x6,0x2c,0x7c, 0x5,0x27,0x27, 0x5,0x27,0x2a, 0x6,0x2c,0x78, 0x5,0x27,0x2d, 0x5,0x27,0x25, 0x5,0x27,0x29, 0x5,0x27,0x24, 0x6,0x2c,0x77, 0x4,0x27,0x38, 0x5,0x2a,0x36, 0x6,0x28,0x55, 0x6,0x32,0x60, 0x5,0x27,0x2b, 0x6,0x2c,0x76, 0xf,0x28,0x22, 0x6,0x2c,0x7d, 0x6,0x2c,0x74, 0x4,0x27,0x35, 0x5,0x2a,0x35, 0x5,0x2a,0x3e, 0x6,0x32,0x68, 0x5,0x2a,0x39, 0x6,0x39,0x4b, 0x5,0x2a,0x3d, 0x6,0x32,0x61, 0x6,0x39,0x4c, 0x6,0x41,0x6c, 0x5,0x2a,0x3c, 0x4,0x2a,0x31, 0x5,0x2a,0x3b, 0x6,0x32,0x64, 0x5,0x2a,0x3a, 0x6,0x32,0x66, 0x4,0x2a,0x33, 0x5,0x2a,0x40, 0x6,0x32,0x63, 0x5,0x27,0x26, 0x5,0x2a,0x37, 0x5,0x2a,0x38, 0xf,0x2c,0x2a, 0xf,0x2c,0x2c, 0xf,0x2c,0x2d, 0x6,0x32,0x65, 0xf,0x2c,0x2b, 0x5,0x2a,0x3f, 0x6,0x39,0x4e, 0x5,0x2e,0x5e, 0x4,0x33,0x21, 0x6,0x39,0x49, 0x6,0x39,0x4d, 0x4,0x2e,0x25, 0x5,0x2e,0x5b, 0x5,0x2e,0x60, 0x5,0x2e,0x5d, 0x4,0x2e,0x23, 0x6,0x39,0x45, 0x6,0x39,0x4a, 0xf,0x30,0x77, 0xf,0x30,0x78, 0x6,0x39,0x48, 0x5,0x2e,0x5a, 0x4,0x2e,0x24, 0x6,0x39,0x47, 0x6,0x39,0x4f, 0x5,0x2e,0x5f, 0x6,0x39,0x46, 0x5,0x33,0x4e, 0xf,0x30,0x76, 0x4,0x33,0x24, 0x6,0x41,0x6e, 0x5,0x33,0x55, 0x5,0x39,0x7e, 0x5,0x33,0x52, 0x6,0x41,0x70, 0x6,0x41,0x73, 0x5,0x33,0x4f, 0x6,0x41,0x6f, 0x6,0x4b,0x3b, 0x4,0x33,0x26, 0x5,0x33,0x53, 0x6,0x4b,0x38, 0x6,0x4b,0x37, 0x5,0x33,0x50, 0x6,0x4b,0x39, 0x6,0x41,0x71, 0x6,0x41,0x72, 0x6,0x41,0x74, 0x6,0x4b,0x3a, 0x5,0x3a,0x28, 0x6,0x54,0x7b, 0x5,0x3a,0x26, 0x5,0x40,0x3f, 0x4,0x38,0x75, 0x5,0x3a,0x22, 0x6,0x4b,0x44, 0x5,0x40,0x40, 0x5,0x3a,0x27, 0x4,0x38,0x76, 0x5,0x3a,0x25, 0x5,0x3a,0x24, 0x4,0x38,0x78, 0x6,0x4b,0x3f, 0x4,0x3e,0x51, 0x5,0x3a,0x21, 0x6,0x4b,0x3c, 0x6,0x4b,0x3e, 0x4,0x3e,0x57, 0xf,0x3d,0x2a, 0xf,0x3d,0x2b, 0x6,0x54,0x79, 0x6,0x52,0x72, 0x6,0x54,0x7a, 0x6,0x4b,0x40, 0x6,0x4b,0x41, 0x6,0x4b,0x45, 0x6,0x4b,0x3d, 0x5,0x3a,0x23, 0xf,0x43,0x43, 0x4,0x3e,0x56, 0x5,0x40,0x48, 0x6,0x55,0x22, 0x5,0x40,0x47, 0x4,0x3e,0x55, 0x6,0x55,0x27, 0x5,0x40,0x4b, 0x6,0x55,0x24, 0x6,0x54,0x7e, 0x6,0x54,0x7d, 0x6,0x55,0x26, 0x5,0x40,0x46, 0x5,0x40,0x44, 0x5,0x40,0x43, 0x6,0x55,0x21, 0x5,0x40,0x42, 0x6,0x55,0x28, 0x5,0x40,0x4a, 0x5,0x40,0x41, 0x4,0x3e,0x58, 0x5,0x40,0x49, 0x6,0x55,0x25, 0xf,0x43,0x45, 0xf,0x43,0x46, 0xf,0x49,0x70, 0xf,0x50,0x40, 0x5,0x40,0x45, 0x6,0x55,0x23, 0x5,0x40,0x4c, 0x6,0x5e,0x6d, 0x5,0x47,0x3a, 0x6,0x5e,0x69, 0x7,0x25,0x29, 0x5,0x47,0x37, 0x4,0x44,0x6b, 0x5,0x47,0x35, 0x5,0x47,0x33, 0x6,0x5e,0x6c, 0x5,0x47,0x3b, 0x5,0x47,0x36, 0x5,0x47,0x34, 0x6,0x5e,0x70, 0x4,0x44,0x6c, 0x5,0x47,0x31, 0xf,0x49,0x6d, 0x7,0x25,0x2a, 0xf,0x49,0x6f, 0x6,0x5e,0x6b, 0x6,0x5e,0x68, 0x6,0x5e,0x6a, 0x6,0x5e,0x6f, 0x4,0x4a,0x7d, 0x5,0x47,0x3d, 0x5,0x47,0x3c, 0x5,0x47,0x39, 0x5,0x47,0x38, 0x6,0x5e,0x71, 0x5,0x47,0x32, 0x7,0x25,0x31, 0x4,0x4a,0x78, 0x4,0x4a,0x79, 0x7,0x25,0x30, 0x5,0x4e,0x3c, 0x7,0x25,0x34, 0x7,0x2f,0x73, 0x5,0x4e,0x41, 0x7,0x25,0x2f, 0x7,0x25,0x2b, 0x5,0x4e,0x3e, 0x5,0x4e,0x45, 0x5,0x4e,0x3b, 0x5,0x4e,0x44, 0x5,0x4e,0x43, 0x5,0x4e,0x3d, 0x5,0x55,0x4f, 0x7,0x2f,0x72, 0x5,0x4e,0x3f, 0x5,0x4e,0x40, 0x5,0x4e,0x46, 0x7,0x25,0x2c, 0x7,0x25,0x2d, 0xf,0x55,0x75, 0x5,0x55,0x50, 0x7,0x25,0x2e, 0x7,0x25,0x33, 0xf,0x49,0x6e, 0x4,0x51,0x33, 0x5,0x4e,0x42, 0x5,0x55,0x57, 0x4,0x51,0x35, 0x5,0x55,0x55, 0x5,0x55,0x51, 0x5,0x55,0x52, 0x7,0x2f,0x79, 0x4,0x51,0x31, 0x7,0x2f,0x78, 0x7,0x2f,0x77, 0x5,0x5c,0x28, 0x4,0x51,0x36, 0x5,0x55,0x53, 0x5,0x55,0x56, 0x7,0x2f,0x75, 0x7,0x39,0x32, 0x4,0x56,0x6d, 0x7,0x39,0x31, 0x7,0x2f,0x76, 0x7,0x25,0x32, 0xf,0x55,0x77, 0x7,0x25,0x35, 0x5,0x55,0x54, 0x5,0x5c,0x2a, 0x7,0x39,0x33, 0x5,0x5c,0x29, 0x7,0x47,0x77, 0x7,0x39,0x35, 0x7,0x39,0x34, 0xf,0x5b,0x29, 0xf,0x5b,0x2a, 0xf,0x5b,0x2b, 0xf,0x5b,0x2c, 0x7,0x40,0x5d, 0x5,0x62,0x55, 0x5,0x62,0x54, 0x7,0x40,0x5a, 0x7,0x40,0x59, 0x7,0x40,0x5c, 0x4,0x5b,0x68, 0x7,0x40,0x5b, 0xf,0x5f,0x4e, 0xf,0x5f,0x4f, 0x5,0x62,0x56, 0x4,0x63,0x64, 0x7,0x47,0x78, 0x7,0x4e,0x40, 0x7,0x47,0x76, 0x7,0x47,0x74, 0x7,0x4e,0x41, 0x5,0x6c,0x56, 0x7,0x4e,0x42, 0x5,0x70,0x48, 0x7,0x53,0x6d, 0x5,0x70,0x47, 0x4,0x68,0x74, 0x5,0x70,0x49, 0x7,0x58,0x3b, 0x7,0x5b,0x76, 0x7,0x5b,0x78, 0x7,0x5b,0x77, 0x5,0x77,0x6a, 0x7,0x5e,0x7a, 0xf,0x6b,0x55, 0x7,0x61,0x24, 0x7,0x63,0x59, 0xf,0x28,0x23, 0x6,0x4b,0x46, 0x6,0x5e,0x72, 0x5,0x21,0x4c, 0x6,0x25,0x38, 0x6,0x23,0x33, 0x6,0x28,0x5f, 0x5,0x24,0x61, 0x4,0x24,0x5d, 0x4,0x24,0x5c, 0x6,0x28,0x61, 0x6,0x28,0x60, 0xf,0x24,0x79, 0x5,0x24,0x60, 0x5,0x27,0x30, 0x6,0x2d,0x25, 0x4,0x27,0x3c, 0x5,0x2a,0x41, 0xf,0x28,0x25, 0xf,0x28,0x26, 0xf,0x28,0x27, 0xf,0x28,0x28, 0xf,0x28,0x29, 0x6,0x2d,0x23, 0xf,0x2c,0x40, 0xf,0x28,0x24, 0x6,0x2d,0x22, 0xf,0x2c,0x3c, 0x6,0x32,0x69, 0x5,0x2a,0x45, 0x5,0x2a,0x42, 0x4,0x2a,0x36, 0x6,0x32,0x6b, 0x6,0x2f,0x69, 0xf,0x2c,0x2f, 0xf,0x2c,0x30, 0xf,0x2c,0x31, 0xf,0x2c,0x33, 0xf,0x2c,0x34, 0xf,0x2c,0x35, 0xf,0x2c,0x36, 0xf,0x2c,0x37, 0xf,0x2c,0x38, 0xf,0x2c,0x3a, 0xf,0x2c,0x3b, 0xf,0x2c,0x3d, 0x6,0x32,0x6a, 0x6,0x32,0x6c, 0xf,0x2c,0x3e, 0xf,0x2c,0x3f, 0xf,0x2c,0x2e, 0x5,0x2a,0x44, 0x5,0x2a,0x43, 0x6,0x39,0x53, 0x5,0x33,0x56, 0x5,0x2e,0x61, 0x4,0x2e,0x29, 0x6,0x39,0x51, 0x4,0x2e,0x28, 0x6,0x39,0x52, 0x6,0x39,0x54, 0xf,0x30,0x79, 0xf,0x30,0x7a, 0xf,0x30,0x7b, 0xf,0x30,0x7c, 0xf,0x30,0x7d, 0xf,0x30,0x7e, 0xf,0x31,0x21, 0xf,0x31,0x23, 0xf,0x31,0x24, 0xf,0x31,0x25, 0xf,0x31,0x26, 0x6,0x39,0x50, 0xf,0x36,0x63, 0x4,0x33,0x31, 0x6,0x39,0x55, 0x6,0x41,0x7a, 0x5,0x33,0x57, 0x6,0x41,0x7b, 0x4,0x33,0x32, 0x6,0x41,0x77, 0x6,0x41,0x78, 0x6,0x41,0x79, 0xf,0x31,0x22, 0xf,0x36,0x56, 0xf,0x36,0x58, 0xf,0x36,0x5c, 0xf,0x36,0x5f, 0xf,0x36,0x60, 0xf,0x36,0x61, 0xf,0x36,0x62, 0xf,0x36,0x64, 0xf,0x36,0x5d, 0x6,0x41,0x7c, 0xf,0x36,0x5b, 0xf,0x36,0x5a, 0xf,0x36,0x5e, 0x5,0x33,0x58, 0x6,0x41,0x76, 0xf,0x3d,0x3e, 0xf,0x3d,0x34, 0x6,0x4b,0x4b, 0x5,0x3a,0x2b, 0x5,0x3a,0x2a, 0x5,0x3a,0x2c, 0x6,0x55,0x29, 0x4,0x3e,0x5a, 0x5,0x40,0x4d, 0xf,0x3d,0x38, 0x4,0x38,0x7c, 0x6,0x4b,0x49, 0x6,0x4b,0x4c, 0xf,0x3d,0x2c, 0xf,0x3d,0x2d, 0xf,0x3d,0x2e, 0xf,0x3d,0x2f, 0xf,0x3d,0x30, 0xf,0x3d,0x32, 0xf,0x3d,0x35, 0xf,0x3d,0x36, 0xf,0x3d,0x37, 0xf,0x3d,0x39, 0xf,0x3d,0x3a, 0xf,0x3d,0x3f, 0xf,0x43,0x50, 0x6,0x4b,0x4e, 0x6,0x55,0x32, 0x6,0x4b,0x4d, 0xf,0x3d,0x40, 0x6,0x4b,0x48, 0x6,0x4b,0x4a, 0x6,0x55,0x2a, 0xf,0x3d,0x33, 0xf,0x3d,0x3d, 0xf,0x3d,0x31, 0x5,0x3a,0x29, 0x6,0x55,0x2b, 0x6,0x55,0x30, 0x4,0x3e,0x5b, 0x6,0x55,0x31, 0x6,0x55,0x2f, 0x6,0x55,0x2e, 0x5,0x47,0x3e, 0xf,0x43,0x47, 0xf,0x43,0x4a, 0xf,0x43,0x4c, 0xf,0x43,0x4d, 0xf,0x43,0x4e, 0xf,0x43,0x4f, 0xf,0x43,0x51, 0xf,0x43,0x52, 0xf,0x43,0x53, 0xf,0x43,0x54, 0xf,0x43,0x55, 0xf,0x43,0x57, 0xf,0x43,0x58, 0xf,0x43,0x5a, 0xf,0x43,0x5b, 0xf,0x43,0x5c, 0xf,0x43,0x5d, 0xf,0x43,0x5e, 0xf,0x43,0x5f, 0xf,0x43,0x60, 0xf,0x43,0x61, 0xf,0x43,0x62, 0xf,0x43,0x63, 0xf,0x43,0x65, 0x6,0x55,0x2c, 0x5,0x40,0x4f, 0x5,0x3a,0x2e, 0xf,0x43,0x4b, 0xf,0x43,0x48, 0x5,0x47,0x3f, 0x6,0x55,0x2d, 0xf,0x43,0x59, 0xf,0x49,0x7a, 0xf,0x49,0x7b, 0xf,0x4a,0x26, 0x7,0x25,0x38, 0x6,0x5e,0x74, 0x5,0x47,0x41, 0x7,0x25,0x36, 0x4,0x44,0x6d, 0x5,0x47,0x40, 0x6,0x5e,0x75, 0x6,0x5e,0x77, 0x6,0x5e,0x76, 0x6,0x5e,0x73, 0xf,0x49,0x71, 0xf,0x49,0x72, 0xf,0x49,0x73, 0xf,0x49,0x74, 0xf,0x49,0x75, 0xf,0x49,0x77, 0xf,0x49,0x78, 0xf,0x49,0x79, 0xf,0x49,0x7c, 0xf,0x49,0x7d, 0xf,0x49,0x7e, 0xf,0x4a,0x21, 0xf,0x4a,0x22, 0xf,0x4a,0x24, 0xf,0x4a,0x25, 0xf,0x4a,0x27, 0xf,0x4a,0x28, 0xf,0x4a,0x29, 0x5,0x47,0x42, 0x3,0x48,0x26, 0x7,0x25,0x39, 0xf,0x4a,0x23, 0x7,0x25,0x40, 0x4,0x4a,0x7e, 0x5,0x4e,0x47, 0x7,0x2f,0x7b, 0x7,0x25,0x3a, 0x7,0x2f,0x7a, 0x7,0x25,0x3c, 0x7,0x25,0x3f, 0x7,0x25,0x41, 0x7,0x25,0x42, 0xf,0x50,0x41, 0xf,0x50,0x42, 0xf,0x50,0x43, 0xf,0x50,0x44, 0xf,0x50,0x45, 0xf,0x50,0x46, 0xf,0x50,0x48, 0xf,0x50,0x49, 0xf,0x50,0x4a, 0xf,0x50,0x4b, 0xf,0x50,0x4c, 0x7,0x25,0x3d, 0x5,0x4e,0x48, 0x7,0x25,0x3b, 0x5,0x4e,0x49, 0xf,0x55,0x7c, 0xf,0x56,0x2e, 0xf,0x50,0x47, 0x7,0x30,0x22, 0x7,0x25,0x3e, 0x5,0x55,0x58, 0x5,0x55,0x5b, 0x5,0x55,0x59, 0x4,0x51,0x3b, 0x7,0x30,0x24, 0x7,0x2f,0x7d, 0x7,0x2f,0x7e, 0x7,0x2f,0x7c, 0x4,0x51,0x3c, 0x7,0x30,0x21, 0xf,0x55,0x78, 0xf,0x55,0x79, 0xf,0x55,0x7b, 0xf,0x55,0x7d, 0xf,0x56,0x23, 0xf,0x56,0x24, 0xf,0x56,0x25, 0xf,0x56,0x26, 0xf,0x56,0x27, 0xf,0x56,0x29, 0xf,0x56,0x2d, 0xf,0x56,0x2f, 0x7,0x30,0x25, 0x7,0x30,0x23, 0x7,0x39,0x36, 0xf,0x56,0x30, 0xf,0x56,0x21, 0xf,0x56,0x28, 0x5,0x55,0x5c, 0x5,0x55,0x5a, 0xf,0x56,0x2c, 0x7,0x39,0x3b, 0x7,0x39,0x3d, 0x5,0x5c,0x2d, 0x5,0x5c,0x2b, 0x7,0x40,0x5e, 0x7,0x39,0x39, 0x4,0x5b,0x6a, 0x4,0x56,0x6e, 0x4,0x56,0x70, 0x7,0x39,0x38, 0xf,0x5b,0x2e, 0xf,0x5b,0x2f, 0xf,0x5b,0x30, 0xf,0x5b,0x31, 0xf,0x5b,0x32, 0xf,0x5b,0x33, 0xf,0x5b,0x34, 0xf,0x5b,0x35, 0x5,0x5c,0x2c, 0x7,0x39,0x3a, 0x7,0x39,0x3c, 0x7,0x39,0x37, 0x7,0x40,0x5f, 0x5,0x68,0x3c, 0x4,0x5b,0x6b, 0x5,0x62,0x57, 0x4,0x60,0x26, 0x7,0x40,0x60, 0x4,0x60,0x28, 0xf,0x5f,0x51, 0xf,0x5f,0x53, 0xf,0x5f,0x54, 0xf,0x5f,0x55, 0xf,0x5f,0x57, 0xf,0x5f,0x59, 0xf,0x5f,0x5a, 0xf,0x5f,0x5b, 0xf,0x5f,0x5c, 0xf,0x5f,0x5f, 0x7,0x40,0x61, 0x7,0x40,0x62, 0xf,0x5f,0x50, 0xf,0x5f,0x52, 0xf,0x5f,0x58, 0xf,0x63,0x23, 0x7,0x47,0x7c, 0x7,0x47,0x7b, 0x5,0x68,0x3e, 0x7,0x47,0x7a, 0x7,0x4e,0x43, 0x5,0x68,0x3d, 0x7,0x47,0x79, 0xf,0x62,0x7c, 0xf,0x62,0x7e, 0xf,0x63,0x21, 0xf,0x63,0x22, 0x4,0x60,0x29, 0xf,0x62,0x79, 0xf,0x62,0x7a, 0xf,0x62,0x7d, 0x7,0x53,0x6f, 0x5,0x6c,0x57, 0x4,0x66,0x52, 0xf,0x65,0x52, 0xf,0x65,0x53, 0xf,0x65,0x54, 0xf,0x65,0x55, 0x7,0x4e,0x44, 0x7,0x53,0x6e, 0xf,0x5f,0x5e, 0x4,0x66,0x51, 0x7,0x55,0x7c, 0x4,0x66,0x53, 0x7,0x58,0x3c, 0xf,0x67,0x76, 0x7,0x5b,0x79, 0x4,0x6a,0x52, 0xf,0x69,0x59, 0xf,0x69,0x5a, 0x5,0x76,0x24, 0xf,0x6a,0x61, 0xf,0x6a,0x63, 0xf,0x6b,0x56, 0xf,0x6a,0x62, 0x5,0x79,0x31, 0x7,0x61,0x26, 0x7,0x61,0x25, 0xf,0x6c,0x32, 0x5,0x7a,0x2c, 0x4,0x6e,0x34, 0x6,0x2d,0x26, 0x5,0x2a,0x47, 0x5,0x2a,0x46, 0x6,0x32,0x6d, 0xf,0x2c,0x41, 0x6,0x32,0x6e, 0x6,0x39,0x56, 0x5,0x2e,0x63, 0x5,0x2e,0x64, 0x6,0x39,0x57, 0x6,0x39,0x58, 0x4,0x33,0x36, 0x5,0x33,0x59, 0x5,0x33,0x5a, 0xf,0x36,0x65, 0x5,0x3a,0x2f, 0x5,0x3a,0x30, 0x6,0x4b,0x4f, 0xf,0x3d,0x41, 0x6,0x4b,0x50, 0x4,0x3e,0x5c, 0x5,0x40,0x50, 0x5,0x40,0x51, 0xf,0x43,0x66, 0x7,0x25,0x45, 0x6,0x5e,0x78, 0x5,0x47,0x43, 0xf,0x4a,0x2a, 0x5,0x47,0x44, 0x7,0x25,0x44, 0x7,0x30,0x26, 0x4,0x51,0x3d, 0x5,0x4e,0x4a, 0xf,0x50,0x4d, 0x7,0x25,0x43, 0x4,0x51,0x3e, 0x7,0x39,0x3e, 0x5,0x62,0x58, 0xf,0x5f,0x60, 0x4,0x5b,0x6d, 0x4,0x66,0x54, 0x7,0x53,0x70, 0x5,0x70,0x4a, 0x5,0x76,0x25, 0x7,0x5b,0x7a, 0x7,0x5e,0x7b, 0x7,0x62,0x3b, 0x7,0x62,0x3c, 0x5,0x24,0x62, 0x5,0x27,0x31, 0x4,0x27,0x3d, 0x6,0x2d,0x27, 0x5,0x2a,0x48, 0x5,0x2a,0x49, 0x6,0x32,0x6f, 0x4,0x2a,0x3b, 0x4,0x2a,0x3e, 0x5,0x2e,0x65, 0x5,0x2e,0x67, 0x6,0x39,0x5c, 0x5,0x2e,0x66, 0xf,0x31,0x29, 0x6,0x39,0x5b, 0x6,0x39,0x59, 0x6,0x39,0x5a, 0x5,0x33,0x5d, 0x6,0x42,0x22, 0x6,0x41,0x7e, 0x6,0x42,0x24, 0x5,0x33,0x5e, 0x6,0x42,0x23, 0x5,0x33,0x5c, 0xf,0x36,0x66, 0xf,0x36,0x68, 0x4,0x39,0x22, 0x5,0x3a,0x31, 0x6,0x55,0x36, 0x4,0x39,0x27, 0x5,0x3a,0x34, 0x5,0x3a,0x33, 0x5,0x33,0x5f, 0x6,0x4b,0x52, 0x5,0x3a,0x32, 0x5,0x33,0x5b, 0x6,0x4b,0x51, 0x6,0x4b,0x53, 0x4,0x3e,0x64, 0x5,0x40,0x52, 0x6,0x55,0x37, 0x4,0x3e,0x5e, 0x5,0x40,0x53, 0x6,0x55,0x33, 0x6,0x55,0x35, 0x4,0x3e,0x5f, 0x6,0x55,0x38, 0xf,0x43,0x67, 0x6,0x55,0x34, 0x5,0x47,0x47, 0x6,0x5e,0x7c, 0x5,0x47,0x45, 0x6,0x5e,0x7a, 0x4,0x44,0x72, 0x6,0x5e,0x79, 0x6,0x5e,0x7b, 0x5,0x47,0x46, 0x4,0x4b,0x28, 0x7,0x25,0x4a, 0x5,0x4e,0x4c, 0x5,0x4e,0x4d, 0x5,0x4e,0x4e, 0x7,0x25,0x46, 0x7,0x25,0x47, 0x7,0x25,0x49, 0x7,0x30,0x27, 0x4,0x56,0x74, 0x7,0x30,0x28, 0x5,0x55,0x5f, 0x5,0x55,0x61, 0x4,0x51,0x40, 0x5,0x55,0x60, 0x5,0x55,0x5e, 0x4,0x56,0x76, 0x5,0x5c,0x2e, 0x4,0x56,0x77, 0x7,0x39,0x40, 0x7,0x39,0x3f, 0x5,0x4e,0x4b, 0x4,0x5b,0x70, 0x5,0x62,0x5b, 0x5,0x62,0x5a, 0x7,0x40,0x64, 0x5,0x62,0x59, 0x7,0x40,0x65, 0x5,0x68,0x3f, 0x7,0x4e,0x45, 0x7,0x53,0x71, 0x7,0x53,0x72, 0x4,0x66,0x56, 0x5,0x70,0x4b, 0x4,0x66,0x55, 0x7,0x53,0x73, 0x4,0x68,0x76, 0x7,0x58,0x3d, 0x5,0x73,0x5a, 0x5,0x76,0x28, 0x5,0x76,0x27, 0x7,0x5b,0x7b, 0x5,0x76,0x26, 0x7,0x5c,0x6b, 0x5,0x7a,0x6c, 0x7,0x65,0x38, 0x6,0x23,0x34, 0x6,0x2d,0x28, 0x5,0x27,0x33, 0x4,0x27,0x3e, 0xf,0x28,0x2b, 0x6,0x32,0x70, 0xf,0x2c,0x43, 0x5,0x40,0x54, 0x6,0x5e,0x7d, 0x7,0x30,0x2b, 0x7,0x30,0x29, 0x7,0x30,0x2a, 0x4,0x56,0x79, 0x7,0x40,0x66, 0x5,0x70,0x4c, 0x6,0x23,0x35, 0x6,0x25,0x39, 0x6,0x2d,0x29, 0x5,0x27,0x34, 0x6,0x2d,0x2a, 0xf,0x2c,0x44, 0xf,0x2c,0x45, 0x5,0x2a,0x4a, 0x4,0x2a,0x3f, 0x6,0x32,0x71, 0x6,0x34,0x79, 0x5,0x2e,0x69, 0x6,0x42,0x26, 0x5,0x33,0x60, 0x6,0x42,0x25, 0x6,0x42,0x27, 0xf,0x36,0x69, 0x6,0x55,0x39, 0x6,0x4b,0x54, 0xf,0x3d,0x43, 0xf,0x3d,0x42, 0x6,0x55,0x3b, 0xf,0x43,0x68, 0x6,0x55,0x3a, 0x6,0x5e,0x7e, 0x7,0x25,0x4b, 0xf,0x4a,0x2b, 0x4,0x56,0x7a, 0xf,0x5b,0x36, 0xf,0x63,0x26, 0x7,0x46,0x6e, 0xf,0x63,0x25, 0x7,0x53,0x74, 0x6,0x25,0x3a, 0xf,0x24,0x7a, 0x5,0x27,0x35, 0x6,0x2d,0x2e, 0x6,0x39,0x5d, 0x5,0x33,0x61, 0xf,0x4a,0x2c, 0xf,0x5f,0x61, 0x7,0x47,0x7d, 0xf,0x6c,0x33, 0x5,0x73,0x5b, 0x4,0x24,0x5f, 0xf,0x24,0x7c, 0xf,0x24,0x7b, 0x6,0x28,0x63, 0x4,0x27,0x42, 0x4,0x25,0x53, 0x4,0x27,0x3f, 0x5,0x27,0x36, 0x6,0x2d,0x31, 0x6,0x2d,0x30, 0x6,0x2d,0x33, 0xf,0x28,0x2c, 0xf,0x28,0x2d, 0x6,0x2d,0x2f, 0x4,0x2a,0x42, 0x5,0x2a,0x4d, 0x6,0x32,0x74, 0x5,0x2a,0x4c, 0x6,0x32,0x73, 0x5,0x2a,0x4b, 0x6,0x32,0x76, 0x6,0x32,0x7a, 0x6,0x32,0x77, 0x6,0x39,0x65, 0x5,0x2a,0x4e, 0x6,0x32,0x78, 0x6,0x32,0x75, 0x5,0x2e,0x6e, 0xf,0x2c,0x46, 0xf,0x2c,0x47, 0xf,0x2c,0x48, 0xf,0x2c,0x49, 0xf,0x2c,0x4b, 0xf,0x2c,0x4c, 0xf,0x2c,0x4d, 0xf,0x2c,0x4e, 0xf,0x2c,0x4f, 0x5,0x2a,0x4f, 0x5,0x2e,0x6a, 0x4,0x2e,0x2e, 0x5,0x2e,0x6b, 0x6,0x39,0x61, 0x6,0x39,0x60, 0x6,0x39,0x62, 0x6,0x39,0x5f, 0x6,0x39,0x63, 0xf,0x31,0x2a, 0xf,0x31,0x2b, 0xf,0x31,0x2c, 0xf,0x31,0x2e, 0x4,0x2e,0x30, 0xf,0x31,0x2d, 0x5,0x2e,0x6d, 0x5,0x2e,0x6c, 0x4,0x33,0x3e, 0x6,0x42,0x28, 0x5,0x33,0x63, 0x5,0x33,0x62, 0x4,0x33,0x3d, 0x6,0x42,0x2c, 0x6,0x42,0x2f, 0x6,0x42,0x2a, 0x6,0x42,0x2d, 0x6,0x42,0x2e, 0xf,0x36,0x6b, 0xf,0x36,0x6c, 0x6,0x42,0x2b, 0x6,0x42,0x29, 0x6,0x41,0x6b, 0x4,0x39,0x2b, 0x4,0x39,0x29, 0x4,0x39,0x2a, 0x6,0x4b,0x57, 0x6,0x4b,0x59, 0xf,0x36,0x6a, 0xf,0x3d,0x46, 0xf,0x3d,0x47, 0xf,0x3d,0x48, 0x6,0x4b,0x58, 0x4,0x39,0x2d, 0x6,0x4b,0x55, 0xf,0x3d,0x44, 0xf,0x3d,0x45, 0x6,0x55,0x40, 0x4,0x3e,0x6a, 0x4,0x3e,0x67, 0x6,0x55,0x3e, 0x6,0x55,0x3f, 0x4,0x3e,0x66, 0x5,0x40,0x56, 0x6,0x55,0x3c, 0x6,0x55,0x42, 0x5,0x40,0x55, 0x6,0x55,0x43, 0x6,0x55,0x44, 0x6,0x55,0x41, 0xf,0x43,0x69, 0xf,0x43,0x6a, 0x5,0x40,0x57, 0x6,0x55,0x3d, 0x6,0x5f,0x23, 0x4,0x44,0x7a, 0x5,0x47,0x4a, 0x6,0x5f,0x22, 0x6,0x5f,0x25, 0x6,0x5f,0x28, 0xf,0x4a,0x2d, 0x6,0x5f,0x26, 0x6,0x5f,0x24, 0x6,0x5f,0x27, 0x7,0x25,0x50, 0x4,0x4b,0x2c, 0x7,0x25,0x4c, 0x7,0x25,0x4e, 0x7,0x25,0x4d, 0x7,0x25,0x4f, 0x5,0x4e,0x4f, 0x7,0x25,0x51, 0xf,0x50,0x4f, 0x4,0x4b,0x2b, 0x4,0x51,0x45, 0x4,0x51,0x43, 0x4,0x51,0x46, 0x7,0x30,0x2c, 0x5,0x55,0x62, 0xf,0x56,0x32, 0x7,0x2c,0x3b, 0x7,0x39,0x41, 0x5,0x5c,0x33, 0x7,0x39,0x43, 0x5,0x5c,0x31, 0x4,0x56,0x7b, 0x7,0x39,0x42, 0x5,0x5c,0x34, 0xf,0x5b,0x37, 0x7,0x3c,0x76, 0x5,0x5c,0x30, 0x5,0x5c,0x32, 0xf,0x56,0x31, 0x4,0x5b,0x71, 0x7,0x47,0x7e, 0x5,0x68,0x41, 0x7,0x48,0x23, 0x7,0x4e,0x46, 0x7,0x48,0x21, 0x7,0x48,0x24, 0x4,0x60,0x2d, 0x7,0x48,0x22, 0x7,0x4e,0x48, 0x7,0x4e,0x47, 0x7,0x53,0x77, 0xf,0x67,0x77, 0x7,0x53,0x75, 0x7,0x53,0x76, 0xf,0x67,0x52, 0x7,0x58,0x3e, 0x4,0x68,0x77, 0x7,0x53,0x78, 0x7,0x5b,0x7d, 0xf,0x6a,0x64, 0x7,0x5b,0x7c, 0x7,0x5e,0x7c, 0x7,0x62,0x3e, 0x7,0x62,0x3d, 0x7,0x63,0x5a, 0x7,0x63,0x5c, 0x7,0x63,0x5b, 0x7,0x66,0x29, 0x7,0x66,0x35, 0x7,0x66,0x46, 0x6,0x23,0x36, 0x6,0x25,0x3b, 0xf,0x28,0x2e, 0x4,0x2e,0x32, 0x5,0x2a,0x50, 0x4,0x39,0x2e, 0x6,0x55,0x46, 0x6,0x55,0x45, 0x6,0x5f,0x29, 0x5,0x55,0x63, 0x7,0x30,0x2e, 0x7,0x25,0x52, 0x7,0x58,0x3f, 0x5,0x22,0x7c, 0x5,0x24,0x64, 0x5,0x24,0x65, 0x4,0x24,0x60, 0x6,0x28,0x66, 0x6,0x28,0x67, 0x6,0x28,0x65, 0x6,0x28,0x68, 0x4,0x27,0x45, 0x6,0x2d,0x35, 0x4,0x27,0x44, 0xf,0x28,0x2f, 0x5,0x27,0x38, 0x6,0x2d,0x36, 0x6,0x32,0x7d, 0x4,0x2a,0x4b, 0x6,0x32,0x7c, 0x6,0x32,0x7b, 0x5,0x2a,0x52, 0x5,0x2a,0x56, 0x4,0x2a,0x47, 0x4,0x2a,0x48, 0x5,0x2a,0x53, 0x4,0x2a,0x45, 0x5,0x2a,0x54, 0x5,0x2a,0x51, 0x5,0x2a,0x55, 0x6,0x33,0x24, 0xf,0x2c,0x50, 0x6,0x32,0x7e, 0xf,0x2c,0x51, 0x6,0x33,0x22, 0x6,0x33,0x23, 0x6,0x33,0x21, 0x6,0x39,0x69, 0x5,0x2e,0x6f, 0x5,0x2e,0x73, 0x6,0x39,0x6f, 0x5,0x2e,0x71, 0x6,0x39,0x70, 0x6,0x39,0x6a, 0x5,0x2e,0x76, 0x5,0x2e,0x72, 0x5,0x2e,0x75, 0x6,0x39,0x6d, 0x6,0x39,0x71, 0x6,0x39,0x66, 0x4,0x2e,0x3d, 0x5,0x2e,0x74, 0x6,0x39,0x68, 0x4,0x2e,0x3e, 0x5,0x2e,0x70, 0x6,0x39,0x6e, 0xf,0x31,0x2f, 0x6,0x39,0x67, 0x6,0x39,0x6c, 0x6,0x42,0x31, 0x6,0x42,0x37, 0x5,0x33,0x68, 0x6,0x42,0x35, 0x5,0x33,0x6b, 0x4,0x33,0x41, 0x5,0x33,0x6a, 0x5,0x33,0x66, 0x6,0x42,0x33, 0x4,0x33,0x44, 0x5,0x33,0x69, 0xf,0x36,0x6d, 0xf,0x36,0x6e, 0xf,0x36,0x6f, 0x6,0x42,0x36, 0x6,0x42,0x39, 0x6,0x42,0x34, 0x6,0x42,0x38, 0xf,0x36,0x70, 0x6,0x42,0x30, 0x5,0x33,0x67, 0x5,0x33,0x6c, 0x5,0x3a,0x36, 0x5,0x3a,0x3f, 0x6,0x4b,0x61, 0x5,0x3a,0x35, 0x6,0x4b,0x65, 0x5,0x3a,0x39, 0x5,0x3a,0x3a, 0x5,0x3a,0x3c, 0x5,0x3a,0x37, 0x6,0x4b,0x63, 0x6,0x4b,0x5f, 0x5,0x3a,0x40, 0x6,0x4b,0x62, 0x6,0x4b,0x5b, 0x6,0x4b,0x66, 0x5,0x3a,0x3e, 0x6,0x4b,0x5e, 0x4,0x39,0x39, 0x6,0x4b,0x5d, 0x6,0x4b,0x60, 0x6,0x4b,0x64, 0xf,0x3d,0x49, 0xf,0x3d,0x4a, 0x4,0x39,0x37, 0x6,0x4b,0x5c, 0x4,0x39,0x31, 0x5,0x3a,0x38, 0x6,0x55,0x4c, 0x4,0x3e,0x72, 0x4,0x3e,0x70, 0x4,0x3e,0x7b, 0x5,0x40,0x59, 0x4,0x3e,0x71, 0x4,0x3e,0x75, 0x4,0x44,0x7d, 0x4,0x3e,0x79, 0x6,0x55,0x49, 0x5,0x40,0x5a, 0x5,0x40,0x5c, 0x5,0x40,0x62, 0x4,0x3e,0x7c, 0x6,0x55,0x47, 0x5,0x40,0x61, 0x6,0x55,0x4d, 0x5,0x40,0x65, 0x5,0x40,0x63, 0x5,0x40,0x5b, 0x5,0x3a,0x3d, 0x5,0x40,0x5f, 0x5,0x40,0x5e, 0x6,0x55,0x4b, 0x6,0x55,0x4a, 0x4,0x3e,0x7d, 0xf,0x43,0x6b, 0xf,0x43,0x6c, 0x6,0x55,0x48, 0x6,0x55,0x4e, 0x5,0x40,0x58, 0x5,0x40,0x66, 0x5,0x40,0x5d, 0x5,0x47,0x58, 0x5,0x47,0x50, 0x4,0x45,0x25, 0x4,0x45,0x2b, 0x5,0x47,0x4b, 0x5,0x47,0x4f, 0x4,0x45,0x26, 0x6,0x5f,0x2f, 0x6,0x5f,0x2a, 0x4,0x45,0x2e, 0x4,0x45,0x2a, 0x6,0x5f,0x2b, 0x6,0x5f,0x34, 0x5,0x47,0x4d, 0x5,0x47,0x4e, 0x5,0x47,0x53, 0x4,0x45,0x2c, 0x6,0x5f,0x37, 0x6,0x5f,0x35, 0x5,0x47,0x5a, 0x6,0x5f,0x2e, 0x4,0x45,0x27, 0x4,0x45,0x22, 0x5,0x47,0x51, 0x5,0x47,0x52, 0x6,0x5f,0x33, 0x5,0x47,0x4c, 0x5,0x47,0x56, 0x6,0x5f,0x31, 0x6,0x5f,0x30, 0xf,0x4a,0x2e, 0x6,0x5f,0x38, 0x6,0x5f,0x2c, 0x4,0x45,0x2d, 0x6,0x5f,0x32, 0x6,0x5f,0x36, 0x5,0x47,0x55, 0x4,0x4b,0x3a, 0x4,0x4b,0x36, 0x4,0x4b,0x2d, 0x4,0x4b,0x39, 0x5,0x4e,0x53, 0x4,0x4b,0x34, 0x7,0x25,0x5d, 0x4,0x4b,0x32, 0x5,0x4e,0x55, 0x5,0x4e,0x57, 0x5,0x4e,0x54, 0x4,0x4b,0x31, 0x7,0x25,0x55, 0x4,0x4b,0x30, 0x5,0x4e,0x51, 0x5,0x4e,0x52, 0x7,0x25,0x53, 0x5,0x47,0x57, 0x5,0x4e,0x58, 0x7,0x25,0x54, 0x7,0x25,0x5b, 0x7,0x25,0x59, 0xf,0x50,0x50, 0xf,0x50,0x51, 0xf,0x50,0x52, 0xf,0x50,0x53, 0xf,0x50,0x54, 0x7,0x25,0x56, 0x7,0x25,0x5a, 0x7,0x25,0x5e, 0x5,0x4e,0x56, 0x5,0x4e,0x50, 0x4,0x51,0x4b, 0x5,0x55,0x65, 0x7,0x30,0x2f, 0x7,0x30,0x30, 0x5,0x55,0x6c, 0x5,0x55,0x6d, 0x4,0x51,0x4c, 0x4,0x51,0x47, 0x5,0x55,0x68, 0x7,0x30,0x35, 0x5,0x55,0x66, 0x5,0x55,0x67, 0x5,0x55,0x6b, 0x7,0x30,0x31, 0x7,0x30,0x37, 0x5,0x55,0x6e, 0xf,0x56,0x34, 0xf,0x56,0x35, 0x7,0x30,0x34, 0x7,0x30,0x33, 0x5,0x55,0x6a, 0x7,0x30,0x32, 0x7,0x30,0x38, 0x7,0x30,0x39, 0x5,0x55,0x64, 0x7,0x25,0x57, 0x4,0x56,0x7c, 0x5,0x5c,0x39, 0x5,0x55,0x70, 0x7,0x39,0x50, 0x4,0x51,0x51, 0x4,0x45,0x29, 0x4,0x56,0x7e, 0x7,0x39,0x47, 0x5,0x5c,0x35, 0x7,0x39,0x48, 0x5,0x5c,0x3c, 0x5,0x5c,0x3a, 0x5,0x5c,0x3d, 0x7,0x39,0x4f, 0x7,0x40,0x6a, 0x5,0x55,0x6f, 0x5,0x5c,0x37, 0x4,0x56,0x7d, 0x5,0x5c,0x38, 0x4,0x57,0x23, 0x7,0x39,0x49, 0x7,0x39,0x4d, 0x7,0x39,0x51, 0x7,0x39,0x4b, 0x7,0x39,0x46, 0x7,0x39,0x4c, 0xf,0x5b,0x38, 0x7,0x39,0x44, 0x7,0x39,0x45, 0x7,0x39,0x4e, 0x5,0x5c,0x3b, 0x5,0x62,0x5c, 0x5,0x5c,0x3e, 0x7,0x39,0x4a, 0x4,0x5b,0x78, 0x5,0x5c,0x40, 0x5,0x62,0x60, 0x7,0x40,0x68, 0x5,0x62,0x65, 0x7,0x40,0x69, 0x5,0x62,0x61, 0x5,0x62,0x64, 0x4,0x5b,0x76, 0x5,0x5c,0x3f, 0x5,0x62,0x5d, 0x5,0x62,0x62, 0x5,0x62,0x5e, 0x5,0x62,0x5f, 0x4,0x5b,0x7a, 0x7,0x40,0x6d, 0x5,0x62,0x63, 0x7,0x48,0x2b, 0x4,0x60,0x33, 0x7,0x48,0x27, 0x4,0x60,0x34, 0x5,0x68,0x44, 0x4,0x60,0x35, 0x7,0x48,0x26, 0x5,0x68,0x43, 0x5,0x68,0x42, 0x4,0x60,0x36, 0xf,0x63,0x27, 0x4,0x60,0x31, 0x7,0x48,0x28, 0x7,0x48,0x29, 0x7,0x48,0x25, 0x7,0x48,0x2a, 0x7,0x40,0x6c, 0x4,0x63,0x6a, 0x4,0x63,0x6b, 0x7,0x4e,0x49, 0x7,0x4e,0x4d, 0x7,0x4e,0x4c, 0x5,0x6c,0x58, 0x5,0x6c,0x59, 0x7,0x4e,0x4e, 0x7,0x4e,0x4b, 0x7,0x4e,0x4a, 0x5,0x70,0x51, 0x5,0x70,0x50, 0x5,0x70,0x4e, 0x4,0x66,0x57, 0x7,0x53,0x7a, 0x5,0x70,0x4f, 0x7,0x53,0x79, 0xf,0x67,0x78, 0x5,0x73,0x5f, 0x5,0x73,0x5e, 0x5,0x73,0x5d, 0x7,0x5c,0x22, 0x7,0x5b,0x7e, 0x4,0x6a,0x56, 0x7,0x5c,0x21, 0x5,0x76,0x29, 0x5,0x77,0x6b, 0x7,0x5e,0x7d, 0x7,0x5e,0x7e, 0x7,0x61,0x42, 0x7,0x61,0x27, 0x7,0x62,0x3f, 0x7,0x62,0x40, 0x7,0x62,0x41, 0x5,0x7a,0x6d, 0x7,0x64,0x51, 0x7,0x65,0x39, 0x4,0x24,0x63, 0x6,0x33,0x25, 0xf,0x2c,0x52, 0x6,0x39,0x73, 0x6,0x39,0x72, 0xf,0x31,0x30, 0x6,0x42,0x3a, 0xf,0x36,0x71, 0x6,0x4b,0x69, 0x6,0x4b,0x67, 0x5,0x3a,0x41, 0x6,0x4b,0x68, 0x7,0x25,0x5f, 0x4,0x51,0x53, 0x4,0x51,0x52, 0x7,0x30,0x3a, 0x6,0x25,0x3c, 0x6,0x25,0x3d, 0x5,0x24,0x66, 0x5,0x27,0x3a, 0x5,0x27,0x3b, 0x5,0x27,0x39, 0x5,0x27,0x3c, 0x4,0x2a,0x4d, 0x5,0x2a,0x59, 0x5,0x2a,0x58, 0x5,0x2a,0x57, 0x6,0x33,0x27, 0x6,0x33,0x28, 0x6,0x33,0x26, 0xf,0x2c,0x53, 0xf,0x2c,0x54, 0x6,0x33,0x29, 0x5,0x2a,0x5a, 0x6,0x39,0x74, 0x4,0x2e,0x42, 0x6,0x39,0x75, 0x6,0x42,0x3c, 0xf,0x31,0x31, 0xf,0x31,0x32, 0xf,0x31,0x33, 0xf,0x31,0x35, 0xf,0x31,0x36, 0xf,0x36,0x75, 0x4,0x33,0x46, 0x5,0x33,0x6e, 0x6,0x42,0x3b, 0xf,0x36,0x72, 0xf,0x36,0x73, 0xf,0x36,0x76, 0x6,0x4b,0x6b, 0x6,0x4b,0x6c, 0x6,0x4b,0x6a, 0xf,0x36,0x74, 0x5,0x40,0x68, 0x5,0x40,0x67, 0x6,0x55,0x50, 0x4,0x3e,0x7e, 0x6,0x55,0x4f, 0x5,0x40,0x69, 0xf,0x43,0x6d, 0x4,0x45,0x2f, 0x6,0x5f,0x39, 0x6,0x5f,0x3a, 0xf,0x4a,0x30, 0xf,0x4a,0x31, 0xf,0x4a,0x33, 0xf,0x4a,0x34, 0xf,0x4a,0x32, 0x4,0x4b,0x3c, 0x7,0x25,0x60, 0x7,0x25,0x61, 0x5,0x55,0x72, 0x7,0x30,0x3c, 0x5,0x55,0x71, 0x7,0x30,0x3b, 0x4,0x57,0x27, 0x4,0x57,0x28, 0x5,0x5c,0x42, 0x5,0x5c,0x44, 0x7,0x40,0x6e, 0x5,0x5c,0x41, 0x7,0x39,0x52, 0x5,0x62,0x66, 0x7,0x40,0x6f, 0x7,0x40,0x70, 0x5,0x68,0x45, 0x5,0x68,0x46, 0x5,0x68,0x47, 0x5,0x68,0x48, 0x7,0x48,0x2c, 0x7,0x4e,0x50, 0x7,0x4e,0x4f, 0x5,0x62,0x67, 0x7,0x58,0x40, 0x7,0x58,0x41, 0xf,0x67,0x79, 0x7,0x5c,0x23, 0x4,0x6b,0x73, 0x7,0x5f,0x21, 0x7,0x65,0x3a, 0x5,0x24,0x67, 0x5,0x24,0x68, 0x6,0x2d,0x39, 0x6,0x2d,0x37, 0x6,0x2d,0x38, 0x5,0x27,0x3d, 0x6,0x33,0x2b, 0x5,0x2a,0x5b, 0x4,0x2a,0x4f, 0x6,0x30,0x36, 0x6,0x33,0x2a, 0x5,0x2e,0x77, 0x5,0x2e,0x78, 0x6,0x39,0x76, 0x6,0x39,0x7a, 0x5,0x33,0x6f, 0x4,0x2e,0x44, 0x6,0x39,0x77, 0x6,0x39,0x78, 0x6,0x39,0x79, 0x4,0x33,0x49, 0x5,0x33,0x70, 0x6,0x42,0x3e, 0xf,0x36,0x79, 0x6,0x42,0x3d, 0x4,0x39,0x3c, 0x6,0x4b,0x6d, 0x5,0x3a,0x42, 0x6,0x4b,0x6f, 0x4,0x39,0x3b, 0xf,0x3d,0x4b, 0x6,0x4b,0x6e, 0xf,0x36,0x78, 0x5,0x40,0x6a, 0x5,0x40,0x6d, 0x5,0x40,0x6b, 0x5,0x40,0x6c, 0x5,0x40,0x6e, 0x6,0x55,0x53, 0xf,0x43,0x6e, 0x6,0x55,0x51, 0x4,0x3f,0x21, 0x4,0x45,0x31, 0x4,0x45,0x33, 0x6,0x5f,0x3e, 0xf,0x4a,0x35, 0x6,0x5f,0x3d, 0x5,0x47,0x5c, 0x6,0x5f,0x3f, 0x6,0x5f,0x3b, 0x6,0x5f,0x3c, 0x7,0x25,0x63, 0x5,0x4e,0x5a, 0x5,0x4e,0x5b, 0x5,0x4e,0x5c, 0x7,0x25,0x62, 0x5,0x55,0x76, 0x5,0x55,0x78, 0x5,0x55,0x74, 0x4,0x51,0x58, 0x5,0x55,0x77, 0x5,0x55,0x75, 0xf,0x56,0x36, 0x5,0x55,0x73, 0x7,0x30,0x3d, 0x7,0x30,0x3e, 0x7,0x39,0x53, 0x7,0x30,0x3f, 0x4,0x57,0x29, 0x5,0x62,0x68, 0x7,0x40,0x72, 0x7,0x40,0x73, 0x7,0x40,0x74, 0x7,0x40,0x71, 0x5,0x68,0x4a, 0x5,0x68,0x49, 0x7,0x48,0x2d, 0x4,0x63,0x6d, 0x5,0x6c,0x5b, 0x5,0x6c,0x5a, 0x7,0x4e,0x51, 0x7,0x53,0x7c, 0x4,0x66,0x5c, 0x7,0x58,0x42, 0x5,0x77,0x6c, 0x5,0x77,0x6d, 0x7,0x63,0x44, 0x7,0x65,0x58, 0x6,0x28,0x69, 0xf,0x24,0x7d, 0x4,0x27,0x49, 0x5,0x27,0x3e, 0x4,0x27,0x47, 0x6,0x2d,0x3b, 0x5,0x27,0x3f, 0x5,0x2a,0x5e, 0x5,0x2a,0x5c, 0x5,0x2a,0x5d, 0x6,0x33,0x2d, 0x6,0x33,0x2c, 0xf,0x2c,0x55, 0x5,0x2e,0x79, 0x6,0x3a,0x21, 0x6,0x3a,0x23, 0x4,0x2e,0x48, 0x5,0x2e,0x7a, 0x6,0x39,0x7e, 0x6,0x39,0x7b, 0x4,0x2e,0x4a, 0x6,0x3a,0x22, 0xf,0x31,0x37, 0xf,0x31,0x38, 0x6,0x3a,0x24, 0x6,0x39,0x7c, 0x6,0x39,0x7d, 0x4,0x33,0x4c, 0x5,0x33,0x72, 0x4,0x33,0x4a, 0x6,0x42,0x3f, 0xf,0x36,0x7a, 0xf,0x36,0x7b, 0xf,0x36,0x7c, 0xf,0x36,0x7d, 0xf,0x37,0x21, 0xf,0x37,0x22, 0x6,0x42,0x40, 0x6,0x42,0x41, 0x6,0x3a,0x25, 0x6,0x4b,0x74, 0x6,0x4b,0x70, 0x5,0x3a,0x43, 0x4,0x39,0x3d, 0x6,0x4b,0x72, 0x6,0x4b,0x73, 0xf,0x3d,0x4c, 0xf,0x3d,0x4d, 0x6,0x4b,0x71, 0x6,0x55,0x54, 0x6,0x55,0x56, 0x5,0x40,0x70, 0x6,0x55,0x58, 0x6,0x55,0x57, 0x6,0x55,0x55, 0xf,0x43,0x6f, 0xf,0x43,0x70, 0x6,0x5f,0x41, 0x6,0x5f,0x40, 0x6,0x5f,0x4b, 0xf,0x4a,0x36, 0x5,0x4e,0x5d, 0x7,0x25,0x64, 0x7,0x25,0x65, 0xf,0x50,0x55, 0xf,0x50,0x56, 0xf,0x50,0x57, 0xf,0x50,0x58, 0xf,0x50,0x59, 0xf,0x50,0x5a, 0x4,0x51,0x59, 0x7,0x30,0x44, 0x4,0x51,0x5b, 0x7,0x30,0x40, 0x7,0x30,0x45, 0x5,0x55,0x7a, 0x5,0x55,0x79, 0xf,0x56,0x37, 0xf,0x56,0x38, 0xf,0x56,0x39, 0xf,0x56,0x3a, 0xf,0x56,0x3b, 0x7,0x30,0x43, 0x7,0x30,0x41, 0x4,0x57,0x2b, 0x4,0x5c,0x23, 0x4,0x57,0x2a, 0x7,0x39,0x54, 0x5,0x5c,0x47, 0x7,0x40,0x75, 0x5,0x5c,0x46, 0xf,0x5b,0x3b, 0xf,0x5b,0x3c, 0x7,0x39,0x55, 0x7,0x39,0x56, 0x7,0x36,0x79, 0x5,0x5c,0x45, 0x7,0x30,0x42, 0x7,0x39,0x57, 0x4,0x5c,0x22, 0x4,0x5c,0x21, 0x7,0x40,0x76, 0x7,0x40,0x78, 0x7,0x40,0x77, 0xf,0x5f,0x62, 0x7,0x40,0x79, 0x7,0x48,0x2e, 0x5,0x68,0x4b, 0x7,0x48,0x2f, 0xf,0x63,0x28, 0xf,0x63,0x29, 0x5,0x6c,0x5d, 0x7,0x4e,0x53, 0x5,0x6c,0x5c, 0x7,0x4e,0x55, 0xf,0x65,0x56, 0x7,0x4e,0x52, 0x7,0x4e,0x54, 0xf,0x67,0x7b, 0x7,0x58,0x44, 0x5,0x73,0x60, 0x7,0x58,0x43, 0x7,0x58,0x45, 0xf,0x67,0x7a, 0x7,0x5f,0x22, 0x5,0x76,0x2a, 0x7,0x5f,0x23, 0x7,0x62,0x42, 0x5,0x22,0x7d, 0xf,0x22,0x67, 0x6,0x28,0x6a, 0x4,0x24,0x64, 0x5,0x24,0x6a, 0x4,0x24,0x66, 0x5,0x24,0x6b, 0x5,0x24,0x69, 0xf,0x24,0x7e, 0x4,0x27,0x50, 0x6,0x2d,0x3c, 0x5,0x27,0x41, 0x4,0x27,0x4b, 0x6,0x2d,0x40, 0x6,0x2d,0x42, 0x6,0x2d,0x3e, 0x5,0x27,0x42, 0x5,0x27,0x43, 0x6,0x2d,0x41, 0x6,0x2d,0x3f, 0x5,0x27,0x40, 0x6,0x2d,0x43, 0x6,0x2d,0x44, 0x6,0x33,0x39, 0x6,0x33,0x35, 0x6,0x33,0x2e, 0x6,0x33,0x32, 0x4,0x2a,0x5e, 0x6,0x33,0x36, 0x4,0x2a,0x5c, 0x6,0x33,0x3c, 0x5,0x2a,0x65, 0x6,0x33,0x33, 0x5,0x2a,0x69, 0x4,0x2a,0x5b, 0x6,0x33,0x2f, 0x6,0x33,0x3b, 0x5,0x2a,0x60, 0x5,0x2a,0x67, 0x5,0x2a,0x6b, 0x5,0x2a,0x61, 0x5,0x2a,0x6a, 0x5,0x2a,0x68, 0x5,0x2a,0x63, 0x5,0x2a,0x6c, 0x6,0x33,0x30, 0x5,0x2a,0x5f, 0x5,0x2a,0x66, 0x5,0x2a,0x62, 0x5,0x2a,0x64, 0xf,0x2c,0x56, 0xf,0x2c,0x58, 0x6,0x33,0x37, 0x6,0x33,0x3a, 0x6,0x33,0x34, 0x4,0x2e,0x50, 0x5,0x2f,0x24, 0x3,0x2e,0x5a, 0x4,0x2e,0x4c, 0x5,0x2e,0x7b, 0x6,0x3a,0x26, 0x4,0x2e,0x4e, 0x5,0x2f,0x22, 0x5,0x2e,0x7c, 0x6,0x3a,0x28, 0x4,0x2e,0x4b, 0x6,0x3a,0x29, 0x5,0x2f,0x23, 0x6,0x3a,0x2a, 0x4,0x2e,0x53, 0x6,0x3a,0x2c, 0x5,0x2e,0x7e, 0x5,0x2f,0x25, 0x6,0x3a,0x2b, 0xf,0x31,0x39, 0xf,0x31,0x3a, 0xf,0x31,0x3b, 0xf,0x31,0x3c, 0xf,0x31,0x3d, 0x6,0x3a,0x27, 0x5,0x2f,0x21, 0x5,0x2e,0x7d, 0x4,0x2e,0x54, 0x4,0x33,0x55, 0x6,0x42,0x53, 0x6,0x42,0x46, 0x6,0x42,0x4d, 0x5,0x33,0x74, 0x5,0x33,0x73, 0x5,0x33,0x7d, 0x4,0x33,0x54, 0x6,0x42,0x47, 0x6,0x42,0x44, 0x6,0x42,0x42, 0x5,0x33,0x7a, 0x5,0x33,0x7b, 0x5,0x33,0x75, 0x6,0x42,0x4a, 0x5,0x33,0x78, 0x6,0x42,0x54, 0x5,0x33,0x79, 0x6,0x42,0x43, 0x6,0x42,0x4f, 0x6,0x42,0x4b, 0x6,0x42,0x50, 0xf,0x37,0x25, 0x6,0x42,0x52, 0x6,0x42,0x4c, 0x6,0x42,0x49, 0x6,0x42,0x51, 0xf,0x37,0x26, 0x5,0x33,0x7e, 0x6,0x42,0x45, 0x6,0x42,0x4e, 0x5,0x33,0x77, 0x5,0x33,0x7c, 0x5,0x3a,0x49, 0x5,0x3a,0x4c, 0x6,0x4b,0x79, 0x6,0x4c,0x23, 0x4,0x33,0x53, 0x6,0x4b,0x78, 0x5,0x3a,0x4b, 0x6,0x4b,0x7d, 0x6,0x4c,0x21, 0x5,0x3a,0x46, 0x6,0x4c,0x26, 0x6,0x4b,0x77, 0x4,0x39,0x4f, 0x5,0x3a,0x4a, 0x5,0x3a,0x48, 0x5,0x3a,0x44, 0x4,0x39,0x4e, 0x5,0x40,0x71, 0x6,0x4c,0x25, 0x5,0x40,0x7e, 0x4,0x39,0x40, 0x6,0x4b,0x7e, 0x5,0x3a,0x4d, 0x6,0x4b,0x7b, 0x5,0x3a,0x4e, 0x6,0x4c,0x28, 0x5,0x3a,0x45, 0x5,0x3a,0x47, 0xf,0x3d,0x4f, 0xf,0x3d,0x50, 0xf,0x3d,0x51, 0x6,0x4b,0x7c, 0x6,0x4c,0x27, 0x6,0x4b,0x76, 0x6,0x4c,0x24, 0x6,0x4c,0x22, 0x4,0x39,0x44, 0x4,0x39,0x50, 0x5,0x3a,0x4f, 0x4,0x39,0x3e, 0x6,0x55,0x5b, 0x6,0x55,0x5e, 0x6,0x55,0x5a, 0x4,0x3f,0x2a, 0x5,0x40,0x78, 0x6,0x55,0x5c, 0x5,0x40,0x77, 0x6,0x55,0x5f, 0x5,0x40,0x75, 0x6,0x55,0x59, 0x4,0x3f,0x23, 0x4,0x3f,0x28, 0x4,0x3f,0x31, 0x4,0x3f,0x2e, 0x5,0x40,0x7a, 0x6,0x55,0x62, 0x5,0x40,0x76, 0x4,0x3f,0x2f, 0x4,0x3f,0x24, 0x6,0x55,0x64, 0x5,0x40,0x79, 0x5,0x40,0x72, 0x5,0x40,0x7c, 0x6,0x55,0x66, 0x6,0x55,0x5d, 0xf,0x43,0x71, 0xf,0x43,0x72, 0xf,0x43,0x73, 0x6,0x4b,0x75, 0x6,0x55,0x63, 0x6,0x53,0x35, 0x5,0x40,0x73, 0x5,0x40,0x7d, 0x5,0x40,0x74, 0x6,0x55,0x65, 0x5,0x47,0x60, 0x4,0x45,0x45, 0x6,0x5f,0x44, 0x4,0x45,0x3e, 0x5,0x47,0x63, 0x6,0x5f,0x48, 0x5,0x47,0x65, 0x5,0x47,0x66, 0x6,0x5f,0x49, 0x4,0x4b,0x4f, 0x6,0x5f,0x4e, 0x6,0x5f,0x46, 0x6,0x5f,0x4f, 0x7,0x25,0x6c, 0x6,0x5f,0x47, 0x5,0x47,0x67, 0x5,0x47,0x64, 0x6,0x5f,0x43, 0x6,0x5f,0x4a, 0x6,0x5f,0x45, 0x5,0x47,0x62, 0x6,0x5f,0x42, 0x5,0x47,0x5f, 0x5,0x47,0x5e, 0x5,0x47,0x5d, 0x7,0x25,0x66, 0xf,0x4a,0x37, 0xf,0x4a,0x38, 0xf,0x4a,0x39, 0xf,0x4a,0x3a, 0xf,0x4a,0x3b, 0xf,0x4a,0x3c, 0xf,0x4a,0x3d, 0x4,0x45,0x3a, 0x6,0x5f,0x4d, 0x6,0x5f,0x4c, 0x5,0x47,0x69, 0x4,0x45,0x3b, 0x4,0x4b,0x50, 0x4,0x4b,0x4c, 0x4,0x4b,0x3e, 0x5,0x4e,0x62, 0x5,0x4e,0x67, 0x4,0x4b,0x4e, 0x7,0x25,0x6b, 0x5,0x4e,0x6c, 0x5,0x4e,0x65, 0x4,0x4b,0x41, 0x7,0x25,0x70, 0x4,0x4b,0x40, 0x4,0x51,0x65, 0x7,0x30,0x4d, 0x5,0x4e,0x64, 0x5,0x56,0x21, 0x5,0x4e,0x66, 0x7,0x25,0x6d, 0x5,0x4e,0x6a, 0x7,0x25,0x72, 0x4,0x4b,0x49, 0x4,0x4b,0x4b, 0x4,0x4b,0x46, 0x5,0x4e,0x5f, 0x5,0x4e,0x6b, 0x7,0x25,0x67, 0x7,0x25,0x68, 0x7,0x25,0x6a, 0x4,0x4b,0x4a, 0x5,0x4e,0x63, 0x7,0x25,0x6e, 0x5,0x4e,0x5e, 0x5,0x4e,0x61, 0x5,0x55,0x7b, 0x5,0x4e,0x69, 0x5,0x4e,0x68, 0x7,0x25,0x69, 0xf,0x50,0x5b, 0xf,0x50,0x5c, 0xf,0x50,0x5d, 0x7,0x25,0x6f, 0x4,0x4b,0x48, 0x5,0x56,0x2a, 0x5,0x56,0x2b, 0x4,0x51,0x5e, 0x5,0x56,0x25, 0x5,0x56,0x23, 0x5,0x56,0x27, 0x5,0x55,0x7d, 0x4,0x51,0x63, 0x5,0x56,0x29, 0x5,0x55,0x7e, 0x5,0x56,0x26, 0x5,0x56,0x24, 0x4,0x51,0x62, 0x7,0x30,0x46, 0x7,0x30,0x4e, 0x7,0x30,0x4f, 0x7,0x30,0x4b, 0x7,0x30,0x47, 0x5,0x4e,0x6d, 0x4,0x51,0x67, 0x5,0x55,0x7c, 0x7,0x30,0x49, 0xf,0x56,0x3d, 0x7,0x30,0x51, 0x7,0x30,0x4c, 0x5,0x56,0x2c, 0x4,0x51,0x66, 0x5,0x47,0x68, 0x5,0x56,0x28, 0x4,0x5c,0x2b, 0x5,0x5c,0x48, 0x5,0x5c,0x4b, 0x4,0x57,0x35, 0x4,0x57,0x36, 0x7,0x30,0x52, 0x7,0x39,0x5e, 0x7,0x39,0x59, 0x5,0x5c,0x4a, 0x7,0x39,0x5a, 0x5,0x5c,0x4c, 0x7,0x39,0x64, 0x5,0x5c,0x49, 0x7,0x41,0x22, 0x7,0x39,0x5f, 0x7,0x39,0x60, 0x7,0x39,0x5d, 0x4,0x57,0x37, 0x7,0x39,0x63, 0x5,0x5c,0x4f, 0x7,0x30,0x48, 0x5,0x5c,0x4e, 0x7,0x39,0x61, 0x7,0x39,0x5c, 0x7,0x39,0x5b, 0xf,0x5b,0x3e, 0xf,0x5b,0x3f, 0xf,0x5b,0x40, 0x7,0x39,0x62, 0x7,0x39,0x58, 0x4,0x5c,0x28, 0x7,0x41,0x23, 0x7,0x40,0x7e, 0x5,0x62,0x6e, 0x4,0x5c,0x2c, 0x5,0x62,0x6b, 0x7,0x40,0x7b, 0x7,0x40,0x7c, 0x5,0x62,0x70, 0x4,0x5c,0x24, 0x5,0x62,0x6c, 0x5,0x62,0x6f, 0x5,0x62,0x71, 0x5,0x62,0x6a, 0xf,0x5f,0x63, 0xf,0x5f,0x64, 0x7,0x41,0x24, 0x7,0x41,0x25, 0x7,0x40,0x7d, 0x5,0x62,0x6d, 0x7,0x40,0x7a, 0x7,0x41,0x21, 0x5,0x68,0x4f, 0x5,0x68,0x4c, 0x5,0x68,0x51, 0x4,0x60,0x3e, 0x5,0x68,0x50, 0x4,0x60,0x3b, 0x5,0x68,0x54, 0x5,0x68,0x4e, 0x7,0x48,0x32, 0x4,0x60,0x3a, 0x7,0x48,0x34, 0x4,0x60,0x3c, 0x4,0x60,0x3d, 0x7,0x48,0x30, 0x5,0x68,0x4d, 0x7,0x48,0x31, 0x5,0x68,0x53, 0x5,0x68,0x52, 0xf,0x63,0x2a, 0x7,0x4b,0x5d, 0x7,0x48,0x35, 0x7,0x48,0x33, 0x5,0x6c,0x60, 0x5,0x6c,0x62, 0x5,0x6c,0x5e, 0x7,0x4e,0x58, 0x5,0x6c,0x61, 0x5,0x6c,0x63, 0x7,0x4e,0x57, 0xf,0x65,0x57, 0x4,0x63,0x72, 0x5,0x6c,0x5f, 0x4,0x63,0x73, 0x7,0x4e,0x56, 0x7,0x54,0x22, 0x5,0x70,0x52, 0x5,0x70,0x54, 0x5,0x70,0x53, 0x5,0x70,0x55, 0x7,0x53,0x7e, 0x7,0x54,0x23, 0x7,0x53,0x7d, 0x4,0x68,0x79, 0x5,0x73,0x63, 0x7,0x58,0x46, 0x5,0x73,0x61, 0x5,0x73,0x62, 0x7,0x58,0x47, 0x5,0x73,0x65, 0x4,0x6a,0x59, 0x7,0x54,0x21, 0x5,0x73,0x64, 0x7,0x59,0x33, 0x5,0x73,0x66, 0x5,0x76,0x2b, 0x7,0x5c,0x26, 0x4,0x6a,0x58, 0x7,0x5c,0x25, 0x7,0x5f,0x24, 0x4,0x6c,0x74, 0x7,0x62,0x43, 0x7,0x62,0x45, 0x7,0x62,0x44, 0xf,0x6c,0x66, 0x5,0x7b,0x43, 0x5,0x27,0x44, 0x4,0x2a,0x60, 0x4,0x2a,0x61, 0x4,0x2e,0x56, 0x5,0x2f,0x28, 0x5,0x2f,0x27, 0x6,0x3a,0x2f, 0x6,0x3a,0x30, 0x4,0x33,0x58, 0x5,0x34,0x22, 0xf,0x37,0x27, 0x5,0x3a,0x52, 0x4,0x39,0x51, 0x5,0x3a,0x53, 0x5,0x3a,0x51, 0x5,0x3a,0x55, 0x5,0x3a,0x50, 0x6,0x4c,0x29, 0x5,0x3a,0x54, 0x5,0x41,0x23, 0x5,0x41,0x22, 0x5,0x41,0x21, 0x6,0x5f,0x51, 0x6,0x5f,0x52, 0x4,0x45,0x47, 0x4,0x45,0x48, 0x5,0x47,0x6c, 0x5,0x47,0x6a, 0x5,0x47,0x6b, 0x4,0x45,0x49, 0x6,0x5f,0x50, 0x4,0x45,0x4b, 0xf,0x4d,0x3f, 0x5,0x4e,0x6e, 0x4,0x4b,0x52, 0x7,0x25,0x75, 0x5,0x4e,0x6f, 0x4,0x4b,0x51, 0x7,0x25,0x74, 0x4,0x4b,0x53, 0x4,0x51,0x69, 0x4,0x51,0x68, 0x4,0x51,0x6a, 0x5,0x56,0x2d, 0x5,0x62,0x75, 0x7,0x39,0x65, 0x5,0x5a,0x75, 0x5,0x5c,0x50, 0x5,0x62,0x74, 0x5,0x62,0x73, 0x5,0x62,0x72, 0x5,0x68,0x57, 0x5,0x68,0x56, 0x5,0x68,0x55, 0x5,0x68,0x58, 0x7,0x48,0x36, 0x7,0x48,0x37, 0x4,0x6a,0x5a, 0x7,0x66,0x3f, 0x7,0x66,0x49, 0x6,0x26,0x3f, 0x6,0x28,0x6b, 0x6,0x28,0x6c, 0x6,0x33,0x41, 0x6,0x33,0x3f, 0x6,0x33,0x40, 0x5,0x2a,0x6e, 0x5,0x2f,0x2a, 0x5,0x2f,0x2b, 0x6,0x3a,0x33, 0xf,0x31,0x3f, 0xf,0x31,0x40, 0x6,0x3a,0x31, 0x6,0x3a,0x32, 0x5,0x2f,0x29, 0x5,0x34,0x23, 0x5,0x34,0x24, 0x4,0x33,0x5c, 0x6,0x42,0x59, 0x6,0x42,0x57, 0x5,0x34,0x25, 0x6,0x42,0x55, 0x6,0x42,0x5b, 0x6,0x42,0x56, 0x6,0x42,0x5a, 0x6,0x42,0x58, 0x4,0x39,0x52, 0x6,0x4c,0x2c, 0xf,0x3d,0x52, 0x6,0x4c,0x2a, 0xf,0x3d,0x53, 0x5,0x41,0x24, 0x4,0x3f,0x32, 0x6,0x55,0x69, 0x4,0x3f,0x35, 0x4,0x3f,0x34, 0x6,0x55,0x67, 0x5,0x3a,0x56, 0x4,0x3f,0x36, 0xf,0x43,0x75, 0x6,0x55,0x68, 0x5,0x47,0x6d, 0x5,0x47,0x6e, 0x6,0x5f,0x53, 0x5,0x47,0x6f, 0x5,0x47,0x70, 0xf,0x4a,0x3e, 0x7,0x25,0x78, 0x4,0x4b,0x54, 0x7,0x25,0x76, 0x7,0x25,0x77, 0xf,0x50,0x61, 0x7,0x25,0x79, 0x7,0x30,0x54, 0x4,0x51,0x6b, 0xf,0x56,0x3f, 0x7,0x30,0x53, 0x5,0x5c,0x51, 0x5,0x5c,0x52, 0x7,0x39,0x66, 0x7,0x39,0x67, 0x5,0x73,0x67, 0x5,0x76,0x2c, 0x5,0x22,0x7e, 0x6,0x25,0x3e, 0x4,0x24,0x67, 0x6,0x28,0x6d, 0x5,0x24,0x6d, 0x5,0x24,0x6c, 0xf,0x25,0x21, 0xf,0x25,0x22, 0x5,0x27,0x45, 0x4,0x27,0x54, 0xf,0x28,0x30, 0xf,0x28,0x31, 0xf,0x28,0x32, 0xf,0x28,0x33, 0x6,0x2d,0x47, 0xf,0x28,0x35, 0x4,0x2a,0x65, 0x4,0x2a,0x63, 0x6,0x33,0x45, 0x5,0x2a,0x70, 0xf,0x2c,0x59, 0xf,0x2c,0x5a, 0xf,0x2c,0x5b, 0xf,0x2c,0x5d, 0xf,0x2c,0x5e, 0xf,0x2c,0x5f, 0xf,0x2c,0x61, 0xf,0x2c,0x63, 0x6,0x33,0x43, 0x6,0x33,0x44, 0xf,0x2c,0x64, 0xf,0x2c,0x60, 0x6,0x33,0x42, 0x5,0x2a,0x6f, 0x5,0x2a,0x71, 0x4,0x2e,0x60, 0x5,0x2f,0x33, 0x6,0x3a,0x34, 0x6,0x33,0x46, 0x6,0x3a,0x35, 0x5,0x2f,0x2f, 0x6,0x3a,0x39, 0x5,0x2f,0x2c, 0x5,0x2f,0x31, 0x5,0x2f,0x30, 0x4,0x2e,0x5b, 0x4,0x2e,0x5d, 0x5,0x2f,0x36, 0x5,0x2f,0x32, 0x5,0x2f,0x35, 0xf,0x31,0x3e, 0x4,0x2e,0x59, 0x5,0x2f,0x37, 0x6,0x3a,0x38, 0xf,0x31,0x42, 0xf,0x31,0x43, 0xf,0x31,0x45, 0xf,0x31,0x46, 0x4,0x2e,0x5a, 0x5,0x2f,0x2d, 0x6,0x3a,0x37, 0xf,0x31,0x48, 0xf,0x31,0x41, 0x5,0x34,0x26, 0x5,0x2f,0x2e, 0x6,0x3a,0x36, 0x5,0x34,0x2c, 0x5,0x34,0x28, 0x6,0x42,0x61, 0x6,0x42,0x5f, 0x5,0x34,0x31, 0x5,0x34,0x30, 0x5,0x34,0x2a, 0x6,0x42,0x60, 0x5,0x34,0x34, 0x5,0x34,0x32, 0x5,0x2f,0x38, 0x5,0x34,0x2e, 0x5,0x34,0x27, 0x5,0x34,0x29, 0x5,0x34,0x2d, 0xf,0x37,0x28, 0xf,0x37,0x29, 0xf,0x37,0x2a, 0xf,0x37,0x2b, 0xf,0x37,0x2e, 0xf,0x37,0x2f, 0xf,0x37,0x31, 0xf,0x37,0x32, 0xf,0x37,0x33, 0x6,0x42,0x5e, 0x6,0x42,0x5c, 0x6,0x4c,0x2e, 0xf,0x37,0x30, 0x5,0x34,0x2b, 0xf,0x37,0x2c, 0x6,0x42,0x62, 0x5,0x34,0x2f, 0x5,0x34,0x33, 0x6,0x42,0x5d, 0x5,0x3a,0x58, 0x5,0x3a,0x5e, 0x5,0x3a,0x57, 0x5,0x3a,0x5b, 0x4,0x39,0x56, 0x6,0x4c,0x35, 0x4,0x39,0x57, 0x4,0x39,0x55, 0x5,0x3a,0x5c, 0x5,0x3a,0x5d, 0x6,0x4c,0x31, 0x5,0x3a,0x5a, 0x5,0x3a,0x5f, 0xf,0x3d,0x54, 0xf,0x3d,0x55, 0xf,0x3d,0x56, 0xf,0x3d,0x57, 0x6,0x4c,0x34, 0x6,0x4c,0x30, 0x6,0x4c,0x32, 0x5,0x3a,0x61, 0x5,0x3a,0x60, 0x5,0x41,0x28, 0x6,0x55,0x71, 0x4,0x3f,0x37, 0x5,0x41,0x29, 0x6,0x55,0x6a, 0x6,0x55,0x6c, 0x5,0x41,0x25, 0x6,0x55,0x6e, 0x4,0x3f,0x41, 0x4,0x3f,0x43, 0x6,0x55,0x6f, 0x6,0x55,0x72, 0x5,0x41,0x26, 0x5,0x41,0x27, 0x6,0x55,0x6d, 0xf,0x43,0x77, 0xf,0x43,0x78, 0xf,0x43,0x79, 0xf,0x43,0x7a, 0xf,0x43,0x7b, 0xf,0x43,0x7c, 0xf,0x43,0x7d, 0xf,0x43,0x7e, 0xf,0x44,0x21, 0xf,0x44,0x22, 0xf,0x44,0x23, 0xf,0x44,0x24, 0xf,0x44,0x26, 0x6,0x55,0x70, 0x6,0x55,0x73, 0x6,0x5f,0x5b, 0x5,0x47,0x78, 0x6,0x5f,0x54, 0x7,0x25,0x7e, 0x5,0x47,0x7a, 0x6,0x5f,0x56, 0x4,0x45,0x52, 0x5,0x47,0x73, 0x5,0x47,0x72, 0x6,0x5f,0x57, 0x5,0x47,0x7b, 0x6,0x5f,0x59, 0x6,0x5f,0x5a, 0x5,0x47,0x75, 0x6,0x5f,0x55, 0x5,0x47,0x71, 0x5,0x47,0x7d, 0x6,0x5f,0x58, 0xf,0x4a,0x41, 0xf,0x4a,0x43, 0xf,0x4a,0x44, 0xf,0x4a,0x45, 0xf,0x4a,0x46, 0xf,0x4a,0x47, 0xf,0x4a,0x48, 0xf,0x4a,0x49, 0xf,0x4a,0x4b, 0xf,0x4a,0x4c, 0xf,0x4a,0x4d, 0xf,0x4a,0x4f, 0xf,0x4a,0x50, 0xf,0x4a,0x51, 0xf,0x4a,0x52, 0x4,0x45,0x54, 0xf,0x4a,0x40, 0x5,0x47,0x77, 0x5,0x47,0x7c, 0x5,0x47,0x79, 0x5,0x47,0x74, 0xf,0x50,0x64, 0x4,0x4b,0x5a, 0x5,0x4e,0x72, 0x5,0x4e,0x73, 0x7,0x26,0x21, 0x5,0x4e,0x70, 0x4,0x45,0x50, 0x7,0x26,0x25, 0x5,0x4e,0x75, 0x7,0x25,0x7d, 0xf,0x50,0x62, 0xf,0x50,0x63, 0xf,0x50,0x65, 0xf,0x50,0x66, 0xf,0x50,0x68, 0x7,0x26,0x22, 0x7,0x25,0x7a, 0x7,0x26,0x23, 0x5,0x4e,0x71, 0x5,0x4e,0x74, 0x7,0x25,0x7c, 0xf,0x4a,0x4a, 0x7,0x30,0x58, 0x5,0x56,0x31, 0x5,0x56,0x2e, 0x5,0x56,0x32, 0x7,0x30,0x55, 0x4,0x51,0x71, 0x4,0x51,0x73, 0x5,0x56,0x34, 0x4,0x51,0x72, 0x7,0x30,0x56, 0x7,0x30,0x5a, 0x4,0x51,0x6f, 0x7,0x30,0x57, 0xf,0x56,0x41, 0xf,0x56,0x42, 0xf,0x56,0x43, 0x5,0x56,0x30, 0xf,0x56,0x44, 0x5,0x56,0x2f, 0xf,0x56,0x45, 0xf,0x56,0x46, 0xf,0x56,0x47, 0xf,0x56,0x49, 0xf,0x56,0x4b, 0xf,0x56,0x4c, 0xf,0x56,0x4d, 0x5,0x5c,0x56, 0x7,0x39,0x68, 0x5,0x5c,0x54, 0x7,0x39,0x6f, 0x7,0x39,0x6a, 0x5,0x5c,0x53, 0x4,0x57,0x3a, 0x7,0x39,0x69, 0x5,0x5c,0x55, 0x4,0x57,0x3d, 0x7,0x39,0x6c, 0x4,0x57,0x3c, 0x5,0x56,0x35, 0x5,0x5c,0x58, 0x5,0x5c,0x57, 0x5,0x5c,0x59, 0xf,0x5b,0x41, 0xf,0x5b,0x42, 0xf,0x5b,0x43, 0xf,0x5b,0x44, 0xf,0x5b,0x45, 0xf,0x5b,0x46, 0xf,0x5b,0x47, 0xf,0x5b,0x48, 0xf,0x5b,0x49, 0x7,0x39,0x6b, 0x7,0x39,0x6e, 0xf,0x56,0x4a, 0x7,0x41,0x29, 0x5,0x62,0x76, 0x5,0x62,0x78, 0x7,0x41,0x26, 0x7,0x41,0x28, 0x5,0x62,0x77, 0x4,0x5c,0x30, 0x5,0x62,0x7a, 0x7,0x41,0x27, 0x5,0x62,0x79, 0x7,0x41,0x2a, 0xf,0x5f,0x65, 0xf,0x5f,0x66, 0xf,0x5f,0x67, 0xf,0x5f,0x68, 0xf,0x5f,0x69, 0x4,0x60,0x40, 0x5,0x68,0x5a, 0x5,0x68,0x59, 0xf,0x63,0x2b, 0xf,0x63,0x2c, 0xf,0x63,0x2d, 0xf,0x63,0x2e, 0x7,0x48,0x3a, 0x7,0x48,0x38, 0x7,0x48,0x39, 0xf,0x63,0x2f, 0x5,0x6c,0x65, 0x5,0x6c,0x66, 0x7,0x4e,0x59, 0x7,0x4e,0x5a, 0x5,0x6c,0x64, 0x5,0x6c,0x67, 0x4,0x60,0x41, 0x7,0x4e,0x5b, 0xf,0x65,0x5a, 0xf,0x65,0x5b, 0xf,0x65,0x5c, 0xf,0x65,0x5d, 0x7,0x4e,0x5d, 0x5,0x70,0x56, 0x5,0x70,0x57, 0xf,0x67,0x7d, 0x7,0x54,0x24, 0x4,0x66,0x62, 0xf,0x67,0x7c, 0x5,0x73,0x68, 0x7,0x58,0x48, 0x5,0x73,0x69, 0xf,0x69,0x5b, 0xf,0x69,0x5c, 0x7,0x58,0x49, 0x5,0x73,0x6a, 0x5,0x76,0x2e, 0x4,0x6a,0x5b, 0x5,0x76,0x2d, 0x5,0x76,0x2f, 0xf,0x6a,0x65, 0x7,0x5c,0x28, 0x7,0x5c,0x27, 0x7,0x5f,0x26, 0x7,0x5f,0x25, 0x7,0x5f,0x27, 0x7,0x62,0x46, 0x5,0x7a,0x2d, 0x5,0x7a,0x6e, 0x4,0x6d,0x75, 0x7,0x64,0x53, 0x7,0x65,0x3b, 0x5,0x7c,0x43, 0x6,0x22,0x27, 0x6,0x25,0x40, 0x6,0x28,0x6e, 0xf,0x22,0x68, 0x6,0x2d,0x48, 0xf,0x25,0x24, 0x6,0x33,0x47, 0x6,0x33,0x49, 0xf,0x28,0x36, 0xf,0x28,0x38, 0xf,0x28,0x39, 0xf,0x28,0x3a, 0xf,0x28,0x3b, 0xf,0x28,0x3d, 0xf,0x28,0x37, 0x6,0x31,0x5a, 0x5,0x2f,0x39, 0x6,0x3a,0x3a, 0x4,0x2e,0x63, 0x5,0x2f,0x3a, 0x6,0x3a,0x3b, 0x6,0x33,0x4b, 0xf,0x2c,0x65, 0xf,0x2c,0x66, 0xf,0x2c,0x67, 0xf,0x2c,0x68, 0xf,0x2c,0x69, 0xf,0x31,0x49, 0xf,0x31,0x4b, 0xf,0x31,0x4e, 0x6,0x3a,0x3e, 0x6,0x3a,0x3f, 0x6,0x3a,0x3d, 0x6,0x3a,0x40, 0x6,0x3a,0x3c, 0xf,0x2c,0x6a, 0x4,0x2a,0x68, 0x5,0x34,0x36, 0x6,0x3a,0x41, 0xf,0x31,0x4a, 0xf,0x31,0x4c, 0xf,0x31,0x4d, 0xf,0x31,0x4f, 0xf,0x31,0x50, 0xf,0x31,0x51, 0xf,0x31,0x52, 0xf,0x31,0x53, 0xf,0x31,0x54, 0xf,0x37,0x37, 0x6,0x42,0x63, 0x5,0x34,0x35, 0x6,0x4c,0x38, 0x5,0x3a,0x62, 0x6,0x4c,0x39, 0x6,0x4c,0x3a, 0x6,0x4c,0x3c, 0x5,0x3a,0x63, 0x6,0x4c,0x3d, 0x6,0x4c,0x3b, 0x6,0x4c,0x36, 0x6,0x4c,0x37, 0xf,0x37,0x34, 0xf,0x37,0x36, 0xf,0x37,0x38, 0xf,0x3d,0x5b, 0xf,0x37,0x35, 0x6,0x55,0x75, 0x5,0x41,0x2b, 0x5,0x41,0x2a, 0x5,0x41,0x2c, 0x6,0x4c,0x3f, 0x4,0x3f,0x48, 0xf,0x3d,0x58, 0xf,0x3d,0x59, 0xf,0x3d,0x5a, 0xf,0x3d,0x5c, 0xf,0x3d,0x5d, 0xf,0x3d,0x5e, 0xf,0x3d,0x5f, 0xf,0x3d,0x62, 0xf,0x3d,0x63, 0xf,0x3d,0x64, 0xf,0x44,0x28, 0xf,0x44,0x2a, 0xf,0x3d,0x61, 0x6,0x55,0x74, 0x5,0x48,0x23, 0x6,0x5f,0x5f, 0x6,0x5f,0x60, 0x4,0x45,0x56, 0x6,0x5f,0x63, 0x6,0x5f,0x61, 0xf,0x44,0x27, 0xf,0x44,0x29, 0xf,0x44,0x2b, 0xf,0x44,0x2c, 0xf,0x44,0x2d, 0xf,0x44,0x2e, 0xf,0x44,0x2f, 0xf,0x44,0x30, 0xf,0x44,0x31, 0xf,0x44,0x32, 0x6,0x5f,0x5d, 0x6,0x5f,0x62, 0x5,0x48,0x21, 0x6,0x5f,0x5e, 0x4,0x4b,0x5f, 0x7,0x26,0x26, 0x6,0x5f,0x5c, 0x6,0x5f,0x64, 0xf,0x4a,0x53, 0xf,0x4a,0x55, 0xf,0x4a,0x56, 0xf,0x4a,0x57, 0xf,0x4a,0x58, 0xf,0x4a,0x5a, 0x7,0x26,0x28, 0x5,0x56,0x38, 0x7,0x30,0x5c, 0x5,0x56,0x36, 0x7,0x30,0x5d, 0x4,0x51,0x77, 0x5,0x56,0x39, 0x5,0x56,0x37, 0x5,0x56,0x3a, 0x7,0x26,0x2a, 0x7,0x30,0x5b, 0xf,0x50,0x6a, 0xf,0x50,0x69, 0xf,0x56,0x51, 0x4,0x57,0x43, 0x5,0x5c,0x5a, 0x7,0x39,0x73, 0x4,0x57,0x44, 0x7,0x39,0x76, 0x7,0x39,0x74, 0x7,0x30,0x5e, 0xf,0x50,0x6b, 0xf,0x56,0x4e, 0xf,0x56,0x4f, 0xf,0x56,0x50, 0xf,0x56,0x52, 0x7,0x39,0x71, 0x7,0x39,0x75, 0x7,0x39,0x72, 0x7,0x39,0x70, 0xf,0x5b,0x4d, 0xf,0x5b,0x4f, 0x4,0x5c,0x34, 0x5,0x62,0x7b, 0x7,0x41,0x2c, 0xf,0x5b,0x4b, 0xf,0x5b,0x4c, 0xf,0x5b,0x4e, 0xf,0x5b,0x50, 0xf,0x5b,0x51, 0xf,0x5b,0x52, 0x7,0x41,0x2b, 0x4,0x5c,0x33, 0x5,0x68,0x5b, 0x7,0x48,0x3c, 0x7,0x48,0x3d, 0xf,0x5f,0x6a, 0xf,0x5f,0x6b, 0x5,0x6c,0x68, 0x4,0x63,0x77, 0xf,0x65,0x5e, 0x7,0x4e,0x5e, 0x7,0x54,0x26, 0x7,0x54,0x25, 0xf,0x65,0x5f, 0x4,0x68,0x7d, 0x7,0x58,0x4a, 0x7,0x58,0x4b, 0x7,0x5c,0x29, 0xf,0x69,0x5d, 0x7,0x5c,0x2a, 0x7,0x5c,0x2b, 0x5,0x77,0x6e, 0x7,0x5c,0x2c, 0x5,0x77,0x6f, 0xf,0x6a,0x67, 0x5,0x79,0x32, 0x7,0x62,0x49, 0x7,0x62,0x47, 0x7,0x63,0x5d, 0xf,0x6c,0x67, 0xf,0x22,0x69, 0x6,0x33,0x4d, 0x6,0x42,0x64, 0x4,0x39,0x5b, 0x6,0x4c,0x40, 0x6,0x55,0x76, 0x6,0x5f,0x65, 0x7,0x26,0x2c, 0x7,0x30,0x5f, 0x7,0x30,0x60, 0x7,0x41,0x2d, 0x5,0x73,0x6b, 0x7,0x61,0x28, 0x4,0x21,0x7e, 0x6,0x25,0x41, 0xf,0x22,0x6a, 0x6,0x28,0x6f, 0xf,0x25,0x25, 0x6,0x28,0x70, 0x4,0x27,0x55, 0x5,0x27,0x48, 0x4,0x27,0x57, 0x5,0x27,0x47, 0xf,0x28,0x3e, 0xf,0x28,0x3f, 0xf,0x28,0x40, 0xf,0x28,0x41, 0xf,0x28,0x42, 0x6,0x2d,0x4a, 0x6,0x33,0x51, 0x6,0x33,0x54, 0x5,0x2a,0x74, 0x5,0x2a,0x72, 0x4,0x2a,0x70, 0x5,0x2a,0x75, 0x6,0x33,0x56, 0x6,0x33,0x50, 0x6,0x33,0x52, 0x4,0x2a,0x6d, 0x6,0x33,0x4f, 0x5,0x2a,0x73, 0x6,0x33,0x57, 0xf,0x2c,0x6b, 0xf,0x2c,0x6c, 0xf,0x2c,0x6e, 0xf,0x2c,0x6f, 0xf,0x2c,0x70, 0x6,0x33,0x55, 0x6,0x33,0x53, 0x6,0x33,0x4e, 0x5,0x2f,0x3c, 0x5,0x2f,0x3b, 0x6,0x3a,0x45, 0x5,0x2f,0x3d, 0x6,0x3a,0x46, 0x5,0x2f,0x3e, 0x5,0x2a,0x76, 0x5,0x34,0x3c, 0x6,0x3a,0x47, 0xf,0x31,0x55, 0xf,0x31,0x56, 0x6,0x3a,0x42, 0x6,0x3a,0x44, 0x5,0x34,0x3a, 0x6,0x42,0x69, 0x5,0x34,0x3f, 0x4,0x33,0x68, 0x5,0x34,0x3d, 0x6,0x42,0x68, 0x5,0x34,0x37, 0xf,0x37,0x3a, 0xf,0x37,0x3c, 0xf,0x37,0x3d, 0xf,0x37,0x3e, 0x4,0x33,0x6c, 0x6,0x42,0x65, 0x6,0x42,0x6a, 0x4,0x39,0x5f, 0x5,0x3a,0x64, 0x4,0x39,0x60, 0x4,0x39,0x5c, 0x6,0x4c,0x41, 0x6,0x4c,0x42, 0x6,0x4c,0x45, 0x6,0x4c,0x47, 0x4,0x39,0x5d, 0x6,0x4c,0x44, 0x4,0x3f,0x51, 0xf,0x3d,0x65, 0xf,0x3d,0x67, 0xf,0x3d,0x69, 0x5,0x34,0x3e, 0xf,0x3d,0x66, 0x5,0x41,0x36, 0x5,0x41,0x2f, 0x6,0x55,0x79, 0x6,0x55,0x77, 0x6,0x55,0x7a, 0x5,0x41,0x30, 0x5,0x41,0x2d, 0x5,0x41,0x32, 0x5,0x41,0x34, 0x5,0x41,0x38, 0x5,0x41,0x33, 0x4,0x3f,0x4e, 0x6,0x56,0x21, 0x5,0x41,0x2e, 0x6,0x55,0x7b, 0x6,0x55,0x7e, 0x6,0x55,0x7c, 0xf,0x44,0x33, 0xf,0x44,0x34, 0xf,0x44,0x35, 0xf,0x44,0x36, 0xf,0x44,0x37, 0xf,0x44,0x38, 0xf,0x44,0x39, 0xf,0x44,0x3a, 0x6,0x55,0x78, 0x6,0x55,0x7d, 0x5,0x41,0x37, 0x5,0x41,0x35, 0x5,0x48,0x28, 0x6,0x5f,0x69, 0x5,0x45,0x2d, 0x5,0x48,0x2d, 0x6,0x5f,0x68, 0x6,0x5f,0x66, 0x6,0x5f,0x6a, 0x4,0x45,0x5c, 0x5,0x48,0x2e, 0x5,0x48,0x29, 0x6,0x5f,0x6e, 0x6,0x5f,0x6f, 0x5,0x48,0x2b, 0x5,0x48,0x27, 0x5,0x48,0x2c, 0x6,0x5f,0x70, 0x5,0x48,0x2a, 0x6,0x5f,0x67, 0xf,0x4a,0x60, 0xf,0x4a,0x5b, 0xf,0x4a,0x5c, 0xf,0x4a,0x5d, 0xf,0x4a,0x5e, 0xf,0x4a,0x5f, 0xf,0x4a,0x61, 0xf,0x4a,0x62, 0xf,0x4a,0x63, 0xf,0x4a,0x65, 0x6,0x5f,0x6d, 0x6,0x5f,0x6c, 0x5,0x4e,0x7b, 0x5,0x4e,0x78, 0x5,0x4e,0x7a, 0x7,0x26,0x33, 0x7,0x26,0x30, 0x5,0x4e,0x79, 0x4,0x4b,0x69, 0x7,0x26,0x34, 0x7,0x26,0x31, 0x7,0x26,0x38, 0x5,0x48,0x2f, 0x7,0x26,0x2f, 0x5,0x56,0x45, 0x5,0x4e,0x7c, 0x5,0x4e,0x7d, 0x4,0x4b,0x67, 0x4,0x4b,0x6a, 0x7,0x26,0x35, 0xf,0x50,0x6c, 0xf,0x50,0x6e, 0xf,0x50,0x6f, 0xf,0x50,0x70, 0xf,0x50,0x71, 0xf,0x50,0x72, 0x7,0x26,0x2e, 0x7,0x26,0x36, 0x7,0x26,0x37, 0x4,0x51,0x7b, 0x7,0x30,0x6d, 0x5,0x56,0x3d, 0x5,0x56,0x40, 0x7,0x30,0x69, 0x5,0x56,0x3c, 0x5,0x56,0x3f, 0x5,0x56,0x3e, 0x4,0x51,0x7e, 0x5,0x56,0x3b, 0x5,0x56,0x43, 0x7,0x30,0x63, 0x7,0x30,0x64, 0x5,0x56,0x42, 0x7,0x30,0x62, 0x5,0x56,0x46, 0x5,0x5c,0x5b, 0x5,0x56,0x47, 0x7,0x30,0x6b, 0x7,0x30,0x6a, 0x7,0x30,0x6c, 0x7,0x30,0x61, 0xf,0x56,0x54, 0xf,0x56,0x55, 0x7,0x30,0x65, 0x7,0x30,0x67, 0x7,0x30,0x68, 0x5,0x56,0x44, 0x5,0x56,0x41, 0x5,0x5c,0x5e, 0x5,0x5c,0x61, 0x5,0x5c,0x62, 0x5,0x5c,0x5f, 0x5,0x5c,0x5c, 0x5,0x5c,0x5d, 0x4,0x57,0x4a, 0x7,0x39,0x77, 0x5,0x5c,0x64, 0x4,0x57,0x46, 0x5,0x5c,0x60, 0x7,0x39,0x7a, 0xf,0x5b,0x54, 0xf,0x5b,0x55, 0xf,0x5b,0x56, 0xf,0x5b,0x57, 0xf,0x5b,0x58, 0xf,0x5b,0x5a, 0x7,0x39,0x78, 0xf,0x5b,0x53, 0x5,0x56,0x48, 0x7,0x39,0x79, 0x5,0x5c,0x63, 0xf,0x56,0x53, 0x5,0x62,0x7d, 0x5,0x63,0x26, 0x5,0x63,0x24, 0x5,0x63,0x21, 0x5,0x63,0x22, 0x5,0x63,0x25, 0x7,0x41,0x30, 0x5,0x62,0x7e, 0x7,0x41,0x2f, 0x5,0x63,0x23, 0xf,0x5f,0x6c, 0xf,0x5f,0x6d, 0xf,0x5f,0x6e, 0xf,0x5f,0x6f, 0xf,0x5f,0x70, 0xf,0x5f,0x71, 0xf,0x5f,0x72, 0x5,0x62,0x7c, 0x5,0x68,0x5e, 0x4,0x60,0x43, 0x5,0x68,0x5c, 0x4,0x60,0x44, 0x4,0x60,0x47, 0x7,0x48,0x3f, 0x4,0x60,0x46, 0x5,0x68,0x5d, 0x7,0x4e,0x62, 0x7,0x48,0x41, 0x7,0x48,0x3e, 0xf,0x63,0x30, 0x7,0x48,0x40, 0x5,0x6c,0x6b, 0x4,0x63,0x7a, 0x4,0x63,0x78, 0x5,0x6c,0x6a, 0x7,0x4e,0x60, 0x4,0x5c,0x38, 0x5,0x6c,0x69, 0x5,0x6c,0x6c, 0x7,0x4e,0x5f, 0x7,0x4e,0x61, 0xf,0x65,0x60, 0xf,0x65,0x61, 0xf,0x65,0x63, 0x7,0x4e,0x63, 0x5,0x6c,0x6d, 0x7,0x54,0x28, 0x7,0x54,0x27, 0x5,0x70,0x58, 0x7,0x54,0x29, 0x7,0x58,0x4d, 0x5,0x73,0x6c, 0x7,0x58,0x4e, 0x5,0x76,0x30, 0x5,0x76,0x31, 0x7,0x58,0x4f, 0x5,0x77,0x70, 0x7,0x5c,0x2d, 0x7,0x5c,0x2e, 0x7,0x5f,0x28, 0x7,0x5e,0x71, 0xf,0x6b,0x57, 0xf,0x6b,0x58, 0x4,0x6c,0x77, 0x5,0x79,0x33, 0xf,0x6c,0x34, 0x4,0x6c,0x78, 0x5,0x7a,0x2e, 0x5,0x7b,0x61, 0x5,0x7b,0x62, 0x6,0x23,0x37, 0x5,0x24,0x6f, 0x5,0x24,0x70, 0x4,0x27,0x59, 0x4,0x27,0x5a, 0x4,0x27,0x58, 0x6,0x2d,0x4d, 0x6,0x2d,0x4c, 0x6,0x2d,0x4f, 0x3,0x2a,0x45, 0x6,0x2d,0x4b, 0xf,0x28,0x43, 0x4,0x2a,0x74, 0x6,0x33,0x59, 0x6,0x33,0x5b, 0x6,0x33,0x58, 0x5,0x2a,0x77, 0x4,0x2a,0x73, 0x5,0x2a,0x79, 0x5,0x2a,0x78, 0x6,0x33,0x5a, 0x6,0x33,0x5c, 0x6,0x33,0x5d, 0x5,0x2a,0x7a, 0xf,0x2c,0x71, 0xf,0x2c,0x72, 0xf,0x2c,0x73, 0x5,0x2f,0x3f, 0x4,0x2e,0x66, 0x4,0x2e,0x6b, 0x4,0x2e,0x68, 0x5,0x2f,0x43, 0x5,0x2f,0x42, 0x5,0x2f,0x41, 0x6,0x3a,0x4c, 0x4,0x2e,0x69, 0x4,0x2e,0x6a, 0x4,0x2e,0x67, 0x6,0x3a,0x4a, 0x6,0x3a,0x48, 0x5,0x2f,0x40, 0x5,0x2f,0x44, 0xf,0x31,0x58, 0xf,0x31,0x59, 0xf,0x31,0x5a, 0x6,0x3a,0x4b, 0x6,0x3a,0x49, 0x5,0x34,0x44, 0x5,0x34,0x43, 0x6,0x42,0x6c, 0x6,0x42,0x6b, 0x6,0x42,0x6d, 0x5,0x34,0x41, 0x4,0x33,0x6e, 0x5,0x34,0x42, 0x5,0x34,0x40, 0x6,0x42,0x6e, 0xf,0x37,0x40, 0xf,0x37,0x41, 0xf,0x37,0x42, 0xf,0x37,0x43, 0xf,0x37,0x44, 0x5,0x3a,0x72, 0x4,0x39,0x66, 0x5,0x3a,0x74, 0x6,0x4c,0x4e, 0x6,0x4c,0x4a, 0x4,0x39,0x69, 0x6,0x4c,0x52, 0x5,0x3a,0x69, 0x5,0x3a,0x6f, 0x5,0x3a,0x71, 0x6,0x4c,0x50, 0x5,0x3a,0x67, 0x6,0x4c,0x51, 0x5,0x3a,0x68, 0x6,0x4c,0x4b, 0x5,0x3a,0x6a, 0x4,0x39,0x68, 0x5,0x3a,0x73, 0x6,0x4c,0x4c, 0x5,0x3a,0x70, 0x6,0x4c,0x49, 0x5,0x3a,0x66, 0x5,0x3a,0x6d, 0x6,0x4c,0x4f, 0x5,0x3a,0x6e, 0x5,0x3a,0x6b, 0x6,0x4c,0x4d, 0xf,0x3d,0x6b, 0x5,0x41,0x3a, 0x6,0x56,0x29, 0x5,0x41,0x3c, 0x5,0x41,0x3b, 0x5,0x41,0x3e, 0x6,0x56,0x22, 0x6,0x56,0x24, 0x5,0x3a,0x6c, 0x5,0x41,0x3d, 0x5,0x41,0x3f, 0x6,0x56,0x28, 0x6,0x56,0x2b, 0x5,0x41,0x40, 0x6,0x56,0x26, 0x6,0x56,0x25, 0xf,0x44,0x3b, 0xf,0x44,0x3d, 0xf,0x44,0x3e, 0xf,0x44,0x3f, 0xf,0x44,0x40, 0x6,0x56,0x23, 0x6,0x56,0x2a, 0x6,0x57,0x26, 0x4,0x45,0x61, 0x6,0x5f,0x77, 0x5,0x48,0x32, 0x6,0x5f,0x76, 0x6,0x5f,0x72, 0x6,0x5f,0x74, 0x6,0x5f,0x73, 0x5,0x48,0x31, 0x6,0x5f,0x79, 0xf,0x4a,0x66, 0x5,0x48,0x33, 0x6,0x5f,0x71, 0xf,0x44,0x3c, 0x7,0x26,0x3b, 0x5,0x4f,0x21, 0x5,0x4f,0x27, 0x5,0x4f,0x2a, 0x5,0x48,0x30, 0x7,0x26,0x3a, 0x5,0x4f,0x2b, 0x5,0x4f,0x26, 0x5,0x4f,0x22, 0x5,0x4f,0x2c, 0x5,0x4f,0x25, 0x7,0x26,0x39, 0x5,0x4e,0x7e, 0x5,0x4f,0x28, 0x5,0x4f,0x24, 0x5,0x4f,0x29, 0x7,0x27,0x2e, 0x4,0x4b,0x6d, 0x5,0x56,0x4f, 0x5,0x56,0x51, 0x4,0x52,0x23, 0x5,0x56,0x50, 0x4,0x52,0x26, 0x5,0x56,0x49, 0x4,0x52,0x28, 0x7,0x30,0x70, 0x5,0x56,0x4a, 0x5,0x56,0x4c, 0x5,0x56,0x4b, 0x5,0x56,0x53, 0x5,0x56,0x4d, 0x5,0x56,0x54, 0x7,0x30,0x6e, 0x5,0x56,0x4e, 0x5,0x5c,0x65, 0x5,0x56,0x55, 0xf,0x56,0x56, 0xf,0x56,0x57, 0xf,0x56,0x58, 0xf,0x56,0x59, 0xf,0x56,0x5a, 0x7,0x30,0x71, 0x5,0x5c,0x6a, 0x5,0x5c,0x67, 0x7,0x3a,0x21, 0x4,0x57,0x4e, 0x5,0x5c,0x69, 0x7,0x39,0x7c, 0x7,0x39,0x7d, 0x7,0x39,0x7b, 0x5,0x5c,0x66, 0x7,0x39,0x7e, 0x7,0x30,0x72, 0x5,0x5c,0x68, 0xf,0x5b,0x5b, 0x5,0x63,0x28, 0x5,0x63,0x27, 0xf,0x5f,0x74, 0x4,0x60,0x4a, 0x7,0x48,0x44, 0x7,0x48,0x43, 0x5,0x68,0x5f, 0x7,0x48,0x42, 0x7,0x4e,0x64, 0x7,0x4e,0x66, 0x5,0x68,0x60, 0x4,0x63,0x7b, 0x5,0x6c,0x6e, 0x7,0x54,0x2d, 0x7,0x4e,0x67, 0x7,0x4e,0x65, 0xf,0x65,0x64, 0x5,0x70,0x5b, 0x7,0x54,0x2b, 0x4,0x66,0x67, 0x4,0x66,0x66, 0x5,0x70,0x59, 0x7,0x54,0x2c, 0x5,0x70,0x5a, 0xf,0x68,0x21, 0xf,0x65,0x65, 0x5,0x76,0x32, 0x7,0x5c,0x2f, 0x5,0x77,0x71, 0x7,0x61,0x2a, 0xf,0x6b,0x59, 0x7,0x5f,0x29, 0x5,0x79,0x34, 0x7,0x62,0x4a, 0x5,0x7b,0x63, 0x6,0x28,0x72, 0x6,0x28,0x71, 0x5,0x27,0x49, 0x5,0x27,0x4a, 0x4,0x2a,0x75, 0xf,0x2c,0x74, 0xf,0x2c,0x78, 0x4,0x2e,0x6f, 0x5,0x2f,0x47, 0x5,0x2f,0x48, 0x4,0x2e,0x6c, 0x5,0x2f,0x46, 0x5,0x2f,0x45, 0x4,0x2e,0x6e, 0xf,0x31,0x5c, 0xf,0x31,0x5d, 0xf,0x31,0x5e, 0xf,0x31,0x5f, 0xf,0x31,0x61, 0xf,0x31,0x62, 0x6,0x3a,0x4d, 0x6,0x3a,0x4e, 0x6,0x42,0x72, 0x4,0x33,0x73, 0x6,0x42,0x71, 0x6,0x42,0x73, 0x6,0x42,0x70, 0x4,0x33,0x74, 0xf,0x37,0x45, 0xf,0x37,0x47, 0x5,0x34,0x47, 0xf,0x37,0x48, 0x4,0x39,0x6b, 0x6,0x4c,0x55, 0x5,0x3a,0x75, 0x5,0x3a,0x77, 0x5,0x3a,0x76, 0x5,0x3a,0x78, 0x6,0x4c,0x54, 0xf,0x3d,0x6d, 0xf,0x3d,0x6e, 0xf,0x3d,0x6f, 0xf,0x3d,0x70, 0x4,0x3f,0x56, 0x4,0x3f,0x58, 0x5,0x41,0x42, 0x4,0x3f,0x59, 0x6,0x56,0x2c, 0x5,0x41,0x41, 0x6,0x56,0x2d, 0x6,0x56,0x2e, 0xf,0x44,0x41, 0xf,0x44,0x42, 0xf,0x44,0x43, 0x5,0x41,0x43, 0x5,0x48,0x34, 0x6,0x5f,0x7a, 0x5,0x48,0x35, 0x4,0x45,0x62, 0xf,0x4a,0x67, 0xf,0x4a,0x68, 0xf,0x4a,0x6a, 0xf,0x4a,0x69, 0x7,0x26,0x3f, 0x4,0x4b,0x6e, 0x5,0x4f,0x2d, 0xf,0x50,0x73, 0xf,0x50,0x74, 0xf,0x50,0x75, 0x7,0x26,0x3d, 0xf,0x56,0x5c, 0xf,0x56,0x5b, 0x4,0x57,0x51, 0x7,0x30,0x74, 0x5,0x56,0x56, 0xf,0x5b,0x5c, 0x5,0x5c,0x6c, 0x5,0x5d,0x63, 0x7,0x3a,0x22, 0x5,0x5c,0x6b, 0x5,0x63,0x2a, 0x7,0x3a,0x23, 0xf,0x5f,0x75, 0x7,0x41,0x31, 0x5,0x63,0x29, 0x7,0x4e,0x68, 0x7,0x54,0x2e, 0xf,0x65,0x66, 0x7,0x48,0x45, 0x5,0x70,0x5c, 0xf,0x68,0x22, 0x7,0x58,0x50, 0xf,0x69,0x5e, 0xf,0x6a,0x68, 0x7,0x61,0x2b, 0xf,0x25,0x26, 0x5,0x27,0x4b, 0x6,0x2d,0x50, 0x5,0x27,0x4d, 0x5,0x27,0x4c, 0x5,0x2a,0x7c, 0x5,0x2a,0x7d, 0x5,0x2a,0x7b, 0x6,0x33,0x5f, 0x6,0x33,0x5e, 0x5,0x2a,0x7e, 0xf,0x2c,0x79, 0xf,0x2c,0x7a, 0xf,0x2c,0x7b, 0xf,0x2c,0x7c, 0xf,0x2c,0x7d, 0xf,0x29,0x24, 0x5,0x2f,0x4e, 0x5,0x2f,0x49, 0x4,0x2e,0x74, 0x5,0x2f,0x4a, 0x5,0x2f,0x4c, 0x5,0x2f,0x4d, 0x6,0x3a,0x50, 0x5,0x2f,0x51, 0x5,0x2f,0x4f, 0x5,0x2f,0x4b, 0x6,0x3a,0x4f, 0x6,0x3a,0x51, 0x5,0x2f,0x50, 0x5,0x2f,0x52, 0xf,0x31,0x63, 0xf,0x31,0x64, 0xf,0x31,0x65, 0xf,0x31,0x66, 0xf,0x31,0x67, 0xf,0x31,0x68, 0xf,0x31,0x69, 0xf,0x31,0x6a, 0x4,0x2e,0x76, 0x6,0x42,0x74, 0x6,0x42,0x7a, 0x5,0x34,0x4a, 0x4,0x33,0x79, 0x5,0x34,0x4d, 0x6,0x42,0x77, 0x5,0x34,0x4c, 0x6,0x42,0x7c, 0x4,0x33,0x75, 0x5,0x34,0x4e, 0x6,0x42,0x75, 0x5,0x2f,0x53, 0x5,0x34,0x49, 0x6,0x42,0x79, 0x6,0x42,0x7b, 0x5,0x34,0x50, 0x5,0x34,0x51, 0x6,0x42,0x78, 0xf,0x37,0x49, 0xf,0x37,0x4a, 0xf,0x37,0x4b, 0xf,0x37,0x4c, 0xf,0x37,0x4e, 0xf,0x37,0x4f, 0x5,0x3a,0x7c, 0x5,0x3b,0x22, 0x5,0x3a,0x7b, 0x5,0x3a,0x7e, 0x4,0x39,0x6c, 0x4,0x39,0x6e, 0x6,0x4c,0x5a, 0x5,0x34,0x4b, 0x4,0x39,0x73, 0x5,0x3b,0x21, 0x5,0x3a,0x7a, 0x4,0x39,0x79, 0x4,0x39,0x77, 0x4,0x39,0x70, 0x6,0x4c,0x5d, 0x4,0x39,0x78, 0x6,0x4c,0x57, 0x5,0x3b,0x25, 0x6,0x4c,0x59, 0x6,0x4c,0x5c, 0x5,0x34,0x4f, 0x5,0x3a,0x7d, 0xf,0x3d,0x71, 0xf,0x3d,0x72, 0xf,0x3d,0x73, 0xf,0x3d,0x74, 0xf,0x3d,0x75, 0xf,0x3d,0x76, 0xf,0x3d,0x78, 0xf,0x3d,0x79, 0xf,0x3d,0x7a, 0xf,0x3d,0x77, 0x5,0x3b,0x23, 0x5,0x41,0x54, 0x5,0x41,0x48, 0x5,0x41,0x4f, 0x4,0x3f,0x5c, 0x5,0x41,0x4d, 0x5,0x41,0x45, 0x4,0x3f,0x64, 0x4,0x3f,0x65, 0x5,0x41,0x50, 0x4,0x3f,0x5f, 0x5,0x3a,0x79, 0x6,0x56,0x30, 0x5,0x41,0x46, 0x5,0x41,0x55, 0x5,0x41,0x4b, 0x5,0x41,0x52, 0x5,0x41,0x44, 0x5,0x41,0x49, 0x5,0x41,0x4c, 0x6,0x56,0x34, 0x6,0x56,0x32, 0x6,0x56,0x37, 0x6,0x56,0x3a, 0x6,0x56,0x33, 0x6,0x56,0x36, 0x6,0x56,0x38, 0x6,0x5f,0x7b, 0x5,0x41,0x53, 0x5,0x41,0x51, 0x5,0x41,0x4e, 0x5,0x41,0x47, 0x6,0x56,0x31, 0x6,0x4c,0x58, 0x6,0x56,0x35, 0x6,0x56,0x39, 0xf,0x44,0x44, 0xf,0x44,0x46, 0xf,0x44,0x47, 0xf,0x44,0x48, 0xf,0x44,0x49, 0xf,0x44,0x4a, 0xf,0x44,0x4b, 0xf,0x44,0x4c, 0xf,0x44,0x4d, 0xf,0x44,0x4e, 0xf,0x44,0x4f, 0xf,0x44,0x50, 0x6,0x56,0x2f, 0xf,0x41,0x3e, 0x5,0x48,0x45, 0x5,0x41,0x56, 0x4,0x45,0x6c, 0x5,0x48,0x43, 0x6,0x60,0x27, 0x4,0x45,0x67, 0x6,0x5f,0x7c, 0x6,0x5f,0x7d, 0x5,0x48,0x3c, 0x5,0x48,0x3b, 0x5,0x48,0x42, 0x4,0x45,0x6f, 0x6,0x60,0x28, 0x5,0x48,0x40, 0x6,0x60,0x26, 0x5,0x48,0x38, 0x5,0x48,0x39, 0x6,0x60,0x25, 0x6,0x60,0x21, 0x5,0x48,0x3a, 0x5,0x48,0x41, 0x5,0x48,0x37, 0x5,0x48,0x3d, 0x6,0x60,0x22, 0x5,0x41,0x4a, 0x5,0x48,0x47, 0x6,0x5f,0x7e, 0x5,0x48,0x3e, 0x6,0x60,0x24, 0x5,0x48,0x3f, 0x4,0x45,0x71, 0x5,0x48,0x44, 0xf,0x4a,0x6b, 0xf,0x4a,0x6c, 0xf,0x4a,0x6d, 0xf,0x4a,0x6e, 0xf,0x4a,0x6f, 0xf,0x4a,0x70, 0xf,0x4a,0x73, 0xf,0x4a,0x74, 0xf,0x4a,0x75, 0xf,0x4a,0x76, 0xf,0x4a,0x77, 0xf,0x4a,0x78, 0xf,0x4a,0x79, 0xf,0x4a,0x7a, 0xf,0x4a,0x72, 0xf,0x4a,0x71, 0x5,0x4f,0x3a, 0x7,0x26,0x49, 0x7,0x26,0x4b, 0x5,0x4f,0x44, 0x4,0x4c,0x2f, 0x5,0x4f,0x33, 0x7,0x26,0x51, 0x7,0x26,0x4a, 0x5,0x4f,0x3e, 0x4,0x4b,0x71, 0x4,0x4b,0x6f, 0x5,0x4f,0x41, 0x5,0x4f,0x2f, 0x5,0x4f,0x34, 0x5,0x4f,0x43, 0x7,0x26,0x42, 0x5,0x4f,0x40, 0x5,0x4f,0x31, 0x4,0x52,0x40, 0x5,0x4f,0x39, 0x5,0x4f,0x42, 0x4,0x4b,0x72, 0x4,0x4c,0x29, 0x4,0x4c,0x23, 0x4,0x4b,0x7d, 0x5,0x4f,0x38, 0x5,0x4f,0x37, 0x5,0x4f,0x3c, 0x7,0x26,0x4e, 0x5,0x48,0x48, 0x5,0x4f,0x35, 0x7,0x26,0x50, 0x7,0x26,0x47, 0x7,0x26,0x44, 0x5,0x4f,0x3f, 0x7,0x26,0x40, 0x7,0x26,0x53, 0x4,0x4c,0x24, 0x7,0x26,0x4f, 0x4,0x4b,0x7c, 0x7,0x26,0x4c, 0x5,0x4f,0x3d, 0x7,0x26,0x45, 0x7,0x26,0x43, 0x5,0x4f,0x2e, 0x7,0x26,0x48, 0x7,0x26,0x46, 0x5,0x4f,0x46, 0xf,0x50,0x78, 0x7,0x26,0x52, 0xf,0x50,0x77, 0xf,0x50,0x7a, 0xf,0x50,0x7b, 0xf,0x50,0x7c, 0xf,0x50,0x7d, 0xf,0x50,0x7e, 0xf,0x51,0x22, 0xf,0x51,0x24, 0xf,0x51,0x29, 0xf,0x51,0x25, 0xf,0x51,0x26, 0xf,0x51,0x27, 0xf,0x51,0x2a, 0x5,0x56,0x64, 0x4,0x52,0x41, 0x4,0x52,0x3e, 0x5,0x56,0x58, 0x5,0x56,0x5e, 0x5,0x56,0x66, 0x7,0x31,0x2a, 0x5,0x56,0x5c, 0x4,0x52,0x2e, 0x5,0x56,0x5d, 0x4,0x52,0x2c, 0x5,0x56,0x68, 0x7,0x26,0x41, 0x7,0x31,0x25, 0x4,0x52,0x32, 0x5,0x56,0x67, 0x4,0x52,0x31, 0x7,0x31,0x29, 0x4,0x52,0x3c, 0x7,0x30,0x7e, 0x7,0x31,0x26, 0x4,0x52,0x30, 0x5,0x56,0x60, 0x7,0x30,0x7b, 0x4,0x52,0x3f, 0x5,0x56,0x5f, 0x5,0x56,0x59, 0x7,0x30,0x7a, 0x7,0x31,0x28, 0x4,0x52,0x2a, 0x5,0x56,0x57, 0x7,0x31,0x24, 0x4,0x52,0x35, 0x5,0x56,0x65, 0x7,0x30,0x7d, 0x5,0x56,0x62, 0x4,0x52,0x33, 0x7,0x31,0x2b, 0x7,0x30,0x75, 0x7,0x31,0x27, 0x5,0x4f,0x30, 0x5,0x56,0x63, 0x5,0x56,0x5a, 0x7,0x30,0x78, 0x7,0x31,0x23, 0x7,0x30,0x76, 0x5,0x56,0x61, 0xf,0x56,0x72, 0x5,0x56,0x5b, 0x7,0x30,0x7c, 0x7,0x30,0x77, 0x7,0x31,0x22, 0xf,0x56,0x5d, 0xf,0x56,0x5e, 0xf,0x56,0x60, 0xf,0x56,0x61, 0xf,0x56,0x62, 0xf,0x56,0x63, 0xf,0x56,0x64, 0xf,0x56,0x65, 0xf,0x56,0x66, 0xf,0x56,0x67, 0xf,0x56,0x68, 0xf,0x56,0x69, 0xf,0x56,0x6a, 0xf,0x56,0x6b, 0xf,0x56,0x6c, 0xf,0x56,0x6d, 0xf,0x56,0x6e, 0xf,0x56,0x6f, 0xf,0x56,0x70, 0xf,0x56,0x71, 0xf,0x56,0x73, 0x7,0x30,0x79, 0xf,0x50,0x79, 0x5,0x5d,0x24, 0x5,0x5d,0x21, 0x4,0x57,0x5d, 0x5,0x5c,0x75, 0x5,0x5d,0x2d, 0x5,0x5c,0x79, 0x4,0x57,0x5c, 0x4,0x57,0x63, 0x4,0x57,0x67, 0x7,0x3a,0x2c, 0x5,0x5d,0x2b, 0x4,0x57,0x60, 0x5,0x5d,0x22, 0x5,0x5c,0x70, 0x5,0x5d,0x23, 0x5,0x5c,0x72, 0x5,0x5d,0x31, 0x5,0x5c,0x7b, 0x5,0x5d,0x2a, 0x5,0x5c,0x77, 0x5,0x5d,0x34, 0x7,0x3a,0x24, 0x5,0x5c,0x76, 0x5,0x5c,0x7c, 0x5,0x5d,0x26, 0x4,0x57,0x64, 0x5,0x5d,0x27, 0x7,0x3a,0x29, 0x5,0x63,0x42, 0x5,0x5d,0x2c, 0x5,0x5c,0x7a, 0x7,0x3a,0x2f, 0x7,0x3a,0x28, 0x5,0x5c,0x6f, 0x5,0x5d,0x32, 0x5,0x5d,0x29, 0x5,0x5c,0x73, 0x7,0x3a,0x2b, 0x5,0x5d,0x2e, 0x5,0x5c,0x71, 0x5,0x5c,0x6e, 0x5,0x5d,0x28, 0x4,0x57,0x66, 0x4,0x5c,0x3c, 0x5,0x5d,0x33, 0x5,0x5c,0x78, 0x5,0x5d,0x2f, 0x5,0x5d,0x25, 0x7,0x31,0x21, 0x5,0x5c,0x74, 0x7,0x3a,0x27, 0x7,0x3a,0x26, 0x7,0x3a,0x25, 0x7,0x3a,0x2d, 0xf,0x5b,0x5d, 0xf,0x5b,0x5e, 0xf,0x5b,0x60, 0xf,0x5b,0x61, 0xf,0x5b,0x62, 0xf,0x5b,0x63, 0xf,0x5b,0x64, 0xf,0x5b,0x66, 0xf,0x5b,0x67, 0xf,0x5b,0x68, 0xf,0x5b,0x69, 0x7,0x3a,0x2a, 0x7,0x3a,0x2e, 0x4,0x57,0x68, 0xf,0x5b,0x65, 0x4,0x57,0x61, 0x5,0x63,0x4b, 0x5,0x63,0x47, 0x5,0x5d,0x35, 0x4,0x5c,0x52, 0x5,0x63,0x45, 0x5,0x63,0x38, 0x5,0x63,0x33, 0x4,0x5c,0x47, 0x5,0x63,0x4a, 0x5,0x63,0x40, 0x3,0x58,0x4f, 0x5,0x63,0x2e, 0x4,0x5c,0x4e, 0x4,0x5c,0x45, 0x5,0x63,0x43, 0x5,0x63,0x39, 0x5,0x63,0x4c, 0x4,0x5c,0x3d, 0x7,0x41,0x3b, 0x5,0x63,0x46, 0x5,0x63,0x30, 0x5,0x63,0x37, 0x4,0x5c,0x3e, 0x4,0x5c,0x3f, 0x5,0x63,0x48, 0x7,0x41,0x39, 0x5,0x63,0x35, 0x5,0x63,0x32, 0x5,0x63,0x3f, 0x7,0x41,0x35, 0x5,0x63,0x2c, 0x7,0x41,0x36, 0x4,0x5c,0x41, 0x7,0x41,0x33, 0x4,0x5c,0x53, 0x5,0x63,0x3e, 0x7,0x41,0x38, 0x5,0x63,0x3d, 0x7,0x41,0x3a, 0x7,0x41,0x3e, 0x7,0x41,0x34, 0x5,0x63,0x31, 0x4,0x5c,0x4d, 0x5,0x63,0x36, 0x5,0x63,0x3a, 0x5,0x63,0x44, 0x5,0x63,0x49, 0x5,0x63,0x3c, 0x5,0x63,0x2d, 0x7,0x41,0x42, 0x7,0x41,0x41, 0x5,0x63,0x3b, 0x5,0x63,0x2b, 0x5,0x63,0x2f, 0x7,0x41,0x32, 0x7,0x41,0x37, 0xf,0x5f,0x76, 0xf,0x5f,0x77, 0xf,0x5f,0x78, 0xf,0x5f,0x79, 0xf,0x5f,0x7a, 0xf,0x5f,0x7b, 0xf,0x5f,0x7c, 0xf,0x5f,0x7d, 0xf,0x5f,0x7e, 0xf,0x60,0x21, 0xf,0x60,0x23, 0xf,0x60,0x24, 0xf,0x60,0x25, 0x7,0x41,0x40, 0x7,0x41,0x3d, 0xf,0x5b,0x6a, 0xf,0x63,0x36, 0xf,0x63,0x37, 0xf,0x60,0x22, 0x5,0x68,0x6a, 0x5,0x68,0x6f, 0x7,0x48,0x4e, 0x4,0x60,0x59, 0x7,0x48,0x4c, 0x5,0x68,0x63, 0x4,0x60,0x54, 0x4,0x60,0x55, 0x4,0x60,0x51, 0x5,0x68,0x69, 0x4,0x60,0x4f, 0x4,0x60,0x50, 0x7,0x48,0x48, 0x4,0x60,0x52, 0x5,0x68,0x62, 0x4,0x60,0x58, 0x4,0x60,0x4d, 0x7,0x48,0x47, 0x5,0x68,0x6d, 0x5,0x68,0x68, 0x5,0x68,0x70, 0x5,0x68,0x6c, 0x5,0x68,0x6b, 0x5,0x68,0x65, 0x5,0x68,0x64, 0x5,0x68,0x67, 0x7,0x48,0x46, 0x7,0x48,0x4a, 0x5,0x68,0x61, 0x5,0x68,0x71, 0x7,0x48,0x49, 0xf,0x63,0x31, 0xf,0x63,0x33, 0xf,0x63,0x34, 0xf,0x63,0x35, 0xf,0x63,0x38, 0xf,0x63,0x39, 0xf,0x63,0x3a, 0xf,0x63,0x3b, 0xf,0x63,0x3c, 0x7,0x48,0x4b, 0x7,0x48,0x4d, 0x5,0x6c,0x7c, 0x5,0x6c,0x7b, 0x5,0x6c,0x76, 0x4,0x60,0x57, 0x5,0x6c,0x74, 0x7,0x4e,0x6c, 0x5,0x6c,0x7a, 0x4,0x63,0x7d, 0x7,0x4e,0x74, 0x4,0x64,0x22, 0x5,0x6c,0x78, 0x5,0x6c,0x73, 0x4,0x66,0x70, 0x7,0x4e,0x6a, 0x5,0x6c,0x6f, 0x5,0x6c,0x75, 0x5,0x6c,0x71, 0x7,0x4e,0x69, 0x7,0x4e,0x75, 0x5,0x6c,0x77, 0x7,0x4e,0x6d, 0x7,0x4e,0x6e, 0x5,0x6c,0x72, 0x7,0x4e,0x6f, 0x7,0x54,0x38, 0x7,0x4e,0x71, 0x7,0x4e,0x70, 0x7,0x4e,0x72, 0x7,0x4e,0x73, 0xf,0x65,0x68, 0xf,0x65,0x69, 0x7,0x4e,0x6b, 0x5,0x70,0x64, 0x5,0x70,0x68, 0x5,0x70,0x69, 0x4,0x66,0x71, 0x4,0x66,0x6b, 0x5,0x70,0x66, 0x5,0x70,0x6b, 0x7,0x54,0x2f, 0x5,0x70,0x5e, 0x5,0x70,0x63, 0x5,0x70,0x60, 0x4,0x64,0x21, 0x5,0x70,0x67, 0x5,0x70,0x5f, 0x5,0x6c,0x70, 0x7,0x54,0x35, 0x5,0x70,0x6a, 0x5,0x70,0x5d, 0x7,0x54,0x31, 0x5,0x70,0x65, 0x4,0x69,0x27, 0x5,0x70,0x6c, 0x7,0x54,0x36, 0x7,0x54,0x30, 0x7,0x54,0x34, 0xf,0x68,0x23, 0xf,0x68,0x24, 0xf,0x68,0x25, 0xf,0x68,0x26, 0xf,0x68,0x27, 0xf,0x68,0x28, 0xf,0x68,0x29, 0x7,0x54,0x33, 0x7,0x54,0x39, 0x7,0x54,0x32, 0x7,0x58,0x55, 0x4,0x69,0x24, 0x4,0x69,0x23, 0x5,0x73,0x70, 0x5,0x73,0x6e, 0x5,0x70,0x62, 0x5,0x73,0x71, 0x7,0x58,0x52, 0x5,0x70,0x6d, 0x7,0x58,0x51, 0x5,0x73,0x74, 0x4,0x69,0x25, 0x5,0x73,0x6d, 0x7,0x58,0x54, 0x7,0x54,0x37, 0x5,0x73,0x76, 0x5,0x73,0x73, 0x5,0x73,0x6f, 0x5,0x73,0x75, 0x5,0x73,0x72, 0x7,0x58,0x56, 0xf,0x69,0x5f, 0xf,0x69,0x60, 0xf,0x69,0x61, 0xf,0x69,0x62, 0x7,0x58,0x53, 0x7,0x59,0x34, 0x4,0x6a,0x5e, 0x5,0x76,0x33, 0x7,0x5c,0x31, 0x5,0x76,0x34, 0x4,0x6a,0x5f, 0x4,0x6a,0x60, 0x4,0x6a,0x62, 0x7,0x5c,0x30, 0x5,0x76,0x36, 0x7,0x5c,0x32, 0x5,0x76,0x35, 0x7,0x5c,0x36, 0x7,0x5c,0x35, 0xf,0x6a,0x69, 0x7,0x5c,0x33, 0x7,0x5c,0x37, 0x7,0x5c,0x34, 0x5,0x77,0x72, 0x7,0x5f,0x2b, 0x7,0x5f,0x2e, 0x5,0x77,0x74, 0x5,0x77,0x75, 0x7,0x5f,0x2d, 0x5,0x76,0x37, 0x7,0x5f,0x2c, 0x7,0x5f,0x2a, 0x5,0x77,0x73, 0x7,0x5f,0x31, 0x4,0x6b,0x77, 0xf,0x6b,0x5a, 0xf,0x6b,0x5b, 0xf,0x6b,0x5c, 0x7,0x5f,0x2f, 0x5,0x79,0x35, 0x7,0x61,0x2c, 0x7,0x61,0x2e, 0x7,0x61,0x31, 0x4,0x6c,0x79, 0x7,0x61,0x2f, 0x7,0x5f,0x30, 0x7,0x61,0x2d, 0x5,0x7a,0x31, 0x5,0x7a,0x2f, 0x5,0x7a,0x30, 0x7,0x61,0x30, 0xf,0x6c,0x4f, 0xf,0x6c,0x4d, 0x7,0x63,0x5e, 0x7,0x63,0x5f, 0xf,0x6c,0x68, 0x7,0x63,0x60, 0x5,0x7b,0x44, 0x5,0x7b,0x64, 0xf,0x6d,0x27, 0x7,0x64,0x54, 0x4,0x6e,0x4e, 0x5,0x7b,0x7c, 0x5,0x7c,0x2b, 0x5,0x24,0x71, 0xf,0x25,0x27, 0x5,0x27,0x4e, 0x6,0x2d,0x51, 0xf,0x28,0x45, 0x6,0x33,0x61, 0x5,0x2b,0x22, 0x6,0x33,0x60, 0x5,0x2b,0x23, 0xf,0x2c,0x7e, 0xf,0x2d,0x22, 0x6,0x3a,0x52, 0x5,0x2f,0x54, 0x6,0x3a,0x56, 0x5,0x2f,0x55, 0x6,0x3a,0x54, 0x5,0x2f,0x56, 0xf,0x31,0x6b, 0xf,0x31,0x6c, 0xf,0x31,0x6d, 0xf,0x31,0x6e, 0x6,0x3a,0x53, 0x6,0x3a,0x55, 0x4,0x33,0x7e, 0x5,0x34,0x55, 0x4,0x34,0x24, 0x5,0x34,0x54, 0x4,0x34,0x21, 0x5,0x34,0x58, 0x5,0x34,0x53, 0x5,0x34,0x56, 0x5,0x34,0x57, 0x4,0x34,0x23, 0x5,0x34,0x5a, 0x5,0x34,0x52, 0x6,0x42,0x7d, 0x6,0x4c,0x63, 0x6,0x43,0x21, 0xf,0x37,0x50, 0xf,0x37,0x51, 0x6,0x42,0x7e, 0xf,0x37,0x52, 0x5,0x3b,0x26, 0x4,0x39,0x7a, 0x6,0x4c,0x61, 0x6,0x4c,0x5e, 0x6,0x4c,0x65, 0x5,0x3b,0x28, 0x4,0x3a,0x21, 0x6,0x4c,0x64, 0x6,0x4c,0x5f, 0xf,0x3d,0x7c, 0xf,0x3d,0x7e, 0xf,0x3e,0x22, 0xf,0x3d,0x7b, 0x6,0x4c,0x62, 0x5,0x41,0x57, 0x4,0x3f,0x68, 0x6,0x56,0x3d, 0x5,0x41,0x59, 0x5,0x41,0x5a, 0x5,0x3b,0x27, 0x5,0x41,0x58, 0x6,0x56,0x3f, 0x6,0x56,0x3e, 0x4,0x39,0x7e, 0x5,0x41,0x5b, 0x5,0x41,0x5d, 0x5,0x41,0x5c, 0x6,0x56,0x41, 0xf,0x44,0x52, 0xf,0x44,0x53, 0xf,0x44,0x55, 0xf,0x44,0x56, 0x6,0x56,0x3b, 0xf,0x44,0x54, 0x6,0x56,0x40, 0xf,0x44,0x51, 0x6,0x60,0x2d, 0x5,0x48,0x4a, 0x6,0x60,0x2b, 0x6,0x60,0x2e, 0x5,0x48,0x4c, 0x4,0x45,0x73, 0x6,0x56,0x3c, 0x6,0x60,0x33, 0x6,0x60,0x32, 0x5,0x48,0x4b, 0x6,0x60,0x30, 0x5,0x48,0x49, 0x5,0x48,0x4d, 0xf,0x4a,0x7c, 0xf,0x4a,0x7d, 0xf,0x4a,0x7e, 0xf,0x4b,0x21, 0xf,0x4b,0x22, 0xf,0x4b,0x23, 0xf,0x4b,0x25, 0xf,0x4b,0x26, 0xf,0x4b,0x28, 0xf,0x4b,0x29, 0xf,0x4b,0x2a, 0xf,0x4b,0x2d, 0x6,0x60,0x2f, 0xf,0x4b,0x2c, 0x6,0x60,0x29, 0x6,0x60,0x2a, 0xf,0x4b,0x24, 0x7,0x26,0x58, 0x7,0x26,0x54, 0x4,0x4c,0x36, 0x5,0x4f,0x4b, 0x7,0x26,0x55, 0x7,0x26,0x59, 0x4,0x4c,0x33, 0x5,0x4f,0x4a, 0x5,0x4f,0x4c, 0x5,0x4f,0x50, 0x5,0x48,0x4e, 0x5,0x4f,0x4f, 0x5,0x4f,0x4d, 0x7,0x26,0x5b, 0x7,0x26,0x56, 0x5,0x4f,0x49, 0x4,0x4c,0x34, 0x5,0x4f,0x4e, 0x4,0x4c,0x32, 0x7,0x26,0x5a, 0x5,0x4f,0x48, 0x5,0x4f,0x47, 0xf,0x51,0x2b, 0xf,0x51,0x2c, 0xf,0x51,0x2d, 0xf,0x51,0x2f, 0x5,0x56,0x6e, 0x5,0x56,0x6c, 0x5,0x5d,0x3c, 0x4,0x52,0x43, 0x5,0x56,0x6b, 0x4,0x52,0x42, 0x7,0x31,0x2f, 0x7,0x31,0x30, 0x5,0x56,0x6f, 0x7,0x31,0x2c, 0x5,0x56,0x6a, 0x5,0x56,0x6d, 0x5,0x56,0x70, 0xf,0x56,0x74, 0xf,0x56,0x75, 0x7,0x31,0x2e, 0x5,0x5d,0x36, 0x5,0x5d,0x38, 0x7,0x3a,0x30, 0x5,0x5d,0x39, 0x5,0x5d,0x37, 0x5,0x5d,0x3a, 0x5,0x5d,0x3b, 0x7,0x3a,0x32, 0x7,0x3a,0x34, 0x7,0x3a,0x35, 0x7,0x3a,0x31, 0xf,0x5b,0x6b, 0xf,0x5b,0x6c, 0xf,0x5b,0x6d, 0xf,0x5b,0x6f, 0xf,0x5b,0x70, 0xf,0x5b,0x71, 0xf,0x5b,0x72, 0x4,0x57,0x6c, 0x5,0x63,0x52, 0x7,0x41,0x45, 0x4,0x5c,0x57, 0x5,0x63,0x53, 0x5,0x63,0x4f, 0x7,0x48,0x56, 0x5,0x63,0x51, 0x5,0x5d,0x3d, 0x7,0x41,0x46, 0x5,0x63,0x50, 0x7,0x4e,0x78, 0x5,0x63,0x4d, 0x7,0x41,0x43, 0xf,0x60,0x27, 0xf,0x60,0x28, 0xf,0x60,0x29, 0xf,0x5b,0x6e, 0x5,0x68,0x74, 0x7,0x48,0x4f, 0x7,0x48,0x50, 0x4,0x60,0x5e, 0x4,0x60,0x5c, 0x5,0x68,0x73, 0x5,0x70,0x6e, 0x7,0x48,0x52, 0x7,0x48,0x53, 0x7,0x41,0x48, 0x4,0x60,0x5f, 0x4,0x5c,0x58, 0x5,0x68,0x75, 0x7,0x41,0x47, 0x5,0x68,0x72, 0xf,0x63,0x3e, 0x7,0x48,0x51, 0x7,0x48,0x54, 0x7,0x48,0x55, 0xf,0x63,0x3f, 0x7,0x4e,0x77, 0x5,0x6c,0x7e, 0x7,0x4e,0x76, 0xf,0x65,0x6a, 0xf,0x65,0x6b, 0x4,0x66,0x73, 0x4,0x66,0x72, 0x5,0x70,0x6f, 0x7,0x54,0x3d, 0x7,0x54,0x3c, 0xf,0x68,0x2a, 0xf,0x68,0x2b, 0x7,0x54,0x3b, 0x5,0x73,0x77, 0x7,0x58,0x57, 0x5,0x73,0x78, 0x4,0x6a,0x63, 0x4,0x6a,0x64, 0x7,0x5c,0x38, 0xf,0x6a,0x6a, 0x5,0x76,0x38, 0x7,0x5c,0x39, 0x7,0x5f,0x32, 0x5,0x77,0x77, 0x5,0x77,0x76, 0x5,0x79,0x38, 0x7,0x61,0x33, 0x5,0x79,0x37, 0x5,0x79,0x36, 0x7,0x61,0x32, 0x7,0x62,0x4c, 0x4,0x6d,0x5d, 0x5,0x7a,0x32, 0x7,0x62,0x4b, 0x5,0x7a,0x33, 0x7,0x63,0x62, 0x7,0x63,0x61, 0x5,0x7b,0x7d, 0x7,0x66,0x36, 0x5,0x27,0x4f, 0x6,0x2d,0x52, 0x5,0x27,0x50, 0xf,0x28,0x47, 0xf,0x28,0x48, 0x5,0x27,0x51, 0x5,0x2b,0x26, 0x6,0x33,0x62, 0x6,0x33,0x65, 0x5,0x2b,0x24, 0x5,0x2b,0x25, 0x6,0x33,0x67, 0x6,0x33,0x63, 0x5,0x2b,0x27, 0xf,0x2d,0x23, 0x6,0x33,0x68, 0x6,0x3a,0x5b, 0x6,0x3a,0x57, 0x4,0x2e,0x79, 0x6,0x3a,0x63, 0x4,0x2e,0x7b, 0x6,0x3a,0x5d, 0x6,0x3a,0x5c, 0x6,0x3a,0x5f, 0x5,0x2f,0x5a, 0x4,0x2e,0x7a, 0x4,0x2f,0x24, 0x6,0x3a,0x64, 0x6,0x3a,0x59, 0x4,0x2f,0x23, 0x6,0x3a,0x5e, 0x4,0x2f,0x22, 0x6,0x3a,0x60, 0x6,0x3a,0x58, 0x5,0x2f,0x59, 0x6,0x3a,0x61, 0x5,0x2f,0x58, 0x5,0x2f,0x57, 0x6,0x3a,0x5a, 0xf,0x31,0x71, 0xf,0x31,0x72, 0xf,0x31,0x73, 0xf,0x31,0x74, 0xf,0x31,0x75, 0xf,0x31,0x76, 0xf,0x31,0x77, 0x4,0x2f,0x26, 0x6,0x3a,0x62, 0x5,0x34,0x5f, 0x5,0x34,0x5d, 0x4,0x34,0x32, 0x4,0x34,0x28, 0x4,0x34,0x2a, 0x6,0x43,0x28, 0x4,0x34,0x2f, 0x5,0x34,0x5e, 0x4,0x34,0x31, 0x6,0x43,0x29, 0x5,0x34,0x5b, 0x4,0x34,0x2c, 0x6,0x43,0x2b, 0x6,0x43,0x2a, 0x6,0x43,0x25, 0x6,0x43,0x23, 0x6,0x43,0x24, 0x5,0x34,0x5c, 0xf,0x37,0x58, 0xf,0x37,0x59, 0xf,0x37,0x5a, 0xf,0x37,0x5b, 0x6,0x43,0x27, 0x6,0x43,0x2c, 0xf,0x37,0x55, 0x5,0x3b,0x31, 0x5,0x3b,0x30, 0x5,0x3b,0x2e, 0x5,0x3b,0x32, 0x6,0x4c,0x6d, 0x4,0x3a,0x23, 0x6,0x4c,0x66, 0x6,0x4c,0x6c, 0x4,0x3a,0x22, 0x4,0x3a,0x24, 0x6,0x4c,0x6e, 0x6,0x43,0x26, 0x6,0x4c,0x67, 0x6,0x4c,0x70, 0x6,0x4c,0x68, 0x5,0x3b,0x2d, 0x6,0x4c,0x6a, 0x6,0x4c,0x69, 0x6,0x4c,0x6f, 0x5,0x3b,0x2a, 0x5,0x3b,0x29, 0x5,0x3b,0x2b, 0xf,0x3e,0x25, 0xf,0x3e,0x26, 0xf,0x3e,0x27, 0xf,0x3e,0x28, 0xf,0x3e,0x29, 0xf,0x3e,0x2a, 0xf,0x3e,0x2b, 0xf,0x3e,0x2c, 0xf,0x3e,0x2d, 0xf,0x3e,0x2e, 0x6,0x4c,0x6b, 0x5,0x3b,0x2f, 0x6,0x56,0x4b, 0x6,0x56,0x42, 0x5,0x41,0x5f, 0x5,0x41,0x5e, 0x4,0x3f,0x6c, 0x6,0x56,0x44, 0x4,0x3f,0x6d, 0x6,0x56,0x48, 0x6,0x56,0x45, 0x4,0x3f,0x69, 0x5,0x41,0x61, 0x5,0x41,0x60, 0x6,0x56,0x43, 0x6,0x56,0x49, 0x4,0x3a,0x25, 0x4,0x3f,0x6b, 0x6,0x56,0x46, 0x5,0x41,0x62, 0x6,0x56,0x4c, 0x6,0x56,0x4d, 0x4,0x3f,0x72, 0x6,0x56,0x4a, 0xf,0x44,0x57, 0xf,0x44,0x58, 0xf,0x44,0x59, 0xf,0x44,0x5a, 0xf,0x44,0x5b, 0xf,0x44,0x5c, 0xf,0x44,0x5d, 0xf,0x44,0x5e, 0xf,0x44,0x5f, 0xf,0x44,0x60, 0xf,0x44,0x61, 0xf,0x44,0x62, 0x6,0x56,0x47, 0x4,0x3f,0x70, 0x4,0x45,0x78, 0x5,0x48,0x50, 0x4,0x45,0x76, 0x5,0x48,0x52, 0x6,0x60,0x3f, 0x6,0x60,0x3e, 0x5,0x48,0x56, 0x4,0x45,0x7a, 0x5,0x48,0x55, 0x4,0x45,0x77, 0x6,0x60,0x39, 0x6,0x60,0x43, 0x6,0x60,0x42, 0x6,0x60,0x36, 0x4,0x45,0x7d, 0x5,0x48,0x4f, 0x5,0x41,0x63, 0x6,0x60,0x41, 0x5,0x48,0x51, 0x6,0x60,0x3c, 0x6,0x60,0x34, 0x5,0x48,0x53, 0x5,0x48,0x57, 0x6,0x60,0x40, 0x6,0x60,0x3b, 0x4,0x46,0x22, 0x6,0x60,0x38, 0xf,0x4b,0x2e, 0xf,0x4b,0x2f, 0xf,0x4b,0x30, 0xf,0x4b,0x31, 0xf,0x4b,0x32, 0xf,0x4b,0x33, 0xf,0x4b,0x34, 0xf,0x4b,0x35, 0xf,0x4b,0x36, 0xf,0x4b,0x37, 0x6,0x60,0x35, 0x6,0x60,0x37, 0x6,0x60,0x3d, 0x4,0x4c,0x38, 0x4,0x4c,0x43, 0x7,0x26,0x60, 0x4,0x4c,0x42, 0x4,0x4c,0x3b, 0x5,0x4f,0x5b, 0x5,0x4f,0x59, 0x4,0x52,0x48, 0x5,0x4f,0x58, 0x5,0x4f,0x5d, 0x5,0x4f,0x55, 0x4,0x4c,0x46, 0x5,0x4f,0x5a, 0x7,0x26,0x6c, 0x7,0x26,0x5e, 0x7,0x26,0x64, 0x5,0x4f,0x5c, 0x5,0x4f,0x52, 0x7,0x26,0x61, 0x7,0x26,0x66, 0x5,0x4f,0x57, 0x4,0x4c,0x41, 0x4,0x4c,0x39, 0x7,0x26,0x5d, 0x7,0x26,0x65, 0x7,0x26,0x5c, 0x7,0x26,0x67, 0x6,0x60,0x3a, 0x7,0x26,0x6d, 0x7,0x26,0x6b, 0x5,0x4f,0x51, 0x5,0x4f,0x56, 0x5,0x4f,0x5e, 0xf,0x51,0x30, 0xf,0x51,0x31, 0xf,0x51,0x32, 0xf,0x51,0x33, 0xf,0x51,0x34, 0xf,0x51,0x35, 0xf,0x51,0x38, 0xf,0x51,0x39, 0xf,0x51,0x3a, 0xf,0x51,0x3d, 0xf,0x51,0x3e, 0xf,0x51,0x3f, 0x7,0x26,0x62, 0x7,0x26,0x68, 0x7,0x26,0x5f, 0x7,0x26,0x63, 0x7,0x31,0x46, 0x4,0x52,0x46, 0x7,0x31,0x43, 0x7,0x31,0x44, 0x4,0x52,0x4a, 0x7,0x31,0x40, 0x7,0x31,0x3d, 0x5,0x56,0x74, 0x5,0x56,0x76, 0x7,0x31,0x31, 0x7,0x31,0x42, 0x7,0x31,0x32, 0x7,0x3a,0x36, 0x7,0x31,0x33, 0x7,0x31,0x36, 0x5,0x56,0x75, 0x5,0x56,0x77, 0x5,0x56,0x73, 0x5,0x5d,0x45, 0x4,0x52,0x45, 0x5,0x56,0x71, 0x5,0x56,0x72, 0x4,0x52,0x4b, 0x7,0x31,0x3a, 0x7,0x31,0x37, 0x7,0x31,0x38, 0x7,0x31,0x41, 0x4,0x52,0x4d, 0x7,0x31,0x35, 0x5,0x56,0x79, 0x7,0x31,0x34, 0x7,0x31,0x45, 0x7,0x31,0x3b, 0x5,0x56,0x78, 0x7,0x31,0x3f, 0x7,0x31,0x3e, 0x7,0x31,0x39, 0x7,0x31,0x3c, 0xf,0x56,0x76, 0xf,0x56,0x77, 0xf,0x56,0x78, 0xf,0x56,0x79, 0xf,0x56,0x7a, 0xf,0x56,0x7b, 0xf,0x56,0x7c, 0xf,0x56,0x7d, 0xf,0x56,0x7e, 0x7,0x3a,0x44, 0x7,0x3a,0x43, 0x5,0x5d,0x43, 0x5,0x5d,0x40, 0x4,0x57,0x71, 0x7,0x3a,0x37, 0x5,0x5d,0x41, 0x7,0x3a,0x42, 0x4,0x57,0x6f, 0x7,0x3a,0x3a, 0x5,0x5d,0x44, 0x5,0x5d,0x3e, 0x7,0x3a,0x3e, 0x7,0x3a,0x3b, 0x7,0x3a,0x3c, 0x7,0x3a,0x40, 0x5,0x5d,0x42, 0x7,0x3a,0x41, 0x7,0x3a,0x3d, 0x5,0x5d,0x47, 0xf,0x5b,0x73, 0xf,0x5b,0x74, 0xf,0x5b,0x75, 0xf,0x5b,0x77, 0xf,0x5b,0x78, 0xf,0x5b,0x79, 0xf,0x5b,0x7a, 0xf,0x5b,0x7b, 0xf,0x5b,0x7c, 0xf,0x5b,0x7d, 0xf,0x5b,0x7e, 0xf,0x5c,0x21, 0xf,0x5c,0x22, 0x7,0x3a,0x3f, 0x7,0x3a,0x38, 0x4,0x5c,0x64, 0x4,0x5c,0x5c, 0x7,0x41,0x4e, 0x4,0x5c,0x63, 0x4,0x5c,0x5d, 0x7,0x41,0x4d, 0x7,0x41,0x54, 0x4,0x5c,0x61, 0x4,0x57,0x70, 0x7,0x41,0x49, 0x5,0x63,0x55, 0x5,0x63,0x58, 0x5,0x63,0x57, 0x7,0x41,0x4b, 0x7,0x41,0x51, 0x5,0x63,0x56, 0x7,0x41,0x4a, 0x7,0x41,0x4f, 0x7,0x41,0x52, 0x7,0x41,0x4c, 0x7,0x41,0x57, 0x7,0x41,0x55, 0x7,0x41,0x50, 0x7,0x41,0x5b, 0x5,0x63,0x5a, 0x7,0x41,0x56, 0xf,0x60,0x2a, 0xf,0x60,0x2b, 0xf,0x60,0x2c, 0xf,0x60,0x2d, 0xf,0x60,0x2e, 0xf,0x60,0x2f, 0xf,0x60,0x30, 0xf,0x60,0x31, 0xf,0x60,0x32, 0x5,0x63,0x59, 0x7,0x41,0x5c, 0x7,0x41,0x5a, 0x7,0x41,0x58, 0x7,0x41,0x53, 0x4,0x60,0x64, 0x4,0x60,0x65, 0x7,0x48,0x5f, 0x4,0x60,0x69, 0x7,0x48,0x67, 0x5,0x68,0x76, 0x7,0x48,0x64, 0x4,0x60,0x67, 0x7,0x48,0x66, 0x4,0x60,0x6b, 0x5,0x68,0x79, 0x4,0x60,0x60, 0x5,0x68,0x7a, 0x7,0x48,0x61, 0x7,0x47,0x4b, 0x4,0x60,0x61, 0x7,0x48,0x5d, 0x5,0x68,0x77, 0x7,0x48,0x63, 0x7,0x48,0x5b, 0x7,0x48,0x62, 0x5,0x68,0x78, 0x7,0x48,0x59, 0x7,0x48,0x5a, 0x7,0x48,0x60, 0x7,0x48,0x5e, 0xf,0x63,0x40, 0xf,0x63,0x41, 0xf,0x63,0x43, 0xf,0x63,0x44, 0xf,0x63,0x45, 0x7,0x4a,0x73, 0x7,0x48,0x5c, 0x7,0x48,0x65, 0x4,0x60,0x6a, 0x7,0x4e,0x7d, 0x7,0x4e,0x7c, 0x5,0x6d,0x23, 0x5,0x6d,0x21, 0x4,0x64,0x25, 0x7,0x4e,0x7e, 0x7,0x4f,0x23, 0x7,0x4e,0x7b, 0x7,0x54,0x42, 0x7,0x48,0x58, 0x5,0x6d,0x24, 0x7,0x4f,0x24, 0x7,0x4f,0x26, 0x7,0x4e,0x7a, 0x4,0x66,0x79, 0x7,0x4f,0x22, 0x7,0x4e,0x79, 0x7,0x4f,0x25, 0xf,0x65,0x6c, 0xf,0x65,0x6d, 0xf,0x65,0x6e, 0xf,0x65,0x70, 0xf,0x65,0x71, 0x7,0x4f,0x21, 0x5,0x70,0x72, 0x4,0x66,0x75, 0x7,0x54,0x43, 0x5,0x70,0x73, 0x4,0x66,0x78, 0x4,0x66,0x76, 0x4,0x66,0x77, 0x7,0x58,0x5e, 0x7,0x4f,0x27, 0x7,0x54,0x3f, 0x7,0x54,0x3e, 0x7,0x54,0x41, 0xf,0x68,0x2c, 0xf,0x68,0x2d, 0xf,0x68,0x2e, 0xf,0x68,0x2f, 0x4,0x66,0x74, 0x7,0x54,0x40, 0x5,0x70,0x71, 0x7,0x54,0x44, 0x5,0x73,0x7b, 0x7,0x58,0x59, 0x5,0x73,0x7c, 0x5,0x73,0x79, 0x4,0x69,0x29, 0x5,0x76,0x3a, 0x7,0x58,0x5d, 0x5,0x73,0x7a, 0x7,0x58,0x5b, 0xf,0x69,0x63, 0xf,0x69,0x64, 0xf,0x69,0x65, 0xf,0x69,0x66, 0x7,0x58,0x5a, 0x7,0x58,0x5c, 0x4,0x69,0x4b, 0x4,0x6a,0x67, 0x7,0x58,0x5f, 0x7,0x5c,0x3a, 0x7,0x5c,0x3b, 0x4,0x6a,0x68, 0x4,0x6a,0x69, 0x4,0x6b,0x7a, 0x5,0x77,0x78, 0x7,0x5f,0x37, 0x7,0x5f,0x35, 0xf,0x6b,0x5d, 0x7,0x5f,0x36, 0x7,0x5f,0x38, 0x5,0x79,0x3a, 0x7,0x5f,0x34, 0x5,0x79,0x39, 0x7,0x61,0x34, 0x7,0x62,0x4f, 0x7,0x62,0x4e, 0x7,0x63,0x63, 0xf,0x6c,0x69, 0x7,0x63,0x65, 0x7,0x63,0x64, 0x7,0x64,0x55, 0x5,0x7b,0x65, 0xf,0x6d,0x30, 0x7,0x65,0x75, 0x6,0x25,0x42, 0x4,0x2a,0x78, 0x5,0x2b,0x28, 0x4,0x2f,0x28, 0x6,0x3a,0x66, 0x5,0x2f,0x5b, 0x5,0x34,0x61, 0x6,0x43,0x2d, 0x5,0x3b,0x34, 0x6,0x43,0x2f, 0x6,0x43,0x2e, 0x6,0x4c,0x74, 0x4,0x3a,0x29, 0x6,0x4c,0x73, 0x5,0x3b,0x33, 0xf,0x3e,0x2f, 0x6,0x56,0x50, 0x6,0x56,0x4f, 0x4,0x3f,0x74, 0x4,0x46,0x24, 0x6,0x60,0x45, 0x5,0x48,0x58, 0x6,0x60,0x44, 0x7,0x26,0x6e, 0xf,0x4b,0x39, 0xf,0x4b,0x3a, 0xf,0x4b,0x3b, 0x7,0x26,0x70, 0x4,0x4c,0x47, 0xf,0x51,0x40, 0xf,0x51,0x41, 0x7,0x26,0x6f, 0x5,0x56,0x7b, 0x5,0x56,0x7a, 0xf,0x57,0x22, 0xf,0x57,0x21, 0x5,0x5d,0x49, 0x7,0x3a,0x45, 0x5,0x5d,0x48, 0xf,0x5a,0x58, 0xf,0x5c,0x23, 0xf,0x5c,0x24, 0x7,0x41,0x5d, 0x7,0x41,0x5e, 0xf,0x60,0x33, 0x7,0x48,0x68, 0x4,0x60,0x6c, 0xf,0x63,0x46, 0x5,0x70,0x74, 0x4,0x64,0x27, 0x4,0x66,0x7a, 0x7,0x54,0x45, 0x4,0x6a,0x6a, 0x7,0x5c,0x3c, 0xf,0x6a,0x6b, 0x7,0x5f,0x3a, 0x7,0x5f,0x39, 0x5,0x7a,0x34, 0x7,0x66,0x2a, 0x6,0x22,0x29, 0x6,0x22,0x28, 0x4,0x24,0x6a, 0x6,0x25,0x44, 0x6,0x25,0x45, 0x6,0x28,0x73, 0xf,0x21,0x7c, 0x6,0x25,0x43, 0xf,0x25,0x28, 0xf,0x25,0x2a, 0x6,0x2d,0x53, 0x6,0x33,0x6a, 0x4,0x27,0x5d, 0x6,0x33,0x69, 0x6,0x2d,0x54, 0x4,0x27,0x5e, 0x6,0x28,0x74, 0x4,0x24,0x6b, 0x6,0x33,0x6b, 0x4,0x2a,0x7a, 0x4,0x2a,0x7c, 0xf,0x25,0x56, 0x5,0x2b,0x29, 0xf,0x28,0x49, 0x5,0x27,0x52, 0x6,0x3a,0x67, 0x6,0x3a,0x68, 0x6,0x3a,0x69, 0x5,0x2f,0x5f, 0x6,0x3a,0x6c, 0x6,0x3a,0x6a, 0x4,0x2f,0x2c, 0x4,0x2f,0x2b, 0x6,0x33,0x6e, 0x6,0x33,0x6c, 0x6,0x33,0x6f, 0x6,0x43,0x35, 0xf,0x29,0x39, 0x5,0x2f,0x5d, 0x6,0x43,0x30, 0x6,0x43,0x31, 0x6,0x43,0x32, 0x6,0x43,0x34, 0x6,0x43,0x36, 0xf,0x31,0x79, 0x6,0x33,0x6d, 0x6,0x36,0x7a, 0x5,0x2b,0x2a, 0x4,0x2a,0x7d, 0x6,0x43,0x33, 0x6,0x4c,0x77, 0x6,0x43,0x37, 0x6,0x3a,0x6d, 0x6,0x4c,0x76, 0x6,0x43,0x38, 0x5,0x2f,0x5e, 0x5,0x34,0x62, 0xf,0x37,0x5c, 0x6,0x4c,0x75, 0x5,0x3b,0x36, 0x5,0x3b,0x35, 0x4,0x3a,0x2c, 0x6,0x4c,0x78, 0xf,0x3e,0x30, 0x6,0x56,0x52, 0x5,0x41,0x67, 0x6,0x56,0x54, 0x6,0x4c,0x7a, 0x5,0x41,0x64, 0x5,0x41,0x66, 0x6,0x56,0x53, 0x6,0x56,0x55, 0x6,0x4c,0x79, 0x6,0x56,0x56, 0xf,0x3e,0x31, 0x6,0x56,0x51, 0xf,0x44,0x63, 0x6,0x60,0x46, 0x6,0x60,0x48, 0x6,0x60,0x49, 0x6,0x60,0x4a, 0x6,0x60,0x4b, 0x6,0x60,0x4c, 0x6,0x60,0x4d, 0x6,0x60,0x50, 0x5,0x48,0x5b, 0x7,0x26,0x75, 0x6,0x60,0x4e, 0x5,0x48,0x5a, 0x6,0x56,0x57, 0x5,0x48,0x59, 0x6,0x60,0x4f, 0x6,0x60,0x47, 0xf,0x4b,0x3c, 0x7,0x26,0x71, 0x7,0x26,0x72, 0x7,0x26,0x73, 0x7,0x26,0x74, 0x5,0x4f,0x62, 0x5,0x4f,0x5f, 0x6,0x60,0x52, 0x7,0x26,0x76, 0x5,0x4f,0x60, 0x5,0x4f,0x61, 0x6,0x60,0x51, 0xf,0x51,0x42, 0xf,0x51,0x43, 0x7,0x25,0x73, 0x7,0x31,0x47, 0x7,0x31,0x48, 0x7,0x31,0x4c, 0x7,0x31,0x49, 0x5,0x56,0x7c, 0x7,0x31,0x4b, 0x4,0x52,0x51, 0x7,0x3a,0x4e, 0x7,0x31,0x4a, 0x7,0x31,0x4d, 0x5,0x4f,0x63, 0x5,0x56,0x7d, 0x4,0x52,0x50, 0x7,0x26,0x77, 0x7,0x26,0x78, 0x7,0x3a,0x47, 0x7,0x3a,0x48, 0x7,0x3a,0x4b, 0x5,0x5d,0x4a, 0x7,0x31,0x4e, 0x4,0x57,0x74, 0x5,0x63,0x5b, 0x7,0x3a,0x4c, 0x7,0x3a,0x4d, 0xf,0x5c,0x25, 0xf,0x57,0x23, 0x7,0x41,0x5f, 0x7,0x41,0x60, 0x7,0x41,0x62, 0x7,0x41,0x64, 0x4,0x5c,0x67, 0x4,0x5c,0x66, 0x5,0x63,0x5c, 0x7,0x41,0x63, 0x7,0x48,0x69, 0x7,0x3a,0x4a, 0x5,0x63,0x5e, 0x5,0x68,0x7b, 0x7,0x48,0x6c, 0x4,0x60,0x6e, 0x7,0x48,0x6a, 0x7,0x48,0x6b, 0x7,0x4f,0x28, 0x7,0x4f,0x29, 0x7,0x4f,0x2a, 0x7,0x4f,0x2b, 0x5,0x6d,0x25, 0x5,0x6d,0x27, 0x7,0x4f,0x2c, 0x5,0x6d,0x26, 0x5,0x6d,0x28, 0x7,0x54,0x46, 0x7,0x4f,0x2d, 0x5,0x77,0x7a, 0x4,0x6b,0x7c, 0x7,0x5f,0x3b, 0x5,0x77,0x7b, 0x5,0x77,0x79, 0x7,0x61,0x35, 0x7,0x62,0x50, 0x7,0x63,0x66, 0x7,0x64,0x56, 0x7,0x65,0x3c, 0x4,0x24,0x6c, 0x4,0x23,0x2c, 0xf,0x21,0x60, 0x6,0x2d,0x56, 0x5,0x27,0x53, 0x6,0x2d,0x55, 0xf,0x2d,0x24, 0x6,0x33,0x71, 0x6,0x33,0x70, 0x4,0x2a,0x7e, 0xf,0x28,0x4b, 0x6,0x3a,0x6e, 0x6,0x3a,0x6f, 0x6,0x43,0x3b, 0x6,0x3a,0x73, 0x6,0x3a,0x72, 0x6,0x3a,0x71, 0x6,0x3a,0x70, 0x6,0x43,0x3a, 0xf,0x31,0x7a, 0xf,0x31,0x7b, 0x6,0x43,0x3d, 0x5,0x34,0x64, 0x4,0x3a,0x2e, 0x6,0x43,0x3e, 0x4,0x34,0x39, 0x5,0x34,0x65, 0xf,0x37,0x5d, 0x5,0x34,0x63, 0x6,0x43,0x39, 0xf,0x37,0x5e, 0xf,0x37,0x5f, 0x6,0x43,0x3f, 0x5,0x3b,0x39, 0x5,0x3b,0x37, 0x6,0x4c,0x7d, 0x4,0x3a,0x2f, 0x6,0x4d,0x21, 0x5,0x3b,0x38, 0x6,0x4c,0x7e, 0x6,0x4c,0x7c, 0x6,0x4d,0x22, 0x6,0x47,0x21, 0x6,0x56,0x5a, 0x5,0x41,0x68, 0x6,0x56,0x5b, 0x6,0x56,0x58, 0x5,0x41,0x69, 0x6,0x56,0x59, 0x6,0x56,0x5c, 0x5,0x41,0x6a, 0xf,0x3e,0x33, 0xf,0x3e,0x34, 0x5,0x48,0x5c, 0x6,0x60,0x53, 0x6,0x60,0x55, 0x5,0x48,0x5d, 0x6,0x60,0x54, 0x5,0x4f,0x64, 0x4,0x4c,0x4a, 0x7,0x26,0x7b, 0x7,0x26,0x7c, 0x4,0x4c,0x4b, 0x7,0x31,0x4f, 0x7,0x26,0x7a, 0x4,0x4c,0x48, 0x5,0x57,0x21, 0x5,0x56,0x7e, 0x4,0x52,0x52, 0xf,0x57,0x25, 0x7,0x31,0x50, 0x4,0x57,0x78, 0x4,0x57,0x76, 0x5,0x5d,0x4b, 0x7,0x3a,0x50, 0x7,0x3a,0x4f, 0x7,0x3a,0x52, 0xf,0x5c,0x26, 0x4,0x52,0x54, 0x7,0x3a,0x51, 0x5,0x63,0x5d, 0x4,0x5c,0x69, 0x5,0x63,0x5f, 0x7,0x41,0x69, 0x7,0x41,0x6a, 0x4,0x5c,0x6d, 0x7,0x41,0x67, 0x7,0x41,0x68, 0x7,0x41,0x66, 0xf,0x57,0x24, 0xf,0x60,0x34, 0xf,0x60,0x35, 0x4,0x5c,0x6c, 0x5,0x68,0x7c, 0x7,0x48,0x70, 0x5,0x76,0x3b, 0x7,0x48,0x6f, 0x7,0x4f,0x2e, 0x7,0x48,0x6e, 0x5,0x6d,0x29, 0x7,0x4f,0x2f, 0x7,0x4f,0x30, 0x7,0x4f,0x31, 0x7,0x4f,0x32, 0x7,0x41,0x65, 0x5,0x70,0x75, 0x7,0x54,0x47, 0x7,0x54,0x48, 0x5,0x73,0x7d, 0x7,0x58,0x60, 0x7,0x5c,0x3e, 0x7,0x5c,0x3d, 0x7,0x61,0x36, 0x7,0x63,0x67, 0x7,0x65,0x5e, 0x6,0x2d,0x57, 0x6,0x33,0x75, 0x6,0x33,0x72, 0x6,0x33,0x76, 0x5,0x2b,0x2b, 0x4,0x2b,0x22, 0x4,0x2b,0x21, 0x4,0x2b,0x24, 0x6,0x33,0x74, 0x4,0x2b,0x23, 0xf,0x2d,0x25, 0xf,0x2d,0x26, 0x6,0x33,0x73, 0x4,0x2f,0x33, 0x6,0x3a,0x76, 0x5,0x2f,0x61, 0x5,0x2f,0x63, 0x5,0x2f,0x60, 0x4,0x2f,0x31, 0x4,0x2f,0x36, 0x4,0x2f,0x35, 0x6,0x3a,0x75, 0x5,0x2f,0x62, 0x4,0x2f,0x34, 0x4,0x2f,0x32, 0x6,0x3a,0x77, 0xf,0x2f,0x63, 0xf,0x2f,0x64, 0x4,0x2f,0x37, 0xf,0x31,0x7c, 0x5,0x34,0x66, 0x6,0x43,0x41, 0x6,0x43,0x40, 0x6,0x43,0x42, 0x6,0x43,0x43, 0x6,0x43,0x44, 0x6,0x43,0x46, 0x6,0x43,0x47, 0x4,0x34,0x3f, 0x6,0x43,0x45, 0x5,0x3b,0x3b, 0x4,0x3a,0x32, 0x6,0x4d,0x26, 0x6,0x4d,0x27, 0x6,0x4d,0x2d, 0x5,0x3b,0x3d, 0x4,0x3a,0x36, 0x6,0x4d,0x2e, 0x6,0x4d,0x28, 0x6,0x4d,0x25, 0x6,0x4d,0x2f, 0x6,0x4d,0x30, 0x5,0x3b,0x3c, 0x6,0x4d,0x2a, 0x6,0x4d,0x2c, 0x6,0x4d,0x2b, 0xf,0x3e,0x35, 0xf,0x3e,0x36, 0x6,0x4d,0x29, 0x5,0x41,0x6e, 0x5,0x41,0x6b, 0x4,0x3f,0x79, 0x6,0x56,0x5d, 0x6,0x56,0x5e, 0x6,0x56,0x5f, 0x5,0x41,0x6d, 0x5,0x41,0x6c, 0xf,0x44,0x64, 0x6,0x4d,0x24, 0x5,0x48,0x65, 0x5,0x48,0x5e, 0x6,0x60,0x57, 0x5,0x48,0x5f, 0x5,0x48,0x63, 0x5,0x48,0x60, 0x5,0x48,0x64, 0x5,0x48,0x61, 0x5,0x48,0x62, 0x6,0x60,0x56, 0x5,0x48,0x66, 0xf,0x4b,0x3d, 0xf,0x4b,0x3e, 0xf,0x4b,0x3f, 0xf,0x4b,0x40, 0x5,0x4f,0x6a, 0x5,0x4f,0x6b, 0x7,0x26,0x7e, 0x5,0x4f,0x68, 0x4,0x4c,0x4c, 0x5,0x4f,0x6c, 0x5,0x4f,0x65, 0x7,0x26,0x7d, 0x5,0x4f,0x67, 0xf,0x51,0x46, 0x6,0x60,0x59, 0x5,0x4f,0x66, 0x7,0x27,0x24, 0x7,0x27,0x25, 0x7,0x27,0x21, 0x4,0x4c,0x4e, 0x7,0x27,0x22, 0x4,0x4c,0x4d, 0x7,0x27,0x23, 0xf,0x51,0x44, 0xf,0x51,0x45, 0x7,0x31,0x51, 0x7,0x31,0x53, 0x5,0x57,0x25, 0x7,0x31,0x56, 0x7,0x31,0x52, 0x7,0x31,0x54, 0x4,0x52,0x57, 0x5,0x57,0x23, 0x5,0x57,0x26, 0x5,0x57,0x24, 0x5,0x4f,0x69, 0x5,0x57,0x22, 0x7,0x31,0x55, 0x5,0x57,0x27, 0xf,0x57,0x26, 0x4,0x57,0x79, 0x7,0x3a,0x54, 0x5,0x5d,0x4c, 0x7,0x3a,0x55, 0x7,0x48,0x71, 0x5,0x5d,0x4d, 0x7,0x3a,0x53, 0xf,0x5c,0x27, 0xf,0x5c,0x28, 0x5,0x63,0x60, 0x4,0x5c,0x6e, 0x7,0x41,0x71, 0x5,0x5d,0x4e, 0x4,0x5c,0x6f, 0x7,0x41,0x6d, 0x7,0x41,0x6f, 0x7,0x41,0x6c, 0x7,0x41,0x70, 0x7,0x41,0x6e, 0xf,0x60,0x36, 0xf,0x60,0x37, 0x7,0x41,0x6b, 0x4,0x60,0x70, 0x5,0x68,0x7e, 0x5,0x68,0x7d, 0x7,0x48,0x72, 0x7,0x4f,0x35, 0x7,0x4f,0x36, 0xf,0x65,0x72, 0x7,0x4f,0x33, 0x4,0x66,0x7c, 0x7,0x54,0x49, 0x7,0x54,0x4b, 0x7,0x4f,0x34, 0x7,0x54,0x4a, 0x7,0x58,0x62, 0x7,0x58,0x63, 0x7,0x58,0x61, 0x6,0x25,0x46, 0x6,0x2d,0x58, 0x6,0x28,0x75, 0x4,0x27,0x5f, 0x4,0x27,0x60, 0x6,0x3a,0x78, 0x4,0x34,0x40, 0x5,0x2b,0x2c, 0xf,0x37,0x60, 0xf,0x37,0x61, 0x6,0x43,0x48, 0x6,0x4d,0x31, 0x7,0x27,0x26, 0x7,0x31,0x58, 0x7,0x31,0x57, 0xf,0x6b,0x5e, 0x6,0x2d,0x59, 0x6,0x2d,0x5a, 0x5,0x21,0x79, 0xf,0x28,0x4c, 0x4,0x2f,0x39, 0x5,0x34,0x67, 0x5,0x3b,0x3e, 0x5,0x41,0x6f, 0x6,0x60,0x5a, 0x7,0x27,0x27, 0x7,0x27,0x29, 0x5,0x48,0x67, 0x7,0x31,0x5a, 0x7,0x31,0x59, 0x7,0x3a,0x56, 0x5,0x23,0x21, 0x6,0x2d,0x5b, 0xf,0x28,0x4d, 0x6,0x33,0x77, 0xf,0x2d,0x27, 0x6,0x33,0x78, 0xf,0x31,0x7e, 0x5,0x34,0x68, 0xf,0x37,0x62, 0x6,0x43,0x49, 0x4,0x3a,0x37, 0x5,0x3b,0x41, 0x5,0x3b,0x40, 0x4,0x3f,0x7b, 0x6,0x56,0x60, 0x6,0x60,0x5c, 0x5,0x48,0x6c, 0x5,0x48,0x68, 0x5,0x48,0x6d, 0x5,0x48,0x6a, 0x5,0x48,0x69, 0x5,0x48,0x6b, 0x4,0x46,0x31, 0xf,0x44,0x65, 0x6,0x60,0x5b, 0x5,0x4f,0x6f, 0x5,0x4f,0x70, 0x5,0x4f,0x71, 0x5,0x4f,0x6d, 0x5,0x4f,0x6e, 0x7,0x27,0x2a, 0x5,0x57,0x29, 0x5,0x57,0x28, 0x4,0x52,0x58, 0x4,0x52,0x59, 0x7,0x31,0x5c, 0x7,0x31,0x5d, 0x7,0x31,0x5b, 0xf,0x51,0x47, 0x5,0x5d,0x4f, 0x4,0x57,0x7c, 0x7,0x3a,0x5a, 0x7,0x3a,0x57, 0x7,0x3a,0x58, 0xf,0x57,0x29, 0x5,0x63,0x61, 0x4,0x57,0x7e, 0x7,0x41,0x72, 0x7,0x3a,0x59, 0x7,0x48,0x75, 0x5,0x63,0x62, 0x7,0x41,0x74, 0x7,0x41,0x73, 0xf,0x5c,0x29, 0xf,0x5c,0x2a, 0x7,0x48,0x74, 0x5,0x69,0x21, 0x7,0x48,0x73, 0x4,0x66,0x7e, 0x7,0x54,0x4c, 0x4,0x6a,0x6c, 0x5,0x77,0x7c, 0x5,0x79,0x3b, 0x5,0x27,0x55, 0x5,0x27,0x54, 0x6,0x2d,0x5e, 0xf,0x28,0x4e, 0xf,0x28,0x4f, 0x6,0x2d,0x5d, 0x5,0x2b,0x2f, 0x5,0x2b,0x2d, 0x5,0x2b,0x2e, 0x4,0x2f,0x3c, 0x6,0x3a,0x7e, 0x4,0x2f,0x3b, 0x6,0x3a,0x7a, 0x5,0x2f,0x64, 0x6,0x3b,0x22, 0xf,0x32,0x21, 0xf,0x32,0x24, 0xf,0x32,0x26, 0xf,0x32,0x27, 0x6,0x3a,0x7b, 0xf,0x32,0x22, 0x6,0x3a,0x7d, 0x6,0x3a,0x7c, 0x6,0x3b,0x23, 0x6,0x3a,0x79, 0xf,0x32,0x25, 0x5,0x2f,0x65, 0x6,0x43,0x4b, 0x4,0x34,0x43, 0x4,0x34,0x42, 0x4,0x34,0x44, 0x6,0x43,0x4d, 0x5,0x34,0x69, 0x6,0x43,0x4f, 0x6,0x43,0x4e, 0x6,0x43,0x4c, 0x6,0x43,0x4a, 0xf,0x37,0x63, 0xf,0x37,0x64, 0xf,0x37,0x65, 0xf,0x37,0x66, 0x5,0x3b,0x42, 0x6,0x4d,0x33, 0x6,0x4d,0x34, 0x5,0x3b,0x43, 0x6,0x4d,0x35, 0xf,0x3e,0x37, 0xf,0x3e,0x38, 0xf,0x3e,0x39, 0xf,0x3e,0x3a, 0xf,0x3e,0x3c, 0xf,0x3e,0x3d, 0xf,0x3e,0x3e, 0xf,0x3e,0x3f, 0xf,0x3e,0x40, 0x6,0x4d,0x32, 0xf,0x3e,0x3b, 0x6,0x56,0x62, 0x6,0x56,0x66, 0x5,0x41,0x71, 0x5,0x41,0x72, 0x6,0x56,0x61, 0x6,0x56,0x6b, 0x6,0x56,0x69, 0x6,0x56,0x67, 0x5,0x41,0x73, 0x6,0x56,0x68, 0x6,0x56,0x64, 0x6,0x56,0x6a, 0x6,0x56,0x63, 0xf,0x44,0x66, 0xf,0x44,0x67, 0x6,0x56,0x65, 0x5,0x48,0x70, 0x5,0x48,0x71, 0x5,0x48,0x6e, 0x4,0x4c,0x50, 0x6,0x60,0x5e, 0x5,0x48,0x72, 0x5,0x48,0x6f, 0x5,0x48,0x73, 0xf,0x4b,0x41, 0xf,0x4b,0x42, 0xf,0x4b,0x43, 0xf,0x4b,0x44, 0xf,0x4b,0x45, 0xf,0x4b,0x46, 0xf,0x4b,0x47, 0xf,0x4b,0x48, 0xf,0x4b,0x4a, 0xf,0x4b,0x4b, 0xf,0x4b,0x4c, 0x6,0x60,0x5f, 0x5,0x4f,0x72, 0x7,0x27,0x2c, 0x5,0x4f,0x75, 0x7,0x27,0x2f, 0x5,0x4f,0x74, 0x5,0x4f,0x73, 0x4,0x4c,0x51, 0x5,0x4f,0x77, 0x7,0x27,0x2b, 0x7,0x27,0x30, 0x5,0x4f,0x76, 0xf,0x51,0x48, 0xf,0x51,0x49, 0xf,0x51,0x4a, 0xf,0x51,0x4b, 0xf,0x51,0x4c, 0xf,0x51,0x4d, 0xf,0x51,0x4e, 0xf,0x51,0x4f, 0x7,0x27,0x2d, 0x5,0x57,0x2c, 0x5,0x57,0x2f, 0x5,0x57,0x2b, 0x5,0x57,0x2d, 0x5,0x57,0x2e, 0x7,0x31,0x61, 0x7,0x31,0x5f, 0x7,0x31,0x5e, 0xf,0x57,0x2a, 0xf,0x57,0x2b, 0xf,0x57,0x2c, 0xf,0x57,0x2d, 0xf,0x57,0x2e, 0xf,0x57,0x2f, 0x7,0x31,0x60, 0x5,0x57,0x2a, 0x5,0x5d,0x50, 0x5,0x5d,0x51, 0x5,0x5d,0x52, 0x7,0x3a,0x5b, 0x4,0x58,0x25, 0x4,0x58,0x26, 0x5,0x5d,0x54, 0x5,0x5d,0x53, 0xf,0x5c,0x2c, 0x7,0x3a,0x5d, 0x7,0x3a,0x5c, 0x3,0x58,0x63, 0x7,0x41,0x77, 0x5,0x63,0x66, 0x5,0x63,0x63, 0x4,0x5c,0x72, 0x7,0x41,0x79, 0x5,0x5d,0x55, 0x7,0x41,0x78, 0x5,0x63,0x64, 0x5,0x63,0x65, 0x7,0x41,0x75, 0xf,0x60,0x38, 0xf,0x60,0x39, 0xf,0x60,0x3a, 0x7,0x41,0x76, 0xf,0x5c,0x2b, 0xf,0x63,0x47, 0x7,0x48,0x76, 0x5,0x69,0x22, 0x5,0x69,0x23, 0x7,0x48,0x78, 0x7,0x48,0x77, 0xf,0x63,0x48, 0xf,0x63,0x49, 0x7,0x4f,0x39, 0xf,0x65,0x73, 0xf,0x65,0x74, 0xf,0x65,0x75, 0x7,0x4f,0x38, 0x7,0x4f,0x37, 0x5,0x70,0x76, 0xf,0x68,0x30, 0xf,0x68,0x31, 0x7,0x54,0x4d, 0x7,0x54,0x4e, 0x5,0x73,0x7e, 0x7,0x58,0x64, 0x4,0x6a,0x6d, 0xf,0x6a,0x6c, 0xf,0x6b,0x5f, 0xf,0x6c,0x36, 0xf,0x6c,0x50, 0x5,0x21,0x7a, 0x6,0x2d,0x5f, 0x5,0x2b,0x30, 0x6,0x43,0x50, 0x6,0x4d,0x36, 0x6,0x48,0x6a, 0x6,0x56,0x6e, 0x6,0x60,0x62, 0x6,0x60,0x61, 0x7,0x27,0x31, 0xf,0x51,0x50, 0x7,0x31,0x62, 0x7,0x4f,0x3a, 0x5,0x23,0x25, 0x5,0x23,0x23, 0x6,0x2d,0x60, 0x6,0x2d,0x61, 0x6,0x25,0x48, 0xf,0x22,0x6c, 0xf,0x22,0x6d, 0x5,0x23,0x24, 0x5,0x23,0x22, 0x5,0x24,0x73, 0x5,0x24,0x72, 0x6,0x28,0x79, 0x6,0x28,0x78, 0x6,0x28,0x77, 0x6,0x28,0x76, 0x6,0x33,0x7b, 0x6,0x33,0x7a, 0x6,0x33,0x79, 0x5,0x27,0x5a, 0x5,0x27,0x5e, 0x6,0x2d,0x64, 0x4,0x2f,0x43, 0x6,0x2d,0x6d, 0x6,0x2d,0x6e, 0x6,0x2d,0x62, 0x5,0x27,0x5d, 0x6,0x2d,0x66, 0x5,0x27,0x59, 0x5,0x27,0x57, 0x6,0x2d,0x6b, 0x5,0x27,0x5b, 0x4,0x27,0x6b, 0x6,0x2d,0x68, 0x6,0x2d,0x6f, 0xf,0x28,0x50, 0xf,0x28,0x51, 0xf,0x28,0x53, 0xf,0x28,0x54, 0x6,0x2d,0x6c, 0x4,0x26,0x64, 0x6,0x2d,0x65, 0x6,0x2d,0x67, 0x5,0x27,0x5c, 0x6,0x2d,0x6a, 0x6,0x2d,0x63, 0x6,0x3b,0x27, 0x6,0x3b,0x25, 0x4,0x2f,0x3d, 0x5,0x27,0x56, 0x6,0x3b,0x26, 0x6,0x34,0x2d, 0x4,0x2b,0x2d, 0x5,0x2b,0x34, 0x6,0x34,0x28, 0x5,0x2b,0x31, 0x5,0x2b,0x38, 0x6,0x34,0x29, 0x4,0x2b,0x2e, 0x6,0x43,0x54, 0x6,0x34,0x27, 0x4,0x2b,0x2b, 0x6,0x34,0x2b, 0x4,0x2b,0x30, 0x6,0x34,0x25, 0x5,0x2b,0x36, 0x6,0x34,0x26, 0x5,0x2b,0x37, 0x5,0x2b,0x32, 0x4,0x2f,0x48, 0x5,0x2b,0x35, 0x6,0x33,0x7c, 0x6,0x34,0x21, 0x6,0x34,0x22, 0x6,0x34,0x24, 0xf,0x2d,0x2a, 0xf,0x2d,0x2f, 0xf,0x37,0x67, 0xf,0x37,0x68, 0x6,0x33,0x7e, 0x6,0x34,0x2f, 0x6,0x34,0x2c, 0x6,0x34,0x2a, 0x6,0x34,0x30, 0x6,0x34,0x2e, 0x6,0x43,0x53, 0x6,0x43,0x52, 0xf,0x2d,0x2b, 0x6,0x43,0x55, 0x6,0x43,0x56, 0x6,0x3b,0x30, 0x6,0x43,0x51, 0xf,0x2d,0x2d, 0x5,0x2f,0x67, 0x4,0x2f,0x3e, 0x4,0x34,0x45, 0x4,0x2f,0x45, 0x6,0x3b,0x32, 0x5,0x2f,0x6c, 0x4,0x2f,0x44, 0x6,0x3b,0x2e, 0x5,0x2f,0x6e, 0x6,0x3b,0x2a, 0x5,0x2f,0x70, 0x5,0x3b,0x44, 0x5,0x2f,0x6f, 0x6,0x3b,0x29, 0x5,0x2f,0x66, 0x6,0x3b,0x2b, 0x4,0x2f,0x40, 0x6,0x4d,0x3b, 0x5,0x2f,0x69, 0xf,0x2d,0x29, 0xf,0x32,0x28, 0xf,0x32,0x29, 0xf,0x32,0x2d, 0xf,0x3e,0x4c, 0x5,0x2f,0x68, 0x5,0x2e,0x24, 0x6,0x3b,0x2f, 0x6,0x3b,0x2d, 0x6,0x3b,0x2c, 0x6,0x3b,0x33, 0x6,0x4d,0x3a, 0x6,0x4d,0x38, 0x6,0x4d,0x39, 0x6,0x4d,0x37, 0x6,0x34,0x23, 0x5,0x2f,0x6b, 0x5,0x2f,0x71, 0x5,0x2f,0x6a, 0x5,0x34,0x74, 0x6,0x43,0x5b, 0x6,0x43,0x59, 0x5,0x34,0x6b, 0x4,0x34,0x4e, 0x5,0x34,0x6c, 0x4,0x2f,0x42, 0x5,0x34,0x71, 0x4,0x34,0x46, 0x4,0x34,0x55, 0x5,0x41,0x74, 0x4,0x34,0x54, 0x6,0x43,0x57, 0x5,0x34,0x6e, 0x6,0x43,0x5f, 0x4,0x34,0x49, 0x5,0x34,0x75, 0x5,0x34,0x76, 0x6,0x43,0x60, 0x6,0x43,0x5e, 0x4,0x34,0x4f, 0x5,0x34,0x72, 0x6,0x43,0x61, 0x6,0x43,0x62, 0xf,0x37,0x69, 0xf,0x37,0x6b, 0x6,0x43,0x5c, 0x6,0x43,0x5d, 0x6,0x56,0x6f, 0x6,0x56,0x70, 0x6,0x56,0x71, 0x5,0x34,0x73, 0x5,0x34,0x6f, 0x5,0x34,0x70, 0x6,0x4d,0x43, 0x5,0x3b,0x48, 0x6,0x4d,0x3d, 0x5,0x3b,0x45, 0x6,0x4d,0x4b, 0x6,0x4d,0x42, 0x4,0x3a,0x3c, 0x5,0x3b,0x4a, 0x6,0x4d,0x4f, 0x6,0x4d,0x3c, 0x6,0x60,0x65, 0x5,0x3b,0x47, 0x6,0x4d,0x50, 0x6,0x56,0x75, 0x4,0x3a,0x48, 0x5,0x3b,0x4c, 0x6,0x4d,0x55, 0x6,0x4d,0x4e, 0x6,0x4d,0x4c, 0x6,0x4d,0x53, 0x5,0x3b,0x46, 0x5,0x48,0x75, 0x6,0x4d,0x3e, 0x6,0x4d,0x47, 0x6,0x4d,0x4a, 0xf,0x3e,0x41, 0xf,0x3e,0x44, 0xf,0x3e,0x46, 0xf,0x3e,0x47, 0xf,0x3e,0x48, 0xf,0x3e,0x49, 0xf,0x3e,0x4a, 0xf,0x3e,0x4b, 0x6,0x4d,0x44, 0x6,0x4d,0x49, 0xf,0x3b,0x63, 0x6,0x4d,0x4d, 0x6,0x4d,0x41, 0x6,0x4d,0x52, 0x6,0x4d,0x3f, 0x6,0x4d,0x40, 0x6,0x60,0x63, 0x6,0x60,0x67, 0x6,0x60,0x64, 0xf,0x3e,0x45, 0x5,0x3b,0x49, 0x6,0x4d,0x46, 0x5,0x34,0x6d, 0x5,0x3b,0x4b, 0x5,0x3b,0x4e, 0x5,0x3b,0x4f, 0x6,0x4d,0x51, 0x5,0x3b,0x51, 0x6,0x4d,0x45, 0x6,0x60,0x68, 0x6,0x60,0x66, 0x5,0x41,0x7d, 0x4,0x40,0x21, 0x5,0x42,0x26, 0x5,0x42,0x21, 0x5,0x41,0x75, 0x5,0x41,0x79, 0x5,0x42,0x27, 0x6,0x56,0x7d, 0x4,0x3f,0x7e, 0x6,0x56,0x72, 0x4,0x3a,0x46, 0x5,0x42,0x22, 0x5,0x41,0x78, 0x6,0x56,0x77, 0x4,0x40,0x24, 0x6,0x56,0x79, 0x4,0x40,0x22, 0x6,0x57,0x21, 0x6,0x56,0x73, 0x5,0x42,0x29, 0x6,0x56,0x74, 0x6,0x56,0x78, 0x5,0x42,0x23, 0x6,0x56,0x7c, 0x5,0x41,0x7b, 0x5,0x41,0x7a, 0x5,0x42,0x25, 0x5,0x42,0x24, 0x6,0x56,0x7a, 0x5,0x41,0x76, 0x6,0x56,0x7e, 0xf,0x44,0x69, 0xf,0x44,0x6a, 0xf,0x44,0x6b, 0xf,0x44,0x6c, 0xf,0x44,0x6d, 0xf,0x44,0x6f, 0xf,0x44,0x71, 0x4,0x40,0x2b, 0x6,0x57,0x23, 0x6,0x57,0x22, 0xf,0x44,0x70, 0x7,0x27,0x32, 0x7,0x27,0x33, 0x6,0x56,0x7b, 0x5,0x41,0x7e, 0x5,0x41,0x7c, 0x4,0x46,0x44, 0x5,0x48,0x7b, 0x4,0x46,0x4c, 0x4,0x46,0x43, 0x5,0x49,0x23, 0x6,0x60,0x6a, 0x5,0x48,0x7a, 0x4,0x46,0x4a, 0x5,0x49,0x24, 0x5,0x49,0x21, 0x4,0x46,0x49, 0x5,0x48,0x77, 0x5,0x48,0x7d, 0x4,0x46,0x3a, 0x4,0x46,0x4b, 0x5,0x48,0x78, 0x6,0x60,0x71, 0x6,0x60,0x6c, 0x5,0x48,0x76, 0x6,0x60,0x6e, 0x5,0x48,0x79, 0x6,0x60,0x6d, 0x5,0x48,0x7c, 0x7,0x31,0x63, 0x5,0x49,0x22, 0x4,0x46,0x48, 0x6,0x60,0x6b, 0xf,0x4b,0x4d, 0xf,0x4b,0x4e, 0xf,0x4b,0x4f, 0xf,0x4b,0x51, 0xf,0x4b,0x52, 0xf,0x4b,0x55, 0xf,0x4b,0x53, 0x6,0x60,0x70, 0x6,0x5d,0x5c, 0x5,0x41,0x77, 0x5,0x48,0x7e, 0x4,0x4c,0x53, 0x5,0x4f,0x7b, 0x7,0x27,0x34, 0x4,0x4c,0x57, 0x7,0x27,0x3b, 0x5,0x4f,0x7a, 0x4,0x4c,0x59, 0x7,0x3a,0x60, 0x7,0x27,0x37, 0x5,0x4f,0x7c, 0x7,0x27,0x35, 0x4,0x4c,0x5a, 0x7,0x3a,0x5e, 0x5,0x4f,0x78, 0x7,0x27,0x38, 0xf,0x51,0x51, 0xf,0x51,0x52, 0xf,0x51,0x53, 0xf,0x51,0x54, 0x7,0x27,0x36, 0x7,0x27,0x39, 0x7,0x27,0x3a, 0x7,0x3a,0x5f, 0x6,0x60,0x69, 0x5,0x4f,0x79, 0xf,0x5c,0x35, 0x7,0x31,0x6c, 0x5,0x57,0x37, 0x5,0x57,0x32, 0x4,0x52,0x68, 0x4,0x52,0x5d, 0x5,0x57,0x31, 0x4,0x52,0x5f, 0x7,0x31,0x67, 0x7,0x31,0x6e, 0x5,0x57,0x35, 0x5,0x57,0x36, 0x4,0x52,0x65, 0x5,0x4f,0x7d, 0x5,0x57,0x34, 0x7,0x31,0x65, 0x7,0x31,0x6d, 0x5,0x57,0x39, 0x7,0x31,0x6a, 0x5,0x69,0x24, 0x4,0x52,0x60, 0x7,0x31,0x6f, 0xf,0x57,0x31, 0xf,0x57,0x33, 0xf,0x57,0x32, 0x7,0x27,0x3c, 0x7,0x31,0x68, 0x7,0x31,0x69, 0x7,0x31,0x64, 0x7,0x31,0x66, 0x7,0x31,0x6b, 0x7,0x41,0x7a, 0x7,0x48,0x79, 0x7,0x41,0x7b, 0x5,0x57,0x3a, 0x5,0x57,0x30, 0x5,0x57,0x3b, 0x5,0x57,0x38, 0x5,0x57,0x33, 0x7,0x42,0x21, 0x5,0x5d,0x5a, 0x5,0x5d,0x59, 0x7,0x3a,0x62, 0x4,0x58,0x2e, 0x4,0x58,0x2a, 0x4,0x58,0x29, 0x5,0x5d,0x58, 0x5,0x5d,0x56, 0x4,0x60,0x71, 0x7,0x48,0x7b, 0x5,0x5d,0x5e, 0x7,0x3a,0x65, 0xf,0x5c,0x2e, 0xf,0x5c,0x2f, 0xf,0x5c,0x31, 0xf,0x5c,0x32, 0xf,0x5c,0x33, 0xf,0x5c,0x34, 0xf,0x5c,0x36, 0xf,0x5c,0x30, 0x7,0x37,0x7e, 0x7,0x3a,0x63, 0x7,0x48,0x7a, 0x7,0x48,0x7d, 0x5,0x5d,0x5d, 0x7,0x3a,0x61, 0x5,0x5d,0x5c, 0x5,0x5d,0x57, 0x7,0x3a,0x64, 0x7,0x48,0x7e, 0x4,0x5c,0x75, 0x5,0x63,0x6a, 0x5,0x63,0x67, 0x5,0x63,0x69, 0x5,0x63,0x6c, 0x7,0x41,0x7c, 0x5,0x63,0x6e, 0x7,0x41,0x7e, 0x5,0x63,0x6b, 0x7,0x42,0x23, 0x5,0x63,0x68, 0x5,0x6d,0x2a, 0x5,0x63,0x6f, 0xf,0x60,0x3b, 0xf,0x60,0x3c, 0xf,0x60,0x3d, 0xf,0x60,0x40, 0xf,0x60,0x41, 0x7,0x41,0x7d, 0x7,0x42,0x6d, 0x4,0x5c,0x73, 0x4,0x60,0x72, 0x7,0x49,0x23, 0x7,0x49,0x29, 0x5,0x69,0x25, 0x5,0x69,0x26, 0x5,0x63,0x6d, 0x7,0x49,0x24, 0xf,0x63,0x4a, 0x7,0x49,0x28, 0x7,0x49,0x2a, 0xf,0x63,0x4c, 0xf,0x63,0x4d, 0x7,0x49,0x22, 0x7,0x49,0x26, 0x7,0x49,0x25, 0x7,0x49,0x27, 0x7,0x49,0x21, 0xf,0x63,0x4b, 0x7,0x49,0x2b, 0x7,0x4f,0x3d, 0x5,0x6d,0x2e, 0x5,0x6d,0x2d, 0x4,0x64,0x2b, 0x4,0x64,0x29, 0x5,0x6d,0x2b, 0xf,0x65,0x76, 0x7,0x4f,0x3c, 0x7,0x4f,0x3b, 0x4,0x67,0x26, 0x7,0x54,0x4f, 0x5,0x70,0x77, 0x7,0x5c,0x40, 0x7,0x55,0x3a, 0x7,0x5c,0x3f, 0x4,0x69,0x31, 0x4,0x69,0x2f, 0x7,0x58,0x65, 0xf,0x68,0x33, 0x7,0x5c,0x41, 0x5,0x76,0x3d, 0x7,0x5c,0x43, 0x7,0x5c,0x45, 0x7,0x5c,0x46, 0x5,0x76,0x3c, 0x7,0x5c,0x42, 0x4,0x6a,0x6e, 0x7,0x5c,0x47, 0x7,0x5c,0x48, 0x7,0x5f,0x3d, 0x5,0x77,0x7d, 0x7,0x5f,0x3e, 0x5,0x79,0x3c, 0x7,0x64,0x57, 0x5,0x7a,0x6f, 0x5,0x7b,0x45, 0x6,0x28,0x7c, 0x4,0x24,0x71, 0xf,0x2a,0x49, 0x6,0x3b,0x34, 0xf,0x32,0x2f, 0x6,0x4d,0x56, 0x6,0x4d,0x57, 0xf,0x4b,0x58, 0xf,0x4b,0x59, 0xf,0x51,0x56, 0x6,0x60,0x73, 0xf,0x5c,0x37, 0x7,0x42,0x25, 0xf,0x60,0x42, 0x5,0x70,0x79, 0xf,0x68,0x34, 0xf,0x69,0x67, 0x7,0x65,0x3d, 0x5,0x7c,0x2c, 0x6,0x25,0x4a, 0x6,0x28,0x7e, 0x4,0x24,0x72, 0x6,0x28,0x7d, 0x6,0x2d,0x70, 0x5,0x2b,0x3a, 0x6,0x34,0x32, 0xf,0x2d,0x30, 0x5,0x2f,0x72, 0x6,0x3b,0x36, 0x4,0x2f,0x49, 0xf,0x32,0x30, 0x6,0x3b,0x37, 0x6,0x3b,0x35, 0x6,0x43,0x66, 0x6,0x43,0x65, 0xf,0x37,0x6d, 0xf,0x37,0x6e, 0x6,0x4d,0x59, 0x6,0x4d,0x5a, 0x6,0x57,0x24, 0x5,0x49,0x25, 0xf,0x4b,0x5a, 0x4,0x4c,0x60, 0x4,0x4c,0x61, 0x5,0x4f,0x7e, 0xf,0x51,0x57, 0x7,0x27,0x3d, 0x4,0x52,0x69, 0x5,0x57,0x3c, 0x7,0x3a,0x66, 0x5,0x5d,0x60, 0x5,0x5d,0x5f, 0xf,0x5c,0x38, 0xf,0x60,0x43, 0x5,0x69,0x27, 0x4,0x60,0x75, 0x5,0x6d,0x31, 0xf,0x63,0x4e, 0x7,0x49,0x2c, 0x5,0x6d,0x2f, 0x5,0x6d,0x30, 0x7,0x62,0x51, 0x6,0x29,0x21, 0x6,0x2d,0x71, 0x6,0x2d,0x72, 0x6,0x3b,0x3a, 0xf,0x2d,0x31, 0x6,0x3b,0x38, 0x6,0x3b,0x39, 0x5,0x34,0x77, 0x4,0x34,0x56, 0x6,0x4d,0x5b, 0x5,0x42,0x2a, 0x5,0x49,0x26, 0xf,0x4b,0x5b, 0x5,0x50,0x21, 0x7,0x27,0x3e, 0xf,0x51,0x58, 0x5,0x50,0x22, 0x7,0x31,0x71, 0x4,0x52,0x6a, 0x5,0x57,0x3d, 0xf,0x57,0x34, 0x4,0x58,0x2f, 0x5,0x63,0x70, 0x5,0x63,0x71, 0x4,0x24,0x74, 0x6,0x25,0x4b, 0x6,0x23,0x64, 0x6,0x2d,0x73, 0x6,0x2d,0x74, 0xf,0x2d,0x32, 0x4,0x2f,0x4b, 0x6,0x34,0x33, 0x6,0x3b,0x3b, 0x6,0x3b,0x41, 0x6,0x3b,0x3d, 0x6,0x3b,0x3c, 0x4,0x2f,0x4c, 0x6,0x3b,0x3f, 0x6,0x3b,0x40, 0x6,0x43,0x69, 0x5,0x34,0x78, 0x6,0x3b,0x3e, 0x6,0x43,0x68, 0x6,0x43,0x6b, 0x6,0x43,0x6a, 0x5,0x3b,0x52, 0x6,0x4d,0x5c, 0x5,0x3b,0x53, 0x5,0x49,0x27, 0x6,0x57,0x28, 0x6,0x57,0x27, 0x6,0x57,0x25, 0x6,0x60,0x74, 0x6,0x60,0x7a, 0x6,0x60,0x75, 0x6,0x60,0x76, 0x5,0x50,0x23, 0x7,0x27,0x3f, 0x6,0x60,0x77, 0x6,0x60,0x7b, 0x6,0x60,0x78, 0x7,0x27,0x40, 0x7,0x27,0x41, 0x7,0x27,0x42, 0x6,0x60,0x79, 0x5,0x49,0x28, 0x5,0x50,0x24, 0x5,0x50,0x25, 0x7,0x27,0x43, 0x7,0x27,0x44, 0x7,0x31,0x72, 0x7,0x27,0x45, 0x7,0x27,0x46, 0xf,0x57,0x35, 0x7,0x31,0x74, 0x7,0x31,0x73, 0x5,0x5d,0x62, 0x7,0x31,0x77, 0x7,0x31,0x76, 0x7,0x31,0x75, 0x5,0x5d,0x61, 0x5,0x5d,0x64, 0x7,0x3a,0x67, 0x7,0x42,0x28, 0x7,0x42,0x27, 0x5,0x5d,0x65, 0x4,0x5c,0x77, 0x7,0x42,0x26, 0xf,0x60,0x44, 0xf,0x60,0x45, 0x7,0x49,0x2d, 0x5,0x63,0x73, 0x5,0x63,0x72, 0x7,0x49,0x2e, 0x7,0x4f,0x3f, 0x5,0x69,0x28, 0x5,0x6d,0x33, 0x5,0x6d,0x34, 0x5,0x6d,0x35, 0x7,0x4f,0x3e, 0x7,0x49,0x2f, 0xf,0x63,0x4f, 0x5,0x69,0x29, 0x7,0x4f,0x40, 0x7,0x4f,0x41, 0x5,0x70,0x7a, 0xf,0x65,0x78, 0xf,0x68,0x35, 0xf,0x68,0x37, 0x7,0x58,0x66, 0xf,0x68,0x36, 0x7,0x58,0x67, 0x7,0x5c,0x49, 0x5,0x77,0x7e, 0x7,0x61,0x37, 0x5,0x79,0x3d, 0x5,0x79,0x3f, 0x5,0x79,0x3e, 0xf,0x6c,0x6a, 0x7,0x65,0x3e, 0x7,0x65,0x3f, 0x7,0x66,0x53, 0x5,0x7c,0x50, 0xf,0x25,0x2b, 0x6,0x34,0x34, 0x4,0x2f,0x4e, 0x4,0x2f,0x4d, 0x6,0x3b,0x42, 0x6,0x3b,0x43, 0x6,0x3b,0x44, 0x5,0x2f,0x73, 0x5,0x2f,0x74, 0x6,0x43,0x6c, 0x6,0x43,0x6d, 0x6,0x41,0x7d, 0x6,0x4d,0x60, 0x6,0x4d,0x5f, 0x6,0x4d,0x61, 0xf,0x3e,0x50, 0x5,0x49,0x29, 0x4,0x46,0x4d, 0x5,0x45,0x53, 0x4,0x46,0x4e, 0x6,0x57,0x29, 0xf,0x4b,0x5c, 0x6,0x60,0x7c, 0x6,0x60,0x7e, 0x6,0x60,0x7d, 0x7,0x27,0x47, 0xf,0x51,0x59, 0x7,0x27,0x49, 0x7,0x27,0x48, 0x7,0x31,0x78, 0x5,0x57,0x3e, 0x7,0x31,0x79, 0x7,0x3a,0x68, 0xf,0x60,0x46, 0x5,0x63,0x74, 0x7,0x42,0x2a, 0x7,0x42,0x29, 0x5,0x6d,0x36, 0x5,0x70,0x7b, 0x7,0x5c,0x4a, 0x5,0x76,0x3e, 0x5,0x50,0x26, 0x5,0x50,0x27, 0xf,0x60,0x47, 0x7,0x4f,0x42, 0x7,0x5c,0x4b, 0x7,0x5f,0x3f, 0x7,0x61,0x39, 0x5,0x7a,0x70, 0x5,0x24,0x74, 0x4,0x27,0x71, 0x4,0x27,0x70, 0x6,0x2d,0x77, 0x6,0x2d,0x76, 0x6,0x2d,0x75, 0x5,0x27,0x5f, 0x4,0x2b,0x31, 0x4,0x2b,0x35, 0x4,0x2b,0x34, 0x6,0x34,0x35, 0x6,0x34,0x37, 0x6,0x34,0x36, 0x6,0x3b,0x4a, 0x5,0x2f,0x75, 0x6,0x3b,0x49, 0x6,0x3b,0x45, 0x5,0x2f,0x76, 0x4,0x2f,0x52, 0x4,0x2f,0x51, 0x6,0x3b,0x46, 0x6,0x3b,0x47, 0x6,0x3b,0x48, 0x5,0x34,0x7a, 0x4,0x34,0x59, 0x4,0x34,0x5b, 0x6,0x43,0x72, 0x5,0x34,0x7b, 0x6,0x43,0x6e, 0x6,0x43,0x6f, 0xf,0x37,0x71, 0x5,0x34,0x79, 0xf,0x37,0x70, 0xf,0x37,0x72, 0x5,0x3b,0x54, 0x6,0x4d,0x65, 0x6,0x4d,0x64, 0x4,0x34,0x5a, 0x4,0x3a,0x52, 0x4,0x3a,0x50, 0x4,0x3a,0x51, 0x4,0x3a,0x53, 0x6,0x4d,0x66, 0x5,0x42,0x2b, 0x6,0x57,0x2c, 0x5,0x42,0x2c, 0x6,0x57,0x2a, 0xf,0x44,0x72, 0x6,0x57,0x2b, 0x6,0x57,0x2d, 0x6,0x57,0x2e, 0x5,0x42,0x2e, 0x6,0x61,0x27, 0x5,0x49,0x2d, 0x5,0x49,0x2b, 0x4,0x46,0x52, 0x6,0x61,0x22, 0x6,0x61,0x26, 0xf,0x4b,0x5e, 0xf,0x4b,0x5f, 0xf,0x4b,0x5d, 0x6,0x61,0x23, 0x5,0x49,0x2a, 0x5,0x50,0x2f, 0x4,0x4c,0x67, 0x4,0x4c,0x66, 0x5,0x50,0x2e, 0x5,0x50,0x2b, 0x5,0x50,0x2c, 0x5,0x50,0x30, 0x5,0x50,0x28, 0x7,0x27,0x4f, 0x7,0x27,0x4d, 0x5,0x50,0x31, 0x7,0x27,0x4a, 0x7,0x27,0x4c, 0x7,0x27,0x4e, 0x7,0x27,0x4b, 0x5,0x50,0x2d, 0x5,0x50,0x29, 0x5,0x50,0x2a, 0x5,0x57,0x42, 0x5,0x57,0x3f, 0x5,0x57,0x43, 0x7,0x31,0x7c, 0x5,0x57,0x40, 0x7,0x32,0x21, 0x7,0x31,0x7d, 0x7,0x32,0x23, 0x5,0x57,0x41, 0x7,0x32,0x22, 0xf,0x57,0x36, 0x7,0x31,0x7e, 0x7,0x31,0x7b, 0x7,0x3a,0x6a, 0x4,0x58,0x31, 0x5,0x5d,0x6c, 0x5,0x5d,0x66, 0x5,0x5d,0x69, 0x5,0x5d,0x68, 0x5,0x5d,0x6a, 0x5,0x5d,0x6b, 0x4,0x5c,0x79, 0x5,0x63,0x7b, 0x7,0x42,0x2c, 0x5,0x63,0x75, 0x5,0x63,0x7a, 0x5,0x63,0x7d, 0x5,0x63,0x79, 0x4,0x5c,0x7a, 0x4,0x5c,0x7b, 0x5,0x63,0x76, 0x5,0x63,0x77, 0x5,0x63,0x7c, 0x4,0x5c,0x78, 0x7,0x42,0x2d, 0x7,0x42,0x2b, 0x5,0x63,0x78, 0x7,0x49,0x30, 0x5,0x69,0x2d, 0x5,0x69,0x2c, 0x5,0x69,0x2b, 0x5,0x69,0x2a, 0x7,0x49,0x31, 0xf,0x63,0x50, 0x7,0x49,0x32, 0x5,0x6d,0x37, 0x7,0x4f,0x43, 0x5,0x70,0x7d, 0x5,0x70,0x7c, 0x7,0x54,0x52, 0x5,0x74,0x21, 0x5,0x74,0x22, 0x4,0x69,0x32, 0x7,0x58,0x68, 0x7,0x54,0x50, 0x7,0x54,0x51, 0x4,0x6a,0x6f, 0x7,0x5c,0x4c, 0x7,0x61,0x3b, 0x7,0x61,0x3a, 0x7,0x62,0x52, 0x5,0x7a,0x71, 0x4,0x6e,0x4f, 0x6,0x34,0x38, 0xf,0x37,0x73, 0x5,0x3b,0x3f, 0xf,0x3e,0x51, 0xf,0x51,0x5a, 0xf,0x5c,0x39, 0x7,0x4f,0x44, 0x5,0x34,0x7c, 0x5,0x34,0x7d, 0x6,0x43,0x73, 0x5,0x34,0x7e, 0xf,0x3e,0x52, 0x6,0x57,0x2f, 0x6,0x57,0x30, 0x6,0x57,0x31, 0x6,0x61,0x29, 0xf,0x4b,0x60, 0x6,0x61,0x2a, 0x6,0x61,0x28, 0x7,0x27,0x51, 0x7,0x27,0x50, 0x7,0x27,0x52, 0xf,0x51,0x5b, 0xf,0x51,0x5c, 0xf,0x51,0x5d, 0x5,0x57,0x44, 0x5,0x57,0x45, 0x7,0x32,0x25, 0x7,0x32,0x24, 0x5,0x6d,0x39, 0x5,0x6d,0x38, 0x7,0x4f,0x45, 0xf,0x6c,0x37, 0x5,0x21,0x7b, 0x6,0x23,0x38, 0x4,0x23,0x2e, 0x6,0x25,0x50, 0x6,0x25,0x51, 0x6,0x2d,0x78, 0x6,0x25,0x4e, 0x5,0x23,0x26, 0x6,0x25,0x4d, 0xf,0x22,0x6f, 0xf,0x22,0x70, 0xf,0x22,0x6e, 0x6,0x25,0x4c, 0x4,0x24,0x77, 0x4,0x24,0x78, 0x4,0x24,0x7c, 0x6,0x29,0x22, 0x4,0x24,0x7a, 0x6,0x29,0x25, 0x6,0x29,0x23, 0x6,0x29,0x24, 0x6,0x29,0x26, 0xf,0x25,0x2c, 0xf,0x25,0x2d, 0xf,0x25,0x2e, 0xf,0x25,0x2f, 0xf,0x25,0x30, 0xf,0x25,0x31, 0x6,0x2d,0x7b, 0x4,0x27,0x7c, 0x4,0x27,0x77, 0x4,0x27,0x79, 0x5,0x27,0x62, 0x4,0x27,0x7d, 0x4,0x27,0x78, 0x4,0x27,0x75, 0x5,0x27,0x60, 0x6,0x2d,0x7c, 0x5,0x27,0x61, 0x4,0x27,0x74, 0x6,0x3b,0x4b, 0x6,0x27,0x4c, 0x6,0x2e,0x21, 0x5,0x27,0x64, 0x4,0x27,0x76, 0x6,0x2d,0x7a, 0x6,0x2d,0x7e, 0x6,0x3b,0x4d, 0x6,0x3b,0x4c, 0xf,0x28,0x57, 0xf,0x28,0x58, 0xf,0x28,0x59, 0xf,0x28,0x5a, 0xf,0x28,0x5b, 0xf,0x28,0x5d, 0xf,0x28,0x5e, 0xf,0x28,0x5f, 0xf,0x28,0x60, 0xf,0x28,0x61, 0xf,0x28,0x62, 0xf,0x28,0x64, 0x6,0x2d,0x79, 0x4,0x2b,0x3b, 0x4,0x2b,0x37, 0x4,0x2b,0x38, 0x4,0x2b,0x39, 0x5,0x2b,0x3f, 0x6,0x34,0x43, 0x6,0x34,0x3b, 0x4,0x2b,0x3c, 0x6,0x34,0x41, 0x6,0x34,0x3d, 0x5,0x2b,0x3d, 0x6,0x34,0x39, 0x6,0x34,0x40, 0x6,0x34,0x3e, 0x6,0x34,0x42, 0x6,0x34,0x45, 0x6,0x34,0x46, 0x5,0x2b,0x3b, 0x5,0x2b,0x3e, 0x5,0x2b,0x3c, 0xf,0x2d,0x33, 0xf,0x2d,0x35, 0xf,0x2d,0x37, 0xf,0x2d,0x38, 0xf,0x2d,0x39, 0xf,0x2d,0x3a, 0xf,0x2d,0x3b, 0xf,0x2d,0x3c, 0xf,0x2d,0x36, 0x6,0x33,0x3e, 0x6,0x34,0x3f, 0xf,0x2d,0x34, 0x6,0x2d,0x7d, 0x6,0x4d,0x68, 0xf,0x2a,0x52, 0x5,0x2f,0x7c, 0x4,0x2f,0x56, 0x4,0x2f,0x57, 0x4,0x2f,0x62, 0x5,0x2f,0x78, 0x5,0x2f,0x7a, 0x5,0x2f,0x7e, 0x4,0x2f,0x54, 0x5,0x2f,0x77, 0x5,0x30,0x23, 0x4,0x2f,0x5b, 0x5,0x30,0x27, 0x4,0x2f,0x58, 0x4,0x2f,0x65, 0x5,0x30,0x24, 0x4,0x2f,0x60, 0x6,0x3b,0x5e, 0x6,0x3b,0x5f, 0x5,0x30,0x25, 0x6,0x3b,0x61, 0x5,0x30,0x22, 0x4,0x2f,0x66, 0x6,0x3b,0x59, 0x6,0x3b,0x58, 0x6,0x4d,0x67, 0x6,0x44,0x22, 0x6,0x3b,0x55, 0x5,0x2f,0x7d, 0x6,0x3b,0x54, 0x6,0x3b,0x51, 0x6,0x3b,0x4f, 0x6,0x3b,0x5a, 0x6,0x3b,0x5c, 0x5,0x2f,0x7b, 0x6,0x3b,0x57, 0x5,0x30,0x26, 0x5,0x2f,0x79, 0x6,0x3b,0x53, 0x6,0x3b,0x5b, 0x6,0x3b,0x5d, 0x6,0x3b,0x62, 0xf,0x32,0x33, 0xf,0x32,0x35, 0xf,0x32,0x36, 0xf,0x32,0x37, 0xf,0x32,0x38, 0xf,0x32,0x39, 0xf,0x32,0x3b, 0xf,0x32,0x3c, 0xf,0x32,0x3d, 0xf,0x32,0x3f, 0xf,0x32,0x40, 0xf,0x32,0x42, 0xf,0x32,0x43, 0xf,0x32,0x44, 0xf,0x32,0x45, 0xf,0x32,0x47, 0xf,0x32,0x48, 0xf,0x32,0x49, 0xf,0x32,0x4a, 0xf,0x32,0x4b, 0x6,0x3b,0x50, 0xf,0x32,0x46, 0xf,0x32,0x4c, 0xf,0x32,0x3e, 0x5,0x35,0x2b, 0x5,0x35,0x2e, 0x5,0x35,0x27, 0x4,0x34,0x70, 0x5,0x35,0x2c, 0x4,0x34,0x61, 0x4,0x34,0x6e, 0x4,0x34,0x68, 0x6,0x44,0x32, 0x4,0x34,0x72, 0x4,0x34,0x75, 0x6,0x44,0x26, 0x6,0x43,0x7b, 0x6,0x44,0x23, 0x5,0x35,0x23, 0x6,0x43,0x79, 0x6,0x43,0x75, 0x4,0x34,0x60, 0x5,0x35,0x32, 0x6,0x43,0x74, 0x6,0x44,0x21, 0x6,0x44,0x38, 0x4,0x34,0x64, 0x6,0x44,0x36, 0x6,0x4e,0x3a, 0x6,0x44,0x34, 0x6,0x3b,0x60, 0x6,0x4d,0x78, 0x4,0x34,0x5f, 0x5,0x35,0x21, 0x4,0x34,0x6b, 0x6,0x43,0x77, 0x6,0x44,0x24, 0x5,0x35,0x30, 0x6,0x44,0x2f, 0x6,0x44,0x35, 0x6,0x44,0x2e, 0x6,0x44,0x29, 0x5,0x35,0x2f, 0x6,0x44,0x33, 0x6,0x43,0x78, 0x6,0x44,0x27, 0x5,0x35,0x31, 0x5,0x42,0x2f, 0x6,0x57,0x32, 0x6,0x57,0x33, 0x6,0x44,0x30, 0x6,0x44,0x31, 0x6,0x43,0x7e, 0x5,0x35,0x22, 0x5,0x35,0x33, 0x6,0x44,0x2a, 0x5,0x35,0x29, 0x5,0x35,0x2d, 0x5,0x35,0x26, 0x6,0x4e,0x37, 0x6,0x44,0x39, 0x6,0x44,0x3a, 0x6,0x43,0x7c, 0x6,0x43,0x7a, 0xf,0x37,0x74, 0xf,0x37,0x75, 0xf,0x37,0x76, 0xf,0x37,0x77, 0xf,0x37,0x79, 0xf,0x37,0x7b, 0xf,0x37,0x7c, 0xf,0x37,0x7d, 0xf,0x37,0x7e, 0xf,0x38,0x21, 0xf,0x38,0x22, 0xf,0x38,0x24, 0xf,0x38,0x25, 0xf,0x38,0x26, 0xf,0x38,0x27, 0xf,0x38,0x28, 0xf,0x38,0x29, 0xf,0x38,0x2a, 0xf,0x38,0x2b, 0xf,0x38,0x2c, 0xf,0x38,0x2d, 0xf,0x38,0x2e, 0xf,0x38,0x2f, 0xf,0x38,0x30, 0xf,0x38,0x31, 0xf,0x38,0x32, 0xf,0x38,0x33, 0xf,0x38,0x34, 0xf,0x38,0x35, 0x5,0x3b,0x5d, 0x6,0x43,0x7d, 0x5,0x35,0x28, 0x6,0x44,0x25, 0xf,0x37,0x7a, 0x6,0x44,0x2d, 0x6,0x44,0x37, 0xf,0x38,0x23, 0x5,0x35,0x25, 0x5,0x3b,0x55, 0x4,0x3a,0x55, 0x5,0x3b,0x69, 0x5,0x3b,0x6a, 0x5,0x3b,0x62, 0x5,0x3b,0x6c, 0x5,0x3b,0x6d, 0x5,0x3b,0x63, 0x4,0x3a,0x5d, 0x6,0x4d,0x7a, 0x6,0x4d,0x72, 0x6,0x4e,0x2b, 0x6,0x4d,0x70, 0x6,0x4d,0x6b, 0x5,0x3b,0x5f, 0x5,0x3b,0x67, 0x5,0x3b,0x68, 0x6,0x4d,0x7b, 0x6,0x4d,0x79, 0x5,0x3b,0x5e, 0x5,0x3b,0x6e, 0x5,0x3b,0x6b, 0x4,0x34,0x6a, 0x4,0x3a,0x57, 0x4,0x3a,0x5a, 0x4,0x3a,0x58, 0x4,0x3a,0x62, 0x5,0x3b,0x5a, 0x4,0x3a,0x54, 0x6,0x4d,0x69, 0x6,0x4e,0x35, 0x4,0x3a,0x63, 0x6,0x4d,0x6a, 0x5,0x3b,0x64, 0x6,0x4d,0x7c, 0x6,0x4e,0x36, 0x6,0x4d,0x7d, 0x6,0x4e,0x2f, 0x6,0x4e,0x30, 0x4,0x3a,0x6b, 0x6,0x4e,0x26, 0x4,0x3a,0x69, 0x6,0x4e,0x23, 0x5,0x3b,0x5c, 0x6,0x4e,0x28, 0x6,0x4d,0x75, 0x6,0x4e,0x2d, 0x6,0x4d,0x74, 0x6,0x4e,0x22, 0x6,0x4e,0x31, 0x6,0x4e,0x29, 0x5,0x3b,0x65, 0x6,0x61,0x32, 0x6,0x61,0x2d, 0x6,0x61,0x2e, 0x5,0x3b,0x57, 0x6,0x4e,0x24, 0x6,0x4d,0x6f, 0x6,0x4e,0x2e, 0x5,0x49,0x2e, 0x6,0x4d,0x73, 0x6,0x4e,0x2c, 0x6,0x4d,0x77, 0x6,0x4e,0x25, 0x6,0x4d,0x6d, 0x6,0x4e,0x2a, 0x4,0x3a,0x6a, 0x5,0x3b,0x60, 0x5,0x3b,0x5b, 0x6,0x4d,0x76, 0x6,0x4e,0x38, 0x6,0x61,0x2b, 0x5,0x3b,0x66, 0x6,0x61,0x2f, 0x5,0x3b,0x61, 0x6,0x4e,0x34, 0x6,0x61,0x31, 0x6,0x61,0x30, 0x6,0x4d,0x6c, 0x6,0x4d,0x7e, 0x6,0x4c,0x7b, 0x5,0x3b,0x58, 0x6,0x4d,0x6e, 0x6,0x4d,0x71, 0x6,0x4e,0x33, 0x6,0x4e,0x39, 0xf,0x3e,0x53, 0xf,0x3e,0x55, 0xf,0x3e,0x56, 0xf,0x3e,0x58, 0xf,0x3e,0x5a, 0xf,0x3e,0x5b, 0xf,0x3e,0x5c, 0xf,0x3e,0x5d, 0xf,0x3e,0x5e, 0xf,0x3e,0x5f, 0xf,0x3e,0x60, 0xf,0x3e,0x61, 0xf,0x3e,0x63, 0xf,0x3e,0x64, 0xf,0x3e,0x65, 0xf,0x3e,0x68, 0xf,0x3e,0x69, 0xf,0x3e,0x6a, 0xf,0x3e,0x6d, 0xf,0x3e,0x6f, 0xf,0x3e,0x70, 0xf,0x3e,0x71, 0xf,0x3e,0x72, 0xf,0x3e,0x74, 0xf,0x3e,0x75, 0xf,0x3e,0x76, 0xf,0x3e,0x77, 0xf,0x3e,0x78, 0xf,0x3e,0x79, 0xf,0x3e,0x7a, 0xf,0x3e,0x7b, 0xf,0x3e,0x7c, 0xf,0x3e,0x7d, 0xf,0x3e,0x7e, 0x6,0x61,0x2c, 0x5,0x3b,0x59, 0x6,0x4e,0x21, 0xf,0x3e,0x62, 0xf,0x3e,0x54, 0xf,0x3e,0x6e, 0xf,0x3e,0x73, 0x4,0x40,0x43, 0x6,0x57,0x34, 0x6,0x57,0x46, 0x5,0x42,0x4e, 0x6,0x57,0x3a, 0x6,0x57,0x3b, 0x5,0x42,0x34, 0x4,0x40,0x3d, 0x6,0x57,0x49, 0x6,0x57,0x5a, 0x4,0x40,0x40, 0x4,0x40,0x42, 0x5,0x42,0x45, 0x6,0x57,0x5e, 0x5,0x42,0x3a, 0x4,0x40,0x37, 0x4,0x40,0x34, 0x6,0x57,0x41, 0x6,0x57,0x63, 0x5,0x42,0x33, 0x6,0x57,0x51, 0x6,0x57,0x55, 0x5,0x42,0x43, 0x6,0x57,0x4a, 0x4,0x40,0x38, 0x4,0x40,0x3b, 0x5,0x42,0x36, 0x6,0x57,0x43, 0x4,0x40,0x3c, 0x4,0x40,0x45, 0x5,0x42,0x41, 0x4,0x40,0x4d, 0x5,0x42,0x4f, 0x4,0x40,0x3e, 0x5,0x42,0x46, 0x6,0x57,0x5d, 0x5,0x42,0x3f, 0x4,0x40,0x33, 0x4,0x40,0x31, 0x6,0x57,0x65, 0x4,0x40,0x3f, 0x6,0x57,0x42, 0x5,0x42,0x48, 0x5,0x42,0x42, 0x5,0x42,0x38, 0x5,0x42,0x3e, 0x6,0x57,0x38, 0x6,0x57,0x53, 0x6,0x57,0x4f, 0x6,0x57,0x40, 0x6,0x57,0x67, 0x5,0x42,0x3d, 0x6,0x57,0x39, 0x6,0x57,0x64, 0x6,0x57,0x37, 0x5,0x42,0x50, 0x6,0x57,0x4e, 0x6,0x57,0x45, 0x6,0x57,0x3c, 0x5,0x42,0x49, 0x5,0x42,0x4d, 0x5,0x42,0x3b, 0x5,0x42,0x47, 0x6,0x57,0x52, 0x6,0x57,0x60, 0x6,0x57,0x5c, 0x6,0x57,0x48, 0x6,0x57,0x56, 0x5,0x42,0x39, 0x4,0x40,0x39, 0x6,0x57,0x57, 0x5,0x42,0x30, 0x5,0x42,0x40, 0x5,0x42,0x32, 0x5,0x42,0x4a, 0x6,0x57,0x3f, 0x4,0x40,0x35, 0x4,0x40,0x4b, 0x6,0x57,0x4c, 0x5,0x42,0x35, 0x5,0x42,0x31, 0x6,0x57,0x47, 0x6,0x57,0x58, 0x7,0x27,0x53, 0x6,0x57,0x61, 0x5,0x42,0x3c, 0x6,0x57,0x44, 0x6,0x57,0x54, 0x6,0x57,0x36, 0x6,0x57,0x62, 0x6,0x57,0x66, 0x6,0x57,0x59, 0x4,0x40,0x4e, 0x5,0x42,0x44, 0x5,0x42,0x4b, 0x6,0x57,0x35, 0x6,0x57,0x3e, 0x6,0x57,0x4b, 0x6,0x57,0x4d, 0x6,0x57,0x5b, 0x6,0x57,0x5f, 0xf,0x44,0x73, 0xf,0x44,0x75, 0xf,0x44,0x76, 0xf,0x44,0x77, 0xf,0x44,0x78, 0xf,0x44,0x79, 0xf,0x44,0x7a, 0xf,0x44,0x7b, 0xf,0x44,0x7c, 0xf,0x44,0x7d, 0xf,0x44,0x7e, 0xf,0x45,0x21, 0xf,0x45,0x22, 0xf,0x45,0x23, 0xf,0x45,0x24, 0xf,0x45,0x25, 0xf,0x45,0x26, 0xf,0x45,0x27, 0xf,0x45,0x28, 0xf,0x45,0x29, 0xf,0x45,0x2a, 0xf,0x45,0x2b, 0xf,0x45,0x2c, 0xf,0x45,0x2e, 0xf,0x45,0x2f, 0xf,0x45,0x30, 0xf,0x45,0x31, 0x5,0x42,0x4c, 0x4,0x40,0x4a, 0x6,0x57,0x3d, 0x6,0x4e,0x32, 0xf,0x3e,0x57, 0x5,0x42,0x37, 0x4,0x46,0x66, 0x6,0x61,0x60, 0x5,0x49,0x45, 0x6,0x61,0x33, 0x6,0x61,0x43, 0x5,0x49,0x4b, 0x4,0x46,0x63, 0x6,0x61,0x56, 0x4,0x46,0x56, 0x6,0x61,0x45, 0x4,0x46,0x59, 0x6,0x61,0x3c, 0x5,0x49,0x41, 0x6,0x61,0x4a, 0x4,0x46,0x55, 0x6,0x61,0x52, 0x5,0x49,0x3d, 0x6,0x61,0x40, 0x6,0x61,0x59, 0x5,0x49,0x49, 0x5,0x49,0x46, 0x6,0x61,0x4c, 0x5,0x49,0x3a, 0x4,0x46,0x5a, 0x6,0x61,0x39, 0x6,0x61,0x55, 0x6,0x61,0x4d, 0x6,0x61,0x3f, 0x5,0x49,0x44, 0x5,0x49,0x39, 0x5,0x49,0x30, 0x4,0x46,0x62, 0x6,0x61,0x41, 0x4,0x46,0x5e, 0x6,0x61,0x36, 0x4,0x46,0x5d, 0x4,0x46,0x6b, 0x4,0x46,0x5b, 0x5,0x49,0x3f, 0x7,0x27,0x58, 0x6,0x61,0x37, 0x5,0x49,0x32, 0x5,0x49,0x37, 0x5,0x49,0x31, 0x5,0x49,0x48, 0x5,0x50,0x3b, 0x4,0x46,0x5f, 0x5,0x49,0x43, 0x6,0x61,0x38, 0x4,0x46,0x68, 0x6,0x61,0x50, 0x5,0x49,0x38, 0x6,0x61,0x57, 0x6,0x61,0x46, 0x6,0x61,0x3b, 0x5,0x49,0x40, 0x5,0x49,0x36, 0x7,0x32,0x27, 0x5,0x49,0x2f, 0x5,0x49,0x34, 0x6,0x61,0x47, 0x6,0x61,0x49, 0x6,0x61,0x4b, 0x6,0x61,0x4e, 0x6,0x61,0x5a, 0x6,0x61,0x5d, 0x6,0x61,0x5e, 0xf,0x4b,0x61, 0xf,0x4b,0x62, 0xf,0x4b,0x63, 0xf,0x4b,0x66, 0xf,0x4b,0x68, 0xf,0x4b,0x69, 0xf,0x4b,0x6a, 0xf,0x4b,0x6b, 0xf,0x4b,0x6c, 0xf,0x4b,0x6d, 0xf,0x4b,0x6e, 0xf,0x4b,0x6f, 0xf,0x4b,0x70, 0xf,0x4b,0x71, 0xf,0x4b,0x72, 0xf,0x4b,0x73, 0xf,0x4b,0x74, 0xf,0x4b,0x75, 0xf,0x4b,0x76, 0xf,0x4b,0x78, 0xf,0x4b,0x79, 0xf,0x4b,0x7a, 0xf,0x4b,0x7c, 0xf,0x4b,0x7d, 0xf,0x4b,0x7e, 0xf,0x4c,0x21, 0xf,0x4c,0x22, 0xf,0x4c,0x23, 0xf,0x4c,0x25, 0xf,0x4c,0x26, 0xf,0x4c,0x27, 0xf,0x4c,0x28, 0xf,0x4c,0x29, 0xf,0x4c,0x2a, 0x6,0x61,0x48, 0x5,0x49,0x42, 0x6,0x61,0x53, 0x6,0x61,0x51, 0x6,0x57,0x68, 0x5,0x49,0x4a, 0x6,0x61,0x5c, 0x6,0x61,0x5f, 0x6,0x61,0x5b, 0x6,0x61,0x3a, 0x6,0x61,0x35, 0x6,0x61,0x42, 0x6,0x61,0x3d, 0x6,0x57,0x50, 0xf,0x4b,0x64, 0xf,0x4b,0x67, 0x6,0x61,0x54, 0x4,0x46,0x6a, 0x4,0x46,0x54, 0x5,0x49,0x35, 0x5,0x49,0x4d, 0x7,0x32,0x26, 0x5,0x49,0x33, 0x6,0x61,0x61, 0x5,0x49,0x47, 0x5,0x49,0x4c, 0x5,0x57,0x46, 0xf,0x4b,0x7b, 0x5,0x49,0x3e, 0x7,0x27,0x6c, 0x4,0x4c,0x7e, 0x5,0x50,0x32, 0x4,0x4c,0x69, 0x4,0x4c,0x7c, 0x7,0x28,0x21, 0x5,0x50,0x35, 0x7,0x28,0x24, 0x7,0x27,0x77, 0x7,0x27,0x5c, 0x5,0x50,0x39, 0x7,0x27,0x69, 0x7,0x27,0x78, 0x7,0x27,0x79, 0x7,0x27,0x6a, 0x7,0x27,0x73, 0x5,0x50,0x3a, 0x7,0x27,0x6f, 0x4,0x4c,0x75, 0x5,0x50,0x3d, 0x5,0x50,0x42, 0x7,0x27,0x60, 0x7,0x28,0x22, 0x5,0x50,0x40, 0x5,0x50,0x3f, 0x5,0x57,0x47, 0x5,0x50,0x41, 0x5,0x50,0x4b, 0x7,0x27,0x6b, 0x7,0x27,0x76, 0x7,0x27,0x59, 0x7,0x27,0x72, 0x7,0x27,0x65, 0x5,0x50,0x48, 0x5,0x50,0x37, 0x4,0x4c,0x7b, 0x7,0x27,0x54, 0x7,0x27,0x5b, 0x7,0x27,0x64, 0x7,0x27,0x63, 0x7,0x27,0x67, 0x5,0x50,0x33, 0x7,0x27,0x66, 0x7,0x27,0x7d, 0x7,0x27,0x5e, 0x5,0x50,0x3e, 0x7,0x27,0x56, 0x5,0x50,0x34, 0x5,0x50,0x4a, 0x7,0x27,0x7c, 0x7,0x27,0x62, 0x7,0x27,0x5d, 0x7,0x27,0x6e, 0x4,0x4c,0x76, 0x5,0x50,0x49, 0x5,0x50,0x45, 0x7,0x27,0x74, 0x5,0x57,0x58, 0x4,0x4d,0x22, 0x5,0x50,0x43, 0x7,0x27,0x55, 0x7,0x27,0x5a, 0x7,0x27,0x5f, 0x7,0x27,0x70, 0x7,0x27,0x71, 0x7,0x28,0x23, 0xf,0x51,0x5e, 0xf,0x51,0x5f, 0xf,0x51,0x60, 0xf,0x51,0x62, 0xf,0x51,0x63, 0xf,0x51,0x66, 0xf,0x51,0x67, 0xf,0x51,0x68, 0xf,0x51,0x69, 0xf,0x51,0x6a, 0xf,0x51,0x6c, 0xf,0x51,0x6d, 0xf,0x51,0x6e, 0xf,0x51,0x6f, 0xf,0x51,0x70, 0xf,0x51,0x72, 0xf,0x51,0x75, 0xf,0x51,0x77, 0x4,0x4d,0x23, 0x7,0x27,0x7a, 0x5,0x50,0x44, 0x7,0x27,0x7e, 0x7,0x27,0x75, 0x7,0x27,0x68, 0xf,0x51,0x71, 0xf,0x51,0x61, 0xf,0x51,0x6b, 0x5,0x50,0x36, 0x7,0x27,0x57, 0x5,0x50,0x47, 0x5,0x50,0x3c, 0x6,0x61,0x34, 0x7,0x42,0x2e, 0xf,0x4c,0x24, 0x7,0x32,0x51, 0x4,0x53,0x2d, 0x7,0x32,0x32, 0x4,0x53,0x2a, 0x4,0x53,0x34, 0x7,0x32,0x53, 0x5,0x57,0x49, 0x4,0x53,0x2b, 0x5,0x57,0x5d, 0x7,0x32,0x43, 0x5,0x57,0x54, 0x4,0x52,0x71, 0x4,0x53,0x30, 0x5,0x57,0x51, 0x5,0x57,0x5b, 0x7,0x32,0x3c, 0x4,0x52,0x75, 0x5,0x57,0x5a, 0x5,0x57,0x4b, 0x5,0x57,0x5f, 0x7,0x32,0x33, 0x5,0x57,0x61, 0x4,0x53,0x2f, 0x7,0x32,0x28, 0x5,0x57,0x4d, 0x5,0x57,0x4f, 0x7,0x32,0x4c, 0x5,0x57,0x55, 0x5,0x57,0x62, 0x7,0x32,0x3d, 0x7,0x32,0x3b, 0x5,0x50,0x4c, 0x4,0x52,0x70, 0x5,0x57,0x48, 0x5,0x57,0x5e, 0x7,0x32,0x45, 0x7,0x32,0x4b, 0x7,0x32,0x41, 0x5,0x57,0x64, 0x5,0x57,0x60, 0x7,0x28,0x25, 0x7,0x27,0x7b, 0x7,0x32,0x52, 0x5,0x5d,0x7a, 0x4,0x53,0x26, 0x7,0x32,0x2e, 0x4,0x53,0x29, 0x7,0x32,0x36, 0x5,0x57,0x53, 0x4,0x53,0x28, 0x4,0x52,0x74, 0x5,0x50,0x38, 0x7,0x32,0x2f, 0x5,0x57,0x52, 0x7,0x32,0x38, 0x5,0x57,0x56, 0x5,0x57,0x4c, 0x7,0x32,0x2d, 0x7,0x32,0x57, 0x7,0x32,0x4e, 0x4,0x53,0x2e, 0x5,0x57,0x5c, 0x7,0x32,0x2a, 0x4,0x52,0x78, 0x7,0x32,0x39, 0x7,0x42,0x2f, 0x7,0x32,0x2b, 0x7,0x32,0x55, 0x4,0x53,0x32, 0x7,0x32,0x42, 0x7,0x32,0x35, 0x7,0x32,0x3f, 0xf,0x57,0x3e, 0xf,0x57,0x3f, 0xf,0x57,0x40, 0xf,0x57,0x41, 0x5,0x57,0x4a, 0x5,0x57,0x50, 0x5,0x57,0x57, 0x7,0x32,0x2c, 0x7,0x32,0x34, 0x7,0x32,0x37, 0x7,0x32,0x3e, 0x7,0x32,0x40, 0x7,0x32,0x47, 0x7,0x32,0x49, 0x7,0x32,0x4d, 0x7,0x32,0x4f, 0x7,0x32,0x54, 0x7,0x32,0x59, 0x7,0x32,0x5a, 0xf,0x57,0x37, 0xf,0x57,0x38, 0xf,0x57,0x39, 0xf,0x57,0x3a, 0xf,0x57,0x3b, 0xf,0x57,0x3c, 0xf,0x57,0x3d, 0xf,0x57,0x42, 0xf,0x57,0x43, 0xf,0x57,0x44, 0xf,0x57,0x49, 0xf,0x57,0x4c, 0xf,0x57,0x4d, 0xf,0x57,0x4e, 0xf,0x57,0x4f, 0xf,0x57,0x50, 0xf,0x57,0x51, 0xf,0x57,0x52, 0xf,0x57,0x53, 0xf,0x57,0x54, 0xf,0x57,0x56, 0xf,0x57,0x57, 0xf,0x57,0x58, 0xf,0x57,0x59, 0xf,0x57,0x5a, 0xf,0x57,0x5b, 0xf,0x57,0x5c, 0x7,0x32,0x31, 0xf,0x57,0x45, 0x4,0x52,0x7d, 0x7,0x32,0x3a, 0x7,0x32,0x58, 0x7,0x32,0x50, 0x5,0x57,0x65, 0x5,0x57,0x4e, 0x7,0x32,0x30, 0x7,0x32,0x29, 0x7,0x32,0x48, 0xf,0x57,0x4a, 0x7,0x32,0x56, 0x5,0x57,0x63, 0x5,0x57,0x59, 0x7,0x32,0x46, 0x7,0x3a,0x76, 0x4,0x58,0x3a, 0x4,0x58,0x3f, 0x7,0x3a,0x6e, 0x7,0x42,0x3b, 0x7,0x3a,0x78, 0x4,0x58,0x48, 0x4,0x58,0x49, 0x5,0x57,0x66, 0x5,0x5d,0x75, 0x5,0x5d,0x7d, 0x5,0x5d,0x73, 0x7,0x3b,0x2b, 0x7,0x3b,0x2f, 0x5,0x5d,0x6f, 0x4,0x58,0x4a, 0x4,0x58,0x37, 0x7,0x3a,0x7b, 0x4,0x58,0x45, 0x5,0x5e,0x21, 0x7,0x3a,0x7c, 0x7,0x3b,0x23, 0x7,0x3b,0x33, 0x5,0x5d,0x7e, 0x5,0x5e,0x25, 0x7,0x3b,0x31, 0x5,0x5e,0x22, 0x5,0x5d,0x6e, 0x5,0x5d,0x78, 0x7,0x3a,0x7e, 0x5,0x5d,0x7c, 0x7,0x3a,0x73, 0x7,0x3b,0x24, 0x7,0x3b,0x2a, 0x5,0x5d,0x7b, 0x4,0x58,0x4b, 0x5,0x5d,0x6d, 0x5,0x5e,0x23, 0x4,0x58,0x41, 0x7,0x3b,0x30, 0x5,0x5d,0x77, 0x4,0x58,0x46, 0x5,0x5d,0x71, 0x5,0x5e,0x24, 0x7,0x3b,0x25, 0x5,0x5d,0x76, 0x7,0x3a,0x70, 0x7,0x3a,0x75, 0x7,0x42,0x39, 0x7,0x3a,0x6b, 0x7,0x3a,0x6c, 0x7,0x3b,0x35, 0x7,0x3a,0x7d, 0x4,0x58,0x47, 0x7,0x3b,0x2e, 0x7,0x3a,0x72, 0x7,0x3a,0x77, 0x7,0x49,0x34, 0x7,0x3a,0x71, 0x7,0x3b,0x22, 0x7,0x3b,0x29, 0x7,0x32,0x4a, 0x7,0x3a,0x79, 0x7,0x3b,0x21, 0x7,0x3b,0x37, 0x5,0x5d,0x74, 0x5,0x50,0x4d, 0x4,0x58,0x43, 0x7,0x49,0x35, 0x5,0x5d,0x70, 0x5,0x5d,0x72, 0x7,0x3a,0x6d, 0x7,0x3b,0x27, 0x7,0x3b,0x28, 0x7,0x3b,0x2c, 0x7,0x3b,0x34, 0xf,0x5c,0x3a, 0xf,0x5c,0x3b, 0xf,0x5c,0x3c, 0xf,0x5c,0x3d, 0xf,0x5c,0x3e, 0xf,0x5c,0x40, 0xf,0x5c,0x41, 0xf,0x5c,0x42, 0xf,0x5c,0x43, 0xf,0x5c,0x44, 0xf,0x5c,0x45, 0xf,0x5c,0x46, 0xf,0x5c,0x47, 0xf,0x5c,0x49, 0xf,0x5c,0x4a, 0xf,0x5c,0x4b, 0xf,0x5c,0x4c, 0xf,0x5c,0x4f, 0xf,0x5c,0x50, 0x4,0x58,0x39, 0x7,0x3a,0x7a, 0x7,0x3b,0x2d, 0x7,0x3b,0x36, 0x7,0x3a,0x74, 0xf,0x5c,0x48, 0xf,0x5c,0x3f, 0xf,0x5c,0x4e, 0xf,0x57,0x55, 0xf,0x63,0x5b, 0x5,0x64,0x2c, 0x7,0x42,0x4b, 0x4,0x5d,0x24, 0x7,0x42,0x4c, 0x5,0x64,0x22, 0x4,0x5d,0x25, 0x5,0x5e,0x26, 0x5,0x64,0x2f, 0x7,0x42,0x48, 0x5,0x64,0x25, 0x5,0x63,0x7e, 0x7,0x42,0x30, 0x5,0x64,0x21, 0x5,0x64,0x29, 0x5,0x64,0x36, 0x5,0x64,0x39, 0x7,0x42,0x36, 0x5,0x64,0x33, 0x7,0x42,0x46, 0x4,0x5d,0x22, 0x5,0x5e,0x27, 0x5,0x64,0x38, 0x5,0x64,0x26, 0x5,0x64,0x30, 0x7,0x42,0x3d, 0x5,0x64,0x24, 0x5,0x64,0x2e, 0x7,0x42,0x4d, 0x4,0x5d,0x30, 0x5,0x64,0x31, 0x4,0x5d,0x2e, 0x4,0x5d,0x26, 0x4,0x5d,0x2a, 0x5,0x64,0x34, 0x5,0x64,0x32, 0x7,0x42,0x3e, 0x7,0x4f,0x46, 0x7,0x42,0x3a, 0x7,0x42,0x37, 0x4,0x5d,0x2f, 0x7,0x49,0x44, 0x5,0x64,0x2b, 0x7,0x42,0x33, 0x7,0x42,0x45, 0x7,0x42,0x49, 0x4,0x5d,0x2d, 0x7,0x3b,0x26, 0x7,0x42,0x32, 0x7,0x42,0x34, 0x7,0x42,0x35, 0x7,0x42,0x3f, 0x7,0x42,0x42, 0x7,0x42,0x44, 0x7,0x42,0x4a, 0x7,0x42,0x4e, 0x7,0x42,0x4f, 0xf,0x60,0x48, 0xf,0x60,0x49, 0xf,0x60,0x4a, 0xf,0x60,0x4b, 0xf,0x60,0x4c, 0xf,0x60,0x4f, 0xf,0x60,0x50, 0xf,0x60,0x51, 0xf,0x60,0x52, 0xf,0x60,0x53, 0xf,0x60,0x54, 0xf,0x60,0x55, 0xf,0x60,0x56, 0xf,0x60,0x57, 0xf,0x60,0x58, 0xf,0x60,0x59, 0xf,0x60,0x5a, 0xf,0x60,0x5b, 0xf,0x60,0x5c, 0xf,0x60,0x5e, 0xf,0x60,0x5f, 0x4,0x5d,0x27, 0x7,0x42,0x40, 0x5,0x64,0x27, 0x7,0x42,0x41, 0x7,0x49,0x33, 0x5,0x64,0x35, 0x5,0x64,0x2a, 0x4,0x5d,0x29, 0x7,0x42,0x47, 0x5,0x64,0x23, 0x5,0x64,0x28, 0x5,0x64,0x37, 0x7,0x42,0x43, 0x7,0x42,0x31, 0x5,0x69,0x3e, 0x5,0x69,0x2f, 0x7,0x4f,0x5d, 0x5,0x69,0x30, 0x5,0x69,0x3a, 0x5,0x69,0x36, 0x4,0x60,0x7d, 0x4,0x60,0x79, 0x5,0x69,0x3f, 0x5,0x69,0x37, 0x7,0x49,0x38, 0x7,0x49,0x45, 0x5,0x69,0x3b, 0x5,0x69,0x35, 0x4,0x60,0x7c, 0x5,0x69,0x2e, 0x5,0x6d,0x42, 0x7,0x49,0x43, 0x5,0x69,0x38, 0x7,0x49,0x46, 0x5,0x69,0x39, 0x7,0x49,0x41, 0x7,0x49,0x54, 0x7,0x49,0x51, 0x7,0x49,0x3c, 0x5,0x69,0x33, 0x5,0x69,0x3d, 0x7,0x49,0x4b, 0x7,0x49,0x4e, 0x7,0x49,0x3e, 0x7,0x49,0x3d, 0x7,0x49,0x42, 0x7,0x49,0x47, 0x7,0x4f,0x54, 0x7,0x49,0x4d, 0x7,0x49,0x39, 0x7,0x49,0x4c, 0x7,0x49,0x4a, 0x7,0x4f,0x47, 0x5,0x69,0x34, 0x5,0x69,0x32, 0x4,0x60,0x76, 0x5,0x69,0x3c, 0x7,0x49,0x49, 0x7,0x49,0x40, 0x7,0x49,0x3f, 0x7,0x49,0x36, 0x7,0x49,0x37, 0x7,0x49,0x3a, 0x7,0x49,0x48, 0x7,0x49,0x50, 0x7,0x49,0x52, 0xf,0x63,0x51, 0xf,0x63,0x52, 0xf,0x63,0x54, 0xf,0x63,0x55, 0xf,0x63,0x56, 0xf,0x63,0x57, 0xf,0x63,0x58, 0xf,0x63,0x59, 0xf,0x63,0x5a, 0xf,0x63,0x5c, 0xf,0x63,0x5d, 0xf,0x63,0x5e, 0xf,0x63,0x5f, 0xf,0x63,0x60, 0xf,0x63,0x61, 0xf,0x63,0x62, 0xf,0x63,0x63, 0xf,0x63,0x64, 0xf,0x63,0x65, 0xf,0x63,0x66, 0xf,0x63,0x67, 0xf,0x63,0x68, 0xf,0x63,0x69, 0x7,0x49,0x4f, 0x7,0x4f,0x5e, 0x7,0x4f,0x55, 0x7,0x4f,0x4e, 0x5,0x6d,0x40, 0x5,0x6d,0x47, 0x7,0x4f,0x61, 0x5,0x6d,0x41, 0x5,0x6d,0x44, 0x4,0x64,0x39, 0x7,0x4f,0x58, 0x5,0x6d,0x46, 0x4,0x64,0x35, 0x5,0x6d,0x3f, 0x5,0x70,0x7e, 0x7,0x4f,0x5f, 0x5,0x6d,0x3b, 0x7,0x4f,0x51, 0x7,0x4f,0x50, 0x7,0x4f,0x4c, 0x5,0x6d,0x3e, 0x5,0x6d,0x45, 0x7,0x4f,0x4d, 0x4,0x64,0x31, 0x7,0x4f,0x67, 0x5,0x6d,0x3c, 0x7,0x4f,0x4b, 0x7,0x4f,0x53, 0x7,0x4f,0x62, 0x7,0x4f,0x5b, 0x7,0x49,0x3b, 0x7,0x4f,0x65, 0x5,0x6d,0x43, 0x4,0x64,0x2e, 0x7,0x4f,0x59, 0x5,0x6d,0x3d, 0x7,0x4f,0x66, 0x7,0x4f,0x5a, 0x5,0x69,0x31, 0x7,0x54,0x67, 0x7,0x58,0x69, 0x7,0x4f,0x49, 0x5,0x6d,0x3a, 0x5,0x6d,0x48, 0x7,0x4f,0x52, 0x7,0x4f,0x56, 0x7,0x4f,0x57, 0x7,0x4f,0x5c, 0x7,0x4f,0x63, 0x7,0x4f,0x64, 0xf,0x65,0x79, 0xf,0x65,0x7a, 0xf,0x65,0x7b, 0xf,0x65,0x7c, 0xf,0x65,0x7d, 0xf,0x65,0x7e, 0xf,0x66,0x21, 0xf,0x66,0x22, 0xf,0x66,0x23, 0xf,0x66,0x24, 0xf,0x66,0x25, 0xf,0x66,0x26, 0xf,0x66,0x27, 0xf,0x66,0x28, 0xf,0x66,0x29, 0xf,0x66,0x2a, 0xf,0x66,0x2b, 0xf,0x66,0x2c, 0x7,0x4f,0x4a, 0x7,0x4f,0x48, 0x7,0x4f,0x60, 0x7,0x54,0x63, 0x4,0x69,0x35, 0x5,0x71,0x28, 0x7,0x54,0x66, 0x7,0x54,0x5f, 0x5,0x71,0x24, 0x4,0x67,0x2c, 0x4,0x67,0x2a, 0x7,0x54,0x59, 0x4,0x67,0x2e, 0x5,0x71,0x22, 0x7,0x54,0x64, 0x5,0x71,0x25, 0x7,0x54,0x65, 0x4,0x67,0x29, 0x5,0x6d,0x49, 0x5,0x71,0x27, 0x7,0x54,0x5b, 0x7,0x54,0x53, 0x5,0x71,0x26, 0x7,0x54,0x62, 0x7,0x54,0x57, 0x7,0x54,0x55, 0x7,0x54,0x60, 0x4,0x67,0x2d, 0x5,0x71,0x23, 0x5,0x71,0x29, 0x5,0x71,0x2a, 0x7,0x54,0x54, 0x7,0x54,0x5c, 0x7,0x4f,0x4f, 0x7,0x54,0x5a, 0x7,0x58,0x76, 0x5,0x71,0x21, 0x7,0x54,0x56, 0x7,0x54,0x5d, 0x7,0x54,0x61, 0xf,0x68,0x38, 0xf,0x68,0x3a, 0xf,0x68,0x3b, 0xf,0x68,0x3c, 0xf,0x68,0x3d, 0xf,0x68,0x3e, 0xf,0x68,0x3f, 0xf,0x68,0x41, 0xf,0x68,0x42, 0xf,0x68,0x43, 0xf,0x68,0x44, 0xf,0x68,0x40, 0x7,0x54,0x58, 0x5,0x74,0x24, 0x4,0x69,0x36, 0x5,0x74,0x25, 0x5,0x74,0x27, 0x5,0x74,0x28, 0x7,0x58,0x70, 0x5,0x74,0x29, 0x4,0x69,0x3b, 0x4,0x69,0x3a, 0x7,0x58,0x77, 0x7,0x58,0x75, 0x7,0x58,0x6d, 0x7,0x5c,0x53, 0x5,0x74,0x23, 0x5,0x74,0x26, 0x7,0x58,0x6f, 0x4,0x69,0x38, 0x4,0x69,0x39, 0x7,0x58,0x6e, 0x4,0x69,0x34, 0x7,0x58,0x73, 0x7,0x58,0x6b, 0x7,0x58,0x78, 0x7,0x58,0x6a, 0x7,0x58,0x6c, 0x7,0x58,0x71, 0x7,0x58,0x74, 0xf,0x69,0x68, 0xf,0x69,0x6b, 0xf,0x69,0x6c, 0x7,0x5c,0x4f, 0x7,0x5c,0x5a, 0x4,0x6a,0x75, 0x5,0x76,0x40, 0x4,0x6a,0x74, 0x5,0x76,0x3f, 0x4,0x6a,0x71, 0x4,0x6a,0x73, 0x4,0x6a,0x72, 0x4,0x6a,0x70, 0x5,0x76,0x43, 0x7,0x5c,0x51, 0x7,0x5c,0x5b, 0x5,0x76,0x42, 0x5,0x79,0x40, 0x7,0x5c,0x55, 0x5,0x76,0x44, 0x7,0x5c,0x57, 0x7,0x5c,0x58, 0x7,0x5c,0x4d, 0x7,0x5c,0x50, 0x5,0x76,0x41, 0x7,0x5c,0x56, 0x7,0x5c,0x54, 0x7,0x5c,0x52, 0x7,0x5c,0x59, 0xf,0x6a,0x6d, 0xf,0x6a,0x6e, 0xf,0x6a,0x6f, 0x7,0x5c,0x4e, 0xf,0x69,0x6a, 0x5,0x78,0x23, 0x5,0x78,0x22, 0x5,0x78,0x21, 0x7,0x5f,0x40, 0x5,0x78,0x24, 0x7,0x5f,0x42, 0x7,0x5f,0x46, 0x7,0x5f,0x43, 0x7,0x5f,0x44, 0x7,0x5f,0x49, 0x7,0x5f,0x41, 0x7,0x5f,0x47, 0x5,0x79,0x42, 0xf,0x6b,0x60, 0xf,0x6b,0x61, 0xf,0x6b,0x63, 0x7,0x5f,0x45, 0x7,0x5f,0x48, 0x5,0x79,0x43, 0x7,0x62,0x55, 0x5,0x79,0x41, 0x7,0x62,0x53, 0x7,0x61,0x3e, 0x7,0x61,0x3d, 0x7,0x61,0x3c, 0xf,0x6c,0x38, 0xf,0x6c,0x39, 0x7,0x61,0x3f, 0x5,0x7a,0x35, 0x5,0x7a,0x36, 0x7,0x62,0x59, 0x7,0x62,0x57, 0x7,0x62,0x56, 0x7,0x62,0x58, 0x7,0x62,0x54, 0xf,0x6c,0x51, 0x7,0x62,0x48, 0x4,0x6d,0x7a, 0x7,0x63,0x68, 0x5,0x7a,0x72, 0x4,0x6d,0x5f, 0x4,0x6d,0x7c, 0xf,0x6c,0x6b, 0xf,0x6c,0x6d, 0x5,0x7b,0x46, 0x4,0x6e,0x35, 0x7,0x64,0x58, 0x7,0x64,0x59, 0x5,0x7c,0x49, 0x7,0x65,0x40, 0x5,0x7b,0x66, 0x7,0x65,0x60, 0x7,0x65,0x76, 0x5,0x7c,0x4f, 0x5,0x7c,0x3d, 0x7,0x65,0x5f, 0xf,0x28,0x65, 0x4,0x2b,0x3f, 0x6,0x34,0x49, 0x6,0x34,0x48, 0xf,0x32,0x4e, 0x5,0x35,0x36, 0x5,0x35,0x34, 0x4,0x34,0x77, 0x4,0x34,0x76, 0x6,0x44,0x41, 0x4,0x34,0x78, 0x6,0x44,0x42, 0x6,0x44,0x40, 0x6,0x44,0x3f, 0x6,0x3b,0x63, 0x6,0x4e,0x3c, 0x5,0x3b,0x71, 0x6,0x4e,0x3d, 0xf,0x3f,0x22, 0xf,0x3f,0x23, 0xf,0x3f,0x24, 0x5,0x42,0x55, 0x5,0x42,0x51, 0x5,0x42,0x52, 0x6,0x57,0x6b, 0x6,0x57,0x6a, 0x6,0x57,0x69, 0x5,0x49,0x4f, 0x6,0x61,0x62, 0x6,0x61,0x66, 0x4,0x46,0x6f, 0x6,0x61,0x65, 0x6,0x61,0x67, 0x6,0x61,0x63, 0x6,0x61,0x64, 0x5,0x49,0x50, 0xf,0x4c,0x2b, 0xf,0x4c,0x2c, 0x4,0x46,0x6e, 0x7,0x28,0x29, 0x7,0x28,0x27, 0x7,0x32,0x5f, 0x5,0x50,0x4e, 0x7,0x28,0x26, 0x7,0x28,0x28, 0xf,0x51,0x79, 0x7,0x26,0x29, 0x5,0x57,0x6a, 0x5,0x57,0x6b, 0x5,0x57,0x68, 0x5,0x57,0x69, 0x4,0x53,0x35, 0x5,0x57,0x67, 0x7,0x32,0x60, 0x7,0x32,0x5c, 0x7,0x32,0x5d, 0x4,0x53,0x38, 0x4,0x53,0x37, 0x5,0x57,0x6d, 0x7,0x32,0x5e, 0xf,0x57,0x5d, 0xf,0x57,0x5e, 0xf,0x57,0x5f, 0x5,0x57,0x6c, 0x7,0x32,0x5b, 0x4,0x58,0x4c, 0x7,0x3b,0x39, 0xf,0x5c,0x51, 0xf,0x5c,0x52, 0xf,0x5c,0x53, 0x7,0x42,0x51, 0x5,0x64,0x3d, 0x4,0x5d,0x33, 0x7,0x42,0x50, 0x4,0x5d,0x31, 0x7,0x42,0x52, 0x5,0x64,0x3c, 0xf,0x60,0x60, 0x7,0x49,0x56, 0x7,0x49,0x55, 0x4,0x60,0x7e, 0x7,0x49,0x57, 0x7,0x4f,0x69, 0x5,0x6d,0x4a, 0x7,0x4f,0x6a, 0x7,0x4c,0x26, 0x5,0x71,0x2c, 0x7,0x4f,0x68, 0x5,0x71,0x2b, 0x5,0x70,0x4d, 0x7,0x54,0x6a, 0x7,0x54,0x69, 0x5,0x74,0x2a, 0x7,0x5c,0x24, 0x4,0x6e,0x38, 0x5,0x24,0x75, 0x6,0x29,0x29, 0x4,0x28,0x22, 0x6,0x2e,0x25, 0xf,0x28,0x66, 0xf,0x28,0x67, 0xf,0x28,0x69, 0xf,0x28,0x6a, 0x4,0x2b,0x43, 0x6,0x34,0x4b, 0x4,0x2b,0x40, 0x4,0x2b,0x42, 0x6,0x34,0x4a, 0x5,0x2b,0x40, 0x6,0x34,0x4d, 0x6,0x34,0x4c, 0x6,0x34,0x4e, 0xf,0x2d,0x3d, 0xf,0x2d,0x3f, 0xf,0x2d,0x42, 0xf,0x2d,0x43, 0xf,0x2d,0x44, 0xf,0x2d,0x41, 0x4,0x2b,0x41, 0x5,0x30,0x30, 0x6,0x3b,0x68, 0x5,0x30,0x2c, 0x5,0x30,0x33, 0x6,0x3b,0x67, 0x5,0x30,0x2d, 0x5,0x30,0x32, 0x6,0x3b,0x66, 0x4,0x2f,0x6c, 0x4,0x2f,0x6a, 0x4,0x2f,0x6e, 0x5,0x30,0x2e, 0x6,0x3b,0x70, 0x5,0x30,0x29, 0x6,0x3b,0x6b, 0x5,0x30,0x31, 0x5,0x30,0x28, 0x6,0x3b,0x6a, 0x5,0x30,0x2f, 0x5,0x30,0x34, 0x6,0x3b,0x6e, 0x6,0x3b,0x64, 0x5,0x30,0x2b, 0x6,0x3b,0x65, 0xf,0x32,0x4f, 0x6,0x3b,0x6c, 0x6,0x3b,0x6d, 0x5,0x30,0x2a, 0x6,0x3b,0x6f, 0x5,0x35,0x37, 0x4,0x34,0x7d, 0x6,0x44,0x45, 0x5,0x35,0x38, 0x5,0x35,0x39, 0x5,0x35,0x3a, 0x5,0x35,0x40, 0x4,0x35,0x22, 0xf,0x38,0x3d, 0x4,0x35,0x23, 0x6,0x44,0x4c, 0x5,0x35,0x3c, 0x4,0x35,0x21, 0x5,0x35,0x3d, 0x6,0x44,0x46, 0x5,0x35,0x41, 0x6,0x44,0x49, 0x4,0x35,0x24, 0x4,0x34,0x7e, 0x6,0x44,0x47, 0x6,0x44,0x4a, 0x6,0x44,0x44, 0x6,0x44,0x4b, 0x6,0x44,0x4d, 0xf,0x38,0x36, 0xf,0x38,0x37, 0xf,0x38,0x38, 0xf,0x38,0x39, 0xf,0x38,0x3b, 0xf,0x38,0x3c, 0xf,0x38,0x3e, 0xf,0x38,0x3f, 0xf,0x38,0x40, 0x5,0x35,0x3e, 0x6,0x44,0x4e, 0x4,0x35,0x25, 0x6,0x44,0x43, 0x5,0x35,0x3f, 0x5,0x35,0x3b, 0x5,0x3b,0x73, 0x6,0x4e,0x40, 0xf,0x3f,0x28, 0x4,0x3a,0x73, 0x6,0x4e,0x48, 0x5,0x3c,0x28, 0x5,0x3b,0x78, 0x5,0x3b,0x75, 0x5,0x3b,0x77, 0x5,0x3b,0x7a, 0x5,0x3c,0x23, 0x5,0x3b,0x7d, 0x6,0x4e,0x49, 0x6,0x4e,0x3e, 0x6,0x4e,0x43, 0x5,0x3b,0x76, 0x5,0x3c,0x27, 0x6,0x4e,0x42, 0x6,0x4e,0x4b, 0x6,0x4e,0x4a, 0x5,0x3b,0x7c, 0x6,0x4e,0x3f, 0x5,0x3b,0x79, 0x5,0x3c,0x21, 0x6,0x4e,0x4d, 0x6,0x4e,0x44, 0x6,0x4e,0x45, 0x6,0x57,0x6e, 0x5,0x3c,0x25, 0x5,0x3b,0x7e, 0x6,0x57,0x78, 0x5,0x3c,0x24, 0x6,0x4e,0x4c, 0x6,0x4e,0x47, 0x5,0x3c,0x22, 0x5,0x3b,0x72, 0x6,0x4e,0x41, 0xf,0x3f,0x25, 0xf,0x3f,0x26, 0xf,0x3f,0x27, 0xf,0x3f,0x29, 0x4,0x3a,0x77, 0x6,0x57,0x70, 0x6,0x57,0x6f, 0x4,0x40,0x5a, 0x4,0x40,0x5c, 0x6,0x57,0x74, 0x4,0x40,0x54, 0x5,0x42,0x58, 0x5,0x42,0x5b, 0x5,0x42,0x56, 0x4,0x40,0x51, 0x4,0x40,0x53, 0x5,0x42,0x5c, 0x5,0x42,0x5e, 0x5,0x42,0x5a, 0x5,0x42,0x57, 0x4,0x40,0x5e, 0x4,0x40,0x50, 0x6,0x57,0x72, 0x6,0x57,0x73, 0x6,0x57,0x6c, 0x6,0x57,0x6d, 0x6,0x61,0x68, 0x6,0x57,0x71, 0x6,0x57,0x75, 0x5,0x42,0x59, 0xf,0x45,0x32, 0xf,0x45,0x33, 0xf,0x45,0x34, 0xf,0x45,0x35, 0xf,0x45,0x36, 0xf,0x45,0x37, 0xf,0x45,0x38, 0xf,0x45,0x39, 0x6,0x57,0x76, 0x7,0x49,0x6b, 0x6,0x57,0x77, 0x6,0x57,0x79, 0x5,0x49,0x51, 0x5,0x49,0x56, 0x5,0x49,0x5b, 0x5,0x49,0x57, 0x5,0x49,0x5c, 0x4,0x47,0x21, 0x5,0x49,0x55, 0x4,0x46,0x7d, 0x6,0x62,0x23, 0x5,0x49,0x5f, 0x4,0x46,0x77, 0x5,0x49,0x59, 0x4,0x46,0x74, 0x6,0x61,0x76, 0x6,0x61,0x6a, 0x6,0x61,0x75, 0x4,0x47,0x22, 0x5,0x49,0x5e, 0x6,0x61,0x6b, 0x6,0x61,0x71, 0x5,0x49,0x54, 0x6,0x61,0x7c, 0x5,0x49,0x5d, 0x5,0x49,0x58, 0x6,0x61,0x7b, 0x6,0x62,0x21, 0x5,0x49,0x60, 0x6,0x61,0x74, 0x6,0x61,0x7d, 0x6,0x61,0x6d, 0x5,0x49,0x61, 0x5,0x49,0x62, 0x6,0x61,0x72, 0x6,0x62,0x22, 0x5,0x49,0x5a, 0x6,0x61,0x6c, 0x6,0x61,0x79, 0x6,0x61,0x7a, 0x6,0x61,0x70, 0x5,0x49,0x52, 0x6,0x61,0x6e, 0x5,0x49,0x53, 0x6,0x61,0x73, 0xf,0x4c,0x2d, 0xf,0x4c,0x2e, 0xf,0x4c,0x30, 0xf,0x4c,0x31, 0xf,0x4c,0x32, 0x6,0x61,0x78, 0x4,0x40,0x58, 0x6,0x61,0x7e, 0x6,0x61,0x6f, 0x4,0x4d,0x2d, 0x7,0x28,0x43, 0x5,0x50,0x53, 0x4,0x4d,0x2e, 0x4,0x4d,0x2b, 0x7,0x28,0x38, 0x4,0x4d,0x34, 0x5,0x50,0x5f, 0x7,0x28,0x37, 0x7,0x28,0x2c, 0x5,0x50,0x51, 0x7,0x28,0x2b, 0x7,0x28,0x35, 0x7,0x28,0x3f, 0x5,0x50,0x57, 0x4,0x4d,0x32, 0x4,0x4d,0x2a, 0x7,0x28,0x40, 0x7,0x28,0x34, 0x5,0x50,0x56, 0x7,0x28,0x3b, 0x7,0x28,0x31, 0x7,0x28,0x3e, 0x5,0x57,0x6e, 0x4,0x4d,0x2c, 0x4,0x4d,0x29, 0x5,0x50,0x5c, 0x5,0x50,0x5a, 0x5,0x50,0x50, 0x5,0x50,0x59, 0x5,0x50,0x58, 0x7,0x28,0x2a, 0x5,0x50,0x5b, 0x4,0x46,0x7a, 0x5,0x50,0x52, 0x5,0x50,0x5e, 0x5,0x50,0x5d, 0x4,0x4d,0x35, 0x7,0x28,0x46, 0x7,0x28,0x30, 0x7,0x28,0x2d, 0x7,0x28,0x44, 0x7,0x28,0x39, 0x7,0x28,0x45, 0x7,0x28,0x3c, 0x7,0x28,0x2f, 0x6,0x61,0x77, 0x7,0x28,0x36, 0x7,0x28,0x3d, 0x5,0x50,0x54, 0x4,0x4d,0x27, 0x5,0x50,0x4f, 0xf,0x51,0x7a, 0xf,0x51,0x7b, 0xf,0x51,0x7e, 0xf,0x52,0x21, 0xf,0x52,0x22, 0xf,0x52,0x23, 0xf,0x52,0x25, 0xf,0x52,0x28, 0xf,0x52,0x29, 0xf,0x52,0x2a, 0xf,0x52,0x2b, 0x7,0x28,0x33, 0x7,0x28,0x41, 0x7,0x28,0x3a, 0xf,0x52,0x27, 0x7,0x28,0x32, 0xf,0x4c,0x2f, 0x5,0x57,0x70, 0x4,0x53,0x45, 0x5,0x57,0x76, 0x5,0x57,0x75, 0x4,0x53,0x3a, 0x5,0x57,0x74, 0x5,0x57,0x71, 0x7,0x32,0x6e, 0x7,0x32,0x7d, 0x5,0x57,0x77, 0x4,0x53,0x48, 0x5,0x57,0x7b, 0x4,0x53,0x49, 0x4,0x53,0x40, 0x4,0x53,0x42, 0x5,0x57,0x7c, 0x7,0x32,0x6d, 0x4,0x53,0x3b, 0x7,0x32,0x67, 0x4,0x53,0x3f, 0x7,0x32,0x7c, 0x5,0x57,0x79, 0x5,0x57,0x6f, 0x5,0x58,0x21, 0x5,0x57,0x72, 0x7,0x3b,0x3a, 0x5,0x57,0x78, 0x7,0x32,0x69, 0x4,0x53,0x46, 0x5,0x57,0x7a, 0x7,0x32,0x70, 0x7,0x33,0x22, 0x5,0x57,0x73, 0x7,0x32,0x64, 0x5,0x57,0x7e, 0x7,0x32,0x74, 0x4,0x53,0x47, 0x5,0x50,0x60, 0x7,0x32,0x6b, 0x7,0x32,0x65, 0x5,0x57,0x7d, 0x7,0x32,0x76, 0x4,0x53,0x43, 0x7,0x32,0x7b, 0x7,0x33,0x24, 0x7,0x32,0x62, 0x7,0x32,0x77, 0x7,0x32,0x63, 0x7,0x32,0x78, 0x7,0x32,0x6f, 0x7,0x32,0x7e, 0x7,0x32,0x72, 0x7,0x32,0x68, 0x7,0x33,0x23, 0xf,0x57,0x60, 0xf,0x57,0x61, 0xf,0x57,0x63, 0xf,0x57,0x64, 0xf,0x57,0x65, 0xf,0x57,0x66, 0x7,0x32,0x79, 0x7,0x32,0x6a, 0x7,0x32,0x7a, 0x7,0x32,0x71, 0x7,0x32,0x66, 0x7,0x32,0x6c, 0x4,0x58,0x59, 0x5,0x5e,0x29, 0x5,0x5e,0x2c, 0x4,0x58,0x55, 0x7,0x3b,0x52, 0x7,0x3b,0x44, 0x4,0x58,0x60, 0x4,0x58,0x5c, 0x7,0x3b,0x48, 0x7,0x3b,0x42, 0x7,0x3b,0x55, 0x4,0x58,0x5e, 0x7,0x3b,0x46, 0x7,0x28,0x47, 0x4,0x58,0x50, 0x5,0x5e,0x31, 0x7,0x3b,0x50, 0x7,0x3b,0x3f, 0x4,0x58,0x5d, 0x7,0x3b,0x4f, 0x5,0x5e,0x2b, 0x5,0x5e,0x2f, 0x7,0x3b,0x53, 0x4,0x58,0x5a, 0x7,0x3b,0x47, 0x7,0x3b,0x41, 0x5,0x5e,0x33, 0x4,0x58,0x53, 0x7,0x3b,0x40, 0x4,0x58,0x51, 0x7,0x3b,0x3e, 0x7,0x3b,0x54, 0x5,0x5e,0x2a, 0x7,0x3b,0x3c, 0x7,0x3b,0x3b, 0x7,0x3b,0x49, 0x4,0x58,0x5b, 0x5,0x5e,0x2d, 0x5,0x5e,0x2e, 0x7,0x3b,0x45, 0xf,0x5c,0x54, 0xf,0x5c,0x55, 0xf,0x5c,0x56, 0xf,0x5c,0x57, 0xf,0x5c,0x58, 0xf,0x5c,0x59, 0xf,0x5c,0x5a, 0xf,0x5c,0x5c, 0x7,0x3b,0x43, 0x7,0x3b,0x4b, 0x7,0x3b,0x4e, 0x7,0x3b,0x51, 0x7,0x3b,0x3d, 0x5,0x5e,0x28, 0x7,0x3b,0x4a, 0x7,0x3b,0x4c, 0x5,0x5e,0x30, 0x4,0x5d,0x3d, 0x4,0x5d,0x37, 0x7,0x42,0x55, 0x7,0x42,0x61, 0x7,0x42,0x58, 0x7,0x42,0x68, 0x5,0x64,0x43, 0x5,0x64,0x44, 0x5,0x5e,0x34, 0x4,0x5d,0x38, 0x5,0x64,0x50, 0x7,0x42,0x59, 0x4,0x5d,0x36, 0x5,0x64,0x45, 0x4,0x5d,0x35, 0x4,0x5d,0x3a, 0x5,0x64,0x3f, 0x5,0x64,0x42, 0x5,0x64,0x4d, 0x4,0x5d,0x34, 0x5,0x64,0x4a, 0x7,0x42,0x56, 0x5,0x64,0x3e, 0x5,0x64,0x41, 0x5,0x64,0x4b, 0x7,0x42,0x57, 0x7,0x42,0x5c, 0x7,0x42,0x5b, 0x5,0x64,0x40, 0x7,0x42,0x6f, 0x7,0x42,0x6b, 0x5,0x64,0x4f, 0x7,0x42,0x6e, 0x5,0x64,0x49, 0x5,0x64,0x4c, 0x7,0x42,0x69, 0x5,0x64,0x46, 0x7,0x42,0x6c, 0x5,0x64,0x47, 0x7,0x42,0x65, 0x7,0x42,0x62, 0x7,0x42,0x5d, 0x7,0x42,0x63, 0x7,0x42,0x54, 0x7,0x42,0x5a, 0x7,0x42,0x53, 0x7,0x42,0x5e, 0x7,0x42,0x6a, 0x7,0x42,0x66, 0xf,0x60,0x62, 0xf,0x60,0x64, 0xf,0x60,0x65, 0xf,0x60,0x66, 0xf,0x60,0x68, 0xf,0x60,0x69, 0xf,0x60,0x6a, 0x7,0x42,0x64, 0x4,0x5d,0x3c, 0x7,0x42,0x67, 0xf,0x60,0x67, 0xf,0x60,0x61, 0x5,0x64,0x4e, 0x4,0x61,0x28, 0x7,0x49,0x6a, 0x7,0x49,0x59, 0x7,0x49,0x60, 0x7,0x49,0x6c, 0x7,0x49,0x5a, 0x7,0x49,0x69, 0x7,0x49,0x6d, 0x4,0x61,0x23, 0x5,0x69,0x42, 0x5,0x69,0x40, 0x7,0x49,0x62, 0x7,0x49,0x67, 0x7,0x49,0x65, 0x5,0x69,0x44, 0x7,0x49,0x5d, 0x7,0x49,0x68, 0x7,0x49,0x64, 0x7,0x49,0x66, 0x7,0x4f,0x6b, 0x7,0x49,0x61, 0x7,0x49,0x6e, 0x7,0x49,0x6f, 0x7,0x49,0x63, 0x5,0x69,0x45, 0x7,0x49,0x5c, 0x7,0x49,0x5f, 0x7,0x49,0x58, 0xf,0x63,0x6b, 0xf,0x63,0x6c, 0xf,0x63,0x6d, 0xf,0x63,0x6f, 0xf,0x63,0x70, 0xf,0x63,0x71, 0xf,0x63,0x72, 0xf,0x63,0x73, 0xf,0x63,0x74, 0xf,0x63,0x75, 0x7,0x49,0x5b, 0x4,0x61,0x22, 0x4,0x61,0x27, 0x7,0x49,0x5e, 0x7,0x42,0x70, 0x7,0x4f,0x75, 0x7,0x4f,0x7a, 0x5,0x6d,0x4d, 0x7,0x4f,0x6c, 0x4,0x64,0x42, 0x5,0x6d,0x4c, 0x5,0x6d,0x51, 0x7,0x4f,0x78, 0x7,0x4f,0x70, 0x5,0x6d,0x50, 0x7,0x4f,0x74, 0x5,0x6d,0x52, 0x5,0x6d,0x53, 0x7,0x4f,0x73, 0x5,0x6d,0x4e, 0x7,0x4f,0x72, 0x7,0x4f,0x77, 0x7,0x4f,0x71, 0x7,0x4f,0x6d, 0x5,0x6d,0x4f, 0x7,0x4f,0x6f, 0x7,0x54,0x77, 0x7,0x4f,0x6e, 0x7,0x4f,0x7b, 0xf,0x66,0x2d, 0xf,0x66,0x2e, 0xf,0x66,0x2f, 0xf,0x66,0x30, 0xf,0x66,0x31, 0x7,0x4f,0x76, 0x4,0x67,0x2f, 0x4,0x67,0x34, 0x7,0x54,0x6b, 0x7,0x54,0x70, 0x5,0x71,0x2f, 0x7,0x54,0x75, 0x7,0x54,0x6e, 0x7,0x54,0x71, 0x5,0x71,0x2e, 0x7,0x54,0x73, 0x5,0x71,0x2d, 0x5,0x71,0x30, 0x7,0x54,0x6c, 0x4,0x67,0x33, 0x7,0x54,0x6f, 0x4,0x67,0x35, 0x4,0x67,0x31, 0x7,0x54,0x72, 0x5,0x71,0x32, 0x7,0x54,0x78, 0x7,0x4f,0x79, 0x7,0x54,0x74, 0x4,0x67,0x32, 0x7,0x54,0x79, 0x5,0x71,0x31, 0x5,0x71,0x33, 0x7,0x54,0x76, 0xf,0x68,0x45, 0xf,0x68,0x46, 0xf,0x68,0x47, 0xf,0x68,0x48, 0xf,0x68,0x49, 0x7,0x54,0x6d, 0x5,0x74,0x2e, 0x4,0x69,0x3c, 0x5,0x74,0x2c, 0x5,0x74,0x2b, 0x7,0x59,0x23, 0x7,0x58,0x7c, 0x5,0x74,0x2d, 0x5,0x74,0x31, 0x5,0x74,0x30, 0x7,0x58,0x7a, 0x5,0x74,0x33, 0x5,0x74,0x35, 0x5,0x74,0x32, 0x7,0x58,0x79, 0x4,0x69,0x3d, 0x7,0x59,0x26, 0x7,0x59,0x28, 0x7,0x59,0x27, 0x7,0x58,0x7e, 0x7,0x59,0x21, 0x5,0x74,0x34, 0x5,0x74,0x36, 0x7,0x59,0x24, 0x7,0x59,0x29, 0x5,0x74,0x2f, 0x7,0x58,0x7d, 0x7,0x58,0x7b, 0xf,0x69,0x6d, 0xf,0x69,0x6e, 0x5,0x76,0x46, 0x4,0x6a,0x76, 0x4,0x6a,0x77, 0x7,0x5c,0x5d, 0x5,0x76,0x47, 0x4,0x6a,0x79, 0x7,0x5c,0x5f, 0x7,0x5c,0x5c, 0x5,0x76,0x48, 0x7,0x5c,0x62, 0x5,0x76,0x45, 0x7,0x5f,0x4a, 0x7,0x5c,0x60, 0x4,0x6a,0x7a, 0x7,0x5c,0x61, 0x5,0x76,0x4a, 0x7,0x59,0x22, 0x5,0x76,0x49, 0xf,0x6a,0x70, 0xf,0x6a,0x71, 0xf,0x6a,0x72, 0x5,0x78,0x2c, 0x7,0x5f,0x4b, 0x4,0x6b,0x7e, 0x5,0x78,0x2b, 0x5,0x78,0x29, 0x7,0x5f,0x4c, 0x5,0x78,0x26, 0x4,0x6c,0x22, 0x7,0x5f,0x4d, 0x5,0x78,0x2a, 0x5,0x78,0x28, 0x4,0x6c,0x24, 0x5,0x78,0x2d, 0x5,0x78,0x27, 0x5,0x79,0x44, 0x4,0x6c,0x7e, 0x5,0x79,0x48, 0x5,0x79,0x4a, 0x4,0x6c,0x21, 0x7,0x61,0x40, 0x5,0x79,0x46, 0x7,0x61,0x44, 0x7,0x61,0x43, 0x7,0x61,0x45, 0x5,0x79,0x47, 0x5,0x79,0x49, 0x7,0x61,0x41, 0x5,0x79,0x45, 0x7,0x62,0x5d, 0x7,0x62,0x5b, 0x7,0x62,0x5e, 0x7,0x62,0x5c, 0x7,0x62,0x5f, 0x7,0x63,0x6e, 0x7,0x63,0x6c, 0x5,0x7a,0x73, 0x7,0x63,0x6b, 0x7,0x63,0x6f, 0x7,0x62,0x5a, 0x7,0x63,0x69, 0x7,0x63,0x71, 0x7,0x63,0x6a, 0x7,0x63,0x70, 0x7,0x63,0x6d, 0x7,0x64,0x5c, 0x4,0x6e,0x3a, 0x7,0x64,0x5d, 0x5,0x7b,0x47, 0x5,0x7b,0x48, 0x7,0x64,0x5a, 0x7,0x64,0x5b, 0x5,0x7b,0x67, 0x7,0x65,0x41, 0x7,0x65,0x42, 0x5,0x7b,0x68, 0x4,0x6e,0x50, 0x7,0x65,0x62, 0x7,0x65,0x61, 0xf,0x6d,0x31, 0x7,0x66,0x2b, 0x5,0x27,0x65, 0x6,0x2e,0x27, 0x6,0x2e,0x26, 0x4,0x2b,0x44, 0x6,0x3b,0x72, 0x5,0x30,0x35, 0x6,0x3b,0x75, 0x6,0x3b,0x74, 0xf,0x38,0x41, 0x6,0x4e,0x4e, 0x6,0x4e,0x50, 0x5,0x42,0x5f, 0x6,0x57,0x7c, 0x6,0x57,0x7a, 0x6,0x57,0x7d, 0x6,0x57,0x7b, 0x5,0x49,0x65, 0x5,0x49,0x63, 0x5,0x49,0x64, 0x6,0x62,0x26, 0x6,0x62,0x24, 0x7,0x28,0x48, 0x5,0x50,0x61, 0x7,0x28,0x49, 0x7,0x28,0x4a, 0x6,0x62,0x25, 0x5,0x58,0x23, 0x5,0x58,0x24, 0x5,0x58,0x22, 0x7,0x33,0x25, 0x7,0x33,0x26, 0x5,0x5e,0x37, 0x5,0x5e,0x36, 0xf,0x5c,0x5d, 0x4,0x5d,0x3e, 0x4,0x5d,0x3f, 0x7,0x42,0x71, 0x7,0x42,0x73, 0x4,0x5d,0x40, 0x7,0x42,0x72, 0x5,0x69,0x46, 0x5,0x6d,0x54, 0x7,0x4f,0x7c, 0x7,0x54,0x7a, 0x7,0x59,0x2b, 0x7,0x59,0x2a, 0x7,0x5f,0x4e, 0x7,0x65,0x63, 0x4,0x28,0x23, 0x6,0x2e,0x28, 0x4,0x28,0x24, 0x6,0x34,0x4f, 0x6,0x34,0x50, 0x5,0x2b,0x41, 0xf,0x2d,0x45, 0x5,0x30,0x36, 0x6,0x3b,0x77, 0x6,0x3b,0x76, 0x5,0x30,0x37, 0x6,0x44,0x4f, 0x5,0x3c,0x29, 0x6,0x4e,0x53, 0x6,0x4e,0x52, 0xf,0x3f,0x2a, 0xf,0x3f,0x2b, 0x6,0x4e,0x51, 0x6,0x58,0x23, 0x6,0x58,0x21, 0x4,0x40,0x5f, 0x6,0x58,0x22, 0x6,0x57,0x7e, 0xf,0x45,0x3a, 0x4,0x47,0x24, 0x5,0x50,0x62, 0x6,0x62,0x27, 0x6,0x62,0x28, 0x4,0x58,0x61, 0x7,0x3b,0x56, 0xf,0x5c,0x5e, 0x4,0x5d,0x41, 0x7,0x42,0x74, 0x7,0x49,0x70, 0x7,0x54,0x7b, 0x7,0x5c,0x64, 0x5,0x27,0x66, 0x6,0x2e,0x29, 0x6,0x2e,0x2a, 0x6,0x2e,0x2b, 0x5,0x2b,0x43, 0x6,0x34,0x51, 0x4,0x2b,0x45, 0x4,0x2b,0x47, 0x5,0x2b,0x45, 0x6,0x34,0x53, 0x5,0x2b,0x44, 0xf,0x28,0x6b, 0x6,0x34,0x52, 0x5,0x2b,0x42, 0x5,0x2b,0x46, 0x6,0x3b,0x7d, 0x5,0x30,0x3c, 0x4,0x2f,0x71, 0x6,0x3c,0x21, 0x6,0x3c,0x25, 0x5,0x30,0x3f, 0x6,0x3c,0x26, 0x6,0x3c,0x27, 0x4,0x2f,0x70, 0x6,0x3b,0x79, 0x5,0x30,0x40, 0x6,0x3b,0x7b, 0x5,0x30,0x38, 0x6,0x3c,0x22, 0x6,0x3b,0x7c, 0x6,0x3c,0x23, 0x6,0x3b,0x7e, 0x5,0x30,0x3b, 0x6,0x3b,0x7a, 0x6,0x3b,0x78, 0x5,0x30,0x3a, 0xf,0x32,0x50, 0x6,0x3c,0x24, 0x6,0x3c,0x28, 0x6,0x3c,0x29, 0xf,0x2d,0x48, 0xf,0x2d,0x49, 0xf,0x32,0x52, 0x4,0x35,0x28, 0x5,0x3c,0x32, 0x4,0x35,0x2b, 0x4,0x3a,0x7c, 0x5,0x35,0x46, 0x4,0x35,0x29, 0x6,0x44,0x58, 0x5,0x35,0x47, 0x5,0x35,0x4a, 0x5,0x35,0x44, 0x5,0x35,0x45, 0x5,0x35,0x43, 0x6,0x44,0x59, 0x6,0x44,0x5a, 0x5,0x35,0x42, 0x6,0x44,0x53, 0x6,0x44,0x55, 0x6,0x44,0x54, 0x6,0x44,0x51, 0x6,0x44,0x50, 0x6,0x44,0x57, 0x6,0x44,0x52, 0xf,0x2d,0x46, 0xf,0x38,0x45, 0x5,0x35,0x48, 0x6,0x44,0x56, 0x5,0x35,0x49, 0x5,0x3c,0x31, 0x6,0x4e,0x5b, 0x6,0x4e,0x59, 0x5,0x3c,0x2e, 0x6,0x4e,0x57, 0x5,0x3c,0x2f, 0x5,0x3c,0x33, 0x4,0x3a,0x7e, 0x6,0x4e,0x58, 0x6,0x4e,0x54, 0x4,0x3a,0x7d, 0x6,0x4e,0x56, 0x5,0x3c,0x30, 0x5,0x3c,0x2d, 0x5,0x3c,0x2b, 0x5,0x42,0x64, 0x5,0x3c,0x2a, 0xf,0x38,0x44, 0xf,0x3f,0x2e, 0x6,0x4e,0x55, 0x6,0x4e,0x5a, 0x6,0x4e,0x5c, 0x5,0x3c,0x2c, 0xf,0x38,0x43, 0x5,0x42,0x6a, 0x5,0x42,0x62, 0x5,0x42,0x66, 0x4,0x40,0x65, 0x5,0x42,0x6b, 0x5,0x42,0x63, 0x5,0x42,0x67, 0x4,0x40,0x63, 0x5,0x42,0x65, 0x5,0x42,0x69, 0x6,0x58,0x2f, 0x4,0x40,0x64, 0x6,0x58,0x2a, 0x6,0x58,0x28, 0x6,0x58,0x30, 0x5,0x42,0x68, 0x5,0x42,0x60, 0x6,0x58,0x24, 0x6,0x58,0x27, 0x6,0x58,0x2d, 0xf,0x3f,0x2c, 0xf,0x3f,0x2d, 0xf,0x3f,0x2f, 0xf,0x3f,0x30, 0xf,0x45,0x3b, 0x6,0x58,0x26, 0x6,0x58,0x31, 0x6,0x58,0x25, 0x6,0x58,0x29, 0x5,0x42,0x61, 0xf,0x45,0x3e, 0x4,0x47,0x30, 0x4,0x47,0x2c, 0x6,0x62,0x2d, 0x6,0x62,0x33, 0x4,0x47,0x29, 0x5,0x49,0x66, 0x5,0x49,0x69, 0x4,0x47,0x28, 0x5,0x49,0x68, 0x5,0x3c,0x34, 0x6,0x62,0x34, 0x5,0x49,0x6a, 0x6,0x62,0x2b, 0x6,0x62,0x29, 0x6,0x62,0x2a, 0x6,0x62,0x32, 0x6,0x62,0x31, 0x5,0x49,0x67, 0x6,0x62,0x2f, 0x5,0x49,0x6b, 0x6,0x62,0x30, 0x6,0x62,0x2c, 0x4,0x47,0x33, 0x6,0x62,0x35, 0x6,0x62,0x2e, 0xf,0x4c,0x34, 0xf,0x4c,0x36, 0xf,0x4c,0x37, 0x4,0x47,0x2f, 0xf,0x45,0x3c, 0xf,0x45,0x3f, 0x5,0x50,0x66, 0x7,0x28,0x54, 0x4,0x4d,0x41, 0x5,0x50,0x69, 0x7,0x28,0x57, 0x4,0x47,0x32, 0x7,0x28,0x56, 0x5,0x50,0x65, 0x4,0x4d,0x38, 0x7,0x28,0x55, 0x7,0x33,0x28, 0x5,0x50,0x67, 0x7,0x28,0x5a, 0x7,0x28,0x4b, 0x4,0x4d,0x45, 0x4,0x4d,0x3b, 0x4,0x4d,0x3d, 0x7,0x28,0x53, 0x4,0x4d,0x44, 0x4,0x4d,0x43, 0x5,0x50,0x63, 0x7,0x28,0x58, 0x7,0x28,0x52, 0x7,0x28,0x4c, 0x5,0x50,0x64, 0x7,0x28,0x4f, 0x5,0x50,0x68, 0x7,0x28,0x51, 0x7,0x28,0x50, 0x7,0x28,0x4d, 0xf,0x4c,0x35, 0xf,0x52,0x2d, 0x7,0x28,0x4e, 0x7,0x28,0x59, 0x5,0x58,0x2c, 0x5,0x58,0x2b, 0x7,0x33,0x2b, 0x5,0x58,0x27, 0x5,0x58,0x2a, 0x7,0x33,0x27, 0x4,0x53,0x51, 0x7,0x33,0x29, 0x4,0x53,0x54, 0x7,0x3b,0x62, 0x5,0x58,0x29, 0x5,0x58,0x28, 0x7,0x33,0x2a, 0x4,0x53,0x4e, 0x7,0x33,0x2c, 0x7,0x33,0x2f, 0x4,0x53,0x4d, 0x5,0x58,0x25, 0x7,0x33,0x30, 0x5,0x58,0x26, 0x7,0x33,0x2e, 0xf,0x52,0x2c, 0x7,0x33,0x2d, 0x5,0x5e,0x3e, 0x5,0x5e,0x3f, 0x7,0x3b,0x57, 0x5,0x5e,0x3b, 0x7,0x3b,0x5d, 0x7,0x3b,0x64, 0x4,0x58,0x66, 0x5,0x5e,0x38, 0x5,0x5e,0x39, 0x5,0x5e,0x3d, 0x5,0x5e,0x3c, 0x7,0x3b,0x5f, 0x7,0x3b,0x5b, 0x7,0x3b,0x63, 0x7,0x42,0x7b, 0x7,0x3b,0x5c, 0x7,0x28,0x5b, 0x7,0x3b,0x5e, 0x7,0x3b,0x60, 0x5,0x5e,0x40, 0x7,0x3b,0x58, 0x7,0x3b,0x5a, 0x5,0x5e,0x3a, 0xf,0x57,0x67, 0xf,0x57,0x68, 0xf,0x57,0x69, 0xf,0x57,0x6a, 0x7,0x42,0x75, 0x4,0x5d,0x45, 0x7,0x42,0x7c, 0x7,0x42,0x7e, 0x5,0x64,0x5b, 0x5,0x64,0x57, 0x7,0x42,0x7d, 0x4,0x5d,0x4b, 0x5,0x64,0x54, 0x5,0x64,0x55, 0x5,0x64,0x5f, 0x4,0x5d,0x4d, 0x4,0x5d,0x42, 0x7,0x42,0x7a, 0x5,0x64,0x53, 0x4,0x5d,0x47, 0x4,0x5d,0x4c, 0x5,0x64,0x5d, 0x7,0x42,0x79, 0x7,0x42,0x77, 0x5,0x64,0x51, 0x4,0x5d,0x43, 0x5,0x5e,0x42, 0x5,0x64,0x52, 0x7,0x42,0x78, 0x7,0x43,0x23, 0x7,0x42,0x76, 0x5,0x64,0x59, 0x5,0x64,0x5a, 0x5,0x5e,0x41, 0x5,0x64,0x5c, 0x5,0x64,0x5e, 0x5,0x64,0x58, 0xf,0x5c,0x60, 0x7,0x49,0x76, 0x5,0x69,0x49, 0x5,0x69,0x4a, 0x4,0x61,0x29, 0x7,0x49,0x7b, 0x7,0x49,0x7c, 0x5,0x69,0x47, 0x5,0x69,0x48, 0x7,0x49,0x72, 0x7,0x49,0x73, 0x7,0x49,0x75, 0x7,0x49,0x79, 0x7,0x49,0x7a, 0x7,0x49,0x74, 0x7,0x49,0x78, 0x4,0x61,0x2b, 0x7,0x49,0x77, 0x7,0x43,0x21, 0xf,0x60,0x6b, 0xf,0x60,0x6c, 0xf,0x63,0x76, 0x7,0x4f,0x7d, 0x5,0x6d,0x58, 0x7,0x50,0x26, 0x5,0x6d,0x5b, 0x5,0x71,0x34, 0x5,0x6d,0x55, 0x4,0x64,0x45, 0x7,0x50,0x23, 0x5,0x6d,0x56, 0x7,0x50,0x22, 0x7,0x54,0x7c, 0x7,0x4f,0x7e, 0x5,0x6d,0x59, 0x7,0x49,0x71, 0x5,0x6d,0x5a, 0x5,0x6d,0x5c, 0x7,0x50,0x24, 0xf,0x66,0x34, 0x7,0x50,0x21, 0x5,0x6d,0x5d, 0x7,0x55,0x22, 0x7,0x55,0x24, 0x5,0x71,0x36, 0x4,0x67,0x36, 0x7,0x55,0x26, 0x7,0x55,0x25, 0x5,0x71,0x35, 0x7,0x54,0x7e, 0x7,0x55,0x21, 0x4,0x67,0x37, 0x7,0x55,0x23, 0x7,0x59,0x31, 0x7,0x54,0x7d, 0xf,0x66,0x33, 0x4,0x69,0x41, 0x7,0x59,0x2e, 0x4,0x69,0x40, 0x4,0x69,0x3f, 0x5,0x74,0x37, 0x7,0x59,0x2c, 0x7,0x59,0x2d, 0x7,0x59,0x30, 0x7,0x59,0x2f, 0x5,0x78,0x2e, 0xf,0x69,0x6f, 0x7,0x5f,0x51, 0x7,0x5f,0x50, 0x7,0x5f,0x4f, 0x5,0x79,0x4b, 0x7,0x61,0x48, 0x7,0x61,0x47, 0x7,0x61,0x46, 0x7,0x62,0x61, 0x5,0x7a,0x37, 0x7,0x62,0x62, 0x7,0x62,0x60, 0x7,0x64,0x5f, 0x7,0x63,0x73, 0x7,0x63,0x72, 0x7,0x64,0x5e, 0x5,0x7b,0x7e, 0x7,0x65,0x64, 0x7,0x66,0x2c, 0x5,0x7c,0x4b, 0x7,0x66,0x4d, 0x5,0x24,0x76, 0x6,0x2e,0x2c, 0x4,0x2b,0x48, 0x5,0x30,0x41, 0x4,0x2f,0x74, 0x6,0x3c,0x2a, 0x6,0x44,0x5b, 0xf,0x38,0x46, 0xf,0x3f,0x31, 0xf,0x3f,0x32, 0x6,0x58,0x32, 0x4,0x47,0x34, 0x6,0x62,0x36, 0x6,0x62,0x37, 0x6,0x62,0x38, 0xf,0x4c,0x38, 0xf,0x4c,0x39, 0x7,0x28,0x5c, 0xf,0x4c,0x3a, 0xf,0x52,0x30, 0x7,0x33,0x31, 0x7,0x33,0x32, 0xf,0x52,0x2f, 0x7,0x3b,0x65, 0xf,0x60,0x6d, 0xf,0x60,0x6e, 0x5,0x69,0x4b, 0x7,0x50,0x27, 0x7,0x55,0x27, 0x5,0x27,0x67, 0x6,0x2e,0x2d, 0x4,0x2f,0x77, 0x5,0x30,0x42, 0xf,0x32,0x53, 0x5,0x35,0x4d, 0x5,0x35,0x4e, 0x6,0x44,0x5c, 0x6,0x44,0x5d, 0x5,0x35,0x50, 0x5,0x35,0x4b, 0xf,0x38,0x47, 0xf,0x38,0x49, 0xf,0x38,0x4b, 0x4,0x35,0x32, 0x4,0x35,0x36, 0x5,0x35,0x4c, 0x5,0x35,0x4f, 0x6,0x4e,0x5f, 0x4,0x3b,0x25, 0x6,0x4e,0x62, 0x6,0x4e,0x61, 0x5,0x3c,0x36, 0x6,0x4e,0x5e, 0x4,0x3b,0x24, 0x6,0x4e,0x5d, 0x6,0x58,0x36, 0x5,0x42,0x6d, 0x5,0x42,0x6f, 0x5,0x42,0x6e, 0x6,0x58,0x33, 0x6,0x58,0x37, 0x5,0x42,0x70, 0xf,0x45,0x40, 0xf,0x45,0x41, 0xf,0x45,0x42, 0x6,0x58,0x35, 0x6,0x62,0x39, 0x5,0x49,0x71, 0x5,0x49,0x6e, 0x5,0x49,0x72, 0x4,0x47,0x37, 0x6,0x62,0x3a, 0xf,0x4c,0x3b, 0xf,0x4c,0x3c, 0x5,0x49,0x6f, 0x6,0x62,0x3b, 0x5,0x49,0x70, 0x4,0x4d,0x49, 0x7,0x28,0x5f, 0x5,0x50,0x6c, 0x4,0x4d,0x4b, 0x5,0x50,0x6b, 0x7,0x28,0x63, 0x5,0x50,0x6d, 0x6,0x58,0x34, 0x7,0x28,0x62, 0x5,0x50,0x6a, 0x5,0x50,0x6e, 0xf,0x52,0x31, 0x7,0x28,0x60, 0x7,0x28,0x5e, 0x7,0x28,0x5d, 0x7,0x28,0x61, 0x5,0x58,0x30, 0x5,0x58,0x2f, 0x5,0x58,0x2e, 0x4,0x53,0x57, 0x7,0x33,0x34, 0x5,0x58,0x34, 0x7,0x3b,0x67, 0x4,0x53,0x58, 0x4,0x53,0x5e, 0x4,0x53,0x5d, 0x5,0x58,0x31, 0x5,0x58,0x35, 0x7,0x33,0x33, 0x5,0x58,0x2d, 0x5,0x58,0x33, 0xf,0x57,0x6b, 0xf,0x57,0x6c, 0xf,0x57,0x6d, 0x7,0x3b,0x66, 0x5,0x64,0x60, 0x5,0x5e,0x45, 0x5,0x5e,0x44, 0x7,0x3b,0x6a, 0x7,0x3b,0x69, 0x7,0x3b,0x6b, 0x7,0x3b,0x68, 0xf,0x5c,0x61, 0xf,0x5c,0x62, 0x5,0x64,0x62, 0x4,0x5d,0x51, 0x4,0x5d,0x4f, 0x7,0x43,0x24, 0x5,0x64,0x61, 0xf,0x60,0x6f, 0xf,0x60,0x70, 0xf,0x60,0x71, 0x7,0x43,0x25, 0x7,0x49,0x7d, 0x7,0x49,0x7e, 0x5,0x6d,0x5f, 0x7,0x50,0x29, 0x7,0x50,0x28, 0xf,0x66,0x35, 0x5,0x6d,0x5e, 0xf,0x68,0x4b, 0xf,0x68,0x4c, 0x7,0x55,0x28, 0x4,0x69,0x43, 0x5,0x74,0x39, 0x4,0x69,0x42, 0xf,0x69,0x70, 0xf,0x69,0x71, 0x5,0x78,0x2f, 0x7,0x5f,0x53, 0xf,0x6b,0x64, 0x7,0x5f,0x52, 0x5,0x79,0x4d, 0x5,0x79,0x4c, 0x7,0x61,0x49, 0x4,0x6d,0x21, 0x5,0x7a,0x74, 0x4,0x6e,0x3b, 0x5,0x7c,0x44, 0x7,0x66,0x54, 0x6,0x2e,0x2e, 0x6,0x2e,0x2f, 0x6,0x34,0x54, 0x5,0x2b,0x48, 0x4,0x2f,0x78, 0x6,0x3c,0x2c, 0x4,0x2f,0x79, 0x6,0x3c,0x2b, 0x6,0x44,0x67, 0x4,0x35,0x3b, 0x5,0x35,0x53, 0x5,0x35,0x52, 0x6,0x44,0x5f, 0x6,0x44,0x63, 0x4,0x35,0x37, 0x6,0x44,0x64, 0x5,0x35,0x51, 0x6,0x44,0x60, 0xf,0x38,0x4d, 0xf,0x38,0x4e, 0xf,0x38,0x4f, 0x4,0x35,0x3c, 0x6,0x44,0x66, 0x6,0x44,0x5e, 0x6,0x44,0x62, 0x6,0x44,0x65, 0x6,0x44,0x61, 0x5,0x3c,0x37, 0x4,0x3b,0x26, 0x6,0x4e,0x64, 0x6,0x4e,0x67, 0x5,0x3c,0x38, 0x6,0x4e,0x63, 0x6,0x4e,0x66, 0x6,0x4e,0x69, 0x6,0x4e,0x65, 0x4,0x3b,0x27, 0x4,0x3b,0x28, 0x6,0x4e,0x68, 0xf,0x3f,0x33, 0x5,0x42,0x73, 0x5,0x42,0x71, 0x5,0x42,0x72, 0x6,0x58,0x38, 0x6,0x62,0x3e, 0x5,0x49,0x75, 0x4,0x47,0x39, 0x6,0x62,0x40, 0x5,0x49,0x73, 0x5,0x49,0x74, 0x6,0x62,0x3d, 0x6,0x62,0x41, 0x6,0x62,0x3c, 0x6,0x62,0x3f, 0x7,0x28,0x66, 0x5,0x50,0x75, 0x7,0x28,0x67, 0x5,0x50,0x74, 0x5,0x50,0x70, 0x5,0x50,0x6f, 0x4,0x4d,0x50, 0x4,0x4d,0x52, 0x4,0x4d,0x4d, 0x7,0x28,0x69, 0x4,0x4d,0x54, 0x5,0x50,0x72, 0x7,0x28,0x68, 0x7,0x28,0x6a, 0x5,0x50,0x71, 0x7,0x28,0x64, 0x7,0x28,0x65, 0x5,0x50,0x73, 0x7,0x33,0x38, 0x7,0x33,0x37, 0x4,0x53,0x5f, 0x5,0x58,0x36, 0x4,0x53,0x63, 0x5,0x58,0x39, 0x5,0x58,0x3b, 0x4,0x53,0x60, 0x7,0x33,0x36, 0x7,0x33,0x35, 0x5,0x58,0x37, 0x5,0x58,0x38, 0x5,0x58,0x3a, 0x7,0x33,0x39, 0x5,0x5e,0x46, 0x7,0x3b,0x6d, 0x7,0x3b,0x73, 0x7,0x3b,0x6c, 0x5,0x5e,0x4a, 0x5,0x5e,0x49, 0x7,0x3b,0x6e, 0x7,0x33,0x3a, 0x5,0x5e,0x48, 0x7,0x3b,0x6f, 0x7,0x3b,0x70, 0x7,0x3b,0x71, 0x4,0x58,0x6c, 0x7,0x3b,0x74, 0x7,0x3b,0x72, 0x5,0x5e,0x47, 0x7,0x43,0x27, 0x7,0x43,0x28, 0x4,0x5d,0x52, 0x7,0x43,0x26, 0x7,0x43,0x29, 0x4,0x61,0x35, 0x5,0x69,0x4c, 0x4,0x61,0x32, 0x4,0x61,0x33, 0x7,0x4a,0x21, 0x7,0x4a,0x22, 0x7,0x4a,0x23, 0x7,0x4a,0x24, 0x4,0x61,0x36, 0x7,0x50,0x2a, 0x5,0x71,0x37, 0x7,0x55,0x29, 0x5,0x74,0x3a, 0x4,0x69,0x44, 0x7,0x5c,0x65, 0x5,0x78,0x30, 0x7,0x62,0x63, 0x4,0x6d,0x60, 0x7,0x64,0x60, 0x7,0x64,0x61, 0x5,0x7b,0x69, 0x7,0x65,0x43, 0x5,0x23,0x27, 0x5,0x23,0x28, 0x6,0x2e,0x30, 0x6,0x3c,0x33, 0x4,0x30,0x21, 0x4,0x2f,0x7b, 0x4,0x2f,0x7a, 0x4,0x30,0x22, 0x5,0x30,0x43, 0x6,0x3c,0x30, 0x6,0x3c,0x31, 0x6,0x3c,0x2f, 0x6,0x3c,0x32, 0x6,0x3c,0x2e, 0x4,0x35,0x40, 0x6,0x44,0x6a, 0x6,0x44,0x73, 0x4,0x35,0x3e, 0x6,0x44,0x6f, 0x5,0x35,0x5c, 0x5,0x35,0x59, 0x6,0x44,0x71, 0x4,0x35,0x42, 0x5,0x35,0x54, 0x4,0x35,0x46, 0x6,0x44,0x79, 0x5,0x35,0x55, 0x6,0x44,0x77, 0x6,0x44,0x6b, 0x6,0x44,0x78, 0x5,0x35,0x58, 0x6,0x44,0x74, 0x6,0x44,0x75, 0x6,0x44,0x6e, 0x6,0x44,0x7a, 0xf,0x38,0x50, 0xf,0x38,0x51, 0xf,0x38,0x53, 0xf,0x38,0x54, 0xf,0x38,0x55, 0xf,0x38,0x56, 0x6,0x44,0x72, 0x6,0x44,0x69, 0x6,0x44,0x68, 0x6,0x44,0x76, 0x6,0x44,0x6c, 0x5,0x35,0x5a, 0x6,0x4e,0x74, 0x4,0x3b,0x32, 0x4,0x3b,0x2e, 0x5,0x3c,0x3b, 0x6,0x4e,0x6f, 0x6,0x4e,0x6e, 0x6,0x4e,0x71, 0x6,0x4e,0x6a, 0x4,0x3b,0x2d, 0x6,0x4e,0x78, 0x4,0x3b,0x38, 0x4,0x3b,0x39, 0x5,0x3c,0x3c, 0x6,0x4e,0x6d, 0x6,0x4e,0x76, 0x6,0x4e,0x70, 0x6,0x4e,0x77, 0x4,0x3b,0x37, 0x5,0x3c,0x39, 0x5,0x3c,0x3a, 0xf,0x3f,0x34, 0xf,0x3f,0x35, 0xf,0x3f,0x36, 0xf,0x3f,0x37, 0xf,0x3f,0x38, 0xf,0x3f,0x39, 0xf,0x3f,0x3a, 0xf,0x3f,0x3c, 0x6,0x4e,0x72, 0x6,0x4e,0x75, 0x6,0x4e,0x6c, 0x6,0x4e,0x79, 0x6,0x4e,0x73, 0x5,0x42,0x75, 0x4,0x40,0x68, 0x4,0x40,0x6a, 0x6,0x58,0x46, 0x5,0x42,0x76, 0x5,0x3c,0x3d, 0x5,0x42,0x79, 0x4,0x40,0x71, 0x4,0x40,0x70, 0x6,0x58,0x40, 0x6,0x58,0x4b, 0x6,0x58,0x3d, 0x6,0x58,0x49, 0x4,0x40,0x69, 0x4,0x40,0x6b, 0x5,0x42,0x7c, 0x5,0x42,0x74, 0x4,0x40,0x73, 0x6,0x58,0x43, 0x6,0x58,0x3c, 0x6,0x58,0x47, 0x6,0x58,0x42, 0x6,0x58,0x3f, 0x4,0x40,0x72, 0x5,0x42,0x7a, 0x6,0x58,0x48, 0x5,0x42,0x78, 0x5,0x42,0x77, 0x6,0x58,0x44, 0xf,0x45,0x43, 0xf,0x45,0x45, 0xf,0x45,0x46, 0x6,0x58,0x4a, 0x5,0x42,0x7b, 0x6,0x58,0x39, 0x6,0x58,0x3b, 0x4,0x40,0x6f, 0x6,0x58,0x3a, 0x6,0x58,0x45, 0x6,0x58,0x3e, 0x6,0x62,0x4e, 0x4,0x47,0x3f, 0x5,0x49,0x7a, 0x4,0x47,0x3b, 0x5,0x49,0x78, 0x5,0x49,0x7b, 0x4,0x47,0x3e, 0x4,0x47,0x48, 0x6,0x62,0x42, 0x6,0x62,0x4c, 0x4,0x47,0x41, 0x6,0x62,0x53, 0x4,0x47,0x44, 0x6,0x62,0x4f, 0x4,0x47,0x47, 0x6,0x62,0x46, 0x5,0x49,0x79, 0x6,0x62,0x51, 0x6,0x62,0x45, 0x4,0x47,0x49, 0x6,0x62,0x50, 0x6,0x62,0x44, 0x5,0x49,0x76, 0x5,0x49,0x77, 0xf,0x4c,0x3d, 0xf,0x4c,0x3e, 0xf,0x4c,0x3f, 0xf,0x4c,0x40, 0xf,0x4c,0x42, 0xf,0x4c,0x43, 0xf,0x4c,0x44, 0xf,0x4c,0x45, 0x6,0x62,0x48, 0x4,0x47,0x4b, 0x6,0x62,0x4a, 0x5,0x42,0x7d, 0x6,0x62,0x4b, 0x6,0x62,0x4d, 0x6,0x62,0x43, 0x6,0x62,0x52, 0x6,0x62,0x49, 0x7,0x29,0x21, 0x5,0x51,0x2a, 0x7,0x28,0x6b, 0x5,0x50,0x7a, 0x5,0x51,0x22, 0x7,0x28,0x71, 0x7,0x28,0x74, 0x7,0x29,0x22, 0x7,0x28,0x7c, 0x7,0x28,0x70, 0x5,0x51,0x27, 0x4,0x4d,0x57, 0x5,0x51,0x29, 0x5,0x51,0x23, 0x5,0x50,0x7b, 0x5,0x50,0x7e, 0x7,0x28,0x78, 0x5,0x51,0x24, 0x4,0x4d,0x5d, 0x5,0x51,0x26, 0x4,0x4d,0x62, 0x7,0x29,0x24, 0x7,0x28,0x77, 0x7,0x28,0x6f, 0x5,0x50,0x78, 0x5,0x50,0x7c, 0x7,0x28,0x7d, 0x7,0x28,0x6d, 0x5,0x51,0x25, 0x5,0x50,0x7d, 0x5,0x50,0x77, 0x5,0x50,0x79, 0x5,0x50,0x76, 0xf,0x52,0x32, 0xf,0x52,0x33, 0xf,0x52,0x34, 0xf,0x52,0x35, 0xf,0x52,0x37, 0xf,0x52,0x39, 0xf,0x52,0x3a, 0x7,0x28,0x76, 0x7,0x28,0x75, 0x7,0x28,0x6c, 0x7,0x28,0x72, 0xf,0x52,0x38, 0x5,0x51,0x21, 0x7,0x28,0x7b, 0x7,0x28,0x6e, 0x5,0x51,0x28, 0x7,0x29,0x23, 0x7,0x28,0x7e, 0x7,0x28,0x7a, 0x7,0x28,0x73, 0x7,0x33,0x46, 0x5,0x58,0x40, 0x4,0x53,0x71, 0x7,0x33,0x52, 0x4,0x53,0x68, 0x4,0x53,0x65, 0x4,0x53,0x6c, 0x7,0x33,0x49, 0x7,0x33,0x51, 0x7,0x33,0x43, 0x5,0x58,0x3d, 0x7,0x33,0x42, 0x5,0x58,0x3c, 0x7,0x33,0x3c, 0x4,0x53,0x70, 0x4,0x53,0x67, 0x7,0x33,0x45, 0x4,0x53,0x6f, 0x7,0x33,0x3d, 0x4,0x53,0x6e, 0x7,0x33,0x47, 0x7,0x33,0x4e, 0x4,0x53,0x66, 0x7,0x33,0x50, 0x7,0x33,0x3e, 0x4,0x53,0x69, 0x7,0x33,0x3b, 0x7,0x33,0x53, 0x7,0x33,0x40, 0x7,0x33,0x3f, 0x7,0x33,0x48, 0x7,0x33,0x4a, 0x5,0x58,0x3f, 0x7,0x33,0x4c, 0x4,0x53,0x6d, 0x7,0x33,0x44, 0x5,0x58,0x3e, 0xf,0x57,0x6e, 0xf,0x57,0x6f, 0xf,0x57,0x70, 0xf,0x57,0x71, 0xf,0x57,0x72, 0xf,0x57,0x73, 0xf,0x57,0x74, 0xf,0x57,0x75, 0xf,0x57,0x76, 0xf,0x57,0x77, 0xf,0x57,0x78, 0x7,0x33,0x54, 0x7,0x33,0x41, 0x7,0x33,0x4b, 0x4,0x58,0x6e, 0x5,0x5e,0x52, 0x5,0x5e,0x51, 0x7,0x3b,0x7d, 0x4,0x58,0x6f, 0x5,0x5e,0x54, 0x4,0x58,0x71, 0x7,0x3b,0x79, 0x4,0x58,0x6d, 0x5,0x5e,0x4d, 0x5,0x5e,0x53, 0x5,0x5e,0x4e, 0x7,0x3b,0x76, 0x7,0x3c,0x25, 0x4,0x58,0x72, 0x7,0x43,0x2a, 0x5,0x5e,0x4f, 0x7,0x3c,0x21, 0x7,0x3b,0x77, 0x5,0x5e,0x56, 0x7,0x3c,0x27, 0x7,0x3b,0x7c, 0x7,0x3b,0x78, 0x5,0x5e,0x50, 0x4,0x58,0x74, 0x7,0x3b,0x7b, 0x7,0x3b,0x7e, 0x7,0x3c,0x22, 0x7,0x3c,0x23, 0x4,0x58,0x73, 0x5,0x5e,0x4b, 0x7,0x3c,0x26, 0x5,0x5e,0x4c, 0x7,0x3c,0x24, 0x7,0x3b,0x75, 0xf,0x5c,0x63, 0xf,0x5c,0x64, 0xf,0x5c,0x65, 0xf,0x5c,0x66, 0xf,0x5c,0x67, 0xf,0x5c,0x68, 0xf,0x5c,0x69, 0xf,0x5c,0x6a, 0xf,0x5c,0x6b, 0x7,0x3c,0x28, 0x7,0x3c,0x29, 0x7,0x3b,0x7a, 0x4,0x5d,0x5e, 0x4,0x5d,0x56, 0x7,0x43,0x37, 0x4,0x5d,0x58, 0x7,0x43,0x35, 0x5,0x64,0x68, 0x7,0x43,0x3a, 0x7,0x43,0x2b, 0x4,0x5d,0x60, 0x5,0x64,0x66, 0x5,0x58,0x41, 0x4,0x5d,0x59, 0x5,0x64,0x67, 0x7,0x43,0x38, 0x7,0x43,0x32, 0x5,0x64,0x64, 0x4,0x5d,0x53, 0x7,0x43,0x3b, 0x4,0x5d,0x55, 0x5,0x64,0x65, 0x4,0x5d,0x5d, 0x7,0x43,0x39, 0x7,0x43,0x2f, 0x7,0x43,0x33, 0x7,0x4a,0x2a, 0x7,0x43,0x30, 0x4,0x5d,0x5c, 0x7,0x43,0x34, 0x7,0x43,0x31, 0x7,0x43,0x3c, 0x7,0x43,0x2c, 0x7,0x43,0x2d, 0xf,0x60,0x72, 0xf,0x60,0x75, 0x7,0x43,0x36, 0x4,0x5d,0x5f, 0x7,0x43,0x2e, 0x5,0x69,0x4d, 0x5,0x69,0x4f, 0x7,0x4a,0x2f, 0x4,0x61,0x3e, 0x7,0x4a,0x2c, 0x7,0x4a,0x2e, 0x4,0x61,0x43, 0x4,0x61,0x39, 0x5,0x69,0x50, 0x4,0x61,0x41, 0x7,0x4a,0x34, 0x4,0x61,0x42, 0x5,0x69,0x4e, 0x4,0x61,0x3f, 0x7,0x4a,0x26, 0x7,0x4a,0x29, 0x7,0x43,0x3d, 0x7,0x4a,0x28, 0x7,0x4a,0x35, 0x7,0x50,0x33, 0x7,0x4a,0x33, 0x4,0x61,0x3c, 0x5,0x6d,0x60, 0x7,0x4a,0x27, 0xf,0x63,0x78, 0xf,0x63,0x79, 0xf,0x63,0x7a, 0x4,0x61,0x44, 0x7,0x4a,0x2b, 0x7,0x50,0x35, 0x7,0x4a,0x30, 0x7,0x4a,0x31, 0x7,0x4a,0x2d, 0x7,0x4a,0x32, 0x4,0x61,0x38, 0xf,0x60,0x74, 0x4,0x64,0x4a, 0x4,0x64,0x4b, 0x5,0x6d,0x62, 0x5,0x6d,0x61, 0x7,0x50,0x2d, 0x5,0x6d,0x63, 0x7,0x50,0x2f, 0x4,0x64,0x49, 0x7,0x50,0x2b, 0x5,0x69,0x53, 0x7,0x50,0x32, 0x7,0x50,0x2e, 0x7,0x50,0x34, 0x7,0x50,0x36, 0x7,0x50,0x2c, 0x7,0x50,0x30, 0xf,0x66,0x36, 0xf,0x66,0x37, 0xf,0x66,0x38, 0xf,0x66,0x39, 0x7,0x50,0x38, 0x7,0x50,0x37, 0x7,0x50,0x39, 0x7,0x55,0x2a, 0x4,0x67,0x42, 0x7,0x55,0x34, 0x7,0x55,0x2d, 0x7,0x55,0x33, 0x4,0x67,0x38, 0x7,0x55,0x2e, 0x5,0x71,0x3d, 0x7,0x55,0x2c, 0x7,0x55,0x2f, 0x4,0x67,0x3c, 0x5,0x71,0x3a, 0x5,0x71,0x39, 0x4,0x67,0x43, 0x7,0x59,0x3b, 0x7,0x59,0x35, 0x4,0x67,0x3a, 0x5,0x71,0x3c, 0x5,0x71,0x3b, 0x7,0x55,0x31, 0x7,0x55,0x2b, 0x7,0x55,0x30, 0x5,0x71,0x38, 0x7,0x55,0x35, 0x5,0x74,0x3b, 0x5,0x74,0x3d, 0x5,0x74,0x40, 0x5,0x76,0x4b, 0x4,0x69,0x47, 0x7,0x59,0x39, 0x4,0x69,0x4a, 0x5,0x74,0x3f, 0x4,0x69,0x49, 0x5,0x74,0x3e, 0x7,0x59,0x37, 0x7,0x59,0x40, 0x7,0x55,0x36, 0x5,0x74,0x3c, 0x7,0x59,0x36, 0x7,0x59,0x3a, 0x7,0x59,0x3f, 0x4,0x69,0x46, 0x7,0x59,0x3e, 0xf,0x69,0x72, 0xf,0x69,0x73, 0xf,0x69,0x74, 0x7,0x59,0x3c, 0x7,0x59,0x3d, 0x4,0x6a,0x7d, 0x4,0x6a,0x7e, 0x7,0x5c,0x66, 0x5,0x76,0x4e, 0x5,0x76,0x4d, 0x5,0x78,0x31, 0x7,0x5c,0x68, 0x7,0x5c,0x69, 0x7,0x5c,0x6a, 0xf,0x6a,0x74, 0xf,0x6a,0x75, 0x7,0x5c,0x67, 0x7,0x59,0x42, 0x7,0x5f,0x57, 0x7,0x5f,0x58, 0x7,0x5f,0x55, 0x4,0x6c,0x27, 0x7,0x5f,0x56, 0x7,0x5f,0x5a, 0xf,0x6b,0x65, 0xf,0x6b,0x66, 0x7,0x5f,0x54, 0x7,0x5f,0x59, 0x7,0x5f,0x5b, 0x4,0x6d,0x23, 0x7,0x61,0x4b, 0x5,0x79,0x4e, 0x7,0x61,0x4c, 0xf,0x6c,0x3a, 0xf,0x6c,0x3b, 0x7,0x61,0x4a, 0x5,0x7a,0x75, 0x7,0x62,0x65, 0x7,0x62,0x64, 0x5,0x7a,0x39, 0x4,0x6d,0x7e, 0x7,0x63,0x74, 0x7,0x64,0x62, 0x4,0x6e,0x3c, 0x7,0x64,0x44, 0x7,0x65,0x44, 0x7,0x66,0x50, 0x5,0x24,0x77, 0x4,0x30,0x24, 0x5,0x30,0x44, 0x5,0x30,0x45, 0x4,0x35,0x48, 0x4,0x35,0x49, 0x4,0x35,0x47, 0x6,0x44,0x7b, 0x4,0x3b,0x3a, 0x5,0x42,0x7e, 0x5,0x43,0x21, 0x6,0x58,0x4c, 0x4,0x47,0x4d, 0x5,0x51,0x2c, 0x4,0x4d,0x63, 0x5,0x51,0x2d, 0x5,0x51,0x2b, 0x5,0x58,0x42, 0x7,0x33,0x56, 0x7,0x33,0x55, 0x7,0x3c,0x2a, 0x5,0x5e,0x57, 0x7,0x43,0x3e, 0x7,0x4a,0x36, 0x7,0x4a,0x39, 0x5,0x69,0x54, 0x7,0x4a,0x37, 0x5,0x69,0x55, 0x7,0x4a,0x38, 0x7,0x50,0x3a, 0x7,0x4a,0x3a, 0x5,0x71,0x3e, 0x5,0x7a,0x76, 0x7,0x65,0x77, 0x6,0x34,0x55, 0x6,0x3c,0x35, 0x6,0x3c,0x34, 0xf,0x38,0x57, 0x4,0x3b,0x3b, 0x5,0x3c,0x3e, 0x6,0x4e,0x7b, 0xf,0x3f,0x3d, 0x5,0x43,0x22, 0x4,0x40,0x75, 0x6,0x5b,0x5f, 0x4,0x47,0x50, 0x6,0x62,0x54, 0x4,0x47,0x51, 0x7,0x29,0x28, 0x7,0x29,0x27, 0x7,0x29,0x25, 0x5,0x51,0x2f, 0x5,0x51,0x2e, 0x7,0x29,0x26, 0xf,0x52,0x3b, 0x5,0x58,0x43, 0x4,0x53,0x74, 0x7,0x33,0x57, 0x5,0x58,0x44, 0x7,0x2c,0x56, 0x5,0x5e,0x5a, 0x7,0x3c,0x2d, 0x5,0x5e,0x58, 0x7,0x3c,0x2c, 0x5,0x5e,0x59, 0x7,0x3c,0x2b, 0x5,0x64,0x69, 0x4,0x5d,0x63, 0x7,0x43,0x40, 0x4,0x5d,0x62, 0x5,0x5e,0x5b, 0x7,0x4a,0x3c, 0x5,0x69,0x57, 0x7,0x4a,0x3d, 0x7,0x43,0x41, 0x7,0x43,0x42, 0x5,0x69,0x56, 0x5,0x6d,0x66, 0x5,0x6d,0x65, 0x5,0x6d,0x67, 0xf,0x66,0x3a, 0x5,0x6d,0x64, 0xf,0x63,0x7b, 0x5,0x71,0x3f, 0x5,0x74,0x41, 0xf,0x6a,0x76, 0xf,0x6a,0x77, 0x5,0x78,0x32, 0x5,0x79,0x4f, 0x5,0x7a,0x77, 0x7,0x65,0x45, 0x6,0x25,0x54, 0x5,0x23,0x29, 0x5,0x2b,0x4a, 0x5,0x30,0x48, 0x5,0x30,0x47, 0x6,0x3c,0x37, 0x6,0x3c,0x36, 0x6,0x44,0x7e, 0x6,0x44,0x7c, 0x5,0x35,0x61, 0x6,0x45,0x21, 0x6,0x44,0x7d, 0x4,0x3b,0x3c, 0x6,0x4e,0x7c, 0x4,0x3b,0x3d, 0x5,0x3c,0x40, 0x5,0x3c,0x3f, 0x6,0x4e,0x7e, 0x5,0x3c,0x41, 0x6,0x4f,0x23, 0x6,0x4e,0x7d, 0xf,0x32,0x55, 0x4,0x40,0x77, 0x5,0x43,0x25, 0x4,0x40,0x76, 0x6,0x58,0x4e, 0x6,0x58,0x4f, 0x5,0x43,0x27, 0x5,0x43,0x23, 0x5,0x43,0x26, 0x6,0x58,0x4d, 0x6,0x4f,0x22, 0x5,0x43,0x24, 0x5,0x43,0x28, 0x6,0x62,0x55, 0x6,0x62,0x56, 0x4,0x47,0x53, 0x4,0x47,0x52, 0x6,0x62,0x59, 0x5,0x49,0x7d, 0x5,0x49,0x7c, 0x6,0x62,0x5b, 0x6,0x62,0x5a, 0x6,0x62,0x57, 0x6,0x62,0x58, 0x5,0x51,0x32, 0x4,0x4d,0x66, 0x7,0x29,0x29, 0x7,0x29,0x2b, 0x5,0x51,0x31, 0x5,0x51,0x33, 0x7,0x29,0x2d, 0x7,0x29,0x2c, 0x5,0x49,0x7e, 0x5,0x51,0x30, 0x7,0x29,0x2a, 0x5,0x4a,0x21, 0x7,0x29,0x2e, 0xf,0x52,0x3c, 0x5,0x58,0x47, 0x5,0x58,0x48, 0x5,0x58,0x46, 0x7,0x33,0x59, 0x4,0x53,0x76, 0x7,0x33,0x5a, 0x7,0x33,0x5c, 0x7,0x33,0x5b, 0x5,0x58,0x45, 0x7,0x33,0x58, 0x5,0x5e,0x5d, 0x5,0x5e,0x5e, 0x5,0x5e,0x5f, 0x5,0x5e,0x5c, 0x7,0x3c,0x30, 0x7,0x3c,0x2e, 0x7,0x3c,0x2f, 0x4,0x5d,0x65, 0x5,0x64,0x6a, 0x5,0x64,0x6b, 0x7,0x43,0x43, 0x7,0x43,0x44, 0x7,0x43,0x45, 0x4,0x61,0x47, 0x5,0x69,0x58, 0x5,0x58,0x49, 0x7,0x4a,0x3e, 0x4,0x61,0x49, 0x5,0x6d,0x6b, 0x5,0x6d,0x68, 0x7,0x50,0x3b, 0x5,0x6d,0x6a, 0x5,0x6d,0x69, 0x4,0x67,0x46, 0x5,0x71,0x40, 0x7,0x55,0x37, 0x7,0x55,0x38, 0x7,0x59,0x43, 0x7,0x5c,0x6c, 0x7,0x59,0x44, 0x7,0x59,0x45, 0x7,0x5c,0x6d, 0x7,0x5c,0x6e, 0x5,0x74,0x42, 0x7,0x5f,0x5c, 0x7,0x61,0x4d, 0x7,0x5f,0x5d, 0x5,0x79,0x50, 0x5,0x7a,0x3a, 0x7,0x65,0x46, 0x7,0x66,0x43, 0xf,0x28,0x6c, 0x5,0x2b,0x4b, 0x6,0x3c,0x38, 0xf,0x32,0x56, 0x5,0x35,0x64, 0x5,0x35,0x63, 0x4,0x35,0x4f, 0x5,0x35,0x62, 0x4,0x35,0x4e, 0x6,0x45,0x25, 0x6,0x45,0x23, 0x6,0x4f,0x25, 0x5,0x3c,0x42, 0x5,0x3c,0x46, 0x5,0x3c,0x44, 0x5,0x3c,0x48, 0x5,0x3c,0x45, 0x6,0x4f,0x28, 0x6,0x4f,0x26, 0x5,0x3c,0x47, 0x5,0x3c,0x43, 0x6,0x4f,0x27, 0x6,0x4f,0x24, 0xf,0x3f,0x3e, 0x4,0x40,0x7c, 0x4,0x40,0x7d, 0x4,0x40,0x7a, 0x6,0x58,0x52, 0x5,0x43,0x2b, 0x6,0x58,0x51, 0x5,0x43,0x2a, 0x4,0x40,0x79, 0x4,0x40,0x7b, 0x6,0x58,0x53, 0xf,0x45,0x47, 0x5,0x43,0x29, 0x6,0x62,0x61, 0x6,0x62,0x5c, 0x5,0x4a,0x25, 0x5,0x4a,0x23, 0x5,0x4a,0x22, 0x6,0x62,0x5f, 0x5,0x4a,0x24, 0x6,0x62,0x5e, 0x6,0x62,0x60, 0xf,0x4c,0x48, 0x6,0x62,0x5d, 0x6,0x62,0x62, 0xf,0x4c,0x49, 0x5,0x51,0x35, 0x5,0x51,0x34, 0x4,0x4d,0x69, 0x5,0x51,0x37, 0x5,0x51,0x36, 0x5,0x51,0x38, 0x4,0x4d,0x6a, 0x7,0x29,0x2f, 0x7,0x29,0x30, 0x4,0x4d,0x6b, 0x7,0x29,0x31, 0x7,0x33,0x64, 0x5,0x58,0x4b, 0x7,0x33,0x5e, 0x7,0x33,0x60, 0x7,0x33,0x61, 0x4,0x53,0x78, 0x5,0x58,0x4a, 0x7,0x33,0x62, 0x5,0x58,0x4c, 0x7,0x33,0x5f, 0xf,0x57,0x7a, 0x7,0x33,0x5d, 0x7,0x33,0x63, 0x4,0x58,0x79, 0x5,0x5e,0x63, 0x7,0x3c,0x31, 0x5,0x5e,0x62, 0x4,0x58,0x78, 0x5,0x5e,0x60, 0x5,0x5e,0x64, 0x5,0x5e,0x61, 0xf,0x5c,0x6c, 0x7,0x43,0x46, 0x4,0x5d,0x67, 0x7,0x43,0x47, 0x4,0x5d,0x66, 0x5,0x64,0x6c, 0x7,0x4a,0x3f, 0x5,0x64,0x6d, 0x5,0x69,0x5b, 0x7,0x4a,0x40, 0x5,0x69,0x5a, 0x7,0x4a,0x43, 0x7,0x50,0x3d, 0x7,0x4a,0x42, 0x5,0x69,0x59, 0x5,0x6d,0x6d, 0x5,0x6d,0x6c, 0x7,0x50,0x3c, 0x5,0x71,0x42, 0x5,0x6d,0x6e, 0x5,0x71,0x41, 0x7,0x55,0x39, 0x7,0x59,0x46, 0x7,0x5c,0x70, 0x7,0x5c,0x6f, 0x5,0x7a,0x78, 0x5,0x2b,0x4c, 0x4,0x2b,0x4a, 0x6,0x34,0x56, 0xf,0x2d,0x4a, 0x4,0x30,0x26, 0x6,0x3c,0x39, 0x5,0x30,0x49, 0x5,0x30,0x4a, 0xf,0x32,0x57, 0xf,0x32,0x58, 0x6,0x3c,0x3a, 0x6,0x45,0x2a, 0x6,0x45,0x2c, 0x6,0x45,0x27, 0x6,0x45,0x28, 0x6,0x45,0x26, 0x6,0x45,0x2b, 0x5,0x35,0x65, 0xf,0x38,0x59, 0xf,0x38,0x5a, 0xf,0x38,0x5b, 0xf,0x38,0x5c, 0xf,0x38,0x5d, 0xf,0x38,0x5e, 0xf,0x38,0x5f, 0xf,0x38,0x60, 0x6,0x45,0x2d, 0x4,0x35,0x53, 0x6,0x45,0x29, 0x4,0x35,0x52, 0x6,0x4f,0x2b, 0x4,0x3b,0x40, 0x5,0x3c,0x49, 0x5,0x3c,0x4b, 0x6,0x4f,0x2e, 0x6,0x4f,0x2c, 0x6,0x4f,0x2d, 0x6,0x58,0x57, 0x5,0x3c,0x4a, 0xf,0x3f,0x3f, 0xf,0x3f,0x41, 0xf,0x3f,0x42, 0xf,0x3f,0x43, 0xf,0x3f,0x44, 0xf,0x3f,0x45, 0x6,0x4f,0x2f, 0x6,0x4f,0x2a, 0x5,0x3c,0x4d, 0x4,0x41,0x22, 0x6,0x58,0x54, 0x6,0x58,0x59, 0x6,0x58,0x56, 0x5,0x43,0x30, 0x5,0x43,0x2c, 0x6,0x58,0x5e, 0x6,0x58,0x55, 0x5,0x43,0x2f, 0x5,0x43,0x31, 0x5,0x43,0x32, 0x6,0x58,0x58, 0x6,0x58,0x60, 0x6,0x58,0x62, 0x5,0x43,0x33, 0x6,0x58,0x5f, 0xf,0x45,0x48, 0xf,0x45,0x49, 0xf,0x45,0x4a, 0xf,0x45,0x4b, 0xf,0x45,0x4c, 0xf,0x45,0x4d, 0xf,0x45,0x4e, 0x6,0x58,0x61, 0xf,0x3f,0x40, 0x6,0x58,0x5b, 0x5,0x43,0x2e, 0xf,0x46,0x34, 0x6,0x62,0x65, 0x4,0x47,0x55, 0x5,0x4a,0x26, 0x6,0x62,0x64, 0x6,0x62,0x66, 0x6,0x62,0x6c, 0x6,0x62,0x63, 0x6,0x62,0x69, 0x5,0x4a,0x27, 0x4,0x47,0x57, 0xf,0x4c,0x4d, 0xf,0x4c,0x4e, 0xf,0x4c,0x4f, 0xf,0x4c,0x51, 0xf,0x4c,0x50, 0xf,0x4c,0x4c, 0x6,0x62,0x6b, 0x6,0x58,0x5d, 0x7,0x29,0x33, 0x7,0x29,0x35, 0x5,0x4a,0x28, 0x4,0x4d,0x6f, 0x7,0x29,0x34, 0x5,0x51,0x3a, 0x4,0x4d,0x70, 0x5,0x51,0x3b, 0x7,0x29,0x39, 0x7,0x29,0x38, 0x7,0x29,0x32, 0xf,0x52,0x3d, 0xf,0x52,0x3e, 0xf,0x52,0x3f, 0x7,0x29,0x37, 0xf,0x4c,0x4b, 0x7,0x33,0x6a, 0x5,0x58,0x4e, 0x7,0x33,0x67, 0x7,0x33,0x66, 0x5,0x58,0x4f, 0x7,0x33,0x6b, 0x7,0x33,0x6e, 0x4,0x53,0x7c, 0x7,0x33,0x68, 0x5,0x58,0x4d, 0x6,0x62,0x68, 0xf,0x54,0x32, 0xf,0x57,0x7b, 0xf,0x57,0x7c, 0xf,0x57,0x7d, 0xf,0x57,0x7e, 0xf,0x58,0x21, 0xf,0x58,0x22, 0x7,0x33,0x6d, 0x7,0x33,0x6c, 0x7,0x33,0x65, 0x7,0x33,0x69, 0x5,0x58,0x50, 0x7,0x3c,0x32, 0x5,0x5e,0x65, 0x5,0x5b,0x2d, 0x5,0x5e,0x67, 0x5,0x58,0x52, 0x5,0x5e,0x66, 0x4,0x58,0x7b, 0x7,0x3c,0x38, 0x7,0x3c,0x34, 0x7,0x3c,0x36, 0x7,0x3c,0x37, 0x7,0x3c,0x35, 0xf,0x5c,0x6e, 0xf,0x5c,0x70, 0xf,0x5c,0x6f, 0x7,0x43,0x4b, 0x5,0x64,0x73, 0x7,0x43,0x4e, 0x5,0x64,0x6f, 0x7,0x43,0x49, 0x7,0x43,0x4a, 0x7,0x43,0x51, 0x5,0x64,0x71, 0x5,0x64,0x6e, 0x5,0x64,0x72, 0x7,0x43,0x4d, 0x7,0x43,0x4c, 0xf,0x60,0x76, 0xf,0x60,0x77, 0xf,0x60,0x78, 0xf,0x60,0x79, 0xf,0x60,0x7b, 0xf,0x60,0x7c, 0x7,0x43,0x48, 0x7,0x43,0x50, 0x5,0x64,0x70, 0x7,0x4a,0x47, 0x7,0x4a,0x4b, 0x5,0x69,0x5d, 0x5,0x64,0x74, 0x7,0x4a,0x4a, 0x7,0x43,0x4f, 0x5,0x69,0x5c, 0x4,0x61,0x4b, 0x7,0x4a,0x48, 0x5,0x69,0x5e, 0x7,0x4a,0x4d, 0x7,0x4a,0x4c, 0x5,0x69,0x60, 0x7,0x4a,0x44, 0x7,0x4a,0x49, 0x7,0x4a,0x46, 0xf,0x63,0x7c, 0xf,0x63,0x7d, 0xf,0x63,0x7e, 0xf,0x64,0x21, 0x7,0x4a,0x4e, 0x7,0x4a,0x45, 0x5,0x69,0x5f, 0x4,0x64,0x51, 0x5,0x6d,0x70, 0x4,0x64,0x50, 0x5,0x6d,0x6f, 0x7,0x50,0x3e, 0x7,0x50,0x40, 0xf,0x66,0x3b, 0xf,0x66,0x3c, 0xf,0x66,0x3d, 0xf,0x66,0x3e, 0xf,0x66,0x3f, 0x7,0x50,0x3f, 0x5,0x71,0x43, 0x4,0x67,0x47, 0x5,0x71,0x44, 0x5,0x71,0x45, 0xf,0x68,0x4e, 0xf,0x68,0x4f, 0x7,0x55,0x3b, 0x7,0x59,0x47, 0x5,0x74,0x45, 0x5,0x74,0x44, 0xf,0x69,0x76, 0xf,0x69,0x77, 0xf,0x69,0x78, 0x7,0x59,0x4a, 0x7,0x59,0x48, 0x7,0x59,0x49, 0xf,0x68,0x4d, 0x7,0x5c,0x71, 0x4,0x6b,0x22, 0x5,0x74,0x43, 0x7,0x5c,0x72, 0xf,0x6a,0x78, 0x7,0x5c,0x73, 0x7,0x5f,0x5e, 0x7,0x5f,0x60, 0x7,0x5f,0x5f, 0x7,0x62,0x66, 0x6,0x2e,0x31, 0x6,0x34,0x57, 0x6,0x34,0x58, 0x5,0x35,0x66, 0xf,0x38,0x61, 0x6,0x4f,0x30, 0x4,0x3b,0x44, 0x6,0x58,0x63, 0xf,0x45,0x4f, 0x5,0x4a,0x2a, 0xf,0x4c,0x52, 0x7,0x29,0x3a, 0x5,0x58,0x54, 0x5,0x58,0x53, 0xf,0x58,0x23, 0x7,0x33,0x6f, 0x5,0x5e,0x69, 0x5,0x5e,0x6a, 0x5,0x5e,0x68, 0xf,0x5c,0x71, 0x5,0x64,0x75, 0x7,0x43,0x53, 0x7,0x4a,0x50, 0x7,0x4a,0x4f, 0x5,0x71,0x46, 0x7,0x5c,0x74, 0x6,0x2e,0x32, 0x6,0x2e,0x33, 0x6,0x34,0x59, 0xf,0x2d,0x4b, 0xf,0x2d,0x4d, 0xf,0x2d,0x4e, 0xf,0x2d,0x4f, 0xf,0x2d,0x50, 0x4,0x2b,0x4b, 0x5,0x30,0x4d, 0x6,0x3c,0x3e, 0x6,0x3c,0x3d, 0x5,0x30,0x4e, 0x6,0x3c,0x3c, 0x4,0x30,0x29, 0xf,0x32,0x59, 0xf,0x32,0x5a, 0xf,0x32,0x5b, 0xf,0x32,0x5c, 0xf,0x32,0x5d, 0x5,0x35,0x6d, 0x6,0x45,0x30, 0x5,0x35,0x67, 0x4,0x35,0x57, 0x5,0x35,0x6a, 0x5,0x35,0x6f, 0x5,0x35,0x6e, 0x4,0x35,0x58, 0x6,0x45,0x2e, 0x6,0x45,0x2f, 0x5,0x35,0x6b, 0x5,0x35,0x68, 0xf,0x38,0x63, 0xf,0x38,0x64, 0xf,0x38,0x65, 0xf,0x38,0x66, 0xf,0x38,0x68, 0xf,0x38,0x69, 0xf,0x38,0x62, 0x5,0x35,0x6c, 0x5,0x35,0x69, 0xf,0x38,0x67, 0x5,0x3c,0x51, 0x5,0x3c,0x50, 0x5,0x3c,0x54, 0x5,0x3c,0x4f, 0x6,0x4f,0x34, 0x6,0x4f,0x31, 0x5,0x43,0x39, 0x5,0x3c,0x53, 0x5,0x3c,0x4e, 0x6,0x4f,0x33, 0x4,0x3b,0x46, 0x5,0x3c,0x55, 0x6,0x58,0x64, 0x6,0x4f,0x35, 0xf,0x3f,0x47, 0xf,0x3f,0x48, 0xf,0x3f,0x49, 0xf,0x3f,0x4a, 0xf,0x3f,0x4b, 0xf,0x3f,0x4c, 0xf,0x3f,0x4f, 0xf,0x3f,0x50, 0xf,0x3f,0x51, 0x6,0x4f,0x32, 0xf,0x3f,0x4e, 0x6,0x58,0x66, 0x5,0x43,0x36, 0x4,0x41,0x23, 0x6,0x58,0x68, 0x4,0x41,0x25, 0x5,0x43,0x3b, 0x5,0x43,0x35, 0x5,0x43,0x3d, 0x5,0x43,0x37, 0x4,0x41,0x24, 0x6,0x58,0x6a, 0x6,0x58,0x69, 0x5,0x43,0x3a, 0xf,0x45,0x50, 0xf,0x45,0x51, 0xf,0x45,0x52, 0xf,0x45,0x53, 0xf,0x45,0x54, 0xf,0x45,0x55, 0xf,0x45,0x56, 0xf,0x45,0x57, 0x6,0x58,0x65, 0x6,0x58,0x67, 0x6,0x62,0x6d, 0xf,0x3f,0x4d, 0x6,0x62,0x6e, 0x4,0x47,0x5c, 0x5,0x4a,0x2c, 0x5,0x4a,0x30, 0x6,0x62,0x72, 0x5,0x4a,0x2b, 0x5,0x4a,0x2e, 0x5,0x4a,0x31, 0x6,0x62,0x71, 0x6,0x62,0x6f, 0x5,0x4a,0x33, 0x4,0x47,0x5d, 0x5,0x4a,0x2f, 0x6,0x62,0x76, 0x5,0x4a,0x2d, 0x6,0x62,0x73, 0xf,0x4c,0x53, 0xf,0x4c,0x54, 0xf,0x4c,0x55, 0xf,0x4c,0x56, 0xf,0x4c,0x57, 0xf,0x4c,0x58, 0xf,0x4c,0x59, 0x6,0x62,0x70, 0x5,0x51,0x42, 0x5,0x51,0x3c, 0x4,0x4d,0x72, 0x5,0x51,0x3f, 0x5,0x51,0x3e, 0x5,0x51,0x3d, 0x5,0x51,0x40, 0x7,0x29,0x3f, 0x5,0x51,0x46, 0x5,0x51,0x43, 0x7,0x29,0x41, 0x5,0x51,0x41, 0x7,0x29,0x3c, 0x7,0x29,0x40, 0x7,0x29,0x3e, 0x6,0x62,0x74, 0x7,0x29,0x42, 0x7,0x33,0x72, 0x5,0x51,0x45, 0x5,0x51,0x44, 0xf,0x52,0x40, 0xf,0x52,0x41, 0x7,0x29,0x43, 0x7,0x29,0x3b, 0xf,0x58,0x2d, 0x4,0x54,0x23, 0x4,0x54,0x24, 0x4,0x54,0x28, 0x7,0x33,0x74, 0x5,0x58,0x59, 0x4,0x54,0x21, 0x4,0x54,0x22, 0x4,0x54,0x27, 0x7,0x33,0x75, 0x4,0x54,0x25, 0x7,0x33,0x71, 0x7,0x33,0x70, 0x5,0x58,0x58, 0x5,0x58,0x5a, 0x7,0x33,0x76, 0xf,0x58,0x24, 0xf,0x58,0x26, 0xf,0x58,0x27, 0xf,0x58,0x28, 0xf,0x58,0x29, 0xf,0x58,0x2a, 0xf,0x58,0x2b, 0xf,0x58,0x2c, 0xf,0x58,0x2e, 0x7,0x33,0x78, 0x7,0x33,0x77, 0x5,0x58,0x5b, 0x5,0x58,0x56, 0x5,0x58,0x57, 0x5,0x5e,0x6f, 0x5,0x5e,0x71, 0x4,0x59,0x22, 0x5,0x5e,0x70, 0x4,0x59,0x24, 0x4,0x59,0x21, 0x5,0x5e,0x72, 0x4,0x58,0x7e, 0x5,0x5e,0x6c, 0x4,0x59,0x23, 0x5,0x5e,0x6e, 0x5,0x5e,0x6b, 0x7,0x3c,0x3a, 0x5,0x5e,0x73, 0xf,0x58,0x25, 0xf,0x5c,0x72, 0xf,0x5c,0x73, 0xf,0x5c,0x74, 0xf,0x5c,0x75, 0xf,0x5c,0x76, 0x7,0x3c,0x39, 0x5,0x64,0x79, 0x5,0x64,0x7c, 0x4,0x5d,0x6b, 0x7,0x43,0x57, 0x7,0x43,0x56, 0x5,0x64,0x76, 0x5,0x64,0x7a, 0x5,0x64,0x78, 0x5,0x64,0x77, 0x5,0x64,0x7d, 0x5,0x64,0x7e, 0x7,0x43,0x5b, 0x7,0x43,0x5a, 0x5,0x64,0x7b, 0xf,0x60,0x7d, 0x7,0x43,0x58, 0x7,0x43,0x55, 0x7,0x43,0x59, 0x7,0x43,0x54, 0x5,0x58,0x5d, 0x5,0x69,0x62, 0x5,0x69,0x66, 0x5,0x69,0x68, 0x4,0x61,0x4e, 0x4,0x61,0x4c, 0x5,0x69,0x63, 0x5,0x69,0x67, 0x5,0x69,0x65, 0x5,0x69,0x61, 0x7,0x4a,0x52, 0x5,0x69,0x69, 0x5,0x69,0x64, 0xf,0x64,0x23, 0xf,0x64,0x24, 0xf,0x64,0x25, 0x7,0x4a,0x51, 0x7,0x4a,0x53, 0x4,0x64,0x52, 0x4,0x64,0x54, 0x4,0x64,0x58, 0x4,0x64,0x57, 0x5,0x6d,0x71, 0x7,0x50,0x41, 0x7,0x50,0x43, 0x5,0x6d,0x72, 0x7,0x50,0x42, 0xf,0x66,0x40, 0xf,0x66,0x41, 0xf,0x66,0x42, 0x4,0x67,0x49, 0x5,0x71,0x48, 0x5,0x71,0x49, 0x7,0x55,0x3f, 0x7,0x55,0x3d, 0x7,0x55,0x3c, 0x7,0x55,0x3e, 0x5,0x71,0x47, 0x5,0x74,0x46, 0x5,0x74,0x49, 0x4,0x69,0x4d, 0x5,0x74,0x48, 0x5,0x74,0x47, 0xf,0x69,0x79, 0x5,0x76,0x4f, 0x5,0x76,0x50, 0xf,0x6a,0x79, 0x7,0x59,0x4b, 0x7,0x5c,0x75, 0x7,0x5c,0x76, 0x5,0x78,0x33, 0x5,0x78,0x34, 0x5,0x78,0x35, 0x4,0x6d,0x26, 0x7,0x61,0x4e, 0x5,0x7a,0x79, 0x5,0x7b,0x49, 0x6,0x2e,0x35, 0x6,0x2e,0x34, 0x6,0x34,0x5b, 0x5,0x2b,0x4d, 0xf,0x2d,0x51, 0x6,0x34,0x5a, 0x6,0x3c,0x41, 0x4,0x30,0x2b, 0x6,0x3c,0x42, 0x6,0x3c,0x40, 0x5,0x30,0x50, 0x5,0x30,0x4f, 0x6,0x3c,0x3f, 0x6,0x3c,0x43, 0x4,0x35,0x5f, 0x6,0x45,0x33, 0x4,0x35,0x5a, 0x5,0x35,0x73, 0x6,0x45,0x37, 0x5,0x35,0x77, 0x6,0x45,0x3a, 0x5,0x35,0x71, 0x5,0x35,0x75, 0x6,0x45,0x3c, 0x6,0x45,0x3d, 0x5,0x35,0x74, 0x6,0x45,0x3b, 0x6,0x45,0x32, 0x6,0x45,0x36, 0xf,0x38,0x6a, 0x6,0x45,0x31, 0x6,0x45,0x35, 0x6,0x45,0x39, 0x5,0x35,0x76, 0x5,0x35,0x70, 0x6,0x45,0x34, 0x5,0x3c,0x60, 0x5,0x3c,0x57, 0x5,0x3c,0x58, 0x5,0x3c,0x5b, 0x6,0x4f,0x3b, 0x5,0x3c,0x56, 0x6,0x4f,0x38, 0x4,0x3b,0x4e, 0x5,0x3c,0x5d, 0x5,0x3c,0x59, 0x5,0x3c,0x61, 0x5,0x3c,0x5a, 0x6,0x4f,0x39, 0x6,0x58,0x79, 0x5,0x3c,0x62, 0xf,0x3f,0x54, 0x6,0x4f,0x37, 0xf,0x3f,0x52, 0x6,0x4f,0x3a, 0x5,0x3c,0x5e, 0x5,0x43,0x41, 0x5,0x43,0x3f, 0x6,0x58,0x71, 0x5,0x43,0x40, 0x5,0x43,0x42, 0x6,0x58,0x74, 0x6,0x58,0x70, 0x5,0x43,0x47, 0x5,0x43,0x45, 0x6,0x58,0x6e, 0x6,0x58,0x6d, 0x5,0x43,0x3e, 0x6,0x58,0x6f, 0x6,0x58,0x72, 0x6,0x58,0x76, 0x5,0x43,0x4a, 0x6,0x58,0x6c, 0x6,0x58,0x77, 0x5,0x43,0x43, 0x5,0x43,0x4c, 0x5,0x43,0x48, 0x6,0x58,0x73, 0x5,0x43,0x49, 0x5,0x43,0x46, 0x6,0x58,0x75, 0x5,0x4a,0x35, 0xf,0x45,0x59, 0x6,0x58,0x78, 0x6,0x58,0x6b, 0x6,0x63,0x22, 0x5,0x4a,0x43, 0x4,0x47,0x60, 0x5,0x4a,0x37, 0x5,0x4a,0x3f, 0x5,0x4a,0x36, 0x5,0x51,0x4e, 0x5,0x4a,0x3b, 0x6,0x62,0x77, 0x6,0x62,0x7b, 0x5,0x4a,0x42, 0x5,0x4a,0x3c, 0x5,0x4a,0x39, 0x5,0x4a,0x40, 0x5,0x4a,0x41, 0x5,0x4a,0x3d, 0x5,0x43,0x44, 0x5,0x4a,0x38, 0x5,0x4a,0x44, 0x6,0x62,0x7e, 0x5,0x4a,0x46, 0x6,0x62,0x79, 0x5,0x4a,0x47, 0xf,0x4c,0x5a, 0xf,0x4c,0x5b, 0x6,0x62,0x78, 0x6,0x62,0x7a, 0x6,0x62,0x7d, 0x6,0x63,0x21, 0x6,0x62,0x7c, 0x5,0x4a,0x3a, 0x7,0x29,0x46, 0x4,0x4d,0x7a, 0x5,0x51,0x4c, 0x5,0x51,0x47, 0x5,0x51,0x4a, 0x5,0x51,0x4f, 0x7,0x29,0x45, 0x7,0x29,0x49, 0x4,0x4d,0x7c, 0x7,0x29,0x4d, 0x4,0x4d,0x7b, 0x5,0x51,0x4b, 0x5,0x51,0x4d, 0x4,0x4e,0x24, 0x5,0x51,0x51, 0x5,0x51,0x52, 0x4,0x47,0x63, 0x7,0x29,0x4f, 0x5,0x51,0x49, 0x7,0x29,0x4b, 0xf,0x52,0x42, 0xf,0x52,0x43, 0xf,0x52,0x44, 0xf,0x52,0x45, 0x7,0x29,0x48, 0x7,0x29,0x4c, 0x7,0x29,0x47, 0x7,0x29,0x4a, 0x5,0x51,0x50, 0x5,0x51,0x54, 0x5,0x51,0x55, 0x5,0x4a,0x45, 0x7,0x34,0x21, 0x5,0x58,0x60, 0x5,0x4a,0x48, 0x5,0x58,0x69, 0x4,0x54,0x2a, 0x7,0x33,0x7a, 0x5,0x58,0x63, 0x7,0x33,0x7e, 0x7,0x34,0x23, 0x7,0x33,0x7c, 0x5,0x58,0x5f, 0x7,0x33,0x7b, 0x7,0x34,0x25, 0x5,0x51,0x53, 0x7,0x34,0x26, 0x5,0x58,0x67, 0x5,0x58,0x68, 0x5,0x58,0x5e, 0x5,0x58,0x61, 0x7,0x33,0x7d, 0x5,0x58,0x65, 0x5,0x58,0x64, 0x7,0x34,0x24, 0x4,0x54,0x2b, 0x5,0x58,0x66, 0x4,0x54,0x2c, 0xf,0x58,0x31, 0xf,0x58,0x32, 0x7,0x34,0x22, 0x5,0x5e,0x7a, 0x5,0x5e,0x7d, 0x5,0x5e,0x75, 0x7,0x3c,0x40, 0x5,0x5e,0x76, 0x5,0x5e,0x7c, 0x5,0x5e,0x78, 0x4,0x59,0x29, 0x7,0x3c,0x3e, 0x7,0x43,0x67, 0x7,0x3c,0x43, 0x5,0x5e,0x7e, 0x4,0x59,0x2e, 0x7,0x3c,0x3b, 0x7,0x3c,0x42, 0x7,0x3c,0x44, 0x5,0x5e,0x79, 0x4,0x59,0x27, 0x7,0x3c,0x41, 0x7,0x34,0x27, 0x7,0x3c,0x3f, 0x4,0x59,0x2f, 0xf,0x5c,0x77, 0x7,0x3c,0x3d, 0xf,0x5c,0x79, 0x5,0x5e,0x77, 0x5,0x5e,0x74, 0x7,0x43,0x62, 0x4,0x5d,0x70, 0x7,0x43,0x66, 0x4,0x5d,0x6f, 0x5,0x65,0x21, 0x5,0x65,0x22, 0x5,0x65,0x2d, 0x5,0x65,0x26, 0x4,0x5d,0x71, 0x5,0x65,0x2c, 0x5,0x65,0x28, 0x7,0x43,0x5f, 0x5,0x69,0x70, 0x7,0x43,0x65, 0x7,0x43,0x5c, 0x5,0x65,0x2e, 0x7,0x43,0x5e, 0x5,0x65,0x24, 0x7,0x43,0x61, 0x5,0x65,0x23, 0x5,0x65,0x29, 0x4,0x5f,0x33, 0x4,0x5d,0x76, 0x5,0x65,0x25, 0xf,0x60,0x7e, 0xf,0x61,0x21, 0xf,0x61,0x22, 0xf,0x61,0x23, 0xf,0x61,0x24, 0xf,0x61,0x25, 0x7,0x43,0x6b, 0x5,0x65,0x27, 0x7,0x43,0x60, 0x7,0x43,0x69, 0x7,0x43,0x68, 0x7,0x43,0x6a, 0x7,0x43,0x5d, 0x5,0x65,0x2b, 0x7,0x43,0x63, 0x7,0x3c,0x3c, 0x5,0x65,0x2f, 0x5,0x69,0x6a, 0x7,0x4a,0x65, 0x5,0x69,0x6f, 0x5,0x69,0x71, 0x7,0x4a,0x68, 0x5,0x69,0x74, 0x7,0x4a,0x5b, 0x5,0x65,0x2a, 0x5,0x69,0x6e, 0x7,0x4a,0x58, 0x5,0x69,0x6d, 0x5,0x69,0x72, 0x4,0x61,0x55, 0x7,0x4a,0x54, 0x4,0x5d,0x73, 0x7,0x4a,0x59, 0x7,0x43,0x64, 0x7,0x4a,0x5e, 0x5,0x69,0x73, 0x7,0x4a,0x5a, 0x7,0x4a,0x66, 0x7,0x4a,0x55, 0x7,0x4a,0x5c, 0x5,0x69,0x6b, 0x5,0x69,0x6c, 0x7,0x4a,0x61, 0x7,0x4a,0x62, 0x7,0x4a,0x63, 0x7,0x4a,0x5f, 0x5,0x69,0x76, 0x5,0x69,0x75, 0x7,0x4a,0x60, 0x7,0x4a,0x5d, 0x7,0x4a,0x67, 0x7,0x4a,0x56, 0x7,0x4a,0x64, 0x4,0x61,0x53, 0x4,0x64,0x59, 0x5,0x6d,0x7d, 0x5,0x6d,0x77, 0x7,0x50,0x44, 0x5,0x6d,0x7b, 0x5,0x6d,0x76, 0x5,0x6d,0x79, 0x7,0x50,0x48, 0x7,0x50,0x46, 0x4,0x64,0x5c, 0x5,0x6d,0x73, 0x4,0x64,0x5d, 0x7,0x50,0x47, 0x5,0x6d,0x78, 0x5,0x6d,0x75, 0x5,0x6d,0x74, 0x7,0x50,0x49, 0xf,0x66,0x43, 0xf,0x66,0x44, 0xf,0x66,0x45, 0xf,0x66,0x46, 0xf,0x66,0x47, 0x7,0x50,0x45, 0x7,0x50,0x4a, 0x7,0x50,0x4b, 0x5,0x6d,0x7c, 0x5,0x6d,0x7e, 0x5,0x6d,0x7a, 0x4,0x67,0x4e, 0x7,0x55,0x42, 0x4,0x67,0x4f, 0x5,0x71,0x4b, 0x7,0x55,0x41, 0x7,0x55,0x44, 0x4,0x67,0x4d, 0x4,0x67,0x4b, 0x5,0x71,0x4c, 0x7,0x55,0x43, 0x7,0x55,0x40, 0x5,0x71,0x4a, 0xf,0x68,0x51, 0xf,0x68,0x52, 0x5,0x74,0x4a, 0x7,0x55,0x45, 0x7,0x59,0x4c, 0x5,0x74,0x4d, 0x5,0x74,0x4f, 0x5,0x74,0x4e, 0x5,0x74,0x4c, 0x7,0x59,0x4d, 0x5,0x74,0x51, 0x7,0x59,0x4e, 0xf,0x69,0x7a, 0x7,0x59,0x4f, 0x5,0x74,0x50, 0x5,0x76,0x54, 0x5,0x76,0x52, 0x5,0x76,0x55, 0x7,0x5c,0x79, 0x7,0x5c,0x78, 0x5,0x76,0x53, 0x5,0x76,0x51, 0x4,0x6c,0x2b, 0x7,0x5f,0x61, 0x5,0x78,0x37, 0x5,0x78,0x36, 0x4,0x6c,0x2a, 0x5,0x78,0x38, 0x7,0x5f,0x62, 0x7,0x61,0x4f, 0x7,0x5f,0x63, 0x7,0x61,0x52, 0x4,0x6d,0x28, 0x7,0x61,0x54, 0x7,0x62,0x67, 0x7,0x61,0x53, 0x7,0x61,0x51, 0x7,0x61,0x50, 0xf,0x6b,0x67, 0x5,0x7a,0x3c, 0x5,0x7a,0x3b, 0x5,0x7a,0x3d, 0x7,0x63,0x76, 0x5,0x7b,0x4a, 0x7,0x64,0x63, 0x5,0x7b,0x6a, 0xf,0x6d,0x28, 0x7,0x65,0x65, 0xf,0x6d,0x33, 0x6,0x23,0x39, 0x6,0x23,0x3a, 0x6,0x25,0x55, 0x5,0x30,0x52, 0x6,0x3c,0x44, 0x5,0x30,0x51, 0x5,0x35,0x7a, 0x5,0x35,0x79, 0x5,0x35,0x78, 0x6,0x45,0x3e, 0x6,0x45,0x41, 0x6,0x45,0x40, 0x6,0x45,0x42, 0x6,0x45,0x3f, 0x6,0x45,0x43, 0x6,0x45,0x44, 0x4,0x35,0x60, 0xf,0x38,0x6b, 0x5,0x3c,0x65, 0x6,0x4f,0x3f, 0x5,0x3c,0x64, 0x6,0x4f,0x41, 0x6,0x4f,0x3e, 0x5,0x3c,0x66, 0xf,0x3f,0x55, 0xf,0x3f,0x56, 0xf,0x3f,0x57, 0xf,0x3f,0x58, 0x6,0x4f,0x3d, 0x6,0x4f,0x40, 0x6,0x58,0x7d, 0x5,0x43,0x4d, 0x6,0x58,0x7a, 0x6,0x58,0x7e, 0x6,0x59,0x21, 0xf,0x45,0x5a, 0xf,0x45,0x5b, 0xf,0x45,0x5c, 0x6,0x58,0x7b, 0x6,0x58,0x7c, 0x6,0x59,0x22, 0x5,0x4a,0x4a, 0x6,0x63,0x23, 0x6,0x63,0x24, 0x5,0x4a,0x49, 0x6,0x63,0x25, 0x6,0x63,0x26, 0xf,0x4c,0x5c, 0xf,0x4c,0x5d, 0xf,0x4c,0x5e, 0x7,0x29,0x51, 0x5,0x51,0x56, 0x4,0x4e,0x25, 0xf,0x52,0x46, 0xf,0x52,0x48, 0x7,0x29,0x50, 0x5,0x58,0x6a, 0x4,0x54,0x31, 0x5,0x58,0x6b, 0x7,0x34,0x28, 0x7,0x3c,0x46, 0xf,0x58,0x34, 0xf,0x58,0x36, 0x7,0x3c,0x48, 0x7,0x3c,0x47, 0x7,0x3c,0x45, 0x5,0x5f,0x21, 0xf,0x5c,0x7a, 0xf,0x5c,0x7b, 0x5,0x65,0x30, 0x7,0x43,0x6c, 0xf,0x61,0x26, 0xf,0x61,0x27, 0x7,0x4a,0x6c, 0x7,0x4a,0x6d, 0x7,0x4a,0x6a, 0xf,0x64,0x26, 0xf,0x64,0x27, 0x7,0x4a,0x6b, 0x7,0x4a,0x69, 0x4,0x64,0x5e, 0x7,0x50,0x4d, 0xf,0x66,0x48, 0xf,0x66,0x49, 0x7,0x50,0x4e, 0x7,0x55,0x46, 0x5,0x71,0x4d, 0x7,0x55,0x47, 0x7,0x55,0x48, 0x7,0x55,0x49, 0x7,0x59,0x50, 0xf,0x69,0x7c, 0x5,0x76,0x56, 0x5,0x79,0x51, 0x6,0x34,0x5c, 0x5,0x2b,0x4e, 0x6,0x34,0x5e, 0xf,0x2d,0x52, 0xf,0x2d,0x54, 0x6,0x3c,0x45, 0x5,0x30,0x54, 0x6,0x3c,0x47, 0xf,0x32,0x5f, 0xf,0x32,0x60, 0x6,0x3c,0x46, 0x5,0x30,0x53, 0xf,0x32,0x5e, 0x5,0x35,0x7b, 0x6,0x45,0x4e, 0x6,0x45,0x4d, 0x6,0x45,0x46, 0x4,0x35,0x64, 0x5,0x36,0x22, 0x5,0x36,0x21, 0x6,0x45,0x4a, 0x5,0x35,0x7d, 0x6,0x45,0x47, 0x6,0x45,0x4c, 0x6,0x45,0x4b, 0x5,0x35,0x7c, 0x5,0x35,0x7e, 0xf,0x38,0x6d, 0x6,0x45,0x48, 0x6,0x45,0x49, 0x4,0x35,0x65, 0x6,0x4f,0x46, 0x6,0x4f,0x47, 0x5,0x3c,0x70, 0x5,0x3c,0x6e, 0x6,0x4f,0x45, 0x6,0x4f,0x44, 0x6,0x4f,0x42, 0x5,0x36,0x23, 0x5,0x3c,0x6d, 0x5,0x3c,0x68, 0x5,0x3c,0x6b, 0x5,0x3c,0x6a, 0x6,0x4f,0x43, 0x5,0x3c,0x69, 0x5,0x3c,0x71, 0x5,0x3c,0x6c, 0x5,0x3c,0x6f, 0x6,0x59,0x23, 0x6,0x59,0x28, 0x5,0x43,0x53, 0x6,0x59,0x26, 0x6,0x59,0x29, 0x5,0x43,0x51, 0x4,0x41,0x2b, 0x5,0x43,0x52, 0x5,0x43,0x4f, 0x6,0x59,0x27, 0x5,0x43,0x4e, 0xf,0x45,0x5d, 0xf,0x45,0x5e, 0xf,0x45,0x5f, 0x6,0x59,0x25, 0x4,0x41,0x2d, 0x5,0x43,0x54, 0x6,0x63,0x2d, 0x6,0x63,0x2f, 0x5,0x4a,0x50, 0x4,0x47,0x68, 0x6,0x63,0x28, 0x6,0x63,0x2b, 0x5,0x4a,0x4d, 0x6,0x63,0x2c, 0x6,0x63,0x27, 0x6,0x63,0x30, 0x5,0x4a,0x4b, 0x5,0x4a,0x4e, 0x6,0x63,0x31, 0x6,0x63,0x2e, 0xf,0x4c,0x5f, 0xf,0x4c,0x60, 0xf,0x4c,0x61, 0xf,0x4c,0x63, 0x5,0x4a,0x4f, 0x5,0x4a,0x4c, 0x7,0x29,0x59, 0x6,0x63,0x2a, 0x5,0x51,0x60, 0x7,0x29,0x57, 0x7,0x29,0x5e, 0x7,0x29,0x62, 0x7,0x29,0x56, 0x5,0x51,0x59, 0x7,0x29,0x5a, 0x7,0x29,0x55, 0x7,0x29,0x5c, 0x5,0x51,0x58, 0x5,0x51,0x5b, 0x5,0x51,0x5e, 0x4,0x4e,0x2c, 0x6,0x63,0x29, 0x7,0x29,0x58, 0x7,0x29,0x5d, 0x7,0x29,0x5b, 0x5,0x51,0x5d, 0x5,0x51,0x5f, 0x7,0x29,0x52, 0x5,0x51,0x57, 0x7,0x29,0x54, 0x7,0x29,0x63, 0xf,0x52,0x49, 0xf,0x52,0x4a, 0xf,0x52,0x4b, 0xf,0x52,0x4c, 0x7,0x29,0x53, 0x7,0x29,0x5f, 0x7,0x29,0x60, 0x7,0x29,0x61, 0x5,0x51,0x5c, 0x5,0x51,0x5a, 0x7,0x34,0x29, 0x5,0x58,0x73, 0x7,0x34,0x2f, 0x5,0x58,0x74, 0x7,0x34,0x2d, 0x5,0x58,0x70, 0x7,0x34,0x2b, 0x7,0x34,0x34, 0x5,0x58,0x6e, 0x5,0x58,0x71, 0x5,0x58,0x6d, 0x7,0x34,0x35, 0x7,0x34,0x30, 0x7,0x34,0x36, 0x5,0x58,0x6c, 0x7,0x34,0x33, 0xf,0x58,0x37, 0xf,0x58,0x39, 0xf,0x58,0x3a, 0x7,0x34,0x2c, 0x7,0x34,0x2e, 0x7,0x34,0x2a, 0xf,0x58,0x38, 0x4,0x54,0x35, 0x5,0x58,0x6f, 0x7,0x3c,0x4a, 0x7,0x3c,0x52, 0x5,0x5f,0x25, 0x7,0x3c,0x4d, 0x7,0x3c,0x4c, 0x7,0x3c,0x4b, 0x7,0x3c,0x53, 0x4,0x59,0x33, 0x7,0x3c,0x50, 0x4,0x59,0x34, 0x7,0x3c,0x51, 0x5,0x5f,0x22, 0x5,0x5f,0x2b, 0x4,0x59,0x36, 0x5,0x5f,0x28, 0x5,0x5f,0x27, 0x7,0x3c,0x54, 0x5,0x5f,0x24, 0x5,0x5f,0x2a, 0x7,0x3c,0x49, 0xf,0x5c,0x7c, 0xf,0x5c,0x7d, 0x7,0x3c,0x4e, 0x7,0x3c,0x4f, 0x5,0x5f,0x26, 0x5,0x5f,0x23, 0x5,0x5f,0x29, 0x4,0x5d,0x79, 0x7,0x43,0x70, 0x4,0x5e,0x21, 0x5,0x65,0x32, 0x5,0x65,0x34, 0xf,0x61,0x28, 0xf,0x61,0x29, 0xf,0x61,0x2a, 0x7,0x43,0x6f, 0x7,0x43,0x72, 0x7,0x43,0x71, 0x7,0x43,0x6e, 0x7,0x43,0x6d, 0x5,0x65,0x31, 0x5,0x65,0x33, 0x5,0x69,0x78, 0x7,0x4a,0x6e, 0x7,0x4a,0x71, 0x7,0x4a,0x6f, 0x7,0x4a,0x70, 0x5,0x69,0x7a, 0x4,0x61,0x5a, 0x4,0x61,0x5b, 0x5,0x69,0x79, 0x5,0x69,0x77, 0x5,0x69,0x7b, 0x7,0x4a,0x72, 0xf,0x64,0x28, 0x7,0x4a,0x74, 0x4,0x64,0x62, 0x5,0x6e,0x25, 0x5,0x6e,0x23, 0x7,0x50,0x53, 0x5,0x6e,0x24, 0x5,0x6e,0x22, 0x7,0x50,0x51, 0x5,0x6e,0x21, 0xf,0x66,0x4a, 0x7,0x50,0x52, 0x7,0x50,0x50, 0x7,0x50,0x4f, 0x5,0x6e,0x26, 0x7,0x50,0x54, 0x4,0x67,0x53, 0x5,0x71,0x4e, 0x4,0x67,0x54, 0x7,0x55,0x4c, 0x7,0x55,0x4b, 0x7,0x55,0x4a, 0x7,0x59,0x56, 0x4,0x69,0x50, 0x7,0x59,0x52, 0x7,0x59,0x51, 0x4,0x69,0x51, 0x7,0x59,0x57, 0x7,0x59,0x53, 0x7,0x59,0x54, 0x7,0x59,0x55, 0x7,0x5c,0x7e, 0x7,0x5d,0x21, 0x5,0x76,0x57, 0x7,0x5c,0x7b, 0x7,0x5c,0x7a, 0x7,0x5c,0x7c, 0x7,0x5c,0x7d, 0x5,0x76,0x59, 0x5,0x76,0x58, 0x5,0x78,0x3c, 0x5,0x78,0x3b, 0x5,0x78,0x3a, 0x7,0x5f,0x67, 0x7,0x5f,0x65, 0x7,0x5f,0x64, 0x5,0x78,0x39, 0x7,0x5f,0x66, 0x5,0x79,0x53, 0x5,0x79,0x52, 0x5,0x7a,0x3e, 0x5,0x7a,0x3f, 0x7,0x62,0x68, 0x5,0x7a,0x7a, 0x7,0x64,0x64, 0x7,0x62,0x69, 0x7,0x63,0x77, 0x5,0x7b,0x6b, 0x7,0x65,0x66, 0x6,0x29,0x2b, 0x6,0x2e,0x36, 0x6,0x3c,0x48, 0x6,0x45,0x4f, 0x5,0x36,0x25, 0x5,0x36,0x24, 0x4,0x41,0x2e, 0x6,0x59,0x2a, 0xf,0x45,0x61, 0x5,0x4a,0x51, 0xf,0x4c,0x65, 0xf,0x4c,0x66, 0x5,0x4a,0x52, 0x7,0x29,0x64, 0x7,0x29,0x65, 0x7,0x29,0x66, 0x5,0x51,0x62, 0x7,0x34,0x37, 0x5,0x58,0x75, 0x7,0x34,0x38, 0xf,0x58,0x3b, 0x5,0x5f,0x2d, 0x5,0x5f,0x2c, 0xf,0x5c,0x7e, 0xf,0x5d,0x21, 0xf,0x5d,0x22, 0xf,0x5d,0x23, 0x5,0x5f,0x2e, 0x5,0x65,0x37, 0x5,0x65,0x36, 0x7,0x43,0x73, 0x7,0x4a,0x75, 0x4,0x61,0x5c, 0x7,0x4a,0x76, 0xf,0x66,0x4b, 0x7,0x50,0x55, 0xf,0x68,0x54, 0x7,0x59,0x58, 0x7,0x5f,0x68, 0x7,0x65,0x47, 0x7,0x65,0x67, 0x6,0x29,0x2c, 0x6,0x2e,0x37, 0x6,0x59,0x2d, 0x6,0x59,0x2c, 0x6,0x59,0x2b, 0xf,0x52,0x4d, 0x7,0x33,0x21, 0x4,0x61,0x5d, 0x7,0x55,0x4d, 0x6,0x25,0x59, 0x6,0x25,0x58, 0x6,0x25,0x57, 0x4,0x24,0x7e, 0x6,0x29,0x2d, 0x4,0x25,0x24, 0x6,0x3c,0x49, 0x6,0x29,0x2e, 0xf,0x25,0x33, 0xf,0x25,0x34, 0x6,0x3c,0x4a, 0x6,0x29,0x2f, 0x5,0x24,0x78, 0x6,0x3c,0x4b, 0x6,0x45,0x50, 0x5,0x27,0x6a, 0x5,0x27,0x6b, 0x5,0x27,0x70, 0x6,0x2e,0x38, 0x6,0x2e,0x3d, 0x5,0x27,0x6f, 0x4,0x28,0x25, 0x5,0x27,0x71, 0x5,0x27,0x6d, 0x4,0x28,0x28, 0x6,0x2e,0x3b, 0xf,0x28,0x6d, 0xf,0x28,0x6f, 0xf,0x28,0x70, 0xf,0x28,0x73, 0xf,0x28,0x74, 0xf,0x28,0x75, 0x6,0x2e,0x3a, 0x6,0x2e,0x3f, 0x5,0x27,0x6e, 0x5,0x27,0x68, 0x6,0x2e,0x3c, 0x5,0x27,0x6c, 0x6,0x2e,0x39, 0x6,0x2e,0x3e, 0x5,0x2b,0x4f, 0x5,0x2b,0x56, 0x5,0x2b,0x52, 0x6,0x34,0x5f, 0x5,0x2b,0x51, 0x6,0x34,0x62, 0x5,0x2b,0x55, 0x5,0x2b,0x53, 0x4,0x2b,0x4f, 0x4,0x2b,0x51, 0x5,0x2b,0x50, 0x6,0x34,0x64, 0x6,0x34,0x63, 0xf,0x2d,0x55, 0xf,0x2d,0x56, 0xf,0x2d,0x57, 0xf,0x2d,0x58, 0xf,0x2d,0x59, 0x4,0x2b,0x52, 0x6,0x34,0x65, 0x6,0x34,0x61, 0x6,0x4a,0x47, 0x5,0x2b,0x57, 0x5,0x2b,0x54, 0x6,0x3c,0x54, 0x6,0x3c,0x58, 0x5,0x30,0x5b, 0x6,0x3c,0x53, 0x5,0x30,0x56, 0x5,0x30,0x5a, 0x4,0x30,0x31, 0x5,0x30,0x57, 0x5,0x30,0x59, 0x6,0x3c,0x52, 0x6,0x3c,0x4c, 0x6,0x3c,0x56, 0x4,0x30,0x32, 0x6,0x3c,0x57, 0x6,0x3c,0x4d, 0x5,0x43,0x55, 0x6,0x3c,0x55, 0x5,0x30,0x58, 0x6,0x3c,0x50, 0x6,0x3c,0x4e, 0x5,0x30,0x5c, 0x5,0x36,0x27, 0x5,0x36,0x26, 0x6,0x3c,0x4f, 0x6,0x45,0x5b, 0x5,0x36,0x2c, 0x4,0x35,0x6a, 0x6,0x45,0x5c, 0x5,0x36,0x2b, 0x6,0x3c,0x51, 0x5,0x36,0x29, 0x6,0x45,0x57, 0x6,0x45,0x5a, 0xf,0x38,0x70, 0xf,0x38,0x71, 0xf,0x38,0x72, 0x6,0x45,0x56, 0x6,0x45,0x54, 0x6,0x45,0x55, 0x6,0x45,0x52, 0x6,0x45,0x5d, 0x6,0x45,0x58, 0x6,0x45,0x53, 0x5,0x36,0x2a, 0x4,0x35,0x67, 0x6,0x45,0x59, 0x5,0x36,0x2d, 0x5,0x36,0x28, 0xf,0x38,0x6f, 0x6,0x45,0x51, 0x5,0x3c,0x76, 0x5,0x3c,0x72, 0x5,0x3c,0x78, 0x5,0x3c,0x77, 0x4,0x3b,0x56, 0x6,0x4f,0x53, 0x4,0x3b,0x5a, 0x4,0x3b,0x58, 0x5,0x3c,0x79, 0x6,0x4f,0x52, 0x7,0x29,0x67, 0x6,0x4f,0x4d, 0x6,0x4f,0x4c, 0x6,0x4f,0x50, 0x6,0x4f,0x4f, 0x4,0x3b,0x5b, 0x6,0x4f,0x49, 0x6,0x4f,0x4b, 0xf,0x3f,0x62, 0x6,0x4f,0x51, 0x6,0x4f,0x54, 0x6,0x4f,0x55, 0x6,0x4f,0x4a, 0xf,0x3f,0x59, 0xf,0x3f,0x5a, 0xf,0x3f,0x5b, 0xf,0x3f,0x5c, 0xf,0x3f,0x5d, 0xf,0x3f,0x5f, 0xf,0x3f,0x60, 0xf,0x3f,0x61, 0x5,0x3c,0x75, 0x6,0x4f,0x4e, 0x5,0x3c,0x74, 0x5,0x3c,0x73, 0x4,0x3b,0x59, 0x6,0x4f,0x56, 0x6,0x59,0x40, 0x6,0x59,0x34, 0x6,0x59,0x3d, 0x6,0x59,0x30, 0x4,0x41,0x31, 0x4,0x41,0x30, 0x6,0x59,0x2e, 0x5,0x43,0x59, 0x6,0x59,0x31, 0x6,0x59,0x41, 0x6,0x59,0x3b, 0x6,0x59,0x3f, 0x6,0x59,0x37, 0x6,0x59,0x35, 0x6,0x59,0x43, 0x6,0x59,0x42, 0x5,0x3c,0x7a, 0x4,0x41,0x32, 0x6,0x59,0x33, 0x6,0x59,0x3e, 0xf,0x45,0x62, 0xf,0x45,0x63, 0xf,0x45,0x64, 0xf,0x45,0x65, 0xf,0x45,0x66, 0xf,0x45,0x67, 0xf,0x45,0x68, 0xf,0x45,0x69, 0xf,0x45,0x6a, 0xf,0x45,0x6b, 0xf,0x45,0x6c, 0x6,0x59,0x32, 0x6,0x59,0x36, 0x6,0x59,0x3c, 0x6,0x59,0x39, 0x6,0x59,0x38, 0x6,0x59,0x3a, 0x6,0x59,0x2f, 0x5,0x43,0x58, 0x5,0x43,0x57, 0x5,0x43,0x56, 0x6,0x63,0x35, 0x6,0x63,0x34, 0x6,0x63,0x37, 0x6,0x63,0x32, 0x6,0x63,0x3a, 0x5,0x4a,0x54, 0x6,0x63,0x36, 0x6,0x63,0x38, 0x6,0x63,0x3c, 0x5,0x4a,0x53, 0x5,0x4a,0x56, 0x6,0x63,0x33, 0x6,0x63,0x3b, 0x7,0x3c,0x55, 0xf,0x4c,0x69, 0xf,0x4c,0x6a, 0xf,0x4c,0x6c, 0xf,0x4c,0x6d, 0xf,0x4c,0x6e, 0xf,0x4c,0x6f, 0xf,0x4c,0x70, 0xf,0x4c,0x71, 0xf,0x4c,0x72, 0x6,0x63,0x39, 0x7,0x3c,0x56, 0x7,0x3c,0x57, 0x7,0x3c,0x58, 0x5,0x4a,0x55, 0x7,0x29,0x6e, 0x7,0x29,0x6c, 0x7,0x29,0x72, 0x7,0x29,0x69, 0x7,0x29,0x6b, 0x4,0x4e,0x2f, 0x5,0x51,0x64, 0x4,0x4e,0x30, 0x5,0x51,0x68, 0x5,0x51,0x65, 0x4,0x4e,0x34, 0x7,0x29,0x70, 0xf,0x52,0x4e, 0xf,0x52,0x4f, 0xf,0x52,0x50, 0xf,0x52,0x51, 0xf,0x52,0x52, 0x5,0x51,0x6d, 0x7,0x29,0x6a, 0x7,0x29,0x6f, 0x7,0x29,0x74, 0x7,0x29,0x75, 0x7,0x29,0x71, 0x7,0x29,0x73, 0x7,0x43,0x74, 0x7,0x29,0x68, 0x7,0x43,0x75, 0x7,0x29,0x6d, 0x5,0x51,0x69, 0x5,0x51,0x67, 0x5,0x51,0x6c, 0x5,0x51,0x66, 0x5,0x51,0x6a, 0x5,0x51,0x6b, 0x5,0x51,0x63, 0x7,0x34,0x46, 0x5,0x58,0x7c, 0x5,0x58,0x7b, 0x5,0x58,0x79, 0x7,0x34,0x41, 0x5,0x58,0x77, 0x7,0x34,0x45, 0x7,0x34,0x3e, 0x7,0x34,0x47, 0x4,0x54,0x36, 0x7,0x34,0x42, 0x7,0x34,0x44, 0x7,0x34,0x39, 0x7,0x34,0x4a, 0x7,0x4a,0x77, 0x7,0x34,0x3c, 0x7,0x34,0x40, 0x7,0x34,0x4c, 0xf,0x58,0x3c, 0xf,0x58,0x3d, 0xf,0x58,0x3e, 0x7,0x34,0x3d, 0xf,0x58,0x3f, 0x7,0x2c,0x5a, 0x7,0x34,0x48, 0x7,0x34,0x3b, 0x7,0x34,0x3a, 0x7,0x34,0x43, 0x7,0x34,0x4b, 0x5,0x58,0x78, 0x5,0x58,0x7d, 0x5,0x58,0x7a, 0x7,0x34,0x3f, 0x5,0x58,0x76, 0x5,0x5f,0x2f, 0x4,0x59,0x3a, 0x7,0x3c,0x60, 0x5,0x5f,0x33, 0x7,0x3c,0x5d, 0x5,0x5f,0x34, 0x7,0x3c,0x5b, 0x7,0x50,0x57, 0x7,0x34,0x49, 0x7,0x3c,0x62, 0x7,0x3c,0x5e, 0x5,0x5f,0x32, 0x5,0x5f,0x35, 0xf,0x5d,0x24, 0xf,0x5d,0x26, 0xf,0x5d,0x27, 0xf,0x5d,0x28, 0x7,0x3c,0x59, 0x7,0x3c,0x5c, 0x7,0x3c,0x5f, 0x7,0x3c,0x63, 0xf,0x5d,0x25, 0x5,0x5f,0x36, 0x5,0x5f,0x37, 0x5,0x5f,0x31, 0x5,0x5f,0x30, 0x7,0x3c,0x5a, 0x5,0x65,0x3d, 0x7,0x43,0x7c, 0x4,0x5e,0x22, 0x7,0x43,0x7a, 0x5,0x65,0x3a, 0x7,0x43,0x78, 0xf,0x61,0x2b, 0xf,0x61,0x2c, 0xf,0x61,0x2d, 0x7,0x44,0x21, 0x7,0x43,0x7e, 0x5,0x65,0x39, 0x7,0x43,0x7d, 0x7,0x43,0x76, 0x7,0x43,0x79, 0x5,0x65,0x3c, 0x5,0x65,0x3b, 0x5,0x65,0x38, 0x7,0x43,0x7b, 0x7,0x4b,0x21, 0x7,0x4b,0x22, 0x7,0x4a,0x7e, 0xf,0x64,0x2a, 0xf,0x64,0x2b, 0xf,0x64,0x2d, 0xf,0x64,0x2e, 0x7,0x4a,0x79, 0x7,0x4a,0x7a, 0x7,0x4a,0x7d, 0x7,0x4a,0x7b, 0x7,0x4a,0x7c, 0x7,0x4a,0x78, 0x5,0x6a,0x21, 0x5,0x69,0x7e, 0xf,0x64,0x2c, 0x7,0x50,0x5a, 0x5,0x6e,0x29, 0x7,0x50,0x59, 0x5,0x6e,0x27, 0xf,0x66,0x4c, 0x7,0x50,0x58, 0x5,0x6e,0x28, 0x7,0x5d,0x22, 0x4,0x67,0x55, 0x7,0x55,0x4f, 0x5,0x71,0x51, 0x7,0x55,0x50, 0x7,0x55,0x4e, 0xf,0x68,0x55, 0xf,0x68,0x56, 0xf,0x68,0x57, 0xf,0x68,0x58, 0x5,0x71,0x4f, 0x5,0x71,0x50, 0x5,0x69,0x7d, 0x7,0x55,0x51, 0x5,0x71,0x52, 0x5,0x74,0x52, 0x4,0x6b,0x25, 0x7,0x59,0x5b, 0x7,0x59,0x5a, 0x7,0x59,0x59, 0x7,0x5d,0x23, 0x7,0x5d,0x25, 0x7,0x5d,0x24, 0x7,0x62,0x6a, 0x7,0x5f,0x6a, 0x7,0x5f,0x69, 0x5,0x78,0x3d, 0x7,0x61,0x55, 0x7,0x62,0x6b, 0x7,0x65,0x68, 0x6,0x29,0x30, 0x5,0x21,0x7c, 0x5,0x23,0x2c, 0x5,0x23,0x2b, 0x5,0x23,0x2d, 0x5,0x23,0x2a, 0x4,0x23,0x31, 0x6,0x25,0x5a, 0x6,0x25,0x5c, 0x4,0x23,0x33, 0x4,0x25,0x27, 0x5,0x24,0x79, 0x4,0x25,0x26, 0x4,0x25,0x28, 0x4,0x25,0x25, 0x6,0x29,0x33, 0x4,0x25,0x2a, 0x5,0x24,0x7a, 0x4,0x35,0x71, 0x6,0x29,0x32, 0xf,0x25,0x35, 0xf,0x25,0x36, 0xf,0x25,0x37, 0xf,0x38,0x73, 0xf,0x38,0x75, 0x6,0x45,0x61, 0x6,0x45,0x5f, 0x6,0x45,0x60, 0x6,0x29,0x31, 0x4,0x25,0x29, 0x4,0x28,0x2e, 0x6,0x45,0x5e, 0x4,0x28,0x2a, 0x4,0x28,0x2d, 0x4,0x28,0x2c, 0x6,0x34,0x69, 0x4,0x28,0x2f, 0x5,0x27,0x72, 0x5,0x27,0x73, 0x6,0x4f,0x58, 0x6,0x2e,0x43, 0xf,0x28,0x76, 0xf,0x28,0x78, 0xf,0x28,0x79, 0xf,0x28,0x7c, 0x6,0x4f,0x5a, 0x6,0x2e,0x41, 0x6,0x2e,0x42, 0x6,0x2e,0x40, 0xf,0x28,0x77, 0xf,0x28,0x7b, 0x6,0x4f,0x57, 0x6,0x4f,0x59, 0x5,0x27,0x74, 0x5,0x2b,0x5a, 0x5,0x2b,0x59, 0x5,0x2b,0x58, 0x4,0x2b,0x57, 0x4,0x2b,0x55, 0x5,0x2b,0x5f, 0x4,0x41,0x33, 0x5,0x2b,0x5b, 0xf,0x2d,0x5a, 0xf,0x45,0x6e, 0x6,0x59,0x45, 0x6,0x59,0x44, 0x6,0x59,0x46, 0x6,0x34,0x6c, 0x6,0x34,0x66, 0x6,0x34,0x67, 0x6,0x34,0x68, 0x6,0x34,0x6b, 0x6,0x34,0x6a, 0x5,0x2b,0x5e, 0x5,0x2b,0x5c, 0x5,0x2b,0x5d, 0x5,0x30,0x61, 0x5,0x30,0x5d, 0x4,0x30,0x36, 0x6,0x3c,0x5b, 0x5,0x30,0x65, 0x5,0x30,0x66, 0x5,0x30,0x5e, 0x5,0x30,0x63, 0x5,0x30,0x5f, 0x4,0x30,0x35, 0x6,0x3c,0x5d, 0x4,0x30,0x37, 0x6,0x3c,0x5f, 0x6,0x63,0x3d, 0x6,0x63,0x3f, 0x6,0x63,0x40, 0x6,0x3c,0x5c, 0x6,0x3c,0x5e, 0x6,0x3c,0x5a, 0x5,0x30,0x62, 0x5,0x30,0x64, 0x5,0x30,0x60, 0x5,0x30,0x67, 0x6,0x63,0x3e, 0x6,0x3c,0x59, 0xf,0x32,0x62, 0xf,0x32,0x63, 0xf,0x32,0x64, 0x5,0x51,0x6e, 0x4,0x4e,0x36, 0x4,0x35,0x6f, 0x5,0x36,0x31, 0x5,0x36,0x30, 0x5,0x36,0x35, 0x5,0x36,0x2e, 0x5,0x36,0x32, 0x4,0x35,0x6d, 0x6,0x45,0x66, 0x5,0x36,0x34, 0x7,0x29,0x7a, 0x7,0x29,0x79, 0x6,0x45,0x68, 0xf,0x32,0x61, 0xf,0x38,0x76, 0xf,0x52,0x54, 0x7,0x29,0x76, 0x7,0x29,0x77, 0x7,0x29,0x7b, 0x7,0x29,0x78, 0x6,0x45,0x63, 0x6,0x45,0x65, 0x6,0x45,0x64, 0x6,0x45,0x62, 0xf,0x33,0x3c, 0x6,0x45,0x67, 0x5,0x36,0x2f, 0x5,0x36,0x33, 0x5,0x30,0x68, 0x4,0x3b,0x5f, 0x5,0x3d,0x23, 0x5,0x3c,0x7e, 0x5,0x3d,0x22, 0x4,0x3b,0x5d, 0x5,0x3d,0x24, 0x6,0x4f,0x64, 0x5,0x3d,0x21, 0x5,0x43,0x67, 0x5,0x3c,0x7d, 0x5,0x3c,0x7c, 0x6,0x4f,0x62, 0x6,0x4f,0x5b, 0x4,0x3b,0x5c, 0xf,0x3f,0x63, 0xf,0x3f,0x64, 0xf,0x3f,0x65, 0xf,0x58,0x41, 0x7,0x34,0x4e, 0x6,0x4f,0x5d, 0x6,0x4f,0x5c, 0x6,0x4f,0x5e, 0x6,0x4f,0x5f, 0x6,0x4f,0x60, 0x6,0x4f,0x61, 0xf,0x3f,0x66, 0x6,0x4f,0x63, 0x7,0x34,0x4d, 0x5,0x3c,0x7b, 0x7,0x3c,0x64, 0x5,0x43,0x5b, 0x5,0x43,0x60, 0x5,0x43,0x63, 0x5,0x43,0x5e, 0x5,0x43,0x5d, 0x4,0x41,0x35, 0x6,0x63,0x41, 0x5,0x43,0x5c, 0x5,0x43,0x62, 0x5,0x43,0x5f, 0x5,0x43,0x64, 0x5,0x43,0x66, 0x4,0x41,0x37, 0x5,0x43,0x65, 0x6,0x59,0x49, 0x5,0x43,0x5a, 0xf,0x45,0x6f, 0x6,0x59,0x48, 0x6,0x59,0x4b, 0x5,0x43,0x61, 0x4,0x47,0x6f, 0x5,0x4a,0x5d, 0x5,0x4a,0x5c, 0x5,0x4a,0x59, 0x5,0x4a,0x58, 0x5,0x4a,0x63, 0x5,0x4a,0x5f, 0x5,0x4a,0x5b, 0x6,0x63,0x46, 0x6,0x63,0x43, 0x6,0x63,0x42, 0x5,0x4a,0x61, 0x5,0x4a,0x62, 0x7,0x44,0x22, 0x7,0x44,0x24, 0x7,0x44,0x23, 0x7,0x44,0x25, 0x6,0x63,0x45, 0x5,0x4a,0x57, 0x4,0x47,0x72, 0x6,0x63,0x44, 0x5,0x65,0x3e, 0x5,0x4a,0x5a, 0x5,0x4a,0x5e, 0x5,0x4a,0x64, 0x4,0x4e,0x38, 0x7,0x4b,0x23, 0x5,0x51,0x72, 0x7,0x2a,0x21, 0x4,0x4e,0x37, 0x5,0x51,0x73, 0x4,0x4e,0x39, 0x5,0x59,0x28, 0x5,0x51,0x6f, 0x5,0x51,0x70, 0x7,0x29,0x7e, 0x7,0x2a,0x22, 0x4,0x4e,0x3a, 0xf,0x52,0x53, 0xf,0x52,0x55, 0xf,0x52,0x56, 0x7,0x4b,0x26, 0x7,0x4b,0x24, 0x7,0x2a,0x23, 0x7,0x2a,0x25, 0x7,0x2a,0x26, 0x7,0x2a,0x24, 0x7,0x29,0x7c, 0x7,0x29,0x7d, 0x5,0x51,0x74, 0x7,0x34,0x50, 0x5,0x51,0x71, 0x7,0x4b,0x25, 0x5,0x6e,0x2a, 0x5,0x59,0x25, 0x5,0x59,0x26, 0x7,0x50,0x5c, 0x4,0x54,0x38, 0x7,0x34,0x4f, 0x5,0x59,0x21, 0x5,0x59,0x24, 0x7,0x34,0x52, 0x5,0x59,0x22, 0x5,0x59,0x23, 0x4,0x54,0x39, 0x7,0x34,0x51, 0xf,0x58,0x40, 0x7,0x50,0x5d, 0x7,0x50,0x5b, 0x5,0x6e,0x2b, 0x7,0x3c,0x65, 0x7,0x3c,0x69, 0x5,0x5f,0x38, 0x4,0x59,0x3b, 0x5,0x5f,0x39, 0x7,0x55,0x52, 0x7,0x55,0x53, 0x7,0x55,0x54, 0x7,0x3c,0x67, 0x7,0x3c,0x6a, 0x7,0x3c,0x66, 0x5,0x5f,0x3b, 0x5,0x5f,0x3a, 0x7,0x55,0x55, 0x7,0x3c,0x68, 0x5,0x65,0x40, 0x7,0x44,0x26, 0x7,0x44,0x27, 0x5,0x65,0x41, 0x5,0x6a,0x25, 0x5,0x65,0x44, 0x7,0x44,0x29, 0x7,0x44,0x28, 0x5,0x65,0x42, 0x5,0x65,0x43, 0x7,0x59,0x5c, 0x5,0x65,0x3f, 0x7,0x44,0x2a, 0x7,0x4b,0x28, 0x7,0x44,0x2b, 0x5,0x6a,0x24, 0x7,0x4b,0x27, 0x5,0x6a,0x23, 0x7,0x4b,0x2a, 0x7,0x4b,0x29, 0x4,0x61,0x60, 0x5,0x59,0x27, 0x5,0x6a,0x22, 0x4,0x64,0x64, 0x5,0x6e,0x2c, 0x7,0x50,0x5f, 0x7,0x50,0x61, 0x7,0x50,0x5e, 0x7,0x50,0x60, 0x4,0x67,0x56, 0xf,0x68,0x59, 0x7,0x55,0x56, 0x7,0x55,0x57, 0x7,0x59,0x5d, 0x7,0x55,0x58, 0xf,0x68,0x5a, 0x7,0x5d,0x26, 0x7,0x5f,0x6b, 0x7,0x5f,0x6c, 0x5,0x7b,0x4b, 0x7,0x63,0x78, 0x4,0x30,0x39, 0xf,0x32,0x65, 0x6,0x3c,0x60, 0x5,0x36,0x38, 0x5,0x36,0x37, 0x6,0x45,0x72, 0x6,0x45,0x6e, 0x5,0x36,0x39, 0x4,0x35,0x76, 0x6,0x45,0x6c, 0x6,0x45,0x73, 0x6,0x45,0x69, 0x4,0x35,0x77, 0x5,0x36,0x3a, 0x6,0x45,0x70, 0x6,0x45,0x6f, 0x6,0x45,0x6a, 0x6,0x45,0x6b, 0xf,0x38,0x77, 0x6,0x45,0x71, 0x4,0x35,0x79, 0x6,0x45,0x6d, 0x6,0x45,0x74, 0x6,0x4f,0x6b, 0x5,0x3d,0x25, 0x5,0x3d,0x26, 0x4,0x3b,0x65, 0x6,0x4f,0x69, 0x5,0x43,0x6a, 0x4,0x3b,0x62, 0x4,0x3b,0x63, 0x6,0x4f,0x6a, 0x6,0x4f,0x66, 0x6,0x4f,0x65, 0x4,0x3b,0x61, 0x6,0x4f,0x67, 0x6,0x4f,0x68, 0xf,0x3f,0x68, 0xf,0x3f,0x69, 0xf,0x3f,0x6a, 0xf,0x3f,0x6b, 0x6,0x4f,0x6c, 0x5,0x43,0x69, 0x5,0x43,0x6c, 0x5,0x43,0x68, 0x6,0x59,0x4e, 0x6,0x59,0x4d, 0x5,0x43,0x6b, 0x6,0x63,0x4a, 0x5,0x4a,0x66, 0x5,0x4a,0x65, 0xf,0x4c,0x73, 0xf,0x4c,0x74, 0xf,0x4c,0x75, 0xf,0x4c,0x77, 0x6,0x63,0x49, 0x6,0x63,0x48, 0xf,0x4c,0x78, 0x6,0x63,0x47, 0x7,0x2a,0x28, 0x5,0x51,0x78, 0x7,0x2a,0x2c, 0x5,0x51,0x79, 0x5,0x51,0x75, 0x7,0x2a,0x30, 0x5,0x51,0x76, 0x7,0x2a,0x2f, 0x7,0x2a,0x2e, 0x7,0x2a,0x2d, 0x7,0x2a,0x29, 0x7,0x2a,0x27, 0x5,0x51,0x77, 0xf,0x4c,0x76, 0xf,0x52,0x58, 0xf,0x52,0x59, 0x7,0x2a,0x2a, 0x7,0x2a,0x2b, 0x7,0x2a,0x32, 0x7,0x2a,0x31, 0x7,0x34,0x56, 0x7,0x34,0x55, 0x5,0x59,0x29, 0x7,0x34,0x58, 0x5,0x59,0x2c, 0x7,0x34,0x5a, 0x4,0x54,0x41, 0x7,0x34,0x5f, 0x4,0x54,0x3e, 0x4,0x54,0x3f, 0x7,0x34,0x5e, 0x5,0x59,0x2a, 0x7,0x34,0x57, 0x7,0x34,0x5d, 0x7,0x34,0x5c, 0x5,0x59,0x2b, 0xf,0x58,0x42, 0xf,0x58,0x43, 0x7,0x34,0x59, 0x7,0x34,0x5b, 0x7,0x34,0x53, 0x7,0x34,0x60, 0x5,0x5f,0x41, 0x5,0x5f,0x3f, 0x5,0x5f,0x40, 0x5,0x5f,0x43, 0x4,0x59,0x40, 0x7,0x3c,0x6c, 0x5,0x5f,0x42, 0x4,0x59,0x3e, 0x7,0x3c,0x6e, 0x5,0x5f,0x3e, 0x7,0x3c,0x74, 0x5,0x5f,0x44, 0x7,0x3c,0x6d, 0x7,0x3c,0x73, 0xf,0x5d,0x2a, 0xf,0x5d,0x2b, 0xf,0x5d,0x2c, 0x7,0x3c,0x6f, 0x7,0x3c,0x71, 0x7,0x3c,0x72, 0x5,0x5f,0x3d, 0x5,0x65,0x46, 0x5,0x65,0x47, 0x5,0x65,0x49, 0x7,0x44,0x33, 0x7,0x44,0x2f, 0x4,0x5e,0x23, 0x7,0x44,0x2c, 0x5,0x65,0x48, 0x4,0x5e,0x26, 0x5,0x65,0x4a, 0x7,0x3c,0x75, 0x4,0x5e,0x25, 0x7,0x44,0x32, 0x5,0x65,0x4b, 0x7,0x44,0x35, 0x7,0x44,0x36, 0x7,0x44,0x2d, 0xf,0x61,0x2e, 0x7,0x44,0x31, 0x7,0x44,0x2e, 0x5,0x65,0x4c, 0x7,0x44,0x30, 0x7,0x4b,0x2f, 0x7,0x4b,0x2c, 0x5,0x6a,0x2e, 0x5,0x6a,0x2b, 0x5,0x6a,0x27, 0x5,0x6a,0x2a, 0x5,0x6a,0x29, 0x5,0x6a,0x2f, 0x5,0x6a,0x2c, 0x5,0x6a,0x28, 0x5,0x6a,0x2d, 0x7,0x4b,0x2d, 0x7,0x4b,0x2e, 0x7,0x4b,0x30, 0x7,0x4b,0x2b, 0x7,0x44,0x34, 0x5,0x6a,0x30, 0x5,0x6a,0x26, 0x7,0x50,0x62, 0x5,0x6e,0x31, 0x5,0x6e,0x2e, 0x5,0x6e,0x2f, 0x5,0x6e,0x2d, 0x5,0x6e,0x30, 0x7,0x50,0x63, 0x7,0x50,0x64, 0xf,0x66,0x4e, 0x7,0x50,0x65, 0x7,0x50,0x67, 0x7,0x50,0x66, 0x4,0x67,0x59, 0x4,0x67,0x57, 0x4,0x67,0x58, 0x5,0x71,0x53, 0x7,0x55,0x5a, 0xf,0x68,0x5b, 0x7,0x55,0x59, 0x7,0x59,0x5e, 0x7,0x59,0x5f, 0x7,0x59,0x62, 0x5,0x74,0x53, 0x7,0x59,0x61, 0x7,0x59,0x60, 0xf,0x69,0x7d, 0x7,0x5d,0x27, 0x7,0x5d,0x29, 0x5,0x76,0x5a, 0x7,0x5d,0x2b, 0x7,0x5d,0x2a, 0x5,0x76,0x5b, 0x7,0x5d,0x28, 0xf,0x6a,0x7a, 0x5,0x78,0x3f, 0x4,0x6c,0x2f, 0x7,0x5f,0x6d, 0x7,0x5f,0x6e, 0x5,0x78,0x3e, 0x7,0x62,0x6c, 0x5,0x7a,0x7b, 0x7,0x63,0x7a, 0x7,0x63,0x79, 0x7,0x64,0x66, 0x7,0x64,0x65, 0x7,0x65,0x78, 0x7,0x65,0x79, 0x6,0x34,0x6e, 0x5,0x3d,0x27, 0x5,0x36,0x3b, 0x6,0x63,0x4b, 0x6,0x63,0x4c, 0x5,0x51,0x7a, 0x7,0x2a,0x34, 0x7,0x2a,0x33, 0x5,0x59,0x2d, 0x7,0x34,0x61, 0x5,0x5f,0x45, 0xf,0x5d,0x2d, 0x7,0x44,0x37, 0xf,0x66,0x4f, 0xf,0x68,0x5c, 0x5,0x74,0x54, 0x5,0x36,0x3c, 0x6,0x3c,0x61, 0x6,0x45,0x75, 0x6,0x4f,0x6e, 0x5,0x3d,0x29, 0x5,0x3d,0x28, 0xf,0x45,0x70, 0x6,0x63,0x4d, 0x7,0x2a,0x35, 0x5,0x5f,0x46, 0xf,0x61,0x2f, 0x5,0x65,0x4d, 0xf,0x68,0x5d, 0x5,0x71,0x54, 0x7,0x55,0x5b, 0x6,0x3c,0x64, 0xf,0x32,0x66, 0x6,0x3c,0x62, 0x5,0x36,0x3d, 0x6,0x45,0x76, 0x6,0x45,0x77, 0xf,0x38,0x78, 0x6,0x4f,0x73, 0x6,0x4f,0x74, 0x6,0x4f,0x75, 0x6,0x4f,0x71, 0x6,0x4f,0x72, 0x6,0x4f,0x78, 0x6,0x4f,0x76, 0x6,0x4f,0x70, 0x6,0x4f,0x79, 0xf,0x3f,0x6c, 0xf,0x3f,0x6d, 0xf,0x3f,0x6e, 0xf,0x3f,0x6f, 0xf,0x3f,0x72, 0xf,0x3f,0x74, 0xf,0x3f,0x71, 0x6,0x4f,0x77, 0xf,0x3f,0x70, 0x4,0x41,0x47, 0x5,0x43,0x6e, 0x4,0x41,0x45, 0x4,0x41,0x44, 0x6,0x59,0x53, 0x6,0x59,0x4f, 0xf,0x45,0x71, 0xf,0x45,0x75, 0xf,0x45,0x76, 0xf,0x45,0x77, 0xf,0x45,0x78, 0x6,0x59,0x55, 0x6,0x59,0x51, 0x6,0x59,0x52, 0xf,0x45,0x79, 0x6,0x59,0x54, 0x6,0x59,0x50, 0xf,0x45,0x74, 0x5,0x4a,0x67, 0x5,0x4a,0x68, 0x6,0x63,0x52, 0x5,0x4a,0x69, 0xf,0x4c,0x68, 0xf,0x4c,0x79, 0xf,0x4c,0x7b, 0xf,0x4c,0x7c, 0xf,0x4c,0x7d, 0xf,0x4d,0x21, 0xf,0x4d,0x23, 0xf,0x4d,0x24, 0xf,0x4d,0x25, 0xf,0x4d,0x28, 0xf,0x4d,0x29, 0x6,0x63,0x4e, 0x4,0x47,0x7a, 0x6,0x63,0x50, 0x6,0x63,0x51, 0xf,0x4d,0x2a, 0x6,0x63,0x54, 0xf,0x4c,0x7a, 0x6,0x63,0x55, 0xf,0x4d,0x2b, 0xf,0x4d,0x26, 0xf,0x4c,0x7e, 0x7,0x2a,0x3a, 0x4,0x4e,0x42, 0x5,0x51,0x7e, 0x7,0x2a,0x41, 0x7,0x2a,0x3b, 0x7,0x2a,0x40, 0x7,0x2a,0x39, 0x5,0x51,0x7d, 0x7,0x2a,0x43, 0x7,0x2a,0x44, 0x7,0x2a,0x3d, 0x5,0x51,0x7b, 0x7,0x2a,0x37, 0xf,0x52,0x5b, 0xf,0x52,0x5d, 0xf,0x52,0x5f, 0xf,0x52,0x60, 0xf,0x52,0x63, 0xf,0x52,0x64, 0xf,0x52,0x65, 0xf,0x52,0x67, 0xf,0x52,0x68, 0xf,0x52,0x69, 0xf,0x52,0x6a, 0xf,0x52,0x6c, 0xf,0x52,0x6d, 0x7,0x2a,0x42, 0x7,0x2a,0x3c, 0x7,0x2a,0x3f, 0x7,0x2a,0x45, 0xf,0x52,0x5e, 0x7,0x2a,0x36, 0x5,0x51,0x7c, 0xf,0x52,0x62, 0xf,0x52,0x66, 0xf,0x52,0x5a, 0x5,0x59,0x34, 0x5,0x59,0x37, 0x5,0x59,0x32, 0x4,0x54,0x47, 0x5,0x59,0x2e, 0x5,0x59,0x30, 0x7,0x34,0x65, 0x7,0x34,0x64, 0x7,0x34,0x6b, 0x7,0x34,0x69, 0x7,0x34,0x67, 0x5,0x59,0x36, 0x4,0x54,0x44, 0x7,0x34,0x62, 0x7,0x34,0x6a, 0x7,0x34,0x68, 0x5,0x59,0x2f, 0x7,0x34,0x66, 0xf,0x52,0x5c, 0x5,0x59,0x33, 0xf,0x58,0x44, 0xf,0x58,0x46, 0xf,0x58,0x47, 0xf,0x58,0x49, 0xf,0x58,0x4a, 0xf,0x58,0x4b, 0xf,0x58,0x4d, 0xf,0x58,0x4e, 0xf,0x58,0x4f, 0xf,0x58,0x51, 0xf,0x58,0x53, 0xf,0x58,0x54, 0xf,0x58,0x56, 0xf,0x58,0x57, 0xf,0x58,0x5a, 0xf,0x58,0x5c, 0xf,0x58,0x5d, 0xf,0x58,0x5e, 0xf,0x58,0x60, 0xf,0x58,0x61, 0xf,0x58,0x63, 0xf,0x58,0x64, 0xf,0x58,0x50, 0xf,0x58,0x52, 0xf,0x58,0x5f, 0xf,0x58,0x45, 0xf,0x58,0x58, 0x5,0x59,0x38, 0x5,0x59,0x31, 0x5,0x5f,0x48, 0x5,0x5f,0x49, 0x7,0x3c,0x79, 0x4,0x59,0x43, 0x5,0x5f,0x4c, 0x5,0x5f,0x4b, 0x7,0x3c,0x7c, 0x5,0x59,0x35, 0x5,0x5f,0x47, 0x7,0x3c,0x7a, 0x5,0x5f,0x4a, 0x5,0x5f,0x4f, 0x7,0x3c,0x7e, 0x7,0x3d,0x24, 0x7,0x3d,0x21, 0x7,0x3d,0x25, 0xf,0x5d,0x2f, 0xf,0x5d,0x30, 0xf,0x5d,0x34, 0xf,0x5d,0x35, 0xf,0x5d,0x36, 0xf,0x5d,0x37, 0xf,0x5d,0x3a, 0xf,0x5d,0x3b, 0xf,0x5d,0x3c, 0xf,0x5d,0x3d, 0xf,0x5d,0x3f, 0xf,0x5d,0x40, 0xf,0x5d,0x42, 0xf,0x5d,0x43, 0xf,0x5d,0x44, 0xf,0x5d,0x45, 0xf,0x5d,0x46, 0xf,0x5d,0x47, 0xf,0x5d,0x48, 0xf,0x5d,0x49, 0xf,0x5d,0x4b, 0xf,0x5d,0x4e, 0xf,0x5d,0x4f, 0x7,0x3c,0x7d, 0x7,0x3d,0x22, 0x7,0x3c,0x78, 0x7,0x3d,0x23, 0x4,0x59,0x48, 0xf,0x5d,0x4a, 0xf,0x5d,0x38, 0xf,0x5d,0x33, 0xf,0x5d,0x31, 0x5,0x5f,0x4e, 0x5,0x5f,0x4d, 0xf,0x5d,0x2e, 0x5,0x65,0x51, 0x4,0x5e,0x2d, 0x4,0x5e,0x2e, 0x5,0x65,0x52, 0x4,0x5e,0x28, 0x4,0x5e,0x2a, 0x7,0x44,0x38, 0x5,0x65,0x50, 0x5,0x65,0x4e, 0x5,0x6a,0x31, 0x7,0x44,0x3a, 0x5,0x65,0x53, 0x4,0x5e,0x30, 0x7,0x44,0x40, 0x7,0x44,0x3f, 0x5,0x65,0x54, 0x5,0x65,0x55, 0x7,0x44,0x41, 0xf,0x61,0x31, 0xf,0x61,0x32, 0xf,0x61,0x34, 0xf,0x61,0x36, 0xf,0x61,0x37, 0xf,0x61,0x38, 0xf,0x61,0x3a, 0xf,0x61,0x3c, 0xf,0x61,0x3d, 0xf,0x61,0x3e, 0xf,0x61,0x40, 0xf,0x61,0x41, 0xf,0x61,0x42, 0xf,0x61,0x44, 0xf,0x61,0x45, 0xf,0x61,0x46, 0x7,0x44,0x3b, 0x7,0x44,0x3c, 0x7,0x44,0x3e, 0x7,0x44,0x3d, 0xf,0x61,0x30, 0xf,0x61,0x39, 0xf,0x61,0x35, 0xf,0x5f,0x5d, 0x4,0x61,0x6b, 0x7,0x4b,0x33, 0x7,0x4b,0x37, 0x5,0x6a,0x32, 0x7,0x4b,0x34, 0x5,0x6a,0x34, 0x7,0x4b,0x32, 0x7,0x4b,0x3a, 0x7,0x4b,0x36, 0x7,0x4b,0x39, 0x7,0x4b,0x3b, 0xf,0x64,0x31, 0xf,0x64,0x32, 0xf,0x64,0x33, 0xf,0x64,0x35, 0xf,0x64,0x36, 0xf,0x64,0x38, 0xf,0x64,0x39, 0xf,0x64,0x3a, 0xf,0x64,0x3b, 0xf,0x64,0x3c, 0xf,0x64,0x3d, 0xf,0x64,0x3f, 0xf,0x64,0x40, 0xf,0x64,0x41, 0xf,0x64,0x42, 0xf,0x64,0x43, 0xf,0x64,0x44, 0xf,0x64,0x45, 0x7,0x4b,0x3c, 0x7,0x4b,0x35, 0x7,0x4b,0x38, 0x4,0x61,0x6a, 0x7,0x4b,0x31, 0x5,0x65,0x56, 0xf,0x64,0x3e, 0x4,0x64,0x68, 0x7,0x50,0x6d, 0x7,0x50,0x6e, 0x5,0x6e,0x38, 0x7,0x50,0x72, 0x5,0x6e,0x33, 0x4,0x64,0x6a, 0x5,0x6e,0x36, 0x5,0x6e,0x32, 0x7,0x50,0x70, 0x7,0x50,0x68, 0x7,0x50,0x69, 0x5,0x6e,0x37, 0x4,0x64,0x6e, 0x7,0x50,0x71, 0x5,0x6e,0x34, 0xf,0x66,0x50, 0xf,0x66,0x51, 0xf,0x66,0x53, 0xf,0x66,0x54, 0xf,0x66,0x55, 0xf,0x66,0x56, 0xf,0x66,0x58, 0xf,0x66,0x59, 0xf,0x66,0x5a, 0xf,0x66,0x5b, 0xf,0x66,0x5d, 0xf,0x66,0x5f, 0xf,0x66,0x60, 0xf,0x66,0x61, 0xf,0x66,0x62, 0xf,0x66,0x63, 0xf,0x66,0x64, 0xf,0x66,0x66, 0xf,0x66,0x68, 0xf,0x66,0x6a, 0xf,0x66,0x6b, 0xf,0x66,0x6c, 0xf,0x66,0x6d, 0xf,0x66,0x6e, 0xf,0x66,0x6f, 0x7,0x50,0x6c, 0x7,0x50,0x6f, 0xf,0x66,0x52, 0xf,0x66,0x5c, 0xf,0x66,0x67, 0x7,0x50,0x6a, 0x7,0x55,0x62, 0x4,0x67,0x5e, 0x7,0x55,0x67, 0x7,0x55,0x61, 0x7,0x55,0x5c, 0x4,0x67,0x60, 0x4,0x67,0x5d, 0x7,0x55,0x60, 0x7,0x55,0x63, 0x7,0x55,0x69, 0x7,0x55,0x5e, 0xf,0x68,0x5e, 0xf,0x68,0x5f, 0xf,0x68,0x60, 0xf,0x68,0x61, 0xf,0x68,0x62, 0xf,0x68,0x63, 0xf,0x68,0x64, 0xf,0x68,0x65, 0xf,0x68,0x66, 0xf,0x68,0x67, 0xf,0x68,0x68, 0xf,0x68,0x69, 0xf,0x68,0x6b, 0xf,0x68,0x6c, 0xf,0x68,0x6d, 0xf,0x68,0x6e, 0xf,0x68,0x6f, 0x7,0x55,0x5f, 0x7,0x55,0x64, 0x7,0x55,0x65, 0x7,0x55,0x66, 0x7,0x55,0x5d, 0xf,0x68,0x6a, 0x5,0x74,0x57, 0x7,0x59,0x6b, 0x7,0x59,0x6a, 0x7,0x5d,0x30, 0x7,0x59,0x66, 0x7,0x59,0x64, 0xf,0x69,0x7e, 0xf,0x6a,0x21, 0xf,0x6a,0x22, 0xf,0x6a,0x23, 0xf,0x6a,0x24, 0xf,0x6a,0x25, 0xf,0x6a,0x26, 0xf,0x6a,0x27, 0xf,0x6a,0x28, 0xf,0x6a,0x29, 0xf,0x6a,0x2a, 0xf,0x6a,0x2b, 0x7,0x59,0x63, 0x7,0x59,0x65, 0x5,0x74,0x56, 0x5,0x76,0x5e, 0x4,0x6b,0x28, 0x5,0x76,0x5c, 0xf,0x6b,0x2f, 0x7,0x5d,0x2f, 0x7,0x5d,0x2d, 0x7,0x59,0x69, 0x7,0x5d,0x2c, 0xf,0x6a,0x7c, 0xf,0x6a,0x7d, 0xf,0x6b,0x23, 0xf,0x6b,0x24, 0xf,0x6b,0x25, 0xf,0x6b,0x26, 0xf,0x6b,0x29, 0xf,0x6b,0x2a, 0xf,0x6b,0x2b, 0xf,0x6b,0x2c, 0xf,0x6b,0x2d, 0xf,0x6b,0x2e, 0x7,0x5d,0x2e, 0x7,0x5d,0x31, 0xf,0x6b,0x21, 0xf,0x6a,0x7e, 0xf,0x6b,0x27, 0x5,0x78,0x40, 0x7,0x5f,0x70, 0x7,0x5f,0x71, 0x7,0x5f,0x72, 0x7,0x5f,0x6f, 0x7,0x5f,0x73, 0xf,0x6b,0x68, 0xf,0x6b,0x69, 0xf,0x6b,0x6a, 0xf,0x6b,0x6b, 0xf,0x6b,0x6c, 0x4,0x6d,0x63, 0x7,0x61,0x57, 0x7,0x61,0x58, 0xf,0x6b,0x6d, 0xf,0x6c,0x3c, 0xf,0x6c,0x3d, 0x7,0x61,0x56, 0x7,0x62,0x72, 0x7,0x62,0x6d, 0x7,0x62,0x6e, 0x7,0x62,0x74, 0x7,0x62,0x70, 0x7,0x62,0x6f, 0x5,0x7a,0x40, 0x7,0x62,0x73, 0x7,0x62,0x71, 0x7,0x62,0x75, 0xf,0x6c,0x52, 0xf,0x6c,0x53, 0xf,0x6c,0x54, 0xf,0x6c,0x55, 0xf,0x6c,0x56, 0xf,0x6c,0x57, 0xf,0x6c,0x58, 0xf,0x6c,0x40, 0x5,0x7a,0x41, 0x5,0x7a,0x7c, 0x7,0x63,0x7d, 0x7,0x63,0x7b, 0xf,0x6c,0x6f, 0x7,0x63,0x7c, 0xf,0x6d,0x23, 0x7,0x64,0x68, 0xf,0x6d,0x21, 0x7,0x64,0x67, 0x7,0x64,0x69, 0xf,0x6d,0x22, 0xf,0x6c,0x3e, 0x7,0x65,0x48, 0x7,0x65,0x49, 0xf,0x6d,0x29, 0x5,0x7c,0x21, 0xf,0x6d,0x35, 0xf,0x6d,0x38, 0xf,0x6d,0x39, 0x6,0x2e,0x44, 0x6,0x29,0x34, 0x5,0x2b,0x60, 0x5,0x36,0x3f, 0x6,0x45,0x7b, 0x5,0x36,0x3e, 0x5,0x36,0x40, 0x6,0x45,0x7a, 0xf,0x38,0x79, 0x6,0x45,0x79, 0x6,0x45,0x78, 0x5,0x3d,0x2a, 0x5,0x3d,0x2b, 0x4,0x3b,0x68, 0x6,0x4f,0x7a, 0x6,0x4f,0x7b, 0xf,0x3f,0x75, 0x6,0x59,0x59, 0x6,0x59,0x58, 0x4,0x41,0x4a, 0x6,0x59,0x56, 0x6,0x59,0x57, 0xf,0x45,0x7a, 0x5,0x43,0x70, 0x5,0x43,0x6f, 0x5,0x4a,0x6a, 0x4,0x47,0x7c, 0x6,0x63,0x56, 0x6,0x63,0x57, 0x5,0x4a,0x6b, 0x5,0x52,0x21, 0x5,0x52,0x23, 0x5,0x59,0x39, 0x5,0x52,0x22, 0x5,0x52,0x24, 0x5,0x52,0x25, 0xf,0x58,0x65, 0x5,0x59,0x3b, 0x7,0x34,0x6e, 0x5,0x59,0x3a, 0x7,0x3d,0x26, 0x7,0x34,0x6d, 0x7,0x34,0x70, 0x7,0x34,0x6c, 0x7,0x3d,0x29, 0x4,0x59,0x4a, 0x5,0x5f,0x50, 0x4,0x59,0x4b, 0x7,0x3d,0x2a, 0x7,0x3d,0x28, 0x7,0x3d,0x27, 0x7,0x44,0x43, 0x5,0x65,0x58, 0x7,0x44,0x42, 0x5,0x65,0x57, 0x5,0x6a,0x38, 0x5,0x6a,0x36, 0x5,0x6a,0x35, 0x5,0x6a,0x37, 0x5,0x6e,0x39, 0x7,0x50,0x73, 0x7,0x50,0x74, 0x4,0x67,0x64, 0x7,0x55,0x6a, 0x7,0x59,0x6d, 0x7,0x59,0x6e, 0x7,0x59,0x6c, 0x5,0x76,0x61, 0x5,0x76,0x60, 0x5,0x78,0x41, 0x7,0x5f,0x74, 0x7,0x62,0x76, 0x7,0x64,0x6a, 0x5,0x2b,0x61, 0x5,0x30,0x6a, 0x5,0x30,0x6b, 0x5,0x30,0x69, 0xf,0x32,0x67, 0x6,0x3c,0x66, 0x5,0x36,0x42, 0x5,0x36,0x41, 0xf,0x38,0x7a, 0xf,0x38,0x7b, 0x6,0x45,0x7c, 0x5,0x3d,0x33, 0x5,0x3d,0x31, 0x5,0x3d,0x2f, 0x4,0x3b,0x6a, 0x5,0x3d,0x30, 0x4,0x3b,0x6c, 0x3,0x3f,0x6d, 0x5,0x3d,0x2c, 0x5,0x3d,0x2d, 0x5,0x3d,0x2e, 0x6,0x4f,0x7e, 0x6,0x50,0x21, 0x5,0x3d,0x32, 0x6,0x4f,0x7c, 0xf,0x3f,0x78, 0xf,0x3f,0x79, 0xf,0x3f,0x7a, 0xf,0x3f,0x7b, 0xf,0x3f,0x7c, 0xf,0x3f,0x7d, 0xf,0x40,0x21, 0x6,0x4f,0x7d, 0x4,0x3b,0x69, 0x4,0x41,0x4c, 0x6,0x59,0x5e, 0x4,0x41,0x52, 0x4,0x41,0x4d, 0x4,0x41,0x4b, 0xf,0x45,0x7e, 0x6,0x59,0x5d, 0x5,0x43,0x74, 0x5,0x43,0x71, 0x5,0x43,0x73, 0x5,0x43,0x72, 0x6,0x59,0x5b, 0x4,0x41,0x51, 0x4,0x41,0x4f, 0x6,0x59,0x5c, 0x6,0x59,0x5a, 0xf,0x45,0x7d, 0xf,0x46,0x21, 0x5,0x4a,0x73, 0x5,0x4a,0x6f, 0x5,0x4a,0x71, 0x4,0x47,0x7e, 0x5,0x4a,0x6d, 0x4,0x48,0x21, 0x5,0x4a,0x74, 0x6,0x63,0x5a, 0x5,0x4a,0x70, 0x5,0x4a,0x75, 0x4,0x47,0x7d, 0x5,0x4a,0x72, 0x5,0x4a,0x76, 0x6,0x63,0x59, 0x6,0x63,0x5b, 0x6,0x63,0x5c, 0x5,0x4a,0x6c, 0x7,0x2a,0x48, 0x5,0x52,0x2d, 0x5,0x52,0x28, 0x7,0x2a,0x4d, 0x5,0x52,0x2a, 0x5,0x52,0x27, 0x7,0x2a,0x4e, 0x4,0x4e,0x49, 0x5,0x52,0x2c, 0x5,0x52,0x29, 0x7,0x2a,0x4c, 0xf,0x52,0x6e, 0xf,0x52,0x6f, 0xf,0x52,0x71, 0x7,0x2a,0x47, 0x7,0x2a,0x49, 0x7,0x2a,0x4a, 0x7,0x2a,0x4b, 0x5,0x52,0x26, 0x5,0x52,0x2b, 0x5,0x52,0x2e, 0xf,0x52,0x70, 0x4,0x54,0x50, 0x4,0x54,0x4d, 0x5,0x59,0x3d, 0x5,0x59,0x40, 0x7,0x34,0x72, 0x5,0x59,0x3c, 0x5,0x59,0x3e, 0x5,0x59,0x3f, 0x7,0x34,0x75, 0x7,0x34,0x77, 0x7,0x34,0x79, 0xf,0x58,0x66, 0xf,0x58,0x67, 0xf,0x58,0x68, 0x7,0x34,0x74, 0x7,0x34,0x78, 0x7,0x34,0x76, 0x4,0x54,0x4e, 0x4,0x59,0x53, 0x4,0x59,0x51, 0x5,0x5f,0x54, 0x7,0x3d,0x2b, 0x5,0x5f,0x51, 0x5,0x5f,0x53, 0x5,0x5f,0x55, 0x5,0x5f,0x52, 0x7,0x3d,0x2d, 0x4,0x59,0x50, 0x7,0x3d,0x2c, 0x4,0x59,0x4c, 0x7,0x3d,0x2e, 0xf,0x5d,0x50, 0x7,0x3d,0x2f, 0x7,0x3d,0x30, 0x7,0x3d,0x31, 0x5,0x65,0x5f, 0x5,0x65,0x5e, 0x5,0x65,0x5a, 0x4,0x5e,0x33, 0x7,0x44,0x44, 0x5,0x65,0x5b, 0x5,0x65,0x61, 0x5,0x65,0x60, 0x7,0x44,0x46, 0x5,0x65,0x5d, 0x5,0x65,0x59, 0x5,0x65,0x5c, 0xf,0x61,0x47, 0xf,0x61,0x48, 0xf,0x61,0x49, 0xf,0x61,0x4c, 0xf,0x61,0x4b, 0x7,0x44,0x45, 0x7,0x44,0x47, 0x5,0x6a,0x39, 0x7,0x4b,0x3e, 0x7,0x4b,0x3f, 0x4,0x61,0x6d, 0x5,0x6a,0x3a, 0x7,0x4b,0x3d, 0x4,0x61,0x6e, 0xf,0x64,0x46, 0xf,0x64,0x47, 0xf,0x64,0x48, 0xf,0x64,0x49, 0xf,0x64,0x4a, 0x4,0x64,0x70, 0x5,0x6e,0x3f, 0x5,0x6e,0x3a, 0x5,0x6e,0x3d, 0x5,0x6e,0x3c, 0x5,0x6e,0x3e, 0x5,0x6e,0x40, 0x4,0x64,0x72, 0x7,0x50,0x78, 0x5,0x6a,0x3b, 0x7,0x50,0x75, 0xf,0x66,0x70, 0xf,0x66,0x71, 0x7,0x50,0x76, 0x5,0x6e,0x3b, 0x7,0x50,0x77, 0x5,0x71,0x5a, 0x5,0x6e,0x41, 0x4,0x67,0x65, 0x5,0x71,0x59, 0x5,0x71,0x57, 0xf,0x68,0x70, 0xf,0x68,0x71, 0xf,0x68,0x73, 0xf,0x68,0x74, 0xf,0x68,0x75, 0x5,0x71,0x5c, 0x5,0x71,0x58, 0x5,0x74,0x58, 0x7,0x55,0x6b, 0xf,0x6a,0x2f, 0x7,0x59,0x6f, 0xf,0x6a,0x2c, 0xf,0x6a,0x2d, 0xf,0x6a,0x2e, 0xf,0x6a,0x30, 0xf,0x6a,0x31, 0xf,0x6b,0x30, 0xf,0x6b,0x31, 0xf,0x6b,0x32, 0x7,0x5d,0x32, 0x5,0x78,0x42, 0xf,0x6b,0x6e, 0xf,0x6b,0x6f, 0x7,0x5f,0x76, 0x7,0x5f,0x75, 0x5,0x79,0x54, 0x4,0x6d,0x29, 0x4,0x6d,0x2a, 0x7,0x61,0x59, 0x7,0x62,0x77, 0x7,0x62,0x78, 0x5,0x7a,0x7d, 0xf,0x6d,0x2a, 0x6,0x2e,0x45, 0x5,0x22,0x22, 0x5,0x21,0x7e, 0x4,0x22,0x23, 0x5,0x22,0x23, 0x4,0x22,0x22, 0x5,0x22,0x21, 0x5,0x23,0x2e, 0x4,0x23,0x34, 0x6,0x25,0x5d, 0x5,0x24,0x7d, 0x4,0x25,0x2c, 0x4,0x25,0x2d, 0x5,0x24,0x7e, 0x5,0x24,0x7c, 0xf,0x25,0x3a, 0xf,0x25,0x3b, 0xf,0x25,0x3c, 0xf,0x25,0x3d, 0xf,0x25,0x3e, 0xf,0x25,0x3f, 0x5,0x27,0x75, 0x6,0x2e,0x47, 0x5,0x27,0x76, 0x5,0x27,0x78, 0x5,0x27,0x79, 0x4,0x28,0x30, 0x5,0x27,0x77, 0x6,0x2e,0x46, 0x6,0x2e,0x48, 0xf,0x28,0x7d, 0xf,0x28,0x7e, 0x5,0x2b,0x62, 0x6,0x34,0x70, 0x6,0x34,0x73, 0x4,0x2b,0x5c, 0x5,0x2b,0x65, 0x6,0x34,0x71, 0x6,0x63,0x5d, 0x6,0x34,0x75, 0x6,0x34,0x76, 0x6,0x34,0x77, 0x6,0x34,0x72, 0x5,0x2b,0x63, 0x6,0x34,0x78, 0xf,0x2d,0x5b, 0xf,0x2d,0x5c, 0xf,0x2d,0x5d, 0x6,0x34,0x74, 0x6,0x34,0x6f, 0x6,0x3c,0x69, 0x5,0x30,0x6f, 0x5,0x2b,0x66, 0x6,0x3c,0x68, 0x5,0x30,0x6c, 0x5,0x30,0x6e, 0x6,0x3c,0x6e, 0x6,0x3c,0x6b, 0x6,0x3c,0x6f, 0x5,0x30,0x6d, 0x6,0x3c,0x6a, 0x6,0x3c,0x6d, 0x6,0x3c,0x6c, 0xf,0x32,0x68, 0xf,0x32,0x69, 0xf,0x32,0x6a, 0xf,0x32,0x6b, 0xf,0x32,0x6c, 0xf,0x32,0x6d, 0xf,0x32,0x6e, 0x5,0x36,0x43, 0x6,0x46,0x28, 0x6,0x46,0x21, 0x4,0x35,0x7e, 0x4,0x36,0x22, 0x4,0x36,0x21, 0x5,0x36,0x44, 0x6,0x46,0x23, 0x6,0x46,0x24, 0x6,0x46,0x2b, 0x6,0x46,0x2a, 0x6,0x63,0x5e, 0x6,0x46,0x26, 0x6,0x46,0x22, 0x6,0x46,0x29, 0x6,0x46,0x27, 0x7,0x34,0x7b, 0x6,0x46,0x25, 0xf,0x38,0x7c, 0xf,0x38,0x7d, 0xf,0x38,0x7e, 0xf,0x39,0x21, 0xf,0x39,0x22, 0xf,0x39,0x23, 0xf,0x39,0x24, 0xf,0x39,0x25, 0xf,0x39,0x26, 0xf,0x39,0x27, 0x5,0x3d,0x38, 0x5,0x3d,0x3d, 0x5,0x3d,0x39, 0x5,0x3d,0x3a, 0x5,0x3d,0x3c, 0x6,0x50,0x25, 0x6,0x50,0x23, 0x5,0x3d,0x34, 0x5,0x3d,0x35, 0x5,0x3d,0x37, 0x6,0x50,0x24, 0x6,0x50,0x29, 0x7,0x3d,0x34, 0x6,0x50,0x27, 0x5,0x3d,0x3b, 0x6,0x50,0x28, 0x6,0x50,0x26, 0xf,0x40,0x22, 0xf,0x40,0x23, 0x7,0x3d,0x32, 0x5,0x3d,0x36, 0x6,0x59,0x6a, 0x5,0x43,0x7b, 0x5,0x43,0x78, 0x6,0x59,0x62, 0x6,0x59,0x69, 0x6,0x59,0x67, 0x5,0x43,0x7c, 0x5,0x43,0x79, 0x5,0x43,0x77, 0x6,0x63,0x5f, 0x6,0x59,0x63, 0x6,0x59,0x65, 0x5,0x43,0x7d, 0x5,0x43,0x7a, 0x6,0x59,0x66, 0x7,0x44,0x49, 0x6,0x59,0x64, 0x7,0x44,0x48, 0x5,0x43,0x76, 0x6,0x59,0x5f, 0x6,0x59,0x6b, 0x6,0x59,0x60, 0x5,0x43,0x75, 0x6,0x59,0x61, 0xf,0x46,0x22, 0xf,0x46,0x23, 0xf,0x46,0x24, 0xf,0x46,0x25, 0xf,0x46,0x26, 0xf,0x46,0x27, 0xf,0x46,0x28, 0xf,0x46,0x29, 0x6,0x59,0x68, 0x6,0x59,0x6c, 0x7,0x3d,0x33, 0x6,0x63,0x64, 0x6,0x63,0x62, 0x6,0x63,0x66, 0x4,0x48,0x27, 0x4,0x48,0x26, 0x5,0x52,0x2f, 0x4,0x48,0x28, 0x4,0x48,0x29, 0x5,0x4a,0x78, 0x6,0x63,0x63, 0x6,0x63,0x60, 0x4,0x48,0x25, 0x5,0x4a,0x79, 0x5,0x4a,0x7a, 0x6,0x63,0x65, 0x6,0x63,0x67, 0x7,0x4b,0x41, 0xf,0x4d,0x2e, 0xf,0x4d,0x2f, 0xf,0x4d,0x30, 0xf,0x4d,0x31, 0xf,0x4d,0x32, 0xf,0x4d,0x33, 0x6,0x63,0x61, 0x5,0x4a,0x77, 0x5,0x52,0x36, 0x5,0x52,0x34, 0x5,0x52,0x35, 0x7,0x2a,0x55, 0x5,0x52,0x38, 0x5,0x52,0x32, 0x5,0x52,0x31, 0x7,0x2a,0x4f, 0x5,0x52,0x33, 0x5,0x52,0x37, 0x5,0x52,0x30, 0x7,0x50,0x7a, 0x7,0x2a,0x53, 0x7,0x2a,0x51, 0x7,0x2a,0x50, 0x7,0x2a,0x52, 0xf,0x52,0x72, 0xf,0x52,0x73, 0xf,0x52,0x74, 0xf,0x52,0x75, 0xf,0x52,0x76, 0xf,0x52,0x77, 0x7,0x2a,0x56, 0x5,0x59,0x41, 0x5,0x59,0x42, 0x4,0x54,0x54, 0x7,0x34,0x7c, 0x5,0x59,0x44, 0x5,0x59,0x43, 0x7,0x34,0x7e, 0x7,0x50,0x79, 0xf,0x58,0x69, 0xf,0x58,0x6a, 0xf,0x58,0x6b, 0xf,0x58,0x6c, 0x5,0x6a,0x3c, 0x7,0x34,0x7d, 0x5,0x5f,0x56, 0x5,0x5f,0x57, 0x7,0x3d,0x36, 0x7,0x3d,0x37, 0x7,0x3d,0x35, 0x5,0x74,0x59, 0xf,0x5d,0x51, 0xf,0x5d,0x52, 0xf,0x5d,0x53, 0xf,0x5d,0x54, 0x5,0x65,0x62, 0x7,0x44,0x4c, 0x4,0x5e,0x34, 0x7,0x44,0x4a, 0x7,0x44,0x4b, 0xf,0x61,0x4d, 0xf,0x61,0x4e, 0xf,0x61,0x4f, 0xf,0x61,0x50, 0x5,0x6a,0x3d, 0x7,0x4b,0x43, 0x7,0x55,0x6c, 0x7,0x4b,0x45, 0xf,0x64,0x4c, 0x5,0x78,0x43, 0x7,0x4b,0x42, 0x7,0x4b,0x44, 0x7,0x5f,0x77, 0xf,0x66,0x72, 0xf,0x66,0x73, 0x7,0x51,0x72, 0x5,0x71,0x5d, 0x7,0x55,0x6e, 0x7,0x55,0x6d, 0x7,0x62,0x79, 0x7,0x62,0x7a, 0x7,0x59,0x70, 0x7,0x5d,0x49, 0x7,0x5f,0x78, 0x5,0x7a,0x7e, 0x5,0x7b,0x21, 0x7,0x66,0x37, 0x7,0x66,0x28, 0x6,0x59,0x6d, 0x4,0x4e,0x4b, 0x7,0x2a,0x57, 0xf,0x52,0x79, 0xf,0x52,0x78, 0x5,0x59,0x45, 0x7,0x35,0x21, 0x4,0x59,0x56, 0x7,0x44,0x4d, 0x7,0x44,0x4e, 0x5,0x6a,0x3e, 0x7,0x50,0x7b, 0x6,0x3c,0x70, 0x6,0x3c,0x71, 0x6,0x3c,0x72, 0x6,0x46,0x2c, 0x5,0x36,0x45, 0x4,0x36,0x23, 0x6,0x46,0x2e, 0x6,0x46,0x2d, 0x6,0x46,0x30, 0x6,0x46,0x2f, 0x4,0x3b,0x70, 0x6,0x50,0x2c, 0x4,0x3b,0x6e, 0x6,0x50,0x2a, 0x6,0x59,0x73, 0x6,0x50,0x30, 0x6,0x50,0x2e, 0x6,0x50,0x2b, 0x4,0x3b,0x71, 0x4,0x3b,0x6f, 0x6,0x50,0x2f, 0x6,0x50,0x2d, 0x6,0x59,0x7b, 0x5,0x43,0x7e, 0x6,0x59,0x6e, 0x6,0x59,0x71, 0x6,0x59,0x77, 0x6,0x59,0x75, 0x6,0x59,0x7a, 0x6,0x59,0x72, 0x6,0x59,0x70, 0x6,0x59,0x74, 0x6,0x59,0x79, 0x6,0x59,0x78, 0x6,0x59,0x6f, 0x6,0x59,0x76, 0x6,0x63,0x74, 0x6,0x63,0x72, 0x5,0x4a,0x7b, 0x6,0x63,0x6b, 0x6,0x63,0x6c, 0x6,0x63,0x76, 0x6,0x63,0x68, 0x6,0x63,0x77, 0x6,0x63,0x70, 0x4,0x48,0x2a, 0x6,0x63,0x75, 0x6,0x63,0x6f, 0x5,0x4a,0x7c, 0x6,0x63,0x71, 0x6,0x63,0x69, 0x5,0x4a,0x7d, 0x4,0x48,0x2b, 0x6,0x63,0x6a, 0xf,0x4d,0x34, 0xf,0x4d,0x35, 0x6,0x63,0x73, 0x6,0x63,0x78, 0x6,0x63,0x6d, 0x7,0x2a,0x5d, 0x7,0x2a,0x5b, 0x7,0x2a,0x64, 0x7,0x2a,0x5f, 0x7,0x2a,0x5c, 0x5,0x52,0x3a, 0x7,0x2a,0x5e, 0x7,0x2a,0x66, 0x7,0x2a,0x62, 0x7,0x2a,0x60, 0x7,0x2a,0x61, 0x7,0x2a,0x63, 0x7,0x2a,0x5a, 0x7,0x2a,0x58, 0x5,0x52,0x39, 0x7,0x2a,0x65, 0x7,0x2a,0x67, 0x4,0x59,0x57, 0x4,0x54,0x55, 0x5,0x59,0x47, 0x7,0x35,0x29, 0x7,0x35,0x24, 0x7,0x35,0x2f, 0x7,0x35,0x22, 0x7,0x35,0x2d, 0x7,0x35,0x28, 0x7,0x35,0x25, 0x7,0x35,0x2c, 0x7,0x35,0x2a, 0x7,0x35,0x26, 0x5,0x59,0x46, 0x7,0x35,0x30, 0x4,0x54,0x56, 0x7,0x35,0x2b, 0x7,0x35,0x33, 0x7,0x35,0x27, 0x7,0x2a,0x59, 0x7,0x35,0x34, 0x7,0x35,0x31, 0x7,0x35,0x23, 0x7,0x35,0x32, 0xf,0x58,0x6d, 0x7,0x35,0x2e, 0xf,0x52,0x7a, 0x4,0x59,0x59, 0x7,0x3d,0x3d, 0x7,0x3d,0x3b, 0x7,0x3d,0x45, 0x7,0x3d,0x3c, 0x7,0x3d,0x3e, 0x7,0x3d,0x49, 0x7,0x3d,0x3a, 0x7,0x3d,0x42, 0x7,0x3d,0x39, 0x7,0x3d,0x38, 0x7,0x3d,0x3f, 0x5,0x5f,0x58, 0x7,0x3d,0x47, 0x7,0x3d,0x41, 0x7,0x3d,0x40, 0x7,0x3d,0x43, 0x7,0x3d,0x48, 0x7,0x35,0x36, 0xf,0x5d,0x55, 0xf,0x5d,0x57, 0x7,0x3d,0x44, 0x7,0x3d,0x46, 0x7,0x44,0x50, 0x7,0x44,0x56, 0x7,0x44,0x52, 0x7,0x44,0x53, 0x7,0x44,0x4f, 0x5,0x65,0x63, 0x7,0x44,0x57, 0x7,0x44,0x55, 0x5,0x65,0x64, 0x7,0x44,0x51, 0x7,0x44,0x54, 0x7,0x4b,0x4a, 0x7,0x4b,0x47, 0x7,0x4b,0x4b, 0x7,0x4b,0x48, 0x5,0x6a,0x3f, 0x7,0x4b,0x4e, 0x4,0x61,0x6f, 0x5,0x6a,0x40, 0x7,0x4b,0x46, 0x7,0x4b,0x4c, 0x7,0x4b,0x4d, 0x4,0x61,0x70, 0x7,0x4b,0x49, 0x7,0x4b,0x4f, 0x7,0x51,0x23, 0x7,0x51,0x27, 0x7,0x50,0x7d, 0x7,0x51,0x2a, 0x7,0x51,0x24, 0x7,0x51,0x2b, 0x7,0x51,0x28, 0x7,0x50,0x7c, 0x5,0x6e,0x42, 0x7,0x51,0x25, 0x7,0x51,0x26, 0x5,0x6e,0x43, 0x7,0x51,0x22, 0xf,0x66,0x74, 0x7,0x50,0x7e, 0x7,0x51,0x2c, 0x7,0x51,0x29, 0x7,0x55,0x74, 0x4,0x67,0x68, 0x7,0x55,0x72, 0x7,0x55,0x6f, 0x7,0x55,0x76, 0x7,0x55,0x70, 0x7,0x55,0x75, 0x7,0x55,0x73, 0x7,0x55,0x77, 0x7,0x51,0x21, 0xf,0x68,0x76, 0x7,0x55,0x71, 0x7,0x59,0x71, 0x7,0x59,0x72, 0x4,0x69,0x57, 0x7,0x59,0x75, 0x7,0x59,0x76, 0x7,0x59,0x74, 0xf,0x6a,0x32, 0x7,0x59,0x73, 0x7,0x5d,0x38, 0x7,0x5d,0x39, 0x7,0x5d,0x3a, 0x4,0x6b,0x2b, 0x7,0x5d,0x37, 0x7,0x5d,0x33, 0x7,0x5d,0x34, 0x7,0x5d,0x35, 0x7,0x5d,0x36, 0x7,0x5f,0x7c, 0x7,0x5f,0x7a, 0x7,0x5f,0x7b, 0x7,0x5f,0x79, 0x7,0x61,0x5a, 0xf,0x6c,0x41, 0x7,0x63,0x7e, 0x7,0x64,0x6b, 0x7,0x66,0x40, 0xf,0x2d,0x5e, 0x5,0x30,0x70, 0xf,0x32,0x70, 0x6,0x46,0x32, 0x6,0x46,0x33, 0x4,0x36,0x25, 0x6,0x46,0x31, 0xf,0x39,0x28, 0xf,0x39,0x29, 0x5,0x3d,0x40, 0x5,0x3d,0x3e, 0x5,0x3d,0x41, 0x5,0x3d,0x3f, 0x4,0x3b,0x73, 0x6,0x50,0x33, 0x4,0x3b,0x72, 0x6,0x50,0x32, 0xf,0x40,0x25, 0xf,0x40,0x27, 0xf,0x40,0x26, 0x4,0x41,0x58, 0x5,0x44,0x25, 0x5,0x44,0x22, 0x5,0x44,0x21, 0x5,0x44,0x24, 0x5,0x44,0x23, 0x6,0x59,0x7c, 0xf,0x46,0x2b, 0xf,0x46,0x2c, 0xf,0x46,0x2d, 0x5,0x44,0x26, 0x5,0x4b,0x22, 0x4,0x48,0x30, 0x5,0x4b,0x23, 0x5,0x4b,0x21, 0x5,0x4a,0x7e, 0x4,0x48,0x2c, 0x4,0x48,0x2f, 0x6,0x63,0x7d, 0x4,0x48,0x32, 0x6,0x63,0x7c, 0x6,0x63,0x7e, 0xf,0x4d,0x37, 0xf,0x4d,0x38, 0x6,0x63,0x7a, 0x6,0x63,0x79, 0x7,0x2a,0x6a, 0x7,0x2a,0x69, 0x5,0x52,0x45, 0x5,0x52,0x40, 0x5,0x52,0x41, 0x5,0x52,0x3f, 0x5,0x52,0x3e, 0x5,0x52,0x43, 0x5,0x52,0x3d, 0x4,0x54,0x57, 0x5,0x52,0x3c, 0x7,0x2a,0x6b, 0x7,0x2a,0x6c, 0xf,0x46,0x2a, 0xf,0x52,0x7b, 0xf,0x52,0x7c, 0xf,0x52,0x7d, 0xf,0x52,0x7e, 0xf,0x53,0x21, 0x7,0x2a,0x68, 0x5,0x52,0x44, 0x5,0x52,0x42, 0x5,0x5f,0x59, 0x7,0x35,0x3b, 0x4,0x54,0x5b, 0x5,0x59,0x4e, 0x5,0x59,0x4b, 0x4,0x54,0x5a, 0x7,0x35,0x38, 0x5,0x59,0x4d, 0x5,0x59,0x4a, 0x7,0x35,0x3a, 0x5,0x59,0x49, 0x7,0x35,0x39, 0x7,0x35,0x37, 0x5,0x59,0x48, 0x7,0x35,0x3c, 0xf,0x58,0x6e, 0xf,0x58,0x6f, 0xf,0x58,0x71, 0xf,0x58,0x72, 0xf,0x58,0x73, 0xf,0x58,0x74, 0xf,0x58,0x75, 0xf,0x58,0x70, 0xf,0x55,0x64, 0x5,0x59,0x4c, 0x4,0x59,0x5c, 0x4,0x59,0x5a, 0x4,0x59,0x5b, 0x5,0x5f,0x5a, 0x4,0x59,0x61, 0x5,0x5f,0x5c, 0x4,0x59,0x5e, 0x7,0x3d,0x4a, 0x5,0x65,0x68, 0x7,0x3d,0x4b, 0x7,0x3d,0x4d, 0x5,0x5f,0x5b, 0xf,0x5d,0x59, 0x7,0x3d,0x4c, 0x7,0x3d,0x4e, 0xf,0x5d,0x5a, 0x5,0x5f,0x5d, 0x5,0x65,0x6c, 0x5,0x65,0x6f, 0x7,0x44,0x5f, 0x7,0x44,0x63, 0x5,0x65,0x69, 0x7,0x44,0x5e, 0x5,0x65,0x66, 0x7,0x44,0x65, 0x7,0x44,0x62, 0x4,0x5e,0x37, 0x5,0x65,0x65, 0x5,0x65,0x67, 0x7,0x44,0x61, 0x7,0x44,0x5a, 0x7,0x44,0x5d, 0x5,0x65,0x6e, 0x7,0x44,0x5b, 0xf,0x61,0x51, 0x7,0x44,0x64, 0x7,0x44,0x59, 0x7,0x44,0x5c, 0x5,0x65,0x6b, 0x5,0x65,0x6d, 0xf,0x5d,0x58, 0x5,0x65,0x6a, 0x5,0x6a,0x47, 0x5,0x6a,0x41, 0x5,0x6a,0x45, 0x5,0x6a,0x42, 0x5,0x6a,0x43, 0x4,0x61,0x72, 0x5,0x6a,0x46, 0x5,0x6a,0x44, 0x5,0x6a,0x49, 0x4,0x61,0x71, 0x7,0x4b,0x50, 0x7,0x4b,0x55, 0x7,0x4b,0x51, 0x5,0x6a,0x48, 0x7,0x4b,0x53, 0xf,0x64,0x4e, 0x7,0x4b,0x57, 0x7,0x4b,0x56, 0x7,0x4b,0x54, 0x7,0x4b,0x52, 0x7,0x4b,0x58, 0x7,0x51,0x2e, 0x4,0x64,0x74, 0x7,0x51,0x36, 0x4,0x64,0x76, 0x5,0x6e,0x44, 0x4,0x67,0x6d, 0x4,0x64,0x78, 0x7,0x51,0x34, 0x7,0x51,0x33, 0x5,0x6e,0x45, 0x4,0x64,0x7a, 0x4,0x64,0x77, 0x4,0x64,0x79, 0x7,0x51,0x2f, 0x7,0x51,0x31, 0x7,0x51,0x32, 0xf,0x66,0x75, 0x7,0x51,0x35, 0x7,0x51,0x37, 0x7,0x51,0x30, 0x7,0x51,0x2d, 0x4,0x67,0x6a, 0x4,0x67,0x69, 0x7,0x55,0x78, 0x5,0x71,0x5e, 0x5,0x71,0x5f, 0x4,0x67,0x6b, 0x4,0x67,0x6c, 0x7,0x55,0x7a, 0x5,0x71,0x60, 0x5,0x71,0x61, 0x7,0x55,0x7d, 0x7,0x55,0x79, 0x7,0x55,0x7e, 0x7,0x55,0x7b, 0x5,0x74,0x5c, 0x5,0x74,0x5f, 0x4,0x69,0x59, 0x7,0x59,0x78, 0x5,0x74,0x5d, 0x7,0x59,0x79, 0x7,0x59,0x7a, 0x5,0x74,0x5a, 0x5,0x74,0x5e, 0x5,0x74,0x5b, 0x7,0x59,0x77, 0x5,0x76,0x62, 0x7,0x5d,0x3b, 0x7,0x5d,0x3c, 0xf,0x6b,0x33, 0x5,0x76,0x63, 0x5,0x78,0x44, 0x4,0x6c,0x32, 0x4,0x6c,0x31, 0x7,0x5f,0x7d, 0x7,0x5f,0x7e, 0x7,0x60,0x21, 0xf,0x6b,0x70, 0x4,0x6d,0x2c, 0x5,0x79,0x56, 0x4,0x6d,0x2b, 0x5,0x79,0x55, 0x7,0x61,0x5b, 0x5,0x79,0x57, 0x5,0x7a,0x44, 0x7,0x62,0x7b, 0x5,0x7a,0x43, 0x7,0x62,0x7c, 0xf,0x6c,0x59, 0x7,0x63,0x23, 0x5,0x7a,0x42, 0x7,0x64,0x6c, 0x4,0x6e,0x3e, 0x7,0x65,0x4b, 0x7,0x65,0x4a, 0x7,0x65,0x4c, 0x5,0x7b,0x6c, 0x7,0x66,0x2d, 0x7,0x66,0x4e, 0x7,0x66,0x51, 0x4,0x6e,0x5c, 0x4,0x36,0x26, 0x6,0x50,0x34, 0xf,0x46,0x2e, 0xf,0x46,0x2f, 0xf,0x46,0x30, 0x6,0x59,0x7d, 0x4,0x48,0x36, 0x7,0x2c,0x44, 0x7,0x35,0x3d, 0x5,0x5a,0x74, 0x7,0x44,0x66, 0xf,0x64,0x4f, 0x5,0x71,0x62, 0xf,0x6b,0x71, 0x6,0x3c,0x74, 0x6,0x2e,0x49, 0x6,0x3c,0x73, 0x4,0x36,0x27, 0x6,0x46,0x34, 0x4,0x36,0x29, 0xf,0x39,0x2d, 0x6,0x50,0x35, 0x5,0x3d,0x42, 0x4,0x3b,0x75, 0x6,0x50,0x37, 0x6,0x50,0x36, 0xf,0x40,0x28, 0xf,0x40,0x29, 0x6,0x5a,0x21, 0x6,0x59,0x7e, 0xf,0x4d,0x3b, 0x4,0x4e,0x4d, 0x7,0x2a,0x6e, 0x7,0x2a,0x6d, 0x7,0x35,0x3e, 0x7,0x51,0x38, 0x7,0x51,0x39, 0x6,0x50,0x39, 0x6,0x50,0x3a, 0x6,0x50,0x38, 0x4,0x41,0x59, 0x4,0x41,0x5b, 0x5,0x44,0x28, 0x5,0x44,0x27, 0x6,0x5a,0x23, 0x6,0x5a,0x22, 0x6,0x64,0x22, 0x5,0x4b,0x25, 0x4,0x48,0x39, 0x6,0x64,0x21, 0x5,0x4b,0x24, 0xf,0x4d,0x3c, 0x6,0x64,0x23, 0x4,0x4e,0x4e, 0x5,0x52,0x46, 0x5,0x52,0x48, 0x5,0x52,0x47, 0x7,0x2a,0x70, 0x7,0x2a,0x6f, 0xf,0x58,0x77, 0x5,0x59,0x50, 0x5,0x59,0x4f, 0x5,0x59,0x54, 0x5,0x59,0x51, 0x5,0x59,0x52, 0x5,0x59,0x53, 0xf,0x58,0x76, 0x7,0x35,0x3f, 0x7,0x3d,0x4f, 0x5,0x5f,0x5f, 0x5,0x5f,0x60, 0x5,0x5f,0x62, 0x5,0x5f,0x61, 0xf,0x5d,0x5b, 0x7,0x3d,0x51, 0x5,0x65,0x72, 0x7,0x44,0x67, 0x5,0x65,0x70, 0x5,0x65,0x71, 0x4,0x5e,0x39, 0x5,0x6a,0x4b, 0x5,0x6a,0x4a, 0x5,0x6e,0x47, 0x5,0x6e,0x46, 0x7,0x4d,0x50, 0x7,0x51,0x3a, 0x5,0x6c,0x46, 0x5,0x71,0x64, 0x7,0x56,0x22, 0x5,0x71,0x66, 0x5,0x71,0x65, 0xf,0x68,0x79, 0x7,0x56,0x21, 0x7,0x56,0x24, 0x7,0x56,0x23, 0x7,0x59,0x7b, 0x7,0x59,0x7c, 0x7,0x5d,0x3d, 0x5,0x76,0x64, 0xf,0x6b,0x34, 0x7,0x60,0x22, 0x5,0x7a,0x45, 0x7,0x64,0x21, 0x7,0x64,0x6e, 0x7,0x64,0x6d, 0xf,0x39,0x2e, 0x5,0x3d,0x43, 0x4,0x3b,0x78, 0x6,0x50,0x3b, 0x5,0x44,0x2c, 0x5,0x44,0x2b, 0x6,0x5a,0x26, 0x6,0x5a,0x29, 0x5,0x44,0x2a, 0x6,0x5a,0x27, 0x5,0x44,0x29, 0x6,0x5a,0x25, 0x6,0x5a,0x2b, 0x6,0x5a,0x2a, 0x4,0x41,0x5c, 0x4,0x41,0x5e, 0xf,0x46,0x31, 0x5,0x4b,0x27, 0x4,0x48,0x3c, 0x5,0x4b,0x26, 0x6,0x64,0x27, 0x6,0x64,0x25, 0x5,0x4b,0x28, 0x5,0x4b,0x29, 0x4,0x48,0x3e, 0x5,0x4b,0x2c, 0x5,0x4b,0x2a, 0x5,0x4b,0x2d, 0x5,0x4b,0x2b, 0x6,0x64,0x29, 0x4,0x48,0x3f, 0x6,0x64,0x28, 0x6,0x64,0x24, 0x6,0x64,0x26, 0x7,0x2a,0x73, 0x5,0x52,0x49, 0x7,0x2a,0x77, 0x7,0x2a,0x76, 0x4,0x4e,0x51, 0x7,0x2a,0x79, 0x5,0x52,0x4a, 0x4,0x4e,0x52, 0x7,0x2a,0x75, 0x4,0x4e,0x53, 0x5,0x52,0x4d, 0x4,0x4e,0x50, 0x5,0x52,0x4c, 0x5,0x52,0x4e, 0x7,0x2a,0x74, 0x5,0x52,0x4b, 0x7,0x2a,0x78, 0x7,0x2a,0x72, 0x7,0x35,0x44, 0x5,0x59,0x55, 0x5,0x59,0x58, 0x4,0x54,0x66, 0x4,0x54,0x5e, 0x4,0x54,0x65, 0x5,0x59,0x56, 0x5,0x59,0x57, 0x7,0x35,0x43, 0x7,0x35,0x47, 0x7,0x35,0x40, 0x7,0x35,0x41, 0x7,0x35,0x45, 0x7,0x35,0x46, 0x7,0x3d,0x58, 0x7,0x3d,0x5a, 0x5,0x5f,0x63, 0x5,0x5f,0x69, 0x4,0x59,0x66, 0x5,0x5f,0x65, 0x7,0x3d,0x53, 0x4,0x59,0x67, 0x7,0x35,0x42, 0x5,0x5f,0x6d, 0x7,0x3d,0x57, 0x4,0x59,0x65, 0x7,0x3d,0x59, 0x5,0x5f,0x67, 0x5,0x5f,0x6a, 0x7,0x3d,0x55, 0x5,0x5f,0x6b, 0x7,0x3d,0x5b, 0x7,0x35,0x48, 0x5,0x5f,0x68, 0x7,0x3d,0x54, 0x7,0x3d,0x5c, 0xf,0x5d,0x5c, 0x7,0x3d,0x52, 0x5,0x5f,0x6c, 0x5,0x5f,0x66, 0x4,0x5e,0x44, 0x5,0x65,0x7c, 0x5,0x65,0x74, 0x4,0x5e,0x3a, 0x5,0x65,0x76, 0x5,0x66,0x22, 0x7,0x44,0x6a, 0x7,0x44,0x68, 0x4,0x5e,0x3f, 0x5,0x65,0x77, 0x4,0x5e,0x40, 0x7,0x44,0x6d, 0x7,0x44,0x70, 0x5,0x66,0x21, 0x7,0x44,0x6f, 0x4,0x5e,0x3d, 0x5,0x66,0x23, 0x7,0x44,0x71, 0x7,0x44,0x72, 0x7,0x44,0x6e, 0xf,0x61,0x53, 0xf,0x61,0x54, 0x5,0x5f,0x64, 0x7,0x44,0x6c, 0x7,0x44,0x6b, 0x5,0x65,0x78, 0x5,0x66,0x24, 0x7,0x44,0x69, 0x5,0x65,0x75, 0x5,0x65,0x7a, 0x5,0x65,0x79, 0x5,0x65,0x7d, 0x4,0x61,0x7a, 0x5,0x6a,0x51, 0x5,0x6a,0x54, 0x5,0x6a,0x4f, 0x4,0x61,0x79, 0x5,0x6a,0x4d, 0x7,0x4b,0x5a, 0x5,0x6a,0x55, 0x7,0x4b,0x63, 0x5,0x6a,0x4e, 0x4,0x61,0x78, 0x7,0x4b,0x61, 0x4,0x61,0x76, 0x7,0x4b,0x5e, 0x4,0x61,0x75, 0x7,0x4b,0x62, 0x5,0x6a,0x50, 0x7,0x4b,0x60, 0xf,0x64,0x50, 0xf,0x64,0x52, 0xf,0x64,0x53, 0x7,0x4b,0x5b, 0x7,0x4b,0x5c, 0x5,0x6a,0x53, 0x5,0x6a,0x52, 0x7,0x4b,0x59, 0x5,0x6a,0x4c, 0x4,0x65,0x24, 0x5,0x6e,0x4e, 0x4,0x64,0x7d, 0x5,0x6e,0x4f, 0x5,0x6e,0x4a, 0x7,0x51,0x3b, 0x5,0x6e,0x48, 0x7,0x51,0x3d, 0x4,0x65,0x21, 0x5,0x6e,0x4c, 0x4,0x65,0x22, 0x4,0x65,0x25, 0x5,0x6e,0x4d, 0x7,0x51,0x41, 0x7,0x51,0x3c, 0xf,0x66,0x78, 0x7,0x51,0x3e, 0x7,0x51,0x43, 0x7,0x51,0x40, 0x5,0x6e,0x4b, 0x7,0x51,0x3f, 0x5,0x6e,0x50, 0x4,0x65,0x26, 0x7,0x51,0x42, 0x5,0x71,0x6d, 0x7,0x56,0x28, 0x4,0x67,0x6f, 0x7,0x56,0x2a, 0x7,0x56,0x2b, 0x5,0x71,0x6a, 0x5,0x71,0x6b, 0x5,0x71,0x6c, 0x5,0x71,0x67, 0x5,0x71,0x68, 0x7,0x56,0x29, 0xf,0x66,0x77, 0x5,0x74,0x60, 0x7,0x5a,0x26, 0x7,0x59,0x7d, 0x4,0x69,0x5d, 0x5,0x74,0x61, 0x7,0x5a,0x25, 0x7,0x5a,0x23, 0x7,0x59,0x7e, 0x7,0x5a,0x24, 0x5,0x74,0x63, 0x5,0x74,0x64, 0x7,0x5a,0x21, 0x7,0x5a,0x22, 0x5,0x74,0x65, 0x5,0x76,0x65, 0x5,0x76,0x68, 0x5,0x76,0x66, 0x7,0x5d,0x3e, 0x5,0x76,0x69, 0x5,0x76,0x67, 0x7,0x5d,0x41, 0x7,0x5d,0x3f, 0x7,0x5d,0x42, 0x7,0x5d,0x40, 0x5,0x78,0x46, 0x5,0x79,0x58, 0x7,0x60,0x23, 0x5,0x78,0x45, 0x5,0x78,0x47, 0x7,0x61,0x5e, 0x7,0x61,0x5c, 0x7,0x61,0x5d, 0x5,0x7a,0x46, 0x7,0x62,0x7e, 0x7,0x63,0x22, 0x5,0x79,0x59, 0x7,0x63,0x21, 0x7,0x62,0x7d, 0x5,0x7b,0x22, 0x7,0x64,0x70, 0x7,0x64,0x6f, 0x5,0x7b,0x4c, 0x7,0x65,0x69, 0x5,0x7c,0x35, 0x7,0x66,0x2e, 0x7,0x66,0x39, 0x7,0x66,0x38, 0x5,0x7c,0x4c, 0x5,0x3d,0x44, 0x4,0x41,0x60, 0x4,0x41,0x62, 0x6,0x5a,0x2c, 0x5,0x44,0x2d, 0x6,0x64,0x2b, 0x5,0x4b,0x2f, 0x5,0x4b,0x31, 0x5,0x4b,0x2e, 0x5,0x4b,0x30, 0x6,0x64,0x2a, 0xf,0x4d,0x3d, 0x5,0x4b,0x32, 0x4,0x4e,0x55, 0x5,0x52,0x50, 0x4,0x4e,0x54, 0x4,0x4e,0x56, 0x7,0x2a,0x7b, 0x7,0x2a,0x7a, 0x7,0x2a,0x7c, 0x7,0x2a,0x7d, 0x7,0x2a,0x7e, 0x5,0x52,0x4f, 0x5,0x52,0x51, 0x5,0x59,0x59, 0x7,0x35,0x49, 0x7,0x35,0x4a, 0x5,0x59,0x5c, 0x5,0x59,0x5d, 0x5,0x59,0x5b, 0x7,0x35,0x4b, 0x5,0x59,0x5a, 0x4,0x59,0x69, 0x7,0x3d,0x5e, 0x5,0x5f,0x6e, 0x7,0x3d,0x5f, 0x4,0x59,0x6c, 0x4,0x59,0x6a, 0x5,0x5f,0x6f, 0x5,0x5f,0x70, 0xf,0x5d,0x5d, 0x7,0x3d,0x5d, 0x7,0x3d,0x60, 0x7,0x44,0x76, 0x7,0x44,0x73, 0x4,0x5e,0x46, 0x7,0x44,0x74, 0x7,0x3d,0x61, 0x5,0x66,0x25, 0x7,0x44,0x78, 0x7,0x44,0x75, 0x7,0x4b,0x64, 0x7,0x4b,0x66, 0x7,0x4b,0x69, 0x7,0x4b,0x65, 0x7,0x4b,0x68, 0x7,0x4b,0x67, 0x7,0x51,0x44, 0x5,0x6a,0x56, 0x5,0x6a,0x57, 0x7,0x51,0x45, 0x7,0x51,0x46, 0x4,0x65,0x28, 0xf,0x66,0x79, 0x5,0x6e,0x52, 0x5,0x6e,0x51, 0x5,0x71,0x6e, 0x5,0x71,0x70, 0x5,0x71,0x72, 0x4,0x67,0x74, 0x7,0x56,0x2c, 0x5,0x71,0x6f, 0x5,0x71,0x71, 0x7,0x5a,0x27, 0x4,0x69,0x5f, 0x5,0x74,0x66, 0x7,0x5a,0x28, 0x7,0x5a,0x29, 0x5,0x74,0x67, 0x7,0x5d,0x43, 0x7,0x5d,0x46, 0x7,0x5d,0x45, 0x7,0x5d,0x44, 0x4,0x6c,0x35, 0x7,0x61,0x5f, 0x5,0x7a,0x47, 0x7,0x64,0x24, 0x7,0x64,0x22, 0x7,0x64,0x23, 0x5,0x7b,0x4d, 0x5,0x7b,0x6d, 0x5,0x7c,0x22, 0x5,0x44,0x2e, 0x6,0x5a,0x2d, 0x5,0x52,0x52, 0x7,0x35,0x4c, 0x4,0x59,0x6d, 0x7,0x3d,0x62, 0x7,0x4b,0x6c, 0x7,0x51,0x48, 0x4,0x65,0x2b, 0x5,0x71,0x73, 0x7,0x51,0x47, 0x7,0x56,0x2d, 0x7,0x5a,0x2a, 0x7,0x5d,0x48, 0x7,0x5d,0x47, 0x7,0x61,0x60, 0xf,0x40,0x2c, 0x5,0x44,0x30, 0x5,0x44,0x2f, 0x5,0x4b,0x33, 0x4,0x48,0x45, 0x5,0x4b,0x34, 0x5,0x52,0x5a, 0x7,0x2b,0x21, 0x5,0x52,0x54, 0x5,0x52,0x57, 0x7,0x2b,0x22, 0x5,0x52,0x55, 0x5,0x52,0x56, 0x5,0x52,0x59, 0x5,0x52,0x53, 0x4,0x54,0x6b, 0x5,0x52,0x58, 0xf,0x58,0x79, 0x5,0x59,0x5e, 0x7,0x35,0x4d, 0x7,0x3d,0x63, 0x5,0x5f,0x71, 0x5,0x5f,0x72, 0x5,0x66,0x26, 0x5,0x66,0x27, 0x5,0x66,0x28, 0x4,0x62,0x21, 0x5,0x6a,0x58, 0x5,0x6a,0x59, 0x7,0x51,0x49, 0x7,0x51,0x4a, 0x5,0x6e,0x54, 0x5,0x6e,0x53, 0x5,0x6e,0x55, 0x7,0x56,0x2e, 0x5,0x71,0x74, 0x5,0x66,0x29, 0x5,0x74,0x68, 0x5,0x74,0x69, 0x4,0x69,0x61, 0xf,0x6a,0x33, 0x7,0x5d,0x4a, 0x4,0x6c,0x36, 0x5,0x7b,0x23, 0x5,0x7c,0x3f, 0x6,0x34,0x7b, 0x6,0x46,0x35, 0x5,0x36,0x46, 0x5,0x3d,0x4a, 0x5,0x3d,0x48, 0x5,0x3d,0x49, 0x5,0x3d,0x46, 0x4,0x3b,0x7d, 0x5,0x3d,0x45, 0x4,0x3b,0x7c, 0x6,0x50,0x3c, 0x4,0x3b,0x7a, 0x4,0x41,0x6c, 0x5,0x44,0x3a, 0x4,0x41,0x6b, 0x5,0x44,0x31, 0x5,0x44,0x39, 0x6,0x5a,0x2f, 0x4,0x41,0x69, 0x5,0x4b,0x3b, 0x5,0x44,0x37, 0x4,0x41,0x66, 0x4,0x41,0x67, 0x4,0x41,0x6a, 0x6,0x5a,0x32, 0x5,0x44,0x36, 0x5,0x44,0x32, 0x6,0x5a,0x30, 0x6,0x5a,0x31, 0x6,0x5a,0x2e, 0xf,0x46,0x33, 0x5,0x44,0x33, 0x5,0x44,0x38, 0x5,0x4b,0x3d, 0x6,0x64,0x31, 0x6,0x64,0x32, 0x5,0x4b,0x37, 0x5,0x4b,0x44, 0x5,0x4b,0x38, 0x4,0x48,0x49, 0x4,0x48,0x48, 0x5,0x4b,0x3a, 0x5,0x4b,0x36, 0x4,0x48,0x4f, 0x5,0x4b,0x42, 0x5,0x4b,0x39, 0x7,0x2b,0x2b, 0x5,0x4b,0x43, 0x6,0x64,0x35, 0x6,0x64,0x33, 0x6,0x64,0x2e, 0x5,0x4b,0x3c, 0x5,0x4b,0x41, 0xf,0x4d,0x3e, 0x6,0x64,0x2d, 0x5,0x4b,0x40, 0x6,0x64,0x2c, 0x6,0x64,0x36, 0x5,0x4b,0x35, 0x6,0x64,0x2f, 0x6,0x64,0x34, 0x5,0x52,0x5d, 0x4,0x4e,0x5b, 0x7,0x2b,0x25, 0x7,0x2b,0x30, 0x5,0x52,0x5c, 0x5,0x52,0x5b, 0x4,0x4e,0x58, 0x7,0x2b,0x24, 0x7,0x2b,0x2a, 0x4,0x48,0x4a, 0x7,0x2b,0x2e, 0x5,0x52,0x5e, 0x4,0x4e,0x5e, 0x7,0x2b,0x2d, 0x7,0x2b,0x29, 0x7,0x35,0x4f, 0x7,0x2b,0x2c, 0xf,0x53,0x23, 0xf,0x53,0x24, 0x7,0x2b,0x27, 0x7,0x2b,0x28, 0x7,0x2b,0x2f, 0x7,0x2b,0x31, 0x7,0x2b,0x23, 0x7,0x2b,0x26, 0x5,0x52,0x5f, 0x4,0x54,0x6c, 0x5,0x59,0x61, 0x4,0x54,0x6e, 0x5,0x59,0x69, 0x7,0x35,0x58, 0x5,0x59,0x68, 0x5,0x59,0x66, 0x7,0x35,0x59, 0x7,0x35,0x57, 0x5,0x59,0x65, 0x5,0x59,0x63, 0x7,0x35,0x5b, 0x7,0x35,0x50, 0x5,0x59,0x6a, 0x5,0x59,0x62, 0x5,0x59,0x6b, 0x5,0x59,0x64, 0x5,0x59,0x67, 0x4,0x54,0x71, 0x7,0x35,0x4e, 0x5,0x59,0x60, 0x7,0x35,0x5a, 0x4,0x54,0x72, 0x7,0x35,0x56, 0x7,0x35,0x5c, 0xf,0x4d,0x40, 0xf,0x58,0x7a, 0xf,0x58,0x7c, 0xf,0x58,0x7d, 0xf,0x59,0x21, 0xf,0x59,0x22, 0xf,0x59,0x23, 0x7,0x35,0x52, 0x7,0x35,0x53, 0x7,0x35,0x54, 0x7,0x35,0x55, 0x5,0x59,0x6c, 0x5,0x59,0x5f, 0xf,0x58,0x7e, 0x5,0x59,0x6d, 0x4,0x59,0x75, 0x4,0x59,0x71, 0x4,0x59,0x6e, 0x7,0x3d,0x65, 0x5,0x5f,0x77, 0x4,0x59,0x79, 0x5,0x5f,0x78, 0x4,0x59,0x74, 0x5,0x5f,0x76, 0x5,0x5f,0x73, 0x5,0x5f,0x75, 0x4,0x59,0x6f, 0x5,0x5f,0x7b, 0x7,0x3d,0x6a, 0x4,0x59,0x72, 0x7,0x3d,0x6c, 0x5,0x5f,0x74, 0x7,0x3d,0x67, 0x4,0x59,0x78, 0x7,0x3d,0x6b, 0xf,0x5d,0x5e, 0xf,0x5d,0x5f, 0xf,0x5d,0x60, 0xf,0x5d,0x61, 0xf,0x5d,0x62, 0xf,0x5d,0x63, 0x7,0x3d,0x64, 0x7,0x3d,0x66, 0x5,0x5f,0x79, 0x5,0x5f,0x7a, 0x7,0x3d,0x68, 0x7,0x3d,0x6d, 0x5,0x66,0x2a, 0x4,0x5e,0x4a, 0x5,0x66,0x30, 0x5,0x66,0x2e, 0x4,0x62,0x24, 0x5,0x66,0x2d, 0x5,0x66,0x2b, 0x7,0x44,0x7b, 0x5,0x66,0x2c, 0x4,0x5e,0x48, 0x5,0x66,0x31, 0x5,0x66,0x2f, 0x7,0x44,0x7c, 0xf,0x61,0x55, 0xf,0x61,0x56, 0xf,0x61,0x57, 0xf,0x61,0x58, 0x7,0x44,0x79, 0x7,0x44,0x7a, 0x7,0x4b,0x76, 0x5,0x6a,0x5d, 0x7,0x4b,0x70, 0x7,0x4b,0x6d, 0x5,0x6a,0x5e, 0x4,0x62,0x2e, 0x7,0x4b,0x72, 0x5,0x6a,0x5c, 0x5,0x6e,0x56, 0x5,0x6a,0x5b, 0x5,0x6a,0x5a, 0x7,0x4b,0x74, 0x7,0x4b,0x6f, 0x4,0x62,0x2a, 0x7,0x4b,0x6e, 0x7,0x4b,0x75, 0x7,0x4b,0x71, 0xf,0x64,0x54, 0xf,0x64,0x55, 0x7,0x4b,0x77, 0x7,0x4b,0x73, 0x4,0x65,0x2e, 0x4,0x65,0x2d, 0x5,0x6e,0x5b, 0x5,0x6e,0x59, 0x7,0x51,0x4e, 0x5,0x6e,0x5a, 0x4,0x65,0x32, 0x7,0x51,0x4d, 0x4,0x65,0x33, 0x5,0x6e,0x58, 0x7,0x51,0x4b, 0x7,0x51,0x4f, 0xf,0x66,0x7a, 0x4,0x65,0x34, 0x7,0x51,0x50, 0x7,0x51,0x4c, 0x5,0x6e,0x57, 0x7,0x50,0x4c, 0x5,0x71,0x75, 0x5,0x71,0x76, 0x7,0x56,0x2f, 0x5,0x71,0x78, 0x7,0x56,0x38, 0x7,0x5a,0x31, 0x4,0x67,0x7a, 0x4,0x67,0x78, 0x7,0x56,0x33, 0x7,0x56,0x31, 0x7,0x56,0x36, 0x5,0x71,0x77, 0x5,0x71,0x79, 0x5,0x71,0x7a, 0x7,0x56,0x30, 0x7,0x56,0x34, 0xf,0x68,0x7a, 0xf,0x68,0x7b, 0xf,0x68,0x7c, 0x7,0x56,0x37, 0x7,0x56,0x35, 0x7,0x5a,0x30, 0x5,0x74,0x6c, 0x5,0x74,0x6b, 0x7,0x5a,0x2d, 0x7,0x5a,0x2f, 0x5,0x74,0x6a, 0xf,0x6a,0x34, 0x7,0x5a,0x2b, 0x7,0x5a,0x2e, 0x7,0x5a,0x2c, 0x7,0x5d,0x52, 0x7,0x5d,0x51, 0x7,0x5d,0x4f, 0x5,0x76,0x6c, 0x5,0x76,0x6d, 0x4,0x6b,0x2e, 0x5,0x76,0x6a, 0x7,0x5d,0x4d, 0x4,0x6b,0x2f, 0x7,0x5d,0x4e, 0xf,0x6b,0x35, 0x7,0x5d,0x50, 0x7,0x5d,0x4c, 0x7,0x5d,0x4b, 0x4,0x6c,0x38, 0x7,0x60,0x24, 0x5,0x76,0x6b, 0x4,0x6c,0x37, 0xf,0x6b,0x72, 0x7,0x60,0x25, 0x4,0x6d,0x2e, 0x5,0x79,0x5a, 0x5,0x7a,0x48, 0x7,0x63,0x24, 0x5,0x7a,0x49, 0x7,0x63,0x25, 0x7,0x63,0x26, 0x4,0x6e,0x23, 0x7,0x64,0x25, 0x7,0x65,0x4d, 0x6,0x46,0x36, 0x6,0x50,0x3f, 0x4,0x3c,0x21, 0x6,0x50,0x3d, 0x5,0x3d,0x4b, 0xf,0x40,0x2e, 0x6,0x50,0x3e, 0x5,0x44,0x3b, 0x5,0x44,0x40, 0x4,0x41,0x6f, 0x5,0x44,0x3d, 0x5,0x44,0x3e, 0x6,0x5a,0x34, 0x6,0x5a,0x36, 0x5,0x44,0x3c, 0x4,0x41,0x70, 0x6,0x5a,0x35, 0x6,0x53,0x33, 0x5,0x44,0x3f, 0x6,0x5a,0x37, 0x4,0x48,0x58, 0x5,0x4b,0x48, 0x4,0x48,0x55, 0x5,0x4b,0x47, 0x5,0x4b,0x46, 0x5,0x4b,0x45, 0x4,0x48,0x53, 0x6,0x64,0x37, 0x4,0x48,0x52, 0x6,0x64,0x3b, 0x6,0x64,0x39, 0x6,0x64,0x38, 0x4,0x4e,0x5f, 0x5,0x52,0x62, 0x4,0x4e,0x62, 0x7,0x2b,0x34, 0x7,0x2b,0x33, 0x7,0x2b,0x32, 0x5,0x52,0x61, 0x7,0x2b,0x35, 0xf,0x53,0x25, 0xf,0x53,0x26, 0x5,0x59,0x6f, 0x5,0x59,0x77, 0x5,0x59,0x70, 0x7,0x35,0x5d, 0x7,0x35,0x60, 0x5,0x59,0x6e, 0x5,0x59,0x73, 0x5,0x59,0x76, 0x7,0x35,0x5f, 0x7,0x35,0x61, 0x5,0x59,0x74, 0x5,0x59,0x75, 0x7,0x35,0x5e, 0xf,0x59,0x25, 0x5,0x59,0x72, 0x5,0x59,0x71, 0x7,0x3d,0x71, 0x4,0x5a,0x25, 0x5,0x60,0x25, 0x5,0x60,0x26, 0x4,0x59,0x7b, 0x5,0x5f,0x7c, 0x7,0x3d,0x70, 0x4,0x5a,0x24, 0x5,0x66,0x32, 0x5,0x60,0x22, 0x4,0x5a,0x23, 0x5,0x5f,0x7e, 0x5,0x60,0x21, 0x5,0x60,0x24, 0x5,0x5f,0x7d, 0x5,0x60,0x23, 0x7,0x3d,0x6e, 0xf,0x5d,0x64, 0xf,0x5d,0x65, 0x7,0x3d,0x72, 0x7,0x3d,0x6f, 0x4,0x5e,0x53, 0x7,0x45,0x22, 0x7,0x45,0x24, 0x5,0x66,0x37, 0x7,0x45,0x26, 0x5,0x66,0x34, 0x5,0x66,0x38, 0x4,0x5e,0x54, 0x5,0x66,0x3a, 0x4,0x62,0x31, 0x5,0x66,0x35, 0x7,0x45,0x25, 0x5,0x66,0x36, 0x5,0x66,0x39, 0x5,0x66,0x33, 0xf,0x61,0x59, 0x7,0x45,0x28, 0x7,0x45,0x23, 0x7,0x45,0x21, 0x7,0x45,0x27, 0x7,0x44,0x7d, 0x5,0x6a,0x5f, 0x4,0x62,0x33, 0x4,0x62,0x34, 0x4,0x62,0x35, 0x5,0x6a,0x60, 0x7,0x4b,0x79, 0xf,0x64,0x56, 0xf,0x64,0x57, 0x7,0x4b,0x78, 0x7,0x4b,0x7a, 0x7,0x4b,0x7b, 0x7,0x4b,0x7c, 0x5,0x6e,0x5e, 0x5,0x6e,0x61, 0x5,0x6e,0x60, 0x4,0x65,0x35, 0x5,0x6e,0x5c, 0x4,0x65,0x37, 0x5,0x6e,0x5f, 0xf,0x66,0x7b, 0x5,0x6e,0x62, 0x5,0x6e,0x5d, 0x4,0x65,0x38, 0x7,0x56,0x40, 0x4,0x67,0x7d, 0x4,0x68,0x21, 0x5,0x71,0x7b, 0x7,0x56,0x39, 0x5,0x71,0x7c, 0x7,0x56,0x3c, 0x7,0x56,0x3a, 0xf,0x68,0x7d, 0x7,0x56,0x3f, 0x7,0x56,0x41, 0x7,0x56,0x42, 0x7,0x56,0x3d, 0x7,0x56,0x3e, 0x7,0x56,0x3b, 0x7,0x5a,0x32, 0xf,0x6a,0x35, 0x7,0x5a,0x33, 0x7,0x5d,0x53, 0x5,0x78,0x49, 0x4,0x6c,0x3b, 0x7,0x60,0x26, 0x7,0x60,0x27, 0x5,0x79,0x5b, 0x7,0x61,0x61, 0x5,0x79,0x5c, 0x4,0x6d,0x2f, 0x4,0x6d,0x66, 0x5,0x7a,0x4a, 0x5,0x7b,0x24, 0x7,0x64,0x26, 0xf,0x6d,0x24, 0x5,0x7c,0x47, 0x7,0x66,0x55, 0x6,0x3c,0x75, 0x5,0x40,0x39, 0x7,0x2b,0x36, 0x7,0x4b,0x7d, 0x5,0x6a,0x61, 0x7,0x56,0x43, 0x4,0x69,0x64, 0x5,0x74,0x6d, 0x6,0x34,0x7c, 0x6,0x34,0x7d, 0x6,0x35,0x22, 0x6,0x34,0x7e, 0x5,0x30,0x71, 0x6,0x3c,0x76, 0x6,0x3c,0x78, 0x5,0x3d,0x4c, 0x5,0x36,0x4a, 0x5,0x36,0x47, 0x6,0x46,0x3a, 0x6,0x46,0x38, 0x5,0x36,0x49, 0x6,0x46,0x39, 0x6,0x46,0x3b, 0x6,0x50,0x40, 0x5,0x36,0x48, 0x6,0x50,0x41, 0x6,0x50,0x46, 0x4,0x3c,0x22, 0x5,0x3d,0x4d, 0x6,0x50,0x44, 0x6,0x50,0x45, 0x4,0x3c,0x26, 0x5,0x3d,0x4e, 0x6,0x5a,0x38, 0x5,0x3d,0x4f, 0x6,0x50,0x42, 0xf,0x40,0x2f, 0x6,0x50,0x43, 0x4,0x3c,0x23, 0x6,0x5a,0x42, 0x6,0x5a,0x39, 0x5,0x44,0x42, 0x5,0x44,0x44, 0x5,0x44,0x41, 0x5,0x44,0x47, 0x4,0x41,0x76, 0x5,0x44,0x43, 0x6,0x64,0x43, 0x5,0x44,0x45, 0x6,0x5a,0x3c, 0x6,0x5a,0x3b, 0x6,0x64,0x3d, 0x4,0x41,0x73, 0x6,0x5a,0x3a, 0x6,0x64,0x3e, 0x6,0x5a,0x3e, 0x5,0x44,0x48, 0x6,0x5a,0x41, 0x5,0x52,0x63, 0xf,0x46,0x37, 0x6,0x5a,0x40, 0x6,0x5a,0x3f, 0x6,0x64,0x3c, 0x4,0x41,0x78, 0x5,0x44,0x46, 0x6,0x64,0x3f, 0x7,0x2b,0x37, 0x6,0x64,0x44, 0x5,0x4b,0x4d, 0x5,0x4b,0x49, 0x6,0x64,0x45, 0x5,0x4b,0x4a, 0x4,0x48,0x5a, 0x6,0x64,0x42, 0x5,0x4b,0x4b, 0x7,0x2b,0x39, 0x6,0x64,0x41, 0xf,0x46,0x36, 0xf,0x53,0x28, 0x7,0x2b,0x3a, 0x4,0x4e,0x6b, 0x7,0x2b,0x40, 0x4,0x4e,0x6a, 0x5,0x52,0x69, 0x5,0x52,0x64, 0x5,0x59,0x79, 0x4,0x4e,0x68, 0x5,0x52,0x66, 0x5,0x52,0x6b, 0x5,0x52,0x68, 0x4,0x4e,0x6c, 0x5,0x52,0x6a, 0x7,0x2b,0x3c, 0x5,0x52,0x65, 0x7,0x2b,0x3b, 0x7,0x3d,0x73, 0x5,0x52,0x67, 0x7,0x2b,0x3e, 0x7,0x2b,0x3d, 0xf,0x53,0x27, 0x5,0x59,0x78, 0x7,0x2b,0x3f, 0x5,0x5a,0x23, 0x4,0x5a,0x26, 0x5,0x5a,0x24, 0x4,0x54,0x7b, 0x7,0x35,0x66, 0x7,0x35,0x6a, 0x5,0x60,0x27, 0x5,0x59,0x7b, 0x7,0x35,0x69, 0x5,0x59,0x7e, 0x7,0x35,0x67, 0x5,0x59,0x7c, 0x7,0x35,0x6f, 0x4,0x54,0x79, 0x7,0x35,0x6b, 0x7,0x35,0x70, 0x5,0x5a,0x25, 0x7,0x35,0x68, 0x7,0x35,0x63, 0x5,0x59,0x7a, 0x7,0x35,0x65, 0x7,0x35,0x64, 0x7,0x35,0x6c, 0x5,0x60,0x29, 0x7,0x35,0x6e, 0x7,0x3d,0x75, 0x7,0x35,0x62, 0x5,0x5a,0x22, 0x7,0x35,0x6d, 0x5,0x59,0x7d, 0xf,0x59,0x26, 0xf,0x59,0x27, 0xf,0x59,0x28, 0xf,0x59,0x29, 0x5,0x5a,0x21, 0x7,0x3d,0x74, 0x5,0x60,0x28, 0x5,0x60,0x34, 0x7,0x3d,0x77, 0x5,0x60,0x2d, 0x5,0x60,0x2f, 0x5,0x60,0x33, 0x5,0x60,0x2b, 0x7,0x3d,0x76, 0x5,0x60,0x32, 0x5,0x60,0x35, 0x4,0x5a,0x2b, 0x5,0x60,0x36, 0x7,0x3d,0x78, 0x7,0x3d,0x7d, 0x7,0x45,0x2a, 0x7,0x3d,0x7a, 0x5,0x60,0x2a, 0x7,0x45,0x2b, 0x7,0x3e,0x21, 0x5,0x60,0x2e, 0x7,0x3d,0x79, 0x7,0x3d,0x7e, 0xf,0x5d,0x66, 0xf,0x5d,0x67, 0x7,0x3d,0x7b, 0x5,0x60,0x30, 0x7,0x3d,0x7c, 0x7,0x45,0x2f, 0x5,0x66,0x3f, 0x5,0x66,0x3b, 0x4,0x5e,0x56, 0x4,0x5e,0x5c, 0x5,0x60,0x38, 0x4,0x5e,0x5d, 0x5,0x66,0x3d, 0x5,0x60,0x37, 0x5,0x66,0x3c, 0x7,0x45,0x2e, 0x7,0x45,0x2d, 0x7,0x4b,0x7e, 0x4,0x5e,0x5e, 0x5,0x66,0x3e, 0x7,0x4c,0x22, 0x7,0x51,0x54, 0x7,0x45,0x2c, 0x7,0x45,0x29, 0x7,0x45,0x31, 0xf,0x61,0x5a, 0xf,0x61,0x5b, 0x7,0x4c,0x25, 0x7,0x4c,0x21, 0x4,0x5e,0x55, 0x7,0x45,0x32, 0x7,0x45,0x30, 0x5,0x6a,0x64, 0x7,0x4c,0x23, 0x5,0x6a,0x62, 0x4,0x62,0x3b, 0x4,0x65,0x3d, 0x7,0x51,0x53, 0x5,0x6a,0x69, 0x5,0x6a,0x66, 0x5,0x6a,0x68, 0x5,0x6a,0x6a, 0x7,0x51,0x51, 0x4,0x62,0x37, 0x5,0x6a,0x67, 0x5,0x60,0x39, 0x5,0x6a,0x63, 0x7,0x51,0x52, 0x4,0x62,0x39, 0x7,0x51,0x58, 0x7,0x4c,0x24, 0x7,0x51,0x57, 0x4,0x62,0x3a, 0xf,0x64,0x58, 0xf,0x64,0x59, 0x5,0x6a,0x65, 0x7,0x51,0x56, 0x5,0x6a,0x6b, 0x4,0x65,0x3e, 0x7,0x51,0x55, 0x7,0x51,0x59, 0x7,0x51,0x5f, 0x7,0x56,0x44, 0x5,0x71,0x7d, 0x7,0x51,0x60, 0x5,0x6e,0x65, 0x4,0x65,0x3f, 0x5,0x71,0x7e, 0x5,0x6e,0x64, 0x7,0x51,0x5e, 0x7,0x51,0x62, 0x5,0x6e,0x63, 0x7,0x4c,0x27, 0x7,0x51,0x61, 0x7,0x51,0x5b, 0x7,0x51,0x5c, 0x7,0x51,0x5d, 0x7,0x56,0x45, 0x7,0x51,0x63, 0x7,0x51,0x5a, 0x5,0x72,0x28, 0x5,0x72,0x22, 0x7,0x56,0x46, 0x4,0x68,0x25, 0x5,0x72,0x24, 0x5,0x72,0x21, 0x7,0x56,0x47, 0x5,0x72,0x2b, 0x7,0x56,0x48, 0x5,0x72,0x2a, 0x5,0x72,0x23, 0x5,0x72,0x27, 0x5,0x72,0x25, 0x7,0x56,0x49, 0x5,0x72,0x26, 0x5,0x72,0x29, 0xf,0x68,0x7e, 0x4,0x69,0x66, 0x5,0x74,0x6e, 0x5,0x74,0x6f, 0x7,0x5a,0x37, 0x7,0x5d,0x54, 0x7,0x5a,0x36, 0x5,0x74,0x70, 0x7,0x5a,0x35, 0xf,0x6a,0x37, 0x7,0x5a,0x34, 0x5,0x76,0x6e, 0x7,0x5d,0x56, 0x5,0x76,0x6f, 0x5,0x76,0x70, 0x5,0x78,0x4a, 0x7,0x5d,0x55, 0x5,0x78,0x4b, 0x5,0x78,0x4c, 0x4,0x6c,0x3c, 0x7,0x60,0x28, 0x7,0x60,0x2a, 0x7,0x60,0x29, 0x5,0x79,0x5d, 0x7,0x64,0x27, 0x5,0x7b,0x25, 0x6,0x3c,0x79, 0x6,0x46,0x3c, 0x6,0x64,0x46, 0x7,0x2b,0x41, 0x6,0x64,0x48, 0x6,0x64,0x47, 0x5,0x52,0x6c, 0x4,0x55,0x24, 0x4,0x55,0x25, 0x7,0x3e,0x22, 0x7,0x3e,0x23, 0x7,0x35,0x71, 0x7,0x35,0x73, 0x7,0x35,0x72, 0x7,0x4c,0x29, 0x7,0x4c,0x28, 0x7,0x45,0x33, 0x7,0x4d,0x73, 0x7,0x51,0x64, 0x7,0x60,0x2b, 0x4,0x6e,0x26, 0xf,0x32,0x71, 0x4,0x41,0x7c, 0x6,0x5a,0x43, 0x5,0x47,0x54, 0x6,0x64,0x49, 0x6,0x64,0x4a, 0xf,0x4d,0x41, 0xf,0x53,0x29, 0x6,0x64,0x4b, 0x7,0x2b,0x42, 0xf,0x53,0x2a, 0xf,0x59,0x2a, 0x7,0x35,0x74, 0xf,0x5d,0x68, 0x7,0x3e,0x24, 0x7,0x45,0x36, 0x5,0x66,0x41, 0x5,0x66,0x40, 0x5,0x66,0x42, 0x7,0x45,0x35, 0x7,0x45,0x34, 0x5,0x6a,0x6c, 0x4,0x62,0x3d, 0x4,0x62,0x3e, 0x7,0x4c,0x2a, 0x7,0x51,0x65, 0xf,0x66,0x7c, 0x5,0x72,0x2c, 0xf,0x69,0x21, 0x7,0x56,0x4a, 0x7,0x5d,0x57, 0x5,0x7a,0x4b, 0x5,0x36,0x4b, 0x5,0x36,0x4c, 0x5,0x3d,0x50, 0x6,0x50,0x48, 0xf,0x40,0x31, 0x6,0x50,0x47, 0x5,0x44,0x49, 0x6,0x5a,0x45, 0x6,0x5a,0x44, 0x6,0x5a,0x47, 0x6,0x5a,0x46, 0x5,0x4b,0x51, 0x6,0x64,0x4d, 0x6,0x64,0x4e, 0x5,0x4b,0x50, 0x4,0x48,0x61, 0x6,0x64,0x4c, 0x6,0x64,0x52, 0x5,0x4b,0x4f, 0x7,0x2b,0x43, 0xf,0x4d,0x42, 0xf,0x4d,0x43, 0xf,0x4d,0x44, 0xf,0x4d,0x45, 0x7,0x2b,0x46, 0x6,0x64,0x4f, 0x6,0x64,0x51, 0x5,0x4b,0x52, 0x7,0x2b,0x4a, 0x5,0x52,0x72, 0x7,0x2b,0x4e, 0x7,0x2b,0x47, 0x5,0x5a,0x32, 0x5,0x52,0x74, 0x5,0x52,0x77, 0x5,0x52,0x6d, 0x5,0x52,0x70, 0x5,0x52,0x6e, 0x5,0x52,0x75, 0x7,0x2b,0x44, 0x5,0x52,0x76, 0x7,0x2b,0x48, 0x5,0x52,0x73, 0x7,0x2b,0x4b, 0x7,0x2b,0x49, 0x5,0x52,0x6f, 0x7,0x2b,0x45, 0x7,0x2b,0x4c, 0x5,0x52,0x71, 0xf,0x53,0x2b, 0xf,0x53,0x2c, 0xf,0x53,0x2d, 0x7,0x2b,0x4d, 0x7,0x35,0x7a, 0x4,0x55,0x2c, 0x7,0x35,0x79, 0x5,0x5a,0x2f, 0x4,0x55,0x2a, 0x4,0x55,0x27, 0x4,0x55,0x2b, 0x4,0x55,0x28, 0x7,0x35,0x75, 0x5,0x5a,0x29, 0x4,0x55,0x29, 0x5,0x5a,0x30, 0x5,0x5a,0x2d, 0x7,0x36,0x24, 0x5,0x5a,0x33, 0x5,0x5a,0x27, 0x5,0x5a,0x31, 0x5,0x5a,0x34, 0x5,0x5a,0x2b, 0x7,0x35,0x7c, 0x7,0x35,0x7b, 0x7,0x36,0x26, 0x7,0x36,0x21, 0x7,0x35,0x78, 0x7,0x36,0x23, 0x5,0x5a,0x2a, 0x7,0x36,0x22, 0xf,0x59,0x2c, 0x5,0x5a,0x28, 0x7,0x35,0x7d, 0x7,0x35,0x7e, 0x7,0x36,0x27, 0x7,0x36,0x25, 0xf,0x59,0x2b, 0x7,0x35,0x76, 0x7,0x35,0x77, 0x5,0x60,0x3a, 0x7,0x3e,0x2c, 0x5,0x60,0x3b, 0x7,0x3e,0x26, 0x4,0x5a,0x2f, 0x7,0x3e,0x27, 0x7,0x3e,0x25, 0x5,0x60,0x3c, 0x4,0x5a,0x2c, 0x7,0x3e,0x2a, 0x7,0x3e,0x2b, 0x5,0x4b,0x53, 0x7,0x3e,0x28, 0x5,0x60,0x3e, 0x5,0x60,0x3d, 0xf,0x5d,0x69, 0xf,0x5d,0x6a, 0x7,0x45,0x3c, 0x5,0x66,0x4c, 0x5,0x66,0x4b, 0x5,0x66,0x47, 0x4,0x5e,0x64, 0x5,0x66,0x49, 0x5,0x66,0x48, 0x4,0x5e,0x61, 0x5,0x66,0x45, 0x5,0x66,0x4e, 0x4,0x5e,0x6d, 0x4,0x5e,0x69, 0x4,0x5e,0x6a, 0x4,0x5e,0x66, 0x5,0x66,0x4f, 0x5,0x66,0x43, 0x4,0x5e,0x6c, 0x7,0x45,0x3b, 0x7,0x45,0x3a, 0x7,0x45,0x37, 0x5,0x66,0x4a, 0xf,0x61,0x5d, 0xf,0x61,0x5e, 0xf,0x61,0x60, 0x4,0x5e,0x6b, 0xf,0x61,0x5c, 0x7,0x45,0x38, 0x5,0x66,0x44, 0x7,0x45,0x39, 0x5,0x66,0x4d, 0x5,0x6a,0x6d, 0x5,0x6a,0x73, 0x5,0x6a,0x6f, 0x4,0x62,0x43, 0x7,0x4c,0x31, 0x5,0x66,0x50, 0x7,0x4c,0x2c, 0x5,0x66,0x46, 0x5,0x6a,0x71, 0x5,0x6a,0x70, 0x5,0x6a,0x74, 0x7,0x4c,0x2b, 0x5,0x6a,0x72, 0x5,0x6a,0x76, 0x4,0x62,0x42, 0x5,0x6a,0x77, 0x7,0x4c,0x32, 0x7,0x4c,0x34, 0x5,0x6a,0x75, 0x7,0x4c,0x33, 0x7,0x4c,0x2d, 0x7,0x4c,0x2e, 0x7,0x4c,0x2f, 0xf,0x64,0x5b, 0xf,0x64,0x5c, 0xf,0x64,0x5d, 0x7,0x4c,0x30, 0x3,0x57,0x36, 0x7,0x4c,0x35, 0x4,0x65,0x45, 0x7,0x51,0x6a, 0x7,0x51,0x69, 0x5,0x6e,0x6e, 0x5,0x6e,0x69, 0x5,0x6e,0x6b, 0x5,0x6e,0x68, 0x4,0x65,0x42, 0x5,0x6e,0x70, 0xf,0x66,0x7d, 0x4,0x65,0x43, 0x4,0x65,0x44, 0x4,0x65,0x48, 0x5,0x6e,0x71, 0x5,0x6e,0x72, 0x5,0x6e,0x67, 0x7,0x51,0x68, 0x4,0x68,0x26, 0x5,0x6e,0x6a, 0x5,0x6e,0x6f, 0x5,0x6e,0x6c, 0x7,0x51,0x6b, 0x7,0x51,0x6f, 0x7,0x51,0x70, 0x7,0x51,0x71, 0x7,0x51,0x6d, 0x7,0x51,0x6c, 0xf,0x66,0x7e, 0xf,0x67,0x21, 0x7,0x51,0x67, 0x7,0x51,0x6e, 0x7,0x52,0x27, 0x7,0x51,0x66, 0x5,0x72,0x2f, 0x5,0x72,0x2e, 0x5,0x72,0x31, 0x4,0x68,0x27, 0x5,0x72,0x32, 0x5,0x72,0x30, 0x4,0x68,0x2c, 0x7,0x56,0x4d, 0x7,0x56,0x4c, 0x7,0x56,0x4e, 0x7,0x56,0x4b, 0xf,0x69,0x22, 0x7,0x56,0x4f, 0x7,0x56,0x50, 0x5,0x74,0x78, 0x7,0x5a,0x3d, 0x5,0x72,0x34, 0x7,0x5a,0x41, 0x7,0x5a,0x38, 0x5,0x74,0x71, 0x7,0x5a,0x3b, 0x5,0x72,0x33, 0x5,0x74,0x74, 0x5,0x74,0x77, 0x5,0x74,0x73, 0x7,0x5a,0x40, 0x4,0x69,0x6c, 0x5,0x74,0x75, 0x7,0x5a,0x39, 0x7,0x5a,0x3a, 0x7,0x5a,0x3c, 0xf,0x6a,0x38, 0xf,0x6a,0x39, 0xf,0x6a,0x3a, 0x5,0x74,0x72, 0x5,0x74,0x79, 0x7,0x5a,0x3f, 0x7,0x5d,0x5f, 0x7,0x5d,0x5d, 0x5,0x76,0x71, 0x5,0x78,0x4e, 0x7,0x5d,0x5c, 0x7,0x5d,0x59, 0x5,0x76,0x72, 0x7,0x5d,0x5a, 0x7,0x5d,0x5e, 0x7,0x5d,0x5b, 0x7,0x5d,0x60, 0xf,0x6b,0x38, 0xf,0x6b,0x39, 0x7,0x5d,0x58, 0x5,0x78,0x4f, 0x7,0x60,0x31, 0x7,0x60,0x34, 0x5,0x78,0x4d, 0x7,0x60,0x33, 0x7,0x60,0x36, 0x7,0x60,0x35, 0x7,0x60,0x2f, 0x7,0x60,0x30, 0x7,0x60,0x2c, 0x7,0x60,0x32, 0x5,0x79,0x62, 0x7,0x61,0x63, 0x5,0x79,0x63, 0x5,0x79,0x5f, 0x4,0x6d,0x31, 0x5,0x79,0x60, 0x7,0x61,0x62, 0x5,0x79,0x5e, 0x5,0x79,0x61, 0x4,0x6d,0x32, 0x7,0x61,0x64, 0x5,0x7a,0x4c, 0x5,0x7a,0x4d, 0x4,0x6e,0x27, 0x7,0x64,0x29, 0x7,0x64,0x28, 0x4,0x6e,0x40, 0x7,0x64,0x72, 0x7,0x64,0x73, 0x7,0x64,0x71, 0x7,0x65,0x4e, 0x5,0x7c,0x23, 0x7,0x65,0x6a, 0x7,0x65,0x7a, 0x7,0x65,0x7b, 0x7,0x66,0x44, 0x5,0x3d,0x51, 0x4,0x3c,0x27, 0x6,0x5a,0x49, 0x6,0x5a,0x4a, 0x6,0x5a,0x48, 0x6,0x5a,0x4b, 0x4,0x48,0x63, 0x4,0x48,0x65, 0x5,0x4b,0x55, 0x6,0x64,0x58, 0x5,0x4b,0x54, 0x4,0x48,0x64, 0x6,0x64,0x56, 0x6,0x64,0x53, 0x6,0x64,0x54, 0x6,0x64,0x55, 0x6,0x64,0x57, 0x4,0x4e,0x72, 0x4,0x4e,0x71, 0x5,0x52,0x7a, 0x5,0x52,0x79, 0x7,0x2b,0x52, 0x7,0x36,0x2c, 0x5,0x52,0x78, 0x5,0x52,0x7b, 0x4,0x4e,0x77, 0x7,0x2b,0x50, 0x7,0x2b,0x54, 0x7,0x2b,0x51, 0x4,0x4e,0x78, 0x7,0x2b,0x53, 0x5,0x5a,0x36, 0x5,0x5a,0x35, 0x4,0x55,0x33, 0x7,0x36,0x2b, 0x7,0x2b,0x4f, 0x7,0x36,0x2a, 0x7,0x36,0x29, 0x7,0x3e,0x2e, 0x4,0x5a,0x34, 0x7,0x3e,0x32, 0x4,0x5a,0x32, 0x7,0x3e,0x33, 0x5,0x60,0x3f, 0x7,0x3e,0x31, 0x7,0x3e,0x2d, 0x7,0x3e,0x2f, 0x7,0x3e,0x30, 0x5,0x66,0x59, 0x7,0x45,0x3e, 0x4,0x5e,0x6f, 0x7,0x45,0x3d, 0x5,0x66,0x57, 0x7,0x45,0x3f, 0x5,0x66,0x52, 0x5,0x6a,0x78, 0x5,0x66,0x55, 0x5,0x66,0x53, 0x5,0x66,0x56, 0x5,0x66,0x58, 0x7,0x3e,0x34, 0x5,0x66,0x54, 0x7,0x4c,0x3b, 0x5,0x6a,0x7a, 0x5,0x6a,0x79, 0x7,0x4c,0x3a, 0x7,0x4c,0x37, 0x5,0x6a,0x7c, 0x5,0x6a,0x7d, 0x5,0x6a,0x7b, 0x7,0x4c,0x3d, 0x7,0x4c,0x3e, 0x7,0x4c,0x39, 0x7,0x4c,0x38, 0x7,0x4c,0x3c, 0x7,0x4c,0x36, 0x4,0x65,0x4a, 0x5,0x6e,0x75, 0x5,0x6e,0x74, 0x5,0x6e,0x73, 0x7,0x51,0x73, 0x7,0x51,0x74, 0x7,0x51,0x75, 0x4,0x68,0x2f, 0x5,0x72,0x36, 0x7,0x56,0x57, 0x4,0x68,0x2e, 0x5,0x72,0x35, 0x5,0x72,0x37, 0x7,0x56,0x53, 0x7,0x56,0x54, 0x5,0x72,0x38, 0x7,0x56,0x55, 0xf,0x69,0x23, 0x7,0x56,0x56, 0x7,0x56,0x52, 0x4,0x69,0x6d, 0x7,0x5a,0x42, 0x4,0x69,0x70, 0x7,0x5a,0x43, 0x4,0x69,0x6f, 0x7,0x5a,0x44, 0x7,0x5d,0x65, 0x7,0x5d,0x66, 0x5,0x76,0x73, 0x4,0x6b,0x36, 0x5,0x76,0x75, 0x4,0x6b,0x37, 0x7,0x5d,0x62, 0x5,0x76,0x74, 0x7,0x5d,0x67, 0x7,0x5d,0x61, 0x7,0x5d,0x63, 0x7,0x5d,0x64, 0x4,0x6c,0x3f, 0x5,0x78,0x50, 0x4,0x6d,0x34, 0x7,0x61,0x65, 0xf,0x6b,0x3a, 0x7,0x63,0x27, 0x5,0x7a,0x4e, 0x7,0x63,0x28, 0x7,0x64,0x2a, 0x7,0x64,0x74, 0x5,0x7b,0x6e, 0x4,0x42,0x23, 0x4,0x48,0x66, 0x5,0x46,0x64, 0x5,0x4b,0x56, 0x6,0x64,0x5a, 0xf,0x4d,0x46, 0xf,0x4d,0x47, 0xf,0x4d,0x48, 0x6,0x64,0x59, 0x7,0x2b,0x56, 0xf,0x53,0x2e, 0xf,0x53,0x2f, 0x7,0x36,0x2e, 0x7,0x36,0x2d, 0xf,0x59,0x2d, 0xf,0x59,0x2e, 0x4,0x5a,0x36, 0x5,0x60,0x40, 0xf,0x5d,0x6b, 0xf,0x5d,0x6c, 0x7,0x45,0x40, 0xf,0x61,0x61, 0xf,0x61,0x62, 0x7,0x4c,0x3f, 0xf,0x64,0x5f, 0x5,0x6e,0x76, 0xf,0x67,0x22, 0xf,0x67,0x23, 0xf,0x67,0x24, 0xf,0x67,0x25, 0x4,0x68,0x31, 0x7,0x56,0x58, 0x7,0x5a,0x45, 0x7,0x5d,0x68, 0x7,0x5d,0x69, 0x7,0x5d,0x6a, 0x7,0x60,0x37, 0xf,0x6b,0x73, 0x7,0x61,0x66, 0x7,0x61,0x67, 0x7,0x63,0x29, 0x7,0x64,0x2b, 0x4,0x6e,0x28, 0x7,0x65,0x7c, 0x6,0x50,0x49, 0x6,0x50,0x4a, 0x6,0x5a,0x4d, 0x6,0x5a,0x4c, 0xf,0x46,0x3a, 0xf,0x40,0x69, 0x4,0x48,0x68, 0x5,0x4b,0x58, 0x6,0x64,0x60, 0x6,0x64,0x5f, 0x6,0x64,0x5d, 0x6,0x64,0x61, 0x6,0x64,0x5b, 0x6,0x64,0x5c, 0x5,0x4b,0x57, 0x5,0x4b,0x5a, 0x5,0x52,0x7e, 0x7,0x2b,0x57, 0x7,0x2b,0x5a, 0x4,0x4e,0x7e, 0x7,0x2b,0x58, 0x5,0x53,0x24, 0x4,0x4f,0x22, 0x7,0x2b,0x5b, 0x5,0x53,0x23, 0x4,0x4e,0x7c, 0x4,0x4e,0x7d, 0x5,0x52,0x7c, 0x4,0x4e,0x7a, 0x5,0x52,0x7d, 0x5,0x53,0x22, 0x5,0x53,0x21, 0x7,0x2b,0x5c, 0x7,0x2b,0x59, 0xf,0x53,0x30, 0xf,0x53,0x31, 0xf,0x53,0x32, 0xf,0x53,0x33, 0x7,0x36,0x2f, 0x4,0x55,0x37, 0x7,0x36,0x31, 0x5,0x5a,0x3a, 0x7,0x36,0x30, 0x4,0x55,0x39, 0x4,0x55,0x34, 0x4,0x55,0x3b, 0x5,0x5a,0x37, 0x5,0x5a,0x39, 0x4,0x55,0x3a, 0x4,0x55,0x38, 0x7,0x36,0x33, 0x5,0x5a,0x38, 0xf,0x59,0x2f, 0xf,0x59,0x30, 0xf,0x59,0x31, 0xf,0x59,0x33, 0x7,0x36,0x32, 0x4,0x5a,0x3a, 0x4,0x5a,0x3c, 0x7,0x3e,0x3a, 0x5,0x60,0x41, 0x5,0x60,0x44, 0x5,0x60,0x42, 0x7,0x3e,0x38, 0x5,0x60,0x45, 0x5,0x60,0x46, 0x5,0x60,0x43, 0x7,0x3e,0x35, 0x4,0x5a,0x39, 0x7,0x3e,0x36, 0xf,0x5d,0x6d, 0xf,0x5d,0x6e, 0xf,0x5d,0x6f, 0x7,0x3e,0x37, 0x7,0x3e,0x39, 0x7,0x3e,0x3b, 0x7,0x45,0x42, 0x5,0x66,0x5e, 0x4,0x5e,0x71, 0x5,0x66,0x5c, 0x5,0x66,0x60, 0x5,0x66,0x5f, 0x7,0x45,0x44, 0x5,0x66,0x61, 0x7,0x4c,0x40, 0x7,0x45,0x43, 0x4,0x5e,0x72, 0x5,0x66,0x5a, 0x4,0x5e,0x78, 0x5,0x66,0x5b, 0xf,0x61,0x63, 0xf,0x61,0x65, 0x5,0x66,0x5d, 0x7,0x45,0x41, 0xf,0x61,0x64, 0x4,0x62,0x4d, 0x7,0x4c,0x43, 0x7,0x4c,0x47, 0x5,0x6a,0x7e, 0x5,0x6b,0x21, 0x5,0x6b,0x23, 0x4,0x62,0x50, 0x7,0x4c,0x48, 0x7,0x4c,0x46, 0x7,0x4c,0x41, 0x5,0x6b,0x24, 0x5,0x6b,0x22, 0x7,0x4c,0x45, 0x7,0x4c,0x42, 0x4,0x62,0x4b, 0x7,0x4c,0x44, 0xf,0x64,0x60, 0xf,0x64,0x61, 0xf,0x64,0x63, 0x5,0x6e,0x7c, 0x7,0x51,0x76, 0x5,0x6e,0x77, 0x5,0x6e,0x7b, 0x5,0x6e,0x7a, 0x5,0x6e,0x79, 0x4,0x65,0x50, 0x4,0x65,0x4c, 0x5,0x6e,0x7e, 0x5,0x6e,0x78, 0x4,0x65,0x4b, 0x7,0x51,0x77, 0x7,0x51,0x78, 0x7,0x51,0x7b, 0x7,0x51,0x7c, 0xf,0x67,0x26, 0xf,0x67,0x27, 0xf,0x67,0x28, 0x5,0x6e,0x7d, 0x5,0x72,0x3b, 0x5,0x72,0x3e, 0x5,0x72,0x3a, 0x7,0x56,0x59, 0x4,0x68,0x32, 0x4,0x68,0x34, 0x5,0x72,0x39, 0x4,0x68,0x33, 0x5,0x72,0x3d, 0x7,0x56,0x5a, 0x5,0x72,0x3c, 0x7,0x56,0x5e, 0xf,0x69,0x24, 0x7,0x56,0x5b, 0x7,0x56,0x5c, 0x5,0x75,0x21, 0x5,0x74,0x7c, 0x7,0x5a,0x46, 0x5,0x75,0x22, 0x5,0x74,0x7e, 0x5,0x74,0x7b, 0x5,0x75,0x25, 0x5,0x75,0x24, 0x5,0x75,0x23, 0x5,0x74,0x7d, 0x5,0x75,0x26, 0x7,0x56,0x5d, 0x4,0x69,0x73, 0x7,0x5a,0x47, 0x7,0x5a,0x48, 0xf,0x6a,0x3b, 0xf,0x6a,0x3c, 0x5,0x76,0x77, 0x4,0x6b,0x38, 0x4,0x6b,0x39, 0x5,0x76,0x76, 0x7,0x5d,0x6c, 0x7,0x5d,0x6d, 0x7,0x5d,0x6b, 0xf,0x6b,0x3b, 0x4,0x6c,0x40, 0x7,0x60,0x38, 0x5,0x78,0x51, 0x4,0x6c,0x44, 0x4,0x6c,0x42, 0x5,0x79,0x65, 0x7,0x61,0x68, 0x5,0x79,0x64, 0x4,0x6d,0x36, 0xf,0x6c,0x42, 0xf,0x6c,0x43, 0x7,0x61,0x69, 0x5,0x7a,0x4f, 0x7,0x63,0x2a, 0x7,0x63,0x2b, 0x7,0x64,0x2c, 0x4,0x6e,0x29, 0x5,0x7b,0x26, 0xf,0x6c,0x72, 0x7,0x64,0x77, 0x7,0x64,0x76, 0x5,0x7b,0x4e, 0x4,0x6e,0x54, 0x6,0x23,0x3d, 0x6,0x23,0x3c, 0x5,0x44,0x4b, 0x5,0x4b,0x5b, 0x5,0x4b,0x5c, 0x6,0x64,0x62, 0x7,0x2b,0x5d, 0x7,0x36,0x34, 0x7,0x3e,0x3c, 0x7,0x45,0x45, 0x4,0x5e,0x79, 0x7,0x51,0x7e, 0x7,0x56,0x5f, 0x5,0x72,0x40, 0x7,0x5a,0x49, 0x7,0x60,0x3a, 0x7,0x60,0x39, 0x5,0x78,0x53, 0x5,0x7b,0x4f, 0x7,0x2b,0x5e, 0x4,0x4f,0x23, 0x4,0x55,0x3c, 0x7,0x45,0x46, 0x7,0x52,0x21, 0x7,0x56,0x61, 0x7,0x56,0x60, 0x7,0x5a,0x4a, 0x7,0x5d,0x6e, 0xf,0x6c,0x73, 0x5,0x7b,0x50, 0x4,0x42,0x24, 0x6,0x5a,0x4e, 0x6,0x64,0x64, 0x6,0x64,0x63, 0x7,0x2b,0x5f, 0x7,0x36,0x38, 0x4,0x55,0x3e, 0x5,0x5a,0x3b, 0x7,0x36,0x36, 0x7,0x36,0x35, 0x4,0x55,0x3d, 0x7,0x36,0x37, 0x5,0x60,0x47, 0x7,0x3e,0x3d, 0x4,0x5e,0x7a, 0x7,0x45,0x48, 0x7,0x45,0x49, 0x7,0x45,0x47, 0x7,0x4c,0x49, 0x5,0x6b,0x25, 0x7,0x4c,0x4a, 0x4,0x65,0x51, 0x7,0x52,0x24, 0x7,0x52,0x23, 0x7,0x52,0x22, 0x7,0x52,0x25, 0x7,0x56,0x62, 0x4,0x68,0x35, 0x7,0x56,0x64, 0x5,0x72,0x42, 0x7,0x56,0x63, 0x7,0x56,0x65, 0x7,0x56,0x66, 0x5,0x75,0x27, 0x7,0x5a,0x4c, 0x7,0x5d,0x71, 0x7,0x5d,0x72, 0x5,0x76,0x78, 0x4,0x69,0x75, 0x4,0x6b,0x3a, 0x7,0x5d,0x70, 0x5,0x76,0x79, 0x7,0x5d,0x6f, 0x7,0x5d,0x73, 0x4,0x6c,0x46, 0x4,0x6c,0x45, 0x7,0x5d,0x74, 0x7,0x60,0x3b, 0x7,0x61,0x6b, 0x7,0x61,0x6c, 0x5,0x7a,0x50, 0x7,0x63,0x2c, 0x7,0x63,0x2d, 0x7,0x63,0x2e, 0x4,0x6e,0x2a, 0x7,0x64,0x2d, 0x7,0x64,0x79, 0x7,0x64,0x78, 0x7,0x64,0x7a, 0x7,0x65,0x4f, 0x5,0x7c,0x24, 0x4,0x6e,0x51, 0x5,0x7c,0x2d, 0x7,0x65,0x7d, 0x7,0x66,0x4a, 0x7,0x66,0x4b, 0x6,0x50,0x4b, 0x5,0x3d,0x53, 0x6,0x5a,0x52, 0x5,0x44,0x4e, 0x6,0x5a,0x51, 0x4,0x42,0x26, 0x5,0x44,0x4c, 0x6,0x5a,0x50, 0x5,0x44,0x4d, 0x4,0x42,0x25, 0x6,0x5a,0x4f, 0xf,0x39,0x30, 0xf,0x39,0x2f, 0x6,0x5a,0x53, 0x5,0x4b,0x5f, 0x5,0x4b,0x60, 0x5,0x4b,0x61, 0x5,0x4b,0x5e, 0x5,0x4b,0x5d, 0x5,0x4b,0x62, 0x6,0x64,0x68, 0x6,0x64,0x65, 0x6,0x64,0x69, 0xf,0x4d,0x49, 0xf,0x4d,0x4a, 0xf,0x4d,0x4b, 0x6,0x64,0x6b, 0x6,0x64,0x66, 0x6,0x64,0x6e, 0x6,0x64,0x6c, 0x6,0x64,0x6d, 0x6,0x64,0x6a, 0x6,0x64,0x67, 0x4,0x4f,0x27, 0x5,0x53,0x29, 0x7,0x2b,0x61, 0x7,0x2b,0x60, 0x5,0x53,0x28, 0x5,0x53,0x2b, 0x5,0x5a,0x41, 0x5,0x53,0x2a, 0x4,0x4f,0x26, 0x7,0x2b,0x63, 0x5,0x53,0x25, 0xf,0x53,0x34, 0xf,0x53,0x35, 0xf,0x53,0x36, 0x5,0x53,0x27, 0x7,0x2b,0x62, 0x5,0x53,0x26, 0x5,0x5a,0x3c, 0x7,0x36,0x3a, 0x5,0x5a,0x45, 0x5,0x5a,0x43, 0x7,0x36,0x39, 0x4,0x55,0x40, 0x5,0x5a,0x44, 0x7,0x36,0x3b, 0xf,0x59,0x34, 0x5,0x5a,0x3e, 0x5,0x5a,0x3d, 0x5,0x5a,0x3f, 0x5,0x5a,0x42, 0x7,0x36,0x3c, 0x5,0x5a,0x40, 0x4,0x5a,0x3d, 0x5,0x60,0x49, 0x5,0x60,0x4c, 0x5,0x60,0x50, 0x4,0x5a,0x3e, 0x7,0x3e,0x3e, 0x5,0x60,0x48, 0x5,0x60,0x4a, 0x5,0x60,0x4f, 0x5,0x60,0x4d, 0x7,0x3e,0x40, 0x7,0x3e,0x41, 0x7,0x3e,0x43, 0xf,0x5d,0x70, 0xf,0x5d,0x71, 0xf,0x5d,0x72, 0x5,0x60,0x4e, 0x7,0x3e,0x3f, 0x7,0x3e,0x42, 0x5,0x60,0x4b, 0x5,0x66,0x63, 0x7,0x45,0x4b, 0x4,0x5e,0x7b, 0x5,0x66,0x69, 0x7,0x45,0x4e, 0x5,0x66,0x67, 0x5,0x66,0x65, 0x7,0x45,0x4f, 0x7,0x45,0x4c, 0xf,0x61,0x67, 0x7,0x45,0x4a, 0x7,0x45,0x51, 0x5,0x66,0x62, 0x7,0x45,0x4d, 0x7,0x45,0x50, 0x5,0x66,0x66, 0x5,0x6b,0x26, 0x5,0x6b,0x29, 0x7,0x4c,0x4b, 0x5,0x6b,0x27, 0x7,0x4c,0x4c, 0x7,0x4c,0x4d, 0xf,0x64,0x64, 0xf,0x64,0x65, 0xf,0x64,0x66, 0xf,0x64,0x67, 0x5,0x66,0x64, 0x5,0x6b,0x28, 0x7,0x52,0x2b, 0x4,0x65,0x52, 0x7,0x52,0x2a, 0x5,0x6f,0x21, 0x7,0x52,0x29, 0x7,0x52,0x28, 0x5,0x6f,0x22, 0x7,0x52,0x26, 0xf,0x67,0x29, 0x5,0x72,0x44, 0x5,0x72,0x46, 0x5,0x72,0x48, 0x4,0x68,0x37, 0x7,0x56,0x67, 0x7,0x56,0x68, 0xf,0x69,0x25, 0x5,0x72,0x45, 0x5,0x72,0x43, 0x7,0x56,0x69, 0x5,0x72,0x47, 0x5,0x75,0x2a, 0x4,0x62,0x51, 0x7,0x5a,0x50, 0x4,0x69,0x78, 0x5,0x75,0x28, 0x7,0x5a,0x4e, 0x4,0x69,0x79, 0x5,0x75,0x2b, 0xf,0x6a,0x3d, 0x5,0x75,0x2c, 0x5,0x75,0x29, 0x4,0x69,0x7a, 0xf,0x67,0x2a, 0x7,0x5a,0x4d, 0x5,0x76,0x7b, 0x5,0x76,0x7a, 0xf,0x69,0x26, 0x5,0x78,0x54, 0x5,0x78,0x55, 0x4,0x6c,0x47, 0x7,0x60,0x3f, 0x7,0x60,0x3e, 0x7,0x60,0x40, 0x7,0x60,0x3d, 0x5,0x79,0x67, 0x5,0x79,0x66, 0xf,0x6c,0x44, 0x7,0x63,0x2f, 0x4,0x6e,0x2b, 0x7,0x64,0x2e, 0x7,0x64,0x2f, 0x4,0x6e,0x41, 0x5,0x7b,0x51, 0x5,0x7b,0x6f, 0x5,0x7c,0x25, 0x5,0x7c,0x40, 0x4,0x30,0x43, 0x4,0x42,0x2a, 0x4,0x42,0x27, 0x6,0x5a,0x55, 0x4,0x42,0x28, 0x6,0x5a,0x56, 0x5,0x44,0x4f, 0xf,0x46,0x3b, 0x6,0x64,0x6f, 0x5,0x4b,0x65, 0x4,0x48,0x6c, 0x5,0x4b,0x63, 0xf,0x4d,0x4c, 0xf,0x4d,0x4d, 0x5,0x4b,0x66, 0x4,0x4f,0x2f, 0x4,0x4f,0x33, 0x4,0x4f,0x31, 0x4,0x4f,0x2d, 0x7,0x2b,0x68, 0x5,0x53,0x31, 0x5,0x53,0x30, 0x7,0x2b,0x65, 0x7,0x2b,0x64, 0x5,0x53,0x2e, 0x4,0x4f,0x38, 0x5,0x53,0x33, 0x5,0x53,0x2c, 0x5,0x53,0x2d, 0x7,0x2b,0x6c, 0x7,0x2b,0x66, 0x4,0x4f,0x36, 0x5,0x53,0x32, 0xf,0x53,0x37, 0xf,0x53,0x3a, 0xf,0x53,0x3d, 0x7,0x2b,0x6b, 0x7,0x2b,0x67, 0x7,0x2b,0x69, 0x4,0x4f,0x2e, 0xf,0x53,0x39, 0x5,0x53,0x2f, 0x5,0x5a,0x48, 0x5,0x5a,0x46, 0x7,0x36,0x3d, 0x5,0x5a,0x49, 0x4,0x55,0x46, 0x4,0x5a,0x46, 0x5,0x5a,0x4e, 0x5,0x5a,0x4d, 0x4,0x55,0x49, 0x7,0x36,0x43, 0x7,0x36,0x3e, 0x7,0x36,0x41, 0x7,0x36,0x40, 0x5,0x5a,0x4c, 0x7,0x36,0x44, 0xf,0x59,0x36, 0xf,0x59,0x37, 0xf,0x59,0x39, 0xf,0x59,0x3a, 0x5,0x5a,0x4b, 0x7,0x36,0x42, 0xf,0x59,0x35, 0x5,0x5a,0x47, 0x7,0x36,0x3f, 0x5,0x60,0x56, 0x4,0x5a,0x48, 0x5,0x60,0x57, 0x5,0x60,0x54, 0x5,0x60,0x52, 0x4,0x5a,0x47, 0x7,0x3e,0x4b, 0x5,0x60,0x55, 0x7,0x3e,0x46, 0x7,0x3e,0x4d, 0x7,0x3e,0x45, 0x4,0x5a,0x4b, 0x7,0x3e,0x4c, 0x5,0x60,0x5a, 0x5,0x60,0x58, 0x7,0x3e,0x44, 0x4,0x5a,0x4a, 0xf,0x46,0x3c, 0xf,0x5d,0x73, 0xf,0x5d,0x74, 0xf,0x5d,0x75, 0xf,0x5d,0x77, 0xf,0x5d,0x79, 0x7,0x3e,0x48, 0x5,0x60,0x5b, 0x5,0x60,0x53, 0x7,0x3e,0x4a, 0x5,0x60,0x51, 0x5,0x60,0x59, 0x5,0x66,0x77, 0x5,0x66,0x74, 0x5,0x66,0x70, 0x5,0x66,0x6b, 0x7,0x45,0x53, 0x4,0x5f,0x28, 0x5,0x66,0x6d, 0x7,0x45,0x52, 0x5,0x66,0x6a, 0x5,0x66,0x71, 0x5,0x66,0x75, 0x5,0x66,0x72, 0x5,0x66,0x6f, 0x5,0x66,0x6c, 0x7,0x45,0x54, 0xf,0x61,0x68, 0xf,0x61,0x69, 0xf,0x61,0x6a, 0xf,0x61,0x6b, 0xf,0x61,0x6c, 0xf,0x61,0x6d, 0xf,0x61,0x6e, 0xf,0x61,0x6f, 0xf,0x61,0x71, 0xf,0x61,0x73, 0x7,0x45,0x55, 0x7,0x3e,0x47, 0x5,0x66,0x76, 0x5,0x66,0x73, 0x7,0x4c,0x5b, 0x7,0x4c,0x58, 0x4,0x62,0x5e, 0x7,0x4c,0x52, 0x5,0x6b,0x2d, 0x4,0x62,0x52, 0x5,0x6b,0x2f, 0x7,0x4c,0x4f, 0x7,0x4c,0x51, 0x4,0x62,0x5f, 0x5,0x66,0x78, 0x4,0x62,0x63, 0x5,0x6b,0x32, 0x4,0x62,0x5b, 0x7,0x4c,0x4e, 0x4,0x62,0x5a, 0x4,0x62,0x65, 0x7,0x4c,0x5a, 0x7,0x4c,0x53, 0x7,0x4c,0x59, 0x4,0x62,0x58, 0x7,0x4c,0x55, 0x5,0x6b,0x36, 0x5,0x6b,0x2e, 0x7,0x4c,0x50, 0x5,0x6b,0x34, 0xf,0x64,0x6e, 0xf,0x64,0x68, 0xf,0x64,0x6a, 0xf,0x64,0x6c, 0xf,0x64,0x6f, 0xf,0x64,0x70, 0xf,0x64,0x71, 0x5,0x6b,0x30, 0x7,0x4c,0x54, 0x7,0x4c,0x57, 0x4,0x62,0x53, 0x5,0x6b,0x37, 0x5,0x6b,0x2a, 0xf,0x64,0x69, 0x5,0x6b,0x2c, 0xf,0x61,0x70, 0x7,0x4c,0x56, 0x5,0x6f,0x27, 0x7,0x52,0x2e, 0x5,0x6f,0x26, 0x5,0x6b,0x38, 0x5,0x6f,0x29, 0x7,0x52,0x2c, 0x4,0x65,0x58, 0x5,0x6f,0x2b, 0x7,0x52,0x2f, 0x7,0x52,0x2d, 0x5,0x6f,0x28, 0x4,0x65,0x56, 0x5,0x6f,0x24, 0x7,0x52,0x32, 0x4,0x65,0x5e, 0x5,0x6f,0x25, 0x5,0x6f,0x23, 0x4,0x65,0x60, 0x7,0x52,0x30, 0x5,0x6f,0x2c, 0x7,0x52,0x34, 0xf,0x67,0x2b, 0xf,0x67,0x2c, 0xf,0x67,0x2d, 0xf,0x67,0x2f, 0xf,0x67,0x30, 0xf,0x67,0x31, 0xf,0x67,0x32, 0xf,0x67,0x2e, 0x5,0x6f,0x2a, 0xf,0x67,0x34, 0x5,0x72,0x4a, 0x4,0x68,0x3f, 0x5,0x72,0x4f, 0x5,0x72,0x53, 0x5,0x77,0x23, 0x5,0x72,0x49, 0x5,0x72,0x52, 0x4,0x68,0x38, 0x7,0x56,0x71, 0x5,0x72,0x4c, 0x7,0x56,0x72, 0x5,0x72,0x57, 0x7,0x56,0x6d, 0x5,0x72,0x54, 0x5,0x72,0x4d, 0x7,0x56,0x73, 0x7,0x56,0x75, 0x7,0x56,0x6a, 0x7,0x56,0x74, 0x5,0x72,0x56, 0x7,0x56,0x6e, 0x7,0x56,0x6f, 0xf,0x69,0x28, 0xf,0x69,0x29, 0xf,0x69,0x2b, 0xf,0x69,0x2c, 0xf,0x69,0x2d, 0xf,0x69,0x2e, 0xf,0x69,0x2f, 0xf,0x69,0x30, 0xf,0x69,0x31, 0xf,0x69,0x32, 0x7,0x56,0x6b, 0x7,0x56,0x6c, 0x5,0x72,0x55, 0x7,0x56,0x70, 0x5,0x72,0x50, 0x7,0x5a,0x54, 0x7,0x5a,0x52, 0x5,0x75,0x32, 0x4,0x6a,0x22, 0x5,0x75,0x2e, 0x5,0x75,0x2f, 0x7,0x5a,0x5a, 0x7,0x5a,0x57, 0x5,0x75,0x30, 0x7,0x5a,0x5c, 0x7,0x5a,0x59, 0x5,0x75,0x34, 0x7,0x5a,0x56, 0x7,0x5a,0x5b, 0x7,0x5a,0x53, 0x7,0x5a,0x55, 0x7,0x5a,0x51, 0x7,0x5a,0x5e, 0xf,0x6a,0x41, 0xf,0x6a,0x42, 0xf,0x6a,0x43, 0xf,0x6a,0x40, 0x7,0x5a,0x5f, 0x5,0x75,0x33, 0x7,0x5a,0x58, 0x7,0x5a,0x5d, 0x5,0x75,0x31, 0x5,0x76,0x7e, 0x7,0x5d,0x78, 0x5,0x77,0x22, 0x4,0x6b,0x3e, 0x4,0x6b,0x3f, 0x5,0x76,0x7c, 0x7,0x5d,0x77, 0x4,0x65,0x5c, 0x7,0x60,0x46, 0x7,0x5d,0x75, 0x7,0x5e,0x22, 0x7,0x5d,0x76, 0x5,0x76,0x7d, 0x7,0x5e,0x21, 0x7,0x5d,0x7c, 0x5,0x77,0x21, 0x7,0x5d,0x79, 0xf,0x6b,0x3d, 0xf,0x6b,0x3f, 0x7,0x5d,0x7a, 0x7,0x5d,0x7d, 0x7,0x5d,0x7e, 0x7,0x5d,0x7b, 0xf,0x6b,0x3c, 0x7,0x60,0x43, 0x5,0x78,0x5c, 0x5,0x78,0x60, 0x5,0x78,0x5a, 0x7,0x60,0x41, 0x4,0x6c,0x4f, 0x4,0x6c,0x4c, 0x5,0x78,0x59, 0x5,0x78,0x61, 0x4,0x6c,0x4b, 0x5,0x78,0x5f, 0x5,0x78,0x5e, 0x5,0x78,0x57, 0x7,0x60,0x4b, 0x7,0x60,0x47, 0x5,0x78,0x58, 0xf,0x6b,0x75, 0xf,0x6b,0x78, 0x7,0x60,0x48, 0x7,0x60,0x42, 0x7,0x60,0x44, 0x7,0x60,0x45, 0x5,0x78,0x5d, 0x7,0x60,0x4a, 0x7,0x60,0x49, 0x7,0x61,0x73, 0x5,0x79,0x68, 0x4,0x6d,0x38, 0x5,0x79,0x69, 0x7,0x61,0x6e, 0x7,0x60,0x7a, 0x7,0x61,0x71, 0x7,0x61,0x6f, 0x5,0x79,0x6b, 0x7,0x61,0x72, 0x7,0x61,0x70, 0xf,0x6c,0x45, 0xf,0x6c,0x46, 0x5,0x79,0x6a, 0x7,0x61,0x6d, 0x7,0x63,0x35, 0x7,0x63,0x30, 0x7,0x63,0x32, 0x7,0x63,0x33, 0x7,0x63,0x34, 0x5,0x7a,0x51, 0x5,0x7a,0x52, 0xf,0x6c,0x5a, 0xf,0x6c,0x5b, 0xf,0x6c,0x5c, 0xf,0x6c,0x5d, 0x7,0x63,0x31, 0x5,0x7b,0x28, 0x5,0x7b,0x27, 0x7,0x64,0x30, 0x5,0x7b,0x29, 0xf,0x6c,0x74, 0x7,0x64,0x31, 0x5,0x7b,0x2a, 0x7,0x64,0x32, 0x7,0x64,0x7e, 0x5,0x7b,0x53, 0x5,0x7b,0x52, 0x5,0x7b,0x55, 0x7,0x64,0x7c, 0x7,0x65,0x21, 0x7,0x64,0x7b, 0x5,0x7b,0x54, 0x7,0x64,0x7d, 0xf,0x6c,0x75, 0x5,0x7b,0x73, 0x5,0x7b,0x72, 0x5,0x7b,0x71, 0x5,0x7b,0x70, 0x7,0x65,0x50, 0x5,0x7c,0x26, 0xf,0x6d,0x2b, 0xf,0x6d,0x2c, 0x5,0x7c,0x27, 0x7,0x65,0x6b, 0x5,0x7c,0x2e, 0x5,0x7c,0x37, 0x7,0x66,0x2f, 0x5,0x7c,0x36, 0xf,0x53,0x3c, 0xf,0x5d,0x78, 0xf,0x6b,0x3e, 0x6,0x50,0x4c, 0xf,0x40,0x33, 0x6,0x50,0x4d, 0x4,0x42,0x2b, 0x6,0x5a,0x57, 0x5,0x44,0x51, 0x5,0x44,0x52, 0x6,0x5a,0x5c, 0x6,0x5a,0x58, 0x6,0x5a,0x59, 0x5,0x44,0x50, 0x6,0x5a,0x5a, 0x6,0x5a,0x5b, 0x6,0x64,0x70, 0x5,0x4b,0x6a, 0x6,0x64,0x71, 0x5,0x4b,0x69, 0x4,0x48,0x6e, 0x4,0x48,0x6f, 0x6,0x64,0x72, 0x6,0x64,0x73, 0x6,0x64,0x74, 0x4,0x48,0x70, 0x5,0x4b,0x68, 0xf,0x4d,0x4f, 0xf,0x4d,0x50, 0xf,0x4d,0x51, 0x5,0x4b,0x67, 0x4,0x4f,0x45, 0x7,0x2b,0x72, 0x7,0x2b,0x7d, 0x7,0x2b,0x6f, 0x7,0x2b,0x73, 0x7,0x2b,0x79, 0x5,0x53,0x37, 0x5,0x53,0x3b, 0x5,0x53,0x3d, 0x5,0x53,0x39, 0x7,0x2b,0x76, 0x7,0x2b,0x7c, 0x5,0x53,0x3f, 0x5,0x53,0x34, 0x4,0x4f,0x3d, 0x5,0x53,0x41, 0x5,0x53,0x3e, 0x5,0x53,0x35, 0x4,0x4f,0x3e, 0x5,0x53,0x42, 0x7,0x2b,0x7a, 0x4,0x4f,0x3c, 0x7,0x2b,0x75, 0x4,0x4f,0x43, 0x4,0x4f,0x3a, 0x5,0x53,0x43, 0x4,0x4f,0x46, 0x7,0x2b,0x70, 0x7,0x2b,0x7b, 0xf,0x53,0x40, 0x7,0x2b,0x6e, 0x7,0x2b,0x77, 0x7,0x2b,0x78, 0x5,0x53,0x36, 0x5,0x53,0x3a, 0x5,0x53,0x40, 0x7,0x2b,0x71, 0x7,0x2b,0x74, 0x5,0x53,0x3c, 0x7,0x36,0x4b, 0x5,0x5a,0x54, 0x5,0x5a,0x56, 0x5,0x5a,0x51, 0x5,0x5a,0x4f, 0x4,0x55,0x4c, 0x5,0x5a,0x53, 0x5,0x5a,0x59, 0x5,0x5a,0x52, 0x7,0x36,0x57, 0x7,0x36,0x52, 0x5,0x5a,0x57, 0x4,0x55,0x56, 0x7,0x36,0x54, 0x5,0x5a,0x58, 0x7,0x36,0x50, 0x5,0x5a,0x55, 0x7,0x36,0x53, 0x7,0x36,0x4c, 0x7,0x36,0x45, 0x7,0x36,0x4e, 0xf,0x59,0x3d, 0xf,0x59,0x3e, 0xf,0x59,0x3f, 0xf,0x59,0x40, 0x7,0x36,0x4d, 0x7,0x36,0x4f, 0x7,0x36,0x58, 0x7,0x36,0x56, 0x7,0x36,0x47, 0x7,0x36,0x48, 0x7,0x36,0x55, 0x4,0x55,0x53, 0x4,0x55,0x51, 0x6,0x50,0x4e, 0x7,0x36,0x49, 0x5,0x5a,0x50, 0x7,0x36,0x46, 0xf,0x56,0x33, 0x7,0x3e,0x51, 0x4,0x5a,0x4c, 0x5,0x60,0x5e, 0x5,0x60,0x69, 0x7,0x3e,0x54, 0x4,0x5a,0x53, 0x5,0x60,0x67, 0x7,0x3e,0x55, 0x5,0x60,0x5d, 0x5,0x60,0x61, 0x7,0x3e,0x4e, 0x5,0x60,0x64, 0x5,0x60,0x6b, 0x5,0x60,0x60, 0x5,0x60,0x62, 0x4,0x5a,0x54, 0x7,0x3e,0x57, 0x5,0x60,0x5c, 0x5,0x60,0x63, 0x4,0x5a,0x58, 0x7,0x3e,0x4f, 0x4,0x5a,0x5b, 0x5,0x60,0x6c, 0x7,0x3e,0x58, 0x7,0x3e,0x53, 0x5,0x60,0x68, 0x5,0x60,0x6a, 0xf,0x5d,0x7a, 0xf,0x5d,0x7b, 0xf,0x5d,0x7c, 0xf,0x5d,0x7d, 0xf,0x5e,0x21, 0xf,0x5e,0x22, 0xf,0x5e,0x23, 0xf,0x5e,0x25, 0x7,0x3e,0x50, 0x5,0x60,0x5f, 0x4,0x5a,0x5a, 0x7,0x3e,0x56, 0x5,0x60,0x65, 0x5,0x60,0x66, 0x7,0x3e,0x52, 0x4,0x5a,0x57, 0x7,0x45,0x5b, 0x5,0x60,0x6d, 0x7,0x45,0x5f, 0x5,0x66,0x7d, 0x5,0x67,0x25, 0x5,0x67,0x27, 0x4,0x5f,0x2e, 0x5,0x67,0x2a, 0x5,0x66,0x7a, 0x5,0x67,0x21, 0x5,0x66,0x7e, 0x5,0x66,0x7b, 0x7,0x45,0x5d, 0x7,0x45,0x58, 0x4,0x5f,0x2d, 0x7,0x45,0x5e, 0x5,0x66,0x7c, 0x5,0x67,0x2b, 0x4,0x5f,0x30, 0x7,0x45,0x67, 0x5,0x67,0x22, 0x7,0x45,0x64, 0x7,0x45,0x5c, 0x5,0x67,0x28, 0x7,0x45,0x61, 0x7,0x45,0x62, 0x7,0x45,0x66, 0x5,0x67,0x24, 0x7,0x45,0x59, 0x5,0x67,0x23, 0x7,0x45,0x68, 0x7,0x45,0x56, 0x7,0x45,0x60, 0xf,0x61,0x74, 0xf,0x61,0x75, 0x7,0x45,0x57, 0x5,0x67,0x29, 0x7,0x45,0x63, 0x5,0x6b,0x39, 0x7,0x4c,0x5d, 0x5,0x6b,0x3a, 0x7,0x4c,0x62, 0x5,0x6b,0x3e, 0x5,0x6b,0x4a, 0x5,0x6b,0x40, 0x7,0x4c,0x6a, 0x7,0x4c,0x64, 0x5,0x6b,0x3b, 0x7,0x4c,0x68, 0x7,0x4c,0x6b, 0x7,0x4c,0x63, 0x5,0x6b,0x4c, 0x5,0x6b,0x3d, 0x5,0x6b,0x4b, 0x4,0x62,0x6b, 0x5,0x6b,0x42, 0x5,0x6b,0x45, 0x7,0x4c,0x60, 0x7,0x4c,0x5e, 0x5,0x6b,0x48, 0x5,0x6b,0x44, 0x7,0x4c,0x5c, 0x7,0x4c,0x66, 0x7,0x4c,0x6c, 0x5,0x6b,0x41, 0x4,0x62,0x6d, 0x7,0x4c,0x69, 0x5,0x6b,0x46, 0xf,0x64,0x74, 0xf,0x64,0x76, 0xf,0x64,0x77, 0x7,0x4c,0x61, 0x5,0x6b,0x47, 0x7,0x4c,0x6f, 0x5,0x6b,0x49, 0x7,0x45,0x69, 0x7,0x4c,0x65, 0x7,0x4c,0x67, 0x7,0x4c,0x6d, 0x5,0x6b,0x43, 0x7,0x4c,0x6e, 0x7,0x4c,0x5f, 0x4,0x62,0x69, 0x5,0x6f,0x38, 0x5,0x6f,0x30, 0x7,0x52,0x3a, 0x4,0x65,0x65, 0x5,0x6f,0x3e, 0x7,0x52,0x43, 0x5,0x6f,0x32, 0x5,0x6f,0x42, 0x4,0x62,0x70, 0x7,0x52,0x36, 0x5,0x6f,0x2f, 0x4,0x65,0x63, 0x5,0x6f,0x31, 0x4,0x65,0x6e, 0x4,0x65,0x68, 0x5,0x6f,0x33, 0x5,0x6f,0x2d, 0x5,0x6f,0x37, 0x5,0x6f,0x44, 0x5,0x6f,0x39, 0x4,0x65,0x6d, 0x4,0x65,0x66, 0x5,0x6f,0x3a, 0x5,0x6f,0x3c, 0x5,0x6f,0x40, 0x4,0x65,0x67, 0x5,0x6f,0x2e, 0x5,0x6f,0x3b, 0x5,0x6f,0x36, 0x5,0x6f,0x3f, 0x7,0x52,0x3f, 0x7,0x52,0x3b, 0x7,0x52,0x40, 0x7,0x52,0x35, 0x7,0x52,0x37, 0x5,0x6f,0x3d, 0x5,0x6f,0x35, 0x5,0x6f,0x34, 0x5,0x6f,0x43, 0x7,0x52,0x38, 0xf,0x67,0x37, 0x7,0x52,0x3e, 0x7,0x52,0x3d, 0x7,0x52,0x39, 0x7,0x52,0x44, 0x7,0x52,0x41, 0x7,0x52,0x3c, 0xf,0x67,0x38, 0x5,0x6f,0x41, 0x7,0x45,0x5a, 0x5,0x72,0x5e, 0x7,0x56,0x79, 0x5,0x72,0x66, 0x7,0x56,0x7e, 0x5,0x72,0x5d, 0x5,0x72,0x60, 0x5,0x72,0x5b, 0x5,0x72,0x65, 0x5,0x72,0x64, 0x7,0x57,0x21, 0x7,0x56,0x7d, 0x7,0x56,0x7a, 0x5,0x72,0x68, 0x7,0x57,0x27, 0x7,0x57,0x26, 0x7,0x57,0x24, 0x5,0x72,0x5c, 0x5,0x72,0x61, 0x5,0x6f,0x45, 0x5,0x72,0x5a, 0x5,0x72,0x62, 0x7,0x57,0x22, 0x7,0x56,0x7c, 0x5,0x72,0x69, 0x5,0x72,0x6a, 0xf,0x69,0x34, 0x5,0x72,0x5f, 0x7,0x57,0x23, 0x7,0x56,0x77, 0x7,0x57,0x28, 0x7,0x56,0x76, 0x7,0x56,0x7b, 0xf,0x69,0x33, 0x5,0x72,0x58, 0x7,0x56,0x78, 0x5,0x72,0x59, 0xf,0x67,0x36, 0x5,0x75,0x42, 0x5,0x75,0x3d, 0x4,0x6a,0x24, 0x4,0x6a,0x2d, 0x5,0x75,0x3c, 0x4,0x6a,0x28, 0x5,0x75,0x43, 0x5,0x75,0x39, 0x5,0x6f,0x46, 0x5,0x75,0x44, 0x5,0x75,0x40, 0x5,0x75,0x3f, 0x4,0x6a,0x2b, 0x7,0x5a,0x62, 0x7,0x5a,0x6c, 0x7,0x5a,0x6a, 0x7,0x5a,0x70, 0x4,0x6a,0x2a, 0x7,0x5a,0x6b, 0x7,0x5a,0x6e, 0x5,0x75,0x3b, 0x4,0x6a,0x29, 0x7,0x5a,0x69, 0x5,0x75,0x37, 0x7,0x5a,0x68, 0x5,0x75,0x38, 0x5,0x75,0x46, 0x5,0x72,0x67, 0x7,0x5a,0x71, 0x5,0x75,0x41, 0x7,0x5a,0x6f, 0x7,0x5a,0x67, 0x7,0x57,0x25, 0xf,0x6a,0x44, 0xf,0x6a,0x45, 0xf,0x6a,0x46, 0xf,0x6a,0x47, 0xf,0x6a,0x48, 0x5,0x75,0x3e, 0x7,0x5a,0x66, 0x7,0x5a,0x64, 0x7,0x5a,0x61, 0x7,0x5a,0x63, 0x5,0x75,0x3a, 0x7,0x5e,0x2b, 0x7,0x5e,0x27, 0x7,0x5e,0x31, 0x5,0x77,0x33, 0x7,0x5e,0x2f, 0x5,0x77,0x2e, 0x5,0x77,0x29, 0x4,0x6b,0x43, 0x7,0x5e,0x32, 0x7,0x5e,0x36, 0x5,0x77,0x25, 0x5,0x77,0x30, 0x5,0x77,0x2a, 0x5,0x77,0x28, 0x5,0x77,0x2f, 0x7,0x5e,0x2c, 0x5,0x77,0x27, 0x5,0x77,0x26, 0x5,0x77,0x38, 0x5,0x77,0x2b, 0x4,0x6b,0x49, 0x4,0x6b,0x42, 0x7,0x5e,0x35, 0x5,0x77,0x31, 0x7,0x5e,0x30, 0x7,0x5e,0x33, 0x5,0x77,0x2d, 0x7,0x5a,0x65, 0x5,0x77,0x35, 0x7,0x5a,0x6d, 0x7,0x5e,0x34, 0x5,0x77,0x36, 0x7,0x5e,0x2d, 0xf,0x6b,0x40, 0x7,0x5e,0x24, 0x7,0x5e,0x26, 0x7,0x5e,0x2e, 0x7,0x5e,0x29, 0x7,0x5e,0x28, 0x5,0x77,0x32, 0x7,0x5e,0x2a, 0x7,0x5e,0x25, 0x4,0x6b,0x41, 0xf,0x6b,0x7a, 0x7,0x5e,0x37, 0x7,0x60,0x4d, 0x5,0x78,0x67, 0x5,0x78,0x69, 0x5,0x78,0x6d, 0x5,0x78,0x65, 0x5,0x77,0x37, 0x5,0x78,0x68, 0x7,0x60,0x4e, 0x5,0x78,0x6a, 0x5,0x78,0x6b, 0x7,0x60,0x4f, 0x7,0x60,0x50, 0x7,0x60,0x54, 0x5,0x78,0x6c, 0x7,0x60,0x53, 0x7,0x60,0x4c, 0x7,0x60,0x51, 0x5,0x78,0x63, 0x5,0x78,0x66, 0x5,0x78,0x62, 0xf,0x6b,0x79, 0x7,0x60,0x52, 0x4,0x6c,0x55, 0x5,0x78,0x64, 0x4,0x6c,0x53, 0x5,0x79,0x71, 0x5,0x79,0x6d, 0x5,0x79,0x70, 0x7,0x61,0x76, 0x4,0x6d,0x3b, 0x5,0x79,0x6e, 0x5,0x79,0x6c, 0x4,0x6d,0x3c, 0x7,0x61,0x74, 0x5,0x79,0x6f, 0x7,0x61,0x78, 0x7,0x61,0x75, 0x7,0x61,0x77, 0x4,0x6d,0x3e, 0x5,0x7a,0x58, 0x7,0x63,0x39, 0x5,0x7a,0x56, 0x4,0x6d,0x6b, 0x5,0x7a,0x5a, 0x5,0x7a,0x59, 0x5,0x7a,0x55, 0x5,0x7a,0x57, 0x4,0x6d,0x6a, 0x7,0x63,0x38, 0x5,0x7a,0x54, 0x7,0x63,0x3b, 0x5,0x7a,0x5b, 0x7,0x63,0x3d, 0xf,0x6c,0x5e, 0x7,0x63,0x3a, 0x7,0x63,0x36, 0x7,0x63,0x3c, 0x5,0x7b,0x2e, 0x7,0x64,0x34, 0x7,0x64,0x36, 0x5,0x7b,0x2f, 0x5,0x7b,0x2c, 0x5,0x7b,0x2b, 0x5,0x7b,0x31, 0x5,0x7b,0x30, 0x5,0x7b,0x2d, 0x7,0x64,0x37, 0xf,0x6c,0x76, 0x4,0x6e,0x2e, 0x7,0x64,0x33, 0x7,0x64,0x35, 0x5,0x7b,0x56, 0x7,0x65,0x22, 0x7,0x65,0x53, 0x7,0x65,0x24, 0x7,0x65,0x26, 0x7,0x65,0x23, 0x7,0x65,0x27, 0x5,0x7b,0x57, 0x7,0x65,0x25, 0x4,0x6e,0x42, 0x5,0x7b,0x74, 0x7,0x65,0x54, 0x7,0x65,0x55, 0x5,0x7b,0x75, 0x7,0x65,0x52, 0x7,0x65,0x56, 0x7,0x65,0x51, 0x7,0x65,0x6d, 0x7,0x65,0x6c, 0x5,0x7c,0x29, 0x5,0x7c,0x28, 0xf,0x6d,0x32, 0x5,0x7c,0x2f, 0x7,0x66,0x21, 0x7,0x65,0x7e, 0x5,0x7c,0x38, 0x7,0x66,0x30, 0x5,0x7c,0x39, 0x7,0x66,0x3a, 0x5,0x7c,0x41, 0xf,0x6d,0x37, 0x5,0x7c,0x48, 0x7,0x66,0x45, 0x4,0x48,0x71, 0x4,0x48,0x72, 0x5,0x53,0x44, 0x7,0x2c,0x22, 0x7,0x2c,0x21, 0x7,0x2b,0x7e, 0x5,0x5a,0x5a, 0x5,0x5a,0x5c, 0x7,0x36,0x5a, 0x7,0x36,0x5b, 0xf,0x59,0x41, 0x7,0x36,0x59, 0x5,0x67,0x2c, 0x7,0x3e,0x59, 0x4,0x62,0x71, 0x7,0x4c,0x70, 0x5,0x6b,0x4d, 0x7,0x4c,0x71, 0x7,0x52,0x46, 0x5,0x6f,0x48, 0x5,0x6f,0x49, 0x7,0x52,0x47, 0x5,0x6f,0x47, 0x7,0x52,0x49, 0x7,0x52,0x48, 0x4,0x68,0x45, 0x7,0x57,0x2b, 0x7,0x57,0x2a, 0x5,0x72,0x6b, 0x7,0x5a,0x73, 0x7,0x5a,0x72, 0x4,0x6b,0x4c, 0x7,0x5e,0x38, 0x7,0x5e,0x39, 0x5,0x77,0x39, 0x7,0x60,0x55, 0x4,0x6c,0x57, 0x5,0x79,0x72, 0x4,0x6d,0x3f, 0x7,0x63,0x3e, 0x5,0x7b,0x32, 0x6,0x5a,0x5d, 0xf,0x46,0x3d, 0x5,0x4b,0x6c, 0xf,0x4d,0x52, 0x7,0x2c,0x28, 0x5,0x53,0x45, 0x7,0x2c,0x27, 0x7,0x2c,0x26, 0x7,0x2c,0x24, 0x5,0x53,0x46, 0x7,0x2c,0x25, 0x5,0x53,0x47, 0x7,0x2c,0x29, 0x7,0x2c,0x23, 0x7,0x36,0x5d, 0x5,0x5a,0x5d, 0xf,0x59,0x42, 0xf,0x59,0x43, 0xf,0x59,0x44, 0x5,0x60,0x6f, 0x5,0x60,0x72, 0x5,0x60,0x70, 0x4,0x5a,0x5c, 0x5,0x60,0x73, 0x5,0x60,0x71, 0x7,0x3e,0x5b, 0x7,0x3e,0x5a, 0x7,0x3e,0x5e, 0x7,0x3e,0x5d, 0xf,0x5e,0x26, 0x5,0x60,0x6e, 0x7,0x45,0x6e, 0x5,0x67,0x31, 0x5,0x67,0x2e, 0x5,0x67,0x2d, 0x7,0x45,0x6b, 0x7,0x45,0x6d, 0x7,0x45,0x6a, 0x5,0x67,0x30, 0x7,0x45,0x6c, 0xf,0x61,0x78, 0xf,0x61,0x79, 0xf,0x61,0x7a, 0x5,0x67,0x2f, 0x5,0x6b,0x4f, 0x5,0x6b,0x4e, 0x5,0x6b,0x51, 0x4,0x62,0x73, 0x7,0x4c,0x73, 0x5,0x6b,0x50, 0x7,0x4c,0x72, 0x5,0x68,0x40, 0x7,0x52,0x4b, 0x4,0x62,0x74, 0x4,0x65,0x6f, 0x7,0x4c,0x74, 0xf,0x67,0x39, 0x7,0x52,0x4a, 0x7,0x52,0x4c, 0x5,0x6f,0x4a, 0x4,0x68,0x47, 0x7,0x57,0x2c, 0x7,0x57,0x2d, 0x4,0x68,0x46, 0xf,0x69,0x35, 0x5,0x75,0x47, 0x4,0x6a,0x2e, 0xf,0x6a,0x49, 0x5,0x77,0x3a, 0x5,0x77,0x3c, 0x5,0x77,0x3b, 0x7,0x5e,0x3a, 0x7,0x5e,0x3b, 0x7,0x60,0x56, 0x4,0x6c,0x58, 0x7,0x60,0x57, 0xf,0x6b,0x7b, 0x5,0x79,0x75, 0x5,0x79,0x74, 0x5,0x78,0x6e, 0x4,0x6d,0x40, 0x4,0x6d,0x6c, 0xf,0x6c,0x47, 0x7,0x65,0x28, 0x7,0x65,0x57, 0x5,0x7c,0x46, 0x7,0x66,0x47, 0x6,0x5a,0x5f, 0x6,0x5a,0x5e, 0x5,0x44,0x53, 0xf,0x46,0x3f, 0x4,0x48,0x75, 0x6,0x64,0x75, 0xf,0x4d,0x53, 0x5,0x53,0x4b, 0x5,0x53,0x4a, 0x4,0x4f,0x4f, 0x5,0x53,0x49, 0x5,0x53,0x48, 0x7,0x2c,0x2b, 0x7,0x2c,0x2f, 0x7,0x2c,0x2a, 0x4,0x4f,0x4e, 0x7,0x2c,0x2c, 0x5,0x53,0x4c, 0x7,0x2c,0x2e, 0x7,0x2c,0x2d, 0x7,0x36,0x61, 0x7,0x36,0x5f, 0x7,0x36,0x5e, 0x7,0x36,0x63, 0x4,0x55,0x5b, 0x7,0x36,0x62, 0x6,0x47,0x53, 0xf,0x59,0x45, 0x5,0x5a,0x5e, 0x7,0x36,0x60, 0x5,0x60,0x74, 0x5,0x60,0x75, 0x7,0x3e,0x60, 0x7,0x3e,0x61, 0xf,0x5e,0x28, 0x7,0x3e,0x62, 0x7,0x3e,0x5f, 0x7,0x45,0x70, 0x5,0x67,0x32, 0x7,0x45,0x72, 0x5,0x67,0x33, 0x5,0x67,0x35, 0x7,0x45,0x73, 0x5,0x67,0x34, 0xf,0x61,0x7b, 0x7,0x45,0x71, 0x7,0x45,0x6f, 0x4,0x62,0x7a, 0x4,0x62,0x78, 0x7,0x4c,0x79, 0x7,0x4c,0x7b, 0x7,0x4c,0x75, 0x5,0x6b,0x54, 0x5,0x6b,0x52, 0x7,0x4c,0x7a, 0x5,0x6b,0x55, 0x5,0x6b,0x53, 0x7,0x4c,0x78, 0x4,0x62,0x7b, 0x7,0x4c,0x77, 0x7,0x4c,0x76, 0x5,0x6f,0x4b, 0x7,0x52,0x53, 0x7,0x52,0x52, 0x5,0x6f,0x4c, 0x7,0x52,0x50, 0x4,0x65,0x70, 0x7,0x52,0x4f, 0x5,0x6f,0x4e, 0x5,0x6f,0x4d, 0x7,0x52,0x51, 0xf,0x67,0x3a, 0x7,0x52,0x4e, 0x7,0x52,0x4d, 0x5,0x72,0x6c, 0x7,0x57,0x2f, 0x5,0x72,0x6f, 0x7,0x57,0x30, 0x5,0x72,0x6e, 0x7,0x57,0x31, 0x7,0x57,0x2e, 0x5,0x72,0x6d, 0x5,0x75,0x4b, 0x5,0x75,0x4c, 0x7,0x5a,0x74, 0x5,0x75,0x49, 0x5,0x75,0x4e, 0x7,0x5a,0x7b, 0x7,0x5a,0x76, 0x7,0x5a,0x77, 0x7,0x5a,0x7c, 0x7,0x5a,0x79, 0x5,0x75,0x4a, 0x7,0x5a,0x75, 0x7,0x5a,0x78, 0x7,0x5a,0x7a, 0x5,0x77,0x3f, 0x4,0x6b,0x4f, 0x5,0x77,0x3e, 0x5,0x77,0x40, 0x5,0x77,0x3d, 0x5,0x78,0x6f, 0x5,0x78,0x71, 0x5,0x78,0x70, 0x7,0x60,0x59, 0x7,0x5e,0x3c, 0x4,0x6c,0x59, 0x7,0x60,0x58, 0x4,0x6d,0x6d, 0x7,0x63,0x3f, 0x7,0x64,0x39, 0x7,0x64,0x38, 0x5,0x7b,0x58, 0x7,0x65,0x29, 0x4,0x6e,0x52, 0x5,0x7c,0x30, 0xf,0x29,0x21, 0xf,0x46,0x3e, 0xf,0x53,0x42, 0xf,0x5e,0x27, 0x5,0x4b,0x70, 0x5,0x4b,0x6e, 0x5,0x4b,0x6f, 0x5,0x53,0x4e, 0x4,0x4f,0x50, 0x5,0x53,0x4d, 0x7,0x2c,0x30, 0x5,0x5a,0x61, 0x7,0x36,0x64, 0x5,0x5a,0x5f, 0x5,0x5a,0x60, 0xf,0x59,0x46, 0x5,0x60,0x78, 0x5,0x60,0x76, 0xf,0x5e,0x29, 0x5,0x60,0x77, 0x5,0x67,0x36, 0x7,0x4c,0x7c, 0x5,0x6b,0x56, 0x7,0x4c,0x7d, 0x4,0x65,0x73, 0x7,0x57,0x32, 0x5,0x72,0x70, 0x7,0x5a,0x7e, 0x4,0x6b,0x50, 0x7,0x5b,0x56, 0x7,0x5e,0x3d, 0x4,0x6b,0x51, 0x5,0x7c,0x31, 0xf,0x4d,0x54, 0x7,0x2c,0x32, 0x5,0x5a,0x62, 0x5,0x5a,0x64, 0x5,0x5a,0x63, 0x5,0x60,0x7a, 0x5,0x67,0x38, 0x5,0x60,0x79, 0x5,0x67,0x39, 0x5,0x67,0x37, 0x5,0x6b,0x57, 0x4,0x63,0x22, 0xf,0x64,0x79, 0x4,0x65,0x75, 0x4,0x65,0x74, 0x5,0x6f,0x50, 0x5,0x6f,0x4f, 0x4,0x65,0x77, 0x7,0x52,0x54, 0x7,0x52,0x55, 0x7,0x52,0x56, 0xf,0x67,0x3b, 0x7,0x52,0x57, 0x5,0x72,0x73, 0x5,0x72,0x72, 0x5,0x72,0x71, 0x7,0x57,0x33, 0x7,0x57,0x34, 0x5,0x75,0x4f, 0x4,0x6a,0x2f, 0x4,0x6a,0x30, 0x7,0x5b,0x23, 0x7,0x5b,0x22, 0x7,0x5b,0x21, 0x7,0x5e,0x3e, 0x5,0x78,0x72, 0x7,0x60,0x5a, 0x5,0x78,0x73, 0x7,0x61,0x79, 0x5,0x79,0x76, 0x7,0x66,0x27, 0x4,0x48,0x76, 0x5,0x53,0x4f, 0x4,0x4f,0x51, 0x7,0x36,0x68, 0x7,0x36,0x66, 0x5,0x5a,0x66, 0x5,0x5a,0x65, 0x5,0x5a,0x67, 0x5,0x60,0x7e, 0x7,0x3e,0x64, 0x5,0x60,0x7c, 0x7,0x3e,0x63, 0x5,0x60,0x7b, 0x4,0x5a,0x5e, 0x5,0x60,0x7d, 0x7,0x3e,0x65, 0x7,0x3e,0x66, 0x5,0x67,0x3b, 0x5,0x67,0x3a, 0x4,0x65,0x78, 0x5,0x6f,0x51, 0x5,0x6f,0x53, 0x5,0x72,0x74, 0x7,0x57,0x36, 0x7,0x57,0x35, 0xf,0x69,0x36, 0x5,0x75,0x50, 0x4,0x6b,0x54, 0x5,0x77,0x42, 0x5,0x77,0x41, 0x4,0x6b,0x53, 0x7,0x63,0x40, 0x7,0x61,0x7a, 0x4,0x6d,0x6e, 0x5,0x7b,0x5a, 0x7,0x65,0x2a, 0x5,0x7b,0x59, 0x6,0x64,0x76, 0x5,0x44,0x54, 0x6,0x64,0x78, 0x6,0x64,0x77, 0x7,0x2c,0x34, 0x4,0x4f,0x55, 0x4,0x4f,0x54, 0x5,0x53,0x50, 0x7,0x2c,0x35, 0x7,0x2c,0x36, 0x7,0x36,0x6a, 0x5,0x5a,0x6a, 0x5,0x5a,0x68, 0x5,0x5a,0x69, 0x7,0x36,0x69, 0x7,0x36,0x6b, 0x7,0x36,0x6c, 0x4,0x5a,0x60, 0x7,0x3e,0x68, 0x5,0x61,0x21, 0xf,0x5e,0x2a, 0x7,0x3e,0x67, 0x5,0x67,0x3e, 0x5,0x67,0x3c, 0x7,0x45,0x74, 0x5,0x6b,0x58, 0x5,0x61,0x22, 0x5,0x67,0x3f, 0x5,0x6b,0x5a, 0x5,0x6b,0x59, 0x5,0x6b,0x5b, 0x5,0x6b,0x5d, 0x5,0x6b,0x5c, 0x7,0x4d,0x21, 0x7,0x4c,0x7e, 0x5,0x6f,0x56, 0x5,0x6f,0x57, 0x7,0x52,0x5b, 0x5,0x6f,0x5b, 0x5,0x6f,0x59, 0x5,0x6f,0x55, 0x7,0x52,0x58, 0x4,0x65,0x7e, 0x4,0x65,0x7b, 0x7,0x52,0x5c, 0x5,0x6f,0x5a, 0x4,0x65,0x7a, 0x7,0x52,0x5a, 0xf,0x67,0x3c, 0x7,0x52,0x59, 0x7,0x57,0x38, 0x4,0x68,0x53, 0x4,0x68,0x51, 0x5,0x72,0x78, 0x4,0x68,0x50, 0x5,0x72,0x7b, 0x7,0x57,0x37, 0x5,0x72,0x75, 0x5,0x72,0x79, 0x5,0x72,0x77, 0x4,0x68,0x54, 0x5,0x72,0x76, 0x4,0x68,0x55, 0x4,0x6a,0x34, 0x7,0x57,0x39, 0x7,0x57,0x3a, 0x5,0x72,0x7a, 0x5,0x75,0x51, 0x4,0x6a,0x33, 0x4,0x6a,0x35, 0x7,0x5b,0x2a, 0x7,0x5b,0x27, 0x7,0x5b,0x26, 0x4,0x6a,0x32, 0x7,0x5b,0x29, 0x7,0x5b,0x28, 0x5,0x75,0x52, 0x7,0x5b,0x25, 0x5,0x77,0x47, 0x7,0x5e,0x41, 0x5,0x77,0x46, 0x5,0x77,0x44, 0x5,0x77,0x45, 0x5,0x77,0x43, 0x5,0x77,0x48, 0x7,0x5e,0x3f, 0x5,0x78,0x76, 0x5,0x78,0x77, 0x7,0x60,0x5d, 0x4,0x6c,0x5c, 0x4,0x6c,0x60, 0x5,0x78,0x75, 0x7,0x60,0x5c, 0x5,0x78,0x74, 0x4,0x6c,0x5f, 0x4,0x6c,0x5e, 0x4,0x6c,0x5d, 0x7,0x5e,0x40, 0x7,0x60,0x5b, 0x5,0x79,0x78, 0x5,0x79,0x79, 0x5,0x79,0x7a, 0x5,0x79,0x77, 0x4,0x6d,0x45, 0x7,0x61,0x7b, 0x7,0x61,0x7c, 0x4,0x6d,0x46, 0x5,0x7a,0x5c, 0x7,0x64,0x3a, 0x7,0x65,0x2b, 0x4,0x6e,0x30, 0x7,0x64,0x3b, 0x5,0x7b,0x33, 0x4,0x6e,0x2f, 0x5,0x7b,0x5b, 0x5,0x7b,0x5c, 0x7,0x65,0x2c, 0x4,0x6e,0x4a, 0x5,0x7b,0x76, 0x7,0x65,0x6e, 0x5,0x7c,0x4a, 0x7,0x66,0x52, 0x7,0x45,0x75, 0x4,0x66,0x22, 0x5,0x72,0x7c, 0x4,0x68,0x57, 0x5,0x77,0x49, 0x6,0x64,0x79, 0x7,0x2c,0x38, 0x7,0x2c,0x37, 0x5,0x61,0x24, 0x7,0x36,0x6d, 0x4,0x5a,0x61, 0x7,0x3e,0x69, 0x7,0x3e,0x6a, 0x7,0x45,0x78, 0x5,0x67,0x42, 0x7,0x45,0x79, 0x7,0x45,0x77, 0x7,0x45,0x76, 0x4,0x5f,0x41, 0x7,0x4d,0x24, 0x7,0x4d,0x25, 0x7,0x3e,0x6b, 0x7,0x4d,0x23, 0x7,0x52,0x5e, 0x7,0x52,0x5f, 0x7,0x52,0x5d, 0x5,0x72,0x7d, 0x7,0x57,0x3b, 0x4,0x6a,0x36, 0x7,0x5b,0x2c, 0x7,0x5b,0x31, 0x7,0x5b,0x32, 0x7,0x5b,0x2e, 0x7,0x5b,0x30, 0x7,0x5b,0x2d, 0x7,0x5b,0x2b, 0x7,0x5b,0x2f, 0x5,0x77,0x4a, 0x7,0x5e,0x42, 0x5,0x78,0x78, 0x5,0x79,0x7b, 0x5,0x7a,0x5d, 0x4,0x6d,0x47, 0x7,0x63,0x41, 0x5,0x7b,0x34, 0x7,0x63,0x42, 0x7,0x65,0x2d, 0x6,0x50,0x4f, 0x7,0x36,0x6e, 0x7,0x36,0x6f, 0x5,0x5a,0x6b, 0x7,0x46,0x4f, 0x7,0x65,0x2e, 0x5,0x5a,0x6c, 0x5,0x61,0x25, 0x7,0x3e,0x6d, 0x5,0x67,0x43, 0x7,0x45,0x7a, 0x5,0x67,0x44, 0xf,0x61,0x7d, 0x7,0x4d,0x27, 0x5,0x6b,0x60, 0x7,0x4d,0x26, 0x5,0x6b,0x5e, 0x5,0x6b,0x5f, 0x4,0x63,0x25, 0x4,0x66,0x23, 0x7,0x52,0x60, 0x4,0x6a,0x39, 0x4,0x68,0x58, 0x7,0x57,0x3c, 0x7,0x57,0x3d, 0x5,0x75,0x53, 0x7,0x5b,0x34, 0x7,0x5b,0x35, 0x5,0x75,0x55, 0x4,0x6a,0x38, 0x7,0x5b,0x33, 0x5,0x75,0x54, 0x7,0x5e,0x43, 0x7,0x60,0x5e, 0x5,0x78,0x79, 0x7,0x60,0x5f, 0x5,0x79,0x7c, 0x7,0x63,0x43, 0x5,0x7b,0x35, 0x5,0x7b,0x77, 0x7,0x2c,0x39, 0x5,0x5a,0x6d, 0x7,0x3e,0x6e, 0x5,0x5a,0x6e, 0x5,0x61,0x28, 0x5,0x61,0x2a, 0x5,0x61,0x2b, 0x5,0x61,0x29, 0x5,0x61,0x27, 0x7,0x3e,0x70, 0x5,0x61,0x26, 0x7,0x3e,0x6f, 0x5,0x61,0x2c, 0x4,0x5a,0x62, 0x7,0x45,0x7c, 0x7,0x4d,0x2c, 0x5,0x67,0x47, 0x5,0x67,0x48, 0x5,0x67,0x46, 0x5,0x67,0x45, 0x7,0x45,0x7b, 0x7,0x4d,0x2a, 0x5,0x6b,0x61, 0x5,0x6b,0x63, 0x5,0x6b,0x62, 0x7,0x4d,0x2d, 0x7,0x4d,0x2e, 0x7,0x4d,0x29, 0x7,0x52,0x62, 0x7,0x52,0x64, 0x7,0x52,0x63, 0x5,0x6f,0x5d, 0x5,0x6f,0x5e, 0x7,0x4d,0x2b, 0x7,0x52,0x65, 0x5,0x6f,0x5c, 0x7,0x52,0x61, 0x5,0x73,0x21, 0x5,0x72,0x7e, 0x7,0x57,0x3e, 0x5,0x75,0x57, 0x7,0x5b,0x36, 0x5,0x75,0x58, 0x5,0x75,0x59, 0x5,0x75,0x56, 0x4,0x6a,0x3a, 0x7,0x5e,0x44, 0x5,0x77,0x4b, 0x4,0x6b,0x59, 0x7,0x5e,0x48, 0x4,0x6b,0x57, 0x4,0x6b,0x5a, 0x7,0x5e,0x47, 0x7,0x5e,0x46, 0x7,0x5e,0x45, 0x5,0x78,0x7d, 0x4,0x6c,0x63, 0x5,0x78,0x7b, 0x5,0x78,0x7a, 0x7,0x60,0x60, 0x7,0x61,0x7e, 0x7,0x61,0x7d, 0x4,0x6d,0x49, 0x5,0x79,0x7d, 0x5,0x7b,0x36, 0x5,0x7b,0x79, 0x5,0x7b,0x78, 0x7,0x65,0x6f, 0x7,0x66,0x22, 0x4,0x4f,0x57, 0x7,0x36,0x70, 0x7,0x36,0x71, 0x7,0x3e,0x72, 0x7,0x3e,0x71, 0x5,0x67,0x49, 0x7,0x45,0x7e, 0x7,0x46,0x21, 0x7,0x45,0x7d, 0x5,0x6b,0x64, 0x5,0x6b,0x65, 0x7,0x52,0x66, 0x5,0x6f,0x5f, 0x5,0x6f,0x60, 0x7,0x52,0x68, 0x4,0x68,0x5b, 0x5,0x73,0x22, 0x7,0x57,0x3f, 0x7,0x57,0x40, 0x5,0x73,0x23, 0x5,0x73,0x24, 0x7,0x5b,0x37, 0x5,0x77,0x4c, 0x7,0x5e,0x49, 0x5,0x78,0x7c, 0xf,0x6b,0x7e, 0x7,0x60,0x61, 0x5,0x79,0x7e, 0x5,0x7a,0x21, 0x7,0x63,0x46, 0x5,0x7a,0x5e, 0x7,0x63,0x45, 0x7,0x64,0x3c, 0x4,0x6e,0x53, 0x5,0x7c,0x32, 0xf,0x40,0x34, 0x4,0x55,0x64, 0x4,0x5a,0x65, 0x7,0x46,0x22, 0x4,0x63,0x28, 0x7,0x4d,0x2f, 0x5,0x6d,0x57, 0x4,0x66,0x24, 0x4,0x6a,0x3b, 0xf,0x69,0x37, 0x5,0x7a,0x23, 0x5,0x7a,0x22, 0x7,0x62,0x21, 0x7,0x65,0x2f, 0x5,0x61,0x2e, 0x7,0x3e,0x73, 0x7,0x46,0x25, 0x4,0x5f,0x47, 0x7,0x46,0x24, 0x7,0x4d,0x30, 0x5,0x6b,0x66, 0x4,0x63,0x2a, 0x7,0x4d,0x31, 0x7,0x4d,0x34, 0x7,0x4d,0x32, 0x7,0x4d,0x33, 0x7,0x4d,0x35, 0x7,0x4d,0x36, 0x5,0x6b,0x67, 0x7,0x52,0x6b, 0x5,0x6f,0x63, 0x5,0x6f,0x62, 0x4,0x66,0x28, 0x7,0x52,0x69, 0x4,0x66,0x2a, 0x7,0x52,0x6d, 0x4,0x66,0x29, 0x7,0x52,0x6e, 0x7,0x52,0x6a, 0x4,0x48,0x78, 0x7,0x52,0x6c, 0x7,0x57,0x46, 0x5,0x73,0x2a, 0x5,0x73,0x27, 0x7,0x57,0x43, 0x7,0x57,0x42, 0x4,0x68,0x5e, 0x5,0x73,0x28, 0x4,0x68,0x5f, 0x4,0x68,0x5d, 0x7,0x57,0x44, 0x5,0x73,0x25, 0x5,0x73,0x2b, 0x7,0x57,0x45, 0x7,0x57,0x47, 0x5,0x73,0x29, 0x7,0x57,0x41, 0x5,0x73,0x26, 0x7,0x5b,0x38, 0x4,0x6a,0x3e, 0x5,0x75,0x5c, 0x5,0x75,0x5b, 0x5,0x75,0x5e, 0x7,0x5b,0x40, 0x7,0x5b,0x3f, 0x5,0x75,0x5f, 0x7,0x5b,0x3a, 0x5,0x75,0x60, 0x4,0x6a,0x3f, 0x7,0x5b,0x39, 0x5,0x75,0x5a, 0x7,0x5b,0x3b, 0x7,0x5b,0x3d, 0x7,0x5b,0x3e, 0x7,0x5b,0x3c, 0x5,0x75,0x5d, 0x5,0x77,0x4f, 0x5,0x77,0x4e, 0x4,0x6b,0x5e, 0x4,0x6b,0x62, 0x4,0x6b,0x63, 0x4,0x6b,0x5f, 0x4,0x6b,0x60, 0x5,0x77,0x50, 0x7,0x5e,0x4e, 0x7,0x5e,0x4c, 0x4,0x6b,0x5d, 0x7,0x5e,0x4a, 0x7,0x5e,0x4b, 0x7,0x5e,0x4f, 0x4,0x6b,0x64, 0x4,0x6c,0x67, 0x5,0x78,0x7e, 0x7,0x60,0x67, 0x4,0x6c,0x68, 0x7,0x60,0x65, 0x5,0x79,0x21, 0x7,0x62,0x23, 0x4,0x6c,0x65, 0x7,0x60,0x63, 0x7,0x60,0x66, 0x7,0x60,0x64, 0x7,0x60,0x62, 0x7,0x60,0x68, 0x5,0x79,0x22, 0x4,0x6d,0x4e, 0x4,0x6d,0x4a, 0x7,0x62,0x25, 0x5,0x7a,0x26, 0x4,0x6d,0x50, 0x4,0x6d,0x4d, 0x5,0x7a,0x24, 0x7,0x62,0x27, 0x4,0x6d,0x4f, 0x7,0x62,0x24, 0x7,0x62,0x26, 0x7,0x62,0x28, 0x7,0x62,0x29, 0x7,0x62,0x22, 0x5,0x7a,0x25, 0x7,0x63,0x48, 0x5,0x7a,0x60, 0x7,0x63,0x47, 0x5,0x7a,0x62, 0x5,0x7a,0x5f, 0x5,0x7a,0x61, 0x7,0x64,0x3e, 0x4,0x6e,0x32, 0x7,0x64,0x3d, 0x5,0x7b,0x37, 0x5,0x7b,0x39, 0x5,0x7b,0x38, 0x7,0x64,0x40, 0x7,0x64,0x41, 0x7,0x64,0x3f, 0x4,0x6e,0x46, 0x7,0x65,0x32, 0x5,0x7b,0x5d, 0x7,0x65,0x31, 0x7,0x65,0x30, 0x7,0x65,0x59, 0x7,0x65,0x71, 0x7,0x65,0x72, 0x5,0x7c,0x2a, 0x7,0x65,0x70, 0x7,0x65,0x73, 0x5,0x7c,0x33, 0x7,0x66,0x24, 0x7,0x66,0x23, 0x5,0x7c,0x3b, 0x7,0x66,0x32, 0x5,0x7c,0x3a, 0x7,0x66,0x31, 0x7,0x66,0x3d, 0x7,0x66,0x3c, 0x5,0x7c,0x45, 0x7,0x66,0x41, 0x7,0x66,0x48, 0x5,0x7c,0x4e, 0x5,0x7c,0x4d, 0x5,0x6b,0x68, 0x7,0x4d,0x37, 0x4,0x63,0x2c, 0x7,0x52,0x70, 0x7,0x52,0x6f, 0x7,0x4e,0x24, 0x5,0x6f,0x64, 0x7,0x57,0x48, 0xf,0x67,0x3d, 0x7,0x5b,0x42, 0x7,0x5b,0x41, 0x7,0x5b,0x43, 0x7,0x5b,0x44, 0x5,0x77,0x51, 0x5,0x7c,0x51, 0x7,0x36,0x72, 0x7,0x3e,0x74, 0x7,0x46,0x26, 0x7,0x57,0x49, 0x5,0x6f,0x65, 0x4,0x66,0x2b, 0x5,0x6f,0x67, 0x5,0x6f,0x66, 0x4,0x66,0x2c, 0x7,0x52,0x73, 0x7,0x52,0x71, 0xf,0x67,0x3e, 0x7,0x52,0x72, 0x5,0x73,0x2c, 0x5,0x73,0x2e, 0x7,0x57,0x4b, 0x5,0x73,0x2f, 0x5,0x6b,0x6a, 0x5,0x73,0x2d, 0x7,0x54,0x2a, 0x7,0x57,0x4a, 0x7,0x4d,0x39, 0x7,0x4d,0x38, 0x5,0x7b,0x5e, 0x7,0x61,0x29, 0x5,0x7b,0x3a, 0x5,0x77,0x52, 0x7,0x64,0x42, 0xf,0x6d,0x2d, 0x5,0x7c,0x42, 0xf,0x29,0x26, 0x5,0x73,0x30, 0x7,0x62,0x2b, 0x7,0x62,0x2a, 0x5,0x7a,0x64, 0x5,0x7a,0x63, 0x7,0x63,0x4a, 0x7,0x63,0x49, 0x5,0x7b,0x3b, 0x4,0x6e,0x47, 0x7,0x66,0x25, 0x4,0x6e,0x56, 0x7,0x66,0x4c, 0x6,0x29,0x36, 0x6,0x21,0x31, 0x6,0x21,0x21, 0x6,0x25,0x66, 0x6,0x25,0x72, 0x4,0x25,0x3d, 0x6,0x2e,0x61, 0xf,0x2d,0x68, 0x6,0x3d,0x35, 0x6,0x50,0x5b, 0x4,0x3c,0x30, 0x6,0x5a,0x72, 0xf,0x59,0x4d, 0x6,0x23,0x52, 0x3,0x24,0x52, 0x3,0x27,0x53, 0xf,0x67,0x40, 0x3,0x27,0x54, 0x6,0x3d,0x3c, 0x7,0x4d,0x3e, 0x6,0x21,0x50, 0x3,0x22,0x7b, 0x6,0x23,0x59, 0x3,0x21,0x4f, 0x6,0x35,0x44, 0x4,0x21,0x3f, 0x6,0x22,0x3c, 0x3,0x24,0x41, 0x7,0x36,0x7a, 0x5,0x21,0x29, 0x6,0x21,0x38, 0xf,0x23,0x37, 0x6,0x29,0x63, 0x6,0x2e,0x76, 0x6,0x46,0x67, 0x3,0x40,0x43, 0xf,0x22,0x29, 0x6,0x2f,0x25, 0x6,0x35,0x58, 0x4,0x36,0x4c, 0x4,0x21,0x2f, 0x6,0x22,0x46, 0x3,0x22,0x25, 0x6,0x22,0x49, 0x3,0x23,0x29, 0x6,0x2f,0x38, 0x6,0x46,0x74, 0x6,0x2a,0x23, 0x6,0x2f,0x3d, 0x6,0x3d,0x59, 0x6,0x3d,0x5a, 0x3,0x3a,0x26, 0xf,0x21,0x33, 0x3,0x24,0x29, 0x6,0x21,0x61, 0x6,0x26,0x43, 0x5,0x31,0x31, 0x6,0x22,0x5b, 0x5,0x21,0x60, 0x3,0x23,0x3c, 0x4,0x23,0x5c, 0x6,0x26,0x4e, 0x4,0x23,0x5b, 0x6,0x2a,0x3c, 0x3,0x30,0x23, 0x6,0x35,0x7e, 0x4,0x30,0x76, 0x6,0x3d,0x7c, 0x6,0x47,0x2a, 0x6,0x47,0x2c, 0x6,0x47,0x30, 0x6,0x47,0x31, 0x6,0x47,0x33, 0x4,0x3c,0x50, 0x6,0x5b,0x5b, 0x6,0x51,0x36, 0x6,0x5b,0x59, 0x7,0x21,0x60, 0x7,0x2c,0x65, 0x3,0x21,0x7c, 0x6,0x24,0x33, 0x6,0x36,0x35, 0x6,0x3e,0x2c, 0x6,0x3e,0x2b, 0x3,0x34,0x70, 0x4,0x36,0x76, 0x6,0x51,0x4a, 0x7,0x21,0x76, 0x7,0x46,0x3e, 0xf,0x23,0x5b, 0x6,0x51,0x57, 0x5,0x23,0x62, 0x6,0x24,0x3b, 0x6,0x51,0x5e, 0x6,0x47,0x56, 0x6,0x22,0x67, 0xf,0x2a,0x2b, 0x6,0x36,0x4c, 0x6,0x36,0x4d, 0xf,0x2e,0x6d, 0x6,0x3e,0x54, 0x6,0x3e,0x50, 0x6,0x47,0x61, 0x6,0x51,0x69, 0xf,0x47,0x46, 0x3,0x5a,0x33, 0x7,0x46,0x51, 0x6,0x24,0x48, 0x4,0x31,0x30, 0xf,0x41,0x2b, 0x6,0x5c,0x22, 0x3,0x5a,0x36, 0x7,0x60,0x6d, 0x6,0x27,0x21, 0x6,0x36,0x67, 0x6,0x24,0x4b, 0x4,0x21,0x34, 0x5,0x28,0x73, 0x6,0x47,0x7b, 0x4,0x21,0x35, 0xf,0x26,0x62, 0x3,0x2c,0x40, 0x6,0x30,0x4e, 0x6,0x48,0x2b, 0x6,0x48,0x35, 0x3,0x40,0x7e, 0x6,0x52,0x33, 0x6,0x5c,0x3d, 0x6,0x27,0x36, 0x6,0x5c,0x49, 0xf,0x21,0x5f, 0x6,0x48,0x37, 0x6,0x37,0x2c, 0x6,0x48,0x3c, 0x7,0x2d,0x53, 0x7,0x2d,0x55, 0x7,0x60,0x6e, 0x5,0x29,0x27, 0x6,0x3f,0x46, 0x6,0x3f,0x45, 0x3,0x35,0x5f, 0x6,0x52,0x40, 0x5,0x45,0x5d, 0x6,0x21,0x74, 0x6,0x27,0x4a, 0x6,0x2b,0x2f, 0x6,0x30,0x74, 0xf,0x2a,0x5d, 0x6,0x2b,0x39, 0x7,0x2d,0x63, 0x5,0x73,0x40, 0x3,0x2c,0x51, 0x6,0x3f,0x5e, 0x5,0x2d,0x48, 0x3,0x35,0x65, 0x6,0x27,0x5f, 0xf,0x24,0x33, 0x5,0x24,0x38, 0x6,0x31,0x36, 0x6,0x31,0x30, 0xf,0x2a,0x67, 0x4,0x29,0x4a, 0x6,0x48,0x7c, 0x6,0x48,0x78, 0x3,0x46,0x70, 0x6,0x52,0x6c, 0x6,0x52,0x66, 0x6,0x5d,0x26, 0x6,0x5d,0x24, 0x4,0x43,0x51, 0x7,0x2d,0x69, 0x7,0x2d,0x79, 0x7,0x22,0x7b, 0x3,0x54,0x60, 0x4,0x5b,0x2c, 0x7,0x47,0x28, 0x3,0x26,0x27, 0x6,0x40,0x23, 0x5,0x22,0x6e, 0x6,0x2b,0x63, 0x6,0x2b,0x60, 0x6,0x31,0x4f, 0xf,0x2b,0x2b, 0x6,0x37,0x71, 0x3,0x36,0x28, 0x6,0x40,0x36, 0x6,0x40,0x2b, 0x6,0x49,0x4a, 0x6,0x49,0x30, 0xf,0x41,0x5f, 0x7,0x23,0x30, 0x6,0x5d,0x38, 0x5,0x46,0x2c, 0x7,0x23,0x2d, 0xf,0x4f,0x25, 0x4,0x4a,0x27, 0x7,0x38,0x39, 0xf,0x5e,0x70, 0x4,0x2d,0x46, 0x6,0x49,0x57, 0xf,0x5a,0x36, 0x3,0x36,0x40, 0x6,0x38,0x36, 0xf,0x41,0x72, 0x6,0x53,0x3c, 0x5,0x46,0x41, 0xf,0x2b,0x38, 0x6,0x31,0x6d, 0x6,0x40,0x57, 0x6,0x49,0x78, 0x6,0x5d,0x5b, 0x6,0x2c,0x23, 0x5,0x26,0x4a, 0x4,0x32,0x3e, 0x6,0x40,0x58, 0x5,0x3f,0x66, 0x4,0x24,0x47, 0x6,0x28,0x2e, 0xf,0x24,0x51, 0x4,0x26,0x68, 0x3,0x2d,0x35, 0x6,0x38,0x4a, 0x3,0x31,0x5c, 0x4,0x2d,0x5c, 0x6,0x38,0x50, 0x5,0x32,0x7e, 0x3,0x3c,0x3a, 0x6,0x53,0x5e, 0x5,0x3f,0x71, 0x3,0x41,0x6e, 0x6,0x5d,0x68, 0x7,0x23,0x72, 0xf,0x54,0x74, 0x7,0x2e,0x6a, 0x4,0x5f,0x76, 0x7,0x58,0x23, 0x6,0x25,0x23, 0x6,0x4a,0x3f, 0x7,0x23,0x78, 0x7,0x5e,0x72, 0xf,0x48,0x79, 0x6,0x53,0x77, 0x4,0x2d,0x65, 0xf,0x35,0x74, 0x6,0x4a,0x4d, 0x6,0x2c,0x42, 0xf,0x48,0x7b, 0x6,0x25,0x2e, 0xf,0x24,0x5d, 0x6,0x2c,0x5b, 0x6,0x2c,0x51, 0x3,0x2d,0x52, 0x6,0x32,0x39, 0x6,0x32,0x42, 0x4,0x2a,0x25, 0x4,0x2d,0x70, 0x6,0x39,0x2d, 0x6,0x38,0x74, 0x6,0x39,0x21, 0xf,0x30,0x5b, 0x3,0x36,0x75, 0x6,0x4a,0x65, 0x6,0x4a,0x63, 0x4,0x3e,0x33, 0x6,0x54,0x49, 0x6,0x54,0x4f, 0xf,0x42,0x74, 0x6,0x5e,0x3e, 0x7,0x24,0x4f, 0x7,0x24,0x58, 0xf,0x4f,0x69, 0x7,0x2f,0x42, 0xf,0x55,0x56, 0x4,0x56,0x5d, 0x7,0x4e,0x28, 0x7,0x53,0x60, 0x7,0x53,0x58, 0x6,0x2c,0x60, 0x6,0x2c,0x5d, 0x6,0x32,0x48, 0x4,0x38,0x68, 0xf,0x43,0x2f, 0x6,0x54,0x59, 0xf,0x50,0x3d, 0xf,0x55,0x58, 0x5,0x7b,0x7b, 0x3,0x55,0x45, 0x6,0x41,0x61, 0x6,0x41,0x63, 0x6,0x41,0x6a, 0x6,0x5e,0x5e, 0x6,0x32,0x62, 0x6,0x4b,0x42, 0x7,0x47,0x75, 0x6,0x22,0x26, 0xf,0x24,0x78, 0x6,0x2d,0x24, 0xf,0x2c,0x39, 0xf,0x31,0x28, 0x6,0x4b,0x47, 0xf,0x43,0x64, 0x4,0x44,0x6e, 0x7,0x40,0x63, 0xf,0x63,0x24, 0x6,0x42,0x21, 0x3,0x3d,0x3f, 0x6,0x32,0x79, 0x4,0x2a,0x44, 0x5,0x33,0x65, 0x6,0x4b,0x56, 0x4,0x3e,0x6c, 0x6,0x42,0x32, 0xf,0x4a,0x2f, 0x7,0x53,0x7b, 0x6,0x2d,0x3a, 0x5,0x33,0x71, 0xf,0x56,0x3c, 0x6,0x2d,0x45, 0x6,0x2d,0x3d, 0x6,0x33,0x3d, 0x6,0x33,0x31, 0x5,0x2f,0x26, 0xf,0x2c,0x57, 0x6,0x3a,0x2d, 0x6,0x3a,0x2e, 0x6,0x42,0x48, 0x6,0x4b,0x7a, 0xf,0x50,0x5f, 0x7,0x30,0x4a, 0x6,0x25,0x3f, 0x6,0x2d,0x46, 0x3,0x43,0x33, 0x6,0x55,0x6b, 0x7,0x25,0x7b, 0x7,0x39,0x6d, 0xf,0x28,0x3c, 0x6,0x33,0x4a, 0xf,0x3d,0x60, 0x4,0x4b,0x60, 0x7,0x26,0x27, 0x6,0x3a,0x43, 0x6,0x42,0x67, 0x4,0x45,0x5f, 0x4,0x52,0x21, 0x7,0x30,0x66, 0x6,0x5f,0x75, 0x7,0x26,0x3e, 0x7,0x26,0x3c, 0x7,0x30,0x73, 0xf,0x4a,0x7b, 0x6,0x60,0x23, 0xf,0x51,0x23, 0x7,0x26,0x4d, 0x7,0x41,0x3c, 0x5,0x6c,0x7d, 0x7,0x31,0x2d, 0x7,0x3a,0x33, 0x4,0x5c,0x59, 0x7,0x41,0x44, 0x3,0x2e,0x56, 0x6,0x33,0x66, 0x3,0x48,0x6a, 0xf,0x51,0x37, 0x7,0x26,0x6a, 0x7,0x26,0x69, 0x4,0x64,0x26, 0x7,0x62,0x4d, 0x6,0x4c,0x72, 0x7,0x3a,0x46, 0xf,0x3e,0x32, 0x7,0x3a,0x49, 0x7,0x48,0x6d, 0x7,0x5f,0x3c, 0x6,0x4d,0x23, 0xf,0x57,0x27, 0x4,0x2b,0x26, 0x7,0x27,0x28, 0xf,0x57,0x28, 0x6,0x60,0x5d, 0x5,0x48,0x74, 0xf,0x5c,0x2d, 0x6,0x28,0x7b, 0x4,0x27,0x68, 0x6,0x2d,0x69, 0x3,0x33,0x50, 0x5,0x3b,0x50, 0x6,0x4d,0x48, 0xf,0x44,0x68, 0xf,0x4b,0x57, 0xf,0x4b,0x56, 0x4,0x4c,0x56, 0x4,0x58,0x2d, 0x4,0x34,0x57, 0x6,0x4d,0x5e, 0x3,0x44,0x25, 0x6,0x61,0x25, 0x3,0x27,0x2a, 0x6,0x25,0x52, 0x6,0x29,0x27, 0xf,0x28,0x5c, 0x6,0x29,0x28, 0x6,0x2e,0x22, 0x6,0x2e,0x23, 0x6,0x34,0x44, 0x6,0x2e,0x24, 0x6,0x3b,0x52, 0xf,0x32,0x3a, 0x4,0x34,0x73, 0x6,0x44,0x2b, 0x4,0x34,0x74, 0x6,0x43,0x76, 0x6,0x44,0x3b, 0x4,0x3a,0x66, 0x6,0x44,0x3e, 0x6,0x44,0x3c, 0x6,0x44,0x3d, 0x6,0x4e,0x3b, 0x6,0x61,0x3e, 0x6,0x61,0x4f, 0xf,0x51,0x64, 0x4,0x4c,0x79, 0x7,0x27,0x61, 0x7,0x27,0x6d, 0x7,0x32,0x44, 0xf,0x57,0x47, 0x7,0x3a,0x6f, 0xf,0x60,0x5d, 0x7,0x42,0x3c, 0x7,0x54,0x5e, 0x4,0x67,0x2b, 0x6,0x34,0x47, 0x4,0x40,0x4f, 0x7,0x3b,0x38, 0x3,0x5b,0x26, 0x6,0x3b,0x71, 0x4,0x3a,0x75, 0x6,0x4e,0x46, 0x4,0x46,0x7c, 0x4,0x4d,0x33, 0xf,0x52,0x24, 0x7,0x28,0x2e, 0xf,0x51,0x7d, 0x7,0x42,0x60, 0x7,0x42,0x5f, 0x3,0x5b,0x2d, 0x4,0x64,0x3f, 0x4,0x53,0x4c, 0x6,0x25,0x53, 0x5,0x30,0x3e, 0x6,0x58,0x2e, 0x6,0x58,0x2c, 0xf,0x45,0x3d, 0x7,0x3b,0x61, 0xf,0x38,0x4a, 0x5,0x7a,0x38, 0x6,0x3c,0x2d, 0x4,0x35,0x45, 0xf,0x3f,0x3b, 0x6,0x62,0x47, 0x7,0x33,0x4f, 0x7,0x59,0x41, 0x6,0x29,0x2a, 0x6,0x58,0x50, 0x6,0x58,0x5c, 0x3,0x60,0x7c, 0x6,0x3c,0x3b, 0x7,0x33,0x79, 0x7,0x33,0x73, 0xf,0x3f,0x53, 0x3,0x44,0x6d, 0x7,0x29,0x44, 0x6,0x34,0x5d, 0x4,0x30,0x2c, 0x7,0x34,0x31, 0x4,0x54,0x37, 0x7,0x3c,0x61, 0x6,0x25,0x5b, 0x4,0x35,0x72, 0x6,0x59,0x47, 0x6,0x59,0x4a, 0x7,0x3c,0x6b, 0xf,0x45,0x73, 0x6,0x63,0x53, 0x6,0x63,0x4f, 0x4,0x54,0x4a, 0xf,0x66,0x5e, 0x7,0x50,0x6b, 0xf,0x6c,0x3f, 0x6,0x63,0x58, 0x7,0x34,0x7a, 0x7,0x34,0x71, 0xf,0x61,0x4a, 0x6,0x50,0x22, 0x6,0x63,0x6e, 0x7,0x35,0x35, 0x3,0x56,0x78, 0x5,0x5f,0x5e, 0x7,0x3d,0x50, 0xf,0x58,0x78, 0x7,0x4b,0x5f, 0x4,0x65,0x2a, 0x7,0x4b,0x6b, 0x5,0x3d,0x47, 0x5,0x44,0x35, 0x6,0x5a,0x33, 0x6,0x64,0x30, 0x4,0x59,0x76, 0x6,0x64,0x3a, 0x6,0x3c,0x77, 0x6,0x5a,0x3d, 0x4,0x55,0x23, 0x4,0x5e,0x60, 0x6,0x64,0x50, 0x7,0x3e,0x29, 0x7,0x2b,0x55, 0xf,0x59,0x32, 0x7,0x51,0x7a, 0x7,0x5a,0x60, 0x4,0x5a,0x59, 0x7,0x45,0x65, 0x4,0x5f,0x37, 0x4,0x62,0x6e, 0x7,0x52,0x45, 0x5,0x75,0x36, 0x5,0x75,0x35, 0xf,0x6c,0x77, 0x7,0x3e,0x5c, 0x6,0x46,0x3e, 0x4,0x68,0x4f, 0x6,0x5a,0x60, 0x4,0x28,0x34, 0x3,0x5c,0x2f, 0x5,0x53,0x51, 0x7,0x4d,0x28, 0x4,0x48,0x77, 0x7,0x5e,0x4d, }; static const Summary16 cns11643_inv_uni2indx_page00[16] = { /* 0x0000 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0080 }, { 1, 0x0083 }, { 4, 0x0000 }, { 4, 0x0080 }, { 5, 0x0000 }, { 5, 0x0080 }, }; static const Summary16 cns11643_inv_uni2indx_page02[29] = { /* 0x0200 */ { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0e80 }, { 10, 0x0200 }, { 11, 0x0000 }, { 11, 0x0000 }, /* 0x0300 */ { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0xfffe }, { 26, 0x03fb }, { 35, 0xfffe }, { 50, 0x03fb }, }; static const Summary16 cns11643_inv_uni2indx_page20[44] = { /* 0x2000 */ { 59, 0x0000 }, { 59, 0x3358 }, { 66, 0x0060 }, { 68, 0x4824 }, { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x1000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, /* 0x2100 */ { 73, 0x0228 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x03ff }, { 86, 0x03ff }, { 96, 0x0000 }, { 96, 0x03cf }, { 104, 0x0000 }, { 104, 0x0000 }, { 104, 0x0000 }, { 104, 0x0000 }, { 104, 0x0000 }, { 104, 0x0000 }, /* 0x2200 */ { 104, 0x0000 }, { 104, 0xc420 }, { 108, 0x4e01 }, { 113, 0x1030 }, { 116, 0x0000 }, { 116, 0x0004 }, { 117, 0x00c3 }, { 121, 0x0000 }, { 121, 0x0000 }, { 121, 0x0000 }, { 121, 0x0020 }, { 122, 0x8000 }, }; static const Summary16 cns11643_inv_uni2indx_page24[37] = { /* 0x2400 */ { 123, 0xffff }, { 139, 0xffff }, { 155, 0x0002 }, { 156, 0x0000 }, { 156, 0x0000 }, { 156, 0x0000 }, { 156, 0x03ff }, { 166, 0x3ff0 }, { 176, 0x0000 }, { 176, 0x0000 }, { 176, 0x0000 }, { 176, 0x0000 }, { 176, 0x0000 }, { 176, 0x0000 }, { 176, 0x0000 }, { 176, 0x0000 }, /* 0x2500 */ { 176, 0x1005 }, { 179, 0x1111 }, { 183, 0x1010 }, { 185, 0x1010 }, { 187, 0x0000 }, { 187, 0x4001 }, { 189, 0xe402 }, { 194, 0x000f }, { 198, 0xfffe }, { 213, 0x0030 }, { 215, 0x0003 }, { 217, 0x300c }, { 221, 0xc8c0 }, { 226, 0x0000 }, { 226, 0x003c }, { 230, 0x0000 }, /* 0x2600 */ { 230, 0x0260 }, { 233, 0x0000 }, { 233, 0x0000 }, { 233, 0x0000 }, { 233, 0x0007 }, }; static const Summary16 cns11643_inv_uni2indx_page30[1787] = { /* 0x3000 */ { 236, 0xff0f }, { 248, 0x6037 }, { 255, 0x03fe }, { 264, 0x0000 }, { 264, 0x0000 }, { 264, 0x0000 }, { 264, 0x0000 }, { 264, 0x0000 }, { 264, 0x0000 }, { 264, 0x0000 }, { 264, 0x0000 }, { 264, 0x0000 }, { 264, 0x0000 }, { 264, 0x0000 }, { 264, 0x0000 }, { 264, 0x0800 }, /* 0x3100 */ { 265, 0xffe0 }, { 276, 0xffff }, { 292, 0x03ff }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, /* 0x3200 */ { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0008 }, { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, /* 0x3300 */ { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0xc000 }, { 305, 0x7000 }, { 308, 0x0002 }, { 309, 0x0000 }, { 309, 0x4010 }, { 311, 0x0026 }, { 314, 0x0000 }, { 314, 0x0000 }, /* 0x3400 */ { 314, 0x1073 }, { 320, 0x1040 }, { 322, 0x7b12 }, { 330, 0x5f5f }, { 342, 0xfe3e }, { 354, 0xff8b }, { 366, 0xc0f8 }, { 373, 0xfefb }, { 387, 0x7fff }, { 402, 0xfefe }, { 416, 0xbff3 }, { 429, 0xfffd }, { 444, 0xdfbc }, { 456, 0xfdfb }, { 470, 0xf39f }, { 482, 0x7ffe }, /* 0x3500 */ { 496, 0xfcff }, { 510, 0x77af }, { 522, 0xf7ff }, { 537, 0xffff }, { 553, 0xffff }, { 569, 0xdff7 }, { 583, 0xfeff }, { 598, 0x1fef }, { 610, 0x81ff }, { 620, 0x81ff }, { 630, 0x0fff }, { 642, 0xfff0 }, { 654, 0x3fff }, { 668, 0x1ff9 }, { 679, 0x3ffc }, { 691, 0xf87f }, /* 0x3600 */ { 703, 0x3fe7 }, { 715, 0xfe7b }, { 728, 0xbfff }, { 743, 0x8fdf }, { 755, 0xefbf }, { 769, 0x7e2f }, { 780, 0xffbf }, { 795, 0x5fff }, { 809, 0xfebf }, { 823, 0xf5fd }, { 836, 0x7fff }, { 851, 0xffff }, { 867, 0xe63e }, { 877, 0x7fff }, { 892, 0xffe6 }, { 905, 0x7fff }, /* 0x3700 */ { 920, 0xfffe }, { 935, 0x7fef }, { 949, 0xdfff }, { 964, 0xffff }, { 980, 0xf5bf }, { 993, 0xfbff }, { 1008, 0xfefd }, { 1022, 0xfff7 }, { 1037, 0x9fff }, { 1051, 0x9fff }, { 1065, 0xbffe }, { 1079, 0xfeff }, { 1094, 0xffbb }, { 1108, 0xffdf }, { 1123, 0xbfe5 }, { 1135, 0xff7f }, /* 0x3800 */ { 1150, 0xfff7 }, { 1165, 0x3fff }, { 1179, 0xe7e7 }, { 1191, 0xfff6 }, { 1205, 0xdfff }, { 1220, 0xffff }, { 1236, 0xefed }, { 1249, 0xffff }, { 1265, 0xff7f }, { 1280, 0xffff }, { 1296, 0xd7eb }, { 1308, 0x7d7d }, { 1320, 0xfbff }, { 1335, 0xff1f }, { 1348, 0xb87d }, { 1358, 0xfce7 }, /* 0x3900 */ { 1370, 0xfffe }, { 1385, 0xfeff }, { 1400, 0xd7ff }, { 1414, 0xcfff }, { 1428, 0xffff }, { 1444, 0xfc7f }, { 1457, 0xfbff }, { 1472, 0xf7ff }, { 1487, 0xfeff }, { 1502, 0xfdff }, { 1517, 0xffff }, { 1533, 0xfff5 }, { 1547, 0x7fff }, { 1562, 0x47fc }, { 1572, 0xfffe }, { 1587, 0xfffe }, /* 0x3a00 */ { 1602, 0xffff }, { 1618, 0xfeff }, { 1633, 0xe7ff }, { 1647, 0xffff }, { 1663, 0x7ff9 }, { 1676, 0x7ffd }, { 1690, 0xbfff }, { 1705, 0xfeff }, { 1720, 0xfbb7 }, { 1733, 0xf46e }, { 1743, 0xfb7f }, { 1757, 0xdff3 }, { 1770, 0xec3f }, { 1781, 0xffbf }, { 1796, 0xdef3 }, { 1808, 0x3fff }, /* 0x3b00 */ { 1822, 0xfffe }, { 1837, 0x7fbd }, { 1850, 0xfeef }, { 1864, 0x9b7f }, { 1876, 0x1f9e }, { 1886, 0xff3e }, { 1899, 0xff07 }, { 1910, 0xff07 }, { 1921, 0xf9ff }, { 1935, 0xffff }, { 1951, 0xfffa }, { 1965, 0x97ff }, { 1978, 0xffff }, { 1994, 0xfff9 }, { 2008, 0xfc7f }, { 2021, 0xcfff }, /* 0x3c00 */ { 2035, 0xffff }, { 2051, 0xeff7 }, { 2065, 0xffff }, { 2081, 0xfeff }, { 2096, 0xffff }, { 2112, 0xdff4 }, { 2124, 0xbdff }, { 2138, 0xff7f }, { 2153, 0xffff }, { 2169, 0xfffe }, { 2184, 0xbdff }, { 2198, 0x7fff }, { 2213, 0xfdff }, { 2228, 0xffcf }, { 2242, 0x7ff0 }, { 2253, 0xfff8 }, /* 0x3d00 */ { 2266, 0xc7ff }, { 2279, 0x7fff }, { 2294, 0xffe3 }, { 2307, 0xf9ff }, { 2321, 0xfc7f }, { 2334, 0xe3ff }, { 2347, 0xffff }, { 2363, 0xefff }, { 2378, 0xf1f3 }, { 2389, 0xddfe }, { 2402, 0xfffb }, { 2417, 0xde3d }, { 2428, 0xefff }, { 2443, 0x8fff }, { 2456, 0xf97f }, { 2469, 0xdbf9 }, /* 0x3e00 */ { 2481, 0xff3f }, { 2495, 0xffff }, { 2511, 0xffff }, { 2527, 0x7fef }, { 2541, 0xfeff }, { 2556, 0xffff }, { 2572, 0xf8ff }, { 2585, 0xfffe }, { 2600, 0xdfbf }, { 2614, 0xfdff }, { 2629, 0x7ffb }, { 2643, 0xa7bf }, { 2655, 0x7f9f }, { 2668, 0xe6fe }, { 2680, 0xf98f }, { 2691, 0xffe7 }, /* 0x3f00 */ { 2705, 0xfef6 }, { 2718, 0xffff }, { 2734, 0xffff }, { 2750, 0xffff }, { 2766, 0x7fdf }, { 2780, 0xffef }, { 2795, 0xffff }, { 2811, 0xefb7 }, { 2824, 0xffff }, { 2840, 0xffff }, { 2856, 0xffff }, { 2872, 0xffc1 }, { 2883, 0xfffe }, { 2898, 0xffee }, { 2912, 0xfffe }, { 2927, 0xffff }, /* 0x4000 */ { 2943, 0xefff }, { 2958, 0xdfff }, { 2973, 0xff9f }, { 2987, 0xffff }, { 3003, 0xfffe }, { 3018, 0xffbf }, { 3033, 0xfbfd }, { 3047, 0xffff }, { 3063, 0xf7ff }, { 3078, 0xffff }, { 3094, 0xfeff }, { 3109, 0xffdf }, { 3124, 0xff87 }, { 3136, 0x7ffe }, { 3150, 0x7eff }, { 3164, 0xefff }, /* 0x4100 */ { 3179, 0xfbff }, { 3194, 0xbf3f }, { 3207, 0xfff7 }, { 3222, 0xfdcf }, { 3235, 0xfdff }, { 3250, 0x7fff }, { 3265, 0xf3ff }, { 3279, 0xffff }, { 3295, 0xef3f }, { 3308, 0xffff }, { 3324, 0xbfff }, { 3339, 0xffef }, { 3354, 0xfbef }, { 3368, 0xffff }, { 3384, 0xffff }, { 3400, 0x7fe7 }, /* 0x4200 */ { 3413, 0xffff }, { 3429, 0xffff }, { 3445, 0xfcff }, { 3459, 0xffff }, { 3475, 0xff7f }, { 3490, 0xffff }, { 3506, 0xffef }, { 3521, 0xffff }, { 3537, 0xefff }, { 3552, 0xffff }, { 3568, 0xfffb }, { 3583, 0xffff }, { 3599, 0xff1f }, { 3612, 0xdfff }, { 3627, 0xffff }, { 3643, 0xffff }, /* 0x4300 */ { 3659, 0xf7ff }, { 3674, 0xffff }, { 3690, 0xffff }, { 3706, 0x003f }, { 3712, 0xfffc }, { 3726, 0xffff }, { 3742, 0xfffe }, { 3757, 0xffff }, { 3773, 0xffff }, { 3789, 0xb7ff }, { 3803, 0xefdf }, { 3817, 0xffff }, { 3833, 0xffff }, { 3849, 0xdfff }, { 3864, 0x9fff }, { 3878, 0xffff }, /* 0x4400 */ { 3894, 0xffbf }, { 3909, 0xffff }, { 3925, 0xfbff }, { 3940, 0xffff }, { 3956, 0xffff }, { 3972, 0xffbf }, { 3987, 0xbdff }, { 4001, 0xbe7f }, { 4014, 0xff7f }, { 4029, 0xfdfd }, { 4043, 0x3fff }, { 4057, 0x3fff }, { 4071, 0xfffe }, { 4086, 0xff8f }, { 4099, 0xe4ff }, { 4111, 0xf7ff }, /* 0x4500 */ { 4126, 0xffff }, { 4142, 0xffff }, { 4158, 0xffff }, { 4174, 0xffff }, { 4190, 0xfffb }, { 4205, 0xfffe }, { 4220, 0xfff7 }, { 4235, 0xffbf }, { 4250, 0xffff }, { 4266, 0xffff }, { 4282, 0xefff }, { 4297, 0xbfff }, { 4312, 0xffff }, { 4328, 0xffbf }, { 4343, 0xdfff }, { 4358, 0xf7f7 }, /* 0x4600 */ { 4372, 0xffff }, { 4388, 0xb7ff }, { 4402, 0xffff }, { 4418, 0xfffb }, { 4433, 0xc3ff }, { 4445, 0xfff7 }, { 4460, 0xf7ff }, { 4475, 0xf7bf }, { 4489, 0xffff }, { 4505, 0xffdf }, { 4520, 0xefef }, { 4534, 0xffff }, { 4550, 0xffff }, { 4566, 0xfff7 }, { 4581, 0xffff }, { 4597, 0xffff }, /* 0x4700 */ { 4613, 0xffff }, { 4629, 0xffff }, { 4645, 0xfc07 }, { 4654, 0xfff7 }, { 4669, 0xffff }, { 4685, 0xf5ff }, { 4699, 0xffff }, { 4715, 0xefff }, { 4730, 0x0fff }, { 4742, 0xfffe }, { 4757, 0xffff }, { 4773, 0xfffb }, { 4788, 0xffff }, { 4804, 0xffff }, { 4820, 0xffff }, { 4836, 0xfffb }, /* 0x4800 */ { 4851, 0xefff }, { 4866, 0xffbf }, { 4881, 0xffff }, { 4897, 0xfbff }, { 4912, 0xffff }, { 4928, 0xffff }, { 4944, 0xffff }, { 4960, 0xf7fd }, { 4974, 0x7ff8 }, { 4986, 0xfe7f }, { 5000, 0xfff7 }, { 5015, 0xfbff }, { 5030, 0xfdff }, { 5045, 0xfffb }, { 5060, 0xffbf }, { 5075, 0xfff7 }, /* 0x4900 */ { 5090, 0xfffe }, { 5105, 0xffff }, { 5121, 0xfdf7 }, { 5135, 0xfffb }, { 5150, 0xff7f }, { 5165, 0xefff }, { 5180, 0xffff }, { 5196, 0x01ff }, { 5205, 0xff80 }, { 5214, 0xf7ff }, { 5229, 0xfdff }, { 5244, 0x3e3e }, { 5254, 0x7efe }, { 5267, 0xffff }, { 5283, 0xd5ff }, { 5296, 0xffff }, /* 0x4a00 */ { 5312, 0xffff }, { 5328, 0xfbff }, { 5343, 0xffff }, { 5359, 0xffff }, { 5375, 0xbfef }, { 5389, 0xffff }, { 5405, 0xffff }, { 5421, 0xffff }, { 5437, 0xffff }, { 5453, 0x7fff }, { 5468, 0xfbff }, { 5483, 0xffff }, { 5499, 0xffff }, { 5515, 0xffff }, { 5531, 0xffff }, { 5547, 0xffff }, /* 0x4b00 */ { 5563, 0xffff }, { 5579, 0xffff }, { 5595, 0xffff }, { 5611, 0xffff }, { 5627, 0x7fff }, { 5642, 0xefff }, { 5657, 0xfbff }, { 5672, 0xffff }, { 5688, 0xffff }, { 5704, 0xffff }, { 5720, 0xffff }, { 5736, 0xffff }, { 5752, 0xffc7 }, { 5765, 0xffff }, { 5781, 0xfdff }, { 5796, 0xf7ff }, /* 0x4c00 */ { 5811, 0xff7f }, { 5826, 0xffff }, { 5842, 0xbfff }, { 5857, 0xffb7 }, { 5871, 0xffff }, { 5887, 0xffff }, { 5903, 0xfbff }, { 5918, 0xffef }, { 5933, 0xff7f }, { 5948, 0x1eff }, { 5960, 0xffe0 }, { 5971, 0xffbf }, { 5986, 0xffff }, { 6002, 0xffff }, { 6018, 0xffff }, { 6034, 0xfdff }, /* 0x4d00 */ { 6049, 0xffff }, { 6065, 0xfc07 }, { 6074, 0xfeff }, { 6089, 0xffff }, { 6105, 0xffff }, { 6121, 0xffff }, { 6137, 0xffff }, { 6153, 0xffff }, { 6169, 0xffff }, { 6185, 0xffff }, { 6201, 0x9fff }, { 6215, 0x003b }, { 6220, 0x0000 }, { 6220, 0x0000 }, { 6220, 0x0000 }, { 6220, 0x0000 }, /* 0x4e00 */ { 6220, 0xffbf }, { 6235, 0xc3f7 }, { 6246, 0xef5f }, { 6259, 0xbb6f }, { 6271, 0xebef }, { 6284, 0xf7de }, { 6297, 0x070c }, { 6302, 0xc23a }, { 6309, 0xfbff }, { 6324, 0xfbfe }, { 6338, 0xf97f }, { 6351, 0x56df }, { 6362, 0xffff }, { 6378, 0xfff1 }, { 6391, 0xc3ff }, { 6403, 0xffff }, /* 0x4f00 */ { 6419, 0xffff }, { 6435, 0x3fff }, { 6449, 0xf304 }, { 6456, 0xffff }, { 6472, 0xffff }, { 6488, 0xffff }, { 6504, 0xffdf }, { 6519, 0xffff }, { 6535, 0xffff }, { 6551, 0xffff }, { 6567, 0xc80f }, { 6574, 0xffff }, { 6590, 0xffff }, { 6606, 0xffff }, { 6622, 0xd2bf }, { 6633, 0xffff }, /* 0x5000 */ { 6649, 0xffff }, { 6665, 0xffff }, { 6681, 0xffff }, { 6697, 0x93ff }, { 6709, 0xffff }, { 6725, 0xffff }, { 6741, 0xffff }, { 6757, 0x3fff }, { 6771, 0xffff }, { 6787, 0xffff }, { 6803, 0xfc4f }, { 6814, 0xffff }, { 6830, 0xffff }, { 6846, 0xffff }, { 6862, 0xffff }, { 6878, 0xfffb }, /* 0x5100 */ { 6893, 0xffff }, { 6909, 0xffff }, { 6925, 0xffff }, { 6941, 0xffff }, { 6957, 0xffff }, { 6973, 0xffff }, { 6989, 0x7fff }, { 7004, 0xd3ee }, { 7015, 0xfffd }, { 7030, 0xe3ff }, { 7043, 0x3f7f }, { 7056, 0xf7ff }, { 7071, 0xffff }, { 7087, 0xffff }, { 7103, 0x753f }, { 7114, 0x67ff }, /* 0x5200 */ { 7127, 0xdfff }, { 7142, 0xf1ff }, { 7155, 0xcfff }, { 7169, 0x7fff }, { 7184, 0xfffa }, { 7198, 0xfffc }, { 7212, 0xffff }, { 7228, 0xfffd }, { 7243, 0x7fff }, { 7258, 0xffff }, { 7274, 0xfff9 }, { 7288, 0xfffb }, { 7303, 0xf7ff }, { 7318, 0xfbff }, { 7333, 0xffff }, { 7349, 0xffff }, /* 0x5300 */ { 7365, 0xfffb }, { 7380, 0xffff }, { 7396, 0xbfbf }, { 7410, 0xffff }, { 7426, 0xffff }, { 7442, 0xffbf }, { 7457, 0xf7fb }, { 7471, 0xffff }, { 7487, 0xcfdd }, { 7499, 0xffdc }, { 7512, 0xfff3 }, { 7526, 0x6fff }, { 7540, 0xff3f }, { 7554, 0xfefd }, { 7568, 0xffff }, { 7584, 0xbfff }, /* 0x5400 */ { 7599, 0xffff }, { 7615, 0xff6f }, { 7629, 0xffff }, { 7645, 0xffff }, { 7661, 0xffff }, { 7677, 0xe413 }, { 7684, 0xffff }, { 7700, 0xffff }, { 7716, 0xffff }, { 7732, 0xd57f }, { 7744, 0xffff }, { 7760, 0xffff }, { 7776, 0xffff }, { 7792, 0x4441 }, { 7796, 0xffff }, { 7812, 0xffff }, /* 0x5500 */ { 7828, 0xffff }, { 7844, 0x0fff }, { 7856, 0xffc3 }, { 7868, 0xffff }, { 7884, 0xffff }, { 7900, 0xffff }, { 7916, 0x0d7f }, { 7926, 0xfcee }, { 7938, 0xffff }, { 7954, 0xffff }, { 7970, 0xffff }, { 7986, 0x8c7f }, { 7996, 0xffff }, { 8012, 0xffff }, { 8028, 0xc7ff }, { 8041, 0xffd7 }, /* 0x5600 */ { 8055, 0xffff }, { 8071, 0xfbff }, { 8086, 0xffc5 }, { 8098, 0xffff }, { 8114, 0xffff }, { 8130, 0xc7ff }, { 8143, 0xffff }, { 8159, 0xefff }, { 8174, 0xffff }, { 8190, 0xffff }, { 8206, 0xffe1 }, { 8218, 0xffff }, { 8234, 0xbfff }, { 8249, 0xff9f }, { 8263, 0xfffb }, { 8278, 0xbfcf }, /* 0x5700 */ { 8291, 0xffbf }, { 8306, 0xfdff }, { 8321, 0xffbf }, { 8336, 0xf87f }, { 8348, 0xffff }, { 8364, 0x8bff }, { 8376, 0xfffe }, { 8391, 0xffff }, { 8407, 0xfd8f }, { 8419, 0xffff }, { 8435, 0x5fff }, { 8449, 0xfff0 }, { 8461, 0xffff }, { 8477, 0xf8bf }, { 8489, 0xffff }, { 8505, 0xffff }, /* 0x5800 */ { 8521, 0xffff }, { 8537, 0xff9d }, { 8550, 0xffff }, { 8566, 0xffff }, { 8582, 0xffbd }, { 8596, 0xffff }, { 8612, 0xbfff }, { 8627, 0xfffe }, { 8642, 0xffff }, { 8658, 0xfdff }, { 8673, 0xffff }, { 8689, 0xfcbf }, { 8702, 0xe7ff }, { 8716, 0xff7f }, { 8731, 0xdbdf }, { 8744, 0xfebf }, /* 0x5900 */ { 8758, 0xff7f }, { 8773, 0xbfff }, { 8788, 0xffff }, { 8804, 0xf1ff }, { 8817, 0xfff9 }, { 8831, 0xffbf }, { 8846, 0xffff }, { 8862, 0xffff }, { 8878, 0xfe7f }, { 8892, 0xffff }, { 8908, 0xf1ff }, { 8921, 0xffff }, { 8937, 0xffff }, { 8953, 0xffff }, { 8969, 0xffff }, { 8985, 0xffff }, /* 0x5a00 */ { 9001, 0xfe1f }, { 9013, 0xffff }, { 9029, 0xffff }, { 9045, 0xffeb }, { 9059, 0xffff }, { 9075, 0xffff }, { 9091, 0xffff }, { 9107, 0xffaf }, { 9121, 0xffff }, { 9137, 0xffff }, { 9153, 0xdfff }, { 9168, 0xffff }, { 9184, 0xffff }, { 9200, 0xffeb }, { 9214, 0xffff }, { 9230, 0xfff9 }, /* 0x5b00 */ { 9244, 0xffff }, { 9260, 0xffff }, { 9276, 0xffff }, { 9292, 0xffbf }, { 9307, 0xffff }, { 9323, 0xbdff }, { 9337, 0xdfff }, { 9352, 0xffff }, { 9368, 0xffff }, { 9384, 0xfffd }, { 9399, 0xfbfc }, { 9412, 0xdfff }, { 9427, 0xfdff }, { 9442, 0xffff }, { 9458, 0xffff }, { 9474, 0xe7ff }, /* 0x5c00 */ { 9488, 0xfffb }, { 9503, 0xcfff }, { 9517, 0xbf3f }, { 9530, 0xffeb }, { 9544, 0xfff3 }, { 9558, 0xffff }, { 9574, 0xffbf }, { 9589, 0x7fbb }, { 9602, 0xfff3 }, { 9616, 0xf2bf }, { 9628, 0xffff }, { 9644, 0x0fff }, { 9656, 0xffc3 }, { 9668, 0xffff }, { 9684, 0xff66 }, { 9696, 0xffff }, /* 0x5d00 */ { 9712, 0xffc3 }, { 9724, 0xffff }, { 9740, 0xdfff }, { 9755, 0xffff }, { 9771, 0xffff }, { 9787, 0xcaff }, { 9799, 0xffff }, { 9815, 0xffbf }, { 9830, 0xffff }, { 9846, 0xffff }, { 9862, 0xffff }, { 9878, 0xffff }, { 9894, 0xffdf }, { 9909, 0xffff }, { 9925, 0x4bff }, { 9937, 0xefff }, /* 0x5e00 */ { 9952, 0x7fdf }, { 9966, 0xeffe }, { 9980, 0xff3f }, { 9994, 0xe7fd }, { 10007, 0xfdff }, { 10022, 0xffff }, { 10038, 0xffff }, { 10054, 0xffff }, { 10070, 0xffbf }, { 10085, 0x3fe5 }, { 10096, 0xffff }, { 10112, 0xefff }, { 10127, 0xffff }, { 10143, 0xffff }, { 10159, 0xffef }, { 10174, 0xffff }, /* 0x5f00 */ { 10190, 0xfdff }, { 10205, 0xffbf }, { 10220, 0xfbfe }, { 10234, 0xffff }, { 10250, 0xffdf }, { 10265, 0x7fff }, { 10280, 0xfeff }, { 10295, 0xf7ff }, { 10310, 0xffff }, { 10326, 0xffdf }, { 10341, 0xffff }, { 10357, 0xffff }, { 10373, 0xffbf }, { 10388, 0xffff }, { 10404, 0xffff }, { 10420, 0xffff }, /* 0x6000 */ { 10436, 0xff81 }, { 10446, 0xffff }, { 10462, 0xffff }, { 10478, 0x23ff }, { 10489, 0xffff }, { 10505, 0xffff }, { 10521, 0xffff }, { 10537, 0xd03f }, { 10546, 0xffff }, { 10562, 0xffff }, { 10578, 0x47ff }, { 10590, 0xffff }, { 10606, 0xffff }, { 10622, 0xffff }, { 10638, 0x47ff }, { 10650, 0xffff }, /* 0x6100 */ { 10666, 0xffff }, { 10682, 0xffff }, { 10698, 0xffaf }, { 10712, 0xffff }, { 10728, 0xffff }, { 10744, 0xfffd }, { 10759, 0xffff }, { 10775, 0xffff }, { 10791, 0xffff }, { 10807, 0xffff }, { 10823, 0xffff }, { 10839, 0xffff }, { 10855, 0xffff }, { 10871, 0xffe9 }, { 10884, 0xffff }, { 10900, 0xffef }, /* 0x6200 */ { 10915, 0xf7bf }, { 10929, 0xff7f }, { 10944, 0xffff }, { 10960, 0xffff }, { 10976, 0xffef }, { 10991, 0xff9f }, { 11005, 0xe1ff }, { 11017, 0xffff }, { 11033, 0xffff }, { 11049, 0x7fff }, { 11064, 0xfff8 }, { 11077, 0xffff }, { 11093, 0xffff }, { 11109, 0xffff }, { 11125, 0xfc13 }, { 11134, 0xffff }, /* 0x6300 */ { 11150, 0xffff }, { 11166, 0x8aff }, { 11177, 0xff0a }, { 11187, 0xffff }, { 11203, 0xffff }, { 11219, 0x3fff }, { 11233, 0xfff1 }, { 11246, 0xffff }, { 11262, 0xffff }, { 11278, 0xffff }, { 11294, 0xffff }, { 11310, 0xe447 }, { 11318, 0xffff }, { 11334, 0xffff }, { 11350, 0xffff }, { 11366, 0x47ff }, /* 0x6400 */ { 11378, 0xffc8 }, { 11389, 0xffff }, { 11405, 0xffff }, { 11421, 0xffff }, { 11437, 0xfacb }, { 11448, 0xffff }, { 11464, 0xffff }, { 11480, 0xffff }, { 11496, 0xffef }, { 11511, 0xffff }, { 11527, 0xffff }, { 11543, 0xfa5f }, { 11555, 0xffff }, { 11571, 0x9fff }, { 11585, 0xffff }, { 11601, 0xffff }, /* 0x6500 */ { 11617, 0xffff }, { 11633, 0xfffb }, { 11648, 0xffff }, { 11664, 0xffff }, { 11680, 0xffff }, { 11696, 0xf7ff }, { 11711, 0xfdff }, { 11726, 0x9fff }, { 11740, 0x7fbf }, { 11754, 0xfff7 }, { 11769, 0xfdff }, { 11784, 0xffff }, { 11800, 0xfffe }, { 11815, 0xffdf }, { 11830, 0xffff }, { 11846, 0xfe7f }, /* 0x6600 */ { 11860, 0xffff }, { 11876, 0xffff }, { 11892, 0xffff }, { 11908, 0x1fff }, { 11921, 0xffff }, { 11937, 0xff87 }, { 11949, 0xffff }, { 11965, 0xffff }, { 11981, 0xfff3 }, { 11995, 0xffff }, { 12011, 0xff7f }, { 12026, 0xffff }, { 12042, 0xffff }, { 12058, 0xffff }, { 12074, 0xffff }, { 12090, 0xd7ff }, /* 0x6700 */ { 12104, 0xffff }, { 12120, 0xffff }, { 12136, 0xfdff }, { 12151, 0xfffe }, { 12166, 0xfff5 }, { 12180, 0xffff }, { 12196, 0xfc67 }, { 12207, 0xffff }, { 12223, 0xffff }, { 12239, 0xffff }, { 12255, 0xd05e }, { 12263, 0xffff }, { 12279, 0xffff }, { 12295, 0xffff }, { 12311, 0xffff }, { 12327, 0xdfff }, /* 0x6800 */ { 12342, 0x0073 }, { 12347, 0xffff }, { 12363, 0xffff }, { 12379, 0xffff }, { 12395, 0xffff }, { 12411, 0x47ff }, { 12423, 0xf800 }, { 12428, 0xffff }, { 12444, 0xdfff }, { 12459, 0xffff }, { 12475, 0xffff }, { 12491, 0x23ff }, { 12502, 0xfffa }, { 12516, 0xffff }, { 12532, 0xffff }, { 12548, 0xffff }, /* 0x6900 */ { 12564, 0xffff }, { 12580, 0x59ff }, { 12592, 0xdea0 }, { 12600, 0xffff }, { 12616, 0xffff }, { 12632, 0xffff }, { 12648, 0xffff }, { 12664, 0xbfff }, { 12679, 0xf46d }, { 12689, 0xffff }, { 12705, 0xffff }, { 12721, 0xffff }, { 12737, 0xffff }, { 12753, 0x03ff }, { 12763, 0xfffe }, { 12778, 0xffff }, /* 0x6a00 */ { 12794, 0xffff }, { 12810, 0xffff }, { 12826, 0x3fff }, { 12840, 0xfffc }, { 12854, 0xffff }, { 12870, 0xffff }, { 12886, 0xffff }, { 12902, 0xe5c7 }, { 12912, 0xffff }, { 12928, 0xffff }, { 12944, 0xfdff }, { 12959, 0xffff }, { 12975, 0xfdff }, { 12990, 0xffff }, { 13006, 0xffef }, { 13021, 0xff7f }, /* 0x6b00 */ { 13036, 0xffdf }, { 13051, 0x7fff }, { 13066, 0xffff }, { 13082, 0xffff }, { 13098, 0xffff }, { 13114, 0xffff }, { 13130, 0xffff }, { 13146, 0xefff }, { 13161, 0xff7f }, { 13176, 0xfbf3 }, { 13189, 0xffff }, { 13205, 0xfffd }, { 13220, 0xfffb }, { 13235, 0x7ddf }, { 13248, 0xbfff }, { 13263, 0xffff }, /* 0x6c00 */ { 13279, 0xbf7f }, { 13293, 0xff7f }, { 13308, 0xfdfb }, { 13322, 0xdbdf }, { 13335, 0xfe7f }, { 13349, 0xffff }, { 13365, 0xffef }, { 13380, 0xffff }, { 13396, 0xffff }, { 13412, 0xffff }, { 13428, 0xfc0f }, { 13438, 0xffff }, { 13454, 0xffff }, { 13470, 0xffff }, { 13486, 0xffff }, { 13502, 0x823f }, /* 0x6d00 */ { 13510, 0xffff }, { 13526, 0xffff }, { 13542, 0xffff }, { 13558, 0xffff }, { 13574, 0x003f }, { 13580, 0xffc0 }, { 13590, 0xffff }, { 13606, 0xffff }, { 13622, 0xffff }, { 13638, 0x0fff }, { 13650, 0xfc20 }, { 13657, 0xffff }, { 13673, 0xffff }, { 13689, 0xffff }, { 13705, 0xffff }, { 13721, 0xffff }, /* 0x6e00 */ { 13737, 0x9fff }, { 13751, 0xffa4 }, { 13762, 0xffff }, { 13778, 0xffff }, { 13794, 0xffff }, { 13810, 0xffff }, { 13826, 0xffff }, { 13842, 0x7fff }, { 13857, 0xef55 }, { 13868, 0xffff }, { 13884, 0xffff }, { 13900, 0xffff }, { 13916, 0xffff }, { 13932, 0x3fff }, { 13946, 0xfb48 }, { 13955, 0xffff }, /* 0x6f00 */ { 13971, 0xffff }, { 13987, 0xffff }, { 14003, 0xffff }, { 14019, 0xffff }, { 14035, 0xd77f }, { 14048, 0xffff }, { 14064, 0xffff }, { 14080, 0xffff }, { 14096, 0xffff }, { 14112, 0xe7ff }, { 14126, 0xffff }, { 14142, 0xffff }, { 14158, 0xffff }, { 14174, 0xfff9 }, { 14188, 0xffff }, { 14204, 0xfdff }, /* 0x7000 */ { 14219, 0xffff }, { 14235, 0xffff }, { 14251, 0xffff }, { 14267, 0xffff }, { 14283, 0x3fff }, { 14297, 0xfffe }, { 14312, 0xdfff }, { 14327, 0xffff }, { 14343, 0xfffe }, { 14358, 0x8fff }, { 14371, 0xffff }, { 14387, 0xcfff }, { 14401, 0xfff1 }, { 14414, 0xffff }, { 14430, 0xc43f }, { 14439, 0xffff }, /* 0x7100 */ { 14455, 0xffff }, { 14471, 0xfe8f }, { 14483, 0xffff }, { 14499, 0xafff }, { 14513, 0xfffe }, { 14528, 0xffdf }, { 14543, 0xffff }, { 14559, 0xfff7 }, { 14574, 0xffff }, { 14590, 0xffff }, { 14606, 0xffff }, { 14622, 0xffff }, { 14638, 0xffff }, { 14654, 0xffff }, { 14670, 0xffff }, { 14686, 0xff3f }, /* 0x7200 */ { 14700, 0xffff }, { 14716, 0xffff }, { 14732, 0xffff }, { 14748, 0xff75 }, { 14761, 0xdfff }, { 14776, 0xefff }, { 14791, 0xffff }, { 14807, 0xffdf }, { 14822, 0xfbff }, { 14837, 0xffff }, { 14853, 0xfffe }, { 14868, 0xfe7f }, { 14882, 0xfeff }, { 14897, 0xbfff }, { 14912, 0x3fff }, { 14926, 0xfff8 }, /* 0x7300 */ { 14939, 0xfff7 }, { 14954, 0x7fff }, { 14969, 0xfffc }, { 14983, 0xfdff }, { 14998, 0xffff }, { 15014, 0xffff }, { 15030, 0xdfe7 }, { 15043, 0xffff }, { 15059, 0xffff }, { 15075, 0xf1ff }, { 15088, 0xbfff }, { 15103, 0xfffc }, { 15117, 0xffff }, { 15133, 0xfffd }, { 15148, 0xffff }, { 15164, 0xfff8 }, /* 0x7400 */ { 15177, 0x3fff }, { 15191, 0xfffc }, { 15205, 0xffff }, { 15221, 0xff7f }, { 15236, 0xffff }, { 15252, 0xffff }, { 15268, 0xffff }, { 15284, 0xff7f }, { 15299, 0xbfff }, { 15314, 0xffff }, { 15330, 0xffff }, { 15346, 0xffff }, { 15362, 0xffff }, { 15378, 0xfffb }, { 15393, 0xff7f }, { 15408, 0xeff8 }, /* 0x7500 */ { 15420, 0xffdf }, { 15435, 0xfdff }, { 15450, 0xffff }, { 15466, 0xefcf }, { 15479, 0xffdf }, { 15494, 0xfffb }, { 15509, 0xfdfe }, { 15523, 0xffe7 }, { 15537, 0xdffb }, { 15551, 0x7f3f }, { 15564, 0x0ffc }, { 15574, 0xffff }, { 15590, 0xfcff }, { 15604, 0xffbf }, { 15619, 0xf0ff }, { 15631, 0xffff }, /* 0x7600 */ { 15647, 0xff8f }, { 15660, 0xfe7f }, { 15674, 0xf3ff }, { 15688, 0x3fff }, { 15702, 0xdfff }, { 15717, 0x9fff }, { 15731, 0xf7b7 }, { 15744, 0xfbff }, { 15759, 0xffff }, { 15775, 0xfffd }, { 15790, 0xffff }, { 15806, 0xfff9 }, { 15820, 0x7fff }, { 15835, 0xfffc }, { 15849, 0xffff }, { 15865, 0xffff }, /* 0x7700 */ { 15881, 0xcfff }, { 15895, 0xffff }, { 15911, 0xefff }, { 15926, 0xffff }, { 15942, 0xffff }, { 15958, 0xfffc }, { 15972, 0xffff }, { 15988, 0xffff }, { 16004, 0xffbf }, { 16019, 0xfff3 }, { 16033, 0xffff }, { 16049, 0xffff }, { 16065, 0xf6ff }, { 16079, 0xffff }, { 16095, 0xf7ff }, { 16110, 0x7fff }, /* 0x7800 */ { 16125, 0xfffc }, { 16139, 0xeb3f }, { 16151, 0xffff }, { 16167, 0x21ff }, { 16177, 0xfffc }, { 16191, 0xf11f }, { 16201, 0xffff }, { 16217, 0xff43 }, { 16228, 0xffff }, { 16244, 0xf7ff }, { 16259, 0xffff }, { 16275, 0xff9f }, { 16289, 0xffff }, { 16305, 0xfd7f }, { 16319, 0xffff }, { 16335, 0xffdf }, /* 0x7900 */ { 16350, 0xfff7 }, { 16365, 0xffbf }, { 16380, 0xffff }, { 16396, 0xf7e7 }, { 16409, 0xbff7 }, { 16423, 0xffff }, { 16439, 0x7fff }, { 16454, 0xfeff }, { 16469, 0xffdf }, { 16484, 0xffff }, { 16500, 0xffff }, { 16516, 0xffff }, { 16532, 0xffff }, { 16548, 0xffff }, { 16564, 0x7fff }, { 16579, 0x9fef }, /* 0x7a00 */ { 16592, 0xffff }, { 16608, 0xffff }, { 16624, 0xffe7 }, { 16638, 0xffff }, { 16654, 0xfff7 }, { 16669, 0x9ff9 }, { 16681, 0xfff7 }, { 16696, 0xff7f }, { 16711, 0x9fff }, { 16725, 0xcfff }, { 16739, 0xdf9f }, { 16752, 0xffff }, { 16768, 0xfff7 }, { 16783, 0xbfbf }, { 16797, 0xffff }, { 16813, 0xffff }, /* 0x7b00 */ { 16829, 0xff73 }, { 16842, 0xffdf }, { 16857, 0xffff }, { 16873, 0xabff }, { 16886, 0xffff }, { 16902, 0xc3ff }, { 16914, 0xffff }, { 16930, 0x0bff }, { 16941, 0xfffe }, { 16956, 0xfbff }, { 16971, 0xf03f }, { 16981, 0xffff }, { 16997, 0x7fff }, { 17012, 0xfff1 }, { 17025, 0x3fff }, { 17039, 0xffff }, /* 0x7c00 */ { 17055, 0xffff }, { 17071, 0xff37 }, { 17084, 0xffff }, { 17100, 0xfffd }, { 17115, 0xfffd }, { 17130, 0xffff }, { 17146, 0xfffd }, { 17161, 0xffff }, { 17177, 0x7ffb }, { 17191, 0xfffe }, { 17206, 0xdbff }, { 17220, 0xffff }, { 17236, 0xffff }, { 17252, 0xfeff }, { 17267, 0xffff }, { 17283, 0xfdff }, /* 0x7d00 */ { 17298, 0xffff }, { 17314, 0xffff }, { 17330, 0xff3f }, { 17344, 0xffff }, { 17360, 0xffff }, { 17376, 0xffff }, { 17392, 0xffff }, { 17408, 0xff7f }, { 17423, 0xffff }, { 17439, 0xf3ff }, { 17453, 0xffff }, { 17469, 0xffff }, { 17485, 0xffff }, { 17501, 0xffcf }, { 17515, 0xffff }, { 17531, 0xffff }, /* 0x7e00 */ { 17547, 0xff9f }, { 17561, 0xffff }, { 17577, 0xfeff }, { 17592, 0xffff }, { 17608, 0xf3ff }, { 17622, 0xffff }, { 17638, 0xff7f }, { 17653, 0xffff }, { 17669, 0xfff7 }, { 17684, 0x7ffe }, { 17698, 0x0000 }, { 17698, 0x0000 }, { 17698, 0x0000 }, { 17698, 0x0000 }, { 17698, 0x0000 }, { 17698, 0x0000 }, /* 0x7f00 */ { 17698, 0x0000 }, { 17698, 0x0000 }, { 17698, 0x0000 }, { 17698, 0xffc0 }, { 17708, 0xfdfb }, { 17722, 0xfbb7 }, { 17735, 0xffff }, { 17751, 0xffef }, { 17766, 0xfffd }, { 17781, 0x7fff }, { 17796, 0xfbff }, { 17811, 0xffff }, { 17827, 0xffff }, { 17843, 0xf8ff }, { 17856, 0xffff }, { 17872, 0xffff }, /* 0x8000 */ { 17888, 0xffff }, { 17904, 0xffff }, { 17920, 0xff7b }, { 17934, 0xffff }, { 17950, 0xc7fb }, { 17962, 0xffef }, { 17977, 0xfdfb }, { 17991, 0xffff }, { 18007, 0xfff6 }, { 18021, 0xffff }, { 18037, 0xfffe }, { 18052, 0x0fff }, { 18064, 0xfffc }, { 18078, 0xffff }, { 18094, 0xe07f }, { 18104, 0xffff }, /* 0x8100 */ { 18120, 0x07ff }, { 18131, 0xfff0 }, { 18143, 0xffff }, { 18159, 0xfe13 }, { 18169, 0xffff }, { 18185, 0xf93f }, { 18197, 0xffff }, { 18213, 0xa7ff }, { 18226, 0xffff }, { 18242, 0xfffd }, { 18257, 0xffcf }, { 18271, 0xffbf }, { 18286, 0xffff }, { 18302, 0xeff7 }, { 18316, 0xffff }, { 18332, 0xffff }, /* 0x8200 */ { 18348, 0xffbf }, { 18363, 0xff7f }, { 18378, 0xbff7 }, { 18392, 0xb7fc }, { 18404, 0xdfff }, { 18419, 0xdfef }, { 18433, 0xfffe }, { 18448, 0xfbfe }, { 18462, 0xfefb }, { 18476, 0xff7f }, { 18491, 0xffff }, { 18507, 0xffff }, { 18523, 0x063f }, { 18531, 0xffff }, { 18547, 0xffff }, { 18563, 0xffff }, /* 0x8300 */ { 18579, 0x7fff }, { 18594, 0xffc5 }, { 18606, 0xffff }, { 18622, 0xffff }, { 18638, 0xffff }, { 18654, 0x01ff }, { 18663, 0x000c }, { 18665, 0xffff }, { 18681, 0xffff }, { 18697, 0xffff }, { 18713, 0xffff }, { 18729, 0xe281 }, { 18735, 0xffff }, { 18751, 0xffff }, { 18767, 0xffff }, { 18783, 0xffff }, /* 0x8400 */ { 18799, 0xffff }, { 18815, 0xc9ff }, { 18827, 0xfe0a }, { 18836, 0xffff }, { 18852, 0xffff }, { 18868, 0xffff }, { 18884, 0xffff }, { 18900, 0xffff }, { 18916, 0xe15f }, { 18926, 0xffff }, { 18942, 0xffff }, { 18958, 0xffff }, { 18974, 0xffff }, { 18990, 0x4dff }, { 19002, 0xff96 }, { 19014, 0xffff }, /* 0x8500 */ { 19030, 0xffff }, { 19046, 0xffff }, { 19062, 0xffff }, { 19078, 0xe93f }, { 19089, 0xffff }, { 19105, 0xffff }, { 19121, 0xffff }, { 19137, 0xffeb }, { 19151, 0xffff }, { 19167, 0xffff }, { 19183, 0x9fff }, { 19197, 0xffff }, { 19213, 0xffff }, { 19229, 0xfff7 }, { 19244, 0xffff }, { 19260, 0xffff }, /* 0x8600 */ { 19276, 0xffff }, { 19292, 0xffeb }, { 19306, 0xffff }, { 19322, 0xfffe }, { 19337, 0x7fef }, { 19351, 0xffff }, { 19367, 0xffff }, { 19383, 0x7fff }, { 19398, 0xfff0 }, { 19410, 0xffff }, { 19426, 0xe7ff }, { 19440, 0xffff }, { 19456, 0x9fff }, { 19470, 0xffff }, { 19486, 0x7fff }, { 19501, 0xffe0 }, /* 0x8700 */ { 19512, 0xffff }, { 19528, 0xff7f }, { 19543, 0xffff }, { 19559, 0xffff }, { 19575, 0xf4ff }, { 19588, 0xffff }, { 19604, 0xffff }, { 19620, 0x3fff }, { 19634, 0xfffe }, { 19649, 0xffff }, { 19665, 0xfe3f }, { 19678, 0xffff }, { 19694, 0x7fff }, { 19709, 0xfffe }, { 19724, 0xffff }, { 19740, 0xffff }, /* 0x8800 */ { 19756, 0xffff }, { 19772, 0xffff }, { 19788, 0xffff }, { 19804, 0xffff }, { 19820, 0xffff }, { 19836, 0xffef }, { 19851, 0xefcf }, { 19864, 0xffff }, { 19880, 0xff9f }, { 19894, 0xffff }, { 19910, 0x1fff }, { 19923, 0xfffe }, { 19938, 0xfe07 }, { 19948, 0xffff }, { 19964, 0xffc3 }, { 19976, 0xffff }, /* 0x8900 */ { 19992, 0xffef }, { 20007, 0xcfff }, { 20021, 0xffff }, { 20037, 0xffef }, { 20052, 0xff5f }, { 20066, 0xffdf }, { 20081, 0xfeff }, { 20096, 0xffff }, { 20112, 0xfffe }, { 20127, 0xffff }, { 20143, 0xffff }, { 20159, 0xffff }, { 20175, 0x0001 }, { 20176, 0xbffc }, { 20189, 0x7fff }, { 20204, 0xffff }, /* 0x8a00 */ { 20220, 0xfffd }, { 20235, 0xfbff }, { 20250, 0xffff }, { 20266, 0xfff7 }, { 20281, 0xffff }, { 20297, 0x7fff }, { 20312, 0xffff }, { 20328, 0xffff }, { 20344, 0xf9ff }, { 20358, 0xffff }, { 20374, 0xbfff }, { 20389, 0xffff }, { 20405, 0xffff }, { 20421, 0xfbff }, { 20436, 0xffff }, { 20452, 0xffff }, /* 0x8b00 */ { 20468, 0xffff }, { 20484, 0xffff }, { 20500, 0xfffd }, { 20515, 0xffff }, { 20531, 0xffff }, { 20547, 0xf7ff }, { 20562, 0xffff }, { 20578, 0xfffb }, { 20593, 0x7fff }, { 20608, 0xffff }, { 20624, 0x0000 }, { 20624, 0x0000 }, { 20624, 0x0000 }, { 20624, 0x0000 }, { 20624, 0x0000 }, { 20624, 0x0000 }, /* 0x8c00 */ { 20624, 0x0000 }, { 20624, 0x0000 }, { 20624, 0x0000 }, { 20624, 0xff80 }, { 20633, 0xffff }, { 20649, 0xffff }, { 20665, 0xbfff }, { 20680, 0xffff }, { 20696, 0xffff }, { 20712, 0xffff }, { 20728, 0xffff }, { 20744, 0xffff }, { 20760, 0xbfff }, { 20775, 0xffff }, { 20791, 0xffff }, { 20807, 0xffff }, /* 0x8d00 */ { 20823, 0xffff }, { 20839, 0x1fff }, { 20852, 0x0000 }, { 20852, 0x0000 }, { 20852, 0x0000 }, { 20852, 0x0000 }, { 20852, 0xfbf0 }, { 20863, 0xffdf }, { 20878, 0xffff }, { 20894, 0xffff }, { 20910, 0xffff }, { 20926, 0xfefd }, { 20940, 0xffef }, { 20955, 0xbfff }, { 20970, 0xffdf }, { 20985, 0xf41f }, /* 0x8e00 */ { 20995, 0xafff }, { 21009, 0xffff }, { 21025, 0x4fff }, { 21038, 0xffff }, { 21054, 0xffff }, { 21070, 0xfffb }, { 21085, 0xffff }, { 21101, 0x1fff }, { 21114, 0x7ffe }, { 21128, 0xe7ff }, { 21142, 0xffff }, { 21158, 0xf7df }, { 21172, 0xfedf }, { 21186, 0xffff }, { 21202, 0xfff3 }, { 21216, 0xffff }, /* 0x8f00 */ { 21232, 0xefff }, { 21247, 0xffff }, { 21263, 0xffff }, { 21279, 0xffff }, { 21295, 0xefff }, { 21310, 0xffff }, { 21326, 0x003f }, { 21332, 0x0000 }, { 21332, 0x0000 }, { 21332, 0xf800 }, { 21337, 0xf5ff }, { 21351, 0xdbff }, { 21365, 0xffff }, { 21381, 0x93ff }, { 21393, 0xffff }, { 21409, 0xfff3 }, /* 0x9000 */ { 21423, 0xfbff }, { 21438, 0xffff }, { 21454, 0xff3f }, { 21468, 0xfdff }, { 21483, 0xffff }, { 21499, 0xff3f }, { 21513, 0xffdf }, { 21528, 0xffff }, { 21544, 0xffff }, { 21560, 0xdfff }, { 21575, 0xefff }, { 21590, 0xf3ff }, { 21604, 0x7fff }, { 21619, 0xfff4 }, { 21632, 0xff3f }, { 21646, 0xfeff }, /* 0x9100 */ { 21661, 0xffff }, { 21677, 0xffff }, { 21693, 0xffff }, { 21709, 0xffff }, { 21725, 0xfffb }, { 21740, 0x97ff }, { 21753, 0xffbf }, { 21768, 0x1ffd }, { 21780, 0xffff }, { 21796, 0xff7f }, { 21811, 0xffef }, { 21826, 0xfeff }, { 21841, 0xfaff }, { 21855, 0xfffb }, { 21870, 0xfffd }, { 21885, 0xe3ff }, /* 0x9200 */ { 21898, 0xffff }, { 21914, 0xffff }, { 21930, 0xe8ff }, { 21942, 0xffff }, { 21958, 0xffff }, { 21974, 0xffff }, { 21990, 0xffff }, { 22006, 0xfffd }, { 22021, 0xffff }, { 22037, 0xffff }, { 22053, 0xffff }, { 22069, 0xffff }, { 22085, 0xffff }, { 22101, 0xffff }, { 22117, 0xffff }, { 22133, 0xffff }, /* 0x9300 */ { 22149, 0xffff }, { 22165, 0xffff }, { 22181, 0xffff }, { 22197, 0xbfff }, { 22212, 0xffed }, { 22226, 0xffff }, { 22242, 0xffff }, { 22258, 0xffff }, { 22274, 0xffff }, { 22290, 0xffff }, { 22306, 0xffff }, { 22322, 0xfbff }, { 22337, 0xffff }, { 22353, 0xffff }, { 22369, 0xffff }, { 22385, 0xfffe }, /* 0x9400 */ { 22400, 0xffff }, { 22416, 0xffff }, { 22432, 0xffbd }, { 22446, 0xffff }, { 22462, 0xfffd }, { 22477, 0xfff7 }, { 22492, 0xffff }, { 22508, 0xffff }, { 22524, 0x001f }, { 22529, 0x0000 }, { 22529, 0x0000 }, { 22529, 0x0000 }, { 22529, 0x0000 }, { 22529, 0x0000 }, { 22529, 0x0000 }, { 22529, 0x0000 }, /* 0x9500 */ { 22529, 0x0000 }, { 22529, 0x0000 }, { 22529, 0x0000 }, { 22529, 0x0000 }, { 22529, 0x0000 }, { 22529, 0x0000 }, { 22529, 0x0000 }, { 22529, 0x7f80 }, { 22537, 0xfbff }, { 22552, 0xffff }, { 22568, 0xfbff }, { 22583, 0xffff }, { 22599, 0x7fff }, { 22614, 0xffff }, { 22630, 0x00ff }, { 22638, 0x0020 }, /* 0x9600 */ { 22639, 0x0000 }, { 22639, 0x7000 }, { 22642, 0xffff }, { 22658, 0xff9f }, { 22672, 0xfc1f }, { 22683, 0xffff }, { 22699, 0xfc1f }, { 22710, 0xfbff }, { 22725, 0xffff }, { 22741, 0xfffe }, { 22756, 0xffff }, { 22772, 0xffff }, { 22788, 0xffff }, { 22804, 0xffff }, { 22820, 0xfffe }, { 22835, 0xbff7 }, /* 0x9700 */ { 22849, 0xfffd }, { 22864, 0xffff }, { 22880, 0xdfff }, { 22895, 0xffff }, { 22911, 0x2fff }, { 22924, 0xffe7 }, { 22938, 0xffdf }, { 22953, 0xfffd }, { 22968, 0xffbf }, { 22983, 0xfff8 }, { 22996, 0x7fff }, { 23011, 0xffff }, { 23027, 0xffff }, { 23043, 0xffff }, { 23059, 0xe03f }, { 23068, 0xffff }, /* 0x9800 */ { 23084, 0xffff }, { 23100, 0xffff }, { 23116, 0xefff }, { 23131, 0xffff }, { 23147, 0xffff }, { 23163, 0xffff }, { 23179, 0xffff }, { 23195, 0x001f }, { 23200, 0x0000 }, { 23200, 0x0000 }, { 23200, 0xfb00 }, { 23207, 0xffef }, { 23222, 0x3fdf }, { 23235, 0xb800 }, { 23239, 0xbefe }, { 23252, 0xffff }, /* 0x9900 */ { 23268, 0x5fff }, { 23282, 0xffff }, { 23298, 0xffff }, { 23314, 0xffff }, { 23330, 0xffff }, { 23346, 0xffff }, { 23362, 0x0003 }, { 23364, 0x0000 }, { 23364, 0x0000 }, { 23364, 0xffc0 }, { 23374, 0xffff }, { 23390, 0xffff }, { 23406, 0xffdf }, { 23421, 0xffff }, { 23437, 0xffff }, { 23453, 0xfffb }, /* 0x9a00 */ { 23468, 0xffff }, { 23484, 0xfff3 }, { 23498, 0xfeff }, { 23513, 0xffff }, { 23529, 0xffff }, { 23545, 0xffff }, { 23561, 0x0fff }, { 23573, 0x0000 }, { 23573, 0x0000 }, { 23573, 0x0000 }, { 23573, 0xff00 }, { 23581, 0xffff }, { 23597, 0xe7df }, { 23610, 0xffff }, { 23626, 0xffff }, { 23642, 0xffff }, /* 0x9b00 */ { 23658, 0xffff }, { 23674, 0xfff7 }, { 23689, 0xffff }, { 23705, 0xffbf }, { 23720, 0xff7f }, { 23735, 0xbfff }, { 23750, 0xffff }, { 23766, 0xfeff }, { 23781, 0xffff }, { 23797, 0xff7f }, { 23812, 0xffff }, { 23828, 0xffeb }, { 23842, 0xbfff }, { 23857, 0xfffc }, { 23871, 0xffff }, { 23887, 0xffd9 }, /* 0x9c00 */ { 23900, 0xffff }, { 23916, 0xf8ff }, { 23929, 0xffff }, { 23945, 0xfffe }, { 23960, 0xffff }, { 23976, 0xe3ff }, { 23989, 0xf1ff }, { 24002, 0x0ffe }, { 24013, 0x0000 }, { 24013, 0x0000 }, { 24013, 0x0000 }, { 24013, 0x0000 }, { 24013, 0x0000 }, { 24013, 0x0000 }, { 24013, 0xffe0 }, { 24024, 0xfffe }, /* 0x9d00 */ { 24039, 0xbfff }, { 24054, 0xffff }, { 24070, 0xe7ff }, { 24084, 0xffff }, { 24100, 0xfebf }, { 24114, 0xffff }, { 24130, 0xffdf }, { 24145, 0xffff }, { 24161, 0x1fff }, { 24174, 0xffff }, { 24190, 0xf7ff }, { 24205, 0xffff }, { 24221, 0xffbf }, { 24236, 0xffff }, { 24252, 0xffff }, { 24268, 0xffff }, /* 0x9e00 */ { 24284, 0xffff }, { 24300, 0x7fff }, { 24315, 0x0000 }, { 24315, 0x0000 }, { 24315, 0x0000 }, { 24315, 0x0000 }, { 24315, 0x0000 }, { 24315, 0xbee0 }, { 24324, 0xffff }, { 24340, 0xffff }, { 24356, 0xffff }, { 24372, 0xf8ff }, { 24385, 0xfdff }, { 24400, 0xffff }, { 24416, 0xf9fd }, { 24429, 0xffff }, /* 0x9f00 */ { 24445, 0xc7ff }, { 24458, 0xffff }, { 24474, 0xfffd }, { 24489, 0xffff }, { 24505, 0xffff }, { 24521, 0xfffd }, { 24536, 0xfffb }, { 24551, 0x7fff }, { 24566, 0xe000 }, { 24569, 0x73ff }, { 24582, 0x003f }, }; static const Summary16 cns11643_inv_uni2indx_pagefa[3] = { /* 0xfa00 */ { 24588, 0x0000 }, { 24588, 0x0000 }, { 24588, 0x0100 }, }; static const Summary16 cns11643_inv_uni2indx_pagefe[31] = { /* 0xfe00 */ { 24589, 0x0000 }, { 24589, 0x0000 }, { 24589, 0x0000 }, { 24589, 0xffe7 }, { 24603, 0x7e1f }, { 24614, 0xfef7 }, { 24628, 0x0f7f }, { 24639, 0x0000 }, { 24639, 0x0000 }, { 24639, 0x0000 }, { 24639, 0x0000 }, { 24639, 0x0000 }, { 24639, 0x0000 }, { 24639, 0x0000 }, { 24639, 0x0000 }, { 24639, 0x0000 }, /* 0xff00 */ { 24639, 0xff7a }, { 24652, 0xffff }, { 24668, 0xffff }, { 24684, 0x97ff }, { 24697, 0xfffe }, { 24712, 0x3fff }, { 24726, 0x0000 }, { 24726, 0x0000 }, { 24726, 0x0000 }, { 24726, 0x0000 }, { 24726, 0x0000 }, { 24726, 0x0000 }, { 24726, 0x0000 }, { 24726, 0x0000 }, { 24726, 0x0023 }, }; static const Summary16 cns11643_inv_uni2indx_page200[2670] = { /* 0x20000 */ { 24729, 0x8bbd }, { 24739, 0x0715 }, { 24745, 0x722f }, { 24754, 0x0860 }, { 24757, 0x39ca }, { 24765, 0x08ec }, { 24771, 0xeaf6 }, { 24782, 0xe0d7 }, { 24791, 0xb1fc }, { 24801, 0x5fbc }, { 24812, 0xd33d }, { 24822, 0xf6ff }, { 24836, 0x8a5c }, { 24843, 0xc377 }, { 24853, 0x24f3 }, { 24861, 0x795f }, /* 0x20100 */ { 24872, 0xfff4 }, { 24885, 0xeefe }, { 24898, 0x751f }, { 24908, 0x03b7 }, { 24916, 0x9fb9 }, { 24927, 0xe3fa }, { 24938, 0xfebf }, { 24952, 0x4071 }, { 24957, 0xd6ff }, { 24970, 0x3004 }, { 24973, 0xb3f8 }, { 24983, 0x1ff5 }, { 24994, 0x8ffc }, { 25005, 0xff11 }, { 25015, 0x0fff }, { 25027, 0xc096 }, /* 0x20200 */ { 25033, 0xfffb }, { 25048, 0xffe3 }, { 25061, 0xf787 }, { 25072, 0xffff }, { 25088, 0xfff0 }, { 25100, 0x0977 }, { 25108, 0x7ffe }, { 25122, 0xffce }, { 25135, 0x1dff }, { 25147, 0x4056 }, { 25152, 0x7ffd }, { 25166, 0x4fff }, { 25179, 0xfffe }, { 25194, 0x287f }, { 25203, 0xffae }, { 25216, 0xffff }, /* 0x20300 */ { 25232, 0xfb81 }, { 25241, 0x119f }, { 25249, 0xfe03 }, { 25258, 0xdeff }, { 25272, 0xff11 }, { 25282, 0xc17f }, { 25292, 0xdf84 }, { 25301, 0x0fff }, { 25313, 0xfffc }, { 25327, 0x4fff }, { 25340, 0xd08e }, { 25347, 0xffcf }, { 25361, 0xf59f }, { 25373, 0x04d7 }, { 25380, 0xff9e }, { 25393, 0x0dd1 }, /* 0x20400 */ { 25400, 0x7f41 }, { 25409, 0x8de4 }, { 25417, 0xcdfe }, { 25429, 0xfc6f }, { 25441, 0xf037 }, { 25450, 0xbf8e }, { 25461, 0xefd0 }, { 25471, 0xeecc }, { 25481, 0x3d7b }, { 25492, 0xcff9 }, { 25504, 0x2f1f }, { 25514, 0xbf7f }, { 25528, 0xfb5c }, { 25539, 0xb9ac }, { 25548, 0xecb3 }, { 25558, 0x21db }, /* 0x20500 */ { 25566, 0xdfdf }, { 25580, 0xbfed }, { 25593, 0x8fa7 }, { 25603, 0x73fa }, { 25614, 0x6d5e }, { 25624, 0xed5f }, { 25636, 0xf3fd }, { 25649, 0x2eef }, { 25660, 0xb433 }, { 25668, 0xd6ff }, { 25681, 0x4acf }, { 25690, 0x3fd6 }, { 25701, 0x7fff }, { 25716, 0x7fbe }, { 25729, 0xf5e6 }, { 25740, 0xfcfe }, /* 0x20600 */ { 25753, 0x7ff1 }, { 25765, 0xf9de }, { 25777, 0xfabf }, { 25790, 0xf5ef }, { 25803, 0xbfc1 }, { 25813, 0xbf8f }, { 25825, 0xef87 }, { 25836, 0xefef }, { 25850, 0xe9c7 }, { 25860, 0xefc6 }, { 25871, 0xffea }, { 25884, 0xff9f }, { 25898, 0xe39f }, { 25909, 0x0fff }, { 25921, 0xffe1 }, { 25933, 0xfbf7 }, /* 0x20700 */ { 25947, 0x12c4 }, { 25952, 0xbfff }, { 25967, 0x016f }, { 25974, 0xffff }, { 25990, 0x3f3f }, { 26002, 0xef06 }, { 26011, 0xe7bf }, { 26024, 0xe002 }, { 26028, 0xffff }, { 26044, 0x311f }, { 26052, 0xfff0 }, { 26064, 0xf88f }, { 26074, 0xfffe }, { 26089, 0x9fff }, { 26103, 0xffc0 }, { 26113, 0xfc2b }, /* 0x20800 */ { 26123, 0xe9ff }, { 26136, 0xf88d }, { 26145, 0xdccf }, { 26156, 0xfbdf }, { 26170, 0x31de }, { 26179, 0xc3fe }, { 26190, 0xff47 }, { 26202, 0xfb37 }, { 26214, 0xcff7 }, { 26227, 0x03fc }, { 26235, 0xa1ff }, { 26246, 0x9fdf }, { 26259, 0xfffb }, { 26274, 0xf7de }, { 26287, 0xcfff }, { 26301, 0xffbb }, /* 0x20900 */ { 26315, 0xcfbb }, { 26327, 0xdfbf }, { 26341, 0xfd3f }, { 26354, 0xd77b }, { 26366, 0xde3f }, { 26378, 0x7e4f }, { 26389, 0xfe6e }, { 26401, 0x6dff }, { 26414, 0x31ed }, { 26423, 0xff7e }, { 26437, 0x3c7f }, { 26448, 0x70f3 }, { 26457, 0xc517 }, { 26465, 0xdf9b }, { 26477, 0xff7f }, { 26492, 0x3ffc }, /* 0x20a00 */ { 26504, 0xebef }, { 26517, 0xff5d }, { 26530, 0xf0ad }, { 26539, 0x2ff7 }, { 26551, 0xfc9f }, { 26563, 0xffc6 }, { 26575, 0xffdd }, { 26589, 0xff1f }, { 26602, 0xffd0 }, { 26613, 0xff7e }, { 26627, 0xec75 }, { 26637, 0xfe29 }, { 26647, 0x5387 }, { 26655, 0xc6bd }, { 26665, 0x1ff5 }, { 26676, 0x9e1b }, /* 0x20b00 */ { 26685, 0xc5f7 }, { 26696, 0xfd8b }, { 26707, 0xffee }, { 26721, 0xbffe }, { 26735, 0xfebf }, { 26749, 0xffff }, { 26765, 0xffeb }, { 26779, 0xd97f }, { 26791, 0xeffe }, { 26805, 0x7fff }, { 26820, 0xfdff }, { 26835, 0x0fbf }, { 26846, 0xff46 }, { 26857, 0x7fff }, { 26872, 0x59fa }, { 26882, 0x0068 }, /* 0x20c00 */ { 26885, 0xff30 }, { 26895, 0x7fff }, { 26910, 0xfffe }, { 26925, 0x8165 }, { 26931, 0x4001 }, { 26933, 0xffff }, { 26949, 0xfbff }, { 26964, 0xfe2f }, { 26976, 0xdbff }, { 26990, 0x0089 }, { 26993, 0xee00 }, { 26999, 0xffff }, { 27015, 0x7fff }, { 27030, 0xf800 }, { 27035, 0xcfff }, { 27049, 0x8f93 }, /* 0x20d00 */ { 27058, 0x0008 }, { 27059, 0x0000 }, { 27059, 0xffce }, { 27072, 0xffff }, { 27088, 0x040f }, { 27093, 0xfffe }, { 27108, 0x0427 }, { 27113, 0x02a5 }, { 27118, 0x0000 }, { 27118, 0x0000 }, { 27118, 0x7f80 }, { 27126, 0xfdbf }, { 27140, 0xffff }, { 27156, 0xfffe }, { 27171, 0xff80 }, { 27180, 0x79ff }, /* 0x20e00 */ { 27193, 0x3011 }, { 27197, 0x2040 }, { 27199, 0x6000 }, { 27201, 0x8fef }, { 27213, 0xffff }, { 27229, 0xdfff }, { 27244, 0x4fff }, { 27257, 0x8000 }, { 27258, 0xffff }, { 27274, 0x0008 }, { 27275, 0x0014 }, { 27277, 0x0000 }, { 27277, 0xf000 }, { 27281, 0xfff3 }, { 27295, 0xffff }, { 27311, 0xc043 }, /* 0x20f00 */ { 27316, 0xffff }, { 27332, 0x557f }, { 27343, 0x020c }, { 27346, 0x0000 }, { 27346, 0x0000 }, { 27346, 0x3000 }, { 27348, 0xfffd }, { 27363, 0xff7f }, { 27378, 0x1f7f }, { 27390, 0xffc0 }, { 27400, 0x84e3 }, { 27407, 0x0001 }, { 27408, 0xffe0 }, { 27419, 0xffff }, { 27435, 0x40ff }, { 27444, 0xfc00 }, /* 0x21000 */ { 27450, 0xffff }, { 27466, 0x000d }, { 27469, 0x0000 }, { 27469, 0xbe00 }, { 27475, 0xfbfe }, { 27489, 0x80ef }, { 27497, 0x3b3f }, { 27508, 0x0000 }, { 27508, 0x8c00 }, { 27511, 0xffff }, { 27527, 0x13ff }, { 27538, 0x7fc0 }, { 27547, 0x0000 }, { 27547, 0xa000 }, { 27549, 0xffff }, { 27565, 0x0084 }, /* 0x21100 */ { 27567, 0x077c }, { 27575, 0x7ffe }, { 27589, 0x0009 }, { 27591, 0x8ffe }, { 27603, 0x0003 }, { 27605, 0xf790 }, { 27614, 0x600a }, { 27618, 0xff47 }, { 27630, 0xce68 }, { 27638, 0x180f }, { 27644, 0x238f }, { 27652, 0xdffd }, { 27666, 0x7fda }, { 27678, 0x09ff }, { 27688, 0x041f }, { 27694, 0xf2ff }, /* 0x21200 */ { 27707, 0xfe9d }, { 27719, 0xbff2 }, { 27731, 0x743c }, { 27739, 0xd38a }, { 27747, 0x3416 }, { 27753, 0xaf04 }, { 27760, 0x10ff }, { 27769, 0x10ee }, { 27776, 0xffff }, { 27792, 0x5ff8 }, { 27803, 0x11fb }, { 27812, 0x7ff0 }, { 27823, 0xfff0 }, { 27835, 0x797f }, { 27847, 0xff89 }, { 27858, 0x01ff }, /* 0x21300 */ { 27867, 0xffc2 }, { 27878, 0x97ed }, { 27889, 0xfef0 }, { 27900, 0xfbdf }, { 27914, 0x87ff }, { 27926, 0x003a }, { 27930, 0xfff3 }, { 27944, 0xfcff }, { 27958, 0x40ff }, { 27967, 0x04e1 }, { 27972, 0xdf80 }, { 27980, 0xfffb }, { 27995, 0xffaf }, { 28009, 0x00bf }, { 28016, 0xee00 }, { 28022, 0x81ff }, /* 0x21400 */ { 28032, 0x47ff }, { 28044, 0xe83b }, { 28053, 0x2f7f }, { 28065, 0x5fff }, { 28079, 0x8784 }, { 28085, 0xdf16 }, { 28095, 0x395f }, { 28105, 0x07c0 }, { 28110, 0x7fc4 }, { 28120, 0xfe4d }, { 28131, 0x811b }, { 28137, 0x3fbf }, { 28150, 0x3600 }, { 28154, 0x0ebf }, { 28164, 0x1ed8 }, { 28172, 0xbf7f }, /* 0x21500 */ { 28186, 0x8f96 }, { 28195, 0xefa0 }, { 28204, 0xb1f7 }, { 28215, 0x7ee1 }, { 28225, 0x7c60 }, { 28232, 0xff6e }, { 28245, 0xdfdf }, { 28259, 0xffde }, { 28273, 0xad53 }, { 28282, 0xf7be }, { 28295, 0xfe3c }, { 28306, 0xe3dd }, { 28317, 0x114a }, { 28322, 0xf33c }, { 28332, 0xff6f }, { 28346, 0xff91 }, /* 0x21600 */ { 28357, 0xfa77 }, { 28369, 0xa7f5 }, { 28380, 0x0a7d }, { 28388, 0xbffd }, { 28402, 0xf792 }, { 28412, 0x35e1 }, { 28420, 0xff05 }, { 28430, 0xffc7 }, { 28443, 0x9fe3 }, { 28454, 0x59c3 }, { 28462, 0x8d39 }, { 28470, 0xff3f }, { 28484, 0x6ff8 }, { 28495, 0xffed }, { 28509, 0xfe27 }, { 28520, 0x7e9f }, /* 0x21700 */ { 28532, 0xffff }, { 28548, 0xbbfe }, { 28561, 0xffeb }, { 28575, 0xe17f }, { 28586, 0xb4ff }, { 28598, 0xff82 }, { 28608, 0x0fff }, { 28620, 0xffe4 }, { 28632, 0x5fff }, { 28646, 0xff1b }, { 28658, 0xffdf }, { 28673, 0xffc1 }, { 28684, 0x47ff }, { 28696, 0xfe72 }, { 28707, 0xffff }, { 28723, 0xe09f }, /* 0x21800 */ { 28732, 0x493f }, { 28741, 0xfebf }, { 28755, 0xf8f5 }, { 28766, 0x21ff }, { 28776, 0xbf2c }, { 28786, 0xbeff }, { 28800, 0xff21 }, { 28810, 0xf2ff }, { 28823, 0x2ffc }, { 28834, 0x3ffe }, { 28847, 0x7ff8 }, { 28859, 0xc1b6 }, { 28867, 0xfbef }, { 28881, 0xfc37 }, { 28892, 0xee12 }, { 28900, 0xf5bf }, /* 0x21900 */ { 28913, 0xb9c7 }, { 28923, 0x3fe4 }, { 28933, 0xdf7e }, { 28946, 0xd6d7 }, { 28957, 0xe7ef }, { 28970, 0x79ff }, { 28983, 0xff4e }, { 28995, 0x6ec7 }, { 29005, 0xdaf8 }, { 29015, 0xe5ae }, { 29025, 0xa23f }, { 29034, 0xf321 }, { 29042, 0xf9fc }, { 29054, 0xf7c2 }, { 29064, 0xfe0d }, { 29074, 0x0df3 }, /* 0x21a00 */ { 29083, 0xe7ff }, { 29097, 0xd01b }, { 29104, 0xfffd }, { 29119, 0xf853 }, { 29128, 0xc3ff }, { 29140, 0xca3f }, { 29150, 0xf7ff }, { 29165, 0xfc1f }, { 29176, 0xcf7f }, { 29189, 0x8dd9 }, { 29198, 0x7fbf }, { 29212, 0xf5d0 }, { 29221, 0x7fff }, { 29236, 0xfdfc }, { 29249, 0xf60d }, { 29258, 0xf88f }, /* 0x21b00 */ { 29268, 0xb4f9 }, { 29278, 0xaf5e }, { 29289, 0xd78d }, { 29299, 0xee1b }, { 29309, 0x7d66 }, { 29319, 0xe66f }, { 29330, 0x8f23 }, { 29338, 0xe238 }, { 29345, 0xc00f }, { 29351, 0xe221 }, { 29357, 0x00c2 }, { 29360, 0x8813 }, { 29365, 0xe67c }, { 29375, 0xfb55 }, { 29386, 0xf7ef }, { 29400, 0x1dfc }, /* 0x21c00 */ { 29410, 0x7e9c }, { 29420, 0x33f7 }, { 29431, 0xfe7d }, { 29444, 0xf5c1 }, { 29453, 0xf81f }, { 29463, 0x2fbf }, { 29475, 0x7dff }, { 29489, 0xfe97 }, { 29501, 0x5fff }, { 29515, 0xfffe }, { 29530, 0xf7cb }, { 29542, 0x4f7f }, { 29554, 0xa7f4 }, { 29564, 0xc1fb }, { 29574, 0x39c3 }, { 29582, 0xc196 }, /* 0x21d00 */ { 29589, 0xf977 }, { 29601, 0xfbee }, { 29614, 0xbbfa }, { 29626, 0x99ef }, { 29637, 0xcdc3 }, { 29646, 0x7ffa }, { 29659, 0x4fd8 }, { 29668, 0x560b }, { 29675, 0xfffc }, { 29689, 0xefff }, { 29704, 0xfe15 }, { 29714, 0xfb0b }, { 29724, 0x92ff }, { 29735, 0xffff }, { 29751, 0xe7ff }, { 29765, 0x81ff }, /* 0x21e00 */ { 29775, 0x5704 }, { 29781, 0xdfff }, { 29796, 0x17ff }, { 29808, 0xff60 }, { 29818, 0xac4f }, { 29827, 0x0014 }, { 29829, 0xffbc }, { 29842, 0x7fed }, { 29855, 0xfd40 }, { 29863, 0x2614 }, { 29868, 0xf812 }, { 29875, 0xfeff }, { 29890, 0x28ff }, { 29900, 0xffa2 }, { 29911, 0xf7ff }, { 29926, 0x43f7 }, /* 0x21f00 */ { 29936, 0x7c00 }, { 29941, 0x3fff }, { 29955, 0x87e0 }, { 29962, 0xf441 }, { 29969, 0x77ff }, { 29983, 0xfd39 }, { 29994, 0xf0fb }, { 30005, 0x2521 }, { 30010, 0x7fe5 }, { 30022, 0xff33 }, { 30034, 0xc2dc }, { 30042, 0x78c7 }, { 30051, 0x9fc2 }, { 30060, 0xb972 }, { 30069, 0xffaf }, { 30083, 0xeb8f }, /* 0x22000 */ { 30094, 0x47ff }, { 30106, 0xb31f }, { 30116, 0x821f }, { 30123, 0x8ad0 }, { 30129, 0x11ff }, { 30139, 0x9ffd }, { 30152, 0xf7fc }, { 30165, 0xfe3f }, { 30178, 0xadcf }, { 30189, 0xe5ff }, { 30202, 0xde6f }, { 30214, 0xfff6 }, { 30228, 0xf85f }, { 30239, 0xffff }, { 30255, 0xfd9b }, { 30267, 0x6fff }, /* 0x22100 */ { 30281, 0xfdf2 }, { 30293, 0xddf9 }, { 30305, 0x08ff }, { 30314, 0xf7ff }, { 30329, 0xee04 }, { 30336, 0xceff }, { 30349, 0xef4f }, { 30361, 0xfb67 }, { 30373, 0xefb8 }, { 30384, 0x9e0f }, { 30393, 0xd014 }, { 30398, 0xfbfe }, { 30412, 0xfcc3 }, { 30422, 0x7fd7 }, { 30435, 0xaff9 }, { 30447, 0xfffd }, /* 0x22200 */ { 30462, 0xffb7 }, { 30476, 0xfe87 }, { 30487, 0x313f }, { 30496, 0xfffc }, { 30510, 0xfd7f }, { 30524, 0xff61 }, { 30535, 0xffff }, { 30551, 0x9057 }, { 30558, 0x5eff }, { 30571, 0xfbfd }, { 30585, 0xf57f }, { 30598, 0x1fff }, { 30611, 0xf0fe }, { 30622, 0x35ff }, { 30634, 0xacfe }, { 30645, 0xf9e7 }, /* 0x22300 */ { 30657, 0xabdd }, { 30668, 0x7bfe }, { 30681, 0xbfed }, { 30694, 0xfd7a }, { 30706, 0xe47e }, { 30716, 0xfff5 }, { 30730, 0xd9dd }, { 30741, 0xcfcf }, { 30753, 0x74db }, { 30763, 0xb70f }, { 30773, 0x2ffd }, { 30785, 0xdfc7 }, { 30797, 0x03e3 }, { 30804, 0x07fc }, { 30813, 0xdfd0 }, { 30823, 0x7fff }, /* 0x22400 */ { 30838, 0xbdff }, { 30852, 0xe37c }, { 30862, 0xb3ff }, { 30875, 0xdfbd }, { 30888, 0x3fdf }, { 30901, 0x5fff }, { 30915, 0xaf5e }, { 30926, 0xe3ef }, { 30938, 0x979f }, { 30949, 0xfff3 }, { 30963, 0xfff7 }, { 30978, 0xebfd }, { 30991, 0x8ffd }, { 31003, 0xf1fd }, { 31015, 0xfe2d }, { 31026, 0x77ff }, /* 0x22500 */ { 31040, 0xffdf }, { 31055, 0xf503 }, { 31063, 0x2fff }, { 31076, 0xf9fb }, { 31089, 0xe189 }, { 31096, 0xffff }, { 31112, 0xfc9f }, { 31124, 0x5edb }, { 31135, 0xe71e }, { 31145, 0xff8f }, { 31158, 0x3efd }, { 31170, 0x2ffd }, { 31182, 0x7f8a }, { 31192, 0xf9bf }, { 31205, 0x5fff }, { 31219, 0x8e26 }, /* 0x22600 */ { 31226, 0xffff }, { 31242, 0x647f }, { 31252, 0x8dc9 }, { 31260, 0xfdff }, { 31275, 0x7fff }, { 31290, 0xffc0 }, { 31300, 0x414f }, { 31307, 0xffff }, { 31323, 0xffff }, { 31339, 0xfe83 }, { 31349, 0x807f }, { 31357, 0x0c01 }, { 31360, 0xfffe }, { 31375, 0xffff }, { 31391, 0x7fff }, { 31406, 0xff81 }, /* 0x22700 */ { 31416, 0xffff }, { 31432, 0x8ccf }, { 31441, 0xffb8 }, { 31453, 0xffff }, { 31469, 0xffff }, { 31485, 0xe0bf }, { 31495, 0x67ff }, { 31508, 0x2004 }, { 31510, 0xf682 }, { 31518, 0xf7ff }, { 31533, 0xffff }, { 31549, 0xffcf }, { 31563, 0x0c1f }, { 31570, 0x3000 }, { 31572, 0xdfdf }, { 31586, 0xffff }, /* 0x22800 */ { 31602, 0xfc01 }, { 31609, 0xd7ff }, { 31623, 0x5003 }, { 31627, 0xfffe }, { 31642, 0xcfff }, { 31656, 0x43ff }, { 31667, 0xfff6 }, { 31681, 0xe118 }, { 31687, 0xb000 }, { 31690, 0xfffe }, { 31705, 0x40ff }, { 31714, 0x00ff }, { 31722, 0xfe02 }, { 31730, 0xff7f }, { 31745, 0xff07 }, { 31756, 0xf8c5 }, /* 0x22900 */ { 31765, 0xdfff }, { 31780, 0x03ef }, { 31789, 0xfff0 }, { 31801, 0x7c7f }, { 31813, 0xfc1a }, { 31822, 0xfd9f }, { 31835, 0xfbf2 }, { 31847, 0xff07 }, { 31858, 0xcbe2 }, { 31867, 0xfe79 }, { 31879, 0xdfdf }, { 31893, 0x8fc0 }, { 31900, 0x7fcf }, { 31913, 0x997e }, { 31923, 0x1ff5 }, { 31934, 0xe7f8 }, /* 0x22a00 */ { 31945, 0x7ff0 }, { 31956, 0xce3f }, { 31967, 0xb67b }, { 31978, 0x7f94 }, { 31988, 0x69f2 }, { 31997, 0x236e }, { 32005, 0x7b65 }, { 32015, 0x007f }, { 32022, 0xfffc }, { 32036, 0xf0ff }, { 32048, 0x029f }, { 32055, 0xfdf0 }, { 32066, 0x7fc5 }, { 32077, 0x0010 }, { 32078, 0xfff4 }, { 32091, 0xffff }, /* 0x22b00 */ { 32107, 0xffc9 }, { 32119, 0x4fff }, { 32132, 0x9c04 }, { 32137, 0xffff }, { 32153, 0x7fff }, { 32168, 0xfffc }, { 32182, 0x055f }, { 32190, 0x0000 }, { 32190, 0xffde }, { 32204, 0xf7ff }, { 32219, 0xc19f }, { 32228, 0xffff }, { 32244, 0x115f }, { 32252, 0x0000 }, { 32252, 0xfe08 }, { 32260, 0xffff }, /* 0x22c00 */ { 32276, 0xffff }, { 32292, 0x1fff }, { 32305, 0xff00 }, { 32313, 0x7fff }, { 32328, 0x20ad }, { 32334, 0x8000 }, { 32335, 0xdfff }, { 32350, 0xdfdf }, { 32364, 0xffff }, { 32380, 0x0167 }, { 32386, 0x0002 }, { 32387, 0x7ff9 }, { 32400, 0xebff }, { 32414, 0x077f }, { 32424, 0xfffe }, { 32439, 0x5fff }, /* 0x22d00 */ { 32453, 0x0003 }, { 32455, 0x0000 }, { 32455, 0x7fff }, { 32470, 0xffff }, { 32486, 0xe51b }, { 32495, 0xffff }, { 32511, 0x0009 }, { 32513, 0x8000 }, { 32514, 0xffff }, { 32530, 0x3fff }, { 32544, 0xffc0 }, { 32554, 0x0023 }, { 32557, 0xfb80 }, { 32565, 0x3fff }, { 32579, 0x2ff0 }, { 32588, 0xffc0 }, /* 0x22e00 */ { 32598, 0xc3ff }, { 32610, 0x037f }, { 32619, 0xfff8 }, { 32632, 0xff9f }, { 32646, 0xa817 }, { 32653, 0x87fb }, { 32664, 0xf007 }, { 32671, 0x0ebf }, { 32681, 0x9ffc }, { 32693, 0xc763 }, { 32702, 0x77e7 }, { 32714, 0x47f7 }, { 32725, 0xe51e }, { 32734, 0x6cf3 }, { 32744, 0xf6e3 }, { 32755, 0x6ede }, /* 0x22f00 */ { 32766, 0xffe0 }, { 32777, 0xf133 }, { 32786, 0xf5af }, { 32798, 0xac40 }, { 32803, 0x8fff }, { 32816, 0xe9bf }, { 32828, 0xf7f3 }, { 32841, 0x84fd }, { 32850, 0xbbfd }, { 32863, 0xfe1d }, { 32874, 0xffb9 }, { 32887, 0x77fa }, { 32899, 0x6fc0 }, { 32907, 0xcbff }, { 32920, 0x7f3b }, { 32932, 0xe3fc }, /* 0x23000 */ { 32943, 0xde47 }, { 32953, 0x6577 }, { 32963, 0xfdff }, { 32978, 0x34fa }, { 32987, 0xddce }, { 32998, 0xf7a7 }, { 33010, 0x5abf }, { 33021, 0xbdfa }, { 33033, 0x9677 }, { 33043, 0xca3a }, { 33051, 0xedff }, { 33065, 0xbf66 }, { 33076, 0xbd4f }, { 33087, 0xfb5b }, { 33099, 0xffc6 }, { 33111, 0xfba8 }, /* 0x23100 */ { 33121, 0xdf17 }, { 33132, 0xe793 }, { 33142, 0x4dd7 }, { 33152, 0xdbf7 }, { 33165, 0x5fd7 }, { 33177, 0xfc4f }, { 33188, 0xffff }, { 33204, 0x7f9e }, { 33216, 0x0e7a }, { 33224, 0x7ffc }, { 33237, 0x0bc9 }, { 33244, 0xfffc }, { 33258, 0xf841 }, { 33265, 0x043f }, { 33272, 0xdffc }, { 33285, 0xfc4f }, /* 0x23200 */ { 33296, 0xa19f }, { 33305, 0x8000 }, { 33306, 0x47f3 }, { 33316, 0x7fe0 }, { 33326, 0x051f }, { 33333, 0x1ffe }, { 33345, 0x3ff8 }, { 33356, 0xfc01 }, { 33363, 0x805e }, { 33369, 0xee73 }, { 33380, 0xc1fb }, { 33390, 0x255f }, { 33399, 0xbf30 }, { 33408, 0xc1f9 }, { 33417, 0xfc28 }, { 33425, 0x85fc }, /* 0x23300 */ { 33434, 0xe1b8 }, { 33442, 0x93c8 }, { 33449, 0xbffc }, { 33462, 0x798f }, { 33472, 0x91d8 }, { 33479, 0xfb5e }, { 33491, 0x58ff }, { 33502, 0x17f8 }, { 33511, 0x3e36 }, { 33520, 0x9f9d }, { 33531, 0x723b }, { 33540, 0xbf7e }, { 33553, 0x0fef }, { 33564, 0xfff7 }, { 33579, 0xffa3 }, { 33591, 0x6b4f }, /* 0x23400 */ { 33601, 0xff8b }, { 33613, 0xff8f }, { 33626, 0x07ff }, { 33637, 0xffe1 }, { 33649, 0x801f }, { 33655, 0xfffe }, { 33670, 0xed3f }, { 33682, 0xe306 }, { 33689, 0x83ff }, { 33700, 0xffff }, { 33716, 0xbfff }, { 33731, 0x9fc0 }, { 33739, 0xffff }, { 33755, 0xffff }, { 33771, 0xff83 }, { 33782, 0xffff }, /* 0x23500 */ { 33798, 0xffff }, { 33814, 0x007e }, { 33820, 0xf800 }, { 33825, 0xfffe }, { 33840, 0x7fff }, { 33855, 0xfa0f }, { 33865, 0xffff }, { 33881, 0x9fff }, { 33895, 0x048f }, { 33901, 0x0029 }, { 33904, 0xff78 }, { 33916, 0xfff7 }, { 33931, 0x000e }, { 33934, 0xfff1 }, { 33947, 0xffff }, { 33963, 0x0db9 }, /* 0x23600 */ { 33971, 0xe8a1 }, { 33978, 0xfff7 }, { 33993, 0xffff }, { 34009, 0x880f }, { 34015, 0xfffe }, { 34030, 0x0a7f }, { 34039, 0x0010 }, { 34040, 0xf87f }, { 34052, 0xffff }, { 34068, 0xfff7 }, { 34083, 0x877f }, { 34094, 0xffff }, { 34110, 0xffff }, { 34126, 0x8543 }, { 34132, 0x5800 }, { 34135, 0xbfff }, /* 0x23700 */ { 34150, 0xe1ff }, { 34162, 0xffff }, { 34178, 0x91f8 }, { 34186, 0x9600 }, { 34190, 0xfffe }, { 34205, 0x7fff }, { 34220, 0xffa0 }, { 34230, 0x5aff }, { 34242, 0x1ac2 }, { 34248, 0xffff }, { 34264, 0xfff8 }, { 34277, 0x98e5 }, { 34285, 0xfff4 }, { 34298, 0xff07 }, { 34309, 0x910f }, { 34316, 0x7f7d }, /* 0x23800 */ { 34329, 0xdffe }, { 34343, 0xfe11 }, { 34352, 0x7fe3 }, { 34364, 0xffa0 }, { 34374, 0xf679 }, { 34385, 0x591f }, { 34394, 0x6fad }, { 34405, 0x1dde }, { 34415, 0xfeff }, { 34430, 0xff9f }, { 34444, 0xf7cf }, { 34457, 0xac3f }, { 34467, 0xff7f }, { 34482, 0xe3ef }, { 34494, 0x9bff }, { 34507, 0xffff }, /* 0x23900 */ { 34523, 0xffbf }, { 34538, 0x77b7 }, { 34550, 0x723f }, { 34560, 0xdef6 }, { 34572, 0xffbf }, { 34587, 0x3bff }, { 34600, 0x2fed }, { 34611, 0xff3c }, { 34623, 0x0fbe }, { 34633, 0xf7f0 }, { 34644, 0x81f6 }, { 34652, 0xbfe6 }, { 34664, 0xfeff }, { 34679, 0xe07f }, { 34689, 0xffff }, { 34705, 0xfbff }, /* 0x23a00 */ { 34720, 0xffeb }, { 34734, 0xffc7 }, { 34747, 0x837f }, { 34757, 0x2bfe }, { 34768, 0xfbf8 }, { 34780, 0xe3ff }, { 34793, 0xbf3f }, { 34806, 0xdcdf }, { 34818, 0xf96d }, { 34829, 0x9aff }, { 34841, 0xf6fb }, { 34854, 0xfbef }, { 34868, 0x30e3 }, { 34875, 0xc74f }, { 34885, 0xbbfe }, { 34898, 0xf711 }, /* 0x23b00 */ { 34907, 0xff7f }, { 34922, 0xdcff }, { 34935, 0xfffe }, { 34950, 0xff2f }, { 34963, 0xfeb7 }, { 34976, 0xf43f }, { 34987, 0x7fef }, { 35001, 0xfffe }, { 35016, 0xff07 }, { 35027, 0xffbf }, { 35042, 0xff98 }, { 35053, 0x3e1f }, { 35063, 0xffe4 }, { 35075, 0xbbee }, { 35087, 0xfff4 }, { 35100, 0xff87 }, /* 0x23c00 */ { 35112, 0x7e47 }, { 35122, 0xdc5f }, { 35133, 0x7d1f }, { 35144, 0xdbc6 }, { 35154, 0xdfb1 }, { 35165, 0xdf7f }, { 35179, 0xcc7b }, { 35189, 0x03f4 }, { 35196, 0xcbdf }, { 35208, 0xe03f }, { 35217, 0xffa3 }, { 35229, 0xfffd }, { 35244, 0xfc37 }, { 35255, 0x2fff }, { 35268, 0xfff8 }, { 35281, 0x00ff }, /* 0x23d00 */ { 35289, 0xfffe }, { 35304, 0xe077 }, { 35313, 0xffff }, { 35329, 0x5fff }, { 35343, 0xfffc }, { 35357, 0x7fff }, { 35372, 0x1354 }, { 35378, 0xff8a }, { 35389, 0xffff }, { 35405, 0xff7f }, { 35420, 0x007e }, { 35426, 0xc020 }, { 35429, 0xffff }, { 35445, 0xafff }, { 35459, 0x02d6 }, { 35465, 0xf860 }, /* 0x23e00 */ { 35472, 0xffff }, { 35488, 0xffff }, { 35504, 0x0003 }, { 35506, 0xfffc }, { 35520, 0x76df }, { 35532, 0xec00 }, { 35537, 0xffff }, { 35553, 0xfffe }, { 35568, 0xf003 }, { 35574, 0xffff }, { 35590, 0x97ff }, { 35603, 0x8057 }, { 35609, 0xb400 }, { 35613, 0xffff }, { 35629, 0xffff }, { 35645, 0x8007 }, /* 0x23f00 */ { 35649, 0xffff }, { 35665, 0xafff }, { 35679, 0x000f }, { 35683, 0x8820 }, { 35686, 0xdff8 }, { 35698, 0xffff }, { 35714, 0xffff }, { 35730, 0x2079 }, { 35736, 0xfff0 }, { 35748, 0xffff }, { 35764, 0x7f0f }, { 35775, 0x0081 }, { 35777, 0xffe2 }, { 35789, 0xffff }, { 35805, 0x001f }, { 35810, 0xfffe }, /* 0x24000 */ { 35825, 0x49f3 }, { 35834, 0x8002 }, { 35836, 0xffff }, { 35852, 0xc2ff }, { 35863, 0x37ff }, { 35876, 0xf481 }, { 35883, 0xfffe }, { 35898, 0xffff }, { 35914, 0xc4ff }, { 35925, 0xffff }, { 35941, 0x806e }, { 35947, 0xefff }, { 35962, 0xfc17 }, { 35972, 0x07bf }, { 35982, 0xbe08 }, { 35989, 0x7bf7 }, /* 0x24100 */ { 36002, 0xc2e0 }, { 36008, 0xfffb }, { 36023, 0x1f5f }, { 36034, 0x2ff8 }, { 36044, 0x7cee }, { 36055, 0x2f06 }, { 36062, 0x6f5f }, { 36074, 0xfb9f }, { 36087, 0xef7d }, { 36100, 0xe5f7 }, { 36112, 0xbfc0 }, { 36121, 0xf017 }, { 36129, 0xff83 }, { 36140, 0xafff }, { 36154, 0x8807 }, { 36159, 0xe0ff }, /* 0x24200 */ { 36170, 0xffff }, { 36186, 0x0967 }, { 36193, 0xffec }, { 36206, 0xfe07 }, { 36216, 0x07ff }, { 36227, 0xa202 }, { 36231, 0xfefe }, { 36245, 0xfe00 }, { 36252, 0xffff }, { 36268, 0x1bff }, { 36280, 0x8020 }, { 36282, 0xfff4 }, { 36295, 0xf8df }, { 36307, 0xffff }, { 36323, 0x97ff }, { 36336, 0x040b }, /* 0x24300 */ { 36340, 0xff8a }, { 36351, 0xf87f }, { 36363, 0xffff }, { 36379, 0x3f7f }, { 36392, 0xe100 }, { 36396, 0x3ff9 }, { 36408, 0xffc4 }, { 36419, 0xdfff }, { 36434, 0x1034 }, { 36438, 0xe5c0 }, { 36445, 0xffff }, { 36461, 0xc1bf }, { 36471, 0xffff }, { 36487, 0xefbf }, { 36501, 0xe201 }, { 36506, 0xfff1 }, /* 0x24400 */ { 36519, 0xfff1 }, { 36532, 0xc0a7 }, { 36539, 0xbfc4 }, { 36549, 0xff8f }, { 36562, 0xcc6f }, { 36572, 0xf0dd }, { 36582, 0x0185 }, { 36586, 0xf7ff }, { 36601, 0xff47 }, { 36613, 0x5089 }, { 36618, 0x58de }, { 36627, 0x7de8 }, { 36637, 0x873f }, { 36647, 0xf6f5 }, { 36659, 0xfde3 }, { 36671, 0x79de }, /* 0x24500 */ { 36682, 0xd4ff }, { 36694, 0x11bf }, { 36703, 0x57fd }, { 36715, 0x033f }, { 36723, 0xeb2d }, { 36733, 0xffeb }, { 36747, 0xefff }, { 36762, 0x7eff }, { 36776, 0xffee }, { 36790, 0x7ffb }, { 36804, 0xfffd }, { 36819, 0x7c9f }, { 36830, 0xffb7 }, { 36844, 0x1f82 }, { 36851, 0xffef }, { 36866, 0xbdfa }, /* 0x24600 */ { 36878, 0xf339 }, { 36888, 0xfff3 }, { 36902, 0xf8ff }, { 36915, 0xff1d }, { 36927, 0xb61d }, { 36936, 0xf9bf }, { 36949, 0x2dd7 }, { 36959, 0x0fbf }, { 36970, 0xff1c }, { 36981, 0x437f }, { 36991, 0xff01 }, { 37000, 0xff7f }, { 37015, 0xff04 }, { 37024, 0x8823 }, { 37029, 0x8afe }, { 37039, 0xee5f }, /* 0x24700 */ { 37051, 0xbbbd }, { 37063, 0x3ed7 }, { 37074, 0x895e }, { 37082, 0xffff }, { 37098, 0xb04f }, { 37106, 0xdfff }, { 37121, 0xd17b }, { 37131, 0xffff }, { 37147, 0x8177 }, { 37155, 0xfe80 }, { 37163, 0xb02f }, { 37171, 0xc305 }, { 37177, 0xfffb }, { 37192, 0xf6b7 }, { 37204, 0x3fff }, { 37218, 0x2d7c }, /* 0x24800 */ { 37227, 0xe480 }, { 37232, 0xf7ff }, { 37247, 0x1bf3 }, { 37257, 0xfe20 }, { 37265, 0x60ff }, { 37275, 0xf383 }, { 37284, 0x7fff }, { 37299, 0xbe7f }, { 37312, 0xfe28 }, { 37321, 0x77ff }, { 37335, 0x87cf }, { 37345, 0x0fff }, { 37357, 0x6f2b }, { 37367, 0xbb8f }, { 37378, 0xcfdd }, { 37390, 0x1fb5 }, /* 0x24900 */ { 37400, 0xf97c }, { 37411, 0xfd0f }, { 37422, 0x9d3f }, { 37433, 0x1fe6 }, { 37443, 0xfff8 }, { 37456, 0x1ff0 }, { 37465, 0x3ff0 }, { 37475, 0xfbf2 }, { 37487, 0x002b }, { 37491, 0xffff }, { 37507, 0xf977 }, { 37519, 0xf01f }, { 37528, 0xffff }, { 37544, 0xc2df }, { 37554, 0xfcfd }, { 37567, 0xfc05 }, /* 0x24a00 */ { 37575, 0xbfff }, { 37590, 0x3ff9 }, { 37602, 0xf800 }, { 37607, 0x7f3f }, { 37620, 0x0bff }, { 37631, 0xfffc }, { 37645, 0xfff8 }, { 37658, 0xf837 }, { 37668, 0xf8ff }, { 37681, 0xff81 }, { 37691, 0x7f7d }, { 37704, 0xf7f0 }, { 37715, 0x377f }, { 37727, 0x9df1 }, { 37737, 0xff78 }, { 37749, 0x7dff }, /* 0x24b00 */ { 37763, 0xfb9e }, { 37775, 0x3fc7 }, { 37786, 0xf75f }, { 37799, 0xdef1 }, { 37810, 0xf07f }, { 37821, 0xf9bf }, { 37834, 0x17ef }, { 37845, 0xfe19 }, { 37855, 0xefe1 }, { 37866, 0x3f59 }, { 37876, 0xefc6 }, { 37887, 0x3f2f }, { 37898, 0x7b8b }, { 37908, 0xeff9 }, { 37921, 0xdcdf }, { 37933, 0x729c }, /* 0x24c00 */ { 37941, 0x65f9 }, { 37951, 0xeaa3 }, { 37960, 0xff3f }, { 37974, 0xff7f }, { 37989, 0xf801 }, { 37995, 0xc7e5 }, { 38005, 0xfff8 }, { 38018, 0x704b }, { 38025, 0xe9f8 }, { 38035, 0x3fff }, { 38049, 0xf88b }, { 38058, 0xefe7 }, { 38071, 0xbf21 }, { 38080, 0x8dfc }, { 38090, 0xfe13 }, { 38100, 0xde4c }, /* 0x24d00 */ { 38109, 0x59bf }, { 38120, 0xf3ef }, { 38133, 0xcff3 }, { 38145, 0xff9f }, { 38159, 0x398f }, { 38168, 0xff92 }, { 38179, 0x2fff }, { 38192, 0xff80 }, { 38201, 0x1e7f }, { 38212, 0xfff8 }, { 38225, 0x3f3f }, { 38237, 0x00c0 }, { 38239, 0xffff }, { 38255, 0x7ffb }, { 38269, 0x0021 }, { 38271, 0xfb80 }, /* 0x24e00 */ { 38279, 0xffff }, { 38295, 0xe3fe }, { 38307, 0xfe15 }, { 38317, 0xffff }, { 38333, 0xa27c }, { 38341, 0xf800 }, { 38346, 0x9fff }, { 38360, 0x0a5b }, { 38367, 0xfff3 }, { 38381, 0x3fff }, { 38395, 0x03c2 }, { 38400, 0xff80 }, { 38409, 0x23ff }, { 38420, 0x7fe0 }, { 38430, 0xc12e }, { 38437, 0x07fe }, /* 0x24f00 */ { 38447, 0x38ff }, { 38458, 0xb7c7 }, { 38469, 0xbfbf }, { 38483, 0x7687 }, { 38492, 0x77ce }, { 38503, 0xef57 }, { 38515, 0x97f3 }, { 38526, 0xbe81 }, { 38534, 0xff08 }, { 38543, 0x7b20 }, { 38550, 0x3dff }, { 38563, 0x795c }, { 38572, 0xcfe9 }, { 38583, 0xbfe7 }, { 38596, 0x5fa7 }, { 38607, 0x86fc }, /* 0x25000 */ { 38616, 0xefde }, { 38629, 0xdff3 }, { 38642, 0xb97e }, { 38653, 0xb677 }, { 38664, 0xdbff }, { 38678, 0xdf7f }, { 38692, 0xfffb }, { 38707, 0x9fdb }, { 38719, 0xf5f9 }, { 38731, 0xdffb }, { 38745, 0x73f3 }, { 38756, 0xd7ee }, { 38768, 0x6fbf }, { 38781, 0x13fc }, { 38790, 0x1ff2 }, { 38800, 0x3ffc }, /* 0x25100 */ { 38812, 0xfffd }, { 38827, 0x7bff }, { 38841, 0x02b8 }, { 38846, 0xfffe }, { 38861, 0x7e13 }, { 38870, 0xff88 }, { 38880, 0x7fef }, { 38894, 0x324f }, { 38902, 0xfbe0 }, { 38912, 0xffff }, { 38928, 0x1c7f }, { 38938, 0x0069 }, { 38942, 0xfef8 }, { 38954, 0xff7f }, { 38969, 0x4f13 }, { 38977, 0xc030 }, /* 0x25200 */ { 38981, 0xffed }, { 38995, 0x1fff }, { 39008, 0x07fc }, { 39017, 0xf980 }, { 39024, 0xffff }, { 39040, 0xffff }, { 39056, 0x007c }, { 39061, 0xfff1 }, { 39074, 0x47f7 }, { 39085, 0x0021 }, { 39087, 0xfd80 }, { 39095, 0xffff }, { 39111, 0x271f }, { 39120, 0xfe01 }, { 39128, 0xbf3f }, { 39141, 0x8801 }, /* 0x25300 */ { 39144, 0xffff }, { 39160, 0xfcf1 }, { 39171, 0xe70e }, { 39180, 0xfc67 }, { 39191, 0x9e5f }, { 39202, 0xc6b8 }, { 39210, 0xffbf }, { 39225, 0xffef }, { 39240, 0xfefd }, { 39254, 0x17fd }, { 39265, 0x1ff2 }, { 39275, 0xff7f }, { 39290, 0xc207 }, { 39296, 0xf792 }, { 39306, 0x9c07 }, { 39313, 0x78ff }, /* 0x25400 */ { 39325, 0x001b }, { 39329, 0x7fea }, { 39341, 0x1e3f }, { 39351, 0x35fe }, { 39362, 0xfff3 }, { 39376, 0x7f9f }, { 39389, 0xd20c }, { 39395, 0xff7d }, { 39409, 0xbfd7 }, { 39422, 0x5054 }, { 39427, 0xff90 }, { 39437, 0x3e7f }, { 39449, 0xfcc3 }, { 39459, 0xfcff }, { 39473, 0x20ff }, { 39482, 0xfc02 }, /* 0x25500 */ { 39489, 0x07ff }, { 39500, 0xfffd }, { 39515, 0xff0d }, { 39526, 0x07ff }, { 39537, 0xfbe8 }, { 39548, 0xc5fb }, { 39559, 0x3fe3 }, { 39570, 0xffff }, { 39586, 0x9ffc }, { 39598, 0xff80 }, { 39607, 0xdc7f }, { 39619, 0xfa9b }, { 39630, 0x027f }, { 39638, 0xeb4c }, { 39647, 0xfc0e }, { 39656, 0xcd96 }, /* 0x25600 */ { 39665, 0x637a }, { 39674, 0x7e60 }, { 39682, 0x7850 }, { 39688, 0xff03 }, { 39698, 0xfe14 }, { 39707, 0x3ff0 }, { 39717, 0xf910 }, { 39724, 0x1f87 }, { 39733, 0xff08 }, { 39742, 0x17ff }, { 39754, 0x0fc0 }, { 39760, 0x03ff }, { 39770, 0xfdef }, { 39784, 0xff10 }, { 39793, 0xc01f }, { 39800, 0xbfbf }, /* 0x25700 */ { 39814, 0x9fbe }, { 39826, 0xccbe }, { 39836, 0x9ee9 }, { 39846, 0xff9f }, { 39860, 0xbdba }, { 39871, 0x7d7d }, { 39883, 0xfffc }, { 39897, 0xde78 }, { 39907, 0x037f }, { 39916, 0xff84 }, { 39926, 0x8207 }, { 39931, 0xfffe }, { 39946, 0xe0a0 }, { 39951, 0x5fff }, { 39965, 0x03fc }, { 39973, 0xed80 }, /* 0x25800 */ { 39980, 0xffff }, { 39996, 0x01ff }, { 40005, 0x0006 }, { 40007, 0xf6fe }, { 40020, 0x1feb }, { 40031, 0xbc10 }, { 40037, 0xffff }, { 40053, 0x0279 }, { 40059, 0xfd83 }, { 40069, 0x7f7e }, { 40082, 0x6080 }, { 40085, 0xbff3 }, { 40098, 0x003f }, { 40104, 0xd7c8 }, { 40113, 0xffe1 }, { 40125, 0x40bf }, /* 0x25900 */ { 40133, 0x5cef }, { 40144, 0xd7fe }, { 40157, 0x6f9c }, { 40167, 0xfff3 }, { 40181, 0xff8e }, { 40193, 0x4f9f }, { 40204, 0x7fff }, { 40219, 0xffc0 }, { 40229, 0xfdff }, { 40244, 0xf80b }, { 40252, 0xe7f7 }, { 40265, 0xff67 }, { 40278, 0x84e0 }, { 40283, 0xfffd }, { 40298, 0xf025 }, { 40305, 0xbfff }, /* 0x25a00 */ { 40320, 0xe40f }, { 40328, 0x05ff }, { 40338, 0x7c0e }, { 40346, 0xb9ff }, { 40359, 0xdd0f }, { 40369, 0x1bfd }, { 40380, 0x7fff }, { 40395, 0xdb7e }, { 40407, 0xffdf }, { 40422, 0x8f3f }, { 40433, 0xf7f3 }, { 40446, 0xf86f }, { 40457, 0xe708 }, { 40464, 0xff47 }, { 40476, 0xe1e7 }, { 40486, 0xfffb }, /* 0x25b00 */ { 40501, 0xf0bf }, { 40512, 0xeeff }, { 40526, 0xfc7e }, { 40538, 0xfbff }, { 40553, 0x0fff }, { 40565, 0xffff }, { 40581, 0xfdff }, { 40596, 0xff83 }, { 40607, 0xf03f }, { 40617, 0x7fff }, { 40632, 0xeffd }, { 40646, 0xffe0 }, { 40657, 0x0047 }, { 40661, 0xffff }, { 40677, 0xffff }, { 40693, 0xf7ff }, /* 0x25c00 */ { 40708, 0xfa64 }, { 40717, 0xffff }, { 40733, 0xffff }, { 40749, 0xffff }, { 40765, 0xf0f7 }, { 40776, 0xffff }, { 40792, 0x025f }, { 40799, 0xffe8 }, { 40811, 0xfff3 }, { 40825, 0xffe7 }, { 40839, 0xdfff }, { 40854, 0x3fff }, { 40868, 0xffc1 }, { 40879, 0xffff }, { 40895, 0xffff }, { 40911, 0x87ff }, /* 0x25d00 */ { 40923, 0xffff }, { 40939, 0xe018 }, { 40944, 0xffff }, { 40960, 0xeff7 }, { 40974, 0x7ff0 }, { 40985, 0xf009 }, { 40991, 0xffff }, { 41007, 0x2f7f }, { 41019, 0xfdc0 }, { 41028, 0xffff }, { 41044, 0x0ff8 }, { 41053, 0xfff0 }, { 41065, 0xf3ff }, { 41079, 0xfff3 }, { 41093, 0xff1f }, { 41106, 0xf1f7 }, /* 0x25e00 */ { 41118, 0xcfa9 }, { 41128, 0x13d3 }, { 41136, 0xbbee }, { 41148, 0x7ffb }, { 41162, 0xffee }, { 41176, 0xf467 }, { 41186, 0x29d7 }, { 41195, 0xfffc }, { 41209, 0x0bf0 }, { 41216, 0xff80 }, { 41225, 0xff9f }, { 41239, 0x115f }, { 41247, 0xfffe }, { 41262, 0x1e7f }, { 41273, 0xfff0 }, { 41285, 0x800f }, /* 0x25f00 */ { 41290, 0xf3ff }, { 41304, 0xff0f }, { 41316, 0x01f7 }, { 41324, 0xffe0 }, { 41335, 0x8eef }, { 41346, 0x6fe3 }, { 41357, 0xf0e8 }, { 41365, 0xffdf }, { 41380, 0xf7f7 }, { 41394, 0x7e5f }, { 41406, 0xffff }, { 41422, 0x0dfd }, { 41432, 0xfff8 }, { 41445, 0x93ef }, { 41456, 0xffc2 }, { 41467, 0xf7ff }, /* 0x26000 */ { 41482, 0x02ff }, { 41491, 0xfffc }, { 41505, 0xf0ff }, { 41517, 0x00ff }, { 41525, 0xff58 }, { 41536, 0x7fff }, { 41551, 0xfff2 }, { 41564, 0x0013 }, { 41567, 0xfbff }, { 41582, 0xffbf }, { 41597, 0xffc7 }, { 41610, 0x00b3 }, { 41615, 0xfffa }, { 41629, 0xfbff }, { 41644, 0x01fd }, { 41652, 0x07ff }, /* 0x26100 */ { 41663, 0xfe00 }, { 41670, 0x1fff }, { 41683, 0x7ffc }, { 41696, 0xf006 }, { 41702, 0xffff }, { 41718, 0xe03f }, { 41727, 0x15bf }, { 41737, 0xffe8 }, { 41749, 0xff7f }, { 41764, 0xf8ff }, { 41777, 0x9eff }, { 41790, 0xf87f }, { 41802, 0xdf3f }, { 41815, 0xdffa }, { 41828, 0x1faf }, { 41839, 0xffdf }, /* 0x26200 */ { 41854, 0x00eb }, { 41860, 0x0000 }, { 41860, 0xfbec }, { 41872, 0xdf7f }, { 41886, 0xdbb7 }, { 41898, 0xeeef }, { 41911, 0xfefd }, { 41925, 0xdbbc }, { 41936, 0xeb8f }, { 41947, 0xf3ff }, { 41961, 0xef9f }, { 41974, 0xf078 }, { 41982, 0x3ff4 }, { 41993, 0xffc7 }, { 42006, 0xf99f }, { 42018, 0xfbbf }, /* 0x26300 */ { 42032, 0xe66f }, { 42043, 0xfaff }, { 42057, 0x7f1f }, { 42069, 0xddfe }, { 42082, 0xfdcf }, { 42095, 0xfdf7 }, { 42109, 0xf7e6 }, { 42121, 0xfe05 }, { 42130, 0x2fe9 }, { 42140, 0x27f0 }, { 42148, 0x8afc }, { 42157, 0x9f9b }, { 42168, 0xffea }, { 42181, 0xf7e3 }, { 42193, 0xaf8f }, { 42204, 0x7ff5 }, /* 0x26400 */ { 42217, 0x7ffd }, { 42231, 0x5ffb }, { 42244, 0xf7fc }, { 42257, 0x7fef }, { 42271, 0xffd1 }, { 42283, 0xff3f }, { 42297, 0x1fff }, { 42310, 0xff7f }, { 42325, 0xfdf8 }, { 42337, 0xbe7f }, { 42350, 0xf77d }, { 42363, 0x7dce }, { 42374, 0xd01b }, { 42381, 0x67df }, { 42393, 0xff71 }, { 42405, 0x7fb3 }, /* 0x26500 */ { 42417, 0xfa7f }, { 42430, 0xfdbf }, { 42444, 0xbf7f }, { 42458, 0xf3af }, { 42470, 0xfdbf }, { 42484, 0x7dff }, { 42498, 0xffe7 }, { 42512, 0xffe6 }, { 42525, 0x7f3d }, { 42537, 0x1fff }, { 42550, 0x9ffc }, { 42562, 0xf27f }, { 42574, 0x27ff }, { 42586, 0x87ff }, { 42598, 0x9fff }, { 42612, 0x43fe }, /* 0x26600 */ { 42622, 0xefff }, { 42637, 0xe93f }, { 42648, 0xff0d }, { 42659, 0xedfc }, { 42671, 0x2fff }, { 42684, 0x99ff }, { 42696, 0xff87 }, { 42708, 0x9fff }, { 42722, 0x73ff }, { 42735, 0xff1e }, { 42747, 0x7fff }, { 42762, 0x2ffc }, { 42773, 0xc03e }, { 42780, 0xfffd }, { 42795, 0x7efb }, { 42808, 0x02d8 }, /* 0x26700 */ { 42813, 0xfddc }, { 42825, 0x9fff }, { 42839, 0x17ff }, { 42851, 0xee68 }, { 42860, 0x8002 }, { 42862, 0xffff }, { 42878, 0xffff }, { 42894, 0xfdff }, { 42909, 0x0ab3 }, { 42916, 0xfee0 }, { 42926, 0xbfff }, { 42941, 0x3fe7 }, { 42953, 0x0003 }, { 42955, 0xbb30 }, { 42963, 0xbeff }, { 42977, 0x0019 }, /* 0x26800 */ { 42980, 0xffff }, { 42996, 0xd6ff }, { 43009, 0x1b31 }, { 43016, 0xdf80 }, { 43024, 0xf1ef }, { 43036, 0x19bf }, { 43046, 0x3f00 }, { 43052, 0xfff7 }, { 43067, 0xf52f }, { 43078, 0x3ff3 }, { 43090, 0xbff0 }, { 43101, 0xbf00 }, { 43108, 0xbfe3 }, { 43120, 0xfc4f }, { 43131, 0x7a13 }, { 43139, 0xfffe }, /* 0x26900 */ { 43154, 0xf47d }, { 43165, 0xef75 }, { 43177, 0x1ffe }, { 43189, 0x9efc }, { 43200, 0xdff6 }, { 43213, 0xebbf }, { 43226, 0x6be7 }, { 43237, 0xfffc }, { 43251, 0xd7ff }, { 43265, 0xffeb }, { 43279, 0xfebf }, { 43293, 0xff7f }, { 43308, 0xd7f7 }, { 43321, 0xa4fb }, { 43331, 0x6dff }, { 43344, 0xdb7b }, /* 0x26a00 */ { 43356, 0xfffb }, { 43371, 0xb7fd }, { 43384, 0xf5df }, { 43397, 0xf4f7 }, { 43409, 0xff98 }, { 43420, 0xf318 }, { 43428, 0x1fff }, { 43441, 0x7ff6 }, { 43454, 0x6ff0 }, { 43464, 0x3ffe }, { 43477, 0xfeb0 }, { 43487, 0xe1c7 }, { 43496, 0xddff }, { 43510, 0x7eb7 }, { 43522, 0xbffd }, { 43536, 0xffdf }, /* 0x26b00 */ { 43551, 0xfbff }, { 43566, 0xfff9 }, { 43580, 0xfeff }, { 43595, 0xffbf }, { 43610, 0x0bff }, { 43621, 0x3ff0 }, { 43631, 0xfb04 }, { 43639, 0xffff }, { 43655, 0xffff }, { 43671, 0xff0f }, { 43683, 0xffff }, { 43699, 0xffa8 }, { 43710, 0xffff }, { 43726, 0xff7e }, { 43740, 0xff7f }, { 43755, 0xff1f }, /* 0x26c00 */ { 43768, 0xffff }, { 43784, 0x6bff }, { 43797, 0xfc82 }, { 43805, 0xffff }, { 43821, 0xffbf }, { 43836, 0xdfff }, { 43851, 0xffff }, { 43867, 0x1ffd }, { 43879, 0xfff8 }, { 43892, 0xffff }, { 43908, 0x97ff }, { 43921, 0x20c1 }, { 43925, 0xffff }, { 43941, 0xffff }, { 43957, 0x7fff }, { 43972, 0xffff }, /* 0x26d00 */ { 43988, 0xffa7 }, { 44001, 0xffff }, { 44017, 0xf801 }, { 44023, 0xffff }, { 44039, 0x7fff }, { 44054, 0xe007 }, { 44060, 0xfffe }, { 44075, 0xffff }, { 44091, 0xfff7 }, { 44106, 0x0fff }, { 44118, 0xff00 }, { 44126, 0xffff }, { 44142, 0xffff }, { 44158, 0xefbf }, { 44172, 0x040b }, { 44176, 0xbfff }, /* 0x26e00 */ { 44191, 0xffdf }, { 44206, 0xffff }, { 44222, 0xffdf }, { 44237, 0x07ff }, { 44248, 0xffc0 }, { 44258, 0xffff }, { 44274, 0x451e }, { 44281, 0xe084 }, { 44286, 0xffd7 }, { 44300, 0xffff }, { 44316, 0xffff }, { 44332, 0xffff }, { 44348, 0x3fff }, { 44362, 0xff00 }, { 44370, 0xffff }, { 44386, 0xffff }, /* 0x26f00 */ { 44402, 0xfcff }, { 44416, 0x0227 }, { 44421, 0xfe16 }, { 44431, 0xffff }, { 44447, 0xdfff }, { 44462, 0xffff }, { 44478, 0x5fff }, { 44492, 0xffe2 }, { 44504, 0xffff }, { 44520, 0x8895 }, { 44526, 0xf482 }, { 44533, 0xffff }, { 44549, 0xff7f }, { 44564, 0x03ff }, { 44574, 0xffff }, { 44590, 0xfe3f }, /* 0x27000 */ { 44603, 0x20f7 }, { 44611, 0x2ff0 }, { 44620, 0xffff }, { 44636, 0xffbf }, { 44651, 0xbfff }, { 44666, 0xfff2 }, { 44679, 0xffff }, { 44695, 0xf801 }, { 44701, 0xff7f }, { 44716, 0xffff }, { 44732, 0x03ba }, { 44739, 0xffff }, { 44755, 0xc3ff }, { 44767, 0xffff }, { 44783, 0xdfff }, { 44798, 0xfe01 }, /* 0x27100 */ { 44806, 0xeaff }, { 44819, 0xffff }, { 44835, 0x7f0f }, { 44846, 0xffc0 }, { 44856, 0xffff }, { 44872, 0xffdf }, { 44887, 0xc7c7 }, { 44897, 0x7ddf }, { 44910, 0xefea }, { 44922, 0x7fff }, { 44937, 0x1ff9 }, { 44948, 0xfc7e }, { 44960, 0x2ffe }, { 44972, 0xf1bf }, { 44984, 0x3fff }, { 44998, 0xf83e }, /* 0x27200 */ { 45008, 0x6bcb }, { 45018, 0xf5ef }, { 45031, 0xffb9 }, { 45044, 0xfff1 }, { 45057, 0xffff }, { 45073, 0xd9e3 }, { 45083, 0xffff }, { 45099, 0xf8f9 }, { 45110, 0xe1ef }, { 45121, 0xffff }, { 45137, 0xfbff }, { 45152, 0x9fc3 }, { 45162, 0xff00 }, { 45170, 0xfbff }, { 45185, 0xff83 }, { 45196, 0x0009 }, /* 0x27300 */ { 45198, 0xfffa }, { 45212, 0xbfff }, { 45227, 0x3fdf }, { 45240, 0xaff0 }, { 45250, 0x0000 }, { 45250, 0xfffe }, { 45265, 0xffff }, { 45281, 0xffff }, { 45297, 0xff1f }, { 45310, 0xc59f }, { 45320, 0xff7e }, { 45334, 0xffff }, { 45350, 0xffff }, { 45366, 0xf03f }, { 45376, 0x175f }, { 45386, 0xff00 }, /* 0x27400 */ { 45394, 0xfff7 }, { 45409, 0xffff }, { 45425, 0xeff8 }, { 45437, 0x007a }, { 45442, 0xfff1 }, { 45455, 0xf7ff }, { 45470, 0xffff }, { 45486, 0xff1f }, { 45499, 0xc15e }, { 45507, 0xfdff }, { 45522, 0x0ffe }, { 45533, 0xfffc }, { 45547, 0xdf00 }, { 45554, 0xffff }, { 45570, 0x18fe }, { 45579, 0xfffe }, /* 0x27500 */ { 45594, 0xc1df }, { 45604, 0xe13f }, { 45614, 0xddff }, { 45628, 0x24ff }, { 45638, 0xfffe }, { 45653, 0xf9f7 }, { 45666, 0xc1ff }, { 45677, 0xf7ff }, { 45692, 0xfdf5 }, { 45705, 0xfffe }, { 45720, 0xbf90 }, { 45729, 0x7ffc }, { 45742, 0xffdf }, { 45757, 0xfff7 }, { 45772, 0xffee }, { 45786, 0x8ffe }, /* 0x27600 */ { 45798, 0xef7f }, { 45812, 0xf64f }, { 45823, 0xffff }, { 45839, 0x7cf9 }, { 45850, 0xffff }, { 45866, 0xff07 }, { 45877, 0xffbf }, { 45892, 0xc2ac }, { 45899, 0xffff }, { 45915, 0x7fe7 }, { 45928, 0xfffa }, { 45942, 0xf7ff }, { 45957, 0xe009 }, { 45962, 0xffff }, { 45978, 0x1fff }, { 45991, 0xff0f }, /* 0x27700 */ { 46003, 0x2dff }, { 46015, 0xe026 }, { 46021, 0xfaff }, { 46035, 0xe187 }, { 46043, 0xbfff }, { 46058, 0x0fff }, { 46070, 0xfc0c }, { 46078, 0xffff }, { 46094, 0xf1c7 }, { 46104, 0xfafd }, { 46117, 0xffc6 }, { 46129, 0x3fef }, { 46142, 0xf78c }, { 46152, 0xcff7 }, { 46165, 0xefca }, { 46176, 0xff9e }, /* 0x27800 */ { 46189, 0xdadf }, { 46201, 0xffef }, { 46216, 0x6f0f }, { 46226, 0xf82f }, { 46236, 0xf979 }, { 46247, 0x29ef }, { 46257, 0xffff }, { 46273, 0xef8e }, { 46284, 0xe77f }, { 46297, 0x777c }, { 46308, 0xe9ff }, { 46321, 0xffbe }, { 46335, 0xe3ff }, { 46348, 0x5fff }, { 46362, 0xff2e }, { 46374, 0x7ff3 }, /* 0x27900 */ { 46387, 0xfbf8 }, { 46399, 0xf9ff }, { 46413, 0xdecf }, { 46425, 0xfcc6 }, { 46435, 0x3517 }, { 46443, 0x3fea }, { 46454, 0xef7e }, { 46467, 0xffbb }, { 46481, 0xbfc7 }, { 46493, 0xfe84 }, { 46502, 0xffff }, { 46518, 0x4cff }, { 46529, 0xff76 }, { 46542, 0xffff }, { 46558, 0x0df3 }, { 46567, 0xffff }, /* 0x27a00 */ { 46583, 0x8fff }, { 46596, 0x7e7f }, { 46609, 0xffd9 }, { 46622, 0xffff }, { 46638, 0xfefd }, { 46652, 0xff43 }, { 46663, 0xffff }, { 46679, 0xfffe }, { 46694, 0xffff }, { 46710, 0xffd7 }, { 46724, 0xffff }, { 46740, 0x86ff }, { 46751, 0x89ff }, { 46762, 0xfffd }, { 46777, 0xffff }, { 46793, 0xe565 }, /* 0x27b00 */ { 46802, 0xfffd }, { 46817, 0xbeef }, { 46830, 0xffbf }, { 46845, 0xf87f }, { 46857, 0xff7f }, { 46872, 0xff7f }, { 46887, 0xffbf }, { 46902, 0xff97 }, { 46915, 0xdfff }, { 46930, 0xef7f }, { 46944, 0xfb2c }, { 46954, 0x3def }, { 46966, 0xfe47 }, { 46977, 0x9f39 }, { 46987, 0xeeef }, { 47000, 0xff9b }, /* 0x27c00 */ { 47013, 0x3efb }, { 47025, 0x637f }, { 47036, 0xffab }, { 47049, 0xfff5 }, { 47063, 0xe7ff }, { 47077, 0xffff }, { 47093, 0xff3f }, { 47107, 0xd9ff }, { 47120, 0xffff }, { 47136, 0xfdbf }, { 47150, 0xf7ff }, { 47165, 0xc2ff }, { 47176, 0xffff }, { 47192, 0xfedf }, { 47206, 0xffe7 }, { 47220, 0x5fee }, /* 0x27d00 */ { 47232, 0xf0fe }, { 47243, 0xe7f1 }, { 47254, 0x3d7b }, { 47265, 0xffef }, { 47280, 0xffb7 }, { 47294, 0x37e3 }, { 47304, 0xfff9 }, { 47318, 0xe7f7 }, { 47331, 0x7fec }, { 47343, 0xff8f }, { 47356, 0x05ff }, { 47366, 0xdfff }, { 47381, 0xfe9f }, { 47394, 0xd6ff }, { 47407, 0xfbff }, { 47422, 0xf825 }, /* 0x27e00 */ { 47430, 0xffff }, { 47446, 0x47f2 }, { 47455, 0xe9ff }, { 47468, 0xf3fe }, { 47481, 0x43c9 }, { 47488, 0x7f00 }, { 47495, 0xf09b }, { 47504, 0x23fc }, { 47513, 0xffd0 }, { 47524, 0xefdd }, { 47537, 0xffff }, { 47553, 0xffec }, { 47566, 0xdfff }, { 47581, 0xbffe }, { 47595, 0xd8ff }, { 47607, 0xbf7f }, /* 0x27f00 */ { 47621, 0xc2ff }, { 47632, 0xffff }, { 47648, 0xffef }, { 47663, 0xffff }, { 47679, 0xfe76 }, { 47691, 0xffff }, { 47707, 0xbfff }, { 47722, 0xffd8 }, { 47734, 0xe93f }, { 47745, 0xffff }, { 47761, 0xff7f }, { 47776, 0x1f73 }, { 47786, 0x227f }, { 47795, 0xfffc }, { 47809, 0xc05d }, { 47816, 0xfffe }, /* 0x28000 */ { 47831, 0x0249 }, { 47835, 0xfff8 }, { 47848, 0x7fff }, { 47863, 0x00c2 }, { 47866, 0xffff }, { 47882, 0x5e3f }, { 47893, 0x000d }, { 47896, 0xffe8 }, { 47908, 0xf9ff }, { 47922, 0xf80a }, { 47929, 0xffff }, { 47945, 0x81ff }, { 47955, 0x0003 }, { 47957, 0xfffc }, { 47971, 0x51ff }, { 47982, 0x8008 }, /* 0x28100 */ { 47984, 0xffe9 }, { 47997, 0x0fff }, { 48009, 0x3ffe }, { 48022, 0x0000 }, { 48022, 0xdd60 }, { 48030, 0xffff }, { 48046, 0x07ff }, { 48057, 0x0076 }, { 48062, 0xffff }, { 48078, 0x1df3 }, { 48088, 0xfdc0 }, { 48097, 0x183f }, { 48105, 0x9dfe }, { 48117, 0x67d0 }, { 48125, 0xeff0 }, { 48136, 0x3c1f }, /* 0x28200 */ { 48145, 0xad38 }, { 48153, 0xff3b }, { 48166, 0xfe17 }, { 48177, 0xff37 }, { 48190, 0xff0d }, { 48201, 0x0bb1 }, { 48208, 0xc1fc }, { 48217, 0x9e0f }, { 48226, 0xe45b }, { 48235, 0x2bfd }, { 48246, 0x9e9f }, { 48257, 0xfffe }, { 48272, 0xd0d1 }, { 48279, 0x1fff }, { 48292, 0xffc0 }, { 48302, 0x1277 }, /* 0x28300 */ { 48310, 0xeffe }, { 48324, 0xbe40 }, { 48331, 0xffff }, { 48347, 0x79ff }, { 48360, 0xffef }, { 48375, 0x87df }, { 48386, 0xffa9 }, { 48398, 0x8bdf }, { 48409, 0x3fbf }, { 48422, 0x136f }, { 48431, 0xfff6 }, { 48445, 0x53ff }, { 48457, 0xcfe2 }, { 48467, 0xe37e }, { 48478, 0x9f5f }, { 48490, 0x677f }, /* 0x28400 */ { 48502, 0xb806 }, { 48508, 0xffb3 }, { 48521, 0xbf17 }, { 48532, 0x7a67 }, { 48542, 0xafff }, { 48556, 0x4f1f }, { 48566, 0xbfff }, { 48581, 0xf0bf }, { 48592, 0xfffb }, { 48607, 0x2cf8 }, { 48615, 0xfffd }, { 48630, 0xf00d }, { 48637, 0x6fbf }, { 48650, 0x2bfc }, { 48660, 0xfff0 }, { 48672, 0xefff }, /* 0x28500 */ { 48687, 0xc829 }, { 48693, 0xfeff }, { 48708, 0xffde }, { 48722, 0x0007 }, { 48725, 0xaffe }, { 48738, 0xfc5b }, { 48749, 0xc7ff }, { 48762, 0x317f }, { 48772, 0xffca }, { 48784, 0xe3f9 }, { 48795, 0xfc3b }, { 48806, 0xdffb }, { 48820, 0xf81f }, { 48830, 0xc3bd }, { 48840, 0xffee }, { 48854, 0x3fc3 }, /* 0x28600 */ { 48864, 0xf7bf }, { 48878, 0xfe0b }, { 48888, 0x7fcf }, { 48901, 0xb3e5 }, { 48911, 0xc7ff }, { 48924, 0xd7bf }, { 48937, 0xebd9 }, { 48948, 0x7fe7 }, { 48961, 0xaefc }, { 48972, 0xfffe }, { 48987, 0xfd25 }, { 48997, 0xbe7f }, { 49010, 0xffda }, { 49023, 0xde7f }, { 49036, 0xfffb }, { 49051, 0xf9fb }, /* 0x28700 */ { 49064, 0xfd6f }, { 49077, 0x9fff }, { 49091, 0xe5ff }, { 49104, 0xfffd }, { 49119, 0xfe9b }, { 49131, 0xe9bb }, { 49142, 0xfdef }, { 49156, 0xe1fb }, { 49167, 0xf2bf }, { 49179, 0xdffe }, { 49193, 0xcfc3 }, { 49203, 0xffeb }, { 49217, 0xe13f }, { 49227, 0xdff3 }, { 49240, 0xd9df }, { 49252, 0xfff7 }, /* 0x28800 */ { 49267, 0xfde7 }, { 49280, 0x79ff }, { 49293, 0x40f4 }, { 49299, 0x7fc0 }, { 49308, 0xf826 }, { 49316, 0x3dfb }, { 49328, 0xfe0d }, { 49338, 0x61ff }, { 49349, 0xfffb }, { 49364, 0x0e77 }, { 49373, 0xbfff }, { 49388, 0xe66f }, { 49399, 0x48ff }, { 49409, 0xbffb }, { 49423, 0xefcb }, { 49435, 0xffdf }, /* 0x28900 */ { 49450, 0xf7a7 }, { 49462, 0x6fef }, { 49475, 0x376f }, { 49486, 0xc7d0 }, { 49494, 0xfe1d }, { 49505, 0x03ff }, { 49515, 0xe7f4 }, { 49526, 0x4a6f }, { 49535, 0xfc74 }, { 49545, 0xf25f }, { 49556, 0xfd09 }, { 49565, 0xc19f }, { 49574, 0xfffe }, { 49589, 0x1a68 }, { 49595, 0xfff2 }, { 49608, 0xe07f }, /* 0x28a00 */ { 49618, 0x7fff }, { 49633, 0x20ff }, { 49642, 0xd220 }, { 49647, 0x7fff }, { 49662, 0xf000 }, { 49666, 0xf9ff }, { 49680, 0x121f }, { 49687, 0x1620 }, { 49691, 0xfffe }, { 49706, 0x80df }, { 49714, 0xffff }, { 49730, 0x30c1 }, { 49735, 0xd840 }, { 49740, 0x037f }, { 49749, 0xffc0 }, { 49759, 0x2bff }, /* 0x28b00 */ { 49771, 0xf038 }, { 49778, 0xafdf }, { 49791, 0xc7f8 }, { 49801, 0x7fff }, { 49816, 0x4290 }, { 49820, 0xffe9 }, { 49833, 0xef84 }, { 49842, 0x50ff }, { 49852, 0x8019 }, { 49856, 0xccbc }, { 49865, 0x89ff }, { 49876, 0xfb80 }, { 49884, 0xffd0 }, { 49895, 0xc697 }, { 49904, 0xe04f }, { 49912, 0x5c01 }, /* 0x28c00 */ { 49917, 0xfe23 }, { 49927, 0xf7f7 }, { 49941, 0xd315 }, { 49949, 0x394f }, { 49958, 0x0000 }, { 49958, 0xff80 }, { 49967, 0x0bf4 }, { 49975, 0x86f8 }, { 49983, 0x3fcf }, { 49995, 0xedb8 }, { 50005, 0xe3e7 }, { 50016, 0x5d5c }, { 50025, 0xde3f }, { 50037, 0xffeb }, { 50051, 0x3faf }, { 50063, 0xfffd }, /* 0x28d00 */ { 50078, 0xe037 }, { 50086, 0xa3ff }, { 50098, 0xff21 }, { 50108, 0x81eb }, { 50116, 0xbff3 }, { 50129, 0x10ff }, { 50138, 0xfff4 }, { 50151, 0x02ad }, { 50157, 0xffff }, { 50173, 0xf444 }, { 50180, 0xf0ff }, { 50192, 0x43df }, { 50202, 0x3efe }, { 50214, 0xfabc }, { 50225, 0x0dde }, { 50234, 0x198f }, /* 0x28e00 */ { 50242, 0x8000 }, { 50243, 0x7dff }, { 50257, 0xfa1f }, { 50268, 0x012f }, { 50274, 0xdffe }, { 50288, 0xff2b }, { 50300, 0xe08f }, { 50308, 0xffef }, { 50323, 0xfc7f }, { 50336, 0x800f }, { 50341, 0xffff }, { 50357, 0x8032 }, { 50361, 0xffff }, { 50377, 0xfd7f }, { 50391, 0x8543 }, { 50397, 0xffff }, /* 0x28f00 */ { 50413, 0xfd7f }, { 50427, 0xfbff }, { 50442, 0xfc41 }, { 50450, 0xe07b }, { 50459, 0xf0ff }, { 50471, 0xb3ff }, { 50484, 0x5def }, { 50496, 0xbf7e }, { 50509, 0xafef }, { 50522, 0x3ffe }, { 50535, 0xcfff }, { 50549, 0xfffc }, { 50563, 0xfb7f }, { 50577, 0x47ff }, { 50589, 0xffff }, { 50605, 0xe67f }, /* 0x29000 */ { 50617, 0xffff }, { 50633, 0xffbf }, { 50648, 0xfff3 }, { 50662, 0xfff3 }, { 50676, 0xffe7 }, { 50690, 0xfbff }, { 50705, 0x3b9f }, { 50716, 0x7fe5 }, { 50728, 0x37fc }, { 50739, 0x1dfc }, { 50749, 0x77fe }, { 50762, 0xffac }, { 50774, 0x17ef }, { 50785, 0x7fff }, { 50800, 0xafcb }, { 50811, 0xf7f0 }, /* 0x29100 */ { 50822, 0x221b }, { 50828, 0xffc0 }, { 50838, 0x6aff }, { 50850, 0xff80 }, { 50859, 0xceff }, { 50872, 0xe00d }, { 50878, 0x3fff }, { 50892, 0xf0c6 }, { 50900, 0x03ff }, { 50910, 0x8dfe }, { 50921, 0xea70 }, { 50929, 0xa5ef }, { 50940, 0x5f9f }, { 50952, 0xffbe }, { 50966, 0xffdb }, { 50980, 0xd7ef }, /* 0x29200 */ { 50993, 0xf7f8 }, { 51005, 0xbe4e }, { 51015, 0xf9ff }, { 51029, 0x7b7f }, { 51042, 0x7fbf }, { 51056, 0xee52 }, { 51065, 0x5ffe }, { 51078, 0xff00 }, { 51086, 0x0b3f }, { 51095, 0xffff }, { 51111, 0xfe60 }, { 51120, 0x938d }, { 51128, 0xffff }, { 51144, 0xe83f }, { 51154, 0xffff }, { 51170, 0xf77f }, /* 0x29300 */ { 51184, 0xfff9 }, { 51198, 0x2cff }, { 51209, 0xffc7 }, { 51222, 0xcecf }, { 51233, 0xceff }, { 51246, 0xfffe }, { 51261, 0xcff0 }, { 51271, 0xc3be }, { 51281, 0xffb7 }, { 51295, 0x7fbe }, { 51308, 0xfff2 }, { 51321, 0xffef }, { 51336, 0xcfeb }, { 51348, 0xcfff }, { 51362, 0xff7f }, { 51377, 0x0ff7 }, /* 0x29400 */ { 51388, 0xbebe }, { 51400, 0xdff8 }, { 51412, 0x7dff }, { 51426, 0xdef7 }, { 51439, 0x3fef }, { 51452, 0xffff }, { 51468, 0x5fff }, { 51482, 0x7fff }, { 51497, 0x9fff }, { 51511, 0xffff }, { 51527, 0xecd7 }, { 51538, 0xffff }, { 51554, 0x7f7f }, { 51568, 0xe37a }, { 51578, 0xffff }, { 51594, 0x7dff }, /* 0x29500 */ { 51608, 0xffff }, { 51624, 0xfe19 }, { 51634, 0xb3ff }, { 51647, 0xfff9 }, { 51661, 0xff65 }, { 51673, 0xefff }, { 51688, 0xfa7f }, { 51701, 0xd5fe }, { 51713, 0xfcdb }, { 51725, 0xbe09 }, { 51733, 0x53fe }, { 51744, 0x7ffd }, { 51758, 0x3ff2 }, { 51769, 0xeff8 }, { 51781, 0xff0f }, { 51793, 0x0dff }, /* 0x29600 */ { 51804, 0xffea }, { 51817, 0xf6ff }, { 51831, 0xe0ff }, { 51842, 0xffff }, { 51858, 0x477f }, { 51869, 0xfede }, { 51882, 0x0012 }, { 51884, 0x34d6 }, { 51892, 0xffff }, { 51908, 0x7fec }, { 51920, 0xff19 }, { 51931, 0xafff }, { 51945, 0xff63 }, { 51957, 0xe8cf }, { 51967, 0xffff }, { 51983, 0xfe0a }, /* 0x29700 */ { 51992, 0xffff }, { 52008, 0xfcfd }, { 52021, 0xb004 }, { 52025, 0xffff }, { 52041, 0x0267 }, { 52047, 0xef80 }, { 52055, 0x5bff }, { 52068, 0xf337 }, { 52079, 0xffff }, { 52095, 0xc6c3 }, { 52103, 0x7fff }, { 52118, 0xf4a4 }, { 52126, 0xbfff }, { 52141, 0x2bf8 }, { 52150, 0xe5f8 }, { 52160, 0x01d3 }, /* 0x29800 */ { 52166, 0x0000 }, { 52166, 0x1ee3 }, { 52175, 0x1c7c }, { 52183, 0xde85 }, { 52192, 0x77f7 }, { 52205, 0x6d3f }, { 52216, 0x67b2 }, { 52225, 0xffaf }, { 52239, 0xf35e }, { 52250, 0xffff }, { 52266, 0xe0eb }, { 52275, 0xffff }, { 52291, 0x77bf }, { 52304, 0xffe7 }, { 52318, 0xe19f }, { 52328, 0xffff }, /* 0x29900 */ { 52344, 0x82d3 }, { 52351, 0xffcd }, { 52364, 0x7fff }, { 52379, 0xe88b }, { 52387, 0xffff }, { 52403, 0x5ddf }, { 52415, 0xf814 }, { 52422, 0x0c1f }, { 52429, 0xffff }, { 52445, 0xdaf3 }, { 52456, 0x31ff }, { 52467, 0xffc8 }, { 52478, 0xcffd }, { 52491, 0x0f71 }, { 52499, 0x003f }, { 52505, 0x0000 }, /* 0x29a00 */ { 52505, 0x0000 }, { 52505, 0xf8e6 }, { 52515, 0xf0df }, { 52526, 0xe5ff }, { 52539, 0xfe4f }, { 52551, 0xffa8 }, { 52562, 0xe04f }, { 52570, 0x637f }, { 52581, 0xfe7f }, { 52595, 0x1fbf }, { 52607, 0x6fff }, { 52621, 0xdbcc }, { 52631, 0xde7f }, { 52644, 0xf7a3 }, { 52655, 0xffff }, { 52671, 0xb69b }, /* 0x29b00 */ { 52681, 0x8e1b }, { 52689, 0xffff }, { 52705, 0x03c7 }, { 52712, 0xbfff }, { 52727, 0xff8f }, { 52740, 0xe5ef }, { 52752, 0x6fff }, { 52766, 0xff80 }, { 52775, 0x3bff }, { 52788, 0xffc0 }, { 52798, 0xc3cf }, { 52808, 0x77ff }, { 52822, 0xfff8 }, { 52835, 0xf853 }, { 52844, 0x23f1 }, { 52852, 0x8d3f }, /* 0x29c00 */ { 52862, 0xfefe }, { 52876, 0xf2ff }, { 52889, 0xffff }, { 52905, 0xd2fe }, { 52916, 0xffbb }, { 52930, 0xbfdf }, { 52944, 0xbbff }, { 52958, 0xe7bf }, { 52971, 0xfdff }, { 52986, 0x7ff3 }, { 52999, 0xdfee }, { 53012, 0xfa49 }, { 53021, 0xfbf7 }, { 53035, 0xbf7f }, { 53049, 0xf7ff }, { 53064, 0xf7e7 }, /* 0x29d00 */ { 53077, 0xefc9 }, { 53088, 0xfb7f }, { 53102, 0xef5f }, { 53115, 0xaddf }, { 53127, 0xfdb7 }, { 53140, 0x0bfb }, { 53150, 0xffff }, { 53166, 0x13fb }, { 53176, 0x7fff }, { 53191, 0x4c7e }, { 53200, 0xfffd }, { 53215, 0xbfc3 }, { 53226, 0xf80c }, { 53233, 0xf7ff }, { 53248, 0x507f }, { 53257, 0xffb0 }, /* 0x29e00 */ { 53268, 0xffff }, { 53284, 0x9f85 }, { 53293, 0x21a5 }, { 53299, 0xd600 }, { 53304, 0xffff }, { 53320, 0x5fc7 }, { 53331, 0x0104 }, { 53333, 0xfffe }, { 53348, 0xe07f }, { 53358, 0x1e7f }, { 53369, 0xe800 }, { 53373, 0x7fff }, { 53388, 0x2fe0 }, { 53396, 0xff40 }, { 53405, 0x0dff }, { 53416, 0x0174 }, /* 0x29f00 */ { 53421, 0x7ffc }, { 53434, 0xf1c7 }, { 53444, 0x7fe3 }, { 53456, 0xf83e }, { 53466, 0xf11f }, { 53476, 0xfd2b }, { 53487, 0x7fcb }, { 53499, 0x00eb }, { 53505, 0xa201 }, { 53509, 0xfbff }, { 53524, 0x1eff }, { 53536, 0xffff }, { 53552, 0x9fff }, { 53566, 0xf8ff }, { 53579, 0x7fff }, { 53594, 0x11fe }, /* 0x2a000 */ { 53603, 0xbf83 }, { 53613, 0xeffe }, { 53627, 0x3fff }, { 53641, 0xb5ff }, { 53654, 0xff01 }, { 53663, 0xffff }, { 53679, 0x7fff }, { 53694, 0xfb85 }, { 53704, 0xffff }, { 53720, 0xefbb }, { 53733, 0x242a }, { 53738, 0xfff0 }, { 53750, 0xffff }, { 53766, 0x3dff }, { 53779, 0x86d5 }, { 53787, 0xfe48 }, /* 0x2a100 */ { 53796, 0xfeff }, { 53811, 0x599f }, { 53821, 0xfe09 }, { 53830, 0xfbff }, { 53845, 0x7fff }, { 53860, 0x947e }, { 53869, 0xc002 }, { 53872, 0xffff }, { 53888, 0x3fff }, { 53902, 0x24f2 }, { 53909, 0xff02 }, { 53918, 0xffff }, { 53934, 0x065e }, { 53941, 0x35fe }, { 53952, 0xf003 }, { 53958, 0x9fff }, /* 0x2a200 */ { 53972, 0x7efa }, { 53984, 0xff0d }, { 53995, 0xcff4 }, { 54006, 0xbfb7 }, { 54019, 0x0001 }, { 54020, 0xffc0 }, { 54030, 0xe3db }, { 54041, 0x95ef }, { 54052, 0xfbdf }, { 54066, 0x5bfb }, { 54078, 0xbde3 }, { 54089, 0xfffe }, { 54104, 0xebf8 }, { 54115, 0x7ff7 }, { 54129, 0xfcae }, { 54140, 0xfd9d }, /* 0x2a300 */ { 54152, 0x7fee }, { 54165, 0x3df7 }, { 54177, 0xf17d }, { 54188, 0xf91f }, { 54199, 0xfaff }, { 54213, 0xfd7f }, { 54227, 0xffff }, { 54243, 0xff7d }, { 54257, 0xe0df }, { 54267, 0xfcfd }, { 54280, 0xfdff }, { 54295, 0x6e7d }, { 54306, 0x7fde }, { 54319, 0x7f7a }, { 54331, 0xf1f2 }, { 54341, 0xffdf }, /* 0x2a400 */ { 54356, 0xff9d }, { 54369, 0xfbfe }, { 54383, 0x0df3 }, { 54392, 0x831c }, { 54398, 0x7f1f }, { 54410, 0x7ffc }, { 54423, 0xffea }, { 54436, 0xc09f }, { 54444, 0x993f }, { 54454, 0xff7f }, { 54469, 0xfe8f }, { 54481, 0xcf31 }, { 54490, 0xde5b }, { 54501, 0xfdff }, { 54516, 0xf3b6 }, { 54527, 0xfbff }, /* 0x2a500 */ { 54542, 0xed77 }, { 54554, 0x39f7 }, { 54565, 0xdffc }, { 54578, 0xfdeb }, { 54591, 0xff5f }, { 54605, 0xff9e }, { 54618, 0xff92 }, { 54629, 0xefe2 }, { 54640, 0xf9ef }, { 54653, 0x0dff }, { 54664, 0xc7fe }, { 54676, 0x78f9 }, { 54686, 0xfef6 }, { 54699, 0xff37 }, { 54712, 0xbfff }, { 54727, 0xffe4 }, /* 0x2a600 */ { 54739, 0xec33 }, { 54748, 0x99ff }, { 54760, 0x77f7 }, { 54773, 0xffd5 }, { 54786, 0xffcf }, { 54800, 0xffcf }, { 54814, 0x56f8 }, { 54823, 0xbbfd }, { 54836, 0x7b5f }, { 54848, 0xfbee }, { 54861, 0xf9e1 }, { 54871, 0xfffb }, { 54886, 0xef5f }, { 54899, 0x007f }, }; static const Summary16 cns11643_inv_uni2indx_page2f8[34] = { /* 0x2f800 */ { 54906, 0xffff }, { 54922, 0xffff }, { 54938, 0xffff }, { 54954, 0xffff }, { 54970, 0xfffe }, { 54985, 0xffff }, { 55001, 0xffff }, { 55017, 0xffff }, { 55033, 0xffff }, { 55049, 0xffef }, { 55064, 0xffff }, { 55080, 0xffff }, { 55096, 0xdfff }, { 55111, 0xffff }, { 55127, 0xffff }, { 55143, 0xffff }, /* 0x2f900 */ { 55159, 0xffff }, { 55175, 0xffff }, { 55191, 0xffff }, { 55207, 0xffff }, { 55223, 0xffff }, { 55239, 0xffff }, { 55255, 0xffff }, { 55271, 0xffff }, { 55287, 0xffff }, { 55303, 0xffef }, { 55318, 0xffff }, { 55334, 0xfffb }, { 55349, 0xffff }, { 55365, 0xffef }, { 55380, 0xffff }, { 55396, 0xffff }, /* 0x2fa00 */ { 55412, 0xffff }, { 55428, 0x3fff }, }; static int cns11643_inv_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc >= 0x0000 && wc < 0x0100) summary = &cns11643_inv_uni2indx_page00[(wc>>4)]; else if (wc >= 0x0200 && wc < 0x03d0) summary = &cns11643_inv_uni2indx_page02[(wc>>4)-0x020]; else if (wc >= 0x2000 && wc < 0x22c0) summary = &cns11643_inv_uni2indx_page20[(wc>>4)-0x200]; else if (wc >= 0x2400 && wc < 0x2650) summary = &cns11643_inv_uni2indx_page24[(wc>>4)-0x240]; else if (wc >= 0x3000 && wc < 0x9fb0) summary = &cns11643_inv_uni2indx_page30[(wc>>4)-0x300]; else if (wc >= 0xfa00 && wc < 0xfa30) summary = &cns11643_inv_uni2indx_pagefa[(wc>>4)-0xfa0]; else if (wc >= 0xfe00 && wc < 0xfff0) summary = &cns11643_inv_uni2indx_pagefe[(wc>>4)-0xfe0]; else if (wc >= 0x20000 && wc < 0x2a6e0) summary = &cns11643_inv_uni2indx_page200[(wc>>4)-0x2000]; else if (wc >= 0x2f800 && wc < 0x2fa20) summary = &cns11643_inv_uni2indx_page2f8[(wc>>4)-0x2f80]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' 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); used += summary->indx; r[0] = cns11643_inv_2charset[3*used]; r[1] = cns11643_inv_2charset[3*used+1]; r[2] = cns11643_inv_2charset[3*used+2]; return 3; } } return RET_ILUNI; } return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/config.h000066400000000000000000000715541252300335000243570ustar00rootroot00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Define to the number of bits in type 'ptrdiff_t'. */ #undef BITSIZEOF_PTRDIFF_T /* Define to the number of bits in type 'sig_atomic_t'. */ #undef BITSIZEOF_SIG_ATOMIC_T /* Define to the number of bits in type 'size_t'. */ #undef BITSIZEOF_SIZE_T /* Define to the number of bits in type 'wchar_t'. */ #undef BITSIZEOF_WCHAR_T /* Define to the number of bits in type 'wint_t'. */ #undef BITSIZEOF_WINT_T /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP systems. This function is required for `alloca.c' support on those systems. */ #undef CRAY_STACKSEG_END /* Define to 1 if using `alloca.c'. */ #undef C_ALLOCA /* Define to 1 if // is a file system root distinct from /. */ #undef DOUBLE_SLASH_IS_DISTINCT_ROOT ///////////////////////// 삭제 / DELETE / УДАЛИТЬ /////////////////////// ///* Define as good substitute value for EILSEQ. */ //#undef EILSEQ //////////////////////////////////////////////////////////////////////////////// /* Define to 1 to enable a few rarely used encodings. */ #undef ENABLE_EXTRA /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS /* Define to 1 if the package shall run at any location in the file system. */ #undef ENABLE_RELOCATABLE /* Define to 1 if realpath() can malloc memory, always gives an absolute path, and handles trailing slash correctly. */ #undef FUNC_REALPATH_WORKS /* Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module canonicalize-lgpl shall be considered present. */ #undef GNULIB_CANONICALIZE_LGPL /* Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module sigpipe shall be considered present. */ #undef GNULIB_SIGPIPE /* Define to a C preprocessor expression that evaluates to 1 or 0, depending whether the gnulib module strerror shall be considered present. */ #undef GNULIB_STRERROR /* Define to 1 when the gnulib module canonicalize_file_name should be tested. */ #undef GNULIB_TEST_CANONICALIZE_FILE_NAME /* Define to 1 when the gnulib module environ should be tested. */ #undef GNULIB_TEST_ENVIRON /* Define to 1 when the gnulib module lstat should be tested. */ #undef GNULIB_TEST_LSTAT /* Define to 1 when the gnulib module read should be tested. */ #undef GNULIB_TEST_READ /* Define to 1 when the gnulib module readlink should be tested. */ #undef GNULIB_TEST_READLINK /* Define to 1 when the gnulib module realpath should be tested. */ #undef GNULIB_TEST_REALPATH /* Define to 1 when the gnulib module sigprocmask should be tested. */ #undef GNULIB_TEST_SIGPROCMASK /* Define to 1 when the gnulib module stat should be tested. */ #undef GNULIB_TEST_STAT /* Define to 1 when the gnulib module strerror should be tested. */ #undef GNULIB_TEST_STRERROR /* Define to 1 if you have `alloca', as a function or macro. */ #undef HAVE_ALLOCA /* Define to 1 if you have and it should be used (not on Ultrix). */ #undef HAVE_ALLOCA_H /* Define to 1 if you have the `canonicalize_file_name' function. */ #undef HAVE_CANONICALIZE_FILE_NAME /* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework. */ #undef HAVE_CFLOCALECOPYCURRENT /* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework. */ #undef HAVE_CFPREFERENCESCOPYAPPVALUE /* Define if the GNU dcgettext() function is already present or preinstalled. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the declaration of `clearerr_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_CLEARERR_UNLOCKED /* Define to 1 if you have the declaration of `feof_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FEOF_UNLOCKED /* Define to 1 if you have the declaration of `ferror_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FERROR_UNLOCKED /* Define to 1 if you have the declaration of `fflush_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FFLUSH_UNLOCKED /* Define to 1 if you have the declaration of `fgets_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FGETS_UNLOCKED /* Define to 1 if you have the declaration of `fputc_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FPUTC_UNLOCKED /* Define to 1 if you have the declaration of `fputs_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FPUTS_UNLOCKED /* Define to 1 if you have the declaration of `fread_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FREAD_UNLOCKED /* Define to 1 if you have the declaration of `fwrite_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FWRITE_UNLOCKED /* Define to 1 if you have the declaration of `getchar_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_GETCHAR_UNLOCKED /* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_GETC_UNLOCKED /* Define to 1 if you have the declaration of `program_invocation_name', and to 0 if you don't. */ #undef HAVE_DECL_PROGRAM_INVOCATION_NAME /* Define to 1 if you have the declaration of `program_invocation_short_name', and to 0 if you don't. */ #undef HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME /* Define to 1 if you have the declaration of `putchar_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_PUTCHAR_UNLOCKED /* Define to 1 if you have the declaration of `putc_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_PUTC_UNLOCKED /* Define to 1 if you have the declaration of `setenv', and to 0 if you don't. */ #undef HAVE_DECL_SETENV /* Define to 1 if you have the declaration of `strerror_r', and to 0 if you don't. */ #undef HAVE_DECL_STRERROR_R /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define if you have the declaration of environ. */ #undef HAVE_ENVIRON_DECL /* Define to 1 if you have the `getcwd' function. */ #undef HAVE_GETCWD /* Define to 1 if you have the `getc_unlocked' function. */ #undef HAVE_GETC_UNLOCKED /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define if you have the iconv() function and it works. */ #undef HAVE_ICONV /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define if you have and nl_langinfo(CODESET). */ #undef HAVE_LANGINFO_CODESET /* Define to 1 if the system has the type `long long int'. */ #undef HAVE_LONG_LONG_INT /* Define to 1 if you have the `lstat' function. */ #undef HAVE_LSTAT /* Define to 1 if you have the header file. */ #undef HAVE_MACH_O_DYLD_H /* Define to 1 if you have the `mbrtowc' function. */ #undef HAVE_MBRTOWC /* Define to 1 if you have the `mbsinit' function. */ #undef HAVE_MBSINIT /* Define to 1 if declares mbstate_t. */ #undef HAVE_MBSTATE_T /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if atoll is declared even after undefining macros. */ #undef HAVE_RAW_DECL_ATOLL /* Define to 1 if canonicalize_file_name is declared even after undefining macros. */ #undef HAVE_RAW_DECL_CANONICALIZE_FILE_NAME /* Define to 1 if chown is declared even after undefining macros. */ #undef HAVE_RAW_DECL_CHOWN /* Define to 1 if dprintf is declared even after undefining macros. */ #undef HAVE_RAW_DECL_DPRINTF /* Define to 1 if dup2 is declared even after undefining macros. */ #undef HAVE_RAW_DECL_DUP2 /* Define to 1 if dup3 is declared even after undefining macros. */ #undef HAVE_RAW_DECL_DUP3 /* Define to 1 if endusershell is declared even after undefining macros. */ #undef HAVE_RAW_DECL_ENDUSERSHELL /* Define to 1 if environ is declared even after undefining macros. */ #undef HAVE_RAW_DECL_ENVIRON /* Define to 1 if euidaccess is declared even after undefining macros. */ #undef HAVE_RAW_DECL_EUIDACCESS /* Define to 1 if faccessat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FACCESSAT /* Define to 1 if fchdir is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FCHDIR /* Define to 1 if fchmodat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FCHMODAT /* Define to 1 if fchownat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FCHOWNAT /* Define to 1 if fcntl is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FCNTL /* Define to 1 if ffsl is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FFSL /* Define to 1 if ffsll is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FFSLL /* Define to 1 if fpurge is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FPURGE /* Define to 1 if fseeko is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FSEEKO /* Define to 1 if fstatat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FSTATAT /* Define to 1 if fsync is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FSYNC /* Define to 1 if ftello is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FTELLO /* Define to 1 if ftruncate is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FTRUNCATE /* Define to 1 if futimens is declared even after undefining macros. */ #undef HAVE_RAW_DECL_FUTIMENS /* Define to 1 if getcwd is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETCWD /* Define to 1 if getdelim is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETDELIM /* Define to 1 if getdomainname is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETDOMAINNAME /* Define to 1 if getdtablesize is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETDTABLESIZE /* Define to 1 if getgroups is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETGROUPS /* Define to 1 if gethostname is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETHOSTNAME /* Define to 1 if getline is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETLINE /* Define to 1 if getloadavg is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETLOADAVG /* Define to 1 if getlogin is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETLOGIN /* Define to 1 if getlogin_r is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETLOGIN_R /* Define to 1 if getpagesize is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETPAGESIZE /* Define to 1 if getsubopt is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETSUBOPT /* Define to 1 if getusershell is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GETUSERSHELL /* Define to 1 if grantpt is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GRANTPT /* Define to 1 if group_member is declared even after undefining macros. */ #undef HAVE_RAW_DECL_GROUP_MEMBER /* Define to 1 if initstat_r is declared even after undefining macros. */ #undef HAVE_RAW_DECL_INITSTAT_R /* Define to 1 if lchmod is declared even after undefining macros. */ #undef HAVE_RAW_DECL_LCHMOD /* Define to 1 if lchown is declared even after undefining macros. */ #undef HAVE_RAW_DECL_LCHOWN /* Define to 1 if link is declared even after undefining macros. */ #undef HAVE_RAW_DECL_LINK /* Define to 1 if linkat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_LINKAT /* Define to 1 if lseek is declared even after undefining macros. */ #undef HAVE_RAW_DECL_LSEEK /* Define to 1 if lstat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_LSTAT /* Define to 1 if memmem is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MEMMEM /* Define to 1 if mempcpy is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MEMPCPY /* Define to 1 if memrchr is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MEMRCHR /* Define to 1 if mkdirat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MKDIRAT /* Define to 1 if mkdtemp is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MKDTEMP /* Define to 1 if mkfifo is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MKFIFO /* Define to 1 if mkfifoat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MKFIFOAT /* Define to 1 if mknod is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MKNOD /* Define to 1 if mknodat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MKNODAT /* Define to 1 if mkostemp is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MKOSTEMP /* Define to 1 if mkostemps is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MKOSTEMPS /* Define to 1 if mkstemp is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MKSTEMP /* Define to 1 if mkstemps is declared even after undefining macros. */ #undef HAVE_RAW_DECL_MKSTEMPS /* Define to 1 if openat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_OPENAT /* Define to 1 if pipe is declared even after undefining macros. */ #undef HAVE_RAW_DECL_PIPE /* Define to 1 if pipe2 is declared even after undefining macros. */ #undef HAVE_RAW_DECL_PIPE2 /* Define to 1 if popen is declared even after undefining macros. */ #undef HAVE_RAW_DECL_POPEN /* Define to 1 if pread is declared even after undefining macros. */ #undef HAVE_RAW_DECL_PREAD /* Define to 1 if pthread_sigmask is declared even after undefining macros. */ #undef HAVE_RAW_DECL_PTHREAD_SIGMASK /* Define to 1 if ptsname is declared even after undefining macros. */ #undef HAVE_RAW_DECL_PTSNAME /* Define to 1 if pwrite is declared even after undefining macros. */ #undef HAVE_RAW_DECL_PWRITE /* Define to 1 if random_r is declared even after undefining macros. */ #undef HAVE_RAW_DECL_RANDOM_R /* Define to 1 if rawmemchr is declared even after undefining macros. */ #undef HAVE_RAW_DECL_RAWMEMCHR /* Define to 1 if readlink is declared even after undefining macros. */ #undef HAVE_RAW_DECL_READLINK /* Define to 1 if readlinkat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_READLINKAT /* Define to 1 if realpath is declared even after undefining macros. */ #undef HAVE_RAW_DECL_REALPATH /* Define to 1 if renameat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_RENAMEAT /* Define to 1 if rmdir is declared even after undefining macros. */ #undef HAVE_RAW_DECL_RMDIR /* Define to 1 if rpmatch is declared even after undefining macros. */ #undef HAVE_RAW_DECL_RPMATCH /* Define to 1 if setenv is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SETENV /* Define to 1 if setstate_r is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SETSTATE_R /* Define to 1 if setusershell is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SETUSERSHELL /* Define to 1 if sigaction is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SIGACTION /* Define to 1 if sigaddset is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SIGADDSET /* Define to 1 if sigdelset is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SIGDELSET /* Define to 1 if sigemptyset is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SIGEMPTYSET /* Define to 1 if sigfillset is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SIGFILLSET /* Define to 1 if sigismember is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SIGISMEMBER /* Define to 1 if sigpending is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SIGPENDING /* Define to 1 if sigprocmask is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SIGPROCMASK /* Define to 1 if sleep is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SLEEP /* Define to 1 if snprintf is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SNPRINTF /* Define to 1 if srandom_r is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SRANDOM_R /* Define to 1 if stat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STAT /* Define to 1 if stpcpy is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STPCPY /* Define to 1 if stpncpy is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STPNCPY /* Define to 1 if strcasestr is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRCASESTR /* Define to 1 if strchrnul is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRCHRNUL /* Define to 1 if strdup is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRDUP /* Define to 1 if strerror_r is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRERROR_R /* Define to 1 if strncat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRNCAT /* Define to 1 if strndup is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRNDUP /* Define to 1 if strnlen is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRNLEN /* Define to 1 if strpbrk is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRPBRK /* Define to 1 if strsep is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRSEP /* Define to 1 if strsignal is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRSIGNAL /* Define to 1 if strtod is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRTOD /* Define to 1 if strtok_r is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRTOK_R /* Define to 1 if strtoll is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRTOLL /* Define to 1 if strtoull is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRTOULL /* Define to 1 if strverscmp is declared even after undefining macros. */ #undef HAVE_RAW_DECL_STRVERSCMP /* Define to 1 if symlink is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SYMLINK /* Define to 1 if symlinkat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_SYMLINKAT /* Define to 1 if tmpfile is declared even after undefining macros. */ #undef HAVE_RAW_DECL_TMPFILE /* Define to 1 if ttyname_r is declared even after undefining macros. */ #undef HAVE_RAW_DECL_TTYNAME_R /* Define to 1 if unlink is declared even after undefining macros. */ #undef HAVE_RAW_DECL_UNLINK /* Define to 1 if unlinkat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_UNLINKAT /* Define to 1 if unlockpt is declared even after undefining macros. */ #undef HAVE_RAW_DECL_UNLOCKPT /* Define to 1 if unsetenv is declared even after undefining macros. */ #undef HAVE_RAW_DECL_UNSETENV /* Define to 1 if usleep is declared even after undefining macros. */ #undef HAVE_RAW_DECL_USLEEP /* Define to 1 if utimensat is declared even after undefining macros. */ #undef HAVE_RAW_DECL_UTIMENSAT /* Define to 1 if vdprintf is declared even after undefining macros. */ #undef HAVE_RAW_DECL_VDPRINTF /* Define to 1 if vsnprintf is declared even after undefining macros. */ #undef HAVE_RAW_DECL_VSNPRINTF /* Define to 1 if _Exit is declared even after undefining macros. */ #undef HAVE_RAW_DECL__EXIT /* Define to 1 if you have the `readlink' function. */ #undef HAVE_READLINK /* Define to 1 if you have the `readlinkat' function. */ #undef HAVE_READLINKAT /* Define to 1 if you have the `realpath' function. */ #undef HAVE_REALPATH /* Define to 1 if you have the header file. */ #undef HAVE_SEARCH_H /* Define to 1 if you have the `setenv' function. */ #undef HAVE_SETENV /* Define to 1 if you have the `setlocale' function. */ #undef HAVE_SETLOCALE /* Define to 1 if 'sig_atomic_t' is a signed integer type. */ #undef HAVE_SIGNED_SIG_ATOMIC_T /* Define to 1 if 'wchar_t' is a signed integer type. */ #undef HAVE_SIGNED_WCHAR_T /* Define to 1 if 'wint_t' is a signed integer type. */ #undef HAVE_SIGNED_WINT_T /* Define to 1 if the system has the type `sigset_t'. */ #undef HAVE_SIGSET_T /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strerror_r' function. */ #undef HAVE_STRERROR_R /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_BITYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the `tsearch' function. */ #undef HAVE_TSEARCH /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if the system has the type `unsigned long long int'. */ #undef HAVE_UNSIGNED_LONG_LONG_INT /* Define to 1 or 0, depending whether the compiler supports simple visibility declarations. */ #undef HAVE_VISIBILITY /* Define to 1 if you have the header file. */ #undef HAVE_WCHAR_H /* Define if you have the 'wchar_t' type. */ #undef HAVE_WCHAR_T /* Define to 1 if you have the `wcrtomb' function. */ #undef HAVE_WCRTOMB /* Define to 1 if you have the header file. */ #undef HAVE_WINSOCK2_H /* Define to 1 if O_NOATIME works. */ #undef HAVE_WORKING_O_NOATIME /* Define to 1 if O_NOFOLLOW works. */ #undef HAVE_WORKING_O_NOFOLLOW /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Define to 1 if you have the `_NSGetExecutablePath' function. */ #undef HAVE__NSGETEXECUTABLEPATH /* Define as const if the declaration of iconv() needs const. */ #undef ICONV_CONST /* Define to the value of ${prefix}, as a string. */ #undef INSTALLPREFIX /* Define to 1 if `lstat' dereferences a symlink specified with a trailing slash. */ #undef LSTAT_FOLLOWS_SLASHED_SYMLINK /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* If malloc(0) is != NULL, define this to 1. Otherwise define this to 0. */ #undef MALLOC_0_IS_NONNULL /* Define to 1 if your C compiler doesn't accept -c and -o together. */ #undef NO_MINUS_C_MINUS_O /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to l, ll, u, ul, ull, etc., as suitable for constants of type 'ptrdiff_t'. */ #undef PTRDIFF_T_SUFFIX /* Define to 1 if readlink fails to recognize a trailing slash. */ #undef READLINK_TRAILING_SLASH_BUG /* Define to 1 if stat needs help when passed a directory name with a trailing slash */ #undef REPLACE_FUNC_STAT_DIR /* Define to 1 if stat needs help when passed a file name with a trailing slash */ #undef REPLACE_FUNC_STAT_FILE /* Define to 1 if strerror(0) does not return a message implying success. */ #undef REPLACE_STRERROR_0 /* Define to l, ll, u, ul, ull, etc., as suitable for constants of type 'sig_atomic_t'. */ #undef SIG_ATOMIC_T_SUFFIX /* Define to l, ll, u, ul, ull, etc., as suitable for constants of type 'size_t'. */ #undef SIZE_T_SUFFIX /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at runtime. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #undef STACK_DIRECTION /* Define to 1 if the `S_IS*' macros in do not work properly. */ #undef STAT_MACROS_BROKEN /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if strerror_r returns char *. */ #undef STRERROR_R_CHAR_P /* Define to the prefix of C symbols at the assembler and linker level, either an underscore or empty. */ #undef USER_LABEL_PREFIX /* Define to 1 if you want getc etc. to use unlocked I/O if available. Unlocked I/O can improve performance in unithreaded apps, but it is not safe for multithreaded apps. */ #undef USE_UNLOCKED_IO /* Version number of package */ #undef VERSION /* Define to l, ll, u, ul, ull, etc., as suitable for constants of type 'wchar_t'. */ #undef WCHAR_T_SUFFIX /* Define to l, ll, u, ul, ull, etc., as suitable for constants of type 'wint_t'. */ #undef WINT_T_SUFFIX /* Define if the machine's byte ordering is little endian. */ #undef WORDS_LITTLEENDIAN /* Define to 1 if on MINIX. */ #undef _MINIX /* The _Noreturn keyword of draft C1X. */ #ifndef _Noreturn # if (3 <= __GNUC__ || (__GNUC__ == 2 && 8 <= __GNUC_MINOR__) \ || 0x5110 <= __SUNPRO_C) # define _Noreturn __attribute__ ((__noreturn__)) # elif 1200 <= _MSC_VER # define _Noreturn __declspec (noreturn) # else # define _Noreturn # endif #endif /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ #undef _POSIX_1_SOURCE /* Define to 1 if you need to in order for `stat' and other things to work. */ #undef _POSIX_SOURCE /* Define to 500 only on HP-UX. */ #undef _XOPEN_SOURCE /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable general extensions on MacOS X. */ #ifndef _DARWIN_C_SOURCE # undef _DARWIN_C_SOURCE #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Define to `int' if doesn't define. */ #undef gid_t /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Work around a bug in Apple GCC 4.0.1 build 5465: In C99 mode, it supports the ISO C 99 semantics of 'extern inline' (unlike the GNU C semantics of earlier versions), but does not display it by setting __GNUC_STDC_INLINE__. __APPLE__ && __MACH__ test for MacOS X. __APPLE_CC__ tests for the Apple compiler and its version. __STDC_VERSION__ tests for the C99 mode. */ #if defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && !defined __cplusplus && __STDC_VERSION__ >= 199901L && !defined __GNUC_STDC_INLINE__ # define __GNUC_STDC_INLINE__ 1 #endif /* Define to a type if does not define. */ #undef mbstate_t /* Define to the type of st_nlink in struct stat, or a supertype. */ #undef nlink_t /* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported directly. */ #undef restrict /* Work around a bug in Sun C++: it does not support _Restrict or __restrict__, even though the corresponding Sun C compiler ends up with "#define restrict _Restrict" or "#define restrict __restrict__" in the previous line. Perhaps some future version of Sun C++ will work with restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ #if defined __SUNPRO_CC && !defined __RESTRICT # define _Restrict # define __restrict__ #endif /* Define to `unsigned int' if does not define. */ #undef size_t /* Define as a signed type of the same size as size_t. */ #undef ssize_t /* Define to `int' if doesn't define. */ #undef uid_t /* Define as a marker that can be attached to declarations that might not be used. This helps to reduce warnings, such as from GCC -Wunused-parameter. */ #if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) # define _GL_UNUSED __attribute__ ((__unused__)) #else # define _GL_UNUSED #endif /* The name _UNUSED_PARAMETER_ is an earlier spelling, although the name is a misnomer outside of parameter lists. */ #define _UNUSED_PARAMETER_ _GL_UNUSED /* The __pure__ attribute was added in gcc 2.96. */ #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) # define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__)) #else # define _GL_ATTRIBUTE_PURE /* empty */ #endif /* The __const__ attribute was added in gcc 2.95. */ #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) # define _GL_ATTRIBUTE_CONST __attribute__ ((__const__)) #else # define _GL_ATTRIBUTE_CONST /* empty */ #endif /* On Windows, variables that may be in a DLL must be marked specially. */ #if defined _MSC_VER && defined _DLL # define DLL_VARIABLE __declspec (dllimport) #else # define DLL_VARIABLE #endif freelan-2.0/third-party/source/libiconv-msvc/include/converters.h000066400000000000000000000172141252300335000252750ustar00rootroot00000000000000/* * Copyright (C) 1999-2002, 2004-2010 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* This file defines all the converters. */ /* Our own notion of wide character, as UCS-4, according to ISO-10646-1. */ typedef unsigned int ucs4_t; /* State used by a conversion. 0 denotes the initial state. */ typedef unsigned int state_t; /* iconv_t is an opaque type. This is the real iconv_t type. */ typedef struct conv_struct * conv_t; /* * Data type for conversion multibyte -> unicode */ struct mbtowc_funcs { int (*xxx_mbtowc) (conv_t conv, ucs4_t *pwc, unsigned char const *s, int n); /* * int xxx_mbtowc (conv_t conv, ucs4_t *pwc, unsigned char const *s, int n) * converts the byte sequence starting at s to a wide character. Up to n bytes * are available at s. n is >= 1. * Result is number of bytes consumed (if a wide character was read), * or -1 if invalid, or -2 if n too small, or -2-(number of bytes consumed) * if only a shift sequence was read. */ int (*xxx_flushwc) (conv_t conv, ucs4_t *pwc); /* * int xxx_flushwc (conv_t conv, ucs4_t *pwc) * returns to the initial state and stores the pending wide character, if any. * Result is 1 (if a wide character was read) or 0 if none was pending. */ }; /* Return code if invalid input after a shift sequence of n bytes was read. (xxx_mbtowc) */ #define RET_SHIFT_ILSEQ(n) (-1-2*(n)) /* Return code if invalid. (xxx_mbtowc) */ #define RET_ILSEQ RET_SHIFT_ILSEQ(0) /* Return code if only a shift sequence of n bytes was read. (xxx_mbtowc) */ #define RET_TOOFEW(n) (-2-2*(n)) /* Retrieve the n from the encoded RET_... value. */ #define DECODE_SHIFT_ILSEQ(r) ((unsigned int)(RET_SHIFT_ILSEQ(0) - (r)) / 2) #define DECODE_TOOFEW(r) ((unsigned int)(RET_TOOFEW(0) - (r)) / 2) /* * Data type for conversion unicode -> multibyte */ struct wctomb_funcs { int (*xxx_wctomb) (conv_t conv, unsigned char *r, ucs4_t wc, int n); /* * int xxx_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) * converts the wide character wc to the character set xxx, and stores the * result beginning at r. Up to n bytes may be written at r. n is >= 1. * Result is number of bytes written, or -1 if invalid, or -2 if n too small. */ int (*xxx_reset) (conv_t conv, unsigned char *r, int n); /* * int xxx_reset (conv_t conv, unsigned char *r, int n) * stores a shift sequences returning to the initial state beginning at r. * Up to n bytes may be written at r. n is >= 0. * Result is number of bytes written, or -2 if n too small. */ }; /* Return code if invalid. (xxx_wctomb) */ #define RET_ILUNI -1 /* Return code if output buffer is too small. (xxx_wctomb, xxx_reset) */ #define RET_TOOSMALL -2 /* * Contents of a conversion descriptor. */ struct conv_struct { struct loop_funcs lfuncs; /* Input (conversion multibyte -> unicode) */ int iindex; struct mbtowc_funcs ifuncs; state_t istate; /* Output (conversion unicode -> multibyte) */ int oindex; struct wctomb_funcs ofuncs; int oflags; state_t ostate; /* Operation flags */ int transliterate; int discard_ilseq; #ifndef LIBICONV_PLUG struct iconv_fallbacks fallbacks; struct iconv_hooks hooks; #endif }; /* * Include all the converters. */ #include "ascii.h" /* General multi-byte encodings */ #include "utf8.h" #include "ucs2.h" #include "ucs2be.h" #include "ucs2le.h" #include "ucs4.h" #include "ucs4be.h" #include "ucs4le.h" #include "utf16.h" #include "utf16be.h" #include "utf16le.h" #include "utf32.h" #include "utf32be.h" #include "utf32le.h" #include "utf7.h" #include "ucs2internal.h" #include "ucs2swapped.h" #include "ucs4internal.h" #include "ucs4swapped.h" #include "c99.h" #include "java.h" /* 8-bit encodings */ #include "iso8859_1.h" #include "iso8859_2.h" #include "iso8859_3.h" #include "iso8859_4.h" #include "iso8859_5.h" #include "iso8859_6.h" #include "iso8859_7.h" #include "iso8859_8.h" #include "iso8859_9.h" #include "iso8859_10.h" #include "iso8859_11.h" #include "iso8859_13.h" #include "iso8859_14.h" #include "iso8859_15.h" #include "iso8859_16.h" #include "koi8_r.h" #include "koi8_u.h" #include "koi8_ru.h" #include "cp1250.h" #include "cp1251.h" #include "cp1252.h" #include "cp1253.h" #include "cp1254.h" #include "cp1255.h" #include "cp1256.h" #include "cp1257.h" #include "cp1258.h" #include "cp850.h" #include "cp862.h" #include "cp866.h" #include "cp1131.h" #include "mac_roman.h" #include "mac_centraleurope.h" #include "mac_iceland.h" #include "mac_croatian.h" #include "mac_romania.h" #include "mac_cyrillic.h" #include "mac_ukraine.h" #include "mac_greek.h" #include "mac_turkish.h" #include "mac_hebrew.h" #include "mac_arabic.h" #include "mac_thai.h" #include "hp_roman8.h" #include "nextstep.h" #include "armscii_8.h" #include "georgian_academy.h" #include "georgian_ps.h" #include "koi8_t.h" #include "pt154.h" #include "rk1048.h" #include "mulelao.h" #include "cp1133.h" #include "tis620.h" #include "cp874.h" #include "viscii.h" #include "tcvn.h" /* CJK character sets [CCS = coded character set] [CJKV.INF chapter 3] */ typedef struct { unsigned short indx; /* index into big table */ unsigned short used; /* bitmask of used entries */ } Summary16; #include "iso646_jp.h" #include "jisx0201.h" #include "jisx0208.h" #include "jisx0212.h" #include "iso646_cn.h" #include "gb2312.h" #include "isoir165.h" /*#include "gb12345.h"*/ #include "gbk.h" #include "cns11643.h" #include "big5.h" #include "ksc5601.h" #include "johab_hangul.h" /* CJK encodings [CES = character encoding scheme] [CJKV.INF chapter 4] */ #include "euc_jp.h" #include "sjis.h" #include "cp932.h" #include "iso2022_jp.h" #include "iso2022_jp1.h" #include "iso2022_jp2.h" #include "euc_cn.h" #include "ces_gbk.h" #include "cp936.h" #include "gb18030.h" #include "iso2022_cn.h" #include "iso2022_cnext.h" #include "hz.h" #include "euc_tw.h" #include "ces_big5.h" #include "cp950.h" #include "big5hkscs1999.h" #include "big5hkscs2001.h" #include "big5hkscs2004.h" #include "big5hkscs2008.h" #include "euc_kr.h" #include "cp949.h" #include "johab.h" #include "iso2022_kr.h" /* Encodings used by system dependent locales. */ #ifdef USE_AIX #include "cp856.h" #include "cp922.h" #include "cp943.h" #include "cp1046.h" #include "cp1124.h" #include "cp1129.h" #include "cp1161.h" #include "cp1162.h" #include "cp1163.h" #endif #ifdef USE_OSF1 #include "dec_kanji.h" #include "dec_hanyu.h" #endif #ifdef USE_DOS #include "cp437.h" #include "cp737.h" #include "cp775.h" #include "cp852.h" #include "cp853.h" #include "cp855.h" #include "cp857.h" #include "cp858.h" #include "cp860.h" #include "cp861.h" #include "cp863.h" #include "cp864.h" #include "cp865.h" #include "cp869.h" #include "cp1125.h" #endif #ifdef USE_EXTRA #include "euc_jisx0213.h" #include "shift_jisx0213.h" #include "iso2022_jp3.h" #include "big5_2003.h" #include "tds565.h" #include "atarist.h" #include "riscos1.h" #endif freelan-2.0/third-party/source/libiconv-msvc/include/cp1046.h000066400000000000000000000151211252300335000240130ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1046 */ static const unsigned short cp1046_2uni[128] = { /* 0x80 */ 0xfe88, 0x00d7, 0x00f7, 0xf8f6, 0xf8f5, 0xf8f4, 0xf8f7, 0xfe71, 0x0088, 0x25a0, 0x2502, 0x2500, 0x2510, 0x250c, 0x2514, 0x2518, /* 0x90 */ 0xfe79, 0xfe7b, 0xfe7d, 0xfe7f, 0xfe77, 0xfe8a, 0xfef0, 0xfef3, 0xfef2, 0xfece, 0xfecf, 0xfed0, 0xfef6, 0xfef8, 0xfefa, 0xfefc, /* 0xa0 */ 0x00a0, 0xf8fa, 0xf8f9, 0xf8f8, 0x00a4, 0xf8fb, 0xfe8b, 0xfe91, 0xfe97, 0xfe9b, 0xfe9f, 0xfea3, 0x060c, 0x00ad, 0xfea7, 0xfeb3, /* 0xb0 */ 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, 0x0668, 0x0669, 0xfeb7, 0x061b, 0xfebb, 0xfebf, 0xfeca, 0x061f, /* 0xc0 */ 0xfecb, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, /* 0xd0 */ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0xfec7, 0x0639, 0x063a, 0xfecc, 0xfe82, 0xfe84, 0xfe8e, 0xfed3, /* 0xe0 */ 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, /* 0xf0 */ 0x0650, 0x0651, 0x0652, 0xfed7, 0xfedb, 0xfedf, 0xf8fc, 0xfef5, 0xfef7, 0xfef9, 0xfefb, 0xfee3, 0xfee7, 0xfeec, 0xfee9, 0xfffd, }; static int cp1046_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp1046_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp1046_page00[112] = { 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, /* 0xf0-0xf7 */ }; static const unsigned char cp1046_page06[104] = { 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xbf, /* 0x18-0x1f */ 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */ 0x00, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ 0xf0, 0xf1, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x60-0x67 */ 0xb8, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ }; static const unsigned char cp1046_page25[32] = { 0x8b, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x8c, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ }; static const unsigned char cp1046_pagef8[16] = { 0x00, 0x00, 0x00, 0x00, 0x85, 0x84, 0x83, 0x86, /* 0xf0-0xf7 */ 0xa3, 0xa2, 0xa1, 0xa5, 0xf6, 0x00, 0x00, 0x00, /* 0xf8-0xff */ }; static const unsigned char cp1046_pagefe[144] = { 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, /* 0x70-0x77 */ 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, /* 0x78-0x7f */ 0x00, 0x00, 0xdc, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x80, 0x00, 0x95, 0xa6, 0x00, 0x00, 0xde, 0x00, /* 0x88-0x8f */ 0x00, 0xa7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0xa9, 0x00, 0x00, 0x00, 0xaa, /* 0x98-0x9f */ 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, 0xae, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0xba, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0xbd, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, /* 0xc0-0xc7 */ 0x00, 0x00, 0xbe, 0xc0, 0xdb, 0x00, 0x99, 0x9a, /* 0xc8-0xcf */ 0x9b, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0xf3, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xf5, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0xfc, /* 0xe0-0xe7 */ 0x00, 0xfe, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x96, 0x00, 0x98, 0x97, 0x00, 0xf7, 0x9c, 0xf8, /* 0xf0-0xf7 */ 0x9d, 0xf9, 0x9e, 0xfa, 0x9f, 0x00, 0x00, 0x00, /* 0xf8-0xff */ }; static int cp1046_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x0088 && wc < 0x00f8) c = cp1046_page00[wc-0x0088]; else if (wc >= 0x0608 && wc < 0x0670) c = cp1046_page06[wc-0x0608]; else if (wc >= 0x2500 && wc < 0x2520) c = cp1046_page25[wc-0x2500]; else if (wc == 0x25a0) c = 0x89; else if (wc >= 0xf8f0 && wc < 0xf900) c = cp1046_pagef8[wc-0xf8f0]; else if (wc >= 0xfe70 && wc < 0xff00) c = cp1046_pagefe[wc-0xfe70]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp1124.h000066400000000000000000000076101252300335000240140ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1124 */ static const unsigned short cp1124_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0401, 0x0402, 0x0490, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f, /* 0xb0 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, /* 0xc0 */ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, /* 0xd0 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, /* 0xe0 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, /* 0xf0 */ 0x2116, 0x0451, 0x0452, 0x0491, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f, }; static int cp1124_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) cp1124_2uni[c-0xa0]; return 1; } static const unsigned char cp1124_page00[16] = { 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ }; static const unsigned char cp1124_page04[152] = { 0x00, 0xa1, 0xa2, 0x00, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x00-0x07 */ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0x00, 0xae, 0xaf, /* 0x08-0x0f */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x10-0x17 */ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0x18-0x1f */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0x38-0x3f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ 0x00, 0xf1, 0xf2, 0x00, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x50-0x57 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0xfe, 0xff, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xa3, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static int cp1124_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00b0) c = cp1124_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0498) c = cp1124_page04[wc-0x0400]; else if (wc == 0x2116) c = 0xf0; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp1125.h000066400000000000000000000125761252300335000240240ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1125 */ static const unsigned short cp1125_2uni[80] = { /* 0xb0 */ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, /* 0xc0 */ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, /* 0xd0 */ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, /* 0xe0 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, /* 0xf0 */ 0x0401, 0x0451, 0x0490, 0x0491, 0x0404, 0x0454, 0x0406, 0x0456, 0x0407, 0x0457, 0x00b7, 0x221a, 0x2116, 0x00a4, 0x25a0, 0x00a0, }; static int cp1125_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else if (c < 0xb0) *pwc = (ucs4_t) c + 0x0390; else *pwc = (ucs4_t) cp1125_2uni[c-0xb0]; return 1; } static const unsigned char cp1125_page00[24] = { 0xff, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, /* 0xb0-0xb7 */ }; static const unsigned char cp1125_page04[152] = { 0x00, 0xf0, 0x00, 0x00, 0xf4, 0x00, 0xf6, 0xf8, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x10-0x17 */ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0x18-0x1f */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x20-0x27 */ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, /* 0x28-0x2f */ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x30-0x37 */ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0x38-0x3f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ 0x00, 0xf1, 0x00, 0x00, 0xf5, 0x00, 0xf7, 0xf9, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xf2, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char cp1125_page25[168] = { 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, /* 0x50-0x57 */ 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, /* 0x58-0x5f */ 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, /* 0x60-0x67 */ 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int cp1125_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00b8) c = cp1125_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0498) c = cp1125_page04[wc-0x0400]; else if (wc == 0x2116) c = 0xfc; else if (wc == 0x221a) c = 0xfb; else if (wc >= 0x2500 && wc < 0x25a8) c = cp1125_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp1129.h000066400000000000000000000120731252300335000240200ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1129 */ static const unsigned short cp1129_2uni[96] = { /* 0xa0 */ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x0153, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0178, 0x00b5, 0x00b6, 0x00b7, 0x0152, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, /* 0xc0 */ 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x0300, 0x00cd, 0x00ce, 0x00cf, /* 0xd0 */ 0x0110, 0x00d1, 0x0309, 0x00d3, 0x00d4, 0x01a0, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x01af, 0x0303, 0x00df, /* 0xe0 */ 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0301, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0x0111, 0x00f1, 0x0323, 0x00f3, 0x00f4, 0x01a1, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x01b0, 0x20ab, 0x00ff, }; static int cp1129_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) cp1129_2uni[c-0xa0]; return 1; } static const unsigned char cp1129_page00[272] = { 0x00, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0xb8-0xbf */ 0xc0, 0xc1, 0xc2, 0x00, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xc0-0xc7 */ 0xc8, 0xc9, 0xca, 0xcb, 0x00, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ 0x00, 0xd1, 0x00, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0x00, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0x00, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0xf1, 0x00, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */ /* 0x0100 */ 0x00, 0x00, 0xc3, 0xe3, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0xb8, 0xa8, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xd5, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, /* 0xa8-0xaf */ 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ }; static const unsigned char cp1129_page03[40] = { 0xcc, 0xec, 0x00, 0xde, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static int cp1129_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a8) { *r = wc; return 1; } else if (wc >= 0x00a8 && wc < 0x01b8) c = cp1129_page00[wc-0x00a8]; else if (wc >= 0x0300 && wc < 0x0328) c = cp1129_page03[wc-0x0300]; else if (wc == 0x20ab) c = 0xfe; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp1131.h000066400000000000000000000131221252300335000240050ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1131 */ static const unsigned short cp1131_2uni[128] = { /* 0x80 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, /* 0x90 */ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, /* 0xa0 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, /* 0xb0 */ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, /* 0xc0 */ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, /* 0xd0 */ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, /* 0xe0 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, /* 0xf0 */ 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040e, 0x045e, 0x0406, 0x0456, 0x00b7, 0x00a4, 0x0490, 0x0491, 0x2219, 0x00a0, }; static int cp1131_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) cp1131_2uni[c-0x80]; return 1; } static const unsigned char cp1131_page00[24] = { 0xff, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, /* 0xb0-0xb7 */ }; static const unsigned char cp1131_page04[152] = { 0x00, 0xf0, 0x00, 0x00, 0xf2, 0x00, 0xf8, 0xf4, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0x00, /* 0x08-0x0f */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x10-0x17 */ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0x18-0x1f */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x20-0x27 */ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, /* 0x28-0x2f */ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x30-0x37 */ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0x38-0x3f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ 0x00, 0xf1, 0x00, 0x00, 0xf3, 0x00, 0xf9, 0xf5, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xfc, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char cp1131_page25[152] = { 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, /* 0x50-0x57 */ 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, /* 0x58-0x5f */ 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, /* 0x60-0x67 */ 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static int cp1131_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00b8) c = cp1131_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0498) c = cp1131_page04[wc-0x0400]; else if (wc == 0x2219) c = 0xfe; else if (wc >= 0x2500 && wc < 0x2598) c = cp1131_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp1133.h000066400000000000000000000072001252300335000240070ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * IBM-CP1133 */ static const unsigned short cp1133_2uni_1[64] = { /* 0xa0 */ 0x00a0, 0x0e81, 0x0e82, 0x0e84, 0x0e87, 0x0e88, 0x0eaa, 0x0e8a, 0x0e8d, 0x0e94, 0x0e95, 0x0e96, 0x0e97, 0x0e99, 0x0e9a, 0x0e9b, /* 0xb0 */ 0x0e9c, 0x0e9d, 0x0e9e, 0x0e9f, 0x0ea1, 0x0ea2, 0x0ea3, 0x0ea5, 0x0ea7, 0x0eab, 0x0ead, 0x0eae, 0xfffd, 0xfffd, 0xfffd, 0x0eaf, /* 0xc0 */ 0x0eb0, 0x0eb2, 0x0eb3, 0x0eb4, 0x0eb5, 0x0eb6, 0x0eb7, 0x0eb8, 0x0eb9, 0x0ebc, 0x0eb1, 0x0ebb, 0x0ebd, 0xfffd, 0xfffd, 0xfffd, /* 0xd0 */ 0x0ec0, 0x0ec1, 0x0ec2, 0x0ec3, 0x0ec4, 0x0ec8, 0x0ec9, 0x0eca, 0x0ecb, 0x0ecc, 0x0ecd, 0x0ec6, 0xfffd, 0x0edc, 0x0edd, 0x20ad, }; static const unsigned short cp1133_2uni_2[16] = { /* 0xf0 */ 0x0ed0, 0x0ed1, 0x0ed2, 0x0ed3, 0x0ed4, 0x0ed5, 0x0ed6, 0x0ed7, 0x0ed8, 0x0ed9, 0xfffd, 0xfffd, 0x00a2, 0x00ac, 0x00a6, 0xfffd, }; static int cp1133_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) { *pwc = (ucs4_t) c; return 1; } else if (c < 0xe0) { unsigned short wc = cp1133_2uni_1[c-0xa0]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } else if (c < 0xf0) { } else { unsigned short wc = cp1133_2uni_2[c-0xf0]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp1133_page00[16] = { 0xa0, 0x00, 0xfc, 0x00, 0x00, 0x00, 0xfe, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ }; static const unsigned char cp1133_page0e[96] = { 0x00, 0xa1, 0xa2, 0x00, 0xa3, 0x00, 0x00, 0xa4, /* 0x80-0x87 */ 0xa5, 0x00, 0xa7, 0x00, 0x00, 0xa8, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x00, 0x00, 0xa9, 0xaa, 0xab, 0xac, /* 0x90-0x97 */ 0x00, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, /* 0x98-0x9f */ 0x00, 0xb4, 0xb5, 0xb6, 0x00, 0xb7, 0x00, 0xb8, /* 0xa0-0xa7 */ 0x00, 0x00, 0xa6, 0xb9, 0x00, 0xba, 0xbb, 0xbf, /* 0xa8-0xaf */ 0xc0, 0xca, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, /* 0xb0-0xb7 */ 0xc7, 0xc8, 0x00, 0xcb, 0xc9, 0xcc, 0x00, 0x00, /* 0xb8-0xbf */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0x00, 0xdb, 0x00, /* 0xc0-0xc7 */ 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0x00, 0x00, /* 0xc8-0xcf */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xd0-0xd7 */ 0xf8, 0xf9, 0x00, 0x00, 0xdd, 0xde, 0x00, 0x00, /* 0xd8-0xdf */ }; static int cp1133_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00b0) c = cp1133_page00[wc-0x00a0]; else if (wc >= 0x0e80 && wc < 0x0ee0) c = cp1133_page0e[wc-0x0e80]; else if (wc == 0x20ad) c = 0xdf; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp1161.h000066400000000000000000000053621252300335000240170ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1161 */ static const unsigned short cp1161_2uni[96] = { /* 0xa0 */ 0x0e48, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, /* 0xb0 */ 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, /* 0xc0 */ 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, /* 0xd0 */ 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37, 0x0e38, 0x0e39, 0x0e3a, 0x0e49, 0x0e4a, 0x0e4b, 0x20ac, 0x0e3f, /* 0xe0 */ 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f, /* 0xf0 */ 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, 0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0x00a2, 0x00ac, 0x00a6, 0x00a0, }; static int cp1161_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else if (c < 0xa0) { } else { *pwc = (ucs4_t) cp1161_2uni[c-0xa0]; return 1; } return RET_ILSEQ; } static const unsigned char cp1161_page00[16] = { 0xff, 0x00, 0xfc, 0x00, 0x00, 0x00, 0xfe, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ }; static int cp1161_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00b0) c = cp1161_page00[wc-0x00a0]; else if (wc >= 0x0e48 && wc < 0x0e4c) c = wc-0x0d60; else if (wc >= 0x0e00 && wc < 0x0e60) c = cp874_page0e[wc-0x0e00]; else if (wc == 0x20ac) c = 0xde; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp1162.h000066400000000000000000000035061252300335000240160ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1162 */ static int cp1162_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp874_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } if (c < 0xa0) { *pwc = (ucs4_t) c; return 1; } } return RET_ILSEQ; } static int cp1162_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x0080 && wc < 0x00a0 && cp874_2uni[wc-0x0080] == 0xfffd) c = wc; else if (wc == 0x00a0) c = 0xa0; else if (wc >= 0x0e00 && wc < 0x0e60) c = cp874_page0e[wc-0x0e00]; else if (wc >= 0x2010 && wc < 0x2028) c = cp874_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x80; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp1163.h000066400000000000000000000034641252300335000240220ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1163 */ static int cp1163_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else if (c == 0xa4) *pwc = 0x20ac; else *pwc = (ucs4_t) cp1129_2uni[c-0xa0]; return 1; } static const unsigned char cp1163_page20[8] = { 0x00, 0x00, 0x00, 0xfe, 0xa4, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ }; static int cp1163_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0 || (wc < 0x00a8 && wc != 0x00a4) || wc == 0x00d0) { *r = wc; return 1; } else if (wc >= 0x00a8 && wc < 0x01b8) c = cp1129_page00[wc-0x00a8]; else if (wc >= 0x0300 && wc < 0x0328) c = cp1129_page03[wc-0x0300]; else if (wc == 0x203e) c = 0xaf; else if (wc >= 0x20a8 && wc < 0x20b0) c = cp1163_page20[wc-0x20a8]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp1250.h000066400000000000000000000130571252300335000240160ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1250 */ static const unsigned short cp1250_2uni[128] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0xfffd, 0x201e, 0x2026, 0x2020, 0x2021, 0xfffd, 0x2030, 0x0160, 0x2039, 0x015a, 0x0164, 0x017d, 0x0179, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0xfffd, 0x2122, 0x0161, 0x203a, 0x015b, 0x0165, 0x017e, 0x017a, /* 0xa0 */ 0x00a0, 0x02c7, 0x02d8, 0x0141, 0x00a4, 0x0104, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x015e, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x017b, /* 0xb0 */ 0x00b0, 0x00b1, 0x02db, 0x0142, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x0105, 0x015f, 0x00bb, 0x013d, 0x02dd, 0x013e, 0x017c, /* 0xc0 */ 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, /* 0xd0 */ 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, /* 0xe0 */ 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, /* 0xf0 */ 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9, }; static int cp1250_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp1250_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp1250_page00[224] = { 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0x00, 0x00, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0xb8, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0x00, 0xc7, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0x00, 0x00, 0xda, 0x00, 0xdc, 0xdd, 0x00, 0xdf, /* 0xd8-0xdf */ 0x00, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0x00, 0xe7, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0x00, 0x00, 0xfa, 0x00, 0xfc, 0xfd, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0x00, 0x00, 0xc3, 0xe3, 0xa5, 0xb9, 0xc6, 0xe6, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0xcf, 0xef, /* 0x08-0x0f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xca, 0xea, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0xc5, 0xe5, 0x00, 0x00, 0xbc, 0xbe, 0x00, /* 0x38-0x3f */ 0x00, 0xa3, 0xb3, 0xd1, 0xf1, 0x00, 0x00, 0xd2, /* 0x40-0x47 */ 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xd5, 0xf5, 0x00, 0x00, 0xc0, 0xe0, 0x00, 0x00, /* 0x50-0x57 */ 0xd8, 0xf8, 0x8c, 0x9c, 0x00, 0x00, 0xaa, 0xba, /* 0x58-0x5f */ 0x8a, 0x9a, 0xde, 0xfe, 0x8d, 0x9d, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd9, 0xf9, /* 0x68-0x6f */ 0xdb, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x8f, 0x9f, 0xaf, 0xbf, 0x8e, 0x9e, 0x00, /* 0x78-0x7f */ }; static const unsigned char cp1250_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0xa2, 0xff, 0x00, 0xb2, 0x00, 0xbd, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1250_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1250_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = cp1250_page00[wc-0x00a0]; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1250_page02[wc-0x02c0]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1250_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp1251.h000066400000000000000000000117651252300335000240230ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1251 */ static const unsigned short cp1251_2uni[128] = { /* 0x80 */ 0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021, 0x20ac, 0x2030, 0x0409, 0x2039, 0x040a, 0x040c, 0x040b, 0x040f, /* 0x90 */ 0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0xfffd, 0x2122, 0x0459, 0x203a, 0x045a, 0x045c, 0x045b, 0x045f, /* 0xa0 */ 0x00a0, 0x040e, 0x045e, 0x0408, 0x00a4, 0x0490, 0x00a6, 0x00a7, 0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0407, /* 0xb0 */ 0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5, 0x00b6, 0x00b7, 0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455, 0x0457, /* 0xc0 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, /* 0xd0 */ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, /* 0xe0 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, /* 0xf0 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, }; static int cp1251_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp1251_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp1251_page00[32] = { 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0x00, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0x00, 0x00, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char cp1251_page04[152] = { 0x00, 0xa8, 0x80, 0x81, 0xaa, 0xbd, 0xb2, 0xaf, /* 0x00-0x07 */ 0xa3, 0x8a, 0x8c, 0x8e, 0x8d, 0x00, 0xa1, 0x8f, /* 0x08-0x0f */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x10-0x17 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x18-0x1f */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x20-0x27 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0x28-0x2f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x30-0x37 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x38-0x3f */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x40-0x47 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0x48-0x4f */ 0x00, 0xb8, 0x90, 0x83, 0xba, 0xbe, 0xb3, 0xbf, /* 0x50-0x57 */ 0xbc, 0x9a, 0x9c, 0x9e, 0x9d, 0x00, 0xa2, 0x9f, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xa5, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char cp1251_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1251_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = cp1251_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0498) c = cp1251_page04[wc-0x0400]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1251_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x88; else if (wc == 0x2116) c = 0xb9; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp1252.h000066400000000000000000000070231252300335000240140ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1252 */ static const unsigned short cp1252_2uni[32] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0xfffd, 0x017d, 0xfffd, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0xfffd, 0x017e, 0x0178, }; static int cp1252_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80 || c >= 0xa0) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp1252_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp1252_page01[72] = { 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x8a, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x9f, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x9e, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char cp1252_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1252_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1252_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = wc; else if (wc >= 0x0150 && wc < 0x0198) c = cp1252_page01[wc-0x0150]; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1252_page02[wc-0x02c0]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1252_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp1253.h000066400000000000000000000106421252300335000240160ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1253 */ static const unsigned short cp1253_2uni[128] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0xfffd, 0x2030, 0xfffd, 0x2039, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0xfffd, 0x2122, 0xfffd, 0x203a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xa0 */ 0x00a0, 0x0385, 0x0386, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0xfffd, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x2015, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x00b5, 0x00b6, 0x00b7, 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, /* 0xc0 */ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, /* 0xd0 */ 0x03a0, 0x03a1, 0xfffd, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, /* 0xe0 */ 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, /* 0xf0 */ 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0xfffd, }; static int cp1253_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp1253_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp1253_page00[32] = { 0xa0, 0x00, 0x00, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0xbd, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char cp1253_page03[80] = { 0x00, 0x00, 0x00, 0x00, 0xb4, 0xa1, 0xa2, 0x00, /* 0x80-0x87 */ 0xb8, 0xb9, 0xba, 0x00, 0xbc, 0x00, 0xbe, 0xbf, /* 0x88-0x8f */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x90-0x97 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x98-0x9f */ 0xd0, 0xd1, 0x00, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xa0-0xa7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0xa8-0xaf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xb0-0xb7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xb8-0xbf */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xc0-0xc7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00, /* 0xc8-0xcf */ }; static const unsigned char cp1253_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0xaf, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1253_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = cp1253_page00[wc-0x00a0]; else if (wc == 0x0192) c = 0x83; else if (wc >= 0x0380 && wc < 0x03d0) c = cp1253_page03[wc-0x0380]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1253_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp1254.h000066400000000000000000000122271252300335000240200ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1254 */ static const unsigned short cp1254_2uni_1[32] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0xfffd, 0xfffd, 0xfffd, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0xfffd, 0xfffd, 0x0178, }; static const unsigned short cp1254_2uni_2[16] = { /* 0xd0 */ 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, }; static const unsigned short cp1254_2uni_3[16] = { /* 0xf0 */ 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff, }; static int cp1254_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else if (c < 0xa0) { unsigned short wc = cp1254_2uni_1[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } else if (c < 0xd0) { *pwc = (ucs4_t) c; return 1; } else if (c < 0xe0) { *pwc = (ucs4_t) cp1254_2uni_2[c-0xd0]; return 1; } else if (c < 0xf0) { *pwc = (ucs4_t) c; return 1; } else { *pwc = (ucs4_t) cp1254_2uni_3[c-0xf0]; return 1; } return RET_ILSEQ; } static const unsigned char cp1254_page00[48] = { 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */ }; static const unsigned char cp1254_page01[128] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0xdd, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xfe, /* 0x58-0x5f */ 0x8a, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char cp1254_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1254_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1254_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00d0) c = wc; else if (wc >= 0x00d0 && wc < 0x0100) c = cp1254_page00[wc-0x00d0]; else if (wc >= 0x0118 && wc < 0x0198) c = cp1254_page01[wc-0x0118]; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1254_page02[wc-0x02c0]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1254_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp1255.h000066400000000000000000000317531252300335000240260ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1255 */ #include "flushwc.h" /* Combining characters used in Hebrew encoding CP1255. */ /* Relevant combining characters: 0x05b4, 0x05b7, 0x05b8, 0x05b9, 0x05bc, 0x05bf, 0x05c1, 0x05c2. */ /* Composition tables for each of the relevant combining characters. */ static const struct { unsigned short base; unsigned short composed; } cp1255_comp_table_data[] = { #define cp1255_comp_table05b4_idx 0 #define cp1255_comp_table05b4_len 1 { 0x05D9, 0xFB1D }, #define cp1255_comp_table05b7_idx (cp1255_comp_table05b4_idx+cp1255_comp_table05b4_len) #define cp1255_comp_table05b7_len 2 { 0x05D0, 0xFB2E }, { 0x05F2, 0xFB1F }, #define cp1255_comp_table05b8_idx (cp1255_comp_table05b7_idx+cp1255_comp_table05b7_len) #define cp1255_comp_table05b8_len 1 { 0x05D0, 0xFB2F }, #define cp1255_comp_table05b9_idx (cp1255_comp_table05b8_idx+cp1255_comp_table05b8_len) #define cp1255_comp_table05b9_len 1 { 0x05D5, 0xFB4B }, #define cp1255_comp_table05bc_idx (cp1255_comp_table05b9_idx+cp1255_comp_table05b9_len) #define cp1255_comp_table05bc_len 24 { 0x05D0, 0xFB30 }, { 0x05D1, 0xFB31 }, { 0x05D2, 0xFB32 }, { 0x05D3, 0xFB33 }, { 0x05D4, 0xFB34 }, { 0x05D5, 0xFB35 }, { 0x05D6, 0xFB36 }, { 0x05D8, 0xFB38 }, { 0x05D9, 0xFB39 }, { 0x05DA, 0xFB3A }, { 0x05DB, 0xFB3B }, { 0x05DC, 0xFB3C }, { 0x05DE, 0xFB3E }, { 0x05E0, 0xFB40 }, { 0x05E1, 0xFB41 }, { 0x05E3, 0xFB43 }, { 0x05E4, 0xFB44 }, { 0x05E6, 0xFB46 }, { 0x05E7, 0xFB47 }, { 0x05E8, 0xFB48 }, { 0x05E9, 0xFB49 }, { 0x05EA, 0xFB4A }, { 0xFB2A, 0xFB2C }, { 0xFB2B, 0xFB2D }, #define cp1255_comp_table05bf_idx (cp1255_comp_table05bc_idx+cp1255_comp_table05bc_len) #define cp1255_comp_table05bf_len 3 { 0x05D1, 0xFB4C }, { 0x05DB, 0xFB4D }, { 0x05E4, 0xFB4E }, #define cp1255_comp_table05c1_idx (cp1255_comp_table05bf_idx+cp1255_comp_table05bf_len) #define cp1255_comp_table05c1_len 2 { 0x05E9, 0xFB2A }, { 0xFB49, 0xFB2C }, #define cp1255_comp_table05c2_idx (cp1255_comp_table05c1_idx+cp1255_comp_table05c1_len) #define cp1255_comp_table05c2_len 2 { 0x05E9, 0xFB2B }, { 0xFB49, 0xFB2D }, }; static const struct { unsigned int len; unsigned int idx; } cp1255_comp_table[] = { { cp1255_comp_table05b4_len, cp1255_comp_table05b4_idx }, { cp1255_comp_table05b7_len, cp1255_comp_table05b7_idx }, { cp1255_comp_table05b8_len, cp1255_comp_table05b8_idx }, { cp1255_comp_table05b9_len, cp1255_comp_table05b9_idx }, { cp1255_comp_table05bc_len, cp1255_comp_table05bc_idx }, { cp1255_comp_table05bf_len, cp1255_comp_table05bf_idx }, { cp1255_comp_table05c1_len, cp1255_comp_table05c1_idx }, { cp1255_comp_table05c2_len, cp1255_comp_table05c2_idx }, }; /* Decomposition table for the relevant Unicode characters. */ struct cp1255_decomp { unsigned short composed; unsigned short base; int comb1 : 8; signed int comb2 : 8; }; static const struct cp1255_decomp cp1255_decomp_table[] = { { 0xFB1D, 0x05D9, 0, -1 }, { 0xFB1F, 0x05F2, 1, -1 }, { 0xFB2A, 0x05E9, 6, -1 }, { 0xFB2B, 0x05E9, 7, -1 }, { 0xFB2C, 0x05E9, 4, 6 }, { 0xFB2D, 0x05E9, 4, 7 }, { 0xFB2E, 0x05D0, 1, -1 }, { 0xFB2F, 0x05D0, 2, -1 }, { 0xFB30, 0x05D0, 4, -1 }, { 0xFB31, 0x05D1, 4, -1 }, { 0xFB32, 0x05D2, 4, -1 }, { 0xFB33, 0x05D3, 4, -1 }, { 0xFB34, 0x05D4, 4, -1 }, { 0xFB35, 0x05D5, 4, -1 }, { 0xFB36, 0x05D6, 4, -1 }, { 0xFB38, 0x05D8, 4, -1 }, { 0xFB39, 0x05D9, 4, -1 }, { 0xFB3A, 0x05DA, 4, -1 }, { 0xFB3B, 0x05DB, 4, -1 }, { 0xFB3C, 0x05DC, 4, -1 }, { 0xFB3E, 0x05DE, 4, -1 }, { 0xFB40, 0x05E0, 4, -1 }, { 0xFB41, 0x05E1, 4, -1 }, { 0xFB43, 0x05E3, 4, -1 }, { 0xFB44, 0x05E4, 4, -1 }, { 0xFB46, 0x05E6, 4, -1 }, { 0xFB47, 0x05E7, 4, -1 }, { 0xFB48, 0x05E8, 4, -1 }, { 0xFB49, 0x05E9, 4, -1 }, { 0xFB4A, 0x05EA, 4, -1 }, { 0xFB4B, 0x05D5, 3, -1 }, { 0xFB4C, 0x05D1, 5, -1 }, { 0xFB4D, 0x05DB, 5, -1 }, { 0xFB4E, 0x05E4, 5, -1 }, }; static const unsigned char cp1255_comb_table[] = { 0xc4, 0xc7, 0xc8, 0xc9, 0xcc, 0xcf, 0xd1, 0xd2, }; static const unsigned short cp1255_2uni[128] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0xfffd, 0x2039, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0xfffd, 0x203a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xa0 */ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20aa, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, /* 0xc0 */ 0x05b0, 0x05b1, 0x05b2, 0x05b3, 0x05b4, 0x05b5, 0x05b6, 0x05b7, 0x05b8, 0x05b9, 0xfffd, 0x05bb, 0x05bc, 0x05bd, 0x05be, 0x05bf, /* 0xd0 */ 0x05c0, 0x05c1, 0x05c2, 0x05c3, 0x05f0, 0x05f1, 0x05f2, 0x05f3, 0x05f4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xe0 */ 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, /* 0xf0 */ 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0xfffd, 0xfffd, 0x200e, 0x200f, 0xfffd, }; /* In the CP1255 to Unicode direction, the state contains a buffered character, or 0 if none. */ static int cp1255_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; unsigned short wc; unsigned short last_wc; if (c < 0x80) { wc = c; } else { wc = cp1255_2uni[c-0x80]; if (wc == 0xfffd) return RET_ILSEQ; } last_wc = conv->istate; if (last_wc) { if (wc >= 0x05b0 && wc < 0x05c5) { /* See whether last_wc and wc can be combined. */ unsigned int k; unsigned int i1, i2; switch (wc) { case 0x05b4: k = 0; break; case 0x05b7: k = 1; break; case 0x05b8: k = 2; break; case 0x05b9: k = 3; break; case 0x05bc: k = 4; break; case 0x05bf: k = 5; break; case 0x05c1: k = 6; break; case 0x05c2: k = 7; break; default: goto not_combining; } i1 = cp1255_comp_table[k].idx; i2 = i1 + cp1255_comp_table[k].len-1; if (last_wc >= cp1255_comp_table_data[i1].base && last_wc <= cp1255_comp_table_data[i2].base) { unsigned int i; for (;;) { i = (i1+i2)>>1; if (last_wc == cp1255_comp_table_data[i].base) break; if (last_wc < cp1255_comp_table_data[i].base) { if (i1 == i) goto not_combining; i2 = i; } else { if (i1 != i) i1 = i; else { i = i2; if (last_wc == cp1255_comp_table_data[i].base) break; goto not_combining; } } } last_wc = cp1255_comp_table_data[i].composed; if (last_wc == 0xfb2a || last_wc == 0xfb2b || last_wc == 0xfb49) { /* Buffer the combined character. */ conv->istate = last_wc; return RET_TOOFEW(1); } else { /* Output the combined character. */ conv->istate = 0; *pwc = (ucs4_t) last_wc; return 1; } } } not_combining: /* Output the buffered character. */ conv->istate = 0; *pwc = (ucs4_t) last_wc; return 0; /* Don't advance the input pointer. */ } if ((wc >= 0x05d0 && wc <= 0x05ea && ((0x07db5f7f >> (wc - 0x05d0)) & 1)) || wc == 0x05f2) { /* wc is a possible match in cp1255_comp_table_data. Buffer it. */ conv->istate = wc; return RET_TOOFEW(1); } else { /* Output wc immediately. */ *pwc = (ucs4_t) wc; return 1; } } #define cp1255_flushwc normal_flushwc static const unsigned char cp1255_page00[88] = { 0xa0, 0xa1, 0xa2, 0xa3, 0x00, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0xb8, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, /* 0xf0-0xf7 */ }; static const unsigned char cp1255_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1255_page05[72] = { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xb0-0xb7 */ 0xc8, 0xc9, 0x00, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xb8-0xbf */ 0xd0, 0xd1, 0xd2, 0xd3, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xd0-0xd7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xd8-0xdf */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xe0-0xe7 */ 0xf8, 0xf9, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ }; static const unsigned char cp1255_page20[56] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xfe, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1255_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00f8) c = cp1255_page00[wc-0x00a0]; else if (wc == 0x0192) c = 0x83; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1255_page02[wc-0x02c0]; else if (wc >= 0x05b0 && wc < 0x05f8) c = cp1255_page05[wc-0x05b0]; else if (wc >= 0x2008 && wc < 0x2040) c = cp1255_page20[wc-0x2008]; else if (wc == 0x20aa) c = 0xa4; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } /* Try canonical decomposition. */ { /* Binary search through cp1255_decomp_table. */ unsigned int i1 = 0; unsigned int i2 = sizeof(cp1255_decomp_table)/sizeof(cp1255_decomp_table[0])-1; if (wc >= cp1255_decomp_table[i1].composed && wc <= cp1255_decomp_table[i2].composed) { unsigned int i; for (;;) { /* Here i2 - i1 > 0. */ i = (i1+i2)>>1; if (wc == cp1255_decomp_table[i].composed) break; if (wc < cp1255_decomp_table[i].composed) { if (i1 == i) return RET_ILUNI; /* Here i1 < i < i2. */ i2 = i; } else { /* Here i1 <= i < i2. */ if (i1 != i) i1 = i; else { /* Here i2 - i1 = 1. */ i = i2; if (wc == cp1255_decomp_table[i].composed) break; else return RET_ILUNI; } } } /* Found a canonical decomposition. */ wc = cp1255_decomp_table[i].base; /* wc is one of 0x05d0..0x05d6, 0x05d8..0x05dc, 0x05de, 0x05e0..0x05e1, 0x05e3..0x05e4, 0x05e6..0x05ea, 0x05f2. */ c = cp1255_page05[wc-0x05b0]; if (cp1255_decomp_table[i].comb2 < 0) { if (n < 2) return RET_TOOSMALL; r[0] = c; r[1] = cp1255_comb_table[cp1255_decomp_table[i].comb1]; return 2; } else { if (n < 3) return RET_TOOSMALL; r[0] = c; r[1] = cp1255_comb_table[cp1255_decomp_table[i].comb1]; r[2] = cp1255_comb_table[cp1255_decomp_table[i].comb2]; return 3; } } } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp1256.h000066400000000000000000000151671252300335000240300ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1256 */ static const unsigned short cp1256_2uni[128] = { /* 0x80 */ 0x20ac, 0x067e, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, /* 0x90 */ 0x06af, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x06a9, 0x2122, 0x0691, 0x203a, 0x0153, 0x200c, 0x200d, 0x06ba, /* 0xa0 */ 0x00a0, 0x060c, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x06be, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x061b, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x061f, /* 0xc0 */ 0x06c1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, /* 0xd0 */ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00d7, 0x0637, 0x0638, 0x0639, 0x063a, 0x0640, 0x0641, 0x0642, 0x0643, /* 0xe0 */ 0x00e0, 0x0644, 0x00e2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0649, 0x064a, 0x00ee, 0x00ef, /* 0xf0 */ 0x064b, 0x064c, 0x064d, 0x064e, 0x00f4, 0x064f, 0x0650, 0x00f7, 0x0651, 0x00f9, 0x0652, 0x00fb, 0x00fc, 0x200e, 0x200f, 0x06d2, }; static int cp1256_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) cp1256_2uni[c-0x80]; return 1; } static const unsigned char cp1256_page00[96] = { 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0xb8, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0xe0, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0x00, 0x00, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0xf7, /* 0xf0-0xf7 */ 0x00, 0xf9, 0x00, 0xfb, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ }; static const unsigned char cp1256_page01[72] = { 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char cp1256_page06[208] = { 0x00, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0xbf, /* 0x18-0x1f */ 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd8, /* 0x30-0x37 */ 0xd9, 0xda, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0xdc, 0xdd, 0xde, 0xdf, 0xe1, 0xe3, 0xe4, 0xe5, /* 0x40-0x47 */ 0xe6, 0xec, 0xed, 0xf0, 0xf1, 0xf2, 0xf3, 0xf5, /* 0x48-0x4f */ 0xf6, 0xf8, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8d, 0x00, /* 0x80-0x87 */ 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, /* 0xa8-0xaf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0xaa, 0x00, /* 0xb8-0xbf */ 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ }; static const unsigned char cp1256_page20[56] = { 0x00, 0x00, 0x00, 0x00, 0x9d, 0x9e, 0xfd, 0xfe, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1256_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = cp1256_page00[wc-0x00a0]; else if (wc >= 0x0150 && wc < 0x0198) c = cp1256_page01[wc-0x0150]; else if (wc == 0x02c6) c = 0x88; else if (wc >= 0x0608 && wc < 0x06d8) c = cp1256_page06[wc-0x0608]; else if (wc >= 0x2008 && wc < 0x2040) c = cp1256_page20[wc-0x2008]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp1257.h000066400000000000000000000130571252300335000240250ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1257 */ static const unsigned short cp1257_2uni[128] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0xfffd, 0x201e, 0x2026, 0x2020, 0x2021, 0xfffd, 0x2030, 0xfffd, 0x2039, 0xfffd, 0x00a8, 0x02c7, 0x00b8, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0xfffd, 0x2122, 0xfffd, 0x203a, 0xfffd, 0x00af, 0x02db, 0xfffd, /* 0xa0 */ 0x00a0, 0xfffd, 0x00a2, 0x00a3, 0x00a4, 0xfffd, 0x00a6, 0x00a7, 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6, /* 0xc0 */ 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b, /* 0xd0 */ 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df, /* 0xe0 */ 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c, /* 0xf0 */ 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x02d9, }; static int cp1257_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp1257_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp1257_page00[224] = { 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0x8d, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x9d, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x8f, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0xc4, 0xc5, 0xaf, 0x00, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0xd3, 0x00, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xa8, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe5, 0xbf, 0x00, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0xf3, 0x00, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xb8, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0xc2, 0xe2, 0x00, 0x00, 0xc0, 0xe0, 0xc3, 0xe3, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0xc7, 0xe7, 0x00, 0x00, 0xcb, 0xeb, /* 0x10-0x17 */ 0xc6, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0xce, 0xee, 0x00, 0x00, 0xc1, 0xe1, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcd, 0xed, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0xcf, 0xef, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0xd9, 0xf9, 0xd1, 0xf1, 0xd2, 0xf2, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0xd4, 0xf4, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xba, /* 0x50-0x57 */ 0x00, 0x00, 0xda, 0xfa, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0xdb, 0xfb, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0xd8, 0xf8, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0xca, 0xea, 0xdd, 0xfd, 0xde, 0xfe, 0x00, /* 0x78-0x7f */ }; static const unsigned char cp1257_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0xff, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1257_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1257_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = cp1257_page00[wc-0x00a0]; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1257_page02[wc-0x02c0]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1257_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp1258.h000066400000000000000000000244761252300335000240350ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1258 */ #include "flushwc.h" #include "vietcomb.h" static const unsigned char cp1258_comb_table[] = { 0xcc, 0xec, 0xde, 0xd2, 0xf2, }; /* The possible bases in viet_comp_table_data: 0x0041..0x0045, 0x0047..0x0049, 0x004B..0x0050, 0x0052..0x0057, 0x0059..0x005A, 0x0061..0x0065, 0x0067..0x0069, 0x006B..0x0070, 0x0072..0x0077, 0x0079..0x007A, 0x00A5, 0x00A8, 0x00C2, 0x00C5..0x00C7, 0x00CA, 0x00CF, 0x00D3..0x00D4, 0x00D6, 0x00D8, 0x00DA, 0x00DC, 0x00E2, 0x00E5..0x00E7, 0x00EA, 0x00EF, 0x00F3..0x00F4, 0x00F6, 0x00F8, 0x00FA, 0x00FC, 0x0102..0x0103, 0x01A0..0x01A1, 0x01AF..0x01B0. */ static const unsigned int cp1258_comp_bases[] = { 0x06fdfbbe, 0x06fdfbbe, 0x00000000, 0x00000120, 0x155884e4, 0x155884e4, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00018003 }; static const unsigned short cp1258_2uni[128] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0xfffd, 0x2039, 0x0152, 0xfffd, 0xfffd, 0xfffd, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0xfffd, 0x203a, 0x0153, 0xfffd, 0xfffd, 0x0178, /* 0xa0 */ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, /* 0xc0 */ 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x0300, 0x00cd, 0x00ce, 0x00cf, /* 0xd0 */ 0x0110, 0x00d1, 0x0309, 0x00d3, 0x00d4, 0x01a0, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x01af, 0x0303, 0x00df, /* 0xe0 */ 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0301, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0x0111, 0x00f1, 0x0323, 0x00f3, 0x00f4, 0x01a1, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x01b0, 0x20ab, 0x00ff, }; /* In the CP1258 to Unicode direction, the state contains a buffered character, or 0 if none. */ static int cp1258_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; unsigned short wc; unsigned short last_wc; if (c < 0x80) { wc = c; } else { wc = cp1258_2uni[c-0x80]; if (wc == 0xfffd) return RET_ILSEQ; } last_wc = conv->istate; if (last_wc) { if (wc >= 0x0300 && wc < 0x0340) { /* See whether last_wc and wc can be combined. */ unsigned int k; unsigned int i1, i2; switch (wc) { case 0x0300: k = 0; break; case 0x0301: k = 1; break; case 0x0303: k = 2; break; case 0x0309: k = 3; break; case 0x0323: k = 4; break; default: abort(); } i1 = viet_comp_table[k].idx; i2 = i1 + viet_comp_table[k].len-1; if (last_wc >= viet_comp_table_data[i1].base && last_wc <= viet_comp_table_data[i2].base) { unsigned int i; for (;;) { i = (i1+i2)>>1; if (last_wc == viet_comp_table_data[i].base) break; if (last_wc < viet_comp_table_data[i].base) { if (i1 == i) goto not_combining; i2 = i; } else { if (i1 != i) i1 = i; else { i = i2; if (last_wc == viet_comp_table_data[i].base) break; goto not_combining; } } } last_wc = viet_comp_table_data[i].composed; /* Output the combined character. */ conv->istate = 0; *pwc = (ucs4_t) last_wc; return 1; } } not_combining: /* Output the buffered character. */ conv->istate = 0; *pwc = (ucs4_t) last_wc; return 0; /* Don't advance the input pointer. */ } if (wc >= 0x0041 && wc <= 0x01b0 && ((cp1258_comp_bases[(wc - 0x0040) >> 5] >> (wc & 0x1f)) & 1)) { /* wc is a possible match in viet_comp_table_data. Buffer it. */ conv->istate = wc; return RET_TOOFEW(1); } else { /* Output wc immediately. */ *pwc = (ucs4_t) wc; return 1; } } #define cp1258_flushwc normal_flushwc static const unsigned char cp1258_page00[88] = { 0xc0, 0xc1, 0xc2, 0x00, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xc0-0xc7 */ 0xc8, 0xc9, 0xca, 0xcb, 0x00, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ 0x00, 0xd1, 0x00, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0x00, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0x00, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0xf1, 0x00, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */ /* 0x0100 */ 0x00, 0x00, 0xc3, 0xe3, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ }; static const unsigned char cp1258_page01[104] = { 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xd5, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, /* 0xa8-0xaf */ 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ }; static const unsigned char cp1258_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1258_page03[40] = { 0xcc, 0xec, 0x00, 0xde, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char cp1258_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1258_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = wc; else if (wc >= 0x00c0 && wc < 0x0118) c = cp1258_page00[wc-0x00c0]; else if (wc >= 0x0150 && wc < 0x01b8) c = cp1258_page01[wc-0x0150]; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1258_page02[wc-0x02c0]; else if (wc >= 0x0300 && wc < 0x0328) c = cp1258_page03[wc-0x0300]; else if (wc >= 0x0340 && wc < 0x0342) /* deprecated Vietnamese tone marks */ c = cp1258_page03[wc-0x0340]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1258_page20[wc-0x2010]; else if (wc == 0x20ab) c = 0xfe; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } /* Try canonical decomposition. */ { /* Binary search through viet_decomp_table. */ unsigned int i1 = 0; unsigned int i2 = sizeof(viet_decomp_table)/sizeof(viet_decomp_table[0])-1; if (wc >= viet_decomp_table[i1].composed && wc <= viet_decomp_table[i2].composed) { unsigned int i; for (;;) { /* Here i2 - i1 > 0. */ i = (i1+i2)>>1; if (wc == viet_decomp_table[i].composed) break; if (wc < viet_decomp_table[i].composed) { if (i1 == i) return RET_ILUNI; /* Here i1 < i < i2. */ i2 = i; } else { /* Here i1 <= i < i2. */ if (i1 != i) i1 = i; else { /* Here i2 - i1 = 1. */ i = i2; if (wc == viet_decomp_table[i].composed) break; else return RET_ILUNI; } } } /* Found a canonical decomposition. */ wc = viet_decomp_table[i].base; /* wc is one of 0x0020, 0x0041..0x005a, 0x0061..0x007a, 0x00a5, 0x00a8, 0x00c2, 0x00c5..0x00c7, 0x00ca, 0x00cf, 0x00d3, 0x00d4, 0x00d6, 0x00d8, 0x00da, 0x00dc, 0x00e2, 0x00e5..0x00e7, 0x00ea, 0x00ef, 0x00f3, 0x00f4, 0x00f6, 0x00f8, 0x00fc, 0x0102, 0x0103, 0x01a0, 0x01a1, 0x01af, 0x01b0. */ if (wc < 0x0100) c = wc; else if (wc < 0x0118) c = cp1258_page00[wc-0x00c0]; else c = cp1258_page01[wc-0x0150]; if (n < 2) return RET_TOOSMALL; r[0] = c; r[1] = cp1258_comb_table[viet_decomp_table[i].comb1]; return 2; } } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp437.h000066400000000000000000000152441252300335000237440ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP437 */ static const unsigned short cp437_2uni[128] = { /* 0x80 */ 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5, /* 0x90 */ 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, 0x00ff, 0x00d6, 0x00dc, 0x00a2, 0x00a3, 0x00a5, 0x20a7, 0x0192, /* 0xa0 */ 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, /* 0xb0 */ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, /* 0xc0 */ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, /* 0xd0 */ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, /* 0xe0 */ 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, /* 0xf0 */ 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0, }; static int cp437_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) cp437_2uni[c-0x80]; return 1; } static const unsigned char cp437_page00[96] = { 0xff, 0xad, 0x9b, 0x9c, 0x00, 0x9d, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0xa6, 0xae, 0xaa, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0xf8, 0xf1, 0xfd, 0x00, 0x00, 0xe6, 0x00, 0xfa, /* 0xb0-0xb7 */ 0x00, 0x00, 0xa7, 0xaf, 0xac, 0xab, 0x00, 0xa8, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x8e, 0x8f, 0x92, 0x80, /* 0xc0-0xc7 */ 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x99, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0xe1, /* 0xd8-0xdf */ 0x85, 0xa0, 0x83, 0x00, 0x84, 0x86, 0x91, 0x87, /* 0xe0-0xe7 */ 0x8a, 0x82, 0x88, 0x89, 0x8d, 0xa1, 0x8c, 0x8b, /* 0xe8-0xef */ 0x00, 0xa4, 0x95, 0xa2, 0x93, 0x00, 0x94, 0xf6, /* 0xf0-0xf7 */ 0x00, 0x97, 0xa3, 0x96, 0x81, 0x00, 0x00, 0x98, /* 0xf8-0xff */ }; static const unsigned char cp437_page03[56] = { 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0xe8, 0x00, /* 0xa0-0xa7 */ 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x00, 0xe0, 0x00, 0x00, 0xeb, 0xee, 0x00, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0xe3, 0x00, 0x00, 0xe5, 0xe7, 0x00, 0xed, 0x00, /* 0xc0-0xc7 */ }; static const unsigned char cp437_page22[80] = { 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0xec, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0xf0, 0x00, 0x00, 0xf3, 0xf2, 0x00, 0x00, /* 0x60-0x67 */ }; static const unsigned char cp437_page23[24] = { 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0xf4, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char cp437_page25[168] = { 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, /* 0x50-0x57 */ 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, /* 0x58-0x5f */ 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, /* 0x60-0x67 */ 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int cp437_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = cp437_page00[wc-0x00a0]; else if (wc == 0x0192) c = 0x9f; else if (wc >= 0x0390 && wc < 0x03c8) c = cp437_page03[wc-0x0390]; else if (wc == 0x207f) c = 0xfc; else if (wc == 0x20a7) c = 0x9e; else if (wc >= 0x2218 && wc < 0x2268) c = cp437_page22[wc-0x2218]; else if (wc >= 0x2310 && wc < 0x2328) c = cp437_page23[wc-0x2310]; else if (wc >= 0x2500 && wc < 0x25a8) c = cp437_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp737.h000066400000000000000000000136571252300335000237550ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP737 */ static const unsigned short cp737_2uni[128] = { /* 0x80 */ 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, /* 0x90 */ 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, /* 0xa0 */ 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c2, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, /* 0xb0 */ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, /* 0xc0 */ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, /* 0xd0 */ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, /* 0xe0 */ 0x03c9, 0x03ac, 0x03ad, 0x03ae, 0x03ca, 0x03af, 0x03cc, 0x03cd, 0x03cb, 0x03ce, 0x0386, 0x0388, 0x0389, 0x038a, 0x038c, 0x038e, /* 0xf0 */ 0x038f, 0x00b1, 0x2265, 0x2264, 0x03aa, 0x03ab, 0x00f7, 0x2248, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0, }; static int cp737_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) cp737_2uni[c-0x80]; return 1; } static const unsigned char cp737_page00[24] = { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0xf8, 0xf1, 0xfd, 0x00, 0x00, 0x00, 0x00, 0xfa, /* 0xb0-0xb7 */ }; static const unsigned char cp737_page03[80] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x00, /* 0x80-0x87 */ 0xeb, 0xec, 0xed, 0x00, 0xee, 0x00, 0xef, 0xf0, /* 0x88-0x8f */ 0x00, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, /* 0x90-0x97 */ 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, /* 0x98-0x9f */ 0x8f, 0x90, 0x00, 0x91, 0x92, 0x93, 0x94, 0x95, /* 0xa0-0xa7 */ 0x96, 0x97, 0xf4, 0xf5, 0xe1, 0xe2, 0xe3, 0xe5, /* 0xa8-0xaf */ 0x00, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, /* 0xb0-0xb7 */ 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, /* 0xb8-0xbf */ 0xa7, 0xa8, 0xaa, 0xa9, 0xab, 0xac, 0xad, 0xae, /* 0xc0-0xc7 */ 0xaf, 0xe0, 0xe4, 0xe8, 0xe6, 0xe7, 0xe9, 0x00, /* 0xc8-0xcf */ }; static const unsigned char cp737_page22[80] = { 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0xf3, 0xf2, 0x00, 0x00, /* 0x60-0x67 */ }; static const unsigned char cp737_page25[168] = { 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, /* 0x50-0x57 */ 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, /* 0x58-0x5f */ 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, /* 0x60-0x67 */ 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int cp737_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00b8) c = cp737_page00[wc-0x00a0]; else if (wc == 0x00f7) c = 0xf6; else if (wc >= 0x0380 && wc < 0x03d0) c = cp737_page03[wc-0x0380]; else if (wc == 0x207f) c = 0xfc; else if (wc >= 0x2218 && wc < 0x2268) c = cp737_page22[wc-0x2218]; else if (wc >= 0x2500 && wc < 0x25a8) c = cp737_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp775.h000066400000000000000000000142471252300335000237530ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP775 */ static const unsigned short cp775_2uni[128] = { /* 0x80 */ 0x0106, 0x00fc, 0x00e9, 0x0101, 0x00e4, 0x0123, 0x00e5, 0x0107, 0x0142, 0x0113, 0x0156, 0x0157, 0x012b, 0x0179, 0x00c4, 0x00c5, /* 0x90 */ 0x00c9, 0x00e6, 0x00c6, 0x014d, 0x00f6, 0x0122, 0x00a2, 0x015a, 0x015b, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x00d7, 0x00a4, /* 0xa0 */ 0x0100, 0x012a, 0x00f3, 0x017b, 0x017c, 0x017a, 0x201d, 0x00a6, 0x00a9, 0x00ae, 0x00ac, 0x00bd, 0x00bc, 0x0141, 0x00ab, 0x00bb, /* 0xb0 */ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, 0x010c, 0x0118, 0x0116, 0x2563, 0x2551, 0x2557, 0x255d, 0x012e, 0x0160, 0x2510, /* 0xc0 */ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x0172, 0x016a, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x017d, /* 0xd0 */ 0x0105, 0x010d, 0x0119, 0x0117, 0x012f, 0x0161, 0x0173, 0x016b, 0x017e, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, /* 0xe0 */ 0x00d3, 0x00df, 0x014c, 0x0143, 0x00f5, 0x00d5, 0x00b5, 0x0144, 0x0136, 0x0137, 0x013b, 0x013c, 0x0146, 0x0112, 0x0145, 0x2019, /* 0xf0 */ 0x00ad, 0x00b1, 0x201c, 0x00be, 0x00b6, 0x00a7, 0x00f7, 0x201e, 0x00b0, 0x2219, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0, }; static int cp775_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) cp775_2uni[c-0x80]; return 1; } static const unsigned char cp775_page00[224] = { 0xff, 0x00, 0x96, 0x9c, 0x9f, 0x00, 0xa7, 0xf5, /* 0xa0-0xa7 */ 0x00, 0xa8, 0x00, 0xae, 0xaa, 0xf0, 0xa9, 0x00, /* 0xa8-0xaf */ 0xf8, 0xf1, 0xfd, 0xfc, 0x00, 0xe6, 0xf4, 0xfa, /* 0xb0-0xb7 */ 0x00, 0xfb, 0x00, 0xaf, 0xac, 0xab, 0xf3, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x8e, 0x8f, 0x92, 0x00, /* 0xc0-0xc7 */ 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0xe0, 0x00, 0xe5, 0x99, 0x9e, /* 0xd0-0xd7 */ 0x9d, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0xe1, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x84, 0x86, 0x91, 0x00, /* 0xe0-0xe7 */ 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0xa2, 0x00, 0xe4, 0x94, 0xf6, /* 0xf0-0xf7 */ 0x9b, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0xa0, 0x83, 0x00, 0x00, 0xb5, 0xd0, 0x80, 0x87, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xb6, 0xd1, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0xed, 0x89, 0x00, 0x00, 0xb8, 0xd3, /* 0x10-0x17 */ 0xb7, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x95, 0x85, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0xa1, 0x8c, 0x00, 0x00, 0xbd, 0xd4, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xe9, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0xea, 0xeb, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0xad, 0x88, 0xe3, 0xe7, 0xee, 0xec, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0xe2, 0x93, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x8b, /* 0x50-0x57 */ 0x00, 0x00, 0x97, 0x98, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xbe, 0xd5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0xc7, 0xd7, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0xc6, 0xd6, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x8d, 0xa5, 0xa3, 0xa4, 0xcf, 0xd8, 0x00, /* 0x78-0x7f */ }; static const unsigned char cp775_page20[8] = { 0x00, 0xef, 0x00, 0x00, 0xf2, 0xa6, 0xf7, 0x00, /* 0x18-0x1f */ }; static const unsigned char cp775_page25[168] = { 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xcd, 0xba, 0x00, 0x00, 0xc9, 0x00, 0x00, 0xbb, /* 0x50-0x57 */ 0x00, 0x00, 0xc8, 0x00, 0x00, 0xbc, 0x00, 0x00, /* 0x58-0x5f */ 0xcc, 0x00, 0x00, 0xb9, 0x00, 0x00, 0xcb, 0x00, /* 0x60-0x67 */ 0x00, 0xca, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int cp775_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = cp775_page00[wc-0x00a0]; else if (wc >= 0x2018 && wc < 0x2020) c = cp775_page20[wc-0x2018]; else if (wc == 0x2219) c = 0xf9; else if (wc >= 0x2500 && wc < 0x25a8) c = cp775_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp850.h000066400000000000000000000120101252300335000237270ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP850 */ static const unsigned short cp850_2uni[128] = { /* 0x80 */ 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5, /* 0x90 */ 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, 0x00ff, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x00d7, 0x0192, /* 0xa0 */ 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, 0x00bf, 0x00ae, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, /* 0xb0 */ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00c1, 0x00c2, 0x00c0, 0x00a9, 0x2563, 0x2551, 0x2557, 0x255d, 0x00a2, 0x00a5, 0x2510, /* 0xc0 */ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x00e3, 0x00c3, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4, /* 0xd0 */ 0x00f0, 0x00d0, 0x00ca, 0x00cb, 0x00c8, 0x0131, 0x00cd, 0x00ce, 0x00cf, 0x2518, 0x250c, 0x2588, 0x2584, 0x00a6, 0x00cc, 0x2580, /* 0xe0 */ 0x00d3, 0x00df, 0x00d4, 0x00d2, 0x00f5, 0x00d5, 0x00b5, 0x00fe, 0x00de, 0x00da, 0x00db, 0x00d9, 0x00fd, 0x00dd, 0x00af, 0x00b4, /* 0xf0 */ 0x00ad, 0x00b1, 0x2017, 0x00be, 0x00b6, 0x00a7, 0x00f7, 0x00b8, 0x00b0, 0x00a8, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0, }; static int cp850_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) cp850_2uni[c-0x80]; return 1; } static const unsigned char cp850_page00[96] = { 0xff, 0xad, 0xbd, 0x9c, 0xcf, 0xbe, 0xdd, 0xf5, /* 0xa0-0xa7 */ 0xf9, 0xb8, 0xa6, 0xae, 0xaa, 0xf0, 0xa9, 0xee, /* 0xa8-0xaf */ 0xf8, 0xf1, 0xfd, 0xfc, 0xef, 0xe6, 0xf4, 0xfa, /* 0xb0-0xb7 */ 0xf7, 0xfb, 0xa7, 0xaf, 0xac, 0xab, 0xf3, 0xa8, /* 0xb8-0xbf */ 0xb7, 0xb5, 0xb6, 0xc7, 0x8e, 0x8f, 0x92, 0x80, /* 0xc0-0xc7 */ 0xd4, 0x90, 0xd2, 0xd3, 0xde, 0xd6, 0xd7, 0xd8, /* 0xc8-0xcf */ 0xd1, 0xa5, 0xe3, 0xe0, 0xe2, 0xe5, 0x99, 0x9e, /* 0xd0-0xd7 */ 0x9d, 0xeb, 0xe9, 0xea, 0x9a, 0xed, 0xe8, 0xe1, /* 0xd8-0xdf */ 0x85, 0xa0, 0x83, 0xc6, 0x84, 0x86, 0x91, 0x87, /* 0xe0-0xe7 */ 0x8a, 0x82, 0x88, 0x89, 0x8d, 0xa1, 0x8c, 0x8b, /* 0xe8-0xef */ 0xd0, 0xa4, 0x95, 0xa2, 0x93, 0xe4, 0x94, 0xf6, /* 0xf0-0xf7 */ 0x9b, 0x97, 0xa3, 0x96, 0x81, 0xec, 0xe7, 0x98, /* 0xf8-0xff */ }; static const unsigned char cp850_page25[168] = { 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xcd, 0xba, 0x00, 0x00, 0xc9, 0x00, 0x00, 0xbb, /* 0x50-0x57 */ 0x00, 0x00, 0xc8, 0x00, 0x00, 0xbc, 0x00, 0x00, /* 0x58-0x5f */ 0xcc, 0x00, 0x00, 0xb9, 0x00, 0x00, 0xcb, 0x00, /* 0x60-0x67 */ 0x00, 0xca, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int cp850_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = cp850_page00[wc-0x00a0]; else if (wc == 0x0131) c = 0xd5; else if (wc == 0x0192) c = 0x9f; else if (wc == 0x2017) c = 0xf2; else if (wc >= 0x2500 && wc < 0x25a8) c = cp850_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp852.h000066400000000000000000000145071252300335000237460ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP852 */ static const unsigned short cp852_2uni[128] = { /* 0x80 */ 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x016f, 0x0107, 0x00e7, 0x0142, 0x00eb, 0x0150, 0x0151, 0x00ee, 0x0179, 0x00c4, 0x0106, /* 0x90 */ 0x00c9, 0x0139, 0x013a, 0x00f4, 0x00f6, 0x013d, 0x013e, 0x015a, 0x015b, 0x00d6, 0x00dc, 0x0164, 0x0165, 0x0141, 0x00d7, 0x010d, /* 0xa0 */ 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x0104, 0x0105, 0x017d, 0x017e, 0x0118, 0x0119, 0x00ac, 0x017a, 0x010c, 0x015f, 0x00ab, 0x00bb, /* 0xb0 */ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00c1, 0x00c2, 0x011a, 0x015e, 0x2563, 0x2551, 0x2557, 0x255d, 0x017b, 0x017c, 0x2510, /* 0xc0 */ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x0102, 0x0103, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4, /* 0xd0 */ 0x0111, 0x0110, 0x010e, 0x00cb, 0x010f, 0x0147, 0x00cd, 0x00ce, 0x011b, 0x2518, 0x250c, 0x2588, 0x2584, 0x0162, 0x016e, 0x2580, /* 0xe0 */ 0x00d3, 0x00df, 0x00d4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, 0x0154, 0x00da, 0x0155, 0x0170, 0x00fd, 0x00dd, 0x0163, 0x00b4, /* 0xf0 */ 0x00ad, 0x02dd, 0x02db, 0x02c7, 0x02d8, 0x00a7, 0x00f7, 0x00b8, 0x00b0, 0x00a8, 0x02d9, 0x0171, 0x0158, 0x0159, 0x25a0, 0x00a0, }; static int cp852_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) cp852_2uni[c-0x80]; return 1; } static const unsigned char cp852_page00[224] = { 0xff, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 0xf5, /* 0xa0-0xa7 */ 0xf9, 0x00, 0x00, 0xae, 0xaa, 0xf0, 0x00, 0x00, /* 0xa8-0xaf */ 0xf8, 0x00, 0x00, 0x00, 0xef, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0xf7, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0xb5, 0xb6, 0x00, 0x8e, 0x00, 0x00, 0x80, /* 0xc0-0xc7 */ 0x00, 0x90, 0x00, 0xd3, 0x00, 0xd6, 0xd7, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0xe0, 0xe2, 0x00, 0x99, 0x9e, /* 0xd0-0xd7 */ 0x00, 0x00, 0xe9, 0x00, 0x9a, 0xed, 0x00, 0xe1, /* 0xd8-0xdf */ 0x00, 0xa0, 0x83, 0x00, 0x84, 0x00, 0x00, 0x87, /* 0xe0-0xe7 */ 0x00, 0x82, 0x00, 0x89, 0x00, 0xa1, 0x8c, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0xa2, 0x93, 0x00, 0x94, 0xf6, /* 0xf0-0xf7 */ 0x00, 0x00, 0xa3, 0x00, 0x81, 0xec, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0x00, 0x00, 0xc6, 0xc7, 0xa4, 0xa5, 0x8f, 0x86, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xac, 0x9f, 0xd2, 0xd4, /* 0x08-0x0f */ 0xd1, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xa8, 0xa9, 0xb7, 0xd8, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x91, 0x92, 0x00, 0x00, 0x95, 0x96, 0x00, /* 0x38-0x3f */ 0x00, 0x9d, 0x88, 0xe3, 0xe4, 0x00, 0x00, 0xd5, /* 0x40-0x47 */ 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x8a, 0x8b, 0x00, 0x00, 0xe8, 0xea, 0x00, 0x00, /* 0x50-0x57 */ 0xfc, 0xfd, 0x97, 0x98, 0x00, 0x00, 0xb8, 0xad, /* 0x58-0x5f */ 0xe6, 0xe7, 0xdd, 0xee, 0x9b, 0x9c, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x85, /* 0x68-0x6f */ 0xeb, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x8d, 0xab, 0xbd, 0xbe, 0xa6, 0xa7, 0x00, /* 0x78-0x7f */ }; static const unsigned char cp852_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf3, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0xf4, 0xfa, 0x00, 0xf2, 0x00, 0xf1, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp852_page25[168] = { 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xcd, 0xba, 0x00, 0x00, 0xc9, 0x00, 0x00, 0xbb, /* 0x50-0x57 */ 0x00, 0x00, 0xc8, 0x00, 0x00, 0xbc, 0x00, 0x00, /* 0x58-0x5f */ 0xcc, 0x00, 0x00, 0xb9, 0x00, 0x00, 0xcb, 0x00, /* 0x60-0x67 */ 0x00, 0xca, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int cp852_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = cp852_page00[wc-0x00a0]; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp852_page02[wc-0x02c0]; else if (wc >= 0x2500 && wc < 0x25a8) c = cp852_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp853.h000066400000000000000000000145001252300335000237400ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP853 */ static const unsigned short cp853_2uni[128] = { /* 0x80 */ 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x0109, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x0108, /* 0x90 */ 0x00c9, 0x010b, 0x010a, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, 0x0130, 0x00d6, 0x00dc, 0x011d, 0x00a3, 0x011c, 0x00d7, 0x0135, /* 0xa0 */ 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x011e, 0x011f, 0x0124, 0x0125, 0xfffd, 0x00bd, 0x0134, 0x015f, 0x00ab, 0x00bb, /* 0xb0 */ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00c1, 0x00c2, 0x00c0, 0x015e, 0x2563, 0x2551, 0x2557, 0x255d, 0x017b, 0x017c, 0x2510, /* 0xc0 */ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x015c, 0x015d, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4, /* 0xd0 */ 0xfffd, 0xfffd, 0x00ca, 0x00cb, 0x00c8, 0x0131, 0x00cd, 0x00ce, 0x00cf, 0x2518, 0x250c, 0x2588, 0x2584, 0xfffd, 0x00cc, 0x2580, /* 0xe0 */ 0x00d3, 0x00df, 0x00d4, 0x00d2, 0x0120, 0x0121, 0x00b5, 0x0126, 0x0127, 0x00da, 0x00db, 0x00d9, 0x016c, 0x016d, 0xfffd, 0x00b4, /* 0xf0 */ 0x00ad, 0xfffd, 0x2113, 0x0149, 0x02d8, 0x00a7, 0x00f7, 0x00b8, 0x00b0, 0x00a8, 0x02d9, 0xfffd, 0x00b3, 0x00b2, 0x25a0, 0x00a0, }; static int cp853_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp853_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp853_page00[96] = { 0xff, 0x00, 0x00, 0x9c, 0xcf, 0x00, 0x00, 0xf5, /* 0xa0-0xa7 */ 0xf9, 0x00, 0x00, 0xae, 0x00, 0xf0, 0x00, 0x00, /* 0xa8-0xaf */ 0xf8, 0x00, 0xfd, 0xfc, 0xef, 0xe6, 0x00, 0x00, /* 0xb0-0xb7 */ 0xf7, 0x00, 0x00, 0xaf, 0x00, 0xab, 0x00, 0x00, /* 0xb8-0xbf */ 0xb7, 0xb5, 0xb6, 0x00, 0x8e, 0x00, 0x00, 0x80, /* 0xc0-0xc7 */ 0xd4, 0x90, 0xd2, 0xd3, 0xde, 0xd6, 0xd7, 0xd8, /* 0xc8-0xcf */ 0x00, 0xa5, 0xe3, 0xe0, 0xe2, 0x00, 0x99, 0x9e, /* 0xd0-0xd7 */ 0x00, 0xeb, 0xe9, 0xea, 0x9a, 0x00, 0x00, 0xe1, /* 0xd8-0xdf */ 0x85, 0xa0, 0x83, 0x00, 0x84, 0x00, 0x00, 0x87, /* 0xe0-0xe7 */ 0x8a, 0x82, 0x88, 0x89, 0x8d, 0xa1, 0x8c, 0x8b, /* 0xe8-0xef */ 0x00, 0xa4, 0x95, 0xa2, 0x93, 0x00, 0x94, 0xf6, /* 0xf0-0xf7 */ 0x00, 0x97, 0xa3, 0x96, 0x81, 0x00, 0x00, 0x00, /* 0xf8-0xff */ }; static const unsigned char cp853_page01[120] = { 0x8f, 0x86, 0x92, 0x91, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x9d, 0x9b, 0xa6, 0xa7, /* 0x18-0x1f */ 0xe4, 0xe5, 0x00, 0x00, 0xa8, 0xa9, 0xe7, 0xe8, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x98, 0xd5, 0x00, 0x00, 0xac, 0x9f, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc7, 0xb8, 0xad, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0xec, 0xed, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0xbd, 0xbe, 0x00, 0x00, 0x00, /* 0x78-0x7f */ }; static const unsigned char cp853_page02[8] = { 0xf4, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp853_page25[168] = { 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xcd, 0xba, 0x00, 0x00, 0xc9, 0x00, 0x00, 0xbb, /* 0x50-0x57 */ 0x00, 0x00, 0xc8, 0x00, 0x00, 0xbc, 0x00, 0x00, /* 0x58-0x5f */ 0xcc, 0x00, 0x00, 0xb9, 0x00, 0x00, 0xcb, 0x00, /* 0x60-0x67 */ 0x00, 0xca, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int cp853_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = cp853_page00[wc-0x00a0]; else if (wc >= 0x0108 && wc < 0x0180) c = cp853_page01[wc-0x0108]; else if (wc >= 0x02d8 && wc < 0x02e0) c = cp853_page02[wc-0x02d8]; else if (wc == 0x2113) c = 0xf2; else if (wc >= 0x2500 && wc < 0x25a8) c = cp853_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp855.h000066400000000000000000000124761252300335000237540ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP855 */ static const unsigned short cp855_2uni[128] = { /* 0x80 */ 0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, 0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408, /* 0x90 */ 0x0459, 0x0409, 0x045a, 0x040a, 0x045b, 0x040b, 0x045c, 0x040c, 0x045e, 0x040e, 0x045f, 0x040f, 0x044e, 0x042e, 0x044a, 0x042a, /* 0xa0 */ 0x0430, 0x0410, 0x0431, 0x0411, 0x0446, 0x0426, 0x0434, 0x0414, 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, 0x0413, 0x00ab, 0x00bb, /* 0xb0 */ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, 0x0425, 0x0438, 0x0418, 0x2563, 0x2551, 0x2557, 0x255d, 0x0439, 0x0419, 0x2510, /* 0xc0 */ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x043a, 0x041a, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4, /* 0xd0 */ 0x043b, 0x041b, 0x043c, 0x041c, 0x043d, 0x041d, 0x043e, 0x041e, 0x043f, 0x2518, 0x250c, 0x2588, 0x2584, 0x041f, 0x044f, 0x2580, /* 0xe0 */ 0x042f, 0x0440, 0x0420, 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, 0x0423, 0x0436, 0x0416, 0x0432, 0x0412, 0x044c, 0x042c, 0x2116, /* 0xf0 */ 0x00ad, 0x044b, 0x042b, 0x0437, 0x0417, 0x0448, 0x0428, 0x044d, 0x042d, 0x0449, 0x0429, 0x0447, 0x0427, 0x00a7, 0x25a0, 0x00a0, }; static int cp855_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) cp855_2uni[c-0x80]; return 1; } static const unsigned char cp855_page00[32] = { 0xff, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 0xfd, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0xae, 0x00, 0xf0, 0x00, 0x00, /* 0xa8-0xaf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char cp855_page04[96] = { 0x00, 0x85, 0x81, 0x83, 0x87, 0x89, 0x8b, 0x8d, /* 0x00-0x07 */ 0x8f, 0x91, 0x93, 0x95, 0x97, 0x00, 0x99, 0x9b, /* 0x08-0x0f */ 0xa1, 0xa3, 0xec, 0xad, 0xa7, 0xa9, 0xea, 0xf4, /* 0x10-0x17 */ 0xb8, 0xbe, 0xc7, 0xd1, 0xd3, 0xd5, 0xd7, 0xdd, /* 0x18-0x1f */ 0xe2, 0xe4, 0xe6, 0xe8, 0xab, 0xb6, 0xa5, 0xfc, /* 0x20-0x27 */ 0xf6, 0xfa, 0x9f, 0xf2, 0xee, 0xf8, 0x9d, 0xe0, /* 0x28-0x2f */ 0xa0, 0xa2, 0xeb, 0xac, 0xa6, 0xa8, 0xe9, 0xf3, /* 0x30-0x37 */ 0xb7, 0xbd, 0xc6, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, /* 0x38-0x3f */ 0xe1, 0xe3, 0xe5, 0xe7, 0xaa, 0xb5, 0xa4, 0xfb, /* 0x40-0x47 */ 0xf5, 0xf9, 0x9e, 0xf1, 0xed, 0xf7, 0x9c, 0xde, /* 0x48-0x4f */ 0x00, 0x84, 0x80, 0x82, 0x86, 0x88, 0x8a, 0x8c, /* 0x50-0x57 */ 0x8e, 0x90, 0x92, 0x94, 0x96, 0x00, 0x98, 0x9a, /* 0x58-0x5f */ }; static const unsigned char cp855_page25[168] = { 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xcd, 0xba, 0x00, 0x00, 0xc9, 0x00, 0x00, 0xbb, /* 0x50-0x57 */ 0x00, 0x00, 0xc8, 0x00, 0x00, 0xbc, 0x00, 0x00, /* 0x58-0x5f */ 0xcc, 0x00, 0x00, 0xb9, 0x00, 0x00, 0xcb, 0x00, /* 0x60-0x67 */ 0x00, 0xca, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int cp855_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = cp855_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0460) c = cp855_page04[wc-0x0400]; else if (wc == 0x2116) c = 0xef; else if (wc >= 0x2500 && wc < 0x25a8) c = cp855_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp856.h000066400000000000000000000125521252300335000237500ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP856 */ static const unsigned short cp856_2uni[128] = { /* 0x80 */ 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, /* 0x90 */ 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0xfffd, 0x00a3, 0xfffd, 0x00d7, 0xfffd, /* 0xa0 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x00ae, 0x00ac, 0x00bd, 0x00bc, 0xfffd, 0x00ab, 0x00bb, /* 0xb0 */ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0xfffd, 0xfffd, 0xfffd, 0x00a9, 0x2563, 0x2551, 0x2557, 0x255d, 0x00a2, 0x00a5, 0x2510, /* 0xc0 */ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0xfffd, 0xfffd, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4, /* 0xd0 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2518, 0x250c, 0x2588, 0x2584, 0x00a6, 0xfffd, 0x2580, /* 0xe0 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x00b5, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x00af, 0x00b4, /* 0xf0 */ 0x00ad, 0x00b1, 0x2017, 0x00be, 0x00b6, 0x00a7, 0x00f7, 0x00b8, 0x00b0, 0x00a8, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0, }; static int cp856_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp856_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp856_page00[88] = { 0xff, 0x00, 0xbd, 0x9c, 0xcf, 0xbe, 0xdd, 0xf5, /* 0xa0-0xa7 */ 0xf9, 0xb8, 0x00, 0xae, 0xaa, 0xf0, 0xa9, 0xee, /* 0xa8-0xaf */ 0xf8, 0xf1, 0xfd, 0xfc, 0xef, 0xe6, 0xf4, 0xfa, /* 0xb0-0xb7 */ 0xf7, 0xfb, 0x00, 0xaf, 0xac, 0xab, 0xf3, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, /* 0xf0-0xf7 */ }; static const unsigned char cp856_page05[32] = { 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0xd0-0xd7 */ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0xd8-0xdf */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0xe0-0xe7 */ 0x98, 0x99, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ }; static const unsigned char cp856_page25[168] = { 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xcd, 0xba, 0x00, 0x00, 0xc9, 0x00, 0x00, 0xbb, /* 0x50-0x57 */ 0x00, 0x00, 0xc8, 0x00, 0x00, 0xbc, 0x00, 0x00, /* 0x58-0x5f */ 0xcc, 0x00, 0x00, 0xb9, 0x00, 0x00, 0xcb, 0x00, /* 0x60-0x67 */ 0x00, 0xca, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int cp856_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00f8) c = cp856_page00[wc-0x00a0]; else if (wc >= 0x05d0 && wc < 0x05f0) c = cp856_page05[wc-0x05d0]; else if (wc == 0x2017) c = 0xf2; else if (wc >= 0x2500 && wc < 0x25a8) c = cp856_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp857.h000066400000000000000000000133171252300335000237510ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP857 */ static const unsigned short cp857_2uni[128] = { /* 0x80 */ 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x0131, 0x00c4, 0x00c5, /* 0x90 */ 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, 0x0130, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x015e, 0x015f, /* 0xa0 */ 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x011e, 0x011f, 0x00bf, 0x00ae, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, /* 0xb0 */ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00c1, 0x00c2, 0x00c0, 0x00a9, 0x2563, 0x2551, 0x2557, 0x255d, 0x00a2, 0x00a5, 0x2510, /* 0xc0 */ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x00e3, 0x00c3, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4, /* 0xd0 */ 0x00ba, 0x00aa, 0x00ca, 0x00cb, 0x00c8, 0xfffd, 0x00cd, 0x00ce, 0x00cf, 0x2518, 0x250c, 0x2588, 0x2584, 0x00a6, 0x00cc, 0x2580, /* 0xe0 */ 0x00d3, 0x00df, 0x00d4, 0x00d2, 0x00f5, 0x00d5, 0x00b5, 0xfffd, 0x00d7, 0x00da, 0x00db, 0x00d9, 0x00ec, 0x00ff, 0x00af, 0x00b4, /* 0xf0 */ 0x00ad, 0x00b1, 0xfffd, 0x00be, 0x00b6, 0x00a7, 0x00f7, 0x00b8, 0x00b0, 0x00a8, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0, }; static int cp857_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp857_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp857_page00[96] = { 0xff, 0xad, 0xbd, 0x9c, 0xcf, 0xbe, 0xdd, 0xf5, /* 0xa0-0xa7 */ 0xf9, 0xb8, 0xd1, 0xae, 0xaa, 0xf0, 0xa9, 0xee, /* 0xa8-0xaf */ 0xf8, 0xf1, 0xfd, 0xfc, 0xef, 0xe6, 0xf4, 0xfa, /* 0xb0-0xb7 */ 0xf7, 0xfb, 0xd0, 0xaf, 0xac, 0xab, 0xf3, 0xa8, /* 0xb8-0xbf */ 0xb7, 0xb5, 0xb6, 0xc7, 0x8e, 0x8f, 0x92, 0x80, /* 0xc0-0xc7 */ 0xd4, 0x90, 0xd2, 0xd3, 0xde, 0xd6, 0xd7, 0xd8, /* 0xc8-0xcf */ 0x00, 0xa5, 0xe3, 0xe0, 0xe2, 0xe5, 0x99, 0xe8, /* 0xd0-0xd7 */ 0x9d, 0xeb, 0xe9, 0xea, 0x9a, 0x00, 0x00, 0xe1, /* 0xd8-0xdf */ 0x85, 0xa0, 0x83, 0xc6, 0x84, 0x86, 0x91, 0x87, /* 0xe0-0xe7 */ 0x8a, 0x82, 0x88, 0x89, 0xec, 0xa1, 0x8c, 0x8b, /* 0xe8-0xef */ 0x00, 0xa4, 0x95, 0xa2, 0x93, 0xe4, 0x94, 0xf6, /* 0xf0-0xf7 */ 0x9b, 0x97, 0xa3, 0x96, 0x81, 0x00, 0x00, 0xed, /* 0xf8-0xff */ }; static const unsigned char cp857_page01[72] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0xa7, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x98, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x9f, /* 0x58-0x5f */ }; static const unsigned char cp857_page25[168] = { 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xcd, 0xba, 0x00, 0x00, 0xc9, 0x00, 0x00, 0xbb, /* 0x50-0x57 */ 0x00, 0x00, 0xc8, 0x00, 0x00, 0xbc, 0x00, 0x00, /* 0x58-0x5f */ 0xcc, 0x00, 0x00, 0xb9, 0x00, 0x00, 0xcb, 0x00, /* 0x60-0x67 */ 0x00, 0xca, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int cp857_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = cp857_page00[wc-0x00a0]; else if (wc >= 0x0118 && wc < 0x0160) c = cp857_page01[wc-0x0118]; else if (wc >= 0x2500 && wc < 0x25a8) c = cp857_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp858.h000066400000000000000000000032131252300335000237440ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP858 */ static int cp858_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else if (c == 0xd5) *pwc = 0x20ac; else *pwc = (ucs4_t) cp850_2uni[c-0x80]; return 1; } static int cp858_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = cp850_page00[wc-0x00a0]; else if (wc == 0x0192) c = 0x9f; else if (wc == 0x2017) c = 0xf2; else if (wc == 0x20ac) c = 0xd5; else if (wc >= 0x2500 && wc < 0x25a8) c = cp850_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp860.h000066400000000000000000000145661252300335000237520ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP860 */ static const unsigned short cp860_2uni[128] = { /* 0x80 */ 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e3, 0x00e0, 0x00c1, 0x00e7, 0x00ea, 0x00ca, 0x00e8, 0x00cd, 0x00d4, 0x00ec, 0x00c3, 0x00c2, /* 0x90 */ 0x00c9, 0x00c0, 0x00c8, 0x00f4, 0x00f5, 0x00f2, 0x00da, 0x00f9, 0x00cc, 0x00d5, 0x00dc, 0x00a2, 0x00a3, 0x00d9, 0x20a7, 0x00d3, /* 0xa0 */ 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, 0x00bf, 0x00d2, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, /* 0xb0 */ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, /* 0xc0 */ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, /* 0xd0 */ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, /* 0xe0 */ 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, /* 0xf0 */ 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0, }; static int cp860_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) cp860_2uni[c-0x80]; return 1; } static const unsigned char cp860_page00[96] = { 0xff, 0xad, 0x9b, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0xa6, 0xae, 0xaa, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0xf8, 0xf1, 0xfd, 0x00, 0x00, 0xe6, 0x00, 0xfa, /* 0xb0-0xb7 */ 0x00, 0x00, 0xa7, 0xaf, 0xac, 0xab, 0x00, 0xa8, /* 0xb8-0xbf */ 0x91, 0x86, 0x8f, 0x8e, 0x00, 0x00, 0x00, 0x80, /* 0xc0-0xc7 */ 0x92, 0x90, 0x89, 0x00, 0x98, 0x8b, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0xa5, 0xa9, 0x9f, 0x8c, 0x99, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x9d, 0x96, 0x00, 0x9a, 0x00, 0x00, 0xe1, /* 0xd8-0xdf */ 0x85, 0xa0, 0x83, 0x84, 0x00, 0x00, 0x00, 0x87, /* 0xe0-0xe7 */ 0x8a, 0x82, 0x88, 0x00, 0x8d, 0xa1, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0xa4, 0x95, 0xa2, 0x93, 0x94, 0x00, 0xf6, /* 0xf0-0xf7 */ 0x00, 0x97, 0xa3, 0x00, 0x81, 0x00, 0x00, 0x00, /* 0xf8-0xff */ }; static const unsigned char cp860_page03[56] = { 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0xe8, 0x00, /* 0xa0-0xa7 */ 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x00, 0xe0, 0x00, 0x00, 0xeb, 0xee, 0x00, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0xe3, 0x00, 0x00, 0xe5, 0xe7, 0x00, 0xed, 0x00, /* 0xc0-0xc7 */ }; static const unsigned char cp860_page22[80] = { 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0xec, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0xf0, 0x00, 0x00, 0xf3, 0xf2, 0x00, 0x00, /* 0x60-0x67 */ }; static const unsigned char cp860_page25[168] = { 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, /* 0x50-0x57 */ 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, /* 0x58-0x5f */ 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, /* 0x60-0x67 */ 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int cp860_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = cp860_page00[wc-0x00a0]; else if (wc >= 0x0390 && wc < 0x03c8) c = cp860_page03[wc-0x0390]; else if (wc == 0x207f) c = 0xfc; else if (wc == 0x20a7) c = 0x9e; else if (wc >= 0x2218 && wc < 0x2268) c = cp860_page22[wc-0x2218]; else if (wc >= 0x2320 && wc < 0x2322) c = wc-0x222c; else if (wc >= 0x2500 && wc < 0x25a8) c = cp860_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp861.h000066400000000000000000000152441252300335000237450ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP861 */ static const unsigned short cp861_2uni[128] = { /* 0x80 */ 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00d0, 0x00f0, 0x00de, 0x00c4, 0x00c5, /* 0x90 */ 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00fe, 0x00fb, 0x00dd, 0x00fd, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x20a7, 0x0192, /* 0xa0 */ 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00c1, 0x00cd, 0x00d3, 0x00da, 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, /* 0xb0 */ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, /* 0xc0 */ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, /* 0xd0 */ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, /* 0xe0 */ 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, /* 0xf0 */ 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0, }; static int cp861_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) cp861_2uni[c-0x80]; return 1; } static const unsigned char cp861_page00[96] = { 0xff, 0xad, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0xae, 0xaa, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0xf8, 0xf1, 0xfd, 0x00, 0x00, 0xe6, 0x00, 0xfa, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xaf, 0xac, 0xab, 0x00, 0xa8, /* 0xb8-0xbf */ 0x00, 0xa4, 0x00, 0x00, 0x8e, 0x8f, 0x92, 0x80, /* 0xc0-0xc7 */ 0x00, 0x90, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00, /* 0xc8-0xcf */ 0x8b, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x99, 0x00, /* 0xd0-0xd7 */ 0x9d, 0x00, 0xa7, 0x00, 0x9a, 0x97, 0x8d, 0xe1, /* 0xd8-0xdf */ 0x85, 0xa0, 0x83, 0x00, 0x84, 0x86, 0x91, 0x87, /* 0xe0-0xe7 */ 0x8a, 0x82, 0x88, 0x89, 0x00, 0xa1, 0x00, 0x00, /* 0xe8-0xef */ 0x8c, 0x00, 0x00, 0xa2, 0x93, 0x00, 0x94, 0xf6, /* 0xf0-0xf7 */ 0x9b, 0x00, 0xa3, 0x96, 0x81, 0x98, 0x95, 0x00, /* 0xf8-0xff */ }; static const unsigned char cp861_page03[56] = { 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0xe8, 0x00, /* 0xa0-0xa7 */ 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x00, 0xe0, 0x00, 0x00, 0xeb, 0xee, 0x00, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0xe3, 0x00, 0x00, 0xe5, 0xe7, 0x00, 0xed, 0x00, /* 0xc0-0xc7 */ }; static const unsigned char cp861_page22[80] = { 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0xec, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0xf0, 0x00, 0x00, 0xf3, 0xf2, 0x00, 0x00, /* 0x60-0x67 */ }; static const unsigned char cp861_page23[24] = { 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0xf4, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char cp861_page25[168] = { 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, /* 0x50-0x57 */ 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, /* 0x58-0x5f */ 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, /* 0x60-0x67 */ 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int cp861_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = cp861_page00[wc-0x00a0]; else if (wc == 0x0192) c = 0x9f; else if (wc >= 0x0390 && wc < 0x03c8) c = cp861_page03[wc-0x0390]; else if (wc == 0x207f) c = 0xfc; else if (wc == 0x20a7) c = 0x9e; else if (wc >= 0x2218 && wc < 0x2268) c = cp861_page22[wc-0x2218]; else if (wc >= 0x2310 && wc < 0x2328) c = cp861_page23[wc-0x2310]; else if (wc >= 0x2500 && wc < 0x25a8) c = cp861_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp862.h000066400000000000000000000147771252300335000237600ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP862 */ static const unsigned short cp862_2uni[128] = { /* 0x80 */ 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, /* 0x90 */ 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0x00a2, 0x00a3, 0x00a5, 0x20a7, 0x0192, /* 0xa0 */ 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, /* 0xb0 */ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, /* 0xc0 */ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, /* 0xd0 */ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, /* 0xe0 */ 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, /* 0xf0 */ 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0, }; static int cp862_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) cp862_2uni[c-0x80]; return 1; } static const unsigned char cp862_page00[96] = { 0xff, 0xad, 0x9b, 0x9c, 0x00, 0x9d, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0xa6, 0xae, 0xaa, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0xf8, 0xf1, 0xfd, 0x00, 0x00, 0xe6, 0x00, 0xfa, /* 0xb0-0xb7 */ 0x00, 0x00, 0xa7, 0xaf, 0xac, 0xab, 0x00, 0xa8, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, /* 0xd8-0xdf */ 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0xa4, 0x00, 0xa2, 0x00, 0x00, 0x00, 0xf6, /* 0xf0-0xf7 */ 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ }; static const unsigned char cp862_page03[56] = { 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0xe8, 0x00, /* 0xa0-0xa7 */ 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x00, 0xe0, 0x00, 0x00, 0xeb, 0xee, 0x00, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0xe3, 0x00, 0x00, 0xe5, 0xe7, 0x00, 0xed, 0x00, /* 0xc0-0xc7 */ }; static const unsigned char cp862_page22[80] = { 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0xec, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0xf0, 0x00, 0x00, 0xf3, 0xf2, 0x00, 0x00, /* 0x60-0x67 */ }; static const unsigned char cp862_page25[168] = { 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, /* 0x50-0x57 */ 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, /* 0x58-0x5f */ 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, /* 0x60-0x67 */ 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int cp862_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = cp862_page00[wc-0x00a0]; else if (wc == 0x0192) c = 0x9f; else if (wc >= 0x0390 && wc < 0x03c8) c = cp862_page03[wc-0x0390]; else if (wc >= 0x05d0 && wc < 0x05eb) c = wc-0x0550; else if (wc == 0x207f) c = 0xfc; else if (wc == 0x20a7) c = 0x9e; else if (wc >= 0x2218 && wc < 0x2268) c = cp862_page22[wc-0x2218]; else if (wc == 0x2310) c = 0xa9; else if (wc >= 0x2320 && wc < 0x2322) c = wc-0x222c; else if (wc >= 0x2500 && wc < 0x25a8) c = cp862_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp863.h000066400000000000000000000152441252300335000237470ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP863 */ static const unsigned short cp863_2uni[128] = { /* 0x80 */ 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00c2, 0x00e0, 0x00b6, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x2017, 0x00c0, 0x00a7, /* 0x90 */ 0x00c9, 0x00c8, 0x00ca, 0x00f4, 0x00cb, 0x00cf, 0x00fb, 0x00f9, 0x00a4, 0x00d4, 0x00dc, 0x00a2, 0x00a3, 0x00d9, 0x00db, 0x0192, /* 0xa0 */ 0x00a6, 0x00b4, 0x00f3, 0x00fa, 0x00a8, 0x00b8, 0x00b3, 0x00af, 0x00ce, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00be, 0x00ab, 0x00bb, /* 0xb0 */ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, /* 0xc0 */ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, /* 0xd0 */ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, /* 0xe0 */ 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, /* 0xf0 */ 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0, }; static int cp863_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) cp863_2uni[c-0x80]; return 1; } static const unsigned char cp863_page00[96] = { 0xff, 0x00, 0x9b, 0x9c, 0x98, 0x00, 0xa0, 0x8f, /* 0xa0-0xa7 */ 0xa4, 0x00, 0x00, 0xae, 0xaa, 0x00, 0x00, 0xa7, /* 0xa8-0xaf */ 0xf8, 0xf1, 0xfd, 0xa6, 0xa1, 0xe6, 0x86, 0xfa, /* 0xb0-0xb7 */ 0xa5, 0x00, 0x00, 0xaf, 0xac, 0xab, 0xad, 0x00, /* 0xb8-0xbf */ 0x8e, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x80, /* 0xc0-0xc7 */ 0x91, 0x90, 0x92, 0x94, 0x00, 0x00, 0xa8, 0x95, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x9d, 0x00, 0x9e, 0x9a, 0x00, 0x00, 0xe1, /* 0xd8-0xdf */ 0x85, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x87, /* 0xe0-0xe7 */ 0x8a, 0x82, 0x88, 0x89, 0x00, 0x00, 0x8c, 0x8b, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0xa2, 0x93, 0x00, 0x00, 0xf6, /* 0xf0-0xf7 */ 0x00, 0x97, 0xa3, 0x96, 0x81, 0x00, 0x00, 0x00, /* 0xf8-0xff */ }; static const unsigned char cp863_page03[56] = { 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0xe8, 0x00, /* 0xa0-0xa7 */ 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x00, 0xe0, 0x00, 0x00, 0xeb, 0xee, 0x00, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0xe3, 0x00, 0x00, 0xe5, 0xe7, 0x00, 0xed, 0x00, /* 0xc0-0xc7 */ }; static const unsigned char cp863_page22[80] = { 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0xec, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0xf0, 0x00, 0x00, 0xf3, 0xf2, 0x00, 0x00, /* 0x60-0x67 */ }; static const unsigned char cp863_page23[24] = { 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0xf4, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char cp863_page25[168] = { 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, /* 0x50-0x57 */ 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, /* 0x58-0x5f */ 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, /* 0x60-0x67 */ 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int cp863_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = cp863_page00[wc-0x00a0]; else if (wc == 0x0192) c = 0x9f; else if (wc >= 0x0390 && wc < 0x03c8) c = cp863_page03[wc-0x0390]; else if (wc == 0x2017) c = 0x8d; else if (wc == 0x207f) c = 0xfc; else if (wc >= 0x2218 && wc < 0x2268) c = cp863_page22[wc-0x2218]; else if (wc >= 0x2310 && wc < 0x2328) c = cp863_page23[wc-0x2310]; else if (wc >= 0x2500 && wc < 0x25a8) c = cp863_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp864.h000066400000000000000000000171211252300335000237440ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP864 */ static const unsigned short cp864_2uni_1[16] = { /* 0x20 */ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x066a, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, }; static const unsigned short cp864_2uni_2[128] = { /* 0x80 */ 0x00b0, 0x00b7, 0x2219, 0x221a, 0x2592, 0x2500, 0x2502, 0x253c, 0x2524, 0x252c, 0x251c, 0x2534, 0x2510, 0x250c, 0x2514, 0x2518, /* 0x90 */ 0x03b2, 0x221e, 0x03c6, 0x00b1, 0x00bd, 0x00bc, 0x2248, 0x00ab, 0x00bb, 0xfef7, 0xfef8, 0xfffd, 0xfffd, 0xfefb, 0xfefc, 0xfffd, /* 0xa0 */ 0x00a0, 0x00ad, 0xfe82, 0x00a3, 0x00a4, 0xfe84, 0xfffd, 0xfffd, 0xfe8e, 0xfe8f, 0xfe95, 0xfe99, 0x060c, 0xfe9d, 0xfea1, 0xfea5, /* 0xb0 */ 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, 0x0668, 0x0669, 0xfed1, 0x061b, 0xfeb1, 0xfeb5, 0xfeb9, 0x061f, /* 0xc0 */ 0x00a2, 0xfe80, 0xfe81, 0xfe83, 0xfe85, 0xfeca, 0xfe8b, 0xfe8d, 0xfe91, 0xfe93, 0xfe97, 0xfe9b, 0xfe9f, 0xfea3, 0xfea7, 0xfea9, /* 0xd0 */ 0xfeab, 0xfead, 0xfeaf, 0xfeb3, 0xfeb7, 0xfebb, 0xfebf, 0xfec1, 0xfec5, 0xfecb, 0xfecf, 0x00a6, 0x00ac, 0x00f7, 0x00d7, 0xfec9, /* 0xe0 */ 0x0640, 0xfed3, 0xfed7, 0xfedb, 0xfedf, 0xfee3, 0xfee7, 0xfeeb, 0xfeed, 0xfeef, 0xfef3, 0xfebd, 0xfecc, 0xfece, 0xfecd, 0xfee1, /* 0xf0 */ 0xfe7d, 0x0651, 0xfee5, 0xfee9, 0xfeec, 0xfef0, 0xfef2, 0xfed0, 0xfed5, 0xfef5, 0xfef6, 0xfedd, 0xfed9, 0xfef1, 0x25a0, 0xfffd, }; static int cp864_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x20) { *pwc = (ucs4_t) c; return 1; } else if (c < 0x30) { *pwc = (ucs4_t) cp864_2uni_1[c-0x20]; return 1; } else if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp864_2uni_2[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp864_page00[8] = { 0x20, 0x21, 0x22, 0x23, 0x24, 0x00, 0x26, 0x27, /* 0x20-0x27 */ }; static const unsigned char cp864_page00_1[88] = { 0xa0, 0x00, 0xc0, 0xa3, 0xa4, 0x00, 0xdb, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x97, 0xdc, 0xa1, 0x00, 0x00, /* 0xa8-0xaf */ 0x80, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x98, 0x95, 0x94, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, /* 0xf0-0xf7 */ }; static const unsigned char cp864_page06[104] = { 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xbf, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x60-0x67 */ 0xb8, 0xb9, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ }; static const unsigned char cp864_page22[56] = { 0x00, 0x82, 0x83, 0x00, 0x00, 0x00, 0x91, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ }; static const unsigned char cp864_page25[64] = { 0x85, 0x00, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x8c, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x8f, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static const unsigned char cp864_pagefe[136] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, /* 0x78-0x7f */ 0xc1, 0xc2, 0xa2, 0xc3, 0xa5, 0xc4, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0xc6, 0x00, 0xc7, 0xa8, 0xa9, /* 0x88-0x8f */ 0x00, 0xc8, 0x00, 0xc9, 0x00, 0xaa, 0x00, 0xca, /* 0x90-0x97 */ 0x00, 0xab, 0x00, 0xcb, 0x00, 0xad, 0x00, 0xcc, /* 0x98-0x9f */ 0x00, 0xae, 0x00, 0xcd, 0x00, 0xaf, 0x00, 0xce, /* 0xa0-0xa7 */ 0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xd2, /* 0xa8-0xaf */ 0x00, 0xbc, 0x00, 0xd3, 0x00, 0xbd, 0x00, 0xd4, /* 0xb0-0xb7 */ 0x00, 0xbe, 0x00, 0xd5, 0x00, 0xeb, 0x00, 0xd6, /* 0xb8-0xbf */ 0x00, 0xd7, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0xdf, 0xc5, 0xd9, 0xec, 0xee, 0xed, 0xda, /* 0xc8-0xcf */ 0xf7, 0xba, 0x00, 0xe1, 0x00, 0xf8, 0x00, 0xe2, /* 0xd0-0xd7 */ 0x00, 0xfc, 0x00, 0xe3, 0x00, 0xfb, 0x00, 0xe4, /* 0xd8-0xdf */ 0x00, 0xef, 0x00, 0xe5, 0x00, 0xf2, 0x00, 0xe6, /* 0xe0-0xe7 */ 0x00, 0xf3, 0x00, 0xe7, 0xf4, 0xe8, 0x00, 0xe9, /* 0xe8-0xef */ 0xf5, 0xfd, 0xf6, 0xea, 0x00, 0xf9, 0xfa, 0x99, /* 0xf0-0xf7 */ 0x9a, 0x00, 0x00, 0x9d, 0x9e, 0x00, 0x00, 0x00, /* 0xf8-0xff */ }; static int cp864_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0020) { *r = wc; return 1; } else if (wc >= 0x0020 && wc < 0x0028) c = cp864_page00[wc-0x0020]; else if (wc >= 0x0028 && wc < 0x0080) c = wc; else if (wc >= 0x00a0 && wc < 0x00f8) c = cp864_page00_1[wc-0x00a0]; else if (wc == 0x03b2) c = 0x90; else if (wc == 0x03c6) c = 0x92; else if (wc >= 0x0608 && wc < 0x0670) c = cp864_page06[wc-0x0608]; else if (wc >= 0x2218 && wc < 0x2250) c = cp864_page22[wc-0x2218]; else if (wc >= 0x2500 && wc < 0x2540) c = cp864_page25[wc-0x2500]; else if (wc == 0x2592) c = 0x84; else if (wc == 0x25a0) c = 0xfe; else if (wc >= 0xfe78 && wc < 0xff00) c = cp864_pagefe[wc-0xfe78]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp865.h000066400000000000000000000152441252300335000237510ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP865 */ static const unsigned short cp865_2uni[128] = { /* 0x80 */ 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5, /* 0x90 */ 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, 0x00ff, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x20a7, 0x0192, /* 0xa0 */ 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00a4, /* 0xb0 */ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, /* 0xc0 */ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, /* 0xd0 */ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, /* 0xe0 */ 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, /* 0xf0 */ 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0, }; static int cp865_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) cp865_2uni[c-0x80]; return 1; } static const unsigned char cp865_page00[96] = { 0xff, 0xad, 0x00, 0x9c, 0xaf, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0xa6, 0xae, 0xaa, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0xf8, 0xf1, 0xfd, 0x00, 0x00, 0xe6, 0x00, 0xfa, /* 0xb0-0xb7 */ 0x00, 0x00, 0xa7, 0x00, 0xac, 0xab, 0x00, 0xa8, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x8e, 0x8f, 0x92, 0x80, /* 0xc0-0xc7 */ 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x99, 0x00, /* 0xd0-0xd7 */ 0x9d, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0xe1, /* 0xd8-0xdf */ 0x85, 0xa0, 0x83, 0x00, 0x84, 0x86, 0x91, 0x87, /* 0xe0-0xe7 */ 0x8a, 0x82, 0x88, 0x89, 0x8d, 0xa1, 0x8c, 0x8b, /* 0xe8-0xef */ 0x00, 0xa4, 0x95, 0xa2, 0x93, 0x00, 0x94, 0xf6, /* 0xf0-0xf7 */ 0x9b, 0x97, 0xa3, 0x96, 0x81, 0x00, 0x00, 0x98, /* 0xf8-0xff */ }; static const unsigned char cp865_page03[56] = { 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0xe8, 0x00, /* 0xa0-0xa7 */ 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x00, 0xe0, 0x00, 0x00, 0xeb, 0xee, 0x00, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0xe3, 0x00, 0x00, 0xe5, 0xe7, 0x00, 0xed, 0x00, /* 0xc0-0xc7 */ }; static const unsigned char cp865_page22[80] = { 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0xec, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0xf0, 0x00, 0x00, 0xf3, 0xf2, 0x00, 0x00, /* 0x60-0x67 */ }; static const unsigned char cp865_page23[24] = { 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0xf4, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char cp865_page25[168] = { 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, /* 0x50-0x57 */ 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, /* 0x58-0x5f */ 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, /* 0x60-0x67 */ 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int cp865_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = cp865_page00[wc-0x00a0]; else if (wc == 0x0192) c = 0x9f; else if (wc >= 0x0390 && wc < 0x03c8) c = cp865_page03[wc-0x0390]; else if (wc == 0x207f) c = 0xfc; else if (wc == 0x20a7) c = 0x9e; else if (wc >= 0x2218 && wc < 0x2268) c = cp865_page22[wc-0x2218]; else if (wc >= 0x2310 && wc < 0x2328) c = cp865_page23[wc-0x2310]; else if (wc >= 0x2500 && wc < 0x25a8) c = cp865_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp866.h000066400000000000000000000120721252300335000237460ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP866 */ static const unsigned short cp866_2uni[80] = { /* 0xb0 */ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, /* 0xc0 */ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, /* 0xd0 */ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, /* 0xe0 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, /* 0xf0 */ 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040e, 0x045e, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x2116, 0x00a4, 0x25a0, 0x00a0, }; static int cp866_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else if (c < 0xb0) *pwc = (ucs4_t) c + 0x0390; else *pwc = (ucs4_t) cp866_2uni[c-0xb0]; return 1; } static const unsigned char cp866_page00[24] = { 0xff, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, /* 0xb0-0xb7 */ }; static const unsigned char cp866_page04[96] = { 0x00, 0xf0, 0x00, 0x00, 0xf2, 0x00, 0x00, 0xf4, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0x00, /* 0x08-0x0f */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x10-0x17 */ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0x18-0x1f */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x20-0x27 */ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, /* 0x28-0x2f */ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x30-0x37 */ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0x38-0x3f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ 0x00, 0xf1, 0x00, 0x00, 0xf3, 0x00, 0x00, 0xf5, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0x00, /* 0x58-0x5f */ }; static const unsigned char cp866_page22[8] = { 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ }; static const unsigned char cp866_page25[168] = { 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, /* 0x50-0x57 */ 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, /* 0x58-0x5f */ 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, /* 0x60-0x67 */ 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int cp866_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00b8) c = cp866_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0460) c = cp866_page04[wc-0x0400]; else if (wc == 0x2116) c = 0xfc; else if (wc >= 0x2218 && wc < 0x2220) c = cp866_page22[wc-0x2218]; else if (wc >= 0x2500 && wc < 0x25a8) c = cp866_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp869.h000066400000000000000000000130011252300335000237420ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP869 */ static const unsigned short cp869_2uni[128] = { /* 0x80 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x0386, 0xfffd, 0x00b7, 0x00ac, 0x00a6, 0x2018, 0x2019, 0x0388, 0x2015, 0x0389, /* 0x90 */ 0x038a, 0x03aa, 0x038c, 0xfffd, 0xfffd, 0x038e, 0x03ab, 0x00a9, 0x038f, 0x00b2, 0x00b3, 0x03ac, 0x00a3, 0x03ad, 0x03ae, 0x03af, /* 0xa0 */ 0x03ca, 0x0390, 0x03cc, 0x03cd, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x00bd, 0x0398, 0x0399, 0x00ab, 0x00bb, /* 0xb0 */ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x039a, 0x039b, 0x039c, 0x039d, 0x2563, 0x2551, 0x2557, 0x255d, 0x039e, 0x039f, 0x2510, /* 0xc0 */ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x03a0, 0x03a1, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x03a3, /* 0xd0 */ 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03b1, 0x03b2, 0x03b3, 0x2518, 0x250c, 0x2588, 0x2584, 0x03b4, 0x03b5, 0x2580, /* 0xe0 */ 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c2, 0x03c4, 0x0384, /* 0xf0 */ 0x00ad, 0x00b1, 0x03c5, 0x03c6, 0x03c7, 0x00a7, 0x03c8, 0x0385, 0x00b0, 0x00a8, 0x03c9, 0x03cb, 0x03b0, 0x03ce, 0x25a0, 0x00a0, }; static int cp869_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp869_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp869_page00[32] = { 0xff, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x8a, 0xf5, /* 0xa0-0xa7 */ 0xf9, 0x97, 0x00, 0xae, 0x89, 0xf0, 0x00, 0x00, /* 0xa8-0xaf */ 0xf8, 0xf1, 0x99, 0x9a, 0x00, 0x00, 0x00, 0x88, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xaf, 0x00, 0xab, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char cp869_page03[80] = { 0x00, 0x00, 0x00, 0x00, 0xef, 0xf7, 0x86, 0x00, /* 0x80-0x87 */ 0x8d, 0x8f, 0x90, 0x00, 0x92, 0x00, 0x95, 0x98, /* 0x88-0x8f */ 0xa1, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, /* 0x90-0x97 */ 0xac, 0xad, 0xb5, 0xb6, 0xb7, 0xb8, 0xbd, 0xbe, /* 0x98-0x9f */ 0xc6, 0xc7, 0x00, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, /* 0xa0-0xa7 */ 0xd4, 0xd5, 0x91, 0x96, 0x9b, 0x9d, 0x9e, 0x9f, /* 0xa8-0xaf */ 0xfc, 0xd6, 0xd7, 0xd8, 0xdd, 0xde, 0xe0, 0xe1, /* 0xb0-0xb7 */ 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, /* 0xb8-0xbf */ 0xea, 0xeb, 0xed, 0xec, 0xee, 0xf2, 0xf3, 0xf4, /* 0xc0-0xc7 */ 0xf6, 0xfa, 0xa0, 0xfb, 0xa2, 0xa3, 0xfd, 0x00, /* 0xc8-0xcf */ }; static const unsigned char cp869_page20[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, /* 0x10-0x17 */ 0x8b, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ }; static const unsigned char cp869_page25[168] = { 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xcd, 0xba, 0x00, 0x00, 0xc9, 0x00, 0x00, 0xbb, /* 0x50-0x57 */ 0x00, 0x00, 0xc8, 0x00, 0x00, 0xbc, 0x00, 0x00, /* 0x58-0x5f */ 0xcc, 0x00, 0x00, 0xb9, 0x00, 0x00, 0xcb, 0x00, /* 0x60-0x67 */ 0x00, 0xca, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int cp869_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = cp869_page00[wc-0x00a0]; else if (wc >= 0x0380 && wc < 0x03d0) c = cp869_page03[wc-0x0380]; else if (wc >= 0x2010 && wc < 0x2020) c = cp869_page20[wc-0x2010]; else if (wc >= 0x2500 && wc < 0x25a8) c = cp869_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp874.h000066400000000000000000000076521252300335000237550ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP874 */ static const unsigned short cp874_2uni[128] = { /* 0x80 */ 0x20ac, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2026, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xa0 */ 0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, /* 0xb0 */ 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, /* 0xc0 */ 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, /* 0xd0 */ 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37, 0x0e38, 0x0e39, 0x0e3a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x0e3f, /* 0xe0 */ 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f, /* 0xf0 */ 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, 0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0xfffd, 0xfffd, 0xfffd, 0xfffd, }; static int cp874_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp874_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp874_page0e[96] = { 0x00, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x00-0x07 */ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0x08-0x0f */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x10-0x17 */ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0x18-0x1f */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */ 0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0xdf, /* 0x38-0x3f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x50-0x57 */ 0xf8, 0xf9, 0xfa, 0xfb, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ }; static const unsigned char cp874_page20[24] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x00, 0x00, 0x93, 0x94, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ }; static int cp874_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc == 0x00a0) c = 0xa0; else if (wc >= 0x0e00 && wc < 0x0e60) c = cp874_page0e[wc-0x0e00]; else if (wc >= 0x2010 && wc < 0x2028) c = cp874_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x80; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp922.h000066400000000000000000000066011252300335000237400ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP922 */ static const unsigned short cp922_2uni_1[16] = { /* 0xa0 */ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x203e, }; static const unsigned short cp922_2uni_2[16] = { /* 0xd0 */ 0x0160, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x017d, 0x00df, }; static const unsigned short cp922_2uni_3[16] = { /* 0xf0 */ 0x0161, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x017e, 0x00ff, }; static int cp922_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else if (c < 0xb0) *pwc = (ucs4_t) cp922_2uni_1[c-0xa0]; else if (c < 0xd0) *pwc = (ucs4_t) c; else if (c < 0xe0) *pwc = (ucs4_t) cp922_2uni_2[c-0xd0]; else if (c < 0xf0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) cp922_2uni_3[c-0xf0]; return 1; } static const unsigned char cp922_page00[88] = { 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0xb8-0xbf */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xc0-0xc7 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0x00, 0xff, /* 0xf8-0xff */ }; static const unsigned char cp922_page01[32] = { 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xfe, 0x00, /* 0x78-0x7f */ }; static int cp922_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a8) { *r = wc; return 1; } else if (wc >= 0x00a8 && wc < 0x0100) c = cp922_page00[wc-0x00a8]; else if (wc >= 0x0160 && wc < 0x0180) c = cp922_page01[wc-0x0160]; else if (wc == 0x203e) c = 0xaf; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp932.h000066400000000000000000000160711252300335000237430ustar00rootroot00000000000000/* * Copyright (C) 1999-2002, 2005 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP932 */ /* * Microsoft CP932 is a slightly extended version of SHIFT_JIS. * The differences between the EASTASIA/JIS/SHIFTJIS.TXT and the * VENDORS/MICSFT/WINDOWS/CP932.TXT tables found on ftp.unicode.org are * as follows: * * 1. CP932 uses ASCII, not JISX0201 Roman. * * 2. Some characters in the JISX0208 range are defined differently: * * code SHIFTJIS.TXT CP932.TXT * 0x815F 0x005C # REVERSE SOLIDUS 0xFF3C # FULLWIDTH REVERSE SOLIDUS * 0x8160 0x301C # WAVE DASH 0xFF5E # FULLWIDTH TILDE * 0x8161 0x2016 # DOUBLE VERTICAL LINE 0x2225 # PARALLEL TO * 0x817C 0x2212 # MINUS SIGN 0xFF0D # FULLWIDTH HYPHEN-MINUS * 0x8191 0x00A2 # CENT SIGN 0xFFE0 # FULLWIDTH CENT SIGN * 0x8192 0x00A3 # POUND SIGN 0xFFE1 # FULLWIDTH POUND SIGN * 0x81CA 0x00AC # NOT SIGN 0xFFE2 # FULLWIDTH NOT SIGN * * We don't implement the latter 6 of these changes, only the first one. * SHIFTJIS.TXT makes more sense. However, as a compromise with user * expectation, we implement the middle 5 of these changes in the * Unicode to CP932 direction. We don't implement the last one at all, * because it would collide with the mapping of 0xFA54. * * 3. A few new rows. See cp932ext.h. * * Many variants of CP932 (in GNU libc, JDK, OSF/1, Windows-2000, ICU) also * add: * * 4. Private area mappings: * * code Unicode * 0x{F0..F9}{40..7E,80..FC} U+E000..U+E757 * * We add them too because, although there are backward compatibility problems * when a character from a private area is moved to an official Unicode code * point, they are useful for some people in practice. */ #include "cp932ext.h" /* Conversion between SJIS codes (s1,s2) and JISX0208 codes (c1,c2): Example. (s1,s2) = 0x8140, (c1,c2) = 0x2121. 0x81 <= s1 <= 0x9F || 0xE0 <= s1 <= 0xEA, 0x40 <= s2 <= 0x7E || 0x80 <= s2 <= 0xFC, 0x21 <= c1 <= 0x74, 0x21 <= c2 <= 0x7E. Invariant: 94*2*(s1 < 0xE0 ? s1-0x81 : s1-0xC1) + (s2 < 0x80 ? s2-0x40 : s2-0x41) = 94*(c1-0x21)+(c2-0x21) Conversion (s1,s2) -> (c1,c2): t1 := (s1 < 0xE0 ? s1-0x81 : s1-0xC1) t2 := (s2 < 0x80 ? s2-0x40 : s2-0x41) c1 := 2*t1 + (t2 < 0x5E ? 0 : 1) + 0x21 c2 := (t2 < 0x5E ? t2 : t2-0x5E) + 0x21 Conversion (c1,c2) -> (s1,s2): t1 := (c1 - 0x21) >> 1 t2 := ((c1 - 0x21) & 1) * 0x5E + (c2 - 0x21) s1 := (t1 < 0x1F ? t1+0x81 : t1+0xC1) s2 := (t2 < 0x3F ? t2+0x40 : t2+0x41) */ static int cp932_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); else if (c >= 0xa1 && c <= 0xdf) return jisx0201_mbtowc(conv,pwc,s,n); else { unsigned char s1, s2; s1 = c; if ((s1 >= 0x81 && s1 <= 0x9f && s1 != 0x87) || (s1 >= 0xe0 && s1 <= 0xea)) { if (n < 2) return RET_TOOFEW(0); s2 = s[1]; if ((s2 >= 0x40 && s2 <= 0x7e) || (s2 >= 0x80 && s2 <= 0xfc)) { unsigned char t1 = (s1 < 0xe0 ? s1-0x81 : s1-0xc1); unsigned char t2 = (s2 < 0x80 ? s2-0x40 : s2-0x41); unsigned char buf[2]; buf[0] = 2*t1 + (t2 < 0x5e ? 0 : 1) + 0x21; buf[1] = (t2 < 0x5e ? t2 : t2-0x5e) + 0x21; return jisx0208_mbtowc(conv,pwc,buf,2); } } else if ((s1 == 0x87) || (s1 >= 0xed && s1 <= 0xee) || (s1 >= 0xfa)) { if (n < 2) return RET_TOOFEW(0); return cp932ext_mbtowc(conv,pwc,s,2); } else if (s1 >= 0xf0 && s1 <= 0xf9) { /* User-defined range. See * Ken Lunde's "CJKV Information Processing", table 4-66, p. 206. */ if (n < 2) return RET_TOOFEW(0); s2 = s[1]; if ((s2 >= 0x40 && s2 <= 0x7e) || (s2 >= 0x80 && s2 <= 0xfc)) { *pwc = 0xe000 + 188*(s1 - 0xf0) + (s2 < 0x80 ? s2-0x40 : s2-0x41); return 2; } } return RET_ILSEQ; } } static int cp932_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; /* Try ASCII. */ ret = ascii_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { unsigned char c; if (ret != 1) abort(); c = buf[0]; if (c < 0x80) { r[0] = c; return 1; } } /* Try JIS X 0201-1976 Katakana. */ ret = jisx0201_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { unsigned char c; if (ret != 1) abort(); c = buf[0]; if (c >= 0xa1 && c <= 0xdf) { r[0] = c; return 1; } } /* Try JIS X 0208-1990. */ ret = jisx0208_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { unsigned char c1, c2; if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; c1 = buf[0]; c2 = buf[1]; if ((c1 >= 0x21 && c1 <= 0x74) && (c2 >= 0x21 && c2 <= 0x7e)) { unsigned char t1 = (c1 - 0x21) >> 1; unsigned char t2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21); r[0] = (t1 < 0x1f ? t1+0x81 : t1+0xc1); r[1] = (t2 < 0x3f ? t2+0x40 : t2+0x41); return 2; } } /* Try CP932 extensions. */ ret = cp932ext_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]; r[1] = buf[1]; return 2; } /* User-defined range. See * Ken Lunde's "CJKV Information Processing", table 4-66, p. 206. */ if (wc >= 0xe000 && wc < 0xe758) { unsigned char c1, c2; if (n < 2) return RET_TOOSMALL; c1 = (unsigned int) (wc - 0xe000) / 188; c2 = (unsigned int) (wc - 0xe000) % 188; r[0] = c1+0xf0; r[1] = (c2 < 0x3f ? c2+0x40 : c2+0x41); return 2; } /* Irreversible mappings. */ if (wc == 0xff5e) { if (n < 2) return RET_TOOSMALL; r[0] = 0x81; r[1] = 0x60; return 2; } if (wc == 0x2225) { if (n < 2) return RET_TOOSMALL; r[0] = 0x81; r[1] = 0x61; return 2; } if (wc == 0xff0d) { if (n < 2) return RET_TOOSMALL; r[0] = 0x81; r[1] = 0x7c; return 2; } if (wc == 0xffe0) { if (n < 2) return RET_TOOSMALL; r[0] = 0x81; r[1] = 0x91; return 2; } if (wc == 0xffe1) { if (n < 2) return RET_TOOSMALL; r[0] = 0x81; r[1] = 0x92; return 2; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp932ext.h000066400000000000000000001153011252300335000244600ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP932 extensions */ static const unsigned short cp932ext_2uni_page87[92] = { /* 0x87 */ 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, 0xfffd, 0x3349, 0x3314, 0x3322, 0x334d, 0x3318, 0x3327, 0x3303, 0x3336, 0x3351, 0x3357, 0x330d, 0x3326, 0x3323, 0x332b, 0x334a, 0x333b, 0x339c, 0x339d, 0x339e, 0x338e, 0x338f, 0x33c4, 0x33a1, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 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, }; static const unsigned short cp932ext_2uni_pageed[376] = { /* 0xed */ 0x7e8a, 0x891c, 0x9348, 0x9288, 0x84dc, 0x4fc9, 0x70bb, 0x6631, 0x68c8, 0x92f9, 0x66fb, 0x5f45, 0x4e28, 0x4ee1, 0x4efc, 0x4f00, 0x4f03, 0x4f39, 0x4f56, 0x4f92, 0x4f8a, 0x4f9a, 0x4f94, 0x4fcd, 0x5040, 0x5022, 0x4fff, 0x501e, 0x5046, 0x5070, 0x5042, 0x5094, 0x50f4, 0x50d8, 0x514a, 0x5164, 0x519d, 0x51be, 0x51ec, 0x5215, 0x529c, 0x52a6, 0x52c0, 0x52db, 0x5300, 0x5307, 0x5324, 0x5372, 0x5393, 0x53b2, 0x53dd, 0xfa0e, 0x549c, 0x548a, 0x54a9, 0x54ff, 0x5586, 0x5759, 0x5765, 0x57ac, 0x57c8, 0x57c7, 0xfa0f, 0xfa10, 0x589e, 0x58b2, 0x590b, 0x5953, 0x595b, 0x595d, 0x5963, 0x59a4, 0x59ba, 0x5b56, 0x5bc0, 0x752f, 0x5bd8, 0x5bec, 0x5c1e, 0x5ca6, 0x5cba, 0x5cf5, 0x5d27, 0x5d53, 0xfa11, 0x5d42, 0x5d6d, 0x5db8, 0x5db9, 0x5dd0, 0x5f21, 0x5f34, 0x5f67, 0x5fb7, 0x5fde, 0x605d, 0x6085, 0x608a, 0x60de, 0x60d5, 0x6120, 0x60f2, 0x6111, 0x6137, 0x6130, 0x6198, 0x6213, 0x62a6, 0x63f5, 0x6460, 0x649d, 0x64ce, 0x654e, 0x6600, 0x6615, 0x663b, 0x6609, 0x662e, 0x661e, 0x6624, 0x6665, 0x6657, 0x6659, 0xfa12, 0x6673, 0x6699, 0x66a0, 0x66b2, 0x66bf, 0x66fa, 0x670e, 0xf929, 0x6766, 0x67bb, 0x6852, 0x67c0, 0x6801, 0x6844, 0x68cf, 0xfa13, 0x6968, 0xfa14, 0x6998, 0x69e2, 0x6a30, 0x6a6b, 0x6a46, 0x6a73, 0x6a7e, 0x6ae2, 0x6ae4, 0x6bd6, 0x6c3f, 0x6c5c, 0x6c86, 0x6c6f, 0x6cda, 0x6d04, 0x6d87, 0x6d6f, 0x6d96, 0x6dac, 0x6dcf, 0x6df8, 0x6df2, 0x6dfc, 0x6e39, 0x6e5c, 0x6e27, 0x6e3c, 0x6ebf, 0x6f88, 0x6fb5, 0x6ff5, 0x7005, 0x7007, 0x7028, 0x7085, 0x70ab, 0x710f, 0x7104, 0x715c, 0x7146, 0x7147, 0xfa15, 0x71c1, 0x71fe, 0x72b1, /* 0xee */ 0x72be, 0x7324, 0xfa16, 0x7377, 0x73bd, 0x73c9, 0x73d6, 0x73e3, 0x73d2, 0x7407, 0x73f5, 0x7426, 0x742a, 0x7429, 0x742e, 0x7462, 0x7489, 0x749f, 0x7501, 0x756f, 0x7682, 0x769c, 0x769e, 0x769b, 0x76a6, 0xfa17, 0x7746, 0x52af, 0x7821, 0x784e, 0x7864, 0x787a, 0x7930, 0xfa18, 0xfa19, 0xfa1a, 0x7994, 0xfa1b, 0x799b, 0x7ad1, 0x7ae7, 0xfa1c, 0x7aeb, 0x7b9e, 0xfa1d, 0x7d48, 0x7d5c, 0x7db7, 0x7da0, 0x7dd6, 0x7e52, 0x7f47, 0x7fa1, 0xfa1e, 0x8301, 0x8362, 0x837f, 0x83c7, 0x83f6, 0x8448, 0x84b4, 0x8553, 0x8559, 0x856b, 0xfa1f, 0x85b0, 0xfa20, 0xfa21, 0x8807, 0x88f5, 0x8a12, 0x8a37, 0x8a79, 0x8aa7, 0x8abe, 0x8adf, 0xfa22, 0x8af6, 0x8b53, 0x8b7f, 0x8cf0, 0x8cf4, 0x8d12, 0x8d76, 0xfa23, 0x8ecf, 0xfa24, 0xfa25, 0x9067, 0x90de, 0xfa26, 0x9115, 0x9127, 0x91da, 0x91d7, 0x91de, 0x91ed, 0x91ee, 0x91e4, 0x91e5, 0x9206, 0x9210, 0x920a, 0x923a, 0x9240, 0x923c, 0x924e, 0x9259, 0x9251, 0x9239, 0x9267, 0x92a7, 0x9277, 0x9278, 0x92e7, 0x92d7, 0x92d9, 0x92d0, 0xfa27, 0x92d5, 0x92e0, 0x92d3, 0x9325, 0x9321, 0x92fb, 0xfa28, 0x931e, 0x92ff, 0x931d, 0x9302, 0x9370, 0x9357, 0x93a4, 0x93c6, 0x93de, 0x93f8, 0x9431, 0x9445, 0x9448, 0x9592, 0xf9dc, 0xfa29, 0x969d, 0x96af, 0x9733, 0x973b, 0x9743, 0x974d, 0x974f, 0x9751, 0x9755, 0x9857, 0x9865, 0xfa2a, 0xfa2b, 0x9927, 0xfa2c, 0x999e, 0x9a4e, 0x9ad9, 0x9adc, 0x9b75, 0x9b72, 0x9b8f, 0x9bb1, 0x9bbb, 0x9c00, 0x9d70, 0x9d6b, 0xfa2d, 0x9e19, 0x9ed1, 0xfffd, 0xfffd, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0xffe2, 0xffe4, 0xff07, 0xff02, }; static const unsigned short cp932ext_2uni_pagefa[388] = { /* 0xfa */ 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0xffe2, 0xffe4, 0xff07, 0xff02, 0x3231, 0x2116, 0x2121, 0x2235, 0x7e8a, 0x891c, 0x9348, 0x9288, 0x84dc, 0x4fc9, 0x70bb, 0x6631, 0x68c8, 0x92f9, 0x66fb, 0x5f45, 0x4e28, 0x4ee1, 0x4efc, 0x4f00, 0x4f03, 0x4f39, 0x4f56, 0x4f92, 0x4f8a, 0x4f9a, 0x4f94, 0x4fcd, 0x5040, 0x5022, 0x4fff, 0x501e, 0x5046, 0x5070, 0x5042, 0x5094, 0x50f4, 0x50d8, 0x514a, 0x5164, 0x519d, 0x51be, 0x51ec, 0x5215, 0x529c, 0x52a6, 0x52c0, 0x52db, 0x5300, 0x5307, 0x5324, 0x5372, 0x5393, 0x53b2, 0x53dd, 0xfa0e, 0x549c, 0x548a, 0x54a9, 0x54ff, 0x5586, 0x5759, 0x5765, 0x57ac, 0x57c8, 0x57c7, 0xfa0f, 0xfa10, 0x589e, 0x58b2, 0x590b, 0x5953, 0x595b, 0x595d, 0x5963, 0x59a4, 0x59ba, 0x5b56, 0x5bc0, 0x752f, 0x5bd8, 0x5bec, 0x5c1e, 0x5ca6, 0x5cba, 0x5cf5, 0x5d27, 0x5d53, 0xfa11, 0x5d42, 0x5d6d, 0x5db8, 0x5db9, 0x5dd0, 0x5f21, 0x5f34, 0x5f67, 0x5fb7, 0x5fde, 0x605d, 0x6085, 0x608a, 0x60de, 0x60d5, 0x6120, 0x60f2, 0x6111, 0x6137, 0x6130, 0x6198, 0x6213, 0x62a6, 0x63f5, 0x6460, 0x649d, 0x64ce, 0x654e, 0x6600, 0x6615, 0x663b, 0x6609, 0x662e, 0x661e, 0x6624, 0x6665, 0x6657, 0x6659, 0xfa12, 0x6673, 0x6699, 0x66a0, 0x66b2, 0x66bf, 0x66fa, 0x670e, 0xf929, 0x6766, 0x67bb, 0x6852, 0x67c0, 0x6801, 0x6844, 0x68cf, 0xfa13, 0x6968, 0xfa14, 0x6998, 0x69e2, 0x6a30, 0x6a6b, 0x6a46, 0x6a73, 0x6a7e, 0x6ae2, 0x6ae4, 0x6bd6, 0x6c3f, 0x6c5c, 0x6c86, 0x6c6f, 0x6cda, 0x6d04, 0x6d87, 0x6d6f, /* 0xfb */ 0x6d96, 0x6dac, 0x6dcf, 0x6df8, 0x6df2, 0x6dfc, 0x6e39, 0x6e5c, 0x6e27, 0x6e3c, 0x6ebf, 0x6f88, 0x6fb5, 0x6ff5, 0x7005, 0x7007, 0x7028, 0x7085, 0x70ab, 0x710f, 0x7104, 0x715c, 0x7146, 0x7147, 0xfa15, 0x71c1, 0x71fe, 0x72b1, 0x72be, 0x7324, 0xfa16, 0x7377, 0x73bd, 0x73c9, 0x73d6, 0x73e3, 0x73d2, 0x7407, 0x73f5, 0x7426, 0x742a, 0x7429, 0x742e, 0x7462, 0x7489, 0x749f, 0x7501, 0x756f, 0x7682, 0x769c, 0x769e, 0x769b, 0x76a6, 0xfa17, 0x7746, 0x52af, 0x7821, 0x784e, 0x7864, 0x787a, 0x7930, 0xfa18, 0xfa19, 0xfa1a, 0x7994, 0xfa1b, 0x799b, 0x7ad1, 0x7ae7, 0xfa1c, 0x7aeb, 0x7b9e, 0xfa1d, 0x7d48, 0x7d5c, 0x7db7, 0x7da0, 0x7dd6, 0x7e52, 0x7f47, 0x7fa1, 0xfa1e, 0x8301, 0x8362, 0x837f, 0x83c7, 0x83f6, 0x8448, 0x84b4, 0x8553, 0x8559, 0x856b, 0xfa1f, 0x85b0, 0xfa20, 0xfa21, 0x8807, 0x88f5, 0x8a12, 0x8a37, 0x8a79, 0x8aa7, 0x8abe, 0x8adf, 0xfa22, 0x8af6, 0x8b53, 0x8b7f, 0x8cf0, 0x8cf4, 0x8d12, 0x8d76, 0xfa23, 0x8ecf, 0xfa24, 0xfa25, 0x9067, 0x90de, 0xfa26, 0x9115, 0x9127, 0x91da, 0x91d7, 0x91de, 0x91ed, 0x91ee, 0x91e4, 0x91e5, 0x9206, 0x9210, 0x920a, 0x923a, 0x9240, 0x923c, 0x924e, 0x9259, 0x9251, 0x9239, 0x9267, 0x92a7, 0x9277, 0x9278, 0x92e7, 0x92d7, 0x92d9, 0x92d0, 0xfa27, 0x92d5, 0x92e0, 0x92d3, 0x9325, 0x9321, 0x92fb, 0xfa28, 0x931e, 0x92ff, 0x931d, 0x9302, 0x9370, 0x9357, 0x93a4, 0x93c6, 0x93de, 0x93f8, 0x9431, 0x9445, 0x9448, 0x9592, 0xf9dc, 0xfa29, 0x969d, 0x96af, 0x9733, 0x973b, 0x9743, 0x974d, 0x974f, 0x9751, 0x9755, 0x9857, 0x9865, 0xfa2a, 0xfa2b, 0x9927, 0xfa2c, 0x999e, 0x9a4e, 0x9ad9, /* 0xfc */ 0x9adc, 0x9b75, 0x9b72, 0x9b8f, 0x9bb1, 0x9bbb, 0x9c00, 0x9d70, 0x9d6b, 0xfa2d, 0x9e19, 0x9ed1, }; static int cp932ext_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 == 0x87) || (c1 >= 0xed && c1 <= 0xee) || (c1 >= 0xfa && c1 <= 0xfc)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xfd)) { unsigned int i = 188 * (c1 - (c1 >= 0xe0 ? 0xc1 : 0x81)) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); unsigned short wc = 0xfffd; if (i < 8272) { if (i < 1220) wc = cp932ext_2uni_page87[i-1128]; } else if (i < 10716) { if (i < 8648) wc = cp932ext_2uni_pageed[i-8272]; } else { if (i < 11104) wc = cp932ext_2uni_pagefa[i-10716]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short cp932ext_2charset[457] = { 0xfa59, 0xfa5a, 0xfa4a, 0xfa4b, 0xfa4c, 0xfa4d, 0xfa4e, 0xfa4f, 0xfa50, 0xfa51, 0xfa52, 0xfa53, 0xfa40, 0xfa41, 0xfa42, 0xfa43, 0xfa44, 0xfa45, 0xfa46, 0xfa47, 0xfa48, 0xfa49, 0x8794, 0x8795, 0x8798, 0x8797, 0x879b, 0x879c, 0x8792, 0x8793, 0xfa5b, 0x8790, 0x8791, 0x8796, 0x8799, 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x8747, 0x8748, 0x8749, 0x874a, 0x874b, 0x874c, 0x874d, 0x874e, 0x874f, 0x8750, 0x8751, 0x8752, 0x8753, 0x8780, 0x8781, 0xfa58, 0x878b, 0x878c, 0x8785, 0x8786, 0x8787, 0x8788, 0x8789, 0x8765, 0x8769, 0x8760, 0x8763, 0x8761, 0x876b, 0x876a, 0x8764, 0x876c, 0x8766, 0x876e, 0x875f, 0x876d, 0x8762, 0x8767, 0x8768, 0x877e, 0x878f, 0x878e, 0x878d, 0x8772, 0x8773, 0x876f, 0x8770, 0x8771, 0x8775, 0x8774, 0x8783, 0xfa68, 0xfa69, 0xfa6a, 0xfa6b, 0xfa6c, 0xfa6d, 0xfa6e, 0xfa70, 0xfa6f, 0xfa72, 0xfa71, 0xfa61, 0xfa73, 0xfa76, 0xfa77, 0xfa75, 0xfa74, 0xfa7a, 0xfa78, 0xfa79, 0xfa7b, 0xfa7d, 0xfa7c, 0xfa7e, 0xfa80, 0xfa81, 0xfa82, 0xfa83, 0xfa84, 0xfa85, 0xfa86, 0xfb77, 0xfa87, 0xfa88, 0xfa89, 0xfa8a, 0xfa8b, 0xfa8c, 0xfa8d, 0xfa8e, 0xfa8f, 0xfa92, 0xfa91, 0xfa93, 0xfa94, 0xfa95, 0xfa96, 0xfa97, 0xfa98, 0xfa9a, 0xfa99, 0xfa9d, 0xfa9e, 0xfa9f, 0xfaa0, 0xfaa1, 0xfaa2, 0xfaa3, 0xfaa4, 0xfaa5, 0xfaa6, 0xfaa7, 0xfaa9, 0xfaaa, 0xfaab, 0xfaac, 0xfaad, 0xfaae, 0xfaaf, 0xfab2, 0xfab0, 0xfab3, 0xfab4, 0xfab5, 0xfab6, 0xfab7, 0xfab8, 0xfa67, 0xfab9, 0xfaba, 0xfabb, 0xfabc, 0xfabd, 0xfabe, 0xfac0, 0xfabf, 0xfac2, 0xfac3, 0xfac1, 0xfac5, 0xfac4, 0xfac6, 0xfac7, 0xfac8, 0xfac9, 0xfaca, 0xfacb, 0xfacc, 0xfacd, 0xface, 0xfad1, 0xfacf, 0xfad3, 0xfad4, 0xfad2, 0xfa63, 0xfad0, 0xfad6, 0xfad7, 0xfad5, 0xfad9, 0xfada, 0xfadb, 0xfadc, 0xfadd, 0xfade, 0xfa66, 0xfadf, 0xfae1, 0xfae2, 0xfae4, 0xfae5, 0xfae6, 0xfae3, 0xfa64, 0xfae7, 0xfae9, 0xfaeb, 0xfaec, 0xfaed, 0xfaef, 0xfaee, 0xfaf0, 0xfaf1, 0xfaf2, 0xfaf3, 0xfaf4, 0xfaf5, 0xfaf6, 0xfaf8, 0xfaf7, 0xfaf9, 0xfafa, 0xfafc, 0xfafb, 0xfb40, 0xfb41, 0xfb42, 0xfb44, 0xfb43, 0xfb45, 0xfb48, 0xfb46, 0xfb49, 0xfb47, 0xfb4a, 0xfb4b, 0xfb4c, 0xfb4d, 0xfb4e, 0xfb4f, 0xfb50, 0xfb51, 0xfb52, 0xfa62, 0xfb54, 0xfb53, 0xfb56, 0xfb57, 0xfb55, 0xfb59, 0xfb5a, 0xfb5b, 0xfb5c, 0xfb5d, 0xfb5f, 0xfb60, 0xfb61, 0xfb64, 0xfb62, 0xfb63, 0xfb66, 0xfb65, 0xfb67, 0xfb69, 0xfb68, 0xfb6a, 0xfb6b, 0xfb6c, 0xfb6d, 0xfb6e, 0xfaa8, 0xfb6f, 0xfb70, 0xfb73, 0xfb71, 0xfb72, 0xfb74, 0xfb76, 0xfb78, 0xfb79, 0xfb7a, 0xfb7b, 0xfb7c, 0xfb81, 0xfb83, 0xfb84, 0xfb85, 0xfb87, 0xfb88, 0xfb8a, 0xfb8b, 0xfb8d, 0xfb8c, 0xfb8e, 0xfb8f, 0xfa5c, 0xfb90, 0xfb91, 0xfb93, 0xfb94, 0xfb95, 0xfb96, 0xfb97, 0xfb98, 0xfb99, 0xfa60, 0xfb9a, 0xfb9b, 0xfb9c, 0xfb9e, 0xfba1, 0xfba2, 0xfa5d, 0xfba3, 0xfba4, 0xfba5, 0xfba6, 0xfba7, 0xfba8, 0xfbaa, 0xfbab, 0xfbac, 0xfbad, 0xfbae, 0xfbaf, 0xfbb0, 0xfbb2, 0xfbb5, 0xfbb6, 0xfbb8, 0xfbb9, 0xfbbb, 0xfbba, 0xfbbc, 0xfbbf, 0xfbc0, 0xfbbd, 0xfbbe, 0xfbc1, 0xfbc3, 0xfbc2, 0xfbca, 0xfbc4, 0xfbc6, 0xfbc5, 0xfbc7, 0xfbc9, 0xfbc8, 0xfbcb, 0xfbcd, 0xfbce, 0xfa5f, 0xfbcc, 0xfbd2, 0xfbd6, 0xfbd4, 0xfbd0, 0xfbd1, 0xfbd5, 0xfbcf, 0xfa65, 0xfbd9, 0xfbdc, 0xfbde, 0xfbdd, 0xfbdb, 0xfbd8, 0xfbd7, 0xfa5e, 0xfbe0, 0xfbdf, 0xfbe1, 0xfbe2, 0xfbe3, 0xfbe4, 0xfbe5, 0xfbe6, 0xfbe7, 0xfbe8, 0xfbeb, 0xfbec, 0xfbed, 0xfbee, 0xfbef, 0xfbf0, 0xfbf1, 0xfbf2, 0xfbf3, 0xfbf4, 0xfbf5, 0xfbf8, 0xfbfa, 0xfbfb, 0xfbfc, 0xfc40, 0xfc42, 0xfc41, 0xfc43, 0xfc44, 0xfc45, 0xfc46, 0xfc48, 0xfc47, 0xfc4a, 0xfc4b, 0xfae0, 0xfbe9, 0xfa90, 0xfa9b, 0xfa9c, 0xfab1, 0xfad8, 0xfae8, 0xfaea, 0xfb58, 0xfb5e, 0xfb75, 0xfb7d, 0xfb7e, 0xfb80, 0xfb82, 0xfb86, 0xfb89, 0xfb92, 0xfb9d, 0xfb9f, 0xfba0, 0xfba9, 0xfbb1, 0xfbb3, 0xfbb4, 0xfbb7, 0xfbd3, 0xfbda, 0xfbea, 0xfbf6, 0xfbf7, 0xfbf9, 0xfc49, 0xfa57, 0xfa56, 0xfa54, 0xfa55, }; static const Summary16 cp932ext_uni2indx_page21[28] = { /* 0x2100 */ { 0, 0x0000 }, { 0, 0x0040 }, { 1, 0x0002 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x03ff }, { 12, 0x03ff }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, /* 0x2200 */ { 22, 0x0000 }, { 22, 0x8402 }, { 25, 0x4e01 }, { 30, 0x0020 }, { 31, 0x0000 }, { 31, 0x0004 }, { 32, 0x0002 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0020 }, { 34, 0x8000 }, }; static const Summary16 cp932ext_uni2indx_page24[8] = { /* 0x2400 */ { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0xffff }, { 51, 0x000f }, }; static const Summary16 cp932ext_uni2indx_page30[2] = { /* 0x3000 */ { 55, 0x0000 }, { 55, 0xa000 }, }; static const Summary16 cp932ext_uni2indx_page32[29] = { /* 0x3200 */ { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0206 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x01f0 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, /* 0x3300 */ { 65, 0x2008 }, { 67, 0x0110 }, { 69, 0x08cc }, { 74, 0x0840 }, { 76, 0x2600 }, { 79, 0x0082 }, { 81, 0x0000 }, { 81, 0x7800 }, { 85, 0xc000 }, { 87, 0x7000 }, { 90, 0x0002 }, { 91, 0x0000 }, { 91, 0x2010 }, }; static const Summary16 cp932ext_uni2indx_page4e[121] = { /* 0x4e00 */ { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0100 }, { 94, 0x0000 }, { 94, 0x0000 }, { 94, 0x0000 }, { 94, 0x0000 }, { 94, 0x0000 }, { 94, 0x0000 }, { 94, 0x0000 }, { 94, 0x0000 }, { 94, 0x0000 }, { 94, 0x0000 }, { 94, 0x0000 }, { 94, 0x0002 }, { 95, 0x1000 }, /* 0x4f00 */ { 96, 0x0009 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0200 }, { 99, 0x0000 }, { 99, 0x0040 }, { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0400 }, { 101, 0x0414 }, { 104, 0x0000 }, { 104, 0x0000 }, { 104, 0x2200 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x8000 }, /* 0x5000 */ { 107, 0x0000 }, { 107, 0x4000 }, { 108, 0x0004 }, { 109, 0x0000 }, { 109, 0x0045 }, { 112, 0x0000 }, { 112, 0x0000 }, { 112, 0x0001 }, { 113, 0x0000 }, { 113, 0x0010 }, { 114, 0x0000 }, { 114, 0x0000 }, { 114, 0x0000 }, { 114, 0x0100 }, { 115, 0x0000 }, { 115, 0x0010 }, /* 0x5100 */ { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0400 }, { 117, 0x0000 }, { 117, 0x0010 }, { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x2000 }, { 119, 0x0000 }, { 119, 0x4000 }, { 120, 0x0000 }, { 120, 0x0000 }, { 120, 0x1000 }, { 121, 0x0000 }, /* 0x5200 */ { 121, 0x0000 }, { 121, 0x0020 }, { 122, 0x0000 }, { 122, 0x0000 }, { 122, 0x0000 }, { 122, 0x0000 }, { 122, 0x0000 }, { 122, 0x0000 }, { 122, 0x0000 }, { 122, 0x1000 }, { 123, 0x8040 }, { 125, 0x0000 }, { 125, 0x0001 }, { 126, 0x0800 }, { 127, 0x0000 }, { 127, 0x0000 }, /* 0x5300 */ { 127, 0x0081 }, { 129, 0x0000 }, { 129, 0x0010 }, { 130, 0x0000 }, { 130, 0x0000 }, { 130, 0x0000 }, { 130, 0x0000 }, { 130, 0x0004 }, { 131, 0x0000 }, { 131, 0x0008 }, { 132, 0x0000 }, { 132, 0x0004 }, { 133, 0x0000 }, { 133, 0x2000 }, { 134, 0x0000 }, { 134, 0x0000 }, /* 0x5400 */ { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0400 }, { 135, 0x1000 }, { 136, 0x0200 }, { 137, 0x0000 }, { 137, 0x0000 }, { 137, 0x0000 }, { 137, 0x0000 }, { 137, 0x8000 }, /* 0x5500 */ { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0040 }, }; static const Summary16 cp932ext_uni2indx_page57[44] = { /* 0x5700 */ { 139, 0x0000 }, { 139, 0x0000 }, { 139, 0x0000 }, { 139, 0x0000 }, { 139, 0x0000 }, { 139, 0x0200 }, { 140, 0x0020 }, { 141, 0x0000 }, { 141, 0x0000 }, { 141, 0x0000 }, { 141, 0x1000 }, { 142, 0x0000 }, { 142, 0x0180 }, { 144, 0x0000 }, { 144, 0x0000 }, { 144, 0x0000 }, /* 0x5800 */ { 144, 0x0000 }, { 144, 0x0000 }, { 144, 0x0000 }, { 144, 0x0000 }, { 144, 0x0000 }, { 144, 0x0000 }, { 144, 0x0000 }, { 144, 0x0000 }, { 144, 0x0000 }, { 144, 0x4000 }, { 145, 0x0000 }, { 145, 0x0004 }, { 146, 0x0000 }, { 146, 0x0000 }, { 146, 0x0000 }, { 146, 0x0000 }, /* 0x5900 */ { 146, 0x0800 }, { 147, 0x0000 }, { 147, 0x0000 }, { 147, 0x0000 }, { 147, 0x0000 }, { 147, 0x2808 }, { 150, 0x0008 }, { 151, 0x0000 }, { 151, 0x0000 }, { 151, 0x0000 }, { 151, 0x0010 }, { 152, 0x0400 }, }; static const Summary16 cp932ext_uni2indx_page5b[46] = { /* 0x5b00 */ { 153, 0x0000 }, { 153, 0x0000 }, { 153, 0x0000 }, { 153, 0x0000 }, { 153, 0x0000 }, { 153, 0x0040 }, { 154, 0x0000 }, { 154, 0x0000 }, { 154, 0x0000 }, { 154, 0x0000 }, { 154, 0x0000 }, { 154, 0x0000 }, { 154, 0x0001 }, { 155, 0x0100 }, { 156, 0x1000 }, { 157, 0x0000 }, /* 0x5c00 */ { 157, 0x0000 }, { 157, 0x4000 }, { 158, 0x0000 }, { 158, 0x0000 }, { 158, 0x0000 }, { 158, 0x0000 }, { 158, 0x0000 }, { 158, 0x0000 }, { 158, 0x0000 }, { 158, 0x0000 }, { 158, 0x0040 }, { 159, 0x0400 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0020 }, /* 0x5d00 */ { 161, 0x0000 }, { 161, 0x0000 }, { 161, 0x0080 }, { 162, 0x0000 }, { 162, 0x0004 }, { 163, 0x0008 }, { 164, 0x2000 }, { 165, 0x0000 }, { 165, 0x0000 }, { 165, 0x0000 }, { 165, 0x0000 }, { 165, 0x0300 }, { 167, 0x0000 }, { 167, 0x0001 }, }; static const Summary16 cp932ext_uni2indx_page5f[458] = { /* 0x5f00 */ { 168, 0x0000 }, { 168, 0x0000 }, { 168, 0x0002 }, { 169, 0x0010 }, { 170, 0x0020 }, { 171, 0x0000 }, { 171, 0x0080 }, { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x0080 }, { 173, 0x0000 }, { 173, 0x4000 }, { 174, 0x0000 }, { 174, 0x0000 }, /* 0x6000 */ { 174, 0x0000 }, { 174, 0x0000 }, { 174, 0x0000 }, { 174, 0x0000 }, { 174, 0x0000 }, { 174, 0x2000 }, { 175, 0x0000 }, { 175, 0x0000 }, { 175, 0x0420 }, { 177, 0x0000 }, { 177, 0x0000 }, { 177, 0x0000 }, { 177, 0x0000 }, { 177, 0x4020 }, { 179, 0x0000 }, { 179, 0x0004 }, /* 0x6100 */ { 180, 0x0000 }, { 180, 0x0002 }, { 181, 0x0001 }, { 182, 0x0081 }, { 184, 0x0000 }, { 184, 0x0000 }, { 184, 0x0000 }, { 184, 0x0000 }, { 184, 0x0000 }, { 184, 0x0100 }, { 185, 0x0000 }, { 185, 0x0000 }, { 185, 0x0000 }, { 185, 0x0000 }, { 185, 0x0000 }, { 185, 0x0000 }, /* 0x6200 */ { 185, 0x0000 }, { 185, 0x0008 }, { 186, 0x0000 }, { 186, 0x0000 }, { 186, 0x0000 }, { 186, 0x0000 }, { 186, 0x0000 }, { 186, 0x0000 }, { 186, 0x0000 }, { 186, 0x0000 }, { 186, 0x0040 }, { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, /* 0x6300 */ { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0000 }, { 187, 0x0020 }, /* 0x6400 */ { 188, 0x0000 }, { 188, 0x0000 }, { 188, 0x0000 }, { 188, 0x0000 }, { 188, 0x0000 }, { 188, 0x0000 }, { 188, 0x0001 }, { 189, 0x0000 }, { 189, 0x0000 }, { 189, 0x2000 }, { 190, 0x0000 }, { 190, 0x0000 }, { 190, 0x4000 }, { 191, 0x0000 }, { 191, 0x0000 }, { 191, 0x0000 }, /* 0x6500 */ { 191, 0x0000 }, { 191, 0x0000 }, { 191, 0x0000 }, { 191, 0x0000 }, { 191, 0x4000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, /* 0x6600 */ { 192, 0x0201 }, { 194, 0x4020 }, { 196, 0x4010 }, { 198, 0x0802 }, { 200, 0x0000 }, { 200, 0x0280 }, { 202, 0x0020 }, { 203, 0x0008 }, { 204, 0x0000 }, { 204, 0x0200 }, { 205, 0x0001 }, { 206, 0x8004 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0c00 }, /* 0x6700 */ { 210, 0x4000 }, { 211, 0x0000 }, { 211, 0x0000 }, { 211, 0x0000 }, { 211, 0x0000 }, { 211, 0x0000 }, { 211, 0x0040 }, { 212, 0x0000 }, { 212, 0x0000 }, { 212, 0x0000 }, { 212, 0x0000 }, { 212, 0x0800 }, { 213, 0x0001 }, { 214, 0x0000 }, { 214, 0x0000 }, { 214, 0x0000 }, /* 0x6800 */ { 214, 0x0002 }, { 215, 0x0000 }, { 215, 0x0000 }, { 215, 0x0000 }, { 215, 0x0010 }, { 216, 0x0004 }, { 217, 0x0000 }, { 217, 0x0000 }, { 217, 0x0000 }, { 217, 0x0000 }, { 217, 0x0000 }, { 217, 0x0000 }, { 217, 0x8100 }, { 219, 0x0000 }, { 219, 0x0000 }, { 219, 0x0000 }, /* 0x6900 */ { 219, 0x0000 }, { 219, 0x0000 }, { 219, 0x0000 }, { 219, 0x0000 }, { 219, 0x0000 }, { 219, 0x0000 }, { 219, 0x0100 }, { 220, 0x0000 }, { 220, 0x0000 }, { 220, 0x0100 }, { 221, 0x0000 }, { 221, 0x0000 }, { 221, 0x0000 }, { 221, 0x0000 }, { 221, 0x0004 }, { 222, 0x0000 }, /* 0x6a00 */ { 222, 0x0000 }, { 222, 0x0000 }, { 222, 0x0000 }, { 222, 0x0001 }, { 223, 0x0040 }, { 224, 0x0000 }, { 224, 0x0800 }, { 225, 0x4008 }, { 227, 0x0000 }, { 227, 0x0000 }, { 227, 0x0000 }, { 227, 0x0000 }, { 227, 0x0000 }, { 227, 0x0000 }, { 227, 0x0014 }, { 229, 0x0000 }, /* 0x6b00 */ { 229, 0x0000 }, { 229, 0x0000 }, { 229, 0x0000 }, { 229, 0x0000 }, { 229, 0x0000 }, { 229, 0x0000 }, { 229, 0x0000 }, { 229, 0x0000 }, { 229, 0x0000 }, { 229, 0x0000 }, { 229, 0x0000 }, { 229, 0x0000 }, { 229, 0x0000 }, { 229, 0x0040 }, { 230, 0x0000 }, { 230, 0x0000 }, /* 0x6c00 */ { 230, 0x0000 }, { 230, 0x0000 }, { 230, 0x0000 }, { 230, 0x8000 }, { 231, 0x0000 }, { 231, 0x1000 }, { 232, 0x8000 }, { 233, 0x0000 }, { 233, 0x0040 }, { 234, 0x0000 }, { 234, 0x0000 }, { 234, 0x0000 }, { 234, 0x0000 }, { 234, 0x0400 }, { 235, 0x0000 }, { 235, 0x0000 }, /* 0x6d00 */ { 235, 0x0010 }, { 236, 0x0000 }, { 236, 0x0000 }, { 236, 0x0000 }, { 236, 0x0000 }, { 236, 0x0000 }, { 236, 0x8000 }, { 237, 0x0000 }, { 237, 0x0080 }, { 238, 0x0040 }, { 239, 0x1000 }, { 240, 0x0000 }, { 240, 0x8000 }, { 241, 0x0000 }, { 241, 0x0000 }, { 241, 0x1104 }, /* 0x6e00 */ { 244, 0x0000 }, { 244, 0x0000 }, { 244, 0x0080 }, { 245, 0x1200 }, { 247, 0x0000 }, { 247, 0x1000 }, { 248, 0x0000 }, { 248, 0x0000 }, { 248, 0x0000 }, { 248, 0x0000 }, { 248, 0x0000 }, { 248, 0x8000 }, { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0000 }, /* 0x6f00 */ { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0100 }, { 250, 0x0000 }, { 250, 0x0000 }, { 250, 0x0020 }, { 251, 0x0000 }, { 251, 0x0000 }, { 251, 0x0000 }, { 251, 0x0020 }, /* 0x7000 */ { 252, 0x00a0 }, { 254, 0x0000 }, { 254, 0x0100 }, { 255, 0x0000 }, { 255, 0x0000 }, { 255, 0x0000 }, { 255, 0x0000 }, { 255, 0x0000 }, { 255, 0x0020 }, { 256, 0x0000 }, { 256, 0x0800 }, { 257, 0x0800 }, { 258, 0x0000 }, { 258, 0x0000 }, { 258, 0x0000 }, { 258, 0x0000 }, /* 0x7100 */ { 258, 0x8010 }, { 260, 0x0000 }, { 260, 0x0000 }, { 260, 0x0000 }, { 260, 0x00c0 }, { 262, 0x1000 }, { 263, 0x0000 }, { 263, 0x0000 }, { 263, 0x0000 }, { 263, 0x0000 }, { 263, 0x0000 }, { 263, 0x0000 }, { 263, 0x0002 }, { 264, 0x0000 }, { 264, 0x0000 }, { 264, 0x4000 }, /* 0x7200 */ { 265, 0x0000 }, { 265, 0x0000 }, { 265, 0x0000 }, { 265, 0x0000 }, { 265, 0x0000 }, { 265, 0x0000 }, { 265, 0x0000 }, { 265, 0x0000 }, { 265, 0x0000 }, { 265, 0x0000 }, { 265, 0x0000 }, { 265, 0x4002 }, { 267, 0x0000 }, { 267, 0x0000 }, { 267, 0x0000 }, { 267, 0x0000 }, /* 0x7300 */ { 267, 0x0000 }, { 267, 0x0000 }, { 267, 0x0010 }, { 268, 0x0000 }, { 268, 0x0000 }, { 268, 0x0000 }, { 268, 0x0000 }, { 268, 0x0080 }, { 269, 0x0000 }, { 269, 0x0000 }, { 269, 0x0000 }, { 269, 0x2000 }, { 270, 0x0200 }, { 271, 0x0044 }, { 273, 0x0008 }, { 274, 0x0020 }, /* 0x7400 */ { 275, 0x0080 }, { 276, 0x0000 }, { 276, 0x4640 }, { 280, 0x0000 }, { 280, 0x0000 }, { 280, 0x0000 }, { 280, 0x0004 }, { 281, 0x0000 }, { 281, 0x0200 }, { 282, 0x8000 }, { 283, 0x0000 }, { 283, 0x0000 }, { 283, 0x0000 }, { 283, 0x0000 }, { 283, 0x0000 }, { 283, 0x0000 }, /* 0x7500 */ { 283, 0x0002 }, { 284, 0x0000 }, { 284, 0x8000 }, { 285, 0x0000 }, { 285, 0x0000 }, { 285, 0x0000 }, { 285, 0x8000 }, { 286, 0x0000 }, { 286, 0x0000 }, { 286, 0x0000 }, { 286, 0x0000 }, { 286, 0x0000 }, { 286, 0x0000 }, { 286, 0x0000 }, { 286, 0x0000 }, { 286, 0x0000 }, /* 0x7600 */ { 286, 0x0000 }, { 286, 0x0000 }, { 286, 0x0000 }, { 286, 0x0000 }, { 286, 0x0000 }, { 286, 0x0000 }, { 286, 0x0000 }, { 286, 0x0000 }, { 286, 0x0004 }, { 287, 0x5800 }, { 290, 0x0040 }, { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, /* 0x7700 */ { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0040 }, { 292, 0x0000 }, { 292, 0x0000 }, { 292, 0x0000 }, { 292, 0x0000 }, { 292, 0x0000 }, { 292, 0x0000 }, { 292, 0x0000 }, { 292, 0x0000 }, { 292, 0x0000 }, { 292, 0x0000 }, { 292, 0x0000 }, /* 0x7800 */ { 292, 0x0000 }, { 292, 0x0000 }, { 292, 0x0002 }, { 293, 0x0000 }, { 293, 0x4000 }, { 294, 0x0000 }, { 294, 0x0010 }, { 295, 0x0400 }, { 296, 0x0000 }, { 296, 0x0000 }, { 296, 0x0000 }, { 296, 0x0000 }, { 296, 0x0000 }, { 296, 0x0000 }, { 296, 0x0000 }, { 296, 0x0000 }, /* 0x7900 */ { 296, 0x0000 }, { 296, 0x0000 }, { 296, 0x0000 }, { 296, 0x0001 }, { 297, 0x0000 }, { 297, 0x0000 }, { 297, 0x0000 }, { 297, 0x0000 }, { 297, 0x0000 }, { 297, 0x0810 }, { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0000 }, /* 0x7a00 */ { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0000 }, { 299, 0x0002 }, { 300, 0x0880 }, { 302, 0x0000 }, /* 0x7b00 */ { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x4000 }, }; static const Summary16 cp932ext_uni2indx_page7d[43] = { /* 0x7d00 */ { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0100 }, { 304, 0x1000 }, { 305, 0x0000 }, { 305, 0x0000 }, { 305, 0x0000 }, { 305, 0x0000 }, { 305, 0x0001 }, { 306, 0x0080 }, { 307, 0x0000 }, { 307, 0x0040 }, { 308, 0x0000 }, { 308, 0x0000 }, /* 0x7e00 */ { 308, 0x0000 }, { 308, 0x0000 }, { 308, 0x0000 }, { 308, 0x0000 }, { 308, 0x0000 }, { 308, 0x0004 }, { 309, 0x0000 }, { 309, 0x0000 }, { 309, 0x0400 }, { 310, 0x0000 }, { 310, 0x0000 }, { 310, 0x0000 }, { 310, 0x0000 }, { 310, 0x0000 }, { 310, 0x0000 }, { 310, 0x0000 }, /* 0x7f00 */ { 310, 0x0000 }, { 310, 0x0000 }, { 310, 0x0000 }, { 310, 0x0000 }, { 310, 0x0080 }, { 311, 0x0000 }, { 311, 0x0000 }, { 311, 0x0000 }, { 311, 0x0000 }, { 311, 0x0000 }, { 311, 0x0002 }, }; static const Summary16 cp932ext_uni2indx_page83[44] = { /* 0x8300 */ { 312, 0x0002 }, { 313, 0x0000 }, { 313, 0x0000 }, { 313, 0x0000 }, { 313, 0x0000 }, { 313, 0x0000 }, { 313, 0x0004 }, { 314, 0x8000 }, { 315, 0x0000 }, { 315, 0x0000 }, { 315, 0x0000 }, { 315, 0x0000 }, { 315, 0x0080 }, { 316, 0x0000 }, { 316, 0x0000 }, { 316, 0x0040 }, /* 0x8400 */ { 317, 0x0000 }, { 317, 0x0000 }, { 317, 0x0000 }, { 317, 0x0000 }, { 317, 0x0100 }, { 318, 0x0000 }, { 318, 0x0000 }, { 318, 0x0000 }, { 318, 0x0000 }, { 318, 0x0000 }, { 318, 0x0000 }, { 318, 0x0010 }, { 319, 0x0000 }, { 319, 0x1000 }, { 320, 0x0000 }, { 320, 0x0000 }, /* 0x8500 */ { 320, 0x0000 }, { 320, 0x0000 }, { 320, 0x0000 }, { 320, 0x0000 }, { 320, 0x0000 }, { 320, 0x0208 }, { 322, 0x0800 }, { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0001 }, }; static const Summary16 cp932ext_uni2indx_page88[109] = { /* 0x8800 */ { 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, 0x0020 }, /* 0x8900 */ { 326, 0x0000 }, { 326, 0x1000 }, { 327, 0x0000 }, { 327, 0x0000 }, { 327, 0x0000 }, { 327, 0x0000 }, { 327, 0x0000 }, { 327, 0x0000 }, { 327, 0x0000 }, { 327, 0x0000 }, { 327, 0x0000 }, { 327, 0x0000 }, { 327, 0x0000 }, { 327, 0x0000 }, { 327, 0x0000 }, { 327, 0x0000 }, /* 0x8a00 */ { 327, 0x0000 }, { 327, 0x0004 }, { 328, 0x0000 }, { 328, 0x0080 }, { 329, 0x0000 }, { 329, 0x0000 }, { 329, 0x0000 }, { 329, 0x0200 }, { 330, 0x0000 }, { 330, 0x0000 }, { 330, 0x0080 }, { 331, 0x4000 }, { 332, 0x0000 }, { 332, 0x8000 }, { 333, 0x0000 }, { 333, 0x0040 }, /* 0x8b00 */ { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0008 }, { 335, 0x0000 }, { 335, 0x8000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, /* 0x8c00 */ { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0000 }, { 336, 0x0011 }, /* 0x8d00 */ { 338, 0x0000 }, { 338, 0x0004 }, { 339, 0x0000 }, { 339, 0x0000 }, { 339, 0x0000 }, { 339, 0x0000 }, { 339, 0x0000 }, { 339, 0x0040 }, { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, /* 0x8e00 */ { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x8000 }, }; static const Summary16 cp932ext_uni2indx_page90[238] = { /* 0x9000 */ { 341, 0x0000 }, { 341, 0x0000 }, { 341, 0x0000 }, { 341, 0x0000 }, { 341, 0x0000 }, { 341, 0x0000 }, { 341, 0x0080 }, { 342, 0x0000 }, { 342, 0x0000 }, { 342, 0x0000 }, { 342, 0x0000 }, { 342, 0x0000 }, { 342, 0x0000 }, { 342, 0x4000 }, { 343, 0x0000 }, { 343, 0x0000 }, /* 0x9100 */ { 343, 0x0000 }, { 343, 0x0020 }, { 344, 0x0080 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x4480 }, { 348, 0x6030 }, { 352, 0x0000 }, /* 0x9200 */ { 352, 0x0440 }, { 354, 0x0001 }, { 355, 0x0000 }, { 355, 0x1600 }, { 358, 0x4001 }, { 360, 0x0202 }, { 362, 0x0080 }, { 363, 0x0180 }, { 365, 0x0100 }, { 366, 0x0000 }, { 366, 0x0080 }, { 367, 0x0000 }, { 367, 0x0000 }, { 367, 0x02a9 }, { 372, 0x0081 }, { 374, 0x8a00 }, /* 0x9300 */ { 377, 0x0004 }, { 378, 0x6000 }, { 380, 0x0022 }, { 382, 0x0000 }, { 382, 0x0100 }, { 383, 0x0080 }, { 384, 0x0000 }, { 384, 0x0001 }, { 385, 0x0000 }, { 385, 0x0000 }, { 385, 0x0010 }, { 386, 0x0000 }, { 386, 0x0040 }, { 387, 0x4000 }, { 388, 0x0000 }, { 388, 0x0100 }, /* 0x9400 */ { 389, 0x0000 }, { 389, 0x0000 }, { 389, 0x0000 }, { 389, 0x0002 }, { 390, 0x0120 }, { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, /* 0x9500 */ { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0000 }, { 392, 0x0004 }, { 393, 0x0000 }, { 393, 0x0000 }, { 393, 0x0000 }, { 393, 0x0000 }, { 393, 0x0000 }, { 393, 0x0000 }, /* 0x9600 */ { 393, 0x0000 }, { 393, 0x0000 }, { 393, 0x0000 }, { 393, 0x0000 }, { 393, 0x0000 }, { 393, 0x0000 }, { 393, 0x0000 }, { 393, 0x0000 }, { 393, 0x0000 }, { 393, 0x2000 }, { 394, 0x8000 }, { 395, 0x0000 }, { 395, 0x0000 }, { 395, 0x0000 }, { 395, 0x0000 }, { 395, 0x0000 }, /* 0x9700 */ { 395, 0x0000 }, { 395, 0x0000 }, { 395, 0x0000 }, { 395, 0x0808 }, { 397, 0xa008 }, { 400, 0x0022 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, /* 0x9800 */ { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0080 }, { 403, 0x0020 }, { 404, 0x0000 }, { 404, 0x0000 }, { 404, 0x0000 }, { 404, 0x0000 }, { 404, 0x0000 }, { 404, 0x0000 }, { 404, 0x0000 }, { 404, 0x0000 }, { 404, 0x0000 }, /* 0x9900 */ { 404, 0x0000 }, { 404, 0x0000 }, { 404, 0x0080 }, { 405, 0x0000 }, { 405, 0x0000 }, { 405, 0x0000 }, { 405, 0x0000 }, { 405, 0x0000 }, { 405, 0x0000 }, { 405, 0x4000 }, { 406, 0x0000 }, { 406, 0x0000 }, { 406, 0x0000 }, { 406, 0x0000 }, { 406, 0x0000 }, { 406, 0x0000 }, /* 0x9a00 */ { 406, 0x0000 }, { 406, 0x0000 }, { 406, 0x0000 }, { 406, 0x0000 }, { 406, 0x4000 }, { 407, 0x0000 }, { 407, 0x0000 }, { 407, 0x0000 }, { 407, 0x0000 }, { 407, 0x0000 }, { 407, 0x0000 }, { 407, 0x0000 }, { 407, 0x0000 }, { 407, 0x1200 }, { 409, 0x0000 }, { 409, 0x0000 }, /* 0x9b00 */ { 409, 0x0000 }, { 409, 0x0000 }, { 409, 0x0000 }, { 409, 0x0000 }, { 409, 0x0000 }, { 409, 0x0000 }, { 409, 0x0000 }, { 409, 0x0024 }, { 411, 0x8000 }, { 412, 0x0000 }, { 412, 0x0000 }, { 412, 0x0802 }, { 414, 0x0000 }, { 414, 0x0000 }, { 414, 0x0000 }, { 414, 0x0000 }, /* 0x9c00 */ { 414, 0x0001 }, { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, /* 0x9d00 */ { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0000 }, { 415, 0x0800 }, { 416, 0x0001 }, { 417, 0x0000 }, { 417, 0x0000 }, { 417, 0x0000 }, { 417, 0x0000 }, { 417, 0x0000 }, { 417, 0x0000 }, { 417, 0x0000 }, { 417, 0x0000 }, /* 0x9e00 */ { 417, 0x0000 }, { 417, 0x0200 }, { 418, 0x0000 }, { 418, 0x0000 }, { 418, 0x0000 }, { 418, 0x0000 }, { 418, 0x0000 }, { 418, 0x0000 }, { 418, 0x0000 }, { 418, 0x0000 }, { 418, 0x0000 }, { 418, 0x0000 }, { 418, 0x0000 }, { 418, 0x0002 }, }; static const Summary16 cp932ext_uni2indx_pagef9[19] = { /* 0xf900 */ { 419, 0x0000 }, { 419, 0x0000 }, { 419, 0x0200 }, { 420, 0x0000 }, { 420, 0x0000 }, { 420, 0x0000 }, { 420, 0x0000 }, { 420, 0x0000 }, { 420, 0x0000 }, { 420, 0x0000 }, { 420, 0x0000 }, { 420, 0x0000 }, { 420, 0x0000 }, { 420, 0x1000 }, { 421, 0x0000 }, { 421, 0x0000 }, /* 0xfa00 */ { 421, 0xc000 }, { 423, 0xffff }, { 439, 0x3fff }, }; static const Summary16 cp932ext_uni2indx_pageff[15] = { /* 0xff00 */ { 453, 0x0084 }, { 455, 0x0000 }, { 455, 0x0000 }, { 455, 0x0000 }, { 455, 0x0000 }, { 455, 0x0000 }, { 455, 0x0000 }, { 455, 0x0000 }, { 455, 0x0000 }, { 455, 0x0000 }, { 455, 0x0000 }, { 455, 0x0000 }, { 455, 0x0000 }, { 455, 0x0000 }, { 455, 0x0014 }, }; static int cp932ext_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc >= 0x2100 && wc < 0x22c0) summary = &cp932ext_uni2indx_page21[(wc>>4)-0x210]; else if (wc >= 0x2400 && wc < 0x2480) summary = &cp932ext_uni2indx_page24[(wc>>4)-0x240]; else if (wc >= 0x3000 && wc < 0x3020) summary = &cp932ext_uni2indx_page30[(wc>>4)-0x300]; else if (wc >= 0x3200 && wc < 0x33d0) summary = &cp932ext_uni2indx_page32[(wc>>4)-0x320]; else if (wc >= 0x4e00 && wc < 0x5590) summary = &cp932ext_uni2indx_page4e[(wc>>4)-0x4e0]; else if (wc >= 0x5700 && wc < 0x59c0) summary = &cp932ext_uni2indx_page57[(wc>>4)-0x570]; else if (wc >= 0x5b00 && wc < 0x5de0) summary = &cp932ext_uni2indx_page5b[(wc>>4)-0x5b0]; else if (wc >= 0x5f00 && wc < 0x7ba0) summary = &cp932ext_uni2indx_page5f[(wc>>4)-0x5f0]; else if (wc >= 0x7d00 && wc < 0x7fb0) summary = &cp932ext_uni2indx_page7d[(wc>>4)-0x7d0]; else if (wc >= 0x8300 && wc < 0x85c0) summary = &cp932ext_uni2indx_page83[(wc>>4)-0x830]; else if (wc >= 0x8800 && wc < 0x8ed0) summary = &cp932ext_uni2indx_page88[(wc>>4)-0x880]; else if (wc >= 0x9000 && wc < 0x9ee0) summary = &cp932ext_uni2indx_page90[(wc>>4)-0x900]; else if (wc >= 0xf900 && wc < 0xfa30) summary = &cp932ext_uni2indx_pagef9[(wc>>4)-0xf90]; else if (wc >= 0xff00 && wc < 0xfff0) summary = &cp932ext_uni2indx_pageff[(wc>>4)-0xff0]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' 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); c = cp932ext_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/cp936.h000066400000000000000000000070221252300335000237430ustar00rootroot00000000000000/* * Copyright (C) 2005 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP936 */ /* * The IANA has CP936 as an alias of GBK. But GBK is an official Chinese * specification, whereas CP936 is de-facto maintained by Microsoft. And, * of course, Microsoft modified CP936 since 1999. * * The differences from GBK are: * * 1. A single character: * * code CP936.TXT * 0x80 0x20AC # EURO SIGN * * Some variants of CP936 (in JDK, Windows-2000, ICU) also add: * * 2. Private area mappings: * * code Unicode * 0x{A1..A2}{40..7E,80..A0} U+E4C6..U+E585 * 0x{AA..AF,F8..FE}{A1..FE} U+E000..U+E4C5 * * We add them too because, although there are backward compatibility problems * when a character from a private area is moved to an official Unicode code * point, they are useful for some people in practice. */ static int cp936_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { /* Try GBK first. */ { int ret = ces_gbk_mbtowc(conv,pwc,s,n); if (ret != RET_ILSEQ) return ret; } /* Then handle the additional mappings. */ { unsigned char c = *s; if (c == 0x80) { *pwc = 0x20ac; return 1; } /* User-defined characters */ if (c >= 0xa1 && c <= 0xa2) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xa1)) { *pwc = 0xe4c6 + 96 * (c - 0xa1) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); return 2; } } } else if ((c >= 0xaa && c < 0xb0) || (c >= 0xf8 && c < 0xff)) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if (c2 >= 0xa1 && c2 < 0xff) { *pwc = 0xe000 + 94 * (c - (c >= 0xf8 ? 0xf2 : 0xaa)) + (c2 - 0xa1); return 2; } } } } return RET_ILSEQ; } static int cp936_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { /* Try GBK first. */ { int ret = ces_gbk_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; } /* Then handle the additional mappings. */ if (wc >= 0xe000 && wc < 0xe586) { /* User-defined characters */ if (n < 2) return RET_TOOFEW(0); if (wc < 0xe4c6) { unsigned int i = wc - 0xe000; unsigned int c1 = i / 94; unsigned int c2 = i % 94; r[0] = c1 + (c1 < 6 ? 0xaa : 0xf2); r[1] = c2 + 0xa1; return 2; } else { unsigned int i = wc - 0xe4c6; unsigned int c1 = i / 96; unsigned int c2 = i % 96; r[0] = c1 + 0xa1; r[1] = c2 + (c2 < 0x3f ? 0x40 : 0x41); return 2; } } else if (wc == 0x20ac) { r[0] = 0x80; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp936ext.h000066400000000000000000000066471252300335000245000ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP936 extensions */ static const unsigned short cp936ext_2uni_pagea6[181-159] = { /* 0xa6 */ 0xfe35, 0xfe36, 0xfe39, 0xfe3a, 0xfe3f, 0xfe40, 0xfe3d, 0xfe3e, 0xfe41, 0xfe42, 0xfe43, 0xfe44, 0xfffd, 0xfffd, 0xfe3b, 0xfe3c, 0xfe37, 0xfe38, 0xfe31, 0xfffd, 0xfe33, 0xfe34, }; static const unsigned short cp936ext_2uni_pagea8[128-122] = { /* 0xa8 */ 0x0251, 0xfffd, 0x0144, 0x0148, 0xfffd, 0x0261, }; static int cp936ext_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 == 0xa6) || (c1 == 0xa8)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xff)) { unsigned int i = 190 * (c1 - 0x81) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); unsigned short wc = 0xfffd; if (i < 7410) { if (i >= 7189 && i < 7211) wc = cp936ext_2uni_pagea6[i-7189]; } else { if (i >= 7532 && i < 7538) wc = cp936ext_2uni_pagea8[i-7532]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short cp936ext_page01[16] = { 0x0000, 0x0000, 0x0000, 0x0000, 0xa8bd, 0x0000, 0x0000, 0x0000, /*0x40-0x47*/ 0xa8be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x48-0x4f*/ }; static const unsigned short cp936ext_page02[24] = { 0x0000, 0xa8bb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x50-0x57*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x58-0x5f*/ 0x0000, 0xa8c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x60-0x67*/ }; static const unsigned short cp936ext_pagefe[24] = { 0x0000, 0xa6f2, 0x0000, 0xa6f4, 0xa6f5, 0xa6e0, 0xa6e1, 0xa6f0, /*0x30-0x37*/ 0xa6f1, 0xa6e2, 0xa6e3, 0xa6ee, 0xa6ef, 0xa6e6, 0xa6e7, 0xa6e4, /*0x38-0x3f*/ 0xa6e5, 0xa6e8, 0xa6e9, 0xa6ea, 0xa6eb, 0x0000, 0x0000, 0x0000, /*0x40-0x47*/ }; static int cp936ext_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { unsigned short c = 0; if (wc >= 0x0140 && wc < 0x0150) c = cp936ext_page01[wc-0x0140]; else if (wc >= 0x0250 && wc < 0x0268) c = cp936ext_page02[wc-0x0250]; else if (wc >= 0xfe30 && wc < 0xfe48) c = cp936ext_pagefe[wc-0xfe30]; if (c != 0) { r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } return RET_ILUNI; } return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/cp943.h000066400000000000000000000021771252300335000237470ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * IBM CP943 */ /* This is essentially CP932, with many mappings missing in the AIX conversion table. We just pretend it were the same as CP932. */ #define cp943_mbtowc cp932_mbtowc #define cp943_wctomb cp932_wctomb freelan-2.0/third-party/source/libiconv-msvc/include/cp949.h000066400000000000000000000066521252300335000237570ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2005, 2007 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP949 is EUC-KR, extended with UHC (Unified Hangul Code). * * Some variants of CP949 (in JDK, Windows-2000, ICU) also add: * * 2. Private area mappings: * * code Unicode * 0xC9{A1..FE} U+E000..U+E05D * 0xFE{A1..FE} U+E05E..U+E0BB * * We add them too because, although there are backward compatibility problems * when a character from a private area is moved to an official Unicode code * point, they are useful for some people in practice. */ #include "uhc_1.h" #include "uhc_2.h" static int cp949_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; /* Code set 0 (ASCII) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* UHC part 1 */ if (c >= 0x81 && c <= 0xa0) return uhc_1_mbtowc(conv,pwc,s,n); if (c >= 0xa1 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if (c2 < 0xa1) /* UHC part 2 */ return uhc_2_mbtowc(conv,pwc,s,n); else if (c2 < 0xff && !(c == 0xa2 && c2 == 0xe8)) { /* Code set 1 (KS C 5601-1992, now KS X 1001:1998) */ unsigned char buf[2]; int ret; buf[0] = c-0x80; buf[1] = c2-0x80; ret = ksc5601_mbtowc(conv,pwc,buf,2); if (ret != RET_ILSEQ) return ret; /* User-defined characters */ if (c == 0xc9) { *pwc = 0xe000 + (c2 - 0xa1); return 2; } if (c == 0xfe) { *pwc = 0xe05e + (c2 - 0xa1); return 2; } } } } return RET_ILSEQ; } static int cp949_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; /* Code set 0 (ASCII) */ ret = ascii_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; /* Code set 1 (KS C 5601-1992, now KS X 1001:1998) */ if (wc != 0x327e) { ret = ksc5601_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]+0x80; r[1] = buf[1]+0x80; return 2; } } /* UHC */ if (wc >= 0xac00 && wc < 0xd7a4) { if (wc < 0xc8a5) return uhc_1_wctomb(conv,r,wc,n); else return uhc_2_wctomb(conv,r,wc,n); } /* User-defined characters */ if (wc >= 0xe000 && wc < 0xe0bc) { if (n < 2) return RET_TOOSMALL; if (wc < 0xe05e) { r[0] = 0xc9; r[1] = wc - 0xe000 + 0xa1; } else { r[0] = 0xfe; r[1] = wc - 0xe05e + 0xa1; } return 2; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp950.h000066400000000000000000000256641252300335000237530ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2005 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP950 */ /* * Microsoft CP950 is a slightly extended and slightly modified version of * BIG5. The differences between the EASTASIA/OTHER/BIG5.TXT and * VENDORS/MICSFT/WINDOWS/CP950.TXT tables found on ftp.unicode.org are * as follows: * * 1. Some characters in the BIG5 range are defined differently: * * code BIG5.TXT CP950.TXT * 0xA145 0x2022 # BULLET 0x2027 # HYPHENATION POINT * 0xA14E 0xFF64 # HALFWIDTH IDEOGRAPHIC COMMA * 0xFE51 # SMALL IDEOGRAPHIC COMMA * 0xA15A --- 0x2574 # BOX DRAWINGS LIGHT LEFT * 0xA1C2 0x203E # OVERLINE 0x00AF # MACRON * 0xA1C3 --- 0xFFE3 # FULLWIDTH MACRON * 0xA1C5 --- 0x02CD # MODIFIER LETTER LOW MACRON * 0xA1E3 0x223C # TILDE OPERATOR 0xFF5E # FULLWIDTH TILDE * 0xA1F2 0x2641 # EARTH 0x2295 # CIRCLED PLUS * 0xA1F3 0x2609 # SUN 0x2299 # CIRCLED DOT OPERATOR * 0xA1FE --- 0xFF0F # FULLWIDTH SOLIDUS * 0xA240 --- 0xFF3C # FULLWIDTH REVERSE SOLIDUS * 0xA241 0xFF0F # FULLWIDTH SOLIDUS 0x2215 # DIVISION SLASH * 0xA242 0xFF3C # FULLWIDTH REVERSE SOLIDUS * 0xFE68 # SMALL REVERSE SOLIDUS * 0xA244 0x00A5 # YEN SIGN 0xFFE5 # FULLWIDTH YEN SIGN * 0xA246 0x00A2 # CENT SIGN 0xFFE0 # FULLWIDTH CENT SIGN * 0xA247 0x00A3 # POUND SIGN 0xFFE1 # FULLWIDTH POUND SIGN * 0xA2CC --- 0x5341 * 0xA2CE --- 0x5345 * * 2. A small new row. See cp950ext.h. * * 3. CP950.TXT is lacking the range 0xC6A1..0xC7FC (Hiragana, Katakana, * Cyrillic, circled digits, parenthesized digits). * * We implement this omission, because said range is marked "uncertain" * in the unicode.org BIG5 table. * * The table found on Microsoft's website furthermore adds: * * 4. A single character: * * code CP950.TXT * 0xA3E1 0x20AC # EURO SIGN * * Many variants of BIG5 or CP950 (in JDK, Solaris, OSF/1, Windows-2000, ICU, * as well as our BIG5-2003 converter) also add: * * 5. Private area mappings: * * code Unicode * 0x{81..8D}{40..7E,A1..FE} U+EEB8..U+F6B0 * 0x{8E..A0}{40..7E,A1..FE} U+E311..U+EEB7 * 0x{FA..FE}{40..7E,A1..FE} U+E000..U+E310 * * We add them too because, although there are backward compatibility problems * when a character from a private area is moved to an official Unicode code * point, they are useful for some people in practice. */ static const unsigned short cp950_2uni_pagea1[314] = { /* 0xa1 */ 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, 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, /* 0xa2 */ 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, 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, }; #include "cp950ext.h" static int cp950_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; /* Code set 0 (ASCII) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (BIG5 extended) */ if (c >= 0x81 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { if (c >= 0xa1) { if (c < 0xa3) { unsigned int i = 157 * (c - 0xa1) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); unsigned short wc = cp950_2uni_pagea1[i]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } if (!((c == 0xc6 && c2 >= 0xa1) || c == 0xc7)) { int ret = big5_mbtowc(conv,pwc,s,2); if (ret != RET_ILSEQ) return ret; } if (c == 0xa3 && c2 == 0xe1) { *pwc = 0x20ac; return 2; } if (c >= 0xfa) { /* User-defined characters */ *pwc = 0xe000 + 157 * (c - 0xfa) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); return 2; } } else { /* 0x81 <= c < 0xa1. */ /* User-defined characters */ *pwc = (c >= 0x8e ? 0xdb18 : 0xeeb8) + 157 * (c - 0x81) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); return 2; } } } if (c == 0xf9) { int ret = cp950ext_mbtowc(conv,pwc,s,2); if (ret != RET_ILSEQ) return ret; } } return RET_ILSEQ; } static int cp950_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; /* Code set 0 (ASCII) */ ret = ascii_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; /* Code set 1 (BIG5 extended) */ switch (wc >> 8) { case 0x00: if (wc == 0x00af) { buf[0] = 0xa1; buf[1] = 0xc2; ret = 2; break; } if (wc == 0x00a2 || wc == 0x00a3 || wc == 0x00a4) return RET_ILUNI; break; case 0x02: if (wc == 0x02cd) { buf[0] = 0xa1; buf[1] = 0xc5; ret = 2; break; } break; case 0x20: if (wc == 0x2027) { buf[0] = 0xa1; buf[1] = 0x45; ret = 2; break; } if (wc == 0x20ac) { buf[0] = 0xa3; buf[1] = 0xe1; ret = 2; break; } if (wc == 0x2022 || wc == 0x203e) return RET_ILUNI; break; case 0x22: if (wc == 0x2215) { buf[0] = 0xa2; buf[1] = 0x41; ret = 2; break; } if (wc == 0x2295) { buf[0] = 0xa1; buf[1] = 0xf2; ret = 2; break; } if (wc == 0x2299) { buf[0] = 0xa1; buf[1] = 0xf3; ret = 2; break; } if (wc == 0x223c) return RET_ILUNI; break; case 0x25: if (wc == 0x2574) { buf[0] = 0xa1; buf[1] = 0x5a; ret = 2; break; } break; case 0x26: if (wc == 0x2609 || wc == 0x2641) return RET_ILUNI; break; case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7: case 0xe8: case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed: case 0xee: case 0xef: case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: { /* User-defined characters */ unsigned int i = wc - 0xe000; if (i < 5809) { unsigned int c1 = i / 157; unsigned int c2 = i % 157; buf[0] = c1 + (c1 < 5 ? 0xfa : c1 < 24 ? 0x89 : 0x69); buf[1] = c2 + (c2 < 0x3f ? 0x40 : 0x62); ret = 2; break; } } break; case 0xfe: if (wc == 0xfe51) { buf[0] = 0xa1; buf[1] = 0x4e; ret = 2; break; } if (wc == 0xfe68) { buf[0] = 0xa2; buf[1] = 0x42; ret = 2; break; } break; case 0xff: if (wc == 0xff0f) { buf[0] = 0xa1; buf[1] = 0xfe; ret = 2; break; } if (wc == 0xff3c) { buf[0] = 0xa2; buf[1] = 0x40; ret = 2; break; } if (wc == 0xff5e) { buf[0] = 0xa1; buf[1] = 0xe3; ret = 2; break; } if (wc == 0xffe0) { buf[0] = 0xa2; buf[1] = 0x46; ret = 2; break; } if (wc == 0xffe1) { buf[0] = 0xa2; buf[1] = 0x47; ret = 2; break; } if (wc == 0xffe3) { buf[0] = 0xa1; buf[1] = 0xc3; ret = 2; break; } if (wc == 0xffe5) { buf[0] = 0xa2; buf[1] = 0x44; ret = 2; break; } if (wc == 0xff64) return RET_ILUNI; break; } if (ret == RET_ILUNI) ret = big5_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (!((buf[0] == 0xc6 && buf[1] >= 0xa1) || buf[0] == 0xc7)) { if (n < 2) return RET_TOOSMALL; r[0] = buf[0]; r[1] = buf[1]; return 2; } } ret = cp950ext_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]; r[1] = buf[1]; return 2; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/cp950ext.h000066400000000000000000000143331252300335000244630ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP950 extensions */ static const unsigned short cp950ext_2uni_pagef9[157-116] = { /* 0xf9 */ 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, 0x2593, }; static int cp950ext_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 == 0xf9)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { unsigned int i = 157 * (c1 - 0xa1) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); unsigned short wc = 0xfffd; { if (i >= 13932 && i < 13973) wc = cp950ext_2uni_pagef9[i-13932]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short cp950ext_2charset[41] = { 0xf9f9, 0xf9f8, 0xf9e6, 0xf9ef, 0xf9dd, 0xf9e8, 0xf9f1, 0xf9df, 0xf9ec, 0xf9f5, 0xf9e3, 0xf9ee, 0xf9f7, 0xf9e5, 0xf9e9, 0xf9f2, 0xf9e0, 0xf9eb, 0xf9f4, 0xf9e2, 0xf9e7, 0xf9f0, 0xf9de, 0xf9ed, 0xf9f6, 0xf9e4, 0xf9ea, 0xf9f3, 0xf9e1, 0xf9fa, 0xf9fb, 0xf9fd, 0xf9fc, 0xf9fe, 0xf9d9, 0xf9dc, 0xf9da, 0xf9d6, 0xf9db, 0xf9d8, 0xf9d7, }; static const Summary16 cp950ext_uni2indx_page25[10] = { /* 0x2500 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0xffff }, { 16, 0xffff }, { 32, 0x0001 }, { 33, 0x0000 }, { 33, 0x0008 }, }; static const Summary16 cp950ext_uni2indx_page58[12] = { /* 0x5800 */ { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0800 }, }; static const Summary16 cp950ext_uni2indx_page5a[16] = { /* 0x5a00 */ { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0400 }, }; static const Summary16 cp950ext_uni2indx_page60[6] = { /* 0x6000 */ { 36, 0x0000 }, { 36, 0x0000 }, { 36, 0x0000 }, { 36, 0x0000 }, { 36, 0x0000 }, { 36, 0x0004 }, }; static const Summary16 cp950ext_uni2indx_page78[9] = { /* 0x7800 */ { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0002 }, }; static const Summary16 cp950ext_uni2indx_page7c[11] = { /* 0x7c00 */ { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0080 }, }; static const Summary16 cp950ext_uni2indx_page88[13] = { /* 0x8800 */ { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x8000 }, }; static const Summary16 cp950ext_uni2indx_page92[12] = { /* 0x9200 */ { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0200 }, }; static int cp950ext_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc >= 0x2500 && wc < 0x25a0) summary = &cp950ext_uni2indx_page25[(wc>>4)-0x250]; else if (wc >= 0x5800 && wc < 0x58c0) summary = &cp950ext_uni2indx_page58[(wc>>4)-0x580]; else if (wc >= 0x5a00 && wc < 0x5b00) summary = &cp950ext_uni2indx_page5a[(wc>>4)-0x5a0]; else if (wc >= 0x6000 && wc < 0x6060) summary = &cp950ext_uni2indx_page60[(wc>>4)-0x600]; else if (wc >= 0x7800 && wc < 0x7890) summary = &cp950ext_uni2indx_page78[(wc>>4)-0x780]; else if (wc >= 0x7c00 && wc < 0x7cb0) summary = &cp950ext_uni2indx_page7c[(wc>>4)-0x7c0]; else if (wc >= 0x8800 && wc < 0x88d0) summary = &cp950ext_uni2indx_page88[(wc>>4)-0x880]; else if (wc >= 0x9200 && wc < 0x92c0) summary = &cp950ext_uni2indx_page92[(wc>>4)-0x920]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' 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); c = cp950ext_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/dec_hanyu.h000066400000000000000000000062131252300335000250370ustar00rootroot00000000000000/* * Copyright (C) 2001, 2005 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * DEC-HANYU */ static int dec_hanyu_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; /* Code set 0 (ASCII) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (CNS 11643-1992 Plane 1), Code set 2 (CNS 11643-1992 Plane 2), Code set 3 (CNS 11643-1992 Plane 3) */ if (c >= 0xa1 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if (c == 0xc2 && c2 == 0xcb) { if (n < 4) return RET_TOOFEW(0); if (s[2] >= 0xa1 && s[2] < 0xff && s[3] >= 0xa1 && s[3] < 0xff) { unsigned char buf[2]; int ret; buf[0] = s[2]-0x80; buf[1] = s[3]-0x80; ret = cns11643_3_mbtowc(conv,pwc,buf,2); if (ret != RET_ILSEQ) { if (ret != 2) abort(); return 4; } } } else if (c2 >= 0xa1 && c2 < 0xff) { if (c != 0xc2 || c2 < 0xc2) { unsigned char buf[2]; buf[0] = c-0x80; buf[1] = c2-0x80; return cns11643_1_mbtowc(conv,pwc,buf,2); } } else if (c2 >= 0x21 && c2 < 0x7f) { unsigned char buf[2]; buf[0] = c-0x80; buf[1] = c2; return cns11643_2_mbtowc(conv,pwc,buf,2); } } } return RET_ILSEQ; } static int dec_hanyu_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[3]; int ret; /* Code set 0 (ASCII) */ ret = ascii_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; ret = cns11643_wctomb(conv,buf,wc,3); if (ret != RET_ILUNI) { if (ret != 3) abort(); /* Code set 1 (CNS 11643-1992 Plane 1) */ if (buf[0] == 1 && (buf[1] != 0x42 || buf[2] < 0x42)) { if (n < 2) return RET_TOOSMALL; r[0] = buf[1]+0x80; r[1] = buf[2]+0x80; return 2; } /* Code set 2 (CNS 11643-1992 Plane 2) */ if (buf[0] == 2) { if (n < 2) return RET_TOOSMALL; r[0] = buf[1]+0x80; r[1] = buf[2]; return 2; } /* Code set 3 (CNS 11643-1992 Plane 3) */ if (buf[0] == 3) { if (n < 4) return RET_TOOSMALL; r[0] = 0xc2; r[1] = 0xcb; r[2] = buf[1]+0x80; r[3] = buf[2]+0x80; return 4; } } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/dec_kanji.h000066400000000000000000000037231252300335000250120ustar00rootroot00000000000000/* * Copyright (C) 2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * DEC-KANJI */ static int dec_kanji_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; /* Code set 0 (ASCII or JIS X 0201-1976 Roman) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (JIS X 0208) */ if (c >= 0xa1 && c < 0xf5) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if (c2 >= 0xa1 && c2 < 0xff) { unsigned char buf[2]; buf[0] = c-0x80; buf[1] = c2-0x80; return jisx0208_mbtowc(conv,pwc,buf,2); } } } return RET_ILSEQ; } static int dec_kanji_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; /* Code set 0 (ASCII or JIS X 0201-1976 Roman) */ ret = ascii_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; /* Code set 1 (JIS X 0208) */ ret = jisx0208_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]+0x80; r[1] = buf[1]+0x80; return 2; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/encodings.def000066400000000000000000001132031252300335000253560ustar00rootroot00000000000000/* Copyright (C) 1999-2010 Free Software Foundation, Inc. This file is part of the GNU LIBICONV Library. The GNU LIBICONV Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU LIBICONV 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU LIBICONV Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* The list of all system independent user-visible encodings. */ /* By convention, an encoding named FOOBAR or FOO_BAR or FOO-BAR is defined in a file named "foobar.h" through the functions foobar_mbtowc and foobar_wctomb (and possibly foobar_reset). */ /* DEFENCODING(( name, alias1, ..., ), xxx, { xxx_mbtowc, xxx_flushwc }, { xxx_wctomb, xxx_reset }) defines an encoding with the given name and aliases. (There is no difference between a name and an alias. By convention, the name is chosen as the preferred MIME name or the standard name.) All names and aliases must be in ASCII. Case is not significant, but for the "cs*" aliases mixed case is preferred, otherwise UPPERCASE is preferred. For all names and aliases, note where it comes from. xxx is the name as used in the C code (lowercase). */ DEFENCODING(( "US-ASCII", /* IANA */ "ASCII", /* IANA, JDK 1.1 */ "ISO646-US", /* IANA */ "ISO_646.IRV:1991", /* IANA */ "ISO-IR-6", /* IANA */ "ANSI_X3.4-1968", /* IANA */ "ANSI_X3.4-1986", /* IANA */ "CP367", /* IANA */ "IBM367", /* IANA */ "US", /* IANA */ "csASCII", /* IANA */ /*"ISO646.1991-IRV", X11R6.4 */ ), ascii, { ascii_mbtowc, NULL }, { ascii_wctomb, NULL }) #ifdef USE_SOLARIS_ALIASES DEFALIAS( "646", /* Solaris */ ascii) #endif /* General multi-byte encodings */ DEFENCODING(( "UTF-8", /* IANA, RFC 2279 */ /*"UTF8", JDK 1.1 */ /*"CP65001", Windows */ ), utf8, { utf8_mbtowc, NULL }, { utf8_wctomb, NULL }) #ifdef USE_HPUX_ALIASES DEFALIAS( "UTF8", /* HP-UX */ utf8) #endif DEFENCODING(( "UCS-2", /* glibc */ "ISO-10646-UCS-2", /* IANA */ "csUnicode", /* IANA */ ), ucs2, { ucs2_mbtowc, NULL }, { ucs2_wctomb, NULL }) DEFENCODING(( "UCS-2BE", /* glibc */ "UNICODEBIG", /* glibc */ "UNICODE-1-1", /* IANA */ "csUnicode11", /* IANA */ /*"CP1201", Windows */ ), ucs2be, { ucs2be_mbtowc, NULL }, { ucs2be_wctomb, NULL }) DEFENCODING(( "UCS-2LE", /* glibc */ "UNICODELITTLE", /* glibc */ /*"CP1200", Windows */ ), ucs2le, { ucs2le_mbtowc, NULL }, { ucs2le_wctomb, NULL }) DEFENCODING(( "UCS-4", /* glibc */ "ISO-10646-UCS-4", /* IANA */ "csUCS4", /* IANA */ ), ucs4, { ucs4_mbtowc, NULL }, { ucs4_wctomb, NULL }) DEFENCODING(( "UCS-4BE", /* glibc */ /*"CP12001", Windows */ ), ucs4be, { ucs4be_mbtowc, NULL }, { ucs4be_wctomb, NULL }) DEFENCODING(( "UCS-4LE", /* glibc */ /*"CP12000", Windows */ ), ucs4le, { ucs4le_mbtowc, NULL }, { ucs4le_wctomb, NULL }) DEFENCODING(( "UTF-16", /* IANA, RFC 2781 */ ), utf16, { utf16_mbtowc, NULL }, { utf16_wctomb, NULL }) DEFENCODING(( "UTF-16BE", /* IANA, RFC 2781 */ ), utf16be, { utf16be_mbtowc, NULL }, { utf16be_wctomb, NULL }) DEFENCODING(( "UTF-16LE", /* IANA, RFC 2781 */ ), utf16le, { utf16le_mbtowc, NULL }, { utf16le_wctomb, NULL }) DEFENCODING(( "UTF-32", /* IANA, Unicode 3.1 */ ), utf32, { utf32_mbtowc, NULL }, { utf32_wctomb, NULL }) DEFENCODING(( "UTF-32BE", /* IANA, Unicode 3.1 */ ), utf32be, { utf32be_mbtowc, NULL }, { utf32be_wctomb, NULL }) DEFENCODING(( "UTF-32LE", /* IANA, Unicode 3.1 */ ), utf32le, { utf32le_mbtowc, NULL }, { utf32le_wctomb, NULL }) DEFENCODING(( "UTF-7", /* IANA, RFC 2152 */ "UNICODE-1-1-UTF-7", /* IANA, RFC 1642 */ "csUnicode11UTF7", /* IANA */ /*"CP65000", Windows */ ), utf7, { utf7_mbtowc, NULL }, { utf7_wctomb, utf7_reset }) DEFENCODING(( "UCS-2-INTERNAL", /* libiconv */ ), ucs2internal, { ucs2internal_mbtowc, NULL }, { ucs2internal_wctomb, NULL }) DEFENCODING(( "UCS-2-SWAPPED", /* libiconv */ ), ucs2swapped, { ucs2swapped_mbtowc, NULL }, { ucs2swapped_wctomb, NULL }) DEFENCODING(( "UCS-4-INTERNAL", /* libiconv */ ), ucs4internal, { ucs4internal_mbtowc, NULL },{ ucs4internal_wctomb, NULL }) DEFENCODING(( "UCS-4-SWAPPED", /* libiconv */ ), ucs4swapped, { ucs4swapped_mbtowc, NULL }, { ucs4swapped_wctomb, NULL }) DEFENCODING(( "C99", ), c99, { c99_mbtowc, NULL }, { c99_wctomb, NULL }) DEFENCODING(( "JAVA", ), java, { java_mbtowc, NULL }, { java_wctomb, NULL }) /* Standard 8-bit encodings */ DEFENCODING(( "ISO-8859-1", /* IANA */ "ISO_8859-1", /* IANA */ "ISO_8859-1:1987", /* IANA */ "ISO-IR-100", /* IANA */ "CP819", /* IANA */ "IBM819", /* IANA */ "LATIN1", /* IANA */ "L1", /* IANA */ "csISOLatin1", /* IANA */ "ISO8859-1", /* X11R6.4, glibc, FreeBSD, AIX, IRIX, OSF/1, Solaris */ /*"ISO8859_1", JDK 1.1 */ /*"CP28591", Windows */ ), iso8859_1, { iso8859_1_mbtowc, NULL }, { iso8859_1_wctomb, NULL }) #ifdef USE_HPUX_ALIASES DEFALIAS( "ISO88591", /* HP-UX */ iso8859_1) #endif DEFENCODING(( "ISO-8859-2", /* IANA */ "ISO_8859-2", /* IANA */ "ISO_8859-2:1987", /* IANA */ "ISO-IR-101", /* IANA */ "LATIN2", /* IANA */ "L2", /* IANA */ "csISOLatin2", /* IANA */ "ISO8859-2", /* X11R6.4, glibc, FreeBSD, AIX, IRIX, OSF/1, Solaris */ /*"ISO8859_2", JDK 1.1 */ /*"CP28592", Windows */ ), iso8859_2, { iso8859_2_mbtowc, NULL }, { iso8859_2_wctomb, NULL }) #ifdef USE_HPUX_ALIASES DEFALIAS( "ISO88592", /* HP-UX */ iso8859_2) #endif DEFENCODING(( "ISO-8859-3", /* IANA */ "ISO_8859-3", /* IANA */ "ISO_8859-3:1988", /* IANA */ "ISO-IR-109", /* IANA */ "LATIN3", /* IANA */ "L3", /* IANA */ "csISOLatin3", /* IANA */ "ISO8859-3", /* X11R6.4, glibc, FreeBSD, Solaris */ /*"ISO8859_3", JDK 1.1 */ /*"CP28593", Windows */ ), iso8859_3, { iso8859_3_mbtowc, NULL }, { iso8859_3_wctomb, NULL }) DEFENCODING(( "ISO-8859-4", /* IANA */ "ISO_8859-4", /* IANA */ "ISO_8859-4:1988", /* IANA */ "ISO-IR-110", /* IANA */ "LATIN4", /* IANA */ "L4", /* IANA */ "csISOLatin4", /* IANA */ "ISO8859-4", /* X11R6.4, glibc, FreeBSD, OSF/1, Solaris */ /*"ISO8859_4", JDK 1.1 */ /*"CP28594", Windows */ ), iso8859_4, { iso8859_4_mbtowc, NULL }, { iso8859_4_wctomb, NULL }) DEFENCODING(( "ISO-8859-5", /* IANA */ "ISO_8859-5", /* IANA */ "ISO_8859-5:1988", /* IANA */ "ISO-IR-144", /* IANA */ "CYRILLIC", /* IANA */ "csISOLatinCyrillic", /* IANA */ "ISO8859-5", /* X11R6.4, glibc, FreeBSD, AIX, IRIX, OSF/1, Solaris */ /*"ISO8859_5", JDK 1.1 */ /*"CP28595", Windows */ ), iso8859_5, { iso8859_5_mbtowc, NULL }, { iso8859_5_wctomb, NULL }) #ifdef USE_HPUX_ALIASES DEFALIAS( "ISO88595", /* HP-UX */ iso8859_5) #endif DEFENCODING(( "ISO-8859-6", /* IANA */ "ISO_8859-6", /* IANA */ "ISO_8859-6:1987", /* IANA */ "ISO-IR-127", /* IANA */ "ECMA-114", /* IANA */ "ASMO-708", /* IANA */ "ARABIC", /* IANA */ "csISOLatinArabic", /* IANA */ "ISO8859-6", /* X11R6.4, glibc, FreeBSD, AIX, Solaris */ /*"ISO8859_6", JDK 1.1 */ /*"CP28596", Windows */ ), iso8859_6, { iso8859_6_mbtowc, NULL }, { iso8859_6_wctomb, NULL }) #ifdef USE_HPUX_ALIASES DEFALIAS( "ISO88596", /* HP-UX */ iso8859_6) #endif DEFENCODING(( "ISO-8859-7", /* IANA, RFC 1947 */ "ISO_8859-7", /* IANA */ "ISO_8859-7:1987", /* IANA */ "ISO_8859-7:2003", "ISO-IR-126", /* IANA */ "ECMA-118", /* IANA */ "ELOT_928", /* IANA */ "GREEK8", /* IANA */ "GREEK", /* IANA */ "csISOLatinGreek", /* IANA */ "ISO8859-7", /* X11R6.4, glibc, FreeBSD, AIX, IRIX, OSF/1, Solaris */ /*"ISO8859_7", JDK 1.1 */ /*"CP28597", Windows */ ), iso8859_7, { iso8859_7_mbtowc, NULL }, { iso8859_7_wctomb, NULL }) #ifdef USE_HPUX_ALIASES DEFALIAS( "ISO88597", /* HP-UX */ iso8859_7) #endif DEFENCODING(( "ISO-8859-8", /* IANA */ "ISO_8859-8", /* IANA */ "ISO_8859-8:1988", /* IANA */ "ISO-IR-138", /* IANA */ "HEBREW", /* IANA */ "csISOLatinHebrew", /* IANA */ "ISO8859-8", /* X11R6.4, glibc, FreeBSD, AIX, OSF/1, Solaris */ /*"ISO8859_8", JDK 1.1 */ /*"CP28598", Windows */ /*"CP38598", Windows */ ), iso8859_8, { iso8859_8_mbtowc, NULL }, { iso8859_8_wctomb, NULL }) #ifdef USE_HPUX_ALIASES DEFALIAS( "ISO88598", /* HP-UX */ iso8859_8) #endif DEFENCODING(( "ISO-8859-9", /* IANA */ "ISO_8859-9", /* IANA */ "ISO_8859-9:1989", /* IANA */ "ISO-IR-148", /* IANA */ "LATIN5", /* IANA */ "L5", /* IANA */ "csISOLatin5", /* IANA */ "ISO8859-9", /* X11R6.4, glibc, FreeBSD, AIX, IRIX, OSF/1, Solaris */ /*"ISO8859_9", JDK 1.1 */ /*"CP28599", Windows */ ), iso8859_9, { iso8859_9_mbtowc, NULL }, { iso8859_9_wctomb, NULL }) #ifdef USE_HPUX_ALIASES DEFALIAS( "ISO88599", /* HP-UX */ iso8859_9) #endif DEFENCODING(( "ISO-8859-10", /* IANA */ "ISO_8859-10", "ISO_8859-10:1992", /* IANA */ "ISO-IR-157", /* IANA */ "LATIN6", /* IANA */ "L6", /* IANA */ "csISOLatin6", /* IANA */ "ISO8859-10", /* X11R6.4, glibc, FreeBSD */ ), iso8859_10, { iso8859_10_mbtowc, NULL }, { iso8859_10_wctomb, NULL }) DEFENCODING(( "ISO-8859-11", /* glibc */ "ISO_8859-11", "ISO8859-11", /* X11R6.7, glibc */ ), iso8859_11, { iso8859_11_mbtowc, NULL }, { iso8859_11_wctomb, NULL }) DEFENCODING(( "ISO-8859-13", /* IANA, glibc */ "ISO_8859-13", "ISO-IR-179", /* glibc */ "LATIN7", /* glibc */ "L7", /* glibc */ "ISO8859-13", /* glibc, FreeBSD */ ), iso8859_13, { iso8859_13_mbtowc, NULL }, { iso8859_13_wctomb, NULL }) #ifdef USE_AIX_ALIASES DEFALIAS( "IBM-921", /* AIX */ iso8859_13) #endif DEFENCODING(( "ISO-8859-14", /* IANA, glibc */ "ISO_8859-14", /* IANA */ "ISO_8859-14:1998", /* IANA, glibc */ "ISO-IR-199", /* IANA */ "LATIN8", /* IANA, glibc */ "L8", /* IANA, glibc */ "ISO-CELTIC", /* IANA */ "ISO8859-14", /* glibc, FreeBSD */ ), iso8859_14, { iso8859_14_mbtowc, NULL }, { iso8859_14_wctomb, NULL }) DEFENCODING(( "ISO-8859-15", /* IANA, glibc */ "ISO_8859-15", /* IANA */ "ISO_8859-15:1998", /* glibc */ "ISO-IR-203", "LATIN-9", /* IANA */ "ISO8859-15", /* glibc, FreeBSD, AIX, OSF/1, Solaris */ /*"CP28605", Windows */ ), iso8859_15, { iso8859_15_mbtowc, NULL }, { iso8859_15_wctomb, NULL }) #ifdef USE_HPUX_ALIASES DEFALIAS( "ISO885915", /* HP-UX */ iso8859_15) #endif DEFENCODING(( "ISO-8859-16", /* IANA */ "ISO_8859-16", /* IANA */ "ISO_8859-16:2001", /* IANA */ "ISO-IR-226", /* IANA */ "LATIN10", /* IANA */ "L10", /* IANA */ "ISO8859-16", /* glibc, FreeBSD */ ), iso8859_16, { iso8859_16_mbtowc, NULL }, { iso8859_16_wctomb, NULL }) DEFENCODING(( "KOI8-R", /* IANA, RFC 1489, X11R6.4, JDK 1.1 */ "csKOI8R", /* IANA */ /*"CP20866", Windows */ ), koi8_r, { koi8_r_mbtowc, NULL }, { koi8_r_wctomb, NULL }) DEFENCODING(( "KOI8-U", /* IANA, RFC 2319 */ ), koi8_u, { koi8_u_mbtowc, NULL }, { koi8_u_wctomb, NULL }) DEFENCODING(( "KOI8-RU", ), koi8_ru, { koi8_ru_mbtowc, NULL }, { koi8_ru_wctomb, NULL }) /* Windows 8-bit encodings */ DEFENCODING(( "CP1250", /* JDK 1.1 */ "WINDOWS-1250", /* IANA */ "MS-EE", ), cp1250, { cp1250_mbtowc, NULL }, { cp1250_wctomb, NULL }) DEFENCODING(( "CP1251", /* JDK 1.1 */ "WINDOWS-1251", /* IANA */ "MS-CYRL", ), cp1251, { cp1251_mbtowc, NULL }, { cp1251_wctomb, NULL }) #ifdef USE_SOLARIS_ALIASES DEFALIAS( "ANSI-1251", /* Solaris */ cp1251) #endif DEFENCODING(( "CP1252", /* JDK 1.1 */ "WINDOWS-1252", /* IANA */ "MS-ANSI", ), cp1252, { cp1252_mbtowc, NULL }, { cp1252_wctomb, NULL }) #ifdef USE_AIX_ALIASES DEFALIAS( "IBM-1252", /* AIX */ cp1252) #endif DEFENCODING(( "CP1253", /* JDK 1.1 */ "WINDOWS-1253", /* IANA */ "MS-GREEK", ), cp1253, { cp1253_mbtowc, NULL }, { cp1253_wctomb, NULL }) DEFENCODING(( "CP1254", /* JDK 1.1 */ "WINDOWS-1254", /* IANA */ "MS-TURK", ), cp1254, { cp1254_mbtowc, NULL }, { cp1254_wctomb, NULL }) DEFENCODING(( "CP1255", /* JDK 1.1 */ "WINDOWS-1255", /* IANA */ "MS-HEBR", ), cp1255, { cp1255_mbtowc, cp1255_flushwc }, { cp1255_wctomb, NULL }) DEFENCODING(( "CP1256", /* JDK 1.1 */ "WINDOWS-1256", /* IANA */ "MS-ARAB", ), cp1256, { cp1256_mbtowc, NULL }, { cp1256_wctomb, NULL }) DEFENCODING(( "CP1257", /* JDK 1.1 */ "WINDOWS-1257", /* IANA */ "WINBALTRIM", ), cp1257, { cp1257_mbtowc, NULL }, { cp1257_wctomb, NULL }) DEFENCODING(( "CP1258", /* JDK 1.1 */ "WINDOWS-1258", /* IANA */ ), cp1258, { cp1258_mbtowc, cp1258_flushwc }, { cp1258_wctomb, NULL }) /* DOS 8-bit encodings */ DEFENCODING(( "CP850", /* IANA, JDK 1.1 */ "IBM850", /* IANA */ "850", /* IANA */ "csPC850Multilingual", /* IANA */ ), cp850, { cp850_mbtowc, NULL }, { cp850_wctomb, NULL }) #ifdef USE_AIX_ALIASES DEFALIAS( "IBM-850", /* AIX */ cp850) #endif DEFENCODING(( "CP862", /* IANA, JDK 1.1 */ "IBM862", /* IANA */ "862", /* IANA */ "csPC862LatinHebrew", /* IANA */ ), cp862, { cp862_mbtowc, NULL }, { cp862_wctomb, NULL }) DEFENCODING(( "CP866", /* IANA, JDK 1.1 */ "IBM866", /* IANA */ "866", /* IANA */ "csIBM866", /* IANA */ ), cp866, { cp866_mbtowc, NULL }, { cp866_wctomb, NULL }) DEFENCODING(( "CP1131", /* FreeBSD, MacOS X */ ), cp1131, { cp1131_mbtowc, NULL }, { cp1131_wctomb, NULL }) #ifdef USE_AIX_ALIASES DEFALIAS( "IBM-1131", /* AIX */ cp1131) #endif /* Macintosh 8-bit encodings */ DEFENCODING(( "MacRoman", /* JDK 1.1 */ /* This is the best table for MACINTOSH. The ones */ /* in glibc and FreeBSD-iconv are bad quality. */ "MACINTOSH", /* IANA */ "MAC", /* IANA */ "csMacintosh", /* IANA */ /*"CP10000", Windows */ ), mac_roman, { mac_roman_mbtowc, NULL }, { mac_roman_wctomb, NULL }) DEFENCODING(( "MacCentralEurope", /* JDK 1.1 */ /*"CP10029", Windows */ ), mac_centraleurope, { mac_centraleurope_mbtowc, NULL }, { mac_centraleurope_wctomb, NULL }) DEFENCODING(( "MacIceland", /* JDK 1.1 */ /*"CP10079", Windows */ ), mac_iceland, { mac_iceland_mbtowc, NULL }, { mac_iceland_wctomb, NULL }) DEFENCODING(( "MacCroatian", /* JDK 1.1 */ /*"CP10082", Windows */ ), mac_croatian, { mac_croatian_mbtowc, NULL }, { mac_croatian_wctomb, NULL }) DEFENCODING(( "MacRomania", /* JDK 1.1 */ /*"CP10010", Windows */ ), mac_romania, { mac_romania_mbtowc, NULL }, { mac_romania_wctomb, NULL }) DEFENCODING(( "MacCyrillic", /* JDK 1.1 */ /*"CP10007", Windows */ ), mac_cyrillic, { mac_cyrillic_mbtowc, NULL }, { mac_cyrillic_wctomb, NULL }) DEFENCODING(( "MacUkraine", /* JDK 1.1 */ /*"CP10017", Windows */ ), mac_ukraine, { mac_ukraine_mbtowc, NULL }, { mac_ukraine_wctomb, NULL }) DEFENCODING(( "MacGreek", /* JDK 1.1 */ /*"CP10006", Windows */ ), mac_greek, { mac_greek_mbtowc, NULL }, { mac_greek_wctomb, NULL }) DEFENCODING(( "MacTurkish", /* JDK 1.1 */ /*"CP10081", Windows */ ), mac_turkish, { mac_turkish_mbtowc, NULL }, { mac_turkish_wctomb, NULL }) DEFENCODING(( "MacHebrew", /* JDK 1.1 */ /*"CP10005", Windows */ ), mac_hebrew, { mac_hebrew_mbtowc, NULL }, { mac_hebrew_wctomb, NULL }) DEFENCODING(( "MacArabic", /* JDK 1.1 */ /*"CP10004", Windows */ ), mac_arabic, { mac_arabic_mbtowc, NULL }, { mac_arabic_wctomb, NULL }) DEFENCODING(( "MacThai", /* JDK 1.1 */ /*"CP10021", Windows */ ), mac_thai, { mac_thai_mbtowc, NULL }, { mac_thai_wctomb, NULL }) /* Other platform specific 8-bit encodings */ DEFENCODING(( "HP-ROMAN8", /* IANA, X11R6.4 */ "ROMAN8", /* IANA */ "R8", /* IANA */ "csHPRoman8", /* IANA */ ), hp_roman8, { hp_roman8_mbtowc, NULL }, { hp_roman8_wctomb, NULL }) DEFENCODING(( "NEXTSTEP", ), nextstep, { nextstep_mbtowc, NULL }, { nextstep_wctomb, NULL }) /* Regional 8-bit encodings used for a single language */ DEFENCODING(( "ARMSCII-8", ), armscii_8, { armscii_8_mbtowc, NULL }, { armscii_8_wctomb, NULL }) DEFENCODING(( "GEORGIAN-ACADEMY", ), georgian_academy, { georgian_academy_mbtowc, NULL }, { georgian_academy_wctomb, NULL }) DEFENCODING(( "GEORGIAN-PS", ), georgian_ps, { georgian_ps_mbtowc, NULL }, { georgian_ps_wctomb, NULL }) DEFENCODING(( "KOI8-T", ), koi8_t, { koi8_t_mbtowc, NULL }, { koi8_t_wctomb, NULL }) DEFENCODING(( "PT154", /* IANA, glibc */ "PTCP154", /* IANA */ "CP154", /* IANA */ "CYRILLIC-ASIAN", /* IANA */ "csPTCP154", /* IANA */ ), pt154, { pt154_mbtowc, NULL }, { pt154_wctomb, NULL }) DEFENCODING(( "RK1048", /* IANA, glibc */ "STRK1048-2002", /* IANA */ "KZ-1048", /* IANA */ "csKZ1048", /* IANA */ ), rk1048, { rk1048_mbtowc, NULL }, { rk1048_wctomb, NULL }) DEFENCODING(( "MULELAO-1", ), mulelao, { mulelao_mbtowc, NULL }, { mulelao_wctomb, NULL }) DEFENCODING(( "CP1133", "IBM-CP1133", ), cp1133, { cp1133_mbtowc, NULL }, { cp1133_wctomb, NULL }) DEFENCODING(( "TIS-620", /* IANA */ "TIS620", /* glibc, HP-UX */ "TIS620-0", /* glibc */ "TIS620.2529-1", /* glibc */ "TIS620.2533-0", /* glibc */ "TIS620.2533-1", "ISO-IR-166", /* glibc */ ), tis620, { tis620_mbtowc, NULL }, { tis620_wctomb, NULL }) #ifdef USE_OSF1_ALIASES DEFALIAS( "TACTIS", /* OSF/1 */ tis620) #endif #ifdef USE_SOLARIS_ALIASES DEFALIAS( "TIS620.2533", /* Solaris */ tis620) #endif DEFENCODING(( "CP874", /* JDK 1.1 */ "WINDOWS-874", ), cp874, { cp874_mbtowc, NULL }, { cp874_wctomb, NULL }) DEFENCODING(( "VISCII", /* IANA, RFC 1456 */ "VISCII1.1-1", "csVISCII", /* IANA */ ), viscii, { viscii_mbtowc, NULL }, { viscii_wctomb, NULL }) DEFENCODING(( "TCVN", "TCVN-5712", "TCVN5712-1", "TCVN5712-1:1993", ), tcvn, { tcvn_mbtowc, tcvn_flushwc }, { tcvn_wctomb, NULL }) /* CJK character sets (not documented) */ DEFENCODING(( "JIS_C6220-1969-RO", /* IANA */ "ISO646-JP", /* IANA */ "ISO-IR-14", /* IANA */ "JP", /* IANA */ "csISO14JISC6220ro", /* IANA */ ), iso646_jp, { iso646_jp_mbtowc, NULL }, { iso646_jp_wctomb, NULL }) DEFENCODING(( "JIS_X0201", /* IANA */ "JISX0201-1976", "X0201", /* IANA */ "csHalfWidthKatakana", /* IANA */ /*"JISX0201.1976-0", X11R6.4 */ /*"JIS0201", JDK 1.1 */ ), jisx0201, { jisx0201_mbtowc, NULL }, { jisx0201_wctomb, NULL }) DEFENCODING(( "JIS_X0208", "JIS_X0208-1983", /* IANA */ "JIS_X0208-1990", "JIS0208", "X0208", /* IANA */ "ISO-IR-87", /* IANA */ "JIS_C6226-1983", /* IANA */ "csISO87JISX0208", /* IANA */ /*"JISX0208.1983-0", X11R6.4 */ /*"JISX0208.1990-0", X11R6.4 */ /*"JIS0208", JDK 1.1 */ ), jisx0208, { jisx0208_mbtowc, NULL }, { jisx0208_wctomb, NULL }) DEFENCODING(( "JIS_X0212", "JIS_X0212.1990-0", "JIS_X0212-1990", /* IANA */ "X0212", /* IANA */ "ISO-IR-159", /* IANA */ "csISO159JISX02121990", /* IANA */ /*"JISX0212.1990-0", X11R6.4 */ /*"JIS0212", JDK 1.1 */ ), jisx0212, { jisx0212_mbtowc, NULL }, { jisx0212_wctomb, NULL }) DEFENCODING(( "GB_1988-80", /* IANA */ "ISO646-CN", /* IANA */ "ISO-IR-57", /* IANA */ "CN", /* IANA */ "csISO57GB1988", /* IANA */ ), iso646_cn, { iso646_cn_mbtowc, NULL }, { iso646_cn_wctomb, NULL }) DEFENCODING(( "GB_2312-80", /* IANA */ "ISO-IR-58", /* IANA */ "csISO58GB231280", /* IANA */ "CHINESE", /* IANA */ /*"GB2312.1980-0", X11R6.4 */ ), gb2312, { gb2312_mbtowc, NULL }, { gb2312_wctomb, NULL }) DEFENCODING(( "ISO-IR-165", "CN-GB-ISOIR165", /* RFC 1922 */ ), isoir165, { isoir165_mbtowc, NULL }, { isoir165_wctomb, NULL }) DEFENCODING(( "KSC_5601", /* IANA */ "KS_C_5601-1987", /* IANA */ "KS_C_5601-1989", /* IANA */ "ISO-IR-149", /* IANA */ "csKSC56011987", /* IANA */ "KOREAN", /* IANA */ /*"KSC5601.1987-0", X11R6.4 */ /*"KSX1001:1992", Ken Lunde */ ), ksc5601, { ksc5601_mbtowc, NULL }, { ksc5601_wctomb, NULL }) /* CJK encodings */ DEFENCODING(( "EUC-JP", /* IANA */ "EUCJP", /* glibc, HP-UX, IRIX, OSF/1, Solaris */ "Extended_UNIX_Code_Packed_Format_for_Japanese", /* IANA */ "csEUCPkdFmtJapanese", /* IANA */ /*"EUC_JP", JDK 1.1 */ /*"CP51932", Windows */ ), euc_jp, { euc_jp_mbtowc, NULL }, { euc_jp_wctomb, NULL }) #ifdef USE_AIX_ALIASES DEFALIAS( "IBM-EUCJP", /* AIX */ euc_jp) #endif #ifdef USE_OSF1_ALIASES DEFALIAS( "SDECKANJI", /* OSF/1 */ euc_jp) #endif DEFENCODING(( "SHIFT_JIS", /* IANA */ "SHIFT-JIS", /* glibc */ "SJIS", /* JDK 1.1, HP-UX, OSF/1 */ "MS_KANJI", /* IANA */ "csShiftJIS", /* IANA */ ), sjis, { sjis_mbtowc, NULL }, { sjis_wctomb, NULL }) #ifdef USE_SOLARIS_ALIASES DEFALIAS( "PCK", /* Solaris */ sjis) #endif DEFENCODING(( "CP932", /* glibc */ ), cp932, { cp932_mbtowc, NULL }, { cp932_wctomb, NULL }) #ifdef USE_AIX_ALIASES DEFALIAS( "IBM-932", /* AIX */ cp932) #endif DEFENCODING(( "ISO-2022-JP", /* IANA, RFC 1468 */ "csISO2022JP", /* IANA */ /*"ISO2022JP", JDK 1.1 */ ), iso2022_jp, { iso2022_jp_mbtowc, NULL }, { iso2022_jp_wctomb, iso2022_jp_reset }) DEFENCODING(( "ISO-2022-JP-1", /* RFC 2237 */ ), iso2022_jp1, { iso2022_jp1_mbtowc, NULL }, { iso2022_jp1_wctomb, iso2022_jp1_reset }) DEFENCODING(( "ISO-2022-JP-2", /* IANA, RFC 1554 */ "csISO2022JP2", /* IANA */ ), iso2022_jp2, { iso2022_jp2_mbtowc, NULL }, { iso2022_jp2_wctomb, iso2022_jp2_reset }) DEFENCODING(( "EUC-CN", /* glibc */ "EUCCN", /* glibc, IRIX */ "GB2312", /* IANA */ "CN-GB", /* RFC 1922 */ "csGB2312", /* IANA */ /*"EUC_CN", JDK 1.1 */ /*"CP51936", Windows */ ), euc_cn, { euc_cn_mbtowc, NULL }, { euc_cn_wctomb, NULL }) #ifdef USE_AIX_ALIASES DEFALIAS( "IBM-EUCCN", /* AIX */ euc_cn) #endif #ifdef USE_HPUX_ALIASES DEFALIAS( "HP15CN", /* HP-UX */ euc_cn) #endif #ifdef USE_OSF1_ALIASES DEFALIAS( "DECHANZI", /* OSF/1 */ euc_cn) #endif DEFENCODING(( "GBK", /* IANA, JDK 1.1 */ ), ces_gbk, { ces_gbk_mbtowc, NULL }, { ces_gbk_wctomb, NULL }) DEFENCODING(( "CP936", /* IANA */ "MS936", /* IANA */ "WINDOWS-936", /* IANA */ ), cp936, { cp936_mbtowc, NULL }, { cp936_wctomb, NULL }) DEFENCODING(( "GB18030", /* IANA, glibc */ /*"CP54936", Windows */ ), gb18030, { gb18030_mbtowc, NULL }, { gb18030_wctomb, NULL }) DEFENCODING(( "ISO-2022-CN", /* IANA, RFC 1922 */ "csISO2022CN", /*"ISO2022CN", JDK 1.1 */ ), iso2022_cn, { iso2022_cn_mbtowc, NULL }, { iso2022_cn_wctomb, iso2022_cn_reset }) DEFENCODING(( "ISO-2022-CN-EXT", /* IANA, RFC 1922 */ ), iso2022_cn_ext, { iso2022_cn_ext_mbtowc, NULL }, { iso2022_cn_ext_wctomb, iso2022_cn_ext_reset }) DEFENCODING(( "HZ", /* RFC 1843 */ "HZ-GB-2312", /* IANA, RFC 1842 */ ), hz, { hz_mbtowc, NULL }, { hz_wctomb, hz_reset }) DEFENCODING(( "EUC-TW", /* glibc */ "EUCTW", /* glibc, HP-UX, IRIX, OSF/1 */ "csEUCTW", /*"EUC_TW", JDK 1.1 */ /*"CP51950", Windows */ ), euc_tw, { euc_tw_mbtowc, NULL }, { euc_tw_wctomb, NULL }) #ifdef USE_AIX_ALIASES DEFALIAS( "IBM-EUCTW", /* AIX */ euc_tw) #endif #ifdef USE_SOLARIS_ALIASES DEFALIAS( "CNS11643", /* Solaris */ euc_tw) #endif DEFENCODING(( "BIG5", /* IANA, JDK 1.1 */ "BIG-5", /* glibc */ "BIG-FIVE", /* glibc */ "BIGFIVE", /* glibc */ "CN-BIG5", /* RFC 1922 */ "csBig5", /* IANA */ ), ces_big5, { ces_big5_mbtowc, NULL }, { ces_big5_wctomb, NULL }) DEFENCODING(( "CP950", /* JDK 1.1 */ ), cp950, { cp950_mbtowc, NULL }, { cp950_wctomb, NULL }) DEFENCODING(( "BIG5-HKSCS:1999", ), big5hkscs1999, { big5hkscs1999_mbtowc, big5hkscs1999_flushwc }, { big5hkscs1999_wctomb, big5hkscs1999_reset }) DEFENCODING(( "BIG5-HKSCS:2001", ), big5hkscs2001, { big5hkscs2001_mbtowc, big5hkscs2001_flushwc }, { big5hkscs2001_wctomb, big5hkscs2001_reset }) DEFENCODING(( "BIG5-HKSCS:2004", ), big5hkscs2004, { big5hkscs2004_mbtowc, big5hkscs2004_flushwc }, { big5hkscs2004_wctomb, big5hkscs2004_reset }) DEFENCODING(( "BIG5-HKSCS", /* IANA */ "BIG5HKSCS", /* glibc */ "BIG5-HKSCS:2008", ), big5hkscs2008, { big5hkscs2008_mbtowc, big5hkscs2008_flushwc }, { big5hkscs2008_wctomb, big5hkscs2008_reset }) DEFENCODING(( "EUC-KR", /* IANA, RFC 1557 */ "EUCKR", /* glibc, HP-UX, IRIX, OSF/1 */ "csEUCKR", /* IANA */ /*"EUC_KR", JDK 1.1 */ /*"CP51949", Windows */ ), euc_kr, { euc_kr_mbtowc, NULL }, { euc_kr_wctomb, NULL }) #ifdef USE_AIX_ALIASES DEFALIAS( "IBM-EUCKR", /* AIX */ euc_kr) #endif #ifdef USE_OSF1_ALIASES DEFALIAS( "DECKOREAN", /* OSF/1 */ euc_kr) #endif #ifdef USE_SOLARIS_ALIASES DEFALIAS( "5601", /* Solaris */ euc_kr) #endif DEFENCODING(( "CP949", /* JDK 1.1 */ "UHC", /* glibc */ ), cp949, { cp949_mbtowc, NULL }, { cp949_wctomb, NULL }) #ifdef USE_OSF1_ALIASES DEFALIAS( "KSC5601", /* OSF/1 */ cp949) #endif DEFENCODING(( "JOHAB", /* glibc */ "CP1361", /* glibc */ ), johab, { johab_mbtowc, NULL }, { johab_wctomb, NULL }) #ifdef USE_SOLARIS_ALIASES DEFALIAS( "KO_KR.JOHAP92", /* Solaris */ johab) #endif DEFENCODING(( "ISO-2022-KR", /* IANA, RFC 1557 */ "csISO2022KR", /* IANA */ /*"ISO2022KR", JDK 1.1 */ ), iso2022_kr, { iso2022_kr_mbtowc, NULL }, { iso2022_kr_wctomb, iso2022_kr_reset }) freelan-2.0/third-party/source/libiconv-msvc/include/encodings_aix.def000066400000000000000000000061531252300335000262240ustar00rootroot00000000000000/* Copyright (C) 2000-2002, 2008 Free Software Foundation, Inc. This file is part of the GNU LIBICONV Library. The GNU LIBICONV Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU LIBICONV 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU LIBICONV Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Encodings used by system dependent locales on AIX. */ DEFENCODING(( "CP856", ), cp856, { cp856_mbtowc, NULL }, { cp856_wctomb, NULL }) #ifdef USE_AIX_ALIASES DEFALIAS( "IBM-856", /* AIX */ cp856) #endif DEFENCODING(( "CP922", ), cp922, { cp922_mbtowc, NULL }, { cp922_wctomb, NULL }) #ifdef USE_AIX_ALIASES DEFALIAS( "IBM-922", /* AIX */ cp922) #endif DEFENCODING(( "CP943", ), cp943, { cp943_mbtowc, NULL }, { cp943_wctomb, NULL }) #ifdef USE_AIX_ALIASES DEFALIAS( "IBM-943", /* AIX */ cp943) #endif DEFENCODING(( "CP1046", ), cp1046, { cp1046_mbtowc, NULL }, { cp1046_wctomb, NULL }) #ifdef USE_AIX_ALIASES DEFALIAS( "IBM-1046", /* AIX */ cp1046) #endif DEFENCODING(( "CP1124", ), cp1124, { cp1124_mbtowc, NULL }, { cp1124_wctomb, NULL }) #ifdef USE_AIX_ALIASES DEFALIAS( "IBM-1124", /* AIX */ cp1124) #endif DEFENCODING(( "CP1129", ), cp1129, { cp1129_mbtowc, NULL }, { cp1129_wctomb, NULL }) #ifdef USE_AIX_ALIASES DEFALIAS( "IBM-1129", /* AIX */ cp1129) #endif DEFENCODING(( "CP1161", "IBM1161", /* glibc */ "IBM-1161", /* glibc */ "csIBM1161", /* glibc */ ), cp1161, { cp1161_mbtowc, NULL }, { cp1161_wctomb, NULL }) DEFENCODING(( "CP1162", "IBM1162", /* glibc */ "IBM-1162", /* glibc */ "csIBM1162", /* glibc */ ), cp1162, { cp1162_mbtowc, NULL }, { cp1162_wctomb, NULL }) DEFENCODING(( "CP1163", "IBM1163", /* glibc */ "IBM-1163", /* glibc */ "csIBM1163", /* glibc */ ), cp1163, { cp1163_mbtowc, NULL }, { cp1163_wctomb, NULL }) freelan-2.0/third-party/source/libiconv-msvc/include/encodings_dos.def000066400000000000000000000116331252300335000262270ustar00rootroot00000000000000/* Copyright (C) 2001-2002 Free Software Foundation, Inc. This file is part of the GNU LIBICONV Library. The GNU LIBICONV Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU LIBICONV 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU LIBICONV Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Encodings used by system dependent locales on MSDOS. */ DEFENCODING(( "CP437", /* IANA, JDK 1.1 */ "IBM437", /* IANA */ "437", /* IANA */ "csPC8CodePage437", /* IANA */ ), cp437, { cp437_mbtowc, NULL }, { cp437_wctomb, NULL }) DEFENCODING(( "CP737", /* JDK 1.1 */ ), cp737, { cp737_mbtowc, NULL }, { cp737_wctomb, NULL }) DEFENCODING(( "CP775", /* IANA, JDK 1.1 */ "IBM775", /* IANA */ "csPC775Baltic", /* IANA */ ), cp775, { cp775_mbtowc, NULL }, { cp775_wctomb, NULL }) DEFENCODING(( "CP852", /* IANA, JDK 1.1 */ "IBM852", /* IANA */ "852", /* IANA */ "csPCp852", /* IANA */ ), cp852, { cp852_mbtowc, NULL }, { cp852_wctomb, NULL }) DEFENCODING(( "CP853", ), cp853, { cp853_mbtowc, NULL }, { cp853_wctomb, NULL }) DEFENCODING(( "CP855", /* IANA, JDK 1.1 */ "IBM855", /* IANA */ "855", /* IANA */ "csIBM855", /* IANA */ ), cp855, { cp855_mbtowc, NULL }, { cp855_wctomb, NULL }) DEFENCODING(( "CP857", /* IANA, JDK 1.1 */ "IBM857", /* IANA */ "857", /* IANA */ "csIBM857", /* IANA */ ), cp857, { cp857_mbtowc, NULL }, { cp857_wctomb, NULL }) DEFENCODING(( "CP858", /* JDK 1.1.7 */ ), cp858, { cp858_mbtowc, NULL }, { cp858_wctomb, NULL }) DEFENCODING(( "CP860", /* IANA, JDK 1.1 */ "IBM860", /* IANA */ "860", /* IANA */ "csIBM860", /* IANA */ ), cp860, { cp860_mbtowc, NULL }, { cp860_wctomb, NULL }) DEFENCODING(( "CP861", /* IANA, JDK 1.1 */ "IBM861", /* IANA */ "861", /* IANA */ "CP-IS", /* IANA */ "csIBM861", /* IANA */ ), cp861, { cp861_mbtowc, NULL }, { cp861_wctomb, NULL }) DEFENCODING(( "CP863", /* IANA, JDK 1.1 */ "IBM863", /* IANA */ "863", /* IANA */ "csIBM863", /* IANA */ ), cp863, { cp863_mbtowc, NULL }, { cp863_wctomb, NULL }) DEFENCODING(( "CP864", /* IANA, JDK 1.1 */ "IBM864", /* IANA */ "csIBM864", /* IANA */ ), cp864, { cp864_mbtowc, NULL }, { cp864_wctomb, NULL }) DEFENCODING(( "CP865", /* IANA, JDK 1.1 */ "IBM865", /* IANA */ "865", /* IANA */ "csIBM865", /* IANA */ ), cp865, { cp865_mbtowc, NULL }, { cp865_wctomb, NULL }) DEFENCODING(( "CP869", /* IANA, JDK 1.1 */ "IBM869", /* IANA */ "869", /* IANA */ "CP-GR", /* IANA */ "csIBM869", /* IANA */ ), cp869, { cp869_mbtowc, NULL }, { cp869_wctomb, NULL }) DEFENCODING(( "CP1125", /* ICU */ ), cp1125, { cp1125_mbtowc, NULL }, { cp1125_wctomb, NULL }) freelan-2.0/third-party/source/libiconv-msvc/include/encodings_extra.def000066400000000000000000000042371252300335000265670ustar00rootroot00000000000000/* Copyright (C) 2002, 2005, 2008 Free Software Foundation, Inc. This file is part of the GNU LIBICONV Library. The GNU LIBICONV Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU LIBICONV 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU LIBICONV Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ DEFENCODING(( "EUC-JISX0213", "EUC-JIS-2004", /* x0213.org */ ), euc_jisx0213, { euc_jisx0213_mbtowc, euc_jisx0213_flushwc }, { euc_jisx0213_wctomb, euc_jisx0213_reset }) DEFENCODING(( "SHIFT_JISX0213", "SHIFT_JIS-2004", /* x0213.org */ ), shift_jisx0213, { shift_jisx0213_mbtowc, shift_jisx0213_flushwc }, { shift_jisx0213_wctomb, shift_jisx0213_reset }) DEFENCODING(( "ISO-2022-JP-3", "ISO-2022-JP-2004", /* x0213.org */ ), iso2022_jp3, { iso2022_jp3_mbtowc, iso2022_jp3_flushwc }, { iso2022_jp3_wctomb, iso2022_jp3_reset }) DEFENCODING(( "BIG5-2003", ), big5_2003, { big5_2003_mbtowc, NULL }, { big5_2003_wctomb, NULL }) DEFENCODING(( "TDS565", "ISO-IR-230", ), tds565, { tds565_mbtowc, NULL }, { tds565_wctomb, NULL }) DEFENCODING(( "ATARIST", "ATARI", ), atarist, { atarist_mbtowc, NULL }, { atarist_wctomb, NULL }) DEFENCODING(( "RISCOS-LATIN1", ), riscos1, { riscos1_mbtowc, NULL }, { riscos1_wctomb, NULL }) freelan-2.0/third-party/source/libiconv-msvc/include/encodings_local.def000066400000000000000000000023221252300335000265270ustar00rootroot00000000000000/* Copyright (C) 2000-2001 Free Software Foundation, Inc. This file is part of the GNU LIBICONV Library. The GNU LIBICONV Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU LIBICONV 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU LIBICONV Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Names for locale dependent encodings. */ DEFENCODING(( "CHAR", ), local_char, { NULL, NULL }, { NULL, NULL }) DEFENCODING(( "WCHAR_T", /* glibc */ ), local_wchar_t, { NULL, NULL }, { NULL, NULL }) freelan-2.0/third-party/source/libiconv-msvc/include/encodings_osf1.def000066400000000000000000000027021252300335000263070ustar00rootroot00000000000000/* Copyright (C) 2001, 2008 Free Software Foundation, Inc. This file is part of the GNU LIBICONV Library. The GNU LIBICONV Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU LIBICONV 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU LIBICONV Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Encodings used by system dependent locales on OSF/1 a.k.a. Tru64. */ DEFENCODING(( "DEC-KANJI", ), dec_kanji, { dec_kanji_mbtowc, NULL }, { dec_kanji_wctomb, NULL }) #ifdef USE_OSF1_ALIASES DEFALIAS( "DECKANJI", /* OSF/1 */ dec_kanji) #endif DEFENCODING(( "DEC-HANYU", ), dec_hanyu, { dec_hanyu_mbtowc, NULL }, { dec_hanyu_wctomb, NULL }) #ifdef USE_OSF1_ALIASES DEFALIAS( "DECHANYU", /* OSF/1 */ dec_hanyu) #endif freelan-2.0/third-party/source/libiconv-msvc/include/euc_cn.h000066400000000000000000000037301252300335000243350ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * EUC-CN */ static int euc_cn_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; /* Code set 0 (ASCII or GB 1988-89) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (GB 2312-1980) */ if (c >= 0xa1 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if (c2 >= 0xa1 && c2 < 0xff) { unsigned char buf[2]; buf[0] = c-0x80; buf[1] = c2-0x80; return gb2312_mbtowc(conv,pwc,buf,2); } else return RET_ILSEQ; } } return RET_ILSEQ; } static int euc_cn_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; /* Code set 0 (ASCII or GB 1988-89) */ ret = ascii_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; /* Code set 1 (GB 2312-1980) */ ret = gb2312_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]+0x80; r[1] = buf[1]+0x80; return 2; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/euc_jisx0213.h000066400000000000000000000211051252300335000252140ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * EUC-JISX0213 */ /* The structure of EUC-JISX0213 is as follows: 0x00..0x7F: ASCII 0x8E{A1..FE}: JISX0201 Katakana, with prefix 0x8E, offset by +0x80. 0x8F{A1..FE}{A1..FE}: JISX0213 plane 2, with prefix 0x8F, offset by +0x8080. 0x{A1..FE}{A1..FE}: JISX0213 plane 1, offset by +0x8080. Note that some JISX0213 characters are not contained in Unicode 3.2 and are therefore best represented as sequences of Unicode characters. */ #include "jisx0213.h" #include "flushwc.h" static int euc_jisx0213_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { ucs4_t last_wc = conv->istate; if (last_wc) { /* Output the buffered character. */ conv->istate = 0; *pwc = last_wc; return 0; /* Don't advance the input pointer. */ } else { unsigned char c = *s; if (c < 0x80) { /* Plain ASCII character. */ *pwc = (ucs4_t) c; return 1; } else { if ((c >= 0xa1 && c <= 0xfe) || c == 0x8e || c == 0x8f) { /* Two or three byte character. */ if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0xa1 && c2 <= 0xfe) { if (c == 0x8e) { /* Half-width katakana. */ if (c2 <= 0xdf) { *pwc = c2 + 0xfec0; return 2; } } else { ucs4_t wc; if (c == 0x8f) { /* JISX 0213 plane 2. */ if (n >= 3) { unsigned char c3 = s[2]; wc = jisx0213_to_ucs4(0x200-0x80+c2,c3^0x80); } else return RET_TOOFEW(0); } else { /* JISX 0213 plane 1. */ wc = jisx0213_to_ucs4(0x100-0x80+c,c2^0x80); } if (wc) { if (wc < 0x80) { /* It's a combining character. */ ucs4_t wc1 = jisx0213_to_ucs_combining[wc - 1][0]; ucs4_t wc2 = jisx0213_to_ucs_combining[wc - 1][1]; /* We cannot output two Unicode characters at once. So, output the first character and buffer the second one. */ *pwc = wc1; conv->istate = wc2; } else *pwc = wc; return (c == 0x8f ? 3 : 2); } } } } else return RET_TOOFEW(0); } return RET_ILSEQ; } } } #define euc_jisx0213_flushwc normal_flushwc /* Composition tables for each of the relevant combining characters. */ static const struct { unsigned short base; unsigned short composed; } euc_jisx0213_comp_table_data[] = { #define euc_jisx0213_comp_table02e5_idx 0 #define euc_jisx0213_comp_table02e5_len 1 { 0xabe4, 0xabe5 }, /* 0x12B65 = 0x12B64 U+02E5 */ #define euc_jisx0213_comp_table02e9_idx (euc_jisx0213_comp_table02e5_idx+euc_jisx0213_comp_table02e5_len) #define euc_jisx0213_comp_table02e9_len 1 { 0xabe0, 0xabe6 }, /* 0x12B66 = 0x12B60 U+02E9 */ #define euc_jisx0213_comp_table0300_idx (euc_jisx0213_comp_table02e9_idx+euc_jisx0213_comp_table02e9_len) #define euc_jisx0213_comp_table0300_len 5 { 0xa9dc, 0xabc4 }, /* 0x12B44 = 0x1295C U+0300 */ { 0xabb8, 0xabc8 }, /* 0x12B48 = 0x12B38 U+0300 */ { 0xabb7, 0xabca }, /* 0x12B4A = 0x12B37 U+0300 */ { 0xabb0, 0xabcc }, /* 0x12B4C = 0x12B30 U+0300 */ { 0xabc3, 0xabce }, /* 0x12B4E = 0x12B43 U+0300 */ #define euc_jisx0213_comp_table0301_idx (euc_jisx0213_comp_table0300_idx+euc_jisx0213_comp_table0300_len) #define euc_jisx0213_comp_table0301_len 4 { 0xabb8, 0xabc9 }, /* 0x12B49 = 0x12B38 U+0301 */ { 0xabb7, 0xabcb }, /* 0x12B4B = 0x12B37 U+0301 */ { 0xabb0, 0xabcd }, /* 0x12B4D = 0x12B30 U+0301 */ { 0xabc3, 0xabcf }, /* 0x12B4F = 0x12B43 U+0301 */ #define euc_jisx0213_comp_table309a_idx (euc_jisx0213_comp_table0301_idx+euc_jisx0213_comp_table0301_len) #define euc_jisx0213_comp_table309a_len 14 { 0xa4ab, 0xa4f7 }, /* 0x12477 = 0x1242B U+309A */ { 0xa4ad, 0xa4f8 }, /* 0x12478 = 0x1242D U+309A */ { 0xa4af, 0xa4f9 }, /* 0x12479 = 0x1242F U+309A */ { 0xa4b1, 0xa4fa }, /* 0x1247A = 0x12431 U+309A */ { 0xa4b3, 0xa4fb }, /* 0x1247B = 0x12433 U+309A */ { 0xa5ab, 0xa5f7 }, /* 0x12577 = 0x1252B U+309A */ { 0xa5ad, 0xa5f8 }, /* 0x12578 = 0x1252D U+309A */ { 0xa5af, 0xa5f9 }, /* 0x12579 = 0x1252F U+309A */ { 0xa5b1, 0xa5fa }, /* 0x1257A = 0x12531 U+309A */ { 0xa5b3, 0xa5fb }, /* 0x1257B = 0x12533 U+309A */ { 0xa5bb, 0xa5fc }, /* 0x1257C = 0x1253B U+309A */ { 0xa5c4, 0xa5fd }, /* 0x1257D = 0x12544 U+309A */ { 0xa5c8, 0xa5fe }, /* 0x1257E = 0x12548 U+309A */ { 0xa6f5, 0xa6f8 }, /* 0x12678 = 0x12675 U+309A */ }; static int euc_jisx0213_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { int count = 0; unsigned short lasttwo = conv->ostate; if (lasttwo) { /* Attempt to combine the last character with this one. */ unsigned int idx; unsigned int len; if (wc == 0x02e5) idx = euc_jisx0213_comp_table02e5_idx, len = euc_jisx0213_comp_table02e5_len; else if (wc == 0x02e9) idx = euc_jisx0213_comp_table02e9_idx, len = euc_jisx0213_comp_table02e9_len; else if (wc == 0x0300) idx = euc_jisx0213_comp_table0300_idx, len = euc_jisx0213_comp_table0300_len; else if (wc == 0x0301) idx = euc_jisx0213_comp_table0301_idx, len = euc_jisx0213_comp_table0301_len; else if (wc == 0x309a) idx = euc_jisx0213_comp_table309a_idx, len = euc_jisx0213_comp_table309a_len; else goto not_combining; do if (euc_jisx0213_comp_table_data[idx].base == lasttwo) break; while (++idx, --len > 0); if (len > 0) { /* Output the combined character. */ if (n >= 2) { lasttwo = euc_jisx0213_comp_table_data[idx].composed; r[0] = (lasttwo >> 8) & 0xff; r[1] = lasttwo & 0xff; conv->ostate = 0; return 2; } else return RET_TOOSMALL; } not_combining: /* Output the buffered character. */ if (n < 2) return RET_TOOSMALL; r[0] = (lasttwo >> 8) & 0xff; r[1] = lasttwo & 0xff; r += 2; count = 2; } if (wc < 0x80) { /* Plain ASCII character. */ if (n > count) { r[0] = (unsigned char) wc; conv->ostate = 0; return count+1; } else return RET_TOOSMALL; } else if (wc >= 0xff61 && wc <= 0xff9f) { /* Half-width katakana. */ if (n >= count+2) { r[0] = 0x8e; r[1] = wc - 0xfec0; conv->ostate = 0; return count+2; } else return RET_TOOSMALL; } else { unsigned short jch = ucs4_to_jisx0213(wc); if (jch != 0) { if (jch & 0x0080) { /* A possible match in comp_table_data. We have to buffer it. */ /* We know it's a JISX 0213 plane 1 character. */ if (jch & 0x8000) abort(); conv->ostate = jch | 0x8080; return count+0; } if (jch & 0x8000) { /* JISX 0213 plane 2. */ if (n >= count+3) { r[0] = 0x8f; r[1] = (jch >> 8) | 0x80; r[2] = (jch & 0xff) | 0x80; conv->ostate = 0; return count+3; } else return RET_TOOSMALL; } else { /* JISX 0213 plane 1. */ if (n >= count+2) { r[0] = (jch >> 8) | 0x80; r[1] = (jch & 0xff) | 0x80; conv->ostate = 0; return count+2; } else return RET_TOOSMALL; } } return RET_ILUNI; } } static int euc_jisx0213_reset (conv_t conv, unsigned char *r, int n) { state_t lasttwo = conv->ostate; if (lasttwo) { if (n < 2) return RET_TOOSMALL; r[0] = (lasttwo >> 8) & 0xff; r[1] = lasttwo & 0xff; /* conv->ostate = 0; will be done by the caller */ return 2; } else return 0; } freelan-2.0/third-party/source/libiconv-msvc/include/euc_jp.h000066400000000000000000000117431252300335000243510ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2005 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * EUC-JP */ static int euc_jp_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; /* Code set 0 (ASCII or JIS X 0201-1976 Roman) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (JIS X 0208) */ if (c >= 0xa1 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); if (c < 0xf5) { unsigned char c2 = s[1]; if (c2 >= 0xa1 && c2 < 0xff) { unsigned char buf[2]; buf[0] = c-0x80; buf[1] = c2-0x80; return jisx0208_mbtowc(conv,pwc,buf,2); } else return RET_ILSEQ; } else { /* User-defined range. See * Ken Lunde's "CJKV Information Processing", table 4-66, p. 206. */ unsigned char c2 = s[1]; if (c2 >= 0xa1 && c2 < 0xff) { *pwc = 0xe000 + 94*(c-0xf5) + (c2-0xa1); return 2; } else return RET_ILSEQ; } } /* Code set 2 (half-width katakana) */ if (c == 0x8e) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if (c2 >= 0xa1 && c2 < 0xe0) { int ret = jisx0201_mbtowc(conv,pwc,s+1,n-1); if (ret == RET_ILSEQ) return RET_ILSEQ; if (ret != 1) abort(); return 2; } else return RET_ILSEQ; } } /* Code set 3 (JIS X 0212-1990) */ if (c == 0x8f) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if (c2 >= 0xa1 && c2 < 0xff) { if (n < 3) return RET_TOOFEW(0); if (c2 < 0xf5) { unsigned char c3 = s[2]; if (c3 >= 0xa1 && c3 < 0xff) { unsigned char buf[2]; int ret; buf[0] = c2-0x80; buf[1] = c3-0x80; ret = jisx0212_mbtowc(conv,pwc,buf,2); if (ret == RET_ILSEQ) return RET_ILSEQ; if (ret != 2) abort(); return 3; } else return RET_ILSEQ; } else { /* User-defined range. See * Ken Lunde's "CJKV Information Processing", table 4-66, p. 206. */ unsigned char c3 = s[2]; if (c3 >= 0xa1 && c3 < 0xff) { *pwc = 0xe3ac + 94*(c2-0xf5) + (c3-0xa1); return 3; } else return RET_ILSEQ; } } else return RET_ILSEQ; } } return RET_ILSEQ; } static int euc_jp_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; /* Code set 0 (ASCII or JIS X 0201-1976 Roman) */ ret = ascii_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; /* Code set 1 (JIS X 0208) */ ret = jisx0208_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]+0x80; r[1] = buf[1]+0x80; return 2; } /* Code set 2 (half-width katakana) */ ret = jisx0201_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI && buf[0] >= 0x80) { if (ret != 1) abort(); if (n < 2) return RET_TOOSMALL; r[0] = 0x8e; r[1] = buf[0]; return 2; } /* Code set 3 (JIS X 0212-1990) */ ret = jisx0212_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 3) return RET_TOOSMALL; r[0] = 0x8f; r[1] = buf[0]+0x80; r[2] = buf[1]+0x80; return 3; } /* Extra compatibility with Shift_JIS. */ if (wc == 0x00a5) { r[0] = 0x5c; return 1; } if (wc == 0x203e) { r[0] = 0x7e; return 1; } /* User-defined range. See * Ken Lunde's "CJKV Information Processing", table 4-66, p. 206. */ if (wc >= 0xe000 && wc < 0xe758) { if (wc < 0xe3ac) { unsigned char c1, c2; if (n < 2) return RET_TOOSMALL; c1 = (unsigned int) (wc - 0xe000) / 94; c2 = (unsigned int) (wc - 0xe000) % 94; r[0] = c1+0xf5; r[1] = c2+0xa1; return 2; } else { unsigned char c1, c2; if (n < 3) return RET_TOOSMALL; c1 = (unsigned int) (wc - 0xe3ac) / 94; c2 = (unsigned int) (wc - 0xe3ac) % 94; r[0] = 0x8f; r[1] = c1+0xf5; r[2] = c2+0xa1; return 3; } } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/euc_kr.h000066400000000000000000000040631252300335000243510ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2007 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * EUC-KR */ /* Specification: RFC 1557 */ static int euc_kr_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; /* Code set 0 (ASCII or KS C 5636-1993) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (KS C 5601-1992, now KS X 1001:2002) */ if (c >= 0xa1 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if (c2 >= 0xa1 && c2 < 0xff) { unsigned char buf[2]; buf[0] = c-0x80; buf[1] = c2-0x80; return ksc5601_mbtowc(conv,pwc,buf,2); } else return RET_ILSEQ; } } return RET_ILSEQ; } static int euc_kr_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; /* Code set 0 (ASCII or KS C 5636-1993) */ ret = ascii_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; /* Code set 1 (KS C 5601-1992, now KS X 1001:2002) */ ret = ksc5601_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]+0x80; r[1] = buf[1]+0x80; return 2; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/euc_tw.h000066400000000000000000000065431252300335000243740ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * EUC-TW */ static int euc_tw_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; /* Code set 0 (ASCII) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (CNS 11643-1992 Plane 1) */ if (c >= 0xa1 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if (c2 >= 0xa1 && c2 < 0xff) { unsigned char buf[2]; buf[0] = c-0x80; buf[1] = c2-0x80; return cns11643_1_mbtowc(conv,pwc,buf,2); } else return RET_ILSEQ; } } /* Code set 2 (CNS 11643-1992 Planes 1-16) */ if (c == 0x8e) { if (n < 4) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if (c2 >= 0xa1 && c2 <= 0xb0) { unsigned char c3 = s[2]; unsigned char c4 = s[3]; if (c3 >= 0xa1 && c3 < 0xff && c4 >= 0xa1 && c4 < 0xff) { unsigned char buf[2]; int ret; buf[0] = c3-0x80; buf[1] = c4-0x80; switch (c2-0xa0) { case 1: ret = cns11643_1_mbtowc(conv,pwc,buf,2); break; case 2: ret = cns11643_2_mbtowc(conv,pwc,buf,2); break; case 3: ret = cns11643_3_mbtowc(conv,pwc,buf,2); break; case 4: ret = cns11643_4_mbtowc(conv,pwc,buf,2); break; case 5: ret = cns11643_5_mbtowc(conv,pwc,buf,2); break; case 6: ret = cns11643_6_mbtowc(conv,pwc,buf,2); break; case 7: ret = cns11643_7_mbtowc(conv,pwc,buf,2); break; case 15: ret = cns11643_15_mbtowc(conv,pwc,buf,2); break; default: return RET_ILSEQ; } if (ret == RET_ILSEQ) return RET_ILSEQ; if (ret != 2) abort(); return 4; } } } } return RET_ILSEQ; } static int euc_tw_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[3]; int ret; /* Code set 0 (ASCII) */ ret = ascii_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; ret = cns11643_wctomb(conv,buf,wc,3); if (ret != RET_ILUNI) { if (ret != 3) abort(); /* Code set 1 (CNS 11643-1992 Plane 1) */ if (buf[0] == 1) { if (n < 2) return RET_TOOSMALL; r[0] = buf[1]+0x80; r[1] = buf[2]+0x80; return 2; } /* Code set 2 (CNS 11643-1992 Planes 1-16) */ if (n < 4) return RET_TOOSMALL; r[0] = 0x8e; r[1] = buf[0]+0xa0; r[2] = buf[1]+0x80; r[3] = buf[2]+0x80; return 4; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/flags.h000066400000000000000000000172551252300335000242040ustar00rootroot00000000000000/* Generated automatically by genflags. */ /* Set if the encoding can encode the acute and grave accents U+00B4 and U+0060. */ #define HAVE_ACCENTS 1 /* Set if the encoding can encode the single quotation marks U+2018 and U+2019. */ #define HAVE_QUOTATION_MARKS 2 /* Set if the encoding can encode the double-width Hangul letters (Jamo) U+3131 to U+3163. */ #define HAVE_HANGUL_JAMO 4 #define ei_ascii_oflags (0) #define ei_utf8_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_ucs2_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_ucs2be_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_ucs2le_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_ucs4_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_ucs4be_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_ucs4le_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_utf16_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_utf16be_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_utf16le_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_utf32_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_utf32be_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_utf32le_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_utf7_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_ucs2internal_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_ucs2swapped_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_ucs4internal_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_ucs4swapped_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_c99_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_java_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_iso8859_1_oflags (HAVE_ACCENTS) #define ei_iso8859_2_oflags (HAVE_ACCENTS) #define ei_iso8859_3_oflags (HAVE_ACCENTS) #define ei_iso8859_4_oflags (HAVE_ACCENTS) #define ei_iso8859_5_oflags (0) #define ei_iso8859_6_oflags (0) #define ei_iso8859_7_oflags (HAVE_QUOTATION_MARKS) #define ei_iso8859_8_oflags (HAVE_ACCENTS) #define ei_iso8859_9_oflags (HAVE_ACCENTS) #define ei_iso8859_10_oflags (0) #define ei_iso8859_11_oflags (0) #define ei_iso8859_13_oflags (0) #define ei_iso8859_14_oflags (0) #define ei_iso8859_15_oflags (0) #define ei_iso8859_16_oflags (0) #define ei_koi8_r_oflags (0) #define ei_koi8_u_oflags (0) #define ei_koi8_ru_oflags (0) #define ei_cp1250_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_cp1251_oflags (HAVE_QUOTATION_MARKS) #define ei_cp1252_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_cp1253_oflags (HAVE_QUOTATION_MARKS) #define ei_cp1254_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_cp1255_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_cp1256_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_cp1257_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_cp1258_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_cp850_oflags (HAVE_ACCENTS) #define ei_cp862_oflags (0) #define ei_cp866_oflags (0) #define ei_cp1131_oflags (0) #define ei_mac_roman_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_mac_centraleurope_oflags (HAVE_QUOTATION_MARKS) #define ei_mac_iceland_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_mac_croatian_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_mac_romania_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_mac_cyrillic_oflags (HAVE_QUOTATION_MARKS) #define ei_mac_ukraine_oflags (HAVE_QUOTATION_MARKS) #define ei_mac_greek_oflags (HAVE_QUOTATION_MARKS) #define ei_mac_turkish_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_mac_hebrew_oflags (HAVE_QUOTATION_MARKS) #define ei_mac_arabic_oflags (0) #define ei_mac_thai_oflags (HAVE_QUOTATION_MARKS) #define ei_hp_roman8_oflags (HAVE_ACCENTS) #define ei_nextstep_oflags (HAVE_ACCENTS) #define ei_armscii_8_oflags (0) #define ei_georgian_academy_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_georgian_ps_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_koi8_t_oflags (HAVE_QUOTATION_MARKS) #define ei_pt154_oflags (HAVE_QUOTATION_MARKS) #define ei_rk1048_oflags (HAVE_QUOTATION_MARKS) #define ei_mulelao_oflags (0) #define ei_cp1133_oflags (0) #define ei_tis620_oflags (0) #define ei_cp874_oflags (HAVE_QUOTATION_MARKS) #define ei_viscii_oflags (0) #define ei_tcvn_oflags (HAVE_ACCENTS) #define ei_iso646_jp_oflags (0) #define ei_jisx0201_oflags (0) #define ei_jisx0208_oflags (HAVE_QUOTATION_MARKS) #define ei_jisx0212_oflags (0) #define ei_iso646_cn_oflags (0) #define ei_gb2312_oflags (HAVE_QUOTATION_MARKS) #define ei_isoir165_oflags (HAVE_QUOTATION_MARKS) #define ei_ksc5601_oflags (HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_euc_jp_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_sjis_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_cp932_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_iso2022_jp_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_iso2022_jp1_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_iso2022_jp2_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_euc_cn_oflags (HAVE_QUOTATION_MARKS) #define ei_ces_gbk_oflags (HAVE_QUOTATION_MARKS) #define ei_cp936_oflags (HAVE_QUOTATION_MARKS) #define ei_gb18030_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_iso2022_cn_oflags (HAVE_QUOTATION_MARKS) #define ei_iso2022_cn_ext_oflags (HAVE_QUOTATION_MARKS) #define ei_hz_oflags (HAVE_QUOTATION_MARKS) #define ei_euc_tw_oflags (HAVE_QUOTATION_MARKS) #define ei_ces_big5_oflags (HAVE_QUOTATION_MARKS) #define ei_cp950_oflags (HAVE_QUOTATION_MARKS) #define ei_big5hkscs1999_oflags (HAVE_QUOTATION_MARKS) #define ei_big5hkscs2001_oflags (HAVE_QUOTATION_MARKS) #define ei_big5hkscs2004_oflags (HAVE_QUOTATION_MARKS) #define ei_big5hkscs2008_oflags (HAVE_QUOTATION_MARKS) #define ei_euc_kr_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_cp949_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_johab_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_iso2022_kr_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_cp856_oflags (HAVE_ACCENTS) #define ei_cp922_oflags (HAVE_ACCENTS) #define ei_cp943_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_cp1046_oflags (0) #define ei_cp1124_oflags (0) #define ei_cp1129_oflags (0) #define ei_cp1161_oflags (0) #define ei_cp1162_oflags (HAVE_QUOTATION_MARKS) #define ei_cp1163_oflags (0) #define ei_dec_kanji_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_dec_hanyu_oflags (HAVE_QUOTATION_MARKS) #define ei_cp437_oflags (0) #define ei_cp737_oflags (0) #define ei_cp775_oflags (0) #define ei_cp852_oflags (HAVE_ACCENTS) #define ei_cp853_oflags (HAVE_ACCENTS) #define ei_cp855_oflags (0) #define ei_cp857_oflags (HAVE_ACCENTS) #define ei_cp858_oflags (HAVE_ACCENTS) #define ei_cp860_oflags (0) #define ei_cp861_oflags (0) #define ei_cp863_oflags (HAVE_ACCENTS) #define ei_cp864_oflags (0) #define ei_cp865_oflags (0) #define ei_cp869_oflags (HAVE_QUOTATION_MARKS) #define ei_cp1125_oflags (0) #define ei_euc_jisx0213_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_shift_jisx0213_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_iso2022_jp3_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) #define ei_big5_2003_oflags (HAVE_QUOTATION_MARKS) #define ei_tds565_oflags (0) #define ei_atarist_oflags (HAVE_ACCENTS) #define ei_riscos1_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS) freelan-2.0/third-party/source/libiconv-msvc/include/flushwc.h000066400000000000000000000023051252300335000245510ustar00rootroot00000000000000/* * Copyright (C) 2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _FLUSHWC_H #define _FLUSHWC_H static int normal_flushwc (conv_t conv, ucs4_t *pwc) { ucs4_t last_wc = conv->istate; if (last_wc) { /* Output the buffered character. */ conv->istate = 0; *pwc = (ucs4_t) last_wc; return 1; } else return 0; } #endif /* _FLUSHWC_H */ freelan-2.0/third-party/source/libiconv-msvc/include/gb12345.h000066400000000000000000000043651252300335000240750ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GB/T 12345-1990 */ /* * GB/T 12345-1990 is a traditional chinese counterpart of GB 2312-1986. * According to the unicode.org tables: * 2146 characters have been changed to their traditional counterpart, * 103 characters have been added, no characters have been removed. * Therefore we use an auxiliary table, which contains only the changes. */ #include "gb12345ext.h" static int gb12345_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { int ret; /* The gb12345ext table overrides some entries in the gb2312 table. */ /* Try the GB12345 extensions -> Unicode table. */ ret = gb12345ext_mbtowc(conv,pwc,s,n); if (ret != RET_ILSEQ) return ret; /* Try the GB2312 -> Unicode table. */ ret = gb2312_mbtowc(conv,pwc,s,n); return ret; } static int gb12345_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { int ret; /* The gb12345ext table overrides some entries in the gb2312 table. */ /* Try the Unicode -> GB12345 extensions table. */ ret = gb12345ext_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; /* Try the Unicode -> GB2312 table, and check that the resulting GB2312 byte sequence is not overridden by the GB12345 extensions table. */ ret = gb2312_wctomb(conv,r,wc,n); if (ret == 2 && gb12345ext_mbtowc(conv,&wc,r,2) == 2) return RET_ILUNI; else return ret; } freelan-2.0/third-party/source/libiconv-msvc/include/gb12345ext.h000066400000000000000000003216061252300335000246160ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GB/T 12345.1990-0 extensions */ static const unsigned short gb12345ext_2uni_page21[12] = { /* 0x21 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2225, }; static const unsigned short gb12345ext_2uni_page26[85] = { /* 0x26 */ 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, 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, 0xfe35, 0xfe36, 0xfe39, 0xfe3a, 0xfe3f, 0xfe40, 0xfe3d, 0xfe3e, 0xfe41, 0xfe42, 0xfe43, 0xfe44, 0xfffd, 0xfffd, 0xfe3b, 0xfe3c, 0xfe37, 0xfe38, 0xfe31, 0xfffd, 0xfe33, 0xfe34, }; static const unsigned short gb12345ext_2uni_page28[32] = { /* 0x28 */ 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, 0x0251, 0x1e3f, 0x0144, 0x0148, 0x01f9, 0x0261, }; static const unsigned short gb12345ext_2uni_page30[6871] = { /* 0x30 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x769a, 0xfffd, 0x85f9, 0xfffd, 0xfffd, 0x7919, 0x611b, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9aaf, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8956, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x58e9, 0xfffd, 0x7f77, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x64fa, 0xfffd, 0x6557, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9812, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8fa6, 0x7d46, 0xfffd, 0x5e6b, 0xfffd, 0xfffd, 0xfffd, 0x7d81, 0xfffd, 0xfffd, 0xfffd, 0x938a, 0xfffd, 0x8b17, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x31 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x98fd, 0x5bf6, 0xfffd, 0x5831, 0xfffd, 0xfffd, 0x9b91, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8f29, 0xfffd, 0x8c9d, 0x92c7, 0xfffd, 0x72fd, 0x5099, 0x618a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7db3, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7b46, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7562, 0x6583, 0xfffd, 0x5e63, 0xfffd, 0xfffd, 0x9589, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x908a, 0x7de8, 0x8cb6, 0xfffd, 0xfffd, 0x8b8a, 0xfffd, 0xfffd, 0x8faf, 0x8fae, 0xfffd, 0x6a19, 0xfffd, 0xfffd, 0xfffd, 0x9c49, 0xfffd, 0xfffd, 0x765f, 0xfffd, 0xfffd, 0x7015, 0x6ff1, 0x8cd3, 0x64ef, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9905, 0xfffd, /* 0x32 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x64a5, 0x9262, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9251, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x99c1, 0xfffd, 0xfffd, 0xfffd, 0x88dc, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8ca1, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x53c3, 0x8836, 0x6b98, 0x615a, 0x6158, 0x71e6, 0x84bc, 0x8259, 0x5009, 0x6ec4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x53a0, 0xfffd, 0x5074, 0xfffd, 0x6e2c, 0x5c64, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8a6b, 0xfffd, 0xfffd, 0xfffd, 0x6519, 0x647b, 0x87ec, 0x995e, 0x8b92, 0x7e8f, 0x93df, 0x7523, 0x95e1, 0x986b, 0xfffd, 0xfffd, /* 0x33 */ 0x5834, 0x5617, 0xfffd, 0x9577, 0x511f, 0x8178, 0x5ee0, 0xfffd, 0x66a2, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9214, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8eca, 0xfffd, 0xfffd, 0xfffd, 0x5fb9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5875, 0xfffd, 0xfffd, 0xfffd, 0x9673, 0xfffd, 0x896f, 0xfffd, 0x7a31, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x61f2, 0xfffd, 0x8aa0, 0xfffd, 0xfffd, 0x9a01, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9072, 0xfffd, 0x99b3, 0xfffd, 0x9f52, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x71be, 0xfffd, 0x885d, 0x87f2, 0xfffd, 0x5bf5, 0xfffd, 0xfffd, 0x7587, 0x8e8a, 0xfffd, 0xfffd, 0x7c4c, 0xfffd, 0x7da2, 0xfffd, 0x919c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x92e4, 0x96db, 0xfffd, 0xfffd, 0xfffd, /* 0x34 */ 0x790e, 0x5132, 0xfffd, 0xfffd, 0x89f8, 0x8655, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x50b3, 0xfffd, 0xfffd, 0xfffd, 0x7621, 0xfffd, 0xfffd, 0xfffd, 0x95d6, 0x5275, 0xfffd, 0xfffd, 0xfffd, 0x9318, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7d14, 0xfffd, 0xfffd, 0x7dbd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8fad, 0xfffd, 0xfffd, 0x8a5e, 0xfffd, 0xfffd, 0x8cdc, 0xfffd, 0x8070, 0xfffd, 0xfffd, 0xfffd, 0x5f9e, 0x53e2, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8ea5, 0xfffd, 0x7ac4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x932f, 0xfffd, 0x9054, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5e36, 0xfffd, 0xfffd, 0x8cb8, 0xfffd, 0xfffd, 0xfffd, /* 0x35 */ 0xfffd, 0xfffd, 0x64d4, 0xfffd, 0x55ae, 0x9132, 0x64a3, 0x81bd, 0xfffd, 0xfffd, 0xfffd, 0x619a, 0xfffd, 0x8a95, 0x5f48, 0xfffd, 0x7576, 0x64cb, 0x9ee8, 0x8569, 0x6a94, 0xfffd, 0x6417, 0xfffd, 0xfffd, 0x5cf6, 0x79b1, 0x5c0e, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x71c8, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9127, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6575, 0xfffd, 0xfffd, 0x6ecc, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x905e, 0x7de0, 0x985b, 0xfffd, 0xfffd, 0xfffd, 0x9ede, 0xfffd, 0xfffd, 0x588a, 0x96fb, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6fb1, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x91e3, 0x8abf, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8adc, 0xfffd, /* 0x36 */ 0xfffd, 0xfffd, 0xfffd, 0x91d8, 0x9802, 0xfffd, 0x9320, 0xfffd, 0x8a02, 0xfffd, 0x6771, 0xfffd, 0xfffd, 0xfffd, 0x52d5, 0x68df, 0xfffd, 0xfffd, 0x51cd, 0xfffd, 0xfffd, 0xfffd, 0x9b25, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x72a2, 0x7368, 0x8b80, 0xfffd, 0xfffd, 0x8ced, 0xfffd, 0x934d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x935b, 0xfffd, 0x65b7, 0x7dde, 0xfffd, 0xfffd, 0x968a, 0x5c0d, 0xfffd, 0x5678, 0xfffd, 0xfffd, 0x9813, 0xfffd, 0x920d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x596a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x58ae, 0xfffd, 0xfffd, 0x9d5d, 0xfffd, 0x984d, 0x8a1b, 0xfffd, 0x60e1, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9913, 0xfffd, 0xfffd, 0x5152, 0xfffd, 0x723e, 0x990c, 0xfffd, 0xfffd, /* 0x37 */ 0x8cb3, 0x767c, 0x7f70, 0xfffd, 0xfffd, 0xfffd, 0x95a5, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x792c, 0x91e9, 0xfffd, 0xfffd, 0x7169, 0xfffd, 0xfffd, 0x7bc4, 0x8ca9, 0xfffd, 0x98ef, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8a2a, 0x7d21, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x98db, 0xfffd, 0xfffd, 0x8ab9, 0xfffd, 0xfffd, 0x5ee2, 0xfffd, 0x8cbb, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7d1b, 0x58b3, 0xfffd, 0xfffd, 0xfffd, 0x596e, 0xfffd, 0xfffd, 0x61a4, 0x7cde, 0x8c50, 0xfffd, 0x6953, 0xfffd, 0xfffd, 0x92d2, 0x98a8, 0x760b, 0xfffd, 0xfffd, 0x99ae, 0x7e2b, 0x8af7, 0xfffd, 0x9cf3, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x819a, 0xfffd, 0xfffd, 0xfffd, 0x8f3b, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x38 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x64ab, 0x8f14, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8ce6, 0x5fa9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8ca0, 0xfffd, 0x8a03, 0xfffd, 0x5a66, 0x7e1b, 0xfffd, 0xfffd, 0xfffd, 0x8a72, 0xfffd, 0xfffd, 0x9223, 0x84cb, 0xfffd, 0x5e79, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8d95, 0xfffd, 0xfffd, 0xfffd, 0x8d1b, 0x5ca1, 0x525b, 0x92fc, 0xfffd, 0xfffd, 0x7db1, 0x5d17, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x93ac, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x64f1, 0xfffd, 0x9d3f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x95a3, 0xfffd, 0x927b, 0x500b, 0xfffd, 0x7d66, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x39 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9f94, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x978f, 0xfffd, 0xfffd, 0x8ca2, 0xfffd, 0x920e, 0xfffd, 0x6e9d, 0xfffd, 0xfffd, 0xfffd, 0x69cb, 0x8cfc, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8831, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9867, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x526e, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x95dc, 0xfffd, 0xfffd, 0x89c0, 0xfffd, 0x9928, 0xfffd, 0x6163, 0xfffd, 0x8cab, 0xfffd, 0x5ee3, 0xfffd, 0xfffd, 0x898f, 0xfffd, 0xfffd, 0x6b78, 0x9f9c, 0x95a8, 0x8ecc, 0xfffd, 0x8a6d, 0xfffd, 0xfffd, 0x6ac3, 0xfffd, 0x8cb4, 0x528a, 0x8f25, 0xfffd, 0xfffd, 0x934b, 0xfffd, 0x570b, 0xfffd, 0xfffd, 0x904e, 0xfffd, /* 0x3a */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x99ed, 0xfffd, 0xfffd, 0xfffd, 0x97d3, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6f22, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x865f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x95a1, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9db4, 0x8cc0, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8f5f, 0xfffd, 0xfffd, 0xfffd, 0x9d3b, 0xfffd, 0xfffd, 0xfffd, 0x7d05, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5f8c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x58fa, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x3b */ 0xfffd, 0xfffd, 0xfffd, 0x8b77, 0xfffd, 0x6eec, 0xfffd, 0xfffd, 0x5629, 0x83ef, 0xfffd, 0xfffd, 0x756b, 0x5283, 0xfffd, 0x8a71, 0xfffd, 0xfffd, 0x61f7, 0xfffd, 0x58de, 0x6b61, 0x74b0, 0xfffd, 0x9084, 0x7de9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8b0a, 0xfffd, 0x63ee, 0x8f1d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8cc4, 0x7a62, 0x6703, 0x71f4, 0x532f, 0x8af1, 0x8aa8, 0x7e6a, 0x8477, 0xfffd, 0xfffd, 0xfffd, 0x6e3e, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7372, 0xfffd, 0xfffd, 0xfffd, 0x8ca8, 0x798d, 0x64ca, 0xfffd, 0xfffd, 0x6a5f, 0xfffd, 0xfffd, 0x7a4d, 0xfffd, /* 0x3c */ 0xfffd, 0x9951, 0xfffd, 0xfffd, 0x8b4f, 0x9dc4, 0xfffd, 0x7e3e, 0x7ddd, 0xfffd, 0x6975, 0xfffd, 0x8f2f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7d1a, 0x64e0, 0x5e7e, 0xfffd, 0xfffd, 0x858a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5291, 0xfffd, 0x6fdf, 0xfffd, 0xfffd, 0x8a08, 0x8a18, 0xfffd, 0xfffd, 0x969b, 0xfffd, 0x7e7c, 0x7d00, 0xfffd, 0xfffd, 0x593e, 0xfffd, 0xfffd, 0xfffd, 0x83a2, 0x9830, 0x8cc8, 0xfffd, 0x9240, 0xfffd, 0xfffd, 0x50f9, 0xfffd, 0x99d5, 0xfffd, 0x6bb2, 0x76e3, 0x5805, 0xfffd, 0x7b8b, 0x9593, 0xfffd, 0xfffd, 0xfffd, 0x8271, 0xfffd, 0x7dd8, 0x7e6d, 0x6aa2, 0xfffd, 0xfffd, 0x9e7c, 0x63c0, 0x64bf, 0x7c21, 0x5109, 0xfffd, 0xfffd, 0x85a6, 0x6abb, 0x9452, 0x8e10, 0x8ce4, 0x898b, 0x9375, 0xfffd, 0xfffd, /* 0x3d */ 0xfffd, 0x8266, 0x528d, 0x991e, 0x6f38, 0x6ffa, 0x6f97, 0xfffd, 0xfffd, 0xfffd, 0x5c07, 0x6f3f, 0xfffd, 0xfffd, 0x8523, 0x69f3, 0x596c, 0x8b1b, 0xfffd, 0x91ac, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x81a0, 0xfffd, 0xfffd, 0x6f86, 0x9a55, 0x5b0c, 0xfffd, 0x652a, 0x9278, 0x77ef, 0x50e5, 0xfffd, 0xfffd, 0xfffd, 0x9903, 0x7e73, 0x7d5e, 0xfffd, 0xfffd, 0xfffd, 0x8f4e, 0x8f03, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x968e, 0xfffd, 0xfffd, 0x7bc0, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6f54, 0x7d50, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8aa1, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7dca, 0x9326, 0x50c5, 0x8b39, 0x9032, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x71fc, 0xfffd, /* 0x3e */ 0x76e1, 0x52c1, 0xfffd, 0xfffd, 0x8396, 0xfffd, 0xfffd, 0x9be8, 0xfffd, 0x9a5a, 0xfffd, 0xfffd, 0x7d93, 0xfffd, 0xfffd, 0xfffd, 0x9838, 0xfffd, 0xfffd, 0xfffd, 0x93e1, 0x5f91, 0x75d9, 0xfffd, 0xfffd, 0x7af6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7cfe, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x820a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x99d2, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8209, 0xfffd, 0xfffd, 0xfffd, 0x64da, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x92f8, 0xfffd, 0xfffd, 0x61fc, 0xfffd, 0x5287, 0xfffd, 0x9d51, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7d79, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x89ba, 0xfffd, 0x8a23, 0x7d76, 0xfffd, 0xfffd, 0x921e, 0x8ecd, 0xfffd, 0xfffd, /* 0x3f */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x99ff, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x958b, 0xfffd, 0xfffd, 0x51f1, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9846, 0xfffd, 0x6bbb, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8ab2, 0xfffd, 0xfffd, 0x58be, 0x61c7, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6473, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5eab, 0x8932, 0x8a87, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x584a, 0xfffd, 0x5108, 0xfffd, 0x5bec, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7926, 0xfffd, 0x66e0, 0xfffd, 0x8667, 0xfffd, 0x5dcb, 0x7aba, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x40 */ 0x994b, 0xfffd, 0x6f70, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x64f4, 0xfffd, 0x95ca, 0xfffd, 0xfffd, 0xfffd, 0x881f, 0x81d8, 0xfffd, 0xfffd, 0x840a, 0x4f86, 0x8cf4, 0x85cd, 0xfffd, 0x6b04, 0x6514, 0x7c43, 0x95cc, 0x862d, 0x703e, 0x8b95, 0x652c, 0x89bd, 0x61f6, 0x7e9c, 0x721b, 0x6feb, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6488, 0x52de, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6f87, 0xfffd, 0x6a02, 0xfffd, 0x9433, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x58d8, 0xfffd, 0xfffd, 0x985e, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7c6c, 0xfffd, 0x96e2, 0x7055, 0xfffd, 0xfffd, 0x88cf, 0x9bc9, 0x79ae, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9e97, 0x53b2, 0x52f5, 0x792b, 0x6b77, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x41 */ 0xfffd, 0xfffd, 0xfffd, 0x701d, 0x96b8, 0xfffd, 0xfffd, 0xfffd, 0x5006, 0x806f, 0x84ee, 0x9023, 0x942e, 0xfffd, 0x6190, 0x6f23, 0x7c3e, 0x6582, 0x81c9, 0x93c8, 0x6200, 0x7149, 0x7df4, 0x7ce7, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5169, 0x8f1b, 0xfffd, 0xfffd, 0xfffd, 0x8ad2, 0xfffd, 0xfffd, 0xfffd, 0x7642, 0xfffd, 0xfffd, 0x907c, 0xfffd, 0xfffd, 0xfffd, 0x9410, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7375, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x81e8, 0x9130, 0x9c57, 0xfffd, 0xfffd, 0x8cc3, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9f61, 0x9234, 0xfffd, 0xfffd, 0xfffd, 0x9748, 0xfffd, 0x5dba, 0x9818, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x993e, 0xfffd, 0x5289, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9f8d, 0x807e, 0x56a8, 0x7c60, 0xfffd, /* 0x42 */ 0xfffd, 0x58df, 0x650f, 0x96b4, 0x6a13, 0x5a41, 0x645f, 0x7c0d, 0xfffd, 0xfffd, 0x8606, 0x76e7, 0x9871, 0x5eec, 0x7210, 0x64c4, 0x6ef7, 0x865c, 0x9b6f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8cc2, 0xfffd, 0xfffd, 0xfffd, 0x9332, 0x9678, 0xfffd, 0x9a62, 0xfffd, 0x92c1, 0xfffd, 0xfffd, 0xfffd, 0x5c62, 0x7e37, 0x616e, 0xfffd, 0xfffd, 0xfffd, 0x6ffe, 0x7dd1, 0x5dd2, 0x6523, 0x5b7f, 0x7064, 0xfffd, 0x4e82, 0xfffd, 0xfffd, 0x6384, 0x8f2a, 0x502b, 0x4f96, 0x6dea, 0x7db8, 0x8ad6, 0x863f, 0xfffd, 0x7f85, 0x908f, 0x947c, 0x7c6e, 0x9a3e, 0xfffd, 0xfffd, 0xfffd, 0x99f1, 0x7d61, 0x5abd, 0xfffd, 0x746a, 0x78bc, 0x879e, 0x99ac, 0x99e1, 0xfffd, 0x55ce, 0xfffd, 0x8cb7, 0x9ea5, 0x8ce3, 0x9081, 0xfffd, 0x779e, 0x9945, 0x883b, 0x6eff, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x43 */ 0x8b3e, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9328, 0xfffd, 0xfffd, 0x925a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8cbf, 0x9ebd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9382, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9580, 0x60b6, 0x5011, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9333, 0xfffd, 0x5922, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8b0e, 0x5f4c, 0xfffd, 0xfffd, 0x8993, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7dbf, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7dec, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5edf, 0xfffd, 0xfffd, 0x6ec5, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x61ab, 0x95a9, 0xfffd, 0xfffd, 0x9cf4, 0x9298, 0xfffd, 0xfffd, 0x8b2c, 0xfffd, /* 0x44 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8b00, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x755d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9209, 0xfffd, 0xfffd, 0x7d0d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x96e3, 0xfffd, 0x6493, 0x8166, 0x60f1, 0x9b27, 0xfffd, 0xfffd, 0x9912, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x64ec, 0xfffd, 0xfffd, 0x81a9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6506, 0xfffd, 0xfffd, 0xfffd, 0x91c0, 0x9ce5, 0xfffd, 0xfffd, 0x8076, 0xfffd, 0x5699, 0x9477, 0x93b3, 0xfffd, 0xfffd, 0x6ab8, 0x7370, 0xfffd, 0x5be7, /* 0x45 */ 0x64f0, 0x6fd8, 0xfffd, 0xfffd, 0x9215, 0x7d10, 0x81bf, 0x6fc3, 0x8fb2, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7627, 0xfffd, 0xfffd, 0xfffd, 0x8afe, 0xfffd, 0x6b50, 0x9dd7, 0x6bc6, 0xfffd, 0x5614, 0xfffd, 0x6f1a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x76e4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9f90, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8ce0, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5674, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9d6c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x46 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9a19, 0x98c4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x983b, 0x8ca7, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x860b, 0xfffd, 0xfffd, 0x6191, 0xfffd, 0x8a55, 0xfffd, 0xfffd, 0x6f51, 0x9817, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x64b2, 0x92ea, 0x50d5, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6a38, 0xfffd, 0xfffd, 0xfffd, 0x8b5c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x81cd, 0x9f4a, 0xfffd, 0xfffd, 0xfffd, 0x9a0e, 0xfffd, 0x8c48, 0xfffd, 0xfffd, 0x5553, 0xfffd, 0xfffd, 0xfffd, 0x6c23, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8a16, 0xfffd, /* 0x47 */ 0xfffd, 0xfffd, 0x727d, 0xfffd, 0x91fa, 0x925b, 0xfffd, 0x9077, 0x7c3d, 0xfffd, 0x8b19, 0xfffd, 0xfffd, 0x9322, 0x9257, 0xfffd, 0xfffd, 0xfffd, 0x6dfa, 0x8b74, 0x5879, 0xfffd, 0xfffd, 0xfffd, 0x69cd, 0x55c6, 0xfffd, 0xfffd, 0x58bb, 0x8594, 0xfffd, 0x6436, 0xfffd, 0x936c, 0xfffd, 0xfffd, 0x6a4b, 0xfffd, 0x55ac, 0x50d1, 0xfffd, 0xfffd, 0xfffd, 0x7ff9, 0xfffd, 0xfffd, 0x7ac5, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7aca, 0x6b3d, 0xfffd, 0x89aa, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5be2, 0xfffd, 0xfffd, 0x8f15, 0x6c2b, 0x50be, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9803, 0x8acb, 0x6176, 0x74ca, 0x7aae, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8da8, 0x5340, 0xfffd, 0xfffd, 0x8ec0, 0xfffd, 0x9a45, 0xfffd, /* 0x48 */ 0xfffd, 0xfffd, 0x9f72, 0xfffd, 0xfffd, 0xfffd, 0x9874, 0x6b0a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x52f8, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9d72, 0xfffd, 0x78ba, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8b93, 0x9952, 0x64fe, 0x7e5e, 0xfffd, 0x71b1, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x97cc, 0xfffd, 0x8a8d, 0xfffd, 0xfffd, 0x7d09, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x69ae, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7d68, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8edf, 0xfffd, 0xfffd, 0xfffd, 0x92ed, 0x958f, 0x6f64, 0xfffd, 0xfffd, 0xfffd, 0x7051, 0x85a9, 0xfffd, 0x9c13, 0xfffd, 0x8cfd, 0xfffd, 0xfffd, /* 0x49 */ 0x5098, 0xfffd, 0xfffd, 0xfffd, 0x55aa, 0xfffd, 0x9a37, 0x6383, 0xfffd, 0xfffd, 0xfffd, 0x6f80, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6bba, 0xfffd, 0xfffd, 0x7d17, 0xfffd, 0xfffd, 0xfffd, 0x7be9, 0x66ec, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9583, 0x965d, 0xfffd, 0x8d0d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7e55, 0xfffd, 0x50b7, 0xfffd, 0x8cde, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x71d2, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7d39, 0xfffd, 0x8cd2, 0xfffd, 0xfffd, 0x6368, 0xfffd, 0x651d, 0xfffd, 0x61fe, 0xfffd, 0xfffd, 0x8a2d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7d33, 0xfffd, 0xfffd, 0x5be9, 0x5b38, 0xfffd, 0x814e, 0xfffd, 0x6ef2, 0x8072, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7e69, /* 0x4a */ 0xfffd, 0xfffd, 0xfffd, 0x52dd, 0x8056, 0x5e2b, 0xfffd, 0x7345, 0xfffd, 0x6fd5, 0x8a69, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6642, 0xfffd, 0xfffd, 0x8755, 0x5be6, 0x8b58, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x99db, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x52e2, 0xfffd, 0xfffd, 0xfffd, 0x9069, 0xfffd, 0xfffd, 0x91cb, 0x98fe, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8996, 0x8a66, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x58fd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7378, 0xfffd, 0x6a1e, 0xfffd, 0xfffd, 0xfffd, 0x8f38, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x66f8, 0x8d16, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5c6c, 0x8853, 0xfffd, 0x6a39, 0xfffd, 0xfffd, 0x7aea, 0xfffd, 0xfffd, 0x6578, 0xfffd, /* 0x4b */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5e25, 0xfffd, 0xfffd, 0xfffd, 0x96d9, 0xfffd, 0x8ab0, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9806, 0xfffd, 0x8aac, 0x78a9, 0xfffd, 0x720d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7d72, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x98fc, 0xfffd, 0x9b06, 0x8073, 0x616b, 0x980c, 0xfffd, 0xfffd, 0x8a1f, 0x8aa6, 0xfffd, 0xfffd, 0x64fb, 0xfffd, 0x8607, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8a34, 0x8085, 0xfffd, 0xfffd, 0xfffd, 0x96d6, 0xfffd, 0x96a8, 0x7d8f, 0xfffd, 0xfffd, 0x6b72, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5b6b, 0x640d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7e2e, 0x7463, 0xfffd, 0x9396, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x4c */ 0x737a, 0x64bb, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x81fa, 0xfffd, 0xfffd, 0xfffd, 0x614b, 0xfffd, 0xfffd, 0x6524, 0x8caa, 0x7671, 0x7058, 0x58c7, 0xfffd, 0xfffd, 0xfffd, 0x8b5a, 0x8ac7, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5606, 0xfffd, 0x6e6f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x71d9, 0xfffd, 0x6fe4, 0xfffd, 0x7e27, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8a0e, 0xfffd, 0xfffd, 0xfffd, 0x9a30, 0xfffd, 0x8b04, 0xfffd, 0xfffd, 0xfffd, 0x92bb, 0xfffd, 0x984c, 0xfffd, 0xfffd, 0x9ad4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x689d, 0xfffd, 0xfffd, 0xfffd, 0x8cbc, 0x9435, 0xfffd, 0x5ef3, 0x807d, 0x70f4, /* 0x4d */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9285, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7d71, 0xfffd, 0xfffd, 0xfffd, 0x982d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5716, 0xfffd, 0xfffd, 0x5857, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5718, 0xfffd, 0x983d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9d15, 0xfffd, 0x99b1, 0x99dd, 0x6a62, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7aaa, 0xfffd, 0xfffd, 0x896a, 0xfffd, 0xfffd, 0xfffd, 0x5f4e, 0x7063, 0xfffd, 0x9811, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x842c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7db2, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x4e */ 0xfffd, 0xfffd, 0xfffd, 0x97cb, 0x9055, 0xfffd, 0x570d, 0xfffd, 0xfffd, 0x7232, 0x6ff0, 0x7dad, 0x8466, 0xfffd, 0xfffd, 0x5049, 0x50de, 0xfffd, 0x7def, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8b02, 0xfffd, 0xfffd, 0x885b, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x805e, 0x7d0b, 0xfffd, 0x7a69, 0xfffd, 0x554f, 0xfffd, 0xfffd, 0xfffd, 0x64be, 0x8778, 0x6e26, 0x7aa9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x55da, 0x93a2, 0x70cf, 0xfffd, 0x8aa3, 0xfffd, 0x7121, 0x856a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5862, 0xfffd, 0x9727, 0xfffd, 0xfffd, 0xfffd, 0x52d9, 0xfffd, 0x8aa4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x932b, 0x72a7, /* 0x4f */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8972, 0xfffd, 0x7fd2, 0xfffd, 0xfffd, 0x9291, 0xfffd, 0xfffd, 0xfffd, 0x6232, 0x7d30, 0xfffd, 0x8766, 0xfffd, 0xfffd, 0x8f44, 0xfffd, 0x5cfd, 0x4fe0, 0x72f9, 0xfffd, 0xfffd, 0xfffd, 0x5687, 0xfffd, 0x9341, 0xfffd, 0xfffd, 0x9bae, 0x7e96, 0xfffd, 0x8ce2, 0x929c, 0xfffd, 0x9591, 0xfffd, 0xfffd, 0xfffd, 0x986f, 0x96aa, 0x73fe, 0x737b, 0x7e23, 0xfffd, 0x9921, 0xfffd, 0x61b2, 0xfffd, 0xfffd, 0x7dab, 0xfffd, 0xfffd, 0x9472, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9109, 0xfffd, 0xfffd, 0x8a73, 0xfffd, 0x97ff, 0xfffd, 0x9805, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x856d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x56c2, 0x92b7, 0xfffd, 0xfffd, 0xfffd, 0x66c9, /* 0x50 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x562f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5354, 0x633e, 0xfffd, 0xfffd, 0xfffd, 0x8105, 0x8ae7, 0x5beb, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7009, 0x8b1d, 0xfffd, 0xfffd, 0xfffd, 0x92c5, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x91c1, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8208, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x92b9, 0xfffd, 0xfffd, 0x7d89, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9808, 0xfffd, 0x8a31, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7dd2, 0x7e8c, 0x8ed2, 0xfffd, 0xfffd, 0x61f8, 0xfffd, 0xfffd, /* 0x51 */ 0x9078, 0x766c, 0xfffd, 0x7d62, 0xfffd, 0xfffd, 0x5b78, 0xfffd, 0xfffd, 0xfffd, 0x52db, 0xfffd, 0xfffd, 0xfffd, 0x8a62, 0x5c0b, 0x99b4, 0xfffd, 0xfffd, 0xfffd, 0x8a13, 0x8a0a, 0x905c, 0xfffd, 0x58d3, 0xfffd, 0x9d09, 0x9d28, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x555e, 0x4e9e, 0x8a1d, 0xfffd, 0xfffd, 0x95b9, 0xfffd, 0xfffd, 0x9e7d, 0x56b4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9854, 0x95bb, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8277, 0xfffd, 0xfffd, 0x53ad, 0x786f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8afa, 0x9a57, 0xfffd, 0xfffd, 0x9d26, 0xfffd, 0x694a, 0x63da, 0xfffd, 0x760d, 0xfffd, 0xfffd, 0x967d, 0xfffd, 0xfffd, 0x7662, 0x990a, 0x6a23, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x52 */ 0xfffd, 0x582f, 0xfffd, 0xfffd, 0x8b21, 0xfffd, 0xfffd, 0xfffd, 0x85e5, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x723a, 0xfffd, 0xfffd, 0xfffd, 0x9801, 0xfffd, 0x696d, 0x8449, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x91ab, 0xfffd, 0x92a5, 0xfffd, 0xfffd, 0xfffd, 0x9824, 0xfffd, 0x907a, 0xfffd, 0x5100, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x87fb, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x85dd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5104, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x61b6, 0x7fa9, 0xfffd, 0xfffd, 0x8a63, 0x8b70, 0x8abc, 0x8b6f, 0xfffd, 0xfffd, 0xfffd, 0x7e79, 0xfffd, 0x852d, 0xfffd, 0xfffd, 0xfffd, 0x9670, 0xfffd, 0xfffd, 0x9280, 0xfffd, 0xfffd, 0x98f2, 0xfffd, 0xfffd, 0x96b1, /* 0x53 */ 0xfffd, 0xfffd, 0x6afb, 0x5b30, 0x9df9, 0x61c9, 0x7e93, 0x7469, 0x87a2, 0x71df, 0x7192, 0x8805, 0xfffd, 0x8d0f, 0xfffd, 0xfffd, 0x7a4e, 0xfffd, 0xfffd, 0x55b2, 0x64c1, 0x50ad, 0xfffd, 0x7670, 0xfffd, 0xfffd, 0x8e34, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x512a, 0xfffd, 0x6182, 0xfffd, 0xfffd, 0x90f5, 0x923e, 0x7336, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8a98, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8f3f, 0x9918, 0xfffd, 0xfffd, 0x9b5a, 0xfffd, 0xfffd, 0x6f01, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8207, 0x5dbc, 0xfffd, 0xfffd, 0x8a9e, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9b31, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7344, 0xfffd, 0x8b7d, /* 0x54 */ 0xfffd, 0xfffd, 0xfffd, 0x9810, 0xfffd, 0x99ad, 0x9d1b, 0x6df5, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8f45, 0x5712, 0x54e1, 0x5713, 0xfffd, 0xfffd, 0x7de3, 0x9060, 0xfffd, 0x9858, 0xfffd, 0xfffd, 0xfffd, 0x7d04, 0xfffd, 0x8e8d, 0x9470, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x95b2, 0xfffd, 0x96f2, 0x9116, 0xfffd, 0x9695, 0xfffd, 0x904b, 0x85f4, 0x9196, 0x6688, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x96dc, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8f09, 0xfffd, 0xfffd, 0xfffd, 0x6522, 0x66ab, 0x8d0a, 0x8d1c, 0x81df, 0xfffd, 0xfffd, 0xfffd, 0x947f, 0xfffd, 0x68d7, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7ac8, 0xfffd, 0x8cac, 0x64c7, 0x5247, 0x6fa4, 0x8cca, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8d08, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8ecb, /* 0x55 */ 0x9358, 0x9598, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8a50, 0xfffd, 0x9f4b, 0xfffd, 0xfffd, 0x50b5, 0xfffd, 0xfffd, 0x6c08, 0xfffd, 0xfffd, 0xfffd, 0x76de, 0x65ac, 0x8f3e, 0x5d84, 0xfffd, 0xfffd, 0x68e7, 0xfffd, 0x6230, 0xfffd, 0xfffd, 0x7dbb, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5f35, 0xfffd, 0x6f32, 0xfffd, 0xfffd, 0x5e33, 0x8cec, 0xfffd, 0x8139, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8d99, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x87c4, 0x8f4d, 0xfffd, 0x937a, 0xfffd, 0x9019, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8c9e, 0x91dd, 0x5075, 0xfffd, 0xfffd, 0x8a3a, 0xfffd, 0xfffd, 0x93ae, 0x9663, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x56 */ 0x5e40, 0x7665, 0x912d, 0x8b49, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7e54, 0x8077, 0xfffd, 0xfffd, 0xfffd, 0x57f7, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8879, 0xfffd, 0x7d19, 0xfffd, 0x646f, 0x64f2, 0xfffd, 0xfffd, 0xfffd, 0x5e5f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8cea, 0xfffd, 0xfffd, 0x6eef, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9418, 0xfffd, 0x7d42, 0x7a2e, 0x816b, 0xfffd, 0xfffd, 0x8846, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8b05, 0xfffd, 0x8ef8, 0xfffd, 0xfffd, 0xfffd, 0x76ba, 0xfffd, 0x665d, 0x9a5f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8af8, 0x8a85, 0xfffd, 0xfffd, 0x71ed, 0xfffd, 0xfffd, 0x77da, 0x56d1, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8caf, 0x9444, 0x7bc9, /* 0x57 */ 0xfffd, 0xfffd, 0xfffd, 0x99d0, 0xfffd, 0xfffd, 0xfffd, 0x5c08, 0x78da, 0x8f49, 0xfffd, 0x8cfa, 0xfffd, 0x6a01, 0x838a, 0x88dd, 0x599d, 0xfffd, 0x58ef, 0x72c0, 0xfffd, 0x9310, 0xfffd, 0x8d05, 0x589c, 0x7db4, 0x8ac4, 0x6e96, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6fc1, 0xfffd, 0xfffd, 0x8cc7, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6f2c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7d9c, 0x7e3d, 0x7e31, 0x9112, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8a5b, 0xfffd, 0x7d44, 0x947d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x58 */ 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, 0xfffd, 0xfffd, 0x55c7, 0xfffd, 0xfffd, 0x5399, 0xfffd, 0x53b4, 0xfffd, 0xfffd, 0x9768, 0x8d0b, 0xfffd, 0xfffd, 0x532d, 0x5331, 0xfffd, 0x8cfe, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5244, 0xfffd, 0x528c, 0x5274, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x50b4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5000, 0x5096, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x59 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5115, 0xfffd, 0x5102, 0xfffd, 0x5114, 0x513c, 0x5137, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x50e8, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x50c2, 0x513b, 0x5110, 0x513a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x50c9, 0xfffd, 0xfffd, 0xfffd, 0x7cf4, 0xfffd, 0xfffd, 0x9ecc, 0xfffd, 0x56c5, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9cec, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x893b, 0x81e0, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x5a */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8a01, 0x8a10, 0x8a0c, 0x8a15, 0x8b33, 0x8a4e, 0x8a25, 0x8a41, 0x8a36, 0x8a46, 0x8a54, 0x8a58, 0x8a52, 0x8a86, 0x8a84, 0x8a7f, 0x8a70, 0x8a7c, 0x8a75, 0x8a6c, 0x8a6e, 0x8acd, 0x8ae2, 0x8a61, 0x8a9a, 0x8aa5, 0x8a91, 0x8a92, 0x8acf, 0x8ad1, 0x8ac9, 0x8adb, 0x8ad7, 0x8ac2, 0x8ab6, 0x8af6, 0x8aeb, 0x8b14, 0x8b01, 0x8ae4, 0x8aed, 0x8afc, 0x8af3, 0x8ae6, 0x8aee, 0x8ade, 0x8b28, 0x8b9c, 0x8b16, 0x8b1a, 0x8b10, 0x8b2b, 0x8b2d, 0x8b56, 0x8b59, 0x8b4e, 0x8b9e, 0x8b6b, 0x8b96, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9658, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x913a, 0xfffd, 0x9114, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9134, /* 0x5b */ 0xfffd, 0xfffd, 0x90df, 0xfffd, 0xfffd, 0x9136, 0xfffd, 0xfffd, 0x9106, 0x9148, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x82bb, 0xfffd, 0x52f1, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5df0, 0xfffd, 0x580a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x58d9, 0xfffd, 0xfffd, 0x58e2, 0xfffd, 0xfffd, 0xfffd, 0x58e0, 0xfffd, 0x58da, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x57e1, 0xfffd, 0xfffd, 0x584f, 0xfffd, 0xfffd, 0x5816, 0xfffd, 0xfffd, 0xfffd, 0x5852, 0x581d, 0x5864, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x5c */ 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, 0x858c, 0xfffd, 0xfffd, 0x8553, 0xfffd, 0xfffd, 0x85f6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x83a7, 0x8407, 0x84ef, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x82e7, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8622, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8526, 0xfffd, 0xfffd, 0x584b, 0x7162, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8558, 0x84fd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x854e, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8588, 0xfffd, 0xfffd, 0x85ba, 0xfffd, 0xfffd, 0xfffd, 0x7296, 0x6ece, /* 0x5d */ 0x8541, 0xfffd, 0x85ce, 0x8552, 0x84c0, 0x8452, 0x8464, 0xfffd, 0xfffd, 0x8494, 0x8435, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x859f, 0xfffd, 0xfffd, 0x8555, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9daf, 0x8493, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7e08, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8546, 0xfffd, 0xfffd, 0x8562, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x851e, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9a40, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x863a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x93a3, 0x8577, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x861e, 0xfffd, 0x85fa, /* 0x5e */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8604, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x85ea, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x861a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5969, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5c37, 0xfffd, 0x636b, 0x6476, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x649f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6451, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x645c, 0xfffd, 0xfffd, 0xfffd, 0x64b3, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6504, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6516, 0xfffd, 0xfffd, /* 0x5f */ 0xfffd, 0x64f7, 0x64fc, 0xfffd, 0x651b, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5630, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5638, 0x56c8, 0xfffd, 0x56a6, 0xfffd, 0xfffd, 0x5504, 0x54bc, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5680, 0xfffd, 0xfffd, 0xfffd, 0x565d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5660, 0xfffd, 0xfffd, 0x5635, 0x55f6, 0xfffd, 0xfffd, 0x5666, 0xfffd, 0xfffd, 0xfffd, 0x5672, 0xfffd, 0x568c, 0xfffd, 0xfffd, 0xfffd, 0x5665, 0xfffd, 0xfffd, 0x561c, 0xfffd, 0x562e, 0xfffd, 0xfffd, 0xfffd, 0x55e9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5616, 0xfffd, 0xfffd, 0xfffd, 0x56c0, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x60 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x560d, 0x56b3, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x56c1, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x566f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8f61, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x56b6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5695, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5707, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5e43, 0xfffd, 0xfffd, 0xfffd, 0x5e6c, 0x5e58, 0x5e57, /* 0x61 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5d87, 0xfffd, 0x5cf4, 0xfffd, 0xfffd, 0x5d50, 0xfffd, 0xfffd, 0xfffd, 0x5d2c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5da7, 0xfffd, 0x5da0, 0xfffd, 0xfffd, 0x5d97, 0x5d0d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5db8, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5d81, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5dd4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x540e, 0x5fa0, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7377, 0x7341, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x736a, 0xfffd, 0x733b, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x736b, 0xfffd, /* 0x62 */ 0xfffd, 0xfffd, 0xfffd, 0x7380, 0xfffd, 0xfffd, 0xfffd, 0x737c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x98e0, 0x9933, 0x98e9, 0x993c, 0x98ea, 0x98eb, 0x98ed, 0x98f4, 0x9909, 0x9911, 0x4f59, 0x991b, 0x9937, 0x993f, 0x9943, 0x9948, 0x9949, 0x994a, 0x994c, 0x9962, 0xfffd, 0x5ee1, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8ce1, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x61fa, 0x61ae, 0xfffd, 0x616a, 0xfffd, 0xfffd, 0x613e, 0x60b5, 0x6134, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x61cc, 0xfffd, 0x615f, 0x61e8, 0x60fb, 0x6137, 0xfffd, /* 0x63 */ 0xfffd, 0x60f2, 0xfffd, 0xfffd, 0x6173, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x611c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6192, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9582, 0x9586, 0x95c8, 0x958e, 0x9594, 0x958c, 0x95e5, 0x95ad, 0x95ab, 0x9b2e, 0x95ac, 0x95be, 0x95b6, 0x9b29, 0x95bf, 0x95bd, 0x95bc, 0x95c3, 0x95cb, 0x95d4, 0x95d0, 0x95d5, 0x95de, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7043, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6f59, 0xfffd, 0xfffd, 0xfffd, 0x7027, 0x7018, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6ffc, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6d87, /* 0x64 */ 0xfffd, 0xfffd, 0xfffd, 0x6d79, 0x6e5e, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6fae, 0xfffd, 0xfffd, 0xfffd, 0x700f, 0x6ef8, 0x6f6f, 0xfffd, 0xfffd, 0xfffd, 0x6df6, 0x6f7f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7006, 0xfffd, 0xfffd, 0x6fa0, 0xfffd, 0xfffd, 0xfffd, 0x700b, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7067, 0xfffd, 0xfffd, 0x7044, 0xfffd, 0x7005, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6f77, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7020, 0x701f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7032, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7028, /* 0x65 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x705d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9a2b, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9087, 0xfffd, 0x9015, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9090, 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, 0x5c68, 0xfffd, 0x5f33, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5af5, 0x5ad7, 0xfffd, /* 0x66 */ 0xfffd, 0xfffd, 0x5b00, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5a6d, 0x5b08, 0xfffd, 0x5b4c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5aa7, 0x5afb, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5b0b, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x5b21, 0x5b2a, 0xfffd, 0xfffd, 0xfffd, 0x5b19, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x99d4, 0x99df, 0x99d9, 0x9a36, 0x9a5b, 0x99d1, 0x99d8, 0x9a4d, 0x9a4a, 0x99e2, 0x9a6a, 0x9a0f, 0x9a0d, 0x9a05, 0x9a42, 0x9a2d, 0x9a16, 0x9a41, 0x9a2e, 0x9a38, 0x9a43, 0x9a44, 0x9a4f, 0x9a65, 0x9a64, 0x7cf9, 0x7d06, 0x7d02, 0x7d07, 0x7d08, 0x7e8a, /* 0x67 */ 0x7d1c, 0x7d15, 0x7d13, 0x7d3a, 0x7d32, 0x7d31, 0x7e10, 0x7d3c, 0x7d40, 0x7d3f, 0x7d5d, 0x7d4e, 0x7d73, 0x7d86, 0x7d83, 0x7d88, 0x7dbe, 0x7dba, 0x7dcb, 0x7dd4, 0x7dc4, 0x7d9e, 0x7dac, 0x7db9, 0x7da3, 0x7db0, 0x7dc7, 0x7dd9, 0x7dd7, 0x7df9, 0x7df2, 0x7e62, 0x7de6, 0x7df6, 0x7df1, 0x7e0b, 0x7de1, 0x7e09, 0x7e1d, 0x7e1f, 0x7e1e, 0x7e2d, 0x7e0a, 0x7e11, 0x7e7d, 0x7e39, 0x7e35, 0x7e32, 0x7e46, 0x7e45, 0x7e88, 0x7e5a, 0x7e52, 0x7e6e, 0x7e7e, 0x7e70, 0x7e6f, 0x7e98, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x74a3, 0x744b, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x74cf, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x980a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x74bd, 0x743f, 0x7489, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x68 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x74a6, 0xfffd, 0xfffd, 0xfffd, 0x74d4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x74da, 0xfffd, 0x97d9, 0x97de, 0x97dc, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x69aa, 0x6aea, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6898, 0xfffd, 0x68d6, 0x6a05, 0x689f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6adb, 0xfffd, 0x6af3, 0xfffd, 0xfffd, 0x6ae8, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6adf, 0xfffd, 0x6a89, 0xfffd, 0xfffd, 0x690f, 0x6a48, 0xfffd, 0x6968, 0xfffd, 0x69bf, 0xfffd, 0xfffd, 0xfffd, 0x6a3a, 0xfffd, 0x6a9c, 0xfffd, 0x6b12, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6b1e, 0xfffd, 0xfffd, 0x6add, 0x69e7, 0xfffd, /* 0x69 */ 0x6b0f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6b16, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6aec, 0x6ada, 0xfffd, 0x6af8, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6ab3, 0xfffd, 0x6ae7, 0xfffd, 0xfffd, 0x6aa3, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6ad3, 0xfffd, 0xfffd, 0xfffd, 0x6ade, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6ba4, 0xfffd, 0x6b9e, 0x6bae, 0xfffd, 0x6bab, 0xfffd, 0x6baf, 0xfffd, 0x8ed4, 0x8edb, 0x8ef2, 0x8efb, 0x8f64, 0x8ef9, 0x8efc, 0x8eeb, 0x8ee4, 0x8f62, 0x8efa, 0x8efe, 0x8f0a, 0x8f07, 0x8f05, 0x8f12, 0x8f26, 0x8f1e, /* 0x6a */ 0x8f1f, 0x8f1c, 0x8f33, 0x8f46, 0x8f54, 0xfffd, 0x6214, 0x6227, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x750c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x66c7, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x66c4, 0xfffd, 0xfffd, 0x6689, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x66d6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8cc1, 0x8cb0, 0x8cba, 0x8cbd, 0x8d04, 0x8cb2, 0x8cc5, 0x8d10, 0x8cd1, 0x8cda, 0x8cd5, 0x8ceb, 0x8ce7, 0x8cfb, 0x8998, 0x89ac, 0x89a1, 0x89bf, 0x89a6, 0x89af, 0x89b2, 0x89b7, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x6b */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6bff, 0xfffd, 0xfffd, 0x6c0c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6c2c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7258, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6727, 0x8156, 0xfffd, 0x81da, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x811b, 0xfffd, 0xfffd, 0xfffd, 0x81be, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8161, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x81cf, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x6c */ 0xfffd, 0xfffd, 0x6b5f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x98ae, 0x98af, 0x98b6, 0x98bc, 0x98c6, 0x98c8, 0xfffd, 0xfffd, 0x8f42, 0xfffd, 0xfffd, 0x9f4f, 0x6595, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x716c, 0x7152, 0xfffd, 0x7197, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x71c1, 0xfffd, 0xfffd, 0xfffd, 0x71dc, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x71fe, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x79b0, 0xfffd, 0xfffd, 0x798e, 0xfffd, 0xfffd, 0x79aa, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x6d */ 0x61df, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x6164, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x61e3, 0x6207, 0xfffd, 0xfffd, 0xfffd, 0x6fa9, 0xfffd, 0x78ef, 0xfffd, 0x78ad, 0xfffd, 0x7868, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x78b8, 0xfffd, 0xfffd, 0x792a, 0x7931, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7864, 0x78fd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x78e7, 0xfffd, 0xfffd, 0xfffd, 0x78e3, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9f95, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7798, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x775e, 0x77bc, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x6e */ 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, 0x7f86, 0xfffd, 0xfffd, 0x7f88, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x91d2, 0x91d3, 0x91d4, 0x91d9, 0x91d7, 0x91d5, 0x91f7, 0x91e7, 0x91e4, 0x9346, 0x91f5, 0x91f9, 0x9208, 0x9226, 0x9245, 0x9211, 0x9210, 0x9201, 0x9227, 0x9204, 0x9225, 0x9200, 0x923a, 0x9266, 0x9237, 0x9233, 0x9255, 0x923d, 0x9238, 0x925e, 0x926c, 0x926d, 0x923f, 0x9460, 0x9230, 0x9249, 0x9248, 0x924d, 0x922e, 0x9239, 0x9438, 0x92ac, 0x92a0, 0x927a, 0x92aa, 0x92ee, 0x92cf, 0x9403, 0x92e3, 0x943a, 0x92b1, 0x92a6, 0x93a7, 0x9296, 0x92cc, 0x92a9, 0x93f5, 0x9293, 0x927f, /* 0x6f */ 0x93a9, 0x929a, 0x931a, 0x92ab, 0x9283, 0x940b, 0x92a8, 0x92a3, 0x9412, 0x9338, 0x92f1, 0x93d7, 0x92e5, 0x92f0, 0x92ef, 0x92e8, 0x92bc, 0x92dd, 0x92f6, 0x9426, 0x9427, 0x92c3, 0x92df, 0x92e6, 0x9312, 0x9306, 0x9369, 0x931b, 0x9340, 0x9301, 0x9315, 0x932e, 0x9343, 0x9307, 0x9308, 0x931f, 0x9319, 0x9365, 0x9347, 0x9376, 0x9354, 0x9364, 0x93aa, 0x9370, 0x9384, 0x93e4, 0x93d8, 0x9428, 0x9387, 0x93cc, 0x9398, 0x93b8, 0x93bf, 0x93a6, 0x93b0, 0x93b5, 0x944c, 0x93e2, 0x93dc, 0x93dd, 0x93cd, 0x93de, 0x93c3, 0x93c7, 0x93d1, 0x9414, 0x941d, 0x93f7, 0x9465, 0x9413, 0x946d, 0x9420, 0x9479, 0x93f9, 0x9419, 0x944a, 0x9432, 0x943f, 0x9454, 0x9463, 0x937e, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x70 */ 0xfffd, 0xfffd, 0x7a61, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9ce9, 0x9cf6, 0x9d07, 0x9d06, 0x9d23, 0x9d87, 0x9e15, 0x9d1d, 0x9d1f, 0x9de5, 0x9d2f, 0x9dd9, 0x9d30, 0x9d42, 0x9e1e, 0x9d53, 0x9e1d, 0x9d60, 0x9d52, 0x9df3, 0x9d5c, 0x9d61, 0x9d93, 0x9d6a, 0x9d6f, 0x9d89, 0x9d98, 0x9d9a, 0x9dc0, 0x9da5, 0x9da9, 0x9dc2, 0x9dbc, 0x9e1a, 0x9dd3, 0x9dda, 0x9def, 0x9de6, 0x9df2, 0x9df8, 0x9e0c, 0x9dfa, 0x9e1b, 0xfffd, 0xfffd, 0x7664, 0x7658, 0xfffd, 0x7667, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7602, 0xfffd, 0xfffd, 0x7646, 0xfffd, 0xfffd, 0x7647, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7649, 0xfffd, 0x761e, 0xfffd, 0xfffd, 0x763b, 0xfffd, 0xfffd, /* 0x71 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x766d, 0xfffd, 0xfffd, 0x766e, 0xfffd, 0xfffd, 0x7669, 0xfffd, 0xfffd, 0xfffd, 0x7672, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7ac7, 0xfffd, 0xfffd, 0xfffd, 0x7ab6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8960, 0xfffd, 0xfffd, 0xfffd, 0x8933, 0xfffd, 0x895d, 0x8947, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8938, 0xfffd, 0x8964, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x76b8, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x802e, 0xfffd, 0xfffd, 0x802c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8079, 0xfffd, 0x8075, 0xfffd, 0xfffd, 0x9807, 0x980e, 0x980f, /* 0x72 */ 0x9821, 0x981c, 0x6f41, 0x9826, 0x9837, 0x984e, 0x9853, 0x9873, 0x9862, 0x9859, 0x9865, 0x986c, 0x9870, 0xfffd, 0xfffd, 0xfffd, 0x87e3, 0x8806, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8706, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8823, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x87f6, 0xfffd, 0xfffd, 0x86fa, 0x87ef, 0xfffd, 0x8784, 0xfffd, 0xfffd, 0xfffd, 0x8810, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x87c8, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8811, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x87bb, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x87ce, 0xfffd, /* 0x73 */ 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, 0x7f4c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7be4, 0xfffd, 0x7b67, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7c69, 0xfffd, 0xfffd, 0x7bf3, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7c00, 0x7bcb, 0xfffd, 0xfffd, 0xfffd, 0x7c5c, 0xfffd, 0x7c1e, 0xfffd, 0xfffd, 0x7c2b, 0xfffd, 0x7c23, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7c6a, 0xfffd, /* 0x74 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7c5f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8264, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x826b, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x88ca, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7fa5, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7cf2, 0x7cf6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7cdd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x7e36, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9ea9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8db2, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x75 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x91c5, 0x91c3, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9e7a, 0x8e89, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8e4c, 0xfffd, 0xfffd, 0xfffd, 0x8e92, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8e7a, 0x8e55, 0xfffd, 0x8e9a, 0x8e8b, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8e93, 0xfffd, 0xfffd, 0x8e91, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8ea1, 0x8e63, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8eaa, 0xfffd, 0xfffd, 0x8ea6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x89f4, 0xfffd, 0xfffd, /* 0x76 */ 0xfffd, 0xfffd, 0x89f6, 0xfffd, 0xfffd, 0x975a, 0xfffd, 0x9742, 0xfffd, 0xfffd, 0x973d, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9744, 0xfffd, 0xfffd, 0x9f54, 0x9f5f, 0x9f59, 0x9f60, 0x9f5c, 0x9f66, 0x9f6c, 0x9f6a, 0x9f77, 0x9efd, 0x9eff, 0x9f09, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x8b8e, 0xfffd, 0x947e, 0xfffd, 0x93e8, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9b77, 0x9b74, 0x9b81, 0x9b83, 0x9b8e, 0x9c78, 0x7a4c, 0x9b92, 0x9c5f, 0x9b90, 0x9bad, 0x9b9a, 0x9baa, 0x9b9e, 0x9c6d, 0x9bab, 0x9b9d, 0x9c58, 0x9bc1, 0x9c7a, 0x9c31, 0x9c39, 0x9c23, 0x9c37, 0x9bc0, 0x9bca, 0x9bc7, 0x9bfd, 0x9bd6, 0x9bea, 0x9beb, 0x9be1, 0x9be4, 0x9be7, 0x9bdd, 0x9be2, 0x9bf0, 0x9bdb, 0x9bf4, 0x9bd4, 0x9c5d, 0x9c08, 0x9c10, 0x9c0d, 0x9c12, 0x9c09, 0x9bff, 0x9c20, /* 0x77 */ 0x9c32, 0x9c2d, 0x9c28, 0x9c25, 0x9c29, 0x9c33, 0x9c3e, 0x9c48, 0x9c3b, 0x9c35, 0x9c45, 0x9c56, 0x9c54, 0x9c52, 0x9c67, 0xfffd, 0xfffd, 0x97c3, 0x97bd, 0xfffd, 0x97c9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9dbb, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9acf, 0xfffd, 0x9ad6, 0x9ad5, 0xfffd, 0xfffd, 0xfffd, 0x9b58, 0x9b4e, 0xfffd, 0xfffd, 0xfffd, 0x9957, 0x995c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9b22, 0xfffd, 0xfffd, 0x4e48, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x9ef7, 0xfffd, 0xfffd, 0x9ef2, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x78 */ 0x896c, 0x95c6, 0x9336, 0x5f46, 0x8514, 0x7e94, 0x5382, 0x51b2, 0x4e11, 0x9f63, 0x5679, 0x515a, 0x6dc0, 0x9f15, 0x6597, 0x5641, 0x9aee, 0x8303, 0x4e30, 0x8907, 0x5e72, 0x7a40, 0x98b3, 0x5e7f, 0x95a4, 0x9b0d, 0x5212, 0x8ff4, 0x5f59, 0x7a6b, 0x98e2, 0x51e0, 0x50a2, 0x4ef7, 0x8350, 0x8591, 0x5118, 0x636e, 0x6372, 0x524b, 0x5938, 0x774f, 0x8721, 0x814a, 0x7e8d, 0x91cc, 0x66c6, 0x5e18, 0x77ad, 0x9e75, 0x56c9, 0x9ef4, 0x6fdb, 0x61de, 0x77c7, 0x7030, 0x9eb5, 0x884a, 0x95e2, 0x82f9, 0x51ed, 0x6251, 0x4ec6, 0x6734, 0x97c6, 0x7c64, 0x7e34, 0x97a6, 0x9eaf, 0x786e, 0x820d, 0x672f, 0x677e, 0x56cc, 0x53f0, 0x98b1, 0x6aaf, 0x7f4e, 0x6d82, 0x7cf0, 0x4e07, 0x4fc2, 0x7e6b, 0x9e79, 0x56ae, 0x9b1a, 0x846f, 0x53f6, 0x90c1, 0x79a6, 0x7c72, 0x613f, 0x4e91, 0x9ad2, /* 0x79 */ 0x75c7, 0x96bb, 0x53ea, 0x7dfb, 0x88fd, 0x79cd, 0x7843, 0x7b51, 0x51c6, }; static int gb12345ext_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 == 0x21) || (c1 == 0x26) || (c1 == 0x28) || (c1 >= 0x30 && c1 <= 0x79)) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x21 && c2 < 0x7f) { unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); unsigned short wc = 0xfffd; if (i < 470) { if (i < 12) wc = gb12345ext_2uni_page21[i]; } else if (i < 658) { if (i < 555) wc = gb12345ext_2uni_page26[i-470]; } else if (i < 1410) { if (i < 690) wc = gb12345ext_2uni_page28[i-658]; } else { if (i < 8281) wc = gb12345ext_2uni_page30[i-1410]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short gb12345ext_2charset[2252] = { 0x283d, 0x283e, 0x283f, 0x283b, 0x2840, 0x283c, 0x212c, 0x7871, 0x7829, 0x7833, 0x7761, 0x4252, 0x787d, 0x5147, 0x785f, 0x7842, 0x6245, 0x4034, 0x4258, 0x7872, 0x4f40, 0x5876, 0x4129, 0x3256, 0x3876, 0x4347, 0x4257, 0x4e30, 0x3260, 0x556c, 0x5877, 0x4921, 0x3138, 0x7841, 0x5336, 0x342b, 0x5871, 0x552e, 0x494b, 0x4763, 0x594d, 0x3d76, 0x595d, 0x4748, 0x464d, 0x4e31, 0x3d44, 0x5947, 0x3c5b, 0x5247, 0x592f, 0x525a, 0x3f6b, 0x3c73, 0x594f, 0x5931, 0x592d, 0x7845, 0x3325, 0x5345, 0x3422, 0x5933, 0x5950, 0x594e, 0x5932, 0x3679, 0x782c, 0x413d, 0x7828, 0x7929, 0x3633, 0x7840, 0x785d, 0x3f2d, 0x783b, 0x5859, 0x5472, 0x7848, 0x3855, 0x3950, 0x585c, 0x3434, 0x3b2e, 0x3e67, 0x4175, 0x3974, 0x585b, 0x3d23, 0x3c41, 0x3e22, 0x362f, 0x4e71, 0x512b, 0x4a24, 0x404d, 0x4a46, 0x5b3d, 0x4078, 0x4830, 0x5850, 0x3b63, 0x5851, 0x4778, 0x502d, 0x7827, 0x5847, 0x325e, 0x5161, 0x4077, 0x5849, 0x324e, 0x3454, 0x7923, 0x786b, 0x7878, 0x6161, 0x5f43, 0x5431, 0x5f42, 0x4e4a, 0x4674, 0x5146, 0x4925, 0x4747, 0x3525, 0x5334, 0x473a, 0x5844, 0x4270, 0x4e58, 0x5f6f, 0x5f59, 0x4c3e, 0x6036, 0x453b, 0x5f75, 0x3322, 0x5f69, 0x3b29, 0x5f6b, 0x5025, 0x5f34, 0x5f58, 0x5f3c, 0x7830, 0x5f50, 0x5f55, 0x5f66, 0x5f5c, 0x6048, 0x5f60, 0x4567, 0x3656, 0x782b, 0x5f4c, 0x4f45, 0x5f62, 0x6060, 0x4476, 0x5f3f, 0x417c, 0x7875, 0x6037, 0x514f, 0x6053, 0x5f79, 0x603f, 0x4f79, 0x5966, 0x5f3d, 0x7853, 0x786a, 0x5676, 0x6070, 0x397a, 0x4e27, 0x5430, 0x5432, 0x4d3c, 0x4d45, 0x5b6b, 0x5634, 0x3c61, 0x5b51, 0x5b71, 0x5b76, 0x5222, 0x3128, 0x3321, 0x3f69, 0x5c63, 0x5b6e, 0x5b75, 0x4d3f, 0x4e6b, 0x5b77, 0x333e, 0x4735, 0x3566, 0x5739, 0x3669, 0x3758, 0x473d, 0x3f51, 0x4c33, 0x5139, 0x405d, 0x5b5b, 0x5b64, 0x3b35, 0x4222, 0x5b62, 0x5b5e, 0x3053, 0x5733, 0x3a78, 0x4a59, 0x434e, 0x7849, 0x3c50, 0x5e46, 0x3661, 0x3d31, 0x375c, 0x5731, 0x4226, 0x383e, 0x662b, 0x6634, 0x4268, 0x657d, 0x657c, 0x6635, 0x6623, 0x662c, 0x663f, 0x3d3f, 0x664d, 0x6648, 0x6649, 0x5324, 0x4974, 0x662e, 0x4b6f, 0x5127, 0x424f, 0x475e, 0x4a35, 0x447e, 0x4973, 0x5034, 0x3f6d, 0x3368, 0x3126, 0x3d2b, 0x5728, 0x5130, 0x3654, 0x353c, 0x5e4f, 0x4245, 0x3263, 0x6570, 0x4a74, 0x3854, 0x612d, 0x353a, 0x4f3f, 0x6141, 0x385a, 0x6134, 0x6130, 0x6150, 0x5538, 0x612b, 0x6140, 0x613d, 0x613b, 0x6149, 0x416b, 0x536c, 0x3f79, 0x424d, 0x615b, 0x5b4f, 0x7850, 0x4b27, 0x4a26, 0x554a, 0x3478, 0x5621, 0x6078, 0x607e, 0x607d, 0x5644, 0x3152, 0x306f, 0x607c, 0x7835, 0x3849, 0x3c38, 0x7838, 0x3f62, 0x436d, 0x3327, 0x6250, 0x374f, 0x3963, 0x422e, 0x4c7c, 0x6572, 0x5545, 0x7824, 0x352f, 0x4356, 0x4d64, 0x783d, 0x3a73, 0x3e36, 0x3453, 0x6162, 0x3834, 0x3339, 0x626a, 0x4346, 0x3671, 0x4455, 0x6322, 0x627c, 0x302e, 0x632b, 0x626b, 0x627d, 0x6269, 0x787c, 0x4c2c, 0x3252, 0x3251, 0x627a, 0x395f, 0x6d28, 0x6266, 0x4b4b, 0x4247, 0x6325, 0x476c, 0x5347, 0x3139, 0x412f, 0x463e, 0x6334, 0x352c, 0x375f, 0x4375, 0x6264, 0x4f5c, 0x5264, 0x3f52, 0x5326, 0x6278, 0x7856, 0x6d21, 0x6d2f, 0x627b, 0x334d, 0x4041, 0x3b33, 0x507c, 0x6263, 0x3e65, 0x4965, 0x4135, 0x6d30, 0x6a27, 0x6a28, 0x553d, 0x4f37, 0x785e, 0x502e, 0x4961, 0x5e51, 0x7846, 0x7847, 0x4928, 0x4255, 0x3c70, 0x516f, 0x3b53, 0x4b70, 0x3537, 0x4740, 0x5e62, 0x5e68, 0x4227, 0x563f, 0x3f59, 0x5e52, 0x3274, 0x404c, 0x4453, 0x5e58, 0x3527, 0x3226, 0x3827, 0x464b, 0x5e6c, 0x4c22, 0x4e4e, 0x3c71, 0x5335, 0x4230, 0x5471, 0x3b77, 0x3532, 0x3523, 0x3e5d, 0x3c37, 0x4462, 0x3177, 0x4521, 0x3869, 0x5640, 0x4029, 0x5f22, 0x305a, 0x4b53, 0x5f23, 0x4845, 0x5e73, 0x446c, 0x4223, 0x4039, 0x5e7c, 0x3273, 0x5f25, 0x4963, 0x545c, 0x424e, 0x4c2f, 0x3d41, 0x403f, 0x305c, 0x3550, 0x4a7d, 0x4132, 0x3150, 0x6c35, 0x782f, 0x5536, 0x364f, 0x4a31, 0x5667, 0x544e, 0x6a4d, 0x3329, 0x545d, 0x6a4a, 0x784f, 0x6a3c, 0x4f7e, 0x6a53, 0x3f75, 0x4939, 0x4a69, 0x3b61, 0x6b4a, 0x7868, 0x7860, 0x362b, 0x7869, 0x6845, 0x4c75, 0x6849, 0x6847, 0x5466, 0x3630, 0x553b, 0x6862, 0x516e, 0x3763, 0x6865, 0x5235, 0x3c2b, 0x683f, 0x4859, 0x6867, 0x3939, 0x4739, 0x687d, 0x3d30, 0x572e, 0x4056, 0x6848, 0x4225, 0x316a, 0x4a60, 0x5179, 0x4653, 0x4a77, 0x686b, 0x6863, 0x4745, 0x3b7a, 0x4d56, 0x685f, 0x3535, 0x686d, 0x3c6c, 0x6949, 0x786d, 0x6944, 0x447b, 0x3c77, 0x3971, 0x6956, 0x6935, 0x684e, 0x687c, 0x695a, 0x685d, 0x6946, 0x6853, 0x6840, 0x6934, 0x6850, 0x6937, 0x5323, 0x4038, 0x4828, 0x6921, 0x686f, 0x692d, 0x6879, 0x4755, 0x4537, 0x6c23, 0x3b36, 0x4b6a, 0x407a, 0x3969, 0x3250, 0x6966, 0x6964, 0x6969, 0x6967, 0x696b, 0x3c5f, 0x4931, 0x3f47, 0x4539, 0x6b27, 0x5531, 0x6b2a, 0x4678, 0x4762, 0x6b32, 0x6424, 0x786f, 0x637e, 0x782d, 0x4259, 0x5428, 0x6435, 0x4733, 0x4e50, 0x3262, 0x3b6b, 0x6425, 0x4c40, 0x573c, 0x3935, 0x3257, 0x4370, 0x3553, 0x5c7e, 0x3b26, 0x564d, 0x4978, 0x4231, 0x6430, 0x427a, 0x5366, 0x453d, 0x3a3a, 0x4130, 0x5755, 0x5547, 0x3d25, 0x3d2c, 0x7223, 0x4643, 0x3d60, 0x636d, 0x4873, 0x6431, 0x4023, 0x6464, 0x6436, 0x492c, 0x3d3d, 0x4054, 0x3d27, 0x6445, 0x5473, 0x6d34, 0x642b, 0x356d, 0x5747, 0x4528, 0x4a2a, 0x4522, 0x7855, 0x3c43, 0x4c4e, 0x4044, 0x4e2b, 0x3175, 0x3d26, 0x6378, 0x424b, 0x645e, 0x6442, 0x503a, 0x6449, 0x642f, 0x3174, 0x6372, 0x4124, 0x646c, 0x646b, 0x6371, 0x647e, 0x7858, 0x6472, 0x403d, 0x6363, 0x645c, 0x4877, 0x406c, 0x4c32, 0x6530, 0x4d65, 0x4250, 0x6459, 0x4e5a, 0x4c7e, 0x4e5e, 0x4136, 0x6c3f, 0x5c64, 0x3733, 0x6c3e, 0x532b, 0x6c41, 0x4848, 0x3363, 0x6c47, 0x3546, 0x4955, 0x4c4c, 0x6c4b, 0x532a, 0x3253, 0x5672, 0x3b62, 0x3d7d, 0x6c62, 0x4b38, 0x422f, 0x4043, 0x4e2a, 0x522f, 0x367b, 0x6b39, 0x4723, 0x5c7d, 0x363f, 0x4e7e, 0x5734, 0x4f41, 0x3137, 0x534c, 0x6178, 0x616f, 0x537c, 0x4a28, 0x3640, 0x6176, 0x617d, 0x447c, 0x3b71, 0x4154, 0x616e, 0x4a5e, 0x4c21, 0x4f57, 0x6228, 0x6224, 0x4f56, 0x6775, 0x6762, 0x4b76, 0x5328, 0x426a, 0x6776, 0x6761, 0x6828, 0x3b37, 0x6774, 0x476d, 0x6767, 0x682c, 0x6836, 0x6a31, 0x327a, 0x4436, 0x314f, 0x3b2d, 0x3531, 0x336b, 0x7921, 0x3e37, 0x7069, 0x3768, 0x5171, 0x7079, 0x342f, 0x4531, 0x707c, 0x4146, 0x706c, 0x706f, 0x7077, 0x705d, 0x3171, 0x5177, 0x705c, 0x5622, 0x705f, 0x712e, 0x5122, 0x7128, 0x712b, 0x5338, 0x4c31, 0x7132, 0x3722, 0x3028, 0x7164, 0x5665, 0x5535, 0x3e21, 0x3c60, 0x454c, 0x422c, 0x784a, 0x6d79, 0x6d6e, 0x4277, 0x7851, 0x6d7a, 0x7857, 0x5675, 0x3d43, 0x7927, 0x6d4c, 0x6d3a, 0x7866, 0x5162, 0x4b36, 0x6d38, 0x6d3f, 0x4837, 0x426b, 0x5729, 0x6d57, 0x6d53, 0x6d36, 0x6d4d, 0x3421, 0x302d, 0x3f73, 0x6d42, 0x4079, 0x372f, 0x6d43, 0x3b76, 0x6c75, 0x787a, 0x6c78, 0x4071, 0x6c72, 0x353b, 0x7926, 0x5656, 0x3346, 0x7836, 0x7655, 0x3b7d, 0x5331, 0x7023, 0x3b60, 0x4e48, 0x783e, 0x4e51, 0x4d5d, 0x476e, 0x7140, 0x3f7a, 0x345c, 0x474f, 0x713c, 0x546e, 0x4754, 0x4a7a, 0x3e3a, 0x314a, 0x7928, 0x7348, 0x3c63, 0x3d5a, 0x3736, 0x567e, 0x7366, 0x7346, 0x4938, 0x7359, 0x7365, 0x4228, 0x736c, 0x3c72, 0x7371, 0x736f, 0x4729, 0x4131, 0x403a, 0x336f, 0x736a, 0x7425, 0x417d, 0x7862, 0x7356, 0x737d, 0x4069, 0x4261, 0x787b, 0x7456, 0x3760, 0x4138, 0x7870, 0x744f, 0x5961, 0x7450, 0x6679, 0x3e40, 0x3c4d, 0x667b, 0x543c, 0x3a6c, 0x667a, 0x667c, 0x667d, 0x4852, 0x4e46, 0x4449, 0x4526, 0x6723, 0x343f, 0x6722, 0x4934, 0x563d, 0x3c36, 0x3757, 0x6721, 0x3744, 0x4f38, 0x6726, 0x6725, 0x4970, 0x495c, 0x6724, 0x6728, 0x672a, 0x6729, 0x5655, 0x5769, 0x306d, 0x672c, 0x3d61, 0x672b, 0x3d4a, 0x4267, 0x5124, 0x3878, 0x485e, 0x4d33, 0x4b3f, 0x672d, 0x3e78, 0x3e6e, 0x3073, 0x672f, 0x672e, 0x6730, 0x5065, 0x4b67, 0x3e2d, 0x575b, 0x6736, 0x3371, 0x6739, 0x4f5f, 0x6737, 0x4e2c, 0x673a, 0x3859, 0x4d78, 0x3141, 0x573a, 0x425a, 0x6738, 0x6732, 0x5540, 0x3442, 0x6731, 0x4360, 0x6735, 0x673b, 0x3d74, 0x6733, 0x424c, 0x5077, 0x6734, 0x673d, 0x3c6a, 0x673c, 0x3c29, 0x3650, 0x355e, 0x6745, 0x5435, 0x6741, 0x3160, 0x3b3a, 0x4365, 0x4e33, 0x6743, 0x673f, 0x4137, 0x6742, 0x673e, 0x7924, 0x5d53, 0x6746, 0x674b, 0x6744, 0x6727, 0x674c, 0x383f, 0x6747, 0x6749, 0x6748, 0x4f58, 0x4c50, 0x376c, 0x674a, 0x4b75, 0x575d, 0x6750, 0x7863, 0x674f, 0x746a, 0x4246, 0x674e, 0x575c, 0x3c28, 0x6752, 0x6751, 0x6755, 0x562f, 0x4949, 0x6754, 0x4846, 0x6740, 0x497e, 0x3b66, 0x7873, 0x3c6b, 0x6756, 0x6759, 0x6758, 0x3d49, 0x526f, 0x3c4c, 0x674d, 0x6757, 0x6753, 0x667e, 0x5078, 0x784d, 0x3278, 0x5327, 0x7826, 0x4f4b, 0x675a, 0x4042, 0x733f, 0x786e, 0x3723, 0x3055, 0x425e, 0x6e3c, 0x6e3f, 0x7447, 0x5265, 0x4f30, 0x474c, 0x716f, 0x716c, 0x4a25, 0x4e45, 0x412a, 0x344f, 0x4979, 0x4b4a, 0x7179, 0x4474, 0x5630, 0x7177, 0x4c7d, 0x417b, 0x4b60, 0x5032, 0x6b56, 0x554d, 0x784c, 0x4976, 0x6b4b, 0x6b61, 0x4454, 0x5657, 0x3326, 0x3774, 0x3d3a, 0x4465, 0x3528, 0x6b5a, 0x4527, 0x4133, 0x466a, 0x6b77, 0x4030, 0x6b4d, 0x5460, 0x5975, 0x4159, 0x4c28, 0x536b, 0x504b, 0x3e59, 0x3e49, 0x7867, 0x3255, 0x742f, 0x3d22, 0x7435, 0x3c68, 0x515e, 0x5b3b, 0x5c51, 0x785c, 0x7832, 0x7843, 0x572f, 0x3e25, 0x3c54, 0x5c48, 0x3b2a, 0x5c49, 0x4033, 0x4d72, 0x5d2b, 0x5236, 0x5d26, 0x5d27, 0x4e2d, 0x7877, 0x3b67, 0x5d3b, 0x5d2a, 0x3254, 0x5d25, 0x3847, 0x412b, 0x5c4a, 0x5c6a, 0x7825, 0x5d64, 0x3d2f, 0x5c60, 0x5271, 0x5d21, 0x5d5b, 0x5c71, 0x5d24, 0x5c3f, 0x5d35, 0x5c69, 0x5d5e, 0x3534, 0x4e5f, 0x4f74, 0x5d77, 0x5c76, 0x3c3b, 0x5c3c, 0x7844, 0x473e, 0x5d32, 0x3c76, 0x4878, 0x5c79, 0x4036, 0x5d23, 0x5255, 0x5229, 0x5e34, 0x544c, 0x5c42, 0x302a, 0x5d7e, 0x5e2d, 0x422b, 0x4b55, 0x463b, 0x5e3a, 0x5d7c, 0x5c57, 0x403c, 0x5d71, 0x425c, 0x3426, 0x4232, 0x3a45, 0x3f77, 0x724c, 0x7239, 0x784b, 0x4a34, 0x4f3a, 0x4e4f, 0x724f, 0x426c, 0x5329, 0x7277, 0x555d, 0x7265, 0x727d, 0x7231, 0x3275, 0x724d, 0x3366, 0x7249, 0x524f, 0x532c, 0x7232, 0x7253, 0x726e, 0x402f, 0x7243, 0x3946, 0x324f, 0x4279, 0x565a, 0x785a, 0x4a75, 0x4e40, 0x3365, 0x563b, 0x7441, 0x406f, 0x3239, 0x5730, 0x7925, 0x7834, 0x3f63, 0x714d, 0x715a, 0x5974, 0x7150, 0x3040, 0x714f, 0x7149, 0x715c, 0x4d60, 0x7821, 0x3344, 0x4f2e, 0x3c7b, 0x3966, 0x4359, 0x4a53, 0x6a68, 0x6a6a, 0x6a6c, 0x4757, 0x6a69, 0x6a6d, 0x6a6e, 0x6a6f, 0x3e75, 0x4040, 0x6a6b, 0x395b, 0x757c, 0x7623, 0x3425, 0x5a25, 0x3629, 0x383c, 0x3c46, 0x5136, 0x5a27, 0x4c56, 0x5a26, 0x5135, 0x5a28, 0x467d, 0x3c47, 0x366f, 0x5148, 0x4b4f, 0x3e77, 0x5a2b, 0x3743, 0x4968, 0x506d, 0x4b5f, 0x5a2d, 0x556f, 0x5a2c, 0x5a2e, 0x5a2a, 0x5529, 0x5a31, 0x5a2f, 0x4640, 0x5a30, 0x5767, 0x344a, 0x5a3c, 0x512f, 0x5268, 0x4a54, 0x4a2b, 0x326f, 0x5a38, 0x396e, 0x5a39, 0x5a35, 0x3b30, 0x3843, 0x4f6a, 0x5a37, 0x5a36, 0x5a34, 0x5a33, 0x566f, 0x5a32, 0x3f64, 0x484f, 0x5a3f, 0x5a40, 0x352e, 0x5355, 0x5a3d, 0x536f, 0x334f, 0x3d6b, 0x4e5c, 0x4e73, 0x5a3e, 0x4b50, 0x3b65, 0x4b35, 0x4b2d, 0x3f4e, 0x5a47, 0x374c, 0x526a, 0x3577, 0x5a46, 0x573b, 0x4c38, 0x5a43, 0x476b, 0x5a3a, 0x5a41, 0x5a42, 0x4142, 0x425b, 0x5a45, 0x5a44, 0x357d, 0x5a52, 0x5a3b, 0x5a4c, 0x5a50, 0x5033, 0x5a49, 0x5a4d, 0x5a51, 0x3b64, 0x5a4f, 0x5a48, 0x376d, 0x566e, 0x5168, 0x5a4e, 0x4535, 0x4431, 0x5a4b, 0x4e3d, 0x4c5c, 0x565f, 0x3b51, 0x4355, 0x5a57, 0x5a4a, 0x5a55, 0x3079, 0x472b, 0x5a56, 0x3d32, 0x503b, 0x5225, 0x5a53, 0x5a58, 0x437d, 0x5a59, 0x5a29, 0x3d77, 0x4321, 0x5624, 0x5a5c, 0x3c25, 0x5a5a, 0x4a36, 0x5a5b, 0x4c37, 0x4657, 0x5a5e, 0x526b, 0x5269, 0x4734, 0x3b24, 0x537e, 0x3641, 0x3164, 0x7645, 0x3277, 0x4843, 0x403e, 0x5a5f, 0x5a54, 0x5a5d, 0x4671, 0x3761, 0x3134, 0x556a, 0x383a, 0x3246, 0x3931, 0x4636, 0x3b75, 0x3737, 0x4c30, 0x3961, 0x5470, 0x567c, 0x6a5b, 0x6a5f, 0x3721, 0x3973, 0x3161, 0x4272, 0x347b, 0x6a5c, 0x3751, 0x4c79, 0x6a5d, 0x4333, 0x3a58, 0x6a5a, 0x4238, 0x415e, 0x3b5f, 0x6a60, 0x574a, 0x3c56, 0x5474, 0x6a62, 0x495e, 0x3176, 0x6a64, 0x6a63, 0x344d, 0x494d, 0x4562, 0x6259, 0x4f4d, 0x4274, 0x3c7a, 0x3833, 0x6a66, 0x564a, 0x6a65, 0x554b, 0x3644, 0x4035, 0x572c, 0x6a67, 0x393a, 0x487c, 0x5853, 0x6a5e, 0x5738, 0x5479, 0x545e, 0x584d, 0x4944, 0x532e, 0x6a61, 0x4a6a, 0x3853, 0x545f, 0x384f, 0x5554, 0x4777, 0x7475, 0x3c79, 0x533b, 0x7544, 0x754f, 0x7567, 0x754e, 0x753b, 0x336c, 0x7552, 0x543e, 0x755c, 0x7548, 0x7559, 0x7551, 0x7566, 0x345a, 0x7572, 0x756f, 0x477b, 0x3335, 0x547e, 0x396c, 0x3e7c, 0x5079, 0x696d, 0x696e, 0x486d, 0x6975, 0x6974, 0x696f, 0x5661, 0x6972, 0x6977, 0x6970, 0x6973, 0x6978, 0x3d4f, 0x697b, 0x697a, 0x5458, 0x6979, 0x697c, 0x3828, 0x4761, 0x413e, 0x6a22, 0x3b54, 0x697e, 0x6a21, 0x3975, 0x697d, 0x3132, 0x4256, 0x3c2d, 0x6a23, 0x4a64, 0x3778, 0x5537, 0x535f, 0x6c31, 0x4f3d, 0x542f, 0x6a24, 0x572a, 0x555e, 0x3d4e, 0x6a25, 0x3a64, 0x604e, 0x6976, 0x6971, 0x306c, 0x3447, 0x3168, 0x3167, 0x4529, 0x783c, 0x6549, 0x5562, 0x412c, 0x3d78, 0x544b, 0x397d, 0x346f, 0x4e25, 0x5137, 0x355d, 0x5436, 0x4a4a, 0x3359, 0x4728, 0x5121, 0x5245, 0x4149, 0x4275, 0x3b39, 0x6547, 0x315f, 0x425f, 0x654e, 0x7879, 0x5b23, 0x534a, 0x5b29, 0x4f67, 0x575e, 0x5a79, 0x5447, 0x354b, 0x5623, 0x415a, 0x3526, 0x5a7e, 0x5b26, 0x5a77, 0x5b2a, 0x544d, 0x3373, 0x523d, 0x3d34, 0x4470, 0x5046, 0x7527, 0x7526, 0x4a4d, 0x784e, 0x6e44, 0x6e45, 0x6e46, 0x6e49, 0x6e48, 0x3624, 0x6e47, 0x556b, 0x3576, 0x6e4c, 0x6e4b, 0x3730, 0x6e4e, 0x6e4a, 0x6e4f, 0x4725, 0x6e59, 0x6e55, 0x6e57, 0x6e50, 0x4446, 0x365b, 0x3933, 0x6e54, 0x6e53, 0x332e, 0x4525, 0x3e7b, 0x3846, 0x6e58, 0x6e51, 0x6e56, 0x6e6a, 0x6e66, 0x6e5d, 0x4165, 0x6e5c, 0x6e60, 0x6e6b, 0x6e5a, 0x6e5f, 0x534b, 0x6e64, 0x3c58, 0x6e52, 0x6e68, 0x6e67, 0x6e69, 0x322c, 0x6e5e, 0x472f, 0x432d, 0x4726, 0x6e61, 0x3227, 0x6e5b, 0x6e62, 0x6e63, 0x3d42, 0x6e6f, 0x3875, 0x6e7e, 0x5278, 0x6f25, 0x4d2d, 0x4f33, 0x6e7d, 0x6e79, 0x437a, 0x6f22, 0x4f4e, 0x6e6e, 0x6f28, 0x523f, 0x6e77, 0x6f27, 0x6e7b, 0x6e70, 0x6f24, 0x6e6d, 0x6e76, 0x4f7a, 0x5062, 0x4c60, 0x6f31, 0x4241, 0x6f36, 0x503f, 0x3135, 0x6e7a, 0x6e72, 0x3766, 0x6f32, 0x6f37, 0x6e74, 0x337a, 0x6f2d, 0x6f38, 0x6f30, 0x464c, 0x4871, 0x6e71, 0x6f2f, 0x6f2e, 0x6f2b, 0x6f33, 0x3e62, 0x3856, 0x6f3e, 0x6f3a, 0x6f42, 0x6f43, 0x5736, 0x6f39, 0x6f3f, 0x3438, 0x6f45, 0x6f23, 0x6f3c, 0x6f44, 0x3627, 0x472e, 0x3d75, 0x432a, 0x4e7d, 0x6f40, 0x346d, 0x423c, 0x434c, 0x7823, 0x6f2a, 0x6f3d, 0x4f47, 0x6f41, 0x6e4d, 0x6f47, 0x3978, 0x3646, 0x6f49, 0x5521, 0x364d, 0x6f4a, 0x6f46, 0x6f3b, 0x4742, 0x6f4c, 0x3c7c, 0x6f48, 0x5560, 0x6f71, 0x433e, 0x6f4d, 0x6f51, 0x3077, 0x4b78, 0x6f53, 0x4e59, 0x5d76, 0x6f56, 0x6e78, 0x6f21, 0x6f4b, 0x3864, 0x5572, 0x6f57, 0x4478, 0x6f58, 0x6f54, 0x6f55, 0x6f5f, 0x6f60, 0x4134, 0x6f52, 0x6f5d, 0x6f61, 0x6f2c, 0x6f4f, 0x6f5b, 0x6f5c, 0x6f5e, 0x3279, 0x3e35, 0x6f5a, 0x6f4e, 0x7649, 0x6e7c, 0x6f64, 0x6f6a, 0x6e73, 0x6f26, 0x414d, 0x6f29, 0x6f66, 0x6f62, 0x5653, 0x6f6b, 0x6f63, 0x6f68, 0x6f34, 0x6f35, 0x6f50, 0x412d, 0x6f6d, 0x4058, 0x4c7a, 0x6e6c, 0x6e75, 0x6f6e, 0x567d, 0x6f6c, 0x6f59, 0x3c78, 0x6f6f, 0x6e65, 0x6f70, 0x6f65, 0x6f67, 0x543f, 0x4f62, 0x4477, 0x6f69, 0x4260, 0x576a, 0x7647, 0x5464, 0x3324, 0x4345, 0x6345, 0x4941, 0x6346, 0x3155, 0x3f2a, 0x634a, 0x6348, 0x4872, 0x4f50, 0x3c64, 0x6349, 0x5522, 0x3a52, 0x3873, 0x7839, 0x3727, 0x396b, 0x4376, 0x634d, 0x634f, 0x634c, 0x5444, 0x6351, 0x514b, 0x5156, 0x6355, 0x6354, 0x6350, 0x6353, 0x6356, 0x7822, 0x6347, 0x402b, 0x6357, 0x403b, 0x6359, 0x6358, 0x635a, 0x3433, 0x3958, 0x635b, 0x327b, 0x785b, 0x634b, 0x5a6a, 0x4942, 0x5573, 0x5275, 0x3342, 0x423d, 0x5174, 0x3653, 0x3d57, 0x5449, 0x3c4a, 0x4b66, 0x4f55, 0x527e, 0x4224, 0x4125, 0x7922, 0x4b64, 0x4b2b, 0x337b, 0x5453, 0x406b, 0x4451, 0x5446, 0x3567, 0x4e6d, 0x762b, 0x7628, 0x7630, 0x4169, 0x7626, 0x584c, 0x392e, 0x7864, 0x7733, 0x7732, 0x7861, 0x7735, 0x4e24, 0x484d, 0x3a2b, 0x6838, 0x683a, 0x6839, 0x4f6c, 0x5233, 0x3625, 0x476a, 0x4f6e, 0x4b33, 0x717c, 0x506b, 0x676f, 0x4b4c, 0x717d, 0x717e, 0x5424, 0x4d67, 0x3064, 0x3659, 0x4644, 0x416c, 0x7222, 0x7221, 0x5243, 0x7224, 0x4d37, 0x3c55, 0x7225, 0x3e31, 0x4635, 0x4d47, 0x3f45, 0x4c62, 0x366e, 0x7226, 0x7227, 0x5155, 0x5438, 0x722a, 0x355f, 0x4060, 0x7229, 0x722b, 0x394b, 0x327c, 0x722c, 0x4f54, 0x722d, 0x422d, 0x7228, 0x4827, 0x3767, 0x6c29, 0x6c2a, 0x786c, 0x7837, 0x6c2b, 0x6c2c, 0x462e, 0x6c2d, 0x6c2e, 0x3749, 0x623b, 0x783f, 0x623d, 0x623f, 0x6240, 0x6241, 0x3739, 0x527b, 0x6242, 0x4b47, 0x3125, 0x4a4e, 0x3d48, 0x317d, 0x6243, 0x5178, 0x367c, 0x6244, 0x4459, 0x3676, 0x5360, 0x6246, 0x3d24, 0x4f5a, 0x395d, 0x623c, 0x6247, 0x623e, 0x4173, 0x6248, 0x6249, 0x4278, 0x624a, 0x624b, 0x624c, 0x4021, 0x624d, 0x3c22, 0x4844, 0x774f, 0x7750, 0x3276, 0x624e, 0x426d, 0x5426, 0x376b, 0x4d54, 0x335b, 0x5131, 0x3235, 0x5724, 0x6665, 0x3e54, 0x6660, 0x3c5d, 0x6666, 0x6662, 0x4a3b, 0x4d55, 0x6661, 0x426e, 0x6669, 0x3a27, 0x4266, 0x3f25, 0x3352, 0x666d, 0x666c, 0x466f, 0x666b, 0x6670, 0x462d, 0x6539, 0x666f, 0x6672, 0x4c5a, 0x6663, 0x4927, 0x6673, 0x4262, 0x5d6b, 0x6671, 0x666e, 0x6674, 0x6675, 0x477d, 0x6668, 0x6667, 0x6676, 0x3d3e, 0x5169, 0x3e2a, 0x6664, 0x5668, 0x423f, 0x6678, 0x6677, 0x666a, 0x3039, 0x7743, 0x787e, 0x4c65, 0x7746, 0x7745, 0x7831, 0x4b49, 0x783a, 0x7876, 0x775e, 0x3637, 0x4456, 0x6352, 0x634e, 0x5374, 0x774b, 0x774a, 0x5363, 0x4233, 0x7650, 0x764f, 0x7651, 0x7652, 0x7653, 0x7658, 0x312b, 0x7656, 0x765a, 0x765f, 0x765c, 0x765b, 0x765e, 0x7659, 0x4f4a, 0x7667, 0x7661, 0x7669, 0x4070, 0x7668, 0x7676, 0x766b, 0x7674, 0x7671, 0x766e, 0x7672, 0x766f, 0x7670, 0x3e28, 0x766c, 0x766d, 0x7673, 0x7675, 0x766a, 0x767d, 0x7678, 0x767c, 0x767a, 0x7679, 0x767b, 0x487a, 0x767e, 0x7665, 0x7724, 0x7723, 0x7725, 0x7722, 0x7663, 0x7721, 0x7726, 0x772a, 0x7666, 0x7664, 0x7729, 0x7727, 0x772b, 0x7728, 0x316e, 0x772e, 0x772d, 0x772c, 0x415b, 0x7660, 0x7677, 0x7657, 0x772f, 0x765d, 0x7654, 0x7662, 0x4471, 0x702f, 0x596c, 0x376f, 0x4379, 0x7030, 0x7032, 0x7031, 0x513b, 0x4d52, 0x5427, 0x7036, 0x7037, 0x7033, 0x516c, 0x513c, 0x7039, 0x703b, 0x3a68, 0x386b, 0x703c, 0x3e69, 0x7041, 0x703e, 0x7043, 0x366c, 0x7040, 0x7044, 0x7046, 0x4574, 0x7047, 0x4835, 0x7034, 0x7048, 0x7045, 0x7049, 0x704a, 0x704c, 0x704d, 0x5d3a, 0x3a57, 0x773d, 0x704f, 0x704b, 0x704e, 0x3c26, 0x7051, 0x4538, 0x703a, 0x7052, 0x7038, 0x7054, 0x7053, 0x7055, 0x7042, 0x7056, 0x5325, 0x7058, 0x7057, 0x7035, 0x7050, 0x7059, 0x703f, 0x703d, 0x7852, 0x7874, 0x753a, 0x3c6f, 0x514e, 0x4076, 0x4273, 0x746f, 0x7865, 0x7859, 0x4334, 0x5964, 0x3563, 0x3533, 0x7775, 0x7854, 0x7772, 0x763c, 0x763d, 0x763e, 0x782e, 0x466b, 0x552b, 0x6c34, 0x335d, 0x7633, 0x7635, 0x7637, 0x7634, 0x7636, 0x4164, 0x782a, 0x7638, 0x763a, 0x7639, 0x4823, 0x763b, 0x417a, 0x4553, 0x3928, 0x6d68, 0x396a, 0x2672, 0x2674, 0x2675, 0x2660, 0x2661, 0x2670, 0x2671, 0x2662, 0x2663, 0x266e, 0x266f, 0x2666, 0x2667, 0x2664, 0x2665, 0x2668, 0x2669, 0x266a, 0x266b, }; static const Summary16 gb12345ext_uni2indx_page01[23] = { /* 0x0100 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0110 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0200 }, /* 0x0200 */ { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0002 }, { 4, 0x0002 }, }; static const Summary16 gb12345ext_uni2indx_page1e[4] = { /* 0x1e00 */ { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x8000 }, }; static const Summary16 gb12345ext_uni2indx_page22[3] = { /* 0x2200 */ { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0020 }, }; static const Summary16 gb12345ext_uni2indx_page4e[1306] = { /* 0x4e00 */ { 7, 0x0080 }, { 8, 0x0002 }, { 9, 0x0000 }, { 9, 0x0001 }, { 10, 0x0100 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0004 }, { 12, 0x4002 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0040 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0080 }, /* 0x4f00 */ { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0200 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0040 }, { 18, 0x0040 }, { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0004 }, { 20, 0x0000 }, { 20, 0x0001 }, { 21, 0x0000 }, /* 0x5000 */ { 21, 0x0a41 }, { 25, 0x0002 }, { 26, 0x0800 }, { 27, 0x0000 }, { 27, 0x0200 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0030 }, { 30, 0x0000 }, { 30, 0x0340 }, { 33, 0x2004 }, { 35, 0x40b8 }, { 40, 0x0224 }, { 43, 0x4022 }, { 46, 0x0120 }, { 48, 0x0200 }, /* 0x5100 */ { 49, 0x0315 }, { 54, 0x8131 }, { 59, 0x0400 }, { 60, 0x1c84 }, { 65, 0x0000 }, { 65, 0x0404 }, { 67, 0x0200 }, { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0004 }, { 69, 0x2040 }, { 71, 0x0000 }, { 71, 0x2001 }, { 73, 0x0002 }, /* 0x5200 */ { 74, 0x0000 }, { 74, 0x0004 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0890 }, { 78, 0x0800 }, { 79, 0x4000 }, { 80, 0x0030 }, { 82, 0x3688 }, { 88, 0x0002 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0002 }, { 90, 0x6a20 }, { 95, 0x0004 }, { 96, 0x0122 }, /* 0x5300 */ { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0xa000 }, { 101, 0x0002 }, { 102, 0x0001 }, { 103, 0x0010 }, { 104, 0x0000 }, { 104, 0x0000 }, { 104, 0x0004 }, { 105, 0x0200 }, { 106, 0x2001 }, { 108, 0x0014 }, { 110, 0x0008 }, { 111, 0x0000 }, { 111, 0x0404 }, { 113, 0x0041 }, /* 0x5400 */ { 115, 0x4000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x1000 }, { 117, 0x0000 }, { 117, 0x0000 }, { 117, 0x0002 }, { 118, 0x0000 }, /* 0x5500 */ { 118, 0x0010 }, { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0x8000 }, { 120, 0x4008 }, { 122, 0x0000 }, { 122, 0x0000 }, { 122, 0x0000 }, { 122, 0x0000 }, { 122, 0x5400 }, { 125, 0x0004 }, { 126, 0x40c0 }, { 129, 0x0400 }, { 130, 0x0200 }, { 131, 0x0040 }, /* 0x5600 */ { 132, 0x2040 }, { 134, 0x10d0 }, { 138, 0xc200 }, { 141, 0x0121 }, { 144, 0x0002 }, { 145, 0x2000 }, { 146, 0x8061 }, { 150, 0x0314 }, { 154, 0x1081 }, { 157, 0x0220 }, { 159, 0x4140 }, { 162, 0x0058 }, { 165, 0x1327 }, { 172, 0x0002 }, { 173, 0x0000 }, { 173, 0x0000 }, /* 0x5700 */ { 173, 0x2880 }, { 176, 0x014c }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0002 }, { 181, 0x0080 }, /* 0x5800 */ { 182, 0x0420 }, { 184, 0x2040 }, { 186, 0x8000 }, { 187, 0x0012 }, { 189, 0x8c00 }, { 192, 0x0084 }, { 194, 0x0014 }, { 196, 0x0220 }, { 198, 0x0400 }, { 199, 0x1000 }, { 200, 0x4000 }, { 201, 0x4808 }, { 204, 0x0080 }, { 205, 0xc708 }, { 211, 0x8205 }, { 215, 0x2400 }, /* 0x5900 */ { 217, 0x0000 }, { 217, 0x0000 }, { 217, 0x0004 }, { 218, 0x4100 }, { 220, 0x0000 }, { 220, 0x0000 }, { 220, 0x5600 }, { 224, 0x0000 }, { 224, 0x0000 }, { 224, 0x2000 }, { 225, 0x0000 }, { 225, 0x0000 }, { 225, 0x0000 }, { 225, 0x0000 }, { 225, 0x0000 }, { 225, 0x0000 }, /* 0x5a00 */ { 225, 0x0000 }, { 225, 0x0000 }, { 225, 0x0000 }, { 225, 0x0000 }, { 225, 0x0002 }, { 226, 0x0000 }, { 226, 0x2040 }, { 228, 0x0000 }, { 228, 0x0000 }, { 228, 0x0000 }, { 228, 0x0080 }, { 229, 0x2000 }, { 230, 0x0000 }, { 230, 0x0080 }, { 231, 0x0000 }, { 231, 0x0820 }, /* 0x5b00 */ { 233, 0x1901 }, { 237, 0x0200 }, { 238, 0x0402 }, { 240, 0x0101 }, { 242, 0x1000 }, { 243, 0x0000 }, { 243, 0x0800 }, { 244, 0x8100 }, { 246, 0x0000 }, { 246, 0x0000 }, { 246, 0x0000 }, { 246, 0x0000 }, { 246, 0x0000 }, { 246, 0x0000 }, { 246, 0x1ac4 }, { 252, 0x0060 }, /* 0x5c00 */ { 254, 0x6980 }, { 259, 0x0000 }, { 259, 0x0000 }, { 259, 0x0080 }, { 260, 0x0000 }, { 260, 0x0000 }, { 260, 0x1114 }, { 264, 0x0000 }, { 264, 0x0000 }, { 264, 0x0000 }, { 264, 0x0002 }, { 265, 0x0000 }, { 265, 0x0000 }, { 265, 0x0000 }, { 265, 0x0000 }, { 265, 0x2050 }, /* 0x5d00 */ { 268, 0x2000 }, { 269, 0x0080 }, { 270, 0x1000 }, { 271, 0x0000 }, { 271, 0x0000 }, { 271, 0x0001 }, { 272, 0x0000 }, { 272, 0x0000 }, { 272, 0x0092 }, { 275, 0x0080 }, { 276, 0x0081 }, { 278, 0x1500 }, { 281, 0x0800 }, { 282, 0x0014 }, { 284, 0x0000 }, { 284, 0x0001 }, /* 0x5e00 */ { 285, 0x0000 }, { 285, 0x0100 }, { 286, 0x0820 }, { 288, 0x0048 }, { 290, 0x0009 }, { 292, 0x8180 }, { 295, 0x1808 }, { 298, 0xc204 }, { 302, 0x0000 }, { 302, 0x0000 }, { 302, 0x0800 }, { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x8000 }, { 304, 0x100f }, { 309, 0x0008 }, /* 0x5f00 */ { 310, 0x0000 }, { 310, 0x0000 }, { 310, 0x0000 }, { 310, 0x0028 }, { 312, 0x5140 }, { 316, 0x0200 }, { 317, 0x0000 }, { 317, 0x0000 }, { 317, 0x1000 }, { 318, 0x4002 }, { 320, 0x0201 }, { 322, 0x0200 }, { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0000 }, /* 0x6000 */ { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x0060 }, { 325, 0x0000 }, { 325, 0x0000 }, { 325, 0x0002 }, { 326, 0x0806 }, /* 0x6100 */ { 329, 0x0000 }, { 329, 0x1800 }, { 331, 0x0000 }, { 331, 0xc090 }, { 335, 0x0800 }, { 336, 0x8500 }, { 339, 0x4c18 }, { 344, 0x0048 }, { 346, 0x0404 }, { 348, 0x0407 }, { 352, 0x4810 }, { 355, 0x0044 }, { 357, 0x1280 }, { 360, 0xc000 }, { 362, 0x0108 }, { 364, 0x55c4 }, /* 0x6200 */ { 371, 0x0081 }, { 373, 0x0010 }, { 374, 0x0080 }, { 375, 0x0005 }, { 377, 0x0000 }, { 377, 0x0002 }, { 378, 0x0000 }, { 378, 0x0000 }, { 378, 0x0000 }, { 378, 0x0000 }, { 378, 0x0000 }, { 378, 0x0000 }, { 378, 0x0000 }, { 378, 0x0000 }, { 378, 0x0000 }, { 378, 0x0000 }, /* 0x6300 */ { 378, 0x0000 }, { 378, 0x0000 }, { 378, 0x0000 }, { 378, 0x4000 }, { 379, 0x0000 }, { 379, 0x0000 }, { 379, 0x4900 }, { 382, 0x0004 }, { 383, 0x0018 }, { 385, 0x0000 }, { 385, 0x0000 }, { 385, 0x0000 }, { 385, 0x0001 }, { 386, 0x0400 }, { 387, 0x4000 }, { 388, 0x0000 }, /* 0x6400 */ { 388, 0x2000 }, { 389, 0x0080 }, { 390, 0x0000 }, { 390, 0x0040 }, { 391, 0x0000 }, { 391, 0x9002 }, { 394, 0x8000 }, { 395, 0x0848 }, { 398, 0x0100 }, { 399, 0x8008 }, { 401, 0x0828 }, { 404, 0xc80c }, { 409, 0x0c92 }, { 414, 0x0410 }, { 416, 0x9001 }, { 419, 0x5c97 }, /* 0x6500 */ { 428, 0x8050 }, { 431, 0x2a50 }, { 436, 0x141c }, { 441, 0x0000 }, { 441, 0x0000 }, { 441, 0x0080 }, { 442, 0x0000 }, { 442, 0x0120 }, { 444, 0x000c }, { 446, 0x00a0 }, { 448, 0x1000 }, { 449, 0x0080 }, { 450, 0x0000 }, { 450, 0x0000 }, { 450, 0x0000 }, { 450, 0x0000 }, /* 0x6600 */ { 450, 0x0000 }, { 450, 0x0000 }, { 450, 0x0000 }, { 450, 0x0000 }, { 450, 0x0004 }, { 451, 0x2000 }, { 452, 0x0000 }, { 452, 0x0000 }, { 452, 0x0300 }, { 454, 0x0000 }, { 454, 0x0804 }, { 456, 0x0000 }, { 456, 0x02d0 }, { 460, 0x0040 }, { 461, 0x1001 }, { 463, 0x0100 }, /* 0x6700 */ { 464, 0x0008 }, { 465, 0x0000 }, { 465, 0x8080 }, { 467, 0x0010 }, { 468, 0x0000 }, { 468, 0x0000 }, { 468, 0x0000 }, { 468, 0x4002 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, /* 0x6800 */ { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0xa100 }, { 473, 0x0000 }, { 473, 0x0000 }, { 473, 0x0000 }, { 473, 0x80c0 }, { 476, 0x0080 }, { 477, 0x0000 }, /* 0x6900 */ { 477, 0x8000 }, { 478, 0x0000 }, { 478, 0x0000 }, { 478, 0x0000 }, { 478, 0x0400 }, { 479, 0x0008 }, { 480, 0x2100 }, { 482, 0x0020 }, { 483, 0x0000 }, { 483, 0x0000 }, { 483, 0x4400 }, { 485, 0x8000 }, { 486, 0x2800 }, { 488, 0x0000 }, { 488, 0x0080 }, { 489, 0x0008 }, /* 0x6a00 */ { 490, 0x0026 }, { 493, 0x4208 }, { 496, 0x0008 }, { 497, 0x0700 }, { 500, 0x0900 }, { 502, 0x8000 }, { 503, 0x0004 }, { 504, 0x0000 }, { 504, 0x0200 }, { 505, 0x1010 }, { 507, 0x800c }, { 510, 0x0908 }, { 513, 0x0008 }, { 514, 0xec08 }, { 520, 0x1580 }, { 524, 0x0908 }, /* 0x6b00 */ { 527, 0x8410 }, { 530, 0x4044 }, { 533, 0x0000 }, { 533, 0x2000 }, { 534, 0x0000 }, { 534, 0x8001 }, { 536, 0x0002 }, { 537, 0x0184 }, { 540, 0x0000 }, { 540, 0x4100 }, { 542, 0xc810 }, { 546, 0x0c04 }, { 549, 0x0040 }, { 550, 0x0000 }, { 550, 0x0000 }, { 550, 0x8000 }, /* 0x6c00 */ { 551, 0x1100 }, { 553, 0x0000 }, { 553, 0x1808 }, { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, /* 0x6d00 */ { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0000 }, { 556, 0x0200 }, { 557, 0x0084 }, { 559, 0x0000 }, { 559, 0x0000 }, { 559, 0x0000 }, { 559, 0x0001 }, { 560, 0x0000 }, { 560, 0x0400 }, { 561, 0x0460 }, /* 0x6e00 */ { 564, 0x0000 }, { 564, 0x0000 }, { 564, 0x1040 }, { 566, 0x4000 }, { 567, 0x0000 }, { 567, 0x4000 }, { 568, 0x8000 }, { 569, 0x0000 }, { 569, 0x0000 }, { 569, 0x2040 }, { 571, 0x0000 }, { 571, 0x0000 }, { 571, 0x5030 }, { 575, 0x0000 }, { 575, 0x9000 }, { 577, 0x8184 }, /* 0x6f00 */ { 581, 0x0002 }, { 582, 0x0400 }, { 583, 0x100c }, { 586, 0x8104 }, { 589, 0x0002 }, { 590, 0x0212 }, { 593, 0x8010 }, { 595, 0x8081 }, { 598, 0x00c1 }, { 601, 0x0080 }, { 602, 0x4211 }, { 606, 0x0002 }, { 607, 0x000a }, { 609, 0x8920 }, { 613, 0x0810 }, { 615, 0x5403 }, /* 0x7000 */ { 620, 0x8a60 }, { 625, 0xa120 }, { 629, 0x0181 }, { 632, 0x4005 }, { 635, 0x0018 }, { 637, 0x2122 }, { 641, 0x0098 }, { 644, 0x0000 }, { 644, 0x0000 }, { 644, 0x0000 }, { 644, 0x0000 }, { 644, 0x0000 }, { 644, 0x8000 }, { 645, 0x0000 }, { 645, 0x0000 }, { 645, 0x0010 }, /* 0x7100 */ { 646, 0x0000 }, { 646, 0x0000 }, { 646, 0x0002 }, { 647, 0x0000 }, { 647, 0x0200 }, { 648, 0x0004 }, { 649, 0x1204 }, { 652, 0x0000 }, { 652, 0x0000 }, { 652, 0x0084 }, { 654, 0x0000 }, { 654, 0x4002 }, { 656, 0x0102 }, { 658, 0x9204 }, { 662, 0x2040 }, { 664, 0x5010 }, /* 0x7200 */ { 667, 0x2000 }, { 668, 0x0801 }, { 670, 0x0000 }, { 670, 0x4404 }, { 673, 0x0000 }, { 673, 0x0100 }, { 674, 0x0000 }, { 674, 0x2000 }, { 675, 0x0000 }, { 675, 0x0040 }, { 676, 0x0084 }, { 678, 0x0000 }, { 678, 0x0001 }, { 679, 0x0000 }, { 679, 0x0000 }, { 679, 0x2200 }, /* 0x7300 */ { 681, 0x0000 }, { 681, 0x0000 }, { 681, 0x0000 }, { 681, 0x0840 }, { 683, 0x0032 }, { 686, 0x0000 }, { 686, 0x0d00 }, { 689, 0x1da5 }, { 697, 0x0001 }, { 698, 0x0000 }, { 698, 0x0000 }, { 698, 0x0000 }, { 698, 0x0000 }, { 698, 0x0000 }, { 698, 0x0000 }, { 698, 0x4000 }, /* 0x7400 */ { 699, 0x0000 }, { 699, 0x0000 }, { 699, 0x0000 }, { 699, 0x8000 }, { 700, 0x0800 }, { 701, 0x0000 }, { 701, 0x0608 }, { 704, 0x0000 }, { 704, 0x0200 }, { 705, 0x0000 }, { 705, 0x0048 }, { 707, 0x2001 }, { 709, 0x8400 }, { 711, 0x0410 }, { 713, 0x0000 }, { 713, 0x0000 }, /* 0x7500 */ { 713, 0x1000 }, { 714, 0x0000 }, { 714, 0x0008 }, { 715, 0x0000 }, { 715, 0x0000 }, { 715, 0x2000 }, { 716, 0x0804 }, { 718, 0x0040 }, { 719, 0x0080 }, { 720, 0x0000 }, { 720, 0x0000 }, { 720, 0x0000 }, { 720, 0x0080 }, { 721, 0x0200 }, { 722, 0x0000 }, { 722, 0x0000 }, /* 0x7600 */ { 722, 0x2804 }, { 725, 0x4000 }, { 726, 0x0082 }, { 728, 0x0800 }, { 729, 0x02c4 }, { 733, 0x8100 }, { 735, 0x72b4 }, { 743, 0x1007 }, { 747, 0x0000 }, { 747, 0x0400 }, { 748, 0x0000 }, { 748, 0x0500 }, { 750, 0x0000 }, { 750, 0x4000 }, { 751, 0x009a }, { 755, 0x0000 }, /* 0x7700 */ { 755, 0x0000 }, { 755, 0x0000 }, { 755, 0x0000 }, { 755, 0x0000 }, { 755, 0x8000 }, { 756, 0x4000 }, { 757, 0x0000 }, { 757, 0x0000 }, { 757, 0x0000 }, { 757, 0x4100 }, { 759, 0x2000 }, { 760, 0x1000 }, { 761, 0x0080 }, { 762, 0x0400 }, { 763, 0x8000 }, { 764, 0x0000 }, /* 0x7800 */ { 764, 0x0000 }, { 764, 0x0000 }, { 764, 0x0000 }, { 764, 0x0000 }, { 764, 0x0008 }, { 765, 0x0000 }, { 765, 0xc110 }, { 769, 0x0000 }, { 769, 0x0000 }, { 769, 0x0000 }, { 769, 0x2200 }, { 771, 0x1500 }, { 774, 0x0000 }, { 774, 0x0400 }, { 775, 0x8088 }, { 778, 0x2000 }, /* 0x7900 */ { 779, 0x4000 }, { 780, 0x0200 }, { 781, 0x1c40 }, { 785, 0x0002 }, { 786, 0x0000 }, { 786, 0x0000 }, { 786, 0x0000 }, { 786, 0x0000 }, { 786, 0x6000 }, { 788, 0x0000 }, { 788, 0x4440 }, { 791, 0x0003 }, { 793, 0x2000 }, { 794, 0x0000 }, { 794, 0x0000 }, { 794, 0x0000 }, /* 0x7a00 */ { 794, 0x0000 }, { 794, 0x0000 }, { 794, 0x4000 }, { 795, 0x0002 }, { 796, 0x7001 }, { 800, 0x0000 }, { 800, 0x0a06 }, { 804, 0x0000 }, { 804, 0x0000 }, { 804, 0x0000 }, { 804, 0x4600 }, { 807, 0x0440 }, { 809, 0x05b0 }, { 814, 0x0000 }, { 814, 0x0400 }, { 815, 0x0040 }, /* 0x7b00 */ { 816, 0x0000 }, { 816, 0x0000 }, { 816, 0x0000 }, { 816, 0x0000 }, { 816, 0x0040 }, { 817, 0x0002 }, { 818, 0x0080 }, { 819, 0x0000 }, { 819, 0x0800 }, { 820, 0x0000 }, { 820, 0x0000 }, { 820, 0x0000 }, { 820, 0x0a11 }, { 824, 0x0000 }, { 824, 0x0210 }, { 826, 0x0008 }, /* 0x7c00 */ { 827, 0x2001 }, { 829, 0x4000 }, { 830, 0x080a }, { 833, 0x6000 }, { 835, 0x1008 }, { 837, 0x9000 }, { 839, 0x5611 }, { 845, 0x0004 }, { 846, 0x0000 }, { 846, 0x0000 }, { 846, 0x0000 }, { 846, 0x0000 }, { 846, 0x0000 }, { 846, 0x6000 }, { 848, 0x0080 }, { 849, 0x4255 }, /* 0x7d00 */ { 855, 0x2bf5 }, { 865, 0x1eb9 }, { 874, 0x0002 }, { 875, 0x960f }, { 883, 0x4055 }, { 888, 0x6001 }, { 891, 0x0146 }, { 895, 0x024e }, { 900, 0x834a }, { 906, 0x5008 }, { 909, 0x380c }, { 914, 0xef1f }, { 926, 0x0c90 }, { 930, 0x6396 }, { 938, 0x934b }, { 946, 0x0a56 }, /* 0x7e00 */ { 952, 0x0f00 }, { 956, 0xe803 }, { 962, 0x6888 }, { 967, 0x62f6 }, { 976, 0x0060 }, { 978, 0x4434 }, { 983, 0xee04 }, { 990, 0x7209 }, { 996, 0xb500 }, { 1001, 0x1158 }, { 1006, 0x0000 }, { 1006, 0x0000 }, { 1006, 0x0000 }, { 1006, 0x0000 }, { 1006, 0x0000 }, { 1006, 0x0000 }, /* 0x7f00 */ { 1006, 0x0000 }, { 1006, 0x0000 }, { 1006, 0x0000 }, { 1006, 0x0000 }, { 1006, 0x5000 }, { 1008, 0x0000 }, { 1008, 0x0000 }, { 1008, 0x0081 }, { 1010, 0x0160 }, { 1013, 0x0000 }, { 1013, 0x0220 }, { 1015, 0x0000 }, { 1015, 0x0000 }, { 1015, 0x0004 }, { 1016, 0x0000 }, { 1016, 0x0200 }, /* 0x8000 */ { 1017, 0x0000 }, { 1017, 0x0000 }, { 1017, 0x5000 }, { 1019, 0x0000 }, { 1019, 0x0000 }, { 1019, 0x4040 }, { 1021, 0x8000 }, { 1022, 0x62ed }, { 1031, 0x0020 }, { 1032, 0x0000 }, { 1032, 0x0000 }, { 1032, 0x0000 }, { 1032, 0x0000 }, { 1032, 0x0000 }, { 1032, 0x0000 }, { 1032, 0x0000 }, /* 0x8100 */ { 1032, 0x0020 }, { 1033, 0x0800 }, { 1034, 0x0000 }, { 1034, 0x0200 }, { 1035, 0x4400 }, { 1037, 0x0040 }, { 1038, 0x0842 }, { 1041, 0x0100 }, { 1042, 0x0000 }, { 1042, 0x0400 }, { 1043, 0x0201 }, { 1045, 0xe000 }, { 1048, 0xa200 }, { 1051, 0x8500 }, { 1054, 0x0101 }, { 1056, 0x0400 }, /* 0x8200 */ { 1057, 0x2780 }, { 1062, 0x0000 }, { 1062, 0x0000 }, { 1062, 0x0000 }, { 1062, 0x0000 }, { 1062, 0x0200 }, { 1063, 0x0850 }, { 1066, 0x0082 }, { 1068, 0x0000 }, { 1068, 0x0000 }, { 1068, 0x0000 }, { 1068, 0x0800 }, { 1069, 0x0000 }, { 1069, 0x0000 }, { 1069, 0x0080 }, { 1070, 0x0200 }, /* 0x8300 */ { 1071, 0x0008 }, { 1072, 0x0000 }, { 1072, 0x0000 }, { 1072, 0x0000 }, { 1072, 0x0000 }, { 1072, 0x0001 }, { 1073, 0x0000 }, { 1073, 0x0000 }, { 1073, 0x0400 }, { 1074, 0x0040 }, { 1075, 0x0084 }, { 1077, 0x0000 }, { 1077, 0x0000 }, { 1077, 0x0000 }, { 1077, 0x8000 }, { 1078, 0x0000 }, /* 0x8400 */ { 1078, 0x0480 }, { 1080, 0x0000 }, { 1080, 0x1000 }, { 1081, 0x0020 }, { 1082, 0x0200 }, { 1083, 0x0004 }, { 1084, 0x8050 }, { 1087, 0x0080 }, { 1088, 0x0000 }, { 1088, 0x0018 }, { 1090, 0x0000 }, { 1090, 0x1000 }, { 1091, 0x0801 }, { 1093, 0x0000 }, { 1093, 0xc000 }, { 1095, 0x2000 }, /* 0x8500 */ { 1096, 0x0000 }, { 1096, 0x4010 }, { 1098, 0x2048 }, { 1101, 0x0000 }, { 1101, 0x4042 }, { 1104, 0x012c }, { 1108, 0x2604 }, { 1112, 0x0080 }, { 1113, 0x1500 }, { 1116, 0x8012 }, { 1119, 0x0240 }, { 1121, 0x0400 }, { 1122, 0x6000 }, { 1124, 0x2000 }, { 1125, 0x0420 }, { 1127, 0x0650 }, /* 0x8600 */ { 1131, 0x08d0 }, { 1135, 0x4400 }, { 1137, 0x2004 }, { 1139, 0x8400 }, { 1141, 0x0000 }, { 1141, 0x9020 }, { 1144, 0x0080 }, { 1145, 0x0000 }, { 1145, 0x0000 }, { 1145, 0x0000 }, { 1145, 0x0000 }, { 1145, 0x0000 }, { 1145, 0x0000 }, { 1145, 0x0000 }, { 1145, 0x0000 }, { 1145, 0x0400 }, /* 0x8700 */ { 1146, 0x0040 }, { 1147, 0x0000 }, { 1147, 0x0002 }, { 1148, 0x0000 }, { 1148, 0x0000 }, { 1148, 0x0020 }, { 1149, 0x0040 }, { 1150, 0x0100 }, { 1151, 0x0010 }, { 1152, 0x4000 }, { 1153, 0x0004 }, { 1154, 0x0800 }, { 1155, 0x4110 }, { 1158, 0x0000 }, { 1158, 0x9008 }, { 1161, 0x0844 }, /* 0x8800 */ { 1164, 0x0060 }, { 1166, 0x8003 }, { 1169, 0x0008 }, { 1170, 0x0842 }, { 1173, 0x0440 }, { 1175, 0x2808 }, { 1178, 0x0000 }, { 1178, 0x0200 }, { 1179, 0x0000 }, { 1179, 0x0000 }, { 1179, 0x0000 }, { 1179, 0x0000 }, { 1179, 0x8400 }, { 1181, 0x3000 }, { 1183, 0x0000 }, { 1183, 0x2000 }, /* 0x8900 */ { 1184, 0x0080 }, { 1185, 0x0000 }, { 1185, 0x0000 }, { 1185, 0x090c }, { 1189, 0x0080 }, { 1190, 0x2040 }, { 1192, 0x9411 }, { 1197, 0x0004 }, { 1198, 0x8800 }, { 1200, 0x0148 }, { 1203, 0x9442 }, { 1208, 0xa484 }, { 1213, 0x0001 }, { 1214, 0x0000 }, { 1214, 0x0000 }, { 1214, 0x0150 }, /* 0x8a00 */ { 1217, 0x550e }, { 1224, 0xa969 }, { 1232, 0x2428 }, { 1236, 0x0452 }, { 1240, 0x4042 }, { 1243, 0x4935 }, { 1250, 0x7a4e }, { 1259, 0x902f }, { 1266, 0x20f0 }, { 1271, 0x4526 }, { 1277, 0x117b }, { 1285, 0x9245 }, { 1291, 0xaa94 }, { 1298, 0x58c6 }, { 1305, 0x68d4 }, { 1312, 0x55ca }, /* 0x8b00 */ { 1320, 0x4437 }, { 1327, 0x2ed1 }, { 1335, 0x3902 }, { 1340, 0x4208 }, { 1343, 0xc200 }, { 1346, 0x1740 }, { 1351, 0x8800 }, { 1353, 0x2091 }, { 1357, 0x4401 }, { 1360, 0x506c }, { 1366, 0x0000 }, { 1366, 0x0000 }, { 1366, 0x0000 }, { 1366, 0x0000 }, { 1366, 0x0000 }, { 1366, 0x0000 }, /* 0x8c00 */ { 1366, 0x0000 }, { 1366, 0x0000 }, { 1366, 0x0000 }, { 1366, 0x0000 }, { 1366, 0x0100 }, { 1367, 0x0001 }, { 1368, 0x0000 }, { 1368, 0x0000 }, { 1368, 0x0000 }, { 1368, 0x6000 }, { 1370, 0x9f87 }, { 1380, 0xbddd }, { 1392, 0x05bf }, { 1401, 0x542e }, { 1408, 0x3cdf }, { 1419, 0x7c10 }, /* 0x8d00 */ { 1425, 0xad30 }, { 1432, 0x1841 }, { 1436, 0x0000 }, { 1436, 0x0000 }, { 1436, 0x0000 }, { 1436, 0x0000 }, { 1436, 0x0000 }, { 1436, 0x0000 }, { 1436, 0x0000 }, { 1436, 0x0220 }, { 1438, 0x0100 }, { 1439, 0x0004 }, { 1440, 0x0000 }, { 1440, 0x0000 }, { 1440, 0x0000 }, { 1440, 0x0000 }, /* 0x8e00 */ { 1440, 0x0000 }, { 1440, 0x0001 }, { 1441, 0x0000 }, { 1441, 0x0010 }, { 1442, 0x1000 }, { 1443, 0x0020 }, { 1444, 0x0008 }, { 1445, 0x0400 }, { 1446, 0x2e00 }, { 1450, 0x040e }, { 1454, 0x0462 }, { 1458, 0x0000 }, { 1458, 0x3c01 }, { 1463, 0x8814 }, { 1467, 0x0810 }, { 1469, 0x5f04 }, /* 0x8f00 */ { 1476, 0x06a8 }, { 1481, 0xf834 }, { 1489, 0x8660 }, { 1494, 0xc908 }, { 1499, 0x6274 }, { 1506, 0x8010 }, { 1508, 0x0016 }, { 1511, 0x0000 }, { 1511, 0x0000 }, { 1511, 0x0000 }, { 1511, 0xe040 }, { 1515, 0x0004 }, { 1516, 0x0000 }, { 1516, 0x0000 }, { 1516, 0x0000 }, { 1516, 0x0010 }, /* 0x9000 */ { 1517, 0x0000 }, { 1517, 0x0220 }, { 1519, 0x0008 }, { 1520, 0x0004 }, { 1521, 0x4800 }, { 1523, 0x5030 }, { 1527, 0x0201 }, { 1529, 0x1584 }, { 1534, 0x8492 }, { 1539, 0x0001 }, { 1540, 0x0000 }, { 1540, 0x0000 }, { 1540, 0x0002 }, { 1541, 0x8000 }, { 1542, 0x0000 }, { 1542, 0x0020 }, /* 0x9100 */ { 1543, 0x0240 }, { 1545, 0x0054 }, { 1548, 0x2080 }, { 1550, 0x0455 }, { 1555, 0x0100 }, { 1556, 0x0000 }, { 1556, 0x0000 }, { 1556, 0x0000 }, { 1556, 0x0000 }, { 1556, 0x1040 }, { 1558, 0x1800 }, { 1560, 0x0000 }, { 1560, 0x182b }, { 1566, 0x23bc }, { 1574, 0x0298 }, { 1578, 0x06a0 }, /* 0x9200 */ { 1582, 0x6313 }, { 1589, 0x4033 }, { 1594, 0x40e8 }, { 1599, 0xe799 }, { 1609, 0x2321 }, { 1614, 0x4ca2 }, { 1620, 0x3044 }, { 1624, 0x8d00 }, { 1628, 0x0029 }, { 1631, 0x154a }, { 1637, 0x1f69 }, { 1646, 0x1a82 }, { 1651, 0x90aa }, { 1657, 0xa004 }, { 1660, 0xe578 }, { 1669, 0x1143 }, /* 0x9300 */ { 1674, 0x01c2 }, { 1678, 0x8f25 }, { 1686, 0xc945 }, { 1693, 0x014c }, { 1697, 0x28cb }, { 1704, 0x0910 }, { 1707, 0x1230 }, { 1711, 0x4461 }, { 1716, 0x0494 }, { 1720, 0x0140 }, { 1722, 0x56cc }, { 1730, 0x8129 }, { 1735, 0x3188 }, { 1740, 0xf182 }, { 1747, 0x0116 }, { 1751, 0x02a0 }, /* 0x9400 */ { 1754, 0x0808 }, { 1756, 0x231d }, { 1763, 0x41c1 }, { 1768, 0x852c }, { 1774, 0x1410 }, { 1777, 0x0014 }, { 1779, 0x2029 }, { 1783, 0xf285 }, { 1791, 0x0000 }, { 1791, 0x0000 }, { 1791, 0x0000 }, { 1791, 0x0000 }, { 1791, 0x0000 }, { 1791, 0x0000 }, { 1791, 0x0000 }, { 1791, 0x0000 }, /* 0x9500 */ { 1791, 0x0000 }, { 1791, 0x0000 }, { 1791, 0x0000 }, { 1791, 0x0000 }, { 1791, 0x0000 }, { 1791, 0x0000 }, { 1791, 0x0000 }, { 1791, 0x0080 }, { 1792, 0xda4d }, { 1801, 0x011a }, { 1805, 0x3b3a }, { 1814, 0xfa44 }, { 1822, 0x1d48 }, { 1828, 0x5071 }, { 1834, 0x0026 }, { 1837, 0x0000 }, /* 0x9600 */ { 1837, 0x0000 }, { 1837, 0x0000 }, { 1837, 0x0000 }, { 1837, 0x0000 }, { 1837, 0x0000 }, { 1837, 0x2100 }, { 1839, 0x0008 }, { 1840, 0x2109 }, { 1844, 0x4400 }, { 1846, 0x0820 }, { 1848, 0x0500 }, { 1850, 0x0912 }, { 1854, 0x0000 }, { 1854, 0x1a40 }, { 1858, 0x000c }, { 1860, 0x0804 }, /* 0x9700 */ { 1862, 0x0000 }, { 1862, 0x0000 }, { 1862, 0x0080 }, { 1863, 0x2000 }, { 1864, 0x0114 }, { 1867, 0x0400 }, { 1868, 0x0100 }, { 1869, 0x0000 }, { 1869, 0x8000 }, { 1870, 0x0000 }, { 1870, 0x0040 }, { 1871, 0x2000 }, { 1872, 0x1a48 }, { 1877, 0x5208 }, { 1881, 0x0000 }, { 1881, 0x8000 }, /* 0x9800 */ { 1882, 0xd5ee }, { 1893, 0x118f }, { 1900, 0x2052 }, { 1904, 0x2981 }, { 1909, 0x7040 }, { 1913, 0x4b18 }, { 1919, 0x98a4 }, { 1925, 0x001b }, { 1929, 0x0000 }, { 1929, 0x0000 }, { 1929, 0xc100 }, { 1932, 0x104a }, { 1936, 0x0150 }, { 1939, 0x0800 }, { 1940, 0xae05 }, { 1947, 0x7014 }, /* 0x9900 */ { 1952, 0x1628 }, { 1957, 0x490e }, { 1963, 0x0102 }, { 1965, 0xd088 }, { 1970, 0x1f28 }, { 1977, 0x5086 }, { 1982, 0x0004 }, { 1983, 0x0000 }, { 1983, 0x0000 }, { 1983, 0x0000 }, { 1983, 0x7000 }, { 1986, 0x001a }, { 1989, 0x0002 }, { 1990, 0xab37 }, { 2000, 0x2006 }, { 2003, 0x8002 }, /* 0x9a00 */ { 2005, 0xe022 }, { 2010, 0x0240 }, { 2012, 0x6800 }, { 2015, 0x41c1 }, { 2020, 0xa43f }, { 2029, 0x8ca0 }, { 2034, 0x0434 }, { 2038, 0x0000 }, { 2038, 0x0000 }, { 2038, 0x0000 }, { 2038, 0x8000 }, { 2039, 0x0000 }, { 2039, 0x8000 }, { 2040, 0x0074 }, { 2044, 0x4000 }, { 2045, 0x0000 }, /* 0x9b00 */ { 2045, 0x2040 }, { 2047, 0x0400 }, { 2048, 0x42a4 }, { 2053, 0x0002 }, { 2054, 0x4000 }, { 2055, 0x0500 }, { 2057, 0x8000 }, { 2058, 0x0090 }, { 2060, 0x400a }, { 2063, 0x6407 }, { 2069, 0x6c00 }, { 2073, 0x0000 }, { 2073, 0x0683 }, { 2078, 0x2850 }, { 2082, 0x0d96 }, { 2089, 0xa011 }, /* 0x9c00 */ { 2093, 0x2300 }, { 2096, 0x000d }, { 2099, 0x2329 }, { 2105, 0x4aae }, { 2113, 0x0320 }, { 2116, 0xa1d4 }, { 2123, 0x2080 }, { 2125, 0x0500 }, { 2127, 0x0000 }, { 2127, 0x0000 }, { 2127, 0x0000 }, { 2127, 0x0000 }, { 2127, 0x0000 }, { 2127, 0x0000 }, { 2127, 0x1220 }, { 2130, 0x0058 }, /* 0x9d00 */ { 2133, 0x02c0 }, { 2136, 0xa820 }, { 2140, 0x8148 }, { 2144, 0x8801 }, { 2147, 0x0004 }, { 2148, 0x300e }, { 2153, 0x9403 }, { 2158, 0x0004 }, { 2159, 0x0280 }, { 2161, 0x0508 }, { 2164, 0x8220 }, { 2167, 0x1810 }, { 2170, 0x0015 }, { 2173, 0x0688 }, { 2177, 0x8060 }, { 2180, 0x070c }, /* 0x9e00 */ { 2185, 0x1000 }, { 2186, 0x6c20 }, { 2191, 0x0000 }, { 2191, 0x0000 }, { 2191, 0x0000 }, { 2191, 0x0000 }, { 2191, 0x0000 }, { 2191, 0x3620 }, { 2196, 0x0000 }, { 2196, 0x0080 }, { 2197, 0x8220 }, { 2200, 0x2020 }, { 2202, 0x1000 }, { 2203, 0x4000 }, { 2204, 0x0100 }, { 2205, 0xa094 }, /* 0x9f00 */ { 2210, 0x0200 }, { 2211, 0x0020 }, { 2212, 0x0000 }, { 2212, 0x0000 }, { 2212, 0x8c00 }, { 2215, 0x9214 }, { 2220, 0x144b }, { 2226, 0x0084 }, { 2228, 0x2000 }, { 2229, 0x1031 }, }; static const Summary16 gb12345ext_uni2indx_pagefe[5] = { /* 0xfe00 */ { 2233, 0x0000 }, { 2233, 0x0000 }, { 2233, 0x0000 }, { 2233, 0xfffa }, { 2247, 0x001f }, }; static int gb12345ext_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc >= 0x0100 && wc < 0x0270) summary = &gb12345ext_uni2indx_page01[(wc>>4)-0x010]; else if (wc >= 0x1e00 && wc < 0x1e40) summary = &gb12345ext_uni2indx_page1e[(wc>>4)-0x1e0]; else if (wc >= 0x2200 && wc < 0x2230) summary = &gb12345ext_uni2indx_page22[(wc>>4)-0x220]; else if (wc >= 0x4e00 && wc < 0x9fa0) summary = &gb12345ext_uni2indx_page4e[(wc>>4)-0x4e0]; else if (wc >= 0xfe00 && wc < 0xfe50) summary = &gb12345ext_uni2indx_pagefe[(wc>>4)-0xfe0]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' 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); c = gb12345ext_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/gb18030.h000066400000000000000000000343311252300335000240660ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2005 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GB18030 */ /* * GB18030, as specified in the GB18030 standard, is an extension of GBK. * * In what follows, page numbers refer to the GB18030 standard (second * printing). * * * It consists of the following parts: * * One-byte range: * ASCII p. 2 0x{00..7F} * * Two-byte range: * GBK part 1 p. 10..12 0x{A1..A9}{A1..FE} * GBK part 2 p. 13..36 0x{B0..F7}{A1..FE} * GBK part 3 p. 37..52 0x{81..A0}{40..7E,80..FE} * GBK part 4 p. 53..81 0x{AA..FE}{40..7E,80..A0} * GBK part 5 p. 82 0x{A8..A9}{40..7E,80..A0} * UDA part 1 p. 83..84 0x{AA..AF}{A1..FE} U+E000..U+E233 * UDA part 2 p. 85..87 0x{F8..FE}{A1..FE} U+E234..U+E4C5 * UDA part 3 p. 88..90 0x{A1..A7}{40..7E,80..A0} U+E4C6..U+E765 * * Four-byte range: * BMP rest p. 94..283 0x{81..84}{30..39}{81..FE}{30..39} * rest of U+0080..U+FFFF * Planes 1-16 p. 5 0x{90..FE}{30..39}{81..FE}{30..39} * U+10000..U+10FFFF * * To GBK part 1 were added: * 1. 0xA2E3, 0xA8BF. * 2. Characters mapped to the Unicode PUA * 0xA2AB..0xA2B0 U+E766..U+E76B * 0xA2E4 U+E76D * 0xA2EF..0xA2F0 U+E76E..U+E76F * 0xA2FD..0xA2FE U+E770..U+E771 * 0xA4F4..0xA4FE U+E772..U+E77C * 0xA5F7..0xA5FE U+E77D..U+E784 * 0xA6B9..0xA6C0 U+E785..U+E78C * 0xA6D9..0xA6DF [glyphs here!!] U+E78D..U+E793 * 0xA6EC..0xA6ED [glyphs here!!] U+E794..U+E795 * 0xA6F3 [glyphs here!!] U+E796 * 0xA6F6..0xA6FE U+E797..U+E79F * 0xA7C2..0xA7D0 U+E7A0..U+E7AE * 0xA7F2..0xA7FE U+E7AF..U+E7BB * 0xA8BC [glyphs here!!] U+E7C7 * 0xA8C1..0xA8C4 U+E7C9..U+E7CC * 0xA8EA..0xA8FE U+E7CD..U+E7E1 * 0xA9A1..0xA9A3 U+E7FE..U+E800 * 0xA9F0..0xA9FE U+E801..U+E80F * * To GBK part 2 were added: * 3. Characters mapped to the Unicode PUA * 0xD7FA..0xD7FE U+E810..0xE814 * * To GBK part 3 nothing was added. * * To GBK part 4 were added: * 4. 0xFE{50,54..58,5A..60,62..65,68..6B,6E..75,77..7D,80..8F,92..9F}. * 5. Characters mapped to the Unicode PUA * 0xFE51..0xFE53 [glyphs here!!] U+E816..U+E818 * 0xFE59 [glyphs here!!] U+E81E * 0xFE61 [glyphs here!!] U+E826 * 0xFE66..0xFE67 [glyphs here!!] U+E82B..U+E82C * 0xFE6C..0xFE6D [glyphs here!!] U+E831..U+E832 * 0xFE76 [glyphs here!!] U+E83B * 0xFE7E [glyphs here!!] U+E843 * 0xFE90..0xFE91 [glyphs here!!] U+E854..U+E855 * 0xFEA0 [glyphs here!!] U+E864 * * To GBK part 5 were added: * 6. 0xA98A..0xA995. * 7. Characters mapped to the Unicode PUA * 0xA896..0xA8A0 U+E7BC..U+E7C6 * 0xA958 U+E7E2 * 0xA95B U+E7E3 * 0xA95D..0xA95F U+E7E4..U+E7E6 * 0xA997..0xA9A0 U+E7F4..U+E7FD * * UDA part 1 contains the user-defined characters, mapped to the Unicode PUA * U+E000..U+E233 in ascending order. * * UDA part 2 contains the user-defined characters, mapped to the Unicode PUA * U+E234..U+E4C5 in ascending order. * * UDA part 3 contains the user-defined characters, mapped to the Unicode PUA * U+E4C6..U+E765 in ascending order. * * The four-byte range 0x{81..84}{30..39}{81..FE}{30..39} * contains the rest of the Unicode BMP in ascending order. * Start: 0x81308130 = 0x0080 * End: 0x8431A439 = 0xFFFF * * The four-byte range 0x{90..E3}{30..39}{81..FE}{30..39} * contains the remaining 16 Unicode planes in Unicode order. * Start: 0x90308130 = 0x010000 * End: 0xE3329A35 = 0x10FFFF * * * Unassigned Unicode characters are mapped. For example, * U+173F = 0x8134BF35 (p. 120) * U+2EFF = 0x81398B31 (p. 148) * U+FFFE = 0x8431A438 (p. 283) * * * The Unicode PUA (U+E000..U+F8FF) is mapped as follows: * p. 83..84 0x{AA..AF}{A1..FE} U+E000..U+E233 * p. 85..87 0x{F8..FE}{A1..FE} U+E234..U+E4C5 * p. 88..90 0x{A1..A7}{40..7E,80..A0} U+E4C6..U+E765 * p. 10 0xA2AB..0xA2B0 U+E766..U+E76B * p. 255 0x8336C739 U+E76C * p. 10 0xA2E4 U+E76D * p. 10 0xA2EF..0xA2F0 U+E76E..U+E76F * p. 10 0xA2FD..0xA2FE U+E770..U+E771 * p. 11 0xA4F4..0xA4FE U+E772..U+E77C * p. 11 0xA5F7..0xA5FE U+E77D..U+E784 * p. 11 0xA6B9..0xA6C0 U+E785..U+E78C * p. 11 0xA6D9..0xA6DF [glyphs here!!] U+E78D..U+E793 * p. 11 0xA6EC..0xA6ED [glyphs here!!] U+E794..U+E795 * p. 11 0xA6F3 [glyphs here!!] U+E796 * p. 11 0xA6F6..0xA6FE U+E797..U+E79F * p. 12 0xA7C2..0xA7D0 U+E7A0..U+E7AE * p. 12 0xA7F2..0xA7FE U+E7AF..U+E7BB * p. 82 0xA896..0xA8A0 U+E7BC..U+E7C6 * p. 12 0xA8BC [glyphs here!!] U+E7C7 * p. 255 0x8336C830 U+E7C8 * p. 12 0xA8C1..0xA8C4 U+E7C9..U+E7CC * p. 12 0xA8EA..0xA8FE U+E7CD..U+E7E1 * p. 82 0xA958 U+E7E2 * p. 82 0xA95B U+E7E3 * p. 82 0xA95D..0xA95F U+E7E4..U+E7E6 * p. 255 0x8336C831..0x8336C933 U+E7E7..U+E7F3 * p. 82 0xA997..0xA9A0 U+E7F4..U+E7FD * p. 12 0xA9A1..0xA9A3 U+E7FE..U+E800 * p. 12 0xA9F0..0xA9FE U+E801..U+E80F * p. 26 0xD7FA..0xD7FE U+E810..0xE814 * p. 255 0x8336C934 U+E815 * p. 81 0xFE51..0xFE53 [glyphs here!!] U+E816..U+E818 * p. 255 0x8336C935..0x8336C939 U+E819..U+E81D * p. 81 0xFE59 [glyphs here!!] U+E81E * p. 255 0x8336CA30..0x8336CA36 U+E81F..U+E825 * p. 81 0xFE61 [glyphs here!!] U+E826 * p. 255 0x8336CA37..0x8336CB30 U+E827..U+E82A * p. 81 0xFE66..0xFE67 [glyphs here!!] U+E82B..U+E82C * p. 255 0x8336CB31..0x8336CB34 U+E82D..U+E830 * p. 81 0xFE6C..0xFE6D [glyphs here!!] U+E831..U+E832 * p. 255 0x8336CB35..0x8336CC32 U+E833..U+E83A * p. 81 0xFE76 [glyphs here!!] U+E83B * p. 255 0x8336CC33..0x8336CC39 U+E83C..U+E842 * p. 81 0xFE7E [glyphs here!!] U+E843 * p. 255 0x8336CD30..0x8336CE35 U+E844..U+E853 * p. 81 0xFE90..0xFE91 [glyphs here!!] U+E854..U+E855 * p. 255 0x8336CE36..0x8336CF39 U+E856..U+E863 * p. 81 0xFEA0 [glyphs here!!] U+E864 * p. 255..276 0x8336D030..0x84308130 U+E865..U+F8FF * * * The Unicode surrogate area (U+D800..U+DFFF) is not mapped. (p. 255) * */ #include "gb18030ext.h" #include "gb18030uni.h" static int gb18030_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { int ret; /* Code set 0 (ASCII) */ if (*s < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (GBK extended) */ ret = gbk_mbtowc(conv,pwc,s,n); if (ret != RET_ILSEQ) return ret; ret = gb18030ext_mbtowc(conv,pwc,s,n); if (ret != RET_ILSEQ) return ret; /* Code set 2 (remainder of Unicode U+0000..U+FFFF), including User-defined characters, two-byte part of range U+E766..U+E864 */ ret = gb18030uni_mbtowc(conv,pwc,s,n); if (ret != RET_ILSEQ) return ret; /* User-defined characters range U+E000..U+E765 */ { unsigned char c1 = s[0]; if ((c1 >= 0xaa && c1 <= 0xaf) || (c1 >= 0xf8 && c1 <= 0xfe)) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0xa1 && c2 <= 0xfe) { *pwc = 0xe000 + 94 * (c1 >= 0xf8 ? c1 - 0xf2 : c1 - 0xaa) + (c2 - 0xa1); return 2; } } else return RET_TOOFEW(0); } else if (c1 >= 0xa1 && c1 <= 0xa7) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x40 && c2 <= 0xa1 && c2 != 0x7f) { *pwc = 0xe4c6 + 96 * (c1 - 0xa1) + c2 - (c2 >= 0x80 ? 0x41 : 0x40); return 2; } } else return RET_TOOFEW(0); } } /* Code set 3 (Unicode U+10000..U+10FFFF) */ { unsigned char c1 = s[0]; if (c1 >= 0x90 && c1 <= 0xe3) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x30 && c2 <= 0x39) { if (n >= 3) { unsigned char c3 = s[2]; if (c3 >= 0x81 && c3 <= 0xfe) { if (n >= 4) { unsigned char c4 = s[3]; if (c4 >= 0x30 && c4 <= 0x39) { unsigned int i = (((c1 - 0x90) * 10 + (c2 - 0x30)) * 126 + (c3 - 0x81)) * 10 + (c4 - 0x30); if (i >= 0 && i < 0x100000) { *pwc = (ucs4_t) (0x10000 + i); return 4; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } } static const unsigned short gb18030_pua2charset[32*3] = { /* Unicode range GB18030 range */ 0xe766, 0xe76b, 0xa2ab, /*.. 0xa2b0, */ 0xe76d, 0xe76d, 0xa2e4, 0xe76e, 0xe76f, 0xa2ef, /*.. 0xa2f0, */ 0xe770, 0xe771, 0xa2fd, /*.. 0xa2fe, */ 0xe772, 0xe77c, 0xa4f4, /*.. 0xa4fe, */ 0xe77d, 0xe784, 0xa5f7, /*.. 0xa5fe, */ 0xe785, 0xe78c, 0xa6b9, /*.. 0xa6c0, */ 0xe78d, 0xe793, 0xa6d9, /*.. 0xa6df, */ 0xe794, 0xe795, 0xa6ec, /*.. 0xa6ed, */ 0xe796, 0xe796, 0xa6f3, 0xe797, 0xe79f, 0xa6f6, /*.. 0xa6fe, */ 0xe7a0, 0xe7ae, 0xa7c2, /*.. 0xa7d0, */ 0xe7af, 0xe7bb, 0xa7f2, /*.. 0xa7fe, */ 0xe7bc, 0xe7c6, 0xa896, /*.. 0xa8a0, */ 0xe7c7, 0xe7c7, 0xa8bc, 0xe7c9, 0xe7cc, 0xa8c1, /*.. 0xa8c4, */ 0xe7cd, 0xe7e1, 0xa8ea, /*.. 0xa8fe, */ 0xe7e2, 0xe7e2, 0xa958, 0xe7e3, 0xe7e3, 0xa95b, 0xe7e4, 0xe7e6, 0xa95d, /*.. 0xa95f, */ 0xe7f4, 0xe800, 0xa997, /*.. 0xa9a3, */ 0xe801, 0xe80f, 0xa9f0, /*.. 0xa9fe, */ 0xe810, 0xe814, 0xd7fa, /*.. 0xd7fe, */ 0xe816, 0xe818, 0xfe51, /*.. 0xfe53, */ 0xe81e, 0xe81e, 0xfe59, 0xe826, 0xe826, 0xfe61, 0xe82b, 0xe82c, 0xfe66, /*.. 0xfe67, */ 0xe831, 0xe832, 0xfe6c, /*.. 0xfe6d, */ 0xe83b, 0xe83b, 0xfe76, 0xe843, 0xe843, 0xfe7e, 0xe854, 0xe855, 0xfe90, /*.. 0xfe91, */ 0xe864, 0xe864, 0xfea0, }; static int gb18030_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { int ret; /* Code set 0 (ASCII) */ ret = ascii_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; /* Code set 1 (GBK extended) */ ret = gbk_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; ret = gb18030ext_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; /* Code set 2 (remainder of Unicode U+0000..U+FFFF) */ if (wc >= 0xe000 && wc <= 0xe864) { if (n >= 2) { if (wc < 0xe766) { /* User-defined characters range U+E000..U+E765 */ if (wc < 0xe4c6) { unsigned int i = wc - 0xe000; r[1] = (i % 94) + 0xa1; i = i / 94; r[0] = (i < 6 ? i + 0xaa : i + 0xf2); return 2; } else { unsigned int i = wc - 0xe4c6; r[0] = (i / 96) + 0xa1; i = i % 96; r[1] = i + (i >= 0x3f ? 0x41 : 0x40); return 2; } } else { /* User-defined characters, two-byte part of range U+E766..U+E864 */ unsigned int k1 = 0; unsigned int k2 = 32; /* Invariant: We know that if wc occurs in Unicode interval in gb18030_pua2charset, it does so at a k with k1 <= k < k2. */ while (k1 < k2) { unsigned int k = (k1 + k2) / 2; if (wc < gb18030_pua2charset[k*3+0]) k2 = k; else if (wc > gb18030_pua2charset[k*3+1]) k1 = k + 1; else { unsigned short c = gb18030_pua2charset[k*3+2] + (wc - gb18030_pua2charset[k*3+0]); r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } } } else return RET_TOOSMALL; } ret = gb18030uni_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; /* Code set 3 (Unicode U+10000..U+10FFFF) */ if (n >= 4) { if (wc >= 0x10000 && wc < 0x110000) { unsigned int i = wc - 0x10000; r[3] = (i % 10) + 0x30; i = i / 10; r[2] = (i % 126) + 0x81; i = i / 126; r[1] = (i % 10) + 0x30; i = i / 10; r[0] = i + 0x90; return 4; } return RET_ILUNI; } return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/gb18030ext.h000066400000000000000000000343401252300335000246070ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2005, 2011 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GB18030 two-byte extension */ static const unsigned short gb18030ext_2uni_pagea9[13] = { /* 0xa9 */ 0x303e, 0x2ff0, 0x2ff1, 0x2ff2, 0x2ff3, 0x2ff4, 0x2ff5, 0x2ff6, 0x2ff7, 0x2ff8, 0x2ff9, 0x2ffa, 0x2ffb, }; static const unsigned int gb18030ext_2uni_pagefe[96] = { /* 0xfe */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2e81, 0x20087, 0x20089, 0x200cc, 0x2e84, 0x3473, 0x3447, 0x2e88, 0x2e8b, 0x9fb4, 0x359e, 0x361a, 0x360e, 0x2e8c, 0x2e97, 0x396e, 0x3918, 0x9fb5, 0x39cf, 0x39df, 0x3a73, 0x39d0, 0x9fb6, 0x9fb7, 0x3b4e, 0x3c6e, 0x3ce0, 0x2ea7, 0x215d7, 0x9fb8, 0x2eaa, 0x4056, 0x415f, 0x2eae, 0x4337, 0x2eb3, 0x2eb6, 0x2eb7, 0x2298f, 0x43b1, 0x43ac, 0x2ebb, 0x43dd, 0x44d6, 0x4661, 0x464c, 0x9fb9, 0x4723, 0x4729, 0x477c, 0x478d, 0x2eca, 0x4947, 0x497a, 0x497d, 0x4982, 0x4983, 0x4985, 0x4986, 0x499f, 0x499b, 0x49b7, 0x49b6, 0x9fba, 0x241fe, 0x4ca3, 0x4c9f, 0x4ca0, 0x4ca1, 0x4c77, 0x4ca2, 0x4d13, 0x4d14, 0x4d15, 0x4d16, 0x4d17, 0x4d18, 0x4d19, 0x4dae, 0x9fbb, }; static int gb18030ext_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 == 0xa2) || (c1 >= 0xa4 && c1 <= 0xa9) || (c1 == 0xd7) || (c1 == 0xfe)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xff)) { unsigned int i = 190 * (c1 - 0x81) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); unsigned int wc = 0xfffd; switch (c1) { case 0xa2: if (i >= 6376 && i <= 6381) /* 0xA2AB..0xA2B0 */ wc = 0xe766 + (i - 6376); else if (i == 6432) /* 0xA2E3 */ wc = 0x20ac; else if (i == 6433) /* 0xA2E4 */ wc = 0xe76d; else if (i >= 6444 && i <= 6445) /* 0xA2EF..0xA2F0 */ wc = 0xe76e + (i - 6444); else if (i >= 6458 && i <= 6459) /* 0xA2FD..0xA2FE */ wc = 0xe770 + (i - 6458); break; case 0xa4: if (i >= 6829 && i <= 6839) /* 0xA4F4..0xA4FE */ wc = 0xe772 + (i - 6829); break; case 0xa5: if (i >= 7022 && i <= 7029) /* 0xA5F7..0xA5FE */ wc = 0xe77d + (i - 7022); break; case 0xa6: if (i >= 7150 && i <= 7157) /* 0xA6B9..0xA6C0 */ wc = 0xe785 + (i - 7150); else if (i >= 7183 && i <= 7184) /* 0xA6DA..0xA6DB */ wc = 0xfe12 - (i - 7183); else if (i >= 7182 && i <= 7190) /* 0xA6D9..0xA6DF */ wc = 0xfe10 + (i - 7182); else if (i >= 7201 && i <= 7202) /* 0xA6EC..0xA6ED */ wc = 0xfe17 + (i - 7201); else if (i == 7208) /* 0xA6F3 */ wc = 0xfe19; else if (i >= 7211 && i <= 7219) /* 0xA6F6..0xA6FE */ wc = 0xe797 + (i - 7211); break; case 0xa7: if (i >= 7349 && i <= 7363) /* 0xA7C2..0xA7D0 */ wc = 0xe7a0 + (i - 7349); else if (i >= 7397 && i <= 7409) /* 0xA7F2..0xA7FE */ wc = 0xe7af + (i - 7397); break; case 0xa8: if (i >= 7495 && i <= 7505) /* 0xA896..0xA8A0 */ wc = 0xe7bc + (i - 7495); else if (i == 7533) /* 0xA8BC */ wc = 0x1e3f; else if (i == 7536) /* 0xA8BF */ wc = 0x01f9; else if (i >= 7538 && i <= 7541) /* 0xA8C1..0xA8C4 */ wc = 0xe7c9 + (i - 7538); else if (i >= 7579 && i <= 7599) /* 0xA8EA..0xA8FE */ wc = 0xe7cd + (i - 7579); break; case 0xa9: if (i == 7624) /* 0xA958 */ wc = 0xe7e2; else if (i == 7627) /* 0xA95B */ wc = 0xe7e3; else if (i >= 7629 && i <= 7631) /* 0xA95D..0xA95F */ wc = 0xe7e4 + (i - 7629); else if (i >= 7672 && i < 7685) /* 0xA989..0xA995 */ wc = gb18030ext_2uni_pagea9[i-7672]; else if (i >= 7686 && i <= 7698) /* 0xA997..0xA9A3 */ wc = 0xe7f4 + (i - 7686); else if (i >= 7775 && i <= 7789) /* 0xA9F0..0xA9FE */ wc = 0xe801 + (i - 7775); break; case 0xd7: if (i >= 16525 && i <= 16529) /* 0xD7FA..0xD7FE */ wc = 0xe810 + (i - 16525); break; case 0xfe: if (i < 23846) wc = gb18030ext_2uni_pagefe[i-23750]; break; default: break; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short gb18030ext_page2e[80] = { 0x0000, 0xfe50, 0x0000, 0x0000, 0xfe54, 0x0000, 0x0000, 0x0000, /*0x80-0x87*/ 0xfe57, 0x0000, 0x0000, 0xfe58, 0xfe5d, 0x0000, 0x0000, 0x0000, /*0x88-0x8f*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe5e, /*0x90-0x97*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x98-0x9f*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe6b, /*0xa0-0xa7*/ 0x0000, 0x0000, 0xfe6e, 0x0000, 0x0000, 0x0000, 0xfe71, 0x0000, /*0xa8-0xaf*/ 0x0000, 0x0000, 0x0000, 0xfe73, 0x0000, 0x0000, 0xfe74, 0xfe75, /*0xb0-0xb7*/ 0x0000, 0x0000, 0x0000, 0xfe79, 0x0000, 0x0000, 0x0000, 0x0000, /*0xb8-0xbf*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xc0-0xc7*/ 0x0000, 0x0000, 0xfe84, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xc8-0xcf*/ }; static const unsigned short gb18030ext_page2f[16] = { 0xa98a, 0xa98b, 0xa98c, 0xa98d, 0xa98e, 0xa98f, 0xa990, 0xa991, /*0xf0-0xf7*/ 0xa992, 0xa993, 0xa994, 0xa995, 0x0000, 0x0000, 0x0000, 0x0000, /*0xf8-0xff*/ }; static const unsigned short gb18030ext_page34[56] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe56, /*0x40-0x47*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x48-0x4f*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x50-0x57*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x58-0x5f*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x60-0x67*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x68-0x6f*/ 0x0000, 0x0000, 0x0000, 0xfe55, 0x0000, 0x0000, 0x0000, 0x0000, /*0x70-0x77*/ }; static const unsigned short gb18030ext_page36[24] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe5c, 0x0000, /*0x08-0x0f*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x10-0x17*/ 0x0000, 0x0000, 0xfe5b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x18-0x1f*/ }; static const unsigned short gb18030ext_page39[24] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe62, /*0xc8-0xcf*/ 0xfe65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xd0-0xd7*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe63, /*0xd8-0xdf*/ }; static const unsigned short gb18030ext_page43[56] = { 0x0000, 0x0000, 0x0000, 0x0000, 0xfe78, 0x0000, 0x0000, 0x0000, /*0xa8-0xaf*/ 0x0000, 0xfe77, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xb0-0xb7*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xb8-0xbf*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xc0-0xc7*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xc8-0xcf*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xd0-0xd7*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe7a, 0x0000, 0x0000, /*0xd8-0xdf*/ }; static const unsigned short gb18030ext_page46[32] = { 0x0000, 0x0000, 0x0000, 0x0000, 0xfe7d, 0x0000, 0x0000, 0x0000, /*0x48-0x4f*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x50-0x57*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x58-0x5f*/ 0x0000, 0xfe7c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x60-0x67*/ }; static const unsigned short gb18030ext_page47_1[16] = { 0x0000, 0x0000, 0x0000, 0xfe80, 0x0000, 0x0000, 0x0000, 0x0000, /*0x20-0x27*/ 0x0000, 0xfe81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x28-0x2f*/ }; static const unsigned short gb18030ext_page47_2[24] = { 0x0000, 0x0000, 0x0000, 0x0000, 0xfe82, 0x0000, 0x0000, 0x0000, /*0x78-0x7f*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x80-0x87*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe83, 0x0000, 0x0000, /*0x88-0x8f*/ }; static const unsigned short gb18030ext_page49[120] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe85, /*0x40-0x47*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x48-0x4f*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x50-0x57*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x58-0x5f*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x60-0x67*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x68-0x6f*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x70-0x77*/ 0x0000, 0x0000, 0xfe86, 0x0000, 0x0000, 0xfe87, 0x0000, 0x0000, /*0x78-0x7f*/ 0x0000, 0x0000, 0xfe88, 0xfe89, 0x0000, 0xfe8a, 0xfe8b, 0x0000, /*0x80-0x87*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x88-0x8f*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x90-0x97*/ 0x0000, 0x0000, 0x0000, 0xfe8d, 0x0000, 0x0000, 0x0000, 0xfe8c, /*0x98-0x9f*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xa0-0xa7*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xa8-0xaf*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe8f, 0xfe8e, /*0xb0-0xb7*/ }; static const unsigned short gb18030ext_page4c[56] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe96, /*0x70-0x77*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x78-0x7f*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x80-0x87*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x88-0x8f*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x90-0x97*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe93, /*0x98-0x9f*/ 0xfe94, 0xfe95, 0xfe97, 0xfe92, 0x0000, 0x0000, 0x0000, 0x0000, /*0xa0-0xa7*/ }; static const unsigned short gb18030ext_page4d[16] = { 0x0000, 0x0000, 0x0000, 0xfe98, 0xfe99, 0xfe9a, 0xfe9b, 0xfe9c, /*0x10-0x17*/ 0xfe9d, 0xfe9e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x18-0x1f*/ }; static const unsigned short gb18030ext_page9f[16] = { 0x0000, 0x0000, 0x0000, 0x0000, 0xfe59, 0xfe61, 0xfe66, 0xfe67, /*0xb0-0xb7*/ 0xfe6d, 0xfe7e, 0xfe90, 0xfea0, 0x0000, 0x0000, 0x0000, 0x0000, /*0xb8-0xbf*/ }; static const unsigned short gb18030ext_pagefe[16] = { 0xa6d9, 0xa6db, 0xa6da, 0xa6dc, 0xa6dd, 0xa6de, 0xa6df, 0xa6ec, /*0x10-0x17*/ 0xa6ed, 0xa6f3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x18-0x1f*/ }; static int gb18030ext_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { unsigned short c = 0; if (wc == 0x01f9) c = 0xa8bf; else if (wc == 0x1e3f) c = 0xa8bc; else if (wc == 0x20ac) c = 0xa2e3; else if (wc >= 0x2e80 && wc < 0x2ed0) c = gb18030ext_page2e[wc-0x2e80]; else if (wc >= 0x2ff0 && wc < 0x3000) c = gb18030ext_page2f[wc-0x2ff0]; else if (wc == 0x303e) c = 0xa989; else if (wc >= 0x3440 && wc < 0x3478) c = gb18030ext_page34[wc-0x3440]; else if (wc == 0x359e) c = 0xfe5a; else if (wc >= 0x3608 && wc < 0x3620) c = gb18030ext_page36[wc-0x3608]; else if (wc == 0x3918) c = 0xfe60; else if (wc == 0x396e) c = 0xfe5f; else if (wc >= 0x39c8 && wc < 0x39e0) c = gb18030ext_page39[wc-0x39c8]; else if (wc == 0x3a73) c = 0xfe64; else if (wc == 0x3b4e) c = 0xfe68; else if (wc == 0x3c6e) c = 0xfe69; else if (wc == 0x3ce0) c = 0xfe6a; else if (wc == 0x4056) c = 0xfe6f; else if (wc == 0x415f) c = 0xfe70; else if (wc == 0x4337) c = 0xfe72; else if (wc >= 0x43a8 && wc < 0x43e0) c = gb18030ext_page43[wc-0x43a8]; else if (wc == 0x44d6) c = 0xfe7b; else if (wc >= 0x4648 && wc < 0x4668) c = gb18030ext_page46[wc-0x4648]; else if (wc >= 0x4720 && wc < 0x4730) c = gb18030ext_page47_1[wc-0x4720]; else if (wc >= 0x4778 && wc < 0x4790) c = gb18030ext_page47_2[wc-0x4778]; else if (wc >= 0x4940 && wc < 0x49b8) c = gb18030ext_page49[wc-0x4940]; else if (wc >= 0x4c70 && wc < 0x4ca8) c = gb18030ext_page4c[wc-0x4c70]; else if (wc >= 0x4d10 && wc < 0x4d20) c = gb18030ext_page4d[wc-0x4d10]; else if (wc == 0x4dae) c = 0xfe9f; else if (wc >= 0x9fb4 && wc < 0x9fbc) c = gb18030ext_page9f[wc-0x9fb0]; else if (wc >= 0xfe10 && wc < 0xfe1a) c = gb18030ext_pagefe[wc-0xfe10]; else if (wc == 0x20087) c = 0xfe51; else if (wc == 0x20089) c = 0xfe52; else if (wc == 0x200cc) c = 0xfe53; else if (wc == 0x215d7) c = 0xfe6c; else if (wc == 0x2298f) c = 0xfe76; else if (wc == 0x241fe) c = 0xfe91; if (c != 0) { r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } return RET_ILUNI; } return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/gb18030uni.h000066400000000000000000000276661252300335000246170ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2005 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GB18030 four-byte extension */ static const unsigned short gb18030uni_charset2uni_ranges[412] = { 0x0000, 0x0023, 0x0024, 0x0025, 0x0026, 0x002c, 0x002d, 0x0031, 0x0032, 0x0050, 0x0051, 0x0058, 0x0059, 0x005e, 0x005f, 0x005f, 0x0060, 0x0063, 0x0064, 0x0066, 0x0067, 0x0067, 0x0068, 0x0068, 0x0069, 0x006c, 0x006d, 0x007d, 0x007e, 0x0084, 0x0085, 0x0093, 0x0094, 0x00ab, 0x00ac, 0x00ae, 0x00af, 0x00b2, 0x00b3, 0x00cf, 0x00d0, 0x0131, 0x0132, 0x0132, 0x0133, 0x0133, 0x0134, 0x0134, 0x0135, 0x0135, 0x0136, 0x0136, 0x0137, 0x0137, 0x0138, 0x0138, 0x0139, 0x0154, 0x0155, 0x01ab, 0x01ac, 0x01ba, 0x01bb, 0x021f, 0x0220, 0x0220, 0x0221, 0x022d, 0x022e, 0x02e4, 0x02e5, 0x02e5, 0x02e6, 0x02ec, 0x02ed, 0x02ed, 0x02ee, 0x0324, 0x0325, 0x0332, 0x0333, 0x0333, 0x0334, 0x1ef1, 0x1ef2, 0x1ef3, 0x1ef4, 0x1ef4, 0x1ef5, 0x1ef6, 0x1ef7, 0x1efd, 0x1efe, 0x1f06, 0x1f07, 0x1f07, 0x1f08, 0x1f08, 0x1f09, 0x1f0d, 0x1f0e, 0x1f7d, 0x1f7e, 0x1fd3, 0x1fd4, 0x1fd4, 0x1fd5, 0x1fd7, 0x1fd8, 0x1fe3, 0x1fe4, 0x1fed, 0x1fee, 0x202b, 0x202c, 0x202f, 0x2030, 0x2045, 0x2046, 0x2047, 0x2048, 0x20b5, 0x20b6, 0x20bb, 0x20bc, 0x20bc, 0x20bd, 0x20bf, 0x20c0, 0x20c3, 0x20c4, 0x20c5, 0x20c6, 0x20c7, 0x20c8, 0x20c8, 0x20c9, 0x20c9, 0x20ca, 0x20cb, 0x20cc, 0x20d0, 0x20d1, 0x20d5, 0x20d6, 0x20df, 0x20e0, 0x20e2, 0x20e3, 0x20e7, 0x20e8, 0x20f4, 0x20f5, 0x20f6, 0x20f7, 0x20fc, 0x20fd, 0x2121, 0x2122, 0x2124, 0x2125, 0x212f, 0x2130, 0x2148, 0x2149, 0x219a, 0x219b, 0x22e7, 0x22e8, 0x22f1, 0x22f2, 0x2355, 0x2356, 0x2359, 0x235a, 0x2366, 0x2367, 0x2369, 0x236a, 0x2373, 0x2374, 0x2383, 0x2384, 0x238b, 0x238c, 0x2393, 0x2394, 0x2396, 0x2397, 0x2398, 0x2399, 0x23aa, 0x23ab, 0x23c9, 0x23ca, 0x23cb, 0x23cc, 0x2401, 0x2402, 0x2402, 0x2403, 0x2c40, 0x2c41, 0x2c42, 0x2c43, 0x2c45, 0x2c46, 0x2c47, 0x2c48, 0x2c51, 0x2c52, 0x2c60, 0x2c61, 0x2c62, 0x2c63, 0x2c65, 0x2c66, 0x2c69, 0x2c6a, 0x2c6b, 0x2c6c, 0x2c6e, 0x2c6f, 0x2c7c, 0x2c7d, 0x2da1, 0x2da2, 0x2da5, 0x2da6, 0x2da6, 0x2da7, 0x2dab, 0x2dac, 0x2dad, 0x2dae, 0x2dc1, 0x2dc2, 0x2dc3, 0x2dc4, 0x2dca, 0x2dcb, 0x2dcc, 0x2dcd, 0x2dd1, 0x2dd2, 0x2dd7, 0x2dd8, 0x2ecd, 0x2ece, 0x2ed4, 0x2ed5, 0x2f45, 0x2f46, 0x302f, 0x3030, 0x303b, 0x303c, 0x303d, 0x303e, 0x305f, 0x3060, 0x3068, 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x30dd, 0x30de, 0x3108, 0x3109, 0x3232, 0x3233, 0x32a1, 0x32a2, 0x32ac, 0x32ad, 0x35a9, 0x35aa, 0x35fe, 0x35ff, 0x365e, 0x365f, 0x366c, 0x366d, 0x36ff, 0x3700, 0x37d9, 0x37da, 0x38f8, 0x38f9, 0x3969, 0x396a, 0x3cde, 0x3cdf, 0x3de6, 0x3de7, 0x3fbd, 0x3fbe, 0x4031, 0x4032, 0x4035, 0x4036, 0x4060, 0x4061, 0x4158, 0x4159, 0x42cd, 0x42ce, 0x42e1, 0x42e2, 0x43a2, 0x43a3, 0x43a7, 0x43a8, 0x43f9, 0x43fa, 0x4409, 0x440a, 0x45c2, 0x45c3, 0x45f4, 0x45f5, 0x45f6, 0x45f7, 0x45fa, 0x45fb, 0x45fb, 0x45fc, 0x460f, 0x4610, 0x4612, 0x4613, 0x4628, 0x4629, 0x48e7, 0x48e8, 0x490e, 0x490f, 0x497d, 0x497e, 0x4a11, 0x4a12, 0x4a62, 0x4a63, 0x82bc, 0x82bd, 0x82bd, 0x82be, 0x82be, 0x82bf, 0x82cb, 0x82cc, 0x82cc, 0x82cd, 0x82d1, 0x82d2, 0x82d8, 0x82d9, 0x82dc, 0x82dd, 0x82e0, 0x82e1, 0x82e8, 0x82e9, 0x82ef, 0x82f0, 0x82ff, 0x8300, 0x830d, 0x830e, 0x93d4, 0x93d5, 0x9420, 0x9421, 0x943b, 0x943c, 0x948c, 0x948d, 0x9495, 0x9496, 0x94af, 0x94b0, 0x94b0, 0x94b1, 0x94b1, 0x94b2, 0x94b4, 0x94b5, 0x94ba, 0x94bb, 0x94bb, 0x94bc, 0x94bd, 0x94be, 0x98c3, 0x98c4, 0x98c4, 0x98c5, 0x98c8, 0x98c9, 0x98c9, 0x98ca, 0x98ca, 0x98cb, 0x98cb, 0x98cc, 0x9960, 0x9961, 0x99e1, 0x99e2, 0x99fb }; static const unsigned short gb18030uni_uni2charset_ranges[412] = { 0x0080, 0x00a3, 0x00a5, 0x00a6, 0x00a9, 0x00af, 0x00b2, 0x00b6, 0x00b8, 0x00d6, 0x00d8, 0x00df, 0x00e2, 0x00e7, 0x00eb, 0x00eb, 0x00ee, 0x00f1, 0x00f4, 0x00f6, 0x00f8, 0x00f8, 0x00fb, 0x00fb, 0x00fd, 0x0100, 0x0102, 0x0112, 0x0114, 0x011a, 0x011c, 0x012a, 0x012c, 0x0143, 0x0145, 0x0147, 0x0149, 0x014c, 0x014e, 0x016a, 0x016c, 0x01cd, 0x01cf, 0x01cf, 0x01d1, 0x01d1, 0x01d3, 0x01d3, 0x01d5, 0x01d5, 0x01d7, 0x01d7, 0x01d9, 0x01d9, 0x01db, 0x01db, 0x01dd, 0x01f8, 0x01fa, 0x0250, 0x0252, 0x0260, 0x0262, 0x02c6, 0x02c8, 0x02c8, 0x02cc, 0x02d8, 0x02da, 0x0390, 0x03a2, 0x03a2, 0x03aa, 0x03b0, 0x03c2, 0x03c2, 0x03ca, 0x0400, 0x0402, 0x040f, 0x0450, 0x0450, 0x0452, 0x200f, 0x2011, 0x2012, 0x2017, 0x2017, 0x201a, 0x201b, 0x201e, 0x2024, 0x2027, 0x202f, 0x2031, 0x2031, 0x2034, 0x2034, 0x2036, 0x203a, 0x203c, 0x20ab, 0x20ad, 0x2102, 0x2104, 0x2104, 0x2106, 0x2108, 0x210a, 0x2115, 0x2117, 0x2120, 0x2122, 0x215f, 0x216c, 0x216f, 0x217a, 0x218f, 0x2194, 0x2195, 0x219a, 0x2207, 0x2209, 0x220e, 0x2210, 0x2210, 0x2212, 0x2214, 0x2216, 0x2219, 0x221b, 0x221c, 0x2221, 0x2222, 0x2224, 0x2224, 0x2226, 0x2226, 0x222c, 0x222d, 0x222f, 0x2233, 0x2238, 0x223c, 0x223e, 0x2247, 0x2249, 0x224b, 0x224d, 0x2251, 0x2253, 0x225f, 0x2262, 0x2263, 0x2268, 0x226d, 0x2270, 0x2294, 0x2296, 0x2298, 0x229a, 0x22a4, 0x22a6, 0x22be, 0x22c0, 0x2311, 0x2313, 0x245f, 0x246a, 0x2473, 0x249c, 0x24ff, 0x254c, 0x254f, 0x2574, 0x2580, 0x2590, 0x2592, 0x2596, 0x259f, 0x25a2, 0x25b1, 0x25b4, 0x25bb, 0x25be, 0x25c5, 0x25c8, 0x25ca, 0x25cc, 0x25cd, 0x25d0, 0x25e1, 0x25e6, 0x2604, 0x2607, 0x2608, 0x260a, 0x263f, 0x2641, 0x2641, 0x2643, 0x2e80, 0x2e82, 0x2e83, 0x2e85, 0x2e87, 0x2e89, 0x2e8a, 0x2e8d, 0x2e96, 0x2e98, 0x2ea6, 0x2ea8, 0x2ea9, 0x2eab, 0x2ead, 0x2eaf, 0x2eb2, 0x2eb4, 0x2eb5, 0x2eb8, 0x2eba, 0x2ebc, 0x2ec9, 0x2ecb, 0x2fef, 0x2ffc, 0x2fff, 0x3004, 0x3004, 0x3018, 0x301c, 0x301f, 0x3020, 0x302a, 0x303d, 0x303f, 0x3040, 0x3094, 0x309a, 0x309f, 0x30a0, 0x30f7, 0x30fb, 0x30ff, 0x3104, 0x312a, 0x321f, 0x322a, 0x3230, 0x3232, 0x32a2, 0x32a4, 0x338d, 0x3390, 0x339b, 0x339f, 0x33a0, 0x33a2, 0x33c3, 0x33c5, 0x33cd, 0x33cf, 0x33d0, 0x33d3, 0x33d4, 0x33d6, 0x3446, 0x3448, 0x3472, 0x3474, 0x359d, 0x359f, 0x360d, 0x360f, 0x3619, 0x361b, 0x3917, 0x3919, 0x396d, 0x396f, 0x39ce, 0x39d1, 0x39de, 0x39e0, 0x3a72, 0x3a74, 0x3b4d, 0x3b4f, 0x3c6d, 0x3c6f, 0x3cdf, 0x3ce1, 0x4055, 0x4057, 0x415e, 0x4160, 0x4336, 0x4338, 0x43ab, 0x43ad, 0x43b0, 0x43b2, 0x43dc, 0x43de, 0x44d5, 0x44d7, 0x464b, 0x464d, 0x4660, 0x4662, 0x4722, 0x4724, 0x4728, 0x472a, 0x477b, 0x477d, 0x478c, 0x478e, 0x4946, 0x4948, 0x4979, 0x497b, 0x497c, 0x497e, 0x4981, 0x4984, 0x4984, 0x4987, 0x499a, 0x499c, 0x499e, 0x49a0, 0x49b5, 0x49b8, 0x4c76, 0x4c78, 0x4c9e, 0x4ca4, 0x4d12, 0x4d1a, 0x4dad, 0x4daf, 0x4dff, 0x9fa6, 0xd7ff, 0xe76c, 0xe76c, 0xe7c8, 0xe7c8, 0xe7e7, 0xe7f3, 0xe815, 0xe815, 0xe819, 0xe81d, 0xe81f, 0xe825, 0xe827, 0xe82a, 0xe82d, 0xe830, 0xe833, 0xe83a, 0xe83c, 0xe842, 0xe844, 0xe853, 0xe856, 0xe863, 0xe865, 0xf92b, 0xf92d, 0xf978, 0xf97a, 0xf994, 0xf996, 0xf9e6, 0xf9e8, 0xf9f0, 0xf9f2, 0xfa0b, 0xfa10, 0xfa10, 0xfa12, 0xfa12, 0xfa15, 0xfa17, 0xfa19, 0xfa1e, 0xfa22, 0xfa22, 0xfa25, 0xfa26, 0xfa2a, 0xfe2f, 0xfe32, 0xfe32, 0xfe45, 0xfe48, 0xfe53, 0xfe53, 0xfe58, 0xfe58, 0xfe67, 0xfe67, 0xfe6c, 0xff00, 0xff5f, 0xffdf, 0xffe6, 0xffff }; static const unsigned short gb18030uni_ranges[206] = { 128, 129, 131, 133, 134, 135, 137, 140, 142, 144, 145, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 171, 172, 189, 196, 213, 220, 221, 285, 286, 287, 291, 293, 295, 297, 298, 300, 301, 302, 303, 304, 305, 306, 307, 308, 320, 330, 334, 338, 339, 340, 341, 342, 343, 347, 348, 349, 354, 355, 359, 360, 361, 362, 363, 365, 369, 371, 372, 373, 374, 375, 376, 386, 426, 502, 538, 553, 556, 558, 560, 562, 564, 565, 567, 571, 573, 574, 575, 576, 577, 578, 579, 581, 582, 583, 584, 585, 586, 588, 589, 590, 602, 606, 625, 627, 636, 637, 720, 724, 810, 813, 850, 860, 861, 862, 864, 867, 868, 869, 870, 872, 873, 874, 875, 876, 877, 878, 879, 880, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, 905, 907, 908, 909, 911, 912, 917, 924, 925, 21827, 25775, 25866, 25896, 25929, 25932, 25933, 25934, 25936, 25938, 25939, 25940, 25942, 25943, 25944, 25945, 25946, 25947, 25948, 25952, 25953, 25955, 25956, 25959, 25961, 25964, 25966, 25984, 25994, 25998, 26012, 26016, 26110, 26116 }; static int gb18030uni_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if (c1 >= 0x81 && c1 <= 0x84) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x30 && c2 <= 0x39) { if (n >= 3) { unsigned char c3 = s[2]; if (c3 >= 0x81 && c3 <= 0xfe) { if (n >= 4) { unsigned char c4 = s[3]; if (c4 >= 0x30 && c4 <= 0x39) { unsigned int i = (((c1 - 0x81) * 10 + (c2 - 0x30)) * 126 + (c3 - 0x81)) * 10 + (c4 - 0x30); if (i >= 0 && i <= 39419) { unsigned int k1 = 0; unsigned int k2 = 205; while (k1 < k2) { unsigned int k = (k1 + k2) / 2; if (i <= gb18030uni_charset2uni_ranges[2*k+1]) k2 = k; else if (i >= gb18030uni_charset2uni_ranges[2*k+2]) k1 = k + 1; else return RET_ILSEQ; } { unsigned int diff = gb18030uni_ranges[k1]; *pwc = (ucs4_t) (i + diff); return 4; } } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static int gb18030uni_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 4) { unsigned int i = wc; if (i >= 0x0080 && i <= 0xffff) { unsigned int k1 = 0; unsigned int k2 = 205; while (k1 < k2) { unsigned int k = (k1 + k2) / 2; if (i <= gb18030uni_uni2charset_ranges[2*k+1]) k2 = k; else if (i >= gb18030uni_uni2charset_ranges[2*k+2]) k1 = k + 1; else return RET_ILUNI; } { unsigned int diff = gb18030uni_ranges[k1]; i -= diff; r[3] = (i % 10) + 0x30; i = i / 10; r[2] = (i % 126) + 0x81; i = i / 126; r[1] = (i % 10) + 0x30; i = i / 10; r[0] = i + 0x81; return 4; } } return RET_ILUNI; } return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/gb2312.h000066400000000000000000004650561252300335000240160ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GB2312.1980-0 */ static const unsigned short gb2312_2uni_page21[831] = { /* 0x21 */ 0x3000, 0x3001, 0x3002, 0x30fb, 0x02c9, 0x02c7, 0x00a8, 0x3003, 0x3005, 0x2015, 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, /* 0x22 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 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, 0xfffd, 0xfffd, 0x3220, 0x3221, 0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0xfffd, 0xfffd, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216a, 0x216b, 0xfffd, 0xfffd, /* 0x23 */ 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, /* 0x24 */ 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x25 */ 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x26 */ 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x27 */ 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x28 */ 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x29 */ 0xfffd, 0xfffd, 0xfffd, 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, }; static const unsigned short gb2312_2uni_page30[6768] = { /* 0x30 */ 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, /* 0x31 */ 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, /* 0x32 */ 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, /* 0x33 */ 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, /* 0x34 */ 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, /* 0x35 */ 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, /* 0x36 */ 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, /* 0x37 */ 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, /* 0x38 */ 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, /* 0x39 */ 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, /* 0x3a */ 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, /* 0x3b */ 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, /* 0x3c */ 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, /* 0x3d */ 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, /* 0x3e */ 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, /* 0x3f */ 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, /* 0x40 */ 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, /* 0x41 */ 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, /* 0x42 */ 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, /* 0x43 */ 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, /* 0x44 */ 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, /* 0x45 */ 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, /* 0x46 */ 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, /* 0x47 */ 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, /* 0x48 */ 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, /* 0x49 */ 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, /* 0x4a */ 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, /* 0x4b */ 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, /* 0x4c */ 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, /* 0x4d */ 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, /* 0x4e */ 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, /* 0x4f */ 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, /* 0x50 */ 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, /* 0x51 */ 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, /* 0x52 */ 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, /* 0x53 */ 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, /* 0x54 */ 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, /* 0x55 */ 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, /* 0x56 */ 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, /* 0x57 */ 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x58 */ 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, /* 0x59 */ 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, /* 0x5a */ 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, /* 0x5b */ 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, /* 0x5c */ 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, /* 0x5d */ 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, /* 0x5e */ 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, /* 0x5f */ 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, /* 0x60 */ 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, /* 0x61 */ 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, /* 0x62 */ 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, /* 0x63 */ 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, /* 0x64 */ 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, /* 0x65 */ 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, /* 0x66 */ 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, /* 0x67 */ 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, /* 0x68 */ 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, /* 0x69 */ 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, /* 0x6a */ 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, /* 0x6b */ 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, /* 0x6c */ 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, /* 0x6d */ 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, /* 0x6e */ 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, /* 0x6f */ 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, /* 0x70 */ 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, /* 0x71 */ 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, /* 0x72 */ 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, /* 0x73 */ 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, /* 0x74 */ 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, /* 0x75 */ 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, /* 0x76 */ 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, /* 0x77 */ 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, }; static int gb2312_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x21 && c1 <= 0x29) || (c1 >= 0x30 && c1 <= 0x77)) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x21 && c2 < 0x7f) { unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); unsigned short wc = 0xfffd; if (i < 1410) { if (i < 831) wc = gb2312_2uni_page21[i]; } else { if (i < 8178) wc = gb2312_2uni_page30[i-1410]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short gb2312_2charset[7445] = { 0x2168, 0x216c, 0x2127, 0x2163, 0x2140, 0x2141, 0x2824, 0x2822, 0x2828, 0x2826, 0x283a, 0x282c, 0x282a, 0x2830, 0x282e, 0x2142, 0x2834, 0x2832, 0x2839, 0x2821, 0x2825, 0x2827, 0x2829, 0x282d, 0x2831, 0x2823, 0x282b, 0x282f, 0x2833, 0x2835, 0x2836, 0x2837, 0x2838, 0x2126, 0x2125, 0x2621, 0x2622, 0x2623, 0x2624, 0x2625, 0x2626, 0x2627, 0x2628, 0x2629, 0x262a, 0x262b, 0x262c, 0x262d, 0x262e, 0x262f, 0x2630, 0x2631, 0x2632, 0x2633, 0x2634, 0x2635, 0x2636, 0x2637, 0x2638, 0x2641, 0x2642, 0x2643, 0x2644, 0x2645, 0x2646, 0x2647, 0x2648, 0x2649, 0x264a, 0x264b, 0x264c, 0x264d, 0x264e, 0x264f, 0x2650, 0x2651, 0x2652, 0x2653, 0x2654, 0x2655, 0x2656, 0x2657, 0x2658, 0x2727, 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, 0x2757, 0x212a, 0x212c, 0x212e, 0x212f, 0x2130, 0x2131, 0x212d, 0x216b, 0x2164, 0x2165, 0x2179, 0x2166, 0x216d, 0x2271, 0x2272, 0x2273, 0x2274, 0x2275, 0x2276, 0x2277, 0x2278, 0x2279, 0x227a, 0x227b, 0x227c, 0x217b, 0x217c, 0x217a, 0x217d, 0x214a, 0x2147, 0x2146, 0x214c, 0x2158, 0x215e, 0x214f, 0x214e, 0x2144, 0x2145, 0x2149, 0x2148, 0x2152, 0x2153, 0x2160, 0x215f, 0x2143, 0x214b, 0x2157, 0x2156, 0x2155, 0x2159, 0x2154, 0x215c, 0x215d, 0x215a, 0x215b, 0x2151, 0x214d, 0x2150, 0x2259, 0x225a, 0x225b, 0x225c, 0x225d, 0x225e, 0x225f, 0x2260, 0x2261, 0x2262, 0x2245, 0x2246, 0x2247, 0x2248, 0x2249, 0x224a, 0x224b, 0x224c, 0x224d, 0x224e, 0x224f, 0x2250, 0x2251, 0x2252, 0x2253, 0x2254, 0x2255, 0x2256, 0x2257, 0x2258, 0x2231, 0x2232, 0x2233, 0x2234, 0x2235, 0x2236, 0x2237, 0x2238, 0x2239, 0x223a, 0x223b, 0x223c, 0x223d, 0x223e, 0x223f, 0x2240, 0x2241, 0x2242, 0x2243, 0x2244, 0x2924, 0x2925, 0x2926, 0x2927, 0x2928, 0x2929, 0x292a, 0x292b, 0x292c, 0x292d, 0x292e, 0x292f, 0x2930, 0x2931, 0x2932, 0x2933, 0x2934, 0x2935, 0x2936, 0x2937, 0x2938, 0x2939, 0x293a, 0x293b, 0x293c, 0x293d, 0x293e, 0x293f, 0x2940, 0x2941, 0x2942, 0x2943, 0x2944, 0x2945, 0x2946, 0x2947, 0x2948, 0x2949, 0x294a, 0x294b, 0x294c, 0x294d, 0x294e, 0x294f, 0x2950, 0x2951, 0x2952, 0x2953, 0x2954, 0x2955, 0x2956, 0x2957, 0x2958, 0x2959, 0x295a, 0x295b, 0x295c, 0x295d, 0x295e, 0x295f, 0x2960, 0x2961, 0x2962, 0x2963, 0x2964, 0x2965, 0x2966, 0x2967, 0x2968, 0x2969, 0x296a, 0x296b, 0x296c, 0x296d, 0x296e, 0x296f, 0x2176, 0x2175, 0x2178, 0x2177, 0x2174, 0x2173, 0x2170, 0x2172, 0x2171, 0x216f, 0x216e, 0x2162, 0x2161, 0x2121, 0x2122, 0x2123, 0x2128, 0x2129, 0x2134, 0x2135, 0x2136, 0x2137, 0x2138, 0x2139, 0x213a, 0x213b, 0x213e, 0x213f, 0x217e, 0x2132, 0x2133, 0x213c, 0x213d, 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, 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, 0x2124, 0x2845, 0x2846, 0x2847, 0x2848, 0x2849, 0x284a, 0x284b, 0x284c, 0x284d, 0x284e, 0x284f, 0x2850, 0x2851, 0x2852, 0x2853, 0x2854, 0x2855, 0x2856, 0x2857, 0x2858, 0x2859, 0x285a, 0x285b, 0x285c, 0x285d, 0x285e, 0x285f, 0x2860, 0x2861, 0x2862, 0x2863, 0x2864, 0x2865, 0x2866, 0x2867, 0x2868, 0x2869, 0x2265, 0x2266, 0x2267, 0x2268, 0x2269, 0x226a, 0x226b, 0x226c, 0x226d, 0x226e, 0x523b, 0x3621, 0x465f, 0x4d72, 0x5549, 0x487d, 0x494f, 0x4f42, 0x5822, 0x323b, 0x536b, 0x5824, 0x3373, 0x5728, 0x4752, 0x5827, 0x4a40, 0x4770, 0x317b, 0x5235, 0x3454, 0x362b, 0x4b3f, 0x5829, 0x362a, 0x413d, 0x514f, 0x4925, 0x582d, 0x3876, 0x513e, 0x635c, 0x5650, 0x3761, 0x342e, 0x4159, 0x583c, 0x4d68, 0x3524, 0x4e2a, 0x5677, 0x4076, 0x3e59, 0x582f, 0x444b, 0x3e43, 0x5831, 0x4334, 0x5265, 0x562e, 0x4e5a, 0x5527, 0x3a75, 0x3726, 0x4056, 0x4639, 0x4552, 0x4747, 0x3954, 0x334b, 0x5252, 0x583f, 0x3e45, 0x4672, 0x5232, 0x4f30, 0x4f67, 0x4a69, 0x5840, 0x4272, 0x4252, 0x4869, 0x472c, 0x414b, 0x5368, 0x5579, 0x4a42, 0x367e, 0x5821, 0x535a, 0x3f77, 0x5446, 0x3b25, 0x5841, 0x4e65, 0x3e2e, 0x5828, 0x5147, 0x5029, 0x583d, 0x596f, 0x4d76, 0x3f3a, 0x3d3b, 0x3a25, 0x5260, 0x327a, 0x3a60, 0x4436, 0x4f6d, 0x3e29, 0x4d24, 0x4141, 0x4757, 0x5971, 0x5974, 0x484b, 0x5869, 0x525a, 0x4a32, 0x484a, 0x586c, 0x586a, 0x5846, 0x3d76, 0x464d, 0x3370, 0x586b, 0x3d71, 0x3d69, 0x4854, 0x3453, 0x4258, 0x3256, 0x5750, 0x4a4b, 0x4b7b, 0x554c, 0x3836, 0x4f49, 0x595a, 0x5870, 0x472a, 0x586e, 0x347a, 0x416e, 0x5254, 0x586d, 0x5247, 0x586f, 0x4347, 0x5176, 0x5659, 0x5872, 0x5875, 0x3c7e, 0x3c5b, 0x484e, 0x375d, 0x3742, 0x4673, 0x5878, 0x5241, 0x4e69, 0x3c3f, 0x377c, 0x3725, 0x505d, 0x565a, 0x5345, 0x3b6f, 0x3b61, 0x5871, 0x4921, 0x4e30, 0x342b, 0x5873, 0x494b, 0x5876, 0x4257, 0x5877, 0x4e31, 0x5879, 0x322e, 0x3940, 0x5923, 0x3069, 0x4166, 0x496c, 0x4b45, 0x4b46, 0x5924, 0x3568, 0x352b, 0x4e3b, 0x354d, 0x5721, 0x5774, 0x5353, 0x4c65, 0x3a4e, 0x5922, 0x595c, 0x5360, 0x587d, 0x3770, 0x5777, 0x587e, 0x587a, 0x5921, 0x4463, 0x5336, 0x5874, 0x595d, 0x587b, 0x4565, 0x4050, 0x5170, 0x305b, 0x3c51, 0x5926, 0x5925, 0x592c, 0x592e, 0x592b, 0x4a39, 0x5929, 0x5636, 0x335e, 0x5928, 0x407d, 0x4a4c, 0x592a, 0x5927, 0x5930, 0x3631, 0x3929, 0x5240, 0x4f40, 0x4242, 0x3d44, 0x556c, 0x3260, 0x4748, 0x3f6b, 0x592d, 0x592f, 0x4e6a, 0x3a6e, 0x4756, 0x3163, 0x3459, 0x366d, 0x5934, 0x3f21, 0x595e, 0x474e, 0x407e, 0x5938, 0x4b57, 0x377d, 0x5935, 0x5937, 0x3123, 0x5361, 0x5939, 0x5045, 0x5936, 0x5931, 0x5932, 0x4129, 0x5933, 0x3c73, 0x505e, 0x3829, 0x3e63, 0x593d, 0x593a, 0x3033, 0x5942, 0x5944, 0x3136, 0x593f, 0x3539, 0x3e73, 0x4c48, 0x3a72, 0x5250, 0x5943, 0x3d68, 0x332b, 0x5945, 0x3e6b, 0x5946, 0x593b, 0x445f, 0x593e, 0x5941, 0x5940, 0x552e, 0x5635, 0x4763, 0x5948, 0x3c59, 0x594a, 0x593c, 0x594b, 0x462b, 0x5949, 0x5776, 0x4d23, 0x3d21, 0x594c, 0x453c, 0x4d35, 0x594d, 0x5947, 0x3325, 0x3f7e, 0x3835, 0x407c, 0x3078, 0x3476, 0x594e, 0x594f, 0x3422, 0x5950, 0x345f, 0x3041, 0x5951, 0x4935, 0x4f71, 0x5952, 0x4145, 0x5956, 0x492e, 0x5955, 0x5954, 0x5957, 0x4b5b, 0x3d29, 0x4627, 0x5953, 0x5958, 0x5959, 0x4865, 0x405c, 0x3679, 0x5823, 0x544a, 0x542a, 0x5056, 0x3364, 0x5557, 0x4f48, 0x3962, 0x3f4b, 0x4362, 0x3652, 0x4d43, 0x596e, 0x5970, 0x3533, 0x3635, 0x3e24, 0x486b, 0x482b, 0x304b, 0x392b, 0x4179, 0x5962, 0x403c, 0x3932, 0x3958, 0x504b, 0x3178, 0x4664, 0x3e5f, 0x3564, 0x5748, 0x5178, 0x3c66, 0x4a5e, 0x3c3d, 0x5966, 0x5867, 0x445a, 0x3854, 0x483d, 0x3261, 0x5459, 0x4330, 0x4361, 0x5a22, 0x485f, 0x5034, 0x3e7c, 0x4529, 0x395a, 0x5a23, 0x5429, 0x5a24, 0x597b, 0x362c, 0x376b, 0x3179, 0x597c, 0x3365, 0x3e76, 0x3f76, 0x5231, 0x4064, 0x3633, 0x597e, 0x597d, 0x3e3b, 0x4660, 0x573c, 0x5a21, 0x4139, 0x3572, 0x4168, 0x3c75, 0x3455, 0x415d, 0x447d, 0x3c38, 0x3732, 0x376f, 0x596c, 0x463e, 0x3f2d, 0x3b4b, 0x354a, 0x5b49, 0x5057, 0x4d39, 0x303c, 0x3376, 0x3b77, 0x5b4a, 0x3a2f, 0x5464, 0x3536, 0x3573, 0x5856, 0x4850, 0x3756, 0x4750, 0x5857, 0x3f2f, 0x5b3b, 0x5858, 0x504c, 0x3b2e, 0x6b3e, 0x4150, 0x4175, 0x5472, 0x3855, 0x3434, 0x3375, 0x493e, 0x4550, 0x4559, 0x407b, 0x3170, 0x5859, 0x394e, 0x353d, 0x585a, 0x5646, 0x4b22, 0x482f, 0x4932, 0x344c, 0x3f4c, 0x3974, 0x585b, 0x585c, 0x3667, 0x3c41, 0x4c6a, 0x4f77, 0x585d, 0x4730, 0x3950, 0x3d23, 0x4c5e, 0x464a, 0x5860, 0x585e, 0x585f, 0x307e, 0x3e67, 0x4a23, 0x3c74, 0x3831, 0x386e, 0x5862, 0x3d4b, 0x5864, 0x5863, 0x457c, 0x5865, 0x5866, 0x4126, 0x4830, 0x306c, 0x3926, 0x3c53, 0x4e71, 0x5b3d, 0x4153, 0x362f, 0x567a, 0x452c, 0x3d59, 0x5b3e, 0x5b3f, 0x4078, 0x3e22, 0x404d, 0x5b40, 0x4a46, 0x322a, 0x5342, 0x4363, 0x512b, 0x5b42, 0x4055, 0x5b43, 0x3f31, 0x443c, 0x475a, 0x5b44, 0x5968, 0x4957, 0x3934, 0x4e70, 0x5448, 0x307c, 0x3452, 0x5059, 0x5969, 0x5e4b, 0x596b, 0x5830, 0x3b2f, 0x3131, 0x3357, 0x584e, 0x5451, 0x3d33, 0x3f6f, 0x4f3b, 0x5850, 0x374b, 0x5851, 0x4625, 0x4778, 0x523d, 0x5852, 0x4464, 0x4a2e, 0x4727, 0x5826, 0x497d, 0x4e67, 0x3b5c, 0x306b, 0x3b2a, 0x502d, 0x3130, 0x5764, 0x573f, 0x3525, 0x4274, 0x444f, 0x3229, 0x3237, 0x3165, 0x5f32, 0x553c, 0x3f28, 0x422c, 0x5855, 0x4231, 0x5854, 0x4e54, 0x5a60, 0x4e40, 0x5834, 0x432e, 0x5321, 0x4e23, 0x3c34, 0x4834, 0x4251, 0x3e6d, 0x5036, 0x5a61, 0x4764, 0x3327, 0x3672, 0x4c7c, 0x407a, 0x4077, 0x5139, 0x5161, 0x5847, 0x325e, 0x4065, 0x3a71, 0x5848, 0x542d, 0x4f61, 0x5849, 0x584a, 0x4f43, 0x3378, 0x3e47, 0x584b, 0x5b4c, 0x4825, 0x4f58, 0x487e, 0x324e, 0x5356, 0x3266, 0x3c30, 0x5351, 0x4b2b, 0x3734, 0x3722, 0x4a65, 0x4821, 0x4a5c, 0x3164, 0x5070, 0x4551, 0x5b45, 0x357e, 0x3f5a, 0x3945, 0x3e64, 0x416d, 0x5f36, 0x5f35, 0x563b, 0x3d50, 0x5559, 0x3048, 0x3623, 0x3f49, 0x4c28, 0x5f33, 0x4a37, 0x5352, 0x584f, 0x5236, 0x3a45, 0x4b3e, 0x4c3e, 0x5f37, 0x3570, 0x5f34, 0x5375, 0x3354, 0x3877, 0x5f3a, 0x3a4f, 0x3c2a, 0x3575, 0x4d2c, 0x437b, 0x3a73, 0x4074, 0x4d42, 0x4f72, 0x5f38, 0x4f45, 0x4240, 0x5f39, 0x4270, 0x3e7d, 0x415f, 0x4d4c, 0x5277, 0x374d, 0x5f41, 0x5f44, 0x3771, 0x3049, 0x3656, 0x3754, 0x3a2c, 0x4c7d, 0x3f54, 0x4b31, 0x4674, 0x5628, 0x5f45, 0x4e62, 0x3333, 0x4e7c, 0x3435, 0x4e47, 0x3a70, 0x4e61, 0x513d, 0x5f40, 0x3474, 0x334a, 0x3866, 0x5f3b, 0x4445, 0x5f3c, 0x5f3d, 0x5f3e, 0x453b, 0x5f3f, 0x5f42, 0x5431, 0x5f43, 0x473a, 0x4e58, 0x4458, 0x5f4a, 0x5f4f, 0x565c, 0x5f49, 0x5f5a, 0x4e36, 0x3a47, 0x5f4e, 0x5f48, 0x455e, 0x496b, 0x3a74, 0x437c, 0x3e57, 0x5f46, 0x5f4d, 0x4558, 0x5526, 0x3a4d, 0x3e4c, 0x533d, 0x3840, 0x5664, 0x5f47, 0x393e, 0x3f27, 0x417c, 0x5f4b, 0x5f4c, 0x5f50, 0x5f5b, 0x5f65, 0x5f57, 0x5f56, 0x5749, 0x5f63, 0x5f64, 0x656b, 0x5227, 0x5f52, 0x3f29, 0x545b, 0x3f48, 0x5f54, 0x4f4c, 0x5f5d, 0x514a, 0x5f5e, 0x3027, 0x4637, 0x5f53, 0x3a65, 0x365f, 0x4d5b, 0x397e, 0x5455, 0x5f5f, 0x4f6c, 0x3025, 0x5f67, 0x5f51, 0x5146, 0x5f55, 0x5f58, 0x5f59, 0x5f5c, 0x3b29, 0x5f60, 0x5f61, 0x5f62, 0x5f66, 0x5f68, 0x5334, 0x3867, 0x4536, 0x5f6a, 0x495a, 0x4128, 0x4444, 0x3f5e, 0x4f78, 0x555c, 0x5f6e, 0x3238, 0x3a5f, 0x5f6c, 0x5b41, 0x5164, 0x4b74, 0x343d, 0x3026, 0x5f71, 0x4c46, 0x5f72, 0x5f6d, 0x5f69, 0x5f6b, 0x5f6f, 0x5f70, 0x3b3d, 0x5f73, 0x5f74, 0x3b23, 0x4a5b, 0x4e28, 0x6027, 0x332a, 0x6026, 0x6021, 0x5f7e, 0x4d59, 0x5f7c, 0x5f7a, 0x3f50, 0x5744, 0x494c, 0x5f78, 0x3021, 0x5f7d, 0x5f7b, 0x6022, 0x6028, 0x3748, 0x4621, 0x4936, 0x4032, 0x5f75, 0x453e, 0x5844, 0x5f79, 0x4476, 0x6023, 0x6024, 0x6025, 0x5025, 0x6034, 0x4c64, 0x6031, 0x3f26, 0x602f, 0x4e39, 0x602b, 0x4946, 0x402e, 0x602e, 0x3a6d, 0x3a30, 0x6029, 0x5f76, 0x6033, 0x6038, 0x342d, 0x6039, 0x4f32, 0x3a48, 0x6030, 0x507a, 0x602c, 0x547b, 0x5f77, 0x4567, 0x602d, 0x5377, 0x6036, 0x6037, 0x6044, 0x5061, 0x603c, 0x6049, 0x604a, 0x603e, 0x602a, 0x4924, 0x6041, 0x6032, 0x4a48, 0x6043, 0x6035, 0x4e4b, 0x4b43, 0x604d, 0x6046, 0x6042, 0x604b, 0x603a, 0x603f, 0x6040, 0x6045, 0x6047, 0x6048, 0x604c, 0x603b, 0x4b54, 0x6055, 0x6056, 0x6052, 0x6050, 0x3c4e, 0x6051, 0x3842, 0x5845, 0x506a, 0x426f, 0x604f, 0x603d, 0x6054, 0x6053, 0x6057, 0x605c, 0x6058, 0x5676, 0x3330, 0x576c, 0x4b3b, 0x605a, 0x4e7b, 0x3a59, 0x6061, 0x605d, 0x522d, 0x6062, 0x605b, 0x6059, 0x605f, 0x6060, 0x605e, 0x6064, 0x4677, 0x582c, 0x546b, 0x6066, 0x4a49, 0x6065, 0x3841, 0x6067, 0x6068, 0x6069, 0x6063, 0x3a3f, 0x4c67, 0x606a, 0x4f79, 0x606b, 0x4842, 0x3d40, 0x4452, 0x606c, 0x606d, 0x4774, 0x4b44, 0x606e, 0x3b58, 0x5836, 0x5272, 0x606f, 0x4d45, 0x365a, 0x6071, 0x5430, 0x4027, 0x3451, 0x4e27, 0x6070, 0x6072, 0x394c, 0x397a, 0x4d3c, 0x6073, 0x4654, 0x6074, 0x5432, 0x4826, 0x6076, 0x6075, 0x6077, 0x4d41, 0x4a25, 0x545a, 0x5b57, 0x5b59, 0x5b58, 0x3967, 0x5b5c, 0x5b5d, 0x3558, 0x5b5a, 0x5b5b, 0x3321, 0x5b5f, 0x3b78, 0x5637, 0x5b60, 0x3e79, 0x373b, 0x5b50, 0x4c2e, 0x3f32, 0x3b35, 0x5778, 0x3f53, 0x3f69, 0x3c61, 0x4c33, 0x5b5e, 0x3053, 0x4e6b, 0x3758, 0x5739, 0x4642, 0x4024, 0x4c39, 0x5b67, 0x5b61, 0x463a, 0x5b63, 0x5b68, 0x4577, 0x5b6a, 0x5b69, 0x3f40, 0x5b66, 0x5b65, 0x3439, 0x402c, 0x4222, 0x5b62, 0x5b64, 0x504d, 0x5b6d, 0x405d, 0x5b72, 0x3662, 0x5b73, 0x5b52, 0x3938, 0x542b, 0x5b6c, 0x3f51, 0x5b70, 0x5b51, 0x3566, 0x5b6b, 0x3f65, 0x5b6e, 0x5b71, 0x5b79, 0x3921, 0x3023, 0x4271, 0x3347, 0x5b6f, 0x5b78, 0x4652, 0x5b74, 0x5b75, 0x5b77, 0x5b76, 0x5b7e, 0x5372, 0x323a, 0x5b7d, 0x5c24, 0x5b7b, 0x5b7a, 0x5b7c, 0x4560, 0x3b79, 0x5c23, 0x5c25, 0x4c43, 0x3651, 0x5d40, 0x5c21, 0x5c22, 0x4735, 0x3669, 0x5c27, 0x5c26, 0x5c29, 0x3124, 0x354c, 0x3f30, 0x515f, 0x3642, 0x5c28, 0x4b7a, 0x6b73, 0x4b5c, 0x4b7e, 0x4c41, 0x487b, 0x5c2a, 0x4c6e, 0x5c2b, 0x5b53, 0x5c2f, 0x5c2c, 0x3e33, 0x4a7b, 0x5c2d, 0x494a, 0x4439, 0x473d, 0x5c2e, 0x5476, 0x5066, 0x442b, 0x3655, 0x5b54, 0x315a, 0x5b55, 0x5b56, 0x3a3e, 0x4840, 0x4a3f, 0x4849, 0x5733, 0x4979, 0x3f47, 0x3a78, 0x523c, 0x623a, 0x3426, 0x3138, 0x3834, 0x4f44, 0x5967, 0x4f26, 0x4d62, 0x596d, 0x3660, 0x5239, 0x393b, 0x6239, 0x6237, 0x3473, 0x4c6c, 0x4c2b, 0x3772, 0x5832, 0x516b, 0x3a3b, 0x4a27, 0x4d37, 0x5244, 0x3f64, 0x3c50, 0x3661, 0x5e45, 0x5e46, 0x5b3c, 0x5159, 0x4666, 0x444e, 0x376e, 0x375c, 0x3f7c, 0x5760, 0x4675, 0x313c, 0x5e48, 0x3d31, 0x4c57, 0x5e4a, 0x5e49, 0x356c, 0x495d, 0x3042, 0x452e, 0x452b, 0x444c, 0x3c69, 0x4b7d, 0x3a43, 0x6579, 0x4867, 0x657a, 0x4d7d, 0x5731, 0x383e, 0x4268, 0x4851, 0x657b, 0x364a, 0x3c4b, 0x517d, 0x6621, 0x436e, 0x6624, 0x657e, 0x6625, 0x4d57, 0x3741, 0x657c, 0x657d, 0x6623, 0x445d, 0x6628, 0x6627, 0x4343, 0x465e, 0x662a, 0x4437, 0x6622, 0x4a3c, 0x3d63, 0x3943, 0x6626, 0x5055, 0x4e2f, 0x6629, 0x6630, 0x5226, 0x3d2a, 0x662d, 0x662f, 0x4051, 0x524c, 0x3c27, 0x6631, 0x5276, 0x574b, 0x4d7e, 0x4d5e, 0x4226, 0x662b, 0x662c, 0x3d3f, 0x662e, 0x6633, 0x6632, 0x6636, 0x6638, 0x446f, 0x4448, 0x3e6a, 0x496f, 0x6637, 0x3670, 0x4364, 0x5369, 0x6634, 0x6635, 0x4822, 0x663d, 0x6639, 0x4645, 0x4d71, 0x663b, 0x663c, 0x3b69, 0x663e, 0x663a, 0x4037, 0x5324, 0x663f, 0x4974, 0x6643, 0x6644, 0x5076, 0x433d, 0x4344, 0x6642, 0x6641, 0x6647, 0x4f31, 0x6b74, 0x664a, 0x6645, 0x3c5e, 0x4929, 0x3c35, 0x4f53, 0x6648, 0x6649, 0x664e, 0x6650, 0x6651, 0x664b, 0x3555, 0x664c, 0x664f, 0x445b, 0x6646, 0x664d, 0x6652, 0x6654, 0x6653, 0x6655, 0x5978, 0x6656, 0x6657, 0x5753, 0x665d, 0x665e, 0x3f57, 0x5450, 0x5756, 0x3466, 0x4b6f, 0x665a, 0x5843, 0x574e, 0x5022, 0x434f, 0x665f, 0x3c3e, 0x3942, 0x665b, 0x5127, 0x3a22, 0x424f, 0x582b, 0x4a6b, 0x656e, 0x665c, 0x3775, 0x4866, 0x4475, 0x6532, 0x447e, 0x4b7c, 0x6533, 0x552c, 0x536e, 0x4a58, 0x3032, 0x4b4e, 0x4d6a, 0x3a6a, 0x6535, 0x6534, 0x575a, 0x3959, 0x5666, 0x3628, 0x4d70, 0x524b, 0x3126, 0x4a35, 0x3368, 0x4973, 0x3f4d, 0x507b, 0x4a52, 0x6536, 0x3b42, 0x4f5c, 0x392c, 0x5457, 0x3a26, 0x5167, 0x4f7c, 0x3c52, 0x6537, 0x485d, 0x3f6d, 0x3176, 0x4b5e, 0x3c45, 0x3c44, 0x527a, 0x435c, 0x3f5c, 0x383b, 0x4342, 0x3a2e, 0x5422, 0x475e, 0x442f, 0x326c, 0x3951, 0x653b, 0x4148, 0x552f, 0x653c, 0x653e, 0x3467, 0x3654, 0x4b42, 0x5130, 0x353c, 0x4a59, 0x3762, 0x4964, 0x3d2b, 0x4e3e, 0x5770, 0x5021, 0x4959, 0x367b, 0x6658, 0x3c62, 0x333e, 0x4950, 0x6659, 0x3322, 0x5e4c, 0x5348, 0x5e4d, 0x5222, 0x5e4e, 0x3e4d, 0x5e4f, 0x4a2c, 0x527c, 0x335f, 0x656a, 0x4461, 0x3e21, 0x4e32, 0x4472, 0x3e56, 0x4628, 0x3263, 0x3e53, 0x477c, 0x4c6b, 0x3d6c, 0x4e5d, 0x4a3a, 0x4641, 0x656c, 0x503c, 0x5539, 0x656d, 0x4a74, 0x4d40, 0x4245, 0x656f, 0x4244, 0x6570, 0x6578, 0x4d4d, 0x493d, 0x5259, 0x6128, 0x536c, 0x4b6a, 0x4671, 0x612c, 0x6127, 0x6129, 0x612a, 0x612f, 0x326d, 0x612b, 0x385a, 0x612d, 0x612e, 0x6130, 0x353a, 0x6131, 0x6133, 0x6138, 0x5152, 0x6136, 0x6135, 0x416b, 0x6137, 0x5440, 0x6132, 0x613a, 0x3036, 0x6134, 0x3f79, 0x6139, 0x613b, 0x613e, 0x613c, 0x5645, 0x4f3f, 0x613d, 0x613f, 0x424d, 0x366b, 0x5378, 0x474d, 0x3765, 0x3e7e, 0x6140, 0x6141, 0x6147, 0x3367, 0x4669, 0x345e, 0x5142, 0x6148, 0x6146, 0x6145, 0x6143, 0x6142, 0x3140, 0x5538, 0x6144, 0x614b, 0x614c, 0x614a, 0x6f7a, 0x6153, 0x6152, 0x4736, 0x6149, 0x614e, 0x6150, 0x6154, 0x6151, 0x614d, 0x614f, 0x6155, 0x6156, 0x6157, 0x6158, 0x615a, 0x615b, 0x4e21, 0x675d, 0x3428, 0x565d, 0x5132, 0x3332, 0x3924, 0x5773, 0x4749, 0x3e5e, 0x392e, 0x4e57, 0x326e, 0x5b4f, 0x3c3a, 0x5251, 0x4b48, 0x304d, 0x4f6f, 0x5963, 0x3d6d, 0x3152, 0x4a50, 0x323c, 0x4b27, 0x372b, 0x4a26, 0x4f23, 0x6078, 0x554a, 0x607b, 0x607a, 0x4541, 0x4c7b, 0x4131, 0x6079, 0x5663, 0x322f, 0x5644, 0x355b, 0x3478, 0x5621, 0x4f2f, 0x306f, 0x607c, 0x6121, 0x3323, 0x607d, 0x607e, 0x4331, 0x435d, 0x6122, 0x3779, 0x3b4f, 0x6123, 0x443b, 0x6124, 0x6125, 0x6126, 0x3431, 0x3849, 0x463d, 0x446a, 0x3222, 0x5052, 0x675b, 0x3b43, 0x5357, 0x5344, 0x3963, 0x624f, 0x572f, 0x476c, 0x3153, 0x3432, 0x6251, 0x5072, 0x422e, 0x6250, 0x3f62, 0x5326, 0x3557, 0x6252, 0x356a, 0x436d, 0x387d, 0x382e, 0x4553, 0x374f, 0x6254, 0x6253, 0x3648, 0x5779, 0x4d25, 0x6258, 0x6256, 0x4a7c, 0x3f35, 0x5339, 0x6255, 0x6257, 0x412e, 0x4048, 0x625b, 0x625a, 0x402a, 0x414e, 0x625c, 0x625d, 0x625e, 0x5b48, 0x5153, 0x4d22, 0x3d28, 0x5e43, 0x5825, 0x3f2a, 0x5b4d, 0x526c, 0x467a, 0x452a, 0x5e44, 0x3157, 0x5f2e, 0x4a3d, 0x5f31, 0x392d, 0x527d, 0x3825, 0x3a6b, 0x335a, 0x355c, 0x5545, 0x4356, 0x4f52, 0x3b21, 0x6573, 0x6572, 0x6574, 0x4d64, 0x4875, 0x352f, 0x473f, 0x6576, 0x6c30, 0x6566, 0x3969, 0x3531, 0x423c, 0x6568, 0x6567, 0x6569, 0x524d, 0x616a, 0x504e, 0x4d2e, 0x5165, 0x324a, 0x316b, 0x3172, 0x456d, 0x5543, 0x5330, 0x615c, 0x615d, 0x525b, 0x3339, 0x314b, 0x4d79, 0x5577, 0x615e, 0x3e36, 0x347d, 0x615f, 0x3a5c, 0x6160, 0x3b32, 0x4249, 0x6161, 0x506c, 0x4d3d, 0x6162, 0x3543, 0x4547, 0x6163, 0x6164, 0x5379, 0x6165, 0x512d, 0x6166, 0x4e22, 0x6167, 0x3542, 0x6168, 0x3b55, 0x5044, 0x6260, 0x3158, 0x5264, 0x6261, 0x3c49, 0x484c, 0x6263, 0x6c7e, 0x6c7d, 0x5f2f, 0x6262, 0x563e, 0x4d7c, 0x4326, 0x6343, 0x5652, 0x6267, 0x6268, 0x5347, 0x626c, 0x3f6c, 0x626d, 0x6265, 0x3340, 0x446e, 0x626e, 0x5043, 0x3a76, 0x6269, 0x375e, 0x3b33, 0x4c2c, 0x4b4b, 0x6264, 0x6266, 0x626a, 0x626b, 0x6277, 0x6274, 0x5475, 0x6273, 0x452d, 0x557a, 0x4542, 0x3240, 0x626f, 0x6272, 0x412f, 0x4b3c, 0x3521, 0x6279, 0x3c31, 0x6271, 0x5054, 0x5439, 0x6275, 0x3956, 0x6276, 0x4753, 0x6270, 0x575c, 0x6d21, 0x6278, 0x6d25, 0x627e, 0x4a51, 0x4135, 0x3b50, 0x3f56, 0x3a63, 0x4b21, 0x6d26, 0x6d23, 0x6d22, 0x3b56, 0x6d27, 0x5074, 0x6d24, 0x3a5e, 0x3677, 0x6321, 0x3632, 0x4c71, 0x3927, 0x4f22, 0x4721, 0x3f52, 0x3671, 0x627a, 0x627b, 0x627d, 0x627c, 0x4455, 0x6322, 0x5341, 0x6327, 0x4744, 0x4f24, 0x6329, 0x3a37, 0x6328, 0x3b5a, 0x6323, 0x6324, 0x632a, 0x6326, 0x4e72, 0x5346, 0x3b3c, 0x5443, 0x447a, 0x6d28, 0x507c, 0x6325, 0x4375, 0x632d, 0x312f, 0x6332, 0x3c42, 0x632c, 0x353f, 0x4769, 0x6330, 0x3e2a, 0x4d6f, 0x3b73, 0x4c68, 0x632f, 0x6331, 0x4f27, 0x632e, 0x4e29, 0x3b5d, 0x356b, 0x3e65, 0x3252, 0x334d, 0x3139, 0x632b, 0x3251, 0x352c, 0x395f, 0x3668, 0x4f6b, 0x6337, 0x3b4c, 0x4847, 0x504a, 0x6338, 0x336e, 0x6d29, 0x537a, 0x5364, 0x6d2a, 0x6339, 0x5262, 0x6335, 0x535e, 0x3850, 0x6333, 0x6336, 0x375f, 0x6334, 0x4022, 0x633a, 0x5438, 0x3448, 0x633b, 0x3b45, 0x4977, 0x4965, 0x443d, 0x6d2b, 0x427d, 0x3b5b, 0x3f2e, 0x4e3f, 0x633c, 0x3f36, 0x316f, 0x5477, 0x633e, 0x6d2d, 0x633f, 0x3a29, 0x6d2c, 0x633d, 0x6340, 0x3a36, 0x362e, 0x5038, 0x3043, 0x6d2e, 0x6d2f, 0x4041, 0x6341, 0x4533, 0x6342, 0x5c32, 0x6d30, 0x386a, 0x4e6c, 0x6a27, 0x5067, 0x4a79, 0x4856, 0x4f37, 0x3349, 0x4e52, 0x3d64, 0x635e, 0x3b72, 0x6a28, 0x553d, 0x465d, 0x6a29, 0x6a2a, 0x6a2c, 0x6a2b, 0x6a2e, 0x6a2d, 0x3d58, 0x6a2f, 0x423e, 0x3441, 0x3477, 0x3b27, 0x6c66, 0x6c65, 0x373f, 0x4b79, 0x3162, 0x6c67, 0x4948, 0x6c68, 0x6c69, 0x4a56, 0x5e50, 0x3245, 0x547a, 0x464b, 0x3047, 0x3472, 0x4853, 0x4d50, 0x3f38, 0x3f5b, 0x4724, 0x5634, 0x4029, 0x5e51, 0x4928, 0x516f, 0x4524, 0x3067, 0x3336, 0x4845, 0x3062, 0x3776, 0x457a, 0x3673, 0x5552, 0x3350, 0x3c3c, 0x332d, 0x3e71, 0x3051, 0x5256, 0x4a63, 0x5725, 0x4d36, 0x3636, 0x3f39, 0x555b, 0x3827, 0x4557, 0x5e52, 0x3f59, 0x4255, 0x4740, 0x3b24, 0x3128, 0x456a, 0x457b, 0x4c27, 0x3127, 0x3556, 0x4428, 0x5e53, 0x513a, 0x3369, 0x4372, 0x3777, 0x5674, 0x3523, 0x3270, 0x4434, 0x4469, 0x402d, 0x5e54, 0x3068, 0x4544, 0x4160, 0x3955, 0x3e5c, 0x4d58, 0x304e, 0x4d4f, 0x5e56, 0x3e50, 0x573e, 0x5e55, 0x5550, 0x305d, 0x4462, 0x4223, 0x3c70, 0x5335, 0x4039, 0x4521, 0x3226, 0x5471, 0x4028, 0x4a43, 0x5e57, 0x557c, 0x3930, 0x482d, 0x4b29, 0x5e59, 0x3f3d, 0x4634, 0x5727, 0x4a30, 0x4443, 0x3356, 0x3952, 0x5638, 0x6a7c, 0x3034, 0x3f66, 0x4c74, 0x4d5a, 0x563f, 0x424e, 0x4e4e, 0x4c22, 0x502e, 0x4453, 0x3532, 0x5e58, 0x5575, 0x3c37, 0x3b53, 0x3024, 0x4532, 0x346c, 0x5571, 0x6a7d, 0x5e5a, 0x4d26, 0x4d6c, 0x4e66, 0x5e5c, 0x4d31, 0x4026, 0x573d, 0x5e5b, 0x3046, 0x3a34, 0x4953, 0x4473, 0x3e68, 0x3236, 0x404c, 0x4b70, 0x3c71, 0x3b3b, 0x3537, 0x4575, 0x5e66, 0x5e63, 0x3e5d, 0x5e5f, 0x3437, 0x3d5d, 0x5e60, 0x446d, 0x4f46, 0x3560, 0x365e, 0x4a5a, 0x3574, 0x5e65, 0x5546, 0x5e61, 0x4c4d, 0x467e, 0x4545, 0x5234, 0x3e72, 0x4253, 0x4c3d, 0x3338, 0x3d53, 0x3f58, 0x4d46, 0x515a, 0x346b, 0x5e64, 0x5e5d, 0x5e67, 0x6a7e, 0x4230, 0x5e62, 0x5640, 0x3527, 0x3274, 0x5e68, 0x5e72, 0x5e6d, 0x5e71, 0x4860, 0x5761, 0x5e6f, 0x4368, 0x4c61, 0x3265, 0x523e, 0x5e6e, 0x5e6b, 0x4e55, 0x3427, 0x3f2b, 0x3e3e, 0x3d52, 0x5e69, 0x542e, 0x5e5e, 0x5e6a, 0x403f, 0x5e6c, 0x3273, 0x3869, 0x4227, 0x3d41, 0x5e75, 0x5e78, 0x322b, 0x3424, 0x346a, 0x4926, 0x5e76, 0x4b51, 0x3863, 0x5e77, 0x5e7a, 0x5e79, 0x4c42, 0x3061, 0x346e, 0x653a, 0x502f, 0x326b, 0x6b21, 0x5e74, 0x4963, 0x5e73, 0x305a, 0x5221, 0x3177, 0x4c2f, 0x5e70, 0x4b24, 0x552a, 0x5e7b, 0x345d, 0x4426, 0x5e7d, 0x437e, 0x4421, 0x5f21, 0x414c, 0x5e7c, 0x3e6f, 0x4632, 0x3345, 0x4876, 0x4b3a, 0x5e7e, 0x5f24, 0x5732, 0x3337, 0x4143, 0x474b, 0x3225, 0x3469, 0x572b, 0x446c, 0x5f22, 0x5f23, 0x5f25, 0x3a33, 0x5f26, 0x405e, 0x4943, 0x3259, 0x4766, 0x5f27, 0x475c, 0x5f28, 0x6b22, 0x4b53, 0x5f2a, 0x5f29, 0x3241, 0x454a, 0x5f2b, 0x545c, 0x4841, 0x5f2c, 0x3e70, 0x5f2d, 0x5627, 0x6a37, 0x6b36, 0x4a55, 0x587c, 0x3844, 0x3925, 0x3745, 0x557e, 0x394a, 0x5027, 0x744d, 0x3550, 0x4374, 0x3e48, 0x6b37, 0x303d, 0x3d4c, 0x4132, 0x3156, 0x3328, 0x3852, 0x4922, 0x3658, 0x6b38, 0x3e34, 0x4a7d, 0x4743, 0x557b, 0x3773, 0x4e44, 0x552b, 0x3173, 0x6c33, 0x305f, 0x6c35, 0x3637, 0x414f, 0x757a, 0x5031, 0x5565, 0x4e53, 0x3d6f, 0x3362, 0x382b, 0x5536, 0x6d3d, 0x364f, 0x4b39, 0x5042, 0x373d, 0x6c36, 0x4a29, 0x4554, 0x6c39, 0x6c38, 0x4243, 0x6c37, 0x507d, 0x6c3a, 0x6c3b, 0x5765, 0x6c3c, 0x6c3d, 0x466c, 0x4e5e, 0x3c48, 0x4855, 0x3529, 0x3e49, 0x563c, 0x5467, 0x512e, 0x5071, 0x6a38, 0x6a39, 0x6a3a, 0x3a35, 0x4a31, 0x3f75, 0x4d7a, 0x6a40, 0x303a, 0x6a3e, 0x4025, 0x6a3b, 0x327d, 0x4377, 0x3b68, 0x5257, 0x4e74, 0x6a3f, 0x6a3c, 0x6a43, 0x5047, 0x5333, 0x343a, 0x4341, 0x5772, 0x5551, 0x4a47, 0x6a45, 0x6a44, 0x6a47, 0x6a46, 0x5667, 0x4f54, 0x6a4b, 0x3b4e, 0x3d7a, 0x494e, 0x6a4c, 0x4939, 0x4f7e, 0x6a4a, 0x544e, 0x6a4d, 0x6a4f, 0x4d6d, 0x6a49, 0x6a4e, 0x4e6e, 0x3b5e, 0x333f, 0x4655, 0x3e30, 0x4e7a, 0x4767, 0x3e27, 0x6a50, 0x5647, 0x4140, 0x545d, 0x6a51, 0x4f3e, 0x6a52, 0x4a6e, 0x452f, 0x3035, 0x6a54, 0x6a53, 0x745f, 0x443a, 0x3129, 0x655f, 0x6a55, 0x4a6f, 0x6a56, 0x6a57, 0x4658, 0x6a58, 0x6a59, 0x543b, 0x477a, 0x5237, 0x387c, 0x6a42, 0x325c, 0x427c, 0x5478, 0x4c66, 0x576e, 0x5442, 0x5350, 0x6b43, 0x4573, 0x377e, 0x6b54, 0x4b37, 0x6b5e, 0x404a, 0x4d7b, 0x332f, 0x465a, 0x6b7c, 0x443e, 0x4e34, 0x4429, 0x313e, 0x547d, 0x4a75, 0x566c, 0x4653, 0x3664, 0x3b7a, 0x5060, 0x4931, 0x5453, 0x4828, 0x384b, 0x683e, 0x493c, 0x683b, 0x406e, 0x5053, 0x3244, 0x3465, 0x683c, 0x5548, 0x3645, 0x683d, 0x4a78, 0x385c, 0x4c75, 0x4034, 0x516e, 0x683f, 0x6842, 0x3a3c, 0x312d, 0x3d5c, 0x6a3d, 0x6843, 0x6846, 0x684b, 0x684c, 0x4b49, 0x3065, 0x3c2b, 0x3939, 0x6841, 0x4d77, 0x684a, 0x4e76, 0x556d, 0x4156, 0x6844, 0x4336, 0x397b, 0x5626, 0x6848, 0x4a60, 0x5466, 0x6840, 0x6845, 0x6847, 0x4739, 0x3763, 0x6849, 0x3f5d, 0x6852, 0x6857, 0x6855, 0x3c5c, 0x3c4f, 0x685b, 0x685e, 0x685a, 0x317a, 0x3058, 0x4433, 0x384c, 0x4662, 0x483e, 0x4861, 0x684f, 0x6854, 0x6856, 0x3971, 0x6858, 0x5775, 0x447b, 0x685c, 0x3269, 0x6851, 0x3c6d, 0x3f42, 0x684d, 0x5679, 0x4178, 0x3271, 0x685f, 0x4a41, 0x6859, 0x5524, 0x316a, 0x553b, 0x684e, 0x6850, 0x3630, 0x6853, 0x685d, 0x4038, 0x4a77, 0x4b28, 0x465c, 0x4075, 0x6869, 0x5023, 0x6872, 0x566a, 0x6860, 0x6861, 0x5179, 0x3a4b, 0x3879, 0x3871, 0x5454, 0x686f, 0x686e, 0x686c, 0x3970, 0x4c52, 0x6866, 0x4e26, 0x3f72, 0x3038, 0x6871, 0x6870, 0x5740, 0x6864, 0x4d29, 0x4923, 0x3b38, 0x3d5b, 0x686a, 0x6862, 0x6863, 0x6865, 0x3535, 0x6867, 0x4745, 0x686b, 0x686d, 0x3d30, 0x572e, 0x6878, 0x6875, 0x4d30, 0x6876, 0x413a, 0x6868, 0x4337, 0x3070, 0x6874, 0x6877, 0x3923, 0x4952, 0x434e, 0x4e60, 0x4066, 0x4b73, 0x4c5d, 0x5035, 0x4a61, 0x6873, 0x3c6c, 0x6879, 0x435e, 0x4665, 0x3977, 0x3074, 0x5758, 0x3c2c, 0x456f, 0x4c44, 0x6926, 0x492d, 0x6922, 0x4062, 0x3f43, 0x687e, 0x3957, 0x687b, 0x6924, 0x524e, 0x6923, 0x5632, 0x5735, 0x6927, 0x3d37, 0x687c, 0x687d, 0x6921, 0x4d56, 0x522c, 0x6932, 0x6929, 0x342a, 0x343b, 0x692b, 0x5028, 0x6925, 0x337e, 0x692c, 0x4063, 0x692a, 0x6939, 0x6938, 0x692e, 0x687a, 0x6928, 0x3f2c, 0x6931, 0x693a, 0x4225, 0x692f, 0x3845, 0x692d, 0x535c, 0x6934, 0x6935, 0x6937, 0x6947, 0x4046, 0x6945, 0x6930, 0x693b, 0x3071, 0x693c, 0x5525, 0x693e, 0x693f, 0x6941, 0x4171, 0x4836, 0x693d, 0x6942, 0x6943, 0x6933, 0x6936, 0x3b31, 0x6940, 0x3c77, 0x6944, 0x6946, 0x694a, 0x694e, 0x325b, 0x6948, 0x372e, 0x694b, 0x694c, 0x5541, 0x4423, 0x6958, 0x3a61, 0x6949, 0x5323, 0x6954, 0x6957, 0x6950, 0x694f, 0x4741, 0x6952, 0x6959, 0x3348, 0x6953, 0x4f70, 0x694d, 0x3377, 0x6956, 0x695a, 0x4c34, 0x4f2d, 0x6955, 0x695c, 0x695b, 0x695e, 0x6951, 0x695d, 0x695f, 0x434a, 0x4737, 0x344e, 0x3b36, 0x5040, 0x6c23, 0x4537, 0x537b, 0x6c24, 0x6c25, 0x465b, 0x3f6e, 0x6c26, 0x6c27, 0x502a, 0x4738, 0x3868, 0x6c28, 0x5639, 0x557d, 0x344b, 0x323d, 0x4e64, 0x4667, 0x4d61, 0x3475, 0x4b40, 0x3c5f, 0x6962, 0x6963, 0x516a, 0x6965, 0x3479, 0x6964, 0x5133, 0x4a62, 0x3250, 0x6968, 0x6966, 0x6967, 0x5633, 0x6969, 0x696a, 0x696b, 0x696c, 0x6c2f, 0x4539, 0x364e, 0x5273, 0x356e, 0x3b59, 0x6c31, 0x5263, 0x4e63, 0x4438, 0x433f, 0x363e, 0x5839, 0x3148, 0x314f, 0x3151, 0x457e, 0x3150, 0x432b, 0x5531, 0x6b24, 0x3a41, 0x4c3a, 0x6b25, 0x6b27, 0x6b28, 0x6b26, 0x6b29, 0x6b2b, 0x6b2a, 0x6b2c, 0x4a4f, 0x5835, 0x4371, 0x4325, 0x4678, 0x6b2d, 0x444a, 0x6b2e, 0x6b2f, 0x6b30, 0x3755, 0x377a, 0x6b31, 0x4762, 0x6b33, 0x3a24, 0x5175, 0x3031, 0x6b32, 0x6b34, 0x352a, 0x4248, 0x4768, 0x6b35, 0x4b2e, 0x635f, 0x5340, 0x595b, 0x4d21, 0x562d, 0x4773, 0x5960, 0x3b63, 0x3a3a, 0x6362, 0x4f2b, 0x6360, 0x4947, 0x3a39, 0x5134, 0x6361, 0x486a, 0x392f, 0x3d2d, 0x3358, 0x4e5b, 0x4c40, 0x6368, 0x6369, 0x4d74, 0x4c2d, 0x3c33, 0x636a, 0x636b, 0x505a, 0x467b, 0x375a, 0x475f, 0x524a, 0x4e56, 0x6364, 0x636c, 0x4972, 0x3341, 0x6367, 0x4663, 0x6365, 0x6d33, 0x6366, 0x4933, 0x4566, 0x3935, 0x433b, 0x6363, 0x453d, 0x4124, 0x4259, 0x3257, 0x636d, 0x3b26, 0x442d, 0x6370, 0x3e5a, 0x637b, 0x6375, 0x3a53, 0x3750, 0x534d, 0x564e, 0x5553, 0x3941, 0x5534, 0x5158, 0x5039, 0x4776, 0x482a, 0x3234, 0x435a, 0x636e, 0x637c, 0x636f, 0x3728, 0x6377, 0x6374, 0x373a, 0x4522, 0x6376, 0x455d, 0x3228, 0x467c, 0x4460, 0x5722, 0x4061, 0x6379, 0x637a, 0x637d, 0x4c29, 0x6373, 0x533e, 0x3143, 0x6d34, 0x6371, 0x6372, 0x6378, 0x503a, 0x4643, 0x5473, 0x637e, 0x3d60, 0x6427, 0x6426, 0x5173, 0x6423, 0x6429, 0x4877, 0x4f34, 0x6428, 0x642e, 0x4265, 0x3634, 0x3d72, 0x6422, 0x3a69, 0x642a, 0x642c, 0x367d, 0x565e, 0x6432, 0x642d, 0x6421, 0x3b6e, 0x4d5d, 0x4722, 0x4549, 0x4177, 0x6424, 0x4733, 0x3d2c, 0x3d3d, 0x6425, 0x5747, 0x3262, 0x642b, 0x3c43, 0x642f, 0x3b6b, 0x6430, 0x4528, 0x6431, 0x5563, 0x3f23, 0x643a, 0x6437, 0x643b, 0x643d, 0x4656, 0x3a46, 0x404b, 0x3821, 0x6434, 0x5421, 0x3a23, 0x3d7e, 0x643c, 0x4d3f, 0x4479, 0x4f7b, 0x4966, 0x533f, 0x4f51, 0x6433, 0x6438, 0x6439, 0x4c69, 0x4c4e, 0x4054, 0x6435, 0x4130, 0x6436, 0x4e50, 0x3b41, 0x3553, 0x4873, 0x3d27, 0x5547, 0x492c, 0x3822, 0x644a, 0x644c, 0x5144, 0x523a, 0x3a2d, 0x3a54, 0x6443, 0x356d, 0x574d, 0x6440, 0x4f7d, 0x643f, 0x415c, 0x4c4a, 0x4a67, 0x4457, 0x4c54, 0x6448, 0x6447, 0x6441, 0x6444, 0x352d, 0x5359, 0x6446, 0x5279, 0x3463, 0x3b34, 0x496e, 0x343e, 0x3b6c, 0x514d, 0x4c6d, 0x6d35, 0x4765, 0x5428, 0x644b, 0x5755, 0x6442, 0x3d25, 0x6445, 0x5366, 0x6449, 0x4978, 0x643e, 0x5365, 0x477e, 0x3649, 0x547c, 0x3233, 0x6457, 0x4e42, 0x644d, 0x4e3c, 0x385b, 0x6456, 0x3f4a, 0x534e, 0x436c, 0x4548, 0x6458, 0x4d44, 0x644f, 0x6454, 0x6455, 0x3a7e, 0x4f66, 0x553f, 0x6452, 0x6450, 0x644e, 0x4d65, 0x4a2a, 0x4023, 0x3d26, 0x6453, 0x3848, 0x6467, 0x5434, 0x645b, 0x416f, 0x6469, 0x5267, 0x645f, 0x6460, 0x4f2a, 0x4b5d, 0x645a, 0x6451, 0x6465, 0x485c, 0x6463, 0x4467, 0x6462, 0x6461, 0x337c, 0x6468, 0x3561, 0x574c, 0x6466, 0x3b2c, 0x5752, 0x4c4f, 0x6b78, 0x6464, 0x3976, 0x564d, 0x6459, 0x645c, 0x427a, 0x645e, 0x424b, 0x4044, 0x4250, 0x3175, 0x4c32, 0x354e, 0x646f, 0x462f, 0x4661, 0x6475, 0x4229, 0x406c, 0x515d, 0x646e, 0x442e, 0x646d, 0x6476, 0x6474, 0x427e, 0x645d, 0x6470, 0x4a7e, 0x5544, 0x6471, 0x517a, 0x646b, 0x646c, 0x6472, 0x4e2b, 0x454b, 0x4731, 0x423a, 0x646a, 0x414a, 0x4c36, 0x3331, 0x647b, 0x6473, 0x647a, 0x647d, 0x647c, 0x334e, 0x333a, 0x6477, 0x6479, 0x6478, 0x456c, 0x403d, 0x5468, 0x6522, 0x3044, 0x6524, 0x6523, 0x3c24, 0x6525, 0x6521, 0x647e, 0x3174, 0x6528, 0x6529, 0x6526, 0x6527, 0x652a, 0x4659, 0x652b, 0x652d, 0x652c, 0x652f, 0x652e, 0x3960, 0x6530, 0x6531, 0x3b70, 0x6c61, 0x4370, 0x3546, 0x3b52, 0x4169, 0x546e, 0x3e44, 0x5746, 0x5456, 0x3253, 0x6c3e, 0x6a41, 0x422f, 0x3436, 0x5157, 0x3334, 0x4832, 0x3f3b, 0x6c40, 0x564b, 0x6c3f, 0x6c41, 0x6c45, 0x3e66, 0x4c3f, 0x455a, 0x3e3c, 0x6c46, 0x317e, 0x6c44, 0x5528, 0x3563, 0x6c42, 0x4136, 0x3363, 0x6c43, 0x4b38, 0x4043, 0x4c7e, 0x4152, 0x6c48, 0x3a66, 0x4053, 0x5672, 0x514c, 0x3f3e, 0x3733, 0x4955, 0x6c47, 0x3b62, 0x4c4c, 0x3d7d, 0x4848, 0x4f29, 0x4d69, 0x456b, 0x3769, 0x5149, 0x3a38, 0x6c49, 0x6c4a, 0x3b40, 0x6c4b, 0x6c62, 0x313a, 0x3759, 0x3d39, 0x6c4c, 0x5166, 0x6c4d, 0x483b, 0x6c51, 0x6c53, 0x3b4d, 0x3c65, 0x6c4f, 0x4937, 0x433a, 0x6c63, 0x5555, 0x6c50, 0x5673, 0x6c52, 0x6c4e, 0x6c54, 0x6c55, 0x493f, 0x4f28, 0x505c, 0x512c, 0x485b, 0x6c56, 0x4e75, 0x4a6c, 0x6c5a, 0x6c59, 0x303e, 0x6c57, 0x6c58, 0x6c64, 0x483c, 0x4147, 0x6c5c, 0x5160, 0x6c5b, 0x546f, 0x6c5d, 0x5b46, 0x6c5e, 0x312c, 0x6c5f, 0x6c60, 0x5726, 0x4540, 0x6b3c, 0x302e, 0x3e74, 0x3838, 0x522f, 0x3056, 0x3579, 0x5833, 0x4b2c, 0x635d, 0x462c, 0x3066, 0x4546, 0x6b39, 0x6b3a, 0x6b3b, 0x5140, 0x4523, 0x6a72, 0x4432, 0x4435, 0x404e, 0x6a73, 0x4441, 0x4e6f, 0x6a70, 0x6a74, 0x497c, 0x4723, 0x4c58, 0x4e7e, 0x6a75, 0x6a76, 0x4f2c, 0x4067, 0x6a77, 0x363f, 0x6a78, 0x6a79, 0x6a7a, 0x6a7b, 0x6a71, 0x482e, 0x616b, 0x3738, 0x616c, 0x616d, 0x5734, 0x616e, 0x616f, 0x534c, 0x6171, 0x3f71, 0x6170, 0x3552, 0x3137, 0x6173, 0x6172, 0x3a7c, 0x6174, 0x3937, 0x3e51, 0x447c, 0x3a5d, 0x3d46, 0x6175, 0x6177, 0x3640, 0x4f41, 0x4a28, 0x6176, 0x5578, 0x537c, 0x6178, 0x617c, 0x6179, 0x617a, 0x406a, 0x617e, 0x6221, 0x4047, 0x617b, 0x617d, 0x6225, 0x4154, 0x6223, 0x6228, 0x327e, 0x6222, 0x434d, 0x3242, 0x6227, 0x6226, 0x6224, 0x6229, 0x622b, 0x5049, 0x566d, 0x4328, 0x622c, 0x4f57, 0x622e, 0x3a6f, 0x6960, 0x622d, 0x622a, 0x3b2b, 0x5433, 0x6230, 0x622f, 0x6961, 0x6231, 0x6232, 0x6233, 0x4c21, 0x6234, 0x6235, 0x507e, 0x424a, 0x5371, 0x4d75, 0x6760, 0x6761, 0x3e41, 0x426a, 0x6764, 0x6763, 0x4d66, 0x4335, 0x6762, 0x3b37, 0x4f56, 0x4161, 0x6769, 0x6768, 0x6774, 0x3223, 0x676a, 0x6766, 0x676c, 0x676b, 0x493a, 0x5564, 0x6765, 0x3729, 0x6767, 0x676e, 0x6773, 0x5669, 0x676d, 0x6772, 0x6771, 0x3060, 0x6775, 0x4772, 0x4045, 0x406d, 0x4170, 0x6770, 0x6776, 0x4b76, 0x6822, 0x6821, 0x5741, 0x677a, 0x6779, 0x677b, 0x6777, 0x677e, 0x677d, 0x677c, 0x4155, 0x4759, 0x457d, 0x4543, 0x476d, 0x6823, 0x6826, 0x6825, 0x6827, 0x3a77, 0x6778, 0x6824, 0x4870, 0x492a, 0x6829, 0x3965, 0x517e, 0x6828, 0x682a, 0x682d, 0x682e, 0x4127, 0x682f, 0x6830, 0x682c, 0x6834, 0x682b, 0x6831, 0x6835, 0x6832, 0x6833, 0x6837, 0x6836, 0x394f, 0x702c, 0x702d, 0x4630, 0x306a, 0x483f, 0x4d5f, 0x4e4d, 0x6a31, 0x6a32, 0x463f, 0x3449, 0x6a33, 0x5567, 0x5d79, 0x6a34, 0x6a35, 0x6a36, 0x384a, 0x5f30, 0x4975, 0x4c70, 0x497a, 0x497b, 0x5343, 0x4b26, 0x3826, 0x702e, 0x3142, 0x6538, 0x4c6f, 0x5349, 0x3c57, 0x496a, 0x3567, 0x4450, 0x3569, 0x6e2e, 0x3b2d, 0x675e, 0x6e2f, 0x3329, 0x6e32, 0x6e31, 0x3d67, 0x6e30, 0x4e37, 0x454f, 0x4174, 0x5b4e, 0x6e33, 0x5073, 0x4254, 0x4668, 0x372c, 0x6e34, 0x336b, 0x3b7b, 0x6e35, 0x675c, 0x6e36, 0x3d2e, 0x7162, 0x4a68, 0x5249, 0x705a, 0x705b, 0x705c, 0x4146, 0x386d, 0x3e4e, 0x705e, 0x4531, 0x705d, 0x5171, 0x7060, 0x304c, 0x3d6a, 0x525f, 0x705f, 0x342f, 0x3768, 0x7066, 0x7065, 0x4623, 0x7061, 0x7062, 0x3443, 0x7063, 0x556e, 0x4c5b, 0x3e52, 0x3c32, 0x7068, 0x7067, 0x7064, 0x3221, 0x5622, 0x5338, 0x3e37, 0x482c, 0x706a, 0x5177, 0x564c, 0x3a5b, 0x7069, 0x363b, 0x4d34, 0x4626, 0x4121, 0x706b, 0x706e, 0x706d, 0x7070, 0x706c, 0x3b3e, 0x706f, 0x4c35, 0x7072, 0x3355, 0x3154, 0x7073, 0x7074, 0x7076, 0x3461, 0x7071, 0x7077, 0x707a, 0x7078, 0x7075, 0x707d, 0x7079, 0x707c, 0x707e, 0x7121, 0x4e41, 0x7124, 0x7123, 0x4176, 0x707b, 0x4a5d, 0x3471, 0x3171, 0x4c31, 0x7126, 0x7127, 0x712c, 0x554e, 0x7129, 0x4833, 0x7122, 0x712b, 0x7128, 0x7125, 0x712a, 0x3029, 0x712d, 0x712f, 0x7131, 0x7130, 0x712e, 0x5122, 0x7132, 0x7133, 0x396f, 0x3547, 0x3057, 0x3059, 0x546d, 0x3544, 0x3d54, 0x3b4a, 0x7027, 0x385e, 0x7028, 0x3028, 0x7029, 0x4d6e, 0x702a, 0x702b, 0x4624, 0x5665, 0x7164, 0x7165, 0x4373, 0x535b, 0x5651, 0x4568, 0x532f, 0x5266, 0x6e41, 0x303b, 0x5535, 0x514e, 0x3c60, 0x3a50, 0x3f78, 0x3847, 0x3541, 0x454c, 0x4a22, 0x434b, 0x6e42, 0x443f, 0x3622, 0x6d6c, 0x4324, 0x5631, 0x4f60, 0x6d6f, 0x454e, 0x365c, 0x4a21, 0x6d6d, 0x6d70, 0x6d71, 0x433c, 0x3f34, 0x6d6e, 0x6d74, 0x6d72, 0x5566, 0x435f, 0x6d73, 0x6d76, 0x5523, 0x5123, 0x6d75, 0x4350, 0x6d77, 0x3f74, 0x3e6c, 0x6d78, 0x4c77, 0x515b, 0x5745, 0x5576, 0x6d7c, 0x6d7b, 0x6d79, 0x6d7a, 0x6d7d, 0x3e26, 0x4b2f, 0x6e21, 0x363d, 0x6e22, 0x4440, 0x6d7e, 0x3d5e, 0x3247, 0x3643, 0x6e25, 0x583a, 0x6e23, 0x6e26, 0x4369, 0x3372, 0x6e27, 0x6e24, 0x4f39, 0x6e28, 0x4277, 0x6e29, 0x6e2a, 0x5e2b, 0x4633, 0x4746, 0x5675, 0x3549, 0x4b32, 0x6e2b, 0x4d2b, 0x6e2c, 0x5530, 0x6e2d, 0x7644, 0x5b47, 0x3423, 0x432c, 0x7166, 0x4a38, 0x5253, 0x562a, 0x6f72, 0x3e58, 0x3d43, 0x6f73, 0x364c, 0x302b, 0x4a2f, 0x6d36, 0x6d37, 0x4e79, 0x372f, 0x3f73, 0x6d38, 0x426b, 0x4930, 0x6d39, 0x4676, 0x3f33, 0x6d3c, 0x4578, 0x5150, 0x5729, 0x6d3a, 0x6d3b, 0x5162, 0x6d3f, 0x6d40, 0x6d44, 0x6d48, 0x6d46, 0x6d4e, 0x5568, 0x6d49, 0x6d47, 0x6d3e, 0x4569, 0x4646, 0x4969, 0x5452, 0x6d41, 0x6d42, 0x6d43, 0x6d45, 0x4079, 0x3421, 0x3968, 0x6d50, 0x6d51, 0x6d4a, 0x6d4f, 0x4e78, 0x4b36, 0x6d4c, 0x6d4d, 0x4f75, 0x6d52, 0x4172, 0x5332, 0x6d4b, 0x4837, 0x3c6f, 0x4570, 0x6d56, 0x356f, 0x4235, 0x302d, 0x4b69, 0x312e, 0x6d54, 0x4d6b, 0x3562, 0x6d55, 0x6d53, 0x6d57, 0x357a, 0x6d58, 0x6d59, 0x6d5c, 0x314c, 0x4576, 0x3c6e, 0x6d5a, 0x4c3c, 0x326a, 0x6d5b, 0x446b, 0x3445, 0x3075, 0x6d5f, 0x405a, 0x3468, 0x454d, 0x6d5d, 0x3f44, 0x6d5e, 0x4425, 0x6d60, 0x6d61, 0x6d63, 0x4157, 0x3b47, 0x3d38, 0x6d62, 0x6d64, 0x6d66, 0x6d65, 0x6d67, 0x4a3e, 0x6c6a, 0x4071, 0x4967, 0x6c6b, 0x466e, 0x6c6c, 0x466d, 0x6c6d, 0x6c70, 0x5766, 0x6c73, 0x6c71, 0x6c6e, 0x6c6f, 0x5723, 0x4971, 0x4b6e, 0x6c74, 0x6c72, 0x4f69, 0x6c76, 0x4631, 0x3c40, 0x6c75, 0x353b, 0x3b76, 0x6c77, 0x5977, 0x3d7b, 0x423b, 0x6c78, 0x6c79, 0x3823, 0x6c7a, 0x6c7b, 0x6c7c, 0x536d, 0x582e, 0x406b, 0x475d, 0x3a4c, 0x5063, 0x4b3d, 0x4d3a, 0x3851, 0x317c, 0x476f, 0x5656, 0x3f46, 0x436b, 0x6f75, 0x4358, 0x5762, 0x6f77, 0x3353, 0x4758, 0x516d, 0x5648, 0x6f78, 0x6f76, 0x3b7d, 0x3346, 0x3d55, 0x5246, 0x3b60, 0x4f21, 0x6f7c, 0x6f7b, 0x6f79, 0x334c, 0x4954, 0x4b30, 0x6f7e, 0x305e, 0x5649, 0x6f7d, 0x336d, 0x7655, 0x4e48, 0x7022, 0x7021, 0x353e, 0x3c5a, 0x3b7c, 0x3865, 0x4442, 0x7023, 0x4b6b, 0x7026, 0x5128, 0x3e3f, 0x476e, 0x7136, 0x7137, 0x3f55, 0x3429, 0x7138, 0x4d3b, 0x4754, 0x552d, 0x7139, 0x713a, 0x474f, 0x5224, 0x564f, 0x713b, 0x3d51, 0x3430, 0x3e3d, 0x345c, 0x4e51, 0x3f5f, 0x713d, 0x3f7a, 0x713c, 0x713f, 0x713e, 0x7140, 0x7141, 0x417e, 0x4122, 0x4a7a, 0x553e, 0x3e3a, 0x3e39, 0x5542, 0x3f22, 0x4d2f, 0x7135, 0x3d5f, 0x364b, 0x5671, 0x7343, 0x7344, 0x384d, 0x7346, 0x7347, 0x304a, 0x7345, 0x7349, 0x4b71, 0x734b, 0x5026, 0x314a, 0x7348, 0x734f, 0x3551, 0x7357, 0x7352, 0x7354, 0x7353, 0x377b, 0x313f, 0x734e, 0x734a, 0x355a, 0x7350, 0x7351, 0x7355, 0x734d, 0x3c63, 0x417d, 0x7356, 0x735a, 0x734c, 0x3548, 0x3d6e, 0x735c, 0x3724, 0x3f70, 0x567e, 0x4d32, 0x3470, 0x325f, 0x7358, 0x7359, 0x4938, 0x735d, 0x735e, 0x7361, 0x735f, 0x7363, 0x7362, 0x735b, 0x3f6a, 0x336f, 0x7360, 0x4729, 0x3c72, 0x736b, 0x393f, 0x7364, 0x322d, 0x3b7e, 0x4b63, 0x736d, 0x7369, 0x395c, 0x736e, 0x7365, 0x7366, 0x736a, 0x4261, 0x736c, 0x736f, 0x7368, 0x3c7d, 0x4f64, 0x7370, 0x7367, 0x7372, 0x572d, 0x462a, 0x7373, 0x7371, 0x4228, 0x385d, 0x7375, 0x7374, 0x345b, 0x7376, 0x7377, 0x7378, 0x403a, 0x4069, 0x4571, 0x737b, 0x737a, 0x3458, 0x737e, 0x7379, 0x737c, 0x737d, 0x7421, 0x7423, 0x3b49, 0x7422, 0x7424, 0x323e, 0x7426, 0x7425, 0x3c2e, 0x4357, 0x5961, 0x4060, 0x744c, 0x5751, 0x375b, 0x744e, 0x4123, 0x4649, 0x3456, 0x5533, 0x7450, 0x744f, 0x7451, 0x4b5a, 0x7452, 0x5441, 0x5660, 0x3760, 0x4138, 0x413b, 0x7453, 0x3e2c, 0x3462, 0x7454, 0x7455, 0x3e2b, 0x7456, 0x745b, 0x7457, 0x745a, 0x3a7d, 0x7458, 0x7459, 0x3862, 0x4c47, 0x745c, 0x325a, 0x4353, 0x5463, 0x3f37, 0x745d, 0x4534, 0x7469, 0x4f35, 0x4e49, 0x4b58, 0x4b77, 0x3d74, 0x574f, 0x405b, 0x5075, 0x746a, 0x746b, 0x746c, 0x7763, 0x3731, 0x746d, 0x576b, 0x746e, 0x6679, 0x3e40, 0x667a, 0x3a6c, 0x667b, 0x4f4b, 0x667c, 0x543c, 0x3c36, 0x667d, 0x667e, 0x3c4d, 0x4852, 0x4e33, 0x6721, 0x343f, 0x6722, 0x4934, 0x3859, 0x4449, 0x575d, 0x425a, 0x3757, 0x563d, 0x4e46, 0x3744, 0x4526, 0x6723, 0x4f5f, 0x6724, 0x6725, 0x6726, 0x4137, 0x5769, 0x4970, 0x4f38, 0x562f, 0x5655, 0x6727, 0x306d, 0x6728, 0x6729, 0x495c, 0x526f, 0x3e2d, 0x672a, 0x3073, 0x485e, 0x3d61, 0x672b, 0x4846, 0x672c, 0x3b66, 0x3878, 0x5124, 0x672d, 0x4267, 0x3e78, 0x3d4a, 0x4d33, 0x672e, 0x672f, 0x3e6e, 0x5065, 0x4b67, 0x4c50, 0x3c4c, 0x6730, 0x3c28, 0x5077, 0x6731, 0x5078, 0x6732, 0x6733, 0x3442, 0x6734, 0x6735, 0x497e, 0x4e2c, 0x4360, 0x6737, 0x3141, 0x3371, 0x6738, 0x6739, 0x575b, 0x5540, 0x673a, 0x424c, 0x573a, 0x673b, 0x673c, 0x673d, 0x3c6a, 0x4365, 0x4042, 0x673e, 0x673f, 0x3c29, 0x6740, 0x6741, 0x6736, 0x3650, 0x6742, 0x6743, 0x6744, 0x3b3a, 0x355e, 0x4246, 0x3160, 0x6745, 0x5435, 0x6746, 0x383f, 0x6748, 0x6747, 0x376c, 0x6749, 0x3278, 0x674a, 0x674b, 0x674c, 0x674d, 0x674e, 0x674f, 0x6750, 0x5327, 0x4b75, 0x6751, 0x6752, 0x6753, 0x6754, 0x4949, 0x6755, 0x6756, 0x6757, 0x6758, 0x6759, 0x3d49, 0x675a, 0x733e, 0x3857, 0x4831, 0x733f, 0x7340, 0x7341, 0x395e, 0x4d78, 0x5868, 0x3a31, 0x425e, 0x6e37, 0x3723, 0x6e39, 0x6e38, 0x3055, 0x6e3b, 0x5556, 0x576f, 0x5643, 0x6e3d, 0x4a70, 0x6e3c, 0x6e3e, 0x6e40, 0x6e3f, 0x5172, 0x473c, 0x4340, 0x3861, 0x4167, 0x7446, 0x505f, 0x7447, 0x4f5b, 0x483a, 0x7448, 0x7449, 0x744a, 0x744b, 0x597a, 0x387e, 0x6571, 0x5370, 0x7460, 0x4e4c, 0x3361, 0x7134, 0x526e, 0x7461, 0x4f68, 0x7462, 0x474c, 0x3554, 0x3464, 0x7464, 0x7463, 0x7465, 0x7466, 0x7467, 0x3a32, 0x303f, 0x7468, 0x372d, 0x526d, 0x522b, 0x404f, 0x3f3c, 0x6b23, 0x555f, 0x6a48, 0x7173, 0x3678, 0x4b23, 0x444d, 0x7167, 0x7168, 0x387b, 0x7169, 0x3a44, 0x5445, 0x3052, 0x716a, 0x716b, 0x716c, 0x716d, 0x716e, 0x716f, 0x7171, 0x7170, 0x4555, 0x7172, 0x367a, 0x7174, 0x522e, 0x5e47, 0x4b4a, 0x335c, 0x3522, 0x3922, 0x4474, 0x7175, 0x7176, 0x4144, 0x417b, 0x5630, 0x7177, 0x7178, 0x412a, 0x4638, 0x3e5b, 0x7179, 0x344f, 0x717a, 0x6d32, 0x6d31, 0x4b60, 0x525e, 0x4b41, 0x5558, 0x4862, 0x405f, 0x3c21, 0x6b41, 0x5024, 0x5662, 0x3647, 0x3858, 0x6b40, 0x384e, 0x6b3f, 0x3326, 0x3949, 0x562b, 0x3774, 0x374a, 0x3c67, 0x373e, 0x6b46, 0x6b47, 0x3039, 0x3f4f, 0x6b45, 0x537d, 0x6b48, 0x6b49, 0x374e, 0x6b42, 0x6b44, 0x4976, 0x5657, 0x554d, 0x5032, 0x6b4f, 0x4e38, 0x6b50, 0x3528, 0x3133, 0x6b52, 0x4c25, 0x4556, 0x6b53, 0x6b51, 0x455f, 0x6b4e, 0x4a24, 0x6b55, 0x307b, 0x3a7a, 0x5837, 0x7163, 0x6b4a, 0x6b4b, 0x6b4c, 0x6b4d, 0x6b56, 0x6640, 0x6b59, 0x3f68, 0x5248, 0x6b57, 0x6b5c, 0x386c, 0x6b58, 0x3d3a, 0x5058, 0x3037, 0x6b5d, 0x445c, 0x562c, 0x3460, 0x4276, 0x3c39, 0x6b5a, 0x6b5b, 0x5460, 0x466a, 0x4454, 0x6b5f, 0x4527, 0x5975, 0x3231, 0x6b64, 0x3d45, 0x6b62, 0x6b63, 0x382c, 0x4d51, 0x6b65, 0x6b61, 0x4133, 0x4622, 0x4c73, 0x6b66, 0x4030, 0x5238, 0x6b67, 0x382f, 0x382d, 0x6b68, 0x473b, 0x4d73, 0x6b6a, 0x6b6b, 0x6b6d, 0x5048, 0x6b72, 0x6b6e, 0x6b71, 0x4879, 0x517c, 0x6b6c, 0x6b69, 0x3839, 0x4f59, 0x4465, 0x6b6f, 0x6b70, 0x4c5a, 0x4d48, 0x3072, 0x6b76, 0x6b75, 0x3232, 0x3860, 0x6b77, 0x316c, 0x4c45, 0x4424, 0x4f25, 0x6b79, 0x6c22, 0x4572, 0x6b7a, 0x4945, 0x625f, 0x6b7e, 0x4d4e, 0x6c21, 0x315b, 0x5337, 0x525c, 0x6b7d, 0x6b7b, 0x333c, 0x6a30, 0x5754, 0x742b, 0x3374, 0x5641, 0x5642, 0x5569, 0x3e4a, 0x7427, 0x5228, 0x7428, 0x7429, 0x742a, 0x3e4b, 0x535f, 0x4960, 0x4961, 0x7342, 0x4a66, 0x4c72, 0x6236, 0x4b34, 0x4e68, 0x565b, 0x742d, 0x742e, 0x742f, 0x7432, 0x3a3d, 0x7433, 0x3063, 0x7430, 0x7431, 0x3d22, 0x3255, 0x7436, 0x7437, 0x3666, 0x3230, 0x4f4f, 0x7434, 0x342c, 0x7435, 0x7438, 0x7439, 0x4d27, 0x743a, 0x743b, 0x743c, 0x4b52, 0x743d, 0x743e, 0x743f, 0x745e, 0x413c, 0x3c68, 0x492b, 0x515e, 0x6575, 0x5c33, 0x5255, 0x5c34, 0x302c, 0x5c35, 0x3d5a, 0x5c39, 0x5842, 0x5c37, 0x5373, 0x4956, 0x5c3a, 0x5c36, 0x5c3b, 0x4322, 0x5c3c, 0x5c45, 0x5c3d, 0x4e5f, 0x5625, 0x5c4f, 0x5c4d, 0x5c52, 0x3d66, 0x422b, 0x5c38, 0x5c4b, 0x5c4e, 0x5c3e, 0x3752, 0x3045, 0x5c47, 0x503e, 0x5c41, 0x3b28, 0x373c, 0x5c4c, 0x5c46, 0x5c3f, 0x475b, 0x513f, 0x5c40, 0x5c4a, 0x5c50, 0x4e2d, 0x5c42, 0x5c43, 0x5c48, 0x5c49, 0x3254, 0x5c51, 0x4b55, 0x5437, 0x5c5b, 0x5c5f, 0x4c26, 0x5c66, 0x4367, 0x5c5c, 0x3f41, 0x5c59, 0x307a, 0x3936, 0x5c65, 0x5c53, 0x5c44, 0x5c56, 0x4874, 0x3f60, 0x493b, 0x313d, 0x5322, 0x5c5a, 0x5c55, 0x463b, 0x5c5e, 0x5742, 0x432f, 0x3736, 0x4751, 0x4329, 0x5c62, 0x5c58, 0x5c6b, 0x5c54, 0x5c5d, 0x3e25, 0x5c57, 0x5c60, 0x5c63, 0x5c64, 0x5c78, 0x5c61, 0x5d22, 0x5c67, 0x3c6b, 0x3444, 0x4323, 0x3267, 0x5c7a, 0x5c72, 0x5c6f, 0x5c7c, 0x5c6e, 0x5270, 0x3268, 0x4857, 0x4863, 0x5c7b, 0x5c6d, 0x5c77, 0x5c75, 0x3e23, 0x5c74, 0x325d, 0x5c73, 0x3c76, 0x5c68, 0x3b44, 0x4073, 0x3c54, 0x5c69, 0x5c6a, 0x5c71, 0x5c76, 0x5c79, 0x3534, 0x4859, 0x3b67, 0x5c7e, 0x5c7d, 0x532b, 0x5d21, 0x5d23, 0x5d25, 0x5271, 0x5d24, 0x5d26, 0x5d27, 0x5229, 0x3a49, 0x5d29, 0x5d36, 0x5d31, 0x5d34, 0x5d30, 0x464e, 0x4072, 0x492f, 0x5c6c, 0x5d2e, 0x5d37, 0x5c70, 0x5d2f, 0x5d38, 0x5d2c, 0x5d39, 0x5d33, 0x5d2d, 0x442a, 0x5d28, 0x4033, 0x412b, 0x5d2a, 0x5d2b, 0x5d32, 0x3b71, 0x5d35, 0x5328, 0x5d3a, 0x5d3b, 0x4327, 0x5d52, 0x5d3c, 0x5d51, 0x393d, 0x3e55, 0x3e7a, 0x3a4a, 0x5d4a, 0x5d45, 0x5d3f, 0x324b, 0x5d43, 0x5d4b, 0x3224, 0x5d55, 0x5d3e, 0x4650, 0x5d50, 0x5d54, 0x4162, 0x3746, 0x5d4e, 0x5d4f, 0x5d44, 0x5d3d, 0x5d4d, 0x4c51, 0x5d49, 0x5d42, 0x4348, 0x463c, 0x4e2e, 0x5d4c, 0x5d48, 0x5d41, 0x5d46, 0x425c, 0x5329, 0x532a, 0x5d53, 0x4f74, 0x4878, 0x5d66, 0x5d47, 0x5d60, 0x4264, 0x5d61, 0x5d57, 0x5678, 0x5d59, 0x5d58, 0x3870, 0x5d56, 0x464f, 0x362d, 0x5d62, 0x3a79, 0x5461, 0x5d67, 0x3450, 0x5d5a, 0x3f7b, 0x5d63, 0x5d5f, 0x5d5d, 0x3559, 0x5d5b, 0x5d5c, 0x5d5e, 0x3d2f, 0x5d64, 0x5d65, 0x5d75, 0x4349, 0x4b62, 0x5d72, 0x5861, 0x4651, 0x5d74, 0x5574, 0x5d73, 0x5d70, 0x5d6c, 0x5d6f, 0x5d68, 0x506e, 0x4858, 0x5d6e, 0x5d69, 0x5d6a, 0x4b72, 0x5d6d, 0x314d, 0x4036, 0x3c3b, 0x5d71, 0x5d77, 0x5d76, 0x5d6b, 0x456e, 0x5d7b, 0x5e24, 0x5e23, 0x5d78, 0x436f, 0x427b, 0x5561, 0x4e35, 0x5d7d, 0x324c, 0x4468, 0x4a5f, 0x473e, 0x5d7a, 0x5d7c, 0x5d7e, 0x5e22, 0x302a, 0x314e, 0x5e2c, 0x5e26, 0x3d36, 0x486f, 0x5e21, 0x5e25, 0x5e29, 0x5e28, 0x5e27, 0x5e2d, 0x544c, 0x5e33, 0x5e2a, 0x5e2e, 0x4059, 0x3121, 0x5e36, 0x5e31, 0x5e32, 0x5126, 0x5e35, 0x5e2f, 0x5e30, 0x503d, 0x5e34, 0x4a6d, 0x5e39, 0x5e38, 0x5e37, 0x5e3b, 0x3d65, 0x3258, 0x436a, 0x5e3a, 0x453a, 0x5e3c, 0x4c59, 0x372a, 0x5465, 0x5e3d, 0x5e3f, 0x4422, 0x5e41, 0x5e3e, 0x5e40, 0x553a, 0x5e42, 0x722e, 0x3b22, 0x4232, 0x4530, 0x4247, 0x722f, 0x5069, 0x535d, 0x6b3d, 0x3366, 0x7230, 0x7231, 0x4a2d, 0x3a67, 0x7233, 0x7235, 0x7234, 0x4b64, 0x4f3a, 0x7232, 0x4a34, 0x524f, 0x426c, 0x4e43, 0x7238, 0x3076, 0x7237, 0x723e, 0x324f, 0x5141, 0x723a, 0x723c, 0x5469, 0x723b, 0x7236, 0x723f, 0x723d, 0x7239, 0x7247, 0x7244, 0x7246, 0x724a, 0x7242, 0x7240, 0x7245, 0x567b, 0x7241, 0x4779, 0x495f, 0x7248, 0x3946, 0x3530, 0x7243, 0x7249, 0x7250, 0x7256, 0x3b57, 0x7255, 0x4d5c, 0x566b, 0x7252, 0x7254, 0x3872, 0x724b, 0x724e, 0x4279, 0x555d, 0x724c, 0x724d, 0x724f, 0x7253, 0x7259, 0x533c, 0x366a, 0x4a71, 0x3764, 0x7257, 0x7258, 0x725a, 0x725d, 0x725b, 0x725c, 0x5151, 0x7251, 0x4d49, 0x4e4f, 0x5629, 0x7263, 0x435b, 0x7260, 0x402f, 0x726c, 0x725e, 0x7261, 0x7268, 0x7262, 0x7267, 0x7266, 0x7269, 0x725f, 0x7264, 0x726a, 0x532c, 0x7265, 0x3275, 0x7272, 0x502b, 0x7275, 0x3b48, 0x7279, 0x7270, 0x7276, 0x7278, 0x727a, 0x7273, 0x7271, 0x3a7b, 0x357b, 0x726f, 0x7277, 0x726d, 0x726e, 0x726b, 0x7326, 0x7323, 0x7322, 0x7274, 0x485a, 0x727b, 0x7325, 0x4378, 0x727d, 0x7327, 0x7329, 0x7324, 0x727c, 0x732b, 0x732a, 0x425d, 0x732e, 0x7330, 0x7321, 0x7331, 0x732c, 0x732f, 0x727e, 0x732d, 0x7332, 0x7334, 0x7328, 0x7333, 0x7335, 0x5037, 0x7338, 0x5979, 0x7339, 0x7337, 0x4864, 0x7336, 0x733a, 0x733b, 0x3440, 0x6e43, 0x733c, 0x733d, 0x512a, 0x742c, 0x5046, 0x5050, 0x515c, 0x4f4e, 0x3d56, 0x5143, 0x3a62, 0x6169, 0x5242, 0x7142, 0x3239, 0x316d, 0x7143, 0x4940, 0x3344, 0x5972, 0x4b25, 0x7144, 0x5654, 0x7145, 0x7440, 0x7146, 0x542c, 0x7147, 0x3040, 0x7441, 0x7442, 0x347c, 0x455b, 0x4c3b, 0x5064, 0x4d60, 0x7148, 0x5973, 0x313b, 0x4f2e, 0x3824, 0x714a, 0x714b, 0x3243, 0x4151, 0x5730, 0x7149, 0x714c, 0x714e, 0x5976, 0x5261, 0x5423, 0x7443, 0x4839, 0x7444, 0x714d, 0x714f, 0x3f63, 0x7150, 0x7154, 0x7156, 0x7151, 0x4951, 0x4561, 0x4263, 0x397c, 0x7153, 0x7155, 0x3953, 0x715b, 0x3a56, 0x307d, 0x7159, 0x7158, 0x7152, 0x715a, 0x7157, 0x486c, 0x4d4a, 0x715d, 0x653d, 0x715c, 0x715e, 0x715f, 0x4f65, 0x7445, 0x3d73, 0x7160, 0x7161, 0x4e77, 0x522a, 0x717b, 0x3832, 0x3c7b, 0x395b, 0x3966, 0x4359, 0x4a53, 0x6a68, 0x4040, 0x3e75, 0x6a69, 0x6a6a, 0x6a6b, 0x6a6c, 0x6a6d, 0x6a6e, 0x6a6f, 0x3d47, 0x757b, 0x757d, 0x757e, 0x757c, 0x3d62, 0x7621, 0x3425, 0x7622, 0x7623, 0x6c32, 0x5154, 0x596a, 0x7624, 0x6e3a, 0x5532, 0x537e, 0x4c5c, 0x4a44, 0x6540, 0x7625, 0x3e2f, 0x4629, 0x5a25, 0x3c46, 0x3629, 0x383c, 0x484f, 0x3c25, 0x5a26, 0x5a27, 0x4c56, 0x4843, 0x5a28, 0x467d, 0x5135, 0x5269, 0x5136, 0x3c47, 0x3d32, 0x3b64, 0x5a29, 0x5a2a, 0x5148, 0x5a2b, 0x506d, 0x366f, 0x425b, 0x4b4f, 0x376d, 0x4968, 0x3743, 0x3e77, 0x5624, 0x5a2c, 0x5a2d, 0x4640, 0x5767, 0x4a36, 0x5529, 0x4b5f, 0x556f, 0x5a2e, 0x565f, 0x344a, 0x5a30, 0x5a2f, 0x526b, 0x5a31, 0x5a32, 0x5a33, 0x4a54, 0x5a34, 0x4a2b, 0x5a35, 0x5a36, 0x334f, 0x566f, 0x5a37, 0x3b30, 0x352e, 0x5a38, 0x5a39, 0x396e, 0x512f, 0x5268, 0x5a3a, 0x3843, 0x4f6a, 0x326f, 0x5a3b, 0x5a3c, 0x3d6b, 0x4e5c, 0x536f, 0x5a3d, 0x4e73, 0x5a3e, 0x5355, 0x3b65, 0x5a3f, 0x4b35, 0x4b50, 0x5a40, 0x476b, 0x566e, 0x5a41, 0x4535, 0x3641, 0x5a42, 0x374c, 0x3f4e, 0x5a43, 0x5a44, 0x4b2d, 0x5a45, 0x3577, 0x5a46, 0x4142, 0x573b, 0x5a47, 0x4c38, 0x526a, 0x4431, 0x5a48, 0x357d, 0x3b51, 0x5a49, 0x5033, 0x5a4a, 0x5a4b, 0x4e3d, 0x5a4c, 0x5a4d, 0x5a4e, 0x3277, 0x5a51, 0x5a4f, 0x5168, 0x5a50, 0x4355, 0x5a52, 0x5a53, 0x5a54, 0x5a55, 0x503b, 0x5225, 0x3079, 0x5a56, 0x472b, 0x5a57, 0x3d77, 0x4321, 0x5a58, 0x5a59, 0x437d, 0x4c37, 0x5a5a, 0x5a5b, 0x403e, 0x4657, 0x5a5c, 0x5a5d, 0x4734, 0x5a5e, 0x5a5f, 0x3948, 0x3b6d, 0x3639, 0x7478, 0x7479, 0x4d63, 0x7539, 0x6b60, 0x4f73, 0x3b3f, 0x3a40, 0x5425, 0x6159, 0x7574, 0x312a, 0x3272, 0x7575, 0x7577, 0x3a51, 0x7576, 0x4332, 0x7579, 0x7578, 0x3134, 0x556a, 0x383a, 0x3931, 0x3246, 0x5470, 0x4f4d, 0x305c, 0x554b, 0x3b75, 0x564a, 0x3737, 0x4c30, 0x4636, 0x3161, 0x393a, 0x567c, 0x3961, 0x3721, 0x3c7a, 0x6a5a, 0x6a5b, 0x4c79, 0x3973, 0x6a5c, 0x347b, 0x4333, 0x3751, 0x3a58, 0x6a5d, 0x5474, 0x6a5e, 0x3c56, 0x3b5f, 0x6a5f, 0x415e, 0x4238, 0x545f, 0x574a, 0x6a60, 0x6a61, 0x6a64, 0x6a62, 0x6a63, 0x495e, 0x3833, 0x3644, 0x6a65, 0x4a6a, 0x494d, 0x344d, 0x6259, 0x4562, 0x6a66, 0x4035, 0x5738, 0x6a67, 0x572c, 0x487c, 0x5853, 0x584d, 0x545e, 0x5479, 0x4944, 0x532e, 0x3853, 0x3360, 0x4962, 0x7476, 0x3a55, 0x7477, 0x575f, 0x7471, 0x3830, 0x5554, 0x384f, 0x4670, 0x3343, 0x7472, 0x332c, 0x543d, 0x4777, 0x7474, 0x7473, 0x4c4b, 0x4824, 0x7475, 0x5763, 0x453f, 0x7540, 0x753b, 0x7543, 0x7542, 0x563a, 0x7541, 0x543e, 0x7544, 0x754c, 0x304f, 0x3578, 0x7549, 0x754a, 0x455c, 0x7545, 0x7546, 0x7547, 0x754b, 0x3e60, 0x7548, 0x387a, 0x7550, 0x7553, 0x3f67, 0x3972, 0x753c, 0x754d, 0x4237, 0x4c78, 0x3c79, 0x754e, 0x754f, 0x7551, 0x3665, 0x7552, 0x7555, 0x753d, 0x7554, 0x533b, 0x336c, 0x4c24, 0x7556, 0x7557, 0x3e61, 0x7558, 0x4c5f, 0x755b, 0x3248, 0x5759, 0x7559, 0x755a, 0x755c, 0x7562, 0x7560, 0x755f, 0x755d, 0x7561, 0x755e, 0x7564, 0x7565, 0x4c63, 0x653f, 0x3538, 0x7563, 0x7568, 0x4c23, 0x7566, 0x7567, 0x753e, 0x3144, 0x753f, 0x3545, 0x3264, 0x756c, 0x7569, 0x3657, 0x756d, 0x756a, 0x756b, 0x345a, 0x546a, 0x756e, 0x3379, 0x756f, 0x7571, 0x7570, 0x7572, 0x7573, 0x496d, 0x392a, 0x477b, 0x3663, 0x4c49, 0x6a26, 0x3335, 0x547e, 0x396c, 0x5079, 0x696d, 0x572a, 0x696e, 0x4256, 0x486d, 0x3a64, 0x696f, 0x6970, 0x6971, 0x5661, 0x6972, 0x6973, 0x6975, 0x6974, 0x6976, 0x6977, 0x4761, 0x6978, 0x5458, 0x6979, 0x3d4e, 0x697a, 0x697b, 0x3d4f, 0x697c, 0x3828, 0x413e, 0x697d, 0x3132, 0x3b54, 0x3975, 0x697e, 0x6a21, 0x6a22, 0x6a23, 0x3778, 0x3c2d, 0x4a64, 0x604e, 0x542f, 0x4f3d, 0x5537, 0x6a24, 0x555e, 0x6a25, 0x5041, 0x393c, 0x3447, 0x3159, 0x4031, 0x3166, 0x3167, 0x3168, 0x333d, 0x4868, 0x6541, 0x315f, 0x4149, 0x346f, 0x4728, 0x5358, 0x4679, 0x5138, 0x397d, 0x4275, 0x532d, 0x544b, 0x3d7c, 0x6542, 0x3735, 0x6543, 0x3b39, 0x5562, 0x3d78, 0x5436, 0x4e25, 0x412c, 0x3359, 0x4c76, 0x6546, 0x6544, 0x6548, 0x654a, 0x6547, 0x354f, 0x4648, 0x357c, 0x6545, 0x4a76, 0x6549, 0x4354, 0x3145, 0x3c23, 0x5737, 0x4d4b, 0x4b4d, 0x4a4a, 0x4c53, 0x654c, 0x654b, 0x4466, 0x5121, 0x5137, 0x654d, 0x6550, 0x4d38, 0x5670, 0x654f, 0x355d, 0x4d3e, 0x6551, 0x363a, 0x4d28, 0x3964, 0x4a45, 0x3351, 0x4b59, 0x546c, 0x6552, 0x376a, 0x654e, 0x6555, 0x347e, 0x6556, 0x6553, 0x6554, 0x525d, 0x425f, 0x3146, 0x5362, 0x365d, 0x4b6c, 0x6557, 0x5376, 0x3169, 0x3674, 0x655a, 0x6558, 0x6559, 0x3540, 0x5245, 0x655c, 0x655e, 0x655d, 0x4732, 0x5223, 0x655b, 0x5462, 0x555a, 0x6560, 0x5771, 0x6561, 0x315c, 0x517b, 0x6562, 0x6564, 0x6563, 0x6565, 0x5258, 0x354b, 0x675f, 0x5a75, 0x5a78, 0x5a76, 0x5a77, 0x5a7a, 0x504f, 0x4447, 0x306e, 0x5030, 0x5a79, 0x534a, 0x3a2a, 0x5b22, 0x4771, 0x5a7c, 0x5a7b, 0x495b, 0x5a7d, 0x5b21, 0x575e, 0x5a7e, 0x415a, 0x5b25, 0x5374, 0x5b27, 0x5b24, 0x5b28, 0x3d3c, 0x4049, 0x5b23, 0x5b26, 0x5623, 0x5b29, 0x5b2d, 0x5b2e, 0x5b2c, 0x3a42, 0x3f24, 0x5b2b, 0x5b2a, 0x5447, 0x323f, 0x5b2f, 0x3979, 0x5b30, 0x333b, 0x3526, 0x363c, 0x5b31, 0x3675, 0x5b32, 0x3149, 0x5b34, 0x5b33, 0x5b35, 0x5b37, 0x5b36, 0x5b38, 0x5b39, 0x5b3a, 0x534f, 0x747a, 0x4775, 0x5743, 0x4564, 0x747c, 0x747d, 0x747b, 0x3e46, 0x506f, 0x3753, 0x544d, 0x4c2a, 0x7522, 0x7521, 0x3a28, 0x747e, 0x4b56, 0x7524, 0x4052, 0x336a, 0x4d2a, 0x7525, 0x7523, 0x3d34, 0x7528, 0x7529, 0x3d4d, 0x4338, 0x3f61, 0x4b61, 0x752a, 0x7526, 0x7527, 0x4470, 0x752c, 0x343c, 0x576d, 0x3457, 0x752b, 0x752e, 0x752d, 0x752f, 0x5051, 0x4351, 0x4829, 0x7530, 0x7531, 0x7532, 0x7533, 0x7534, 0x7535, 0x7537, 0x7536, 0x7538, 0x3249, 0x5354, 0x4a4d, 0x406f, 0x5658, 0x5230, 0x413f, 0x3d70, 0x382a, 0x3c78, 0x7646, 0x7647, 0x7648, 0x7649, 0x764a, 0x764c, 0x764b, 0x7769, 0x764d, 0x764e, 0x6e44, 0x6e45, 0x6e46, 0x556b, 0x3624, 0x6e48, 0x6e47, 0x6e49, 0x6e4a, 0x4725, 0x6e4b, 0x6e4c, 0x3730, 0x3576, 0x6e4d, 0x6e4f, 0x6e4e, 0x3846, 0x6e50, 0x6e51, 0x6e52, 0x365b, 0x332e, 0x5653, 0x4446, 0x3135, 0x3856, 0x6e53, 0x6e54, 0x543f, 0x4755, 0x3e7b, 0x4e59, 0x3933, 0x6e56, 0x6e55, 0x6e58, 0x6e57, 0x4525, 0x6e59, 0x6e5a, 0x472e, 0x6e5b, 0x472f, 0x6e5c, 0x3227, 0x6e5d, 0x6e5e, 0x6e5f, 0x6e60, 0x6e61, 0x576a, 0x6e62, 0x6e63, 0x3c58, 0x6e64, 0x534b, 0x4c7a, 0x322c, 0x4165, 0x6e65, 0x4726, 0x432d, 0x6e66, 0x6e67, 0x6e68, 0x6e69, 0x6e6a, 0x6e6b, 0x6e6c, 0x6e6d, 0x6e6e, 0x6e6f, 0x6e70, 0x6e71, 0x6e72, 0x6e74, 0x6e73, 0x6e75, 0x4d2d, 0x4241, 0x6e76, 0x6e77, 0x6e78, 0x5521, 0x6e79, 0x4f33, 0x6e7a, 0x6e7b, 0x6e7c, 0x6e7d, 0x6f21, 0x6e7e, 0x6f22, 0x3875, 0x437a, 0x6f23, 0x6f24, 0x3d42, 0x523f, 0x3279, 0x6f25, 0x6f26, 0x6f27, 0x5278, 0x6f28, 0x567d, 0x6f29, 0x464c, 0x6f2a, 0x6f2b, 0x4134, 0x6f2c, 0x4f7a, 0x4b78, 0x6f2e, 0x6f2d, 0x337a, 0x3978, 0x6f2f, 0x6f30, 0x5062, 0x6f31, 0x6f32, 0x3766, 0x503f, 0x6f33, 0x6f34, 0x6f35, 0x4871, 0x4c60, 0x6f36, 0x6f37, 0x6f38, 0x6f39, 0x6f3a, 0x5560, 0x6f3b, 0x346d, 0x432a, 0x6f3c, 0x6f3d, 0x6f3e, 0x6f3f, 0x4e7d, 0x6f40, 0x4260, 0x3438, 0x5736, 0x3d75, 0x4f47, 0x6f43, 0x6f41, 0x6f42, 0x6f44, 0x3627, 0x3c7c, 0x3e62, 0x434c, 0x6f45, 0x6f46, 0x6f47, 0x6f4f, 0x6f48, 0x6f49, 0x6f4a, 0x4742, 0x6f71, 0x364d, 0x6f4b, 0x6f4c, 0x6f4d, 0x3646, 0x433e, 0x6f4e, 0x6f50, 0x6f51, 0x6f52, 0x5572, 0x6f53, 0x4477, 0x6f54, 0x4478, 0x6f55, 0x6f56, 0x3864, 0x3077, 0x6f57, 0x6f58, 0x6f59, 0x6f5a, 0x6f5b, 0x6f5c, 0x6f5d, 0x6f5e, 0x3e35, 0x6f61, 0x6f5f, 0x6f60, 0x6f62, 0x6f63, 0x414d, 0x6f64, 0x6f65, 0x6f66, 0x6f67, 0x6f68, 0x6f69, 0x6f6a, 0x6f6b, 0x6f6c, 0x4058, 0x6f6d, 0x412d, 0x6f6e, 0x6f6f, 0x6f70, 0x4f62, 0x3324, 0x4345, 0x6345, 0x4941, 0x6346, 0x3155, 0x4e4a, 0x3433, 0x4872, 0x6347, 0x4f50, 0x6348, 0x3c64, 0x6349, 0x634a, 0x4346, 0x5522, 0x4456, 0x396b, 0x4e45, 0x634b, 0x4376, 0x634c, 0x3727, 0x3873, 0x3a52, 0x634d, 0x634e, 0x5444, 0x634f, 0x6350, 0x514b, 0x6351, 0x6352, 0x6353, 0x6354, 0x5156, 0x6355, 0x327b, 0x403b, 0x6356, 0x402b, 0x6357, 0x6358, 0x6359, 0x635a, 0x635b, 0x3837, 0x5a62, 0x3653, 0x5a64, 0x5a63, 0x5a66, 0x486e, 0x5a65, 0x3740, 0x5174, 0x5275, 0x5573, 0x3d57, 0x5768, 0x5a68, 0x5a67, 0x3022, 0x4d53, 0x5a69, 0x383d, 0x3c4a, 0x423d, 0x4224, 0x3342, 0x5a6a, 0x422a, 0x4430, 0x3d35, 0x4f5e, 0x5a6b, 0x4942, 0x315d, 0x5a6c, 0x3638, 0x543a, 0x337d, 0x5a6d, 0x5449, 0x4f55, 0x4563, 0x5a6e, 0x5a6f, 0x5a70, 0x416a, 0x4c55, 0x4f5d, 0x5367, 0x4221, 0x5a71, 0x4b65, 0x5a72, 0x4b66, 0x527e, 0x3874, 0x5a73, 0x302f, 0x4f36, 0x554f, 0x4b6d, 0x5a74, 0x6344, 0x4125, 0x763f, 0x7640, 0x7641, 0x4451, 0x4838, 0x5163, 0x505b, 0x5145, 0x3c2f, 0x394d, 0x6f74, 0x3446, 0x533a, 0x7642, 0x337b, 0x7643, 0x3571, 0x7645, 0x536a, 0x7627, 0x5129, 0x7629, 0x7628, 0x4163, 0x4057, 0x3122, 0x4e6d, 0x5068, 0x762b, 0x4f76, 0x762a, 0x5570, 0x762c, 0x4339, 0x3b74, 0x762e, 0x762d, 0x445e, 0x4158, 0x4b2a, 0x4f3c, 0x762f, 0x7630, 0x7631, 0x4236, 0x3054, 0x4579, 0x7632, 0x4760, 0x7626, 0x3e38, 0x3e32, 0x3565, 0x3747, 0x3f3f, 0x4352, 0x4366, 0x584c, 0x386f, 0x3d79, 0x5125, 0x3050, 0x7730, 0x7731, 0x502c, 0x3030, 0x7732, 0x7733, 0x7734, 0x474a, 0x3e4f, 0x7737, 0x7736, 0x315e, 0x7735, 0x7738, 0x7739, 0x4e24, 0x484d, 0x3a2b, 0x6838, 0x6839, 0x683a, 0x3e42, 0x5274, 0x544f, 0x4958, 0x5233, 0x3625, 0x476a, 0x717c, 0x4f6e, 0x4b33, 0x506b, 0x676f, 0x4d67, 0x394b, 0x3659, 0x717d, 0x3064, 0x4b4c, 0x717e, 0x5424, 0x422d, 0x416c, 0x4644, 0x3e31, 0x7221, 0x3c55, 0x7222, 0x7223, 0x7224, 0x5243, 0x4635, 0x4d47, 0x7225, 0x5331, 0x3f45, 0x4c62, 0x7226, 0x7227, 0x5155, 0x366e, 0x7228, 0x7229, 0x355f, 0x722a, 0x722b, 0x327c, 0x722c, 0x722d, 0x4827, 0x3767, 0x6c29, 0x6c2a, 0x6c2b, 0x6c2c, 0x462e, 0x6c2d, 0x6c2e, 0x3749, 0x4a33, 0x6238, 0x774f, 0x7750, 0x324d, 0x7751, 0x7753, 0x7752, 0x623b, 0x3c22, 0x623c, 0x623d, 0x623e, 0x623f, 0x6240, 0x6241, 0x3739, 0x527b, 0x3d24, 0x4a4e, 0x3125, 0x4b47, 0x6242, 0x367c, 0x4844, 0x6243, 0x3d48, 0x317d, 0x6244, 0x3676, 0x6245, 0x4459, 0x6246, 0x4f5a, 0x395d, 0x6247, 0x4021, 0x6248, 0x3276, 0x6249, 0x4173, 0x624a, 0x624b, 0x4278, 0x624c, 0x624d, 0x624e, 0x4a57, 0x5838, 0x5965, 0x4f63, 0x7025, 0x5c30, 0x426d, 0x5426, 0x4d54, 0x5131, 0x335b, 0x477d, 0x3235, 0x423f, 0x6660, 0x4a3b, 0x6661, 0x6662, 0x3e54, 0x6663, 0x5724, 0x4d55, 0x6665, 0x3c5d, 0x6664, 0x6666, 0x6667, 0x426e, 0x3d3e, 0x6668, 0x4266, 0x3a27, 0x6669, 0x666a, 0x3352, 0x5169, 0x3f25, 0x666b, 0x466f, 0x666c, 0x666d, 0x666e, 0x462d, 0x666f, 0x4927, 0x6670, 0x6671, 0x6672, 0x6539, 0x6673, 0x6674, 0x4262, 0x6675, 0x6676, 0x5668, 0x6677, 0x6678, 0x3947, 0x773b, 0x773a, 0x773e, 0x773c, 0x3a21, 0x773f, 0x7740, 0x7742, 0x7741, 0x7744, 0x7743, 0x7745, 0x7746, 0x7747, 0x4b68, 0x385f, 0x7754, 0x7755, 0x7756, 0x7758, 0x775a, 0x7757, 0x775b, 0x7759, 0x5757, 0x775c, 0x775d, 0x775e, 0x775f, 0x7760, 0x5b4b, 0x582a, 0x6577, 0x396d, 0x3f7d, 0x3b6a, 0x7749, 0x4647, 0x7748, 0x774a, 0x774c, 0x774b, 0x774d, 0x4e3a, 0x774e, 0x4427, 0x5363, 0x764f, 0x4233, 0x7650, 0x7651, 0x7652, 0x7653, 0x7654, 0x7656, 0x312b, 0x7657, 0x7658, 0x7659, 0x765a, 0x765b, 0x765c, 0x765d, 0x765e, 0x4f4a, 0x765f, 0x7660, 0x7661, 0x7662, 0x7663, 0x7664, 0x4070, 0x7665, 0x7666, 0x7667, 0x7668, 0x7669, 0x766a, 0x766b, 0x766c, 0x766d, 0x766e, 0x766f, 0x7670, 0x7671, 0x7672, 0x7673, 0x7674, 0x3e28, 0x7675, 0x7676, 0x7677, 0x7678, 0x487a, 0x7679, 0x767a, 0x767b, 0x767c, 0x767d, 0x767e, 0x7721, 0x7722, 0x7723, 0x7724, 0x7725, 0x7726, 0x7727, 0x7728, 0x316e, 0x7729, 0x772a, 0x772b, 0x772c, 0x772d, 0x415b, 0x772e, 0x772f, 0x4471, 0x702f, 0x3c26, 0x7030, 0x4379, 0x4538, 0x513b, 0x7031, 0x7032, 0x7033, 0x7034, 0x7035, 0x513c, 0x516c, 0x7037, 0x7036, 0x5427, 0x4d52, 0x7038, 0x703a, 0x7039, 0x703b, 0x703c, 0x386b, 0x703d, 0x3a68, 0x703e, 0x703f, 0x3e69, 0x7040, 0x366c, 0x7041, 0x7042, 0x7043, 0x7044, 0x4835, 0x7045, 0x7046, 0x7047, 0x4574, 0x7048, 0x7049, 0x704a, 0x773d, 0x704b, 0x704c, 0x704d, 0x704e, 0x704f, 0x3a57, 0x7050, 0x7051, 0x7052, 0x7053, 0x7054, 0x7055, 0x7056, 0x7058, 0x5325, 0x7057, 0x7059, 0x753a, 0x4239, 0x7764, 0x7765, 0x7766, 0x7767, 0x7768, 0x4234, 0x776a, 0x776b, 0x4273, 0x7470, 0x746f, 0x4269, 0x7761, 0x7762, 0x3b46, 0x5964, 0x4a72, 0x4068, 0x7024, 0x3a5a, 0x472d, 0x442c, 0x776c, 0x776d, 0x776e, 0x7770, 0x776f, 0x7771, 0x7774, 0x7773, 0x7772, 0x7775, 0x7776, 0x6d69, 0x6d6a, 0x6d6b, 0x763c, 0x763d, 0x763e, 0x3626, 0x583e, 0x3944, 0x583b, 0x5c31, 0x4a73, 0x7777, 0x7778, 0x7779, 0x777b, 0x777a, 0x3147, 0x777c, 0x777d, 0x777e, 0x466b, 0x6c34, 0x335d, 0x7633, 0x7634, 0x4164, 0x7635, 0x7636, 0x7637, 0x7638, 0x7639, 0x763a, 0x4823, 0x763b, 0x417a, 0x3928, 0x6d68, 0x396a, 0x595f, 0x2321, 0x2322, 0x2323, 0x2167, 0x2325, 0x2326, 0x2327, 0x2328, 0x2329, 0x232a, 0x232b, 0x232c, 0x232d, 0x232e, 0x232f, 0x2330, 0x2331, 0x2332, 0x2333, 0x2334, 0x2335, 0x2336, 0x2337, 0x2338, 0x2339, 0x233a, 0x233b, 0x233c, 0x233d, 0x233e, 0x233f, 0x2340, 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, 0x235b, 0x235c, 0x235d, 0x235e, 0x235f, 0x2360, 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, 0x237b, 0x237c, 0x237d, 0x212b, 0x2169, 0x216a, 0x237e, 0x2324, }; static const Summary16 gb2312_uni2indx_page00[70] = { /* 0x0000 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0190 }, { 3, 0x0003 }, { 5, 0x0000 }, { 5, 0x0080 }, { 6, 0x3703 }, { 13, 0x168c }, /* 0x0100 */ { 19, 0x0002 }, { 20, 0x0808 }, { 22, 0x0800 }, { 23, 0x0000 }, { 23, 0x2000 }, { 24, 0x0000 }, { 24, 0x0800 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x4000 }, { 26, 0x1555 }, { 33, 0x0000 }, { 33, 0x0000 }, /* 0x0200 */ { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0280 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, /* 0x0300 */ { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0xfffe }, { 50, 0x03fb }, { 59, 0xfffe }, { 74, 0x03fb }, { 83, 0x0000 }, { 83, 0x0000 }, { 83, 0x0000 }, /* 0x0400 */ { 83, 0x0002 }, { 84, 0xffff }, { 100, 0xffff }, { 116, 0xffff }, { 132, 0xffff }, { 148, 0x0002 }, }; static const Summary16 gb2312_uni2indx_page20[101] = { /* 0x2000 */ { 149, 0x0000 }, { 149, 0x3360 }, { 155, 0x0040 }, { 156, 0x080d }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, /* 0x2100 */ { 160, 0x0008 }, { 161, 0x0040 }, { 162, 0x0000 }, { 162, 0x0000 }, { 162, 0x0000 }, { 162, 0x0000 }, { 162, 0x0fff }, { 174, 0x0000 }, { 174, 0x0000 }, { 174, 0x000f }, { 178, 0x0000 }, { 178, 0x0000 }, { 178, 0x0000 }, { 178, 0x0000 }, { 178, 0x0000 }, { 178, 0x0000 }, /* 0x2200 */ { 178, 0x8100 }, { 180, 0x6402 }, { 184, 0x4fa1 }, { 192, 0x20f0 }, { 197, 0x1100 }, { 199, 0x0000 }, { 199, 0xc033 }, { 205, 0x0000 }, { 205, 0x0000 }, { 205, 0x0200 }, { 206, 0x0020 }, { 207, 0x0000 }, { 207, 0x0000 }, { 207, 0x0000 }, { 207, 0x0000 }, { 207, 0x0000 }, /* 0x2300 */ { 207, 0x0000 }, { 207, 0x0004 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, /* 0x2400 */ { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x03ff }, { 218, 0xfff0 }, { 230, 0xffff }, { 246, 0x0fff }, { 258, 0x0000 }, { 258, 0x0000 }, { 258, 0x0000 }, { 258, 0x0000 }, { 258, 0x0000 }, { 258, 0x0000 }, /* 0x2500 */ { 258, 0xffff }, { 274, 0xffff }, { 290, 0xffff }, { 306, 0xffff }, { 322, 0x0fff }, { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0003 }, { 336, 0x000c }, { 338, 0xc8c0 }, { 343, 0x0000 }, { 343, 0x0000 }, { 343, 0x0000 }, /* 0x2600 */ { 343, 0x0060 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0005 }, }; static const Summary16 gb2312_uni2indx_page30[35] = { /* 0x3000 */ { 347, 0xff2f }, { 360, 0x00fb }, { 367, 0x0000 }, { 367, 0x0000 }, { 367, 0xfffe }, { 382, 0xffff }, { 398, 0xffff }, { 414, 0xffff }, { 430, 0xffff }, { 446, 0x000f }, { 450, 0xfffe }, { 465, 0xffff }, { 481, 0xffff }, { 497, 0xffff }, { 513, 0xffff }, { 529, 0x087f }, /* 0x3100 */ { 537, 0xffe0 }, { 548, 0xffff }, { 564, 0x03ff }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, /* 0x3200 */ { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x03ff }, }; static const Summary16 gb2312_uni2indx_page4e[1263] = { /* 0x4e00 */ { 584, 0x7f8b }, { 595, 0x7f7b }, { 608, 0x3db4 }, { 617, 0xef55 }, { 628, 0xfba8 }, { 638, 0xf35d }, { 649, 0x0243 }, { 653, 0x400b }, { 657, 0xfb40 }, { 665, 0x8d3e }, { 674, 0x7bf7 }, { 687, 0x8c2c }, { 693, 0x6eff }, { 706, 0xe3fa }, { 717, 0x1d3a }, { 725, 0xa8ed }, /* 0x4f00 */ { 734, 0xe602 }, { 740, 0xcf83 }, { 749, 0x8cf5 }, { 758, 0x3555 }, { 766, 0xe048 }, { 771, 0xffab }, { 784, 0x92b9 }, { 792, 0xd859 }, { 800, 0xab18 }, { 807, 0x2892 }, { 812, 0xd7e9 }, { 823, 0x8020 }, { 825, 0xc438 }, { 831, 0xf583 }, { 840, 0xe74a }, { 849, 0x450a }, /* 0x5000 */ { 854, 0xb000 }, { 857, 0x9714 }, { 864, 0x7762 }, { 873, 0x5400 }, { 876, 0xd188 }, { 882, 0x1420 }, { 885, 0x1020 }, { 887, 0xc8c0 }, { 892, 0x2121 }, { 896, 0x0000 }, { 896, 0x13a8 }, { 902, 0x0c04 }, { 905, 0x8000 }, { 906, 0x0440 }, { 908, 0x70c0 }, { 913, 0x0828 }, /* 0x5100 */ { 916, 0x08c0 }, { 919, 0x0004 }, { 920, 0x0002 }, { 921, 0x8000 }, { 922, 0x2b7b }, { 932, 0x1472 }, { 938, 0x7924 }, { 945, 0x3bfb }, { 957, 0x3327 }, { 965, 0x1ae4 }, { 972, 0x9835 }, { 979, 0x38ef }, { 989, 0x9ad1 }, { 997, 0x2802 }, { 1000, 0xa813 }, { 1006, 0xbf69 }, /* 0x5200 */ { 1017, 0x65cf }, { 1027, 0x2fc6 }, { 1036, 0x6b11 }, { 1043, 0xafc9 }, { 1053, 0x340f }, { 1060, 0x5053 }, { 1066, 0x86a2 }, { 1072, 0xa004 }, { 1075, 0x0106 }, { 1078, 0xe809 }, { 1084, 0x3f0f }, { 1094, 0xc00e }, { 1099, 0x0a88 }, { 1103, 0x8145 }, { 1108, 0x0010 }, { 1109, 0xc601 }, /* 0x5300 */ { 1114, 0xa161 }, { 1120, 0x26e1 }, { 1127, 0x444b }, { 1133, 0xce00 }, { 1138, 0xc7aa }, { 1147, 0xd4ee }, { 1157, 0xcadf }, { 1168, 0x85bb }, { 1177, 0x3a74 }, { 1185, 0xa520 }, { 1190, 0x436c }, { 1197, 0x8840 }, { 1200, 0x3f06 }, { 1208, 0x8bd2 }, { 1216, 0xff79 }, { 1229, 0x3bef }, /* 0x5400 */ { 1241, 0xf75a }, { 1252, 0xe8ef }, { 1263, 0xfbcb }, { 1275, 0x5b36 }, { 1284, 0x0d49 }, { 1290, 0x1bfd }, { 1301, 0x0154 }, { 1305, 0x39ee }, { 1315, 0xd855 }, { 1323, 0x2e75 }, { 1332, 0xbfd8 }, { 1343, 0xa91a }, { 1350, 0xf3d7 }, { 1362, 0xf6bf }, { 1375, 0x67e0 }, { 1383, 0xb40c }, /* 0x5500 */ { 1389, 0x82c2 }, { 1394, 0x0813 }, { 1398, 0xd49d }, { 1407, 0xd08b }, { 1414, 0x065a }, { 1420, 0x1061 }, { 1424, 0x74f2 }, { 1433, 0x59e0 }, { 1440, 0x8f9f }, { 1451, 0xb312 }, { 1458, 0x0080 }, { 1459, 0x6aaa }, { 1467, 0x3230 }, { 1472, 0xb05e }, { 1480, 0x9d7a }, { 1490, 0x60ac }, /* 0x5600 */ { 1496, 0xd303 }, { 1503, 0xc900 }, { 1507, 0x3098 }, { 1512, 0x8a56 }, { 1519, 0x7000 }, { 1522, 0x1390 }, { 1527, 0x1f14 }, { 1534, 0x1842 }, { 1538, 0xc060 }, { 1542, 0x0008 }, { 1543, 0x8008 }, { 1545, 0x1080 }, { 1547, 0x0400 }, { 1548, 0xec90 }, { 1555, 0x2817 }, { 1561, 0xe633 }, /* 0x5700 */ { 1570, 0x0758 }, { 1576, 0x9000 }, { 1578, 0xf708 }, { 1586, 0x4e09 }, { 1592, 0xf485 }, { 1600, 0xfc83 }, { 1609, 0xaf53 }, { 1619, 0x18c8 }, { 1624, 0x187c }, { 1631, 0x080c }, { 1634, 0x6adf }, { 1645, 0x0114 }, { 1648, 0xc80c }, { 1653, 0xa734 }, { 1661, 0xa011 }, { 1665, 0x2710 }, /* 0x5800 */ { 1670, 0x28c5 }, { 1676, 0x4222 }, { 1680, 0x0413 }, { 1684, 0x0021 }, { 1686, 0x3010 }, { 1689, 0x4112 }, { 1693, 0x1820 }, { 1696, 0x4000 }, { 1697, 0x022b }, { 1702, 0xc60c }, { 1708, 0x0300 }, { 1710, 0x1000 }, { 1711, 0x0022 }, { 1713, 0x0022 }, { 1715, 0x5810 }, { 1719, 0x0249 }, /* 0x5900 */ { 1723, 0xa094 }, { 1728, 0x9670 }, { 1735, 0xeeb0 }, { 1744, 0x1792 }, { 1751, 0xcb96 }, { 1760, 0x05f2 }, { 1767, 0x0025 }, { 1770, 0x2358 }, { 1776, 0x25de }, { 1785, 0x42cc }, { 1791, 0xcf38 }, { 1800, 0x4a04 }, { 1804, 0x0c40 }, { 1807, 0x359f }, { 1817, 0x1128 }, { 1821, 0x8a00 }, /* 0x5a00 */ { 1824, 0x13fa }, { 1833, 0x910a }, { 1838, 0x0229 }, { 1842, 0x1056 }, { 1847, 0x0641 }, { 1851, 0x0420 }, { 1853, 0x0484 }, { 1856, 0x84f0 }, { 1862, 0x0000 }, { 1862, 0x0c04 }, { 1865, 0x0400 }, { 1866, 0x412c }, { 1871, 0x1206 }, { 1875, 0x1154 }, { 1880, 0x0a4b }, { 1886, 0x0002 }, /* 0x5b00 */ { 1887, 0x0200 }, { 1888, 0x00c0 }, { 1890, 0x0000 }, { 1890, 0x0094 }, { 1893, 0x0001 }, { 1894, 0xbfbb }, { 1907, 0x167c }, { 1915, 0x242b }, { 1921, 0x9bbb }, { 1932, 0x7fa8 }, { 1942, 0x0c7f }, { 1951, 0xe379 }, { 1961, 0x10f4 }, { 1967, 0xe00d }, { 1973, 0x4132 }, { 1978, 0x9f01 }, /* 0x5c00 */ { 1985, 0x8652 }, { 1991, 0x3572 }, { 1999, 0x10b4 }, { 2004, 0xff12 }, { 2014, 0xcf27 }, { 2024, 0x4223 }, { 2029, 0xc06b }, { 2036, 0x8602 }, { 2040, 0x3106 }, { 2045, 0x1fd3 }, { 2055, 0x3a0c }, { 2061, 0xa1aa }, { 2068, 0x0812 }, { 2071, 0x0204 }, { 2073, 0x2572 }, { 2080, 0x0801 }, /* 0x5d00 */ { 2082, 0x40cc }, { 2087, 0x4850 }, { 2091, 0x62d0 }, { 2097, 0x6010 }, { 2100, 0x1c80 }, { 2104, 0x2900 }, { 2107, 0x9a00 }, { 2111, 0x0010 }, { 2112, 0x0004 }, { 2113, 0x2200 }, { 2115, 0x0000 }, { 2115, 0x0080 }, { 2116, 0x2020 }, { 2118, 0x6800 }, { 2121, 0xcbe6 }, { 2131, 0x609e }, /* 0x5e00 */ { 2138, 0x916e }, { 2146, 0x3f73 }, { 2157, 0x60c0 }, { 2161, 0x3982 }, { 2167, 0x1034 }, { 2171, 0x4830 }, { 2175, 0x0006 }, { 2177, 0xbd5c }, { 2187, 0x8cd1 }, { 2194, 0xd6fb }, { 2206, 0x20e1 }, { 2211, 0x43e8 }, { 2218, 0x0600 }, { 2220, 0x084e }, { 2225, 0x0500 }, { 2227, 0xc4d0 }, /* 0x5f00 */ { 2233, 0x8d1f }, { 2242, 0x89aa }, { 2249, 0xa6e1 }, { 2257, 0x1602 }, { 2261, 0x0001 }, { 2262, 0x21ed }, { 2270, 0x3656 }, { 2278, 0x1a8b }, { 2285, 0x1fb7 }, { 2296, 0x13a5 }, { 2303, 0x6502 }, { 2308, 0x30a0 }, { 2312, 0xb278 }, { 2320, 0x23c7 }, { 2328, 0x6c93 }, { 2336, 0xe922 }, /* 0x6000 */ { 2343, 0xe47f }, { 2354, 0x3a74 }, { 2362, 0x8fe3 }, { 2372, 0x9820 }, { 2376, 0x280e }, { 2381, 0x2625 }, { 2387, 0xbf9c }, { 2398, 0xbf49 }, { 2408, 0x3218 }, { 2413, 0xac54 }, { 2420, 0xb949 }, { 2428, 0x1916 }, { 2434, 0x0c60 }, { 2438, 0xb522 }, { 2445, 0xfbc1 }, { 2455, 0x0659 }, /* 0x6100 */ { 2461, 0xe343 }, { 2469, 0x8420 }, { 2472, 0x08d9 }, { 2478, 0x8000 }, { 2479, 0x5500 }, { 2483, 0x2022 }, { 2486, 0x0184 }, { 2489, 0x00a1 }, { 2492, 0x4800 }, { 2494, 0x2010 }, { 2496, 0x1380 }, { 2500, 0x4080 }, { 2502, 0x0d04 }, { 2506, 0x0016 }, { 2509, 0x0040 }, { 2510, 0x8020 }, /* 0x6200 */ { 2512, 0xfd40 }, { 2520, 0x8de7 }, { 2530, 0x5436 }, { 2537, 0xe098 }, { 2543, 0x7b8b }, { 2553, 0x091e }, { 2559, 0xfec8 }, { 2569, 0xd249 }, { 2576, 0x0611 }, { 2580, 0x8dee }, { 2590, 0x1937 }, { 2598, 0xba22 }, { 2605, 0x77f4 }, { 2616, 0x9fdd }, { 2628, 0xf3ec }, { 2639, 0xf0da }, /* 0x6300 */ { 2648, 0x4386 }, { 2654, 0xec42 }, { 2661, 0x8d3f }, { 2671, 0x2604 }, { 2675, 0xfa6c }, { 2685, 0xc021 }, { 2689, 0x628e }, { 2696, 0x0cc2 }, { 2701, 0xd785 }, { 2710, 0x0145 }, { 2714, 0x77ad }, { 2725, 0x5599 }, { 2733, 0xe250 }, { 2739, 0x4045 }, { 2743, 0x260b }, { 2749, 0xa154 }, /* 0x6400 */ { 2755, 0x9827 }, { 2762, 0x5819 }, { 2768, 0x3443 }, { 2774, 0xa410 }, { 2778, 0x05f2 }, { 2785, 0x4114 }, { 2789, 0x2280 }, { 2792, 0x0700 }, { 2795, 0x00b4 }, { 2799, 0x4266 }, { 2805, 0x7210 }, { 2810, 0x15a1 }, { 2816, 0x6025 }, { 2821, 0x4185 }, { 2826, 0x0054 }, { 2829, 0x0000 }, /* 0x6500 */ { 2829, 0x0201 }, { 2831, 0x0104 }, { 2833, 0xc820 }, { 2837, 0xcb70 }, { 2845, 0x9320 }, { 2850, 0x6a62 }, { 2857, 0x184c }, { 2862, 0x0095 }, { 2866, 0x1880 }, { 2869, 0x9a8b }, { 2877, 0xaab2 }, { 2885, 0x3201 }, { 2889, 0xd87a }, { 2898, 0x00c4 }, { 2901, 0xf3e5 }, { 2912, 0x04c3 }, /* 0x6600 */ { 2917, 0xd44d }, { 2925, 0xa238 }, { 2931, 0xa1a1 }, { 2937, 0x5072 }, { 2943, 0x980a }, { 2948, 0x84fc }, { 2956, 0xc152 }, { 2962, 0x44d1 }, { 2968, 0x1094 }, { 2972, 0x20c2 }, { 2976, 0x4180 }, { 2979, 0x4210 }, { 2982, 0x0000 }, { 2982, 0x3a00 }, { 2986, 0x0240 }, { 2988, 0xd29d }, /* 0x6700 */ { 2997, 0x2f01 }, { 3003, 0xa8b1 }, { 3010, 0xbd40 }, { 3017, 0x2432 }, { 3022, 0xd34d }, { 3031, 0xd04b }, { 3038, 0xa723 }, { 3046, 0xd0ad }, { 3054, 0x0a92 }, { 3059, 0x75a1 }, { 3067, 0xadac }, { 3076, 0x01e9 }, { 3082, 0x801a }, { 3086, 0x771f }, { 3097, 0x9225 }, { 3103, 0xa01b }, /* 0x6800 */ { 3109, 0xdfa1 }, { 3119, 0x20ca }, { 3124, 0x0602 }, { 3127, 0x738c }, { 3135, 0x577f }, { 3147, 0x003b }, { 3152, 0x0bff }, { 3163, 0x00d0 }, { 3166, 0x806a }, { 3171, 0x0088 }, { 3173, 0xa1c4 }, { 3179, 0x0029 }, { 3182, 0x2a05 }, { 3187, 0x0524 }, { 3191, 0x4009 }, { 3194, 0x1623 }, /* 0x6900 */ { 3200, 0x6822 }, { 3205, 0x8005 }, { 3208, 0x2011 }, { 3211, 0xa211 }, { 3216, 0x0004 }, { 3217, 0x6490 }, { 3222, 0x4849 }, { 3227, 0x1382 }, { 3232, 0x23d5 }, { 3240, 0x1930 }, { 3245, 0x2980 }, { 3249, 0x0892 }, { 3253, 0x5402 }, { 3257, 0x8811 }, { 3261, 0x2001 }, { 3263, 0xa004 }, /* 0x6a00 */ { 3266, 0x0400 }, { 3267, 0x8180 }, { 3270, 0x8502 }, { 3274, 0x6022 }, { 3278, 0x0090 }, { 3280, 0x0b01 }, { 3284, 0x0022 }, { 3286, 0x1202 }, { 3289, 0x4011 }, { 3292, 0x0083 }, { 3295, 0x1a01 }, { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x0000 }, /* 0x6b00 */ { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x009f }, { 3305, 0x4684 }, { 3310, 0x12c8 }, { 3315, 0x0200 }, { 3316, 0x04fc }, { 3323, 0x1a00 }, { 3326, 0x2ede }, { 3336, 0x0c4c }, { 3341, 0x0402 }, { 3343, 0x80b8 }, { 3348, 0xa826 }, { 3354, 0x0afc }, { 3362, 0x8c02 }, { 3366, 0x2228 }, /* 0x6c00 */ { 3370, 0xa0e0 }, { 3375, 0x8f7b }, { 3386, 0xc7d6 }, { 3396, 0x2135 }, { 3402, 0x06c7 }, { 3409, 0xf8b1 }, { 3418, 0x0713 }, { 3424, 0x6255 }, { 3431, 0x936e }, { 3440, 0x8a19 }, { 3446, 0x6efa }, { 3457, 0xfb0e }, { 3467, 0x1630 }, { 3472, 0x48f9 }, { 3480, 0xcd2f }, { 3490, 0x7deb }, /* 0x6d00 */ { 3502, 0x5892 }, { 3508, 0x4e84 }, { 3514, 0x4ca0 }, { 3519, 0x7a2e }, { 3528, 0xedea }, { 3539, 0x561e }, { 3547, 0xc649 }, { 3554, 0x1190 }, { 3558, 0x5324 }, { 3564, 0xe83a }, { 3572, 0xcfdb }, { 3584, 0x8124 }, { 3588, 0x18f1 }, { 3595, 0x6342 }, { 3601, 0x5853 }, { 3608, 0x1a8a }, /* 0x6e00 */ { 3614, 0x7420 }, { 3619, 0x24d3 }, { 3626, 0xaa3b }, { 3635, 0x0514 }, { 3639, 0x6018 }, { 3643, 0x8958 }, { 3649, 0x4800 }, { 3651, 0xc000 }, { 3653, 0x8268 }, { 3658, 0x9101 }, { 3662, 0x84a4 }, { 3667, 0x2cd6 }, { 3675, 0x8886 }, { 3680, 0xc4ba }, { 3688, 0x0377 }, { 3696, 0x0210 }, /* 0x6f00 */ { 3698, 0x8244 }, { 3702, 0x0038 }, { 3705, 0xae11 }, { 3712, 0x404a }, { 3716, 0x28c0 }, { 3720, 0x5100 }, { 3723, 0x6044 }, { 3727, 0x1514 }, { 3732, 0x7310 }, { 3738, 0x1000 }, { 3739, 0x0082 }, { 3741, 0x0248 }, { 3744, 0x0205 }, { 3747, 0x4006 }, { 3750, 0xc003 }, { 3754, 0x0000 }, /* 0x7000 */ { 3754, 0x0000 }, { 3754, 0x0c02 }, { 3757, 0x0008 }, { 3758, 0x0220 }, { 3760, 0x9000 }, { 3762, 0x4000 }, { 3763, 0xb800 }, { 3767, 0xd161 }, { 3774, 0x4621 }, { 3779, 0x3274 }, { 3786, 0xf800 }, { 3791, 0x3b8a }, { 3799, 0x050f }, { 3805, 0x8b00 }, { 3809, 0xbbd0 }, { 3818, 0x2280 }, /* 0x7100 */ { 3821, 0x0600 }, { 3823, 0x0769 }, { 3830, 0x8040 }, { 3832, 0x0043 }, { 3835, 0x5420 }, { 3839, 0x5000 }, { 3841, 0x41d0 }, { 3846, 0x250c }, { 3851, 0x8410 }, { 3854, 0x8310 }, { 3858, 0x1101 }, { 3861, 0x0228 }, { 3864, 0x4008 }, { 3866, 0x0030 }, { 3868, 0x40a1 }, { 3872, 0x0200 }, /* 0x7200 */ { 3873, 0x0040 }, { 3874, 0x2000 }, { 3875, 0x1500 }, { 3878, 0xabe3 }, { 3888, 0x3180 }, { 3892, 0xaa44 }, { 3898, 0xc2c6 }, { 3905, 0xc624 }, { 3911, 0xac13 }, { 3918, 0x8004 }, { 3920, 0xb000 }, { 3923, 0x03d1 }, { 3929, 0x611e }, { 3936, 0x4285 }, { 3941, 0xf303 }, { 3949, 0x1d9f }, /* 0x7300 */ { 3959, 0x440a }, { 3963, 0x78e8 }, { 3971, 0x5e26 }, { 3979, 0xc392 }, { 3986, 0x2000 }, { 3987, 0x0085 }, { 3990, 0xb001 }, { 3994, 0x4000 }, { 3995, 0x4a90 }, { 4000, 0x8842 }, { 4004, 0xca04 }, { 4009, 0x0c8d }, { 4015, 0xa705 }, { 4022, 0x4203 }, { 4026, 0x22a1 }, { 4031, 0x0004 }, /* 0x7400 */ { 4032, 0x8668 }, { 4038, 0x0c01 }, { 4041, 0x5564 }, { 4048, 0x1079 }, { 4054, 0x0002 }, { 4055, 0xdea0 }, { 4063, 0x2000 }, { 4064, 0x40c1 }, { 4068, 0x488b }, { 4074, 0x5001 }, { 4077, 0x0380 }, { 4080, 0x0400 }, { 4081, 0x0000 }, { 4081, 0x5004 }, { 4084, 0xc05d }, { 4091, 0x80d0 }, /* 0x7500 */ { 4095, 0xa010 }, { 4098, 0x970a }, { 4105, 0xbb20 }, { 4112, 0x4daf }, { 4122, 0xd921 }, { 4129, 0x1e10 }, { 4134, 0x0460 }, { 4137, 0x8314 }, { 4142, 0x8848 }, { 4146, 0xa6d6 }, { 4155, 0xd83b }, { 4164, 0x733f }, { 4175, 0x27bc }, { 4184, 0x4974 }, { 4191, 0x0ddc }, { 4199, 0x9213 }, /* 0x7600 */ { 4205, 0x142b }, { 4211, 0x8ba1 }, { 4218, 0x2e75 }, { 4227, 0xd139 }, { 4235, 0x3009 }, { 4239, 0x5050 }, { 4243, 0x8808 }, { 4246, 0x6900 }, { 4250, 0x49d4 }, { 4257, 0x024a }, { 4261, 0x4010 }, { 4263, 0x8016 }, { 4267, 0xe564 }, { 4275, 0x89d7 }, { 4284, 0xc020 }, { 4287, 0x5316 }, /* 0x7700 */ { 4294, 0x2b92 }, { 4301, 0x8600 }, { 4304, 0xa345 }, { 4311, 0x15e0 }, { 4317, 0x008b }, { 4321, 0x0c03 }, { 4325, 0x196e }, { 4333, 0xe200 }, { 4337, 0x7031 }, { 4343, 0x8006 }, { 4346, 0x16a5 }, { 4353, 0xa829 }, { 4359, 0x2000 }, { 4360, 0x1880 }, { 4363, 0x7aac }, { 4372, 0xe148 }, /* 0x7800 */ { 4378, 0x3207 }, { 4384, 0xb5d6 }, { 4394, 0x32e8 }, { 4401, 0x5f91 }, { 4410, 0x50a1 }, { 4415, 0x20e5 }, { 4421, 0x7c00 }, { 4426, 0x1080 }, { 4428, 0x7280 }, { 4433, 0x9d8a }, { 4441, 0x00aa }, { 4445, 0x421f }, { 4452, 0x0e22 }, { 4457, 0x0231 }, { 4461, 0x1100 }, { 4463, 0x0494 }, /* 0x7900 */ { 4467, 0x0022 }, { 4469, 0x4008 }, { 4471, 0x0010 }, { 4472, 0x5c10 }, { 4477, 0x0343 }, { 4482, 0xfcc8 }, { 4491, 0xa1a5 }, { 4498, 0x0580 }, { 4501, 0x8433 }, { 4507, 0x0400 }, { 4508, 0x0080 }, { 4509, 0x6e08 }, { 4515, 0x2a4b }, { 4522, 0x8126 }, { 4527, 0xaad8 }, { 4535, 0x2901 }, /* 0x7a00 */ { 4539, 0x684d }, { 4546, 0x4490 }, { 4550, 0x0009 }, { 4552, 0xba88 }, { 4559, 0x0040 }, { 4560, 0x0082 }, { 4562, 0x0000 }, { 4562, 0x87d1 }, { 4570, 0x215b }, { 4577, 0xb1e6 }, { 4586, 0x3161 }, { 4592, 0x8008 }, { 4594, 0x0800 }, { 4595, 0xc240 }, { 4599, 0xa069 }, { 4605, 0xa600 }, /* 0x7b00 */ { 4609, 0x8d58 }, { 4616, 0x4a32 }, { 4622, 0x5d71 }, { 4631, 0x550a }, { 4637, 0x9aa0 }, { 4643, 0x2d57 }, { 4652, 0x4005 }, { 4655, 0x4aa6 }, { 4662, 0x2021 }, { 4665, 0x30b1 }, { 4671, 0x3fc6 }, { 4681, 0x0112 }, { 4684, 0x10c2 }, { 4688, 0x260a }, { 4693, 0x4462 }, { 4698, 0x5082 }, /* 0x7c00 */ { 4702, 0x9880 }, { 4706, 0x8040 }, { 4708, 0x04c0 }, { 4711, 0x8100 }, { 4713, 0x2003 }, { 4716, 0x0000 }, { 4716, 0x0000 }, { 4716, 0x3818 }, { 4721, 0x0200 }, { 4722, 0xf1a6 }, { 4731, 0x4434 }, { 4736, 0x720e }, { 4743, 0x35a2 }, { 4750, 0x92e0 }, { 4756, 0x8101 }, { 4759, 0x0900 }, /* 0x7d00 */ { 4761, 0x0400 }, { 4762, 0x0000 }, { 4762, 0x8885 }, { 4767, 0x0000 }, { 4767, 0x0000 }, { 4767, 0x0000 }, { 4767, 0x4000 }, { 4768, 0x0080 }, { 4769, 0x0000 }, { 4769, 0x0000 }, { 4769, 0x4040 }, { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 }, /* 0x7e00 */ { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0800 }, { 4772, 0x0082 }, { 4774, 0x0000 }, { 4774, 0x0000 }, { 4774, 0x0000 }, { 4774, 0x0004 }, { 4775, 0x8800 }, { 4777, 0xbfff }, { 4792, 0xe7ef }, { 4805, 0xffff }, { 4821, 0xffbf }, { 4836, 0xefef }, { 4850, 0xfdff }, /* 0x7f00 */ { 4865, 0xfbff }, { 4880, 0xbffe }, { 4894, 0xffff }, { 4910, 0x057f }, { 4919, 0x0034 }, { 4922, 0x85b3 }, { 4930, 0x4706 }, { 4936, 0x4216 }, { 4941, 0x5402 }, { 4945, 0xe410 }, { 4950, 0x8092 }, { 4954, 0xb305 }, { 4961, 0x5422 }, { 4966, 0x8130 }, { 4970, 0x4263 }, { 4976, 0x180b }, /* 0x8000 */ { 4981, 0x387b }, { 4990, 0x13f5 }, { 4999, 0x07e5 }, { 5007, 0xa9ea }, { 5016, 0x3c4c }, { 5023, 0x0514 }, { 5027, 0x0600 }, { 5029, 0x8002 }, { 5031, 0x1ad9 }, { 5039, 0xbd48 }, { 5047, 0xee37 }, { 5058, 0xf496 }, { 5067, 0x705f }, { 5076, 0x7ec0 }, { 5084, 0xbfb2 }, { 5095, 0x355f }, /* 0x8100 */ { 5105, 0xe644 }, { 5112, 0x455f }, { 5121, 0x9000 }, { 5123, 0x4146 }, { 5128, 0x1d40 }, { 5133, 0x063b }, { 5140, 0x62a1 }, { 5146, 0xfe13 }, { 5156, 0x8505 }, { 5161, 0x3902 }, { 5166, 0x0548 }, { 5170, 0x0c08 }, { 5173, 0x144f }, { 5180, 0x0000 }, { 5180, 0x3488 }, { 5185, 0x5818 }, /* 0x8200 */ { 5190, 0x3077 }, { 5198, 0xd815 }, { 5205, 0xbd0e }, { 5214, 0x4bfb }, { 5225, 0x8a90 }, { 5230, 0x8500 }, { 5233, 0xc100 }, { 5236, 0xe61d }, { 5245, 0xed14 }, { 5253, 0xb386 }, { 5261, 0xff72 }, { 5273, 0x639b }, { 5282, 0xfd92 }, { 5292, 0xd9be }, { 5303, 0x887b }, { 5311, 0x0a92 }, /* 0x8300 */ { 5316, 0xd3fe }, { 5328, 0x1cb2 }, { 5335, 0xb980 }, { 5341, 0x177a }, { 5350, 0x82c9 }, { 5356, 0xdc17 }, { 5365, 0xfffb }, { 5380, 0x3980 }, { 5385, 0x4260 }, { 5389, 0x590c }, { 5395, 0x0f01 }, { 5400, 0x37df }, { 5412, 0x94a3 }, { 5419, 0xb150 }, { 5425, 0x0623 }, { 5430, 0x2307 }, /* 0x8400 */ { 5436, 0xf85a }, { 5445, 0x3102 }, { 5449, 0x01f0 }, { 5454, 0x3102 }, { 5458, 0x0040 }, { 5459, 0x1e82 }, { 5465, 0x3a0a }, { 5471, 0x056a }, { 5477, 0x5b84 }, { 5484, 0x1280 }, { 5487, 0x8002 }, { 5489, 0xa714 }, { 5496, 0x2612 }, { 5501, 0xa04b }, { 5507, 0x1069 }, { 5512, 0x9001 }, /* 0x8500 */ { 5515, 0x1000 }, { 5516, 0x848a }, { 5521, 0x1802 }, { 5524, 0x3f80 }, { 5531, 0x0708 }, { 5535, 0x4240 }, { 5538, 0x0110 }, { 5540, 0x4e14 }, { 5546, 0x80b0 }, { 5550, 0x1800 }, { 5552, 0xc510 }, { 5557, 0x0281 }, { 5560, 0x8202 }, { 5563, 0x1029 }, { 5567, 0x0210 }, { 5569, 0x8800 }, /* 0x8600 */ { 5571, 0x0020 }, { 5572, 0x0042 }, { 5574, 0x0280 }, { 5576, 0x1100 }, { 5578, 0xe000 }, { 5581, 0x4413 }, { 5586, 0x5804 }, { 5590, 0xfe02 }, { 5598, 0x3c07 }, { 5605, 0x3028 }, { 5609, 0x9798 }, { 5617, 0x0473 }, { 5623, 0xced1 }, { 5632, 0xcb13 }, { 5640, 0x6210 }, { 5644, 0x431f }, /* 0x8700 */ { 5652, 0x278d }, { 5660, 0x55ac }, { 5668, 0x422e }, { 5674, 0xc892 }, { 5680, 0x5380 }, { 5685, 0x0288 }, { 5688, 0x4039 }, { 5693, 0x7851 }, { 5700, 0x292c }, { 5706, 0x8088 }, { 5709, 0xb900 }, { 5714, 0x2428 }, { 5718, 0x0c41 }, { 5722, 0x080e }, { 5726, 0x4421 }, { 5730, 0x4200 }, /* 0x8800 */ { 5732, 0x0408 }, { 5734, 0x0868 }, { 5738, 0x0006 }, { 5740, 0x1204 }, { 5743, 0x3031 }, { 5748, 0x0290 }, { 5751, 0x5b3e }, { 5761, 0xe085 }, { 5767, 0x2936 }, { 5774, 0x1044 }, { 5777, 0x2814 }, { 5781, 0x1082 }, { 5784, 0x4266 }, { 5790, 0x8334 }, { 5796, 0x013c }, { 5801, 0x531b }, /* 0x8900 */ { 5809, 0x0404 }, { 5811, 0x0e0d }, { 5817, 0x0c22 }, { 5821, 0x0051 }, { 5824, 0x0012 }, { 5826, 0xc000 }, { 5828, 0x0040 }, { 5829, 0x8800 }, { 5831, 0x004a }, { 5834, 0x0000 }, { 5834, 0x0000 }, { 5834, 0x0000 }, { 5834, 0xdff6 }, { 5847, 0x5447 }, { 5854, 0x8868 }, { 5859, 0x0008 }, /* 0x8a00 */ { 5860, 0x0081 }, { 5862, 0x0000 }, { 5862, 0x0000 }, { 5862, 0x4000 }, { 5863, 0x0100 }, { 5864, 0x0000 }, { 5864, 0x0000 }, { 5864, 0x0200 }, { 5865, 0x0600 }, { 5867, 0x0008 }, { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 }, /* 0x8b00 */ { 5868, 0x0080 }, { 5869, 0x0000 }, { 5869, 0x0040 }, { 5870, 0x0000 }, { 5870, 0x0000 }, { 5870, 0x0000 }, { 5870, 0x1040 }, { 5872, 0x0000 }, { 5872, 0x0000 }, { 5872, 0x0000 }, { 5872, 0xefff }, { 5887, 0xf7fd }, { 5901, 0xff7f }, { 5916, 0xfffe }, { 5931, 0xfbff }, { 5946, 0xffff }, /* 0x8c00 */ { 5962, 0xfdff }, { 5977, 0xbfff }, { 5992, 0xffff }, { 6008, 0x00ff }, { 6016, 0x12c2 }, { 6021, 0x0420 }, { 6023, 0x0c06 }, { 6027, 0x0708 }, { 6031, 0x1624 }, { 6036, 0x0110 }, { 6038, 0x0000 }, { 6038, 0x0000 }, { 6038, 0x0000 }, { 6038, 0x0000 }, { 6038, 0x0000 }, { 6038, 0x0000 }, /* 0x8d00 */ { 6038, 0x0000 }, { 6038, 0xe000 }, { 6041, 0xfffe }, { 6056, 0xffff }, { 6072, 0xffff }, { 6088, 0x7f79 }, { 6100, 0x28df }, { 6109, 0x00f9 }, { 6115, 0x0c32 }, { 6120, 0x8012 }, { 6123, 0x0008 }, { 6124, 0xd53a }, { 6133, 0xd858 }, { 6140, 0xecc2 }, { 6148, 0x9d18 }, { 6155, 0x2fa8 }, /* 0x8e00 */ { 6163, 0x9620 }, { 6168, 0xe010 }, { 6172, 0xd60c }, { 6179, 0x2622 }, { 6184, 0x0f97 }, { 6193, 0x0206 }, { 6196, 0xb240 }, { 6201, 0x9055 }, { 6207, 0x80a2 }, { 6211, 0x5011 }, { 6215, 0x9800 }, { 6218, 0x0404 }, { 6220, 0x4000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, /* 0x8f00 */ { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0xfbc0 }, { 6230, 0xffff }, { 6246, 0xeffe }, { 6260, 0xdffb }, { 6274, 0x0b08 }, { 6278, 0x6243 }, { 6284, 0x41b6 }, { 6291, 0xfb3b }, { 6303, 0x6f74 }, { 6313, 0x2389 }, /* 0x9000 */ { 6319, 0xae7f }, { 6331, 0xecd7 }, { 6342, 0xe047 }, { 6349, 0x5960 }, { 6355, 0xa096 }, { 6361, 0x098f }, { 6368, 0x612c }, { 6374, 0xa030 }, { 6378, 0x090d }, { 6383, 0x2aaa }, { 6390, 0xd44e }, { 6398, 0x4f7b }, { 6409, 0xc4b2 }, { 6416, 0x388b }, { 6423, 0xa9c6 }, { 6431, 0x6110 }, /* 0x9100 */ { 6435, 0x0014 }, { 6437, 0x4200 }, { 6439, 0x800c }, { 6442, 0x0202 }, { 6444, 0xfe48 }, { 6453, 0x6485 }, { 6459, 0xd63e }, { 6469, 0xe3f7 }, { 6481, 0x3aa0 }, { 6487, 0x0c07 }, { 6492, 0xe40c }, { 6498, 0x0430 }, { 6501, 0xf680 }, { 6508, 0x1002 }, { 6510, 0x0000 }, { 6510, 0x0000 }, /* 0x9200 */ { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0010 }, { 6511, 0x4000 }, { 6512, 0x0000 }, { 6512, 0x4000 }, { 6513, 0x0000 }, { 6513, 0x0100 }, { 6514, 0x0000 }, { 6514, 0x0000 }, { 6514, 0x0000 }, /* 0x9300 */ { 6514, 0x0000 }, { 6514, 0x0000 }, { 6514, 0x0000 }, { 6514, 0x4000 }, { 6515, 0x0000 }, { 6515, 0x0000 }, { 6515, 0x0400 }, { 6516, 0x0000 }, { 6516, 0x8000 }, { 6517, 0x0000 }, { 6517, 0x0000 }, { 6517, 0x0000 }, { 6517, 0x0400 }, { 6518, 0x0040 }, { 6519, 0x0000 }, { 6519, 0x0000 }, /* 0x9400 */ { 6519, 0x0000 }, { 6519, 0x0000 }, { 6519, 0x0000 }, { 6519, 0x4000 }, { 6520, 0x0000 }, { 6520, 0x0000 }, { 6520, 0x0800 }, { 6521, 0x0000 }, { 6521, 0xffe0 }, { 6532, 0xfebd }, { 6545, 0xffff }, { 6561, 0xffff }, { 6577, 0x7f7f }, { 6591, 0xfbe7 }, { 6604, 0xffbf }, { 6619, 0xf7ff }, /* 0x9500 */ { 6634, 0xffff }, { 6650, 0xefff }, { 6665, 0xff7e }, { 6679, 0xdff7 }, { 6693, 0xf6f7 }, { 6706, 0xfbdf }, { 6720, 0xbffe }, { 6734, 0x804f }, { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0xef00 }, { 6747, 0x7fff }, /* 0x9600 */ { 6762, 0xff7f }, { 6777, 0xb6f7 }, { 6789, 0x4406 }, { 6793, 0xb87e }, { 6803, 0x3bf5 }, { 6814, 0x8831 }, { 6819, 0x1796 }, { 6827, 0x00f4 }, { 6832, 0xa960 }, { 6838, 0x1391 }, { 6844, 0x0080 }, { 6845, 0x7249 }, { 6852, 0xf2f3 }, { 6863, 0x0024 }, { 6865, 0x8701 }, { 6870, 0x42c8 }, /* 0x9700 */ { 6875, 0xe3d3 }, { 6885, 0x5048 }, { 6889, 0x2400 }, { 6891, 0x4305 }, { 6896, 0x0000 }, { 6896, 0x4a4c }, { 6902, 0x0227 }, { 6907, 0x1058 }, { 6911, 0x2820 }, { 6914, 0x0116 }, { 6918, 0xa809 }, { 6923, 0x0014 }, { 6925, 0x0000 }, { 6925, 0x0000 }, { 6925, 0x3ec0 }, { 6932, 0x0068 }, /* 0x9800 */ { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0xffe0 }, { 6946, 0xb7ff }, { 6960, 0xfddb }, { 6973, 0x00f7 }, { 6980, 0x0000 }, { 6980, 0x4000 }, { 6981, 0xc72e }, { 6990, 0x0180 }, { 6992, 0x0000 }, /* 0x9900 */ { 6992, 0x2000 }, { 6993, 0x0001 }, { 6994, 0x4000 }, { 6995, 0x0000 }, { 6995, 0x0000 }, { 6995, 0x0030 }, { 6997, 0xffa8 }, { 7008, 0xb4f7 }, { 7019, 0xadf3 }, { 7030, 0x03ff }, { 7040, 0x0120 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, /* 0x9a00 */ { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0xf000 }, { 7046, 0xfffb }, { 7061, 0x9df7 }, { 7073, 0xfdcf }, { 7086, 0x01bf }, { 7094, 0x15c3 }, { 7101, 0x1827 }, { 7107, 0x810a }, { 7111, 0xa842 }, { 7116, 0x0a00 }, /* 0x9b00 */ { 7118, 0x8108 }, { 7121, 0x8008 }, { 7123, 0x8008 }, { 7125, 0x1804 }, { 7128, 0xa3be }, { 7138, 0x0012 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, /* 0x9c00 */ { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x9000 }, { 7142, 0x69e6 }, { 7151, 0xdc37 }, { 7161, 0x6bff }, { 7174, 0x3dff }, { 7187, 0xfcf8 }, { 7198, 0xf3f9 }, { 7210, 0x0004 }, }; static const Summary16 gb2312_uni2indx_page9e[27] = { /* 0x9e00 */ { 7211, 0x0000 }, { 7211, 0x8000 }, { 7212, 0xbf6f }, { 7225, 0xe7ee }, { 7237, 0xdffe }, { 7251, 0x5da2 }, { 7259, 0x3fd8 }, { 7269, 0xc00b }, { 7274, 0x0984 }, { 7278, 0xa00c }, { 7282, 0x0040 }, { 7283, 0x6910 }, { 7288, 0xe210 }, { 7293, 0xb912 }, { 7300, 0x86a5 }, { 7307, 0x5a00 }, /* 0x9f00 */ { 7311, 0x6800 }, { 7314, 0x0289 }, { 7318, 0x9005 }, { 7322, 0x6a80 }, { 7327, 0x0010 }, { 7328, 0x0003 }, { 7330, 0x0000 }, { 7330, 0x8000 }, { 7331, 0x1ff9 }, { 7342, 0x8e00 }, { 7346, 0x0001 }, }; static const Summary16 gb2312_uni2indx_pageff[15] = { /* 0xff00 */ { 7347, 0xfffe }, { 7362, 0xffff }, { 7378, 0xffff }, { 7394, 0xffff }, { 7410, 0xffff }, { 7426, 0x7fff }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x002b }, }; static int gb2312_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc >= 0x0000 && wc < 0x0460) summary = &gb2312_uni2indx_page00[(wc>>4)]; else if (wc >= 0x2000 && wc < 0x2650) summary = &gb2312_uni2indx_page20[(wc>>4)-0x200]; else if (wc >= 0x3000 && wc < 0x3230) summary = &gb2312_uni2indx_page30[(wc>>4)-0x300]; else if (wc >= 0x4e00 && wc < 0x9cf0) summary = &gb2312_uni2indx_page4e[(wc>>4)-0x4e0]; else if (wc >= 0x9e00 && wc < 0x9fb0) summary = &gb2312_uni2indx_page9e[(wc>>4)-0x9e0]; else if (wc >= 0xff00 && wc < 0xfff0) summary = &gb2312_uni2indx_pageff[(wc>>4)-0xff0]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' 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); c = gb2312_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/gbk.h000066400000000000000000000112141252300335000236400ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2005, 2008 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GBK */ /* * GBK, as described in Ken Lunde's book, is an extension of GB 2312-1980 * (shifted by adding 0x8080 to the range 0xA1A1..0xFEFE, as used in EUC-CN). * It adds the following ranges: * * (part of GBK/1) 0xA2A1-0xA2AA Small Roman numerals * GBK/3 0x{81-A0}{40-7E,80-FE} 6080 new characters, all in Unicode * GBK/4 0x{AA-FE}{40-7E,80-A0} 8160 new characters, 8080 in Unicode * GBK/5 0x{A8-A9}{40-7E,80-A0} 166 new characters, 153 in Unicode * * Furthermore, all four tables I have looked at * - the CP936 table by Microsoft, found on ftp.unicode.org in 1999, * - the GBK table by Sun, investigated on a Solaris 2.7 machine, * - the GBK tables by CWEX, found in the Big5+ package, * - the GB18030 standard (second printing), * agree in the following extensions. (Ken Lunde must have overlooked these * differences between GB2312 and GBK. Also, the CWEX tables have additional * differences.) * * 1. Some characters in the GB2312 range are defined differently: * * code GB2312 GBK * 0xA1A4 0x30FB # KATAKANA MIDDLE DOT 0x00B7 # MIDDLE DOT * 0xA1AA 0x2015 # HORIZONTAL BAR 0x2014 # EM DASH * * 2. 19 characters added in the range 0xA6E0-0xA6F5. * * 3. 4 characters added in the range 0xA8BB-0xA8C0. * * CP936 as of 1999 was identical to GBK. However, since 1999, Microsoft has * added new mappings to CP936... */ #include "gbkext1.h" #include "gbkext2.h" #include "gbkext_inv.h" #include "cp936ext.h" static int gbk_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0x81 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); if (c >= 0xa1 && c <= 0xf7) { unsigned char c2 = s[1]; if (c == 0xa1) { if (c2 == 0xa4) { *pwc = 0x00b7; return 2; } if (c2 == 0xaa) { *pwc = 0x2014; return 2; } } if (c2 >= 0xa1 && c2 < 0xff) { unsigned char buf[2]; int ret; buf[0] = c-0x80; buf[1] = c2-0x80; ret = gb2312_mbtowc(conv,pwc,buf,2); if (ret != RET_ILSEQ) return ret; buf[0] = c; buf[1] = c2; ret = cp936ext_mbtowc(conv,pwc,buf,2); if (ret != RET_ILSEQ) return ret; } } if (c >= 0x81 && c <= 0xa0) return gbkext1_mbtowc(conv,pwc,s,2); if (c >= 0xa8 && c <= 0xfe) return gbkext2_mbtowc(conv,pwc,s,2); if (c == 0xa2) { unsigned char c2 = s[1]; if (c2 >= 0xa1 && c2 <= 0xaa) { *pwc = 0x2170+(c2-0xa1); return 2; } } } return RET_ILSEQ; } static int gbk_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; if (wc != 0x30fb && wc != 0x2015) { ret = gb2312_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]+0x80; r[1] = buf[1]+0x80; return 2; } } ret = gbkext_inv_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]; r[1] = buf[1]; return 2; } if (wc >= 0x2170 && wc <= 0x2179) { if (n < 2) return RET_TOOSMALL; r[0] = 0xa2; r[1] = 0xa1 + (wc-0x2170); return 2; } ret = cp936ext_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]; r[1] = buf[1]; return 2; } if (wc == 0x00b7) { if (n < 2) return RET_TOOSMALL; r[0] = 0xa1; r[1] = 0xa4; return 2; } if (wc == 0x2014) { if (n < 2) return RET_TOOSMALL; r[0] = 0xa1; r[1] = 0xaa; return 2; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/gbkext1.h000066400000000000000000001460361252300335000244550ustar00rootroot00000000000000/* * Copyright (C) 1999-2000 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GBK/3 extensions */ static const unsigned short gbkext1_2uni_page81[6080] = { /* 0x81 */ 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, 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, /* 0x82 */ 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, 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, /* 0x83 */ 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, 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, /* 0x84 */ 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, 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, /* 0x85 */ 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, 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, /* 0x86 */ 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, 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, /* 0x87 */ 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, 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, /* 0x88 */ 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, 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, /* 0x89 */ 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, 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, /* 0x8a */ 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, 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, /* 0x8b */ 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, 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, /* 0x8c */ 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, 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, /* 0x8d */ 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, 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, /* 0x8e */ 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, 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, /* 0x8f */ 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, 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, /* 0x90 */ 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, 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, /* 0x91 */ 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, 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, /* 0x92 */ 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, 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, /* 0x93 */ 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, 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, /* 0x94 */ 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, 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, /* 0x95 */ 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, 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, /* 0x96 */ 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, 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, /* 0x97 */ 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, 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, /* 0x98 */ 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, 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, /* 0x99 */ 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, 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, /* 0x9a */ 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, 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, /* 0x9b */ 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, 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, /* 0x9c */ 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, 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, /* 0x9d */ 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, 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, /* 0x9e */ 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, 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, /* 0x9f */ 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, 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, /* 0xa0 */ 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, 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, }; static int gbkext1_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x81 && c1 <= 0xa0)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xff)) { unsigned int i = 190 * (c1 - 0x81) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); unsigned short wc = 0xfffd; { if (i < 6080) wc = gbkext1_2uni_page81[i]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } freelan-2.0/third-party/source/libiconv-msvc/include/gbkext2.h000066400000000000000000002126141252300335000244520ustar00rootroot00000000000000/* * Copyright (C) 1999-2000 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GBK/4 and GBK/5 extensions */ static const unsigned short gbkext2_2uni_pagea8[8272] = { /* 0xa8 */ 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, 0x2588, 0x2589, 0x258a, 0x258b, 0x258c, 0x258d, 0x258e, 0x258f, 0x2593, 0x2594, 0x2595, 0x25bc, 0x25bd, 0x25e2, 0x25e3, 0x25e4, 0x25e5, 0x2609, 0x2295, 0x3012, 0x301d, 0x301e, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xa9 */ 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, 0x3029, 0x32a3, 0x338e, 0x338f, 0x339c, 0x339d, 0x339e, 0x33a1, 0x33c4, 0x33ce, 0x33d1, 0x33d2, 0x33d5, 0xfe30, 0xffe2, 0xffe4, 0xfffd, 0x2121, 0x3231, 0xfffd, 0x2010, 0xfffd, 0xfffd, 0xfffd, 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, 0xfe62, 0xfe63, 0xfe64, 0xfe65, 0xfe66, 0xfe68, 0xfe69, 0xfe6a, 0xfe6b, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x3007, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xaa */ 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, 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, /* 0xab */ 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, 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, /* 0xac */ 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, 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, /* 0xad */ 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, 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, /* 0xae */ 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, 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, /* 0xaf */ 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, 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, /* 0xb0 */ 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, 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, /* 0xb1 */ 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, 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, /* 0xb2 */ 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, 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, /* 0xb3 */ 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, 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, /* 0xb4 */ 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, 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, /* 0xb5 */ 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, 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, /* 0xb6 */ 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, 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, /* 0xb7 */ 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, 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, /* 0xb8 */ 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, 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, /* 0xb9 */ 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, 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, /* 0xba */ 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, 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, /* 0xbb */ 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, 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, /* 0xbc */ 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, 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, /* 0xbd */ 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, 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, /* 0xbe */ 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, 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, /* 0xbf */ 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, 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, /* 0xc0 */ 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, 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, /* 0xc1 */ 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, 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, /* 0xc2 */ 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, 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, /* 0xc3 */ 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, 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, /* 0xc4 */ 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, 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, /* 0xc5 */ 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, 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, /* 0xc6 */ 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, 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, /* 0xc7 */ 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, 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, /* 0xc8 */ 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, 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, /* 0xc9 */ 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, 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, /* 0xca */ 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, 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, /* 0xcb */ 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, 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, /* 0xcc */ 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, 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, /* 0xcd */ 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, 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, /* 0xce */ 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, 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, /* 0xcf */ 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, 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, /* 0xd0 */ 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, 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, /* 0xd1 */ 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, 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, /* 0xd2 */ 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, 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, /* 0xd3 */ 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, 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, /* 0xd4 */ 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, 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, /* 0xd5 */ 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, 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, /* 0xd6 */ 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, 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, /* 0xd7 */ 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, 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, /* 0xd8 */ 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, 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, /* 0xd9 */ 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, 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, /* 0xda */ 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, 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, /* 0xdb */ 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, 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, /* 0xdc */ 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, 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, /* 0xdd */ 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, 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, /* 0xde */ 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, 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, /* 0xdf */ 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, 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, /* 0xe0 */ 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, 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, /* 0xe1 */ 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, 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, /* 0xe2 */ 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, 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, /* 0xe3 */ 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, 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, /* 0xe4 */ 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, 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, /* 0xe5 */ 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, 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, /* 0xe6 */ 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, 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, /* 0xe7 */ 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, 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, /* 0xe8 */ 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, 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, /* 0xe9 */ 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, 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, /* 0xea */ 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, 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, /* 0xeb */ 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, 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, /* 0xec */ 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, 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, /* 0xed */ 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, 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, /* 0xee */ 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, 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, /* 0xef */ 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, 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, /* 0xf0 */ 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, 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, /* 0xf1 */ 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, 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, /* 0xf2 */ 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, 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, /* 0xf3 */ 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, 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, /* 0xf4 */ 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, 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, /* 0xf5 */ 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, 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, /* 0xf6 */ 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, 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, /* 0xf7 */ 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, 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, /* 0xf8 */ 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, 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, /* 0xf9 */ 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, 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, /* 0xfa */ 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, 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, /* 0xfb */ 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, 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, /* 0xfc */ 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, 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, /* 0xfd */ 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, 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, /* 0xfe */ 0xfa0c, 0xfa0d, 0xfa0e, 0xfa0f, 0xfa11, 0xfa13, 0xfa14, 0xfa18, 0xfa1f, 0xfa20, 0xfa21, 0xfa23, 0xfa24, 0xfa27, 0xfa28, 0xfa29, }; static int gbkext2_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0xa8 && c1 <= 0xfe)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xa1)) { unsigned int i = 96 * (c1 - 0x81) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); unsigned short wc = 0xfffd; { if (i < 12016) wc = gbkext2_2uni_pagea8[i-3744]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } freelan-2.0/third-party/source/libiconv-msvc/include/gbkext_inv.h000066400000000000000000004456711252300335000252570ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GBK extensions */ static const unsigned short gbkext_inv_2charset[14313] = { 0xa840, 0xa841, 0xa842, 0xa95c, 0xa843, 0xa844, 0xa845, 0xa846, 0xa847, 0xa848, 0xa959, 0xa849, 0xa84a, 0xa84b, 0xa84c, 0xa84d, 0xa84e, 0xa84f, 0xa850, 0xa851, 0xa852, 0xa892, 0xa853, 0xa854, 0xa855, 0xa856, 0xa857, 0xa858, 0xa859, 0xa85a, 0xa85b, 0xa85c, 0xa85d, 0xa85e, 0xa85f, 0xa860, 0xa861, 0xa862, 0xa863, 0xa864, 0xa865, 0xa866, 0xa867, 0xa868, 0xa869, 0xa86a, 0xa86b, 0xa86c, 0xa86d, 0xa86e, 0xa86f, 0xa870, 0xa871, 0xa872, 0xa873, 0xa874, 0xa875, 0xa876, 0xa877, 0xa878, 0xa879, 0xa87a, 0xa87b, 0xa87c, 0xa87d, 0xa87e, 0xa880, 0xa881, 0xa882, 0xa883, 0xa884, 0xa885, 0xa886, 0xa887, 0xa888, 0xa889, 0xa88a, 0xa88b, 0xa88c, 0xa88d, 0xa88e, 0xa88f, 0xa890, 0xa891, 0xa965, 0xa996, 0xa893, 0xa894, 0xa895, 0xa940, 0xa941, 0xa942, 0xa943, 0xa944, 0xa945, 0xa946, 0xa947, 0xa948, 0xa961, 0xa962, 0xa966, 0xa967, 0xa960, 0xa963, 0xa964, 0xa95a, 0xa949, 0xa94a, 0xa94b, 0xa94c, 0xa94d, 0xa94e, 0xa94f, 0xa950, 0xa951, 0xa952, 0xa953, 0xa954, 0x8140, 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, 0x8146, 0x8147, 0x8148, 0x8149, 0x814a, 0x814b, 0x814c, 0x814d, 0x814e, 0x814f, 0x8150, 0x8151, 0x8152, 0x8153, 0x8154, 0x8155, 0x8156, 0x8157, 0x8158, 0x8159, 0x815a, 0x815b, 0x815c, 0x815d, 0x815e, 0x815f, 0x8160, 0x8161, 0x8162, 0x8163, 0x8164, 0x8165, 0x8166, 0x8167, 0x8168, 0x8169, 0x816a, 0x816b, 0x816c, 0x816d, 0x816e, 0x816f, 0x8170, 0x8171, 0x8172, 0x8173, 0x8174, 0x8175, 0x8176, 0x8177, 0x8178, 0x8179, 0x817a, 0x817b, 0x817c, 0x817d, 0x817e, 0x8180, 0x8181, 0x8182, 0x8183, 0x8184, 0x8185, 0x8186, 0x8187, 0x8188, 0x8189, 0x818a, 0x818b, 0x818c, 0x818d, 0x818e, 0x818f, 0x8190, 0x8191, 0x8192, 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, 0x8198, 0x8199, 0x819a, 0x819b, 0x819c, 0x819d, 0x819e, 0x819f, 0x81a0, 0x81a1, 0x81a2, 0x81a3, 0x81a4, 0x81a5, 0x81a6, 0x81a7, 0x81a8, 0x81a9, 0x81aa, 0x81ab, 0x81ac, 0x81ad, 0x81ae, 0x81af, 0x81b0, 0x81b1, 0x81b2, 0x81b3, 0x81b4, 0x81b5, 0x81b6, 0x81b7, 0x81b8, 0x81b9, 0x81ba, 0x81bb, 0x81bc, 0x81bd, 0x81be, 0x81bf, 0x81c0, 0x81c1, 0x81c2, 0x81c3, 0x81c4, 0x81c5, 0x81c6, 0x81c7, 0x81c8, 0x81c9, 0x81ca, 0x81cb, 0x81cc, 0x81cd, 0x81ce, 0x81cf, 0x81d0, 0x81d1, 0x81d2, 0x81d3, 0x81d4, 0x81d5, 0x81d6, 0x81d7, 0x81d8, 0x81d9, 0x81da, 0x81db, 0x81dc, 0x81dd, 0x81de, 0x81df, 0x81e0, 0x81e1, 0x81e2, 0x81e3, 0x81e4, 0x81e5, 0x81e6, 0x81e7, 0x81e8, 0x81e9, 0x81ea, 0x81eb, 0x81ec, 0x81ed, 0x81ee, 0x81ef, 0x81f0, 0x81f1, 0x81f2, 0x81f3, 0x81f4, 0x81f5, 0x81f6, 0x81f7, 0x81f8, 0x81f9, 0x81fa, 0x81fb, 0x81fc, 0x81fd, 0x81fe, 0x8240, 0x8241, 0x8242, 0x8243, 0x8244, 0x8245, 0x8246, 0x8247, 0x8248, 0x8249, 0x824a, 0x824b, 0x824c, 0x824d, 0x824e, 0x824f, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256, 0x8257, 0x8258, 0x8259, 0x825a, 0x825b, 0x825c, 0x825d, 0x825e, 0x825f, 0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266, 0x8267, 0x8268, 0x8269, 0x826a, 0x826b, 0x826c, 0x826d, 0x826e, 0x826f, 0x8270, 0x8271, 0x8272, 0x8273, 0x8274, 0x8275, 0x8276, 0x8277, 0x8278, 0x8279, 0x827a, 0x827b, 0x827c, 0x827d, 0x827e, 0x8280, 0x8281, 0x8282, 0x8283, 0x8284, 0x8285, 0x8286, 0x8287, 0x8288, 0x8289, 0x828a, 0x828b, 0x828c, 0x828d, 0x828e, 0x828f, 0x8290, 0x8291, 0x8292, 0x8293, 0x8294, 0x8295, 0x8296, 0x8297, 0x8298, 0x8299, 0x829a, 0x829b, 0x829c, 0x829d, 0x829e, 0x829f, 0x82a0, 0x82a1, 0x82a2, 0x82a3, 0x82a4, 0x82a5, 0x82a6, 0x82a7, 0x82a8, 0x82a9, 0x82aa, 0x82ab, 0x82ac, 0x82ad, 0x82ae, 0x82af, 0x82b0, 0x82b1, 0x82b2, 0x82b3, 0x82b4, 0x82b5, 0x82b6, 0x82b7, 0x82b8, 0x82b9, 0x82ba, 0x82bb, 0x82bc, 0x82bd, 0x82be, 0x82bf, 0x82c0, 0x82c1, 0x82c2, 0x82c3, 0x82c4, 0x82c5, 0x82c6, 0x82c7, 0x82c8, 0x82c9, 0x82ca, 0x82cb, 0x82cc, 0x82cd, 0x82ce, 0x82cf, 0x82d0, 0x82d1, 0x82d2, 0x82d3, 0x82d4, 0x82d5, 0x82d6, 0x82d7, 0x82d8, 0x82d9, 0x82da, 0x82db, 0x82dc, 0x82dd, 0x82de, 0x82df, 0x82e0, 0x82e1, 0x82e2, 0x82e3, 0x82e4, 0x82e5, 0x82e6, 0x82e7, 0x82e8, 0x82e9, 0x82ea, 0x82eb, 0x82ec, 0x82ed, 0x82ee, 0x82ef, 0x82f0, 0x82f1, 0x82f2, 0x82f3, 0x82f4, 0x82f5, 0x82f6, 0x82f7, 0x82f8, 0x82f9, 0x82fa, 0x82fb, 0x82fc, 0x82fd, 0x82fe, 0x8340, 0x8341, 0x8342, 0x8343, 0x8344, 0x8345, 0x8346, 0x8347, 0x8348, 0x8349, 0x834a, 0x834b, 0x834c, 0x834d, 0x834e, 0x834f, 0x8350, 0x8351, 0x8352, 0x8353, 0x8354, 0x8355, 0x8356, 0x8357, 0x8358, 0x8359, 0x835a, 0x835b, 0x835c, 0x835d, 0x835e, 0x835f, 0x8360, 0x8361, 0x8362, 0x8363, 0x8364, 0x8365, 0x8366, 0x8367, 0x8368, 0x8369, 0x836a, 0x836b, 0x836c, 0x836d, 0x836e, 0x836f, 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, 0x8376, 0x8377, 0x8378, 0x8379, 0x837a, 0x837b, 0x837c, 0x837d, 0x837e, 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, 0x8385, 0x8386, 0x8387, 0x8388, 0x8389, 0x838a, 0x838b, 0x838c, 0x838d, 0x838e, 0x838f, 0x8390, 0x8391, 0x8392, 0x8393, 0x8394, 0x8395, 0x8396, 0x8397, 0x8398, 0x8399, 0x839a, 0x839b, 0x839c, 0x839d, 0x839e, 0x839f, 0x83a0, 0x83a1, 0x83a2, 0x83a3, 0x83a4, 0x83a5, 0x83a6, 0x83a7, 0x83a8, 0x83a9, 0x83aa, 0x83ab, 0x83ac, 0x83ad, 0x83ae, 0x83af, 0x83b0, 0x83b1, 0x83b2, 0x83b3, 0x83b4, 0x83b5, 0x83b6, 0x83b7, 0x83b8, 0x83b9, 0x83ba, 0x83bb, 0x83bc, 0x83bd, 0x83be, 0x83bf, 0x83c0, 0x83c1, 0x83c2, 0x83c3, 0x83c4, 0x83c5, 0x83c6, 0x83c7, 0x83c8, 0x83c9, 0x83ca, 0x83cb, 0x83cc, 0x83cd, 0x83ce, 0x83cf, 0x83d0, 0x83d1, 0x83d2, 0x83d3, 0x83d4, 0x83d5, 0x83d6, 0x83d7, 0x83d8, 0x83d9, 0x83da, 0x83db, 0x83dc, 0x83dd, 0x83de, 0x83df, 0x83e0, 0x83e1, 0x83e2, 0x83e3, 0x83e4, 0x83e5, 0x83e6, 0x83e7, 0x83e8, 0x83e9, 0x83ea, 0x83eb, 0x83ec, 0x83ed, 0x83ee, 0x83ef, 0x83f0, 0x83f1, 0x83f2, 0x83f3, 0x83f4, 0x83f5, 0x83f6, 0x83f7, 0x83f8, 0x83f9, 0x83fa, 0x83fb, 0x83fc, 0x83fd, 0x83fe, 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8446, 0x8447, 0x8448, 0x8449, 0x844a, 0x844b, 0x844c, 0x844d, 0x844e, 0x844f, 0x8450, 0x8451, 0x8452, 0x8453, 0x8454, 0x8455, 0x8456, 0x8457, 0x8458, 0x8459, 0x845a, 0x845b, 0x845c, 0x845d, 0x845e, 0x845f, 0x8460, 0x8461, 0x8462, 0x8463, 0x8464, 0x8465, 0x8466, 0x8467, 0x8468, 0x8469, 0x846a, 0x846b, 0x846c, 0x846d, 0x846e, 0x846f, 0x8470, 0x8471, 0x8472, 0x8473, 0x8474, 0x8475, 0x8476, 0x8477, 0x8478, 0x8479, 0x847a, 0x847b, 0x847c, 0x847d, 0x847e, 0x8480, 0x8481, 0x8482, 0x8483, 0x8484, 0x8485, 0x8486, 0x8487, 0x8488, 0x8489, 0x848a, 0x848b, 0x848c, 0x848d, 0x848e, 0x848f, 0x8490, 0x8491, 0x8492, 0x8493, 0x8494, 0x8495, 0x8496, 0x8497, 0x8498, 0x8499, 0x849a, 0x849b, 0x849c, 0x849d, 0x849e, 0x849f, 0x84a0, 0x84a1, 0x84a2, 0x84a3, 0x84a4, 0x84a5, 0x84a6, 0x84a7, 0x84a8, 0x84a9, 0x84aa, 0x84ab, 0x84ac, 0x84ad, 0x84ae, 0x84af, 0x84b0, 0x84b1, 0x84b2, 0x84b3, 0x84b4, 0x84b5, 0x84b6, 0x84b7, 0x84b8, 0x84b9, 0x84ba, 0x84bb, 0x84bc, 0x84bd, 0x84be, 0x84bf, 0x84c0, 0x84c1, 0x84c2, 0x84c3, 0x84c4, 0x84c5, 0x84c6, 0x84c7, 0x84c8, 0x84c9, 0x84ca, 0x84cb, 0x84cc, 0x84cd, 0x84ce, 0x84cf, 0x84d0, 0x84d1, 0x84d2, 0x84d3, 0x84d4, 0x84d5, 0x84d6, 0x84d7, 0x84d8, 0x84d9, 0x84da, 0x84db, 0x84dc, 0x84dd, 0x84de, 0x84df, 0x84e0, 0x84e1, 0x84e2, 0x84e3, 0x84e4, 0x84e5, 0x84e6, 0x84e7, 0x84e8, 0x84e9, 0x84ea, 0x84eb, 0x84ec, 0x84ed, 0x84ee, 0x84ef, 0x84f0, 0x84f1, 0x84f2, 0x84f3, 0x84f4, 0x84f5, 0x84f6, 0x84f7, 0x84f8, 0x84f9, 0x84fa, 0x84fb, 0x84fc, 0x84fd, 0x84fe, 0x8540, 0x8541, 0x8542, 0x8543, 0x8544, 0x8545, 0x8546, 0x8547, 0x8548, 0x8549, 0x854a, 0x854b, 0x854c, 0x854d, 0x854e, 0x854f, 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0x8556, 0x8557, 0x8558, 0x8559, 0x855a, 0x855b, 0x855c, 0x855d, 0x855e, 0x855f, 0x8560, 0x8561, 0x8562, 0x8563, 0x8564, 0x8565, 0x8566, 0x8567, 0x8568, 0x8569, 0x856a, 0x856b, 0x856c, 0x856d, 0x856e, 0x856f, 0x8570, 0x8571, 0x8572, 0x8573, 0x8574, 0x8575, 0x8576, 0x8577, 0x8578, 0x8579, 0x857a, 0x857b, 0x857c, 0x857d, 0x857e, 0x8580, 0x8581, 0x8582, 0x8583, 0x8584, 0x8585, 0x8586, 0x8587, 0x8588, 0x8589, 0x858a, 0x858b, 0x858c, 0x858d, 0x858e, 0x858f, 0x8590, 0x8591, 0x8592, 0x8593, 0x8594, 0x8595, 0x8596, 0x8597, 0x8598, 0x8599, 0x859a, 0x859b, 0x859c, 0x859d, 0x859e, 0x859f, 0x85a0, 0x85a1, 0x85a2, 0x85a3, 0x85a4, 0x85a5, 0x85a6, 0x85a7, 0x85a8, 0x85a9, 0x85aa, 0x85ab, 0x85ac, 0x85ad, 0x85ae, 0x85af, 0x85b0, 0x85b1, 0x85b2, 0x85b3, 0x85b4, 0x85b5, 0x85b6, 0x85b7, 0x85b8, 0x85b9, 0x85ba, 0x85bb, 0x85bc, 0x85bd, 0x85be, 0x85bf, 0x85c0, 0x85c1, 0x85c2, 0x85c3, 0x85c4, 0x85c5, 0x85c6, 0x85c7, 0x85c8, 0x85c9, 0x85ca, 0x85cb, 0x85cc, 0x85cd, 0x85ce, 0x85cf, 0x85d0, 0x85d1, 0x85d2, 0x85d3, 0x85d4, 0x85d5, 0x85d6, 0x85d7, 0x85d8, 0x85d9, 0x85da, 0x85db, 0x85dc, 0x85dd, 0x85de, 0x85df, 0x85e0, 0x85e1, 0x85e2, 0x85e3, 0x85e4, 0x85e5, 0x85e6, 0x85e7, 0x85e8, 0x85e9, 0x85ea, 0x85eb, 0x85ec, 0x85ed, 0x85ee, 0x85ef, 0x85f0, 0x85f1, 0x85f2, 0x85f3, 0x85f4, 0x85f5, 0x85f6, 0x85f7, 0x85f8, 0x85f9, 0x85fa, 0x85fb, 0x85fc, 0x85fd, 0x85fe, 0x8640, 0x8641, 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, 0x8648, 0x8649, 0x864a, 0x864b, 0x864c, 0x864d, 0x864e, 0x864f, 0x8650, 0x8651, 0x8652, 0x8653, 0x8654, 0x8655, 0x8656, 0x8657, 0x8658, 0x8659, 0x865a, 0x865b, 0x865c, 0x865d, 0x865e, 0x865f, 0x8660, 0x8661, 0x8662, 0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669, 0x866a, 0x866b, 0x866c, 0x866d, 0x866e, 0x866f, 0x8670, 0x8671, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, 0x8677, 0x8678, 0x8679, 0x867a, 0x867b, 0x867c, 0x867d, 0x867e, 0x8680, 0x8681, 0x8682, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688, 0x8689, 0x868a, 0x868b, 0x868c, 0x868d, 0x868e, 0x868f, 0x8690, 0x8691, 0x8692, 0x8693, 0x8694, 0x8695, 0x8696, 0x8697, 0x8698, 0x8699, 0x869a, 0x869b, 0x869c, 0x869d, 0x869e, 0x869f, 0x86a0, 0x86a1, 0x86a2, 0x86a3, 0x86a4, 0x86a5, 0x86a6, 0x86a7, 0x86a8, 0x86a9, 0x86aa, 0x86ab, 0x86ac, 0x86ad, 0x86ae, 0x86af, 0x86b0, 0x86b1, 0x86b2, 0x86b3, 0x86b4, 0x86b5, 0x86b6, 0x86b7, 0x86b8, 0x86b9, 0x86ba, 0x86bb, 0x86bc, 0x86bd, 0x86be, 0x86bf, 0x86c0, 0x86c1, 0x86c2, 0x86c3, 0x86c4, 0x86c5, 0x86c6, 0x86c7, 0x86c8, 0x86c9, 0x86ca, 0x86cb, 0x86cc, 0x86cd, 0x86ce, 0x86cf, 0x86d0, 0x86d1, 0x86d2, 0x86d3, 0x86d4, 0x86d5, 0x86d6, 0x86d7, 0x86d8, 0x86d9, 0x86da, 0x86db, 0x86dc, 0x86dd, 0x86de, 0x86df, 0x86e0, 0x86e1, 0x86e2, 0x86e3, 0x86e4, 0x86e5, 0x86e6, 0x86e7, 0x86e8, 0x86e9, 0x86ea, 0x86eb, 0x86ec, 0x86ed, 0x86ee, 0x86ef, 0x86f0, 0x86f1, 0x86f2, 0x86f3, 0x86f4, 0x86f5, 0x86f6, 0x86f7, 0x86f8, 0x86f9, 0x86fa, 0x86fb, 0x86fc, 0x86fd, 0x86fe, 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x8747, 0x8748, 0x8749, 0x874a, 0x874b, 0x874c, 0x874d, 0x874e, 0x874f, 0x8750, 0x8751, 0x8752, 0x8753, 0x8754, 0x8755, 0x8756, 0x8757, 0x8758, 0x8759, 0x875a, 0x875b, 0x875c, 0x875d, 0x875e, 0x875f, 0x8760, 0x8761, 0x8762, 0x8763, 0x8764, 0x8765, 0x8766, 0x8767, 0x8768, 0x8769, 0x876a, 0x876b, 0x876c, 0x876d, 0x876e, 0x876f, 0x8770, 0x8771, 0x8772, 0x8773, 0x8774, 0x8775, 0x8776, 0x8777, 0x8778, 0x8779, 0x877a, 0x877b, 0x877c, 0x877d, 0x877e, 0x8780, 0x8781, 0x8782, 0x8783, 0x8784, 0x8785, 0x8786, 0x8787, 0x8788, 0x8789, 0x878a, 0x878b, 0x878c, 0x878d, 0x878e, 0x878f, 0x8790, 0x8791, 0x8792, 0x8793, 0x8794, 0x8795, 0x8796, 0x8797, 0x8798, 0x8799, 0x879a, 0x879b, 0x879c, 0x879d, 0x879e, 0x879f, 0x87a0, 0x87a1, 0x87a2, 0x87a3, 0x87a4, 0x87a5, 0x87a6, 0x87a7, 0x87a8, 0x87a9, 0x87aa, 0x87ab, 0x87ac, 0x87ad, 0x87ae, 0x87af, 0x87b0, 0x87b1, 0x87b2, 0x87b3, 0x87b4, 0x87b5, 0x87b6, 0x87b7, 0x87b8, 0x87b9, 0x87ba, 0x87bb, 0x87bc, 0x87bd, 0x87be, 0x87bf, 0x87c0, 0x87c1, 0x87c2, 0x87c3, 0x87c4, 0x87c5, 0x87c6, 0x87c7, 0x87c8, 0x87c9, 0x87ca, 0x87cb, 0x87cc, 0x87cd, 0x87ce, 0x87cf, 0x87d0, 0x87d1, 0x87d2, 0x87d3, 0x87d4, 0x87d5, 0x87d6, 0x87d7, 0x87d8, 0x87d9, 0x87da, 0x87db, 0x87dc, 0x87dd, 0x87de, 0x87df, 0x87e0, 0x87e1, 0x87e2, 0x87e3, 0x87e4, 0x87e5, 0x87e6, 0x87e7, 0x87e8, 0x87e9, 0x87ea, 0x87eb, 0x87ec, 0x87ed, 0x87ee, 0x87ef, 0x87f0, 0x87f1, 0x87f2, 0x87f3, 0x87f4, 0x87f5, 0x87f6, 0x87f7, 0x87f8, 0x87f9, 0x87fa, 0x87fb, 0x87fc, 0x87fd, 0x87fe, 0x8840, 0x8841, 0x8842, 0x8843, 0x8844, 0x8845, 0x8846, 0x8847, 0x8848, 0x8849, 0x884a, 0x884b, 0x884c, 0x884d, 0x884e, 0x884f, 0x8850, 0x8851, 0x8852, 0x8853, 0x8854, 0x8855, 0x8856, 0x8857, 0x8858, 0x8859, 0x885a, 0x885b, 0x885c, 0x885d, 0x885e, 0x885f, 0x8860, 0x8861, 0x8862, 0x8863, 0x8864, 0x8865, 0x8866, 0x8867, 0x8868, 0x8869, 0x886a, 0x886b, 0x886c, 0x886d, 0x886e, 0x886f, 0x8870, 0x8871, 0x8872, 0x8873, 0x8874, 0x8875, 0x8876, 0x8877, 0x8878, 0x8879, 0x887a, 0x887b, 0x887c, 0x887d, 0x887e, 0x8880, 0x8881, 0x8882, 0x8883, 0x8884, 0x8885, 0x8886, 0x8887, 0x8888, 0x8889, 0x888a, 0x888b, 0x888c, 0x888d, 0x888e, 0x888f, 0x8890, 0x8891, 0x8892, 0x8893, 0x8894, 0x8895, 0x8896, 0x8897, 0x8898, 0x8899, 0x889a, 0x889b, 0x889c, 0x889d, 0x889e, 0x889f, 0x88a0, 0x88a1, 0x88a2, 0x88a3, 0x88a4, 0x88a5, 0x88a6, 0x88a7, 0x88a8, 0x88a9, 0x88aa, 0x88ab, 0x88ac, 0x88ad, 0x88ae, 0x88af, 0x88b0, 0x88b1, 0x88b2, 0x88b3, 0x88b4, 0x88b5, 0x88b6, 0x88b7, 0x88b8, 0x88b9, 0x88ba, 0x88bb, 0x88bc, 0x88bd, 0x88be, 0x88bf, 0x88c0, 0x88c1, 0x88c2, 0x88c3, 0x88c4, 0x88c5, 0x88c6, 0x88c7, 0x88c8, 0x88c9, 0x88ca, 0x88cb, 0x88cc, 0x88cd, 0x88ce, 0x88cf, 0x88d0, 0x88d1, 0x88d2, 0x88d3, 0x88d4, 0x88d5, 0x88d6, 0x88d7, 0x88d8, 0x88d9, 0x88da, 0x88db, 0x88dc, 0x88dd, 0x88de, 0x88df, 0x88e0, 0x88e1, 0x88e2, 0x88e3, 0x88e4, 0x88e5, 0x88e6, 0x88e7, 0x88e8, 0x88e9, 0x88ea, 0x88eb, 0x88ec, 0x88ed, 0x88ee, 0x88ef, 0x88f0, 0x88f1, 0x88f2, 0x88f3, 0x88f4, 0x88f5, 0x88f6, 0x88f7, 0x88f8, 0x88f9, 0x88fa, 0x88fb, 0x88fc, 0x88fd, 0x88fe, 0x8940, 0x8941, 0x8942, 0x8943, 0x8944, 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, 0x895e, 0x895f, 0x8960, 0x8961, 0x8962, 0x8963, 0x8964, 0x8965, 0x8966, 0x8967, 0x8968, 0x8969, 0x896a, 0x896b, 0x896c, 0x896d, 0x896e, 0x896f, 0x8970, 0x8971, 0x8972, 0x8973, 0x8974, 0x8975, 0x8976, 0x8977, 0x8978, 0x8979, 0x897a, 0x897b, 0x897c, 0x897d, 0x897e, 0x8980, 0x8981, 0x8982, 0x8983, 0x8984, 0x8985, 0x8986, 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, 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, 0x89c1, 0x89c2, 0x89c3, 0x89c4, 0x89c5, 0x89c6, 0x89c7, 0x89c8, 0x89c9, 0x89ca, 0x89cb, 0x89cc, 0x89cd, 0x89ce, 0x89cf, 0x89d0, 0x89d1, 0x89d2, 0x89d3, 0x89d4, 0x89d5, 0x89d6, 0x89d7, 0x89d8, 0x89d9, 0x89da, 0x89db, 0x89dc, 0x89dd, 0x89de, 0x89df, 0x89e0, 0x89e1, 0x89e2, 0x89e3, 0x89e4, 0x89e5, 0x89e6, 0x89e7, 0x89e8, 0x89e9, 0x89ea, 0x89eb, 0x89ec, 0x89ed, 0x89ee, 0x89ef, 0x89f0, 0x89f1, 0x89f2, 0x89f3, 0x89f4, 0x89f5, 0x89f6, 0x89f7, 0x89f8, 0x89f9, 0x89fa, 0x89fb, 0x89fc, 0x89fd, 0x89fe, 0x8a40, 0x8a41, 0x8a42, 0x8a43, 0x8a44, 0x8a45, 0x8a46, 0x8a47, 0x8a48, 0x8a49, 0x8a4a, 0x8a4b, 0x8a4c, 0x8a4d, 0x8a4e, 0x8a4f, 0x8a50, 0x8a51, 0x8a52, 0x8a53, 0x8a54, 0x8a55, 0x8a56, 0x8a57, 0x8a58, 0x8a59, 0x8a5a, 0x8a5b, 0x8a5c, 0x8a5d, 0x8a5e, 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, 0x8a79, 0x8a7a, 0x8a7b, 0x8a7c, 0x8a7d, 0x8a7e, 0x8a80, 0x8a81, 0x8a82, 0x8a83, 0x8a84, 0x8a85, 0x8a86, 0x8a87, 0x8a88, 0x8a89, 0x8a8a, 0x8a8b, 0x8a8c, 0x8a8d, 0x8a8e, 0x8a8f, 0x8a90, 0x8a91, 0x8a92, 0x8a93, 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, 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, 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, 0x8b40, 0x8b41, 0x8b42, 0x8b43, 0x8b44, 0x8b45, 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, 0x8b66, 0x8b67, 0x8b68, 0x8b69, 0x8b6a, 0x8b6b, 0x8b6c, 0x8b6d, 0x8b6e, 0x8b6f, 0x8b70, 0x8b71, 0x8b72, 0x8b73, 0x8b74, 0x8b75, 0x8b76, 0x8b77, 0x8b78, 0x8b79, 0x8b7a, 0x8b7b, 0x8b7c, 0x8b7d, 0x8b7e, 0x8b80, 0x8b81, 0x8b82, 0x8b83, 0x8b84, 0x8b85, 0x8b86, 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, 0x8ba0, 0x8ba1, 0x8ba2, 0x8ba3, 0x8ba4, 0x8ba5, 0x8ba6, 0x8ba7, 0x8ba8, 0x8ba9, 0x8baa, 0x8bab, 0x8bac, 0x8bad, 0x8bae, 0x8baf, 0x8bb0, 0x8bb1, 0x8bb2, 0x8bb3, 0x8bb4, 0x8bb5, 0x8bb6, 0x8bb7, 0x8bb8, 0x8bb9, 0x8bba, 0x8bbb, 0x8bbc, 0x8bbd, 0x8bbe, 0x8bbf, 0x8bc0, 0x8bc1, 0x8bc2, 0x8bc3, 0x8bc4, 0x8bc5, 0x8bc6, 0x8bc7, 0x8bc8, 0x8bc9, 0x8bca, 0x8bcb, 0x8bcc, 0x8bcd, 0x8bce, 0x8bcf, 0x8bd0, 0x8bd1, 0x8bd2, 0x8bd3, 0x8bd4, 0x8bd5, 0x8bd6, 0x8bd7, 0x8bd8, 0x8bd9, 0x8bda, 0x8bdb, 0x8bdc, 0x8bdd, 0x8bde, 0x8bdf, 0x8be0, 0x8be1, 0x8be2, 0x8be3, 0x8be4, 0x8be5, 0x8be6, 0x8be7, 0x8be8, 0x8be9, 0x8bea, 0x8beb, 0x8bec, 0x8bed, 0x8bee, 0x8bef, 0x8bf0, 0x8bf1, 0x8bf2, 0x8bf3, 0x8bf4, 0x8bf5, 0x8bf6, 0x8bf7, 0x8bf8, 0x8bf9, 0x8bfa, 0x8bfb, 0x8bfc, 0x8bfd, 0x8bfe, 0x8c40, 0x8c41, 0x8c42, 0x8c43, 0x8c44, 0x8c45, 0x8c46, 0x8c47, 0x8c48, 0x8c49, 0x8c4a, 0x8c4b, 0x8c4c, 0x8c4d, 0x8c4e, 0x8c4f, 0x8c50, 0x8c51, 0x8c52, 0x8c53, 0x8c54, 0x8c55, 0x8c56, 0x8c57, 0x8c58, 0x8c59, 0x8c5a, 0x8c5b, 0x8c5c, 0x8c5d, 0x8c5e, 0x8c5f, 0x8c60, 0x8c61, 0x8c62, 0x8c63, 0x8c64, 0x8c65, 0x8c66, 0x8c67, 0x8c68, 0x8c69, 0x8c6a, 0x8c6b, 0x8c6c, 0x8c6d, 0x8c6e, 0x8c6f, 0x8c70, 0x8c71, 0x8c72, 0x8c73, 0x8c74, 0x8c75, 0x8c76, 0x8c77, 0x8c78, 0x8c79, 0x8c7a, 0x8c7b, 0x8c7c, 0x8c7d, 0x8c7e, 0x8c80, 0x8c81, 0x8c82, 0x8c83, 0x8c84, 0x8c85, 0x8c86, 0x8c87, 0x8c88, 0x8c89, 0x8c8a, 0x8c8b, 0x8c8c, 0x8c8d, 0x8c8e, 0x8c8f, 0x8c90, 0x8c91, 0x8c92, 0x8c93, 0x8c94, 0x8c95, 0x8c96, 0x8c97, 0x8c98, 0x8c99, 0x8c9a, 0x8c9b, 0x8c9c, 0x8c9d, 0x8c9e, 0x8c9f, 0x8ca0, 0x8ca1, 0x8ca2, 0x8ca3, 0x8ca4, 0x8ca5, 0x8ca6, 0x8ca7, 0x8ca8, 0x8ca9, 0x8caa, 0x8cab, 0x8cac, 0x8cad, 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, 0x8ced, 0x8cee, 0x8cef, 0x8cf0, 0x8cf1, 0x8cf2, 0x8cf3, 0x8cf4, 0x8cf5, 0x8cf6, 0x8cf7, 0x8cf8, 0x8cf9, 0x8cfa, 0x8cfb, 0x8cfc, 0x8cfd, 0x8cfe, 0x8d40, 0x8d41, 0x8d42, 0x8d43, 0x8d44, 0x8d45, 0x8d46, 0x8d47, 0x8d48, 0x8d49, 0x8d4a, 0x8d4b, 0x8d4c, 0x8d4d, 0x8d4e, 0x8d4f, 0x8d50, 0x8d51, 0x8d52, 0x8d53, 0x8d54, 0x8d55, 0x8d56, 0x8d57, 0x8d58, 0x8d59, 0x8d5a, 0x8d5b, 0x8d5c, 0x8d5d, 0x8d5e, 0x8d5f, 0x8d60, 0x8d61, 0x8d62, 0x8d63, 0x8d64, 0x8d65, 0x8d66, 0x8d67, 0x8d68, 0x8d69, 0x8d6a, 0x8d6b, 0x8d6c, 0x8d6d, 0x8d6e, 0x8d6f, 0x8d70, 0x8d71, 0x8d72, 0x8d73, 0x8d74, 0x8d75, 0x8d76, 0x8d77, 0x8d78, 0x8d79, 0x8d7a, 0x8d7b, 0x8d7c, 0x8d7d, 0x8d7e, 0x8d80, 0x8d81, 0x8d82, 0x8d83, 0x8d84, 0x8d85, 0x8d86, 0x8d87, 0x8d88, 0x8d89, 0x8d8a, 0x8d8b, 0x8d8c, 0x8d8d, 0x8d8e, 0x8d8f, 0x8d90, 0x8d91, 0x8d92, 0x8d93, 0x8d94, 0x8d95, 0x8d96, 0x8d97, 0x8d98, 0x8d99, 0x8d9a, 0x8d9b, 0x8d9c, 0x8d9d, 0x8d9e, 0x8d9f, 0x8da0, 0x8da1, 0x8da2, 0x8da3, 0x8da4, 0x8da5, 0x8da6, 0x8da7, 0x8da8, 0x8da9, 0x8daa, 0x8dab, 0x8dac, 0x8dad, 0x8dae, 0x8daf, 0x8db0, 0x8db1, 0x8db2, 0x8db3, 0x8db4, 0x8db5, 0x8db6, 0x8db7, 0x8db8, 0x8db9, 0x8dba, 0x8dbb, 0x8dbc, 0x8dbd, 0x8dbe, 0x8dbf, 0x8dc0, 0x8dc1, 0x8dc2, 0x8dc3, 0x8dc4, 0x8dc5, 0x8dc6, 0x8dc7, 0x8dc8, 0x8dc9, 0x8dca, 0x8dcb, 0x8dcc, 0x8dcd, 0x8dce, 0x8dcf, 0x8dd0, 0x8dd1, 0x8dd2, 0x8dd3, 0x8dd4, 0x8dd5, 0x8dd6, 0x8dd7, 0x8dd8, 0x8dd9, 0x8dda, 0x8ddb, 0x8ddc, 0x8ddd, 0x8dde, 0x8ddf, 0x8de0, 0x8de1, 0x8de2, 0x8de3, 0x8de4, 0x8de5, 0x8de6, 0x8de7, 0x8de8, 0x8de9, 0x8dea, 0x8deb, 0x8dec, 0x8ded, 0x8dee, 0x8def, 0x8df0, 0x8df1, 0x8df2, 0x8df3, 0x8df4, 0x8df5, 0x8df6, 0x8df7, 0x8df8, 0x8df9, 0x8dfa, 0x8dfb, 0x8dfc, 0x8dfd, 0x8dfe, 0x8e40, 0x8e41, 0x8e42, 0x8e43, 0x8e44, 0x8e45, 0x8e46, 0x8e47, 0x8e48, 0x8e49, 0x8e4a, 0x8e4b, 0x8e4c, 0x8e4d, 0x8e4e, 0x8e4f, 0x8e50, 0x8e51, 0x8e52, 0x8e53, 0x8e54, 0x8e55, 0x8e56, 0x8e57, 0x8e58, 0x8e59, 0x8e5a, 0x8e5b, 0x8e5c, 0x8e5d, 0x8e5e, 0x8e5f, 0x8e60, 0x8e61, 0x8e62, 0x8e63, 0x8e64, 0x8e65, 0x8e66, 0x8e67, 0x8e68, 0x8e69, 0x8e6a, 0x8e6b, 0x8e6c, 0x8e6d, 0x8e6e, 0x8e6f, 0x8e70, 0x8e71, 0x8e72, 0x8e73, 0x8e74, 0x8e75, 0x8e76, 0x8e77, 0x8e78, 0x8e79, 0x8e7a, 0x8e7b, 0x8e7c, 0x8e7d, 0x8e7e, 0x8e80, 0x8e81, 0x8e82, 0x8e83, 0x8e84, 0x8e85, 0x8e86, 0x8e87, 0x8e88, 0x8e89, 0x8e8a, 0x8e8b, 0x8e8c, 0x8e8d, 0x8e8e, 0x8e8f, 0x8e90, 0x8e91, 0x8e92, 0x8e93, 0x8e94, 0x8e95, 0x8e96, 0x8e97, 0x8e98, 0x8e99, 0x8e9a, 0x8e9b, 0x8e9c, 0x8e9d, 0x8e9e, 0x8e9f, 0x8ea0, 0x8ea1, 0x8ea2, 0x8ea3, 0x8ea4, 0x8ea5, 0x8ea6, 0x8ea7, 0x8ea8, 0x8ea9, 0x8eaa, 0x8eab, 0x8eac, 0x8ead, 0x8eae, 0x8eaf, 0x8eb0, 0x8eb1, 0x8eb2, 0x8eb3, 0x8eb4, 0x8eb5, 0x8eb6, 0x8eb7, 0x8eb8, 0x8eb9, 0x8eba, 0x8ebb, 0x8ebc, 0x8ebd, 0x8ebe, 0x8ebf, 0x8ec0, 0x8ec1, 0x8ec2, 0x8ec3, 0x8ec4, 0x8ec5, 0x8ec6, 0x8ec7, 0x8ec8, 0x8ec9, 0x8eca, 0x8ecb, 0x8ecc, 0x8ecd, 0x8ece, 0x8ecf, 0x8ed0, 0x8ed1, 0x8ed2, 0x8ed3, 0x8ed4, 0x8ed5, 0x8ed6, 0x8ed7, 0x8ed8, 0x8ed9, 0x8eda, 0x8edb, 0x8edc, 0x8edd, 0x8ede, 0x8edf, 0x8ee0, 0x8ee1, 0x8ee2, 0x8ee3, 0x8ee4, 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, 0x8f40, 0x8f41, 0x8f42, 0x8f43, 0x8f44, 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, 0x8f66, 0x8f67, 0x8f68, 0x8f69, 0x8f6a, 0x8f6b, 0x8f6c, 0x8f6d, 0x8f6e, 0x8f6f, 0x8f70, 0x8f71, 0x8f72, 0x8f73, 0x8f74, 0x8f75, 0x8f76, 0x8f77, 0x8f78, 0x8f79, 0x8f7a, 0x8f7b, 0x8f7c, 0x8f7d, 0x8f7e, 0x8f80, 0x8f81, 0x8f82, 0x8f83, 0x8f84, 0x8f85, 0x8f86, 0x8f87, 0x8f88, 0x8f89, 0x8f8a, 0x8f8b, 0x8f8c, 0x8f8d, 0x8f8e, 0x8f8f, 0x8f90, 0x8f91, 0x8f92, 0x8f93, 0x8f94, 0x8f95, 0x8f96, 0x8f97, 0x8f98, 0x8f99, 0x8f9a, 0x8f9b, 0x8f9c, 0x8f9d, 0x8f9e, 0x8f9f, 0x8fa0, 0x8fa1, 0x8fa2, 0x8fa3, 0x8fa4, 0x8fa5, 0x8fa6, 0x8fa7, 0x8fa8, 0x8fa9, 0x8faa, 0x8fab, 0x8fac, 0x8fad, 0x8fae, 0x8faf, 0x8fb0, 0x8fb1, 0x8fb2, 0x8fb3, 0x8fb4, 0x8fb5, 0x8fb6, 0x8fb7, 0x8fb8, 0x8fb9, 0x8fba, 0x8fbb, 0x8fbc, 0x8fbd, 0x8fbe, 0x8fbf, 0x8fc0, 0x8fc1, 0x8fc2, 0x8fc3, 0x8fc4, 0x8fc5, 0x8fc6, 0x8fc7, 0x8fc8, 0x8fc9, 0x8fca, 0x8fcb, 0x8fcc, 0x8fcd, 0x8fce, 0x8fcf, 0x8fd0, 0x8fd1, 0x8fd2, 0x8fd3, 0x8fd4, 0x8fd5, 0x8fd6, 0x8fd7, 0x8fd8, 0x8fd9, 0x8fda, 0x8fdb, 0x8fdc, 0x8fdd, 0x8fde, 0x8fdf, 0x8fe0, 0x8fe1, 0x8fe2, 0x8fe3, 0x8fe4, 0x8fe5, 0x8fe6, 0x8fe7, 0x8fe8, 0x8fe9, 0x8fea, 0x8feb, 0x8fec, 0x8fed, 0x8fee, 0x8fef, 0x8ff0, 0x8ff1, 0x8ff2, 0x8ff3, 0x8ff4, 0x8ff5, 0x8ff6, 0x8ff7, 0x8ff8, 0x8ff9, 0x8ffa, 0x8ffb, 0x8ffc, 0x8ffd, 0x8ffe, 0x9040, 0x9041, 0x9042, 0x9043, 0x9044, 0x9045, 0x9046, 0x9047, 0x9048, 0x9049, 0x904a, 0x904b, 0x904c, 0x904d, 0x904e, 0x904f, 0x9050, 0x9051, 0x9052, 0x9053, 0x9054, 0x9055, 0x9056, 0x9057, 0x9058, 0x9059, 0x905a, 0x905b, 0x905c, 0x905d, 0x905e, 0x905f, 0x9060, 0x9061, 0x9062, 0x9063, 0x9064, 0x9065, 0x9066, 0x9067, 0x9068, 0x9069, 0x906a, 0x906b, 0x906c, 0x906d, 0x906e, 0x906f, 0x9070, 0x9071, 0x9072, 0x9073, 0x9074, 0x9075, 0x9076, 0x9077, 0x9078, 0x9079, 0x907a, 0x907b, 0x907c, 0x907d, 0x907e, 0x9080, 0x9081, 0x9082, 0x9083, 0x9084, 0x9085, 0x9086, 0x9087, 0x9088, 0x9089, 0x908a, 0x908b, 0x908c, 0x908d, 0x908e, 0x908f, 0x9090, 0x9091, 0x9092, 0x9093, 0x9094, 0x9095, 0x9096, 0x9097, 0x9098, 0x9099, 0x909a, 0x909b, 0x909c, 0x909d, 0x909e, 0x909f, 0x90a0, 0x90a1, 0x90a2, 0x90a3, 0x90a4, 0x90a5, 0x90a6, 0x90a7, 0x90a8, 0x90a9, 0x90aa, 0x90ab, 0x90ac, 0x90ad, 0x90ae, 0x90af, 0x90b0, 0x90b1, 0x90b2, 0x90b3, 0x90b4, 0x90b5, 0x90b6, 0x90b7, 0x90b8, 0x90b9, 0x90ba, 0x90bb, 0x90bc, 0x90bd, 0x90be, 0x90bf, 0x90c0, 0x90c1, 0x90c2, 0x90c3, 0x90c4, 0x90c5, 0x90c6, 0x90c7, 0x90c8, 0x90c9, 0x90ca, 0x90cb, 0x90cc, 0x90cd, 0x90ce, 0x90cf, 0x90d0, 0x90d1, 0x90d2, 0x90d3, 0x90d4, 0x90d5, 0x90d6, 0x90d7, 0x90d8, 0x90d9, 0x90da, 0x90db, 0x90dc, 0x90dd, 0x90de, 0x90df, 0x90e0, 0x90e1, 0x90e2, 0x90e3, 0x90e4, 0x90e5, 0x90e6, 0x90e7, 0x90e8, 0x90e9, 0x90ea, 0x90eb, 0x90ec, 0x90ed, 0x90ee, 0x90ef, 0x90f0, 0x90f1, 0x90f2, 0x90f3, 0x90f4, 0x90f5, 0x90f6, 0x90f7, 0x90f8, 0x90f9, 0x90fa, 0x90fb, 0x90fc, 0x90fd, 0x90fe, 0x9140, 0x9141, 0x9142, 0x9143, 0x9144, 0x9145, 0x9146, 0x9147, 0x9148, 0x9149, 0x914a, 0x914b, 0x914c, 0x914d, 0x914e, 0x914f, 0x9150, 0x9151, 0x9152, 0x9153, 0x9154, 0x9155, 0x9156, 0x9157, 0x9158, 0x9159, 0x915a, 0x915b, 0x915c, 0x915d, 0x915e, 0x915f, 0x9160, 0x9161, 0x9162, 0x9163, 0x9164, 0x9165, 0x9166, 0x9167, 0x9168, 0x9169, 0x916a, 0x916b, 0x916c, 0x916d, 0x916e, 0x916f, 0x9170, 0x9171, 0x9172, 0x9173, 0x9174, 0x9175, 0x9176, 0x9177, 0x9178, 0x9179, 0x917a, 0x917b, 0x917c, 0x917d, 0x917e, 0x9180, 0x9181, 0x9182, 0x9183, 0x9184, 0x9185, 0x9186, 0x9187, 0x9188, 0x9189, 0x918a, 0x918b, 0x918c, 0x918d, 0x918e, 0x918f, 0x9190, 0x9191, 0x9192, 0x9193, 0x9194, 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, 0x919a, 0x919b, 0x919c, 0x919d, 0x919e, 0x919f, 0x91a0, 0x91a1, 0x91a2, 0x91a3, 0x91a4, 0x91a5, 0x91a6, 0x91a7, 0x91a8, 0x91a9, 0x91aa, 0x91ab, 0x91ac, 0x91ad, 0x91ae, 0x91af, 0x91b0, 0x91b1, 0x91b2, 0x91b3, 0x91b4, 0x91b5, 0x91b6, 0x91b7, 0x91b8, 0x91b9, 0x91ba, 0x91bb, 0x91bc, 0x91bd, 0x91be, 0x91bf, 0x91c0, 0x91c1, 0x91c2, 0x91c3, 0x91c4, 0x91c5, 0x91c6, 0x91c7, 0x91c8, 0x91c9, 0x91ca, 0x91cb, 0x91cc, 0x91cd, 0x91ce, 0x91cf, 0x91d0, 0x91d1, 0x91d2, 0x91d3, 0x91d4, 0x91d5, 0x91d6, 0x91d7, 0x91d8, 0x91d9, 0x91da, 0x91db, 0x91dc, 0x91dd, 0x91de, 0x91df, 0x91e0, 0x91e1, 0x91e2, 0x91e3, 0x91e4, 0x91e5, 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, 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, 0x9245, 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, 0x9274, 0x9275, 0x9276, 0x9277, 0x9278, 0x9279, 0x927a, 0x927b, 0x927c, 0x927d, 0x927e, 0x9280, 0x9281, 0x9282, 0x9283, 0x9284, 0x9285, 0x9286, 0x9287, 0x9288, 0x9289, 0x928a, 0x928b, 0x928c, 0x928d, 0x928e, 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, 0x92a8, 0x92a9, 0x92aa, 0x92ab, 0x92ac, 0x92ad, 0x92ae, 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, 0x92c8, 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, 0x92e9, 0x92ea, 0x92eb, 0x92ec, 0x92ed, 0x92ee, 0x92ef, 0x92f0, 0x92f1, 0x92f2, 0x92f3, 0x92f4, 0x92f5, 0x92f6, 0x92f7, 0x92f8, 0x92f9, 0x92fa, 0x92fb, 0x92fc, 0x92fd, 0x92fe, 0x9340, 0x9341, 0x9342, 0x9343, 0x9344, 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, 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, 0x936a, 0x936b, 0x936c, 0x936d, 0x936e, 0x936f, 0x9370, 0x9371, 0x9372, 0x9373, 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379, 0x937a, 0x937b, 0x937c, 0x937d, 0x937e, 0x9380, 0x9381, 0x9382, 0x9383, 0x9384, 0x9385, 0x9386, 0x9387, 0x9388, 0x9389, 0x938a, 0x938b, 0x938c, 0x938d, 0x938e, 0x938f, 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, 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, 0x93ca, 0x93cb, 0x93cc, 0x93cd, 0x93ce, 0x93cf, 0x93d0, 0x93d1, 0x93d2, 0x93d3, 0x93d4, 0x93d5, 0x93d6, 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, 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, 0x946b, 0x946c, 0x946d, 0x946e, 0x946f, 0x9470, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477, 0x9478, 0x9479, 0x947a, 0x947b, 0x947c, 0x947d, 0x947e, 0x9480, 0x9481, 0x9482, 0x9483, 0x9484, 0x9485, 0x9486, 0x9487, 0x9488, 0x9489, 0x948a, 0x948b, 0x948c, 0x948d, 0x948e, 0x948f, 0x9490, 0x9491, 0x9492, 0x9493, 0x9494, 0x9495, 0x9496, 0x9497, 0x9498, 0x9499, 0x949a, 0x949b, 0x949c, 0x949d, 0x949e, 0x949f, 0x94a0, 0x94a1, 0x94a2, 0x94a3, 0x94a4, 0x94a5, 0x94a6, 0x94a7, 0x94a8, 0x94a9, 0x94aa, 0x94ab, 0x94ac, 0x94ad, 0x94ae, 0x94af, 0x94b0, 0x94b1, 0x94b2, 0x94b3, 0x94b4, 0x94b5, 0x94b6, 0x94b7, 0x94b8, 0x94b9, 0x94ba, 0x94bb, 0x94bc, 0x94bd, 0x94be, 0x94bf, 0x94c0, 0x94c1, 0x94c2, 0x94c3, 0x94c4, 0x94c5, 0x94c6, 0x94c7, 0x94c8, 0x94c9, 0x94ca, 0x94cb, 0x94cc, 0x94cd, 0x94ce, 0x94cf, 0x94d0, 0x94d1, 0x94d2, 0x94d3, 0x94d4, 0x94d5, 0x94d6, 0x94d7, 0x94d8, 0x94d9, 0x94da, 0x94db, 0x94dc, 0x94dd, 0x94de, 0x94df, 0x94e0, 0x94e1, 0x94e2, 0x94e3, 0x94e4, 0x94e5, 0x94e6, 0x94e7, 0x94e8, 0x94e9, 0x94ea, 0x94eb, 0x94ec, 0x94ed, 0x94ee, 0x94ef, 0x94f0, 0x94f1, 0x94f2, 0x94f3, 0x94f4, 0x94f5, 0x94f6, 0x94f7, 0x94f8, 0x94f9, 0x94fa, 0x94fb, 0x94fc, 0x94fd, 0x94fe, 0x9540, 0x9541, 0x9542, 0x9543, 0x9544, 0x9545, 0x9546, 0x9547, 0x9548, 0x9549, 0x954a, 0x954b, 0x954c, 0x954d, 0x954e, 0x954f, 0x9550, 0x9551, 0x9552, 0x9553, 0x9554, 0x9555, 0x9556, 0x9557, 0x9558, 0x9559, 0x955a, 0x955b, 0x955c, 0x955d, 0x955e, 0x955f, 0x9560, 0x9561, 0x9562, 0x9563, 0x9564, 0x9565, 0x9566, 0x9567, 0x9568, 0x9569, 0x956a, 0x956b, 0x956c, 0x956d, 0x956e, 0x956f, 0x9570, 0x9571, 0x9572, 0x9573, 0x9574, 0x9575, 0x9576, 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, 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, 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, 0x95e8, 0x95e9, 0x95ea, 0x95eb, 0x95ec, 0x95ed, 0x95ee, 0x95ef, 0x95f0, 0x95f1, 0x95f2, 0x95f3, 0x95f4, 0x95f5, 0x95f6, 0x95f7, 0x95f8, 0x95f9, 0x95fa, 0x95fb, 0x95fc, 0x95fd, 0x95fe, 0x9640, 0x9641, 0x9642, 0x9643, 0x9644, 0x9645, 0x9646, 0x9647, 0x9648, 0x9649, 0x964a, 0x964b, 0x964c, 0x964d, 0x964e, 0x964f, 0x9650, 0x9651, 0x9652, 0x9653, 0x9654, 0x9655, 0x9656, 0x9657, 0x9658, 0x9659, 0x965a, 0x965b, 0x965c, 0x965d, 0x965e, 0x965f, 0x9660, 0x9661, 0x9662, 0x9663, 0x9664, 0x9665, 0x9666, 0x9667, 0x9668, 0x9669, 0x966a, 0x966b, 0x966c, 0x966d, 0x966e, 0x966f, 0x9670, 0x9671, 0x9672, 0x9673, 0x9674, 0x9675, 0x9676, 0x9677, 0x9678, 0x9679, 0x967a, 0x967b, 0x967c, 0x967d, 0x967e, 0x9680, 0x9681, 0x9682, 0x9683, 0x9684, 0x9685, 0x9686, 0x9687, 0x9688, 0x9689, 0x968a, 0x968b, 0x968c, 0x968d, 0x968e, 0x968f, 0x9690, 0x9691, 0x9692, 0x9693, 0x9694, 0x9695, 0x9696, 0x9697, 0x9698, 0x9699, 0x969a, 0x969b, 0x969c, 0x969d, 0x969e, 0x969f, 0x96a0, 0x96a1, 0x96a2, 0x96a3, 0x96a4, 0x96a5, 0x96a6, 0x96a7, 0x96a8, 0x96a9, 0x96aa, 0x96ab, 0x96ac, 0x96ad, 0x96ae, 0x96af, 0x96b0, 0x96b1, 0x96b2, 0x96b3, 0x96b4, 0x96b5, 0x96b6, 0x96b7, 0x96b8, 0x96b9, 0x96ba, 0x96bb, 0x96bc, 0x96bd, 0x96be, 0x96bf, 0x96c0, 0x96c1, 0x96c2, 0x96c3, 0x96c4, 0x96c5, 0x96c6, 0x96c7, 0x96c8, 0x96c9, 0x96ca, 0x96cb, 0x96cc, 0x96cd, 0x96ce, 0x96cf, 0x96d0, 0x96d1, 0x96d2, 0x96d3, 0x96d4, 0x96d5, 0x96d6, 0x96d7, 0x96d8, 0x96d9, 0x96da, 0x96db, 0x96dc, 0x96dd, 0x96de, 0x96df, 0x96e0, 0x96e1, 0x96e2, 0x96e3, 0x96e4, 0x96e5, 0x96e6, 0x96e7, 0x96e8, 0x96e9, 0x96ea, 0x96eb, 0x96ec, 0x96ed, 0x96ee, 0x96ef, 0x96f0, 0x96f1, 0x96f2, 0x96f3, 0x96f4, 0x96f5, 0x96f6, 0x96f7, 0x96f8, 0x96f9, 0x96fa, 0x96fb, 0x96fc, 0x96fd, 0x96fe, 0x9740, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745, 0x9746, 0x9747, 0x9748, 0x9749, 0x974a, 0x974b, 0x974c, 0x974d, 0x974e, 0x974f, 0x9750, 0x9751, 0x9752, 0x9753, 0x9754, 0x9755, 0x9756, 0x9757, 0x9758, 0x9759, 0x975a, 0x975b, 0x975c, 0x975d, 0x975e, 0x975f, 0x9760, 0x9761, 0x9762, 0x9763, 0x9764, 0x9765, 0x9766, 0x9767, 0x9768, 0x9769, 0x976a, 0x976b, 0x976c, 0x976d, 0x976e, 0x976f, 0x9770, 0x9771, 0x9772, 0x9773, 0x9774, 0x9775, 0x9776, 0x9777, 0x9778, 0x9779, 0x977a, 0x977b, 0x977c, 0x977d, 0x977e, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9785, 0x9786, 0x9787, 0x9788, 0x9789, 0x978a, 0x978b, 0x978c, 0x978d, 0x978e, 0x978f, 0x9790, 0x9791, 0x9792, 0x9793, 0x9794, 0x9795, 0x9796, 0x9797, 0x9798, 0x9799, 0x979a, 0x979b, 0x979c, 0x979d, 0x979e, 0x979f, 0x97a0, 0x97a1, 0x97a2, 0x97a3, 0x97a4, 0x97a5, 0x97a6, 0x97a7, 0x97a8, 0x97a9, 0x97aa, 0x97ab, 0x97ac, 0x97ad, 0x97ae, 0x97af, 0x97b0, 0x97b1, 0x97b2, 0x97b3, 0x97b4, 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, 0x97e4, 0x97e5, 0x97e6, 0x97e7, 0x97e8, 0x97e9, 0x97ea, 0x97eb, 0x97ec, 0x97ed, 0x97ee, 0x97ef, 0x97f0, 0x97f1, 0x97f2, 0x97f3, 0x97f4, 0x97f5, 0x97f6, 0x97f7, 0x97f8, 0x97f9, 0x97fa, 0x97fb, 0x97fc, 0x97fd, 0x97fe, 0x9840, 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846, 0x9847, 0x9848, 0x9849, 0x984a, 0x984b, 0x984c, 0x984d, 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, 0x986f, 0x9870, 0x9871, 0x9872, 0x9873, 0x9874, 0x9875, 0x9876, 0x9877, 0x9878, 0x9879, 0x987a, 0x987b, 0x987c, 0x987d, 0x987e, 0x9880, 0x9881, 0x9882, 0x9883, 0x9884, 0x9885, 0x9886, 0x9887, 0x9888, 0x9889, 0x988a, 0x988b, 0x988c, 0x988d, 0x988e, 0x988f, 0x9890, 0x9891, 0x9892, 0x9893, 0x9894, 0x9895, 0x9896, 0x9897, 0x9898, 0x9899, 0x989a, 0x989b, 0x989c, 0x989d, 0x989e, 0x989f, 0x98a0, 0x98a1, 0x98a2, 0x98a3, 0x98a4, 0x98a5, 0x98a6, 0x98a7, 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, 0x98ce, 0x98cf, 0x98d0, 0x98d1, 0x98d2, 0x98d3, 0x98d4, 0x98d5, 0x98d6, 0x98d7, 0x98d8, 0x98d9, 0x98da, 0x98db, 0x98dc, 0x98dd, 0x98de, 0x98df, 0x98e0, 0x98e1, 0x98e2, 0x98e3, 0x98e4, 0x98e5, 0x98e6, 0x98e7, 0x98e8, 0x98e9, 0x98ea, 0x98eb, 0x98ec, 0x98ed, 0x98ee, 0x98ef, 0x98f0, 0x98f1, 0x98f2, 0x98f3, 0x98f4, 0x98f5, 0x98f6, 0x98f7, 0x98f8, 0x98f9, 0x98fa, 0x98fb, 0x98fc, 0x98fd, 0x98fe, 0x9940, 0x9941, 0x9942, 0x9943, 0x9944, 0x9945, 0x9946, 0x9947, 0x9948, 0x9949, 0x994a, 0x994b, 0x994c, 0x994d, 0x994e, 0x994f, 0x9950, 0x9951, 0x9952, 0x9953, 0x9954, 0x9955, 0x9956, 0x9957, 0x9958, 0x9959, 0x995a, 0x995b, 0x995c, 0x995d, 0x995e, 0x995f, 0x9960, 0x9961, 0x9962, 0x9963, 0x9964, 0x9965, 0x9966, 0x9967, 0x9968, 0x9969, 0x996a, 0x996b, 0x996c, 0x996d, 0x996e, 0x996f, 0x9970, 0x9971, 0x9972, 0x9973, 0x9974, 0x9975, 0x9976, 0x9977, 0x9978, 0x9979, 0x997a, 0x997b, 0x997c, 0x997d, 0x997e, 0x9980, 0x9981, 0x9982, 0x9983, 0x9984, 0x9985, 0x9986, 0x9987, 0x9988, 0x9989, 0x998a, 0x998b, 0x998c, 0x998d, 0x998e, 0x998f, 0x9990, 0x9991, 0x9992, 0x9993, 0x9994, 0x9995, 0x9996, 0x9997, 0x9998, 0x9999, 0x999a, 0x999b, 0x999c, 0x999d, 0x999e, 0x999f, 0x99a0, 0x99a1, 0x99a2, 0x99a3, 0x99a4, 0x99a5, 0x99a6, 0x99a7, 0x99a8, 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, 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, 0x99fa, 0x99fb, 0x99fc, 0x99fd, 0x99fe, 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, 0x9a5a, 0x9a5b, 0x9a5c, 0x9a5d, 0x9a5e, 0x9a5f, 0x9a60, 0x9a61, 0x9a62, 0x9a63, 0x9a64, 0x9a65, 0x9a66, 0x9a67, 0x9a68, 0x9a69, 0x9a6a, 0x9a6b, 0x9a6c, 0x9a6d, 0x9a6e, 0x9a6f, 0x9a70, 0x9a71, 0x9a72, 0x9a73, 0x9a74, 0x9a75, 0x9a76, 0x9a77, 0x9a78, 0x9a79, 0x9a7a, 0x9a7b, 0x9a7c, 0x9a7d, 0x9a7e, 0x9a80, 0x9a81, 0x9a82, 0x9a83, 0x9a84, 0x9a85, 0x9a86, 0x9a87, 0x9a88, 0x9a89, 0x9a8a, 0x9a8b, 0x9a8c, 0x9a8d, 0x9a8e, 0x9a8f, 0x9a90, 0x9a91, 0x9a92, 0x9a93, 0x9a94, 0x9a95, 0x9a96, 0x9a97, 0x9a98, 0x9a99, 0x9a9a, 0x9a9b, 0x9a9c, 0x9a9d, 0x9a9e, 0x9a9f, 0x9aa0, 0x9aa1, 0x9aa2, 0x9aa3, 0x9aa4, 0x9aa5, 0x9aa6, 0x9aa7, 0x9aa8, 0x9aa9, 0x9aaa, 0x9aab, 0x9aac, 0x9aad, 0x9aae, 0x9aaf, 0x9ab0, 0x9ab1, 0x9ab2, 0x9ab3, 0x9ab4, 0x9ab5, 0x9ab6, 0x9ab7, 0x9ab8, 0x9ab9, 0x9aba, 0x9abb, 0x9abc, 0x9abd, 0x9abe, 0x9abf, 0x9ac0, 0x9ac1, 0x9ac2, 0x9ac3, 0x9ac4, 0x9ac5, 0x9ac6, 0x9ac7, 0x9ac8, 0x9ac9, 0x9aca, 0x9acb, 0x9acc, 0x9acd, 0x9ace, 0x9acf, 0x9ad0, 0x9ad1, 0x9ad2, 0x9ad3, 0x9ad4, 0x9ad5, 0x9ad6, 0x9ad7, 0x9ad8, 0x9ad9, 0x9ada, 0x9adb, 0x9adc, 0x9add, 0x9ade, 0x9adf, 0x9ae0, 0x9ae1, 0x9ae2, 0x9ae3, 0x9ae4, 0x9ae5, 0x9ae6, 0x9ae7, 0x9ae8, 0x9ae9, 0x9aea, 0x9aeb, 0x9aec, 0x9aed, 0x9aee, 0x9aef, 0x9af0, 0x9af1, 0x9af2, 0x9af3, 0x9af4, 0x9af5, 0x9af6, 0x9af7, 0x9af8, 0x9af9, 0x9afa, 0x9afb, 0x9afc, 0x9afd, 0x9afe, 0x9b40, 0x9b41, 0x9b42, 0x9b43, 0x9b44, 0x9b45, 0x9b46, 0x9b47, 0x9b48, 0x9b49, 0x9b4a, 0x9b4b, 0x9b4c, 0x9b4d, 0x9b4e, 0x9b4f, 0x9b50, 0x9b51, 0x9b52, 0x9b53, 0x9b54, 0x9b55, 0x9b56, 0x9b57, 0x9b58, 0x9b59, 0x9b5a, 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, 0x9b7c, 0x9b7d, 0x9b7e, 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, 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, 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, 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, 0x9c7b, 0x9c7c, 0x9c7d, 0x9c7e, 0x9c80, 0x9c81, 0x9c82, 0x9c83, 0x9c84, 0x9c85, 0x9c86, 0x9c87, 0x9c88, 0x9c89, 0x9c8a, 0x9c8b, 0x9c8c, 0x9c8d, 0x9c8e, 0x9c8f, 0x9c90, 0x9c91, 0x9c92, 0x9c93, 0x9c94, 0x9c95, 0x9c96, 0x9c97, 0x9c98, 0x9c99, 0x9c9a, 0x9c9b, 0x9c9c, 0x9c9d, 0x9c9e, 0x9c9f, 0x9ca0, 0x9ca1, 0x9ca2, 0x9ca3, 0x9ca4, 0x9ca5, 0x9ca6, 0x9ca7, 0x9ca8, 0x9ca9, 0x9caa, 0x9cab, 0x9cac, 0x9cad, 0x9cae, 0x9caf, 0x9cb0, 0x9cb1, 0x9cb2, 0x9cb3, 0x9cb4, 0x9cb5, 0x9cb6, 0x9cb7, 0x9cb8, 0x9cb9, 0x9cba, 0x9cbb, 0x9cbc, 0x9cbd, 0x9cbe, 0x9cbf, 0x9cc0, 0x9cc1, 0x9cc2, 0x9cc3, 0x9cc4, 0x9cc5, 0x9cc6, 0x9cc7, 0x9cc8, 0x9cc9, 0x9cca, 0x9ccb, 0x9ccc, 0x9ccd, 0x9cce, 0x9ccf, 0x9cd0, 0x9cd1, 0x9cd2, 0x9cd3, 0x9cd4, 0x9cd5, 0x9cd6, 0x9cd7, 0x9cd8, 0x9cd9, 0x9cda, 0x9cdb, 0x9cdc, 0x9cdd, 0x9cde, 0x9cdf, 0x9ce0, 0x9ce1, 0x9ce2, 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, 0x9d40, 0x9d41, 0x9d42, 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, 0x9d80, 0x9d81, 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, 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, 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, 0x9e40, 0x9e41, 0x9e42, 0x9e43, 0x9e44, 0x9e45, 0x9e46, 0x9e47, 0x9e48, 0x9e49, 0x9e4a, 0x9e4b, 0x9e4c, 0x9e4d, 0x9e4e, 0x9e4f, 0x9e50, 0x9e51, 0x9e52, 0x9e53, 0x9e54, 0x9e55, 0x9e56, 0x9e57, 0x9e58, 0x9e59, 0x9e5a, 0x9e5b, 0x9e5c, 0x9e5d, 0x9e5e, 0x9e5f, 0x9e60, 0x9e61, 0x9e62, 0x9e63, 0x9e64, 0x9e65, 0x9e66, 0x9e67, 0x9e68, 0x9e69, 0x9e6a, 0x9e6b, 0x9e6c, 0x9e6d, 0x9e6e, 0x9e6f, 0x9e70, 0x9e71, 0x9e72, 0x9e73, 0x9e74, 0x9e75, 0x9e76, 0x9e77, 0x9e78, 0x9e79, 0x9e7a, 0x9e7b, 0x9e7c, 0x9e7d, 0x9e7e, 0x9e80, 0x9e81, 0x9e82, 0x9e83, 0x9e84, 0x9e85, 0x9e86, 0x9e87, 0x9e88, 0x9e89, 0x9e8a, 0x9e8b, 0x9e8c, 0x9e8d, 0x9e8e, 0x9e8f, 0x9e90, 0x9e91, 0x9e92, 0x9e93, 0x9e94, 0x9e95, 0x9e96, 0x9e97, 0x9e98, 0x9e99, 0x9e9a, 0x9e9b, 0x9e9c, 0x9e9d, 0x9e9e, 0x9e9f, 0x9ea0, 0x9ea1, 0x9ea2, 0x9ea3, 0x9ea4, 0x9ea5, 0x9ea6, 0x9ea7, 0x9ea8, 0x9ea9, 0x9eaa, 0x9eab, 0x9eac, 0x9ead, 0x9eae, 0x9eaf, 0x9eb0, 0x9eb1, 0x9eb2, 0x9eb3, 0x9eb4, 0x9eb5, 0x9eb6, 0x9eb7, 0x9eb8, 0x9eb9, 0x9eba, 0x9ebb, 0x9ebc, 0x9ebd, 0x9ebe, 0x9ebf, 0x9ec0, 0x9ec1, 0x9ec2, 0x9ec3, 0x9ec4, 0x9ec5, 0x9ec6, 0x9ec7, 0x9ec8, 0x9ec9, 0x9eca, 0x9ecb, 0x9ecc, 0x9ecd, 0x9ece, 0x9ecf, 0x9ed0, 0x9ed1, 0x9ed2, 0x9ed3, 0x9ed4, 0x9ed5, 0x9ed6, 0x9ed7, 0x9ed8, 0x9ed9, 0x9eda, 0x9edb, 0x9edc, 0x9edd, 0x9ede, 0x9edf, 0x9ee0, 0x9ee1, 0x9ee2, 0x9ee3, 0x9ee4, 0x9ee5, 0x9ee6, 0x9ee7, 0x9ee8, 0x9ee9, 0x9eea, 0x9eeb, 0x9eec, 0x9eed, 0x9eee, 0x9eef, 0x9ef0, 0x9ef1, 0x9ef2, 0x9ef3, 0x9ef4, 0x9ef5, 0x9ef6, 0x9ef7, 0x9ef8, 0x9ef9, 0x9efa, 0x9efb, 0x9efc, 0x9efd, 0x9efe, 0x9f40, 0x9f41, 0x9f42, 0x9f43, 0x9f44, 0x9f45, 0x9f46, 0x9f47, 0x9f48, 0x9f49, 0x9f4a, 0x9f4b, 0x9f4c, 0x9f4d, 0x9f4e, 0x9f4f, 0x9f50, 0x9f51, 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, 0x9f79, 0x9f7a, 0x9f7b, 0x9f7c, 0x9f7d, 0x9f7e, 0x9f80, 0x9f81, 0x9f82, 0x9f83, 0x9f84, 0x9f85, 0x9f86, 0x9f87, 0x9f88, 0x9f89, 0x9f8a, 0x9f8b, 0x9f8c, 0x9f8d, 0x9f8e, 0x9f8f, 0x9f90, 0x9f91, 0x9f92, 0x9f93, 0x9f94, 0x9f95, 0x9f96, 0x9f97, 0x9f98, 0x9f99, 0x9f9a, 0x9f9b, 0x9f9c, 0x9f9d, 0x9f9e, 0x9f9f, 0x9fa0, 0x9fa1, 0x9fa2, 0x9fa3, 0x9fa4, 0x9fa5, 0x9fa6, 0x9fa7, 0x9fa8, 0x9fa9, 0x9faa, 0x9fab, 0x9fac, 0x9fad, 0x9fae, 0x9faf, 0x9fb0, 0x9fb1, 0x9fb2, 0x9fb3, 0x9fb4, 0x9fb5, 0x9fb6, 0x9fb7, 0x9fb8, 0x9fb9, 0x9fba, 0x9fbb, 0x9fbc, 0x9fbd, 0x9fbe, 0x9fbf, 0x9fc0, 0x9fc1, 0x9fc2, 0x9fc3, 0x9fc4, 0x9fc5, 0x9fc6, 0x9fc7, 0x9fc8, 0x9fc9, 0x9fca, 0x9fcb, 0x9fcc, 0x9fcd, 0x9fce, 0x9fcf, 0x9fd0, 0x9fd1, 0x9fd2, 0x9fd3, 0x9fd4, 0x9fd5, 0x9fd6, 0x9fd7, 0x9fd8, 0x9fd9, 0x9fda, 0x9fdb, 0x9fdc, 0x9fdd, 0x9fde, 0x9fdf, 0x9fe0, 0x9fe1, 0x9fe2, 0x9fe3, 0x9fe4, 0x9fe5, 0x9fe6, 0x9fe7, 0x9fe8, 0x9fe9, 0x9fea, 0x9feb, 0x9fec, 0x9fed, 0x9fee, 0x9fef, 0x9ff0, 0x9ff1, 0x9ff2, 0x9ff3, 0x9ff4, 0x9ff5, 0x9ff6, 0x9ff7, 0x9ff8, 0x9ff9, 0x9ffa, 0x9ffb, 0x9ffc, 0x9ffd, 0x9ffe, 0xa040, 0xa041, 0xa042, 0xa043, 0xa044, 0xa045, 0xa046, 0xa047, 0xa048, 0xa049, 0xa04a, 0xa04b, 0xa04c, 0xa04d, 0xa04e, 0xa04f, 0xa050, 0xa051, 0xa052, 0xa053, 0xa054, 0xa055, 0xa056, 0xa057, 0xa058, 0xa059, 0xa05a, 0xa05b, 0xa05c, 0xa05d, 0xa05e, 0xa05f, 0xa060, 0xa061, 0xa062, 0xa063, 0xa064, 0xa065, 0xa066, 0xa067, 0xa068, 0xa069, 0xa06a, 0xa06b, 0xa06c, 0xa06d, 0xa06e, 0xa06f, 0xa070, 0xa071, 0xa072, 0xa073, 0xa074, 0xa075, 0xa076, 0xa077, 0xa078, 0xa079, 0xa07a, 0xa07b, 0xa07c, 0xa07d, 0xa07e, 0xa080, 0xa081, 0xa082, 0xa083, 0xa084, 0xa085, 0xa086, 0xa087, 0xa088, 0xa089, 0xa08a, 0xa08b, 0xa08c, 0xa08d, 0xa08e, 0xa08f, 0xa090, 0xa091, 0xa092, 0xa093, 0xa094, 0xa095, 0xa096, 0xa097, 0xa098, 0xa099, 0xa09a, 0xa09b, 0xa09c, 0xa09d, 0xa09e, 0xa09f, 0xa0a0, 0xa0a1, 0xa0a2, 0xa0a3, 0xa0a4, 0xa0a5, 0xa0a6, 0xa0a7, 0xa0a8, 0xa0a9, 0xa0aa, 0xa0ab, 0xa0ac, 0xa0ad, 0xa0ae, 0xa0af, 0xa0b0, 0xa0b1, 0xa0b2, 0xa0b3, 0xa0b4, 0xa0b5, 0xa0b6, 0xa0b7, 0xa0b8, 0xa0b9, 0xa0ba, 0xa0bb, 0xa0bc, 0xa0bd, 0xa0be, 0xa0bf, 0xa0c0, 0xa0c1, 0xa0c2, 0xa0c3, 0xa0c4, 0xa0c5, 0xa0c6, 0xa0c7, 0xa0c8, 0xa0c9, 0xa0ca, 0xa0cb, 0xa0cc, 0xa0cd, 0xa0ce, 0xa0cf, 0xa0d0, 0xa0d1, 0xa0d2, 0xa0d3, 0xa0d4, 0xa0d5, 0xa0d6, 0xa0d7, 0xa0d8, 0xa0d9, 0xa0da, 0xa0db, 0xa0dc, 0xa0dd, 0xa0de, 0xa0df, 0xa0e0, 0xa0e1, 0xa0e2, 0xa0e3, 0xa0e4, 0xa0e5, 0xa0e6, 0xa0e7, 0xa0e8, 0xa0e9, 0xa0ea, 0xa0eb, 0xa0ec, 0xa0ed, 0xa0ee, 0xa0ef, 0xa0f0, 0xa0f1, 0xa0f2, 0xa0f3, 0xa0f4, 0xa0f5, 0xa0f6, 0xa0f7, 0xa0f8, 0xa0f9, 0xa0fa, 0xa0fb, 0xa0fc, 0xa0fd, 0xa0fe, 0xaa40, 0xaa41, 0xaa42, 0xaa43, 0xaa44, 0xaa45, 0xaa46, 0xaa47, 0xaa48, 0xaa49, 0xaa4a, 0xaa4b, 0xaa4c, 0xaa4d, 0xaa4e, 0xaa4f, 0xaa50, 0xaa51, 0xaa52, 0xaa53, 0xaa54, 0xaa55, 0xaa56, 0xaa57, 0xaa58, 0xaa59, 0xaa5a, 0xaa5b, 0xaa5c, 0xaa5d, 0xaa5e, 0xaa5f, 0xaa60, 0xaa61, 0xaa62, 0xaa63, 0xaa64, 0xaa65, 0xaa66, 0xaa67, 0xaa68, 0xaa69, 0xaa6a, 0xaa6b, 0xaa6c, 0xaa6d, 0xaa6e, 0xaa6f, 0xaa70, 0xaa71, 0xaa72, 0xaa73, 0xaa74, 0xaa75, 0xaa76, 0xaa77, 0xaa78, 0xaa79, 0xaa7a, 0xaa7b, 0xaa7c, 0xaa7d, 0xaa7e, 0xaa80, 0xaa81, 0xaa82, 0xaa83, 0xaa84, 0xaa85, 0xaa86, 0xaa87, 0xaa88, 0xaa89, 0xaa8a, 0xaa8b, 0xaa8c, 0xaa8d, 0xaa8e, 0xaa8f, 0xaa90, 0xaa91, 0xaa92, 0xaa93, 0xaa94, 0xaa95, 0xaa96, 0xaa97, 0xaa98, 0xaa99, 0xaa9a, 0xaa9b, 0xaa9c, 0xaa9d, 0xaa9e, 0xaa9f, 0xaaa0, 0xab40, 0xab41, 0xab42, 0xab43, 0xab44, 0xab45, 0xab46, 0xab47, 0xab48, 0xab49, 0xab4a, 0xab4b, 0xab4c, 0xab4d, 0xab4e, 0xab4f, 0xab50, 0xab51, 0xab52, 0xab53, 0xab54, 0xab55, 0xab56, 0xab57, 0xab58, 0xab59, 0xab5a, 0xab5b, 0xab5c, 0xab5d, 0xab5e, 0xab5f, 0xab60, 0xab61, 0xab62, 0xab63, 0xab64, 0xab65, 0xab66, 0xab67, 0xab68, 0xab69, 0xab6a, 0xab6b, 0xab6c, 0xab6d, 0xab6e, 0xab6f, 0xab70, 0xab71, 0xab72, 0xab73, 0xab74, 0xab75, 0xab76, 0xab77, 0xab78, 0xab79, 0xab7a, 0xab7b, 0xab7c, 0xab7d, 0xab7e, 0xab80, 0xab81, 0xab82, 0xab83, 0xab84, 0xab85, 0xab86, 0xab87, 0xab88, 0xab89, 0xab8a, 0xab8b, 0xab8c, 0xab8d, 0xab8e, 0xab8f, 0xab90, 0xab91, 0xab92, 0xab93, 0xab94, 0xab95, 0xab96, 0xab97, 0xab98, 0xab99, 0xab9a, 0xab9b, 0xab9c, 0xab9d, 0xab9e, 0xab9f, 0xaba0, 0xac40, 0xac41, 0xac42, 0xac43, 0xac44, 0xac45, 0xac46, 0xac47, 0xac48, 0xac49, 0xac4a, 0xac4b, 0xac4c, 0xac4d, 0xac4e, 0xac4f, 0xac50, 0xac51, 0xac52, 0xac53, 0xac54, 0xac55, 0xac56, 0xac57, 0xac58, 0xac59, 0xac5a, 0xac5b, 0xac5c, 0xac5d, 0xac5e, 0xac5f, 0xac60, 0xac61, 0xac62, 0xac63, 0xac64, 0xac65, 0xac66, 0xac67, 0xac68, 0xac69, 0xac6a, 0xac6b, 0xac6c, 0xac6d, 0xac6e, 0xac6f, 0xac70, 0xac71, 0xac72, 0xac73, 0xac74, 0xac75, 0xac76, 0xac77, 0xac78, 0xac79, 0xac7a, 0xac7b, 0xac7c, 0xac7d, 0xac7e, 0xac80, 0xac81, 0xac82, 0xac83, 0xac84, 0xac85, 0xac86, 0xac87, 0xac88, 0xac89, 0xac8a, 0xac8b, 0xac8c, 0xac8d, 0xac8e, 0xac8f, 0xac90, 0xac91, 0xac92, 0xac93, 0xac94, 0xac95, 0xac96, 0xac97, 0xac98, 0xac99, 0xac9a, 0xac9b, 0xac9c, 0xac9d, 0xac9e, 0xac9f, 0xaca0, 0xad40, 0xad41, 0xad42, 0xad43, 0xad44, 0xad45, 0xad46, 0xad47, 0xad48, 0xad49, 0xad4a, 0xad4b, 0xad4c, 0xad4d, 0xad4e, 0xad4f, 0xad50, 0xad51, 0xad52, 0xad53, 0xad54, 0xad55, 0xad56, 0xad57, 0xad58, 0xad59, 0xad5a, 0xad5b, 0xad5c, 0xad5d, 0xad5e, 0xad5f, 0xad60, 0xad61, 0xad62, 0xad63, 0xad64, 0xad65, 0xad66, 0xad67, 0xad68, 0xad69, 0xad6a, 0xad6b, 0xad6c, 0xad6d, 0xad6e, 0xad6f, 0xad70, 0xad71, 0xad72, 0xad73, 0xad74, 0xad75, 0xad76, 0xad77, 0xad78, 0xad79, 0xad7a, 0xad7b, 0xad7c, 0xad7d, 0xad7e, 0xad80, 0xad81, 0xad82, 0xad83, 0xad84, 0xad85, 0xad86, 0xad87, 0xad88, 0xad89, 0xad8a, 0xad8b, 0xad8c, 0xad8d, 0xad8e, 0xad8f, 0xad90, 0xad91, 0xad92, 0xad93, 0xad94, 0xad95, 0xad96, 0xad97, 0xad98, 0xad99, 0xad9a, 0xad9b, 0xad9c, 0xad9d, 0xad9e, 0xad9f, 0xada0, 0xae40, 0xae41, 0xae42, 0xae43, 0xae44, 0xae45, 0xae46, 0xae47, 0xae48, 0xae49, 0xae4a, 0xae4b, 0xae4c, 0xae4d, 0xae4e, 0xae4f, 0xae50, 0xae51, 0xae52, 0xae53, 0xae54, 0xae55, 0xae56, 0xae57, 0xae58, 0xae59, 0xae5a, 0xae5b, 0xae5c, 0xae5d, 0xae5e, 0xae5f, 0xae60, 0xae61, 0xae62, 0xae63, 0xae64, 0xae65, 0xae66, 0xae67, 0xae68, 0xae69, 0xae6a, 0xae6b, 0xae6c, 0xae6d, 0xae6e, 0xae6f, 0xae70, 0xae71, 0xae72, 0xae73, 0xae74, 0xae75, 0xae76, 0xae77, 0xae78, 0xae79, 0xae7a, 0xae7b, 0xae7c, 0xae7d, 0xae7e, 0xae80, 0xae81, 0xae82, 0xae83, 0xae84, 0xae85, 0xae86, 0xae87, 0xae88, 0xae89, 0xae8a, 0xae8b, 0xae8c, 0xae8d, 0xae8e, 0xae8f, 0xae90, 0xae91, 0xae92, 0xae93, 0xae94, 0xae95, 0xae96, 0xae97, 0xae98, 0xae99, 0xae9a, 0xae9b, 0xae9c, 0xae9d, 0xae9e, 0xae9f, 0xaea0, 0xaf40, 0xaf41, 0xaf42, 0xaf43, 0xaf44, 0xaf45, 0xaf46, 0xaf47, 0xaf48, 0xaf49, 0xaf4a, 0xaf4b, 0xaf4c, 0xaf4d, 0xaf4e, 0xaf4f, 0xaf50, 0xaf51, 0xaf52, 0xaf53, 0xaf54, 0xaf55, 0xaf56, 0xaf57, 0xaf58, 0xaf59, 0xaf5a, 0xaf5b, 0xaf5c, 0xaf5d, 0xaf5e, 0xaf5f, 0xaf60, 0xaf61, 0xaf62, 0xaf63, 0xaf64, 0xaf65, 0xaf66, 0xaf67, 0xaf68, 0xaf69, 0xaf6a, 0xaf6b, 0xaf6c, 0xaf6d, 0xaf6e, 0xaf6f, 0xaf70, 0xaf71, 0xaf72, 0xaf73, 0xaf74, 0xaf75, 0xaf76, 0xaf77, 0xaf78, 0xaf79, 0xaf7a, 0xaf7b, 0xaf7c, 0xaf7d, 0xaf7e, 0xaf80, 0xaf81, 0xaf82, 0xaf83, 0xaf84, 0xaf85, 0xaf86, 0xaf87, 0xaf88, 0xaf89, 0xaf8a, 0xaf8b, 0xaf8c, 0xaf8d, 0xaf8e, 0xaf8f, 0xaf90, 0xaf91, 0xaf92, 0xaf93, 0xaf94, 0xaf95, 0xaf96, 0xaf97, 0xaf98, 0xaf99, 0xaf9a, 0xaf9b, 0xaf9c, 0xaf9d, 0xaf9e, 0xaf9f, 0xafa0, 0xb040, 0xb041, 0xb042, 0xb043, 0xb044, 0xb045, 0xb046, 0xb047, 0xb048, 0xb049, 0xb04a, 0xb04b, 0xb04c, 0xb04d, 0xb04e, 0xb04f, 0xb050, 0xb051, 0xb052, 0xb053, 0xb054, 0xb055, 0xb056, 0xb057, 0xb058, 0xb059, 0xb05a, 0xb05b, 0xb05c, 0xb05d, 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, 0xb07c, 0xb07d, 0xb07e, 0xb080, 0xb081, 0xb082, 0xb083, 0xb084, 0xb085, 0xb086, 0xb087, 0xb088, 0xb089, 0xb08a, 0xb08b, 0xb08c, 0xb08d, 0xb08e, 0xb08f, 0xb090, 0xb091, 0xb092, 0xb093, 0xb094, 0xb095, 0xb096, 0xb097, 0xb098, 0xb099, 0xb09a, 0xb09b, 0xb09c, 0xb09d, 0xb09e, 0xb09f, 0xb0a0, 0xb140, 0xb141, 0xb142, 0xb143, 0xb144, 0xb145, 0xb146, 0xb147, 0xb148, 0xb149, 0xb14a, 0xb14b, 0xb14c, 0xb14d, 0xb14e, 0xb14f, 0xb150, 0xb151, 0xb152, 0xb153, 0xb154, 0xb155, 0xb156, 0xb157, 0xb158, 0xb159, 0xb15a, 0xb15b, 0xb15c, 0xb15d, 0xb15e, 0xb15f, 0xb160, 0xb161, 0xb162, 0xb163, 0xb164, 0xb165, 0xb166, 0xb167, 0xb168, 0xb169, 0xb16a, 0xb16b, 0xb16c, 0xb16d, 0xb16e, 0xb16f, 0xb170, 0xb171, 0xb172, 0xb173, 0xb174, 0xb175, 0xb176, 0xb177, 0xb178, 0xb179, 0xb17a, 0xb17b, 0xb17c, 0xb17d, 0xb17e, 0xb180, 0xb181, 0xb182, 0xb183, 0xb184, 0xb185, 0xb186, 0xb187, 0xb188, 0xb189, 0xb18a, 0xb18b, 0xb18c, 0xb18d, 0xb18e, 0xb18f, 0xb190, 0xb191, 0xb192, 0xb193, 0xb194, 0xb195, 0xb196, 0xb197, 0xb198, 0xb199, 0xb19a, 0xb19b, 0xb19c, 0xb19d, 0xb19e, 0xb19f, 0xb1a0, 0xb240, 0xb241, 0xb242, 0xb243, 0xb244, 0xb245, 0xb246, 0xb247, 0xb248, 0xb249, 0xb24a, 0xb24b, 0xb24c, 0xb24d, 0xb24e, 0xb24f, 0xb250, 0xb251, 0xb252, 0xb253, 0xb254, 0xb255, 0xb256, 0xb257, 0xb258, 0xb259, 0xb25a, 0xb25b, 0xb25c, 0xb25d, 0xb25e, 0xb25f, 0xb260, 0xb261, 0xb262, 0xb263, 0xb264, 0xb265, 0xb266, 0xb267, 0xb268, 0xb269, 0xb26a, 0xb26b, 0xb26c, 0xb26d, 0xb26e, 0xb26f, 0xb270, 0xb271, 0xb272, 0xb273, 0xb274, 0xb275, 0xb276, 0xb277, 0xb278, 0xb279, 0xb27a, 0xb27b, 0xb27c, 0xb27d, 0xb27e, 0xb280, 0xb281, 0xb282, 0xb283, 0xb284, 0xb285, 0xb286, 0xb287, 0xb288, 0xb289, 0xb28a, 0xb28b, 0xb28c, 0xb28d, 0xb28e, 0xb28f, 0xb290, 0xb291, 0xb292, 0xb293, 0xb294, 0xb295, 0xb296, 0xb297, 0xb298, 0xb299, 0xb29a, 0xb29b, 0xb29c, 0xb29d, 0xb29e, 0xb29f, 0xb2a0, 0xb340, 0xb341, 0xb342, 0xb343, 0xb344, 0xb345, 0xb346, 0xb347, 0xb348, 0xb349, 0xb34a, 0xb34b, 0xb34c, 0xb34d, 0xb34e, 0xb34f, 0xb350, 0xb351, 0xb352, 0xb353, 0xb354, 0xb355, 0xb356, 0xb357, 0xb358, 0xb359, 0xb35a, 0xb35b, 0xb35c, 0xb35d, 0xb35e, 0xb35f, 0xb360, 0xb361, 0xb362, 0xb363, 0xb364, 0xb365, 0xb366, 0xb367, 0xb368, 0xb369, 0xb36a, 0xb36b, 0xb36c, 0xb36d, 0xb36e, 0xb36f, 0xb370, 0xb371, 0xb372, 0xb373, 0xb374, 0xb375, 0xb376, 0xb377, 0xb378, 0xb379, 0xb37a, 0xb37b, 0xb37c, 0xb37d, 0xb37e, 0xb380, 0xb381, 0xb382, 0xb383, 0xb384, 0xb385, 0xb386, 0xb387, 0xb388, 0xb389, 0xb38a, 0xb38b, 0xb38c, 0xb38d, 0xb38e, 0xb38f, 0xb390, 0xb391, 0xb392, 0xb393, 0xb394, 0xb395, 0xb396, 0xb397, 0xb398, 0xb399, 0xb39a, 0xb39b, 0xb39c, 0xb39d, 0xb39e, 0xb39f, 0xb3a0, 0xb440, 0xb441, 0xb442, 0xb443, 0xb444, 0xb445, 0xb446, 0xb447, 0xb448, 0xb449, 0xb44a, 0xb44b, 0xb44c, 0xb44d, 0xb44e, 0xb44f, 0xb450, 0xb451, 0xb452, 0xb453, 0xb454, 0xb455, 0xb456, 0xb457, 0xb458, 0xb459, 0xb45a, 0xb45b, 0xb45c, 0xb45d, 0xb45e, 0xb45f, 0xb460, 0xb461, 0xb462, 0xb463, 0xb464, 0xb465, 0xb466, 0xb467, 0xb468, 0xb469, 0xb46a, 0xb46b, 0xb46c, 0xb46d, 0xb46e, 0xb46f, 0xb470, 0xb471, 0xb472, 0xb473, 0xb474, 0xb475, 0xb476, 0xb477, 0xb478, 0xb479, 0xb47a, 0xb47b, 0xb47c, 0xb47d, 0xb47e, 0xb480, 0xb481, 0xb482, 0xb483, 0xb484, 0xb485, 0xb486, 0xb487, 0xb488, 0xb489, 0xb48a, 0xb48b, 0xb48c, 0xb48d, 0xb48e, 0xb48f, 0xb490, 0xb491, 0xb492, 0xb493, 0xb494, 0xb495, 0xb496, 0xb497, 0xb498, 0xb499, 0xb49a, 0xb49b, 0xb49c, 0xb49d, 0xb49e, 0xb49f, 0xb4a0, 0xb540, 0xb541, 0xb542, 0xb543, 0xb544, 0xb545, 0xb546, 0xb547, 0xb548, 0xb549, 0xb54a, 0xb54b, 0xb54c, 0xb54d, 0xb54e, 0xb54f, 0xb550, 0xb551, 0xb552, 0xb553, 0xb554, 0xb555, 0xb556, 0xb557, 0xb558, 0xb559, 0xb55a, 0xb55b, 0xb55c, 0xb55d, 0xb55e, 0xb55f, 0xb560, 0xb561, 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, 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, 0xb5a0, 0xb640, 0xb641, 0xb642, 0xb643, 0xb644, 0xb645, 0xb646, 0xb647, 0xb648, 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, 0xb664, 0xb665, 0xb666, 0xb667, 0xb668, 0xb669, 0xb66a, 0xb66b, 0xb66c, 0xb66d, 0xb66e, 0xb66f, 0xb670, 0xb671, 0xb672, 0xb673, 0xb674, 0xb675, 0xb676, 0xb677, 0xb678, 0xb679, 0xb67a, 0xb67b, 0xb67c, 0xb67d, 0xb67e, 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, 0xb69c, 0xb69d, 0xb69e, 0xb69f, 0xb6a0, 0xb740, 0xb741, 0xb742, 0xb743, 0xb744, 0xb745, 0xb746, 0xb747, 0xb748, 0xb749, 0xb74a, 0xb74b, 0xb74c, 0xb74d, 0xb74e, 0xb74f, 0xb750, 0xb751, 0xb752, 0xb753, 0xb754, 0xb755, 0xb756, 0xb757, 0xb758, 0xb759, 0xb75a, 0xb75b, 0xb75c, 0xb75d, 0xb75e, 0xb75f, 0xb760, 0xb761, 0xb762, 0xb763, 0xb764, 0xb765, 0xb766, 0xb767, 0xb768, 0xb769, 0xb76a, 0xb76b, 0xb76c, 0xb76d, 0xb76e, 0xb76f, 0xb770, 0xb771, 0xb772, 0xb773, 0xb774, 0xb775, 0xb776, 0xb777, 0xb778, 0xb779, 0xb77a, 0xb77b, 0xb77c, 0xb77d, 0xb77e, 0xb780, 0xb781, 0xb782, 0xb783, 0xb784, 0xb785, 0xb786, 0xb787, 0xb788, 0xb789, 0xb78a, 0xb78b, 0xb78c, 0xb78d, 0xb78e, 0xb78f, 0xb790, 0xb791, 0xb792, 0xb793, 0xb794, 0xb795, 0xb796, 0xb797, 0xb798, 0xb799, 0xb79a, 0xb79b, 0xb79c, 0xb79d, 0xb79e, 0xb79f, 0xb7a0, 0xb840, 0xb841, 0xb842, 0xb843, 0xb844, 0xb845, 0xb846, 0xb847, 0xb848, 0xb849, 0xb84a, 0xb84b, 0xb84c, 0xb84d, 0xb84e, 0xb84f, 0xb850, 0xb851, 0xb852, 0xb853, 0xb854, 0xb855, 0xb856, 0xb857, 0xb858, 0xb859, 0xb85a, 0xb85b, 0xb85c, 0xb85d, 0xb85e, 0xb85f, 0xb860, 0xb861, 0xb862, 0xb863, 0xb864, 0xb865, 0xb866, 0xb867, 0xb868, 0xb869, 0xb86a, 0xb86b, 0xb86c, 0xb86d, 0xb86e, 0xb86f, 0xb870, 0xb871, 0xb872, 0xb873, 0xb874, 0xb875, 0xb876, 0xb877, 0xb878, 0xb879, 0xb87a, 0xb87b, 0xb87c, 0xb87d, 0xb87e, 0xb880, 0xb881, 0xb882, 0xb883, 0xb884, 0xb885, 0xb886, 0xb887, 0xb888, 0xb889, 0xb88a, 0xb88b, 0xb88c, 0xb88d, 0xb88e, 0xb88f, 0xb890, 0xb891, 0xb892, 0xb893, 0xb894, 0xb895, 0xb896, 0xb897, 0xb898, 0xb899, 0xb89a, 0xb89b, 0xb89c, 0xb89d, 0xb89e, 0xb89f, 0xb8a0, 0xb940, 0xb941, 0xb942, 0xb943, 0xb944, 0xb945, 0xb946, 0xb947, 0xb948, 0xb949, 0xb94a, 0xb94b, 0xb94c, 0xb94d, 0xb94e, 0xb94f, 0xb950, 0xb951, 0xb952, 0xb953, 0xb954, 0xb955, 0xb956, 0xb957, 0xb958, 0xb959, 0xb95a, 0xb95b, 0xb95c, 0xb95d, 0xb95e, 0xb95f, 0xb960, 0xb961, 0xb962, 0xb963, 0xb964, 0xb965, 0xb966, 0xb967, 0xb968, 0xb969, 0xb96a, 0xb96b, 0xb96c, 0xb96d, 0xb96e, 0xb96f, 0xb970, 0xb971, 0xb972, 0xb973, 0xb974, 0xb975, 0xb976, 0xb977, 0xb978, 0xb979, 0xb97a, 0xb97b, 0xb97c, 0xb97d, 0xb97e, 0xb980, 0xb981, 0xb982, 0xb983, 0xb984, 0xb985, 0xb986, 0xb987, 0xb988, 0xb989, 0xb98a, 0xb98b, 0xb98c, 0xb98d, 0xb98e, 0xb98f, 0xb990, 0xb991, 0xb992, 0xb993, 0xb994, 0xb995, 0xb996, 0xb997, 0xb998, 0xb999, 0xb99a, 0xb99b, 0xb99c, 0xb99d, 0xb99e, 0xb99f, 0xb9a0, 0xba40, 0xba41, 0xba42, 0xba43, 0xba44, 0xba45, 0xba46, 0xba47, 0xba48, 0xba49, 0xba4a, 0xba4b, 0xba4c, 0xba4d, 0xba4e, 0xba4f, 0xba50, 0xba51, 0xba52, 0xba53, 0xba54, 0xba55, 0xba56, 0xba57, 0xba58, 0xba59, 0xba5a, 0xba5b, 0xba5c, 0xba5d, 0xba5e, 0xba5f, 0xba60, 0xba61, 0xba62, 0xba63, 0xba64, 0xba65, 0xba66, 0xba67, 0xba68, 0xba69, 0xba6a, 0xba6b, 0xba6c, 0xba6d, 0xba6e, 0xba6f, 0xba70, 0xba71, 0xba72, 0xba73, 0xba74, 0xba75, 0xba76, 0xba77, 0xba78, 0xba79, 0xba7a, 0xba7b, 0xba7c, 0xba7d, 0xba7e, 0xba80, 0xba81, 0xba82, 0xba83, 0xba84, 0xba85, 0xba86, 0xba87, 0xba88, 0xba89, 0xba8a, 0xba8b, 0xba8c, 0xba8d, 0xba8e, 0xba8f, 0xba90, 0xba91, 0xba92, 0xba93, 0xba94, 0xba95, 0xba96, 0xba97, 0xba98, 0xba99, 0xba9a, 0xba9b, 0xba9c, 0xba9d, 0xba9e, 0xba9f, 0xbaa0, 0xbb40, 0xbb41, 0xbb42, 0xbb43, 0xbb44, 0xbb45, 0xbb46, 0xbb47, 0xbb48, 0xbb49, 0xbb4a, 0xbb4b, 0xbb4c, 0xbb4d, 0xbb4e, 0xbb4f, 0xbb50, 0xbb51, 0xbb52, 0xbb53, 0xbb54, 0xbb55, 0xbb56, 0xbb57, 0xbb58, 0xbb59, 0xbb5a, 0xbb5b, 0xbb5c, 0xbb5d, 0xbb5e, 0xbb5f, 0xbb60, 0xbb61, 0xbb62, 0xbb63, 0xbb64, 0xbb65, 0xbb66, 0xbb67, 0xbb68, 0xbb69, 0xbb6a, 0xbb6b, 0xbb6c, 0xbb6d, 0xbb6e, 0xbb6f, 0xbb70, 0xbb71, 0xbb72, 0xbb73, 0xbb74, 0xbb75, 0xbb76, 0xbb77, 0xbb78, 0xbb79, 0xbb7a, 0xbb7b, 0xbb7c, 0xbb7d, 0xbb7e, 0xbb80, 0xbb81, 0xbb82, 0xbb83, 0xbb84, 0xbb85, 0xbb86, 0xbb87, 0xbb88, 0xbb89, 0xbb8a, 0xbb8b, 0xbb8c, 0xbb8d, 0xbb8e, 0xbb8f, 0xbb90, 0xbb91, 0xbb92, 0xbb93, 0xbb94, 0xbb95, 0xbb96, 0xbb97, 0xbb98, 0xbb99, 0xbb9a, 0xbb9b, 0xbb9c, 0xbb9d, 0xbb9e, 0xbb9f, 0xbba0, 0xbc40, 0xbc41, 0xbc42, 0xbc43, 0xbc44, 0xbc45, 0xbc46, 0xbc47, 0xbc48, 0xbc49, 0xbc4a, 0xbc4b, 0xbc4c, 0xbc4d, 0xbc4e, 0xbc4f, 0xbc50, 0xbc51, 0xbc52, 0xbc53, 0xbc54, 0xbc55, 0xbc56, 0xbc57, 0xbc58, 0xbc59, 0xbc5a, 0xbc5b, 0xbc5c, 0xbc5d, 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, 0xbc80, 0xbc81, 0xbc82, 0xbc83, 0xbc84, 0xbc85, 0xbc86, 0xbc87, 0xbc88, 0xbc89, 0xbc8a, 0xbc8b, 0xbc8c, 0xbc8d, 0xbc8e, 0xbc8f, 0xbc90, 0xbc91, 0xbc92, 0xbc93, 0xbc94, 0xbc95, 0xbc96, 0xbc97, 0xbc98, 0xbc99, 0xbc9a, 0xbc9b, 0xbc9c, 0xbc9d, 0xbc9e, 0xbc9f, 0xbca0, 0xbd40, 0xbd41, 0xbd42, 0xbd43, 0xbd44, 0xbd45, 0xbd46, 0xbd47, 0xbd48, 0xbd49, 0xbd4a, 0xbd4b, 0xbd4c, 0xbd4d, 0xbd4e, 0xbd4f, 0xbd50, 0xbd51, 0xbd52, 0xbd53, 0xbd54, 0xbd55, 0xbd56, 0xbd57, 0xbd58, 0xbd59, 0xbd5a, 0xbd5b, 0xbd5c, 0xbd5d, 0xbd5e, 0xbd5f, 0xbd60, 0xbd61, 0xbd62, 0xbd63, 0xbd64, 0xbd65, 0xbd66, 0xbd67, 0xbd68, 0xbd69, 0xbd6a, 0xbd6b, 0xbd6c, 0xbd6d, 0xbd6e, 0xbd6f, 0xbd70, 0xbd71, 0xbd72, 0xbd73, 0xbd74, 0xbd75, 0xbd76, 0xbd77, 0xbd78, 0xbd79, 0xbd7a, 0xbd7b, 0xbd7c, 0xbd7d, 0xbd7e, 0xbd80, 0xbd81, 0xbd82, 0xbd83, 0xbd84, 0xbd85, 0xbd86, 0xbd87, 0xbd88, 0xbd89, 0xbd8a, 0xbd8b, 0xbd8c, 0xbd8d, 0xbd8e, 0xbd8f, 0xbd90, 0xbd91, 0xbd92, 0xbd93, 0xbd94, 0xbd95, 0xbd96, 0xbd97, 0xbd98, 0xbd99, 0xbd9a, 0xbd9b, 0xbd9c, 0xbd9d, 0xbd9e, 0xbd9f, 0xbda0, 0xbe40, 0xbe41, 0xbe42, 0xbe43, 0xbe44, 0xbe45, 0xbe46, 0xbe47, 0xbe48, 0xbe49, 0xbe4a, 0xbe4b, 0xbe4c, 0xbe4d, 0xbe4e, 0xbe4f, 0xbe50, 0xbe51, 0xbe52, 0xbe53, 0xbe54, 0xbe55, 0xbe56, 0xbe57, 0xbe58, 0xbe59, 0xbe5a, 0xbe5b, 0xbe5c, 0xbe5d, 0xbe5e, 0xbe5f, 0xbe60, 0xbe61, 0xbe62, 0xbe63, 0xbe64, 0xbe65, 0xbe66, 0xbe67, 0xbe68, 0xbe69, 0xbe6a, 0xbe6b, 0xbe6c, 0xbe6d, 0xbe6e, 0xbe6f, 0xbe70, 0xbe71, 0xbe72, 0xbe73, 0xbe74, 0xbe75, 0xbe76, 0xbe77, 0xbe78, 0xbe79, 0xbe7a, 0xbe7b, 0xbe7c, 0xbe7d, 0xbe7e, 0xbe80, 0xbe81, 0xbe82, 0xbe83, 0xbe84, 0xbe85, 0xbe86, 0xbe87, 0xbe88, 0xbe89, 0xbe8a, 0xbe8b, 0xbe8c, 0xbe8d, 0xbe8e, 0xbe8f, 0xbe90, 0xbe91, 0xbe92, 0xbe93, 0xbe94, 0xbe95, 0xbe96, 0xbe97, 0xbe98, 0xbe99, 0xbe9a, 0xbe9b, 0xbe9c, 0xbe9d, 0xbe9e, 0xbe9f, 0xbea0, 0xbf40, 0xbf41, 0xbf42, 0xbf43, 0xbf44, 0xbf45, 0xbf46, 0xbf47, 0xbf48, 0xbf49, 0xbf4a, 0xbf4b, 0xbf4c, 0xbf4d, 0xbf4e, 0xbf4f, 0xbf50, 0xbf51, 0xbf52, 0xbf53, 0xbf54, 0xbf55, 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, 0xbf80, 0xbf81, 0xbf82, 0xbf83, 0xbf84, 0xbf85, 0xbf86, 0xbf87, 0xbf88, 0xbf89, 0xbf8a, 0xbf8b, 0xbf8c, 0xbf8d, 0xbf8e, 0xbf8f, 0xbf90, 0xbf91, 0xbf92, 0xbf93, 0xbf94, 0xbf95, 0xbf96, 0xbf97, 0xbf98, 0xbf99, 0xbf9a, 0xbf9b, 0xbf9c, 0xbf9d, 0xbf9e, 0xbf9f, 0xbfa0, 0xc040, 0xc041, 0xc042, 0xc043, 0xc044, 0xc045, 0xc046, 0xc047, 0xc048, 0xc049, 0xc04a, 0xc04b, 0xc04c, 0xc04d, 0xc04e, 0xc04f, 0xc050, 0xc051, 0xc052, 0xc053, 0xc054, 0xc055, 0xc056, 0xc057, 0xc058, 0xc059, 0xc05a, 0xc05b, 0xc05c, 0xc05d, 0xc05e, 0xc05f, 0xc060, 0xc061, 0xc062, 0xc063, 0xc064, 0xc065, 0xc066, 0xc067, 0xc068, 0xc069, 0xc06a, 0xc06b, 0xc06c, 0xc06d, 0xc06e, 0xc06f, 0xc070, 0xc071, 0xc072, 0xc073, 0xc074, 0xc075, 0xc076, 0xc077, 0xc078, 0xc079, 0xc07a, 0xc07b, 0xc07c, 0xc07d, 0xc07e, 0xc080, 0xc081, 0xc082, 0xc083, 0xc084, 0xc085, 0xc086, 0xc087, 0xc088, 0xc089, 0xc08a, 0xc08b, 0xc08c, 0xc08d, 0xc08e, 0xc08f, 0xc090, 0xc091, 0xc092, 0xc093, 0xc094, 0xc095, 0xc096, 0xc097, 0xc098, 0xc099, 0xc09a, 0xc09b, 0xc09c, 0xc09d, 0xc09e, 0xc09f, 0xc0a0, 0xc140, 0xc141, 0xc142, 0xc143, 0xc144, 0xc145, 0xc146, 0xc147, 0xc148, 0xc149, 0xc14a, 0xc14b, 0xc14c, 0xc14d, 0xc14e, 0xc14f, 0xc150, 0xc151, 0xc152, 0xc153, 0xc154, 0xc155, 0xc156, 0xc157, 0xc158, 0xc159, 0xc15a, 0xc15b, 0xc15c, 0xc15d, 0xc15e, 0xc15f, 0xc160, 0xc161, 0xc162, 0xc163, 0xc164, 0xc165, 0xc166, 0xc167, 0xc168, 0xc169, 0xc16a, 0xc16b, 0xc16c, 0xc16d, 0xc16e, 0xc16f, 0xc170, 0xc171, 0xc172, 0xc173, 0xc174, 0xc175, 0xc176, 0xc177, 0xc178, 0xc179, 0xc17a, 0xc17b, 0xc17c, 0xc17d, 0xc17e, 0xc180, 0xc181, 0xc182, 0xc183, 0xc184, 0xc185, 0xc186, 0xc187, 0xc188, 0xc189, 0xc18a, 0xc18b, 0xc18c, 0xc18d, 0xc18e, 0xc18f, 0xc190, 0xc191, 0xc192, 0xc193, 0xc194, 0xc195, 0xc196, 0xc197, 0xc198, 0xc199, 0xc19a, 0xc19b, 0xc19c, 0xc19d, 0xc19e, 0xc19f, 0xc1a0, 0xc240, 0xc241, 0xc242, 0xc243, 0xc244, 0xc245, 0xc246, 0xc247, 0xc248, 0xc249, 0xc24a, 0xc24b, 0xc24c, 0xc24d, 0xc24e, 0xc24f, 0xc250, 0xc251, 0xc252, 0xc253, 0xc254, 0xc255, 0xc256, 0xc257, 0xc258, 0xc259, 0xc25a, 0xc25b, 0xc25c, 0xc25d, 0xc25e, 0xc25f, 0xc260, 0xc261, 0xc262, 0xc263, 0xc264, 0xc265, 0xc266, 0xc267, 0xc268, 0xc269, 0xc26a, 0xc26b, 0xc26c, 0xc26d, 0xc26e, 0xc26f, 0xc270, 0xc271, 0xc272, 0xc273, 0xc274, 0xc275, 0xc276, 0xc277, 0xc278, 0xc279, 0xc27a, 0xc27b, 0xc27c, 0xc27d, 0xc27e, 0xc280, 0xc281, 0xc282, 0xc283, 0xc284, 0xc285, 0xc286, 0xc287, 0xc288, 0xc289, 0xc28a, 0xc28b, 0xc28c, 0xc28d, 0xc28e, 0xc28f, 0xc290, 0xc291, 0xc292, 0xc293, 0xc294, 0xc295, 0xc296, 0xc297, 0xc298, 0xc299, 0xc29a, 0xc29b, 0xc29c, 0xc29d, 0xc29e, 0xc29f, 0xc2a0, 0xc340, 0xc341, 0xc342, 0xc343, 0xc344, 0xc345, 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, 0xc368, 0xc369, 0xc36a, 0xc36b, 0xc36c, 0xc36d, 0xc36e, 0xc36f, 0xc370, 0xc371, 0xc372, 0xc373, 0xc374, 0xc375, 0xc376, 0xc377, 0xc378, 0xc379, 0xc37a, 0xc37b, 0xc37c, 0xc37d, 0xc37e, 0xc380, 0xc381, 0xc382, 0xc383, 0xc384, 0xc385, 0xc386, 0xc387, 0xc388, 0xc389, 0xc38a, 0xc38b, 0xc38c, 0xc38d, 0xc38e, 0xc38f, 0xc390, 0xc391, 0xc392, 0xc393, 0xc394, 0xc395, 0xc396, 0xc397, 0xc398, 0xc399, 0xc39a, 0xc39b, 0xc39c, 0xc39d, 0xc39e, 0xc39f, 0xc3a0, 0xc440, 0xc441, 0xc442, 0xc443, 0xc444, 0xc445, 0xc446, 0xc447, 0xc448, 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, 0xc464, 0xc465, 0xc466, 0xc467, 0xc468, 0xc469, 0xc46a, 0xc46b, 0xc46c, 0xc46d, 0xc46e, 0xc46f, 0xc470, 0xc471, 0xc472, 0xc473, 0xc474, 0xc475, 0xc476, 0xc477, 0xc478, 0xc479, 0xc47a, 0xc47b, 0xc47c, 0xc47d, 0xc47e, 0xc480, 0xc481, 0xc482, 0xc483, 0xc484, 0xc485, 0xc486, 0xc487, 0xc488, 0xc489, 0xc48a, 0xc48b, 0xc48c, 0xc48d, 0xc48e, 0xc48f, 0xc490, 0xc491, 0xc492, 0xc493, 0xc494, 0xc495, 0xc496, 0xc497, 0xc498, 0xc499, 0xc49a, 0xc49b, 0xc49c, 0xc49d, 0xc49e, 0xc49f, 0xc4a0, 0xc540, 0xc541, 0xc542, 0xc543, 0xc544, 0xc545, 0xc546, 0xc547, 0xc548, 0xc549, 0xc54a, 0xc54b, 0xc54c, 0xc54d, 0xc54e, 0xc54f, 0xc550, 0xc551, 0xc552, 0xc553, 0xc554, 0xc555, 0xc556, 0xc557, 0xc558, 0xc559, 0xc55a, 0xc55b, 0xc55c, 0xc55d, 0xc55e, 0xc55f, 0xc560, 0xc561, 0xc562, 0xc563, 0xc564, 0xc565, 0xc566, 0xc567, 0xc568, 0xc569, 0xc56a, 0xc56b, 0xc56c, 0xc56d, 0xc56e, 0xc56f, 0xc570, 0xc571, 0xc572, 0xc573, 0xc574, 0xc575, 0xc576, 0xc577, 0xc578, 0xc579, 0xc57a, 0xc57b, 0xc57c, 0xc57d, 0xc57e, 0xc580, 0xc581, 0xc582, 0xc583, 0xc584, 0xc585, 0xc586, 0xc587, 0xc588, 0xc589, 0xc58a, 0xc58b, 0xc58c, 0xc58d, 0xc58e, 0xc58f, 0xc590, 0xc591, 0xc592, 0xc593, 0xc594, 0xc595, 0xc596, 0xc597, 0xc598, 0xc599, 0xc59a, 0xc59b, 0xc59c, 0xc59d, 0xc59e, 0xc59f, 0xc5a0, 0xc640, 0xc641, 0xc642, 0xc643, 0xc644, 0xc645, 0xc646, 0xc647, 0xc648, 0xc649, 0xc64a, 0xc64b, 0xc64c, 0xc64d, 0xc64e, 0xc64f, 0xc650, 0xc651, 0xc652, 0xc653, 0xc654, 0xc655, 0xc656, 0xc657, 0xc658, 0xc659, 0xc65a, 0xc65b, 0xc65c, 0xc65d, 0xc65e, 0xc65f, 0xc660, 0xc661, 0xc662, 0xc663, 0xc664, 0xc665, 0xc666, 0xc667, 0xc668, 0xc669, 0xc66a, 0xc66b, 0xc66c, 0xc66d, 0xc66e, 0xc66f, 0xc670, 0xc671, 0xc672, 0xc673, 0xc674, 0xc675, 0xc676, 0xc677, 0xc678, 0xc679, 0xc67a, 0xc67b, 0xc67c, 0xc67d, 0xc67e, 0xc680, 0xc681, 0xc682, 0xc683, 0xc684, 0xc685, 0xc686, 0xc687, 0xc688, 0xc689, 0xc68a, 0xc68b, 0xc68c, 0xc68d, 0xc68e, 0xc68f, 0xc690, 0xc691, 0xc692, 0xc693, 0xc694, 0xc695, 0xc696, 0xc697, 0xc698, 0xc699, 0xc69a, 0xc69b, 0xc69c, 0xc69d, 0xc69e, 0xc69f, 0xc6a0, 0xc740, 0xc741, 0xc742, 0xc743, 0xc744, 0xc745, 0xc746, 0xc747, 0xc748, 0xc749, 0xc74a, 0xc74b, 0xc74c, 0xc74d, 0xc74e, 0xc74f, 0xc750, 0xc751, 0xc752, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc759, 0xc75a, 0xc75b, 0xc75c, 0xc75d, 0xc75e, 0xc75f, 0xc760, 0xc761, 0xc762, 0xc763, 0xc764, 0xc765, 0xc766, 0xc767, 0xc768, 0xc769, 0xc76a, 0xc76b, 0xc76c, 0xc76d, 0xc76e, 0xc76f, 0xc770, 0xc771, 0xc772, 0xc773, 0xc774, 0xc775, 0xc776, 0xc777, 0xc778, 0xc779, 0xc77a, 0xc77b, 0xc77c, 0xc77d, 0xc77e, 0xc780, 0xc781, 0xc782, 0xc783, 0xc784, 0xc785, 0xc786, 0xc787, 0xc788, 0xc789, 0xc78a, 0xc78b, 0xc78c, 0xc78d, 0xc78e, 0xc78f, 0xc790, 0xc791, 0xc792, 0xc793, 0xc794, 0xc795, 0xc796, 0xc797, 0xc798, 0xc799, 0xc79a, 0xc79b, 0xc79c, 0xc79d, 0xc79e, 0xc79f, 0xc7a0, 0xc840, 0xc841, 0xc842, 0xc843, 0xc844, 0xc845, 0xc846, 0xc847, 0xc848, 0xc849, 0xc84a, 0xc84b, 0xc84c, 0xc84d, 0xc84e, 0xc84f, 0xc850, 0xc851, 0xc852, 0xc853, 0xc854, 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, 0xc870, 0xc871, 0xc872, 0xc873, 0xc874, 0xc875, 0xc876, 0xc877, 0xc878, 0xc879, 0xc87a, 0xc87b, 0xc87c, 0xc87d, 0xc87e, 0xc880, 0xc881, 0xc882, 0xc883, 0xc884, 0xc885, 0xc886, 0xc887, 0xc888, 0xc889, 0xc88a, 0xc88b, 0xc88c, 0xc88d, 0xc88e, 0xc88f, 0xc890, 0xc891, 0xc892, 0xc893, 0xc894, 0xc895, 0xc896, 0xc897, 0xc898, 0xc899, 0xc89a, 0xc89b, 0xc89c, 0xc89d, 0xc89e, 0xc89f, 0xc8a0, 0xc940, 0xc941, 0xc942, 0xc943, 0xc944, 0xc945, 0xc946, 0xc947, 0xc948, 0xc949, 0xc94a, 0xc94b, 0xc94c, 0xc94d, 0xc94e, 0xc94f, 0xc950, 0xc951, 0xc952, 0xc953, 0xc954, 0xc955, 0xc956, 0xc957, 0xc958, 0xc959, 0xc95a, 0xc95b, 0xc95c, 0xc95d, 0xc95e, 0xc95f, 0xc960, 0xc961, 0xc962, 0xc963, 0xc964, 0xc965, 0xc966, 0xc967, 0xc968, 0xc969, 0xc96a, 0xc96b, 0xc96c, 0xc96d, 0xc96e, 0xc96f, 0xc970, 0xc971, 0xc972, 0xc973, 0xc974, 0xc975, 0xc976, 0xc977, 0xc978, 0xc979, 0xc97a, 0xc97b, 0xc97c, 0xc97d, 0xc97e, 0xc980, 0xc981, 0xc982, 0xc983, 0xc984, 0xc985, 0xc986, 0xc987, 0xc988, 0xc989, 0xc98a, 0xc98b, 0xc98c, 0xc98d, 0xc98e, 0xc98f, 0xc990, 0xc991, 0xc992, 0xc993, 0xc994, 0xc995, 0xc996, 0xc997, 0xc998, 0xc999, 0xc99a, 0xc99b, 0xc99c, 0xc99d, 0xc99e, 0xc99f, 0xc9a0, 0xca40, 0xca41, 0xca42, 0xca43, 0xca44, 0xca45, 0xca46, 0xca47, 0xca48, 0xca49, 0xca4a, 0xca4b, 0xca4c, 0xca4d, 0xca4e, 0xca4f, 0xca50, 0xca51, 0xca52, 0xca53, 0xca54, 0xca55, 0xca56, 0xca57, 0xca58, 0xca59, 0xca5a, 0xca5b, 0xca5c, 0xca5d, 0xca5e, 0xca5f, 0xca60, 0xca61, 0xca62, 0xca63, 0xca64, 0xca65, 0xca66, 0xca67, 0xca68, 0xca69, 0xca6a, 0xca6b, 0xca6c, 0xca6d, 0xca6e, 0xca6f, 0xca70, 0xca71, 0xca72, 0xca73, 0xca74, 0xca75, 0xca76, 0xca77, 0xca78, 0xca79, 0xca7a, 0xca7b, 0xca7c, 0xca7d, 0xca7e, 0xca80, 0xca81, 0xca82, 0xca83, 0xca84, 0xca85, 0xca86, 0xca87, 0xca88, 0xca89, 0xca8a, 0xca8b, 0xca8c, 0xca8d, 0xca8e, 0xca8f, 0xca90, 0xca91, 0xca92, 0xca93, 0xca94, 0xca95, 0xca96, 0xca97, 0xca98, 0xca99, 0xca9a, 0xca9b, 0xca9c, 0xca9d, 0xca9e, 0xca9f, 0xcaa0, 0xcb40, 0xcb41, 0xcb42, 0xcb43, 0xcb44, 0xcb45, 0xcb46, 0xcb47, 0xcb48, 0xcb49, 0xcb4a, 0xcb4b, 0xcb4c, 0xcb4d, 0xcb4e, 0xcb4f, 0xcb50, 0xcb51, 0xcb52, 0xcb53, 0xcb54, 0xcb55, 0xcb56, 0xcb57, 0xcb58, 0xcb59, 0xcb5a, 0xcb5b, 0xcb5c, 0xcb5d, 0xcb5e, 0xcb5f, 0xcb60, 0xcb61, 0xcb62, 0xcb63, 0xcb64, 0xcb65, 0xcb66, 0xcb67, 0xcb68, 0xcb69, 0xcb6a, 0xcb6b, 0xcb6c, 0xcb6d, 0xcb6e, 0xcb6f, 0xcb70, 0xcb71, 0xcb72, 0xcb73, 0xcb74, 0xcb75, 0xcb76, 0xcb77, 0xcb78, 0xcb79, 0xcb7a, 0xcb7b, 0xcb7c, 0xcb7d, 0xcb7e, 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, 0xcb9c, 0xcb9d, 0xcb9e, 0xcb9f, 0xcba0, 0xcc40, 0xcc41, 0xcc42, 0xcc43, 0xcc44, 0xcc45, 0xcc46, 0xcc47, 0xcc48, 0xcc49, 0xcc4a, 0xcc4b, 0xcc4c, 0xcc4d, 0xcc4e, 0xcc4f, 0xcc50, 0xcc51, 0xcc52, 0xcc53, 0xcc54, 0xcc55, 0xcc56, 0xcc57, 0xcc58, 0xcc59, 0xcc5a, 0xcc5b, 0xcc5c, 0xcc5d, 0xcc5e, 0xcc5f, 0xcc60, 0xcc61, 0xcc62, 0xcc63, 0xcc64, 0xcc65, 0xcc66, 0xcc67, 0xcc68, 0xcc69, 0xcc6a, 0xcc6b, 0xcc6c, 0xcc6d, 0xcc6e, 0xcc6f, 0xcc70, 0xcc71, 0xcc72, 0xcc73, 0xcc74, 0xcc75, 0xcc76, 0xcc77, 0xcc78, 0xcc79, 0xcc7a, 0xcc7b, 0xcc7c, 0xcc7d, 0xcc7e, 0xcc80, 0xcc81, 0xcc82, 0xcc83, 0xcc84, 0xcc85, 0xcc86, 0xcc87, 0xcc88, 0xcc89, 0xcc8a, 0xcc8b, 0xcc8c, 0xcc8d, 0xcc8e, 0xcc8f, 0xcc90, 0xcc91, 0xcc92, 0xcc93, 0xcc94, 0xcc95, 0xcc96, 0xcc97, 0xcc98, 0xcc99, 0xcc9a, 0xcc9b, 0xcc9c, 0xcc9d, 0xcc9e, 0xcc9f, 0xcca0, 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, 0xcd5c, 0xcd5d, 0xcd5e, 0xcd5f, 0xcd60, 0xcd61, 0xcd62, 0xcd63, 0xcd64, 0xcd65, 0xcd66, 0xcd67, 0xcd68, 0xcd69, 0xcd6a, 0xcd6b, 0xcd6c, 0xcd6d, 0xcd6e, 0xcd6f, 0xcd70, 0xcd71, 0xcd72, 0xcd73, 0xcd74, 0xcd75, 0xcd76, 0xcd77, 0xcd78, 0xcd79, 0xcd7a, 0xcd7b, 0xcd7c, 0xcd7d, 0xcd7e, 0xcd80, 0xcd81, 0xcd82, 0xcd83, 0xcd84, 0xcd85, 0xcd86, 0xcd87, 0xcd88, 0xcd89, 0xcd8a, 0xcd8b, 0xcd8c, 0xcd8d, 0xcd8e, 0xcd8f, 0xcd90, 0xcd91, 0xcd92, 0xcd93, 0xcd94, 0xcd95, 0xcd96, 0xcd97, 0xcd98, 0xcd99, 0xcd9a, 0xcd9b, 0xcd9c, 0xcd9d, 0xcd9e, 0xcd9f, 0xcda0, 0xce40, 0xce41, 0xce42, 0xce43, 0xce44, 0xce45, 0xce46, 0xce47, 0xce48, 0xce49, 0xce4a, 0xce4b, 0xce4c, 0xce4d, 0xce4e, 0xce4f, 0xce50, 0xce51, 0xce52, 0xce53, 0xce54, 0xce55, 0xce56, 0xce57, 0xce58, 0xce59, 0xce5a, 0xce5b, 0xce5c, 0xce5d, 0xce5e, 0xce5f, 0xce60, 0xce61, 0xce62, 0xce63, 0xce64, 0xce65, 0xce66, 0xce67, 0xce68, 0xce69, 0xce6a, 0xce6b, 0xce6c, 0xce6d, 0xce6e, 0xce6f, 0xce70, 0xce71, 0xce72, 0xce73, 0xce74, 0xce75, 0xce76, 0xce77, 0xce78, 0xce79, 0xce7a, 0xce7b, 0xce7c, 0xce7d, 0xce7e, 0xce80, 0xce81, 0xce82, 0xce83, 0xce84, 0xce85, 0xce86, 0xce87, 0xce88, 0xce89, 0xce8a, 0xce8b, 0xce8c, 0xce8d, 0xce8e, 0xce8f, 0xce90, 0xce91, 0xce92, 0xce93, 0xce94, 0xce95, 0xce96, 0xce97, 0xce98, 0xce99, 0xce9a, 0xce9b, 0xce9c, 0xce9d, 0xce9e, 0xce9f, 0xcea0, 0xcf40, 0xcf41, 0xcf42, 0xcf43, 0xcf44, 0xcf45, 0xcf46, 0xcf47, 0xcf48, 0xcf49, 0xcf4a, 0xcf4b, 0xcf4c, 0xcf4d, 0xcf4e, 0xcf4f, 0xcf50, 0xcf51, 0xcf52, 0xcf53, 0xcf54, 0xcf55, 0xcf56, 0xcf57, 0xcf58, 0xcf59, 0xcf5a, 0xcf5b, 0xcf5c, 0xcf5d, 0xcf5e, 0xcf5f, 0xcf60, 0xcf61, 0xcf62, 0xcf63, 0xcf64, 0xcf65, 0xcf66, 0xcf67, 0xcf68, 0xcf69, 0xcf6a, 0xcf6b, 0xcf6c, 0xcf6d, 0xcf6e, 0xcf6f, 0xcf70, 0xcf71, 0xcf72, 0xcf73, 0xcf74, 0xcf75, 0xcf76, 0xcf77, 0xcf78, 0xcf79, 0xcf7a, 0xcf7b, 0xcf7c, 0xcf7d, 0xcf7e, 0xcf80, 0xcf81, 0xcf82, 0xcf83, 0xcf84, 0xcf85, 0xcf86, 0xcf87, 0xcf88, 0xcf89, 0xcf8a, 0xcf8b, 0xcf8c, 0xcf8d, 0xcf8e, 0xcf8f, 0xcf90, 0xcf91, 0xcf92, 0xcf93, 0xcf94, 0xcf95, 0xcf96, 0xcf97, 0xcf98, 0xcf99, 0xcf9a, 0xcf9b, 0xcf9c, 0xcf9d, 0xcf9e, 0xcf9f, 0xcfa0, 0xd040, 0xd041, 0xd042, 0xd043, 0xd044, 0xd045, 0xd046, 0xd047, 0xd048, 0xd049, 0xd04a, 0xd04b, 0xd04c, 0xd04d, 0xd04e, 0xd04f, 0xd050, 0xd051, 0xd052, 0xd053, 0xd054, 0xd055, 0xd056, 0xd057, 0xd058, 0xd059, 0xd05a, 0xd05b, 0xd05c, 0xd05d, 0xd05e, 0xd05f, 0xd060, 0xd061, 0xd062, 0xd063, 0xd064, 0xd065, 0xd066, 0xd067, 0xd068, 0xd069, 0xd06a, 0xd06b, 0xd06c, 0xd06d, 0xd06e, 0xd06f, 0xd070, 0xd071, 0xd072, 0xd073, 0xd074, 0xd075, 0xd076, 0xd077, 0xd078, 0xd079, 0xd07a, 0xd07b, 0xd07c, 0xd07d, 0xd07e, 0xd080, 0xd081, 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, 0xd140, 0xd141, 0xd142, 0xd143, 0xd144, 0xd145, 0xd146, 0xd147, 0xd148, 0xd149, 0xd14a, 0xd14b, 0xd14c, 0xd14d, 0xd14e, 0xd14f, 0xd150, 0xd151, 0xd152, 0xd153, 0xd154, 0xd155, 0xd156, 0xd157, 0xd158, 0xd159, 0xd15a, 0xd15b, 0xd15c, 0xd15d, 0xd15e, 0xd15f, 0xd160, 0xd161, 0xd162, 0xd163, 0xd164, 0xd165, 0xd166, 0xd167, 0xd168, 0xd169, 0xd16a, 0xd16b, 0xd16c, 0xd16d, 0xd16e, 0xd16f, 0xd170, 0xd171, 0xd172, 0xd173, 0xd174, 0xd175, 0xd176, 0xd177, 0xd178, 0xd179, 0xd17a, 0xd17b, 0xd17c, 0xd17d, 0xd17e, 0xd180, 0xd181, 0xd182, 0xd183, 0xd184, 0xd185, 0xd186, 0xd187, 0xd188, 0xd189, 0xd18a, 0xd18b, 0xd18c, 0xd18d, 0xd18e, 0xd18f, 0xd190, 0xd191, 0xd192, 0xd193, 0xd194, 0xd195, 0xd196, 0xd197, 0xd198, 0xd199, 0xd19a, 0xd19b, 0xd19c, 0xd19d, 0xd19e, 0xd19f, 0xd1a0, 0xd240, 0xd241, 0xd242, 0xd243, 0xd244, 0xd245, 0xd246, 0xd247, 0xd248, 0xd249, 0xd24a, 0xd24b, 0xd24c, 0xd24d, 0xd24e, 0xd24f, 0xd250, 0xd251, 0xd252, 0xd253, 0xd254, 0xd255, 0xd256, 0xd257, 0xd258, 0xd259, 0xd25a, 0xd25b, 0xd25c, 0xd25d, 0xd25e, 0xd25f, 0xd260, 0xd261, 0xd262, 0xd263, 0xd264, 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, 0xd280, 0xd281, 0xd282, 0xd283, 0xd284, 0xd285, 0xd286, 0xd287, 0xd288, 0xd289, 0xd28a, 0xd28b, 0xd28c, 0xd28d, 0xd28e, 0xd28f, 0xd290, 0xd291, 0xd292, 0xd293, 0xd294, 0xd295, 0xd296, 0xd297, 0xd298, 0xd299, 0xd29a, 0xd29b, 0xd29c, 0xd29d, 0xd29e, 0xd29f, 0xd2a0, 0xd340, 0xd341, 0xd342, 0xd343, 0xd344, 0xd345, 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, 0xd37c, 0xd37d, 0xd37e, 0xd380, 0xd381, 0xd382, 0xd383, 0xd384, 0xd385, 0xd386, 0xd387, 0xd388, 0xd389, 0xd38a, 0xd38b, 0xd38c, 0xd38d, 0xd38e, 0xd38f, 0xd390, 0xd391, 0xd392, 0xd393, 0xd394, 0xd395, 0xd396, 0xd397, 0xd398, 0xd399, 0xd39a, 0xd39b, 0xd39c, 0xd39d, 0xd39e, 0xd39f, 0xd3a0, 0xd440, 0xd441, 0xd442, 0xd443, 0xd444, 0xd445, 0xd446, 0xd447, 0xd448, 0xd449, 0xd44a, 0xd44b, 0xd44c, 0xd44d, 0xd44e, 0xd44f, 0xd450, 0xd451, 0xd452, 0xd453, 0xd454, 0xd455, 0xd456, 0xd457, 0xd458, 0xd459, 0xd45a, 0xd45b, 0xd45c, 0xd45d, 0xd45e, 0xd45f, 0xd460, 0xd461, 0xd462, 0xd463, 0xd464, 0xd465, 0xd466, 0xd467, 0xd468, 0xd469, 0xd46a, 0xd46b, 0xd46c, 0xd46d, 0xd46e, 0xd46f, 0xd470, 0xd471, 0xd472, 0xd473, 0xd474, 0xd475, 0xd476, 0xd477, 0xd478, 0xd479, 0xd47a, 0xd47b, 0xd47c, 0xd47d, 0xd47e, 0xd480, 0xd481, 0xd482, 0xd483, 0xd484, 0xd485, 0xd486, 0xd487, 0xd488, 0xd489, 0xd48a, 0xd48b, 0xd48c, 0xd48d, 0xd48e, 0xd48f, 0xd490, 0xd491, 0xd492, 0xd493, 0xd494, 0xd495, 0xd496, 0xd497, 0xd498, 0xd499, 0xd49a, 0xd49b, 0xd49c, 0xd49d, 0xd49e, 0xd49f, 0xd4a0, 0xd540, 0xd541, 0xd542, 0xd543, 0xd544, 0xd545, 0xd546, 0xd547, 0xd548, 0xd549, 0xd54a, 0xd54b, 0xd54c, 0xd54d, 0xd54e, 0xd54f, 0xd550, 0xd551, 0xd552, 0xd553, 0xd554, 0xd555, 0xd556, 0xd557, 0xd558, 0xd559, 0xd55a, 0xd55b, 0xd55c, 0xd55d, 0xd55e, 0xd55f, 0xd560, 0xd561, 0xd562, 0xd563, 0xd564, 0xd565, 0xd566, 0xd567, 0xd568, 0xd569, 0xd56a, 0xd56b, 0xd56c, 0xd56d, 0xd56e, 0xd56f, 0xd570, 0xd571, 0xd572, 0xd573, 0xd574, 0xd575, 0xd576, 0xd577, 0xd578, 0xd579, 0xd57a, 0xd57b, 0xd57c, 0xd57d, 0xd57e, 0xd580, 0xd581, 0xd582, 0xd583, 0xd584, 0xd585, 0xd586, 0xd587, 0xd588, 0xd589, 0xd58a, 0xd58b, 0xd58c, 0xd58d, 0xd58e, 0xd58f, 0xd590, 0xd591, 0xd592, 0xd593, 0xd594, 0xd595, 0xd596, 0xd597, 0xd598, 0xd599, 0xd59a, 0xd59b, 0xd59c, 0xd59d, 0xd59e, 0xd59f, 0xd5a0, 0xd640, 0xd641, 0xd642, 0xd643, 0xd644, 0xd645, 0xd646, 0xd647, 0xd648, 0xd649, 0xd64a, 0xd64b, 0xd64c, 0xd64d, 0xd64e, 0xd64f, 0xd650, 0xd651, 0xd652, 0xd653, 0xd654, 0xd655, 0xd656, 0xd657, 0xd658, 0xd659, 0xd65a, 0xd65b, 0xd65c, 0xd65d, 0xd65e, 0xd65f, 0xd660, 0xd661, 0xd662, 0xd663, 0xd664, 0xd665, 0xd666, 0xd667, 0xd668, 0xd669, 0xd66a, 0xd66b, 0xd66c, 0xd66d, 0xd66e, 0xd66f, 0xd670, 0xd671, 0xd672, 0xd673, 0xd674, 0xd675, 0xd676, 0xd677, 0xd678, 0xd679, 0xd67a, 0xd67b, 0xd67c, 0xd67d, 0xd67e, 0xd680, 0xd681, 0xd682, 0xd683, 0xd684, 0xd685, 0xd686, 0xd687, 0xd688, 0xd689, 0xd68a, 0xd68b, 0xd68c, 0xd68d, 0xd68e, 0xd68f, 0xd690, 0xd691, 0xd692, 0xd693, 0xd694, 0xd695, 0xd696, 0xd697, 0xd698, 0xd699, 0xd69a, 0xd69b, 0xd69c, 0xd69d, 0xd69e, 0xd69f, 0xd6a0, 0xd740, 0xd741, 0xd742, 0xd743, 0xd744, 0xd745, 0xd746, 0xd747, 0xd748, 0xd749, 0xd74a, 0xd74b, 0xd74c, 0xd74d, 0xd74e, 0xd74f, 0xd750, 0xd751, 0xd752, 0xd753, 0xd754, 0xd755, 0xd756, 0xd757, 0xd758, 0xd759, 0xd75a, 0xd75b, 0xd75c, 0xd75d, 0xd75e, 0xd75f, 0xd760, 0xd761, 0xd762, 0xd763, 0xd764, 0xd765, 0xd766, 0xd767, 0xd768, 0xd769, 0xd76a, 0xd76b, 0xd76c, 0xd76d, 0xd76e, 0xd76f, 0xd770, 0xd771, 0xd772, 0xd773, 0xd774, 0xd775, 0xd776, 0xd777, 0xd778, 0xd779, 0xd77a, 0xd77b, 0xd77c, 0xd77d, 0xd77e, 0xd780, 0xd781, 0xd782, 0xd783, 0xd784, 0xd785, 0xd786, 0xd787, 0xd788, 0xd789, 0xd78a, 0xd78b, 0xd78c, 0xd78d, 0xd78e, 0xd78f, 0xd790, 0xd791, 0xd792, 0xd793, 0xd794, 0xd795, 0xd796, 0xd797, 0xd798, 0xd799, 0xd79a, 0xd79b, 0xd79c, 0xd79d, 0xd79e, 0xd79f, 0xd7a0, 0xd840, 0xd841, 0xd842, 0xd843, 0xd844, 0xd845, 0xd846, 0xd847, 0xd848, 0xd849, 0xd84a, 0xd84b, 0xd84c, 0xd84d, 0xd84e, 0xd84f, 0xd850, 0xd851, 0xd852, 0xd853, 0xd854, 0xd855, 0xd856, 0xd857, 0xd858, 0xd859, 0xd85a, 0xd85b, 0xd85c, 0xd85d, 0xd85e, 0xd85f, 0xd860, 0xd861, 0xd862, 0xd863, 0xd864, 0xd865, 0xd866, 0xd867, 0xd868, 0xd869, 0xd86a, 0xd86b, 0xd86c, 0xd86d, 0xd86e, 0xd86f, 0xd870, 0xd871, 0xd872, 0xd873, 0xd874, 0xd875, 0xd876, 0xd877, 0xd878, 0xd879, 0xd87a, 0xd87b, 0xd87c, 0xd87d, 0xd87e, 0xd880, 0xd881, 0xd882, 0xd883, 0xd884, 0xd885, 0xd886, 0xd887, 0xd888, 0xd889, 0xd88a, 0xd88b, 0xd88c, 0xd88d, 0xd88e, 0xd88f, 0xd890, 0xd891, 0xd892, 0xd893, 0xd894, 0xd895, 0xd896, 0xd897, 0xd898, 0xd899, 0xd89a, 0xd89b, 0xd89c, 0xd89d, 0xd89e, 0xd89f, 0xd8a0, 0xd940, 0xd941, 0xd942, 0xd943, 0xd944, 0xd945, 0xd946, 0xd947, 0xd948, 0xd949, 0xd94a, 0xd94b, 0xd94c, 0xd94d, 0xd94e, 0xd94f, 0xd950, 0xd951, 0xd952, 0xd953, 0xd954, 0xd955, 0xd956, 0xd957, 0xd958, 0xd959, 0xd95a, 0xd95b, 0xd95c, 0xd95d, 0xd95e, 0xd95f, 0xd960, 0xd961, 0xd962, 0xd963, 0xd964, 0xd965, 0xd966, 0xd967, 0xd968, 0xd969, 0xd96a, 0xd96b, 0xd96c, 0xd96d, 0xd96e, 0xd96f, 0xd970, 0xd971, 0xd972, 0xd973, 0xd974, 0xd975, 0xd976, 0xd977, 0xd978, 0xd979, 0xd97a, 0xd97b, 0xd97c, 0xd97d, 0xd97e, 0xd980, 0xd981, 0xd982, 0xd983, 0xd984, 0xd985, 0xd986, 0xd987, 0xd988, 0xd989, 0xd98a, 0xd98b, 0xd98c, 0xd98d, 0xd98e, 0xd98f, 0xd990, 0xd991, 0xd992, 0xd993, 0xd994, 0xd995, 0xd996, 0xd997, 0xd998, 0xd999, 0xd99a, 0xd99b, 0xd99c, 0xd99d, 0xd99e, 0xd99f, 0xd9a0, 0xda40, 0xda41, 0xda42, 0xda43, 0xda44, 0xda45, 0xda46, 0xda47, 0xda48, 0xda49, 0xda4a, 0xda4b, 0xda4c, 0xda4d, 0xda4e, 0xda4f, 0xda50, 0xda51, 0xda52, 0xda53, 0xda54, 0xda55, 0xda56, 0xda57, 0xda58, 0xda59, 0xda5a, 0xda5b, 0xda5c, 0xda5d, 0xda5e, 0xda5f, 0xda60, 0xda61, 0xda62, 0xda63, 0xda64, 0xda65, 0xda66, 0xda67, 0xda68, 0xda69, 0xda6a, 0xda6b, 0xda6c, 0xda6d, 0xda6e, 0xda6f, 0xda70, 0xda71, 0xda72, 0xda73, 0xda74, 0xda75, 0xda76, 0xda77, 0xda78, 0xda79, 0xda7a, 0xda7b, 0xda7c, 0xda7d, 0xda7e, 0xda80, 0xda81, 0xda82, 0xda83, 0xda84, 0xda85, 0xda86, 0xda87, 0xda88, 0xda89, 0xda8a, 0xda8b, 0xda8c, 0xda8d, 0xda8e, 0xda8f, 0xda90, 0xda91, 0xda92, 0xda93, 0xda94, 0xda95, 0xda96, 0xda97, 0xda98, 0xda99, 0xda9a, 0xda9b, 0xda9c, 0xda9d, 0xda9e, 0xda9f, 0xdaa0, 0xdb40, 0xdb41, 0xdb42, 0xdb43, 0xdb44, 0xdb45, 0xdb46, 0xdb47, 0xdb48, 0xdb49, 0xdb4a, 0xdb4b, 0xdb4c, 0xdb4d, 0xdb4e, 0xdb4f, 0xdb50, 0xdb51, 0xdb52, 0xdb53, 0xdb54, 0xdb55, 0xdb56, 0xdb57, 0xdb58, 0xdb59, 0xdb5a, 0xdb5b, 0xdb5c, 0xdb5d, 0xdb5e, 0xdb5f, 0xdb60, 0xdb61, 0xdb62, 0xdb63, 0xdb64, 0xdb65, 0xdb66, 0xdb67, 0xdb68, 0xdb69, 0xdb6a, 0xdb6b, 0xdb6c, 0xdb6d, 0xdb6e, 0xdb6f, 0xdb70, 0xdb71, 0xdb72, 0xdb73, 0xdb74, 0xdb75, 0xdb76, 0xdb77, 0xdb78, 0xdb79, 0xdb7a, 0xdb7b, 0xdb7c, 0xdb7d, 0xdb7e, 0xdb80, 0xdb81, 0xdb82, 0xdb83, 0xdb84, 0xdb85, 0xdb86, 0xdb87, 0xdb88, 0xdb89, 0xdb8a, 0xdb8b, 0xdb8c, 0xdb8d, 0xdb8e, 0xdb8f, 0xdb90, 0xdb91, 0xdb92, 0xdb93, 0xdb94, 0xdb95, 0xdb96, 0xdb97, 0xdb98, 0xdb99, 0xdb9a, 0xdb9b, 0xdb9c, 0xdb9d, 0xdb9e, 0xdb9f, 0xdba0, 0xdc40, 0xdc41, 0xdc42, 0xdc43, 0xdc44, 0xdc45, 0xdc46, 0xdc47, 0xdc48, 0xdc49, 0xdc4a, 0xdc4b, 0xdc4c, 0xdc4d, 0xdc4e, 0xdc4f, 0xdc50, 0xdc51, 0xdc52, 0xdc53, 0xdc54, 0xdc55, 0xdc56, 0xdc57, 0xdc58, 0xdc59, 0xdc5a, 0xdc5b, 0xdc5c, 0xdc5d, 0xdc5e, 0xdc5f, 0xdc60, 0xdc61, 0xdc62, 0xdc63, 0xdc64, 0xdc65, 0xdc66, 0xdc67, 0xdc68, 0xdc69, 0xdc6a, 0xdc6b, 0xdc6c, 0xdc6d, 0xdc6e, 0xdc6f, 0xdc70, 0xdc71, 0xdc72, 0xdc73, 0xdc74, 0xdc75, 0xdc76, 0xdc77, 0xdc78, 0xdc79, 0xdc7a, 0xdc7b, 0xdc7c, 0xdc7d, 0xdc7e, 0xdc80, 0xdc81, 0xdc82, 0xdc83, 0xdc84, 0xdc85, 0xdc86, 0xdc87, 0xdc88, 0xdc89, 0xdc8a, 0xdc8b, 0xdc8c, 0xdc8d, 0xdc8e, 0xdc8f, 0xdc90, 0xdc91, 0xdc92, 0xdc93, 0xdc94, 0xdc95, 0xdc96, 0xdc97, 0xdc98, 0xdc99, 0xdc9a, 0xdc9b, 0xdc9c, 0xdc9d, 0xdc9e, 0xdc9f, 0xdca0, 0xdd40, 0xdd41, 0xdd42, 0xdd43, 0xdd44, 0xdd45, 0xdd46, 0xdd47, 0xdd48, 0xdd49, 0xdd4a, 0xdd4b, 0xdd4c, 0xdd4d, 0xdd4e, 0xdd4f, 0xdd50, 0xdd51, 0xdd52, 0xdd53, 0xdd54, 0xdd55, 0xdd56, 0xdd57, 0xdd58, 0xdd59, 0xdd5a, 0xdd5b, 0xdd5c, 0xdd5d, 0xdd5e, 0xdd5f, 0xdd60, 0xdd61, 0xdd62, 0xdd63, 0xdd64, 0xdd65, 0xdd66, 0xdd67, 0xdd68, 0xdd69, 0xdd6a, 0xdd6b, 0xdd6c, 0xdd6d, 0xdd6e, 0xdd6f, 0xdd70, 0xdd71, 0xdd72, 0xdd73, 0xdd74, 0xdd75, 0xdd76, 0xdd77, 0xdd78, 0xdd79, 0xdd7a, 0xdd7b, 0xdd7c, 0xdd7d, 0xdd7e, 0xdd80, 0xdd81, 0xdd82, 0xdd83, 0xdd84, 0xdd85, 0xdd86, 0xdd87, 0xdd88, 0xdd89, 0xdd8a, 0xdd8b, 0xdd8c, 0xdd8d, 0xdd8e, 0xdd8f, 0xdd90, 0xdd91, 0xdd92, 0xdd93, 0xdd94, 0xdd95, 0xdd96, 0xdd97, 0xdd98, 0xdd99, 0xdd9a, 0xdd9b, 0xdd9c, 0xdd9d, 0xdd9e, 0xdd9f, 0xdda0, 0xde40, 0xde41, 0xde42, 0xde43, 0xde44, 0xde45, 0xde46, 0xde47, 0xde48, 0xde49, 0xde4a, 0xde4b, 0xde4c, 0xde4d, 0xde4e, 0xde4f, 0xde50, 0xde51, 0xde52, 0xde53, 0xde54, 0xde55, 0xde56, 0xde57, 0xde58, 0xde59, 0xde5a, 0xde5b, 0xde5c, 0xde5d, 0xde5e, 0xde5f, 0xde60, 0xde61, 0xde62, 0xde63, 0xde64, 0xde65, 0xde66, 0xde67, 0xde68, 0xde69, 0xde6a, 0xde6b, 0xde6c, 0xde6d, 0xde6e, 0xde6f, 0xde70, 0xde71, 0xde72, 0xde73, 0xde74, 0xde75, 0xde76, 0xde77, 0xde78, 0xde79, 0xde7a, 0xde7b, 0xde7c, 0xde7d, 0xde7e, 0xde80, 0xde81, 0xde82, 0xde83, 0xde84, 0xde85, 0xde86, 0xde87, 0xde88, 0xde89, 0xde8a, 0xde8b, 0xde8c, 0xde8d, 0xde8e, 0xde8f, 0xde90, 0xde91, 0xde92, 0xde93, 0xde94, 0xde95, 0xde96, 0xde97, 0xde98, 0xde99, 0xde9a, 0xde9b, 0xde9c, 0xde9d, 0xde9e, 0xde9f, 0xdea0, 0xdf40, 0xdf41, 0xdf42, 0xdf43, 0xdf44, 0xdf45, 0xdf46, 0xdf47, 0xdf48, 0xdf49, 0xdf4a, 0xdf4b, 0xdf4c, 0xdf4d, 0xdf4e, 0xdf4f, 0xdf50, 0xdf51, 0xdf52, 0xdf53, 0xdf54, 0xdf55, 0xdf56, 0xdf57, 0xdf58, 0xdf59, 0xdf5a, 0xdf5b, 0xdf5c, 0xdf5d, 0xdf5e, 0xdf5f, 0xdf60, 0xdf61, 0xdf62, 0xdf63, 0xdf64, 0xdf65, 0xdf66, 0xdf67, 0xdf68, 0xdf69, 0xdf6a, 0xdf6b, 0xdf6c, 0xdf6d, 0xdf6e, 0xdf6f, 0xdf70, 0xdf71, 0xdf72, 0xdf73, 0xdf74, 0xdf75, 0xdf76, 0xdf77, 0xdf78, 0xdf79, 0xdf7a, 0xdf7b, 0xdf7c, 0xdf7d, 0xdf7e, 0xdf80, 0xdf81, 0xdf82, 0xdf83, 0xdf84, 0xdf85, 0xdf86, 0xdf87, 0xdf88, 0xdf89, 0xdf8a, 0xdf8b, 0xdf8c, 0xdf8d, 0xdf8e, 0xdf8f, 0xdf90, 0xdf91, 0xdf92, 0xdf93, 0xdf94, 0xdf95, 0xdf96, 0xdf97, 0xdf98, 0xdf99, 0xdf9a, 0xdf9b, 0xdf9c, 0xdf9d, 0xdf9e, 0xdf9f, 0xdfa0, 0xe040, 0xe041, 0xe042, 0xe043, 0xe044, 0xe045, 0xe046, 0xe047, 0xe048, 0xe049, 0xe04a, 0xe04b, 0xe04c, 0xe04d, 0xe04e, 0xe04f, 0xe050, 0xe051, 0xe052, 0xe053, 0xe054, 0xe055, 0xe056, 0xe057, 0xe058, 0xe059, 0xe05a, 0xe05b, 0xe05c, 0xe05d, 0xe05e, 0xe05f, 0xe060, 0xe061, 0xe062, 0xe063, 0xe064, 0xe065, 0xe066, 0xe067, 0xe068, 0xe069, 0xe06a, 0xe06b, 0xe06c, 0xe06d, 0xe06e, 0xe06f, 0xe070, 0xe071, 0xe072, 0xe073, 0xe074, 0xe075, 0xe076, 0xe077, 0xe078, 0xe079, 0xe07a, 0xe07b, 0xe07c, 0xe07d, 0xe07e, 0xe080, 0xe081, 0xe082, 0xe083, 0xe084, 0xe085, 0xe086, 0xe087, 0xe088, 0xe089, 0xe08a, 0xe08b, 0xe08c, 0xe08d, 0xe08e, 0xe08f, 0xe090, 0xe091, 0xe092, 0xe093, 0xe094, 0xe095, 0xe096, 0xe097, 0xe098, 0xe099, 0xe09a, 0xe09b, 0xe09c, 0xe09d, 0xe09e, 0xe09f, 0xe0a0, 0xe140, 0xe141, 0xe142, 0xe143, 0xe144, 0xe145, 0xe146, 0xe147, 0xe148, 0xe149, 0xe14a, 0xe14b, 0xe14c, 0xe14d, 0xe14e, 0xe14f, 0xe150, 0xe151, 0xe152, 0xe153, 0xe154, 0xe155, 0xe156, 0xe157, 0xe158, 0xe159, 0xe15a, 0xe15b, 0xe15c, 0xe15d, 0xe15e, 0xe15f, 0xe160, 0xe161, 0xe162, 0xe163, 0xe164, 0xe165, 0xe166, 0xe167, 0xe168, 0xe169, 0xe16a, 0xe16b, 0xe16c, 0xe16d, 0xe16e, 0xe16f, 0xe170, 0xe171, 0xe172, 0xe173, 0xe174, 0xe175, 0xe176, 0xe177, 0xe178, 0xe179, 0xe17a, 0xe17b, 0xe17c, 0xe17d, 0xe17e, 0xe180, 0xe181, 0xe182, 0xe183, 0xe184, 0xe185, 0xe186, 0xe187, 0xe188, 0xe189, 0xe18a, 0xe18b, 0xe18c, 0xe18d, 0xe18e, 0xe18f, 0xe190, 0xe191, 0xe192, 0xe193, 0xe194, 0xe195, 0xe196, 0xe197, 0xe198, 0xe199, 0xe19a, 0xe19b, 0xe19c, 0xe19d, 0xe19e, 0xe19f, 0xe1a0, 0xe240, 0xe241, 0xe242, 0xe243, 0xe244, 0xe245, 0xe246, 0xe247, 0xe248, 0xe249, 0xe24a, 0xe24b, 0xe24c, 0xe24d, 0xe24e, 0xe24f, 0xe250, 0xe251, 0xe252, 0xe253, 0xe254, 0xe255, 0xe256, 0xe257, 0xe258, 0xe259, 0xe25a, 0xe25b, 0xe25c, 0xe25d, 0xe25e, 0xe25f, 0xe260, 0xe261, 0xe262, 0xe263, 0xe264, 0xe265, 0xe266, 0xe267, 0xe268, 0xe269, 0xe26a, 0xe26b, 0xe26c, 0xe26d, 0xe26e, 0xe26f, 0xe270, 0xe271, 0xe272, 0xe273, 0xe274, 0xe275, 0xe276, 0xe277, 0xe278, 0xe279, 0xe27a, 0xe27b, 0xe27c, 0xe27d, 0xe27e, 0xe280, 0xe281, 0xe282, 0xe283, 0xe284, 0xe285, 0xe286, 0xe287, 0xe288, 0xe289, 0xe28a, 0xe28b, 0xe28c, 0xe28d, 0xe28e, 0xe28f, 0xe290, 0xe291, 0xe292, 0xe293, 0xe294, 0xe295, 0xe296, 0xe297, 0xe298, 0xe299, 0xe29a, 0xe29b, 0xe29c, 0xe29d, 0xe29e, 0xe29f, 0xe2a0, 0xe340, 0xe341, 0xe342, 0xe343, 0xe344, 0xe345, 0xe346, 0xe347, 0xe348, 0xe349, 0xe34a, 0xe34b, 0xe34c, 0xe34d, 0xe34e, 0xe34f, 0xe350, 0xe351, 0xe352, 0xe353, 0xe354, 0xe355, 0xe356, 0xe357, 0xe358, 0xe359, 0xe35a, 0xe35b, 0xe35c, 0xe35d, 0xe35e, 0xe35f, 0xe360, 0xe361, 0xe362, 0xe363, 0xe364, 0xe365, 0xe366, 0xe367, 0xe368, 0xe369, 0xe36a, 0xe36b, 0xe36c, 0xe36d, 0xe36e, 0xe36f, 0xe370, 0xe371, 0xe372, 0xe373, 0xe374, 0xe375, 0xe376, 0xe377, 0xe378, 0xe379, 0xe37a, 0xe37b, 0xe37c, 0xe37d, 0xe37e, 0xe380, 0xe381, 0xe382, 0xe383, 0xe384, 0xe385, 0xe386, 0xe387, 0xe388, 0xe389, 0xe38a, 0xe38b, 0xe38c, 0xe38d, 0xe38e, 0xe38f, 0xe390, 0xe391, 0xe392, 0xe393, 0xe394, 0xe395, 0xe396, 0xe397, 0xe398, 0xe399, 0xe39a, 0xe39b, 0xe39c, 0xe39d, 0xe39e, 0xe39f, 0xe3a0, 0xe440, 0xe441, 0xe442, 0xe443, 0xe444, 0xe445, 0xe446, 0xe447, 0xe448, 0xe449, 0xe44a, 0xe44b, 0xe44c, 0xe44d, 0xe44e, 0xe44f, 0xe450, 0xe451, 0xe452, 0xe453, 0xe454, 0xe455, 0xe456, 0xe457, 0xe458, 0xe459, 0xe45a, 0xe45b, 0xe45c, 0xe45d, 0xe45e, 0xe45f, 0xe460, 0xe461, 0xe462, 0xe463, 0xe464, 0xe465, 0xe466, 0xe467, 0xe468, 0xe469, 0xe46a, 0xe46b, 0xe46c, 0xe46d, 0xe46e, 0xe46f, 0xe470, 0xe471, 0xe472, 0xe473, 0xe474, 0xe475, 0xe476, 0xe477, 0xe478, 0xe479, 0xe47a, 0xe47b, 0xe47c, 0xe47d, 0xe47e, 0xe480, 0xe481, 0xe482, 0xe483, 0xe484, 0xe485, 0xe486, 0xe487, 0xe488, 0xe489, 0xe48a, 0xe48b, 0xe48c, 0xe48d, 0xe48e, 0xe48f, 0xe490, 0xe491, 0xe492, 0xe493, 0xe494, 0xe495, 0xe496, 0xe497, 0xe498, 0xe499, 0xe49a, 0xe49b, 0xe49c, 0xe49d, 0xe49e, 0xe49f, 0xe4a0, 0xe540, 0xe541, 0xe542, 0xe543, 0xe544, 0xe545, 0xe546, 0xe547, 0xe548, 0xe549, 0xe54a, 0xe54b, 0xe54c, 0xe54d, 0xe54e, 0xe54f, 0xe550, 0xe551, 0xe552, 0xe553, 0xe554, 0xe555, 0xe556, 0xe557, 0xe558, 0xe559, 0xe55a, 0xe55b, 0xe55c, 0xe55d, 0xe55e, 0xe55f, 0xe560, 0xe561, 0xe562, 0xe563, 0xe564, 0xe565, 0xe566, 0xe567, 0xe568, 0xe569, 0xe56a, 0xe56b, 0xe56c, 0xe56d, 0xe56e, 0xe56f, 0xe570, 0xe571, 0xe572, 0xe573, 0xe574, 0xe575, 0xe576, 0xe577, 0xe578, 0xe579, 0xe57a, 0xe57b, 0xe57c, 0xe57d, 0xe57e, 0xe580, 0xe581, 0xe582, 0xe583, 0xe584, 0xe585, 0xe586, 0xe587, 0xe588, 0xe589, 0xe58a, 0xe58b, 0xe58c, 0xe58d, 0xe58e, 0xe58f, 0xe590, 0xe591, 0xe592, 0xe593, 0xe594, 0xe595, 0xe596, 0xe597, 0xe598, 0xe599, 0xe59a, 0xe59b, 0xe59c, 0xe59d, 0xe59e, 0xe59f, 0xe5a0, 0xe640, 0xe641, 0xe642, 0xe643, 0xe644, 0xe645, 0xe646, 0xe647, 0xe648, 0xe649, 0xe64a, 0xe64b, 0xe64c, 0xe64d, 0xe64e, 0xe64f, 0xe650, 0xe651, 0xe652, 0xe653, 0xe654, 0xe655, 0xe656, 0xe657, 0xe658, 0xe659, 0xe65a, 0xe65b, 0xe65c, 0xe65d, 0xe65e, 0xe65f, 0xe660, 0xe661, 0xe662, 0xe663, 0xe664, 0xe665, 0xe666, 0xe667, 0xe668, 0xe669, 0xe66a, 0xe66b, 0xe66c, 0xe66d, 0xe66e, 0xe66f, 0xe670, 0xe671, 0xe672, 0xe673, 0xe674, 0xe675, 0xe676, 0xe677, 0xe678, 0xe679, 0xe67a, 0xe67b, 0xe67c, 0xe67d, 0xe67e, 0xe680, 0xe681, 0xe682, 0xe683, 0xe684, 0xe685, 0xe686, 0xe687, 0xe688, 0xe689, 0xe68a, 0xe68b, 0xe68c, 0xe68d, 0xe68e, 0xe68f, 0xe690, 0xe691, 0xe692, 0xe693, 0xe694, 0xe695, 0xe696, 0xe697, 0xe698, 0xe699, 0xe69a, 0xe69b, 0xe69c, 0xe69d, 0xe69e, 0xe69f, 0xe6a0, 0xe740, 0xe741, 0xe742, 0xe743, 0xe744, 0xe745, 0xe746, 0xe747, 0xe748, 0xe749, 0xe74a, 0xe74b, 0xe74c, 0xe74d, 0xe74e, 0xe74f, 0xe750, 0xe751, 0xe752, 0xe753, 0xe754, 0xe755, 0xe756, 0xe757, 0xe758, 0xe759, 0xe75a, 0xe75b, 0xe75c, 0xe75d, 0xe75e, 0xe75f, 0xe760, 0xe761, 0xe762, 0xe763, 0xe764, 0xe765, 0xe766, 0xe767, 0xe768, 0xe769, 0xe76a, 0xe76b, 0xe76c, 0xe76d, 0xe76e, 0xe76f, 0xe770, 0xe771, 0xe772, 0xe773, 0xe774, 0xe775, 0xe776, 0xe777, 0xe778, 0xe779, 0xe77a, 0xe77b, 0xe77c, 0xe77d, 0xe77e, 0xe780, 0xe781, 0xe782, 0xe783, 0xe784, 0xe785, 0xe786, 0xe787, 0xe788, 0xe789, 0xe78a, 0xe78b, 0xe78c, 0xe78d, 0xe78e, 0xe78f, 0xe790, 0xe791, 0xe792, 0xe793, 0xe794, 0xe795, 0xe796, 0xe797, 0xe798, 0xe799, 0xe79a, 0xe79b, 0xe79c, 0xe79d, 0xe79e, 0xe79f, 0xe7a0, 0xe840, 0xe841, 0xe842, 0xe843, 0xe844, 0xe845, 0xe846, 0xe847, 0xe848, 0xe849, 0xe84a, 0xe84b, 0xe84c, 0xe84d, 0xe84e, 0xe84f, 0xe850, 0xe851, 0xe852, 0xe853, 0xe854, 0xe855, 0xe856, 0xe857, 0xe858, 0xe859, 0xe85a, 0xe85b, 0xe85c, 0xe85d, 0xe85e, 0xe85f, 0xe860, 0xe861, 0xe862, 0xe863, 0xe864, 0xe865, 0xe866, 0xe867, 0xe868, 0xe869, 0xe86a, 0xe86b, 0xe86c, 0xe86d, 0xe86e, 0xe86f, 0xe870, 0xe871, 0xe872, 0xe873, 0xe874, 0xe875, 0xe876, 0xe877, 0xe878, 0xe879, 0xe87a, 0xe87b, 0xe87c, 0xe87d, 0xe87e, 0xe880, 0xe881, 0xe882, 0xe883, 0xe884, 0xe885, 0xe886, 0xe887, 0xe888, 0xe889, 0xe88a, 0xe88b, 0xe88c, 0xe88d, 0xe88e, 0xe88f, 0xe890, 0xe891, 0xe892, 0xe893, 0xe894, 0xe895, 0xe896, 0xe897, 0xe898, 0xe899, 0xe89a, 0xe89b, 0xe89c, 0xe89d, 0xe89e, 0xe89f, 0xe8a0, 0xe940, 0xe941, 0xe942, 0xe943, 0xe944, 0xe945, 0xe946, 0xe947, 0xe948, 0xe949, 0xe94a, 0xe94b, 0xe94c, 0xe94d, 0xe94e, 0xe94f, 0xe950, 0xe951, 0xe952, 0xe953, 0xe954, 0xe955, 0xe956, 0xe957, 0xe958, 0xe959, 0xe95a, 0xe95b, 0xe95c, 0xe95d, 0xe95e, 0xe95f, 0xe960, 0xe961, 0xe962, 0xe963, 0xe964, 0xe965, 0xe966, 0xe967, 0xe968, 0xe969, 0xe96a, 0xe96b, 0xe96c, 0xe96d, 0xe96e, 0xe96f, 0xe970, 0xe971, 0xe972, 0xe973, 0xe974, 0xe975, 0xe976, 0xe977, 0xe978, 0xe979, 0xe97a, 0xe97b, 0xe97c, 0xe97d, 0xe97e, 0xe980, 0xe981, 0xe982, 0xe983, 0xe984, 0xe985, 0xe986, 0xe987, 0xe988, 0xe989, 0xe98a, 0xe98b, 0xe98c, 0xe98d, 0xe98e, 0xe98f, 0xe990, 0xe991, 0xe992, 0xe993, 0xe994, 0xe995, 0xe996, 0xe997, 0xe998, 0xe999, 0xe99a, 0xe99b, 0xe99c, 0xe99d, 0xe99e, 0xe99f, 0xe9a0, 0xea40, 0xea41, 0xea42, 0xea43, 0xea44, 0xea45, 0xea46, 0xea47, 0xea48, 0xea49, 0xea4a, 0xea4b, 0xea4c, 0xea4d, 0xea4e, 0xea4f, 0xea50, 0xea51, 0xea52, 0xea53, 0xea54, 0xea55, 0xea56, 0xea57, 0xea58, 0xea59, 0xea5a, 0xea5b, 0xea5c, 0xea5d, 0xea5e, 0xea5f, 0xea60, 0xea61, 0xea62, 0xea63, 0xea64, 0xea65, 0xea66, 0xea67, 0xea68, 0xea69, 0xea6a, 0xea6b, 0xea6c, 0xea6d, 0xea6e, 0xea6f, 0xea70, 0xea71, 0xea72, 0xea73, 0xea74, 0xea75, 0xea76, 0xea77, 0xea78, 0xea79, 0xea7a, 0xea7b, 0xea7c, 0xea7d, 0xea7e, 0xea80, 0xea81, 0xea82, 0xea83, 0xea84, 0xea85, 0xea86, 0xea87, 0xea88, 0xea89, 0xea8a, 0xea8b, 0xea8c, 0xea8d, 0xea8e, 0xea8f, 0xea90, 0xea91, 0xea92, 0xea93, 0xea94, 0xea95, 0xea96, 0xea97, 0xea98, 0xea99, 0xea9a, 0xea9b, 0xea9c, 0xea9d, 0xea9e, 0xea9f, 0xeaa0, 0xeb40, 0xeb41, 0xeb42, 0xeb43, 0xeb44, 0xeb45, 0xeb46, 0xeb47, 0xeb48, 0xeb49, 0xeb4a, 0xeb4b, 0xeb4c, 0xeb4d, 0xeb4e, 0xeb4f, 0xeb50, 0xeb51, 0xeb52, 0xeb53, 0xeb54, 0xeb55, 0xeb56, 0xeb57, 0xeb58, 0xeb59, 0xeb5a, 0xeb5b, 0xeb5c, 0xeb5d, 0xeb5e, 0xeb5f, 0xeb60, 0xeb61, 0xeb62, 0xeb63, 0xeb64, 0xeb65, 0xeb66, 0xeb67, 0xeb68, 0xeb69, 0xeb6a, 0xeb6b, 0xeb6c, 0xeb6d, 0xeb6e, 0xeb6f, 0xeb70, 0xeb71, 0xeb72, 0xeb73, 0xeb74, 0xeb75, 0xeb76, 0xeb77, 0xeb78, 0xeb79, 0xeb7a, 0xeb7b, 0xeb7c, 0xeb7d, 0xeb7e, 0xeb80, 0xeb81, 0xeb82, 0xeb83, 0xeb84, 0xeb85, 0xeb86, 0xeb87, 0xeb88, 0xeb89, 0xeb8a, 0xeb8b, 0xeb8c, 0xeb8d, 0xeb8e, 0xeb8f, 0xeb90, 0xeb91, 0xeb92, 0xeb93, 0xeb94, 0xeb95, 0xeb96, 0xeb97, 0xeb98, 0xeb99, 0xeb9a, 0xeb9b, 0xeb9c, 0xeb9d, 0xeb9e, 0xeb9f, 0xeba0, 0xec40, 0xec41, 0xec42, 0xec43, 0xec44, 0xec45, 0xec46, 0xec47, 0xec48, 0xec49, 0xec4a, 0xec4b, 0xec4c, 0xec4d, 0xec4e, 0xec4f, 0xec50, 0xec51, 0xec52, 0xec53, 0xec54, 0xec55, 0xec56, 0xec57, 0xec58, 0xec59, 0xec5a, 0xec5b, 0xec5c, 0xec5d, 0xec5e, 0xec5f, 0xec60, 0xec61, 0xec62, 0xec63, 0xec64, 0xec65, 0xec66, 0xec67, 0xec68, 0xec69, 0xec6a, 0xec6b, 0xec6c, 0xec6d, 0xec6e, 0xec6f, 0xec70, 0xec71, 0xec72, 0xec73, 0xec74, 0xec75, 0xec76, 0xec77, 0xec78, 0xec79, 0xec7a, 0xec7b, 0xec7c, 0xec7d, 0xec7e, 0xec80, 0xec81, 0xec82, 0xec83, 0xec84, 0xec85, 0xec86, 0xec87, 0xec88, 0xec89, 0xec8a, 0xec8b, 0xec8c, 0xec8d, 0xec8e, 0xec8f, 0xec90, 0xec91, 0xec92, 0xec93, 0xec94, 0xec95, 0xec96, 0xec97, 0xec98, 0xec99, 0xec9a, 0xec9b, 0xec9c, 0xec9d, 0xec9e, 0xec9f, 0xeca0, 0xed40, 0xed41, 0xed42, 0xed43, 0xed44, 0xed45, 0xed46, 0xed47, 0xed48, 0xed49, 0xed4a, 0xed4b, 0xed4c, 0xed4d, 0xed4e, 0xed4f, 0xed50, 0xed51, 0xed52, 0xed53, 0xed54, 0xed55, 0xed56, 0xed57, 0xed58, 0xed59, 0xed5a, 0xed5b, 0xed5c, 0xed5d, 0xed5e, 0xed5f, 0xed60, 0xed61, 0xed62, 0xed63, 0xed64, 0xed65, 0xed66, 0xed67, 0xed68, 0xed69, 0xed6a, 0xed6b, 0xed6c, 0xed6d, 0xed6e, 0xed6f, 0xed70, 0xed71, 0xed72, 0xed73, 0xed74, 0xed75, 0xed76, 0xed77, 0xed78, 0xed79, 0xed7a, 0xed7b, 0xed7c, 0xed7d, 0xed7e, 0xed80, 0xed81, 0xed82, 0xed83, 0xed84, 0xed85, 0xed86, 0xed87, 0xed88, 0xed89, 0xed8a, 0xed8b, 0xed8c, 0xed8d, 0xed8e, 0xed8f, 0xed90, 0xed91, 0xed92, 0xed93, 0xed94, 0xed95, 0xed96, 0xed97, 0xed98, 0xed99, 0xed9a, 0xed9b, 0xed9c, 0xed9d, 0xed9e, 0xed9f, 0xeda0, 0xee40, 0xee41, 0xee42, 0xee43, 0xee44, 0xee45, 0xee46, 0xee47, 0xee48, 0xee49, 0xee4a, 0xee4b, 0xee4c, 0xee4d, 0xee4e, 0xee4f, 0xee50, 0xee51, 0xee52, 0xee53, 0xee54, 0xee55, 0xee56, 0xee57, 0xee58, 0xee59, 0xee5a, 0xee5b, 0xee5c, 0xee5d, 0xee5e, 0xee5f, 0xee60, 0xee61, 0xee62, 0xee63, 0xee64, 0xee65, 0xee66, 0xee67, 0xee68, 0xee69, 0xee6a, 0xee6b, 0xee6c, 0xee6d, 0xee6e, 0xee6f, 0xee70, 0xee71, 0xee72, 0xee73, 0xee74, 0xee75, 0xee76, 0xee77, 0xee78, 0xee79, 0xee7a, 0xee7b, 0xee7c, 0xee7d, 0xee7e, 0xee80, 0xee81, 0xee82, 0xee83, 0xee84, 0xee85, 0xee86, 0xee87, 0xee88, 0xee89, 0xee8a, 0xee8b, 0xee8c, 0xee8d, 0xee8e, 0xee8f, 0xee90, 0xee91, 0xee92, 0xee93, 0xee94, 0xee95, 0xee96, 0xee97, 0xee98, 0xee99, 0xee9a, 0xee9b, 0xee9c, 0xee9d, 0xee9e, 0xee9f, 0xeea0, 0xef40, 0xef41, 0xef42, 0xef43, 0xef44, 0xef45, 0xef46, 0xef47, 0xef48, 0xef49, 0xef4a, 0xef4b, 0xef4c, 0xef4d, 0xef4e, 0xef4f, 0xef50, 0xef51, 0xef52, 0xef53, 0xef54, 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, 0xef80, 0xef81, 0xef82, 0xef83, 0xef84, 0xef85, 0xef86, 0xef87, 0xef88, 0xef89, 0xef8a, 0xef8b, 0xef8c, 0xef8d, 0xef8e, 0xef8f, 0xef90, 0xef91, 0xef92, 0xef93, 0xef94, 0xef95, 0xef96, 0xef97, 0xef98, 0xef99, 0xef9a, 0xef9b, 0xef9c, 0xef9d, 0xef9e, 0xef9f, 0xefa0, 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, 0xf080, 0xf081, 0xf082, 0xf083, 0xf084, 0xf085, 0xf086, 0xf087, 0xf088, 0xf089, 0xf08a, 0xf08b, 0xf08c, 0xf08d, 0xf08e, 0xf08f, 0xf090, 0xf091, 0xf092, 0xf093, 0xf094, 0xf095, 0xf096, 0xf097, 0xf098, 0xf099, 0xf09a, 0xf09b, 0xf09c, 0xf09d, 0xf09e, 0xf09f, 0xf0a0, 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, 0xf16b, 0xf16c, 0xf16d, 0xf16e, 0xf16f, 0xf170, 0xf171, 0xf172, 0xf173, 0xf174, 0xf175, 0xf176, 0xf177, 0xf178, 0xf179, 0xf17a, 0xf17b, 0xf17c, 0xf17d, 0xf17e, 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, 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, 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, 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, 0xf340, 0xf341, 0xf342, 0xf343, 0xf344, 0xf345, 0xf346, 0xf347, 0xf348, 0xf349, 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, 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, 0xf3a0, 0xf440, 0xf441, 0xf442, 0xf443, 0xf444, 0xf445, 0xf446, 0xf447, 0xf448, 0xf449, 0xf44a, 0xf44b, 0xf44c, 0xf44d, 0xf44e, 0xf44f, 0xf450, 0xf451, 0xf452, 0xf453, 0xf454, 0xf455, 0xf456, 0xf457, 0xf458, 0xf459, 0xf45a, 0xf45b, 0xf45c, 0xf45d, 0xf45e, 0xf45f, 0xf460, 0xf461, 0xf462, 0xf463, 0xf464, 0xf465, 0xf466, 0xf467, 0xf468, 0xf469, 0xf46a, 0xf46b, 0xf46c, 0xf46d, 0xf46e, 0xf46f, 0xf470, 0xf471, 0xf472, 0xf473, 0xf474, 0xf475, 0xf476, 0xf477, 0xf478, 0xf479, 0xf47a, 0xf47b, 0xf47c, 0xf47d, 0xf47e, 0xf480, 0xf481, 0xf482, 0xf483, 0xf484, 0xf485, 0xf486, 0xf487, 0xf488, 0xf489, 0xf48a, 0xf48b, 0xf48c, 0xf48d, 0xf48e, 0xf48f, 0xf490, 0xf491, 0xf492, 0xf493, 0xf494, 0xf495, 0xf496, 0xf497, 0xf498, 0xf499, 0xf49a, 0xf49b, 0xf49c, 0xf49d, 0xf49e, 0xf49f, 0xf4a0, 0xf540, 0xf541, 0xf542, 0xf543, 0xf544, 0xf545, 0xf546, 0xf547, 0xf548, 0xf549, 0xf54a, 0xf54b, 0xf54c, 0xf54d, 0xf54e, 0xf54f, 0xf550, 0xf551, 0xf552, 0xf553, 0xf554, 0xf555, 0xf556, 0xf557, 0xf558, 0xf559, 0xf55a, 0xf55b, 0xf55c, 0xf55d, 0xf55e, 0xf55f, 0xf560, 0xf561, 0xf562, 0xf563, 0xf564, 0xf565, 0xf566, 0xf567, 0xf568, 0xf569, 0xf56a, 0xf56b, 0xf56c, 0xf56d, 0xf56e, 0xf56f, 0xf570, 0xf571, 0xf572, 0xf573, 0xf574, 0xf575, 0xf576, 0xf577, 0xf578, 0xf579, 0xf57a, 0xf57b, 0xf57c, 0xf57d, 0xf57e, 0xf580, 0xf581, 0xf582, 0xf583, 0xf584, 0xf585, 0xf586, 0xf587, 0xf588, 0xf589, 0xf58a, 0xf58b, 0xf58c, 0xf58d, 0xf58e, 0xf58f, 0xf590, 0xf591, 0xf592, 0xf593, 0xf594, 0xf595, 0xf596, 0xf597, 0xf598, 0xf599, 0xf59a, 0xf59b, 0xf59c, 0xf59d, 0xf59e, 0xf59f, 0xf5a0, 0xf640, 0xf641, 0xf642, 0xf643, 0xf644, 0xf645, 0xf646, 0xf647, 0xf648, 0xf649, 0xf64a, 0xf64b, 0xf64c, 0xf64d, 0xf64e, 0xf64f, 0xf650, 0xf651, 0xf652, 0xf653, 0xf654, 0xf655, 0xf656, 0xf657, 0xf658, 0xf659, 0xf65a, 0xf65b, 0xf65c, 0xf65d, 0xf65e, 0xf65f, 0xf660, 0xf661, 0xf662, 0xf663, 0xf664, 0xf665, 0xf666, 0xf667, 0xf668, 0xf669, 0xf66a, 0xf66b, 0xf66c, 0xf66d, 0xf66e, 0xf66f, 0xf670, 0xf671, 0xf672, 0xf673, 0xf674, 0xf675, 0xf676, 0xf677, 0xf678, 0xf679, 0xf67a, 0xf67b, 0xf67c, 0xf67d, 0xf67e, 0xf680, 0xf681, 0xf682, 0xf683, 0xf684, 0xf685, 0xf686, 0xf687, 0xf688, 0xf689, 0xf68a, 0xf68b, 0xf68c, 0xf68d, 0xf68e, 0xf68f, 0xf690, 0xf691, 0xf692, 0xf693, 0xf694, 0xf695, 0xf696, 0xf697, 0xf698, 0xf699, 0xf69a, 0xf69b, 0xf69c, 0xf69d, 0xf69e, 0xf69f, 0xf6a0, 0xf740, 0xf741, 0xf742, 0xf743, 0xf744, 0xf745, 0xf746, 0xf747, 0xf748, 0xf749, 0xf74a, 0xf74b, 0xf74c, 0xf74d, 0xf74e, 0xf74f, 0xf750, 0xf751, 0xf752, 0xf753, 0xf754, 0xf755, 0xf756, 0xf757, 0xf758, 0xf759, 0xf75a, 0xf75b, 0xf75c, 0xf75d, 0xf75e, 0xf75f, 0xf760, 0xf761, 0xf762, 0xf763, 0xf764, 0xf765, 0xf766, 0xf767, 0xf768, 0xf769, 0xf76a, 0xf76b, 0xf76c, 0xf76d, 0xf76e, 0xf76f, 0xf770, 0xf771, 0xf772, 0xf773, 0xf774, 0xf775, 0xf776, 0xf777, 0xf778, 0xf779, 0xf77a, 0xf77b, 0xf77c, 0xf77d, 0xf77e, 0xf780, 0xf781, 0xf782, 0xf783, 0xf784, 0xf785, 0xf786, 0xf787, 0xf788, 0xf789, 0xf78a, 0xf78b, 0xf78c, 0xf78d, 0xf78e, 0xf78f, 0xf790, 0xf791, 0xf792, 0xf793, 0xf794, 0xf795, 0xf796, 0xf797, 0xf798, 0xf799, 0xf79a, 0xf79b, 0xf79c, 0xf79d, 0xf79e, 0xf79f, 0xf7a0, 0xf840, 0xf841, 0xf842, 0xf843, 0xf844, 0xf845, 0xf846, 0xf847, 0xf848, 0xf849, 0xf84a, 0xf84b, 0xf84c, 0xf84d, 0xf84e, 0xf84f, 0xf850, 0xf851, 0xf852, 0xf853, 0xf854, 0xf855, 0xf856, 0xf857, 0xf858, 0xf859, 0xf85a, 0xf85b, 0xf85c, 0xf85d, 0xf85e, 0xf85f, 0xf860, 0xf861, 0xf862, 0xf863, 0xf864, 0xf865, 0xf866, 0xf867, 0xf868, 0xf869, 0xf86a, 0xf86b, 0xf86c, 0xf86d, 0xf86e, 0xf86f, 0xf870, 0xf871, 0xf872, 0xf873, 0xf874, 0xf875, 0xf876, 0xf877, 0xf878, 0xf879, 0xf87a, 0xf87b, 0xf87c, 0xf87d, 0xf87e, 0xf880, 0xf881, 0xf882, 0xf883, 0xf884, 0xf885, 0xf886, 0xf887, 0xf888, 0xf889, 0xf88a, 0xf88b, 0xf88c, 0xf88d, 0xf88e, 0xf88f, 0xf890, 0xf891, 0xf892, 0xf893, 0xf894, 0xf895, 0xf896, 0xf897, 0xf898, 0xf899, 0xf89a, 0xf89b, 0xf89c, 0xf89d, 0xf89e, 0xf89f, 0xf8a0, 0xf940, 0xf941, 0xf942, 0xf943, 0xf944, 0xf945, 0xf946, 0xf947, 0xf948, 0xf949, 0xf94a, 0xf94b, 0xf94c, 0xf94d, 0xf94e, 0xf94f, 0xf950, 0xf951, 0xf952, 0xf953, 0xf954, 0xf955, 0xf956, 0xf957, 0xf958, 0xf959, 0xf95a, 0xf95b, 0xf95c, 0xf95d, 0xf95e, 0xf95f, 0xf960, 0xf961, 0xf962, 0xf963, 0xf964, 0xf965, 0xf966, 0xf967, 0xf968, 0xf969, 0xf96a, 0xf96b, 0xf96c, 0xf96d, 0xf96e, 0xf96f, 0xf970, 0xf971, 0xf972, 0xf973, 0xf974, 0xf975, 0xf976, 0xf977, 0xf978, 0xf979, 0xf97a, 0xf97b, 0xf97c, 0xf97d, 0xf97e, 0xf980, 0xf981, 0xf982, 0xf983, 0xf984, 0xf985, 0xf986, 0xf987, 0xf988, 0xf989, 0xf98a, 0xf98b, 0xf98c, 0xf98d, 0xf98e, 0xf98f, 0xf990, 0xf991, 0xf992, 0xf993, 0xf994, 0xf995, 0xf996, 0xf997, 0xf998, 0xf999, 0xf99a, 0xf99b, 0xf99c, 0xf99d, 0xf99e, 0xf99f, 0xf9a0, 0xfa40, 0xfa41, 0xfa42, 0xfa43, 0xfa44, 0xfa45, 0xfa46, 0xfa47, 0xfa48, 0xfa49, 0xfa4a, 0xfa4b, 0xfa4c, 0xfa4d, 0xfa4e, 0xfa4f, 0xfa50, 0xfa51, 0xfa52, 0xfa53, 0xfa54, 0xfa55, 0xfa56, 0xfa57, 0xfa58, 0xfa59, 0xfa5a, 0xfa5b, 0xfa5c, 0xfa5d, 0xfa5e, 0xfa5f, 0xfa60, 0xfa61, 0xfa62, 0xfa63, 0xfa64, 0xfa65, 0xfa66, 0xfa67, 0xfa68, 0xfa69, 0xfa6a, 0xfa6b, 0xfa6c, 0xfa6d, 0xfa6e, 0xfa6f, 0xfa70, 0xfa71, 0xfa72, 0xfa73, 0xfa74, 0xfa75, 0xfa76, 0xfa77, 0xfa78, 0xfa79, 0xfa7a, 0xfa7b, 0xfa7c, 0xfa7d, 0xfa7e, 0xfa80, 0xfa81, 0xfa82, 0xfa83, 0xfa84, 0xfa85, 0xfa86, 0xfa87, 0xfa88, 0xfa89, 0xfa8a, 0xfa8b, 0xfa8c, 0xfa8d, 0xfa8e, 0xfa8f, 0xfa90, 0xfa91, 0xfa92, 0xfa93, 0xfa94, 0xfa95, 0xfa96, 0xfa97, 0xfa98, 0xfa99, 0xfa9a, 0xfa9b, 0xfa9c, 0xfa9d, 0xfa9e, 0xfa9f, 0xfaa0, 0xfb40, 0xfb41, 0xfb42, 0xfb43, 0xfb44, 0xfb45, 0xfb46, 0xfb47, 0xfb48, 0xfb49, 0xfb4a, 0xfb4b, 0xfb4c, 0xfb4d, 0xfb4e, 0xfb4f, 0xfb50, 0xfb51, 0xfb52, 0xfb53, 0xfb54, 0xfb55, 0xfb56, 0xfb57, 0xfb58, 0xfb59, 0xfb5a, 0xfb5b, 0xfb5c, 0xfb5d, 0xfb5e, 0xfb5f, 0xfb60, 0xfb61, 0xfb62, 0xfb63, 0xfb64, 0xfb65, 0xfb66, 0xfb67, 0xfb68, 0xfb69, 0xfb6a, 0xfb6b, 0xfb6c, 0xfb6d, 0xfb6e, 0xfb6f, 0xfb70, 0xfb71, 0xfb72, 0xfb73, 0xfb74, 0xfb75, 0xfb76, 0xfb77, 0xfb78, 0xfb79, 0xfb7a, 0xfb7b, 0xfb7c, 0xfb7d, 0xfb7e, 0xfb80, 0xfb81, 0xfb82, 0xfb83, 0xfb84, 0xfb85, 0xfb86, 0xfb87, 0xfb88, 0xfb89, 0xfb8a, 0xfb8b, 0xfb8c, 0xfb8d, 0xfb8e, 0xfb8f, 0xfb90, 0xfb91, 0xfb92, 0xfb93, 0xfb94, 0xfb95, 0xfb96, 0xfb97, 0xfb98, 0xfb99, 0xfb9a, 0xfb9b, 0xfb9c, 0xfb9d, 0xfb9e, 0xfb9f, 0xfba0, 0xfc40, 0xfc41, 0xfc42, 0xfc43, 0xfc44, 0xfc45, 0xfc46, 0xfc47, 0xfc48, 0xfc49, 0xfc4a, 0xfc4b, 0xfc4c, 0xfc4d, 0xfc4e, 0xfc4f, 0xfc50, 0xfc51, 0xfc52, 0xfc53, 0xfc54, 0xfc55, 0xfc56, 0xfc57, 0xfc58, 0xfc59, 0xfc5a, 0xfc5b, 0xfc5c, 0xfc5d, 0xfc5e, 0xfc5f, 0xfc60, 0xfc61, 0xfc62, 0xfc63, 0xfc64, 0xfc65, 0xfc66, 0xfc67, 0xfc68, 0xfc69, 0xfc6a, 0xfc6b, 0xfc6c, 0xfc6d, 0xfc6e, 0xfc6f, 0xfc70, 0xfc71, 0xfc72, 0xfc73, 0xfc74, 0xfc75, 0xfc76, 0xfc77, 0xfc78, 0xfc79, 0xfc7a, 0xfc7b, 0xfc7c, 0xfc7d, 0xfc7e, 0xfc80, 0xfc81, 0xfc82, 0xfc83, 0xfc84, 0xfc85, 0xfc86, 0xfc87, 0xfc88, 0xfc89, 0xfc8a, 0xfc8b, 0xfc8c, 0xfc8d, 0xfc8e, 0xfc8f, 0xfc90, 0xfc91, 0xfc92, 0xfc93, 0xfc94, 0xfc95, 0xfc96, 0xfc97, 0xfc98, 0xfc99, 0xfc9a, 0xfc9b, 0xfc9c, 0xfc9d, 0xfc9e, 0xfc9f, 0xfca0, 0xfd40, 0xfd41, 0xfd42, 0xfd43, 0xfd44, 0xfd45, 0xfd46, 0xfd47, 0xfd48, 0xfd49, 0xfd4a, 0xfd4b, 0xfd4c, 0xfd4d, 0xfd4e, 0xfd4f, 0xfd50, 0xfd51, 0xfd52, 0xfd53, 0xfd54, 0xfd55, 0xfd56, 0xfd57, 0xfd58, 0xfd59, 0xfd5a, 0xfd5b, 0xfd5c, 0xfd5d, 0xfd5e, 0xfd5f, 0xfd60, 0xfd61, 0xfd62, 0xfd63, 0xfd64, 0xfd65, 0xfd66, 0xfd67, 0xfd68, 0xfd69, 0xfd6a, 0xfd6b, 0xfd6c, 0xfd6d, 0xfd6e, 0xfd6f, 0xfd70, 0xfd71, 0xfd72, 0xfd73, 0xfd74, 0xfd75, 0xfd76, 0xfd77, 0xfd78, 0xfd79, 0xfd7a, 0xfd7b, 0xfd7c, 0xfd7d, 0xfd7e, 0xfd80, 0xfd81, 0xfd82, 0xfd83, 0xfd84, 0xfd85, 0xfd86, 0xfd87, 0xfd88, 0xfd89, 0xfd8a, 0xfd8b, 0xfd8c, 0xfd8d, 0xfd8e, 0xfd8f, 0xfd90, 0xfd91, 0xfd92, 0xfd93, 0xfd94, 0xfd95, 0xfd96, 0xfd97, 0xfd98, 0xfd99, 0xfd9a, 0xfd9b, 0xfd9c, 0xfd9d, 0xfd9e, 0xfd9f, 0xfda0, 0xfe40, 0xfe41, 0xfe42, 0xfe43, 0xfe44, 0xfe45, 0xfe46, 0xfe47, 0xfe48, 0xfe49, 0xfe4a, 0xfe4b, 0xfe4c, 0xfe4d, 0xfe4e, 0xfe4f, 0xa955, 0xa968, 0xa969, 0xa96a, 0xa96b, 0xa96c, 0xa96d, 0xa96e, 0xa96f, 0xa970, 0xa971, 0xa972, 0xa973, 0xa974, 0xa975, 0xa976, 0xa977, 0xa978, 0xa979, 0xa97a, 0xa97b, 0xa97c, 0xa97d, 0xa97e, 0xa980, 0xa981, 0xa982, 0xa983, 0xa984, 0xa985, 0xa986, 0xa987, 0xa988, 0xa956, 0xa957, }; static const Summary16 gbkext_inv_uni2indx_page02[14] = { /* 0x0200 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0c00 }, { 2, 0x0200 }, }; static const Summary16 gbkext_inv_uni2indx_page20[44] = { /* 0x2000 */ { 3, 0x0000 }, { 3, 0x0029 }, { 6, 0x0020 }, { 7, 0x0020 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, /* 0x2100 */ { 8, 0x0220 }, { 10, 0x0000 }, { 10, 0x0002 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x03c0 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, /* 0x2200 */ { 15, 0x0000 }, { 15, 0x8020 }, { 17, 0x0008 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0004 }, { 19, 0x00c0 }, { 21, 0x0000 }, { 21, 0x0000 }, { 21, 0x0020 }, { 22, 0x0000 }, { 22, 0x8000 }, }; static const Summary16 gbkext_inv_uni2indx_page25[17] = { /* 0x2500 */ { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0xffff }, { 39, 0xffff }, { 55, 0x000f }, { 59, 0xfffe }, { 74, 0x0038 }, { 77, 0x0000 }, { 77, 0x3000 }, { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x003c }, { 83, 0x0000 }, /* 0x2600 */ { 83, 0x0200 }, }; static const Summary16 gbkext_inv_uni2indx_page30[16] = { /* 0x3000 */ { 84, 0x00c0 }, { 86, 0x6004 }, { 89, 0x03fe }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x7800 }, { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x7000 }, }; static const Summary16 gbkext_inv_uni2indx_page32[30] = { /* 0x3200 */ { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0002 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0008 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, /* 0x3300 */ { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0xc000 }, { 109, 0x7000 }, { 112, 0x0002 }, { 113, 0x0000 }, { 113, 0x4010 }, { 115, 0x0026 }, }; static const Summary16 gbkext_inv_uni2indx_page4e[1307] = { /* 0x4e00 */ { 118, 0x8074 }, { 123, 0x8084 }, { 126, 0xc24b }, { 133, 0x10aa }, { 138, 0x0457 }, { 144, 0x0ca2 }, { 149, 0xfdbc }, { 161, 0xbff4 }, { 173, 0x04bf }, { 181, 0x72c1 }, { 188, 0x8408 }, { 191, 0x73d3 }, { 201, 0x9100 }, { 204, 0x1c05 }, { 209, 0xe2c5 }, { 217, 0x5712 }, /* 0x4f00 */ { 224, 0x19fd }, { 234, 0x307c }, { 241, 0x730a }, { 248, 0xcaaa }, { 256, 0x1fb7 }, { 267, 0x0054 }, { 270, 0x6d46 }, { 278, 0x27a6 }, { 286, 0x54e7 }, { 295, 0xd76d }, { 306, 0x2816 }, { 311, 0x7fdf }, { 325, 0x3bc7 }, { 335, 0x0a7c }, { 342, 0x18b5 }, { 349, 0xbaf5 }, /* 0x5000 */ { 360, 0x4fff }, { 373, 0x68eb }, { 382, 0x889d }, { 389, 0xabff }, { 402, 0x2e77 }, { 412, 0xebdf }, { 425, 0xefdf }, { 439, 0x373f }, { 450, 0xdede }, { 462, 0xffff }, { 478, 0xec57 }, { 488, 0xf3fb }, { 501, 0x7fff }, { 516, 0xfbbf }, { 530, 0x8f3f }, { 541, 0xf7d7 }, /* 0x5100 */ { 554, 0xf73f }, { 567, 0xfffb }, { 582, 0xfffd }, { 597, 0x7fff }, { 612, 0xd484 }, { 618, 0xeb8d }, { 628, 0x86db }, { 637, 0xc404 }, { 641, 0xccd8 }, { 649, 0xe51b }, { 658, 0x67ca }, { 667, 0xc710 }, { 673, 0x652e }, { 681, 0xd7fd }, { 694, 0x57ec }, { 704, 0x4096 }, /* 0x5200 */ { 709, 0x9a30 }, { 715, 0xd039 }, { 722, 0x94ee }, { 731, 0x5036 }, { 737, 0xcbf0 }, { 746, 0xafac }, { 756, 0x795d }, { 766, 0x5ffb }, { 779, 0xfef9 }, { 792, 0x17f6 }, { 802, 0xc0f0 }, { 808, 0x3ff1 }, { 819, 0xf577 }, { 831, 0x7eba }, { 842, 0xffef }, { 857, 0x39fe }, /* 0x5300 */ { 868, 0x5e9e }, { 878, 0xd91e }, { 887, 0xbbb4 }, { 897, 0x31ff }, { 908, 0x3855 }, { 915, 0x2b11 }, { 921, 0x3520 }, { 926, 0x7a44 }, { 933, 0xc58b }, { 941, 0x5adf }, { 952, 0xbc93 }, { 961, 0x77bf }, { 974, 0xc0f9 }, { 982, 0x742d }, { 990, 0x0086 }, { 993, 0xc410 }, /* 0x5400 */ { 997, 0x08a5 }, { 1002, 0x1710 }, { 1007, 0x0434 }, { 1011, 0xa4c9 }, { 1018, 0xf2b6 }, { 1028, 0xe402 }, { 1033, 0xfeab }, { 1045, 0xc611 }, { 1051, 0x27aa }, { 1059, 0xd18a }, { 1066, 0x4027 }, { 1071, 0x56e5 }, { 1080, 0x0c28 }, { 1084, 0x0940 }, { 1087, 0x981f }, { 1095, 0x4bf3 }, /* 0x5500 */ { 1105, 0x7d3d }, { 1116, 0xf7ec }, { 1128, 0x2b62 }, { 1135, 0x2f74 }, { 1144, 0xf9a5 }, { 1154, 0xef9e }, { 1166, 0x8b0d }, { 1173, 0xa61f }, { 1182, 0x7060 }, { 1187, 0x4ced }, { 1196, 0xff7f }, { 1211, 0x9555 }, { 1219, 0xcdcf }, { 1230, 0x4fa1 }, { 1238, 0x6285 }, { 1244, 0x9f53 }, /* 0x5600 */ { 1254, 0x2cfc }, { 1263, 0x36ff }, { 1275, 0xcf67 }, { 1286, 0x75a9 }, { 1295, 0x8fff }, { 1308, 0xec6f }, { 1319, 0xe0eb }, { 1328, 0xe7bd }, { 1340, 0x3f9f }, { 1352, 0xfff7 }, { 1367, 0x7ff7 }, { 1381, 0xef7f }, { 1395, 0xfbff }, { 1410, 0x136f }, { 1419, 0xd7e8 }, { 1429, 0x19cc }, /* 0x5700 */ { 1436, 0xf8a7 }, { 1446, 0x6fff }, { 1460, 0x08f7 }, { 1468, 0xb1f6 }, { 1478, 0x0b7a }, { 1486, 0x037c }, { 1493, 0x50ac }, { 1499, 0xe737 }, { 1510, 0xe783 }, { 1519, 0xf7f3 }, { 1532, 0x9520 }, { 1537, 0xfeeb }, { 1550, 0x37f3 }, { 1561, 0x58cb }, { 1569, 0x5fee }, { 1581, 0xd8ef }, /* 0x5800 */ { 1592, 0xd73a }, { 1602, 0xbddd }, { 1614, 0xfbec }, { 1626, 0xffde }, { 1640, 0xcfef }, { 1653, 0xbeed }, { 1665, 0xe7df }, { 1678, 0xbfff }, { 1693, 0xfdd4 }, { 1704, 0x39f3 }, { 1714, 0xfcff }, { 1728, 0xefff }, { 1743, 0xffdd }, { 1757, 0xffdd }, { 1771, 0xa7ef }, { 1783, 0xfdb6 }, /* 0x5900 */ { 1795, 0x5f6b }, { 1806, 0x698f }, { 1815, 0x114f }, { 1822, 0xe86d }, { 1831, 0x3469 }, { 1838, 0xfa0d }, { 1847, 0xffda }, { 1860, 0xdca7 }, { 1870, 0xda21 }, { 1877, 0xbd33 }, { 1887, 0x30c7 }, { 1894, 0xb5fb }, { 1906, 0xf3bf }, { 1919, 0xca60 }, { 1925, 0xeed7 }, { 1937, 0x75ff }, /* 0x5a00 */ { 1950, 0xec05 }, { 1957, 0x6ef5 }, { 1968, 0xfdd6 }, { 1980, 0xefa9 }, { 1991, 0xf9be }, { 2003, 0xfbdf }, { 2017, 0xfb7b }, { 2030, 0x7b0f }, { 2040, 0xffff }, { 2056, 0xf3fb }, { 2069, 0xfbff }, { 2084, 0xbed3 }, { 2095, 0xedf9 }, { 2107, 0xeeab }, { 2118, 0xf5b4 }, { 2128, 0xfffd }, /* 0x5b00 */ { 2143, 0xfdff }, { 2158, 0xff3f }, { 2172, 0xffff }, { 2188, 0xff6b }, { 2201, 0xfffe }, { 2216, 0x4044 }, { 2219, 0xe983 }, { 2227, 0xdbd4 }, { 2237, 0x6444 }, { 2242, 0x8057 }, { 2248, 0xf380 }, { 2255, 0x1c86 }, { 2261, 0xef0b }, { 2271, 0x1ff2 }, { 2281, 0xbecd }, { 2292, 0x60fe }, /* 0x5c00 */ { 2301, 0x79ad }, { 2311, 0xca8d }, { 2319, 0xef4b }, { 2330, 0x00ed }, { 2336, 0x30d8 }, { 2342, 0xbddc }, { 2353, 0x3f94 }, { 2362, 0x79fd }, { 2374, 0xcef9 }, { 2385, 0xe02c }, { 2391, 0xc5f3 }, { 2401, 0x5e55 }, { 2410, 0xf7ed }, { 2423, 0xfdfb }, { 2437, 0xda8d }, { 2446, 0xf7fe }, /* 0x5d00 */ { 2460, 0xbf33 }, { 2471, 0xb7af }, { 2483, 0x9d2f }, { 2493, 0x9fef }, { 2506, 0xe37f }, { 2518, 0xd6ff }, { 2531, 0x65ff }, { 2543, 0xffef }, { 2558, 0xfffb }, { 2573, 0xddff }, { 2587, 0xffff }, { 2603, 0xff7f }, { 2618, 0xdfdf }, { 2632, 0x97ff }, { 2645, 0x3419 }, { 2651, 0x9f61 }, /* 0x5e00 */ { 2660, 0x6e91 }, { 2668, 0xc08c }, { 2673, 0x9f3f }, { 2685, 0xc67d }, { 2695, 0xefcb }, { 2707, 0xb7cf }, { 2719, 0xfff9 }, { 2733, 0x42a3 }, { 2739, 0x732e }, { 2748, 0x2904 }, { 2752, 0xdf1e }, { 2763, 0xbc17 }, { 2772, 0xf9ff }, { 2786, 0xf7b1 }, { 2797, 0xfaff }, { 2811, 0x3b2f }, /* 0x5f00 */ { 2821, 0x72e0 }, { 2828, 0x7655 }, { 2837, 0x591e }, { 2845, 0xe9fd }, { 2857, 0xfffe }, { 2872, 0xde12 }, { 2880, 0xc9a9 }, { 2888, 0xe574 }, { 2897, 0xe048 }, { 2902, 0xec5a }, { 2911, 0x9afd }, { 2922, 0xcf5f }, { 2934, 0x4d87 }, { 2942, 0xdc38 }, { 2950, 0x936c }, { 2958, 0x16dd }, /* 0x6000 */ { 2967, 0x1b80 }, { 2972, 0xc58b }, { 2980, 0x701c }, { 2986, 0x67df }, { 2998, 0xd7f1 }, { 3009, 0xd9da }, { 3019, 0x4063 }, { 3024, 0x40b6 }, { 3030, 0xcde7 }, { 3041, 0x53ab }, { 3050, 0x46b6 }, { 3058, 0xe6e9 }, { 3068, 0xf39f }, { 3080, 0x4add }, { 3089, 0x043e }, { 3095, 0xf9a6 }, /* 0x6100 */ { 3105, 0x1cbc }, { 3113, 0x7bdf }, { 3126, 0xf726 }, { 3136, 0x7fff }, { 3151, 0xaaff }, { 3163, 0xdfdd }, { 3176, 0xfe7b }, { 3189, 0xff5e }, { 3202, 0xb7ff }, { 3216, 0xdfef }, { 3230, 0xec7f }, { 3242, 0xbf7f }, { 3256, 0xf2fb }, { 3268, 0xffe9 }, { 3281, 0xffbf }, { 3296, 0x7fdf }, /* 0x6200 */ { 3310, 0x02bf }, { 3318, 0x7218 }, { 3324, 0xabc9 }, { 3333, 0x1f67 }, { 3343, 0x8474 }, { 3349, 0xf6e1 }, { 3359, 0x0137 }, { 3365, 0x2db6 }, { 3374, 0xf9ee }, { 3386, 0x7211 }, { 3392, 0xe6c8 }, { 3400, 0x45dd }, { 3409, 0x880b }, { 3414, 0x6022 }, { 3418, 0x0c13 }, { 3423, 0x0f25 }, /* 0x6300 */ { 3430, 0xbc79 }, { 3440, 0x13bd }, { 3449, 0x72c0 }, { 3455, 0xd9fb }, { 3467, 0x0593 }, { 3473, 0x3fde }, { 3485, 0x9d71 }, { 3494, 0xf33d }, { 3505, 0x287a }, { 3512, 0xfeba }, { 3524, 0x8852 }, { 3529, 0xaa66 }, { 3537, 0x1daf }, { 3547, 0xbfba }, { 3559, 0xd9f4 }, { 3569, 0x5eab }, /* 0x6400 */ { 3579, 0x67d8 }, { 3588, 0xa7e6 }, { 3598, 0xcbbc }, { 3608, 0x5bef }, { 3620, 0xfa0d }, { 3629, 0xbeeb }, { 3641, 0xdd7f }, { 3654, 0xf8ff }, { 3667, 0xff4b }, { 3679, 0xbd99 }, { 3689, 0x8def }, { 3700, 0xea5e }, { 3710, 0x9fda }, { 3721, 0xbe7a }, { 3732, 0xffab }, { 3745, 0xffff }, /* 0x6500 */ { 3761, 0xfdfe }, { 3775, 0xfefb }, { 3789, 0x37df }, { 3801, 0x348f }, { 3809, 0x6cdf }, { 3820, 0x959d }, { 3829, 0xe7b3 }, { 3840, 0xff6a }, { 3852, 0xe77f }, { 3865, 0x6574 }, { 3873, 0x554d }, { 3881, 0xcdfe }, { 3893, 0x2785 }, { 3900, 0xff3b }, { 3913, 0x0c1a }, { 3918, 0xfb3c }, /* 0x6600 */ { 3929, 0x2bb2 }, { 3937, 0x5dc7 }, { 3947, 0x5e5e }, { 3957, 0xaf8d }, { 3967, 0x67f5 }, { 3978, 0x7b03 }, { 3986, 0x3ead }, { 3996, 0xbb2e }, { 4006, 0xef6b }, { 4018, 0xdf3d }, { 4030, 0xbe7f }, { 4043, 0xbdef }, { 4056, 0xffff }, { 4072, 0xc5ff }, { 4084, 0xfdbf }, { 4098, 0x2d62 }, /* 0x6700 */ { 4105, 0xd0fe }, { 4115, 0x574e }, { 4124, 0x42bf }, { 4133, 0xdbcd }, { 4144, 0x2cb2 }, { 4151, 0x2fb4 }, { 4160, 0x58dc }, { 4168, 0x2f52 }, { 4176, 0xf56d }, { 4187, 0x8a5e }, { 4195, 0x5253 }, { 4202, 0xfe16 }, { 4212, 0x7fe5 }, { 4224, 0x88e0 }, { 4229, 0x6dda }, { 4239, 0x5fe4 }, /* 0x6800 */ { 4249, 0x205e }, { 4255, 0xdf35 }, { 4266, 0xf9fd }, { 4279, 0x8c73 }, { 4287, 0xa880 }, { 4291, 0xffc4 }, { 4302, 0xf400 }, { 4307, 0xff2f }, { 4320, 0x7f95 }, { 4331, 0xff77 }, { 4345, 0x5e3b }, { 4355, 0xffd6 }, { 4368, 0xd5fa }, { 4379, 0xfadb }, { 4391, 0xbff6 }, { 4404, 0xe9dc }, /* 0x6900 */ { 4414, 0x97dd }, { 4425, 0x7ffa }, { 4438, 0xdfee }, { 4451, 0x5dee }, { 4462, 0xfffb }, { 4477, 0x9b6f }, { 4488, 0xb7b6 }, { 4499, 0xec7d }, { 4510, 0xdc2a }, { 4518, 0xe6cf }, { 4529, 0xd67f }, { 4541, 0xf76d }, { 4553, 0xabfd }, { 4565, 0x77ee }, { 4577, 0xdffe }, { 4591, 0x5ffb }, /* 0x6a00 */ { 4604, 0xfbff }, { 4619, 0x7e7f }, { 4632, 0x7afd }, { 4644, 0x9fdd }, { 4656, 0xff6f }, { 4670, 0xf4fe }, { 4682, 0xffdd }, { 4696, 0xedfd }, { 4709, 0xbfee }, { 4722, 0xff7c }, { 4735, 0xe5fe }, { 4747, 0xffff }, { 4763, 0xffff }, { 4779, 0xffff }, { 4795, 0xffff }, { 4811, 0xffff }, /* 0x6b00 */ { 4827, 0xffff }, { 4843, 0xffff }, { 4859, 0xff60 }, { 4869, 0xb97b }, { 4880, 0xed37 }, { 4891, 0xfdff }, { 4906, 0xfb03 }, { 4915, 0xe5ff }, { 4928, 0xd121 }, { 4934, 0xf3b3 }, { 4945, 0xfbfd }, { 4959, 0x7f47 }, { 4970, 0x57d9 }, { 4980, 0xf503 }, { 4988, 0x73fd }, { 5000, 0xddd7 }, /* 0x6c00 */ { 5012, 0x5f1f }, { 5023, 0x7084 }, { 5028, 0x3829 }, { 5034, 0xdeca }, { 5044, 0xf938 }, { 5053, 0x074e }, { 5060, 0xf8ec }, { 5070, 0x9daa }, { 5079, 0x6c91 }, { 5086, 0x75e6 }, { 5096, 0x9105 }, { 5101, 0x04f1 }, { 5107, 0xe9cf }, { 5118, 0xb706 }, { 5126, 0x32d0 }, { 5132, 0x8214 }, /* 0x6d00 */ { 5136, 0xa76d }, { 5146, 0xb17b }, { 5156, 0xb35f }, { 5167, 0x85d1 }, { 5174, 0x1215 }, { 5179, 0xa9e1 }, { 5187, 0x39b6 }, { 5196, 0xee6f }, { 5208, 0xacdb }, { 5218, 0x17c5 }, { 5226, 0x3024 }, { 5230, 0x7edb }, { 5242, 0xe70e }, { 5251, 0x9cbd }, { 5261, 0xa7ac }, { 5270, 0xe575 }, /* 0x6e00 */ { 5280, 0x8bdf }, { 5291, 0xdb2c }, { 5300, 0x55c4 }, { 5307, 0xfaeb }, { 5319, 0x9fe7 }, { 5331, 0x76a7 }, { 5341, 0xb7ff }, { 5355, 0x3fff }, { 5369, 0x7d97 }, { 5380, 0x6efe }, { 5392, 0x7b5b }, { 5403, 0xd329 }, { 5411, 0x7779 }, { 5422, 0x3b45 }, { 5430, 0xfc88 }, { 5438, 0xfdef }, /* 0x6f00 */ { 5452, 0x7dbb }, { 5464, 0xffc7 }, { 5477, 0x51ee }, { 5486, 0xbfb5 }, { 5498, 0xd73f }, { 5510, 0xaeff }, { 5523, 0x9fbb }, { 5535, 0xeaeb }, { 5546, 0x8cef }, { 5556, 0xefff }, { 5571, 0xff7d }, { 5585, 0xfdb7 }, { 5598, 0xfdfa }, { 5611, 0xbff9 }, { 5624, 0x3ffc }, { 5636, 0xffff }, /* 0x7000 */ { 5652, 0xffff }, { 5668, 0xf3fd }, { 5681, 0xfff7 }, { 5696, 0xfddf }, { 5710, 0x6fff }, { 5724, 0xbfff }, { 5739, 0x47ff }, { 5751, 0x2e9e }, { 5760, 0xb9de }, { 5771, 0xcd8b }, { 5780, 0x07ff }, { 5791, 0xc475 }, { 5799, 0xfaf0 }, { 5809, 0x74ff }, { 5821, 0x442f }, { 5828, 0xdd7f }, /* 0x7100 */ { 5841, 0xf9ff }, { 5855, 0xf896 }, { 5864, 0x7fbf }, { 5878, 0xffbc }, { 5891, 0xabdf }, { 5903, 0xafff }, { 5917, 0xbe2f }, { 5928, 0xdaf3 }, { 5939, 0x7bef }, { 5952, 0x7cef }, { 5964, 0xeefe }, { 5977, 0xfdd7 }, { 5990, 0xbff7 }, { 6004, 0xffcf }, { 6018, 0xbf5e }, { 6030, 0xfdff }, /* 0x7200 */ { 6045, 0xffbf }, { 6060, 0xdfff }, { 6075, 0xeaff }, { 6088, 0x541c }, { 6094, 0xce7f }, { 6106, 0x55bb }, { 6116, 0x3d39 }, { 6125, 0x39db }, { 6135, 0x53ec }, { 6144, 0x7ffb }, { 6158, 0x4fff }, { 6171, 0xfc2e }, { 6181, 0x9ee1 }, { 6190, 0xbd7a }, { 6201, 0x0cfc }, { 6209, 0xe260 }, /* 0x7300 */ { 6215, 0xbbf5 }, { 6227, 0x8717 }, { 6235, 0xa1d9 }, { 6243, 0x3c6d }, { 6252, 0xdfff }, { 6267, 0xff7a }, { 6280, 0x4ffe }, { 6292, 0xbfff }, { 6307, 0xb56f }, { 6318, 0x77bd }, { 6330, 0x35fb }, { 6341, 0xf372 }, { 6351, 0x58fa }, { 6360, 0xbdfc }, { 6372, 0xdd5e }, { 6383, 0xfffb }, /* 0x7400 */ { 6398, 0x7997 }, { 6408, 0xf3fe }, { 6421, 0xaa9b }, { 6430, 0xef86 }, { 6440, 0xfffd }, { 6455, 0x215f }, { 6463, 0xdfff }, { 6478, 0xbf3e }, { 6490, 0xb774 }, { 6500, 0xaffe }, { 6513, 0xfc7f }, { 6526, 0xfbff }, { 6541, 0xffff }, { 6557, 0xaffb }, { 6570, 0x3fa2 }, { 6579, 0x7f2f }, /* 0x7500 */ { 6591, 0x5fef }, { 6604, 0x68f5 }, { 6613, 0x44df }, { 6622, 0xb250 }, { 6628, 0x26de }, { 6637, 0xe1ef }, { 6648, 0xfb9f }, { 6661, 0x7ceb }, { 6672, 0x77b7 }, { 6684, 0x5929 }, { 6691, 0x27c4 }, { 6698, 0x8cc0 }, { 6703, 0xd843 }, { 6710, 0xb68b }, { 6719, 0xf223 }, { 6727, 0x6dec }, /* 0x7600 */ { 6737, 0xebd4 }, { 6747, 0x745e }, { 6756, 0xd18a }, { 6763, 0x2ec6 }, { 6771, 0xcff6 }, { 6783, 0xafaf }, { 6795, 0x77f7 }, { 6808, 0x96ff }, { 6820, 0xb62b }, { 6829, 0xfdb5 }, { 6841, 0xbfef }, { 6855, 0x7fe9 }, { 6867, 0x1a9b }, { 6875, 0x7628 }, { 6882, 0x3fdf }, { 6895, 0xace9 }, /* 0x7700 */ { 6904, 0xd46d }, { 6913, 0x79ff }, { 6926, 0x5cba }, { 6935, 0xea1f }, { 6945, 0xff74 }, { 6957, 0xf3fc }, { 6969, 0xe691 }, { 6977, 0x1dff }, { 6989, 0x8fce }, { 6999, 0x7ff9 }, { 7012, 0xe95a }, { 7021, 0x57d6 }, { 7031, 0xdfff }, { 7046, 0xe77f }, { 7059, 0x8553 }, { 7066, 0x1eb7 }, /* 0x7800 */ { 7076, 0xcdf8 }, { 7086, 0x4a29 }, { 7092, 0xcd17 }, { 7101, 0xa06e }, { 7108, 0xaf5e }, { 7119, 0xdf1a }, { 7129, 0x83ff }, { 7140, 0xef7f }, { 7154, 0x8d7f }, { 7165, 0x6275 }, { 7173, 0xff55 }, { 7185, 0xbde0 }, { 7194, 0xf1dd }, { 7205, 0xfdce }, { 7217, 0xeeff }, { 7231, 0xfb6b }, /* 0x7900 */ { 7243, 0xffdd }, { 7257, 0xbff7 }, { 7271, 0xffef }, { 7286, 0xa3ef }, { 7297, 0xfcbc }, { 7308, 0x0337 }, { 7315, 0x5e5a }, { 7324, 0xfa7f }, { 7337, 0x7bcc }, { 7347, 0xfbff }, { 7362, 0xff7f }, { 7377, 0x91f7 }, { 7387, 0xd5b4 }, { 7396, 0x7ed9 }, { 7407, 0x5527 }, { 7415, 0xd6fe }, /* 0x7a00 */ { 7427, 0x97b2 }, { 7436, 0xbb6f }, { 7448, 0xfff6 }, { 7462, 0x4577 }, { 7471, 0xffbf }, { 7486, 0xff7d }, { 7500, 0xffff }, { 7516, 0x782e }, { 7524, 0xdea4 }, { 7533, 0x4e19 }, { 7540, 0xce9e }, { 7550, 0x7ff7 }, { 7564, 0xf7ff }, { 7579, 0x3dbf }, { 7591, 0x5f96 }, { 7601, 0x59ff }, /* 0x7b00 */ { 7613, 0x72a7 }, { 7622, 0xb5cd }, { 7632, 0xa28e }, { 7639, 0xaaf5 }, { 7649, 0x655f }, { 7659, 0xd2a8 }, { 7666, 0xbffa }, { 7679, 0xb559 }, { 7688, 0xdfde }, { 7701, 0xcf4e }, { 7711, 0xc039 }, { 7717, 0xfeed }, { 7730, 0xef3d }, { 7742, 0xd9f5 }, { 7753, 0xbb9d }, { 7764, 0xaf7d }, /* 0x7c00 */ { 7776, 0x677f }, { 7788, 0x7fbf }, { 7802, 0xfb3f }, { 7815, 0x7eff }, { 7829, 0xdffc }, { 7842, 0xffff }, { 7858, 0xffff }, { 7874, 0xc7e7 }, { 7885, 0xfdff }, { 7900, 0x0e59 }, { 7907, 0xbbcb }, { 7918, 0x8df1 }, { 7927, 0xca5d }, { 7936, 0x6d1f }, { 7946, 0x7efe }, { 7959, 0xf6ff }, /* 0x7d00 */ { 7973, 0xfbff }, { 7988, 0xffff }, { 8004, 0x777a }, { 8015, 0xffff }, { 8031, 0xffff }, { 8047, 0xffff }, { 8063, 0xbfff }, { 8078, 0xff7f }, { 8093, 0xffff }, { 8109, 0xffff }, { 8125, 0xbfbf }, { 8139, 0xffff }, { 8155, 0xffff }, { 8171, 0xffff }, { 8187, 0xffff }, { 8203, 0xffff }, /* 0x7e00 */ { 8219, 0xffff }, { 8235, 0xffff }, { 8251, 0xffff }, { 8267, 0xf7ff }, { 8282, 0xff7d }, { 8296, 0xffff }, { 8312, 0xffff }, { 8328, 0xffff }, { 8344, 0xfffb }, { 8359, 0x77ff }, { 8373, 0x4000 }, { 8374, 0x1810 }, { 8377, 0x0000 }, { 8377, 0x0040 }, { 8378, 0x1010 }, { 8380, 0x0200 }, /* 0x7f00 */ { 8381, 0x0400 }, { 8382, 0x4001 }, { 8384, 0x0000 }, { 8384, 0xfa80 }, { 8391, 0xffcb }, { 8404, 0x7a4c }, { 8412, 0xb8f9 }, { 8422, 0xbde9 }, { 8433, 0xabfd }, { 8445, 0x1bef }, { 8456, 0x7f6d }, { 8468, 0x4cfa }, { 8477, 0xabdd }, { 8488, 0x7ecf }, { 8500, 0xbd9c }, { 8510, 0xe7f4 }, /* 0x8000 */ { 8521, 0xc784 }, { 8528, 0xec0a }, { 8535, 0xf81a }, { 8543, 0x5615 }, { 8550, 0xc3b3 }, { 8559, 0xfaeb }, { 8571, 0xf9ff }, { 8585, 0x7ffd }, { 8599, 0xe526 }, { 8607, 0x42b7 }, { 8615, 0x11c8 }, { 8620, 0x0b69 }, { 8627, 0x8fa0 }, { 8634, 0x813f }, { 8642, 0x404d }, { 8647, 0xcaa0 }, /* 0x8100 */ { 8653, 0x19bb }, { 8662, 0xbaa0 }, { 8669, 0x6fff }, { 8683, 0xbeb9 }, { 8694, 0xe2bf }, { 8705, 0xf9c4 }, { 8714, 0x9d5e }, { 8724, 0x01ec }, { 8730, 0x7afa }, { 8741, 0xc6fd }, { 8752, 0xfab7 }, { 8764, 0xf3f7 }, { 8777, 0xebb0 }, { 8786, 0xffff }, { 8802, 0xcb77 }, { 8813, 0xa7e7 }, /* 0x8200 */ { 8824, 0xcf88 }, { 8832, 0x27ea }, { 8841, 0x42f1 }, { 8848, 0xb404 }, { 8853, 0x756f }, { 8864, 0x7aff }, { 8877, 0x3eff }, { 8890, 0x19e2 }, { 8897, 0x12eb }, { 8905, 0x4c79 }, { 8913, 0x008d }, { 8917, 0x9c64 }, { 8924, 0x026d }, { 8930, 0x2641 }, { 8935, 0x7784 }, { 8943, 0xf56d }, /* 0x8300 */ { 8954, 0x2c01 }, { 8958, 0xe34d }, { 8967, 0x467f }, { 8977, 0xe885 }, { 8984, 0x7d36 }, { 8994, 0x23e8 }, { 9001, 0x0004 }, { 9002, 0xc67f }, { 9013, 0xbd9f }, { 9025, 0xa6f3 }, { 9035, 0xf0fe }, { 9046, 0xc820 }, { 9050, 0x6b5c }, { 9059, 0x4eaf }, { 9069, 0xf9dc }, { 9080, 0xdcf8 }, /* 0x8400 */ { 9090, 0x07a5 }, { 9097, 0xcefd }, { 9109, 0xfe0f }, { 9120, 0xcefd }, { 9132, 0xffbf }, { 9147, 0xe17d }, { 9157, 0xc5f5 }, { 9167, 0xfa95 }, { 9177, 0xa47b }, { 9186, 0xed7f }, { 9199, 0x7ffd }, { 9213, 0x58eb }, { 9222, 0xd9ed }, { 9233, 0x5fb4 }, { 9243, 0xef96 }, { 9254, 0x6ffe }, /* 0x8500 */ { 9267, 0xefff }, { 9282, 0x7b75 }, { 9293, 0xe7fd }, { 9306, 0xc07f }, { 9315, 0xf8f7 }, { 9327, 0xbdbf }, { 9340, 0xfeef }, { 9354, 0xb1eb }, { 9364, 0x7f4f }, { 9376, 0xe7ff }, { 9390, 0x3aef }, { 9401, 0xfd7e }, { 9414, 0x7dfd }, { 9427, 0xefd6 }, { 9439, 0xfdef }, { 9453, 0x77ff }, /* 0x8600 */ { 9467, 0xffdf }, { 9482, 0xffbd }, { 9496, 0xfd7f }, { 9510, 0xeeff }, { 9524, 0x1fff }, { 9537, 0xbbec }, { 9548, 0xa7fb }, { 9560, 0x01fd }, { 9568, 0xc3f8 }, { 9577, 0xcfd7 }, { 9589, 0x6867 }, { 9597, 0xfb8c }, { 9607, 0x312e }, { 9614, 0x34ec }, { 9622, 0x9def }, { 9634, 0xbce0 }, /* 0x8700 */ { 9642, 0xd872 }, { 9650, 0xaa53 }, { 9658, 0xbdd1 }, { 9668, 0x376d }, { 9678, 0xac7f }, { 9689, 0xfd77 }, { 9702, 0xbfc6 }, { 9713, 0x87ae }, { 9722, 0xd6d3 }, { 9732, 0x7f77 }, { 9745, 0x46ff }, { 9756, 0xdbd7 }, { 9768, 0xf3be }, { 9780, 0xf7f1 }, { 9792, 0xbbde }, { 9804, 0xbdff }, /* 0x8800 */ { 9818, 0xfbf7 }, { 9832, 0xf797 }, { 9844, 0xfff9 }, { 9858, 0xedfb }, { 9871, 0xcfce }, { 9882, 0xfd6f }, { 9895, 0xa4c1 }, { 9901, 0x1f7a }, { 9911, 0xd6c9 }, { 9920, 0xefbb }, { 9933, 0xd7eb }, { 9945, 0xef7d }, { 9958, 0xbd99 }, { 9968, 0x7ccb }, { 9978, 0xfec3 }, { 9989, 0xace4 }, /* 0x8900 */ { 9997, 0xfbfb }, { 10011, 0xf1f2 }, { 10021, 0xf3dd }, { 10033, 0xffae }, { 10046, 0xffed }, { 10060, 0x3fff }, { 10074, 0xffbf }, { 10089, 0x77ff }, { 10103, 0xffb5 }, { 10116, 0xffff }, { 10132, 0xffff }, { 10148, 0xffff }, { 10164, 0x2009 }, { 10167, 0xabb8 }, { 10176, 0x7797 }, { 10187, 0xfff7 }, /* 0x8a00 */ { 10202, 0xff7e }, { 10216, 0xffff }, { 10232, 0xffff }, { 10248, 0xbfff }, { 10263, 0xfeff }, { 10278, 0xffff }, { 10294, 0xffff }, { 10310, 0xfdff }, { 10325, 0xf9ff }, { 10339, 0xfff7 }, { 10354, 0xffff }, { 10370, 0xffff }, { 10386, 0xffff }, { 10402, 0xffff }, { 10418, 0xffff }, { 10434, 0xffff }, /* 0x8b00 */ { 10450, 0xff7f }, { 10465, 0xffff }, { 10481, 0xffbf }, { 10496, 0xffff }, { 10512, 0xffff }, { 10528, 0xffff }, { 10544, 0xefbf }, { 10558, 0xffff }, { 10574, 0xffff }, { 10590, 0xffff }, { 10606, 0x1000 }, { 10607, 0x0802 }, { 10609, 0x0080 }, { 10610, 0x0001 }, { 10611, 0x0400 }, { 10612, 0x0000 }, /* 0x8c00 */ { 10612, 0x0200 }, { 10613, 0x4000 }, { 10614, 0x0000 }, { 10614, 0xff00 }, { 10622, 0xed3d }, { 10633, 0xfbdf }, { 10647, 0xf3f9 }, { 10659, 0xf8f7 }, { 10671, 0xe9db }, { 10682, 0xfeef }, { 10696, 0xffff }, { 10712, 0xffff }, { 10728, 0xffff }, { 10744, 0xffff }, { 10760, 0xffff }, { 10776, 0xffff }, /* 0x8d00 */ { 10792, 0xffff }, { 10808, 0x1fff }, { 10821, 0x0001 }, { 10822, 0x0000 }, { 10822, 0x0000 }, { 10822, 0x8086 }, { 10826, 0xd720 }, { 10833, 0xff06 }, { 10843, 0xf3cd }, { 10854, 0x7fed }, { 10867, 0xfff7 }, { 10882, 0x2ac5 }, { 10889, 0x27a7 }, { 10898, 0x133d }, { 10906, 0x62e7 }, { 10915, 0xd057 }, /* 0x8e00 */ { 10923, 0x69df }, { 10934, 0x1fef }, { 10946, 0x29f3 }, { 10955, 0xd9dd }, { 10966, 0xf068 }, { 10973, 0xfdf9 }, { 10986, 0x4dbf }, { 10997, 0x6faa }, { 11007, 0x7f5d }, { 11019, 0xafee }, { 11031, 0x67ff }, { 11044, 0xfbfb }, { 11058, 0xbfff }, { 11073, 0xffff }, { 11089, 0xffff }, { 11105, 0xffff }, /* 0x8f00 */ { 11121, 0xffff }, { 11137, 0xffff }, { 11153, 0xffff }, { 11169, 0xffff }, { 11185, 0xffff }, { 11201, 0xffff }, { 11217, 0x043f }, { 11224, 0x0000 }, { 11224, 0x1001 }, { 11226, 0x2004 }, { 11228, 0xf4f7 }, { 11240, 0x9dbc }, { 11250, 0xbe49 }, { 11259, 0x04c4 }, { 11263, 0x908b }, { 11269, 0xdc76 }, /* 0x9000 */ { 11279, 0x5180 }, { 11283, 0x1328 }, { 11288, 0x1fb8 }, { 11297, 0xa69f }, { 11307, 0x5f69 }, { 11317, 0xf670 }, { 11326, 0x9ed3 }, { 11336, 0x5fcf }, { 11348, 0xf6f2 }, { 11359, 0xd555 }, { 11368, 0x2bb1 }, { 11376, 0xb084 }, { 11381, 0x3b4d }, { 11390, 0xc774 }, { 11399, 0x5639 }, { 11407, 0x9eef }, /* 0x9100 */ { 11419, 0xffeb }, { 11433, 0xbdff }, { 11447, 0x7ff3 }, { 11460, 0xfdfd }, { 11474, 0x01b7 }, { 11481, 0x9b7a }, { 11491, 0x29c1 }, { 11497, 0x1c08 }, { 11501, 0xc55f }, { 11511, 0xf3f8 }, { 11522, 0x1bf3 }, { 11532, 0xfbcf }, { 11545, 0x097f }, { 11554, 0xeffd }, { 11568, 0xffff }, { 11584, 0xffff }, /* 0x9200 */ { 11600, 0xffff }, { 11616, 0xffff }, { 11632, 0xffff }, { 11648, 0xffff }, { 11664, 0xffff }, { 11680, 0xffff }, { 11696, 0xffff }, { 11712, 0xffef }, { 11727, 0xbfff }, { 11742, 0xffff }, { 11758, 0xbfff }, { 11773, 0xffff }, { 11789, 0xfeff }, { 11804, 0xffff }, { 11820, 0xffff }, { 11836, 0xffff }, /* 0x9300 */ { 11852, 0xffff }, { 11868, 0xffff }, { 11884, 0xffff }, { 11900, 0xbfff }, { 11915, 0xffff }, { 11931, 0xffff }, { 11947, 0xfbff }, { 11962, 0xffff }, { 11978, 0x7fff }, { 11993, 0xffff }, { 12009, 0xffff }, { 12025, 0xffff }, { 12041, 0xfbff }, { 12056, 0xffbf }, { 12071, 0xffff }, { 12087, 0xffff }, /* 0x9400 */ { 12103, 0xffff }, { 12119, 0xffff }, { 12135, 0xffff }, { 12151, 0xbfff }, { 12166, 0xffff }, { 12182, 0xffff }, { 12198, 0xf7ff }, { 12213, 0xffff }, { 12229, 0x001f }, { 12234, 0x0142 }, { 12237, 0x0000 }, { 12237, 0x0000 }, { 12237, 0x8080 }, { 12239, 0x0418 }, { 12242, 0x0040 }, { 12243, 0x0800 }, /* 0x9500 */ { 12244, 0x0000 }, { 12244, 0x1000 }, { 12245, 0x0081 }, { 12247, 0x2008 }, { 12249, 0x0908 }, { 12252, 0x0420 }, { 12254, 0x4001 }, { 12256, 0x7fb0 }, { 12266, 0xffff }, { 12282, 0xffff }, { 12298, 0xffff }, { 12314, 0xffff }, { 12330, 0xffff }, { 12346, 0xffff }, { 12362, 0x10ff }, { 12371, 0x8000 }, /* 0x9600 */ { 12372, 0x0080 }, { 12373, 0x4908 }, { 12377, 0xbbf9 }, { 12389, 0x4781 }, { 12395, 0xc40a }, { 12400, 0x77ce }, { 12411, 0xe869 }, { 12419, 0xff0b }, { 12430, 0x569f }, { 12440, 0xec6e }, { 12450, 0xff7f }, { 12465, 0x8db6 }, { 12474, 0x0d0c }, { 12479, 0xffdb }, { 12493, 0x78fe }, { 12504, 0xbd37 }, /* 0x9700 */ { 12515, 0x1c2c }, { 12521, 0xafb7 }, { 12533, 0xdbff }, { 12547, 0xbcfa }, { 12558, 0xffff }, { 12574, 0xb5b3 }, { 12584, 0xfdd8 }, { 12595, 0xefa7 }, { 12607, 0xd7df }, { 12620, 0xfee9 }, { 12632, 0x57f6 }, { 12643, 0xffeb }, { 12657, 0xffff }, { 12673, 0xffff }, { 12689, 0xc13f }, { 12698, 0xff97 }, /* 0x9800 */ { 12711, 0xffff }, { 12727, 0xffff }, { 12743, 0xffff }, { 12759, 0xffff }, { 12775, 0xffff }, { 12791, 0xffff }, { 12807, 0xffff }, { 12823, 0x001f }, { 12828, 0x4800 }, { 12830, 0x0224 }, { 12833, 0xff08 }, { 12842, 0xffff }, { 12858, 0xbfff }, { 12873, 0x38d1 }, { 12880, 0xfe7f }, { 12894, 0xffff }, /* 0x9900 */ { 12910, 0xdfff }, { 12925, 0xfffe }, { 12940, 0xbfff }, { 12955, 0xffff }, { 12971, 0xffff }, { 12987, 0xffcf }, { 13001, 0x0057 }, { 13006, 0x4b08 }, { 13011, 0x520c }, { 13016, 0xfc00 }, { 13022, 0xfedf }, { 13036, 0xffff }, { 13052, 0xffff }, { 13068, 0xffff }, { 13084, 0xffff }, { 13100, 0xffff }, /* 0x9a00 */ { 13116, 0xffff }, { 13132, 0xffff }, { 13148, 0xffff }, { 13164, 0xffff }, { 13180, 0xffff }, { 13196, 0xffff }, { 13212, 0x0fff }, { 13224, 0x0004 }, { 13225, 0x6208 }, { 13229, 0x0230 }, { 13232, 0xfe40 }, { 13240, 0xea3c }, { 13249, 0xe7d8 }, { 13259, 0x7ef5 }, { 13271, 0x57bd }, { 13282, 0xf5ff }, /* 0x9b00 */ { 13296, 0x7ef7 }, { 13309, 0x7ff7 }, { 13323, 0x7ff7 }, { 13337, 0xe7fb }, { 13350, 0x5c41 }, { 13356, 0xffed }, { 13370, 0xffff }, { 13386, 0xffff }, { 13402, 0xffff }, { 13418, 0xffff }, { 13434, 0xffff }, { 13450, 0xffff }, { 13466, 0xffff }, { 13482, 0xffff }, { 13498, 0xffff }, { 13514, 0xffff }, /* 0x9c00 */ { 13530, 0xffff }, { 13546, 0xffff }, { 13562, 0xffff }, { 13578, 0xffff }, { 13594, 0xffff }, { 13610, 0xffff }, { 13626, 0xffff }, { 13642, 0x6fff }, { 13656, 0x9619 }, { 13663, 0x23c8 }, { 13669, 0x9400 }, { 13672, 0xc200 }, { 13675, 0x0307 }, { 13680, 0x0c06 }, { 13684, 0xfffb }, { 13699, 0xffff }, /* 0x9d00 */ { 13715, 0xffff }, { 13731, 0xffff }, { 13747, 0xffff }, { 13763, 0xffff }, { 13779, 0xffff }, { 13795, 0xffff }, { 13811, 0xffff }, { 13827, 0xffff }, { 13843, 0xffff }, { 13859, 0xffff }, { 13875, 0xffff }, { 13891, 0xffff }, { 13907, 0xffff }, { 13923, 0xffff }, { 13939, 0xffff }, { 13955, 0xffff }, /* 0x9e00 */ { 13971, 0xffff }, { 13987, 0x7fff }, { 14002, 0x4090 }, { 14005, 0x1811 }, { 14009, 0x2001 }, { 14011, 0xa25d }, { 14019, 0xc027 }, { 14025, 0x3ff4 }, { 14036, 0xf67b }, { 14048, 0x5ff3 }, { 14060, 0xffbf }, { 14075, 0x96ef }, { 14086, 0x1def }, { 14097, 0x46ed }, { 14106, 0x795a }, { 14115, 0xa5ff }, /* 0x9f00 */ { 14127, 0x97ff }, { 14140, 0xfd76 }, { 14152, 0x6ffa }, { 14164, 0x957f }, { 14175, 0xffef }, { 14190, 0xfffc }, { 14204, 0xffff }, { 14220, 0x7fff }, { 14235, 0xe006 }, { 14240, 0x71ff }, { 14252, 0x003e }, }; static const Summary16 gbkext_inv_uni2indx_pagef9[19] = { /* 0xf900 */ { 14257, 0x0000 }, { 14257, 0x0000 }, { 14257, 0x1000 }, { 14258, 0x0000 }, { 14258, 0x0000 }, { 14258, 0x0000 }, { 14258, 0x0000 }, { 14258, 0x0200 }, { 14259, 0x0000 }, { 14259, 0x0020 }, { 14260, 0x0000 }, { 14260, 0x0000 }, { 14260, 0x0000 }, { 14260, 0x0000 }, { 14260, 0x0080 }, { 14261, 0x0002 }, /* 0xfa00 */ { 14262, 0xf000 }, { 14266, 0x811a }, { 14271, 0x039b }, }; static const Summary16 gbkext_inv_uni2indx_pagefe[31] = { /* 0xfe00 */ { 14278, 0x0000 }, { 14278, 0x0000 }, { 14278, 0x0000 }, { 14278, 0x0001 }, { 14279, 0xfe00 }, { 14286, 0xfef7 }, { 14300, 0x0f7f }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, /* 0xff00 */ { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0014 }, }; static int gbkext_inv_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc >= 0x0200 && wc < 0x02e0) summary = &gbkext_inv_uni2indx_page02[(wc>>4)-0x020]; else if (wc >= 0x2000 && wc < 0x22c0) summary = &gbkext_inv_uni2indx_page20[(wc>>4)-0x200]; else if (wc >= 0x2500 && wc < 0x2610) summary = &gbkext_inv_uni2indx_page25[(wc>>4)-0x250]; else if (wc >= 0x3000 && wc < 0x3100) summary = &gbkext_inv_uni2indx_page30[(wc>>4)-0x300]; else if (wc >= 0x3200 && wc < 0x33e0) summary = &gbkext_inv_uni2indx_page32[(wc>>4)-0x320]; else if (wc >= 0x4e00 && wc < 0x9fb0) summary = &gbkext_inv_uni2indx_page4e[(wc>>4)-0x4e0]; else if (wc >= 0xf900 && wc < 0xfa30) summary = &gbkext_inv_uni2indx_pagef9[(wc>>4)-0xf90]; else if (wc >= 0xfe00 && wc < 0xfff0) summary = &gbkext_inv_uni2indx_pagefe[(wc>>4)-0xfe0]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' 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); c = gbkext_inv_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/georgian_academy.h000066400000000000000000000100461252300335000263550ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GEORGIAN-ACADEMY */ static const unsigned short georgian_academy_2uni[32] = { /* 0x80 */ 0x0080, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x008e, 0x008f, /* 0x90 */ 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x009e, 0x0178, }; static int georgian_academy_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0x80 && c < 0xa0) *pwc = (ucs4_t) georgian_academy_2uni[c-0x80]; else if (c >= 0xc0 && c < 0xe7) *pwc = (ucs4_t) c + 0x1010; else *pwc = (ucs4_t) c; return 1; } static const unsigned char georgian_academy_page00[32] = { 0x80, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x8d, 0x8e, 0x8f, /* 0x88-0x8f */ 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x9d, 0x9e, 0x00, /* 0x98-0x9f */ }; static const unsigned char georgian_academy_page01[72] = { 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x8a, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char georgian_academy_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char georgian_academy_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int georgian_academy_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x0080 && wc < 0x00a0) c = georgian_academy_page00[wc-0x0080]; else if ((wc >= 0x00a0 && wc < 0x00c0) || (wc >= 0x00e7 && wc < 0x0100)) c = wc; else if (wc >= 0x0150 && wc < 0x0198) c = georgian_academy_page01[wc-0x0150]; else if (wc >= 0x02c0 && wc < 0x02e0) c = georgian_academy_page02[wc-0x02c0]; else if (wc >= 0x10d0 && wc < 0x10f7) c = wc-0x1010; else if (wc >= 0x2010 && wc < 0x2040) c = georgian_academy_page20[wc-0x2010]; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/georgian_ps.h000066400000000000000000000114531252300335000253770ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GEORGIAN-PS */ static const unsigned short georgian_ps_2uni_1[32] = { /* 0x80 */ 0x0080, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x008e, 0x008f, /* 0x90 */ 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x009e, 0x0178, }; static const unsigned short georgian_ps_2uni_2[39] = { /* 0xc0 */ 0x10d0, 0x10d1, 0x10d2, 0x10d3, 0x10d4, 0x10d5, 0x10d6, 0x10f1, 0x10d7, 0x10d8, 0x10d9, 0x10da, 0x10db, 0x10dc, 0x10f2, 0x10dd, /* 0xd0 */ 0x10de, 0x10df, 0x10e0, 0x10e1, 0x10e2, 0x10f3, 0x10e3, 0x10e4, 0x10e5, 0x10e6, 0x10e7, 0x10e8, 0x10e9, 0x10ea, 0x10eb, 0x10ec, /* 0xe0 */ 0x10ed, 0x10ee, 0x10f4, 0x10ef, 0x10f0, 0x10f5, }; static int georgian_ps_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0x80 && c < 0xa0) *pwc = (ucs4_t) georgian_ps_2uni_1[c-0x80]; else if (c >= 0xc0 && c < 0xe6) *pwc = (ucs4_t) georgian_ps_2uni_2[c-0xc0]; else *pwc = (ucs4_t) c; return 1; } static const unsigned char georgian_ps_page00[32] = { 0x80, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x8d, 0x8e, 0x8f, /* 0x88-0x8f */ 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x9d, 0x9e, 0x00, /* 0x98-0x9f */ }; static const unsigned char georgian_ps_page01[72] = { 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x8a, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char georgian_ps_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char georgian_ps_page10[40] = { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc8, /* 0xd0-0xd7 */ 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xcf, 0xd0, 0xd1, /* 0xd8-0xdf */ 0xd2, 0xd3, 0xd4, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, /* 0xe0-0xe7 */ 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe3, /* 0xe8-0xef */ 0xe4, 0xc7, 0xce, 0xd5, 0xe2, 0xe5, 0x00, 0x00, /* 0xf0-0xf7 */ }; static const unsigned char georgian_ps_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int georgian_ps_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x0080 && wc < 0x00a0) c = georgian_ps_page00[wc-0x0080]; else if ((wc >= 0x00a0 && wc < 0x00c0) || (wc >= 0x00e6 && wc < 0x0100)) c = wc; else if (wc >= 0x0150 && wc < 0x0198) c = georgian_ps_page01[wc-0x0150]; else if (wc >= 0x02c0 && wc < 0x02e0) c = georgian_ps_page02[wc-0x02c0]; else if (wc >= 0x10d0 && wc < 0x10f8) c = georgian_ps_page10[wc-0x10d0]; else if (wc >= 0x2010 && wc < 0x2040) c = georgian_ps_page20[wc-0x2010]; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/hkscs1999.h000066400000000000000000005531711252300335000245610ustar00rootroot00000000000000/* * Copyright (C) 1999-2006 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * HKSCS:1999 */ static const unsigned short hkscs1999_2uni_page88[627] = { /* 0x88 */ 0x06c0, 0x06c1, 0x06c2, 0x06c3, 0x06c4, 0x720c, 0x06c5, 0x71d1, 0x71cd, 0x06c6, 0x06c7, 0x71cb, 0x8c68, 0x06c8, 0x71ca, 0x06c9, 0x06ca, 0x06cb, 0x06cc, 0x720e, 0x06cd, 0x06ce, 0x0080, 0x0041, 0x010d, 0x0040, 0x0092, 0x0049, 0x009a, 0x0048, 0x00cc, 0x0053, 0x0111, 0x0052, 0x70fd, 0x02be, 0x70fd, 0x02c0, 0x004a, 0x0081, 0x0061, 0x010e, 0x0060, 0x0151, 0x0093, 0x0069, 0x009b, 0x0068, 0x00ab, 0x006d, 0x0110, 0x006c, 0x00cd, 0x0073, 0x0112, 0x0072, 0x00eb, 0x007a, 0x0114, 0x0079, 0x0116, 0x0118, 0x011a, 0x011c, 0x007c, 0x70fd, 0x02bf, 0x70fd, 0x02c1, 0x006a, 0x0161, 0x041a, 0x041b, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, /* 0x89 */ 0xf029, 0x8005, 0x70fd, 0x374a, 0x70fd, 0x70fd, 0x207d, 0x40dd, 0x6dce, 0x62df, 0x70fd, 0x70fd, 0xd275, 0x36d1, 0x215a, 0x2168, 0x21e8, 0x2396, 0x23b4, 0x23dc, 0x2424, 0x24e1, 0x24e8, 0x257b, 0x258e, 0x2611, 0x2618, 0x2922, 0x2b30, 0x2b44, 0x2b47, 0x2b72, 0x2b74, 0x2da6, 0x2dde, 0x2ddf, 0x2eda, 0x30c6, 0x327b, 0x37c9, 0x3a3e, 0x3a44, 0x3aa5, 0x3f8e, 0x42bc, 0x4735, 0x50a4, 0x50ac, 0x50ba, 0x50c7, 0x50cf, 0x50df, 0x5106, 0x5137, 0x547a, 0x54cf, 0x556f, 0x5b46, 0x5d3e, 0x5d62, 0x60a6, 0x60a7, 0x60ae, 0x4611, 0x4efc, 0x4fcd, 0x3b86, 0x4cc9, 0x2467, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x628c, 0x4ab8, 0x625e, 0x52bc, 0x70fd, 0x5e4b, 0x52f6, 0x78e7, 0x70fd, 0x70fd, 0x529f, 0x6f47, 0x1f8d, 0x6e49, 0x6e8c, 0x1efe, 0xebb6, 0xcd4e, 0x6e8a, 0xee73, 0x0901, 0x70fd, 0x409a, 0x543e, 0x4719, 0x70fd, 0x1c11, 0x6b6c, 0x6b8f, 0x7019, 0x4b87, 0xdcac, 0x8a8a, 0x7650, 0x9526, 0x2064, 0x20c1, 0x20c0, 0x20c7, 0x20ff, 0x212b, 0x2177, 0x078c, 0x21fd, 0x1148, 0x2243, 0x22c8, 0x07bd, 0x07d3, 0x07e5, 0x23c6, 0x2b45, 0x241b, 0x243c, 0x2445, 0x20c9, 0x24b9, 0x24d0, 0x2567, 0x0907, 0x25e9, 0x0891, 0x25f0, 0x0893, 0x2602, 0x2663, 0x08ad, 0x08b2, 0x09c1, 0x26d3, 0x26e3, 0x26f4, 0x26f9, 0x2710, 0x272f, 0x2758, 0x2763, 0x2768, 0x08d8, 0x277f, 0x08e5, 0x08ff, 0x2817, 0x0905, /* 0x8a */ 0xd784, 0x2765, 0x70fd, 0x7b02, 0x7bd5, 0xb42b, 0x27d0, 0x96c6, 0x0d2c, 0x7401, 0x5f86, 0xb138, 0xe665, 0x1353, 0xd97e, 0x497a, 0x9638, 0x0d74, 0x1ad5, 0xda1d, 0xc7b2, 0xb16a, 0x371d, 0x7c3c, 0x7e74, 0x7b95, 0x7fb4, 0x36cd, 0x5fbe, 0x7d56, 0x7acb, 0x7e24, 0x96a9, 0xdad6, 0xaa13, 0x70fd, 0x7c06, 0xe9cd, 0xd9a9, 0x1af4, 0xb227, 0x96c2, 0x6bb2, 0x0da7, 0xe6f4, 0x12ed, 0x0846, 0xb587, 0xe754, 0xd3c8, 0x9744, 0x6dee, 0x6915, 0x70fd, 0x16d9, 0xbfe5, 0x36f4, 0x2723, 0x974c, 0x95ca, 0x7f37, 0x0d3b, 0x7f2f, 0xc49a, 0xc4d6, 0xd4a0, 0x372a, 0xb392, 0x7b03, 0x5fa8, 0x8de1, 0xe14c, 0x7731, 0x70fd, 0x1b0b, 0x7269, 0x12fa, 0x2ab3, 0x978d, 0x70fd, 0xaac8, 0x75bc, 0xbfd7, 0x7e0c, 0x7c56, 0x27b9, 0x13bb, 0x16ba, 0x70fd, 0x1d74, 0x94e6, 0x7f5d, 0x53aa, 0x69f5, 0x7c5c, 0x35b9, 0x0d3e, 0x9275, 0x5f00, 0x28e1, 0x36bc, 0x1143, 0x70fd, 0xf101, 0x7cc9, 0x950f, 0x96c9, 0x70fd, 0x7f88, 0xa142, 0x0cd2, 0x0d46, 0xdb1b, 0x08b8, 0xbdc9, 0x8d07, 0x2892, 0x7df1, 0x96b2, 0xe720, 0x07fc, 0x3e7d, 0xb1bb, 0x70fd, 0x70fd, 0xd0f4, 0x988b, 0x8e48, 0xf15b, 0xe24d, 0x7d3a, 0x7af4, 0xc5dc, 0x5193, 0x7f8f, 0x9303, 0x9439, 0x093b, 0xb4a3, 0x7d4c, 0x7e4d, 0x7d6a, 0x1293, 0x7df0, 0x7c07, 0x800f, 0x7d0c, 0x70fd, 0x7d6b, 0x7a69, 0x7c08, 0x7f80, 0x7ffd, 0x12f9, 0x9196, 0x3672, 0x7e6d, /* 0x8b */ 0x9d34, 0xd1b9, 0x95ce, 0x7c3e, 0x7c3f, 0x9651, 0x9655, 0x0d58, 0x7d58, 0x7f87, 0x7dee, 0xf132, 0xc890, 0xe252, 0xe2d9, 0xe24a, 0x66aa, 0x270c, 0x54c4, 0x27f9, 0x70fd, 0xec83, 0x6d26, 0x6bb6, 0xd29e, 0x97ee, 0x4340, 0x536d, 0x52ec, 0x2e5c, 0xc3b2, 0x5334, 0x0ad7, 0x259f, 0xd97d, 0x62b6, 0x7dba, 0x7ccf, 0x7d37, 0x7dbb, 0x091d, 0xb16b, 0x0949, 0x7b96, 0x28ef, 0x92b5, 0x7f89, 0x7cd0, 0x7d38, 0x7f38, 0x8008, 0xda87, 0x8315, 0x7d39, 0xb1d0, 0x97a4, 0x2c94, 0x7edd, 0x7ede, 0x7fb5, 0x7fb6, 0x29dc, 0x7cd1, 0xd214, 0xdb4d, 0x7e75, 0x7d3b, 0xb47e, 0x0a43, 0x7e76, 0x8040, 0xb598, 0xefbd, 0xae5a, 0x867a, 0xa6b7, 0xdafc, 0x2ad9, 0x24a8, 0x095a, 0xb8bd, 0x4db2, 0x2da8, 0x1b00, 0x1dec, 0x6fa7, 0x1ce7, 0x6d1f, 0x6c8d, 0xbb74, 0x9abd, 0x283b, 0x0932, 0x28c9, 0x2068, 0x2b42, 0x8901, 0xf238, 0x6851, 0x7186, 0x209b, 0x20fb, 0x087e, 0x2e63, 0x3191, 0x3204, 0x0c3a, 0x348c, 0x3775, 0x3dba, 0x3e75, 0x3e7a, 0x426c, 0x442b, 0x206c, 0x44ad, 0xad69, 0x5152, 0x4b3b, 0x4ef9, 0x5153, 0xc12a, 0x0801, 0x70fd, 0xc1cb, 0x5202, 0x5280, 0xc412, 0xc711, 0x259d, 0x59e4, 0x5b41, 0xd3b2, 0x5d20, 0x5e5d, 0x6585, 0x6678, 0x667f, 0x66e8, 0xe30f, 0x68e6, 0x6975, 0x69ce, 0x69de, 0x6a63, 0xe790, 0x6d7c, 0x6e9f, 0x6f44, 0x3daf, 0x7047, 0x2077, 0x7187, 0x671d, 0x3477, 0x65a2, }; static const unsigned short hkscs1999_2uni_page8d[3140] = { /* 0x8d */ 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x2f7e, 0x2f88, 0x2f96, 0x10fc, 0x0b4f, 0x2fe4, 0x2ff9, 0x0b60, 0x0b78, 0x3082, 0x30fd, 0x3165, 0x31c3, 0x0c48, 0x0c54, 0x0c7f, 0x0c8d, 0x3317, 0x337d, 0x2f25, 0x0cc9, 0x33f7, 0x33f9, 0x340f, 0x0cf8, 0x346c, 0x34d0, 0x3525, 0x3558, 0x0d38, 0x28f1, 0x0d43, 0x3622, 0x363b, 0x3647, 0x369a, 0x0d8b, 0x3700, 0x2f55, 0x2861, 0x701f, 0x0dd7, 0x37c6, 0x0dfd, 0x383f, 0x3893, 0x0e32, 0x38d2, 0x0e62, 0x3956, 0x0e82, 0x39e4, 0x3a40, 0x0e98, 0x3a8a, 0x3ac4, 0x0eb2, 0x0eb1, 0x0ebb, 0x3b49, 0x3b83, 0x445c, 0x3ba4, 0x3bdf, 0x3bc5, 0x0efc, 0x3c16, 0x0f1d, 0x3ca5, 0x3cb4, 0x3cb1, 0x3cc2, 0x0f2c, 0x3cd9, 0x0f32, 0x3ceb, 0x3cf5, 0x3d14, 0x3d36, 0x3dc1, 0x3e01, 0x3e2a, 0x3eb5, 0x3eea, 0x0fcb, 0x3f42, 0x3f46, 0x3f66, 0x3fc1, 0x0fef, 0x3fe4, 0x3ff1, 0x4015, 0x4018, 0x4029, 0x4086, 0xdfc0, 0x40bb, 0x40e2, 0x40da, 0x6fff, 0x40e8, 0x40e9, 0x4124, 0x4134, 0x1046, 0xa481, 0x4181, 0x41be, 0x106a, 0x1075, 0x43b7, 0x2ed9, 0x108a, 0x422c, 0x1091, 0x4250, 0x4254, 0x426f, 0x427f, 0x4289, 0x73e5, 0x16c1, 0x0931, 0x7d98, /* 0x8e */ 0xa417, 0x29fe, 0xcc13, 0x433e, 0xb920, 0x098e, 0x3be2, 0xe1e9, 0x2db4, 0x4c49, 0xb9a1, 0xe659, 0x4c65, 0x4c7d, 0xba6c, 0x4cbb, 0x4cb0, 0x4cc2, 0x4cc3, 0x43d1, 0xc30d, 0x14ca, 0x4cda, 0x4cdd, 0x4cea, 0x14ef, 0x26f2, 0xbc01, 0x4d0b, 0x4d55, 0x4d29, 0xb5ce, 0xbcfe, 0x4da2, 0x4d6f, 0x559c, 0xbbb4, 0xc9bf, 0x4dd0, 0x5621, 0x4d92, 0x70fd, 0xbd20, 0x10ad, 0xbc65, 0x5692, 0x4dfa, 0x70fd, 0x4e35, 0xbcc1, 0x4e44, 0x4e83, 0xad02, 0x4ea6, 0x38bd, 0xaab8, 0x4ec9, 0x4ec7, 0x4ee6, 0x4e74, 0x4ef3, 0x4ef5, 0x70fd, 0x5067, 0x181d, 0xcb84, 0x4f5d, 0xcc16, 0x468d, 0x4f89, 0x4fab, 0x4335, 0x4fb3, 0x70fd, 0xa597, 0xbf69, 0x4fe4, 0x1013, 0x4ff5, 0x8639, 0x4fe5, 0xdbed, 0x70fd, 0xc021, 0xc05a, 0x506e, 0x5092, 0x162b, 0x656c, 0x5027, 0x5140, 0x5141, 0x5147, 0x4b36, 0xc150, 0x6ae1, 0x5197, 0xc1d1, 0x51a3, 0x84a1, 0x7168, 0x185c, 0xa066, 0x1803, 0xdbba, 0x51fa, 0xc309, 0x70fd, 0x5208, 0x521d, 0x70fd, 0x522f, 0xedc7, 0xca03, 0x523b, 0x523c, 0x5261, 0x9214, 0x1c89, 0xc426, 0xa363, 0xc4a8, 0x3965, 0x52a7, 0xe048, 0x5307, 0x531a, 0x2af0, 0x91f6, 0x3ebf, 0xc318, 0xb2f8, 0x3727, 0x834a, 0x5418, 0x869e, 0x3c93, 0xaee5, 0xaf15, 0x177a, 0x5429, 0x7a0d, 0xc812, 0xa2fe, 0x2239, 0x83bd, 0x56e2, 0x5562, 0xc84a, 0xae27, 0x9e30, 0x85b3, 0xa378, 0x54aa, 0x3b5b, 0xf2d4, 0x14db, /* 0x8f */ 0x574b, 0x54d0, 0x551a, 0x7cd6, 0x85f4, 0x0a01, 0x9afd, 0x9e5a, 0x547b, 0x54e2, 0x5518, 0xa3cb, 0xcae3, 0xc845, 0xc8d7, 0x9ece, 0x10bf, 0x551d, 0x282c, 0x5585, 0x180b, 0xcae5, 0x55ac, 0x70fd, 0x55d3, 0x07be, 0xcc14, 0x3c97, 0x575a, 0x07d6, 0xcb82, 0x98ef, 0x5658, 0xbbe4, 0x5671, 0x10d3, 0x17e4, 0x3ce7, 0x564a, 0xa275, 0x4b58, 0x70fd, 0xc8d6, 0xcbb7, 0xcb83, 0x56de, 0x70fd, 0x5591, 0x17a0, 0x5693, 0x56e4, 0xbc91, 0x1540, 0xbcc0, 0x1843, 0x5734, 0x2d32, 0xcbd9, 0x1827, 0x5773, 0x1816, 0x39ff, 0x57d6, 0xdde5, 0xddfb, 0x5781, 0xcdc8, 0x57c2, 0x8402, 0xce0d, 0xf2f2, 0x186a, 0x57e8, 0x0988, 0x86e2, 0x2637, 0xcfda, 0x583e, 0x58f1, 0xee38, 0x596e, 0x9627, 0x5931, 0x595a, 0x598f, 0x28a1, 0x582c, 0x3a96, 0x190f, 0x59c5, 0x59c6, 0xd160, 0xa339, 0xd164, 0x59de, 0x5a1c, 0x195b, 0x5a34, 0x5a35, 0x3601, 0x5a45, 0x4977, 0xd24f, 0x5b07, 0x5b0a, 0x70fd, 0x70fd, 0x5b27, 0x5b3c, 0xe025, 0x5b67, 0xd424, 0xd5bd, 0x5c1c, 0x4993, 0x62fe, 0x5c10, 0xd559, 0x4ce9, 0xd63a, 0xa4cf, 0x1a13, 0xd638, 0x437c, 0x5c8c, 0x5c9f, 0xb630, 0xb6e5, 0x5cbf, 0x5ccc, 0x5ccd, 0x5c29, 0xaefa, 0x5d10, 0x5d1b, 0x5c2f, 0x851f, 0x1915, 0x59cf, 0x5ddb, 0xd754, 0xd78f, 0xf314, 0x0a65, 0xd753, 0x5e16, 0xd798, 0xd7bd, 0x5e52, 0x5e43, 0x8750, 0x5e1b, 0x425c, 0x5e51, 0xb089, 0x11d0, 0x70fd, /* 0x90 */ 0x5ee9, 0xd8c2, 0x7ed4, 0xae0a, 0x0ebc, 0xda7c, 0xce4c, 0x4ce7, 0x5fed, 0x5ff6, 0x6003, 0x63d4, 0x6059, 0x606d, 0xdbe5, 0xdc52, 0x60e5, 0x6403, 0xef9f, 0x7950, 0x60f3, 0x1c2a, 0xdfde, 0xdd3d, 0xa33b, 0x3138, 0x9be2, 0x6139, 0xed94, 0xde3c, 0xdd01, 0x8ee5, 0x0cc0, 0xcc17, 0x6177, 0xdd3c, 0xd5be, 0x61a1, 0xdd6c, 0xddcb, 0x61e8, 0xde93, 0x6204, 0xde66, 0x61ee, 0x70fd, 0x6267, 0x0e30, 0x62a9, 0x62c4, 0x4eac, 0xdf33, 0x8b09, 0x630e, 0x3edf, 0x6341, 0x6362, 0xb739, 0x70fd, 0xe0c6, 0xa25b, 0xe10c, 0xb75b, 0x7bf1, 0x642c, 0x646b, 0xe0e1, 0xe1eb, 0x428f, 0x2d03, 0xe0e2, 0xe0e5, 0x1c65, 0x6344, 0xe1ec, 0xe239, 0xe1ff, 0x6473, 0x655b, 0x5ffc, 0x6685, 0x66a6, 0x6526, 0x66a0, 0x41f6, 0x15b9, 0x917a, 0xde58, 0x813c, 0xa3ae, 0x1cdf, 0x3e5c, 0x677b, 0x6796, 0x146c, 0x67a3, 0xcc15, 0x341a, 0x67b6, 0x4af5, 0xe0e0, 0x67bd, 0x260c, 0x1ca1, 0xc9f8, 0x7334, 0xc290, 0xe46f, 0xe4a5, 0xaf51, 0x8755, 0x9c8a, 0x6831, 0x5802, 0x6836, 0x1d0f, 0x183d, 0x1885, 0xaf69, 0x4275, 0x2d81, 0x681b, 0x70fd, 0xe595, 0x6857, 0x2d8a, 0xe5ab, 0x685f, 0x6525, 0x2310, 0x9a37, 0x9a3c, 0x6889, 0x689f, 0x68b1, 0x68be, 0x68c0, 0x68d2, 0x68e0, 0xb66c, 0x68ee, 0x461c, 0xe5f3, 0x70fd, 0x68f5, 0xe5dd, 0xd47a, 0x1d91, 0x6934, 0x6933, 0x694b, 0x6966, 0x0e4e, 0xceb5, 0x1051, 0x76b0, 0xa69c, /* 0x91 */ 0xb886, 0x69ca, 0x69b7, 0x69c8, 0x69c7, 0x1dbf, 0xca67, 0x8513, 0x27f0, 0x69e1, 0x69e6, 0x69ec, 0x6478, 0x6a39, 0xaea9, 0x1e32, 0xe7d7, 0xe885, 0x6af5, 0x6b0c, 0x6b3b, 0x6b10, 0x6b58, 0xb8a5, 0x0a04, 0xe471, 0xea55, 0x6be0, 0x6be2, 0xea05, 0x6bf4, 0x1ece, 0x6c14, 0x6c2d, 0xddc0, 0x2274, 0x6c34, 0xc768, 0x0c03, 0x99fd, 0x6c50, 0x6c40, 0xeafe, 0x2c85, 0x86a3, 0x6c8e, 0xa78b, 0x6d02, 0x6cff, 0x6d0c, 0xec28, 0x6e54, 0xed37, 0xeed2, 0xeeeb, 0xee21, 0xee63, 0xef1f, 0x6dfe, 0x6e03, 0xee74, 0x6e8e, 0x3ac8, 0x6e44, 0x8d9b, 0xeed3, 0xef60, 0x877b, 0xef73, 0x6db9, 0xedf9, 0xefb4, 0x6f10, 0x6f15, 0x6f1e, 0x6f22, 0x1ff4, 0x6f2a, 0x6f2f, 0xa8a4, 0x6f41, 0x0ea0, 0x0d25, 0x101d, 0x2172, 0x0afe, 0xe22b, 0x6f82, 0x6f88, 0x1e56, 0x6524, 0xcae2, 0x6f97, 0x70fd, 0x6fb9, 0x28df, 0x28ca, 0x6fc5, 0x6ab8, 0xe44b, 0x68f2, 0x567f, 0x6fe2, 0x6fe9, 0x4cdc, 0x700e, 0x4416, 0x1e7e, 0xadf5, 0xae3b, 0x4377, 0xae78, 0xa888, 0xaed1, 0x459e, 0xe1da, 0x873a, 0x4b9f, 0xdf7e, 0xe336, 0x6469, 0x64f3, 0xe044, 0x63ec, 0x6481, 0x64cb, 0xdf6c, 0xa9f9, 0x4417, 0x11eb, 0x4972, 0x4c43, 0x42d0, 0xa9b3, 0xa938, 0x437e, 0x862f, 0x42a3, 0x86fe, 0x9e99, 0x11c7, 0x86c5, 0xb62f, 0x8638, 0x0a62, 0x853b, 0x8679, 0x0a21, 0x85b4, 0x8711, 0xbecb, 0x0a63, 0x8500, 0x299b, 0xaea5, 0x82be, 0x8168, /* 0x92 */ 0x8286, 0x8376, 0x5703, 0x9fa6, 0x70fd, 0x5655, 0xae14, 0xcea5, 0xa3b1, 0xb6dc, 0xa43b, 0xcd92, 0x17f4, 0x9fee, 0xe91d, 0xcc66, 0x3a39, 0x0a73, 0x0f55, 0x10e7, 0x2aac, 0x8762, 0x3a50, 0x1357, 0xa03f, 0xa621, 0xa5cb, 0xa64f, 0xc961, 0x270b, 0x28de, 0xc471, 0x28d2, 0x7e9f, 0x7a68, 0x7ccd, 0x64c6, 0xe113, 0x649c, 0x2138, 0x236b, 0x0b59, 0xa976, 0x20fc, 0x7525, 0x743f, 0x218b, 0x21ca, 0xb7d1, 0x2ca8, 0x726b, 0x748b, 0x0cd9, 0x73ca, 0x74d4, 0x0775, 0x2169, 0x7380, 0xe3b3, 0x7335, 0x5c5a, 0x72cc, 0x20d8, 0x230d, 0x234d, 0x21e2, 0x2143, 0xae8e, 0xa3ca, 0x2182, 0x226e, 0x22ac, 0x22c1, 0x220c, 0x2225, 0x2298, 0x233c, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x4076, 0x9e95, 0xa3b9, 0xa3ff, 0x3fb2, 0x86c4, 0xa3c9, 0x23e8, 0x2403, 0x7660, 0x17dd, 0x7563, 0x7552, 0x7551, 0x5eba, 0xe09c, 0x770e, 0x2499, 0x24e4, 0x77f3, 0x2521, 0x70fd, 0x197a, 0x438c, 0xa8cc, 0x7ae0, 0xae2c, 0x7fa4, 0x3c11, 0x7cdd, 0x70fd, 0x11de, 0x4699, 0x4614, 0x4656, 0x4598, 0x1e4e, 0xaf3c, 0xa5cd, 0x2610, 0x08c4, 0x440f, 0xa609, 0x27f4, 0x7405, 0x270d, 0x7a86, 0x295d, 0x635d, 0x67f4, 0x6466, 0x2a1d, 0x29cd, 0x29bf, 0x097e, 0x2b0b, 0x2cd9, 0xe046, 0x853a, 0x85af, 0x8550, 0x2c6c, 0x2bf8, 0x638f, 0x2cbe, 0x2d0f, 0x2c52, 0xba06, 0x8833, 0x86a1, 0xa7d5, 0x0a35, 0x3f45, 0x4643, 0x2c61, 0xbe03, /* 0x93 */ 0x2cc1, 0xe1d7, 0x74d3, 0x64e0, 0x468c, 0x81c3, 0x4305, 0x1c72, 0x6508, 0xdffb, 0x64bd, 0x0ae0, 0x2e5e, 0x2ede, 0x309e, 0x3088, 0x87d6, 0x87bc, 0xa1ee, 0x310d, 0x2d8f, 0x8743, 0x8744, 0x0a41, 0x86e0, 0x0a1d, 0x853e, 0x0a13, 0x532a, 0xe047, 0x8a7a, 0x9db2, 0xdfa8, 0x314c, 0x314e, 0x8767, 0x85eb, 0x2cab, 0x857b, 0x2d84, 0x57d4, 0xd17d, 0x59e0, 0x32be, 0x9360, 0x912b, 0x321b, 0x11b8, 0x90ef, 0x90fe, 0xe448, 0xccb3, 0x3400, 0x713e, 0x7146, 0x911b, 0x33d9, 0x33d8, 0x32b5, 0x969b, 0x9707, 0xabd4, 0xe50d, 0x36b1, 0xab65, 0x95aa, 0x0d69, 0x9562, 0x9d90, 0xe86a, 0x9878, 0x3577, 0xf09b, 0x36f6, 0x3571, 0x3611, 0xae63, 0x9767, 0x34e4, 0x96a1, 0x367b, 0x37ab, 0x3bb2, 0x0f34, 0x9a0e, 0x9c2d, 0xae09, 0x9c2b, 0x274d, 0x9c60, 0x8719, 0xe5ff, 0x390e, 0x9c09, 0x9b33, 0x0e20, 0x1490, 0xb704, 0xe122, 0xb70f, 0x853c, 0xb6db, 0xb625, 0x4aee, 0x9a83, 0x866a, 0x9bb4, 0x07a4, 0x9b8f, 0x9b02, 0xa809, 0x38ce, 0xca64, 0x38ab, 0x1e53, 0x3870, 0xd370, 0x8aab, 0x38a3, 0x9c52, 0x9c61, 0x385e, 0xb972, 0x0c11, 0xa13a, 0xa0bc, 0x0ed9, 0xa0a2, 0x9d3e, 0x46d0, 0x0ed6, 0x39cf, 0xab2a, 0x3af6, 0x3a5e, 0x0f04, 0x3cfe, 0x0ba3, 0xa0d5, 0xa9c7, 0x3c73, 0x3c92, 0x3d09, 0x3d45, 0x8752, 0x3751, 0x3ad8, 0x3c8c, 0x0f17, 0x3cba, 0x3d97, 0xa500, 0xa25a, 0x64a0, 0x63f2, 0xe1ea, 0xe0cb, /* 0x94 */ 0x6389, 0xd8de, 0xdfdc, 0x6567, 0x3fe5, 0x410b, 0xae6c, 0x70fd, 0xa4bf, 0x108f, 0x4004, 0xa57c, 0x2c7d, 0x400a, 0x2a87, 0x3f64, 0x4a42, 0x433b, 0xa85a, 0xa7b6, 0x42f1, 0x4450, 0x4487, 0x4494, 0xac4f, 0xac25, 0x23b9, 0xaf24, 0x766b, 0x467a, 0xa438, 0x9f5f, 0xaeca, 0xad97, 0xbf21, 0x1206, 0x11b1, 0xaf5f, 0xe223, 0xa475, 0x32e7, 0x11f3, 0x46cc, 0x463c, 0x6487, 0x4637, 0x179f, 0xcb2a, 0x1851, 0x4783, 0x1263, 0xb099, 0xb0c6, 0x1258, 0x4755, 0x4873, 0xf0c6, 0x0e59, 0x4668, 0xe0cc, 0xae2b, 0xae0e, 0x0e3b, 0x10cd, 0xaece, 0x11ff, 0xae45, 0xad73, 0x62fa, 0x2972, 0x6442, 0xe0e3, 0x86a4, 0x231f, 0xb4e1, 0xb4a7, 0x4978, 0x9bb2, 0x490e, 0x490f, 0x497b, 0xab97, 0xa081, 0x0d9e, 0xad70, 0x4638, 0x469b, 0x11bf, 0xaf3a, 0xaf47, 0x13c8, 0xaf16, 0xc0ae, 0x6407, 0xb701, 0x4a1e, 0x4a8d, 0x4a88, 0x4ad2, 0x45d0, 0x4b59, 0xd281, 0xb863, 0x140e, 0x70fd, 0x5696, 0x4ba5, 0x3c6d, 0xa43a, 0x4c3a, 0x4bf4, 0x146e, 0x8526, 0x1432, 0x6335, 0x4bf1, 0x7c0c, 0xae0c, 0x7359, 0xa33a, 0x85ae, 0x08d7, 0x27ab, 0x08b0, 0x09ea, 0x7294, 0x7acd, 0x4ce2, 0x2c99, 0x91f5, 0xbaef, 0xbadc, 0x2c4d, 0x731b, 0x4af0, 0x2c6a, 0xbbc6, 0x4cfe, 0x14f9, 0x4e5d, 0x4e6d, 0x1511, 0xbbb3, 0xbe3c, 0xbe26, 0x4ecd, 0xae79, 0x85f0, 0x4e8e, 0x4e7c, 0x4eae, 0x3cf2, 0x4fdc, 0x5007, 0x4fd3, 0x514e, 0xc121, /* 0x95 */ 0xc05c, 0xd648, 0x4f97, 0xbe02, 0x156a, 0xc8b5, 0x7856, 0x3a16, 0x714e, 0x9ecf, 0x2a04, 0xc292, 0xc278, 0xade2, 0x51dd, 0x4d27, 0x77ac, 0xbb29, 0xbd43, 0x4d0c, 0xbd8e, 0x6ae6, 0x5805, 0x6b63, 0x3c5c, 0x9d7f, 0x0d22, 0xae77, 0xc3ed, 0x6b1f, 0xc3e0, 0x5680, 0xce67, 0xca11, 0x17ea, 0x5337, 0x1702, 0x52c6, 0x5309, 0x5342, 0xc574, 0x69c3, 0xc802, 0x5462, 0x5465, 0xc811, 0x5653, 0xcae7, 0x57d0, 0xcf1b, 0x2cc6, 0x147f, 0x8680, 0x2d6b, 0x86e1, 0x2d24, 0x8718, 0x5860, 0xf2fc, 0xa30f, 0x59ad, 0xd022, 0x2c42, 0x59ee, 0x2185, 0x5a07, 0x5a3f, 0x5a66, 0x5ae5, 0x5acd, 0xb803, 0x5ad4, 0xd2c5, 0xd2c4, 0xe1f5, 0xe1d9, 0xe19c, 0xdff9, 0x11ad, 0x56a3, 0x19f5, 0x19cf, 0x0b32, 0x5bbd, 0x5b9c, 0xe608, 0x318d, 0x632b, 0xa7c4, 0x3814, 0x4329, 0x42c4, 0x8685, 0x6ded, 0x5ddf, 0x5e29, 0xd7dc, 0x2bda, 0x49c3, 0x2c30, 0x166e, 0x0a14, 0x5f6a, 0x5fe7, 0xb009, 0x6070, 0x608a, 0x15f4, 0x3e98, 0x41bb, 0x8ee1, 0x1b9b, 0x4179, 0x408b, 0x861a, 0x6ce9, 0x09f5, 0xadaf, 0x61fb, 0x70fd, 0x27b1, 0x1c06, 0x62bb, 0x6504, 0xe04b, 0x1362, 0xe0fc, 0x6527, 0xe21d, 0xe23b, 0x56e5, 0x5bab, 0x6699, 0x66a7, 0x6697, 0x6696, 0xe2b4, 0x4645, 0x11c2, 0xad7f, 0xaec2, 0xa92a, 0x11e7, 0x9ba5, 0x678f, 0xe3e7, 0xe366, 0xe365, 0x11cc, 0xae6d, 0xaef8, 0xa52e, 0x4612, 0x466b, 0x11fc, 0x6841, 0xe470, /* 0x96 */ 0x3a87, 0x1d1d, 0xe453, 0xb91f, 0x70fd, 0x6468, 0xdf89, 0xe226, 0xe12f, 0xc23e, 0x63ba, 0x2d51, 0x5ce9, 0x1c3c, 0x45f9, 0xa75b, 0x689b, 0x6871, 0x6a38, 0x7de6, 0x3001, 0xe1c5, 0xaf32, 0x691f, 0xe65a, 0x63f6, 0xe6d7, 0x62e5, 0x17c0, 0xe150, 0xaee7, 0xe164, 0x69dc, 0xe045, 0x1200, 0x632a, 0x1c25, 0x5614, 0x6a3b, 0x6a4d, 0xd606, 0x10fd, 0x6a9b, 0x1e2f, 0x6aaa, 0x6b5c, 0xe165, 0xb988, 0x3ccf, 0x6b21, 0x2d3e, 0x6b2f, 0xe871, 0x1e50, 0xe8c8, 0x6abc, 0x1e7d, 0x1e57, 0x647d, 0x2ab2, 0x81c2, 0x2a62, 0xae38, 0x83a8, 0x4a44, 0x921f, 0xa338, 0x3b05, 0x107d, 0x6558, 0x0c67, 0x3390, 0x9281, 0x946b, 0x3347, 0x6d4f, 0x6d53, 0x6d7b, 0x6d35, 0x6d10, 0x6c7f, 0x6ccf, 0xebed, 0x6c9f, 0xef35, 0xee3e, 0x6da1, 0x1f6e, 0xa644, 0x6e98, 0x1f70, 0x6d8c, 0xeef4, 0xee2d, 0xee33, 0xe8af, 0x6e25, 0x56bd, 0xcb52, 0xcd1f, 0xc8c2, 0x57bc, 0x1833, 0xcae4, 0xcbc4, 0xcb30, 0x5620, 0x57ae, 0xcb40, 0xa0d7, 0xbfa4, 0x4be2, 0x9e9c, 0x9f40, 0x1c2d, 0xae5e, 0x1062, 0x64db, 0x63be, 0x6448, 0x737f, 0x4ab9, 0x6377, 0x654d, 0x2224, 0x0780, 0x61a4, 0xb6dd, 0x4a3d, 0x4a54, 0x4ab6, 0x4a4b, 0x8597, 0x9b49, 0xadc1, 0x09da, 0x21b2, 0x41da, 0x41d9, 0x70fd, 0x421e, 0x2654, 0xa6f5, 0x29fb, 0x2b33, 0x29ca, 0x6d96, 0x2a17, 0x4334, 0x07ef, 0xa6ec, 0x43eb, 0xc980, 0xb2d7, 0x70fd, 0x85f5, 0xe049, /* 0x97 */ 0x334c, 0x2d0e, 0x2c4b, 0x15bc, 0xa9c8, 0x0a6c, 0x1e3b, 0xdffc, 0x64bb, 0x64b8, 0x8716, 0x7ddd, 0x5672, 0xca00, 0x82d3, 0xa83a, 0x9626, 0xa901, 0x2bd4, 0xa337, 0xc501, 0x4fa8, 0xc05b, 0xbfe4, 0xae39, 0xae0b, 0xdffa, 0x63e5, 0x45e2, 0x11e9, 0x46b4, 0xe163, 0x86df, 0x11e1, 0xaf33, 0x3d18, 0x45f3, 0x45fb, 0x11d6, 0xaebe, 0xaf14, 0x8619, 0xaee6, 0x7467, 0x82e4, 0xae65, 0x4648, 0xad96, 0x42a5, 0xadf6, 0x6384, 0x45e6, 0x645f, 0x75be, 0x6431, 0xe0ce, 0xe016, 0x6486, 0xe1e7, 0xb755, 0x1c35, 0xe082, 0x436b, 0xadc3, 0x7bbf, 0x28e4, 0x769a, 0x7aab, 0x7b78, 0x2742, 0x4bc4, 0x863a, 0x4ffe, 0x8502, 0xaed0, 0x8692, 0x182e, 0x6501, 0x0a4a, 0xe0c0, 0xae2d, 0x2bf0, 0x86ff, 0x86c3, 0xd084, 0x2ce1, 0x0a22, 0xa2db, 0x09f0, 0x635f, 0x2cb9, 0xe081, 0x86a2, 0x6474, 0x0fcd, 0x79b4, 0x1d56, 0x0cca, 0x2334, 0x1069, 0x104c, 0x825c, 0x4375, 0x15fb, 0xda98, 0x400f, 0xe4a4, 0x17eb, 0x3f97, 0xd80f, 0x4267, 0x3eef, 0x0fd6, 0xa52d, 0xa3ad, 0x4002, 0x410c, 0x106f, 0x74b5, 0x4751, 0x09fc, 0x0808, 0x1980, 0x11da, 0x1b71, 0x2c04, 0x636e, 0x1c3e, 0x6081, 0xe21c, 0xc900, 0x2a52, 0x2a08, 0x0a16, 0x8312, 0x42fe, 0xa8a2, 0xaef1, 0x9963, 0x8170, 0x8f3d, 0x3af9, 0x3ba7, 0x8258, 0x9de5, 0xd6b4, 0x9fdf, 0xe083, 0xa0d6, 0x9d3a, 0xb05f, 0x3c5a, 0x9fad, 0xc9f7, 0x563e, 0x17df, 0x17ce, /* 0x98 */ 0xca66, 0xca91, 0xc9c2, 0xcd1e, 0x4117, 0xce49, 0x553d, 0x857a, 0x55ed, 0xc9c0, 0xcd93, 0x861b, 0x2bc9, 0x2cc2, 0x85f3, 0x2ca1, 0x2cb1, 0x8745, 0xa73c, 0x0a6d, 0x2c2f, 0x857c, 0x0a07, 0x438e, 0x6490, 0x38da, 0xa7e5, 0x2cae, 0x2c6b, 0xa7d3, 0x3c6b, 0xa439, 0xd276, 0xa99b, 0xa80a, 0x431d, 0xa799, 0xdfe1, 0x21f0, 0xca68, 0x2f02, 0xaa0e, 0xd80d, 0xa8fd, 0x3c4c, 0xa796, 0x81c4, 0x42a6, 0x4333, 0xa929, 0x10a5, 0x3f1f, 0xf1e5, 0xaecf, 0x5065, 0x2c2b, 0x2f6f, 0x10f3, 0x319c, 0xaedd, 0x861f, 0x4fa4, 0x5626, 0x26c5, 0xa1fa, 0x9c80, 0x72d4, 0x29be, 0x7815, 0x7699, 0x12e5, 0x8c1e, 0xefb6, 0x4203, 0xe51b, 0x2fb0, 0x458f, 0x4ed3, 0xe059, 0xe5e0, 0x2208, 0x51e7, 0x44cd, 0x4510, 0xd5f4, 0x4538, 0x4539, 0xb876, 0x4541, 0x4548, 0x11a9, 0xd618, 0x61ac, 0x43f5, 0xad72, 0x45e1, 0x53f6, 0x11ca, 0x490c, 0x11d1, 0x3ee2, 0x293d, 0x4619, 0x461e, 0x461f, 0x11e2, 0x11f0, 0x11f4, 0x11fa, 0x46d3, 0x120e, 0x1253, 0x4742, 0x476d, 0x4772, 0x478d, 0x127c, 0x47c8, 0x47dc, 0x12c0, 0x484d, 0x12d7, 0x4874, 0x12dc, 0x487a, 0xb29c, 0x4388, 0x2863, 0x5b00, 0x2aa9, 0x131d, 0x4943, 0x1339, 0x39a1, 0x1345, 0x091b, 0x4998, 0x136a, 0x136f, 0x2e9e, 0x49be, 0x49cb, 0x2b32, 0x4a18, 0x42b9, 0x4a1c, 0x13a8, 0x4a39, 0x4a47, 0x4a51, 0x4a66, 0x5648, 0xb6b5, 0x4b33, 0x3a43, 0x4b32, 0x1403, /* 0x99 */ 0x1409, 0x4b91, 0x4b99, 0x60fb, 0x4c06, 0x60fc, 0x1467, 0x4c91, 0x14b2, 0x4cbc, 0x5479, 0x14c4, 0x4ccf, 0x4cdb, 0x14cf, 0x2061, 0x4d62, 0x4d6c, 0x4d7b, 0x4e12, 0x4e1b, 0x1560, 0x157a, 0x4e7b, 0x4e9c, 0x158c, 0x4eb8, 0x1594, 0x4eed, 0x60d3, 0x42c0, 0x7b8f, 0x4fcf, 0x4fd4, 0x4fd0, 0x4ffd, 0x51ae, 0x51b4, 0x449f, 0x1697, 0x5220, 0x5225, 0x4d39, 0x522e, 0x5231, 0x5254, 0x10cc, 0x29f4, 0x42a0, 0x52b7, 0x52e9, 0x16ed, 0x530c, 0x452a, 0x530e, 0x5312, 0x4760, 0x5314, 0x1701, 0x0e79, 0x5356, 0x5359, 0x535a, 0x1713, 0x2a7a, 0x537c, 0x5384, 0x1725, 0x5393, 0x172d, 0x53a5, 0x2a2f, 0x53c1, 0x53e4, 0x5454, 0x178f, 0x54a6, 0x5476, 0x54ca, 0x54d8, 0x54ff, 0x17b0, 0x5557, 0x6769, 0x3bca, 0x5605, 0x42f5, 0x5664, 0x3323, 0x5688, 0x1804, 0x56be, 0x56e1, 0x56f8, 0x5710, 0x5738, 0x5752, 0x183b, 0x576f, 0x5770, 0x57a0, 0x1877, 0x5832, 0x5852, 0x5872, 0x58af, 0x6745, 0x590b, 0x1906, 0x1917, 0x5a2e, 0x5a7f, 0x5aa4, 0x5ac7, 0x5b11, 0xd467, 0x5ba9, 0x5bb8, 0x5c14, 0x5c34, 0x5d91, 0x5e14, 0x5e32, 0x5e5c, 0x1a98, 0x2a9f, 0x5f03, 0x1aed, 0x212e, 0x5f7a, 0x2818, 0x2994, 0x5fb1, 0x2835, 0x5ff0, 0x1b37, 0x600e, 0x6022, 0x6024, 0x602d, 0x6032, 0x60f7, 0x6101, 0x610a, 0x610c, 0x6173, 0x6ac4, 0x1bad, 0x69e0, 0x6313, 0x1c1e, 0x6328, 0x6358, 0x636b, 0x63b1, 0x63ae, 0x63bf, /* 0x9a */ 0x63e3, 0x63eb, 0x63f3, 0x63f4, 0x63fd, 0x6443, 0x6484, 0x64ad, 0x1c45, 0x1c51, 0x6f3f, 0x6517, 0x2541, 0x651d, 0x652d, 0x653e, 0x1c6a, 0x6554, 0x6579, 0x662d, 0x66a2, 0x1ca7, 0x66f4, 0x6733, 0x1ce5, 0x39e0, 0x1d24, 0x6840, 0x1d35, 0x68b2, 0x68c2, 0x2894, 0x1da4, 0x3328, 0x69b9, 0x1dd9, 0x69f1, 0x2a84, 0x6a0e, 0x6a19, 0x23f4, 0x6a1c, 0x6a37, 0x6a42, 0x6a5d, 0x6a62, 0x1e30, 0x6ac5, 0x1e5d, 0x6b3c, 0x6c0f, 0x4c83, 0x6c69, 0x6c81, 0x6cdd, 0x6cf1, 0x6cf4, 0x1f2d, 0x6d20, 0x0aaf, 0x8902, 0x6dc9, 0x6d3a, 0x6f7e, 0x2890, 0x6e13, 0x6e3d, 0x6e40, 0x6e7c, 0x65f6, 0x60f6, 0x6efb, 0x6f2c, 0x6f31, 0x6f3d, 0x6f46, 0x65dc, 0x6f62, 0x6f71, 0x6f78, 0x4cc8, 0x6fc4, 0x7194, 0x7377, 0x7460, 0x3b5a, 0x65c3, 0x2bec, 0x7597, 0x2a80, 0x65c1, 0x0af9, 0x7655, 0x7695, 0x76f6, 0x84fa, 0x2997, 0x4373, 0x79c2, 0x79cd, 0x7a7f, 0x26aa, 0xf1fb, 0x7a8b, 0x26de, 0x7abb, 0x7afb, 0x7b13, 0x7b25, 0x7b3c, 0x3327, 0x7b4d, 0x28ba, 0x7b75, 0x7b9d, 0x7bad, 0x7c2f, 0x7c72, 0x7c88, 0x3b95, 0x6d2f, 0x5925, 0x7cc4, 0x7cce, 0x7d97, 0x7e50, 0x7ded, 0x7d33, 0x2e60, 0x7e7c, 0x304b, 0x7f1c, 0x7f0f, 0x7f36, 0x395e, 0x7f3b, 0x7f48, 0x7f56, 0x0987, 0x7f7f, 0x7f93, 0x7fef, 0x7ffb, 0x25a4, 0x56ad, 0x81a3, 0x8235, 0x81f6, 0x5d01, 0x83f7, 0x8459, 0x8603, 0x8607, 0x20b8, 0x42bb, 0x866d, 0x87aa, /* 0x9b */ 0x886d, 0x8885, 0x896a, 0x89b0, 0x89ec, 0x8b48, 0x3503, 0x8b55, 0x8b95, 0x4398, 0x3a95, 0x8c85, 0x3c29, 0x0a08, 0x8ebc, 0x8f57, 0x8f7a, 0x922a, 0x9371, 0x944f, 0x54fd, 0x9467, 0x9493, 0x9515, 0x5b25, 0x9528, 0x60e0, 0x954e, 0x68b8, 0x957f, 0x6947, 0x6bbd, 0x964c, 0x70fd, 0x9688, 0x96b7, 0xbbe8, 0x9708, 0x9712, 0x97b7, 0x9795, 0x9842, 0x9934, 0x994c, 0x99b3, 0x99e6, 0x9c9f, 0x9d1e, 0x31f1, 0x3888, 0x38ff, 0xd579, 0x9e67, 0x9ef3, 0x70fd, 0xae3a, 0x70fd, 0x9f1a, 0xa016, 0x70fd, 0x7406, 0x2af5, 0x394e, 0x3b58, 0xa1a7, 0xd1d7, 0xbf22, 0xa391, 0xa3f9, 0xd17e, 0x8cda, 0x1bd0, 0x1d78, 0xa659, 0xe09a, 0xa82e, 0xa84d, 0xa57b, 0xa874, 0xa8d6, 0xaec5, 0x764a, 0x2412, 0x7691, 0x2bdf, 0x8b28, 0x0efe, 0xa2bf, 0xa944, 0xaa16, 0x29c8, 0xab74, 0x0cdb, 0xac2f, 0xdda8, 0xe949, 0x0aa2, 0x8e03, 0x5cde, 0xe14e, 0x70fd, 0xacd2, 0xad7b, 0xae95, 0x4409, 0xaf40, 0x7b38, 0x2ba5, 0xb225, 0xb2c6, 0x7779, 0x601a, 0xb36c, 0x24cf, 0x297f, 0x4371, 0xb559, 0xb619, 0xa48a, 0xaf27, 0x27fc, 0xb646, 0xb66e, 0xc892, 0x70fd, 0x07b3, 0xb6bf, 0xd1b2, 0xb6de, 0x1a18, 0xb6e2, 0xb6e6, 0xb907, 0xadbf, 0xb95d, 0x22a6, 0x083b, 0x9d0c, 0x70fd, 0xb9c3, 0x1a7c, 0xdf48, 0xbaee, 0xbb89, 0xbc06, 0x8a50, 0x29e1, 0x4351, 0x70fd, 0xc002, 0xd6d2, 0x6196, 0xc0b2, 0xb2da, 0x5ce2, 0xc282, 0xc2ca, /* 0x9c */ 0x2f9b, 0xc937, 0x70fd, 0xc304, 0x875c, 0x5c6a, 0xae76, 0xc308, 0xa52f, 0xc352, 0x1e80, 0xc3ff, 0xc475, 0x921b, 0x6565, 0xb921, 0x33d5, 0x2c67, 0xf28d, 0x70fd, 0x28f9, 0xaa61, 0xc4bc, 0x20aa, 0xadb4, 0x6756, 0x3fcf, 0xc9fd, 0x0958, 0x5af7, 0xc559, 0xc62e, 0xc291, 0xc61e, 0x70fd, 0xc687, 0x4d42, 0xe480, 0x7911, 0xc6e6, 0x70fd, 0xc6f9, 0x4c45, 0x70fd, 0xc7ba, 0x6b26, 0xc7ed, 0x099f, 0xc2e9, 0x7121, 0x4b83, 0xc7f4, 0xc89b, 0x2f6c, 0x9e19, 0x70fd, 0xc8dd, 0x19d0, 0xc9e4, 0x473b, 0x59e5, 0xcaee, 0x2af6, 0x0a5c, 0x90cd, 0xcd8b, 0xcecd, 0x0f94, 0xcf40, 0xcf45, 0x6381, 0x8dba, 0xcf4b, 0x6430, 0xcfa6, 0xae50, 0x3e79, 0x659f, 0xd050, 0x7db8, 0x59a7, 0x5a75, 0x9426, 0xdcb3, 0x85f1, 0x40b8, 0xaeaa, 0x8660, 0x0ce4, 0x09f9, 0x70fd, 0x70fd, 0x183f, 0x38f6, 0xeaad, 0xe824, 0x5ac3, 0xd30c, 0xd358, 0x2916, 0x13df, 0x844a, 0x0ce1, 0xa02f, 0xd9a8, 0x8285, 0x43ad, 0x5566, 0xd4dd, 0xe568, 0x70fd, 0x1f77, 0xcdef, 0xdfab, 0xd4fd, 0xd50a, 0xd60b, 0xd766, 0xa6ba, 0x4d43, 0x4b7e, 0xd8c9, 0x41b5, 0xefdf, 0x3c43, 0xdb98, 0x25e2, 0xcb47, 0x64bf, 0x3a76, 0x685d, 0xda2f, 0xd8e3, 0xc775, 0x82ad, 0x9baf, 0xd908, 0x2fc5, 0xe230, 0xd943, 0x2955, 0x6923, 0xdf49, 0x2feb, 0xae08, 0x37fe, 0x3c15, 0x2612, 0xaf25, 0xa4c1, 0x0f51, 0x3976, 0xd950, 0xd9b4, 0xd9ee, 0x8c21, 0xda0f, /* 0x9d */ 0xda49, 0xda6f, 0xda9a, 0xdb86, 0xdbaf, 0xdc0a, 0x090a, 0xdca8, 0xde2a, 0x1bfa, 0x3626, 0xdf56, 0x4a08, 0x6355, 0xdfb8, 0x16f2, 0xdfe7, 0x16df, 0xdfe8, 0xe146, 0xe1d4, 0x2c38, 0xe209, 0x70fd, 0xe405, 0xe4ac, 0x70fd, 0xe4d0, 0xe4fc, 0x10f7, 0xe51e, 0xaf4a, 0x6110, 0x448f, 0x28cb, 0xe667, 0xe6e9, 0xe6b0, 0xe6b8, 0xe732, 0xe851, 0xe8c9, 0xe8ea, 0xe943, 0xe9a8, 0xea0e, 0xeb1a, 0xeb5b, 0x509f, 0xecb8, 0xece3, 0x1f64, 0x6647, 0xef93, 0x43a2, 0xefff, 0x2011, 0x6152, 0xf0cb, 0x201c, 0x7b5c, 0x60fe, 0x2801, 0x60fa, 0x8ff0, 0x60f9, 0xaf13, 0x1809, 0x507f, 0x4156, 0x3cf1, 0x212a, 0x0824, 0xe12c, 0xd39d, 0x0a7a, 0x5fc0, 0x8635, 0xd8e4, 0xe16c, 0xe199, 0xd53e, 0xc46f, 0x10eb, 0xd1d5, 0xa277, 0xb7b5, 0xba16, 0x20da, 0xbe01, 0xc118, 0x28ff, 0x7d2d, 0x5f4e, 0x2dad, 0xa3c8, 0xb05e, 0x361e, 0x70fd, 0x8636, 0x86bb, 0x3770, 0x286d, 0xbc4a, 0x265a, 0xb5d1, 0x10c6, 0xeb58, 0x1f3d, 0x2862, 0x285e, 0x5149, 0xbe58, 0x2bb5, 0xa2c0, 0x58f0, 0x205c, 0x7eaa, 0x7c09, 0x9fba, 0x5317, 0x6dde, 0x5e58, 0x483b, 0x6d45, 0x484e, 0x49b9, 0x6445, 0x2672, 0x5348, 0x54f7, 0x2865, 0x5332, 0x5618, 0x52bd, 0x282a, 0x4b62, 0x2883, 0x2656, 0x7d5d, 0x090e, 0x2845, 0x2831, 0x3931, 0xdb62, 0x096d, 0x4734, 0x2830, 0x27fa, 0x26d7, 0x27b2, 0x7b01, 0x7b56, 0x3110, 0xb448, 0x7d36, 0x9662, /* 0x9e */ 0x7d62, 0x6f2b, 0x4f5a, 0x281e, 0x7f35, 0x34dd, 0x686d, 0x26d4, 0x5e0d, 0x43f6, 0x6276, 0x363c, 0x35f9, 0x363e, 0x27a9, 0x9583, 0x6d72, 0x98b3, 0x23da, 0x081f, 0x7c67, 0x23e7, 0x268d, 0x275e, 0x2753, 0x4866, 0x5f6d, 0xc64a, 0x47b1, 0x52b6, 0x5984, 0x5906, 0x5a47, 0x53b6, 0x561c, 0x7f81, 0x17ec, 0x4504, 0xac06, 0x2dd0, 0x550b, 0xc653, 0x28bb, 0x91f4, 0xd72f, 0xa6e3, 0xd773, 0xcc10, 0xcf76, 0x6270, 0x8099, 0x6308, 0xa2bc, 0xf1a9, 0x7d6c, 0x7db9, 0x4466, 0x89e2, 0x1a4e, 0xb302, 0xd8b9, 0x7eab, 0x13fa, 0x6d5d, 0x375f, 0x97a0, 0x1bf3, 0xaca0, 0xeb3c, 0x7eac, 0x7cca, 0x70fd, 0xd123, 0x7ead, 0x70fd, 0xbf88, 0x8047, 0x43a3, 0x508e, 0x6dd0, 0x205a, 0x2044, 0x08b7, 0x2d4d, 0x3ef2, 0x25a7, 0x09ec, 0x0d1c, 0x25bd, 0x09e5, 0xab18, 0x2ada, 0xafae, 0x542d, 0x268b, 0x29ea, 0xbad5, 0x78b9, 0x70fd, 0x0d92, 0x8fa5, 0x4574, 0xec6c, 0x1fc9, 0x6ced, 0xa2be, 0xecf0, 0x1f1b, 0xb2e9, 0xe69e, 0xed5e, 0x565c, 0xa336, 0xcf72, 0xc573, 0xa020, 0x356e, 0x4f25, 0xa437, 0xa3ac, 0x0d6a, 0x6148, 0x250c, 0x1174, 0x09ba, 0x18e9, 0x754e, 0x4840, 0x2d30, 0x7d76, 0x4a7a, 0xd86e, 0x2ae7, 0x13bf, 0x28bc, 0x6c8b, 0x2fb4, 0x4854, 0xf074, 0x6f05, 0x1fa1, 0x70fd, 0x0b3b, 0x3359, 0x9a5a, 0xa932, 0x70fd, 0x289d, 0x8169, 0x29e7, 0xade3, 0xebc6, 0x2474, 0xcdee, 0x08ed, 0x70fd, 0x6dfc, /* 0x9f */ 0x4e56, 0x6c39, 0x2a1e, 0x85ac, 0x2e93, 0x3713, 0xe650, 0xc1b5, 0xcea4, 0x586d, 0x7be8, 0xca62, 0xaf62, 0x7c31, 0x70fd, 0x243e, 0x8b8f, 0x2fce, 0x6803, 0x8a91, 0x6f01, 0x618c, 0x4d1f, 0x6c02, 0x2f11, 0x4da3, 0x34a8, 0x3575, 0x6bff, 0x4dcf, 0x6c2a, 0x4e7e, 0x70fd, 0x4e42, 0x4e86, 0x6d15, 0x4dfc, 0x6c09, 0x70fd, 0x6d1b, 0xadbe, 0x6fda, 0x27b3, 0x2e03, 0x223d, 0x6f18, 0x2232, 0x24a0, 0x1106, 0x2511, 0x29a7, 0x2296, 0x2bf7, 0x3052, 0x68c8, 0x6e2b, 0x609c, 0x26a9, 0x68b4, 0x6a40, 0x68ba, 0x256c, 0x3370, 0x3b6c, 0x261a, 0x6d0a, 0x6d82, 0x1efb, 0x6741, 0x3bc0, 0x22e6, 0x4746, 0x85ad, 0x6ada, 0x24b3, 0x70fd, 0x6259, 0x6781, 0x625c, 0x70fd, 0x6251, 0xe397, 0x35bf, 0xca63, 0x3d0a, 0x2851, 0x628e, 0x477a, 0x34c5, 0x74bc, 0x454f, 0x4e70, 0xbc21, 0xa2bd, 0x70fd, 0xad99, 0x48d6, 0x6c9d, 0x206a, 0x7b94, 0x55be, 0x59c2, 0x70fd, 0x2e8a, 0x3c00, 0x70fd, 0x29ba, 0x245f, 0x3035, 0x210e, 0x3e71, 0x72b2, 0x2179, 0x26dc, 0x271a, 0x24da, 0x5ec2, 0x093e, 0x70fd, 0x0933, 0x70fd, 0x3d92, 0x627c, 0x7025, 0x6c97, 0x692e, 0x69b4, 0x6bba, 0x6f28, 0x6f04, 0x437a, 0x4d14, 0x70fd, 0x3e3a, 0x5998, 0x5178, 0x70fd, 0x2860, 0xf14a, 0x5fb7, 0x6fd3, 0x70fd, 0x5f14, 0x5f8f, 0x6e9c, 0x5f41, 0x34c2, 0xdbfd, 0x5f68, 0x5fb5, 0x4cd3, 0xaef7, 0x4c3e, 0x4ad8, 0x3f2a, 0x5be7, 0x4807, /* 0xa0 */ 0xe05a, 0x6fa6, 0x3f0e, 0x5956, 0x47c3, 0xefb2, 0x4a53, 0xf200, 0x5e4c, 0x44e2, 0x4571, 0x5cad, 0x4502, 0x46f1, 0x5e2b, 0xaf3b, 0x57ef, 0x31fa, 0x5a20, 0x17b7, 0x70fd, 0x867b, 0xcb45, 0x70fd, 0x5bfe, 0x905b, 0x70fd, 0x333d, 0x4867, 0x6bd7, 0x6dc4, 0x646e, 0x6c8f, 0x5975, 0x70fd, 0x70fd, 0x5e37, 0x452c, 0x6821, 0x6cb0, 0x0916, 0x44b2, 0x1ec7, 0x4e51, 0x6a4a, 0xc059, 0x3399, 0x1ec4, 0x6f16, 0x33bd, 0x70fd, 0x299f, 0x33af, 0x34e6, 0x3479, 0x70fd, 0x0d9c, 0x3422, 0x25ea, 0x9d35, 0x35a4, 0x3a42, 0x0912, 0x2f97, 0xe1c2, 0x611a, 0xe339, 0x70fd, 0x2319, 0x8a06, 0x4b06, 0x2572, 0x6738, 0x7dfb, 0x1365, 0x70fd, 0x49fe, 0x70fd, 0x4ec2, 0xbe9a, 0x4eda, 0x4c2d, 0x5266, 0x5263, 0x4f4d, 0x4705, 0x46f2, 0x5b14, 0x541a, 0x394c, 0x5262, 0xd086, 0x525b, 0x46f0, 0x5303, 0x4924, 0x5b09, 0xc58c, 0x4753, 0xcc11, 0x5929, 0x594e, 0x53c8, 0x590c, 0x5bc9, 0x5ded, 0x5cc3, 0x492b, 0x46f8, 0x56da, 0x0975, 0x3bf2, 0x5ee6, 0x70fd, 0x5b29, 0x70fd, 0x3ff9, 0x5941, 0xa551, 0x46e7, 0x10db, 0x4376, 0x32e4, 0x33dc, 0x0fd1, 0x70fd, 0x32b7, 0x70fd, 0x5171, 0xe12d, 0x70fd, 0x3329, 0x1e3e, 0x2460, 0x0f58, 0xa287, 0xbe57, 0xd1d6, 0xb6b1, 0x8784, 0x81be, 0xe883, 0xcb1c, 0xcded, 0x2f01, 0xc0ad, 0xe00f, 0x9f77, 0x71ee, 0xc606, 0xb24e, 0x1862, 0x2d5f, 0xc1cc, 0x6fd0, 0x6f26, 0xc12b, }; static const unsigned short hkscs1999_2uni_pagec6[471] = { /* 0xc6 */ 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x0460, 0x0461, 0x0462, 0x0463, 0x0464, 0x0465, 0x0466, 0x0467, 0x0468, 0x0469, 0x0474, 0x0475, 0x0476, 0x0477, 0x0478, 0x0479, 0x047a, 0x047b, 0x047c, 0x047d, 0x0370, 0x0371, 0x0372, 0x0373, 0x0374, 0x0375, 0x0376, 0x0377, 0x0378, 0x0379, 0x2076, 0x207f, 0x20c5, 0x20e0, 0x23c2, 0x23d6, 0x23eb, 0x2539, 0x2578, 0x25a9, 0x25f6, 0x2b4a, 0x2dc0, 0x301b, 0x05b3, 0x30bf, 0x70fd, 0x3190, 0x31a1, 0x3774, 0x70fd, 0x4792, 0x70fd, 0x60f5, 0x70fd, 0x0028, 0x01c6, 0x06bd, 0x06be, 0x065d, 0x065e, 0x70fd, 0x70fd, 0x05c5, 0x05c6, 0x05c7, 0x06bc, 0x70bb, 0x70bd, 0x04fd, 0x0601, 0x0602, 0x0603, 0x0604, 0x0605, 0x0606, 0x0607, 0x0608, 0x0609, 0x060a, 0x060b, 0x060c, 0x060d, 0x060e, 0x060f, 0x0610, 0x0611, 0x0612, 0x0613, 0x0614, 0x0615, 0x0616, 0x0617, 0x0618, /* 0xc7 */ 0x0619, 0x061a, 0x061b, 0x061c, 0x061d, 0x061e, 0x061f, 0x0620, 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, 0x063b, 0x063c, 0x063d, 0x063e, 0x063f, 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, 0x0650, 0x0651, 0x0652, 0x0653, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, 0x0668, 0x0669, 0x066a, 0x066b, 0x066c, 0x066d, 0x066e, 0x066f, 0x0670, 0x0671, 0x0672, 0x0673, 0x0674, 0x0675, 0x0676, 0x0677, 0x0678, 0x0679, 0x067a, 0x067b, 0x067c, 0x067d, 0x067e, 0x067f, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0686, 0x0687, 0x0688, 0x0689, 0x068a, 0x068b, 0x068c, 0x068d, 0x068e, 0x068f, 0x0690, 0x0691, 0x0692, 0x0693, 0x0694, 0x0695, 0x0696, 0x0697, 0x0698, 0x0699, 0x069a, 0x069b, 0x069c, 0x069d, 0x069e, 0x069f, 0x06a0, 0x06a1, 0x06a2, 0x06a3, 0x06a4, 0x06a5, 0x06a6, 0x06a7, 0x06a8, 0x06a9, 0x06aa, 0x06ab, 0x06ac, 0x06ad, 0x06ae, 0x06af, 0x06b0, 0x06b1, 0x06b2, 0x06b3, 0x06b4, 0x06b5, 0x06b6, 0x0210, 0x0211, 0x0212, 0x0213, 0x0214, 0x0215, 0x0201, 0x0216, 0x0217, 0x0218, 0x0219, 0x021a, /* 0xc8 */ 0x021b, 0x021c, 0x021d, 0x021e, 0x021f, 0x0220, 0x0221, 0x0222, 0x0223, 0x0224, 0x0225, 0x0226, 0x0227, 0x0228, 0x0229, 0x022a, 0x022b, 0x022c, 0x022d, 0x022e, 0x022f, 0x0230, 0x0231, 0x0232, 0x0233, 0x0234, 0x0235, 0x0251, 0x0236, 0x0237, 0x0238, 0x0239, 0x023a, 0x023b, 0x023c, 0x023d, 0x023e, 0x023f, 0x0240, 0x0241, 0x0242, 0x0243, 0x0244, 0x0245, 0x0246, 0x0247, 0x0248, 0x0249, 0x024a, 0x024b, 0x024c, 0x024d, 0x024e, 0x024f, 0x03e7, 0x03b8, 0x03b9, 0x06cf, 0x71cc, 0x209a, 0x718a, 0x2442, 0x1791, 0x7030, 0x23c8, 0x7031, 0xd187, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70e2, 0x70e4, 0x7087, 0x7082, 0x0731, 0x0316, 0x0321, 0x065b, 0x065c, 0x0500, 0x0504, 0x0506, 0x0507, 0x0508, 0x050a, 0x050c, 0x050d, 0x0515, 0x051c, 0x051d, 0x0525, 0x0527, 0x052a, 0x052c, 0x052e, 0x0536, 0x053c, 0x053e, 0x0546, 0x054a, 0x054c, 0x054d, 0x054f, 0x0556, 0x0557, 0x055e, 0x0563, 0x70fd, 0x70fd, 0x70fd, 0x0183, 0x0150, 0x015b, 0x0154, 0x0175, 0x00d3, 0x0078, 0x00cb, 0x018a, 0x016a, }; static const unsigned short hkscs1999_2uni_pagef9[942] = { /* 0xf9 */ 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x70fd, 0x4a81, 0x63b9, 0x5a4f, 0x2afb, 0x3292, 0x4ea7, 0x2d3a, 0x0494, 0x04a6, 0x0497, 0x04a0, 0x04ac, 0x04a3, 0x049a, 0x04a9, 0x049d, 0x0492, 0x04a4, 0x0495, 0x049e, 0x04aa, 0x04a1, 0x0498, 0x04a7, 0x049b, 0x0493, 0x04a5, 0x0496, 0x049f, 0x04ab, 0x04a2, 0x0499, 0x04a8, 0x049c, 0x0491, 0x0490, 0x04ad, 0x04ae, 0x04b0, 0x04af, 0x70ed, /* 0xfa */ 0x75c7, 0x63db, 0x765f, 0xa505, 0x574c, 0x15b5, 0x45ef, 0x23f5, 0x0989, 0xadc2, 0xdfe4, 0x6444, 0x881b, 0x54ee, 0xa288, 0x4a3c, 0x3984, 0x351f, 0xadb3, 0xdfaa, 0x7360, 0xc8f3, 0x81c5, 0x21eb, 0x902d, 0x2248, 0xca69, 0xd584, 0x9f00, 0xaf31, 0x9053, 0x70fd, 0x743e, 0x31e4, 0x7440, 0x7407, 0x40db, 0x74df, 0x70fd, 0x2341, 0x07ba, 0x234e, 0x696c, 0x0a83, 0x5616, 0xae24, 0x7547, 0x23a0, 0x9cf4, 0x23aa, 0x7abf, 0x8d3c, 0x73a5, 0x9070, 0x760e, 0x9bb3, 0x87c3, 0x2dc2, 0x58fd, 0x7633, 0xa259, 0x23f2, 0x23f8, 0x6db4, 0x2409, 0x240f, 0x2411, 0x0fdc, 0x2413, 0xaf26, 0x23f3, 0x2422, 0x2582, 0x242d, 0x55cd, 0x3b7e, 0xa02d, 0x31bb, 0x244b, 0x2466, 0x247c, 0x24f5, 0x2497, 0x24d4, 0x24f9, 0x2505, 0x4e15, 0x5742, 0x2520, 0x57cd, 0xc853, 0x70fd, 0xe0de, 0x2789, 0x40d9, 0xa4c0, 0x7894, 0xa52c, 0x2573, 0x70fd, 0x7aa2, 0x3f0b, 0x8566, 0x3a5b, 0x45d5, 0x328a, 0x11aa, 0x0c0c, 0x8528, 0x43dd, 0x17a2, 0x25ad, 0x25b4, 0xde2b, 0x25be, 0x70fd, 0x8416, 0x8453, 0x49e6, 0x25d3, 0xe09b, 0x25e0, 0x25eb, 0x25ee, 0x45a7, 0xb8f2, 0x1259, 0x459c, 0x2601, 0x2605, 0x3e89, 0x2089, 0x2a3e, 0x2619, 0x0deb, 0x7a4f, 0x2620, 0xa52b, 0x97a3, 0x2636, 0x7b37, 0x2653, 0x4279, 0x276b, 0x3897, 0x3f9b, 0x26ad, 0xc893, 0x7c34, 0x279d, 0x26cf, 0x26e4, 0x1aa6, 0x854d, 0x7d9d, 0x10b4, 0x7c0d, /* 0xfb */ 0xdfbc, 0x9198, 0x2787, 0x1fad, 0x266f, 0x4617, 0x27c6, 0x27e9, 0x70fd, 0x8717, 0xa57a, 0x1852, 0xa975, 0x38f3, 0x7f74, 0x2877, 0x390d, 0x9c0a, 0x38e4, 0x38ed, 0x288d, 0x288f, 0x4af1, 0x2931, 0x6887, 0x263e, 0x2940, 0x292f, 0x292d, 0xe166, 0x0963, 0x810f, 0x2986, 0xa6e5, 0x3eae, 0x428b, 0x2982, 0x09f1, 0xc9be, 0x2a26, 0x82d6, 0x2a43, 0x8314, 0xa8a3, 0x2a66, 0xaff5, 0x2a9c, 0x2aea, 0x08a1, 0x2b20, 0x2b1c, 0x80fc, 0x2b3b, 0x2e3f, 0x2983, 0xee90, 0xa7b8, 0x64d3, 0x08e1, 0x2b5f, 0x3ae6, 0x0a03, 0x4059, 0x847e, 0x2c64, 0x2793, 0x84d2, 0x5705, 0x2c09, 0x7c0e, 0xc9c1, 0xca6a, 0x861c, 0x2c19, 0x863b, 0x85f2, 0xcae6, 0x3fb1, 0x8668, 0x8515, 0x2c39, 0xcb85, 0x2ceb, 0x2ca3, 0x0a26, 0xae29, 0x70fd, 0x0a48, 0x2cd6, 0x4665, 0x2d13, 0xcce1, 0x9094, 0x1085, 0x8751, 0x0a72, 0x84f8, 0x30c3, 0x2510, 0x2db6, 0x37c8, 0x2dbc, 0xd50e, 0x1304, 0x1b5d, 0x72c4, 0x2e15, 0x33a0, 0x8874, 0xba8c, 0x7625, 0x2e33, 0x2ddd, 0x1fd0, 0x2e45, 0x88c4, 0x2e53, 0x45ce, 0x2e54, 0x89e5, 0xc868, 0x2e89, 0x1bdd, 0x2ec5, 0x2f29, 0x2f2f, 0x2fcb, 0x8ab9, 0x8af7, 0x2f50, 0x2f58, 0x2f86, 0x8b24, 0x2efa, 0x3017, 0x54fc, 0x0b6d, 0xad81, 0x8c89, 0x8db3, 0x5487, 0x0b76, 0x0f02, 0x306e, 0x3cca, 0x70fd, 0x30ba, 0xa9fc, 0x7b93, 0x25e6, 0x20f7, 0x70fd, 0x25e8, 0x85b1, 0x3049, 0x3134, 0xdcc2, /* 0xfc */ 0x3139, 0x313b, 0x0be0, 0x313c, 0x3a7e, 0x651b, 0x314d, 0x7281, 0xf254, 0x0e1e, 0x1bae, 0x81fa, 0x317a, 0xc648, 0x8f50, 0x70fd, 0x8fb1, 0x31a3, 0x68bd, 0xcbae, 0x31b2, 0x6440, 0xe036, 0x31e7, 0x2ff6, 0x105f, 0xb510, 0x8bea, 0xce38, 0x9168, 0x62d6, 0x735e, 0xe029, 0x3271, 0x38c5, 0x86b7, 0x0ca3, 0x10c7, 0x0979, 0x29d0, 0x92b4, 0x4b71, 0x1140, 0x32de, 0x70fd, 0x32f3, 0xae02, 0xae0f, 0xd553, 0x46a4, 0x2321, 0x2ce0, 0x33a4, 0x5624, 0x3382, 0xf266, 0xcc12, 0x33c1, 0x2434, 0x76d6, 0x33c7, 0x2dea, 0xa4f7, 0x935f, 0x3413, 0xe19d, 0xe8dd, 0x3410, 0x0c72, 0x9480, 0x93c1, 0x3263, 0x339c, 0x375e, 0x35cb, 0x7218, 0x3505, 0x85b0, 0x3515, 0x980d, 0x35ac, 0xae5f, 0x0d57, 0x3678, 0x3638, 0x824e, 0x863c, 0x70fd, 0x418a, 0x9836, 0x6914, 0xa5cc, 0xb89d, 0x3721, 0x3725, 0x657b, 0x0da6, 0x367a, 0x0d97, 0x378d, 0x4116, 0xaea8, 0xaea3, 0x37c5, 0x37ad, 0x379f, 0x99fe, 0x37f5, 0xadc0, 0x1df7, 0x3811, 0x13d8, 0x8669, 0x3820, 0x3823, 0x321f, 0x9d40, 0x3858, 0x9b77, 0x9b78, 0x3884, 0x9b24, 0x9b25, 0x388b, 0x7d35, 0x38a7, 0xb4a6, 0x38b3, 0x70fd, 0x8afd, 0x9bb1, 0xddb4, 0x9b48, 0xb5d3, 0x49c5, 0x93f7, 0x6aa4, 0x3942, 0xa8dc, 0xaea1, 0x0e6b, 0x3c3a, 0xa0c2, 0x70fd, 0x39a7, 0x39a2, 0xa70d, 0xe4ad, 0x3a17, 0x17e9, 0x3a62, 0x4050, 0x633c, 0x3a41, 0x9d26, 0xcae0, 0x3a9d, /* 0xfd */ 0x9daf, 0x3c21, 0x3c4b, 0xe0df, 0x3bb3, 0x3b03, 0x9ecd, 0x3b41, 0x3b40, 0x1032, 0x0d41, 0x9f3c, 0x0ec0, 0x39ec, 0x3ba1, 0xe04a, 0x15fc, 0x3b76, 0x3bd8, 0x0ee1, 0x7489, 0x5563, 0x22d0, 0x3c39, 0x9f59, 0x8d6a, 0x3c85, 0xa003, 0x3cdd, 0x0f33, 0x39f1, 0x3d08, 0xe55c, 0x0f4d, 0x3d5d, 0x7863, 0x331e, 0x3d75, 0x3db4, 0x92cd, 0x40b5, 0xa1db, 0x7475, 0x8798, 0x0a80, 0x2661, 0xa21a, 0x3e21, 0xa43c, 0x3e1c, 0x3e77, 0x8fcb, 0xad71, 0xc891, 0x3e9a, 0x5426, 0x3eb9, 0xa33c, 0x17c5, 0xa33d, 0xa6e4, 0xad8c, 0xad80, 0xa289, 0x0a25, 0x0feb, 0x7bf2, 0x6c83, 0x9b79, 0x8fd1, 0x518f, 0x3a77, 0xca65, 0xcae1, 0xcb2b, 0x3fd6, 0x3f9c, 0x407c, 0x4104, 0xadff, 0xa5c5, 0xcbb2, 0x5733, 0xccb4, 0x2407, 0x70fd, 0x70fd, 0x562e, 0xe121, 0x70fd, 0xa3af, 0x4653, 0xa4c2, 0x4bcc, 0x404f, 0x2cd1, 0x99cb, 0x41f8, 0x0a4d, 0x419d, 0xa3b0, 0x40fa, 0x8357, 0xa57d, 0x1855, 0x64f0, 0x4144, 0x415c, 0x104e, 0x4174, 0xe530, 0x103b, 0x419f, 0xa684, 0x41d3, 0xa5d1, 0xa695, 0xa579, 0xa530, 0xa4f4, 0xa67f, 0x241f, 0xa696, 0xa697, 0xa680, 0xc0dd, 0x424b, 0x427e, 0x42a7, 0x4281, 0x42cc, 0x42d5, 0x42d6, 0x42df, 0x1404, 0x10e8, 0x43b4, 0x4396, 0xa7b7, 0x432b, 0x4345, 0x2cc8, 0x434a, 0x70fd, 0x2edc, 0xa8a5, 0x434f, 0x6462, 0xa801, 0x432c, 0xa99a, 0xaea7, 0xaea2, 0x43ba, 0xe1e8, 0x42bd, 0x440e, /* 0xfe */ 0x6542, 0x4415, 0x2b51, 0x6543, 0x4424, 0x6441, 0xb785, 0x442e, 0x4440, 0xadf4, 0x3afd, 0x4455, 0x4457, 0x1155, 0x99c4, 0x3a4d, 0x413d, 0x4482, 0x70fd, 0x452b, 0xace3, 0xdeeb, 0x1bed, 0xdec4, 0x4528, 0x452e, 0x45cf, 0x45aa, 0x7afa, 0xc7ee, 0x45c9, 0x4649, 0xa722, 0x8527, 0xaea4, 0x3863, 0x0a05, 0xae37, 0xae0d, 0xae7b, 0x45f7, 0x4615, 0x3b43, 0xaea6, 0x4639, 0x7643, 0x11d7, 0x70fd, 0x93ad, 0x4660, 0xe3b2, 0x4647, 0x45e4, 0x4676, 0x55b9, 0x466c, 0x0a70, 0x4674, 0x64f1, 0x3c6c, 0x4682, 0x1c53, 0xaf0c, 0xa69f, 0xaef9, 0xe18f, 0x2d86, 0xe203, 0x86de, 0x46c8, 0x87c8, 0x470e, 0x70fd, 0x471e, 0xe3d9, 0x888b, 0x2e17, 0xe3ac, 0x6485, 0x474d, 0x474a, 0x4767, 0x476e, 0xb2c2, 0x1204, 0xb0d3, 0x478e, 0x465d, 0x479e, 0x47b4, 0x4802, 0x482c, 0x4851, 0x484f, 0x486f, 0x4876, 0xc275, 0x4890, 0x53ef, 0x0b38, 0xc6d1, 0xc6ce, 0x48a1, 0x48a5, 0x48b7, 0x48cc, 0xccdf, 0x5662, 0xb3dd, 0xb47d, 0x8adc, 0x491e, 0x4926, 0x4940, 0x36ef, 0xb4e0, 0x4958, 0x9c2c, 0x49af, 0xdf64, 0xdf68, 0x8501, 0x49f4, 0x70fd, 0x8236, 0xae92, 0x3b0a, 0x4aaf, 0x4ac7, 0x4ad3, 0x67a5, 0x4b2e, 0xb760, 0x4ad7, 0x4b34, 0x4ab1, 0xd18c, 0x60f8, 0x5a04, 0xe12b, 0xbfc3, 0x911c, 0x4b86, 0x5a80, 0x3b42, 0x4b80, 0xb957, 0x4b9d, 0xd639, 0x4b3c, 0x4ba9, 0x402a, 0xce66, 0x11a8, 0x4bc6, 0xe4cd, 0x4bd4, }; static const ucs4_t hkscs1999_2uni_upages[973] = { 0x00080, 0x000c0, 0x00100, 0x00140, 0x001c0, 0x00240, 0x00280, 0x002c0, 0x00400, 0x00440, 0x01e80, 0x01ec0, 0x02100, 0x02140, 0x02180, 0x021c0, 0x023c0, 0x02440, 0x02540, 0x02700, 0x02e80, 0x02ec0, 0x02f00, 0x03000, 0x03040, 0x03080, 0x030c0, 0x031c0, 0x03200, 0x03400, 0x03440, 0x03480, 0x034c0, 0x03500, 0x03540, 0x03580, 0x035c0, 0x03600, 0x03640, 0x03680, 0x036c0, 0x03700, 0x03740, 0x03780, 0x037c0, 0x03800, 0x03840, 0x03880, 0x038c0, 0x03900, 0x03940, 0x03980, 0x039c0, 0x03a00, 0x03a40, 0x03a80, 0x03ac0, 0x03b00, 0x03b40, 0x03b80, 0x03bc0, 0x03c00, 0x03c40, 0x03cc0, 0x03d00, 0x03d40, 0x03d80, 0x03dc0, 0x03e00, 0x03e40, 0x03e80, 0x03ec0, 0x03f00, 0x03f40, 0x03f80, 0x03fc0, 0x04000, 0x04040, 0x04080, 0x040c0, 0x04100, 0x04140, 0x04180, 0x041c0, 0x04200, 0x04240, 0x04280, 0x042c0, 0x04300, 0x04340, 0x04380, 0x043c0, 0x04400, 0x04440, 0x04480, 0x044c0, 0x04500, 0x04540, 0x04580, 0x045c0, 0x04600, 0x04640, 0x04680, 0x046c0, 0x04700, 0x04740, 0x04780, 0x047c0, 0x04800, 0x04840, 0x04880, 0x048c0, 0x04900, 0x04940, 0x04980, 0x049c0, 0x04a00, 0x04a80, 0x04ac0, 0x04b00, 0x04b40, 0x04b80, 0x04bc0, 0x04c00, 0x04c40, 0x04c80, 0x04cc0, 0x04d00, 0x04d80, 0x04e00, 0x04e40, 0x04e80, 0x04ec0, 0x04f00, 0x04f40, 0x04f80, 0x04fc0, 0x05000, 0x05040, 0x05080, 0x050c0, 0x05100, 0x05140, 0x05180, 0x051c0, 0x05200, 0x05240, 0x05280, 0x052c0, 0x05300, 0x05340, 0x05380, 0x053c0, 0x05400, 0x05440, 0x05480, 0x054c0, 0x05500, 0x05540, 0x05580, 0x055c0, 0x05600, 0x05640, 0x05680, 0x056c0, 0x05700, 0x05740, 0x05780, 0x057c0, 0x05800, 0x05840, 0x05880, 0x058c0, 0x05900, 0x05940, 0x05980, 0x059c0, 0x05a00, 0x05a40, 0x05a80, 0x05ac0, 0x05b00, 0x05b40, 0x05b80, 0x05bc0, 0x05c00, 0x05c40, 0x05c80, 0x05cc0, 0x05d00, 0x05d40, 0x05d80, 0x05dc0, 0x05e00, 0x05e40, 0x05e80, 0x05ec0, 0x05f00, 0x05f40, 0x05f80, 0x05fc0, 0x06000, 0x06040, 0x06080, 0x060c0, 0x06100, 0x06140, 0x06180, 0x061c0, 0x06200, 0x06240, 0x06280, 0x062c0, 0x06300, 0x06340, 0x06380, 0x063c0, 0x06400, 0x06440, 0x06480, 0x064c0, 0x06500, 0x06540, 0x06580, 0x065c0, 0x06600, 0x06640, 0x06680, 0x066c0, 0x06700, 0x06740, 0x06780, 0x067c0, 0x06800, 0x06840, 0x06880, 0x068c0, 0x06900, 0x06940, 0x06980, 0x069c0, 0x06a00, 0x06a40, 0x06a80, 0x06ac0, 0x06b00, 0x06b40, 0x06b80, 0x06bc0, 0x06c00, 0x06c40, 0x06c80, 0x06cc0, 0x06d00, 0x06d40, 0x06d80, 0x06e00, 0x06e40, 0x06e80, 0x06ec0, 0x06f00, 0x06f40, 0x06f80, 0x06fc0, 0x07000, 0x07040, 0x07080, 0x070c0, 0x07100, 0x07140, 0x07180, 0x071c0, 0x07200, 0x07240, 0x07280, 0x072c0, 0x07300, 0x07340, 0x07380, 0x073c0, 0x07400, 0x07440, 0x07480, 0x074c0, 0x07500, 0x07540, 0x07580, 0x075c0, 0x07600, 0x07640, 0x07680, 0x076c0, 0x07700, 0x07740, 0x07780, 0x077c0, 0x07800, 0x07840, 0x07880, 0x078c0, 0x07900, 0x07940, 0x07980, 0x079c0, 0x07a00, 0x07a40, 0x07a80, 0x07ac0, 0x07b00, 0x07b40, 0x07b80, 0x07bc0, 0x07c00, 0x07c40, 0x07c80, 0x07cc0, 0x07d00, 0x07d40, 0x07d80, 0x07dc0, 0x07e00, 0x07e40, 0x07e80, 0x07ec0, 0x07f00, 0x07f40, 0x07f80, 0x07fc0, 0x08000, 0x08040, 0x08080, 0x080c0, 0x08100, 0x08140, 0x08180, 0x081c0, 0x08200, 0x08240, 0x08280, 0x082c0, 0x08300, 0x08340, 0x08380, 0x083c0, 0x08400, 0x08440, 0x08480, 0x084c0, 0x08500, 0x08540, 0x085c0, 0x08600, 0x08640, 0x08680, 0x086c0, 0x08740, 0x08780, 0x087c0, 0x08800, 0x08840, 0x08880, 0x088c0, 0x08900, 0x08940, 0x08980, 0x089c0, 0x08a00, 0x08a40, 0x08a80, 0x08ac0, 0x08b00, 0x08b40, 0x08b80, 0x08bc0, 0x08c40, 0x08c80, 0x08cc0, 0x08d00, 0x08d40, 0x08d80, 0x08dc0, 0x08e00, 0x08e40, 0x08e80, 0x08ec0, 0x08f00, 0x08f40, 0x08f80, 0x08fc0, 0x09000, 0x09040, 0x09080, 0x090c0, 0x09140, 0x09180, 0x091c0, 0x09200, 0x09240, 0x09280, 0x092c0, 0x09300, 0x09340, 0x09380, 0x093c0, 0x09400, 0x09440, 0x09480, 0x094c0, 0x09500, 0x09540, 0x09580, 0x095c0, 0x09600, 0x09640, 0x09680, 0x096c0, 0x09700, 0x09740, 0x09780, 0x097c0, 0x09800, 0x09840, 0x09880, 0x098c0, 0x09900, 0x09940, 0x09980, 0x099c0, 0x09a00, 0x09a40, 0x09a80, 0x09ac0, 0x09b00, 0x09b40, 0x09b80, 0x09bc0, 0x09c00, 0x09c40, 0x09d00, 0x09d40, 0x09d80, 0x09dc0, 0x09e00, 0x09e40, 0x09e80, 0x09ec0, 0x09f00, 0x09f40, 0x09f80, 0x0f900, 0x0ff00, 0x0ffc0, 0x20000, 0x20040, 0x20080, 0x200c0, 0x20100, 0x20180, 0x201c0, 0x20200, 0x20240, 0x20280, 0x202c0, 0x20300, 0x20340, 0x20380, 0x203c0, 0x20400, 0x20440, 0x20480, 0x204c0, 0x20540, 0x20580, 0x205c0, 0x20600, 0x20640, 0x20700, 0x20740, 0x20800, 0x20840, 0x208c0, 0x20900, 0x20940, 0x209c0, 0x20a00, 0x20a40, 0x20a80, 0x20ac0, 0x20b00, 0x20b80, 0x20bc0, 0x20c00, 0x20c40, 0x20c80, 0x20cc0, 0x20d00, 0x20d40, 0x20d80, 0x20dc0, 0x20e00, 0x20e40, 0x20e80, 0x20ec0, 0x20f00, 0x20f40, 0x20f80, 0x20fc0, 0x21000, 0x21040, 0x21080, 0x210c0, 0x21100, 0x21140, 0x21180, 0x211c0, 0x21200, 0x21240, 0x21280, 0x212c0, 0x21300, 0x21340, 0x21380, 0x213c0, 0x21400, 0x21440, 0x21480, 0x214c0, 0x21540, 0x21580, 0x21600, 0x21640, 0x21680, 0x216c0, 0x21700, 0x21740, 0x21780, 0x217c0, 0x21800, 0x21840, 0x21880, 0x218c0, 0x21900, 0x21940, 0x21980, 0x219c0, 0x21a00, 0x21a40, 0x21b40, 0x21bc0, 0x21c00, 0x21c40, 0x21c80, 0x21d40, 0x21d80, 0x21dc0, 0x21e00, 0x21e80, 0x21ec0, 0x21f00, 0x21f40, 0x21f80, 0x21fc0, 0x22040, 0x22080, 0x220c0, 0x22100, 0x22140, 0x22180, 0x221c0, 0x22200, 0x22240, 0x22300, 0x22380, 0x223c0, 0x22440, 0x22480, 0x224c0, 0x22500, 0x22540, 0x22580, 0x22600, 0x22640, 0x22680, 0x226c0, 0x22700, 0x22740, 0x22780, 0x227c0, 0x22800, 0x22840, 0x22880, 0x228c0, 0x22900, 0x22940, 0x22980, 0x22a40, 0x22ac0, 0x22b00, 0x22b40, 0x22bc0, 0x22c00, 0x22c40, 0x22c80, 0x22cc0, 0x22d00, 0x22d40, 0x22d80, 0x22dc0, 0x22e00, 0x22e40, 0x22e80, 0x22ec0, 0x22f40, 0x22fc0, 0x23000, 0x23040, 0x23080, 0x230c0, 0x23100, 0x23140, 0x23180, 0x231c0, 0x23200, 0x23240, 0x23280, 0x232c0, 0x23300, 0x23380, 0x233c0, 0x23400, 0x23440, 0x234c0, 0x23500, 0x23540, 0x23580, 0x235c0, 0x23600, 0x23640, 0x23680, 0x236c0, 0x23700, 0x23740, 0x23780, 0x237c0, 0x23800, 0x239c0, 0x23a80, 0x23ac0, 0x23b40, 0x23c80, 0x23cc0, 0x23d40, 0x23d80, 0x23dc0, 0x23e00, 0x23e80, 0x23ec0, 0x23f00, 0x23f40, 0x23f80, 0x23fc0, 0x24000, 0x24040, 0x24080, 0x240c0, 0x24100, 0x24140, 0x24180, 0x241c0, 0x24200, 0x24240, 0x24280, 0x242c0, 0x24300, 0x24340, 0x24380, 0x243c0, 0x24400, 0x24440, 0x24480, 0x244c0, 0x24500, 0x24540, 0x245c0, 0x24600, 0x24640, 0x24680, 0x246c0, 0x24700, 0x24780, 0x247c0, 0x24800, 0x24880, 0x248c0, 0x24900, 0x24940, 0x24980, 0x249c0, 0x24a00, 0x24a40, 0x24a80, 0x24ac0, 0x24b40, 0x24bc0, 0x24c00, 0x24c80, 0x24cc0, 0x24d00, 0x24d80, 0x24dc0, 0x24e00, 0x24e40, 0x24e80, 0x24f00, 0x24f40, 0x24f80, 0x24fc0, 0x25000, 0x25040, 0x25080, 0x25100, 0x25140, 0x251c0, 0x25200, 0x25240, 0x25280, 0x252c0, 0x25300, 0x25400, 0x25440, 0x25500, 0x25540, 0x25580, 0x255c0, 0x25600, 0x25640, 0x25680, 0x256c0, 0x25700, 0x25740, 0x257c0, 0x25840, 0x258c0, 0x25900, 0x25940, 0x25980, 0x259c0, 0x25a80, 0x25ac0, 0x25b40, 0x25b80, 0x25bc0, 0x25c00, 0x25c40, 0x25c80, 0x25cc0, 0x25d00, 0x25d40, 0x25e00, 0x25e40, 0x25e80, 0x25ec0, 0x25f00, 0x25f40, 0x25fc0, 0x26000, 0x26040, 0x26080, 0x26100, 0x26140, 0x26180, 0x261c0, 0x26240, 0x262c0, 0x26300, 0x26340, 0x26380, 0x263c0, 0x26400, 0x26440, 0x26480, 0x26500, 0x26540, 0x26580, 0x26600, 0x26680, 0x266c0, 0x26700, 0x26740, 0x26780, 0x267c0, 0x26800, 0x26840, 0x26880, 0x268c0, 0x26900, 0x26940, 0x26980, 0x269c0, 0x26a00, 0x26a40, 0x26b00, 0x26b40, 0x26b80, 0x26bc0, 0x26c00, 0x26c40, 0x26c80, 0x26cc0, 0x26d00, 0x26d40, 0x26d80, 0x26dc0, 0x26e00, 0x26e40, 0x26e80, 0x26ec0, 0x26f00, 0x26f40, 0x26f80, 0x26fc0, 0x27000, 0x27040, 0x27080, 0x270c0, 0x27100, 0x27140, 0x271c0, 0x27200, 0x27280, 0x272c0, 0x27380, 0x27400, 0x27440, 0x27480, 0x27540, 0x27580, 0x275c0, 0x27600, 0x27640, 0x27680, 0x27700, 0x27740, 0x27780, 0x277c0, 0x27840, 0x27880, 0x278c0, 0x27900, 0x27940, 0x27980, 0x279c0, 0x27a00, 0x27a40, 0x27a80, 0x27ac0, 0x27b00, 0x27b40, 0x27bc0, 0x27c00, 0x27d00, 0x27d40, 0x27d80, 0x27dc0, 0x27e40, 0x27f00, 0x27fc0, 0x28000, 0x28040, 0x28080, 0x280c0, 0x28100, 0x28140, 0x28180, 0x28200, 0x28240, 0x28280, 0x282c0, 0x28300, 0x28340, 0x28380, 0x28400, 0x28440, 0x28480, 0x28500, 0x28540, 0x285c0, 0x28600, 0x28680, 0x286c0, 0x28700, 0x28800, 0x28900, 0x28940, 0x28980, 0x289c0, 0x28a00, 0x28a40, 0x28a80, 0x28ac0, 0x28b00, 0x28b40, 0x28b80, 0x28bc0, 0x28c00, 0x28cc0, 0x28d00, 0x28d80, 0x28e00, 0x28e40, 0x28e80, 0x28ec0, 0x28fc0, 0x29080, 0x290c0, 0x29100, 0x29140, 0x29180, 0x291c0, 0x29400, 0x29440, 0x294c0, 0x29580, 0x295c0, 0x29700, 0x297c0, 0x29800, 0x29840, 0x29880, 0x298c0, 0x29900, 0x29940, 0x29980, 0x299c0, 0x29a00, 0x29a40, 0x29b00, 0x29bc0, 0x29c80, 0x29d00, 0x29d40, 0x29d80, 0x29dc0, 0x29e00, 0x29e40, 0x29e80, 0x29ec0, 0x29f00, 0x29f80, 0x29fc0, 0x2a000, 0x2a080, 0x2a0c0, 0x2a100, 0x2a140, 0x2a180, 0x2a1c0, 0x2a200, 0x2a280, 0x2a2c0, 0x2a380, 0x2a400, 0x2a440, 0x2a5c0, 0x2a600, 0x2a640, 0x2a680, 0x2f800, 0x2f840, 0x2f880, 0x2f8c0, 0x2f980, 0x2f9c0, }; static int hkscs1999_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x88 && c1 <= 0x8b) || (c1 >= 0x8d && c1 <= 0xa0) || (c1 >= 0xc6 && c1 <= 0xc8) || (c1 >= 0xf9 && c1 <= 0xfe)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { unsigned int i = 157 * (c1 - 0x80) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); ucs4_t wc = 0xfffd; unsigned short swc; if (i < 2041) { if (i < 1883) swc = hkscs1999_2uni_page88[i-1256], wc = hkscs1999_2uni_upages[swc>>6] | (swc & 0x3f); } else if (i < 10990) { if (i < 5181) swc = hkscs1999_2uni_page8d[i-2041], wc = hkscs1999_2uni_upages[swc>>6] | (swc & 0x3f); } else if (i < 18997) { if (i < 11461) swc = hkscs1999_2uni_pagec6[i-10990], wc = hkscs1999_2uni_upages[swc>>6] | (swc & 0x3f); } else { if (i < 19939) swc = hkscs1999_2uni_pagef9[i-18997], wc = hkscs1999_2uni_upages[swc>>6] | (swc & 0x3f); } if (wc != 0xfffd) { *pwc = wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short hkscs1999_2charset[4698] = { 0xc6d8, 0x8859, 0x8857, 0x885d, 0x885b, 0x8866, 0x8861, 0x885f, 0x886a, 0x8868, 0x886f, 0x886d, 0x88a7, 0x8873, 0x8871, 0x8877, 0x8875, 0xc8fb, 0x887b, 0x8879, 0x88a2, 0x8856, 0x8867, 0x885a, 0x886c, 0x885c, 0x886e, 0x8870, 0xc8fc, 0x885e, 0x8874, 0xc8fa, 0x8878, 0x8858, 0x8869, 0x8872, 0x8860, 0x8876, 0x887a, 0x887c, 0x887d, 0x887e, 0x88a1, 0xc8f6, 0x886b, 0xc8f8, 0xc8f7, 0x88a8, 0xc8fe, 0xc8f9, 0xc8f5, 0xc8fd, 0xc6d9, 0xc7f9, 0xc7f3, 0xc7f4, 0xc7f5, 0xc7f6, 0xc7f7, 0xc7f8, 0xc7fa, 0xc7fb, 0xc7fc, 0xc7fd, 0xc7fe, 0xc840, 0xc841, 0xc842, 0xc843, 0xc844, 0xc845, 0xc846, 0xc847, 0xc848, 0xc849, 0xc84a, 0xc84b, 0xc84c, 0xc84d, 0xc84e, 0xc84f, 0xc850, 0xc851, 0xc852, 0xc853, 0xc854, 0xc855, 0xc856, 0xc857, 0xc858, 0xc859, 0xc85a, 0xc85c, 0xc85d, 0xc85e, 0xc85f, 0xc860, 0xc861, 0xc862, 0xc863, 0xc864, 0xc865, 0xc866, 0xc867, 0xc868, 0xc869, 0xc86a, 0xc86b, 0xc86c, 0xc86d, 0xc86e, 0xc86f, 0xc870, 0xc871, 0xc872, 0xc873, 0xc874, 0xc875, 0xc85b, 0x8863, 0x88a4, 0x8865, 0x88a6, 0xc8d2, 0xc8d3, 0xc6b5, 0xc6b6, 0xc6b7, 0xc6b8, 0xc6b9, 0xc6ba, 0xc6bb, 0xc6bc, 0xc6bd, 0xc6be, 0xc877, 0xc878, 0xc876, 0x88a9, 0x88aa, 0xc6a1, 0xc6a2, 0xc6a3, 0xc6a4, 0xc6a5, 0xc6a6, 0xc6a7, 0xc6a8, 0xc6a9, 0xc6aa, 0xc6ab, 0xc6ac, 0xc6ad, 0xc6ae, 0xc6af, 0xc6b0, 0xc6b1, 0xc6b2, 0xc6b3, 0xc6b4, 0xf9f9, 0xf9f8, 0xf9e6, 0xf9ef, 0xf9dd, 0xf9e8, 0xf9f1, 0xf9df, 0xf9ec, 0xf9f5, 0xf9e3, 0xf9ee, 0xf9f7, 0xf9e5, 0xf9e9, 0xf9f2, 0xf9e0, 0xf9eb, 0xf9f4, 0xf9e2, 0xf9e7, 0xf9f0, 0xf9de, 0xf9ed, 0xf9f6, 0xf9e4, 0xf9ea, 0xf9f3, 0xf9e1, 0xf9fa, 0xf9fb, 0xf9fd, 0xf9fc, 0xc6e6, 0xc8d6, 0xc8d7, 0xc8d8, 0xc8d9, 0xc8da, 0xc8db, 0xc8dc, 0xc8dd, 0xc8de, 0xc8df, 0xc8e0, 0xc8e1, 0xc8e2, 0xc8e3, 0xc8e4, 0xc8e5, 0xc8e6, 0xc8e7, 0xc8e8, 0xc8e9, 0xc8ea, 0xc8eb, 0xc8ec, 0xc8ed, 0xc8ee, 0xc8ef, 0xc8f0, 0xc8f1, 0xc6cd, 0xc6e0, 0xc6e1, 0xc6e2, 0xc6e7, 0xc6e8, 0xc6e9, 0xc6ea, 0xc6eb, 0xc6ec, 0xc6ed, 0xc6ee, 0xc6ef, 0xc6f0, 0xc6f1, 0xc6f2, 0xc6f3, 0xc6f4, 0xc6f5, 0xc6f6, 0xc6f7, 0xc6f8, 0xc6f9, 0xc6fa, 0xc6fb, 0xc6fc, 0xc6fd, 0xc6fe, 0xc740, 0xc741, 0xc742, 0xc743, 0xc744, 0xc745, 0xc746, 0xc747, 0xc748, 0xc749, 0xc74a, 0xc74b, 0xc74c, 0xc74d, 0xc74e, 0xc74f, 0xc750, 0xc751, 0xc752, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc759, 0xc75a, 0xc75b, 0xc75c, 0xc75d, 0xc75e, 0xc75f, 0xc760, 0xc761, 0xc762, 0xc763, 0xc764, 0xc765, 0xc766, 0xc767, 0xc768, 0xc769, 0xc76a, 0xc76b, 0xc76c, 0xc76d, 0xc76e, 0xc76f, 0xc770, 0xc771, 0xc772, 0xc773, 0xc774, 0xc775, 0xc776, 0xc777, 0xc778, 0xc779, 0xc77a, 0xc8d4, 0xc8d5, 0xc6dc, 0xc6dd, 0xc77b, 0xc77c, 0xc77d, 0xc77e, 0xc7a1, 0xc7a2, 0xc7a3, 0xc7a4, 0xc7a5, 0xc7a6, 0xc7a7, 0xc7a8, 0xc7a9, 0xc7aa, 0xc7ab, 0xc7ac, 0xc7ad, 0xc7ae, 0xc7af, 0xc7b0, 0xc7b1, 0xc7b2, 0xc7b3, 0xc7b4, 0xc7b5, 0xc7b6, 0xc7b7, 0xc7b8, 0xc7b9, 0xc7ba, 0xc7bb, 0xc7bc, 0xc7bd, 0xc7be, 0xc7bf, 0xc7c0, 0xc7c1, 0xc7c2, 0xc7c3, 0xc7c4, 0xc7c5, 0xc7c6, 0xc7c7, 0xc7c8, 0xc7c9, 0xc7ca, 0xc7cb, 0xc7cc, 0xc7cd, 0xc7ce, 0xc7cf, 0xc7d0, 0xc7d1, 0xc7d2, 0xc7d3, 0xc7d4, 0xc7d5, 0xc7d6, 0xc7d7, 0xc7d8, 0xc7d9, 0xc7da, 0xc7db, 0xc7dc, 0xc7dd, 0xc7de, 0xc7df, 0xc7e0, 0xc7e1, 0xc7e2, 0xc7e3, 0xc7e4, 0xc7e5, 0xc7e6, 0xc7e7, 0xc7e8, 0xc7e9, 0xc7ea, 0xc7eb, 0xc7ec, 0xc7ed, 0xc7ee, 0xc7ef, 0xc7f0, 0xc7f1, 0xc7f2, 0xc6e3, 0xc6da, 0xc6db, 0x8840, 0x8841, 0x8842, 0x8843, 0x8844, 0x8846, 0x8849, 0x884a, 0x884d, 0x884f, 0x8850, 0x8851, 0x8852, 0x8854, 0x8855, 0xc879, 0xc8d1, 0x9277, 0x96df, 0x89d5, 0x93cd, 0x9bdf, 0xfa68, 0x89da, 0x8f59, 0x89db, 0x8f5d, 0x89dc, 0x96f7, 0x8ada, 0x8bdc, 0x97db, 0x9e53, 0x9daa, 0x9bea, 0x8a6e, 0x8bc8, 0x89e8, 0x89ea, 0xfb70, 0x89ed, 0x94dd, 0x89ee, 0x9eb4, 0x8ad3, 0x92db, 0x94db, 0x89f9, 0xfb7a, 0x89fb, 0x9efc, 0x89fc, 0x89bf, 0x89fe, 0x89e6, 0x9d46, 0x9dee, 0xa07e, 0xa068, 0x98e9, 0x8b68, 0x8dfd, 0x8bbe, 0x9fd9, 0x8aeb, 0x9fd7, 0x8b6a, 0x9c5c, 0x8bb1, 0xfb5e, 0x9df3, 0xa0d0, 0xfc66, 0x92e9, 0x9aec, 0x8fab, 0xfa48, 0x8e45, 0x9c6f, 0x9ede, 0x89ef, 0x96e9, 0x9ebb, 0x94de, 0x9eb8, 0x97ba, 0xfb65, 0x95d6, 0x9cbb, 0x97da, 0x8f45, 0xfb7d, 0x9158, 0xfe64, 0x9856, 0x9b4d, 0x935b, 0x95c7, 0x97e7, 0x9359, 0x91f5, 0x97b8, 0xfda2, 0xfbb6, 0x92fa, 0x9357, 0x8ba6, 0xfbb9, 0x97b0, 0xfdc4, 0x9ca1, 0x91f2, 0x91f9, 0x8ff1, 0x9745, 0x9853, 0xfe78, 0xfbc1, 0x9251, 0x9dad, 0xfd6c, 0xfa6b, 0x9bc2, 0x9a7b, 0x8b60, 0x934b, 0x9abd, 0x91b7, 0x95b4, 0xfec5, 0x9ef0, 0x8d64, 0x9269, 0x8d67, 0xfbea, 0xfbef, 0x8d68, 0x93eb, 0xfc42, 0x9166, 0xfacd, 0x93dd, 0x8bcc, 0x8d6d, 0x8d6e, 0x96a8, 0xfca6, 0x8d6f, 0x8d70, 0xfc64, 0x9060, 0x8d74, 0x97c3, 0x8ad0, 0x9274, 0x9bbe, 0x9cc8, 0x9cba, 0x8d78, 0x9eb9, 0x955a, 0x91b4, 0x8a48, 0x8d7d, 0x8a7d, 0x8ac2, 0xfd4a, 0x8da1, 0x8ad1, 0xfcb4, 0x8b47, 0x93a4, 0x9eda, 0x8a51, 0x8da6, 0x9ec5, 0xfcc4, 0xa078, 0x94b5, 0xfcc2, 0x8a6b, 0x8dab, 0xfae8, 0x8dad, 0xfc49, 0x93c1, 0x906f, 0x8db0, 0x947e, 0x90fa, 0x9479, 0x8db2, 0xfcee, 0x997b, 0x8db4, 0x8db7, 0x91b3, 0x8dbb, 0x8dba, 0x8dbc, 0x9044, 0xfd4c, 0x93e4, 0x93e0, 0xfd53, 0x8dc3, 0x9bb8, 0xfbf0, 0x93e9, 0x93f6, 0x8dc5, 0x8dca, 0x8dcc, 0xfd5d, 0x93b5, 0xfd61, 0x9cf8, 0x9252, 0xa0e8, 0x9ca5, 0x8dd6, 0x97c0, 0xa0de, 0x97d2, 0xfaa5, 0xfda3, 0x8ddb, 0x8eaf, 0x91b5, 0xfd49, 0xfdd1, 0x8deb, 0x97c6, 0xfdce, 0x90fc, 0xfc59, 0x96d6, 0x97c5, 0x8def, 0x97d7, 0x8df0, 0x96a6, 0xfbbf, 0x8df3, 0x9449, 0x8df5, 0x9872, 0x8e6b, 0xfafd, 0x8f50, 0x9dcc, 0xfc65, 0x996e, 0x94a1, 0x8f63, 0xa0da, 0x9253, 0xfde9, 0x9db5, 0x9879, 0x9d5d, 0x8d63, 0x9669, 0x9f70, 0xfc6a, 0x8ac7, 0x89d7, 0xfe4d, 0x9edd, 0xfefb, 0x98bc, 0xfacc, 0x95b0, 0x9464, 0x936f, 0x94b9, 0x95ec, 0x91ee, 0x98c3, 0x95f6, 0x8ffd, 0x98c5, 0x9766, 0xfe6e, 0x97dd, 0x92d2, 0x9761, 0x98cb, 0x95f0, 0x975d, 0x91e3, 0x98cc, 0x9469, 0x98cd, 0x98ce, 0x95fc, 0x94a3, 0x9662, 0xfeb6, 0x9463, 0x98d0, 0x98d1, 0x9475, 0xfae0, 0x9472, 0x98d6, 0x8af0, 0x98d9, 0x98db, 0x98dd, 0x98a8, 0x8a6d, 0x8afb, 0x8aae, 0xfbc9, 0x98e4, 0x98e6, 0x98e8, 0x8a4d, 0x9257, 0x95df, 0xa0ac, 0x98eb, 0x98ec, 0x98f4, 0x8ab8, 0x9ee7, 0x94bc, 0xfcd1, 0x9cc6, 0x9e7e, 0x98fe, 0xfde8, 0x9940, 0x94c9, 0x94d3, 0x9946, 0x90c0, 0x94d1, 0x9573, 0x93c2, 0x9948, 0x994b, 0x8e55, 0x994e, 0x8efe, 0x8e59, 0x94ec, 0x94ef, 0x8f74, 0x9955, 0x9544, 0x9956, 0x9959, 0x995b, 0xfa45, 0x90b7, 0x9743, 0x95cd, 0x97c9, 0xfd50, 0x8eb9, 0x95c6, 0x9967, 0x8ab9, 0x8dfc, 0x8a76, 0x9d51, 0x9973, 0x9d4f, 0x997a, 0x9564, 0x99a1, 0x99a5, 0x99a7, 0x8eed, 0x99ad, 0xc87e, 0x946e, 0x8f70, 0xfad0, 0x99b3, 0xa053, 0x965c, 0xfd7a, 0x97fe, 0x92bd, 0x97fd, 0x8f64, 0xfcf7, 0x9562, 0x97cd, 0x9e64, 0x924c, 0x8ec9, 0x99bc, 0x9da5, 0x8f54, 0x8f7c, 0x8ea2, 0x8f7a, 0x97ae, 0x96c8, 0x99c3, 0x90d6, 0x9cbe, 0x8f76, 0x9470, 0xfb4b, 0xfdca, 0x8ec7, 0xa0f9, 0x8fa9, 0x99c7, 0x90d7, 0x9edf, 0x99ce, 0x8fba, 0x8feb, 0x99cf, 0x8fc2, 0x92c9, 0x97dc, 0x95b3, 0x9c79, 0x95b2, 0x8fdb, 0x9be3, 0x9e7a, 0x9bee, 0x99de, 0xfafa, 0x8a52, 0x99e1, 0x8a67, 0x8bb5, 0x8aac, 0x99e9, 0xfbca, 0x97de, 0x95d1, 0x99f5, 0xfc4a, 0x9ba9, 0xfbdc, 0xfe56, 0x9ea4, 0x9d49, 0x95db, 0x89c5, 0x99f8, 0x9664, 0x9055, 0x96d4, 0x977c, 0x964d, 0x97e1, 0x9a48, 0x9a49, 0xfe7d, 0x90aa, 0x9a50, 0x9347, 0x8ed8, 0x90c9, 0x9a55, 0x90bc, 0x9a58, 0x8bb8, 0x90d5, 0x9641, 0x9a5a, 0x9a5c, 0x97c2, 0x8abb, 0x9baa, 0x90f5, 0x9a60, 0x9145, 0x9a63, 0x8bb6, 0xfccf, 0x966b, 0x9a6e, 0x914f, 0x9746, 0xa0e6, 0x92d7, 0x9675, 0x93d4, 0x91bb, 0x9679, 0x9a70, 0x9678, 0x91cd, 0x9c4a, 0xa06f, 0xa06a, 0x915f, 0x9fa5, 0x89ba, 0x9ecd, 0x9a79, 0x9dce, 0x9d73, 0x96b9, 0x96bc, 0x9cd1, 0x89b7, 0x9eee, 0xfb43, 0x9ec9, 0xfbd3, 0x91ae, 0x9d78, 0x9d7b, 0x9eb3, 0x9eb2, 0x9dd6, 0x994f, 0x89ce, 0x8bc0, 0x9fc4, 0x8bd4, 0xc6bf, 0x8bf9, 0x8946, 0xc6c0, 0xfae5, 0xc87b, 0x8bc6, 0x9c57, 0x9afb, 0x89d0, 0x89cf, 0xc6c1, 0x89d1, 0x89e2, 0x927e, 0x9dba, 0xc6c2, 0xfbf8, 0x8bc7, 0x926b, 0x89d2, 0x9fcf, 0x9da9, 0x89d3, 0x99e2, 0x9267, 0x92a4, 0x894e, 0x894f, 0x9278, 0x91b6, 0x89d4, 0x9fd2, 0x92a7, 0x95a2, 0x926e, 0x96ea, 0x926f, 0x92a3, 0x8950, 0xfa57, 0x9866, 0x89d6, 0x98b2, 0x92ab, 0x96de, 0x92ac, 0x9f6e, 0x8ef2, 0x9f6c, 0x89d8, 0xfa59, 0x92a8, 0x9163, 0x9f73, 0x92ad, 0x9be9, 0x92a9, 0x92aa, 0x89d9, 0xfd56, 0x9fa8, 0x92a1, 0x90e3, 0xa0a6, 0x94ab, 0xfc72, 0x97c4, 0x92ae, 0xfa67, 0x92a2, 0xfa69, 0x9268, 0x8951, 0xfa6f, 0xfa71, 0x8952, 0x945a, 0xc6c3, 0x89dd, 0xc8a2, 0xc6c4, 0x9e52, 0x8953, 0x9e55, 0x92ba, 0xc6c5, 0xfa7d, 0xfaa8, 0x9a68, 0xfa47, 0xfa7e, 0x92bb, 0xfdb6, 0xfaa2, 0xfaa3, 0xfaa4, 0x9bb4, 0xfaa6, 0x89df, 0xfddb, 0xfaa9, 0x8954, 0xfaab, 0xfc7a, 0x89e0, 0x9f4f, 0xc87d, 0x89e1, 0xfab0, 0x9fcd, 0xa0e7, 0xfab1, 0x89a6, 0x9efa, 0xfab2, 0xfab4, 0x92c4, 0x9f6f, 0x8bb0, 0x9fac, 0x89e3, 0x9bd3, 0x89e4, 0xfab5, 0x9fd5, 0x8955, 0x92c5, 0x8956, 0xfab3, 0xfab6, 0xfab7, 0x9edc, 0xfbc4, 0x9f71, 0xfaba, 0x92c7, 0xc6c6, 0x9a4c, 0x89e5, 0x9f7d, 0xa0a9, 0xfac4, 0xc6c7, 0x8957, 0xfaaa, 0x8958, 0x8be3, 0x8b61, 0x9af1, 0x9eb7, 0xc6c8, 0xfad1, 0xfad2, 0x9eba, 0xfad4, 0xfad9, 0xfadb, 0x9ce0, 0xfbf7, 0xfbfa, 0x89e7, 0xa07a, 0xfadc, 0xfadd, 0x89e9, 0xc6c9, 0xfae2, 0x89eb, 0xfae3, 0x90c8, 0x92da, 0x8959, 0x9cf5, 0x895a, 0xfae7, 0x9fa2, 0xfaea, 0xfaed, 0x8fad, 0xfb59, 0xfaef, 0x96ef, 0x9dec, 0x9dca, 0xfd6d, 0x89ec, 0xfb44, 0x9de2, 0x9ec0, 0x9e56, 0x9f79, 0x9ac7, 0xfaf4, 0x98a1, 0xfaf8, 0x89f0, 0x9e47, 0x9df7, 0x9fd3, 0x9aca, 0x89f1, 0xfaf9, 0x8e5a, 0x89f2, 0x89f3, 0x925d, 0x8b51, 0x92e0, 0x89f4, 0x9fd4, 0x8a79, 0x89f5, 0x97a7, 0x93ba, 0x9e58, 0x89f6, 0x9e57, 0x89f7, 0x8a41, 0x89f8, 0xfaf1, 0x89fa, 0xfb42, 0xfabf, 0xfba3, 0xfaf7, 0x9e4e, 0x94dc, 0x95da, 0x9df8, 0x9f6a, 0x8ab7, 0xfb46, 0x8a46, 0xfb47, 0x9148, 0x92de, 0x8b53, 0x9df6, 0x9bda, 0x9d7e, 0x89fd, 0x99e4, 0x9e43, 0x9de9, 0x8f52, 0x9df5, 0x9df0, 0x99e7, 0x8bbd, 0x9def, 0x9fb7, 0x9dd0, 0x9feb, 0x8da9, 0x9dcf, 0x98e1, 0x9de5, 0x9dc8, 0xfb4f, 0x9deb, 0xfb54, 0xfb55, 0x9aa2, 0x8ad6, 0x9a5f, 0x9ef5, 0x8fb7, 0x9ad2, 0x9e6a, 0x9ee8, 0x8bbf, 0x91c2, 0x9d62, 0x9260, 0x925e, 0x91c1, 0x8ac5, 0x97a3, 0x8b6c, 0x8d7e, 0x9c54, 0x9dbd, 0x9cc5, 0x895b, 0xfb5c, 0xfb5b, 0xfb57, 0x98c7, 0xfb5a, 0x9cee, 0x92e2, 0x94a7, 0x9bd4, 0xfb64, 0xfb76, 0xfb60, 0x99e5, 0x9ac2, 0x91fb, 0xa073, 0x9f72, 0x9fcc, 0x98a5, 0x92e8, 0x9bbc, 0x96f3, 0x92e7, 0xfc67, 0x8b7d, 0x9bf4, 0x9ef7, 0x9ec1, 0x996f, 0x96f1, 0x8e41, 0x954a, 0x97e6, 0x96f5, 0x92e6, 0x9f42, 0xfb67, 0x99a9, 0xfae6, 0xfb69, 0x97e5, 0x967d, 0xfb6c, 0x99a2, 0x9abb, 0x9a65, 0x944e, 0xfb6e, 0x99df, 0x98e3, 0x9254, 0x967b, 0x8aaf, 0x8baf, 0x9ebd, 0x9ee6, 0xfb6f, 0x8ee1, 0x9b7d, 0x9c7e, 0xf9d9, 0x92ea, 0xfb72, 0xfb71, 0x895c, 0x98f0, 0x96f2, 0xfb74, 0x8bc1, 0x895d, 0x89de, 0x895e, 0xc6ca, 0xfe42, 0xfb7b, 0x895f, 0x8960, 0x9bcd, 0x9dd3, 0x984c, 0x9752, 0x95c3, 0x9bb6, 0x9ab9, 0x97b3, 0x9f74, 0x92f1, 0x97df, 0xfba6, 0xfbab, 0x9877, 0x9854, 0x95c5, 0x9d55, 0xfbb2, 0x957e, 0x9742, 0x94e6, 0x92f5, 0x92fd, 0xfba2, 0x9c51, 0x94e9, 0x985c, 0x92f0, 0x944c, 0x916b, 0x8b78, 0x94e2, 0x984f, 0xfbb5, 0x9271, 0x9365, 0x985b, 0x9850, 0x97bc, 0x92f3, 0x9340, 0x984d, 0x9572, 0xfdef, 0xfdc1, 0xfbba, 0x92eb, 0xfc73, 0x97b7, 0xfbb4, 0x90a7, 0x9741, 0x92f4, 0xfbbc, 0x9577, 0x9ee2, 0x8f78, 0xf9dc, 0x9672, 0x9eb5, 0x964b, 0xa0fa, 0x9575, 0x90da, 0x9367, 0xfea4, 0x90df, 0x9354, 0x8961, 0x8bb4, 0x9dc0, 0x8e48, 0xfbc5, 0xfbc7, 0xc6cb, 0xfa79, 0x9e67, 0xfbd2, 0x8962, 0x8963, 0xfc7d, 0x9f6b, 0xfbcc, 0xfeae, 0xfbd1, 0xfb75, 0xfbd4, 0xfbd6, 0xfbd8, 0x8b5d, 0x934c, 0x9ae2, 0x8bc9, 0xfbdb, 0x9fc9, 0x9f44, 0x98ed, 0xfbdd, 0x8df2, 0x8964, 0xfdf2, 0x934d, 0xfbe7, 0xa0f2, 0x9868, 0x9f58, 0x8d73, 0xfbde, 0xfbdf, 0xfbe3, 0x8da8, 0xfbe4, 0x9c75, 0x9878, 0x8d60, 0xfbe5, 0x8d61, 0x8d62, 0xa0a1, 0x9c40, 0x98ad, 0x9eea, 0x9ceb, 0xfbe0, 0x9f51, 0x8d65, 0x9cf1, 0xfc58, 0x8d66, 0x9654, 0xfbe8, 0xc6cc, 0x9fce, 0xfbfc, 0x9ae4, 0x9f75, 0xfbf1, 0x8d69, 0x934f, 0x934e, 0xfbf4, 0xc6ce, 0xfbc3, 0x8965, 0x8d6a, 0x9353, 0x9dfb, 0xfbfd, 0x9059, 0xfc40, 0xfc41, 0xfc43, 0x9361, 0xfc46, 0x9362, 0x8d6b, 0xfc4c, 0x95b8, 0xc6d0, 0x8bca, 0x987a, 0xc6d1, 0xfc51, 0xfc54, 0xfaaf, 0x8d6c, 0xfa61, 0xfc57, 0x9b70, 0xa051, 0x8bcb, 0x936e, 0xfcd5, 0xfca9, 0xfc61, 0x8966, 0xfacb, 0xf9da, 0x937a, 0xa0e0, 0x936b, 0xfc6b, 0xa0dc, 0x9468, 0xfc6d, 0x8d71, 0xfd64, 0x99ba, 0x9ad0, 0x9a61, 0xa0e5, 0xa05b, 0x96ac, 0x9740, 0x9ef1, 0x9f7e, 0x8d72, 0xfc76, 0x96a9, 0xa06e, 0xfcaa, 0xfbcd, 0xfc74, 0xa074, 0xa071, 0xfc79, 0xfc7c, 0x9c50, 0x9379, 0x9378, 0xa0dd, 0x8d75, 0x8d76, 0x9374, 0x8d77, 0xfca5, 0xfca2, 0x90c3, 0xa079, 0x8d79, 0x8bfc, 0xa076, 0x8bcd, 0x9f5a, 0x9ff4, 0x9fba, 0x8d7a, 0x9e45, 0x93b0, 0xa075, 0x9b46, 0xfcae, 0xfcb0, 0xfa51, 0x8d7b, 0x8d7c, 0x9ed6, 0x93ac, 0x9f5b, 0x93a9, 0xa07c, 0xfcb2, 0x8ac1, 0x9fb4, 0xfcac, 0x9e4c, 0x8fc5, 0x93ad, 0x9dc3, 0x8da2, 0x9d4a, 0xfcb6, 0x8da3, 0x9e4b, 0x9e4d, 0x8da4, 0x8afd, 0xfcb5, 0xfcc3, 0x93b2, 0x8da5, 0x93a1, 0x8ac6, 0x8a5b, 0x894d, 0xfed4, 0x8a78, 0x93ab, 0x8da7, 0x9f45, 0x8a56, 0xfcbf, 0xfcc0, 0x8ee6, 0x8aa4, 0x8943, 0x93f3, 0xfcab, 0x9ea2, 0x9dc7, 0xc6d2, 0x8bce, 0xfcc5, 0xfccb, 0x93b3, 0xfcca, 0xfcc9, 0x8dac, 0xfbc6, 0x8967, 0xfccd, 0x9cf3, 0xfcd0, 0x95bb, 0xfcd3, 0xfcd4, 0x8dae, 0xfcd7, 0x93db, 0xfe63, 0x93d5, 0xfcda, 0x9b71, 0xfcdd, 0x8daf, 0xfaf2, 0x93d8, 0xfcdf, 0x93d3, 0xfce1, 0x8e76, 0xfc62, 0x93d1, 0x8db1, 0x9859, 0xfb52, 0xfb53, 0xfb4d, 0x9cbf, 0x9b72, 0xfb50, 0x93be, 0x9df1, 0xfceb, 0xa0bb, 0x9b7e, 0x8db3, 0x9ae8, 0x8edc, 0x9cf9, 0xfa50, 0x98e7, 0xfcf3, 0xfcf2, 0x93e5, 0x9a59, 0x8db5, 0xfd4d, 0xfd5e, 0x8f7d, 0x9547, 0xfcf6, 0x9250, 0x8968, 0x8db6, 0xfcfb, 0xa07d, 0x98fc, 0x8969, 0xfe4f, 0x9256, 0xfac9, 0x93e8, 0xfcf8, 0x9ce3, 0xfda9, 0xfc44, 0x9640, 0x8db8, 0x9b4a, 0x8fb9, 0xfcfe, 0x896a, 0x8db9, 0x917e, 0x93f4, 0xfb7c, 0x93e7, 0x97ef, 0xfe4a, 0xfd45, 0x96a5, 0xfee0, 0xfd48, 0xfd47, 0xfef2, 0xfe6a, 0x8dbd, 0x9ba1, 0x9ab7, 0x8efc, 0x9fa1, 0xfd51, 0xfaad, 0x8dbe, 0x89a4, 0x9ad9, 0xfd4e, 0x8dc0, 0x97f0, 0x93b4, 0xfd44, 0x9fa7, 0x8dc2, 0x99b6, 0xfd52, 0x8dc1, 0x8e46, 0xa0d1, 0x9fca, 0x92cf, 0x9cf4, 0x8dc4, 0xfd41, 0x9b4c, 0xfd57, 0xfcef, 0x9cde, 0xfd42, 0x986c, 0x97f9, 0x9558, 0x985e, 0xfe7b, 0x94cd, 0x93ee, 0xfd5a, 0x93f5, 0x93ef, 0x8eea, 0x8f5b, 0x8dc6, 0x8dc8, 0x8dc7, 0x93f7, 0x8dc9, 0xfbf2, 0x9670, 0x8dcb, 0xfd5c, 0x8f65, 0x8dcd, 0x9da8, 0x94f9, 0x8dce, 0x93ea, 0xfd5f, 0x93f0, 0x9fb6, 0x8dcf, 0x9763, 0x8dd0, 0x93f1, 0xfd62, 0xfd65, 0x9fdb, 0x93f8, 0x8bf7, 0xfd66, 0x8bcf, 0x8dd1, 0x8dd2, 0xfd71, 0xfd6f, 0x8dd3, 0x9fe7, 0x90bd, 0x9fd0, 0x8bd0, 0xfd72, 0x9cae, 0x8bd1, 0x8adb, 0xfae4, 0x95ce, 0xfd76, 0xfb62, 0x8dd4, 0xfd78, 0x8ee3, 0x9076, 0x98c6, 0x8dd5, 0x97d1, 0x9eb6, 0xfac7, 0xa042, 0x9873, 0x9ffc, 0x8dd7, 0x92fb, 0x8dd8, 0x944f, 0x8dd9, 0x896b, 0x97ce, 0xfaf3, 0xfdae, 0xfbaf, 0x92b7, 0x8dda, 0x9c5a, 0xfdad, 0x8ddc, 0x9444, 0x8ddd, 0xa0d6, 0x97d5, 0x944a, 0x944d, 0x97cb, 0x8dde, 0x8ddf, 0x8de0, 0xfef9, 0xfdc0, 0xfcf9, 0xfb7e, 0x92b3, 0xfdaf, 0x8de1, 0x95d3, 0x89c1, 0xfd68, 0x9cb7, 0x8de3, 0xfac0, 0x8de5, 0xfa64, 0x8947, 0x8de4, 0x8de7, 0x8de8, 0xfdc7, 0xfdb0, 0x9445, 0x97d6, 0xfcc6, 0x9844, 0x8de9, 0x8dea, 0xfe50, 0xfdcc, 0x9da7, 0xfdcd, 0xfdcf, 0x95d2, 0x8ded, 0xfcba, 0xfdc5, 0xfdd2, 0x9cdc, 0x95cf, 0x8dee, 0xfdd4, 0x96ec, 0x96eb, 0x90b6, 0xfdc3, 0x98ab, 0x96ee, 0x8df4, 0xfde0, 0x8df6, 0x8df7, 0x8ffa, 0x97d0, 0x8bd2, 0x8df8, 0x90d9, 0xfaf0, 0xfde1, 0x8df9, 0xfde3, 0x8dfa, 0xfb63, 0x90a6, 0x9970, 0x91eb, 0x9770, 0x986f, 0xfde2, 0x98f2, 0x9afc, 0x896c, 0xfdfd, 0x995e, 0x95bd, 0xfde4, 0x91e6, 0xfde5, 0xfde6, 0xfde7, 0x9454, 0x99b8, 0x97e9, 0x9346, 0x9863, 0x95bc, 0xfded, 0xfdf7, 0x9870, 0x96f6, 0x8ea9, 0x9451, 0x8e43, 0x8b5a, 0xfdee, 0xfdf0, 0xfdf4, 0x9bf5, 0x977e, 0x9bd5, 0x9ac3, 0x97c8, 0xa0db, 0x91d0, 0x9fe4, 0x8fdd, 0x91e9, 0x98e0, 0x92ca, 0x9857, 0xfdeb, 0x9b49, 0x9d76, 0x9eaf, 0x9ccc, 0xfdea, 0x8df1, 0xfdfb, 0x8e53, 0xfacf, 0x96f9, 0x98bf, 0x9e49, 0x9bca, 0xfdfe, 0x92dc, 0xfe41, 0x91cc, 0x91e2, 0xfe44, 0x8bd3, 0xfe47, 0xfe48, 0x9455, 0xfe4b, 0xfe4c, 0x8dbf, 0x9e78, 0xfe51, 0x9456, 0x9d61, 0x9457, 0x9966, 0x8bd5, 0xa069, 0x98b4, 0xa049, 0xa04c, 0x9e65, 0x98b5, 0xfe58, 0x9975, 0xfe53, 0xa065, 0xfe59, 0x98b7, 0x98b8, 0x98ba, 0x98bb, 0x9fbc, 0xa04a, 0x9ec7, 0x98ae, 0x92d6, 0xfae1, 0x91d4, 0xfade, 0xfe5b, 0xfe5e, 0xfbd7, 0xfe5a, 0x94c5, 0xfaca, 0x98c1, 0x975c, 0xfe74, 0x9773, 0xfa46, 0x9764, 0xfe68, 0x964e, 0x9765, 0x89a1, 0x95fa, 0x92d4, 0xfe69, 0xfb45, 0x98c8, 0x90ef, 0x98c9, 0x98ca, 0x946d, 0x94b7, 0xfe6c, 0x946b, 0x92fc, 0x95eb, 0xfe73, 0x976e, 0xfe5f, 0xfdbd, 0x92d5, 0xfeb9, 0xfe71, 0xfbbb, 0x947a, 0x95fb, 0xfe77, 0xfe79, 0xfe75, 0x945d, 0xfe7c, 0x9344, 0x8ea6, 0x92d3, 0x94b8, 0xfc71, 0x975e, 0xfea7, 0x946a, 0x93e3, 0x98cf, 0xa0d9, 0xa0bf, 0xa04d, 0xa0b8, 0xa0ce, 0xa0b7, 0xfea9, 0x89c3, 0xfeab, 0x9df4, 0x896d, 0x9c7b, 0x98d2, 0x9fa9, 0xfeb2, 0xfeb1, 0x97d9, 0xa0c4, 0x9476, 0x9978, 0xfeb3, 0x98d3, 0xfeb4, 0x98d4, 0x9fb9, 0x9471, 0x98d5, 0xfeb8, 0xc6d4, 0xfeba, 0x9e5c, 0xfebb, 0xa044, 0x98d7, 0x98d8, 0xfebc, 0x9ffe, 0xfebd, 0x9ddd, 0x9ee1, 0x98da, 0x9ddf, 0xfebf, 0xfebe, 0x9eeb, 0x9e59, 0xa05c, 0xfec0, 0x9477, 0x98dc, 0xfec1, 0x98de, 0xfec3, 0xfec8, 0xfec9, 0xfeca, 0xfecb, 0x9fc2, 0x98c4, 0x94b0, 0x94b1, 0xfed1, 0xa0c1, 0xfed2, 0xa0cd, 0xfed3, 0x98e5, 0xfed6, 0x91e4, 0x8fc7, 0x94ae, 0x8a4f, 0x94b2, 0x8fd4, 0x98ea, 0xfed8, 0x9de0, 0x98ee, 0x95c4, 0xfce8, 0x98ef, 0xfad8, 0xfedc, 0xa0ae, 0x9d4c, 0x98f1, 0x98f3, 0x94c1, 0x98f5, 0xfa4f, 0x96e2, 0x9450, 0x96a2, 0x98f6, 0x96e5, 0x98f7, 0xa046, 0x96e3, 0x98f8, 0x9ee4, 0xf9d6, 0x94c3, 0x94c2, 0xfee1, 0xfee9, 0x96e4, 0x89ac, 0x96db, 0xfee2, 0x94c4, 0xfee3, 0xfee7, 0x9ffb, 0x93c9, 0x94e8, 0xfb56, 0x90c5, 0xa0a8, 0xfee5, 0x98fd, 0x98fb, 0xfee8, 0x8ebf, 0x8bd8, 0xfef7, 0x8f68, 0x94c6, 0x9dea, 0xfc69, 0x9cda, 0xfef3, 0x9c72, 0xfef0, 0x89c9, 0x9941, 0x9942, 0xfef5, 0x91d7, 0x94cc, 0xfef8, 0x97a8, 0xfefc, 0xfdbf, 0xfefe, 0x96d1, 0x94d5, 0x94d0, 0x9944, 0xa0b3, 0x94cf, 0x9ffa, 0x91e5, 0x9c6a, 0x8e49, 0x8e4c, 0x8e4d, 0x9a73, 0x9947, 0x8e50, 0x8e4f, 0x9949, 0x8e51, 0x8e52, 0x9ab2, 0x89a5, 0x994c, 0x9ff8, 0x8e56, 0x994d, 0x91ca, 0x8e57, 0x94e1, 0x9047, 0x8fd8, 0x8e58, 0x94eb, 0x8e5c, 0x9553, 0x9fe5, 0x9f56, 0x954f, 0x8e5e, 0x996a, 0x9c64, 0x9cd9, 0x8e5d, 0x9950, 0x9951, 0x8e62, 0x9952, 0x8e68, 0x8e61, 0x9f59, 0x8bb3, 0x9f5d, 0x8e66, 0x8e6e, 0x9f64, 0x9953, 0xfab8, 0x9954, 0x8e70, 0x9f61, 0x8e72, 0xa06b, 0x9f40, 0x94ed, 0x94ee, 0x9fbd, 0x8e7b, 0x9957, 0x94f7, 0x9f5f, 0x8e73, 0x9f62, 0x94f6, 0x9958, 0x8e75, 0xf9db, 0x9072, 0x94f8, 0x995a, 0xa0b0, 0x8e79, 0x8e78, 0x94f3, 0x98af, 0xa0b2, 0x8e7a, 0x995c, 0x8e7c, 0x8e7d, 0x8bd9, 0x89a2, 0x9ed7, 0xa0b6, 0x9e42, 0x8ea4, 0x8ea7, 0x9542, 0x987d, 0x9755, 0x8ea8, 0x8eaa, 0x89a3, 0x9960, 0x9962, 0x94fc, 0x9961, 0x94fa, 0x8eae, 0x8eb2, 0x8eb0, 0x9963, 0x97aa, 0x94fb, 0x8ebb, 0x9876, 0x8ea1, 0x8eb7, 0x9da6, 0x9eb0, 0x8eb8, 0x9d70, 0x896e, 0x896f, 0x8970, 0x8971, 0x8972, 0x8973, 0x8974, 0x8975, 0x8ebc, 0x8ebd, 0x8ebe, 0x9dd1, 0x94fd, 0x8bd7, 0x8bda, 0xa0e2, 0x9fe9, 0xfda8, 0x8ae7, 0x8ec2, 0x8ec4, 0x9964, 0x9965, 0x954e, 0x98b3, 0x8ecb, 0x8bdf, 0x8ece, 0x8ecf, 0x9968, 0x9969, 0x996b, 0x8ed1, 0x996c, 0x8ed4, 0x8ed5, 0x996d, 0xa0be, 0x8ed6, 0xa0bc, 0xa0b5, 0xa0b4, 0x8be0, 0x89b5, 0x8edd, 0x9e5d, 0x9971, 0x89ae, 0x9de8, 0x9565, 0x9972, 0x8b5c, 0x89b1, 0xa0c0, 0x8edf, 0x9566, 0x9974, 0x9976, 0x9977, 0x9979, 0x9dda, 0x8ee0, 0x935c, 0x9de6, 0x8b5f, 0x9563, 0x9567, 0x9de3, 0x997c, 0x997d, 0x997e, 0x8b5b, 0x99a3, 0x99a4, 0x99a6, 0x99a8, 0x8abe, 0x9e61, 0x99aa, 0xa0c8, 0x99ab, 0xfec4, 0x98c2, 0x8ee8, 0xa0ba, 0xfd77, 0x8eee, 0x9ebf, 0x89c2, 0x99ac, 0x956b, 0x956c, 0x99af, 0x994a, 0x8976, 0x8f48, 0xfbee, 0x99ae, 0x8efb, 0x8b52, 0x99b0, 0x8977, 0x8f41, 0x99b1, 0x8f49, 0xfa4d, 0x9de4, 0xfbe9, 0x9b54, 0x99b2, 0x9e68, 0x8f4a, 0x8f42, 0x8f51, 0x9846, 0x99b4, 0x8ef5, 0xfd55, 0x9ccd, 0x8978, 0x8f53, 0x8f6f, 0x8e63, 0x8f56, 0xfe76, 0x9fc6, 0xfaac, 0x8f58, 0x9848, 0x99b7, 0x9665, 0xfa6c, 0x9de7, 0x9e62, 0x96cc, 0x8e67, 0xfc75, 0x987e, 0xfdb9, 0x97fc, 0x98f9, 0x8f66, 0x956e, 0x9245, 0x8f60, 0x9ed1, 0xfecd, 0x99b9, 0x8f62, 0x974c, 0x91c7, 0x955f, 0x99bb, 0x8e6d, 0x8f71, 0x94cb, 0x95b1, 0x9af2, 0x96c3, 0x99bd, 0xa0cf, 0x8f6d, 0x99be, 0x8ef4, 0x8f72, 0x95e4, 0x99bf, 0x9242, 0xfba5, 0x99c0, 0xfdb4, 0x8f77, 0x99c1, 0xfab9, 0x8f40, 0xfa44, 0x99c2, 0x8f5c, 0x99c4, 0x99c5, 0x8f7b, 0x8fa3, 0x99c6, 0x96cd, 0x96c7, 0x8fa5, 0xfabb, 0x9570, 0x9368, 0x8f7e, 0x8faa, 0xa050, 0x90d3, 0x9556, 0x8fb8, 0x99c8, 0x8faf, 0x99c9, 0x9579, 0x9f49, 0x99ca, 0x99cb, 0x9dd5, 0x8fb0, 0xfa7a, 0x9e5f, 0x99cd, 0xa0c9, 0x9adb, 0xa0c6, 0x8fb4, 0xa0d7, 0xa0c7, 0xa043, 0x8fb5, 0x8fb2, 0xa061, 0x9e5e, 0x8fb6, 0x9fe8, 0x9cb2, 0x957c, 0x9fc7, 0x8fbb, 0x8fbc, 0x8fec, 0x8fc0, 0x936a, 0x8be4, 0x9c7c, 0x95a1, 0xfeec, 0x95a3, 0x8fc1, 0xa052, 0x99d0, 0x8fc3, 0x8fc4, 0x95a4, 0x8fc6, 0x9e60, 0xf9d8, 0x95a5, 0x9cb3, 0x99d1, 0xfef1, 0x99d2, 0x9cc2, 0x99d3, 0x95a7, 0x95a9, 0x95a6, 0x9c5d, 0x98e2, 0x8fc9, 0xa0c2, 0x8fca, 0x99d4, 0xa0b9, 0x9b58, 0x8fcd, 0xa0d4, 0x8fce, 0x8be5, 0x8979, 0x8fd0, 0x95b6, 0x99d6, 0x95e5, 0x99d7, 0x95b5, 0xa0ca, 0x9ffd, 0xa058, 0x8fd6, 0x99d8, 0x8fd3, 0x8fe5, 0x8fe9, 0x99d9, 0x927c, 0x9c45, 0x8fde, 0x8fdf, 0xa04b, 0x8fe2, 0xa0cc, 0x8fe3, 0x8fe4, 0x9bc4, 0x9bfc, 0x964c, 0x9af6, 0x8fe7, 0x8fe8, 0x8be7, 0x897a, 0x897b, 0x99da, 0x8fed, 0x95c0, 0xa0cb, 0x9e48, 0x99db, 0x8ff3, 0x8ff9, 0x95c1, 0xa04e, 0x99dc, 0xa064, 0x8ff7, 0x89b0, 0xa048, 0x8ffb, 0x8ff6, 0x9ddc, 0x99dd, 0x8be8, 0x92c1, 0x9fd6, 0xa0d2, 0x9040, 0x8ac4, 0x99e0, 0x9ff0, 0x9ff3, 0x9dbf, 0x9ff6, 0x95c8, 0x9e5a, 0x99e3, 0x8a4a, 0x9ff1, 0x8aa7, 0x99e6, 0x9ff7, 0x9fed, 0x8a5c, 0x9dae, 0x95c9, 0x9048, 0x99e8, 0x9049, 0x90b1, 0x904a, 0x99ea, 0x9bd1, 0x99eb, 0x99ec, 0x99ed, 0x99ee, 0x904c, 0x904d, 0x95cb, 0x97e2, 0x95cc, 0x9f78, 0x897c, 0x897d, 0x897e, 0x995d, 0x9b5a, 0x9050, 0x9054, 0xc6d6, 0x9aa8, 0x99ef, 0xfeeb, 0x9da3, 0x9da1, 0x9943, 0x9945, 0x9d7d, 0x99f0, 0x99f1, 0x99f2, 0x9d60, 0xa0a3, 0x905b, 0x9edb, 0x9d79, 0x99f3, 0x9062, 0x9f55, 0x9bf9, 0x9065, 0x96e0, 0x98be, 0x9068, 0x906c, 0x95d8, 0x906a, 0x9fb2, 0x9fae, 0x9fb0, 0x89ad, 0x906e, 0x9e71, 0x9e4a, 0x9fdc, 0x89ab, 0x9fb8, 0x9070, 0x8b63, 0x95dc, 0x9071, 0xfc5e, 0x8949, 0x965b, 0x94a6, 0x8fd5, 0x9e73, 0x9075, 0x99f7, 0x99f9, 0x9663, 0x95b9, 0x94d4, 0xfcfa, 0x9077, 0x90ab, 0x9d4d, 0x99fa, 0x92e3, 0x97bb, 0x9078, 0x99fb, 0x97e0, 0x96dc, 0x9ca8, 0x9772, 0x9440, 0x92f2, 0x99fd, 0x99fc, 0xf9d7, 0x964a, 0x96d8, 0x99fe, 0x904b, 0xfa41, 0x9a40, 0x975b, 0x9a41, 0x91dd, 0x93fc, 0x9a42, 0x9a43, 0x9659, 0x9a44, 0x9051, 0x94bf, 0x90a2, 0x9cab, 0x9776, 0xfc55, 0xfe45, 0x94a8, 0x9a45, 0xfa4b, 0x9de1, 0x96d9, 0x9774, 0xfdf5, 0x92e5, 0x9645, 0x91da, 0x90a3, 0xa05f, 0x90af, 0x97bf, 0x914c, 0x967a, 0x91de, 0x9a46, 0xfeb0, 0x9779, 0x946c, 0x9858, 0x9266, 0x93fb, 0x9a47, 0x9749, 0x9748, 0x934a, 0x9ce2, 0x9264, 0x91df, 0xfb79, 0x96d7, 0x9343, 0xfdcb, 0xfe7a, 0x91db, 0x97af, 0x95dd, 0x9348, 0x9a4b, 0xfc45, 0x9a4d, 0x91bc, 0x90e2, 0x90b4, 0x95e1, 0x9a4e, 0x9a4f, 0xfe40, 0xfe43, 0x96dd, 0x9a51, 0x96a7, 0x90b0, 0x9c4e, 0x9443, 0x8eba, 0x9a52, 0xfcc1, 0x8be9, 0x9caf, 0x8bfd, 0x9abc, 0x9ab8, 0x9aae, 0x9aa7, 0x9a53, 0x9d74, 0x8bea, 0x8beb, 0x90b2, 0x95e9, 0x95e8, 0x95e6, 0x90b5, 0x9a54, 0x90b3, 0x95e7, 0x8b50, 0x8bec, 0x9a56, 0x8bfb, 0x9a57, 0xa0aa, 0x9fa6, 0x99cc, 0x9c59, 0x99b5, 0x90be, 0x9faf, 0x95f2, 0x90bf, 0x90c1, 0xfee4, 0x90c4, 0x90c7, 0x92e4, 0x9f52, 0x90db, 0xa066, 0x90d2, 0x90d4, 0x9a5b, 0x95fd, 0x8bc4, 0x90de, 0x9ce4, 0x90e1, 0x9e46, 0x9651, 0xfb58, 0x90e6, 0x9650, 0x90e7, 0x90e8, 0x9a5d, 0x9f7a, 0x9b5c, 0x9f7c, 0xfc52, 0x90e9, 0x90ea, 0x9a5e, 0x9f76, 0x90eb, 0x90ec, 0x8bee, 0x90ee, 0x91c6, 0x90f2, 0xfcbc, 0x8a74, 0x9657, 0x9cef, 0x9fdf, 0x90f7, 0x90f6, 0x9b5e, 0x90f8, 0x90f9, 0xfa6a, 0x8bef, 0x9fe0, 0x9142, 0x9a62, 0x9569, 0x9144, 0x9143, 0x9141, 0x8bf0, 0x9660, 0x8bf1, 0x99f6, 0x9149, 0x914a, 0x914b, 0x9a64, 0x8abf, 0x9a66, 0x9a67, 0x9a69, 0x9a6a, 0x9652, 0x914d, 0x9666, 0x9f7b, 0x9a6b, 0xa06c, 0x9667, 0x9a6c, 0x9a6d, 0x8bf2, 0x966a, 0xfcea, 0x966c, 0x91c4, 0x9677, 0x99f4, 0x9a6f, 0x9fab, 0x8ec1, 0x9555, 0x9152, 0x9153, 0x9155, 0x955d, 0x9671, 0x9c6d, 0x9673, 0x9154, 0x9a71, 0x9156, 0x966d, 0x9557, 0x89c6, 0x89c7, 0x8a6a, 0x8b57, 0x9fe1, 0x9b5f, 0xa05d, 0x915b, 0x915c, 0x915e, 0x9f5c, 0x9f57, 0x9f65, 0x9a72, 0x9160, 0x9f5e, 0x9161, 0x9164, 0x9f41, 0x9169, 0x9168, 0x9a74, 0x96b2, 0x9a75, 0xfda5, 0x9ee9, 0x8bba, 0x916d, 0xa060, 0x9fde, 0x9fc3, 0x96b5, 0xa067, 0x96b3, 0x9a76, 0x95d5, 0x9eca, 0x9a77, 0x9a78, 0x9170, 0x916f, 0x9fa3, 0x9171, 0x96b1, 0x9f63, 0x9f67, 0x8bb9, 0x9a7a, 0x8b56, 0x9ada, 0x96b0, 0x9a7e, 0x9dde, 0x96ad, 0x96ae, 0x9ea1, 0x9e50, 0x96af, 0x8bf4, 0x9fa4, 0x96bd, 0x96f4, 0x96b8, 0xfaa1, 0x91a7, 0xa05e, 0x9a7d, 0x8948, 0x9eb1, 0x9ddb, 0x95bf, 0x8a73, 0x9efe, 0x917a, 0x917b, 0x9aa3, 0x96c2, 0x9f77, 0x9aa4, 0x9aa5, 0x91a1, 0x89b8, 0x9173, 0x9aa6, 0x89bd, 0x89b9, 0x917d, 0x96bb, 0x9ff2, 0x8bf5, 0x9aa9, 0x9f54, 0x9fe3, 0x9eed, 0x91aa, 0x91ab, 0xa070, 0x9f6d, 0x91ac, 0x91ad, 0xa0fd, 0x9fe2, 0x91af, 0x9e41, 0x9aaa, 0x91b0, 0x9aab, 0x9aac, 0x9a4a, 0x91b2, 0x8bf6, 0x9aad, 0x89b6, 0x9aaf, 0x9ab0, 0x9ab1, 0x9aa1, 0x91b9, 0x91ba, 0x91be, 0xa041, 0x8bb7, 0x91c0, 0x9ab3, 0x91c3, 0xa0fc, 0x9fee, 0x9f69, 0x91c8, 0x91c9, 0x8de6, 0x91cb, 0x89c8, 0x8daa, 0x9fdd, 0xc8a1, 0xc8a3, 0x8bf8, 0xc8d0, 0xc8cf, 0xc6e4, 0xc6e5, 0xc8cd, 0xc8ce, 0xf9fe, 0x9c71, 0x9375, 0x9376, 0x9548, 0x8ec6, 0x8bc5, 0x8bfa, 0xc87c, 0x9ab4, 0x884e, 0x884b, 0xc87a, 0x8848, 0x8847, 0xa0f6, 0x8845, 0x8853, 0xfcad, 0x8aad, 0x9272, 0xfc47, 0x94df, 0x9fd1, 0xfbcb, 0x927d, 0x98a4, 0x94e7, 0x90cb, 0x927b, 0x94d8, 0xfc5f, 0xfa54, 0x9ab5, 0x96da, 0x9279, 0xfa74, 0x9275, 0x8dfb, 0x8a49, 0x92df, 0x9b7c, 0xfa63, 0xfa60, 0x926d, 0xfa62, 0x9ab6, 0x976b, 0xfd6a, 0xfd54, 0x9273, 0x97d8, 0x9fbb, 0x9342, 0x9276, 0xfa65, 0x926c, 0xfa6e, 0x9ee0, 0x92c0, 0x92bf, 0x92be, 0x9aba, 0x8ab3, 0x9775, 0xfa40, 0xfa76, 0xfbd0, 0xfa7b, 0xfe6d, 0x9bb3, 0x89cc, 0x9abe, 0xfa42, 0x92bc, 0x945c, 0x9bb5, 0x9abf, 0x98a7, 0x97a4, 0x90fd, 0xfc7b, 0x9ac0, 0x92c3, 0x8aaa, 0x9bd0, 0x9550, 0x92c6, 0x98a6, 0x9546, 0xfd63, 0xfac2, 0x9ec3, 0x89b2, 0x9c66, 0x9053, 0x97c1, 0x9ac4, 0x9ac5, 0x8eef, 0xfae9, 0x9262, 0x8af7, 0x9ac6, 0x92e1, 0x9ac9, 0xfac6, 0x97a5, 0x9acb, 0xfa72, 0x8a5e, 0x94e0, 0x92cc, 0x8ae5, 0xfe5c, 0x9acc, 0x9df9, 0x8a43, 0x8aa6, 0x9acd, 0x9ace, 0xfaee, 0x9bcc, 0x9acf, 0x9ad1, 0x9dfa, 0x9d7c, 0x9ad3, 0x97a6, 0x995f, 0xfbf6, 0x9fc5, 0x8a59, 0x8b6b, 0x9ad4, 0x9ad5, 0x97a2, 0x8a44, 0x9f4a, 0x90a1, 0xfda4, 0x8a64, 0x8af2, 0x8af8, 0x9dd8, 0x94d6, 0xfafe, 0xfba7, 0x9ad6, 0x9f4d, 0xfaf6, 0x8a57, 0x8b43, 0x8b44, 0x8ab6, 0x8ac0, 0x9e54, 0x9ad7, 0x9ad8, 0x9adc, 0x8aca, 0x9ea8, 0x9263, 0x9add, 0x8b65, 0x8b6f, 0x8b7e, 0x8f43, 0x92d0, 0x8af4, 0x9dbe, 0x9ae1, 0xfcde, 0x9dfd, 0x8b66, 0x8b70, 0x8b75, 0x8ae4, 0x8ba4, 0x8aed, 0x8a5d, 0x8b48, 0x9ded, 0x9e40, 0x8aef, 0x8af6, 0x9e76, 0x9ee3, 0x9ade, 0x8dfe, 0xfafc, 0x9cb1, 0x9e77, 0x8b64, 0x8b67, 0x974b, 0x9653, 0x9ae0, 0x8b4a, 0x8af1, 0x8ad7, 0xa0ab, 0x8ab5, 0x8a5f, 0x8aee, 0x9adf, 0x8afe, 0x8a58, 0x8ba3, 0x8ba7, 0x9ae3, 0x9261, 0x9dd7, 0x9e7d, 0x9ea7, 0x9eab, 0x9042, 0x8b79, 0x8b7a, 0x9ae6, 0x9ae5, 0x8a7e, 0x9e44, 0x9ae7, 0x8a7c, 0x8b71, 0x9ae9, 0x9aea, 0x9aeb, 0x8abd, 0xfb4e, 0x9aed, 0x8af9, 0x9e63, 0x8b49, 0x8ace, 0x8b6e, 0x8ae8, 0x9aee, 0x92ce, 0x8a5a, 0x8b7b, 0x8b7c, 0x9aef, 0x9af0, 0x8afa, 0x8941, 0x8b72, 0x8af3, 0x8ba8, 0x9eae, 0x9e72, 0xfb73, 0xfb5f, 0x90ba, 0x91fe, 0x9ef6, 0x97ed, 0x9af3, 0xa0ee, 0x967c, 0x9345, 0x986e, 0xfa56, 0x9af5, 0xfc4b, 0x9af4, 0xfede, 0xfcb7, 0x97f1, 0x97c7, 0x9ccb, 0x9240, 0x9ce8, 0x91fd, 0x974e, 0xfb68, 0x976c, 0x97e8, 0xfb6a, 0x8b74, 0x8ee7, 0xfdc8, 0x9241, 0x96a1, 0x8ef3, 0x9af7, 0x8fa6, 0xfad6, 0x9cc7, 0xfad7, 0x9af8, 0xfba1, 0x8ec5, 0xfba4, 0xfbc2, 0x9ac1, 0x91fa, 0xfedb, 0x97ab, 0x9147, 0xfbb1, 0x8fea, 0x94d2, 0xfe61, 0xface, 0x92ed, 0x91f3, 0x93c6, 0x935a, 0xfafb, 0x92ef, 0xfac8, 0x9847, 0x9366, 0x9855, 0x96e6, 0x9f43, 0x9faa, 0x94da, 0x92ee, 0xfcaf, 0xfbfb, 0x8ef9, 0x91f6, 0x9364, 0x94f5, 0x9cb6, 0xfbad, 0x984e, 0x8f44, 0x96fd, 0x9af9, 0x9afa, 0x9769, 0x95d4, 0x984b, 0xfbaa, 0x987c, 0x91ea, 0x9daf, 0x9dc5, 0x91f1, 0x8eb1, 0x97a9, 0xfbac, 0xfcb8, 0x9cb9, 0xfbb0, 0xfcd2, 0x93cb, 0x9afd, 0x91f4, 0x8bac, 0xa055, 0x9574, 0x95be, 0x97ad, 0x8ee9, 0x92f8, 0x97be, 0x916c, 0x94aa, 0xfc63, 0x9dc6, 0x97b5, 0x92b8, 0x91ef, 0xfea6, 0x9760, 0x9358, 0x9576, 0x8fac, 0x91ec, 0x97b4, 0x91f7, 0x974a, 0xfb49, 0x9578, 0x93bc, 0x91d6, 0x9355, 0x9356, 0x9851, 0x8ff8, 0xfbc0, 0x93f2, 0x90d0, 0x9c44, 0x9255, 0x9363, 0x91a5, 0xa0ed, 0xfd6b, 0x9afe, 0x9351, 0xfa78, 0xfea8, 0x9350, 0xfa4c, 0x92f7, 0x9b40, 0xfbce, 0x9b41, 0xfead, 0xfbd5, 0x8bc2, 0x9a7c, 0x9b42, 0x9b43, 0x9e79, 0xfbd9, 0x9b44, 0xa0a7, 0x9bf3, 0x935e, 0x89cb, 0x9f53, 0x93d7, 0xfbe1, 0xfed0, 0xfbe2, 0xfce3, 0x9074, 0xfbe6, 0x9bb7, 0x9b45, 0x9b47, 0x9f50, 0x9b48, 0xfc5b, 0x98a9, 0x9cfd, 0x884c, 0x9b4b, 0xfbec, 0x9ba8, 0x8ad5, 0xfa73, 0xfd59, 0x91a2, 0xfbed, 0x9ca9, 0x8aa8, 0x9bc3, 0x8ae1, 0x9b4e, 0x95d0, 0x905f, 0x97ee, 0xfc4e, 0x9b4f, 0x9b50, 0x9ec6, 0xfc50, 0xfd73, 0xfda7, 0x9da2, 0xfa58, 0xfa5e, 0xa059, 0xfa75, 0xfbbe, 0x9ca2, 0x9370, 0x9371, 0x9377, 0xfeef, 0x936d, 0xfc5d, 0x90b8, 0x8afc, 0xfb41, 0x9e6b, 0x94e3, 0x8ee2, 0x8ed7, 0x9c4d, 0x96a3, 0x9b51, 0x8ac3, 0x96aa, 0xfc68, 0x8b6d, 0xfd67, 0x8ae9, 0xfca1, 0x936c, 0x9b52, 0xfe70, 0xfca8, 0xfce9, 0x9cb4, 0x8aea, 0x9b53, 0x9b55, 0x96ab, 0xfca7, 0x9b56, 0x8abc, 0x8acb, 0x9b57, 0x89cd, 0x9b59, 0x9b5b, 0x93a5, 0x9b5d, 0x9e4f, 0x93a3, 0x8a7b, 0x8b42, 0x9750, 0x8fb3, 0x8a50, 0x9b60, 0x8b45, 0x8b46, 0x9dfe, 0x9b62, 0x937b, 0x93b1, 0x8a60, 0x8ad8, 0x9b63, 0x8a69, 0x8a47, 0x8acc, 0x937c, 0x9b65, 0x9b66, 0x8a72, 0x8a7a, 0x93af, 0x8ab0, 0x9b68, 0x9ea3, 0xfaec, 0x8b77, 0x9b67, 0x8b59, 0xfcb1, 0xfcbb, 0x9b69, 0x93a8, 0x8ae0, 0x9e51, 0x8f5f, 0x9b6a, 0x9b6b, 0x97ec, 0x9b6c, 0xfe4e, 0xfdc2, 0x9b6d, 0x9167, 0xfccc, 0x93b6, 0x90e4, 0x90e5, 0x9ef2, 0x93ca, 0x8bbc, 0x8f46, 0x93cf, 0xfcdb, 0xfcdc, 0x93c0, 0xfce6, 0x96e7, 0xfcd8, 0xfcd9, 0xfda6, 0x93ce, 0x95f1, 0x9ce9, 0xfce4, 0x94af, 0xfa77, 0x93cc, 0x905a, 0x93bf, 0xfb51, 0x93b9, 0xfed7, 0x93b7, 0x93d9, 0x93bb, 0x93da, 0x98a3, 0x90d1, 0x9b6e, 0xfa70, 0x9beb, 0x9b6f, 0xfcfc, 0x8b40, 0xa07b, 0x97f7, 0x93e2, 0xfcd6, 0x9559, 0x93a6, 0xfd40, 0x935f, 0x97f2, 0x9c76, 0x8ef8, 0x8f47, 0x9b74, 0x92b4, 0x91ed, 0x96d2, 0xfd46, 0x8f4f, 0x9549, 0x9b75, 0xfa5c, 0x9b79, 0xfd4b, 0x96d3, 0xfd58, 0x945f, 0xa0f5, 0x9243, 0x97fa, 0x9dd9, 0x97f4, 0x924d, 0xfd5b, 0x9b7a, 0x9ed5, 0xfaae, 0x9cc9, 0x9258, 0x8ec8, 0x94b4, 0x93e1, 0x93df, 0xfcf0, 0x93ec, 0x97f6, 0x96cf, 0x93de, 0x8acf, 0x9ba2, 0xfd69, 0x9352, 0x98a2, 0xfd6e, 0xfa7c, 0x93fa, 0x907c, 0x8f67, 0x9db7, 0xa0e9, 0xfa4e, 0xfda1, 0x9e74, 0x9fbf, 0x9ecb, 0x9bb9, 0x9dd4, 0x97b9, 0x8ef1, 0x957b, 0x9ed2, 0x9753, 0x96a4, 0x8fbe, 0x94d9, 0x9058, 0xfd79, 0xfd7b, 0x8eda, 0x8efa, 0x9ba5, 0x9ed9, 0x97d4, 0x90bb, 0xfdbc, 0xfdc6, 0x9248, 0x92b5, 0x9dc1, 0x92b9, 0x92a6, 0x8f4b, 0x9ba6, 0x92b6, 0x8e40, 0x9ed8, 0x945e, 0x985f, 0x94ce, 0x924a, 0xfd70, 0x9467, 0x8dec, 0x9bd8, 0x9448, 0xfac1, 0x9cf7, 0xfdbe, 0x8fda, 0xfdd9, 0xfc7e, 0x93f9, 0xfa43, 0xfaeb, 0xfac3, 0x97d3, 0x95f9, 0x9c48, 0xfdd8, 0xa0d8, 0xfdd7, 0xfb4a, 0x9baf, 0x944b, 0xfdc9, 0x8eac, 0xfdb2, 0x925a, 0xfcbd, 0x92d9, 0xfdd5, 0x92dd, 0x9259, 0x96ba, 0x925b, 0x9bab, 0xfdda, 0xfdde, 0xfdd3, 0xfdd6, 0xfddc, 0xfddd, 0x90fe, 0xfea1, 0x8bad, 0x9cd8, 0x9e6d, 0xfd7c, 0xfb61, 0x96f8, 0x96f0, 0xfcf4, 0xfe60, 0x9852, 0x964f, 0x916e, 0x986d, 0x9864, 0x9453, 0xfdec, 0xfb78, 0x95ba, 0x985d, 0x92f9, 0x985a, 0xfdf6, 0x93d0, 0x9862, 0x9bad, 0x974f, 0x9bae, 0x9452, 0x9bb0, 0x91d2, 0x97ea, 0xfb6b, 0x91b1, 0xfdf3, 0x92cb, 0x9bb1, 0xfcec, 0x986b, 0x9751, 0x9871, 0x95ef, 0x9ef3, 0x91e8, 0x9bba, 0xfb4c, 0x926a, 0xfdf8, 0x9861, 0x91e7, 0x93ed, 0x9744, 0x91e1, 0xfbf5, 0x9869, 0x8a62, 0x9bbb, 0x9c55, 0x8e77, 0x8ab2, 0x9ebc, 0x93e6, 0x93a2, 0x9bbd, 0x94b3, 0x937d, 0x9e66, 0x9459, 0x9bbf, 0x9458, 0x9ea5, 0x9bc7, 0xfe54, 0x8e74, 0x8bd6, 0x94b6, 0xfd74, 0x98c0, 0x94a5, 0x9bc8, 0x95ed, 0xfd7e, 0xfbeb, 0xfd7d, 0x976f, 0x9461, 0x9fc1, 0x95d7, 0xfa52, 0x9c58, 0x9f68, 0x9be7, 0xfcce, 0x96e8, 0xfa49, 0x97a1, 0x954d, 0x9ef8, 0xfe49, 0x91ce, 0x9771, 0xfdb1, 0xfc6e, 0x9cf2, 0x93b8, 0x9043, 0x9759, 0x94d7, 0xfe66, 0x947d, 0xfc6f, 0x9246, 0xfa6d, 0x8ef7, 0xfbb7, 0x947c, 0x92cd, 0x97b2, 0xfe65, 0x967e, 0x9758, 0x9b77, 0x91cf, 0x94a4, 0x9cad, 0x8bab, 0x96d5, 0xfcb3, 0x93ae, 0x976d, 0x9446, 0x95f7, 0x9c46, 0x955b, 0x91d1, 0x94f4, 0xfe67, 0x92a5, 0xfedf, 0x9bc9, 0xfced, 0xfdfa, 0xfcc8, 0xfe62, 0x91fc, 0xfe6b, 0xfdf9, 0xfcc7, 0x914e, 0x9cb8, 0x9767, 0x95ee, 0x9bb2, 0x9460, 0x94a2, 0x9875, 0x97ac, 0x91d3, 0x987b, 0x8eeb, 0x976a, 0x965e, 0x97eb, 0x9ff9, 0x95f8, 0xfea2, 0x8fe6, 0xfe7e, 0x9da4, 0x9768, 0x8eec, 0x94bd, 0x945b, 0x9cf6, 0xfaa7, 0x9bd9, 0xfa5d, 0x9656, 0x9762, 0x94ba, 0xa04f, 0x92d8, 0x9bcb, 0x94bb, 0x9d5f, 0x90cf, 0x9465, 0x9f4c, 0x90d8, 0x9ebe, 0xfb6d, 0x95ca, 0x9dc2, 0x97f8, 0x8ffc, 0x9473, 0x9474, 0xfeb7, 0x8a4b, 0x8a55, 0x8b69, 0x8adc, 0x8b76, 0x9bce, 0x8a68, 0xa0f8, 0x98df, 0xfeb5, 0x9bcf, 0x96fb, 0x9bfb, 0x9ece, 0x8ee5, 0x9e7b, 0x9bd2, 0x8aa5, 0xfece, 0x8a45, 0x9dfc, 0xfecf, 0x8ba5, 0x8aec, 0xfce0, 0x94ad, 0xfed5, 0x94ac, 0xfc5a, 0x9bd6, 0x8a6f, 0x8ba9, 0x8e5f, 0x9dcb, 0xfce7, 0x9bd7, 0x93c8, 0x91f0, 0x8fe0, 0x9bdb, 0x90ed, 0x9bdc, 0xa0ec, 0x98fa, 0x9be0, 0x93c7, 0x9249, 0x96e1, 0x9be2, 0x9be4, 0x8fe1, 0x9be5, 0x94c0, 0x93c3, 0x93c5, 0x9079, 0x977b, 0x907e, 0xfee6, 0xfe46, 0x9db8, 0x9270, 0x95a8, 0x94c8, 0x98b9, 0x9140, 0xfcbe, 0x9157, 0x8bb2, 0xfadf, 0x9be6, 0x9643, 0x8e44, 0x9c4f, 0xfef4, 0x9be8, 0x93dc, 0x966f, 0x8e4a, 0x9bed, 0x92f6, 0x9db9, 0x8e4e, 0xfbcf, 0x9ec2, 0x94e5, 0x9bf0, 0x94e4, 0x9551, 0x8bbb, 0x9bf1, 0x94f0, 0x8e64, 0x94ea, 0x8f61, 0x9b64, 0x8e5b, 0x9bf2, 0x9fbe, 0x9dc9, 0x8e6c, 0x8f73, 0x8f75, 0x8e71, 0x8e60, 0x8e6a, 0x9552, 0x9554, 0x8ad4, 0x9dbb, 0x9543, 0x92fe, 0x94f2, 0x94f1, 0xa0ea, 0x9dd2, 0xa0b1, 0x91f8, 0x9462, 0x9ba4, 0x8ead, 0x9ead, 0x96d0, 0xfeee, 0x8ab4, 0x9757, 0x8a77, 0x9bf7, 0x8eb5, 0xa06d, 0x8eb6, 0x9756, 0x9540, 0xa0f3, 0x94be, 0x9bfa, 0xfddf, 0x9dbc, 0x94fe, 0x8bdb, 0xa0fe, 0x8ec0, 0x9f47, 0x8bde, 0xa0fb, 0x8ec3, 0x9649, 0xfec2, 0x954c, 0x9bfd, 0x90cc, 0x9c60, 0x954b, 0x9bfe, 0x9c70, 0x9c43, 0x9c47, 0x8ecc, 0x8e54, 0x8ee4, 0x9c49, 0x8b5e, 0x955e, 0x955c, 0x9c4b, 0x8be1, 0x8ed9, 0x9db4, 0x925f, 0x9c4c, 0x8aa1, 0x8edb, 0x9c56, 0x8aa2, 0x9754, 0x9c5e, 0x9ed4, 0x9568, 0xa0c3, 0x8ae6, 0xa0f7, 0x9c61, 0x9c5f, 0xfc4d, 0x9e5b, 0x9e69, 0x9c63, 0xfec7, 0xfec6, 0x9c67, 0x9c69, 0x8be2, 0x9165, 0x9ce7, 0x8a54, 0x9c6c, 0x9c6e, 0xfe5d, 0x9c73, 0x956a, 0x956d, 0x8ef0, 0x8f4d, 0x8ef6, 0xfabc, 0xfbda, 0x8b4c, 0xfd75, 0x9bdd, 0xfaf5, 0x9c74, 0x9545, 0x96c6, 0x8f6a, 0x8f4e, 0x9c78, 0xfa55, 0x97e4, 0x9c41, 0x925c, 0x96fa, 0xfb66, 0x8e65, 0x9849, 0xfba8, 0x9842, 0x9c7a, 0x97fb, 0x90ca, 0x9c5b, 0x974d, 0x8ed3, 0x9561, 0x9f4b, 0x9fb5, 0x93d2, 0xfdaa, 0x9840, 0x9146, 0x9867, 0xfa5a, 0xfba9, 0x9841, 0xfcfd, 0xfdab, 0x91bd, 0x8f4c, 0x96c9, 0x8f55, 0xfbae, 0x956f, 0x9c7d, 0xa0f0, 0x946f, 0xfdac, 0x96cb, 0x96ce, 0xa056, 0x9ce1, 0x96c4, 0x8f5e, 0x8f6c, 0x8ea3, 0xfbb3, 0xfc53, 0xfdb3, 0x8f6b, 0x96ca, 0x8f79, 0x9e6f, 0xa0c5, 0xfc78, 0x8e42, 0x8f5a, 0x90c2, 0x8ea5, 0x9061, 0x924f, 0x9373, 0xfdb5, 0xfecc, 0xfbbd, 0x9843, 0x96c5, 0x89bc, 0x9ca3, 0x924b, 0x984a, 0x8fa4, 0xa0f1, 0x9efb, 0x9cd2, 0x8fa7, 0xfc5c, 0x9845, 0x9046, 0xfefa, 0x9560, 0x9f48, 0x9247, 0x90fb, 0x9ca4, 0x9571, 0x9ca6, 0x9ca7, 0x9caa, 0x9ed3, 0x9e70, 0x9cac, 0x8fae, 0x957d, 0x9cb0, 0x97b6, 0xa0bd, 0x8adf, 0x9eaa, 0x8fbd, 0x8fbf, 0x9369, 0x9ba7, 0xc8a4, 0xfeea, 0x9be1, 0x8b41, 0x9db6, 0xa0eb, 0x9ba3, 0x8ba1, 0x8fc8, 0x894c, 0x9860, 0x94c7, 0x8b58, 0x95ab, 0x95aa, 0x9cc3, 0x9cc4, 0x93d6, 0x9dac, 0x8be6, 0x8a71, 0x8fd1, 0x99d5, 0x90f4, 0x8aa3, 0x9cce, 0x9cd4, 0x9cd5, 0xfbc8, 0x9db3, 0xfc70, 0x8fd7, 0x9b73, 0xfa5b, 0x8fd2, 0x9064, 0x98b6, 0x9668, 0x9cd6, 0x98bd, 0x8fdc, 0xfef6, 0x8fd9, 0x9541, 0x97f3, 0x9bf8, 0x9e6c, 0x8ff2, 0x8fee, 0x9cd7, 0x9e6e, 0x8a40, 0x8fef, 0x8ff4, 0x8ff5, 0x95c2, 0x986a, 0x97cf, 0x9ee5, 0x9e7c, 0x9041, 0x9cdb, 0x9441, 0x9ce6, 0x9db0, 0x9cea, 0x9ced, 0x9cfa, 0x8b62, 0x8a4e, 0x9cca, 0x8a66, 0x9cfb, 0x9cfc, 0x9cfe, 0x8a53, 0x9ce5, 0x9d40, 0x9d41, 0x9045, 0x8b73, 0x97ca, 0x9d42, 0x8a61, 0x8bae, 0x8ad2, 0x8ba2, 0x9df2, 0x9d43, 0x9cdf, 0x9d44, 0x8eca, 0x904e, 0x8eb3, 0x9ff5, 0x9d45, 0x904f, 0x9d47, 0x89ca, 0x9cb5, 0xfbfe, 0x905e, 0x9063, 0x9057, 0x9066, 0x9bc0, 0xfce5, 0x9162, 0x9067, 0x8fa1, 0x8fa2, 0x9d48, 0xfad3, 0x905d, 0x90b9, 0x906b, 0x9069, 0xfe57, 0xfe55, 0x9073, 0x9bef, 0x9cf0, 0x9d4b, 0xfed9, 0xfeda, 0x91e0, 0x91d8, 0x9646, 0x9360, 0xfa53, 0x9cd3, 0x9d4e, 0xfb40, 0x8de2, 0x9442, 0x9056, 0x9865, 0xfa4a, 0x9d50, 0x9d52, 0x95af, 0x975a, 0x9349, 0x9747, 0xa0f4, 0x9778, 0x8fcf, 0xfc60, 0xfc56, 0x91dc, 0x9661, 0x92ec, 0x935d, 0x8ede, 0x96fe, 0xfd4f, 0x95de, 0x98b0, 0xa040, 0x97bd, 0x977d, 0x97f5, 0x9bac, 0xfada, 0x92c2, 0x97b1, 0x907b, 0x93fe, 0x947b, 0x9777, 0xfabe, 0xfd43, 0x90c6, 0x90a4, 0x90a8, 0x94a9, 0x90a9, 0x95e0, 0x907d, 0x9265, 0xfdba, 0x93c4, 0xfeed, 0x9dab, 0xa0e3, 0x9648, 0x9d53, 0x8aa9, 0x9bc5, 0x965d, 0x975f, 0x965f, 0x966e, 0xfb5d, 0x9db1, 0xfea3, 0x9db2, 0x95ae, 0xfca3, 0xa0a2, 0x9655, 0x9d54, 0x9341, 0x95ad, 0x91d5, 0x977a, 0xfdfc, 0x8e47, 0x93fd, 0x90a5, 0x90ac, 0x95ac, 0x90ae, 0xfea5, 0x9d56, 0x97e3, 0x95e2, 0x9466, 0x9647, 0x91b8, 0x9cec, 0x90ad, 0x95e3, 0x8b4f, 0x8ae3, 0x8b4d, 0x95ea, 0x8b4e, 0x8bed, 0x91d9, 0xa0a4, 0x95f5, 0x95f4, 0x9fb3, 0xfeaf, 0xfe72, 0x927a, 0xfeac, 0x95f3, 0x9d58, 0x9372, 0x91c5, 0x9642, 0x90cd, 0x95fe, 0x9159, 0x9c65, 0x97cc, 0x90ce, 0x9d59, 0xfcf5, 0xfefd, 0x9d5b, 0x9d5c, 0x937e, 0x98ac, 0x9d5e, 0xfdd0, 0xfd60, 0x9ccf, 0x90dd, 0x90e0, 0x90f3, 0x98b1, 0x90f0, 0x93bd, 0x95b7, 0x9f46, 0x8e4b, 0x9658, 0x8a4c, 0x9d63, 0x9ecf, 0x9d65, 0x9d66, 0x965a, 0x9d64, 0x8a6c, 0x8ad9, 0x9d67, 0x8a70, 0x8bf3, 0x9150, 0x9cc1, 0x9d68, 0x93a7, 0x9674, 0xa0ef, 0x9151, 0x96c1, 0x9676, 0x9d69, 0xfca4, 0x9d6a, 0x924e, 0x9d6b, 0x9bc1, 0x9d6c, 0x8a65, 0x915d, 0x9d6d, 0x915a, 0x9cc0, 0x916a, 0x9d6e, 0x9ea6, 0x9dcd, 0x9d6f, 0x89bb, 0x9ef9, 0x96b4, 0x9172, 0x9ec8, 0x8b55, 0x9d71, 0x9d72, 0x9ecc, 0x9174, 0x9ed0, 0x905c, 0x8ed2, 0x91a8, 0x9177, 0x96bf, 0x96c0, 0x8fb1, 0x96b7, 0x9178, 0x89be, 0x917c, 0xfb77, 0x9175, 0x91a3, 0x9176, 0x96be, 0x9179, 0x96b6, 0x91a4, 0x91a6, 0x9d75, 0x9052, 0xa045, 0x91a9, 0x98aa, 0x8baa, 0x9cdd, 0x9d77, 0x8940, 0x9eec, 0x93aa, 0x9478, 0x9d7a, 0x8ac9, 0x8b4b, 0x9fec, 0x8ae2, 0x9e75, 0x9874, 0x9ac8, 0xa047, 0x8bc3, 0xfc48, 0xfc77, 0x9c52, 0x8efd, 0x8fa8, 0x957a, 0x8ff0, }; static const Summary16 hkscs1999_uni2indx_page00[45] = { /* 0x0000 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0100 }, { 1, 0x0000 }, { 1, 0x0703 }, { 6, 0x000c }, { 8, 0x3703 }, { 15, 0x170c }, /* 0x0100 */ { 21, 0x0003 }, { 23, 0x0c0c }, { 27, 0x0800 }, { 28, 0x0000 }, { 28, 0x3800 }, { 31, 0x0008 }, { 32, 0x0800 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x6000 }, { 35, 0x1557 }, { 43, 0x0000 }, { 43, 0x0000 }, /* 0x0200 */ { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0813 }, { 47, 0x0402 }, { 49, 0x0020 }, { 50, 0x0408 }, { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0040 }, }; static const Summary16 hkscs1999_uni2indx_page04[6] = { /* 0x0400 */ { 53, 0x0002 }, { 54, 0xffff }, { 70, 0xffff }, { 86, 0xffff }, { 102, 0xffff }, { 118, 0x0002 }, }; static const Summary16 hkscs1999_uni2indx_page1e[13] = { /* 0x1e00 */ { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0xc000 }, { 121, 0x0003 }, }; static const Summary16 hkscs1999_uni2indx_page21[15] = { /* 0x2100 */ { 123, 0x0000 }, { 123, 0x0040 }, { 124, 0x0002 }, { 125, 0x0000 }, { 125, 0x0000 }, { 125, 0x0000 }, { 125, 0x0000 }, { 125, 0x03ff }, { 135, 0x0000 }, { 135, 0x0000 }, { 135, 0x0000 }, { 135, 0x0300 }, { 137, 0x0000 }, { 137, 0x0000 }, { 137, 0x0080 }, }; static const Summary16 hkscs1999_uni2indx_page23[40] = { /* 0x2300 */ { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0000 }, { 138, 0x0c00 }, { 140, 0x0000 }, { 140, 0x0000 }, /* 0x2400 */ { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x03ff }, { 150, 0x3ff0 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, /* 0x2500 */ { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0xffff }, { 176, 0xffff }, { 192, 0x0001 }, }; static const Summary16 hkscs1999_uni2indx_page27[4] = { /* 0x2700 */ { 193, 0x0000 }, { 193, 0x0000 }, { 193, 0x0000 }, { 193, 0x2000 }, }; static const Summary16 hkscs1999_uni2indx_page2e[68] = { /* 0x2e00 */ { 194, 0x0000 }, { 194, 0x0000 }, { 194, 0x0000 }, { 194, 0x0000 }, { 194, 0x0000 }, { 194, 0x0000 }, { 194, 0x0000 }, { 194, 0x0000 }, { 194, 0x35d1 }, { 202, 0x3020 }, { 205, 0x54a0 }, { 210, 0x5040 }, { 213, 0xb440 }, { 218, 0x40c0 }, { 221, 0x0008 }, { 222, 0x0000 }, /* 0x2f00 */ { 222, 0x0000 }, { 222, 0x0000 }, { 222, 0x0000 }, { 222, 0x0008 }, { 223, 0x0000 }, { 223, 0x0000 }, { 223, 0x0000 }, { 223, 0x0000 }, { 223, 0x0000 }, { 223, 0x0000 }, { 223, 0x0000 }, { 223, 0x0000 }, { 223, 0x0000 }, { 223, 0x0000 }, { 223, 0x0000 }, { 223, 0x0000 }, /* 0x3000 */ { 223, 0x00e0 }, { 226, 0x0000 }, { 226, 0x0000 }, { 226, 0x0000 }, { 226, 0xfffe }, { 241, 0xffff }, { 257, 0xffff }, { 273, 0xffff }, { 289, 0xffff }, { 305, 0x780f }, { 313, 0xfffe }, { 328, 0xffff }, { 344, 0xffff }, { 360, 0xffff }, { 376, 0xffff }, { 392, 0x707f }, /* 0x3100 */ { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0x0000 }, { 402, 0xffff }, { 418, 0x0000 }, { 418, 0x0000 }, { 418, 0x0000 }, /* 0x3200 */ { 418, 0x0000 }, { 418, 0x0000 }, { 418, 0x0000 }, { 418, 0x0002 }, }; static const Summary16 hkscs1999_uni2indx_page34[1724] = { /* 0x3400 */ { 419, 0x0000 }, { 419, 0x0000 }, { 419, 0x0000 }, { 419, 0x0020 }, { 420, 0x1001 }, { 422, 0x0000 }, { 422, 0x0010 }, { 423, 0x6408 }, { 427, 0x0000 }, { 427, 0x0048 }, { 429, 0x8020 }, { 431, 0x1000 }, { 432, 0x0102 }, { 434, 0x8000 }, { 435, 0x0010 }, { 436, 0x0800 }, /* 0x3500 */ { 437, 0x0040 }, { 438, 0x0000 }, { 438, 0x0000 }, { 438, 0x4000 }, { 439, 0x0000 }, { 439, 0x000a }, { 441, 0x2002 }, { 443, 0x0185 }, { 447, 0x0010 }, { 448, 0x0180 }, { 450, 0x2022 }, { 453, 0x8000 }, { 454, 0x44a2 }, { 459, 0x2844 }, { 463, 0x0000 }, { 463, 0x480e }, /* 0x3600 */ { 468, 0x0200 }, { 469, 0x0500 }, { 471, 0x2008 }, { 473, 0x4220 }, { 476, 0x4380 }, { 480, 0x8000 }, { 481, 0x0000 }, { 481, 0x0400 }, { 482, 0x0002 }, { 483, 0x0400 }, { 484, 0x1420 }, { 487, 0x1223 }, { 492, 0x01ba }, { 498, 0x2058 }, { 502, 0x0066 }, { 506, 0x0020 }, /* 0x3700 */ { 507, 0x250a }, { 512, 0x1000 }, { 513, 0x302c }, { 518, 0x040d }, { 522, 0x0009 }, { 524, 0x0000 }, { 524, 0x8004 }, { 526, 0x0000 }, { 526, 0x0000 }, { 526, 0x0080 }, { 527, 0x0001 }, { 528, 0x4200 }, { 530, 0x0000 }, { 530, 0x0000 }, { 530, 0x0000 }, { 530, 0x0904 }, /* 0x3800 */ { 533, 0x8000 }, { 534, 0x0200 }, { 535, 0x2001 }, { 537, 0x0140 }, { 539, 0x0000 }, { 539, 0x0000 }, { 539, 0x0008 }, { 540, 0x0000 }, { 540, 0x0000 }, { 540, 0x0000 }, { 540, 0x0001 }, { 541, 0x0000 }, { 541, 0x1008 }, { 543, 0x0002 }, { 544, 0x0000 }, { 544, 0x0400 }, /* 0x3900 */ { 545, 0x0100 }, { 546, 0x0010 }, { 547, 0x0080 }, { 548, 0x8004 }, { 550, 0x2000 }, { 551, 0x0000 }, { 551, 0x0008 }, { 552, 0x0000 }, { 552, 0x0601 }, { 555, 0x0a04 }, { 558, 0x0012 }, { 560, 0x0100 }, { 561, 0x0000 }, { 561, 0x1000 }, { 562, 0x1024 }, { 565, 0x4900 }, /* 0x3a00 */ { 568, 0x004a }, { 571, 0x0180 }, { 573, 0x0600 }, { 575, 0x0010 }, { 576, 0x0800 }, { 577, 0x5084 }, { 581, 0x00c0 }, { 583, 0x0000 }, { 583, 0x0000 }, { 583, 0x0080 }, { 584, 0x0800 }, { 585, 0x2000 }, { 586, 0x0000 }, { 586, 0x4000 }, { 587, 0x0001 }, { 588, 0x0805 }, /* 0x3b00 */ { 591, 0x4000 }, { 592, 0x0200 }, { 593, 0x0804 }, { 595, 0x0200 }, { 596, 0x0004 }, { 597, 0x0100 }, { 598, 0x0001 }, { 599, 0x1806 }, { 603, 0x0001 }, { 604, 0x0240 }, { 606, 0x0002 }, { 607, 0x5000 }, { 609, 0x0014 }, { 611, 0x2080 }, { 613, 0x1000 }, { 614, 0x001c }, /* 0x3c00 */ { 617, 0x2000 }, { 618, 0x0122 }, { 621, 0x0000 }, { 621, 0x0000 }, { 621, 0x0000 }, { 621, 0x0010 }, { 622, 0x0000 }, { 622, 0x0000 }, { 622, 0x0000 }, { 622, 0x0000 }, { 622, 0x0000 }, { 622, 0x0000 }, { 622, 0x2800 }, { 624, 0x1042 }, { 627, 0x8800 }, { 629, 0x0000 }, /* 0x3d00 */ { 629, 0x0000 }, { 629, 0x2008 }, { 631, 0x0000 }, { 631, 0x0804 }, { 633, 0x5040 }, { 636, 0x8002 }, { 638, 0x8604 }, { 642, 0x2020 }, { 644, 0x8420 }, { 647, 0x0002 }, { 648, 0x2020 }, { 650, 0x8010 }, { 652, 0x30c0 }, { 656, 0x0808 }, { 658, 0x0980 }, { 661, 0x3088 }, /* 0x3e00 */ { 665, 0x0040 }, { 666, 0x0000 }, { 666, 0x0000 }, { 666, 0x0000 }, { 666, 0x0109 }, { 669, 0x0020 }, { 670, 0x0000 }, { 670, 0x0010 }, { 671, 0x0000 }, { 671, 0x0000 }, { 671, 0x2700 }, { 675, 0x8102 }, { 678, 0x1484 }, { 682, 0x44c3 }, { 688, 0x0a86 }, { 693, 0x9419 }, /* 0x3f00 */ { 699, 0x4051 }, { 703, 0x0000 }, { 703, 0x0000 }, { 703, 0x0000 }, { 703, 0x0000 }, { 703, 0x0308 }, { 706, 0x0008 }, { 707, 0x1000 }, { 708, 0x0000 }, { 708, 0x0008 }, { 709, 0x0000 }, { 709, 0x0000 }, { 709, 0x0001 }, { 710, 0x1080 }, { 712, 0x2020 }, { 714, 0x0600 }, /* 0x4000 */ { 716, 0x0010 }, { 717, 0x2000 }, { 718, 0x0000 }, { 718, 0x0200 }, { 719, 0x0020 }, { 720, 0x0088 }, { 722, 0x8424 }, { 726, 0x0000 }, { 726, 0x0000 }, { 726, 0x0000 }, { 726, 0x0100 }, { 727, 0x8800 }, { 729, 0x0100 }, { 730, 0x8100 }, { 732, 0x0000 }, { 732, 0x0400 }, /* 0x4100 */ { 733, 0x4218 }, { 737, 0x0000 }, { 737, 0x0000 }, { 737, 0x0004 }, { 738, 0x0000 }, { 738, 0x0000 }, { 738, 0x5080 }, { 741, 0x8000 }, { 742, 0x0000 }, { 742, 0x0001 }, { 743, 0x0000 }, { 743, 0x0004 }, { 744, 0x8410 }, { 747, 0x0800 }, { 748, 0x8000 }, { 749, 0x0200 }, /* 0x4200 */ { 750, 0x0000 }, { 750, 0x0002 }, { 751, 0x0000 }, { 751, 0x0000 }, { 751, 0x0001 }, { 752, 0x0000 }, { 752, 0x0401 }, { 754, 0x0400 }, { 755, 0x1000 }, { 756, 0x0010 }, { 757, 0x0000 }, { 757, 0x1220 }, { 760, 0x0000 }, { 760, 0x0000 }, { 760, 0x0000 }, { 760, 0x1810 }, /* 0x4300 */ { 763, 0x0000 }, { 763, 0x0000 }, { 763, 0x0800 }, { 764, 0x0000 }, { 764, 0x0000 }, { 764, 0x0000 }, { 764, 0x4000 }, { 765, 0x0000 }, { 765, 0x0000 }, { 765, 0x0080 }, { 766, 0x0000 }, { 766, 0x0400 }, { 767, 0x0002 }, { 768, 0x8200 }, { 770, 0x2000 }, { 771, 0x0004 }, /* 0x4400 */ { 772, 0x0006 }, { 774, 0x0008 }, { 775, 0x2020 }, { 777, 0x0000 }, { 777, 0x0000 }, { 777, 0x0000 }, { 777, 0x0000 }, { 777, 0x0400 }, { 778, 0x8000 }, { 779, 0x8002 }, { 781, 0x0005 }, { 783, 0x0081 }, { 785, 0x4021 }, { 788, 0xa000 }, { 790, 0x1e10 }, { 795, 0x0010 }, /* 0x4500 */ { 796, 0x0a18 }, { 800, 0x2040 }, { 802, 0x4080 }, { 804, 0xa808 }, { 808, 0x0008 }, { 809, 0x1026 }, { 813, 0x0404 }, { 815, 0x0080 }, { 816, 0x0020 }, { 817, 0x0000 }, { 817, 0x0000 }, { 817, 0x0000 }, { 817, 0x0000 }, { 817, 0x0000 }, { 817, 0x0200 }, { 818, 0x0000 }, /* 0x4600 */ { 818, 0x8040 }, { 820, 0x00a0 }, { 822, 0x0000 }, { 822, 0x0000 }, { 822, 0x0000 }, { 822, 0x0800 }, { 823, 0x0000 }, { 823, 0x0400 }, { 824, 0x0001 }, { 825, 0x0000 }, { 825, 0x0000 }, { 825, 0x0000 }, { 825, 0x8000 }, { 826, 0x0001 }, { 827, 0x0000 }, { 827, 0x0020 }, /* 0x4700 */ { 828, 0x0000 }, { 828, 0x0108 }, { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x4000 }, { 831, 0x0000 }, { 831, 0x0000 }, { 831, 0x1000 }, { 832, 0x0000 }, { 832, 0x0100 }, { 833, 0x0040 }, { 834, 0x0000 }, { 834, 0x0000 }, { 834, 0x0020 }, { 835, 0x2000 }, { 836, 0x0010 }, /* 0x4800 */ { 837, 0x0801 }, { 839, 0x0000 }, { 839, 0x0000 }, { 839, 0x0080 }, { 840, 0x0000 }, { 840, 0x2000 }, { 841, 0x0000 }, { 841, 0x0002 }, { 842, 0x0000 }, { 842, 0x0800 }, { 843, 0x6000 }, { 845, 0x0000 }, { 845, 0x0000 }, { 845, 0x2001 }, { 847, 0x2000 }, { 848, 0x0408 }, /* 0x4900 */ { 850, 0x0040 }, { 851, 0x4002 }, { 853, 0x2420 }, { 856, 0x5020 }, { 859, 0x0020 }, { 860, 0x000a }, { 862, 0x0420 }, { 864, 0x0004 }, { 865, 0x0200 }, { 866, 0x0000 }, { 866, 0x0082 }, { 868, 0x0000 }, { 868, 0x0000 }, { 868, 0x8000 }, { 869, 0x00a0 }, { 871, 0x0000 }, /* 0x4a00 */ { 871, 0x8000 }, { 872, 0x2000 }, { 873, 0x0010 }, { 874, 0x0020 }, { 875, 0x0000 }, { 875, 0x0000 }, { 875, 0x0000 }, { 875, 0x0000 }, { 875, 0x0000 }, { 875, 0x0040 }, { 876, 0x0000 }, { 876, 0x0110 }, { 878, 0x0000 }, { 878, 0x0002 }, { 879, 0x0010 }, { 880, 0x8000 }, /* 0x4b00 */ { 881, 0x0000 }, { 881, 0x0200 }, { 882, 0x1000 }, { 883, 0x0080 }, { 884, 0x0000 }, { 884, 0x0000 }, { 884, 0x8000 }, { 885, 0x4805 }, { 889, 0x4000 }, { 890, 0x20c9 }, { 895, 0x0000 }, { 895, 0x6000 }, { 897, 0x0001 }, { 898, 0x0000 }, { 898, 0x0000 }, { 898, 0x0000 }, /* 0x4c00 */ { 898, 0x4090 }, { 901, 0x0000 }, { 901, 0x0000 }, { 901, 0x4800 }, { 903, 0x0000 }, { 903, 0x0800 }, { 904, 0x2000 }, { 905, 0x2000 }, { 906, 0x0000 }, { 906, 0x0000 }, { 906, 0x4010 }, { 908, 0x0081 }, { 910, 0x2000 }, { 911, 0x0000 }, { 911, 0x2002 }, { 913, 0x0000 }, /* 0x4d00 */ { 913, 0x0200 }, { 914, 0x0001 }, { 915, 0x0000 }, { 915, 0x0010 }, { 916, 0x0000 }, { 916, 0x0000 }, { 916, 0x0000 }, { 916, 0x0000 }, { 916, 0x0000 }, { 916, 0x1002 }, { 918, 0x0000 }, { 918, 0x0000 }, { 918, 0x0000 }, { 918, 0x0000 }, { 918, 0x0000 }, { 918, 0x0000 }, /* 0x4e00 */ { 918, 0x0010 }, { 919, 0x1400 }, { 921, 0x1512 }, { 926, 0xa0c0 }, { 930, 0x0200 }, { 931, 0x0c00 }, { 933, 0x0400 }, { 934, 0x0100 }, { 935, 0x02a3 }, { 940, 0x0500 }, { 942, 0x0001 }, { 943, 0x9880 }, { 947, 0x4000 }, { 948, 0x0000 }, { 948, 0x4c00 }, { 951, 0x0100 }, /* 0x4f00 */ { 952, 0x0008 }, { 953, 0x0400 }, { 954, 0x0300 }, { 956, 0x0284 }, { 959, 0x0824 }, { 962, 0x0000 }, { 962, 0x0000 }, { 962, 0x0004 }, { 963, 0x0400 }, { 964, 0x0000 }, { 964, 0x0904 }, { 967, 0x2001 }, { 969, 0x1100 }, { 971, 0x0000 }, { 971, 0x0030 }, { 973, 0x2204 }, /* 0x5000 */ { 976, 0x0108 }, { 978, 0x0000 }, { 978, 0x4000 }, { 979, 0x0010 }, { 980, 0x0000 }, { 980, 0x0140 }, { 982, 0x1040 }, { 984, 0x0000 }, { 984, 0x0102 }, { 986, 0x0001 }, { 987, 0x0040 }, { 988, 0x0000 }, { 988, 0x2000 }, { 989, 0x8201 }, { 992, 0x0002 }, { 993, 0x1010 }, /* 0x5100 */ { 995, 0x6002 }, { 998, 0x0000 }, { 998, 0x0800 }, { 999, 0x0000 }, { 999, 0x0000 }, { 999, 0x0040 }, { 1000, 0x0401 }, { 1002, 0x0210 }, { 1004, 0x0144 }, { 1007, 0x1440 }, { 1010, 0x0980 }, { 1013, 0x013c }, { 1018, 0x8288 }, { 1022, 0x880e }, { 1027, 0x2014 }, { 1030, 0x5010 }, /* 0x5200 */ { 1033, 0x0824 }, { 1036, 0x8000 }, { 1037, 0x00c1 }, { 1040, 0x1010 }, { 1042, 0x0000 }, { 1042, 0x0280 }, { 1044, 0x0101 }, { 1046, 0x0208 }, { 1048, 0x8000 }, { 1049, 0x0411 }, { 1052, 0x0112 }, { 1055, 0x0220 }, { 1057, 0x1020 }, { 1059, 0x0003 }, { 1061, 0x0003 }, { 1063, 0x0200 }, /* 0x5300 */ { 1064, 0x0002 }, { 1065, 0x0000 }, { 1065, 0x1080 }, { 1067, 0x090c }, { 1071, 0x4004 }, { 1073, 0xa000 }, { 1075, 0x2290 }, { 1079, 0x6010 }, { 1082, 0x0000 }, { 1082, 0x0008 }, { 1083, 0x4f45 }, { 1091, 0x0041 }, { 1093, 0x1026 }, { 1097, 0x0707 }, { 1103, 0x0001 }, { 1104, 0x40c0 }, /* 0x5400 */ { 1107, 0x0000 }, { 1107, 0x0458 }, { 1111, 0x800a }, { 1114, 0x0004 }, { 1115, 0x2800 }, { 1117, 0x0000 }, { 1117, 0x2600 }, { 1120, 0x0000 }, { 1120, 0x8020 }, { 1122, 0x5098 }, { 1127, 0x0018 }, { 1129, 0x0214 }, { 1132, 0x3800 }, { 1135, 0x0401 }, { 1137, 0x8008 }, { 1139, 0x0000 }, /* 0x5500 */ { 1139, 0x2004 }, { 1141, 0x4108 }, { 1144, 0x0928 }, { 1148, 0x8000 }, { 1149, 0x0280 }, { 1151, 0x2008 }, { 1153, 0x0a00 }, { 1155, 0x020e }, { 1159, 0x0040 }, { 1160, 0x0001 }, { 1161, 0x0200 }, { 1162, 0x1611 }, { 1167, 0x0002 }, { 1168, 0x4180 }, { 1171, 0x1400 }, { 1173, 0x0823 }, /* 0x5600 */ { 1177, 0x0020 }, { 1178, 0x4002 }, { 1180, 0x202f }, { 1186, 0x0080 }, { 1187, 0xa008 }, { 1190, 0x2015 }, { 1194, 0x0002 }, { 1195, 0x1c00 }, { 1198, 0x0e00 }, { 1201, 0xc004 }, { 1204, 0x8012 }, { 1207, 0x8202 }, { 1210, 0x0000 }, { 1210, 0x0040 }, { 1211, 0xa004 }, { 1214, 0x2002 }, /* 0x5700 */ { 1216, 0x0001 }, { 1217, 0x2020 }, { 1219, 0x0000 }, { 1219, 0x8004 }, { 1221, 0x004c }, { 1224, 0x8890 }, { 1228, 0x0080 }, { 1229, 0xc400 }, { 1232, 0x2500 }, { 1235, 0x1001 }, { 1237, 0x0482 }, { 1240, 0x4810 }, { 1243, 0x0110 }, { 1245, 0x6080 }, { 1248, 0x8040 }, { 1250, 0x4000 }, /* 0x5800 */ { 1251, 0x0008 }, { 1252, 0x0004 }, { 1253, 0x0044 }, { 1255, 0x0400 }, { 1256, 0x0091 }, { 1259, 0x9000 }, { 1261, 0x1200 }, { 1263, 0x000c }, { 1265, 0x0000 }, { 1265, 0x0600 }, { 1267, 0x0480 }, { 1269, 0x0861 }, { 1273, 0x0800 }, { 1274, 0x1000 }, { 1275, 0x0001 }, { 1276, 0x080d }, /* 0x5900 */ { 1280, 0x04b4 }, { 1285, 0x8002 }, { 1287, 0x0000 }, { 1287, 0x0014 }, { 1289, 0x0000 }, { 1289, 0x0000 }, { 1289, 0x0020 }, { 1290, 0x0020 }, { 1291, 0x0200 }, { 1292, 0x8410 }, { 1295, 0x1000 }, { 1296, 0x0181 }, { 1299, 0x0210 }, { 1301, 0x0200 }, { 1302, 0x8800 }, { 1304, 0x0301 }, /* 0x5a00 */ { 1307, 0x2804 }, { 1310, 0x0004 }, { 1311, 0x1c92 }, { 1317, 0x2000 }, { 1318, 0x0020 }, { 1319, 0x0210 }, { 1321, 0x490a }, { 1326, 0x4202 }, { 1329, 0x0146 }, { 1333, 0x0242 }, { 1336, 0x0803 }, { 1339, 0x0000 }, { 1339, 0xc008 }, { 1342, 0x0008 }, { 1343, 0x0010 }, { 1344, 0x4405 }, /* 0x5b00 */ { 1348, 0x2000 }, { 1349, 0x8002 }, { 1351, 0x0800 }, { 1352, 0x0000 }, { 1352, 0x8452 }, { 1357, 0x0000 }, { 1357, 0x2140 }, { 1360, 0x1050 }, { 1363, 0x0005 }, { 1365, 0xe001 }, { 1369, 0x0400 }, { 1370, 0x0000 }, { 1370, 0x0008 }, { 1371, 0x00a0 }, { 1373, 0x0000 }, { 1373, 0x8008 }, /* 0x5c00 */ { 1375, 0x0020 }, { 1376, 0x5018 }, { 1380, 0x0009 }, { 1382, 0x0000 }, { 1382, 0x0600 }, { 1384, 0x4008 }, { 1386, 0x0000 }, { 1386, 0x0000 }, { 1386, 0x0020 }, { 1387, 0x5600 }, { 1391, 0x0000 }, { 1391, 0x0400 }, { 1392, 0x0006 }, { 1394, 0x0002 }, { 1395, 0x8220 }, { 1398, 0x0000 }, /* 0x5d00 */ { 1398, 0x0000 }, { 1398, 0x0121 }, { 1401, 0x9000 }, { 1403, 0x4000 }, { 1404, 0x0140 }, { 1406, 0x08c0 }, { 1409, 0x0000 }, { 1409, 0x0011 }, { 1411, 0x4820 }, { 1414, 0x0000 }, { 1414, 0x0810 }, { 1416, 0x0240 }, { 1418, 0x0002 }, { 1419, 0x0880 }, { 1421, 0x0000 }, { 1421, 0x0020 }, /* 0x5e00 */ { 1422, 0x0a00 }, { 1424, 0x0004 }, { 1425, 0x4000 }, { 1426, 0x0000 }, { 1426, 0x0104 }, { 1428, 0x4000 }, { 1429, 0x0000 }, { 1429, 0x8400 }, { 1431, 0x0048 }, { 1433, 0x0000 }, { 1433, 0x0000 }, { 1433, 0x2000 }, { 1434, 0x2000 }, { 1435, 0x0001 }, { 1436, 0x0000 }, { 1436, 0x1b10 }, /* 0x5f00 */ { 1441, 0x7000 }, { 1444, 0x0000 }, { 1444, 0x0020 }, { 1445, 0x0400 }, { 1446, 0x2000 }, { 1447, 0x1003 }, { 1450, 0x000a }, { 1452, 0x0804 }, { 1454, 0x0008 }, { 1455, 0x0000 }, { 1455, 0x0090 }, { 1457, 0x0402 }, { 1459, 0x0010 }, { 1460, 0x8800 }, { 1462, 0x0000 }, { 1462, 0x0000 }, /* 0x6000 */ { 1462, 0x0000 }, { 1462, 0x0000 }, { 1462, 0x0008 }, { 1463, 0x0802 }, { 1465, 0x0400 }, { 1466, 0x0004 }, { 1467, 0x0000 }, { 1467, 0x40a0 }, { 1470, 0x0000 }, { 1470, 0x4000 }, { 1471, 0x0090 }, { 1473, 0x0008 }, { 1474, 0x0000 }, { 1474, 0x4080 }, { 1476, 0x0388 }, { 1480, 0x2000 }, /* 0x6100 */ { 1481, 0x1080 }, { 1483, 0x0200 }, { 1484, 0x0000 }, { 1484, 0x2001 }, { 1486, 0x0004 }, { 1487, 0x1201 }, { 1490, 0x8011 }, { 1493, 0x2000 }, { 1494, 0x0082 }, { 1496, 0x1320 }, { 1500, 0x0000 }, { 1500, 0x0280 }, { 1502, 0x8001 }, { 1504, 0x0409 }, { 1507, 0x0004 }, { 1508, 0x0000 }, /* 0x6200 */ { 1508, 0x0000 }, { 1508, 0x0000 }, { 1508, 0x1000 }, { 1509, 0x0280 }, { 1511, 0x1000 }, { 1512, 0x0000 }, { 1512, 0x0100 }, { 1513, 0x0000 }, { 1513, 0x0024 }, { 1515, 0x2001 }, { 1517, 0x0050 }, { 1519, 0x0000 }, { 1519, 0x0028 }, { 1521, 0x8020 }, { 1523, 0x0020 }, { 1524, 0x0000 }, /* 0x6300 */ { 1524, 0x0000 }, { 1524, 0x0100 }, { 1525, 0x4000 }, { 1526, 0x00a2 }, { 1529, 0x0000 }, { 1529, 0x0000 }, { 1529, 0x1010 }, { 1531, 0x8200 }, { 1533, 0x0800 }, { 1534, 0x0000 }, { 1534, 0x0000 }, { 1534, 0x0200 }, { 1535, 0x0002 }, { 1536, 0x4002 }, { 1538, 0x0044 }, { 1540, 0x5900 }, /* 0x6400 */ { 1544, 0x0080 }, { 1545, 0x0000 }, { 1545, 0x0000 }, { 1545, 0x0d04 }, { 1549, 0x0000 }, { 1549, 0x0400 }, { 1550, 0x0000 }, { 1550, 0x1002 }, { 1552, 0x2000 }, { 1553, 0x0002 }, { 1554, 0x8000 }, { 1555, 0x0050 }, { 1557, 0x0001 }, { 1558, 0x2008 }, { 1560, 0x04a2 }, { 1564, 0x0000 }, /* 0x6500 */ { 1564, 0x0400 }, { 1565, 0xc002 }, { 1568, 0x0000 }, { 1568, 0x0031 }, { 1571, 0x2000 }, { 1572, 0x8000 }, { 1573, 0x2800 }, { 1575, 0x0000 }, { 1575, 0x0360 }, { 1579, 0x0000 }, { 1579, 0x0000 }, { 1579, 0x4020 }, { 1581, 0x0000 }, { 1581, 0x0012 }, { 1583, 0x0009 }, { 1585, 0x8000 }, /* 0x6600 */ { 1586, 0x0000 }, { 1586, 0x4100 }, { 1588, 0x0008 }, { 1589, 0x0001 }, { 1590, 0x0910 }, { 1593, 0x0088 }, { 1595, 0x0888 }, { 1598, 0x2008 }, { 1600, 0x4020 }, { 1602, 0x0404 }, { 1604, 0x2010 }, { 1606, 0x8048 }, { 1609, 0x6000 }, { 1611, 0x0000 }, { 1611, 0x0000 }, { 1611, 0x0002 }, /* 0x6700 */ { 1612, 0x5004 }, { 1615, 0x4040 }, { 1617, 0x0020 }, { 1618, 0x0040 }, { 1619, 0x0010 }, { 1620, 0x0000 }, { 1620, 0x0086 }, { 1623, 0x0000 }, { 1623, 0x8000 }, { 1624, 0x0000 }, { 1624, 0x1011 }, { 1627, 0x8002 }, { 1629, 0x0000 }, { 1629, 0x00c0 }, { 1631, 0x0000 }, { 1631, 0x4200 }, /* 0x6800 */ { 1633, 0x201f }, { 1639, 0x4801 }, { 1642, 0x0004 }, { 1643, 0x40c0 }, { 1646, 0x0480 }, { 1648, 0x2060 }, { 1651, 0x0020 }, { 1652, 0x0000 }, { 1652, 0x0110 }, { 1654, 0x0100 }, { 1655, 0x0040 }, { 1656, 0x2240 }, { 1659, 0x0428 }, { 1662, 0x0000 }, { 1662, 0x0000 }, { 1662, 0x0000 }, /* 0x6900 */ { 1662, 0x020f }, { 1667, 0x0d00 }, { 1670, 0x1000 }, { 1671, 0x4040 }, { 1673, 0x0048 }, { 1675, 0x0020 }, { 1676, 0x0092 }, { 1679, 0x000c }, { 1681, 0x0421 }, { 1684, 0x8100 }, { 1686, 0x0004 }, { 1687, 0x0004 }, { 1688, 0x0001 }, { 1689, 0x0062 }, { 1692, 0x0202 }, { 1694, 0x0600 }, /* 0x6a00 */ { 1696, 0x1808 }, { 1699, 0x1400 }, { 1701, 0x3800 }, { 1704, 0x0008 }, { 1705, 0x1020 }, { 1707, 0x008c }, { 1710, 0x0020 }, { 1711, 0x0412 }, { 1714, 0x8404 }, { 1717, 0x2200 }, { 1719, 0x0880 }, { 1721, 0x4026 }, { 1725, 0x0700 }, { 1728, 0x0110 }, { 1730, 0x0000 }, { 1730, 0x0040 }, /* 0x6b00 */ { 1731, 0x0020 }, { 1732, 0x2000 }, { 1733, 0x0000 }, { 1733, 0x0020 }, { 1734, 0x0000 }, { 1734, 0x0084 }, { 1736, 0x8000 }, { 1737, 0x0410 }, { 1739, 0x0002 }, { 1740, 0x0000 }, { 1740, 0x0000 }, { 1740, 0x0000 }, { 1740, 0x0002 }, { 1741, 0x1000 }, { 1742, 0x0402 }, { 1744, 0x0400 }, /* 0x6c00 */ { 1745, 0x0000 }, { 1745, 0x1000 }, { 1746, 0x0000 }, { 1746, 0x26a2 }, { 1752, 0x0200 }, { 1753, 0x0500 }, { 1755, 0x4000 }, { 1756, 0x8220 }, { 1759, 0x0000 }, { 1759, 0x8000 }, { 1760, 0x8404 }, { 1763, 0x0004 }, { 1764, 0x4800 }, { 1766, 0x8000 }, { 1767, 0x0400 }, { 1768, 0x0000 }, /* 0x6d00 */ { 1768, 0x0064 }, { 1771, 0x0000 }, { 1771, 0x0050 }, { 1773, 0x0000 }, { 1773, 0x4000 }, { 1774, 0x1880 }, { 1777, 0x0000 }, { 1777, 0x0006 }, { 1779, 0x8002 }, { 1781, 0x0040 }, { 1782, 0x0030 }, { 1784, 0x0202 }, { 1786, 0x0000 }, { 1786, 0x0000 }, { 1786, 0x0000 }, { 1786, 0x0000 }, /* 0x6e00 */ { 1786, 0x8414 }, { 1790, 0x0120 }, { 1792, 0x0600 }, { 1794, 0x0000 }, { 1794, 0x8000 }, { 1795, 0x0201 }, { 1797, 0x0000 }, { 1797, 0x1040 }, { 1799, 0x0840 }, { 1801, 0x0400 }, { 1802, 0x0000 }, { 1802, 0x0920 }, { 1805, 0x0000 }, { 1805, 0x2e00 }, { 1809, 0x0304 }, { 1812, 0x0400 }, /* 0x6f00 */ { 1813, 0x1810 }, { 1816, 0x00c0 }, { 1818, 0x0010 }, { 1819, 0x2010 }, { 1821, 0x0010 }, { 1822, 0x1040 }, { 1824, 0x0000 }, { 1824, 0x0210 }, { 1826, 0x0402 }, { 1828, 0xa000 }, { 1830, 0x0000 }, { 1830, 0x4820 }, { 1833, 0x0000 }, { 1833, 0x0608 }, { 1836, 0x0000 }, { 1836, 0x0140 }, /* 0x7000 */ { 1838, 0x0008 }, { 1839, 0x4000 }, { 1840, 0x1000 }, { 1841, 0x0000 }, { 1841, 0x0800 }, { 1842, 0x1011 }, { 1845, 0x9080 }, { 1848, 0xc220 }, { 1852, 0x8a02 }, { 1856, 0x0000 }, { 1856, 0x00e9 }, { 1861, 0x3a00 }, { 1865, 0x1011 }, { 1868, 0x8061 }, { 1872, 0x0000 }, { 1872, 0x4022 }, /* 0x7100 */ { 1875, 0x0020 }, { 1876, 0x2000 }, { 1877, 0x1a00 }, { 1880, 0x4838 }, { 1885, 0x8421 }, { 1889, 0x0002 }, { 1890, 0x0800 }, { 1891, 0x54ea }, { 1899, 0x5100 }, { 1902, 0x0140 }, { 1904, 0x200c }, { 1907, 0x0490 }, { 1910, 0x0000 }, { 1910, 0x2002 }, { 1912, 0x0800 }, { 1913, 0x0060 }, /* 0x7200 */ { 1915, 0xc200 }, { 1918, 0x00e0 }, { 1921, 0x4810 }, { 1924, 0x0000 }, { 1924, 0x0001 }, { 1925, 0x10a1 }, { 1929, 0x0040 }, { 1930, 0x0000 }, { 1930, 0x8084 }, { 1933, 0x8010 }, { 1935, 0x2000 }, { 1936, 0x0004 }, { 1937, 0x2000 }, { 1938, 0x0000 }, { 1938, 0x0004 }, { 1939, 0x0000 }, /* 0x7300 */ { 1939, 0x0014 }, { 1941, 0x0001 }, { 1942, 0x5d00 }, { 1947, 0x0300 }, { 1949, 0x8102 }, { 1952, 0x0000 }, { 1952, 0x0000 }, { 1952, 0x0012 }, { 1954, 0x8000 }, { 1955, 0x5100 }, { 1958, 0x0480 }, { 1960, 0x0000 }, { 1960, 0xc200 }, { 1963, 0x0021 }, { 1965, 0x8056 }, { 1970, 0x0a88 }, /* 0x7400 */ { 1974, 0x0000 }, { 1974, 0xd2b6 }, { 1983, 0x0000 }, { 1983, 0x1380 }, { 1987, 0x03a8 }, { 1992, 0x2048 }, { 1995, 0x1921 }, { 2000, 0x0450 }, { 2003, 0x3004 }, { 2006, 0x0a00 }, { 2008, 0x0010 }, { 2009, 0x0010 }, { 2010, 0x1100 }, { 2012, 0x0009 }, { 2014, 0x0080 }, { 2015, 0x0107 }, /* 0x7500 */ { 2019, 0x4020 }, { 2021, 0x4200 }, { 2023, 0x0000 }, { 2023, 0x0830 }, { 2026, 0x2444 }, { 2030, 0x002a }, { 2033, 0x6081 }, { 2037, 0x0404 }, { 2039, 0x6008 }, { 2042, 0x4004 }, { 2044, 0x0000 }, { 2044, 0x0012 }, { 2046, 0x0108 }, { 2048, 0x1000 }, { 2049, 0x0000 }, { 2049, 0x0000 }, /* 0x7600 */ { 2049, 0x0084 }, { 2051, 0x0000 }, { 2051, 0x1000 }, { 2052, 0x0800 }, { 2053, 0xe001 }, { 2057, 0x0012 }, { 2059, 0x80c0 }, { 2062, 0x0458 }, { 2066, 0x0000 }, { 2066, 0x0001 }, { 2067, 0x0022 }, { 2069, 0x0080 }, { 2070, 0x1000 }, { 2071, 0x0040 }, { 2072, 0x0000 }, { 2072, 0x0000 }, /* 0x7700 */ { 2072, 0xd000 }, { 2075, 0x4000 }, { 2076, 0x0850 }, { 2079, 0x0000 }, { 2079, 0x0009 }, { 2081, 0x0100 }, { 2082, 0x0000 }, { 2082, 0x0d84 }, { 2087, 0x0000 }, { 2087, 0x0108 }, { 2089, 0x8000 }, { 2090, 0x4200 }, { 2092, 0x0828 }, { 2095, 0x0000 }, { 2095, 0x0040 }, { 2096, 0x4010 }, /* 0x7800 */ { 2098, 0x0100 }, { 2099, 0x5100 }, { 2102, 0x0000 }, { 2102, 0x3200 }, { 2105, 0x0894 }, { 2109, 0x001a }, { 2112, 0x0040 }, { 2113, 0x0400 }, { 2114, 0x2102 }, { 2117, 0x0000 }, { 2117, 0x8000 }, { 2118, 0x0342 }, { 2122, 0x0080 }, { 2123, 0x018c }, { 2127, 0x4000 }, { 2128, 0x0023 }, /* 0x7900 */ { 2131, 0x0040 }, { 2132, 0x0000 }, { 2132, 0x4000 }, { 2133, 0x185c }, { 2139, 0x0000 }, { 2139, 0x0300 }, { 2141, 0x0004 }, { 2142, 0x4002 }, { 2144, 0x00c9 }, { 2148, 0xa202 }, { 2152, 0x0220 }, { 2154, 0x0000 }, { 2154, 0x1050 }, { 2157, 0x0010 }, { 2158, 0x0004 }, { 2159, 0x0012 }, /* 0x7a00 */ { 2161, 0x0040 }, { 2162, 0x0000 }, { 2162, 0x2000 }, { 2163, 0x4400 }, { 2165, 0x0228 }, { 2168, 0x0000 }, { 2168, 0x0020 }, { 2169, 0x2000 }, { 2170, 0x0008 }, { 2171, 0x0002 }, { 2172, 0x0000 }, { 2172, 0x1801 }, { 2175, 0x830c }, { 2180, 0x3c08 }, { 2185, 0x0684 }, { 2189, 0x4000 }, /* 0x7b00 */ { 2190, 0x1800 }, { 2192, 0x8010 }, { 2194, 0x0280 }, { 2196, 0x0200 }, { 2197, 0x000c }, { 2199, 0x0020 }, { 2200, 0x9004 }, { 2203, 0x0800 }, { 2204, 0x0000 }, { 2204, 0x0004 }, { 2205, 0x000c }, { 2207, 0x0004 }, { 2208, 0x8000 }, { 2209, 0x0001 }, { 2210, 0x0000 }, { 2210, 0x1400 }, /* 0x7c00 */ { 2212, 0x0000 }, { 2212, 0x0824 }, { 2215, 0x0000 }, { 2215, 0x0020 }, { 2216, 0x0014 }, { 2218, 0x2042 }, { 2221, 0x2000 }, { 2222, 0x5811 }, { 2227, 0x4048 }, { 2230, 0x1000 }, { 2231, 0x50c0 }, { 2235, 0x0100 }, { 2236, 0x2284 }, { 2240, 0x0408 }, { 2242, 0x2040 }, { 2244, 0x1228 }, /* 0x7d00 */ { 2248, 0x0000 }, { 2248, 0x0000 }, { 2248, 0x0020 }, { 2249, 0x0000 }, { 2249, 0x2000 }, { 2250, 0x2400 }, { 2252, 0x0000 }, { 2252, 0x0000 }, { 2252, 0x0200 }, { 2253, 0x0080 }, { 2254, 0x0910 }, { 2257, 0x0008 }, { 2258, 0xa000 }, { 2260, 0x1019 }, { 2264, 0x0030 }, { 2266, 0x6020 }, /* 0x7e00 */ { 2269, 0x0080 }, { 2270, 0x0000 }, { 2270, 0x0080 }, { 2271, 0x0000 }, { 2271, 0x0000 }, { 2271, 0x0000 }, { 2271, 0x40a0 }, { 2274, 0x8000 }, { 2275, 0x4000 }, { 2276, 0x8004 }, { 2278, 0x1010 }, { 2280, 0x0400 }, { 2281, 0x8080 }, { 2283, 0x8000 }, { 2284, 0x0000 }, { 2284, 0x0000 }, /* 0x7f00 */ { 2284, 0x0040 }, { 2285, 0x0000 }, { 2285, 0x0000 }, { 2285, 0x0080 }, { 2286, 0x4283 }, { 2291, 0x000c }, { 2293, 0x0000 }, { 2293, 0x0102 }, { 2295, 0x8000 }, { 2296, 0x0088 }, { 2298, 0x4008 }, { 2300, 0x0010 }, { 2301, 0x0000 }, { 2301, 0x2000 }, { 2302, 0x0080 }, { 2303, 0x0400 }, /* 0x8000 */ { 2304, 0x0104 }, { 2306, 0x2000 }, { 2307, 0xc021 }, { 2311, 0x1802 }, { 2314, 0x0000 }, { 2314, 0x0810 }, { 2316, 0x004e }, { 2320, 0x0000 }, { 2320, 0x0001 }, { 2321, 0x8000 }, { 2322, 0x0080 }, { 2323, 0x30c0 }, { 2327, 0x0040 }, { 2328, 0x0000 }, { 2328, 0x1200 }, { 2330, 0x0040 }, /* 0x8100 */ { 2331, 0x5288 }, { 2336, 0x0494 }, { 2340, 0x0400 }, { 2341, 0x0094 }, { 2344, 0x0104 }, { 2346, 0x0640 }, { 2349, 0x2000 }, { 2350, 0x1000 }, { 2351, 0x0010 }, { 2352, 0x0008 }, { 2353, 0x0420 }, { 2355, 0x0040 }, { 2356, 0x0102 }, { 2358, 0x0000 }, { 2358, 0x8010 }, { 2360, 0x0040 }, /* 0x8200 */ { 2361, 0x0000 }, { 2361, 0x0500 }, { 2363, 0x2240 }, { 2366, 0x4000 }, { 2367, 0x0000 }, { 2367, 0x0010 }, { 2368, 0x0024 }, { 2370, 0x0e40 }, { 2374, 0x0080 }, { 2375, 0x0000 }, { 2375, 0x0440 }, { 2377, 0x0000 }, { 2377, 0x8410 }, { 2380, 0x0101 }, { 2382, 0x4004 }, { 2384, 0xb080 }, /* 0x8300 */ { 2388, 0x0800 }, { 2389, 0x2500 }, { 2392, 0x0000 }, { 2392, 0x2000 }, { 2393, 0x0000 }, { 2393, 0x0080 }, { 2394, 0x804c }, { 2398, 0x0000 }, { 2398, 0x0020 }, { 2399, 0x1002 }, { 2401, 0x1000 }, { 2402, 0x4200 }, { 2404, 0x2000 }, { 2405, 0x0008 }, { 2406, 0x2000 }, { 2407, 0x0000 }, /* 0x8400 */ { 2407, 0x0020 }, { 2408, 0x1150 }, { 2412, 0x4053 }, { 2417, 0x4000 }, { 2418, 0x0500 }, { 2420, 0x1128 }, { 2424, 0x0014 }, { 2426, 0x8006 }, { 2429, 0x0101 }, { 2431, 0x004c }, { 2434, 0x2008 }, { 2436, 0x6000 }, { 2438, 0x0000 }, { 2438, 0x4400 }, { 2440, 0x0036 }, { 2444, 0x0100 }, /* 0x8500 */ { 2445, 0x0028 }, { 2447, 0x0001 }, { 2448, 0x0000 }, { 2448, 0x0118 }, { 2451, 0x1804 }, { 2454, 0x0404 }, { 2456, 0x8000 }, { 2457, 0x0009 }, { 2459, 0x0000 }, { 2459, 0x0000 }, { 2459, 0x0000 }, { 2459, 0x0000 }, { 2459, 0x0002 }, { 2460, 0x0000 }, { 2460, 0x4001 }, { 2462, 0x1000 }, /* 0x8600 */ { 2463, 0x2004 }, { 2465, 0x0051 }, { 2468, 0x8100 }, { 2470, 0x0000 }, { 2470, 0x0024 }, { 2472, 0x0000 }, { 2472, 0x1000 }, { 2473, 0x4004 }, { 2475, 0x0000 }, { 2475, 0x0004 }, { 2476, 0x2001 }, { 2478, 0x0004 }, { 2479, 0x0000 }, { 2479, 0x0000 }, { 2479, 0x8000 }, { 2480, 0x0000 }, /* 0x8700 */ { 2480, 0x0000 }, { 2480, 0x0000 }, { 2480, 0x0000 }, { 2480, 0x0000 }, { 2480, 0x0000 }, { 2480, 0x0000 }, { 2480, 0x0000 }, { 2480, 0x2003 }, { 2483, 0x1840 }, { 2486, 0x0000 }, { 2486, 0x0220 }, { 2488, 0x0002 }, { 2489, 0x4002 }, { 2491, 0x0440 }, { 2493, 0x4000 }, { 2494, 0x0020 }, /* 0x8800 */ { 2495, 0x8010 }, { 2497, 0x0100 }, { 2498, 0x2080 }, { 2500, 0x0000 }, { 2500, 0x8064 }, { 2504, 0x4000 }, { 2505, 0x4031 }, { 2509, 0x0000 }, { 2509, 0x0090 }, { 2511, 0x1000 }, { 2512, 0x4001 }, { 2514, 0x8030 }, { 2517, 0x80a0 }, { 2520, 0x0000 }, { 2520, 0x0040 }, { 2521, 0x8020 }, /* 0x8900 */ { 2523, 0x0001 }, { 2524, 0x0000 }, { 2524, 0x0010 }, { 2525, 0x0000 }, { 2525, 0x2088 }, { 2528, 0x0010 }, { 2529, 0x0020 }, { 2530, 0x0080 }, { 2531, 0x0681 }, { 2535, 0x0012 }, { 2537, 0x02a0 }, { 2540, 0x1000 }, { 2541, 0x0042 }, { 2543, 0x0000 }, { 2543, 0x0080 }, { 2544, 0x0000 }, /* 0x8a00 */ { 2544, 0x0000 }, { 2544, 0x1000 }, { 2545, 0x0a00 }, { 2547, 0x2100 }, { 2549, 0x0200 }, { 2550, 0x0000 }, { 2550, 0x0080 }, { 2551, 0x4000 }, { 2552, 0x0000 }, { 2552, 0x1011 }, { 2555, 0x8200 }, { 2557, 0x0010 }, { 2558, 0x0000 }, { 2558, 0x0400 }, { 2559, 0x0400 }, { 2560, 0x0000 }, /* 0x8b00 */ { 2560, 0x1000 }, { 2561, 0x8000 }, { 2562, 0x2000 }, { 2563, 0x8000 }, { 2564, 0x3008 }, { 2567, 0x4000 }, { 2568, 0x0204 }, { 2570, 0x0000 }, { 2570, 0x0002 }, { 2571, 0x0801 }, { 2573, 0x0001 }, { 2574, 0x4000 }, { 2575, 0x0000 }, { 2575, 0x0000 }, { 2575, 0x0004 }, { 2576, 0x0000 }, /* 0x8c00 */ { 2576, 0x0000 }, { 2576, 0x0000 }, { 2576, 0x0000 }, { 2576, 0x0000 }, { 2576, 0x0000 }, { 2576, 0x0002 }, { 2577, 0x0000 }, { 2577, 0x0000 }, { 2577, 0x0000 }, { 2577, 0x8800 }, { 2579, 0x2000 }, { 2580, 0x0000 }, { 2580, 0x2000 }, { 2581, 0x0850 }, { 2584, 0x0a00 }, { 2586, 0x0084 }, /* 0x8d00 */ { 2588, 0x1808 }, { 2591, 0x3106 }, { 2596, 0x0000 }, { 2596, 0x0000 }, { 2596, 0x0000 }, { 2596, 0x0000 }, { 2596, 0x0000 }, { 2596, 0x0400 }, { 2597, 0x0004 }, { 2598, 0x0000 }, { 2598, 0x0240 }, { 2600, 0x0000 }, { 2600, 0x0009 }, { 2602, 0x0010 }, { 2603, 0x0000 }, { 2603, 0x0000 }, /* 0x8e00 */ { 2603, 0x4002 }, { 2605, 0x0000 }, { 2605, 0x2500 }, { 2608, 0x0400 }, { 2609, 0x8040 }, { 2611, 0x0000 }, { 2611, 0x0100 }, { 2612, 0x40a2 }, { 2616, 0x0001 }, { 2617, 0x0000 }, { 2617, 0x2080 }, { 2619, 0x1041 }, { 2622, 0x4008 }, { 2624, 0x0400 }, { 2625, 0x2014 }, { 2628, 0x0004 }, /* 0x8f00 */ { 2629, 0x0000 }, { 2629, 0x0200 }, { 2630, 0x2000 }, { 2631, 0x0001 }, { 2632, 0x0402 }, { 2634, 0x1000 }, { 2635, 0x40c0 }, { 2638, 0x0000 }, { 2638, 0x0000 }, { 2638, 0x0008 }, { 2639, 0x0021 }, { 2641, 0x5fe8 }, { 2651, 0x1402 }, { 2654, 0x0401 }, { 2656, 0x0000 }, { 2656, 0x0200 }, /* 0x9000 */ { 2657, 0x0100 }, { 2658, 0x0004 }, { 2659, 0x0000 }, { 2659, 0x0088 }, { 2661, 0x1000 }, { 2662, 0x0040 }, { 2663, 0x1012 }, { 2666, 0x0000 }, { 2666, 0x0000 }, { 2666, 0x0000 }, { 2666, 0x4100 }, { 2668, 0x0800 }, { 2669, 0x0010 }, { 2670, 0x0000 }, { 2670, 0x0000 }, { 2670, 0x0000 }, /* 0x9100 */ { 2670, 0x0000 }, { 2670, 0x0000 }, { 2670, 0x0000 }, { 2670, 0x0000 }, { 2670, 0x0000 }, { 2670, 0x5202 }, { 2674, 0x0080 }, { 2675, 0x1041 }, { 2678, 0x5000 }, { 2680, 0x0000 }, { 2680, 0x0200 }, { 2681, 0x0840 }, { 2683, 0x0010 }, { 2684, 0x8040 }, { 2686, 0x0020 }, { 2687, 0x4400 }, /* 0x9200 */ { 2689, 0x4100 }, { 2691, 0x0008 }, { 2692, 0x0d00 }, { 2695, 0x1020 }, { 2697, 0x0012 }, { 2699, 0xa120 }, { 2703, 0x4804 }, { 2706, 0x0080 }, { 2707, 0x8212 }, { 2711, 0x0000 }, { 2711, 0x4000 }, { 2712, 0xc602 }, { 2717, 0x0000 }, { 2717, 0x0810 }, { 2719, 0x1828 }, { 2723, 0x205c }, /* 0x9300 */ { 2728, 0x0088 }, { 2730, 0x0000 }, { 2730, 0x1000 }, { 2731, 0x0003 }, { 2733, 0x013f }, { 2740, 0x8000 }, { 2741, 0x4b44 }, { 2747, 0x2118 }, { 2751, 0x00f2 }, { 2756, 0x1001 }, { 2758, 0x2001 }, { 2760, 0xa900 }, { 2764, 0x0840 }, { 2766, 0x0808 }, { 2768, 0x0001 }, { 2769, 0x000b }, /* 0x9400 */ { 2772, 0x0112 }, { 2775, 0x2880 }, { 2778, 0x20f0 }, { 2783, 0x4000 }, { 2784, 0x200c }, { 2787, 0x0910 }, { 2790, 0x10a0 }, { 2793, 0x0a00 }, { 2795, 0x0020 }, { 2796, 0x8000 }, { 2797, 0x0004 }, { 2798, 0x0000 }, { 2798, 0x000a }, { 2800, 0x1000 }, { 2801, 0x0000 }, { 2801, 0x0040 }, /* 0x9500 */ { 2802, 0x0000 }, { 2802, 0x0000 }, { 2802, 0x2000 }, { 2803, 0x0000 }, { 2803, 0x0080 }, { 2804, 0x0000 }, { 2804, 0x0000 }, { 2804, 0x8100 }, { 2806, 0x0020 }, { 2807, 0x02c0 }, { 2810, 0x04c5 }, { 2815, 0x0000 }, { 2815, 0x0000 }, { 2815, 0x0000 }, { 2815, 0x0100 }, { 2816, 0x0010 }, /* 0x9600 */ { 2817, 0x0000 }, { 2817, 0x2000 }, { 2818, 0x0000 }, { 2818, 0x0108 }, { 2820, 0x0022 }, { 2822, 0x0040 }, { 2823, 0x0200 }, { 2824, 0x0800 }, { 2825, 0x8002 }, { 2827, 0x0040 }, { 2828, 0x0028 }, { 2830, 0x2040 }, { 2832, 0x0000 }, { 2832, 0x0000 }, { 2832, 0x0000 }, { 2832, 0x0010 }, /* 0x9700 */ { 2833, 0x0008 }, { 2834, 0x0800 }, { 2835, 0x0002 }, { 2836, 0x0042 }, { 2838, 0x0003 }, { 2840, 0xa082 }, { 2844, 0x2000 }, { 2845, 0x0002 }, { 2846, 0x0280 }, { 2848, 0x8800 }, { 2850, 0x0000 }, { 2850, 0x6516 }, { 2857, 0x0105 }, { 2860, 0x0004 }, { 2861, 0x4041 }, { 2864, 0x0024 }, /* 0x9800 */ { 2866, 0x0000 }, { 2866, 0x8030 }, { 2869, 0x4008 }, { 2871, 0x0018 }, { 2873, 0x0880 }, { 2875, 0x0000 }, { 2875, 0x1040 }, { 2877, 0x0020 }, { 2878, 0x0000 }, { 2878, 0x0000 }, { 2878, 0x0000 }, { 2878, 0x0290 }, { 2881, 0x4588 }, { 2886, 0x5000 }, { 2888, 0x1043 }, { 2892, 0x0022 }, /* 0x9900 */ { 2894, 0x4000 }, { 2895, 0x1200 }, { 2897, 0x0000 }, { 2897, 0x0b80 }, { 2901, 0x2405 }, { 2905, 0x2000 }, { 2906, 0x000c }, { 2908, 0x0000 }, { 2908, 0x0000 }, { 2908, 0x0800 }, { 2909, 0x0410 }, { 2911, 0x1100 }, { 2913, 0x0030 }, { 2915, 0x0400 }, { 2916, 0x0042 }, { 2918, 0x0020 }, /* 0x9a00 */ { 2919, 0x1000 }, { 2920, 0x8001 }, { 2922, 0x8042 }, { 2925, 0x1800 }, { 2927, 0x0000 }, { 2927, 0x1100 }, { 2929, 0x1008 }, { 2931, 0x0000 }, { 2931, 0x8000 }, { 2932, 0x0000 }, { 2932, 0x0000 }, { 2932, 0x2444 }, { 2936, 0x0000 }, { 2936, 0x0080 }, { 2937, 0x0005 }, { 2939, 0x8010 }, /* 0x9b00 */ { 2941, 0x8204 }, { 2944, 0x0010 }, { 2945, 0x2400 }, { 2947, 0x0210 }, { 2949, 0x0001 }, { 2950, 0x0001 }, { 2951, 0x0200 }, { 2952, 0x8000 }, { 2953, 0xe80a }, { 2959, 0xa080 }, { 2962, 0x0000 }, { 2962, 0x0001 }, { 2963, 0x8000 }, { 2964, 0x2000 }, { 2965, 0x2200 }, { 2967, 0x8012 }, /* 0x9c00 */ { 2970, 0x1404 }, { 2973, 0x8821 }, { 2977, 0x8041 }, { 2980, 0x0420 }, { 2982, 0x8020 }, { 2984, 0x2008 }, { 2986, 0x0000 }, { 2986, 0x1804 }, { 2989, 0x0000 }, { 2989, 0x0000 }, { 2989, 0x0000 }, { 2989, 0x0000 }, { 2989, 0x0000 }, { 2989, 0x0000 }, { 2989, 0x0000 }, { 2989, 0x0000 }, /* 0x9d00 */ { 2989, 0x1004 }, { 2991, 0x0040 }, { 2992, 0x0002 }, { 2993, 0x0210 }, { 2995, 0x4210 }, { 2998, 0x4001 }, { 3000, 0x6000 }, { 3002, 0x5000 }, { 3004, 0x0008 }, { 3005, 0x0008 }, { 3006, 0x0820 }, { 3008, 0x2000 }, { 3009, 0x0211 }, { 3012, 0x0010 }, { 3013, 0x0000 }, { 3013, 0x1000 }, /* 0x9e00 */ { 3014, 0x5400 }, { 3017, 0x9100 }, { 3020, 0x0000 }, { 3020, 0x0000 }, { 3020, 0x0000 }, { 3020, 0x0000 }, { 3020, 0x0000 }, { 3020, 0x0800 }, { 3021, 0x0032 }, { 3024, 0x4161 }, { 3029, 0x9d44 }, { 3036, 0xa002 }, { 3039, 0x00d2 }, { 3043, 0x0000 }, { 3043, 0x0004 }, { 3044, 0x4102 }, /* 0x9f00 */ { 3047, 0x0104 }, { 3049, 0x0080 }, { 3050, 0x00c0 }, { 3052, 0x0200 }, { 3053, 0x0030 }, { 3055, 0x0409 }, { 3058, 0x0204 }, { 3060, 0x8000 }, { 3061, 0x4000 }, { 3062, 0x8200 }, { 3064, 0x0020 }, { 3065, 0x0003 }, }; static const Summary16 hkscs1999_uni2indx_pagef9[1] = { /* 0xf900 */ { 3067, 0x0080 }, }; static const Summary16 hkscs1999_uni2indx_pageff[15] = { /* 0xff00 */ { 3068, 0x0084 }, { 3070, 0x0000 }, { 3070, 0x0000 }, { 3070, 0x2800 }, { 3072, 0x0000 }, { 3072, 0x0000 }, { 3072, 0x0000 }, { 3072, 0x0000 }, { 3072, 0x0000 }, { 3072, 0x0000 }, { 3072, 0x0000 }, { 3072, 0x0000 }, { 3072, 0x0000 }, { 3072, 0x0000 }, { 3072, 0x2014 }, }; static const Summary16 hkscs1999_uni2indx_page200[2335] = { /* 0x20000 */ { 3075, 0x0000 }, { 3075, 0x0000 }, { 3075, 0x0002 }, { 3076, 0x4000 }, { 3077, 0x4040 }, { 3079, 0x0000 }, { 3079, 0x0100 }, { 3080, 0x0000 }, { 3080, 0x04c0 }, { 3083, 0x0010 }, { 3084, 0x0000 }, { 3084, 0x0000 }, { 3084, 0x3c00 }, { 3088, 0x0002 }, { 3089, 0x4000 }, { 3090, 0x0000 }, /* 0x20100 */ { 3090, 0x5000 }, { 3092, 0x0100 }, { 3093, 0x0000 }, { 3093, 0x0000 }, { 3093, 0x0000 }, { 3093, 0x0000 }, { 3093, 0x0000 }, { 3093, 0x0000 }, { 3093, 0x0000 }, { 3093, 0x0000 }, { 3093, 0x0a00 }, { 3095, 0x0000 }, { 3095, 0x0002 }, { 3096, 0x0010 }, { 3097, 0x0000 }, { 3097, 0x0004 }, /* 0x20200 */ { 3098, 0x1010 }, { 3100, 0x0010 }, { 3101, 0x0000 }, { 3101, 0x0000 }, { 3101, 0x0000 }, { 3101, 0x0800 }, { 3102, 0x0000 }, { 3102, 0x0030 }, { 3104, 0x0000 }, { 3104, 0x4200 }, { 3106, 0x0001 }, { 3107, 0x8080 }, { 3109, 0x0001 }, { 3110, 0x0000 }, { 3110, 0x0020 }, { 3111, 0x0000 }, /* 0x20300 */ { 3111, 0x0400 }, { 3112, 0x0000 }, { 3112, 0x0020 }, { 3113, 0x0000 }, { 3113, 0x00e2 }, { 3117, 0x0000 }, { 3117, 0x0000 }, { 3117, 0xc000 }, { 3119, 0x0001 }, { 3120, 0x0000 }, { 3120, 0x0081 }, { 3122, 0x0020 }, { 3123, 0x0a00 }, { 3125, 0x0000 }, { 3125, 0x0000 }, { 3125, 0x1020 }, /* 0x20400 */ { 3127, 0x0000 }, { 3127, 0x8018 }, { 3130, 0x0000 }, { 3130, 0x0000 }, { 3130, 0x0000 }, { 3130, 0x0000 }, { 3130, 0x0020 }, { 3131, 0x0000 }, { 3131, 0x4080 }, { 3133, 0x0006 }, { 3135, 0x0008 }, { 3136, 0x0000 }, { 3136, 0x0000 }, { 3136, 0x0080 }, { 3137, 0x0000 }, { 3137, 0x5000 }, /* 0x20500 */ { 3139, 0x0000 }, { 3139, 0x0000 }, { 3139, 0x0000 }, { 3139, 0x0000 }, { 3139, 0x0080 }, { 3140, 0x0000 }, { 3140, 0x0000 }, { 3140, 0x0000 }, { 3140, 0x4000 }, { 3141, 0x0000 }, { 3141, 0x0020 }, { 3142, 0x0008 }, { 3143, 0x0408 }, { 3145, 0x8021 }, { 3148, 0x0801 }, { 3150, 0x0000 }, /* 0x20600 */ { 3150, 0x0000 }, { 3150, 0x0622 }, { 3154, 0x0000 }, { 3154, 0x0001 }, { 3155, 0x0000 }, { 3155, 0x0040 }, { 3156, 0x0000 }, { 3156, 0x0040 }, { 3157, 0x0000 }, { 3157, 0x0000 }, { 3157, 0x0000 }, { 3157, 0x0000 }, { 3157, 0x0000 }, { 3157, 0x0000 }, { 3157, 0x0000 }, { 3157, 0x0000 }, /* 0x20700 */ { 3157, 0x4000 }, { 3158, 0x0000 }, { 3158, 0x0000 }, { 3158, 0x0002 }, { 3159, 0x0000 }, { 3159, 0x0000 }, { 3159, 0x0000 }, { 3159, 0x0200 }, { 3160, 0x0000 }, { 3160, 0x0000 }, { 3160, 0x0000 }, { 3160, 0x0000 }, { 3160, 0x0000 }, { 3160, 0x0000 }, { 3160, 0x0000 }, { 3160, 0x0000 }, /* 0x20800 */ { 3160, 0x0000 }, { 3160, 0x0000 }, { 3160, 0x1000 }, { 3161, 0x0000 }, { 3161, 0x0000 }, { 3161, 0x0000 }, { 3161, 0x0000 }, { 3161, 0x0008 }, { 3162, 0x0000 }, { 3162, 0x0000 }, { 3162, 0x0000 }, { 3162, 0x0000 }, { 3162, 0x0000 }, { 3162, 0x0020 }, { 3163, 0x0000 }, { 3163, 0x0000 }, /* 0x20900 */ { 3163, 0x0000 }, { 3163, 0x0040 }, { 3164, 0x0008 }, { 3165, 0x0000 }, { 3165, 0x0000 }, { 3165, 0x0010 }, { 3166, 0x0000 }, { 3166, 0x0200 }, { 3167, 0x0000 }, { 3167, 0x0000 }, { 3167, 0x0000 }, { 3167, 0x0000 }, { 3167, 0x0000 }, { 3167, 0x0000 }, { 3167, 0x0080 }, { 3168, 0x0000 }, /* 0x20a00 */ { 3168, 0x0000 }, { 3168, 0x0002 }, { 3169, 0x0000 }, { 3169, 0x0000 }, { 3169, 0x0000 }, { 3169, 0x0001 }, { 3170, 0x0000 }, { 3170, 0x0000 }, { 3170, 0x0000 }, { 3170, 0x0000 }, { 3170, 0x0000 }, { 3170, 0x0010 }, { 3171, 0x2004 }, { 3173, 0x0000 }, { 3173, 0x0000 }, { 3173, 0x0000 }, /* 0x20b00 */ { 3173, 0x2000 }, { 3174, 0x0000 }, { 3174, 0x0000 }, { 3174, 0x0000 }, { 3174, 0x0000 }, { 3174, 0x0000 }, { 3174, 0x0000 }, { 3174, 0x0000 }, { 3174, 0x8000 }, { 3175, 0x0000 }, { 3175, 0x0300 }, { 3177, 0x8000 }, { 3178, 0x0840 }, { 3180, 0x0000 }, { 3180, 0x0804 }, { 3182, 0x8800 }, /* 0x20c00 */ { 3184, 0x2800 }, { 3186, 0x0000 }, { 3186, 0x0001 }, { 3187, 0x0c10 }, { 3190, 0x000e }, { 3193, 0x0008 }, { 3194, 0x0020 }, { 3195, 0x1180 }, { 3198, 0x2000 }, { 3199, 0x1040 }, { 3201, 0x0000 }, { 3201, 0x0120 }, { 3203, 0x8000 }, { 3204, 0x2078 }, { 3209, 0x2000 }, { 3210, 0x8000 }, /* 0x20d00 */ { 3211, 0x0000 }, { 3211, 0x0020 }, { 3212, 0x0100 }, { 3213, 0x0006 }, { 3215, 0x73c0 }, { 3222, 0x0000 }, { 3222, 0x8000 }, { 3223, 0xd012 }, { 3228, 0x0000 }, { 3228, 0x1040 }, { 3230, 0x0080 }, { 3231, 0x0004 }, { 3232, 0x0100 }, { 3233, 0x0000 }, { 3233, 0x0000 }, { 3233, 0x0000 }, /* 0x20e00 */ { 3233, 0xe610 }, { 3239, 0x2043 }, { 3243, 0x0000 }, { 3243, 0x0000 }, { 3243, 0x1000 }, { 3244, 0x0000 }, { 3244, 0x2000 }, { 3245, 0x0fe8 }, { 3253, 0x1000 }, { 3254, 0x2140 }, { 3257, 0x1c04 }, { 3261, 0x0040 }, { 3262, 0x0000 }, { 3262, 0x2180 }, { 3265, 0x0000 }, { 3265, 0x0f00 }, /* 0x20f00 */ { 3269, 0x0000 }, { 3269, 0x2000 }, { 3270, 0x6040 }, { 3273, 0x0803 }, { 3276, 0x1000 }, { 3277, 0x0000 }, { 3277, 0x0010 }, { 3278, 0x0000 }, { 3278, 0x2000 }, { 3279, 0x0001 }, { 3280, 0x2000 }, { 3281, 0x1070 }, { 3285, 0x0000 }, { 3285, 0x8000 }, { 3286, 0x3c00 }, { 3290, 0x0000 }, /* 0x21000 */ { 3290, 0x0000 }, { 3290, 0x6010 }, { 3293, 0x0000 }, { 3293, 0x0000 }, { 3293, 0x8000 }, { 3294, 0x1000 }, { 3295, 0x8000 }, { 3296, 0x09e0 }, { 3301, 0x0100 }, { 3302, 0x2040 }, { 3304, 0x0000 }, { 3304, 0x8010 }, { 3306, 0x8383 }, { 3312, 0x0008 }, { 3313, 0x0010 }, { 3314, 0x0070 }, /* 0x21100 */ { 3317, 0x0000 }, { 3317, 0x0000 }, { 3317, 0x8000 }, { 3318, 0x2800 }, { 3320, 0x8120 }, { 3323, 0x0000 }, { 3323, 0x0000 }, { 3323, 0x0000 }, { 3323, 0x0081 }, { 3325, 0x0000 }, { 3325, 0x0000 }, { 3325, 0x0000 }, { 3325, 0x0000 }, { 3325, 0x0200 }, { 3326, 0x0000 }, { 3326, 0x0000 }, /* 0x21200 */ { 3326, 0x0000 }, { 3326, 0x0000 }, { 3326, 0x0000 }, { 3326, 0x1000 }, { 3327, 0x8000 }, { 3328, 0x0000 }, { 3328, 0x0000 }, { 3328, 0x1000 }, { 3329, 0x0000 }, { 3329, 0x0000 }, { 3329, 0x0300 }, { 3331, 0x0001 }, { 3332, 0x0000 }, { 3332, 0x0000 }, { 3332, 0x0008 }, { 3333, 0x4000 }, /* 0x21300 */ { 3334, 0x003c }, { 3338, 0x0000 }, { 3338, 0x0000 }, { 3338, 0x0440 }, { 3340, 0x0000 }, { 3340, 0x0000 }, { 3340, 0x0000 }, { 3340, 0x0060 }, { 3342, 0x4000 }, { 3343, 0x1100 }, { 3345, 0x0000 }, { 3345, 0x0000 }, { 3345, 0x0060 }, { 3347, 0x0000 }, { 3347, 0x2000 }, { 3348, 0x4000 }, /* 0x21400 */ { 3349, 0x0000 }, { 3349, 0x0048 }, { 3351, 0x0010 }, { 3352, 0x0000 }, { 3352, 0x0000 }, { 3352, 0x0034 }, { 3355, 0x0000 }, { 3355, 0x0000 }, { 3355, 0x0400 }, { 3356, 0x0080 }, { 3357, 0x0000 }, { 3357, 0x0040 }, { 3358, 0x0000 }, { 3358, 0x0000 }, { 3358, 0x0100 }, { 3359, 0x2000 }, /* 0x21500 */ { 3360, 0x0000 }, { 3360, 0x0000 }, { 3360, 0x0000 }, { 3360, 0x0000 }, { 3360, 0x0000 }, { 3360, 0x0000 }, { 3360, 0x0000 }, { 3360, 0x0080 }, { 3361, 0x0004 }, { 3362, 0x0040 }, { 3363, 0x0000 }, { 3363, 0x0000 }, { 3363, 0x0000 }, { 3363, 0x0000 }, { 3363, 0x0000 }, { 3363, 0x0000 }, /* 0x21600 */ { 3363, 0x0400 }, { 3364, 0x0208 }, { 3366, 0x0000 }, { 3366, 0x4000 }, { 3367, 0x0000 }, { 3367, 0x0000 }, { 3367, 0x0002 }, { 3368, 0x0000 }, { 3368, 0x0000 }, { 3368, 0x0004 }, { 3369, 0x0000 }, { 3369, 0x0500 }, { 3371, 0x0007 }, { 3374, 0x8028 }, { 3377, 0x01c0 }, { 3380, 0x5c00 }, /* 0x21700 */ { 3384, 0x2000 }, { 3385, 0x0001 }, { 3386, 0x0040 }, { 3387, 0x1c00 }, { 3390, 0x0000 }, { 3390, 0x0080 }, { 3391, 0xf000 }, { 3395, 0x001b }, { 3399, 0x0000 }, { 3399, 0x0000 }, { 3399, 0x0800 }, { 3400, 0x003f }, { 3406, 0x0088 }, { 3408, 0x9e00 }, { 3413, 0x8000 }, { 3414, 0x1f60 }, /* 0x21800 */ { 3421, 0x0000 }, { 3421, 0x0000 }, { 3421, 0x2701 }, { 3426, 0x0e00 }, { 3429, 0x0021 }, { 3431, 0x4004 }, { 3433, 0x001e }, { 3437, 0x0880 }, { 3439, 0x0038 }, { 3442, 0xc000 }, { 3444, 0x0007 }, { 3447, 0xc000 }, { 3449, 0x0000 }, { 3449, 0x03c2 }, { 3454, 0x0000 }, { 3454, 0x0400 }, /* 0x21900 */ { 3455, 0x0038 }, { 3458, 0x1027 }, { 3463, 0x0084 }, { 3465, 0x0800 }, { 3466, 0x0010 }, { 3467, 0x0100 }, { 3468, 0x0400 }, { 3469, 0x1000 }, { 3470, 0x0108 }, { 3472, 0x0040 }, { 3473, 0x0000 }, { 3473, 0x0000 }, { 3473, 0x0000 }, { 3473, 0x0800 }, { 3474, 0x0000 }, { 3474, 0x0008 }, /* 0x21a00 */ { 3475, 0x0000 }, { 3475, 0x0000 }, { 3475, 0x2000 }, { 3476, 0x0010 }, { 3477, 0x0820 }, { 3479, 0x0000 }, { 3479, 0x0000 }, { 3479, 0x0000 }, { 3479, 0x0000 }, { 3479, 0x0000 }, { 3479, 0x0000 }, { 3479, 0x0000 }, { 3479, 0x0000 }, { 3479, 0x0000 }, { 3479, 0x0000 }, { 3479, 0x0000 }, /* 0x21b00 */ { 3479, 0x0000 }, { 3479, 0x0000 }, { 3479, 0x0000 }, { 3479, 0x0000 }, { 3479, 0x0010 }, { 3480, 0x0000 }, { 3480, 0x0000 }, { 3480, 0x0000 }, { 3480, 0x0000 }, { 3480, 0x0000 }, { 3480, 0x0000 }, { 3480, 0x0000 }, { 3480, 0x0006 }, { 3482, 0x0000 }, { 3482, 0x0000 }, { 3482, 0x0000 }, /* 0x21c00 */ { 3482, 0x0000 }, { 3482, 0x0000 }, { 3482, 0x0400 }, { 3483, 0x0000 }, { 3483, 0x0000 }, { 3483, 0x0000 }, { 3483, 0x0000 }, { 3483, 0x0001 }, { 3484, 0x0000 }, { 3484, 0x0000 }, { 3484, 0x1024 }, { 3487, 0x0000 }, { 3487, 0x0000 }, { 3487, 0x0000 }, { 3487, 0x0000 }, { 3487, 0x0000 }, /* 0x21d00 */ { 3487, 0x0000 }, { 3487, 0x0000 }, { 3487, 0x0000 }, { 3487, 0x0000 }, { 3487, 0x0040 }, { 3488, 0x0000 }, { 3488, 0x0000 }, { 3488, 0x0000 }, { 3488, 0x0000 }, { 3488, 0x0001 }, { 3489, 0x0000 }, { 3489, 0x0400 }, { 3490, 0x0400 }, { 3491, 0x0002 }, { 3492, 0x0800 }, { 3493, 0x0200 }, /* 0x21e00 */ { 3494, 0x0000 }, { 3494, 0x1000 }, { 3495, 0x0000 }, { 3495, 0x2080 }, { 3497, 0x0000 }, { 3497, 0x0000 }, { 3497, 0x0000 }, { 3497, 0x0000 }, { 3497, 0x0200 }, { 3498, 0x0000 }, { 3498, 0x0110 }, { 3500, 0x0000 }, { 3500, 0x0100 }, { 3501, 0x0020 }, { 3502, 0x0000 }, { 3502, 0x0000 }, /* 0x21f00 */ { 3502, 0x8000 }, { 3503, 0x0020 }, { 3504, 0x0000 }, { 3504, 0x0000 }, { 3504, 0x0000 }, { 3504, 0x0000 }, { 3504, 0x0400 }, { 3505, 0x0000 }, { 3505, 0x0000 }, { 3505, 0x4000 }, { 3506, 0x0002 }, { 3507, 0x0000 }, { 3507, 0x0000 }, { 3507, 0x0000 }, { 3507, 0x0100 }, { 3508, 0x0000 }, /* 0x22000 */ { 3508, 0x0000 }, { 3508, 0x0000 }, { 3508, 0x0000 }, { 3508, 0x0000 }, { 3508, 0x0220 }, { 3510, 0x0000 }, { 3510, 0x0000 }, { 3510, 0x0000 }, { 3510, 0x0000 }, { 3510, 0x0400 }, { 3511, 0x0000 }, { 3511, 0x0000 }, { 3511, 0x0080 }, { 3512, 0x0000 }, { 3512, 0x0000 }, { 3512, 0x1000 }, /* 0x22100 */ { 3513, 0x0000 }, { 3513, 0x0000 }, { 3513, 0x0400 }, { 3514, 0x0000 }, { 3514, 0x0000 }, { 3514, 0x0800 }, { 3515, 0x0000 }, { 3515, 0x0408 }, { 3517, 0x0000 }, { 3517, 0x0000 }, { 3517, 0x0002 }, { 3518, 0x0000 }, { 3518, 0x0008 }, { 3519, 0x0000 }, { 3519, 0x0000 }, { 3519, 0x0000 }, /* 0x22200 */ { 3519, 0x0100 }, { 3520, 0x0000 }, { 3520, 0x0000 }, { 3520, 0x0000 }, { 3520, 0x0000 }, { 3520, 0x0000 }, { 3520, 0x0000 }, { 3520, 0x1000 }, { 3521, 0x0000 }, { 3521, 0x0000 }, { 3521, 0x0000 }, { 3521, 0x0000 }, { 3521, 0x0000 }, { 3521, 0x0000 }, { 3521, 0x0000 }, { 3521, 0x0000 }, /* 0x22300 */ { 3521, 0x0000 }, { 3521, 0x0000 }, { 3521, 0x0022 }, { 3523, 0x0000 }, { 3523, 0x0000 }, { 3523, 0x0000 }, { 3523, 0x0000 }, { 3523, 0x0000 }, { 3523, 0x0000 }, { 3523, 0x0000 }, { 3523, 0x0000 }, { 3523, 0x2000 }, { 3524, 0x0000 }, { 3524, 0x0081 }, { 3526, 0x0000 }, { 3526, 0x0400 }, /* 0x22400 */ { 3527, 0x0000 }, { 3527, 0x0000 }, { 3527, 0x0000 }, { 3527, 0x0000 }, { 3527, 0x0000 }, { 3527, 0x0000 }, { 3527, 0x0020 }, { 3528, 0x0002 }, { 3529, 0x0800 }, { 3530, 0x0002 }, { 3531, 0x0000 }, { 3531, 0x0001 }, { 3532, 0x0000 }, { 3532, 0x0000 }, { 3532, 0x2000 }, { 3533, 0x0000 }, /* 0x22500 */ { 3533, 0x0000 }, { 3533, 0x0808 }, { 3535, 0x0000 }, { 3535, 0x0001 }, { 3536, 0x0000 }, { 3536, 0x0010 }, { 3537, 0x0000 }, { 3537, 0x0000 }, { 3537, 0x2000 }, { 3538, 0x0000 }, { 3538, 0x8000 }, { 3539, 0x4000 }, { 3540, 0x0000 }, { 3540, 0x0000 }, { 3540, 0x0000 }, { 3540, 0x0000 }, /* 0x22600 */ { 3540, 0x0000 }, { 3540, 0x1800 }, { 3542, 0x0800 }, { 3543, 0x0000 }, { 3543, 0x0000 }, { 3543, 0x0000 }, { 3543, 0x0100 }, { 3544, 0x0400 }, { 3545, 0x0000 }, { 3545, 0x0140 }, { 3547, 0x0000 }, { 3547, 0x0000 }, { 3547, 0x0000 }, { 3547, 0x0000 }, { 3547, 0x0000 }, { 3547, 0x0070 }, /* 0x22700 */ { 3550, 0x0000 }, { 3550, 0x8810 }, { 3553, 0x0400 }, { 3554, 0x0000 }, { 3554, 0x0000 }, { 3554, 0x0000 }, { 3554, 0x0000 }, { 3554, 0x0020 }, { 3555, 0x0002 }, { 3556, 0x0000 }, { 3556, 0x0000 }, { 3556, 0x0030 }, { 3558, 0x2000 }, { 3559, 0x0000 }, { 3559, 0x0000 }, { 3559, 0x0000 }, /* 0x22800 */ { 3559, 0x0008 }, { 3560, 0x0000 }, { 3560, 0x0000 }, { 3560, 0x0000 }, { 3560, 0x0000 }, { 3560, 0x8000 }, { 3561, 0x0001 }, { 3562, 0x0002 }, { 3563, 0x0000 }, { 3563, 0x0000 }, { 3563, 0x2000 }, { 3564, 0x0000 }, { 3564, 0x0002 }, { 3565, 0x0000 }, { 3565, 0x0000 }, { 3565, 0x0080 }, /* 0x22900 */ { 3566, 0x0000 }, { 3566, 0x0000 }, { 3566, 0x0040 }, { 3567, 0x0200 }, { 3568, 0x8000 }, { 3569, 0x0000 }, { 3569, 0x0880 }, { 3571, 0x0000 }, { 3571, 0x0001 }, { 3572, 0x0008 }, { 3573, 0x0000 }, { 3573, 0x0000 }, { 3573, 0x0000 }, { 3573, 0x0000 }, { 3573, 0x0000 }, { 3573, 0x0000 }, /* 0x22a00 */ { 3573, 0x0000 }, { 3573, 0x0000 }, { 3573, 0x0000 }, { 3573, 0x0000 }, { 3573, 0x0000 }, { 3573, 0x0000 }, { 3573, 0x0040 }, { 3574, 0x0000 }, { 3574, 0x0000 }, { 3574, 0x0000 }, { 3574, 0x0000 }, { 3574, 0x0000 }, { 3574, 0x8000 }, { 3575, 0x0020 }, { 3576, 0x0140 }, { 3578, 0x0000 }, /* 0x22b00 */ { 3578, 0x4000 }, { 3579, 0x0000 }, { 3579, 0x0004 }, { 3580, 0x8000 }, { 3581, 0x0008 }, { 3582, 0x0000 }, { 3582, 0x0400 }, { 3583, 0x0000 }, { 3583, 0x0000 }, { 3583, 0x0000 }, { 3583, 0x0000 }, { 3583, 0x0000 }, { 3583, 0x4400 }, { 3585, 0x0000 }, { 3585, 0x0000 }, { 3585, 0x0000 }, /* 0x22c00 */ { 3585, 0x0000 }, { 3585, 0x0000 }, { 3585, 0x00c0 }, { 3587, 0x0100 }, { 3588, 0x1000 }, { 3589, 0x0022 }, { 3591, 0x0004 }, { 3592, 0x0000 }, { 3592, 0x0100 }, { 3593, 0x0800 }, { 3594, 0x0202 }, { 3596, 0x0084 }, { 3598, 0x0244 }, { 3601, 0x0000 }, { 3601, 0x0000 }, { 3601, 0x0000 }, /* 0x22d00 */ { 3601, 0x0180 }, { 3603, 0x0004 }, { 3604, 0x0000 }, { 3604, 0x0000 }, { 3604, 0x1010 }, { 3606, 0x0000 }, { 3606, 0x0080 }, { 3607, 0x0000 }, { 3607, 0x2000 }, { 3608, 0x0020 }, { 3609, 0x0019 }, { 3612, 0x0080 }, { 3613, 0x0000 }, { 3613, 0x0000 }, { 3613, 0x4000 }, { 3614, 0x0000 }, /* 0x22e00 */ { 3614, 0x2000 }, { 3615, 0x0000 }, { 3615, 0x0000 }, { 3615, 0x0040 }, { 3616, 0x0004 }, { 3617, 0x0000 }, { 3617, 0x0000 }, { 3617, 0x0100 }, { 3618, 0x0800 }, { 3619, 0x0000 }, { 3619, 0x0000 }, { 3619, 0x0008 }, { 3620, 0x0000 }, { 3620, 0x0000 }, { 3620, 0x8000 }, { 3621, 0x0000 }, /* 0x22f00 */ { 3621, 0x0000 }, { 3621, 0x0000 }, { 3621, 0x0000 }, { 3621, 0x0000 }, { 3621, 0x0000 }, { 3621, 0x0000 }, { 3621, 0x0000 }, { 3621, 0x0010 }, { 3622, 0x0000 }, { 3622, 0x0000 }, { 3622, 0x0000 }, { 3622, 0x0000 }, { 3622, 0x1000 }, { 3623, 0x0000 }, { 3623, 0x0008 }, { 3624, 0x0000 }, /* 0x23000 */ { 3624, 0x0000 }, { 3624, 0x0000 }, { 3624, 0x0000 }, { 3624, 0x0008 }, { 3625, 0x0810 }, { 3627, 0x0000 }, { 3627, 0x0040 }, { 3628, 0x6000 }, { 3630, 0x4000 }, { 3631, 0x0000 }, { 3631, 0x0000 }, { 3631, 0x1080 }, { 3633, 0x0000 }, { 3633, 0x0400 }, { 3634, 0x0000 }, { 3634, 0x0000 }, /* 0x23100 */ { 3634, 0x0008 }, { 3635, 0x0000 }, { 3635, 0x0000 }, { 3635, 0x2000 }, { 3636, 0x0000 }, { 3636, 0x0000 }, { 3636, 0x0000 }, { 3636, 0x2000 }, { 3637, 0x0004 }, { 3638, 0x0000 }, { 3638, 0x0030 }, { 3640, 0x0008 }, { 3641, 0x0300 }, { 3643, 0x0000 }, { 3643, 0x0000 }, { 3643, 0x0380 }, /* 0x23200 */ { 3646, 0x8000 }, { 3647, 0x0000 }, { 3647, 0x8020 }, { 3649, 0x001e }, { 3653, 0x0000 }, { 3653, 0x0000 }, { 3653, 0x0004 }, { 3654, 0x0000 }, { 3654, 0x0600 }, { 3656, 0x0000 }, { 3656, 0x3800 }, { 3659, 0x0000 }, { 3659, 0x0000 }, { 3659, 0x0004 }, { 3660, 0x0003 }, { 3662, 0x0000 }, /* 0x23300 */ { 3662, 0x0401 }, { 3664, 0x8000 }, { 3665, 0x0000 }, { 3665, 0x0000 }, { 3665, 0x0000 }, { 3665, 0x0000 }, { 3665, 0x0000 }, { 3665, 0x0000 }, { 3665, 0x0000 }, { 3665, 0x0000 }, { 3665, 0x0000 }, { 3665, 0x0010 }, { 3666, 0x1000 }, { 3667, 0x4000 }, { 3668, 0x0040 }, { 3669, 0x4430 }, /* 0x23400 */ { 3673, 0x0001 }, { 3674, 0x0000 }, { 3674, 0x0000 }, { 3674, 0x8000 }, { 3675, 0x0000 }, { 3675, 0x0001 }, { 3676, 0x8000 }, { 3677, 0x0004 }, { 3678, 0x0000 }, { 3678, 0x0000 }, { 3678, 0x0000 }, { 3678, 0x0000 }, { 3678, 0x0000 }, { 3678, 0x0000 }, { 3678, 0x0020 }, { 3679, 0x0000 }, /* 0x23500 */ { 3679, 0x0000 }, { 3679, 0x0200 }, { 3680, 0x0000 }, { 3680, 0x0001 }, { 3681, 0x0000 }, { 3681, 0x0400 }, { 3682, 0x0080 }, { 3683, 0x0000 }, { 3683, 0x0000 }, { 3683, 0x1220 }, { 3686, 0x0000 }, { 3686, 0x0000 }, { 3686, 0xe000 }, { 3689, 0x0000 }, { 3689, 0x0000 }, { 3689, 0x0008 }, /* 0x23600 */ { 3690, 0x0001 }, { 3691, 0x0400 }, { 3692, 0x0000 }, { 3692, 0x1000 }, { 3693, 0x0001 }, { 3694, 0x8200 }, { 3696, 0x0000 }, { 3696, 0x0080 }, { 3697, 0x0000 }, { 3697, 0x0000 }, { 3697, 0x2040 }, { 3699, 0x0400 }, { 3700, 0x0000 }, { 3700, 0x8000 }, { 3701, 0x4000 }, { 3702, 0x0000 }, /* 0x23700 */ { 3702, 0x0008 }, { 3703, 0x0040 }, { 3704, 0xa001 }, { 3707, 0x8000 }, { 3708, 0x0000 }, { 3708, 0x0000 }, { 3708, 0x0040 }, { 3709, 0x0000 }, { 3709, 0x0002 }, { 3710, 0x0000 }, { 3710, 0x0004 }, { 3711, 0x1000 }, { 3712, 0x0004 }, { 3713, 0x00e0 }, { 3716, 0x0000 }, { 3716, 0x0000 }, /* 0x23800 */ { 3716, 0x0000 }, { 3716, 0x0000 }, { 3716, 0x0000 }, { 3716, 0x0400 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, /* 0x23900 */ { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0000 }, { 3717, 0x0004 }, { 3718, 0x0000 }, { 3718, 0x0000 }, { 3718, 0x0000 }, /* 0x23a00 */ { 3718, 0x0000 }, { 3718, 0x0000 }, { 3718, 0x0000 }, { 3718, 0x0000 }, { 3718, 0x0000 }, { 3718, 0x0000 }, { 3718, 0x0000 }, { 3718, 0x0000 }, { 3718, 0x0000 }, { 3718, 0x0000 }, { 3718, 0x0080 }, { 3719, 0x0000 }, { 3719, 0x0000 }, { 3719, 0x0800 }, { 3720, 0x4000 }, { 3721, 0x0400 }, /* 0x23b00 */ { 3722, 0x0000 }, { 3722, 0x0000 }, { 3722, 0x0000 }, { 3722, 0x0000 }, { 3722, 0x0000 }, { 3722, 0x0400 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, /* 0x23c00 */ { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0e00 }, { 3726, 0x0000 }, { 3726, 0x00a0 }, { 3728, 0x0380 }, { 3731, 0x0000 }, { 3731, 0x0000 }, { 3731, 0xf000 }, /* 0x23d00 */ { 3735, 0x0000 }, { 3735, 0x0000 }, { 3735, 0x0000 }, { 3735, 0x0000 }, { 3735, 0x0001 }, { 3736, 0x0800 }, { 3737, 0x0000 }, { 3737, 0x4000 }, { 3738, 0x8000 }, { 3739, 0x0000 }, { 3739, 0x0000 }, { 3739, 0x3fc0 }, { 3747, 0x0000 }, { 3747, 0x0000 }, { 3747, 0x0008 }, { 3748, 0x0100 }, /* 0x23e00 */ { 3749, 0x0000 }, { 3749, 0x0002 }, { 3750, 0xf000 }, { 3754, 0x0203 }, { 3757, 0x0000 }, { 3757, 0x0000 }, { 3757, 0x0000 }, { 3757, 0x0000 }, { 3757, 0x0f00 }, { 3761, 0x0000 }, { 3761, 0x0000 }, { 3761, 0x8200 }, { 3763, 0x0000 }, { 3763, 0x0080 }, { 3764, 0x0000 }, { 3764, 0x1f80 }, /* 0x23f00 */ { 3770, 0x0000 }, { 3770, 0x0000 }, { 3770, 0x0000 }, { 3770, 0x0020 }, { 3771, 0x0402 }, { 3773, 0x0000 }, { 3773, 0x0000 }, { 3773, 0x8000 }, { 3774, 0x8007 }, { 3778, 0x0000 }, { 3778, 0x0000 }, { 3778, 0x0090 }, { 3780, 0x0021 }, { 3782, 0x0000 }, { 3782, 0xf800 }, { 3787, 0x0001 }, /* 0x24000 */ { 3788, 0x0000 }, { 3788, 0x0002 }, { 3789, 0x0000 }, { 3789, 0x3e00 }, { 3794, 0x0000 }, { 3794, 0x0080 }, { 3795, 0x0000 }, { 3795, 0x0000 }, { 3795, 0x3820 }, { 3799, 0x0002 }, { 3800, 0x0000 }, { 3800, 0x0000 }, { 3800, 0x0200 }, { 3801, 0x0000 }, { 3801, 0x0002 }, { 3802, 0x0000 }, /* 0x24100 */ { 3802, 0x8010 }, { 3804, 0x0200 }, { 3805, 0x0000 }, { 3805, 0x8000 }, { 3806, 0x0011 }, { 3808, 0x90e0 }, { 3813, 0x0000 }, { 3813, 0x0480 }, { 3815, 0x0000 }, { 3815, 0x0000 }, { 3815, 0x1038 }, { 3819, 0x0020 }, { 3820, 0x2000 }, { 3821, 0x0000 }, { 3821, 0x0004 }, { 3822, 0x1000 }, /* 0x24200 */ { 3823, 0x0000 }, { 3823, 0x0800 }, { 3824, 0x0000 }, { 3824, 0x0000 }, { 3824, 0x0800 }, { 3825, 0x0240 }, { 3827, 0x0000 }, { 3827, 0x01c0 }, { 3830, 0x0010 }, { 3831, 0x0028 }, { 3833, 0x0020 }, { 3834, 0x0000 }, { 3834, 0x0602 }, { 3837, 0x0000 }, { 3837, 0x4000 }, { 3838, 0x0400 }, /* 0x24300 */ { 3839, 0x2000 }, { 3840, 0x0400 }, { 3841, 0x0000 }, { 3841, 0x0010 }, { 3842, 0x0100 }, { 3843, 0x0000 }, { 3843, 0x003c }, { 3847, 0x0000 }, { 3847, 0x1000 }, { 3848, 0x1040 }, { 3850, 0x0000 }, { 3850, 0x2000 }, { 3851, 0x0002 }, { 3852, 0x0000 }, { 3852, 0x0600 }, { 3854, 0x0104 }, /* 0x24400 */ { 3856, 0x0010 }, { 3857, 0x0000 }, { 3857, 0x0000 }, { 3857, 0x0060 }, { 3859, 0x0000 }, { 3859, 0x0c00 }, { 3861, 0x0000 }, { 3861, 0x0008 }, { 3862, 0x0180 }, { 3864, 0x0000 }, { 3864, 0x0000 }, { 3864, 0x1200 }, { 3866, 0x4000 }, { 3867, 0x0048 }, { 3869, 0x0000 }, { 3869, 0x0000 }, /* 0x24500 */ { 3869, 0x0000 }, { 3869, 0x0000 }, { 3869, 0x0002 }, { 3870, 0x0000 }, { 3870, 0x0000 }, { 3870, 0x0000 }, { 3870, 0x0000 }, { 3870, 0x0100 }, { 3871, 0x0000 }, { 3871, 0x0000 }, { 3871, 0x0000 }, { 3871, 0x0000 }, { 3871, 0x0100 }, { 3872, 0x0000 }, { 3872, 0x0000 }, { 3872, 0x0000 }, /* 0x24600 */ { 3872, 0x0000 }, { 3872, 0x0100 }, { 3873, 0x0400 }, { 3874, 0x0000 }, { 3874, 0x0000 }, { 3874, 0x0000 }, { 3874, 0x0020 }, { 3875, 0x0010 }, { 3876, 0x0000 }, { 3876, 0x0080 }, { 3877, 0x0000 }, { 3877, 0x0000 }, { 3877, 0x0000 }, { 3877, 0x0010 }, { 3878, 0x0000 }, { 3878, 0x0000 }, /* 0x24700 */ { 3878, 0x0040 }, { 3879, 0x0000 }, { 3879, 0x8020 }, { 3881, 0x0000 }, { 3881, 0x0000 }, { 3881, 0x0000 }, { 3881, 0x0000 }, { 3881, 0x0000 }, { 3881, 0x8000 }, { 3882, 0x0000 }, { 3882, 0x0000 }, { 3882, 0x0000 }, { 3882, 0x0000 }, { 3882, 0x0000 }, { 3882, 0x0001 }, { 3883, 0x0000 }, /* 0x24800 */ { 3883, 0x0000 }, { 3883, 0x0004 }, { 3884, 0x0008 }, { 3885, 0x0000 }, { 3885, 0x0000 }, { 3885, 0x0000 }, { 3885, 0x0000 }, { 3885, 0x0000 }, { 3885, 0x0004 }, { 3886, 0x0000 }, { 3886, 0x0000 }, { 3886, 0x0000 }, { 3886, 0x0000 }, { 3886, 0x0000 }, { 3886, 0x0200 }, { 3887, 0x880f }, /* 0x24900 */ { 3893, 0x1003 }, { 3896, 0x02c0 }, { 3899, 0x8000 }, { 3900, 0xc018 }, { 3904, 0x000f }, { 3908, 0x0000 }, { 3908, 0x000c }, { 3910, 0x8070 }, { 3914, 0xff04 }, { 3923, 0x0010 }, { 3924, 0x3a90 }, { 3930, 0x0f80 }, { 3935, 0x0020 }, { 3936, 0xc401 }, { 3940, 0x3028 }, { 3944, 0x0bc0 }, /* 0x24a00 */ { 3949, 0x4000 }, { 3950, 0x0024 }, { 3952, 0x07fe }, { 3962, 0x4000 }, { 3963, 0xc424 }, { 3968, 0x2003 }, { 3971, 0x00e0 }, { 3974, 0x0782 }, { 3979, 0x1000 }, { 3980, 0x0078 }, { 3984, 0x00f0 }, { 3988, 0x1c0e }, { 3994, 0x0481 }, { 3997, 0x8002 }, { 3999, 0x0204 }, { 4001, 0x0000 }, /* 0x24b00 */ { 4001, 0x0000 }, { 4001, 0x0000 }, { 4001, 0x0000 }, { 4001, 0x0000 }, { 4001, 0x0000 }, { 4001, 0x0000 }, { 4001, 0x4000 }, { 4002, 0x0000 }, { 4002, 0x0000 }, { 4002, 0x0000 }, { 4002, 0x0000 }, { 4002, 0x0000 }, { 4002, 0x0000 }, { 4002, 0x0000 }, { 4002, 0x0000 }, { 4002, 0x0020 }, /* 0x24c00 */ { 4003, 0x0200 }, { 4004, 0x0000 }, { 4004, 0x0000 }, { 4004, 0x0000 }, { 4004, 0x0000 }, { 4004, 0x0000 }, { 4004, 0x0000 }, { 4004, 0x0000 }, { 4004, 0x0000 }, { 4004, 0xc000 }, { 4006, 0x0000 }, { 4006, 0x0000 }, { 4006, 0x0200 }, { 4007, 0x0200 }, { 4008, 0x0000 }, { 4008, 0x0000 }, /* 0x24d00 */ { 4008, 0x0040 }, { 4009, 0x0008 }, { 4010, 0x0000 }, { 4010, 0x0000 }, { 4010, 0x0000 }, { 4010, 0x0000 }, { 4010, 0x0000 }, { 4010, 0x0000 }, { 4010, 0x0000 }, { 4010, 0x0000 }, { 4010, 0x0000 }, { 4010, 0x0100 }, { 4011, 0x0000 }, { 4011, 0x0000 }, { 4011, 0x0c00 }, { 4013, 0x0000 }, /* 0x24e00 */ { 4013, 0x0000 }, { 4013, 0x0000 }, { 4013, 0x0000 }, { 4013, 0x0800 }, { 4014, 0x0000 }, { 4014, 0x0001 }, { 4015, 0x0000 }, { 4015, 0x0000 }, { 4015, 0x0000 }, { 4015, 0x0000 }, { 4015, 0x00a0 }, { 4017, 0x0000 }, { 4017, 0x0000 }, { 4017, 0x0000 }, { 4017, 0x0000 }, { 4017, 0x0000 }, /* 0x24f00 */ { 4017, 0x4000 }, { 4018, 0x0000 }, { 4018, 0x0000 }, { 4018, 0x0000 }, { 4018, 0x0000 }, { 4018, 0x1000 }, { 4019, 0x0000 }, { 4019, 0x0000 }, { 4019, 0x0044 }, { 4021, 0x0480 }, { 4023, 0x0200 }, { 4024, 0x0100 }, { 4025, 0x0004 }, { 4026, 0x0000 }, { 4026, 0x0000 }, { 4026, 0x0000 }, /* 0x25000 */ { 4026, 0x0000 }, { 4026, 0x0000 }, { 4026, 0x1000 }, { 4027, 0x0000 }, { 4027, 0x0000 }, { 4027, 0x0004 }, { 4028, 0x0000 }, { 4028, 0x0000 }, { 4028, 0x0000 }, { 4028, 0x2000 }, { 4029, 0x0000 }, { 4029, 0x0000 }, { 4029, 0x0000 }, { 4029, 0x0000 }, { 4029, 0x0000 }, { 4029, 0x0000 }, /* 0x25100 */ { 4029, 0x0000 }, { 4029, 0x0000 }, { 4029, 0x0800 }, { 4030, 0x0000 }, { 4030, 0x0100 }, { 4031, 0x0000 }, { 4031, 0x0000 }, { 4031, 0x6000 }, { 4033, 0x0000 }, { 4033, 0x0000 }, { 4033, 0x0000 }, { 4033, 0x0000 }, { 4033, 0x0000 }, { 4033, 0x0000 }, { 4033, 0x00c8 }, { 4036, 0x0000 }, /* 0x25200 */ { 4036, 0x0000 }, { 4036, 0x0000 }, { 4036, 0x0003 }, { 4038, 0x0000 }, { 4038, 0x0000 }, { 4038, 0x0001 }, { 4039, 0x0000 }, { 4039, 0x0000 }, { 4039, 0x0000 }, { 4039, 0x0200 }, { 4040, 0x0000 }, { 4040, 0x0000 }, { 4040, 0x0080 }, { 4041, 0x0100 }, { 4042, 0x0000 }, { 4042, 0x0000 }, /* 0x25300 */ { 4042, 0x4000 }, { 4043, 0x000a }, { 4045, 0x0000 }, { 4045, 0x0000 }, { 4045, 0x0000 }, { 4045, 0x0000 }, { 4045, 0x0000 }, { 4045, 0x0000 }, { 4045, 0x0000 }, { 4045, 0x0000 }, { 4045, 0x0000 }, { 4045, 0x0000 }, { 4045, 0x0000 }, { 4045, 0x0000 }, { 4045, 0x0000 }, { 4045, 0x0000 }, /* 0x25400 */ { 4045, 0x0000 }, { 4045, 0x0200 }, { 4046, 0x8020 }, { 4048, 0x0001 }, { 4049, 0x0040 }, { 4050, 0x0000 }, { 4050, 0x5000 }, { 4052, 0x0000 }, { 4052, 0x0000 }, { 4052, 0x0000 }, { 4052, 0x0000 }, { 4052, 0x0000 }, { 4052, 0x0000 }, { 4052, 0x0000 }, { 4052, 0x0000 }, { 4052, 0x0000 }, /* 0x25500 */ { 4052, 0x0000 }, { 4052, 0x0000 }, { 4052, 0x0000 }, { 4052, 0x8022 }, { 4055, 0x0000 }, { 4055, 0x7800 }, { 4059, 0x0064 }, { 4062, 0x0000 }, { 4062, 0x8012 }, { 4065, 0x0000 }, { 4065, 0x0000 }, { 4065, 0x0200 }, { 4066, 0x0000 }, { 4066, 0x0820 }, { 4068, 0x0001 }, { 4069, 0x0000 }, /* 0x25600 */ { 4069, 0x0020 }, { 4070, 0x0000 }, { 4070, 0x0000 }, { 4070, 0x0020 }, { 4071, 0x0000 }, { 4071, 0x0002 }, { 4072, 0x0000 }, { 4072, 0x0000 }, { 4072, 0x0008 }, { 4073, 0x0000 }, { 4073, 0x0000 }, { 4073, 0x0000 }, { 4073, 0x0000 }, { 4073, 0x0000 }, { 4073, 0x0008 }, { 4074, 0x0040 }, /* 0x25700 */ { 4075, 0x0040 }, { 4076, 0x2000 }, { 4077, 0x0020 }, { 4078, 0x2000 }, { 4079, 0x0000 }, { 4079, 0x0000 }, { 4079, 0x0000 }, { 4079, 0x0004 }, { 4080, 0x0000 }, { 4080, 0x0000 }, { 4080, 0x0000 }, { 4080, 0x0000 }, { 4080, 0x0080 }, { 4081, 0x8000 }, { 4082, 0x0003 }, { 4084, 0x0000 }, /* 0x25800 */ { 4084, 0x0000 }, { 4084, 0x0000 }, { 4084, 0x0000 }, { 4084, 0x0000 }, { 4084, 0x0000 }, { 4084, 0x2080 }, { 4086, 0x0000 }, { 4086, 0x0004 }, { 4087, 0x0000 }, { 4087, 0x0000 }, { 4087, 0x0000 }, { 4087, 0x0000 }, { 4087, 0x0100 }, { 4088, 0x0000 }, { 4088, 0x0002 }, { 4089, 0x0000 }, /* 0x25900 */ { 4089, 0x0008 }, { 4090, 0x0000 }, { 4090, 0x0000 }, { 4090, 0x0000 }, { 4090, 0x0040 }, { 4091, 0x0040 }, { 4092, 0x0000 }, { 4092, 0x0000 }, { 4092, 0x0000 }, { 4092, 0x0000 }, { 4092, 0x1000 }, { 4093, 0x0000 }, { 4093, 0x1000 }, { 4094, 0x0000 }, { 4094, 0x0000 }, { 4094, 0x0000 }, /* 0x25a00 */ { 4094, 0x0000 }, { 4094, 0x0000 }, { 4094, 0x0000 }, { 4094, 0x0000 }, { 4094, 0x0000 }, { 4094, 0x0000 }, { 4094, 0x0000 }, { 4094, 0x0000 }, { 4094, 0x0000 }, { 4094, 0x1020 }, { 4096, 0xc000 }, { 4098, 0x0000 }, { 4098, 0x0000 }, { 4098, 0x0000 }, { 4098, 0x0200 }, { 4099, 0x0000 }, /* 0x25b00 */ { 4099, 0x0000 }, { 4099, 0x0000 }, { 4099, 0x0000 }, { 4099, 0x0000 }, { 4099, 0x0000 }, { 4099, 0x0000 }, { 4099, 0x0000 }, { 4099, 0x0010 }, { 4100, 0x0200 }, { 4101, 0x0000 }, { 4101, 0x0000 }, { 4101, 0x0018 }, { 4103, 0x0040 }, { 4104, 0x0000 }, { 4104, 0x0110 }, { 4106, 0x0000 }, /* 0x25c00 */ { 4106, 0x0042 }, { 4108, 0x0000 }, { 4108, 0x0002 }, { 4109, 0x0000 }, { 4109, 0x0400 }, { 4110, 0x0000 }, { 4110, 0x0020 }, { 4111, 0x0000 }, { 4111, 0x0000 }, { 4111, 0x0002 }, { 4112, 0x0000 }, { 4112, 0x0000 }, { 4112, 0x0003 }, { 4114, 0x0000 }, { 4114, 0x0000 }, { 4114, 0x4000 }, /* 0x25d00 */ { 4115, 0x0000 }, { 4115, 0x0000 }, { 4115, 0x0001 }, { 4116, 0x0000 }, { 4116, 0x0008 }, { 4117, 0x0000 }, { 4117, 0x0000 }, { 4117, 0x0000 }, { 4117, 0x0000 }, { 4117, 0x0000 }, { 4117, 0x0000 }, { 4117, 0x0000 }, { 4117, 0x0000 }, { 4117, 0x0000 }, { 4117, 0x0000 }, { 4117, 0x0000 }, /* 0x25e00 */ { 4117, 0x4000 }, { 4118, 0x0000 }, { 4118, 0x0000 }, { 4118, 0x0000 }, { 4118, 0x0200 }, { 4119, 0x0000 }, { 4119, 0x0000 }, { 4119, 0x0000 }, { 4119, 0x000e }, { 4122, 0x0000 }, { 4122, 0x0040 }, { 4123, 0x1000 }, { 4124, 0x0000 }, { 4124, 0x0180 }, { 4126, 0x0000 }, { 4126, 0x0000 }, /* 0x25f00 */ { 4126, 0x0000 }, { 4126, 0x0400 }, { 4127, 0x0000 }, { 4127, 0x0000 }, { 4127, 0x0800 }, { 4128, 0x0000 }, { 4128, 0x0000 }, { 4128, 0x0000 }, { 4128, 0x0000 }, { 4128, 0x0000 }, { 4128, 0x0000 }, { 4128, 0x0000 }, { 4128, 0x0000 }, { 4128, 0x0000 }, { 4128, 0x0006 }, { 4130, 0x0000 }, /* 0x26000 */ { 4130, 0x0000 }, { 4130, 0x0000 }, { 4130, 0x0200 }, { 4131, 0x0000 }, { 4131, 0x0100 }, { 4132, 0x0000 }, { 4132, 0x0010 }, { 4133, 0x0000 }, { 4133, 0x0008 }, { 4134, 0x0080 }, { 4135, 0x0030 }, { 4137, 0x0000 }, { 4137, 0x0000 }, { 4137, 0x0000 }, { 4137, 0x0000 }, { 4137, 0x0000 }, /* 0x26100 */ { 4137, 0x0004 }, { 4138, 0x0000 }, { 4138, 0x0002 }, { 4139, 0x0000 }, { 4139, 0x0000 }, { 4139, 0x1e00 }, { 4143, 0x0000 }, { 4143, 0x0000 }, { 4143, 0x0000 }, { 4143, 0x0000 }, { 4143, 0x6000 }, { 4145, 0x0004 }, { 4146, 0x0000 }, { 4146, 0x2000 }, { 4147, 0x0000 }, { 4147, 0x0000 }, /* 0x26200 */ { 4147, 0x0000 }, { 4147, 0x0000 }, { 4147, 0x0000 }, { 4147, 0x0000 }, { 4147, 0x0000 }, { 4147, 0x0100 }, { 4148, 0x0c02 }, { 4151, 0x0000 }, { 4151, 0x0000 }, { 4151, 0x0000 }, { 4151, 0x0000 }, { 4151, 0x0000 }, { 4151, 0x0000 }, { 4151, 0x0001 }, { 4152, 0x0000 }, { 4152, 0x0000 }, /* 0x26300 */ { 4152, 0x0000 }, { 4152, 0x0000 }, { 4152, 0x0000 }, { 4152, 0x0020 }, { 4153, 0x1800 }, { 4155, 0x0002 }, { 4156, 0x0000 }, { 4156, 0x0000 }, { 4156, 0x0000 }, { 4156, 0x0000 }, { 4156, 0x0000 }, { 4156, 0x4000 }, { 4157, 0x0000 }, { 4157, 0x0000 }, { 4157, 0x0000 }, { 4157, 0x0120 }, /* 0x26400 */ { 4159, 0x0004 }, { 4160, 0x0007 }, { 4163, 0x0000 }, { 4163, 0x0000 }, { 4163, 0x0400 }, { 4164, 0x0000 }, { 4164, 0x0200 }, { 4165, 0x0000 }, { 4165, 0x2310 }, { 4169, 0x0100 }, { 4170, 0x0000 }, { 4170, 0x0000 }, { 4170, 0x0000 }, { 4170, 0x0000 }, { 4170, 0x0000 }, { 4170, 0x0000 }, /* 0x26500 */ { 4170, 0x0000 }, { 4170, 0x0004 }, { 4171, 0x0000 }, { 4171, 0x0000 }, { 4171, 0x0000 }, { 4171, 0x0000 }, { 4171, 0x0000 }, { 4171, 0x0004 }, { 4172, 0x0000 }, { 4172, 0x0000 }, { 4172, 0x2001 }, { 4174, 0x8000 }, { 4175, 0x0000 }, { 4175, 0x0000 }, { 4175, 0x0000 }, { 4175, 0x0000 }, /* 0x26600 */ { 4175, 0x0000 }, { 4175, 0x0004 }, { 4176, 0x0040 }, { 4177, 0x0000 }, { 4177, 0x0000 }, { 4177, 0x0000 }, { 4177, 0x0000 }, { 4177, 0x0000 }, { 4177, 0x0000 }, { 4177, 0x0000 }, { 4177, 0x8000 }, { 4178, 0x0022 }, { 4180, 0x0000 }, { 4180, 0x0400 }, { 4181, 0x0100 }, { 4182, 0x1000 }, /* 0x26700 */ { 4183, 0x0000 }, { 4183, 0x0040 }, { 4184, 0x0000 }, { 4184, 0x0000 }, { 4184, 0x0002 }, { 4185, 0x0000 }, { 4185, 0x0000 }, { 4185, 0x0000 }, { 4185, 0x0000 }, { 4185, 0x0200 }, { 4186, 0x0000 }, { 4186, 0x0018 }, { 4188, 0x1000 }, { 4189, 0x0000 }, { 4189, 0x0000 }, { 4189, 0x0000 }, /* 0x26800 */ { 4189, 0x0000 }, { 4189, 0x1000 }, { 4190, 0x0000 }, { 4190, 0x0000 }, { 4190, 0x0040 }, { 4191, 0x4000 }, { 4192, 0x4000 }, { 4193, 0x0000 }, { 4193, 0x0500 }, { 4195, 0x0008 }, { 4196, 0x0000 }, { 4196, 0x0000 }, { 4196, 0x0080 }, { 4197, 0x0000 }, { 4197, 0x0000 }, { 4197, 0x0000 }, /* 0x26900 */ { 4197, 0x4000 }, { 4198, 0x0002 }, { 4199, 0x0040 }, { 4200, 0x0200 }, { 4201, 0x0000 }, { 4201, 0x0002 }, { 4202, 0x0000 }, { 4202, 0x0000 }, { 4202, 0x0000 }, { 4202, 0x0000 }, { 4202, 0x0100 }, { 4203, 0x0020 }, { 4204, 0x0000 }, { 4204, 0x0000 }, { 4204, 0x0000 }, { 4204, 0x0404 }, /* 0x26a00 */ { 4206, 0x0000 }, { 4206, 0x0000 }, { 4206, 0x6000 }, { 4208, 0x0010 }, { 4209, 0x0004 }, { 4210, 0x0006 }, { 4212, 0x0000 }, { 4212, 0x0000 }, { 4212, 0x0000 }, { 4212, 0x0000 }, { 4212, 0x0000 }, { 4212, 0x0000 }, { 4212, 0x0000 }, { 4212, 0x0000 }, { 4212, 0x0000 }, { 4212, 0x0000 }, /* 0x26b00 */ { 4212, 0x0420 }, { 4214, 0x0008 }, { 4215, 0x0100 }, { 4216, 0x0000 }, { 4216, 0x0000 }, { 4216, 0x080f }, { 4221, 0x0000 }, { 4221, 0x0020 }, { 4222, 0x0004 }, { 4223, 0x20c0 }, { 4226, 0x0000 }, { 4226, 0x0008 }, { 4227, 0x0001 }, { 4228, 0x0000 }, { 4228, 0x0000 }, { 4228, 0x0080 }, /* 0x26c00 */ { 4229, 0x0000 }, { 4229, 0x0000 }, { 4229, 0x0002 }, { 4230, 0x0000 }, { 4230, 0x0001 }, { 4231, 0x0000 }, { 4231, 0x0000 }, { 4231, 0xc000 }, { 4233, 0x0007 }, { 4236, 0x0000 }, { 4236, 0x0010 }, { 4237, 0x2180 }, { 4240, 0x0009 }, { 4242, 0x0002 }, { 4243, 0x0000 }, { 4243, 0x0000 }, /* 0x26d00 */ { 4243, 0x0000 }, { 4243, 0x0000 }, { 4243, 0x07fc }, { 4252, 0x0000 }, { 4252, 0x0000 }, { 4252, 0x0002 }, { 4253, 0x0000 }, { 4253, 0x0000 }, { 4253, 0x0000 }, { 4253, 0x0000 }, { 4253, 0x40ff }, { 4262, 0x0000 }, { 4262, 0x0000 }, { 4262, 0x1000 }, { 4263, 0x0c00 }, { 4265, 0x0001 }, /* 0x26e00 */ { 4266, 0x00a1 }, { 4269, 0x0004 }, { 4270, 0x0000 }, { 4270, 0x0000 }, { 4270, 0x003c }, { 4274, 0x0000 }, { 4274, 0x4000 }, { 4275, 0x0084 }, { 4277, 0x0010 }, { 4278, 0x0200 }, { 4279, 0x0000 }, { 4279, 0x0000 }, { 4279, 0x0000 }, { 4279, 0x00ff }, { 4287, 0x0000 }, { 4287, 0x0000 }, /* 0x26f00 */ { 4287, 0x0000 }, { 4287, 0x0000 }, { 4287, 0x0040 }, { 4288, 0x0000 }, { 4288, 0x0000 }, { 4288, 0x0000 }, { 4288, 0x0000 }, { 4288, 0x0018 }, { 4290, 0x0000 }, { 4290, 0x8000 }, { 4291, 0x0002 }, { 4292, 0x0000 }, { 4292, 0x0000 }, { 4292, 0xc000 }, { 4294, 0x0000 }, { 4294, 0x0000 }, /* 0x27000 */ { 4294, 0x4000 }, { 4295, 0x0000 }, { 4295, 0x0000 }, { 4295, 0x0000 }, { 4295, 0x0800 }, { 4296, 0x000c }, { 4298, 0x0000 }, { 4298, 0x0000 }, { 4298, 0x0100 }, { 4299, 0x0000 }, { 4299, 0xe000 }, { 4302, 0x0000 }, { 4302, 0x2000 }, { 4303, 0x0000 }, { 4303, 0x0000 }, { 4303, 0x0100 }, /* 0x27100 */ { 4304, 0x1200 }, { 4306, 0x0000 }, { 4306, 0x00c0 }, { 4308, 0x0000 }, { 4308, 0x0000 }, { 4308, 0x0000 }, { 4308, 0x0030 }, { 4310, 0x0020 }, { 4311, 0x0000 }, { 4311, 0x0000 }, { 4311, 0x0000 }, { 4311, 0x0000 }, { 4311, 0x2000 }, { 4312, 0x0000 }, { 4312, 0x0000 }, { 4312, 0x0000 }, /* 0x27200 */ { 4312, 0x0000 }, { 4312, 0x0800 }, { 4313, 0x0000 }, { 4313, 0x0000 }, { 4313, 0x0000 }, { 4313, 0x0000 }, { 4313, 0x0000 }, { 4313, 0x0000 }, { 4313, 0x0821 }, { 4316, 0x0000 }, { 4316, 0x0000 }, { 4316, 0x0044 }, { 4318, 0x0000 }, { 4318, 0x0000 }, { 4318, 0x0040 }, { 4319, 0x0000 }, /* 0x27300 */ { 4319, 0x0000 }, { 4319, 0x0000 }, { 4319, 0x0000 }, { 4319, 0x0000 }, { 4319, 0x0000 }, { 4319, 0x0000 }, { 4319, 0x0000 }, { 4319, 0x0000 }, { 4319, 0x0000 }, { 4319, 0x0400 }, { 4320, 0x0000 }, { 4320, 0x0000 }, { 4320, 0x0000 }, { 4320, 0x0000 }, { 4320, 0x0000 }, { 4320, 0x0000 }, /* 0x27400 */ { 4320, 0x0000 }, { 4320, 0x0000 }, { 4320, 0x0004 }, { 4321, 0x0000 }, { 4321, 0x0000 }, { 4321, 0x0001 }, { 4322, 0x0000 }, { 4322, 0x0000 }, { 4322, 0x0050 }, { 4324, 0x0000 }, { 4324, 0x0000 }, { 4324, 0x0000 }, { 4324, 0x0000 }, { 4324, 0x0000 }, { 4324, 0x0000 }, { 4324, 0x0000 }, /* 0x27500 */ { 4324, 0x0000 }, { 4324, 0x0000 }, { 4324, 0x0000 }, { 4324, 0x0000 }, { 4324, 0x0000 }, { 4324, 0x0000 }, { 4324, 0x0000 }, { 4324, 0x0010 }, { 4325, 0x0000 }, { 4325, 0x0000 }, { 4325, 0x0008 }, { 4326, 0x0000 }, { 4326, 0x0000 }, { 4326, 0x0000 }, { 4326, 0x0011 }, { 4328, 0x6000 }, /* 0x27600 */ { 4330, 0x1080 }, { 4332, 0x0000 }, { 4332, 0x0000 }, { 4332, 0x0204 }, { 4334, 0x0000 }, { 4334, 0x00e0 }, { 4337, 0x0000 }, { 4337, 0x0000 }, { 4337, 0x0000 }, { 4337, 0x0010 }, { 4338, 0x0000 }, { 4338, 0x0000 }, { 4338, 0x0000 }, { 4338, 0x0000 }, { 4338, 0x0000 }, { 4338, 0x0000 }, /* 0x27700 */ { 4338, 0x8000 }, { 4339, 0x0000 }, { 4339, 0x0000 }, { 4339, 0x0060 }, { 4341, 0x0002 }, { 4342, 0x4000 }, { 4343, 0x0000 }, { 4343, 0x0000 }, { 4343, 0x0030 }, { 4345, 0x0000 }, { 4345, 0x0000 }, { 4345, 0x0000 }, { 4345, 0x1000 }, { 4346, 0x0000 }, { 4346, 0x0000 }, { 4346, 0x0000 }, /* 0x27800 */ { 4346, 0x0000 }, { 4346, 0x0000 }, { 4346, 0x0000 }, { 4346, 0x0000 }, { 4346, 0x0000 }, { 4346, 0x0100 }, { 4347, 0x0000 }, { 4347, 0x0001 }, { 4348, 0x0000 }, { 4348, 0x2000 }, { 4349, 0x0000 }, { 4349, 0x0004 }, { 4350, 0x0100 }, { 4351, 0x0000 }, { 4351, 0x0000 }, { 4351, 0x0000 }, /* 0x27900 */ { 4351, 0x0000 }, { 4351, 0x0000 }, { 4351, 0x0010 }, { 4352, 0x0000 }, { 4352, 0x0000 }, { 4352, 0x0000 }, { 4352, 0x0080 }, { 4353, 0x0400 }, { 4354, 0x0000 }, { 4354, 0x0000 }, { 4354, 0x0001 }, { 4355, 0x0000 }, { 4355, 0x0000 }, { 4355, 0x2000 }, { 4356, 0x0000 }, { 4356, 0x2000 }, /* 0x27a00 */ { 4357, 0x4400 }, { 4359, 0x0000 }, { 4359, 0x0000 }, { 4359, 0x4000 }, { 4360, 0x0000 }, { 4360, 0x0208 }, { 4362, 0x0000 }, { 4362, 0x0200 }, { 4363, 0x0010 }, { 4364, 0x0000 }, { 4364, 0x0000 }, { 4364, 0x6000 }, { 4366, 0x0000 }, { 4366, 0x0000 }, { 4366, 0x0000 }, { 4366, 0x0010 }, /* 0x27b00 */ { 4367, 0x0840 }, { 4369, 0x0100 }, { 4370, 0x0000 }, { 4370, 0x0700 }, { 4373, 0x0100 }, { 4374, 0x0000 }, { 4374, 0x0000 }, { 4374, 0x0000 }, { 4374, 0x0000 }, { 4374, 0x0000 }, { 4374, 0x0000 }, { 4374, 0x0000 }, { 4374, 0x0000 }, { 4374, 0x0000 }, { 4374, 0x0000 }, { 4374, 0x0010 }, /* 0x27c00 */ { 4375, 0x0000 }, { 4375, 0x0004 }, { 4376, 0x0000 }, { 4376, 0x0000 }, { 4376, 0x0000 }, { 4376, 0x0000 }, { 4376, 0x0000 }, { 4376, 0x0000 }, { 4376, 0x0000 }, { 4376, 0x0000 }, { 4376, 0x0000 }, { 4376, 0x0000 }, { 4376, 0x0000 }, { 4376, 0x0000 }, { 4376, 0x0000 }, { 4376, 0x0000 }, /* 0x27d00 */ { 4376, 0x0000 }, { 4376, 0x0000 }, { 4376, 0x8000 }, { 4377, 0x0000 }, { 4377, 0x0000 }, { 4377, 0x0018 }, { 4379, 0x0040 }, { 4380, 0x0008 }, { 4381, 0x8010 }, { 4383, 0x0100 }, { 4384, 0x0000 }, { 4384, 0x2000 }, { 4385, 0x0000 }, { 4385, 0x1000 }, { 4386, 0x0000 }, { 4386, 0x0000 }, /* 0x27e00 */ { 4386, 0x0000 }, { 4386, 0x0000 }, { 4386, 0x0000 }, { 4386, 0x0000 }, { 4386, 0xa000 }, { 4388, 0x0000 }, { 4388, 0x0000 }, { 4388, 0x0000 }, { 4388, 0x0000 }, { 4388, 0x0000 }, { 4388, 0x0000 }, { 4388, 0x0000 }, { 4388, 0x0000 }, { 4388, 0x0000 }, { 4388, 0x0000 }, { 4388, 0x0000 }, /* 0x27f00 */ { 4388, 0x0000 }, { 4388, 0x0000 }, { 4388, 0x4000 }, { 4389, 0x0000 }, { 4389, 0x0000 }, { 4389, 0x0000 }, { 4389, 0x0000 }, { 4389, 0x0000 }, { 4389, 0x0000 }, { 4389, 0x0000 }, { 4389, 0x0000 }, { 4389, 0x0000 }, { 4389, 0x0000 }, { 4389, 0x0000 }, { 4389, 0x0000 }, { 4389, 0x0200 }, /* 0x28000 */ { 4390, 0x0204 }, { 4392, 0x4000 }, { 4393, 0x0018 }, { 4395, 0x0000 }, { 4395, 0x0100 }, { 4396, 0x0000 }, { 4396, 0x0000 }, { 4396, 0x0000 }, { 4396, 0x0008 }, { 4397, 0x0001 }, { 4398, 0x0000 }, { 4398, 0x6000 }, { 4400, 0x0000 }, { 4400, 0x0000 }, { 4400, 0x0300 }, { 4402, 0x0010 }, /* 0x28100 */ { 4403, 0x0000 }, { 4403, 0x0000 }, { 4403, 0x4000 }, { 4404, 0x0000 }, { 4404, 0x8000 }, { 4405, 0x2000 }, { 4406, 0x8000 }, { 4407, 0x0000 }, { 4407, 0x0200 }, { 4408, 0x0000 }, { 4408, 0x8000 }, { 4409, 0x1000 }, { 4410, 0x0000 }, { 4410, 0x0000 }, { 4410, 0x0000 }, { 4410, 0x0000 }, /* 0x28200 */ { 4410, 0x0080 }, { 4411, 0x0500 }, { 4413, 0x0000 }, { 4413, 0x0000 }, { 4413, 0x0000 }, { 4413, 0x0040 }, { 4414, 0x0000 }, { 4414, 0x1000 }, { 4415, 0x0000 }, { 4415, 0x0800 }, { 4416, 0x0000 }, { 4416, 0x0000 }, { 4416, 0x2000 }, { 4417, 0x0000 }, { 4417, 0x0004 }, { 4418, 0x0000 }, /* 0x28300 */ { 4418, 0x0040 }, { 4419, 0x0100 }, { 4420, 0x8000 }, { 4421, 0x0400 }, { 4422, 0x0000 }, { 4422, 0x0000 }, { 4422, 0x2020 }, { 4424, 0x2000 }, { 4425, 0x0400 }, { 4426, 0x0000 }, { 4426, 0x0000 }, { 4426, 0x0000 }, { 4426, 0x0000 }, { 4426, 0x0000 }, { 4426, 0x0000 }, { 4426, 0x0000 }, /* 0x28400 */ { 4426, 0x0000 }, { 4426, 0x0004 }, { 4427, 0x0000 }, { 4427, 0x0000 }, { 4427, 0x0000 }, { 4427, 0x0000 }, { 4427, 0x1100 }, { 4429, 0x0008 }, { 4430, 0x0004 }, { 4431, 0x0000 }, { 4431, 0x0000 }, { 4431, 0x0000 }, { 4431, 0x0000 }, { 4431, 0x0000 }, { 4431, 0x0000 }, { 4431, 0x0000 }, /* 0x28500 */ { 4431, 0x0002 }, { 4432, 0x0000 }, { 4432, 0x0000 }, { 4432, 0x3000 }, { 4434, 0x0000 }, { 4434, 0x0000 }, { 4434, 0x1000 }, { 4435, 0x0000 }, { 4435, 0x0000 }, { 4435, 0x0000 }, { 4435, 0x0000 }, { 4435, 0x0000 }, { 4435, 0x0000 }, { 4435, 0x0000 }, { 4435, 0x0100 }, { 4436, 0x0010 }, /* 0x28600 */ { 4437, 0x0801 }, { 4439, 0x0000 }, { 4439, 0x0020 }, { 4440, 0x0800 }, { 4441, 0x0000 }, { 4441, 0x0000 }, { 4441, 0x0000 }, { 4441, 0x0000 }, { 4441, 0x0000 }, { 4441, 0x0000 }, { 4441, 0x0c00 }, { 4443, 0x1000 }, { 4444, 0x0000 }, { 4444, 0x0100 }, { 4445, 0x0040 }, { 4446, 0x0000 }, /* 0x28700 */ { 4446, 0x0000 }, { 4446, 0x0008 }, { 4447, 0x0000 }, { 4447, 0x0000 }, { 4447, 0x0000 }, { 4447, 0x0000 }, { 4447, 0x0000 }, { 4447, 0x0000 }, { 4447, 0x0000 }, { 4447, 0x0000 }, { 4447, 0x0000 }, { 4447, 0x0000 }, { 4447, 0x0000 }, { 4447, 0x0000 }, { 4447, 0x0000 }, { 4447, 0x0000 }, /* 0x28800 */ { 4447, 0x0010 }, { 4448, 0x0000 }, { 4448, 0x0800 }, { 4449, 0x0000 }, { 4449, 0x0000 }, { 4449, 0x0000 }, { 4449, 0x0000 }, { 4449, 0x0000 }, { 4449, 0x0000 }, { 4449, 0x0000 }, { 4449, 0x0000 }, { 4449, 0x0000 }, { 4449, 0x0000 }, { 4449, 0x0000 }, { 4449, 0x0000 }, { 4449, 0x0000 }, /* 0x28900 */ { 4449, 0x0000 }, { 4449, 0x0000 }, { 4449, 0x0000 }, { 4449, 0x0008 }, { 4450, 0x0300 }, { 4452, 0x0040 }, { 4453, 0x1110 }, { 4456, 0x4000 }, { 4457, 0x0200 }, { 4458, 0x0000 }, { 4458, 0x0d00 }, { 4461, 0x1100 }, { 4463, 0x0001 }, { 4464, 0x5000 }, { 4466, 0x0192 }, { 4470, 0x1e00 }, /* 0x28a00 */ { 4474, 0x8000 }, { 4475, 0x0040 }, { 4476, 0x0220 }, { 4478, 0x0040 }, { 4479, 0x0ff0 }, { 4487, 0x0600 }, { 4489, 0x0000 }, { 4489, 0x0000 }, { 4489, 0x000e }, { 4492, 0x1c00 }, { 4495, 0x0000 }, { 4495, 0x0000 }, { 4495, 0x5841 }, { 4500, 0xc000 }, { 4502, 0x002f }, { 4507, 0x1000 }, /* 0x28b00 */ { 4508, 0x1000 }, { 4509, 0x0008 }, { 4510, 0xb806 }, { 4516, 0x0000 }, { 4516, 0x5040 }, { 4519, 0x0001 }, { 4520, 0x1078 }, { 4525, 0x0000 }, { 4525, 0x8000 }, { 4526, 0x3200 }, { 4529, 0x0000 }, { 4529, 0x0000 }, { 4529, 0x0024 }, { 4531, 0x0690 }, { 4535, 0x1f80 }, { 4541, 0x8020 }, /* 0x28c00 */ { 4543, 0x0208 }, { 4545, 0x3000 }, { 4547, 0x0848 }, { 4550, 0x0a01 }, { 4553, 0x0000 }, { 4553, 0x0000 }, { 4553, 0x0000 }, { 4553, 0x0000 }, { 4553, 0x0000 }, { 4553, 0x0000 }, { 4553, 0x0000 }, { 4553, 0x0000 }, { 4553, 0x2400 }, { 4555, 0x0004 }, { 4556, 0x0000 }, { 4556, 0x0000 }, /* 0x28d00 */ { 4556, 0x0000 }, { 4556, 0x0000 }, { 4556, 0x0000 }, { 4556, 0x0010 }, { 4557, 0x0000 }, { 4557, 0x0000 }, { 4557, 0x0000 }, { 4557, 0x0000 }, { 4557, 0x0000 }, { 4557, 0x0200 }, { 4558, 0x0000 }, { 4558, 0x0000 }, { 4558, 0x0000 }, { 4558, 0x0000 }, { 4558, 0x0000 }, { 4558, 0x0000 }, /* 0x28e00 */ { 4558, 0x8000 }, { 4559, 0x0000 }, { 4559, 0x0000 }, { 4559, 0x0240 }, { 4561, 0x0000 }, { 4561, 0x0000 }, { 4561, 0x0060 }, { 4563, 0x0000 }, { 4563, 0x0000 }, { 4563, 0x0080 }, { 4564, 0x1000 }, { 4565, 0x000c }, { 4567, 0x0000 }, { 4567, 0x0200 }, { 4568, 0x0080 }, { 4569, 0x0000 }, /* 0x28f00 */ { 4569, 0x0000 }, { 4569, 0x0000 }, { 4569, 0x0000 }, { 4569, 0x0000 }, { 4569, 0x0000 }, { 4569, 0x0000 }, { 4569, 0x0000 }, { 4569, 0x0000 }, { 4569, 0x0000 }, { 4569, 0x0000 }, { 4569, 0x0000 }, { 4569, 0x0000 }, { 4569, 0x0020 }, { 4570, 0x0000 }, { 4570, 0x0000 }, { 4570, 0x0000 }, /* 0x29000 */ { 4570, 0x0000 }, { 4570, 0x0000 }, { 4570, 0x0000 }, { 4570, 0x0000 }, { 4570, 0x0000 }, { 4570, 0x0000 }, { 4570, 0x0000 }, { 4570, 0x0000 }, { 4570, 0x0900 }, { 4572, 0x0008 }, { 4573, 0x8000 }, { 4574, 0x0003 }, { 4576, 0x0001 }, { 4577, 0x0000 }, { 4577, 0x3030 }, { 4581, 0x0000 }, /* 0x29100 */ { 4581, 0x2000 }, { 4582, 0x0001 }, { 4583, 0x0000 }, { 4583, 0x1000 }, { 4584, 0x2000 }, { 4585, 0x4800 }, { 4587, 0x0000 }, { 4587, 0x0001 }, { 4588, 0x0000 }, { 4588, 0x1000 }, { 4589, 0x0100 }, { 4590, 0x0000 }, { 4590, 0x0000 }, { 4590, 0x0020 }, { 4591, 0x0800 }, }; static const Summary16 hkscs1999_uni2indx_page294[32] = { /* 0x29400 */ { 4592, 0x0000 }, { 4592, 0x2000 }, { 4593, 0x0001 }, { 4594, 0x8008 }, { 4596, 0x0100 }, { 4597, 0x0000 }, { 4597, 0x0000 }, { 4597, 0x0000 }, { 4597, 0x0000 }, { 4597, 0x0000 }, { 4597, 0x0000 }, { 4597, 0x0000 }, { 4597, 0x0000 }, { 4597, 0x0601 }, { 4600, 0x00a0 }, { 4602, 0x0000 }, /* 0x29500 */ { 4602, 0x0000 }, { 4602, 0x0000 }, { 4602, 0x0000 }, { 4602, 0x0000 }, { 4602, 0x0000 }, { 4602, 0x0000 }, { 4602, 0x0000 }, { 4602, 0x0000 }, { 4602, 0x0000 }, { 4602, 0x4000 }, { 4603, 0x0000 }, { 4603, 0x0101 }, { 4605, 0x0000 }, { 4605, 0x0080 }, { 4606, 0x0200 }, { 4607, 0x0010 }, }; static const Summary16 hkscs1999_uni2indx_page297[251] = { /* 0x29700 */ { 4608, 0x0000 }, { 4608, 0x0000 }, { 4608, 0x0001 }, { 4609, 0x0004 }, { 4610, 0x0000 }, { 4610, 0x0000 }, { 4610, 0x0000 }, { 4610, 0x0000 }, { 4610, 0x0000 }, { 4610, 0x0000 }, { 4610, 0x0000 }, { 4610, 0x0000 }, { 4610, 0x0000 }, { 4610, 0x0010 }, { 4611, 0x0000 }, { 4611, 0x0000 }, /* 0x29800 */ { 4611, 0x0000 }, { 4611, 0x0001 }, { 4612, 0x0000 }, { 4612, 0x0000 }, { 4612, 0x0000 }, { 4612, 0x0080 }, { 4613, 0x0000 }, { 4613, 0x0000 }, { 4613, 0x0000 }, { 4613, 0x0000 }, { 4613, 0x0010 }, { 4614, 0x0000 }, { 4614, 0x0000 }, { 4614, 0x0002 }, { 4615, 0x0400 }, { 4616, 0x0002 }, /* 0x29900 */ { 4617, 0x0028 }, { 4619, 0x0000 }, { 4619, 0x8000 }, { 4620, 0x0000 }, { 4620, 0x0300 }, { 4622, 0x2000 }, { 4623, 0x0400 }, { 4624, 0x0000 }, { 4624, 0x0000 }, { 4624, 0x2000 }, { 4625, 0x0000 }, { 4625, 0x0000 }, { 4625, 0x0208 }, { 4627, 0x0000 }, { 4627, 0x0000 }, { 4627, 0x0000 }, /* 0x29a00 */ { 4627, 0x0000 }, { 4627, 0x0000 }, { 4627, 0x0100 }, { 4628, 0x0000 }, { 4628, 0x2000 }, { 4629, 0x0000 }, { 4629, 0x0000 }, { 4629, 0x0000 }, { 4629, 0x0000 }, { 4629, 0x0000 }, { 4629, 0x0000 }, { 4629, 0x0000 }, { 4629, 0x0000 }, { 4629, 0x0000 }, { 4629, 0x0000 }, { 4629, 0x0000 }, /* 0x29b00 */ { 4629, 0x4020 }, { 4631, 0x0000 }, { 4631, 0x0000 }, { 4631, 0x0000 }, { 4631, 0x0000 }, { 4631, 0x0000 }, { 4631, 0x0000 }, { 4631, 0x0000 }, { 4631, 0x0000 }, { 4631, 0x0000 }, { 4631, 0x0000 }, { 4631, 0x0000 }, { 4631, 0x0000 }, { 4631, 0x0020 }, { 4632, 0x0000 }, { 4632, 0x0000 }, /* 0x29c00 */ { 4632, 0x0000 }, { 4632, 0x0000 }, { 4632, 0x0000 }, { 4632, 0x0000 }, { 4632, 0x0000 }, { 4632, 0x0000 }, { 4632, 0x0000 }, { 4632, 0x0000 }, { 4632, 0x0000 }, { 4632, 0x0000 }, { 4632, 0x2000 }, { 4633, 0x0000 }, { 4633, 0x0000 }, { 4633, 0x0000 }, { 4633, 0x0000 }, { 4633, 0x0000 }, /* 0x29d00 */ { 4633, 0x0000 }, { 4633, 0x0000 }, { 4633, 0x0000 }, { 4633, 0x4000 }, { 4634, 0x0000 }, { 4634, 0x0400 }, { 4635, 0x0000 }, { 4635, 0x1000 }, { 4636, 0x0000 }, { 4636, 0x0900 }, { 4638, 0x0000 }, { 4638, 0x0000 }, { 4638, 0x0000 }, { 4638, 0x0000 }, { 4638, 0x0000 }, { 4638, 0x0040 }, /* 0x29e00 */ { 4639, 0x0040 }, { 4640, 0x0000 }, { 4640, 0x2000 }, { 4641, 0x0000 }, { 4641, 0x0000 }, { 4641, 0x0000 }, { 4641, 0x0100 }, { 4642, 0x0000 }, { 4642, 0x0000 }, { 4642, 0x0000 }, { 4642, 0x1000 }, { 4643, 0x0000 }, { 4643, 0x0008 }, { 4644, 0x0000 }, { 4644, 0x0000 }, { 4644, 0x0100 }, /* 0x29f00 */ { 4645, 0x0000 }, { 4645, 0x0000 }, { 4645, 0x0008 }, { 4646, 0x0001 }, { 4647, 0x0000 }, { 4647, 0x0000 }, { 4647, 0x0000 }, { 4647, 0x0000 }, { 4647, 0x0000 }, { 4647, 0x0000 }, { 4647, 0x0000 }, { 4647, 0x0080 }, { 4648, 0x0000 }, { 4648, 0x4000 }, { 4649, 0x0000 }, { 4649, 0x0000 }, /* 0x2a000 */ { 4649, 0x0000 }, { 4649, 0x0010 }, { 4650, 0x0000 }, { 4650, 0x0000 }, { 4650, 0x0000 }, { 4650, 0x0000 }, { 4650, 0x0000 }, { 4650, 0x0000 }, { 4650, 0x0080 }, { 4651, 0x0000 }, { 4651, 0x0000 }, { 4651, 0x0200 }, { 4652, 0x0000 }, { 4652, 0x0000 }, { 4652, 0x2002 }, { 4654, 0x4108 }, /* 0x2a100 */ { 4657, 0x0000 }, { 4657, 0x0000 }, { 4657, 0x0008 }, { 4658, 0x0018 }, { 4660, 0x0000 }, { 4660, 0x0001 }, { 4661, 0x0000 }, { 4661, 0x0000 }, { 4661, 0x0000 }, { 4661, 0x000c }, { 4663, 0x0800 }, { 4664, 0x0010 }, { 4665, 0x0000 }, { 4665, 0x8000 }, { 4666, 0x0000 }, { 4666, 0x0020 }, /* 0x2a200 */ { 4667, 0x0000 }, { 4667, 0x0000 }, { 4667, 0x0001 }, { 4668, 0x0008 }, { 4669, 0x0000 }, { 4669, 0x0000 }, { 4669, 0x0000 }, { 4669, 0x0000 }, { 4669, 0x0000 }, { 4669, 0x8008 }, { 4671, 0x0000 }, { 4671, 0x2054 }, { 4675, 0x0000 }, { 4675, 0x8000 }, { 4676, 0x0000 }, { 4676, 0x8000 }, /* 0x2a300 */ { 4677, 0x0000 }, { 4677, 0x0000 }, { 4677, 0x0000 }, { 4677, 0x0000 }, { 4677, 0x0000 }, { 4677, 0x0000 }, { 4677, 0x0000 }, { 4677, 0x0000 }, { 4677, 0x0000 }, { 4677, 0x0000 }, { 4677, 0x0200 }, { 4678, 0x0000 }, { 4678, 0x0000 }, { 4678, 0x0000 }, { 4678, 0x0000 }, { 4678, 0x0000 }, /* 0x2a400 */ { 4678, 0x0000 }, { 4678, 0x0000 }, { 4678, 0x0000 }, { 4678, 0x0010 }, { 4679, 0x0000 }, { 4679, 0x0800 }, { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, /* 0x2a500 */ { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0000 }, { 4680, 0x0840 }, { 4682, 0x0000 }, { 4682, 0x0000 }, { 4682, 0x0000 }, /* 0x2a600 */ { 4682, 0x0002 }, { 4683, 0x0000 }, { 4683, 0x0000 }, { 4683, 0x0004 }, { 4684, 0x0400 }, { 4685, 0x0800 }, { 4686, 0x0000 }, { 4686, 0x0000 }, { 4686, 0x0000 }, { 4686, 0x0000 }, { 4686, 0x0200 }, }; static const Summary16 hkscs1999_uni2indx_page2f8[30] = { /* 0x2f800 */ { 4687, 0x0000 }, { 4687, 0x0000 }, { 4687, 0x0020 }, { 4688, 0x0800 }, { 4689, 0x0001 }, { 4690, 0x0000 }, { 4690, 0x0000 }, { 4690, 0x0100 }, { 4691, 0x0000 }, { 4691, 0x0010 }, { 4692, 0x0040 }, { 4693, 0x0000 }, { 4693, 0x2000 }, { 4694, 0x0000 }, { 4694, 0x0000 }, { 4694, 0x0000 }, /* 0x2f900 */ { 4694, 0x0000 }, { 4694, 0x0000 }, { 4694, 0x0000 }, { 4694, 0x0000 }, { 4694, 0x0000 }, { 4694, 0x0000 }, { 4694, 0x0000 }, { 4694, 0x0000 }, { 4694, 0x0000 }, { 4694, 0x0010 }, { 4695, 0x0000 }, { 4695, 0x1004 }, { 4697, 0x0000 }, { 4697, 0x0010 }, }; static int hkscs1999_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc >= 0x0000 && wc < 0x02d0) summary = &hkscs1999_uni2indx_page00[(wc>>4)]; else if (wc >= 0x0400 && wc < 0x0460) summary = &hkscs1999_uni2indx_page04[(wc>>4)-0x040]; else if (wc >= 0x1e00 && wc < 0x1ed0) summary = &hkscs1999_uni2indx_page1e[(wc>>4)-0x1e0]; else if (wc >= 0x2100 && wc < 0x21f0) summary = &hkscs1999_uni2indx_page21[(wc>>4)-0x210]; else if (wc >= 0x2300 && wc < 0x2580) summary = &hkscs1999_uni2indx_page23[(wc>>4)-0x230]; else if (wc >= 0x2700 && wc < 0x2740) summary = &hkscs1999_uni2indx_page27[(wc>>4)-0x270]; else if (wc >= 0x2e00 && wc < 0x3240) summary = &hkscs1999_uni2indx_page2e[(wc>>4)-0x2e0]; else if (wc >= 0x3400 && wc < 0x9fc0) summary = &hkscs1999_uni2indx_page34[(wc>>4)-0x340]; else if (wc >= 0xf900 && wc < 0xf910) summary = &hkscs1999_uni2indx_pagef9[(wc>>4)-0xf90]; else if (wc >= 0xff00 && wc < 0xfff0) summary = &hkscs1999_uni2indx_pageff[(wc>>4)-0xff0]; else if (wc >= 0x20000 && wc < 0x291f0) summary = &hkscs1999_uni2indx_page200[(wc>>4)-0x2000]; else if (wc >= 0x29400 && wc < 0x29600) summary = &hkscs1999_uni2indx_page294[(wc>>4)-0x2940]; else if (wc >= 0x29700 && wc < 0x2a6b0) summary = &hkscs1999_uni2indx_page297[(wc>>4)-0x2970]; else if (wc >= 0x2f800 && wc < 0x2f9e0) summary = &hkscs1999_uni2indx_page2f8[(wc>>4)-0x2f80]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' 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); c = hkscs1999_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/hkscs2001.h000066400000000000000000001016061252300335000245200ustar00rootroot00000000000000/* * Copyright (C) 1999-2006 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * HKSCS:2001 */ static const unsigned short hkscs2001_2uni_page8c[123] = { /* 0x8c */ 0x0a3b, 0x1cfe, 0x5273, 0x37a6, 0x02c9, 0x2d8f, 0x414e, 0x1d77, 0x12f5, 0x0620, 0x45cd, 0x0059, 0x4830, 0x1622, 0x4f32, 0x30a7, 0x31f6, 0x1e91, 0x1819, 0x20ba, 0x3e81, 0x5307, 0x018b, 0x3a80, 0x0610, 0x24e4, 0x2102, 0x0bae, 0x4d0f, 0x0409, 0x1a63, 0x54ba, 0x0523, 0x2c0f, 0x38fd, 0x252a, 0x5147, 0x4fea, 0x3455, 0x1d4d, 0x0c24, 0x3c7e, 0x33f4, 0x22d9, 0x4ee3, 0x37a7, 0x23dd, 0x08a3, 0x09f0, 0x0abc, 0x082f, 0x0917, 0x37a8, 0x0d34, 0x288b, 0x0f92, 0x0fd0, 0x3bb6, 0x1492, 0x1499, 0x15c2, 0x3d12, 0x178b, 0x3ff9, 0x1919, 0x1a43, 0x4063, 0x1bff, 0x38fd, 0x1f00, 0x4205, 0x208c, 0x03db, 0x4413, 0x1115, 0x21b9, 0x2e83, 0x47a4, 0x4695, 0x2593, 0x26ec, 0x27c3, 0x296c, 0x2af8, 0x2b97, 0x37a9, 0x2d90, 0x37aa, 0x2fb9, 0x37ab, 0x30cf, 0x2b5f, 0x36e0, 0x3221, 0x37ac, 0x50b9, 0x393f, 0x0471, 0x05a2, 0x101a, 0x38fd, 0x38fd, 0x38fd, 0x3568, 0x186b, 0x0576, 0x0e3d, 0x38fd, 0x2bd6, 0x437b, 0x2abf, 0x4c0d, 0x0781, 0x4a74, 0x137b, 0x4915, 0x4bbe, 0x37ad, 0x37ae, 0x1196, 0x37af, 0x38fd, 0x295b, }; static const ucs4_t hkscs2001_2uni_upages[85] = { 0x03500, 0x03c00, 0x03d00, 0x03e00, 0x04000, 0x04200, 0x04b00, 0x04c00, 0x04e00, 0x04f00, 0x05000, 0x05100, 0x05300, 0x05400, 0x05700, 0x05800, 0x05a00, 0x05b00, 0x05c00, 0x05d00, 0x05e00, 0x05f00, 0x06100, 0x06500, 0x06700, 0x06900, 0x06a00, 0x06c00, 0x06d00, 0x07000, 0x07100, 0x07200, 0x07300, 0x07400, 0x07600, 0x07700, 0x07800, 0x07a00, 0x07b00, 0x07c00, 0x07d00, 0x07e00, 0x08200, 0x08500, 0x08600, 0x08800, 0x08b00, 0x08e00, 0x08f00, 0x09100, 0x09200, 0x09300, 0x09700, 0x09800, 0x09900, 0x09f00, 0x0ff00, 0x21400, 0x21900, 0x21d00, 0x22000, 0x22700, 0x23200, 0x23300, 0x23c00, 0x24100, 0x24500, 0x24900, 0x24a00, 0x25100, 0x25600, 0x25c00, 0x25d00, 0x26b00, 0x26d00, 0x26f00, 0x27100, 0x28700, 0x28900, 0x28a00, 0x28d00, 0x29900, 0x29c00, 0x2a100, 0x2a200, }; static int hkscs2001_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 == 0x8c)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { unsigned int i = 157 * (c1 - 0x80) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); ucs4_t wc = 0xfffd; unsigned short swc; { if (i < 2007) swc = hkscs2001_2uni_page8c[i-1884], wc = hkscs2001_2uni_upages[swc>>8] | (swc & 0xff); } if (wc != 0xfffd) { *pwc = wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short hkscs2001_2charset[116] = { 0x8c4b, 0x8c56, 0x8c44, 0x8caa, 0x8c5d, 0x8cc3, 0x8c60, 0x8ccb, 0x8cc4, 0x8c58, 0x8c49, 0x8cd2, 0x8c72, 0x8c6f, 0x8c73, 0x8c70, 0x8c40, 0x8c71, 0x8c5b, 0x8c68, 0x8c75, 0x8ccc, 0x8c77, 0x8c78, 0x8cc5, 0x8cac, 0x8cd9, 0x8c48, 0x8cd4, 0x8c7a, 0x8c7b, 0x8c7c, 0x8c4d, 0x8c7e, 0x8c52, 0x8cca, 0x8ca2, 0x8ca3, 0x8c5e, 0x8ca5, 0x8c41, 0x8c67, 0x8c47, 0x8c51, 0x8ca7, 0x8ca9, 0x8c53, 0x8c5a, 0x8cad, 0x8c6b, 0x8c6e, 0x8c59, 0x8c63, 0x8cb1, 0x8cb2, 0x8cb3, 0x8c76, 0x8cdc, 0x8cb4, 0x8cd0, 0x8cb5, 0x8cbd, 0x8cb6, 0x8cce, 0x8c61, 0x8c45, 0x8cb8, 0x8cae, 0x8cba, 0x8c4f, 0x8cbc, 0x8c50, 0x8cbf, 0x8c6a, 0x8c66, 0x8cc9, 0x8cbe, 0x8c43, 0x8c6d, 0x8c74, 0x8cb7, 0x8cb9, 0x8cbb, 0x8cc0, 0x8cd7, 0x8cd8, 0x8cda, 0x8cc2, 0x8c57, 0x8c79, 0x8c69, 0x8c7d, 0x8c54, 0x8ca1, 0x8ca4, 0x8c46, 0x8ca8, 0x8ccf, 0x8cab, 0x8c4a, 0x8cb0, 0x8caf, 0x8c4c, 0x8cd5, 0x8cd3, 0x8cd6, 0x8cd1, 0x8c5c, 0x8c6c, 0x8c4e, 0x8c65, 0x8cc1, 0x8c64, 0x8c42, 0x8c55, 0x8c5f, }; static const Summary16 hkscs2001_uni2indx_page35[6] = { /* 0x3500 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0200 }, }; static const Summary16 hkscs2001_uni2indx_page3c[46] = { /* 0x3c00 */ { 1, 0x0000 }, { 1, 0x0000 }, { 1, 0x0000 }, { 1, 0x0000 }, { 1, 0x0000 }, { 1, 0x0000 }, { 1, 0x0000 }, { 1, 0x0000 }, { 1, 0x0800 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, /* 0x3d00 */ { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0200 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, /* 0x3e00 */ { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0800 }, }; static const Summary16 hkscs2001_uni2indx_page40[8] = { /* 0x4000 */ { 4, 0x0200 }, { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0002 }, }; static const Summary16 hkscs2001_uni2indx_page42[11] = { /* 0x4200 */ { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0008 }, { 7, 0x0000 }, { 7, 0x0000 }, { 7, 0x0000 }, { 7, 0x0000 }, { 7, 0x0040 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0004 }, }; static const Summary16 hkscs2001_uni2indx_page4b[25] = { /* 0x4b00 */ { 9, 0x0000 }, { 9, 0x0001 }, { 10, 0x0001 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, /* 0x4c00 */ { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0002 }, }; static const Summary16 hkscs2001_uni2indx_page4e[59] = { /* 0x4e00 */ { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x8000 }, { 13, 0x0000 }, { 13, 0x0000 }, { 13, 0x0000 }, { 13, 0x0000 }, { 13, 0x0000 }, { 13, 0x0000 }, { 13, 0x0000 }, { 13, 0x0008 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, /* 0x4f00 */ { 14, 0x0000 }, { 14, 0x0080 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0001 }, /* 0x5000 */ { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0800 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x1000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, /* 0x5100 */ { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x4000 }, }; static const Summary16 hkscs2001_uni2indx_page53[20] = { /* 0x5300 */ { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0010 }, { 20, 0x0000 }, { 20, 0x0000 }, { 20, 0x0000 }, { 20, 0x0000 }, { 20, 0x0000 }, { 20, 0x0000 }, { 20, 0x0000 }, { 20, 0x0000 }, { 20, 0x0000 }, { 20, 0x0000 }, { 20, 0x0000 }, { 20, 0x0000 }, { 20, 0x0000 }, /* 0x5400 */ { 20, 0x0000 }, { 20, 0x0000 }, { 20, 0x0000 }, { 20, 0x0010 }, }; static const Summary16 hkscs2001_uni2indx_page57[30] = { /* 0x5700 */ { 21, 0x0000 }, { 21, 0x0000 }, { 21, 0x0000 }, { 21, 0x2000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, /* 0x5800 */ { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0004 }, { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0x0001 }, }; static const Summary16 hkscs2001_uni2indx_page5a[93] = { /* 0x5a00 */ { 24, 0x0000 }, { 24, 0x0400 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, /* 0x5b00 */ { 25, 0x0000 }, { 25, 0x0020 }, { 26, 0x0000 }, { 26, 0x0000 }, { 26, 0x0000 }, { 26, 0x0000 }, { 26, 0x0000 }, { 26, 0x0000 }, { 26, 0x0000 }, { 26, 0x0040 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, /* 0x5c00 */ { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0020 }, /* 0x5d00 */ { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0800 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, /* 0x5e00 */ { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0204 }, { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, /* 0x5f00 */ { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0004 }, }; static const Summary16 hkscs2001_uni2indx_page61[3] = { /* 0x6100 */ { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0004 }, }; static const Summary16 hkscs2001_uni2indx_page65[9] = { /* 0x6500 */ { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0800 }, }; static const Summary16 hkscs2001_uni2indx_page67[7] = { /* 0x6700 */ { 34, 0x0000 }, { 34, 0x0200 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0800 }, }; static const Summary16 hkscs2001_uni2indx_page69[23] = { /* 0x6900 */ { 36, 0x0000 }, { 36, 0x0200 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, /* 0x6a00 */ { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0008 }, { 38, 0x0000 }, { 38, 0x0008 }, }; static const Summary16 hkscs2001_uni2indx_page6c[32] = { /* 0x6c00 */ { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x8000 }, /* 0x6d00 */ { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x4000 }, }; static const Summary16 hkscs2001_uni2indx_page70[76] = { /* 0x7000 */ { 41, 0x0000 }, { 41, 0x0000 }, { 41, 0x0000 }, { 41, 0x0000 }, { 41, 0x2000 }, { 42, 0x0000 }, { 42, 0x0000 }, { 42, 0x0080 }, { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, /* 0x7100 */ { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0002 }, { 44, 0x0000 }, { 44, 0x0000 }, { 44, 0x0000 }, { 44, 0x0000 }, { 44, 0x0000 }, { 44, 0x0000 }, /* 0x7200 */ { 44, 0x0001 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, /* 0x7300 */ { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x0000 }, { 45, 0x1000 }, { 46, 0x0000 }, { 46, 0x0000 }, { 46, 0x0400 }, { 47, 0x0000 }, { 47, 0x0000 }, { 47, 0x0000 }, { 47, 0x0000 }, /* 0x7400 */ { 47, 0x0004 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0200 }, }; static const Summary16 hkscs2001_uni2indx_page76[47] = { /* 0x7600 */ { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0200 }, { 50, 0x0000 }, { 50, 0x0000 }, /* 0x7700 */ { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x2000 }, { 51, 0x0000 }, { 51, 0x0000 }, /* 0x7800 */ { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0010 }, }; static const Summary16 hkscs2001_uni2indx_page7a[71] = { /* 0x7a00 */ { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0400 }, { 53, 0x0000 }, { 53, 0x0000 }, { 53, 0x0000 }, { 53, 0x0000 }, { 53, 0x0000 }, { 53, 0x0000 }, { 53, 0x0008 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, /* 0x7b00 */ { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x1000 }, { 55, 0x0000 }, /* 0x7c00 */ { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0008 }, { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, /* 0x7d00 */ { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0800 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, /* 0x7e00 */ { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0800 }, { 58, 0x1000 }, }; static const Summary16 hkscs2001_uni2indx_page82[16] = { /* 0x8200 */ { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x8000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0100 }, }; static const Summary16 hkscs2001_uni2indx_page85[17] = { /* 0x8500 */ { 61, 0x0000 }, { 61, 0x0000 }, { 61, 0x0000 }, { 61, 0x0000 }, { 61, 0x0000 }, { 61, 0x8000 }, { 62, 0x0000 }, { 62, 0x0000 }, { 62, 0x0000 }, { 62, 0x0080 }, { 63, 0x0000 }, { 63, 0x0000 }, { 63, 0x0000 }, { 63, 0x0040 }, { 64, 0x0000 }, { 64, 0x0000 }, /* 0x8600 */ { 64, 0x8000 }, }; static const Summary16 hkscs2001_uni2indx_page88[10] = { /* 0x8800 */ { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x8000 }, { 66, 0x0001 }, }; static const Summary16 hkscs2001_uni2indx_page8b[9] = { /* 0x8b00 */ { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0008 }, }; static const Summary16 hkscs2001_uni2indx_page8e[29] = { /* 0x8e00 */ { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0200 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, /* 0x8f00 */ { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0080 }, { 70, 0x0000 }, { 70, 0x8000 }, }; static const Summary16 hkscs2001_uni2indx_page91[48] = { /* 0x9100 */ { 71, 0x0000 }, { 71, 0x0000 }, { 71, 0x0000 }, { 71, 0x0000 }, { 71, 0x0000 }, { 71, 0x0000 }, { 71, 0x0000 }, { 71, 0x0000 }, { 71, 0x0000 }, { 71, 0x0000 }, { 71, 0x0000 }, { 71, 0x0000 }, { 71, 0x0000 }, { 71, 0x0000 }, { 71, 0x0000 }, { 71, 0x0040 }, /* 0x9200 */ { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0002 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, /* 0x9300 */ { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0010 }, }; static const Summary16 hkscs2001_uni2indx_page97[47] = { /* 0x9700 */ { 74, 0x0000 }, { 74, 0x0000 }, { 74, 0x0000 }, { 74, 0x0000 }, { 74, 0x0000 }, { 74, 0x0020 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, /* 0x9800 */ { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0100 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, /* 0x9900 */ { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0001 }, }; static const Summary16 hkscs2001_uni2indx_page9f[11] = { /* 0x9f00 */ { 77, 0x0000 }, { 77, 0x0000 }, { 77, 0x0000 }, { 77, 0x0000 }, { 77, 0x0000 }, { 77, 0x0000 }, { 77, 0x0000 }, { 77, 0x0000 }, { 77, 0x0000 }, { 77, 0x0000 }, { 77, 0xffc0 }, }; static const Summary16 hkscs2001_uni2indx_page214[4] = { /* 0x21400 */ { 87, 0x0000 }, { 87, 0x0000 }, { 87, 0x0000 }, { 87, 0x8000 }, }; static const Summary16 hkscs2001_uni2indx_page219[9] = { /* 0x21900 */ { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0001 }, }; static const Summary16 hkscs2001_uni2indx_page21d[12] = { /* 0x21d00 */ { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0040 }, }; static const Summary16 hkscs2001_uni2indx_page220[8] = { /* 0x22000 */ { 90, 0x0000 }, { 90, 0x0000 }, { 90, 0x0000 }, { 90, 0x0000 }, { 90, 0x0000 }, { 90, 0x0000 }, { 90, 0x0000 }, { 90, 0x4000 }, }; static const Summary16 hkscs2001_uni2indx_page227[2] = { /* 0x22700 */ { 91, 0x0000 }, { 91, 0x0004 }, }; static const Summary16 hkscs2001_uni2indx_page232[32] = { /* 0x23200 */ { 92, 0x0000 }, { 92, 0x0000 }, { 92, 0x0000 }, { 92, 0x0000 }, { 92, 0x0000 }, { 92, 0x0000 }, { 92, 0x0000 }, { 92, 0x0000 }, { 92, 0x0002 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, /* 0x23300 */ { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0200 }, }; static const Summary16 hkscs2001_uni2indx_page23c[7] = { /* 0x23c00 */ { 94, 0x0000 }, { 94, 0x0000 }, { 94, 0x0000 }, { 94, 0x0000 }, { 94, 0x0000 }, { 94, 0x0000 }, { 94, 0x0008 }, }; static const Summary16 hkscs2001_uni2indx_page241[5] = { /* 0x24100 */ { 95, 0x0000 }, { 95, 0x0000 }, { 95, 0x0000 }, { 95, 0x0000 }, { 95, 0x4000 }, }; static const Summary16 hkscs2001_uni2indx_page245[1] = { /* 0x24500 */ { 96, 0x0020 }, }; static const Summary16 hkscs2001_uni2indx_page249[18] = { /* 0x24900 */ { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0800 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, /* 0x24a00 */ { 98, 0x0000 }, { 98, 0x0008 }, }; static const Summary16 hkscs2001_uni2indx_page251[13] = { /* 0x25100 */ { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0x0000 }, { 99, 0x2000 }, }; static const Summary16 hkscs2001_uni2indx_page256[10] = { /* 0x25600 */ { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0020 }, }; static const Summary16 hkscs2001_uni2indx_page25c[20] = { /* 0x25c00 */ { 101, 0x0000 }, { 101, 0x0000 }, { 101, 0x0000 }, { 101, 0x0000 }, { 101, 0x0000 }, { 101, 0x0000 }, { 101, 0x0000 }, { 101, 0x0000 }, { 101, 0x0000 }, { 101, 0x0000 }, { 101, 0x0010 }, { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0000 }, /* 0x25d00 */ { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0001 }, }; static const Summary16 hkscs2001_uni2indx_page26b[2] = { /* 0x26b00 */ { 103, 0x0000 }, { 103, 0x0020 }, }; static const Summary16 hkscs2001_uni2indx_page26d[8] = { /* 0x26d00 */ { 104, 0x0000 }, { 104, 0x0000 }, { 104, 0x0000 }, { 104, 0x0000 }, { 104, 0x0000 }, { 104, 0x0000 }, { 104, 0x0000 }, { 104, 0x0010 }, }; static const Summary16 hkscs2001_uni2indx_page26f[12] = { /* 0x26f00 */ { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x4000 }, }; static const Summary16 hkscs2001_uni2indx_page271[1] = { /* 0x27100 */ { 106, 0x2000 }, }; static const Summary16 hkscs2001_uni2indx_page287[1] = { /* 0x28700 */ { 107, 0x8000 }, }; static const Summary16 hkscs2001_uni2indx_page289[31] = { /* 0x28900 */ { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0008 }, { 109, 0x0000 }, /* 0x28a00 */ { 109, 0x0000 }, { 109, 0x0000 }, { 109, 0x0000 }, { 109, 0x0004 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0400 }, }; static const Summary16 hkscs2001_uni2indx_page28d[12] = { /* 0x28d00 */ { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x0200 }, }; static const Summary16 hkscs2001_uni2indx_page299[5] = { /* 0x29900 */ { 112, 0x0000 }, { 112, 0x0000 }, { 112, 0x0000 }, { 112, 0x0000 }, { 112, 0x0080 }, }; static const Summary16 hkscs2001_uni2indx_page29c[8] = { /* 0x29c00 */ { 113, 0x0000 }, { 113, 0x0000 }, { 113, 0x0000 }, { 113, 0x0000 }, { 113, 0x0000 }, { 113, 0x0000 }, { 113, 0x0000 }, { 113, 0x0008 }, }; static const Summary16 hkscs2001_uni2indx_page2a1[28] = { /* 0x2a100 */ { 114, 0x0080 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, /* 0x2a200 */ { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0400 }, }; static int hkscs2001_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc < 0x9f00) { if (wc < 0x6900) { if (wc >= 0x3500 && wc < 0x3560) summary = &hkscs2001_uni2indx_page35[(wc>>4)-0x350]; else if (wc >= 0x3c00 && wc < 0x3ee0) summary = &hkscs2001_uni2indx_page3c[(wc>>4)-0x3c0]; else if (wc >= 0x4000 && wc < 0x4080) summary = &hkscs2001_uni2indx_page40[(wc>>4)-0x400]; else if (wc >= 0x4200 && wc < 0x42b0) summary = &hkscs2001_uni2indx_page42[(wc>>4)-0x420]; else if (wc >= 0x4b00 && wc < 0x4c90) summary = &hkscs2001_uni2indx_page4b[(wc>>4)-0x4b0]; else if (wc >= 0x4e00 && wc < 0x51b0) summary = &hkscs2001_uni2indx_page4e[(wc>>4)-0x4e0]; else if (wc >= 0x5300 && wc < 0x5440) summary = &hkscs2001_uni2indx_page53[(wc>>4)-0x530]; else if (wc >= 0x5700 && wc < 0x58e0) summary = &hkscs2001_uni2indx_page57[(wc>>4)-0x570]; else if (wc >= 0x5a00 && wc < 0x5fd0) summary = &hkscs2001_uni2indx_page5a[(wc>>4)-0x5a0]; else if (wc >= 0x6100 && wc < 0x6130) summary = &hkscs2001_uni2indx_page61[(wc>>4)-0x610]; else if (wc >= 0x6500 && wc < 0x6590) summary = &hkscs2001_uni2indx_page65[(wc>>4)-0x650]; else if (wc >= 0x6700 && wc < 0x6770) summary = &hkscs2001_uni2indx_page67[(wc>>4)-0x670]; } else { if (wc >= 0x6900 && wc < 0x6a70) summary = &hkscs2001_uni2indx_page69[(wc>>4)-0x690]; else if (wc >= 0x6c00 && wc < 0x6e00) summary = &hkscs2001_uni2indx_page6c[(wc>>4)-0x6c0]; else if (wc >= 0x7000 && wc < 0x74c0) summary = &hkscs2001_uni2indx_page70[(wc>>4)-0x700]; else if (wc >= 0x7600 && wc < 0x78f0) summary = &hkscs2001_uni2indx_page76[(wc>>4)-0x760]; else if (wc >= 0x7a00 && wc < 0x7e70) summary = &hkscs2001_uni2indx_page7a[(wc>>4)-0x7a0]; else if (wc >= 0x8200 && wc < 0x8300) summary = &hkscs2001_uni2indx_page82[(wc>>4)-0x820]; else if (wc >= 0x8500 && wc < 0x8610) summary = &hkscs2001_uni2indx_page85[(wc>>4)-0x850]; else if (wc >= 0x8800 && wc < 0x88a0) summary = &hkscs2001_uni2indx_page88[(wc>>4)-0x880]; else if (wc >= 0x8b00 && wc < 0x8b90) summary = &hkscs2001_uni2indx_page8b[(wc>>4)-0x8b0]; else if (wc >= 0x8e00 && wc < 0x8fd0) summary = &hkscs2001_uni2indx_page8e[(wc>>4)-0x8e0]; else if (wc >= 0x9100 && wc < 0x9400) summary = &hkscs2001_uni2indx_page91[(wc>>4)-0x910]; else if (wc >= 0x9700 && wc < 0x99f0) summary = &hkscs2001_uni2indx_page97[(wc>>4)-0x970]; } } else { if (wc < 0x25600) { if (wc >= 0x9f00 && wc < 0x9fb0) summary = &hkscs2001_uni2indx_page9f[(wc>>4)-0x9f0]; else if (wc >= 0x21400 && wc < 0x21440) summary = &hkscs2001_uni2indx_page214[(wc>>4)-0x2140]; else if (wc >= 0x21900 && wc < 0x21990) summary = &hkscs2001_uni2indx_page219[(wc>>4)-0x2190]; else if (wc >= 0x21d00 && wc < 0x21dc0) summary = &hkscs2001_uni2indx_page21d[(wc>>4)-0x21d0]; else if (wc >= 0x22000 && wc < 0x22080) summary = &hkscs2001_uni2indx_page220[(wc>>4)-0x2200]; else if (wc >= 0x22700 && wc < 0x22720) summary = &hkscs2001_uni2indx_page227[(wc>>4)-0x2270]; else if (wc >= 0x23200 && wc < 0x23400) summary = &hkscs2001_uni2indx_page232[(wc>>4)-0x2320]; else if (wc >= 0x23c00 && wc < 0x23c70) summary = &hkscs2001_uni2indx_page23c[(wc>>4)-0x23c0]; else if (wc >= 0x24100 && wc < 0x24150) summary = &hkscs2001_uni2indx_page241[(wc>>4)-0x2410]; else if (wc >= 0x24500 && wc < 0x24510) summary = &hkscs2001_uni2indx_page245[(wc>>4)-0x2450]; else if (wc >= 0x24900 && wc < 0x24a20) summary = &hkscs2001_uni2indx_page249[(wc>>4)-0x2490]; else if (wc >= 0x25100 && wc < 0x251d0) summary = &hkscs2001_uni2indx_page251[(wc>>4)-0x2510]; } else { if (wc >= 0x25600 && wc < 0x256a0) summary = &hkscs2001_uni2indx_page256[(wc>>4)-0x2560]; else if (wc >= 0x25c00 && wc < 0x25d40) summary = &hkscs2001_uni2indx_page25c[(wc>>4)-0x25c0]; else if (wc >= 0x26b00 && wc < 0x26b20) summary = &hkscs2001_uni2indx_page26b[(wc>>4)-0x26b0]; else if (wc >= 0x26d00 && wc < 0x26d80) summary = &hkscs2001_uni2indx_page26d[(wc>>4)-0x26d0]; else if (wc >= 0x26f00 && wc < 0x26fc0) summary = &hkscs2001_uni2indx_page26f[(wc>>4)-0x26f0]; else if (wc >= 0x27100 && wc < 0x27110) summary = &hkscs2001_uni2indx_page271[(wc>>4)-0x2710]; else if (wc >= 0x28700 && wc < 0x28710) summary = &hkscs2001_uni2indx_page287[(wc>>4)-0x2870]; else if (wc >= 0x28900 && wc < 0x28af0) summary = &hkscs2001_uni2indx_page289[(wc>>4)-0x2890]; else if (wc >= 0x28d00 && wc < 0x28dc0) summary = &hkscs2001_uni2indx_page28d[(wc>>4)-0x28d0]; else if (wc >= 0x29900 && wc < 0x29950) summary = &hkscs2001_uni2indx_page299[(wc>>4)-0x2990]; else if (wc >= 0x29c00 && wc < 0x29c80) summary = &hkscs2001_uni2indx_page29c[(wc>>4)-0x29c0]; else if (wc >= 0x2a100 && wc < 0x2a2c0) summary = &hkscs2001_uni2indx_page2a1[(wc>>4)-0x2a10]; } } if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' 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); c = hkscs2001_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/hkscs2004.h000066400000000000000000001004201252300335000245140ustar00rootroot00000000000000/* * Copyright (C) 1999-2006 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * HKSCS:2004 */ static const unsigned short hkscs2004_2uni_page87[58] = { /* 0x87 */ 0x0af0, 0x1032, 0x0d03, 0x0ca6, 0x0c78, 0x4167, 0x1177, 0x0cb3, 0x44b1, 0x10e2, 0x44c5, 0x0595, 0x0e36, 0x0e44, 0x1047, 0x1040, 0x39bf, 0x3417, 0x4252, 0x3f8b, 0x40d2, 0x1057, 0x4d51, 0x0e4f, 0x0cda, 0x1085, 0x446c, 0x1107, 0x0fa4, 0x0da1, 0x3d23, 0x1e25, 0x3c54, 0x2d63, 0x3606, 0x3761, 0x1a4d, 0x13fb, 0x28fd, 0x2195, 0x141d, 0x47b9, 0x06f4, 0x2534, 0x43ef, 0x16db, 0x2e5e, 0x15a4, 0x0125, 0x4bb0, 0x15d1, 0x16b7, 0x17fc, 0x1b6e, 0x2393, 0x4a45, 0x1f61, 0x1f9d, }; static const unsigned short hkscs2004_2uni_page8c[189] = { /* 0x8c */ 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x2b6f, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x28fd, 0x1ae7, 0x28fd, 0x1c57, 0x20ca, 0x0688, 0x0bc3, 0x3256, 0x3196, 0x0a9a, 0x0c36, 0x28fd, 0x17d5, 0x351a, 0x24f9, 0x1778, 0x0612, 0x3351, 0x1878, 0x27b2, 0x1d57, 0x0c58, 0x38ec, 0x2f23, 0x1077, 0x0478, 0x004a, 0x29a4, 0x3e41, 0x24cc, 0x12b4, 0x2a39, 0x14bf, 0x226c, 0x2656, 0x49fa, 0x193b, /* 0x8d */ 0x2c9f, 0x28fd, 0x30c1, 0x466d, 0x0902, 0x0dbb, 0x4879, 0x0707, 0x27b3, 0x4cb5, 0x08f8, 0x02d6, 0x0df7, 0x3e46, 0x097c, 0x45b2, 0x42ff, 0x0c6d, 0x03d4, 0x3b9a, 0x0c61, 0x0c1b, 0x1189, 0x107b, 0x1176, 0x0cea, 0x07c8, 0x3a0f, 0x0161, 0x0bde, 0x0bbd, 0x09ed, }; static const ucs4_t hkscs2004_2uni_upages[78] = { 0x03400, 0x03600, 0x03700, 0x03800, 0x03900, 0x03b00, 0x03d00, 0x03f00, 0x04000, 0x04100, 0x04300, 0x04400, 0x04500, 0x04600, 0x04700, 0x04a00, 0x04c00, 0x04d00, 0x04f00, 0x05600, 0x05900, 0x05a00, 0x05b00, 0x05c00, 0x05d00, 0x05f00, 0x06600, 0x06700, 0x06e00, 0x07100, 0x07200, 0x07400, 0x07900, 0x07d00, 0x08100, 0x08500, 0x08a00, 0x09700, 0x09800, 0x09f00, 0x0ff00, 0x20100, 0x20200, 0x20a00, 0x20b00, 0x21a00, 0x21d00, 0x21e00, 0x22100, 0x22700, 0x23200, 0x23500, 0x23600, 0x23b00, 0x23e00, 0x23f00, 0x24000, 0x24200, 0x24b00, 0x25400, 0x25a00, 0x26b00, 0x26c00, 0x26e00, 0x27000, 0x27200, 0x27300, 0x27b00, 0x27c00, 0x28600, 0x28900, 0x28b00, 0x29000, 0x29800, 0x29900, 0x29e00, 0x2a100, 0x2a300, }; static int hkscs2004_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 == 0x87) || (c1 >= 0x8c && c1 <= 0x8d)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { unsigned int i = 157 * (c1 - 0x80) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); ucs4_t wc = 0xfffd; unsigned short swc; if (i < 1884) { if (i < 1157) swc = hkscs2004_2uni_page87[i-1099], wc = hkscs2004_2uni_upages[swc>>8] | (swc & 0xff); } else { if (i < 2073) swc = hkscs2004_2uni_page8c[i-1884], wc = hkscs2004_2uni_upages[swc>>8] | (swc & 0xff); } if (wc != 0xfffd) { *pwc = wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short hkscs2004_2charset[123] = { 0x8cf4, 0x8770, 0x8d5c, 0x8d4b, 0x8d52, 0x8cf3, 0x874b, 0x8cea, 0x8cdf, 0x876a, 0x8d47, 0x8d5a, 0x8d4a, 0x8d44, 0x8d4e, 0x8d5f, 0x8ce3, 0x8740, 0x8d5e, 0x8ce0, 0x8d5d, 0x8d55, 0x8ce4, 0x8cef, 0x8d54, 0x8d51, 0x8744, 0x8743, 0x8747, 0x8758, 0x8d59, 0x8742, 0x875d, 0x8d45, 0x8d4c, 0x874c, 0x874d, 0x8757, 0x875c, 0x8741, 0x874f, 0x874e, 0x8755, 0x8cf2, 0x8d57, 0x8759, 0x8749, 0x875b, 0x8d58, 0x8746, 0x8d56, 0x8cf8, 0x8765, 0x8768, 0x8cfa, 0x876f, 0x8772, 0x8773, 0x876d, 0x8ce9, 0x8ce6, 0x8774, 0x8cec, 0x8cfe, 0x8764, 0x8cdb, 0x8775, 0x8cdd, 0x8cee, 0x875f, 0x8778, 0x8779, 0x8cde, 0x8767, 0x8cfb, 0x8776, 0x8cf7, 0x8ce8, 0x876b, 0x8cfc, 0x8ced, 0x8d48, 0x8cf5, 0x8cf9, 0x8c62, 0x8d40, 0x8761, 0x876e, 0x8cf1, 0x8d42, 0x8ce2, 0x8ce1, 0x8ceb, 0x8751, 0x8ce7, 0x8762, 0x8763, 0x8cf0, 0x8750, 0x8d5b, 0x8d53, 0x8760, 0x875e, 0x8cf6, 0x8d4d, 0x8753, 0x8754, 0x8745, 0x8752, 0x8d50, 0x876c, 0x875a, 0x8748, 0x874a, 0x8d4f, 0x8d43, 0x8769, 0x8d46, 0x8cfd, 0x8777, 0x8771, 0x8d49, 0x8756, }; static const Summary16 hkscs2004_uni2indx_page34[5] = { /* 0x3400 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0400 }, }; static const Summary16 hkscs2004_uni2indx_page36[56] = { /* 0x3600 */ { 1, 0x0000 }, { 1, 0x0000 }, { 1, 0x0020 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0002 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, /* 0x3700 */ { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0040 }, { 4, 0x0000 }, { 4, 0x0000 }, /* 0x3800 */ { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0010 }, { 5, 0x0000 }, { 5, 0x0000 }, /* 0x3900 */ { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0100 }, }; static const Summary16 hkscs2004_uni2indx_page3b[10] = { /* 0x3b00 */ { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0020 }, }; static const Summary16 hkscs2004_uni2indx_page3d[16] = { /* 0x3d00 */ { 7, 0x0000 }, { 7, 0x0004 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0100 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0010 }, }; static const Summary16 hkscs2004_uni2indx_page3f[47] = { /* 0x3f00 */ { 10, 0x0080 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0100 }, { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, /* 0x4000 */ { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0100 }, /* 0x4100 */ { 13, 0x0004 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x1000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x2000 }, }; static const Summary16 hkscs2004_uni2indx_page43[69] = { /* 0x4300 */ { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0400 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0001 }, /* 0x4400 */ { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x2000 }, { 19, 0x0008 }, { 20, 0x4000 }, { 21, 0x0000 }, { 21, 0x0000 }, /* 0x4500 */ { 21, 0x0000 }, { 21, 0x0800 }, { 22, 0x0000 }, { 22, 0x0040 }, { 23, 0x0000 }, { 23, 0x0100 }, { 24, 0x2002 }, { 26, 0x0100 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0040 }, { 28, 0x0008 }, { 29, 0x0000 }, { 29, 0x0400 }, { 30, 0x0400 }, { 31, 0x0000 }, /* 0x4600 */ { 31, 0x0008 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0002 }, { 33, 0x0800 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0080 }, /* 0x4700 */ { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0040 }, { 36, 0x8010 }, }; static const Summary16 hkscs2004_uni2indx_page4a[11] = { /* 0x4a00 */ { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0000 }, { 38, 0x0010 }, }; static const Summary16 hkscs2004_uni2indx_page4c[25] = { /* 0x4c00 */ { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x0004 }, { 40, 0x0081 }, { 42, 0x0080 }, { 43, 0x0000 }, { 43, 0x0880 }, { 45, 0x0020 }, { 46, 0x0000 }, { 46, 0x0000 }, { 46, 0x0000 }, { 46, 0x0000 }, { 46, 0x0000 }, { 46, 0x0004 }, { 47, 0x0000 }, /* 0x4d00 */ { 47, 0x0080 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x00c0 }, { 50, 0x0200 }, }; static const Summary16 hkscs2004_uni2indx_page4f[12] = { /* 0x4f00 */ { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0000 }, { 51, 0x0010 }, }; static const Summary16 hkscs2004_uni2indx_page56[16] = { /* 0x5600 */ { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0000 }, { 52, 0x0800 }, }; static const Summary16 hkscs2004_uni2indx_page59[72] = { /* 0x5900 */ { 53, 0x0000 }, { 53, 0x2000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x8000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, /* 0x5a00 */ { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0010 }, { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0002 }, { 57, 0x0000 }, { 57, 0x0000 }, /* 0x5b00 */ { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0080 }, { 58, 0x0000 }, { 58, 0x0800 }, { 59, 0x0000 }, { 59, 0x0000 }, /* 0x5c00 */ { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0100 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0020 }, { 61, 0x0000 }, { 61, 0x1000 }, /* 0x5d00 */ { 62, 0x0000 }, { 62, 0x0000 }, { 62, 0x0000 }, { 62, 0x0000 }, { 62, 0x0000 }, { 62, 0x0000 }, { 62, 0x0000 }, { 62, 0x0100 }, }; static const Summary16 hkscs2004_uni2indx_page5f[4] = { /* 0x5f00 */ { 63, 0x0000 }, { 63, 0x0000 }, { 63, 0x0000 }, { 63, 0x0800 }, }; static const Summary16 hkscs2004_uni2indx_page66[23] = { /* 0x6600 */ { 64, 0x0000 }, { 64, 0x0000 }, { 64, 0x0000 }, { 64, 0x0000 }, { 64, 0x2000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0080 }, { 66, 0x0000 }, /* 0x6700 */ { 66, 0x0000 }, { 66, 0x0000 }, { 66, 0x0000 }, { 66, 0x0000 }, { 66, 0x0000 }, { 66, 0x0000 }, { 66, 0x4000 }, }; static const Summary16 hkscs2004_uni2indx_page6e[6] = { /* 0x6e00 */ { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0080 }, }; static const Summary16 hkscs2004_uni2indx_page71[19] = { /* 0x7100 */ { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0000 }, { 68, 0x0080 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, /* 0x7200 */ { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0020 }, }; static const Summary16 hkscs2004_uni2indx_page74[10] = { /* 0x7400 */ { 70, 0x0000 }, { 70, 0x0000 }, { 70, 0x0000 }, { 70, 0x0000 }, { 70, 0x0000 }, { 70, 0x0000 }, { 70, 0x0002 }, { 71, 0x0000 }, { 71, 0x0000 }, { 71, 0x2000 }, }; static const Summary16 hkscs2004_uni2indx_page79[13] = { /* 0x7900 */ { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0000 }, { 72, 0x0400 }, }; static const Summary16 hkscs2004_uni2indx_page7d[10] = { /* 0x7d00 */ { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0000 }, { 73, 0x0020 }, }; static const Summary16 hkscs2004_uni2indx_page81[7] = { /* 0x8100 */ { 74, 0x0000 }, { 74, 0x0000 }, { 74, 0x0000 }, { 74, 0x0000 }, { 74, 0x0000 }, { 74, 0x0000 }, { 74, 0x1000 }, }; static const Summary16 hkscs2004_uni2indx_page85[10] = { /* 0x8500 */ { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0000 }, { 75, 0x0008 }, }; static const Summary16 hkscs2004_uni2indx_page8a[16] = { /* 0x8a00 */ { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x0000 }, { 76, 0x1000 }, { 77, 0x0000 }, { 77, 0x0000 }, { 77, 0x0200 }, }; static const Summary16 hkscs2004_uni2indx_page97[22] = { /* 0x9700 */ { 78, 0x0000 }, { 78, 0x0000 }, { 78, 0x0000 }, { 78, 0x0010 }, { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x0000 }, /* 0x9800 */ { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x0040 }, }; static const Summary16 hkscs2004_uni2indx_page9f[12] = { /* 0x9f00 */ { 80, 0x0000 }, { 80, 0x0000 }, { 80, 0x0000 }, { 80, 0x0000 }, { 80, 0x0000 }, { 80, 0x0000 }, { 80, 0x0000 }, { 80, 0x0000 }, { 80, 0x0000 }, { 80, 0x0000 }, { 80, 0x0000 }, { 80, 0x000c }, }; static const Summary16 hkscs2004_uni2indx_page201[20] = { /* 0x20100 */ { 82, 0x0000 }, { 82, 0x0000 }, { 82, 0x0000 }, { 82, 0x0000 }, { 82, 0x0000 }, { 82, 0x0000 }, { 82, 0x0000 }, { 82, 0x0000 }, { 82, 0x0000 }, { 82, 0x0000 }, { 82, 0x0010 }, { 83, 0x0000 }, { 83, 0x0000 }, { 83, 0x0000 }, { 83, 0x0000 }, { 83, 0x0000 }, /* 0x20200 */ { 83, 0x0000 }, { 83, 0x0000 }, { 83, 0x0000 }, { 83, 0x0200 }, }; static const Summary16 hkscs2004_uni2indx_page20a[26] = { /* 0x20a00 */ { 84, 0x0000 }, { 84, 0x0000 }, { 84, 0x0000 }, { 84, 0x0000 }, { 84, 0x0000 }, { 84, 0x0000 }, { 84, 0x8000 }, { 85, 0x0000 }, { 85, 0x0000 }, { 85, 0x0000 }, { 85, 0x0000 }, { 85, 0x0000 }, { 85, 0x0000 }, { 85, 0x0000 }, { 85, 0x0000 }, { 85, 0x0000 }, /* 0x20b00 */ { 85, 0x0000 }, { 85, 0x0000 }, { 85, 0x0000 }, { 85, 0x0000 }, { 85, 0x0000 }, { 85, 0x0000 }, { 85, 0x0000 }, { 85, 0x0000 }, { 85, 0x0000 }, { 85, 0x8000 }, }; static const Summary16 hkscs2004_uni2indx_page21a[7] = { /* 0x21a00 */ { 86, 0x0000 }, { 86, 0x0000 }, { 86, 0x0000 }, { 86, 0x0000 }, { 86, 0x0000 }, { 86, 0x0000 }, { 86, 0x0008 }, }; static const Summary16 hkscs2004_uni2indx_page21d[19] = { /* 0x21d00 */ { 87, 0x0000 }, { 87, 0x0000 }, { 87, 0x0000 }, { 87, 0x0000 }, { 87, 0x0000 }, { 87, 0x4000 }, { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0000 }, /* 0x21e00 */ { 88, 0x0000 }, { 88, 0x0000 }, { 88, 0x0008 }, }; static const Summary16 hkscs2004_uni2indx_page221[13] = { /* 0x22100 */ { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0000 }, { 89, 0x0002 }, }; static const Summary16 hkscs2004_uni2indx_page227[10] = { /* 0x22700 */ { 90, 0x0000 }, { 90, 0x0000 }, { 90, 0x0000 }, { 90, 0x0000 }, { 90, 0x0000 }, { 90, 0x0000 }, { 90, 0x0000 }, { 90, 0x0000 }, { 90, 0x0000 }, { 90, 0x0040 }, }; static const Summary16 hkscs2004_uni2indx_page232[6] = { /* 0x23200 */ { 91, 0x0000 }, { 91, 0x0000 }, { 91, 0x0000 }, { 91, 0x0000 }, { 91, 0x0000 }, { 91, 0x0040 }, }; static const Summary16 hkscs2004_uni2indx_page235[18] = { /* 0x23500 */ { 92, 0x0000 }, { 92, 0x0000 }, { 92, 0x0000 }, { 92, 0x0000 }, { 92, 0x0000 }, { 92, 0x0002 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, { 93, 0x0000 }, /* 0x23600 */ { 93, 0x0000 }, { 93, 0x0080 }, }; static const Summary16 hkscs2004_uni2indx_page23b[2] = { /* 0x23b00 */ { 94, 0x0000 }, { 94, 0x0400 }, }; static const Summary16 hkscs2004_uni2indx_page23e[47] = { /* 0x23e00 */ { 95, 0x0040 }, { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, /* 0x23f00 */ { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0000 }, { 96, 0x0002 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, /* 0x24000 */ { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x0000 }, { 97, 0x1000 }, }; static const Summary16 hkscs2004_uni2indx_page242[12] = { /* 0x24200 */ { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x8000 }, }; static const Summary16 hkscs2004_uni2indx_page24b[1] = { /* 0x24b00 */ { 99, 0x8000 }, }; static const Summary16 hkscs2004_uni2indx_page254[10] = { /* 0x25400 */ { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0000 }, { 100, 0x0400 }, }; static const Summary16 hkscs2004_uni2indx_page25a[6] = { /* 0x25a00 */ { 101, 0x0000 }, { 101, 0x0000 }, { 101, 0x0000 }, { 101, 0x0000 }, { 101, 0x0000 }, { 101, 0x0010 }, }; static const Summary16 hkscs2004_uni2indx_page26b[21] = { /* 0x26b00 */ { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0008 }, { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0000 }, /* 0x26c00 */ { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0042 }, }; static const Summary16 hkscs2004_uni2indx_page26e[9] = { /* 0x26e00 */ { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0800 }, }; static const Summary16 hkscs2004_uni2indx_page270[14] = { /* 0x27000 */ { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0004 }, }; static const Summary16 hkscs2004_uni2indx_page272[32] = { /* 0x27200 */ { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0080 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, /* 0x27300 */ { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0000 }, { 108, 0x0004 }, { 109, 0x0000 }, { 109, 0x0000 }, { 109, 0x0000 }, { 109, 0x0000 }, { 109, 0x0000 }, { 109, 0x0000 }, { 109, 0x0000 }, { 109, 0x0000 }, { 109, 0x0000 }, { 109, 0x8000 }, }; static const Summary16 hkscs2004_uni2indx_page27b[29] = { /* 0x27b00 */ { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x0000 }, { 110, 0x8000 }, { 111, 0x0000 }, /* 0x27c00 */ { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x0000 }, { 111, 0x1000 }, { 112, 0x0000 }, { 112, 0x0000 }, { 112, 0x0000 }, { 112, 0x0000 }, { 112, 0x0002 }, { 113, 0x0020 }, }; static const Summary16 hkscs2004_uni2indx_page286[12] = { /* 0x28600 */ { 114, 0x0000 }, { 114, 0x0000 }, { 114, 0x0000 }, { 114, 0x0000 }, { 114, 0x0000 }, { 114, 0x0000 }, { 114, 0x0000 }, { 114, 0x0000 }, { 114, 0x0000 }, { 114, 0x0000 }, { 114, 0x0000 }, { 114, 0x0004 }, }; static const Summary16 hkscs2004_uni2indx_page289[7] = { /* 0x28900 */ { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x0000 }, { 115, 0x2000 }, }; static const Summary16 hkscs2004_uni2indx_page28b[12] = { /* 0x28b00 */ { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0200 }, }; static const Summary16 hkscs2004_uni2indx_page290[8] = { /* 0x29000 */ { 117, 0x0000 }, { 117, 0x0000 }, { 117, 0x0000 }, { 117, 0x0000 }, { 117, 0x0000 }, { 117, 0x0000 }, { 117, 0x0000 }, { 117, 0x0200 }, }; static const Summary16 hkscs2004_uni2indx_page298[21] = { /* 0x29800 */ { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0400 }, /* 0x29900 */ { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0x0000 }, { 119, 0x0020 }, }; static const Summary16 hkscs2004_uni2indx_page29e[12] = { /* 0x29e00 */ { 120, 0x0000 }, { 120, 0x0000 }, { 120, 0x0000 }, { 120, 0x0000 }, { 120, 0x0000 }, { 120, 0x0000 }, { 120, 0x0000 }, { 120, 0x0000 }, { 120, 0x0000 }, { 120, 0x0000 }, { 120, 0x0000 }, { 120, 0x0001 }, }; static const Summary16 hkscs2004_uni2indx_page2a1[12] = { /* 0x2a100 */ { 121, 0x0000 }, { 121, 0x0000 }, { 121, 0x0000 }, { 121, 0x0000 }, { 121, 0x0000 }, { 121, 0x0000 }, { 121, 0x0000 }, { 121, 0x0000 }, { 121, 0x0000 }, { 121, 0x0000 }, { 121, 0x0000 }, { 121, 0x0020 }, }; static const Summary16 hkscs2004_uni2indx_page2a3[6] = { /* 0x2a300 */ { 122, 0x0000 }, { 122, 0x0000 }, { 122, 0x0000 }, { 122, 0x0000 }, { 122, 0x0000 }, { 122, 0x0002 }, }; static int hkscs2004_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc < 0x21a00) { if (wc < 0x6e00) { if (wc >= 0x3400 && wc < 0x3450) summary = &hkscs2004_uni2indx_page34[(wc>>4)-0x340]; else if (wc >= 0x3600 && wc < 0x3980) summary = &hkscs2004_uni2indx_page36[(wc>>4)-0x360]; else if (wc >= 0x3b00 && wc < 0x3ba0) summary = &hkscs2004_uni2indx_page3b[(wc>>4)-0x3b0]; else if (wc >= 0x3d00 && wc < 0x3e00) summary = &hkscs2004_uni2indx_page3d[(wc>>4)-0x3d0]; else if (wc >= 0x3f00 && wc < 0x41f0) summary = &hkscs2004_uni2indx_page3f[(wc>>4)-0x3f0]; else if (wc >= 0x4300 && wc < 0x4750) summary = &hkscs2004_uni2indx_page43[(wc>>4)-0x430]; else if (wc >= 0x4a00 && wc < 0x4ab0) summary = &hkscs2004_uni2indx_page4a[(wc>>4)-0x4a0]; else if (wc >= 0x4c00 && wc < 0x4d90) summary = &hkscs2004_uni2indx_page4c[(wc>>4)-0x4c0]; else if (wc >= 0x4f00 && wc < 0x4fc0) summary = &hkscs2004_uni2indx_page4f[(wc>>4)-0x4f0]; else if (wc >= 0x5600 && wc < 0x5700) summary = &hkscs2004_uni2indx_page56[(wc>>4)-0x560]; else if (wc >= 0x5900 && wc < 0x5d80) summary = &hkscs2004_uni2indx_page59[(wc>>4)-0x590]; else if (wc >= 0x5f00 && wc < 0x5f40) summary = &hkscs2004_uni2indx_page5f[(wc>>4)-0x5f0]; else if (wc >= 0x6600 && wc < 0x6770) summary = &hkscs2004_uni2indx_page66[(wc>>4)-0x660]; } else { if (wc >= 0x6e00 && wc < 0x6e60) summary = &hkscs2004_uni2indx_page6e[(wc>>4)-0x6e0]; else if (wc >= 0x7100 && wc < 0x7230) summary = &hkscs2004_uni2indx_page71[(wc>>4)-0x710]; else if (wc >= 0x7400 && wc < 0x74a0) summary = &hkscs2004_uni2indx_page74[(wc>>4)-0x740]; else if (wc >= 0x7900 && wc < 0x79d0) summary = &hkscs2004_uni2indx_page79[(wc>>4)-0x790]; else if (wc >= 0x7d00 && wc < 0x7da0) summary = &hkscs2004_uni2indx_page7d[(wc>>4)-0x7d0]; else if (wc >= 0x8100 && wc < 0x8170) summary = &hkscs2004_uni2indx_page81[(wc>>4)-0x810]; else if (wc >= 0x8500 && wc < 0x85a0) summary = &hkscs2004_uni2indx_page85[(wc>>4)-0x850]; else if (wc >= 0x8a00 && wc < 0x8b00) summary = &hkscs2004_uni2indx_page8a[(wc>>4)-0x8a0]; else if (wc >= 0x9700 && wc < 0x9860) summary = &hkscs2004_uni2indx_page97[(wc>>4)-0x970]; else if (wc >= 0x9f00 && wc < 0x9fc0) summary = &hkscs2004_uni2indx_page9f[(wc>>4)-0x9f0]; else if (wc >= 0x20100 && wc < 0x20240) summary = &hkscs2004_uni2indx_page201[(wc>>4)-0x2010]; else if (wc >= 0x20a00 && wc < 0x20ba0) summary = &hkscs2004_uni2indx_page20a[(wc>>4)-0x20a0]; } } else { if (wc < 0x26b00) { if (wc >= 0x21a00 && wc < 0x21a70) summary = &hkscs2004_uni2indx_page21a[(wc>>4)-0x21a0]; else if (wc >= 0x21d00 && wc < 0x21e30) summary = &hkscs2004_uni2indx_page21d[(wc>>4)-0x21d0]; else if (wc >= 0x22100 && wc < 0x221d0) summary = &hkscs2004_uni2indx_page221[(wc>>4)-0x2210]; else if (wc >= 0x22700 && wc < 0x227a0) summary = &hkscs2004_uni2indx_page227[(wc>>4)-0x2270]; else if (wc >= 0x23200 && wc < 0x23260) summary = &hkscs2004_uni2indx_page232[(wc>>4)-0x2320]; else if (wc >= 0x23500 && wc < 0x23620) summary = &hkscs2004_uni2indx_page235[(wc>>4)-0x2350]; else if (wc >= 0x23b00 && wc < 0x23b20) summary = &hkscs2004_uni2indx_page23b[(wc>>4)-0x23b0]; else if (wc >= 0x23e00 && wc < 0x240f0) summary = &hkscs2004_uni2indx_page23e[(wc>>4)-0x23e0]; else if (wc >= 0x24200 && wc < 0x242c0) summary = &hkscs2004_uni2indx_page242[(wc>>4)-0x2420]; else if (wc >= 0x24b00 && wc < 0x24b10) summary = &hkscs2004_uni2indx_page24b[(wc>>4)-0x24b0]; else if (wc >= 0x25400 && wc < 0x254a0) summary = &hkscs2004_uni2indx_page254[(wc>>4)-0x2540]; else if (wc >= 0x25a00 && wc < 0x25a60) summary = &hkscs2004_uni2indx_page25a[(wc>>4)-0x25a0]; } else { if (wc >= 0x26b00 && wc < 0x26c50) summary = &hkscs2004_uni2indx_page26b[(wc>>4)-0x26b0]; else if (wc >= 0x26e00 && wc < 0x26e90) summary = &hkscs2004_uni2indx_page26e[(wc>>4)-0x26e0]; else if (wc >= 0x27000 && wc < 0x270e0) summary = &hkscs2004_uni2indx_page270[(wc>>4)-0x2700]; else if (wc >= 0x27200 && wc < 0x27400) summary = &hkscs2004_uni2indx_page272[(wc>>4)-0x2720]; else if (wc >= 0x27b00 && wc < 0x27cd0) summary = &hkscs2004_uni2indx_page27b[(wc>>4)-0x27b0]; else if (wc >= 0x28600 && wc < 0x286c0) summary = &hkscs2004_uni2indx_page286[(wc>>4)-0x2860]; else if (wc >= 0x28900 && wc < 0x28970) summary = &hkscs2004_uni2indx_page289[(wc>>4)-0x2890]; else if (wc >= 0x28b00 && wc < 0x28bc0) summary = &hkscs2004_uni2indx_page28b[(wc>>4)-0x28b0]; else if (wc >= 0x29000 && wc < 0x29080) summary = &hkscs2004_uni2indx_page290[(wc>>4)-0x2900]; else if (wc >= 0x29800 && wc < 0x29950) summary = &hkscs2004_uni2indx_page298[(wc>>4)-0x2980]; else if (wc >= 0x29e00 && wc < 0x29ec0) summary = &hkscs2004_uni2indx_page29e[(wc>>4)-0x29e0]; else if (wc >= 0x2a100 && wc < 0x2a1c0) summary = &hkscs2004_uni2indx_page2a1[(wc>>4)-0x2a10]; else if (wc >= 0x2a300 && wc < 0x2a360) summary = &hkscs2004_uni2indx_page2a3[(wc>>4)-0x2a30]; } } if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' 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); c = hkscs2004_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/hkscs2008.h000066400000000000000000000512371252300335000245330ustar00rootroot00000000000000/* * Copyright (C) 1999-2010 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * HKSCS:2008 */ static const unsigned short hkscs2008_2uni_page87[126] = { /* 0x87 */ 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x22fd, 0x0175, 0x2453, 0x299e, 0x2d21, 0x03ec, 0x2bde, 0x02f5, 0x16fc, 0x2197, 0x2a61, 0x300d, 0x26ea, 0x238a, 0x275e, 0x060a, 0x1884, 0x2196, 0x1f2f, 0x0930, 0x1a13, 0x0d96, 0x204a, 0x1e18, 0x15d0, 0x1632, 0x0f60, 0x1129, 0x1b9d, 0x144c, 0x17c5, 0x1082, 0x162c, 0x0a4f, 0x1d46, 0x00e6, 0x13c4, 0x2cb9, 0x14c6, 0x21c7, 0x0cb3, 0x092f, 0x0b4c, 0x0531, 0x298e, 0x0d18, 0x1672, 0x2f65, 0x1c8f, 0x08ae, 0x2e88, 0x0581, 0x2c99, 0x17ae, 0x25bc, 0x21c8, 0x25c1, 0x25c9, 0x25cc, 0x21c9, 0x1904, 0x28bb, 0x04b4, 0x21ca, 0x07e1, 0x31ff, 0x0ec1, 0x126e, 0x21cb, }; static const ucs4_t hkscs2008_2uni_upages[50] = { 0x03400, 0x03800, 0x03a00, 0x03e00, 0x04000, 0x04100, 0x04300, 0x04400, 0x04600, 0x04900, 0x05200, 0x05400, 0x05700, 0x05800, 0x06200, 0x06600, 0x06700, 0x06a00, 0x07000, 0x07300, 0x07400, 0x07900, 0x07a00, 0x07b00, 0x08400, 0x08500, 0x08600, 0x08800, 0x08b00, 0x09000, 0x09200, 0x09400, 0x09700, 0x09f00, 0x0ff00, 0x20a00, 0x21d00, 0x22400, 0x23100, 0x23200, 0x23500, 0x23600, 0x24100, 0x25800, 0x25d00, 0x26000, 0x26e00, 0x27b00, 0x28900, 0x2ad00, }; static int hkscs2008_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 == 0x87)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { unsigned int i = 157 * (c1 - 0x80) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); ucs4_t wc = 0xfffd; unsigned short swc; { if (i < 1225) swc = hkscs2008_2uni_page87[i-1099], wc = hkscs2008_2uni_upages[swc>>8] | (swc & 0xff); } if (wc != 0xfffd) { *pwc = wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short hkscs2008_2charset[68] = { 0x87be, 0x877a, 0x87a2, 0x877e, 0x87d9, 0x87c6, 0x87ce, 0x87aa, 0x87db, 0x87cc, 0x87c4, 0x87ae, 0x87bc, 0x87c5, 0x87c3, 0x87c8, 0x87b0, 0x87dd, 0x87b5, 0x87ba, 0x87b6, 0x87de, 0x87bf, 0x87b8, 0x87c1, 0x87b3, 0x87bb, 0x87b4, 0x87c9, 0x87a3, 0x87d0, 0x87b9, 0x87ab, 0x87d7, 0x87af, 0x87b7, 0x87cb, 0x87bd, 0x87b2, 0x87ad, 0x87b1, 0x87ac, 0x87a4, 0x87c2, 0x87d2, 0x87d6, 0x87da, 0x87df, 0x87a8, 0x877b, 0x87d1, 0x87d3, 0x87d4, 0x87d5, 0x87a7, 0x87a9, 0x87d8, 0x87c7, 0x877c, 0x87a5, 0x87a1, 0x87cf, 0x87c0, 0x877d, 0x87cd, 0x87ca, 0x87a6, 0x87dc, }; static const Summary16 hkscs2008_uni2indx_page34[15] = { /* 0x3400 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0040 }, }; static const Summary16 hkscs2008_uni2indx_page38[8] = { /* 0x3800 */ { 1, 0x0000 }, { 1, 0x0000 }, { 1, 0x0000 }, { 1, 0x0000 }, { 1, 0x0000 }, { 1, 0x0000 }, { 1, 0x0000 }, { 1, 0x0020 }, }; static const Summary16 hkscs2008_uni2indx_page3a[16] = { /* 0x3a00 */ { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0000 }, { 2, 0x0020 }, }; static const Summary16 hkscs2008_uni2indx_page3e[15] = { /* 0x3e00 */ { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x0000 }, { 3, 0x1000 }, }; static const Summary16 hkscs2008_uni2indx_page40[25] = { /* 0x4000 */ { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0000 }, { 4, 0x0010 }, { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0000 }, /* 0x4100 */ { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0000 }, { 5, 0x0002 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0000 }, { 6, 0x0002 }, }; static const Summary16 hkscs2008_uni2indx_page43[31] = { /* 0x4300 */ { 7, 0x0400 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, /* 0x4400 */ { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0002 }, }; static const Summary16 hkscs2008_uni2indx_page46[11] = { /* 0x4600 */ { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x4000 }, }; static const Summary16 hkscs2008_uni2indx_page49[4] = { /* 0x4900 */ { 10, 0x0000 }, { 10, 0x0000 }, { 10, 0x8000 }, { 11, 0x0001 }, }; static const Summary16 hkscs2008_uni2indx_page52[5] = { /* 0x5200 */ { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x0000 }, { 12, 0x8000 }, }; static const Summary16 hkscs2008_uni2indx_page54[5] = { /* 0x5400 */ { 13, 0x0000 }, { 13, 0x0000 }, { 13, 0x0000 }, { 13, 0x0000 }, { 13, 0x1000 }, }; static const Summary16 hkscs2008_uni2indx_page57[26] = { /* 0x5700 */ { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0008 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, /* 0x5800 */ { 15, 0x0000 }, { 15, 0x0100 }, { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0000 }, { 16, 0x0040 }, }; static const Summary16 hkscs2008_uni2indx_page62[13] = { /* 0x6200 */ { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0002 }, }; static const Summary16 hkscs2008_uni2indx_page66[25] = { /* 0x6600 */ { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0001 }, { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0000 }, /* 0x6700 */ { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0000 }, { 19, 0x0004 }, }; static const Summary16 hkscs2008_uni2indx_page6a[3] = { /* 0x6a00 */ { 20, 0x0000 }, { 20, 0x0000 }, { 20, 0x0200 }, }; static const Summary16 hkscs2008_uni2indx_page70[7] = { /* 0x7000 */ { 21, 0x0000 }, { 21, 0x0000 }, { 21, 0x0000 }, { 21, 0x0000 }, { 21, 0x0000 }, { 21, 0x0000 }, { 21, 0x4000 }, }; static const Summary16 hkscs2008_uni2indx_page73[29] = { /* 0x7300 */ { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0000 }, { 22, 0x0010 }, { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0x0000 }, /* 0x7400 */ { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0x1000 }, { 24, 0x0000 }, { 24, 0x0000 }, { 24, 0x0000 }, { 24, 0x0000 }, { 24, 0x0000 }, { 24, 0x0000 }, { 24, 0x0000 }, { 24, 0x0040 }, }; static const Summary16 hkscs2008_uni2indx_page79[45] = { /* 0x7900 */ { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0001 }, { 26, 0x0000 }, { 26, 0x0000 }, /* 0x7a00 */ { 26, 0x0000 }, { 26, 0x0000 }, { 26, 0x1000 }, { 27, 0x0004 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0004 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x1000 }, /* 0x7b00 */ { 30, 0x0000 }, { 30, 0x0000 }, { 30, 0x0000 }, { 30, 0x0000 }, { 30, 0x0000 }, { 30, 0x0000 }, { 30, 0x0000 }, { 30, 0x0000 }, { 30, 0x0000 }, { 30, 0x0000 }, { 30, 0x4000 }, { 31, 0x0000 }, { 31, 0x0020 }, }; static const Summary16 hkscs2008_uni2indx_page84[34] = { /* 0x8400 */ { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0010 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, /* 0x8500 */ { 33, 0x0010 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, { 34, 0x0000 }, /* 0x8600 */ { 34, 0x0000 }, { 34, 0x0008 }, }; static const Summary16 hkscs2008_uni2indx_page88[10] = { /* 0x8800 */ { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x2000 }, }; static const Summary16 hkscs2008_uni2indx_page8b[9] = { /* 0x8b00 */ { 36, 0x0000 }, { 36, 0x0000 }, { 36, 0x0000 }, { 36, 0x0000 }, { 36, 0x0000 }, { 36, 0x0000 }, { 36, 0x0000 }, { 36, 0x0000 }, { 36, 0x8000 }, }; static const Summary16 hkscs2008_uni2indx_page90[5] = { /* 0x9000 */ { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0000 }, { 37, 0x0040 }, }; static const Summary16 hkscs2008_uni2indx_page92[2] = { /* 0x9200 */ { 38, 0x0000 }, { 38, 0x0100 }, }; static const Summary16 hkscs2008_uni2indx_page94[3] = { /* 0x9400 */ { 39, 0x0000 }, { 39, 0x0000 }, { 39, 0x8000 }, }; static const Summary16 hkscs2008_uni2indx_page97[5] = { /* 0x9700 */ { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0000 }, { 40, 0x0400 }, }; static const Summary16 hkscs2008_uni2indx_page9f[13] = { /* 0x9f00 */ { 41, 0x0000 }, { 41, 0x0000 }, { 41, 0x0000 }, { 41, 0x0000 }, { 41, 0x0000 }, { 41, 0x0000 }, { 41, 0x0000 }, { 41, 0x0000 }, { 41, 0x0000 }, { 41, 0x00c0 }, { 43, 0x0000 }, { 43, 0x0000 }, { 43, 0x0f80 }, }; static const Summary16 hkscs2008_uni2indx_page20a[9] = { /* 0x20a00 */ { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0000 }, { 48, 0x0400 }, }; static const Summary16 hkscs2008_uni2indx_page21d[6] = { /* 0x21d00 */ { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0000 }, { 49, 0x0008 }, }; static const Summary16 hkscs2008_uni2indx_page224[13] = { /* 0x22400 */ { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x1000 }, { 51, 0x1202 }, }; static const Summary16 hkscs2008_uni2indx_page231[22] = { /* 0x23100 */ { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0000 }, { 54, 0x0400 }, { 55, 0x0000 }, /* 0x23200 */ { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x0000 }, { 55, 0x4000 }, }; static const Summary16 hkscs2008_uni2indx_page235[26] = { /* 0x23500 */ { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0000 }, { 56, 0x0800 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, /* 0x23600 */ { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x4000 }, { 58, 0x4000 }, }; static const Summary16 hkscs2008_uni2indx_page241[7] = { /* 0x24100 */ { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0002 }, }; static const Summary16 hkscs2008_uni2indx_page258[14] = { /* 0x25800 */ { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x0000 }, { 60, 0x4000 }, }; static const Summary16 hkscs2008_uni2indx_page25d[12] = { /* 0x25d00 */ { 61, 0x0000 }, { 61, 0x0000 }, { 61, 0x0000 }, { 61, 0x0000 }, { 61, 0x0000 }, { 61, 0x0000 }, { 61, 0x0000 }, { 61, 0x0000 }, { 61, 0x0000 }, { 61, 0x0200 }, { 62, 0x0000 }, { 62, 0x0200 }, }; static const Summary16 hkscs2008_uni2indx_page260[3] = { /* 0x26000 */ { 63, 0x0000 }, { 63, 0x0000 }, { 63, 0x0002 }, }; static const Summary16 hkscs2008_uni2indx_page26e[9] = { /* 0x26e00 */ { 64, 0x0000 }, { 64, 0x0000 }, { 64, 0x0000 }, { 64, 0x0000 }, { 64, 0x0000 }, { 64, 0x0000 }, { 64, 0x0000 }, { 64, 0x0000 }, { 64, 0x0100 }, }; static const Summary16 hkscs2008_uni2indx_page27b[7] = { /* 0x27b00 */ { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0000 }, { 65, 0x0020 }, }; static const Summary16 hkscs2008_uni2indx_page289[1] = { /* 0x28900 */ { 66, 0x2000 }, }; static const Summary16 hkscs2008_uni2indx_page2ad[16] = { /* 0x2ad00 */ { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x0000 }, { 67, 0x8000 }, }; static int hkscs2008_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc >= 0x3400 && wc < 0x34f0) summary = &hkscs2008_uni2indx_page34[(wc>>4)-0x340]; else if (wc >= 0x3800 && wc < 0x3880) summary = &hkscs2008_uni2indx_page38[(wc>>4)-0x380]; else if (wc >= 0x3a00 && wc < 0x3b00) summary = &hkscs2008_uni2indx_page3a[(wc>>4)-0x3a0]; else if (wc >= 0x3e00 && wc < 0x3ef0) summary = &hkscs2008_uni2indx_page3e[(wc>>4)-0x3e0]; else if (wc >= 0x4000 && wc < 0x4190) summary = &hkscs2008_uni2indx_page40[(wc>>4)-0x400]; else if (wc >= 0x4300 && wc < 0x44f0) summary = &hkscs2008_uni2indx_page43[(wc>>4)-0x430]; else if (wc >= 0x4600 && wc < 0x46b0) summary = &hkscs2008_uni2indx_page46[(wc>>4)-0x460]; else if (wc >= 0x4900 && wc < 0x4940) summary = &hkscs2008_uni2indx_page49[(wc>>4)-0x490]; else if (wc >= 0x5200 && wc < 0x5250) summary = &hkscs2008_uni2indx_page52[(wc>>4)-0x520]; else if (wc >= 0x5400 && wc < 0x5450) summary = &hkscs2008_uni2indx_page54[(wc>>4)-0x540]; else if (wc >= 0x5700 && wc < 0x58a0) summary = &hkscs2008_uni2indx_page57[(wc>>4)-0x570]; else if (wc >= 0x6200 && wc < 0x62d0) summary = &hkscs2008_uni2indx_page62[(wc>>4)-0x620]; else if (wc >= 0x6600 && wc < 0x6790) summary = &hkscs2008_uni2indx_page66[(wc>>4)-0x660]; else if (wc >= 0x6a00 && wc < 0x6a30) summary = &hkscs2008_uni2indx_page6a[(wc>>4)-0x6a0]; else if (wc >= 0x7000 && wc < 0x7070) summary = &hkscs2008_uni2indx_page70[(wc>>4)-0x700]; else if (wc >= 0x7300 && wc < 0x74d0) summary = &hkscs2008_uni2indx_page73[(wc>>4)-0x730]; else if (wc >= 0x7900 && wc < 0x7bd0) summary = &hkscs2008_uni2indx_page79[(wc>>4)-0x790]; else if (wc >= 0x8400 && wc < 0x8620) summary = &hkscs2008_uni2indx_page84[(wc>>4)-0x840]; else if (wc >= 0x8800 && wc < 0x88a0) summary = &hkscs2008_uni2indx_page88[(wc>>4)-0x880]; else if (wc >= 0x8b00 && wc < 0x8b90) summary = &hkscs2008_uni2indx_page8b[(wc>>4)-0x8b0]; else if (wc >= 0x9000 && wc < 0x9050) summary = &hkscs2008_uni2indx_page90[(wc>>4)-0x900]; else if (wc >= 0x9200 && wc < 0x9220) summary = &hkscs2008_uni2indx_page92[(wc>>4)-0x920]; else if (wc >= 0x9400 && wc < 0x9430) summary = &hkscs2008_uni2indx_page94[(wc>>4)-0x940]; else if (wc >= 0x9700 && wc < 0x9750) summary = &hkscs2008_uni2indx_page97[(wc>>4)-0x970]; else if (wc >= 0x9f00 && wc < 0x9fd0) summary = &hkscs2008_uni2indx_page9f[(wc>>4)-0x9f0]; else if (wc >= 0x20a00 && wc < 0x20a90) summary = &hkscs2008_uni2indx_page20a[(wc>>4)-0x20a0]; else if (wc >= 0x21d00 && wc < 0x21d60) summary = &hkscs2008_uni2indx_page21d[(wc>>4)-0x21d0]; else if (wc >= 0x22400 && wc < 0x224d0) summary = &hkscs2008_uni2indx_page224[(wc>>4)-0x2240]; else if (wc >= 0x23100 && wc < 0x23260) summary = &hkscs2008_uni2indx_page231[(wc>>4)-0x2310]; else if (wc >= 0x23500 && wc < 0x236a0) summary = &hkscs2008_uni2indx_page235[(wc>>4)-0x2350]; else if (wc >= 0x24100 && wc < 0x24170) summary = &hkscs2008_uni2indx_page241[(wc>>4)-0x2410]; else if (wc >= 0x25800 && wc < 0x258e0) summary = &hkscs2008_uni2indx_page258[(wc>>4)-0x2580]; else if (wc >= 0x25d00 && wc < 0x25dc0) summary = &hkscs2008_uni2indx_page25d[(wc>>4)-0x25d0]; else if (wc >= 0x26000 && wc < 0x26030) summary = &hkscs2008_uni2indx_page260[(wc>>4)-0x2600]; else if (wc >= 0x26e00 && wc < 0x26e90) summary = &hkscs2008_uni2indx_page26e[(wc>>4)-0x26e0]; else if (wc >= 0x27b00 && wc < 0x27b70) summary = &hkscs2008_uni2indx_page27b[(wc>>4)-0x27b0]; else if (wc >= 0x28900 && wc < 0x28910) summary = &hkscs2008_uni2indx_page289[(wc>>4)-0x2890]; else if (wc >= 0x2ad00 && wc < 0x2ae00) summary = &hkscs2008_uni2indx_page2ad[(wc>>4)-0x2ad0]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' 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); c = hkscs2008_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/hp_roman8.h000066400000000000000000000105461252300335000247770ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * HP-ROMAN8 */ static const unsigned short hp_roman8_2uni[96] = { /* 0xa0 */ 0x00a0, 0x00c0, 0x00c2, 0x00c8, 0x00ca, 0x00cb, 0x00ce, 0x00cf, 0x00b4, 0x02cb, 0x02c6, 0x00a8, 0x02dc, 0x00d9, 0x00db, 0x20a4, /* 0xb0 */ 0x00af, 0x00dd, 0x00fd, 0x00b0, 0x00c7, 0x00e7, 0x00d1, 0x00f1, 0x00a1, 0x00bf, 0x00a4, 0x00a3, 0x00a5, 0x00a7, 0x0192, 0x00a2, /* 0xc0 */ 0x00e2, 0x00ea, 0x00f4, 0x00fb, 0x00e1, 0x00e9, 0x00f3, 0x00fa, 0x00e0, 0x00e8, 0x00f2, 0x00f9, 0x00e4, 0x00eb, 0x00f6, 0x00fc, /* 0xd0 */ 0x00c5, 0x00ee, 0x00d8, 0x00c6, 0x00e5, 0x00ed, 0x00f8, 0x00e6, 0x00c4, 0x00ec, 0x00d6, 0x00dc, 0x00c9, 0x00ef, 0x00df, 0x00d4, /* 0xe0 */ 0x00c1, 0x00c3, 0x00e3, 0x00d0, 0x00f0, 0x00cd, 0x00cc, 0x00d3, 0x00d2, 0x00d5, 0x00f5, 0x0160, 0x0161, 0x00da, 0x0178, 0x00ff, /* 0xf0 */ 0x00de, 0x00fe, 0x00b7, 0x00b5, 0x00b6, 0x00be, 0x2014, 0x00bc, 0x00bd, 0x00aa, 0x00ba, 0x00ab, 0x25a0, 0x00bb, 0x00b1, 0xfffd, }; static int hp_roman8_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = hp_roman8_2uni[c-0xa0]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char hp_roman8_page00[96] = { 0xa0, 0xb8, 0xbf, 0xbb, 0xba, 0xbc, 0x00, 0xbd, /* 0xa0-0xa7 */ 0xab, 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0xb0, /* 0xa8-0xaf */ 0xb3, 0xfe, 0x00, 0x00, 0xa8, 0xf3, 0xf4, 0xf2, /* 0xb0-0xb7 */ 0x00, 0x00, 0xfa, 0xfd, 0xf7, 0xf8, 0xf5, 0xb9, /* 0xb8-0xbf */ 0xa1, 0xe0, 0xa2, 0xe1, 0xd8, 0xd0, 0xd3, 0xb4, /* 0xc0-0xc7 */ 0xa3, 0xdc, 0xa4, 0xa5, 0xe6, 0xe5, 0xa6, 0xa7, /* 0xc8-0xcf */ 0xe3, 0xb6, 0xe8, 0xe7, 0xdf, 0xe9, 0xda, 0x00, /* 0xd0-0xd7 */ 0xd2, 0xad, 0xed, 0xae, 0xdb, 0xb1, 0xf0, 0xde, /* 0xd8-0xdf */ 0xc8, 0xc4, 0xc0, 0xe2, 0xcc, 0xd4, 0xd7, 0xb5, /* 0xe0-0xe7 */ 0xc9, 0xc5, 0xc1, 0xcd, 0xd9, 0xd5, 0xd1, 0xdd, /* 0xe8-0xef */ 0xe4, 0xb7, 0xca, 0xc6, 0xc2, 0xea, 0xce, 0x00, /* 0xf0-0xf7 */ 0xd6, 0xcb, 0xc7, 0xc3, 0xcf, 0xb2, 0xf1, 0xef, /* 0xf8-0xff */ }; static const unsigned char hp_roman8_page01[56] = { 0xeb, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char hp_roman8_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0xa9, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static int hp_roman8_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = hp_roman8_page00[wc-0x00a0]; else if (wc >= 0x0160 && wc < 0x0198) c = hp_roman8_page01[wc-0x0160]; else if (wc >= 0x02c0 && wc < 0x02e0) c = hp_roman8_page02[wc-0x02c0]; else if (wc == 0x2014) c = 0xf6; else if (wc == 0x20a4) c = 0xaf; else if (wc == 0x25a0) c = 0xfc; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/hz.h000066400000000000000000000071771252300335000235330ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* * HZ */ /* Specification: RFC 1842, RFC 1843 */ /* * The state is 1 in GB mode, 0 in ASCII mode. */ static int hz_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { state_t state = conv->istate; unsigned int count = 0; unsigned char c; for (;;) { c = *s; if (c == '~') { if (n < count+2) goto none; c = s[1]; if (state == 0) { if (c == '~') { *pwc = (ucs4_t) '~'; conv->istate = state; return count+2; } if (c == '{') { state = 1; s += 2; count += 2; if (n < count+1) goto none; continue; } if (c == '\n') { s += 2; count += 2; if (n < count+1) goto none; continue; } } else { if (c == '}') { state = 0; s += 2; count += 2; if (n < count+1) goto none; continue; } } goto ilseq; } break; } if (state == 0) { *pwc = (ucs4_t) c; conv->istate = state; return count+1; } else { int ret; if (n < count+2) goto none; ret = gb2312_mbtowc(conv,pwc,s,2); if (ret == RET_ILSEQ) goto ilseq; if (ret != 2) abort(); conv->istate = state; return count+2; } none: conv->istate = state; return RET_TOOFEW(count); ilseq: conv->istate = state; return RET_SHIFT_ILSEQ(count); } static int hz_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { state_t state = conv->ostate; unsigned char buf[2]; int ret; /* Code set 0 (ASCII or GB 1988-89) */ ret = ascii_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { if (ret != 1) abort(); if (buf[0] < 0x80) { int count = (state ? 3 : 1); if (n < count) return RET_TOOSMALL; if (state) { r[0] = '~'; r[1] = '}'; r += 2; state = 0; } r[0] = buf[0]; conv->ostate = state; return count; } } /* Code set 1 (GB 2312-1980) */ ret = gb2312_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (buf[0] < 0x80 && buf[1] < 0x80) { int count = (state ? 2 : 4); if (n < count) return RET_TOOSMALL; if (!state) { r[0] = '~'; r[1] = '{'; r += 2; state = 1; } r[0] = buf[0]; r[1] = buf[1]; conv->ostate = state; return count; } } return RET_ILUNI; } static int hz_reset (conv_t conv, unsigned char *r, int n) { state_t state = conv->ostate; if (state) { if (n < 2) return RET_TOOSMALL; r[0] = '~'; r[1] = '}'; /* conv->ostate = 0; will be done by the caller */ return 2; } else return 0; } freelan-2.0/third-party/source/libiconv-msvc/include/iconv.h000066400000000000000000000264211252300335000242210ustar00rootroot00000000000000/* Copyright (C) 1999-2003, 2005-2006, 2008-2011 Free Software Foundation, Inc. This file is part of the GNU LIBICONV Library. The GNU LIBICONV Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU LIBICONV 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU LIBICONV Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* When installed, this file is called "iconv.h". */ #ifndef _LIBICONV_H #define _LIBICONV_H #define _LIBICONV_VERSION 0x010E /* version number: (major<<8) + minor */ ///////////////////////// 삭제 / DELETE / УДАЛИТЬ /////////////////////// //#if @HAVE_VISIBILITY@ && BUILDING_LIBICONV //#define LIBICONV_DLL_EXPORTED __attribute__((__visibility__("default"))) //#else //#define LIBICONV_DLL_EXPORTED //#endif //extern LIBICONV_DLL_EXPORTED @DLL_VARIABLE@ int _libiconv_version; /* Likewise */ ///////////////////////// 추가 / ADD / ДОВАВЛЯТЬ ////////////////////// #if BUILDING_LIBICONV #define LIBICONV_DLL_EXPORTED __declspec(dllexport) #elif defined (USING_STATIC_LIBICONV) #define LIBICONV_DLL_EXPORTED #else #define LIBICONV_DLL_EXPORTED __declspec(dllimport) #endif extern LIBICONV_DLL_EXPORTED int _libiconv_version; /* Likewise */ //////////////////////////////////////////////////////////////////////////////// /* We would like to #include any system header file which could define iconv_t, 1. in order to eliminate the risk that the user gets compilation errors because some other system header file includes /usr/include/iconv.h which defines iconv_t or declares iconv after this file, 2. when compiling for LIBICONV_PLUG, we need the proper iconv_t type in order to produce binary compatible code. But gcc's #include_next is not portable. Thus, once libiconv's iconv.h has been installed in /usr/local/include, there is no way any more to include the original /usr/include/iconv.h. We simply have to get away without it. Ad 1. The risk that a system header file does #include "iconv.h" or #include_next "iconv.h" is small. They all do #include . Ad 2. The iconv_t type is a pointer type in all cases I have seen. (It has to be a scalar type because (iconv_t)(-1) is a possible return value from iconv_open().) */ /* Define iconv_t ourselves. */ #undef iconv_t #define iconv_t libiconv_t typedef void* iconv_t; /* Get size_t declaration. Get wchar_t declaration if it exists. */ #include /* Get errno declaration and values. */ #include /* Some systems, like SunOS 4, don't have EILSEQ. Some systems, like BSD/OS, have EILSEQ in a different header. On these systems, define EILSEQ ourselves. */ #ifndef EILSEQ #define EILSEQ @EILSEQ@ #endif #ifdef __cplusplus extern "C" { #endif /* Allocates descriptor for code conversion from encoding ‘fromcode’ to encoding ‘tocode’. */ #ifndef LIBICONV_PLUG #define iconv_open libiconv_open #endif extern LIBICONV_DLL_EXPORTED iconv_t iconv_open (const char* tocode, const char* fromcode); /* Converts, using conversion descriptor ‘cd’, at most ‘*inbytesleft’ bytes starting at ‘*inbuf’, writing at most ‘*outbytesleft’ bytes starting at ‘*outbuf’. Decrements ‘*inbytesleft’ and increments ‘*inbuf’ by the same amount. Decrements ‘*outbytesleft’ and increments ‘*outbuf’ by the same amount. */ #ifndef LIBICONV_PLUG #define iconv libiconv #endif ///////////////////////// 삭제 / DELETE / УДАЛИТЬ /////////////////////// //extern LIBICONV_DLL_EXPORTED size_t iconv (iconv_t cd, @ICONV_CONST@ char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft); ///////////////////////// 추가 / ADD / ДОВАВЛЯТЬ ////////////////////// extern LIBICONV_DLL_EXPORTED size_t iconv (iconv_t cd, const char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft); //////////////////////////////////////////////////////////////////////////////// /* Frees resources allocated for conversion descriptor ‘cd’. */ #ifndef LIBICONV_PLUG #define iconv_close libiconv_close #endif extern LIBICONV_DLL_EXPORTED int iconv_close (iconv_t cd); #ifdef __cplusplus } #endif #ifndef LIBICONV_PLUG /* Nonstandard extensions. */ ///////////////////////// 삭제 / DELETE / УДАЛИТЬ /////////////////////// //#if @USE_MBSTATE_T@ //#if @BROKEN_WCHAR_H@ ///////////////////////// 추가 / ADD / ДОВАВЛЯТЬ ////////////////////// #if USE_MBSTATE_T #if BROKEN_WCHAR_H //////////////////////////////////////////////////////////////////////////////// /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . */ #include #include #include #endif #include #endif #ifdef __cplusplus extern "C" { #endif /* A type that holds all memory needed by a conversion descriptor. A pointer to such an object can be used as an iconv_t. */ typedef struct { void* dummy1[28]; ///////////////////////// 삭제 / DELETE / УДАЛИТЬ /////////////////////// //#if @USE_MBSTATE_T@ ///////////////////////// 추가 / ADD / ДОВАВЛЯТЬ ////////////////////// #if USE_MBSTATE_T //////////////////////////////////////////////////////////////////////////////// mbstate_t dummy2; #endif } iconv_allocation_t; /* Allocates descriptor for code conversion from encoding ‘fromcode’ to encoding ‘tocode’ into preallocated memory. Returns an error indicator (0 or -1 with errno set). */ #define iconv_open_into libiconv_open_into extern LIBICONV_DLL_EXPORTED int iconv_open_into (const char* tocode, const char* fromcode, iconv_allocation_t* resultp); /* Control of attributes. */ #define iconvctl libiconvctl extern LIBICONV_DLL_EXPORTED int iconvctl (iconv_t cd, int request, void* argument); /* Hook performed after every successful conversion of a Unicode character. */ typedef void (*iconv_unicode_char_hook) (unsigned int uc, void* data); /* Hook performed after every successful conversion of a wide character. */ typedef void (*iconv_wide_char_hook) (wchar_t wc, void* data); /* Set of hooks. */ struct iconv_hooks { iconv_unicode_char_hook uc_hook; iconv_wide_char_hook wc_hook; void* data; }; /* Fallback function. Invoked when a small number of bytes could not be converted to a Unicode character. This function should process all bytes from inbuf and may produce replacement Unicode characters by calling the write_replacement callback repeatedly. */ typedef void (*iconv_unicode_mb_to_uc_fallback) (const char* inbuf, size_t inbufsize, void (*write_replacement) (const unsigned int *buf, size_t buflen, void* callback_arg), void* callback_arg, void* data); /* Fallback function. Invoked when a Unicode character could not be converted to the target encoding. This function should process the character and may produce replacement bytes (in the target encoding) by calling the write_replacement callback repeatedly. */ typedef void (*iconv_unicode_uc_to_mb_fallback) (unsigned int code, void (*write_replacement) (const char *buf, size_t buflen, void* callback_arg), void* callback_arg, void* data); ///////////////////////// 삭제 / DELETE / УДАЛИТЬ /////////////////////// //#if @HAVE_WCHAR_T@ ///////////////////////// 추가 / ADD / ДОВАВЛЯТЬ ////////////////////// #if HAVE_WCHAR_T //////////////////////////////////////////////////////////////////////////////// /* Fallback function. Invoked when a number of bytes could not be converted to a wide character. This function should process all bytes from inbuf and may produce replacement wide characters by calling the write_replacement callback repeatedly. */ typedef void (*iconv_wchar_mb_to_wc_fallback) (const char* inbuf, size_t inbufsize, void (*write_replacement) (const wchar_t *buf, size_t buflen, void* callback_arg), void* callback_arg, void* data); /* Fallback function. Invoked when a wide character could not be converted to the target encoding. This function should process the character and may produce replacement bytes (in the target encoding) by calling the write_replacement callback repeatedly. */ typedef void (*iconv_wchar_wc_to_mb_fallback) (wchar_t code, void (*write_replacement) (const char *buf, size_t buflen, void* callback_arg), void* callback_arg, void* data); #else /* If the wchar_t type does not exist, these two fallback functions are never invoked. Their argument list therefore does not matter. */ typedef void (*iconv_wchar_mb_to_wc_fallback) (); typedef void (*iconv_wchar_wc_to_mb_fallback) (); #endif /* Set of fallbacks. */ struct iconv_fallbacks { iconv_unicode_mb_to_uc_fallback mb_to_uc_fallback; iconv_unicode_uc_to_mb_fallback uc_to_mb_fallback; iconv_wchar_mb_to_wc_fallback mb_to_wc_fallback; iconv_wchar_wc_to_mb_fallback wc_to_mb_fallback; void* data; }; /* Requests for iconvctl. */ #define ICONV_TRIVIALP 0 /* int *argument */ #define ICONV_GET_TRANSLITERATE 1 /* int *argument */ #define ICONV_SET_TRANSLITERATE 2 /* const int *argument */ #define ICONV_GET_DISCARD_ILSEQ 3 /* int *argument */ #define ICONV_SET_DISCARD_ILSEQ 4 /* const int *argument */ #define ICONV_SET_HOOKS 5 /* const struct iconv_hooks *argument */ #define ICONV_SET_FALLBACKS 6 /* const struct iconv_fallbacks *argument */ /* Listing of locale independent encodings. */ #define iconvlist libiconvlist extern LIBICONV_DLL_EXPORTED void iconvlist (int (*do_one) (unsigned int namescount, const char * const * names, void* data), void* data); /* Canonicalize an encoding name. The result is either a canonical encoding name, or name itself. */ extern LIBICONV_DLL_EXPORTED const char * iconv_canonicalize (const char * name); /* Support for relocatable packages. */ /* Sets the original and the current installation prefix of the package. Relocation simply replaces a pathname starting with the original prefix by the corresponding pathname with the current prefix instead. Both prefixes should be directory names without trailing slash (i.e. use "" instead of "/"). */ extern LIBICONV_DLL_EXPORTED void libiconv_set_relocation_prefix (const char *orig_prefix, const char *curr_prefix); #ifdef __cplusplus } #endif #endif #endif /* _LIBICONV_H */ freelan-2.0/third-party/source/libiconv-msvc/include/iconv_open1.h000066400000000000000000000146461252300335000253310ustar00rootroot00000000000000/* * Copyright (C) 1999-2008, 2011 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* Part 1 of iconv_open. Input: const char* tocode, const char* fromcode. Output: unsigned int from_index; int from_wchar; unsigned int to_index; int to_wchar; int transliterate; int discard_ilseq; Jumps to 'invalid' in case of errror. */ { char buf[MAX_WORD_LENGTH+10+1]; const char* cp; char* bp; const struct alias * ap; unsigned int count; transliterate = 0; discard_ilseq = 0; /* Before calling aliases_lookup, convert the input string to upper case, * and check whether it's entirely ASCII (we call gperf with option "-7" * to achieve a smaller table) and non-empty. If it's not entirely ASCII, * or if it's too long, it is not a valid encoding name. */ for (to_wchar = 0;;) { /* Search tocode in the table. */ for (cp = tocode, bp = buf, count = MAX_WORD_LENGTH+10+1; ; cp++, bp++) { unsigned char c = * (unsigned char *) cp; if (c >= 0x80) goto invalid; if (c >= 'a' && c <= 'z') c -= 'a'-'A'; *bp = c; if (c == '\0') break; if (--count == 0) goto invalid; } for (;;) { if (bp-buf >= 10 && memcmp(bp-10,"//TRANSLIT",10)==0) { bp -= 10; *bp = '\0'; transliterate = 1; continue; } if (bp-buf >= 8 && memcmp(bp-8,"//IGNORE",8)==0) { bp -= 8; *bp = '\0'; discard_ilseq = 1; continue; } break; } if (buf[0] == '\0') { tocode = locale_charset(); /* Avoid an endless loop that could occur when using an older version of localcharset.c. */ if (tocode[0] == '\0') goto invalid; continue; } ap = aliases_lookup(buf,bp-buf); if (ap == NULL) { ap = aliases2_lookup(buf); if (ap == NULL) goto invalid; } if (ap->encoding_index == ei_local_char) { tocode = locale_charset(); /* Avoid an endless loop that could occur when using an older version of localcharset.c. */ if (tocode[0] == '\0') goto invalid; continue; } if (ap->encoding_index == ei_local_wchar_t) { /* On systems which define __STDC_ISO_10646__, wchar_t is Unicode. This is also the case on native Woe32 systems and Cygwin >= 1.7, where we know that it is UTF-16. */ #if ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || (defined __CYGWIN__ && CYGWIN_VERSION_DLL_MAJOR >= 1007) if (sizeof(wchar_t) == 4) { to_index = ei_ucs4internal; break; } if (sizeof(wchar_t) == 2) { # if WORDS_LITTLEENDIAN to_index = ei_utf16le; # else to_index = ei_utf16be; # endif break; } #elif __STDC_ISO_10646__ if (sizeof(wchar_t) == 4) { to_index = ei_ucs4internal; break; } if (sizeof(wchar_t) == 2) { to_index = ei_ucs2internal; break; } if (sizeof(wchar_t) == 1) { to_index = ei_iso8859_1; break; } #endif #if HAVE_MBRTOWC to_wchar = 1; tocode = locale_charset(); continue; #endif goto invalid; } to_index = ap->encoding_index; break; } for (from_wchar = 0;;) { /* Search fromcode in the table. */ for (cp = fromcode, bp = buf, count = MAX_WORD_LENGTH+10+1; ; cp++, bp++) { unsigned char c = * (unsigned char *) cp; if (c >= 0x80) goto invalid; if (c >= 'a' && c <= 'z') c -= 'a'-'A'; *bp = c; if (c == '\0') break; if (--count == 0) goto invalid; } for (;;) { if (bp-buf >= 10 && memcmp(bp-10,"//TRANSLIT",10)==0) { bp -= 10; *bp = '\0'; continue; } if (bp-buf >= 8 && memcmp(bp-8,"//IGNORE",8)==0) { bp -= 8; *bp = '\0'; continue; } break; } if (buf[0] == '\0') { fromcode = locale_charset(); /* Avoid an endless loop that could occur when using an older version of localcharset.c. */ if (fromcode[0] == '\0') goto invalid; continue; } ap = aliases_lookup(buf,bp-buf); if (ap == NULL) { ap = aliases2_lookup(buf); if (ap == NULL) goto invalid; } if (ap->encoding_index == ei_local_char) { fromcode = locale_charset(); /* Avoid an endless loop that could occur when using an older version of localcharset.c. */ if (fromcode[0] == '\0') goto invalid; continue; } if (ap->encoding_index == ei_local_wchar_t) { /* On systems which define __STDC_ISO_10646__, wchar_t is Unicode. This is also the case on native Woe32 systems and Cygwin >= 1.7, where we know that it is UTF-16. */ #if ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || (defined __CYGWIN__ && CYGWIN_VERSION_DLL_MAJOR >= 1007) if (sizeof(wchar_t) == 4) { from_index = ei_ucs4internal; break; } if (sizeof(wchar_t) == 2) { # if WORDS_LITTLEENDIAN from_index = ei_utf16le; # else from_index = ei_utf16be; # endif break; } #elif __STDC_ISO_10646__ if (sizeof(wchar_t) == 4) { from_index = ei_ucs4internal; break; } if (sizeof(wchar_t) == 2) { from_index = ei_ucs2internal; break; } if (sizeof(wchar_t) == 1) { from_index = ei_iso8859_1; break; } #endif #if HAVE_WCRTOMB from_wchar = 1; fromcode = locale_charset(); continue; #endif goto invalid; } from_index = ap->encoding_index; break; } } freelan-2.0/third-party/source/libiconv-msvc/include/iconv_open2.h000066400000000000000000000054211252300335000253210ustar00rootroot00000000000000/* * Copyright (C) 1999-2009 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* Part 2 of iconv_open. Input: struct conv_struct * cd; unsigned int from_index; int from_wchar; unsigned int to_index; int to_wchar; int transliterate; int discard_ilseq; Output: none. Side effects: Fills cd. */ cd->iindex = from_index; cd->ifuncs = all_encodings[from_index].ifuncs; cd->oindex = to_index; cd->ofuncs = all_encodings[to_index].ofuncs; cd->oflags = all_encodings[to_index].oflags; /* Initialize the loop functions. */ #if HAVE_MBRTOWC if (to_wchar) { #if HAVE_WCRTOMB if (from_wchar) { cd->lfuncs.loop_convert = wchar_id_loop_convert; cd->lfuncs.loop_reset = wchar_id_loop_reset; } else #endif { cd->lfuncs.loop_convert = wchar_to_loop_convert; cd->lfuncs.loop_reset = wchar_to_loop_reset; } } else #endif { #if HAVE_WCRTOMB if (from_wchar) { cd->lfuncs.loop_convert = wchar_from_loop_convert; cd->lfuncs.loop_reset = wchar_from_loop_reset; } else #endif { cd->lfuncs.loop_convert = unicode_loop_convert; cd->lfuncs.loop_reset = unicode_loop_reset; } } /* Initialize the states. */ memset(&cd->istate,'\0',sizeof(state_t)); memset(&cd->ostate,'\0',sizeof(state_t)); /* Initialize the operation flags. */ cd->transliterate = transliterate; cd->discard_ilseq = discard_ilseq; #ifndef LIBICONV_PLUG cd->fallbacks.mb_to_uc_fallback = NULL; cd->fallbacks.uc_to_mb_fallback = NULL; cd->fallbacks.mb_to_wc_fallback = NULL; cd->fallbacks.wc_to_mb_fallback = NULL; cd->fallbacks.data = NULL; cd->hooks.uc_hook = NULL; cd->hooks.wc_hook = NULL; cd->hooks.data = NULL; #endif /* Initialize additional fields. */ if (from_wchar != to_wchar) { struct wchar_conv_struct * wcd = (struct wchar_conv_struct *) cd; #if HAVE_WCRTOMB || HAVE_MBRTOWC memset(&wcd->state,'\0',sizeof(mbstate_t)); #endif } /* Done. */ freelan-2.0/third-party/source/libiconv-msvc/include/iso2022_cn.h000066400000000000000000000202111252300335000246520ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-2022-CN */ /* Specification: RFC 1922 */ #define ESC 0x1b #define SO 0x0e #define SI 0x0f /* * The state is composed of one of the following values */ #define STATE_ASCII 0 #define STATE_TWOBYTE 1 /* * and one of the following values, << 8 */ #define STATE2_NONE 0 #define STATE2_DESIGNATED_GB2312 1 #define STATE2_DESIGNATED_CNS11643_1 2 /* * and one of the following values, << 16 */ #define STATE3_NONE 0 #define STATE3_DESIGNATED_CNS11643_2 1 #define SPLIT_STATE \ unsigned int state1 = state & 0xff, state2 = (state >> 8) & 0xff, state3 = state >> 16 #define COMBINE_STATE \ state = (state3 << 16) | (state2 << 8) | state1 static int iso2022_cn_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { state_t state = conv->istate; SPLIT_STATE; int count = 0; unsigned char c; for (;;) { c = *s; if (c == ESC) { if (n < count+4) goto none; if (s[1] == '$') { if (s[2] == ')') { if (s[3] == 'A') { state2 = STATE2_DESIGNATED_GB2312; s += 4; count += 4; if (n < count+1) goto none; continue; } if (s[3] == 'G') { state2 = STATE2_DESIGNATED_CNS11643_1; s += 4; count += 4; if (n < count+1) goto none; continue; } } if (s[2] == '*') { if (s[3] == 'H') { state3 = STATE3_DESIGNATED_CNS11643_2; s += 4; count += 4; if (n < count+1) goto none; continue; } } } if (s[1] == 'N') { switch (state3) { case STATE3_NONE: goto ilseq; case STATE3_DESIGNATED_CNS11643_2: if (s[2] < 0x80 && s[3] < 0x80) { int ret = cns11643_2_mbtowc(conv,pwc,s+2,2); if (ret == RET_ILSEQ) goto ilseq; if (ret != 2) abort(); COMBINE_STATE; conv->istate = state; return count+4; } else goto ilseq; default: abort(); } } goto ilseq; } if (c == SO) { if (state2 != STATE2_DESIGNATED_GB2312 && state2 != STATE2_DESIGNATED_CNS11643_1) goto ilseq; state1 = STATE_TWOBYTE; s++; count++; if (n < count+1) goto none; continue; } if (c == SI) { state1 = STATE_ASCII; s++; count++; if (n < count+1) goto none; continue; } break; } switch (state1) { case STATE_ASCII: if (c < 0x80) { int ret = ascii_mbtowc(conv,pwc,s,1); if (ret == RET_ILSEQ) goto ilseq; if (ret != 1) abort(); if (*pwc == 0x000a || *pwc == 0x000d) { state2 = STATE2_NONE; state3 = STATE3_NONE; } COMBINE_STATE; conv->istate = state; return count+1; } else goto ilseq; case STATE_TWOBYTE: if (n < count+2) goto none; if (s[0] < 0x80 && s[1] < 0x80) { int ret; switch (state2) { case STATE2_NONE: goto ilseq; case STATE2_DESIGNATED_GB2312: ret = gb2312_mbtowc(conv,pwc,s,2); break; case STATE2_DESIGNATED_CNS11643_1: ret = cns11643_1_mbtowc(conv,pwc,s,2); break; default: abort(); } if (ret == RET_ILSEQ) goto ilseq; if (ret != 2) abort(); COMBINE_STATE; conv->istate = state; return count+2; } else goto ilseq; default: abort(); } none: COMBINE_STATE; conv->istate = state; return RET_TOOFEW(count); ilseq: COMBINE_STATE; conv->istate = state; return RET_SHIFT_ILSEQ(count); } static int iso2022_cn_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { state_t state = conv->ostate; SPLIT_STATE; unsigned char buf[3]; int ret; /* There is no need to handle Unicode 3.1 tag characters and to look for "zh-CN" or "zh-TW" tags, because GB2312 and CNS11643 are disjoint. */ /* Try ASCII. */ ret = ascii_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { if (ret != 1) abort(); if (buf[0] < 0x80) { int count = (state1 == STATE_ASCII ? 1 : 2); if (n < count) return RET_TOOSMALL; if (state1 != STATE_ASCII) { r[0] = SI; r += 1; state1 = STATE_ASCII; } r[0] = buf[0]; if (wc == 0x000a || wc == 0x000d) { state2 = STATE2_NONE; state3 = STATE3_NONE; } COMBINE_STATE; conv->ostate = state; return count; } } /* Try GB 2312-1980. */ ret = gb2312_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (buf[0] < 0x80 && buf[1] < 0x80) { int count = (state2 == STATE2_DESIGNATED_GB2312 ? 0 : 4) + (state1 == STATE_TWOBYTE ? 0 : 1) + 2; if (n < count) return RET_TOOSMALL; if (state2 != STATE2_DESIGNATED_GB2312) { r[0] = ESC; r[1] = '$'; r[2] = ')'; r[3] = 'A'; r += 4; state2 = STATE2_DESIGNATED_GB2312; } if (state1 != STATE_TWOBYTE) { r[0] = SO; r += 1; state1 = STATE_TWOBYTE; } r[0] = buf[0]; r[1] = buf[1]; COMBINE_STATE; conv->ostate = state; return count; } } ret = cns11643_wctomb(conv,buf,wc,3); if (ret != RET_ILUNI) { if (ret != 3) abort(); /* Try CNS 11643-1992 Plane 1. */ if (buf[0] == 1 && buf[1] < 0x80 && buf[2] < 0x80) { int count = (state2 == STATE2_DESIGNATED_CNS11643_1 ? 0 : 4) + (state1 == STATE_TWOBYTE ? 0 : 1) + 2; if (n < count) return RET_TOOSMALL; if (state2 != STATE2_DESIGNATED_CNS11643_1) { r[0] = ESC; r[1] = '$'; r[2] = ')'; r[3] = 'G'; r += 4; state2 = STATE2_DESIGNATED_CNS11643_1; } if (state1 != STATE_TWOBYTE) { r[0] = SO; r += 1; state1 = STATE_TWOBYTE; } r[0] = buf[1]; r[1] = buf[2]; COMBINE_STATE; conv->ostate = state; return count; } /* Try CNS 11643-1992 Plane 2. */ if (buf[0] == 2 && buf[1] < 0x80 && buf[2] < 0x80) { int count = (state3 == STATE3_DESIGNATED_CNS11643_2 ? 0 : 4) + 4; if (n < count) return RET_TOOSMALL; if (state3 != STATE3_DESIGNATED_CNS11643_2) { r[0] = ESC; r[1] = '$'; r[2] = '*'; r[3] = 'H'; r += 4; state3 = STATE3_DESIGNATED_CNS11643_2; } r[0] = ESC; r[1] = 'N'; r[2] = buf[1]; r[3] = buf[2]; COMBINE_STATE; conv->ostate = state; return count; } } return RET_ILUNI; } static int iso2022_cn_reset (conv_t conv, unsigned char *r, int n) { state_t state = conv->ostate; SPLIT_STATE; (void)state2; (void)state3; if (state1 != STATE_ASCII) { if (n < 1) return RET_TOOSMALL; r[0] = SI; /* conv->ostate = 0; will be done by the caller */ return 1; } else return 0; } #undef COMBINE_STATE #undef SPLIT_STATE #undef STATE3_DESIGNATED_CNS11643_2 #undef STATE3_NONE #undef STATE2_DESIGNATED_CNS11643_1 #undef STATE2_DESIGNATED_GB2312 #undef STATE2_NONE #undef STATE_TWOBYTE #undef STATE_ASCII freelan-2.0/third-party/source/libiconv-msvc/include/iso2022_cnext.h000066400000000000000000000373761252300335000254170ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-2022-CN-EXT */ /* Specification: RFC 1922 */ #define ESC 0x1b #define SO 0x0e #define SI 0x0f /* * The state is composed of one of the following values */ #define STATE_ASCII 0 #define STATE_TWOBYTE 1 /* * and one of the following values, << 8 */ #define STATE2_NONE 0 #define STATE2_DESIGNATED_GB2312 1 #define STATE2_DESIGNATED_CNS11643_1 2 #define STATE2_DESIGNATED_ISO_IR_165 3 /* * and one of the following values, << 16 */ #define STATE3_NONE 0 #define STATE3_DESIGNATED_CNS11643_2 1 /* * and one of the following values, << 24 */ #define STATE4_NONE 0 #define STATE4_DESIGNATED_CNS11643_3 1 #define STATE4_DESIGNATED_CNS11643_4 2 #define STATE4_DESIGNATED_CNS11643_5 3 #define STATE4_DESIGNATED_CNS11643_6 4 #define STATE4_DESIGNATED_CNS11643_7 5 #define SPLIT_STATE \ unsigned int state1 = state & 0xff, state2 = (state >> 8) & 0xff, state3 = (state >> 16) & 0xff, state4 = state >> 24 #define COMBINE_STATE \ state = (state4 << 24) | (state3 << 16) | (state2 << 8) | state1 static int iso2022_cn_ext_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { state_t state = conv->istate; SPLIT_STATE; int count = 0; unsigned char c; for (;;) { c = *s; if (c == ESC) { if (n < count+4) goto none; if (s[1] == '$') { if (s[2] == ')') { if (s[3] == 'A') { state2 = STATE2_DESIGNATED_GB2312; s += 4; count += 4; if (n < count+1) goto none; continue; } if (s[3] == 'G') { state2 = STATE2_DESIGNATED_CNS11643_1; s += 4; count += 4; if (n < count+1) goto none; continue; } if (s[3] == 'E') { state2 = STATE2_DESIGNATED_ISO_IR_165; s += 4; count += 4; if (n < count+1) goto none; continue; } } if (s[2] == '*') { if (s[3] == 'H') { state3 = STATE3_DESIGNATED_CNS11643_2; s += 4; count += 4; if (n < count+1) goto none; continue; } } if (s[2] == '+') { if (s[3] == 'I') { state4 = STATE4_DESIGNATED_CNS11643_3; s += 4; count += 4; if (n < count+1) goto none; continue; } if (s[3] == 'J') { state4 = STATE4_DESIGNATED_CNS11643_4; s += 4; count += 4; if (n < count+1) goto none; continue; } if (s[3] == 'K') { state4 = STATE4_DESIGNATED_CNS11643_5; s += 4; count += 4; if (n < count+1) goto none; continue; } if (s[3] == 'L') { state4 = STATE4_DESIGNATED_CNS11643_6; s += 4; count += 4; if (n < count+1) goto none; continue; } if (s[3] == 'M') { state4 = STATE4_DESIGNATED_CNS11643_7; s += 4; count += 4; if (n < count+1) goto none; continue; } } } if (s[1] == 'N') { switch (state3) { case STATE3_NONE: goto ilseq; case STATE3_DESIGNATED_CNS11643_2: if (s[2] < 0x80 && s[3] < 0x80) { int ret = cns11643_2_mbtowc(conv,pwc,s+2,2); if (ret == RET_ILSEQ) goto ilseq; if (ret != 2) abort(); COMBINE_STATE; conv->istate = state; return count+4; } else goto ilseq; default: abort(); } } if (s[1] == 'O') { switch (state4) { case STATE4_NONE: goto ilseq; case STATE4_DESIGNATED_CNS11643_3: if (s[2] < 0x80 && s[3] < 0x80) { int ret = cns11643_3_mbtowc(conv,pwc,s+2,2); if (ret == RET_ILSEQ) goto ilseq; if (ret != 2) abort(); COMBINE_STATE; conv->istate = state; return count+4; } else goto ilseq; case STATE4_DESIGNATED_CNS11643_4: if (s[2] < 0x80 && s[3] < 0x80) { int ret = cns11643_4_mbtowc(conv,pwc,s+2,2); if (ret == RET_ILSEQ) goto ilseq; if (ret != 2) abort(); COMBINE_STATE; conv->istate = state; return count+4; } else goto ilseq; case STATE4_DESIGNATED_CNS11643_5: if (s[2] < 0x80 && s[3] < 0x80) { int ret = cns11643_5_mbtowc(conv,pwc,s+2,2); if (ret == RET_ILSEQ) goto ilseq; if (ret != 2) abort(); COMBINE_STATE; conv->istate = state; return count+4; } else goto ilseq; case STATE4_DESIGNATED_CNS11643_6: if (s[2] < 0x80 && s[3] < 0x80) { int ret = cns11643_6_mbtowc(conv,pwc,s+2,2); if (ret == RET_ILSEQ) goto ilseq; if (ret != 2) abort(); COMBINE_STATE; conv->istate = state; return count+4; } else goto ilseq; case STATE4_DESIGNATED_CNS11643_7: if (s[2] < 0x80 && s[3] < 0x80) { int ret = cns11643_7_mbtowc(conv,pwc,s+2,2); if (ret == RET_ILSEQ) goto ilseq; if (ret != 2) abort(); COMBINE_STATE; conv->istate = state; return count+4; } else goto ilseq; default: abort(); } } goto ilseq; } if (c == SO) { if (state2 != STATE2_DESIGNATED_GB2312 && state2 != STATE2_DESIGNATED_CNS11643_1 && state2 != STATE2_DESIGNATED_ISO_IR_165) goto ilseq; state1 = STATE_TWOBYTE; s++; count++; if (n < count+1) goto none; continue; } if (c == SI) { state1 = STATE_ASCII; s++; count++; if (n < count+1) goto none; continue; } break; } switch (state1) { case STATE_ASCII: if (c < 0x80) { int ret = ascii_mbtowc(conv,pwc,s,1); if (ret == RET_ILSEQ) goto ilseq; if (ret != 1) abort(); if (*pwc == 0x000a || *pwc == 0x000d) { state2 = STATE2_NONE; state3 = STATE3_NONE; state4 = STATE3_NONE; } COMBINE_STATE; conv->istate = state; return count+1; } else goto ilseq; case STATE_TWOBYTE: if (n < count+2) goto none; if (s[0] < 0x80 && s[1] < 0x80) { int ret; switch (state2) { case STATE2_NONE: goto ilseq; case STATE2_DESIGNATED_GB2312: ret = gb2312_mbtowc(conv,pwc,s,2); break; case STATE2_DESIGNATED_CNS11643_1: ret = cns11643_1_mbtowc(conv,pwc,s,2); break; case STATE2_DESIGNATED_ISO_IR_165: ret = isoir165_mbtowc(conv,pwc,s,2); break; default: abort(); } if (ret == RET_ILSEQ) goto ilseq; if (ret != 2) abort(); COMBINE_STATE; conv->istate = state; return count+2; } else goto ilseq; default: abort(); } none: COMBINE_STATE; conv->istate = state; return RET_TOOFEW(count); ilseq: COMBINE_STATE; conv->istate = state; return RET_SHIFT_ILSEQ(count); } static int iso2022_cn_ext_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { state_t state = conv->ostate; SPLIT_STATE; unsigned char buf[3]; int ret; /* There is no need to handle Unicode 3.1 tag characters and to look for "zh-CN" or "zh-TW" tags, because GB2312 and CNS11643 are disjoint. */ /* Try ASCII. */ ret = ascii_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { if (ret != 1) abort(); if (buf[0] < 0x80) { int count = (state1 == STATE_ASCII ? 1 : 2); if (n < count) return RET_TOOSMALL; if (state1 != STATE_ASCII) { r[0] = SI; r += 1; state1 = STATE_ASCII; } r[0] = buf[0]; if (wc == 0x000a || wc == 0x000d) { state2 = STATE2_NONE; state3 = STATE3_NONE; state4 = STATE3_NONE; } COMBINE_STATE; conv->ostate = state; return count; } } /* Try GB 2312-1980. */ ret = gb2312_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (buf[0] < 0x80 && buf[1] < 0x80) { int count = (state2 == STATE2_DESIGNATED_GB2312 ? 0 : 4) + (state1 == STATE_TWOBYTE ? 0 : 1) + 2; if (n < count) return RET_TOOSMALL; if (state2 != STATE2_DESIGNATED_GB2312) { r[0] = ESC; r[1] = '$'; r[2] = ')'; r[3] = 'A'; r += 4; state2 = STATE2_DESIGNATED_GB2312; } if (state1 != STATE_TWOBYTE) { r[0] = SO; r += 1; state1 = STATE_TWOBYTE; } r[0] = buf[0]; r[1] = buf[1]; COMBINE_STATE; conv->ostate = state; return count; } } ret = cns11643_wctomb(conv,buf,wc,3); if (ret != RET_ILUNI) { if (ret != 3) abort(); /* Try CNS 11643-1992 Plane 1. */ if (buf[0] == 1 && buf[1] < 0x80 && buf[2] < 0x80) { int count = (state2 == STATE2_DESIGNATED_CNS11643_1 ? 0 : 4) + (state1 == STATE_TWOBYTE ? 0 : 1) + 2; if (n < count) return RET_TOOSMALL; if (state2 != STATE2_DESIGNATED_CNS11643_1) { r[0] = ESC; r[1] = '$'; r[2] = ')'; r[3] = 'G'; r += 4; state2 = STATE2_DESIGNATED_CNS11643_1; } if (state1 != STATE_TWOBYTE) { r[0] = SO; r += 1; state1 = STATE_TWOBYTE; } r[0] = buf[1]; r[1] = buf[2]; COMBINE_STATE; conv->ostate = state; return count; } /* Try CNS 11643-1992 Plane 2. */ if (buf[0] == 2 && buf[1] < 0x80 && buf[2] < 0x80) { int count = (state3 == STATE3_DESIGNATED_CNS11643_2 ? 0 : 4) + 4; if (n < count) return RET_TOOSMALL; if (state3 != STATE3_DESIGNATED_CNS11643_2) { r[0] = ESC; r[1] = '$'; r[2] = '*'; r[3] = 'H'; r += 4; state3 = STATE3_DESIGNATED_CNS11643_2; } r[0] = ESC; r[1] = 'N'; r[2] = buf[1]; r[3] = buf[2]; COMBINE_STATE; conv->ostate = state; return count; } /* Try CNS 11643-1992 Plane 3. */ if (buf[0] == 3 && buf[1] < 0x80 && buf[2] < 0x80) { int count = (state4 == STATE4_DESIGNATED_CNS11643_3 ? 0 : 4) + 4; if (n < count) return RET_TOOSMALL; if (state4 != STATE4_DESIGNATED_CNS11643_3) { r[0] = ESC; r[1] = '$'; r[2] = '+'; r[3] = 'I'; r += 4; state4 = STATE4_DESIGNATED_CNS11643_3; } r[0] = ESC; r[1] = 'O'; r[2] = buf[1]; r[3] = buf[2]; COMBINE_STATE; conv->ostate = state; return count; } /* Try CNS 11643-1992 Plane 4. */ if (buf[0] == 4 && buf[1] < 0x80 && buf[2] < 0x80) { int count = (state4 == STATE4_DESIGNATED_CNS11643_4 ? 0 : 4) + 4; if (n < count) return RET_TOOSMALL; if (state4 != STATE4_DESIGNATED_CNS11643_4) { r[0] = ESC; r[1] = '$'; r[2] = '+'; r[3] = 'J'; r += 4; state4 = STATE4_DESIGNATED_CNS11643_4; } r[0] = ESC; r[1] = 'O'; r[2] = buf[1]; r[3] = buf[2]; COMBINE_STATE; conv->ostate = state; return count; } /* Try CNS 11643-1992 Plane 5. */ if (buf[0] == 5 && buf[1] < 0x80 && buf[2] < 0x80) { int count = (state4 == STATE4_DESIGNATED_CNS11643_5 ? 0 : 4) + 4; if (n < count) return RET_TOOSMALL; if (state4 != STATE4_DESIGNATED_CNS11643_5) { r[0] = ESC; r[1] = '$'; r[2] = '+'; r[3] = 'K'; r += 4; state4 = STATE4_DESIGNATED_CNS11643_5; } r[0] = ESC; r[1] = 'O'; r[2] = buf[1]; r[3] = buf[2]; COMBINE_STATE; conv->ostate = state; return count; } /* Try CNS 11643-1992 Plane 6. */ if (buf[0] == 6 && buf[1] < 0x80 && buf[2] < 0x80) { int count = (state4 == STATE4_DESIGNATED_CNS11643_6 ? 0 : 4) + 4; if (n < count) return RET_TOOSMALL; if (state4 != STATE4_DESIGNATED_CNS11643_6) { r[0] = ESC; r[1] = '$'; r[2] = '+'; r[3] = 'L'; r += 4; state4 = STATE4_DESIGNATED_CNS11643_6; } r[0] = ESC; r[1] = 'O'; r[2] = buf[1]; r[3] = buf[2]; COMBINE_STATE; conv->ostate = state; return count; } /* Try CNS 11643-1992 Plane 7. */ if (buf[0] == 7 && buf[1] < 0x80 && buf[2] < 0x80) { int count = (state4 == STATE4_DESIGNATED_CNS11643_7 ? 0 : 4) + 4; if (n < count) return RET_TOOSMALL; if (state4 != STATE4_DESIGNATED_CNS11643_7) { r[0] = ESC; r[1] = '$'; r[2] = '+'; r[3] = 'M'; r += 4; state4 = STATE4_DESIGNATED_CNS11643_7; } r[0] = ESC; r[1] = 'O'; r[2] = buf[1]; r[3] = buf[2]; COMBINE_STATE; conv->ostate = state; return count; } } /* Try ISO-IR-165. */ ret = isoir165_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (buf[0] < 0x80 && buf[1] < 0x80) { int count = (state2 == STATE2_DESIGNATED_ISO_IR_165 ? 0 : 4) + (state1 == STATE_TWOBYTE ? 0 : 1) + 2; if (n < count) return RET_TOOSMALL; if (state2 != STATE2_DESIGNATED_ISO_IR_165) { r[0] = ESC; r[1] = '$'; r[2] = ')'; r[3] = 'E'; r += 4; state2 = STATE2_DESIGNATED_ISO_IR_165; } if (state1 != STATE_TWOBYTE) { r[0] = SO; r += 1; state1 = STATE_TWOBYTE; } r[0] = buf[0]; r[1] = buf[1]; COMBINE_STATE; conv->ostate = state; return count; } } return RET_ILUNI; } static int iso2022_cn_ext_reset (conv_t conv, unsigned char *r, int n) { state_t state = conv->ostate; SPLIT_STATE; (void)state2; (void)state3; (void)state4; if (state1 != STATE_ASCII) { if (n < 1) return RET_TOOSMALL; r[0] = SI; /* conv->ostate = 0; will be done by the caller */ return 1; } else return 0; } #undef COMBINE_STATE #undef SPLIT_STATE #undef STATE4_DESIGNATED_CNS11643_7 #undef STATE4_DESIGNATED_CNS11643_6 #undef STATE4_DESIGNATED_CNS11643_5 #undef STATE4_DESIGNATED_CNS11643_4 #undef STATE4_DESIGNATED_CNS11643_3 #undef STATE4_NONE #undef STATE3_DESIGNATED_CNS11643_2 #undef STATE3_NONE #undef STATE2_DESIGNATED_ISO_IR_165 #undef STATE2_DESIGNATED_CNS11643_1 #undef STATE2_DESIGNATED_GB2312 #undef STATE2_NONE #undef STATE_TWOBYTE #undef STATE_ASCII freelan-2.0/third-party/source/libiconv-msvc/include/iso2022_jp.h000066400000000000000000000122221252300335000246660ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-2022-JP */ /* Specification: RFC 1468 */ #define ESC 0x1b /* * The state can be one of the following values. */ #define STATE_ASCII 0 #define STATE_JISX0201ROMAN 1 #define STATE_JISX0208 2 static int iso2022_jp_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { state_t state = conv->istate; int count = 0; unsigned char c; for (;;) { c = *s; if (c == ESC) { if (n < count+3) goto none; if (s[1] == '(') { if (s[2] == 'B') { state = STATE_ASCII; s += 3; count += 3; if (n < count+1) goto none; continue; } if (s[2] == 'J') { state = STATE_JISX0201ROMAN; s += 3; count += 3; if (n < count+1) goto none; continue; } goto ilseq; } if (s[1] == '$') { if (s[2] == '@' || s[2] == 'B') { /* We don't distinguish JIS X 0208-1978 and JIS X 0208-1983. */ state = STATE_JISX0208; s += 3; count += 3; if (n < count+1) goto none; continue; } goto ilseq; } goto ilseq; } break; } switch (state) { case STATE_ASCII: if (c < 0x80) { int ret = ascii_mbtowc(conv,pwc,s,1); if (ret == RET_ILSEQ) goto ilseq; if (ret != 1) abort(); conv->istate = state; return count+1; } else goto ilseq; case STATE_JISX0201ROMAN: if (c < 0x80) { int ret = jisx0201_mbtowc(conv,pwc,s,1); if (ret == RET_ILSEQ) goto ilseq; if (ret != 1) abort(); conv->istate = state; return count+1; } else goto ilseq; case STATE_JISX0208: if (n < count+2) goto none; if (s[0] < 0x80 && s[1] < 0x80) { int ret = jisx0208_mbtowc(conv,pwc,s,2); if (ret == RET_ILSEQ) goto ilseq; if (ret != 2) abort(); conv->istate = state; return count+2; } else goto ilseq; default: abort(); } none: conv->istate = state; return RET_TOOFEW(count); ilseq: conv->istate = state; return RET_SHIFT_ILSEQ(count); } static int iso2022_jp_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { state_t state = conv->ostate; unsigned char buf[2]; int ret; /* Try ASCII. */ ret = ascii_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { if (ret != 1) abort(); if (buf[0] < 0x80) { int count = (state == STATE_ASCII ? 1 : 4); if (n < count) return RET_TOOSMALL; if (state != STATE_ASCII) { r[0] = ESC; r[1] = '('; r[2] = 'B'; r += 3; state = STATE_ASCII; } r[0] = buf[0]; conv->ostate = state; return count; } } /* Try JIS X 0201-1976 Roman. */ ret = jisx0201_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { if (ret != 1) abort(); if (buf[0] < 0x80) { int count = (state == STATE_JISX0201ROMAN ? 1 : 4); if (n < count) return RET_TOOSMALL; if (state != STATE_JISX0201ROMAN) { r[0] = ESC; r[1] = '('; r[2] = 'J'; r += 3; state = STATE_JISX0201ROMAN; } r[0] = buf[0]; conv->ostate = state; return count; } } /* Try JIS X 0208-1990 in place of JIS X 0208-1978 and JIS X 0208-1983. */ ret = jisx0208_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (buf[0] < 0x80 && buf[1] < 0x80) { int count = (state == STATE_JISX0208 ? 2 : 5); if (n < count) return RET_TOOSMALL; if (state != STATE_JISX0208) { r[0] = ESC; r[1] = '$'; r[2] = 'B'; r += 3; state = STATE_JISX0208; } r[0] = buf[0]; r[1] = buf[1]; conv->ostate = state; return count; } } return RET_ILUNI; } static int iso2022_jp_reset (conv_t conv, unsigned char *r, int n) { state_t state = conv->ostate; if (state != STATE_ASCII) { if (n < 3) return RET_TOOSMALL; r[0] = ESC; r[1] = '('; r[2] = 'B'; /* conv->ostate = 0; will be done by the caller */ return 3; } else return 0; } #undef STATE_JISX0208 #undef STATE_JISX0201ROMAN #undef STATE_ASCII freelan-2.0/third-party/source/libiconv-msvc/include/iso2022_jp1.h000066400000000000000000000144771252300335000247650ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-2022-JP-1 */ /* Specification: RFC 2237 */ #define ESC 0x1b /* * The state can be one of the following values. */ #define STATE_ASCII 0 #define STATE_JISX0201ROMAN 1 #define STATE_JISX0208 2 #define STATE_JISX0212 3 static int iso2022_jp1_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { state_t state = conv->istate; int count = 0; unsigned char c; for (;;) { c = *s; if (c == ESC) { if (n < count+3) goto none; if (s[1] == '(') { if (s[2] == 'B') { state = STATE_ASCII; s += 3; count += 3; if (n < count+1) goto none; continue; } if (s[2] == 'J') { state = STATE_JISX0201ROMAN; s += 3; count += 3; if (n < count+1) goto none; continue; } goto ilseq; } if (s[1] == '$') { if (s[2] == '@' || s[2] == 'B') { /* We don't distinguish JIS X 0208-1978 and JIS X 0208-1983. */ state = STATE_JISX0208; s += 3; count += 3; if (n < count+1) goto none; continue; } if (s[2] == '(') { if (n < count+4) goto none; if (s[3] == 'D') { state = STATE_JISX0212; s += 4; count += 4; if (n < count+1) goto none; continue; } } goto ilseq; } goto ilseq; } break; } switch (state) { case STATE_ASCII: if (c < 0x80) { int ret = ascii_mbtowc(conv,pwc,s,1); if (ret == RET_ILSEQ) goto ilseq; if (ret != 1) abort(); conv->istate = state; return count+1; } else goto ilseq; case STATE_JISX0201ROMAN: if (c < 0x80) { int ret = jisx0201_mbtowc(conv,pwc,s,1); if (ret == RET_ILSEQ) goto ilseq; if (ret != 1) abort(); conv->istate = state; return count+1; } else goto ilseq; case STATE_JISX0208: if (n < count+2) goto none; if (s[0] < 0x80 && s[1] < 0x80) { int ret = jisx0208_mbtowc(conv,pwc,s,2); if (ret == RET_ILSEQ) goto ilseq; if (ret != 2) abort(); conv->istate = state; return count+2; } else goto ilseq; case STATE_JISX0212: if (n < count+2) goto none; if (s[0] < 0x80 && s[1] < 0x80) { int ret = jisx0212_mbtowc(conv,pwc,s,2); if (ret == RET_ILSEQ) goto ilseq; if (ret != 2) abort(); conv->istate = state; return count+2; } else goto ilseq; default: abort(); } none: conv->istate = state; return RET_TOOFEW(count); ilseq: conv->istate = state; return RET_SHIFT_ILSEQ(count); } static int iso2022_jp1_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { state_t state = conv->ostate; unsigned char buf[2]; int ret; /* Try ASCII. */ ret = ascii_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { if (ret != 1) abort(); if (buf[0] < 0x80) { int count = (state == STATE_ASCII ? 1 : 4); if (n < count) return RET_TOOSMALL; if (state != STATE_ASCII) { r[0] = ESC; r[1] = '('; r[2] = 'B'; r += 3; state = STATE_ASCII; } r[0] = buf[0]; conv->ostate = state; return count; } } /* Try JIS X 0201-1976 Roman. */ ret = jisx0201_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { if (ret != 1) abort(); if (buf[0] < 0x80) { int count = (state == STATE_JISX0201ROMAN ? 1 : 4); if (n < count) return RET_TOOSMALL; if (state != STATE_JISX0201ROMAN) { r[0] = ESC; r[1] = '('; r[2] = 'J'; r += 3; state = STATE_JISX0201ROMAN; } r[0] = buf[0]; conv->ostate = state; return count; } } /* Try JIS X 0208-1990 in place of JIS X 0208-1978 and JIS X 0208-1983. */ ret = jisx0208_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (buf[0] < 0x80 && buf[1] < 0x80) { int count = (state == STATE_JISX0208 ? 2 : 5); if (n < count) return RET_TOOSMALL; if (state != STATE_JISX0208) { r[0] = ESC; r[1] = '$'; r[2] = 'B'; r += 3; state = STATE_JISX0208; } r[0] = buf[0]; r[1] = buf[1]; conv->ostate = state; return count; } } /* Try JIS X 0212-1990. */ ret = jisx0212_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (buf[0] < 0x80 && buf[1] < 0x80) { int count = (state == STATE_JISX0212 ? 2 : 6); if (n < count) return RET_TOOSMALL; if (state != STATE_JISX0212) { r[0] = ESC; r[1] = '$'; r[2] = '('; r[3] = 'D'; r += 4; state = STATE_JISX0212; } r[0] = buf[0]; r[1] = buf[1]; conv->ostate = state; return count; } } return RET_ILUNI; } static int iso2022_jp1_reset (conv_t conv, unsigned char *r, int n) { state_t state = conv->ostate; if (state != STATE_ASCII) { if (n < 3) return RET_TOOSMALL; r[0] = ESC; r[1] = '('; r[2] = 'B'; /* conv->ostate = 0; will be done by the caller */ return 3; } else return 0; } #undef STATE_JISX0212 #undef STATE_JISX0208 #undef STATE_JISX0201ROMAN #undef STATE_ASCII freelan-2.0/third-party/source/libiconv-msvc/include/iso2022_jp2.h000066400000000000000000000444741252300335000247660ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-2022-JP-2 */ /* Specification: RFC 1554 */ /* ESC '(' 'I' for JISX0201 Katakana is an extension not found in RFC 1554 or CJK.INF, but implemented in glibc-2.1 and qt-2.0. */ #define ESC 0x1b /* * The state is composed of one of the following values */ #define STATE_ASCII 0 #define STATE_JISX0201ROMAN 1 #define STATE_JISX0201KATAKANA 2 #define STATE_JISX0208 3 #define STATE_JISX0212 4 #define STATE_GB2312 5 #define STATE_KSC5601 6 /* * and one of the following values, << 8 */ #define STATE_G2_NONE 0 #define STATE_G2_ISO8859_1 1 #define STATE_G2_ISO8859_7 2 #define SPLIT_STATE \ unsigned int state1 = state & 0xff, state2 = state >> 8 #define COMBINE_STATE \ state = (state2 << 8) | state1 static int iso2022_jp2_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { state_t state = conv->istate; SPLIT_STATE; int count = 0; unsigned char c; for (;;) { c = *s; if (c == ESC) { if (n < count+3) goto none; if (s[1] == '(') { if (s[2] == 'B') { state1 = STATE_ASCII; s += 3; count += 3; if (n < count+1) goto none; continue; } if (s[2] == 'J') { state1 = STATE_JISX0201ROMAN; s += 3; count += 3; if (n < count+1) goto none; continue; } if (s[2] == 'I') { state1 = STATE_JISX0201KATAKANA; s += 3; count += 3; if (n < count+1) goto none; continue; } goto ilseq; } if (s[1] == '$') { if (s[2] == '@' || s[2] == 'B') { /* We don't distinguish JIS X 0208-1978 and JIS X 0208-1983. */ state1 = STATE_JISX0208; s += 3; count += 3; if (n < count+1) goto none; continue; } if (s[2] == 'A') { state1 = STATE_GB2312; s += 3; count += 3; if (n < count+1) goto none; continue; } if (s[2] == '(') { if (n < count+4) goto none; if (s[3] == 'D') { state1 = STATE_JISX0212; s += 4; count += 4; if (n < count+1) goto none; continue; } if (s[3] == 'C') { state1 = STATE_KSC5601; s += 4; count += 4; if (n < count+1) goto none; continue; } goto ilseq; } goto ilseq; } if (s[1] == '.') { if (n < count+3) goto none; if (s[2] == 'A') { state2 = STATE_G2_ISO8859_1; s += 3; count += 3; if (n < count+1) goto none; continue; } if (s[2] == 'F') { state2 = STATE_G2_ISO8859_7; s += 3; count += 3; if (n < count+1) goto none; continue; } goto ilseq; } if (s[1] == 'N') { switch (state2) { case STATE_G2_NONE: goto ilseq; case STATE_G2_ISO8859_1: if (s[2] < 0x80) { unsigned char buf = s[2]+0x80; int ret = iso8859_1_mbtowc(conv,pwc,&buf,1); if (ret == RET_ILSEQ) goto ilseq; if (ret != 1) abort(); COMBINE_STATE; conv->istate = state; return count+3; } else goto ilseq; case STATE_G2_ISO8859_7: if (s[2] < 0x80) { unsigned char buf = s[2]+0x80; int ret = iso8859_7_mbtowc(conv,pwc,&buf,1); if (ret == RET_ILSEQ) goto ilseq; if (ret != 1) abort(); COMBINE_STATE; conv->istate = state; return count+3; } else goto ilseq; default: abort(); } } goto ilseq; } break; } switch (state1) { case STATE_ASCII: if (c < 0x80) { int ret = ascii_mbtowc(conv,pwc,s,1); if (ret == RET_ILSEQ) goto ilseq; if (ret != 1) abort(); if (*pwc == 0x000a || *pwc == 0x000d) state2 = STATE_G2_NONE; COMBINE_STATE; conv->istate = state; return count+1; } else goto ilseq; case STATE_JISX0201ROMAN: if (c < 0x80) { int ret = jisx0201_mbtowc(conv,pwc,s,1); if (ret == RET_ILSEQ) goto ilseq; if (ret != 1) abort(); if (*pwc == 0x000a || *pwc == 0x000d) state2 = STATE_G2_NONE; COMBINE_STATE; conv->istate = state; return count+1; } else goto ilseq; case STATE_JISX0201KATAKANA: if (c < 0x80) { unsigned char buf = c+0x80; int ret = jisx0201_mbtowc(conv,pwc,&buf,1); if (ret == RET_ILSEQ) goto ilseq; if (ret != 1) abort(); COMBINE_STATE; conv->istate = state; return count+1; } else goto ilseq; case STATE_JISX0208: if (n < count+2) goto none; if (s[0] < 0x80 && s[1] < 0x80) { int ret = jisx0208_mbtowc(conv,pwc,s,2); if (ret == RET_ILSEQ) goto ilseq; if (ret != 2) abort(); COMBINE_STATE; conv->istate = state; return count+2; } else goto ilseq; case STATE_JISX0212: if (n < count+2) goto none; if (s[0] < 0x80 && s[1] < 0x80) { int ret = jisx0212_mbtowc(conv,pwc,s,2); if (ret == RET_ILSEQ) goto ilseq; if (ret != 2) abort(); COMBINE_STATE; conv->istate = state; return count+2; } else goto ilseq; case STATE_GB2312: if (n < count+2) goto none; if (s[0] < 0x80 && s[1] < 0x80) { int ret = gb2312_mbtowc(conv,pwc,s,2); if (ret == RET_ILSEQ) goto ilseq; if (ret != 2) abort(); COMBINE_STATE; conv->istate = state; return count+2; } else goto ilseq; case STATE_KSC5601: if (n < count+2) goto none; if (s[0] < 0x80 && s[1] < 0x80) { int ret = ksc5601_mbtowc(conv,pwc,s,2); if (ret == RET_ILSEQ) goto ilseq; if (ret != 2) abort(); COMBINE_STATE; conv->istate = state; return count+2; } else goto ilseq; default: abort(); } none: COMBINE_STATE; conv->istate = state; return RET_TOOFEW(count); ilseq: COMBINE_STATE; conv->istate = state; return RET_SHIFT_ILSEQ(count); } #undef COMBINE_STATE #undef SPLIT_STATE /* * The state can also contain one of the following values, << 16. * Values >= STATE_TAG_LANGUAGE are temporary tag parsing states. */ #define STATE_TAG_NONE 0 #define STATE_TAG_LANGUAGE 4 #define STATE_TAG_LANGUAGE_j 5 #define STATE_TAG_LANGUAGE_ja 1 #define STATE_TAG_LANGUAGE_k 6 #define STATE_TAG_LANGUAGE_ko 2 #define STATE_TAG_LANGUAGE_z 7 #define STATE_TAG_LANGUAGE_zh 3 #define SPLIT_STATE \ unsigned int state1 = state & 0xff, state2 = (state >> 8) & 0xff, state3 = state >> 16 #define COMBINE_STATE \ state = (state3 << 16) | (state2 << 8) | state1 static int iso2022_jp2_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { state_t state = conv->ostate; SPLIT_STATE; unsigned char buf[2]; int ret; /* This defines the conversion preferences depending on the current langauge tag. */ enum conversion { none = 0, european, japanese, chinese, korean, other }; static const unsigned int conversion_lists[STATE_TAG_LANGUAGE] = { /* STATE_TAG_NONE */ japanese + (european << 3) + (chinese << 6) + (korean << 9) + (other << 12), /* STATE_TAG_LANGUAGE_ja */ japanese + (european << 3) + (chinese << 6) + (korean << 9) + (other << 12), /* STATE_TAG_LANGUAGE_ko */ korean + (european << 3) + (japanese << 6) + (chinese << 9) + (other << 12), /* STATE_TAG_LANGUAGE_zh */ chinese + (european << 3) + (japanese << 6) + (korean << 9) + (other << 12) }; unsigned int conversion_list; /* Handle Unicode tag characters (range U+E0000..U+E007F). */ if ((wc >> 7) == (0xe0000 >> 7)) { char c = wc & 0x7f; if (c >= 'A' && c <= 'Z') c += 'a'-'A'; switch (c) { case 0x01: state3 = STATE_TAG_LANGUAGE; COMBINE_STATE; conv->ostate = state; return 0; case 'j': if (state3 == STATE_TAG_LANGUAGE) { state3 = STATE_TAG_LANGUAGE_j; COMBINE_STATE; conv->ostate = state; return 0; } break; case 'a': if (state3 == STATE_TAG_LANGUAGE_j) { state3 = STATE_TAG_LANGUAGE_ja; COMBINE_STATE; conv->ostate = state; return 0; } break; case 'k': if (state3 == STATE_TAG_LANGUAGE) { state3 = STATE_TAG_LANGUAGE_k; COMBINE_STATE; conv->ostate = state; return 0; } break; case 'o': if (state3 == STATE_TAG_LANGUAGE_k) { state3 = STATE_TAG_LANGUAGE_ko; COMBINE_STATE; conv->ostate = state; return 0; } break; case 'z': if (state3 == STATE_TAG_LANGUAGE) { state3 = STATE_TAG_LANGUAGE_z; COMBINE_STATE; conv->ostate = state; return 0; } break; case 'h': if (state3 == STATE_TAG_LANGUAGE_z) { state3 = STATE_TAG_LANGUAGE_zh; COMBINE_STATE; conv->ostate = state; return 0; } break; case 0x7f: state3 = STATE_TAG_NONE; COMBINE_STATE; conv->ostate = state; return 0; default: break; } /* Other tag characters reset the tag parsing state or are ignored. */ if (state3 >= STATE_TAG_LANGUAGE) state3 = STATE_TAG_NONE; COMBINE_STATE; conv->ostate = state; return 0; } if (state3 >= STATE_TAG_LANGUAGE) state3 = STATE_TAG_NONE; /* Try ASCII. */ ret = ascii_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { if (ret != 1) abort(); if (buf[0] < 0x80) { int count = (state1 == STATE_ASCII ? 1 : 4); if (n < count) return RET_TOOSMALL; if (state1 != STATE_ASCII) { r[0] = ESC; r[1] = '('; r[2] = 'B'; r += 3; state1 = STATE_ASCII; } r[0] = buf[0]; if (wc == 0x000a || wc == 0x000d) state2 = STATE_G2_NONE; COMBINE_STATE; conv->ostate = state; return count; } } conversion_list = conversion_lists[state3]; do { switch (conversion_list & ((1 << 3) - 1)) { case european: /* Try ISO-8859-1. */ ret = iso8859_1_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { if (ret != 1) abort(); if (buf[0] >= 0x80) { int count = (state2 == STATE_G2_ISO8859_1 ? 3 : 6); if (n < count) return RET_TOOSMALL; if (state2 != STATE_G2_ISO8859_1) { r[0] = ESC; r[1] = '.'; r[2] = 'A'; r += 3; state2 = STATE_G2_ISO8859_1; } r[0] = ESC; r[1] = 'N'; r[2] = buf[0]-0x80; COMBINE_STATE; conv->ostate = state; return count; } } /* Try ISO-8859-7. */ ret = iso8859_7_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { if (ret != 1) abort(); if (buf[0] >= 0x80) { int count = (state2 == STATE_G2_ISO8859_7 ? 3 : 6); if (n < count) return RET_TOOSMALL; if (state2 != STATE_G2_ISO8859_7) { r[0] = ESC; r[1] = '.'; r[2] = 'F'; r += 3; state2 = STATE_G2_ISO8859_7; } r[0] = ESC; r[1] = 'N'; r[2] = buf[0]-0x80; COMBINE_STATE; conv->ostate = state; return count; } } break; case japanese: /* Try JIS X 0201-1976 Roman. */ ret = jisx0201_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { if (ret != 1) abort(); if (buf[0] < 0x80) { int count = (state1 == STATE_JISX0201ROMAN ? 1 : 4); if (n < count) return RET_TOOSMALL; if (state1 != STATE_JISX0201ROMAN) { r[0] = ESC; r[1] = '('; r[2] = 'J'; r += 3; state1 = STATE_JISX0201ROMAN; } r[0] = buf[0]; if (wc == 0x000a || wc == 0x000d) state2 = STATE_G2_NONE; COMBINE_STATE; conv->ostate = state; return count; } } /* Try JIS X 0208-1990 in place of JIS X 0208-1978 and JIS X 0208-1983. */ ret = jisx0208_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (buf[0] < 0x80 && buf[1] < 0x80) { int count = (state1 == STATE_JISX0208 ? 2 : 5); if (n < count) return RET_TOOSMALL; if (state1 != STATE_JISX0208) { r[0] = ESC; r[1] = '$'; r[2] = 'B'; r += 3; state1 = STATE_JISX0208; } r[0] = buf[0]; r[1] = buf[1]; COMBINE_STATE; conv->ostate = state; return count; } } /* Try JIS X 0212-1990. */ ret = jisx0212_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (buf[0] < 0x80 && buf[1] < 0x80) { int count = (state1 == STATE_JISX0212 ? 2 : 6); if (n < count) return RET_TOOSMALL; if (state1 != STATE_JISX0212) { r[0] = ESC; r[1] = '$'; r[2] = '('; r[3] = 'D'; r += 4; state1 = STATE_JISX0212; } r[0] = buf[0]; r[1] = buf[1]; COMBINE_STATE; conv->ostate = state; return count; } } break; case chinese: /* Try GB 2312-1980. */ ret = gb2312_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (buf[0] < 0x80 && buf[1] < 0x80) { int count = (state1 == STATE_GB2312 ? 2 : 5); if (n < count) return RET_TOOSMALL; if (state1 != STATE_GB2312) { r[0] = ESC; r[1] = '$'; r[2] = 'A'; r += 3; state1 = STATE_GB2312; } r[0] = buf[0]; r[1] = buf[1]; COMBINE_STATE; conv->ostate = state; return count; } } break; case korean: /* Try KS C 5601-1992. */ ret = ksc5601_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (buf[0] < 0x80 && buf[1] < 0x80) { int count = (state1 == STATE_KSC5601 ? 2 : 6); if (n < count) return RET_TOOSMALL; if (state1 != STATE_KSC5601) { r[0] = ESC; r[1] = '$'; r[2] = '('; r[3] = 'C'; r += 4; state1 = STATE_KSC5601; } r[0] = buf[0]; r[1] = buf[1]; COMBINE_STATE; conv->ostate = state; return count; } } break; case other: /* Try JIS X 0201-1976 Kana. This is not officially part of ISO-2022-JP-2, according to RFC 1554. Therefore we try this only after all other attempts. */ ret = jisx0201_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { if (ret != 1) abort(); if (buf[0] >= 0x80) { int count = (state1 == STATE_JISX0201KATAKANA ? 1 : 4); if (n < count) return RET_TOOSMALL; if (state1 != STATE_JISX0201KATAKANA) { r[0] = ESC; r[1] = '('; r[2] = 'I'; r += 3; state1 = STATE_JISX0201KATAKANA; } r[0] = buf[0]-0x80; COMBINE_STATE; conv->ostate = state; return count; } } break; default: abort(); } conversion_list = conversion_list >> 3; } while (conversion_list != 0); return RET_ILUNI; } static int iso2022_jp2_reset (conv_t conv, unsigned char *r, int n) { state_t state = conv->ostate; SPLIT_STATE; (void)state2; (void)state3; if (state1 != STATE_ASCII) { if (n < 3) return RET_TOOSMALL; r[0] = ESC; r[1] = '('; r[2] = 'B'; /* conv->ostate = 0; will be done by the caller */ return 3; } else return 0; } #undef COMBINE_STATE #undef SPLIT_STATE #undef STATE_TAG_LANGUAGE_zh #undef STATE_TAG_LANGUAGE_z #undef STATE_TAG_LANGUAGE_ko #undef STATE_TAG_LANGUAGE_k #undef STATE_TAG_LANGUAGE_ja #undef STATE_TAG_LANGUAGE_j #undef STATE_TAG_LANGUAGE #undef STATE_TAG_NONE #undef STATE_G2_ISO8859_7 #undef STATE_G2_ISO8859_1 #undef STATE_G2_NONE #undef STATE_KSC5601 #undef STATE_GB2312 #undef STATE_JISX0212 #undef STATE_JISX0208 #undef STATE_JISX0201KATAKANA #undef STATE_JISX0201ROMAN #undef STATE_ASCII freelan-2.0/third-party/source/libiconv-msvc/include/iso2022_jp3.h000066400000000000000000000364021252300335000247570ustar00rootroot00000000000000/* * Copyright (C) 1999-2004, 2008 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-2022-JP-3 */ #include "jisx0213.h" #define ESC 0x1b /* * The state is composed of one of the following values */ #define STATE_ASCII 0 /* Esc ( B */ #define STATE_JISX0201ROMAN 1 /* Esc ( J */ #define STATE_JISX0201KATAKANA 2 /* Esc ( I */ #define STATE_JISX0208 3 /* Esc $ @ or Esc $ B */ #define STATE_JISX02131 4 /* Esc $ ( O or Esc $ ( Q*/ #define STATE_JISX02132 5 /* Esc $ ( P */ /* * In the ISO-2022-JP-3 to UCS-4 direction, the state also holds the last * character to be output, shifted by 3 bits. */ static int iso2022_jp3_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { ucs4_t last_wc = conv->istate >> 3; if (last_wc) { /* Output the buffered character. */ conv->istate &= 7; *pwc = last_wc; return 0; /* Don't advance the input pointer. */ } else { state_t state = conv->istate; int count = 0; unsigned char c; for (;;) { c = *s; if (c == ESC) { if (n < count+3) goto none; if (s[1] == '(') { if (s[2] == 'B') { state = STATE_ASCII; s += 3; count += 3; if (n < count+1) goto none; continue; } if (s[2] == 'J') { state = STATE_JISX0201ROMAN; s += 3; count += 3; if (n < count+1) goto none; continue; } if (s[2] == 'I') { state = STATE_JISX0201KATAKANA; s += 3; count += 3; if (n < count+1) goto none; continue; } goto ilseq; } if (s[1] == '$') { if (s[2] == '@' || s[2] == 'B') { /* We don't distinguish JIS X 0208-1978 and JIS X 0208-1983. */ state = STATE_JISX0208; s += 3; count += 3; if (n < count+1) goto none; continue; } if (s[2] == '(') { if (n < count+4) goto none; if (s[3] == 'O' || s[3] == 'Q') { state = STATE_JISX02131; s += 4; count += 4; if (n < count+1) goto none; continue; } if (s[3] == 'P') { state = STATE_JISX02132; s += 4; count += 4; if (n < count+1) goto none; continue; } } goto ilseq; } goto ilseq; } break; } switch (state) { case STATE_ASCII: if (c < 0x80) { int ret = ascii_mbtowc(conv,pwc,s,1); if (ret == RET_ILSEQ) goto ilseq; if (ret != 1) abort(); conv->istate = state; return count+1; } else goto ilseq; case STATE_JISX0201ROMAN: if (c < 0x80) { int ret = jisx0201_mbtowc(conv,pwc,s,1); if (ret == RET_ILSEQ) goto ilseq; if (ret != 1) abort(); conv->istate = state; return count+1; } else goto ilseq; case STATE_JISX0201KATAKANA: if (c < 0x80) { unsigned char buf = c+0x80; int ret = jisx0201_mbtowc(conv,pwc,&buf,1); if (ret == RET_ILSEQ) goto ilseq; if (ret != 1) abort(); conv->istate = state; return count+1; } else goto ilseq; case STATE_JISX0208: if (n < count+2) goto none; if (s[0] < 0x80 && s[1] < 0x80) { int ret = jisx0208_mbtowc(conv,pwc,s,2); if (ret == RET_ILSEQ) goto ilseq; if (ret != 2) abort(); conv->istate = state; return count+2; } else goto ilseq; case STATE_JISX02131: case STATE_JISX02132: if (n < count+2) goto none; if (s[0] < 0x80 && s[1] < 0x80) { ucs4_t wc = jisx0213_to_ucs4(((state-STATE_JISX02131+1)<<8)+s[0],s[1]); if (wc) { if (wc < 0x80) { /* It's a combining character. */ ucs4_t wc1 = jisx0213_to_ucs_combining[wc - 1][0]; ucs4_t wc2 = jisx0213_to_ucs_combining[wc - 1][1]; /* We cannot output two Unicode characters at once. So, output the first character and buffer the second one. */ *pwc = wc1; conv->istate = (wc2 << 3) | state; } else { *pwc = wc; conv->istate = state; } return count+2; } } goto ilseq; default: abort(); } none: conv->istate = state; return RET_TOOFEW(count); ilseq: conv->istate = state; return RET_SHIFT_ILSEQ(count); } } static int iso2022_jp3_flushwc (conv_t conv, ucs4_t *pwc) { ucs4_t last_wc = conv->istate >> 3; if (last_wc) { /* Output the buffered character. */ conv->istate &= 7; *pwc = last_wc; return 1; } else return 0; } /* * In the UCS-4 to ISO-2022-JP-3 direction, the state also holds the last two * bytes to be output, shifted by 3 bits, and the STATE_xxxxx value that was * effective before this buffered character, shifted by 19 bits. */ /* Composition tables for each of the relevant combining characters. */ static const struct { unsigned short base; unsigned short composed; } iso2022_jp3_comp_table_data[] = { #define iso2022_jp3_comp_table02e5_idx 0 #define iso2022_jp3_comp_table02e5_len 1 { 0x2b64, 0x2b65 }, /* 0x12B65 = 0x12B64 U+02E5 */ #define iso2022_jp3_comp_table02e9_idx (iso2022_jp3_comp_table02e5_idx+iso2022_jp3_comp_table02e5_len) #define iso2022_jp3_comp_table02e9_len 1 { 0x2b60, 0x2b66 }, /* 0x12B66 = 0x12B60 U+02E9 */ #define iso2022_jp3_comp_table0300_idx (iso2022_jp3_comp_table02e9_idx+iso2022_jp3_comp_table02e9_len) #define iso2022_jp3_comp_table0300_len 5 { 0x295c, 0x2b44 }, /* 0x12B44 = 0x1295C U+0300 */ { 0x2b38, 0x2b48 }, /* 0x12B48 = 0x12B38 U+0300 */ { 0x2b37, 0x2b4a }, /* 0x12B4A = 0x12B37 U+0300 */ { 0x2b30, 0x2b4c }, /* 0x12B4C = 0x12B30 U+0300 */ { 0x2b43, 0x2b4e }, /* 0x12B4E = 0x12B43 U+0300 */ #define iso2022_jp3_comp_table0301_idx (iso2022_jp3_comp_table0300_idx+iso2022_jp3_comp_table0300_len) #define iso2022_jp3_comp_table0301_len 4 { 0x2b38, 0x2b49 }, /* 0x12B49 = 0x12B38 U+0301 */ { 0x2b37, 0x2b4b }, /* 0x12B4B = 0x12B37 U+0301 */ { 0x2b30, 0x2b4d }, /* 0x12B4D = 0x12B30 U+0301 */ { 0x2b43, 0x2b4f }, /* 0x12B4F = 0x12B43 U+0301 */ #define iso2022_jp3_comp_table309a_idx (iso2022_jp3_comp_table0301_idx+iso2022_jp3_comp_table0301_len) #define iso2022_jp3_comp_table309a_len 14 { 0x242b, 0x2477 }, /* 0x12477 = 0x1242B U+309A */ { 0x242d, 0x2478 }, /* 0x12478 = 0x1242D U+309A */ { 0x242f, 0x2479 }, /* 0x12479 = 0x1242F U+309A */ { 0x2431, 0x247a }, /* 0x1247A = 0x12431 U+309A */ { 0x2433, 0x247b }, /* 0x1247B = 0x12433 U+309A */ { 0x252b, 0x2577 }, /* 0x12577 = 0x1252B U+309A */ { 0x252d, 0x2578 }, /* 0x12578 = 0x1252D U+309A */ { 0x252f, 0x2579 }, /* 0x12579 = 0x1252F U+309A */ { 0x2531, 0x257a }, /* 0x1257A = 0x12531 U+309A */ { 0x2533, 0x257b }, /* 0x1257B = 0x12533 U+309A */ { 0x253b, 0x257c }, /* 0x1257C = 0x1253B U+309A */ { 0x2544, 0x257d }, /* 0x1257D = 0x12544 U+309A */ { 0x2548, 0x257e }, /* 0x1257E = 0x12548 U+309A */ { 0x2675, 0x2678 }, /* 0x12678 = 0x12675 U+309A */ }; #define SPLIT_STATE \ unsigned short lasttwo = state >> 3; state_t prevstate = state >> 19; state &= 7 #define COMBINE_STATE \ state |= (prevstate << 19) | (lasttwo << 3) #define COMBINE_STATE_NO_LASTTWO \ /* assume lasttwo == 0, then prevstate is ignored */ static int iso2022_jp3_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { int count = 0; unsigned char buf[2]; unsigned short jch; int ret; state_t state = conv->ostate; SPLIT_STATE; if (lasttwo) { /* Attempt to combine the last character with this one. */ unsigned int idx; unsigned int len; if (wc == 0x02e5) idx = iso2022_jp3_comp_table02e5_idx, len = iso2022_jp3_comp_table02e5_len; else if (wc == 0x02e9) idx = iso2022_jp3_comp_table02e9_idx, len = iso2022_jp3_comp_table02e9_len; else if (wc == 0x0300) idx = iso2022_jp3_comp_table0300_idx, len = iso2022_jp3_comp_table0300_len; else if (wc == 0x0301) idx = iso2022_jp3_comp_table0301_idx, len = iso2022_jp3_comp_table0301_len; else if (wc == 0x309a) idx = iso2022_jp3_comp_table309a_idx, len = iso2022_jp3_comp_table309a_len; else goto not_combining; do if (iso2022_jp3_comp_table_data[idx].base == lasttwo) break; while (++idx, --len > 0); if (len > 0) { /* Output the combined character. */ /* We know the combined character is in JISX0213 plane 1, but the buffered character may have been in JISX0208 or in JISX0213 plane 1. */ count = (state != STATE_JISX02131 ? 4 : 0) + 2; if (n < count) return RET_TOOSMALL; if (state != STATE_JISX02131) { r[0] = ESC; r[1] = '$'; r[2] = '('; r[3] = 'Q'; r += 4; state = STATE_JISX02131; } lasttwo = iso2022_jp3_comp_table_data[idx].composed; r[0] = (lasttwo >> 8) & 0xff; r[1] = lasttwo & 0xff; COMBINE_STATE_NO_LASTTWO; conv->ostate = state; return count; } not_combining: /* Output the buffered character. */ /* We know it is in JISX0208 or in JISX0213 plane 1. */ count = (prevstate != state ? 3 : 0) + 2; if (n < count) return RET_TOOSMALL; if (prevstate != state) { if (state != STATE_JISX0208) abort(); r[0] = ESC; r[1] = '$'; r[2] = 'B'; r += 3; } r[0] = (lasttwo >> 8) & 0xff; r[1] = lasttwo & 0xff; r += 2; } /* Try ASCII. */ ret = ascii_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { if (ret != 1) abort(); if (buf[0] < 0x80) { count += (state == STATE_ASCII ? 1 : 4); if (n < count) return RET_TOOSMALL; if (state != STATE_ASCII) { r[0] = ESC; r[1] = '('; r[2] = 'B'; r += 3; state = STATE_ASCII; } r[0] = buf[0]; COMBINE_STATE_NO_LASTTWO; conv->ostate = state; return count; } } /* Try JIS X 0201-1976 Roman. */ ret = jisx0201_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { if (ret != 1) abort(); if (buf[0] < 0x80) { count += (state == STATE_JISX0201ROMAN ? 1 : 4); if (n < count) return RET_TOOSMALL; if (state != STATE_JISX0201ROMAN) { r[0] = ESC; r[1] = '('; r[2] = 'J'; r += 3; state = STATE_JISX0201ROMAN; } r[0] = buf[0]; COMBINE_STATE_NO_LASTTWO; conv->ostate = state; return count; } } jch = ucs4_to_jisx0213(wc); /* Try JIS X 0208-1990 in place of JIS X 0208-1978 and JIS X 0208-1983. */ ret = jisx0208_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (buf[0] < 0x80 && buf[1] < 0x80) { if (jch & 0x0080) { /* A possible match in comp_table_data. Buffer it. */ prevstate = state; lasttwo = jch & 0x7f7f; state = STATE_JISX0208; COMBINE_STATE; conv->ostate = state; return count; } else { count += (state == STATE_JISX0208 ? 2 : 5); if (n < count) return RET_TOOSMALL; if (state != STATE_JISX0208) { r[0] = ESC; r[1] = '$'; r[2] = 'B'; r += 3; state = STATE_JISX0208; } r[0] = buf[0]; r[1] = buf[1]; COMBINE_STATE_NO_LASTTWO; conv->ostate = state; return count; } } } /* Try JISX 0213 plane 1 and JISX 0213 plane 2. */ if (jch != 0) { if (jch & 0x8000) { /* JISX 0213 plane 2. */ if (state != STATE_JISX02132) { count += 4; if (n < count) return RET_TOOSMALL; r[0] = ESC; r[1] = '$'; r[2] = '('; r[3] = 'P'; r += 4; state = STATE_JISX02132; } } else { /* JISX 0213 plane 1. */ if (state != STATE_JISX02131) { count += 4; if (n < count) return RET_TOOSMALL; r[0] = ESC; r[1] = '$'; r[2] = '('; r[3] = 'Q'; r += 4; state = STATE_JISX02131; } } if (jch & 0x0080) { /* A possible match in comp_table_data. We have to buffer it. */ /* We know it's a JISX 0213 plane 1 character. */ if (jch & 0x8000) abort(); prevstate = state; lasttwo = jch & 0x7f7f; COMBINE_STATE; conv->ostate = state; return count; } count += 2; if (n < count) return RET_TOOSMALL; r[0] = (jch >> 8) & 0x7f; r[1] = jch & 0x7f; COMBINE_STATE_NO_LASTTWO; conv->ostate = state; return count; } /* Try JIS X 0201-1976 Katakana. This is not officially part of ISO-2022-JP-3. Therefore we try it after all other attempts. */ ret = jisx0201_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { if (ret != 1) abort(); if (buf[0] >= 0x80) { count += (state == STATE_JISX0201KATAKANA ? 1 : 4); if (n < count) return RET_TOOSMALL; if (state != STATE_JISX0201KATAKANA) { r[0] = ESC; r[1] = '('; r[2] = 'I'; r += 3; state = STATE_JISX0201KATAKANA; } r[0] = buf[0]-0x80; COMBINE_STATE_NO_LASTTWO; conv->ostate = state; return count; } } return RET_ILUNI; } static int iso2022_jp3_reset (conv_t conv, unsigned char *r, int n) { state_t state = conv->ostate; SPLIT_STATE; { int count = (lasttwo ? (prevstate != state ? 3 : 0) + 2 : 0) + (state != STATE_ASCII ? 3 : 0); if (n < count) return RET_TOOSMALL; if (lasttwo) { if (prevstate != state) { if (state != STATE_JISX0208) abort(); r[0] = ESC; r[1] = '$'; r[2] = 'B'; r += 3; } r[0] = (lasttwo >> 8) & 0xff; r[1] = lasttwo & 0xff; r += 2; } if (state != STATE_ASCII) { r[0] = ESC; r[1] = '('; r[2] = 'B'; } /* conv->ostate = 0; will be done by the caller */ return count; } } #undef COMBINE_STATE_NO_LASTTWO #undef COMBINE_STATE #undef SPLIT_STATE #undef STATE_JISX02132 #undef STATE_JISX02131 #undef STATE_JISX0208 #undef STATE_JISX0201KATAKANA #undef STATE_JISX0201ROMAN #undef STATE_ASCII freelan-2.0/third-party/source/libiconv-msvc/include/iso2022_kr.h000066400000000000000000000126201252300335000246730ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-2022-KR */ /* Specification: RFC 1557 */ /* Note: CJK.INF says the SO designator needs to appear only once at the beginning of a text, but to decrease the risk of ambiguities, when producing ISO-2022-KR, we repeat the designator in every line containing SO characters. RFC 1557 does not mandate this. */ #define ESC 0x1b #define SO 0x0e #define SI 0x0f /* * The state is composed of one of the following values */ #define STATE_ASCII 0 #define STATE_TWOBYTE 1 /* * and one of the following values, << 8 */ #define STATE2_NONE 0 #define STATE2_DESIGNATED_KSC5601 1 #define SPLIT_STATE \ unsigned int state1 = state & 0xff, state2 = state >> 8 #define COMBINE_STATE \ state = (state2 << 8) | state1 static int iso2022_kr_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { state_t state = conv->istate; SPLIT_STATE; int count = 0; unsigned char c; for (;;) { c = *s; if (c == ESC) { if (n < count+4) goto none; if (s[1] == '$') { if (s[2] == ')') { if (s[3] == 'C') { state2 = STATE2_DESIGNATED_KSC5601; s += 4; count += 4; if (n < count+1) goto none; continue; } } } goto ilseq; } if (c == SO) { if (state2 != STATE2_DESIGNATED_KSC5601) goto ilseq; state1 = STATE_TWOBYTE; s++; count++; if (n < count+1) goto none; continue; } if (c == SI) { state1 = STATE_ASCII; s++; count++; if (n < count+1) goto none; continue; } break; } switch (state1) { case STATE_ASCII: if (c < 0x80) { int ret = ascii_mbtowc(conv,pwc,s,1); if (ret == RET_ILSEQ) goto ilseq; if (ret != 1) abort(); #if 0 /* Accept ISO-2022-KR according to CJK.INF. */ if (*pwc == 0x000a || *pwc == 0x000d) state2 = STATE2_NONE; #endif COMBINE_STATE; conv->istate = state; return count+1; } else goto ilseq; case STATE_TWOBYTE: if (n < count+2) goto none; if (state2 != STATE2_DESIGNATED_KSC5601) abort(); if (s[0] < 0x80 && s[1] < 0x80) { int ret = ksc5601_mbtowc(conv,pwc,s,2); if (ret == RET_ILSEQ) goto ilseq; if (ret != 2) abort(); COMBINE_STATE; conv->istate = state; return count+2; } else goto ilseq; default: abort(); } none: COMBINE_STATE; conv->istate = state; return RET_TOOFEW(count); ilseq: COMBINE_STATE; conv->istate = state; return RET_SHIFT_ILSEQ(count); } static int iso2022_kr_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { state_t state = conv->ostate; SPLIT_STATE; unsigned char buf[2]; int ret; /* Try ASCII. */ ret = ascii_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { if (ret != 1) abort(); if (buf[0] < 0x80) { int count = (state1 == STATE_ASCII ? 1 : 2); if (n < count) return RET_TOOSMALL; if (state1 != STATE_ASCII) { r[0] = SI; r += 1; state1 = STATE_ASCII; } r[0] = buf[0]; if (wc == 0x000a || wc == 0x000d) state2 = STATE2_NONE; COMBINE_STATE; conv->ostate = state; return count; } } /* Try KS C 5601-1992. */ ret = ksc5601_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (buf[0] < 0x80 && buf[1] < 0x80) { int count = (state2 == STATE2_DESIGNATED_KSC5601 ? 0 : 4) + (state1 == STATE_TWOBYTE ? 0 : 1) + 2; if (n < count) return RET_TOOSMALL; if (state2 != STATE2_DESIGNATED_KSC5601) { r[0] = ESC; r[1] = '$'; r[2] = ')'; r[3] = 'C'; r += 4; state2 = STATE2_DESIGNATED_KSC5601; } if (state1 != STATE_TWOBYTE) { r[0] = SO; r += 1; state1 = STATE_TWOBYTE; } r[0] = buf[0]; r[1] = buf[1]; COMBINE_STATE; conv->ostate = state; return count; } } return RET_ILUNI; } static int iso2022_kr_reset (conv_t conv, unsigned char *r, int n) { state_t state = conv->ostate; SPLIT_STATE; (void)state2; if (state1 != STATE_ASCII) { if (n < 1) return RET_TOOSMALL; r[0] = SI; /* conv->ostate = 0; will be done by the caller */ return 1; } else return 0; } #undef COMBINE_STATE #undef SPLIT_STATE #undef STATE2_DESIGNATED_KSC5601 #undef STATE2_NONE #undef STATE_TWOBYTE #undef STATE_ASCII freelan-2.0/third-party/source/libiconv-msvc/include/iso646_cn.h000066400000000000000000000030561252300335000246140ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO646-CN * also known as GB_1988-80 */ static int iso646_cn_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { if (c == 0x24) *pwc = (ucs4_t) 0x00a5; else if (c == 0x7e) *pwc = (ucs4_t) 0x203e; else *pwc = (ucs4_t) c; return 1; } return RET_ILSEQ; } static int iso646_cn_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x0080 && !(wc == 0x0024 || wc == 0x007e)) { *r = wc; return 1; } if (wc == 0x00a5) { *r = 0x24; return 1; } if (wc == 0x203e) { *r = 0x7e; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/iso646_jp.h000066400000000000000000000031411252300335000246200ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO646-JP * also known as JIS_C6220-1969-RO */ /* This is the lower half of JIS_X0201. */ static int iso646_jp_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { if (c == 0x5c) *pwc = (ucs4_t) 0x00a5; else if (c == 0x7e) *pwc = (ucs4_t) 0x203e; else *pwc = (ucs4_t) c; return 1; } return RET_ILSEQ; } static int iso646_jp_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x0080 && !(wc == 0x005c || wc == 0x007e)) { *r = wc; return 1; } if (wc == 0x00a5) { *r = 0x5c; return 1; } if (wc == 0x203e) { *r = 0x7e; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/iso8859_1.h000066400000000000000000000023421252300335000244470ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-1 */ static int iso8859_1_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; *pwc = (ucs4_t) c; return 1; } static int iso8859_1_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x0100) { *r = wc; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/iso8859_10.h000066400000000000000000000104041252300335000245250ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-10 */ static const unsigned short iso8859_10_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0104, 0x0112, 0x0122, 0x012a, 0x0128, 0x0136, 0x00a7, 0x013b, 0x0110, 0x0160, 0x0166, 0x017d, 0x00ad, 0x016a, 0x014a, /* 0xb0 */ 0x00b0, 0x0105, 0x0113, 0x0123, 0x012b, 0x0129, 0x0137, 0x00b7, 0x013c, 0x0111, 0x0161, 0x0167, 0x017e, 0x2015, 0x016b, 0x014b, /* 0xc0 */ 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x00cf, /* 0xd0 */ 0x00d0, 0x0145, 0x014c, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0168, 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, /* 0xe0 */ 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0x00f0, 0x0146, 0x014d, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0169, 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0138, }; static int iso8859_10_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_10_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_10_page00[224] = { 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0x00, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ 0xd0, 0x00, 0x00, 0xd3, 0xd4, 0xd5, 0xd6, 0x00, /* 0xd0-0xd7 */ 0xd8, 0x00, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0xd8-0xdf */ 0x00, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0x00, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0xf0, 0x00, 0x00, 0xf3, 0xf4, 0xf5, 0xf6, 0x00, /* 0xf0-0xf7 */ 0xf8, 0x00, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0xc0, 0xe0, 0x00, 0x00, 0xa1, 0xb1, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */ 0xa9, 0xb9, 0xa2, 0xb2, 0x00, 0x00, 0xcc, 0xec, /* 0x10-0x17 */ 0xca, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0xa3, 0xb3, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0xa5, 0xb5, 0xa4, 0xb4, 0x00, 0x00, 0xc7, 0xe7, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0xb6, /* 0x30-0x37 */ 0xff, 0x00, 0x00, 0xa8, 0xb8, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf1, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0xaf, 0xbf, 0xd2, 0xf2, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xaa, 0xba, 0x00, 0x00, 0x00, 0x00, 0xab, 0xbb, /* 0x60-0x67 */ 0xd7, 0xf7, 0xae, 0xbe, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0xd9, 0xf9, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0xbc, 0x00, /* 0x78-0x7f */ }; static int iso8859_10_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = iso8859_10_page00[wc-0x00a0]; else if (wc == 0x2015) c = 0xbd; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/iso8859_11.h000066400000000000000000000027601252300335000245340ustar00rootroot00000000000000/* * Copyright (C) 1999-2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-11 */ static int iso8859_11_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa1) { *pwc = (ucs4_t) c; return 1; } else if (c <= 0xfb && !(c >= 0xdb && c <= 0xde)) { *pwc = (ucs4_t) (c + 0x0d60); return 1; } return RET_ILSEQ; } static int iso8859_11_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x00a1) { *r = wc; return 1; } else if (wc >= 0x0e01 && wc <= 0x0e5b && !(wc >= 0x0e3b && wc <= 0x0e3e)) { *r = wc-0x0d60; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/iso8859_13.h000066400000000000000000000106441252300335000245360ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-13 */ static const unsigned short iso8859_13_2uni[96] = { /* 0xa0 */ 0x00a0, 0x201d, 0x00a2, 0x00a3, 0x00a4, 0x201e, 0x00a6, 0x00a7, 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x201c, 0x00b5, 0x00b6, 0x00b7, 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6, /* 0xc0 */ 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b, /* 0xd0 */ 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df, /* 0xe0 */ 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c, /* 0xf0 */ 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x2019, }; static int iso8859_13_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_13_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_13_page00[224] = { 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0x00, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0xc4, 0xc5, 0xaf, 0x00, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0xd3, 0x00, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xa8, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe5, 0xbf, 0x00, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0xf3, 0x00, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xb8, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0xc2, 0xe2, 0x00, 0x00, 0xc0, 0xe0, 0xc3, 0xe3, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0xc7, 0xe7, 0x00, 0x00, 0xcb, 0xeb, /* 0x10-0x17 */ 0xc6, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0xce, 0xee, 0x00, 0x00, 0xc1, 0xe1, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcd, 0xed, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0xcf, 0xef, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0xd9, 0xf9, 0xd1, 0xf1, 0xd2, 0xf2, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0xd4, 0xf4, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xba, /* 0x50-0x57 */ 0x00, 0x00, 0xda, 0xfa, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0xdb, 0xfb, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0xd8, 0xf8, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0xca, 0xea, 0xdd, 0xfd, 0xde, 0xfe, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_13_page20[8] = { 0x00, 0xff, 0x00, 0x00, 0xb4, 0xa1, 0xa5, 0x00, /* 0x18-0x1f */ }; static int iso8859_13_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = iso8859_13_page00[wc-0x00a0]; else if (wc >= 0x2018 && wc < 0x2020) c = iso8859_13_page20[wc-0x2018]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/iso8859_14.h000066400000000000000000000124061252300335000245350ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-14 */ static const unsigned short iso8859_14_2uni[96] = { /* 0xa0 */ 0x00a0, 0x1e02, 0x1e03, 0x00a3, 0x010a, 0x010b, 0x1e0a, 0x00a7, 0x1e80, 0x00a9, 0x1e82, 0x1e0b, 0x1ef2, 0x00ad, 0x00ae, 0x0178, /* 0xb0 */ 0x1e1e, 0x1e1f, 0x0120, 0x0121, 0x1e40, 0x1e41, 0x00b6, 0x1e56, 0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61, /* 0xc0 */ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, /* 0xd0 */ 0x0174, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x1e6a, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x0176, 0x00df, /* 0xe0 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0x0175, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x1e6b, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x0177, 0x00ff, }; static int iso8859_14_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0xa0) *pwc = (ucs4_t) iso8859_14_2uni[c-0xa0]; else *pwc = (ucs4_t) c; return 1; } static const unsigned char iso8859_14_page00[96] = { 0xa0, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0x00, 0xa9, 0x00, 0x00, 0x00, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb6, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xc0-0xc7 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0x00, /* 0xd0-0xd7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0x00, /* 0xf0-0xf7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0x00, 0xff, /* 0xf8-0xff */ }; static const unsigned char iso8859_14_page01_0[32] = { 0x00, 0x00, 0xa4, 0xa5, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0xb2, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char iso8859_14_page01_1[16] = { 0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, 0xde, 0xfe, /* 0x70-0x77 */ 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_14_page1e_0[136] = { 0x00, 0x00, 0xa1, 0xa2, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0xa6, 0xab, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xb1, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0xb4, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xb9, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xbb, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0xd7, 0xf7, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xa8, 0xb8, 0xaa, 0xba, 0xbd, 0xbe, 0x00, 0x00, /* 0x80-0x87 */ }; static const unsigned char iso8859_14_page1e_1[8] = { 0x00, 0x00, 0xac, 0xbc, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ }; static int iso8859_14_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = iso8859_14_page00[wc-0x00a0]; else if (wc >= 0x0108 && wc < 0x0128) c = iso8859_14_page01_0[wc-0x0108]; else if (wc >= 0x0170 && wc < 0x0180) c = iso8859_14_page01_1[wc-0x0170]; else if (wc >= 0x1e00 && wc < 0x1e88) c = iso8859_14_page1e_0[wc-0x1e00]; else if (wc >= 0x1ef0 && wc < 0x1ef8) c = iso8859_14_page1e_1[wc-0x1ef0]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/iso8859_15.h000066400000000000000000000053231252300335000245360ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-15 */ static const unsigned short iso8859_15_2uni[32] = { /* 0xa0 */ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7, 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7, 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf, }; static int iso8859_15_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0xa0 && c < 0xc0) *pwc = (ucs4_t) iso8859_15_2uni[c-0xa0]; else *pwc = (ucs4_t) c; return 1; } static const unsigned char iso8859_15_page00[32] = { 0xa0, 0xa1, 0xa2, 0xa3, 0x00, 0xa5, 0x00, 0xa7, /* 0xa0-0xa7 */ 0x00, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0xb9, 0xba, 0xbb, 0x00, 0x00, 0x00, 0xbf, /* 0xb8-0xbf */ }; static const unsigned char iso8859_15_page01[48] = { 0x00, 0x00, 0xbc, 0xbd, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xa6, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0xbe, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xb8, 0x00, /* 0x78-0x7f */ }; static int iso8859_15_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = iso8859_15_page00[wc-0x00a0]; else if (wc >= 0x00c0 && wc < 0x0100) c = wc; else if (wc >= 0x0150 && wc < 0x0180) c = iso8859_15_page01[wc-0x0150]; else if (wc == 0x20ac) c = 0xa4; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/iso8859_16.h000066400000000000000000000112221252300335000245320ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-16 */ static const unsigned short iso8859_16_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0104, 0x0105, 0x0141, 0x20ac, 0x201e, 0x0160, 0x00a7, 0x0161, 0x00a9, 0x0218, 0x00ab, 0x0179, 0x00ad, 0x017a, 0x017b, /* 0xb0 */ 0x00b0, 0x00b1, 0x010c, 0x0142, 0x017d, 0x201d, 0x00b6, 0x00b7, 0x017e, 0x010d, 0x0219, 0x00bb, 0x0152, 0x0153, 0x0178, 0x017c, /* 0xc0 */ 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0106, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, /* 0xd0 */ 0x0110, 0x0143, 0x00d2, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x015a, 0x0170, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0118, 0x021a, 0x00df, /* 0xe0 */ 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x0107, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0x0111, 0x0144, 0x00f2, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x015b, 0x0171, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0119, 0x021b, 0x00ff, }; static int iso8859_16_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_16_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_16_page00[224] = { 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0x00, 0xa9, 0x00, 0xab, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0x00, 0x00, 0x00, 0x00, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0xc0, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0xc6, 0xc7, /* 0xc0-0xc7 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ 0x00, 0x00, 0xd2, 0xd3, 0xd4, 0x00, 0xd6, 0x00, /* 0xd0-0xd7 */ 0x00, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0xe6, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0x00, 0xf2, 0xf3, 0xf4, 0x00, 0xf6, 0x00, /* 0xf0-0xf7 */ 0x00, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */ /* 0x0100 */ 0x00, 0x00, 0xc3, 0xe3, 0xa1, 0xa2, 0xc5, 0xe5, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xb2, 0xb9, 0x00, 0x00, /* 0x08-0x0f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xdd, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0xa3, 0xb3, 0xd1, 0xf1, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xd5, 0xf5, 0xbc, 0xbd, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0xd7, 0xf7, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xa6, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0xd8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0xbe, 0xac, 0xae, 0xaf, 0xbf, 0xb4, 0xb8, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_16_page02[8] = { 0xaa, 0xba, 0xde, 0xfe, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ }; static const unsigned char iso8859_16_page20[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xa5, 0x00, /* 0x18-0x1f */ }; static int iso8859_16_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = iso8859_16_page00[wc-0x00a0]; else if (wc >= 0x0218 && wc < 0x0220) c = iso8859_16_page02[wc-0x0218]; else if (wc >= 0x2018 && wc < 0x2020) c = iso8859_16_page20[wc-0x2018]; else if (wc == 0x20ac) c = 0xa4; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/iso8859_2.h000066400000000000000000000111421252300335000244460ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-2 */ static const unsigned short iso8859_2_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7, 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b, /* 0xb0 */ 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7, 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, /* 0xc0 */ 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, /* 0xd0 */ 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, /* 0xe0 */ 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, /* 0xf0 */ 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9, }; static int iso8859_2_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_2_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_2_page00[224] = { 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ 0xb0, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0x00, 0xc7, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0x00, 0x00, 0xda, 0x00, 0xdc, 0xdd, 0x00, 0xdf, /* 0xd8-0xdf */ 0x00, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0x00, 0xe7, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0x00, 0x00, 0xfa, 0x00, 0xfc, 0xfd, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0x00, 0x00, 0xc3, 0xe3, 0xa1, 0xb1, 0xc6, 0xe6, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0xcf, 0xef, /* 0x08-0x0f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xca, 0xea, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0xc5, 0xe5, 0x00, 0x00, 0xa5, 0xb5, 0x00, /* 0x38-0x3f */ 0x00, 0xa3, 0xb3, 0xd1, 0xf1, 0x00, 0x00, 0xd2, /* 0x40-0x47 */ 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xd5, 0xf5, 0x00, 0x00, 0xc0, 0xe0, 0x00, 0x00, /* 0x50-0x57 */ 0xd8, 0xf8, 0xa6, 0xb6, 0x00, 0x00, 0xaa, 0xba, /* 0x58-0x5f */ 0xa9, 0xb9, 0xde, 0xfe, 0xab, 0xbb, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd9, 0xf9, /* 0x68-0x6f */ 0xdb, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0xac, 0xbc, 0xaf, 0xbf, 0xae, 0xbe, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_2_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0xa2, 0xff, 0x00, 0xb2, 0x00, 0xbd, 0x00, 0x00, /* 0xd8-0xdf */ }; static int iso8859_2_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = iso8859_2_page00[wc-0x00a0]; else if (wc >= 0x02c0 && wc < 0x02e0) c = iso8859_2_page02[wc-0x02c0]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/iso8859_3.h000066400000000000000000000110741252300335000244530ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-3 */ static const unsigned short iso8859_3_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0126, 0x02d8, 0x00a3, 0x00a4, 0xfffd, 0x0124, 0x00a7, 0x00a8, 0x0130, 0x015e, 0x011e, 0x0134, 0x00ad, 0xfffd, 0x017b, /* 0xb0 */ 0x00b0, 0x0127, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x0125, 0x00b7, 0x00b8, 0x0131, 0x015f, 0x011f, 0x0135, 0x00bd, 0xfffd, 0x017c, /* 0xc0 */ 0x00c0, 0x00c1, 0x00c2, 0xfffd, 0x00c4, 0x010a, 0x0108, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, /* 0xd0 */ 0xfffd, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0120, 0x00d6, 0x00d7, 0x011c, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x016c, 0x015c, 0x00df, /* 0xe0 */ 0x00e0, 0x00e1, 0x00e2, 0xfffd, 0x00e4, 0x010b, 0x0109, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0xfffd, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x0121, 0x00f6, 0x00f7, 0x011d, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x016d, 0x015d, 0x02d9, }; static int iso8859_3_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = iso8859_3_2uni[c-0xa0]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char iso8859_3_page00[96] = { 0xa0, 0x00, 0x00, 0xa3, 0xa4, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ 0xb0, 0x00, 0xb2, 0xb3, 0xb4, 0xb5, 0x00, 0xb7, /* 0xb0-0xb7 */ 0xb8, 0x00, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00, /* 0xb8-0xbf */ 0xc0, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0x00, 0xc7, /* 0xc0-0xc7 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0x00, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0x00, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0x00, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ }; static const unsigned char iso8859_3_page01[120] = { 0xc6, 0xe6, 0xc5, 0xe5, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xf8, 0xab, 0xbb, /* 0x18-0x1f */ 0xd5, 0xf5, 0x00, 0x00, 0xa6, 0xb6, 0xa1, 0xb1, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0xa9, 0xb9, 0x00, 0x00, 0xac, 0xbc, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0xde, 0xfe, 0xaa, 0xba, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0xdd, 0xfd, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0xaf, 0xbf, 0x00, 0x00, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_3_page02[8] = { 0xa2, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static int iso8859_3_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = iso8859_3_page00[wc-0x00a0]; else if (wc >= 0x0108 && wc < 0x0180) c = iso8859_3_page01[wc-0x0108]; else if (wc >= 0x02d8 && wc < 0x02e0) c = iso8859_3_page02[wc-0x02d8]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/iso8859_4.h000066400000000000000000000111421252300335000244500ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-4 */ static const unsigned short iso8859_4_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7, 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af, /* 0xb0 */ 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7, 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b, /* 0xc0 */ 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a, /* 0xd0 */ 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df, /* 0xe0 */ 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b, /* 0xf0 */ 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9, }; static int iso8859_4_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_4_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_4_page00[224] = { 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0xaf, /* 0xa8-0xaf */ 0xb0, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0x00, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xd8, 0x00, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0x00, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0x00, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xf8, 0x00, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0xc0, 0xe0, 0x00, 0x00, 0xa1, 0xb1, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */ 0xd0, 0xf0, 0xaa, 0xba, 0x00, 0x00, 0xcc, 0xec, /* 0x10-0x17 */ 0xca, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0xab, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0xa5, 0xb5, 0xcf, 0xef, 0x00, 0x00, 0xc7, 0xe7, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0xf3, /* 0x30-0x37 */ 0xa2, 0x00, 0x00, 0xa6, 0xb6, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf1, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0xbd, 0xbf, 0xd2, 0xf2, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0xb3, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xa9, 0xb9, 0x00, 0x00, 0x00, 0x00, 0xac, 0xbc, /* 0x60-0x67 */ 0xdd, 0xfd, 0xde, 0xfe, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0xd9, 0xf9, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0xbe, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_4_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0xff, 0x00, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static int iso8859_4_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = iso8859_4_page00[wc-0x00a0]; else if (wc >= 0x02c0 && wc < 0x02e0) c = iso8859_4_page02[wc-0x02c0]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/iso8859_5.h000066400000000000000000000067251252300335000244640ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-5 */ static const unsigned short iso8859_5_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f, /* 0xb0 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, /* 0xc0 */ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, /* 0xd0 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, /* 0xe0 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, /* 0xf0 */ 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f, }; static int iso8859_5_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_5_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_5_page00[16] = { 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ }; static const unsigned char iso8859_5_page04[96] = { 0x00, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x00-0x07 */ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0x00, 0xae, 0xaf, /* 0x08-0x0f */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x10-0x17 */ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0x18-0x1f */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0x38-0x3f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x50-0x57 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0xfe, 0xff, /* 0x58-0x5f */ }; static int iso8859_5_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00b0) c = iso8859_5_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0460) c = iso8859_5_page04[wc-0x0400]; else if (wc == 0x2116) c = 0xf0; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/iso8859_6.h000066400000000000000000000066301252300335000244600ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-6 */ static const unsigned short iso8859_6_2uni[96] = { /* 0xa0 */ 0x00a0, 0xfffd, 0xfffd, 0xfffd, 0x00a4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x060c, 0x00ad, 0xfffd, 0xfffd, /* 0xb0 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x061b, 0xfffd, 0xfffd, 0xfffd, 0x061f, /* 0xc0 */ 0xfffd, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, /* 0xd0 */ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0x0638, 0x0639, 0x063a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xe0 */ 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, /* 0xf0 */ 0x0650, 0x0651, 0x0652, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, }; static int iso8859_6_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = iso8859_6_2uni[c-0xa0]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char iso8859_6_page00[16] = { 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ }; static const unsigned char iso8859_6_page06[80] = { 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xbf, /* 0x18-0x1f */ 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */ 0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ 0xf0, 0xf1, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ }; static int iso8859_6_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00b0) c = iso8859_6_page00[wc-0x00a0]; else if (wc >= 0x0608 && wc < 0x0658) c = iso8859_6_page06[wc-0x0608]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/iso8859_7.h000066400000000000000000000076641252300335000244710ustar00rootroot00000000000000/* * Copyright (C) 1999-2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-7 */ static const unsigned short iso8859_7_2uni[96] = { /* 0xa0 */ 0x00a0, 0x2018, 0x2019, 0x00a3, 0x20ac, 0x20af, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x037a, 0x00ab, 0x00ac, 0x00ad, 0xfffd, 0x2015, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7, 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, /* 0xc0 */ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, /* 0xd0 */ 0x03a0, 0x03a1, 0xfffd, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, /* 0xe0 */ 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, /* 0xf0 */ 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0xfffd, }; static int iso8859_7_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = iso8859_7_2uni[c-0xa0]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char iso8859_7_page00[32] = { 0xa0, 0x00, 0x00, 0xa3, 0x00, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0x00, 0x00, 0xb7, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0xbd, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char iso8859_7_page03[88] = { 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0xb5, 0xb6, 0x00, /* 0x80-0x87 */ 0xb8, 0xb9, 0xba, 0x00, 0xbc, 0x00, 0xbe, 0xbf, /* 0x88-0x8f */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x90-0x97 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x98-0x9f */ 0xd0, 0xd1, 0x00, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xa0-0xa7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0xa8-0xaf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xb0-0xb7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xb8-0xbf */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xc0-0xc7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00, /* 0xc8-0xcf */ }; static const unsigned char iso8859_7_page20[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, /* 0x10-0x17 */ 0xa1, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ }; static int iso8859_7_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = iso8859_7_page00[wc-0x00a0]; else if (wc >= 0x0378 && wc < 0x03d0) c = iso8859_7_page03[wc-0x0378]; else if (wc >= 0x2010 && wc < 0x2020) c = iso8859_7_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0xa4; else if (wc == 0x20af) c = 0xa5; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/iso8859_8.h000066400000000000000000000075471252300335000244720ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-8 */ static const unsigned short iso8859_8_2uni[96] = { /* 0xa0 */ 0x00a0, 0xfffd, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0xfffd, /* 0xc0 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xd0 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2017, /* 0xe0 */ 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, /* 0xf0 */ 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0xfffd, 0xfffd, 0x200e, 0x200f, 0xfffd, }; static int iso8859_8_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0xa0) { unsigned short wc = iso8859_8_2uni[c-0xa0]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } else { *pwc = (ucs4_t) c; return 1; } return RET_ILSEQ; } static const unsigned char iso8859_8_page00[88] = { 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0xb8, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, /* 0xf0-0xf7 */ }; static const unsigned char iso8859_8_page05[32] = { 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xd0-0xd7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xd8-0xdf */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xe0-0xe7 */ 0xf8, 0xf9, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ }; static const unsigned char iso8859_8_page20[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xfe, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, /* 0x10-0x17 */ }; static int iso8859_8_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00f8) c = iso8859_8_page00[wc-0x00a0]; else if (wc >= 0x05d0 && wc < 0x05f0) c = iso8859_8_page05[wc-0x05d0]; else if (wc >= 0x2008 && wc < 0x2018) c = iso8859_8_page20[wc-0x2008]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/iso8859_9.h000066400000000000000000000060761252300335000244670ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-9 */ static const unsigned short iso8859_9_2uni[48] = { /* 0xd0 */ 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, /* 0xe0 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff, }; static int iso8859_9_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0xd0) *pwc = (ucs4_t) iso8859_9_2uni[c-0xd0]; else *pwc = (ucs4_t) c; return 1; } static const unsigned char iso8859_9_page00[48] = { 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */ }; static const unsigned char iso8859_9_page01[72] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0xdd, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xfe, /* 0x58-0x5f */ }; static int iso8859_9_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00d0) { *r = wc; return 1; } else if (wc >= 0x00d0 && wc < 0x0100) c = iso8859_9_page00[wc-0x00d0]; else if (wc >= 0x0118 && wc < 0x0160) c = iso8859_9_page01[wc-0x0118]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/isoir165.h000066400000000000000000000131351252300335000244620ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2005 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-IR-165 */ /* * ISO-IR-165 is an extension of GB 2312, consisting of: * 1. GB 6345.1-86 corrections: * Two corrections to GB 2312, at 0x2367 and 0x6F71. * 2. GB 6345.1-86 additions: * - 6 new full-width pinyin characters in row 0x28. * - ISO646-CN in row 0x2A. * - 32 half-width pinyin characters in row 0x2B. * 3. GB 8565.2-88 additions: * - 50 characters in row 0x2D. * - 92 characters in row 0x2E. * - 93 characters in row 0x2F. * - 470 characters in rows 0x7A-0x7E. * 4. ISO-IR-165 additions: * - 22 characters in row 0x26. * - 94 characters in row 0x2C. * - 44 new characters in row 0x2D. * - 1 new character in row 0x2F. * * The conversion table was created from the following sources: * Ad 1. The 0x2367 correction is already integrated in the unicode.org * GB2312.TXT table. The 0x6F71 mapping is the same in the unicode.org * GB2312.TXT and UNIHAN.TXT table and in Koichi Yasuoka's Uni2GB table, * so we assume it's correct. * The unicode.org UNIHAN.TXT table about GB 8565 is not usable: it has * extraneous code points at rows 0x28, 0x2C, 0x2D. Note also that it does * not list the 69 non-hanzi in row 0x2F. Moreover, it has the characters * 0x2F7A-0x2F7D shifted down by one to 0x2F79-0x2F7C. * Therefore we take the GB8565 and ISO-IR-165 data from Koichi Yasuoka's * Uni2GB table. * Ad 1. Yasuoka maps 0x2367 to U+0261 (small script g) and 0x2840 to U+FF47 * (full-width small normal g). While coherent with ISO-IR's 165.pdf, * this disagrees with Ken Lunde's book: He says that ISO-IR-165 * includes the GB6345 correction, i.e. maps 0x2367 to U+FF47 or U+0067 * and _not_ to U+0261 (small script g). * To overcome the confusion, we just map both 0x2367 and 0x2840 to * U+FF47. * Ad 2. Row 0x28: Add a mapping from 0x283F to U+01F9. * Row 0x2A: Mapping is well-known, also present in Koichi Yasuoka's * table. * Row 0x2B: Typed in by hand from appendix E in Ken Lunde's book. * When converting from Unicode to ISO-IR-165, prefer the half-width * range 0x2B{21..40} to the full-width range 0x28{21..40}. * Ad 3. Rows 0x2D, 0x2E: Both Koichi Yasuoka's Uni2GB table and the UNIHAN.TXT * data for GB 8565 agree here. * Row 0x2F: Taken from Koichi Yasuoka's Uni2GB table. * Rows 0x7A-0x7E: Koichi Yasuoka's Uni2GB table and the UNIHAN.TXT * data for GB 8565 agree here mostly. Differences: * 0x7C38 -> U+6F26 or U+527A ? We choose U+6F26. * 0x7C5A -> U+7A40 or U+6996 ? We choose U+6996. * Ad 4. Row 0x26: Mapping unknown. * Rows 0x2C, 0x2D: Both Koichi Yasuoka's Uni2GB table and the UNIHAN.TXT * data for GB 8565 (!) agree here. * Row 0x2F: Taken from Koichi Yasuoka's Uni2GB table. */ #include "isoir165ext.h" static int isoir165_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { int ret; /* Map full-width pinyin (row 0x28) like half-width pinyin (row 0x2B). */ if (s[0] == 0x28) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x21 && c2 <= 0x40) { unsigned char buf[2]; buf[0] = 0x2b; buf[1] = c2; ret = isoir165ext_mbtowc(conv,pwc,buf,2); if (ret != RET_ILSEQ) return ret; } } } /* Try the GB2312 -> Unicode table. */ ret = gb2312_mbtowc(conv,pwc,s,n); if (ret != RET_ILSEQ) return ret; /* Row 0x2A is GB_1988-80. */ if (s[0] == 0x2a) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x21 && c2 < 0x7f) { int ret = iso646_cn_mbtowc(conv,pwc,s+1,1); if (ret != 1) abort(); return 2; } return RET_ILSEQ; } return RET_TOOFEW(0); } /* Try the ISO-IR-165 extensions -> Unicode table. */ ret = isoir165ext_mbtowc(conv,pwc,s,n); return ret; } static int isoir165_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; /* Try the Unicode -> GB2312 table. */ ret = gb2312_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (!(buf[0] == 0x28 && buf[1] >= 0x21 && buf[1] <= 0x40)) { if (n >= 2) { r[0] = buf[0]; r[1] = buf[1]; return 2; } return RET_TOOSMALL; } } /* Row 0x2A is GB_1988-80. */ ret = iso646_cn_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { if (ret != 1) abort(); if (buf[0] >= 0x21 && buf[0] < 0x7f) { if (n >= 2) { r[0] = 0x2a; r[1] = buf[0]; return 2; } return RET_TOOSMALL; } } /* Try the Unicode -> ISO-IR-165 extensions table. */ ret = isoir165ext_wctomb(conv,r,wc,n); return ret; } freelan-2.0/third-party/source/libiconv-msvc/include/isoir165ext.h000066400000000000000000001320451252300335000252050ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-IR-165 extensions */ static const unsigned short isoir165ext_2uni_page2b[470] = { /* 0x2b */ 0x1fb1, 0x03ac, 0x1fb0, 0x1f70, 0x0113, 0x00e9, 0x011b, 0x00e8, 0x012b, 0x00ed, 0x01d0, 0x00ec, 0x014d, 0x00f3, 0x01d2, 0x00f2, 0x016b, 0x00fa, 0x01d4, 0x00f9, 0x01d6, 0x01d8, 0x01da, 0x01dc, 0x00fc, 0x00ea, 0x03b1, 0x1e3f, 0x0144, 0x0148, 0x01f9, 0xff47, 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, 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, /* 0x2c */ 0x53be, 0x4eb8, 0x4f3e, 0x501e, 0x50c7, 0x9118, 0x6c98, 0x6cdc, 0x6cc3, 0x6e5d, 0x6ea6, 0x6eeb, 0x6fa5, 0x6165, 0x5ea4, 0x9618, 0x5848, 0x8453, 0x7cf5, 0x5f07, 0x6294, 0x647d, 0x725a, 0x5574, 0x55a4, 0x5640, 0x5684, 0x5d1f, 0x72c9, 0x998c, 0x59de, 0x59fd, 0x5a5e, 0x7ebb, 0x7ee4, 0x7ef9, 0x9a99, 0x71cf, 0x6245, 0x624a, 0x797c, 0x739a, 0x742b, 0x7488, 0x74aa, 0x74d8, 0x6767, 0x6ab5, 0x71ca, 0x6ba3, 0x8f80, 0x8f92, 0x8d5f, 0x9b36, 0x72a8, 0x87a3, 0x8152, 0x6b38, 0x98d0, 0x8897, 0x88af, 0x8955, 0x770a, 0x94da, 0x955a, 0x9560, 0x9e24, 0x9e40, 0x9e50, 0x9e5d, 0x9e60, 0x870e, 0x7b5c, 0x7fd9, 0x7fef, 0x7e44, 0x8e45, 0x8e36, 0x8e62, 0x8e5c, 0x9778, 0x9b46, 0x9f2b, 0x9f41, 0x7526, 0x4e26, 0x8bac, 0x8129, 0x5091, 0x50cd, 0x52b9, 0x89d4, 0x5557, 0x94c7, /* 0x2d */ 0x9496, 0x9498, 0x94cf, 0x94d3, 0x94d4, 0x94e6, 0x9533, 0x951c, 0x9520, 0x9527, 0x953d, 0x9543, 0x956e, 0x9574, 0x9c80, 0x9c84, 0x9c8a, 0x9c93, 0x9c96, 0x9c97, 0x9c98, 0x9c99, 0x9cbf, 0x9cc0, 0x9cc1, 0x9cd2, 0x9cdb, 0x9ce0, 0x9ce3, 0x9770, 0x977a, 0x97a1, 0x97ae, 0x97a8, 0x9964, 0x9966, 0x9978, 0x9979, 0x997b, 0x997e, 0x9982, 0x9983, 0x998e, 0x9b10, 0x9b18, 0x65a2, 0x9e80, 0x911c, 0x9e91, 0x9f12, 0x52f3, 0x6c96, 0x6d44, 0x6e1b, 0x6e67, 0x6f82, 0x6fec, 0x60ae, 0x5ec8, 0x8ffa, 0x577f, 0x5586, 0x849e, 0x8460, 0x5c05, 0x5e0b, 0x5d11, 0x5d19, 0x5dd6, 0x59b3, 0x5aae, 0x9a94, 0x658f, 0x709e, 0x7551, 0x71ff, 0x691d, 0x6a11, 0x68bf, 0x6607, 0x668e, 0x6673, 0x6c25, 0x7652, 0x778b, 0x76ea, 0x9895, 0x8780, 0x882d, 0x7b87, 0x7c50, 0x8ead, 0x9575, 0x65c2, /* 0x2e */ 0x5390, 0x79b8, 0x4f15, 0x4f21, 0x4f3b, 0x4fa2, 0x50a4, 0x5092, 0x530a, 0x51c3, 0x51a8, 0x8d20, 0x5787, 0x579a, 0x5795, 0x57eb, 0x585d, 0x585a, 0x5871, 0x5895, 0x5c30, 0x5f0c, 0x5f0d, 0x5f0e, 0x5c72, 0x5cc7, 0x5fac, 0x5f68, 0x5f5f, 0x5a12, 0x5a65, 0x5a84, 0x5ac4, 0x7394, 0x73ea, 0x73ee, 0x7437, 0x7415, 0x7454, 0x6799, 0x686c, 0x68f8, 0x69fe, 0x72e2, 0x6667, 0x8d52, 0x89c3, 0x89cd, 0x6427, 0x6477, 0x6c1d, 0x813f, 0x6b54, 0x98d6, 0x707a, 0x70f1, 0x7120, 0x6153, 0x6c87, 0x6dad, 0x6e81, 0x6eb5, 0x6f94, 0x6f9b, 0x793d, 0x794e, 0x7806, 0x7859, 0x7894, 0x78dc, 0x7903, 0x7a16, 0x7a5e, 0x75e0, 0x7adc, 0x7676, 0x9892, 0x7bf2, 0x7c30, 0x7c5d, 0x9c9d, 0x7cac, 0x8278, 0x83d1, 0x84ea, 0x7fc0, 0x7f1e, 0x8e21, 0x8e53, 0x9754, 0x9f0c, 0x94fb, 0xfffd, 0xfffd, /* 0x2f */ 0x32c0, 0x32c1, 0x32c2, 0x32c3, 0x32c4, 0x32c5, 0x32c6, 0x32c7, 0x32c8, 0x32c9, 0x32ca, 0x32cb, 0x33e0, 0x33e1, 0x33e2, 0x33e3, 0x33e4, 0x33e5, 0x33e6, 0x33e7, 0x33e8, 0x33e9, 0x33ea, 0x33eb, 0x33ec, 0x33ed, 0x33ee, 0x33ef, 0x33f0, 0x33f1, 0x33f2, 0x33f3, 0x33f4, 0x33f5, 0x33f6, 0x33f7, 0x33f8, 0x33f9, 0x33fa, 0x33fb, 0x33fc, 0x33fd, 0x33fe, 0x3358, 0x3359, 0x335a, 0x335b, 0x335c, 0x335d, 0x335e, 0x335f, 0x3360, 0x3361, 0x3362, 0x3363, 0x3364, 0x3365, 0x3366, 0x3367, 0x3368, 0x3369, 0x336a, 0x336b, 0x336c, 0x336d, 0x336e, 0x336f, 0x3370, 0x3037, 0x90a8, 0x965e, 0x5842, 0x5803, 0x6c3e, 0x6d29, 0x6ee7, 0x8534, 0x84c6, 0x633c, 0x5d05, 0x7f10, 0x7eec, 0x7287, 0x712e, 0x8218, 0x8216, 0x756c, 0x75f3, 0x9b25, 0x8980, 0x7ca6, 0x4e85, 0x5570, 0x91c6, }; static const unsigned short isoir165ext_2uni_page7a[470] = { /* 0x7a */ 0x4e0f, 0x673f, 0x4e42, 0x752a, 0x592c, 0x9ee1, 0x8652, 0x531c, 0x5187, 0x518f, 0x50f0, 0x4f0b, 0x4f23, 0x4f03, 0x4f61, 0x4f7a, 0x4f6b, 0x4feb, 0x4ff5, 0x5034, 0x5022, 0x4ff6, 0x5072, 0x4eb6, 0x51ae, 0x5910, 0x6bda, 0x522c, 0x5232, 0x4fb4, 0x5298, 0x52bb, 0x52bc, 0x52cd, 0x52da, 0x52f7, 0x53c6, 0x53c7, 0x5770, 0x576c, 0x57b1, 0x579f, 0x579e, 0x57be, 0x57cc, 0x580e, 0x580c, 0x57f5, 0x5809, 0x583c, 0x5843, 0x5845, 0x5846, 0x583d, 0x5853, 0x5888, 0x5884, 0x58f8, 0x56ad, 0x5940, 0x5953, 0x596d, 0x5c2a, 0x54a5, 0x551d, 0x5536, 0x556f, 0x554d, 0x569a, 0x569c, 0x56f7, 0x5710, 0x5719, 0x5e17, 0x5e21, 0x5e28, 0x5e6a, 0x5c74, 0x5c7c, 0x5ca8, 0x5c9e, 0x5cc3, 0x5cd3, 0x5ce3, 0x5ce7, 0x5cff, 0x5d04, 0x5d00, 0x5d1a, 0x5d0c, 0x5d4e, 0x5d5a, 0x5d85, 0x5d93, /* 0x7b */ 0x5d92, 0x5dc2, 0x5dc9, 0x8852, 0x5faf, 0x5906, 0x65a8, 0x7241, 0x7242, 0x5ebc, 0x5ecb, 0x95ec, 0x95ff, 0x8a1a, 0x9607, 0x9613, 0x961b, 0x5bac, 0x5ba7, 0x5c5d, 0x5f22, 0x59ee, 0x5a7c, 0x5a96, 0x5a73, 0x5a9e, 0x5aad, 0x5ada, 0x5aea, 0x5b1b, 0x5b56, 0x9a72, 0x9a83, 0x9a89, 0x9a8d, 0x9a8e, 0x9a95, 0x9aa6, 0x7395, 0x7399, 0x73a0, 0x73b1, 0x73a5, 0x73a6, 0x73d6, 0x73f0, 0x73fd, 0x73e3, 0x7424, 0x740e, 0x7407, 0x73f6, 0x73fa, 0x7432, 0x742f, 0x7444, 0x7442, 0x7471, 0x7478, 0x7462, 0x7486, 0x749f, 0x74a0, 0x7498, 0x74b2, 0x97e8, 0x6745, 0x679f, 0x677b, 0x67c8, 0x67ee, 0x684b, 0x68a0, 0x6812, 0x681f, 0x686a, 0x68bc, 0x68fb, 0x686f, 0x68b1, 0x68c1, 0x68eb, 0x6913, 0x68d1, 0x6911, 0x68d3, 0x68ec, 0x692b, 0x68e8, 0x69be, 0x6969, 0x6940, 0x696f, 0x695f, /* 0x7c */ 0x6962, 0x6935, 0x6959, 0x69bc, 0x69c5, 0x69da, 0x69dc, 0x6a0b, 0x69e5, 0x6a66, 0x6a96, 0x6ab4, 0x72dd, 0x5cf1, 0x7314, 0x733a, 0x6b95, 0x5f67, 0x80fe, 0x74fb, 0x7503, 0x655c, 0x6569, 0x6f26, 0x65f8, 0x65fb, 0x6609, 0x663d, 0x6662, 0x665e, 0x666c, 0x668d, 0x668b, 0x8d51, 0x8d57, 0x7263, 0x7277, 0x63b1, 0x6261, 0x6260, 0x6283, 0x62e4, 0x62c3, 0x631c, 0x6326, 0x63af, 0x63fe, 0x6422, 0x6412, 0x64ed, 0x6713, 0x6718, 0x8158, 0x81d1, 0x98cf, 0x98d4, 0x98d7, 0x6996, 0x7098, 0x70dc, 0x70fa, 0x710c, 0x711c, 0x71cb, 0x721f, 0x70dd, 0x659d, 0x6246, 0x6017, 0x60c7, 0x60d3, 0x60b0, 0x60d9, 0x6114, 0x6c3f, 0x6c67, 0x6c84, 0x6c9a, 0x6c6d, 0x6ca8, 0x6cc6, 0x6cb5, 0x6d49, 0x6d38, 0x6d11, 0x6d3a, 0x6d28, 0x6d50, 0x6d34, 0x6d55, 0x6d61, 0x6da2, 0x6d65, 0x6d5b, /* 0x7d */ 0x6d64, 0x6db4, 0x6e9a, 0x6e5c, 0x6e72, 0x6ea0, 0x6e87, 0x6e8e, 0x6ec9, 0x6ec3, 0x6f37, 0x6ed8, 0x6eea, 0x6f56, 0x6f75, 0x6f5f, 0x6fb4, 0x6fbc, 0x7014, 0x700d, 0x700c, 0x703c, 0x7943, 0x7947, 0x794a, 0x7950, 0x7972, 0x7998, 0x79a0, 0x79a4, 0x77fc, 0x77fb, 0x7822, 0x7820, 0x7841, 0x785a, 0x7875, 0x78b6, 0x78e1, 0x7933, 0x8a5f, 0x76fb, 0x771b, 0x772c, 0x7786, 0x77ab, 0x77ad, 0x7564, 0x756f, 0x6983, 0x7f7d, 0x76dd, 0x76e6, 0x76ec, 0x7521, 0x79fe, 0x7a44, 0x767f, 0x769e, 0x9e27, 0x9e2e, 0x9e30, 0x9e34, 0x9e4d, 0x9e52, 0x9e53, 0x9e54, 0x9e56, 0x9e59, 0x9e61, 0x9e62, 0x9e65, 0x9e6f, 0x9e74, 0x75a2, 0x7604, 0x7608, 0x761d, 0x7ad1, 0x7a85, 0x7a8e, 0x7aa3, 0x7ab8, 0x7abe, 0x77de, 0x8030, 0x988b, 0x988e, 0x9899, 0x98a3, 0x8683, 0x8705, 0x8758, 0x87cf, /* 0x7e */ 0x87e2, 0x880b, 0x80d4, 0x7f4d, 0x7b4a, 0x7b4e, 0x7b7f, 0x7b93, 0x7bef, 0x7c09, 0x7bf0, 0x7c15, 0x7c03, 0x7c20, 0x823a, 0x8886, 0x88aa, 0x88c0, 0x88c8, 0x8926, 0x8976, 0x7f91, 0x8283, 0x82bc, 0x82a7, 0x8313, 0x82fe, 0x8300, 0x835d, 0x8345, 0x8344, 0x831d, 0x83a6, 0x8399, 0x83fe, 0x841a, 0x83fc, 0x8429, 0x8439, 0x84a8, 0x84cf, 0x849f, 0x84c2, 0x84f7, 0x8570, 0x85b3, 0x85a2, 0x96d8, 0x85b8, 0x85e0, 0x7fda, 0x7eae, 0x7eb4, 0x7ebc, 0x7ed6, 0x7f0a, 0x5b43, 0x8d6a, 0x5245, 0x8c68, 0x8c6e, 0x8c6d, 0x8e16, 0x8e26, 0x8e27, 0x8e50, 0x9098, 0x90a0, 0x90bd, 0x90c8, 0x90c3, 0x90da, 0x90ff, 0x911a, 0x910c, 0x9120, 0x9142, 0x8fb5, 0x90e4, 0x8c86, 0x89f1, 0x8bb1, 0x8bbb, 0x8bc7, 0x8bea, 0x8c09, 0x8c1e, 0x9702, 0x68d0, 0x7306, 0x9f81, 0x9f82, 0x92c6, 0x9491, }; static int isoir165ext_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x2b && c1 <= 0x2f) || (c1 >= 0x7a && c1 <= 0x7e)) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x21 && c2 < 0x7f) { unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); unsigned short wc = 0xfffd; if (i < 8366) { if (i < 1410) wc = isoir165ext_2uni_page2b[i-940]; } else { if (i < 8836) wc = isoir165ext_2uni_page7a[i-8366]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short isoir165ext_2charset[876] = { 0x2b28, 0x2b26, 0x2b3a, 0x2b2c, 0x2b2a, 0x2b30, 0x2b2e, 0x2b34, 0x2b32, 0x2b39, 0x2b25, 0x2b27, 0x2b29, 0x2b3d, 0x2b3e, 0x2b2d, 0x2b31, 0x2b2b, 0x2b2f, 0x2b33, 0x2b35, 0x2b36, 0x2b37, 0x2b38, 0x2b3f, 0x2b22, 0x2b3b, 0x2b3c, 0x2b24, 0x2b23, 0x2b21, 0x2f65, 0x2f21, 0x2f22, 0x2f23, 0x2f24, 0x2f25, 0x2f26, 0x2f27, 0x2f28, 0x2f29, 0x2f2a, 0x2f2b, 0x2f2c, 0x2f4c, 0x2f4d, 0x2f4e, 0x2f4f, 0x2f50, 0x2f51, 0x2f52, 0x2f53, 0x2f54, 0x2f55, 0x2f56, 0x2f57, 0x2f58, 0x2f59, 0x2f5a, 0x2f5b, 0x2f5c, 0x2f5d, 0x2f5e, 0x2f5f, 0x2f60, 0x2f61, 0x2f62, 0x2f63, 0x2f64, 0x2f2d, 0x2f2e, 0x2f2f, 0x2f30, 0x2f31, 0x2f32, 0x2f33, 0x2f34, 0x2f35, 0x2f36, 0x2f37, 0x2f38, 0x2f39, 0x2f3a, 0x2f3b, 0x2f3c, 0x2f3d, 0x2f3e, 0x2f3f, 0x2f40, 0x2f41, 0x2f42, 0x2f43, 0x2f44, 0x2f45, 0x2f46, 0x2f47, 0x2f48, 0x2f49, 0x2f4a, 0x2f4b, 0x7a21, 0x2c76, 0x7a23, 0x2f7c, 0x7a38, 0x2c22, 0x7a2e, 0x7a2c, 0x2e23, 0x2e24, 0x7a2d, 0x2e25, 0x2c23, 0x7a2f, 0x7a31, 0x7a30, 0x2e26, 0x7a3e, 0x7a32, 0x7a33, 0x7a36, 0x2c24, 0x7a35, 0x7a34, 0x7a37, 0x2c79, 0x2e28, 0x2e27, 0x2c25, 0x2c7a, 0x7a2b, 0x7a29, 0x7a2a, 0x2e2b, 0x7a39, 0x2e2a, 0x7a3c, 0x7a3d, 0x7e5b, 0x7a3f, 0x2c7b, 0x7a40, 0x7a41, 0x7a42, 0x7a43, 0x2d53, 0x7a44, 0x2e29, 0x7a28, 0x2e21, 0x2c21, 0x7a45, 0x7a46, 0x7a60, 0x7a61, 0x7a62, 0x7a64, 0x2c7d, 0x7a63, 0x2f7d, 0x2c38, 0x2d5e, 0x2c39, 0x2c3a, 0x2c3b, 0x7a65, 0x7a66, 0x7a5b, 0x7a67, 0x7a68, 0x7a69, 0x7a48, 0x7a47, 0x2d5d, 0x2e2d, 0x2e2f, 0x2e2e, 0x7a4b, 0x7a4a, 0x7a49, 0x7a4c, 0x7a4d, 0x2e30, 0x7a50, 0x2f69, 0x7a51, 0x7a4f, 0x7a4e, 0x7a52, 0x7a56, 0x2f68, 0x7a53, 0x7a54, 0x7a55, 0x2c31, 0x7a57, 0x2e32, 0x2e31, 0x2e33, 0x7a59, 0x7a58, 0x2e34, 0x7a5a, 0x7b26, 0x7a3a, 0x7a25, 0x7a5c, 0x7a5d, 0x7a5e, 0x2d66, 0x2c3f, 0x7b36, 0x2c40, 0x2e3e, 0x2c41, 0x2e3f, 0x7b39, 0x7b37, 0x2e40, 0x7b38, 0x7b3a, 0x7b3b, 0x2d67, 0x2e41, 0x7b3c, 0x7b3d, 0x7b3e, 0x7e59, 0x7b3f, 0x7b33, 0x7b32, 0x2d61, 0x7a5f, 0x2e35, 0x7b34, 0x2e39, 0x7a6e, 0x7a6f, 0x7a71, 0x7a70, 0x7a72, 0x2e3a, 0x7a73, 0x7a74, 0x7a75, 0x7c2e, 0x7a76, 0x7a78, 0x7a77, 0x2f70, 0x7a7a, 0x2d63, 0x2d64, 0x7a79, 0x2c3c, 0x7a7b, 0x7a7c, 0x7a7d, 0x7b21, 0x7a7e, 0x7b22, 0x7b23, 0x2d65, 0x2d62, 0x7a6a, 0x7a6b, 0x7a6c, 0x7a6d, 0x2c2f, 0x7b2a, 0x2d5b, 0x7b2b, 0x2c34, 0x2e36, 0x2e37, 0x2e38, 0x7b35, 0x2e3d, 0x7c32, 0x2e3c, 0x2e3b, 0x7b25, 0x7c65, 0x2d5a, 0x7c68, 0x7c66, 0x7c67, 0x7c69, 0x7c6a, 0x2e5a, 0x2c2e, 0x2c47, 0x7c64, 0x2c48, 0x7c48, 0x7c47, 0x7c49, 0x2c35, 0x7c4b, 0x7c4a, 0x7c4c, 0x7c4d, 0x2f6f, 0x7c4e, 0x7c46, 0x7c4f, 0x7c51, 0x7c50, 0x2e51, 0x2e52, 0x2c36, 0x7c52, 0x7c36, 0x7c37, 0x2d69, 0x7c63, 0x2d4e, 0x7b27, 0x2d7e, 0x7c39, 0x7c3a, 0x2d70, 0x7c3b, 0x7c3c, 0x7c3e, 0x7c3d, 0x2e4d, 0x7c3f, 0x2d72, 0x7c41, 0x7c40, 0x2d71, 0x7c53, 0x7c54, 0x7a22, 0x7b63, 0x2c4f, 0x7b65, 0x2e48, 0x7b64, 0x7b66, 0x7b67, 0x7b6a, 0x7b6b, 0x7b68, 0x7b6c, 0x2e49, 0x7b6f, 0x7b69, 0x7b70, 0x7b6d, 0x2d6f, 0x7b71, 0x7e79, 0x7b74, 0x7b76, 0x7b79, 0x7b72, 0x7b77, 0x2e4a, 0x7b6e, 0x7b75, 0x7b73, 0x2d6d, 0x7b78, 0x7c22, 0x7b7c, 0x7c23, 0x7b7e, 0x7c21, 0x7b7b, 0x7b7d, 0x7d52, 0x7c5a, 0x7c24, 0x7b7a, 0x7c25, 0x7c26, 0x7c27, 0x7c29, 0x2e4b, 0x7c28, 0x2d6e, 0x7c2a, 0x7c2b, 0x7c2c, 0x2c50, 0x2c5a, 0x2e55, 0x7c31, 0x2c52, 0x7a3b, 0x2e53, 0x2d73, 0x2f6a, 0x7c6b, 0x7c6c, 0x7c6f, 0x7c6d, 0x2e5b, 0x2d54, 0x2c27, 0x7c6e, 0x7c70, 0x7c72, 0x2c29, 0x7c71, 0x2c28, 0x7c75, 0x7c77, 0x2f6b, 0x7c79, 0x7c74, 0x7c76, 0x2d55, 0x7c73, 0x7c78, 0x7c7a, 0x7c7e, 0x7c7b, 0x7d21, 0x7c7d, 0x7c7c, 0x2e5c, 0x7d22, 0x2d56, 0x7d24, 0x2c2a, 0x2d57, 0x7d25, 0x2e5d, 0x7d27, 0x7d28, 0x7d23, 0x7d26, 0x2c2b, 0x2e5e, 0x7d2a, 0x7d29, 0x7d2c, 0x2f6c, 0x7d2d, 0x2c2c, 0x7c38, 0x7d2b, 0x7d2e, 0x7d30, 0x7d2f, 0x2d58, 0x2e5f, 0x2e60, 0x2c2d, 0x7d31, 0x7d32, 0x2d59, 0x7d35, 0x7d34, 0x7d33, 0x7d36, 0x2e57, 0x7c5b, 0x2d6a, 0x7c5c, 0x7c62, 0x2e58, 0x7c5d, 0x7c5e, 0x7c5f, 0x2e59, 0x2f74, 0x2c51, 0x7c60, 0x2c46, 0x2d6c, 0x7c61, 0x7b28, 0x7b29, 0x2c37, 0x7c44, 0x7c45, 0x2f73, 0x2c57, 0x2c3d, 0x7c2d, 0x2e4c, 0x7e7a, 0x7c2f, 0x7c30, 0x2e42, 0x7b47, 0x7b48, 0x2c4a, 0x7b49, 0x7b4b, 0x7b4c, 0x7b4a, 0x7b4d, 0x7b50, 0x2e43, 0x2e44, 0x7b4e, 0x7b54, 0x7b55, 0x7b4f, 0x7b53, 0x7b52, 0x2e46, 0x7b51, 0x2c4b, 0x7b57, 0x7b56, 0x2e45, 0x7b59, 0x7b58, 0x2e47, 0x7b5c, 0x7b5a, 0x7b5b, 0x7b5d, 0x2c4c, 0x7b60, 0x7b5e, 0x7b5f, 0x2c4d, 0x7b61, 0x2c4e, 0x7c34, 0x7c35, 0x7d57, 0x2c75, 0x7a24, 0x2d6b, 0x7d50, 0x2f77, 0x7d51, 0x7d6b, 0x2e6a, 0x2f78, 0x7d6c, 0x7d6d, 0x7d6e, 0x2d74, 0x2e6c, 0x7d5a, 0x7d5b, 0x7d54, 0x7d55, 0x2d76, 0x7d56, 0x7d4a, 0x2c5f, 0x7d4b, 0x7d4c, 0x7d4d, 0x2d75, 0x7d4e, 0x7d4f, 0x7d75, 0x7d40, 0x7d3f, 0x2e63, 0x7d42, 0x7d41, 0x7d43, 0x2e64, 0x7d44, 0x7d45, 0x2e65, 0x7d46, 0x2e66, 0x7d47, 0x2e67, 0x7d48, 0x2e61, 0x7d37, 0x7d38, 0x7d39, 0x2e62, 0x7d3a, 0x7d3b, 0x2c49, 0x7d3c, 0x7d3d, 0x7d3e, 0x2e22, 0x7d58, 0x2e68, 0x7d59, 0x2e69, 0x7d70, 0x7d71, 0x7d72, 0x7d73, 0x7d74, 0x7d6f, 0x2e6b, 0x7e25, 0x7e26, 0x2c69, 0x7e27, 0x2d7a, 0x7e28, 0x7e29, 0x7e2b, 0x2e6e, 0x7e2d, 0x7e2a, 0x7e2c, 0x7e2e, 0x2e6f, 0x2d7b, 0x2e70, 0x2f7b, 0x2e72, 0x2c33, 0x2c6c, 0x7e54, 0x7e55, 0x2c42, 0x7e56, 0x7e57, 0x2c43, 0x2f72, 0x2c44, 0x7e58, 0x2f71, 0x2e77, 0x7e24, 0x7d53, 0x7e36, 0x2e76, 0x2c6a, 0x7e53, 0x2c6b, 0x7d76, 0x7e23, 0x7c33, 0x2c78, 0x2e54, 0x2c59, 0x7c55, 0x7c56, 0x2f76, 0x2f75, 0x7e2f, 0x2e73, 0x7e37, 0x7e39, 0x7e38, 0x7e3b, 0x7e3c, 0x7e3a, 0x7e40, 0x7e3f, 0x7e3e, 0x7e3d, 0x7e42, 0x7e41, 0x2e74, 0x7e45, 0x7e43, 0x7e44, 0x7e46, 0x7e47, 0x2c32, 0x2d60, 0x2d5f, 0x7e4a, 0x7e48, 0x7e4b, 0x2f6e, 0x7e49, 0x2e75, 0x7e4c, 0x2f6d, 0x7e4d, 0x7e4f, 0x7e4e, 0x7e51, 0x7e52, 0x7a27, 0x7d7b, 0x7d7c, 0x2c68, 0x7d7d, 0x2d78, 0x2c58, 0x7d7e, 0x7e21, 0x7e22, 0x2d79, 0x7b24, 0x7e30, 0x2c5c, 0x7e31, 0x2c5d, 0x7e32, 0x7e33, 0x7e34, 0x2c5e, 0x7e35, 0x2f7a, 0x2e4f, 0x2e50, 0x2c7c, 0x7e71, 0x7b2e, 0x7d49, 0x2c77, 0x7e72, 0x7e73, 0x7e74, 0x7e75, 0x7e76, 0x7e77, 0x7e5c, 0x7e5e, 0x7e5d, 0x7e70, 0x2e2c, 0x7c42, 0x2e4e, 0x7c43, 0x2c55, 0x7e5a, 0x7e5f, 0x2e78, 0x7e60, 0x7e61, 0x2c6e, 0x2c6d, 0x7e62, 0x2e79, 0x2c70, 0x2c6f, 0x2d7c, 0x2c53, 0x2c54, 0x7e6e, 0x2d5c, 0x7e63, 0x7e64, 0x2f66, 0x7e65, 0x7e67, 0x7e66, 0x7e68, 0x7e6f, 0x7e69, 0x7e6b, 0x2c26, 0x7e6a, 0x2d50, 0x7e6c, 0x7e6d, 0x2f7e, 0x7e7d, 0x7e7e, 0x2d21, 0x2d22, 0x2c7e, 0x2d23, 0x2d24, 0x2d25, 0x2c60, 0x2d26, 0x2e7c, 0x2d28, 0x2d29, 0x2d2a, 0x2d27, 0x2d2b, 0x2d2c, 0x2c61, 0x2c62, 0x2d2d, 0x2d2e, 0x2d7d, 0x7b2c, 0x7b2d, 0x7b2f, 0x7b30, 0x2c30, 0x7b31, 0x2f67, 0x7e50, 0x7e78, 0x2e7a, 0x2d3e, 0x2c71, 0x2d3f, 0x2d40, 0x2d42, 0x2d41, 0x7b62, 0x7d77, 0x7d78, 0x2e6d, 0x2d77, 0x7d79, 0x7d7a, 0x7c57, 0x2c5b, 0x7c58, 0x2e56, 0x7c59, 0x2d43, 0x2d44, 0x2d45, 0x2d46, 0x2d47, 0x2d48, 0x2d49, 0x2d4a, 0x2c3e, 0x2d4b, 0x7b40, 0x7b41, 0x7b42, 0x7b43, 0x7b44, 0x2d68, 0x7b45, 0x2c45, 0x7b46, 0x2d4c, 0x2d4d, 0x2f79, 0x2c56, 0x2c72, 0x2d2f, 0x2d30, 0x2d31, 0x2d32, 0x2d33, 0x2d34, 0x2d35, 0x2d36, 0x2e71, 0x2d37, 0x2d38, 0x2d39, 0x2d3a, 0x2d3b, 0x2d3c, 0x2d3d, 0x2c63, 0x7d5c, 0x7d5d, 0x7d5e, 0x7d5f, 0x2c64, 0x7d60, 0x2c65, 0x7d61, 0x7d62, 0x7d63, 0x7d64, 0x7d65, 0x2c66, 0x2c67, 0x7d66, 0x7d67, 0x7d68, 0x7d69, 0x7d6a, 0x2d4f, 0x2d51, 0x7a26, 0x2e7b, 0x2d52, 0x2c73, 0x2c74, 0x7e7b, 0x7e7c, 0x2b40, }; static const Summary16 isoir165ext_uni2indx_page00[32] = { /* 0x0000 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x3700 }, { 5, 0x160c }, /* 0x0100 */ { 10, 0x0000 }, { 10, 0x0808 }, { 12, 0x0800 }, { 13, 0x0000 }, { 13, 0x2110 }, { 16, 0x0000 }, { 16, 0x0800 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x0000 }, { 17, 0x1555 }, { 24, 0x0000 }, { 24, 0x0200 }, }; static const Summary16 isoir165ext_uni2indx_page03[12] = { /* 0x0300 */ { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x1000 }, { 26, 0x0002 }, }; static const Summary16 isoir165ext_uni2indx_page1e[28] = { /* 0x1e00 */ { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x0000 }, { 27, 0x8000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, /* 0x1f00 */ { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0000 }, { 28, 0x0001 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0000 }, { 29, 0x0003 }, }; static const Summary16 isoir165ext_uni2indx_page30[4] = { /* 0x3000 */ { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0000 }, { 31, 0x0080 }, }; static const Summary16 isoir165ext_uni2indx_page32[32] = { /* 0x3200 */ { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0000 }, { 32, 0x0fff }, { 44, 0x0000 }, { 44, 0x0000 }, { 44, 0x0000 }, /* 0x3300 */ { 44, 0x0000 }, { 44, 0x0000 }, { 44, 0x0000 }, { 44, 0x0000 }, { 44, 0x0000 }, { 44, 0xff00 }, { 52, 0xffff }, { 68, 0x0001 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0x0000 }, { 69, 0xffff }, { 85, 0x7fff }, }; static const Summary16 isoir165ext_uni2indx_page4e[752] = { /* 0x4e00 */ { 100, 0x8000 }, { 101, 0x0000 }, { 101, 0x0040 }, { 102, 0x0000 }, { 102, 0x0004 }, { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0000 }, { 103, 0x0020 }, { 104, 0x0000 }, { 104, 0x0000 }, { 104, 0x0140 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, /* 0x4f00 */ { 106, 0x0808 }, { 108, 0x0020 }, { 109, 0x000a }, { 111, 0x4800 }, { 113, 0x0000 }, { 113, 0x0000 }, { 113, 0x0802 }, { 115, 0x0400 }, { 116, 0x0000 }, { 116, 0x0000 }, { 116, 0x0004 }, { 117, 0x0010 }, { 118, 0x0000 }, { 118, 0x0000 }, { 118, 0x0800 }, { 119, 0x0060 }, /* 0x5000 */ { 121, 0x0000 }, { 121, 0x4000 }, { 122, 0x0004 }, { 123, 0x0010 }, { 124, 0x0000 }, { 124, 0x0000 }, { 124, 0x0000 }, { 124, 0x0004 }, { 125, 0x0000 }, { 125, 0x0006 }, { 127, 0x0010 }, { 128, 0x0000 }, { 128, 0x2080 }, { 130, 0x0000 }, { 130, 0x0000 }, { 130, 0x0001 }, /* 0x5100 */ { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x8080 }, { 133, 0x0000 }, { 133, 0x4100 }, { 135, 0x0000 }, { 135, 0x0008 }, { 136, 0x0000 }, { 136, 0x0000 }, { 136, 0x0000 }, /* 0x5200 */ { 136, 0x0000 }, { 136, 0x0000 }, { 136, 0x1000 }, { 137, 0x0004 }, { 138, 0x0020 }, { 139, 0x0000 }, { 139, 0x0000 }, { 139, 0x0000 }, { 139, 0x0000 }, { 139, 0x0100 }, { 140, 0x0000 }, { 140, 0x1a00 }, { 143, 0x2000 }, { 144, 0x0400 }, { 145, 0x0000 }, { 145, 0x0088 }, /* 0x5300 */ { 147, 0x0400 }, { 148, 0x1000 }, { 149, 0x0000 }, { 149, 0x0000 }, { 149, 0x0000 }, { 149, 0x0000 }, { 149, 0x0000 }, { 149, 0x0000 }, { 149, 0x0000 }, { 149, 0x0001 }, { 150, 0x0000 }, { 150, 0x4000 }, { 151, 0x00c0 }, { 153, 0x0000 }, { 153, 0x0000 }, { 153, 0x0000 }, /* 0x5400 */ { 153, 0x0000 }, { 153, 0x0000 }, { 153, 0x0000 }, { 153, 0x0000 }, { 153, 0x0000 }, { 153, 0x0000 }, { 153, 0x0000 }, { 153, 0x0000 }, { 153, 0x0000 }, { 153, 0x0000 }, { 153, 0x0020 }, { 154, 0x0000 }, { 154, 0x0000 }, { 154, 0x0000 }, { 154, 0x0000 }, { 154, 0x0000 }, /* 0x5500 */ { 154, 0x0000 }, { 154, 0x2000 }, { 155, 0x0000 }, { 155, 0x0040 }, { 156, 0x2000 }, { 157, 0x0080 }, { 158, 0x8000 }, { 159, 0x0011 }, { 161, 0x0040 }, { 162, 0x0000 }, { 162, 0x0010 }, { 163, 0x0000 }, { 163, 0x0000 }, { 163, 0x0000 }, { 163, 0x0000 }, { 163, 0x0000 }, /* 0x5600 */ { 163, 0x0000 }, { 163, 0x0000 }, { 163, 0x0000 }, { 163, 0x0000 }, { 163, 0x0001 }, { 164, 0x0000 }, { 164, 0x0000 }, { 164, 0x0000 }, { 164, 0x0010 }, { 165, 0x1400 }, { 167, 0x2000 }, { 168, 0x0000 }, { 168, 0x0000 }, { 168, 0x0000 }, { 168, 0x0000 }, { 168, 0x0080 }, /* 0x5700 */ { 169, 0x0000 }, { 169, 0x0201 }, { 171, 0x0000 }, { 171, 0x0000 }, { 171, 0x0000 }, { 171, 0x0000 }, { 171, 0x1000 }, { 172, 0x8001 }, { 174, 0x0080 }, { 175, 0xc420 }, { 179, 0x0000 }, { 179, 0x4002 }, { 181, 0x1000 }, { 182, 0x0000 }, { 182, 0x0800 }, { 183, 0x0020 }, /* 0x5800 */ { 184, 0x5208 }, { 188, 0x0000 }, { 188, 0x0000 }, { 188, 0x3000 }, { 190, 0x016c }, { 195, 0x2408 }, { 198, 0x0000 }, { 198, 0x0002 }, { 199, 0x0110 }, { 201, 0x0020 }, { 202, 0x0000 }, { 202, 0x0000 }, { 202, 0x0000 }, { 202, 0x0000 }, { 202, 0x0000 }, { 202, 0x0100 }, /* 0x5900 */ { 203, 0x0040 }, { 204, 0x0001 }, { 205, 0x1000 }, { 206, 0x0000 }, { 206, 0x0001 }, { 207, 0x0008 }, { 208, 0x2000 }, { 209, 0x0000 }, { 209, 0x0000 }, { 209, 0x0000 }, { 209, 0x0000 }, { 209, 0x0008 }, { 210, 0x0000 }, { 210, 0x4000 }, { 211, 0x4000 }, { 212, 0x2000 }, /* 0x5a00 */ { 213, 0x0000 }, { 213, 0x0004 }, { 214, 0x0000 }, { 214, 0x0000 }, { 214, 0x0000 }, { 214, 0x4000 }, { 215, 0x0020 }, { 216, 0x1008 }, { 218, 0x0010 }, { 219, 0x4040 }, { 221, 0x6000 }, { 223, 0x0000 }, { 223, 0x0010 }, { 224, 0x0400 }, { 225, 0x0400 }, { 226, 0x0000 }, /* 0x5b00 */ { 226, 0x0000 }, { 226, 0x0800 }, { 227, 0x0000 }, { 227, 0x0000 }, { 227, 0x0008 }, { 228, 0x0040 }, { 229, 0x0000 }, { 229, 0x0000 }, { 229, 0x0000 }, { 229, 0x0000 }, { 229, 0x1080 }, { 231, 0x0000 }, { 231, 0x0000 }, { 231, 0x0000 }, { 231, 0x0000 }, { 231, 0x0000 }, /* 0x5c00 */ { 231, 0x0020 }, { 232, 0x0000 }, { 232, 0x0400 }, { 233, 0x0001 }, { 234, 0x0000 }, { 234, 0x2000 }, { 235, 0x0000 }, { 235, 0x1014 }, { 238, 0x0000 }, { 238, 0x4000 }, { 239, 0x0100 }, { 240, 0x0000 }, { 240, 0x0088 }, { 242, 0x0008 }, { 243, 0x0088 }, { 245, 0x8002 }, /* 0x5d00 */ { 247, 0x1031 }, { 251, 0x8602 }, { 255, 0x0000 }, { 255, 0x0000 }, { 255, 0x4000 }, { 256, 0x0400 }, { 257, 0x0000 }, { 257, 0x0000 }, { 257, 0x0020 }, { 258, 0x000c }, { 260, 0x0000 }, { 260, 0x0000 }, { 260, 0x0204 }, { 262, 0x0040 }, { 263, 0x0000 }, { 263, 0x0000 }, /* 0x5e00 */ { 263, 0x0800 }, { 264, 0x0080 }, { 265, 0x0102 }, { 267, 0x0000 }, { 267, 0x0000 }, { 267, 0x0000 }, { 267, 0x0400 }, { 268, 0x0000 }, { 268, 0x0000 }, { 268, 0x0000 }, { 268, 0x0010 }, { 269, 0x1000 }, { 270, 0x0900 }, { 272, 0x0000 }, { 272, 0x0000 }, { 272, 0x0000 }, /* 0x5f00 */ { 272, 0x7080 }, { 276, 0x0000 }, { 276, 0x0004 }, { 277, 0x0000 }, { 277, 0x0000 }, { 277, 0x8000 }, { 278, 0x0180 }, { 280, 0x0000 }, { 280, 0x0000 }, { 280, 0x0000 }, { 280, 0x9000 }, { 282, 0x0000 }, { 282, 0x0000 }, { 282, 0x0000 }, { 282, 0x0000 }, { 282, 0x0000 }, /* 0x6000 */ { 282, 0x0000 }, { 282, 0x0080 }, { 283, 0x0000 }, { 283, 0x0000 }, { 283, 0x0000 }, { 283, 0x0000 }, { 283, 0x0000 }, { 283, 0x0000 }, { 283, 0x0000 }, { 283, 0x0000 }, { 283, 0x4000 }, { 284, 0x0001 }, { 285, 0x0080 }, { 286, 0x0208 }, { 288, 0x0000 }, { 288, 0x0000 }, /* 0x6100 */ { 288, 0x0000 }, { 288, 0x0010 }, { 289, 0x0000 }, { 289, 0x0000 }, { 289, 0x0000 }, { 289, 0x0008 }, { 290, 0x0020 }, { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, /* 0x6200 */ { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0000 }, { 291, 0x0460 }, { 294, 0x0000 }, { 294, 0x0003 }, { 296, 0x0000 }, { 296, 0x0008 }, { 297, 0x0010 }, { 298, 0x0000 }, { 298, 0x0000 }, { 298, 0x0008 }, { 299, 0x0000 }, { 299, 0x0010 }, { 300, 0x0000 }, /* 0x6300 */ { 300, 0x0000 }, { 300, 0x1000 }, { 301, 0x0040 }, { 302, 0x1000 }, { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x0000 }, { 303, 0x8000 }, { 304, 0x0002 }, { 305, 0x0000 }, { 305, 0x0000 }, { 305, 0x0000 }, { 305, 0x4000 }, /* 0x6400 */ { 306, 0x0000 }, { 306, 0x0004 }, { 307, 0x0084 }, { 309, 0x0000 }, { 309, 0x0000 }, { 309, 0x0000 }, { 309, 0x0000 }, { 309, 0x2080 }, { 311, 0x0000 }, { 311, 0x0000 }, { 311, 0x0000 }, { 311, 0x0000 }, { 311, 0x0000 }, { 311, 0x0000 }, { 311, 0x2000 }, { 312, 0x0000 }, /* 0x6500 */ { 312, 0x0000 }, { 312, 0x0000 }, { 312, 0x0000 }, { 312, 0x0000 }, { 312, 0x0000 }, { 312, 0x1000 }, { 313, 0x0200 }, { 314, 0x0000 }, { 314, 0x8000 }, { 315, 0x2000 }, { 316, 0x0104 }, { 318, 0x0000 }, { 318, 0x0004 }, { 319, 0x0000 }, { 319, 0x0000 }, { 319, 0x0900 }, /* 0x6600 */ { 321, 0x0280 }, { 323, 0x0000 }, { 323, 0x0000 }, { 323, 0x2000 }, { 324, 0x0000 }, { 324, 0x4000 }, { 325, 0x1084 }, { 328, 0x0008 }, { 329, 0x6800 }, { 332, 0x0000 }, { 332, 0x0000 }, { 332, 0x0000 }, { 332, 0x0000 }, { 332, 0x0000 }, { 332, 0x0000 }, { 332, 0x0000 }, /* 0x6700 */ { 332, 0x0000 }, { 332, 0x0108 }, { 334, 0x0000 }, { 334, 0x8000 }, { 335, 0x0020 }, { 336, 0x0000 }, { 336, 0x0080 }, { 337, 0x0800 }, { 338, 0x0000 }, { 338, 0x8200 }, { 340, 0x0000 }, { 340, 0x0000 }, { 340, 0x0100 }, { 341, 0x0000 }, { 341, 0x4000 }, { 342, 0x0000 }, /* 0x6800 */ { 342, 0x0000 }, { 342, 0x8004 }, { 344, 0x0000 }, { 344, 0x0000 }, { 344, 0x0800 }, { 345, 0x0000 }, { 345, 0x9400 }, { 348, 0x0000 }, { 348, 0x0000 }, { 348, 0x0000 }, { 348, 0x0001 }, { 349, 0x9002 }, { 352, 0x0002 }, { 353, 0x000b }, { 356, 0x1900 }, { 359, 0x0900 }, /* 0x6900 */ { 361, 0x0000 }, { 361, 0x200a }, { 364, 0x0800 }, { 365, 0x0020 }, { 366, 0x0001 }, { 367, 0x8200 }, { 369, 0x8204 }, { 372, 0x0000 }, { 372, 0x0008 }, { 373, 0x0040 }, { 374, 0x0000 }, { 374, 0x5000 }, { 376, 0x0020 }, { 377, 0x1400 }, { 379, 0x0020 }, { 380, 0x4000 }, /* 0x6a00 */ { 381, 0x0800 }, { 382, 0x0002 }, { 383, 0x0000 }, { 383, 0x0000 }, { 383, 0x0000 }, { 383, 0x0000 }, { 383, 0x0040 }, { 384, 0x0000 }, { 384, 0x0000 }, { 384, 0x0040 }, { 385, 0x0000 }, { 385, 0x0030 }, { 387, 0x0000 }, { 387, 0x0000 }, { 387, 0x0000 }, { 387, 0x0000 }, /* 0x6b00 */ { 387, 0x0000 }, { 387, 0x0000 }, { 387, 0x0000 }, { 387, 0x0100 }, { 388, 0x0000 }, { 388, 0x0010 }, { 389, 0x0000 }, { 389, 0x0000 }, { 389, 0x0000 }, { 389, 0x0020 }, { 390, 0x0008 }, { 391, 0x0000 }, { 391, 0x0000 }, { 391, 0x0400 }, { 392, 0x0000 }, { 392, 0x0000 }, /* 0x6c00 */ { 392, 0x0000 }, { 392, 0x2000 }, { 393, 0x0020 }, { 394, 0xc000 }, { 396, 0x0000 }, { 396, 0x0000 }, { 396, 0x2080 }, { 398, 0x0000 }, { 398, 0x0090 }, { 400, 0x0540 }, { 403, 0x0100 }, { 404, 0x0020 }, { 405, 0x0048 }, { 407, 0x1000 }, { 408, 0x0000 }, { 408, 0x0000 }, /* 0x6d00 */ { 408, 0x0000 }, { 408, 0x0002 }, { 409, 0x0300 }, { 411, 0x0510 }, { 414, 0x0210 }, { 416, 0x0821 }, { 419, 0x0032 }, { 422, 0x0000 }, { 422, 0x0000 }, { 422, 0x0000 }, { 422, 0x2004 }, { 424, 0x0010 }, { 425, 0x0000 }, { 425, 0x0000 }, { 425, 0x0000 }, { 425, 0x0000 }, /* 0x6e00 */ { 425, 0x0000 }, { 425, 0x0800 }, { 426, 0x0000 }, { 426, 0x0000 }, { 426, 0x0000 }, { 426, 0x3000 }, { 428, 0x0080 }, { 429, 0x0004 }, { 430, 0x4082 }, { 433, 0x0400 }, { 434, 0x0041 }, { 436, 0x0020 }, { 437, 0x0208 }, { 439, 0x0100 }, { 440, 0x0c80 }, { 443, 0x0000 }, /* 0x6f00 */ { 443, 0x0000 }, { 443, 0x0000 }, { 443, 0x0040 }, { 444, 0x0080 }, { 445, 0x0000 }, { 445, 0x8040 }, { 447, 0x0000 }, { 447, 0x0020 }, { 448, 0x0004 }, { 449, 0x0810 }, { 451, 0x0020 }, { 452, 0x1010 }, { 454, 0x0000 }, { 454, 0x0000 }, { 454, 0x1000 }, { 455, 0x0000 }, /* 0x7000 */ { 455, 0x3000 }, { 457, 0x0010 }, { 458, 0x0000 }, { 458, 0x1000 }, { 459, 0x0000 }, { 459, 0x0000 }, { 459, 0x0000 }, { 459, 0x0400 }, { 460, 0x0000 }, { 460, 0x4100 }, { 462, 0x0000 }, { 462, 0x0000 }, { 462, 0x0000 }, { 462, 0x3000 }, { 464, 0x0000 }, { 464, 0x0402 }, /* 0x7100 */ { 466, 0x1000 }, { 467, 0x1000 }, { 468, 0x4001 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x0000 }, { 470, 0x8c00 }, { 473, 0x0000 }, { 473, 0x0000 }, { 473, 0x8000 }, /* 0x7200 */ { 474, 0x0000 }, { 474, 0x8000 }, { 475, 0x0000 }, { 475, 0x0000 }, { 475, 0x0006 }, { 477, 0x0400 }, { 478, 0x0008 }, { 479, 0x0080 }, { 480, 0x0080 }, { 481, 0x0000 }, { 481, 0x0100 }, { 482, 0x0000 }, { 482, 0x0200 }, { 483, 0x2000 }, { 484, 0x0004 }, { 485, 0x0000 }, /* 0x7300 */ { 485, 0x0040 }, { 486, 0x0010 }, { 487, 0x0000 }, { 487, 0x0400 }, { 488, 0x0000 }, { 488, 0x0000 }, { 488, 0x0000 }, { 488, 0x0000 }, { 488, 0x0000 }, { 488, 0x0630 }, { 492, 0x0061 }, { 495, 0x0002 }, { 496, 0x0000 }, { 496, 0x0040 }, { 497, 0x4408 }, { 500, 0x2441 }, /* 0x7400 */ { 504, 0x4080 }, { 506, 0x0020 }, { 507, 0x8810 }, { 510, 0x0084 }, { 512, 0x0014 }, { 514, 0x0010 }, { 515, 0x0004 }, { 516, 0x0102 }, { 518, 0x0140 }, { 520, 0x8100 }, { 522, 0x0401 }, { 524, 0x0004 }, { 525, 0x0000 }, { 525, 0x0100 }, { 526, 0x0000 }, { 526, 0x0800 }, /* 0x7500 */ { 527, 0x0008 }, { 528, 0x0000 }, { 528, 0x0442 }, { 531, 0x0000 }, { 531, 0x0000 }, { 531, 0x0002 }, { 532, 0x9010 }, { 535, 0x0000 }, { 535, 0x0000 }, { 535, 0x0000 }, { 535, 0x0004 }, { 536, 0x0000 }, { 536, 0x0000 }, { 536, 0x0000 }, { 536, 0x0001 }, { 537, 0x0008 }, /* 0x7600 */ { 538, 0x0110 }, { 540, 0x2000 }, { 541, 0x0000 }, { 541, 0x0000 }, { 541, 0x0000 }, { 541, 0x0004 }, { 542, 0x0000 }, { 542, 0x8040 }, { 544, 0x0000 }, { 544, 0x4000 }, { 545, 0x0000 }, { 545, 0x0000 }, { 545, 0x0000 }, { 545, 0x2000 }, { 546, 0x1440 }, { 549, 0x0800 }, /* 0x7700 */ { 550, 0x0400 }, { 551, 0x0800 }, { 552, 0x1000 }, { 553, 0x0000 }, { 553, 0x0000 }, { 553, 0x0000 }, { 553, 0x0000 }, { 553, 0x0000 }, { 553, 0x0840 }, { 555, 0x0000 }, { 555, 0x2800 }, { 557, 0x0000 }, { 557, 0x0000 }, { 557, 0x4000 }, { 558, 0x0000 }, { 558, 0x1800 }, /* 0x7800 */ { 560, 0x0040 }, { 561, 0x0000 }, { 561, 0x0005 }, { 563, 0x0000 }, { 563, 0x0002 }, { 564, 0x0600 }, { 566, 0x0000 }, { 566, 0x0020 }, { 567, 0x0000 }, { 567, 0x0010 }, { 568, 0x0000 }, { 568, 0x0040 }, { 569, 0x0000 }, { 569, 0x1000 }, { 570, 0x0002 }, { 571, 0x0000 }, /* 0x7900 */ { 571, 0x0008 }, { 572, 0x0000 }, { 572, 0x0000 }, { 572, 0x2008 }, { 574, 0x4488 }, { 578, 0x0001 }, { 579, 0x0000 }, { 579, 0x1004 }, { 581, 0x0000 }, { 581, 0x0100 }, { 582, 0x0011 }, { 584, 0x0100 }, { 585, 0x0000 }, { 585, 0x0000 }, { 585, 0x0000 }, { 585, 0x4000 }, /* 0x7a00 */ { 586, 0x0000 }, { 586, 0x0040 }, { 587, 0x0000 }, { 587, 0x0000 }, { 587, 0x0010 }, { 588, 0x4000 }, { 589, 0x0000 }, { 589, 0x0000 }, { 589, 0x4020 }, { 591, 0x0000 }, { 591, 0x0008 }, { 592, 0x4100 }, { 594, 0x0000 }, { 594, 0x1002 }, { 596, 0x0000 }, { 596, 0x0000 }, /* 0x7b00 */ { 596, 0x0000 }, { 596, 0x0000 }, { 596, 0x0000 }, { 596, 0x0000 }, { 596, 0x4400 }, { 598, 0x1000 }, { 599, 0x0000 }, { 599, 0x8000 }, { 600, 0x0080 }, { 601, 0x0008 }, { 602, 0x0000 }, { 602, 0x0000 }, { 602, 0x0000 }, { 602, 0x0000 }, { 602, 0x8000 }, { 603, 0x0005 }, /* 0x7c00 */ { 605, 0x0208 }, { 607, 0x0020 }, { 608, 0x0001 }, { 609, 0x0001 }, { 610, 0x0000 }, { 610, 0x2001 }, { 612, 0x0000 }, { 612, 0x0000 }, { 612, 0x0000 }, { 612, 0x0000 }, { 612, 0x1040 }, { 614, 0x0000 }, { 614, 0x0000 }, { 614, 0x0000 }, { 614, 0x0000 }, { 614, 0x0020 }, }; static const Summary16 isoir165ext_uni2indx_page7e[333] = { /* 0x7e00 */ { 615, 0x0000 }, { 615, 0x0000 }, { 615, 0x0000 }, { 615, 0x0000 }, { 615, 0x0010 }, { 616, 0x0000 }, { 616, 0x0000 }, { 616, 0x0000 }, { 616, 0x0000 }, { 616, 0x0000 }, { 616, 0x4000 }, { 617, 0x1810 }, { 620, 0x0000 }, { 620, 0x0040 }, { 621, 0x1010 }, { 623, 0x0200 }, /* 0x7f00 */ { 624, 0x0400 }, { 625, 0x4001 }, { 627, 0x0000 }, { 627, 0x0000 }, { 627, 0x2000 }, { 628, 0x0000 }, { 628, 0x0000 }, { 628, 0x2000 }, { 629, 0x0000 }, { 629, 0x0002 }, { 630, 0x0000 }, { 630, 0x0000 }, { 630, 0x0001 }, { 631, 0x0600 }, { 633, 0x8000 }, { 634, 0x0000 }, /* 0x8000 */ { 634, 0x0000 }, { 634, 0x0000 }, { 634, 0x0000 }, { 634, 0x0001 }, { 635, 0x0000 }, { 635, 0x0000 }, { 635, 0x0000 }, { 635, 0x0000 }, { 635, 0x0000 }, { 635, 0x0000 }, { 635, 0x0000 }, { 635, 0x0000 }, { 635, 0x0000 }, { 635, 0x0010 }, { 636, 0x0000 }, { 636, 0x4000 }, /* 0x8100 */ { 637, 0x0000 }, { 637, 0x0000 }, { 637, 0x0200 }, { 638, 0x8000 }, { 639, 0x0000 }, { 639, 0x0104 }, { 641, 0x0000 }, { 641, 0x0000 }, { 641, 0x0000 }, { 641, 0x0000 }, { 641, 0x0000 }, { 641, 0x0000 }, { 641, 0x0000 }, { 641, 0x0002 }, { 642, 0x0000 }, { 642, 0x0000 }, /* 0x8200 */ { 642, 0x0000 }, { 642, 0x0140 }, { 644, 0x0000 }, { 644, 0x0400 }, { 645, 0x0000 }, { 645, 0x0000 }, { 645, 0x0000 }, { 645, 0x0100 }, { 646, 0x0008 }, { 647, 0x0000 }, { 647, 0x0080 }, { 648, 0x1000 }, { 649, 0x0000 }, { 649, 0x0000 }, { 649, 0x0000 }, { 649, 0x4000 }, /* 0x8300 */ { 650, 0x0001 }, { 651, 0x2008 }, { 653, 0x0000 }, { 653, 0x0000 }, { 653, 0x0030 }, { 655, 0x2000 }, { 656, 0x0000 }, { 656, 0x0000 }, { 656, 0x0000 }, { 656, 0x0200 }, { 657, 0x0040 }, { 658, 0x0000 }, { 658, 0x0000 }, { 658, 0x0002 }, { 659, 0x0000 }, { 659, 0x5000 }, /* 0x8400 */ { 661, 0x0000 }, { 661, 0x0400 }, { 662, 0x0200 }, { 663, 0x0200 }, { 664, 0x0000 }, { 664, 0x0008 }, { 665, 0x0001 }, { 666, 0x0000 }, { 666, 0x0000 }, { 666, 0xc000 }, { 668, 0x0100 }, { 669, 0x0000 }, { 669, 0x8044 }, { 672, 0x0000 }, { 672, 0x0400 }, { 673, 0x0080 }, /* 0x8500 */ { 674, 0x0000 }, { 674, 0x0000 }, { 674, 0x0000 }, { 674, 0x0010 }, { 675, 0x0000 }, { 675, 0x0000 }, { 675, 0x0000 }, { 675, 0x0001 }, { 676, 0x0000 }, { 676, 0x0000 }, { 676, 0x0004 }, { 677, 0x0108 }, { 679, 0x0000 }, { 679, 0x0000 }, { 679, 0x0001 }, { 680, 0x0000 }, /* 0x8600 */ { 680, 0x0000 }, { 680, 0x0000 }, { 680, 0x0000 }, { 680, 0x0000 }, { 680, 0x0000 }, { 680, 0x0004 }, { 681, 0x0000 }, { 681, 0x0000 }, { 681, 0x0008 }, { 682, 0x0000 }, { 682, 0x0000 }, { 682, 0x0000 }, { 682, 0x0000 }, { 682, 0x0000 }, { 682, 0x0000 }, { 682, 0x0000 }, /* 0x8700 */ { 682, 0x4020 }, { 684, 0x0000 }, { 684, 0x0000 }, { 684, 0x0000 }, { 684, 0x0000 }, { 684, 0x0100 }, { 685, 0x0000 }, { 685, 0x0000 }, { 685, 0x0001 }, { 686, 0x0000 }, { 686, 0x0008 }, { 687, 0x0000 }, { 687, 0x8000 }, { 688, 0x0000 }, { 688, 0x0004 }, { 689, 0x0000 }, /* 0x8800 */ { 689, 0x0800 }, { 690, 0x0000 }, { 690, 0x2000 }, { 691, 0x0000 }, { 691, 0x0000 }, { 691, 0x0004 }, { 692, 0x0000 }, { 692, 0x0000 }, { 692, 0x0040 }, { 693, 0x0080 }, { 694, 0x8400 }, { 696, 0x0000 }, { 696, 0x0101 }, { 698, 0x0000 }, { 698, 0x0000 }, { 698, 0x0000 }, /* 0x8900 */ { 698, 0x0000 }, { 698, 0x0000 }, { 698, 0x0040 }, { 699, 0x0000 }, { 699, 0x0000 }, { 699, 0x0020 }, { 700, 0x0000 }, { 700, 0x0040 }, { 701, 0x0001 }, { 702, 0x0000 }, { 702, 0x0000 }, { 702, 0x0000 }, { 702, 0x2008 }, { 704, 0x0010 }, { 705, 0x0000 }, { 705, 0x0002 }, /* 0x8a00 */ { 706, 0x0000 }, { 706, 0x0400 }, { 707, 0x0000 }, { 707, 0x0000 }, { 707, 0x0000 }, { 707, 0x8000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, /* 0x8b00 */ { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x0000 }, { 708, 0x1000 }, { 709, 0x0802 }, { 711, 0x0080 }, { 712, 0x0000 }, { 712, 0x0400 }, { 713, 0x0000 }, /* 0x8c00 */ { 713, 0x0200 }, { 714, 0x4000 }, { 715, 0x0000 }, { 715, 0x0000 }, { 715, 0x0000 }, { 715, 0x0000 }, { 715, 0x6100 }, { 718, 0x0000 }, { 718, 0x0040 }, { 719, 0x0000 }, { 719, 0x0000 }, { 719, 0x0000 }, { 719, 0x0000 }, { 719, 0x0000 }, { 719, 0x0000 }, { 719, 0x0000 }, /* 0x8d00 */ { 719, 0x0000 }, { 719, 0x0000 }, { 719, 0x0001 }, { 720, 0x0000 }, { 720, 0x0000 }, { 720, 0x8086 }, { 724, 0x0400 }, { 725, 0x0000 }, { 725, 0x0000 }, { 725, 0x0000 }, { 725, 0x0000 }, { 725, 0x0000 }, { 725, 0x0000 }, { 725, 0x0000 }, { 725, 0x0000 }, { 725, 0x0000 }, /* 0x8e00 */ { 725, 0x0000 }, { 725, 0x0040 }, { 726, 0x00c2 }, { 729, 0x0040 }, { 730, 0x0020 }, { 731, 0x1009 }, { 734, 0x0004 }, { 735, 0x0000 }, { 735, 0x0000 }, { 735, 0x0000 }, { 735, 0x2000 }, { 736, 0x0000 }, { 736, 0x0000 }, { 736, 0x0000 }, { 736, 0x0000 }, { 736, 0x0000 }, /* 0x8f00 */ { 736, 0x0000 }, { 736, 0x0000 }, { 736, 0x0000 }, { 736, 0x0000 }, { 736, 0x0000 }, { 736, 0x0000 }, { 736, 0x0000 }, { 736, 0x0000 }, { 736, 0x0001 }, { 737, 0x0004 }, { 738, 0x0000 }, { 738, 0x0020 }, { 739, 0x0000 }, { 739, 0x0000 }, { 739, 0x0000 }, { 739, 0x0400 }, /* 0x9000 */ { 740, 0x0000 }, { 740, 0x0000 }, { 740, 0x0000 }, { 740, 0x0000 }, { 740, 0x0000 }, { 740, 0x0000 }, { 740, 0x0000 }, { 740, 0x0000 }, { 740, 0x0000 }, { 740, 0x0100 }, { 741, 0x0101 }, { 743, 0x2000 }, { 744, 0x0108 }, { 746, 0x0400 }, { 747, 0x0010 }, { 748, 0x8000 }, /* 0x9100 */ { 749, 0x1000 }, { 750, 0x1500 }, { 753, 0x0001 }, { 754, 0x0000 }, { 754, 0x0004 }, { 755, 0x0000 }, { 755, 0x0000 }, { 755, 0x0000 }, { 755, 0x0000 }, { 755, 0x0000 }, { 755, 0x0000 }, { 755, 0x0000 }, { 755, 0x0040 }, { 756, 0x0000 }, { 756, 0x0000 }, { 756, 0x0000 }, /* 0x9200 */ { 756, 0x0000 }, { 756, 0x0000 }, { 756, 0x0000 }, { 756, 0x0000 }, { 756, 0x0000 }, { 756, 0x0000 }, { 756, 0x0000 }, { 756, 0x0000 }, { 756, 0x0000 }, { 756, 0x0000 }, { 756, 0x0000 }, { 756, 0x0000 }, { 756, 0x0040 }, }; static const Summary16 isoir165ext_uni2indx_page94[143] = { /* 0x9400 */ { 757, 0x0000 }, { 757, 0x0000 }, { 757, 0x0000 }, { 757, 0x0000 }, { 757, 0x0000 }, { 757, 0x0000 }, { 757, 0x0000 }, { 757, 0x0000 }, { 757, 0x0000 }, { 757, 0x0142 }, { 760, 0x0000 }, { 760, 0x0000 }, { 760, 0x8080 }, { 762, 0x0418 }, { 765, 0x0040 }, { 766, 0x0800 }, /* 0x9500 */ { 767, 0x0000 }, { 767, 0x1000 }, { 768, 0x0081 }, { 770, 0x2008 }, { 772, 0x0008 }, { 773, 0x0400 }, { 774, 0x4001 }, { 776, 0x0030 }, { 778, 0x0000 }, { 778, 0x0000 }, { 778, 0x0000 }, { 778, 0x0000 }, { 778, 0x0000 }, { 778, 0x0000 }, { 778, 0x1000 }, { 779, 0x8000 }, /* 0x9600 */ { 780, 0x0080 }, { 781, 0x0908 }, { 784, 0x0000 }, { 784, 0x0000 }, { 784, 0x0000 }, { 784, 0x4000 }, { 785, 0x0000 }, { 785, 0x0000 }, { 785, 0x0000 }, { 785, 0x0000 }, { 785, 0x0000 }, { 785, 0x0000 }, { 785, 0x0000 }, { 785, 0x0100 }, { 786, 0x0000 }, { 786, 0x0000 }, /* 0x9700 */ { 786, 0x0004 }, { 787, 0x0000 }, { 787, 0x0000 }, { 787, 0x0000 }, { 787, 0x0000 }, { 787, 0x0010 }, { 788, 0x0000 }, { 788, 0x0501 }, { 791, 0x0000 }, { 791, 0x0000 }, { 791, 0x4102 }, { 794, 0x0000 }, { 794, 0x0000 }, { 794, 0x0000 }, { 794, 0x0100 }, { 795, 0x0000 }, /* 0x9800 */ { 795, 0x0000 }, { 795, 0x0000 }, { 795, 0x0000 }, { 795, 0x0000 }, { 795, 0x0000 }, { 795, 0x0000 }, { 795, 0x0000 }, { 795, 0x0000 }, { 795, 0x4800 }, { 797, 0x0224 }, { 800, 0x0008 }, { 801, 0x0000 }, { 801, 0x8000 }, { 802, 0x00d1 }, { 806, 0x0000 }, { 806, 0x0000 }, /* 0x9900 */ { 806, 0x0000 }, { 806, 0x0000 }, { 806, 0x0000 }, { 806, 0x0000 }, { 806, 0x0000 }, { 806, 0x0000 }, { 806, 0x0050 }, { 808, 0x4b00 }, { 812, 0x500c }, { 816, 0x0000 }, { 816, 0x0000 }, { 816, 0x0000 }, { 816, 0x0000 }, { 816, 0x0000 }, { 816, 0x0000 }, { 816, 0x0000 }, /* 0x9a00 */ { 816, 0x0000 }, { 816, 0x0000 }, { 816, 0x0000 }, { 816, 0x0000 }, { 816, 0x0000 }, { 816, 0x0000 }, { 816, 0x0000 }, { 816, 0x0004 }, { 817, 0x6208 }, { 821, 0x0230 }, { 824, 0x0040 }, { 825, 0x0000 }, { 825, 0x0000 }, { 825, 0x0000 }, { 825, 0x0000 }, { 825, 0x0000 }, /* 0x9b00 */ { 825, 0x0000 }, { 825, 0x0101 }, { 827, 0x0020 }, { 828, 0x0040 }, { 829, 0x0040 }, { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, /* 0x9c00 */ { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0000 }, { 830, 0x0411 }, { 833, 0x23c8 }, { 839, 0x0000 }, { 839, 0x8000 }, { 840, 0x0003 }, { 842, 0x0804 }, { 844, 0x0009 }, }; static const Summary16 isoir165ext_uni2indx_page9e[25] = { /* 0x9e00 */ { 846, 0x0000 }, { 846, 0x0000 }, { 846, 0x4090 }, { 849, 0x0011 }, { 851, 0x2001 }, { 853, 0x225d }, { 860, 0x8027 }, { 865, 0x0010 }, { 866, 0x0001 }, { 867, 0x0002 }, { 868, 0x0000 }, { 868, 0x0000 }, { 868, 0x0000 }, { 868, 0x0000 }, { 868, 0x0002 }, { 869, 0x0000 }, /* 0x9f00 */ { 869, 0x1000 }, { 870, 0x0004 }, { 871, 0x0800 }, { 872, 0x0000 }, { 872, 0x0002 }, { 873, 0x0000 }, { 873, 0x0000 }, { 873, 0x0000 }, { 873, 0x0006 }, }; static const Summary16 isoir165ext_uni2indx_pageff[5] = { /* 0xff00 */ { 875, 0x0000 }, { 875, 0x0000 }, { 875, 0x0000 }, { 875, 0x0000 }, { 875, 0x0080 }, }; static int isoir165ext_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc >= 0x0000 && wc < 0x0200) summary = &isoir165ext_uni2indx_page00[(wc>>4)]; else if (wc >= 0x0300 && wc < 0x03c0) summary = &isoir165ext_uni2indx_page03[(wc>>4)-0x030]; else if (wc >= 0x1e00 && wc < 0x1fc0) summary = &isoir165ext_uni2indx_page1e[(wc>>4)-0x1e0]; else if (wc >= 0x3000 && wc < 0x3040) summary = &isoir165ext_uni2indx_page30[(wc>>4)-0x300]; else if (wc >= 0x3200 && wc < 0x3400) summary = &isoir165ext_uni2indx_page32[(wc>>4)-0x320]; else if (wc >= 0x4e00 && wc < 0x7d00) summary = &isoir165ext_uni2indx_page4e[(wc>>4)-0x4e0]; else if (wc >= 0x7e00 && wc < 0x92d0) summary = &isoir165ext_uni2indx_page7e[(wc>>4)-0x7e0]; else if (wc >= 0x9400 && wc < 0x9cf0) summary = &isoir165ext_uni2indx_page94[(wc>>4)-0x940]; else if (wc >= 0x9e00 && wc < 0x9f90) summary = &isoir165ext_uni2indx_page9e[(wc>>4)-0x9e0]; else if (wc >= 0xff00 && wc < 0xff50) summary = &isoir165ext_uni2indx_pageff[(wc>>4)-0xff0]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' 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); c = isoir165ext_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/java.h000066400000000000000000000076121252300335000240250ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * JAVA * This is ISO 8859-1 with \uXXXX escape sequences, denoting Unicode BMP * characters. Consecutive pairs of \uXXXX escape sequences in the surrogate * range, as in UTF-16, denote Unicode characters outside the BMP. */ static int java_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c; ucs4_t wc, wc2; int i; c = s[0]; if (c != '\\') { *pwc = c; return 1; } if (n < 2) return RET_TOOFEW(0); if (s[1] != 'u') goto simply_backslash; wc = 0; for (i = 2; i < 6; i++) { if (n <= i) return RET_TOOFEW(0); c = s[i]; if (c >= '0' && c <= '9') c -= '0'; else if (c >= 'A' && c <= 'Z') c -= 'A'-10; else if (c >= 'a' && c <= 'z') c -= 'a'-10; else goto simply_backslash; wc |= (ucs4_t) c << (4 * (5-i)); } if (!(wc >= 0xd800 && wc < 0xe000)) { *pwc = wc; return 6; } if (wc >= 0xdc00) goto simply_backslash; if (n < 7) return RET_TOOFEW(0); if (s[6] != '\\') goto simply_backslash; if (n < 8) return RET_TOOFEW(0); if (s[7] != 'u') goto simply_backslash; wc2 = 0; for (i = 8; i < 12; i++) { if (n <= i) return RET_TOOFEW(0); c = s[i]; if (c >= '0' && c <= '9') c -= '0'; else if (c >= 'A' && c <= 'Z') c -= 'A'-10; else if (c >= 'a' && c <= 'z') c -= 'a'-10; else goto simply_backslash; wc2 |= (ucs4_t) c << (4 * (11-i)); } if (!(wc2 >= 0xdc00 && wc2 < 0xe000)) goto simply_backslash; *pwc = 0x10000 + ((wc - 0xd800) << 10) + (wc2 - 0xdc00); return 12; simply_backslash: *pwc = '\\'; return 1; } static int java_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x80) { *r = wc; return 1; } else if (wc < 0x10000) { if (n >= 6) { unsigned int i; r[0] = '\\'; r[1] = 'u'; i = (wc >> 12) & 0x0f; r[2] = (i < 10 ? '0'+i : 'a'-10+i); i = (wc >> 8) & 0x0f; r[3] = (i < 10 ? '0'+i : 'a'-10+i); i = (wc >> 4) & 0x0f; r[4] = (i < 10 ? '0'+i : 'a'-10+i); i = wc & 0x0f; r[5] = (i < 10 ? '0'+i : 'a'-10+i); return 6; } else return RET_TOOSMALL; } else if (wc < 0x110000) { if (n >= 12) { ucs4_t wc1 = 0xd800 + ((wc - 0x10000) >> 10); ucs4_t wc2 = 0xdc00 + ((wc - 0x10000) & 0x3ff); unsigned int i; r[0] = '\\'; r[1] = 'u'; i = (wc1 >> 12) & 0x0f; r[2] = (i < 10 ? '0'+i : 'a'-10+i); i = (wc1 >> 8) & 0x0f; r[3] = (i < 10 ? '0'+i : 'a'-10+i); i = (wc1 >> 4) & 0x0f; r[4] = (i < 10 ? '0'+i : 'a'-10+i); i = wc1 & 0x0f; r[5] = (i < 10 ? '0'+i : 'a'-10+i); r[6] = '\\'; r[7] = 'u'; i = (wc2 >> 12) & 0x0f; r[8] = (i < 10 ? '0'+i : 'a'-10+i); i = (wc2 >> 8) & 0x0f; r[9] = (i < 10 ? '0'+i : 'a'-10+i); i = (wc2 >> 4) & 0x0f; r[10] = (i < 10 ? '0'+i : 'a'-10+i); i = wc2 & 0x0f; r[11] = (i < 10 ? '0'+i : 'a'-10+i); return 12; } else return RET_TOOSMALL; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/jisx0201.h000066400000000000000000000033071252300335000243610ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * JISX0201.1976-0 */ static int jisx0201_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { if (c == 0x5c) *pwc = (ucs4_t) 0x00a5; else if (c == 0x7e) *pwc = (ucs4_t) 0x203e; else *pwc = (ucs4_t) c; return 1; } else { if (c >= 0xa1 && c < 0xe0) { *pwc = (ucs4_t) c + 0xfec0; return 1; } } return RET_ILSEQ; } static int jisx0201_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x0080 && !(wc == 0x005c || wc == 0x007e)) { *r = wc; return 1; } if (wc == 0x00a5) { *r = 0x5c; return 1; } if (wc == 0x203e) { *r = 0x7e; return 1; } if (wc >= 0xff61 && wc < 0xffa0) { *r = wc - 0xfec0; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/jisx0208.h000066400000000000000000004415221252300335000243750ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * JISX0208.1990-0 */ static const unsigned short jisx0208_2uni_page21[690] = { /* 0x21 */ 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, 0xff3c, 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, 0x2212, 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, /* 0x22 */ 0x25c6, 0x25a1, 0x25a0, 0x25b3, 0x25b2, 0x25bd, 0x25bc, 0x203b, 0x3012, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2208, 0x220b, 0x2286, 0x2287, 0x2282, 0x2283, 0x222a, 0x2229, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2227, 0x2228, 0x00ac, 0x21d2, 0x21d4, 0x2200, 0x2203, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2220, 0x22a5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x226a, 0x226b, 0x221a, 0x223d, 0x221d, 0x2235, 0x222b, 0x222c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x212b, 0x2030, 0x266f, 0x266d, 0x266a, 0x2020, 0x2021, 0x00b6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x25ef, /* 0x23 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x24 */ 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x25 */ 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x26 */ 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x27 */ 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x28 */ 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, }; static const unsigned short jisx0208_2uni_page30[6398] = { /* 0x30 */ 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, /* 0x31 */ 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, /* 0x32 */ 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, /* 0x33 */ 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, /* 0x34 */ 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, /* 0x35 */ 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, /* 0x36 */ 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, /* 0x37 */ 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, /* 0x38 */ 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, /* 0x39 */ 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, /* 0x3a */ 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, /* 0x3b */ 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, /* 0x3c */ 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, /* 0x3d */ 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, /* 0x3e */ 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, /* 0x3f */ 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, /* 0x40 */ 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, /* 0x41 */ 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, /* 0x42 */ 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, /* 0x43 */ 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, /* 0x44 */ 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, /* 0x45 */ 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, /* 0x46 */ 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, /* 0x47 */ 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, /* 0x48 */ 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, /* 0x49 */ 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, /* 0x4a */ 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, /* 0x4b */ 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, /* 0x4c */ 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, /* 0x4d */ 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, /* 0x4e */ 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, /* 0x4f */ 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, 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x50 */ 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, /* 0x51 */ 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, /* 0x52 */ 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, /* 0x53 */ 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, /* 0x54 */ 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, /* 0x55 */ 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, /* 0x56 */ 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, /* 0x57 */ 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, /* 0x58 */ 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, /* 0x59 */ 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, /* 0x5a */ 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, /* 0x5b */ 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, /* 0x5c */ 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, /* 0x5d */ 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, /* 0x5e */ 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, /* 0x5f */ 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, /* 0x60 */ 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, /* 0x61 */ 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, /* 0x62 */ 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, /* 0x63 */ 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, /* 0x64 */ 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, /* 0x65 */ 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, /* 0x66 */ 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, /* 0x67 */ 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, /* 0x68 */ 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, /* 0x69 */ 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, /* 0x6a */ 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, /* 0x6b */ 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, /* 0x6c */ 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, /* 0x6d */ 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, /* 0x6e */ 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, /* 0x6f */ 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, /* 0x70 */ 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, /* 0x71 */ 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, /* 0x72 */ 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, /* 0x73 */ 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, /* 0x74 */ 0x582f, 0x69c7, 0x9059, 0x7464, 0x51dc, 0x7199, }; static int jisx0208_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x21 && c1 <= 0x28) || (c1 >= 0x30 && c1 <= 0x74)) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x21 && c2 < 0x7f) { unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); unsigned short wc = 0xfffd; if (i < 1410) { if (i < 690) wc = jisx0208_2uni_page21[i]; } else { if (i < 7808) wc = jisx0208_2uni_page30[i-1410]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short jisx0208_2charset[6879] = { 0x2171, 0x2172, 0x2178, 0x212f, 0x224c, 0x216b, 0x215e, 0x212d, 0x2279, 0x215f, 0x2160, 0x2621, 0x2622, 0x2623, 0x2624, 0x2625, 0x2626, 0x2627, 0x2628, 0x2629, 0x262a, 0x262b, 0x262c, 0x262d, 0x262e, 0x262f, 0x2630, 0x2631, 0x2632, 0x2633, 0x2634, 0x2635, 0x2636, 0x2637, 0x2638, 0x2641, 0x2642, 0x2643, 0x2644, 0x2645, 0x2646, 0x2647, 0x2648, 0x2649, 0x264a, 0x264b, 0x264c, 0x264d, 0x264e, 0x264f, 0x2650, 0x2651, 0x2652, 0x2653, 0x2654, 0x2655, 0x2656, 0x2657, 0x2658, 0x2727, 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, 0x2757, 0x213e, 0x213d, 0x2142, 0x2146, 0x2147, 0x2148, 0x2149, 0x2277, 0x2278, 0x2145, 0x2144, 0x2273, 0x216c, 0x216d, 0x2228, 0x216e, 0x2272, 0x222b, 0x222c, 0x222a, 0x222d, 0x224d, 0x224e, 0x224f, 0x225f, 0x2250, 0x2260, 0x223a, 0x223b, 0x215d, 0x2265, 0x2267, 0x2167, 0x225c, 0x224a, 0x224b, 0x2241, 0x2240, 0x2269, 0x226a, 0x2168, 0x2268, 0x2266, 0x2262, 0x2162, 0x2261, 0x2165, 0x2166, 0x2263, 0x2264, 0x223e, 0x223f, 0x223c, 0x223d, 0x225d, 0x225e, 0x2821, 0x282c, 0x2822, 0x282d, 0x2823, 0x282e, 0x2824, 0x282f, 0x2826, 0x2831, 0x2825, 0x2830, 0x2827, 0x283c, 0x2837, 0x2832, 0x2829, 0x283e, 0x2839, 0x2834, 0x2828, 0x2838, 0x283d, 0x2833, 0x282a, 0x283a, 0x283f, 0x2835, 0x282b, 0x283b, 0x2840, 0x2836, 0x2223, 0x2222, 0x2225, 0x2224, 0x2227, 0x2226, 0x2221, 0x217e, 0x217b, 0x217d, 0x217c, 0x227e, 0x217a, 0x2179, 0x216a, 0x2169, 0x2276, 0x2275, 0x2274, 0x2121, 0x2122, 0x2123, 0x2137, 0x2139, 0x213a, 0x213b, 0x2152, 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215a, 0x215b, 0x2229, 0x222e, 0x214c, 0x214d, 0x2141, 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, 0x212b, 0x212c, 0x2135, 0x2136, 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, 0x2126, 0x213c, 0x2133, 0x2134, 0x306c, 0x437a, 0x3c37, 0x4b7c, 0x3e66, 0x3b30, 0x3e65, 0x323c, 0x4954, 0x4d3f, 0x5022, 0x312f, 0x336e, 0x5023, 0x4024, 0x5242, 0x3556, 0x4a3a, 0x3e67, 0x4e3e, 0x4a42, 0x5024, 0x4366, 0x5025, 0x367a, 0x5026, 0x345d, 0x4330, 0x3c67, 0x5027, 0x5028, 0x5029, 0x4735, 0x3557, 0x4737, 0x4663, 0x3843, 0x4b33, 0x6949, 0x502a, 0x3e68, 0x502b, 0x3235, 0x3665, 0x3870, 0x4c69, 0x5626, 0x4d70, 0x467d, 0x3425, 0x3535, 0x502c, 0x502d, 0x4e3b, 0x4d3d, 0x4168, 0x502f, 0x3b76, 0x4673, 0x5032, 0x313e, 0x385f, 0x385e, 0x3066, 0x4f4b, 0x4f4a, 0x3a33, 0x3021, 0x5033, 0x5034, 0x5035, 0x4b34, 0x5036, 0x3872, 0x3067, 0x4b72, 0x357c, 0x357d, 0x357e, 0x4462, 0x4e3c, 0x5037, 0x5038, 0x5039, 0x3f4d, 0x3d3a, 0x3f4e, 0x503e, 0x503c, 0x503d, 0x3558, 0x3a23, 0x3270, 0x503b, 0x503a, 0x4a29, 0x3b46, 0x3b45, 0x423e, 0x503f, 0x4955, 0x4067, 0x2138, 0x5040, 0x5042, 0x4265, 0x4e61, 0x304a, 0x5041, 0x323e, 0x3644, 0x4367, 0x376f, 0x5043, 0x4724, 0x346b, 0x5044, 0x304b, 0x3860, 0x346c, 0x497a, 0x4832, 0x3559, 0x3271, 0x5067, 0x4541, 0x476c, 0x5046, 0x483c, 0x4e62, 0x3f2d, 0x3b47, 0x3b77, 0x3240, 0x4451, 0x4322, 0x504a, 0x304c, 0x4463, 0x3d3b, 0x3a34, 0x4d24, 0x424e, 0x323f, 0x5049, 0x4d3e, 0x5045, 0x5047, 0x3a6e, 0x5048, 0x5524, 0x5050, 0x5053, 0x5051, 0x3242, 0x4a3b, 0x504b, 0x504f, 0x3873, 0x3b48, 0x3426, 0x5054, 0x504c, 0x4e63, 0x3b78, 0x504d, 0x5052, 0x5055, 0x504e, 0x3621, 0x304d, 0x3622, 0x3241, 0x5525, 0x4b79, 0x496e, 0x3874, 0x3f2f, 0x4e37, 0x4a58, 0x3738, 0x4225, 0x3264, 0x3d53, 0x5059, 0x505e, 0x505c, 0x5057, 0x422f, 0x505a, 0x505d, 0x505b, 0x4a5d, 0x5058, 0x3f2e, 0x4b73, 0x505f, 0x5060, 0x3d24, 0x506d, 0x4750, 0x4936, 0x5068, 0x4a70, 0x3236, 0x506c, 0x5066, 0x506f, 0x4152, 0x3844, 0x475c, 0x6047, 0x506e, 0x455d, 0x5063, 0x3876, 0x3875, 0x5061, 0x3c5a, 0x5069, 0x4a6f, 0x434d, 0x5065, 0x3771, 0x5062, 0x506a, 0x5064, 0x4e51, 0x506b, 0x4f41, 0x3666, 0x3770, 0x5070, 0x5071, 0x5075, 0x304e, 0x4a50, 0x5074, 0x5073, 0x5077, 0x5076, 0x4464, 0x3772, 0x5078, 0x3c45, 0x4226, 0x4465, 0x3676, 0x5079, 0x3536, 0x507a, 0x507c, 0x4b35, 0x3766, 0x3b31, 0x4877, 0x507b, 0x3a45, 0x4d43, 0x507e, 0x5123, 0x507d, 0x3a44, 0x3d7d, 0x3739, 0x5124, 0x364f, 0x5121, 0x5122, 0x462f, 0x417c, 0x3623, 0x4b4d, 0x5125, 0x4e3d, 0x5126, 0x5129, 0x5127, 0x414e, 0x5128, 0x512a, 0x512c, 0x512b, 0x4a48, 0x3537, 0x512e, 0x512f, 0x322f, 0x512d, 0x3c74, 0x5132, 0x5131, 0x5130, 0x5056, 0x5133, 0x3d7e, 0x5134, 0x4d25, 0x4c59, 0x5136, 0x5135, 0x5138, 0x5137, 0x5139, 0x513a, 0x3074, 0x3835, 0x373b, 0x3d3c, 0x437b, 0x3624, 0x4068, 0x3877, 0x396e, 0x513c, 0x4c48, 0x4546, 0x3b79, 0x513b, 0x513d, 0x455e, 0x3375, 0x513e, 0x467e, 0x4134, 0x5140, 0x5141, 0x482c, 0x3878, 0x4f3b, 0x5142, 0x3626, 0x4a3c, 0x4236, 0x3671, 0x4535, 0x3773, 0x5143, 0x5144, 0x4662, 0x315f, 0x5147, 0x3a7d, 0x5146, 0x3a46, 0x5148, 0x666e, 0x5149, 0x4b41, 0x514a, 0x514b, 0x514c, 0x3e69, 0x3c4c, 0x3427, 0x514f, 0x514d, 0x4c3d, 0x514e, 0x495a, 0x5150, 0x5151, 0x5152, 0x455f, 0x5156, 0x5154, 0x5155, 0x5153, 0x3a63, 0x5157, 0x4c6a, 0x4e64, 0x5158, 0x4028, 0x5159, 0x3d5a, 0x515a, 0x437c, 0x4e3f, 0x4560, 0x5245, 0x515b, 0x7425, 0x3645, 0x515c, 0x4b5e, 0x3d68, 0x427c, 0x515e, 0x4664, 0x515f, 0x5160, 0x332e, 0x5161, 0x3627, 0x464c, 0x317a, 0x3d50, 0x4821, 0x5162, 0x4561, 0x3f4f, 0x5163, 0x4a2c, 0x405a, 0x3422, 0x3429, 0x5164, 0x5166, 0x373a, 0x5165, 0x4e73, 0x3d69, 0x483d, 0x4a4c, 0x5167, 0x4d78, 0x5168, 0x5169, 0x457e, 0x516a, 0x4029, 0x3a7e, 0x3774, 0x516b, 0x3b49, 0x396f, 0x4466, 0x516d, 0x4227, 0x3a6f, 0x516e, 0x516f, 0x4130, 0x516c, 0x5171, 0x4b36, 0x3964, 0x5170, 0x3775, 0x3a5e, 0x476d, 0x5174, 0x5172, 0x497b, 0x3e6a, 0x517b, 0x3364, 0x5175, 0x5173, 0x414f, 0x5177, 0x5176, 0x3344, 0x3760, 0x517c, 0x4e2d, 0x5178, 0x517d, 0x517a, 0x5179, 0x4e4f, 0x3879, 0x3243, 0x4e74, 0x3d75, 0x4558, 0x3965, 0x5222, 0x5223, 0x4e65, 0x4f2b, 0x5225, 0x387a, 0x5224, 0x332f, 0x5226, 0x4b56, 0x443c, 0x4d26, 0x4a59, 0x5227, 0x7055, 0x4630, 0x5228, 0x342a, 0x4c33, 0x3e21, 0x5229, 0x4a67, 0x522d, 0x402a, 0x522a, 0x3650, 0x522b, 0x342b, 0x372e, 0x522e, 0x522f, 0x5230, 0x5231, 0x3c5b, 0x387b, 0x4c5e, 0x4c68, 0x4677, 0x4a71, 0x5232, 0x5233, 0x5235, 0x5237, 0x5236, 0x5238, 0x323d, 0x4b4c, 0x3a7c, 0x5239, 0x4159, 0x3e22, 0x3629, 0x523a, 0x485b, 0x523b, 0x523c, 0x523d, 0x523e, 0x4924, 0x3668, 0x3065, 0x463f, 0x523f, 0x3d3d, 0x4069, 0x5241, 0x5240, 0x3e23, 0x3861, 0x5243, 0x483e, 0x5244, 0x485c, 0x4234, 0x426e, 0x3628, 0x466e, 0x4331, 0x476e, 0x4b4e, 0x5246, 0x406a, 0x3735, 0x5247, 0x5248, 0x312c, 0x3075, 0x346d, 0x4228, 0x3551, 0x4d71, 0x524b, 0x3237, 0x524a, 0x362a, 0x524c, 0x4c71, 0x524d, 0x4e52, 0x387c, 0x3836, 0x524e, 0x5250, 0x524f, 0x3f5f, 0x3139, 0x315e, 0x5251, 0x5252, 0x3837, 0x5253, 0x356e, 0x3b32, 0x5254, 0x4b74, 0x3a35, 0x355a, 0x4d27, 0x4150, 0x483f, 0x3c7d, 0x3d47, 0x3c68, 0x3c75, 0x3d76, 0x4840, 0x5257, 0x3143, 0x4151, 0x387d, 0x3845, 0x3667, 0x525b, 0x4321, 0x427e, 0x362b, 0x3e24, 0x525c, 0x525a, 0x3244, 0x4266, 0x3c38, 0x3b4b, 0x3126, 0x3370, 0x3966, 0x3b4a, 0x525d, 0x525e, 0x3549, 0x3346, 0x3967, 0x3548, 0x445f, 0x3125, 0x4631, 0x4c3e, 0x3921, 0x4d79, 0x4547, 0x387e, 0x372f, 0x5267, 0x3663, 0x4b4a, 0x485d, 0x5266, 0x345e, 0x5261, 0x5262, 0x5264, 0x5265, 0x355b, 0x3f61, 0x4a2d, 0x5263, 0x525f, 0x3863, 0x5260, 0x4f24, 0x4a72, 0x4468, 0x3862, 0x3970, 0x5268, 0x465d, 0x526c, 0x3c7e, 0x3c76, 0x526f, 0x526d, 0x4c23, 0x526a, 0x5273, 0x526e, 0x5271, 0x3846, 0x4c3f, 0x5272, 0x5274, 0x5276, 0x3a70, 0x4f42, 0x526b, 0x5269, 0x5275, 0x5270, 0x5278, 0x5323, 0x527a, 0x527e, 0x5321, 0x527b, 0x533e, 0x3a69, 0x3331, 0x5279, 0x5325, 0x3076, 0x5324, 0x3025, 0x494a, 0x5322, 0x527c, 0x5277, 0x527d, 0x3a48, 0x5326, 0x3077, 0x532f, 0x5327, 0x5328, 0x3e25, 0x4b69, 0x532d, 0x532c, 0x452f, 0x532e, 0x532b, 0x3134, 0x3a36, 0x3f30, 0x5329, 0x4562, 0x532a, 0x3022, 0x5334, 0x4d23, 0x3e27, 0x533a, 0x5339, 0x5330, 0x4243, 0x5331, 0x426f, 0x5336, 0x3e26, 0x5333, 0x4c64, 0x373c, 0x5337, 0x5338, 0x5335, 0x533b, 0x5332, 0x5341, 0x5346, 0x5342, 0x533d, 0x5347, 0x4131, 0x5349, 0x3922, 0x533f, 0x437d, 0x5343, 0x533c, 0x342d, 0x346e, 0x3365, 0x5344, 0x5340, 0x3776, 0x534a, 0x5348, 0x4153, 0x354a, 0x362c, 0x5345, 0x3674, 0x3144, 0x534e, 0x534c, 0x5427, 0x5351, 0x534b, 0x534f, 0x534d, 0x3b4c, 0x5350, 0x5353, 0x5358, 0x5356, 0x5355, 0x4332, 0x3245, 0x5352, 0x5354, 0x3e28, 0x3133, 0x5357, 0x325e, 0x5362, 0x3e7c, 0x535e, 0x535c, 0x535d, 0x535f, 0x313d, 0x4139, 0x5359, 0x535a, 0x337a, 0x5361, 0x346f, 0x5364, 0x5360, 0x5363, 0x4a2e, 0x4655, 0x4838, 0x5366, 0x5365, 0x3345, 0x5367, 0x536a, 0x5369, 0x5368, 0x4739, 0x536b, 0x536c, 0x536e, 0x536d, 0x5370, 0x5373, 0x5371, 0x536f, 0x5372, 0x5374, 0x5375, 0x5376, 0x5377, 0x5378, 0x5145, 0x3c7c, 0x3b4d, 0x3273, 0x3078, 0x4344, 0x5379, 0x3a24, 0x304f, 0x3f5e, 0x537a, 0x3847, 0x3971, 0x537c, 0x537b, 0x4a60, 0x537d, 0x5421, 0x537e, 0x5422, 0x5423, 0x3777, 0x3160, 0x5424, 0x5426, 0x5425, 0x5428, 0x455a, 0x5429, 0x3035, 0x3a5f, 0x373d, 0x434f, 0x542a, 0x542b, 0x542d, 0x542e, 0x3a64, 0x3651, 0x4b37, 0x542c, 0x542f, 0x3a41, 0x3923, 0x5433, 0x3a25, 0x4333, 0x5430, 0x445a, 0x5434, 0x3f62, 0x5432, 0x5435, 0x373f, 0x5436, 0x5437, 0x3924, 0x3340, 0x5439, 0x543a, 0x543b, 0x5438, 0x5431, 0x543c, 0x543d, 0x4b64, 0x3e6b, 0x543f, 0x5440, 0x543e, 0x5442, 0x4738, 0x3068, 0x4956, 0x5443, 0x3e7d, 0x3c39, 0x475d, 0x3470, 0x3a6b, 0x4b59, 0x4632, 0x3778, 0x424f, 0x5441, 0x5444, 0x4244, 0x5445, 0x5446, 0x5448, 0x4469, 0x342e, 0x7421, 0x3161, 0x4a73, 0x3e6c, 0x4548, 0x3a66, 0x544e, 0x4a3d, 0x4e5d, 0x3274, 0x544a, 0x413a, 0x544d, 0x4563, 0x4549, 0x4564, 0x4839, 0x444d, 0x3a49, 0x5449, 0x3176, 0x4536, 0x544b, 0x5447, 0x3f50, 0x544f, 0x3d4e, 0x362d, 0x5450, 0x4a68, 0x417d, 0x4446, 0x5452, 0x4b4f, 0x5453, 0x5458, 0x4a2f, 0x5457, 0x5451, 0x5454, 0x5456, 0x3a26, 0x4a49, 0x5459, 0x4345, 0x3275, 0x3e6d, 0x545b, 0x545a, 0x3968, 0x545c, 0x545e, 0x545d, 0x5460, 0x5455, 0x5462, 0x5461, 0x545f, 0x3b4e, 0x3f51, 0x4154, 0x5463, 0x403c, 0x306d, 0x4764, 0x445b, 0x5465, 0x5464, 0x5466, 0x5467, 0x5468, 0x5469, 0x4a51, 0x546a, 0x3246, 0x546b, 0x4d3c, 0x3330, 0x5249, 0x3d48, 0x423f, 0x546c, 0x4c6b, 0x4c34, 0x546e, 0x4267, 0x4537, 0x4240, 0x4957, 0x546f, 0x5470, 0x317b, 0x3c3a, 0x5471, 0x3050, 0x5472, 0x5473, 0x3162, 0x3471, 0x4660, 0x4a74, 0x5477, 0x4155, 0x5476, 0x3740, 0x4b5b, 0x5475, 0x4565, 0x5479, 0x5478, 0x547b, 0x547a, 0x317c, 0x547c, 0x3e29, 0x547e, 0x4325, 0x547d, 0x4a33, 0x3d77, 0x455b, 0x5521, 0x3925, 0x5522, 0x4721, 0x485e, 0x4c51, 0x4725, 0x552b, 0x3538, 0x4d45, 0x4c2f, 0x562c, 0x5523, 0x5526, 0x4245, 0x4b38, 0x454a, 0x5527, 0x4b65, 0x3a4a, 0x3e2a, 0x5528, 0x3b50, 0x3b4f, 0x3039, 0x3848, 0x402b, 0x3051, 0x552c, 0x552d, 0x552a, 0x3138, 0x342f, 0x5529, 0x4c45, 0x4931, 0x3028, 0x3079, 0x3b51, 0x3052, 0x3023, 0x5532, 0x5530, 0x4c3c, 0x5533, 0x5531, 0x552f, 0x3f31, 0x552e, 0x4a5a, 0x3864, 0x5537, 0x5538, 0x3e2b, 0x5534, 0x4f2c, 0x474c, 0x5536, 0x3a27, 0x5539, 0x4958, 0x553a, 0x5535, 0x4c3b, 0x475e, 0x553b, 0x4932, 0x553c, 0x5540, 0x553d, 0x3247, 0x553f, 0x3c3b, 0x553e, 0x3779, 0x554c, 0x5545, 0x5542, 0x4364, 0x5541, 0x5543, 0x5544, 0x5546, 0x5547, 0x3472, 0x5549, 0x5548, 0x554a, 0x3e6e, 0x554d, 0x445c, 0x3145, 0x554b, 0x554e, 0x554f, 0x5552, 0x5550, 0x5551, 0x3b52, 0x5553, 0x3926, 0x5554, 0x3b7a, 0x4238, 0x5555, 0x5556, 0x3b5a, 0x3927, 0x4c52, 0x3528, 0x3849, 0x5557, 0x3358, 0x5558, 0x4239, 0x5559, 0x5623, 0x555a, 0x555b, 0x555c, 0x555e, 0x555f, 0x5560, 0x4270, 0x3127, 0x3c69, 0x3042, 0x4157, 0x3430, 0x3c35, 0x3928, 0x4566, 0x3d21, 0x3431, 0x4368, 0x446a, 0x3038, 0x3539, 0x4a75, 0x3c42, 0x3552, 0x406b, 0x3c3c, 0x4d28, 0x5561, 0x355c, 0x3a4b, 0x3332, 0x3163, 0x3e2c, 0x3248, 0x5562, 0x4d46, 0x3d49, 0x3c64, 0x5563, 0x3473, 0x4652, 0x4c29, 0x5564, 0x5565, 0x4959, 0x5567, 0x3428, 0x3677, 0x5566, 0x3432, 0x3f32, 0x556b, 0x3b21, 0x3249, 0x556a, 0x5568, 0x556c, 0x5569, 0x472b, 0x5c4d, 0x3f33, 0x556d, 0x4e40, 0x556e, 0x5570, 0x437e, 0x556f, 0x4023, 0x3b7b, 0x4250, 0x3c77, 0x4975, 0x406c, 0x3c4d, 0x5571, 0x3e2d, 0x5572, 0x5573, 0x3053, 0x423a, 0x3f52, 0x5574, 0x4633, 0x3e2e, 0x3e2f, 0x5575, 0x406d, 0x3e30, 0x5576, 0x5577, 0x4c60, 0x5578, 0x3646, 0x3d22, 0x5579, 0x557a, 0x3c5c, 0x3f2c, 0x4674, 0x3f54, 0x4878, 0x4722, 0x3649, 0x557b, 0x356f, 0x557c, 0x367e, 0x464f, 0x3230, 0x3b53, 0x557d, 0x5622, 0x5621, 0x367d, 0x557e, 0x4538, 0x4230, 0x454b, 0x3c48, 0x4158, 0x4d7a, 0x5624, 0x5625, 0x4656, 0x3b33, 0x5627, 0x5628, 0x5629, 0x3474, 0x562a, 0x562b, 0x322c, 0x413b, 0x3464, 0x562d, 0x4c28, 0x4252, 0x3359, 0x562f, 0x5631, 0x345f, 0x562e, 0x5630, 0x5633, 0x5632, 0x5634, 0x5635, 0x463d, 0x362e, 0x3265, 0x5636, 0x563b, 0x5639, 0x4a77, 0x4a76, 0x4567, 0x5638, 0x3d54, 0x5637, 0x3f72, 0x563c, 0x3a6a, 0x5642, 0x5643, 0x563d, 0x3333, 0x563e, 0x5647, 0x5646, 0x5645, 0x5641, 0x5640, 0x5644, 0x4a78, 0x564b, 0x5648, 0x564a, 0x4d72, 0x5649, 0x563f, 0x3f73, 0x564c, 0x3a37, 0x564d, 0x564e, 0x5651, 0x5650, 0x564f, 0x4568, 0x563a, 0x5657, 0x5653, 0x5652, 0x5654, 0x5655, 0x5658, 0x4e66, 0x5659, 0x5656, 0x565a, 0x3460, 0x565b, 0x565d, 0x565c, 0x565e, 0x565f, 0x406e, 0x3d23, 0x3d64, 0x4163, 0x3929, 0x3a38, 0x392a, 0x3570, 0x5660, 0x3a39, 0x384a, 0x5661, 0x4c26, 0x4743, 0x5662, 0x392b, 0x342c, 0x4327, 0x3652, 0x3b54, 0x495b, 0x4841, 0x5663, 0x3475, 0x5666, 0x4421, 0x5665, 0x5664, 0x5667, 0x446b, 0x3f63, 0x3b55, 0x404a, 0x4253, 0x3522, 0x4422, 0x5668, 0x5669, 0x3e6f, 0x4b39, 0x566c, 0x566b, 0x566a, 0x497d, 0x5673, 0x4b5a, 0x566d, 0x566f, 0x4b6b, 0x566e, 0x5670, 0x4828, 0x5671, 0x4a3e, 0x5672, 0x3433, 0x4a3f, 0x472f, 0x5674, 0x5675, 0x392c, 0x3434, 0x5676, 0x3838, 0x4d44, 0x4d29, 0x3476, 0x5678, 0x4423, 0x392d, 0x3e31, 0x485f, 0x3e32, 0x3d78, 0x446c, 0x4a79, 0x4539, 0x392e, 0x495c, 0x5679, 0x4559, 0x3a42, 0x384b, 0x446d, 0x3043, 0x3d6e, 0x392f, 0x4d47, 0x567a, 0x567b, 0x4751, 0x567c, 0x4e77, 0x4f2d, 0x567e, 0x567d, 0x3347, 0x5721, 0x5724, 0x5725, 0x5723, 0x4940, 0x3e33, 0x5727, 0x5726, 0x5722, 0x5728, 0x5729, 0x572a, 0x572d, 0x572b, 0x572c, 0x572e, 0x3164, 0x446e, 0x572f, 0x377a, 0x3276, 0x4736, 0x5730, 0x467b, 0x4a5b, 0x5731, 0x4f2e, 0x5732, 0x4a40, 0x5735, 0x5021, 0x5031, 0x3c30, 0x4675, 0x5736, 0x355d, 0x4424, 0x307a, 0x5737, 0x4a26, 0x3930, 0x4350, 0x446f, 0x4c6f, 0x3839, 0x384c, 0x5738, 0x5739, 0x573f, 0x3c65, 0x4425, 0x362f, 0x573a, 0x492b, 0x4346, 0x573b, 0x573c, 0x3630, 0x573d, 0x573e, 0x5740, 0x4576, 0x5741, 0x5742, 0x5743, 0x5734, 0x5733, 0x5744, 0x3741, 0x4927, 0x3a4c, 0x4937, 0x4426, 0x494b, 0x5745, 0x3e34, 0x3146, 0x5746, 0x5747, 0x4c72, 0x4860, 0x574a, 0x317d, 0x402c, 0x5749, 0x5748, 0x3742, 0x4254, 0x574e, 0x574c, 0x574b, 0x4e27, 0x3865, 0x3d79, 0x574d, 0x454c, 0x3d3e, 0x4640, 0x5751, 0x5750, 0x574f, 0x5752, 0x3866, 0x5753, 0x497c, 0x3d5b, 0x5754, 0x4879, 0x4641, 0x4427, 0x4530, 0x5755, 0x352b, 0x3f34, 0x492c, 0x3477, 0x4726, 0x5756, 0x3b56, 0x4b3a, 0x4b3b, 0x317e, 0x575b, 0x4369, 0x5758, 0x3277, 0x582d, 0x575a, 0x4730, 0x5759, 0x5757, 0x397a, 0x575d, 0x5763, 0x5769, 0x5761, 0x455c, 0x5766, 0x495d, 0x5760, 0x5765, 0x4e67, 0x3b57, 0x4255, 0x575e, 0x355e, 0x5768, 0x402d, 0x3165, 0x5762, 0x3278, 0x5767, 0x3631, 0x5764, 0x576a, 0x576c, 0x5776, 0x5774, 0x5771, 0x5770, 0x4e78, 0x5772, 0x3632, 0x3931, 0x3d7a, 0x5779, 0x576b, 0x576f, 0x575f, 0x327a, 0x5773, 0x5775, 0x4351, 0x3a28, 0x3238, 0x576d, 0x5778, 0x5777, 0x3633, 0x4229, 0x3366, 0x3743, 0x576e, 0x577a, 0x577d, 0x5821, 0x3c3d, 0x5827, 0x4470, 0x577b, 0x5825, 0x3279, 0x5823, 0x5824, 0x577e, 0x5822, 0x3867, 0x4d2a, 0x3435, 0x3159, 0x5826, 0x473a, 0x302d, 0x4861, 0x575c, 0x582c, 0x5830, 0x4c65, 0x5829, 0x4569, 0x582e, 0x3e70, 0x582f, 0x4657, 0x4f47, 0x582b, 0x5831, 0x397b, 0x404b, 0x3054, 0x582a, 0x5828, 0x415a, 0x577c, 0x3b34, 0x4246, 0x583d, 0x415b, 0x5838, 0x5835, 0x5836, 0x3c66, 0x5839, 0x583c, 0x5837, 0x3d25, 0x583a, 0x5834, 0x4c7c, 0x4c7b, 0x583e, 0x583f, 0x3055, 0x5833, 0x3672, 0x3026, 0x3436, 0x583b, 0x5843, 0x5842, 0x5847, 0x5848, 0x5846, 0x5849, 0x5841, 0x5845, 0x584a, 0x584b, 0x5840, 0x3b7c, 0x5844, 0x4256, 0x3932, 0x5832, 0x3f35, 0x5858, 0x4a69, 0x584e, 0x584f, 0x5850, 0x5857, 0x5856, 0x4b7d, 0x3437, 0x5854, 0x3745, 0x3334, 0x5851, 0x4e38, 0x5853, 0x3056, 0x5855, 0x584c, 0x5852, 0x5859, 0x3744, 0x584d, 0x4d5d, 0x4d2b, 0x585c, 0x5860, 0x417e, 0x4e79, 0x5861, 0x585e, 0x585b, 0x585a, 0x585f, 0x4a30, 0x4634, 0x3746, 0x5862, 0x585d, 0x5863, 0x377b, 0x3231, 0x586b, 0x3438, 0x5869, 0x586a, 0x3a29, 0x5868, 0x5866, 0x5865, 0x586c, 0x5864, 0x586e, 0x327b, 0x5870, 0x586f, 0x4428, 0x5873, 0x5871, 0x5867, 0x377c, 0x5872, 0x5876, 0x5875, 0x5877, 0x5874, 0x5878, 0x5879, 0x587a, 0x4a6a, 0x587c, 0x587b, 0x3d3f, 0x402e, 0x3266, 0x327c, 0x587d, 0x303f, 0x404c, 0x587e, 0x6c43, 0x5921, 0x3761, 0x5922, 0x406f, 0x5923, 0x5924, 0x353a, 0x5925, 0x5926, 0x5927, 0x4257, 0x384d, 0x4c61, 0x4b3c, 0x3d6a, 0x5928, 0x4070, 0x6e3d, 0x4862, 0x3c6a, 0x3a4d, 0x5929, 0x4247, 0x4a27, 0x4271, 0x592c, 0x592a, 0x592d, 0x592b, 0x592e, 0x4a31, 0x3037, 0x495e, 0x4863, 0x592f, 0x5932, 0x3e35, 0x353b, 0x5930, 0x5937, 0x3e36, 0x5931, 0x4744, 0x4d5e, 0x5933, 0x5934, 0x5938, 0x456a, 0x5935, 0x3933, 0x405e, 0x5946, 0x4834, 0x4272, 0x4864, 0x5a2d, 0x4a7a, 0x4471, 0x4b75, 0x593b, 0x3221, 0x436a, 0x5944, 0x4334, 0x593e, 0x5945, 0x5940, 0x5947, 0x5943, 0x5942, 0x476f, 0x593c, 0x327d, 0x593a, 0x3571, 0x4273, 0x5936, 0x5939, 0x3934, 0x405b, 0x3e37, 0x5941, 0x4752, 0x3572, 0x3348, 0x3367, 0x3f21, 0x5949, 0x594e, 0x594a, 0x377d, 0x594f, 0x3b22, 0x3969, 0x3d26, 0x593d, 0x3b7d, 0x594c, 0x3b58, 0x594d, 0x3044, 0x5948, 0x4429, 0x3573, 0x3634, 0x594b, 0x3027, 0x3a43, 0x3f36, 0x4472, 0x4854, 0x5951, 0x415e, 0x422a, 0x3b2b, 0x5952, 0x5954, 0x5950, 0x4a61, 0x443d, 0x415c, 0x4a7b, 0x3c4e, 0x5960, 0x595f, 0x3f78, 0x377e, 0x5959, 0x3e39, 0x4668, 0x4731, 0x5957, 0x415d, 0x3c78, 0x595c, 0x3e38, 0x5956, 0x595b, 0x4753, 0x5955, 0x3721, 0x335d, 0x595d, 0x4e2b, 0x3a4e, 0x4335, 0x595a, 0x405c, 0x3935, 0x3f64, 0x3166, 0x413c, 0x5958, 0x3545, 0x3747, 0x444f, 0x595e, 0x415f, 0x5961, 0x5963, 0x4237, 0x5969, 0x5964, 0x5966, 0x4941, 0x4473, 0x5967, 0x4d2c, 0x4d48, 0x3439, 0x302e, 0x5965, 0x5962, 0x3478, 0x3167, 0x5968, 0x4d49, 0x596c, 0x423b, 0x5973, 0x596d, 0x596a, 0x5971, 0x5953, 0x596e, 0x5972, 0x4842, 0x456b, 0x596b, 0x596f, 0x3748, 0x3a71, 0x405d, 0x5977, 0x4526, 0x5974, 0x4b60, 0x5975, 0x5976, 0x4c4e, 0x4022, 0x3762, 0x597d, 0x3b35, 0x597a, 0x5979, 0x4732, 0x4635, 0x4531, 0x597b, 0x597c, 0x496f, 0x4745, 0x3b23, 0x4071, 0x4b50, 0x3349, 0x5a25, 0x597e, 0x4d4a, 0x5a27, 0x5a23, 0x5a24, 0x4160, 0x5a22, 0x593f, 0x5a26, 0x5a21, 0x5a2b, 0x5a2c, 0x4527, 0x5a2e, 0x3b24, 0x5a29, 0x353c, 0x5a2f, 0x5a28, 0x5a33, 0x5a32, 0x5a31, 0x5a34, 0x5a36, 0x3e71, 0x5a35, 0x5a39, 0x5a37, 0x5a38, 0x5970, 0x5a3b, 0x5a3a, 0x5978, 0x5a3c, 0x5a30, 0x3b59, 0x5a3d, 0x5a3e, 0x5a40, 0x5a3f, 0x5a41, 0x327e, 0x3936, 0x4a7c, 0x402f, 0x384e, 0x5a43, 0x5a46, 0x4952, 0x355f, 0x5a45, 0x5a44, 0x4754, 0x5a47, 0x3635, 0x5a49, 0x5a48, 0x343a, 0x3b36, 0x4658, 0x3749, 0x3f74, 0x5a4a, 0x4030, 0x4528, 0x495f, 0x5a4b, 0x5a4c, 0x5a4d, 0x4a38, 0x555d, 0x4046, 0x494c, 0x3a58, 0x4865, 0x4843, 0x454d, 0x4e41, 0x5a4f, 0x3c50, 0x5a50, 0x3036, 0x3654, 0x404d, 0x4960, 0x5a51, 0x3b42, 0x4347, 0x3b5b, 0x3f37, 0x5a52, 0x4a7d, 0x3177, 0x3b5c, 0x5a55, 0x5a53, 0x5a56, 0x4e39, 0x5a54, 0x407b, 0x5a57, 0x4232, 0x5a58, 0x347a, 0x5a5a, 0x5a59, 0x5a5b, 0x5a5c, 0x347b, 0x467c, 0x4336, 0x356c, 0x3b5d, 0x4161, 0x3d5c, 0x3030, 0x5a5d, 0x3222, 0x5a61, 0x3937, 0x5a60, 0x3a2b, 0x3e3a, 0x5a5f, 0x3e3b, 0x4c40, 0x3a2a, 0x3057, 0x404e, 0x5a66, 0x4031, 0x3147, 0x3d55, 0x4b66, 0x3a72, 0x3e3c, 0x4027, 0x5a65, 0x5a63, 0x5a64, 0x436b, 0x5b26, 0x5a6a, 0x3b7e, 0x3938, 0x5a68, 0x5a69, 0x3f38, 0x5a67, 0x3b2f, 0x5a6c, 0x5a6b, 0x5a70, 0x5a71, 0x5a6d, 0x3322, 0x5a6e, 0x5a6f, 0x4855, 0x4961, 0x374a, 0x5a72, 0x4032, 0x3e3d, 0x4352, 0x3647, 0x5a73, 0x5a77, 0x324b, 0x5a74, 0x5a76, 0x5a75, 0x3d6b, 0x4348, 0x3045, 0x5a78, 0x5a79, 0x442a, 0x4e71, 0x3b43, 0x4a6b, 0x4b3d, 0x5b22, 0x5a7b, 0x5a7e, 0x5a7d, 0x5a7a, 0x5b21, 0x465e, 0x5a7c, 0x5b23, 0x3d6c, 0x5b24, 0x4d4b, 0x4778, 0x5b25, 0x5b27, 0x5b28, 0x5b29, 0x364a, 0x3148, 0x3939, 0x5b2a, 0x5b2b, 0x3d71, 0x4162, 0x5258, 0x413e, 0x413d, 0x4258, 0x3a47, 0x5072, 0x376e, 0x4d2d, 0x4a7e, 0x497e, 0x5b2c, 0x3a73, 0x443f, 0x5b2d, 0x4f2f, 0x4b3e, 0x442b, 0x5b2e, 0x347c, 0x5b2f, 0x5b30, 0x4c5a, 0x4c24, 0x4b76, 0x4b5c, 0x3b25, 0x5b32, 0x3c6b, 0x4b51, 0x5b34, 0x5b37, 0x5b36, 0x3479, 0x3560, 0x5b33, 0x5b35, 0x5b38, 0x3f79, 0x4d7b, 0x3049, 0x3a60, 0x423c, 0x3c5d, 0x3e73, 0x5b3b, 0x454e, 0x5b39, 0x422b, 0x5b3a, 0x3e72, 0x4c5d, 0x5b3c, 0x5b3d, 0x4d68, 0x5b42, 0x393a, 0x4755, 0x5b3f, 0x456c, 0x5a5e, 0x5a62, 0x354f, 0x4747, 0x5b41, 0x3e3e, 0x4844, 0x5b47, 0x487a, 0x5b3e, 0x5b44, 0x5b43, 0x404f, 0x4b6d, 0x4e53, 0x4b67, 0x324c, 0x3b5e, 0x4f48, 0x5b46, 0x3f75, 0x5b45, 0x5b40, 0x384f, 0x5b4c, 0x5b4a, 0x324d, 0x5b48, 0x5b4e, 0x5b54, 0x4248, 0x4a41, 0x5b56, 0x4922, 0x5b55, 0x4770, 0x4b3f, 0x343b, 0x4077, 0x3d40, 0x4453, 0x4d2e, 0x5b51, 0x5b50, 0x5b52, 0x5b4f, 0x5b57, 0x5b4d, 0x5b4b, 0x5b53, 0x5b49, 0x436c, 0x4c78, 0x3c46, 0x3a74, 0x3a3a, 0x4b6f, 0x3341, 0x444e, 0x464a, 0x3149, 0x4072, 0x4034, 0x372a, 0x5b59, 0x393b, 0x337c, 0x5b5b, 0x3374, 0x5b61, 0x5b5e, 0x4073, 0x334b, 0x3a2c, 0x334a, 0x3a4f, 0x5b5c, 0x3765, 0x374b, 0x456d, 0x5b5a, 0x3046, 0x5b5d, 0x5b5f, 0x364d, 0x372c, 0x343c, 0x354b, 0x5b62, 0x3a79, 0x4b71, 0x3b37, 0x5b63, 0x4930, 0x5b6f, 0x3233, 0x5b64, 0x5b75, 0x5b65, 0x4e42, 0x5b6c, 0x475f, 0x5b74, 0x5b67, 0x3034, 0x5b69, 0x393c, 0x5b6b, 0x5b6a, 0x5b66, 0x5b71, 0x3e3f, 0x546d, 0x3868, 0x4d7c, 0x5b68, 0x4474, 0x3323, 0x3a2d, 0x5b60, 0x5b70, 0x3361, 0x5b6e, 0x5b72, 0x456e, 0x347e, 0x5c32, 0x4c49, 0x5b77, 0x347d, 0x5b7e, 0x4b40, 0x5c21, 0x5c23, 0x5c27, 0x5b79, 0x432a, 0x456f, 0x5c2b, 0x5b7c, 0x5c28, 0x5c22, 0x3f39, 0x5c2c, 0x4033, 0x5c2a, 0x343d, 0x4f50, 0x5b76, 0x5c26, 0x3058, 0x5b78, 0x4c3a, 0x5b7d, 0x3f22, 0x4447, 0x5b73, 0x5c25, 0x3f7a, 0x5c2f, 0x3371, 0x3821, 0x5c31, 0x5b7a, 0x5c30, 0x5c29, 0x5b7b, 0x5c2d, 0x5c2e, 0x5c3f, 0x464e, 0x5c24, 0x5c3b, 0x5c3d, 0x4458, 0x4d4c, 0x4976, 0x5c38, 0x424a, 0x5c3e, 0x413f, 0x5c35, 0x5c42, 0x5c41, 0x466f, 0x5c40, 0x466a, 0x5c44, 0x5c37, 0x3648, 0x5c3a, 0x3d5d, 0x4760, 0x5c3c, 0x364b, 0x5c34, 0x5c36, 0x5c33, 0x4f30, 0x335a, 0x5c39, 0x5c43, 0x3335, 0x3a67, 0x315d, 0x5c54, 0x4f31, 0x5c57, 0x3f3a, 0x5c56, 0x5c55, 0x5c52, 0x5c46, 0x5c63, 0x5c45, 0x5c58, 0x5c50, 0x5c4b, 0x5c48, 0x5c49, 0x5c51, 0x7422, 0x5c4e, 0x393d, 0x4448, 0x4164, 0x5c4c, 0x5c47, 0x5c4a, 0x4d4d, 0x4b6a, 0x5c4f, 0x5c59, 0x5c61, 0x5c5a, 0x5c67, 0x5c65, 0x5c60, 0x5c5f, 0x4450, 0x4165, 0x5c5d, 0x5c5b, 0x5c62, 0x5c68, 0x4875, 0x5c6e, 0x5c69, 0x5c6c, 0x5c66, 0x4374, 0x4938, 0x5c5c, 0x5c64, 0x3e40, 0x4c4f, 0x5c78, 0x5c6b, 0x3822, 0x3223, 0x335f, 0x5c53, 0x3e41, 0x5c70, 0x5c77, 0x3c79, 0x3372, 0x432e, 0x5c6d, 0x5c72, 0x5c76, 0x3636, 0x354c, 0x5c74, 0x3521, 0x464b, 0x5c73, 0x5c75, 0x5c6f, 0x5c71, 0x3360, 0x4349, 0x5c7c, 0x5c7a, 0x3869, 0x5c79, 0x5d21, 0x5b58, 0x5c7b, 0x5c7d, 0x5c7e, 0x5d2c, 0x5d28, 0x5b6d, 0x5d27, 0x5d26, 0x5d23, 0x5c6a, 0x5d25, 0x5d24, 0x5d2a, 0x4f26, 0x5d2d, 0x367b, 0x5d29, 0x5d2b, 0x4827, 0x5d2e, 0x5d32, 0x5d2f, 0x4d73, 0x5d30, 0x5c5e, 0x5d33, 0x5d34, 0x3135, 0x5d36, 0x3767, 0x3c21, 0x3655, 0x3224, 0x4d5f, 0x5d38, 0x5d37, 0x5d3a, 0x353d, 0x3656, 0x343e, 0x5d3d, 0x5d3c, 0x5d3e, 0x324e, 0x4337, 0x5d3f, 0x343f, 0x5d41, 0x5d40, 0x5d42, 0x5d43, 0x5d44, 0x3b5f, 0x4035, 0x3a21, 0x4970, 0x4a62, 0x4f44, 0x3b75, 0x3a50, 0x4e72, 0x5d45, 0x5d46, 0x3b60, 0x5d47, 0x5d48, 0x5d4a, 0x5d49, 0x4b58, 0x3d5e, 0x3c6c, 0x3b44, 0x5d4b, 0x5d4d, 0x3f23, 0x5d4c, 0x5d4e, 0x5d4f, 0x5d50, 0x5d51, 0x5d52, 0x5d54, 0x5d53, 0x5d55, 0x3225, 0x434a, 0x5d56, 0x3b26, 0x334c, 0x5d57, 0x4542, 0x544c, 0x3523, 0x5d58, 0x5d59, 0x4a6c, 0x4b68, 0x4647, 0x5d5a, 0x4866, 0x487b, 0x4c53, 0x5d5b, 0x5d5d, 0x5d5c, 0x5d5f, 0x5d5e, 0x5d61, 0x3b61, 0x4c31, 0x5d62, 0x5d63, 0x3524, 0x5d64, 0x5d66, 0x5d65, 0x3f65, 0x4939, 0x314a, 0x4845, 0x4475, 0x3d41, 0x3561, 0x4846, 0x3c2e, 0x5d68, 0x3440, 0x3178, 0x4672, 0x5d67, 0x393e, 0x4353, 0x5d69, 0x5d71, 0x5d6a, 0x4241, 0x3562, 0x5d72, 0x3768, 0x3525, 0x5d70, 0x5d6e, 0x5d6b, 0x4d60, 0x4440, 0x4659, 0x5d6c, 0x5d74, 0x5d73, 0x3723, 0x322d, 0x3a3b, 0x5d6d, 0x5d6f, 0x4b57, 0x4274, 0x4b77, 0x5d7c, 0x5d7d, 0x324f, 0x4a28, 0x4c7d, 0x5e21, 0x3c23, 0x3e42, 0x5d78, 0x5d7e, 0x3168, 0x3637, 0x5d75, 0x5d7a, 0x4074, 0x4771, 0x4867, 0x5d77, 0x4b21, 0x5d79, 0x5e24, 0x5e22, 0x5d7b, 0x4b22, 0x4748, 0x3563, 0x4525, 0x436d, 0x5e25, 0x5e23, 0x4259, 0x5d76, 0x314b, 0x4d4e, 0x5e30, 0x5e2f, 0x4076, 0x5e2c, 0x4d6c, 0x4636, 0x5e26, 0x4445, 0x314c, 0x393f, 0x5e29, 0x3d27, 0x5e2e, 0x5e2d, 0x5e28, 0x5e2b, 0x3368, 0x5e2a, 0x4749, 0x4e2e, 0x3e74, 0x4075, 0x5e36, 0x5e34, 0x494d, 0x5e31, 0x5e33, 0x313a, 0x3940, 0x4f32, 0x333d, 0x4962, 0x4d61, 0x3324, 0x3f3b, 0x5e35, 0x5e3a, 0x3e43, 0x4d30, 0x5e37, 0x5e32, 0x5e38, 0x4e5e, 0x4573, 0x4642, 0x3336, 0x3155, 0x5e3e, 0x5e41, 0x4e43, 0x4d64, 0x5e48, 0x5e42, 0x5e3f, 0x4e54, 0x5e45, 0x3d4a, 0x5e47, 0x5e4c, 0x4571, 0x5e4a, 0x5e44, 0x4338, 0x5e4b, 0x5e40, 0x5e46, 0x5e4d, 0x307c, 0x5e43, 0x5e4e, 0x3f3c, 0x3d5f, 0x4a25, 0x3a2e, 0x5e3b, 0x5e49, 0x453a, 0x4036, 0x3369, 0x3a51, 0x3e44, 0x5e3d, 0x3d42, 0x374c, 0x5e3c, 0x5e52, 0x3d6d, 0x383a, 0x5e61, 0x5e5b, 0x3574, 0x454f, 0x5e56, 0x5e5f, 0x302f, 0x3132, 0x3239, 0x5e58, 0x422c, 0x5e4f, 0x5e51, 0x3941, 0x5e62, 0x5e5d, 0x5e55, 0x5e5c, 0x4c2b, 0x5e5a, 0x5e5e, 0x3850, 0x3e45, 0x4339, 0x5e54, 0x4d2f, 0x5e57, 0x5e50, 0x4572, 0x5e53, 0x5e59, 0x4f51, 0x3c3e, 0x4b7e, 0x5e63, 0x482e, 0x5e6f, 0x383b, 0x3d60, 0x5e65, 0x4e2f, 0x3942, 0x5e72, 0x306e, 0x5e70, 0x5e64, 0x5e6a, 0x5e6c, 0x4d4f, 0x5e67, 0x452e, 0x5e69, 0x5e71, 0x5e6b, 0x4c47, 0x5e66, 0x3c22, 0x5e7e, 0x336a, 0x5e68, 0x5e6d, 0x5e6e, 0x426c, 0x425a, 0x5e76, 0x5e7c, 0x5e7a, 0x4529, 0x5f23, 0x5e77, 0x5e78, 0x5e60, 0x3579, 0x493a, 0x3c3f, 0x3977, 0x4f33, 0x5e74, 0x5f22, 0x3169, 0x4166, 0x4779, 0x3441, 0x4e7a, 0x4c21, 0x4452, 0x5e7b, 0x5e7d, 0x4132, 0x5f21, 0x5e79, 0x5e73, 0x3443, 0x3769, 0x5f2f, 0x5f2a, 0x4078, 0x3363, 0x3d61, 0x5f33, 0x5f2c, 0x442c, 0x5f29, 0x4459, 0x5f4c, 0x5f26, 0x5f25, 0x5f2e, 0x5f28, 0x5f27, 0x5f2d, 0x4021, 0x5f24, 0x5f30, 0x5f31, 0x3442, 0x5f36, 0x5f35, 0x5f37, 0x5f3a, 0x4543, 0x5f34, 0x5f38, 0x3763, 0x4279, 0x5f32, 0x473b, 0x5f39, 0x5f3e, 0x5f3c, 0x5f3f, 0x5f42, 0x5f3b, 0x396a, 0x4728, 0x5e39, 0x4d74, 0x5f3d, 0x5f41, 0x4275, 0x5f40, 0x5f2b, 0x6f69, 0x5f45, 0x5f49, 0x5f47, 0x5f43, 0x5f44, 0x5f48, 0x5f46, 0x494e, 0x5f4e, 0x5f4b, 0x5f4a, 0x5f4d, 0x4654, 0x5f4f, 0x4375, 0x426d, 0x4025, 0x5f50, 0x5f52, 0x5f51, 0x5e75, 0x5f53, 0x4667, 0x5f54, 0x3250, 0x4574, 0x3325, 0x3564, 0x3c5e, 0x3a52, 0x4f27, 0x3f66, 0x316a, 0x5f56, 0x5f55, 0x5f59, 0x433a, 0x5f5c, 0x5f57, 0x5f5b, 0x5f5a, 0x4540, 0x3059, 0x4e75, 0x5f5e, 0x3128, 0x5f60, 0x5f5f, 0x5f5d, 0x5f58, 0x4b23, 0x5f62, 0x5f61, 0x316b, 0x5f64, 0x4a32, 0x5f63, 0x4c35, 0x3e47, 0x4133, 0x3e46, 0x4e7b, 0x5f6a, 0x4079, 0x5f66, 0x5f6b, 0x316c, 0x5f69, 0x4761, 0x5f65, 0x5f68, 0x3e48, 0x4851, 0x5f6c, 0x3c51, 0x407a, 0x5f6f, 0x5f67, 0x3727, 0x5f6d, 0x4d50, 0x5f70, 0x7426, 0x3d4f, 0x5f71, 0x5f72, 0x472e, 0x5f74, 0x5f75, 0x4733, 0x4575, 0x5f77, 0x5f79, 0x4e55, 0x5f76, 0x5f78, 0x316d, 0x5f73, 0x535b, 0x5f7a, 0x4167, 0x3b38, 0x5f7c, 0x5f7b, 0x3f24, 0x5259, 0x5f7d, 0x6021, 0x5f6e, 0x5f7e, 0x6022, 0x477a, 0x6023, 0x6024, 0x6025, 0x6026, 0x445e, 0x6028, 0x6027, 0x6029, 0x602a, 0x3c5f, 0x4963, 0x4c6c, 0x602b, 0x602c, 0x4156, 0x3c24, 0x602d, 0x602e, 0x602f, 0x4a52, 0x4847, 0x6030, 0x4757, 0x442d, 0x6031, 0x3267, 0x356d, 0x4c46, 0x4c36, 0x3234, 0x4f34, 0x4b52, 0x4a2a, 0x4037, 0x6032, 0x4643, 0x3823, 0x6033, 0x3a54, 0x6035, 0x6034, 0x6036, 0x6037, 0x6038, 0x353e, 0x6039, 0x603a, 0x3824, 0x4848, 0x603c, 0x3e75, 0x603b, 0x3638, 0x603d, 0x603f, 0x603e, 0x6040, 0x3851, 0x6041, 0x3669, 0x4140, 0x397d, 0x6043, 0x6044, 0x6042, 0x3c6d, 0x4648, 0x3639, 0x6046, 0x432c, 0x6045, 0x4f35, 0x4762, 0x6049, 0x604b, 0x6048, 0x4c54, 0x604a, 0x604c, 0x4e44, 0x6050, 0x604f, 0x4376, 0x472d, 0x3825, 0x604e, 0x604d, 0x4d31, 0x4d32, 0x6051, 0x316e, 0x3976, 0x3b62, 0x6052, 0x6053, 0x6055, 0x3d43, 0x6057, 0x6056, 0x6058, 0x334d, 0x605a, 0x6059, 0x605c, 0x605b, 0x383c, 0x4e28, 0x364c, 0x3226, 0x366a, 0x3461, 0x4e68, 0x605e, 0x6060, 0x6061, 0x3251, 0x605d, 0x3b39, 0x4441, 0x605f, 0x6064, 0x3c6e, 0x6062, 0x373e, 0x4849, 0x6063, 0x607e, 0x6069, 0x383d, 0x3565, 0x6066, 0x4d7d, 0x4e30, 0x4276, 0x6068, 0x606a, 0x4e56, 0x3657, 0x487c, 0x474a, 0x606b, 0x606d, 0x6070, 0x606c, 0x606f, 0x386a, 0x314d, 0x6071, 0x3f70, 0x606e, 0x4e5c, 0x6074, 0x7424, 0x6072, 0x6075, 0x6067, 0x6073, 0x3a3c, 0x6076, 0x6077, 0x4d7e, 0x6078, 0x6079, 0x6065, 0x607a, 0x3444, 0x3c25, 0x607b, 0x607c, 0x607d, 0x313b, 0x6121, 0x493b, 0x6122, 0x3424, 0x6123, 0x6124, 0x6125, 0x6127, 0x6128, 0x6126, 0x4953, 0x612a, 0x6129, 0x612c, 0x612b, 0x612d, 0x612e, 0x6130, 0x612f, 0x3979, 0x6132, 0x6131, 0x3445, 0x3f53, 0x453c, 0x6133, 0x4038, 0x3b3a, 0x3179, 0x6134, 0x4d51, 0x4a63, 0x6135, 0x4544, 0x4d33, 0x3943, 0x3f3d, 0x434b, 0x5234, 0x442e, 0x3268, 0x6136, 0x6137, 0x613c, 0x613a, 0x6139, 0x5a42, 0x3326, 0x6138, 0x305a, 0x482a, 0x484a, 0x4e31, 0x613d, 0x613b, 0x435c, 0x4026, 0x482b, 0x492d, 0x613f, 0x4e2c, 0x374d, 0x6140, 0x613e, 0x4856, 0x6141, 0x6142, 0x305b, 0x3e76, 0x6147, 0x6144, 0x466d, 0x6143, 0x3526, 0x614a, 0x6145, 0x6146, 0x6149, 0x6148, 0x4925, 0x4142, 0x4141, 0x353f, 0x614b, 0x614c, 0x614d, 0x614f, 0x614e, 0x3156, 0x6157, 0x4868, 0x6151, 0x6153, 0x6155, 0x3f3e, 0x6156, 0x6154, 0x3c40, 0x6150, 0x6152, 0x4942, 0x3e49, 0x6159, 0x6158, 0x615a, 0x3c26, 0x3a2f, 0x4577, 0x615b, 0x444b, 0x615d, 0x4e21, 0x615c, 0x4169, 0x6162, 0x6164, 0x6165, 0x4354, 0x6163, 0x6160, 0x615e, 0x615f, 0x6161, 0x6168, 0x6166, 0x6167, 0x6169, 0x616b, 0x616c, 0x616d, 0x616e, 0x616a, 0x6170, 0x616f, 0x6171, 0x4e45, 0x6174, 0x6172, 0x6173, 0x3462, 0x4c7e, 0x4a4a, 0x6176, 0x6175, 0x6177, 0x6178, 0x617c, 0x6179, 0x617a, 0x617b, 0x617d, 0x617e, 0x6221, 0x6222, 0x6223, 0x482f, 0x4550, 0x6224, 0x4772, 0x4934, 0x6225, 0x6226, 0x452a, 0x3327, 0x3944, 0x6227, 0x6228, 0x6229, 0x3b29, 0x622b, 0x622a, 0x622c, 0x622d, 0x4869, 0x622e, 0x622f, 0x7369, 0x6230, 0x6231, 0x6232, 0x3b2e, 0x6233, 0x4756, 0x4b5f, 0x314e, 0x3157, 0x6234, 0x6236, 0x6235, 0x4570, 0x4039, 0x5d39, 0x6237, 0x4c41, 0x6238, 0x3446, 0x4857, 0x6239, 0x623a, 0x623b, 0x4c5c, 0x4c55, 0x443e, 0x416a, 0x623d, 0x3d62, 0x3e4a, 0x6240, 0x623f, 0x623e, 0x487d, 0x3447, 0x3829, 0x6246, 0x6243, 0x3f3f, 0x4c32, 0x6242, 0x6244, 0x6245, 0x6241, 0x6247, 0x6248, 0x442f, 0x3463, 0x4365, 0x6249, 0x624a, 0x624d, 0x3f67, 0x4644, 0x624e, 0x4b53, 0x624b, 0x624c, 0x6251, 0x6250, 0x624f, 0x6253, 0x6252, 0x6254, 0x6256, 0x6255, 0x4a4d, 0x3d56, 0x4e46, 0x6257, 0x4637, 0x6258, 0x6259, 0x625d, 0x625b, 0x625c, 0x625a, 0x625e, 0x625f, 0x6260, 0x6261, 0x4c37, 0x6262, 0x4c70, 0x6263, 0x434e, 0x476a, 0x366b, 0x433b, 0x6264, 0x363a, 0x4050, 0x6265, 0x3a3d, 0x6266, 0x6267, 0x3826, 0x3a55, 0x6269, 0x4556, 0x3a56, 0x354e, 0x4b24, 0x474b, 0x4557, 0x395c, 0x626b, 0x3e4b, 0x4e32, 0x3945, 0x3827, 0x4823, 0x626d, 0x626f, 0x386b, 0x626e, 0x4476, 0x6271, 0x3337, 0x626c, 0x486a, 0x3130, 0x3a6c, 0x4f52, 0x6270, 0x6272, 0x4a4b, 0x4059, 0x6274, 0x6275, 0x6273, 0x334e, 0x627b, 0x627a, 0x3c27, 0x627c, 0x6277, 0x627d, 0x6278, 0x4858, 0x6276, 0x6279, 0x6322, 0x6321, 0x4b61, 0x627e, 0x306b, 0x6324, 0x6323, 0x3e4c, 0x6325, 0x4143, 0x6327, 0x6326, 0x6328, 0x6268, 0x626a, 0x632a, 0x6329, 0x3c28, 0x4e69, 0x3c52, 0x632b, 0x3737, 0x3540, 0x3527, 0x3b63, 0x4d34, 0x6331, 0x6330, 0x4144, 0x632d, 0x632f, 0x3d4b, 0x3f40, 0x632e, 0x632c, 0x472a, 0x3e4d, 0x493c, 0x3a57, 0x4578, 0x6332, 0x6333, 0x6349, 0x3658, 0x4f3d, 0x4135, 0x6334, 0x3252, 0x4477, 0x4a21, 0x6335, 0x357a, 0x6336, 0x6338, 0x6339, 0x4729, 0x633a, 0x633b, 0x633c, 0x3659, 0x3253, 0x4645, 0x3d28, 0x3b64, 0x633d, 0x3d29, 0x324a, 0x4943, 0x633e, 0x486b, 0x4145, 0x6341, 0x6342, 0x4769, 0x3f41, 0x633f, 0x4361, 0x6340, 0x3e4e, 0x305c, 0x3529, 0x6343, 0x4478, 0x6344, 0x4047, 0x4c2d, 0x4923, 0x6345, 0x6346, 0x4355, 0x4e47, 0x6348, 0x6347, 0x3c6f, 0x634a, 0x3070, 0x634d, 0x634b, 0x3254, 0x374e, 0x634c, 0x3946, 0x3972, 0x4a66, 0x634e, 0x4b54, 0x6350, 0x4051, 0x314f, 0x323a, 0x302c, 0x634f, 0x6351, 0x6352, 0x3e77, 0x6353, 0x334f, 0x6355, 0x376a, 0x3566, 0x6356, 0x3675, 0x6357, 0x407c, 0x464d, 0x4060, 0x3a75, 0x6358, 0x4362, 0x416b, 0x635a, 0x635c, 0x6359, 0x635b, 0x3722, 0x635d, 0x3726, 0x3567, 0x4d52, 0x635f, 0x6360, 0x312e, 0x6363, 0x3376, 0x6362, 0x6361, 0x6365, 0x635e, 0x6366, 0x4e29, 0x6367, 0x6368, 0x5474, 0x636a, 0x6369, 0x636b, 0x636c, 0x4e35, 0x636d, 0x706f, 0x3e4f, 0x636e, 0x636f, 0x3d57, 0x4638, 0x6370, 0x4328, 0x6371, 0x433c, 0x6372, 0x3625, 0x513f, 0x435d, 0x3c33, 0x3448, 0x6373, 0x6422, 0x6376, 0x3568, 0x6375, 0x6424, 0x6374, 0x3e50, 0x6378, 0x6379, 0x452b, 0x637a, 0x335e, 0x3f5a, 0x4964, 0x637c, 0x4268, 0x6377, 0x637b, 0x637d, 0x3a7b, 0x6426, 0x492e, 0x4826, 0x4579, 0x365a, 0x6425, 0x6423, 0x4835, 0x637e, 0x435e, 0x457b, 0x457a, 0x3a76, 0x6438, 0x6428, 0x642a, 0x642d, 0x642e, 0x642b, 0x642c, 0x6429, 0x6427, 0x6421, 0x4a4f, 0x3255, 0x6435, 0x6432, 0x6437, 0x6436, 0x4773, 0x4c27, 0x3b3b, 0x6430, 0x6439, 0x6434, 0x6433, 0x642f, 0x6431, 0x3449, 0x433d, 0x407d, 0x4822, 0x643e, 0x4824, 0x4061, 0x643b, 0x484f, 0x643f, 0x4a53, 0x435b, 0x643a, 0x643c, 0x643d, 0x6440, 0x3c44, 0x4646, 0x6445, 0x6444, 0x6441, 0x4f36, 0x644a, 0x644e, 0x644b, 0x6447, 0x6448, 0x644d, 0x6442, 0x5255, 0x6449, 0x6443, 0x644c, 0x6452, 0x344a, 0x644f, 0x6450, 0x6451, 0x6454, 0x6453, 0x4876, 0x6455, 0x4e7c, 0x4a6d, 0x645a, 0x6457, 0x6456, 0x4052, 0x6459, 0x645b, 0x6458, 0x645f, 0x645c, 0x645d, 0x6446, 0x645e, 0x6460, 0x6461, 0x4a46, 0x6462, 0x4c62, 0x364e, 0x3729, 0x6463, 0x4a34, 0x3f68, 0x4c30, 0x6464, 0x4e33, 0x4774, 0x4146, 0x4734, 0x3d4d, 0x3040, 0x6469, 0x6467, 0x6465, 0x3421, 0x3e51, 0x646a, 0x6468, 0x6466, 0x646e, 0x646d, 0x646c, 0x646b, 0x646f, 0x6470, 0x403a, 0x6471, 0x6473, 0x6472, 0x3852, 0x4138, 0x6475, 0x457c, 0x6474, 0x6476, 0x4a35, 0x416c, 0x3947, 0x6477, 0x4e48, 0x6479, 0x647a, 0x647b, 0x647c, 0x3b65, 0x647d, 0x374f, 0x356a, 0x352a, 0x6521, 0x4c73, 0x3948, 0x647e, 0x6524, 0x4c66, 0x473c, 0x4933, 0x3d63, 0x6523, 0x3c53, 0x3949, 0x3b66, 0x3569, 0x4a36, 0x6522, 0x4147, 0x4b42, 0x3a77, 0x3b67, 0x445d, 0x6527, 0x4e5f, 0x3a59, 0x6528, 0x3f42, 0x652a, 0x3e52, 0x3a30, 0x6529, 0x3d2a, 0x383e, 0x4148, 0x6525, 0x652b, 0x6526, 0x3750, 0x652e, 0x6532, 0x376b, 0x652d, 0x6536, 0x394a, 0x4d6d, 0x303c, 0x6533, 0x356b, 0x6530, 0x6531, 0x457d, 0x652f, 0x652c, 0x3328, 0x4064, 0x3828, 0x6538, 0x6535, 0x6537, 0x6534, 0x3751, 0x4233, 0x6539, 0x416e, 0x6546, 0x6542, 0x653c, 0x6540, 0x3c7a, 0x305d, 0x653b, 0x6543, 0x6547, 0x394b, 0x4c56, 0x4456, 0x653d, 0x6545, 0x653a, 0x433e, 0x653f, 0x303d, 0x4c4a, 0x653e, 0x365b, 0x486c, 0x416d, 0x4e50, 0x3d6f, 0x656e, 0x6548, 0x407e, 0x6544, 0x6549, 0x654b, 0x4479, 0x654e, 0x654a, 0x4a54, 0x344b, 0x4c4b, 0x305e, 0x654d, 0x4e7d, 0x654c, 0x316f, 0x466c, 0x654f, 0x6556, 0x6550, 0x6557, 0x6553, 0x477b, 0x3c4a, 0x6555, 0x6552, 0x6558, 0x6551, 0x3d44, 0x4b25, 0x3d4c, 0x6554, 0x6560, 0x655c, 0x655f, 0x655d, 0x6561, 0x655b, 0x6541, 0x4053, 0x484b, 0x655e, 0x6559, 0x4121, 0x3752, 0x3d2b, 0x3f25, 0x4136, 0x6564, 0x6566, 0x6567, 0x6563, 0x6565, 0x655a, 0x6562, 0x656a, 0x6569, 0x4b7a, 0x372b, 0x6568, 0x656c, 0x656b, 0x656f, 0x6571, 0x3b3c, 0x656d, 0x6572, 0x6573, 0x6574, 0x657a, 0x453b, 0x6576, 0x6575, 0x6577, 0x6578, 0x6579, 0x657b, 0x657c, 0x344c, 0x657d, 0x657e, 0x6621, 0x6622, 0x6623, 0x6624, 0x6625, 0x6626, 0x6628, 0x6627, 0x6629, 0x662a, 0x662b, 0x662e, 0x662c, 0x662d, 0x3a61, 0x3753, 0x4356, 0x4833, 0x3d70, 0x474d, 0x486d, 0x662f, 0x586d, 0x6630, 0x6632, 0x4d65, 0x6631, 0x6634, 0x6633, 0x4d53, 0x6635, 0x487e, 0x6636, 0x6639, 0x6638, 0x6637, 0x663a, 0x3732, 0x4122, 0x3541, 0x663e, 0x663b, 0x663c, 0x663f, 0x6640, 0x663d, 0x3129, 0x3227, 0x6642, 0x6643, 0x6644, 0x4d62, 0x3d2c, 0x6646, 0x6645, 0x3f69, 0x6647, 0x6648, 0x6649, 0x3465, 0x344d, 0x664a, 0x664b, 0x4b5d, 0x4d63, 0x4d54, 0x4f37, 0x394d, 0x664e, 0x3c54, 0x664d, 0x664f, 0x3c29, 0x4251, 0x6650, 0x394c, 0x4c57, 0x6651, 0x6652, 0x6653, 0x6654, 0x6655, 0x3c2a, 0x4c6d, 0x6657, 0x433f, 0x6656, 0x6659, 0x6658, 0x665a, 0x403b, 0x665b, 0x665c, 0x4a39, 0x665d, 0x416f, 0x665e, 0x665f, 0x4e7e, 0x6662, 0x6661, 0x6660, 0x4430, 0x6663, 0x3f26, 0x6664, 0x6665, 0x4f38, 0x6666, 0x6667, 0x6669, 0x6668, 0x4825, 0x4679, 0x4f3e, 0x4829, 0x666b, 0x3e53, 0x492a, 0x666c, 0x666a, 0x344e, 0x3854, 0x3b68, 0x486e, 0x382a, 0x4b43, 0x666f, 0x666d, 0x394e, 0x394f, 0x3069, 0x3a68, 0x4759, 0x305f, 0x6674, 0x4340, 0x4758, 0x425b, 0x6676, 0x6672, 0x6675, 0x6670, 0x6673, 0x4b26, 0x3855, 0x307d, 0x6671, 0x6678, 0x6679, 0x4639, 0x363b, 0x6726, 0x473d, 0x3b69, 0x363c, 0x4048, 0x4f46, 0x4c2e, 0x6677, 0x4054, 0x3553, 0x667a, 0x667c, 0x667b, 0x667d, 0x4326, 0x473e, 0x4431, 0x6723, 0x6722, 0x667e, 0x3f55, 0x4965, 0x6725, 0x6724, 0x3950, 0x4f53, 0x6735, 0x6729, 0x672a, 0x3c70, 0x6728, 0x3978, 0x6727, 0x672b, 0x4432, 0x4a22, 0x4123, 0x425c, 0x672f, 0x6730, 0x672c, 0x672d, 0x672e, 0x3951, 0x6736, 0x6732, 0x4966, 0x4b6c, 0x4928, 0x6731, 0x6734, 0x6733, 0x4b44, 0x6737, 0x6738, 0x4137, 0x6739, 0x673b, 0x673f, 0x673c, 0x673a, 0x473f, 0x673d, 0x673e, 0x3232, 0x6745, 0x6740, 0x6741, 0x6742, 0x4221, 0x6744, 0x6743, 0x6746, 0x6747, 0x6748, 0x3f43, 0x3269, 0x6749, 0x4e57, 0x3c2b, 0x3d2d, 0x3b6a, 0x4357, 0x674a, 0x674b, 0x3131, 0x674c, 0x674d, 0x674e, 0x674f, 0x6750, 0x363d, 0x5a2a, 0x6751, 0x4065, 0x6752, 0x3c4b, 0x6753, 0x5030, 0x6754, 0x4a5e, 0x345c, 0x4124, 0x3d58, 0x4971, 0x3d2e, 0x6755, 0x3952, 0x6756, 0x484c, 0x6764, 0x6758, 0x4249, 0x4775, 0x383f, 0x6757, 0x4125, 0x6759, 0x447a, 0x675b, 0x675a, 0x675d, 0x675c, 0x675e, 0x6760, 0x675f, 0x344f, 0x6761, 0x6762, 0x6763, 0x3a31, 0x4e49, 0x6765, 0x3f27, 0x3170, 0x6766, 0x6767, 0x6768, 0x3072, 0x6769, 0x676a, 0x4967, 0x3c47, 0x676c, 0x3329, 0x3032, 0x676b, 0x676e, 0x474e, 0x3f44, 0x3256, 0x4b27, 0x375d, 0x365c, 0x676d, 0x326a, 0x3423, 0x3171, 0x6772, 0x4e6a, 0x425d, 0x4944, 0x677e, 0x3257, 0x677c, 0x677a, 0x6771, 0x676f, 0x6770, 0x3c63, 0x366c, 0x4377, 0x4651, 0x3151, 0x6774, 0x6773, 0x6779, 0x6775, 0x6778, 0x4c50, 0x6777, 0x3258, 0x337d, 0x677b, 0x677d, 0x3754, 0x6823, 0x682c, 0x682d, 0x302b, 0x6834, 0x3071, 0x682b, 0x682a, 0x6825, 0x6824, 0x6822, 0x6821, 0x4363, 0x427b, 0x6827, 0x6826, 0x6829, 0x4170, 0x3755, 0x3141, 0x6828, 0x3953, 0x4171, 0x683a, 0x683b, 0x3259, 0x322e, 0x6838, 0x682e, 0x6836, 0x683d, 0x6837, 0x6835, 0x6776, 0x6833, 0x682f, 0x3450, 0x6831, 0x683c, 0x6832, 0x683e, 0x6830, 0x477c, 0x4d69, 0x6839, 0x684f, 0x6847, 0x3f7b, 0x3546, 0x365d, 0x6842, 0x325b, 0x3e54, 0x6845, 0x3a5a, 0x4551, 0x684a, 0x4a6e, 0x6841, 0x325a, 0x3856, 0x4929, 0x684b, 0x683f, 0x6848, 0x6852, 0x6843, 0x6844, 0x463a, 0x6849, 0x6846, 0x4b28, 0x684c, 0x3060, 0x6840, 0x684e, 0x684d, 0x476b, 0x6854, 0x685f, 0x337e, 0x6862, 0x6850, 0x6855, 0x4d6e, 0x685e, 0x4d55, 0x4e2a, 0x4378, 0x336b, 0x4972, 0x6864, 0x4621, 0x3031, 0x685d, 0x6859, 0x4172, 0x6853, 0x685b, 0x6860, 0x472c, 0x302a, 0x6858, 0x6861, 0x4978, 0x685c, 0x6857, 0x3e55, 0x3d2f, 0x3c2c, 0x4c58, 0x4947, 0x6867, 0x6870, 0x685a, 0x3377, 0x3e78, 0x6865, 0x686a, 0x4173, 0x6866, 0x686d, 0x435f, 0x686e, 0x4d56, 0x6863, 0x3338, 0x6869, 0x686c, 0x4c2c, 0x686f, 0x6868, 0x686b, 0x4b29, 0x4f21, 0x6873, 0x687a, 0x6872, 0x3c43, 0x6851, 0x4a4e, 0x4c22, 0x6879, 0x6878, 0x6874, 0x6875, 0x3136, 0x6877, 0x6871, 0x4455, 0x6876, 0x307e, 0x4222, 0x4a43, 0x687b, 0x6921, 0x4859, 0x687e, 0x3e56, 0x3c49, 0x6923, 0x363e, 0x6924, 0x4979, 0x687d, 0x6856, 0x687c, 0x4f4f, 0x4622, 0x4973, 0x692b, 0x6931, 0x6932, 0x6925, 0x4776, 0x692f, 0x6927, 0x6929, 0x6933, 0x6928, 0x692c, 0x3172, 0x4665, 0x692d, 0x6930, 0x6926, 0x4126, 0x692a, 0x3b27, 0x3f45, 0x3730, 0x4c74, 0x4c79, 0x3d72, 0x6937, 0x6935, 0x4f4e, 0x6934, 0x4d75, 0x6936, 0x6938, 0x6939, 0x693c, 0x693a, 0x4623, 0x693b, 0x484d, 0x692e, 0x3d73, 0x693d, 0x6942, 0x4174, 0x6941, 0x6922, 0x6943, 0x4149, 0x693e, 0x6940, 0x693f, 0x5d31, 0x5d22, 0x6945, 0x6944, 0x4d76, 0x623c, 0x6946, 0x6947, 0x6948, 0x3857, 0x3554, 0x694a, 0x515d, 0x3575, 0x4e3a, 0x3673, 0x694b, 0x694c, 0x436e, 0x694d, 0x467a, 0x303a, 0x3263, 0x6952, 0x6953, 0x694e, 0x3b3d, 0x694f, 0x4742, 0x6950, 0x6951, 0x695b, 0x6955, 0x6958, 0x6954, 0x6956, 0x6957, 0x3c58, 0x6959, 0x4341, 0x3756, 0x3342, 0x695c, 0x333f, 0x6961, 0x695d, 0x6960, 0x483a, 0x695e, 0x695f, 0x4948, 0x485a, 0x6962, 0x427d, 0x696c, 0x6968, 0x326b, 0x6966, 0x4b2a, 0x6967, 0x6964, 0x6965, 0x696a, 0x696d, 0x696b, 0x6969, 0x6963, 0x4358, 0x6974, 0x4c2a, 0x6972, 0x6973, 0x696e, 0x6970, 0x6971, 0x696f, 0x4066, 0x4f39, 0x6978, 0x6979, 0x6a21, 0x3f2a, 0x697b, 0x697e, 0x6976, 0x6975, 0x6a22, 0x325c, 0x697c, 0x6a23, 0x697d, 0x697a, 0x4433, 0x6977, 0x4768, 0x6a27, 0x4d3b, 0x6a26, 0x6a25, 0x6a2e, 0x6a28, 0x6a30, 0x4d66, 0x6a33, 0x6a2a, 0x6a2b, 0x6a2f, 0x6a32, 0x6a31, 0x6a29, 0x6a2c, 0x6a3d, 0x6a36, 0x6a34, 0x6a35, 0x6a3a, 0x6a3b, 0x332a, 0x3542, 0x6a39, 0x6a24, 0x6a38, 0x6a3c, 0x6a37, 0x6a3e, 0x6a40, 0x6a3f, 0x6a42, 0x6a41, 0x695a, 0x6a46, 0x6a43, 0x6a44, 0x6a45, 0x6a47, 0x376c, 0x6a49, 0x6a48, 0x3d30, 0x3954, 0x5e27, 0x6a4a, 0x3d51, 0x3339, 0x6a4b, 0x3152, 0x3e57, 0x6a4c, 0x3955, 0x6a4d, 0x3061, 0x493d, 0x6a4e, 0x3f6a, 0x6a55, 0x6a52, 0x436f, 0x6a53, 0x6a50, 0x365e, 0x6a4f, 0x6a56, 0x3736, 0x425e, 0x6a5c, 0x6a58, 0x4235, 0x6a57, 0x6a5a, 0x6a51, 0x6a5b, 0x6a5d, 0x486f, 0x6a59, 0x6a5e, 0x6a60, 0x3853, 0x6a54, 0x3041, 0x6a5f, 0x3a5b, 0x4e76, 0x6a61, 0x6a62, 0x4175, 0x4e22, 0x6a63, 0x4d35, 0x6a64, 0x6a65, 0x4a64, 0x6a66, 0x3a40, 0x4e23, 0x6a6b, 0x6a6c, 0x3e58, 0x6a6a, 0x4d67, 0x6a67, 0x6a69, 0x403d, 0x3f7e, 0x6a68, 0x6a6d, 0x4a23, 0x6a6f, 0x6a6e, 0x336c, 0x4b2b, 0x6a70, 0x6a7c, 0x6a72, 0x6a73, 0x6a74, 0x6a75, 0x6a79, 0x6a7a, 0x6a78, 0x6a76, 0x6a71, 0x6a77, 0x6a7b, 0x7037, 0x3228, 0x6a7e, 0x365f, 0x6a7d, 0x6b22, 0x6b21, 0x6b24, 0x6b23, 0x6b25, 0x3d31, 0x6b26, 0x6b27, 0x6b28, 0x403e, 0x4d57, 0x6b29, 0x4a24, 0x4746, 0x6b2a, 0x6b2b, 0x382b, 0x352c, 0x6b2c, 0x3b6b, 0x4741, 0x6b2d, 0x3350, 0x6b2e, 0x6b30, 0x4d77, 0x6b2f, 0x3f46, 0x6b31, 0x6b32, 0x6b33, 0x3451, 0x6b34, 0x6b35, 0x6b36, 0x6b37, 0x3351, 0x6b38, 0x6b39, 0x6b3a, 0x3272, 0x3f28, 0x6b3b, 0x6b3c, 0x6b3d, 0x3840, 0x447b, 0x6b3e, 0x3757, 0x3f56, 0x6b41, 0x4624, 0x6b40, 0x3731, 0x6b3f, 0x4277, 0x352d, 0x6b42, 0x6b43, 0x3e59, 0x376d, 0x6b44, 0x4b2c, 0x405f, 0x3576, 0x4c75, 0x414a, 0x6b45, 0x3f47, 0x4370, 0x3e5a, 0x6b46, 0x6b49, 0x6b4a, 0x3a3e, 0x4242, 0x6b48, 0x3e5b, 0x493e, 0x6b47, 0x3b6c, 0x3153, 0x6b4e, 0x3758, 0x3b6e, 0x3b6d, 0x4f4d, 0x6b4d, 0x6b4c, 0x4127, 0x354d, 0x4f43, 0x333a, 0x3e5c, 0x6b4b, 0x6b50, 0x6b51, 0x6b4f, 0x3858, 0x4d40, 0x3b6f, 0x4727, 0x6b54, 0x4040, 0x4342, 0x4d36, 0x6b57, 0x386c, 0x403f, 0x6b53, 0x6b58, 0x386d, 0x6b55, 0x6b56, 0x6b52, 0x4062, 0x4649, 0x432f, 0x325d, 0x4870, 0x3543, 0x4434, 0x6b5b, 0x6b59, 0x434c, 0x4041, 0x3452, 0x6b5a, 0x3f5b, 0x4e4a, 0x4f40, 0x6b5c, 0x6b67, 0x4435, 0x6b66, 0x6b63, 0x6b6b, 0x6b64, 0x6b60, 0x447c, 0x6b5f, 0x6b5d, 0x4d21, 0x3b70, 0x6b61, 0x6b5e, 0x6b65, 0x3d74, 0x3841, 0x427a, 0x4b45, 0x315a, 0x3062, 0x4625, 0x6b69, 0x6b68, 0x4666, 0x6b6d, 0x6b62, 0x6b6c, 0x6b6e, 0x382c, 0x6b6a, 0x3956, 0x3c55, 0x6b6f, 0x4d58, 0x6b72, 0x6b75, 0x6b73, 0x4935, 0x6b70, 0x3660, 0x6b74, 0x6b76, 0x6b7a, 0x6b77, 0x6b79, 0x6b78, 0x6b7b, 0x3c31, 0x6b7d, 0x6b7c, 0x4968, 0x6c21, 0x3759, 0x6b7e, 0x6c22, 0x6c23, 0x3544, 0x6641, 0x3e79, 0x6c24, 0x386e, 0x6c25, 0x6c26, 0x3b3e, 0x5a4e, 0x6c27, 0x6c28, 0x3d32, 0x6c29, 0x6c2a, 0x6c2b, 0x6c2c, 0x6c2d, 0x432b, 0x6c2e, 0x6c30, 0x6c2f, 0x4626, 0x6c31, 0x4b2d, 0x6c32, 0x6c33, 0x6c34, 0x6c35, 0x465a, 0x3e5d, 0x6c36, 0x396b, 0x502e, 0x6c37, 0x6c38, 0x493f, 0x6c39, 0x6c41, 0x6c3a, 0x6c3c, 0x6c3b, 0x6c3d, 0x4b46, 0x6c3e, 0x6c3f, 0x6c40, 0x6c42, 0x332d, 0x4467, 0x4969, 0x3a62, 0x3957, 0x494f, 0x325f, 0x484e, 0x6c45, 0x3453, 0x4055, 0x6c44, 0x6c49, 0x4379, 0x4c63, 0x6c47, 0x6c48, 0x352e, 0x6c4a, 0x4763, 0x425f, 0x4871, 0x453d, 0x6c46, 0x4b47, 0x326c, 0x6c4c, 0x4f28, 0x4442, 0x4f45, 0x3b71, 0x6c4b, 0x4231, 0x6c5c, 0x4128, 0x4678, 0x4950, 0x6c4f, 0x3b3f, 0x3b72, 0x3e5e, 0x4765, 0x382d, 0x6c4e, 0x6c4d, 0x496a, 0x3c41, 0x4552, 0x6c51, 0x6c52, 0x3958, 0x6c50, 0x6c53, 0x6c54, 0x6c56, 0x4223, 0x6c55, 0x3466, 0x6c58, 0x6c57, 0x6c59, 0x6c5b, 0x6c5d, 0x6c5e, 0x4056, 0x3c4f, 0x6c5f, 0x3352, 0x6c60, 0x4176, 0x6c61, 0x6c62, 0x496b, 0x352f, 0x6c63, 0x4436, 0x315b, 0x6c64, 0x3c71, 0x3f76, 0x422d, 0x6c67, 0x6c66, 0x6c65, 0x6c6d, 0x6c6b, 0x6c68, 0x6c6a, 0x6c69, 0x6c6c, 0x3577, 0x6c70, 0x4057, 0x6c71, 0x3859, 0x6c6e, 0x6c6f, 0x4f29, 0x4437, 0x4129, 0x6c72, 0x6c75, 0x6c73, 0x6c74, 0x4d59, 0x4627, 0x6c78, 0x6c76, 0x6c77, 0x6c79, 0x6d29, 0x6c7c, 0x6c7d, 0x6c7b, 0x6c7a, 0x447d, 0x6d21, 0x6d25, 0x6d22, 0x6c7e, 0x6d23, 0x6d24, 0x6d2b, 0x6d26, 0x4058, 0x6d28, 0x6d2a, 0x6d27, 0x6d2d, 0x3d33, 0x6d2c, 0x6d2e, 0x6d2f, 0x6d32, 0x6d31, 0x6d30, 0x6d34, 0x6d33, 0x4c76, 0x6d36, 0x6d35, 0x6d37, 0x6d38, 0x6d3a, 0x6d39, 0x3f48, 0x6d3b, 0x366d, 0x6d3c, 0x6d3e, 0x6d3f, 0x6d40, 0x6d3d, 0x6d41, 0x3c56, 0x6d42, 0x3530, 0x3733, 0x382e, 0x6d43, 0x4670, 0x453e, 0x6d44, 0x6d47, 0x3c34, 0x6d46, 0x6d45, 0x375a, 0x6d48, 0x3353, 0x6d4a, 0x3a5c, 0x6d49, 0x6d52, 0x6d4c, 0x6d4e, 0x4a65, 0x6d4b, 0x6d4d, 0x6d51, 0x6d4f, 0x3531, 0x6d50, 0x6d53, 0x475a, 0x4e58, 0x3d34, 0x6d54, 0x4d22, 0x6d56, 0x6d55, 0x6d59, 0x4d41, 0x6d58, 0x336d, 0x6d57, 0x6d5c, 0x6d5b, 0x6d5a, 0x4532, 0x6d5d, 0x6d5e, 0x6d5f, 0x396c, 0x3725, 0x6d60, 0x6d61, 0x6d62, 0x3f49, 0x6d63, 0x3c2d, 0x6d64, 0x6d65, 0x5221, 0x517e, 0x6d66, 0x6570, 0x6d67, 0x4324, 0x3f2b, 0x4740, 0x6d68, 0x4a55, 0x4454, 0x397e, 0x4329, 0x312a, 0x4b78, 0x3f57, 0x375e, 0x3661, 0x4a56, 0x6d69, 0x6d6b, 0x6d6a, 0x3260, 0x4676, 0x6d6c, 0x4777, 0x4533, 0x6d6d, 0x3d52, 0x6d6f, 0x4c42, 0x6d7e, 0x6d71, 0x6d72, 0x4449, 0x4260, 0x4177, 0x4628, 0x6d70, 0x3555, 0x6d79, 0x6d76, 0x6e25, 0x4629, 0x4360, 0x6d73, 0x447e, 0x4553, 0x6d74, 0x6d78, 0x3f60, 0x4767, 0x444c, 0x4042, 0x6d77, 0x422e, 0x4224, 0x6d75, 0x3029, 0x4f22, 0x6d7a, 0x4261, 0x3d35, 0x3f4a, 0x6d7c, 0x6d7b, 0x306f, 0x6d7d, 0x492f, 0x6e27, 0x465b, 0x3f6b, 0x4359, 0x3678, 0x6e26, 0x4d37, 0x313f, 0x4a57, 0x3261, 0x6e21, 0x6e22, 0x6e23, 0x6e24, 0x463b, 0x4323, 0x3063, 0x6e28, 0x6e29, 0x7423, 0x423d, 0x6e2a, 0x3173, 0x414c, 0x382f, 0x4d5a, 0x6e2b, 0x452c, 0x4178, 0x3c57, 0x6e2c, 0x6e2f, 0x3d65, 0x6e2d, 0x412b, 0x412a, 0x3064, 0x4e4b, 0x6e31, 0x4872, 0x6e33, 0x6e32, 0x6e30, 0x6364, 0x3454, 0x6d6e, 0x6e35, 0x6e34, 0x6e36, 0x4d38, 0x4661, 0x4b2e, 0x6e37, 0x3c59, 0x6e38, 0x6e39, 0x6e3a, 0x4521, 0x306a, 0x3959, 0x4f3a, 0x6e3e, 0x3734, 0x6e3b, 0x6e3c, 0x4974, 0x3354, 0x4d39, 0x363f, 0x4554, 0x6e3f, 0x6e40, 0x6e41, 0x4522, 0x6e43, 0x6e42, 0x4653, 0x6e44, 0x3d36, 0x3c60, 0x475b, 0x4371, 0x3c72, 0x3f6c, 0x6e45, 0x6e46, 0x3f5d, 0x6e47, 0x6e48, 0x6e49, 0x4d6f, 0x3d37, 0x6e4b, 0x6e4a, 0x395a, 0x3973, 0x3b40, 0x6e4e, 0x3d66, 0x6e4d, 0x6e4c, 0x4269, 0x386f, 0x4043, 0x4830, 0x3d39, 0x6e4f, 0x3e5f, 0x6e52, 0x6e50, 0x6e51, 0x6e54, 0x6e53, 0x3e7a, 0x6e55, 0x6e56, 0x6e57, 0x4850, 0x3a53, 0x3c61, 0x6e58, 0x6e59, 0x4e24, 0x3d45, 0x4c6e, 0x4e4c, 0x6e5a, 0x3662, 0x6e5b, 0x4523, 0x6e5e, 0x3378, 0x3f4b, 0x6e5c, 0x6e5d, 0x4460, 0x4b55, 0x367c, 0x6e60, 0x6e61, 0x6e5f, 0x6e63, 0x465f, 0x3343, 0x6e67, 0x6e64, 0x6e66, 0x6e62, 0x6f4f, 0x6e65, 0x4e6b, 0x385a, 0x6e6f, 0x4534, 0x6e6a, 0x6e6d, 0x6e6b, 0x6e70, 0x6e71, 0x6e69, 0x6e76, 0x3174, 0x6e68, 0x482d, 0x6e6c, 0x3e60, 0x395b, 0x4b48, 0x3664, 0x3d46, 0x463c, 0x412d, 0x6e74, 0x6e6e, 0x6e73, 0x4c43, 0x4438, 0x6e75, 0x6e72, 0x412c, 0x6e79, 0x6e78, 0x6e77, 0x4b2f, 0x3d7b, 0x6e7a, 0x4a5f, 0x3154, 0x4946, 0x4372, 0x3578, 0x6e7c, 0x395d, 0x3b2c, 0x6e7b, 0x3f6d, 0x3f6e, 0x6f21, 0x6f23, 0x3e7b, 0x6f22, 0x6f24, 0x3653, 0x4945, 0x3c62, 0x4f23, 0x6e7e, 0x3a78, 0x4f3f, 0x6f26, 0x6f25, 0x6f27, 0x6e7d, 0x4669, 0x4555, 0x4457, 0x6f2c, 0x4343, 0x6f28, 0x6f29, 0x372d, 0x6f2b, 0x3830, 0x6f2a, 0x3e61, 0x3379, 0x6f30, 0x3a3f, 0x4179, 0x444a, 0x333b, 0x6f2e, 0x6f2f, 0x4443, 0x6f2d, 0x6f31, 0x6f37, 0x6f3a, 0x6f39, 0x452d, 0x6f32, 0x6f33, 0x6f36, 0x6f38, 0x3640, 0x6f3b, 0x6f35, 0x6f34, 0x6f3f, 0x6f40, 0x6f41, 0x6f3e, 0x6f3d, 0x3e62, 0x462a, 0x6f3c, 0x6f45, 0x6f43, 0x6f44, 0x6f42, 0x4278, 0x6f46, 0x6f47, 0x6f49, 0x3455, 0x6f48, 0x4c7a, 0x6f54, 0x6f4a, 0x6f4d, 0x6f4b, 0x6f4c, 0x6f4e, 0x6f50, 0x6f51, 0x6f52, 0x6f55, 0x6f53, 0x6f56, 0x6f58, 0x6f57, 0x4439, 0x4c67, 0x6f59, 0x412e, 0x6f5a, 0x4a44, 0x6f5b, 0x332b, 0x313c, 0x3457, 0x3456, 0x6f5c, 0x6f5d, 0x6f5e, 0x6f5f, 0x6f60, 0x3458, 0x3355, 0x395e, 0x4836, 0x6f62, 0x6f61, 0x6f63, 0x315c, 0x6f66, 0x6f65, 0x6f64, 0x6f67, 0x6f6a, 0x3047, 0x6f68, 0x6f6c, 0x6f6b, 0x6f6e, 0x6f6d, 0x6f6f, 0x462e, 0x6f70, 0x6f71, 0x6f73, 0x6f72, 0x496c, 0x6f74, 0x6f75, 0x3a65, 0x6f76, 0x6f77, 0x4b49, 0x414b, 0x3024, 0x424b, 0x6f78, 0x496d, 0x6f7b, 0x6f79, 0x395f, 0x6f7a, 0x3842, 0x4a45, 0x6f7d, 0x7021, 0x6f7e, 0x7022, 0x3121, 0x3f58, 0x3d7c, 0x3459, 0x7023, 0x4766, 0x7025, 0x3122, 0x7024, 0x4444, 0x4e4d, 0x462b, 0x6f7c, 0x4e26, 0x3831, 0x4d5b, 0x3679, 0x4e34, 0x3728, 0x4262, 0x6721, 0x7026, 0x332c, 0x3f6f, 0x3356, 0x7028, 0x7029, 0x7027, 0x3764, 0x3a5d, 0x3e63, 0x3123, 0x4e59, 0x702b, 0x6e2e, 0x702a, 0x702e, 0x702c, 0x702d, 0x702f, 0x7030, 0x4e6c, 0x7031, 0x7032, 0x4049, 0x483b, 0x3f7d, 0x3467, 0x4d3a, 0x326d, 0x3d38, 0x385b, 0x7035, 0x7034, 0x3b73, 0x7036, 0x7033, 0x3b28, 0x703a, 0x6a2d, 0x5256, 0x3f77, 0x7038, 0x4e25, 0x4671, 0x312b, 0x4063, 0x3c36, 0x4a37, 0x3140, 0x4e6d, 0x4d6b, 0x703b, 0x4545, 0x3c7b, 0x703c, 0x703d, 0x3f4c, 0x703e, 0x4e6e, 0x7039, 0x7040, 0x7042, 0x7041, 0x703f, 0x7043, 0x7044, 0x417a, 0x3262, 0x7045, 0x4c38, 0x7046, 0x7047, 0x4f2a, 0x5b31, 0x7048, 0x7049, 0x704a, 0x704e, 0x704b, 0x704c, 0x704d, 0x704f, 0x4044, 0x4c77, 0x4045, 0x7050, 0x4873, 0x7051, 0x7353, 0x4c4c, 0x7052, 0x7053, 0x7054, 0x3357, 0x7056, 0x3f59, 0x7057, 0x3724, 0x7058, 0x705c, 0x705a, 0x705b, 0x3373, 0x7059, 0x705d, 0x705e, 0x3048, 0x705f, 0x7060, 0x3e64, 0x7061, 0x3547, 0x7064, 0x7063, 0x7062, 0x6b71, 0x4a5c, 0x7065, 0x7066, 0x7067, 0x7068, 0x7069, 0x706a, 0x345a, 0x706b, 0x706c, 0x4723, 0x706e, 0x323b, 0x7071, 0x7070, 0x3124, 0x3641, 0x4a47, 0x443a, 0x3a22, 0x3960, 0x3d67, 0x3f5c, 0x7073, 0x7072, 0x4d42, 0x3468, 0x4852, 0x465c, 0x3f7c, 0x4e4e, 0x375b, 0x7076, 0x7075, 0x4b4b, 0x462c, 0x3150, 0x7077, 0x7074, 0x4951, 0x4d6a, 0x7078, 0x7079, 0x707b, 0x426a, 0x335b, 0x335c, 0x707a, 0x3469, 0x3832, 0x346a, 0x453f, 0x4e60, 0x385c, 0x707c, 0x707d, 0x707e, 0x7121, 0x7123, 0x7122, 0x4977, 0x7124, 0x7125, 0x7126, 0x7127, 0x7129, 0x7128, 0x712a, 0x4874, 0x664c, 0x3f29, 0x3532, 0x712b, 0x712c, 0x522c, 0x5d3b, 0x4853, 0x307b, 0x303b, 0x3b74, 0x4b30, 0x3e7e, 0x712d, 0x4c5f, 0x712e, 0x4d5c, 0x3142, 0x3b41, 0x712f, 0x326e, 0x7130, 0x7131, 0x7133, 0x7134, 0x7136, 0x7132, 0x7135, 0x345b, 0x7137, 0x7138, 0x7139, 0x713a, 0x713b, 0x713d, 0x713c, 0x713f, 0x7142, 0x713e, 0x7140, 0x7141, 0x7143, 0x3642, 0x3c73, 0x7144, 0x7145, 0x3961, 0x7146, 0x333e, 0x474f, 0x7147, 0x7148, 0x435a, 0x466b, 0x7149, 0x477d, 0x424c, 0x3158, 0x366e, 0x366f, 0x4373, 0x714e, 0x3670, 0x326f, 0x714d, 0x714b, 0x714c, 0x714a, 0x7158, 0x714f, 0x7150, 0x7151, 0x7152, 0x7154, 0x7153, 0x3d59, 0x7155, 0x7157, 0x3533, 0x7156, 0x417b, 0x3833, 0x7159, 0x424d, 0x715a, 0x462d, 0x715b, 0x7160, 0x715e, 0x715d, 0x715f, 0x715c, 0x7162, 0x7161, 0x7164, 0x3643, 0x7163, 0x7165, 0x7166, 0x7168, 0x7167, 0x7169, 0x716b, 0x716a, 0x397c, 0x716c, 0x716d, 0x333c, 0x716e, 0x716f, 0x3f71, 0x7170, 0x7171, 0x7172, 0x7173, 0x3962, 0x7174, 0x7175, 0x7176, 0x7177, 0x7178, 0x4831, 0x717a, 0x4926, 0x717b, 0x7179, 0x717d, 0x717c, 0x717e, 0x7221, 0x7222, 0x7223, 0x7224, 0x7225, 0x7226, 0x7227, 0x7228, 0x7229, 0x722a, 0x722b, 0x722c, 0x722d, 0x722e, 0x5d35, 0x722f, 0x6478, 0x3534, 0x3321, 0x3a32, 0x7231, 0x7230, 0x4c25, 0x7233, 0x7234, 0x7232, 0x7235, 0x4b62, 0x7236, 0x357b, 0x4f25, 0x7237, 0x7239, 0x303e, 0x723a, 0x4a2b, 0x7238, 0x723b, 0x723c, 0x723d, 0x723e, 0x723f, 0x4b6e, 0x3b2d, 0x3a7a, 0x412f, 0x7240, 0x7243, 0x7241, 0x7244, 0x3871, 0x7242, 0x7245, 0x7246, 0x7247, 0x724b, 0x3b2a, 0x4264, 0x724c, 0x7249, 0x7248, 0x724a, 0x375f, 0x7250, 0x724f, 0x724e, 0x3033, 0x725a, 0x7256, 0x7257, 0x7253, 0x7259, 0x7255, 0x3362, 0x4f4c, 0x7258, 0x7254, 0x7252, 0x7251, 0x725c, 0x725f, 0x725e, 0x725d, 0x4949, 0x725b, 0x3073, 0x7260, 0x7262, 0x336f, 0x724d, 0x3137, 0x7264, 0x7263, 0x7261, 0x432d, 0x4b70, 0x4e5a, 0x7265, 0x7266, 0x7267, 0x7268, 0x7269, 0x443b, 0x726a, 0x4837, 0x726f, 0x726b, 0x726c, 0x4b31, 0x4c44, 0x4650, 0x7270, 0x7271, 0x463e, 0x726e, 0x726d, 0x322a, 0x7279, 0x7278, 0x3175, 0x7276, 0x7275, 0x7273, 0x337b, 0x7272, 0x3c32, 0x3229, 0x3963, 0x727c, 0x727b, 0x727a, 0x7277, 0x727d, 0x727e, 0x7325, 0x7324, 0x7326, 0x312d, 0x7321, 0x7322, 0x3974, 0x4c39, 0x7323, 0x4b32, 0x732b, 0x7327, 0x732c, 0x7329, 0x7328, 0x375c, 0x732d, 0x732e, 0x732f, 0x732a, 0x7274, 0x7330, 0x4461, 0x7334, 0x7335, 0x7333, 0x7332, 0x7338, 0x7331, 0x7336, 0x7337, 0x733a, 0x7339, 0x733c, 0x733d, 0x733e, 0x4f49, 0x733b, 0x426b, 0x3a6d, 0x733f, 0x7340, 0x7341, 0x7342, 0x7343, 0x3834, 0x7344, 0x7345, 0x3c2f, 0x7346, 0x7347, 0x7348, 0x7349, 0x734c, 0x734a, 0x4f3c, 0x734b, 0x4e6f, 0x734d, 0x4e5b, 0x734e, 0x477e, 0x734f, 0x7351, 0x7352, 0x7350, 0x396d, 0x4c4d, 0x4b63, 0x5677, 0x5d60, 0x4b7b, 0x322b, 0x7354, 0x3550, 0x7355, 0x7356, 0x7357, 0x3975, 0x7358, 0x6054, 0x4c5b, 0x4263, 0x7359, 0x735b, 0x735a, 0x735c, 0x735d, 0x735e, 0x735f, 0x7360, 0x7361, 0x7362, 0x7363, 0x7364, 0x7365, 0x7366, 0x7367, 0x7368, 0x4524, 0x385d, 0x736a, 0x414d, 0x736b, 0x736c, 0x4921, 0x736d, 0x736e, 0x6337, 0x6c5a, 0x706d, 0x736f, 0x7370, 0x7372, 0x7373, 0x7374, 0x4e70, 0x7371, 0x7375, 0x7376, 0x7378, 0x7377, 0x737a, 0x737b, 0x7379, 0x4e36, 0x737c, 0x737d, 0x6354, 0x737e, 0x212a, 0x2174, 0x2170, 0x2173, 0x2175, 0x214a, 0x214b, 0x2176, 0x215c, 0x2124, 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, 0x2131, 0x216f, }; static const Summary16 jisx0208_uni2indx_page00[16] = { /* 0x0000 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x118c }, { 5, 0x0053 }, { 9, 0x0000 }, { 9, 0x0080 }, { 10, 0x0000 }, { 10, 0x0080 }, }; static const Summary16 jisx0208_uni2indx_page03[22] = { /* 0x0300 */ { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0xfffe }, { 26, 0x03fb }, { 35, 0xfffe }, { 50, 0x03fb }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, /* 0x0400 */ { 59, 0x0002 }, { 60, 0xffff }, { 76, 0xffff }, { 92, 0xffff }, { 108, 0xffff }, { 124, 0x0002 }, }; static const Summary16 jisx0208_uni2indx_page20[50] = { /* 0x2000 */ { 125, 0x0000 }, { 125, 0x3361 }, { 132, 0x0063 }, { 136, 0x080d }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, /* 0x2100 */ { 140, 0x0008 }, { 141, 0x0000 }, { 141, 0x0800 }, { 142, 0x0000 }, { 142, 0x0000 }, { 142, 0x0000 }, { 142, 0x0000 }, { 142, 0x0000 }, { 142, 0x0000 }, { 142, 0x000f }, { 146, 0x0000 }, { 146, 0x0000 }, { 146, 0x0000 }, { 146, 0x0014 }, { 148, 0x0000 }, { 148, 0x0000 }, /* 0x2200 */ { 148, 0x098d }, { 154, 0x6404 }, { 158, 0x1f81 }, { 165, 0x2030 }, { 168, 0x0000 }, { 168, 0x0004 }, { 169, 0x0cc3 }, { 175, 0x0000 }, { 175, 0x00cc }, { 179, 0x0000 }, { 179, 0x0020 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, /* 0x2300 */ { 180, 0x0000 }, { 180, 0x0004 }, }; static const Summary16 jisx0208_uni2indx_page25[23] = { /* 0x2500 */ { 181, 0x900f }, { 187, 0x3999 }, { 195, 0x9939 }, { 203, 0x9999 }, { 211, 0x0804 }, { 213, 0x0000 }, { 213, 0x0000 }, { 213, 0x0000 }, { 213, 0x0000 }, { 213, 0x0000 }, { 213, 0x0003 }, { 215, 0x300c }, { 219, 0xc8c0 }, { 224, 0x0000 }, { 224, 0x8000 }, { 225, 0x0000 }, /* 0x2600 */ { 225, 0x0060 }, { 227, 0x0000 }, { 227, 0x0000 }, { 227, 0x0000 }, { 227, 0x0005 }, { 229, 0x0000 }, { 229, 0xa400 }, }; static const Summary16 jisx0208_uni2indx_page30[16] = { /* 0x3000 */ { 232, 0xffef }, { 247, 0x103f }, { 254, 0x0000 }, { 254, 0x0000 }, { 254, 0xfffe }, { 269, 0xffff }, { 285, 0xffff }, { 301, 0xffff }, { 317, 0xffff }, { 333, 0x780f }, { 341, 0xfffe }, { 356, 0xffff }, { 372, 0xffff }, { 388, 0xffff }, { 404, 0xffff }, { 420, 0x787f }, }; static const Summary16 jisx0208_uni2indx_page4e[1307] = { /* 0x4e00 */ { 431, 0x6f8b }, { 441, 0x43f3 }, { 450, 0x2442 }, { 454, 0x9b46 }, { 462, 0xe82c }, { 469, 0xe3e0 }, { 477, 0x0004 }, { 478, 0x400a }, { 481, 0x5f65 }, { 491, 0xdb36 }, { 501, 0x7977 }, { 512, 0x0449 }, { 516, 0xecd7 }, { 527, 0xe3f0 }, { 536, 0x6038 }, { 541, 0x08c5 }, /* 0x4f00 */ { 546, 0xe602 }, { 552, 0x3403 }, { 557, 0x8000 }, { 558, 0x3551 }, { 565, 0xe0c8 }, { 571, 0x7eab }, { 582, 0x8200 }, { 584, 0x9869 }, { 591, 0xa948 }, { 597, 0x2942 }, { 602, 0xe803 }, { 608, 0x8060 }, { 611, 0x441c }, { 616, 0xad93 }, { 625, 0xc03a }, { 631, 0x4568 }, /* 0x5000 */ { 637, 0xaa60 }, { 643, 0x8656 }, { 650, 0x3f7a }, { 661, 0x0240 }, { 663, 0x8388 }, { 668, 0x1461 }, { 673, 0x1020 }, { 675, 0x2174 }, { 681, 0x2021 }, { 684, 0x0702 }, { 688, 0x3000 }, { 690, 0x40bc }, { 696, 0xa624 }, { 702, 0x4462 }, { 707, 0x60a8 }, { 712, 0x0a20 }, /* 0x5100 */ { 715, 0x0217 }, { 720, 0x8574 }, { 727, 0x0402 }, { 729, 0x9c84 }, { 735, 0x7bfb }, { 748, 0x1415 }, { 753, 0x7f24 }, { 762, 0x11e2 }, { 768, 0xb665 }, { 777, 0x02ef }, { 785, 0x1f75 }, { 795, 0x20ff }, { 804, 0x3a70 }, { 811, 0x3840 }, { 815, 0x26c3 }, { 822, 0x6763 }, /* 0x5200 */ { 831, 0x4dd9 }, { 840, 0x2092 }, { 844, 0x46b0 }, { 850, 0x0fc9 }, { 858, 0xbc98 }, { 866, 0x4850 }, { 870, 0x8638 }, { 876, 0xa03f }, { 884, 0x2388 }, { 889, 0x8816 }, { 894, 0x3e09 }, { 901, 0x5232 }, { 907, 0x22aa }, { 913, 0xe3a4 }, { 921, 0x00dd }, { 927, 0xc72c }, /* 0x5300 */ { 935, 0xa166 }, { 942, 0x26e1 }, { 949, 0x840b }, { 954, 0x8f0a }, { 961, 0x27eb }, { 971, 0x559e }, { 980, 0xc241 }, { 985, 0x89bb }, { 994, 0x0014 }, { 996, 0x8540 }, { 1000, 0x6361 }, { 1007, 0x0849 }, { 1011, 0x7f0c }, { 1020, 0x8ad0 }, { 1026, 0xff3e }, { 1039, 0x05cf }, /* 0x5400 */ { 1047, 0xff1a }, { 1058, 0xa803 }, { 1063, 0x7a41 }, { 1070, 0x7b40 }, { 1077, 0x4745 }, { 1084, 0x8002 }, { 1086, 0x0500 }, { 1088, 0x38eb }, { 1097, 0xd851 }, { 1104, 0x0005 }, { 1106, 0x9934 }, { 1113, 0x710c }, { 1119, 0x0397 }, { 1126, 0x0100 }, { 1127, 0x6366 }, { 1135, 0x2404 }, /* 0x5500 */ { 1138, 0x80d0 }, { 1142, 0x0051 }, { 1145, 0xc000 }, { 1147, 0x430a }, { 1152, 0x9071 }, { 1158, 0x30c8 }, { 1163, 0x0008 }, { 1164, 0x5800 }, { 1167, 0x0e99 }, { 1174, 0xf700 }, { 1181, 0x5f80 }, { 1188, 0x0041 }, { 1190, 0x00b0 }, { 1193, 0x9410 }, { 1197, 0x0018 }, { 1199, 0x6280 }, /* 0x5600 */ { 1203, 0x0240 }, { 1205, 0x09d0 }, { 1210, 0x8200 }, { 1212, 0x0156 }, { 1217, 0x5004 }, { 1220, 0x0801 }, { 1222, 0x1d10 }, { 1227, 0x0510 }, { 1230, 0x84c1 }, { 1235, 0x0010 }, { 1236, 0x4025 }, { 1240, 0x1050 }, { 1243, 0x410f }, { 1249, 0x4d8a }, { 1256, 0x4009 }, { 1259, 0xa60d }, /* 0x5700 */ { 1266, 0xab19 }, { 1274, 0x914c }, { 1280, 0x21c0 }, { 1284, 0x0981 }, { 1288, 0xc485 }, { 1294, 0x0003 }, { 1296, 0x0652 }, { 1301, 0x8000 }, { 1302, 0x0b04 }, { 1306, 0x0008 }, { 1307, 0x041d }, { 1312, 0x0009 }, { 1314, 0x4849 }, { 1319, 0x905c }, { 1325, 0x0009 }, { 1327, 0x1690 }, /* 0x5800 */ { 1332, 0x0c65 }, { 1338, 0x2220 }, { 1341, 0x8412 }, { 1345, 0x2433 }, { 1351, 0x0c03 }, { 1355, 0x4796 }, { 1363, 0x0a04 }, { 1366, 0x4225 }, { 1371, 0x0028 }, { 1373, 0x9088 }, { 1377, 0x4900 }, { 1380, 0x4f08 }, { 1386, 0x14a2 }, { 1391, 0xd3aa }, { 1400, 0xd830 }, { 1406, 0x3e87 }, /* 0x5900 */ { 1415, 0x8604 }, { 1419, 0x1f61 }, { 1427, 0x7ea4 }, { 1436, 0x4186 }, { 1441, 0xc390 }, { 1447, 0x05b3 }, { 1454, 0x57a5 }, { 1463, 0x2118 }, { 1467, 0x241e }, { 1473, 0x2a48 }, { 1478, 0x1128 }, { 1482, 0x4a04 }, { 1486, 0x0a40 }, { 1489, 0x161b }, { 1496, 0x0d60 }, { 1501, 0x8840 }, /* 0x5a00 */ { 1504, 0x020a }, { 1507, 0x9502 }, { 1512, 0x8221 }, { 1516, 0x1060 }, { 1519, 0x0243 }, { 1523, 0x0400 }, { 1524, 0x1444 }, { 1528, 0x8000 }, { 1529, 0x0000 }, { 1529, 0x0c04 }, { 1532, 0x0000 }, { 1532, 0x7000 }, { 1535, 0x1a06 }, { 1540, 0x00c1 }, { 1543, 0x024a }, { 1547, 0x0c00 }, /* 0x5b00 */ { 1549, 0x1a00 }, { 1552, 0x0040 }, { 1553, 0x1404 }, { 1556, 0x4045 }, { 1560, 0x0029 }, { 1563, 0xbdb3 }, { 1574, 0x0a78 }, { 1580, 0x052b }, { 1586, 0xbba9 }, { 1596, 0xbfa0 }, { 1605, 0x407c }, { 1611, 0x8379 }, { 1619, 0x12fc }, { 1627, 0xe81d }, { 1635, 0x4bf6 }, { 1645, 0xc569 }, /* 0x5c00 */ { 1653, 0xeff6 }, { 1666, 0x044a }, { 1670, 0x2115 }, { 1675, 0xff02 }, { 1684, 0xed63 }, { 1694, 0x402b }, { 1699, 0xd033 }, { 1706, 0x0242 }, { 1709, 0x1000 }, { 1710, 0x0013 }, { 1713, 0x1b02 }, { 1718, 0x59ca }, { 1726, 0x00a0 }, { 1728, 0x0200 }, { 1729, 0xa703 }, { 1736, 0x2c41 }, /* 0x5d00 */ { 1741, 0x4880 }, { 1744, 0x8ff2 }, { 1754, 0x0204 }, { 1756, 0x0000 }, { 1756, 0x5800 }, { 1759, 0x1005 }, { 1762, 0x9200 }, { 1765, 0x0048 }, { 1767, 0x1894 }, { 1772, 0x2001 }, { 1774, 0x5004 }, { 1777, 0x3480 }, { 1781, 0x3200 }, { 1784, 0x684c }, { 1790, 0x49ea }, { 1798, 0x68be }, /* 0x5e00 */ { 1807, 0x184c }, { 1812, 0x2e42 }, { 1818, 0xa820 }, { 1822, 0x21c9 }, { 1828, 0x50b9 }, { 1835, 0x80b0 }, { 1839, 0x001e }, { 1843, 0xff7c }, { 1856, 0x849a }, { 1862, 0x14e0 }, { 1867, 0x28c1 }, { 1872, 0x01e0 }, { 1876, 0x870e }, { 1883, 0xac49 }, { 1890, 0x130f }, { 1897, 0xdddb }, /* 0x5f00 */ { 1909, 0xbe1a }, { 1918, 0x89fb }, { 1928, 0xa2e0 }, { 1934, 0x51a2 }, { 1940, 0x5502 }, { 1945, 0x32ca }, { 1952, 0x3e46 }, { 1960, 0x928b }, { 1967, 0x1dbf }, { 1978, 0x438f }, { 1986, 0x6703 }, { 1993, 0x3218 }, { 1998, 0x3028 }, { 2002, 0x33c0 }, { 2008, 0x0811 }, { 2011, 0xa923 }, /* 0x6000 */ { 2018, 0xc000 }, { 2020, 0x3a65 }, { 2028, 0x8fe3 }, { 2038, 0x0402 }, { 2040, 0x2c4e }, { 2047, 0x8625 }, { 2053, 0xbf3d }, { 2065, 0x00a1 }, { 2068, 0x3a1a }, { 2075, 0x8cd4 }, { 2082, 0x06c9 }, { 2088, 0x317c }, { 2096, 0x00e0 }, { 2099, 0x950a }, { 2105, 0x018b }, { 2110, 0x0edb }, /* 0x6100 */ { 2119, 0xe34b }, { 2128, 0x8c20 }, { 2132, 0x1182 }, { 2136, 0xf010 }, { 2141, 0x7d94 }, { 2150, 0xa728 }, { 2157, 0xc9ac }, { 2165, 0x40fb }, { 2173, 0x4484 }, { 2177, 0x0653 }, { 2183, 0x5a90 }, { 2189, 0x4444 }, { 2193, 0x3fc8 }, { 2202, 0x0001 }, { 2203, 0x0048 }, { 2205, 0xf5d4 }, /* 0x6200 */ { 2215, 0x7701 }, { 2222, 0xec57 }, { 2232, 0xc442 }, { 2237, 0x891d }, { 2244, 0x6b83 }, { 2252, 0x4928 }, { 2257, 0x4109 }, { 2261, 0xd242 }, { 2267, 0x061d }, { 2273, 0x59fe }, { 2284, 0x1800 }, { 2286, 0x3a22 }, { 2292, 0xb7e4 }, { 2302, 0x3b9f }, { 2313, 0xf003 }, { 2319, 0xc0ea }, /* 0x6300 */ { 2326, 0x1386 }, { 2332, 0x8202 }, { 2335, 0x8980 }, { 2339, 0xe400 }, { 2343, 0xb200 }, { 2347, 0x10a1 }, { 2351, 0x4b80 }, { 2356, 0x0cc4 }, { 2361, 0xd309 }, { 2368, 0x8944 }, { 2373, 0x1faf }, { 2384, 0x4834 }, { 2389, 0x8259 }, { 2395, 0x0c45 }, { 2400, 0x420a }, { 2404, 0x0450 }, /* 0x6400 */ { 2407, 0xa040 }, { 2410, 0x10c8 }, { 2414, 0x3140 }, { 2418, 0x4450 }, { 2422, 0x4004 }, { 2424, 0x0100 }, { 2425, 0x8280 }, { 2428, 0x0540 }, { 2431, 0x0108 }, { 2433, 0x442c }, { 2438, 0x6a30 }, { 2444, 0x1a05 }, { 2449, 0x20a6 }, { 2454, 0x0514 }, { 2458, 0x90cf }, { 2466, 0x6456 }, /* 0x6500 */ { 2473, 0x0021 }, { 2475, 0x3100 }, { 2478, 0x9c18 }, { 2484, 0xcbf0 }, { 2493, 0xa120 }, { 2497, 0x63e2 }, { 2505, 0x104c }, { 2509, 0x01b5 }, { 2515, 0x538c }, { 2522, 0x9a83 }, { 2529, 0xb8b2 }, { 2537, 0x3281 }, { 2542, 0x987a }, { 2550, 0x0a84 }, { 2554, 0x33e7 }, { 2564, 0x0c02 }, /* 0x6600 */ { 2567, 0xd4cc }, { 2575, 0x9018 }, { 2579, 0xa1a1 }, { 2585, 0x9070 }, { 2590, 0x8a1e }, { 2597, 0xe004 }, { 2601, 0xc3d4 }, { 2609, 0x0451 }, { 2613, 0x439a }, { 2620, 0x21c2 }, { 2625, 0x4844 }, { 2629, 0x5310 }, { 2634, 0x0292 }, { 2638, 0x3640 }, { 2643, 0x0241 }, { 2646, 0xf3bd }, /* 0x6700 */ { 2658, 0xab09 }, { 2665, 0xe8f0 }, { 2673, 0x7dc0 }, { 2681, 0xa5d2 }, { 2689, 0xc242 }, { 2694, 0xd24b }, { 2702, 0xa43f }, { 2711, 0xd0af }, { 2720, 0x1aa0 }, { 2725, 0x34a1 }, { 2731, 0x8247 }, { 2737, 0x03d8 }, { 2743, 0xc452 }, { 2749, 0x651b }, { 2757, 0xd294 }, { 2764, 0xc83a }, /* 0x6800 */ { 2771, 0x001c }, { 2774, 0x40c8 }, { 2778, 0x0e06 }, { 2783, 0x3314 }, { 2789, 0x614f }, { 2797, 0xb21b }, { 2805, 0x0088 }, { 2807, 0xc0d0 }, { 2812, 0xa02a }, { 2817, 0xa898 }, { 2823, 0xa1c5 }, { 2830, 0x166b }, { 2838, 0x2e50 }, { 2844, 0x85b4 }, { 2851, 0xc08b }, { 2857, 0x0604 }, /* 0x6900 */ { 2860, 0xf933 }, { 2870, 0x1e04 }, { 2875, 0x056e }, { 2882, 0xa251 }, { 2888, 0x0400 }, { 2889, 0x7638 }, { 2897, 0xec07 }, { 2905, 0x73b8 }, { 2914, 0x4406 }, { 2918, 0x1832 }, { 2923, 0x4081 }, { 2926, 0xc816 }, { 2932, 0x7c8a }, { 2940, 0x6309 }, { 2946, 0x2980 }, { 2950, 0xaa04 }, /* 0x6a00 */ { 2955, 0x1c24 }, { 2960, 0xca9c }, { 2968, 0x4e0e }, { 2975, 0x2760 }, { 2981, 0x0990 }, { 2985, 0x8300 }, { 2988, 0x0046 }, { 2991, 0x8104 }, { 2994, 0x6011 }, { 2998, 0x1081 }, { 3001, 0x540d }, { 3007, 0x0908 }, { 3010, 0x000e }, { 3013, 0xcc0a }, { 3019, 0x0500 }, { 3021, 0x0c00 }, /* 0x6b00 */ { 3023, 0x0430 }, { 3026, 0xa044 }, { 3030, 0x008b }, { 3034, 0x6784 }, { 3041, 0x5288 }, { 3046, 0x8a19 }, { 3052, 0x865e }, { 3060, 0x8b18 }, { 3066, 0x2e59 }, { 3074, 0x4160 }, { 3078, 0x8c10 }, { 3082, 0x9cbe }, { 3092, 0x6861 }, { 3098, 0x891c }, { 3104, 0x9800 }, { 3107, 0x0008 }, /* 0x6c00 */ { 3108, 0x8100 }, { 3110, 0x089a }, { 3115, 0x0018 }, { 3117, 0x4190 }, { 3121, 0x4007 }, { 3125, 0xe4a1 }, { 3132, 0x0505 }, { 3136, 0x640d }, { 3142, 0x310e }, { 3148, 0x0e4d }, { 3155, 0x4806 }, { 3159, 0xff0a }, { 3169, 0x1632 }, { 3175, 0x2aa8 }, { 3181, 0x852e }, { 3188, 0x000b }, /* 0x6d00 */ { 3191, 0x1800 }, { 3193, 0xca84 }, { 3199, 0x0e20 }, { 3203, 0x696c }, { 3211, 0x0032 }, { 3214, 0x1600 }, { 3217, 0x5658 }, { 3224, 0x0390 }, { 3228, 0x5120 }, { 3232, 0x1a28 }, { 3237, 0x8000 }, { 3238, 0x1124 }, { 3242, 0x18e1 }, { 3248, 0x4326 }, { 3254, 0x5d52 }, { 3262, 0x0eaa }, /* 0x6e00 */ { 3269, 0x0fa0 }, { 3275, 0xae28 }, { 3282, 0xfa7b }, { 3294, 0x4500 }, { 3297, 0x6408 }, { 3301, 0x8940 }, { 3305, 0xc880 }, { 3309, 0xc044 }, { 3313, 0x9005 }, { 3317, 0xb141 }, { 3323, 0x8424 }, { 3327, 0x24c4 }, { 3332, 0x1a34 }, { 3338, 0x603a }, { 3344, 0x9000 }, { 3346, 0xc194 }, /* 0x6f00 */ { 3352, 0x8246 }, { 3357, 0x003a }, { 3361, 0x180d }, { 3366, 0xc106 }, { 3371, 0x0022 }, { 3373, 0x9910 }, { 3378, 0xe050 }, { 3383, 0x1511 }, { 3388, 0x4057 }, { 3394, 0x0082 }, { 3396, 0x041a }, { 3400, 0x020a }, { 3403, 0x004f }, { 3408, 0x8930 }, { 3413, 0xd813 }, { 3420, 0x444a }, /* 0x7000 */ { 3425, 0x8a02 }, { 3429, 0xed22 }, { 3437, 0x10c0 }, { 3440, 0x4005 }, { 3443, 0x1000 }, { 3444, 0x0102 }, { 3446, 0x8808 }, { 3449, 0x3101 }, { 3453, 0x4600 }, { 3456, 0x0204 }, { 3458, 0xf000 }, { 3462, 0x0708 }, { 3466, 0x8900 }, { 3469, 0xa200 }, { 3472, 0x0000 }, { 3472, 0x2202 }, /* 0x7100 */ { 3475, 0x0200 }, { 3476, 0x1610 }, { 3480, 0x0042 }, { 3482, 0x1040 }, { 3484, 0x5200 }, { 3487, 0x0260 }, { 3490, 0x52f4 }, { 3498, 0x2000 }, { 3499, 0x8510 }, { 3503, 0x8230 }, { 3507, 0x1100 }, { 3509, 0x4202 }, { 3512, 0x4308 }, { 3516, 0x80b5 }, { 3522, 0x70e1 }, { 3529, 0x9a20 }, /* 0x7200 */ { 3534, 0x2040 }, { 3536, 0x0801 }, { 3538, 0x3500 }, { 3542, 0xfc65 }, { 3552, 0x19c1 }, { 3558, 0xab04 }, { 3564, 0x0286 }, { 3568, 0x6214 }, { 3573, 0x0087 }, { 3577, 0x0044 }, { 3579, 0x9085 }, { 3584, 0x0244 }, { 3587, 0x405c }, { 3592, 0x0a85 }, { 3597, 0x3207 }, { 3603, 0x3380 }, /* 0x7300 */ { 3608, 0x0400 }, { 3609, 0xb8c0 }, { 3615, 0xce20 }, { 3621, 0xc0d0 }, { 3626, 0xc030 }, { 3630, 0x0080 }, { 3631, 0x0508 }, { 3634, 0x0d25 }, { 3640, 0x0a90 }, { 3644, 0x0040 }, { 3645, 0x0200 }, { 3646, 0x080c }, { 3649, 0x6505 }, { 3655, 0x4000 }, { 3656, 0x6421 }, { 3661, 0x4102 }, /* 0x7400 */ { 3664, 0x0268 }, { 3668, 0x0000 }, { 3668, 0x0024 }, { 3670, 0x847c }, { 3677, 0x0002 }, { 3678, 0xde20 }, { 3685, 0x8619 }, { 3691, 0x4049 }, { 3695, 0x0808 }, { 3697, 0x4000 }, { 3698, 0x0084 }, { 3700, 0x2001 }, { 3702, 0x8400 }, { 3704, 0x1010 }, { 3706, 0x42cd }, { 3713, 0x01c7 }, /* 0x7500 */ { 3719, 0x7038 }, { 3725, 0xd52a }, { 3733, 0x1968 }, { 3739, 0x1d8f }, { 3748, 0xbe50 }, { 3756, 0x3e12 }, { 3763, 0x2ef5 }, { 3773, 0x81d9 }, { 3780, 0xcec4 }, { 3788, 0x2412 }, { 3792, 0x0828 }, { 3795, 0x732e }, { 3804, 0x24ac }, { 3810, 0x4b34 }, { 3817, 0x020c }, { 3820, 0xd41d }, /* 0x7600 */ { 3828, 0x2a02 }, { 3832, 0x8000 }, { 3833, 0x0097 }, { 3838, 0x0811 }, { 3841, 0x11c4 }, { 3846, 0x1144 }, { 3850, 0x1786 }, { 3857, 0x7d45 }, { 3866, 0x49d9 }, { 3874, 0x0649 }, { 3879, 0x4000 }, { 3880, 0x8791 }, { 3887, 0x254c }, { 3893, 0xd8c4 }, { 3900, 0x44ba }, { 3907, 0x4914 }, /* 0x7700 */ { 3912, 0x1b92 }, { 3919, 0xc800 }, { 3922, 0x0271 }, { 3927, 0x1580 }, { 3931, 0x0081 }, { 3933, 0x0c00 }, { 3935, 0x096a }, { 3941, 0xc200 }, { 3944, 0x4800 }, { 3946, 0x4002 }, { 3948, 0x3021 }, { 3952, 0xba49 }, { 3960, 0x2080 }, { 3962, 0x1c80 }, { 3966, 0xe2ac }, { 3974, 0x1008 }, /* 0x7800 */ { 3976, 0x1004 }, { 3978, 0x0034 }, { 3981, 0x00e1 }, { 3985, 0x8414 }, { 3989, 0x0020 }, { 3990, 0x2000 }, { 3991, 0x9800 }, { 3994, 0x1014 }, { 3997, 0x70c2 }, { 4003, 0x04aa }, { 4008, 0x8688 }, { 4013, 0x5420 }, { 4017, 0x0c62 }, { 4022, 0x0413 }, { 4026, 0x9180 }, { 4030, 0x2010 }, /* 0x7900 */ { 4032, 0x4082 }, { 4035, 0x0206 }, { 4038, 0x1c40 }, { 4042, 0x5400 }, { 4045, 0x0383 }, { 4050, 0xe4e9 }, { 4059, 0x2125 }, { 4064, 0x8480 }, { 4067, 0xe433 }, { 4075, 0x2000 }, { 4076, 0x44c0 }, { 4080, 0xe609 }, { 4087, 0x0a03 }, { 4091, 0x8126 }, { 4096, 0x12da }, { 4103, 0x0801 }, /* 0x7a00 */ { 4105, 0x6901 }, { 4110, 0x9790 }, { 4117, 0x4001 }, { 4119, 0xf886 }, { 4127, 0xe24d }, { 4135, 0x0081 }, { 4137, 0x0a0e }, { 4142, 0xa651 }, { 4149, 0x011a }, { 4153, 0x81ec }, { 4160, 0xc600 }, { 4164, 0x8441 }, { 4168, 0xadb8 }, { 4177, 0xb62c }, { 4185, 0xa46f }, { 4194, 0x8741 }, /* 0x7b00 */ { 4200, 0x8d54 }, { 4207, 0x4b02 }, { 4212, 0x1161 }, { 4217, 0x0268 }, { 4221, 0xbb60 }, { 4229, 0x2057 }, { 4235, 0x50a0 }, { 4239, 0x0433 }, { 4244, 0xa8c0 }, { 4249, 0xb7b4 }, { 4259, 0x2402 }, { 4262, 0x0112 }, { 4265, 0x9ad3 }, { 4274, 0x2000 }, { 4275, 0x2271 }, { 4281, 0x00c8 }, /* 0x7c00 */ { 4284, 0x2081 }, { 4287, 0x809e }, { 4293, 0x0c8a }, { 4298, 0xe180 }, { 4303, 0xb009 }, { 4308, 0x8151 }, { 4313, 0x1031 }, { 4317, 0x4028 }, { 4320, 0x2a0e }, { 4326, 0x89a5 }, { 4333, 0x69b6 }, { 4342, 0x620e }, { 4348, 0x4425 }, { 4353, 0xd144 }, { 4359, 0x8085 }, { 4363, 0x4d54 }, /* 0x7d00 */ { 4370, 0x2c75 }, { 4378, 0x1fb1 }, { 4387, 0xd807 }, { 4394, 0x862d }, { 4401, 0xd87c }, { 4410, 0x4841 }, { 4414, 0x414e }, { 4420, 0x226e }, { 4427, 0x8200 }, { 4429, 0x9e08 }, { 4435, 0xf80c }, { 4442, 0xed37 }, { 4453, 0x8c80 }, { 4457, 0x7526 }, { 4465, 0x9313 }, { 4472, 0x0814 }, /* 0x7e00 */ { 4475, 0x0e32 }, { 4481, 0xc804 }, { 4485, 0x484e }, { 4491, 0x6ea6 }, { 4500, 0x2c4a }, { 4506, 0x6670 }, { 4513, 0x26c0 }, { 4518, 0xba01 }, { 4524, 0xd30c }, { 4531, 0x185d }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, /* 0x7f00 */ { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0540 }, { 4541, 0x7020 }, { 4545, 0x8133 }, { 4551, 0x4f81 }, { 4558, 0x03a5 }, { 4564, 0x55ec }, { 4573, 0x6410 }, { 4577, 0xc318 }, { 4583, 0x2344 }, { 4588, 0x1462 }, { 4593, 0x0034 }, { 4596, 0x0a43 }, { 4601, 0x1a09 }, /* 0x8000 */ { 4606, 0x187b }, { 4614, 0x13a5 }, { 4621, 0x0102 }, { 4623, 0xa848 }, { 4628, 0x0440 }, { 4630, 0xc544 }, { 4636, 0x8106 }, { 4640, 0xe2dd }, { 4650, 0x1af0 }, { 4657, 0x2d48 }, { 4663, 0xb626 }, { 4671, 0x0416 }, { 4675, 0x5058 }, { 4680, 0x6e40 }, { 4686, 0x8032 }, { 4690, 0x3112 }, /* 0x8100 */ { 4695, 0x07e4 }, { 4702, 0x0c00 }, { 4704, 0x8208 }, { 4707, 0x420a }, { 4711, 0x4840 }, { 4714, 0x803b }, { 4720, 0x4860 }, { 4724, 0x8713 }, { 4731, 0x850d }, { 4737, 0x3428 }, { 4742, 0x0319 }, { 4747, 0xe529 }, { 4755, 0x2345 }, { 4761, 0x870a }, { 4767, 0x25a9 }, { 4774, 0x5c18 }, /* 0x8200 */ { 4780, 0x77a6 }, { 4790, 0xd9c5 }, { 4799, 0x5e00 }, { 4804, 0x03e8 }, { 4810, 0x0081 }, { 4812, 0xa700 }, { 4817, 0xcd54 }, { 4825, 0x41c6 }, { 4831, 0x2800 }, { 4833, 0xa204 }, { 4837, 0xb860 }, { 4843, 0x2b0a }, { 4849, 0x0020 }, { 4850, 0xda9e }, { 4860, 0x08ea }, { 4866, 0x0e1a }, /* 0x8300 */ { 4872, 0x427c }, { 4879, 0x11c0 }, { 4883, 0x8908 }, { 4887, 0x0376 }, { 4894, 0x8621 }, { 4899, 0x0105 }, { 4902, 0x0000 }, { 4902, 0x18a8 }, { 4907, 0x46a0 }, { 4912, 0xc448 }, { 4917, 0x0d05 }, { 4922, 0x2022 }, { 4925, 0x5422 }, { 4930, 0x9148 }, { 4935, 0x8a01 }, { 4939, 0x2897 }, /* 0x8400 */ { 4946, 0x7898 }, { 4953, 0x0008 }, { 4954, 0x1605 }, { 4959, 0x3122 }, { 4964, 0x4240 }, { 4967, 0x0880 }, { 4969, 0xfa4e }, { 4979, 0x06a2 }, { 4984, 0x0814 }, { 4987, 0x9211 }, { 4992, 0x2002 }, { 4994, 0x9b04 }, { 5000, 0x2e52 }, { 5007, 0x0643 }, { 5012, 0x5000 }, { 5014, 0x9010 }, /* 0x8500 */ { 5017, 0x0041 }, { 5019, 0x85ba }, { 5027, 0x3042 }, { 5031, 0x2020 }, { 5033, 0x4f0b }, { 5041, 0x05a0 }, { 5045, 0x2708 }, { 5050, 0x4080 }, { 5052, 0x0591 }, { 5057, 0x1a93 }, { 5064, 0xdf50 }, { 5073, 0x0600 }, { 5075, 0xa202 }, { 5079, 0x3021 }, { 5083, 0x0630 }, { 5087, 0x4e80 }, /* 0x8600 */ { 5092, 0x0cc4 }, { 5097, 0x04c8 }, { 5101, 0xa004 }, { 5104, 0x8001 }, { 5106, 0x6000 }, { 5108, 0xd431 }, { 5115, 0x0880 }, { 5117, 0x0a02 }, { 5120, 0x1c00 }, { 5123, 0x0028 }, { 5125, 0x8e18 }, { 5131, 0x0041 }, { 5133, 0x6ad0 }, { 5140, 0xca10 }, { 5145, 0xf210 }, { 5151, 0x4b00 }, /* 0x8700 */ { 5155, 0x274d }, { 5163, 0x1506 }, { 5168, 0x0220 }, { 5170, 0x8890 }, { 5174, 0x5a00 }, { 5178, 0x82a8 }, { 5183, 0x4549 }, { 5189, 0x8150 }, { 5193, 0x2004 }, { 5195, 0x8000 }, { 5196, 0x8804 }, { 5199, 0x2c08 }, { 5203, 0x08d1 }, { 5208, 0x0005 }, { 5210, 0x8001 }, { 5212, 0x4ac4 }, /* 0x8800 */ { 5218, 0xe020 }, { 5222, 0x0062 }, { 5225, 0x008e }, { 5229, 0x0a42 }, { 5233, 0x3055 }, { 5239, 0x6a8c }, { 5246, 0x090e }, { 5251, 0xe0a5 }, { 5258, 0x2906 }, { 5263, 0x42c4 }, { 5268, 0x4814 }, { 5272, 0x80b3 }, { 5278, 0x803e }, { 5284, 0xb330 }, { 5291, 0x0102 }, { 5293, 0x731c }, /* 0x8900 */ { 5301, 0x1494 }, { 5306, 0x600d }, { 5311, 0x0c20 }, { 5314, 0x0940 }, { 5317, 0x301a }, { 5322, 0xc040 }, { 5325, 0xa451 }, { 5331, 0xc094 }, { 5336, 0x8dca }, { 5344, 0x05c8 }, { 5349, 0x96c2 }, { 5356, 0xa40c }, { 5361, 0x0001 }, { 5362, 0x3404 }, { 5366, 0x00c8 }, { 5369, 0x0110 }, /* 0x8a00 */ { 5371, 0x550d }, { 5378, 0xa9c9 }, { 5386, 0x2428 }, { 5390, 0x1c5a }, { 5397, 0x0142 }, { 5400, 0x4837 }, { 5407, 0x7a4d }, { 5416, 0x100f }, { 5421, 0x32b4 }, { 5428, 0x452a }, { 5434, 0x317b }, { 5443, 0x9205 }, { 5448, 0xb894 }, { 5455, 0x5c44 }, { 5461, 0x68d7 }, { 5470, 0x458a }, /* 0x8b00 */ { 5476, 0x5097 }, { 5483, 0x2ed1 }, { 5491, 0x1943 }, { 5497, 0x4208 }, { 5500, 0xd202 }, { 5505, 0x9d40 }, { 5511, 0x9840 }, { 5515, 0x2097 }, { 5521, 0x5409 }, { 5526, 0x064d }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, /* 0x8c00 */ { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x8480 }, { 5535, 0x5542 }, { 5541, 0x0421 }, { 5544, 0x1c06 }, { 5549, 0x1700 }, { 5553, 0x7624 }, { 5560, 0x6110 }, { 5564, 0xff87 }, { 5576, 0xb9dd }, { 5587, 0x659f }, { 5597, 0x5c0a }, { 5603, 0x245d }, { 5610, 0x3c00 }, /* 0x8d00 */ { 5614, 0xadb0 }, { 5622, 0x0059 }, { 5626, 0x0000 }, { 5626, 0x0000 }, { 5626, 0x0000 }, { 5626, 0x0000 }, { 5626, 0x28d0 }, { 5631, 0x009b }, { 5636, 0x0422 }, { 5639, 0x0200 }, { 5640, 0x0108 }, { 5642, 0x4408 }, { 5645, 0x9804 }, { 5649, 0xac40 }, { 5654, 0x8d0a }, { 5660, 0x9028 }, /* 0x8e00 */ { 5664, 0x8700 }, { 5668, 0xe001 }, { 5672, 0x0400 }, { 5673, 0x0031 }, { 5676, 0x1794 }, { 5683, 0x8221 }, { 5687, 0x0019 }, { 5690, 0x1054 }, { 5694, 0x2cb2 }, { 5701, 0x021a }, { 5705, 0x9c02 }, { 5710, 0x4003 }, { 5713, 0x3d60 }, { 5720, 0x8804 }, { 5723, 0x080c }, { 5726, 0x7900 }, /* 0x8f00 */ { 5731, 0x1628 }, { 5736, 0xba3c }, { 5745, 0x8640 }, { 5749, 0xcb08 }, { 5755, 0x7274 }, { 5763, 0x9080 }, { 5766, 0x001e }, { 5770, 0x0000 }, { 5770, 0x0000 }, { 5770, 0xd800 }, { 5774, 0xe188 }, { 5780, 0x9c87 }, { 5788, 0x4034 }, { 5792, 0x0412 }, { 5795, 0xae64 }, { 5803, 0x2791 }, /* 0x9000 */ { 5810, 0xe86b }, { 5819, 0xe6fb }, { 5831, 0x408f }, { 5837, 0x5366 }, { 5845, 0xeea6 }, { 5855, 0x537f }, { 5866, 0xe32b }, { 5875, 0xb5e4 }, { 5884, 0x869f }, { 5893, 0x0002 }, { 5894, 0x8548 }, { 5899, 0x0122 }, { 5902, 0x4402 }, { 5905, 0x0800 }, { 5906, 0x2116 }, { 5911, 0x20a0 }, /* 0x9100 */ { 5914, 0x0004 }, { 5915, 0x0204 }, { 5917, 0x2000 }, { 5918, 0x0005 }, { 5920, 0x7e00 }, { 5926, 0x0154 }, { 5930, 0x162c }, { 5936, 0x01ac }, { 5941, 0x2a84 }, { 5946, 0x1085 }, { 5950, 0x8c14 }, { 5955, 0x0530 }, { 5959, 0xfbc3 }, { 5970, 0xb943 }, { 5978, 0x00ca }, { 5982, 0x9060 }, /* 0x9200 */ { 5986, 0x6000 }, { 5988, 0x4032 }, { 5992, 0x1200 }, { 5994, 0x8090 }, { 5997, 0x0b30 }, { 6002, 0x4c81 }, { 6007, 0x0054 }, { 6010, 0x4002 }, { 6012, 0x0029 }, { 6015, 0x1d6a }, { 6023, 0x2000 }, { 6024, 0x0280 }, { 6026, 0x8000 }, { 6027, 0x0004 }, { 6028, 0x2610 }, { 6032, 0x150c }, /* 0x9300 */ { 6037, 0x8040 }, { 6039, 0x0701 }, { 6043, 0xd94d }, { 6052, 0x0c24 }, { 6056, 0x2810 }, { 6059, 0x1850 }, { 6063, 0x5001 }, { 6066, 0x5020 }, { 6069, 0x1000 }, { 6070, 0x04d0 }, { 6074, 0x7080 }, { 6078, 0x0201 }, { 6080, 0x0108 }, { 6082, 0x21c3 }, { 6088, 0x0132 }, { 6092, 0x0000 }, /* 0x9400 */ { 6092, 0x0088 }, { 6094, 0x0719 }, { 6100, 0x0802 }, { 6102, 0x0560 }, { 6106, 0x0012 }, { 6108, 0x4c0e }, { 6114, 0x0405 }, { 6117, 0xf0a1 }, { 6124, 0x0002 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, /* 0x9500 */ { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0080 }, { 6126, 0x8e8d }, { 6134, 0x035a }, { 6140, 0x21bd }, { 6148, 0x5a04 }, { 6153, 0x3488 }, { 6158, 0x1170 }, { 6163, 0x0026 }, { 6166, 0x0000 }, /* 0x9600 */ { 6166, 0x0000 }, { 6166, 0x1000 }, { 6167, 0xc502 }, { 6172, 0x8804 }, { 6175, 0xb815 }, { 6182, 0xf801 }, { 6188, 0x147c }, { 6195, 0x25ed }, { 6204, 0xed60 }, { 6212, 0x1bb0 }, { 6219, 0x0589 }, { 6224, 0x1bd7 }, { 6234, 0x7af3 }, { 6245, 0x1a62 }, { 6251, 0x0d0c }, { 6256, 0x0ac5 }, /* 0x9700 */ { 6262, 0xe5d1 }, { 6271, 0x524a }, { 6277, 0x0490 }, { 6280, 0x6305 }, { 6286, 0x0354 }, { 6291, 0x5244 }, { 6296, 0x2b57 }, { 6305, 0x1612 }, { 6310, 0xa872 }, { 6317, 0x1101 }, { 6320, 0x2949 }, { 6326, 0x0018 }, { 6328, 0x0948 }, { 6332, 0x1008 }, { 6334, 0x6000 }, { 6336, 0x886c }, /* 0x9800 */ { 6342, 0x916e }, { 6350, 0x058f }, { 6357, 0x3012 }, { 6361, 0x3990 }, { 6367, 0xf840 }, { 6373, 0x4930 }, { 6378, 0x8880 }, { 6381, 0x001b }, { 6385, 0x0000 }, { 6385, 0x0000 }, { 6385, 0x8500 }, { 6388, 0x0042 }, { 6390, 0x0058 }, { 6393, 0x9800 }, { 6396, 0xea04 }, { 6402, 0x7014 }, /* 0x9900 */ { 6407, 0x1628 }, { 6412, 0x611d }, { 6419, 0x5113 }, { 6425, 0x6000 }, { 6427, 0x1a24 }, { 6432, 0x00a7 }, { 6437, 0x0000 }, { 6437, 0x0000 }, { 6437, 0x0000 }, { 6437, 0x03c0 }, { 6441, 0x7120 }, { 6446, 0x1018 }, { 6449, 0x0172 }, { 6454, 0xa927 }, { 6462, 0x6004 }, { 6465, 0x8906 }, /* 0x9a00 */ { 6470, 0xc022 }, { 6474, 0x020c }, { 6477, 0x0900 }, { 6479, 0x4081 }, { 6482, 0x202d }, { 6487, 0x8ca0 }, { 6492, 0x0e34 }, { 6498, 0x0000 }, { 6498, 0x0000 }, { 6498, 0x0000 }, { 6498, 0x2100 }, { 6500, 0x1101 }, { 6503, 0x8011 }, { 6506, 0xc11a }, { 6512, 0xec4c }, { 6520, 0x0892 }, /* 0x9b00 */ { 6524, 0x0040 }, { 6525, 0x8500 }, { 6528, 0xc7ac }, { 6537, 0x1806 }, { 6541, 0xe03e }, { 6549, 0x0512 }, { 6553, 0x8000 }, { 6554, 0x0010 }, { 6555, 0x4008 }, { 6557, 0x80ce }, { 6563, 0x6d01 }, { 6569, 0x0210 }, { 6571, 0x8641 }, { 6576, 0x0856 }, { 6581, 0x011e }, { 6586, 0x0027 }, /* 0x9c00 */ { 6590, 0x3750 }, { 6597, 0x083d }, { 6603, 0xe032 }, { 6609, 0x4e05 }, { 6615, 0x01c0 }, { 6618, 0x0484 }, { 6621, 0x0081 }, { 6623, 0x0140 }, { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x1aa0 }, { 6630, 0x0059 }, /* 0x9d00 */ { 6634, 0x43c8 }, { 6640, 0x8824 }, { 6644, 0x1d48 }, { 6650, 0xc800 }, { 6653, 0x0152 }, { 6657, 0x7203 }, { 6663, 0x9013 }, { 6668, 0x0404 }, { 6670, 0x8280 }, { 6673, 0x0400 }, { 6674, 0x8a10 }, { 6678, 0x0d14 }, { 6683, 0x8056 }, { 6688, 0x0208 }, { 6690, 0xa040 }, { 6693, 0x2704 }, /* 0x9e00 */ { 6698, 0x0000 }, { 6698, 0x4c00 }, { 6701, 0x0000 }, { 6701, 0x0000 }, { 6701, 0x0000 }, { 6701, 0x0000 }, { 6701, 0x0000 }, { 6701, 0xa320 }, { 6706, 0x1902 }, { 6710, 0xa0ae }, { 6717, 0x2660 }, { 6722, 0xdf00 }, { 6729, 0xf010 }, { 6734, 0x7b15 }, { 6743, 0x8121 }, { 6747, 0x3ad0 }, /* 0x9f00 */ { 6754, 0x4180 }, { 6757, 0x0028 }, { 6759, 0x1003 }, { 6762, 0x4800 }, { 6764, 0xcc00 }, { 6768, 0x8014 }, { 6771, 0x14cf }, { 6779, 0x00c4 }, { 6782, 0x2000 }, { 6783, 0x3020 }, { 6786, 0x0001 }, }; static const Summary16 jisx0208_uni2indx_pageff[15] = { /* 0xff00 */ { 6787, 0xdf7a }, { 6799, 0xffff }, { 6815, 0xffff }, { 6831, 0xffff }, { 6847, 0xffff }, { 6863, 0x3fff }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0028 }, }; static int jisx0208_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc >= 0x0000 && wc < 0x0100) summary = &jisx0208_uni2indx_page00[(wc>>4)]; else if (wc >= 0x0300 && wc < 0x0460) summary = &jisx0208_uni2indx_page03[(wc>>4)-0x030]; else if (wc >= 0x2000 && wc < 0x2320) summary = &jisx0208_uni2indx_page20[(wc>>4)-0x200]; else if (wc >= 0x2500 && wc < 0x2670) summary = &jisx0208_uni2indx_page25[(wc>>4)-0x250]; else if (wc >= 0x3000 && wc < 0x3100) summary = &jisx0208_uni2indx_page30[(wc>>4)-0x300]; else if (wc >= 0x4e00 && wc < 0x9fb0) summary = &jisx0208_uni2indx_page4e[(wc>>4)-0x4e0]; else if (wc >= 0xff00 && wc < 0xfff0) summary = &jisx0208_uni2indx_pageff[(wc>>4)-0xff0]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' 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); c = jisx0208_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/jisx0212.h000066400000000000000000004056071252300335000243740ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * JISX0212.1990-0 */ static const unsigned short jisx0212_2uni_page22[81] = { /* 0x22 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x02d8, 0x02c7, 0x00b8, 0x02d9, 0x02dd, 0x00af, 0x02db, 0x02da, 0xff5e, 0x0384, 0x0385, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x00a1, 0x00a6, 0x00bf, 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x00ba, 0x00aa, 0x00a9, 0x00ae, 0x2122, 0x00a4, 0x2116, }; static const unsigned short jisx0212_2uni_page26[188] = { /* 0x26 */ 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, 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, 0x0386, 0x0388, 0x0389, 0x038a, 0x03aa, 0xfffd, 0x038c, 0xfffd, 0x038e, 0x03ab, 0xfffd, 0x038f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03ca, 0x0390, 0x03cc, 0x03c2, 0x03cd, 0x03cb, 0x03b0, 0x03ce, 0xfffd, 0xfffd, /* 0x27 */ 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, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x040e, 0x040f, 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, 0xfffd, 0xfffd, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x045e, 0x045f, }; static const unsigned short jisx0212_2uni_page29[275] = { /* 0x29 */ 0x00c6, 0x0110, 0xfffd, 0x0126, 0xfffd, 0x0132, 0xfffd, 0x0141, 0x013f, 0xfffd, 0x014a, 0x00d8, 0x0152, 0xfffd, 0x0166, 0x00de, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x00e6, 0x0111, 0x00f0, 0x0127, 0x0131, 0x0133, 0x0138, 0x0142, 0x0140, 0x0149, 0x014b, 0x00f8, 0x0153, 0x00df, 0x0167, 0x00fe, 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x2a */ 0x00c1, 0x00c0, 0x00c4, 0x00c2, 0x0102, 0x01cd, 0x0100, 0x0104, 0x00c5, 0x00c3, 0x0106, 0x0108, 0x010c, 0x00c7, 0x010a, 0x010e, 0x00c9, 0x00c8, 0x00cb, 0x00ca, 0x011a, 0x0116, 0x0112, 0x0118, 0xfffd, 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x2b */ 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, 0xfffd, 0x0121, 0x0125, 0x00ed, 0x00ec, 0x00ef, 0x00ee, 0x01d0, 0xfffd, 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, }; static const unsigned short jisx0212_2uni_page30[5801] = { /* 0x30 */ 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, /* 0x31 */ 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, /* 0x32 */ 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, /* 0x33 */ 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, /* 0x34 */ 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, /* 0x35 */ 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, /* 0x36 */ 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, /* 0x37 */ 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, /* 0x38 */ 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, /* 0x39 */ 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, /* 0x3a */ 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, /* 0x3b */ 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, /* 0x3c */ 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, /* 0x3d */ 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, /* 0x3e */ 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, /* 0x3f */ 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, /* 0x40 */ 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, /* 0x41 */ 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, /* 0x42 */ 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, /* 0x43 */ 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, /* 0x44 */ 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, /* 0x45 */ 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, /* 0x46 */ 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, /* 0x47 */ 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, /* 0x48 */ 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, /* 0x49 */ 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, /* 0x4a */ 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, /* 0x4b */ 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, /* 0x4c */ 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, /* 0x4d */ 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, /* 0x4e */ 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, /* 0x4f */ 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, /* 0x50 */ 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, /* 0x51 */ 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, /* 0x52 */ 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, /* 0x53 */ 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, /* 0x54 */ 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, /* 0x55 */ 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, /* 0x56 */ 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, /* 0x57 */ 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, /* 0x58 */ 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, /* 0x59 */ 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, /* 0x5a */ 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, /* 0x5b */ 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, /* 0x5c */ 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, /* 0x5d */ 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, /* 0x5e */ 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, /* 0x5f */ 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, /* 0x60 */ 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, /* 0x61 */ 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, /* 0x62 */ 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, /* 0x63 */ 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, /* 0x64 */ 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, /* 0x65 */ 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, /* 0x66 */ 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, /* 0x67 */ 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, /* 0x68 */ 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, /* 0x69 */ 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, /* 0x6a */ 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, /* 0x6b */ 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, /* 0x6c */ 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, /* 0x6d */ 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, }; static int jisx0212_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 == 0x22) || (c1 >= 0x26 && c1 <= 0x27) || (c1 >= 0x29 && c1 <= 0x2b) || (c1 >= 0x30 && c1 <= 0x6d)) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x21 && c2 < 0x7f) { unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); unsigned short wc = 0xfffd; if (i < 470) { if (i < 175) wc = jisx0212_2uni_page22[i-94]; } else if (i < 752) { if (i < 658) wc = jisx0212_2uni_page26[i-470]; } else if (i < 1410) { if (i < 1027) wc = jisx0212_2uni_page29[i-752]; } else { if (i < 7211) wc = jisx0212_2uni_page30[i-1410]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short jisx0212_2charset[6067] = { 0x2242, 0x2270, 0x2243, 0x226d, 0x226c, 0x226e, 0x2234, 0x2231, 0x226b, 0x2244, 0x2a22, 0x2a21, 0x2a24, 0x2a2a, 0x2a23, 0x2a29, 0x2921, 0x2a2e, 0x2a32, 0x2a31, 0x2a34, 0x2a33, 0x2a40, 0x2a3f, 0x2a42, 0x2a41, 0x2a50, 0x2a52, 0x2a51, 0x2a54, 0x2a58, 0x2a53, 0x292c, 0x2a63, 0x2a62, 0x2a65, 0x2a64, 0x2a72, 0x2930, 0x294e, 0x2b22, 0x2b21, 0x2b24, 0x2b2a, 0x2b23, 0x2b29, 0x2941, 0x2b2e, 0x2b32, 0x2b31, 0x2b34, 0x2b33, 0x2b40, 0x2b3f, 0x2b42, 0x2b41, 0x2943, 0x2b50, 0x2b52, 0x2b51, 0x2b54, 0x2b58, 0x2b53, 0x294c, 0x2b63, 0x2b62, 0x2b65, 0x2b64, 0x2b72, 0x2950, 0x2b73, 0x2a27, 0x2b27, 0x2a25, 0x2b25, 0x2a28, 0x2b28, 0x2a2b, 0x2b2b, 0x2a2c, 0x2b2c, 0x2a2f, 0x2b2f, 0x2a2d, 0x2b2d, 0x2a30, 0x2b30, 0x2922, 0x2942, 0x2a37, 0x2b37, 0x2a36, 0x2b36, 0x2a38, 0x2b38, 0x2a35, 0x2b35, 0x2a3a, 0x2b3a, 0x2a3b, 0x2b3b, 0x2a3d, 0x2b3d, 0x2a3c, 0x2a3e, 0x2b3e, 0x2924, 0x2944, 0x2a47, 0x2b47, 0x2a45, 0x2b45, 0x2a46, 0x2b46, 0x2a44, 0x2945, 0x2926, 0x2946, 0x2a48, 0x2b48, 0x2a49, 0x2b49, 0x2947, 0x2a4a, 0x2b4a, 0x2a4c, 0x2b4c, 0x2a4b, 0x2b4b, 0x2929, 0x2949, 0x2928, 0x2948, 0x2a4d, 0x2b4d, 0x2a4f, 0x2b4f, 0x2a4e, 0x2b4e, 0x294a, 0x292b, 0x294b, 0x2a57, 0x2b57, 0x2a56, 0x2b56, 0x292d, 0x294d, 0x2a59, 0x2b59, 0x2a5b, 0x2b5b, 0x2a5a, 0x2b5a, 0x2a5c, 0x2b5c, 0x2a5d, 0x2b5d, 0x2a5f, 0x2b5f, 0x2a5e, 0x2b5e, 0x2a61, 0x2b61, 0x2a60, 0x2b60, 0x292f, 0x294f, 0x2a6c, 0x2b6c, 0x2a69, 0x2b69, 0x2a66, 0x2b66, 0x2a6b, 0x2b6b, 0x2a68, 0x2b68, 0x2a6a, 0x2b6a, 0x2a71, 0x2b71, 0x2a74, 0x2b74, 0x2a73, 0x2a75, 0x2b75, 0x2a77, 0x2b77, 0x2a76, 0x2b76, 0x2a26, 0x2b26, 0x2a43, 0x2b43, 0x2a55, 0x2b55, 0x2a67, 0x2b67, 0x2a70, 0x2b70, 0x2a6d, 0x2b6d, 0x2a6f, 0x2b6f, 0x2a6e, 0x2b6e, 0x2b39, 0x2230, 0x222f, 0x2232, 0x2236, 0x2235, 0x2233, 0x2238, 0x2239, 0x2661, 0x2662, 0x2663, 0x2664, 0x2667, 0x2669, 0x266c, 0x2676, 0x2665, 0x266a, 0x2671, 0x2672, 0x2673, 0x2674, 0x267b, 0x2678, 0x2675, 0x267a, 0x2677, 0x2679, 0x267c, 0x2742, 0x2743, 0x2744, 0x2745, 0x2746, 0x2747, 0x2748, 0x2749, 0x274a, 0x274b, 0x274c, 0x274d, 0x274e, 0x2772, 0x2773, 0x2774, 0x2775, 0x2776, 0x2777, 0x2778, 0x2779, 0x277a, 0x277b, 0x277c, 0x277d, 0x277e, 0x2271, 0x226f, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, 0x3029, 0x302a, 0x302b, 0x302c, 0x302d, 0x302e, 0x302f, 0x3030, 0x3031, 0x3032, 0x3033, 0x3034, 0x3035, 0x3036, 0x3037, 0x3038, 0x3039, 0x303a, 0x303b, 0x303c, 0x303d, 0x303e, 0x303f, 0x3040, 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, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, 0x305f, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0x312a, 0x312b, 0x312c, 0x312d, 0x312e, 0x312f, 0x3130, 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, 0x3176, 0x315f, 0x3160, 0x3161, 0x3162, 0x3163, 0x3164, 0x3165, 0x3166, 0x3167, 0x3168, 0x3169, 0x316a, 0x316b, 0x316c, 0x316d, 0x316e, 0x316f, 0x3170, 0x3171, 0x3172, 0x3173, 0x3174, 0x3175, 0x3177, 0x3178, 0x3179, 0x317a, 0x317b, 0x317c, 0x317d, 0x317e, 0x3221, 0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0x322a, 0x322b, 0x322c, 0x322d, 0x322e, 0x322f, 0x3230, 0x3231, 0x3232, 0x3233, 0x3234, 0x3235, 0x3236, 0x3237, 0x3238, 0x3239, 0x323a, 0x323b, 0x323c, 0x323d, 0x323e, 0x323f, 0x3240, 0x3241, 0x3242, 0x3243, 0x3244, 0x3245, 0x3251, 0x3246, 0x3247, 0x3248, 0x3249, 0x324a, 0x324b, 0x324c, 0x324d, 0x324e, 0x324f, 0x3250, 0x3252, 0x3253, 0x3254, 0x3255, 0x3256, 0x3257, 0x3258, 0x3259, 0x325a, 0x325b, 0x325c, 0x325d, 0x325e, 0x325f, 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, 0x327c, 0x327d, 0x327e, 0x3321, 0x3322, 0x3323, 0x3324, 0x3325, 0x3326, 0x3327, 0x3328, 0x3329, 0x332a, 0x332b, 0x332c, 0x332d, 0x332e, 0x332f, 0x3330, 0x3331, 0x3332, 0x3333, 0x3334, 0x3335, 0x3336, 0x3337, 0x3338, 0x3339, 0x333a, 0x333b, 0x333c, 0x333d, 0x333e, 0x333f, 0x3340, 0x3341, 0x3342, 0x3343, 0x3344, 0x3345, 0x3346, 0x3347, 0x3348, 0x3349, 0x334a, 0x334b, 0x334c, 0x334d, 0x334e, 0x334f, 0x3350, 0x3351, 0x3352, 0x3353, 0x3354, 0x3355, 0x3356, 0x3357, 0x3358, 0x3359, 0x335a, 0x335b, 0x335c, 0x335d, 0x335e, 0x335f, 0x3360, 0x3361, 0x3362, 0x3363, 0x3364, 0x3365, 0x3366, 0x3367, 0x3368, 0x3369, 0x336a, 0x336b, 0x336c, 0x336d, 0x336e, 0x336f, 0x3370, 0x3371, 0x3372, 0x3373, 0x3374, 0x3375, 0x3376, 0x3377, 0x3378, 0x3379, 0x337a, 0x337b, 0x337c, 0x337d, 0x337e, 0x3421, 0x3422, 0x3423, 0x3424, 0x3425, 0x3426, 0x3427, 0x3428, 0x3429, 0x342a, 0x342b, 0x342c, 0x342d, 0x342e, 0x342f, 0x3430, 0x3431, 0x3432, 0x3433, 0x3434, 0x3435, 0x3436, 0x3438, 0x3437, 0x3439, 0x343a, 0x343b, 0x343c, 0x343d, 0x343e, 0x343f, 0x3440, 0x3441, 0x3442, 0x3443, 0x3444, 0x3445, 0x3446, 0x3447, 0x3448, 0x3449, 0x344a, 0x344b, 0x344c, 0x344d, 0x344e, 0x344f, 0x3450, 0x3451, 0x3452, 0x3453, 0x3454, 0x3455, 0x3456, 0x3457, 0x3458, 0x3459, 0x345a, 0x345b, 0x345c, 0x345d, 0x345e, 0x345f, 0x3460, 0x3461, 0x3462, 0x3463, 0x3464, 0x3465, 0x3466, 0x3467, 0x3468, 0x3469, 0x346a, 0x346b, 0x346c, 0x346d, 0x346e, 0x346f, 0x3470, 0x3471, 0x3472, 0x3473, 0x3474, 0x3475, 0x3476, 0x3477, 0x3478, 0x3479, 0x347a, 0x347b, 0x347c, 0x347d, 0x347e, 0x3521, 0x3522, 0x3523, 0x3524, 0x3525, 0x3526, 0x3527, 0x3528, 0x3529, 0x352a, 0x352b, 0x352c, 0x352d, 0x352e, 0x352f, 0x3530, 0x3531, 0x3532, 0x3533, 0x3534, 0x3535, 0x3536, 0x3537, 0x3538, 0x3539, 0x353a, 0x353b, 0x353c, 0x353d, 0x353e, 0x353f, 0x3540, 0x3541, 0x3542, 0x3543, 0x3544, 0x3545, 0x3546, 0x3547, 0x3548, 0x3549, 0x354a, 0x354b, 0x354c, 0x354d, 0x354e, 0x354f, 0x3550, 0x3551, 0x3552, 0x3553, 0x3554, 0x3555, 0x3556, 0x3557, 0x3558, 0x3559, 0x355a, 0x355b, 0x355c, 0x355d, 0x355e, 0x355f, 0x3560, 0x3561, 0x3562, 0x3563, 0x3564, 0x3565, 0x3566, 0x3567, 0x3568, 0x3569, 0x356a, 0x356b, 0x356c, 0x356d, 0x356e, 0x356f, 0x3570, 0x3571, 0x3572, 0x3573, 0x3574, 0x3575, 0x3576, 0x3577, 0x3578, 0x3579, 0x357a, 0x357b, 0x357c, 0x357d, 0x357e, 0x3621, 0x3622, 0x3623, 0x3624, 0x3625, 0x3626, 0x3627, 0x3628, 0x3629, 0x362a, 0x362b, 0x362c, 0x362d, 0x362e, 0x362f, 0x3630, 0x3631, 0x3632, 0x3633, 0x3634, 0x3635, 0x3636, 0x3637, 0x3638, 0x3639, 0x363a, 0x363b, 0x363c, 0x363d, 0x363e, 0x363f, 0x3640, 0x3641, 0x3642, 0x3643, 0x3644, 0x3645, 0x3646, 0x3647, 0x3648, 0x3649, 0x364a, 0x364b, 0x364c, 0x364d, 0x364e, 0x364f, 0x3650, 0x3651, 0x3652, 0x3653, 0x3654, 0x3655, 0x3656, 0x3657, 0x3658, 0x3659, 0x365a, 0x365b, 0x365c, 0x365d, 0x365e, 0x365f, 0x3660, 0x3661, 0x3662, 0x3663, 0x3664, 0x3665, 0x3666, 0x3667, 0x3668, 0x3669, 0x366a, 0x366b, 0x366c, 0x366d, 0x3670, 0x3671, 0x366e, 0x366f, 0x3672, 0x3673, 0x3674, 0x3675, 0x3676, 0x3677, 0x3678, 0x3679, 0x367a, 0x367b, 0x367d, 0x367e, 0x367c, 0x3721, 0x3722, 0x3723, 0x3724, 0x3725, 0x3726, 0x3727, 0x3728, 0x3729, 0x372a, 0x372b, 0x372c, 0x372d, 0x372e, 0x372f, 0x3730, 0x3731, 0x3732, 0x3733, 0x3734, 0x3735, 0x3736, 0x3737, 0x3738, 0x3739, 0x373a, 0x373b, 0x373c, 0x373d, 0x373e, 0x373f, 0x3740, 0x3741, 0x3742, 0x3743, 0x3744, 0x3745, 0x3746, 0x3747, 0x3748, 0x3749, 0x374a, 0x374b, 0x374c, 0x374d, 0x374e, 0x374f, 0x3750, 0x3751, 0x3752, 0x3753, 0x3754, 0x3755, 0x3756, 0x3757, 0x3760, 0x3758, 0x3759, 0x375a, 0x375b, 0x375c, 0x375d, 0x375e, 0x375f, 0x3761, 0x3762, 0x3763, 0x3764, 0x3765, 0x3766, 0x3767, 0x3768, 0x3769, 0x376a, 0x376b, 0x376c, 0x376d, 0x377e, 0x376e, 0x376f, 0x3770, 0x3771, 0x3772, 0x3773, 0x3774, 0x3775, 0x3776, 0x3777, 0x3778, 0x3779, 0x377a, 0x377b, 0x377c, 0x377d, 0x3821, 0x3822, 0x3823, 0x3824, 0x3825, 0x3826, 0x3827, 0x3828, 0x3829, 0x382a, 0x382b, 0x382c, 0x382d, 0x382e, 0x382f, 0x3830, 0x3831, 0x3832, 0x3833, 0x3834, 0x3835, 0x3836, 0x3837, 0x3838, 0x3839, 0x383a, 0x383b, 0x383c, 0x383d, 0x383e, 0x383f, 0x3840, 0x3841, 0x3842, 0x3843, 0x3844, 0x3845, 0x3846, 0x3847, 0x3848, 0x3849, 0x384a, 0x384b, 0x384c, 0x384d, 0x384e, 0x3850, 0x3851, 0x384f, 0x3852, 0x3853, 0x3854, 0x3855, 0x3856, 0x3857, 0x3858, 0x3859, 0x385a, 0x385b, 0x385c, 0x385d, 0x385e, 0x385f, 0x3860, 0x3861, 0x3862, 0x3863, 0x3864, 0x3865, 0x3867, 0x3868, 0x3869, 0x386a, 0x386b, 0x386c, 0x386d, 0x386e, 0x386f, 0x3870, 0x3871, 0x3872, 0x3873, 0x3874, 0x3875, 0x3876, 0x3877, 0x3878, 0x3879, 0x387a, 0x387b, 0x387c, 0x387d, 0x387e, 0x3921, 0x3922, 0x3923, 0x3924, 0x3925, 0x3926, 0x3927, 0x3928, 0x3929, 0x392a, 0x392b, 0x392c, 0x392d, 0x392e, 0x392f, 0x3930, 0x3931, 0x3932, 0x3933, 0x3934, 0x3935, 0x3936, 0x3937, 0x3938, 0x3939, 0x393a, 0x393b, 0x393c, 0x393d, 0x393e, 0x393f, 0x3940, 0x3941, 0x3942, 0x3943, 0x3944, 0x3945, 0x3946, 0x3947, 0x3948, 0x3949, 0x394a, 0x394b, 0x394c, 0x394d, 0x394e, 0x394f, 0x3950, 0x3951, 0x3952, 0x3953, 0x3954, 0x3955, 0x3956, 0x3957, 0x3958, 0x3959, 0x395a, 0x395b, 0x395c, 0x395d, 0x395e, 0x395f, 0x3960, 0x3961, 0x3962, 0x3963, 0x3964, 0x3965, 0x3966, 0x3967, 0x3968, 0x3969, 0x396a, 0x396b, 0x396c, 0x396d, 0x396e, 0x396f, 0x3970, 0x3971, 0x3972, 0x3973, 0x3974, 0x3975, 0x3976, 0x3977, 0x3978, 0x3979, 0x397a, 0x397b, 0x397c, 0x397d, 0x397e, 0x3a21, 0x3a22, 0x3a23, 0x3a24, 0x3a25, 0x3a26, 0x3a27, 0x3a28, 0x3a29, 0x3a2a, 0x3a2b, 0x3a2c, 0x3a2d, 0x3a2e, 0x3a2f, 0x3a30, 0x3a31, 0x3a33, 0x3a34, 0x3a35, 0x3a36, 0x3a37, 0x3a38, 0x3a32, 0x3a39, 0x3a3a, 0x3a3b, 0x3a3c, 0x3a3d, 0x3a3e, 0x3a3f, 0x3a40, 0x3a41, 0x3a42, 0x3a43, 0x3a44, 0x3a45, 0x3a46, 0x3a47, 0x3a48, 0x3a49, 0x3a4a, 0x3a4b, 0x3a4c, 0x3a4d, 0x3a4e, 0x3a4f, 0x3a50, 0x3a51, 0x3a52, 0x3a53, 0x3a54, 0x3a55, 0x3a56, 0x3a57, 0x3a58, 0x3a59, 0x3a5a, 0x3a5b, 0x3a5c, 0x3a5d, 0x3a5e, 0x3a5f, 0x3a60, 0x3a61, 0x3a62, 0x3a63, 0x3a64, 0x3a65, 0x3a66, 0x3a67, 0x3a68, 0x3a69, 0x3a6a, 0x3a6b, 0x3a6c, 0x3a6d, 0x3a6e, 0x3a6f, 0x3a70, 0x3a71, 0x3a72, 0x3a73, 0x3a74, 0x3a75, 0x3a76, 0x3a77, 0x3a78, 0x3a79, 0x3a7a, 0x3a7b, 0x3a7c, 0x3a7d, 0x3a7e, 0x3b21, 0x3b22, 0x3b23, 0x3b24, 0x3b25, 0x3b26, 0x3b27, 0x3b28, 0x3b29, 0x3b2a, 0x3b2b, 0x3b2c, 0x3b2d, 0x3b2e, 0x3b2f, 0x3b30, 0x3b31, 0x3b32, 0x3b33, 0x3b34, 0x3b35, 0x3b36, 0x3b37, 0x3b38, 0x3b39, 0x3b3a, 0x3b3b, 0x3b3d, 0x3b3c, 0x3b3e, 0x3b3f, 0x3b40, 0x3b41, 0x3b42, 0x3b43, 0x3b44, 0x3b45, 0x3b47, 0x3b48, 0x3b49, 0x3b4a, 0x3b46, 0x3b4b, 0x3b4c, 0x3b4d, 0x3b4e, 0x3b4f, 0x3b50, 0x3b51, 0x3b52, 0x3b53, 0x3b57, 0x3b55, 0x3b54, 0x3b56, 0x3b58, 0x3b59, 0x3b5a, 0x3b5b, 0x3b5c, 0x3b5d, 0x3b5e, 0x3b5f, 0x3b60, 0x3b61, 0x3b62, 0x3b63, 0x3b64, 0x3b65, 0x3b66, 0x3b67, 0x3b68, 0x3b69, 0x3b6a, 0x3b6b, 0x3b6c, 0x3b6d, 0x3b6e, 0x3b6f, 0x3b70, 0x3b71, 0x3b72, 0x6674, 0x3b73, 0x3b74, 0x3b75, 0x3b76, 0x3b77, 0x3b78, 0x3b7a, 0x3b79, 0x3b7b, 0x3b7c, 0x3b7d, 0x3b7e, 0x3c21, 0x3c22, 0x3c23, 0x3c24, 0x3c25, 0x3c26, 0x3c27, 0x3c28, 0x3c29, 0x3c2a, 0x3c2b, 0x3c2c, 0x3c2e, 0x3c2d, 0x3c2f, 0x3c30, 0x3c31, 0x3c34, 0x3c32, 0x3c33, 0x3c35, 0x3c36, 0x3c37, 0x3c38, 0x3c39, 0x3c3a, 0x3c3b, 0x3c3c, 0x3c3d, 0x3c3e, 0x3c3f, 0x3c40, 0x3c41, 0x3c42, 0x3c43, 0x3c44, 0x3c45, 0x3c46, 0x3c47, 0x3c48, 0x3c49, 0x3c4a, 0x3c4b, 0x3c4c, 0x3c4d, 0x3c4e, 0x3c4f, 0x3c50, 0x3c52, 0x3c51, 0x3c53, 0x3c54, 0x3c55, 0x3c56, 0x3c57, 0x3c58, 0x3c59, 0x3c5a, 0x3c5b, 0x3c5c, 0x3c5d, 0x3c5e, 0x3c5f, 0x3c60, 0x3c61, 0x3c62, 0x3c63, 0x3c64, 0x3c65, 0x3c66, 0x3c67, 0x3c68, 0x3c69, 0x3c6a, 0x3c6b, 0x3c6c, 0x3c6d, 0x3c6e, 0x3c6f, 0x3c70, 0x3c71, 0x3c72, 0x3c73, 0x3c74, 0x3c75, 0x3c76, 0x3c77, 0x3c78, 0x3c79, 0x3c7a, 0x3c7b, 0x3c7c, 0x3c7d, 0x3c7e, 0x3d21, 0x3d22, 0x3d23, 0x3d24, 0x3d25, 0x3d26, 0x3d27, 0x3d28, 0x3d29, 0x3d2a, 0x3d2b, 0x3d2c, 0x3d2d, 0x3d2e, 0x3d2f, 0x3d32, 0x3d30, 0x3d31, 0x3d33, 0x3d34, 0x3d35, 0x3d36, 0x3d37, 0x3d38, 0x3d39, 0x3d3a, 0x3d3b, 0x3d3c, 0x3d3d, 0x3d3e, 0x3d3f, 0x3d40, 0x3d41, 0x3d42, 0x3d43, 0x3d44, 0x3d45, 0x3d46, 0x3d47, 0x3d48, 0x3d49, 0x3d4a, 0x3d4b, 0x3d4c, 0x3d4d, 0x3d4e, 0x3d4f, 0x3d50, 0x3d51, 0x3d52, 0x3d53, 0x3d54, 0x3d55, 0x3d56, 0x3d57, 0x3d58, 0x3d59, 0x3d5a, 0x3d5b, 0x3d5c, 0x3d5d, 0x3d5e, 0x3d5f, 0x3d60, 0x3d61, 0x3d62, 0x3d63, 0x3d64, 0x3d65, 0x3d66, 0x3d67, 0x3d68, 0x3d69, 0x3d6a, 0x3d6b, 0x3d6c, 0x3d6d, 0x3d6e, 0x3d6f, 0x3d70, 0x3d71, 0x3d72, 0x3d73, 0x3d74, 0x3d75, 0x3d76, 0x3d77, 0x3d78, 0x3d79, 0x3d7a, 0x3d7b, 0x3d7c, 0x3d7d, 0x3d7e, 0x3e21, 0x3e22, 0x3e23, 0x3e24, 0x3e25, 0x3e26, 0x3e27, 0x3e28, 0x3e29, 0x3e2a, 0x3e2b, 0x3e2c, 0x3e2d, 0x3e2e, 0x3e2f, 0x3e30, 0x3e31, 0x3e32, 0x3e33, 0x3e34, 0x3e35, 0x3e36, 0x3e37, 0x3e38, 0x3e39, 0x3e3a, 0x3e3b, 0x3e3c, 0x3e3d, 0x3e3e, 0x3e3f, 0x3e40, 0x3e41, 0x3e42, 0x3e43, 0x3e44, 0x3e45, 0x3e46, 0x3e47, 0x3e48, 0x3e49, 0x3e4a, 0x3e4b, 0x3e4c, 0x3e4d, 0x3e4e, 0x3e4f, 0x3e50, 0x3e51, 0x3e52, 0x3e53, 0x3e54, 0x3e55, 0x3e56, 0x3e57, 0x3e58, 0x3e59, 0x3e5a, 0x3e5b, 0x3e5c, 0x3e5d, 0x3e5e, 0x3e5f, 0x3e60, 0x3e61, 0x3e62, 0x3e63, 0x3e64, 0x3e65, 0x3e66, 0x3e67, 0x3e68, 0x3e69, 0x3e6a, 0x3e6b, 0x3e6c, 0x3e6d, 0x3e6e, 0x3e6f, 0x3e70, 0x3e71, 0x3e72, 0x3e73, 0x3e74, 0x3e75, 0x3e76, 0x3e77, 0x3e78, 0x3e79, 0x3e7a, 0x3e7b, 0x3e7e, 0x3e7c, 0x3e7d, 0x3f21, 0x3f22, 0x3f23, 0x3f24, 0x3f25, 0x3f26, 0x3f27, 0x3f28, 0x3f29, 0x3f2a, 0x3f2b, 0x3f2c, 0x3f2d, 0x3f2e, 0x3f2f, 0x3f30, 0x3f31, 0x3f32, 0x3f33, 0x3f34, 0x3f35, 0x3f36, 0x3f37, 0x3f38, 0x3f39, 0x3f3a, 0x3f3b, 0x3f3c, 0x3f3d, 0x3f3e, 0x3f3f, 0x3f40, 0x3f41, 0x3f42, 0x3f43, 0x3f44, 0x3f45, 0x3f46, 0x3f47, 0x3f48, 0x3f49, 0x3f4a, 0x3f4b, 0x3f4c, 0x3f4d, 0x3f4e, 0x3f4f, 0x3f50, 0x3f51, 0x3f52, 0x3f53, 0x3f54, 0x3f55, 0x3f56, 0x3f57, 0x3f58, 0x3f59, 0x3f5a, 0x3f5b, 0x3f5c, 0x3f5d, 0x3f5e, 0x3f5f, 0x3f60, 0x3f61, 0x3f62, 0x3f63, 0x3f64, 0x3f65, 0x3f66, 0x3f67, 0x3f68, 0x3f69, 0x3f6a, 0x3f6b, 0x3f6c, 0x3f6d, 0x3f6e, 0x3f6f, 0x3f70, 0x3f71, 0x3f72, 0x3f73, 0x3f74, 0x3f75, 0x3f76, 0x3f77, 0x3f78, 0x3f79, 0x3f7a, 0x3f7b, 0x3f7c, 0x3f7d, 0x3f7e, 0x4021, 0x4022, 0x4023, 0x4024, 0x4025, 0x4026, 0x4027, 0x4028, 0x4029, 0x402a, 0x402b, 0x402c, 0x402d, 0x402e, 0x402f, 0x4030, 0x4031, 0x4032, 0x4033, 0x4034, 0x4035, 0x4036, 0x4037, 0x4038, 0x4039, 0x403a, 0x403b, 0x403c, 0x403d, 0x403e, 0x403f, 0x4040, 0x4041, 0x4042, 0x4043, 0x4044, 0x4045, 0x4046, 0x4047, 0x4048, 0x4049, 0x404a, 0x404b, 0x404c, 0x404d, 0x404e, 0x404f, 0x4050, 0x4051, 0x4052, 0x4053, 0x4054, 0x4055, 0x4056, 0x4057, 0x4058, 0x4059, 0x405a, 0x405b, 0x405c, 0x405d, 0x405e, 0x405f, 0x4060, 0x4061, 0x4062, 0x4063, 0x4064, 0x4065, 0x4066, 0x4067, 0x4068, 0x4069, 0x406a, 0x406b, 0x406c, 0x406d, 0x406e, 0x406f, 0x4070, 0x4071, 0x4072, 0x4073, 0x4074, 0x4075, 0x4076, 0x4077, 0x4078, 0x4079, 0x407a, 0x407b, 0x407c, 0x407d, 0x407e, 0x4121, 0x4122, 0x4123, 0x4124, 0x4125, 0x4126, 0x4127, 0x4128, 0x4129, 0x412a, 0x412b, 0x412c, 0x412d, 0x412e, 0x412f, 0x4130, 0x4131, 0x4132, 0x4133, 0x4134, 0x4135, 0x4136, 0x4137, 0x4138, 0x4139, 0x413a, 0x413b, 0x413c, 0x413d, 0x413e, 0x413f, 0x4140, 0x4141, 0x4142, 0x4143, 0x4144, 0x4145, 0x4146, 0x4147, 0x4148, 0x4149, 0x414a, 0x414b, 0x414c, 0x414d, 0x414e, 0x414f, 0x4150, 0x4151, 0x4152, 0x4153, 0x4154, 0x4155, 0x4156, 0x4157, 0x4158, 0x4159, 0x415a, 0x415b, 0x415c, 0x415d, 0x415e, 0x415f, 0x4160, 0x4161, 0x4162, 0x4163, 0x4164, 0x4165, 0x4166, 0x4167, 0x4168, 0x4169, 0x416a, 0x416b, 0x416c, 0x416d, 0x416e, 0x416f, 0x4170, 0x4171, 0x4172, 0x4173, 0x4174, 0x4175, 0x4176, 0x4177, 0x4178, 0x4179, 0x417a, 0x417b, 0x417c, 0x417d, 0x417e, 0x4221, 0x4222, 0x4223, 0x4224, 0x4225, 0x4226, 0x4227, 0x4228, 0x4229, 0x422a, 0x422b, 0x422c, 0x422d, 0x422e, 0x4230, 0x422f, 0x4231, 0x4232, 0x4233, 0x4234, 0x4235, 0x4237, 0x4236, 0x4238, 0x4239, 0x423a, 0x423b, 0x423c, 0x423d, 0x423e, 0x4240, 0x4241, 0x4242, 0x4244, 0x4245, 0x4247, 0x4248, 0x4249, 0x424a, 0x424c, 0x4243, 0x4246, 0x424b, 0x424d, 0x424e, 0x424f, 0x4250, 0x4251, 0x4252, 0x4253, 0x4254, 0x4255, 0x4256, 0x4257, 0x4258, 0x4259, 0x425a, 0x425b, 0x425c, 0x425d, 0x425e, 0x425f, 0x4260, 0x4261, 0x4262, 0x4263, 0x4264, 0x4265, 0x4266, 0x4267, 0x4268, 0x4269, 0x426a, 0x426b, 0x426c, 0x426d, 0x423f, 0x426e, 0x426f, 0x4270, 0x4271, 0x4272, 0x4273, 0x4274, 0x4275, 0x4276, 0x4277, 0x4278, 0x4279, 0x427a, 0x427b, 0x427c, 0x427d, 0x427e, 0x4321, 0x4322, 0x4323, 0x4324, 0x4325, 0x4326, 0x4327, 0x4328, 0x4329, 0x432a, 0x432b, 0x432c, 0x432d, 0x432e, 0x432f, 0x4330, 0x4331, 0x4332, 0x4333, 0x4334, 0x4335, 0x4336, 0x4337, 0x4339, 0x433a, 0x433b, 0x433c, 0x433d, 0x433e, 0x433f, 0x4340, 0x4341, 0x4342, 0x4343, 0x4344, 0x4345, 0x4346, 0x4347, 0x4348, 0x4338, 0x434a, 0x434b, 0x434c, 0x434d, 0x434f, 0x434e, 0x4350, 0x4351, 0x4352, 0x4353, 0x4354, 0x4355, 0x4356, 0x4357, 0x4358, 0x4359, 0x435a, 0x435b, 0x4349, 0x435c, 0x435d, 0x435e, 0x435f, 0x4360, 0x4361, 0x4362, 0x4363, 0x4364, 0x4365, 0x4366, 0x4367, 0x4368, 0x4369, 0x436a, 0x436b, 0x436c, 0x436d, 0x436e, 0x436f, 0x4370, 0x4371, 0x4372, 0x4373, 0x4374, 0x4375, 0x4376, 0x4377, 0x4378, 0x4379, 0x437a, 0x437b, 0x437c, 0x437d, 0x437e, 0x4421, 0x4422, 0x4423, 0x4424, 0x4425, 0x4426, 0x4427, 0x4428, 0x4429, 0x442a, 0x442b, 0x442c, 0x442d, 0x442e, 0x442f, 0x4430, 0x4431, 0x4432, 0x4433, 0x4434, 0x4435, 0x4436, 0x4437, 0x4438, 0x4439, 0x443a, 0x443b, 0x443c, 0x443d, 0x443e, 0x443f, 0x4440, 0x4441, 0x4442, 0x4443, 0x4444, 0x4445, 0x4446, 0x4447, 0x4448, 0x4449, 0x444a, 0x444b, 0x444c, 0x444d, 0x444e, 0x444f, 0x4450, 0x4451, 0x4452, 0x4453, 0x4454, 0x4455, 0x4456, 0x4457, 0x4458, 0x4459, 0x445a, 0x445b, 0x445c, 0x445d, 0x445e, 0x445f, 0x4460, 0x4461, 0x4462, 0x4463, 0x4464, 0x4465, 0x4466, 0x4467, 0x4468, 0x4469, 0x446a, 0x446b, 0x446c, 0x446d, 0x446e, 0x446f, 0x4470, 0x4471, 0x4472, 0x4473, 0x4474, 0x4475, 0x4476, 0x4477, 0x4478, 0x4479, 0x447a, 0x447b, 0x447c, 0x447d, 0x447e, 0x4521, 0x4522, 0x4523, 0x4524, 0x4525, 0x4526, 0x4527, 0x4528, 0x4529, 0x452a, 0x452b, 0x452c, 0x452d, 0x452e, 0x452f, 0x4530, 0x4531, 0x4532, 0x4533, 0x4534, 0x4535, 0x4536, 0x4537, 0x4538, 0x4539, 0x453a, 0x453b, 0x453c, 0x453d, 0x453e, 0x453f, 0x4540, 0x4541, 0x4542, 0x4543, 0x4544, 0x4545, 0x4546, 0x4547, 0x4548, 0x4549, 0x454a, 0x454b, 0x454d, 0x454c, 0x454e, 0x454f, 0x4550, 0x4551, 0x4552, 0x4553, 0x4554, 0x4555, 0x4556, 0x4557, 0x4558, 0x4559, 0x455a, 0x455b, 0x455c, 0x455d, 0x455e, 0x455f, 0x4560, 0x4561, 0x4562, 0x4563, 0x4564, 0x4565, 0x4566, 0x4567, 0x4568, 0x4569, 0x456a, 0x456b, 0x456c, 0x456d, 0x456e, 0x456f, 0x4570, 0x4571, 0x4572, 0x4573, 0x4574, 0x4575, 0x4576, 0x4577, 0x4578, 0x4579, 0x457a, 0x457b, 0x457c, 0x457d, 0x457e, 0x4621, 0x4622, 0x4623, 0x4624, 0x4625, 0x4626, 0x4627, 0x4628, 0x4629, 0x462a, 0x462b, 0x462c, 0x462d, 0x462e, 0x462f, 0x4630, 0x4631, 0x4632, 0x4633, 0x4634, 0x4635, 0x4636, 0x4637, 0x4638, 0x4639, 0x463a, 0x463b, 0x463c, 0x463d, 0x463e, 0x463f, 0x4640, 0x4641, 0x4642, 0x4643, 0x4644, 0x4645, 0x4646, 0x4647, 0x4648, 0x4649, 0x464a, 0x464b, 0x464c, 0x464d, 0x464e, 0x464f, 0x4650, 0x4651, 0x4652, 0x4653, 0x4654, 0x4655, 0x4656, 0x4657, 0x4658, 0x4659, 0x465a, 0x465b, 0x465c, 0x465d, 0x465e, 0x465f, 0x4660, 0x4736, 0x4661, 0x4662, 0x4663, 0x4664, 0x4665, 0x4666, 0x4667, 0x4668, 0x4669, 0x466a, 0x466b, 0x466c, 0x466d, 0x466e, 0x466f, 0x4670, 0x4671, 0x4672, 0x4673, 0x4674, 0x4675, 0x4676, 0x4677, 0x4678, 0x4679, 0x467a, 0x467b, 0x467c, 0x467d, 0x467e, 0x4721, 0x4722, 0x4723, 0x4724, 0x4725, 0x4726, 0x4727, 0x4728, 0x4729, 0x472a, 0x472b, 0x472c, 0x472d, 0x472e, 0x472f, 0x4730, 0x4731, 0x4732, 0x4733, 0x4734, 0x4735, 0x4737, 0x4738, 0x4739, 0x473a, 0x473b, 0x473c, 0x473d, 0x473e, 0x473f, 0x4740, 0x4741, 0x4742, 0x4743, 0x4744, 0x4745, 0x4746, 0x4747, 0x4748, 0x4749, 0x474a, 0x474b, 0x474c, 0x474d, 0x474e, 0x474f, 0x4750, 0x4751, 0x4752, 0x4753, 0x4754, 0x4755, 0x4756, 0x4757, 0x4758, 0x4759, 0x475a, 0x475b, 0x475c, 0x475d, 0x475e, 0x475f, 0x4760, 0x4761, 0x4762, 0x4763, 0x4764, 0x4765, 0x4766, 0x4767, 0x4768, 0x4769, 0x476a, 0x476b, 0x476c, 0x476d, 0x476e, 0x476f, 0x4770, 0x4771, 0x4772, 0x4773, 0x4774, 0x4775, 0x4776, 0x4777, 0x4778, 0x4779, 0x477a, 0x477b, 0x477c, 0x477d, 0x477e, 0x4821, 0x4822, 0x4823, 0x4824, 0x4825, 0x4826, 0x4827, 0x4828, 0x4829, 0x482a, 0x482b, 0x482c, 0x482d, 0x482e, 0x482f, 0x4830, 0x4831, 0x4832, 0x4833, 0x4834, 0x4835, 0x4836, 0x4837, 0x4838, 0x4839, 0x483a, 0x483b, 0x483c, 0x483d, 0x483e, 0x483f, 0x4840, 0x4841, 0x4842, 0x4843, 0x4844, 0x4845, 0x4846, 0x4847, 0x4848, 0x4849, 0x484a, 0x484b, 0x484c, 0x4853, 0x484d, 0x484e, 0x484f, 0x4850, 0x4851, 0x4852, 0x4854, 0x4855, 0x4856, 0x4857, 0x4858, 0x4859, 0x485a, 0x485b, 0x485c, 0x485d, 0x485e, 0x485f, 0x4860, 0x4861, 0x4862, 0x4863, 0x4864, 0x4865, 0x4866, 0x4867, 0x4868, 0x4869, 0x486a, 0x486b, 0x486c, 0x486d, 0x486e, 0x486f, 0x4870, 0x4871, 0x4872, 0x4873, 0x4874, 0x4875, 0x4876, 0x4877, 0x4878, 0x4879, 0x487a, 0x487b, 0x487c, 0x487d, 0x487e, 0x4921, 0x4922, 0x4923, 0x4924, 0x4925, 0x4926, 0x4927, 0x4928, 0x4929, 0x492a, 0x492b, 0x492c, 0x492d, 0x492e, 0x492f, 0x4930, 0x4931, 0x4932, 0x4933, 0x4934, 0x4935, 0x4936, 0x4937, 0x4938, 0x4939, 0x493a, 0x493b, 0x493c, 0x4941, 0x493d, 0x493e, 0x493f, 0x4940, 0x4942, 0x4943, 0x4944, 0x4945, 0x4946, 0x4947, 0x4948, 0x4949, 0x494a, 0x494b, 0x494c, 0x494d, 0x494e, 0x494f, 0x4950, 0x4951, 0x4952, 0x4953, 0x4954, 0x4955, 0x4956, 0x4957, 0x4958, 0x4959, 0x495a, 0x495b, 0x495c, 0x495d, 0x495e, 0x495f, 0x4960, 0x4961, 0x4962, 0x4963, 0x4964, 0x4965, 0x4966, 0x4967, 0x4968, 0x4969, 0x496a, 0x496b, 0x496c, 0x496d, 0x496e, 0x496f, 0x4970, 0x4971, 0x4972, 0x4973, 0x4974, 0x4975, 0x4976, 0x4977, 0x4978, 0x4979, 0x497a, 0x497b, 0x497c, 0x497d, 0x497e, 0x4a21, 0x4a22, 0x4a23, 0x4a24, 0x4a25, 0x4a26, 0x4a27, 0x4a28, 0x4a29, 0x4a2a, 0x4a2b, 0x4a2c, 0x4a2d, 0x4a2e, 0x4a2f, 0x4a30, 0x4a31, 0x4a32, 0x4a33, 0x4a34, 0x4a35, 0x4a36, 0x4a37, 0x4a38, 0x4a39, 0x4a3a, 0x4a3b, 0x4a3c, 0x4a3d, 0x4a3e, 0x4a3f, 0x4a40, 0x4a41, 0x4a42, 0x4a43, 0x4a44, 0x4a45, 0x4a46, 0x4a47, 0x4a48, 0x4a49, 0x4a4a, 0x4a4b, 0x4a4c, 0x4a4d, 0x4a4e, 0x4a4f, 0x4a50, 0x4a51, 0x4a52, 0x4a53, 0x4a54, 0x4a55, 0x4a56, 0x4a57, 0x4a58, 0x4a59, 0x4a5a, 0x4a5b, 0x4a5c, 0x4a5d, 0x4a5e, 0x4a5f, 0x4a60, 0x4a61, 0x4a62, 0x4a63, 0x4a64, 0x4a65, 0x4a66, 0x4a67, 0x4a68, 0x4a69, 0x4a6a, 0x4a6b, 0x4a6c, 0x4a6d, 0x4a6e, 0x4a6f, 0x4a70, 0x4a71, 0x4a72, 0x4a73, 0x4a74, 0x4a75, 0x4a76, 0x4a77, 0x4a78, 0x4a79, 0x4a7a, 0x4a7b, 0x4a7c, 0x4a7d, 0x4a7e, 0x4b21, 0x4b22, 0x4b23, 0x4b24, 0x4b25, 0x4b26, 0x4b27, 0x4b28, 0x4b29, 0x4b2a, 0x4b2b, 0x4b2c, 0x4b2d, 0x4b2e, 0x4b2f, 0x4b30, 0x4b31, 0x4b32, 0x4b33, 0x4b34, 0x4b35, 0x4b36, 0x4b37, 0x4b38, 0x4b39, 0x4b3a, 0x4b3b, 0x4b3c, 0x4b3d, 0x4b3e, 0x4b3f, 0x4b40, 0x4b41, 0x4b42, 0x4b43, 0x4b44, 0x4b45, 0x4b46, 0x4b47, 0x4b48, 0x4b49, 0x4b4a, 0x4b4b, 0x4b4c, 0x4b4d, 0x4b4e, 0x4b4f, 0x4b50, 0x4b51, 0x4b52, 0x4b53, 0x4b54, 0x4b55, 0x4b56, 0x4b57, 0x4b58, 0x4b59, 0x4b5a, 0x4b5b, 0x4b5c, 0x4b5d, 0x4b5e, 0x4b5f, 0x4b60, 0x4b61, 0x4b62, 0x4b63, 0x4b64, 0x4b65, 0x4b66, 0x4b67, 0x4b68, 0x4b69, 0x4b6a, 0x4b6b, 0x4b6c, 0x4b6d, 0x4b6e, 0x4b6f, 0x4b70, 0x4b71, 0x4b72, 0x4b73, 0x4b74, 0x4b75, 0x4b76, 0x4b77, 0x4b78, 0x4b79, 0x4b7a, 0x4b7b, 0x4b7c, 0x4b7d, 0x4b7e, 0x4c21, 0x4c22, 0x4c23, 0x4c24, 0x4c25, 0x4c26, 0x4c27, 0x4c28, 0x4c29, 0x4c2a, 0x4c2b, 0x4c2c, 0x4c2d, 0x4c2e, 0x4c2f, 0x4c30, 0x4c31, 0x4c32, 0x4c33, 0x4c34, 0x4c35, 0x4c36, 0x4c37, 0x4c38, 0x4c39, 0x4c3a, 0x4c3b, 0x4c3c, 0x4c3d, 0x4c3e, 0x4c3f, 0x4c40, 0x4c41, 0x4c42, 0x4c43, 0x4c44, 0x4c45, 0x4c46, 0x4c47, 0x4c48, 0x4c49, 0x4c4a, 0x4c4b, 0x4c4c, 0x4c4d, 0x4c4e, 0x4c4f, 0x4c50, 0x4c51, 0x4c52, 0x4c53, 0x4c54, 0x4c55, 0x4c56, 0x4c57, 0x4c58, 0x4c59, 0x4c5a, 0x4c5b, 0x4c5c, 0x4c5d, 0x4c5e, 0x4c5f, 0x4c60, 0x4c61, 0x4c62, 0x4c63, 0x4c64, 0x4c65, 0x4c66, 0x4c67, 0x4c68, 0x4c69, 0x4c6a, 0x4c6b, 0x4c6c, 0x4c6d, 0x4c6e, 0x4c6f, 0x4c70, 0x4c71, 0x4c72, 0x4c73, 0x4c74, 0x4c75, 0x4c76, 0x4c77, 0x4c78, 0x4c79, 0x4c7a, 0x4c7b, 0x4c7c, 0x4c7d, 0x4c7e, 0x4d21, 0x4d22, 0x4d23, 0x4d24, 0x4d25, 0x4d26, 0x4d27, 0x4d28, 0x4d29, 0x4d2a, 0x4d2b, 0x4d2c, 0x4d2d, 0x4d2e, 0x4d2f, 0x4d30, 0x4d31, 0x4d32, 0x4d33, 0x4d34, 0x4d35, 0x4d36, 0x4d37, 0x4d38, 0x4d39, 0x4d3a, 0x4d3b, 0x4d3c, 0x4d3d, 0x4d3e, 0x4d3f, 0x4d40, 0x4d41, 0x4d42, 0x4d43, 0x4d44, 0x4d45, 0x4d46, 0x4d47, 0x4d48, 0x4d49, 0x4d4a, 0x4d4b, 0x4d4c, 0x4d4d, 0x4d4e, 0x4d4f, 0x4d50, 0x4d51, 0x4d52, 0x4d53, 0x4d54, 0x4d55, 0x4d56, 0x4d57, 0x4d58, 0x4d59, 0x4d5a, 0x4d5b, 0x4d5c, 0x4d5d, 0x4d5e, 0x4d5f, 0x4d60, 0x4d61, 0x4d62, 0x4d63, 0x4d64, 0x4d65, 0x4d66, 0x4d67, 0x4d68, 0x4d69, 0x4d6a, 0x4d6b, 0x4d6c, 0x4d6d, 0x4d6e, 0x4d6f, 0x4d70, 0x4d71, 0x4d72, 0x4d73, 0x4d74, 0x4d75, 0x4d76, 0x4d77, 0x4d78, 0x4d79, 0x4d7a, 0x4d7b, 0x4d7c, 0x4d7d, 0x4d7e, 0x4e21, 0x4e22, 0x4e24, 0x4e25, 0x4e26, 0x4e27, 0x4e28, 0x4e29, 0x4e23, 0x4e2a, 0x4e2b, 0x4e2c, 0x4e2d, 0x4e2e, 0x4e2f, 0x4e30, 0x4e31, 0x4e32, 0x4e33, 0x4e34, 0x4e35, 0x4e36, 0x4e37, 0x4e38, 0x4e39, 0x4e3a, 0x4e3b, 0x4e3c, 0x4e3d, 0x4e3e, 0x4e3f, 0x4e40, 0x4e41, 0x4e42, 0x4e43, 0x4e44, 0x4e45, 0x4e46, 0x4e47, 0x4e48, 0x4e49, 0x4e4a, 0x4e4b, 0x4e4c, 0x4e4d, 0x4e4e, 0x4e4f, 0x4e50, 0x4e51, 0x4e52, 0x4e53, 0x4e54, 0x4e55, 0x4e56, 0x4e57, 0x4e58, 0x4e59, 0x4e5a, 0x4e5b, 0x4e5c, 0x4e5d, 0x4e5e, 0x4e5f, 0x4e60, 0x4e61, 0x4e62, 0x4e63, 0x4e64, 0x4e65, 0x4e66, 0x4e67, 0x4e68, 0x4e69, 0x4e6a, 0x4e6b, 0x4e6c, 0x4e6d, 0x4e6e, 0x4e6f, 0x4e70, 0x4e71, 0x4e72, 0x4e73, 0x4e74, 0x4e75, 0x4e76, 0x4e77, 0x4e78, 0x4e79, 0x4e7a, 0x4e7b, 0x4e7c, 0x4e7d, 0x4e7e, 0x4f21, 0x4f22, 0x4f23, 0x4f24, 0x4f25, 0x4f26, 0x4f27, 0x4f28, 0x4f29, 0x4f2a, 0x4f2b, 0x4f2c, 0x4f2d, 0x4f2e, 0x4f2f, 0x4f30, 0x4f31, 0x4f32, 0x4f33, 0x4f34, 0x4f35, 0x4f36, 0x4f37, 0x4f38, 0x4f39, 0x4f3a, 0x4f3b, 0x4f3c, 0x4f3d, 0x4f3e, 0x4f3f, 0x4f40, 0x4f41, 0x4f42, 0x4f43, 0x4f44, 0x4f45, 0x4f46, 0x4f47, 0x4f48, 0x4f49, 0x4f4a, 0x4f4b, 0x4f4c, 0x4f4d, 0x4f4e, 0x4f4f, 0x4f50, 0x4f51, 0x4f52, 0x4f53, 0x4f54, 0x4f55, 0x4f56, 0x4f57, 0x4f58, 0x4f59, 0x4f5a, 0x4f5b, 0x4f5c, 0x4f5d, 0x4f5e, 0x4f5f, 0x4f60, 0x4f61, 0x4f62, 0x4f63, 0x4f64, 0x4f65, 0x4f66, 0x4f67, 0x4f68, 0x4f69, 0x4f6a, 0x4f6b, 0x4f6c, 0x4f6d, 0x4f6e, 0x4f6f, 0x4f70, 0x4f71, 0x4f72, 0x4f74, 0x4f75, 0x4f76, 0x4f73, 0x4f77, 0x4f78, 0x4f79, 0x4f7a, 0x4f7b, 0x4f7c, 0x4f7d, 0x4f7e, 0x5021, 0x5022, 0x5023, 0x5024, 0x5025, 0x5026, 0x5027, 0x5028, 0x5029, 0x502a, 0x502b, 0x502c, 0x502e, 0x502f, 0x5030, 0x5031, 0x502d, 0x5032, 0x5033, 0x5034, 0x5035, 0x5037, 0x5038, 0x5039, 0x503a, 0x503b, 0x5036, 0x503c, 0x503d, 0x503e, 0x503f, 0x5040, 0x5041, 0x5042, 0x5043, 0x5044, 0x5045, 0x5046, 0x5047, 0x5048, 0x5049, 0x504a, 0x504b, 0x504c, 0x504d, 0x504e, 0x504f, 0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5055, 0x5056, 0x5057, 0x5058, 0x5059, 0x505a, 0x505b, 0x505c, 0x505d, 0x505e, 0x505f, 0x5060, 0x5061, 0x5062, 0x5063, 0x5064, 0x5065, 0x5066, 0x5067, 0x5068, 0x5069, 0x506a, 0x506b, 0x506c, 0x506d, 0x506e, 0x506f, 0x5070, 0x5071, 0x5072, 0x5073, 0x5074, 0x5075, 0x5076, 0x5077, 0x5078, 0x5079, 0x507a, 0x507b, 0x507c, 0x507d, 0x507e, 0x5121, 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, 0x513f, 0x5140, 0x5141, 0x5142, 0x5143, 0x5144, 0x5145, 0x5146, 0x5147, 0x5148, 0x5149, 0x514a, 0x514b, 0x514c, 0x514d, 0x514e, 0x514f, 0x5150, 0x5151, 0x5152, 0x5153, 0x5154, 0x5155, 0x5156, 0x5157, 0x5158, 0x5159, 0x515a, 0x515b, 0x515c, 0x515d, 0x515e, 0x515f, 0x5160, 0x5161, 0x5162, 0x5163, 0x5164, 0x5165, 0x5166, 0x5167, 0x5168, 0x5169, 0x516a, 0x516b, 0x516c, 0x516d, 0x516e, 0x516f, 0x5170, 0x5171, 0x5172, 0x5173, 0x5174, 0x5175, 0x5176, 0x5177, 0x5178, 0x5179, 0x517a, 0x517b, 0x517c, 0x517d, 0x517e, 0x5221, 0x5222, 0x5223, 0x5224, 0x5225, 0x5226, 0x5227, 0x5228, 0x5229, 0x522a, 0x522b, 0x522c, 0x522d, 0x522e, 0x522f, 0x5230, 0x5231, 0x5232, 0x5233, 0x5234, 0x5235, 0x5236, 0x5237, 0x5238, 0x5239, 0x523a, 0x523b, 0x523c, 0x523d, 0x523e, 0x523f, 0x5240, 0x5241, 0x5242, 0x5243, 0x5244, 0x5245, 0x5246, 0x5247, 0x5248, 0x5249, 0x524a, 0x524b, 0x524c, 0x524d, 0x524e, 0x524f, 0x5250, 0x5251, 0x5252, 0x5253, 0x5254, 0x5255, 0x5256, 0x5257, 0x5258, 0x5259, 0x525a, 0x525b, 0x525c, 0x525d, 0x525e, 0x525f, 0x5260, 0x5261, 0x5262, 0x5263, 0x5264, 0x5265, 0x5266, 0x5267, 0x5268, 0x5269, 0x526a, 0x526b, 0x526c, 0x526d, 0x526e, 0x526f, 0x5270, 0x5271, 0x5272, 0x5273, 0x5274, 0x5276, 0x5277, 0x5278, 0x5275, 0x5279, 0x527a, 0x527b, 0x527c, 0x527d, 0x527e, 0x5321, 0x5322, 0x5323, 0x5324, 0x5325, 0x5326, 0x5327, 0x5328, 0x5329, 0x532a, 0x532b, 0x532c, 0x532d, 0x532e, 0x532f, 0x5330, 0x5331, 0x5332, 0x5333, 0x5334, 0x5335, 0x5336, 0x5337, 0x5338, 0x5339, 0x533a, 0x533b, 0x533c, 0x533d, 0x533e, 0x533f, 0x5340, 0x5341, 0x5342, 0x5343, 0x5344, 0x5345, 0x5346, 0x5347, 0x5348, 0x5349, 0x534a, 0x534b, 0x534c, 0x534d, 0x534e, 0x534f, 0x5350, 0x5351, 0x5352, 0x5353, 0x5354, 0x5355, 0x5356, 0x5357, 0x5358, 0x5359, 0x535a, 0x535b, 0x535c, 0x535d, 0x535e, 0x535f, 0x5360, 0x5361, 0x5362, 0x5363, 0x5364, 0x5365, 0x5366, 0x5367, 0x5368, 0x5369, 0x536a, 0x536b, 0x536c, 0x536d, 0x536e, 0x536f, 0x5370, 0x5371, 0x5372, 0x5373, 0x5374, 0x5375, 0x5376, 0x5377, 0x5378, 0x5379, 0x537a, 0x537b, 0x537c, 0x537d, 0x537e, 0x5421, 0x5422, 0x5423, 0x5424, 0x5425, 0x5426, 0x5427, 0x5428, 0x5429, 0x542a, 0x542b, 0x542c, 0x542d, 0x542e, 0x542f, 0x5430, 0x5431, 0x5432, 0x5434, 0x5435, 0x5436, 0x5437, 0x5438, 0x5439, 0x543a, 0x543b, 0x543c, 0x543d, 0x543e, 0x5433, 0x543f, 0x5440, 0x5441, 0x5442, 0x5443, 0x5444, 0x5445, 0x5446, 0x5447, 0x5448, 0x5449, 0x544a, 0x544b, 0x544c, 0x544d, 0x544e, 0x544f, 0x5450, 0x5451, 0x5452, 0x5453, 0x5454, 0x5455, 0x5456, 0x5457, 0x5458, 0x5459, 0x545a, 0x545b, 0x545c, 0x545d, 0x545e, 0x545f, 0x5460, 0x5461, 0x5462, 0x5463, 0x5464, 0x5465, 0x5466, 0x5467, 0x5468, 0x5469, 0x546a, 0x546c, 0x546b, 0x546d, 0x546e, 0x546f, 0x5470, 0x5471, 0x5472, 0x5473, 0x5474, 0x5475, 0x5476, 0x5477, 0x5478, 0x5479, 0x547a, 0x547b, 0x547c, 0x547d, 0x547e, 0x5521, 0x5522, 0x5523, 0x5524, 0x5525, 0x5526, 0x5527, 0x5528, 0x5529, 0x552a, 0x552b, 0x552c, 0x552d, 0x552e, 0x552f, 0x5530, 0x5531, 0x5532, 0x5533, 0x5534, 0x5535, 0x5536, 0x5537, 0x5538, 0x5539, 0x553a, 0x553b, 0x553c, 0x553d, 0x553e, 0x553f, 0x5540, 0x5541, 0x5542, 0x5543, 0x5544, 0x5545, 0x5546, 0x5547, 0x5548, 0x5549, 0x554a, 0x554b, 0x554c, 0x554d, 0x554e, 0x554f, 0x5550, 0x5551, 0x5552, 0x5553, 0x5554, 0x5555, 0x5556, 0x5557, 0x5558, 0x5559, 0x555a, 0x555b, 0x555c, 0x555d, 0x555e, 0x555f, 0x5560, 0x5561, 0x5562, 0x5563, 0x5564, 0x5565, 0x5566, 0x5567, 0x5568, 0x5569, 0x556a, 0x556b, 0x556c, 0x556d, 0x556e, 0x556f, 0x5570, 0x5571, 0x5572, 0x5573, 0x5574, 0x5575, 0x5576, 0x5577, 0x5578, 0x5579, 0x557a, 0x557b, 0x557c, 0x557d, 0x557e, 0x5621, 0x5622, 0x5623, 0x5624, 0x5625, 0x5626, 0x5627, 0x5628, 0x5629, 0x562a, 0x562b, 0x562c, 0x562d, 0x562e, 0x562f, 0x5630, 0x5631, 0x5632, 0x5633, 0x5634, 0x5635, 0x5636, 0x5637, 0x5638, 0x5639, 0x563a, 0x563b, 0x563c, 0x563d, 0x563e, 0x563f, 0x5640, 0x5641, 0x5642, 0x5643, 0x5644, 0x5645, 0x5647, 0x5648, 0x5649, 0x564a, 0x564b, 0x5646, 0x564c, 0x564d, 0x564e, 0x564f, 0x5650, 0x5651, 0x5652, 0x5653, 0x5654, 0x5656, 0x5657, 0x5658, 0x5655, 0x5659, 0x565a, 0x565b, 0x565c, 0x565d, 0x565e, 0x565f, 0x5660, 0x5661, 0x5662, 0x5663, 0x5664, 0x5665, 0x5666, 0x5667, 0x5668, 0x5669, 0x566a, 0x566b, 0x566c, 0x566d, 0x566e, 0x566f, 0x5670, 0x5671, 0x5672, 0x5673, 0x5674, 0x5675, 0x5676, 0x5677, 0x5678, 0x5679, 0x567a, 0x567b, 0x567c, 0x567d, 0x567e, 0x5721, 0x5722, 0x5723, 0x5724, 0x5725, 0x5726, 0x5727, 0x5728, 0x5729, 0x572a, 0x572b, 0x572c, 0x572d, 0x572e, 0x572f, 0x5730, 0x5731, 0x5732, 0x5733, 0x5734, 0x5735, 0x5736, 0x5737, 0x5738, 0x5739, 0x573a, 0x573b, 0x573c, 0x573d, 0x573e, 0x573f, 0x5740, 0x5741, 0x5742, 0x5743, 0x5744, 0x5745, 0x5746, 0x5747, 0x5748, 0x5749, 0x574a, 0x574b, 0x574c, 0x574d, 0x574e, 0x574f, 0x5750, 0x5751, 0x5752, 0x5753, 0x5754, 0x5755, 0x5756, 0x5757, 0x5758, 0x5759, 0x575a, 0x575b, 0x575c, 0x575d, 0x575e, 0x575f, 0x5760, 0x5761, 0x5762, 0x5764, 0x5765, 0x5766, 0x5767, 0x5768, 0x5769, 0x576a, 0x576b, 0x576c, 0x576d, 0x576e, 0x576f, 0x5770, 0x5771, 0x5772, 0x5773, 0x5774, 0x5775, 0x5776, 0x5777, 0x5778, 0x5779, 0x583e, 0x5763, 0x577a, 0x577b, 0x577c, 0x577d, 0x577e, 0x5821, 0x5822, 0x5823, 0x5824, 0x5825, 0x5826, 0x5827, 0x5828, 0x5829, 0x582a, 0x582b, 0x582c, 0x582d, 0x582e, 0x582f, 0x5830, 0x5831, 0x5832, 0x5833, 0x584c, 0x5834, 0x5835, 0x5836, 0x5837, 0x5838, 0x5839, 0x583a, 0x583b, 0x583c, 0x583d, 0x583f, 0x5840, 0x5841, 0x5842, 0x5843, 0x5844, 0x5845, 0x5846, 0x5847, 0x5848, 0x5849, 0x584a, 0x584b, 0x584d, 0x584e, 0x584f, 0x5850, 0x5851, 0x5852, 0x5853, 0x5854, 0x5855, 0x5856, 0x5857, 0x5858, 0x5859, 0x585a, 0x585b, 0x585c, 0x585d, 0x585e, 0x585f, 0x5860, 0x5861, 0x5862, 0x5863, 0x5864, 0x5865, 0x5866, 0x5867, 0x5868, 0x5869, 0x586a, 0x586b, 0x586c, 0x586d, 0x586e, 0x586f, 0x5870, 0x5871, 0x5872, 0x5873, 0x5874, 0x5875, 0x5876, 0x5877, 0x5878, 0x5879, 0x587a, 0x587b, 0x587c, 0x587d, 0x587e, 0x5921, 0x5922, 0x5923, 0x5924, 0x5925, 0x5926, 0x5927, 0x5928, 0x592a, 0x592b, 0x592c, 0x592d, 0x592e, 0x592f, 0x5930, 0x5931, 0x5932, 0x5933, 0x5934, 0x5935, 0x5936, 0x5937, 0x5938, 0x5939, 0x593a, 0x593b, 0x593c, 0x5929, 0x593d, 0x593e, 0x593f, 0x5940, 0x5941, 0x5942, 0x5943, 0x5944, 0x5945, 0x5946, 0x5947, 0x5948, 0x5949, 0x594a, 0x594b, 0x594c, 0x594d, 0x594e, 0x594f, 0x5950, 0x5951, 0x5952, 0x5953, 0x5954, 0x5955, 0x5956, 0x5957, 0x5958, 0x5959, 0x595a, 0x595b, 0x595c, 0x595d, 0x595e, 0x595f, 0x5960, 0x5961, 0x5962, 0x5963, 0x5964, 0x5965, 0x5966, 0x5974, 0x5967, 0x5968, 0x5969, 0x596a, 0x596b, 0x596c, 0x596d, 0x596e, 0x596f, 0x5970, 0x5971, 0x5972, 0x5973, 0x5975, 0x5976, 0x5977, 0x5978, 0x5979, 0x597a, 0x597b, 0x597c, 0x597d, 0x597e, 0x5a21, 0x5a22, 0x5a23, 0x5a24, 0x5a25, 0x5a26, 0x5a27, 0x5a28, 0x5a29, 0x5a2a, 0x5a2b, 0x5a2c, 0x5a2d, 0x5a2e, 0x5a2f, 0x5a30, 0x5a31, 0x5a32, 0x5a33, 0x5a34, 0x5a35, 0x5a36, 0x3866, 0x5a37, 0x5a38, 0x5a39, 0x5a3a, 0x5a3b, 0x5a3c, 0x5a3d, 0x5a3e, 0x5a3f, 0x5a40, 0x5a41, 0x5a42, 0x5a43, 0x5a44, 0x5a45, 0x5a46, 0x5a47, 0x5a48, 0x5a49, 0x5a4a, 0x5a4b, 0x5a6d, 0x5a4c, 0x5a4d, 0x5a4e, 0x5a4f, 0x5a50, 0x5a51, 0x5a52, 0x5a53, 0x5a54, 0x5a55, 0x5a56, 0x5a57, 0x5a58, 0x5a59, 0x5a5a, 0x5a5b, 0x5a5c, 0x5a5d, 0x5a5e, 0x5a5f, 0x5a60, 0x5a61, 0x5a62, 0x5a63, 0x5a64, 0x5a65, 0x5a66, 0x5a67, 0x5a68, 0x5a69, 0x5a6a, 0x5a6b, 0x5a6c, 0x5a6e, 0x5a6f, 0x5a70, 0x5a71, 0x5a72, 0x5a73, 0x5a74, 0x5a75, 0x5a76, 0x5a77, 0x5a78, 0x5a79, 0x5a7a, 0x5a7b, 0x5a7c, 0x5a7d, 0x5a7e, 0x5b21, 0x5b22, 0x5b23, 0x5b24, 0x5b25, 0x5b26, 0x5b27, 0x5b28, 0x5b29, 0x5b2a, 0x5b2b, 0x5b2c, 0x5b2d, 0x5b2e, 0x5b2f, 0x5b30, 0x5b31, 0x5b32, 0x5b33, 0x5b34, 0x5b35, 0x5b36, 0x5b37, 0x5b38, 0x5b39, 0x5b3a, 0x5b3b, 0x5b3c, 0x5b3d, 0x5b3e, 0x5b3f, 0x5b40, 0x5b41, 0x5b42, 0x5b43, 0x5b44, 0x5b45, 0x5b46, 0x5b47, 0x5b48, 0x5b49, 0x5b4a, 0x5b4b, 0x5b4c, 0x5b4d, 0x5b4e, 0x5b4f, 0x5b50, 0x5b51, 0x5b52, 0x5b53, 0x5b54, 0x5b55, 0x5b56, 0x5b57, 0x5b58, 0x5b59, 0x5b5a, 0x5b5b, 0x5b5c, 0x5b5d, 0x5b5e, 0x5b5f, 0x5b60, 0x5b61, 0x5b62, 0x5b63, 0x5b64, 0x5b65, 0x5b66, 0x5b67, 0x5b68, 0x5b69, 0x5b6a, 0x5b6b, 0x5b6c, 0x5b6d, 0x5b6e, 0x5b70, 0x5b71, 0x5b72, 0x5b73, 0x5b6f, 0x5b74, 0x5b75, 0x5b76, 0x5b77, 0x5b78, 0x5b79, 0x5b7a, 0x5b7b, 0x5b7c, 0x5b7d, 0x5b7e, 0x5c21, 0x5c22, 0x5c23, 0x5c24, 0x5c25, 0x5c26, 0x5c27, 0x5c28, 0x5c29, 0x5c2a, 0x5c2b, 0x5c2c, 0x5c2d, 0x5c2e, 0x5c2f, 0x5c30, 0x5c31, 0x5c32, 0x5c33, 0x5c34, 0x5c35, 0x5c36, 0x5c37, 0x5c38, 0x5c39, 0x5c3a, 0x5c3b, 0x5c3c, 0x5c3d, 0x5c3e, 0x5c3f, 0x5c40, 0x5c41, 0x5c42, 0x5c43, 0x5c44, 0x5c45, 0x5c46, 0x5c47, 0x5c48, 0x5c49, 0x5c4a, 0x5c4b, 0x5c4c, 0x5c4d, 0x5c4e, 0x5c4f, 0x5c50, 0x5c51, 0x5c52, 0x5c53, 0x5c54, 0x5c55, 0x5c56, 0x5c57, 0x5c58, 0x5c59, 0x5c5a, 0x5c5b, 0x5c5c, 0x5c5d, 0x5c5e, 0x5c5f, 0x5c60, 0x5c61, 0x5c62, 0x5c63, 0x5c64, 0x5c65, 0x5c66, 0x5c67, 0x5c68, 0x5c69, 0x5c6a, 0x5c6b, 0x5c6c, 0x5c6d, 0x5c6e, 0x5c6f, 0x5c70, 0x5c71, 0x5c72, 0x5c73, 0x5c74, 0x5c75, 0x5c76, 0x5c77, 0x5c78, 0x5c79, 0x5c7a, 0x5c7b, 0x5c7c, 0x5c7d, 0x5c7e, 0x5d21, 0x5d22, 0x5d23, 0x5d24, 0x5d25, 0x5d26, 0x5d27, 0x5d28, 0x5d29, 0x5d2a, 0x5d2b, 0x5d2c, 0x5d2d, 0x5d2e, 0x5d2f, 0x5d30, 0x5d31, 0x5d32, 0x5d33, 0x5d34, 0x5d35, 0x5d36, 0x5d37, 0x5d38, 0x5d39, 0x5d3a, 0x5d3b, 0x5d3c, 0x5d3d, 0x5d3e, 0x5d3f, 0x5d40, 0x5d41, 0x5d42, 0x5d43, 0x5d44, 0x5d45, 0x5d46, 0x5d47, 0x5d48, 0x5d49, 0x5d4a, 0x5d4b, 0x5d4c, 0x5d4d, 0x5d4e, 0x5d4f, 0x5d50, 0x5d51, 0x5d52, 0x5d53, 0x5d54, 0x5d55, 0x5d56, 0x5d57, 0x5d58, 0x5d59, 0x5d5a, 0x5d5b, 0x5d5c, 0x5d5d, 0x5d5e, 0x5d5f, 0x5d60, 0x5d61, 0x5d62, 0x5d63, 0x5d64, 0x5d65, 0x5d66, 0x5d67, 0x5d68, 0x5d69, 0x5d6a, 0x5d6b, 0x5d6c, 0x5d6d, 0x5d6e, 0x5d6f, 0x5d70, 0x5d71, 0x5d72, 0x5d73, 0x5d74, 0x5d75, 0x5d76, 0x5d77, 0x5d78, 0x5d79, 0x5d7a, 0x5d7b, 0x5d7c, 0x5d7d, 0x5d7e, 0x5e21, 0x5e22, 0x5e23, 0x5e24, 0x5e25, 0x5e26, 0x5e27, 0x5e28, 0x5e29, 0x5e2a, 0x5e2b, 0x5e2c, 0x5e2d, 0x5e2e, 0x5e2f, 0x5e30, 0x5e31, 0x5e32, 0x5e33, 0x5e34, 0x5e35, 0x5e36, 0x5e37, 0x5e38, 0x5e39, 0x5e3f, 0x5e3a, 0x5e3b, 0x5e3c, 0x5e3d, 0x5e3e, 0x5e40, 0x5e41, 0x5e42, 0x5e43, 0x5e44, 0x5e45, 0x5e46, 0x5e47, 0x5e48, 0x5e49, 0x5e4e, 0x5e4a, 0x5e4b, 0x5e4c, 0x5e4d, 0x5e4f, 0x5e50, 0x5e51, 0x5e52, 0x5e53, 0x5e54, 0x5e55, 0x5e56, 0x5e57, 0x5e58, 0x5e59, 0x5e5a, 0x5e5b, 0x5e5c, 0x5e5d, 0x5e5e, 0x5e5f, 0x5e60, 0x5e61, 0x5e62, 0x5e63, 0x5e64, 0x5e65, 0x5e66, 0x5e67, 0x5e68, 0x5e69, 0x5e6a, 0x5e6b, 0x5e6c, 0x5e6d, 0x5e6e, 0x5e6f, 0x5e72, 0x5e70, 0x5e71, 0x5e73, 0x5e74, 0x5e75, 0x5e76, 0x5e77, 0x5e78, 0x5e79, 0x5e7a, 0x5e7b, 0x5e7c, 0x5e7d, 0x5e7e, 0x5f21, 0x5f22, 0x5f23, 0x5f24, 0x5f25, 0x5f26, 0x5f27, 0x5f28, 0x5f29, 0x5f2a, 0x5f2b, 0x5f2c, 0x5f2d, 0x5f2e, 0x5f2f, 0x5f30, 0x5f32, 0x5f31, 0x5f33, 0x5f34, 0x5f35, 0x5f36, 0x5f37, 0x5f38, 0x5f39, 0x5f3a, 0x5f3b, 0x5f3c, 0x5f3d, 0x5f3e, 0x5f3f, 0x5f40, 0x5f41, 0x5f42, 0x5f43, 0x5f44, 0x5f45, 0x5f46, 0x5f47, 0x5f48, 0x5f49, 0x5f4a, 0x5f4b, 0x5f4c, 0x5f4d, 0x5f4e, 0x5f4f, 0x5f50, 0x5f51, 0x5f52, 0x5f53, 0x5f54, 0x5f55, 0x5f56, 0x5f57, 0x5f58, 0x5f59, 0x5f5a, 0x5f5b, 0x5f5c, 0x5f5d, 0x5f6f, 0x5f5e, 0x5f5f, 0x5f60, 0x5f61, 0x5f62, 0x5f63, 0x5f64, 0x5f65, 0x5f66, 0x5f67, 0x5f68, 0x5f69, 0x5f6a, 0x5f6b, 0x5f6c, 0x5f6d, 0x5f6e, 0x5f70, 0x5f71, 0x5f72, 0x5f73, 0x5f74, 0x5f75, 0x5f76, 0x5f77, 0x5f78, 0x5f79, 0x5f7a, 0x5f7b, 0x5f7c, 0x5f7d, 0x5f7e, 0x6021, 0x6022, 0x6023, 0x6024, 0x6025, 0x6026, 0x6027, 0x6028, 0x6029, 0x602a, 0x602b, 0x602c, 0x602d, 0x602e, 0x602f, 0x6030, 0x6031, 0x6032, 0x6033, 0x6034, 0x6035, 0x6036, 0x6037, 0x6038, 0x6039, 0x603a, 0x603b, 0x603c, 0x603d, 0x603e, 0x603f, 0x6040, 0x6041, 0x6042, 0x6043, 0x6044, 0x6045, 0x6046, 0x6047, 0x6048, 0x6049, 0x604a, 0x604b, 0x604c, 0x604d, 0x604e, 0x604f, 0x6050, 0x6051, 0x6052, 0x6053, 0x6054, 0x6055, 0x6056, 0x6057, 0x6058, 0x6059, 0x605a, 0x605b, 0x605c, 0x605d, 0x6064, 0x605e, 0x605f, 0x6060, 0x6061, 0x6062, 0x6063, 0x6065, 0x6066, 0x6067, 0x6068, 0x6069, 0x606a, 0x606b, 0x606c, 0x606d, 0x606e, 0x606f, 0x6070, 0x6071, 0x6072, 0x6073, 0x6074, 0x6075, 0x6076, 0x6077, 0x6078, 0x6079, 0x607a, 0x607b, 0x607c, 0x607d, 0x607e, 0x6121, 0x6122, 0x6123, 0x6124, 0x6125, 0x6126, 0x6127, 0x6128, 0x6129, 0x612a, 0x612b, 0x612c, 0x612d, 0x612e, 0x612f, 0x6130, 0x6131, 0x6132, 0x6133, 0x6134, 0x6135, 0x6136, 0x6137, 0x6138, 0x6139, 0x613a, 0x613b, 0x613c, 0x613d, 0x613e, 0x613f, 0x6140, 0x6141, 0x6142, 0x6143, 0x6144, 0x6145, 0x6146, 0x6147, 0x6148, 0x6149, 0x614a, 0x614b, 0x614c, 0x614d, 0x614e, 0x614f, 0x6150, 0x6151, 0x6152, 0x6154, 0x6155, 0x6156, 0x6153, 0x6157, 0x6158, 0x6159, 0x615a, 0x615b, 0x615c, 0x615d, 0x615e, 0x615f, 0x6160, 0x6161, 0x6162, 0x6163, 0x6164, 0x6165, 0x6166, 0x6167, 0x6168, 0x6169, 0x616a, 0x616b, 0x616c, 0x616d, 0x616e, 0x616f, 0x6170, 0x6171, 0x6172, 0x6173, 0x6174, 0x6175, 0x6176, 0x6177, 0x6178, 0x6179, 0x617a, 0x617b, 0x617d, 0x617e, 0x6221, 0x6222, 0x6223, 0x6224, 0x617c, 0x622d, 0x6225, 0x6226, 0x6227, 0x6228, 0x6229, 0x622a, 0x622b, 0x622c, 0x622f, 0x6230, 0x6231, 0x6232, 0x622e, 0x6233, 0x6234, 0x6235, 0x6236, 0x6237, 0x6238, 0x6239, 0x623a, 0x623b, 0x623c, 0x623d, 0x623e, 0x623f, 0x6240, 0x6241, 0x6242, 0x6243, 0x6245, 0x6246, 0x6244, 0x6247, 0x6248, 0x6249, 0x624a, 0x624b, 0x624c, 0x624d, 0x624e, 0x624f, 0x6250, 0x6251, 0x6252, 0x6253, 0x6254, 0x6255, 0x6256, 0x6257, 0x6258, 0x6259, 0x625a, 0x625b, 0x625c, 0x625d, 0x625e, 0x625f, 0x6260, 0x6261, 0x6262, 0x6263, 0x6264, 0x6265, 0x6266, 0x6267, 0x6268, 0x6269, 0x626a, 0x626b, 0x626c, 0x626d, 0x626e, 0x626f, 0x6270, 0x6271, 0x6272, 0x6273, 0x6274, 0x6275, 0x6276, 0x6277, 0x6278, 0x6279, 0x627a, 0x627b, 0x627c, 0x627d, 0x627e, 0x6321, 0x6322, 0x6323, 0x6324, 0x6325, 0x6326, 0x6327, 0x6328, 0x6329, 0x632a, 0x632b, 0x632c, 0x632d, 0x632e, 0x632f, 0x6330, 0x6331, 0x6332, 0x6333, 0x6334, 0x6335, 0x6336, 0x6337, 0x6338, 0x6339, 0x633a, 0x633b, 0x633c, 0x633d, 0x633e, 0x633f, 0x6340, 0x6341, 0x6342, 0x6343, 0x6344, 0x6345, 0x6346, 0x6347, 0x6348, 0x6349, 0x634a, 0x634b, 0x634c, 0x634d, 0x634e, 0x634f, 0x6350, 0x6351, 0x6352, 0x6353, 0x6354, 0x6355, 0x6356, 0x6357, 0x6358, 0x6359, 0x635a, 0x635b, 0x635c, 0x635d, 0x635e, 0x635f, 0x6360, 0x6361, 0x6362, 0x6363, 0x6364, 0x6365, 0x6366, 0x6367, 0x6368, 0x6369, 0x636a, 0x636b, 0x636c, 0x636d, 0x636e, 0x636f, 0x6370, 0x6371, 0x6372, 0x6373, 0x6374, 0x6375, 0x6376, 0x6377, 0x6378, 0x6379, 0x637a, 0x637b, 0x637c, 0x637d, 0x637e, 0x6421, 0x6422, 0x6423, 0x6424, 0x6425, 0x6426, 0x6427, 0x6428, 0x6429, 0x642a, 0x642b, 0x642c, 0x642d, 0x642e, 0x642f, 0x6430, 0x6431, 0x6432, 0x6433, 0x6434, 0x6435, 0x6436, 0x6437, 0x6438, 0x6439, 0x643a, 0x643b, 0x643c, 0x643d, 0x643e, 0x643f, 0x6440, 0x6441, 0x6442, 0x6443, 0x6444, 0x6445, 0x6446, 0x6447, 0x6448, 0x6449, 0x644a, 0x644b, 0x644c, 0x644d, 0x644e, 0x644f, 0x6450, 0x6451, 0x6452, 0x6453, 0x6454, 0x6455, 0x6456, 0x6457, 0x6458, 0x6459, 0x645a, 0x645b, 0x645c, 0x645d, 0x645e, 0x645f, 0x6460, 0x6461, 0x6462, 0x6463, 0x6464, 0x6465, 0x6466, 0x6467, 0x6468, 0x6469, 0x646a, 0x646b, 0x646c, 0x646d, 0x646e, 0x646f, 0x6470, 0x6471, 0x6472, 0x6473, 0x6474, 0x6475, 0x6476, 0x6477, 0x6478, 0x6479, 0x647a, 0x647b, 0x647c, 0x647d, 0x647e, 0x6521, 0x6522, 0x6523, 0x6524, 0x6525, 0x6526, 0x6527, 0x6528, 0x6529, 0x652a, 0x652b, 0x652c, 0x652d, 0x652e, 0x652f, 0x6530, 0x6531, 0x6532, 0x6533, 0x6534, 0x6535, 0x653b, 0x6536, 0x6537, 0x6538, 0x6539, 0x653a, 0x653c, 0x653d, 0x653e, 0x653f, 0x6540, 0x6541, 0x6542, 0x6543, 0x6544, 0x6545, 0x6546, 0x6547, 0x6548, 0x6549, 0x654a, 0x654b, 0x654c, 0x654d, 0x654f, 0x6550, 0x654e, 0x6551, 0x6552, 0x6553, 0x6554, 0x6555, 0x6556, 0x6557, 0x6558, 0x6559, 0x655a, 0x655b, 0x655c, 0x655d, 0x655e, 0x655f, 0x6560, 0x6561, 0x6562, 0x6563, 0x6564, 0x6565, 0x6566, 0x6568, 0x6567, 0x6569, 0x656a, 0x656b, 0x656c, 0x656d, 0x656e, 0x656f, 0x6570, 0x6571, 0x6572, 0x6573, 0x6574, 0x6575, 0x6576, 0x6577, 0x6578, 0x6579, 0x657a, 0x657c, 0x657b, 0x657d, 0x657e, 0x6621, 0x6622, 0x6623, 0x6624, 0x6625, 0x6626, 0x6627, 0x6628, 0x6629, 0x662a, 0x662b, 0x662c, 0x662d, 0x662e, 0x662f, 0x6630, 0x6631, 0x6632, 0x6633, 0x6634, 0x6635, 0x6636, 0x6637, 0x6638, 0x6639, 0x663a, 0x663b, 0x663c, 0x663d, 0x663e, 0x663f, 0x6640, 0x6641, 0x6642, 0x6643, 0x6644, 0x6645, 0x6646, 0x6647, 0x6648, 0x6649, 0x664a, 0x664b, 0x664c, 0x664d, 0x664e, 0x664f, 0x6650, 0x6651, 0x6652, 0x6653, 0x6654, 0x6655, 0x6656, 0x6657, 0x6658, 0x6659, 0x665a, 0x665b, 0x665c, 0x665d, 0x665e, 0x665f, 0x6660, 0x6661, 0x6662, 0x6663, 0x6664, 0x6665, 0x6666, 0x6667, 0x6668, 0x6669, 0x666a, 0x666b, 0x666c, 0x666d, 0x666e, 0x666f, 0x6670, 0x6671, 0x6672, 0x6673, 0x6675, 0x6676, 0x6677, 0x6678, 0x6679, 0x667a, 0x667b, 0x667c, 0x667d, 0x667e, 0x6721, 0x6722, 0x6723, 0x6724, 0x6725, 0x6726, 0x6727, 0x6728, 0x6729, 0x672a, 0x672b, 0x672c, 0x672d, 0x672e, 0x672f, 0x6730, 0x6731, 0x6732, 0x6733, 0x6734, 0x6735, 0x6736, 0x6737, 0x6738, 0x6739, 0x673a, 0x673b, 0x673c, 0x673d, 0x673e, 0x673f, 0x6740, 0x6741, 0x6742, 0x6743, 0x6744, 0x6745, 0x6746, 0x6747, 0x6748, 0x6749, 0x674a, 0x674b, 0x674c, 0x674d, 0x674e, 0x674f, 0x6750, 0x6751, 0x6752, 0x6753, 0x6754, 0x6755, 0x6756, 0x6757, 0x6758, 0x6759, 0x675a, 0x675b, 0x675c, 0x675d, 0x675e, 0x675f, 0x6760, 0x6761, 0x6762, 0x6763, 0x6764, 0x6765, 0x6766, 0x676a, 0x6767, 0x6768, 0x6769, 0x676b, 0x676c, 0x676d, 0x676e, 0x676f, 0x6770, 0x6771, 0x6772, 0x6773, 0x6774, 0x6776, 0x6777, 0x6778, 0x6779, 0x6775, 0x677a, 0x677b, 0x677c, 0x677d, 0x6828, 0x677e, 0x6821, 0x6822, 0x6823, 0x6824, 0x6825, 0x6826, 0x6827, 0x6829, 0x682a, 0x682b, 0x682c, 0x682d, 0x682e, 0x682f, 0x6830, 0x6831, 0x6832, 0x6833, 0x6834, 0x6835, 0x6836, 0x6837, 0x6838, 0x6839, 0x683a, 0x683b, 0x683c, 0x683d, 0x683e, 0x683f, 0x6840, 0x6841, 0x6842, 0x6843, 0x6844, 0x6845, 0x6846, 0x6847, 0x6848, 0x6849, 0x684a, 0x684b, 0x684c, 0x684d, 0x684e, 0x684f, 0x6850, 0x6851, 0x6852, 0x6853, 0x6854, 0x6855, 0x6856, 0x6857, 0x6858, 0x6859, 0x685a, 0x685b, 0x685c, 0x685d, 0x685e, 0x685f, 0x6860, 0x6861, 0x6862, 0x6863, 0x6864, 0x6865, 0x6866, 0x6867, 0x6868, 0x6869, 0x686a, 0x686b, 0x686c, 0x686d, 0x686e, 0x686f, 0x6870, 0x6871, 0x6872, 0x6873, 0x6874, 0x6875, 0x6876, 0x6877, 0x6878, 0x6879, 0x687a, 0x687b, 0x687c, 0x687d, 0x687e, 0x6921, 0x6922, 0x6923, 0x6924, 0x6925, 0x6926, 0x6927, 0x6928, 0x6929, 0x692a, 0x692b, 0x692c, 0x692d, 0x692e, 0x692f, 0x6930, 0x6931, 0x6932, 0x6933, 0x6934, 0x6935, 0x6936, 0x6937, 0x6938, 0x6939, 0x693a, 0x693b, 0x693c, 0x693d, 0x693e, 0x693f, 0x6940, 0x6941, 0x6942, 0x6943, 0x6944, 0x6945, 0x6946, 0x6947, 0x6948, 0x6949, 0x694a, 0x694c, 0x694d, 0x694b, 0x694e, 0x694f, 0x6950, 0x6951, 0x6952, 0x6953, 0x6954, 0x6955, 0x6956, 0x6957, 0x6958, 0x6959, 0x695a, 0x695b, 0x695c, 0x695d, 0x695e, 0x695f, 0x6960, 0x6961, 0x6962, 0x6963, 0x6964, 0x6965, 0x6966, 0x6967, 0x6968, 0x6969, 0x696a, 0x696b, 0x696c, 0x696d, 0x696e, 0x696f, 0x6970, 0x6971, 0x6972, 0x6973, 0x6974, 0x6975, 0x6976, 0x6977, 0x6978, 0x6979, 0x697a, 0x697b, 0x697c, 0x697d, 0x697e, 0x6a21, 0x6a22, 0x6a23, 0x6a24, 0x6a25, 0x6a26, 0x6a27, 0x6a28, 0x6a29, 0x6a2a, 0x6a2b, 0x6a2c, 0x6a2d, 0x6a2e, 0x6a2f, 0x6a30, 0x6a31, 0x6a32, 0x6a33, 0x6a34, 0x6a35, 0x6a36, 0x6a37, 0x6a38, 0x6a39, 0x6a3a, 0x6a3b, 0x6a3c, 0x6a3d, 0x6a3e, 0x6a3f, 0x6a40, 0x6a41, 0x6a42, 0x6a43, 0x6a44, 0x6a45, 0x6a46, 0x6a47, 0x6a48, 0x6a49, 0x6a4a, 0x6a4b, 0x6a4c, 0x6a4d, 0x6a4e, 0x6a4f, 0x6a50, 0x6a51, 0x6a52, 0x6a53, 0x6a54, 0x6a55, 0x6a56, 0x6a57, 0x6a58, 0x6a59, 0x6a5a, 0x6a5b, 0x6a5c, 0x6a5d, 0x6a5e, 0x6a5f, 0x6a60, 0x6a61, 0x6a62, 0x6a63, 0x6a64, 0x6a65, 0x6a66, 0x6a67, 0x6a68, 0x6a69, 0x6a6a, 0x6a6b, 0x6a6c, 0x6a6d, 0x6a6e, 0x6a6f, 0x6a70, 0x6a71, 0x6a72, 0x6a73, 0x6a74, 0x6a75, 0x6a76, 0x6a77, 0x6a78, 0x6a79, 0x6a7a, 0x6a7b, 0x6a7c, 0x6a7d, 0x6a7e, 0x6b21, 0x6b22, 0x6b23, 0x6b24, 0x6b25, 0x6b26, 0x6b27, 0x6b28, 0x6b29, 0x6b2a, 0x6b2b, 0x6b2c, 0x6b2d, 0x6b2e, 0x6b2f, 0x6b30, 0x6b31, 0x6b32, 0x6b33, 0x6b34, 0x6b35, 0x6b36, 0x6b37, 0x6b38, 0x6b39, 0x6b3a, 0x6b3b, 0x6b3c, 0x6b3d, 0x6b3e, 0x6b3f, 0x6b40, 0x6b41, 0x6b42, 0x6b43, 0x6b44, 0x6b45, 0x6b46, 0x6b47, 0x6b48, 0x6b49, 0x6b50, 0x6b4a, 0x6b4b, 0x6b4c, 0x6b4d, 0x6b52, 0x6b4e, 0x6b4f, 0x6b51, 0x6b53, 0x6b54, 0x6b55, 0x6b56, 0x6b57, 0x6b58, 0x6b59, 0x6b5a, 0x6b5b, 0x6b5c, 0x6b5e, 0x6b5d, 0x6b5f, 0x6b60, 0x6b61, 0x6b62, 0x6b63, 0x6b64, 0x6b65, 0x6b66, 0x6b67, 0x6b68, 0x6b69, 0x6b6a, 0x6b6b, 0x6b6d, 0x6b6e, 0x6b6f, 0x6b6c, 0x6b70, 0x6b71, 0x6b72, 0x6b73, 0x6b74, 0x6b76, 0x6b75, 0x6b77, 0x6b78, 0x6b79, 0x6b7a, 0x6b7b, 0x6b7c, 0x6b7d, 0x6b7e, 0x6c21, 0x6c22, 0x6c23, 0x6c24, 0x6c25, 0x6c26, 0x6c27, 0x6c28, 0x6c29, 0x6c2a, 0x6c2b, 0x6c2c, 0x6c2d, 0x6c2e, 0x6c2f, 0x6c30, 0x6c31, 0x6c32, 0x6c33, 0x6c34, 0x6c35, 0x6c36, 0x6c37, 0x6c38, 0x6c39, 0x6c3a, 0x6c3b, 0x6c3c, 0x6c3d, 0x6c3e, 0x6c3f, 0x6c40, 0x6c41, 0x6c42, 0x6c43, 0x6c44, 0x6c45, 0x6c46, 0x6c47, 0x6c48, 0x6c49, 0x6c4a, 0x6c4b, 0x6c4c, 0x6c4e, 0x6c4f, 0x6c4d, 0x6c50, 0x6c51, 0x6c52, 0x6c53, 0x6c54, 0x6c55, 0x6c56, 0x6c57, 0x6c58, 0x6c59, 0x6c5a, 0x6c5b, 0x6c5c, 0x6c5d, 0x6c5e, 0x6c5f, 0x6c60, 0x6c61, 0x6c62, 0x6c63, 0x6c64, 0x6c65, 0x6c66, 0x6c67, 0x6c68, 0x6c69, 0x6c6a, 0x6c6b, 0x6c6c, 0x6c6d, 0x6c6e, 0x6c6f, 0x6c70, 0x6c71, 0x6c72, 0x6c73, 0x6c74, 0x6c75, 0x6c76, 0x6c77, 0x6c78, 0x6c79, 0x6c7a, 0x6c7b, 0x6c7c, 0x6c7d, 0x6c7e, 0x6d21, 0x6d22, 0x6d23, 0x6d24, 0x6d25, 0x6d26, 0x6d27, 0x6d28, 0x6d29, 0x6d2a, 0x6d2b, 0x6d2c, 0x6d2d, 0x6d2e, 0x6d2f, 0x6d30, 0x6d31, 0x6d32, 0x6d33, 0x6d34, 0x6d35, 0x6d36, 0x6d37, 0x6d38, 0x6d39, 0x6d3a, 0x6d3b, 0x6d3c, 0x6d3d, 0x6d3e, 0x6d3f, 0x6d40, 0x6d41, 0x6d42, 0x6d43, 0x6d44, 0x6d45, 0x6d46, 0x6d47, 0x6d48, 0x6d49, 0x6d4a, 0x6d4b, 0x6d4c, 0x6d4d, 0x6d4e, 0x6d4f, 0x6d50, 0x6d51, 0x6d52, 0x6d53, 0x6d54, 0x6d55, 0x6d56, 0x6d57, 0x6d58, 0x6d59, 0x6d5a, 0x6d5b, 0x6d5c, 0x6d5d, 0x6d5e, 0x6d5f, 0x6d60, 0x6d61, 0x6d62, 0x6d63, 0x2237, }; static const Summary16 jisx0212_uni2indx_page00[70] = { /* 0x0000 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0xc652 }, { 7, 0x8500 }, { 10, 0xffff }, { 26, 0xff7e }, { 40, 0xffff }, { 56, 0xff7f }, /* 0x0100 */ { 71, 0xffff }, { 87, 0xffcf }, { 101, 0xcff7 }, { 114, 0xffff }, { 130, 0x3fff }, { 144, 0xffff }, { 160, 0xffff }, { 176, 0x7fff }, { 191, 0x0000 }, { 191, 0x0000 }, { 191, 0x0000 }, { 191, 0x0000 }, { 191, 0xe000 }, { 194, 0x1fff }, { 207, 0x0000 }, { 207, 0x0020 }, /* 0x0200 */ { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0080 }, { 209, 0x2f00 }, { 214, 0x0000 }, { 214, 0x0000 }, /* 0x0300 */ { 214, 0x0000 }, { 214, 0x0000 }, { 214, 0x0000 }, { 214, 0x0000 }, { 214, 0x0000 }, { 214, 0x0000 }, { 214, 0x0000 }, { 214, 0x0000 }, { 214, 0xd770 }, { 223, 0x0001 }, { 224, 0xfc00 }, { 230, 0x0001 }, { 231, 0x7c04 }, { 237, 0x0000 }, { 237, 0x0000 }, { 237, 0x0000 }, /* 0x0400 */ { 237, 0xdffc }, { 250, 0x0000 }, { 250, 0x0000 }, { 250, 0x0000 }, { 250, 0x0000 }, { 250, 0xdffc }, }; static const Summary16 jisx0212_uni2indx_page21[3] = { /* 0x2100 */ { 263, 0x0000 }, { 263, 0x0040 }, { 264, 0x0004 }, }; static const Summary16 jisx0212_uni2indx_page4e[1307] = { /* 0x4e00 */ { 265, 0x1034 }, { 269, 0x8004 }, { 271, 0xc918 }, { 277, 0x0021 }, { 279, 0x0093 }, { 283, 0x1402 }, { 286, 0x0308 }, { 289, 0x8230 }, { 293, 0x2000 }, { 294, 0x20c0 }, { 297, 0x8000 }, { 298, 0x0200 }, { 299, 0x0008 }, { 300, 0x0c01 }, { 303, 0x8107 }, { 308, 0xe02a }, /* 0x4f00 */ { 314, 0x190d }, { 320, 0x02e4 }, { 325, 0x4000 }, { 326, 0x4aaa }, { 333, 0x1b05 }, { 339, 0x8154 }, { 344, 0x5409 }, { 349, 0x6782 }, { 356, 0x5636 }, { 364, 0xc69d }, { 373, 0x0000 }, { 373, 0x7a84 }, { 380, 0xbb63 }, { 390, 0x1004 }, { 392, 0x0005 }, { 394, 0xb005 }, /* 0x5000 */ { 399, 0x5493 }, { 406, 0x7989 }, { 414, 0x4084 }, { 417, 0x082d }, { 422, 0x5467 }, { 430, 0x828e }, { 436, 0x24cd }, { 443, 0x0003 }, { 445, 0xc45a }, { 452, 0xd85d }, { 461, 0x8407 }, { 466, 0x2601 }, { 470, 0x5099 }, { 476, 0xb119 }, { 483, 0x8354 }, { 489, 0x4446 }, /* 0x5100 */ { 494, 0x79c8 }, { 502, 0x7a81 }, { 509, 0xb188 }, { 515, 0x033a }, { 521, 0x8404 }, { 524, 0x81a8 }, { 529, 0x0050 }, { 531, 0x4000 }, { 532, 0x4818 }, { 536, 0x2100 }, { 538, 0x200a }, { 541, 0xd500 }, { 546, 0x8104 }, { 549, 0x412e }, { 555, 0x4024 }, { 558, 0x009c }, /* 0x5200 */ { 562, 0x0026 }, { 565, 0x016c }, { 570, 0x0104 }, { 572, 0x1026 }, { 576, 0x0220 }, { 578, 0x95a0 }, { 584, 0x4043 }, { 588, 0x0380 }, { 591, 0x1425 }, { 596, 0x15e8 }, { 603, 0x80f0 }, { 608, 0x2dc1 }, { 615, 0x9151 }, { 621, 0x1852 }, { 626, 0x1722 }, { 632, 0x00d3 }, /* 0x5300 */ { 637, 0x1c09 }, { 642, 0xd90a }, { 649, 0x3ba0 }, { 656, 0x7025 }, { 662, 0x1804 }, { 665, 0x0a00 }, { 667, 0x302a }, { 672, 0x4204 }, { 675, 0x4188 }, { 679, 0x2218 }, { 683, 0x8c12 }, { 688, 0x25b4 }, { 695, 0x8021 }, { 698, 0x642c }, { 704, 0x00c1 }, { 707, 0x0020 }, /* 0x5400 */ { 708, 0x0004 }, { 709, 0x0408 }, { 711, 0x8582 }, { 716, 0x0032 }, { 719, 0xa098 }, { 724, 0x4000 }, { 725, 0x6ad4 }, { 733, 0x8010 }, { 735, 0x232a }, { 741, 0x9062 }, { 746, 0x66c2 }, { 753, 0x8e82 }, { 759, 0x6440 }, { 763, 0x0000 }, { 763, 0x9401 }, { 767, 0xd040 }, /* 0x5500 */ { 771, 0x7323 }, { 779, 0x0020 }, { 780, 0x0c00 }, { 782, 0x3864 }, { 788, 0x2682 }, { 793, 0x4d03 }, { 799, 0x0053 }, { 803, 0x8000 }, { 804, 0xc146 }, { 810, 0x009e }, { 815, 0x2018 }, { 818, 0x8004 }, { 820, 0x5a4a }, { 827, 0x498e }, { 834, 0x0204 }, { 836, 0x8040 }, /* 0x5600 */ { 838, 0xe520 }, { 844, 0x0207 }, { 848, 0x1000 }, { 849, 0xbaa9 }, { 858, 0xaa5b }, { 867, 0x4010 }, { 869, 0xa24f }, { 877, 0x0026 }, { 880, 0x1930 }, { 885, 0xe620 }, { 891, 0x3bc0 }, { 898, 0x408a }, { 902, 0xbe20 }, { 909, 0xb201 }, { 914, 0x29f2 }, { 922, 0x00c2 }, /* 0x5700 */ { 925, 0x1486 }, { 930, 0x2c22 }, { 935, 0xd63d }, { 945, 0xe018 }, { 950, 0x3060 }, { 954, 0x0004 }, { 955, 0xe9a4 }, { 963, 0x5ebb }, { 974, 0x100a }, { 977, 0xf6b0 }, { 986, 0x1382 }, { 991, 0x2100 }, { 993, 0x9180 }, { 997, 0x6020 }, { 1000, 0x22d2 }, { 1006, 0xe161 }, /* 0x5800 */ { 1013, 0x3318 }, { 1019, 0xc800 }, { 1022, 0x20c1 }, { 1026, 0x8204 }, { 1029, 0xb200 }, { 1033, 0x8021 }, { 1036, 0x0192 }, { 1040, 0x9100 }, { 1043, 0xb783 }, { 1052, 0x2051 }, { 1056, 0x0247 }, { 1061, 0x1006 }, { 1064, 0x6114 }, { 1069, 0x2455 }, { 1075, 0x0206 }, { 1078, 0x0008 }, /* 0x5900 */ { 1079, 0x1860 }, { 1083, 0x201c }, { 1087, 0x811a }, { 1092, 0x8069 }, { 1097, 0x0048 }, { 1099, 0xea0c }, { 1106, 0xa80a }, { 1111, 0x1a64 }, { 1117, 0x5800 }, { 1120, 0x80a4 }, { 1124, 0xe090 }, { 1129, 0x1489 }, { 1134, 0x251a }, { 1140, 0xe004 }, { 1144, 0xc098 }, { 1149, 0x0096 }, /* 0x5a00 */ { 1153, 0x7011 }, { 1158, 0x400c }, { 1161, 0x2598 }, { 1167, 0x0001 }, { 1168, 0x11b0 }, { 1173, 0x4021 }, { 1176, 0x20a8 }, { 1180, 0x4c80 }, { 1184, 0x0800 }, { 1185, 0xd249 }, { 1192, 0x1085 }, { 1196, 0x8d2e }, { 1204, 0x8150 }, { 1208, 0x1400 }, { 1210, 0x4421 }, { 1214, 0x2060 }, /* 0x5b00 */ { 1217, 0x0103 }, { 1220, 0x2a80 }, { 1224, 0x2022 }, { 1227, 0x0110 }, { 1229, 0x1802 }, { 1232, 0x4044 }, { 1235, 0xc100 }, { 1238, 0xf000 }, { 1242, 0x4452 }, { 1247, 0x005b }, { 1252, 0xb300 }, { 1257, 0x1486 }, { 1262, 0xa003 }, { 1266, 0x07c0 }, { 1271, 0x8001 }, { 1273, 0x2012 }, /* 0x5c00 */ { 1276, 0x1000 }, { 1277, 0xc080 }, { 1280, 0x5a48 }, { 1286, 0x0065 }, { 1290, 0x0000 }, { 1290, 0x1600 }, { 1293, 0x238c }, { 1299, 0x3c31 }, { 1306, 0x8580 }, { 1310, 0xa004 }, { 1313, 0x044d }, { 1318, 0x0434 }, { 1322, 0x0a00 }, { 1324, 0x2084 }, { 1327, 0x4000 }, { 1328, 0x0016 }, /* 0x5d00 */ { 1331, 0x2042 }, { 1334, 0x0004 }, { 1335, 0x08d8 }, { 1340, 0xa212 }, { 1345, 0x054c }, { 1350, 0x8222 }, { 1354, 0x2417 }, { 1360, 0xc601 }, { 1365, 0x050a }, { 1369, 0x8a3c }, { 1376, 0x0881 }, { 1379, 0x0315 }, { 1384, 0x4888 }, { 1388, 0x0301 }, { 1391, 0x0211 }, { 1394, 0x0300 }, /* 0x5e00 */ { 1396, 0x2081 }, { 1399, 0x8134 }, { 1404, 0x4101 }, { 1407, 0x4024 }, { 1410, 0x0a00 }, { 1412, 0x5943 }, { 1419, 0x7d00 }, { 1425, 0x0001 }, { 1426, 0x4801 }, { 1429, 0x0000 }, { 1429, 0x1534 }, { 1435, 0xe00a }, { 1440, 0x5840 }, { 1444, 0x5036 }, { 1450, 0x0820 }, { 1452, 0x0000 }, /* 0x5f00 */ { 1452, 0x41c4 }, { 1457, 0x3200 }, { 1460, 0x591e }, { 1468, 0xa851 }, { 1474, 0x20b1 }, { 1479, 0x0911 }, { 1483, 0x8099 }, { 1488, 0x6534 }, { 1495, 0xa200 }, { 1498, 0x3040 }, { 1501, 0x9894 }, { 1507, 0x0103 }, { 1510, 0x0b90 }, { 1515, 0x401f }, { 1521, 0xf706 }, { 1530, 0x144c }, /* 0x6000 */ { 1535, 0x2480 }, { 1538, 0x8598 }, { 1544, 0x2010 }, { 1546, 0x0028 }, { 1548, 0x1381 }, { 1553, 0x20d2 }, { 1558, 0x0082 }, { 1560, 0xc002 }, { 1563, 0x4544 }, { 1568, 0x612a }, { 1574, 0x0134 }, { 1578, 0x4883 }, { 1583, 0xcf14 }, { 1591, 0x6a30 }, { 1597, 0x0024 }, { 1599, 0x3124 }, /* 0x6100 */ { 1604, 0x1484 }, { 1608, 0x52df }, { 1618, 0x0c04 }, { 1621, 0x02e3 }, { 1627, 0x0262 }, { 1631, 0x4000 }, { 1632, 0x1001 }, { 1634, 0x9904 }, { 1639, 0x281b }, { 1645, 0xb18c }, { 1652, 0x2521 }, { 1657, 0x1300 }, { 1660, 0xc007 }, { 1665, 0xf020 }, { 1670, 0xb2a6 }, { 1678, 0x0000 }, /* 0x6200 */ { 1678, 0x009a }, { 1682, 0x1028 }, { 1685, 0x0a8d }, { 1691, 0x2200 }, { 1693, 0x105c }, { 1698, 0x1457 }, { 1705, 0xa010 }, { 1708, 0x2408 }, { 1711, 0xe000 }, { 1714, 0x0001 }, { 1715, 0x0140 }, { 1717, 0xc4c8 }, { 1723, 0x4010 }, { 1725, 0x0460 }, { 1728, 0x0400 }, { 1729, 0x3014 }, /* 0x6300 */ { 1733, 0x2c18 }, { 1738, 0x0149 }, { 1742, 0x2600 }, { 1745, 0x1260 }, { 1749, 0x4c5e }, { 1757, 0x091c }, { 1762, 0x3060 }, { 1766, 0xb132 }, { 1773, 0x0494 }, { 1777, 0x4631 }, { 1783, 0xe050 }, { 1788, 0x2000 }, { 1789, 0x4122 }, { 1793, 0x103a }, { 1798, 0x1421 }, { 1802, 0x032c }, /* 0x6400 */ { 1807, 0x0600 }, { 1809, 0x4115 }, { 1814, 0x8635 }, { 1821, 0xa021 }, { 1825, 0x8800 }, { 1827, 0xbc1e }, { 1836, 0x200b }, { 1840, 0x2818 }, { 1844, 0x80a0 }, { 1847, 0xab03 }, { 1854, 0x114a }, { 1859, 0xe008 }, { 1863, 0x5e10 }, { 1869, 0x00a3 }, { 1873, 0x2630 }, { 1878, 0x88a1 }, /* 0x6500 */ { 1883, 0x8712 }, { 1889, 0xca58 }, { 1896, 0x4244 }, { 1900, 0x3402 }, { 1904, 0x0288 }, { 1907, 0x8015 }, { 1911, 0x0881 }, { 1914, 0x2400 }, { 1916, 0x0422 }, { 1919, 0x2124 }, { 1923, 0x4049 }, { 1927, 0x801c }, { 1931, 0x4304 }, { 1935, 0x8151 }, { 1940, 0x0000 }, { 1940, 0xc235 }, /* 0x6600 */ { 1947, 0x2311 }, { 1952, 0x6066 }, { 1958, 0x5e5e }, { 1968, 0x028b }, { 1973, 0x5461 }, { 1979, 0x1b82 }, { 1985, 0x1c03 }, { 1990, 0xdba8 }, { 1999, 0x3801 }, { 2003, 0x9e05 }, { 2010, 0x2011 }, { 2013, 0x8826 }, { 2018, 0xd10d }, { 2025, 0x8810 }, { 2028, 0x5900 }, { 2032, 0x0c00 }, /* 0x6700 */ { 2034, 0x40a0 }, { 2037, 0x1208 }, { 2040, 0x0005 }, { 2042, 0x4008 }, { 2044, 0x11a0 }, { 2048, 0x2030 }, { 2051, 0x5040 }, { 2054, 0x0850 }, { 2057, 0xc012 }, { 2061, 0x0b4a }, { 2067, 0x0000 }, { 2067, 0x3827 }, { 2074, 0x032d }, { 2080, 0x1284 }, { 2084, 0x0042 }, { 2086, 0x02c5 }, /* 0x6800 */ { 2091, 0x0000 }, { 2091, 0xa210 }, { 2095, 0xb180 }, { 2100, 0x880b }, { 2105, 0x1430 }, { 2109, 0x09a4 }, { 2114, 0xc800 }, { 2117, 0x1e27 }, { 2125, 0x0154 }, { 2129, 0x1540 }, { 2133, 0x462a }, { 2139, 0x0804 }, { 2141, 0x9120 }, { 2145, 0x324b }, { 2152, 0x3d20 }, { 2158, 0x3863 }, /* 0x6900 */ { 2165, 0x0640 }, { 2168, 0x00cb }, { 2173, 0x0000 }, { 2173, 0x092a }, { 2178, 0x4224 }, { 2182, 0x0880 }, { 2184, 0x1378 }, { 2191, 0x8c07 }, { 2197, 0x2001 }, { 2199, 0x0144 }, { 2202, 0xa962 }, { 2209, 0x1580 }, { 2213, 0x0120 }, { 2215, 0x00c2 }, { 2218, 0xc024 }, { 2222, 0x402a }, /* 0x6a00 */ { 2226, 0x800b }, { 2230, 0x2422 }, { 2234, 0x0111 }, { 2237, 0xc895 }, { 2244, 0x4660 }, { 2249, 0x0867 }, { 2255, 0x0490 }, { 2258, 0x400a }, { 2261, 0x0aca }, { 2267, 0xe802 }, { 2272, 0x8820 }, { 2275, 0xe013 }, { 2281, 0x1340 }, { 2285, 0x3071 }, { 2291, 0x1090 }, { 2294, 0x3007 }, /* 0x6b00 */ { 2299, 0x82cc }, { 2305, 0x4883 }, { 2310, 0x9910 }, { 2315, 0x8860 }, { 2319, 0x2440 }, { 2322, 0x2144 }, { 2326, 0x4881 }, { 2330, 0x6021 }, { 2334, 0x0024 }, { 2336, 0x8880 }, { 2339, 0x730d }, { 2347, 0x6301 }, { 2352, 0x1218 }, { 2356, 0x0440 }, { 2358, 0x40ca }, { 2363, 0x8282 }, /* 0x6c00 */ { 2367, 0x6234 }, { 2373, 0x8205 }, { 2377, 0x51c0 }, { 2382, 0x8c68 }, { 2388, 0xac00 }, { 2392, 0x1a14 }, { 2397, 0xa880 }, { 2401, 0x0b50 }, { 2406, 0x02e0 }, { 2410, 0x91b0 }, { 2416, 0x0000 }, { 2416, 0x0015 }, { 2419, 0xa044 }, { 2423, 0x1457 }, { 2430, 0x5a81 }, { 2436, 0x0014 }, /* 0x6d00 */ { 2438, 0xc490 }, { 2443, 0x040a }, { 2446, 0xc1c0 }, { 2451, 0x9202 }, { 2455, 0x0000 }, { 2455, 0xc080 }, { 2458, 0x80a2 }, { 2462, 0x1001 }, { 2464, 0x0084 }, { 2466, 0x01d6 }, { 2472, 0x1400 }, { 2474, 0xa290 }, { 2479, 0xc510 }, { 2484, 0xa840 }, { 2488, 0x8225 }, { 2493, 0x1051 }, /* 0x6e00 */ { 2497, 0x0011 }, { 2499, 0x4000 }, { 2500, 0x0084 }, { 2502, 0x1a44 }, { 2507, 0x8b30 }, { 2513, 0x709e }, { 2521, 0x010c }, { 2524, 0x2808 }, { 2527, 0x2000 }, { 2528, 0x0208 }, { 2530, 0x6081 }, { 2534, 0x880a }, { 2538, 0xe58b }, { 2547, 0x0000 }, { 2547, 0x6800 }, { 2550, 0x2a00 }, /* 0x6f00 */ { 2553, 0x3510 }, { 2558, 0x0d40 }, { 2562, 0xa640 }, { 2567, 0x1849 }, { 2572, 0x8000 }, { 2573, 0x668e }, { 2581, 0x1106 }, { 2585, 0x6000 }, { 2587, 0x3988 }, { 2593, 0x845d }, { 2600, 0xc1e1 }, { 2607, 0x1061 }, { 2611, 0x05a0 }, { 2615, 0x4400 }, { 2617, 0x0300 }, { 2619, 0x3221 }, /* 0x7000 */ { 2624, 0x20e1 }, { 2629, 0x0080 }, { 2630, 0x8009 }, { 2633, 0x1290 }, { 2637, 0x4f18 }, { 2644, 0x6030 }, { 2648, 0x5030 }, { 2652, 0x4060 }, { 2655, 0x0062 }, { 2658, 0x09f0 }, { 2664, 0x0810 }, { 2666, 0x0093 }, { 2670, 0x0400 }, { 2671, 0x117a }, { 2678, 0x0010 }, { 2679, 0x0400 }, /* 0x7100 */ { 2680, 0x98f8 }, { 2688, 0x4000 }, { 2689, 0xa801 }, { 2693, 0x0103 }, { 2696, 0x0ce2 }, { 2702, 0x5485 }, { 2708, 0x0101 }, { 2710, 0x0200 }, { 2711, 0x10a1 }, { 2715, 0x0c04 }, { 2718, 0x8005 }, { 2721, 0x840d }, { 2726, 0x1813 }, { 2731, 0x1648 }, { 2736, 0x0000 }, { 2736, 0x4100 }, /* 0x7200 */ { 2738, 0x0381 }, { 2742, 0xa488 }, { 2747, 0x8810 }, { 2750, 0x0310 }, { 2753, 0xc02e }, { 2759, 0x5469 }, { 2766, 0xc909 }, { 2772, 0x9982 }, { 2778, 0x6210 }, { 2782, 0x0808 }, { 2784, 0x6100 }, { 2787, 0x4012 }, { 2790, 0x1282 }, { 2794, 0x8160 }, { 2798, 0x0020 }, { 2799, 0x4c18 }, /* 0x7300 */ { 2804, 0x28b4 }, { 2810, 0x430c }, { 2815, 0x1194 }, { 2820, 0x2c26 }, { 2826, 0x2008 }, { 2828, 0xe145 }, { 2835, 0xdac1 }, { 2843, 0x1282 }, { 2847, 0x406b }, { 2853, 0xd1a9 }, { 2861, 0x2c65 }, { 2868, 0xb2a0 }, { 2874, 0x9a60 }, { 2880, 0x224c }, { 2885, 0x02ca }, { 2890, 0xaeb0 }, /* 0x7400 */ { 2898, 0x0493 }, { 2903, 0x0c02 }, { 2906, 0xff50 }, { 2916, 0x0203 }, { 2919, 0x28d9 }, { 2926, 0x2086 }, { 2930, 0x69c4 }, { 2937, 0x0006 }, { 2939, 0x82e3 }, { 2946, 0x9707 }, { 2954, 0xcf4b }, { 2964, 0x8a26 }, { 2970, 0x1300 }, { 2973, 0xcd09 }, { 2980, 0x8d10 }, { 2985, 0x9c10 }, /* 0x7500 */ { 2990, 0x0040 }, { 2991, 0x00c4 }, { 2994, 0x8693 }, { 3001, 0xe240 }, { 3006, 0x4189 }, { 3011, 0xc085 }, { 3016, 0x8002 }, { 3018, 0x7e02 }, { 3025, 0x0022 }, { 3027, 0x122d }, { 3033, 0x0014 }, { 3035, 0x8410 }, { 3038, 0xd053 }, { 3045, 0x9080 }, { 3048, 0xd093 }, { 3055, 0x0202 }, /* 0x7600 */ { 3057, 0x959d }, { 3066, 0x7a6c }, { 3075, 0x2268 }, { 3080, 0x172c }, { 3087, 0x0e3b }, { 3095, 0x8220 }, { 3098, 0xe030 }, { 3103, 0x0012 }, { 3105, 0x3022 }, { 3109, 0xb820 }, { 3114, 0x25fd }, { 3124, 0x2000 }, { 3125, 0x5a22 }, { 3131, 0x0210 }, { 3133, 0x1141 }, { 3137, 0x1243 }, /* 0x7700 */ { 3142, 0x4441 }, { 3146, 0x16b4 }, { 3153, 0xe104 }, { 3158, 0x6270 }, { 3164, 0xe464 }, { 3171, 0xd0c4 }, { 3177, 0x1495 }, { 3183, 0x241d }, { 3189, 0x3011 }, { 3193, 0x8470 }, { 3198, 0xc484 }, { 3203, 0x4022 }, { 3206, 0x0208 }, { 3208, 0xc226 }, { 3214, 0x1451 }, { 3219, 0x0913 }, /* 0x7800 */ { 3224, 0x6260 }, { 3229, 0x2002 }, { 3231, 0x600e }, { 3236, 0x00a1 }, { 3239, 0x5198 }, { 3245, 0x5004 }, { 3248, 0x451b }, { 3255, 0x4400 }, { 3257, 0x8400 }, { 3259, 0xe110 }, { 3264, 0x3112 }, { 3269, 0xa80f }, { 3276, 0x5380 }, { 3281, 0x886c }, { 3287, 0x0453 }, { 3292, 0x8ccc }, /* 0x7900 */ { 3299, 0x1041 }, { 3302, 0xd401 }, { 3307, 0x22a1 }, { 3312, 0xa832 }, { 3318, 0x8c70 }, { 3324, 0x1912 }, { 3329, 0x0a80 }, { 3332, 0x5a04 }, { 3337, 0x1800 }, { 3339, 0x197a }, { 3347, 0x8b02 }, { 3352, 0x0912 }, { 3356, 0x8594 }, { 3362, 0x6450 }, { 3367, 0x2c25 }, { 3373, 0x1102 }, /* 0x7a00 */ { 3376, 0x168c }, { 3382, 0x4822 }, { 3386, 0xa882 }, { 3391, 0x0731 }, { 3397, 0x11b0 }, { 3402, 0xb260 }, { 3408, 0x24a1 }, { 3413, 0x4120 }, { 3416, 0x0c65 }, { 3422, 0x4013 }, { 3426, 0x1009 }, { 3429, 0x1a28 }, { 3434, 0x5240 }, { 3438, 0x0802 }, { 3440, 0x1b00 }, { 3444, 0x6812 }, /* 0x7b00 */ { 3449, 0x0080 }, { 3450, 0x8010 }, { 3452, 0xee88 }, { 3460, 0xa013 }, { 3465, 0x4083 }, { 3469, 0x0020 }, { 3470, 0xa651 }, { 3477, 0x008c }, { 3480, 0x4210 }, { 3483, 0x4843 }, { 3488, 0x9021 }, { 3492, 0x3c65 }, { 3500, 0x0524 }, { 3504, 0x0ed0 }, { 3510, 0x0500 }, { 3512, 0x5734 }, /* 0x7c00 */ { 3520, 0xda5e }, { 3530, 0x0a00 }, { 3532, 0x1161 }, { 3537, 0x065a }, { 3543, 0x0440 }, { 3545, 0x7e2e }, { 3555, 0x628a }, { 3561, 0x3205 }, { 3566, 0x80c0 }, { 3569, 0x4010 }, { 3571, 0x0041 }, { 3573, 0x9cc1 }, { 3580, 0xa390 }, { 3586, 0x26b8 }, { 3593, 0x0a40 }, { 3596, 0x0020 }, /* 0x7d00 */ { 3597, 0x8388 }, { 3602, 0x604e }, { 3608, 0x2448 }, { 3612, 0x7002 }, { 3616, 0x2183 }, { 3621, 0x368a }, { 3628, 0x04a0 }, { 3631, 0x8d01 }, { 3636, 0x396e }, { 3645, 0x60c2 }, { 3650, 0x04c0 }, { 3653, 0x02c8 }, { 3657, 0x707c }, { 3665, 0x0280 }, { 3667, 0x2c64 }, { 3673, 0x0662 }, /* 0x7e00 */ { 3678, 0x0101 }, { 3680, 0x30a3 }, { 3686, 0xb181 }, { 3692, 0x8048 }, { 3695, 0x40b0 }, { 3699, 0x8105 }, { 3703, 0xc826 }, { 3709, 0x4108 }, { 3712, 0x24c2 }, { 3717, 0x6522 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, /* 0x7f00 */ { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0x0000 }, { 3723, 0xf800 }, { 3728, 0x8098 }, { 3732, 0x380c }, { 3737, 0x207a }, { 3743, 0xe002 }, { 3747, 0xa801 }, { 3751, 0x10c3 }, { 3756, 0x2446 }, { 3761, 0x9010 }, { 3764, 0xc109 }, { 3769, 0x8800 }, { 3771, 0xd128 }, { 3777, 0xe404 }, /* 0x8000 */ { 3782, 0xe580 }, { 3788, 0xe05a }, { 3795, 0x5051 }, { 3800, 0x56b1 }, { 3808, 0x0011 }, { 3810, 0x0000 }, { 3810, 0x2051 }, { 3814, 0x0022 }, { 3816, 0x4102 }, { 3819, 0x5000 }, { 3821, 0x08c0 }, { 3824, 0x0300 }, { 3826, 0xa100 }, { 3829, 0x01b4 }, { 3834, 0x6001 }, { 3837, 0x464d }, /* 0x8100 */ { 3844, 0x0808 }, { 3846, 0x51c0 }, { 3851, 0x1091 }, { 3855, 0x1421 }, { 3859, 0x14a0 }, { 3863, 0x0084 }, { 3865, 0xa383 }, { 3872, 0x0080 }, { 3873, 0x4872 }, { 3879, 0x4941 }, { 3884, 0x4004 }, { 3886, 0x0814 }, { 3889, 0xcc28 }, { 3895, 0x68a0 }, { 3900, 0x1812 }, { 3904, 0xa367 }, /* 0x8200 */ { 3913, 0x8009 }, { 3916, 0x2618 }, { 3921, 0x0106 }, { 3924, 0x0414 }, { 3927, 0xc878 }, { 3934, 0x1042 }, { 3937, 0x2089 }, { 3941, 0xa810 }, { 3945, 0x469b }, { 3953, 0x0d52 }, { 3959, 0x479b }, { 3968, 0xd495 }, { 3976, 0x0040 }, { 3977, 0x0421 }, { 3980, 0xa515 }, { 3987, 0x60c0 }, /* 0x8300 */ { 3991, 0x0d83 }, { 3997, 0xe800 }, { 4001, 0x7006 }, { 4006, 0x3489 }, { 4012, 0x609c }, { 4018, 0x00fa }, { 4024, 0x0000 }, { 4024, 0xa101 }, { 4028, 0x2055 }, { 4033, 0x3b34 }, { 4041, 0x32c0 }, { 4046, 0xc000 }, { 4048, 0x8281 }, { 4052, 0x2013 }, { 4056, 0x0500 }, { 4058, 0x1340 }, /* 0x8400 */ { 4062, 0x8442 }, { 4066, 0x0222 }, { 4069, 0x8000 }, { 4070, 0x0200 }, { 4071, 0xa5a0 }, { 4077, 0x1746 }, { 4084, 0x04b1 }, { 4089, 0x3159 }, { 4096, 0x0022 }, { 4098, 0x402c }, { 4102, 0x8740 }, { 4107, 0x6412 }, { 4112, 0x9185 }, { 4118, 0x1008 }, { 4120, 0x8480 }, { 4123, 0x2c87 }, /* 0x8500 */ { 4130, 0x508c }, { 4135, 0x5001 }, { 4138, 0x8cbc }, { 4146, 0x805c }, { 4151, 0x8040 }, { 4153, 0xf24f }, { 4163, 0x8817 }, { 4169, 0xae00 }, { 4174, 0x9a62 }, { 4181, 0xa108 }, { 4185, 0x20a5 }, { 4190, 0xf1d0 }, { 4198, 0x4c84 }, { 4203, 0x8500 }, { 4206, 0x2141 }, { 4210, 0x9048 }, /* 0x8600 */ { 4214, 0x6031 }, { 4219, 0x4b07 }, { 4226, 0x0282 }, { 4229, 0x3540 }, { 4234, 0x0047 }, { 4238, 0x23cc }, { 4245, 0x921f }, { 4253, 0x04e0 }, { 4257, 0x2100 }, { 4259, 0x1542 }, { 4264, 0x21c2 }, { 4269, 0x83ba }, { 4277, 0x002b }, { 4281, 0x14a6 }, { 4287, 0x00a9 }, { 4291, 0x3400 }, /* 0x8700 */ { 4294, 0xc8b0 }, { 4300, 0xc219 }, { 4306, 0xc10a }, { 4311, 0x7606 }, { 4318, 0x2029 }, { 4322, 0x2100 }, { 4324, 0x8032 }, { 4328, 0x0806 }, { 4331, 0x1bf8 }, { 4340, 0x43a9 }, { 4347, 0x7089 }, { 4353, 0xc022 }, { 4357, 0x4702 }, { 4362, 0x9660 }, { 4368, 0x2c1c }, { 4374, 0x850a }, /* 0x8800 */ { 4379, 0x0e4a }, { 4385, 0xdf1d }, { 4396, 0x6100 }, { 4399, 0x1425 }, { 4404, 0x4f2a }, { 4412, 0x9562 }, { 4419, 0x0211 }, { 4422, 0x0a02 }, { 4425, 0x0001 }, { 4426, 0x9d00 }, { 4431, 0x0501 }, { 4434, 0x6400 }, { 4437, 0x7c01 }, { 4443, 0x480e }, { 4448, 0x8080 }, { 4450, 0x00a3 }, /* 0x8900 */ { 4454, 0xe042 }, { 4459, 0x1760 }, { 4465, 0x01c1 }, { 4469, 0x4627 }, { 4476, 0x8265 }, { 4482, 0x1c84 }, { 4487, 0x480e }, { 4492, 0x3c29 }, { 4499, 0x2200 }, { 4501, 0x9831 }, { 4507, 0x0021 }, { 4509, 0x10f1 }, { 4515, 0x0000 }, { 4515, 0x01f0 }, { 4520, 0x2a20 }, { 4524, 0xa24a }, /* 0x8a00 */ { 4530, 0x80b0 }, { 4534, 0x4036 }, { 4539, 0x9855 }, { 4546, 0x60a0 }, { 4550, 0x62a9 }, { 4557, 0x31c8 }, { 4563, 0x00a2 }, { 4566, 0xcee0 }, { 4574, 0x8849 }, { 4579, 0x82c5 }, { 4585, 0xc280 }, { 4589, 0x48c8 }, { 4594, 0x0748 }, { 4599, 0xa0ba }, { 4606, 0x1000 }, { 4607, 0x9071 }, /* 0x8b00 */ { 4613, 0x0c60 }, { 4617, 0xd002 }, { 4621, 0x2000 }, { 4622, 0x1081 }, { 4625, 0x217c }, { 4632, 0x421c }, { 4637, 0x2008 }, { 4639, 0x5340 }, { 4644, 0xa832 }, { 4650, 0xd030 }, { 4655, 0x0000 }, { 4655, 0x0000 }, { 4655, 0x0000 }, { 4655, 0x0000 }, { 4655, 0x0000 }, { 4655, 0x0000 }, /* 0x8c00 */ { 4655, 0x0000 }, { 4655, 0x0000 }, { 4655, 0x0000 }, { 4655, 0x6300 }, { 4659, 0x8aa0 }, { 4664, 0x2b9a }, { 4672, 0x2358 }, { 4678, 0x4868 }, { 4683, 0x08c0 }, { 4686, 0x1a0d }, { 4692, 0x0010 }, { 4693, 0x0600 }, { 4695, 0x8a60 }, { 4700, 0x2260 }, { 4704, 0x9102 }, { 4708, 0xc1a5 }, /* 0x8d00 */ { 4715, 0x020a }, { 4718, 0x0884 }, { 4721, 0x0000 }, { 4721, 0x0000 }, { 4721, 0x0000 }, { 4721, 0x0000 }, { 4721, 0x5220 }, { 4725, 0x8000 }, { 4726, 0x2114 }, { 4730, 0xc023 }, { 4735, 0x9841 }, { 4740, 0x1aa4 }, { 4746, 0x45e1 }, { 4753, 0x02b2 }, { 4758, 0x10b0 }, { 4762, 0x2017 }, /* 0x8e00 */ { 4767, 0x0872 }, { 4772, 0x0052 }, { 4775, 0x00cf }, { 4781, 0x23ca }, { 4788, 0xe803 }, { 4794, 0x7810 }, { 4799, 0xb206 }, { 4805, 0x0e03 }, { 4810, 0x020c }, { 4813, 0x6c25 }, { 4820, 0x6284 }, { 4825, 0x0c28 }, { 4829, 0x809b }, { 4835, 0x1012 }, { 4838, 0x6100 }, { 4841, 0x0683 }, /* 0x8f00 */ { 4846, 0x8185 }, { 4851, 0x41c1 }, { 4856, 0x71ab }, { 4865, 0x04f0 }, { 4870, 0x808b }, { 4875, 0x613e }, { 4883, 0x0020 }, { 4884, 0x0000 }, { 4884, 0x0000 }, { 4884, 0x2000 }, { 4885, 0x0073 }, { 4890, 0x4160 }, { 4894, 0x2c43 }, { 4900, 0x002d }, { 4904, 0x4119 }, { 4909, 0x4862 }, /* 0x9000 */ { 4914, 0x1114 }, { 4918, 0x0900 }, { 4920, 0xb700 }, { 4926, 0x8098 }, { 4930, 0x1018 }, { 4933, 0x2800 }, { 4935, 0x10c4 }, { 4939, 0x0211 }, { 4942, 0x5920 }, { 4947, 0x0ba1 }, { 4953, 0x0027 }, { 4957, 0x605d }, { 4964, 0x11b8 }, { 4970, 0xb3a4 }, { 4978, 0x8820 }, { 4981, 0xc051 }, /* 0x9100 */ { 4986, 0x2171 }, { 4992, 0x55d1 }, { 5000, 0xc2ad }, { 5008, 0x36d2 }, { 5016, 0x8188 }, { 5020, 0x0e88 }, { 5025, 0x2092 }, { 5029, 0x0e10 }, { 5033, 0x446a }, { 5039, 0x413a }, { 5045, 0x7142 }, { 5051, 0xb84f }, { 5060, 0x002c }, { 5063, 0x4698 }, { 5069, 0xf630 }, { 5077, 0x2a83 }, /* 0x9200 */ { 5083, 0x16f3 }, { 5092, 0x314d }, { 5099, 0xc178 }, { 5106, 0x5769 }, { 5115, 0xe4cd }, { 5124, 0x3302 }, { 5129, 0xc3a3 }, { 5137, 0xbbe1 }, { 5147, 0x6700 }, { 5152, 0x8284 }, { 5156, 0x89b1 }, { 5163, 0xbd44 }, { 5171, 0x79ef }, { 5183, 0xb3a9 }, { 5192, 0x51ab }, { 5200, 0x8a01 }, /* 0x9300 */ { 5204, 0x2105 }, { 5208, 0xf032 }, { 5215, 0x06b2 }, { 5221, 0x00d8 }, { 5225, 0x0380 }, { 5228, 0x45a7 }, { 5236, 0xa6b0 }, { 5243, 0xa45b }, { 5251, 0xad07 }, { 5259, 0x4924 }, { 5264, 0x0b5a }, { 5271, 0x0470 }, { 5275, 0x3ef2 }, { 5285, 0xd208 }, { 5290, 0x00c4 }, { 5293, 0x2f80 }, /* 0x9400 */ { 5299, 0xe316 }, { 5307, 0x80e0 }, { 5311, 0xc000 }, { 5313, 0xa81e }, { 5320, 0x1528 }, { 5325, 0x9220 }, { 5329, 0xe90a }, { 5336, 0x0006 }, { 5338, 0x0018 }, { 5340, 0x0000 }, { 5340, 0x0000 }, { 5340, 0x0000 }, { 5340, 0x0000 }, { 5340, 0x0000 }, { 5340, 0x0000 }, { 5340, 0x0000 }, /* 0x9500 */ { 5340, 0x0000 }, { 5340, 0x0000 }, { 5340, 0x0000 }, { 5340, 0x0000 }, { 5340, 0x0000 }, { 5340, 0x0000 }, { 5340, 0x0000 }, { 5340, 0x4300 }, { 5343, 0x7110 }, { 5348, 0xe000 }, { 5351, 0x1a42 }, { 5356, 0xa450 }, { 5361, 0x0b40 }, { 5365, 0xe60f }, { 5374, 0x0051 }, { 5377, 0x0000 }, /* 0x9600 */ { 5377, 0x0000 }, { 5377, 0x6000 }, { 5379, 0x1074 }, { 5384, 0x378a }, { 5392, 0x0002 }, { 5393, 0x01d4 }, { 5398, 0x4002 }, { 5400, 0xd810 }, { 5405, 0x021e }, { 5410, 0xa442 }, { 5415, 0xc270 }, { 5421, 0x0408 }, { 5423, 0x0400 }, { 5424, 0xe504 }, { 5430, 0x8200 }, { 5432, 0x0402 }, /* 0x9700 */ { 5434, 0x022c }, { 5438, 0x2c00 }, { 5441, 0x010e }, { 5445, 0x000a }, { 5447, 0xc40a }, { 5452, 0x0da0 }, { 5457, 0x4488 }, { 5461, 0xa9c8 }, { 5468, 0x0201 }, { 5470, 0xc6e0 }, { 5477, 0x5004 }, { 5480, 0xd766 }, { 5490, 0x76b2 }, { 5499, 0x6b93 }, { 5508, 0x8013 }, { 5512, 0x0592 }, /* 0x9800 */ { 5517, 0x6480 }, { 5521, 0x5250 }, { 5526, 0xc869 }, { 5533, 0x402d }, { 5538, 0x0490 }, { 5541, 0x06ce }, { 5548, 0x146c }, { 5554, 0x0000 }, { 5554, 0x0000 }, { 5554, 0x0000 }, { 5554, 0x6800 }, { 5557, 0x8d91 }, { 5564, 0x1124 }, { 5568, 0x0000 }, { 5568, 0x04ea }, { 5574, 0x0048 }, /* 0x9900 */ { 5576, 0x0184 }, { 5579, 0x9ce2 }, { 5587, 0x08c4 }, { 5591, 0x1e3e }, { 5600, 0x61c3 }, { 5607, 0xdb10 }, { 5614, 0x0001 }, { 5615, 0x0000 }, { 5615, 0x0000 }, { 5615, 0xa800 }, { 5618, 0x0040 }, { 5619, 0xa627 }, { 5627, 0x0208 }, { 5629, 0x5618 }, { 5635, 0x1c80 }, { 5639, 0x6231 }, /* 0x9a00 */ { 5645, 0x181c }, { 5650, 0x4043 }, { 5654, 0x609d }, { 5661, 0x0168 }, { 5665, 0x5c92 }, { 5672, 0x2052 }, { 5676, 0x0000 }, { 5676, 0x0000 }, { 5676, 0x0000 }, { 5676, 0x0000 }, { 5676, 0xd400 }, { 5680, 0xca74 }, { 5688, 0x414a }, { 5693, 0x18e5 }, { 5700, 0x12b1 }, { 5706, 0xa62c }, /* 0x9b00 */ { 5713, 0x7b3f }, { 5725, 0x1a45 }, { 5731, 0x2841 }, { 5735, 0x26b8 }, { 5742, 0x1900 }, { 5745, 0x48e0 }, { 5750, 0x7d6a }, { 5760, 0x83a8 }, { 5766, 0xaef1 }, { 5776, 0x6411 }, { 5781, 0x12c0 }, { 5785, 0xd987 }, { 5794, 0x4182 }, { 5798, 0xa181 }, { 5803, 0x8ca0 }, { 5808, 0xa788 }, /* 0x9c00 */ { 5815, 0x8805 }, { 5819, 0x5742 }, { 5826, 0x07cc }, { 5833, 0x20e2 }, { 5838, 0xc63a }, { 5846, 0xf959 }, { 5856, 0x4f08 }, { 5862, 0x08a5 }, { 5867, 0x0000 }, { 5867, 0x0000 }, { 5867, 0x0000 }, { 5867, 0x0000 }, { 5867, 0x0000 }, { 5867, 0x0000 }, { 5867, 0x0040 }, { 5868, 0x0284 }, /* 0x9d00 */ { 5871, 0x0804 }, { 5873, 0x7182 }, { 5879, 0x8000 }, { 5880, 0x341d }, { 5887, 0x04ac }, { 5892, 0x8018 }, { 5895, 0x0e2c }, { 5901, 0x58c1 }, { 5907, 0x6458 }, { 5913, 0x01ec }, { 5919, 0x5402 }, { 5923, 0x9222 }, { 5928, 0x0688 }, { 5932, 0xc4f0 }, { 5939, 0x4aa1 }, { 5945, 0x4019 }, /* 0x9e00 */ { 5949, 0x4484 }, { 5953, 0x3267 }, { 5961, 0x0000 }, { 5961, 0x0000 }, { 5961, 0x0000 }, { 5961, 0x0000 }, { 5961, 0x0000 }, { 5961, 0x1c00 }, { 5964, 0xc0bd }, { 5972, 0x4940 }, { 5976, 0xd110 }, { 5981, 0x0039 }, { 5985, 0x0940 }, { 5988, 0x8020 }, { 5990, 0x7090 }, { 5995, 0x8127 }, /* 0x9f00 */ { 6001, 0x820c }, { 6005, 0x8ed7 }, { 6015, 0x8c44 }, { 6020, 0xb696 }, { 6029, 0x00fa }, { 6035, 0x65e8 }, { 6043, 0xe300 }, { 6048, 0x242b }, { 6054, 0x8000 }, { 6055, 0x40d7 }, { 6062, 0x002e }, }; static const Summary16 jisx0212_uni2indx_pageff[6] = { /* 0xff00 */ { 6066, 0x0000 }, { 6066, 0x0000 }, { 6066, 0x0000 }, { 6066, 0x0000 }, { 6066, 0x0000 }, { 6066, 0x4000 }, }; static int jisx0212_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc >= 0x0000 && wc < 0x0460) summary = &jisx0212_uni2indx_page00[(wc>>4)]; else if (wc >= 0x2100 && wc < 0x2130) summary = &jisx0212_uni2indx_page21[(wc>>4)-0x210]; else if (wc >= 0x4e00 && wc < 0x9fb0) summary = &jisx0212_uni2indx_page4e[(wc>>4)-0x4e0]; else if (wc >= 0xff00 && wc < 0xff60) summary = &jisx0212_uni2indx_pageff[(wc>>4)-0xff0]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' 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); c = jisx0212_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/jisx0213.h000066400000000000000000010463621252300335000243750ustar00rootroot00000000000000/* * Copyright (C) 1999-2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * JISX0213:2000 */ #ifndef _JISX0213_H #define _JISX0213_H /* JISX0213 plane 1 (= ISO-IR-233) characters are in the range 0x{21..7E}{21..7E}. JISX0213 plane 2 (= ISO-IR-229) characters are in the range 0x{21,23..25,28,2C..2F,6E..7E}{21..7E}. Together this makes 120 rows of 94 characters. */ static const unsigned short jisx0213_to_ucs_combining[][2] = { { 0x304b, 0x309a }, { 0x304d, 0x309a }, { 0x304f, 0x309a }, { 0x3051, 0x309a }, { 0x3053, 0x309a }, { 0x30ab, 0x309a }, { 0x30ad, 0x309a }, { 0x30af, 0x309a }, { 0x30b1, 0x309a }, { 0x30b3, 0x309a }, { 0x30bb, 0x309a }, { 0x30c4, 0x309a }, { 0x30c8, 0x309a }, { 0x31f7, 0x309a }, { 0x00e6, 0x0300 }, { 0x0254, 0x0300 }, { 0x0254, 0x0301 }, { 0x028c, 0x0300 }, { 0x028c, 0x0301 }, { 0x0259, 0x0300 }, { 0x0259, 0x0301 }, { 0x025a, 0x0300 }, { 0x025a, 0x0301 }, { 0x02e9, 0x02e5 }, { 0x02e5, 0x02e9 }, }; static const unsigned short jisx0213_to_ucs_main[120 * 94] = { /* 0x12121..0x1217E */ 0x1000, 0x1001, 0x1002, 0x830c, 0x830e, 0x10fb, 0x831a, 0x831b, 0x831f, 0x8301, 0x109b, 0x109c, 0x00b4, 0x8340, 0x00a8, 0x833e, 0x83e3, 0x833f, 0x10fd, 0x10fe, 0x109d, 0x109e, 0x1003, 0x2edd, 0x1005, 0x1006, 0x1007, 0x10fc, 0x0714, 0x0710, 0x830f, 0x833c, 0x101c, 0x0716, 0x835c, 0x0726, 0x0725, 0x0718, 0x0719, 0x071c, 0x071d, 0x8308, 0x8309, 0x1014, 0x1015, 0x833b, 0x833d, 0x835b, 0x835d, 0x1008, 0x1009, 0x100a, 0x100b, 0x100c, 0x100d, 0x100e, 0x100f, 0x1010, 0x1011, 0x830b, 0x0912, 0x00b1, 0x00d7, 0x00f7, 0x831d, 0x0960, 0x831c, 0x831e, 0x0966, 0x0967, 0x091e, 0x0934, 0x0d42, 0x0d40, 0x00b0, 0x0732, 0x0733, 0x0803, 0x83e5, 0x8304, 0x00a2, 0x00a3, 0x8305, 0x8303, 0x8306, 0x830a, 0x8320, 0x00a7, 0x0d06, 0x0d05, 0x0ccb, 0x0ccf, 0x0cce, 0x0cc7, /* 0x12221..0x1227E */ 0x0cc6, 0x0ca1, 0x0ca0, 0x0cb3, 0x0cb2, 0x0cbd, 0x0cbc, 0x073b, 0x1012, 0x0892, 0x0890, 0x0891, 0x0893, 0x1013, 0x8307, 0x8302, 0x830d, 0x835e, 0x1033, 0x1034, 0x1035, 0x103b, 0x103c, 0x10ff, 0x109f, 0x0908, 0x090b, 0x0986, 0x0987, 0x0982, 0x0983, 0x092a, 0x0929, 0x0984, 0x0985, 0x098a, 0x098b, 0x0909, 0x0905, 0x0a05, 0x0a06, 0x0927, 0x0928, 0x00ac, 0x08d2, 0x08d4, 0x0900, 0x0903, 0x0995, 0x0996, 0x0997, 0x0925, 0x0926, 0x835f, 0x8360, 0x1018, 0x1019, 0x1016, 0x1017, 0x0920, 0x09a5, 0x0a12, 0x0902, 0x0907, 0x0961, 0x0952, 0x096a, 0x096b, 0x091a, 0x093d, 0x091d, 0x0935, 0x092b, 0x092c, 0x0962, 0x0943, 0x0945, 0x0948, 0x0976, 0x0977, 0x0894, 0x082b, 0x0730, 0x0d6f, 0x0d6d, 0x0d6a, 0x0720, 0x0721, 0x00b6, 0x0d6e, 0x0d6b, 0x0d6c, 0x0d69, 0x0cef, /* 0x12321..0x1237E */ 0x0cb7, 0x0cb6, 0x0cc1, 0x0cc0, 0x0897, 0x0898, 0x0896, 0x0899, 0x08c4, 0x08e8, 0x08e6, 0x08e7, 0x08e9, 0x0f34, 0x0f35, 0x8310, 0x8311, 0x8312, 0x8313, 0x8314, 0x8315, 0x8316, 0x8317, 0x8318, 0x8319, 0x0fbf, 0x0cc9, 0x103d, 0x8246, 0x8245, 0x0ce6, 0x0722, 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, 0x8326, 0x8327, 0x8328, 0x8329, 0x832a, 0x832b, 0x832c, 0x832d, 0x832e, 0x832f, 0x8330, 0x8331, 0x8332, 0x8333, 0x8334, 0x8335, 0x8336, 0x8337, 0x8338, 0x8339, 0x833a, 0x0913, 0x0835, 0x080f, 0x13cb, 0x0813, 0x0827, 0x8341, 0x8342, 0x8343, 0x8344, 0x8345, 0x8346, 0x8347, 0x8348, 0x8349, 0x834a, 0x834b, 0x834c, 0x834d, 0x834e, 0x834f, 0x8350, 0x8351, 0x8352, 0x8353, 0x8354, 0x8355, 0x8356, 0x8357, 0x8358, 0x8359, 0x835a, 0x10a0, 0x0713, 0x0ffa, 0x0ffb, /* 0x12421..0x1247E */ 0x1041, 0x1042, 0x1043, 0x1044, 0x1045, 0x1046, 0x1047, 0x1048, 0x1049, 0x104a, 0x104b, 0x104c, 0x104d, 0x104e, 0x104f, 0x1050, 0x1051, 0x1052, 0x1053, 0x1054, 0x1055, 0x1056, 0x1057, 0x1058, 0x1059, 0x105a, 0x105b, 0x105c, 0x105d, 0x105e, 0x105f, 0x1060, 0x1061, 0x1062, 0x1063, 0x1064, 0x1065, 0x1066, 0x1067, 0x1068, 0x1069, 0x106a, 0x106b, 0x106c, 0x106d, 0x106e, 0x106f, 0x1070, 0x1071, 0x1072, 0x1073, 0x1074, 0x1075, 0x1076, 0x1077, 0x1078, 0x1079, 0x107a, 0x107b, 0x107c, 0x107d, 0x107e, 0x107f, 0x1080, 0x1081, 0x1082, 0x1083, 0x1084, 0x1085, 0x1086, 0x1087, 0x1088, 0x1089, 0x108a, 0x108b, 0x108c, 0x108d, 0x108e, 0x108f, 0x1090, 0x1091, 0x1092, 0x1093, 0x1094, 0x1095, 0x1096, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0000, 0x0000, 0x0000, /* 0x12521..0x1257E */ 0x10a1, 0x10a2, 0x10a3, 0x10a4, 0x10a5, 0x10a6, 0x10a7, 0x10a8, 0x10a9, 0x10aa, 0x10ab, 0x10ac, 0x10ad, 0x10ae, 0x10af, 0x10b0, 0x10b1, 0x10b2, 0x10b3, 0x10b4, 0x10b5, 0x10b6, 0x10b7, 0x10b8, 0x10b9, 0x10ba, 0x10bb, 0x10bc, 0x10bd, 0x10be, 0x10bf, 0x10c0, 0x10c1, 0x10c2, 0x10c3, 0x10c4, 0x10c5, 0x10c6, 0x10c7, 0x10c8, 0x10c9, 0x10ca, 0x10cb, 0x10cc, 0x10cd, 0x10ce, 0x10cf, 0x10d0, 0x10d1, 0x10d2, 0x10d3, 0x10d4, 0x10d5, 0x10d6, 0x10d7, 0x10d8, 0x10d9, 0x10da, 0x10db, 0x10dc, 0x10dd, 0x10de, 0x10df, 0x10e0, 0x10e1, 0x10e2, 0x10e3, 0x10e4, 0x10e5, 0x10e6, 0x10e7, 0x10e8, 0x10e9, 0x10ea, 0x10eb, 0x10ec, 0x10ed, 0x10ee, 0x10ef, 0x10f0, 0x10f1, 0x10f2, 0x10f3, 0x10f4, 0x10f5, 0x10f6, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, /* 0x12621..0x1267E */ 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x0d64, 0x0d60, 0x0d62, 0x0d66, 0x0d61, 0x0d65, 0x0d67, 0x0d63, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03c2, 0x0bf5, 0x0bf6, 0x0bf7, 0x0bf8, 0x0bf9, 0x0bfa, 0x0bfb, 0x0bfc, 0x0bfd, 0x0bfe, 0x0d16, 0x0d17, 0x1020, 0x0d0e, 0x0d00, 0x0d01, 0x0d02, 0x0d03, 0x0d68, 0x0cb1, 0x11f0, 0x11f1, 0x11f2, 0x11f3, 0x11f4, 0x11f5, 0x11f6, 0x11f7, 0x11f8, 0x11f9, 0x000e, 0x11fa, 0x11fb, 0x11fc, 0x11fd, 0x11fe, 0x11ff, /* 0x12721..0x1277E */ 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, 0x0abe, 0x0abf, 0x0ac0, 0x0ac1, 0x0ac2, 0x0ac3, 0x0ac4, 0x0ac5, 0x0ac6, 0x0ac7, 0x0ac8, 0x0ac9, 0x0aca, 0x0acb, 0x0acc, 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, 0x10f7, 0x10f8, 0x10f9, 0x10fa, 0x09da, 0x09db, 0x0853, 0x0854, 0x0855, 0x0e13, 0x0a18, 0x0b23, 0x0ace, /* 0x12821..0x1287E */ 0x0c00, 0x0c02, 0x0c0c, 0x0c10, 0x0c18, 0x0c14, 0x0c1c, 0x0c2c, 0x0c24, 0x0c34, 0x0c3c, 0x0c01, 0x0c03, 0x0c0f, 0x0c13, 0x0c1b, 0x0c17, 0x0c23, 0x0c33, 0x0c2b, 0x0c3b, 0x0c4b, 0x0c20, 0x0c2f, 0x0c28, 0x0c37, 0x0c3f, 0x0c1d, 0x0c30, 0x0c25, 0x0c38, 0x0c42, 0x1251, 0x1252, 0x1253, 0x1254, 0x1255, 0x1256, 0x1257, 0x1258, 0x1259, 0x125a, 0x125b, 0x125c, 0x125d, 0x125e, 0x125f, 0x12b1, 0x12b2, 0x12b3, 0x12b4, 0x12b5, 0x12b6, 0x12b7, 0x12b8, 0x12b9, 0x12ba, 0x12bb, 0x12bc, 0x12bd, 0x12be, 0x12bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0cd0, 0x0cd1, 0x0cd2, 0x0cd3, 0x073c, 0x0747, 0x0748, 0x0749, 0x01cd, 0x01ce, 0x01d0, 0x053e, 0x053f, 0x01f8, 0x01f9, 0x01d1, 0x01d2, 0x01d4, 0x01d6, 0x01d8, 0x01da, 0x01dc, 0x0000, 0x0000, /* 0x12921..0x1297E */ 0x07ac, 0x00a0, 0x00a1, 0x00a4, 0x00a6, 0x00a9, 0x00aa, 0x00ab, 0x00ad, 0x00ae, 0x00af, 0x00b2, 0x00b3, 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, 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, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff, 0x0100, 0x012a, 0x016a, 0x0112, 0x014c, 0x0101, 0x012b, 0x016b, 0x0113, 0x014d, /* 0x12A21..0x12A7E */ 0x0104, 0x02d8, 0x0141, 0x013d, 0x015a, 0x0160, 0x015e, 0x0164, 0x0179, 0x017d, 0x017b, 0x0105, 0x02db, 0x0142, 0x013e, 0x015b, 0x02c7, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, 0x0154, 0x0102, 0x0139, 0x0106, 0x010c, 0x0118, 0x011a, 0x010e, 0x0143, 0x0147, 0x0150, 0x0158, 0x016e, 0x0170, 0x0162, 0x0155, 0x0103, 0x013a, 0x0107, 0x010d, 0x0119, 0x011b, 0x010f, 0x0111, 0x0144, 0x0148, 0x0151, 0x0159, 0x016f, 0x0171, 0x0163, 0x02d9, 0x0108, 0x011c, 0x0124, 0x0134, 0x015c, 0x016c, 0x0109, 0x011d, 0x0125, 0x0135, 0x015d, 0x016d, 0x0271, 0x028b, 0x027e, 0x0283, 0x0292, 0x026c, 0x026e, 0x0279, 0x0288, 0x0256, 0x0273, 0x027d, 0x0282, 0x0290, 0x027b, 0x026d, 0x025f, 0x0272, 0x029d, 0x028e, 0x0261, 0x014b, 0x0270, 0x0281, 0x0127, 0x0295, /* 0x12B21..0x12B7E */ 0x0294, 0x0266, 0x0298, 0x01c2, 0x0253, 0x0257, 0x0284, 0x0260, 0x0193, 0x0153, 0x0152, 0x0268, 0x0289, 0x0258, 0x0275, 0x0259, 0x025c, 0x025e, 0x0250, 0x026f, 0x028a, 0x0264, 0x028c, 0x0254, 0x0251, 0x0252, 0x028d, 0x0265, 0x02a2, 0x02a1, 0x0255, 0x0291, 0x027a, 0x0267, 0x025a, 0x000f, 0x01fd, 0x0670, 0x0671, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0672, 0x0673, 0x0361, 0x02c8, 0x02cc, 0x02d0, 0x02d1, 0x0306, 0x073f, 0x030b, 0x0301, 0x0304, 0x0300, 0x030f, 0x030c, 0x0302, 0x02e5, 0x02e6, 0x02e7, 0x02e8, 0x02e9, 0x0018, 0x0019, 0x0325, 0x032c, 0x0339, 0x031c, 0x031f, 0x0320, 0x0308, 0x033d, 0x0329, 0x032f, 0x02de, 0x0324, 0x0330, 0x033c, 0x0334, 0x031d, 0x031e, 0x0318, 0x0319, 0x032a, 0x033a, 0x033b, 0x0303, 0x031a, /* 0x12C21..0x12C7E */ 0x0e76, 0x0e77, 0x0e78, 0x0e79, 0x0e7a, 0x0e7b, 0x0e7c, 0x0e7d, 0x0e7e, 0x0e7f, 0x0beb, 0x0bec, 0x0bed, 0x0bee, 0x0bef, 0x0bf0, 0x0bf1, 0x0bf2, 0x0bf3, 0x0bf4, 0x0870, 0x0871, 0x0872, 0x0873, 0x0874, 0x0875, 0x0876, 0x0877, 0x0878, 0x0879, 0x087a, 0x087b, 0x0bd0, 0x0bd1, 0x0bd2, 0x0bd3, 0x0bd4, 0x0bd5, 0x0bd6, 0x0bd7, 0x0bd8, 0x0bd9, 0x0bda, 0x0bdb, 0x0bdc, 0x0bdd, 0x0bde, 0x0bdf, 0x0be0, 0x0be1, 0x0be2, 0x0be3, 0x0be4, 0x0be5, 0x0be6, 0x0be7, 0x0be8, 0x0be9, 0x12d0, 0x12d1, 0x12d2, 0x12d3, 0x12d4, 0x12d5, 0x12d6, 0x12d7, 0x12d8, 0x12d9, 0x12da, 0x12db, 0x12dc, 0x12dd, 0x12de, 0x12df, 0x12e0, 0x12e1, 0x12e2, 0x12e3, 0x12fa, 0x12e9, 0x12e5, 0x12ed, 0x12ec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0751, 0x0742, /* 0x12D21..0x12D7E */ 0x0b60, 0x0b61, 0x0b62, 0x0b63, 0x0b64, 0x0b65, 0x0b66, 0x0b67, 0x0b68, 0x0b69, 0x0b6a, 0x0b6b, 0x0b6c, 0x0b6d, 0x0b6e, 0x0b6f, 0x0b70, 0x0b71, 0x0b72, 0x0b73, 0x0860, 0x0861, 0x0862, 0x0863, 0x0864, 0x0865, 0x0866, 0x0867, 0x0868, 0x0869, 0x086a, 0x1349, 0x1314, 0x1322, 0x134d, 0x1318, 0x1327, 0x1303, 0x1336, 0x1351, 0x1357, 0x130d, 0x1326, 0x1323, 0x132b, 0x134a, 0x133b, 0x139c, 0x139d, 0x139e, 0x138e, 0x138f, 0x13c4, 0x13a1, 0x086b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x137b, 0x101d, 0x101f, 0x0816, 0x13cd, 0x0821, 0x12a4, 0x12a5, 0x12a6, 0x12a7, 0x12a8, 0x1231, 0x1232, 0x1239, 0x137e, 0x137d, 0x137c, 0x0000, 0x0000, 0x0000, 0x092e, 0x0000, 0x0000, 0x0000, 0x0000, 0x091f, 0x09bf, 0x0000, 0x0000, 0x0000, 0x0e56, 0x0d1e, /* 0x12E21..0x12E7E */ 0x2ff1, 0x840b, 0x1402, 0x2e28, 0x2e2f, 0x2e30, 0x2e8d, 0x2ee1, 0x2efd, 0x2eff, 0x2f03, 0x2f0b, 0x2f60, 0x2f48, 0x2f49, 0x2f56, 0x2f5f, 0x2f6a, 0x2f6c, 0x2f7e, 0x2f8a, 0x2f94, 0x2f97, 0x8130, 0x2fc9, 0x2fe0, 0x3001, 0x3002, 0x300e, 0x3018, 0x3027, 0x302e, 0x3040, 0x303b, 0x3041, 0x3094, 0x30cc, 0x30f2, 0x30d0, 0x30e6, 0x8131, 0x3106, 0x3103, 0x310b, 0x311e, 0x3135, 0x314a, 0x8132, 0x3155, 0x3157, 0x14b5, 0x319d, 0x31c3, 0x31ca, 0x31de, 0x31e2, 0x31ee, 0x3201, 0x14db, 0x3213, 0x3215, 0x3249, 0x3257, 0x3261, 0x3293, 0x32c8, 0x8133, 0x32cc, 0x32d0, 0x32d6, 0x32db, 0x8134, 0x32f0, 0x32fb, 0x3300, 0x3307, 0x331c, 0x8135, 0x3361, 0x3363, 0x337d, 0x3393, 0x339d, 0x33b2, 0x3412, 0x3427, 0x344d, 0x349c, 0x346b, 0x3474, 0x347f, 0x3488, 0x3496, 0x34a1, /* 0x12F21..0x12F7E */ 0x34a9, 0x34c6, 0x34ff, 0x350e, 0x352b, 0x3535, 0x3550, 0x355e, 0x3581, 0x3586, 0x358e, 0x8136, 0x35ad, 0x35ce, 0x8137, 0x3608, 0x360e, 0x363b, 0x3649, 0x3676, 0x3666, 0x8138, 0x366f, 0x3671, 0x3672, 0x3699, 0x369e, 0x36a9, 0x36ac, 0x36b3, 0x36c9, 0x36ca, 0x370a, 0x923d, 0x3721, 0x372f, 0x3733, 0x3734, 0x3770, 0x3777, 0x377c, 0x379c, 0x810f, 0x931b, 0x37b8, 0x37c7, 0x37c8, 0x37cf, 0x37e4, 0x37ed, 0x37f5, 0x37f6, 0x37ff, 0x3809, 0x8110, 0x3861, 0x3864, 0x8139, 0x387c, 0x3889, 0x389e, 0x813a, 0x38a9, 0x946e, 0x38d2, 0x38ce, 0x38d4, 0x38da, 0x38e0, 0x38e9, 0x390c, 0x6641, 0x395d, 0x396d, 0x398b, 0x3992, 0x39a4, 0x39c3, 0x39d2, 0x39dd, 0x3a13, 0x3a23, 0x3a67, 0x3a6d, 0x3a77, 0x3a7e, 0x3a84, 0x3a9e, 0x3aa7, 0x3ac4, 0x98bd, 0x3b19, 0x3b25, 0x325d, /* 0x13021..0x1307E */ 0x2e9c, 0x3516, 0x3a03, 0x763f, 0x34c0, 0x411b, 0x4328, 0x39f6, 0x7022, 0x6475, 0x631c, 0x5a50, 0x40aa, 0x43e1, 0x4e25, 0x45ed, 0x6466, 0x62a6, 0x7bf5, 0x4893, 0x3727, 0x45a1, 0x4271, 0x3b9b, 0x39d0, 0x667b, 0x78f4, 0x5d62, 0x5dbe, 0x7b8e, 0x4216, 0x5c9f, 0x68b7, 0x3b89, 0x3eb5, 0x4309, 0x4697, 0x4848, 0x75c7, 0x778d, 0x474f, 0x2ee5, 0x2f0a, 0x2f4d, 0x2f9d, 0x3049, 0x36f2, 0x3937, 0x39d4, 0x3a01, 0x3c09, 0x40df, 0x410f, 0x4170, 0x4613, 0x4905, 0x50ba, 0x554f, 0x5570, 0x59fb, 0x5dad, 0x5def, 0x60c3, 0x640e, 0x6863, 0x6b02, 0x7055, 0x707a, 0x333b, 0x2e95, 0x2ea5, 0x37df, 0x60b2, 0x70c1, 0x58ef, 0x2e00, 0x38f1, 0x4ea2, 0x7038, 0x5a32, 0x6328, 0x628b, 0x7c2f, 0x3141, 0x3370, 0x34bd, 0x34e1, 0x36e0, 0x39fb, 0x3f15, 0x78f2, 0x4deb, 0x60e4, 0x652d, /* 0x13121..0x1317E */ 0x7662, 0x7670, 0x76a0, 0x77fb, 0x340b, 0x33f3, 0x3b87, 0x50cf, 0x5fbd, 0x6fc2, 0x76e8, 0x336f, 0x7d5c, 0x5aba, 0x2e11, 0x5893, 0x61fc, 0x4e26, 0x3618, 0x3504, 0x4b1d, 0x651a, 0x7c3b, 0x39e5, 0x33a9, 0x4d66, 0x54dc, 0x758f, 0x3642, 0x2e91, 0x704b, 0x76f2, 0x634f, 0x790c, 0x33e1, 0x35b6, 0x3b30, 0x3f71, 0x4620, 0x46f3, 0x4804, 0x4c38, 0x4cf3, 0x4d29, 0x545b, 0x56c8, 0x5a4e, 0x7834, 0x62f1, 0x685b, 0x6a60, 0x72ed, 0x4db2, 0x55ab, 0x56ca, 0x79c5, 0x40a6, 0x6b01, 0x6d8a, 0x75b2, 0x498e, 0x33ad, 0x3186, 0x3712, 0x3830, 0x3944, 0x3bb4, 0x3ef6, 0x4028, 0x43a9, 0x43f4, 0x4cbf, 0x4f14, 0x508e, 0x5114, 0x5159, 0x51d5, 0x533f, 0x5e01, 0x6276, 0x62d1, 0x6597, 0x7060, 0x725b, 0x7d1b, 0x3869, 0x45bc, 0x4c5a, 0x5525, 0x31f9, 0x392e, 0x3965, 0x3f80, 0x3fdc, /* 0x13221..0x1327E */ 0x42bc, 0x45fa, 0x4a2a, 0x4b27, 0x4bb4, 0x538b, 0x5fc1, 0x6956, 0x7d2c, 0x7d0e, 0x7ec4, 0x3ca1, 0x4c96, 0x637b, 0x3104, 0x3c4b, 0x41b6, 0x61c6, 0x4876, 0x5261, 0x2e59, 0x2ffa, 0x3378, 0x4069, 0x4e29, 0x5a4f, 0x77f3, 0x2e0b, 0x3316, 0x2eee, 0x2f55, 0x2f3d, 0x2fa1, 0x2f73, 0x32a0, 0x33ef, 0x3609, 0x390f, 0x3ac1, 0x3bb6, 0x3be1, 0x59d1, 0x4687, 0x479c, 0x47b6, 0x4b4c, 0x4cb3, 0x506b, 0x53c2, 0x598d, 0x59be, 0x5a3c, 0x5b87, 0x62b1, 0x62db, 0x6304, 0x6377, 0x63ef, 0x63d3, 0x6766, 0x6ab2, 0x3629, 0x6ca8, 0x6fe6, 0x704e, 0x771e, 0x668a, 0x2fc4, 0x3ce8, 0x4211, 0x5259, 0x553b, 0x61e5, 0x62bd, 0x66fe, 0x6cc0, 0x76c5, 0x7913, 0x79d5, 0x2ecb, 0x2f1a, 0x69e3, 0x36de, 0x384a, 0x38ca, 0x3efb, 0x3feb, 0x402a, 0x4094, 0x4062, 0x41d0, 0x4212, 0x42d0, 0x4539, /* 0x13321..0x1337E */ 0x7b41, 0x4666, 0x48b0, 0x4d77, 0x5070, 0x554c, 0x5686, 0x5d75, 0x62a5, 0x67f9, 0x758b, 0x768e, 0x6c9d, 0x31f1, 0x32be, 0x3916, 0x34b3, 0x3bb3, 0x3d16, 0x4168, 0x4982, 0x4daf, 0x588d, 0x64cb, 0x6857, 0x6a72, 0x73a7, 0x7ab8, 0x4d6c, 0x79a8, 0x66d9, 0x37a3, 0x47ff, 0x66ce, 0x720e, 0x3283, 0x3687, 0x3404, 0x3ed3, 0x42e1, 0x44b9, 0x483c, 0x4838, 0x4bbb, 0x5372, 0x58ba, 0x5a6b, 0x699a, 0x69d2, 0x6d6b, 0x6f03, 0x70ed, 0x75a3, 0x7694, 0x7769, 0x3b66, 0x3cb3, 0x497d, 0x784d, 0x784e, 0x439b, 0x5b20, 0x4a2b, 0x4a7f, 0x48b6, 0x7c0d, 0x4f5f, 0x3272, 0x359d, 0x4070, 0x42ec, 0x4d3b, 0x4e07, 0x4ed1, 0x645b, 0x6910, 0x6f44, 0x2e14, 0x7c39, 0x33f6, 0x491b, 0x4a3a, 0x7784, 0x482a, 0x315c, 0x5ac3, 0x64b2, 0x71dc, 0x738c, 0x365b, 0x7d28, 0x4822, 0x6305, 0x6431, /* 0x13421..0x1347E */ 0x5ca5, 0x3208, 0x62c5, 0x54e6, 0x2e7e, 0x2f83, 0x31a0, 0x3bd2, 0x320a, 0x32d8, 0x32e7, 0x3dfb, 0x359a, 0x382a, 0x39e6, 0x3b8c, 0x3b98, 0x3bdb, 0x3e72, 0x3e79, 0x40a3, 0x411f, 0x4163, 0x41be, 0x43db, 0x4562, 0x47d1, 0x4853, 0x48fa, 0x4b3e, 0x4b53, 0x4c57, 0x4f22, 0x4f97, 0x4f45, 0x54b0, 0x5518, 0x56e3, 0x570b, 0x5aff, 0x5ba1, 0x5c21, 0x5de9, 0x5f36, 0x5ff0, 0x609d, 0x6266, 0x639e, 0x69b3, 0x6acc, 0x6cab, 0x7084, 0x7451, 0x7593, 0x7591, 0x75a2, 0x7665, 0x77d3, 0x7928, 0x6218, 0x2e38, 0x342b, 0x3cb8, 0x3dcc, 0x53a9, 0x564c, 0x573c, 0x3ca9, 0x5feb, 0x6d0b, 0x76c1, 0x7811, 0x7854, 0x7858, 0x2f01, 0x2f0e, 0x3371, 0x359c, 0x3668, 0x37fa, 0x3947, 0x3b09, 0x3bc4, 0x3c90, 0x3e0c, 0x3e7e, 0x3fcc, 0x43ee, 0x473a, 0x45d7, 0x45e2, 0x471f, 0x48cb, 0x48c4, /* 0x13521..0x1357E */ 0x4a5f, 0x3e30, 0x4bc5, 0x4c17, 0x4c7d, 0x557f, 0x5948, 0x3b63, 0x5a00, 0x5d00, 0x3fbd, 0x698f, 0x6a18, 0x6cb4, 0x6d77, 0x6ecc, 0x6f1d, 0x78e2, 0x7a0e, 0x7b3c, 0x2e80, 0x307d, 0x3100, 0x3993, 0x3b9c, 0x422f, 0x4280, 0x44ec, 0x4b3a, 0x52a0, 0x5591, 0x5947, 0x5fa9, 0x67fb, 0x6abc, 0x6b70, 0x43ac, 0x63ca, 0x77a0, 0x3409, 0x3403, 0x35ab, 0x4854, 0x4a58, 0x6a70, 0x5827, 0x4775, 0x7ecd, 0x3374, 0x3ba2, 0x611a, 0x6650, 0x7006, 0x2e18, 0x2e45, 0x2ec7, 0x2f11, 0x33ca, 0x3438, 0x3bae, 0x3f13, 0x4025, 0x4551, 0x473d, 0x4c42, 0x4c72, 0x4ce3, 0x5078, 0x5403, 0x5a76, 0x5aae, 0x5b08, 0x5d1a, 0x5cfe, 0x5d66, 0x45e7, 0x525b, 0x33bb, 0x3c45, 0x3de8, 0x42d2, 0x42e0, 0x4319, 0x4e20, 0x665a, 0x6a31, 0x6ddd, 0x72f8, 0x4f01, 0x59a6, 0x7b5a, 0x2ea8, 0x2eab, 0x2eac, /* 0x13621..0x1367E */ 0x2f9b, 0x2fa0, 0x30d1, 0x3147, 0x5af6, 0x3171, 0x31f6, 0x3354, 0x3321, 0x337f, 0x33eb, 0x35ac, 0x3883, 0x3ce1, 0x3f37, 0x3f4a, 0x402f, 0x4050, 0x406d, 0x431f, 0x4559, 0x4a4b, 0x4cc1, 0x52c2, 0x52ed, 0x57ef, 0x60f8, 0x6105, 0x6208, 0x654e, 0x70f7, 0x73e1, 0x77ff, 0x7957, 0x7a5a, 0x2ef0, 0x31dd, 0x3c2d, 0x4681, 0x496d, 0x3c40, 0x46f2, 0x4975, 0x5389, 0x4850, 0x5c81, 0x30c5, 0x32e4, 0x3747, 0x3dfe, 0x7326, 0x45a4, 0x4b23, 0x4b3d, 0x5434, 0x5981, 0x59bd, 0x5b4b, 0x5dca, 0x62b9, 0x63cc, 0x687f, 0x695f, 0x6b39, 0x6fd1, 0x71d1, 0x341f, 0x7280, 0x2e5d, 0x3036, 0x33e5, 0x333a, 0x52d7, 0x5396, 0x57e9, 0x62e6, 0x6eaf, 0x79c6, 0x79c8, 0x79d2, 0x3177, 0x411a, 0x665e, 0x35b0, 0x5a7a, 0x3076, 0x3bd3, 0x7047, 0x7685, 0x2e32, 0x4adb, 0x71e7, 0x3c51, 0x3c48, /* 0x13721..0x1377E */ 0x4398, 0x5a9f, 0x4c93, 0x7774, 0x6f61, 0x5aaa, 0x518a, 0x7688, 0x5c82, 0x4817, 0x5e70, 0x4851, 0x736c, 0x32f2, 0x341b, 0x65ab, 0x6a13, 0x5fa4, 0x6ecd, 0x70e1, 0x3366, 0x6888, 0x5941, 0x2fc2, 0x30be, 0x3211, 0x3144, 0x3553, 0x372d, 0x53ea, 0x378b, 0x3951, 0x3f62, 0x3f84, 0x4075, 0x4176, 0x4167, 0x41a9, 0x43b2, 0x443a, 0x456c, 0x466f, 0x4842, 0x4e13, 0x5566, 0x5a3d, 0x5cfb, 0x5d4c, 0x5d99, 0x5e4b, 0x5f6b, 0x630e, 0x634a, 0x66cd, 0x6a08, 0x6a63, 0x6b66, 0x6efd, 0x781a, 0x7d8f, 0x62b8, 0x6fce, 0x7be8, 0x3287, 0x421f, 0x4483, 0x4fc0, 0x7699, 0x4841, 0x3091, 0x4b20, 0x4c7a, 0x4f54, 0x5a74, 0x5d50, 0x6840, 0x6a23, 0x4708, 0x2ef6, 0x3039, 0x3026, 0x3065, 0x317c, 0x3238, 0x3263, 0x35a7, 0x370f, 0x3805, 0x3acc, 0x3efa, 0x41b2, 0x41f8, 0x42f3, 0x4372, /* 0x13821..0x1387E */ 0x491c, 0x4a29, 0x527d, 0x52ac, 0x532e, 0x5814, 0x586f, 0x5d79, 0x570c, 0x60a9, 0x698b, 0x6b19, 0x6ce2, 0x6ed2, 0x7063, 0x7375, 0x767a, 0x7855, 0x7a13, 0x7e78, 0x3143, 0x339f, 0x33b3, 0x3e7b, 0x3f26, 0x4e1b, 0x4e90, 0x5384, 0x53fe, 0x5d43, 0x6237, 0x6a00, 0x6afa, 0x7650, 0x2e4e, 0x300b, 0x33e4, 0x347c, 0x36fa, 0x39d1, 0x3b64, 0x3df1, 0x3eab, 0x3f27, 0x4238, 0x4545, 0x47af, 0x4e56, 0x52d0, 0x5cca, 0x68b4, 0x60a1, 0x60e1, 0x63f0, 0x664e, 0x6a87, 0x6de8, 0x7237, 0x76c7, 0x7867, 0x7f13, 0x2e94, 0x2e92, 0x2f0d, 0x3348, 0x3449, 0x343e, 0x3a2f, 0x3f8c, 0x3fa1, 0x409f, 0x48a7, 0x4a8e, 0x545a, 0x5881, 0x6a9e, 0x6aa4, 0x6b77, 0x7190, 0x2e5e, 0x7bc9, 0x2ea4, 0x2f7c, 0x2faf, 0x3019, 0x3016, 0x3149, 0x316c, 0x329f, 0x32b9, 0x32fe, 0x339a, 0x33e3, 0x3411, /* 0x13921..0x1397E */ 0x340e, 0x3589, 0x3751, 0x37a2, 0x397d, 0x3b54, 0x3b5d, 0x3b8f, 0x3de5, 0x3de7, 0x3df7, 0x3e78, 0x3e83, 0x3e9a, 0x3eb7, 0x3f18, 0x4052, 0x414c, 0x4297, 0x42d8, 0x43a7, 0x453b, 0x4602, 0x4643, 0x46f4, 0x476d, 0x4821, 0x4897, 0x49cb, 0x4c5f, 0x4d2a, 0x4d69, 0x4e2f, 0x4e9d, 0x5532, 0x5687, 0x586c, 0x5a3f, 0x5ce0, 0x5d05, 0x5d18, 0x5d5e, 0x5db1, 0x6015, 0x6003, 0x60af, 0x60b1, 0x6154, 0x618f, 0x622a, 0x6352, 0x684c, 0x6861, 0x6b1b, 0x6ca2, 0x6cfc, 0x70ca, 0x7175, 0x7271, 0x583f, 0x72fc, 0x75a4, 0x764d, 0x7805, 0x7999, 0x7ad8, 0x7d3b, 0x325b, 0x32ab, 0x33f7, 0x3408, 0x38d5, 0x42f7, 0x4fe0, 0x6c6a, 0x6f5f, 0x7eb9, 0x314b, 0x323b, 0x344a, 0x36fd, 0x5a40, 0x7177, 0x7d60, 0x7ed2, 0x5344, 0x4f09, 0x6170, 0x5511, 0x3ffd, 0x40da, 0x7aa8, 0x52db, 0x6fbc, /* 0x13A21..0x13A7E */ 0x4b64, 0x7803, 0x2eca, 0x36f0, 0x3764, 0x38be, 0x3a5a, 0x4068, 0x41c7, 0x460f, 0x4606, 0x4839, 0x48b1, 0x4df7, 0x55d5, 0x5d3a, 0x626e, 0x7b42, 0x2e9b, 0x2f50, 0x33c9, 0x3506, 0x3d6f, 0x3de6, 0x3dee, 0x47fb, 0x4c99, 0x5473, 0x5802, 0x6a50, 0x7396, 0x68df, 0x3750, 0x3ea7, 0x432b, 0x30b5, 0x30ac, 0x318d, 0x4700, 0x34c9, 0x385e, 0x39bb, 0x3bb0, 0x3f69, 0x424d, 0x43a1, 0x483d, 0x4b73, 0x4e08, 0x507d, 0x71c7, 0x5280, 0x5815, 0x5826, 0x596d, 0x458e, 0x5d30, 0x63dc, 0x68c1, 0x6f09, 0x769b, 0x3264, 0x3728, 0x4750, 0x5f6a, 0x6ca1, 0x31b4, 0x3742, 0x762a, 0x383a, 0x498a, 0x60b4, 0x34b2, 0x3d0e, 0x37fc, 0x5895, 0x7dfa, 0x2f5c, 0x324a, 0x348b, 0x443e, 0x4628, 0x4714, 0x47f5, 0x5a84, 0x5b56, 0x5d22, 0x732f, 0x485c, 0x7bad, 0x5b39, 0x3319, 0x318a, 0x3237, /* 0x13B21..0x13B7E */ 0x3bdf, 0x42f6, 0x44ae, 0x44e6, 0x472d, 0x4bba, 0x65a9, 0x76d1, 0x5690, 0x7bd6, 0x434c, 0x7306, 0x7bab, 0x56bf, 0x4652, 0x2e09, 0x3098, 0x33c2, 0x3c71, 0x40e8, 0x4492, 0x4563, 0x485f, 0x51e6, 0x53ca, 0x5523, 0x5b97, 0x5e82, 0x6695, 0x6b83, 0x6cdb, 0x7178, 0x7910, 0x45ac, 0x46ab, 0x4b8b, 0x2ed5, 0x2ed4, 0x2f3a, 0x2f7f, 0x323a, 0x33f8, 0x33f2, 0x35e3, 0x36db, 0x38eb, 0x39cb, 0x39c9, 0x39ff, 0x3b50, 0x3c4d, 0x3e02, 0x3e2b, 0x3fd7, 0x401d, 0x4307, 0x452f, 0x3b5c, 0x45af, 0x45bd, 0x45e8, 0x479d, 0x4b62, 0x4b7b, 0x4c0f, 0x5345, 0x5949, 0x59c1, 0x5cf8, 0x5d19, 0x5d2b, 0x60a2, 0x6102, 0x61f3, 0x6996, 0x6a5e, 0x6a69, 0x6a66, 0x6a8c, 0x6aee, 0x6cc7, 0x6cdc, 0x76cc, 0x78fc, 0x4b6f, 0x2e8b, 0x2f3c, 0x2f8d, 0x3150, 0x3b57, 0x3bfa, 0x4148, 0x4301, 0x4642, /* 0x13C21..0x13C7E */ 0x4b21, 0x4ecb, 0x4cbb, 0x523e, 0x54bd, 0x55d4, 0x58c1, 0x593a, 0x600c, 0x6033, 0x61ea, 0x6494, 0x6f9e, 0x4c50, 0x7e7f, 0x3f0f, 0x6b58, 0x7d2b, 0x5afa, 0x6ef8, 0x3b8d, 0x76eb, 0x2e03, 0x33f1, 0x37f7, 0x3931, 0x3ac9, 0x3ba4, 0x4089, 0x4e7f, 0x4f06, 0x55be, 0x6cea, 0x3b9f, 0x6500, 0x5be0, 0x3072, 0x47f4, 0x629d, 0x3c61, 0x654a, 0x5e1e, 0x620e, 0x3199, 0x3c04, 0x4368, 0x6d66, 0x459c, 0x516e, 0x593e, 0x5d17, 0x6005, 0x6b1d, 0x6eca, 0x706e, 0x66c7, 0x70aa, 0x301f, 0x32fa, 0x3c3a, 0x4753, 0x507c, 0x5235, 0x714c, 0x71c8, 0x732b, 0x62e5, 0x3bc2, 0x3f31, 0x40f9, 0x2e3b, 0x33d6, 0x3b88, 0x424b, 0x4731, 0x4b8a, 0x52e9, 0x53e0, 0x5a2e, 0x616b, 0x6da3, 0x7152, 0x7996, 0x3112, 0x33d7, 0x346a, 0x3bff, 0x4388, 0x4a39, 0x5dac, 0x7700, 0x36da, 0x33ce, 0x3468, /* 0x13D21..0x13D7E */ 0x3b97, 0x3c31, 0x3dde, 0x2fee, 0x4101, 0x42fe, 0x4d32, 0x59c0, 0x59cb, 0x5d42, 0x5e4d, 0x5fd2, 0x61ed, 0x621f, 0x6490, 0x6846, 0x6972, 0x6b90, 0x6e74, 0x6f2f, 0x7031, 0x714b, 0x716c, 0x76c6, 0x719c, 0x2ec0, 0x2f4f, 0x3145, 0x3341, 0x3f93, 0x420e, 0x47d4, 0x4c41, 0x4e0b, 0x5363, 0x5e26, 0x71cd, 0x7283, 0x33d4, 0x3919, 0x3bbf, 0x4dd1, 0x595d, 0x5e2e, 0x5c9b, 0x387e, 0x519f, 0x31fa, 0x6853, 0x6ff0, 0x2fca, 0x3cfb, 0x4625, 0x57ac, 0x5ae3, 0x621c, 0x79ff, 0x31c6, 0x3faa, 0x45ec, 0x496f, 0x4b89, 0x4df3, 0x4e96, 0x4f64, 0x56fe, 0x5d14, 0x3de1, 0x7075, 0x7187, 0x7806, 0x31e6, 0x321d, 0x4240, 0x4691, 0x46d9, 0x4e1a, 0x3eb6, 0x5dd2, 0x5f72, 0x46f8, 0x65af, 0x65f7, 0x6af8, 0x32a9, 0x33d9, 0x3973, 0x3e8f, 0x3f90, 0x4055, 0x72e4, 0x7664, 0x30b7, 0x311f, /* 0x13E21..0x13E7E */ 0x32dd, 0x3320, 0x3347, 0x33ec, 0x34e8, 0x3546, 0x3531, 0x3617, 0x3968, 0x39be, 0x3a3c, 0x3bb5, 0x3c06, 0x3c0f, 0x3c11, 0x3c1a, 0x3e84, 0x3e8a, 0x3ee0, 0x3f70, 0x427f, 0x4284, 0x42db, 0x438c, 0x4377, 0x4607, 0x460c, 0x462d, 0x4676, 0x477e, 0x48a2, 0x4a1f, 0x4a35, 0x4cbc, 0x4d88, 0x4e09, 0x4e58, 0x513c, 0x5126, 0x5167, 0x55c7, 0x5701, 0x585d, 0x5901, 0x5965, 0x59f0, 0x5ae0, 0x5b11, 0x5ca7, 0x5d39, 0x6096, 0x63d6, 0x648b, 0x6549, 0x685d, 0x68f3, 0x6a1f, 0x6a3c, 0x6a54, 0x6a73, 0x6c61, 0x6cde, 0x71a4, 0x7266, 0x737e, 0x7418, 0x769c, 0x7798, 0x2e0a, 0x2e08, 0x2e1e, 0x2e57, 0x3197, 0x3270, 0x37ce, 0x3834, 0x38cc, 0x3b22, 0x3e38, 0x40c5, 0x44fe, 0x4761, 0x4756, 0x4d44, 0x52b6, 0x5573, 0x5a63, 0x64b8, 0x6b72, 0x71b8, 0x7320, 0x3631, 0x37f4, 0x78fe, /* 0x13F21..0x13F7E */ 0x42ed, 0x490d, 0x4b96, 0x51ed, 0x5e54, 0x6077, 0x6272, 0x69e6, 0x78df, 0x6755, 0x6fb1, 0x3c3b, 0x2f38, 0x2fe1, 0x2fb5, 0x3507, 0x3a20, 0x3bdd, 0x3be9, 0x3fc3, 0x414e, 0x432f, 0x45b0, 0x464b, 0x48ee, 0x499b, 0x4d78, 0x4df1, 0x5533, 0x55b9, 0x571f, 0x595e, 0x59e6, 0x5d33, 0x61e3, 0x62af, 0x65aa, 0x69aa, 0x6a3a, 0x6eab, 0x6f9b, 0x7032, 0x71dd, 0x7707, 0x2eba, 0x2ec1, 0x3203, 0x3875, 0x38ec, 0x3c0b, 0x551a, 0x3c3d, 0x614e, 0x6a0a, 0x6fc5, 0x7663, 0x776d, 0x5b25, 0x6acf, 0x7808, 0x7162, 0x36f3, 0x33a8, 0x7017, 0x3439, 0x3782, 0x3e25, 0x43a8, 0x4c34, 0x508a, 0x5761, 0x5c8b, 0x5fe0, 0x6870, 0x7042, 0x7154, 0x7310, 0x7318, 0x768f, 0x545e, 0x7ac4, 0x3d07, 0x3d69, 0x4570, 0x47a2, 0x6da8, 0x76db, 0x436e, 0x4749, 0x4919, 0x63c5, 0x7817, 0x76c0, 0x68fe, /* 0x14021..0x1407E */ 0x4f84, 0x447a, 0x3bf8, 0x2e16, 0x502c, 0x555d, 0x462f, 0x31c4, 0x3236, 0x32e2, 0x39d3, 0x3f81, 0x4027, 0x4210, 0x453f, 0x4574, 0x461f, 0x4674, 0x48f2, 0x4816, 0x4b63, 0x4e05, 0x5272, 0x551f, 0x56db, 0x5cbe, 0x6056, 0x38f0, 0x68fd, 0x697f, 0x6aa0, 0x6a93, 0x6acb, 0x701d, 0x7192, 0x7752, 0x7759, 0x4589, 0x5a0e, 0x6106, 0x76bb, 0x3e2d, 0x40dc, 0x421a, 0x45a5, 0x4614, 0x4790, 0x57f3, 0x5a4d, 0x5c4d, 0x5e3e, 0x610a, 0x6cac, 0x6d64, 0x6de1, 0x6e5f, 0x58a9, 0x3207, 0x42d9, 0x43a5, 0x4442, 0x4298, 0x6a2d, 0x5a83, 0x5bc0, 0x6aac, 0x76ea, 0x5d76, 0x620c, 0x6749, 0x2ed9, 0x3148, 0x3343, 0x3360, 0x3ba3, 0x3c02, 0x3c16, 0x3ddd, 0x4226, 0x4247, 0x44b0, 0x4813, 0x4834, 0x4cc9, 0x4d45, 0x4d17, 0x47d3, 0x4f5c, 0x514e, 0x517d, 0x45cb, 0x5a7f, 0x5bad, 0x5dda, /* 0x14121..0x1417E */ 0x5e4a, 0x5fa8, 0x617a, 0x621b, 0x6239, 0x65a6, 0x6a6e, 0x6cce, 0x6df5, 0x7078, 0x7077, 0x72ad, 0x7291, 0x7583, 0x7bae, 0x324d, 0x3584, 0x4f38, 0x5136, 0x3168, 0x5985, 0x5e55, 0x61b3, 0x5cce, 0x364c, 0x3851, 0x3ca8, 0x43aa, 0x46fe, 0x46fd, 0x495a, 0x52d9, 0x558f, 0x558e, 0x590e, 0x5956, 0x59df, 0x5c97, 0x5d20, 0x5d44, 0x6607, 0x6a34, 0x763b, 0x7061, 0x7f20, 0x30e7, 0x3275, 0x33cc, 0x33e2, 0x3009, 0x35aa, 0x38ee, 0x394f, 0x523d, 0x3b8b, 0x3c64, 0x331d, 0x40e3, 0x40f3, 0x435c, 0x4383, 0x433f, 0x43bb, 0x44cd, 0x45e9, 0x46f9, 0x3de3, 0x49cd, 0x49fd, 0x4f15, 0x51e5, 0x2e89, 0x55e9, 0x56f8, 0x5a93, 0x5cdf, 0x5dcf, 0x5d9c, 0x6061, 0x6349, 0x6358, 0x646c, 0x64bc, 0x65fb, 0x68c5, 0x6d70, 0x7001, 0x706d, 0x7397, 0x771c, 0x7a12, 0x30cf, 0x3897, 0x418e, /* 0x14221..0x1427E */ 0x61d3, 0x6535, 0x6d08, 0x7020, 0x2fc3, 0x3074, 0x3247, 0x3373, 0x406f, 0x4349, 0x475f, 0x4e2c, 0x6db3, 0x701f, 0x2fd7, 0x3c5e, 0x6cca, 0x45cf, 0x5d9a, 0x3352, 0x6896, 0x3176, 0x43c3, 0x3b58, 0x3b6b, 0x3c0a, 0x440d, 0x4751, 0x705c, 0x2ed6, 0x391a, 0x392a, 0x4c70, 0x6a51, 0x353e, 0x3815, 0x39a5, 0x40f0, 0x4253, 0x47c1, 0x6235, 0x4955, 0x7640, 0x79c4, 0x7a28, 0x2f53, 0x3806, 0x3bfe, 0x6010, 0x3cb1, 0x3e2f, 0x3f85, 0x4020, 0x414b, 0x4234, 0x46ff, 0x4cf0, 0x4ede, 0x60ce, 0x617f, 0x62d4, 0x688b, 0x6cb8, 0x7000, 0x702e, 0x768a, 0x7edb, 0x7bdb, 0x2ee3, 0x33f0, 0x3927, 0x5b2c, 0x718d, 0x784c, 0x7df9, 0x4edd, 0x5027, 0x3353, 0x3544, 0x3b85, 0x4258, 0x429e, 0x42d3, 0x4ca2, 0x4fef, 0x5422, 0x6a17, 0x7438, 0x4fc1, 0x6afe, 0x6338, 0x31e7, 0x66f8, 0x33ea, /* 0x14321..0x1437E */ 0x33e9, 0x2f46, 0x7054, 0x6fb0, 0x396a, 0x6131, 0x3dfd, 0x5aea, 0x6fbf, 0x48da, 0x6c37, 0x52f8, 0x7c48, 0x4a3d, 0x6ab0, 0x2e39, 0x3358, 0x3606, 0x3766, 0x42c5, 0x43a2, 0x45e6, 0x4b4e, 0x4de1, 0x4e5b, 0x50ad, 0x57ed, 0x5aef, 0x5baa, 0x5dbb, 0x603d, 0x60c6, 0x66cb, 0x6a95, 0x735b, 0x36e3, 0x38c7, 0x3f3e, 0x45ad, 0x4696, 0x4a80, 0x4bb5, 0x5537, 0x6ac7, 0x3024, 0x57e5, 0x3730, 0x3f1b, 0x4065, 0x467a, 0x4c60, 0x55f4, 0x5a1a, 0x5f6e, 0x61f4, 0x6718, 0x7045, 0x79b3, 0x5bc9, 0x555c, 0x5af9, 0x5b51, 0x64c4, 0x7010, 0x59e9, 0x5a92, 0x6336, 0x3ae1, 0x5740, 0x2e2d, 0x2ef2, 0x3b99, 0x3fe0, 0x42bd, 0x463c, 0x47f1, 0x4ce8, 0x666b, 0x6877, 0x6a3b, 0x714e, 0x72f3, 0x79d0, 0x4a17, 0x5026, 0x532a, 0x62e7, 0x6457, 0x6caf, 0x2e01, 0x3146, 0x31cb, 0x358b, 0x3bf5, /* 0x14421..0x1447E */ 0x3e16, 0x3e33, 0x3e81, 0x3f14, 0x3f35, 0x3f6b, 0x3fb4, 0x41f2, 0x4311, 0x46a2, 0x471d, 0x4f6e, 0x5252, 0x553a, 0x573a, 0x6074, 0x6139, 0x6178, 0x6776, 0x6abf, 0x6adc, 0x6d85, 0x6df3, 0x729a, 0x7577, 0x7802, 0x7ce5, 0x32c5, 0x4357, 0x56f4, 0x4715, 0x4c88, 0x53cd, 0x6cc3, 0x73ae, 0x7673, 0x4d25, 0x389c, 0x490e, 0x49cc, 0x6ffd, 0x739a, 0x55db, 0x701a, 0x385a, 0x4802, 0x43b4, 0x49fb, 0x2f43, 0x4f2c, 0x47d8, 0x6fbb, 0x6526, 0x5db4, 0x7354, 0x493f, 0x4f70, 0x376a, 0x38f7, 0x3b2c, 0x5d2c, 0x522a, 0x340a, 0x71e3, 0x7db4, 0x2ead, 0x2f4e, 0x305c, 0x3075, 0x3243, 0x6c9e, 0x3448, 0x3824, 0x3b9a, 0x3e1d, 0x3e95, 0x3ead, 0x3ef7, 0x3f1f, 0x408c, 0x42b5, 0x433a, 0x43d0, 0x48af, 0x4c40, 0x5887, 0x598e, 0x5a0b, 0x5de0, 0x6247, 0x6a02, 0x6ae6, 0x6e44, 0x7013, /* 0x14521..0x1457E */ 0x70b8, 0x712d, 0x71d8, 0x7f0e, 0x4ce5, 0x4458, 0x44e2, 0x4575, 0x4ef4, 0x5684, 0x5b1b, 0x7069, 0x73d1, 0x4eba, 0x34f2, 0x3fb9, 0x44a4, 0x6f4d, 0x6fed, 0x7244, 0x3178, 0x386b, 0x3929, 0x3c55, 0x3e97, 0x4dfb, 0x5e8f, 0x551c, 0x6cbc, 0x6ee2, 0x785b, 0x50b9, 0x2f1d, 0x4bbf, 0x4fb1, 0x5530, 0x76fb, 0x314e, 0x3410, 0x3835, 0x3857, 0x39ac, 0x3c60, 0x3f92, 0x4597, 0x475c, 0x4e21, 0x567b, 0x63df, 0x6ced, 0x7014, 0x70fd, 0x734d, 0x5825, 0x583a, 0x32aa, 0x3ea6, 0x371f, 0x3974, 0x4012, 0x3012, 0x315a, 0x31ac, 0x31cd, 0x3200, 0x3510, 0x3854, 0x3858, 0x3957, 0x3b95, 0x3cf6, 0x3d8b, 0x40bc, 0x4295, 0x442d, 0x4771, 0x4843, 0x48bc, 0x48df, 0x56d7, 0x4dd8, 0x4e6f, 0x4d9b, 0x506f, 0x51c8, 0x3f53, 0x55d8, 0x5977, 0x5b49, 0x5b54, 0x5b52, 0x5cd6, 0x5d71, 0x3230, /* 0x14621..0x1467E */ 0x6463, 0x6569, 0x65e4, 0x6a0e, 0x6b04, 0x6c46, 0x6e0f, 0x7003, 0x700f, 0x7419, 0x7676, 0x782d, 0x7a30, 0x75d8, 0x30cd, 0x32d5, 0x340c, 0x3802, 0x3c0e, 0x41a7, 0x449e, 0x4d1e, 0x57b3, 0x5ae5, 0x60f4, 0x6404, 0x7053, 0x7285, 0x3ce0, 0x7d07, 0x333f, 0x3f97, 0x3fb3, 0x4d9c, 0x5279, 0x5763, 0x59bf, 0x5be4, 0x4bd2, 0x52ec, 0x6aad, 0x4803, 0x4a61, 0x31f8, 0x5a81, 0x4934, 0x3c4a, 0x7cf6, 0x62eb, 0x3bc5, 0x7149, 0x501e, 0x3678, 0x3c6f, 0x40c7, 0x4566, 0x4c8c, 0x6c5a, 0x7041, 0x7813, 0x3451, 0x46c7, 0x720d, 0x3948, 0x70a3, 0x3185, 0x2e4d, 0x31ea, 0x6599, 0x6b0e, 0x5058, 0x437a, 0x734b, 0x4962, 0x79b4, 0x5e04, 0x5577, 0x3357, 0x4960, 0x6edf, 0x76e3, 0x4c5d, 0x2e8c, 0x3c3c, 0x3f10, 0x6fe9, 0x3302, 0x6cd1, 0x6089, 0x6679, 0x3eff, 0x45e5, 0x2e73, 0x3165, /* 0x14721..0x1477E */ 0x3982, 0x3c3f, 0x77ee, 0x2efb, 0x398a, 0x3fcd, 0x6a8d, 0x4fe1, 0x59b0, 0x5962, 0x3be7, 0x6471, 0x532b, 0x51b1, 0x3e74, 0x3ff5, 0x437b, 0x449a, 0x51c3, 0x5c98, 0x2e43, 0x3efc, 0x2e4b, 0x37dc, 0x36a2, 0x40a9, 0x4fc3, 0x5d0d, 0x60fd, 0x6133, 0x61bf, 0x6fb2, 0x6997, 0x66a4, 0x3df4, 0x428a, 0x44ad, 0x6987, 0x4777, 0x4ce2, 0x4d3e, 0x5436, 0x5834, 0x3a46, 0x5f75, 0x62ad, 0x79ac, 0x2ff3, 0x3ec3, 0x42dd, 0x4392, 0x4557, 0x476f, 0x56c3, 0x524c, 0x60cc, 0x60ba, 0x6f29, 0x714d, 0x300d, 0x37f9, 0x3a92, 0x4885, 0x4973, 0x5164, 0x52fd, 0x6cb7, 0x38f2, 0x6ce0, 0x766a, 0x7019, 0x677f, 0x59e4, 0x57e7, 0x6429, 0x2f2f, 0x3265, 0x335a, 0x42cd, 0x47cf, 0x4cca, 0x567d, 0x5b94, 0x5c95, 0x6236, 0x6584, 0x6feb, 0x46dd, 0x4f20, 0x5206, 0x5e1b, 0x63ab, 0x79c1, 0x7ea6, /* 0x14821..0x1487E */ 0x31fd, 0x5bb1, 0x5872, 0x5bb8, 0x6087, 0x5b48, 0x4ae8, 0x3e61, 0x608c, 0x5551, 0x5560, 0x316b, 0x7262, 0x4e8c, 0x567a, 0x7197, 0x7aea, 0x2f10, 0x5f70, 0x429c, 0x5b4f, 0x75a5, 0x7ce9, 0x367a, 0x3859, 0x66e4, 0x76bc, 0x2f34, 0x3224, 0x334a, 0x33cd, 0x33db, 0x3e06, 0x442c, 0x4591, 0x477f, 0x4c3e, 0x4c4e, 0x5248, 0x52af, 0x53ed, 0x5554, 0x5e41, 0x622c, 0x65e9, 0x6ca9, 0x5bc4, 0x71c6, 0x5169, 0x7812, 0x78ef, 0x433d, 0x4669, 0x556a, 0x56e4, 0x58d0, 0x6543, 0x66ee, 0x332a, 0x3351, 0x3426, 0x3983, 0x3e87, 0x3f7c, 0x40b2, 0x4249, 0x4279, 0x42ab, 0x4590, 0x4bd4, 0x4ccc, 0x55b2, 0x56ae, 0x5891, 0x59d8, 0x5dcb, 0x5f77, 0x60a5, 0x68ab, 0x6ab9, 0x6cbb, 0x707f, 0x775e, 0x78db, 0x4a0b, 0x5c38, 0x3099, 0x3c3e, 0x3fae, 0x4787, 0x4bd8, 0x5435, 0x5709, 0x5f8e, /* 0x14921..0x1497E */ 0x7f3b, 0x47ca, 0x5a17, 0x3339, 0x558b, 0x7aed, 0x3f66, 0x619d, 0x63f1, 0x6098, 0x3f3c, 0x3fc5, 0x5562, 0x5b46, 0x703c, 0x4867, 0x39eb, 0x3a9b, 0x5d10, 0x567e, 0x6b2c, 0x2ff5, 0x3f6a, 0x4a19, 0x4c37, 0x4f02, 0x54e2, 0x5968, 0x6868, 0x6a55, 0x6c79, 0x3edf, 0x43cf, 0x55c5, 0x59d2, 0x62d7, 0x7328, 0x72f2, 0x649c, 0x66ed, 0x7c2d, 0x34c1, 0x3f6c, 0x458c, 0x4d5c, 0x5015, 0x6ca7, 0x6cd3, 0x783b, 0x454f, 0x54f6, 0x2e0d, 0x2ed8, 0x37e0, 0x392b, 0x3a66, 0x3bcc, 0x31a8, 0x3e03, 0x3e9c, 0x4016, 0x4276, 0x4577, 0x45a7, 0x466e, 0x4d6e, 0x5236, 0x5b26, 0x6150, 0x619a, 0x6299, 0x6b5c, 0x6ca0, 0x6ce6, 0x6d74, 0x761c, 0x7644, 0x2fae, 0x44ab, 0x4b66, 0x621e, 0x6461, 0x656a, 0x70e8, 0x3c01, 0x4953, 0x78a8, 0x647a, 0x6557, 0x2f0f, 0x326f, 0x3fa9, 0x3e45, 0x470d, /* 0x14A21..0x14A7E */ 0x598f, 0x6179, 0x6907, 0x6986, 0x4df5, 0x3f17, 0x4255, 0x4cb8, 0x2ecf, 0x5269, 0x7b92, 0x3206, 0x343b, 0x3674, 0x38b3, 0x41a4, 0x426e, 0x511a, 0x396e, 0x5c89, 0x5cde, 0x5d1b, 0x76f0, 0x4587, 0x605e, 0x2e19, 0x2f75, 0x3175, 0x3840, 0x3e63, 0x3e73, 0x3f0a, 0x47c4, 0x2e26, 0x653d, 0x7589, 0x765b, 0x5c73, 0x7801, 0x30fb, 0x38c1, 0x5656, 0x58a7, 0x3225, 0x57a5, 0x6511, 0x5b86, 0x304f, 0x3909, 0x5247, 0x5bc7, 0x5de8, 0x6fba, 0x6fd4, 0x704d, 0x2fbf, 0x32c9, 0x3a29, 0x3f01, 0x77ad, 0x2fdd, 0x6217, 0x72ea, 0x3703, 0x4355, 0x4b69, 0x552b, 0x68dc, 0x6f14, 0x5a42, 0x32df, 0x3893, 0x4155, 0x420a, 0x46ae, 0x4bcd, 0x5c3f, 0x63e9, 0x3023, 0x2ff8, 0x3305, 0x3446, 0x3831, 0x3949, 0x3b9d, 0x3cf0, 0x3cef, 0x3d29, 0x3e96, 0x42b1, 0x4367, 0x453e, 0x45b9, 0x470b, /* 0x14B21..0x14B7E */ 0x4cd5, 0x4ce1, 0x50f9, 0x5832, 0x5e2b, 0x60de, 0x62b3, 0x640c, 0x64ec, 0x6702, 0x6912, 0x6a2a, 0x6c4a, 0x70a6, 0x72d2, 0x78fd, 0x7cf3, 0x7d6c, 0x2e4f, 0x2ea1, 0x308d, 0x3256, 0x374a, 0x39a8, 0x3e3d, 0x3fd8, 0x3fd9, 0x423f, 0x46b4, 0x471b, 0x47d0, 0x48d2, 0x3192, 0x5d21, 0x60aa, 0x61a8, 0x6b00, 0x6c8c, 0x6cbf, 0x727e, 0x7632, 0x3420, 0x782c, 0x3317, 0x30d5, 0x335c, 0x38a8, 0x44b2, 0x4734, 0x5267, 0x5766, 0x5a46, 0x71e6, 0x32c3, 0x4ca1, 0x4b86, 0x3800, 0x3e4c, 0x3954, 0x472c, 0x5ffb, 0x31e1, 0x56c6, 0x4469, 0x58e8, 0x7b54, 0x7ebb, 0x37cb, 0x39b9, 0x4627, 0x479a, 0x4bce, 0x34e9, 0x49d9, 0x3e55, 0x619c, 0x4795, 0x7baa, 0x47fe, 0x7c52, 0x485d, 0x2ea6, 0x2fe3, 0x33c8, 0x42b9, 0x472b, 0x4cab, 0x6fc4, 0x2fad, 0x5e6d, 0x7ebf, 0x2e07, 0x4162, 0x4e80, /* 0x14C21..0x14C7E */ 0x4f2b, 0x6513, 0x3473, 0x472a, 0x7b45, 0x3df3, 0x5b95, 0x3cac, 0x3bc6, 0x671c, 0x4e4a, 0x64d1, 0x5a14, 0x6108, 0x3999, 0x5c8d, 0x4c11, 0x5720, 0x32d9, 0x3922, 0x5121, 0x525f, 0x57db, 0x7727, 0x7d61, 0x490b, 0x3a7f, 0x3a18, 0x31a5, 0x340d, 0x347d, 0x460e, 0x56df, 0x6ff7, 0x7298, 0x7cf4, 0x39ea, 0x525d, 0x4ec5, 0x314d, 0x48c9, 0x5dbf, 0x5dec, 0x7762, 0x7eba, 0x4478, 0x4a21, 0x6302, 0x3984, 0x3b5f, 0x4bdb, 0x531b, 0x56f2, 0x5db2, 0x6017, 0x6499, 0x3132, 0x4728, 0x7ed9, 0x56ee, 0x4762, 0x32ff, 0x7905, 0x3c24, 0x423b, 0x5c7e, 0x6cb0, 0x354f, 0x40b6, 0x5d0b, 0x7580, 0x3301, 0x2e5f, 0x31b6, 0x391c, 0x523a, 0x6036, 0x71ce, 0x3f25, 0x57e2, 0x3384, 0x3f79, 0x5d04, 0x65ac, 0x6a33, 0x6e8d, 0x7756, 0x47f3, 0x65ae, 0x7453, 0x4109, 0x4108, 0x4cb9, 0x5652, /* 0x14D21..0x14D7E */ 0x6aed, 0x6f38, 0x352f, 0x2f51, 0x312a, 0x32c7, 0x33cb, 0x3ba5, 0x3e7d, 0x40a0, 0x4182, 0x43d6, 0x4709, 0x47da, 0x4e67, 0x4d8c, 0x5336, 0x5337, 0x5531, 0x5950, 0x68d5, 0x6a98, 0x704a, 0x7091, 0x70f5, 0x76c4, 0x678d, 0x3915, 0x2e88, 0x2f59, 0x2e0e, 0x6a89, 0x6f3f, 0x7810, 0x30ad, 0x3e7c, 0x3996, 0x3bb9, 0x3eb8, 0x43da, 0x43fa, 0x44c1, 0x46dc, 0x494a, 0x49d8, 0x4d0b, 0x4eb6, 0x5194, 0x5528, 0x5aaf, 0x5f8a, 0x6000, 0x6449, 0x64c9, 0x6981, 0x6b21, 0x6e0a, 0x7065, 0x767d, 0x790a, 0x417e, 0x4291, 0x4b32, 0x4c83, 0x4d74, 0x5fcc, 0x5ffc, 0x4dc0, 0x5f85, 0x67ba, 0x68f8, 0x4765, 0x63b1, 0x783c, 0x76f7, 0x4d1b, 0x5d61, 0x643d, 0x716a, 0x2e71, 0x3375, 0x3d50, 0x4b04, 0x4feb, 0x65cd, 0x662d, 0x69a7, 0x3229, 0x340f, 0x3c65, 0x474e, 0x48a8, 0x5406, 0x5483, /* 0x14E21..0x14E7E */ 0x55e2, 0x68cf, 0x68e1, 0x71cc, 0x76e2, 0x7678, 0x3f8b, 0x5387, 0x5acb, 0x644e, 0x43a0, 0x5565, 0x3289, 0x4d41, 0x4e9c, 0x5409, 0x5559, 0x586b, 0x5c92, 0x7686, 0x5adc, 0x7f8d, 0x2fb6, 0x416e, 0x45c5, 0x665c, 0x2e86, 0x2eae, 0x30da, 0x2e21, 0x31cc, 0x3bee, 0x4599, 0x4881, 0x4dbc, 0x531f, 0x5642, 0x57ad, 0x5a1c, 0x5ce7, 0x626f, 0x6ad2, 0x707c, 0x71cf, 0x7675, 0x7818, 0x329b, 0x5dd1, 0x302b, 0x3398, 0x4797, 0x4dcb, 0x51d0, 0x5433, 0x61e8, 0x6f2a, 0x76a3, 0x7c57, 0x7e9f, 0x5460, 0x3841, 0x4d99, 0x5d2f, 0x785e, 0x2ee4, 0x2f36, 0x2f8b, 0x31b7, 0x32b1, 0x3dba, 0x401c, 0x53b2, 0x593c, 0x62d3, 0x7234, 0x76b7, 0x76f6, 0x770a, 0x7e97, 0x7f62, 0x46a6, 0x4b74, 0x3217, 0x32a3, 0x50c8, 0x68c2, 0x3ec9, 0x404b, 0x4190, 0x4f23, 0x5149, 0x5c3e, 0x5df4, 0x606f, /* 0x14F21..0x14F7E */ 0x64ee, 0x7023, 0x732c, 0x3442, 0x7b6f, 0x4ad3, 0x5089, 0x6cc2, 0x6def, 0x7732, 0x32b4, 0x3a41, 0x3eca, 0x3f04, 0x4717, 0x497c, 0x4994, 0x4d6a, 0x4f0f, 0x5262, 0x52fc, 0x5bed, 0x6001, 0x607e, 0x674b, 0x70ce, 0x316d, 0x7e93, 0x5984, 0x608b, 0x7332, 0x6ad6, 0x302d, 0x348c, 0x6a71, 0x4b6a, 0x6cc4, 0x6107, 0x40d1, 0x47a0, 0x7df2, 0x2e99, 0x2e98, 0x7c10, 0x6a6b, 0x65c1, 0x6568, 0x4900, 0x4e7e, 0x5897, 0x6155, 0x8e9f, 0x3b41, 0x3b56, 0x3b7d, 0x3b93, 0x3bd8, 0x3bec, 0x3c12, 0x3c1e, 0x3c23, 0x3c2b, 0x178d, 0x3c62, 0x813b, 0x813c, 0x96b4, 0x3c7a, 0x3c8f, 0x3c9f, 0x3ca3, 0x3caa, 0x3cba, 0x3ccb, 0x3cd0, 0x3cd2, 0x3cf4, 0x9c34, 0x17e2, 0x3d0d, 0x3d27, 0x8111, 0x3d46, 0x3d47, 0x3d53, 0x3d4a, 0x3d6d, 0x3d81, 0x3da0, 0x3da4, 0x3da7, 0x3db8, 0x3dcb, 0x341e, /* 0x15021..0x1507E */ 0x3f0c, 0x2e10, 0x2e15, 0x2e2a, 0x2e31, 0x2e36, 0x2e3c, 0x2e3f, 0x2e42, 0x2e56, 0x2e58, 0x2e82, 0x2e85, 0x6c6b, 0x2e8a, 0x6212, 0x3f0d, 0x2e8e, 0x2e9e, 0x2e9f, 0x2ea0, 0x2ea2, 0x2eb0, 0x2eb3, 0x2eb6, 0x2ece, 0x2ecd, 0x2ec4, 0x2ec6, 0x2ec2, 0x2ed7, 0x2ede, 0x2eed, 0x2edf, 0x2ef7, 0x2f09, 0x2f5a, 0x2f30, 0x2f5b, 0x2f5d, 0x2f57, 0x2f47, 0x2f76, 0x2f88, 0x2f8f, 0x2f98, 0x2f7b, 0x2f69, 0x2f70, 0x2f91, 0x2f6f, 0x2f86, 0x2f96, 0x3118, 0x2fd4, 0x2fdf, 0x2fce, 0x2fd8, 0x2fdb, 0x2fd1, 0x2fda, 0x2fd0, 0x2fe4, 0x2fe5, 0x301a, 0x3028, 0x3014, 0x302a, 0x3025, 0x3005, 0x2f1c, 0x2ff6, 0x3021, 0x3029, 0x302c, 0x2ffe, 0x2fef, 0x3011, 0x3006, 0x3043, 0x3047, 0x4703, 0x3055, 0x3050, 0x3048, 0x305a, 0x3056, 0x306c, 0x3078, 0x3080, 0x309a, 0x3085, 0x30b4, 0x30b2, /* 0x15121..0x1517E */ 0x30c9, 0x30ca, 0x30b3, 0x30c2, 0x30d6, 0x30de, 0x30e5, 0x30ed, 0x30e3, 0x30ee, 0x30f9, 0x30f5, 0x3109, 0x3101, 0x3102, 0x3116, 0x3115, 0x3114, 0x311a, 0x3121, 0x313a, 0x3137, 0x313c, 0x313b, 0x313f, 0x3140, 0x3152, 0x314c, 0x3154, 0x3162, 0x5af8, 0x3169, 0x316a, 0x316e, 0x3180, 0x3182, 0x36d8, 0x318c, 0x3189, 0x318f, 0x3191, 0x3193, 0x3195, 0x3196, 0x31a4, 0x31a6, 0x31a2, 0x31a9, 0x31aa, 0x31ab, 0x31b3, 0x31b1, 0x31b2, 0x31b0, 0x31b5, 0x31bd, 0x31c5, 0x31c9, 0x31db, 0x31e0, 0x6655, 0x31e9, 0x31ed, 0x31f0, 0x31f5, 0x31fe, 0x3204, 0x320b, 0x3214, 0x320e, 0x3227, 0x322a, 0x322e, 0x3233, 0x3239, 0x324f, 0x3244, 0x324b, 0x324c, 0x325e, 0x3254, 0x326a, 0x3274, 0x3269, 0x3273, 0x327f, 0x327d, 0x328d, 0x3294, 0x3292, 0x3271, 0x3288, 0x3291, 0x6fa8, /* 0x15221..0x1527E */ 0x6fa7, 0x32ac, 0x32ad, 0x32bc, 0x32b5, 0x32c1, 0x32cd, 0x32d7, 0x32de, 0x32e3, 0x32e6, 0x78ed, 0x32e0, 0x32f3, 0x32f5, 0x32f8, 0x32f9, 0x3306, 0x3308, 0x5538, 0x330d, 0x3310, 0x330f, 0x3315, 0x331a, 0x3323, 0x332f, 0x3331, 0x3333, 0x3338, 0x3340, 0x3346, 0x3345, 0x2e17, 0x3349, 0x334d, 0x31d6, 0x335e, 0x3369, 0x336e, 0x3918, 0x337b, 0x3377, 0x3382, 0x3396, 0x33a0, 0x33a6, 0x33a5, 0x33ae, 0x33b0, 0x33b6, 0x33c3, 0x5c12, 0x76d9, 0x33df, 0x46fc, 0x51ee, 0x33ee, 0x33e8, 0x33ed, 0x33fa, 0x3401, 0x343d, 0x3440, 0x342c, 0x342d, 0x343c, 0x342e, 0x3436, 0x3429, 0x341d, 0x344e, 0x348f, 0x3475, 0x348e, 0x345f, 0x3471, 0x3477, 0x3470, 0x3492, 0x347b, 0x3480, 0x3476, 0x3484, 0x3490, 0x3486, 0x34c7, 0x34a2, 0x34b8, 0x34a5, 0x34ac, 0x34c4, 0x34c8, 0x34a8, /* 0x15321..0x1537E */ 0x34ab, 0x34c2, 0x34a4, 0x34be, 0x34bc, 0x34d8, 0x34e5, 0x34e6, 0x350f, 0x3514, 0x34fd, 0x34ee, 0x34ed, 0x34fa, 0x34e2, 0x3539, 0x3540, 0x3563, 0x354c, 0x352e, 0x355c, 0x3545, 0x3556, 0x3557, 0x3538, 0x3533, 0x355d, 0x3599, 0x3580, 0x34af, 0x358a, 0x359f, 0x357b, 0x357e, 0x3598, 0x359e, 0x35ae, 0x357c, 0x3583, 0x35a9, 0x3587, 0x35a8, 0x35da, 0x35c5, 0x35df, 0x35c4, 0x35dc, 0x35e4, 0x35d4, 0x3614, 0x35f7, 0x3616, 0x35fe, 0x35fd, 0x361b, 0x35f9, 0x364e, 0x3650, 0x51df, 0x3634, 0x3636, 0x3632, 0x3638, 0x366b, 0x3664, 0x362f, 0x366c, 0x366a, 0x3686, 0x3680, 0x368a, 0x36a0, 0x3694, 0x368f, 0x36a5, 0x36ae, 0x36b6, 0x36b4, 0x36c2, 0x36bc, 0x36c1, 0x36c3, 0x36c0, 0x36c8, 0x36ce, 0x36d1, 0x36d3, 0x36d7, 0x36ee, 0x36f9, 0x3700, 0x36ff, 0x3704, 0x3709, /* 0x15421..0x1547E */ 0x3708, 0x370b, 0x370d, 0x3713, 0x3718, 0x3716, 0x35c7, 0x371c, 0x3726, 0x3737, 0x3738, 0x374e, 0x373b, 0x3740, 0x374f, 0x3769, 0x37c0, 0x3788, 0x3761, 0x377f, 0x3789, 0x3793, 0x37a0, 0x37b3, 0x37a4, 0x37aa, 0x37b0, 0x37c3, 0x37c6, 0x37d4, 0x37d2, 0x37d3, 0x380a, 0x37d6, 0x37e3, 0x380b, 0x3819, 0x381d, 0x3872, 0x3821, 0x3862, 0x384b, 0x3870, 0x4bc0, 0x3852, 0x383d, 0x3879, 0x3885, 0x38b9, 0x389f, 0x38ab, 0x38ba, 0x38de, 0x38bb, 0x38b8, 0x38ae, 0x38c5, 0x38d3, 0x38d1, 0x38d7, 0x38d9, 0x38d8, 0x38e5, 0x38dc, 0x38e4, 0x38df, 0x38ef, 0x38fa, 0x38f9, 0x38fb, 0x38fc, 0x38fd, 0x3902, 0x390a, 0x3910, 0x391b, 0x48a6, 0x3925, 0x392c, 0x392d, 0x3932, 0x3938, 0x393e, 0x5ad2, 0x3955, 0x3950, 0x394e, 0x395a, 0x3958, 0x3962, 0x3960, 0x3967, 0x396c, 0x3969, /* 0x15521..0x1557E */ 0x3978, 0x3981, 0x399d, 0x2f5e, 0x2fab, 0x39a3, 0x39b2, 0x39c6, 0x39e8, 0x39dc, 0x398d, 0x39d9, 0x39da, 0x3a25, 0x3a1f, 0x3a11, 0x3a1c, 0x3a09, 0x3a1a, 0x3a40, 0x3a6c, 0x3a49, 0x3a35, 0x3a36, 0x3a62, 0x3a6a, 0x3a9a, 0x3abc, 0x3abe, 0x3acb, 0x3ac2, 0x3abd, 0x3ae3, 0x3ad7, 0x3ae6, 0x3ae9, 0x3ad6, 0x3afa, 0x3afb, 0x3b0c, 0x3b0b, 0x3b16, 0x3b32, 0x3ad0, 0x3b2a, 0x3b36, 0x3b3e, 0x3b43, 0x3b45, 0x3b40, 0x3b51, 0x3b55, 0x3b5a, 0x3b5b, 0x3b65, 0x3b69, 0x3b70, 0x3b73, 0x3b75, 0x3b78, 0x4588, 0x3b7a, 0x3b80, 0x3b83, 0x3ba6, 0x3bb8, 0x3bc3, 0x3bc7, 0x3bc9, 0x3bd4, 0x3bd0, 0x3be4, 0x3be6, 0x3be2, 0x3bde, 0x3be5, 0x3beb, 0x3bf0, 0x3bf6, 0x3bf3, 0x3c05, 0x3c07, 0x3c08, 0x3c0d, 0x3c13, 0x3c20, 0x3c22, 0x3c28, 0x3c38, 0x3c39, 0x3c41, 0x3c46, 0x3c4e, 0x3c53, /* 0x15621..0x1567E */ 0x3c50, 0x3c4f, 0x3b71, 0x3c6c, 0x3c6e, 0x2e62, 0x3c76, 0x3c79, 0x3c8c, 0x3c91, 0x3c94, 0x399b, 0x3cab, 0x3cbb, 0x3cb6, 0x3cbc, 0x3cb7, 0x3cc5, 0x3cbe, 0x3cc7, 0x3cd9, 0x3ce9, 0x3cfd, 0x3cfa, 0x3ced, 0x3d8c, 0x3cea, 0x3d0b, 0x3d15, 0x3d17, 0x3d5c, 0x3d1f, 0x3d1b, 0x3d11, 0x3d14, 0x3d22, 0x3d1a, 0x3d19, 0x3d18, 0x3d4c, 0x3d52, 0x3d4e, 0x3d4b, 0x3d6c, 0x3d73, 0x3d76, 0x3d87, 0x3d84, 0x3d82, 0x3da2, 0x3d9d, 0x3dac, 0x3dae, 0x3dbd, 0x3d90, 0x3db7, 0x3dbc, 0x3dc9, 0x3dcd, 0x3dd3, 0x3dd2, 0x3dd6, 0x3ddb, 0x3deb, 0x3df2, 0x3df5, 0x3e0b, 0x3e1a, 0x3e19, 0x3e11, 0x3e1b, 0x3e36, 0x3e37, 0x3e44, 0x3e43, 0x3e40, 0x3e4e, 0x3e57, 0x3e54, 0x3e5f, 0x3e62, 0x3e64, 0x3e47, 0x3e75, 0x3e76, 0x3e7a, 0x7ebc, 0x3e7f, 0x3ea0, 0x3ec1, 0x3ec2, 0x3ec8, 0x3ed0, 0x3ecf, /* 0x15721..0x1577E */ 0x3ed6, 0x3ee3, 0x3edd, 0x3eda, 0x3edb, 0x3ee2, 0x3ee1, 0x3ee8, 0x3ee9, 0x3eec, 0x3ef1, 0x3ef3, 0x3ef0, 0x3ef4, 0x3ef8, 0x3efe, 0x3f03, 0x3f09, 0x3f5d, 0x3f5c, 0x3f0b, 0x3f11, 0x3f16, 0x3f29, 0x3f2d, 0x3f38, 0x3f41, 0x3f48, 0x3f4c, 0x3f4e, 0x3f2f, 0x3f51, 0x3f56, 0x3f57, 0x3f59, 0x3f61, 0x3f6d, 0x3f73, 0x3f77, 0x3f83, 0x3f82, 0x3f7f, 0x3f8a, 0x3f88, 0x3f91, 0x3f87, 0x3f9e, 0x3f99, 0x3f98, 0x3fa0, 0x3fa8, 0x3fad, 0x3fbc, 0x3fd6, 0x3ffb, 0x3fe4, 0x3ff8, 0x3ff1, 0x3fdd, 0x40b3, 0x3fff, 0x4021, 0x4060, 0x4019, 0x4010, 0x4029, 0x400e, 0x4031, 0x401b, 0x4015, 0x402b, 0x4026, 0x400f, 0x403a, 0x405a, 0x4041, 0x406a, 0x4077, 0x405f, 0x404a, 0x4046, 0x404d, 0x4063, 0x4043, 0x4064, 0x4042, 0x406c, 0x406b, 0x4059, 0x4081, 0x408d, 0x40e7, 0x4083, 0x409a, /* 0x15821..0x1587E */ 0x4084, 0x409b, 0x4096, 0x4097, 0x4092, 0x40a7, 0x408b, 0x40e1, 0x40b8, 0x40e0, 0x40d3, 0x40b4, 0x3ff0, 0x40bd, 0x40c6, 0x40b5, 0x40d8, 0x414d, 0x4115, 0x4106, 0x40f6, 0x40f7, 0x4100, 0x40f4, 0x40fa, 0x4103, 0x4121, 0x40fb, 0x40f1, 0x410d, 0x410e, 0x4147, 0x413e, 0x4128, 0x4127, 0x414a, 0x413f, 0x413c, 0x412c, 0x4134, 0x413d, 0x4142, 0x4144, 0x4173, 0x4177, 0x4158, 0x4159, 0x415a, 0x416b, 0x4174, 0x416f, 0x4165, 0x4171, 0x415f, 0x415d, 0x4153, 0x4175, 0x4199, 0x4196, 0x4187, 0x41ac, 0x4194, 0x419a, 0x418a, 0x4191, 0x41ab, 0x41ae, 0x41cc, 0x41ca, 0x41c9, 0x41f7, 0x41c8, 0x41c3, 0x41c6, 0x41ba, 0x41cb, 0x5f79, 0x41cd, 0x41e6, 0x41e3, 0x41f6, 0x41fa, 0x41f4, 0x41ff, 0x41fd, 0x41fc, 0x41fe, 0x4200, 0x4208, 0x4209, 0x420d, 0x420c, 0x4214, 0x421b, /* 0x15921..0x1597E */ 0x421e, 0x4221, 0x422a, 0x422e, 0x4230, 0x4232, 0x4233, 0x4241, 0x424e, 0x425e, 0x4263, 0x425b, 0x4260, 0x4268, 0x427c, 0x4282, 0x4289, 0x427e, 0x4292, 0x4293, 0x4296, 0x42d4, 0x4283, 0x4294, 0x42d7, 0x42d1, 0x42bb, 0x42cf, 0x42ff, 0x42c6, 0x44d4, 0x42c8, 0x42dc, 0x42cc, 0x42ca, 0x42c2, 0x42c7, 0x429b, 0x42c9, 0x430c, 0x42ee, 0x42f1, 0x4327, 0x4302, 0x4308, 0x42ef, 0x42f5, 0x4350, 0x433e, 0x434d, 0x441c, 0x434f, 0x4396, 0x438e, 0x4380, 0x43ab, 0x4376, 0x43a3, 0x438f, 0x4389, 0x439f, 0x43b5, 0x436b, 0x4369, 0x43be, 0x43e9, 0x43c0, 0x43c6, 0x43e3, 0x43c9, 0x43d2, 0x43f6, 0x43c4, 0x4416, 0x4434, 0x4406, 0x4413, 0x4426, 0x4436, 0x451d, 0x4417, 0x4428, 0x440f, 0x4467, 0x446f, 0x4476, 0x444e, 0x452a, 0x4495, 0x4493, 0x44a5, 0x44a9, 0x4488, 0x44bc, /* 0x15A21..0x15A7E */ 0x44da, 0x44d2, 0x44c5, 0x44c7, 0x44bb, 0x44d8, 0x44c2, 0x44f1, 0x44e7, 0x6209, 0x44e0, 0x44e1, 0x42ac, 0x44e3, 0x44ef, 0x452c, 0x44f6, 0x44f4, 0x44f2, 0x44fa, 0x4500, 0x44fd, 0x4518, 0x451c, 0x4505, 0x4524, 0x4523, 0x452b, 0x4534, 0x4535, 0x4537, 0x4536, 0x4538, 0x554b, 0x4548, 0x4556, 0x4555, 0x454d, 0x4558, 0x455e, 0x455d, 0x4572, 0x4578, 0x4582, 0x4583, 0x6b8a, 0x459b, 0x459f, 0x45ab, 0x45b7, 0x45c3, 0x45c6, 0x45c1, 0x45c4, 0x45cc, 0x45d2, 0x45db, 0x45d9, 0x45e0, 0x45e1, 0x45f1, 0x4772, 0x460a, 0x4603, 0x45fb, 0x4773, 0x4635, 0x4636, 0x4634, 0x461c, 0x464f, 0x4644, 0x4649, 0x4641, 0x465e, 0x465d, 0x4664, 0x4667, 0x4668, 0x465f, 0x4662, 0x4670, 0x4683, 0x4688, 0x468e, 0x4689, 0x4684, 0x4698, 0x469d, 0x46c1, 0x46b9, 0x46c9, 0x46be, 0x46bc, /* 0x15B21..0x15B7E */ 0x46c4, 0x46b8, 0x46d6, 0x46da, 0x46e0, 0x463f, 0x46e6, 0x46e9, 0x46f0, 0x46f5, 0x46f7, 0x470f, 0x4716, 0x471e, 0x4726, 0x4727, 0x7738, 0x472e, 0x473f, 0x4736, 0x4741, 0x4738, 0x4737, 0x4746, 0x475e, 0x4760, 0x4759, 0x4763, 0x4764, 0x4789, 0x4770, 0x47a9, 0x477c, 0x476a, 0x478c, 0x478b, 0x47a6, 0x47a1, 0x4785, 0x47b7, 0x47ef, 0x47b4, 0x47ec, 0x47b3, 0x47e9, 0x47b8, 0x47e4, 0x47de, 0x47dd, 0x47e2, 0x47ee, 0x47b9, 0x47ce, 0x47c6, 0x47e7, 0x4a9c, 0x481e, 0x4846, 0x4829, 0x4840, 0x484d, 0x4832, 0x484e, 0x48b3, 0x482b, 0x4859, 0x4863, 0x4877, 0x487f, 0x489f, 0x488f, 0x48ad, 0x4894, 0x489d, 0x489b, 0x4883, 0x4aae, 0x48b9, 0x4874, 0x48b5, 0x48a0, 0x48ba, 0x490f, 0x488d, 0x487e, 0x4901, 0x48ca, 0x4908, 0x48d8, 0x4922, 0x4926, 0x48e1, 0x490c, 0x48cd, /* 0x15C21..0x15C7E */ 0x48d4, 0x48e7, 0x48d5, 0x4936, 0x4912, 0x4904, 0x48d7, 0x48e3, 0x4925, 0x48f9, 0x48e0, 0x48ef, 0x4928, 0x492a, 0x491a, 0x4923, 0x4921, 0x48c6, 0x4979, 0x4977, 0x495c, 0x4978, 0x496b, 0x4954, 0x497e, 0x496e, 0x4939, 0x4974, 0x493d, 0x4959, 0x4930, 0x4961, 0x495e, 0x495d, 0x4981, 0x496a, 0x49b2, 0x49ae, 0x49d0, 0x49bf, 0x49c1, 0x49d3, 0x49be, 0x49ce, 0x3be8, 0x49ca, 0x49dd, 0x49bb, 0x49c3, 0x49a7, 0x4a2e, 0x4991, 0x49a0, 0x499c, 0x4995, 0x49b4, 0x49de, 0x49e8, 0x4a02, 0x4a1b, 0x49ff, 0x4b0a, 0x49f9, 0x49f2, 0x49e7, 0x4a05, 0x49b1, 0x4a1e, 0x49ed, 0x4a14, 0x49eb, 0x4a0a, 0x4a12, 0x4ac1, 0x4a23, 0x4a13, 0x4a44, 0x4a0c, 0x4a72, 0x4a36, 0x4a78, 0x4a47, 0x4a62, 0x4a59, 0x4a66, 0x4a48, 0x4a38, 0x4a22, 0x4a90, 0x4a8d, 0x4aa0, 0x4a84, 0x4aa2, 0x4aa3, /* 0x15D21..0x15D7E */ 0x4a97, 0x6617, 0x4abb, 0x4ac3, 0x4ac2, 0x4ab8, 0x4ab3, 0x4aac, 0x4ade, 0x4ad1, 0x4adf, 0x4aaa, 0x4ada, 0x4aea, 0x4afb, 0x4b05, 0x6616, 0x4afa, 0x4b12, 0x4b16, 0x7b31, 0x4b1f, 0x4b38, 0x4b37, 0x56dc, 0x4b39, 0x78ee, 0x4b47, 0x4b43, 0x4b49, 0x4b50, 0x4b59, 0x4b54, 0x4b5b, 0x4b5f, 0x4b61, 0x4b78, 0x4b79, 0x4b7f, 0x4b80, 0x4b84, 0x4b83, 0x4b8d, 0x4b98, 0x4b95, 0x4b9e, 0x4ba4, 0x4baa, 0x4bab, 0x4baf, 0x4bb2, 0x4bb1, 0x4bb3, 0x4bb7, 0x4bbc, 0x4bc6, 0x4bcb, 0x4bd3, 0x4bdf, 0x4bec, 0x4beb, 0x4bf3, 0x4bef, 0x7ebe, 0x4c08, 0x4c13, 0x4c14, 0x4c1b, 0x4c24, 0x4c23, 0x4c5e, 0x4c55, 0x4c62, 0x4c6a, 0x4c82, 0x4c8d, 0x4c9a, 0x4c81, 0x4c9b, 0x4c7e, 0x4c68, 0x4c73, 0x4c92, 0x4c90, 0x4cc4, 0x4cf1, 0x4cd3, 0x4cbd, 0x4cd7, 0x4cc5, 0x4cdd, 0x4cae, 0x4cb1, 0x4cbe, /* 0x15E21..0x15E7E */ 0x4cba, 0x4cdb, 0x4cef, 0x4cd9, 0x4cea, 0x4d1f, 0x684d, 0x4d36, 0x4d2b, 0x4d3d, 0x4d38, 0x4d19, 0x4d35, 0x4d33, 0x4d12, 0x4d0c, 0x4d63, 0x4d93, 0x4d64, 0x4d5a, 0x4d79, 0x4d59, 0x4d8e, 0x4d95, 0x4fe4, 0x4d85, 0x4df9, 0x4e15, 0x4e0a, 0x4db5, 0x4dc7, 0x4de6, 0x4db8, 0x4dc6, 0x4dec, 0x4dde, 0x4dcc, 0x4de8, 0x4dd2, 0x4dc5, 0x4dfa, 0x4dd9, 0x4de4, 0x4dd5, 0x4dea, 0x4dee, 0x4e2d, 0x4e6e, 0x4e2e, 0x4e19, 0x4e72, 0x4e5f, 0x4e3e, 0x4e23, 0x4e6b, 0x4e2b, 0x4e76, 0x4e4d, 0x4e1f, 0x4e43, 0x4e3a, 0x4e4e, 0x4e24, 0x4eff, 0x4e1d, 0x4e38, 0x4e82, 0x4eaa, 0x4e98, 0x4ec9, 0x4eb7, 0x4ed3, 0x4ebd, 0x4eaf, 0x4ec4, 0x4eb2, 0x4ed4, 0x4ed5, 0x4e8f, 0x4ea5, 0x4ec2, 0x4e9f, 0x4f41, 0x4f11, 0x504c, 0x4eec, 0x4ef8, 0x4efe, 0x4f3f, 0x4ef2, 0x4f31, 0x4eef, 0x4f32, 0x4ecc, /* 0x15F21..0x15F7E */ 0x4f3e, 0x4f13, 0x4ef7, 0x4f86, 0x4f7a, 0x4f78, 0x4f81, 0x4f80, 0x4f6f, 0x4f5b, 0x4ff3, 0x4f6d, 0x4f82, 0x4f7c, 0x4f58, 0x4f8e, 0x4f91, 0x4fc2, 0x4f66, 0x4fb3, 0x4fa3, 0x4fa1, 0x4fa4, 0x4fb9, 0x4fc6, 0x4faa, 0x4fdf, 0x4fd5, 0x4fec, 0x4fd4, 0x4fd8, 0x4ff1, 0x4fee, 0x4fdb, 0x5009, 0x500b, 0x4ffa, 0x5011, 0x5001, 0x500f, 0x4ffe, 0x501b, 0x501a, 0x4f74, 0x501d, 0x5018, 0x501f, 0x5030, 0x503e, 0x5032, 0x5051, 0x5063, 0x5099, 0x5092, 0x50af, 0x50f1, 0x50ac, 0x50b8, 0x50b3, 0x50ae, 0x50df, 0x50cb, 0x50dd, 0x50d9, 0x5109, 0x50fd, 0x511c, 0x5119, 0x5165, 0x5155, 0x5188, 0x5166, 0x5162, 0x514c, 0x5156, 0x516c, 0x518f, 0x51fb, 0x5184, 0x5195, 0x51a8, 0x51ac, 0x51d7, 0x51b9, 0x51be, 0x51d2, 0x51c9, 0x51d4, 0x51ce, 0x51e0, 0x51ec, 0x51e7, 0x51f5, 0x51fc, /* 0x16021..0x1607E */ 0x51f9, 0x51ff, 0x520d, 0x5210, 0x521b, 0x5228, 0x522d, 0x522c, 0x5230, 0x5232, 0x523b, 0x523c, 0x523f, 0x5240, 0x5246, 0x524b, 0x5258, 0x5274, 0x527e, 0x5282, 0x5281, 0x5287, 0x5292, 0x5296, 0x52a2, 0x52a7, 0x52b9, 0x52b2, 0x52c3, 0x52c6, 0x52c4, 0x52ce, 0x52d2, 0x52e2, 0x52e0, 0x52e1, 0x52f9, 0x52f7, 0x300f, 0x5317, 0x530a, 0x531c, 0x5316, 0x531d, 0x5334, 0x532f, 0x5329, 0x5325, 0x533e, 0x534e, 0x534f, 0x7ed8, 0x5357, 0x536a, 0x5368, 0x5370, 0x5378, 0x5375, 0x537b, 0x537a, 0x53c8, 0x53b3, 0x53ce, 0x53bb, 0x53c0, 0x53e5, 0x53ee, 0x53de, 0x54a2, 0x5405, 0x546f, 0x5425, 0x53f8, 0x5432, 0x543a, 0x5455, 0x543f, 0x545f, 0x5459, 0x5441, 0x545c, 0x5469, 0x5470, 0x5463, 0x546a, 0x5476, 0x547e, 0x548b, 0x549e, 0x54a7, 0x54ca, 0x54cf, 0x54d4, 0x53f1, /* 0x16121..0x1617E */ 0x54e0, 0x54e3, 0x54e7, 0x54e9, 0x54ee, 0x54f2, 0x54f0, 0x54f1, 0x54f8, 0x54f7, 0x5504, 0x5503, 0x5505, 0x550c, 0x550e, 0x550d, 0x5515, 0x5513, 0x551e, 0x5526, 0x552c, 0x553c, 0x5544, 0x554d, 0x554a, 0x5549, 0x555b, 0x5546, 0x555a, 0x5569, 0x5564, 0x5567, 0x556b, 0x556d, 0x5578, 0x5576, 0x5586, 0x5587, 0x5574, 0x558a, 0x5589, 0x5582, 0x5594, 0x559a, 0x559d, 0x55a5, 0x55a3, 0x55c2, 0x55b3, 0x55c3, 0x55b5, 0x55bd, 0x55b8, 0x55bc, 0x55b1, 0x55cd, 0x55ca, 0x55d2, 0x55d9, 0x55e3, 0x55de, 0x55fe, 0x55ff, 0x55fc, 0x5601, 0x55f0, 0x55fa, 0x55f2, 0x55f3, 0x560b, 0x560d, 0x5609, 0x561f, 0x5627, 0x5620, 0x5621, 0x5622, 0x5624, 0x5634, 0x5630, 0x563b, 0x5647, 0x5648, 0x5646, 0x565c, 0x5658, 0x5661, 0x5662, 0x5668, 0x5669, 0x566a, 0x5667, 0x566c, 0x5670, /* 0x16221..0x1627E */ 0x5672, 0x5676, 0x5678, 0x567c, 0x5680, 0x5683, 0x5688, 0x568b, 0x568e, 0x5696, 0x5693, 0x5699, 0x569a, 0x56b0, 0x56b4, 0x56b8, 0x56b9, 0x56ba, 0x56c2, 0x56cd, 0x56d6, 0x56d2, 0x56de, 0x56e1, 0x56e5, 0x56e7, 0x56ea, 0x662f, 0x56fb, 0x5708, 0x5707, 0x5704, 0x5729, 0x5724, 0x571e, 0x5725, 0x5726, 0x571b, 0x5737, 0x5738, 0x5747, 0x575a, 0x5768, 0x576b, 0x575b, 0x5765, 0x577f, 0x577e, 0x5779, 0x578e, 0x578b, 0x5791, 0x57a0, 0x579e, 0x57b0, 0x57b6, 0x57b9, 0x57bf, 0x57bc, 0x57bd, 0x57bb, 0x57c7, 0x57cd, 0x57d7, 0x57da, 0x57dc, 0x57e3, 0x57ee, 0x57fc, 0x580c, 0x5812, 0x5926, 0x5820, 0x592a, 0x5845, 0x588e, 0x5874, 0x5886, 0x587c, 0x589a, 0x588c, 0x58a3, 0x58b5, 0x58aa, 0x58af, 0x58d1, 0x58c6, 0x58cb, 0x58d4, 0x58be, 0x58bc, 0x58c5, 0x58ca, 0x58ec, /* 0x16321..0x1637E */ 0x58e7, 0x58da, 0x58fd, 0x58f4, 0x5907, 0x5912, 0x5911, 0x5919, 0x592c, 0x592b, 0x5940, 0x5960, 0x5957, 0x595f, 0x595a, 0x5955, 0x5953, 0x597a, 0x597f, 0x598a, 0x599d, 0x59a7, 0x7f4b, 0x59aa, 0x59ae, 0x59b3, 0x59b9, 0x59ba, 0x59c9, 0x59d5, 0x59e7, 0x59ec, 0x59e1, 0x59e3, 0x5a08, 0x5a0d, 0x5a18, 0x5a19, 0x5a20, 0x5a1f, 0x5980, 0x5a31, 0x5a3b, 0x5a3e, 0x5a37, 0x5a43, 0x5a57, 0x5a49, 0x5a61, 0x5a62, 0x5a69, 0x7f9d, 0x5a70, 0x5a79, 0x5a7d, 0x5a88, 0x5a97, 0x5a95, 0x5a98, 0x5a96, 0x5aa9, 0x5ac8, 0x5ab0, 0x5ab6, 0x5ac5, 0x5ac4, 0x5abf, 0x7083, 0x5ac7, 0x5aca, 0x5acd, 0x5acf, 0x5ad5, 0x5ad3, 0x5ad9, 0x5ada, 0x5add, 0x5ae1, 0x5ae2, 0x5ae6, 0x5aed, 0x5af0, 0x5b02, 0x5b0f, 0x5b0a, 0x5b06, 0x5b33, 0x5b18, 0x5b19, 0x5b1e, 0x5b35, 0x5b28, 0x5b36, 0x5b50, /* 0x16421..0x1647E */ 0x5b7a, 0x5b04, 0x5b4d, 0x5b0b, 0x5b4c, 0x5b45, 0x5b75, 0x5b65, 0x5b74, 0x5b67, 0x5b70, 0x5b71, 0x5b6c, 0x5b6e, 0x5b9d, 0x5b98, 0x5b9f, 0x5b8d, 0x5b9c, 0x5b9a, 0x5b8b, 0x5b92, 0x5b8f, 0x5b5d, 0x5b99, 0x5bcb, 0x5bc1, 0x5bcc, 0x5bcf, 0x5bb4, 0x5bc6, 0x5bdd, 0x5be9, 0x5c11, 0x5c14, 0x5be6, 0x5be5, 0x5c60, 0x5c00, 0x5c07, 0x5c13, 0x5bf3, 0x5bf7, 0x5c17, 0x5c0d, 0x5bf6, 0x5c23, 0x5c27, 0x5c2a, 0x5c1f, 0x5c37, 0x5c2b, 0x5c3d, 0x5c4c, 0x5c43, 0x5c54, 0x5c4f, 0x5c40, 0x5c50, 0x5c58, 0x5c5f, 0x5c64, 0x5c56, 0x5c65, 0x5c6c, 0x5c75, 0x5c83, 0x5c90, 0x5ca4, 0x5cad, 0x5ca2, 0x5cab, 0x5ca1, 0x5ca8, 0x5cb3, 0x5cb2, 0x5cb1, 0x5cae, 0x5cb9, 0x5cbd, 0x5cc0, 0x5cc5, 0x5cc2, 0x5cd8, 0x5cd2, 0x5cdc, 0x5ce2, 0x7b3b, 0x5cef, 0x5cf2, 0x5cf4, 0x5cf6, 0x5cfa, 0x5d06, /* 0x16521..0x1657E */ 0x5d02, 0x5d1c, 0x5d15, 0x5d0a, 0x5d45, 0x5d4b, 0x5d2e, 0x5d32, 0x5d3f, 0x5d35, 0x5d46, 0x5d73, 0x5d56, 0x5d4e, 0x5d72, 0x5d68, 0x5d6e, 0x5d4f, 0x5d63, 0x5d93, 0x5d89, 0x5d5b, 0x5d8f, 0x5d7d, 0x5d9b, 0x5dba, 0x5dae, 0x5da3, 0x5db5, 0x5dc7, 0x5dbd, 0x5dab, 0x5e3d, 0x5da2, 0x5daf, 0x5ddc, 0x5db8, 0x5d9f, 0x5db0, 0x5dd8, 0x5ddd, 0x5de4, 0x5dde, 0x5dfb, 0x5df2, 0x5de1, 0x5e05, 0x5e0a, 0x5e23, 0x5e21, 0x5e12, 0x5e31, 0x5e1f, 0x5e09, 0x5e0b, 0x5e22, 0x5e46, 0x5e66, 0x5e3b, 0x5e35, 0x5e39, 0x5e43, 0x5e37, 0x5e32, 0x5e3a, 0x5e67, 0x5e5d, 0x5e56, 0x5e5e, 0x5e59, 0x5e5a, 0x5e79, 0x5e6a, 0x5e69, 0x5e7c, 0x5e7b, 0x5e83, 0x5dd5, 0x5e7d, 0x6fae, 0x5e7f, 0x5e88, 0x5e89, 0x5e8c, 0x5e92, 0x5e90, 0x5e93, 0x5e94, 0x5e96, 0x5e8e, 0x5e9b, 0x5e9c, 0x5f38, 0x5f3a, /* 0x16621..0x1667E */ 0x5f45, 0x5f4c, 0x5f4d, 0x5f4e, 0x5f50, 0x5f51, 0x5f55, 0x5f54, 0x5f58, 0x5f5f, 0x5f60, 0x5f68, 0x5f69, 0x5f67, 0x5f78, 0x5f82, 0x5f86, 0x5f83, 0x5f88, 0x5f87, 0x5f8c, 0x5f94, 0x5f9e, 0x5f9d, 0x5f9a, 0x5fa3, 0x5faf, 0x5fb2, 0x5fb9, 0x5fae, 0x5fb6, 0x5fb8, 0x6b71, 0x5fc5, 0x5fc6, 0x5fca, 0x5fd5, 0x5fd4, 0x5fe1, 0x5fe6, 0x5fe9, 0x5ff3, 0x5ff9, 0x78dc, 0x6006, 0x6004, 0x600b, 0x6012, 0x6018, 0x6019, 0x601c, 0x6021, 0x6028, 0x603f, 0x603b, 0x604a, 0x6046, 0x6052, 0x6058, 0x605a, 0x605f, 0x6062, 0x6068, 0x6073, 0x6072, 0x6070, 0x6076, 0x6079, 0x607d, 0x607f, 0x6084, 0x6086, 0x6085, 0x609b, 0x6093, 0x609a, 0x60ad, 0x3190, 0x60ac, 0x60db, 0x60e5, 0x60d9, 0x60dd, 0x60c4, 0x60da, 0x60d6, 0x6109, 0x60ef, 0x60f1, 0x611b, 0x6129, 0x6123, 0x612f, 0x614b, /* 0x16721..0x1677E */ 0x768b, 0x6146, 0x613e, 0x6153, 0x6151, 0x60fc, 0x6171, 0x616e, 0x6165, 0x6166, 0x6174, 0x6183, 0x6188, 0x618a, 0x6180, 0x6182, 0x61a0, 0x6195, 0x61a4, 0x61a3, 0x615f, 0x6193, 0x61a9, 0x61b0, 0x61b5, 0x61be, 0x61b8, 0x61bd, 0x61c0, 0x61c2, 0x61ba, 0x61c9, 0x61cd, 0x61d1, 0x61d9, 0x61d8, 0x61c8, 0x61da, 0x61df, 0x61e0, 0x61e7, 0x61fa, 0x61fb, 0x61fe, 0x6201, 0x6202, 0x6205, 0x6207, 0x620a, 0x620d, 0x6210, 0x6216, 0x6229, 0x622b, 0x6238, 0x6233, 0x6240, 0x6259, 0x6258, 0x625d, 0x625a, 0x625f, 0x6264, 0x6262, 0x6268, 0x626a, 0x626b, 0x622e, 0x6271, 0x6277, 0x6278, 0x627e, 0x628d, 0x6292, 0x62ab, 0x629f, 0x62bb, 0x62ac, 0x62e1, 0x62e3, 0x62df, 0x62d2, 0x62f4, 0x62f3, 0x62fa, 0x6393, 0x6303, 0x62fb, 0x62f9, 0x62de, 0x6306, 0x62dc, 0x6309, 0x62d9, /* 0x16821..0x1687E */ 0x6335, 0x6334, 0x6316, 0x6332, 0x6331, 0x6340, 0x6339, 0x6350, 0x6345, 0x632f, 0x632b, 0x6317, 0x6318, 0x6385, 0x639a, 0x63aa, 0x639f, 0x63a2, 0x6396, 0x6323, 0x638e, 0x6387, 0x638a, 0x637c, 0x63b5, 0x6373, 0x6375, 0x63a0, 0x6389, 0x63a8, 0x63f4, 0x6413, 0x63eb, 0x63ce, 0x63fd, 0x6403, 0x63d8, 0x640b, 0x63c1, 0x63f7, 0x6407, 0x63e0, 0x63f2, 0x640d, 0x6422, 0x6420, 0x63bd, 0x6438, 0x6506, 0x63fb, 0x646d, 0x642a, 0x643c, 0x655a, 0x6484, 0x6477, 0x646b, 0x64ad, 0x646e, 0x6482, 0x6469, 0x6446, 0x642c, 0x646f, 0x6479, 0x6435, 0x64ca, 0x6462, 0x64b9, 0x64bf, 0x649f, 0x64d9, 0x64cd, 0x64bb, 0x64da, 0x64d0, 0x64c1, 0x64c6, 0x64d6, 0x64a1, 0x6521, 0x64ff, 0x64f4, 0x6517, 0x6518, 0x652c, 0x651f, 0x6515, 0x6514, 0x64fc, 0x6540, 0x6563, 0x6558, 0x6548, /* 0x16921..0x1697E */ 0x6541, 0x6602, 0x654b, 0x6555, 0x6580, 0x65a4, 0x6588, 0x6591, 0x658a, 0x65a8, 0x656d, 0x6594, 0x659b, 0x65ea, 0x6587, 0x659c, 0x6577, 0x657e, 0x6590, 0x65c9, 0x65ba, 0x65cf, 0x65b9, 0x65d0, 0x65d5, 0x65dd, 0x65e5, 0x65dc, 0x65f9, 0x660a, 0x6613, 0x660b, 0x65fe, 0x65fa, 0x6606, 0x6622, 0x661a, 0x6630, 0x663f, 0x664d, 0x2e55, 0x6654, 0x665f, 0x6667, 0x6671, 0x6693, 0x66a3, 0x66a9, 0x66aa, 0x668b, 0x668c, 0x66b6, 0x66af, 0x66c4, 0x66c6, 0x66b0, 0x66c9, 0x6823, 0x66ab, 0x66d4, 0x66de, 0x66e9, 0x66ec, 0x66df, 0x66db, 0x66ef, 0x6712, 0x6706, 0x6708, 0x6700, 0x6703, 0x66fb, 0x6711, 0x6709, 0x670d, 0x66f9, 0x670a, 0x6734, 0x673f, 0x6737, 0x673b, 0x6725, 0x6729, 0x671a, 0x6760, 0x675f, 0x6778, 0x674c, 0x674e, 0x6774, 0x6757, 0x6768, 0x676e, 0x6759, /* 0x16A21..0x16A7E */ 0x6753, 0x6763, 0x676a, 0x6805, 0x67a2, 0x679f, 0x6782, 0x67af, 0x67cb, 0x67bd, 0x67c0, 0x67d0, 0x76d6, 0x67ab, 0x67c4, 0x67b3, 0x67c7, 0x67c6, 0x67bb, 0x67ef, 0x67f2, 0x67e0, 0x680f, 0x680d, 0x67fe, 0x67f6, 0x67f7, 0x680e, 0x67d2, 0x6811, 0x6816, 0x6815, 0x6822, 0x6821, 0x6831, 0x6836, 0x6839, 0x6827, 0x683b, 0x6844, 0x6842, 0x6852, 0x6859, 0x685e, 0x6862, 0x686b, 0x6881, 0x687e, 0x689e, 0x6875, 0x687d, 0x68b5, 0x6872, 0x6882, 0x6897, 0x6892, 0x68ae, 0x6899, 0x68a2, 0x688d, 0x68a4, 0x68b0, 0x68bf, 0x68b1, 0x68c3, 0x68c4, 0x68d4, 0x68d8, 0x68d9, 0x68dd, 0x68f9, 0x6902, 0x68fc, 0x68f4, 0x68e8, 0x68f2, 0x6904, 0x690c, 0x690a, 0x6913, 0x6943, 0x691e, 0x6925, 0x692a, 0x692b, 0x6941, 0x6944, 0x693b, 0x6936, 0x6938, 0x694c, 0x691d, 0x6960, 0x695e, /* 0x16B21..0x16B7E */ 0x6966, 0x6964, 0x696d, 0x696a, 0x696f, 0x6974, 0x6977, 0x697e, 0x6983, 0x6988, 0x698a, 0x6993, 0x6998, 0x69a1, 0x69a9, 0x69a6, 0x69ac, 0x69af, 0x69b2, 0x69ba, 0x69bd, 0x69bf, 0x69c0, 0x69da, 0x69dc, 0x69dd, 0x69e7, 0x69f4, 0x69f8, 0x6a03, 0x6a16, 0x6a10, 0x6a0c, 0x6a1b, 0x6a1d, 0x6a25, 0x6a36, 0x6a41, 0x6a5b, 0x6a52, 0x6a46, 0x6a48, 0x6a7c, 0x6a6d, 0x6a6c, 0x6a62, 0x6a85, 0x6a82, 0x6a84, 0x6aa8, 0x6aa1, 0x6a91, 0x6aa5, 0x6aa6, 0x6a9a, 0x6aa3, 0x6ac4, 0x6acd, 0x6ac2, 0x6ada, 0x6aeb, 0x6af3, 0x6ae7, 0x6ae4, 0x6af1, 0x6b14, 0x6ae0, 0x6ae2, 0x6af7, 0x6ade, 0x6adb, 0x6b0c, 0x6b07, 0x6b1a, 0x6ae1, 0x6b16, 0x6b10, 0x6b17, 0x6b20, 0x6b33, 0x77ab, 0x6b26, 0x6b2b, 0x6b3e, 0x6b28, 0x6b41, 0x6b4c, 0x6b4f, 0x6b4e, 0x6b49, 0x6b56, 0x6b5b, 0x6b5a, 0x6b6b, /* 0x16C21..0x16C7E */ 0x6b5f, 0x6b6c, 0x6b6f, 0x6b74, 0x6b7d, 0x6b80, 0x6b8c, 0x6b8e, 0x6b92, 0x6b93, 0x6b96, 0x6b99, 0x6b9a, 0x6c3a, 0x6c41, 0x6c3f, 0x6c48, 0x6c4c, 0x6c4e, 0x6c50, 0x6c55, 0x6c62, 0x6c6c, 0x6c78, 0x6c7a, 0x6c82, 0x6c89, 0x6c85, 0x6c8a, 0x6c8d, 0x6c8e, 0x6c94, 0x6c7c, 0x6c98, 0x421d, 0x6cad, 0x6caa, 0x6cbd, 0x6cb2, 0x6cb3, 0x6cae, 0x6cb6, 0x6cc8, 0x6cc1, 0x6ce4, 0x6ce3, 0x6cda, 0x6cfd, 0x6cfa, 0x6cfb, 0x6d04, 0x6d05, 0x6d0a, 0x6d07, 0x6d0f, 0x6d0d, 0x6d10, 0x7f4e, 0x6d13, 0x6ccd, 0x6d14, 0x6d16, 0x6d67, 0x6d6d, 0x6d71, 0x6d73, 0x6d81, 0x6d99, 0x6dc2, 0x6dbe, 0x6dba, 0x6dcf, 0x6dda, 0x6dd6, 0x6dcc, 0x6ddb, 0x6dcb, 0x6dea, 0x6deb, 0x6ddf, 0x6de3, 0x6dfc, 0x6e08, 0x6e09, 0x6dff, 0x6e1d, 0x6e1e, 0x6e10, 0x6e1f, 0x6e42, 0x6e35, 0x6e30, 0x6e34, 0x6e4a, /* 0x16D21..0x16D7E */ 0x6e47, 0x6e49, 0x6e4c, 0x6e50, 0x6e48, 0x6e59, 0x6e64, 0x6e60, 0x6e2a, 0x6e63, 0x6e55, 0x6e76, 0x6e72, 0x6e7c, 0x6e81, 0x6e87, 0x6e85, 0x6e84, 0x6e8b, 0x6e8a, 0x6e93, 0x6e91, 0x6e94, 0x6e99, 0x6eaa, 0x6ea1, 0x6eac, 0x6eb0, 0x6ec6, 0x6eb1, 0x6ebe, 0x6ec5, 0x6ec8, 0x6ecb, 0x6edb, 0x6ee3, 0x6efc, 0x6efb, 0x6eeb, 0x6efe, 0x6f0a, 0x6f05, 0x6f15, 0x6f12, 0x6f19, 0x6f13, 0x6f1c, 0x6f1f, 0x6f1b, 0x6f0c, 0x6f26, 0x6f33, 0x6f3b, 0x6f39, 0x6f45, 0x6f42, 0x6f3e, 0x6f4c, 0x6f49, 0x6f46, 0x6f4e, 0x6f57, 0x6f5c, 0x6f62, 0x6f63, 0x6f64, 0x6f9c, 0x6f9f, 0x6fa3, 0x6fad, 0x6faf, 0x6fb7, 0x6fda, 0x6fe5, 0x6fe2, 0x6fea, 0x6fef, 0x7087, 0x6ff4, 0x7005, 0x6ff9, 0x6ffa, 0x7011, 0x7015, 0x7021, 0x700d, 0x701e, 0x7016, 0x700b, 0x7027, 0x7036, 0x7035, 0x7039, 0x6ff8, /* 0x16E21..0x16E7E */ 0x704f, 0x7050, 0x7051, 0x7052, 0x700e, 0x7049, 0x703e, 0x7056, 0x7058, 0x705e, 0x7068, 0x706f, 0x7076, 0x76a8, 0x7072, 0x7082, 0x707d, 0x7081, 0x7080, 0x708a, 0x7089, 0x708f, 0x70a8, 0x70af, 0x70b1, 0x70b5, 0x70e2, 0x70e4, 0x4248, 0x70db, 0x7102, 0x7112, 0x7119, 0x7132, 0x7130, 0x714a, 0x7156, 0x7158, 0x7163, 0x7165, 0x7169, 0x7173, 0x7172, 0x718b, 0x7189, 0x7182, 0x71a2, 0x71ab, 0x71af, 0x71aa, 0x71b5, 0x71b4, 0x71ba, 0x71c0, 0x71c1, 0x71c9, 0x71cb, 0x71d0, 0x71d6, 0x71df, 0x71e1, 0x71db, 0x71fc, 0x71f5, 0x71f6, 0x721e, 0x71ff, 0x7214, 0x722c, 0x7215, 0x7211, 0x725e, 0x7257, 0x7245, 0x7249, 0x7264, 0x7248, 0x7295, 0x723f, 0x724b, 0x7250, 0x729c, 0x7296, 0x7293, 0x729b, 0x725a, 0x72cf, 0x72b9, 0x72b7, 0x72e9, 0x730f, 0x72fa, 0x7344, 0x732e, /* 0x16F21..0x16F7E */ 0x7319, 0x7322, 0x731a, 0x7323, 0x733a, 0x7335, 0x733b, 0x735c, 0x7360, 0x737c, 0x736e, 0x7356, 0x73b0, 0x73ac, 0x73ad, 0x7394, 0x73b9, 0x73d6, 0x73d7, 0x73e8, 0x73e5, 0x73d8, 0x73c3, 0x73dd, 0x73d0, 0x73c8, 0x73e4, 0x741a, 0x7414, 0x7413, 0x7403, 0x7407, 0x7410, 0x7436, 0x742b, 0x7435, 0x7421, 0x743a, 0x7441, 0x7452, 0x7444, 0x745b, 0x7460, 0x7462, 0x745e, 0x746a, 0x7229, 0x7470, 0x7475, 0x7477, 0x747d, 0x745a, 0x747c, 0x747e, 0x7481, 0x747f, 0x7582, 0x7587, 0x758a, 0x7594, 0x7596, 0x7598, 0x7599, 0x75a0, 0x75a8, 0x75a7, 0x75ad, 0x75bc, 0x75bb, 0x75b9, 0x75be, 0x75ca, 0x4ff6, 0x75c3, 0x75cd, 0x75cc, 0x75d5, 0x75d4, 0x75d6, 0x75dc, 0x75e1, 0x75e5, 0x75e2, 0x7621, 0x7628, 0x762e, 0x762f, 0x7642, 0x764c, 0x764f, 0x764b, 0x7677, 0x765c, 0x765e, /* 0x17021..0x1707E */ 0x765d, 0x765f, 0x7666, 0x7672, 0x766c, 0x768d, 0x7698, 0x7695, 0x7697, 0x76aa, 0x76a7, 0x76b1, 0x76b2, 0x76b0, 0x76b4, 0x76b6, 0x76b8, 0x76b9, 0x76ce, 0x76cb, 0x76c9, 0x76cd, 0x694d, 0x76dc, 0x770d, 0x76d5, 0x76f9, 0x7704, 0x7706, 0x7708, 0x7713, 0x770e, 0x7711, 0x770f, 0x7716, 0x7719, 0x7724, 0x772a, 0x7730, 0x7739, 0x773d, 0x773e, 0x7744, 0x7746, 0x7748, 0x7742, 0x7749, 0x775c, 0x7760, 0x7764, 0x7766, 0x7768, 0x32d2, 0x776b, 0x7771, 0x7779, 0x7785, 0x777c, 0x7781, 0x777a, 0x7786, 0x778b, 0x778f, 0x7790, 0x779c, 0x77a8, 0x77a6, 0x77a3, 0x77b3, 0x77b4, 0x77c3, 0x77c6, 0x77c8, 0x77cb, 0x77dc, 0x77ed, 0x7f4f, 0x77f2, 0x5adf, 0x77f6, 0x77f5, 0x780f, 0x780c, 0x7838, 0x7824, 0x7821, 0x7837, 0x783d, 0x7846, 0x784f, 0x784b, 0x786b, 0x786f, 0x7870, /* 0x17121..0x1717E */ 0x7871, 0x7874, 0x7873, 0x78aa, 0x78af, 0x78b1, 0x78b6, 0x78c4, 0x78c3, 0x78c6, 0x78e9, 0x78eb, 0x7903, 0x7909, 0x7912, 0x7914, 0x7918, 0x7921, 0x791d, 0x791e, 0x7924, 0x7920, 0x792c, 0x792e, 0x793d, 0x793e, 0x7942, 0x7949, 0x7945, 0x7950, 0x794b, 0x7951, 0x7952, 0x794c, 0x7955, 0x7997, 0x7998, 0x79a5, 0x79ad, 0x79ae, 0x79bc, 0x79df, 0x79db, 0x79dd, 0x79d8, 0x79d1, 0x79ed, 0x79ee, 0x79f1, 0x79f2, 0x79fb, 0x79f8, 0x7a01, 0x7a0f, 0x7a05, 0x79e2, 0x7a19, 0x7a2b, 0x7a37, 0x7a45, 0x7a42, 0x7a40, 0x7a43, 0x7a3e, 0x7a55, 0x7a4d, 0x7a5b, 0x7a57, 0x7a5f, 0x7a62, 0x7a65, 0x7a64, 0x7a69, 0x7a6b, 0x7a6a, 0x7aad, 0x7ab0, 0x7abc, 0x7ac0, 0x7acf, 0x7ad1, 0x7ad3, 0x7ad4, 0x7ade, 0x7adf, 0x7ae2, 0x7ae3, 0x7ae6, 0x7aef, 0x7aeb, 0x7aee, 0x7af4, 0x7af1, 0x7af7, /* 0x17221..0x1727E */ 0x7afb, 0x7b06, 0x7b18, 0x7b1a, 0x7b1f, 0x7b22, 0x7b23, 0x7b25, 0x7b27, 0x7b28, 0x7b29, 0x7b2a, 0x7b2e, 0x7b2f, 0x7b32, 0x7b44, 0x7b43, 0x7b4f, 0x7b4d, 0x7b4e, 0x7b51, 0x7b58, 0x7b74, 0x7b93, 0x7b83, 0x7b91, 0x7b96, 0x7b97, 0x7b9f, 0x7ba0, 0x7ba8, 0x7bb4, 0x7bc0, 0x7bca, 0x7bb9, 0x7bc6, 0x7bcf, 0x7bd1, 0x7bd2, 0x7be3, 0x7be2, 0x7be4, 0x7bd4, 0x7be1, 0x7c3a, 0x7bf2, 0x7bf1, 0x7bf0, 0x7c15, 0x7c14, 0x7c09, 0x7c13, 0x7c0c, 0x7c06, 0x7c08, 0x7c12, 0x7c0a, 0x7c04, 0x7c2e, 0x7c1b, 0x7c25, 0x7c24, 0x7c21, 0x7c30, 0x7c47, 0x7c32, 0x7c46, 0x7c3e, 0x7c5a, 0x7c60, 0x7c67, 0x7c76, 0x7c78, 0x7ce7, 0x7cec, 0x7cf0, 0x7d09, 0x7d08, 0x7ceb, 0x7d03, 0x7d06, 0x7d2a, 0x7d26, 0x7daf, 0x7d23, 0x7d1f, 0x7d44, 0x7d15, 0x7d12, 0x7d41, 0x7d3f, 0x7d3e, 0x7d46, 0x7d48, /* 0x17321..0x1737E */ 0x7d5d, 0x7d5e, 0x7d64, 0x7d51, 0x7d50, 0x7d59, 0x7d72, 0x7d89, 0x7d87, 0x7dab, 0x7d6f, 0x7d7a, 0x7d9a, 0x7da4, 0x7da9, 0x7db2, 0x7dc4, 0x7dc1, 0x7dbb, 0x7db8, 0x7dba, 0x7dc6, 0x7dcf, 0x7dc2, 0x7dd9, 0x7dd3, 0x7df8, 0x7de6, 0x7ded, 0x7def, 0x7dfd, 0x7e1a, 0x7e1b, 0x7e1e, 0x7e75, 0x7e79, 0x7e7d, 0x7e81, 0x7e88, 0x7e8b, 0x7e8c, 0x7e92, 0x7e95, 0x7e91, 0x7e9d, 0x7ea5, 0x7ea9, 0x7eb8, 0x7eaa, 0x7ead, 0x7761, 0x7ecc, 0x7ece, 0x7ecf, 0x7ed0, 0x7ed4, 0x7edc, 0x7ede, 0x7edd, 0x7ee0, 0x7ee5, 0x7ee8, 0x7eef, 0x7ef4, 0x7ef6, 0x7ef7, 0x7ef9, 0x7efb, 0x7efc, 0x7efd, 0x7f07, 0x7f08, 0x56b7, 0x7f15, 0x7f21, 0x7f2c, 0x7f3e, 0x7f4a, 0x7f52, 0x7f54, 0x7f63, 0x7f5f, 0x7f60, 0x7f61, 0x7f66, 0x7f67, 0x7f6c, 0x7f6a, 0x7f77, 0x7f72, 0x7f76, 0x7f95, 0x7f9c, 0x7fa0, /* 0x17421..0x1747E */ 0x382f, 0x49c7, 0x7059, 0x5464, 0x31dc, 0x5199, 0x3653, 0x3de2, 0x3e14, 0x3e18, 0x3e58, 0x3e5e, 0x3ebe, 0x8028, 0x3ecb, 0x3ef9, 0x3f00, 0x3f02, 0x3f07, 0x3f1d, 0x3f23, 0x3f34, 0x3f36, 0x3f3d, 0x3f40, 0x3f45, 0x3f54, 0x3f58, 0x3f64, 0x3f67, 0x3f7d, 0x3f89, 0x3f9c, 0x3fa7, 0x3faf, 0x3fb5, 0x3fb7, 0x3fc9, 0x3fde, 0x3fe1, 0x3fe9, 0x400d, 0x4014, 0x4018, 0x4033, 0x4035, 0x4047, 0x813d, 0x409d, 0x409e, 0x40cb, 0x40d4, 0x40d5, 0x40dd, 0x40f8, 0x411c, 0x412b, 0x4130, 0x4137, 0x813e, 0x418d, 0x813f, 0x41bc, 0x41b9, 0x8140, 0x4222, 0x423e, 0x4243, 0x4256, 0x425a, 0x426f, 0x4285, 0x42c4, 0x42d6, 0x42fc, 0x430a, 0x4318, 0x4339, 0x4343, 0x4365, 0x437c, 0x43e5, 0x43ed, 0x43f5, 0x4410, 0x4414, 0x4422, 0x4479, 0x4451, 0x4460, 0x446d, 0x44ce, 0x44be, 0x44bf, /* 0x17521..0x1757E */ 0x44c4, 0x44ca, 0x44d0, 0x44f7, 0x44fb, 0x4522, 0x4529, 0x8141, 0x4567, 0x459d, 0x8142, 0x4600, 0x4609, 0x4615, 0x461e, 0x463a, 0x4622, 0x4624, 0x462b, 0x4630, 0x4631, 0x4633, 0x46fb, 0x4648, 0x464c, 0xa8c4, 0x4659, 0x465a, 0x4661, 0x4665, 0x4673, 0x4677, 0x4678, 0x468d, 0x8143, 0x46a0, 0x46b2, 0x46bb, 0x46c6, 0x46c8, 0x1b22, 0x46db, 0x46e8, 0x46fa, 0x4713, 0x8029, 0x4733, 0x4766, 0x4747, 0x4748, 0x477b, 0x4781, 0x4793, 0x4798, 0x479b, 0x47bb, 0x47f9, 0x47c0, 0x47d7, 0x47fc, 0x4801, 0x4852, 0x481d, 0x482c, 0x4831, 0x485b, 0x4872, 0x4875, 0x8144, 0x48a3, 0x48a5, 0x48b2, 0x48c8, 0x48d0, 0x48e8, 0x48ed, 0x48f0, 0x48f1, 0x48fc, 0x490a, 0x4949, 0xabc4, 0x4935, 0x4942, 0x4957, 0x4963, 0x4964, 0x4968, 0x4980, 0x8114, 0x49a5, 0x49ad, 0x49cf, 0x1bb6, /* 0x17621..0x1767E */ 0x1bc3, 0x49e2, 0x49e9, 0x49ea, 0x49f5, 0x49f6, 0x4a0f, 0x4a15, 0xad3f, 0x4a3b, 0x4a3e, 0x4a45, 0x4a50, 0x4a56, 0x4a5b, 0x4a6b, 0x4a73, 0xad63, 0x4a89, 0x4a94, 0x4a9d, 0x4a9e, 0x4aa5, 0x4ae4, 0x4ae7, 0x1c0f, 0x801d, 0x4b1b, 0x4b1e, 0x4b2c, 0x4b35, 0x4b46, 0x4b56, 0x4b60, 0x4b65, 0x4b67, 0x4b77, 0x4b82, 0x4ba9, 0x4bad, 0x8070, 0x4bcf, 0x4bd6, 0x4bd7, 0x4bff, 0x4c05, 0x4c10, 0x4c33, 0x4c59, 0x4c5c, 0x4caa, 0x4c74, 0x4c76, 0x4c85, 0x4c86, 0x4c98, 0x4c9c, 0x4cfb, 0x4cc6, 0x4cd4, 0x4ce0, 0x4ceb, 0x4cee, 0xb0fe, 0x4d04, 0x4d0e, 0x4d2e, 0x4d31, 0x4d39, 0x4d3f, 0x4d58, 0x4d65, 0x8145, 0x4d82, 0x4d87, 0x4d89, 0x4d94, 0x4daa, 0x4dac, 0x4dbf, 0x4dc4, 0x4dd6, 0x4dda, 0x4ddb, 0x4ddd, 0x4dfc, 0x8146, 0x4e34, 0x4e44, 0x4e5c, 0x4e5e, 0x4eab, 0x4eb1, 0x4ec1, /* 0x17721..0x1777E */ 0x4ec7, 0x4ece, 0x4f10, 0x4f1a, 0x8147, 0x4f2a, 0x4f2f, 0x4f33, 0x4f51, 0x4f59, 0x4f5e, 0x4f61, 0x4f62, 0x4f7e, 0x4f88, 0x4f8c, 0x4f8d, 0x4f94, 0x4fa0, 0x4fa7, 0x4fb6, 0x4fbc, 0x4fc7, 0x4fca, 0x4ff9, 0x4ff0, 0x4ff5, 0x5005, 0x5006, 0x5028, 0x504a, 0x505d, 0x505e, 0x504e, 0x5064, 0x5075, 0x5085, 0x50a4, 0x50ab, 0x50b7, 0x50d4, 0x50d8, 0x50e4, 0x510f, 0x512b, 0x511e, 0x5120, 0x512e, 0x5130, 0x5146, 0x5147, 0x5151, 0x8148, 0x5152, 0x515c, 0x5160, 0x5168, 0x8115, 0x5185, 0x5187, 0x5192, 0x51c1, 0x51ba, 0x51c4, 0x51fe, 0x5200, 0x5215, 0x5255, 0x5256, 0x1e3f, 0x528d, 0x529b, 0x52be, 0x52c0, 0x52fb, 0xb7f1, 0x5327, 0x5328, 0x8116, 0x5350, 0x5366, 0x537c, 0x5395, 0x539f, 0x53a0, 0x53a2, 0x53a6, 0x53ab, 0x53c9, 0x53cf, 0x53d6, 0x53d9, 0x53e3, 0x53e9, /* 0x17821..0x1787E */ 0x5407, 0x540a, 0x541a, 0x541b, 0x814a, 0x5426, 0x5428, 0x542a, 0x542b, 0x542c, 0x542e, 0x542f, 0x5430, 0x5444, 0x5446, 0x5447, 0x544b, 0x5457, 0x5462, 0x546b, 0x546d, 0x5486, 0x5487, 0x5489, 0x5498, 0x549c, 0x549f, 0x54a3, 0x5490, 0x54a6, 0x54a8, 0x54a9, 0x54b5, 0x54bf, 0x54c8, 0x54c9, 0x54da, 0x54ff, 0x5501, 0x5517, 0x552f, 0x556f, 0x5579, 0x5592, 0x1f72, 0x55ce, 0x55e4, 0x5600, 0x5602, 0x5608, 0x5615, 0x5616, 0x5619, 0x561e, 0x562d, 0x5635, 0x5643, 0x564b, 0x5664, 0x5665, 0x566d, 0x566f, 0x5671, 0x5681, 0x569b, 0x569d, 0x569e, 0x56a6, 0x56aa, 0x56b6, 0x56c5, 0x56cc, 0x56ce, 0x56d4, 0x56e6, 0x56f1, 0x56fc, 0x570a, 0x5719, 0x5734, 0x5736, 0x5746, 0x574d, 0x574e, 0x575c, 0x575f, 0x5762, 0x577a, 0x5780, 0x5794, 0x57aa, 0x57e0, 0x582d, 0xc18e, /* 0x17921..0x1797E */ 0x5843, 0x584e, 0x584f, 0x5851, 0x5868, 0x586e, 0x814b, 0x58b0, 0xc20e, 0x58ad, 0x58e4, 0x58f2, 0x5900, 0x58f7, 0x591c, 0x592e, 0x5931, 0x5934, 0x814c, 0x814d, 0x5945, 0x5946, 0x814e, 0x814f, 0x8150, 0x595c, 0x8151, 0x8119, 0x811a, 0x5979, 0x8152, 0x8153, 0x811b, 0x5998, 0x59b1, 0x59b8, 0x59c8, 0x59ca, 0xc371, 0x59d4, 0x59de, 0x59eb, 0x59ed, 0x5a03, 0x8154, 0x5a39, 0x5a5d, 0x5a6d, 0x8155, 0x5a85, 0x5aa0, 0xc4c4, 0x5ab3, 0x5abb, 0x5ace, 0x5aeb, 0x5afd, 0x5b12, 0x5b2d, 0x5b3b, 0x5b47, 0x5b4e, 0x5b60, 0x5b6d, 0x5b6f, 0x5b72, 0x5b9e, 0x8156, 0x5bd7, 0x5bd9, 0x5c01, 0x5c31, 0x5c1e, 0x5c20, 0x5c33, 0x5c36, 0x2264, 0xc7a1, 0x5c59, 0x5c6d, 0x5c79, 0x5c8f, 0x5c94, 0x5ca0, 0x5cbc, 0x5cd5, 0x5cd9, 0x5cdd, 0x5d07, 0x5d08, 0x5d13, 0x5d1d, 0x5d23, 0x5d31, /* 0x17A21..0x17A7E */ 0x5d41, 0x5d48, 0x5d53, 0x5d5c, 0x5d7a, 0x5d83, 0x5d8b, 0x5da0, 0x5da6, 0x5dc2, 0x5dcc, 0x5dd6, 0x5de3, 0x8157, 0x5e28, 0x5e08, 0x5e11, 0x5e15, 0x8159, 0x5e47, 0x5e52, 0x5e61, 0x5e8a, 0x5e8d, 0x5f47, 0x815a, 0x5f91, 0x5f97, 0x5fbf, 0x5fce, 0x5fdb, 0x5fdf, 0x5fec, 0x5fee, 0x5ffa, 0x815b, 0x6014, 0x6026, 0x6035, 0x6037, 0x603c, 0x60ca, 0x60d7, 0x60e0, 0x60f3, 0x6118, 0x614a, 0x6160, 0x6167, 0x6168, 0x616d, 0x61bb, 0x61ca, 0x61cf, 0x61d7, 0x815c, 0x2453, 0x245b, 0x6260, 0x6274, 0xd2ff, 0x628e, 0x62a1, 0x62a3, 0x62a4, 0x62a9, 0x62ae, 0x62b7, 0x62be, 0x62bf, 0x62c6, 0x62d5, 0x62fd, 0x62fe, 0x6300, 0x6301, 0x6362, 0x6322, 0x632d, 0x633a, 0x6343, 0x6347, 0x6351, 0x6355, 0x637d, 0x6386, 0x6392, 0x6398, 0x63a7, 0x63a9, 0x63bf, 0x63c0, 0x63c7, 0x63cf, /* 0x17B21..0x17B7E */ 0x63d1, 0x63e1, 0x63ea, 0x6401, 0x6406, 0x640a, 0x815f, 0x6448, 0x645f, 0x6470, 0x6473, 0x6485, 0x649e, 0x64af, 0x64b4, 0x64ba, 0x64c0, 0x64c2, 0xd440, 0x6532, 0x651e, 0x6523, 0x652f, 0x6559, 0x6564, 0x811f, 0x65ad, 0x657a, 0x658c, 0x658f, 0x65a2, 0x65b0, 0x65cb, 0x65ce, 0x65ed, 0x6612, 0x65ff, 0x6604, 0x6605, 0x6610, 0xd674, 0x6618, 0x6629, 0x6638, 0x6657, 0x665b, 0x8036, 0x6662, 0x259d, 0x666c, 0x6675, 0x6698, 0x66b8, 0x66fa, 0x66fc, 0x66fd, 0x670b, 0x6771, 0x6787, 0x6788, 0x67ac, 0x67ad, 0x67b5, 0x25ea, 0x67d6, 0x67ec, 0x6806, 0x680a, 0x6810, 0x6814, 0x681f, 0x6898, 0x68aa, 0x68ca, 0x68ce, 0xd884, 0x68f5, 0x691c, 0x8160, 0x6918, 0x6919, 0x691a, 0x6927, 0x6930, 0x6932, 0x6939, 0x6940, 0x6994, 0x8161, 0x69d4, 0x69e5, 0x69f6, 0x6a12, 0x6a15, /* 0x17C21..0x17C7E */ 0x6a22, 0x6a37, 0x6a47, 0x6a4e, 0x6a5d, 0x6a61, 0x6a75, 0x6a79, 0x6aa7, 0x6ad0, 0x6adf, 0x6af4, 0x6af6, 0x8122, 0x8162, 0x8163, 0x6b46, 0x6b54, 0x6b59, 0x6b69, 0x6b9d, 0x6c49, 0x6c68, 0x8164, 0x6ce1, 0x6cf4, 0x6cf8, 0x6cfe, 0x8165, 0x6d12, 0x6d1b, 0x6daf, 0x6dce, 0x6dd1, 0x6dd7, 0x6e20, 0x6e23, 0x6e3d, 0x6e70, 0x6e7b, 0xe177, 0x6ec0, 0x2844, 0x6efa, 0x6f1e, 0x6f2d, 0x6f36, 0x6f54, 0xe24d, 0x6fa6, 0x6fb5, 0x6fe4, 0x6fe8, 0x6fee, 0x7008, 0x702d, 0x8167, 0x7088, 0x7095, 0x7097, 0x7099, 0x709b, 0x70a2, 0x70b3, 0x70be, 0x70c4, 0x70c5, 0x70c7, 0x70d7, 0x70dd, 0x70de, 0x70ef, 0x70f4, 0x8126, 0x7114, 0x7115, 0x7116, 0x7122, 0x7123, 0x7127, 0x712f, 0x7131, 0x7134, 0x713d, 0x7148, 0x715b, 0x7183, 0x719e, 0x71ac, 0x71b1, 0x71bc, 0x71d7, 0x71fb, 0x71e4, /* 0x17D21..0x17D7E */ 0x71e5, 0x71ed, 0x71f1, 0x7207, 0x7210, 0x7238, 0x7239, 0x723a, 0x723c, 0x7240, 0x7243, 0x724f, 0x7278, 0x7288, 0x72c2, 0x72cb, 0x72cc, 0x72d3, 0x72e0, 0x72ff, 0x7304, 0x731f, 0x7321, 0x7325, 0x7348, 0x7349, 0x734a, 0x7364, 0x7365, 0x736a, 0x7370, 0x739b, 0x73a3, 0x73ba, 0x73c6, 0x73de, 0x73df, 0x7404, 0x73fd, 0x7433, 0x744a, 0x7463, 0x746b, 0x7471, 0x7472, 0x758e, 0x759f, 0x75a6, 0x75a9, 0x75ac, 0x75b6, 0x75bd, 0x75cb, 0x75d0, 0x75d3, 0x29b0, 0x75da, 0x75de, 0x7658, 0x7684, 0x80dc, 0x769d, 0x76a4, 0x76a5, 0x76d2, 0x76de, 0x8168, 0x76e9, 0x76ef, 0x7733, 0x773b, 0x774d, 0x774e, 0x774f, 0x775a, 0x776e, 0x7773, 0x7795, 0x77ae, 0x77ba, 0x77c1, 0x77c9, 0x77de, 0x77db, 0x77f4, 0x8169, 0x780a, 0x781e, 0x782b, 0x7830, 0x816a, 0x7852, 0x7853, 0x7856, /* 0x17E21..0x17E7E */ 0x7857, 0x7859, 0x785a, 0x80d0, 0x7865, 0x786c, 0x78ba, 0x78c8, 0x78e7, 0x7958, 0x799e, 0x7a02, 0x7a03, 0x7a24, 0x7a2d, 0x7a2e, 0x7a38, 0x7a4a, 0x7a4e, 0x7a52, 0x7ab6, 0x7ac1, 0x7ac3, 0x7ace, 0x7ad6, 0x7af9, 0x7b02, 0x7b08, 0x7b20, 0x2c17, 0x7b2d, 0x7b5e, 0x7b79, 0x7b66, 0x7b72, 0x7b75, 0x7b84, 0x7b8a, 0x7b8f, 0x7b9e, 0x7ba7, 0x7bc1, 0x7bce, 0x7be5, 0x7bf8, 0x7bfd, 0x7c00, 0x7c23, 0x7c41, 0x7c4f, 0x7c50, 0x7c53, 0x7c63, 0x7c65, 0x7c77, 0x7d1d, 0x7d1e, 0x7d43, 0x7d47, 0x7d52, 0x7d63, 0x7d70, 0x7d7c, 0x7d8a, 0x7d96, 0x7dc0, 0x7dac, 0x7dbc, 0x7dd7, 0xf690, 0x7de7, 0x7e07, 0x7e15, 0x7e7c, 0x7e9e, 0x7ea4, 0x7eac, 0x7eaf, 0x7eb4, 0x7eb5, 0x7ec3, 0x7ed1, 0x7f10, 0x7f39, 0x7f57, 0x7f90, 0x7f94, 0x7f97, 0x7fa2, 0x39f8, 0x3c5b, 0x3e77, 0x5626, 0x5e6b, /* 0x22121..0x2217E */ 0x8489, 0x2e02, 0x2e0f, 0x2e12, 0x2e29, 0x2e2b, 0x2e2e, 0x2e40, 0x2e47, 0x2e48, 0x84a2, 0x2e51, 0x1406, 0x84a4, 0x2e5a, 0x2e69, 0x2e9d, 0x142c, 0x142e, 0x2eb9, 0x2ebb, 0x8522, 0x2ebc, 0x2ec3, 0x2ec8, 0x2ed0, 0x2eeb, 0x2eda, 0x2ef1, 0x2ef5, 0x2f00, 0x2f16, 0x2f64, 0x2f37, 0x2f3e, 0x2f54, 0x2f58, 0x8593, 0x2f77, 0x2f78, 0x2f7a, 0x2f7d, 0x2f82, 0x2f85, 0x2f92, 0x2f9a, 0x2fe6, 0x2fb2, 0x2fbe, 0x2fc5, 0x2fcb, 0x2fcf, 0x2fd2, 0x146a, 0x2ff2, 0x3000, 0x3010, 0x3013, 0x301c, 0x301e, 0x3022, 0x1468, 0x3042, 0x3046, 0x304e, 0x3053, 0x3057, 0x3063, 0x3066, 0x306a, 0x3070, 0x30a3, 0x3088, 0x3092, 0x3093, 0x3095, 0x3096, 0x309c, 0x30aa, 0x862b, 0x30b1, 0x30ba, 0x30bb, 0x30c4, 0x30c7, 0x30f3, 0x8681, 0x30ce, 0x8671, 0x30d4, 0x30d9, 0x30e1, 0x30e9, 0x1492, /* 0x22321..0x2237E */ 0x3108, 0x86f9, 0x3117, 0x311b, 0x874a, 0x3160, 0x8809, 0x3173, 0x3183, 0x318b, 0x14bc, 0x3198, 0x31a3, 0x31ad, 0x14c7, 0x31bc, 0x88d6, 0x8928, 0x31f3, 0x31f4, 0x3202, 0x3212, 0x3216, 0x8a4f, 0x3255, 0x325c, 0x326c, 0x3277, 0x3284, 0x3282, 0x8b07, 0x3298, 0x8b3a, 0x32a4, 0x32a6, 0x32af, 0x32ba, 0x32bb, 0x32ca, 0x151f, 0x32d1, 0x8bb9, 0x32f7, 0x330a, 0x330b, 0x3324, 0x3335, 0x333e, 0x3342, 0x8c7c, 0x8c9d, 0x3367, 0x336c, 0x337a, 0x33a4, 0x33b4, 0x8dd3, 0x33b7, 0x33c0, 0x8e1d, 0x155d, 0x155e, 0x33d5, 0x33da, 0x1563, 0x33f4, 0x33f5, 0x3455, 0x3424, 0x3428, 0x156e, 0x3443, 0x3462, 0x3466, 0x346c, 0x348a, 0x348d, 0x3495, 0x34a0, 0x34a6, 0x34ad, 0x34ae, 0x34b7, 0x34ba, 0x34bf, 0x34c3, 0x8f45, 0x34ec, 0x34ef, 0x34f1, 0x34f3, 0x3500, 0x3501, 0x3509, /* 0x22421..0x2247E */ 0x353c, 0x3541, 0x15a6, 0x3547, 0x354a, 0x15a8, 0x3560, 0x3561, 0x3564, 0x8fe1, 0x357d, 0x3582, 0x3588, 0x3591, 0x15c5, 0x35d2, 0x9095, 0x906d, 0x35bf, 0x35c9, 0x35cc, 0x35d1, 0x35dd, 0x15da, 0x35e2, 0x9064, 0x35e9, 0x3628, 0x915f, 0x3607, 0x3610, 0x3630, 0x3637, 0x15f4, 0x363d, 0x363f, 0x3640, 0x3647, 0x365e, 0x3660, 0x366d, 0x1605, 0x3688, 0x368c, 0x3695, 0x369a, 0x369d, 0x36a8, 0x36ad, 0x36b2, 0x36c5, 0x36cd, 0x36df, 0x36e8, 0x36f6, 0x36f7, 0x9201, 0x3715, 0x3723, 0x9255, 0x3729, 0x927b, 0x3745, 0x3746, 0x374c, 0x374d, 0x9274, 0x3768, 0x376f, 0x3773, 0x3774, 0x3775, 0x377b, 0x92e4, 0x92d7, 0x37ac, 0x379a, 0x379d, 0x379e, 0x37a8, 0x37d7, 0x92fd, 0x37cc, 0x9336, 0x9344, 0x37de, 0x37e6, 0x37f0, 0x164a, 0x37f8, 0x37fb, 0x37fd, 0x3804, 0x381e, /* 0x22521..0x2257E */ 0x3820, 0x3827, 0x3832, 0x3839, 0x93c4, 0x3849, 0x384c, 0x3867, 0x388a, 0x388b, 0x388d, 0x388f, 0x3890, 0x3894, 0x389d, 0x38aa, 0x38b1, 0x946d, 0x38c3, 0x38cd, 0x38e2, 0x38f3, 0x38f4, 0x3905, 0x3906, 0x390b, 0x390d, 0x3914, 0x3924, 0x95d7, 0x1691, 0x393d, 0x1699, 0x3946, 0x1696, 0xd329, 0x395b, 0x395f, 0x9647, 0x3975, 0x3976, 0x397c, 0x399f, 0x39ae, 0x39bc, 0x39c8, 0x39cd, 0x39de, 0x39e3, 0x39e4, 0x39e7, 0x39ee, 0x9706, 0x9742, 0x16cf, 0x3a0c, 0x3a0d, 0x3a17, 0x3a27, 0x3a2d, 0x3a55, 0x3a65, 0x3a7a, 0x3a8b, 0x3a9c, 0x3a9f, 0x3aa0, 0x3aa2, 0x3ab1, 0x3ab3, 0x3ab5, 0x3aba, 0x3abf, 0x3ada, 0x3adc, 0x3ae0, 0x3ae5, 0x3af0, 0x3aee, 0x3af5, 0x3b00, 0x3b08, 0x3b17, 0x3b34, 0x3b2d, 0x3b4c, 0x3b52, 0x3b68, 0x3b6f, 0x3b7c, 0x3b7f, 0x3b81, 0x3b84, 0x99c3, /* 0x22821..0x2287E */ 0x3b96, 0x3bac, 0x1761, 0x3bc0, 0x1762, 0x3bce, 0x3bd6, 0x176c, 0x176b, 0x3bf1, 0x3bfd, 0x1775, 0x3c03, 0x3c29, 0x3c30, 0x9a56, 0x3c5f, 0x3c63, 0x3c67, 0x3c68, 0x3c69, 0x3c70, 0x9b2d, 0x9b45, 0x3c7c, 0x9b78, 0x9b62, 0x3c88, 0x3c8a, 0x17c1, 0x9ba1, 0x9b9c, 0x3ca0, 0x3ca2, 0x3ca6, 0x3ca7, 0x9b92, 0x3cad, 0x3cb5, 0x9bb7, 0x3cc9, 0x9be0, 0x9c33, 0x3d06, 0x3d10, 0x3d2b, 0x3d1d, 0x3d20, 0x3d24, 0x3d26, 0x3d31, 0x3d39, 0x3d42, 0x17e8, 0x3d61, 0x3d6a, 0x17f4, 0x3d70, 0x9d1e, 0x17fd, 0x3d88, 0x1800, 0x3d92, 0x3d94, 0x3d97, 0x3d99, 0x3db0, 0x3db2, 0x3db4, 0x9d76, 0x3db9, 0x3dd1, 0x3dd7, 0x3dd8, 0x3de0, 0x9dfa, 0x3de4, 0x3de9, 0x182f, 0x3e00, 0x1836, 0x3e12, 0x3e15, 0x1840, 0x3e1f, 0x3e2e, 0x3e3e, 0x3e49, 0x185c, 0x3e56, 0x1861, 0x3e6b, 0x3e6c, 0x3e6d, /* 0x22C21..0x22C7E */ 0x3e6e, 0x9e7b, 0x3ea5, 0x3eaa, 0x3eac, 0x3eb9, 0x3ebf, 0x3ec6, 0x3ed2, 0x3ed9, 0xa01e, 0x3efd, 0x3f08, 0x3f0e, 0x3f1c, 0xa0ad, 0x3f1e, 0x3f47, 0x3f63, 0x3f72, 0x3f7e, 0x3f8f, 0x3fa2, 0x3fa4, 0x3fb8, 0x3fc4, 0x18fa, 0x3fc7, 0x3fcb, 0x3fd2, 0x3fd3, 0x3fd4, 0x3fe2, 0x3fee, 0x3fef, 0x3ff3, 0x3ffc, 0x1917, 0x4017, 0x4022, 0x4024, 0x191a, 0x404c, 0x407f, 0x408a, 0x4095, 0x40a8, 0xa1f3, 0x40b0, 0x40b1, 0x40be, 0x40c8, 0x40d9, 0x40db, 0x40ee, 0x40f2, 0x40f5, 0x4110, 0x4112, 0x4113, 0x4119, 0x411e, 0x413a, 0x196f, 0x4141, 0x4146, 0x4160, 0x417c, 0xa25b, 0x4192, 0x4193, 0x4197, 0x4198, 0x41a5, 0x41a8, 0x41ad, 0xa2ab, 0x41d5, 0x41dd, 0x41df, 0x41f5, 0xa38f, 0x4215, 0x4223, 0x4229, 0x4246, 0x424c, 0x4251, 0x4252, 0x4261, 0x4264, 0x427b, 0x426d, 0x4273, /* 0x22D21..0x22D7E */ 0x4299, 0x42a6, 0x42d5, 0xa4b8, 0x42fd, 0x4303, 0x430d, 0x4310, 0xa54f, 0xa550, 0x4332, 0x4335, 0x433b, 0x433c, 0x4341, 0x4344, 0x434e, 0xa546, 0x4359, 0xa61d, 0xa5a6, 0x436c, 0x4384, 0x4399, 0xa624, 0x4394, 0x43bd, 0x43f7, 0x43d4, 0x43d5, 0x43dc, 0x43e0, 0x43eb, 0x43ec, 0x43f2, 0x4409, 0x441e, 0x4425, 0x4429, 0x442f, 0x445a, 0x445b, 0x445d, 0x4473, 0x447d, 0x4487, 0x4491, 0x449d, 0x449f, 0x44cb, 0x44cc, 0x44d5, 0x44d7, 0xa7e1, 0x44e4, 0x44e5, 0x44ff, 0x4504, 0x1a6e, 0x450f, 0x4514, 0x4516, 0x1a73, 0x451e, 0x4532, 0x4544, 0x4554, 0x456b, 0x457a, 0x4581, 0x4584, 0x4585, 0x458a, 0x45b2, 0x45b5, 0x45b8, 0x45bf, 0x45c2, 0x45c9, 0x45d4, 0x1ad6, 0x45f2, 0x45f9, 0x45fc, 0x4604, 0x4608, 0x4621, 0x462a, 0x4645, 0x4651, 0x464e, 0x1aea, 0xa8c3, 0x4657, /* 0x22E21..0x22E7E */ 0x465b, 0x4663, 0xa8f5, 0xa8b6, 0x466a, 0x466b, 0x466c, 0x466d, 0x467b, 0x4680, 0x4690, 0x4692, 0x4699, 0x1b0e, 0x46ad, 0x46b1, 0x46b5, 0x1b1a, 0x46bf, 0x1b1c, 0x46ec, 0x1ad7, 0x4701, 0x4705, 0x4712, 0xa972, 0x4719, 0xa9d3, 0xa9d2, 0x474c, 0x474d, 0x4754, 0x475d, 0xa9d0, 0xa9e4, 0xa9d5, 0x4774, 0x4776, 0xa9da, 0x4792, 0xa9df, 0x6363, 0x4810, 0x47b0, 0x47b2, 0x47c3, 0x47c8, 0x47d2, 0x47d9, 0x47db, 0x47f0, 0x47f7, 0xaa4a, 0xaa51, 0xaa4b, 0x4818, 0x481f, 0x482d, 0xaa65, 0x4833, 0x483b, 0x483e, 0x4844, 0x4845, 0x4849, 0x484c, 0x4855, 0x4857, 0x1b77, 0x486b, 0x486e, 0x487a, 0x487c, 0x4882, 0x4890, 0x4896, 0x1b6d, 0x4898, 0x4899, 0x489a, 0x489c, 0x48aa, 0x48ab, 0x48b4, 0x48bb, 0x48fb, 0xaae4, 0xab5a, 0x8113, 0x48c3, 0x48c5, 0x48cc, 0x48cf, 0x48d6, /* 0x22F21..0x22F7E */ 0x48d9, 0x48e4, 0x48e5, 0x48ec, 0x48f7, 0x4903, 0x4907, 0x1b87, 0x1b88, 0xab94, 0x493b, 0x1b8d, 0x4946, 0x4969, 0x496c, 0x4972, 0x497a, 0x497f, 0x4992, 0x1ba4, 0x4996, 0x4998, 0x49a6, 0x49b0, 0x49b7, 0x49ba, 0x49bc, 0x49c0, 0x49d1, 0x49d6, 0xac39, 0xac47, 0x4a30, 0xac38, 0xac3a, 0x49e3, 0x49ee, 0x49ef, 0x49f3, 0x1bcd, 0x49f4, 0x49fe, 0x4a11, 0x4a1a, 0x4a1d, 0xad1c, 0x4a32, 0x4a33, 0x4a34, 0x4a3f, 0x4a46, 0x4a49, 0x4a7a, 0x4a4e, 0x4a52, 0x4a64, 0xad0c, 0x4a7e, 0x4a83, 0x4a8b, 0x1bf0, 0x4a91, 0x4a9f, 0x4aa1, 0xad64, 0x4aab, 0x4abd, 0x4ac6, 0x4ad4, 0x4ad0, 0x4adc, 0x4add, 0xadff, 0xade7, 0x4aec, 0x4af1, 0x4af2, 0x4af3, 0x4afd, 0xae24, 0x4b0b, 0x4b0f, 0x4b10, 0x4b11, 0xae3d, 0x4b17, 0x1c26, 0x4b2f, 0x4b4a, 0x4b58, 0x4b6c, 0x4b75, 0x4b7a, 0x4b81, /* 0x26E21..0x26E7E */ 0x4b9b, 0x4bae, 0xaf98, 0x4bbd, 0x4bbe, 0x4bc7, 0x4bc8, 0x4bc9, 0x4bda, 0x4be6, 0x4be7, 0x4bee, 0x4bf1, 0x4c02, 0x4c0a, 0x4c0e, 0x4c35, 0x4c36, 0x4c3a, 0xb07f, 0x4c3f, 0x4c4d, 0x4c5b, 0x4c6d, 0x4c84, 0x4c89, 0x1cc3, 0x4c94, 0x4c95, 0x4c97, 0x4cad, 0x4cc2, 0x4cd0, 0x1cd2, 0x4cd6, 0x4cda, 0x4cdc, 0x4ce9, 0x4cec, 0x4ced, 0xb100, 0x4d00, 0x4d0a, 0x4d24, 0x4d26, 0x4d27, 0x4c67, 0x4d2f, 0x4d3c, 0x4d5b, 0x4d5e, 0x4d60, 0x4d70, 0x4d80, 0x4d81, 0x4d8a, 0x4d8d, 0x4d91, 0x4d98, 0xb140, 0x4e17, 0xb1fa, 0xb1f9, 0xb1d3, 0x4dab, 0x4dae, 0x4db4, 0x4dc2, 0x4d34, 0x4dc8, 0x4dce, 0x4dcf, 0x4dd0, 0x4ddf, 0x4de9, 0x4df6, 0x4e36, 0x4e1e, 0x4e22, 0x4e27, 0x1d11, 0x4e32, 0x4e3c, 0x4e48, 0x4e49, 0x4e4b, 0x4e4c, 0x4e4f, 0x4e51, 0x4e53, 0x4e54, 0x4e57, 0x4e63, 0x1d1e, /* 0x26F21..0x26F7E */ 0x4e93, 0x4ea7, 0x4eb4, 0x4ebf, 0x4ec3, 0x4eca, 0x4ed9, 0x4f35, 0x4eeb, 0x4ef9, 0x4efb, 0x4f0a, 0x4f0c, 0x4f18, 0x4f25, 0x4f36, 0x4f3c, 0xb27e, 0x4f52, 0x4f57, 0x4f5a, 0x4f60, 0x4f68, 0x4f98, 0x4f7d, 0x4f90, 0x4f96, 0x4fbe, 0x4f9f, 0x4fa5, 0x4faf, 0x1d64, 0x4fb5, 0x4fc8, 0x4fc9, 0x4fda, 0x4fde, 0x4fe9, 0xb396, 0x4ffc, 0x5000, 0x5007, 0x500a, 0x5023, 0xb403, 0x5039, 0x503a, 0x503c, 0x5043, 0x5047, 0x504b, 0x1d9a, 0x5054, 0x5065, 0x5069, 0x506c, 0x506e, 0x5076, 0x507e, 0x5081, 0x5086, 0x5095, 0x5097, 0x50bb, 0xb4c6, 0x509f, 0x50b1, 0xb4fe, 0x50ec, 0x50ca, 0x50d1, 0x50d3, 0x50dc, 0x5103, 0x5104, 0x5106, 0x5107, 0x5108, 0x510c, 0x1dc0, 0x512f, 0x5131, 0x5150, 0x514a, 0x5153, 0x515e, 0x1dd4, 0x5196, 0x5180, 0x519b, 0x51a0, 0x51a2, 0x51ae, 0x51af, /* 0x27021..0x2707E */ 0x51b3, 0xb5bc, 0x51cb, 0x51d3, 0x51d9, 0x51dc, 0x5207, 0x1e05, 0x8149, 0x522b, 0x5234, 0x5238, 0x5239, 0x2e2c, 0x5242, 0x5253, 0x5257, 0x5263, 0xb629, 0x526e, 0x526f, 0x5278, 0x527f, 0x528e, 0xb6a5, 0x52ad, 0x52ae, 0x52b0, 0x52b1, 0x52c1, 0x1e60, 0x52cc, 0x1e66, 0x1e68, 0x52f3, 0x52fa, 0x5307, 0x5312, 0x5318, 0x5319, 0x1e83, 0x5339, 0x532c, 0x5331, 0x5333, 0x533d, 0x5352, 0x1e94, 0x536b, 0x536c, 0xb896, 0x536e, 0x536f, 0x5371, 0x5377, 0x5381, 0x5385, 0x538a, 0x5394, 0x5398, 0x539c, 0x539e, 0x53a5, 0x53a8, 0x53b5, 0x53b7, 0x53b9, 0x53bc, 0x53bf, 0x53c5, 0x53cb, 0x53e1, 0x53e7, 0x53f9, 0x5413, 0x53fa, 0x5401, 0x5424, 0x5431, 0x5439, 0x5453, 0x5440, 0x5443, 0x544d, 0x5452, 0x545d, 0x5471, 0x5481, 0x5485, 0x5488, 0xb94d, 0x5492, 0x5497, 0x5499, /* 0x27121..0x2717E */ 0x54a0, 0x54a1, 0x54a5, 0x54aa, 0x54ab, 0x54b9, 0x54bb, 0x54ba, 0x54d6, 0x54d8, 0x54de, 0x54ef, 0x54eb, 0xba56, 0x54fa, 0xba6f, 0x5520, 0x5524, 0x552a, 0x1f57, 0xbb16, 0x553d, 0x553e, 0x5540, 0x5548, 0x554e, 0x5550, 0x5552, 0x556c, 0x5572, 0x5571, 0x557a, 0x557d, 0x557e, 0x5581, 0xbc14, 0x558c, 0x1f75, 0x55a2, 0x1f77, 0x55b0, 0x55b7, 0x55bf, 0x55c0, 0x55c6, 0x55cf, 0x55d3, 0x55dd, 0x55df, 0x55e0, 0x55e7, 0x55ec, 0x55ee, 0x55f1, 0x55f9, 0x5603, 0x5618, 0x5607, 0x560f, 0x1fae, 0xbd0e, 0x5613, 0x561b, 0x561c, 0xbd37, 0x5625, 0x5628, 0x563c, 0x5633, 0xbd6a, 0x1fc9, 0x5641, 0xbd8b, 0x5649, 0x5655, 0x1fd7, 0x566e, 0x5695, 0x569c, 0x56a1, 0x56a0, 0x56a7, 0x56a8, 0x56af, 0xbe4a, 0x56c9, 0xbe55, 0x56e8, 0x56ec, 0xbf22, 0x5717, 0x571a, 0x572d, 0x5735, /* 0x27221..0x2727E */ 0xbfa9, 0x2039, 0xbfe5, 0xbfcd, 0x5758, 0x5760, 0x576a, 0xc01e, 0x5772, 0x577c, 0x577d, 0xc04c, 0x2058, 0x579a, 0x579f, 0x57a2, 0x57a4, 0x57a9, 0x57de, 0x57df, 0x57e4, 0x57e6, 0x57ea, 0x57ec, 0x2093, 0x57f0, 0x57f4, 0x57fb, 0xc12e, 0x5805, 0x5806, 0x5809, 0x580d, 0x5819, 0x5821, 0x582c, 0x5847, 0x5864, 0x586a, 0xc1d9, 0x588a, 0x5894, 0x58a4, 0x589d, 0x589e, 0x589f, 0x58bb, 0x58c8, 0x58cc, 0x58ce, 0x58d5, 0x58e0, 0x58e1, 0x58e6, 0x58f9, 0x58fa, 0x58fb, 0x58fe, 0xc2a7, 0x5910, 0x591b, 0x5930, 0x5925, 0x593b, 0x594a, 0x5958, 0x595b, 0x2105, 0x5967, 0x5972, 0x5994, 0x5995, 0x5996, 0x599b, 0x59a1, 0x59a9, 0x59b4, 0x59bb, 0x59c2, 0x59c7, 0x59cc, 0x59cd, 0x59d6, 0x2148, 0xc3a9, 0xc3b4, 0x214f, 0x5a0a, 0x5a11, 0x5a15, 0x5a1b, 0x5a1e, 0x2163, 0x5a2d, /* 0x27321..0x2737E */ 0x5a38, 0x5a47, 0x5a4c, 0x5a56, 0x5a59, 0x5a5c, 0x5a5f, 0x5a60, 0x5a67, 0x5a6a, 0x5a75, 0x5a78, 0x5a82, 0x5a8a, 0x5a90, 0x5aa3, 0x5aac, 0xc4d4, 0x21b4, 0x5ab9, 0x5abc, 0x5abe, 0x21bf, 0x5acc, 0x5ad1, 0x5ae7, 0x5ae8, 0x5af4, 0xc5e4, 0xc5e3, 0x5b07, 0xc5f1, 0x5b3d, 0x5b27, 0x5b2a, 0x5b2e, 0x5b2f, 0x5b31, 0x21e6, 0x21f3, 0x5b7f, 0x5b41, 0x21ee, 0x5b55, 0x5b79, 0x5b64, 0x5b66, 0x5b69, 0x5b73, 0xc632, 0x2207, 0x5b90, 0x5b91, 0x5b9b, 0x220e, 0x5baf, 0x5bb5, 0x5bbc, 0x5bc5, 0x5bca, 0xc6cb, 0xc6e4, 0x5bd4, 0x5bd6, 0x5bda, 0x5bea, 0x5bf0, 0x5c03, 0x5c0b, 0x5c0e, 0x5c0f, 0x5c26, 0x5c45, 0x5c4a, 0x5c51, 0x5c57, 0x5c5e, 0x5c61, 0x5c69, 0x5c6e, 0x5c6f, 0x5c70, 0xc82e, 0xc856, 0xc865, 0x5ca6, 0xc862, 0x5cb6, 0x5cb7, 0x5cbf, 0xc8d8, 0x5cc4, 0xc8c2, 0x5cc8, /* 0x27421..0x2747E */ 0x5ccd, 0xc8e8, 0x5cd7, 0xc923, 0x5ce6, 0x5ceb, 0xc95c, 0x5cf5, 0x5d03, 0x5d09, 0x22c6, 0x5d12, 0x5d1e, 0xc9e0, 0xc9d4, 0x5d3d, 0x5d3e, 0x5d40, 0x5d47, 0xca0c, 0xc9fb, 0x22d6, 0x5d59, 0x5d5a, 0x5d6a, 0x5d70, 0x22dd, 0x5d7f, 0xca17, 0x5d86, 0x5d88, 0x5d8c, 0x5d97, 0xca60, 0x5d9d, 0x5da7, 0x5daa, 0x5db6, 0x5db7, 0x5dc0, 0x5dd7, 0x5dd9, 0x5de6, 0x5df1, 0x5df9, 0x2302, 0xcaed, 0x8158, 0x5e10, 0x5e17, 0x5e1d, 0x5e20, 0x5e27, 0x5e2c, 0x5e45, 0x5e73, 0x5e75, 0x5e7e, 0x5e86, 0x5e87, 0x232b, 0x5e91, 0x5e98, 0x5e9a, 0x2343, 0x5f3c, 0x5f3b, 0x5f3e, 0x5f43, 0x5f44, 0x5f4f, 0x14c1, 0xcb70, 0x5f52, 0xcb86, 0x5f61, 0x5f63, 0x5f64, 0x5f6d, 0x5f7d, 0x5f7e, 0xcc4c, 0x5f90, 0x317b, 0xb10e, 0x5f96, 0x5f9c, 0x5fad, 0xcd02, 0x5fc3, 0x5fcf, 0x5fe3, 0x5fe5, 0x5fef, /* 0x27521..0x2757E */ 0x5ff2, 0x6002, 0x600a, 0x6008, 0x600e, 0x6011, 0x6016, 0x6024, 0x602c, 0x6030, 0x6043, 0x6066, 0x6071, 0x6075, 0x607b, 0x6099, 0x609c, 0x60a4, 0x60a7, 0x60b8, 0xce7e, 0x60c5, 0x60d5, 0x60d8, 0x60e6, 0xceb0, 0x610d, 0x60f5, 0x60fb, 0x23ee, 0x6135, 0x6116, 0x611e, 0x23f0, 0x6124, 0x6127, 0x612c, 0xcf1d, 0x613d, 0x2408, 0x6169, 0x2417, 0x6181, 0x241c, 0x6184, 0x6185, 0x2422, 0x6198, 0x61b2, 0x61c1, 0x61c3, 0x61d6, 0x61db, 0xd0dd, 0x61e4, 0xd0ea, 0x61ec, 0xd151, 0x61fd, 0x61ff, 0xd16f, 0x6204, 0xd1dd, 0x6219, 0x6221, 0x6222, 0xd21e, 0x6232, 0x6234, 0x623c, 0x6246, 0x6249, 0x6245, 0xd258, 0x624b, 0x2476, 0x624f, 0x247a, 0x6257, 0xd28c, 0x625c, 0x6263, 0xd2b7, 0x815d, 0x815e, 0x6279, 0x2491, 0x627d, 0x627f, 0x6283, 0x628a, 0x6293, 0x62a7, 0x62a8, /* 0x27621..0x2767E */ 0x62b2, 0x62b4, 0x62ba, 0x62bc, 0x62e2, 0x62e8, 0x62f7, 0x6307, 0x6308, 0x630c, 0x6354, 0x631b, 0x631d, 0x6330, 0x633c, 0x6344, 0x6357, 0x24be, 0x637f, 0x24d4, 0x24b3, 0x638d, 0x6394, 0x6395, 0x639b, 0x639d, 0x63c9, 0x63d0, 0x63d4, 0x63dd, 0x63e5, 0x63f9, 0x640f, 0x6411, 0x6415, 0xd373, 0x6417, 0x6439, 0x644a, 0x644f, 0x6451, 0x6452, 0x6459, 0x645a, 0x645c, 0xd3dd, 0x6465, 0x6476, 0x6478, 0x647c, 0x6481, 0x250d, 0x64dc, 0x6497, 0x64a6, 0x64be, 0x2508, 0x64ce, 0x64cf, 0x64d3, 0xd465, 0x64e7, 0x64ea, 0x64ef, 0x64f0, 0x64f1, 0x64fa, 0x64fd, 0x650c, 0x651b, 0x6524, 0x6525, 0x652b, 0x6534, 0x654f, 0x656f, 0x2525, 0x2543, 0x653e, 0x6551, 0x6553, 0x655e, 0x6561, 0x6562, 0xd594, 0x657b, 0x657d, 0x657f, 0x6581, 0x6586, 0x6593, 0x659d, 0x659f, 0xd5f8, /* 0x27721..0x2777E */ 0xd5f6, 0xd5f7, 0x65b7, 0x65bc, 0x65c7, 0x65ca, 0x65d8, 0x65d9, 0x65df, 0x65e1, 0x65e6, 0x65f6, 0x6600, 0x6611, 0x661e, 0x6621, 0x6624, 0x6627, 0xd68d, 0x6639, 0x663c, 0xd6b9, 0x6640, 0x8120, 0x6653, 0x6656, 0x666f, 0x6677, 0x667a, 0x6687, 0x6689, 0x668d, 0x6691, 0x669c, 0x669d, 0x66a8, 0x8121, 0x66b1, 0x66b3, 0x66c1, 0x66c3, 0x66d1, 0x66d5, 0x66d7, 0x66e3, 0x66e6, 0x25b8, 0x6705, 0x6707, 0x670e, 0x6710, 0x6713, 0x6719, 0x671f, 0x6721, 0x6723, 0x6731, 0x673a, 0x673e, 0x6740, 0x6743, 0x6751, 0x6758, 0x6764, 0x6765, 0x6772, 0x677c, 0xd75b, 0xd75a, 0x67a7, 0x6789, 0x678b, 0x6793, 0x67a0, 0xd77e, 0x25e5, 0x67be, 0xd790, 0x67c1, 0x67ce, 0x67f5, 0x67df, 0xd7c9, 0x67e3, 0x67e5, 0x67e6, 0x67ea, 0x67eb, 0x67ed, 0x6801, 0x6803, 0x680b, 0x6813, 0x6828, /* 0x27821..0x2787E */ 0x682e, 0x6832, 0x683c, 0x260f, 0x684a, 0x6858, 0x685f, 0x6864, 0xd815, 0xd814, 0x6869, 0xd831, 0x686f, 0x68a0, 0x68bc, 0x68bd, 0x68be, 0x68c0, 0x68d2, 0xd893, 0x68d1, 0x68d3, 0x68db, 0x68f0, 0x68f1, 0x2641, 0x6901, 0xd90e, 0x6937, 0xd923, 0x6942, 0x6945, 0x6949, 0xd952, 0x2665, 0x6962, 0x6980, 0x6989, 0x6990, 0x699f, 0x69b0, 0x69b7, 0x69d6, 0x69d8, 0x69eb, 0x26a1, 0x69f1, 0x69f3, 0x69fd, 0x69ff, 0x26af, 0x6a11, 0x6a14, 0xda85, 0x6a21, 0x6a35, 0x6a3e, 0x6a45, 0x6a4d, 0x6a58, 0x6aae, 0x6a90, 0x6ab7, 0x6abe, 0x6ad7, 0x6afc, 0xdb84, 0x6b0a, 0x6b05, 0x6b0d, 0x6b1c, 0x6b1f, 0x6b2d, 0x6b43, 0x270c, 0x6b51, 0x6b5e, 0x6b76, 0x6b7f, 0x6b81, 0x6b8b, 0x6b94, 0x6b95, 0x6b9c, 0x6b9e, 0x6c39, 0xdcb3, 0x6c3d, 0xdcbe, 0xdcc7, 0x6c45, 0x6c47, 0x6c4f, 0x6c54, /* 0x27921..0x2797E */ 0x6c57, 0x6c69, 0x6c6d, 0x6c73, 0xddb8, 0x6c93, 0x6c92, 0x6c99, 0x2764, 0x6c9b, 0x6ca4, 0x6cd6, 0x6cd5, 0x6cd9, 0xde20, 0x6cf0, 0x6cf1, 0xde90, 0x6d09, 0x6d0e, 0x6d6c, 0x6d84, 0x6d95, 0x6da6, 0xdfb7, 0x6dc6, 0x6dc8, 0x6dd9, 0x6dec, 0x6e0c, 0x27fd, 0x6dfd, 0x6e06, 0xe08a, 0x6e14, 0x6e16, 0x6e21, 0x6e22, 0x6e27, 0xe0bb, 0x2816, 0x6e36, 0x6e39, 0x6e4b, 0x6e54, 0x6e62, 0x6e6c, 0x6e6d, 0x6e6f, 0x6e98, 0x6e9e, 0x6eae, 0x6eb3, 0x6eb5, 0x6eb6, 0x6ebb, 0xe182, 0x6ed1, 0x6ed4, 0x284e, 0x6ef9, 0xe1f3, 0x6f00, 0x6f08, 0x6f17, 0x6f2b, 0x6f40, 0x6f4a, 0x6f58, 0xe28c, 0x6fa4, 0x6fb4, 0x8166, 0x6fb6, 0xe2d5, 0x6fc1, 0x6fc6, 0x8124, 0x6fca, 0x6fcd, 0x6fd3, 0x6fd5, 0x6fe0, 0x6ff1, 0x6ff5, 0x6ffb, 0x7002, 0x700c, 0x7037, 0xe36b, 0x7043, 0x7044, 0x705d, 0xe3c8, /* 0x27A21..0x27A7E */ 0xe3c9, 0x7085, 0x708c, 0x7090, 0x761d, 0x70a1, 0x28b5, 0x70b0, 0x70b6, 0x70c3, 0x70c8, 0xe4d7, 0x70dc, 0x70df, 0xe4fa, 0x70f6, 0x70f2, 0x7100, 0x70eb, 0x70fe, 0x70ff, 0x7104, 0x7106, 0x7118, 0x711c, 0x711e, 0x7137, 0x7139, 0x713a, 0x7146, 0x7147, 0x7157, 0x7159, 0x7161, 0x7164, 0x7174, 0x7179, 0x7185, 0x718e, 0x71a8, 0x71ae, 0x71b3, 0x71b6, 0x71c3, 0x71c4, 0x71da, 0xe549, 0xe546, 0x71ec, 0x71ee, 0x7201, 0x720a, 0x7216, 0x7217, 0xe56b, 0x7233, 0x7242, 0x7247, 0x724a, 0x724e, 0x7251, 0x7256, 0x7259, 0x7260, 0x7261, 0x7265, 0x7267, 0x7268, 0xe587, 0xe588, 0x727c, 0x727d, 0x727f, 0x7289, 0x728d, 0x7297, 0x7299, 0x729f, 0x72a7, 0x72ab, 0xe5ba, 0xe5bb, 0x72b2, 0x72bf, 0x72c0, 0x72c6, 0x72ce, 0x72d0, 0x72d7, 0x72d9, 0x72e5, 0x72e7, 0x7311, 0xe61e, /* 0x27B21..0x27B7E */ 0xe629, 0x72f7, 0x72f9, 0x72fb, 0x7302, 0x730d, 0x7315, 0x731d, 0x731e, 0x7327, 0x7329, 0xe671, 0xe643, 0x7347, 0x7351, 0x7357, 0x735a, 0x736b, 0x7371, 0x7373, 0x73a1, 0xe699, 0xe6cd, 0x7388, 0x738b, 0x738f, 0x739e, 0x73f5, 0xe6e4, 0xe6dd, 0x73f1, 0x73c1, 0x73c7, 0x73dc, 0x73e2, 0x73e7, 0x7409, 0x740f, 0x7416, 0x7417, 0x73fb, 0x7432, 0x7434, 0x743b, 0x7445, 0xe7c1, 0xe7ef, 0x746d, 0x746f, 0x7578, 0x7579, 0x7586, 0x758c, 0x758d, 0xe810, 0x75ab, 0x75b4, 0xe871, 0x75c8, 0xe8fb, 0xe91f, 0x762c, 0x7633, 0x7634, 0xe936, 0x763c, 0x7641, 0x7661, 0xe989, 0x7682, 0xe9eb, 0x769a, 0xea32, 0x29e7, 0x76a9, 0x76af, 0x76b3, 0x76ba, 0x76bd, 0x29fa, 0xeaf8, 0x76d8, 0x76da, 0x76dd, 0x2a04, 0x7714, 0x7723, 0x2a29, 0x7736, 0x7741, 0x7747, 0x7755, 0x7757, 0x775b, /* 0x27C21..0x27C7E */ 0x776a, 0xeba0, 0xebb1, 0x7796, 0x779a, 0x779e, 0x77a2, 0x77b1, 0x77b2, 0x77be, 0x77cc, 0x77d1, 0x77d4, 0x77d8, 0x77d9, 0x77e1, 0x77f1, 0x7804, 0x780d, 0x780e, 0x7814, 0x7816, 0x2abc, 0xec90, 0x7823, 0x7832, 0x7833, 0x7825, 0x7847, 0x7866, 0x78ab, 0x78ad, 0x78b0, 0xedcf, 0x78b7, 0x78b8, 0x78bb, 0x78bc, 0x78bf, 0x78c2, 0x78c7, 0x78cb, 0x78e0, 0xee7f, 0x78e1, 0x78e3, 0x78e5, 0x78ea, 0x78f0, 0x78f1, 0x78f3, 0x7908, 0x2b3b, 0xeef0, 0x7916, 0x7917, 0xef19, 0x791a, 0x791b, 0x791c, 0xef50, 0x7931, 0x7932, 0x7933, 0x793a, 0x793b, 0x793c, 0x7940, 0x7941, 0x7946, 0x794d, 0x794e, 0x795c, 0x795f, 0x7960, 0x79a3, 0x79a6, 0x79b9, 0x79bd, 0x79bf, 0x79c3, 0x79c9, 0x79d4, 0x79d9, 0x79de, 0xf0c6, 0x79f0, 0x79f9, 0x79fc, 0x7a0a, 0x7a11, 0x7a16, 0x7a1a, 0x7a20, /* 0x27D21..0x27D7E */ 0x7a31, 0x7a36, 0x7a44, 0x7a4c, 0x7a58, 0x2bc2, 0x7aaf, 0x2bca, 0x7ab7, 0x2bd2, 0x7ab9, 0xf172, 0x7ac6, 0x7ad0, 0x7ad2, 0x7ad5, 0x2be8, 0x7adc, 0x7ae0, 0x7ae5, 0x7ae9, 0x7b03, 0x7b0c, 0x7b10, 0x7b12, 0x7b16, 0x7b1c, 0x7b2b, 0x7b33, 0x7b3d, 0x2c20, 0x7b4b, 0x7b63, 0x7b65, 0x7b6b, 0x7b6c, 0x7b73, 0x7b76, 0x7b77, 0x7ba6, 0x7bac, 0x7bb1, 0xf2db, 0xf33d, 0x7bb2, 0x7bb8, 0x7bbe, 0x7bc7, 0x7bf3, 0x7bd8, 0x7bdd, 0x7be7, 0x7bea, 0x7beb, 0x7bef, 0x7bee, 0xf315, 0x7bfa, 0xf38a, 0x7bf7, 0xf349, 0x7c16, 0x7c18, 0x7c19, 0x7c1a, 0x7c1d, 0x7c22, 0x7c27, 0x7c29, 0x7c2a, 0xf3c4, 0x7c31, 0x7c36, 0x7c37, 0x7c45, 0x7c5c, 0xf3e9, 0x7c49, 0x7c4a, 0xf3db, 0x7c54, 0x7c58, 0x7c5b, 0x7c5d, 0x7c5f, 0x7c69, 0x7c6a, 0x7c6b, 0x7c6d, 0x7c6e, 0x7c70, 0x7c72, 0x7c75, 0x7c7a, /* 0x27E21..0x27E7E */ 0x7ce6, 0x7cf2, 0x7d0b, 0x7d02, 0xf4ce, 0x7d11, 0x7d17, 0x7d18, 0xf52f, 0x2cc4, 0xf51a, 0x7d32, 0x2cd1, 0x7d42, 0x7d4a, 0x7d5f, 0x7d62, 0xf5f9, 0x7d69, 0x7d6b, 0xf582, 0x7d73, 0x7d76, 0x7d77, 0x7d7e, 0x7d84, 0x7d8d, 0x7d99, 0x7da1, 0x7dbf, 0x7db5, 0x7db9, 0x7dbd, 0x7dc3, 0x7dc7, 0x7dc9, 0x7dd6, 0x7dda, 0x7ddf, 0x7de0, 0x7de3, 0x7df4, 0x2d07, 0x7e0a, 0x7e02, 0x7e0d, 0x7e19, 0x7e1c, 0x7e1d, 0x7e7b, 0x9f18, 0x7e80, 0x7e85, 0x7e9b, 0x7ea8, 0xf70c, 0x7ebd, 0xf7b7, 0x7edf, 0x7ee7, 0x7eee, 0x7eff, 0x7f02, 0x2d77, 0x7f03, 0x7f17, 0x7f19, 0x7f2f, 0x7f37, 0x7f3a, 0x7f3d, 0x7f41, 0x7f45, 0x7f46, 0x7f53, 0x7f55, 0x7f58, 0xf8f1, 0x7f5d, 0xf902, 0x7f69, 0xf91a, 0x7f6d, 0x7f70, 0x7f75, 0xf9b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, }; static const ucs4_t jisx0213_to_ucs_pagestart[] = { 0x0000, 0x0100, 0x0200, 0x0300, 0x0400, 0x1e00, 0x1f00, 0x2000, 0x2100, 0x2200, 0x2300, 0x2400, 0x2500, 0x2600, 0x2700, 0x2900, 0x3000, 0x3100, 0x3200, 0x3300, 0x3400, 0x3500, 0x3600, 0x3700, 0x3800, 0x3900, 0x3a00, 0x3b00, 0x3c00, 0x3d00, 0x3e00, 0x3f00, 0x4000, 0x4100, 0x4200, 0x4300, 0x4400, 0x4500, 0x4600, 0x4700, 0x4800, 0x4900, 0x4a00, 0x4b00, 0x4c00, 0x4d00, 0x4e00, 0x4f00, 0x5000, 0x5100, 0x5200, 0x5300, 0x5400, 0x5500, 0x5600, 0x5700, 0x5800, 0x5900, 0x5a00, 0x5b00, 0x5c00, 0x5d00, 0x5e00, 0x5f00, 0x6000, 0x6100, 0x6200, 0x6300, 0x6400, 0x6500, 0x6600, 0x6700, 0x6800, 0x6900, 0x6a00, 0x6b00, 0x6c00, 0x6d00, 0x6e00, 0x6f00, 0x7000, 0x7100, 0x7200, 0x7300, 0x7400, 0x7500, 0x7600, 0x7700, 0x7800, 0x7900, 0x7a00, 0x7b00, 0x7c00, 0x7d00, 0x7e00, 0x7f00, 0x8000, 0x8100, 0x8200, 0x8300, 0x8400, 0x8500, 0x8600, 0x8700, 0x8800, 0x8900, 0x8a00, 0x8b00, 0x8c00, 0x8d00, 0x8e00, 0x8f00, 0x9000, 0x9100, 0x9200, 0x9300, 0x9400, 0x9500, 0x9600, 0x9700, 0x9800, 0x9900, 0x9a00, 0x9b00, 0x9c00, 0x9d00, 0x9e00, 0x9f00, 0xf900, 0xfa00, 0xfe00, 0xff00, 0x20000, 0x20180, 0x20300, 0x20400, 0x20500, 0x20600, 0x20700, 0x20800, 0x20900, 0x20a00, 0x20b00, 0x20d00, 0x20e00, 0x20f00, 0x21200, 0x21300, 0x21400, 0x21500, 0x21600, 0x21700, 0x21800, 0x21900, 0x21c00, 0x21d00, 0x21e00, 0x21f00, 0x22100, 0x22200, 0x22300, 0x22600, 0x22800, 0x22900, 0x22a00, 0x22b00, 0x22c00, 0x22d00, 0x23100, 0x23300, 0x23400, 0x23500, 0x23600, 0x23700, 0x23800, 0x23a00, 0x23c00, 0x23d00, 0x23f00, 0x24000, 0x24100, 0x24300, 0x24600, 0x24700, 0x24800, 0x24a00, 0x24b00, 0x24c00, 0x24d00, 0x24e00, 0x25000, 0x25100, 0x25200, 0x25400, 0x25500, 0x25700, 0x25900, 0x25a00, 0x25b80, 0x25d00, 0x25e00, 0x25f00, 0x26000, 0x26200, 0x26300, 0x26400, 0x26600, 0x26700, 0x26800, 0x26900, 0x26a00, 0x26c00, 0x26e00, 0x26f00, 0x27080, 0x27380, 0x27600, 0x27700, 0x27900, 0x27a00, 0x27b00, 0x27c00, 0x27d80, 0x27f00, 0x28000, 0x28200, 0x28380, 0x28500, 0x28600, 0x28900, 0x28a00, 0x28b00, 0x28d00, 0x28e00, 0x28f00, 0x29200, 0x29400, 0x29500, 0x29600, 0x29700, 0x29800, 0x29a00, 0x29d00, 0x29e00, 0x29f00, 0x2a000, 0x2a100, 0x2a380, 0x2a500, 0x2a600, }; static const short jisx0213_from_ucs_level1[2715] = { -1, -1, 0, 1, 2, 3, 4, 5, -1, 6, 7, 8, 9, 10, 11, 12, 13, 14, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, -1, -1, -1, -1, 16, -1, -1, 17, 18, 19, -1, 20, 21, 22, 23, 24, 25, 26, 27, 28, -1, 29, 30, 31, 32, -1, 33, 34, 35, 36, 37, 38, 39, -1, -1, 40, 41, -1, -1, -1, -1, -1, -1, 42, -1, 43, 44, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 45, 46, 47, 48, -1, -1, -1, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, -1, 70, 71, 72, 73, 74, -1, 75, 76, 77, -1, -1, -1, 78, -1, 79, 80, 81, 82, 83, 84, -1, -1, 85, 86, 87, 88, 89, 90, 91, 92, -1, -1, 93, 94, 95, 96, 97, 98, -1, 99, 100, 101, 102, 103, 104, -1, 105, 106, 107, -1, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, -1, 120, 121, -1, 122, 123, 124, 125, -1, -1, -1, 126, 127, 128, -1, 129, -1, 130, -1, -1, 131, 132, -1, -1, 133, 134, 135, -1, -1, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, -1, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, -1, -1, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, -1, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 458, 459, -1, 460, 461, 462, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 463, -1, -1, 464, 465, -1, 466, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 467, -1, 468, -1, -1, -1, 469, -1, 470, -1, -1, -1, 471, 472, 473, 474, -1, 475, -1, -1, 476, -1, -1, 477, 478, -1, -1, -1, -1, 479, -1, -1, 480, -1, 481, -1, -1, 482, 483, -1, -1, -1, -1, 484, 485, -1, 486, -1, -1, -1, -1, -1, -1, 487, -1, 488, -1, 489, 490, -1, -1, 491, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 492, 493, -1, 494, 495, 496, -1, 497, -1, 498, -1, -1, -1, -1, -1, 499, -1, 500, 501, -1, 502, 503, -1, -1, -1, -1, 504, -1, -1, -1, -1, 505, -1, -1, -1, -1, -1, -1, -1, -1, -1, 506, -1, -1, 507, 508, 509, 510, 511, -1, -1, -1, 512, 513, -1, 514, -1, -1, -1, -1, -1, 515, -1, -1, 516, -1, -1, -1, 517, -1, 518, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 519, -1, -1, -1, -1, -1, 520, 521, -1, -1, -1, 522, -1, -1, -1, 523, -1, -1, 524, 525, -1, 526, -1, -1, -1, -1, -1, -1, 527, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 528, 529, -1, -1, -1, -1, -1, 530, -1, 531, -1, 532, -1, 533, -1, 534, 535, 536, 537, 538, -1, -1, 539, 540, -1, 541, 542, -1, -1, -1, -1, -1, -1, -1, -1, -1, 543, -1, -1, -1, -1, -1, -1, 544, -1, 545, 546, 547, -1, 548, -1, -1, -1, -1, -1, 549, -1, -1, -1, -1, 550, -1, 551, -1, -1, 552, -1, -1, -1, -1, -1, -1, 553, -1, -1, -1, -1, -1, -1, -1, -1, -1, 554, -1, 555, -1, -1, -1, -1, 556, -1, -1, 557, -1, -1, -1, -1, -1, -1, 558, -1, -1, -1, 559, -1, -1, 560, -1, -1, -1, 561, -1, -1, -1, 562, 563, 564, -1, -1, -1, -1, -1, -1, 565, -1, -1, 566, -1, 567, 568, 569, 570, -1, -1, -1, -1, -1, -1, 571, -1, 572, 573, 574, -1, 575, -1, -1, -1, -1, -1, -1, 576, 577, -1, -1, -1, -1, -1, -1, -1, -1, 578, -1, -1, -1, 579, -1, -1, 580, -1, -1, 581, -1, -1, -1, -1, 582, -1, 583, 584, -1, 585, 586, 587, -1, 588, 589, 590, -1, 591, -1, -1, -1, -1, -1, 592, 593, -1, -1, 594, -1, -1, 595, -1, -1, -1, -1, -1, -1, -1, -1, 596, 597, -1, 598, -1, -1, -1, -1, -1, -1, 599, -1, 600, -1, 601, 602, 603, 604, 605, -1, -1, -1, -1, 606, 607, -1, 608, -1, -1, -1, -1, -1, 609, -1, -1, -1, -1, 610, 611, -1, -1, -1, 612, 613, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 614, 615, 616, -1, -1, -1, -1, -1, -1, 617, -1, 618, -1, 619, 620, -1, -1, -1, -1, -1, -1, -1, -1, 621, -1, -1, -1, 622, -1, -1, -1, 623, 624, -1, -1, 625, -1, -1, -1, 626, -1, 627, -1, -1, -1, -1, -1, 628, -1, -1, -1, 629, -1, -1, -1, -1, -1, -1, 630, 631, 632, -1, -1, -1, 633, 634, 635, -1, -1, -1, 636, -1, 637, -1, -1, -1, 638, -1, -1, -1, -1, -1, -1, -1, -1, -1, 639, 640, -1, 641, 642, 643, 644, -1, -1, -1, 645, -1, -1, -1, -1, 646, 647, -1, 648, 649, -1, 650, 651, 652, -1, -1, 653, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 654, -1, -1, -1, -1, -1, -1, -1, 655, -1, -1, -1, -1, 656, -1, 657, -1, 658, 659, 660, -1, -1, -1, -1, -1, 661, -1, -1, -1, -1, -1, 662, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 663, 664, 665, 666, 667, -1, -1, -1, 668, 669, -1, 670, 671, -1, -1, 672, -1, -1, -1, -1, -1, -1, -1, 673, -1, 674, -1, -1, -1, -1, -1, -1, 675, 676, -1, 677, }; static const unsigned short jisx0213_from_ucs_level2_data[] = { /* 0x0080 */ 0x2922, 0x2923, 0x2171, 0x2172, 0x2924, 0x2925, 0x2178, 0x212f, 0x2926, 0x2927, 0x2928, 0x224c, 0x2929, 0x292a, 0x292b, 0x216b, 0x215e, 0x292c, 0x292d, 0x212d, 0x2279, 0x292e, 0x292f, 0x2930, 0x2931, 0x2932, 0x2933, 0x2934, 0x2935, 0x2936, /* 0x00C0 */ 0x2937, 0x2938, 0x2939, 0x293a, 0x293b, 0x293c, 0x293d, 0x293e, 0x293f, 0x2940, 0x2941, 0x2942, 0x2943, 0x2944, 0x2945, 0x2946, 0x2947, 0x2948, 0x2949, 0x294a, 0x294b, 0x294c, 0x294d, 0x215f, 0x294e, 0x294f, 0x2950, 0x2951, 0x2952, 0x2953, 0x2954, 0x2955, 0x2956, 0x2957, 0x2958, 0x2959, 0x295a, 0x295b, 0x29dc, 0x295d, 0x295e, 0x295f, 0x2960, 0x2961, 0x2962, 0x2963, 0x2964, 0x2965, 0x2966, 0x2967, 0x2968, 0x2969, 0x296a, 0x296b, 0x296c, 0x2160, 0x296d, 0x296e, 0x296f, 0x2970, 0x2971, 0x2972, 0x2973, 0x2974, /* 0x0100 */ 0x2975, 0x297a, 0x2a3a, 0x2a49, 0x2a21, 0x2a2c, 0x2a3c, 0x2a4b, 0x2a59, 0x2a5f, 0x2a3d, 0x2a4c, 0x2a40, 0x2a4f, 0x2a50, 0x2978, 0x297d, 0x2a3e, 0x2a4d, 0x2a3f, 0x2a4e, 0x2a5a, 0x2a60, 0x2a5b, 0x2a61, 0x2a7d, 0x2976, 0x297b, 0x2a5c, 0x2a62, 0x2a3b, 0x2a4a, 0x2a24, 0x2a2f, /* 0x0140 */ 0x2a23, 0x2a2e, 0x2a41, 0x2a51, 0x2a42, 0x2a52, 0x2a7a, 0x2979, 0x297e, 0x2a43, 0x2a53, 0x2b2b, 0x2b2a, 0x2a39, 0x2a48, 0x2a44, 0x2a54, 0x2a25, 0x2a30, 0x2a5d, 0x2a63, 0x2a27, 0x2a33, 0x2a26, 0x2a32, 0x2a47, 0x2a57, 0x2a28, 0x2a34, 0x2977, 0x297c, 0x2a5e, 0x2a64, 0x2a45, 0x2a55, 0x2a46, 0x2a56, 0x2a29, 0x2a35, 0x2a2b, 0x2a38, 0x2a2a, 0x2a37, /* 0x0180 */ 0x2b29, /* 0x01C0 */ 0x2b24, 0x286f, 0x2870, 0x2871, 0x2876, 0x2877, 0x2878, 0x2879, 0x287a, 0x287b, 0x287c, 0x2874, 0x2875, 0x2b45, /* 0x0240 */ 0x2b33, 0x2b39, 0x2b3a, 0x2b25, 0x2bb8, 0x2b3f, 0x2a6e, 0x2b26, 0x2b2e, 0x2bb0, 0x2bc3, 0x2b31, 0x2b32, 0x2a75, 0x2b28, 0x2a79, 0x2b36, 0x2b3c, 0x2b22, 0x2b42, 0x2b2c, 0x2a6a, 0x2a74, 0x2a6b, 0x2b34, 0x2a7b, 0x2a65, 0x2a76, 0x2a6f, 0x2b2f, 0x2a6c, 0x2b41, 0x2a73, 0x2a70, 0x2a67, /* 0x0280 */ 0x2a7c, 0x2a71, 0x2a68, 0x2b27, 0x2a6d, 0x2b2d, 0x2b35, 0x2a66, 0x2bb7, 0x2b3b, 0x2a78, 0x2a72, 0x2b40, 0x2a69, 0x2b21, 0x2a7e, 0x2b23, 0x2a77, 0x2b3e, 0x2b3d, /* 0x02C0 */ 0x2a31, 0x2b53, 0x2b54, 0x2b55, 0x2b56, 0x2a22, 0x2a58, 0x2a2d, 0x2a36, 0x2b71, 0x2be0, 0x2b61, 0x2b62, 0x2b63, 0x2be4, /* 0x0300 */ 0x2b5c, 0x2b5a, 0x2b5f, 0x2b7d, 0x2b5b, 0x2b57, 0x2b6d, 0x2b59, 0x2b5e, 0x2b5d, 0x2b78, 0x2b79, 0x2b7e, 0x2b6a, 0x2b76, 0x2b77, 0x2b6b, 0x2b6c, 0x2b72, 0x2b67, 0x2b6f, 0x2b7a, 0x2b68, 0x2b70, 0x2b73, 0x2b75, 0x2b69, 0x2b7b, 0x2b7c, 0x2b74, 0x2b6e, /* 0x0340 */ 0x2b52, /* 0x0380 */ 0x2621, 0x2622, 0x2623, 0x2624, 0x2625, 0x2626, 0x2627, 0x2628, 0x2629, 0x262a, 0x262b, 0x262c, 0x262d, 0x262e, 0x262f, 0x2630, 0x2631, 0x2632, 0x2633, 0x2634, 0x2635, 0x2636, 0x2637, 0x2638, 0x2641, 0x2642, 0x2643, 0x2644, 0x2645, 0x2646, 0x2647, 0x2648, 0x2649, 0x264a, 0x264b, 0x264c, 0x264d, 0x264e, 0x264f, /* 0x03C0 */ 0x2650, 0x2651, 0x2659, 0x2652, 0x2653, 0x2654, 0x2655, 0x2656, 0x2657, 0x2658, /* 0x0400 */ 0x2727, 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, /* 0x0440 */ 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767, 0x2768, 0x2769, 0x276a, 0x276b, 0x276c, 0x276d, 0x276e, 0x276f, 0x2770, 0x2771, 0x2757, /* 0x1E00 */ 0x2872, 0x2873, /* 0x1F40 */ 0x2b46, 0x2b47, 0x2b50, 0x2b51, /* 0x2000 */ 0x213e, 0x237c, 0x213d, 0x2142, 0x2146, 0x2147, 0x2148, 0x2149, 0x2277, 0x2278, 0x2340, 0x2145, 0x2144, 0x2273, 0x216c, 0x216d, 0x2228, 0x286b, 0x2b58, /* 0x2040 */ 0x2c7e, 0x286c, 0x286d, 0x286e, 0x2c7d, /* 0x2080 */ 0x2921, /* 0x2100 */ 0x216e, 0x235d, 0x235f, 0x2d62, 0x2d64, 0x2360, 0x2272, 0x235c, /* 0x2140 */ 0x2778, 0x2779, 0x277a, 0x2d35, 0x2d36, 0x2d37, 0x2d38, 0x2d39, 0x2d3a, 0x2d3b, 0x2d3c, 0x2d3d, 0x2d3e, 0x2d3f, 0x2d57, 0x2c35, 0x2c36, 0x2c37, 0x2c38, 0x2c39, 0x2c3a, 0x2c3b, 0x2c3c, 0x2c3d, 0x2c3e, 0x2c3f, 0x2c40, /* 0x2180 */ 0x222b, 0x222c, 0x222a, 0x222d, 0x2271, 0x2327, 0x2325, 0x2326, 0x2328, /* 0x21C0 */ 0x2329, 0x224d, 0x224e, 0x232b, 0x232c, 0x232a, 0x232d, /* 0x2200 */ 0x224f, 0x225f, 0x2250, 0x2247, 0x2260, 0x223a, 0x2246, 0x223b, 0x215d, 0x235b, 0x2265, 0x2267, 0x2167, 0x2d78, 0x225c, 0x2254, 0x2255, 0x224a, 0x224b, 0x2241, 0x2240, 0x2269, 0x226a, 0x2d73, 0x2168, 0x2268, 0x2266, /* 0x2240 */ 0x226c, 0x226d, 0x226e, 0x2262, 0x2162, 0x2261, 0x226b, 0x2165, 0x2166, 0x2263, 0x2264, 0x226f, 0x2270, /* 0x2280 */ 0x223e, 0x223f, 0x2242, 0x2243, 0x223c, 0x223d, 0x2244, 0x2245, 0x2251, 0x2252, 0x2253, 0x225d, 0x2d79, /* 0x22C0 */ 0x2776, 0x2777, /* 0x2300 */ 0x2248, 0x2249, 0x225e, 0x277c, /* 0x2380 */ 0x2742, 0x2743, /* 0x23C0 */ 0x2744, 0x2745, 0x2746, 0x2747, 0x2748, 0x2749, 0x274a, 0x274b, 0x274c, 0x274d, 0x274e, 0x274f, 0x2750, 0x277e, /* 0x2400 */ 0x277d, /* 0x2440 */ 0x2d21, 0x2d22, 0x2d23, 0x2d24, 0x2d25, 0x2d26, 0x2d27, 0x2d28, 0x2d29, 0x2d2a, 0x2d2b, 0x2d2c, 0x2d2d, 0x2d2e, 0x2d2f, 0x2d30, 0x2d31, 0x2d32, 0x2d33, 0x2d34, /* 0x24C0 */ 0x2c41, 0x2c42, 0x2c43, 0x2c44, 0x2c45, 0x2c46, 0x2c47, 0x2c48, 0x2c49, 0x2c4a, 0x2c4b, 0x2c4c, 0x2c4d, 0x2c4e, 0x2c4f, 0x2c50, 0x2c51, 0x2c52, 0x2c53, 0x2c54, 0x2c55, 0x2c56, 0x2c57, 0x2c58, 0x2c59, 0x2c5a, 0x2c2b, 0x2c2c, 0x2c2d, 0x2c2e, 0x2c2f, 0x2c30, 0x2c31, 0x2c32, 0x2c33, 0x2c34, 0x265a, 0x265b, 0x265c, 0x265d, 0x265e, 0x265f, 0x2660, 0x2661, 0x2662, 0x2663, /* 0x2500 */ 0x2821, 0x282c, 0x2822, 0x282d, 0x2823, 0x282e, 0x2824, 0x282f, 0x2826, 0x2831, 0x2825, 0x2830, 0x2827, 0x283c, 0x2837, 0x2832, 0x2829, 0x283e, 0x2839, 0x2834, 0x2828, 0x2838, 0x283d, 0x2833, 0x282a, 0x283a, 0x283f, 0x2835, 0x282b, 0x283b, /* 0x2540 */ 0x2840, 0x2836, /* 0x2580 */ 0x2223, 0x2222, 0x266d, 0x2225, 0x2224, 0x2322, 0x2321, 0x2227, 0x2226, /* 0x25C0 */ 0x2324, 0x2323, 0x2221, 0x217e, 0x233b, 0x217b, 0x217d, 0x217c, 0x2867, 0x2868, 0x2869, 0x286a, 0x233f, 0x227e, /* 0x2600 */ 0x2668, 0x2669, 0x266a, 0x266b, 0x217a, 0x2179, 0x2667, 0x2664, 0x2665, 0x2d7e, /* 0x2640 */ 0x216a, 0x2169, 0x263a, 0x263d, 0x263b, 0x2640, 0x2639, 0x263e, 0x263c, 0x263f, 0x266c, 0x227d, 0x2276, 0x227b, 0x227c, 0x2275, 0x227a, 0x2274, /* 0x2700 */ 0x277b, /* 0x2740 */ 0x2d7d, 0x2c21, 0x2c22, 0x2c23, 0x2c24, 0x2c25, 0x2c26, 0x2c27, 0x2c28, 0x2c29, 0x2c2a, /* 0x2900 */ 0x232e, 0x232f, /* 0x2980 */ 0x233a, /* 0x29C0 */ 0x237d, 0x237e, /* 0x3000 */ 0x2121, 0x2122, 0x2123, 0x2137, 0x2139, 0x213a, 0x213b, 0x2152, 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215a, 0x215b, 0x2229, 0x222e, 0x214c, 0x214d, 0x225a, 0x225b, 0x2258, 0x2259, 0x2141, 0x2d60, 0x2d61, 0x2666, 0x2233, 0x2234, 0x2235, 0x2236, 0x2237, 0x233c, /* 0x3040 */ 0x2421, 0x2422, 0x2423, 0x2424, 0x2425, 0x2426, 0x2427, 0x2428, 0x2429, 0x242a, 0x24ab, 0x242c, 0x24ad, 0x242e, 0x24af, 0x2430, 0x24b1, 0x2432, 0x24b3, 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, /* 0x3080 */ 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, 0x2470, 0x2471, 0x2472, 0x2473, 0x2474, 0x2475, 0x2476, 0x212b, 0x212c, 0x2135, 0x2136, 0x2239, 0x237b, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252a, 0x25ab, 0x252c, 0x25ad, 0x252e, 0x25af, 0x2530, 0x25b1, 0x2532, 0x25b3, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253a, 0x25bb, 0x253c, 0x253d, 0x253e, 0x253f, /* 0x30C0 */ 0x2540, 0x2541, 0x2542, 0x2543, 0x25c4, 0x2545, 0x2546, 0x2547, 0x25c8, 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, 0x2772, 0x2773, 0x2774, 0x2775, 0x2126, 0x213c, 0x2133, 0x2134, 0x2238, /* 0x31C0 */ 0x266e, 0x266f, 0x2670, 0x2671, 0x2672, 0x2673, 0x2674, 0x26f5, 0x2676, 0x2677, 0x2679, 0x267a, 0x267b, 0x267c, 0x267d, 0x267e, /* 0x3200 */ 0x2d6a, 0x2d6b, 0x2d6c, /* 0x3240 */ 0x2841, 0x2842, 0x2843, 0x2844, 0x2845, 0x2846, 0x2847, 0x2848, 0x2849, 0x284a, 0x284b, 0x284c, 0x284d, 0x284e, 0x284f, /* 0x3280 */ 0x2d65, 0x2d66, 0x2d67, 0x2d68, 0x2d69, 0x2850, 0x2851, 0x2852, 0x2853, 0x2854, 0x2855, 0x2856, 0x2857, 0x2858, 0x2859, 0x285a, 0x285b, 0x285c, 0x285d, 0x285e, /* 0x32C0 */ 0x2c5b, 0x2c5c, 0x2c5d, 0x2c5e, 0x2c5f, 0x2c60, 0x2c61, 0x2c62, 0x2c63, 0x2c64, 0x2c65, 0x2c66, 0x2c67, 0x2c68, 0x2c69, 0x2c6a, 0x2c6b, 0x2c6c, 0x2c6d, 0x2c6e, 0x2c71, 0x2c70, 0x2c73, 0x2c72, 0x2c6f, /* 0x3300 */ 0x2d46, 0x2d4a, 0x2d41, 0x2d44, 0x2d42, 0x2d4c, 0x2d4b, 0x2d45, 0x2d4d, 0x2d47, 0x2d4f, /* 0x3340 */ 0x2d40, 0x2d4e, 0x2d43, 0x2d48, 0x2d49, 0x2d5f, 0x2d6f, 0x2d6e, 0x2d6d, /* 0x3380 */ 0x2d53, 0x2d54, 0x2d50, 0x2d51, 0x2d52, 0x2d56, /* 0x33C0 */ 0x2d55, 0x235e, 0x2d63, /* 0x3400 */ 0x2e23, 0xa12d, 0xa132, 0xa133, /* 0x3440 */ 0xa15e, 0xa156, /* 0x3480 */ 0xa17e, 0x2e53, 0xa32b, /* 0x34C0 */ 0xf468, 0xa32f, 0x2e5b, /* 0x3500 */ 0xa348, /* 0x3540 */ 0xa35d, 0xa35e, 0xa361, 0xa367, /* 0x3580 */ 0xa423, 0xa426, /* 0x35C0 */ 0xa42f, 0xa438, 0xa442, /* 0x3600 */ 0xa44a, /* 0x3640 */ 0xa479, /* 0x3680 */ 0xa53f, 0xa543, 0xa541, /* 0x36C0 */ 0xa557, /* 0x3740 */ 0xa823, 0xa825, 0xa829, 0xa828, 0xa82c, /* 0x3780 */ 0x4f5f, /* 0x37C0 */ 0xa83e, 0x4f6f, 0xa856, 0xa859, 0xa85c, /* 0x3800 */ 0xa85e, 0xa86f, 0xa871, /* 0x3840 */ 0xa874, 0xa879, 0xa87b, /* 0x38C0 */ 0xac3b, /* 0x3900 */ 0xac46, 0xac4a, /* 0x3940 */ 0xac60, /* 0x3A40 */ 0xad5b, 0xad5f, /* 0x3AC0 */ 0xad71, 0xae36, 0xad7c, /* 0x3B00 */ 0xae2e, 0xae32, 0xae34, 0x7549, /* 0x3B40 */ 0xae6d, 0xae65, /* 0x3B80 */ 0xaf28, 0xaf29, 0xaf2c, 0xaf34, 0x757e, /* 0x3BC0 */ 0x7621, 0xaf48, 0xaf5d, /* 0x3C00 */ 0x763a, 0xaf77, /* 0x3CC0 */ 0xee3b, 0xee42, /* 0x3D00 */ 0xee71, 0xee7e, /* 0x3D40 */ 0xef40, /* 0x3D80 */ 0xef54, /* 0x3DC0 */ 0xef70, 0xef77, /* 0x3E00 */ 0xf028, 0x7766, /* 0x3E40 */ 0xf03f, 0xf041, 0xf042, /* 0x3E80 */ 0xf049, 0xf050, /* 0x3F40 */ 0xf134, 0x784d, 0xf146, 0xf148, /* 0x3F80 */ 0xf15c, /* 0x3FC0 */ 0xf167, 0xf16c, /* 0x4000 */ 0xf222, /* 0x4040 */ 0xf22d, /* 0x4080 */ 0xf239, /* 0x4100 */ 0xf264, /* 0x4140 */ 0xf274, 0xf277, 0xf27d, /* 0x4180 */ 0xf333, 0xf337, /* 0x41C0 */ 0xf347, 0xf34b, 0xf348, /* 0x4200 */ 0xf353, 0xf357, /* 0x4240 */ 0x796d, /* 0x42C0 */ 0xf42b, 0xf436, 0xf43b, /* 0x4300 */ 0xf44e, 0xf45d, /* 0x4340 */ 0xf461, /* 0x43C0 */ 0xf53e, 0xf542, /* 0x4400 */ 0xf548, 0xf54a, 0xf54c, 0xf54f, /* 0x4440 */ 0x7a59, 0x7a5a, 0xf56c, 0xf56e, /* 0x4480 */ 0xf577, 0xf635, 0xf632, /* 0x44C0 */ 0xf634, /* 0x4500 */ 0xf659, 0xf654, 0xf66d, /* 0x4540 */ 0xf66e, /* 0x4580 */ 0x7b51, 0xf74f, /* 0x45C0 */ 0xf76c, 0x7b60, /* 0x4600 */ 0xf824, /* 0x4640 */ 0xf83a, 0xf843, /* 0x4680 */ 0xf84e, 0xf853, /* 0x4700 */ 0xf86b, /* 0x4740 */ 0xf929, /* 0x47C0 */ 0xf93f, /* 0x4800 */ 0xf949, /* 0x4840 */ 0x7c4b, 0xf95c, /* 0x4880 */ 0xfa27, /* 0x4980 */ 0x7d58, /* 0x49C0 */ 0xfb6a, 0xfb70, /* 0x4A00 */ 0xfb75, 0xfb78, /* 0x4A80 */ 0xfc37, /* 0x4B00 */ 0xfc55, /* 0x4BC0 */ 0xfd26, 0xfd28, 0xfd2a, 0xfd31, /* 0x4C00 */ 0x7e3e, 0xfd3f, /* 0x4CC0 */ 0xfe2a, 0xfe2d, /* 0x4D00 */ 0xfe4b, /* 0x4D40 */ 0xfe60, /* 0x4E00 */ 0x306c, 0x437a, 0xa122, 0x3c37, 0x4b7c, 0x3e66, 0x3b30, 0x3e65, 0x323c, 0x4954, 0x4d3f, 0xa123, 0x5022, 0x312f, 0xa124, 0x336e, 0x5023, 0x4024, 0x5242, 0x3556, 0x4a3a, 0x3e67, 0x4e3e, 0x4a42, 0x2e24, 0xa125, 0x5024, 0xa126, 0xf02e, 0x4366, 0xa127, 0x2e25, 0x2e26, 0x5025, 0x367a, 0x5026, 0x345d, 0x4330, 0x3c67, 0x5027, 0x5028, /* 0x4E40 */ 0xa128, 0x5029, 0x4735, 0x3557, 0xa129, 0xa12a, 0x4737, 0x4663, 0x3843, 0x4b33, 0xa12c, 0x6949, 0x502a, 0x3e68, 0x502b, 0x3235, 0xa12f, 0x3665, 0x3870, 0x4c69, 0x5626, 0xa130, 0x4d70, 0x467d, 0x3425, /* 0x4E80 */ 0x3535, 0x502c, 0x502d, 0x4e3b, 0x4d3d, 0x4168, 0x502f, 0x3b76, 0x4673, 0x2e27, 0x5032, 0x313e, 0x385f, 0x385e, 0x3066, 0x4f4b, 0x4f4a, 0x3a33, 0x3021, 0xa131, 0x5033, 0x5034, 0x5035, 0x4b34, 0x5036, 0x3872, 0x3067, 0x4b72, 0x357c, 0x357d, 0x357e, 0x4462, 0x4e3c, 0x5037, 0x5038, 0x5039, 0xa134, 0x3f4d, 0xa135, 0xa137, /* 0x4EC0 */ 0x3d3a, 0x3f4e, 0x503e, 0xa138, 0x503c, 0x503d, 0x3558, 0xa139, 0x3a23, 0x3270, 0x503b, 0x503a, 0x4a29, 0xa13a, 0x3b46, 0x3b45, 0x423e, 0x503f, 0x4955, 0x4067, 0xa13c, 0x2138, 0x5040, 0x5042, 0x2e28, 0x4265, 0x4e61, 0x304a, 0xa13b, 0x5041, 0x323e, 0x3644, 0xa13d, 0x4367, 0xa13e, 0x376f, 0x5043, 0x4724, 0x2e29, 0x2e2a, /* 0x4F00 */ 0xa13f, 0x346b, 0x2e2b, 0x5044, 0x304b, 0x2e2c, 0x3860, 0x346c, 0x497a, 0x4832, 0x3559, 0xa140, 0x3271, 0x5067, 0x4541, 0x476c, 0x5046, 0x483c, 0x4e62, 0xa142, 0x3f2d, 0x3b47, 0x3b77, 0x3240, 0xa143, /* 0x4F40 */ 0x4451, 0x4322, 0x504a, 0x2e2e, 0x2e2f, 0x304c, 0x4463, 0x3d3b, 0x3a34, 0x4d24, 0x424e, 0xa144, 0x323f, 0x2e30, 0x5049, 0xa145, 0x4d3e, 0x5045, 0x5047, 0x3a6e, 0x5048, 0x5524, 0x2e31, 0x2e2d, 0xa141, 0x5050, 0x2e32, 0x2e33, 0x5053, 0x5051, 0x3242, 0x4a3b, 0x504b, 0xa147, 0xa148, 0xa149, 0x504f, 0x3873, 0xa14a, 0x2e34, 0x3b48, /* 0x4F80 */ 0xa14b, 0x3426, 0xa14c, 0x5054, 0x504c, 0x2e35, 0x4e63, 0x3b78, 0x504d, 0x5052, 0xa14d, 0x2e36, 0x5055, 0x2e37, 0x504e, 0xa14e, 0x3621, 0x304d, 0x3622, 0x3241, 0x5525, 0x4b79, 0x496e, 0x3874, 0xa150, 0x3f2f, 0x4e37, 0xa151, 0x4a58, /* 0x4FC0 */ 0x3738, 0x4225, 0x3264, 0xa152, 0x2e39, 0x3d53, 0xa153, 0x5059, 0xa154, 0x505e, 0x505c, 0xa155, 0x5057, 0x422f, 0x505a, 0x505d, 0x505b, 0x4a5d, 0x5058, 0x2e3a, 0x3f2e, 0x4b73, 0x505f, 0x5060, 0xa14f, 0x3d24, 0x506d, 0x2e21, 0xa157, 0x4750, 0x4936, 0x5068, 0x4a70, 0x3236, 0x506c, /* 0x5000 */ 0xa158, 0x2e3b, 0x2e3c, 0x5066, 0x506f, 0x4152, 0x3844, 0x475c, 0x2e3d, 0x6047, 0xa159, 0x506e, 0x455d, 0xa15a, 0x5063, 0x3876, 0x2e3e, 0x3875, 0x5061, 0xa15b, 0xa15c, 0x3c5a, 0x5069, 0xa15d, 0x4a6f, 0x434d, 0x5065, 0x3771, 0x2e3f, 0x5062, 0x506a, 0x5064, 0x4e51, 0x506b, 0x4f41, 0x2e40, 0x3666, 0x3770, 0x2e42, /* 0x5040 */ 0x2e41, 0x2e43, 0xa15f, 0x5070, 0xa160, 0x5071, 0x5075, 0x304e, 0xa161, 0x4a50, 0x5074, 0xa162, 0x5073, 0x5077, 0xa163, 0x5076, 0x4464, 0xa164, 0x3772, 0xa165, 0xa166, 0x5078, 0xa167, 0x3c45, 0x4226, 0x4465, 0x3676, 0x5079, 0x3536, /* 0x5080 */ 0x507a, 0x507c, 0xa169, 0x4b35, 0x3766, 0xa16a, 0xa16b, 0x2e44, 0xa16c, 0xa16d, 0x3b31, 0x4877, 0x507b, 0xa16e, 0xa168, 0xa16f, 0x3a45, 0x4d43, 0xa171, 0x507e, 0x5123, 0x507d, 0x3a44, 0x3d7d, 0xa172, 0xa173, 0x3739, /* 0x50C0 */ 0x5124, 0xa174, 0x364f, 0xa175, 0x5121, 0x5122, 0x2e45, 0x462f, 0xa178, 0x417c, 0x2e47, 0x3623, 0xa17a, 0x4b4d, 0x5125, 0xa17b, 0x4e3d, 0x5126, 0xa17c, 0x5129, 0x5127, 0x2e48, 0x414e, 0xa17d, 0x5128, 0x512a, 0x2e46, 0xa176, 0x512c, 0x512b, 0x4a48, /* 0x5100 */ 0x3537, 0x512e, 0x512f, 0x2e4b, 0x322f, 0x2e4a, 0xa321, 0x512d, 0x2e4c, 0x3c74, 0x5132, 0x5131, 0x5130, 0xa323, 0x5056, 0x5133, 0xa324, 0x2e4d, 0x3d7e, 0x5134, 0x4d25, 0x4c59, 0x2e4e, 0x5136, 0x5135, 0x5138, 0x5137, 0x5139, /* 0x5140 */ 0x513a, 0x3074, 0x3835, 0x373b, 0x3d3c, 0x437b, 0x3624, 0x4068, 0x3877, 0x2e4f, 0x396e, 0x513c, 0x4c48, 0x4546, 0x3b79, 0x513b, 0x513d, 0x2e51, 0x2e52, 0x455e, 0x3375, 0xa326, 0x513e, 0x467e, 0x4134, 0x5140, 0x5141, 0x482c, 0x3878, 0x4f3b, 0x5142, 0x3626, 0xa328, 0x4a3c, 0x4236, 0x3671, 0x4535, 0xf474, 0x3773, /* 0x5180 */ 0x5143, 0x5144, 0xa329, 0x4662, 0x315f, 0x5147, 0x3a7d, 0xa32a, 0x5146, 0x3a46, 0x5148, 0x666e, 0x5149, 0x4b41, 0x514a, 0x514b, 0x514c, 0x3e69, 0xa32c, 0x3c4c, 0x2e54, 0x3427, 0x514f, 0xa32d, 0x514d, 0x4c3d, 0x514e, 0x495a, 0x5150, 0x5151, 0x5152, 0x455f, 0xa32e, 0x5156, 0x5154, 0x5155, 0x5153, 0x3a63, 0x5157, 0x4c6a, 0x4e64, 0xa330, 0x5158, /* 0x51C0 */ 0x2e55, 0x4028, 0x5159, 0x3d5a, 0x515a, 0x2e56, 0x437c, 0x4e3f, 0x4560, 0x5245, 0x515b, 0x7425, 0x3645, 0x2e57, 0x515c, 0x4b5e, 0x2e58, 0x3d68, 0x427c, 0x515e, 0x4664, 0x515f, 0x2e59, 0x5160, 0x332e, 0xa333, 0xa334, 0x5161, 0x3627, 0x464c, 0x317a, 0x3d50, 0x4821, 0x5162, /* 0x5200 */ 0x4561, 0x2e5a, 0xa335, 0x3f4f, 0x5163, 0x4a2c, 0x405a, 0x3422, 0x3429, 0x5164, 0x5166, 0x373a, 0xa336, 0x2e5c, 0x5165, 0x2e5d, 0xa337, 0x4e73, 0x3d69, 0x483d, 0x4a4c, 0x5167, 0x4d78, 0x5168, 0x5169, 0x457e, 0x516a, 0x4029, 0x3a7e, 0x3774, 0x516b, 0x3b49, 0x396f, /* 0x5240 */ 0x4466, 0x516d, 0x4227, 0x2e5e, 0x3a6f, 0x516e, 0x516f, 0x4130, 0x516c, 0x5171, 0xa339, 0x4b36, 0x2e5f, 0x3964, 0xa33a, 0x2f7e, 0x5170, 0x2e60, 0x3775, 0x3a5e, 0x476d, 0x5174, 0x5172, 0xa33b, 0x497b, 0x3e6a, 0x517b, 0x3364, 0x5175, 0x5173, 0x414f, 0xa33c, 0x5177, 0x5176, /* 0x5280 */ 0xa33e, 0x3344, 0xa33d, 0x3760, 0x517c, 0x4e2d, 0x5178, 0x517d, 0x517a, 0x2e61, 0x5179, 0xa340, 0x4e4f, 0x3879, 0x3243, 0x4e74, 0xa342, 0xa343, 0x3d75, 0x4558, 0x3965, 0x5222, 0x5223, 0xa344, 0x4e65, 0x4f2b, 0x5225, 0x387a, 0xa345, 0xa346, 0x5224, 0x332f, /* 0x52C0 */ 0x5226, 0x4b56, 0x443c, 0x4d26, 0x2e62, 0x4a59, 0xa347, 0x2e64, 0x5227, 0x2e65, 0xa349, 0x7055, 0x4630, 0x2e66, 0x5228, 0x342a, 0x4c33, 0x2e67, 0x3e21, 0x5229, 0x4a67, 0x522d, 0x402a, 0x522a, 0x3650, 0x522b, 0x342b, 0x2e69, 0x372e, 0x522e, 0x522f, 0xa34b, 0x5230, 0x5231, 0x3c5b, 0x2e6a, 0x387b, 0x4c5e, /* 0x5300 */ 0x2e6b, 0x4c68, 0x4677, 0x4a71, 0x5232, 0x2e6c, 0x5233, 0xa34c, 0xa34d, 0x5235, 0x5237, 0x5236, 0x5238, 0x323d, 0x4b4c, 0x3a7c, 0x5239, 0x2e6d, 0x4159, 0x3e22, 0x3629, 0x523a, 0xa34e, 0x485b, 0x523b, 0x523c, 0x523d, 0xa34f, 0x523e, 0x4924, 0x3668, 0x3065, 0xa350, 0x463f, /* 0x5340 */ 0x523f, 0x3d3d, 0xa351, 0x4069, 0x5241, 0x5240, 0x3e23, 0x3861, 0x5243, 0x483e, 0x5244, 0x485c, 0x4234, 0x426e, 0x3628, 0x466e, 0x4331, 0x476e, 0x4b4e, 0x5246, 0x406a, 0x2e6f, 0x2e70, 0x3735, 0xa354, 0x5247, 0xa355, 0x5248, 0x312c, 0x3075, 0x346d, 0x4228, 0x3551, 0x4d71, 0x524b, 0x3237, 0xa356, 0x524a, 0x2e71, 0x362a, /* 0x5380 */ 0x524c, 0x4c71, 0x2e72, 0x524d, 0x4e52, 0x387c, 0x2e73, 0x3836, 0x524e, 0xa357, 0x5250, 0x524f, 0x3f5f, 0x3139, 0x315e, 0x5251, 0x5252, 0x2e74, 0x3837, 0xa358, 0x5253, 0xa35a, 0x356e, /* 0x53C0 */ 0xa35b, 0x3b32, 0x5254, 0x4b74, 0x3a35, 0x355a, 0x4d27, 0x4150, 0x483f, 0x3c7d, 0x3d47, 0xa35f, 0x3c68, 0x3c75, 0x3d76, 0xa360, 0x4840, 0x5257, 0x3143, 0x4151, 0x387d, 0x3845, 0x3667, 0x525b, 0x4321, 0x427e, 0x362b, 0x3e24, 0x525c, 0x525a, 0x3244, 0x4266, 0x3c38, 0x3b4b, 0x3126, 0xa362, 0xa363, 0x3370, 0x3966, 0x3b4a, 0x525d, /* 0x5400 */ 0x525e, 0x3549, 0x3346, 0x3967, 0x3548, 0x445f, 0x3125, 0x4631, 0x4c3e, 0x3921, 0x4d79, 0x4547, 0x387e, 0x2e75, 0x372f, 0x5267, 0x4f7e, 0x3663, 0x4b4a, 0xa365, 0x485d, 0x2e76, 0xa366, 0x5266, 0x345e, 0x5261, 0x5262, 0x5264, 0x5265, 0x355b, 0x3f61, 0x4a2d, 0x5263, 0x525f, 0x3863, /* 0x5440 */ 0x5260, 0x4f24, 0xa368, 0x4a72, 0x4468, 0x3862, 0x3970, 0x2e77, 0x5268, 0x465d, 0xa364, 0x526c, 0xa369, 0xa36a, 0x3c7e, 0x3c76, 0x2e79, 0xa36b, 0x526f, 0x526d, 0x4c23, 0x2e7a, 0x526a, 0x5273, 0x526e, 0x5271, 0x3846, 0x4c3f, 0x2e7b, /* 0x5480 */ 0x5272, 0x5274, 0x5276, 0x2e7c, 0xa36c, 0x3a70, 0x4f42, 0xa36d, 0x526b, 0x5269, 0x5275, 0x5270, 0xa36e, 0x2e7d, 0x2e78, 0xa36f, 0x2e7e, 0x5278, 0x5323, 0x527a, 0xa370, 0x527e, 0x2f21, 0x5321, 0x527b, 0xa371, 0xa372, 0x533e, 0x3a69, 0x3331, 0xa373, 0x5279, 0xa374, 0x5325, 0x3076, 0x5324, 0xa375, /* 0x54C0 */ 0x3025, 0x494a, 0x5322, 0xa376, 0x527c, 0x2f22, 0x5277, 0x527d, 0x3a48, 0x5326, 0x3077, 0x532f, 0x5327, 0x5328, 0x3e25, 0x4b69, 0xa378, 0x532d, 0x532c, 0xa379, 0xa37a, 0x452f, 0xa37b, 0x532e, 0x532b, 0x2f23, /* 0x5500 */ 0xa37c, 0xa37d, 0x3134, 0x3a36, 0x3f30, 0xa37e, 0x2f24, 0x5329, 0x4562, 0x532a, 0x3022, 0x2f25, 0x5334, 0x4d23, 0x3e27, 0x533a, 0x2f26, 0x5339, 0x5330, 0xa421, 0x4243, /* 0x5540 */ 0x5331, 0xa422, 0x426f, 0x5336, 0x3e26, 0xa424, 0xa425, 0x5333, 0x4c64, 0x2f27, 0x373c, 0x5337, 0x5338, 0x5335, 0x533b, 0x2f28, 0xa427, 0xa428, 0x5332, 0xa429, 0x5341, 0x5346, 0xa42b, 0x5342, /* 0x5580 */ 0x533d, 0x2f29, 0xa42c, 0x5347, 0x4131, 0x2f2a, 0x5349, 0xa42d, 0x3922, 0x533f, 0x437d, 0x2f2b, 0xa42e, 0x5343, 0x533c, 0x342d, 0x346e, 0x3365, 0x5344, 0x5340, 0x3776, 0x534a, 0x5348, 0x4153, 0x354a, 0x362c, 0x2f2d, 0x5345, 0x3674, 0x3144, 0xa433, /* 0x55C0 */ 0x534e, 0x534c, 0x5427, 0xa434, 0xa435, 0x2f2e, 0xa436, 0xa430, 0x5351, 0x534b, 0x534f, 0xa437, 0x534d, 0xa439, 0x3b4c, 0x5350, 0xa43b, 0x5353, 0x5358, 0x5356, 0x5355, /* 0x5600 */ 0x4332, 0xa43e, 0x2f30, 0x3245, 0x2f31, 0xa43f, 0x5352, 0x5354, 0x3e28, 0x3133, 0x5357, 0xa43c, 0x325e, 0x5362, 0xa440, 0x3e7c, 0x535e, 0x535c, 0x535d, 0xa441, 0x535f, 0x2f32, 0xa443, 0xa444, /* 0x5640 */ 0xa445, 0x313d, 0xa446, 0x2f33, 0x4139, 0x5359, 0x535a, 0x7427, 0x337a, 0xa447, 0xa448, 0x5361, 0x2f35, 0x346f, 0x5364, 0x5360, 0x5363, 0xa449, 0x2f37, 0x2f38, 0x2f39, 0x4a2e, 0x2f34, 0x4655, 0x4838, /* 0x5680 */ 0x5366, 0x5365, 0x3345, 0xa44b, 0x5367, 0xa44c, 0x536a, 0x5369, 0xa44d, 0x2f3a, 0xa44e, 0xa44f, 0x2f3b, 0x5368, 0x4739, 0x536b, 0xa450, 0x2f3c, 0x2f3d, 0xa451, 0x536c, 0xa452, 0x2f3e, 0x536e, 0x536d, 0x5370, /* 0x56C0 */ 0x5373, 0x5371, 0x536f, 0x5372, 0xa453, 0x5374, 0x2f3f, 0x2f40, 0xa454, 0x5375, 0x5376, 0x5377, 0x5378, 0x5145, 0x3c7c, 0x3b4d, 0x3273, 0xa455, 0x3078, 0x4344, 0xa456, 0x5379, 0x3a24, 0x304f, 0x3f5e, 0xa457, 0xa458, 0x537a, 0x3847, 0x3971, 0x537c, /* 0x5700 */ 0x537b, 0x4a60, 0x537d, 0x5421, 0x537e, 0x2f41, 0x5422, 0x5423, 0x3777, 0x3160, 0x5424, 0xa45a, 0x5426, 0x5425, 0x5428, 0x455a, 0x2f43, 0xa45b, 0x5429, 0x3035, 0x3a5f, 0xa45d, 0x373d, 0x2f44, 0x434f, 0x2f45, 0x2f46, 0x542a, 0x542b, 0x542d, /* 0x5740 */ 0x542e, 0x3a64, 0xa45f, 0xa460, 0x3651, 0x4b37, 0xa461, 0xa462, 0x542c, 0x542f, 0x3a41, 0x3923, 0x5433, 0x3a25, 0x4333, 0xa464, 0x5430, 0x445a, 0xa465, 0x2f47, 0xa466, 0xa467, 0xa468, 0x2f48, 0xa469, 0x2f49, 0x5434, /* 0x5780 */ 0x3f62, 0x5432, 0x5435, 0x373f, 0x5436, 0xa46d, 0x2f4a, 0xa46e, 0xa46f, 0x5437, 0x3924, 0x3340, 0x5439, 0xa470, 0x543a, 0xa46c, 0x543b, 0x5438, 0x2f4d, /* 0x57C0 */ 0x5431, 0x543c, 0x543d, 0x2f4e, 0x2f4f, 0x4b64, 0xa473, 0x3e6b, 0x2f50, 0x543f, 0x5440, 0x543e, 0x5442, 0xa471, 0x4738, 0xa476, 0x3068, 0x4956, 0x5443, 0x2f51, 0xa477, 0x2f52, 0xa478, 0x3e7d, 0x2f53, 0x2f54, 0x3c39, 0xa47a, 0x475d, 0x3470, 0xa47b, 0x3a6b, 0xa47c, 0x2f55, /* 0x5800 */ 0x4b59, 0x4632, 0xa47d, 0x3778, 0x424f, 0x2f56, 0x5441, 0x5444, 0x4244, 0x5445, 0x5446, 0xa47e, 0xa521, 0x5448, 0x4469, 0xa522, 0x342e, 0x7421, 0x3161, 0x4a73, 0xa523, 0x3e6c, 0x4548, 0xa524, 0x3a66, 0x544e, /* 0x5840 */ 0x4a3d, 0x4e5d, 0xa526, 0x3274, 0x544a, 0xa527, 0x413a, 0x544d, 0x4563, 0x4549, 0x4564, 0x4839, 0x444d, 0x3a49, 0x2f58, 0x5449, 0x2f59, 0xa528, 0x3176, 0x4536, 0x544b, 0x5447, 0x3f50, 0x544f, 0x2f5b, 0x3d4e, /* 0x5880 */ 0x362d, 0x5450, 0x2f5c, 0xa529, 0xa52a, 0xa52b, 0xa52c, 0xa52d, 0x4a68, 0xa52e, 0x417d, 0x4446, 0xa52f, 0x2f5d, 0x5452, 0x4b4f, 0x2f5f, 0xa530, 0x5453, 0x5458, 0xa531, 0x4a2f, 0x5457, 0x5451, 0x5454, 0x5456, 0x3a26, /* 0x58C0 */ 0x4a49, 0xa533, 0x5459, 0x4345, 0x3275, 0x3e6d, 0xa534, 0x2f62, 0x545b, 0x2f61, 0x545a, 0x2f63, 0x3968, 0x545c, 0x545e, 0x545d, 0x2f64, 0x5460, 0x5455, 0x5462, 0x2f65, 0xa535, 0x5461, 0x545f, 0x2f66, 0x3b4e, 0x3f51, 0x4154, 0x5463, 0x403c, 0x306d, 0x4764, 0xa536, 0xa537, 0x445b, 0x5465, 0x5464, 0x5466, 0x5467, 0x5468, /* 0x5900 */ 0x5469, 0xa538, 0xa539, 0x4a51, 0x546a, 0xa53a, 0x2f67, 0xa53b, 0x3246, 0x546b, 0xa53c, 0x4d3c, 0x3330, 0x5249, 0x3d48, 0x423f, 0x546c, 0x4c6b, 0x4c34, 0xa53d, 0x546e, 0x4267, 0x4537, 0x4240, 0x4957, 0x546f, 0x5470, 0x317b, 0x3c3a, 0x5471, 0x3050, 0x5472, 0xa540, 0x5473, /* 0x5940 */ 0x3162, 0xa542, 0x3471, 0x4660, 0x4a74, 0x5477, 0x4155, 0x5476, 0x3740, 0x4b5b, 0x5475, 0x4565, 0x5479, 0x5478, 0xa545, 0x2f69, 0xa546, 0x547b, 0x547a, 0x317c, 0x547c, 0x3e29, 0x547e, 0x4325, 0x547d, 0x2f6a, 0x4a33, 0x3d77, 0x455b, 0xa548, 0xa549, 0x5521, 0xa54a, 0x3925, /* 0x5980 */ 0x5522, 0x4721, 0x485e, 0x4c51, 0x4725, 0x2f6b, 0x552b, 0x2f6c, 0x3538, 0x4d45, 0x4c2f, 0x562c, 0x5523, 0xa54b, 0x5526, 0x2f6d, 0x4245, 0x4b38, 0x454a, 0xa54c, 0x5527, 0x4b65, 0x3a4a, 0xa54d, 0x3e2a, /* 0x59C0 */ 0x2f6e, 0x5528, 0xa54e, 0x3b50, 0x3b4f, 0xa54f, 0x3039, 0x3848, 0x2f6f, 0x402b, 0x3051, 0x552c, 0x552d, 0x552a, 0x2f70, 0xa550, 0xa551, 0xa552, 0x3138, 0x342f, 0xa553, 0x5529, 0x4c45, 0x4931, 0xa554, 0x3028, 0x7e7a, 0x3079, 0x3b51, /* 0x5A00 */ 0x3052, 0x3023, 0x5532, 0xa558, 0xa559, 0x5530, 0x2f71, 0xa55a, 0x4c3c, 0x5533, 0x5531, 0x552f, 0x3f31, 0x2f72, 0x552e, 0xa55b, 0x4a5a, 0xa55c, 0x3864, 0x5537, 0x5538, 0x3e2b, /* 0x5A40 */ 0x5534, 0x4f2c, 0x474c, 0x5536, 0xa55d, 0x3a27, 0x5539, 0xa55e, 0x4958, 0x2f73, 0x553a, 0x5535, 0x2f74, 0x2f75, 0xa55f, 0x2f76, 0x4c3b, /* 0x5A80 */ 0x2f77, 0xa560, 0x475e, 0x553b, 0x4932, 0xa561, 0x2f78, 0xa562, 0xa563, 0xa564, 0x2f79, 0xa565, 0xa566, 0xa567, 0xa568, 0x553c, 0x5540, 0x553d, 0xa569, /* 0x5AC0 */ 0x3247, 0x553f, 0x2f7a, 0x3c3b, 0x553e, 0x3779, 0x554c, 0x5545, 0x5542, 0xa56a, 0xa56b, 0xa56c, 0x4364, 0x5541, 0xa56d, 0x5543, 0x5544, 0xa56f, 0xa56e, 0xa570, 0x5546, 0x5547, /* 0x5B00 */ 0xa571, 0xa572, 0x3472, 0x5549, 0x5548, 0x554a, 0xa573, 0x2f7c, 0x3e6e, 0x2f7d, 0x554d, 0x445c, 0xa575, 0x3145, 0x554b, 0xa574, 0x554e, 0x554f, /* 0x5B40 */ 0x5552, 0x4f55, 0x5550, 0x5551, 0xa576, 0x3b52, 0x5553, 0xa577, 0x3926, 0x5554, 0x4f56, 0x3b7a, 0x4238, 0x5555, 0x5556, 0x3b5a, 0x3927, 0x4c52, 0x3528, 0x3849, 0x5557, 0x3358, 0xa578, 0x5558, 0x4239, 0xa579, 0x5559, 0x5623, 0x555a, 0x555b, 0x555c, 0x555e, 0xa57a, 0x4f57, 0xa57b, /* 0x5B80 */ 0x555f, 0xa57c, 0x5560, 0xa57d, 0x4270, 0x3127, 0x3c69, 0x3042, 0x4157, 0x3430, 0x3c35, 0x3928, 0x4f58, 0x4566, 0xa821, 0x3d21, 0x3431, 0x4368, 0x446a, 0x3038, 0x3539, 0x4a75, 0x3c42, 0x3552, 0x406b, 0x3c3c, 0x4d28, 0x5561, 0xa822, 0x355c, 0x3a4b, 0x3332, 0x3163, 0x3e2c, 0x3248, 0x5562, 0x4d46, 0x3d49, /* 0x5BC0 */ 0xa824, 0x3c64, 0x5563, 0x3473, 0x4652, 0x4c29, 0x5564, 0x5565, 0x4959, 0xa826, 0x5567, 0x3428, 0x3677, 0x5566, 0xa827, 0x4f59, 0x3432, 0x3f32, 0x556b, 0x3b21, 0x3249, 0x556a, 0x5568, 0x556c, 0x5569, 0x472b, 0x5c4d, 0x3f33, 0x556d, 0x4f5a, 0x4e40, 0x556e, 0xa82a, 0x5570, 0x437e, 0x556f, 0x4023, 0x3b7b, 0xa82b, 0x4250, 0x3c77, /* 0x5C00 */ 0x4975, 0x406c, 0xa82d, 0x3c4d, 0x5571, 0x3e2d, 0x5572, 0x5573, 0x3053, 0x423a, 0x3f52, 0x5574, 0x4633, 0x3e2e, 0x3e2f, 0x4f5b, 0x5575, 0x406d, 0x3e30, 0x4f5c, 0x5576, 0x5577, 0x4f5d, 0x4c60, 0x5578, 0xa82e, 0x4f5e, 0x3646, 0xa82f, 0x3d22, 0x5579, 0x557a, 0x3c5c, 0x3f2c, 0x4674, 0x3f54, 0x4878, 0x4722, /* 0x5C40 */ 0x3649, 0x557b, 0x356f, 0x557c, 0x367e, 0x464f, 0x3230, 0x3b53, 0x557d, 0x5622, 0x5621, 0x367d, 0x557e, 0x4538, 0x7e7b, 0x4230, 0xa831, 0x454b, 0x3c48, 0x4f60, 0xa832, 0x4158, 0x4d7a, 0xa833, 0xa834, 0xa835, 0x5624, 0x5625, 0x4656, 0xa836, 0x3b33, 0x5627, 0x5628, 0x4f64, 0xa839, /* 0x5C80 */ 0xa83c, 0xa83d, 0x5629, 0x4f65, 0x3474, 0x562a, 0x562b, 0x4f66, 0xa841, 0x322c, 0xa842, 0x4f67, 0xa843, 0xa844, 0x413b, 0x3464, 0x4f68, 0x562d, 0x4c28, 0xa846, 0x4252, 0x3359, 0xa847, 0x562f, 0x5631, 0x345f, 0x4f69, 0x562e, 0x5630, 0x5633, /* 0x5CC0 */ 0x5632, 0x5634, 0xa849, 0x4f6a, 0x4f6b, 0x4f6c, 0x5635, 0x463d, 0x362e, 0x3265, 0x5636, 0x563b, 0x5639, 0x4a77, 0x4a76, 0x4f6d, 0x4567, 0x5638, 0x3d54, 0x5637, /* 0x5D00 */ 0xa84c, 0x3f72, 0x563c, 0x4f70, 0x3a6a, 0xa84d, 0x5642, 0x5643, 0x563d, 0x3333, 0x563e, 0x5647, 0x5646, 0x5645, 0x5641, 0xa84f, 0x5640, 0xa850, 0x5644, 0xa851, 0xa852, 0x4f71, 0x4a78, 0xa84e, 0xa853, 0xa854, /* 0x5D40 */ 0xa855, 0x4f73, 0x4f74, 0x4f76, 0x564b, 0x5648, 0x564a, 0x4d72, 0x5649, 0x4f75, 0x563f, 0xa857, 0x3f73, 0xa858, 0x564c, 0x4f77, 0x3a37, 0xa85a, 0x564d, 0x564e, /* 0x5D80 */ 0x4f78, 0x5651, 0x5650, 0x564f, 0xa85d, 0x4568, 0x563a, 0x5657, 0xa85f, 0xa860, 0xa861, 0xa862, 0x5653, 0x4f79, 0x5652, 0x4f7a, 0x4f7b, 0x5654, 0x5655, 0xa863, 0xa864, 0xa865, 0x5658, 0x4f7c, 0xa867, 0x4e66, 0x5659, 0x5656, /* 0x5DC0 */ 0x565a, 0x4f7d, 0x3460, 0x565b, 0xa868, 0x565d, 0x565c, 0x565e, 0xa869, 0xa86a, 0x565f, 0x406e, 0x3d23, 0xa86b, 0x3d64, 0x7428, 0x4163, 0xa86d, 0x3929, 0x3a38, 0x392a, 0x3570, 0xa86e, 0x5660, 0x3a39, 0x384a, 0x5661, 0x4c26, 0x4743, 0x5662, 0x392b, 0x342c, 0x4327, 0x3652, /* 0x5E00 */ 0xa870, 0x3b54, 0x495b, 0x4841, 0x5663, 0x3475, 0x5666, 0xa872, 0x7429, 0xa873, 0x4421, 0x742a, 0x5665, 0x5664, 0x5667, 0x446b, 0xa875, 0x3f63, 0x3b55, 0x404a, 0xa876, 0x4253, 0x3522, 0x4422, 0x5668, 0x5669, 0x3e6f, 0x4b39, 0xa877, /* 0x5E40 */ 0x566c, 0x566b, 0x566a, 0x497d, 0x5673, 0xa878, 0x4b5a, 0x566d, 0x566f, 0x4b6b, 0xa87a, 0x566e, 0x742b, 0x742c, 0x5670, 0x4828, 0x5671, 0x4a3e, 0x5672, 0xa87c, 0xa87d, 0xa87e, 0xac21, 0x3433, 0x4a3f, 0x472f, 0x5674, 0x5675, 0x7e7c, 0x392c, 0x3434, 0x5676, 0x3838, 0x4d44, 0x4d29, 0x3476, 0x5678, /* 0x5E80 */ 0x4423, 0x392d, 0x3e31, 0x485f, 0x3e32, 0x3d78, 0x446c, 0x4a79, 0x4539, 0x392e, 0x495c, 0x5679, 0xac23, 0x4559, 0x3a42, 0xac24, 0x384b, 0xac25, 0x446d, 0x3043, 0x3d6e, 0x392f, 0x4d47, 0xac26, 0x742d, 0xac27, /* 0x5EC0 */ 0x567a, 0x567b, 0x4751, 0xac28, 0x567c, 0x4e77, 0x4f2d, 0x742f, 0x567e, 0x567d, 0xac29, 0x3347, 0x5721, 0xac2a, 0x5724, 0x5725, 0x5723, 0x4940, 0x3e33, 0x5727, 0x5726, 0x5722, 0x5728, 0x5729, 0x572a, 0x572d, 0x572b, 0x572c, 0x572e, 0x3164, 0x446e, 0x572f, 0x7430, 0x377a, 0x3276, 0x4736, 0xac2c, 0x5730, 0x467b, /* 0x5F00 */ 0x7431, 0x4a5b, 0x7432, 0x5731, 0x4f2e, 0x7433, 0xac2d, 0x5732, 0x4a40, 0x5735, 0x5021, 0x5031, 0xac2e, 0x3c30, 0x4675, 0x5736, 0x355d, 0x4424, 0x307a, 0x5737, 0x4a26, 0x3930, 0x4350, 0xac2f, 0x7434, 0xac31, 0x446f, 0x7435, 0x4c6f, 0x3839, 0x384c, 0x5738, 0x5739, 0x573f, 0x3c65, 0x7436, 0x4425, 0x7437, 0x362f, 0x573a, 0x492b, 0x7438, 0x4346, /* 0x5F40 */ 0x7439, 0x573b, 0x743a, 0xac32, 0x573c, 0x3630, 0x573d, 0x573e, 0x5740, 0x4576, 0x743b, 0x5741, 0x5742, 0x743c, 0x5743, 0x5734, 0x5733, 0x5744, 0x3741, 0xac33, 0x743d, 0x4927, 0x743e, 0x3a4c, 0x4937, 0x4426, 0x494b, 0x5745, 0x3e34, 0x3146, 0xac34, 0x5746, 0x5747, 0x4c72, 0x4860, 0x743f, 0xac35, 0x574a, /* 0x5F80 */ 0x317d, 0x402c, 0x5749, 0x5748, 0x3742, 0x4254, 0x574e, 0x574c, 0x7440, 0x574b, 0x4e27, 0x3865, 0xac36, 0x3d79, 0x574d, 0x454c, 0x3d3e, 0x4640, 0x5751, 0x5750, 0x7441, 0x574f, 0x5752, 0x3866, 0xac37, 0xac38, 0x7442, 0x5753, 0x497c, 0x3d5b, 0x5754, 0x4879, 0x7443, 0x4641, 0x4427, 0x7444, 0x7445, 0xac39, 0x4530, 0x5755, 0x352b, /* 0x5FC0 */ 0x3f34, 0xac3a, 0x492c, 0xac3c, 0x7446, 0xac3d, 0x3477, 0x4726, 0xac3e, 0xac3f, 0xac40, 0x5756, 0x3b56, 0x4b3a, 0x4b3b, 0x317e, 0x575b, 0x7447, 0x4369, 0x7448, 0xac41, 0x5758, 0x7449, 0x3277, 0xac42, 0xac43, 0x582d, 0x575a, 0xac44, 0x4730, 0x5759, 0x5757, 0xac45, 0x397a, 0x575d, /* 0x6000 */ 0x744a, 0x5763, 0x5769, 0x5761, 0x455c, 0x744b, 0x5766, 0x495d, 0xac47, 0x744c, 0x5760, 0x5765, 0x4e67, 0x3b57, 0x4255, 0x575e, 0xac48, 0xac49, 0x355e, 0x5768, 0x402d, 0x3165, 0x5762, 0x3278, 0x5767, 0x3631, 0x5764, 0x744d, 0x744e, 0x576a, /* 0x6040 */ 0x576c, 0x5776, 0x5774, 0x5771, 0x744f, 0x5770, 0x4e78, 0xac4b, 0x5772, 0x3632, 0x3931, 0x3d7a, 0x5779, 0x576b, 0x576f, 0x575f, 0x327a, 0x5773, 0x5775, 0x4351, 0x3a28, 0x3238, 0x576d, 0x5778, 0x5777, 0x3633, 0x4229, 0x3366, 0x3743, 0x576e, 0xac4c, /* 0x6080 */ 0x577a, 0x577d, 0x5821, 0x3c3d, 0xac4d, 0x5827, 0x4470, 0x577b, 0x5825, 0x3279, 0xac4e, 0x5823, 0x5824, 0x577e, 0x5822, 0x7451, 0x7452, 0x3867, 0x4d2a, 0x3435, 0x3159, 0x5826, 0xac4f, 0x473a, 0x302d, 0xac51, 0xac52, 0x4861, 0x575c, 0x582c, 0x5830, 0x4c65, 0x5829, 0x4569, 0x582e, 0xac53, /* 0x60C0 */ 0x3e70, 0x582f, 0x4657, 0xac54, 0x7453, 0x4f47, 0x582b, 0x7454, 0x7455, 0x5831, 0xac55, 0x397b, 0xac56, 0x404b, 0x7456, 0x3054, 0x582a, 0x5828, 0x415a, 0x577c, 0x3b34, 0xac57, 0x4246, 0x583d, 0xac58, 0x415b, 0x5838, 0xac59, 0x5835, 0x5836, 0x7457, 0x3c66, 0x5839, 0x583c, /* 0x6100 */ 0x5837, 0x3d25, 0x583a, 0x5834, 0x4c7c, 0x4c7b, 0x583e, 0x583f, 0x3055, 0xac5a, 0xac5b, 0xac5c, 0x5833, 0xac5d, 0x3672, 0x3026, 0x7458, 0xac5e, 0x3436, 0x583b, 0x5843, 0x5842, 0x7459, 0x5847, 0x745a, 0x5848, 0x745b, 0xac5f, 0x5846, 0x5849, 0x5841, 0x5845, /* 0x6140 */ 0xac61, 0x584a, 0x584b, 0xac62, 0x5840, 0x3b7c, 0x5844, 0x4256, 0x3932, 0x5832, 0x3f35, 0x5858, 0x4a69, 0x584e, 0x584f, 0x5850, 0x5857, 0x5856, 0xac63, 0x4b7d, 0x3437, 0x5854, 0x3745, 0x3334, 0x5851, 0x4e38, 0x5853, 0x3056, 0x5855, 0x584c, 0x5852, 0x5859, 0x3744, 0x584d, 0xac64, 0x4d5d, /* 0x6180 */ 0x4d2b, 0x585c, 0x5860, 0x745d, 0x417e, 0x4e79, 0x5861, 0xac66, 0xac67, 0x585e, 0x585b, 0xac68, 0xac69, 0x585a, 0x585f, 0x4a30, 0xac6a, 0x4634, 0xac6b, 0x3746, 0x5862, 0x585d, 0xac6c, 0x5863, 0x377b, 0x3231, 0x7460, 0x586b, 0x745f, 0x3438, /* 0x61C0 */ 0x5869, 0x586a, 0x3a29, 0x5868, 0x5866, 0x5865, 0x586c, 0x5864, 0x586e, 0x327b, 0xac6e, 0xac6f, 0xac70, 0x5870, 0x586f, 0x4428, 0x5873, 0xac71, 0x5871, 0x5867, 0x377c, 0x5872, 0x5876, 0x5875, 0x5877, 0x5874, /* 0x6200 */ 0x5878, 0x5879, 0x587a, 0x4a6a, 0x587c, 0x587b, 0x3d3f, 0x402e, 0x3266, 0x327c, 0x587d, 0xac73, 0x303f, 0x404c, 0x587e, 0x6c43, 0x5921, 0x3761, 0x5922, 0x7462, 0xac74, 0x406f, 0xac75, 0x5923, 0x5924, 0x353a, 0x5925, 0x5926, 0x5927, 0x4257, 0x384d, 0x4c61, 0x7463, 0x4b3c, /* 0x6240 */ 0x3d6a, 0x5928, 0x7464, 0xac76, 0x4070, 0x6e3d, 0x4862, 0x3c6a, 0xac77, 0x3a4d, 0x5929, 0xac78, 0xac79, 0x4247, 0x4a27, 0x7465, 0x4271, 0x7466, 0x592c, 0x592a, 0x592d, 0xac7a, 0x592b, 0xac7b, 0x592e, 0xac7d, 0x4a31, 0x7467, 0x3037, 0xac7e, 0x495e, 0x4863, 0xac7c, 0x592f, 0x5932, 0x3e35, /* 0x6280 */ 0x353b, 0x5930, 0x5937, 0x3e36, 0x7468, 0x5931, 0x4744, 0x4d5e, 0x5933, 0x5934, 0x5938, 0x456a, 0x5935, 0x3933, 0x405e, 0xad21, 0x5946, 0x4834, 0x4272, 0xad22, 0x4864, 0x5a2d, 0x4a7a, 0x4471, 0x4b75, 0x593b, 0x3221, 0x436a, /* 0x62C0 */ 0x5944, 0x7469, 0x4334, 0x593e, 0x5945, 0x5940, 0x5947, 0x5943, 0x5942, 0x476f, 0x593c, 0x327d, 0x593a, 0x3571, 0x4273, 0x5936, 0xad23, 0x746a, 0x5939, 0x3934, 0x405b, 0x3e37, 0x5941, 0x4752, 0x3572, 0x3348, 0x3367, 0x3f21, 0x5949, 0x594e, 0x594a, 0x377d, 0x594f, 0x3b22, 0x3969, 0x746b, 0xad25, 0x3d26, 0x593d, /* 0x6300 */ 0x3b7d, 0x594c, 0xad26, 0x3b58, 0x594d, 0x3044, 0x746c, 0x5948, 0xad27, 0xad28, 0x4429, 0x746d, 0x3573, 0x3634, 0x594b, 0x3027, 0x3a43, 0x3f36, 0xad2b, 0xad2c, 0x746e, 0x4472, 0xad2d, 0xad2e, 0x4854, 0x5951, 0x415e, /* 0x6340 */ 0xad2f, 0x746f, 0xad30, 0x422a, 0x3b2b, 0x5952, 0xad31, 0x5954, 0x5950, 0x4a61, 0x443d, 0xad33, 0x415c, 0x7470, 0x4a7b, 0x3c4e, 0x5960, 0x595f, 0xad36, 0x3f78, 0x377e, 0x5959, 0x3e39, 0x4668, 0x4731, 0x7471, /* 0x6380 */ 0x5957, 0x415d, 0xad37, 0x3c78, 0x595c, 0x3e38, 0x5956, 0x595b, 0x4753, 0xad3a, 0x5955, 0x3721, 0xad38, 0x335d, 0x595d, 0x4e2b, 0x3a4e, 0x4335, 0x595a, 0x405c, 0x3935, 0x3f64, 0x3166, 0x413c, 0x5958, 0x3545, 0x3747, 0x444f, 0x595e, 0x415f, 0xad3b, 0x5961, /* 0x63C0 */ 0x5963, 0x4237, 0x5969, 0x5964, 0x5966, 0x4941, 0x4473, 0x5967, 0xad3d, 0xad3e, 0x4d2c, 0x4d48, 0x3439, 0xad3f, 0xad40, 0x302e, 0x5965, 0x7472, 0x5962, 0xad41, 0xad42, 0x7473, 0x3478, 0xad43, 0x3167, 0x7474, 0x5968, 0xad3c, 0x4d49, /* 0x6400 */ 0x596c, 0xad44, 0x423b, 0x5973, 0x7475, 0x596d, 0x7476, 0x596a, 0x5971, 0x5953, 0xad45, 0x7477, 0xad46, 0x596e, 0x5972, 0xad47, 0x4842, 0x456b, 0xad48, 0x596b, 0x596f, 0x3748, 0x3a71, /* 0x6440 */ 0x405d, 0x5977, 0x7479, 0x4526, 0xad49, 0xad4a, 0xad4b, 0x747a, 0x5974, 0x4b60, 0x747b, 0x5975, 0xad4c, 0x5976, 0x4c4e, 0x7478, 0x4022, 0xad4d, /* 0x6480 */ 0x3762, 0xad4e, 0x597d, 0xad4f, 0x3b35, 0x597a, 0x5979, 0x4732, 0xad50, 0x4635, 0xad51, 0x4531, 0x597b, 0x597c, 0x496f, 0x4745, 0x3b23, 0x4071, 0x4b50, 0x3349, 0x5a25, 0x597e, 0x747d, 0x747e, /* 0x64C0 */ 0x4d4a, 0x5a27, 0x7521, 0x5a23, 0x5a24, 0x7522, 0xad52, 0xad53, 0x4160, 0x747c, 0x7523, 0x5a22, 0x593f, 0xad54, 0xad55, 0x5a26, 0x5a21, 0x5a2b, 0x5a2c, 0x4527, 0x5a2e, 0xad57, 0xad58, 0x3b24, 0x5a29, 0x353c, 0x5a2f, 0x5a28, 0x5a33, 0x5a32, 0x5a31, 0x7524, 0x5a34, 0x7525, 0x5a36, 0x3e71, 0xad59, /* 0x6500 */ 0x5a35, 0xad5a, 0x5a39, 0xad5c, 0xad5d, 0xad5e, 0x5a37, 0x5a38, 0x5970, 0xad60, 0x7526, 0x5a3b, 0x5a3a, 0x7527, 0x5978, 0x5a3c, 0x5a30, 0x3b59, 0xad61, 0x5a3d, 0x5a3e, 0x5a40, 0x5a3f, 0x5a41, 0x327e, 0x3936, 0x4a7c, 0x402f, /* 0x6540 */ 0xad62, 0x384e, 0x5a43, 0x5a46, 0x4952, 0x355f, 0xad63, 0x5a45, 0x5a44, 0x4754, 0x5a47, 0x3635, 0x5a49, 0x5a48, 0x343a, 0x3b36, 0x4658, 0x7529, 0xad64, 0x3749, 0x3f74, 0x5a4a, 0x4030, 0x4528, 0x495f, 0x5a4b, 0xad65, /* 0x6580 */ 0xad66, 0x5a4c, 0x5a4d, 0xad67, 0xad68, 0x4a38, 0x555d, 0x4046, 0xad69, 0x494c, 0x3a58, 0x4865, 0x4843, 0x454d, 0x4e41, 0x5a4f, 0x3c50, 0x752a, 0x5a50, 0x3036, 0x3654, 0x404d, 0x4960, 0x5a51, 0x3b42, 0x4347, 0x3b5b, 0x3f37, 0xad6a, 0xad6b, 0x5a52, 0xad6c, 0x4a7d, 0x3177, 0x3b5c, 0xad6d, /* 0x65C0 */ 0x5a55, 0xad6e, 0x5a53, 0x5a56, 0x4e39, 0x5a54, 0xad6f, 0x407b, 0x5a57, 0x4232, 0x5a58, 0xad70, 0x347a, 0x5a5a, 0x5a59, 0x5a5b, 0x5a5c, 0x347b, 0x467c, 0x4336, 0x356c, 0x3b5d, 0x4161, 0x3d5c, 0x3030, 0x5a5d, 0xad72, 0xad73, 0x3222, 0x5a61, 0xad74, /* 0x6600 */ 0x752c, 0x3937, 0x5a60, 0xad75, 0x3a2b, 0x3e3a, 0xad76, 0x752d, 0x5a5f, 0x3e3b, 0x4c40, 0x3a2a, 0x3057, 0x404e, 0x752e, 0x5a66, 0x752f, 0x4031, 0x3147, 0xad77, 0x7531, 0x7532, 0x3d55, 0x4b66, 0x3a72, 0xad78, 0x7533, 0x3e3c, 0x4027, 0x7534, 0x7535, 0x7536, 0x5a65, 0x5a63, 0x5a64, 0x7530, 0x436b, 0x5b26, /* 0x6640 */ 0x5a6a, 0x3b7e, 0x3938, 0x5a68, 0xad79, 0x7538, 0x5a69, 0x3f38, 0x7539, 0xad7b, 0x5a67, 0xad7a, 0x3b2f, 0xad7e, 0x753b, 0x753c, 0xae21, 0x5a6c, 0x5a6b, 0x5a70, 0x753d, 0x5a71, 0xae22, 0x5a6d, 0x753e, 0x3322, 0x5a6e, 0x5a6f, 0x4855, 0xae25, 0xae26, 0xae27, 0xae28, 0x4961, 0x374a, 0x5a72, 0x753f, 0x4032, 0x3e3d, 0x7540, 0x7541, 0x4352, 0xae29, /* 0x6680 */ 0xae2a, 0x3647, 0x5a73, 0x5a77, 0x324b, 0x5a74, 0x5a76, 0x7542, 0x5a75, 0xae2b, 0x3d6b, 0xae2c, 0x4348, 0x3045, 0x5a78, 0xae2d, 0x5a79, 0x7544, 0x442a, 0x4e71, 0x3b43, 0xae2f, 0x4a6b, 0xae30, 0x7545, 0x4b3d, 0xae31, 0x5b22, 0x5a7b, 0x7546, 0x5a7e, 0x5a7d, 0xae33, /* 0x66C0 */ 0x5a7a, 0x5b21, 0x7547, 0x465e, 0x7548, 0x5a7c, 0x5b23, 0x3d6c, 0x5b24, 0x754a, 0x4d4b, 0x4778, 0x5b25, 0x5b27, 0x754b, 0x5b28, 0xae35, 0x5b29, 0x364a, 0x3148, 0x3939, 0x5b2a, 0x5b2b, 0x3d71, 0x4162, 0x754c, 0x7537, 0x5258, 0x413e, 0x413d, 0x4258, /* 0x6700 */ 0x3a47, 0xae37, 0x5072, 0xae38, 0x376e, 0x4d2d, 0x4a7e, 0x497e, 0x5b2c, 0xae39, 0x754d, 0x3a73, 0x443f, 0x5b2d, 0x4f2f, 0xae3b, 0x4b3e, 0x442b, 0x5b2e, 0x347c, 0x5b2f, 0x5b30, 0x4c5a, 0x4c24, 0x4b76, 0x4b5c, 0x3b25, 0x5b32, 0x3c6b, 0x754f, 0x4b51, 0x5b34, 0x5b37, 0x5b36, 0x3479, 0x3560, 0x5b33, /* 0x6740 */ 0x5b35, 0x5b38, 0x7551, 0x7552, 0x3f79, 0xae3e, 0xae3f, 0x4d7b, 0x3049, 0x3a60, 0x423c, 0x3c5d, 0xae40, 0x3e73, 0x5b3b, 0x454e, 0xae41, 0x5b39, 0x422b, 0x5b3a, 0x3e72, 0x4c5d, 0x5b3c, 0x5b3d, 0x4d68, 0x7550, 0x5b42, 0x393a, 0x4755, 0x5b3f, 0x456c, 0x5a5e, 0x5a62, 0xae45, 0x354f, 0xae46, 0x4747, 0x7553, 0x5b41, 0x3e3e, 0x4844, /* 0x6780 */ 0x7554, 0x5b47, 0x487a, 0x5b3e, 0x5b44, 0x5b43, 0x404f, 0xae48, 0x7555, 0x4b6d, 0x4e53, 0x7556, 0x4b67, 0x7557, 0x324c, 0x3b5e, 0x4f48, 0x5b46, 0x3f75, 0x5b45, 0x5b40, 0x384f, 0xae4c, 0xae4d, 0x5b4c, 0x5b4a, 0x324d, 0x5b48, 0x5b4e, 0x5b54, 0x7558, /* 0x67C0 */ 0x755a, 0x4248, 0xae4e, 0x4a41, 0x5b56, 0xae4f, 0x4922, 0x5b55, 0x4770, 0x4b3f, 0x343b, 0xae50, 0x4077, 0x3d40, 0x755b, 0x4453, 0xae51, 0x4d2e, 0xae52, 0x5b51, 0x5b50, 0x5b52, 0x5b4f, 0x5b57, 0x5b4d, 0x5b4b, 0x5b53, 0x5b49, 0xae53, 0x436c, 0x4c78, 0x3c46, 0x3a74, 0xae54, 0x7559, 0x3a3a, 0x755c, 0x4b6f, 0x3341, /* 0x6800 */ 0x755d, 0x444e, 0x464a, 0x3149, 0xae4b, 0x4072, 0x4034, 0x372a, 0xae58, 0x755f, 0x5b59, 0xae59, 0x393b, 0x337c, 0x5b5b, 0x3374, 0x5b61, 0x7560, 0xae5a, 0x7561, 0x5b5e, 0xae5c, 0x4073, 0x334b, 0x3a2c, 0xae5d, 0x334a, 0x3a4f, 0xae5e, /* 0x6840 */ 0x5b5c, 0x3765, 0x374b, 0x456d, 0xae5f, 0xae60, 0x5b5a, 0x3046, 0xae61, 0xae62, 0x5b5d, 0x5b5f, 0x364d, 0x372c, 0x755e, 0x343c, 0x354b, 0xae63, 0xae64, 0x5b62, 0x7562, 0x3a79, 0x4b71, 0x3b37, 0x5b63, 0x4930, 0xae66, 0xae67, 0x7563, 0x5b6f, 0x7564, 0x3233, 0x5b64, 0xae68, 0xae69, 0x5b75, 0x5b65, /* 0x6880 */ 0x4e42, 0xae6a, 0x5b6c, 0x475f, 0x5b74, 0x5b67, 0xae6b, 0x3034, 0x5b69, 0xae6c, 0x393c, 0xae6e, 0xae6f, 0xae70, 0x5b6b, 0xae71, 0x5b6a, 0x5b66, 0x5b71, 0x3e3f, 0x7566, 0x7567, 0x546d, 0x3868, 0x4d7c, 0xae72, 0xae73, 0x5b68, 0x4474, 0x3323, 0x3a2d, 0x7568, 0x5b60, 0xae74, 0x5b70, 0x3361, 0x5b6e, 0x5b72, 0xae75, 0x456e, /* 0x68C0 */ 0xae7a, 0x347e, 0xae7b, 0x5c32, 0x7569, 0x4c49, 0x5b77, 0x347d, 0xae7c, 0x5b7e, 0xae7d, 0x756a, 0x4b40, 0x5c21, 0x5c23, 0xae7e, 0x5c27, 0x5b79, 0xaf21, 0x432a, 0x456f, 0x5c2b, 0x5b7c, 0x5c28, 0xaf22, 0xaf23, 0x5c22, 0x756b, 0xaf24, 0x756c, 0x3f39, 0x5c2c, 0x756d, 0x756e, 0x4033, 0xaf25, 0x5c2a, 0x343d, 0xae76, 0x756f, /* 0x6900 */ 0x4f50, 0x5b76, 0xaf26, 0x5c26, 0x3058, 0xaf27, 0x5b78, 0x7570, 0x4c3a, 0x5b7d, 0x3f22, 0x4447, 0x5b73, 0x5c25, 0x3f7a, 0x5c2f, 0x3371, 0x3821, 0x5c31, 0x5b7a, 0x5c30, 0x5c29, 0x5b7b, 0x5c2d, 0x5c2e, 0x5c3f, 0x464e, 0x7573, 0x5c24, 0x5c3b, 0xaf2b, 0x5c3d, 0x4458, /* 0x6940 */ 0x7574, 0xaf2d, 0x7571, 0x4d4c, 0x4976, 0x5c38, 0x424a, 0x7575, 0x5c3e, 0x413f, 0x5c35, 0x5c42, 0x5c41, 0x466f, 0x5c40, 0x466a, 0x7576, 0x7577, 0x7578, 0xaf2e, 0x5c44, 0x5c37, 0xaf2f, 0x3648, 0x5c3a, 0x3d5d, 0xaf30, 0x4760, 0x5c3c, 0x364b, 0x5c34, 0x5c36, 0x5c33, 0xaf31, 0x4f30, 0x335a, 0x5c39, 0xaf32, /* 0x6980 */ 0x7579, 0x5c43, 0x3335, 0x3a67, 0x315d, 0x5c54, 0xaf33, 0x4f31, 0x5c57, 0xaf35, 0xaf36, 0x3f3a, 0x5c56, 0x5c55, 0x757b, 0xaf37, 0x5c52, 0x757c, 0x5c46, 0xaf38, 0x5c63, 0x5c45, 0x5c58, 0xaf39, 0xaf3a, 0x5c50, 0xaf3b, 0x5c4b, 0x5c48, /* 0x69C0 */ 0xaf3c, 0x5c49, 0x5c51, 0x7422, 0x5c4e, 0x393d, 0x4448, 0x4164, 0x5c4c, 0x757d, 0x5c47, 0xaf3d, 0x5c4a, 0xaf3e, 0x4d4d, 0x4b6a, 0x5c4f, 0x5c59, 0x7622, 0xaf44, 0x5c61, 0x5c5a, 0x7623, 0x7624, 0x5c67, 0x5c65, 0xaf45, 0xaf46, 0x5c60, 0xaf47, 0xaf49, 0x7625, 0x7626, 0x5c5f, 0x4450, 0x4165, 0xaf4a, 0x5c5d, /* 0x6A00 */ 0x5c5b, 0x5c62, 0x5c68, 0x4875, 0x5c6e, 0x7627, 0xaf4b, 0x5c69, 0x5c6c, 0x5c66, 0x7628, 0x4374, 0x4938, 0xaf4c, 0x5c5c, 0xaf4d, 0x5c64, 0x3e40, 0x4c4f, 0x5c78, 0x5c6b, 0x3822, 0x3223, 0x335f, 0x5c53, 0xaf41, 0xaf4f, 0xaf50, 0xaf51, 0x3e41, 0x5c70, 0x5c77, 0x3c79, 0x3372, 0x762a, 0x432e, 0x762b, 0xaf52, /* 0x6A40 */ 0x5c6d, 0x762c, 0xaf53, 0x5c72, 0x5c76, 0xaf54, 0x3636, 0xaf56, 0x762d, 0xaf57, 0x762e, 0x354c, 0x5c74, 0x762f, 0x3521, 0x464b, 0x5c73, 0xaf58, 0x5c75, 0x7630, 0x5c6f, 0x7631, 0x5c71, 0xaf55, 0xaf5a, 0x3360, /* 0x6A80 */ 0x4349, 0xaf5b, 0x5c7c, 0x7633, 0xaf5c, 0x5c7a, 0x3869, 0x5c79, 0xaf5e, 0x7634, 0x5d21, 0x5b58, 0x7635, 0x7636, 0xaf5f, 0x5c7b, 0xaf60, 0x5c7d, 0x5c7e, 0x7637, 0x5d2c, 0xaf62, 0x5d28, 0x5b6d, 0x5d27, 0x5d26, 0x5d23, 0xaf63, /* 0x6AC0 */ 0x5c6a, 0x5d25, 0x5d24, 0xaf64, 0xaf66, 0x5d2a, 0x4f26, 0xaf65, 0x5d2d, 0x367b, 0xaf67, 0xaf68, 0x5d29, 0x5d2b, 0x7638, 0x7639, 0x4827, 0x5d2e, 0xaf6b, 0xaf6c, 0xaf6d, 0xaf6e, 0x5d32, 0x5d2f, 0xaf6f, /* 0x6B00 */ 0x4d73, 0x5d30, 0x5c5e, 0xaf71, 0xaf72, 0xaf73, 0xaf74, 0x5d33, 0x5d34, 0xaf76, 0x763c, 0x3135, 0x763d, 0x5d36, 0x3767, 0x3c21, 0x3655, 0x3224, 0x763e, 0xaf78, 0x4d5f, 0x763f, 0x5d38, 0x5d37, 0x5d3a, 0x353d, 0x3656, 0x343e, /* 0x6B40 */ 0x5d3d, 0x7640, 0x5d3c, 0x5d3e, 0xaf79, 0x324e, 0x4337, 0x5d3f, 0x343f, 0x5d41, 0x7641, 0xaf7a, 0x5d40, 0x5d42, 0x5d43, 0x7642, 0x5d44, 0x3b5f, 0x4035, 0x3a21, 0x7643, 0x4970, 0x7644, 0x4a62, 0x4f44, 0xaf7b, 0x3b75, 0x3a50, 0x4e72, 0xaf7c, 0x7645, 0x5d45, 0x5d46, 0xaf7d, 0x3b60, 0x5d47, /* 0x6B80 */ 0x5d48, 0xaf7e, 0x7646, 0x5d4a, 0x5d49, 0x4b58, 0x3d5e, 0x3c6c, 0x3b44, 0x5d4b, 0x5d4d, 0x3f23, 0x5d4c, 0xee21, 0x5d4e, 0x5d4f, 0x7647, 0x5d50, 0x5d51, 0x7648, 0xee22, 0x5d52, 0x5d54, 0x5d53, 0x5d55, 0x3225, 0x434a, 0x5d56, 0x3b26, 0x334c, 0x5d57, 0xee24, 0xee25, 0x4542, /* 0x6BC0 */ 0x544c, 0x3523, 0x5d58, 0xee26, 0xee27, 0xee28, 0x5d59, 0x4a6c, 0x4b68, 0x764a, 0x4647, 0x5d5a, 0x4866, 0x764b, 0x764c, 0x487b, 0xee29, 0x4c53, 0x5d5b, 0xee2a, 0xee2b, 0x5d5d, 0x5d5c, 0xee2c, 0x5d5f, 0xee2d, 0x5d5e, 0x764d, /* 0x6C00 */ 0xee2e, 0x764e, 0x5d61, 0xee2f, 0xee30, 0x3b61, 0x764f, 0x4c31, 0x5d62, 0x5d63, 0x3524, 0x5d64, 0x5d66, 0x5d65, 0x7650, 0x3f65, 0xee31, 0xee32, 0x4939, 0x314a, 0xee33, 0x4845, 0xee35, /* 0x6C40 */ 0x4475, 0x3d41, 0x3561, 0xee36, 0x4846, 0x3c2e, 0x5d68, 0x3440, 0x7651, 0x3178, 0xee37, 0x7652, 0x4672, 0x5d67, 0x393e, 0x4353, 0x5d69, 0xee4f, 0x5d71, 0x5d6a, 0xee38, 0x4241, 0x3562, 0x5d72, 0x7654, 0x7655, 0x3768, 0x3525, 0x5d70, /* 0x6C80 */ 0x5d6e, 0x5d6b, 0x4d60, 0xee39, 0x7656, 0x7657, 0x4440, 0xee3a, 0x4659, 0x5d6c, 0x5d74, 0x5d73, 0x3723, 0xee3c, 0xee3d, 0x322d, 0xee3e, 0x7658, 0x3a3b, 0x5d6d, 0x5d6f, 0x7659, 0x4b57, 0x4274, 0x7653, 0x4b77, 0xee3f, 0x5d7c, 0x5d7d, 0x324f, 0x4a28, 0x4c7d, 0x5e21, 0x3c23, 0x3e42, 0x5d78, 0x5d7e, 0x3168, /* 0x6CC0 */ 0x3637, 0xee40, 0x5d75, 0x5d7a, 0x765b, 0x4074, 0x4771, 0x4867, 0xee41, 0x5d77, 0x765c, 0x4b21, 0xee43, 0x5d79, 0x5e24, 0xee44, 0x5e22, 0xee45, 0x5d7b, 0x765d, 0x4b22, 0x4748, 0x3563, 0x4525, 0x436d, 0xee46, 0x5e25, 0x765e, 0xee47, 0xee48, 0x765f, 0x5e23, 0x4259, 0x5d76, 0x314b, 0x765a, /* 0x6D00 */ 0xee4a, 0x7661, 0xee4b, 0x4d4e, 0x5e30, 0x7662, 0x5e2f, 0x4076, 0x5e2c, 0x4d6c, 0x4636, 0x5e26, 0xee4c, 0x4445, 0xee4d, 0xee4e, 0x314c, 0x393f, 0x5e29, 0x7663, 0xee50, 0x7664, 0x3d27, 0x5e2e, 0xee65, 0x5e2d, 0x5e28, 0x5e2b, 0x7665, 0x3368, 0xee51, 0x5e2a, 0x4749, 0x7666, /* 0x6D40 */ 0x4e2e, 0x3e74, 0x4075, 0x7667, 0x5e36, 0x5e34, 0xee52, 0x494d, 0xee53, 0xee54, 0x5e31, 0x5e33, 0x7668, 0x313a, 0x3940, 0x4f32, 0x333d, 0x4962, 0xee55, 0x4d61, 0x3324, 0x3f3b, 0x5e35, /* 0x6D80 */ 0xee56, 0xee57, 0x766a, 0x5e3a, 0x766b, 0x3e43, 0x766c, 0xee58, 0x4d30, 0xee59, 0x5e37, 0xee5a, 0x5e32, 0x766d, 0x5e38, 0xee5b, 0x4e5e, 0x4573, 0x4642, 0x766e, 0xee61, 0x766f, 0xee62, 0x3336, 0x3155, 0xee63, 0x5e3e, 0x5e41, 0x4e43, 0x7670, /* 0x6DC0 */ 0x4d64, 0xee64, 0x7671, 0x5e48, 0x5e42, 0x5e3f, 0xee66, 0x4e54, 0x5e45, 0xee67, 0xee68, 0xee69, 0x3d4a, 0x5e47, 0x5e4c, 0x7672, 0x4571, 0x5e4a, 0x7673, 0x7674, 0x7675, 0x5e44, 0xee6a, 0x4338, 0x5e4b, 0x5e40, 0x5e46, 0xee6b, 0x5e4d, 0x307c, 0x5e43, 0x5e4e, 0x3f3c, 0x3d5f, 0x4a25, 0xee6c, 0x3a2e, 0x5e3b, 0x5e49, 0x453a, 0x7676, /* 0x6E00 */ 0x4036, 0x3369, 0x3a51, 0x3e44, 0x5e3d, 0x3d42, 0x374c, 0x5e3c, 0xee5d, 0x5e52, 0x3d6d, 0x383a, 0x5e61, 0xee6e, 0x5e5b, 0x3574, 0x454f, 0xee6f, 0x5e56, 0x5e5f, 0x302f, 0x3132, 0xee70, 0x3239, 0x5e58, 0x422c, 0x5e4f, 0x5e51, 0x3941, 0xee72, 0x7678, 0xee6d, 0x5e62, 0x5e5d, 0xee73, 0x5e55, /* 0x6E40 */ 0x5e5c, 0x7679, 0xee74, 0xee75, 0x4c2b, 0xee76, 0xee77, 0x5e5a, 0x5e5e, 0xee78, 0xee79, 0xee7a, 0xee7b, 0x3850, 0xee7c, 0x3e45, 0x4339, 0x767a, 0x767b, 0x5e54, 0xee7d, 0x4d2f, 0x5e57, 0x5e50, 0x4572, 0x5e53, 0x5e59, 0x4f51, 0x3c3e, /* 0x6E80 */ 0x4b7e, 0x5e63, 0x482e, 0x5e6f, 0x383b, 0xef21, 0x3d60, 0x5e65, 0x4e2f, 0x3942, 0x5e72, 0x306e, 0x5e70, 0xef22, 0x5e64, 0x767c, 0x5e6a, 0x767d, 0x5e6c, 0xef23, 0x4d4f, 0x5e67, 0x452e, 0x5e69, 0xef24, /* 0x6EC0 */ 0x767e, 0x5e71, 0xef25, 0x5e6b, 0x4c47, 0x7721, 0x5e66, 0xef26, 0x3c22, 0x5e7e, 0x7722, 0x336a, 0x5e68, 0x5e6d, 0x5e6e, 0xef27, 0x426c, 0x425a, 0xef29, 0x5e76, 0x5e7c, 0x5e7a, 0x4529, 0x5f23, 0x5e77, 0xef2a, 0xef2b, 0x5e78, 0x5e60, /* 0x6F00 */ 0x3579, 0x493a, 0x3c3f, 0x3977, 0xef2c, 0xef2d, 0x4f33, 0x7723, 0x5e74, 0x5f22, 0x3169, 0x4166, 0xef2e, 0x7724, 0x4779, 0x3441, 0x4e7a, 0xef2f, 0x7726, 0x4c21, 0x4452, 0x7727, 0x5e7b, 0x5e7d, 0x7728, 0xef28, 0xef30, 0x4132, 0xef31, 0x5f21, 0x5e79, /* 0x6F40 */ 0x5e73, 0x3443, 0x7729, 0xef33, 0x3769, 0xef34, 0x5f2f, 0x772a, 0xef35, 0x5f2a, 0x4078, 0x772b, 0x3363, 0xef36, 0x772c, 0x772d, 0x3d61, 0x5f33, 0xef37, 0x5f2c, 0x442c, 0x5f29, 0x4459, 0x5f4c, 0x5f26, 0x5f25, 0x5f2e, 0xef39, 0x772e, /* 0x6F80 */ 0x5f28, 0x5f27, 0x5f2d, 0x4021, 0x5f24, 0x772f, 0x7730, 0x7731, 0x5f30, 0xef3a, 0x5f31, 0x7732, 0xef3b, 0x3442, 0xef38, 0xef3d, 0x7733, 0x5f36, 0x5f35, 0x5f37, 0xef3e, 0x7734, 0x5f3a, 0xef3f, 0x4543, 0x5f34, 0xef41, 0x7735, 0x5f38, 0x7736, 0xef3c, /* 0x6FC0 */ 0x3763, 0x4279, 0x5f32, 0x473b, 0x5f39, 0x7737, 0xef42, 0xef43, 0x7738, 0x5f3e, 0x5f3c, 0x5f3f, 0xef44, 0x5f42, 0xef45, 0x5f3b, 0x396a, 0x4728, 0x5e39, 0xef46, 0x4d74, 0x5f3d, 0x5f41, 0x4275, 0x773a, 0x5f40, 0x5f2b, 0x773b, 0x6f69, 0x7739, 0x5f45, 0xef48, 0x5f49, /* 0x7000 */ 0xef49, 0x5f47, 0x773c, 0x773d, 0xef4a, 0x5f43, 0xef4b, 0x5f44, 0x5f48, 0x5f46, 0x494e, 0x5f4e, 0x5f4b, 0x5f4a, 0x5f4d, 0x4654, 0x5f4f, 0xef4c, 0x4375, 0x426d, 0x773e, 0x4025, 0x5f50, 0x5f52, 0xef4e, 0xef4f, 0xef50, 0x5f51, /* 0x7040 */ 0xef51, 0xef52, 0x773f, 0xef53, 0x5e75, 0x7742, 0x5f53, 0xef55, 0x4667, 0x7740, 0x7741, 0x5f54, 0x7743, 0xef56, 0xef57, 0x3250, 0xef58, 0xef59, 0x4574, 0x3325, 0x7744, 0xef5a, 0x3564, 0x3c5e, 0x3a52, 0xef5b, /* 0x7080 */ 0xef5c, 0x7745, 0xef5d, 0x4f27, 0x3f66, 0x316a, 0x5f56, 0xef5e, 0xef5f, 0x5f55, 0xef62, 0x7746, 0x7747, 0x5f59, 0x433a, 0x5f5c, 0x5f57, 0xef63, 0x5f5b, 0x7748, 0x5f5a, 0x4540, 0x3059, 0xef60, /* 0x70C0 */ 0x4e75, 0xef66, 0x5f5e, 0x3128, 0xef67, 0xef68, 0x7749, 0x774a, 0x5f60, 0xef69, 0x5f5f, 0x5f5d, 0x774b, 0xef65, 0x5f58, 0x4b23, 0x5f62, /* 0x7100 */ 0xef6a, 0xef6b, 0xef6c, 0xef6d, 0xef6e, 0x5f61, 0xef6f, 0x774c, 0x316b, 0x5f64, 0x4a32, 0x5f63, 0x774e, 0x774f, 0x4c35, 0x3e47, 0x774d, 0x7750, 0xef71, 0x7751, 0xef72, 0x4133, 0x3e46, /* 0x7140 */ 0x7752, 0x7753, 0x4e7b, 0xef74, 0x5f6a, 0x4079, 0xef73, 0x7754, 0x7756, 0xef75, 0x5f66, 0x5f6b, 0x316c, 0x7757, 0xef76, 0x7758, 0x5f69, 0x4761, 0x5f65, 0x5f68, 0x3e48, 0x7759, 0x4851, 0x5f6c, 0x3c51, 0x407a, /* 0x7180 */ 0xef79, 0x5f6f, 0x775b, 0x775c, 0x5f67, 0x3727, 0x5f6d, 0x775d, 0x4d50, 0x5f70, 0xef78, 0x7426, 0xef7a, 0x3d4f, 0xef7b, 0xef7c, 0x5f71, 0x5f72, 0xef7d, 0xef7e, 0x472e, 0xf021, 0x5f74, 0x775f, 0x5f75, /* 0x71C0 */ 0x775e, 0x4733, 0x7760, 0x4575, 0x5f77, 0xf023, 0x5f79, 0x4e55, 0x5f76, 0xf024, 0x5f78, 0x316d, 0x5f73, 0xf025, 0xf026, 0x535b, 0x5f7a, 0x4167, 0x3b38, 0x5f7c, 0x5f7b, 0x3f24, 0x5259, 0x5f7d, 0x6021, 0x5f6e, 0x5f7e, 0x7761, 0x6022, /* 0x7200 */ 0x7762, 0x477a, 0xf027, 0x6023, 0x6024, 0x7763, 0x6025, 0x6026, 0x445e, 0xf02a, 0x6028, 0x6027, 0x6029, 0x602a, 0xf02b, 0x3c5f, 0x4963, 0xf02c, 0xf02d, 0x4c6c, 0x602b, 0x602c, 0x4156, 0x3c24, 0x602d, /* 0x7240 */ 0x602e, 0xf02f, 0x602f, 0x4a52, 0x4847, 0x6030, 0x4757, 0x442d, 0xf030, 0x7764, 0x7765, 0xf031, 0x6031, 0x3267, 0x356d, 0x4c46, 0x4c36, 0x3234, 0x4f34, 0xf032, 0x4b52, 0x4a2a, 0xf034, 0xf035, 0x4037, 0x6032, 0xf036, 0x4643, 0x3823, 0x6033, 0xf037, /* 0x7280 */ 0x3a54, 0x6035, 0x6034, 0x6036, 0x7767, 0xf038, 0x6037, 0x6038, 0x7768, 0x353e, 0x6039, 0x603a, 0x3824, 0xf03a, 0xf03b, 0x4848, 0xf03c, 0xf03d, 0x603c, 0x3e75, 0x603b, 0x7769, /* 0x72C0 */ 0x776a, 0xf03e, 0x3638, 0x603d, 0x603f, 0x603e, 0xf040, 0x6040, 0x3851, 0x6041, 0x3669, 0x4140, 0x397d, 0x6043, 0x6044, 0x6042, 0x3c6d, 0x4648, 0x3639, 0xf043, 0x6046, 0x432c, 0x6045, 0xf044, 0x776b, 0x4f35, 0x4762, /* 0x7300 */ 0xf045, 0x6049, 0xf046, 0x604b, 0x6048, 0xf047, 0xf048, 0x4c54, 0x604a, 0x604c, 0x4e44, 0x6050, 0x776d, 0x776e, 0x604f, 0x4376, 0x472d, 0xf04b, 0x3825, 0x604e, 0xf04c, 0xf04d, 0x604d, 0x4d31, 0x4d32, 0xf04a, 0xf04e, 0x6051, 0x316e, /* 0x7340 */ 0x3976, 0x3b62, 0x6052, 0x6053, 0x7770, 0xf04f, 0x6055, 0x3d43, 0x7771, 0x6057, 0x6056, 0xf051, 0xf052, 0xf054, 0xf055, 0x6058, 0xf056, 0x334d, 0x605a, 0xf057, 0x6059, 0x605c, 0x605b, 0x7772, /* 0x7380 */ 0xf058, 0x383c, 0xf059, 0x4e28, 0x364c, 0xf05a, 0x3226, 0xf05b, 0x7773, 0x366a, 0xf05c, 0xf05d, 0xf05e, 0x7774, 0x7775, 0x7776, 0xf05f, 0x7777, 0xf060, 0x3461, 0x7778, 0x4e68, 0x605e, 0xf061, 0xf062, 0xf063, 0x6060, 0xf064, 0xf065, /* 0x73C0 */ 0x6061, 0x3251, 0xf066, 0x605d, 0x7779, 0x3b39, 0xf067, 0x4441, 0x605f, 0x777a, 0x777b, 0x777c, 0x6064, 0x3c6e, 0xf068, 0x777d, 0x6062, 0xf069, 0x777e, 0x373e, 0x4849, 0x6063, 0x607e, 0x6069, 0xf06a, 0xf06c, 0x383d, /* 0x7400 */ 0xf06d, 0x3565, 0x6066, 0x4d7d, 0x7821, 0x4e30, 0x7822, 0xf06b, 0x7823, 0x7824, 0x4276, 0xf06e, 0x6068, 0x7826, 0x7827, 0x7828, 0x7829, 0x782a, 0x782b, 0x782c, 0x782d, 0xf06f, 0x606a, 0x4e56, 0x3657, 0x487c, 0x474a, 0xf070, 0x606b, 0x606d, /* 0x7440 */ 0xf072, 0x6070, 0xf073, 0x782e, 0x782f, 0x7830, 0x7831, 0xf074, 0xf075, 0xf071, 0x606c, 0x7832, 0x606f, 0x386a, 0x314d, 0x6071, 0xf076, 0x3f70, 0x606e, 0x4e5c, 0x7833, 0x6074, 0x7424, 0x6072, 0x6075, 0x7834, 0x7835, 0x6067, 0x6073, 0xf077, 0x3a3c, 0x6076, 0x6077, /* 0x7480 */ 0xf078, 0x4d7e, 0xf079, 0x7836, 0x7837, 0xf07a, 0x7838, 0x6078, 0x783d, 0xf07c, 0xf07d, 0x7839, 0xf07e, 0x783a, 0x6079, 0x783b, 0xf121, 0xf122, 0x6065, 0x783c, 0xf123, 0x783e, 0x607a, 0x783f, 0x7840, 0xf124, 0xf125, 0x3444, 0x7841, 0xf126, 0xf128, 0xf127, 0x3c25, 0x7842, /* 0x74C0 */ 0x7843, 0x7844, 0x607b, 0x607c, 0x607d, 0xf129, 0xf12a, 0x7845, 0x313b, 0xf12b, 0x6121, 0x493b, 0x6122, 0x3424, 0x6123, 0x6124, 0xf12d, 0x6125, 0xf12c, 0x6127, 0x6128, 0x6126, 0x4953, 0x612a, 0x6129, 0xf12f, 0x7846, /* 0x7500 */ 0x7847, 0x612c, 0x612b, 0x612d, 0x612e, 0x6130, 0x612f, 0x3979, 0x6132, 0x6131, 0x7848, 0x3445, 0x3f53, 0x453c, 0x6133, 0x4038, 0xf131, 0x3b3a, 0xf132, 0x3179, 0x6134, 0x4d51, 0xf133, 0x4a63, 0x6135, 0x7849, 0x4544, 0x4d33, 0x3943, 0x3f3d, 0x434b, 0x5234, 0x442e, 0x3268, 0x6136, 0xf136, 0xf137, /* 0x7540 */ 0xf138, 0x6137, 0x613c, 0xf139, 0x613a, 0x6139, 0x5a42, 0x3326, 0x6138, 0xf13a, 0x305a, 0xf13b, 0x482a, 0xf13c, 0x484a, 0x4e31, 0x613d, 0x613b, 0x435c, 0x4026, 0x482b, 0x492d, 0x613f, 0x4e2c, 0x374d, 0x6140, 0x613e, 0x4856, 0x6141, 0xf13d, 0x6142, 0x784a, 0x305b, 0xf13f, 0xf13e, 0x3e76, 0x6147, 0x6144, 0x466d, 0x6143, 0x784b, 0xf140, 0xf141, 0xf142, 0x3526, /* 0x7580 */ 0xf143, 0x614a, 0x6145, 0x6146, 0x6149, 0x6148, 0x4925, 0xf145, 0x4142, 0x4141, 0x353f, 0x784c, 0x614b, 0x614c, 0x614d, 0xf147, 0x614f, 0x614e, 0x3156, 0xf149, 0x6157, 0x4868, 0x6151, 0x6153, 0xf14a, 0x6155, 0x3f3e, 0x6156, 0x6154, 0x3c40, 0xf14b, /* 0x75C0 */ 0xf14c, 0x6150, 0x6152, 0x4942, 0xf14d, 0x3e49, 0x6159, 0x6158, 0x784e, 0xf14e, 0x615a, 0xf14f, 0x3c26, 0x3a2f, 0x4577, 0x615b, 0x444b, 0xf150, 0x615d, 0xf151, 0xf152, 0x4e21, 0x615c, 0x784f, 0xf153, 0x4169, 0xf154, 0xf155, 0x6162, 0xf156, 0x6164, 0x6165, 0x4354, 0xf157, 0x6163, 0x6160, 0x615e, 0x615f, /* 0x7600 */ 0x7850, 0x6161, 0x7851, 0xf158, 0xf15a, 0x7852, 0x6168, 0x6166, 0x6167, 0xf15b, 0xf15e, 0x7853, 0x7854, 0xf159, 0x7855, 0xf15f, 0xf160, 0x7856, 0x6169, 0x616b, 0x616c, 0x616d, 0x616e, 0xf162, 0x7e7d, 0x616a, 0xf163, 0x7857, 0x6170, 0xf165, 0x616f, 0x7858, 0x6171, 0xf164, /* 0x7640 */ 0xf168, 0x4e45, 0x7859, 0x6174, 0x6172, 0x6173, 0xf16a, 0x785a, 0x3462, 0x4c7e, 0xf16b, 0x4a4a, 0x6176, 0x6175, 0x6177, 0x6178, 0x785b, 0x785c, 0x617c, 0x6179, 0x617a, 0x617b, 0x617d, 0x785d, 0xf16d, 0x785e, 0x617e, 0x785f, 0x6221, 0x6222, 0x6223, 0x482f, 0x4550, 0x6224, 0x4772, 0x4934, /* 0x7680 */ 0x6225, 0x7860, 0x6226, 0x452a, 0x3327, 0x3944, 0x6227, 0x6228, 0x6229, 0x3b29, 0x622b, 0xf16e, 0x622a, 0x622c, 0x622d, 0x7861, 0xf16f, 0x7862, 0x7863, 0xf171, 0xf170, 0x7864, 0xf172, 0xf173, 0x7865, 0x4869, 0xf174, 0x622e, 0x622f, 0x7866, 0x7369, 0x6230, 0x6231, 0x6232, 0x3b2e, /* 0x76C0 */ 0x6233, 0x4756, 0x7867, 0x4b5f, 0x314e, 0xf176, 0x3157, 0x7868, 0x6234, 0x7869, 0x6236, 0x786a, 0x6235, 0x4570, 0x4039, 0x5d39, 0x6237, 0x4c41, 0x6238, 0x3446, 0x4857, 0x6239, 0x786b, 0x623a, 0xf178, 0x623b, 0xf179, 0x4c5c, 0x786c, 0x4c55, 0x443e, 0x416a, 0x623d, 0x786d, 0x3d62, /* 0x7700 */ 0x3e4a, 0x6240, 0x623f, 0x623e, 0x487d, 0x786e, 0x3447, 0x3829, 0xf17b, 0x786f, 0xf17c, 0x6246, 0x6243, 0x3f3f, 0x4c32, 0x6242, 0x6244, 0x6245, 0x6241, 0xf17d, 0x7870, 0xf17e, 0x7871, 0x6247, 0x6248, 0x442f, 0x3463, /* 0x7740 */ 0x4365, 0x7872, 0x6249, 0x7873, 0x7874, 0xf225, 0x624a, 0x624d, 0x7875, 0x7876, 0xf226, 0x3f67, 0x7877, 0x4644, 0x624e, 0x4b53, 0x624b, 0xf227, 0x624c, 0xf229, 0x6251, 0x7878, 0xf22a, 0xf22b, 0x6250, 0x624f, /* 0x7780 */ 0x7879, 0x6253, 0x6252, 0x6254, 0x787a, 0xf22e, 0x6256, 0xf22f, 0x6255, 0xf230, 0xf231, 0x4a4d, 0xf232, 0x787b, 0x3d56, 0x4e46, 0x6257, 0x4637, 0x6258, 0x6259, 0x625d, 0x625b, 0x625c, 0x625a, /* 0x77C0 */ 0x625e, 0x625f, 0x6260, 0x6261, 0x4c37, 0x6262, 0xf233, 0xf234, 0x787c, 0x4c70, 0x6263, 0xf235, 0x434e, 0xf236, 0x476a, 0x366b, 0xf237, 0xf238, 0x433b, 0x6264, 0x363a, 0xf23a, 0x4050, 0xf23b, 0xf23c, 0x6265, /* 0x7800 */ 0x3a3d, 0xf23e, 0xf23f, 0xf240, 0x6266, 0xf241, 0x6267, 0x3826, 0x3a55, 0xf242, 0x6269, 0xf243, 0x4556, 0x3a56, 0x354e, 0xf244, 0x787d, 0x4b24, 0x474b, 0x4557, 0x395c, /* 0x7840 */ 0x7921, 0x626b, 0xf245, 0x7922, 0x7923, 0x7924, 0x3e4b, 0xf246, 0x7925, 0xf247, 0x4e32, 0x3945, 0x7926, 0x3827, 0x4823, 0x626d, 0x626f, /* 0x7880 */ 0x386b, 0x626e, 0x4476, 0xf249, 0x6271, 0x3337, 0x626c, 0x486a, 0x3130, 0xf24a, 0x3a6c, 0x4f52, 0x6270, 0xf24c, 0xf24d, 0xf24e, 0x6272, 0xf24b, 0x4a4b, 0x4059, 0x6274, 0x792a, 0x6275, 0x7928, 0x6273, 0x334e, 0xf24f, 0x627b, 0x627a, /* 0x78C0 */ 0x3c27, 0x627c, 0x6277, 0xf250, 0x627d, 0x6278, 0xf251, 0xf252, 0x4858, 0x6276, 0x6279, 0xf253, 0x6322, 0xf254, 0xf255, 0x792b, 0xf256, 0x6321, 0x4b61, 0x627e, 0x306b, 0x792c, 0x6324, 0x792e, 0xf257, 0xf258, 0xf259, 0x6323, 0xf25a, /* 0x7900 */ 0x792d, 0x3e4c, 0x6325, 0x4143, 0xf25c, 0x6327, 0x6326, 0x6328, 0xf25d, 0x792f, 0xf25f, 0x6268, 0x626a, 0x632a, 0x6329, 0x7930, 0xf25e, 0x7931, 0x7932, 0x3c28, 0xf260, 0x4e69, 0x3c52, /* 0x7940 */ 0x632b, 0x3737, 0x7935, 0x7936, 0x3540, 0x3527, 0x3b63, 0xf261, 0x4d34, 0x6331, 0x6330, 0x4144, 0x632d, 0xf262, 0x632f, 0xf263, 0x793a, 0x3d4b, 0x3f40, 0x632e, 0x632c, 0x472a, 0x3e4d, 0xf265, 0x493c, 0x3a57, 0xf266, 0x4578, 0x793e, 0x6332, 0x6333, /* 0x7980 */ 0x6349, 0x3658, 0x4f3d, 0x4135, 0x6334, 0x3252, 0x4477, 0x4a21, 0xf267, 0xf268, 0xf269, 0x7942, 0xf26a, 0x6335, 0xf26b, 0x357a, 0x6336, 0xf26c, 0x6338, 0x6339, 0x4729, 0x7943, 0x633a, 0xf26d, 0x7944, 0x633b, 0x633c, 0xf26e, 0x3659, 0x3253, 0x4645, /* 0x79C0 */ 0x3d28, 0x3b64, 0xf26f, 0xf270, 0x7945, 0x633d, 0x7946, 0x3d29, 0xf271, 0xf272, 0x324a, 0x4943, 0x7948, 0x633e, 0xf273, 0x486b, 0x7949, 0x4145, 0x6341, 0x6342, 0x4769, 0x3f41, 0x633f, 0x4361, 0x794a, 0x6340, 0x794b, 0x3e4e, 0x305c, /* 0x7A00 */ 0x3529, 0x794c, 0x6343, 0xf278, 0x4478, 0x6344, 0x4047, 0xf279, 0x4c2d, 0xf27a, 0x4923, 0x6345, 0x6346, 0x4355, 0xf27b, 0x4e47, 0xf27c, 0x6348, 0x6347, 0xf27e, 0x3c6f, 0x634a, 0x3070, 0x634d, 0xf321, 0x794e, 0x634b, 0x3254, 0x374e, 0x634c, 0x3946, /* 0x7A40 */ 0x3972, 0x4a66, 0x634e, 0x4b54, 0xf322, 0x6350, 0xf323, 0x4051, 0x314f, 0x323a, 0x302c, 0xf324, 0x634f, 0xf325, 0xf326, 0x794f, 0xf327, 0xf328, 0x6351, 0x6352, 0x3e77, 0xf329, 0x6353, 0xf32a, 0x334f, 0x7950, 0x6355, 0x376a, 0xf32b, 0x3566, 0xf32c, 0x6356, 0x3675, 0x6357, 0x407c, /* 0x7A80 */ 0x464d, 0xf32d, 0x4060, 0x3a75, 0x7952, 0x6358, 0xf32e, 0xf32f, 0x4362, 0x416b, 0x635a, 0x635c, 0x6359, 0x635b, 0x3722, 0x7953, 0xf330, 0x635d, 0x3726, 0xf331, 0x3567, 0x4d52, 0x635f, 0x7955, 0x6360, 0xf334, 0x312e, 0x7956, 0xf335, 0xf336, 0x6363, /* 0x7AC0 */ 0x3376, 0x6362, 0x6361, 0x6365, 0x635e, 0x6366, 0x4e29, 0xf338, 0x6367, 0x7957, 0x6368, 0xf339, 0x5474, 0x636a, 0x6369, 0x636b, 0x636c, 0x4e35, 0x636d, 0x706f, 0x3e4f, 0x636e, 0x636f, 0x3d57, 0x4638, 0x6370, 0xf33a, 0xf33b, 0x4328, 0x7958, 0x6371, 0x433c, 0x6372, 0xf33c, 0x3625, 0x513f, 0x435d, 0x3c33, 0x7959, 0x3448, /* 0x7B00 */ 0x6373, 0x6422, 0x6376, 0xf33f, 0x3568, 0x6375, 0x6424, 0x6374, 0x3e50, 0x795a, 0x6378, 0x6379, 0x452b, 0x637a, 0x335e, 0x3f5a, 0x4964, 0xf342, 0x637c, 0xf343, 0x4268, 0x795b, 0xf344, 0xf345, 0xf346, 0x6377, 0x637b, 0x637d, 0x3a7b, 0x795c, 0xf341, /* 0x7B40 */ 0xf34a, 0x6426, 0x492e, 0x795d, 0x4826, 0x4579, 0x365a, 0x6425, 0x6423, 0x795e, 0x4835, 0x637e, 0x435e, 0x457b, 0x457a, 0xf34c, 0x3a76, 0x6438, 0x795f, 0xf34e, 0x6428, 0xf34f, 0x642a, 0xf350, 0x642d, 0x7960, 0x642e, 0x7961, 0x642b, 0x642c, 0x7962, 0xf351, 0x6429, 0x6427, 0xf34d, 0x6421, 0xf349, /* 0x7B80 */ 0x4a4f, 0x3255, 0x6435, 0x6432, 0x6437, 0xf354, 0xf355, 0x6436, 0x4773, 0x4c27, 0x3b3b, 0x6430, 0x6439, 0x6434, 0xf356, 0x6433, 0x642f, 0x7963, 0x6431, 0x3449, 0x433d, 0x407d, 0xf358, 0x4822, 0x643e, 0xf359, 0x4824, 0xf35a, /* 0x7BC0 */ 0x4061, 0x643b, 0x484f, 0xf35b, 0x643f, 0x4a53, 0x435b, 0xf35c, 0x643a, 0x643c, 0x643d, 0xf35f, 0xf360, 0x7965, 0x7966, 0xf361, 0x6440, 0x3c44, 0x4646, 0x6445, 0x6444, 0x6441, 0xf362, 0x4f36, 0xf363, 0x644a, 0x644e, 0x644b, /* 0x7C00 */ 0x6447, 0x7967, 0xf364, 0x6448, 0xf365, 0x644d, 0xf366, 0xf367, 0x6442, 0x5255, 0x6449, 0x6443, 0x644c, 0x7969, 0x6452, 0x796a, 0x344a, 0x644f, 0xf368, 0x6450, 0x6451, 0x6454, 0x7968, 0x796b, 0x796c, 0x6453, 0x4876, 0x6455, 0x4e7c, 0x4a6d, /* 0x7C40 */ 0x645a, 0x6457, 0xf369, 0xf36a, 0x6456, 0x4052, 0x6459, 0x645b, 0xf36b, 0x6458, 0x645f, 0xf36c, 0x645c, 0x796f, 0xf36d, 0x645d, 0x6446, 0xf36e, 0x645e, 0x6460, 0xf36f, 0x6461, 0x7970, 0xf370, 0xf371, 0xf372, 0x4a46, 0x6462, 0x7971, 0x4c62, /* 0x7C80 */ 0x364e, 0x3729, 0x6463, 0x4a34, 0x3f68, 0x4c30, 0x7972, 0x6464, 0x4e33, 0x7973, 0x4774, 0x4146, 0x4734, 0x3d4d, 0x3040, 0x7974, 0x6469, 0x6467, 0x6465, 0x3421, 0xf376, 0x3e51, 0x646a, 0x6468, 0x6466, 0x646e, 0x646d, 0x646c, 0x646b, 0xf378, 0xf379, 0x646f, 0x7975, 0x6470, 0x403a, 0xf37a, /* 0x7CC0 */ 0x6471, 0x6473, 0xf37c, 0x6472, 0xf37e, 0x3852, 0xf421, 0x4138, 0x6475, 0x7976, 0x457c, 0xf423, 0x6474, 0x7977, 0x6476, 0x7978, 0x4a35, 0x416c, 0x3947, 0x6477, 0xf425, 0x4e48, 0xf426, 0x6479, 0x647a, 0x647b, 0xf428, 0x647c, 0x3b65, 0x647d, 0x374f, 0x356a, /* 0x7D00 */ 0x352a, 0x6521, 0xf429, 0x4c73, 0x3948, 0x647e, 0x7979, 0x797a, 0xf42a, 0x6524, 0x4c66, 0x473c, 0x4933, 0xf42c, 0x797b, 0x3d63, 0x6523, 0x3c53, 0x3949, 0x3b66, 0x3569, 0x4a36, 0x6522, 0x797c, 0xf42d, 0x4147, 0x4b42, 0x3a77, 0x797d, 0x3b67, 0x445d, 0x6527, 0x4e5f, 0x3a59, 0x797e, 0x6528, 0x3f42, 0x652a, 0x3e52, 0x3a30, 0xf430, 0xf431, 0x6529, /* 0x7D40 */ 0xf432, 0x7a21, 0x3d2a, 0x383e, 0x4148, 0x6525, 0x652b, 0xf433, 0x7a22, 0x6526, 0x3750, 0x652e, 0x6532, 0x376b, 0x7a23, 0x652d, 0xf437, 0xf438, 0x6536, 0x7a24, 0x394a, 0x4d6d, 0x303c, 0x6533, 0x356b, 0x6530, 0xf439, 0x6531, 0xf43a, 0x457d, 0x652f, 0x652c, 0x3328, 0x4064, 0x3828, 0x7a25, 0x6538, 0xf43c, /* 0x7D80 */ 0x7a26, 0xf43e, 0xf43f, 0x6535, 0x7a27, 0xf440, 0x6537, 0x6534, 0xf441, 0x3751, 0x4233, 0x6539, 0x416e, 0xf443, 0x6546, 0x7a28, 0x6542, 0x653c, 0x7a29, 0xf444, 0xf445, 0x6540, 0x3c7a, 0x305d, 0x653b, 0x6543, 0x6547, 0x394b, 0x4c56, 0x4456, 0x653d, 0xf446, 0xf447, 0x6545, 0x653a, 0x433e, 0x653f, 0x303d, 0x4c4a, /* 0x7DC0 */ 0xf448, 0x7a2a, 0x653e, 0x365b, 0x486c, 0x7a2b, 0x416d, 0x4e50, 0x3d6f, 0x656e, 0x7a2c, 0xf449, 0x6548, 0xf44a, 0x407e, 0x6544, 0x6549, 0x654b, 0x4479, 0x654e, 0x7a2d, 0x654a, 0xf44b, 0x4a54, 0x344b, 0x4c4b, 0x305e, 0xf44c, 0x654d, 0x4e7d, 0xf44d, 0x654c, /* 0x7E00 */ 0x316f, 0x466c, 0x654f, 0x7a30, 0x6556, 0x6550, 0x6557, 0xf451, 0x7a31, 0x6553, 0x7a32, 0xf452, 0x477b, 0xf453, 0x3c4a, 0x6555, 0xf454, 0x6552, 0x6558, 0x6551, 0x3d44, 0xf455, 0x7a2f, 0x4b25, 0xf456, 0x3d4c, 0x6554, 0x6560, 0x655c, 0x655f, 0x655d, 0x6561, 0x655b, 0x6541, 0x4053, /* 0x7E40 */ 0x484b, 0x655e, 0xf457, 0x6559, 0x7a34, 0x4121, 0x3752, 0x3d2b, 0x7a35, 0x3f25, 0x4136, 0x6564, 0x6566, 0x6567, 0x6563, 0x6565, 0x7a36, 0x655a, 0x6562, 0x656a, 0x6569, 0x7e7e, 0x4b7a, 0x372b, 0xf458, 0xf459, 0x6568, 0x656c, 0x656b, 0x656f, 0xf45a, 0x6571, /* 0x7E80 */ 0x3b3c, 0x656d, 0xf45b, 0xf45c, 0x6572, 0x6573, 0x7a37, 0x6574, 0x7a38, 0x657a, 0x453b, 0x6576, 0xf45e, 0x6575, 0x6577, 0x6578, 0x6579, 0xf45f, 0xf460, 0x657b, 0x657c, /* 0x7F00 */ 0x344c, 0x657d, 0x657e, 0xf463, 0xf462, 0xf464, /* 0x7F40 */ 0xf465, 0xf466, 0x6621, 0x7a39, 0x6622, 0x6623, 0x6624, 0xf467, 0x6625, 0x6626, 0xf46a, 0x6628, 0x6627, 0x6629, 0x662a, 0x662b, 0xf46c, 0xf46d, 0xf46e, 0x662e, 0x662c, 0x662d, 0x3a61, 0x3753, 0xf46f, 0x4356, 0x4833, 0x3d70, 0x474d, 0x486d, 0x662f, 0x586d, 0xf470, 0xf471, /* 0x7F80 */ 0x6630, 0x6632, 0x4d65, 0x6631, 0x6634, 0x6633, 0x4d53, 0x6635, 0x487e, 0xf473, 0x7a3b, 0x6636, 0xf476, 0x7a3c, 0x6639, 0xf477, 0x6638, 0x6637, 0x663a, 0x3732, 0x4122, 0x3541, 0xf478, 0x663e, 0x663b, 0x663c, 0x663f, 0x6640, 0x663d, 0x3129, 0x7a3d, /* 0x7FC0 */ 0x3227, 0xf47a, 0x6642, 0x6643, 0x6644, 0x4d62, 0x7a3e, 0xf47b, 0x3d2c, 0x6646, 0x6645, 0x7a3f, 0x7a40, 0x3f69, 0x6647, 0xf47c, 0xf47d, 0x6648, 0x6649, 0x3465, 0x7a41, 0x7a42, 0xf47e, 0x344d, 0xf521, 0x664a, 0x664b, 0x7a43, 0x4b5d, 0x4d63, /* 0x8000 */ 0x4d54, 0x4f37, 0xf522, 0x394d, 0x664e, 0x3c54, 0x664d, 0xf524, 0xf523, 0x664f, 0x3c29, 0xf525, 0x4251, 0xf526, 0x6650, 0x7a45, 0x394c, 0xf527, 0x4c57, 0x6651, 0x6652, 0x6653, 0x6654, 0xf528, 0x7a46, 0x6655, 0xf529, 0xf52a, 0x3c2a, 0x7a47, 0x4c6d, 0x7a48, 0x6657, 0x7a49, 0x433f, 0x6656, /* 0x8040 */ 0xf52b, 0x6659, 0x6658, 0x665a, 0x403b, 0x665b, 0x665c, 0x4a39, 0x665d, 0x416f, 0x665e, 0xf52c, 0x665f, 0x4e7e, 0x6662, 0xf52d, 0x6661, 0x6660, 0x4430, 0xf52e, 0x6663, 0x3f26, 0x6664, 0xf52f, 0x6665, 0x4f38, 0x6666, /* 0x8080 */ 0x6667, 0x6669, 0x6668, 0x4825, 0x4679, 0x4f3e, 0x4829, 0x666b, 0x3e53, 0x492a, 0xf530, 0x666c, 0x666a, 0xf531, 0x344e, 0x3854, 0x3b68, 0xf532, 0x486e, 0xf533, 0x382a, 0x4b43, 0x666f, 0x666d, 0x394e, 0x394f, 0x3069, 0x3a68, 0xf534, 0x4759, /* 0x80C0 */ 0x305f, 0x6674, 0xf536, 0x4340, 0x7a4a, 0x4758, 0x425b, 0xf537, 0x6676, 0x7a4b, 0xf538, 0x6672, 0x6675, 0x6670, 0x6673, 0x4b26, 0x7a4c, 0x3855, 0x307d, 0x6671, 0xf539, 0x6678, 0x6679, 0x7a4d, 0x4639, 0xf53c, 0x363b, 0xf53d, 0x6726, 0x473d, /* 0x8100 */ 0x3b69, 0x363c, 0x4048, 0x4f46, 0x4c2e, 0x6677, 0x4054, 0xf53b, 0xf540, 0x7a4e, 0x3553, 0x667a, 0xf541, 0x667c, 0xf543, 0xf544, 0x667b, 0xf545, 0x667d, 0x4326, 0x473e, 0xf53f, 0x4431, 0xf547, 0x6723, /* 0x8140 */ 0x6722, 0x7a4f, 0x667e, 0x3f55, 0x4965, 0x6725, 0x6724, 0x3950, 0x4f53, 0x6735, 0x7a50, 0x6729, 0x672a, 0x7a51, 0x7a52, 0xf549, 0x3c70, 0x7a53, 0x6728, 0x3978, 0x6727, 0x672b, 0x4432, 0x4a22, 0x4123, 0x425c, /* 0x8180 */ 0x672f, 0xf54b, 0x6730, 0x672c, 0xf54d, 0xf54e, 0x672d, 0x672e, 0x3951, 0x6736, 0x6732, 0xf550, 0x4966, 0x4b6c, 0x4928, 0x6731, 0x6734, 0x6733, 0x4b44, 0x6737, 0x6738, 0xf551, 0x4137, 0x6739, 0x673b, 0x673f, 0x7a54, 0x673c, 0x673a, 0x473f, /* 0x81C0 */ 0x673d, 0xf552, 0x673e, 0xf553, 0x3232, 0x6745, 0x6740, 0x7a55, 0x6741, 0x7a56, 0x6742, 0x4221, 0xf554, 0x7a57, 0x6744, 0x6743, 0x6746, 0xf555, 0x6747, 0x6748, 0x3f43, 0xf557, 0x3269, 0x6749, 0x4e57, 0x3c2b, 0xf559, 0x3d2d, 0x3b6a, 0x4357, 0x674a, 0x674b, 0x3131, 0xf55b, 0x674c, 0xf55c, /* 0x8200 */ 0x674d, 0x674e, 0xf55e, 0x674f, 0x6750, 0x363d, 0x5a2a, 0x6751, 0x4065, 0x6752, 0x3c4b, 0x6753, 0x5030, 0x6754, 0x4a5e, 0x345c, 0xf560, 0x4124, 0x3d58, 0x4971, 0x3d2e, 0xf561, 0xf562, 0x6755, 0x3952, 0x6756, 0x484c, 0x6764, 0xf564, 0x6758, 0xf565, 0x4249, 0x4775, 0x383f, 0x6757, 0x4125, 0xf566, /* 0x8240 */ 0x6759, 0xf569, 0xf567, 0x447a, 0xf568, 0xf56b, 0xf56d, 0xf56f, 0x675b, 0x675a, 0x675d, 0xf571, 0x675c, 0x675e, 0x7a5b, 0x6760, 0xf572, 0x675f, 0x344f, 0x6761, 0x6762, 0x6763, 0x3a31, 0x4e49, 0x6765, 0x3f27, 0x7a5c, 0x3170, 0x6766, 0x6767, 0xf576, 0xf578, 0x6768, 0xf579, /* 0x8280 */ 0xf57a, 0xf57b, 0x3072, 0x6769, 0x7a5e, 0x676a, 0xf57c, 0x4967, 0x3c47, 0x676c, 0x7a5f, 0x7a60, 0x7a61, 0x3329, 0x3032, 0xf57d, 0xf57e, 0x7a62, 0x676b, 0x676e, 0x474e, 0x7a63, 0x3f44, 0x3256, 0xf621, 0x4b27, 0xf622, 0x7a64, 0x375d, 0x365c, 0xf623, 0x676d, 0xf624, 0x326a, 0x7a65, 0x7a66, /* 0x82C0 */ 0x3423, 0x7a67, 0x3171, 0x6772, 0x4e6a, 0x425d, 0x7a68, 0x4944, 0x677e, 0x3257, 0x677c, 0x677a, 0x6771, 0x676f, 0xf625, 0x6770, 0x3c63, 0x366c, 0x4377, 0xf626, 0x4651, 0x3151, 0x6774, 0x6773, 0xf627, 0x6779, 0x6775, 0x6778, 0x7a69, 0x7a6a, /* 0x8300 */ 0x7a6b, 0x7a6c, 0x4c50, 0x6777, 0x3258, 0x337d, 0x677b, 0xf628, 0xf629, 0x677d, 0xf62a, 0x3754, 0x6823, 0x682c, 0x682d, 0xf62c, 0x302b, 0xf62d, 0x7a6e, 0x6834, 0x3071, 0x682b, 0x7a6f, 0x682a, 0xf62e, 0x6825, 0x6824, 0x6822, 0x6821, 0x4363, 0x427b, 0x6827, 0x7a70, 0xf62f, /* 0x8340 */ 0x6826, 0x7a71, 0xf630, 0x6829, 0x7a72, 0x4170, 0x3755, 0x3141, 0x6828, 0x7a73, 0x3953, 0xf62b, 0x7a74, 0xf631, 0x4171, 0x7a6d, 0xae4a, 0x683a, 0x683b, 0x3259, 0x322e, 0x6838, 0x7a75, 0xf633, /* 0x8380 */ 0x682e, 0x7a76, 0x6836, 0x683d, 0x6837, 0xf636, 0x6835, 0x7a77, 0x6776, 0xf637, 0xf638, 0x6833, 0x7a78, 0x682f, 0xf639, 0xf63a, 0x3450, 0x6831, 0x683c, 0x6832, 0x7a79, 0x683e, 0x7a7a, 0x6830, 0x477c, 0x4d69, 0x6839, 0x684f, 0x7a7b, /* 0x83C0 */ 0x7a7c, 0x6847, 0x3f7b, 0x7a7d, 0xf63b, 0x3546, 0x365d, 0x6842, 0x7a7e, 0xf63c, 0x7b21, 0x325b, 0xf63d, 0x3e54, 0x6845, 0x3a5a, 0xf63e, 0x4551, 0x684a, 0x7b22, 0xf63f, 0x4a6e, 0x7b23, 0x6841, 0x325a, 0x3856, 0x4929, 0x684b, 0x683f, 0x6848, 0xf640, 0x6852, 0x6843, /* 0x8400 */ 0x7b24, 0x6844, 0x463a, 0x7b25, 0x6849, 0x7b26, 0x6846, 0x4b28, 0x684c, 0x3060, 0xf641, 0xf642, 0x6840, 0xf643, 0xf645, 0x684e, 0x684d, 0x476b, 0x6854, 0x685f, 0x337e, 0x6862, 0x6850, 0xf646, 0x6855, 0x4d6e, /* 0x8440 */ 0x685e, 0x7b28, 0x4d55, 0xf647, 0x4e2a, 0xf648, 0xf649, 0xf64a, 0x4378, 0xf64b, 0xf64c, 0x336b, 0xf64d, 0x7b29, 0x4972, 0x6864, 0x4621, 0xf64f, 0x3031, 0x685d, 0x6859, 0x4172, 0x6853, 0x685b, 0x6860, 0x7b2a, 0x472c, 0x7b2b, 0x302a, 0xf650, 0x6858, 0xf651, 0x6861, 0x4978, 0xf652, /* 0x8480 */ 0xf653, 0x685c, 0x6857, 0x7b2c, 0x3e55, 0x3d2f, 0x3c2c, 0xf656, 0x4c58, 0x4947, 0x7b2d, 0x6867, 0x6870, 0xf657, 0x685a, 0x7b2e, 0x3377, 0x7b2f, 0x3e78, 0x6865, 0x7b30, 0x686a, 0x4173, 0xf658, 0x6866, /* 0x84C0 */ 0x7b31, 0x686d, 0x7b32, 0x435f, 0x686e, 0x4d56, 0x6863, 0x3338, 0x6869, 0xf65a, 0xf65b, 0x686c, 0x4c2c, 0xf65c, 0x686f, 0x6868, 0x686b, 0xf655, 0xf65e, 0xf65f, 0x4b29, 0x4f21, 0xf660, 0xf661, 0xf662, 0x6873, 0xf663, 0x687a, 0xf664, 0x6872, /* 0x8500 */ 0x3c43, 0x6851, 0xf665, 0x4a4e, 0x4c22, 0x6879, 0x6878, 0x6874, 0x6875, 0x3136, 0xf666, 0x7b35, 0x6877, 0x6871, 0x7b36, 0xf667, 0xf668, 0x4455, 0xf669, 0x6876, 0x307e, 0x7b37, 0x7b34, 0xf66a, 0x4222, 0x4a43, 0xf66f, /* 0x8540 */ 0x687b, 0x6921, 0x4859, 0x687e, 0x3e56, 0x3c49, 0x6923, 0x363e, 0xf66b, 0xf670, 0xf671, 0x6924, 0x4979, 0x687d, 0x7b38, 0x6856, 0xf672, 0xf673, 0xf674, 0x687c, 0x7b39, 0x4f4f, 0x4622, 0x4973, 0x692b, 0xf66c, 0x6931, 0x7b3c, 0xf676, 0xf677, 0x6932, 0xf678, /* 0x8580 */ 0x6925, 0xf679, 0x4776, 0xf67a, 0x692f, 0x6927, 0x6929, 0x7b3d, 0x7b3e, 0x6933, 0x6928, 0xf67b, 0x692c, 0x3172, 0x4665, 0x692d, 0x6930, 0xf67c, 0xf67d, 0x7b3f, 0x6926, 0x4126, 0x692a, 0x3b27, 0x3f45, 0x3730, 0x4c74, 0x7b3b, 0x4c79, 0x3d72, 0x7b40, 0xf723, 0x6937, 0x6935, 0xf724, /* 0x85C0 */ 0x4f4e, 0xf725, 0x6934, 0xf726, 0x7b41, 0x4d75, 0x7b42, 0x6936, 0x6938, 0x6939, 0xf727, 0xf728, 0x693c, 0x693a, 0xf729, 0xf72a, 0x4623, 0x693b, 0xf72b, 0x484d, 0x692e, 0x7b43, 0xf72c, 0x3d73, 0x693d, 0x6942, 0x4174, 0x6941, 0x7b45, /* 0x8600 */ 0xf72d, 0x6922, 0x7b46, 0x7b47, 0x6943, 0x4149, 0x693e, 0x6940, 0x7b48, 0xf72e, 0x7b44, 0x693f, 0x5d31, 0x5d22, 0x7b4a, 0x6945, 0xf72f, 0xf730, 0x6944, 0xf731, 0xf732, 0x7b4b, 0x4d76, 0x623c, 0x6946, 0x7b4c, 0xf734, 0xf735, 0x6947, /* 0x8640 */ 0xf737, 0x2f68, 0x6948, 0x3857, 0x3554, 0xf739, 0x694a, 0x515d, 0xf73a, 0x7b4d, 0x3575, 0x7b4e, 0x4e3a, 0x3673, 0x694b, 0x7b50, 0x694c, 0x436e, 0x7b52, 0xf73b, 0x694d, 0x7b53, 0xf73c, 0x467a, 0xf73d, 0x303a, /* 0x8680 */ 0xf73e, 0xf73f, 0x3263, 0x6952, 0x6953, 0xf740, 0xf741, 0x694e, 0x3b3d, 0x7b54, 0xf742, 0xf743, 0x694f, 0x4742, 0xf744, 0x6950, 0x6951, 0x695b, 0x6955, 0x6958, 0xf746, 0xf747, 0x6954, 0x7b55, /* 0x86C0 */ 0xf748, 0xf749, 0x6956, 0x6957, 0x3c58, 0x6959, 0x4341, 0x3756, 0x3342, 0xf74a, 0x695c, 0xf74b, 0xf74c, 0x333f, 0x6961, 0x695d, 0x6960, 0xf74d, 0x483a, 0xf74e, 0x695e, 0x695f, 0x4948, 0x485a, 0x6962, 0x427d, 0x696c, 0x7b56, 0x6968, 0x7b57, 0x7b58, 0x326b, /* 0x8700 */ 0x6966, 0x4b2a, 0x6967, 0xf750, 0x6964, 0xf751, 0x6965, 0x696a, 0x696d, 0x7b59, 0x696b, 0xf752, 0xf753, 0x6969, 0x6963, 0xf754, 0x4358, 0xf755, 0x6974, 0x4c2a, 0xf756, 0xf757, 0xf758, 0x6972, 0x6973, 0xf759, 0x696e, 0x6970, 0xf75a, 0x6971, 0xf75b, 0x696f, /* 0x8740 */ 0xf75c, 0xf75d, 0x4066, 0x4f39, 0x6978, 0x6979, 0xf75e, 0x6a21, 0x3f2a, 0x697b, 0xf75f, 0x697e, 0x6976, 0x6975, 0x6a22, 0xf760, 0xf761, 0x325c, 0x697c, 0x6a23, 0x697d, 0x7b5a, 0xf762, 0x697a, 0x4433, 0x6977, 0xf763, 0x4768, /* 0x8780 */ 0x6a27, 0x7b5b, 0x7b5c, 0xf767, 0xf768, 0x4d3b, 0xf769, 0x6a26, 0xf76a, 0x6a25, 0xf766, 0x6a2e, 0x7b5d, 0x7b5e, 0x6a28, 0x6a30, 0x7b5f, 0x4d66, 0x6a33, 0x6a2a, 0xf76d, /* 0x87C0 */ 0x6a2b, 0xf76f, 0x6a2f, 0x6a32, 0x6a31, 0x6a29, 0xf770, 0x6a2c, 0x6a3d, 0x7b61, 0xf772, 0x6a36, 0xf774, 0xf775, 0xf776, 0xf777, 0xf778, 0x7b62, 0xf779, 0x6a34, 0x6a35, 0xf771, 0x6a3a, 0x6a3b, 0x332a, 0x3542, 0x6a39, /* 0x8800 */ 0xf77a, 0xf77b, 0x6a24, 0x7b63, 0x7b64, 0xf77c, 0x6a38, 0x6a3c, 0x6a37, 0x7b65, 0x6a3e, 0xf77d, 0x7b66, 0x6a40, 0x6a3f, 0x7b67, 0x6a42, 0x6a41, 0x695a, 0x6a46, 0xf77e, 0xf821, 0x6a43, 0xf822, 0x6a44, 0x6a45, 0x6a47, 0xf823, /* 0x8840 */ 0x376c, 0x6a49, 0x6a48, 0x3d30, 0xf825, 0x3954, 0x5e27, 0x6a4a, 0x3d51, 0x3339, 0xf826, 0x6a4b, 0x3152, 0x3e57, 0x6a4c, 0xf827, 0x3955, 0x6a4d, 0x3061, 0xf828, 0x493d, 0xf82b, 0x6a4e, 0xf82d, 0x3f6a, 0x6a55, 0x6a52, 0x436f, 0x6a53, 0x6a50, 0x365e, /* 0x8880 */ 0x6a4f, 0x6a56, 0x3736, 0x425e, 0x6a5c, 0x6a58, 0x4235, 0x6a57, 0x7b68, 0x6a5a, 0x6a51, 0xf82e, 0x6a5b, 0x6a5d, 0x7b69, 0x486f, 0x6a59, 0x6a5e, 0x6a60, 0x3853, 0x6a54, 0x3041, 0xf82f, 0xf830, 0xf831, 0x6a5f, /* 0x88C0 */ 0xf832, 0x3a5b, 0x4e76, 0x6a61, 0x6a62, 0x4175, 0x7b6a, 0x7b6b, 0x4e22, 0xf835, 0xf833, 0xf836, 0x6a63, 0x4d35, 0x6a64, 0x6a65, 0xf837, 0x4a64, 0x6a66, 0x3a40, 0x4e23, 0x6a6b, 0xf838, 0xf839, 0x6a6c, 0x3e58, 0x6a6a, 0x7b6d, 0x4d67, 0x6a67, 0x6a69, 0x403d, 0x3f7e, /* 0x8900 */ 0xf83b, 0x6a68, 0x6a6d, 0x4a23, 0x6a6f, 0x6a6e, 0x336c, 0x4b2b, 0x6a70, 0x7b70, 0x7b71, 0x7b72, 0x7b6e, 0x6a7c, 0x6a72, 0x6a73, 0x7b73, 0x6a74, 0x6a75, 0x7b74, 0x7b75, 0x6a79, 0xf83d, 0x6a7a, 0x7b76, 0x6a78, /* 0x8940 */ 0x7b77, 0x6a76, 0xf83f, 0x6a71, 0x6a77, 0xf840, 0xf841, 0x6a7b, 0x7037, 0x3228, 0x6a7e, 0x365f, 0x6a7d, 0xf844, 0x6b22, 0x6b21, 0x6b24, 0x6b23, 0x6b25, 0x3d31, 0x6b26, 0x6b27, 0x6b28, 0x403e, /* 0x8980 */ 0xf845, 0x4d57, 0x6b29, 0x4a24, 0x4746, 0x6b2a, 0xf846, 0x6b2b, 0x382b, 0x352c, 0xf847, 0x6b2c, 0x7b78, 0x3b6b, 0x4741, 0x6b2d, 0x3350, 0xf848, 0x6b2e, 0x6b30, 0x4d77, 0x6b2f, 0x3f46, 0x6b31, 0x6b32, 0xf849, 0x6b33, 0x3451, 0xf84a, 0x6b34, 0x6b35, 0x6b36, /* 0x89C0 */ 0x6b37, 0x3351, 0x7b7a, 0xf84b, 0xf84c, 0x6b38, 0x6b39, 0x6b3a, 0x3272, 0x7b7b, 0x3f28, 0x6b3b, 0xf84d, 0xf84f, 0xf850, 0x6b3c, 0x7b7c, 0x6b3d, 0xf851, 0xf852, /* 0x8A00 */ 0x3840, 0x447b, 0x6b3e, 0x3757, 0x3f56, 0x6b41, 0x4624, 0x6b40, 0xf854, 0x7b7d, 0x3731, 0xf855, 0x7b7e, 0x6b3f, 0x4277, 0x352d, 0x6b42, 0x6b43, 0x3e59, 0xf857, 0x7c21, 0x376d, 0x6b44, 0x4b2c, 0x405f, 0x3576, 0x4c75, 0x414a, 0xf858, 0x6b45, 0x7c22, 0x3f47, 0x4370, 0x3e5a, 0xf859, /* 0x8A40 */ 0x6b46, 0xf85a, 0x6b49, 0x7c23, 0x6b4a, 0xf85b, 0x7c24, 0x3a3e, 0x4242, 0x6b48, 0x3e5b, 0x493e, 0xf85c, 0x6b47, 0x7c25, 0x3b6c, 0x3153, 0x7c26, 0x6b4e, 0x3758, 0x3b6e, 0x3b6d, 0x4f4d, 0x6b4d, 0x6b4c, 0x4127, 0x354d, 0x4f43, 0x333a, 0x3e5c, 0x7c27, 0x7c28, 0x6b4b, /* 0x8A80 */ 0x6b50, 0x6b51, 0x6b4f, 0x3858, 0x4d40, 0x3b6f, 0x4727, 0xf85e, 0x6b54, 0x4040, 0x4342, 0x4d36, 0x6b57, 0x386c, 0x403f, 0x6b53, 0x6b58, 0x386d, 0x6b55, 0x6b56, 0x7c29, 0x6b52, 0x4062, 0x4649, 0xf85d, 0x432f, 0x325d, 0xf85f, 0x4870, 0x3543, 0xf860, 0x4434, /* 0x8AC0 */ 0x6b5b, 0x6b59, 0x434c, 0x4041, 0x3452, 0x6b5a, 0x3f5b, 0x7c2a, 0x4e4a, 0x4f40, 0xf861, 0x6b5c, 0x6b67, 0x4435, 0x6b66, 0x7c2b, 0x6b63, 0x6b6b, 0x6b64, 0x6b60, 0x447c, 0x6b5f, 0x6b5d, 0x4d21, 0x3b70, 0x6b61, 0x6b5e, 0x7c2c, 0x7c2d, 0x6b65, 0x3d74, 0x3841, 0xf862, 0x427a, /* 0x8B00 */ 0x4b45, 0x315a, 0x3062, 0x4625, 0xf865, 0x6b69, 0xf864, 0x6b68, 0xf866, 0x4666, 0x6b6d, 0x6b62, 0x6b6c, 0x6b6e, 0x382c, 0x6b6a, 0x3956, 0xf867, 0x3c55, 0xf868, 0x6b6f, 0x4d58, 0x6b72, 0x6b75, 0x6b73, 0x4935, 0xf869, 0x6b70, 0x3660, 0x6b74, /* 0x8B40 */ 0x6b76, 0xf86a, 0x7c31, 0x6b7a, 0x6b77, 0x6b79, 0x6b78, 0xf86c, 0x7c32, 0x6b7b, 0x3c31, 0x7c33, 0x6b7d, 0x6b7c, 0x4968, 0xf86d, 0x6c21, 0x3759, 0x7c34, 0x6b7e, 0x6c22, 0x6c23, 0x3544, 0x6641, 0x3e79, 0x6c24, 0xf86e, 0x386e, 0x6c25, 0xf86f, /* 0x8B80 */ 0x6c26, 0xf870, 0x3b3e, 0x5a4e, 0xf871, 0x6c27, 0x6c28, 0x3d32, 0x6c29, 0x6c2a, 0xf872, 0xf873, 0x6c2b, 0x6c2c, 0x6c2d, 0xf874, 0x7c35, 0xf875, /* 0x8C00 */ 0x432b, 0xf876, 0x6c2e, 0xf878, 0x6c30, /* 0x8C40 */ 0x6c2f, 0xf87b, 0x4626, 0xf87c, 0x6c31, 0x7c36, 0x4b2d, 0x6c32, 0x6c33, 0xf87d, 0x6c34, 0xf87e, 0x6c35, 0xf921, 0x465a, 0x3e5d, 0x6c36, 0x7c37, 0xf922, 0x396b, 0x502e, 0x6c37, 0xf923, 0xf924, 0x6c38, 0x493f, 0x6c39, 0x6c41, /* 0x8C80 */ 0x6c3a, 0x6c3c, 0x6c3b, 0x6c3d, 0x4b46, 0x6c3e, 0x6c3f, 0xf927, 0xf926, 0x6c40, 0x6c42, 0xf928, 0xf92a, 0x332d, 0x4467, 0x4969, 0x3a62, 0x3957, 0xf92b, 0x494f, 0x325f, 0x484e, 0x6c45, 0x3453, 0x4055, 0x6c44, 0x6c49, 0x4379, 0x4c63, 0x6c47, 0x6c48, 0x352e, 0x6c4a, 0x4763, 0x425f, 0x4871, 0x453d, 0x6c46, 0x4b47, /* 0x8CC0 */ 0x326c, 0x6c4c, 0x4f28, 0x4442, 0x4f45, 0x3b71, 0x6c4b, 0x4231, 0x6c5c, 0x4128, 0x4678, 0x4950, 0xf92d, 0xf92c, 0xf92e, 0x6c4f, 0x3b3f, 0x3b72, 0x3e5e, 0x4765, 0x7c39, 0x382d, 0x6c4e, 0x6c4d, 0x496a, 0x3c41, 0x4552, 0xf930, 0xf931, 0x7c3a, 0x7c3b, 0x6c51, 0x6c52, 0x3958, 0x6c50, 0x7c3c, /* 0x8D00 */ 0x6c53, 0x6c54, 0x6c56, 0x4223, 0xf933, 0x6c55, 0x3466, 0x6c58, 0xf934, 0x6c57, 0x6c59, 0x7c3e, 0x6c5b, 0x6c5d, 0x6c5e, 0x7c3f, /* 0x8D40 */ 0x4056, 0x3c4f, 0x6c5f, 0x3352, 0xf935, 0x6c60, 0x4176, 0x6c61, 0x6c62, 0x496b, 0x352f, /* 0x8D80 */ 0x6c63, 0xf936, 0x4436, 0x315b, 0xf937, 0x6c64, 0x3c71, 0xf938, 0x3f76, 0x7c40, 0x422d, 0x6c67, 0x6c66, /* 0x8DC0 */ 0x6c65, 0xf93a, 0xf93b, 0x6c6d, 0x6c6b, 0x7c41, 0x6c68, 0x7c42, 0x6c6a, 0x7c43, 0xf93c, 0x6c69, 0x6c6c, 0x3577, 0x6c70, 0x4057, 0x6c71, 0x3859, 0x6c6e, 0x6c6f, 0xf93d, 0x4f29, 0x4437, 0x4129, 0x6c72, 0xf940, 0x6c75, /* 0x8E00 */ 0xf941, 0x6c73, 0x6c74, 0x4d59, 0xf93e, 0x4627, 0x6c78, 0xf943, 0xf944, 0x6c76, 0x6c77, 0x6c79, 0x7c44, 0xf945, 0xf946, 0x7c45, 0xf947, 0x6d29, 0x6c7c, 0x6c7d, 0x6c7b, 0xf94a, 0xf94b, 0x7c46, /* 0x8E40 */ 0x6c7a, 0x447d, 0x6d21, 0x6d25, 0x6d22, 0x6c7e, 0xf94c, 0x6d23, 0x6d24, 0xf94d, 0x6d2b, 0x6d26, 0x4058, 0x6d28, 0xf94e, 0x6d2a, 0x6d27, 0xf94f, 0xf950, 0xf951, 0x7c47, 0x6d2d, 0x3d33, 0x6d2c, 0x7c48, 0x6d2e, /* 0x8E80 */ 0x6d2f, 0x6d32, 0x6d31, 0x6d30, 0x6d34, 0x6d33, 0x4c76, 0x6d36, 0x6d35, 0x6d37, 0xf952, 0x6d38, 0xf953, 0x6d3a, 0x6d39, 0x3f48, 0x6d3b, 0xf954, 0x366d, 0x6d3c, 0x6d3e, 0xf955, 0xf956, 0xf957, 0xf958, 0x6d3f, /* 0x8EC0 */ 0x7c4a, 0x6d40, 0x6d3d, 0x6d41, 0x3c56, 0x6d42, 0x3530, 0x3733, 0xf95a, 0x382e, 0xf95b, 0x6d43, 0x4670, 0x453e, 0x6d44, 0x6d47, 0x3c34, 0xf95d, 0x7c4c, 0x6d46, 0x6d45, 0x375a, 0x6d48, /* 0x8F00 */ 0xf95f, 0x3353, 0x6d4a, 0xf960, 0x3a5c, 0x6d49, 0x6d52, 0x6d4c, 0x6d4e, 0x4a65, 0x6d4b, 0xf961, 0x6d4d, 0x6d51, 0x6d4f, 0x3531, 0x7c4d, 0x6d50, 0x6d53, 0x475a, 0x4e58, 0xf962, 0x7c4e, 0x3d34, 0x6d54, 0x7c4f, 0x4d22, 0x6d56, 0x6d55, 0x6d59, 0x4d41, /* 0x8F40 */ 0xf963, 0x6d58, 0x336d, 0x6d57, 0x6d5c, 0x6d5b, 0xf964, 0x6d5a, 0x4532, 0x6d5d, 0x7c50, 0x6d5e, 0xf965, 0x6d5f, 0x396c, 0x3725, 0x6d60, 0x6d61, 0x6d62, /* 0x8F80 */ 0x3f49, 0x6d63, 0x3c2d, 0x6d64, 0x6d65, 0xf967, 0x7c52, 0x5221, 0x517e, 0x6d66, 0x6570, 0x6d67, 0x4324, 0x3f2b, 0x4740, 0xf968, 0x7c53, 0xf96a, 0x6d68, 0x4a55, 0x4454, 0x397e, 0x4329, /* 0x8FC0 */ 0xf96c, 0x312a, 0x4b78, 0x3f57, 0xf96d, 0xf96f, 0xf970, 0x375e, 0x3661, 0xf971, 0x4a56, 0xf972, 0x6d69, 0xf973, 0x6d6b, 0x7c54, 0x6d6a, 0x3260, 0x7c55, 0x4676, 0x6d6c, 0x4777, 0x4533, 0x7c56, 0x6d6d, 0x3d52, 0xf974, 0x6d6f, 0xf975, 0x4c42, 0x6d7e, 0x6d71, 0x6d72, 0xf976, 0x4449, /* 0x9000 */ 0x4260, 0x4177, 0xf977, 0x4628, 0x6d70, 0x3555, 0x7c57, 0x6d79, 0xf978, 0x6d76, 0x6e25, 0x4629, 0x4360, 0x6d73, 0x447e, 0x4553, 0x6d74, 0x6d78, 0x3f60, 0x4767, 0x444c, 0x4042, 0x6d77, 0x422e, 0x4224, 0x6d75, 0x3029, 0x4f22, 0x6d7a, 0x7c58, 0x4261, 0x3d35, 0x3f4a, 0x6d7c, 0x6d7b, 0xf979, 0x306f, 0x6d7d, 0x492f, 0x6e27, /* 0x9040 */ 0x465b, 0x3f6b, 0xf97b, 0xf97c, 0x4359, 0x3678, 0x6e26, 0x4d37, 0x313f, 0x4a57, 0x3261, 0x6e21, 0x6e22, 0x6e23, 0x6e24, 0x463b, 0x4323, 0x3063, 0x6e28, 0x6e29, 0x7423, 0x423d, 0xf97d, 0x6e2a, 0x3173, 0x414c, 0x382f, 0x4d5a, 0x6e2b, 0x452c, 0x4178, 0x3c57, 0x6e2c, 0x6e2f, 0x3d65, 0x6e2d, 0x412b, 0x412a, 0x3064, 0x4e4b, 0x6e31, 0x4872, /* 0x9080 */ 0x6e33, 0x6e32, 0x6e30, 0x6364, 0x3454, 0xfa22, 0x6d6e, 0x7c5a, 0x6e35, 0x6e34, 0xfa23, 0x6e36, 0xfa24, 0x4d38, 0x7c5b, 0x7c5c, 0x7c5d, 0x7c5e, 0xfa26, 0x7c5f, 0x4661, 0x4b2e, 0x6e37, 0x3c59, 0x6e38, 0xfa28, 0x6e39, 0x7c60, 0x6e3a, 0xfa29, 0x4521, 0x7c61, /* 0x90C0 */ 0x306a, 0xfa2a, 0x7c62, 0x7c63, 0x7c64, 0xfa2b, 0x3959, 0x4f3a, 0x7c65, 0x6e3e, 0xfa2d, 0x7c66, 0x7c67, 0xfa2e, 0x3734, 0x6e3b, 0x6e3c, 0x4974, 0xfa33, 0x3354, 0x7c68, 0xfa31, 0x7c69, 0x4d39, 0xfa30, 0x363f, 0x4554, 0xfa34, 0xfa35, /* 0x9100 */ 0xfa32, 0x6e3f, 0xfa36, 0xfa37, 0x6e40, 0x7c6b, 0x7c6c, 0x7c6d, 0xfa38, 0x6e41, 0xfa39, 0xfa3a, 0x7c6e, 0x7c6f, 0x7c70, 0x4522, 0x7c71, 0x6e43, 0x7c72, 0x6e42, 0x7c73, 0xfa3b, 0xfa3c, 0xfa3d, 0x7c74, /* 0x9140 */ 0xfa3e, 0xfa3f, 0x7c75, 0x4653, 0x6e44, 0x3d36, 0x3c60, 0x475b, 0x4371, 0x3c72, 0x3f6c, 0x6e45, 0xfa40, 0x6e46, 0xfa41, 0x7c76, 0xfa42, 0x3f5d, 0x6e47, 0xfa43, 0x6e48, 0x6e49, 0x4d6f, 0x3d37, 0x6e4b, 0x6e4a, 0xfa44, 0x395a, 0x3973, 0x3b40, 0xfa45, /* 0x9180 */ 0x6e4e, 0x7c77, 0xfa46, 0x3d66, 0x6e4d, 0x6e4c, 0x4269, 0xfa47, 0x386f, 0x4043, 0x4830, 0x3d39, 0x7c78, 0x6e4f, 0x3e5f, 0xfa48, 0x6e52, 0x6e50, 0x7c79, 0xfa49, 0x6e51, 0x7c7a, 0xfa4a, 0x6e54, 0x6e53, 0xfa4b, 0x3e7a, 0x6e55, 0x7c7b, /* 0x91C0 */ 0x6e56, 0x6e57, 0xfa4c, 0xfa4d, 0x4850, 0x3a53, 0x3c61, 0x6e58, 0x6e59, 0x4e24, 0x3d45, 0x4c6e, 0x4e4c, 0x6e5a, 0x3662, 0x6e5b, 0x7c7c, 0x4523, 0xfa4e, 0x6e5e, 0x3378, 0x3f4b, 0x6e5c, 0x6e5d, 0x4460, 0x7c7e, 0x7d21, 0x4b55, 0x367c, 0xfa51, 0x7d22, 0xfa52, 0x7d23, 0x6e60, 0x6e61, 0x7c7d, 0x6e5f, 0x6e63, /* 0x9200 */ 0xfa53, 0x7d24, 0xfa54, 0x465f, 0x3343, 0x7d25, 0x6e67, 0x6e64, 0x6e66, 0xfa55, 0xfa56, 0x6e62, 0x6f4f, 0x6e65, 0xfa58, 0x4e6b, 0x385a, 0x7d26, 0x7d27, 0x7d28, 0x7d29, 0x6e6f, /* 0x9240 */ 0x7d2a, 0xfa59, 0x7d2b, 0x4534, 0x6e6a, 0xfa5a, 0x6e6d, 0x6e6b, 0xfa5b, 0x6e70, 0xfa5c, 0x7d2c, 0x6e71, 0xfa5d, 0xfa5e, 0x6e69, 0xfa5f, 0x6e76, 0x3174, 0x6e68, 0xfa60, 0xfa61, 0x482d, 0x6e6c, 0xfa62, 0x3e60, 0xfa63, 0xfa64, 0x395b, 0x7d2d, 0xfa67, 0xfa68, 0x4b48, 0xfa69, /* 0x9280 */ 0x3664, 0x3d46, 0x463c, 0x7d2e, 0xfa6a, 0xfa6b, 0x412d, 0x6e74, 0x6e6e, 0x6e73, 0xfa6c, 0x4c43, 0xfa6d, 0x4438, 0x6e75, 0x6e72, 0xfa6e, 0xfa6f, 0xfa70, 0x412c, 0xfa73, 0x6e79, 0x6e78, 0xfa74, /* 0x92C0 */ 0xfa75, 0x7d2f, 0xfa76, 0x7d30, 0x7d31, 0xfa77, 0x6e77, 0xfa78, 0x4b2f, 0x7d32, 0xfa79, 0xfa7a, 0x7d33, 0x3d7b, 0xfa7b, 0xfa7c, 0x6e7a, 0x4a5f, 0x3154, 0x4946, 0x4372, 0xfb22, 0x3578, 0xfb23, 0x6e7c, 0xfb24, 0x395d, 0x7d34, /* 0x9300 */ 0xfb25, 0x7d35, 0x3b2c, 0xfb26, 0x6e7b, 0x3f6d, 0xfa7d, 0xfb27, 0x3f6e, 0x6f21, 0x6f23, 0xfb28, 0xfb29, 0x7d36, 0x3e7b, 0x7d37, 0x6f22, 0x6f24, 0x7d38, 0x3653, 0xfb2a, 0x4945, 0xfb2b, 0x3c62, 0x4f23, 0x6e7e, 0x3a78, 0x4f3f, 0x6f26, 0x6f25, 0x6f27, /* 0x9340 */ 0x6e7d, 0xfb2e, 0x7d39, 0x7d3a, 0x7d3b, 0x4669, 0x4555, 0xfb2f, 0x4457, 0x6f2c, 0xfb30, 0xfb31, 0x4343, 0x6f28, 0x6f29, 0x7d3c, 0x7d3d, 0x7d3e, 0xfb32, 0x372d, 0x6f2b, 0x7d3f, 0xfb33, 0xfb34, 0x3830, 0x6f2a, 0x3e61, /* 0x9380 */ 0xfb38, 0xfb39, 0x3379, 0xfb3a, 0x6f30, 0x3a3f, 0x4179, 0x444a, 0x7d40, 0xfb3b, 0xfb35, 0x7d41, 0x333b, 0x6f2e, 0x6f2f, 0x4443, 0x6f2d, 0x6f31, 0x7d42, /* 0x93C0 */ 0xfb40, 0x6f37, 0x7d43, 0xfb41, 0x6f3a, 0x6f39, 0x452d, 0x6f32, 0x6f33, 0x6f36, 0xfb42, 0x6f38, 0x7d44, 0x7d45, 0x3640, 0xfb43, 0x6f3b, 0x6f35, 0xfb44, 0x6f34, 0xfb3f, 0xfb3c, 0xfb49, 0x7d47, /* 0x9400 */ 0x6f3f, 0x7d46, 0x6f40, 0xfb45, 0xfb46, 0x6f41, 0x6f3e, 0x6f3d, 0xfb47, 0xfb48, 0x3e62, 0x462a, 0x6f3c, 0x6f45, 0x6f43, 0xfb4a, 0x7d48, 0xfb4b, 0x6f44, 0x6f42, 0x4278, 0x6f46, 0xfb4c, /* 0x9440 */ 0x6f47, 0x6f49, 0xfb4d, 0x7d49, 0x3455, 0x6f48, 0x4c7a, 0x6f54, 0x6f4a, 0x6f4d, 0x6f4b, 0x6f4c, 0x7d4a, 0x6f4e, 0x7d4b, 0xfb50, 0xfb51, 0x6f50, 0x7d4c, 0x7d4d, 0x6f51, 0x6f52, 0x6f55, 0x6f53, 0x6f56, 0x6f58, /* 0x9480 */ 0x6f57, /* 0x9540 */ 0x4439, 0xfb52, 0xfb53, /* 0x9580 */ 0x4c67, 0x6f59, 0x412e, 0xfb54, 0x6f5a, 0x4a44, 0x6f5b, 0x332b, 0xfb55, 0xfb56, 0x7d4e, 0x313c, 0x3457, 0x3456, 0x6f5c, 0x6f5d, 0x6f5e, 0x6f5f, 0x7d4f, 0x6f60, 0x3458, 0x3355, 0x395e, 0x4836, 0x7d50, 0x6f62, 0x6f61, 0x7d51, 0xfb58, 0x7d52, 0x6f63, 0x315c, 0xfb59, 0x7d53, 0x6f66, 0x6f65, 0x6f64, 0x7d54, 0x6f67, /* 0x95C0 */ 0x6f6a, 0x3047, 0xfb5b, 0x6f68, 0x7d55, 0x6f6c, 0x6f6b, 0x7d56, 0x7d57, 0x6f6e, 0x6f6d, 0x6f6f, 0x462e, 0x7d59, 0x6f70, 0x7d5a, 0x6f71, 0x6f73, 0x6f72, /* 0x9600 */ 0x496c, 0xfa25, 0x6f74, 0x6f75, 0x3a65, 0xfb5e, 0x6f76, 0x6f77, 0x4b49, 0xfb5f, 0xfb60, 0x414b, 0xfb62, 0x3024, /* 0x9640 */ 0x424b, 0xfb63, 0x6f78, 0x496d, 0x6f7b, 0x6f79, 0x395f, 0x6f7a, 0x3842, 0x7d5b, 0x4a45, 0x6f7d, 0x7021, 0x6f7e, 0x7022, 0xfb64, 0x3121, 0x3f58, 0x3d7c, 0x3459, 0x7023, 0x4766, 0x7025, 0x3122, 0x7024, 0x4444, 0x4e4d, 0x462b, 0x6f7c, 0x4e26, 0x3831, 0x4d5b, /* 0x9680 */ 0xfb66, 0x7d5c, 0x3679, 0x4e34, 0x3728, 0x4262, 0x6721, 0x7026, 0x332c, 0x3f6f, 0x3356, 0x7028, 0x7029, 0x7027, 0x3764, 0xfb68, 0x3a5d, 0x3e63, 0x7d5e, 0x3123, 0x4e59, 0x7d5f, 0x7d60, 0x702b, 0x6e2e, 0xfb6b, 0x702a, 0xfb6c, 0x702e, 0x702c, 0x702d, 0xfb6d, 0x702f, 0x7030, 0x4e6c, 0x7031, 0x7032, 0xfb6e, 0x4049, 0x483b, 0xfb6f, /* 0x96C0 */ 0x3f7d, 0x3467, 0x4d3a, 0x326d, 0x3d38, 0x385b, 0x7035, 0x7034, 0x3b73, 0x7036, 0x7033, 0x3b28, 0x7d61, 0x703a, 0x6a2d, 0xfb72, 0x5256, 0xfb73, 0x3f77, 0x7038, 0xfb74, 0x7d62, 0x4e25, 0x4671, 0x312b, 0x7d64, 0x4063, 0x3c36, 0x7d65, 0x4a37, 0x3140, 0x4e6d, 0x4d6b, 0x703b, 0x4545, /* 0x9700 */ 0x3c7b, 0x703c, 0x703d, 0x3f4c, 0x703e, 0x4e6e, 0x7039, 0x7040, 0x7042, 0x7041, 0x703f, 0xfb76, 0x7043, 0x7044, 0x417a, 0x3262, 0xfb77, 0x7045, 0x4c38, 0x7046, 0x7047, 0x4f2a, 0x7d66, 0xfb79, 0x5b31, 0x7048, 0x7d67, 0x7049, 0x704a, /* 0x9740 */ 0xfb7a, 0x704e, 0x704b, 0x704c, 0xfb7b, 0x704d, 0x704f, 0x7d68, 0x7d69, 0x7d6a, 0x4044, 0xfb7c, 0x4c77, 0xfb7d, 0x4045, 0x7d6b, 0xfb7e, 0x7050, 0x4873, 0x7051, 0x7353, 0x4c4c, 0x7052, 0x7053, 0x7054, 0x3357, 0xfc21, 0x7056, 0x3f59, 0x7d6c, 0x7057, 0x7d6d, 0x3724, 0x7058, 0x705c, 0x705a, /* 0x9780 */ 0x705b, 0x3373, 0x7059, 0x705d, 0x705e, 0x3048, 0x705f, 0x7060, 0x7d6e, 0xfc24, 0x3e64, 0xfc25, 0x7061, 0xfc26, 0x3547, 0xfc27, 0x7064, 0x7063, 0x7062, 0x6b71, 0x4a5c, 0x7d6f, 0xfc28, 0xfc29, 0x7065, 0x7066, 0x7d70, 0xfc2a, /* 0x97C0 */ 0x7d71, 0x7067, 0x7068, 0x7069, 0x7d72, 0x706a, 0xfc2b, 0xfc2c, 0x345a, 0xfc2d, 0xfc2e, 0xfc2f, 0x7d74, 0x706b, 0x7d73, 0xfc30, 0x706c, 0x4723, 0xfc31, 0x706e, 0x323b, 0x7d75, 0x7071, 0x7070, 0x3124, 0x3641, /* 0x9800 */ 0x4a47, 0x443a, 0x3a22, 0xfc32, 0x3960, 0x3d67, 0x3f5c, 0x7d77, 0x7073, 0xfc33, 0xfc34, 0x7072, 0x4d42, 0x3468, 0x4852, 0x465c, 0xfc35, 0xfc36, 0x3f7c, 0x4e4e, 0x375b, 0x7d78, 0x7076, 0xfc39, 0x7075, 0xfc3c, 0x7d79, 0x4b4b, 0x462c, 0x7d7a, 0xfc3a, 0xfc3b, 0x3150, 0x7077, 0x7074, 0x4951, 0x4d6a, 0x7078, /* 0x9840 */ 0x7079, 0xfc3d, 0x707b, 0x426a, 0x335b, 0x335c, 0x707a, 0x7d7c, 0x7d7d, 0x3469, 0x3832, 0x7d7e, 0x7e21, 0x346a, 0x7e22, 0x7e23, 0x453f, 0x4e60, 0x7e25, 0xfc3e, 0x385c, 0x707c, 0x7e26, 0x707d, 0x707e, 0x7121, 0x7123, 0x7122, /* 0x9880 */ 0x4977, 0x7124, 0xfc3f, 0xfc40, 0x7125, 0xfc41, 0x7126, 0x7127, 0xfc43, 0xfc44, 0x7e27, 0xfc45, 0xfc46, 0xfc47, /* 0x98C0 */ 0xfc48, 0x7129, 0x7128, 0x712a, 0xfc49, 0x7e28, 0xfc4a, 0x4874, 0x664c, 0x3f29, 0xfc4b, 0xfc4d, 0x3532, 0xfc4e, 0xfc4f, 0x7e29, 0x712b, 0xfc50, 0x712c, 0x522c, 0x5d3b, 0x4853, 0xfc51, 0xfc52, 0x307b, 0xfc53, 0x303b, 0x3b74, 0x4b30, 0x3e7e, /* 0x9900 */ 0x712d, 0x4c5f, 0xfc54, 0x712e, 0x4d5c, 0x3142, 0x3b41, 0x712f, 0x326e, 0x7130, 0xfc57, 0xfc58, 0x7131, 0xfc5a, 0xfc5b, 0xfc5c, 0x7133, 0x7134, 0x7136, 0x7132, 0x7135, 0x345b, 0x7137, 0x7138, 0xfc5e, 0xfc5f, 0xfc60, 0xfc61, 0xfc62, 0xfc63, 0x7139, 0x713a, /* 0x9940 */ 0xfc64, 0xfc65, 0x713b, 0x713d, 0xfc66, 0x713c, 0x713f, 0x7142, 0xfc67, 0xfc68, 0x713e, 0x7140, 0x7141, 0x7143, 0x3642, 0x7e2a, 0xfc69, 0xfc6a, 0xfc6b, /* 0x9980 */ 0x3c73, 0x7144, 0x7145, 0x3961, 0x7e2b, 0xfc6c, 0x7146, 0xfc6d, 0x333e, 0x474f, 0x7147, 0x7148, 0x435a, 0x466b, 0xfc6e, 0x7149, 0xfc6f, 0xfc70, /* 0x99C0 */ 0x477d, 0xfc71, 0x424c, 0x3158, 0x366e, 0x366f, 0xfc72, 0x4373, 0x714e, 0x3670, 0xfc73, 0x326f, 0x714d, 0xfc74, 0x714b, 0x714c, 0xfc75, 0x714a, 0x7158, 0x714f, 0x7150, 0xfc77, 0x7151, 0x7152, 0x7154, 0xfc78, 0x7153, 0xfc79, 0x3d59, /* 0x9A00 */ 0x7155, 0x7e2c, 0x7e2d, 0x7157, 0xfc7a, 0x3533, 0x7156, 0xfc7b, 0x417b, 0x3833, 0xfc7c, 0x7159, 0xfc7d, 0xfc7e, 0x7e2e, 0x424d, 0x715a, 0x7e2f, 0x7e30, 0x462d, 0xfd21, 0xfd22, 0x715b, 0x7e31, 0x7160, /* 0x9A40 */ 0x715e, 0x715d, 0x715f, 0xfd23, 0x715c, 0x7e32, 0xfd24, 0x7162, 0x7e33, 0x7e34, 0x7161, 0x7164, 0xfd25, 0x3643, 0x7163, 0x7165, 0x7166, 0x7168, 0x7167, 0x7169, 0x716b, 0x716a, /* 0x9A80 */ 0x397c, 0x716c, 0xfd27, 0x716d, 0x7e35, 0xfd29, 0x333c, 0xfd2b, 0x716e, /* 0x9AC0 */ 0x716f, 0x7e36, 0x7e37, 0x3f71, 0xfd2d, 0x7e38, 0x7170, 0xfd2e, 0x7171, 0xfd2f, 0x7172, 0x7173, 0xfd30, 0x7e39, 0x3962, 0xfd32, 0x7174, 0x7175, 0xfd33, 0x7176, 0x7177, 0xfd34, 0x7178, 0xfd35, 0x4831, 0x717a, 0x4926, 0x717b, 0x7179, 0x717d, 0x717c, 0x717e, 0x7e3a, 0x7221, /* 0x9B00 */ 0x7e3b, 0xfd36, 0x7222, 0x7e3c, 0xfd37, 0xfd38, 0xfd39, 0xfd3a, 0x7223, 0x7224, 0xfd3b, 0x7225, 0x7e3d, 0x7226, 0x7227, 0x7228, 0x7229, 0x722a, 0x722b, 0x722c, 0xfd3c, 0x7e3f, 0x722d, 0x722e, 0x5d35, 0x722f, 0xfd3d, 0x6478, 0x3534, 0xfd3e, /* 0x9B40 */ 0x3321, 0x3a32, 0x7231, 0x7230, 0x4c25, 0xfd40, 0x7233, 0x7234, 0x7232, 0x7235, 0x4b62, 0x7236, 0x357b, 0x7e40, 0xfd41, 0xfd42, 0x7e42, 0xfd43, 0xfd44, 0x4f25, 0x7e43, 0xfd45, 0x7237, 0x7e44, 0xfd46, 0xfd47, 0x7e41, /* 0x9B80 */ 0x7239, 0x7e45, 0x7e46, 0x303e, 0x7e47, 0x723a, 0x4a2b, 0x7238, 0x723b, 0x723c, 0x7e48, 0x723d, 0x723e, 0xfd48, 0x7e49, 0x723f, 0x4b6e, 0x3b2d, 0xfd49, 0x3a7a, 0x412f, 0xfd4a, 0xfd4d, 0x7240, 0xfd4e, 0x7243, 0xfd4f, /* 0x9BC0 */ 0x7241, 0x7e4a, 0x7244, 0xfd50, 0x3871, 0x7242, 0x7e4b, 0x7245, 0x7246, 0x7247, 0x724b, 0x3b2a, 0xfd52, 0x4264, 0xfd53, 0x724c, 0x7249, 0x7248, 0x724a, 0x7e4c, 0xfd54, 0x375f, 0xfd55, 0xfd56, 0xfd58, 0xfd57, 0x7250, 0x724f, 0x724e, 0xfd51, 0x3033, 0xfd5c, 0x7e4d, 0xfd5a, 0x7e4e, /* 0x9C00 */ 0x7e4f, 0x725a, 0x7256, 0x7257, 0x7253, 0x7259, 0x7255, 0x3362, 0x4f4c, 0x7258, 0x7254, 0x7252, 0x7251, 0xfd5e, 0xfd5f, 0xfd60, 0xfd61, 0x725c, 0xfd62, 0x725f, 0xfd63, 0x7e50, 0x725e, 0x725d, 0xfd64, 0xfd65, 0xfd66, 0x4949, 0x725b, 0x3073, 0x7260, 0xfd68, 0x7262, 0xfd69, 0xfd6a, 0x336f, 0x724d, 0x3137, 0x7264, /* 0x9C40 */ 0x7e51, 0xfd6b, 0x7263, 0x7261, 0x432d, 0xfd6e, 0xfd6f, 0x7e52, 0x7e53, 0x4b70, 0x7e54, 0xfd71, 0x4e5a, 0xfd72, 0x7265, 0xfd73, 0xfd6c, 0xfd74, 0xfd75, 0x7266, 0x7e55, 0x7e56, 0x7267, 0xfd76, 0xfd77, 0xfd78, 0xfd79, 0xfd7a, 0xfd7b, 0xfd7c, 0xfd7d, 0x7268, 0x7e57, 0x7269, 0xfd7e, /* 0x9CC0 */ 0x443b, 0xfe21, 0x726a, 0x4837, 0x726f, 0x726b, 0x726c, 0xfe22, 0x4b31, 0x4c44, 0x4650, /* 0x9D00 */ 0xfe24, 0x7270, 0x7271, 0x463e, 0x726e, 0x726d, 0xfe23, 0x322a, 0xfe26, 0x7279, 0x7278, 0xfe27, 0xfe28, 0x3175, 0x7e58, 0x7e59, 0x7276, 0x7275, 0x7273, 0x337b, 0x7272, 0x3c32, 0x3229, 0xfe2c, 0x3963, 0x727c, 0x727b, /* 0x9D40 */ 0x727a, 0xfe2e, 0x7e5a, 0x7277, 0x727d, 0x7e5b, 0x727e, 0xfe2f, 0x7325, 0x7324, 0x7e5c, 0x7326, 0x312d, 0x7321, 0x7322, 0xfe30, 0x3974, 0x4c39, 0xfe31, 0x7e5d, 0x7323, 0xfe33, 0xfe34, 0x4b32, 0x732b, 0x7e5e, 0x7327, 0xfe36, 0xfe37, 0xfe38, 0x732c, 0x7e5f, 0xfe39, /* 0x9D80 */ 0xfe3a, 0x7329, 0x7328, 0x7e60, 0xfe3b, 0x375c, 0x7e61, 0xfe3c, 0x732d, 0xfe3d, 0x732e, 0x732f, 0x732a, 0x7e63, 0x7274, 0x7330, 0x4461, 0xfe3f, 0x7334, 0xfe40, 0x7335, 0x7333, 0x7e64, 0xfe41, 0xfe3e, /* 0x9DC0 */ 0x7e62, 0x7332, 0x7338, 0xfe42, 0x7331, 0x7336, 0xfe43, 0xfe44, 0x7337, 0x733a, 0xfe45, 0x7e65, 0x7339, 0xfe46, 0xfe47, 0xfe48, 0xfe49, 0x733c, 0x7e67, 0x733d, 0x733e, 0x4f49, 0xfe4a, 0x733b, 0x426b, 0x3a6d, 0x733f, /* 0x9E00 */ 0xfe4d, 0x7e68, 0xfe4c, 0xfe4e, 0x7e69, 0xfe4f, 0x7340, 0x7341, 0xfe50, 0xfe51, 0x7342, /* 0x9E40 */ 0x7343, 0x3834, 0x7344, 0xfe52, 0x7e6a, 0x7345, 0x3c2f, /* 0x9E80 */ 0xfe54, 0x7346, 0xfe55, 0x7347, 0x7348, 0x7349, 0x734c, 0x734a, 0x4f3c, 0x734b, 0x4e6f, 0xfe56, 0x734d, 0x7e6b, 0x4e5b, 0x7e6c, 0x734e, 0x477e, 0xfe57, 0x734f, 0x7351, 0x7e6d, 0x7352, 0x7e6e, 0x7e6f, 0x7e70, 0x7350, 0x396d, 0x4c4d, 0x4b63, 0x5677, 0xfe59, 0x5d60, 0x4b7b, /* 0x9EC0 */ 0x7e71, 0x322b, 0x7354, 0x3550, 0x7355, 0x7356, 0x7357, 0x7e72, 0x3975, 0x7358, 0x6054, 0x4c5b, 0x4263, 0x7359, 0x735b, 0x735a, 0xfe5b, 0x735c, 0x735d, 0xfe5c, 0x735e, 0xfe5d, 0x735f, 0x7360, 0x7361, 0x7362, 0x7363, 0x7364, 0x7365, 0x7366, 0xfe5e, /* 0x9F00 */ 0xfe5f, 0xfe61, 0x7367, 0x7368, 0x4524, 0x7e73, 0x385d, 0x736a, 0xfe62, 0xfe63, 0x414d, 0x736b, 0x736c, 0xfe64, 0xfe65, 0x7e74, 0xfe66, 0x4921, 0xfe67, 0x736d, /* 0x9F40 */ 0xfe68, 0xfe69, 0xfe6a, 0x736e, 0x6337, 0x6c5a, 0x706d, 0x736f, 0xfe6b, 0x7370, 0xfe6c, 0x7e75, 0xfe6d, 0xfe6f, 0x7372, 0x7373, 0x7374, 0x4e70, 0x7371, 0x7375, 0x7376, 0xfe71, 0x7378, 0x7377, 0xfe73, 0xfe74, 0x737a, 0xfe75, 0x737b, 0x7379, /* 0x9F80 */ 0x4e36, 0x7e76, 0x7e77, 0x737c, 0x7e78, 0x737d, 0x6354, 0x737e, 0x7e79, /* 0xF900 */ 0x763b, 0x742e, 0x754e, 0x7b4f, /* 0xF940 */ 0x7649, /* 0xF9C0 */ 0x7e24, 0x7d5d, /* 0xFA00 */ 0x2f4b, 0x2f57, 0x4f72, 0xae79, 0x757a, 0x775a, 0x776f, 0x793c, 0x793d, 0x7941, 0x7b3a, 0xf738, 0xf745, 0x7c2e, 0xf96e, 0x7c6a, 0x2e38, 0x2e49, 0x2e50, 0x2e63, 0x2e68, 0x2e6e, 0x2f2c, 0x2f2f, 0x2f36, 0x2f5a, 0x2f5e, 0x4f61, 0x4f62, 0x7450, 0x745c, 0x745e, /* 0xFA40 */ 0x7461, 0x7528, 0x752b, 0x7543, 0x7565, 0x7669, 0x7677, 0x7725, 0x7755, 0xf029, 0x7825, 0x7927, 0x7933, 0x7934, 0x7937, 0x7938, 0x7939, 0x793b, 0x793f, 0x7940, 0x794d, 0x7951, 0x7964, 0x7a2e, 0xf450, 0x7a33, 0x7a3a, 0x7a44, 0x7a58, 0xf574, 0xf575, 0x7b27, 0x7b6f, 0x7b79, 0x7c2f, 0x7c30, 0x7c38, 0x7c3d, 0xf969, 0x7c59, 0x7d63, 0x7d76, 0x7d7b, /* 0xFE40 */ 0x233e, 0x233d, /* 0xFF00 */ 0x212a, 0x2230, 0x2174, 0x2170, 0x2173, 0x2175, 0x222f, 0x214a, 0x214b, 0x2176, 0x215c, 0x2124, 0x2231, 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, /* 0xFF40 */ 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, 0x2232, 0x2256, 0x2257, /* 0xFFC0 */ 0x2131, 0x216f, /* 0x20000 */ 0x2e22, /* 0x20080 */ 0xa121, 0xa12b, 0xa12e, /* 0x20180 */ 0xa136, /* 0x20200 */ 0xa146, /* 0x20300 */ 0xa170, /* 0x20340 */ 0xa179, /* 0x20380 */ 0xa177, /* 0x203C0 */ 0xa322, /* 0x20440 */ 0xa325, /* 0x20500 */ 0xa327, /* 0x205C0 */ 0xa331, /* 0x20600 */ 0xa332, /* 0x20740 */ 0xa338, /* 0x20800 */ 0xa33f, 0xa341, /* 0x20880 */ 0xa34a, /* 0x20940 */ 0xa352, /* 0x20980 */ 0xa353, /* 0x20AC0 */ 0xa359, /* 0x20B00 */ 0xa35c, /* 0x20B80 */ 0x4f54, /* 0x20D40 */ 0xa377, /* 0x20DC0 */ 0xa42a, /* 0x20E40 */ 0xa43a, 0xa432, /* 0x20E80 */ 0xa431, /* 0x20F40 */ 0xa43d, /* 0x21200 */ 0xa459, 0x2f42, /* 0x21240 */ 0xa45c, 0xa463, 0xa45e, /* 0x212C0 */ 0xa46b, 0xa46a, 0xa472, /* 0x21300 */ 0x2f4c, 0xa474, /* 0x21340 */ 0xa475, /* 0x213C0 */ 0xa525, /* 0x21440 */ 0xa532, 0x2f60, /* 0x215C0 */ 0xa53e, /* 0x21640 */ 0xa547, /* 0x21680 */ 0x4f63, /* 0x21700 */ 0xa555, /* 0x21740 */ 0xa556, /* 0x21880 */ 0x2f7b, /* 0x219C0 */ 0xa57e, /* 0x21C40 */ 0xa830, /* 0x21D00 */ 0xa837, /* 0x21D40 */ 0xa838, 0xa83b, 0xa83a, /* 0x21D80 */ 0xa845, 0xa840, 0xa83f, 0xa848, /* 0x21DC0 */ 0xa84a, /* 0x21E00 */ 0xa84b, 0x4f6e, /* 0x21F00 */ 0xa85b, /* 0x21F40 */ 0xa866, /* 0x21FC0 */ 0xa86c, /* 0x22140 */ 0xac22, /* 0x22200 */ 0xfe53, /* 0x22300 */ 0xac2b, /* 0x22380 */ 0xac30, /* 0x226C0 */ 0xac50, /* 0x22840 */ 0xac65, /* 0x22880 */ 0xac6d, /* 0x22980 */ 0xac72, /* 0x22A80 */ 0xad24, /* 0x22B40 */ 0xad32, 0xad29, 0xad2a, /* 0x22B80 */ 0xad35, /* 0x22C00 */ 0xad34, 0xad39, /* 0x22DC0 */ 0xad56, /* 0x23180 */ 0xae24, /* 0x231C0 */ 0xad7d, 0x753a, 0xae23, /* 0x23340 */ 0xae3a, /* 0x233C0 */ 0xae42, 0xae3d, 0xae3c, 0xae44, 0xae47, 0xae49, 0xae43, /* 0x23440 */ 0xae55, 0xae57, 0xae56, 0xae5b, /* 0x234C0 */ 0xae77, /* 0x23540 */ 0xae78, /* 0x23580 */ 0xaf2a, /* 0x235C0 */ 0x7572, /* 0x23600 */ 0xaf42, 0xaf3f, 0xaf43, /* 0x23640 */ 0xaf40, /* 0x23700 */ 0xaf59, 0xaf4e, 0x7629, /* 0x23740 */ 0x7632, 0xaf61, /* 0x237C0 */ 0xaf6a, 0xaf69, /* 0x23800 */ 0xaf70, 0xaf75, /* 0x23A80 */ 0xee23, /* 0x23C40 */ 0xee34, /* 0x23CC0 */ 0x7660, /* 0x23D00 */ 0xee49, 0xf475, /* 0x23D40 */ 0xee5c, /* 0x23DC0 */ 0xee60, 0xee5f, 0xee5e, /* 0x23F40 */ 0xef32, /* 0x24080 */ 0xef47, /* 0x24100 */ 0xef4d, /* 0x241C0 */ 0xef61, 0xef64, /* 0x24380 */ 0xf022, /* 0x24600 */ 0xf033, /* 0x24680 */ 0xf039, /* 0x247C0 */ 0x776c, /* 0x24880 */ 0xf053, /* 0x24A40 */ 0xf07b, /* 0x24B40 */ 0xf12e, 0xf130, /* 0x24C00 */ 0xf135, /* 0x24D00 */ 0xf144, /* 0x24E00 */ 0xf15d, 0xf161, /* 0x24E40 */ 0xf166, /* 0x24E80 */ 0xf169, /* 0x25040 */ 0xf175, 0xf177, /* 0x25100 */ 0xf17a, /* 0x25180 */ 0xf221, /* 0x251C0 */ 0xf224, 0xf223, /* 0x25200 */ 0xf228, /* 0x25240 */ 0xf22c, /* 0x25400 */ 0xf23d, /* 0x25480 */ 0x787e, /* 0x254C0 */ 0xf248, /* 0x25500 */ 0x7929, /* 0x25580 */ 0xf25b, /* 0x25740 */ 0x7947, /* 0x25780 */ 0xf275, 0xf276, /* 0x259C0 */ 0x7954, 0xf332, /* 0x25AC0 */ 0xf33e, 0xf33d, 0xf340, /* 0x25B80 */ 0xf352, /* 0x25C40 */ 0xf35d, 0xf35e, /* 0x25D80 */ 0x796e, /* 0x25E00 */ 0xf373, /* 0x25E40 */ 0xf374, 0xf377, 0xf375, /* 0x25EC0 */ 0xf37d, 0xf37b, 0xf422, /* 0x25F00 */ 0xf424, /* 0x25F40 */ 0xf427, /* 0x25FC0 */ 0xf42f, 0xf42e, 0xf435, /* 0x26000 */ 0xf434, 0xf43d, /* 0x26040 */ 0xf442, /* 0x260C0 */ 0xf44f, /* 0x26240 */ 0xf469, /* 0x26280 */ 0xf46b, /* 0x26340 */ 0xf472, /* 0x26400 */ 0xf479, /* 0x26640 */ 0xf535, /* 0x26680 */ 0xf53a, /* 0x26700 */ 0xf546, /* 0x268C0 */ 0xf556, 0xf558, /* 0x26940 */ 0xf55a, 0xf55d, /* 0x269C0 */ 0xf55f, /* 0x26A00 */ 0xf563, /* 0x26A40 */ 0xf56a, /* 0x26A80 */ 0xf570, 0xf573, /* 0x26AC0 */ 0x7a5d, /* 0x26C00 */ 0xa544, /* 0x26C40 */ 0xf644, /* 0x26CC0 */ 0xf64e, /* 0x26E40 */ 0x7b33, 0xf65d, /* 0x26F80 */ 0xf675, /* 0x26FC0 */ 0xf721, 0xf722, 0xf67e, /* 0x270C0 */ 0x7b49, /* 0x27100 */ 0xf733, 0xf736, /* 0x273C0 */ 0xf765, 0xf764, 0xf76b, /* 0x27400 */ 0xf76e, /* 0x27440 */ 0xf773, /* 0x27600 */ 0xf82a, 0xf829, 0xf82c, /* 0x27680 */ 0x7b6c, 0xf834, /* 0x27700 */ 0xf83c, 0xf83e, /* 0x27740 */ 0xf842, /* 0x27980 */ 0xf856, /* 0x27A80 */ 0xf863, /* 0x27B80 */ 0xf877, 0xf879, /* 0x27BC0 */ 0xf87a, /* 0x27C80 */ 0xf925, /* 0x27D80 */ 0xf92f, /* 0x27E00 */ 0xf932, /* 0x27F80 */ 0xf939, /* 0x28080 */ 0xf942, 0xf948, /* 0x28240 */ 0x7c49, /* 0x28280 */ 0xf959, /* 0x282C0 */ 0xf95e, /* 0x283C0 */ 0x7c51, /* 0x28400 */ 0xf966, /* 0x28440 */ 0xf96b, /* 0x28540 */ 0xf97a, /* 0x285C0 */ 0xf97e, 0xfa21, /* 0x286C0 */ 0xfa2c, 0xfa2f, /* 0x28940 */ 0xfa50, 0xfa4f, 0xfa57, /* 0x28980 */ 0xfa65, 0xfa66, 0xfa71, 0xfa72, /* 0x28A00 */ 0xfa7e, 0xfb21, /* 0x28A40 */ 0xfb2d, 0xfb2c, /* 0x28A80 */ 0xfb36, /* 0x28AC0 */ 0xfb37, 0xfb3e, 0xfb3d, /* 0x28BC0 */ 0xfb4e, 0xfb4f, /* 0x28D00 */ 0xfb57, /* 0x28D40 */ 0xfb5a, /* 0x28DC0 */ 0xfb5c, /* 0x28E00 */ 0xfb5d, 0xfb61, /* 0x28E80 */ 0xfb65, /* 0x28EC0 */ 0xfb67, /* 0x28F00 */ 0xfb69, /* 0x28FC0 */ 0xfb71, /* 0x29280 */ 0xfc22, 0xfc23, /* 0x29480 */ 0xfc38, /* 0x295C0 */ 0xfc42, /* 0x29640 */ 0xfc4c, /* 0x296C0 */ 0xfc56, /* 0x29700 */ 0xfc59, /* 0x29740 */ 0xfc5d, /* 0x298C0 */ 0xfc76, /* 0x29A40 */ 0xfd2c, /* 0x29DC0 */ 0xfd4b, /* 0x29E00 */ 0xfd59, 0xfd4c, /* 0x29E40 */ 0xfd5d, /* 0x29E80 */ 0xfd5b, /* 0x29EC0 */ 0xfd67, 0xfd70, 0xfd6d, /* 0x29FC0 */ 0xfe25, /* 0x2A000 */ 0xfe2b, 0xfe29, /* 0x2A080 */ 0xfe35, /* 0x2A0C0 */ 0xfe32, /* 0x2A180 */ 0x7e66, /* 0x2A380 */ 0xfe58, /* 0x2A400 */ 0xfe5a, /* 0x2A5C0 */ 0xfe6e, /* 0x2A600 */ 0xfe70, 0xfe72, /* 0x2A680 */ 0xfe76, }; static const Summary16 jisx0213_from_ucs_level2_2indx[] = { /* 0x0080 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0xffdf }, { 15, 0xffdf }, /* 0x00C0 */ { 30, 0xffff }, { 46, 0xffff }, { 62, 0xffff }, { 78, 0xffff }, /* 0x0100 */ { 94, 0xf3ff }, { 108, 0x3f0e }, { 117, 0x0cb0 }, { 122, 0x6630 }, /* 0x0140 */ { 128, 0x399e }, { 137, 0xff3f }, { 151, 0xfc3f }, { 163, 0x7e03 }, /* 0x0180 */ { 171, 0x0000 }, { 171, 0x0008 }, { 172, 0x0000 }, { 172, 0x0000 }, /* 0x01C0 */ { 172, 0x6004 }, { 175, 0x1557 }, { 183, 0x0000 }, { 183, 0x2300 }, /* 0x0240 */ { 186, 0x0000 }, { 186, 0xd7ff }, { 200, 0xf1f3 }, { 211, 0x6e2f }, /* 0x0280 */ { 221, 0x7f1e }, { 232, 0x2137 }, { 239, 0x0006 }, { 241, 0x0000 }, /* 0x02C0 */ { 241, 0x1180 }, { 244, 0x6b03 }, { 251, 0x03e0 }, { 256, 0x0000 }, /* 0x0300 */ { 256, 0x995f }, { 266, 0xf700 }, { 273, 0x9631 }, { 280, 0x3e11 }, /* 0x0340 */ { 287, 0x0000 }, { 287, 0x0000 }, { 287, 0x0002 }, { 288, 0x0000 }, /* 0x0380 */ { 288, 0x0000 }, { 288, 0xfffe }, { 303, 0x03fb }, { 312, 0xfffe }, /* 0x03C0 */ { 327, 0x03ff }, { 337, 0x0000 }, { 337, 0x0000 }, { 337, 0x0000 }, /* 0x0400 */ { 337, 0x0002 }, { 338, 0xffff }, { 354, 0xffff }, { 370, 0xffff }, /* 0x0440 */ { 386, 0xffff }, { 402, 0x0002 }, { 403, 0x0000 }, { 403, 0x0000 }, /* 0x1E00 */ { 403, 0x0000 }, { 403, 0x0000 }, { 403, 0x0000 }, { 403, 0xc000 }, /* 0x1F40 */ { 405, 0x0000 }, { 405, 0x0000 }, { 405, 0x0000 }, { 405, 0x000f }, /* 0x2000 */ { 409, 0x0000 }, { 409, 0x3359 }, { 417, 0x0067 }, { 422, 0x980d }, /* 0x2040 */ { 428, 0x0384 }, { 432, 0x0002 }, { 433, 0x0000 }, { 433, 0x0000 }, /* 0x2080 */ { 433, 0x0000 }, { 433, 0x0000 }, { 433, 0x1000 }, { 434, 0x0000 }, /* 0x2100 */ { 434, 0x8008 }, { 436, 0x0048 }, { 438, 0x0882 }, { 441, 0x0020 }, /* 0x2140 */ { 442, 0x0000 }, { 442, 0x0038 }, { 445, 0x0fff }, { 457, 0x0fff }, /* 0x2180 */ { 469, 0x0000 }, { 469, 0x03df }, { 478, 0x0000 }, { 478, 0x0000 }, /* 0x21C0 */ { 478, 0x0010 }, { 479, 0x0014 }, { 481, 0x03c0 }, { 485, 0x0000 }, /* 0x2200 */ { 485, 0x0bad }, { 493, 0xe40c }, { 499, 0x5fe1 }, { 509, 0x2030 }, /* 0x2240 */ { 512, 0x0128 }, { 515, 0x0004 }, { 516, 0x0cc7 }, { 523, 0x00c0 }, /* 0x2280 */ { 525, 0x0cfc }, { 533, 0x00e0 }, { 536, 0x0020 }, { 537, 0x8000 }, /* 0x22C0 */ { 538, 0x0000 }, { 538, 0x0c00 }, { 540, 0x0000 }, { 540, 0x0000 }, /* 0x2300 */ { 540, 0x0060 }, { 542, 0x0104 }, { 544, 0x0000 }, { 544, 0x0000 }, /* 0x2380 */ { 544, 0x0000 }, { 544, 0x0000 }, { 544, 0x0000 }, { 544, 0xc000 }, /* 0x23C0 */ { 546, 0x5fff }, { 560, 0x0000 }, { 560, 0x0000 }, { 560, 0x0000 }, /* 0x2400 */ { 560, 0x0000 }, { 560, 0x0000 }, { 560, 0x0008 }, { 561, 0x0000 }, /* 0x2440 */ { 561, 0x0000 }, { 561, 0x0000 }, { 561, 0xffff }, { 577, 0x000f }, /* 0x24C0 */ { 581, 0x0000 }, { 581, 0xffff }, { 597, 0xfbff }, { 612, 0x7fff }, /* 0x2500 */ { 627, 0x900f }, { 633, 0x3999 }, { 641, 0x9939 }, { 649, 0x9999 }, /* 0x2540 */ { 657, 0x0804 }, { 659, 0x0000 }, { 659, 0x0000 }, { 659, 0x0000 }, /* 0x2580 */ { 659, 0x0000 }, { 659, 0x0000 }, { 659, 0x0003 }, { 661, 0x30ce }, /* 0x25C0 */ { 668, 0xcac3 }, { 676, 0x000f }, { 680, 0x8040 }, { 682, 0x0000 }, /* 0x2600 */ { 682, 0x406f }, { 689, 0x40c0 }, { 692, 0x0000 }, { 692, 0x0000 }, /* 0x2640 */ { 692, 0x0005 }, { 694, 0x0000 }, { 694, 0xffff }, { 710, 0x0000 }, /* 0x2700 */ { 710, 0x0000 }, { 710, 0x0008 }, { 711, 0x0000 }, { 711, 0x0000 }, /* 0x2740 */ { 711, 0x0000 }, { 711, 0x0040 }, { 712, 0x0000 }, { 712, 0xffc0 }, /* 0x2900 */ { 722, 0x0000 }, { 722, 0x0000 }, { 722, 0x0000 }, { 722, 0x0030 }, /* 0x2980 */ { 724, 0x0000 }, { 724, 0x0000 }, { 724, 0x0000 }, { 724, 0x8000 }, /* 0x29C0 */ { 725, 0x0000 }, { 725, 0x0000 }, { 725, 0x0000 }, { 725, 0x0c00 }, /* 0x3000 */ { 727, 0xffef }, { 742, 0xb3ff }, { 755, 0x0001 }, { 756, 0x3838 }, /* 0x3040 */ { 762, 0xfffe }, { 777, 0xffff }, { 793, 0xffff }, { 809, 0xffff }, /* 0x3080 */ { 825, 0xffff }, { 841, 0xf87f }, { 853, 0xffff }, { 869, 0xffff }, /* 0x30C0 */ { 885, 0xffff }, { 901, 0xffff }, { 917, 0xffff }, { 933, 0xffff }, /* 0x31C0 */ { 949, 0x0000 }, { 949, 0x0000 }, { 949, 0x0000 }, { 949, 0xffff }, /* 0x3200 */ { 965, 0x0000 }, { 965, 0x0000 }, { 965, 0x0000 }, { 965, 0x0206 }, /* 0x3240 */ { 968, 0x0000 }, { 968, 0xfffe }, { 983, 0x0000 }, { 983, 0x0000 }, /* 0x3280 */ { 983, 0x0000 }, { 983, 0x0000 }, { 983, 0x01f0 }, { 988, 0xfffe }, /* 0x32C0 */ { 1003, 0x0000 }, { 1003, 0xffff }, { 1019, 0x322f }, { 1027, 0x0400 }, /* 0x3300 */ { 1028, 0x2008 }, { 1030, 0x0110 }, { 1032, 0x08cc }, { 1037, 0x0840 }, /* 0x3340 */ { 1039, 0x2600 }, { 1042, 0x0082 }, { 1044, 0x0000 }, { 1044, 0x7800 }, /* 0x3380 */ { 1048, 0xc000 }, { 1050, 0x7000 }, { 1053, 0x0002 }, { 1054, 0x0000 }, /* 0x33C0 */ { 1054, 0x2810 }, { 1057, 0x0000 }, { 1057, 0x0000 }, { 1057, 0x0000 }, /* 0x3400 */ { 1057, 0x0044 }, { 1059, 0x0000 }, { 1059, 0x5000 }, { 1061, 0x0000 }, /* 0x3440 */ { 1061, 0x0000 }, { 1061, 0x0000 }, { 1061, 0x0500 }, { 1063, 0x0000 }, /* 0x3480 */ { 1063, 0x0000 }, { 1063, 0x0004 }, { 1064, 0x0000 }, { 1064, 0x1020 }, /* 0x34C0 */ { 1066, 0x0082 }, { 1068, 0x0800 }, { 1069, 0x0000 }, { 1069, 0x0000 }, /* 0x3500 */ { 1069, 0x0000 }, { 1069, 0x8000 }, { 1070, 0x0000 }, { 1070, 0x0000 }, /* 0x3540 */ { 1070, 0x0000 }, { 1070, 0x6000 }, { 1072, 0x4008 }, { 1074, 0x0000 }, /* 0x3580 */ { 1074, 0x0000 }, { 1074, 0x0000 }, { 1074, 0x0140 }, { 1076, 0x0000 }, /* 0x35C0 */ { 1076, 0x0020 }, { 1077, 0x0400 }, { 1078, 0x0000 }, { 1078, 0x0010 }, /* 0x3600 */ { 1079, 0x0020 }, { 1080, 0x0000 }, { 1080, 0x0000 }, { 1080, 0x0000 }, /* 0x3640 */ { 1080, 0x0400 }, { 1081, 0x0000 }, { 1081, 0x0000 }, { 1081, 0x0000 }, /* 0x3680 */ { 1081, 0x0000 }, { 1081, 0x0242 }, { 1084, 0x0000 }, { 1084, 0x0000 }, /* 0x36C0 */ { 1084, 0x8000 }, { 1085, 0x0000 }, { 1085, 0x0000 }, { 1085, 0x0000 }, /* 0x3740 */ { 1085, 0x0000 }, { 1085, 0x0000 }, { 1085, 0x1806 }, { 1089, 0x0020 }, /* 0x3780 */ { 1090, 0x2000 }, { 1091, 0x0000 }, { 1091, 0x0000 }, { 1091, 0x0000 }, /* 0x37C0 */ { 1091, 0x0002 }, { 1092, 0x0000 }, { 1092, 0x0104 }, { 1094, 0x2010 }, /* 0x3800 */ { 1096, 0x0001 }, { 1097, 0x0000 }, { 1097, 0x8000 }, { 1098, 0x0040 }, /* 0x3840 */ { 1099, 0x0001 }, { 1100, 0x1000 }, { 1101, 0x0002 }, { 1102, 0x0000 }, /* 0x38C0 */ { 1102, 0x0000 }, { 1102, 0x0000 }, { 1102, 0x0000 }, { 1102, 0x0400 }, /* 0x3900 */ { 1103, 0x0000 }, { 1103, 0x0480 }, { 1105, 0x0000 }, { 1105, 0x0000 }, /* 0x3940 */ { 1105, 0x0000 }, { 1105, 0x0000 }, { 1105, 0x8000 }, { 1106, 0x0000 }, /* 0x3A40 */ { 1106, 0x0000 }, { 1106, 0x0000 }, { 1106, 0x4000 }, { 1107, 0x0008 }, /* 0x3AC0 */ { 1108, 0x0000 }, { 1108, 0x00c0 }, { 1110, 0x0400 }, { 1111, 0x0000 }, /* 0x3B00 */ { 1111, 0x4000 }, { 1112, 0x1400 }, { 1114, 0x0004 }, { 1115, 0x0000 }, /* 0x3B40 */ { 1115, 0x0000 }, { 1115, 0x0000 }, { 1115, 0x2000 }, { 1116, 0x0080 }, /* 0x3B80 */ { 1117, 0x2180 }, { 1120, 0x0000 }, { 1120, 0x0010 }, { 1121, 0x0040 }, /* 0x3BC0 */ { 1122, 0x2008 }, { 1124, 0x0000 }, { 1124, 0x0000 }, { 1124, 0x0001 }, /* 0x3C00 */ { 1125, 0x8000 }, { 1126, 0x0000 }, { 1126, 0x0040 }, { 1127, 0x0000 }, /* 0x3CC0 */ { 1127, 0x0008 }, { 1128, 0x0004 }, { 1129, 0x0000 }, { 1129, 0x0000 }, /* 0x3D00 */ { 1129, 0x0000 }, { 1129, 0x4002 }, { 1131, 0x0000 }, { 1131, 0x0000 }, /* 0x3D40 */ { 1131, 0x0000 }, { 1131, 0x0000 }, { 1131, 0x0010 }, { 1132, 0x0000 }, /* 0x3D80 */ { 1132, 0x0000 }, { 1132, 0x0400 }, { 1133, 0x0000 }, { 1133, 0x0000 }, /* 0x3DC0 */ { 1133, 0x0001 }, { 1134, 0x0010 }, { 1135, 0x0000 }, { 1135, 0x0000 }, /* 0x3E00 */ { 1135, 0x0020 }, { 1136, 0x0000 }, { 1136, 0x0000 }, { 1136, 0x8000 }, /* 0x3E40 */ { 1137, 0x0000 }, { 1137, 0x0000 }, { 1137, 0x0141 }, { 1140, 0x0000 }, /* 0x3E80 */ { 1140, 0x0008 }, { 1141, 0x0010 }, { 1142, 0x0000 }, { 1142, 0x0000 }, /* 0x3F40 */ { 1142, 0x0000 }, { 1142, 0x0080 }, { 1143, 0x0000 }, { 1143, 0x00a4 }, /* 0x3F80 */ { 1146, 0x0000 }, { 1146, 0x0000 }, { 1146, 0x4000 }, { 1147, 0x0000 }, /* 0x3FC0 */ { 1147, 0x0200 }, { 1148, 0x0080 }, { 1149, 0x0000 }, { 1149, 0x0000 }, /* 0x4000 */ { 1149, 0x0000 }, { 1149, 0x0000 }, { 1149, 0x0000 }, { 1149, 0x0200 }, /* 0x4040 */ { 1150, 0x0000 }, { 1150, 0x0100 }, { 1151, 0x0000 }, { 1151, 0x0000 }, /* 0x4080 */ { 1151, 0x0000 }, { 1151, 0x0008 }, { 1152, 0x0000 }, { 1152, 0x0000 }, /* 0x4100 */ { 1152, 0x0020 }, { 1153, 0x0000 }, { 1153, 0x0000 }, { 1153, 0x0000 }, /* 0x4140 */ { 1153, 0x8100 }, { 1155, 0x0000 }, { 1155, 0x0008 }, { 1156, 0x0000 }, /* 0x4180 */ { 1156, 0x0000 }, { 1156, 0x0000 }, { 1156, 0x0000 }, { 1156, 0x8010 }, /* 0x41C0 */ { 1158, 0x0000 }, { 1158, 0x0000 }, { 1158, 0x4040 }, { 1160, 0x0008 }, /* 0x4200 */ { 1161, 0x4080 }, { 1163, 0x0000 }, { 1163, 0x0000 }, { 1163, 0x0000 }, /* 0x4240 */ { 1163, 0x0000 }, { 1163, 0x0000 }, { 1163, 0x0010 }, { 1164, 0x0000 }, /* 0x42C0 */ { 1164, 0x0040 }, { 1165, 0x2040 }, { 1167, 0x0000 }, { 1167, 0x0000 }, /* 0x4300 */ { 1167, 0x0004 }, { 1168, 0x0000 }, { 1168, 0x0800 }, { 1169, 0x0000 }, /* 0x4340 */ { 1169, 0x0008 }, { 1170, 0x0000 }, { 1170, 0x0000 }, { 1170, 0x0000 }, /* 0x43C0 */ { 1170, 0x0000 }, { 1170, 0x0000 }, { 1170, 0x4000 }, { 1171, 0x0001 }, /* 0x4400 */ { 1172, 0x0100 }, { 1173, 0x1080 }, { 1175, 0x0004 }, { 1176, 0x0000 }, /* 0x4440 */ { 1176, 0x0000 }, { 1176, 0x0808 }, { 1178, 0x0000 }, { 1178, 0x0440 }, /* 0x4480 */ { 1180, 0x0000 }, { 1180, 0x0002 }, { 1181, 0x0000 }, { 1181, 0x4008 }, /* 0x44C0 */ { 1183, 0x0000 }, { 1183, 0x0010 }, { 1184, 0x0000 }, { 1184, 0x0000 }, /* 0x4500 */ { 1184, 0x2100 }, { 1186, 0x0000 }, { 1186, 0x0020 }, { 1187, 0x0000 }, /* 0x4540 */ { 1187, 0x0008 }, { 1188, 0x0000 }, { 1188, 0x0000 }, { 1188, 0x0000 }, /* 0x4580 */ { 1188, 0x0000 }, { 1188, 0x2000 }, { 1189, 0x0000 }, { 1189, 0x0100 }, /* 0x45C0 */ { 1190, 0x0000 }, { 1190, 0x0000 }, { 1190, 0x0420 }, { 1192, 0x0000 }, /* 0x4600 */ { 1192, 0x8000 }, { 1193, 0x0000 }, { 1193, 0x0000 }, { 1193, 0x0000 }, /* 0x4640 */ { 1193, 0x0002 }, { 1194, 0x0000 }, { 1194, 0x0020 }, { 1195, 0x0000 }, /* 0x4680 */ { 1195, 0x0000 }, { 1195, 0x0000 }, { 1195, 0x8002 }, { 1197, 0x0000 }, /* 0x4700 */ { 1197, 0x1000 }, { 1198, 0x0000 }, { 1198, 0x0000 }, { 1198, 0x0000 }, /* 0x4740 */ { 1198, 0x0000 }, { 1198, 0x0000 }, { 1198, 0x0010 }, { 1199, 0x0000 }, /* 0x47C0 */ { 1199, 0x0000 }, { 1199, 0x0000 }, { 1199, 0x0000 }, { 1199, 0x2000 }, /* 0x4800 */ { 1200, 0x0000 }, { 1200, 0x0040 }, { 1201, 0x0000 }, { 1201, 0x0000 }, /* 0x4840 */ { 1201, 0x4010 }, { 1203, 0x0000 }, { 1203, 0x0000 }, { 1203, 0x0000 }, /* 0x4880 */ { 1203, 0x0000 }, { 1203, 0x0000 }, { 1203, 0x0000 }, { 1203, 0x0020 }, /* 0x4980 */ { 1204, 0x0000 }, { 1204, 0x0000 }, { 1204, 0x0000 }, { 1204, 0x0001 }, /* 0x49C0 */ { 1205, 0x0000 }, { 1205, 0x0000 }, { 1205, 0x0080 }, { 1206, 0x0400 }, /* 0x4A00 */ { 1207, 0x0010 }, { 1208, 0x0000 }, { 1208, 0x0200 }, { 1209, 0x0000 }, /* 0x4A80 */ { 1209, 0x0000 }, { 1209, 0x0000 }, { 1209, 0x0000 }, { 1209, 0x1000 }, /* 0x4B00 */ { 1210, 0x0000 }, { 1210, 0x0000 }, { 1210, 0x0000 }, { 1210, 0x0800 }, /* 0x4BC0 */ { 1211, 0x0404 }, { 1213, 0x0004 }, { 1214, 0x0100 }, { 1215, 0x0000 }, /* 0x4C00 */ { 1215, 0x0000 }, { 1215, 0x0080 }, { 1216, 0x0001 }, { 1217, 0x0000 }, /* 0x4CC0 */ { 1217, 0x0010 }, { 1218, 0x0002 }, { 1219, 0x0000 }, { 1219, 0x0000 }, /* 0x4D00 */ { 1219, 0x0080 }, { 1220, 0x0000 }, { 1220, 0x0000 }, { 1220, 0x0000 }, /* 0x4D40 */ { 1220, 0x0000 }, { 1220, 0x0000 }, { 1220, 0x0000 }, { 1220, 0x0080 }, /* 0x4E00 */ { 1221, 0xef8f }, { 1233, 0x43f7 }, { 1243, 0xff42 }, { 1253, 0x9b47 }, /* 0x4E40 */ { 1262, 0xe9ad }, { 1272, 0xe7e2 }, { 1282, 0x0204 }, { 1284, 0x400a }, /* 0x4E80 */ { 1287, 0x7f65 }, { 1298, 0xfb36 }, { 1309, 0x7977 }, { 1320, 0x1e49 }, /* 0x4EC0 */ { 1327, 0xeddf }, { 1340, 0xe7f1 }, { 1351, 0x683a }, { 1358, 0xa8e7 }, /* 0x4F00 */ { 1367, 0xee0b }, { 1376, 0x3443 }, { 1382, 0x8000 }, { 1383, 0x75d1 }, /* 0x4F40 */ { 1392, 0xe3c8 }, { 1400, 0xfffb }, { 1415, 0x9611 }, { 1421, 0xfde9 }, /* 0x4F80 */ { 1433, 0xad6c }, { 1442, 0x2dd6 }, { 1451, 0xe803 }, { 1457, 0xc064 }, /* 0x4FC0 */ { 1462, 0xce3c }, { 1471, 0xad97 }, { 1481, 0xc07b }, { 1489, 0x456e }, /* 0x5000 */ { 1497, 0xea67 }, { 1507, 0xd75f }, { 1519, 0x7ffe }, { 1533, 0x0a40 }, /* 0x5040 */ { 1536, 0xc3cf }, { 1546, 0x14e9 }, { 1553, 0x1468 }, { 1558, 0x2175 }, /* 0x5080 */ { 1565, 0x2121 }, { 1569, 0x177e }, { 1579, 0x3408 }, { 1583, 0x4cbe }, /* 0x50C0 */ { 1592, 0xf6b4 }, { 1602, 0x4673 }, { 1610, 0x62ea }, { 1618, 0x0a2c }, /* 0x5100 */ { 1623, 0x0b5f }, { 1632, 0xcdf4 }, { 1642, 0x0402 }, { 1644, 0x9ca4 }, /* 0x5140 */ { 1651, 0x7ffb }, { 1665, 0x14b5 }, { 1672, 0x7f25 }, { 1682, 0x19ea }, /* 0x5180 */ { 1690, 0xbe6d }, { 1701, 0x23ef }, { 1711, 0x3f7d }, { 1723, 0x30ff }, /* 0x51C0 */ { 1733, 0x3e78 }, { 1742, 0x7840 }, { 1747, 0x66c7 }, { 1756, 0x677b }, /* 0x5200 */ { 1767, 0x4ddf }, { 1778, 0x20fe }, { 1786, 0x46b0 }, { 1792, 0x0fc9 }, /* 0x5240 */ { 1800, 0xbe98 }, { 1809, 0x78f0 }, { 1817, 0x963a }, { 1825, 0xa0bf }, /* 0x5280 */ { 1834, 0x239c }, { 1841, 0x891e }, { 1848, 0xbe59 }, { 1858, 0x5e32 }, /* 0x52C0 */ { 1866, 0x37aa }, { 1875, 0xebe7 }, { 1887, 0x00dd }, { 1893, 0xcfad }, /* 0x5300 */ { 1904, 0xade7 }, { 1915, 0x36e1 }, { 1923, 0x841b }, { 1929, 0xcf2a }, /* 0x5340 */ { 1938, 0x27ef }, { 1949, 0x559e }, { 1958, 0xd2cb }, { 1967, 0xadbb }, /* 0x5380 */ { 1978, 0x0014 }, { 1980, 0xa548 }, { 1986, 0x6371 }, { 1994, 0x08dd }, /* 0x53C0 */ { 2001, 0x7f0d }, { 2011, 0x8ef0 }, { 2019, 0xff3e }, { 2032, 0x05ff }, /* 0x5400 */ { 2042, 0xff1a }, { 2053, 0xe807 }, { 2060, 0x7bd1 }, { 2070, 0x7b40 }, /* 0x5440 */ { 2077, 0x674d }, { 2086, 0x8022 }, { 2089, 0x1d44 }, { 2095, 0xb8fb }, /* 0x5480 */ { 2106, 0xfd51 }, { 2116, 0x1065 }, { 2121, 0xfb77 }, { 2134, 0xf58c }, /* 0x54C0 */ { 2143, 0x03df }, { 2152, 0x0100 }, { 2153, 0xf366 }, { 2163, 0xa40e }, /* 0x5500 */ { 2169, 0xc2d3 }, { 2177, 0x0051 }, { 2180, 0xc800 }, { 2183, 0x532a }, /* 0x5540 */ { 2190, 0x94f3 }, { 2199, 0x70c9 }, { 2206, 0x001b }, { 2210, 0x7800 }, /* 0x5580 */ { 2214, 0x4fdf }, { 2226, 0xf702 }, { 2234, 0x7f80 }, { 2242, 0x8041 }, /* 0x55C0 */ { 2245, 0x52b0 }, { 2251, 0xb416 }, { 2258, 0x021c }, { 2262, 0x6280 }, /* 0x5600 */ { 2266, 0x43c0 }, { 2271, 0x09d1 }, { 2277, 0x8300 }, { 2280, 0xa9d7 }, /* 0x5640 */ { 2290, 0x5285 }, { 2296, 0x4809 }, { 2300, 0xbd51 }, { 2309, 0x0556 }, /* 0x5680 */ { 2315, 0x95c1 }, { 2322, 0x6630 }, { 2328, 0x7325 }, { 2336, 0x105c }, /* 0x56C0 */ { 2341, 0x672f }, { 2351, 0xcd8a }, { 2359, 0x4109 }, { 2363, 0xa6cd }, /* 0x5700 */ { 2372, 0xaf19 }, { 2381, 0x916c }, { 2388, 0xa3ca }, { 2396, 0x0999 }, /* 0x5740 */ { 2402, 0xf4e5 }, { 2412, 0x0003 }, { 2414, 0x8752 }, { 2421, 0x98b9 }, /* 0x5780 */ { 2429, 0x0b04 }, { 2433, 0x7408 }, { 2438, 0x151d }, { 2445, 0x0109 }, /* 0x57C0 */ { 2448, 0xd9c9 }, { 2457, 0xd0dc }, { 2465, 0x2059 }, { 2470, 0xbff1 }, /* 0x5800 */ { 2482, 0x0e75 }, { 2490, 0x6220 }, { 2494, 0x8493 }, { 2500, 0x2637 }, /* 0x5840 */ { 2508, 0x1e03 }, { 2514, 0x4796 }, { 2522, 0x0a96 }, { 2528, 0x5225 }, /* 0x5880 */ { 2534, 0xae28 }, { 2541, 0xf099 }, { 2549, 0x4f00 }, { 2554, 0x4f0a }, /* 0x58C0 */ { 2561, 0x74aa }, { 2569, 0xd7be }, { 2581, 0xda35 }, { 2590, 0x3e9f }, /* 0x5900 */ { 2601, 0xbe64 }, { 2610, 0x1f71 }, { 2619, 0x7eb4 }, { 2629, 0x6186 }, /* 0x5940 */ { 2635, 0xc3d0 }, { 2642, 0xadb3 }, { 2652, 0x77a5 }, { 2662, 0x3178 }, /* 0x5980 */ { 2669, 0x2c1e }, { 2676, 0xaa4c }, { 2683, 0x5138 }, { 2689, 0x5a04 }, /* 0x59C0 */ { 2694, 0x2b48 }, { 2700, 0x761f }, { 2710, 0x4df8 }, { 2719, 0x8940 }, /* 0x5A00 */ { 2723, 0x320a }, { 2728, 0x958a }, { 2735, 0xa2a9 }, { 2742, 0x1060 }, /* 0x5A40 */ { 2745, 0x0243 }, { 2749, 0x0420 }, { 2751, 0x34e4 }, { 2758, 0xc480 }, /* 0x5A80 */ { 2762, 0x0810 }, { 2764, 0xdc04 }, { 2770, 0x0085 }, { 2773, 0xf42a }, /* 0x5AC0 */ { 2781, 0x1a16 }, { 2787, 0x14c1 }, { 2792, 0x426b }, { 2799, 0x0c21 }, /* 0x5B00 */ { 2803, 0x1b01 }, { 2808, 0x02c0 }, { 2811, 0x3424 }, { 2816, 0x4055 }, /* 0x5B40 */ { 2821, 0x102b }, { 2826, 0xbdf7 }, { 2839, 0x8b78 }, { 2847, 0xb52b }, /* 0x5B80 */ { 2856, 0xbbbb }, { 2868, 0xbfe8 }, { 2879, 0x507c }, { 2886, 0x8379 }, /* 0x5BC0 */ { 2894, 0x52fd }, { 2904, 0xe95d }, { 2914, 0x5bf6 }, { 2925, 0xe56b }, /* 0x5C00 */ { 2935, 0xeffe }, { 2949, 0x444e }, { 2955, 0x2b1d }, { 2963, 0xff03 }, /* 0x5C40 */ { 2973, 0xed63 }, { 2983, 0xc82b }, { 2990, 0xd3bf }, { 3002, 0x1643 }, /* 0x5C80 */ { 3008, 0x9500 }, { 3012, 0x8013 }, { 3016, 0x3fcf }, { 3028, 0x5dea }, /* 0x5CC0 */ { 3038, 0x0aa0 }, { 3042, 0x0205 }, { 3045, 0xa703 }, { 3052, 0x2c51 }, /* 0x5D00 */ { 3058, 0x68c0 }, { 3063, 0xaff3 }, { 3075, 0x0ad5 }, { 3082, 0x0202 }, /* 0x5D40 */ { 3084, 0x5cc4 }, { 3091, 0x100d }, { 3095, 0xb602 }, { 3101, 0x0049 }, /* 0x5D80 */ { 3104, 0x1996 }, { 3111, 0x2295 }, { 3117, 0x5095 }, { 3123, 0x3795 }, /* 0x5DC0 */ { 3132, 0x3a00 }, { 3136, 0x69ce }, { 3145, 0x4bff }, { 3157, 0x68be }, /* 0x5E00 */ { 3166, 0x184d }, { 3172, 0xaf76 }, { 3183, 0xe820 }, { 3188, 0x61c9 }, /* 0x5E40 */ { 3195, 0x52b9 }, { 3203, 0xc1f0 }, { 3210, 0x781e }, { 3218, 0xfffc }, /* 0x5E80 */ { 3232, 0x849a }, { 3238, 0x14e0 }, { 3243, 0x3ce1 }, { 3251, 0xc3e0 }, /* 0x5EC0 */ { 3258, 0x8f4e }, { 3267, 0xae4d }, { 3276, 0x130f }, { 3283, 0xffdb }, /* 0x5F00 */ { 3297, 0xff9f }, { 3311, 0xf9fb }, { 3324, 0xa2e8 }, { 3331, 0x71f2 }, /* 0x5F40 */ { 3340, 0x55a3 }, { 3348, 0x33da }, { 3357, 0x3ede }, { 3368, 0xf28f }, /* 0x5F80 */ { 3378, 0x9fbf }, { 3391, 0x538f }, { 3400, 0xe797 }, { 3411, 0x33b8 }, /* 0x5FC0 */ { 3419, 0x3ab8 }, { 3427, 0x73dc }, { 3437, 0xca17 }, { 3445, 0xb92b }, /* 0x6000 */ { 3454, 0xe000 }, { 3457, 0x3bf5 }, { 3468, 0x8ff7 }, { 3480, 0x042a }, /* 0x6040 */ { 3484, 0x3cce }, { 3493, 0x8625 }, { 3499, 0xbf3d }, { 3511, 0x80a1 }, /* 0x6080 */ { 3515, 0x3e1a }, { 3523, 0xecf4 }, { 3533, 0x07c9 }, { 3540, 0x717f }, /* 0x60C0 */ { 3551, 0x09e0 }, { 3556, 0xbf3a }, { 3567, 0x418b }, { 3573, 0x0fff }, /* 0x6100 */ { 3585, 0xe34b }, { 3594, 0xde2d }, { 3604, 0x1982 }, { 3609, 0xf491 }, /* 0x6140 */ { 3617, 0x7dd6 }, { 3628, 0xa728 }, { 3635, 0xc9ad }, { 3644, 0x50fb }, /* 0x6180 */ { 3653, 0x6484 }, { 3658, 0x07df }, { 3668, 0x7bb0 }, { 3677, 0x5644 }, /* 0x61C0 */ { 3683, 0x3fc8 }, { 3692, 0xa021 }, { 3696, 0x0048 }, { 3698, 0xf5f4 }, /* 0x6200 */ { 3709, 0x7701 }, { 3716, 0xec77 }, { 3727, 0xc64e }, { 3735, 0xc91d }, /* 0x6240 */ { 3743, 0x7bcb }, { 3754, 0x4d6e }, { 3763, 0xe11b }, { 3771, 0xda4a }, /* 0x6280 */ { 3779, 0x063d }, { 3786, 0x5bfe }, { 3798, 0x1840 }, { 3801, 0x3a22 }, /* 0x62C0 */ { 3807, 0xb7f4 }, { 3818, 0x3bff }, { 3831, 0xf003 }, { 3837, 0xf0ea }, /* 0x6300 */ { 3846, 0x378e }, { 3855, 0x8303 }, { 3860, 0x8980 }, { 3864, 0xfe24 }, /* 0x6340 */ { 3873, 0xf21a }, { 3881, 0x12a1 }, { 3886, 0x5ba0 }, { 3893, 0x1cc4 }, /* 0x6380 */ { 3899, 0xd319 }, { 3907, 0x8b54 }, { 3914, 0x1faf }, { 3925, 0x6834 }, /* 0x63C0 */ { 3931, 0x8259 }, { 3937, 0x1c75 }, { 3945, 0x7a2b }, { 3954, 0x04f4 }, /* 0x6400 */ { 3960, 0xa240 }, { 3964, 0x50d9 }, { 3971, 0xb364 }, { 3979, 0x4450 }, /* 0x6440 */ { 3983, 0x4004 }, { 3985, 0x2d02 }, { 3990, 0xa281 }, { 3995, 0x2748 }, /* 0x6480 */ { 4001, 0x0188 }, { 4004, 0xe42e }, { 4012, 0x6a30 }, { 4018, 0xda05 }, /* 0x64C0 */ { 4025, 0x7cb6 }, { 4035, 0x05b5 }, { 4042, 0x90ff }, { 4052, 0xecd6 }, /* 0x6500 */ { 4062, 0x8031 }, { 4066, 0x7150 }, { 4072, 0x9e1c }, { 4080, 0xcbf4 }, /* 0x6540 */ { 4090, 0xa130 }, { 4095, 0x63f2 }, { 4104, 0x18cc }, { 4110, 0x05b5 }, /* 0x6580 */ { 4117, 0x57be }, { 4128, 0xba83 }, { 4136, 0xb8b2 }, { 4144, 0xb3a5 }, /* 0x65C0 */ { 4153, 0x9a7e }, { 4163, 0x0a94 }, { 4168, 0x33e7 }, { 4178, 0x1e06 }, /* 0x6600 */ { 4184, 0xd7dd }, { 4196, 0xd038 }, { 4202, 0xadb7 }, { 4213, 0x947b }, /* 0x6640 */ { 4222, 0xdb3e }, { 4233, 0xee86 }, { 4242, 0xfffe }, { 4257, 0x0dd9 }, /* 0x6680 */ { 4265, 0x639b }, { 4274, 0x23c7 }, { 4282, 0x6845 }, { 4288, 0xdb36 }, /* 0x66C0 */ { 4298, 0x03d2 }, { 4304, 0x3e40 }, { 4310, 0x1341 }, { 4315, 0xffbd }, /* 0x6700 */ { 4329, 0xab2b }, { 4338, 0xeafc }, { 4349, 0x7dc0 }, { 4357, 0xa5da }, /* 0x6740 */ { 4366, 0xf3c2 }, { 4375, 0xf25b }, { 4385, 0xa47f }, { 4395, 0xd8ff }, /* 0x6780 */ { 4407, 0x1aa2 }, { 4413, 0x3dad }, { 4423, 0x8247 }, { 4429, 0x0bdd }, /* 0x67C0 */ { 4438, 0xc55b }, { 4447, 0x6f9f }, { 4459, 0xd294 }, { 4466, 0xdabb }, /* 0x6800 */ { 4477, 0x001e }, { 4481, 0xe1c9 }, { 4489, 0x3e06 }, { 4496, 0x7b1e }, /* 0x6840 */ { 4506, 0x737f }, { 4518, 0xbabf }, { 4530, 0x4888 }, { 4534, 0xd4f4 }, /* 0x6880 */ { 4543, 0xa02e }, { 4549, 0xbfd9 }, { 4561, 0xaded }, { 4572, 0x1e7f }, /* 0x68C0 */ { 4583, 0xbf78 }, { 4594, 0x87f5 }, { 4604, 0xf1bb }, { 4615, 0x1e87 }, /* 0x6900 */ { 4623, 0xfdbb }, { 4636, 0x1e04 }, { 4641, 0x056e }, { 4648, 0xaa71 }, /* 0x6940 */ { 4656, 0x0644 }, { 4660, 0x76b8 }, { 4669, 0xff1f }, { 4682, 0xf7bc }, /* 0x6980 */ { 4694, 0x4407 }, { 4699, 0x1976 }, { 4707, 0x60e1 }, { 4713, 0xdc97 }, /* 0x69C0 */ { 4723, 0xfc8b }, { 4733, 0x634b }, { 4741, 0xef8c }, { 4751, 0xea7c }, /* 0x6A00 */ { 4761, 0x9c24 }, { 4767, 0xeebe }, { 4779, 0x4e0e }, { 4786, 0xef7d }, /* 0x6A40 */ { 4799, 0x4bf0 }, { 4807, 0x8b45 }, { 4814, 0x0856 }, { 4819, 0xc50c }, /* 0x6A80 */ { 4825, 0x6a19 }, { 4832, 0xf093 }, { 4840, 0x5c2f }, { 4849, 0x2908 }, /* 0x6AC0 */ { 4853, 0x004e }, { 4857, 0xfc1b }, { 4867, 0x1590 }, { 4872, 0x2c0e }, /* 0x6B00 */ { 4878, 0x8c30 }, { 4883, 0xe8c7 }, { 4892, 0x908b }, { 4898, 0x67a4 }, /* 0x6B40 */ { 4906, 0x56c8 }, { 4913, 0x8b59 }, { 4921, 0x96ff }, { 4933, 0x8fb8 }, /* 0x6B80 */ { 4942, 0x2e5f }, { 4952, 0x4960 }, { 4957, 0xee10 }, { 4964, 0xfcbe }, /* 0x6BC0 */ { 4976, 0xebe1 }, { 4986, 0x8ddc }, { 4995, 0xd8c0 }, { 5001, 0x800a }, /* 0x6C00 */ { 5004, 0xc524 }, { 5010, 0x089b }, { 5016, 0x0018 }, { 5018, 0xc5f8 }, /* 0x6C40 */ { 5027, 0x6007 }, { 5032, 0xfea1 }, { 5042, 0x2585 }, { 5048, 0x645d }, /* 0x6C80 */ { 5056, 0x337e }, { 5066, 0x1ffd }, { 5078, 0x6c06 }, { 5084, 0xff0a }, /* 0x6CC0 */ { 5094, 0x1676 }, { 5102, 0x3ef9 }, { 5113, 0xff2f }, { 5126, 0x080b }, /* 0x6D00 */ { 5130, 0x5c11 }, { 5136, 0xca84 }, { 5142, 0xcef0 }, { 5151, 0xfb7e }, /* 0x6D40 */ { 5164, 0x0032 }, { 5167, 0x5f00 }, { 5173, 0x5679 }, { 5182, 0x0391 }, /* 0x6D80 */ { 5187, 0x77a7 }, { 5198, 0x1b3a }, { 5206, 0xdc00 }, { 5211, 0x9134 }, /* 0x6DC0 */ { 5217, 0xd9f5 }, { 5228, 0xef67 }, { 5240, 0x5f52 }, { 5249, 0x1eea }, /* 0x6E00 */ { 5258, 0x0fa0 }, { 5264, 0xeea8 }, { 5273, 0xfaff }, { 5287, 0x5554 }, /* 0x6E40 */ { 5294, 0xff18 }, { 5304, 0xd9da }, { 5314, 0xc888 }, { 5319, 0xc044 }, /* 0x6E80 */ { 5323, 0x9005 }, { 5327, 0xb149 }, { 5334, 0x8ca4 }, { 5340, 0xa4d6 }, /* 0x6EC0 */ { 5348, 0x5ebe }, { 5359, 0x623a }, { 5366, 0x9800 }, { 5369, 0xcb94 }, /* 0x6F00 */ { 5377, 0x9646 }, { 5384, 0x053b }, { 5391, 0x9c2d }, { 5399, 0xd16e }, /* 0x6F40 */ { 5408, 0x0022 }, { 5410, 0xdf96 }, { 5421, 0xe157 }, { 5430, 0x7511 }, /* 0x6F80 */ { 5437, 0x7157 }, { 5446, 0x81d3 }, { 5453, 0x84bb }, { 5461, 0x526a }, /* 0x6FC0 */ { 5468, 0x07cf }, { 5477, 0xcd30 }, { 5484, 0xda13 }, { 5492, 0x566b }, /* 0x7000 */ { 5501, 0x8ee3 }, { 5510, 0xed22 }, { 5518, 0x11c8 }, { 5523, 0x5605 }, /* 0x7040 */ { 5529, 0x5c88 }, { 5535, 0x6112 }, { 5540, 0xda38 }, { 5548, 0x7161 }, /* 0x7080 */ { 5555, 0x4662 }, { 5561, 0x82a4 }, { 5566, 0xf810 }, { 5572, 0x0f8a }, /* 0x70C0 */ { 5579, 0x8d00 }, { 5583, 0xb31a }, { 5591, 0x1010 }, { 5593, 0x2202 }, /* 0x7100 */ { 5596, 0x93d8 }, { 5604, 0x5610 }, { 5609, 0xc843 }, { 5615, 0x1043 }, /* 0x7140 */ { 5619, 0x56c0 }, { 5625, 0x526f }, { 5634, 0x53f5 }, { 5644, 0x2000 }, /* 0x7180 */ { 5645, 0x85b1 }, { 5652, 0x8a74 }, { 5659, 0xd105 }, { 5665, 0x460a }, /* 0x71C0 */ { 5670, 0x4b1a }, { 5677, 0x92bd }, { 5686, 0x70e1 }, { 5693, 0xda20 }, /* 0x7200 */ { 5699, 0x20c1 }, { 5703, 0x0821 }, { 5706, 0x3d00 }, { 5711, 0xff75 }, /* 0x7240 */ { 5724, 0x19c5 }, { 5731, 0xabec }, { 5741, 0xc28e }, { 5748, 0xe314 }, /* 0x7280 */ { 5755, 0x6087 }, { 5761, 0x0844 }, { 5764, 0xf085 }, { 5771, 0x4247 }, /* 0x72C0 */ { 5777, 0x505f }, { 5785, 0x0a85 }, { 5790, 0x3207 }, { 5796, 0x3f88 }, /* 0x7300 */ { 5804, 0x0480 }, { 5806, 0xbbc4 }, { 5815, 0xdfa0 }, { 5824, 0xe2da }, /* 0x7340 */ { 5833, 0xc030 }, { 5837, 0x0085 }, { 5840, 0xdd48 }, { 5848, 0x1da7 }, /* 0x7380 */ { 5857, 0x0eb2 }, { 5864, 0xd170 }, { 5871, 0x0b65 }, { 5878, 0x9aac }, /* 0x73C0 */ { 5886, 0xef25 }, { 5896, 0x4240 }, { 5899, 0x66ab }, { 5908, 0x4702 }, /* 0x7400 */ { 5913, 0x06ea }, { 5920, 0x0c08 }, { 5923, 0xdd74 }, { 5933, 0x867f }, /* 0x7440 */ { 5943, 0x28db }, { 5951, 0xfeac }, { 5962, 0xae1d }, { 5971, 0x404b }, /* 0x7480 */ { 5976, 0x0bea }, { 5984, 0xd385 }, { 5992, 0x0fef }, { 6003, 0xae21 }, /* 0x74C0 */ { 6010, 0x8700 }, { 6014, 0x5550 }, { 6020, 0xcacd }, { 6029, 0x85c7 }, /* 0x7500 */ { 6037, 0x703a }, { 6044, 0xd5aa }, { 6053, 0x9d79 }, { 6063, 0x7d8f }, /* 0x7540 */ { 6074, 0xff51 }, { 6085, 0x3e17 }, { 6094, 0xbef5 }, { 6106, 0xe7df }, /* 0x7580 */ { 6119, 0xdec6 }, { 6129, 0x2416 }, { 6134, 0x082c }, { 6138, 0xf3af }, /* 0x75C0 */ { 6150, 0xe4ed }, { 6160, 0xeb3c }, { 6170, 0x529d }, { 6178, 0xd61f }, /* 0x7600 */ { 6188, 0xab8f }, { 6198, 0xdb68 }, { 6207, 0x21f7 }, { 6216, 0x1839 }, /* 0x7640 */ { 6222, 0x1bce }, { 6231, 0x1164 }, { 6236, 0xf7b6 }, { 6248, 0x7d47 }, /* 0x7680 */ { 6258, 0x49db }, { 6267, 0x7e69 }, { 6277, 0xc5c3 }, { 6285, 0x87d1 }, /* 0x76C0 */ { 6293, 0x776c }, { 6303, 0xd8d4 }, { 6311, 0x55fa }, { 6321, 0x5916 }, /* 0x7700 */ { 6328, 0x1f92 }, { 6336, 0xce80 }, { 6342, 0x2271 }, { 6348, 0x15f0 }, /* 0x7740 */ { 6355, 0x60c1 }, { 6360, 0x9d00 }, { 6365, 0x0d6f }, { 6374, 0xf604 }, /* 0x7780 */ { 6381, 0x4801 }, { 6384, 0xc412 }, { 6389, 0x3635 }, { 6397, 0xba49 }, /* 0x77C0 */ { 6405, 0x2080 }, { 6407, 0xdc80 }, { 6413, 0xf6fd }, { 6426, 0x1819 }, /* 0x7800 */ { 6431, 0x3264 }, { 6437, 0x0234 }, { 6441, 0x30e3 }, { 6448, 0x8414 }, /* 0x7840 */ { 6452, 0xc0a8 }, { 6457, 0x2002 }, { 6459, 0xdd10 }, { 6466, 0x1014 }, /* 0x7880 */ { 6469, 0x74c2 }, { 6476, 0xe4ba }, { 6485, 0xa698 }, { 6492, 0x5c21 }, /* 0x78C0 */ { 6498, 0x5d62 }, { 6506, 0x0433 }, { 6511, 0x91d3 }, { 6519, 0x6e94 }, /* 0x7900 */ { 6527, 0x4083 }, { 6531, 0x1a07 }, { 6537, 0x5c60 }, { 6543, 0x5c13 }, /* 0x7940 */ { 6550, 0x07e3 }, { 6558, 0xfde9 }, { 6570, 0x21a5 }, { 6576, 0x8684 }, /* 0x7980 */ { 6581, 0xe433 }, { 6589, 0x2970 }, { 6595, 0x46c2 }, { 6601, 0xef1b }, /* 0x79C0 */ { 6612, 0x3f87 }, { 6622, 0xc176 }, { 6630, 0x3ada }, { 6639, 0x0801 }, /* 0x7A00 */ { 6641, 0x6d09 }, { 6648, 0xdfb2 }, { 6659, 0x6001 }, { 6662, 0xfb86 }, /* 0x7A40 */ { 6672, 0xf2cd }, { 6682, 0xb2c1 }, { 6689, 0x2e8f }, { 6698, 0xa771 }, /* 0x7A80 */ { 6707, 0x053e }, { 6714, 0x81ed }, { 6722, 0xd609 }, { 6729, 0xde49 }, /* 0x7AC0 */ { 6738, 0xfdb8 }, { 6749, 0xb62e }, { 6758, 0xadef }, { 6770, 0xa751 }, /* 0x7B00 */ { 6778, 0x8dd4 }, { 6786, 0x4b06 }, { 6792, 0xf5e1 }, { 6802, 0x2a6a }, /* 0x7B40 */ { 6809, 0xfbe2 }, { 6820, 0x2077 }, { 6827, 0xf2f1 }, { 6837, 0x863f }, /* 0x7B80 */ { 6846, 0xa8c0 }, { 6851, 0xffb7 }, { 6865, 0xa402 }, { 6869, 0x1132 }, /* 0x7BC0 */ { 6874, 0x9ef3 }, { 6885, 0x26d0 }, { 6891, 0x2671 }, { 6898, 0x00c9 }, /* 0x7C00 */ { 6902, 0xe88b }, { 6910, 0xc09e }, { 6917, 0x0ccb }, { 6924, 0xe1ca }, /* 0x7C40 */ { 6932, 0xb429 }, { 6939, 0xc3d3 }, { 6948, 0xf233 }, { 6957, 0x4229 }, /* 0x7C80 */ { 6962, 0xaa0e }, { 6969, 0x89b5 }, { 6977, 0x69f7 }, { 6988, 0xf2ce }, /* 0x7CC0 */ { 6998, 0x6535 }, { 7006, 0xf3e4 }, { 7016, 0x88c5 }, { 7022, 0x4d74 }, /* 0x7D00 */ { 7030, 0x2ffd }, { 7042, 0x7fbd }, { 7055, 0xd80f }, { 7063, 0xe62f }, /* 0x7D40 */ { 7073, 0xd9ff }, { 7086, 0x5e49 }, { 7094, 0x454e }, { 7101, 0xa66f }, /* 0x7D80 */ { 7111, 0x9b48 }, { 7118, 0xbe88 }, { 7126, 0xfccd }, { 7137, 0xedf7 }, /* 0x7DC0 */ { 7150, 0x9c85 }, { 7157, 0x77e6 }, { 7168, 0x935b }, { 7177, 0x0a16 }, /* 0x7E00 */ { 7182, 0x0f32 }, { 7189, 0xe8a7 }, { 7198, 0x59cf }, { 7208, 0x6ea6 }, /* 0x7E40 */ { 7217, 0x2cea }, { 7225, 0x6674 }, { 7233, 0x2ec2 }, { 7240, 0xfa29 }, /* 0x7E80 */ { 7249, 0xf7cc }, { 7260, 0x1d5f }, { 7270, 0x0000 }, { 7270, 0x0000 }, /* 0x7F00 */ { 7270, 0x0000 }, { 7270, 0x0000 }, { 7270, 0x0000 }, { 7270, 0x5d40 }, /* 0x7F40 */ { 7276, 0xf0b8 }, { 7284, 0x8137 }, { 7291, 0x6f9b }, { 7302, 0x63a5 }, /* 0x7F80 */ { 7310, 0x55ec }, { 7319, 0x74d3 }, { 7328, 0xe318 }, { 7335, 0xa344 }, /* 0x7FC0 */ { 7341, 0xd46a }, { 7349, 0x8834 }, { 7354, 0xda6b }, { 7364, 0x1e0d }, /* 0x8000 */ { 7371, 0x5d7f }, { 7383, 0x13f7 }, { 7393, 0x1152 }, { 7398, 0xb8e9 }, /* 0x8040 */ { 7407, 0x0448 }, { 7410, 0xc544 }, { 7416, 0x8146 }, { 7421, 0xeaff }, /* 0x8080 */ { 7434, 0x1af0 }, { 7441, 0x3f48 }, { 7449, 0xb6b6 }, { 7459, 0x0516 }, /* 0x80C0 */ { 7464, 0x5478 }, { 7471, 0x6fe0 }, { 7480, 0x8073 }, { 7486, 0x393a }, /* 0x8100 */ { 7494, 0x27e4 }, { 7502, 0x4d40 }, { 7507, 0x9298 }, { 7513, 0x622a }, /* 0x8140 */ { 7519, 0x4c40 }, { 7523, 0x803b }, { 7529, 0x6be1 }, { 7538, 0x8713 }, /* 0x8180 */ { 7545, 0x853f }, { 7554, 0x3528 }, { 7560, 0x0319 }, { 7565, 0xed2d }, /* 0x81C0 */ { 7575, 0xa74f }, { 7585, 0x8fca }, { 7594, 0x35b9 }, { 7603, 0xfc18 }, /* 0x8200 */ { 7611, 0x77b6 }, { 7622, 0xdbc5 }, { 7632, 0x5e06 }, { 7639, 0x13fc }, /* 0x8240 */ { 7648, 0x8ae1 }, { 7655, 0xb780 }, { 7662, 0xcd5d }, { 7672, 0xe3d6 }, /* 0x8280 */ { 7682, 0x6c08 }, { 7687, 0xa20c }, { 7692, 0xfbfa }, { 7705, 0xff9e }, /* 0x82C0 */ { 7718, 0x0060 }, { 7720, 0xdabe }, { 7731, 0x09ee }, { 7739, 0x6e9a }, /* 0x8300 */ { 7748, 0x53ff }, { 7760, 0x39c0 }, { 7766, 0xa90c }, { 7772, 0x1777 }, /* 0x8340 */ { 7782, 0x86b9 }, { 7790, 0x01b7 }, { 7797, 0x000c }, { 7799, 0xb8a8 }, /* 0x8380 */ { 7806, 0x66e0 }, { 7813, 0xed7c }, { 7824, 0x0f85 }, { 7831, 0xa022 }, /* 0x83C0 */ { 7835, 0xd6a3 }, { 7844, 0xb15b }, { 7853, 0x8e23 }, { 7860, 0x2a97 }, /* 0x8400 */ { 7868, 0xfcda }, { 7879, 0x00aa }, { 7883, 0x1605 }, { 7888, 0x3322 }, /* 0x8440 */ { 7894, 0xc740 }, { 7900, 0x9e86 }, { 7908, 0xfa6e }, { 7919, 0x17eb }, /* 0x8480 */ { 7929, 0x0836 }, { 7934, 0xd291 }, { 7941, 0xa042 }, { 7945, 0xdf14 }, /* 0x84C0 */ { 7954, 0xee57 }, { 7965, 0x164b }, { 7972, 0xd480 }, { 7977, 0xb413 }, /* 0x8500 */ { 7984, 0x1041 }, { 7987, 0xcdba }, { 7997, 0xb87a }, { 8006, 0x6034 }, /* 0x8540 */ { 8011, 0xcf0b }, { 8020, 0x47aa }, { 8028, 0xa71e }, { 8037, 0xec80 }, /* 0x8580 */ { 8043, 0x95d3 }, { 8052, 0xba9b }, { 8062, 0xff54 }, { 8073, 0x1681 }, /* 0x85C0 */ { 8078, 0xee82 }, { 8086, 0xb321 }, { 8093, 0x2672 }, { 8100, 0xcec0 }, /* 0x8600 */ { 8107, 0x0cf5 }, { 8115, 0x45cf }, { 8124, 0xa296 }, { 8131, 0x9301 }, /* 0x8640 */ { 8136, 0x6003 }, { 8140, 0xdcf9 }, { 8151, 0x9884 }, { 8156, 0x0ea2 }, /* 0x8680 */ { 8162, 0x3e80 }, { 8168, 0x312a }, { 8174, 0x8f18 }, { 8181, 0x014b }, /* 0x86C0 */ { 8186, 0x6ada }, { 8195, 0xcab2 }, { 8203, 0xf258 }, { 8211, 0x7f00 }, /* 0x8700 */ { 8218, 0x6fed }, { 8230, 0x970f }, { 8239, 0x022a }, { 8243, 0xcc92 }, /* 0x8740 */ { 8250, 0x5a09 }, { 8256, 0x83aa }, { 8263, 0x4579 }, { 8271, 0x9156 }, /* 0x8780 */ { 8278, 0x2b84 }, { 8284, 0x8008 }, { 8286, 0xb885 }, { 8293, 0x6c28 }, /* 0x87C0 */ { 8299, 0x48d3 }, { 8306, 0x8045 }, { 8310, 0xbc69 }, { 8319, 0x4ae4 }, /* 0x8800 */ { 8326, 0xec6a }, { 8335, 0x807b }, { 8342, 0x418e }, { 8348, 0x1a46 }, /* 0x8840 */ { 8354, 0x3455 }, { 8361, 0xeb8c }, { 8370, 0x8b1e }, { 8378, 0xe0a5 }, /* 0x8880 */ { 8385, 0x2906 }, { 8390, 0x43c4 }, { 8396, 0x4c15 }, { 8402, 0xf0b3 }, /* 0x88C0 */ { 8411, 0xc43f }, { 8420, 0xbb3e }, { 8431, 0x0102 }, { 8433, 0x733f }, /* 0x8900 */ { 8444, 0x1496 }, { 8450, 0x770d }, { 8459, 0x0ca0 }, { 8463, 0x0bc5 }, /* 0x8940 */ { 8470, 0x323f }, { 8479, 0xc040 }, { 8482, 0xa455 }, { 8489, 0xc094 }, /* 0x8980 */ { 8494, 0x8fcb }, { 8504, 0x85d9 }, { 8512, 0x96c2 }, { 8519, 0xa48d }, /* 0x89C0 */ { 8526, 0x0001 }, { 8527, 0x3554 }, { 8534, 0x08e8 }, { 8539, 0xa15a }, /* 0x8A00 */ { 8546, 0x550d }, { 8553, 0xa9ff }, { 8565, 0x242e }, { 8571, 0x5cfa }, /* 0x8A40 */ { 8581, 0x61e2 }, { 8588, 0x6937 }, { 8597, 0x7a4f }, { 8607, 0x122f }, /* 0x8A80 */ { 8614, 0x32b4 }, { 8621, 0x452b }, { 8628, 0x71fb }, { 8639, 0xd285 }, /* 0x8AC0 */ { 8646, 0xb894 }, { 8653, 0xdcc5 }, { 8662, 0x68d7 }, { 8671, 0x55da }, /* 0x8B00 */ { 8680, 0x74b7 }, { 8690, 0xbed1 }, { 8700, 0x3943 }, { 8707, 0x4208 }, /* 0x8B40 */ { 8710, 0xd24a }, { 8717, 0xdf52 }, { 8727, 0x9a40 }, { 8732, 0xa0d7 }, /* 0x8B80 */ { 8740, 0x5c0b }, { 8747, 0x767d }, { 8758, 0x0000 }, { 8758, 0x0000 }, /* 0x8C00 */ { 8758, 0x0000 }, { 8758, 0x0000 }, { 8758, 0x0000 }, { 8758, 0xa680 }, /* 0x8C40 */ { 8763, 0xd7e2 }, { 8773, 0x04b1 }, { 8778, 0x3f06 }, { 8786, 0x1708 }, /* 0x8C80 */ { 8791, 0x7624 }, { 8798, 0x6b1c }, { 8806, 0xff97 }, { 8819, 0xb9dd }, /* 0x8CC0 */ { 8830, 0x659f }, { 8840, 0x5e6a }, { 8849, 0x245f }, { 8857, 0x7d13 }, /* 0x8D00 */ { 8866, 0xefb0 }, { 8876, 0x085d }, { 8882, 0x0000 }, { 8882, 0x0000 }, /* 0x8D40 */ { 8882, 0x0000 }, { 8882, 0x0000 }, { 8882, 0x38d0 }, { 8888, 0x009b }, /* 0x8D80 */ { 8893, 0x0432 }, { 8897, 0x0220 }, { 8899, 0x8148 }, { 8903, 0x4408 }, /* 0x8DC0 */ { 8906, 0xd944 }, { 8913, 0xaec2 }, { 8921, 0x9d0a }, { 8928, 0xb028 }, /* 0x8E00 */ { 8933, 0x9740 }, { 8939, 0xe051 }, { 8945, 0x048f }, { 8951, 0x2271 }, /* 0x8E40 */ { 8957, 0x1f94 }, { 8965, 0x8231 }, { 8970, 0xb01d }, { 8977, 0x1855 }, /* 0x8E80 */ { 8983, 0x2cb2 }, { 8990, 0x431a }, { 8996, 0xdc02 }, { 9002, 0x486b }, /* 0x8EC0 */ { 9009, 0x3d61 }, { 9017, 0x8816 }, { 9022, 0x080c }, { 9025, 0x7f00 }, /* 0x8F00 */ { 9032, 0x1729 }, { 9039, 0xfabc }, { 9050, 0xae40 }, { 9056, 0xcb48 }, /* 0x8F40 */ { 9063, 0x7675 }, { 9073, 0x9190 }, { 9078, 0x001e }, { 9082, 0x0000 }, /* 0x8F80 */ { 9082, 0x0000 }, { 9082, 0xd800 }, { 9086, 0xe1d8 }, { 9094, 0x9cf7 }, /* 0x8FC0 */ { 9105, 0x6476 }, { 9113, 0x043a }, { 9118, 0xef75 }, { 9130, 0x2fb3 }, /* 0x9000 */ { 9140, 0xf96f }, { 9152, 0xe6fb }, { 9164, 0x608f }, { 9171, 0x53e6 }, /* 0x9040 */ { 9180, 0xeebe }, { 9192, 0x737f }, { 9204, 0xe32b }, { 9213, 0xb5e4 }, /* 0x9080 */ { 9222, 0x97bf }, { 9234, 0x0aa3 }, { 9240, 0x854e }, { 9247, 0x416b }, /* 0x90C0 */ { 9254, 0x45ba }, { 9262, 0xf880 }, { 9268, 0xa916 }, { 9275, 0xe0f4 }, /* 0x9100 */ { 9283, 0x0055 }, { 9287, 0x5374 }, { 9295, 0xa08c }, { 9300, 0x2697 }, /* 0x9140 */ { 9308, 0x7fc0 }, { 9317, 0x0bd4 }, { 9324, 0x163e }, { 9332, 0x03bc }, /* 0x9180 */ { 9339, 0x6aac }, { 9347, 0x5085 }, { 9352, 0xdd14 }, { 9360, 0x157a }, /* 0x91C0 */ { 9368, 0xfbdb }, { 9381, 0xbdc3 }, { 9391, 0x70fa }, { 9400, 0x9862 }, /* 0x9200 */ { 9406, 0x6482 }, { 9411, 0x40f3 }, { 9418, 0x1200 }, { 9420, 0x9798 }, /* 0x9240 */ { 9428, 0xcfbd }, { 9440, 0x4ec3 }, { 9448, 0x01f7 }, { 9456, 0xf102 }, /* 0x9280 */ { 9462, 0x2329 }, { 9468, 0x9fea }, { 9479, 0x2880 }, { 9482, 0x8284 }, /* 0x92C0 */ { 9486, 0xd845 }, { 9493, 0x028d }, { 9498, 0x26b1 }, { 9505, 0x9f8c }, /* 0x9300 */ { 9514, 0xa054 }, { 9519, 0xe723 }, { 9528, 0xdbef }, { 9541, 0x0c24 }, /* 0x9340 */ { 9545, 0x2f90 }, { 9552, 0x1cd2 }, { 9559, 0x5c31 }, { 9566, 0x502b }, /* 0x9380 */ { 9572, 0x9900 }, { 9576, 0x4cd0 }, { 9582, 0x708a }, { 9588, 0x0601 }, /* 0x93C0 */ { 9591, 0x01ca }, { 9596, 0xf1c3 }, { 9605, 0x01b6 }, { 9611, 0x2822 }, /* 0x9400 */ { 9615, 0x8298 }, { 9620, 0x07d9 }, { 9628, 0x0802 }, { 9630, 0x0d7c }, /* 0x9440 */ { 9638, 0x0432 }, { 9642, 0x4c0e }, { 9648, 0xac0d }, { 9655, 0xf0a7 }, /* 0x9480 */ { 9664, 0x0002 }, { 9665, 0x0000 }, { 9665, 0x0000 }, { 9665, 0x0000 }, /* 0x9540 */ { 9665, 0x0000 }, { 9665, 0x0000 }, { 9665, 0x0000 }, { 9665, 0x0380 }, /* 0x9580 */ { 9668, 0xfecd }, { 9680, 0x835a }, { 9687, 0x3bfd }, { 9699, 0x7a54 }, /* 0x95C0 */ { 9707, 0x3d88 }, { 9714, 0x5579 }, { 9723, 0x0026 }, { 9726, 0x0000 }, /* 0x9600 */ { 9726, 0x0000 }, { 9726, 0x3000 }, { 9728, 0xd502 }, { 9734, 0x981c }, /* 0x9640 */ { 9740, 0xb817 }, { 9748, 0xf901 }, { 9755, 0x147e }, { 9763, 0x25ed }, /* 0x9680 */ { 9772, 0xed74 }, { 9782, 0x3fb0 }, { 9791, 0x87b9 }, { 9800, 0x3fdf }, /* 0x96C0 */ { 9813, 0x7af3 }, { 9824, 0x7f66 }, { 9835, 0x8f0c }, { 9842, 0x0ac5 }, /* 0x9700 */ { 9848, 0xe5d1 }, { 9857, 0x525a }, { 9864, 0x0498 }, { 9868, 0x6b4d }, /* 0x9740 */ { 9877, 0xe3d6 }, { 9887, 0x5ee4 }, { 9896, 0x6f57 }, { 9907, 0x161a }, /* 0x9780 */ { 9913, 0xa872 }, { 9920, 0x5561 }, { 9927, 0x694d }, { 9935, 0x441e }, /* 0x97C0 */ { 9941, 0x1b4a }, { 9948, 0x5b1a }, { 9956, 0x6002 }, { 9959, 0x887e }, /* 0x9800 */ { 9967, 0xf57e }, { 9979, 0x45df }, { 9989, 0x383a }, { 9996, 0x399d }, /* 0x9840 */ { 10005, 0xf8c0 }, { 10012, 0x4ffc }, { 10023, 0x98e0 }, { 10029, 0x001b }, /* 0x9880 */ { 10033, 0x0000 }, { 10033, 0x0000 }, { 10033, 0xad00 }, { 10038, 0x9dc3 }, /* 0x98C0 */ { 10047, 0x09dc }, { 10054, 0x9800 }, { 10057, 0xeeaf }, { 10069, 0x701f }, /* 0x9900 */ { 10077, 0x1728 }, { 10083, 0x7ddd }, { 10095, 0x5113 }, { 10101, 0x7c0e }, /* 0x9940 */ { 10109, 0x7a67 }, { 10119, 0x91a7 }, { 10127, 0x0001 }, { 10128, 0x0000 }, /* 0x9980 */ { 10128, 0x0000 }, { 10128, 0x43c0 }, { 10133, 0x7168 }, { 10140, 0xb218 }, /* 0x99C0 */ { 10146, 0x037a }, { 10153, 0xeb37 }, { 10164, 0x6004 }, { 10167, 0x9b07 }, /* 0x9A00 */ { 10175, 0xc42e }, { 10182, 0x064e }, { 10188, 0x6911 }, { 10194, 0x41c3 }, /* 0x9A40 */ { 10200, 0x743d }, { 10209, 0x8da4 }, { 10216, 0x0e34 }, { 10222, 0x0000 }, /* 0x9A80 */ { 10222, 0x0000 }, { 10222, 0x0000 }, { 10222, 0xa100 }, { 10225, 0x13c1 }, /* 0x9AC0 */ { 10231, 0xc05b }, { 10238, 0xd17f }, { 10249, 0xee6d }, { 10260, 0x0a92 }, /* 0x9B00 */ { 10265, 0x114c }, { 10270, 0x9545 }, { 10277, 0xefad }, { 10289, 0x380e }, /* 0x9B40 */ { 10295, 0xe83e }, { 10304, 0x4512 }, { 10309, 0x9868 }, { 10315, 0x02fc }, /* 0x9B80 */ { 10322, 0xc418 }, { 10327, 0xc0ce }, { 10334, 0x7dc1 }, { 10343, 0x4316 }, /* 0x9BC0 */ { 10349, 0xc6c3 }, { 10357, 0x2956 }, { 10364, 0xcdbe }, { 10375, 0x25af }, /* 0x9C00 */ { 10384, 0x3751 }, { 10392, 0x2f7d }, { 10403, 0xe6be }, { 10414, 0x4ec7 }, /* 0x9C40 */ { 10423, 0x87e2 }, { 10431, 0xbd9d }, { 10442, 0x6ea9 }, { 10451, 0x05e5 }, /* 0x9CC0 */ { 10458, 0x0000 }, { 10458, 0x0000 }, { 10458, 0x1ae0 }, { 10464, 0x005d }, /* 0x9D00 */ { 10469, 0x4bcc }, { 10477, 0xe9a6 }, { 10486, 0x1d48 }, { 10492, 0xc804 }, /* 0x9D40 */ { 10496, 0x05de }, { 10504, 0xf207 }, { 10512, 0x9a1f }, { 10521, 0x54cd }, /* 0x9D80 */ { 10529, 0xa690 }, { 10535, 0x0640 }, { 10538, 0x9a12 }, { 10544, 0xbf34 }, /* 0x9DC0 */ { 10554, 0x82df }, { 10563, 0x86c8 }, { 10569, 0xa0c9 }, { 10575, 0x2714 }, /* 0x9E00 */ { 10581, 0x2484 }, { 10585, 0x7e20 }, { 10592, 0x0000 }, { 10592, 0x0000 }, /* 0x9E40 */ { 10592, 0x0000 }, { 10592, 0x0000 }, { 10592, 0x0000 }, { 10592, 0xbb20 }, /* 0x9E80 */ { 10599, 0x1923 }, { 10605, 0xe8ae }, { 10614, 0xb770 }, { 10623, 0xff30 }, /* 0x9EC0 */ { 10633, 0xf018 }, { 10639, 0xfb17 }, { 10650, 0xc1a1 }, { 10656, 0xbad0 }, /* 0x9F00 */ { 10664, 0x418c }, { 10669, 0x02a9 }, { 10674, 0x9003 }, { 10678, 0x6e80 }, /* 0x9F40 */ { 10684, 0xcc62 }, { 10691, 0xa1bc }, { 10699, 0x36cf }, { 10709, 0x00e5 }, /* 0x9F80 */ { 10714, 0x2000 }, { 10715, 0x30b1 }, { 10721, 0x0005 }, { 10723, 0x0000 }, /* 0xF900 */ { 10723, 0x0000 }, { 10723, 0x2000 }, { 10724, 0x0300 }, { 10726, 0x0040 }, /* 0xF940 */ { 10727, 0x0000 }, { 10727, 0x0000 }, { 10727, 0x0000 }, { 10727, 0x0001 }, /* 0xF9C0 */ { 10728, 0x0000 }, { 10728, 0x1001 }, { 10730, 0x0000 }, { 10730, 0x0000 }, /* 0xFA00 */ { 10730, 0x8000 }, { 10731, 0x8e7b }, { 10741, 0x0057 }, { 10746, 0xffff }, /* 0xFA40 */ { 10762, 0xffff }, { 10778, 0xffff }, { 10794, 0x07ff }, { 10805, 0x0000 }, /* 0xFE40 */ { 10805, 0x0060 }, { 10807, 0x0000 }, { 10807, 0x0000 }, { 10807, 0x0000 }, /* 0xFF00 */ { 10807, 0xfffe }, { 10822, 0xffff }, { 10838, 0xffff }, { 10854, 0xffff }, /* 0xFF40 */ { 10870, 0xffff }, { 10886, 0xffff }, { 10902, 0x0001 }, { 10903, 0x0000 }, /* 0xFFC0 */ { 10903, 0x0000 }, { 10903, 0x0000 }, { 10903, 0x0028 }, { 10905, 0x0000 }, /* 0x20000 */ { 10905, 0x0800 }, { 10906, 0x0000 }, { 10906, 0x0000 }, { 10906, 0x0000 }, /* 0x20080 */ { 10906, 0x0200 }, { 10907, 0x0000 }, { 10907, 0x0014 }, { 10909, 0x0000 }, /* 0x20180 */ { 10909, 0x0000 }, { 10909, 0x0000 }, { 10909, 0x0004 }, { 10910, 0x0000 }, /* 0x20200 */ { 10910, 0x0000 }, { 10910, 0x0008 }, { 10911, 0x0000 }, { 10911, 0x0000 }, /* 0x20300 */ { 10911, 0x0000 }, { 10911, 0x0000 }, { 10911, 0x0800 }, { 10912, 0x0000 }, /* 0x20340 */ { 10912, 0x0000 }, { 10912, 0x0000 }, { 10912, 0x0000 }, { 10912, 0x0002 }, /* 0x20380 */ { 10913, 0x0002 }, { 10914, 0x0000 }, { 10914, 0x0000 }, { 10914, 0x0000 }, /* 0x203C0 */ { 10914, 0x0000 }, { 10914, 0x0000 }, { 10914, 0x0000 }, { 10914, 0x0200 }, /* 0x20440 */ { 10915, 0x0400 }, { 10916, 0x0000 }, { 10916, 0x0000 }, { 10916, 0x0000 }, /* 0x20500 */ { 10916, 0x0200 }, { 10917, 0x0000 }, { 10917, 0x0000 }, { 10917, 0x0000 }, /* 0x205C0 */ { 10917, 0x0000 }, { 10917, 0x0040 }, { 10918, 0x0000 }, { 10918, 0x0000 }, /* 0x20600 */ { 10918, 0x0000 }, { 10918, 0x0000 }, { 10918, 0x0100 }, { 10919, 0x0000 }, /* 0x20740 */ { 10919, 0x8000 }, { 10920, 0x0000 }, { 10920, 0x0000 }, { 10920, 0x0000 }, /* 0x20800 */ { 10920, 0x0080 }, { 10921, 0x0000 }, { 10921, 0x0000 }, { 10921, 0x0400 }, /* 0x20880 */ { 10922, 0x0000 }, { 10922, 0x0000 }, { 10922, 0x0000 }, { 10922, 0x0200 }, /* 0x20940 */ { 10923, 0x0000 }, { 10923, 0x0000 }, { 10923, 0x0000 }, { 10923, 0x1000 }, /* 0x20980 */ { 10924, 0x0000 }, { 10924, 0x2000 }, { 10925, 0x0000 }, { 10925, 0x0000 }, /* 0x20AC0 */ { 10925, 0x0000 }, { 10925, 0x0008 }, { 10926, 0x0000 }, { 10926, 0x0000 }, /* 0x20B00 */ { 10926, 0x0000 }, { 10926, 0x2000 }, { 10927, 0x0000 }, { 10927, 0x0000 }, /* 0x20B80 */ { 10927, 0x0000 }, { 10927, 0x8000 }, { 10928, 0x0000 }, { 10928, 0x0000 }, /* 0x20D40 */ { 10928, 0x0020 }, { 10929, 0x0000 }, { 10929, 0x0000 }, { 10929, 0x0000 }, /* 0x20DC0 */ { 10929, 0x0000 }, { 10929, 0x0000 }, { 10929, 0x0002 }, { 10930, 0x0000 }, /* 0x20E40 */ { 10930, 0x0000 }, { 10930, 0x0000 }, { 10930, 0x2010 }, { 10932, 0x0000 }, /* 0x20E80 */ { 10932, 0x0000 }, { 10932, 0x0020 }, { 10933, 0x0000 }, { 10933, 0x0000 }, /* 0x20F40 */ { 10933, 0x0000 }, { 10933, 0x8000 }, { 10934, 0x0000 }, { 10934, 0x0000 }, /* 0x21200 */ { 10934, 0x0002 }, { 10935, 0x0000 }, { 10935, 0x0000 }, { 10935, 0x2000 }, /* 0x21240 */ { 10936, 0x0000 }, { 10936, 0x0020 }, { 10937, 0x0000 }, { 10937, 0x0810 }, /* 0x212C0 */ { 10939, 0x0000 }, { 10939, 0x0080 }, { 10940, 0x0010 }, { 10941, 0x2000 }, /* 0x21300 */ { 10942, 0x0000 }, { 10942, 0x0800 }, { 10943, 0x0000 }, { 10943, 0x0040 }, /* 0x21340 */ { 10944, 0x0010 }, { 10945, 0x0000 }, { 10945, 0x0000 }, { 10945, 0x0000 }, /* 0x213C0 */ { 10945, 0x0010 }, { 10946, 0x0000 }, { 10946, 0x0000 }, { 10946, 0x0000 }, /* 0x21440 */ { 10946, 0x0000 }, { 10946, 0x0000 }, { 10946, 0x6000 }, { 10948, 0x0000 }, /* 0x215C0 */ { 10948, 0x0000 }, { 10948, 0x0080 }, { 10949, 0x0000 }, { 10949, 0x0000 }, /* 0x21640 */ { 10949, 0x0080 }, { 10950, 0x0000 }, { 10950, 0x0000 }, { 10950, 0x0000 }, /* 0x21680 */ { 10950, 0x0000 }, { 10950, 0x0000 }, { 10950, 0x0000 }, { 10950, 0x0010 }, /* 0x21700 */ { 10951, 0x0040 }, { 10952, 0x0000 }, { 10952, 0x0000 }, { 10952, 0x0000 }, /* 0x21740 */ { 10952, 0x0004 }, { 10953, 0x0000 }, { 10953, 0x0000 }, { 10953, 0x0000 }, /* 0x21880 */ { 10953, 0x0000 }, { 10953, 0x0000 }, { 10953, 0x0000 }, { 10953, 0x2000 }, /* 0x219C0 */ { 10954, 0x0008 }, { 10955, 0x0000 }, { 10955, 0x0000 }, { 10955, 0x0000 }, /* 0x21C40 */ { 10955, 0x0000 }, { 10955, 0x0040 }, { 10956, 0x0000 }, { 10956, 0x0000 }, /* 0x21D00 */ { 10956, 0x0000 }, { 10956, 0x0000 }, { 10956, 0x2000 }, { 10957, 0x0000 }, /* 0x21D40 */ { 10957, 0x0020 }, { 10958, 0x0000 }, { 10958, 0x0004 }, { 10959, 0x0100 }, /* 0x21D80 */ { 10960, 0x0000 }, { 10960, 0x1004 }, { 10962, 0x0002 }, { 10963, 0x0080 }, /* 0x21DC0 */ { 10964, 0x0000 }, { 10964, 0x0000 }, { 10964, 0x0001 }, { 10965, 0x0000 }, /* 0x21E00 */ { 10965, 0x0000 }, { 10965, 0x0000 }, { 10965, 0x0000 }, { 10965, 0x0018 }, /* 0x21F00 */ { 10967, 0x0000 }, { 10967, 0x4000 }, { 10968, 0x0000 }, { 10968, 0x0000 }, /* 0x21F40 */ { 10968, 0x0000 }, { 10968, 0x0000 }, { 10968, 0x0000 }, { 10968, 0x0040 }, /* 0x21FC0 */ { 10969, 0x0000 }, { 10969, 0x0000 }, { 10969, 0x0000 }, { 10969, 0x0400 }, /* 0x22140 */ { 10970, 0x0000 }, { 10970, 0x0000 }, { 10970, 0x0000 }, { 10970, 0x0800 }, /* 0x22200 */ { 10971, 0x0000 }, { 10971, 0x0100 }, { 10972, 0x0000 }, { 10972, 0x0000 }, /* 0x22300 */ { 10972, 0x0000 }, { 10972, 0x4000 }, { 10973, 0x0000 }, { 10973, 0x0000 }, /* 0x22380 */ { 10973, 0x0000 }, { 10973, 0x0000 }, { 10973, 0x2000 }, { 10974, 0x0000 }, /* 0x226C0 */ { 10974, 0x0000 }, { 10974, 0x0000 }, { 10974, 0x0000 }, { 10974, 0x0008 }, /* 0x22840 */ { 10975, 0x0000 }, { 10975, 0x0800 }, { 10976, 0x0000 }, { 10976, 0x0000 }, /* 0x22880 */ { 10976, 0x0000 }, { 10976, 0x0000 }, { 10976, 0x0800 }, { 10977, 0x0000 }, /* 0x22980 */ { 10977, 0x8000 }, { 10978, 0x0000 }, { 10978, 0x0000 }, { 10978, 0x0000 }, /* 0x22A80 */ { 10978, 0x0000 }, { 10978, 0x0000 }, { 10978, 0x0000 }, { 10978, 0x0100 }, /* 0x22B40 */ { 10979, 0x8040 }, { 10981, 0x0001 }, { 10982, 0x0000 }, { 10982, 0x0000 }, /* 0x22B80 */ { 10982, 0x0000 }, { 10982, 0x0000 }, { 10982, 0x0040 }, { 10983, 0x0000 }, /* 0x22C00 */ { 10983, 0x0000 }, { 10983, 0x2000 }, { 10984, 0x0010 }, { 10985, 0x0000 }, /* 0x22DC0 */ { 10985, 0x0000 }, { 10985, 0x0000 }, { 10985, 0x0002 }, { 10986, 0x0000 }, /* 0x23180 */ { 10986, 0x0000 }, { 10986, 0x0000 }, { 10986, 0x0000 }, { 10986, 0x0040 }, /* 0x231C0 */ { 10987, 0x0018 }, { 10989, 0x0000 }, { 10989, 0x0000 }, { 10989, 0x0020 }, /* 0x23340 */ { 10990, 0x0000 }, { 10990, 0x0000 }, { 10990, 0x0000 }, { 10990, 0x0004 }, /* 0x233C0 */ { 10991, 0x0000 }, { 10991, 0x842d }, { 10997, 0x0010 }, { 10998, 0x0000 }, /* 0x23440 */ { 10998, 0x0c00 }, { 11000, 0x0002 }, { 11001, 0x0020 }, { 11002, 0x0000 }, /* 0x234C0 */ { 11002, 0x0000 }, { 11002, 0x0000 }, { 11002, 0x0010 }, { 11003, 0x0000 }, /* 0x23540 */ { 11003, 0x0000 }, { 11003, 0x0400 }, { 11004, 0x0000 }, { 11004, 0x0000 }, /* 0x23580 */ { 11004, 0x0000 }, { 11004, 0x0010 }, { 11005, 0x0000 }, { 11005, 0x0000 }, /* 0x235C0 */ { 11005, 0x0010 }, { 11006, 0x0000 }, { 11006, 0x0000 }, { 11006, 0x0000 }, /* 0x23600 */ { 11006, 0x0000 }, { 11006, 0x0000 }, { 11006, 0x0000 }, { 11006, 0x0700 }, /* 0x23640 */ { 11009, 0x0080 }, { 11010, 0x0000 }, { 11010, 0x0000 }, { 11010, 0x0000 }, /* 0x23700 */ { 11010, 0x1000 }, { 11011, 0x1000 }, { 11012, 0x0000 }, { 11012, 0x8000 }, /* 0x23740 */ { 11013, 0x0000 }, { 11013, 0x0000 }, { 11013, 0x0018 }, { 11015, 0x0000 }, /* 0x237C0 */ { 11015, 0x0000 }, { 11015, 0x0000 }, { 11015, 0x0080 }, { 11016, 0x8000 }, /* 0x23800 */ { 11017, 0x0000 }, { 11017, 0x0000 }, { 11017, 0x0010 }, { 11018, 0x2000 }, /* 0x23A80 */ { 11019, 0x0000 }, { 11019, 0x0100 }, { 11020, 0x0000 }, { 11020, 0x0000 }, /* 0x23C40 */ { 11020, 0x0000 }, { 11020, 0x0000 }, { 11020, 0x0000 }, { 11020, 0x8000 }, /* 0x23CC0 */ { 11021, 0x0000 }, { 11021, 0x0000 }, { 11021, 0x0000 }, { 11021, 0x4000 }, /* 0x23D00 */ { 11022, 0x4001 }, { 11024, 0x0000 }, { 11024, 0x0000 }, { 11024, 0x0000 }, /* 0x23D40 */ { 11024, 0x0001 }, { 11025, 0x0000 }, { 11025, 0x0000 }, { 11025, 0x0000 }, /* 0x23DC0 */ { 11025, 0x0000 }, { 11025, 0x0008 }, { 11026, 0x0000 }, { 11026, 0x0600 }, /* 0x23F40 */ { 11028, 0x0000 }, { 11028, 0x0000 }, { 11028, 0x0000 }, { 11028, 0x4000 }, /* 0x24080 */ { 11029, 0x0000 }, { 11029, 0x0040 }, { 11030, 0x0000 }, { 11030, 0x0000 }, /* 0x24100 */ { 11030, 0x0008 }, { 11031, 0x0000 }, { 11031, 0x0000 }, { 11031, 0x0000 }, /* 0x241C0 */ { 11031, 0x0040 }, { 11032, 0x0000 }, { 11032, 0x0000 }, { 11032, 0x4000 }, /* 0x24380 */ { 11033, 0x0000 }, { 11033, 0x0000 }, { 11033, 0x0000 }, { 11033, 0x1000 }, /* 0x24600 */ { 11034, 0x0000 }, { 11034, 0x0000 }, { 11034, 0x0200 }, { 11035, 0x0000 }, /* 0x24680 */ { 11035, 0x0000 }, { 11035, 0x0000 }, { 11035, 0x0020 }, { 11036, 0x0000 }, /* 0x247C0 */ { 11036, 0x0000 }, { 11036, 0x0000 }, { 11036, 0x0000 }, { 11036, 0x0002 }, /* 0x24880 */ { 11037, 0x0000 }, { 11037, 0x0040 }, { 11038, 0x0000 }, { 11038, 0x0000 }, /* 0x24A40 */ { 11038, 0x2000 }, { 11039, 0x0000 }, { 11039, 0x0000 }, { 11039, 0x0000 }, /* 0x24B40 */ { 11039, 0x0000 }, { 11039, 0x0040 }, { 11040, 0x8000 }, { 11041, 0x0000 }, /* 0x24C00 */ { 11041, 0x0000 }, { 11041, 0x0040 }, { 11042, 0x0000 }, { 11042, 0x0000 }, /* 0x24D00 */ { 11042, 0x0000 }, { 11042, 0x0010 }, { 11043, 0x0000 }, { 11043, 0x0000 }, /* 0x24E00 */ { 11043, 0x4000 }, { 11044, 0x0000 }, { 11044, 0x0000 }, { 11044, 0x0080 }, /* 0x24E40 */ { 11045, 0x0000 }, { 11045, 0x0000 }, { 11045, 0x0400 }, { 11046, 0x0000 }, /* 0x24E80 */ { 11046, 0x0800 }, { 11047, 0x0000 }, { 11047, 0x0000 }, { 11047, 0x0000 }, /* 0x25040 */ { 11047, 0x0400 }, { 11048, 0x0020 }, { 11049, 0x0000 }, { 11049, 0x0000 }, /* 0x25100 */ { 11049, 0x0000 }, { 11049, 0x0000 }, { 11049, 0x0004 }, { 11050, 0x0000 }, /* 0x25180 */ { 11050, 0x0000 }, { 11050, 0x0000 }, { 11050, 0x0200 }, { 11051, 0x0000 }, /* 0x251C0 */ { 11051, 0x2000 }, { 11052, 0x0000 }, { 11052, 0x0020 }, { 11053, 0x0000 }, /* 0x25200 */ { 11053, 0x0000 }, { 11053, 0x4000 }, { 11054, 0x0000 }, { 11054, 0x0000 }, /* 0x25240 */ { 11054, 0x1000 }, { 11055, 0x0000 }, { 11055, 0x0000 }, { 11055, 0x0000 }, /* 0x25400 */ { 11055, 0x0000 }, { 11055, 0x0000 }, { 11055, 0x4000 }, { 11056, 0x0000 }, /* 0x25480 */ { 11056, 0x4000 }, { 11057, 0x0000 }, { 11057, 0x0000 }, { 11057, 0x0000 }, /* 0x254C0 */ { 11057, 0x0000 }, { 11057, 0x0200 }, { 11058, 0x0000 }, { 11058, 0x0000 }, /* 0x25500 */ { 11058, 0x4000 }, { 11059, 0x0000 }, { 11059, 0x0000 }, { 11059, 0x0000 }, /* 0x25580 */ { 11059, 0x0000 }, { 11059, 0x0000 }, { 11059, 0x0080 }, { 11060, 0x0000 }, /* 0x25740 */ { 11060, 0x0000 }, { 11060, 0x0000 }, { 11060, 0x0000 }, { 11060, 0x0002 }, /* 0x25780 */ { 11061, 0x0000 }, { 11061, 0x0000 }, { 11061, 0x0200 }, { 11062, 0x0010 }, /* 0x259C0 */ { 11063, 0x0010 }, { 11064, 0x0010 }, { 11065, 0x0000 }, { 11065, 0x0000 }, /* 0x25AC0 */ { 11065, 0x0000 }, { 11065, 0x0000 }, { 11065, 0x0018 }, { 11067, 0x0002 }, /* 0x25B80 */ { 11068, 0x0000 }, { 11068, 0x0000 }, { 11068, 0x0000 }, { 11068, 0x0004 }, /* 0x25C40 */ { 11069, 0x0800 }, { 11070, 0x0000 }, { 11070, 0x0010 }, { 11071, 0x0000 }, /* 0x25D80 */ { 11071, 0x0000 }, { 11071, 0x0000 }, { 11071, 0x0002 }, { 11072, 0x0000 }, /* 0x25E00 */ { 11072, 0x0000 }, { 11072, 0x0000 }, { 11072, 0x4000 }, { 11073, 0x0000 }, /* 0x25E40 */ { 11073, 0x0000 }, { 11073, 0x0040 }, { 11074, 0x0024 }, { 11076, 0x0000 }, /* 0x25EC0 */ { 11076, 0x0004 }, { 11077, 0x0100 }, { 11078, 0x0100 }, { 11079, 0x0000 }, /* 0x25F00 */ { 11079, 0x0000 }, { 11079, 0x0000 }, { 11079, 0x0008 }, { 11080, 0x0000 }, /* 0x25F40 */ { 11080, 0x0000 }, { 11080, 0x1000 }, { 11081, 0x0000 }, { 11081, 0x0000 }, /* 0x25FC0 */ { 11081, 0x0000 }, { 11081, 0x0010 }, { 11082, 0x0001 }, { 11083, 0x0800 }, /* 0x26000 */ { 11084, 0x1000 }, { 11085, 0x0080 }, { 11086, 0x0000 }, { 11086, 0x0000 }, /* 0x26040 */ { 11086, 0x0000 }, { 11086, 0x0000 }, { 11086, 0x0001 }, { 11087, 0x0000 }, /* 0x260C0 */ { 11087, 0x0000 }, { 11087, 0x0000 }, { 11087, 0x2000 }, { 11088, 0x0000 }, /* 0x26240 */ { 11088, 0x0000 }, { 11088, 0x0000 }, { 11088, 0x0000 }, { 11088, 0x0001 }, /* 0x26280 */ { 11089, 0x0040 }, { 11090, 0x0000 }, { 11090, 0x0000 }, { 11090, 0x0000 }, /* 0x26340 */ { 11090, 0x1000 }, { 11091, 0x0000 }, { 11091, 0x0000 }, { 11091, 0x0000 }, /* 0x26400 */ { 11091, 0x0004 }, { 11092, 0x0000 }, { 11092, 0x0000 }, { 11092, 0x0000 }, /* 0x26640 */ { 11092, 0x0000 }, { 11092, 0x0000 }, { 11092, 0x0000 }, { 11092, 0x4000 }, /* 0x26680 */ { 11093, 0x0000 }, { 11093, 0x0000 }, { 11093, 0x0000 }, { 11093, 0x0001 }, /* 0x26700 */ { 11094, 0x0000 }, { 11094, 0x2000 }, { 11095, 0x0000 }, { 11095, 0x0000 }, /* 0x268C0 */ { 11095, 0x0000 }, { 11095, 0x2000 }, { 11096, 0x0400 }, { 11097, 0x0000 }, /* 0x26940 */ { 11097, 0x0000 }, { 11097, 0x0002 }, { 11098, 0x8000 }, { 11099, 0x0000 }, /* 0x269C0 */ { 11099, 0x0000 }, { 11099, 0x2000 }, { 11100, 0x0000 }, { 11100, 0x0000 }, /* 0x26A00 */ { 11100, 0x0000 }, { 11100, 0x4000 }, { 11101, 0x0000 }, { 11101, 0x0000 }, /* 0x26A40 */ { 11101, 0x0000 }, { 11101, 0x0100 }, { 11102, 0x0000 }, { 11102, 0x0000 }, /* 0x26A80 */ { 11102, 0x1000 }, { 11103, 0x0000 }, { 11103, 0x0000 }, { 11103, 0x0080 }, /* 0x26AC0 */ { 11104, 0x0000 }, { 11104, 0x0000 }, { 11104, 0x0000 }, { 11104, 0x8000 }, /* 0x26C00 */ { 11105, 0x0000 }, { 11105, 0x0000 }, { 11105, 0x0200 }, { 11106, 0x0000 }, /* 0x26C40 */ { 11106, 0x0000 }, { 11106, 0x0000 }, { 11106, 0x0000 }, { 11106, 0x0008 }, /* 0x26CC0 */ { 11107, 0x0000 }, { 11107, 0x2000 }, { 11108, 0x0000 }, { 11108, 0x0000 }, /* 0x26E40 */ { 11108, 0x0001 }, { 11109, 0x0000 }, { 11109, 0x0020 }, { 11110, 0x0000 }, /* 0x26F80 */ { 11110, 0x0000 }, { 11110, 0x0010 }, { 11111, 0x0000 }, { 11111, 0x0000 }, /* 0x26FC0 */ { 11111, 0x0000 }, { 11111, 0x0000 }, { 11111, 0x0000 }, { 11111, 0x01c0 }, /* 0x270C0 */ { 11114, 0x0000 }, { 11114, 0x0000 }, { 11114, 0x0000 }, { 11114, 0x0010 }, /* 0x27100 */ { 11115, 0x2000 }, { 11116, 0x0000 }, { 11116, 0x0000 }, { 11116, 0x0200 }, /* 0x273C0 */ { 11117, 0x0000 }, { 11117, 0x0c00 }, { 11119, 0x0000 }, { 11119, 0x4000 }, /* 0x27400 */ { 11120, 0x0000 }, { 11120, 0x0001 }, { 11121, 0x0000 }, { 11121, 0x0000 }, /* 0x27440 */ { 11121, 0x0200 }, { 11122, 0x0000 }, { 11122, 0x0000 }, { 11122, 0x0000 }, /* 0x27600 */ { 11122, 0x0000 }, { 11122, 0x0030 }, { 11124, 0x0000 }, { 11124, 0x0002 }, /* 0x27680 */ { 11125, 0x0010 }, { 11126, 0x0008 }, { 11127, 0x0000 }, { 11127, 0x0000 }, /* 0x27700 */ { 11127, 0x4000 }, { 11128, 0x0000 }, { 11128, 0x0008 }, { 11129, 0x0000 }, /* 0x27740 */ { 11129, 0x0000 }, { 11129, 0x0004 }, { 11130, 0x0000 }, { 11130, 0x0000 }, /* 0x27980 */ { 11130, 0x0020 }, { 11131, 0x0000 }, { 11131, 0x0000 }, { 11131, 0x0000 }, /* 0x27A80 */ { 11131, 0x0010 }, { 11132, 0x0000 }, { 11132, 0x0000 }, { 11132, 0x0000 }, /* 0x27B80 */ { 11132, 0x0000 }, { 11132, 0x0000 }, { 11132, 0x0000 }, { 11132, 0x4008 }, /* 0x27BC0 */ { 11134, 0x0080 }, { 11135, 0x0000 }, { 11135, 0x0000 }, { 11135, 0x0000 }, /* 0x27C80 */ { 11135, 0x0000 }, { 11135, 0x0000 }, { 11135, 0x0000 }, { 11135, 0x0100 }, /* 0x27D80 */ { 11136, 0x0000 }, { 11136, 0x0000 }, { 11136, 0x0001 }, { 11137, 0x0000 }, /* 0x27E00 */ { 11137, 0x0000 }, { 11137, 0x0001 }, { 11138, 0x0000 }, { 11138, 0x0000 }, /* 0x27F80 */ { 11138, 0x0000 }, { 11138, 0x0000 }, { 11138, 0x0000 }, { 11138, 0x0080 }, /* 0x28080 */ { 11139, 0x0400 }, { 11140, 0x0000 }, { 11140, 0x0000 }, { 11140, 0x0800 }, /* 0x28240 */ { 11141, 0x0000 }, { 11141, 0x0000 }, { 11141, 0x0000 }, { 11141, 0x0080 }, /* 0x28280 */ { 11142, 0x0004 }, { 11143, 0x0000 }, { 11143, 0x0000 }, { 11143, 0x0000 }, /* 0x282C0 */ { 11143, 0x0000 }, { 11143, 0x0000 }, { 11143, 0x0000 }, { 11143, 0x0008 }, /* 0x283C0 */ { 11144, 0x2000 }, { 11145, 0x0000 }, { 11145, 0x0000 }, { 11145, 0x0000 }, /* 0x28400 */ { 11145, 0x1000 }, { 11146, 0x0000 }, { 11146, 0x0000 }, { 11146, 0x0000 }, /* 0x28440 */ { 11146, 0x0000 }, { 11146, 0x0020 }, { 11147, 0x0000 }, { 11147, 0x0000 }, /* 0x28540 */ { 11147, 0x0000 }, { 11147, 0x0000 }, { 11147, 0x0800 }, { 11148, 0x0000 }, /* 0x285C0 */ { 11148, 0x0300 }, { 11150, 0x0000 }, { 11150, 0x0000 }, { 11150, 0x0000 }, /* 0x286C0 */ { 11150, 0x0000 }, { 11150, 0x0080 }, { 11151, 0x0000 }, { 11151, 0x0400 }, /* 0x28940 */ { 11152, 0x0240 }, { 11154, 0x0000 }, { 11154, 0x0800 }, { 11155, 0x0000 }, /* 0x28980 */ { 11155, 0x0180 }, { 11157, 0x0000 }, { 11157, 0x0000 }, { 11157, 0x0c00 }, /* 0x28A00 */ { 11159, 0x0000 }, { 11159, 0x4000 }, { 11160, 0x0200 }, { 11161, 0x0000 }, /* 0x28A40 */ { 11161, 0x0008 }, { 11162, 0x0000 }, { 11162, 0x0000 }, { 11162, 0x0002 }, /* 0x28A80 */ { 11163, 0x0000 }, { 11163, 0x0200 }, { 11164, 0x0000 }, { 11164, 0x0000 }, /* 0x28AC0 */ { 11164, 0x2000 }, { 11165, 0x2000 }, { 11166, 0x0010 }, { 11167, 0x0000 }, /* 0x28BC0 */ { 11167, 0x0002 }, { 11168, 0x0000 }, { 11168, 0x8000 }, { 11169, 0x0000 }, /* 0x28D00 */ { 11169, 0x0000 }, { 11169, 0x0001 }, { 11170, 0x0000 }, { 11170, 0x0000 }, /* 0x28D40 */ { 11170, 0x0000 }, { 11170, 0x0000 }, { 11170, 0x0000 }, { 11170, 0x0002 }, /* 0x28DC0 */ { 11171, 0x0000 }, { 11171, 0x0000 }, { 11171, 0x0000 }, { 11171, 0x0800 }, /* 0x28E00 */ { 11172, 0x0000 }, { 11172, 0x8000 }, { 11173, 0x0000 }, { 11173, 0x0040 }, /* 0x28E80 */ { 11174, 0x0200 }, { 11175, 0x0000 }, { 11175, 0x0000 }, { 11175, 0x0000 }, /* 0x28EC0 */ { 11175, 0x0000 }, { 11175, 0x0000 }, { 11175, 0x0800 }, { 11176, 0x0000 }, /* 0x28F00 */ { 11176, 0x0000 }, { 11176, 0x0000 }, { 11176, 0x0000 }, { 11176, 0x0004 }, /* 0x28FC0 */ { 11177, 0x0000 }, { 11177, 0x0000 }, { 11177, 0x0000 }, { 11177, 0x0100 }, /* 0x29280 */ { 11178, 0x0000 }, { 11178, 0x0000 }, { 11178, 0x0001 }, { 11179, 0x0002 }, /* 0x29480 */ { 11180, 0x0000 }, { 11180, 0x0001 }, { 11181, 0x0000 }, { 11181, 0x0000 }, /* 0x295C0 */ { 11181, 0x8000 }, { 11182, 0x0000 }, { 11182, 0x0000 }, { 11182, 0x0000 }, /* 0x29640 */ { 11182, 0x0000 }, { 11182, 0x0000 }, { 11182, 0x0000 }, { 11182, 0x8000 }, /* 0x296C0 */ { 11183, 0x0000 }, { 11183, 0x0000 }, { 11183, 0x0000 }, { 11183, 0x0001 }, /* 0x29700 */ { 11184, 0x0000 }, { 11184, 0x0200 }, { 11185, 0x0000 }, { 11185, 0x0000 }, /* 0x29740 */ { 11185, 0x0000 }, { 11185, 0x0001 }, { 11186, 0x0000 }, { 11186, 0x0000 }, /* 0x298C0 */ { 11186, 0x0040 }, { 11187, 0x0000 }, { 11187, 0x0000 }, { 11187, 0x0000 }, /* 0x29A40 */ { 11187, 0x0000 }, { 11187, 0x0000 }, { 11187, 0x0000 }, { 11187, 0x0004 }, /* 0x29DC0 */ { 11188, 0x0000 }, { 11188, 0x0800 }, { 11189, 0x0000 }, { 11189, 0x0000 }, /* 0x29E00 */ { 11189, 0x0000 }, { 11189, 0x0020 }, { 11190, 0x0000 }, { 11190, 0x2000 }, /* 0x29E40 */ { 11191, 0x0200 }, { 11192, 0x0000 }, { 11192, 0x0000 }, { 11192, 0x0000 }, /* 0x29E80 */ { 11192, 0x0400 }, { 11193, 0x0000 }, { 11193, 0x0000 }, { 11193, 0x0000 }, /* 0x29EC0 */ { 11193, 0x0010 }, { 11194, 0x0800 }, { 11195, 0x0200 }, { 11196, 0x0000 }, /* 0x29FC0 */ { 11196, 0x4000 }, { 11197, 0x0000 }, { 11197, 0x0000 }, { 11197, 0x0000 }, /* 0x2A000 */ { 11197, 0x0000 }, { 11197, 0x0400 }, { 11198, 0x8000 }, { 11199, 0x0000 }, /* 0x2A080 */ { 11199, 0x0004 }, { 11200, 0x0000 }, { 11200, 0x0000 }, { 11200, 0x0000 }, /* 0x2A0C0 */ { 11200, 0x0000 }, { 11200, 0x0000 }, { 11200, 0x0000 }, { 11200, 0x0200 }, /* 0x2A180 */ { 11201, 0x0000 }, { 11201, 0x0001 }, { 11202, 0x0000 }, { 11202, 0x0000 }, /* 0x2A380 */ { 11202, 0x1000 }, { 11203, 0x0000 }, { 11203, 0x0000 }, { 11203, 0x0000 }, /* 0x2A400 */ { 11203, 0x0000 }, { 11203, 0x0000 }, { 11203, 0x0000 }, { 11203, 0x0080 }, /* 0x2A5C0 */ { 11204, 0x0000 }, { 11204, 0x0000 }, { 11204, 0x0000 }, { 11204, 0x0002 }, /* 0x2A600 */ { 11205, 0x0004 }, { 11206, 0x0400 }, { 11207, 0x0000 }, { 11207, 0x0000 }, /* 0x2A680 */ { 11207, 0x0000 }, { 11207, 0x0000 }, { 11207, 0x0000 }, { 11207, 0x0004 }, }; #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static ucs4_t jisx0213_to_ucs4 (unsigned int row, unsigned int col) { ucs4_t val; if (row >= 0x121 && row <= 0x17e) row -= 289; else if (row == 0x221) row -= 451; else if (row >= 0x223 && row <= 0x225) row -= 452; else if (row == 0x228) row -= 454; else if (row >= 0x22c && row <= 0x22f) row -= 457; else if (row >= 0x26e && row <= 0x27e) row -= 519; else return 0x0000; if (col >= 0x21 && col <= 0x7e) col -= 0x21; else return 0x0000; val = jisx0213_to_ucs_main[row * 94 + col]; val = jisx0213_to_ucs_pagestart[val >> 8] + (val & 0xff); if (val == 0xfffd) val = 0x0000; return val; } #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static unsigned short ucs4_to_jisx0213 (ucs4_t ucs) { if (ucs < (sizeof(jisx0213_from_ucs_level1)/sizeof(jisx0213_from_ucs_level1[0])) << 6) { int index1 = jisx0213_from_ucs_level1[ucs >> 6]; if (index1 >= 0) { const Summary16 *summary = &jisx0213_from_ucs_level2_2indx[((index1 << 6) + (ucs & 0x3f)) >> 4]; unsigned short used = summary->used; unsigned int i = ucs & 0x0f; if (used & ((unsigned short) 1 << i)) { /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' 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); return jisx0213_from_ucs_level2_data[summary->indx + used]; }; }; } return 0x0000; } #endif /* _JISX0213_H */ freelan-2.0/third-party/source/libiconv-msvc/include/johab.h000066400000000000000000000105221252300335000241610ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2007 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * JOHAB */ /* Conversion between JOHAB codes (s1,s2) and KSX1001 codes (c1,c2): Example. (s1,s2) = 0xD931, (c1,c2) = 0x2121. (s1,s2) = 0xDEF1, (c1,c2) = 0x2C71. (s1,s2) = 0xE031, (c1,c2) = 0x4A21. (s1,s2) = 0xF9FE, (c1,c2) = 0x7D7E. 0xD9 <= s1 <= 0xDE || 0xE0 <= s1 <= 0xF9, 0x31 <= s2 <= 0x7E || 0x91 <= s2 <= 0xFE, 0x21 <= c1 <= 0x2C || 0x4A <= c1 <= 0x7D, 0x21 <= c2 <= 0x7E. Invariant: 94*(s1 < 0xE0 ? 2*s1-0x1B2 : 2*s1-0x197) + (s2 < 0x91 ? s2-0x31 : s2-0x43) = 94*(c1-0x21)+(c2-0x21) Conversion (s1,s2) -> (c1,c2): t1 := (s1 < 0xE0 ? 2*s1-0x1B2 : 2*s1-0x197) t2 := (s2 < 0x91 ? s2-0x31 : s2-0x43) c1 := t1 + (t2 < 0x5E ? 0 : 1) + 0x21 c2 := (t2 < 0x5E ? t2 : t2-0x5E) + 0x21 Conversion (c1,c2) -> (s1,s2): t := (c1 < 0x4A ? (c1-0x21+0x1B2) : (c1-0x21+0x197)) s1 := t >> 1 t2 := (t & 1) * 0x5E + (c2 - 0x21) s2 := (t2 < 0x4E ? t2+0x31 : t2+0x43) */ static int johab_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { if (c == 0x5c) *pwc = (ucs4_t) 0x20a9; else *pwc = (ucs4_t) c; return 1; } else if (c < 0xd8) { return johab_hangul_mbtowc(conv,pwc,s,n); } else { unsigned char s1, s2; s1 = c; if ((s1 >= 0xd9 && s1 <= 0xde) || (s1 >= 0xe0 && s1 <= 0xf9)) { if (n < 2) return RET_TOOFEW(0); s2 = s[1]; if ((s2 >= 0x31 && s2 <= 0x7e) || (s2 >= 0x91 && s2 <= 0xfe)) { /* In KSC 5601, now KS X 1001, the region s1 = 0xDA, 0xA1 <= s2 <= 0xD3 contains the 51 Jamo (Hangul letters). But in the Johab encoding, they have been moved to the Hangul section, see johab_hangul_page31. */ if (!(s1 == 0xda && (s2 >= 0xa1 && s2 <= 0xd3))) { unsigned char t1 = (s1 < 0xe0 ? 2*(s1-0xd9) : 2*s1-0x197); unsigned char t2 = (s2 < 0x91 ? s2-0x31 : s2-0x43); unsigned char buf[2]; buf[0] = t1 + (t2 < 0x5e ? 0 : 1) + 0x21; buf[1] = (t2 < 0x5e ? t2 : t2-0x5e) + 0x21; return ksc5601_mbtowc(conv,pwc,buf,2); } } } return RET_ILSEQ; } } static int johab_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; /* Try ASCII variation. */ if (wc < 0x0080 && wc != 0x005c) { *r = wc; return 1; } if (wc == 0x20a9) { *r = 0x5c; return 1; } /* Try JOHAB Hangul table before KSC5601 table, because the KSC5601 table contains some (2350 out of 11172) Hangul syllables (rows 0x30XX..0x48XX), and we want the search to return the JOHAB Hangul table entry. */ /* Try JOHAB Hangul. */ ret = johab_hangul_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]; r[1] = buf[1]; return 2; } /* Try KSC5601, now KS X 1001. */ ret = ksc5601_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { unsigned char c1, c2; if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; c1 = buf[0]; c2 = buf[1]; if (((c1 >= 0x21 && c1 <= 0x2c) || (c1 >= 0x4a && c1 <= 0x7d)) && (c2 >= 0x21 && c2 <= 0x7e)) { unsigned int t = (c1 < 0x4A ? (c1-0x21+0x1B2) : (c1-0x21+0x197)); unsigned char t2 = ((t & 1) ? 0x5e : 0) + (c2 - 0x21); r[0] = t >> 1; r[1] = (t2 < 0x4e ? t2+0x31 : t2+0x43); return 2; } } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/johab_hangul.h000066400000000000000000000240451252300335000255240ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * JOHAB Hangul * * Ken Lunde writes in his "CJKV Information Processing" book, p. 114: * "Hangul can be composed of two or three jamo (some jamo are considered * compound). Johab uses 19 initial jamo (consonants), 21 medial jamo (vowels) * and 27 final jamo (consonants; 28 when you include the "fill" character * for Hangul containing only two jamo). Multiplying these numbers results in * 11172." * * Structure of the Johab encoding (see p. 181-184): * bit 15 = 1 * bit 14..10 = initial jamo, only 19+1 out of 32 possible values are used * bit 9..5 = medial jamo, only 21+1 out of 32 possible values are used * bit 4..0 = final jamo, only 27+1 out of 32 possible values are used * * Structure of the Unicode encoding: * grep '^0x\([8-C]...\|D[0-7]..\)' unicode.org-mappings/EASTASIA/KSC/JOHAB.TXT * You see that all characters there are marked "HANGUL LETTER" or "HANGUL * SYLLABLE". If you eliminate the "HANGUL LETTER"s, the table is sorted * in ascending order according to Johab encoding and according to the Unicode * encoding. Now look a little more carefully, and you see that the following * formula holds: * unicode == 0xAC00 * + 21 * 28 * (jamo_initial_index[(johab >> 10) & 31] - 1) * + 28 * (jamo_medial_index[(johab >> 5) & 31] - 1) * + jamo_final_index[johab & 31] * where the index tables are defined as below. */ /* Tables mapping 5-bit groups to jamo letters. */ /* Note that Jamo XX = UHC 0xA4A0+XX = Unicode 0x3130+XX */ #define NONE 0xfd #define FILL 0xff static const unsigned char jamo_initial[32] = { NONE, FILL, 0x01, 0x02, 0x04, 0x07, 0x08, 0x09, 0x11, 0x12, 0x13, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, }; static const unsigned char jamo_medial[32] = { NONE, NONE, FILL, 0x1f, 0x20, 0x21, 0x22, 0x23, NONE, NONE, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, NONE, NONE, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, NONE, NONE, 0x30, 0x31, 0x32, 0x33, NONE, NONE, }; static const unsigned char jamo_final[32] = { NONE, FILL, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, NONE, 0x12, 0x14, 0x15, 0x16, 0x17, 0x18, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, NONE, NONE, }; /* Same as jamo_final, except that it excludes characters already contained in jamo_initial. 11 characters instead of 27. */ static const unsigned char jamo_final_notinitial[32] = { NONE, NONE, NONE, NONE, 0x03, NONE, 0x05, 0x06, NONE, NONE, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, NONE, NONE, NONE, 0x14, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, }; /* Tables mapping 5-bit groups to packed indices. */ #define none -1 #define fill 0 static const signed char jamo_initial_index[32] = { none, fill, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, none, none, none, none, none, none, none, none, none, none, none, }; static const signed char jamo_medial_index[32] = { none, none, fill, 0x01, 0x02, 0x03, 0x04, 0x05, none, none, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, none, none, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, none, none, 0x12, 0x13, 0x14, 0x15, none, none, }; static const signed char jamo_final_index[32] = { none, fill, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, none, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, none, none, }; static int johab_hangul_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x84 && c1 <= 0xd3)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x41 && c2 < 0x7f) || (c2 >= 0x81 && c2 < 0xff)) { unsigned int johab = (c1 << 8) | c2; unsigned int bitspart1 = (johab >> 10) & 31; unsigned int bitspart2 = (johab >> 5) & 31; unsigned int bitspart3 = johab & 31; int index1 = jamo_initial_index[bitspart1]; int index2 = jamo_medial_index[bitspart2]; int index3 = jamo_final_index[bitspart3]; /* Exclude "none" values. */ if (index1 >= 0 && index2 >= 0 && index3 >= 0) { /* Deal with "fill" values in initial or medial position. */ if (index1 == fill) { if (index2 == fill) { unsigned char jamo3 = jamo_final_notinitial[bitspart3]; if (jamo3 != NONE) { *pwc = (ucs4_t) 0x3130 + jamo3; return 2; } } else if (index3 == fill) { unsigned char jamo2 = jamo_medial[bitspart2]; if (jamo2 != NONE && jamo2 != FILL) { *pwc = (ucs4_t) 0x3130 + jamo2; return 2; } } /* Syllables composed only of medial and final don't exist. */ } else if (index2 == fill) { if (index3 == fill) { unsigned char jamo1 = jamo_initial[bitspart1]; if (jamo1 != NONE && jamo1 != FILL) { *pwc = (ucs4_t) 0x3130 + jamo1; return 2; } } /* Syllables composed only of initial and final don't exist. */ } else { /* index1 and index2 are not fill, but index3 may be fill. */ /* Nothing more to exclude. All 11172 code points are valid. */ *pwc = 0xac00 + ((index1 - 1) * 21 + (index2 - 1)) * 28 + index3; return 2; } } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } /* 51 Jamo: 19 initial, 21 medial, 11 final not initial. */ static const unsigned short johab_hangul_page31[51] = { 0x8841, 0x8c41, 0x8444, 0x9041, 0x8446, 0x8447, 0x9441, /*0x30-0x37*/ 0x9841, 0x9c41, 0x844a, 0x844b, 0x844c, 0x844d, 0x844e, 0x844f, /*0x38-0x3f*/ 0x8450, 0xa041, 0xa441, 0xa841, 0x8454, 0xac41, 0xb041, 0xb441, /*0x40-0x47*/ 0xb841, 0xbc41, 0xc041, 0xc441, 0xc841, 0xcc41, 0xd041, 0x8461, /*0x48-0x4f*/ 0x8481, 0x84a1, 0x84c1, 0x84e1, 0x8541, 0x8561, 0x8581, 0x85a1, /*0x50-0x57*/ 0x85c1, 0x85e1, 0x8641, 0x8661, 0x8681, 0x86a1, 0x86c1, 0x86e1, /*0x58-0x5f*/ 0x8741, 0x8761, 0x8781, 0x87a1, /*0x60-0x67*/ }; /* Tables mapping packed indices to 5-bit groups. */ /* index1+1 = jamo_initial_index[bitspart1] <==> bitspart1 = jamo_initial_index_inverse[index1] */ static const char jamo_initial_index_inverse[19] = { 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, }; /* index2+1 = jamo_medial_index[bitspart2] <==> bitspart2 = jamo_medial_index_inverse[index2] */ static const char jamo_medial_index_inverse[21] = { 0x03, 0x04, 0x05, 0x06, 0x07, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1a, 0x1b, 0x1c, 0x1d, }; /* index3 = jamo_final_index[bitspart3] <==> bitspart3 = jamo_final_index_inverse[index3] */ static const char jamo_final_index_inverse[28] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, }; static int johab_hangul_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { if (wc >= 0x3131 && wc < 0x3164) { unsigned short c = johab_hangul_page31[wc-0x3131]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } else if (wc >= 0xac00 && wc < 0xd7a4) { unsigned int index1; unsigned int index2; unsigned int index3; unsigned short c; unsigned int tmp = wc - 0xac00; index3 = tmp % 28; tmp = tmp / 28; index2 = tmp % 21; tmp = tmp / 21; index1 = tmp; c = (((((1 << 5) | jamo_initial_index_inverse[index1]) << 5) | jamo_medial_index_inverse[index2]) << 5) | jamo_final_index_inverse[index3]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } return RET_ILUNI; } return RET_TOOSMALL; } /* * Decomposition of JOHAB Hangul in one to three Johab Jamo elements. */ /* Decompose wc into r[0..2], and return the number of resulting Jamo elements. Return RET_ILUNI if decomposition is not possible. */ static int johab_hangul_decompose (conv_t conv, ucs4_t* r, ucs4_t wc) { unsigned char buf[2]; int ret = johab_hangul_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { unsigned int hangul = (buf[0] << 8) | buf[1]; unsigned char jamo1 = jamo_initial[(hangul >> 10) & 31]; unsigned char jamo2 = jamo_medial[(hangul >> 5) & 31]; unsigned char jamo3 = jamo_final[hangul & 31]; if ((hangul >> 15) != 1) abort(); if (jamo1 != NONE && jamo2 != NONE && jamo3 != NONE) { /* They are not all three == FILL because that would correspond to johab = 0x8441, which doesn't exist. */ ucs4_t* p = r; if (jamo1 != FILL) *p++ = 0x3130 + jamo1; if (jamo2 != FILL) *p++ = 0x3130 + jamo2; if (jamo3 != FILL) *p++ = 0x3130 + jamo3; return p-r; } } return RET_ILUNI; } #undef fill #undef none #undef FILL #undef NONE freelan-2.0/third-party/source/libiconv-msvc/include/koi8_r.h000066400000000000000000000152361252300335000243000ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * KOI8-R */ /* Specification: RFC 1489 */ static const unsigned short koi8_r_2uni[128] = { /* 0x80 */ 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, /* 0x90 */ 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7, /* 0xa0 */ 0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, /* 0xb0 */ 0x255f, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x00a9, /* 0xc0 */ 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, /* 0xd0 */ 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, /* 0xe0 */ 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, /* 0xf0 */ 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a, }; static int koi8_r_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) koi8_r_2uni[c-0x80]; return 1; } static const unsigned char koi8_r_page00[88] = { 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x9c, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x9e, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, /* 0xf0-0xf7 */ }; static const unsigned char koi8_r_page04[88] = { 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa, /* 0x10-0x17 */ 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, /* 0x18-0x1f */ 0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe, /* 0x20-0x27 */ 0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1, /* 0x28-0x2f */ 0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda, /* 0x30-0x37 */ 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, /* 0x38-0x3f */ 0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde, /* 0x40-0x47 */ 0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1, /* 0x48-0x4f */ 0x00, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ }; static const unsigned char koi8_r_page22[80] = { 0x00, 0x95, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x99, 0x00, 0x00, /* 0x60-0x67 */ }; static const unsigned char koi8_r_page23[8] = { 0x93, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char koi8_r_page25[168] = { 0x80, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x83, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x85, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xa0, 0xa1, 0xa2, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, /* 0x50-0x57 */ 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, /* 0x58-0x5f */ 0xb1, 0xb2, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, /* 0x60-0x67 */ 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x8b, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x8d, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x8f, 0x90, 0x91, 0x92, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int koi8_r_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00f8) c = koi8_r_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0458) c = koi8_r_page04[wc-0x0400]; else if (wc >= 0x2218 && wc < 0x2268) c = koi8_r_page22[wc-0x2218]; else if (wc >= 0x2320 && wc < 0x2328) c = koi8_r_page23[wc-0x2320]; else if (wc >= 0x2500 && wc < 0x25a8) c = koi8_r_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/koi8_ru.h000066400000000000000000000162371252300335000244670ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * KOI8-RU */ static const unsigned short koi8_ru_2uni[128] = { /* 0x80 */ 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, /* 0x90 */ 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7, /* 0xa0 */ 0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x0491, 0x045e, 0x255e, /* 0xb0 */ 0x255f, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406, 0x0407, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x0490, 0x040e, 0x00a9, /* 0xc0 */ 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, /* 0xd0 */ 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, /* 0xe0 */ 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, /* 0xf0 */ 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a, }; static int koi8_ru_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) koi8_ru_2uni[c-0x80]; return 1; } static const unsigned char koi8_ru_page00[88] = { 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x9c, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x9e, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, /* 0xf0-0xf7 */ }; static const unsigned char koi8_ru_page04[152] = { 0x00, 0xb3, 0x00, 0x00, 0xb4, 0x00, 0xb6, 0xb7, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x00, /* 0x08-0x0f */ 0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa, /* 0x10-0x17 */ 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, /* 0x18-0x1f */ 0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe, /* 0x20-0x27 */ 0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1, /* 0x28-0x2f */ 0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda, /* 0x30-0x37 */ 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, /* 0x38-0x3f */ 0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde, /* 0x40-0x47 */ 0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1, /* 0x48-0x4f */ 0x00, 0xa3, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xbd, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char koi8_ru_page22[80] = { 0x00, 0x95, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x99, 0x00, 0x00, /* 0x60-0x67 */ }; static const unsigned char koi8_ru_page23[8] = { 0x93, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char koi8_ru_page25[168] = { 0x80, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x83, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x85, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xa0, 0xa1, 0xa2, 0x00, 0xa5, 0x00, 0x00, 0xa8, /* 0x50-0x57 */ 0xa9, 0xaa, 0xab, 0xac, 0x00, 0x00, 0xaf, 0xb0, /* 0x58-0x5f */ 0xb1, 0xb2, 0x00, 0xb5, 0x00, 0x00, 0xb8, 0xb9, /* 0x60-0x67 */ 0xba, 0xbb, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x8b, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x8d, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x8f, 0x90, 0x91, 0x92, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int koi8_ru_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00f8) c = koi8_ru_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0498) c = koi8_ru_page04[wc-0x0400]; else if (wc >= 0x2218 && wc < 0x2268) c = koi8_ru_page22[wc-0x2218]; else if (wc >= 0x2320 && wc < 0x2328) c = koi8_ru_page23[wc-0x2320]; else if (wc >= 0x2500 && wc < 0x25a8) c = koi8_ru_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/koi8_t.h000066400000000000000000000136321252300335000243000ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * KOI8-T */ static const unsigned short koi8_t_2uni[128] = { /* 0x80 */ 0x049b, 0x0493, 0x201a, 0x0492, 0x201e, 0x2026, 0x2020, 0x2021, 0xfffd, 0x2030, 0x04b3, 0x2039, 0x04b2, 0x04b7, 0x04b6, 0xfffd, /* 0x90 */ 0x049a, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0xfffd, 0x2122, 0xfffd, 0x203a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xa0 */ 0xfffd, 0x04ef, 0x04ee, 0x0451, 0x00a4, 0x04e3, 0x00a6, 0x00a7, 0xfffd, 0xfffd, 0xfffd, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0xfffd, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x0401, 0xfffd, 0x04e2, 0x00b6, 0x00b7, 0xfffd, 0x2116, 0xfffd, 0x00bb, 0xfffd, 0xfffd, 0xfffd, 0x00a9, /* 0xc0 */ 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, /* 0xd0 */ 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, /* 0xe0 */ 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, /* 0xf0 */ 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a, }; static int koi8_t_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = koi8_t_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char koi8_t_page00[32] = { 0x00, 0x00, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0x00, 0xbf, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char koi8_t_page04[240] = { 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa, /* 0x10-0x17 */ 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, /* 0x18-0x1f */ 0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe, /* 0x20-0x27 */ 0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1, /* 0x28-0x2f */ 0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda, /* 0x30-0x37 */ 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, /* 0x38-0x3f */ 0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde, /* 0x40-0x47 */ 0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1, /* 0x48-0x4f */ 0x00, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x83, 0x81, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x90, 0x80, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x00, 0x00, 0x8c, 0x8a, 0x00, 0x00, 0x8e, 0x8d, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0xb5, 0xa5, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0xa1, /* 0xe8-0xef */ }; static const unsigned char koi8_t_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static const unsigned char koi8_t_page21[24] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static int koi8_t_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = koi8_t_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x04f0) c = koi8_t_page04[wc-0x0400]; else if (wc >= 0x2010 && wc < 0x2040) c = koi8_t_page20[wc-0x2010]; else if (wc >= 0x2110 && wc < 0x2128) c = koi8_t_page21[wc-0x2110]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/koi8_u.h000066400000000000000000000162571252300335000243070ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * KOI8-U */ /* Specification: RFC 2319 */ static const unsigned short koi8_u_2uni[128] = { /* 0x80 */ 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, /* 0x90 */ 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7, /* 0xa0 */ 0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x0491, 0x255d, 0x255e, /* 0xb0 */ 0x255f, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406, 0x0407, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x0490, 0x256c, 0x00a9, /* 0xc0 */ 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, /* 0xd0 */ 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, /* 0xe0 */ 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, /* 0xf0 */ 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a, }; static int koi8_u_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) koi8_u_2uni[c-0x80]; return 1; } static const unsigned char koi8_u_page00[88] = { 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x9c, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x9e, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, /* 0xf0-0xf7 */ }; static const unsigned char koi8_u_page04[152] = { 0x00, 0xb3, 0x00, 0x00, 0xb4, 0x00, 0xb6, 0xb7, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa, /* 0x10-0x17 */ 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, /* 0x18-0x1f */ 0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe, /* 0x20-0x27 */ 0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1, /* 0x28-0x2f */ 0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda, /* 0x30-0x37 */ 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, /* 0x38-0x3f */ 0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde, /* 0x40-0x47 */ 0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1, /* 0x48-0x4f */ 0x00, 0xa3, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xbd, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char koi8_u_page22[80] = { 0x00, 0x95, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x99, 0x00, 0x00, /* 0x60-0x67 */ }; static const unsigned char koi8_u_page23[8] = { 0x93, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char koi8_u_page25[168] = { 0x80, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x83, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x85, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xa0, 0xa1, 0xa2, 0x00, 0xa5, 0x00, 0x00, 0xa8, /* 0x50-0x57 */ 0xa9, 0xaa, 0xab, 0xac, 0x00, 0xae, 0xaf, 0xb0, /* 0x58-0x5f */ 0xb1, 0xb2, 0x00, 0xb5, 0x00, 0x00, 0xb8, 0xb9, /* 0x60-0x67 */ 0xba, 0xbb, 0xbc, 0x00, 0xbe, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x8b, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x8d, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x8f, 0x90, 0x91, 0x92, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int koi8_u_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00f8) c = koi8_u_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0498) c = koi8_u_page04[wc-0x0400]; else if (wc >= 0x2218 && wc < 0x2268) c = koi8_u_page22[wc-0x2218]; else if (wc >= 0x2320 && wc < 0x2328) c = koi8_u_page23[wc-0x2320]; else if (wc >= 0x2500 && wc < 0x25a8) c = koi8_u_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/ksc5601.h000066400000000000000000005535431252300335000242110ustar00rootroot00000000000000/* * Copyright (C) 1999-2007 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * KSC5601.1987-0, now KS X 1001:2002 */ static const unsigned short ksc5601_2uni_page21[1115] = { /* 0x21 */ 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, /* 0x22 */ 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, 0x20ac, 0x00ae, 0x327e, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x23 */ 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, /* 0x24 */ 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, /* 0x25 */ 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x26 */ 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, 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, /* 0x27 */ 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x28 */ 0x00c6, 0x00d0, 0x00aa, 0x0126, 0xfffd, 0x0132, 0xfffd, 0x013f, 0x0141, 0x00d8, 0x0152, 0x00ba, 0x00de, 0x0166, 0x014a, 0xfffd, 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, /* 0x29 */ 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, /* 0x2a */ 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x2b */ 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x2c */ 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, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 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 unsigned short ksc5601_2uni_page30[2350] = { /* 0x30 */ 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, /* 0x31 */ 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, /* 0x32 */ 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, /* 0x33 */ 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, /* 0x34 */ 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, /* 0x35 */ 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, /* 0x36 */ 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, /* 0x37 */ 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, /* 0x38 */ 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, /* 0x39 */ 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, /* 0x3a */ 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, /* 0x3b */ 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, /* 0x3c */ 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, /* 0x3d */ 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, /* 0x3e */ 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, /* 0x3f */ 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, /* 0x40 */ 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, /* 0x41 */ 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, /* 0x42 */ 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, /* 0x43 */ 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, /* 0x44 */ 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, /* 0x45 */ 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, /* 0x46 */ 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, /* 0x47 */ 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, /* 0x48 */ 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, }; static const unsigned short ksc5601_2uni_page4a[4888] = { /* 0x4a */ 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, /* 0x4b */ 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, /* 0x4c */ 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, /* 0x4d */ 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, /* 0x4e */ 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, /* 0x4f */ 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, /* 0x50 */ 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, /* 0x51 */ 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, /* 0x52 */ 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, /* 0x53 */ 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, /* 0x54 */ 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, /* 0x55 */ 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, /* 0x56 */ 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, /* 0x57 */ 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, /* 0x58 */ 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, /* 0x59 */ 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, /* 0x5a */ 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, /* 0x5b */ 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, /* 0x5c */ 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, /* 0x5d */ 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, /* 0x5e */ 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, /* 0x5f */ 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, /* 0x60 */ 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, /* 0x61 */ 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, /* 0x62 */ 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, /* 0x63 */ 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, /* 0x64 */ 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, /* 0x65 */ 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, /* 0x66 */ 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, /* 0x67 */ 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, /* 0x68 */ 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, /* 0x69 */ 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, /* 0x6a */ 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, /* 0x6b */ 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, /* 0x6c */ 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, /* 0x6d */ 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, /* 0x6e */ 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, /* 0x6f */ 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, /* 0x70 */ 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, /* 0x71 */ 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, /* 0x72 */ 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, /* 0x73 */ 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, /* 0x74 */ 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, /* 0x75 */ 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, /* 0x76 */ 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, /* 0x77 */ 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, /* 0x78 */ 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, /* 0x79 */ 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, /* 0x7a */ 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, /* 0x7b */ 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, /* 0x7c */ 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, /* 0x7d */ 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, }; static int ksc5601_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x21 && c1 <= 0x2c) || (c1 >= 0x30 && c1 <= 0x48) || (c1 >= 0x4a && c1 <= 0x7d)) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x21 && c2 < 0x7f) { unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); unsigned short wc = 0xfffd; if (i < 1410) { if (i < 1115) wc = ksc5601_2uni_page21[i]; } else if (i < 3854) { if (i < 3760) wc = ksc5601_2uni_page30[i-1410]; } else { if (i < 8742) wc = ksc5601_2uni_page4a[i-3854]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short ksc5601_2charset[8227] = { 0x222e, 0x2234, 0x2157, 0x2127, 0x2823, 0x2129, 0x2267, 0x2146, 0x213e, 0x2977, 0x2978, 0x2225, 0x2252, 0x2124, 0x222c, 0x2976, 0x282c, 0x2879, 0x2876, 0x287a, 0x222f, 0x2821, 0x2822, 0x213f, 0x282a, 0x282d, 0x292c, 0x2921, 0x2923, 0x2140, 0x292a, 0x292d, 0x2922, 0x2824, 0x2924, 0x2925, 0x2826, 0x2926, 0x2927, 0x2828, 0x2928, 0x2829, 0x2929, 0x2930, 0x282f, 0x292f, 0x282b, 0x292b, 0x282e, 0x292e, 0x2227, 0x2230, 0x2228, 0x222b, 0x222a, 0x222d, 0x2229, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254a, 0x254b, 0x254c, 0x254d, 0x254e, 0x254f, 0x2550, 0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x256d, 0x256e, 0x256f, 0x2570, 0x2571, 0x2572, 0x2573, 0x2574, 0x2575, 0x2576, 0x2577, 0x2578, 0x2c27, 0x2c21, 0x2c22, 0x2c23, 0x2c24, 0x2c25, 0x2c26, 0x2c28, 0x2c29, 0x2c2a, 0x2c2b, 0x2c2c, 0x2c2d, 0x2c2e, 0x2c2f, 0x2c30, 0x2c31, 0x2c32, 0x2c33, 0x2c34, 0x2c35, 0x2c36, 0x2c37, 0x2c38, 0x2c39, 0x2c3a, 0x2c3b, 0x2c3c, 0x2c3d, 0x2c3e, 0x2c3f, 0x2c40, 0x2c41, 0x2c51, 0x2c52, 0x2c53, 0x2c54, 0x2c55, 0x2c56, 0x2c58, 0x2c59, 0x2c5a, 0x2c5b, 0x2c5c, 0x2c5d, 0x2c5e, 0x2c5f, 0x2c60, 0x2c61, 0x2c62, 0x2c63, 0x2c64, 0x2c65, 0x2c66, 0x2c67, 0x2c68, 0x2c69, 0x2c6a, 0x2c6b, 0x2c6c, 0x2c6d, 0x2c6e, 0x2c6f, 0x2c70, 0x2c71, 0x2c57, 0x212a, 0x212e, 0x212f, 0x2130, 0x2131, 0x2253, 0x2254, 0x2125, 0x2126, 0x2236, 0x2147, 0x2148, 0x2158, 0x2979, 0x297a, 0x297b, 0x297c, 0x297d, 0x297e, 0x2266, 0x2149, 0x2235, 0x2724, 0x2260, 0x2265, 0x2262, 0x2759, 0x214a, 0x2877, 0x2878, 0x287b, 0x287c, 0x287d, 0x287e, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252a, 0x2167, 0x2168, 0x2166, 0x2169, 0x216a, 0x2255, 0x2258, 0x2256, 0x2259, 0x2257, 0x2221, 0x2222, 0x2223, 0x2153, 0x2224, 0x2154, 0x2174, 0x2175, 0x2233, 0x2232, 0x216e, 0x2170, 0x2144, 0x2150, 0x212b, 0x217c, 0x217d, 0x217b, 0x217a, 0x2172, 0x2173, 0x2231, 0x2145, 0x2171, 0x212d, 0x216f, 0x2156, 0x2141, 0x2155, 0x2142, 0x2143, 0x216c, 0x216d, 0x2178, 0x2179, 0x2176, 0x2177, 0x2241, 0x2151, 0x2152, 0x2867, 0x2868, 0x2869, 0x286a, 0x286b, 0x286c, 0x286d, 0x286e, 0x286f, 0x2870, 0x2871, 0x2872, 0x2873, 0x2874, 0x2875, 0x2967, 0x2968, 0x2969, 0x296a, 0x296b, 0x296c, 0x296d, 0x296e, 0x296f, 0x2970, 0x2971, 0x2972, 0x2973, 0x2974, 0x2975, 0x294d, 0x294e, 0x294f, 0x2950, 0x2951, 0x2952, 0x2953, 0x2954, 0x2955, 0x2956, 0x2957, 0x2958, 0x2959, 0x295a, 0x295b, 0x295c, 0x295d, 0x295e, 0x295f, 0x2960, 0x2961, 0x2962, 0x2963, 0x2964, 0x2965, 0x2966, 0x284d, 0x284e, 0x284f, 0x2850, 0x2851, 0x2852, 0x2853, 0x2854, 0x2855, 0x2856, 0x2857, 0x2858, 0x2859, 0x285a, 0x285b, 0x285c, 0x285d, 0x285e, 0x285f, 0x2860, 0x2861, 0x2862, 0x2863, 0x2864, 0x2865, 0x2866, 0x2621, 0x262c, 0x2622, 0x262d, 0x2623, 0x2648, 0x2647, 0x262e, 0x2624, 0x2642, 0x2641, 0x262f, 0x2626, 0x2646, 0x2645, 0x2631, 0x2625, 0x2644, 0x2643, 0x2630, 0x2627, 0x263c, 0x2649, 0x264a, 0x2637, 0x264b, 0x264c, 0x2632, 0x2629, 0x263e, 0x264d, 0x264e, 0x2639, 0x264f, 0x2650, 0x2634, 0x2628, 0x2651, 0x2652, 0x2638, 0x263d, 0x2653, 0x2654, 0x2633, 0x262a, 0x2655, 0x2656, 0x263a, 0x263f, 0x2657, 0x2658, 0x2635, 0x262b, 0x2659, 0x265a, 0x263b, 0x265b, 0x265c, 0x2640, 0x265d, 0x265e, 0x265f, 0x2660, 0x2661, 0x2662, 0x2663, 0x2664, 0x2636, 0x2246, 0x2161, 0x2160, 0x2243, 0x2247, 0x2248, 0x224b, 0x224a, 0x2249, 0x224c, 0x2163, 0x2162, 0x223a, 0x2239, 0x2165, 0x2164, 0x2238, 0x2237, 0x215f, 0x215e, 0x2242, 0x215b, 0x215d, 0x215c, 0x2244, 0x2245, 0x215a, 0x2159, 0x224f, 0x224e, 0x2250, 0x2251, 0x214f, 0x214e, 0x223c, 0x223d, 0x2240, 0x223b, 0x223e, 0x223f, 0x224d, 0x225b, 0x225c, 0x225d, 0x225a, 0x2121, 0x2122, 0x2123, 0x2128, 0x2134, 0x2135, 0x2136, 0x2137, 0x2138, 0x2139, 0x213a, 0x213b, 0x213c, 0x213d, 0x216b, 0x2132, 0x2133, 0x2a21, 0x2a22, 0x2a23, 0x2a24, 0x2a25, 0x2a26, 0x2a27, 0x2a28, 0x2a29, 0x2a2a, 0x2a2b, 0x2a2c, 0x2a2d, 0x2a2e, 0x2a2f, 0x2a30, 0x2a31, 0x2a32, 0x2a33, 0x2a34, 0x2a35, 0x2a36, 0x2a37, 0x2a38, 0x2a39, 0x2a3a, 0x2a3b, 0x2a3c, 0x2a3d, 0x2a3e, 0x2a3f, 0x2a40, 0x2a41, 0x2a42, 0x2a43, 0x2a44, 0x2a45, 0x2a46, 0x2a47, 0x2a48, 0x2a49, 0x2a4a, 0x2a4b, 0x2a4c, 0x2a4d, 0x2a4e, 0x2a4f, 0x2a50, 0x2a51, 0x2a52, 0x2a53, 0x2a54, 0x2a55, 0x2a56, 0x2a57, 0x2a58, 0x2a59, 0x2a5a, 0x2a5b, 0x2a5c, 0x2a5d, 0x2a5e, 0x2a5f, 0x2a60, 0x2a61, 0x2a62, 0x2a63, 0x2a64, 0x2a65, 0x2a66, 0x2a67, 0x2a68, 0x2a69, 0x2a6a, 0x2a6b, 0x2a6c, 0x2a6d, 0x2a6e, 0x2a6f, 0x2a70, 0x2a71, 0x2a72, 0x2a73, 0x2b21, 0x2b22, 0x2b23, 0x2b24, 0x2b25, 0x2b26, 0x2b27, 0x2b28, 0x2b29, 0x2b2a, 0x2b2b, 0x2b2c, 0x2b2d, 0x2b2e, 0x2b2f, 0x2b30, 0x2b31, 0x2b32, 0x2b33, 0x2b34, 0x2b35, 0x2b36, 0x2b37, 0x2b38, 0x2b39, 0x2b3a, 0x2b3b, 0x2b3c, 0x2b3d, 0x2b3e, 0x2b3f, 0x2b40, 0x2b41, 0x2b42, 0x2b43, 0x2b44, 0x2b45, 0x2b46, 0x2b47, 0x2b48, 0x2b49, 0x2b4a, 0x2b4b, 0x2b4c, 0x2b4d, 0x2b4e, 0x2b4f, 0x2b50, 0x2b51, 0x2b52, 0x2b53, 0x2b54, 0x2b55, 0x2b56, 0x2b57, 0x2b58, 0x2b59, 0x2b5a, 0x2b5b, 0x2b5c, 0x2b5d, 0x2b5e, 0x2b5f, 0x2b60, 0x2b61, 0x2b62, 0x2b63, 0x2b64, 0x2b65, 0x2b66, 0x2b67, 0x2b68, 0x2b69, 0x2b6a, 0x2b6b, 0x2b6c, 0x2b6d, 0x2b6e, 0x2b6f, 0x2b70, 0x2b71, 0x2b72, 0x2b73, 0x2b74, 0x2b75, 0x2b76, 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, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, 0x247e, 0x2931, 0x2932, 0x2933, 0x2934, 0x2935, 0x2936, 0x2937, 0x2938, 0x2939, 0x293a, 0x293b, 0x293c, 0x293d, 0x293e, 0x293f, 0x2940, 0x2941, 0x2942, 0x2943, 0x2944, 0x2945, 0x2946, 0x2947, 0x2948, 0x2949, 0x294a, 0x294b, 0x294c, 0x225f, 0x2831, 0x2832, 0x2833, 0x2834, 0x2835, 0x2836, 0x2837, 0x2838, 0x2839, 0x283a, 0x283b, 0x283c, 0x283d, 0x283e, 0x283f, 0x2840, 0x2841, 0x2842, 0x2843, 0x2844, 0x2845, 0x2846, 0x2847, 0x2848, 0x2849, 0x284a, 0x284b, 0x284c, 0x2268, 0x225e, 0x2749, 0x274a, 0x274b, 0x274c, 0x274d, 0x273a, 0x273b, 0x275c, 0x275d, 0x275e, 0x2736, 0x2737, 0x2738, 0x2754, 0x2755, 0x2756, 0x2757, 0x2758, 0x2721, 0x2722, 0x2723, 0x2725, 0x272b, 0x272c, 0x272d, 0x272e, 0x272f, 0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2727, 0x2728, 0x2729, 0x272a, 0x273d, 0x273e, 0x2765, 0x2766, 0x2767, 0x2768, 0x2761, 0x2762, 0x2763, 0x273f, 0x2740, 0x2741, 0x2742, 0x2743, 0x2744, 0x2745, 0x2746, 0x2747, 0x2748, 0x274e, 0x274f, 0x2750, 0x2751, 0x2752, 0x2753, 0x275a, 0x275b, 0x2263, 0x276c, 0x2726, 0x2760, 0x276f, 0x2261, 0x273c, 0x276d, 0x2735, 0x2739, 0x276a, 0x276b, 0x275f, 0x2264, 0x2764, 0x276e, 0x2769, 0x6c69, 0x6f4b, 0x7652, 0x5832, 0x6d5b, 0x5f32, 0x5f3e, 0x793b, 0x5c74, 0x7564, 0x7326, 0x5d60, 0x6126, 0x4e78, 0x5c30, 0x632a, 0x7169, 0x4d7a, 0x7c2f, 0x5321, 0x712b, 0x6751, 0x522c, 0x4e79, 0x717d, 0x5e3f, 0x7b3a, 0x7939, 0x4e52, 0x632b, 0x6b60, 0x4e7a, 0x4b77, 0x6525, 0x4a61, 0x544c, 0x6a61, 0x5c63, 0x5f2d, 0x4b6b, 0x552f, 0x5675, 0x6578, 0x5e40, 0x6c23, 0x694d, 0x6a27, 0x6976, 0x7b3b, 0x6769, 0x6f4c, 0x5066, 0x5e41, 0x642c, 0x584c, 0x7971, 0x4e5f, 0x7a24, 0x6632, 0x7a7b, 0x7a3d, 0x4c48, 0x6f4d, 0x5555, 0x5322, 0x6c51, 0x6427, 0x6c52, 0x7631, 0x4e7b, 0x5051, 0x4b3f, 0x6d24, 0x6d28, 0x5e42, 0x7662, 0x6d5c, 0x5c75, 0x6039, 0x544e, 0x7435, 0x535b, 0x5635, 0x6c24, 0x6466, 0x716a, 0x4b6c, 0x4b40, 0x6c72, 0x506a, 0x7972, 0x6c25, 0x505f, 0x676a, 0x506b, 0x5c51, 0x5b69, 0x7d4c, 0x5b57, 0x5a61, 0x5636, 0x635f, 0x5e43, 0x5e44, 0x4a21, 0x6e6c, 0x5323, 0x6e37, 0x784f, 0x6a48, 0x6e38, 0x712c, 0x7125, 0x694e, 0x793c, 0x6579, 0x6c6a, 0x5d56, 0x6d42, 0x7825, 0x653a, 0x5b58, 0x4a22, 0x514d, 0x6e6d, 0x6c6b, 0x5e45, 0x6360, 0x4a49, 0x7269, 0x554e, 0x7636, 0x4e42, 0x5647, 0x6334, 0x712d, 0x6a62, 0x5742, 0x7327, 0x4d6a, 0x6b6e, 0x5932, 0x7d25, 0x7655, 0x5562, 0x7835, 0x4c75, 0x7535, 0x642d, 0x676b, 0x7155, 0x703b, 0x6935, 0x4c49, 0x7a55, 0x6154, 0x5756, 0x5c41, 0x5e46, 0x7a6f, 0x6361, 0x6173, 0x5c76, 0x4e7c, 0x5b44, 0x7871, 0x5c64, 0x656f, 0x5c31, 0x5556, 0x735a, 0x4b41, 0x5b43, 0x597a, 0x536e, 0x7a38, 0x7d26, 0x6b6f, 0x7426, 0x4c4a, 0x7328, 0x735b, 0x5b27, 0x7637, 0x4f66, 0x7072, 0x4b5a, 0x6752, 0x5743, 0x7670, 0x685e, 0x6526, 0x6567, 0x4a23, 0x4c27, 0x6a49, 0x7836, 0x7a25, 0x712e, 0x6f4e, 0x4b6d, 0x7630, 0x6f4f, 0x694f, 0x775e, 0x4e53, 0x5c77, 0x5b28, 0x4b78, 0x5f21, 0x5d61, 0x754a, 0x6936, 0x676c, 0x6e6e, 0x7370, 0x5f3f, 0x4c4b, 0x5041, 0x7452, 0x603a, 0x5f40, 0x4e60, 0x5c52, 0x7d6a, 0x5676, 0x6a4a, 0x6869, 0x632c, 0x7350, 0x4a24, 0x5b78, 0x5e47, 0x6b70, 0x7156, 0x6562, 0x4c4c, 0x4b7b, 0x6a63, 0x5f41, 0x566d, 0x6950, 0x6e39, 0x5563, 0x5153, 0x6570, 0x6834, 0x6b43, 0x6a2a, 0x7a7c, 0x7576, 0x703c, 0x7d54, 0x603b, 0x4e43, 0x503a, 0x773a, 0x5873, 0x774d, 0x642e, 0x545f, 0x5067, 0x6c7d, 0x522e, 0x6e6f, 0x5557, 0x6a64, 0x7822, 0x4d6b, 0x573f, 0x7b31, 0x4d6c, 0x5c32, 0x506c, 0x4e7d, 0x6e70, 0x4c42, 0x506d, 0x6577, 0x737c, 0x6e22, 0x5933, 0x5874, 0x6937, 0x4e2e, 0x5922, 0x5871, 0x544f, 0x6527, 0x5552, 0x5629, 0x7422, 0x7157, 0x5558, 0x703d, 0x5750, 0x5450, 0x574f, 0x6b6a, 0x7d6b, 0x5b6d, 0x7c45, 0x4b42, 0x7d55, 0x7448, 0x686a, 0x7573, 0x795e, 0x536f, 0x6c53, 0x5d42, 0x6f37, 0x6754, 0x4a4a, 0x597b, 0x7a7d, 0x562a, 0x7478, 0x7777, 0x5c2c, 0x5757, 0x5f22, 0x4e3e, 0x5370, 0x7024, 0x616c, 0x4f67, 0x734b, 0x6d29, 0x4a3e, 0x746f, 0x764e, 0x5e7b, 0x503b, 0x5537, 0x6e71, 0x7428, 0x5c78, 0x4b27, 0x5a4e, 0x6066, 0x6d25, 0x6e72, 0x5c79, 0x795c, 0x735c, 0x7872, 0x7479, 0x7c71, 0x503c, 0x5b79, 0x5731, 0x4b7c, 0x7025, 0x4b7d, 0x5574, 0x4d6d, 0x4a25, 0x562b, 0x5042, 0x703e, 0x523d, 0x4c24, 0x7a36, 0x4c4d, 0x5a7a, 0x764f, 0x6938, 0x5875, 0x4c4e, 0x574d, 0x5451, 0x696d, 0x4a6b, 0x5962, 0x7d32, 0x632d, 0x564c, 0x5934, 0x6127, 0x6e53, 0x5043, 0x7d33, 0x5564, 0x4f68, 0x6d43, 0x5032, 0x4e7e, 0x5a28, 0x7850, 0x7d56, 0x7851, 0x7852, 0x5c53, 0x5d62, 0x7b79, 0x5d41, 0x6335, 0x6d5d, 0x4e44, 0x4b21, 0x5d63, 0x7c5d, 0x792f, 0x527b, 0x4f21, 0x6428, 0x7436, 0x6c7e, 0x632e, 0x676d, 0x7d41, 0x5a62, 0x5833, 0x5d64, 0x706f, 0x7671, 0x7a70, 0x5175, 0x5a4f, 0x5c54, 0x5c26, 0x6f3f, 0x4e4f, 0x6059, 0x5956, 0x6c54, 0x6a4b, 0x4a3f, 0x5530, 0x4f69, 0x716d, 0x4c4f, 0x6478, 0x646d, 0x5758, 0x7d27, 0x6a2b, 0x7632, 0x4f70, 0x793d, 0x6674, 0x4b5b, 0x7351, 0x6951, 0x7329, 0x5060, 0x6952, 0x5a63, 0x6252, 0x7622, 0x6174, 0x5a64, 0x6755, 0x753f, 0x4f22, 0x4d2f, 0x4f23, 0x4d30, 0x717e, 0x5023, 0x612f, 0x7823, 0x4a26, 0x773b, 0x726a, 0x5e48, 0x6953, 0x5e49, 0x7d5e, 0x4a40, 0x796a, 0x514e, 0x6e54, 0x5452, 0x5923, 0x7d28, 0x5759, 0x774e, 0x7a3e, 0x4f56, 0x5770, 0x6b61, 0x7845, 0x5c7a, 0x5d43, 0x795f, 0x676f, 0x7d65, 0x7623, 0x597c, 0x7d29, 0x676e, 0x5565, 0x6f50, 0x4d31, 0x7722, 0x7132, 0x7131, 0x4d32, 0x5a2b, 0x4a27, 0x6362, 0x7b3c, 0x5924, 0x6e3a, 0x7853, 0x7b7a, 0x4f24, 0x5c7b, 0x7663, 0x6d2a, 0x7221, 0x4e61, 0x7a26, 0x7960, 0x6c56, 0x646e, 0x7921, 0x7b6f, 0x796b, 0x6e23, 0x6a2c, 0x4a28, 0x747a, 0x4d56, 0x7c76, 0x7449, 0x7854, 0x7826, 0x5e4a, 0x7246, 0x575a, 0x5350, 0x5845, 0x6a66, 0x735d, 0x645a, 0x7664, 0x7672, 0x5f42, 0x597d, 0x4c76, 0x533a, 0x642f, 0x7961, 0x7026, 0x4b53, 0x603c, 0x744a, 0x547a, 0x7d2a, 0x7962, 0x7437, 0x7d42, 0x7c30, 0x7d6c, 0x4a62, 0x7d3d, 0x6a67, 0x5f43, 0x5152, 0x4e62, 0x5324, 0x7d2b, 0x5f60, 0x7247, 0x6770, 0x506e, 0x732a, 0x5e4b, 0x7638, 0x6175, 0x7133, 0x7723, 0x4a29, 0x4f25, 0x5f44, 0x6130, 0x703f, 0x7624, 0x6336, 0x7a46, 0x506f, 0x7d6d, 0x5d44, 0x7c77, 0x663f, 0x5e2d, 0x7a3f, 0x6571, 0x6d44, 0x5225, 0x7d6e, 0x7536, 0x6176, 0x5e4c, 0x7c5e, 0x6c57, 0x4d5d, 0x5637, 0x4d33, 0x7855, 0x6558, 0x4f6a, 0x4f50, 0x6a4c, 0x6a2e, 0x6a2d, 0x5371, 0x5325, 0x774f, 0x6e24, 0x5024, 0x7222, 0x5070, 0x7223, 0x7778, 0x5033, 0x5b29, 0x533b, 0x4a6c, 0x7126, 0x4b55, 0x7767, 0x4d5e, 0x7724, 0x7840, 0x535d, 0x4c50, 0x4f26, 0x7673, 0x6177, 0x535c, 0x7a7e, 0x7a27, 0x6b59, 0x4f27, 0x6a2f, 0x646f, 0x6939, 0x7158, 0x5858, 0x6072, 0x6634, 0x5c7c, 0x7371, 0x6350, 0x727b, 0x5b46, 0x5071, 0x5072, 0x4f5c, 0x5351, 0x4c31, 0x7758, 0x4b28, 0x6b3c, 0x643e, 0x745c, 0x5c42, 0x7027, 0x6640, 0x4a6d, 0x686b, 0x6568, 0x5c43, 0x6d5e, 0x5372, 0x4c77, 0x4e54, 0x672b, 0x4b43, 0x6131, 0x7732, 0x5373, 0x5352, 0x7540, 0x5f5d, 0x6e73, 0x6771, 0x7d34, 0x7248, 0x7352, 0x6e74, 0x6253, 0x4c51, 0x5f6a, 0x693a, 0x5957, 0x754d, 0x7172, 0x7a47, 0x5978, 0x5442, 0x7665, 0x5d45, 0x6772, 0x6d5f, 0x4a4b, 0x5b7a, 0x6835, 0x5326, 0x7d35, 0x7949, 0x6462, 0x7b3d, 0x5724, 0x4e45, 0x4e55, 0x5666, 0x653d, 0x5e4d, 0x6c73, 0x6d60, 0x6c6c, 0x7b3e, 0x5f6b, 0x6178, 0x793e, 0x5073, 0x602a, 0x6862, 0x6254, 0x527d, 0x6528, 0x5953, 0x535e, 0x7438, 0x773c, 0x5c7d, 0x686c, 0x6467, 0x6377, 0x6c28, 0x7a71, 0x6572, 0x5074, 0x522f, 0x5c65, 0x5025, 0x7134, 0x7c31, 0x4c78, 0x5d46, 0x7a51, 0x775f, 0x7a28, 0x6e75, 0x5e4e, 0x6773, 0x772c, 0x6b44, 0x6d61, 0x602b, 0x5d47, 0x5233, 0x523f, 0x4a4c, 0x7b3f, 0x657d, 0x5d65, 0x584d, 0x6c74, 0x5075, 0x686d, 0x5052, 0x5958, 0x7666, 0x5b2a, 0x7760, 0x5859, 0x7423, 0x745d, 0x6f51, 0x5935, 0x6d2b, 0x6337, 0x6e3b, 0x4d34, 0x6073, 0x6a4d, 0x6c75, 0x686e, 0x4b29, 0x712f, 0x4a4d, 0x6c29, 0x726b, 0x7d6f, 0x7973, 0x6641, 0x6c58, 0x6d2c, 0x6a4e, 0x685f, 0x5e4f, 0x5226, 0x6774, 0x5156, 0x6642, 0x6363, 0x6430, 0x5834, 0x7625, 0x735e, 0x5725, 0x7768, 0x6846, 0x7b66, 0x5d66, 0x5c7e, 0x585a, 0x5a2c, 0x6a30, 0x6338, 0x4a2a, 0x6179, 0x6a31, 0x726c, 0x7a6e, 0x6e55, 0x7974, 0x526c, 0x7b7b, 0x7d70, 0x603d, 0x4e63, 0x7846, 0x5e2e, 0x5f45, 0x653e, 0x6d2d, 0x7a6a, 0x4d6e, 0x6d26, 0x6d2e, 0x706d, 0x5d21, 0x6d2f, 0x7c78, 0x586b, 0x4c79, 0x4d35, 0x7a29, 0x615d, 0x6255, 0x6d4f, 0x5d22, 0x794a, 0x6a68, 0x656d, 0x536b, 0x6954, 0x617a, 0x644c, 0x6164, 0x6847, 0x4e5b, 0x5c55, 0x7735, 0x7c73, 0x7073, 0x4e2f, 0x7135, 0x6f52, 0x6848, 0x6b71, 0x4b54, 0x603e, 0x6378, 0x6a69, 0x7c32, 0x6074, 0x4f60, 0x6e25, 0x7a2a, 0x6643, 0x6132, 0x4a2b, 0x6364, 0x693b, 0x6256, 0x7372, 0x6e56, 0x6a32, 0x5076, 0x6c59, 0x5a4b, 0x4f28, 0x5d23, 0x585b, 0x794e, 0x6955, 0x6351, 0x523c, 0x582c, 0x734c, 0x4d7b, 0x7656, 0x6775, 0x686f, 0x6379, 0x523b, 0x7373, 0x637b, 0x5e50, 0x4e30, 0x5677, 0x7159, 0x7541, 0x5c44, 0x753b, 0x5e51, 0x5c66, 0x5e52, 0x6d62, 0x6e76, 0x6a4f, 0x706e, 0x637c, 0x535f, 0x5374, 0x6133, 0x6134, 0x7453, 0x5f46, 0x6956, 0x5b2b, 0x7626, 0x6339, 0x6b45, 0x7429, 0x4d36, 0x5279, 0x5a2d, 0x5263, 0x4f51, 0x4b5c, 0x4c7a, 0x4f5d, 0x6829, 0x633b, 0x633a, 0x605a, 0x6e77, 0x5c33, 0x5375, 0x5726, 0x7635, 0x575b, 0x6155, 0x546a, 0x5f23, 0x7d5f, 0x5077, 0x6d54, 0x4b2a, 0x645b, 0x617b, 0x4b22, 0x5360, 0x643f, 0x7b40, 0x5a3e, 0x644d, 0x5639, 0x6f40, 0x617c, 0x7639, 0x5f47, 0x6431, 0x5c67, 0x5c68, 0x7a56, 0x5376, 0x715a, 0x7a72, 0x627d, 0x554f, 0x5078, 0x4d5f, 0x754b, 0x6470, 0x4b2b, 0x5744, 0x627e, 0x5d5a, 0x5a2e, 0x4a6e, 0x5539, 0x6321, 0x6863, 0x732b, 0x4f29, 0x5377, 0x5471, 0x4e64, 0x6872, 0x6575, 0x672e, 0x563a, 0x5f6c, 0x6440, 0x6864, 0x5835, 0x645c, 0x7439, 0x7136, 0x625e, 0x6135, 0x4d6f, 0x7127, 0x4e65, 0x4b5d, 0x5963, 0x732c, 0x5079, 0x6c2b, 0x5e53, 0x7769, 0x7975, 0x615e, 0x4b6e, 0x633c, 0x7856, 0x5b6e, 0x7d71, 0x7736, 0x745e, 0x726d, 0x5b59, 0x7028, 0x617d, 0x5e54, 0x602c, 0x6d63, 0x5361, 0x5f48, 0x5936, 0x7d2c, 0x6f53, 0x6441, 0x786b, 0x5b2c, 0x7c46, 0x582d, 0x763a, 0x5b5f, 0x5353, 0x7847, 0x4a4e, 0x7841, 0x5234, 0x5c34, 0x7a39, 0x4a4f, 0x7c33, 0x6a6a, 0x6a6b, 0x507a, 0x6d64, 0x5d67, 0x5f49, 0x5f6d, 0x6e3c, 0x6f41, 0x4c52, 0x5d24, 0x5f4a, 0x5378, 0x7128, 0x4d37, 0x6f54, 0x645d, 0x5f6e, 0x4b2c, 0x693c, 0x6a6c, 0x5f4b, 0x793f, 0x562f, 0x5546, 0x4f2a, 0x4e29, 0x5678, 0x7137, 0x6e78, 0x5959, 0x735f, 0x7848, 0x4e46, 0x5566, 0x7466, 0x6645, 0x6f55, 0x4b6f, 0x7c5f, 0x5c27, 0x5667, 0x7849, 0x6352, 0x633d, 0x4f61, 0x7040, 0x6c5a, 0x5d57, 0x7b70, 0x6c2c, 0x7029, 0x7a57, 0x7b41, 0x5240, 0x6530, 0x6d65, 0x4b2d, 0x7930, 0x7725, 0x4b2e, 0x5a2f, 0x5836, 0x5327, 0x7b32, 0x7d44, 0x6c2d, 0x7b21, 0x6569, 0x696e, 0x7374, 0x7873, 0x7041, 0x5e2f, 0x7830, 0x7360, 0x672f, 0x5b2d, 0x6635, 0x7928, 0x5d58, 0x6859, 0x6f56, 0x5362, 0x625f, 0x7c60, 0x5748, 0x7d2d, 0x5f6f, 0x4c53, 0x5379, 0x5470, 0x5b47, 0x5e55, 0x7074, 0x5550, 0x6559, 0x7c47, 0x5c56, 0x6260, 0x5a30, 0x7323, 0x536c, 0x744b, 0x7d45, 0x637d, 0x7931, 0x507b, 0x6c5b, 0x753c, 0x7224, 0x584e, 0x584f, 0x7577, 0x7661, 0x5237, 0x7b6c, 0x5d48, 0x6468, 0x5241, 0x7857, 0x563b, 0x5e56, 0x773d, 0x6c2e, 0x5061, 0x6075, 0x6a33, 0x4e56, 0x4c25, 0x6c76, 0x6261, 0x633e, 0x7c48, 0x4d70, 0x7976, 0x5f70, 0x653f, 0x4e3f, 0x7c61, 0x6d30, 0x7d51, 0x763b, 0x794f, 0x6b5a, 0x4a41, 0x5238, 0x4d71, 0x6353, 0x7d66, 0x666d, 0x637a, 0x702a, 0x7950, 0x7c62, 0x7827, 0x6165, 0x6e79, 0x6776, 0x6a6d, 0x7c34, 0x7542, 0x575c, 0x7075, 0x5d68, 0x536d, 0x757c, 0x5a3f, 0x4c7b, 0x537a, 0x7424, 0x6f57, 0x5443, 0x7b63, 0x7b6d, 0x602d, 0x6a6e, 0x7b33, 0x6442, 0x7667, 0x525d, 0x5f4c, 0x7c49, 0x6529, 0x6076, 0x7633, 0x617e, 0x4b70, 0x6a6f, 0x6a70, 0x5a40, 0x7834, 0x6b72, 0x6443, 0x6957, 0x6471, 0x4a6f, 0x4e57, 0x7c4a, 0x7361, 0x4b44, 0x6365, 0x4b45, 0x6a34, 0x693d, 0x5749, 0x6b5b, 0x6d31, 0x4c43, 0x773e, 0x7c4b, 0x7874, 0x5937, 0x7353, 0x7354, 0x7764, 0x7751, 0x5837, 0x4e31, 0x4a42, 0x7b34, 0x4b46, 0x7076, 0x5567, 0x6a50, 0x4c54, 0x4b2f, 0x742a, 0x692f, 0x7543, 0x6958, 0x5d69, 0x7173, 0x557b, 0x5e3b, 0x747b, 0x7d73, 0x7d72, 0x7726, 0x5d49, 0x5453, 0x4c28, 0x5a41, 0x4c55, 0x5964, 0x7a4a, 0x6563, 0x533c, 0x4a70, 0x5044, 0x4a50, 0x7a2b, 0x6b6b, 0x6778, 0x5965, 0x5157, 0x7324, 0x547b, 0x7c63, 0x7a58, 0x7355, 0x4f2b, 0x6b73, 0x557c, 0x5354, 0x4d7c, 0x5966, 0x6279, 0x6221, 0x6b54, 0x6077, 0x6432, 0x4c7c, 0x7b64, 0x742b, 0x503d, 0x4a71, 0x6f38, 0x5740, 0x6e7a, 0x7d74, 0x5363, 0x7b42, 0x5568, 0x5b2e, 0x6136, 0x7837, 0x603f, 0x7b43, 0x5d6a, 0x6222, 0x6e26, 0x7668, 0x7675, 0x5d4a, 0x5062, 0x5d26, 0x5d6b, 0x6479, 0x632f, 0x507c, 0x747c, 0x4c3c, 0x776a, 0x6564, 0x5f71, 0x7761, 0x7977, 0x6f39, 0x7858, 0x7929, 0x7859, 0x6e3d, 0x5846, 0x6463, 0x754e, 0x5d59, 0x5967, 0x5239, 0x5543, 0x5a65, 0x5a50, 0x5159, 0x4e58, 0x4b5e, 0x742c, 0x5a7b, 0x7669, 0x6873, 0x4f2c, 0x7070, 0x747d, 0x5b48, 0x4e40, 0x6354, 0x514f, 0x7175, 0x4d72, 0x4f6b, 0x4d38, 0x6326, 0x515a, 0x7225, 0x7226, 0x644e, 0x537b, 0x7129, 0x7249, 0x6f58, 0x6649, 0x5838, 0x7a73, 0x7335, 0x7824, 0x5173, 0x6648, 0x785a, 0x5c69, 0x5e57, 0x4b5f, 0x4f6c, 0x745f, 0x5174, 0x523a, 0x5f72, 0x6137, 0x6223, 0x537c, 0x6d66, 0x5b49, 0x647a, 0x4f5e, 0x4e50, 0x5553, 0x7375, 0x772e, 0x6f48, 0x4d73, 0x754f, 0x6573, 0x7042, 0x4a51, 0x6a71, 0x5026, 0x595a, 0x702b, 0x6b67, 0x6540, 0x7c35, 0x6444, 0x4c29, 0x7d46, 0x6a35, 0x652a, 0x5f3a, 0x615f, 0x5a51, 0x6138, 0x6874, 0x537d, 0x6224, 0x724a, 0x5a66, 0x7733, 0x7d4d, 0x7336, 0x6e57, 0x7544, 0x5824, 0x7227, 0x5938, 0x5939, 0x6f49, 0x564e, 0x774b, 0x5f2e, 0x6875, 0x5235, 0x5355, 0x744c, 0x5a7c, 0x5968, 0x776b, 0x7549, 0x733c, 0x5a52, 0x5335, 0x6836, 0x564f, 0x743a, 0x7749, 0x4c2a, 0x7043, 0x4c56, 0x5053, 0x533d, 0x5b7b, 0x4b60, 0x5364, 0x7677, 0x553a, 0x734d, 0x4b61, 0x6b74, 0x742d, 0x7c2a, 0x776c, 0x6876, 0x5a67, 0x774c, 0x6541, 0x606e, 0x557d, 0x4e66, 0x7c2b, 0x553b, 0x7228, 0x6225, 0x4d39, 0x6a72, 0x4b47, 0x4d74, 0x5b2f, 0x6f59, 0x4d3a, 0x7c79, 0x5f73, 0x4e67, 0x5a42, 0x4f2d, 0x6779, 0x7828, 0x7362, 0x4a72, 0x5f24, 0x5444, 0x4c57, 0x6542, 0x4d3b, 0x6f5a, 0x6e58, 0x5d27, 0x6226, 0x6040, 0x5630, 0x784a, 0x7c7a, 0x597e, 0x5e30, 0x5d6c, 0x5a68, 0x5460, 0x5679, 0x4d57, 0x5e58, 0x7278, 0x6456, 0x5045, 0x742e, 0x5d28, 0x6d45, 0x7356, 0x5e59, 0x6366, 0x5328, 0x5b30, 0x655a, 0x633f, 0x5b31, 0x5569, 0x6041, 0x6f5b, 0x7069, 0x5732, 0x507d, 0x5969, 0x507e, 0x6c6d, 0x5329, 0x7229, 0x7044, 0x6262, 0x696f, 0x7951, 0x6959, 0x685a, 0x5a43, 0x5a44, 0x5445, 0x677a, 0x4d60, 0x6330, 0x5b32, 0x7b44, 0x7363, 0x5925, 0x7b67, 0x5d4b, 0x5054, 0x6636, 0x602e, 0x7d5a, 0x5c35, 0x6078, 0x6731, 0x7570, 0x585c, 0x6d46, 0x6139, 0x6340, 0x7940, 0x6970, 0x595b, 0x7364, 0x5c36, 0x6469, 0x7045, 0x6341, 0x7c4c, 0x7c4d, 0x724b, 0x724c, 0x644f, 0x715b, 0x7a59, 0x7138, 0x7d75, 0x6079, 0x677b, 0x7c37, 0x7c64, 0x7b45, 0x6367, 0x5839, 0x7678, 0x5c45, 0x4c58, 0x602f, 0x7467, 0x6f5c, 0x4f7c, 0x6f5d, 0x722a, 0x7d3e, 0x4a2c, 0x7d3b, 0x7d47, 0x6732, 0x6a51, 0x5f74, 0x516c, 0x645e, 0x6543, 0x5926, 0x4d3c, 0x7365, 0x6d55, 0x593a, 0x6d67, 0x7b35, 0x786c, 0x6067, 0x4c59, 0x5446, 0x6725, 0x5575, 0x533e, 0x7c7b, 0x6472, 0x5f75, 0x6878, 0x786d, 0x4e47, 0x7d76, 0x6858, 0x4d58, 0x6756, 0x4c5a, 0x4a63, 0x5f76, 0x7047, 0x7046, 0x583a, 0x7174, 0x7470, 0x754c, 0x7c65, 0x6a45, 0x6a73, 0x5d5b, 0x5c57, 0x5e7d, 0x7279, 0x5547, 0x5850, 0x7048, 0x5121, 0x5122, 0x5954, 0x5668, 0x594a, 0x5a31, 0x5847, 0x5c62, 0x734e, 0x7574, 0x7139, 0x5a53, 0x766a, 0x4f75, 0x7d2e, 0x4a52, 0x5f34, 0x575d, 0x7a3a, 0x6e27, 0x753d, 0x7875, 0x6d68, 0x5461, 0x5123, 0x6156, 0x7978, 0x5b4a, 0x4b79, 0x5454, 0x595c, 0x6e3e, 0x776d, 0x526e, 0x6166, 0x7779, 0x5d6d, 0x685b, 0x5b33, 0x5177, 0x6030, 0x5462, 0x7657, 0x5779, 0x585d, 0x4d7d, 0x722b, 0x4d3d, 0x7842, 0x722c, 0x4a2d, 0x4a2e, 0x4f2e, 0x6342, 0x5c37, 0x5b5a, 0x593b, 0x4a73, 0x7653, 0x6678, 0x6a75, 0x6a76, 0x7679, 0x4f2f, 0x4a53, 0x4a2f, 0x5230, 0x713a, 0x5733, 0x6343, 0x737d, 0x5e5a, 0x5e5b, 0x6f5e, 0x6263, 0x6e7b, 0x5f77, 0x574a, 0x4e68, 0x5b5b, 0x713b, 0x6971, 0x7a37, 0x5046, 0x4c2b, 0x6e28, 0x4b7a, 0x7979, 0x4c7d, 0x537e, 0x6450, 0x726e, 0x5455, 0x5f4d, 0x7c38, 0x5150, 0x724d, 0x7752, 0x4a54, 0x5559, 0x585e, 0x4d59, 0x6e29, 0x763c, 0x4c5b, 0x7049, 0x7c7c, 0x6849, 0x747e, 0x677c, 0x575e, 0x5e5c, 0x702c, 0x4c7e, 0x4d61, 0x613a, 0x5b6f, 0x5a32, 0x5125, 0x5c38, 0x5876, 0x5124, 0x4d62, 0x5c6a, 0x7077, 0x704a, 0x503e, 0x5d5c, 0x5456, 0x5356, 0x6d50, 0x4d21, 0x5f35, 0x5f78, 0x5421, 0x4e32, 0x684a, 0x6b75, 0x6355, 0x7550, 0x7521, 0x5927, 0x652b, 0x664b, 0x7571, 0x6545, 0x7923, 0x605b, 0x766b, 0x4b71, 0x596a, 0x7522, 0x5751, 0x5178, 0x6a78, 0x6a79, 0x5a33, 0x6f5f, 0x716f, 0x6576, 0x6e3f, 0x6264, 0x503f, 0x7a2c, 0x7551, 0x6733, 0x693e, 0x724e, 0x5b34, 0x7c4e, 0x5d6e, 0x6734, 0x5734, 0x7734, 0x4d3e, 0x5a69, 0x4f30, 0x7759, 0x7366, 0x4e59, 0x4e2a, 0x4b48, 0x5027, 0x704b, 0x5047, 0x6445, 0x5b60, 0x555a, 0x5727, 0x6e40, 0x7876, 0x7552, 0x6d69, 0x593c, 0x6546, 0x7523, 0x5a54, 0x6227, 0x7b7c, 0x715c, 0x4a74, 0x687a, 0x4e69, 0x6978, 0x6265, 0x5039, 0x5472, 0x5126, 0x5f4e, 0x7c74, 0x532a, 0x4c2c, 0x6f60, 0x6565, 0x5055, 0x5b7c, 0x7c66, 0x4b7e, 0x6d6a, 0x5e31, 0x7963, 0x5422, 0x4f76, 0x5650, 0x556a, 0x716e, 0x7a4b, 0x6521, 0x5531, 0x4f6d, 0x6d6b, 0x5532, 0x553c, 0x7d62, 0x732d, 0x7d5b, 0x6930, 0x5127, 0x7d63, 0x4e33, 0x7d64, 0x7a4e, 0x4a30, 0x7727, 0x4f31, 0x6622, 0x7c36, 0x722d, 0x6f61, 0x732e, 0x5c46, 0x596b, 0x6860, 0x6128, 0x5576, 0x4f7d, 0x5e5d, 0x5951, 0x646a, 0x724f, 0x773f, 0x6266, 0x6228, 0x6356, 0x6d51, 0x6979, 0x5631, 0x5e32, 0x6068, 0x532b, 0x6b5c, 0x5f2f, 0x4a43, 0x6e7c, 0x7d43, 0x6b76, 0x4f32, 0x596c, 0x593d, 0x585f, 0x5438, 0x6b3e, 0x5d6f, 0x5d70, 0x5d71, 0x5d72, 0x593e, 0x7b46, 0x4f33, 0x6e7d, 0x642b, 0x5a45, 0x586c, 0x5128, 0x6229, 0x5e3c, 0x6735, 0x5b70, 0x6f62, 0x7170, 0x4f34, 0x5b71, 0x6031, 0x5f25, 0x7952, 0x677d, 0x6623, 0x7b71, 0x4b30, 0x722e, 0x4d67, 0x685c, 0x6757, 0x7740, 0x5063, 0x5a21, 0x4c3d, 0x5129, 0x5d4c, 0x637e, 0x512a, 0x682a, 0x6a36, 0x797a, 0x664c, 0x7658, 0x5447, 0x594b, 0x5952, 0x534b, 0x5877, 0x5a29, 0x7578, 0x5e5e, 0x722f, 0x7829, 0x5848, 0x6e41, 0x7941, 0x5d73, 0x6a7a, 0x763d, 0x613b, 0x4d3f, 0x7454, 0x664d, 0x7c4f, 0x7b22, 0x605c, 0x743b, 0x5a55, 0x7932, 0x7b72, 0x5b76, 0x5e5f, 0x5b72, 0x785c, 0x776e, 0x6b68, 0x527a, 0x713c, 0x7a5a, 0x5a6a, 0x5a46, 0x7741, 0x6736, 0x6547, 0x562c, 0x5c47, 0x6129, 0x622a, 0x5526, 0x5457, 0x7250, 0x6a7b, 0x605d, 0x7b73, 0x713d, 0x6267, 0x7d57, 0x4e48, 0x6a37, 0x7c40, 0x7d67, 0x776f, 0x5735, 0x6f3a, 0x715d, 0x5e33, 0x684b, 0x785d, 0x7b47, 0x5548, 0x575f, 0x5d29, 0x6931, 0x7a2d, 0x7659, 0x7a74, 0x782a, 0x666e, 0x4c5c, 0x613c, 0x606f, 0x693f, 0x7c7d, 0x664e, 0x6157, 0x664f, 0x7471, 0x6473, 0x647b, 0x7964, 0x6f63, 0x4f6e, 0x763e, 0x6032, 0x7c7e, 0x512b, 0x577a, 0x7b48, 0x6257, 0x5423, 0x7078, 0x5728, 0x6167, 0x533f, 0x6f64, 0x5745, 0x6b62, 0x7c67, 0x6422, 0x6268, 0x6650, 0x7b68, 0x7468, 0x6574, 0x743c, 0x7455, 0x5f36, 0x7c39, 0x6e42, 0x4a75, 0x6f65, 0x4b62, 0x5424, 0x5e60, 0x5a7d, 0x6446, 0x683e, 0x605e, 0x7634, 0x6a52, 0x797b, 0x6042, 0x4a64, 0x6737, 0x6a7d, 0x595d, 0x5a34, 0x6e2a, 0x7b69, 0x5b4b, 0x5a35, 0x713e, 0x532c, 0x7b49, 0x5f4f, 0x5340, 0x6357, 0x6f66, 0x7c50, 0x6940, 0x7553, 0x6c5c, 0x7737, 0x6a38, 0x5179, 0x5c48, 0x6a39, 0x715e, 0x5736, 0x4f35, 0x5928, 0x6c6e, 0x5d2a, 0x4d22, 0x682e, 0x613d, 0x7251, 0x6941, 0x527c, 0x5b35, 0x7367, 0x587e, 0x7c51, 0x6d32, 0x742f, 0x7b23, 0x7c41, 0x6e2b, 0x5425, 0x7472, 0x6e59, 0x7b4a, 0x4d63, 0x583b, 0x655b, 0x7877, 0x7654, 0x5729, 0x4b49, 0x6651, 0x704c, 0x582e, 0x7953, 0x557e, 0x583c, 0x7230, 0x622b, 0x7368, 0x6f42, 0x6d6c, 0x6738, 0x5a7e, 0x4c3e, 0x727c, 0x5a6b, 0x6258, 0x6d56, 0x5651, 0x6033, 0x7c52, 0x6b48, 0x5341, 0x704d, 0x4f77, 0x6d52, 0x5458, 0x5c49, 0x5771, 0x5f3b, 0x7325, 0x744d, 0x713f, 0x7831, 0x697a, 0x7b4b, 0x4a55, 0x7954, 0x774a, 0x5648, 0x7c68, 0x733d, 0x6e7e, 0x677e, 0x5342, 0x5336, 0x4c2d, 0x767a, 0x5632, 0x5258, 0x6758, 0x6325, 0x6739, 0x702d, 0x7b4c, 0x6b21, 0x5426, 0x7b4d, 0x553d, 0x715f, 0x767b, 0x5e34, 0x556b, 0x6548, 0x7b24, 0x5439, 0x5e61, 0x6423, 0x5737, 0x786e, 0x5e35, 0x5652, 0x7955, 0x673a, 0x6b55, 0x5577, 0x6f67, 0x613e, 0x7a2e, 0x5669, 0x566e, 0x673b, 0x6c4b, 0x5533, 0x4e34, 0x7b25, 0x616e, 0x7728, 0x7b4e, 0x583d, 0x7b7d, 0x7c69, 0x4f36, 0x6d47, 0x6e2c, 0x4c5d, 0x7627, 0x667a, 0x7524, 0x7d5c, 0x6d33, 0x4e49, 0x6f68, 0x613f, 0x7a5b, 0x4b63, 0x7729, 0x7b26, 0x5c39, 0x7140, 0x6d48, 0x6f43, 0x562d, 0x7d4e, 0x6821, 0x7b74, 0x5527, 0x7176, 0x6653, 0x4c5e, 0x7832, 0x5c6b, 0x7d36, 0x656a, 0x7160, 0x5b4c, 0x5d4d, 0x5448, 0x596d, 0x7525, 0x667b, 0x6654, 0x7d48, 0x5621, 0x7d3f, 0x7c53, 0x6f21, 0x673c, 0x516e, 0x6655, 0x6972, 0x5f30, 0x5860, 0x7c3a, 0x7d2f, 0x704e, 0x5b61, 0x6549, 0x6d34, 0x6043, 0x6358, 0x697b, 0x6a28, 0x7d37, 0x7b27, 0x6942, 0x7d77, 0x6259, 0x5c6c, 0x6822, 0x6670, 0x7d78, 0x7d79, 0x763f, 0x6727, 0x6657, 0x5473, 0x5449, 0x567a, 0x5772, 0x6140, 0x5b62, 0x6658, 0x673d, 0x704f, 0x733e, 0x622c, 0x7537, 0x6070, 0x7d38, 0x6368, 0x5427, 0x687c, 0x7a52, 0x786f, 0x5653, 0x5534, 0x7050, 0x7770, 0x6e33, 0x6a3a, 0x6a53, 0x6d49, 0x5d2b, 0x652c, 0x7d21, 0x5f50, 0x6c33, 0x5f51, 0x6d6d, 0x7838, 0x777a, 0x782b, 0x7460, 0x543a, 0x6433, 0x695a, 0x5e36, 0x593f, 0x5940, 0x566f, 0x594c, 0x5a2a, 0x5f65, 0x7765, 0x4c32, 0x5f79, 0x5760, 0x543b, 0x7d7a, 0x4c33, 0x5b73, 0x5f52, 0x4e4a, 0x6e5a, 0x6464, 0x7b4f, 0x4f37, 0x6e43, 0x4e6a, 0x622d, 0x5761, 0x7a75, 0x5549, 0x782c, 0x6759, 0x7369, 0x586d, 0x6344, 0x7071, 0x6865, 0x607a, 0x6e44, 0x595e, 0x6b22, 0x6b23, 0x7c42, 0x6a3b, 0x682b, 0x5e62, 0x6d6f, 0x6823, 0x4f71, 0x543c, 0x7c6a, 0x673e, 0x7c72, 0x5634, 0x622e, 0x5337, 0x7a4c, 0x7a5c, 0x6d35, 0x6163, 0x682c, 0x685d, 0x6f69, 0x743d, 0x4f38, 0x695b, 0x512c, 0x5a47, 0x6b49, 0x684c, 0x5e37, 0x563c, 0x5365, 0x7a5d, 0x5a56, 0x4a31, 0x5a48, 0x5f26, 0x7933, 0x7252, 0x4a44, 0x4e4b, 0x4d75, 0x7d30, 0x5528, 0x7141, 0x6269, 0x5c4a, 0x6c34, 0x7a40, 0x7b28, 0x5028, 0x5a6c, 0x596e, 0x607b, 0x6f6a, 0x7a5e, 0x6044, 0x4f39, 0x554a, 0x5762, 0x622f, 0x5738, 0x684d, 0x765a, 0x6f22, 0x625a, 0x767c, 0x7b50, 0x512d, 0x4d64, 0x512e, 0x5c6d, 0x684e, 0x7079, 0x4e35, 0x667c, 0x577b, 0x5056, 0x5d75, 0x7771, 0x767d, 0x5b77, 0x7b6a, 0x695c, 0x5941, 0x7572, 0x6045, 0x6a54, 0x7942, 0x6a3c, 0x5245, 0x7b51, 0x6740, 0x6b25, 0x5f7a, 0x6322, 0x5739, 0x6943, 0x687d, 0x682f, 0x7253, 0x7b29, 0x5825, 0x554b, 0x5048, 0x512f, 0x5763, 0x6046, 0x5622, 0x6d70, 0x5773, 0x7c54, 0x5a57, 0x4c5f, 0x7254, 0x5130, 0x4c60, 0x5b7d, 0x733f, 0x7051, 0x7c3b, 0x6230, 0x6625, 0x625b, 0x5f5e, 0x6047, 0x726f, 0x4c61, 0x566a, 0x6742, 0x4e36, 0x7340, 0x4d7e, 0x7b52, 0x7878, 0x777b, 0x683f, 0x6837, 0x6d36, 0x5c3a, 0x4c34, 0x7177, 0x6838, 0x4a76, 0x6424, 0x7456, 0x5f66, 0x5f27, 0x5f67, 0x6141, 0x6944, 0x5c4b, 0x6945, 0x6f23, 0x6b26, 0x4b23, 0x6369, 0x517b, 0x6f24, 0x6f6b, 0x5034, 0x4d23, 0x6866, 0x6f25, 0x534c, 0x5a6d, 0x573a, 0x7255, 0x7565, 0x596f, 0x7934, 0x5554, 0x7d4f, 0x5b63, 0x7161, 0x6c36, 0x7b7e, 0x5357, 0x5131, 0x4b31, 0x5132, 0x4b32, 0x7142, 0x7461, 0x7935, 0x6143, 0x6142, 0x6b77, 0x5f28, 0x4b4a, 0x6639, 0x785e, 0x792a, 0x4a77, 0x6d37, 0x5338, 0x7256, 0x5459, 0x6e45, 0x7270, 0x4a32, 0x5c3b, 0x7178, 0x6c37, 0x654a, 0x7640, 0x7d5d, 0x5463, 0x4c62, 0x7754, 0x5765, 0x5343, 0x5826, 0x7641, 0x5d76, 0x4d40, 0x655c, 0x654b, 0x6144, 0x6830, 0x7430, 0x736a, 0x5a6e, 0x573b, 0x6231, 0x572a, 0x567b, 0x645f, 0x4a56, 0x6b28, 0x5b7e, 0x7642, 0x6f3b, 0x547d, 0x6048, 0x6839, 0x6f26, 0x4d24, 0x5474, 0x5b21, 0x5b5c, 0x5b5d, 0x6e5c, 0x4b4b, 0x7c55, 0x4e6b, 0x4d41, 0x7b53, 0x792b, 0x7554, 0x5929, 0x695d, 0x5b4d, 0x5d4e, 0x6743, 0x6c4c, 0x796c, 0x4b4c, 0x607c, 0x5428, 0x6d53, 0x586f, 0x7257, 0x4a78, 0x5a6f, 0x5654, 0x594d, 0x586e, 0x7241, 0x5f53, 0x5a70, 0x626a, 0x607d, 0x5878, 0x772f, 0x5a36, 0x4a57, 0x7258, 0x5879, 0x7a5f, 0x4f6f, 0x5942, 0x7052, 0x6451, 0x7337, 0x7a60, 0x6f6c, 0x6232, 0x543d, 0x594e, 0x7462, 0x5429, 0x4d42, 0x675a, 0x7259, 0x592a, 0x583e, 0x5c2d, 0x626b, 0x567c, 0x4a79, 0x545a, 0x7457, 0x4c21, 0x4f3a, 0x7538, 0x5943, 0x5068, 0x6345, 0x6b78, 0x7231, 0x4f3b, 0x532d, 0x6861, 0x4e6c, 0x6034, 0x5e63, 0x5d77, 0x7232, 0x7376, 0x765b, 0x577e, 0x785f, 0x7772, 0x5029, 0x665a, 0x7526, 0x573c, 0x4c63, 0x665b, 0x5d5d, 0x5133, 0x6f6d, 0x565e, 0x6474, 0x616f, 0x5d78, 0x684f, 0x4a65, 0x5c21, 0x6035, 0x7c2c, 0x7c2d, 0x5827, 0x6d38, 0x5b36, 0x5670, 0x732f, 0x4d25, 0x5a71, 0x5828, 0x4c64, 0x5134, 0x4a58, 0x5a72, 0x7527, 0x7528, 0x6626, 0x556c, 0x5578, 0x5a73, 0x6346, 0x5e64, 0x5e65, 0x5135, 0x5136, 0x5137, 0x7233, 0x695e, 0x7053, 0x7234, 0x7054, 0x4b64, 0x7b54, 0x7566, 0x636a, 0x5e66, 0x5f54, 0x7879, 0x702e, 0x5138, 0x565f, 0x5057, 0x7c21, 0x6f6e, 0x5c58, 0x695f, 0x655d, 0x7d7b, 0x6049, 0x5649, 0x542a, 0x654c, 0x6960, 0x5058, 0x7c22, 0x543e, 0x6233, 0x5e67, 0x5c3c, 0x5236, 0x7555, 0x4e21, 0x7529, 0x5d79, 0x5d7a, 0x7055, 0x765f, 0x725a, 0x646b, 0x7271, 0x6c39, 0x7d7c, 0x612a, 0x4a59, 0x6f6f, 0x752a, 0x6c79, 0x782d, 0x7242, 0x7643, 0x5752, 0x7922, 0x7056, 0x707a, 0x7660, 0x6973, 0x7243, 0x542b, 0x4a33, 0x4d26, 0x4d43, 0x4d5a, 0x594f, 0x7644, 0x6e5d, 0x6744, 0x6234, 0x5f62, 0x675b, 0x6831, 0x7c2e, 0x654d, 0x7a6b, 0x4f3c, 0x4f62, 0x4d76, 0x6f70, 0x743e, 0x544d, 0x7338, 0x6921, 0x7272, 0x736b, 0x7057, 0x4f57, 0x4f5f, 0x6840, 0x6841, 0x4f63, 0x6922, 0x502a, 0x7341, 0x502b, 0x5464, 0x6f3c, 0x5821, 0x595f, 0x7357, 0x5c3d, 0x4c65, 0x6d71, 0x7162, 0x545b, 0x6235, 0x4a66, 0x532e, 0x4c66, 0x7153, 0x7567, 0x4a5a, 0x7b6e, 0x6145, 0x5f69, 0x6e5e, 0x7742, 0x5822, 0x5d2c, 0x702f, 0x563d, 0x612b, 0x7936, 0x5475, 0x5049, 0x6f27, 0x626c, 0x5b6a, 0x4e4c, 0x7568, 0x7755, 0x534d, 0x737e, 0x5035, 0x607e, 0x5f7b, 0x665d, 0x6824, 0x4b4d, 0x6f28, 0x6e34, 0x5a58, 0x5139, 0x5f29, 0x7330, 0x4c44, 0x4e37, 0x6f29, 0x5f55, 0x6d57, 0x6e46, 0x6f3d, 0x7c56, 0x5b74, 0x6f2a, 0x7839, 0x7569, 0x6359, 0x6146, 0x543f, 0x5e68, 0x706a, 0x7342, 0x532f, 0x4a5b, 0x7c57, 0x6d58, 0x6147, 0x7458, 0x5633, 0x5d2d, 0x553e, 0x7143, 0x6e5f, 0x566b, 0x7459, 0x5766, 0x5a37, 0x5d7b, 0x5d4f, 0x5823, 0x5a59, 0x7058, 0x6f44, 0x6158, 0x7154, 0x6d72, 0x555b, 0x555c, 0x7344, 0x4b57, 0x6236, 0x6f71, 0x7b55, 0x5358, 0x5d50, 0x7059, 0x4b33, 0x555d, 0x4d27, 0x502c, 0x513a, 0x7144, 0x6533, 0x7b75, 0x6961, 0x7d60, 0x7c3c, 0x5a22, 0x5a23, 0x5221, 0x526f, 0x626d, 0x5e69, 0x4e5c, 0x7235, 0x5064, 0x5d51, 0x6148, 0x5b37, 0x5f63, 0x6d39, 0x7145, 0x734f, 0x572b, 0x612c, 0x636b, 0x6e47, 0x6149, 0x4a7a, 0x707b, 0x7a61, 0x705a, 0x4c67, 0x5a74, 0x4c3f, 0x4e6d, 0x5529, 0x7a62, 0x5065, 0x6b56, 0x6c5f, 0x5f7c, 0x7756, 0x5e6a, 0x4b34, 0x6f3e, 0x4c35, 0x4f3d, 0x6f72, 0x6237, 0x4c68, 0x707c, 0x5660, 0x7146, 0x6238, 0x6b2b, 0x4b35, 0x5851, 0x744e, 0x7377, 0x5746, 0x513b, 0x772a, 0x6d4a, 0x5753, 0x587a, 0x7645, 0x514c, 0x5d7c, 0x5f7d, 0x7965, 0x604a, 0x727d, 0x5330, 0x7473, 0x5a49, 0x665e, 0x783a, 0x6850, 0x587b, 0x6a55, 0x5623, 0x7646, 0x725b, 0x647c, 0x6832, 0x5a5a, 0x725c, 0x7b56, 0x6932, 0x6e2d, 0x7a63, 0x5c6e, 0x756a, 0x6660, 0x707d, 0x572c, 0x7545, 0x6e60, 0x5b65, 0x5d5e, 0x5970, 0x6923, 0x7179, 0x7244, 0x604b, 0x6924, 0x6239, 0x6331, 0x7c6b, 0x4d28, 0x4c36, 0x705b, 0x663a, 0x4d29, 0x7343, 0x6159, 0x6f2b, 0x6745, 0x6069, 0x7345, 0x5440, 0x553f, 0x5d2e, 0x797c, 0x4c40, 0x6522, 0x4e38, 0x5852, 0x7956, 0x712a, 0x4e51, 0x7647, 0x5b6b, 0x5f7e, 0x5861, 0x7773, 0x5767, 0x547e, 0x513c, 0x654f, 0x4b36, 0x5a38, 0x4d44, 0x563e, 0x623a, 0x4f58, 0x604c, 0x6b79, 0x7d7d, 0x5768, 0x4b58, 0x6962, 0x683a, 0x6347, 0x6c4d, 0x6c4e, 0x563f, 0x6327, 0x5f56, 0x7d68, 0x6e61, 0x7628, 0x5d7d, 0x783b, 0x6851, 0x7957, 0x4e6e, 0x6c4f, 0x6925, 0x5655, 0x4d45, 0x6d3a, 0x513d, 0x4f3e, 0x6c3b, 0x5231, 0x4c69, 0x5944, 0x697c, 0x513e, 0x6c3c, 0x652d, 0x7730, 0x4c6a, 0x5344, 0x5640, 0x567d, 0x6121, 0x5e3d, 0x7629, 0x5a24, 0x5624, 0x7546, 0x6122, 0x6946, 0x7245, 0x7469, 0x566c, 0x6b53, 0x6c3d, 0x625c, 0x5e6b, 0x705c, 0x6b3f, 0x574e, 0x513f, 0x752b, 0x797d, 0x4a5c, 0x4d46, 0x7236, 0x5d7e, 0x4c37, 0x5b38, 0x5069, 0x4e5d, 0x6b40, 0x7d22, 0x784b, 0x6a56, 0x7130, 0x5b4e, 0x7743, 0x5b4f, 0x4b24, 0x7860, 0x7b57, 0x6b4a, 0x6021, 0x4e4d, 0x545c, 0x7d58, 0x5276, 0x7237, 0x7a76, 0x762a, 0x7a77, 0x5866, 0x7431, 0x6852, 0x4a45, 0x4c6b, 0x626e, 0x623b, 0x772d, 0x7861, 0x736c, 0x5e21, 0x647d, 0x636c, 0x5d2f, 0x5d30, 0x4b37, 0x6853, 0x6123, 0x5260, 0x707e, 0x6926, 0x4b72, 0x6d73, 0x5c59, 0x604d, 0x775a, 0x5b39, 0x4c2e, 0x5a5b, 0x4d47, 0x5d31, 0x582f, 0x6323, 0x4e6f, 0x7273, 0x7833, 0x604e, 0x757d, 0x6b6c, 0x5345, 0x7c6c, 0x525b, 0x546b, 0x5e22, 0x6566, 0x7030, 0x5544, 0x6d74, 0x636d, 0x6842, 0x6d75, 0x577c, 0x6d3b, 0x762b, 0x7238, 0x7648, 0x5366, 0x725d, 0x4f3f, 0x6b2c, 0x4f40, 0x6628, 0x7d69, 0x4f41, 0x605f, 0x5e6c, 0x6022, 0x743f, 0x626f, 0x5971, 0x7147, 0x4b38, 0x797e, 0x5b3a, 0x5a75, 0x766c, 0x5a5c, 0x7a64, 0x604f, 0x5d32, 0x6629, 0x6f73, 0x736d, 0x6b7a, 0x7966, 0x4a5d, 0x555e, 0x4a5e, 0x5f64, 0x667d, 0x752c, 0x6475, 0x6963, 0x6d4b, 0x4f64, 0x5853, 0x5d33, 0x546c, 0x7239, 0x5f37, 0x4b4e, 0x7b58, 0x5059, 0x5d52, 0x7774, 0x675c, 0x6425, 0x7c23, 0x5b3b, 0x723a, 0x697d, 0x504a, 0x7556, 0x5945, 0x6434, 0x6d27, 0x6a3d, 0x667e, 0x7744, 0x752d, 0x5960, 0x4a34, 0x7862, 0x4f42, 0x6c3e, 0x6534, 0x4d48, 0x6e48, 0x6748, 0x4d49, 0x7937, 0x7168, 0x5972, 0x5b75, 0x4a35, 0x5946, 0x5849, 0x592b, 0x6d3c, 0x5854, 0x5c5a, 0x623c, 0x7c6d, 0x6c60, 0x527e, 0x6947, 0x662a, 0x6270, 0x7a3b, 0x752e, 0x7b2a, 0x6c7b, 0x6c3f, 0x7c58, 0x5465, 0x7943, 0x6e62, 0x5769, 0x6d76, 0x5e6d, 0x4c6c, 0x636e, 0x6854, 0x7a78, 0x5d34, 0x6435, 0x5830, 0x5855, 0x746a, 0x4e39, 0x5661, 0x4f52, 0x5036, 0x4e22, 0x736e, 0x7378, 0x5c4c, 0x504b, 0x7c24, 0x4d4a, 0x5754, 0x5e23, 0x6460, 0x6e49, 0x625d, 0x757e, 0x542c, 0x5551, 0x5870, 0x7843, 0x6a57, 0x7557, 0x583f, 0x7d40, 0x6b2d, 0x552a, 0x6728, 0x6e4a, 0x4a67, 0x7863, 0x545d, 0x6a58, 0x7b59, 0x6d77, 0x6535, 0x502d, 0x7171, 0x623d, 0x6348, 0x5955, 0x5f2a, 0x5b3c, 0x7864, 0x717a, 0x6536, 0x736f, 0x7b5a, 0x6160, 0x592c, 0x756b, 0x6036, 0x6948, 0x4b4f, 0x6349, 0x5e6e, 0x623e, 0x5c6f, 0x5625, 0x6271, 0x567e, 0x5921, 0x5840, 0x5c5b, 0x6d3d, 0x5f38, 0x6a25, 0x572d, 0x7379, 0x6d78, 0x7547, 0x614a, 0x6b63, 0x725e, 0x784c, 0x6a59, 0x5346, 0x5b66, 0x752f, 0x4e70, 0x697e, 0x7b36, 0x6272, 0x4f72, 0x7739, 0x5973, 0x614b, 0x5a5d, 0x5a39, 0x6b7b, 0x4b39, 0x6d79, 0x6060, 0x7440, 0x7d3c, 0x5f31, 0x636f, 0x6023, 0x7d39, 0x7031, 0x4d4b, 0x6d3e, 0x5540, 0x6370, 0x6d7a, 0x6964, 0x556d, 0x675d, 0x5476, 0x6537, 0x5b67, 0x623f, 0x6e4b, 0x5774, 0x705d, 0x4e2b, 0x675e, 0x5656, 0x614c, 0x6833, 0x656e, 0x5c22, 0x6050, 0x5535, 0x5521, 0x7b5b, 0x794b, 0x4b73, 0x7425, 0x7a48, 0x5657, 0x6965, 0x7b5c, 0x7d50, 0x7b76, 0x5a25, 0x5b3d, 0x6c62, 0x4d77, 0x705e, 0x7649, 0x5e6f, 0x5331, 0x7c6e, 0x6843, 0x7148, 0x4e71, 0x796d, 0x7274, 0x6436, 0x7539, 0x5c70, 0x6371, 0x6825, 0x723b, 0x5e24, 0x5a4c, 0x4a69, 0x635a, 0x7c59, 0x6a5a, 0x7944, 0x6324, 0x7b5d, 0x6f4a, 0x6844, 0x554c, 0x6b57, 0x592d, 0x7b2b, 0x5359, 0x5522, 0x765e, 0x5a76, 0x6051, 0x6928, 0x7579, 0x7a2f, 0x6b7c, 0x606a, 0x6332, 0x5545, 0x7163, 0x556e, 0x4d4c, 0x6d59, 0x5841, 0x7a6c, 0x716b, 0x7a3c, 0x6662, 0x7a65, 0x627a, 0x4a36, 0x6437, 0x6a5b, 0x757a, 0x7b2c, 0x4f43, 0x6b7d, 0x787a, 0x5f39, 0x6171, 0x5224, 0x757b, 0x505a, 0x505b, 0x6a3e, 0x5931, 0x4a37, 0x5367, 0x7865, 0x5332, 0x6240, 0x725f, 0x4d65, 0x792c, 0x4d4d, 0x6e2e, 0x562e, 0x576a, 0x6760, 0x6b2e, 0x4f59, 0x5c4d, 0x6d7b, 0x5e70, 0x576b, 0x5e25, 0x5f57, 0x5b50, 0x5b51, 0x5523, 0x7032, 0x5c5c, 0x4a68, 0x7866, 0x5c4e, 0x6a5c, 0x5b52, 0x6933, 0x775b, 0x6328, 0x572e, 0x6061, 0x4b3a, 0x6551, 0x505c, 0x5541, 0x584a, 0x6329, 0x6024, 0x6929, 0x5347, 0x5c5d, 0x782e, 0x4c38, 0x502e, 0x5872, 0x634a, 0x4c2f, 0x542d, 0x7651, 0x504c, 0x4a46, 0x5542, 0x4e3a, 0x4a47, 0x7a30, 0x5f58, 0x753a, 0x656b, 0x6f74, 0x5d35, 0x4d2a, 0x6372, 0x7b77, 0x7750, 0x7d3a, 0x7d61, 0x767e, 0x5140, 0x6845, 0x6438, 0x6168, 0x4c41, 0x526d, 0x5b3e, 0x6062, 0x7a49, 0x614d, 0x4a38, 0x7260, 0x7149, 0x5e71, 0x705f, 0x7844, 0x6e4c, 0x5e72, 0x6749, 0x6273, 0x6761, 0x634b, 0x634c, 0x4f78, 0x6f2c, 0x7d7e, 0x7c25, 0x7a31, 0x5f59, 0x6052, 0x745a, 0x714a, 0x4e23, 0x723c, 0x6c63, 0x6025, 0x772b, 0x6b2f, 0x655e, 0x6124, 0x4d2b, 0x5974, 0x6826, 0x4d4e, 0x6169, 0x7c6f, 0x6063, 0x6241, 0x4e24, 0x5e26, 0x6b7e, 0x6b5d, 0x7060, 0x745b, 0x6274, 0x5348, 0x746b, 0x6e35, 0x7558, 0x555f, 0x5665, 0x6b30, 0x7463, 0x634d, 0x7474, 0x7a32, 0x6f75, 0x4a5f, 0x6b31, 0x6d3f, 0x7d49, 0x6426, 0x7924, 0x7033, 0x656c, 0x5167, 0x5947, 0x6457, 0x6a5d, 0x5477, 0x5a3a, 0x5a4d, 0x794c, 0x615a, 0x5b3f, 0x4c45, 0x6c50, 0x4b3b, 0x5e73, 0x692a, 0x5948, 0x6e63, 0x573d, 0x4f44, 0x504d, 0x7c26, 0x717b, 0x7d52, 0x5141, 0x635b, 0x5349, 0x5c4f, 0x4c6d, 0x5e27, 0x663b, 0x6c21, 0x4c39, 0x7b5e, 0x6762, 0x5441, 0x5c28, 0x6242, 0x7358, 0x6553, 0x7359, 0x7346, 0x4d5b, 0x4d2c, 0x7c43, 0x5467, 0x5142, 0x7925, 0x6855, 0x634e, 0x544a, 0x5f5a, 0x7b5f, 0x6763, 0x787b, 0x634f, 0x7530, 0x5867, 0x5949, 0x782f, 0x6f76, 0x5d36, 0x6e2f, 0x4d78, 0x5e38, 0x7c27, 0x777c, 0x7731, 0x4e3b, 0x7421, 0x6e4d, 0x612e, 0x6c43, 0x4f7e, 0x783f, 0x5862, 0x5368, 0x5e28, 0x7464, 0x6c42, 0x5975, 0x7945, 0x5d53, 0x5671, 0x6c7c, 0x7c70, 0x6d40, 0x4a39, 0x6e64, 0x7261, 0x5e39, 0x5672, 0x5e74, 0x5f5b, 0x5b53, 0x7a67, 0x5863, 0x7441, 0x5d37, 0x7275, 0x542e, 0x5673, 0x5d38, 0x4f45, 0x5f5f, 0x723e, 0x7621, 0x6b4b, 0x717c, 0x7347, 0x606b, 0x6d7c, 0x615b, 0x6e65, 0x5e75, 0x7a53, 0x714b, 0x502f, 0x5d39, 0x5143, 0x7531, 0x6a46, 0x7061, 0x762c, 0x7559, 0x706b, 0x5d3a, 0x723f, 0x7745, 0x5b22, 0x7276, 0x4a3a, 0x7775, 0x4b65, 0x6e66, 0x6053, 0x4e25, 0x5658, 0x542f, 0x6949, 0x534e, 0x7442, 0x4b66, 0x7121, 0x6b32, 0x7122, 0x6b33, 0x7034, 0x4b74, 0x5430, 0x7332, 0x7b37, 0x756c, 0x6e67, 0x7432, 0x756d, 0x4f73, 0x7062, 0x6e4e, 0x714c, 0x6538, 0x5775, 0x6373, 0x4f65, 0x4f46, 0x7333, 0x6458, 0x4f79, 0x4f5a, 0x7a4d, 0x6663, 0x7262, 0x756e, 0x4a3b, 0x635c, 0x4e72, 0x5659, 0x6e30, 0x7465, 0x5842, 0x5c50, 0x4c6e, 0x5560, 0x764a, 0x7d4a, 0x5856, 0x744f, 0x5626, 0x5c3e, 0x5b54, 0x5747, 0x727e, 0x714d, 0x6243, 0x5c5e, 0x5c5f, 0x6f2d, 0x662b, 0x795d, 0x6a3f, 0x6f2e, 0x7450, 0x4e73, 0x662c, 0x4e5e, 0x5579, 0x6374, 0x4d50, 0x5538, 0x777d, 0x5c29, 0x5e76, 0x5c2a, 0x7263, 0x6934, 0x525c, 0x6966, 0x6376, 0x674a, 0x504e, 0x5a77, 0x4a3c, 0x6e68, 0x5a5e, 0x7277, 0x627b, 0x4c26, 0x5a3b, 0x6e69, 0x755a, 0x775c, 0x616a, 0x4e41, 0x5431, 0x7d31, 0x663d, 0x7b2d, 0x7867, 0x614e, 0x7762, 0x756f, 0x4f47, 0x5432, 0x4c6f, 0x5468, 0x6e4f, 0x7757, 0x6026, 0x5641, 0x615c, 0x7063, 0x7164, 0x5c71, 0x5627, 0x7475, 0x714e, 0x7264, 0x5030, 0x6c6f, 0x793a, 0x6b35, 0x546d, 0x6244, 0x6967, 0x6b34, 0x6a21, 0x783c, 0x4e26, 0x7946, 0x7c5a, 0x5433, 0x5339, 0x6a5e, 0x692b, 0x6161, 0x534f, 0x7476, 0x6a40, 0x614f, 0x4c3a, 0x6e6a, 0x7064, 0x7334, 0x546e, 0x7240, 0x7165, 0x7443, 0x6054, 0x6b36, 0x5721, 0x4b68, 0x792d, 0x692d, 0x5864, 0x7a33, 0x6245, 0x7c3d, 0x6c44, 0x5831, 0x5c2b, 0x5524, 0x6b69, 0x683b, 0x5857, 0x7b2e, 0x5161, 0x5b40, 0x753e, 0x5e77, 0x4a7b, 0x7746, 0x4f48, 0x6150, 0x6e50, 0x6974, 0x4e74, 0x554d, 0x4f5b, 0x5d3b, 0x4e2c, 0x6968, 0x5434, 0x6447, 0x755b, 0x7a41, 0x5e29, 0x5478, 0x6f77, 0x5333, 0x6b37, 0x6f78, 0x755c, 0x6d4c, 0x5b55, 0x714f, 0x7150, 0x7532, 0x592e, 0x552c, 0x6246, 0x7d23, 0x7b65, 0x5f2b, 0x6275, 0x762d, 0x7533, 0x7035, 0x6125, 0x755d, 0x6c22, 0x6d7d, 0x7534, 0x7b38, 0x5b23, 0x564a, 0x4b59, 0x6554, 0x737a, 0x6b38, 0x6037, 0x576c, 0x716c, 0x652f, 0x5561, 0x576d, 0x5151, 0x6172, 0x6f79, 0x5d3c, 0x765c, 0x7065, 0x7444, 0x6969, 0x737b, 0x546f, 0x4c22, 0x777e, 0x5f3c, 0x6b4d, 0x5037, 0x5642, 0x682d, 0x6f2f, 0x4b25, 0x4b69, 0x7a68, 0x4c46, 0x6667, 0x6a47, 0x5b24, 0x4f49, 0x627c, 0x6f7a, 0x6b5e, 0x7548, 0x545e, 0x6055, 0x6f30, 0x6247, 0x592f, 0x7967, 0x6765, 0x4f4a, 0x6151, 0x6248, 0x6f7b, 0x7a79, 0x5c72, 0x6027, 0x7868, 0x4b6a, 0x4b3c, 0x5662, 0x755e, 0x755f, 0x6e36, 0x6276, 0x534a, 0x6f7c, 0x5144, 0x6f31, 0x5145, 0x505e, 0x5961, 0x6038, 0x4d51, 0x7339, 0x674c, 0x5628, 0x4e27, 0x5435, 0x6448, 0x5334, 0x6b39, 0x4b75, 0x765d, 0x7123, 0x4c47, 0x694a, 0x6170, 0x7560, 0x7b2f, 0x4b51, 0x7b60, 0x7265, 0x6c70, 0x706c, 0x6e6b, 0x694b, 0x4c70, 0x572f, 0x7321, 0x7c75, 0x7124, 0x6056, 0x6f32, 0x7451, 0x7721, 0x7151, 0x4a7c, 0x4a7d, 0x4e4e, 0x7348, 0x733a, 0x6d7e, 0x5a26, 0x606c, 0x784d, 0x4b52, 0x6b4e, 0x7958, 0x7959, 0x4a60, 0x5a4a, 0x4b26, 0x4a48, 0x796e, 0x5b6c, 0x5031, 0x556f, 0x6673, 0x6722, 0x6459, 0x6461, 0x7c44, 0x796f, 0x4f74, 0x7766, 0x4e3c, 0x7445, 0x5c23, 0x5d3d, 0x7446, 0x7821, 0x6856, 0x5b41, 0x7066, 0x6439, 0x766d, 0x792e, 0x5d3e, 0x5730, 0x5868, 0x4b3d, 0x795a, 0x784e, 0x7970, 0x606d, 0x6333, 0x7433, 0x6a42, 0x7266, 0x7036, 0x5b56, 0x6b64, 0x7267, 0x5755, 0x5436, 0x7968, 0x5741, 0x6555, 0x696a, 0x574c, 0x5369, 0x6249, 0x7c5b, 0x4d2d, 0x4c30, 0x6a22, 0x6476, 0x5040, 0x7037, 0x6e21, 0x5776, 0x624a, 0x624b, 0x7a4f, 0x6b5f, 0x564b, 0x7434, 0x6d4d, 0x6452, 0x6a29, 0x643a, 0x7322, 0x4d52, 0x764b, 0x7166, 0x6d41, 0x683c, 0x6e51, 0x7067, 0x624c, 0x642a, 0x7561, 0x6d5a, 0x576e, 0x5171, 0x696b, 0x696c, 0x6064, 0x5a27, 0x5d54, 0x6a23, 0x5643, 0x5674, 0x5a5f, 0x6f33, 0x624d, 0x6f7d, 0x7268, 0x6f45, 0x6767, 0x577d, 0x674e, 0x5f5c, 0x7947, 0x5976, 0x5f2c, 0x565a, 0x5c24, 0x7038, 0x557a, 0x6477, 0x5644, 0x746c, 0x6f7e, 0x7021, 0x5e2a, 0x5a3c, 0x587c, 0x7a54, 0x6c65, 0x7c28, 0x6c66, 0x584b, 0x7b39, 0x6453, 0x4d79, 0x4f53, 0x4a6a, 0x4f54, 0x783d, 0x7447, 0x6a5f, 0x795b, 0x5437, 0x6b65, 0x6152, 0x6a24, 0x7a42, 0x7b61, 0x7a6d, 0x7022, 0x4c71, 0x7a23, 0x6277, 0x624e, 0x6975, 0x616b, 0x6768, 0x6857, 0x5a78, 0x544b, 0x7776, 0x5645, 0x5469, 0x7a7a, 0x4c72, 0x775d, 0x5e3a, 0x4e28, 0x7039, 0x647e, 0x6449, 0x6454, 0x6a43, 0x6f34, 0x573e, 0x7b62, 0x4d53, 0x6f35, 0x7a69, 0x7926, 0x5f3d, 0x7747, 0x787d, 0x787c, 0x5e2b, 0x5b68, 0x635d, 0x6162, 0x5146, 0x7650, 0x6b66, 0x5a79, 0x6c47, 0x5e78, 0x7869, 0x635e, 0x4e75, 0x7a43, 0x6557, 0x6c48, 0x7349, 0x643b, 0x662e, 0x6f36, 0x5c3f, 0x4e3d, 0x5843, 0x504f, 0x4f7a, 0x734a, 0x6057, 0x5147, 0x692e, 0x683d, 0x7a44, 0x624f, 0x7a45, 0x7938, 0x5c60, 0x7b30, 0x5829, 0x655f, 0x7927, 0x766e, 0x764c, 0x6278, 0x6c71, 0x5a60, 0x7152, 0x524c, 0x4f4b, 0x4a3d, 0x5d3f, 0x766f, 0x5e79, 0x7a34, 0x552d, 0x7167, 0x5e3e, 0x5c40, 0x5148, 0x5149, 0x783e, 0x4b76, 0x5479, 0x7562, 0x6153, 0x5869, 0x787e, 0x4f4c, 0x7d24, 0x4e76, 0x7a50, 0x4c73, 0x663e, 0x762e, 0x5570, 0x514a, 0x7c3e, 0x5571, 0x4d69, 0x7a35, 0x6250, 0x7477, 0x4d54, 0x6723, 0x5b25, 0x6251, 0x5722, 0x7763, 0x6a26, 0x5021, 0x4e5a, 0x7b6b, 0x5b26, 0x5b5e, 0x5865, 0x6a60, 0x582a, 0x6560, 0x565b, 0x6f46, 0x786a, 0x6455, 0x4e77, 0x6058, 0x576f, 0x746d, 0x4d66, 0x4c74, 0x7563, 0x644a, 0x5c61, 0x7948, 0x7c3f, 0x6827, 0x5844, 0x4b3e, 0x5c2e, 0x5777, 0x7068, 0x5d40, 0x4f4d, 0x5c73, 0x5930, 0x6669, 0x643c, 0x6a44, 0x646c, 0x6465, 0x7b78, 0x4c3b, 0x643d, 0x4d5c, 0x5977, 0x5d5f, 0x6d4e, 0x5950, 0x6523, 0x794d, 0x4d2e, 0x4f4e, 0x762f, 0x7d53, 0x6b6d, 0x565c, 0x6524, 0x5536, 0x565d, 0x7969, 0x6724, 0x5663, 0x514b, 0x5664, 0x5572, 0x5e7a, 0x5778, 0x586a, 0x4f55, 0x587d, 0x582b, 0x7d4b, 0x7c5c, 0x6028, 0x5573, 0x7d59, 0x4c23, 0x5979, 0x536a, 0x7575, 0x6f47, 0x535a, 0x5a3d, 0x6828, 0x5c2f, 0x7023, 0x4d55, 0x6029, 0x5e2c, 0x703a, 0x6e31, 0x6e32, 0x764d, 0x6e52, 0x5646, 0x6065, 0x733b, 0x6561, 0x644b, 0x5723, 0x5b42, 0x4a7e, 0x4f4f, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, 0x3029, 0x302a, 0x302b, 0x302c, 0x302d, 0x302e, 0x302f, 0x3030, 0x3031, 0x3032, 0x3033, 0x3034, 0x3035, 0x3036, 0x3037, 0x3038, 0x3039, 0x303a, 0x303b, 0x303c, 0x303d, 0x303e, 0x303f, 0x3040, 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, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0x312a, 0x312b, 0x312c, 0x312d, 0x312e, 0x312f, 0x3130, 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, 0x3221, 0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0x322a, 0x322b, 0x322c, 0x322d, 0x322e, 0x322f, 0x3230, 0x3231, 0x3232, 0x3233, 0x3234, 0x3235, 0x3236, 0x3237, 0x3238, 0x3239, 0x323a, 0x323b, 0x323c, 0x323d, 0x323e, 0x323f, 0x3240, 0x3241, 0x3242, 0x3243, 0x3244, 0x3245, 0x3246, 0x3247, 0x3248, 0x3249, 0x324a, 0x324b, 0x324c, 0x324d, 0x324e, 0x324f, 0x3250, 0x3251, 0x3252, 0x3253, 0x3254, 0x3255, 0x3256, 0x3257, 0x3258, 0x3259, 0x325a, 0x325b, 0x325c, 0x325d, 0x325e, 0x325f, 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, 0x327c, 0x327d, 0x327e, 0x3321, 0x3322, 0x3323, 0x3324, 0x3325, 0x3326, 0x3327, 0x3328, 0x3329, 0x332a, 0x332b, 0x332c, 0x332d, 0x332e, 0x332f, 0x3330, 0x3331, 0x3332, 0x3333, 0x3334, 0x3335, 0x3336, 0x3337, 0x3338, 0x3339, 0x333a, 0x333b, 0x333c, 0x333d, 0x333e, 0x333f, 0x3340, 0x3341, 0x3342, 0x3343, 0x3344, 0x3345, 0x3346, 0x3347, 0x3348, 0x3349, 0x334a, 0x334b, 0x334c, 0x334d, 0x334e, 0x334f, 0x3350, 0x3351, 0x3352, 0x3353, 0x3354, 0x3355, 0x3356, 0x3357, 0x3358, 0x3359, 0x335a, 0x335b, 0x335c, 0x335d, 0x335e, 0x335f, 0x3360, 0x3361, 0x3362, 0x3363, 0x3364, 0x3365, 0x3366, 0x3367, 0x3368, 0x3369, 0x336a, 0x336b, 0x336c, 0x336d, 0x336e, 0x336f, 0x3370, 0x3371, 0x3372, 0x3373, 0x3374, 0x3375, 0x3376, 0x3377, 0x3378, 0x3379, 0x337a, 0x337b, 0x337c, 0x337d, 0x337e, 0x3421, 0x3422, 0x3423, 0x3424, 0x3425, 0x3426, 0x3427, 0x3428, 0x3429, 0x342a, 0x342b, 0x342c, 0x342d, 0x342e, 0x342f, 0x3430, 0x3431, 0x3432, 0x3433, 0x3434, 0x3435, 0x3436, 0x3437, 0x3438, 0x3439, 0x343a, 0x343b, 0x343c, 0x343d, 0x343e, 0x343f, 0x3440, 0x3441, 0x3442, 0x3443, 0x3444, 0x3445, 0x3446, 0x3447, 0x3448, 0x3449, 0x344a, 0x344b, 0x344c, 0x344d, 0x344e, 0x344f, 0x3450, 0x3451, 0x3452, 0x3453, 0x3454, 0x3455, 0x3456, 0x3457, 0x3458, 0x3459, 0x345a, 0x345b, 0x345c, 0x345d, 0x345e, 0x345f, 0x3460, 0x3461, 0x3462, 0x3463, 0x3464, 0x3465, 0x3466, 0x3467, 0x3468, 0x3469, 0x346a, 0x346b, 0x346c, 0x346d, 0x346e, 0x346f, 0x3470, 0x3471, 0x3472, 0x3473, 0x3474, 0x3475, 0x3476, 0x3477, 0x3478, 0x3479, 0x347a, 0x347b, 0x347c, 0x347d, 0x347e, 0x3521, 0x3522, 0x3523, 0x3524, 0x3525, 0x3526, 0x3527, 0x3528, 0x3529, 0x352a, 0x352b, 0x352c, 0x352d, 0x352e, 0x352f, 0x3530, 0x3531, 0x3532, 0x3533, 0x3534, 0x3535, 0x3536, 0x3537, 0x3538, 0x3539, 0x353a, 0x353b, 0x353c, 0x353d, 0x353e, 0x353f, 0x3540, 0x3541, 0x3542, 0x3543, 0x3544, 0x3545, 0x3546, 0x3547, 0x3548, 0x3549, 0x354a, 0x354b, 0x354c, 0x354d, 0x354e, 0x354f, 0x3550, 0x3551, 0x3552, 0x3553, 0x3554, 0x3555, 0x3556, 0x3557, 0x3558, 0x3559, 0x355a, 0x355b, 0x355c, 0x355d, 0x355e, 0x355f, 0x3560, 0x3561, 0x3562, 0x3563, 0x3564, 0x3565, 0x3566, 0x3567, 0x3568, 0x3569, 0x356a, 0x356b, 0x356c, 0x356d, 0x356e, 0x356f, 0x3570, 0x3571, 0x3572, 0x3573, 0x3574, 0x3575, 0x3576, 0x3577, 0x3578, 0x3579, 0x357a, 0x357b, 0x357c, 0x357d, 0x357e, 0x3621, 0x3622, 0x3623, 0x3624, 0x3625, 0x3626, 0x3627, 0x3628, 0x3629, 0x362a, 0x362b, 0x362c, 0x362d, 0x362e, 0x362f, 0x3630, 0x3631, 0x3632, 0x3633, 0x3634, 0x3635, 0x3636, 0x3637, 0x3638, 0x3639, 0x363a, 0x363b, 0x363c, 0x363d, 0x363e, 0x363f, 0x3640, 0x3641, 0x3642, 0x3643, 0x3644, 0x3645, 0x3646, 0x3647, 0x3648, 0x3649, 0x364a, 0x364b, 0x364c, 0x364d, 0x364e, 0x364f, 0x3650, 0x3651, 0x3652, 0x3653, 0x3654, 0x3655, 0x3656, 0x3657, 0x3658, 0x3659, 0x365a, 0x365b, 0x365c, 0x365d, 0x365e, 0x365f, 0x3660, 0x3661, 0x3662, 0x3663, 0x3664, 0x3665, 0x3666, 0x3667, 0x3668, 0x3669, 0x366a, 0x366b, 0x366c, 0x366d, 0x366e, 0x366f, 0x3670, 0x3671, 0x3672, 0x3673, 0x3674, 0x3675, 0x3676, 0x3677, 0x3678, 0x3679, 0x367a, 0x367b, 0x367c, 0x367d, 0x367e, 0x3721, 0x3722, 0x3723, 0x3724, 0x3725, 0x3726, 0x3727, 0x3728, 0x3729, 0x372a, 0x372b, 0x372c, 0x372d, 0x372e, 0x372f, 0x3730, 0x3731, 0x3732, 0x3733, 0x3734, 0x3735, 0x3736, 0x3737, 0x3738, 0x3739, 0x373a, 0x373b, 0x373c, 0x373d, 0x373e, 0x373f, 0x3740, 0x3741, 0x3742, 0x3743, 0x3744, 0x3745, 0x3746, 0x3747, 0x3748, 0x3749, 0x374a, 0x374b, 0x374c, 0x374d, 0x374e, 0x374f, 0x3750, 0x3751, 0x3752, 0x3753, 0x3754, 0x3755, 0x3756, 0x3757, 0x3758, 0x3759, 0x375a, 0x375b, 0x375c, 0x375d, 0x375e, 0x375f, 0x3760, 0x3761, 0x3762, 0x3763, 0x3764, 0x3765, 0x3766, 0x3767, 0x3768, 0x3769, 0x376a, 0x376b, 0x376c, 0x376d, 0x376e, 0x376f, 0x3770, 0x3771, 0x3772, 0x3773, 0x3774, 0x3775, 0x3776, 0x3777, 0x3778, 0x3779, 0x377a, 0x377b, 0x377c, 0x377d, 0x377e, 0x3821, 0x3822, 0x3823, 0x3824, 0x3825, 0x3826, 0x3827, 0x3828, 0x3829, 0x382a, 0x382b, 0x382c, 0x382d, 0x382e, 0x382f, 0x3830, 0x3831, 0x3832, 0x3833, 0x3834, 0x3835, 0x3836, 0x3837, 0x3838, 0x3839, 0x383a, 0x383b, 0x383c, 0x383d, 0x383e, 0x383f, 0x3840, 0x3841, 0x3842, 0x3843, 0x3844, 0x3845, 0x3846, 0x3847, 0x3848, 0x3849, 0x384a, 0x384b, 0x384c, 0x384d, 0x384e, 0x384f, 0x3850, 0x3851, 0x3852, 0x3853, 0x3854, 0x3855, 0x3856, 0x3857, 0x3858, 0x3859, 0x385a, 0x385b, 0x385c, 0x385d, 0x385e, 0x385f, 0x3860, 0x3861, 0x3862, 0x3863, 0x3864, 0x3865, 0x3866, 0x3867, 0x3868, 0x3869, 0x386a, 0x386b, 0x386c, 0x386d, 0x386e, 0x386f, 0x3870, 0x3871, 0x3872, 0x3873, 0x3874, 0x3875, 0x3876, 0x3877, 0x3878, 0x3879, 0x387a, 0x387b, 0x387c, 0x387d, 0x387e, 0x3921, 0x3922, 0x3923, 0x3924, 0x3925, 0x3926, 0x3927, 0x3928, 0x3929, 0x392a, 0x392b, 0x392c, 0x392d, 0x392e, 0x392f, 0x3930, 0x3931, 0x3932, 0x3933, 0x3934, 0x3935, 0x3936, 0x3937, 0x3938, 0x3939, 0x393a, 0x393b, 0x393c, 0x393d, 0x393e, 0x393f, 0x3940, 0x3941, 0x3942, 0x3943, 0x3944, 0x3945, 0x3946, 0x3947, 0x3948, 0x3949, 0x394a, 0x394b, 0x394c, 0x394d, 0x394e, 0x394f, 0x3950, 0x3951, 0x3952, 0x3953, 0x3954, 0x3955, 0x3956, 0x3957, 0x3958, 0x3959, 0x395a, 0x395b, 0x395c, 0x395d, 0x395e, 0x395f, 0x3960, 0x3961, 0x3962, 0x3963, 0x3964, 0x3965, 0x3966, 0x3967, 0x3968, 0x3969, 0x396a, 0x396b, 0x396c, 0x396d, 0x396e, 0x396f, 0x3970, 0x3971, 0x3972, 0x3973, 0x3974, 0x3975, 0x3976, 0x3977, 0x3978, 0x3979, 0x397a, 0x397b, 0x397c, 0x397d, 0x397e, 0x3a21, 0x3a22, 0x3a23, 0x3a24, 0x3a25, 0x3a26, 0x3a27, 0x3a28, 0x3a29, 0x3a2a, 0x3a2b, 0x3a2c, 0x3a2d, 0x3a2e, 0x3a2f, 0x3a30, 0x3a31, 0x3a32, 0x3a33, 0x3a34, 0x3a35, 0x3a36, 0x3a37, 0x3a38, 0x3a39, 0x3a3a, 0x3a3b, 0x3a3c, 0x3a3d, 0x3a3e, 0x3a3f, 0x3a40, 0x3a41, 0x3a42, 0x3a43, 0x3a44, 0x3a45, 0x3a46, 0x3a47, 0x3a48, 0x3a49, 0x3a4a, 0x3a4b, 0x3a4c, 0x3a4d, 0x3a4e, 0x3a4f, 0x3a50, 0x3a51, 0x3a52, 0x3a53, 0x3a54, 0x3a55, 0x3a56, 0x3a57, 0x3a58, 0x3a59, 0x3a5a, 0x3a5b, 0x3a5c, 0x3a5d, 0x3a5e, 0x3a5f, 0x3a60, 0x3a61, 0x3a62, 0x3a63, 0x3a64, 0x3a65, 0x3a66, 0x3a67, 0x3a68, 0x3a69, 0x3a6a, 0x3a6b, 0x3a6c, 0x3a6d, 0x3a6e, 0x3a6f, 0x3a70, 0x3a71, 0x3a72, 0x3a73, 0x3a74, 0x3a75, 0x3a76, 0x3a77, 0x3a78, 0x3a79, 0x3a7a, 0x3a7b, 0x3a7c, 0x3a7d, 0x3a7e, 0x3b21, 0x3b22, 0x3b23, 0x3b24, 0x3b25, 0x3b26, 0x3b27, 0x3b28, 0x3b29, 0x3b2a, 0x3b2b, 0x3b2c, 0x3b2d, 0x3b2e, 0x3b2f, 0x3b30, 0x3b31, 0x3b32, 0x3b33, 0x3b34, 0x3b35, 0x3b36, 0x3b37, 0x3b38, 0x3b39, 0x3b3a, 0x3b3b, 0x3b3c, 0x3b3d, 0x3b3e, 0x3b3f, 0x3b40, 0x3b41, 0x3b42, 0x3b43, 0x3b44, 0x3b45, 0x3b46, 0x3b47, 0x3b48, 0x3b49, 0x3b4a, 0x3b4b, 0x3b4c, 0x3b4d, 0x3b4e, 0x3b4f, 0x3b50, 0x3b51, 0x3b52, 0x3b53, 0x3b54, 0x3b55, 0x3b56, 0x3b57, 0x3b58, 0x3b59, 0x3b5a, 0x3b5b, 0x3b5c, 0x3b5d, 0x3b5e, 0x3b5f, 0x3b60, 0x3b61, 0x3b62, 0x3b63, 0x3b64, 0x3b65, 0x3b66, 0x3b67, 0x3b68, 0x3b69, 0x3b6a, 0x3b6b, 0x3b6c, 0x3b6d, 0x3b6e, 0x3b6f, 0x3b70, 0x3b71, 0x3b72, 0x3b73, 0x3b74, 0x3b75, 0x3b76, 0x3b77, 0x3b78, 0x3b79, 0x3b7a, 0x3b7b, 0x3b7c, 0x3b7d, 0x3b7e, 0x3c21, 0x3c22, 0x3c23, 0x3c24, 0x3c25, 0x3c26, 0x3c27, 0x3c28, 0x3c29, 0x3c2a, 0x3c2b, 0x3c2c, 0x3c2d, 0x3c2e, 0x3c2f, 0x3c30, 0x3c31, 0x3c32, 0x3c33, 0x3c34, 0x3c35, 0x3c36, 0x3c37, 0x3c38, 0x3c39, 0x3c3a, 0x3c3b, 0x3c3c, 0x3c3d, 0x3c3e, 0x3c3f, 0x3c40, 0x3c41, 0x3c42, 0x3c43, 0x3c44, 0x3c45, 0x3c46, 0x3c47, 0x3c48, 0x3c49, 0x3c4a, 0x3c4b, 0x3c4c, 0x3c4d, 0x3c4e, 0x3c4f, 0x3c50, 0x3c51, 0x3c52, 0x3c53, 0x3c54, 0x3c55, 0x3c56, 0x3c57, 0x3c58, 0x3c59, 0x3c5a, 0x3c5b, 0x3c5c, 0x3c5d, 0x3c5e, 0x3c5f, 0x3c60, 0x3c61, 0x3c62, 0x3c63, 0x3c64, 0x3c65, 0x3c66, 0x3c67, 0x3c68, 0x3c69, 0x3c6a, 0x3c6b, 0x3c6c, 0x3c6d, 0x3c6e, 0x3c6f, 0x3c70, 0x3c71, 0x3c72, 0x3c73, 0x3c74, 0x3c75, 0x3c76, 0x3c77, 0x3c78, 0x3c79, 0x3c7a, 0x3c7b, 0x3c7c, 0x3c7d, 0x3c7e, 0x3d21, 0x3d22, 0x3d23, 0x3d24, 0x3d25, 0x3d26, 0x3d27, 0x3d28, 0x3d29, 0x3d2a, 0x3d2b, 0x3d2c, 0x3d2d, 0x3d2e, 0x3d2f, 0x3d30, 0x3d31, 0x3d32, 0x3d33, 0x3d34, 0x3d35, 0x3d36, 0x3d37, 0x3d38, 0x3d39, 0x3d3a, 0x3d3b, 0x3d3c, 0x3d3d, 0x3d3e, 0x3d3f, 0x3d40, 0x3d41, 0x3d42, 0x3d43, 0x3d44, 0x3d45, 0x3d46, 0x3d47, 0x3d48, 0x3d49, 0x3d4a, 0x3d4b, 0x3d4c, 0x3d4d, 0x3d4e, 0x3d4f, 0x3d50, 0x3d51, 0x3d52, 0x3d53, 0x3d54, 0x3d55, 0x3d56, 0x3d57, 0x3d58, 0x3d59, 0x3d5a, 0x3d5b, 0x3d5c, 0x3d5d, 0x3d5e, 0x3d5f, 0x3d60, 0x3d61, 0x3d62, 0x3d63, 0x3d64, 0x3d65, 0x3d66, 0x3d67, 0x3d68, 0x3d69, 0x3d6a, 0x3d6b, 0x3d6c, 0x3d6d, 0x3d6e, 0x3d6f, 0x3d70, 0x3d71, 0x3d72, 0x3d73, 0x3d74, 0x3d75, 0x3d76, 0x3d77, 0x3d78, 0x3d79, 0x3d7a, 0x3d7b, 0x3d7c, 0x3d7d, 0x3d7e, 0x3e21, 0x3e22, 0x3e23, 0x3e24, 0x3e25, 0x3e26, 0x3e27, 0x3e28, 0x3e29, 0x3e2a, 0x3e2b, 0x3e2c, 0x3e2d, 0x3e2e, 0x3e2f, 0x3e30, 0x3e31, 0x3e32, 0x3e33, 0x3e34, 0x3e35, 0x3e36, 0x3e37, 0x3e38, 0x3e39, 0x3e3a, 0x3e3b, 0x3e3c, 0x3e3d, 0x3e3e, 0x3e3f, 0x3e40, 0x3e41, 0x3e42, 0x3e43, 0x3e44, 0x3e45, 0x3e46, 0x3e47, 0x3e48, 0x3e49, 0x3e4a, 0x3e4b, 0x3e4c, 0x3e4d, 0x3e4e, 0x3e4f, 0x3e50, 0x3e51, 0x3e52, 0x3e53, 0x3e54, 0x3e55, 0x3e56, 0x3e57, 0x3e58, 0x3e59, 0x3e5a, 0x3e5b, 0x3e5c, 0x3e5d, 0x3e5e, 0x3e5f, 0x3e60, 0x3e61, 0x3e62, 0x3e63, 0x3e64, 0x3e65, 0x3e66, 0x3e67, 0x3e68, 0x3e69, 0x3e6a, 0x3e6b, 0x3e6c, 0x3e6d, 0x3e6e, 0x3e6f, 0x3e70, 0x3e71, 0x3e72, 0x3e73, 0x3e74, 0x3e75, 0x3e76, 0x3e77, 0x3e78, 0x3e79, 0x3e7a, 0x3e7b, 0x3e7c, 0x3e7d, 0x3e7e, 0x3f21, 0x3f22, 0x3f23, 0x3f24, 0x3f25, 0x3f26, 0x3f27, 0x3f28, 0x3f29, 0x3f2a, 0x3f2b, 0x3f2c, 0x3f2d, 0x3f2e, 0x3f2f, 0x3f30, 0x3f31, 0x3f32, 0x3f33, 0x3f34, 0x3f35, 0x3f36, 0x3f37, 0x3f38, 0x3f39, 0x3f3a, 0x3f3b, 0x3f3c, 0x3f3d, 0x3f3e, 0x3f3f, 0x3f40, 0x3f41, 0x3f42, 0x3f43, 0x3f44, 0x3f45, 0x3f46, 0x3f47, 0x3f48, 0x3f49, 0x3f4a, 0x3f4b, 0x3f4c, 0x3f4d, 0x3f4e, 0x3f4f, 0x3f50, 0x3f51, 0x3f52, 0x3f53, 0x3f54, 0x3f55, 0x3f56, 0x3f57, 0x3f58, 0x3f59, 0x3f5a, 0x3f5b, 0x3f5c, 0x3f5d, 0x3f5e, 0x3f5f, 0x3f60, 0x3f61, 0x3f62, 0x3f63, 0x3f64, 0x3f65, 0x3f66, 0x3f67, 0x3f68, 0x3f69, 0x3f6a, 0x3f6b, 0x3f6c, 0x3f6d, 0x3f6e, 0x3f6f, 0x3f70, 0x3f71, 0x3f72, 0x3f73, 0x3f74, 0x3f75, 0x3f76, 0x3f77, 0x3f78, 0x3f79, 0x3f7a, 0x3f7b, 0x3f7c, 0x3f7d, 0x3f7e, 0x4021, 0x4022, 0x4023, 0x4024, 0x4025, 0x4026, 0x4027, 0x4028, 0x4029, 0x402a, 0x402b, 0x402c, 0x402d, 0x402e, 0x402f, 0x4030, 0x4031, 0x4032, 0x4033, 0x4034, 0x4035, 0x4036, 0x4037, 0x4038, 0x4039, 0x403a, 0x403b, 0x403c, 0x403d, 0x403e, 0x403f, 0x4040, 0x4041, 0x4042, 0x4043, 0x4044, 0x4045, 0x4046, 0x4047, 0x4048, 0x4049, 0x404a, 0x404b, 0x404c, 0x404d, 0x404e, 0x404f, 0x4050, 0x4051, 0x4052, 0x4053, 0x4054, 0x4055, 0x4056, 0x4057, 0x4058, 0x4059, 0x405a, 0x405b, 0x405c, 0x405d, 0x405e, 0x405f, 0x4060, 0x4061, 0x4062, 0x4063, 0x4064, 0x4065, 0x4066, 0x4067, 0x4068, 0x4069, 0x406a, 0x406b, 0x406c, 0x406d, 0x406e, 0x406f, 0x4070, 0x4071, 0x4072, 0x4073, 0x4074, 0x4075, 0x4076, 0x4077, 0x4078, 0x4079, 0x407a, 0x407b, 0x407c, 0x407d, 0x407e, 0x4121, 0x4122, 0x4123, 0x4124, 0x4125, 0x4126, 0x4127, 0x4128, 0x4129, 0x412a, 0x412b, 0x412c, 0x412d, 0x412e, 0x412f, 0x4130, 0x4131, 0x4132, 0x4133, 0x4134, 0x4135, 0x4136, 0x4137, 0x4138, 0x4139, 0x413a, 0x413b, 0x413c, 0x413d, 0x413e, 0x413f, 0x4140, 0x4141, 0x4142, 0x4143, 0x4144, 0x4145, 0x4146, 0x4147, 0x4148, 0x4149, 0x414a, 0x414b, 0x414c, 0x414d, 0x414e, 0x414f, 0x4150, 0x4151, 0x4152, 0x4153, 0x4154, 0x4155, 0x4156, 0x4157, 0x4158, 0x4159, 0x415a, 0x415b, 0x415c, 0x415d, 0x415e, 0x415f, 0x4160, 0x4161, 0x4162, 0x4163, 0x4164, 0x4165, 0x4166, 0x4167, 0x4168, 0x4169, 0x416a, 0x416b, 0x416c, 0x416d, 0x416e, 0x416f, 0x4170, 0x4171, 0x4172, 0x4173, 0x4174, 0x4175, 0x4176, 0x4177, 0x4178, 0x4179, 0x417a, 0x417b, 0x417c, 0x417d, 0x417e, 0x4221, 0x4222, 0x4223, 0x4224, 0x4225, 0x4226, 0x4227, 0x4228, 0x4229, 0x422a, 0x422b, 0x422c, 0x422d, 0x422e, 0x422f, 0x4230, 0x4231, 0x4232, 0x4233, 0x4234, 0x4235, 0x4236, 0x4237, 0x4238, 0x4239, 0x423a, 0x423b, 0x423c, 0x423d, 0x423e, 0x423f, 0x4240, 0x4241, 0x4242, 0x4243, 0x4244, 0x4245, 0x4246, 0x4247, 0x4248, 0x4249, 0x424a, 0x424b, 0x424c, 0x424d, 0x424e, 0x424f, 0x4250, 0x4251, 0x4252, 0x4253, 0x4254, 0x4255, 0x4256, 0x4257, 0x4258, 0x4259, 0x425a, 0x425b, 0x425c, 0x425d, 0x425e, 0x425f, 0x4260, 0x4261, 0x4262, 0x4263, 0x4264, 0x4265, 0x4266, 0x4267, 0x4268, 0x4269, 0x426a, 0x426b, 0x426c, 0x426d, 0x426e, 0x426f, 0x4270, 0x4271, 0x4272, 0x4273, 0x4274, 0x4275, 0x4276, 0x4277, 0x4278, 0x4279, 0x427a, 0x427b, 0x427c, 0x427d, 0x427e, 0x4321, 0x4322, 0x4323, 0x4324, 0x4325, 0x4326, 0x4327, 0x4328, 0x4329, 0x432a, 0x432b, 0x432c, 0x432d, 0x432e, 0x432f, 0x4330, 0x4331, 0x4332, 0x4333, 0x4334, 0x4335, 0x4336, 0x4337, 0x4338, 0x4339, 0x433a, 0x433b, 0x433c, 0x433d, 0x433e, 0x433f, 0x4340, 0x4341, 0x4342, 0x4343, 0x4344, 0x4345, 0x4346, 0x4347, 0x4348, 0x4349, 0x434a, 0x434b, 0x434c, 0x434d, 0x434e, 0x434f, 0x4350, 0x4351, 0x4352, 0x4353, 0x4354, 0x4355, 0x4356, 0x4357, 0x4358, 0x4359, 0x435a, 0x435b, 0x435c, 0x435d, 0x435e, 0x435f, 0x4360, 0x4361, 0x4362, 0x4363, 0x4364, 0x4365, 0x4366, 0x4367, 0x4368, 0x4369, 0x436a, 0x436b, 0x436c, 0x436d, 0x436e, 0x436f, 0x4370, 0x4371, 0x4372, 0x4373, 0x4374, 0x4375, 0x4376, 0x4377, 0x4378, 0x4379, 0x437a, 0x437b, 0x437c, 0x437d, 0x437e, 0x4421, 0x4422, 0x4423, 0x4424, 0x4425, 0x4426, 0x4427, 0x4428, 0x4429, 0x442a, 0x442b, 0x442c, 0x442d, 0x442e, 0x442f, 0x4430, 0x4431, 0x4432, 0x4433, 0x4434, 0x4435, 0x4436, 0x4437, 0x4438, 0x4439, 0x443a, 0x443b, 0x443c, 0x443d, 0x443e, 0x443f, 0x4440, 0x4441, 0x4442, 0x4443, 0x4444, 0x4445, 0x4446, 0x4447, 0x4448, 0x4449, 0x444a, 0x444b, 0x444c, 0x444d, 0x444e, 0x444f, 0x4450, 0x4451, 0x4452, 0x4453, 0x4454, 0x4455, 0x4456, 0x4457, 0x4458, 0x4459, 0x445a, 0x445b, 0x445c, 0x445d, 0x445e, 0x445f, 0x4460, 0x4461, 0x4462, 0x4463, 0x4464, 0x4465, 0x4466, 0x4467, 0x4468, 0x4469, 0x446a, 0x446b, 0x446c, 0x446d, 0x446e, 0x446f, 0x4470, 0x4471, 0x4472, 0x4473, 0x4474, 0x4475, 0x4476, 0x4477, 0x4478, 0x4479, 0x447a, 0x447b, 0x447c, 0x447d, 0x447e, 0x4521, 0x4522, 0x4523, 0x4524, 0x4525, 0x4526, 0x4527, 0x4528, 0x4529, 0x452a, 0x452b, 0x452c, 0x452d, 0x452e, 0x452f, 0x4530, 0x4531, 0x4532, 0x4533, 0x4534, 0x4535, 0x4536, 0x4537, 0x4538, 0x4539, 0x453a, 0x453b, 0x453c, 0x453d, 0x453e, 0x453f, 0x4540, 0x4541, 0x4542, 0x4543, 0x4544, 0x4545, 0x4546, 0x4547, 0x4548, 0x4549, 0x454a, 0x454b, 0x454c, 0x454d, 0x454e, 0x454f, 0x4550, 0x4551, 0x4552, 0x4553, 0x4554, 0x4555, 0x4556, 0x4557, 0x4558, 0x4559, 0x455a, 0x455b, 0x455c, 0x455d, 0x455e, 0x455f, 0x4560, 0x4561, 0x4562, 0x4563, 0x4564, 0x4565, 0x4566, 0x4567, 0x4568, 0x4569, 0x456a, 0x456b, 0x456c, 0x456d, 0x456e, 0x456f, 0x4570, 0x4571, 0x4572, 0x4573, 0x4574, 0x4575, 0x4576, 0x4577, 0x4578, 0x4579, 0x457a, 0x457b, 0x457c, 0x457d, 0x457e, 0x4621, 0x4622, 0x4623, 0x4624, 0x4625, 0x4626, 0x4627, 0x4628, 0x4629, 0x462a, 0x462b, 0x462c, 0x462d, 0x462e, 0x462f, 0x4630, 0x4631, 0x4632, 0x4633, 0x4634, 0x4635, 0x4636, 0x4637, 0x4638, 0x4639, 0x463a, 0x463b, 0x463c, 0x463d, 0x463e, 0x463f, 0x4640, 0x4641, 0x4642, 0x4643, 0x4644, 0x4645, 0x4646, 0x4647, 0x4648, 0x4649, 0x464a, 0x464b, 0x464c, 0x464d, 0x464e, 0x464f, 0x4650, 0x4651, 0x4652, 0x4653, 0x4654, 0x4655, 0x4656, 0x4657, 0x4658, 0x4659, 0x465a, 0x465b, 0x465c, 0x465d, 0x465e, 0x465f, 0x4660, 0x4661, 0x4662, 0x4663, 0x4664, 0x4665, 0x4666, 0x4667, 0x4668, 0x4669, 0x466a, 0x466b, 0x466c, 0x466d, 0x466e, 0x466f, 0x4670, 0x4671, 0x4672, 0x4673, 0x4674, 0x4675, 0x4676, 0x4677, 0x4678, 0x4679, 0x467a, 0x467b, 0x467c, 0x467d, 0x467e, 0x4721, 0x4722, 0x4723, 0x4724, 0x4725, 0x4726, 0x4727, 0x4728, 0x4729, 0x472a, 0x472b, 0x472c, 0x472d, 0x472e, 0x472f, 0x4730, 0x4731, 0x4732, 0x4733, 0x4734, 0x4735, 0x4736, 0x4737, 0x4738, 0x4739, 0x473a, 0x473b, 0x473c, 0x473d, 0x473e, 0x473f, 0x4740, 0x4741, 0x4742, 0x4743, 0x4744, 0x4745, 0x4746, 0x4747, 0x4748, 0x4749, 0x474a, 0x474b, 0x474c, 0x474d, 0x474e, 0x474f, 0x4750, 0x4751, 0x4752, 0x4753, 0x4754, 0x4755, 0x4756, 0x4757, 0x4758, 0x4759, 0x475a, 0x475b, 0x475c, 0x475d, 0x475e, 0x475f, 0x4760, 0x4761, 0x4762, 0x4763, 0x4764, 0x4765, 0x4766, 0x4767, 0x4768, 0x4769, 0x476a, 0x476b, 0x476c, 0x476d, 0x476e, 0x476f, 0x4770, 0x4771, 0x4772, 0x4773, 0x4774, 0x4775, 0x4776, 0x4777, 0x4778, 0x4779, 0x477a, 0x477b, 0x477c, 0x477d, 0x477e, 0x4821, 0x4822, 0x4823, 0x4824, 0x4825, 0x4826, 0x4827, 0x4828, 0x4829, 0x482a, 0x482b, 0x482c, 0x482d, 0x482e, 0x482f, 0x4830, 0x4831, 0x4832, 0x4833, 0x4834, 0x4835, 0x4836, 0x4837, 0x4838, 0x4839, 0x483a, 0x483b, 0x483c, 0x483d, 0x483e, 0x483f, 0x4840, 0x4841, 0x4842, 0x4843, 0x4844, 0x4845, 0x4846, 0x4847, 0x4848, 0x4849, 0x484a, 0x484b, 0x484c, 0x484d, 0x484e, 0x484f, 0x4850, 0x4851, 0x4852, 0x4853, 0x4854, 0x4855, 0x4856, 0x4857, 0x4858, 0x4859, 0x485a, 0x485b, 0x485c, 0x485d, 0x485e, 0x485f, 0x4860, 0x4861, 0x4862, 0x4863, 0x4864, 0x4865, 0x4866, 0x4867, 0x4868, 0x4869, 0x486a, 0x486b, 0x486c, 0x486d, 0x486e, 0x486f, 0x4870, 0x4871, 0x4872, 0x4873, 0x4874, 0x4875, 0x4876, 0x4877, 0x4878, 0x4879, 0x487a, 0x487b, 0x487c, 0x487d, 0x487e, 0x4b50, 0x4b56, 0x4b67, 0x4d4f, 0x4d68, 0x4e2d, 0x4f7b, 0x5022, 0x5038, 0x5050, 0x505d, 0x5154, 0x5155, 0x5158, 0x515b, 0x515c, 0x515d, 0x515e, 0x515f, 0x5160, 0x5162, 0x5163, 0x5164, 0x5165, 0x5166, 0x5168, 0x5169, 0x516a, 0x516b, 0x516d, 0x516f, 0x5170, 0x5172, 0x5176, 0x517a, 0x517c, 0x517d, 0x517e, 0x5222, 0x5223, 0x5227, 0x5228, 0x5229, 0x522a, 0x522b, 0x522d, 0x5232, 0x523e, 0x5242, 0x5243, 0x5244, 0x5246, 0x5247, 0x5248, 0x5249, 0x524a, 0x524b, 0x524d, 0x524e, 0x524f, 0x5250, 0x5251, 0x5252, 0x5253, 0x5254, 0x5255, 0x5256, 0x5257, 0x5259, 0x525a, 0x525e, 0x525f, 0x5261, 0x5262, 0x5264, 0x5265, 0x5266, 0x5267, 0x5268, 0x5269, 0x526a, 0x526b, 0x5270, 0x5271, 0x5272, 0x5273, 0x5274, 0x5275, 0x5277, 0x5278, 0x5466, 0x547c, 0x5525, 0x552b, 0x552e, 0x5638, 0x564d, 0x574b, 0x5764, 0x5b45, 0x5b64, 0x5c25, 0x5d25, 0x5d55, 0x5d74, 0x5e7c, 0x5e7e, 0x5f33, 0x5f61, 0x5f68, 0x6071, 0x612d, 0x616d, 0x6375, 0x6421, 0x6429, 0x652e, 0x6531, 0x6532, 0x6539, 0x653b, 0x653c, 0x6544, 0x654e, 0x6550, 0x6552, 0x6556, 0x657a, 0x657b, 0x657c, 0x657e, 0x6621, 0x6624, 0x6627, 0x662d, 0x662f, 0x6630, 0x6631, 0x6633, 0x6637, 0x6638, 0x663c, 0x6644, 0x6646, 0x6647, 0x664a, 0x6652, 0x6656, 0x6659, 0x665c, 0x665f, 0x6661, 0x6664, 0x6665, 0x6666, 0x6668, 0x666a, 0x666b, 0x666c, 0x666f, 0x6671, 0x6672, 0x6675, 0x6676, 0x6677, 0x6679, 0x6721, 0x6726, 0x6729, 0x672a, 0x672c, 0x672d, 0x6730, 0x673f, 0x6741, 0x6746, 0x6747, 0x674b, 0x674d, 0x674f, 0x6750, 0x6753, 0x675f, 0x6764, 0x6766, 0x6777, 0x6867, 0x6868, 0x6870, 0x6871, 0x6877, 0x6879, 0x687b, 0x687e, 0x6927, 0x692c, 0x694c, 0x6977, 0x6a41, 0x6a65, 0x6a74, 0x6a77, 0x6a7c, 0x6a7e, 0x6b24, 0x6b27, 0x6b29, 0x6b2a, 0x6b3a, 0x6b3b, 0x6b3d, 0x6b41, 0x6b42, 0x6b46, 0x6b47, 0x6b4c, 0x6b4f, 0x6b50, 0x6b51, 0x6b52, 0x6b58, 0x6c26, 0x6c27, 0x6c2a, 0x6c2f, 0x6c30, 0x6c31, 0x6c32, 0x6c35, 0x6c38, 0x6c3a, 0x6c40, 0x6c41, 0x6c45, 0x6c46, 0x6c49, 0x6c4a, 0x6c55, 0x6c5d, 0x6c5e, 0x6c61, 0x6c64, 0x6c67, 0x6c68, 0x6c77, 0x6c78, 0x6c7a, 0x6d21, 0x6d22, 0x6d23, 0x6d6e, 0x6e5b, 0x723d, 0x727a, 0x7331, 0x7427, 0x746e, 0x7674, 0x7676, 0x7738, 0x7748, 0x7753, 0x785b, 0x7870, 0x7a21, 0x7a22, 0x7a66, 0x7c29, 0x2321, 0x2322, 0x2323, 0x2324, 0x2325, 0x2326, 0x2327, 0x2328, 0x2329, 0x232a, 0x232b, 0x232c, 0x232d, 0x232e, 0x232f, 0x2330, 0x2331, 0x2332, 0x2333, 0x2334, 0x2335, 0x2336, 0x2337, 0x2338, 0x2339, 0x233a, 0x233b, 0x233c, 0x233d, 0x233e, 0x233f, 0x2340, 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, 0x235b, 0x212c, 0x235d, 0x235e, 0x235f, 0x2360, 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, 0x237b, 0x237c, 0x237d, 0x2226, 0x214b, 0x214c, 0x217e, 0x237e, 0x214d, 0x235c, }; static const Summary16 ksc5601_uni2indx_page00[70] = { /* 0x0000 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x6592 }, { 7, 0xf7df }, { 21, 0x0040 }, { 22, 0xc181 }, { 27, 0x0040 }, { 28, 0x4181 }, /* 0x0100 */ { 32, 0x0000 }, { 32, 0x0002 }, { 33, 0x00c0 }, { 35, 0x810e }, { 40, 0x0e07 }, { 46, 0x000c }, { 48, 0x00c0 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, /* 0x0200 */ { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0000 }, { 50, 0x0080 }, { 51, 0x2f01 }, { 57, 0x0000 }, { 57, 0x0000 }, /* 0x0300 */ { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0x0000 }, { 57, 0xfffe }, { 72, 0x03fb }, { 81, 0xfffe }, { 96, 0x03fb }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, /* 0x0400 */ { 105, 0x0002 }, { 106, 0xffff }, { 122, 0xffff }, { 138, 0xffff }, { 154, 0xffff }, { 170, 0x0002 }, }; static const Summary16 ksc5601_uni2indx_page20[103] = { /* 0x2000 */ { 171, 0x0000 }, { 171, 0x3320 }, { 176, 0x0063 }, { 180, 0x080d }, { 184, 0x0000 }, { 184, 0x0000 }, { 184, 0x0000 }, { 184, 0x8010 }, { 186, 0x001e }, { 190, 0x0000 }, { 190, 0x1000 }, { 191, 0x0000 }, { 191, 0x0000 }, { 191, 0x0000 }, { 191, 0x0000 }, { 191, 0x0000 }, /* 0x2100 */ { 191, 0x0208 }, { 193, 0x0048 }, { 195, 0x0846 }, { 199, 0x0000 }, { 199, 0x0000 }, { 199, 0x7818 }, { 205, 0x03ff }, { 215, 0x03ff }, { 225, 0x0000 }, { 225, 0x03ff }, { 235, 0x0000 }, { 235, 0x0000 }, { 235, 0x0000 }, { 235, 0x0014 }, { 237, 0x0000 }, { 237, 0x0000 }, /* 0x2200 */ { 237, 0x898d }, { 244, 0x6402 }, { 248, 0x5fa1 }, { 257, 0x3030 }, { 261, 0x0000 }, { 261, 0x0004 }, { 262, 0x0c33 }, { 268, 0x0000 }, { 268, 0x00cc }, { 272, 0x0200 }, { 273, 0x0020 }, { 274, 0x0000 }, { 274, 0x0000 }, { 274, 0x0000 }, { 274, 0x0000 }, { 274, 0x0000 }, /* 0x2300 */ { 274, 0x0000 }, { 274, 0x0004 }, { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, /* 0x2400 */ { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x0000 }, { 275, 0x7fff }, { 290, 0xfff0 }, { 302, 0x0007 }, { 305, 0xf000 }, { 309, 0xffff }, { 325, 0x003f }, { 331, 0x0000 }, { 331, 0xffff }, { 347, 0x03ff }, { 357, 0x0000 }, /* 0x2500 */ { 357, 0xf00f }, { 365, 0xffff }, { 381, 0xffff }, { 397, 0xffff }, { 413, 0x0fff }, { 425, 0x0000 }, { 425, 0x0000 }, { 425, 0x0000 }, { 425, 0x0000 }, { 425, 0x0004 }, { 426, 0x03fb }, { 435, 0x30cc }, { 441, 0xc9c3 }, { 449, 0x0003 }, { 451, 0x0000 }, { 451, 0x0000 }, /* 0x2600 */ { 451, 0xc060 }, { 455, 0x5000 }, { 457, 0x0000 }, { 457, 0x0000 }, { 457, 0x0005 }, { 459, 0x0000 }, { 459, 0x37bb }, }; static const Summary16 ksc5601_uni2indx_page30[62] = { /* 0x3000 */ { 470, 0xff0f }, { 482, 0x003b }, { 487, 0x0000 }, { 487, 0x0000 }, { 487, 0xfffe }, { 502, 0xffff }, { 518, 0xffff }, { 534, 0xffff }, { 550, 0xffff }, { 566, 0x000f }, { 570, 0xfffe }, { 585, 0xffff }, { 601, 0xffff }, { 617, 0xffff }, { 633, 0xffff }, { 649, 0x007f }, /* 0x3100 */ { 656, 0x0000 }, { 656, 0x0000 }, { 656, 0x0000 }, { 656, 0xfffe }, { 671, 0xffff }, { 687, 0xffff }, { 703, 0xffff }, { 719, 0xffff }, { 735, 0x7fff }, { 750, 0x0000 }, { 750, 0x0000 }, { 750, 0x0000 }, { 750, 0x0000 }, { 750, 0x0000 }, { 750, 0x0000 }, { 750, 0x0000 }, /* 0x3200 */ { 750, 0xffff }, { 766, 0x1fff }, { 779, 0x0000 }, { 779, 0x0000 }, { 779, 0x0000 }, { 779, 0x0000 }, { 779, 0xffff }, { 795, 0xcfff }, { 809, 0x0000 }, { 809, 0x0000 }, { 809, 0x0000 }, { 809, 0x0000 }, { 809, 0x0000 }, { 809, 0x0000 }, { 809, 0x0000 }, { 809, 0x0000 }, /* 0x3300 */ { 809, 0x0000 }, { 809, 0x0000 }, { 809, 0x0000 }, { 809, 0x0000 }, { 809, 0x0000 }, { 809, 0x0000 }, { 809, 0x0000 }, { 809, 0x0000 }, { 809, 0xff1f }, { 822, 0xffff }, { 838, 0xffff }, { 854, 0xffff }, { 870, 0x87ff }, { 882, 0x3949 }, }; static const Summary16 ksc5601_uni2indx_page4e[1306] = { /* 0x4e00 */ { 889, 0x2f8b }, { 898, 0x4372 }, { 905, 0x2000 }, { 906, 0x0b04 }, { 910, 0xe82c }, { 917, 0xe340 }, { 923, 0x2800 }, { 925, 0x40c8 }, { 929, 0x5944 }, { 935, 0x4937 }, { 943, 0x7976 }, { 953, 0x0440 }, { 955, 0x2c93 }, { 962, 0xa3f0 }, { 970, 0x0038 }, { 973, 0x08c5 }, /* 0x4f00 */ { 978, 0xee02 }, { 985, 0x0003 }, { 987, 0x8000 }, { 988, 0x3550 }, { 994, 0xe1c8 }, { 1001, 0x1e23 }, { 1008, 0x8200 }, { 1010, 0xc449 }, { 1016, 0xad5a }, { 1025, 0x2942 }, { 1030, 0xc000 }, { 1032, 0x8060 }, { 1035, 0x461c }, { 1041, 0xa49a }, { 1048, 0xc003 }, { 1052, 0x052a }, /* 0x5000 */ { 1057, 0x2a44 }, { 1062, 0xd646 }, { 1070, 0x3dda }, { 1080, 0x0800 }, { 1081, 0x8388 }, { 1086, 0x1420 }, { 1089, 0x0020 }, { 1090, 0x0170 }, { 1094, 0x2021 }, { 1097, 0x0302 }, { 1100, 0x3000 }, { 1102, 0x40ac }, { 1107, 0x8620 }, { 1111, 0x4462 }, { 1116, 0x20a0 }, { 1119, 0x8a00 }, /* 0x5100 */ { 1122, 0x0253 }, { 1127, 0x8004 }, { 1129, 0x0402 }, { 1131, 0x1484 }, { 1135, 0x7bfb }, { 1148, 0x1004 }, { 1150, 0x7fa4 }, { 1160, 0x11e2 }, { 1166, 0x2441 }, { 1170, 0x00a4 }, { 1173, 0x1421 }, { 1177, 0x20c0 }, { 1180, 0x3a50 }, { 1186, 0x7000 }, { 1189, 0x0002 }, { 1190, 0x2743 }, /* 0x5200 */ { 1197, 0x45c9 }, { 1204, 0x2082 }, { 1207, 0x4630 }, { 1212, 0x0fc1 }, { 1219, 0x3c88 }, { 1225, 0x2850 }, { 1229, 0x8602 }, { 1233, 0xa024 }, { 1237, 0x2388 }, { 1242, 0x8806 }, { 1246, 0x0e19 }, { 1252, 0x4000 }, { 1253, 0x22aa }, { 1259, 0xeb64 }, { 1268, 0x001c }, { 1271, 0xcd28 }, /* 0x5300 */ { 1278, 0xa120 }, { 1282, 0x02e1 }, { 1287, 0x840b }, { 1292, 0x8200 }, { 1294, 0x279b }, { 1303, 0x549e }, { 1311, 0x8141 }, { 1315, 0xa0b3 }, { 1322, 0x0010 }, { 1323, 0x8508 }, { 1327, 0x2061 }, { 1331, 0x0800 }, { 1332, 0x2f08 }, { 1338, 0x08d0 }, { 1342, 0xbe3e }, { 1353, 0x010f }, /* 0x5400 */ { 1358, 0xf718 }, { 1367, 0xa803 }, { 1372, 0x0a41 }, { 1376, 0x5b08 }, { 1382, 0x0504 }, { 1385, 0x0002 }, { 1386, 0x0500 }, { 1388, 0x382a }, { 1394, 0x5041 }, { 1398, 0x0001 }, { 1399, 0x1910 }, { 1403, 0x2108 }, { 1406, 0x0313 }, { 1411, 0x0000 }, { 1411, 0x6122 }, { 1416, 0x0404 }, /* 0x5500 */ { 1418, 0x40d0 }, { 1422, 0x1001 }, { 1424, 0x8000 }, { 1425, 0x4022 }, { 1428, 0x8050 }, { 1431, 0x4048 }, { 1434, 0x0008 }, { 1435, 0x1000 }, { 1436, 0x06d1 }, { 1442, 0x3700 }, { 1447, 0x5e80 }, { 1453, 0x0000 }, { 1453, 0x00a0 }, { 1455, 0x9410 }, { 1459, 0x0018 }, { 1461, 0x6000 }, /* 0x5600 */ { 1463, 0x0240 }, { 1465, 0x0090 }, { 1467, 0x8000 }, { 1468, 0x0054 }, { 1471, 0x0000 }, { 1471, 0x0008 }, { 1472, 0x0900 }, { 1474, 0x0010 }, { 1475, 0x0040 }, { 1476, 0x0000 }, { 1476, 0x5020 }, { 1479, 0x1010 }, { 1481, 0x2400 }, { 1483, 0x4c02 }, { 1487, 0x0001 }, { 1488, 0x0601 }, /* 0x5700 */ { 1491, 0x2918 }, { 1496, 0x814c }, { 1501, 0x2100 }, { 1503, 0x0801 }, { 1505, 0x6485 }, { 1511, 0x0003 }, { 1513, 0x4452 }, { 1518, 0x1021 }, { 1521, 0x0904 }, { 1524, 0x0008 }, { 1525, 0x000d }, { 1528, 0x0000 }, { 1528, 0x4988 }, { 1533, 0x8000 }, { 1534, 0x0001 }, { 1535, 0x1691 }, /* 0x5800 */ { 1541, 0x0765 }, { 1548, 0x4000 }, { 1549, 0x8492 }, { 1554, 0x0433 }, { 1559, 0x8c00 }, { 1562, 0x4592 }, { 1568, 0x0016 }, { 1571, 0x5220 }, { 1575, 0x0228 }, { 1578, 0xd008 }, { 1582, 0x4300 }, { 1585, 0x4c08 }, { 1589, 0x40a2 }, { 1593, 0xc32a }, { 1600, 0x9810 }, { 1604, 0x2e00 }, /* 0x5900 */ { 1608, 0x8000 }, { 1609, 0x1670 }, { 1615, 0x6e84 }, { 1622, 0x4082 }, { 1625, 0xc390 }, { 1631, 0x04b3 }, { 1637, 0x7c85 }, { 1645, 0x2118 }, { 1649, 0x041c }, { 1653, 0x02c8 }, { 1657, 0x1120 }, { 1660, 0x4a00 }, { 1663, 0x0a48 }, { 1667, 0x361b }, { 1675, 0x5540 }, { 1680, 0x8900 }, /* 0x5a00 */ { 1683, 0x000a }, { 1685, 0x9902 }, { 1690, 0x0221 }, { 1693, 0x1040 }, { 1695, 0x0242 }, { 1698, 0x0400 }, { 1699, 0x0044 }, { 1701, 0x0000 }, { 1701, 0x0000 }, { 1701, 0x0c04 }, { 1704, 0x0010 }, { 1705, 0x0000 }, { 1705, 0x1216 }, { 1710, 0x0000 }, { 1710, 0x0242 }, { 1713, 0x0000 }, /* 0x5b00 */ { 1713, 0x1a20 }, { 1717, 0x0040 }, { 1718, 0x0400 }, { 1719, 0x0000 }, { 1719, 0x0009 }, { 1721, 0xb5b3 }, { 1731, 0x0a18 }, { 1735, 0x1523 }, { 1741, 0x9ba0 }, { 1748, 0x1fe8 }, { 1757, 0x507c }, { 1764, 0x8379 }, { 1772, 0x10fd }, { 1780, 0xc09d }, { 1787, 0xdbf6 }, { 1799, 0x0560 }, /* 0x5c00 */ { 1803, 0xef92 }, { 1813, 0x0242 }, { 1816, 0x0110 }, { 1818, 0xdf02 }, { 1826, 0x6961 }, { 1833, 0x0822 }, { 1836, 0x9035 }, { 1842, 0x0202 }, { 1844, 0x0000 }, { 1844, 0x0003 }, { 1846, 0x1a02 }, { 1850, 0x45aa }, { 1857, 0x0001 }, { 1858, 0x0200 }, { 1859, 0x8101 }, { 1862, 0x2851 }, /* 0x5d00 */ { 1867, 0x6080 }, { 1870, 0x02d2 }, { 1875, 0x0280 }, { 1877, 0x0000 }, { 1877, 0x1800 }, { 1879, 0x0001 }, { 1880, 0x9200 }, { 1883, 0x0000 }, { 1883, 0x0880 }, { 1885, 0x2000 }, { 1886, 0x0405 }, { 1889, 0x3500 }, { 1893, 0x2000 }, { 1894, 0x6044 }, { 1898, 0x49e6 }, { 1906, 0x609e }, /* 0x5e00 */ { 1913, 0x104c }, { 1917, 0x2a42 }, { 1922, 0x2820 }, { 1925, 0xa148 }, { 1930, 0x10b1 }, { 1935, 0x8020 }, { 1937, 0x000e }, { 1940, 0x7b9c }, { 1950, 0x8490 }, { 1954, 0x14a0 }, { 1958, 0x28c1 }, { 1963, 0x41e0 }, { 1968, 0x0704 }, { 1972, 0x8c49 }, { 1978, 0x100d }, { 1982, 0x0cc8 }, /* 0x5f00 */ { 1987, 0x8412 }, { 1991, 0x89ba }, { 1999, 0x02c0 }, { 2002, 0x1422 }, { 2006, 0x5500 }, { 2010, 0x0ac0 }, { 2014, 0x3ec4 }, { 2022, 0x9283 }, { 2028, 0x1ca3 }, { 2035, 0x4387 }, { 2042, 0x4703 }, { 2048, 0x22a0 }, { 2052, 0x3028 }, { 2056, 0x03c0 }, { 2060, 0x0801 }, { 2062, 0xa020 }, /* 0x6000 */ { 2065, 0x8000 }, { 2066, 0x3044 }, { 2070, 0x85a3 }, { 2077, 0x0000 }, { 2077, 0x200e }, { 2081, 0x2225 }, { 2086, 0xb73c }, { 2096, 0x0001 }, { 2097, 0x3220 }, { 2101, 0x8c50 }, { 2106, 0x0099 }, { 2110, 0x315d }, { 2118, 0x00a0 }, { 2120, 0x9402 }, { 2124, 0x0003 }, { 2126, 0x0e4b }, /* 0x6100 */ { 2133, 0xe342 }, { 2140, 0x8c20 }, { 2144, 0x0080 }, { 2145, 0xd091 }, { 2151, 0x1d94 }, { 2158, 0xa328 }, { 2164, 0x499c }, { 2171, 0x60c1 }, { 2176, 0x4406 }, { 2180, 0x0713 }, { 2186, 0x5a90 }, { 2192, 0x4444 }, { 2196, 0x0f88 }, { 2202, 0x0000 }, { 2202, 0x0040 }, { 2203, 0x95c4 }, /* 0x6200 */ { 2210, 0x7581 }, { 2217, 0x8447 }, { 2223, 0x4402 }, { 2226, 0xc053 }, { 2232, 0x2b83 }, { 2239, 0x0108 }, { 2241, 0x4000 }, { 2242, 0x9242 }, { 2247, 0x0611 }, { 2251, 0x09a6 }, { 2257, 0x0800 }, { 2258, 0x3222 }, { 2263, 0xb384 }, { 2270, 0x1bdd }, { 2280, 0xf000 }, { 2284, 0xc08a }, /* 0x6300 */ { 2289, 0x0282 }, { 2292, 0x0002 }, { 2293, 0x8800 }, { 2295, 0x6c00 }, { 2299, 0x9200 }, { 2302, 0x0021 }, { 2304, 0x4180 }, { 2307, 0x8c84 }, { 2312, 0x1308 }, { 2316, 0x0944 }, { 2320, 0x07a7 }, { 2328, 0x0000 }, { 2328, 0x8051 }, { 2332, 0x0c41 }, { 2336, 0x6002 }, { 2339, 0x00d0 }, /* 0x6400 */ { 2342, 0xa000 }, { 2344, 0x10d0 }, { 2348, 0x3004 }, { 2351, 0x4400 }, { 2353, 0x0000 }, { 2353, 0x0100 }, { 2354, 0x8201 }, { 2357, 0x0700 }, { 2360, 0x0100 }, { 2361, 0x440e }, { 2366, 0x6830 }, { 2371, 0x0805 }, { 2374, 0x64b2 }, { 2381, 0x0514 }, { 2385, 0x10e6 }, { 2391, 0x4414 }, /* 0x6500 */ { 2395, 0x0011 }, { 2397, 0x2100 }, { 2399, 0x9c08 }, { 2404, 0xcbc0 }, { 2411, 0xe120 }, { 2416, 0x40c2 }, { 2420, 0x304c }, { 2425, 0x41b4 }, { 2431, 0x10ac }, { 2436, 0x9a83 }, { 2443, 0x98b2 }, { 2450, 0x3281 }, { 2455, 0x9822 }, { 2460, 0x0084 }, { 2462, 0x3369 }, { 2470, 0xbc12 }, /* 0x6600 */ { 2477, 0xd6c0 }, { 2484, 0xc03b }, { 2491, 0xa1a1 }, { 2497, 0x0c53 }, { 2503, 0x8a1e }, { 2510, 0xea00 }, { 2515, 0xcbf0 }, { 2524, 0x05d8 }, { 2530, 0x4390 }, { 2535, 0x21c3 }, { 2541, 0x4805 }, { 2545, 0x4a1c }, { 2551, 0x02d0 }, { 2555, 0x3240 }, { 2559, 0x0041 }, { 2561, 0xd79d }, /* 0x6700 */ { 2572, 0x2b09 }, { 2578, 0xe8b0 }, { 2585, 0x7dc0 }, { 2593, 0x2452 }, { 2598, 0xc240 }, { 2602, 0xd04b }, { 2609, 0xa000 }, { 2611, 0xc8ab }, { 2619, 0x8a80 }, { 2623, 0x34a9 }, { 2630, 0x8000 }, { 2631, 0x41c9 }, { 2637, 0x8010 }, { 2639, 0x241f }, { 2646, 0x9200 }, { 2649, 0x487b }, /* 0x6800 */ { 2657, 0x0000 }, { 2657, 0x00cc }, { 2661, 0x8406 }, { 2665, 0x3300 }, { 2669, 0x410f }, { 2675, 0x001b }, { 2679, 0x2000 }, { 2680, 0x8040 }, { 2682, 0x8022 }, { 2685, 0xa098 }, { 2690, 0xa186 }, { 2696, 0x006b }, { 2701, 0x2a30 }, { 2706, 0x85a4 }, { 2712, 0x4181 }, { 2716, 0x0604 }, /* 0x6900 */ { 2719, 0x6021 }, { 2723, 0x0004 }, { 2724, 0x0080 }, { 2725, 0xa001 }, { 2728, 0x0400 }, { 2729, 0x46b8 }, { 2736, 0xe90f }, { 2745, 0x03a0 }, { 2749, 0x0000 }, { 2749, 0x1820 }, { 2752, 0x40a0 }, { 2755, 0x0810 }, { 2757, 0x380a }, { 2762, 0x0001 }, { 2763, 0x0500 }, { 2765, 0xa800 }, /* 0x6a00 */ { 2768, 0x0404 }, { 2770, 0xc28a }, { 2776, 0x000a }, { 2778, 0x2720 }, { 2783, 0x0910 }, { 2786, 0x830c }, { 2791, 0x0802 }, { 2793, 0x0000 }, { 2793, 0x6211 }, { 2798, 0x1080 }, { 2800, 0x000c }, { 2802, 0x0808 }, { 2804, 0x000c }, { 2806, 0x0c08 }, { 2809, 0x0000 }, { 2809, 0x0840 }, /* 0x6b00 */ { 2811, 0x1410 }, { 2814, 0x0044 }, { 2816, 0x000b }, { 2819, 0x6404 }, { 2823, 0x50c0 }, { 2827, 0x8001 }, { 2829, 0x047e }, { 2836, 0x8984 }, { 2841, 0x0658 }, { 2846, 0x4140 }, { 2849, 0xc000 }, { 2851, 0x94a4 }, { 2857, 0xa862 }, { 2863, 0x09dc }, { 2870, 0x1800 }, { 2872, 0x0000 }, /* 0x6c00 */ { 2872, 0x8100 }, { 2874, 0x000a }, { 2876, 0x0008 }, { 2877, 0x4190 }, { 2881, 0x4007 }, { 2885, 0xe4a1 }, { 2892, 0x2501 }, { 2896, 0x6445 }, { 2902, 0x11ee }, { 2910, 0x0e7d }, { 2919, 0x4800 }, { 2921, 0xfb08 }, { 2929, 0x1616 }, { 2935, 0x08a8 }, { 2939, 0xc92e }, { 2947, 0x0009 }, /* 0x6d00 */ { 2949, 0x1800 }, { 2951, 0x4a82 }, { 2956, 0x06a0 }, { 2960, 0x6b64 }, { 2968, 0x0002 }, { 2969, 0x1600 }, { 2972, 0x5648 }, { 2978, 0x8390 }, { 2983, 0x73a0 }, { 2990, 0x002a }, { 2993, 0x8000 }, { 2994, 0x0024 }, { 2996, 0x88f9 }, { 3004, 0x4702 }, { 3009, 0x4d02 }, { 3014, 0x0faa }, /* 0x6e00 */ { 3022, 0x0000 }, { 3022, 0x8e80 }, { 3027, 0xb87b }, { 3037, 0x7554 }, { 3045, 0x2418 }, { 3049, 0xd940 }, { 3055, 0xc880 }, { 3059, 0x040c }, { 3062, 0x0000 }, { 3062, 0xb041 }, { 3067, 0x8c24 }, { 3072, 0x0442 }, { 3075, 0x5a34 }, { 3082, 0x001a }, { 3085, 0x8000 }, { 3086, 0xc110 }, /* 0x6f00 */ { 3090, 0x8046 }, { 3094, 0x0032 }, { 3097, 0x180d }, { 3102, 0x8106 }, { 3106, 0x0002 }, { 3107, 0xcd92 }, { 3115, 0x6014 }, { 3119, 0x7401 }, { 3124, 0x6112 }, { 3129, 0x0091 }, { 3132, 0xc098 }, { 3137, 0x420a }, { 3141, 0x040f }, { 3146, 0x8420 }, { 3149, 0x9a13 }, { 3156, 0x4002 }, /* 0x7000 */ { 3158, 0x8a62 }, { 3164, 0xfd22 }, { 3173, 0x8188 }, { 3177, 0x4080 }, { 3179, 0x1000 }, { 3180, 0x2103 }, { 3184, 0x0808 }, { 3186, 0x3101 }, { 3190, 0x4420 }, { 3193, 0x0704 }, { 3197, 0xb812 }, { 3203, 0x0388 }, { 3207, 0x8900 }, { 3210, 0xa300 }, { 3214, 0x0000 }, { 3214, 0x2202 }, /* 0x7100 */ { 3217, 0x1210 }, { 3220, 0x4600 }, { 3223, 0x0042 }, { 3225, 0x0041 }, { 3227, 0x5680 }, { 3232, 0x5241 }, { 3237, 0x52f0 }, { 3244, 0x2000 }, { 3245, 0x8610 }, { 3249, 0x8214 }, { 3253, 0x1004 }, { 3255, 0x4602 }, { 3259, 0x430a }, { 3264, 0x8035 }, { 3269, 0x60e0 }, { 3274, 0xd800 }, /* 0x7200 */ { 3278, 0x0041 }, { 3280, 0x0801 }, { 3282, 0x3400 }, { 3285, 0x6c65 }, { 3293, 0x11c1 }, { 3298, 0xab04 }, { 3304, 0x0286 }, { 3308, 0x2204 }, { 3311, 0x0003 }, { 3313, 0x0000 }, { 3313, 0x9084 }, { 3317, 0x0000 }, { 3317, 0x4015 }, { 3321, 0x0281 }, { 3324, 0x0202 }, { 3326, 0x3300 }, /* 0x7300 */ { 3330, 0x0400 }, { 3331, 0x3840 }, { 3335, 0x0e20 }, { 3339, 0xc0c0 }, { 3343, 0x0030 }, { 3345, 0x0085 }, { 3348, 0x0500 }, { 3350, 0x0d25 }, { 3356, 0x4ad0 }, { 3362, 0x81d0 }, { 3367, 0x2280 }, { 3370, 0x020c }, { 3373, 0xb605 }, { 3380, 0x6240 }, { 3384, 0x2679 }, { 3392, 0x6280 }, /* 0x7400 */ { 3396, 0x02ea }, { 3402, 0x0808 }, { 3404, 0xdd67 }, { 3415, 0x8579 }, { 3423, 0x081b }, { 3428, 0xdea0 }, { 3436, 0x8735 }, { 3444, 0x4000 }, { 3445, 0x0a8c }, { 3450, 0xd100 }, { 3454, 0x05aa }, { 3460, 0xa225 }, { 3466, 0x8440 }, { 3469, 0x1510 }, { 3473, 0x404d }, { 3478, 0x0080 }, /* 0x7500 */ { 3479, 0x0012 }, { 3481, 0x8d22 }, { 3487, 0x1968 }, { 3493, 0x058f }, { 3500, 0x9080 }, { 3503, 0x3a1a }, { 3510, 0x8464 }, { 3515, 0x8561 }, { 3521, 0xccc0 }, { 3527, 0x2002 }, { 3529, 0x0820 }, { 3531, 0x732e }, { 3540, 0x20a4 }, { 3544, 0x0b34 }, { 3550, 0x0004 }, { 3551, 0x1415 }, /* 0x7600 */ { 3556, 0x2001 }, { 3558, 0x8200 }, { 3560, 0x0057 }, { 3565, 0x0800 }, { 3566, 0x5004 }, { 3569, 0x0044 }, { 3571, 0x1212 }, { 3575, 0x7905 }, { 3582, 0x40d0 }, { 3586, 0x0009 }, { 3588, 0x4000 }, { 3589, 0x8400 }, { 3591, 0x054c }, { 3596, 0xd844 }, { 3602, 0x409a }, { 3607, 0x5114 }, /* 0x7700 */ { 3612, 0x0b12 }, { 3617, 0x4000 }, { 3618, 0x0201 }, { 3620, 0x1580 }, { 3624, 0x2001 }, { 3626, 0x0800 }, { 3627, 0x084a }, { 3631, 0xc200 }, { 3634, 0x0800 }, { 3635, 0x4002 }, { 3637, 0x3020 }, { 3640, 0x9809 }, { 3645, 0x0000 }, { 3645, 0x1880 }, { 3648, 0xe22c }, { 3655, 0x0008 }, /* 0x7800 */ { 3656, 0x0004 }, { 3657, 0x0004 }, { 3658, 0x10e0 }, { 3662, 0x0014 }, { 3664, 0x8020 }, { 3666, 0x2000 }, { 3667, 0x9800 }, { 3670, 0x1000 }, { 3671, 0x7082 }, { 3676, 0x0082 }, { 3678, 0x0288 }, { 3681, 0x1c00 }, { 3684, 0x4c22 }, { 3689, 0x0001 }, { 3690, 0x9100 }, { 3693, 0x0820 }, /* 0x7900 */ { 3695, 0x4002 }, { 3697, 0x0040 }, { 3698, 0x1c00 }, { 3701, 0x4400 }, { 3703, 0x0383 }, { 3708, 0x7cc1 }, { 3716, 0x2121 }, { 3720, 0x8400 }, { 3722, 0xe002 }, { 3726, 0x0002 }, { 3727, 0x44c0 }, { 3731, 0xe20a }, { 3737, 0x0e03 }, { 3742, 0x8126 }, { 3747, 0x02d0 }, { 3751, 0x0800 }, /* 0x7a00 */ { 3752, 0x2921 }, { 3757, 0x9690 }, { 3763, 0x4001 }, { 3765, 0xb8c2 }, { 3772, 0x6241 }, { 3777, 0x0080 }, { 3778, 0x0a06 }, { 3782, 0xa651 }, { 3789, 0x0112 }, { 3792, 0x812c }, { 3797, 0xc600 }, { 3801, 0x0400 }, { 3802, 0x0cb0 }, { 3807, 0xa280 }, { 3811, 0xa429 }, { 3817, 0x8640 }, /* 0x7b00 */ { 3821, 0x8000 }, { 3822, 0x4a02 }, { 3826, 0x3041 }, { 3830, 0x0200 }, { 3831, 0xba40 }, { 3837, 0x0057 }, { 3842, 0x5001 }, { 3845, 0x2020 }, { 3847, 0x8880 }, { 3850, 0x24b0 }, { 3855, 0x2002 }, { 3857, 0x0112 }, { 3860, 0x02d3 }, { 3866, 0x0004 }, { 3867, 0x0211 }, { 3870, 0x0000 }, /* 0x7c00 */ { 3870, 0x0080 }, { 3871, 0x4004 }, { 3873, 0x0c82 }, { 3877, 0xe000 }, { 3880, 0x3008 }, { 3883, 0x0000 }, { 3883, 0x1011 }, { 3886, 0x0008 }, { 3887, 0x0208 }, { 3889, 0x81a4 }, { 3894, 0x40a0 }, { 3897, 0x420e }, { 3902, 0x0400 }, { 3903, 0xc040 }, { 3906, 0x0081 }, { 3908, 0x4800 }, /* 0x7d00 */ { 3910, 0x2df5 }, { 3920, 0x0f91 }, { 3927, 0xd807 }, { 3934, 0x0629 }, { 3939, 0x007c }, { 3944, 0x4001 }, { 3946, 0x4546 }, { 3952, 0x824e }, { 3958, 0xc000 }, { 3960, 0x1008 }, { 3962, 0x3005 }, { 3966, 0xed36 }, { 3976, 0x0c80 }, { 3979, 0x6540 }, { 3984, 0x930b }, { 3991, 0x0810 }, /* 0x7e00 */ { 3993, 0x0600 }, { 3995, 0xe820 }, { 4000, 0xc80a }, { 4005, 0x6082 }, { 4009, 0x00ca }, { 4013, 0x4034 }, { 4017, 0x2e02 }, { 4022, 0x1201 }, { 4025, 0x9004 }, { 4028, 0x1948 }, { 4033, 0x0000 }, { 4033, 0x0000 }, { 4033, 0x0000 }, { 4033, 0x0000 }, { 4033, 0x0000 }, { 4033, 0x0000 }, /* 0x7f00 */ { 4033, 0x0000 }, { 4033, 0x0000 }, { 4033, 0x0000 }, { 4033, 0x0540 }, { 4036, 0x1000 }, { 4037, 0x0031 }, { 4040, 0x4c00 }, { 4043, 0x02a5 }, { 4048, 0x5520 }, { 4053, 0x4410 }, { 4056, 0x0310 }, { 4059, 0x2304 }, { 4063, 0x5422 }, { 4068, 0x8034 }, { 4072, 0x0a03 }, { 4076, 0x1201 }, /* 0x8000 */ { 4079, 0x126b }, { 4086, 0x01a1 }, { 4090, 0x2000 }, { 4091, 0xa048 }, { 4095, 0x0448 }, { 4098, 0x4540 }, { 4102, 0x8000 }, { 4103, 0xe08d }, { 4110, 0x1af0 }, { 4117, 0x2840 }, { 4120, 0x8626 }, { 4126, 0x0416 }, { 4130, 0x5018 }, { 4134, 0x4c00 }, { 4137, 0x0032 }, { 4140, 0x2112 }, /* 0x8100 */ { 4144, 0x05e4 }, { 4150, 0x0d00 }, { 4153, 0x8a08 }, { 4157, 0x4200 }, { 4159, 0x4800 }, { 4161, 0x0033 }, { 4165, 0x0860 }, { 4168, 0x8703 }, { 4174, 0x8501 }, { 4178, 0x3400 }, { 4181, 0x0109 }, { 4184, 0xe428 }, { 4190, 0x2045 }, { 4194, 0x8100 }, { 4196, 0x25a8 }, { 4202, 0x5c18 }, /* 0x8200 */ { 4208, 0x35a0 }, { 4214, 0xd804 }, { 4219, 0x1c02 }, { 4223, 0x02e0 }, { 4227, 0x00a1 }, { 4230, 0x0200 }, { 4231, 0xc050 }, { 4235, 0x4146 }, { 4240, 0x6800 }, { 4243, 0xa604 }, { 4248, 0xf260 }, { 4255, 0xbb8a }, { 4264, 0x0000 }, { 4264, 0xc8b6 }, { 4272, 0x00e2 }, { 4276, 0x6002 }, /* 0x8300 */ { 4279, 0x023e }, { 4285, 0x0080 }, { 4286, 0x8900 }, { 4289, 0x0372 }, { 4295, 0x8681 }, { 4300, 0x0006 }, { 4302, 0x0000 }, { 4302, 0x0888 }, { 4305, 0x4600 }, { 4308, 0x4140 }, { 4311, 0x0e04 }, { 4315, 0x2000 }, { 4316, 0x1622 }, { 4321, 0x1048 }, { 4324, 0x8a00 }, { 4327, 0x2217 }, /* 0x8400 */ { 4333, 0x7418 }, { 4339, 0x0000 }, { 4339, 0x1200 }, { 4341, 0x2102 }, { 4344, 0x0200 }, { 4345, 0x0880 }, { 4347, 0x984a }, { 4353, 0x0420 }, { 4355, 0x0000 }, { 4355, 0x1211 }, { 4359, 0x0002 }, { 4360, 0x9904 }, { 4365, 0x2a55 }, { 4372, 0x0402 }, { 4374, 0x5000 }, { 4376, 0x1010 }, /* 0x8500 */ { 4378, 0x0000 }, { 4378, 0x459a }, { 4385, 0xb02a }, { 4391, 0xa000 }, { 4393, 0x420a }, { 4397, 0x0208 }, { 4399, 0x2708 }, { 4404, 0x0000 }, { 4404, 0x8090 }, { 4407, 0x0812 }, { 4410, 0x8740 }, { 4415, 0x0401 }, { 4417, 0xe202 }, { 4422, 0x3020 }, { 4425, 0x0630 }, { 4429, 0x8c80 }, /* 0x8600 */ { 4433, 0x04c4 }, { 4437, 0x04c0 }, { 4440, 0x2000 }, { 4441, 0x8000 }, { 4442, 0x4000 }, { 4443, 0xd831 }, { 4450, 0x0080 }, { 4451, 0x0200 }, { 4452, 0x1400 }, { 4454, 0x0008 }, { 4455, 0x0218 }, { 4458, 0x0000 }, { 4458, 0x0880 }, { 4460, 0x8a10 }, { 4464, 0x2010 }, { 4466, 0x4000 }, /* 0x8700 */ { 4467, 0x010d }, { 4471, 0x1500 }, { 4474, 0x0000 }, { 4474, 0x0000 }, { 4474, 0x4000 }, { 4475, 0x80a0 }, { 4478, 0x0140 }, { 4480, 0x0150 }, { 4483, 0x2004 }, { 4485, 0x8000 }, { 4486, 0x0004 }, { 4487, 0x0408 }, { 4489, 0x0010 }, { 4490, 0x0000 }, { 4490, 0x9001 }, { 4493, 0x4a04 }, /* 0x8800 */ { 4497, 0x0020 }, { 4498, 0x8000 }, { 4499, 0x000c }, { 4501, 0x0842 }, { 4504, 0x3041 }, { 4508, 0x2a8c }, { 4514, 0x090e }, { 4519, 0xc085 }, { 4524, 0x2906 }, { 4529, 0x40c4 }, { 4533, 0x0800 }, { 4534, 0x0010 }, { 4535, 0x8006 }, { 4538, 0xb230 }, { 4544, 0x0102 }, { 4546, 0x2138 }, /* 0x8900 */ { 4551, 0x0080 }, { 4552, 0x030d }, { 4557, 0x0420 }, { 4559, 0x0940 }, { 4562, 0x0012 }, { 4564, 0x8000 }, { 4565, 0x0410 }, { 4567, 0x8004 }, { 4569, 0x88ca }, { 4575, 0x0048 }, { 4577, 0x0602 }, { 4580, 0x2404 }, { 4583, 0x0001 }, { 4584, 0x0004 }, { 4585, 0x0008 }, { 4586, 0x0110 }, /* 0x8a00 */ { 4588, 0x550d }, { 4595, 0xa9c8 }, { 4602, 0x2428 }, { 4606, 0x0c52 }, { 4611, 0x0000 }, { 4611, 0x4831 }, { 4616, 0x624d }, { 4623, 0x022f }, { 4629, 0x30a0 }, { 4633, 0x4128 }, { 4637, 0x057b }, { 4645, 0xd205 }, { 4651, 0xa894 }, { 4657, 0x1844 }, { 4661, 0x6cc2 }, { 4668, 0x45c2 }, /* 0x8b00 */ { 4674, 0x4017 }, { 4679, 0x2ed1 }, { 4687, 0x1901 }, { 4691, 0x0208 }, { 4693, 0xc202 }, { 4697, 0x1500 }, { 4700, 0x9040 }, { 4703, 0x2091 }, { 4707, 0x0401 }, { 4709, 0x044d }, { 4714, 0x0000 }, { 4714, 0x0000 }, { 4714, 0x0000 }, { 4714, 0x0000 }, { 4714, 0x0000 }, { 4714, 0x0000 }, /* 0x8c00 */ { 4714, 0x0000 }, { 4714, 0x0000 }, { 4714, 0x0000 }, { 4714, 0x8080 }, { 4716, 0x1542 }, { 4721, 0x0420 }, { 4723, 0x0c02 }, { 4726, 0x0600 }, { 4728, 0x1404 }, { 4731, 0x6000 }, { 4733, 0x9f87 }, { 4743, 0xb9d9 }, { 4753, 0x059f }, { 4761, 0x540a }, { 4766, 0x245d }, { 4773, 0x3810 }, /* 0x8d00 */ { 4777, 0x25b0 }, { 4783, 0x0048 }, { 4785, 0x0000 }, { 4785, 0x0000 }, { 4785, 0x0000 }, { 4785, 0x0000 }, { 4785, 0x0850 }, { 4788, 0x0099 }, { 4792, 0x0420 }, { 4794, 0x0200 }, { 4795, 0x0108 }, { 4797, 0x4408 }, { 4800, 0x9840 }, { 4804, 0x2800 }, { 4806, 0x810a }, { 4810, 0x0008 }, /* 0x8e00 */ { 4811, 0x8400 }, { 4813, 0x4001 }, { 4815, 0x0400 }, { 4816, 0x0021 }, { 4818, 0x0794 }, { 4824, 0x8200 }, { 4826, 0x0001 }, { 4827, 0x0050 }, { 4829, 0x2482 }, { 4833, 0x0000 }, { 4833, 0x1c00 }, { 4836, 0x0000 }, { 4836, 0x3c01 }, { 4841, 0x8004 }, { 4843, 0x0800 }, { 4844, 0x4900 }, /* 0x8f00 */ { 4847, 0x0228 }, { 4850, 0xf83c }, { 4859, 0x86c0 }, { 4864, 0xcb08 }, { 4870, 0x6230 }, { 4875, 0xa000 }, { 4877, 0x0004 }, { 4878, 0x0000 }, { 4878, 0x0000 }, { 4878, 0x1800 }, { 4880, 0xa148 }, { 4885, 0x0007 }, { 4888, 0x4024 }, { 4891, 0x0012 }, { 4893, 0x2c40 }, { 4897, 0x2285 }, /* 0x9000 */ { 4902, 0xa96f }, { 4912, 0xe6b3 }, { 4922, 0x400f }, { 4927, 0x5126 }, { 4933, 0x6c86 }, { 4940, 0x723b }, { 4949, 0xe20b }, { 4956, 0xb5a4 }, { 4964, 0x859f }, { 4973, 0x0222 }, { 4976, 0x854c }, { 4982, 0x0123 }, { 4986, 0x0402 }, { 4988, 0x4000 }, { 4989, 0x2102 }, { 4992, 0x2020 }, /* 0x9100 */ { 4994, 0x0004 }, { 4995, 0x0224 }, { 4998, 0x2080 }, { 5000, 0x0004 }, { 5001, 0x7e00 }, { 5007, 0x0004 }, { 5008, 0x1604 }, { 5012, 0x01a0 }, { 5015, 0x2a80 }, { 5019, 0x1004 }, { 5021, 0xd800 }, { 5025, 0x0032 }, { 5028, 0xfa81 }, { 5036, 0x3183 }, { 5042, 0x0488 }, { 5045, 0x0020 }, /* 0x9200 */ { 5046, 0x2000 }, { 5047, 0x4087 }, { 5052, 0x0000 }, { 5052, 0x8410 }, { 5055, 0x0221 }, { 5058, 0x4880 }, { 5061, 0x0074 }, { 5065, 0x0000 }, { 5065, 0x0029 }, { 5068, 0x114a }, { 5073, 0x0000 }, { 5073, 0x02c8 }, { 5077, 0x9000 }, { 5079, 0x0004 }, { 5080, 0x0410 }, { 5082, 0x1100 }, /* 0x9300 */ { 5084, 0x0010 }, { 5085, 0xc501 }, { 5090, 0xc957 }, { 5099, 0x0000 }, { 5099, 0x2d00 }, { 5103, 0x0810 }, { 5105, 0x4000 }, { 5106, 0x5020 }, { 5109, 0x1000 }, { 5110, 0x0450 }, { 5113, 0x3088 }, { 5117, 0x0001 }, { 5118, 0x0008 }, { 5119, 0x4002 }, { 5121, 0x0012 }, { 5123, 0x0040 }, /* 0x9400 */ { 5124, 0x0010 }, { 5125, 0x0100 }, { 5126, 0x0820 }, { 5128, 0x0120 }, { 5130, 0x0010 }, { 5131, 0x0806 }, { 5134, 0x0000 }, { 5134, 0xa000 }, { 5136, 0x0000 }, { 5136, 0x0000 }, { 5136, 0x0000 }, { 5136, 0x0000 }, { 5136, 0x0000 }, { 5136, 0x0000 }, { 5136, 0x0000 }, { 5136, 0x0000 }, /* 0x9500 */ { 5136, 0x0000 }, { 5136, 0x0000 }, { 5136, 0x0000 }, { 5136, 0x0000 }, { 5136, 0x0000 }, { 5136, 0x0000 }, { 5136, 0x0000 }, { 5136, 0x0080 }, { 5137, 0x8a09 }, { 5142, 0x011e }, { 5147, 0x2138 }, { 5152, 0x1802 }, { 5155, 0x0480 }, { 5157, 0x1070 }, { 5161, 0x0006 }, { 5163, 0x0000 }, /* 0x9600 */ { 5163, 0x0000 }, { 5163, 0x1000 }, { 5164, 0x4402 }, { 5167, 0x8804 }, { 5170, 0x3815 }, { 5176, 0xf801 }, { 5182, 0x041c }, { 5186, 0x21e9 }, { 5193, 0x6c60 }, { 5199, 0x1b30 }, { 5205, 0x0588 }, { 5209, 0x0882 }, { 5212, 0x7af3 }, { 5223, 0x1a60 }, { 5228, 0x870c }, { 5234, 0x0ac5 }, /* 0x9700 */ { 5240, 0x00c1 }, { 5243, 0x524a }, { 5249, 0x0080 }, { 5250, 0x2205 }, { 5254, 0x0114 }, { 5257, 0x5042 }, { 5261, 0x2206 }, { 5265, 0x0490 }, { 5268, 0xa800 }, { 5271, 0x0000 }, { 5271, 0x2901 }, { 5275, 0x0000 }, { 5275, 0x0840 }, { 5277, 0x1008 }, { 5279, 0x0000 }, { 5279, 0x8848 }, /* 0x9800 */ { 5283, 0x156f }, { 5292, 0x018f }, { 5298, 0x2000 }, { 5299, 0x0b01 }, { 5303, 0x7040 }, { 5307, 0x4510 }, { 5311, 0x88a0 }, { 5315, 0x0000 }, { 5315, 0x0000 }, { 5315, 0x0000 }, { 5315, 0x8100 }, { 5317, 0x0002 }, { 5318, 0x0090 }, { 5320, 0x9800 }, { 5323, 0xe006 }, { 5328, 0x7010 }, /* 0x9900 */ { 5332, 0x1608 }, { 5336, 0x4109 }, { 5340, 0x0101 }, { 5342, 0x0000 }, { 5342, 0x3a20 }, { 5347, 0x0096 }, { 5351, 0x0000 }, { 5351, 0x0000 }, { 5351, 0x0000 }, { 5351, 0x2240 }, { 5354, 0x7120 }, { 5359, 0x021a }, { 5363, 0x0002 }, { 5364, 0xa227 }, { 5371, 0x2000 }, { 5372, 0x8002 }, /* 0x9a00 */ { 5374, 0xc102 }, { 5378, 0x0200 }, { 5379, 0x0800 }, { 5380, 0x00c1 }, { 5383, 0x2029 }, { 5387, 0x8ca0 }, { 5392, 0x0624 }, { 5396, 0x0000 }, { 5396, 0x0000 }, { 5396, 0x0000 }, { 5396, 0x0100 }, { 5397, 0x0100 }, { 5398, 0x0000 }, { 5398, 0x0118 }, { 5401, 0x4020 }, { 5403, 0x0000 }, /* 0x9b00 */ { 5403, 0x0000 }, { 5403, 0x0400 }, { 5404, 0x0480 }, { 5406, 0x1002 }, { 5408, 0x803e }, { 5414, 0x0410 }, { 5416, 0x8000 }, { 5417, 0x0000 }, { 5417, 0x4000 }, { 5418, 0x8002 }, { 5420, 0x4800 }, { 5422, 0x0000 }, { 5422, 0x0200 }, { 5423, 0x0040 }, { 5424, 0x0110 }, { 5426, 0x0000 }, /* 0x9c00 */ { 5426, 0x2000 }, { 5427, 0x0025 }, { 5430, 0x0020 }, { 5431, 0x0804 }, { 5433, 0x0280 }, { 5435, 0x0080 }, { 5436, 0x0000 }, { 5436, 0x0000 }, { 5436, 0x0000 }, { 5436, 0x0000 }, { 5436, 0x0000 }, { 5436, 0x0000 }, { 5436, 0x0000 }, { 5436, 0x0000 }, { 5436, 0x02a0 }, { 5439, 0x0058 }, /* 0x9d00 */ { 5442, 0x0200 }, { 5443, 0x0800 }, { 5444, 0x0140 }, { 5446, 0x0800 }, { 5447, 0x0000 }, { 5447, 0x2002 }, { 5449, 0x1003 }, { 5452, 0x0004 }, { 5453, 0x0000 }, { 5453, 0x0000 }, { 5453, 0x8200 }, { 5455, 0x0010 }, { 5456, 0x0010 }, { 5457, 0x0080 }, { 5458, 0x0000 }, { 5458, 0x0704 }, /* 0x9e00 */ { 5462, 0x0000 }, { 5462, 0x4400 }, { 5464, 0x0000 }, { 5464, 0x0000 }, { 5464, 0x0000 }, { 5464, 0x0000 }, { 5464, 0x0000 }, { 5464, 0xa220 }, { 5468, 0x0000 }, { 5468, 0xa08c }, { 5473, 0x0020 }, { 5474, 0x4830 }, { 5478, 0x6008 }, { 5481, 0x5912 }, { 5487, 0x0100 }, { 5488, 0x0010 }, /* 0x9f00 */ { 5489, 0x4180 }, { 5492, 0x0008 }, { 5493, 0x0001 }, { 5494, 0x0800 }, { 5495, 0x4c00 }, { 5498, 0x8004 }, { 5500, 0x1482 }, { 5504, 0x0080 }, { 5505, 0x2000 }, { 5506, 0x1021 }, }; static const Summary16 ksc5601_uni2indx_pageac[698] = { /* 0xac00 */ { 5509, 0x0793 }, { 5516, 0x3eff }, { 5529, 0xb011 }, { 5534, 0x1303 }, { 5539, 0x2801 }, { 5542, 0x1110 }, { 5545, 0x0000 }, { 5545, 0x0593 }, { 5551, 0x1e7b }, { 5561, 0xb011 }, { 5566, 0x9703 }, { 5573, 0x3b01 }, { 5579, 0x1112 }, { 5583, 0x00a0 }, { 5585, 0x9593 }, { 5593, 0x306b }, /* 0xad00 */ { 5600, 0xb051 }, { 5606, 0x1102 }, { 5609, 0x3201 }, { 5613, 0x1130 }, { 5617, 0x02b0 }, { 5621, 0x0111 }, { 5624, 0x300a }, { 5628, 0xb879 }, { 5637, 0x1306 }, { 5642, 0x3001 }, { 5645, 0x0010 }, { 5646, 0x0080 }, { 5647, 0x0113 }, { 5651, 0x100b }, { 5655, 0x0011 }, { 5657, 0x9300 }, /* 0xae00 */ { 5661, 0x2b03 }, { 5667, 0x0010 }, { 5668, 0x0000 }, { 5668, 0x0593 }, { 5674, 0x746b }, { 5683, 0xb051 }, { 5689, 0x1323 }, { 5695, 0x3b01 }, { 5701, 0x1030 }, { 5704, 0x0000 }, { 5704, 0x0000 }, { 5704, 0x7000 }, { 5707, 0xb011 }, { 5712, 0x1303 }, { 5717, 0x2900 }, { 5720, 0x1110 }, /* 0xaf00 */ { 5723, 0x2180 }, { 5726, 0x0001 }, { 5727, 0x3000 }, { 5729, 0xb015 }, { 5735, 0x030e }, { 5740, 0x3001 }, { 5743, 0x0030 }, { 5745, 0x0200 }, { 5746, 0x0111 }, { 5749, 0x1023 }, { 5753, 0x0000 }, { 5753, 0x1300 }, { 5756, 0x6b81 }, { 5763, 0x1010 }, { 5765, 0x0300 }, { 5767, 0x0113 }, /* 0xb000 */ { 5771, 0x1013 }, { 5775, 0x3011 }, { 5779, 0x0100 }, { 5780, 0x0000 }, { 5780, 0x5530 }, { 5786, 0x22b8 }, { 5792, 0x0000 }, { 5792, 0x3000 }, { 5794, 0xb011 }, { 5799, 0x9702 }, { 5805, 0xfb07 }, { 5815, 0x113a }, { 5821, 0x03b0 }, { 5826, 0x0113 }, { 5830, 0x0021 }, { 5832, 0x0000 }, /* 0xb100 */ { 5832, 0x1b00 }, { 5836, 0x3b0d }, { 5844, 0x1138 }, { 5849, 0x03b0 }, { 5854, 0x0113 }, { 5858, 0x1133 }, { 5864, 0x0001 }, { 5865, 0x1300 }, { 5868, 0x2b05 }, { 5874, 0x111c }, { 5879, 0x0100 }, { 5880, 0x0000 }, { 5880, 0x1000 }, { 5881, 0xb011 }, { 5886, 0x1300 }, { 5889, 0x2a01 }, /* 0xb200 */ { 5893, 0x1930 }, { 5898, 0x02b0 }, { 5902, 0x0001 }, { 5903, 0x1010 }, { 5905, 0x0000 }, { 5905, 0x1100 }, { 5907, 0x0301 }, { 5910, 0x1030 }, { 5913, 0x0230 }, { 5916, 0x0713 }, { 5922, 0x146b }, { 5929, 0x0011 }, { 5931, 0x1300 }, { 5934, 0x2b05 }, { 5940, 0xf974 }, { 5950, 0x8fb8 }, /* 0xb300 */ { 5959, 0x0113 }, { 5963, 0x103b }, { 5969, 0x0000 }, { 5969, 0x0000 }, { 5969, 0x0000 }, { 5969, 0xd970 }, { 5977, 0x4ab0 }, { 5983, 0x0113 }, { 5987, 0x103b }, { 5993, 0x0011 }, { 5995, 0x1103 }, { 5999, 0x0000 }, { 5999, 0x5930 }, { 6005, 0x2ab1 }, { 6012, 0x0111 }, { 6015, 0x1000 }, /* 0xb400 */ { 6016, 0x0000 }, { 6016, 0x1101 }, { 6019, 0x0b01 }, { 6023, 0x0010 }, { 6024, 0x0000 }, { 6024, 0x0113 }, { 6028, 0x102b }, { 6033, 0x0000 }, { 6033, 0x0101 }, { 6035, 0x2000 }, { 6036, 0x1110 }, { 6039, 0x02a0 }, { 6042, 0x0111 }, { 6045, 0x3021 }, { 6049, 0xb059 }, { 6056, 0x0102 }, /* 0xb500 */ { 6058, 0x0000 }, { 6058, 0x1930 }, { 6063, 0x07b0 }, { 6069, 0x0113 }, { 6073, 0x383b }, { 6081, 0xb011 }, { 6086, 0x0003 }, { 6088, 0x0000 }, { 6088, 0x0000 }, { 6088, 0x0000 }, { 6088, 0x0d13 }, { 6094, 0x383b }, { 6102, 0xb011 }, { 6107, 0x0103 }, { 6110, 0x1000 }, { 6111, 0x0000 }, /* 0xb600 */ { 6111, 0x0000 }, { 6111, 0x0113 }, { 6115, 0x1020 }, { 6117, 0x0010 }, { 6118, 0x0100 }, { 6119, 0x0000 }, { 6119, 0x0110 }, { 6121, 0x0000 }, { 6121, 0x0000 }, { 6121, 0x3000 }, { 6123, 0x1811 }, { 6127, 0x0002 }, { 6128, 0x0000 }, { 6128, 0x0010 }, { 6129, 0x0000 }, { 6129, 0x0111 }, /* 0xb700 */ { 6132, 0x0023 }, { 6135, 0x0000 }, { 6135, 0x9300 }, { 6139, 0x0b01 }, { 6143, 0x1110 }, { 6146, 0x0030 }, { 6148, 0x0111 }, { 6151, 0x302b }, { 6157, 0xb011 }, { 6162, 0x13c7 }, { 6170, 0x3b01 }, { 6176, 0x0130 }, { 6179, 0x0280 }, { 6181, 0x0000 }, { 6181, 0x3000 }, { 6183, 0xb011 }, /* 0xb800 */ { 6188, 0x1383 }, { 6194, 0x2b01 }, { 6199, 0x1130 }, { 6203, 0x03b0 }, { 6208, 0x0011 }, { 6210, 0x300a }, { 6214, 0xb011 }, { 6219, 0x1102 }, { 6222, 0x2000 }, { 6223, 0x0000 }, { 6223, 0x0100 }, { 6224, 0x0111 }, { 6227, 0x102b }, { 6232, 0xa011 }, { 6236, 0x1302 }, { 6240, 0x2b01 }, /* 0xb900 */ { 6245, 0x0010 }, { 6246, 0x0100 }, { 6247, 0x0001 }, { 6248, 0x3000 }, { 6250, 0x9011 }, { 6254, 0x1302 }, { 6258, 0x2b01 }, { 6263, 0x1130 }, { 6267, 0x66b0 }, { 6274, 0x0000 }, { 6274, 0x3000 }, { 6276, 0xb011 }, { 6281, 0xd302 }, { 6287, 0x6b07 }, { 6295, 0x113a }, { 6301, 0x07b0 }, /* 0xba00 */ { 6307, 0x0103 }, { 6310, 0x0020 }, { 6311, 0x0000 }, { 6311, 0x1300 }, { 6314, 0x6b05 }, { 6321, 0x1138 }, { 6326, 0x03b0 }, { 6331, 0x0113 }, { 6335, 0x10b8 }, { 6340, 0x0000 }, { 6340, 0x1b00 }, { 6344, 0x2b05 }, { 6350, 0x0110 }, { 6352, 0x0300 }, { 6354, 0x0000 }, { 6354, 0x1000 }, /* 0xbb00 */ { 6355, 0xa011 }, { 6359, 0x1102 }, { 6362, 0x0a01 }, { 6365, 0x7970 }, { 6373, 0xa2b0 }, { 6379, 0x0111 }, { 6382, 0x100a }, { 6385, 0x0000 }, { 6385, 0x1100 }, { 6387, 0x0001 }, { 6388, 0x1110 }, { 6391, 0x0090 }, { 6393, 0x0111 }, { 6396, 0x0009 }, { 6398, 0x0000 }, { 6398, 0x9300 }, /* 0xbc00 */ { 6402, 0xbb05 }, { 6410, 0xf9f2 }, { 6421, 0x22b0 }, { 6426, 0x0113 }, { 6430, 0x323b }, { 6438, 0x2001 }, { 6440, 0x0000 }, { 6440, 0x0000 }, { 6440, 0x5930 }, { 6446, 0x06b0 }, { 6451, 0x0193 }, { 6456, 0x303b }, { 6463, 0xa011 }, { 6467, 0x1123 }, { 6472, 0x0000 }, { 6472, 0x1170 }, /* 0xbd00 */ { 6477, 0x02b0 }, { 6481, 0x0011 }, { 6483, 0x1010 }, { 6485, 0x0000 }, { 6485, 0x1301 }, { 6489, 0x0301 }, { 6492, 0x0110 }, { 6494, 0x0000 }, { 6494, 0x0793 }, { 6501, 0x162b }, { 6508, 0x0010 }, { 6509, 0x0101 }, { 6511, 0x0000 }, { 6511, 0x1130 }, { 6515, 0x0200 }, { 6516, 0x0111 }, /* 0xbe00 */ { 6519, 0x3029 }, { 6524, 0xb011 }, { 6529, 0x0000 }, { 6529, 0x0000 }, { 6529, 0x5130 }, { 6534, 0x0eb0 }, { 6540, 0x0513 }, { 6545, 0x383b }, { 6553, 0xb011 }, { 6558, 0x0303 }, { 6562, 0x0100 }, { 6563, 0x0000 }, { 6563, 0x0000 }, { 6563, 0x0193 }, { 6568, 0x1039 }, { 6573, 0x0000 }, /* 0xbf00 */ { 6573, 0x0302 }, { 6576, 0x3b00 }, { 6581, 0x0000 }, { 6581, 0x0000 }, { 6581, 0x0113 }, { 6585, 0x0023 }, { 6588, 0x0000 }, { 6588, 0x0000 }, { 6588, 0x0000 }, { 6588, 0x0010 }, { 6589, 0x0000 }, { 6589, 0x0001 }, { 6590, 0x3020 }, { 6593, 0x9011 }, { 6597, 0x0002 }, { 6598, 0x0000 }, /* 0xc000 */ { 6598, 0x0000 }, { 6598, 0x0000 }, { 6598, 0x0000 }, { 6598, 0x1000 }, { 6599, 0x0000 }, { 6599, 0x1102 }, { 6602, 0x0301 }, { 6605, 0x0000 }, { 6605, 0x0000 }, { 6605, 0x0113 }, { 6609, 0xb02b }, { 6616, 0xb079 }, { 6624, 0x1323 }, { 6630, 0x3b01 }, { 6636, 0x1130 }, { 6640, 0x02b0 }, /* 0xc100 */ { 6644, 0x0111 }, { 6647, 0xf021 }, { 6653, 0xb0d9 }, { 6661, 0x1343 }, { 6667, 0x3b01 }, { 6673, 0x1130 }, { 6677, 0x03b0 }, { 6682, 0x0111 }, { 6685, 0x7020 }, { 6689, 0xb051 }, { 6695, 0x1322 }, { 6700, 0x2001 }, { 6702, 0x1110 }, { 6705, 0x0190 }, { 6708, 0x0111 }, { 6711, 0x300b }, /* 0xc200 */ { 6716, 0xb011 }, { 6721, 0x9302 }, { 6726, 0xab01 }, { 6732, 0x0016 }, { 6735, 0x0100 }, { 6736, 0x0113 }, { 6740, 0x3021 }, { 6744, 0xb011 }, { 6749, 0x0302 }, { 6752, 0x2901 }, { 6756, 0x3130 }, { 6761, 0x02b0 }, { 6765, 0x0000 }, { 6765, 0x3000 }, { 6767, 0xb819 }, { 6774, 0x1b42 }, /* 0xc300 */ { 6780, 0x3301 }, { 6785, 0x1138 }, { 6790, 0x0330 }, { 6794, 0x0000 }, { 6794, 0x0020 }, { 6795, 0x0000 }, { 6795, 0x1300 }, { 6798, 0x3305 }, { 6804, 0x1110 }, { 6807, 0x0000 }, { 6807, 0x0000 }, { 6807, 0x0000 }, { 6807, 0x0001 }, { 6808, 0x9300 }, { 6812, 0x2305 }, { 6817, 0x0130 }, /* 0xc400 */ { 6820, 0x0100 }, { 6821, 0x0001 }, { 6822, 0x1010 }, { 6824, 0x3011 }, { 6828, 0x0100 }, { 6829, 0x0000 }, { 6829, 0x1130 }, { 6833, 0x0230 }, { 6836, 0x0001 }, { 6837, 0x1010 }, { 6839, 0x0000 }, { 6839, 0x1100 }, { 6841, 0x0000 }, { 6841, 0x0000 }, { 6841, 0x0200 }, { 6842, 0x8513 }, /* 0xc500 */ { 6848, 0x1003 }, { 6851, 0x1011 }, { 6854, 0x1300 }, { 6857, 0x2b01 }, { 6862, 0x7730 }, { 6870, 0x63b8 }, { 6878, 0x0113 }, { 6882, 0x303b }, { 6889, 0xb091 }, { 6895, 0x11a2 }, { 6900, 0x0201 }, { 6902, 0x7b30 }, { 6910, 0x57f0 }, { 6919, 0x0113 }, { 6923, 0x702b }, { 6930, 0xf0d1 }, /* 0xc600 */ { 6938, 0x11e3 }, { 6945, 0x1b01 }, { 6950, 0x7130 }, { 6956, 0x0ab9 }, { 6963, 0x0113 }, { 6967, 0x303b }, { 6974, 0x9001 }, { 6977, 0x1302 }, { 6981, 0x2b01 }, { 6986, 0x1130 }, { 6990, 0x02b0 }, { 6994, 0x0713 }, { 7000, 0x302b }, { 7006, 0x3011 }, { 7010, 0x1303 }, { 7015, 0x2301 }, /* 0xc700 */ { 7019, 0x1130 }, { 7023, 0x02b0 }, { 7027, 0x0113 }, { 7031, 0x30ab }, { 7038, 0xb411 }, { 7044, 0x11fe }, { 7053, 0x0901 }, { 7056, 0x7130 }, { 7062, 0x47b8 }, { 7070, 0x05d3 }, { 7077, 0x307b }, { 7085, 0xb011 }, { 7090, 0x5303 }, { 7096, 0x2101 }, { 7099, 0x1110 }, { 7102, 0x0000 }, /* 0xc800 */ { 7102, 0x0513 }, { 7107, 0x306b }, { 7114, 0xb011 }, { 7119, 0x1102 }, { 7122, 0x3301 }, { 7127, 0x0010 }, { 7128, 0x0000 }, { 7128, 0x0513 }, { 7133, 0x38eb }, { 7142, 0xa010 }, { 7145, 0x0102 }, { 7147, 0x3000 }, { 7149, 0x1110 }, { 7152, 0x02b0 }, { 7156, 0x0013 }, { 7159, 0x3020 }, /* 0xc900 */ { 7162, 0xb071 }, { 7169, 0x0102 }, { 7171, 0x1000 }, { 7172, 0x0010 }, { 7173, 0x0000 }, { 7173, 0x0113 }, { 7177, 0x100b }, { 7181, 0x1011 }, { 7184, 0x1300 }, { 7187, 0x2b01 }, { 7192, 0x0000 }, { 7192, 0x0000 }, { 7192, 0x0593 }, { 7198, 0x366b }, { 7207, 0xb095 }, { 7214, 0x1303 }, /* 0xca00 */ { 7219, 0x3b01 }, { 7225, 0x0110 }, { 7227, 0x0200 }, { 7228, 0x0000 }, { 7228, 0x3000 }, { 7230, 0xb011 }, { 7235, 0x0103 }, { 7238, 0x2000 }, { 7239, 0x0010 }, { 7240, 0x0100 }, { 7241, 0x0000 }, { 7241, 0x3000 }, { 7243, 0xb011 }, { 7248, 0x030a }, { 7252, 0x1001 }, { 7254, 0x0010 }, /* 0xcb00 */ { 7255, 0x0100 }, { 7256, 0x0111 }, { 7259, 0x0003 }, { 7261, 0x0000 }, { 7261, 0x1302 }, { 7265, 0x2301 }, { 7269, 0x0010 }, { 7270, 0x0300 }, { 7272, 0x0000 }, { 7272, 0x1000 }, { 7273, 0x0000 }, { 7273, 0x0100 }, { 7274, 0x0000 }, { 7274, 0x0010 }, { 7275, 0x0290 }, { 7278, 0x0000 }, /* 0xcc00 */ { 7278, 0x3000 }, { 7280, 0x3011 }, { 7284, 0x5386 }, { 7291, 0x7b01 }, { 7298, 0x1130 }, { 7302, 0x03b0 }, { 7307, 0x0151 }, { 7311, 0x0021 }, { 7313, 0x0000 }, { 7313, 0x1300 }, { 7316, 0x3b01 }, { 7322, 0x1130 }, { 7326, 0x02b0 }, { 7330, 0x0011 }, { 7332, 0x1010 }, { 7334, 0x0001 }, /* 0xcd00 */ { 7335, 0x1302 }, { 7339, 0x2b01 }, { 7344, 0x1110 }, { 7347, 0x0200 }, { 7348, 0x0000 }, { 7348, 0x1000 }, { 7349, 0xb011 }, { 7354, 0x0102 }, { 7356, 0x0100 }, { 7357, 0x1130 }, { 7361, 0x02b0 }, { 7365, 0x0001 }, { 7366, 0x1010 }, { 7368, 0x0001 }, { 7369, 0x1100 }, { 7371, 0x2b01 }, /* 0xce00 */ { 7376, 0x1110 }, { 7379, 0x0210 }, { 7381, 0x0113 }, { 7385, 0x002b }, { 7389, 0x0000 }, { 7389, 0x9300 }, { 7393, 0x2b03 }, { 7399, 0x1130 }, { 7403, 0x02b0 }, { 7407, 0x0113 }, { 7411, 0x303b }, { 7418, 0x0000 }, { 7418, 0x0002 }, { 7419, 0x0000 }, { 7419, 0x1930 }, { 7424, 0x03b0 }, /* 0xcf00 */ { 7429, 0x0113 }, { 7433, 0x102b }, { 7438, 0xb011 }, { 7443, 0x0103 }, { 7446, 0x0000 }, { 7446, 0x1130 }, { 7450, 0x02b0 }, { 7454, 0x0113 }, { 7458, 0x1021 }, { 7461, 0x0000 }, { 7461, 0x0102 }, { 7463, 0x0001 }, { 7464, 0x0010 }, { 7465, 0x0000 }, { 7465, 0x0113 }, { 7469, 0x102b }, /* 0xd000 */ { 7474, 0x0011 }, { 7476, 0x0102 }, { 7478, 0x2000 }, { 7479, 0x1130 }, { 7483, 0x02b0 }, { 7487, 0x0111 }, { 7490, 0x3001 }, { 7493, 0x3011 }, { 7497, 0x0002 }, { 7498, 0x0000 }, { 7498, 0x1130 }, { 7502, 0x02b0 }, { 7506, 0x0313 }, { 7511, 0x303b }, { 7518, 0xb011 }, { 7523, 0x0103 }, /* 0xd100 */ { 7526, 0x2000 }, { 7527, 0x0000 }, { 7527, 0x0000 }, { 7527, 0x0513 }, { 7532, 0x303b }, { 7539, 0xb011 }, { 7544, 0x1102 }, { 7547, 0x1000 }, { 7548, 0x0110 }, { 7550, 0x0000 }, { 7550, 0x0113 }, { 7554, 0x142b }, { 7560, 0x0001 }, { 7561, 0x0100 }, { 7562, 0x0000 }, { 7562, 0x0110 }, /* 0xd200 */ { 7564, 0x0280 }, { 7566, 0x0001 }, { 7567, 0x3000 }, { 7569, 0xb011 }, { 7574, 0x0102 }, { 7576, 0x1000 }, { 7577, 0x0010 }, { 7578, 0x0000 }, { 7578, 0x0113 }, { 7582, 0x1023 }, { 7586, 0x1011 }, { 7589, 0x9302 }, { 7594, 0x0b05 }, { 7599, 0x1110 }, { 7602, 0x0030 }, { 7604, 0x0113 }, /* 0xd300 */ { 7608, 0x702b }, { 7615, 0xb051 }, { 7621, 0x1323 }, { 7627, 0x3b01 }, { 7633, 0x0030 }, { 7635, 0x0000 }, { 7635, 0x0000 }, { 7635, 0x3000 }, { 7637, 0xb011 }, { 7642, 0x1303 }, { 7647, 0x2b01 }, { 7652, 0x1110 }, { 7655, 0x0330 }, { 7659, 0x0101 }, { 7661, 0x300a }, { 7665, 0xb011 }, /* 0xd400 */ { 7670, 0x0102 }, { 7672, 0x2000 }, { 7673, 0x0000 }, { 7673, 0x0000 }, { 7673, 0x0011 }, { 7675, 0x1000 }, { 7676, 0xa011 }, { 7680, 0x9300 }, { 7684, 0x2b05 }, { 7690, 0x0010 }, { 7691, 0x0200 }, { 7692, 0x0000 }, { 7692, 0x1000 }, { 7693, 0x9011 }, { 7697, 0x1100 }, { 7699, 0x2901 }, /* 0xd500 */ { 7703, 0x1110 }, { 7706, 0x00b0 }, { 7709, 0x0000 }, { 7709, 0x3000 }, { 7711, 0xb011 }, { 7716, 0x1302 }, { 7720, 0x2b21 }, { 7726, 0x1130 }, { 7730, 0x03b0 }, { 7735, 0x0001 }, { 7736, 0x0020 }, { 7737, 0x0000 }, { 7737, 0x1300 }, { 7740, 0x2b05 }, { 7746, 0x1130 }, { 7750, 0x02b0 }, /* 0xd600 */ { 7754, 0x0113 }, { 7758, 0x103b }, { 7764, 0x2011 }, { 7767, 0x1300 }, { 7770, 0x2b21 }, { 7776, 0x1132 }, { 7781, 0x0280 }, { 7783, 0x0013 }, { 7786, 0x3028 }, { 7790, 0xa011 }, { 7794, 0x1102 }, { 7797, 0x0a01 }, { 7800, 0x1130 }, { 7804, 0x0292 }, { 7808, 0x0111 }, { 7811, 0x3021 }, /* 0xd700 */ { 7815, 0x0011 }, { 7817, 0x1302 }, { 7821, 0x2b01 }, { 7826, 0x1130 }, { 7830, 0x0290 }, { 7833, 0x03d3 }, { 7840, 0x122b }, { 7846, 0x3011 }, { 7850, 0x1302 }, { 7854, 0x2b01 }, }; static const Summary16 ksc5601_uni2indx_pagef9[17] = { /* 0xf900 */ { 7859, 0xffff }, { 7875, 0xffff }, { 7891, 0xffff }, { 7907, 0xffff }, { 7923, 0xffff }, { 7939, 0xffff }, { 7955, 0xffff }, { 7971, 0xffff }, { 7987, 0xffff }, { 8003, 0xffff }, { 8019, 0xffff }, { 8035, 0xffff }, { 8051, 0xffff }, { 8067, 0xffff }, { 8083, 0xffff }, { 8099, 0xffff }, /* 0xfa00 */ { 8115, 0x0fff }, }; static const Summary16 ksc5601_uni2indx_pageff[15] = { /* 0xff00 */ { 8127, 0xfffe }, { 8142, 0xffff }, { 8158, 0xffff }, { 8174, 0xffff }, { 8190, 0xffff }, { 8206, 0x7fff }, { 8221, 0x0000 }, { 8221, 0x0000 }, { 8221, 0x0000 }, { 8221, 0x0000 }, { 8221, 0x0000 }, { 8221, 0x0000 }, { 8221, 0x0000 }, { 8221, 0x0000 }, { 8221, 0x006f }, }; static int ksc5601_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc >= 0x0000 && wc < 0x0460) summary = &ksc5601_uni2indx_page00[(wc>>4)]; else if (wc >= 0x2000 && wc < 0x2670) summary = &ksc5601_uni2indx_page20[(wc>>4)-0x200]; else if (wc >= 0x3000 && wc < 0x33e0) summary = &ksc5601_uni2indx_page30[(wc>>4)-0x300]; else if (wc >= 0x4e00 && wc < 0x9fa0) summary = &ksc5601_uni2indx_page4e[(wc>>4)-0x4e0]; else if (wc >= 0xac00 && wc < 0xd7a0) summary = &ksc5601_uni2indx_pageac[(wc>>4)-0xac0]; else if (wc >= 0xf900 && wc < 0xfa10) summary = &ksc5601_uni2indx_pagef9[(wc>>4)-0xf90]; else if (wc >= 0xff00 && wc < 0xfff0) summary = &ksc5601_uni2indx_pageff[(wc>>4)-0xff0]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' 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); c = ksc5601_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/loop_unicode.h000066400000000000000000000424631252300335000255660ustar00rootroot00000000000000/* * Copyright (C) 1999-2003, 2005-2006, 2008 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* This file defines the conversion loop via Unicode as a pivot encoding. */ /* Attempt to transliterate wc. Return code as in xxx_wctomb. */ static int unicode_transliterate (conv_t cd, ucs4_t wc, unsigned char* outptr, size_t outleft) { if (cd->oflags & HAVE_HANGUL_JAMO) { /* Decompose Hangul into Jamo. Use double-width Jamo (contained in all Korean encodings and ISO-2022-JP-2), not half-width Jamo (contained in Unicode only). */ ucs4_t buf[3]; int ret = johab_hangul_decompose(cd,buf,wc); if (ret != RET_ILUNI) { /* we know 1 <= ret <= 3 */ state_t backup_state = cd->ostate; unsigned char* backup_outptr = outptr; size_t backup_outleft = outleft; int i, sub_outcount; for (i = 0; i < ret; i++) { if (outleft == 0) { sub_outcount = RET_TOOSMALL; goto johab_hangul_failed; } sub_outcount = cd->ofuncs.xxx_wctomb(cd,outptr,buf[i],outleft); if (sub_outcount <= RET_ILUNI) goto johab_hangul_failed; if (!(sub_outcount <= outleft)) abort(); outptr += sub_outcount; outleft -= sub_outcount; } return outptr-backup_outptr; johab_hangul_failed: cd->ostate = backup_state; outptr = backup_outptr; outleft = backup_outleft; if (sub_outcount != RET_ILUNI) return RET_TOOSMALL; } } { /* Try to use a variant, but postfix it with U+303E IDEOGRAPHIC VARIATION INDICATOR (cf. Ken Lunde's "CJKV information processing", p. 188). */ int indx = -1; if (wc == 0x3006) indx = 0; else if (wc == 0x30f6) indx = 1; else if (wc >= 0x4e00 && wc < 0xa000) indx = cjk_variants_indx[wc-0x4e00]; if (indx >= 0) { for (;; indx++) { ucs4_t buf[2]; unsigned short variant = cjk_variants[indx]; unsigned short last = variant & 0x8000; variant &= 0x7fff; variant += 0x3000; buf[0] = variant; buf[1] = 0x303e; { state_t backup_state = cd->ostate; unsigned char* backup_outptr = outptr; size_t backup_outleft = outleft; int i, sub_outcount; for (i = 0; i < 2; i++) { if (outleft == 0) { sub_outcount = RET_TOOSMALL; goto variant_failed; } sub_outcount = cd->ofuncs.xxx_wctomb(cd,outptr,buf[i],outleft); if (sub_outcount <= RET_ILUNI) goto variant_failed; if (!(sub_outcount <= outleft)) abort(); outptr += sub_outcount; outleft -= sub_outcount; } return outptr-backup_outptr; variant_failed: cd->ostate = backup_state; outptr = backup_outptr; outleft = backup_outleft; if (sub_outcount != RET_ILUNI) return RET_TOOSMALL; } if (last) break; } } } if (wc >= 0x2018 && wc <= 0x201a) { /* Special case for quotation marks 0x2018, 0x2019, 0x201a */ ucs4_t substitute = (cd->oflags & HAVE_QUOTATION_MARKS ? (wc == 0x201a ? 0x2018 : wc) : (cd->oflags & HAVE_ACCENTS ? (wc==0x2019 ? 0x00b4 : 0x0060) /* use accents */ : 0x0027 /* use apostrophe */ ) ); int outcount = cd->ofuncs.xxx_wctomb(cd,outptr,substitute,outleft); if (outcount != RET_ILUNI) return outcount; } { /* Use the transliteration table. */ int indx = translit_index(wc); if (indx >= 0) { const unsigned int * cp = &translit_data[indx]; unsigned int num = *cp++; state_t backup_state = cd->ostate; unsigned char* backup_outptr = outptr; size_t backup_outleft = outleft; unsigned int i; int sub_outcount; for (i = 0; i < num; i++) { if (outleft == 0) { sub_outcount = RET_TOOSMALL; goto translit_failed; } sub_outcount = cd->ofuncs.xxx_wctomb(cd,outptr,cp[i],outleft); if (sub_outcount == RET_ILUNI) /* Recursive transliteration. */ sub_outcount = unicode_transliterate(cd,cp[i],outptr,outleft); if (sub_outcount <= RET_ILUNI) goto translit_failed; if (!(sub_outcount <= outleft)) abort(); outptr += sub_outcount; outleft -= sub_outcount; } return outptr-backup_outptr; translit_failed: cd->ostate = backup_state; outptr = backup_outptr; outleft = backup_outleft; if (sub_outcount != RET_ILUNI) return RET_TOOSMALL; } } return RET_ILUNI; } #ifndef LIBICONV_PLUG struct uc_to_mb_fallback_locals { unsigned char* l_outbuf; size_t l_outbytesleft; int l_errno; }; static void uc_to_mb_write_replacement (const char *buf, size_t buflen, void* callback_arg) { struct uc_to_mb_fallback_locals * plocals = (struct uc_to_mb_fallback_locals *) callback_arg; /* Do nothing if already encountered an error in a previous call. */ if (plocals->l_errno == 0) { /* Attempt to copy the passed buffer to the output buffer. */ if (plocals->l_outbytesleft < buflen) plocals->l_errno = E2BIG; else { memcpy(plocals->l_outbuf, buf, buflen); plocals->l_outbuf += buflen; plocals->l_outbytesleft -= buflen; } } } struct mb_to_uc_fallback_locals { conv_t l_cd; unsigned char* l_outbuf; size_t l_outbytesleft; int l_errno; }; static void mb_to_uc_write_replacement (const unsigned int *buf, size_t buflen, void* callback_arg) { struct mb_to_uc_fallback_locals * plocals = (struct mb_to_uc_fallback_locals *) callback_arg; /* Do nothing if already encountered an error in a previous call. */ if (plocals->l_errno == 0) { /* Attempt to convert the passed buffer to the target encoding. */ conv_t cd = plocals->l_cd; unsigned char* outptr = plocals->l_outbuf; size_t outleft = plocals->l_outbytesleft; for (; buflen > 0; buf++, buflen--) { ucs4_t wc = *buf; int outcount; if (outleft == 0) { plocals->l_errno = E2BIG; break; } outcount = cd->ofuncs.xxx_wctomb(cd,outptr,wc,outleft); if (outcount != RET_ILUNI) goto outcount_ok; /* Handle Unicode tag characters (range U+E0000..U+E007F). */ if ((wc >> 7) == (0xe0000 >> 7)) goto outcount_zero; /* Try transliteration. */ if (cd->transliterate) { outcount = unicode_transliterate(cd,wc,outptr,outleft); if (outcount != RET_ILUNI) goto outcount_ok; } if (cd->discard_ilseq) { outcount = 0; goto outcount_ok; } #ifndef LIBICONV_PLUG else if (cd->fallbacks.uc_to_mb_fallback != NULL) { struct uc_to_mb_fallback_locals locals; locals.l_outbuf = outptr; locals.l_outbytesleft = outleft; locals.l_errno = 0; cd->fallbacks.uc_to_mb_fallback(wc, uc_to_mb_write_replacement, &locals, cd->fallbacks.data); if (locals.l_errno != 0) { plocals->l_errno = locals.l_errno; break; } outptr = locals.l_outbuf; outleft = locals.l_outbytesleft; outcount = 0; goto outcount_ok; } #endif outcount = cd->ofuncs.xxx_wctomb(cd,outptr,0xFFFD,outleft); if (outcount != RET_ILUNI) goto outcount_ok; plocals->l_errno = EILSEQ; break; outcount_ok: if (outcount < 0) { plocals->l_errno = E2BIG; break; } #ifndef LIBICONV_PLUG if (cd->hooks.uc_hook) (*cd->hooks.uc_hook)(wc, cd->hooks.data); #endif if (!(outcount <= outleft)) abort(); outptr += outcount; outleft -= outcount; outcount_zero: ; } plocals->l_outbuf = outptr; plocals->l_outbytesleft = outleft; } } #endif /* !LIBICONV_PLUG */ static size_t unicode_loop_convert (iconv_t icd, const char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft) { conv_t cd = (conv_t) icd; size_t result = 0; const unsigned char* inptr = (const unsigned char*) *inbuf; size_t inleft = *inbytesleft; unsigned char* outptr = (unsigned char*) *outbuf; size_t outleft = *outbytesleft; while (inleft > 0) { state_t last_istate = cd->istate; ucs4_t wc; int incount; int outcount; incount = cd->ifuncs.xxx_mbtowc(cd,&wc,inptr,inleft); if (incount < 0) { if ((unsigned int)(-1-incount) % 2 == (unsigned int)(-1-RET_ILSEQ) % 2) { /* Case 1: invalid input, possibly after a shift sequence */ incount = DECODE_SHIFT_ILSEQ(incount); if (cd->discard_ilseq) { switch (cd->iindex) { case ei_ucs4: case ei_ucs4be: case ei_ucs4le: case ei_utf32: case ei_utf32be: case ei_utf32le: case ei_ucs4internal: case ei_ucs4swapped: incount += 4; break; case ei_ucs2: case ei_ucs2be: case ei_ucs2le: case ei_utf16: case ei_utf16be: case ei_utf16le: case ei_ucs2internal: case ei_ucs2swapped: incount += 2; break; default: incount += 1; break; } goto outcount_zero; } #ifndef LIBICONV_PLUG else if (cd->fallbacks.mb_to_uc_fallback != NULL) { unsigned int incount2; struct mb_to_uc_fallback_locals locals; switch (cd->iindex) { case ei_ucs4: case ei_ucs4be: case ei_ucs4le: case ei_utf32: case ei_utf32be: case ei_utf32le: case ei_ucs4internal: case ei_ucs4swapped: incount2 = 4; break; case ei_ucs2: case ei_ucs2be: case ei_ucs2le: case ei_utf16: case ei_utf16be: case ei_utf16le: case ei_ucs2internal: case ei_ucs2swapped: incount2 = 2; break; default: incount2 = 1; break; } locals.l_cd = cd; locals.l_outbuf = outptr; locals.l_outbytesleft = outleft; locals.l_errno = 0; cd->fallbacks.mb_to_uc_fallback((const char*)inptr+incount, incount2, mb_to_uc_write_replacement, &locals, cd->fallbacks.data); if (locals.l_errno != 0) { inptr += incount; inleft -= incount; errno = locals.l_errno; result = -1; break; } incount += incount2; outptr = locals.l_outbuf; outleft = locals.l_outbytesleft; result += 1; goto outcount_zero; } #endif inptr += incount; inleft -= incount; errno = EILSEQ; result = -1; break; } if (incount == RET_TOOFEW(0)) { /* Case 2: not enough bytes available to detect anything */ errno = EINVAL; result = -1; break; } /* Case 3: k bytes read, but only a shift sequence */ incount = DECODE_TOOFEW(incount); } else { /* Case 4: k bytes read, making up a wide character */ if (outleft == 0) { cd->istate = last_istate; errno = E2BIG; result = -1; break; } outcount = cd->ofuncs.xxx_wctomb(cd,outptr,wc,outleft); if (outcount != RET_ILUNI) goto outcount_ok; /* Handle Unicode tag characters (range U+E0000..U+E007F). */ if ((wc >> 7) == (0xe0000 >> 7)) goto outcount_zero; /* Try transliteration. */ result++; if (cd->transliterate) { outcount = unicode_transliterate(cd,wc,outptr,outleft); if (outcount != RET_ILUNI) goto outcount_ok; } if (cd->discard_ilseq) { outcount = 0; goto outcount_ok; } #ifndef LIBICONV_PLUG else if (cd->fallbacks.uc_to_mb_fallback != NULL) { struct uc_to_mb_fallback_locals locals; locals.l_outbuf = outptr; locals.l_outbytesleft = outleft; locals.l_errno = 0; cd->fallbacks.uc_to_mb_fallback(wc, uc_to_mb_write_replacement, &locals, cd->fallbacks.data); if (locals.l_errno != 0) { cd->istate = last_istate; errno = locals.l_errno; return -1; } outptr = locals.l_outbuf; outleft = locals.l_outbytesleft; outcount = 0; goto outcount_ok; } #endif outcount = cd->ofuncs.xxx_wctomb(cd,outptr,0xFFFD,outleft); if (outcount != RET_ILUNI) goto outcount_ok; cd->istate = last_istate; errno = EILSEQ; result = -1; break; outcount_ok: if (outcount < 0) { cd->istate = last_istate; errno = E2BIG; result = -1; break; } #ifndef LIBICONV_PLUG if (cd->hooks.uc_hook) (*cd->hooks.uc_hook)(wc, cd->hooks.data); #endif if (!(outcount <= outleft)) abort(); outptr += outcount; outleft -= outcount; } outcount_zero: if (!(incount <= inleft)) abort(); inptr += incount; inleft -= incount; } *inbuf = (const char*) inptr; *inbytesleft = inleft; *outbuf = (char*) outptr; *outbytesleft = outleft; return result; } static size_t unicode_loop_reset (iconv_t icd, char* * outbuf, size_t *outbytesleft) { conv_t cd = (conv_t) icd; if (outbuf == NULL || *outbuf == NULL) { /* Reset the states. */ memset(&cd->istate,'\0',sizeof(state_t)); memset(&cd->ostate,'\0',sizeof(state_t)); return 0; } else { size_t result = 0; if (cd->ifuncs.xxx_flushwc) { state_t last_istate = cd->istate; ucs4_t wc; if (cd->ifuncs.xxx_flushwc(cd, &wc)) { unsigned char* outptr = (unsigned char*) *outbuf; size_t outleft = *outbytesleft; int outcount = cd->ofuncs.xxx_wctomb(cd,outptr,wc,outleft); if (outcount != RET_ILUNI) goto outcount_ok; /* Handle Unicode tag characters (range U+E0000..U+E007F). */ if ((wc >> 7) == (0xe0000 >> 7)) goto outcount_zero; /* Try transliteration. */ result++; if (cd->transliterate) { outcount = unicode_transliterate(cd,wc,outptr,outleft); if (outcount != RET_ILUNI) goto outcount_ok; } if (cd->discard_ilseq) { outcount = 0; goto outcount_ok; } #ifndef LIBICONV_PLUG else if (cd->fallbacks.uc_to_mb_fallback != NULL) { struct uc_to_mb_fallback_locals locals; locals.l_outbuf = outptr; locals.l_outbytesleft = outleft; locals.l_errno = 0; cd->fallbacks.uc_to_mb_fallback(wc, uc_to_mb_write_replacement, &locals, cd->fallbacks.data); if (locals.l_errno != 0) { cd->istate = last_istate; errno = locals.l_errno; return -1; } outptr = locals.l_outbuf; outleft = locals.l_outbytesleft; outcount = 0; goto outcount_ok; } #endif outcount = cd->ofuncs.xxx_wctomb(cd,outptr,0xFFFD,outleft); if (outcount != RET_ILUNI) goto outcount_ok; cd->istate = last_istate; errno = EILSEQ; return -1; outcount_ok: if (outcount < 0) { cd->istate = last_istate; errno = E2BIG; return -1; } #ifndef LIBICONV_PLUG if (cd->hooks.uc_hook) (*cd->hooks.uc_hook)(wc, cd->hooks.data); #endif if (!(outcount <= outleft)) abort(); outptr += outcount; outleft -= outcount; outcount_zero: *outbuf = (char*) outptr; *outbytesleft = outleft; } } if (cd->ofuncs.xxx_reset) { unsigned char* outptr = (unsigned char*) *outbuf; size_t outleft = *outbytesleft; int outcount = cd->ofuncs.xxx_reset(cd,outptr,outleft); if (outcount < 0) { errno = E2BIG; return -1; } if (!(outcount <= outleft)) abort(); *outbuf = (char*) (outptr + outcount); *outbytesleft = outleft - outcount; } memset(&cd->istate,'\0',sizeof(state_t)); memset(&cd->ostate,'\0',sizeof(state_t)); return result; } } freelan-2.0/third-party/source/libiconv-msvc/include/loop_wchar.h000066400000000000000000000363541252300335000252460ustar00rootroot00000000000000/* * Copyright (C) 2000-2002, 2005-2006, 2008-2009, 2011 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* This file defines three conversion loops: - from wchar_t to anything else, - from anything else to wchar_t, - from wchar_t to wchar_t. */ #if HAVE_WCRTOMB || HAVE_MBRTOWC /* Tru64 with Desktop Toolkit C has a bug: must be included before . BSD/OS 4.0.1 has a bug: , and must be included before . In some builds of uClibc, is nonexistent and wchar_t is defined by . */ # include # include # include # include # define BUF_SIZE 64 /* assume MB_LEN_MAX <= 64 */ /* Some systems, like BeOS, have multibyte encodings but lack mbstate_t. */ extern size_t mbrtowc (); # ifdef mbstate_t # define mbrtowc(pwc, s, n, ps) (mbrtowc)(pwc, s, n, 0) # define mbsinit(ps) 1 # endif # ifndef mbsinit # if !HAVE_MBSINIT # define mbsinit(ps) 1 # endif # endif #endif /* * The first two conversion loops have an extended conversion descriptor. */ struct wchar_conv_struct { struct conv_struct parent; #if HAVE_WCRTOMB || HAVE_MBRTOWC mbstate_t state; #endif }; #if HAVE_WCRTOMB /* From wchar_t to anything else. */ #ifndef LIBICONV_PLUG #if 0 struct wc_to_mb_fallback_locals { struct wchar_conv_struct * l_wcd; char* l_outbuf; size_t l_outbytesleft; int l_errno; }; /* A callback that writes a string given in the locale encoding. */ static void wc_to_mb_write_replacement (const char *buf, size_t buflen, void* callback_arg) { struct wc_to_mb_fallback_locals * plocals = (struct wc_to_mb_fallback_locals *) callback_arg; /* Do nothing if already encountered an error in a previous call. */ if (plocals->l_errno == 0) { /* Attempt to convert the passed buffer to the target encoding. Here we don't support characters split across multiple calls. */ const char* bufptr = buf; size_t bufleft = buflen; size_t res = unicode_loop_convert(&plocals->l_wcd->parent, &bufptr,&bufleft, &plocals->l_outbuf,&plocals->l_outbytesleft); if (res == (size_t)(-1)) { if (errno == EILSEQ || errno == EINVAL) /* Invalid buf contents. */ plocals->l_errno = EILSEQ; else if (errno == E2BIG) /* Output buffer too small. */ plocals->l_errno = E2BIG; else abort(); } else { /* Successful conversion. */ if (bufleft > 0) abort(); } } } #else struct wc_to_mb_fallback_locals { char* l_outbuf; size_t l_outbytesleft; int l_errno; }; /* A callback that writes a string given in the target encoding. */ static void wc_to_mb_write_replacement (const char *buf, size_t buflen, void* callback_arg) { struct wc_to_mb_fallback_locals * plocals = (struct wc_to_mb_fallback_locals *) callback_arg; /* Do nothing if already encountered an error in a previous call. */ if (plocals->l_errno == 0) { /* Attempt to copy the passed buffer to the output buffer. */ if (plocals->l_outbytesleft < buflen) plocals->l_errno = E2BIG; else { memcpy(plocals->l_outbuf, buf, buflen); plocals->l_outbuf += buflen; plocals->l_outbytesleft -= buflen; } } } #endif #endif /* !LIBICONV_PLUG */ static size_t wchar_from_loop_convert (iconv_t icd, const char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft) { struct wchar_conv_struct * wcd = (struct wchar_conv_struct *) icd; size_t result = 0; while (*inbytesleft >= sizeof(wchar_t)) { const wchar_t * inptr = (const wchar_t *) *inbuf; size_t inleft = *inbytesleft; char buf[BUF_SIZE]; mbstate_t state = wcd->state; size_t bufcount = 0; while (inleft >= sizeof(wchar_t)) { /* Convert one wchar_t to multibyte representation. */ size_t count = wcrtomb(buf+bufcount,*inptr,&state); if (count == (size_t)(-1)) { /* Invalid input. */ if (wcd->parent.discard_ilseq) { count = 0; } #ifndef LIBICONV_PLUG else if (wcd->parent.fallbacks.wc_to_mb_fallback != NULL) { /* Drop the contents of buf[] accumulated so far, and instead pass all queued wide characters to the fallback handler. */ struct wc_to_mb_fallback_locals locals; const wchar_t * fallback_inptr; #if 0 locals.l_wcd = wcd; #endif locals.l_outbuf = *outbuf; locals.l_outbytesleft = *outbytesleft; locals.l_errno = 0; for (fallback_inptr = (const wchar_t *) *inbuf; fallback_inptr <= inptr; fallback_inptr++) wcd->parent.fallbacks.wc_to_mb_fallback(*fallback_inptr, wc_to_mb_write_replacement, &locals, wcd->parent.fallbacks.data); if (locals.l_errno != 0) { errno = locals.l_errno; return -1; } wcd->state = state; *inbuf = (const char *) (inptr + 1); *inbytesleft = inleft - sizeof(wchar_t); *outbuf = locals.l_outbuf; *outbytesleft = locals.l_outbytesleft; result += 1; break; } #endif else { errno = EILSEQ; return -1; } } inptr++; inleft -= sizeof(wchar_t); bufcount += count; if (count == 0) { /* Continue, append next wchar_t. */ } else { /* Attempt to convert the accumulated multibyte representations to the target encoding. */ const char* bufptr = buf; size_t bufleft = bufcount; char* outptr = *outbuf; size_t outleft = *outbytesleft; size_t res = unicode_loop_convert(&wcd->parent, &bufptr,&bufleft, &outptr,&outleft); if (res == (size_t)(-1)) { if (errno == EILSEQ) /* Invalid input. */ return -1; else if (errno == E2BIG) /* Output buffer too small. */ return -1; else if (errno == EINVAL) { /* Continue, append next wchar_t, but avoid buffer overrun. */ if (bufcount + MB_CUR_MAX > BUF_SIZE) abort(); } else abort(); } else { /* Successful conversion. */ wcd->state = state; *inbuf = (const char *) inptr; *inbytesleft = inleft; *outbuf = outptr; *outbytesleft = outleft; result += res; break; } } } } return result; } static size_t wchar_from_loop_reset (iconv_t icd, char* * outbuf, size_t *outbytesleft) { struct wchar_conv_struct * wcd = (struct wchar_conv_struct *) icd; if (outbuf == NULL || *outbuf == NULL) { /* Reset the states. */ memset(&wcd->state,'\0',sizeof(mbstate_t)); return unicode_loop_reset(&wcd->parent,NULL,NULL); } else { if (!mbsinit(&wcd->state)) { mbstate_t state = wcd->state; char buf[BUF_SIZE]; size_t bufcount = wcrtomb(buf,(wchar_t)0,&state); if (bufcount == (size_t)(-1) || bufcount == 0 || buf[bufcount-1] != '\0') abort(); else { const char* bufptr = buf; size_t bufleft = bufcount-1; char* outptr = *outbuf; size_t outleft = *outbytesleft; size_t res = unicode_loop_convert(&wcd->parent, &bufptr,&bufleft, &outptr,&outleft); if (res == (size_t)(-1)) { if (errno == E2BIG) return -1; else abort(); } else { res = unicode_loop_reset(&wcd->parent,&outptr,&outleft); if (res == (size_t)(-1)) return res; else { /* Successful. */ wcd->state = state; *outbuf = outptr; *outbytesleft = outleft; return 0; } } } } else return unicode_loop_reset(&wcd->parent,outbuf,outbytesleft); } } #endif #if HAVE_MBRTOWC /* From anything else to wchar_t. */ #ifndef LIBICONV_PLUG struct mb_to_wc_fallback_locals { char* l_outbuf; size_t l_outbytesleft; int l_errno; }; static void mb_to_wc_write_replacement (const wchar_t *buf, size_t buflen, void* callback_arg) { struct mb_to_wc_fallback_locals * plocals = (struct mb_to_wc_fallback_locals *) callback_arg; /* Do nothing if already encountered an error in a previous call. */ if (plocals->l_errno == 0) { /* Attempt to copy the passed buffer to the output buffer. */ if (plocals->l_outbytesleft < sizeof(wchar_t)*buflen) plocals->l_errno = E2BIG; else { for (; buflen > 0; buf++, buflen--) { *(wchar_t*) plocals->l_outbuf = *buf; plocals->l_outbuf += sizeof(wchar_t); plocals->l_outbytesleft -= sizeof(wchar_t); } } } } #endif /* !LIBICONV_PLUG */ static size_t wchar_to_loop_convert (iconv_t icd, const char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft) { struct wchar_conv_struct * wcd = (struct wchar_conv_struct *) icd; size_t result = 0; while (*inbytesleft > 0) { size_t incount; for (incount = 1; ; ) { /* Here incount <= *inbytesleft. */ char buf[BUF_SIZE]; const char* inptr = *inbuf; size_t inleft = incount; char* bufptr = buf; size_t bufleft = BUF_SIZE; size_t res = unicode_loop_convert(&wcd->parent, &inptr,&inleft, &bufptr,&bufleft); if (res == (size_t)(-1)) { if (errno == EILSEQ) /* Invalid input. */ return -1; else if (errno == EINVAL) { /* Incomplete input. Next try with one more input byte. */ } else /* E2BIG shouldn't occur. */ abort(); } else { /* Successful conversion. */ size_t bufcount = bufptr-buf; /* = BUF_SIZE-bufleft */ mbstate_t state = wcd->state; wchar_t wc; res = mbrtowc(&wc,buf,bufcount,&state); if (res == (size_t)(-2)) { /* Next try with one more input byte. */ } else { if (res == (size_t)(-1)) { /* Invalid input. */ if (wcd->parent.discard_ilseq) { } #ifndef LIBICONV_PLUG else if (wcd->parent.fallbacks.mb_to_wc_fallback != NULL) { /* Drop the contents of buf[] accumulated so far, and instead pass all queued chars to the fallback handler. */ struct mb_to_wc_fallback_locals locals; locals.l_outbuf = *outbuf; locals.l_outbytesleft = *outbytesleft; locals.l_errno = 0; wcd->parent.fallbacks.mb_to_wc_fallback(*inbuf, incount, mb_to_wc_write_replacement, &locals, wcd->parent.fallbacks.data); if (locals.l_errno != 0) { errno = locals.l_errno; return -1; } /* Restoring the state is not needed because it is the initial state anyway: For all known locale encodings, the multibyte to wchar_t conversion doesn't have shift state, and we have excluded partial accumulated characters. */ /* wcd->state = state; */ *inbuf += incount; *inbytesleft -= incount; *outbuf = locals.l_outbuf; *outbytesleft = locals.l_outbytesleft; result += 1; break; } #endif else return -1; } else { if (*outbytesleft < sizeof(wchar_t)) { errno = E2BIG; return -1; } *(wchar_t*) *outbuf = wc; /* Restoring the state is not needed because it is the initial state anyway: For all known locale encodings, the multibyte to wchar_t conversion doesn't have shift state, and we have excluded partial accumulated characters. */ /* wcd->state = state; */ *outbuf += sizeof(wchar_t); *outbytesleft -= sizeof(wchar_t); } *inbuf += incount; *inbytesleft -= incount; result += res; break; } } incount++; if (incount > *inbytesleft) { /* Incomplete input. */ errno = EINVAL; return -1; } } } return result; } static size_t wchar_to_loop_reset (iconv_t icd, char* * outbuf, size_t *outbytesleft) { struct wchar_conv_struct * wcd = (struct wchar_conv_struct *) icd; size_t res = unicode_loop_reset(&wcd->parent,outbuf,outbytesleft); if (res == (size_t)(-1)) return res; memset(&wcd->state,0,sizeof(mbstate_t)); return 0; } #endif /* From wchar_t to wchar_t. */ static size_t wchar_id_loop_convert (iconv_t icd, const char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft) { struct conv_struct * cd = (struct conv_struct *) icd; const wchar_t* inptr = (const wchar_t*) *inbuf; size_t inleft = *inbytesleft / sizeof(wchar_t); wchar_t* outptr = (wchar_t*) *outbuf; size_t outleft = *outbytesleft / sizeof(wchar_t); size_t count = (inleft <= outleft ? inleft : outleft); if (count > 0) { *inbytesleft -= count * sizeof(wchar_t); *outbytesleft -= count * sizeof(wchar_t); do { wchar_t wc = *inptr++; *outptr++ = wc; #ifndef LIBICONV_PLUG if (cd->hooks.wc_hook) (*cd->hooks.wc_hook)(wc, cd->hooks.data); #endif } while (--count > 0); *inbuf = (const char*) inptr; *outbuf = (char*) outptr; } return 0; } static size_t wchar_id_loop_reset (iconv_t icd, char* * outbuf, size_t *outbytesleft) { return 0; } freelan-2.0/third-party/source/libiconv-msvc/include/loops.h000066400000000000000000000017641252300335000242420ustar00rootroot00000000000000/* * Copyright (C) 2000 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* This file defines all the loops. */ #include "loop_unicode.h" #include "loop_wchar.h" freelan-2.0/third-party/source/libiconv-msvc/include/mac_arabic.h000066400000000000000000000126361252300335000251470ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * MacArabic */ static const unsigned short mac_arabic_2uni[128] = { /* 0x80 */ 0x00c4, 0x00a0, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, 0x00e0, 0x00e2, 0x00e4, 0x06ba, 0x00ab, 0x00e7, 0x00e9, 0x00e8, /* 0x90 */ 0x00ea, 0x00eb, 0x00ed, 0x2026, 0x00ee, 0x00ef, 0x00f1, 0x00f3, 0x00bb, 0x00f4, 0x00f6, 0x00f7, 0x00fa, 0x00f9, 0x00fb, 0x00fc, /* 0xa0 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x066a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x060c, 0xfffd, 0xfffd, 0xfffd, /* 0xb0 */ 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, 0x0668, 0x0669, 0xfffd, 0x061b, 0xfffd, 0xfffd, 0xfffd, 0x061f, /* 0xc0 */ 0x066d, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, /* 0xd0 */ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0x0638, 0x0639, 0x063a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xe0 */ 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, /* 0xf0 */ 0x0650, 0x0651, 0x0652, 0x067e, 0x0679, 0x0686, 0x06d5, 0x06a4, 0x06af, 0x0688, 0x0691, 0xfffd, 0xfffd, 0xfffd, 0x0698, 0x06d2, }; static int mac_arabic_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = mac_arabic_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char mac_arabic_page00[96] = { 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, /* 0xc0-0xc7 */ 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x88, 0x87, 0x89, 0x00, 0x8a, 0x00, 0x00, 0x8d, /* 0xe0-0xe7 */ 0x8f, 0x8e, 0x90, 0x91, 0x00, 0x92, 0x94, 0x95, /* 0xe8-0xef */ 0x00, 0x96, 0x00, 0x97, 0x99, 0x00, 0x9a, 0x9b, /* 0xf0-0xf7 */ 0x00, 0x9d, 0x9c, 0x9e, 0x9f, 0x00, 0x00, 0x00, /* 0xf8-0xff */ }; static const unsigned char mac_arabic_page06[208] = { 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xbf, /* 0x18-0x1f */ 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */ 0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ 0xf0, 0xf1, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x60-0x67 */ 0xb8, 0xb9, 0xa5, 0x00, 0x00, 0xc0, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0xf4, 0x00, 0x00, 0x00, 0x00, 0xf3, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf5, 0x00, /* 0x80-0x87 */ 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x00, 0x00, 0x00, 0x00, 0xf7, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, /* 0xa8-0xaf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0xff, 0x00, 0x00, 0xf6, 0x00, 0x00, /* 0xd0-0xd7 */ }; static int mac_arabic_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = mac_arabic_page00[wc-0x00a0]; else if (wc >= 0x0608 && wc < 0x06d8) c = mac_arabic_page06[wc-0x0608]; else if (wc == 0x2026) c = 0x93; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/mac_centraleurope.h000066400000000000000000000134711252300335000265740ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * MacCentralEurope */ static const unsigned short mac_centraleurope_2uni[128] = { /* 0x80 */ 0x00c4, 0x0100, 0x0101, 0x00c9, 0x0104, 0x00d6, 0x00dc, 0x00e1, 0x0105, 0x010c, 0x00e4, 0x010d, 0x0106, 0x0107, 0x00e9, 0x0179, /* 0x90 */ 0x017a, 0x010e, 0x00ed, 0x010f, 0x0112, 0x0113, 0x0116, 0x00f3, 0x0117, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x011a, 0x011b, 0x00fc, /* 0xa0 */ 0x2020, 0x00b0, 0x0118, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, 0x00ae, 0x00a9, 0x2122, 0x0119, 0x00a8, 0x2260, 0x0123, 0x012e, /* 0xb0 */ 0x012f, 0x012a, 0x2264, 0x2265, 0x012b, 0x0136, 0x2202, 0x2211, 0x0142, 0x013b, 0x013c, 0x013d, 0x013e, 0x0139, 0x013a, 0x0145, /* 0xc0 */ 0x0146, 0x0143, 0x00ac, 0x221a, 0x0144, 0x0147, 0x2206, 0x00ab, 0x00bb, 0x2026, 0x00a0, 0x0148, 0x0150, 0x00d5, 0x0151, 0x014c, /* 0xd0 */ 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x25ca, 0x014d, 0x0154, 0x0155, 0x0158, 0x2039, 0x203a, 0x0159, 0x0156, /* 0xe0 */ 0x0157, 0x0160, 0x201a, 0x201e, 0x0161, 0x015a, 0x015b, 0x00c1, 0x0164, 0x0165, 0x00cd, 0x017d, 0x017e, 0x016a, 0x00d3, 0x00d4, /* 0xf0 */ 0x016b, 0x016e, 0x00da, 0x016f, 0x0170, 0x0171, 0x0172, 0x0173, 0x00dd, 0x00fd, 0x0137, 0x017b, 0x0141, 0x017c, 0x0122, 0x02c7, }; static int mac_centraleurope_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) mac_centraleurope_2uni[c-0x80]; return 1; } static const unsigned char mac_centraleurope_page00[224] = { 0xca, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xa4, /* 0xa0-0xa7 */ 0xac, 0xa9, 0x00, 0xc7, 0xc2, 0x00, 0xa8, 0x00, /* 0xa8-0xaf */ 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0xe7, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x83, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0xee, 0xef, 0xcd, 0x85, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0xf2, 0x00, 0x86, 0xf8, 0x00, 0xa7, /* 0xd8-0xdf */ 0x00, 0x87, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x8e, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x97, 0x99, 0x9b, 0x9a, 0xd6, /* 0xf0-0xf7 */ 0x00, 0x00, 0x9c, 0x00, 0x9f, 0xf9, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0x81, 0x82, 0x00, 0x00, 0x84, 0x88, 0x8c, 0x8d, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x89, 0x8b, 0x91, 0x93, /* 0x08-0x0f */ 0x00, 0x00, 0x94, 0x95, 0x00, 0x00, 0x96, 0x98, /* 0x10-0x17 */ 0xa2, 0xab, 0x9d, 0x9e, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0xfe, 0xae, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0xb1, 0xb4, 0x00, 0x00, 0xaf, 0xb0, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xfa, /* 0x30-0x37 */ 0x00, 0xbd, 0xbe, 0xb9, 0xba, 0xbb, 0xbc, 0x00, /* 0x38-0x3f */ 0x00, 0xfc, 0xb8, 0xc1, 0xc4, 0xbf, 0xc0, 0xc5, /* 0x40-0x47 */ 0xcb, 0x00, 0x00, 0x00, 0xcf, 0xd8, 0x00, 0x00, /* 0x48-0x4f */ 0xcc, 0xce, 0x00, 0x00, 0xd9, 0xda, 0xdf, 0xe0, /* 0x50-0x57 */ 0xdb, 0xde, 0xe5, 0xe6, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xe1, 0xe4, 0x00, 0x00, 0xe8, 0xe9, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0xed, 0xf0, 0x00, 0x00, 0xf1, 0xf3, /* 0x68-0x6f */ 0xf4, 0xf5, 0xf6, 0xf7, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x8f, 0x90, 0xfb, 0xfd, 0xeb, 0xec, 0x00, /* 0x78-0x7f */ }; static const unsigned char mac_centraleurope_page20[48] = { 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd4, 0xd5, 0xe2, 0x00, 0xd2, 0xd3, 0xe3, 0x00, /* 0x18-0x1f */ 0xa0, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0xdc, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static const unsigned char mac_centraleurope_page22[32] = { 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ }; static const unsigned char mac_centraleurope_page22_1[8] = { 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ }; static int mac_centraleurope_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = mac_centraleurope_page00[wc-0x00a0]; else if (wc == 0x02c7) c = 0xff; else if (wc >= 0x2010 && wc < 0x2040) c = mac_centraleurope_page20[wc-0x2010]; else if (wc == 0x2122) c = 0xaa; else if (wc >= 0x2200 && wc < 0x2220) c = mac_centraleurope_page22[wc-0x2200]; else if (wc >= 0x2260 && wc < 0x2268) c = mac_centraleurope_page22_1[wc-0x2260]; else if (wc == 0x25ca) c = 0xd7; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/mac_croatian.h000066400000000000000000000160501252300335000255200ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * MacCroatian */ static const unsigned short mac_croatian_2uni[128] = { /* 0x80 */ 0x00c4, 0x00c5, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8, /* 0x90 */ 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3, 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc, /* 0xa0 */ 0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, 0x00ae, 0x0160, 0x2122, 0x00b4, 0x00a8, 0x2260, 0x017d, 0x00d8, /* 0xb0 */ 0x221e, 0x00b1, 0x2264, 0x2265, 0x2206, 0x00b5, 0x2202, 0x2211, 0x220f, 0x0161, 0x222b, 0x00aa, 0x00ba, 0x2126, 0x017e, 0x00f8, /* 0xc0 */ 0x00bf, 0x00a1, 0x00ac, 0x221a, 0x0192, 0x2248, 0x0106, 0x00ab, 0x010c, 0x2026, 0x00a0, 0x00c0, 0x00c3, 0x00d5, 0x0152, 0x0153, /* 0xd0 */ 0x0110, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x25ca, 0xfffd, 0x00a9, 0x2044, 0x00a4, 0x2039, 0x203a, 0x00c6, 0x00bb, /* 0xe0 */ 0x2013, 0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2, 0x0107, 0x00c1, 0x010d, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4, /* 0xf0 */ 0x0111, 0x00d2, 0x00da, 0x00db, 0x00d9, 0x0131, 0x02c6, 0x02dc, 0x00af, 0x03c0, 0x00cb, 0x02da, 0x00b8, 0x00ca, 0x00e6, 0x02c7, }; static int mac_croatian_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = mac_croatian_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char mac_croatian_page00[248] = { 0xca, 0xc1, 0xa2, 0xa3, 0xdb, 0x00, 0x00, 0xa4, /* 0xa0-0xa7 */ 0xac, 0xd9, 0xbb, 0xc7, 0xc2, 0x00, 0xa8, 0xf8, /* 0xa8-0xaf */ 0xa1, 0xb1, 0x00, 0x00, 0xab, 0xb5, 0xa6, 0xe1, /* 0xb0-0xb7 */ 0xfc, 0x00, 0xbc, 0xdf, 0x00, 0x00, 0x00, 0xc0, /* 0xb8-0xbf */ 0xcb, 0xe7, 0xe5, 0xcc, 0x80, 0x81, 0xde, 0x82, /* 0xc0-0xc7 */ 0xe9, 0x83, 0xfd, 0xfa, 0xed, 0xea, 0xeb, 0xec, /* 0xc8-0xcf */ 0x00, 0x84, 0xf1, 0xee, 0xef, 0xcd, 0x85, 0x00, /* 0xd0-0xd7 */ 0xaf, 0xf4, 0xf2, 0xf3, 0x86, 0x00, 0x00, 0xa7, /* 0xd8-0xdf */ 0x88, 0x87, 0x89, 0x8b, 0x8a, 0x8c, 0xfe, 0x8d, /* 0xe0-0xe7 */ 0x8f, 0x8e, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0xe8-0xef */ 0x00, 0x96, 0x98, 0x97, 0x99, 0x9b, 0x9a, 0xd6, /* 0xf0-0xf7 */ 0xbf, 0x9d, 0x9c, 0x9e, 0x9f, 0x00, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xe6, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0xce, 0xcf, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xa9, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0xbe, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char mac_croatian_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xff, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0xfb, 0x00, 0xf7, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char mac_croatian_page20[56] = { 0x00, 0x00, 0x00, 0xe0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd4, 0xd5, 0xe2, 0x00, 0xd2, 0xd3, 0xe3, 0x00, /* 0x18-0x1f */ 0xa0, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0xdc, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x40-0x47 */ }; static const unsigned char mac_croatian_page21[8] = { 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0xbd, 0x00, /* 0x20-0x27 */ }; static const unsigned char mac_croatian_page22[104] = { 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xb4, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, /* 0x08-0x0f */ 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ }; static int mac_croatian_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0198) c = mac_croatian_page00[wc-0x00a0]; else if (wc >= 0x02c0 && wc < 0x02e0) c = mac_croatian_page02[wc-0x02c0]; else if (wc == 0x03c0) c = 0xf9; else if (wc >= 0x2010 && wc < 0x2048) c = mac_croatian_page20[wc-0x2010]; else if (wc >= 0x2120 && wc < 0x2128) c = mac_croatian_page21[wc-0x2120]; else if (wc >= 0x2200 && wc < 0x2268) c = mac_croatian_page22[wc-0x2200]; else if (wc == 0x25ca) c = 0xd7; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/mac_cyrillic.h000066400000000000000000000131021252300335000255250ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * MacCyrillic */ static const unsigned short mac_cyrillic_2uni[128] = { /* 0x80 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, /* 0x90 */ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, /* 0xa0 */ 0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x0406, 0x00ae, 0x00a9, 0x2122, 0x0402, 0x0452, 0x2260, 0x0403, 0x0453, /* 0xb0 */ 0x221e, 0x00b1, 0x2264, 0x2265, 0x0456, 0x00b5, 0x2202, 0x0408, 0x0404, 0x0454, 0x0407, 0x0457, 0x0409, 0x0459, 0x040a, 0x045a, /* 0xc0 */ 0x0458, 0x0405, 0x00ac, 0x221a, 0x0192, 0x2248, 0x2206, 0x00ab, 0x00bb, 0x2026, 0x00a0, 0x040b, 0x045b, 0x040c, 0x045c, 0x0455, /* 0xd0 */ 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x201e, 0x040e, 0x045e, 0x040f, 0x045f, 0x2116, 0x0401, 0x0451, 0x044f, /* 0xe0 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, /* 0xf0 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x00a4, }; static int mac_cyrillic_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0x80) *pwc = (ucs4_t) mac_cyrillic_2uni[c-0x80]; else *pwc = (ucs4_t) c; return 1; } static const unsigned char mac_cyrillic_page00[32] = { 0xca, 0x00, 0xa2, 0xa3, 0xff, 0x00, 0x00, 0xa4, /* 0xa0-0xa7 */ 0x00, 0xa9, 0x00, 0xc7, 0xc2, 0x00, 0xa8, 0x00, /* 0xa8-0xaf */ 0xa1, 0xb1, 0x00, 0x00, 0x00, 0xb5, 0xa6, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char mac_cyrillic_page04[96] = { 0x00, 0xdd, 0xab, 0xae, 0xb8, 0xc1, 0xa7, 0xba, /* 0x00-0x07 */ 0xb7, 0xbc, 0xbe, 0xcb, 0xcd, 0x00, 0xd8, 0xda, /* 0x08-0x0f */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x10-0x17 */ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0x18-0x1f */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x20-0x27 */ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, /* 0x28-0x2f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x30-0x37 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x38-0x3f */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x40-0x47 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf, /* 0x48-0x4f */ 0x00, 0xde, 0xac, 0xaf, 0xb9, 0xcf, 0xb4, 0xbb, /* 0x50-0x57 */ 0xc0, 0xbd, 0xbf, 0xcc, 0xce, 0x00, 0xd9, 0xdb, /* 0x58-0x5f */ }; static const unsigned char mac_cyrillic_page20[24] = { 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd4, 0xd5, 0x00, 0x00, 0xd2, 0xd3, 0xd7, 0x00, /* 0x18-0x1f */ 0xa0, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ }; static const unsigned char mac_cyrillic_page21[24] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char mac_cyrillic_page22[104] = { 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ }; static int mac_cyrillic_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = mac_cyrillic_page00[wc-0x00a0]; else if (wc == 0x00f7) c = 0xd6; else if (wc == 0x0192) c = 0xc4; else if (wc >= 0x0400 && wc < 0x0460) c = mac_cyrillic_page04[wc-0x0400]; else if (wc >= 0x2010 && wc < 0x2028) c = mac_cyrillic_page20[wc-0x2010]; else if (wc >= 0x2110 && wc < 0x2128) c = mac_cyrillic_page21[wc-0x2110]; else if (wc >= 0x2200 && wc < 0x2268) c = mac_cyrillic_page22[wc-0x2200]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/mac_greek.h000066400000000000000000000123651252300335000250220ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * MacGreek */ static const unsigned short mac_greek_2uni[128] = { /* 0x80 */ 0x00c4, 0x00b9, 0x00b2, 0x00c9, 0x00b3, 0x00d6, 0x00dc, 0x0385, 0x00e0, 0x00e2, 0x00e4, 0x0384, 0x00a8, 0x00e7, 0x00e9, 0x00e8, /* 0x90 */ 0x00ea, 0x00eb, 0x00a3, 0x2122, 0x00ee, 0x00ef, 0x2022, 0x00bd, 0x2030, 0x00f4, 0x00f6, 0x00a6, 0x00ad, 0x00f9, 0x00fb, 0x00fc, /* 0xa0 */ 0x2020, 0x0393, 0x0394, 0x0398, 0x039b, 0x039e, 0x03a0, 0x00df, 0x00ae, 0x00a9, 0x03a3, 0x03aa, 0x00a7, 0x2260, 0x00b0, 0x0387, /* 0xb0 */ 0x0391, 0x00b1, 0x2264, 0x2265, 0x00a5, 0x0392, 0x0395, 0x0396, 0x0397, 0x0399, 0x039a, 0x039c, 0x03a6, 0x03ab, 0x03a8, 0x03a9, /* 0xc0 */ 0x03ac, 0x039d, 0x00ac, 0x039f, 0x03a1, 0x2248, 0x03a4, 0x00ab, 0x00bb, 0x2026, 0x00a0, 0x03a5, 0x03a7, 0x0386, 0x0388, 0x0153, /* 0xd0 */ 0x2013, 0x2015, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x0389, 0x038a, 0x038c, 0x038e, 0x03ad, 0x03ae, 0x03af, 0x03cc, 0x038f, /* 0xe0 */ 0x03cd, 0x03b1, 0x03b2, 0x03c8, 0x03b4, 0x03b5, 0x03c6, 0x03b3, 0x03b7, 0x03b9, 0x03be, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03bf, /* 0xf0 */ 0x03c0, 0x03ce, 0x03c1, 0x03c3, 0x03c4, 0x03b8, 0x03c9, 0x03c2, 0x03c7, 0x03c5, 0x03b6, 0x03ca, 0x03cb, 0x0390, 0x03b0, 0xfffd, }; static int mac_greek_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = mac_greek_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char mac_greek_page00[96] = { 0xca, 0x00, 0x00, 0x92, 0x00, 0xb4, 0x9b, 0xac, /* 0xa0-0xa7 */ 0x8c, 0xa9, 0x00, 0xc7, 0xc2, 0x9c, 0xa8, 0x00, /* 0xa8-0xaf */ 0xae, 0xb1, 0x82, 0x84, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0x00, 0x81, 0x00, 0xc8, 0x00, 0x97, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0xa7, /* 0xd8-0xdf */ 0x88, 0x00, 0x89, 0x00, 0x8a, 0x00, 0x00, 0x8d, /* 0xe0-0xe7 */ 0x8f, 0x8e, 0x90, 0x91, 0x00, 0x00, 0x94, 0x95, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x99, 0x00, 0x9a, 0xd6, /* 0xf0-0xf7 */ 0x00, 0x9d, 0x00, 0x9e, 0x9f, 0x00, 0x00, 0x00, /* 0xf8-0xff */ }; static const unsigned char mac_greek_page03[80] = { 0x00, 0x00, 0x00, 0x00, 0x8b, 0x87, 0xcd, 0xaf, /* 0x80-0x87 */ 0xce, 0xd7, 0xd8, 0x00, 0xd9, 0x00, 0xda, 0xdf, /* 0x88-0x8f */ 0xfd, 0xb0, 0xb5, 0xa1, 0xa2, 0xb6, 0xb7, 0xb8, /* 0x90-0x97 */ 0xa3, 0xb9, 0xba, 0xa4, 0xbb, 0xc1, 0xa5, 0xc3, /* 0x98-0x9f */ 0xa6, 0xc4, 0x00, 0xaa, 0xc6, 0xcb, 0xbc, 0xcc, /* 0xa0-0xa7 */ 0xbe, 0xbf, 0xab, 0xbd, 0xc0, 0xdb, 0xdc, 0xdd, /* 0xa8-0xaf */ 0xfe, 0xe1, 0xe2, 0xe7, 0xe4, 0xe5, 0xfa, 0xe8, /* 0xb0-0xb7 */ 0xf5, 0xe9, 0xeb, 0xec, 0xed, 0xee, 0xea, 0xef, /* 0xb8-0xbf */ 0xf0, 0xf2, 0xf7, 0xf3, 0xf4, 0xf9, 0xe6, 0xf8, /* 0xc0-0xc7 */ 0xe3, 0xf6, 0xfb, 0xfc, 0xde, 0xe0, 0xf1, 0x00, /* 0xc8-0xcf */ }; static const unsigned char mac_greek_page20[40] = { 0x00, 0x00, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0x00, /* 0x10-0x17 */ 0xd4, 0xd5, 0x00, 0x00, 0xd2, 0xd3, 0x00, 0x00, /* 0x18-0x1f */ 0xa0, 0x00, 0x96, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ }; static const unsigned char mac_greek_page22[32] = { 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ }; static int mac_greek_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = mac_greek_page00[wc-0x00a0]; else if (wc == 0x0153) c = 0xcf; else if (wc >= 0x0380 && wc < 0x03d0) c = mac_greek_page03[wc-0x0380]; else if (wc >= 0x2010 && wc < 0x2038) c = mac_greek_page20[wc-0x2010]; else if (wc == 0x2122) c = 0x93; else if (wc >= 0x2248 && wc < 0x2268) c = mac_greek_page22[wc-0x2248]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/mac_hebrew.h000066400000000000000000000122501252300335000251720ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * MacHebrew */ static const unsigned short mac_hebrew_2uni[128] = { /* 0x80 */ 0x00c4, 0xfb1f, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8, /* 0x90 */ 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3, 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc, /* 0xa0 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x20aa, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xb0 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xc0 */ 0xfffd, 0x201e, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x05bc, 0xfb4b, 0xfb35, 0x2026, 0x00a0, 0x05b8, 0x05b7, 0x05b5, 0x05b6, 0x05b4, /* 0xd0 */ 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0xfb2a, 0xfb2b, 0x05bf, 0x05b0, 0x05b2, 0x05b1, 0x05bb, 0x05b9, 0xfffd, 0x05b3, /* 0xe0 */ 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, /* 0xf0 */ 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, }; static int mac_hebrew_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else if (c >= 0x80) { unsigned short wc = mac_hebrew_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char mac_hebrew_page00[96] = { 0xca, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, /* 0xc0-0xc7 */ 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x88, 0x87, 0x89, 0x8b, 0x8a, 0x8c, 0x00, 0x8d, /* 0xe0-0xe7 */ 0x8f, 0x8e, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0xe8-0xef */ 0x00, 0x96, 0x98, 0x97, 0x99, 0x9b, 0x9a, 0x00, /* 0xf0-0xf7 */ 0x00, 0x9d, 0x9c, 0x9e, 0x9f, 0x00, 0x00, 0x00, /* 0xf8-0xff */ }; static const unsigned char mac_hebrew_page05[64] = { 0xd9, 0xdb, 0xda, 0xdf, 0xcf, 0xcd, 0xce, 0xcc, /* 0xb0-0xb7 */ 0xcb, 0xdd, 0x00, 0xdc, 0xc6, 0x00, 0x00, 0xd8, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xd0-0xd7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xd8-0xdf */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xe0-0xe7 */ 0xf8, 0xf9, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ }; static const unsigned char mac_hebrew_page20[24] = { 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd4, 0xd5, 0x00, 0x00, 0xd2, 0xd3, 0xc1, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ }; static const unsigned char mac_hebrew_pagefb[56] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0xd6, 0xd7, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ }; static int mac_hebrew_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = mac_hebrew_page00[wc-0x00a0]; else if (wc >= 0x05b0 && wc < 0x05f0) c = mac_hebrew_page05[wc-0x05b0]; else if (wc >= 0x2010 && wc < 0x2028) c = mac_hebrew_page20[wc-0x2010]; else if (wc == 0x20aa) c = 0xa6; else if (wc >= 0xfb18 && wc < 0xfb50) c = mac_hebrew_pagefb[wc-0xfb18]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/mac_iceland.h000066400000000000000000000154061252300335000253230ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * MacIceland */ static const unsigned short mac_iceland_2uni[128] = { /* 0x80 */ 0x00c4, 0x00c5, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8, /* 0x90 */ 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3, 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc, /* 0xa0 */ 0x00dd, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, 0x00ae, 0x00a9, 0x2122, 0x00b4, 0x00a8, 0x2260, 0x00c6, 0x00d8, /* 0xb0 */ 0x221e, 0x00b1, 0x2264, 0x2265, 0x00a5, 0x00b5, 0x2202, 0x2211, 0x220f, 0x03c0, 0x222b, 0x00aa, 0x00ba, 0x2126, 0x00e6, 0x00f8, /* 0xc0 */ 0x00bf, 0x00a1, 0x00ac, 0x221a, 0x0192, 0x2248, 0x2206, 0x00ab, 0x00bb, 0x2026, 0x00a0, 0x00c0, 0x00c3, 0x00d5, 0x0152, 0x0153, /* 0xd0 */ 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x25ca, 0x00ff, 0x0178, 0x2044, 0x00a4, 0x00d0, 0x00f0, 0x00de, 0x00fe, /* 0xe0 */ 0x00fd, 0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2, 0x00ca, 0x00c1, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4, /* 0xf0 */ 0xfffd, 0x00d2, 0x00da, 0x00db, 0x00d9, 0x0131, 0x02c6, 0x02dc, 0x00af, 0x02d8, 0x02d9, 0x02da, 0x00b8, 0x02dd, 0x02db, 0x02c7, }; static int mac_iceland_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = mac_iceland_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char mac_iceland_page00[96] = { 0xca, 0xc1, 0xa2, 0xa3, 0xdb, 0xb4, 0x00, 0xa4, /* 0xa0-0xa7 */ 0xac, 0xa9, 0xbb, 0xc7, 0xc2, 0x00, 0xa8, 0xf8, /* 0xa8-0xaf */ 0xa1, 0xb1, 0x00, 0x00, 0xab, 0xb5, 0xa6, 0xe1, /* 0xb0-0xb7 */ 0xfc, 0x00, 0xbc, 0xc8, 0x00, 0x00, 0x00, 0xc0, /* 0xb8-0xbf */ 0xcb, 0xe7, 0xe5, 0xcc, 0x80, 0x81, 0xae, 0x82, /* 0xc0-0xc7 */ 0xe9, 0x83, 0xe6, 0xe8, 0xed, 0xea, 0xeb, 0xec, /* 0xc8-0xcf */ 0xdc, 0x84, 0xf1, 0xee, 0xef, 0xcd, 0x85, 0x00, /* 0xd0-0xd7 */ 0xaf, 0xf4, 0xf2, 0xf3, 0x86, 0xa0, 0xde, 0xa7, /* 0xd8-0xdf */ 0x88, 0x87, 0x89, 0x8b, 0x8a, 0x8c, 0xbe, 0x8d, /* 0xe0-0xe7 */ 0x8f, 0x8e, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0xe8-0xef */ 0xdd, 0x96, 0x98, 0x97, 0x99, 0x9b, 0x9a, 0xd6, /* 0xf0-0xf7 */ 0xbf, 0x9d, 0x9c, 0x9e, 0x9f, 0xe0, 0xdf, 0xd8, /* 0xf8-0xff */ }; static const unsigned char mac_iceland_page01[104] = { 0x00, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0xce, 0xcf, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0xd9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char mac_iceland_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xff, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0xf9, 0xfa, 0xfb, 0xfe, 0xf7, 0xfd, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char mac_iceland_page20[56] = { 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd4, 0xd5, 0xe2, 0x00, 0xd2, 0xd3, 0xe3, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x40-0x47 */ }; static const unsigned char mac_iceland_page21[8] = { 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0xbd, 0x00, /* 0x20-0x27 */ }; static const unsigned char mac_iceland_page22[104] = { 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, /* 0x08-0x0f */ 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ }; static int mac_iceland_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = mac_iceland_page00[wc-0x00a0]; else if (wc >= 0x0130 && wc < 0x0198) c = mac_iceland_page01[wc-0x0130]; else if (wc >= 0x02c0 && wc < 0x02e0) c = mac_iceland_page02[wc-0x02c0]; else if (wc == 0x03c0) c = 0xb9; else if (wc >= 0x2010 && wc < 0x2048) c = mac_iceland_page20[wc-0x2010]; else if (wc >= 0x2120 && wc < 0x2128) c = mac_iceland_page21[wc-0x2120]; else if (wc >= 0x2200 && wc < 0x2268) c = mac_iceland_page22[wc-0x2200]; else if (wc == 0x25ca) c = 0xd7; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/mac_roman.h000066400000000000000000000156511252300335000250420ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * MacRoman */ static const unsigned short mac_roman_2uni[128] = { /* 0x80 */ 0x00c4, 0x00c5, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8, /* 0x90 */ 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3, 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc, /* 0xa0 */ 0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, 0x00ae, 0x00a9, 0x2122, 0x00b4, 0x00a8, 0x2260, 0x00c6, 0x00d8, /* 0xb0 */ 0x221e, 0x00b1, 0x2264, 0x2265, 0x00a5, 0x00b5, 0x2202, 0x2211, 0x220f, 0x03c0, 0x222b, 0x00aa, 0x00ba, 0x2126, 0x00e6, 0x00f8, /* 0xc0 */ 0x00bf, 0x00a1, 0x00ac, 0x221a, 0x0192, 0x2248, 0x2206, 0x00ab, 0x00bb, 0x2026, 0x00a0, 0x00c0, 0x00c3, 0x00d5, 0x0152, 0x0153, /* 0xd0 */ 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x25ca, 0x00ff, 0x0178, 0x2044, 0x00a4, 0x2039, 0x203a, 0xfb01, 0xfb02, /* 0xe0 */ 0x2021, 0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2, 0x00ca, 0x00c1, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4, /* 0xf0 */ 0xfffd, 0x00d2, 0x00da, 0x00db, 0x00d9, 0x0131, 0x02c6, 0x02dc, 0x00af, 0x02d8, 0x02d9, 0x02da, 0x00b8, 0x02dd, 0x02db, 0x02c7, }; static int mac_roman_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = mac_roman_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char mac_roman_page00[96] = { 0xca, 0xc1, 0xa2, 0xa3, 0xdb, 0xb4, 0x00, 0xa4, /* 0xa0-0xa7 */ 0xac, 0xa9, 0xbb, 0xc7, 0xc2, 0x00, 0xa8, 0xf8, /* 0xa8-0xaf */ 0xa1, 0xb1, 0x00, 0x00, 0xab, 0xb5, 0xa6, 0xe1, /* 0xb0-0xb7 */ 0xfc, 0x00, 0xbc, 0xc8, 0x00, 0x00, 0x00, 0xc0, /* 0xb8-0xbf */ 0xcb, 0xe7, 0xe5, 0xcc, 0x80, 0x81, 0xae, 0x82, /* 0xc0-0xc7 */ 0xe9, 0x83, 0xe6, 0xe8, 0xed, 0xea, 0xeb, 0xec, /* 0xc8-0xcf */ 0x00, 0x84, 0xf1, 0xee, 0xef, 0xcd, 0x85, 0x00, /* 0xd0-0xd7 */ 0xaf, 0xf4, 0xf2, 0xf3, 0x86, 0x00, 0x00, 0xa7, /* 0xd8-0xdf */ 0x88, 0x87, 0x89, 0x8b, 0x8a, 0x8c, 0xbe, 0x8d, /* 0xe0-0xe7 */ 0x8f, 0x8e, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0xe8-0xef */ 0x00, 0x96, 0x98, 0x97, 0x99, 0x9b, 0x9a, 0xd6, /* 0xf0-0xf7 */ 0xbf, 0x9d, 0x9c, 0x9e, 0x9f, 0x00, 0x00, 0xd8, /* 0xf8-0xff */ }; static const unsigned char mac_roman_page01[104] = { 0x00, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0xce, 0xcf, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0xd9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char mac_roman_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xff, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0xf9, 0xfa, 0xfb, 0xfe, 0xf7, 0xfd, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char mac_roman_page20[56] = { 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd4, 0xd5, 0xe2, 0x00, 0xd2, 0xd3, 0xe3, 0x00, /* 0x18-0x1f */ 0xa0, 0xe0, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0xdc, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x40-0x47 */ }; static const unsigned char mac_roman_page21[8] = { 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0xbd, 0x00, /* 0x20-0x27 */ }; static const unsigned char mac_roman_page22[104] = { 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, /* 0x08-0x0f */ 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ }; static const unsigned char mac_roman_pagefb[8] = { 0x00, 0xde, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ }; static int mac_roman_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = mac_roman_page00[wc-0x00a0]; else if (wc >= 0x0130 && wc < 0x0198) c = mac_roman_page01[wc-0x0130]; else if (wc >= 0x02c0 && wc < 0x02e0) c = mac_roman_page02[wc-0x02c0]; else if (wc == 0x03c0) c = 0xb9; else if (wc >= 0x2010 && wc < 0x2048) c = mac_roman_page20[wc-0x2010]; else if (wc >= 0x2120 && wc < 0x2128) c = mac_roman_page21[wc-0x2120]; else if (wc >= 0x2200 && wc < 0x2268) c = mac_roman_page22[wc-0x2200]; else if (wc == 0x25ca) c = 0xd7; else if (wc >= 0xfb00 && wc < 0xfb08) c = mac_roman_pagefb[wc-0xfb00]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/mac_romania.h000066400000000000000000000160311252300335000253450ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * MacRomania */ static const unsigned short mac_romania_2uni[128] = { /* 0x80 */ 0x00c4, 0x00c5, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8, /* 0x90 */ 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3, 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc, /* 0xa0 */ 0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, 0x00ae, 0x00a9, 0x2122, 0x00b4, 0x00a8, 0x2260, 0x0102, 0x015e, /* 0xb0 */ 0x221e, 0x00b1, 0x2264, 0x2265, 0x00a5, 0x00b5, 0x2202, 0x2211, 0x220f, 0x03c0, 0x222b, 0x00aa, 0x00ba, 0x2126, 0x0103, 0x015f, /* 0xc0 */ 0x00bf, 0x00a1, 0x00ac, 0x221a, 0x0192, 0x2248, 0x2206, 0x00ab, 0x00bb, 0x2026, 0x00a0, 0x00c0, 0x00c3, 0x00d5, 0x0152, 0x0153, /* 0xd0 */ 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x25ca, 0x00ff, 0x0178, 0x2044, 0x00a4, 0x2039, 0x203a, 0x0162, 0x0163, /* 0xe0 */ 0x2021, 0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2, 0x00ca, 0x00c1, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4, /* 0xf0 */ 0xfffd, 0x00d2, 0x00da, 0x00db, 0x00d9, 0x0131, 0x02c6, 0x02dc, 0x00af, 0x02d8, 0x02d9, 0x02da, 0x00b8, 0x02dd, 0x02db, 0x02c7, }; static int mac_romania_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = mac_romania_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char mac_romania_page00[248] = { 0xca, 0xc1, 0xa2, 0xa3, 0xdb, 0xb4, 0x00, 0xa4, /* 0xa0-0xa7 */ 0xac, 0xa9, 0xbb, 0xc7, 0xc2, 0x00, 0xa8, 0xf8, /* 0xa8-0xaf */ 0xa1, 0xb1, 0x00, 0x00, 0xab, 0xb5, 0xa6, 0xe1, /* 0xb0-0xb7 */ 0xfc, 0x00, 0xbc, 0xc8, 0x00, 0x00, 0x00, 0xc0, /* 0xb8-0xbf */ 0xcb, 0xe7, 0xe5, 0xcc, 0x80, 0x81, 0x00, 0x82, /* 0xc0-0xc7 */ 0xe9, 0x83, 0xe6, 0xe8, 0xed, 0xea, 0xeb, 0xec, /* 0xc8-0xcf */ 0x00, 0x84, 0xf1, 0xee, 0xef, 0xcd, 0x85, 0x00, /* 0xd0-0xd7 */ 0x00, 0xf4, 0xf2, 0xf3, 0x86, 0x00, 0x00, 0xa7, /* 0xd8-0xdf */ 0x88, 0x87, 0x89, 0x8b, 0x8a, 0x8c, 0x00, 0x8d, /* 0xe0-0xe7 */ 0x8f, 0x8e, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0xe8-0xef */ 0x00, 0x96, 0x98, 0x97, 0x99, 0x9b, 0x9a, 0xd6, /* 0xf0-0xf7 */ 0x00, 0x9d, 0x9c, 0x9e, 0x9f, 0x00, 0x00, 0xd8, /* 0xf8-0xff */ /* 0x0100 */ 0x00, 0x00, 0xae, 0xbe, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0xce, 0xcf, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xbf, /* 0x58-0x5f */ 0x00, 0x00, 0xde, 0xdf, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0xd9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char mac_romania_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xff, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0xf9, 0xfa, 0xfb, 0xfe, 0xf7, 0xfd, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char mac_romania_page20[56] = { 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd4, 0xd5, 0xe2, 0x00, 0xd2, 0xd3, 0xe3, 0x00, /* 0x18-0x1f */ 0xa0, 0xe0, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0xdc, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x40-0x47 */ }; static const unsigned char mac_romania_page21[8] = { 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0xbd, 0x00, /* 0x20-0x27 */ }; static const unsigned char mac_romania_page22[104] = { 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, /* 0x08-0x0f */ 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ }; static int mac_romania_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0198) c = mac_romania_page00[wc-0x00a0]; else if (wc >= 0x02c0 && wc < 0x02e0) c = mac_romania_page02[wc-0x02c0]; else if (wc == 0x03c0) c = 0xb9; else if (wc >= 0x2010 && wc < 0x2048) c = mac_romania_page20[wc-0x2010]; else if (wc >= 0x2120 && wc < 0x2128) c = mac_romania_page21[wc-0x2120]; else if (wc >= 0x2200 && wc < 0x2268) c = mac_romania_page22[wc-0x2200]; else if (wc == 0x25ca) c = 0xd7; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/mac_thai.h000066400000000000000000000114321252300335000246440ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * MacThai */ static const unsigned short mac_thai_2uni[128] = { /* 0x80 */ 0x00ab, 0x00bb, 0x2026, 0xf88c, 0xf88f, 0xf892, 0xf895, 0xf898, 0xf88b, 0xf88e, 0xf891, 0xf894, 0xf897, 0x201c, 0x201d, 0xf899, /* 0x90 */ 0xfffd, 0x2022, 0xf884, 0xf889, 0xf885, 0xf886, 0xf887, 0xf888, 0xf88a, 0xf88d, 0xf890, 0xf893, 0xf896, 0x2018, 0x2019, 0xfffd, /* 0xa0 */ 0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, /* 0xb0 */ 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, /* 0xc0 */ 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, /* 0xd0 */ 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37, 0x0e38, 0x0e39, 0x0e3a, 0xfeff, 0x200b, 0x2013, 0x2014, 0x0e3f, /* 0xe0 */ 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x2122, 0x0e4f, /* 0xf0 */ 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, 0x0e58, 0x0e59, 0x00ae, 0x00a9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, }; static int mac_thai_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = mac_thai_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char mac_thai_page00[32] = { 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0xfb, 0x00, 0x80, 0x00, 0x00, 0xfa, 0x00, /* 0xa8-0xaf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char mac_thai_page0e[96] = { 0x00, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x00-0x07 */ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0x08-0x0f */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x10-0x17 */ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0x18-0x1f */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */ 0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0xdf, /* 0x38-0x3f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0x00, 0xef, /* 0x48-0x4f */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x50-0x57 */ 0xf8, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ }; static const unsigned char mac_thai_page20[32] = { 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0xdd, 0xde, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x9d, 0x9e, 0x00, 0x00, 0x8d, 0x8e, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x82, 0x00, /* 0x20-0x27 */ }; static const unsigned char mac_thai_pagef8[32] = { 0x00, 0x00, 0x00, 0x00, 0x92, 0x94, 0x95, 0x96, /* 0x80-0x87 */ 0x97, 0x93, 0x98, 0x88, 0x83, 0x99, 0x89, 0x84, /* 0x88-0x8f */ 0x9a, 0x8a, 0x85, 0x9b, 0x8b, 0x86, 0x9c, 0x8c, /* 0x90-0x97 */ 0x87, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ }; static int mac_thai_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = mac_thai_page00[wc-0x00a0]; else if (wc >= 0x0e00 && wc < 0x0e60) c = mac_thai_page0e[wc-0x0e00]; else if (wc >= 0x2008 && wc < 0x2028) c = mac_thai_page20[wc-0x2008]; else if (wc == 0x2122) c = 0xee; else if (wc >= 0xf880 && wc < 0xf8a0) c = mac_thai_pagef8[wc-0xf880]; else if (wc == 0xfeff) c = 0xdb; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/mac_turkish.h000066400000000000000000000155101252300335000254110ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * MacTurkish */ static const unsigned short mac_turkish_2uni[128] = { /* 0x80 */ 0x00c4, 0x00c5, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8, /* 0x90 */ 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3, 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc, /* 0xa0 */ 0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, 0x00ae, 0x00a9, 0x2122, 0x00b4, 0x00a8, 0x2260, 0x00c6, 0x00d8, /* 0xb0 */ 0x221e, 0x00b1, 0x2264, 0x2265, 0x00a5, 0x00b5, 0x2202, 0x2211, 0x220f, 0x03c0, 0x222b, 0x00aa, 0x00ba, 0x2126, 0x00e6, 0x00f8, /* 0xc0 */ 0x00bf, 0x00a1, 0x00ac, 0x221a, 0x0192, 0x2248, 0x2206, 0x00ab, 0x00bb, 0x2026, 0x00a0, 0x00c0, 0x00c3, 0x00d5, 0x0152, 0x0153, /* 0xd0 */ 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x25ca, 0x00ff, 0x0178, 0x011e, 0x011f, 0x0130, 0x0131, 0x015e, 0x015f, /* 0xe0 */ 0x2021, 0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2, 0x00ca, 0x00c1, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4, /* 0xf0 */ 0xfffd, 0x00d2, 0x00da, 0x00db, 0x00d9, 0xfffd, 0x02c6, 0x02dc, 0x00af, 0x02d8, 0x02d9, 0x02da, 0x00b8, 0x02dd, 0x02db, 0x02c7, }; static int mac_turkish_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = mac_turkish_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char mac_turkish_page00[96] = { 0xca, 0xc1, 0xa2, 0xa3, 0x00, 0xb4, 0x00, 0xa4, /* 0xa0-0xa7 */ 0xac, 0xa9, 0xbb, 0xc7, 0xc2, 0x00, 0xa8, 0xf8, /* 0xa8-0xaf */ 0xa1, 0xb1, 0x00, 0x00, 0xab, 0xb5, 0xa6, 0xe1, /* 0xb0-0xb7 */ 0xfc, 0x00, 0xbc, 0xc8, 0x00, 0x00, 0x00, 0xc0, /* 0xb8-0xbf */ 0xcb, 0xe7, 0xe5, 0xcc, 0x80, 0x81, 0xae, 0x82, /* 0xc0-0xc7 */ 0xe9, 0x83, 0xe6, 0xe8, 0xed, 0xea, 0xeb, 0xec, /* 0xc8-0xcf */ 0x00, 0x84, 0xf1, 0xee, 0xef, 0xcd, 0x85, 0x00, /* 0xd0-0xd7 */ 0xaf, 0xf4, 0xf2, 0xf3, 0x86, 0x00, 0x00, 0xa7, /* 0xd8-0xdf */ 0x88, 0x87, 0x89, 0x8b, 0x8a, 0x8c, 0xbe, 0x8d, /* 0xe0-0xe7 */ 0x8f, 0x8e, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0xe8-0xef */ 0x00, 0x96, 0x98, 0x97, 0x99, 0x9b, 0x9a, 0xd6, /* 0xf0-0xf7 */ 0xbf, 0x9d, 0x9c, 0x9e, 0x9f, 0x00, 0x00, 0xd8, /* 0xf8-0xff */ }; static const unsigned char mac_turkish_page01[128] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xda, 0xdb, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0xdc, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0xce, 0xcf, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xdf, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0xd9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char mac_turkish_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xff, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0xf9, 0xfa, 0xfb, 0xfe, 0xf7, 0xfd, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char mac_turkish_page20[40] = { 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd4, 0xd5, 0xe2, 0x00, 0xd2, 0xd3, 0xe3, 0x00, /* 0x18-0x1f */ 0xa0, 0xe0, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ }; static const unsigned char mac_turkish_page21[8] = { 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0xbd, 0x00, /* 0x20-0x27 */ }; static const unsigned char mac_turkish_page22[104] = { 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, /* 0x08-0x0f */ 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ }; static int mac_turkish_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = mac_turkish_page00[wc-0x00a0]; else if (wc >= 0x0118 && wc < 0x0198) c = mac_turkish_page01[wc-0x0118]; else if (wc >= 0x02c0 && wc < 0x02e0) c = mac_turkish_page02[wc-0x02c0]; else if (wc == 0x03c0) c = 0xb9; else if (wc >= 0x2010 && wc < 0x2038) c = mac_turkish_page20[wc-0x2010]; else if (wc >= 0x2120 && wc < 0x2128) c = mac_turkish_page21[wc-0x2120]; else if (wc >= 0x2200 && wc < 0x2268) c = mac_turkish_page22[wc-0x2200]; else if (wc == 0x25ca) c = 0xd7; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/mac_ukraine.h000066400000000000000000000140021252300335000253510ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * MacUkraine */ static const unsigned short mac_ukraine_2uni[128] = { /* 0x80 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, /* 0x90 */ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, /* 0xa0 */ 0x2020, 0x00b0, 0x0490, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x0406, 0x00ae, 0x00a9, 0x2122, 0x0402, 0x0452, 0x2260, 0x0403, 0x0453, /* 0xb0 */ 0x221e, 0x00b1, 0x2264, 0x2265, 0x0456, 0x00b5, 0x0491, 0x0408, 0x0404, 0x0454, 0x0407, 0x0457, 0x0409, 0x0459, 0x040a, 0x045a, /* 0xc0 */ 0x0458, 0x0405, 0x00ac, 0x221a, 0x0192, 0x2248, 0x2206, 0x00ab, 0x00bb, 0x2026, 0x00a0, 0x040b, 0x045b, 0x040c, 0x045c, 0x0455, /* 0xd0 */ 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x201e, 0x040e, 0x045e, 0x040f, 0x045f, 0x2116, 0x0401, 0x0451, 0x044f, /* 0xe0 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, /* 0xf0 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x00a4, }; static int mac_ukraine_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0x80) *pwc = (ucs4_t) mac_ukraine_2uni[c-0x80]; else *pwc = (ucs4_t) c; return 1; } static const unsigned char mac_ukraine_page00[32] = { 0xca, 0x00, 0x00, 0xa3, 0xff, 0x00, 0x00, 0xa4, /* 0xa0-0xa7 */ 0x00, 0xa9, 0x00, 0xc7, 0xc2, 0x00, 0xa8, 0x00, /* 0xa8-0xaf */ 0xa1, 0xb1, 0x00, 0x00, 0x00, 0xb5, 0xa6, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char mac_ukraine_page04[152] = { 0x00, 0xdd, 0xab, 0xae, 0xb8, 0xc1, 0xa7, 0xba, /* 0x00-0x07 */ 0xb7, 0xbc, 0xbe, 0xcb, 0xcd, 0x00, 0xd8, 0xda, /* 0x08-0x0f */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x10-0x17 */ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0x18-0x1f */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x20-0x27 */ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, /* 0x28-0x2f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x30-0x37 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x38-0x3f */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x40-0x47 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf, /* 0x48-0x4f */ 0x00, 0xde, 0xac, 0xaf, 0xb9, 0xcf, 0xb4, 0xbb, /* 0x50-0x57 */ 0xc0, 0xbd, 0xbf, 0xcc, 0xce, 0x00, 0xd9, 0xdb, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xa2, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char mac_ukraine_page20[24] = { 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd4, 0xd5, 0x00, 0x00, 0xd2, 0xd3, 0xd7, 0x00, /* 0x18-0x1f */ 0xa0, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ }; static const unsigned char mac_ukraine_page21[24] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char mac_ukraine_page22[104] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ }; static int mac_ukraine_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = mac_ukraine_page00[wc-0x00a0]; else if (wc == 0x00f7) c = 0xd6; else if (wc == 0x0192) c = 0xc4; else if (wc >= 0x0400 && wc < 0x0498) c = mac_ukraine_page04[wc-0x0400]; else if (wc >= 0x2010 && wc < 0x2028) c = mac_ukraine_page20[wc-0x2010]; else if (wc >= 0x2110 && wc < 0x2128) c = mac_ukraine_page21[wc-0x2110]; else if (wc >= 0x2200 && wc < 0x2268) c = mac_ukraine_page22[wc-0x2200]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/mulelao.h000066400000000000000000000064561252300335000245470ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * MULELAO-1 */ static const unsigned short mulelao_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0e81, 0x0e82, 0xfffd, 0x0e84, 0xfffd, 0xfffd, 0x0e87, 0x0e88, 0xfffd, 0x0e8a, 0xfffd, 0xfffd, 0x0e8d, 0xfffd, 0xfffd, /* 0xb0 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x0e94, 0x0e95, 0x0e96, 0x0e97, 0xfffd, 0x0e99, 0x0e9a, 0x0e9b, 0x0e9c, 0x0e9d, 0x0e9e, 0x0e9f, /* 0xc0 */ 0xfffd, 0x0ea1, 0x0ea2, 0x0ea3, 0xfffd, 0x0ea5, 0xfffd, 0x0ea7, 0xfffd, 0xfffd, 0x0eaa, 0x0eab, 0xfffd, 0x0ead, 0x0eae, 0x0eaf, /* 0xd0 */ 0x0eb0, 0x0eb1, 0x0eb2, 0x0eb3, 0x0eb4, 0x0eb5, 0x0eb6, 0x0eb7, 0x0eb8, 0x0eb9, 0xfffd, 0x0ebb, 0x0ebc, 0x0ebd, 0xfffd, 0xfffd, /* 0xe0 */ 0x0ec0, 0x0ec1, 0x0ec2, 0x0ec3, 0x0ec4, 0xfffd, 0x0ec6, 0xfffd, 0x0ec8, 0x0ec9, 0x0eca, 0x0ecb, 0x0ecc, 0x0ecd, 0xfffd, 0xfffd, /* 0xf0 */ 0x0ed0, 0x0ed1, 0x0ed2, 0x0ed3, 0x0ed4, 0x0ed5, 0x0ed6, 0x0ed7, 0x0ed8, 0x0ed9, 0xfffd, 0xfffd, 0x0edc, 0x0edd, 0xfffd, 0xfffd, }; static int mulelao_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = mulelao_2uni[c-0xa0]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char mulelao_page0e[96] = { 0x00, 0xa1, 0xa2, 0x00, 0xa4, 0x00, 0x00, 0xa7, /* 0x80-0x87 */ 0xa8, 0x00, 0xaa, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x90-0x97 */ 0x00, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0x98-0x9f */ 0x00, 0xc1, 0xc2, 0xc3, 0x00, 0xc5, 0x00, 0xc7, /* 0xa0-0xa7 */ 0x00, 0x00, 0xca, 0xcb, 0x00, 0xcd, 0xce, 0xcf, /* 0xa8-0xaf */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xb0-0xb7 */ 0xd8, 0xd9, 0x00, 0xdb, 0xdc, 0xdd, 0x00, 0x00, /* 0xb8-0xbf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0x00, 0xe6, 0x00, /* 0xc0-0xc7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0x00, 0x00, /* 0xc8-0xcf */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xd0-0xd7 */ 0xf8, 0xf9, 0x00, 0x00, 0xfc, 0xfd, 0x00, 0x00, /* 0xd8-0xdf */ }; static int mulelao_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc == 0x00a0) c = 0xa0; else if (wc >= 0x0e80 && wc < 0x0ee0) c = mulelao_page0e[wc-0x0e80]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/nextstep.h000066400000000000000000000132511252300335000247520ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * NEXTSTEP */ static const unsigned short nextstep_2uni[128] = { /* 0x80 */ 0x00a0, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, /* 0x90 */ 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00b5, 0x00d7, 0x00f7, /* 0xa0 */ 0x00a9, 0x00a1, 0x00a2, 0x00a3, 0x2044, 0x00a5, 0x0192, 0x00a7, 0x00a4, 0x2019, 0x201c, 0x00ab, 0x2039, 0x203a, 0xfb01, 0xfb02, /* 0xb0 */ 0x00ae, 0x2013, 0x2020, 0x2021, 0x00b7, 0x00a6, 0x00b6, 0x2022, 0x201a, 0x201e, 0x201d, 0x00bb, 0x2026, 0x2030, 0x00ac, 0x00bf, /* 0xc0 */ 0x00b9, 0x02cb, 0x00b4, 0x02c6, 0x02dc, 0x00af, 0x02d8, 0x02d9, 0x00a8, 0x00b2, 0x02da, 0x00b8, 0x00b3, 0x02dd, 0x02db, 0x02c7, /* 0xd0 */ 0x2014, 0x00b1, 0x00bc, 0x00bd, 0x00be, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, /* 0xe0 */ 0x00ec, 0x00c6, 0x00ed, 0x00aa, 0x00ee, 0x00ef, 0x00f0, 0x00f1, 0x0141, 0x00d8, 0x0152, 0x00ba, 0x00f2, 0x00f3, 0x00f4, 0x00f5, /* 0xf0 */ 0x00f6, 0x00e6, 0x00f9, 0x00fa, 0x00fb, 0x0131, 0x00fc, 0x00fd, 0x0142, 0x00f8, 0x0153, 0x00df, 0x00fe, 0x00ff, 0xfffd, 0xfffd, }; static int nextstep_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = nextstep_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char nextstep_page00[96] = { 0x80, 0xa1, 0xa2, 0xa3, 0xa8, 0xa5, 0xb5, 0xa7, /* 0xa0-0xa7 */ 0xc8, 0xa0, 0xe3, 0xab, 0xbe, 0x00, 0xb0, 0xc5, /* 0xa8-0xaf */ 0x00, 0xd1, 0xc9, 0xcc, 0xc2, 0x9d, 0xb6, 0xb4, /* 0xb0-0xb7 */ 0xcb, 0xc0, 0xeb, 0xbb, 0xd2, 0xd3, 0xd4, 0xbf, /* 0xb8-0xbf */ 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0xe1, 0x87, /* 0xc0-0xc7 */ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0xc8-0xcf */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x9e, /* 0xd0-0xd7 */ 0xe9, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0xfb, /* 0xd8-0xdf */ 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xf1, 0xdb, /* 0xe0-0xe7 */ 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe2, 0xe4, 0xe5, /* 0xe8-0xef */ 0xe6, 0xe7, 0xec, 0xed, 0xee, 0xef, 0xf0, 0x9f, /* 0xf0-0xf7 */ 0xf9, 0xf2, 0xf3, 0xf4, 0xf6, 0xf7, 0xfc, 0xfd, /* 0xf8-0xff */ }; static const unsigned char nextstep_page01[104] = { 0x00, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0xe8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0xea, 0xfa, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char nextstep_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xcf, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0xc6, 0xc7, 0xca, 0xce, 0xc4, 0xcd, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char nextstep_page20[56] = { 0x00, 0x00, 0x00, 0xb1, 0xd0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0xa9, 0xb8, 0x00, 0xaa, 0xba, 0xb9, 0x00, /* 0x18-0x1f */ 0xb2, 0xb3, 0xb7, 0x00, 0x00, 0x00, 0xbc, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0xac, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, /* 0x40-0x47 */ }; static const unsigned char nextstep_pagefb[8] = { 0x00, 0xae, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ }; static int nextstep_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = nextstep_page00[wc-0x00a0]; else if (wc >= 0x0130 && wc < 0x0198) c = nextstep_page01[wc-0x0130]; else if (wc >= 0x02c0 && wc < 0x02e0) c = nextstep_page02[wc-0x02c0]; else if (wc >= 0x2010 && wc < 0x2048) c = nextstep_page20[wc-0x2010]; else if (wc >= 0xfb00 && wc < 0xfb08) c = nextstep_pagefb[wc-0xfb00]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/pt154.h000066400000000000000000000114571252300335000237630ustar00rootroot00000000000000/* * Copyright (C) 1999-2005 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * PT154 */ static const unsigned short pt154_2uni[64] = { /* 0x80 */ 0x0496, 0x0492, 0x04ee, 0x0493, 0x201e, 0x2026, 0x04b6, 0x04ae, 0x04b2, 0x04af, 0x04a0, 0x04e2, 0x04a2, 0x049a, 0x04ba, 0x04b8, /* 0x90 */ 0x0497, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x04b3, 0x04b7, 0x04a1, 0x04e3, 0x04a3, 0x049b, 0x04bb, 0x04b9, /* 0xa0 */ 0x00a0, 0x040e, 0x045e, 0x0408, 0x04e8, 0x0498, 0x04b0, 0x00a7, 0x0401, 0x00a9, 0x04d8, 0x00ab, 0x00ac, 0x04ef, 0x00ae, 0x049c, /* 0xb0 */ 0x00b0, 0x04b1, 0x0406, 0x0456, 0x0499, 0x04e9, 0x00b6, 0x00b7, 0x0451, 0x2116, 0x04d9, 0x00bb, 0x0458, 0x04aa, 0x04ab, 0x049d, }; static int pt154_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else if (c >= 0xc0) *pwc = (ucs4_t) c + 0x0350; else *pwc = (ucs4_t) pt154_2uni[c-0x80]; return 1; } static const unsigned char pt154_page00[32] = { 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0x00, 0xa9, 0x00, 0xab, 0xac, 0x00, 0xae, 0x00, /* 0xa8-0xaf */ 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char pt154_page04[240] = { 0x00, 0xa8, 0x00, 0x00, 0x00, 0x00, 0xb2, 0x00, /* 0x00-0x07 */ 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, 0x00, /* 0x08-0x0f */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x10-0x17 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x18-0x1f */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x20-0x27 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0x28-0x2f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x30-0x37 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x38-0x3f */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x40-0x47 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0x48-0x4f */ 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0xb3, 0x00, /* 0x50-0x57 */ 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x81, 0x83, 0x00, 0x00, 0x80, 0x90, /* 0x90-0x97 */ 0xa5, 0xb4, 0x8d, 0x9d, 0xaf, 0xbf, 0x00, 0x00, /* 0x98-0x9f */ 0x8a, 0x9a, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0xbd, 0xbe, 0x00, 0x00, 0x87, 0x89, /* 0xa8-0xaf */ 0xa6, 0xb1, 0x88, 0x98, 0x00, 0x00, 0x86, 0x99, /* 0xb0-0xb7 */ 0x8f, 0x9f, 0x8e, 0x9e, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0xaa, 0xba, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0xa4, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x82, 0xad, /* 0xe8-0xef */ }; static const unsigned char pt154_page20[24] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x00, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ }; static int pt154_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = pt154_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x04f0) c = pt154_page04[wc-0x0400]; else if (wc >= 0x2010 && wc < 0x2028) c = pt154_page20[wc-0x2010]; else if (wc == 0x2116) c = 0xb9; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/relocatable.h000066400000000000000000000061771252300335000253660ustar00rootroot00000000000000/* Provide relocatable packages. Copyright (C) 2003, 2005, 2008-2011 Free Software Foundation, Inc. Written by Bruno Haible , 2003. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _RELOCATABLE_H #define _RELOCATABLE_H #ifdef __cplusplus extern "C" { #endif /* This can be enabled through the configure --enable-relocatable option. */ #if ENABLE_RELOCATABLE /* When building a DLL, we must export some functions. Note that because this is a private .h file, we don't need to use __declspec(dllimport) in any case. */ #if HAVE_VISIBILITY && BUILDING_DLL # define RELOCATABLE_DLL_EXPORTED __attribute__((__visibility__("default"))) #elif defined _MSC_VER && BUILDING_DLL # define RELOCATABLE_DLL_EXPORTED __declspec(dllexport) #else # define RELOCATABLE_DLL_EXPORTED #endif /* Sets the original and the current installation prefix of the package. Relocation simply replaces a pathname starting with the original prefix by the corresponding pathname with the current prefix instead. Both prefixes should be directory names without trailing slash (i.e. use "" instead of "/"). */ extern RELOCATABLE_DLL_EXPORTED void set_relocation_prefix (const char *orig_prefix, const char *curr_prefix); /* Returns the pathname, relocated according to the current installation directory. The returned string is either PATHNAME unmodified or a freshly allocated string that you can free with free() after casting it to 'char *'. */ extern const char * relocate (const char *pathname); /* Memory management: relocate() potentially allocates memory, because it has to construct a fresh pathname. If this is a problem because your program calls relocate() frequently, think about caching the result. Or free the return value if it was different from the argument pathname. */ /* Convenience function: Computes the current installation prefix, based on the original installation prefix, the original installation directory of a particular file, and the current pathname of this file. Returns it, freshly allocated. Returns NULL upon failure. */ extern char * compute_curr_prefix (const char *orig_installprefix, const char *orig_installdir, const char *curr_pathname); #else /* By default, we use the hardwired pathnames. */ #define relocate(pathname) (pathname) #endif #ifdef __cplusplus } #endif #endif /* _RELOCATABLE_H */ freelan-2.0/third-party/source/libiconv-msvc/include/riscos1.h000066400000000000000000000065661252300335000244760ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * RISCOS-LATIN1 */ static const unsigned short riscos1_2uni[32] = { /* 0x80 */ 0x221a, 0x0174, 0x0175, 0x0083, 0x2573, 0x0176, 0x0177, 0x0087, 0x21e6, 0x21e8, 0x21e9, 0x21e7, 0x2026, 0x2122, 0x2030, 0x2022, /* 0x90 */ 0x2018, 0x2019, 0x2039, 0x203a, 0x201c, 0x201d, 0x201e, 0x2013, 0x2014, 0x2212, 0x0152, 0x0153, 0x2020, 0x2021, 0xfb01, 0xfb02, }; static int riscos1_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0x80 && c < 0xa0) *pwc = (ucs4_t) riscos1_2uni[c-0x80]; else *pwc = (ucs4_t) c; return 1; } static const unsigned char riscos1_page01[40] = { 0x00, 0x00, 0x9a, 0x9b, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x81, 0x82, 0x85, 0x86, /* 0x70-0x77 */ }; static const unsigned char riscos1_page20[48] = { 0x00, 0x00, 0x00, 0x97, 0x98, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x90, 0x91, 0x00, 0x00, 0x94, 0x95, 0x96, 0x00, /* 0x18-0x1f */ 0x9c, 0x9d, 0x8f, 0x00, 0x00, 0x00, 0x8c, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x92, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static const unsigned char riscos1_page21[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x8b, /* 0xe0-0xe7 */ 0x89, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ }; static const unsigned char riscos1_page22[16] = { 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ }; static int riscos1_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080 || wc == 0x0083 || wc == 0x0087 || (wc >= 0x00a0 && wc < 0x0100)) { *r = wc; return 1; } else if (wc >= 0x0150 && wc < 0x0178) c = riscos1_page01[wc-0x0150]; else if (wc >= 0x2010 && wc < 0x2040) c = riscos1_page20[wc-0x2010]; else if (wc == 0x2122) c = 0x8d; else if (wc >= 0x21e0 && wc < 0x21f0) c = riscos1_page21[wc-0x21e0]; else if (wc >= 0x2210 && wc < 0x2220) c = riscos1_page22[wc-0x2210]; else if (wc == 0x2573) c = 0x84; else if (wc >= 0xfb01 && wc < 0xfb03) c = wc-0xfa63; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/rk1048.h000066400000000000000000000137011252300335000240310ustar00rootroot00000000000000/* * Copyright (C) 1999-2007 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * RK1048 */ static const unsigned short rk1048_2uni[128] = { /* 0x80 */ 0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021, 0x20ac, 0x2030, 0x0409, 0x2039, 0x040a, 0x049a, 0x04ba, 0x040f, /* 0x90 */ 0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0xfffd, 0x2122, 0x0459, 0x203a, 0x045a, 0x049b, 0x04bb, 0x045f, /* 0xa0 */ 0x00a0, 0x04b0, 0x04b1, 0x04d8, 0x00a4, 0x04e8, 0x00a6, 0x00a7, 0x0401, 0x00a9, 0x0492, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x04ae, /* 0xb0 */ 0x00b0, 0x00b1, 0x0406, 0x0456, 0x04e9, 0x00b5, 0x00b6, 0x00b7, 0x0451, 0x2116, 0x0493, 0x00bb, 0x04d9, 0x04a2, 0x04a3, 0x04af, /* 0xc0 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, /* 0xd0 */ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, /* 0xe0 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, /* 0xf0 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, }; static int rk1048_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = rk1048_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char rk1048_page00[32] = { 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0x00, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0x00, 0x00, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char rk1048_page04[240] = { 0x00, 0xa8, 0x80, 0x81, 0x00, 0x00, 0xb2, 0x00, /* 0x00-0x07 */ 0x00, 0x8a, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x8f, /* 0x08-0x0f */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x10-0x17 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x18-0x1f */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x20-0x27 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0x28-0x2f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x30-0x37 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x38-0x3f */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x40-0x47 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0x48-0x4f */ 0x00, 0xb8, 0x90, 0x83, 0x00, 0x00, 0xb3, 0x00, /* 0x50-0x57 */ 0x00, 0x9a, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x9f, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0xaa, 0xba, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x8d, 0x9d, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x00, 0x00, 0xbd, 0xbe, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xbf, /* 0xa8-0xaf */ 0xa1, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x8e, 0x9e, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0xa3, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0xa5, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ }; static const unsigned char rk1048_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static const unsigned char rk1048_page21[24] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static int rk1048_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = rk1048_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x04f0) c = rk1048_page04[wc-0x0400]; else if (wc >= 0x2010 && wc < 0x2040) c = rk1048_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x88; else if (wc >= 0x2110 && wc < 0x2128) c = rk1048_page21[wc-0x2110]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/shift_jisx0213.h000066400000000000000000000231341252300335000255610ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * SHIFT_JISX0213 */ /* The structure of Shift_JISX0213 is as follows: 0x00..0x7F: ISO646-JP, an ASCII variant 0x{A1..DF}: JISX0201 Katakana. 0x{81..9F,E0..EF}{40..7E,80..FC}: JISX0213 plane 1. 0x{F0..FC}{40..7E,80..FC}: JISX0213 plane 2, with irregular row mapping. Note that some JISX0213 characters are not contained in Unicode 3.2 and are therefore best represented as sequences of Unicode characters. */ #include "jisx0213.h" #include "flushwc.h" static int shift_jisx0213_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { ucs4_t last_wc = conv->istate; if (last_wc) { /* Output the buffered character. */ conv->istate = 0; *pwc = last_wc; return 0; /* Don't advance the input pointer. */ } else { unsigned char c = *s; if (c < 0x80) { /* Plain ISO646-JP character. */ if (c == 0x5c) *pwc = (ucs4_t) 0x00a5; else if (c == 0x7e) *pwc = (ucs4_t) 0x203e; else *pwc = (ucs4_t) c; return 1; } else if (c >= 0xa1 && c <= 0xdf) { *pwc = c + 0xfec0; return 1; } else { if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xfc)) { /* Two byte character. */ if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 <= 0x7e) || (c2 >= 0x80 && c2 <= 0xfc)) { unsigned int c1; ucs4_t wc; /* Convert to row and column. */ if (c < 0xe0) c -= 0x81; else c -= 0xc1; if (c2 < 0x80) c2 -= 0x40; else c2 -= 0x41; /* Now 0 <= c <= 0x3b, 0 <= c2 <= 0xbb. */ c1 = 2 * c; if (c2 >= 0x5e) c2 -= 0x5e, c1++; c2 += 0x21; if (c1 >= 0x5e) { /* Handling of JISX 0213 plane 2 rows. */ if (c1 >= 0x67) c1 += 230; else if (c1 >= 0x63 || c1 == 0x5f) c1 += 168; else c1 += 162; } wc = jisx0213_to_ucs4(0x121+c1,c2); if (wc) { if (wc < 0x80) { /* It's a combining character. */ ucs4_t wc1 = jisx0213_to_ucs_combining[wc - 1][0]; ucs4_t wc2 = jisx0213_to_ucs_combining[wc - 1][1]; /* We cannot output two Unicode characters at once. So, output the first character and buffer the second one. */ *pwc = wc1; conv->istate = wc2; } else *pwc = wc; return 2; } } } else return RET_TOOFEW(0); } return RET_ILSEQ; } } } #define shift_jisx0213_flushwc normal_flushwc /* Composition tables for each of the relevant combining characters. */ static const struct { unsigned short base; unsigned short composed; } shift_jisx0213_comp_table_data[] = { #define shift_jisx0213_comp_table02e5_idx 0 #define shift_jisx0213_comp_table02e5_len 1 { 0x8684, 0x8685 }, /* 0x12B65 = 0x12B64 U+02E5 */ #define shift_jisx0213_comp_table02e9_idx (shift_jisx0213_comp_table02e5_idx+shift_jisx0213_comp_table02e5_len) #define shift_jisx0213_comp_table02e9_len 1 { 0x8680, 0x8686 }, /* 0x12B66 = 0x12B60 U+02E9 */ #define shift_jisx0213_comp_table0300_idx (shift_jisx0213_comp_table02e9_idx+shift_jisx0213_comp_table02e9_len) #define shift_jisx0213_comp_table0300_len 5 { 0x857b, 0x8663 }, /* 0x12B44 = 0x1295C U+0300 */ { 0x8657, 0x8667 }, /* 0x12B48 = 0x12B38 U+0300 */ { 0x8656, 0x8669 }, /* 0x12B4A = 0x12B37 U+0300 */ { 0x864f, 0x866b }, /* 0x12B4C = 0x12B30 U+0300 */ { 0x8662, 0x866d }, /* 0x12B4E = 0x12B43 U+0300 */ #define shift_jisx0213_comp_table0301_idx (shift_jisx0213_comp_table0300_idx+shift_jisx0213_comp_table0300_len) #define shift_jisx0213_comp_table0301_len 4 { 0x8657, 0x8668 }, /* 0x12B49 = 0x12B38 U+0301 */ { 0x8656, 0x866a }, /* 0x12B4B = 0x12B37 U+0301 */ { 0x864f, 0x866c }, /* 0x12B4D = 0x12B30 U+0301 */ { 0x8662, 0x866e }, /* 0x12B4F = 0x12B43 U+0301 */ #define shift_jisx0213_comp_table309a_idx (shift_jisx0213_comp_table0301_idx+shift_jisx0213_comp_table0301_len) #define shift_jisx0213_comp_table309a_len 14 { 0x82a9, 0x82f5 }, /* 0x12477 = 0x1242B U+309A */ { 0x82ab, 0x82f6 }, /* 0x12478 = 0x1242D U+309A */ { 0x82ad, 0x82f7 }, /* 0x12479 = 0x1242F U+309A */ { 0x82af, 0x82f8 }, /* 0x1247A = 0x12431 U+309A */ { 0x82b1, 0x82f9 }, /* 0x1247B = 0x12433 U+309A */ { 0x834a, 0x8397 }, /* 0x12577 = 0x1252B U+309A */ { 0x834c, 0x8398 }, /* 0x12578 = 0x1252D U+309A */ { 0x834e, 0x8399 }, /* 0x12579 = 0x1252F U+309A */ { 0x8350, 0x839a }, /* 0x1257A = 0x12531 U+309A */ { 0x8352, 0x839b }, /* 0x1257B = 0x12533 U+309A */ { 0x835a, 0x839c }, /* 0x1257C = 0x1253B U+309A */ { 0x8363, 0x839d }, /* 0x1257D = 0x12544 U+309A */ { 0x8367, 0x839e }, /* 0x1257E = 0x12548 U+309A */ { 0x83f3, 0x83f6 }, /* 0x12678 = 0x12675 U+309A */ }; static int shift_jisx0213_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { int count = 0; unsigned short lasttwo = conv->ostate; if (lasttwo) { /* Attempt to combine the last character with this one. */ unsigned int idx; unsigned int len; if (wc == 0x02e5) idx = shift_jisx0213_comp_table02e5_idx, len = shift_jisx0213_comp_table02e5_len; else if (wc == 0x02e9) idx = shift_jisx0213_comp_table02e9_idx, len = shift_jisx0213_comp_table02e9_len; else if (wc == 0x0300) idx = shift_jisx0213_comp_table0300_idx, len = shift_jisx0213_comp_table0300_len; else if (wc == 0x0301) idx = shift_jisx0213_comp_table0301_idx, len = shift_jisx0213_comp_table0301_len; else if (wc == 0x309a) idx = shift_jisx0213_comp_table309a_idx, len = shift_jisx0213_comp_table309a_len; else goto not_combining; do if (shift_jisx0213_comp_table_data[idx].base == lasttwo) break; while (++idx, --len > 0); if (len > 0) { /* Output the combined character. */ if (n >= 2) { lasttwo = shift_jisx0213_comp_table_data[idx].composed; r[0] = (lasttwo >> 8) & 0xff; r[1] = lasttwo & 0xff; conv->ostate = 0; return 2; } else return RET_TOOSMALL; } not_combining: /* Output the buffered character. */ if (n < 2) return RET_TOOSMALL; r[0] = (lasttwo >> 8) & 0xff; r[1] = lasttwo & 0xff; r += 2; count = 2; } if (wc < 0x80 && wc != 0x5c && wc != 0x7e) { /* Plain ISO646-JP character. */ if (n > count) { r[0] = (unsigned char) wc; conv->ostate = 0; return count+1; } else return RET_TOOSMALL; } else if (wc == 0x00a5) { if (n > count) { r[0] = 0x5c; conv->ostate = 0; return count+1; } else return RET_TOOSMALL; } else if (wc == 0x203e) { if (n > count) { r[0] = 0x7e; conv->ostate = 0; return count+1; } else return RET_TOOSMALL; } else if (wc >= 0xff61 && wc <= 0xff9f) { /* Half-width katakana. */ if (n > count) { r[0] = wc - 0xfec0; conv->ostate = 0; return count+1; } else return RET_TOOSMALL; } else { unsigned int s1, s2; unsigned short jch = ucs4_to_jisx0213(wc); if (jch != 0) { /* Convert it to shifted representation. */ s1 = jch >> 8; s2 = jch & 0x7f; s1 -= 0x21; s2 -= 0x21; if (s1 >= 0x5e) { /* Handling of JISX 0213 plane 2 rows. */ if (s1 >= 0xcd) /* rows 0x26E..0x27E */ s1 -= 102; else if (s1 >= 0x8b || s1 == 0x87) /* rows 0x228, 0x22C..0x22F */ s1 -= 40; else /* rows 0x221, 0x223..0x225 */ s1 -= 34; /* Now 0x5e <= s1 <= 0x77. */ } if (s1 & 1) s2 += 0x5e; s1 = s1 >> 1; if (s1 < 0x1f) s1 += 0x81; else s1 += 0xc1; if (s2 < 0x3f) s2 += 0x40; else s2 += 0x41; if (jch & 0x0080) { /* A possible match in comp_table_data. We have to buffer it. */ /* We know it's a JISX 0213 plane 1 character. */ if (jch & 0x8000) abort(); conv->ostate = (s1 << 8) | s2; return count+0; } /* Output the shifted representation. */ if (n >= count+2) { r[0] = s1; r[1] = s2; conv->ostate = 0; return count+2; } else return RET_TOOSMALL; } return RET_ILUNI; } } static int shift_jisx0213_reset (conv_t conv, unsigned char *r, int n) { state_t lasttwo = conv->ostate; if (lasttwo) { if (n < 2) return RET_TOOSMALL; r[0] = (lasttwo >> 8) & 0xff; r[1] = lasttwo & 0xff; /* conv->ostate = 0; will be done by the caller */ return 2; } else return 0; } freelan-2.0/third-party/source/libiconv-msvc/include/sjis.h000066400000000000000000000101401252300335000240420ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * SHIFT_JIS */ /* Conversion between SJIS codes (s1,s2) and JISX0208 codes (c1,c2): Example. (s1,s2) = 0x8140, (c1,c2) = 0x2121. 0x81 <= s1 <= 0x9F || 0xE0 <= s1 <= 0xEA, 0x40 <= s2 <= 0x7E || 0x80 <= s2 <= 0xFC, 0x21 <= c1 <= 0x74, 0x21 <= c2 <= 0x7E. Invariant: 94*2*(s1 < 0xE0 ? s1-0x81 : s1-0xC1) + (s2 < 0x80 ? s2-0x40 : s2-0x41) = 94*(c1-0x21)+(c2-0x21) Conversion (s1,s2) -> (c1,c2): t1 := (s1 < 0xE0 ? s1-0x81 : s1-0xC1) t2 := (s2 < 0x80 ? s2-0x40 : s2-0x41) c1 := 2*t1 + (t2 < 0x5E ? 0 : 1) + 0x21 c2 := (t2 < 0x5E ? t2 : t2-0x5E) + 0x21 Conversion (c1,c2) -> (s1,s2): t1 := (c1 - 0x21) >> 1 t2 := ((c1 - 0x21) & 1) * 0x5E + (c2 - 0x21) s1 := (t1 < 0x1F ? t1+0x81 : t1+0xC1) s2 := (t2 < 0x3F ? t2+0x40 : t2+0x41) */ static int sjis_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80 || (c >= 0xa1 && c <= 0xdf)) return jisx0201_mbtowc(conv,pwc,s,n); else { unsigned char s1, s2; s1 = c; if ((s1 >= 0x81 && s1 <= 0x9f) || (s1 >= 0xe0 && s1 <= 0xea)) { if (n < 2) return RET_TOOFEW(0); s2 = s[1]; if ((s2 >= 0x40 && s2 <= 0x7e) || (s2 >= 0x80 && s2 <= 0xfc)) { unsigned char t1 = (s1 < 0xe0 ? s1-0x81 : s1-0xc1); unsigned char t2 = (s2 < 0x80 ? s2-0x40 : s2-0x41); unsigned char buf[2]; buf[0] = 2*t1 + (t2 < 0x5e ? 0 : 1) + 0x21; buf[1] = (t2 < 0x5e ? t2 : t2-0x5e) + 0x21; return jisx0208_mbtowc(conv,pwc,buf,2); } } else if (s1 >= 0xf0 && s1 <= 0xf9) { /* User-defined range. See * Ken Lunde's "CJKV Information Processing", table 4-66, p. 206. */ if (n < 2) return RET_TOOFEW(0); s2 = s[1]; if ((s2 >= 0x40 && s2 <= 0x7e) || (s2 >= 0x80 && s2 <= 0xfc)) { *pwc = 0xe000 + 188*(s1 - 0xf0) + (s2 < 0x80 ? s2-0x40 : s2-0x41); return 2; } } return RET_ILSEQ; } } static int sjis_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; /* Try JIS X 0201-1976. */ ret = jisx0201_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { unsigned char c; if (ret != 1) abort(); c = buf[0]; if (c < 0x80 || (c >= 0xa1 && c <= 0xdf)) { r[0] = c; return 1; } } /* Try JIS X 0208-1990. */ ret = jisx0208_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { unsigned char c1, c2; if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; c1 = buf[0]; c2 = buf[1]; if ((c1 >= 0x21 && c1 <= 0x74) && (c2 >= 0x21 && c2 <= 0x7e)) { unsigned char t1 = (c1 - 0x21) >> 1; unsigned char t2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21); r[0] = (t1 < 0x1f ? t1+0x81 : t1+0xc1); r[1] = (t2 < 0x3f ? t2+0x40 : t2+0x41); return 2; } } /* User-defined range. See * Ken Lunde's "CJKV Information Processing", table 4-66, p. 206. */ if (wc >= 0xe000 && wc < 0xe758) { unsigned char c1, c2; if (n < 2) return RET_TOOSMALL; c1 = (unsigned int) (wc - 0xe000) / 188; c2 = (unsigned int) (wc - 0xe000) % 188; r[0] = c1+0xf0; r[1] = (c2 < 0x3f ? c2+0x40 : c2+0x41); return 2; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/tcvn.h000066400000000000000000000257241252300335000240620ustar00rootroot00000000000000/* * Copyright (C) 1999-2002, 2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * TCVN-5712 */ #include "flushwc.h" #include "vietcomb.h" static const unsigned char tcvn_comb_table[] = { 0xb0, 0xb3, 0xb2, 0xb1, 0xb4, }; /* The possible bases in viet_comp_table_data: 0x0041..0x0045, 0x0047..0x0049, 0x004B..0x0050, 0x0052..0x0057, 0x0059..0x005A, 0x0061..0x0065, 0x0067..0x0069, 0x006B..0x0070, 0x0072..0x0077, 0x0079..0x007A, 0x00A5, 0x00C2, 0x00CA, 0x00D3..0x00D6, 0x00DA, 0x00E2, 0x00EA, 0x00F3..0x00F6, 0x00FA, 0x0102..0x0103, 0x0168..0x0169, 0x01A0..0x01A1, 0x01AF..0x01B0. */ static const unsigned int tcvn_comp_bases[] = { 0x06fdfbbe, 0x06fdfbbe, 0x00000000, 0x00000020, 0x04780404, 0x04780404, 0x0000000c, 0x00000000, 0x00000000, 0x00000300, 0x00000000, 0x00018003 }; static const unsigned short tcvn_2uni_1[24] = { /* 0x00 */ 0x0000, 0x00da, 0x1ee4, 0x0003, 0x1eea, 0x1eec, 0x1eee, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, /* 0x10 */ 0x0010, 0x1ee8, 0x1ef0, 0x1ef2, 0x1ef6, 0x1ef8, 0x00dd, 0x1ef4, }; static const unsigned short tcvn_2uni_2[128] = { /* 0x80 */ 0x00c0, 0x1ea2, 0x00c3, 0x00c1, 0x1ea0, 0x1eb6, 0x1eac, 0x00c8, 0x1eba, 0x1ebc, 0x00c9, 0x1eb8, 0x1ec6, 0x00cc, 0x1ec8, 0x0128, /* 0x90 */ 0x00cd, 0x1eca, 0x00d2, 0x1ece, 0x00d5, 0x00d3, 0x1ecc, 0x1ed8, 0x1edc, 0x1ede, 0x1ee0, 0x1eda, 0x1ee2, 0x00d9, 0x1ee6, 0x0168, /* 0xa0 */ 0x00a0, 0x0102, 0x00c2, 0x00ca, 0x00d4, 0x01a0, 0x01af, 0x0110, 0x0103, 0x00e2, 0x00ea, 0x00f4, 0x01a1, 0x01b0, 0x0111, 0x1eb0, /* 0xb0 */ 0x0300, 0x0309, 0x0303, 0x0301, 0x0323, 0x00e0, 0x1ea3, 0x00e3, 0x00e1, 0x1ea1, 0x1eb2, 0x1eb1, 0x1eb3, 0x1eb5, 0x1eaf, 0x1eb4, /* 0xc0 */ 0x1eae, 0x1ea6, 0x1ea8, 0x1eaa, 0x1ea4, 0x1ec0, 0x1eb7, 0x1ea7, 0x1ea9, 0x1eab, 0x1ea5, 0x1ead, 0x00e8, 0x1ec2, 0x1ebb, 0x1ebd, /* 0xd0 */ 0x00e9, 0x1eb9, 0x1ec1, 0x1ec3, 0x1ec5, 0x1ebf, 0x1ec7, 0x00ec, 0x1ec9, 0x1ec4, 0x1ebe, 0x1ed2, 0x0129, 0x00ed, 0x1ecb, 0x00f2, /* 0xe0 */ 0x1ed4, 0x1ecf, 0x00f5, 0x00f3, 0x1ecd, 0x1ed3, 0x1ed5, 0x1ed7, 0x1ed1, 0x1ed9, 0x1edd, 0x1edf, 0x1ee1, 0x1edb, 0x1ee3, 0x00f9, /* 0xf0 */ 0x1ed6, 0x1ee7, 0x0169, 0x00fa, 0x1ee5, 0x1eeb, 0x1eed, 0x1eef, 0x1ee9, 0x1ef1, 0x1ef3, 0x1ef7, 0x1ef9, 0x00fd, 0x1ef5, 0x1ed0, }; /* In the TCVN to Unicode direction, the state contains a buffered character, or 0 if none. */ static int tcvn_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; unsigned short wc; unsigned short last_wc; if (c < 0x18) wc = tcvn_2uni_1[c]; else if (c < 0x80) wc = c; else wc = tcvn_2uni_2[c-0x80]; last_wc = conv->istate; if (last_wc) { if (wc >= 0x0300 && wc < 0x0340) { /* See whether last_wc and wc can be combined. */ unsigned int k; unsigned int i1, i2; switch (wc) { case 0x0300: k = 0; break; case 0x0301: k = 1; break; case 0x0303: k = 2; break; case 0x0309: k = 3; break; case 0x0323: k = 4; break; default: abort(); } i1 = viet_comp_table[k].idx; i2 = i1 + viet_comp_table[k].len-1; if (last_wc >= viet_comp_table_data[i1].base && last_wc <= viet_comp_table_data[i2].base) { unsigned int i; for (;;) { i = (i1+i2)>>1; if (last_wc == viet_comp_table_data[i].base) break; if (last_wc < viet_comp_table_data[i].base) { if (i1 == i) goto not_combining; i2 = i; } else { if (i1 != i) i1 = i; else { i = i2; if (last_wc == viet_comp_table_data[i].base) break; goto not_combining; } } } last_wc = viet_comp_table_data[i].composed; /* Output the combined character. */ conv->istate = 0; *pwc = (ucs4_t) last_wc; return 1; } } not_combining: /* Output the buffered character. */ conv->istate = 0; *pwc = (ucs4_t) last_wc; return 0; /* Don't advance the input pointer. */ } if (wc >= 0x0041 && wc <= 0x01b0 && ((tcvn_comp_bases[(wc - 0x0040) >> 5] >> (wc & 0x1f)) & 1)) { /* wc is a possible match in viet_comp_table_data. Buffer it. */ conv->istate = wc; return RET_TOOFEW(1); } else { /* Output wc immediately. */ *pwc = (ucs4_t) wc; return 1; } } #define tcvn_flushwc normal_flushwc static const unsigned char tcvn_page00[96+184] = { 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x80, 0x83, 0xa2, 0x82, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x87, 0x8a, 0xa3, 0x00, 0x8d, 0x90, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x92, 0x95, 0xa4, 0x94, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x9d, 0x01, 0x00, 0x00, 0x16, 0x00, 0x00, /* 0xd8-0xdf */ 0xb5, 0xb8, 0xa9, 0xb7, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0xcc, 0xd0, 0xaa, 0x00, 0xd7, 0xdd, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0xdf, 0xe3, 0xab, 0xe2, 0x00, 0x00, /* 0xf0-0xf7 */ 0x00, 0xef, 0xf3, 0x00, 0x00, 0xfd, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0x00, 0x00, 0xa1, 0xa8, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xa7, 0xae, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x8f, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x9f, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xa5, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, /* 0xa8-0xaf */ 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ }; static const unsigned char tcvn_page03[40] = { 0xb0, 0xb3, 0x00, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char tcvn_page1e[96] = { 0x84, 0xb9, 0x81, 0xb6, 0xc4, 0xca, 0xc1, 0xc7, /* 0xa0-0xa7 */ 0xc2, 0xc8, 0xc3, 0xc9, 0x86, 0xcb, 0xc0, 0xbe, /* 0xa8-0xaf */ 0xaf, 0xbb, 0xba, 0xbc, 0xbf, 0xbd, 0x85, 0xc6, /* 0xb0-0xb7 */ 0x8b, 0xd1, 0x88, 0xce, 0x89, 0xcf, 0xda, 0xd5, /* 0xb8-0xbf */ 0xc5, 0xd2, 0xcd, 0xd3, 0xd9, 0xd4, 0x8c, 0xd6, /* 0xc0-0xc7 */ 0x8e, 0xd8, 0x91, 0xde, 0x96, 0xe4, 0x93, 0xe1, /* 0xc8-0xcf */ 0xff, 0xe8, 0xdb, 0xe5, 0xe0, 0xe6, 0xf0, 0xe7, /* 0xd0-0xd7 */ 0x97, 0xe9, 0x9b, 0xed, 0x98, 0xea, 0x99, 0xeb, /* 0xd8-0xdf */ 0x9a, 0xec, 0x9c, 0xee, 0x02, 0xf4, 0x9e, 0xf1, /* 0xe0-0xe7 */ 0x11, 0xf8, 0x04, 0xf5, 0x05, 0xf6, 0x06, 0xf7, /* 0xe8-0xef */ 0x12, 0xf9, 0x13, 0xfa, 0x17, 0xfe, 0x14, 0xfb, /* 0xf0-0xf7 */ 0x15, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ }; static int tcvn_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080 && (wc >= 0x0020 || (0x00fe0076 & (1 << wc)) == 0)) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x01b8) c = tcvn_page00[wc-0x00a0]; else if (wc >= 0x0300 && wc < 0x0328) c = tcvn_page03[wc-0x0300]; else if (wc >= 0x0340 && wc < 0x0342) /* deprecated Vietnamese tone marks */ c = tcvn_page03[wc-0x0340]; else if (wc >= 0x1ea0 && wc < 0x1f00) c = tcvn_page1e[wc-0x1ea0]; if (c != 0) { *r = c; return 1; } /* Try compatibility or canonical decomposition. */ { /* Binary search through viet_decomp_table. */ unsigned int i1 = 0; unsigned int i2 = sizeof(viet_decomp_table)/sizeof(viet_decomp_table[0])-1; if (wc >= viet_decomp_table[i1].composed && wc <= viet_decomp_table[i2].composed) { unsigned int i; for (;;) { /* Here i2 - i1 > 0. */ i = (i1+i2)>>1; if (wc == viet_decomp_table[i].composed) break; if (wc < viet_decomp_table[i].composed) { if (i1 == i) return RET_ILUNI; /* Here i1 < i < i2. */ i2 = i; } else { /* Here i1 <= i < i2. */ if (i1 != i) i1 = i; else { /* Here i2 - i1 = 1. */ i = i2; if (wc == viet_decomp_table[i].composed) break; else return RET_ILUNI; } } } /* Found a compatibility or canonical decomposition. */ wc = viet_decomp_table[i].base; /* wc is one of 0x0020, 0x0041..0x005a, 0x0061..0x007a, 0x00a5, 0x00a8, 0x00c2, 0x00c5..0x00c7, 0x00ca, 0x00cf, 0x00d3, 0x00d4, 0x00d6, 0x00d8, 0x00da, 0x00dc, 0x00e2, 0x00e5..0x00e7, 0x00ea, 0x00ef, 0x00f3, 0x00f4, 0x00f6, 0x00f8, 0x00fc, 0x0102, 0x0103, 0x01a0, 0x01a1, 0x01af, 0x01b0. */ if (wc < 0x0080) c = wc; else { c = tcvn_page00[wc-0x00a0]; if (c == 0) return RET_ILUNI; } if (n < 2) return RET_TOOSMALL; r[0] = c; r[1] = tcvn_comb_table[viet_decomp_table[i].comb1]; return 2; } } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/tds565.h000066400000000000000000000077531252300335000241440ustar00rootroot00000000000000/* * Copyright (C) 1999-2002 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * TDS565 */ static const unsigned short tds565_2uni[64] = { /* 0x40 */ 0x0040, 0x0041, 0x0042, 0x00c7, 0x0044, 0x0045, 0x00c4, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x017d, 0x004b, 0x004c, 0x004d, /* 0x50 */ 0x004e, 0x0147, 0x004f, 0x00d6, 0x0050, 0x0052, 0x0053, 0x015e, 0x0054, 0x0055, 0x00dc, 0x0057, 0x0059, 0x00dd, 0x005a, 0x005f, /* 0x60 */ 0x2116, 0x0061, 0x0062, 0x00e7, 0x0064, 0x0065, 0x00e4, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x017e, 0x006b, 0x006c, 0x006d, /* 0x70 */ 0x006e, 0x0148, 0x006f, 0x00f6, 0x0070, 0x0072, 0x0073, 0x015f, 0x0074, 0x0075, 0x00fc, 0x0077, 0x0079, 0x00fd, 0x007a, 0x007f, }; static int tds565_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x40) { *pwc = (ucs4_t) c; return 1; } else if (c < 0x80) { *pwc = (ucs4_t) tds565_2uni[c-0x40]; return 1; } return RET_ILSEQ; } static const unsigned char tds565_page00[64] = { 0x40, 0x41, 0x42, 0x00, 0x44, 0x45, 0x47, 0x48, /* 0x40-0x47 */ 0x49, 0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x50, 0x52, /* 0x48-0x4f */ 0x54, 0x00, 0x55, 0x56, 0x58, 0x59, 0x00, 0x5b, /* 0x50-0x57 */ 0x00, 0x5c, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x5f, /* 0x58-0x5f */ 0x00, 0x61, 0x62, 0x00, 0x64, 0x65, 0x67, 0x68, /* 0x60-0x67 */ 0x69, 0x6a, 0x6b, 0x6d, 0x6e, 0x6f, 0x70, 0x72, /* 0x68-0x6f */ 0x74, 0x00, 0x75, 0x76, 0x78, 0x79, 0x00, 0x7b, /* 0x70-0x77 */ 0x00, 0x7c, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x7f, /* 0x78-0x7f */ }; static const unsigned char tds565_page00_1[64] = { 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x43, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x5a, 0x5d, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x63, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, /* 0xf0-0xf7 */ 0x00, 0x00, 0x00, 0x00, 0x7a, 0x7d, 0x00, 0x00, /* 0xf8-0xff */ }; static const unsigned char tds565_page01[64] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, /* 0x40-0x47 */ 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x77, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x6c, 0x00, /* 0x78-0x7f */ }; static int tds565_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0040) { *r = wc; return 1; } else if (wc >= 0x0040 && wc < 0x0080) c = tds565_page00[wc-0x0040]; else if (wc >= 0x00c0 && wc < 0x0100) c = tds565_page00_1[wc-0x00c0]; else if (wc >= 0x0140 && wc < 0x0180) c = tds565_page01[wc-0x0140]; else if (wc == 0x2116) c = 0x60; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/tis620.h000066400000000000000000000027671252300335000241410ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * TIS620.2533-1 */ static int tis620_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else if (c >= 0xa1 && c <= 0xfb && !(c >= 0xdb && c <= 0xde)) { *pwc = (ucs4_t) (c + 0x0d60); return 1; } return RET_ILSEQ; } static int tis620_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x0e01 && wc <= 0x0e5b && !(wc >= 0x0e3b && wc <= 0x0e3e)) { *r = wc-0x0d60; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/translit.def000066400000000000000000004676101252300335000252630ustar00rootroot00000000000000# Copyright (C) 1999-2003 Free Software Foundation, Inc. # This file is part of the GNU LIBICONV Library. # # The GNU LIBICONV Library is free software; you can redistribute it # and/or modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # The GNU LIBICONV 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 # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with the GNU LIBICONV Library; see the file COPYING.LIB. # If not, write to the Free Software Foundation, Inc., 51 Franklin Street, # Fifth Floor, Boston, MA 02110-1301, USA. # # # Definition of transliteration from Unicode to poorer character sets. # # This covers all of Markus Kuhn's TARGET1. # # The second column gives the transliteration. It is enclosed between tabs! # 00A0 # NO-BREAK SPACE 00A1 ! # INVERTED EXCLAMATION MARK 00A2 c # CENT SIGN 00A3 lb # POUND SIGN 00A4 # CURRENCY SIGN 00A5 yen # YEN SIGN 00A6 | # BROKEN BAR 00A7 SS # SECTION SIGN 00A8 " # DIAERESIS 00A9 (c) # COPYRIGHT SIGN 00AA a # FEMININE ORDINAL INDICATOR 00AB << # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 00AC not # NOT SIGN 00AD - # SOFT HYPHEN 00AE (R) # REGISTERED SIGN 00AF # MACRON 00B0 ^0 # DEGREE SIGN 00B1 +/- # PLUS-MINUS SIGN 00B2 ^2 # SUPERSCRIPT TWO 00B3 ^3 # SUPERSCRIPT THREE 00B4 ' # ACUTE ACCENT 00B5 u # MICRO SIGN 00B6 P # PILCROW SIGN 00B7 . # MIDDLE DOT 00B8 , # CEDILLA 00B9 ^1 # SUPERSCRIPT ONE 00BA o # MASCULINE ORDINAL INDICATOR 00BB >> # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 00BC 1⁄4 # VULGAR FRACTION ONE QUARTER 00BD 1⁄2 # VULGAR FRACTION ONE HALF 00BE 3⁄4 # VULGAR FRACTION THREE QUARTERS 00BF ? # INVERTED QUESTION MARK 00C0 `A # LATIN CAPITAL LETTER A WITH GRAVE 00C1 ´A # LATIN CAPITAL LETTER A WITH ACUTE 00C2 ^A # LATIN CAPITAL LETTER A WITH CIRCUMFLEX 00C3 ~A # LATIN CAPITAL LETTER A WITH TILDE 00C4 "A # LATIN CAPITAL LETTER A WITH DIAERESIS 00C5 A # LATIN CAPITAL LETTER A WITH RING ABOVE 00C6 AE # LATIN CAPITAL LETTER AE 00C7 C # LATIN CAPITAL LETTER C WITH CEDILLA 00C8 `E # LATIN CAPITAL LETTER E WITH GRAVE 00C9 ´E # LATIN CAPITAL LETTER E WITH ACUTE 00CA ^E # LATIN CAPITAL LETTER E WITH CIRCUMFLEX 00CB "E # LATIN CAPITAL LETTER E WITH DIAERESIS 00CC `I # LATIN CAPITAL LETTER I WITH GRAVE 00CD ´I # LATIN CAPITAL LETTER I WITH ACUTE 00CE ^I # LATIN CAPITAL LETTER I WITH CIRCUMFLEX 00CF "I # LATIN CAPITAL LETTER I WITH DIAERESIS 00D0 D # LATIN CAPITAL LETTER ETH 00D1 ~N # LATIN CAPITAL LETTER N WITH TILDE 00D2 `O # LATIN CAPITAL LETTER O WITH GRAVE 00D3 ´O # LATIN CAPITAL LETTER O WITH ACUTE 00D4 ^O # LATIN CAPITAL LETTER O WITH CIRCUMFLEX 00D5 ~O # LATIN CAPITAL LETTER O WITH TILDE 00D6 "O # LATIN CAPITAL LETTER O WITH DIAERESIS 00D7 x # MULTIPLICATION SIGN 00D8 O # LATIN CAPITAL LETTER O WITH STROKE 00D9 `U # LATIN CAPITAL LETTER U WITH GRAVE 00DA ´U # LATIN CAPITAL LETTER U WITH ACUTE 00DB ^U # LATIN CAPITAL LETTER U WITH CIRCUMFLEX 00DC "U # LATIN CAPITAL LETTER U WITH DIAERESIS 00DD ´Y # LATIN CAPITAL LETTER Y WITH ACUTE 00DE Th # LATIN CAPITAL LETTER THORN 00DF ss # LATIN SMALL LETTER SHARP S 00E0 `a # LATIN SMALL LETTER A WITH GRAVE 00E1 ´a # LATIN SMALL LETTER A WITH ACUTE 00E2 ^a # LATIN SMALL LETTER A WITH CIRCUMFLEX 00E3 ~a # LATIN SMALL LETTER A WITH TILDE 00E4 "a # LATIN SMALL LETTER A WITH DIAERESIS 00E5 a # LATIN SMALL LETTER A WITH RING ABOVE 00E6 ae # LATIN SMALL LETTER AE 00E7 c # LATIN SMALL LETTER C WITH CEDILLA 00E8 `e # LATIN SMALL LETTER E WITH GRAVE 00E9 ´e # LATIN SMALL LETTER E WITH ACUTE 00EA ^e # LATIN SMALL LETTER E WITH CIRCUMFLEX 00EB "e # LATIN SMALL LETTER E WITH DIAERESIS 00EC `i # LATIN SMALL LETTER I WITH GRAVE 00ED ´i # LATIN SMALL LETTER I WITH ACUTE 00EE ^i # LATIN SMALL LETTER I WITH CIRCUMFLEX 00EF "i # LATIN SMALL LETTER I WITH DIAERESIS 00F0 d # LATIN SMALL LETTER ETH 00F1 ~n # LATIN SMALL LETTER N WITH TILDE 00F2 `o # LATIN SMALL LETTER O WITH GRAVE 00F3 ´o # LATIN SMALL LETTER O WITH ACUTE 00F4 ^o # LATIN SMALL LETTER O WITH CIRCUMFLEX 00F5 ~o # LATIN SMALL LETTER O WITH TILDE 00F6 "o # LATIN SMALL LETTER O WITH DIAERESIS 00F7 : # DIVISION SIGN 00F8 o # LATIN SMALL LETTER O WITH STROKE 00F9 `u # LATIN SMALL LETTER U WITH GRAVE 00FA ´u # LATIN SMALL LETTER U WITH ACUTE 00FB ^u # LATIN SMALL LETTER U WITH CIRCUMFLEX 00FC "u # LATIN SMALL LETTER U WITH DIAERESIS 00FD ´y # LATIN SMALL LETTER Y WITH ACUTE 00FE th # LATIN SMALL LETTER THORN 00FF "y # LATIN SMALL LETTER Y WITH DIAERESIS 0100 A # LATIN CAPITAL LETTER A WITH MACRON 0101 a # LATIN SMALL LETTER A WITH MACRON 0102 A # LATIN CAPITAL LETTER A WITH BREVE 0103 a # LATIN SMALL LETTER A WITH BREVE 0104 A # LATIN CAPITAL LETTER A WITH OGONEK 0105 a # LATIN SMALL LETTER A WITH OGONEK 0106 ´C # LATIN CAPITAL LETTER C WITH ACUTE 0107 ´c # LATIN SMALL LETTER C WITH ACUTE 0108 ^C # LATIN CAPITAL LETTER C WITH CIRCUMFLEX 0109 ^c # LATIN SMALL LETTER C WITH CIRCUMFLEX 010A C # LATIN CAPITAL LETTER C WITH DOT ABOVE 010B c # LATIN SMALL LETTER C WITH DOT ABOVE 010C C # LATIN CAPITAL LETTER C WITH CARON 010D c # LATIN SMALL LETTER C WITH CARON 010E D # LATIN CAPITAL LETTER D WITH CARON 010F d # LATIN SMALL LETTER D WITH CARON 0110 D # LATIN CAPITAL LETTER D WITH STROKE 0111 d # LATIN SMALL LETTER D WITH STROKE 0112 E # LATIN CAPITAL LETTER E WITH MACRON 0113 e # LATIN SMALL LETTER E WITH MACRON 0114 E # LATIN CAPITAL LETTER E WITH BREVE 0115 e # LATIN SMALL LETTER E WITH BREVE 0116 E # LATIN CAPITAL LETTER E WITH DOT ABOVE 0117 e # LATIN SMALL LETTER E WITH DOT ABOVE 0118 E # LATIN CAPITAL LETTER E WITH OGONEK 0119 e # LATIN SMALL LETTER E WITH OGONEK 011A E # LATIN CAPITAL LETTER E WITH CARON 011B e # LATIN SMALL LETTER E WITH CARON 011C ^G # LATIN CAPITAL LETTER G WITH CIRCUMFLEX 011D ^g # LATIN SMALL LETTER G WITH CIRCUMFLEX 011E G # LATIN CAPITAL LETTER G WITH BREVE 011F g # LATIN SMALL LETTER G WITH BREVE 0120 G # LATIN CAPITAL LETTER G WITH DOT ABOVE 0121 g # LATIN SMALL LETTER G WITH DOT ABOVE 0122 G # LATIN CAPITAL LETTER G WITH CEDILLA 0123 g # LATIN SMALL LETTER G WITH CEDILLA 0124 ^H # LATIN CAPITAL LETTER H WITH CIRCUMFLEX 0125 ^h # LATIN SMALL LETTER H WITH CIRCUMFLEX 0126 H # LATIN CAPITAL LETTER H WITH STROKE 0127 h # LATIN SMALL LETTER H WITH STROKE 0128 ~I # LATIN CAPITAL LETTER I WITH TILDE 0129 ~i # LATIN SMALL LETTER I WITH TILDE 012A I # LATIN CAPITAL LETTER I WITH MACRON 012B i # LATIN SMALL LETTER I WITH MACRON 012C I # LATIN CAPITAL LETTER I WITH BREVE 012D i # LATIN SMALL LETTER I WITH BREVE 012E I # LATIN CAPITAL LETTER I WITH OGONEK 012F i # LATIN SMALL LETTER I WITH OGONEK 0130 I # LATIN CAPITAL LETTER I WITH DOT ABOVE 0131 i # LATIN SMALL LETTER DOTLESS I 0132 IJ # LATIN CAPITAL LIGATURE IJ 0133 ij # LATIN SMALL LIGATURE IJ 0134 ^J # LATIN CAPITAL LETTER J WITH CIRCUMFLEX 0135 ^j # LATIN SMALL LETTER J WITH CIRCUMFLEX 0136 K # LATIN CAPITAL LETTER K WITH CEDILLA 0137 k # LATIN SMALL LETTER K WITH CEDILLA 0138 # LATIN SMALL LETTER KRA 0139 L # LATIN CAPITAL LETTER L WITH ACUTE 013A l # LATIN SMALL LETTER L WITH ACUTE 013B L # LATIN CAPITAL LETTER L WITH CEDILLA 013C l # LATIN SMALL LETTER L WITH CEDILLA 013D L # LATIN CAPITAL LETTER L WITH CARON 013E l # LATIN SMALL LETTER L WITH CARON 013F L # LATIN CAPITAL LETTER L WITH MIDDLE DOT 0140 l # LATIN SMALL LETTER L WITH MIDDLE DOT 0141 L # LATIN CAPITAL LETTER L WITH STROKE 0142 l # LATIN SMALL LETTER L WITH STROKE 0143 ´N # LATIN CAPITAL LETTER N WITH ACUTE 0144 ´n # LATIN SMALL LETTER N WITH ACUTE 0145 N # LATIN CAPITAL LETTER N WITH CEDILLA 0146 n # LATIN SMALL LETTER N WITH CEDILLA 0147 N # LATIN CAPITAL LETTER N WITH CARON 0148 n # LATIN SMALL LETTER N WITH CARON 0149 'n # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE 014A # LATIN CAPITAL LETTER ENG 014B # LATIN SMALL LETTER ENG 014C O # LATIN CAPITAL LETTER O WITH MACRON 014D o # LATIN SMALL LETTER O WITH MACRON 014E O # LATIN CAPITAL LETTER O WITH BREVE 014F o # LATIN SMALL LETTER O WITH BREVE 0150 "O # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE 0151 "o # LATIN SMALL LETTER O WITH DOUBLE ACUTE 0152 OE # LATIN CAPITAL LIGATURE OE 0153 oe # LATIN SMALL LIGATURE OE 0154 ´R # LATIN CAPITAL LETTER R WITH ACUTE 0155 ´r # LATIN SMALL LETTER R WITH ACUTE 0156 R # LATIN CAPITAL LETTER R WITH CEDILLA 0157 r # LATIN SMALL LETTER R WITH CEDILLA 0158 R # LATIN CAPITAL LETTER R WITH CARON 0159 r # LATIN SMALL LETTER R WITH CARON 015A ´S # LATIN CAPITAL LETTER S WITH ACUTE 015B ´s # LATIN SMALL LETTER S WITH ACUTE 015C ^S # LATIN CAPITAL LETTER S WITH CIRCUMFLEX 015D ^s # LATIN SMALL LETTER S WITH CIRCUMFLEX 015E S # LATIN CAPITAL LETTER S WITH CEDILLA 015F s # LATIN SMALL LETTER S WITH CEDILLA 0160 S # LATIN CAPITAL LETTER S WITH CARON 0161 s # LATIN SMALL LETTER S WITH CARON 0162 T # LATIN CAPITAL LETTER T WITH CEDILLA 0163 t # LATIN SMALL LETTER T WITH CEDILLA 0164 T # LATIN CAPITAL LETTER T WITH CARON 0165 t # LATIN SMALL LETTER T WITH CARON 0166 T # LATIN CAPITAL LETTER T WITH STROKE 0167 t # LATIN SMALL LETTER T WITH STROKE 0168 ~U # LATIN CAPITAL LETTER U WITH TILDE 0169 ~u # LATIN SMALL LETTER U WITH TILDE 016A U # LATIN CAPITAL LETTER U WITH MACRON 016B u # LATIN SMALL LETTER U WITH MACRON 016C U # LATIN CAPITAL LETTER U WITH BREVE 016D u # LATIN SMALL LETTER U WITH BREVE 016E U # LATIN CAPITAL LETTER U WITH RING ABOVE 016F u # LATIN SMALL LETTER U WITH RING ABOVE 0170 "U # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE 0171 "u # LATIN SMALL LETTER U WITH DOUBLE ACUTE 0172 U # LATIN CAPITAL LETTER U WITH OGONEK 0173 u # LATIN SMALL LETTER U WITH OGONEK 0174 ^W # LATIN CAPITAL LETTER W WITH CIRCUMFLEX 0175 ^w # LATIN SMALL LETTER W WITH CIRCUMFLEX 0176 ^Y # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX 0177 ^y # LATIN SMALL LETTER Y WITH CIRCUMFLEX 0178 "Y # LATIN CAPITAL LETTER Y WITH DIAERESIS 0179 ´Z # LATIN CAPITAL LETTER Z WITH ACUTE 017A ´z # LATIN SMALL LETTER Z WITH ACUTE 017B Z # LATIN CAPITAL LETTER Z WITH DOT ABOVE 017C z # LATIN SMALL LETTER Z WITH DOT ABOVE 017D Z # LATIN CAPITAL LETTER Z WITH CARON 017E z # LATIN SMALL LETTER Z WITH CARON 017F s # LATIN SMALL LETTER LONG S 018F # LATIN CAPITAL LETTER SCHWA 0192 f # LATIN SMALL LETTER F WITH HOOK 01C4 DŽ # LATIN CAPITAL LETTER DZ WITH CARON 01C5 Dž # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON 01C6 dž # LATIN SMALL LETTER DZ WITH CARON 01C7 LJ # LATIN CAPITAL LETTER LJ 01C8 Lj # LATIN CAPITAL LETTER L WITH SMALL LETTER J 01C9 lj # LATIN SMALL LETTER LJ 01CA NJ # LATIN CAPITAL LETTER NJ 01CB Nj # LATIN CAPITAL LETTER N WITH SMALL LETTER J 01CC nj # LATIN SMALL LETTER NJ 01F1 DZ # LATIN CAPITAL LETTER DZ 01F2 Dz # LATIN CAPITAL LETTER D WITH SMALL LETTER Z 01F3 dz # LATIN SMALL LETTER DZ 0218 S # LATIN CAPITAL LETTER S WITH COMMA BELOW 0219 s # LATIN SMALL LETTER S WITH COMMA BELOW 021A T # LATIN CAPITAL LETTER T WITH COMMA BELOW 021B t # LATIN SMALL LETTER T WITH COMMA BELOW 0259 # LATIN SMALL LETTER SCHWA 02B9 ′ # MODIFIER LETTER PRIME 02BA ″ # MODIFIER LETTER DOUBLE PRIME 02BB ‘ # MODIFIER LETTER TURNED COMMA 02BC ’ # MODIFIER LETTER APOSTROPHE 02BD ‛ # MODIFIER LETTER REVERSED COMMA 02C6 ^ # MODIFIER LETTER CIRCUMFLEX ACCENT 02C7 # CARON 02C8 ' # MODIFIER LETTER VERTICAL LINE 02C9 ¯ # MODIFIER LETTER MACRON 02CA ´ # MODIFIER LETTER ACUTE ACCENT 02CB ` # MODIFIER LETTER GRAVE ACCENT 02CD _ # MODIFIER LETTER LOW MACRON 02D8 # BREVE 02D9 # DOT ABOVE 02DA # RING ABOVE 02DB # OGONEK 02DC ~ # SMALL TILDE 02DD " # DOUBLE ACUTE ACCENT 0374 # GREEK NUMERAL SIGN 0375 # GREEK LOWER NUMERAL SIGN 037A # GREEK YPOGEGRAMMENI 037E # GREEK QUESTION MARK 0384 # GREEK TONOS 0385 # GREEK DIALYTIKA TONOS 0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS 0387 # GREEK ANO TELEIA 0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS 0389 # GREEK CAPITAL LETTER ETA WITH TONOS 038A # GREEK CAPITAL LETTER IOTA WITH TONOS 038C # GREEK CAPITAL LETTER OMICRON WITH TONOS 038E # GREEK CAPITAL LETTER UPSILON WITH TONOS 038F # GREEK CAPITAL LETTER OMEGA WITH TONOS 0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS 0391 # GREEK CAPITAL LETTER ALPHA 0392 # GREEK CAPITAL LETTER BETA 0393 # GREEK CAPITAL LETTER GAMMA 0394 # GREEK CAPITAL LETTER DELTA 0395 # GREEK CAPITAL LETTER EPSILON 0396 # GREEK CAPITAL LETTER ZETA 0397 # GREEK CAPITAL LETTER ETA 0398 # GREEK CAPITAL LETTER THETA 0399 # GREEK CAPITAL LETTER IOTA 039A # GREEK CAPITAL LETTER KAPPA 039B # GREEK CAPITAL LETTER LAMDA 039C # GREEK CAPITAL LETTER MU 039D # GREEK CAPITAL LETTER NU 039E # GREEK CAPITAL LETTER XI 039F # GREEK CAPITAL LETTER OMICRON 03A0 # GREEK CAPITAL LETTER PI 03A1 # GREEK CAPITAL LETTER RHO 03A3 # GREEK CAPITAL LETTER SIGMA 03A4 # GREEK CAPITAL LETTER TAU 03A5 # GREEK CAPITAL LETTER UPSILON 03A6 # GREEK CAPITAL LETTER PHI 03A7 # GREEK CAPITAL LETTER CHI 03A8 # GREEK CAPITAL LETTER PSI 03A9 # GREEK CAPITAL LETTER OMEGA 03AA # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA 03AB # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA 03AC # GREEK SMALL LETTER ALPHA WITH TONOS 03AD # GREEK SMALL LETTER EPSILON WITH TONOS 03AE # GREEK SMALL LETTER ETA WITH TONOS 03AF # GREEK SMALL LETTER IOTA WITH TONOS 03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS 03B1 # GREEK SMALL LETTER ALPHA 03B2 # GREEK SMALL LETTER BETA 03B3 # GREEK SMALL LETTER GAMMA 03B4 # GREEK SMALL LETTER DELTA 03B5 # GREEK SMALL LETTER EPSILON 03B6 # GREEK SMALL LETTER ZETA 03B7 # GREEK SMALL LETTER ETA 03B8 # GREEK SMALL LETTER THETA 03B9 # GREEK SMALL LETTER IOTA 03BA # GREEK SMALL LETTER KAPPA 03BB # GREEK SMALL LETTER LAMDA 03BC # GREEK SMALL LETTER MU 03BD # GREEK SMALL LETTER NU 03BE # GREEK SMALL LETTER XI 03BF # GREEK SMALL LETTER OMICRON 03C0 # GREEK SMALL LETTER PI 03C1 # GREEK SMALL LETTER RHO 03C2 # GREEK SMALL LETTER FINAL SIGMA 03C3 # GREEK SMALL LETTER SIGMA 03C4 # GREEK SMALL LETTER TAU 03C5 # GREEK SMALL LETTER UPSILON 03C6 # GREEK SMALL LETTER PHI 03C7 # GREEK SMALL LETTER CHI 03C8 # GREEK SMALL LETTER PSI 03C9 # GREEK SMALL LETTER OMEGA 03CA # GREEK SMALL LETTER IOTA WITH DIALYTIKA 03CB # GREEK SMALL LETTER UPSILON WITH DIALYTIKA 03CC # GREEK SMALL LETTER OMICRON WITH TONOS 03CD # GREEK SMALL LETTER UPSILON WITH TONOS 03CE # GREEK SMALL LETTER OMEGA WITH TONOS 03D0 β # GREEK BETA SYMBOL 03D1 θ # GREEK THETA SYMBOL 03D2 Υ # GREEK UPSILON WITH HOOK SYMBOL 03D5 φ # GREEK PHI SYMBOL 03D6 π # GREEK PI SYMBOL 03F0 κ # GREEK KAPPA SYMBOL 03F1 ρ # GREEK RHO SYMBOL 03F2 ς # GREEK LUNATE SIGMA SYMBOL 03F4 Θ # GREEK CAPITAL THETA SYMBOL 03F5 ε # GREEK LUNATE EPSILON SYMBOL 03F9 Σ # GREEK CAPITAL LUNATE SIGMA SYMBOL 0401 # CYRILLIC CAPITAL LETTER IO 0402 # CYRILLIC CAPITAL LETTER DJE 0403 # CYRILLIC CAPITAL LETTER GJE 0404 # CYRILLIC CAPITAL LETTER UKRAINIAN IE 0405 # CYRILLIC CAPITAL LETTER DZE 0406 # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I 0407 # CYRILLIC CAPITAL LETTER YI 0408 # CYRILLIC CAPITAL LETTER JE 0409 # CYRILLIC CAPITAL LETTER LJE 040A # CYRILLIC CAPITAL LETTER NJE 040B # CYRILLIC CAPITAL LETTER TSHE 040C # CYRILLIC CAPITAL LETTER KJE 040E # CYRILLIC CAPITAL LETTER SHORT U 040F # CYRILLIC CAPITAL LETTER DZHE 0410 # CYRILLIC CAPITAL LETTER A 0411 # CYRILLIC CAPITAL LETTER BE 0412 # CYRILLIC CAPITAL LETTER VE 0413 # CYRILLIC CAPITAL LETTER GHE 0414 # CYRILLIC CAPITAL LETTER DE 0415 # CYRILLIC CAPITAL LETTER IE 0416 # CYRILLIC CAPITAL LETTER ZHE 0417 # CYRILLIC CAPITAL LETTER ZE 0418 # CYRILLIC CAPITAL LETTER I 0419 # CYRILLIC CAPITAL LETTER SHORT I 041A # CYRILLIC CAPITAL LETTER KA 041B # CYRILLIC CAPITAL LETTER EL 041C # CYRILLIC CAPITAL LETTER EM 041D # CYRILLIC CAPITAL LETTER EN 041E # CYRILLIC CAPITAL LETTER O 041F # CYRILLIC CAPITAL LETTER PE 0420 # CYRILLIC CAPITAL LETTER ER 0421 # CYRILLIC CAPITAL LETTER ES 0422 # CYRILLIC CAPITAL LETTER TE 0423 # CYRILLIC CAPITAL LETTER U 0424 # CYRILLIC CAPITAL LETTER EF 0425 # CYRILLIC CAPITAL LETTER HA 0426 # CYRILLIC CAPITAL LETTER TSE 0427 # CYRILLIC CAPITAL LETTER CHE 0428 # CYRILLIC CAPITAL LETTER SHA 0429 # CYRILLIC CAPITAL LETTER SHCHA 042A # CYRILLIC CAPITAL LETTER HARD SIGN 042B # CYRILLIC CAPITAL LETTER YERU 042C # CYRILLIC CAPITAL LETTER SOFT SIGN 042D # CYRILLIC CAPITAL LETTER E 042E # CYRILLIC CAPITAL LETTER YU 042F # CYRILLIC CAPITAL LETTER YA 0430 # CYRILLIC SMALL LETTER A 0431 # CYRILLIC SMALL LETTER BE 0432 # CYRILLIC SMALL LETTER VE 0433 # CYRILLIC SMALL LETTER GHE 0434 # CYRILLIC SMALL LETTER DE 0435 # CYRILLIC SMALL LETTER IE 0436 # CYRILLIC SMALL LETTER ZHE 0437 # CYRILLIC SMALL LETTER ZE 0438 # CYRILLIC SMALL LETTER I 0439 # CYRILLIC SMALL LETTER SHORT I 043A # CYRILLIC SMALL LETTER KA 043B # CYRILLIC SMALL LETTER EL 043C # CYRILLIC SMALL LETTER EM 043D # CYRILLIC SMALL LETTER EN 043E # CYRILLIC SMALL LETTER O 043F # CYRILLIC SMALL LETTER PE 0440 # CYRILLIC SMALL LETTER ER 0441 # CYRILLIC SMALL LETTER ES 0442 # CYRILLIC SMALL LETTER TE 0443 # CYRILLIC SMALL LETTER U 0444 # CYRILLIC SMALL LETTER EF 0445 # CYRILLIC SMALL LETTER HA 0446 # CYRILLIC SMALL LETTER TSE 0447 # CYRILLIC SMALL LETTER CHE 0448 # CYRILLIC SMALL LETTER SHA 0449 # CYRILLIC SMALL LETTER SHCHA 044A # CYRILLIC SMALL LETTER HARD SIGN 044B # CYRILLIC SMALL LETTER YERU 044C # CYRILLIC SMALL LETTER SOFT SIGN 044D # CYRILLIC SMALL LETTER E 044E # CYRILLIC SMALL LETTER YU 044F # CYRILLIC SMALL LETTER YA 0451 # CYRILLIC SMALL LETTER IO 0452 # CYRILLIC SMALL LETTER DJE 0453 # CYRILLIC SMALL LETTER GJE 0454 # CYRILLIC SMALL LETTER UKRAINIAN IE 0455 # CYRILLIC SMALL LETTER DZE 0456 # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I 0457 # CYRILLIC SMALL LETTER YI 0458 # CYRILLIC SMALL LETTER JE 0459 # CYRILLIC SMALL LETTER LJE 045A # CYRILLIC SMALL LETTER NJE 045B # CYRILLIC SMALL LETTER TSHE 045C # CYRILLIC SMALL LETTER KJE 045E # CYRILLIC SMALL LETTER SHORT U 045F # CYRILLIC SMALL LETTER DZHE 0490 # CYRILLIC CAPITAL LETTER GHE WITH UPTURN 0491 # CYRILLIC SMALL LETTER GHE WITH UPTURN 0587 եւ # ARMENIAN SMALL LIGATURE ECH YIWN 05D0 # HEBREW LETTER ALEF 05D1 # HEBREW LETTER BET 05D2 # HEBREW LETTER GIMEL 05D3 # HEBREW LETTER DALET 05D4 # HEBREW LETTER HE 05D5 # HEBREW LETTER VAV 05D6 # HEBREW LETTER ZAYIN 05D7 # HEBREW LETTER HET 05D8 # HEBREW LETTER TET 05D9 # HEBREW LETTER YOD 05DA # HEBREW LETTER FINAL KAF 05DB # HEBREW LETTER KAF 05DC # HEBREW LETTER LAMED 05DD # HEBREW LETTER FINAL MEM 05DE # HEBREW LETTER MEM 05DF # HEBREW LETTER FINAL NUN 05E0 # HEBREW LETTER NUN 05E1 # HEBREW LETTER SAMEKH 05E2 # HEBREW LETTER AYIN 05E3 # HEBREW LETTER FINAL PE 05E4 # HEBREW LETTER PE 05E5 # HEBREW LETTER FINAL TSADI 05E6 # HEBREW LETTER TSADI 05E7 # HEBREW LETTER QOF 05E8 # HEBREW LETTER RESH 05E9 # HEBREW LETTER SHIN 05EA # HEBREW LETTER TAV 05F0 וו # HEBREW LIGATURE YIDDISH DOUBLE VAV 05F1 וי # HEBREW LIGATURE YIDDISH VAV YOD 05F2 יי # HEBREW LIGATURE YIDDISH DOUBLE YOD 0675 اٴ # ARABIC LETTER HIGH HAMZA ALEF 0676 وٴ # ARABIC LETTER HIGH HAMZA WAW 0677 ۇٴ # ARABIC LETTER U WITH HAMZA ABOVE 0678 يٴ # ARABIC LETTER HIGH HAMZA YEH 0E33 ํา # THAI CHARACTER SARA AM 0EB3 ໍາ # LAO VOWEL SIGN AM 0EDC ຫນ # LAO HO NO 0EDD ຫມ # LAO HO MO 0F77 ྲཱྀ # TIBETAN VOWEL SIGN VOCALIC RR 0F79 ླཱྀ # TIBETAN VOWEL SIGN VOCALIC LL 1E02 B # LATIN CAPITAL LETTER B WITH DOT ABOVE 1E03 b # LATIN SMALL LETTER B WITH DOT ABOVE 1E0A D # LATIN CAPITAL LETTER D WITH DOT ABOVE 1E0B d # LATIN SMALL LETTER D WITH DOT ABOVE 1E1E F # LATIN CAPITAL LETTER F WITH DOT ABOVE 1E1F f # LATIN SMALL LETTER F WITH DOT ABOVE 1E40 M # LATIN CAPITAL LETTER M WITH DOT ABOVE 1E41 m # LATIN SMALL LETTER M WITH DOT ABOVE 1E56 P # LATIN CAPITAL LETTER P WITH DOT ABOVE 1E57 p # LATIN SMALL LETTER P WITH DOT ABOVE 1E60 S # LATIN CAPITAL LETTER S WITH DOT ABOVE 1E61 s # LATIN SMALL LETTER S WITH DOT ABOVE 1E6A T # LATIN CAPITAL LETTER T WITH DOT ABOVE 1E6B t # LATIN SMALL LETTER T WITH DOT ABOVE 1E80 `W # LATIN CAPITAL LETTER W WITH GRAVE 1E81 `w # LATIN SMALL LETTER W WITH GRAVE 1E82 ´W # LATIN CAPITAL LETTER W WITH ACUTE 1E83 ´w # LATIN SMALL LETTER W WITH ACUTE 1E84 "W # LATIN CAPITAL LETTER W WITH DIAERESIS 1E85 "w # LATIN SMALL LETTER W WITH DIAERESIS 1E9A aʾ # LATIN SMALL LETTER A WITH RIGHT HALF RING 1EF2 `Y # LATIN CAPITAL LETTER Y WITH GRAVE 1EF3 `y # LATIN SMALL LETTER Y WITH GRAVE 2002 # EN SPACE 2003 # EM SPACE 2004 # THREE-PER-EM SPACE 2005 # FOUR-PER-EM SPACE 2006 # SIX-PER-EM SPACE 2008 # PUNCTUATION SPACE 2009 # THIN SPACE 200A # HAIR SPACE 2010 - # HYPHEN 2011 - # NON-BREAKING HYPHEN 2012 - # FIGURE DASH 2013 - # EN DASH 2014 - # EM DASH 2015 - # HORIZONTAL BAR 2016 # DOUBLE VERTICAL LINE 2017 # DOUBLE LOW LINE 2018 ' # LEFT SINGLE QUOTATION MARK 2019 ' # RIGHT SINGLE QUOTATION MARK 201A , # SINGLE LOW-9 QUOTATION MARK 201B ' # SINGLE HIGH-REVERSED-9 QUOTATION MARK 201C " # LEFT DOUBLE QUOTATION MARK 201D " # RIGHT DOUBLE QUOTATION MARK 201E " # DOUBLE LOW-9 QUOTATION MARK 201F " # DOUBLE HIGH-REVERSED-9 QUOTATION MARK 2020 + # DAGGER 2021 # DOUBLE DAGGER 2022 o # BULLET 2024 . # ONE DOT LEADER 2025 .. # TWO DOT LEADER 2026 ... # HORIZONTAL ELLIPSIS 2030 o/oo # PER MILLE SIGN 2032 ´ # PRIME 2033 ´´ # DOUBLE PRIME 2034 ´´´ # TRIPLE PRIME 2036 ‵‵ # REVERSED DOUBLE PRIME 2037 ‵‵‵ # REVERSED TRIPLE PRIME 2039 < # SINGLE LEFT-POINTING ANGLE QUOTATION MARK 203A > # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK 203C !! # DOUBLE EXCLAMATION MARK 203E # OVERLINE 2044 / # FRACTION SLASH 2047 ?? # DOUBLE QUESTION MARK 2048 ?! # QUESTION EXCLAMATION MARK 2049 !? # EXCLAMATION QUESTION MARK 2057 ´´´´ # QUADRUPLE PRIME 20A8 Rs # RUPEE SIGN 20AB Đồng # DONG SIGN 20AC EUR # EURO SIGN 2100 a/c # ACCOUNT OF 2101 a/s # ADDRESSED TO THE SUBJECT 2102 C # DOUBLE-STRUCK CAPITAL C 2103 °C # DEGREE CELSIUS 2105 c/o # CARE OF 2106 c/u # CADA UNA 2107 Ɛ # EULER CONSTANT 2109 °F # DEGREE FAHRENHEIT 210A g # SCRIPT SMALL G 210B H # SCRIPT CAPITAL H 210C H # BLACK-LETTER CAPITAL H 210D H # DOUBLE-STRUCK CAPITAL H 210E h # PLANCK CONSTANT 210F ħ # PLANCK CONSTANT OVER TWO PI 2110 I # SCRIPT CAPITAL I 2111 I # BLACK-LETTER CAPITAL I 2112 L # SCRIPT CAPITAL L 2113 l # SCRIPT SMALL L 2115 N # DOUBLE-STRUCK CAPITAL N 2116 No # NUMERO SIGN 2119 P # DOUBLE-STRUCK CAPITAL P 211A Q # DOUBLE-STRUCK CAPITAL Q 211B R # SCRIPT CAPITAL R 211C R # BLACK-LETTER CAPITAL R 211D R # DOUBLE-STRUCK CAPITAL R 2121 TEL # TELEPHONE SIGN 2122 TM # TRADE MARK SIGN 2124 Z # DOUBLE-STRUCK CAPITAL Z 2126 Ohm # OHM SIGN 2128 Z # BLACK-LETTER CAPITAL Z 212C B # SCRIPT CAPITAL B 212D C # BLACK-LETTER CAPITAL C 212E e # ESTIMATED SYMBOL 212F e # SCRIPT SMALL E 2130 E # SCRIPT CAPITAL E 2131 F # SCRIPT CAPITAL F 2133 M # SCRIPT CAPITAL M 2134 o # SCRIPT SMALL O 2135 א # ALEF SYMBOL 2136 ב # BET SYMBOL 2137 ג # GIMEL SYMBOL 2138 ד # DALET SYMBOL 2139 i # INFORMATION SOURCE 213B FAX # FACSIMILE SIGN 213D γ # DOUBLE-STRUCK SMALL GAMMA 213E Γ # DOUBLE-STRUCK CAPITAL GAMMA 213F Π # DOUBLE-STRUCK CAPITAL PI 2140 ∑ # DOUBLE-STRUCK N-ARY SUMMATION 2145 D # DOUBLE-STRUCK ITALIC CAPITAL D 2146 d # DOUBLE-STRUCK ITALIC SMALL D 2147 e # DOUBLE-STRUCK ITALIC SMALL E 2148 i # DOUBLE-STRUCK ITALIC SMALL I 2149 j # DOUBLE-STRUCK ITALIC SMALL J 2153 1⁄3 # VULGAR FRACTION ONE THIRD 2154 2⁄3 # VULGAR FRACTION TWO THIRDS 2155 1⁄5 # VULGAR FRACTION ONE FIFTH 2156 2⁄5 # VULGAR FRACTION TWO FIFTHS 2157 3⁄5 # VULGAR FRACTION THREE FIFTHS 2158 4⁄5 # VULGAR FRACTION FOUR FIFTHS 2159 1⁄6 # VULGAR FRACTION ONE SIXTH 215A 5⁄6 # VULGAR FRACTION FIVE SIXTHS 215B 1⁄8 # VULGAR FRACTION ONE EIGHTH 215C 3⁄8 # VULGAR FRACTION THREE EIGHTHS 215D 5⁄8 # VULGAR FRACTION FIVE EIGHTHS 215E 7⁄8 # VULGAR FRACTION SEVEN EIGHTHS 215F 1⁄ # FRACTION NUMERATOR ONE 2160 I # ROMAN NUMERAL ONE 2161 II # ROMAN NUMERAL TWO 2162 III # ROMAN NUMERAL THREE 2163 IV # ROMAN NUMERAL FOUR 2164 V # ROMAN NUMERAL FIVE 2165 VI # ROMAN NUMERAL SIX 2166 VII # ROMAN NUMERAL SEVEN 2167 VIII # ROMAN NUMERAL EIGHT 2168 IX # ROMAN NUMERAL NINE 2169 X # ROMAN NUMERAL TEN 216A XI # ROMAN NUMERAL ELEVEN 216B XII # ROMAN NUMERAL TWELVE 216C L # ROMAN NUMERAL FIFTY 216D C # ROMAN NUMERAL ONE HUNDRED 216E D # ROMAN NUMERAL FIVE HUNDRED 216F M # ROMAN NUMERAL ONE THOUSAND 2170 i # SMALL ROMAN NUMERAL ONE 2171 ii # SMALL ROMAN NUMERAL TWO 2172 iii # SMALL ROMAN NUMERAL THREE 2173 iv # SMALL ROMAN NUMERAL FOUR 2174 v # SMALL ROMAN NUMERAL FIVE 2175 vi # SMALL ROMAN NUMERAL SIX 2176 vii # SMALL ROMAN NUMERAL SEVEN 2177 viii # SMALL ROMAN NUMERAL EIGHT 2178 ix # SMALL ROMAN NUMERAL NINE 2179 x # SMALL ROMAN NUMERAL TEN 217A xi # SMALL ROMAN NUMERAL ELEVEN 217B xii # SMALL ROMAN NUMERAL TWELVE 217C l # SMALL ROMAN NUMERAL FIFTY 217D c # SMALL ROMAN NUMERAL ONE HUNDRED 217E d # SMALL ROMAN NUMERAL FIVE HUNDRED 217F m # SMALL ROMAN NUMERAL ONE THOUSAND 2190 <- # LEFTWARDS ARROW 2191 ^ # UPWARDS ARROW 2192 -> # RIGHTWARDS ARROW 2193 V # DOWNWARDS ARROW 2194 <-> # LEFT RIGHT ARROW 21D0 <= # LEFTWARDS DOUBLE ARROW 21D2 => # RIGHTWARDS DOUBLE ARROW 21D4 <=> # LEFT RIGHT DOUBLE ARROW 2212 - # MINUS SIGN 2215 / # DIVISION SLASH 2216 \ # SET MINUS 2217 * # ASTERISK OPERATOR 2219 • # BULLET OPERATOR 2223 | # DIVIDES 222C ∫∫ # DOUBLE INTEGRAL 222D ∫∫∫ # TRIPLE INTEGRAL 222F ∮∮ # SURFACE INTEGRAL 2230 ∮∮∮ # VOLUME INTEGRAL 2236 : # RATIO 223C ~ # TILDE OPERATOR 2260 /= # NOT EQUAL TO 2264 <= # LESS-THAN OR EQUAL TO 2265 >= # GREATER-THAN OR EQUAL TO 226A << # MUCH LESS-THAN 226B >> # MUCH GREATER-THAN 22C5 · # DOT OPERATOR 22D8 <<< # VERY MUCH LESS-THAN 22D9 >>> # VERY MUCH GREATER-THAN 22EF ··· # MIDLINE HORIZONTAL ELLIPSIS 2400 [NUL] # SYMBOL FOR NULL 2401 [SOH] # SYMBOL FOR START OF HEADING 2402 [STX] # SYMBOL FOR START OF TEXT 2403 [ETX] # SYMBOL FOR END OF TEXT 2404 [EOT] # SYMBOL FOR END OF TRANSMISSION 2405 [ENQ] # SYMBOL FOR ENQUIRY 2406 [ACK] # SYMBOL FOR ACKNOWLEDGE 2407 [BEL] # SYMBOL FOR BELL 2408 [BS] # SYMBOL FOR BACKSPACE 2409 [HT] # SYMBOL FOR HORIZONTAL TABULATION 240A [LF] # SYMBOL FOR LINE FEED 240B [VT] # SYMBOL FOR VERTICAL TABULATION 240C [FF] # SYMBOL FOR FORM FEED 240D [CR] # SYMBOL FOR CARRIAGE RETURN 240E [SO] # SYMBOL FOR SHIFT OUT 240F [SI] # SYMBOL FOR SHIFT IN 2410 [DLE] # SYMBOL FOR DATA LINK ESCAPE 2411 [DC1] # SYMBOL FOR DEVICE CONTROL ONE 2412 [DC2] # SYMBOL FOR DEVICE CONTROL TWO 2413 [DC3] # SYMBOL FOR DEVICE CONTROL THREE 2414 [DC4] # SYMBOL FOR DEVICE CONTROL FOUR 2415 [NAK] # SYMBOL FOR NEGATIVE ACKNOWLEDGE 2416 [SYN] # SYMBOL FOR SYNCHRONOUS IDLE 2417 [ETB] # SYMBOL FOR END OF TRANSMISSION BLOCK 2418 [CAN] # SYMBOL FOR CANCEL 2419 [EM] # SYMBOL FOR END OF MEDIUM 241A [SUB] # SYMBOL FOR SUBSTITUTE 241B [ESC] # SYMBOL FOR ESCAPE 241C [FS] # SYMBOL FOR FILE SEPARATOR 241D [GS] # SYMBOL FOR GROUP SEPARATOR 241E [RS] # SYMBOL FOR RECORD SEPARATOR 241F [US] # SYMBOL FOR UNIT SEPARATOR 2420 [SP] # SYMBOL FOR SPACE 2421 [DEL] # SYMBOL FOR DELETE 2424 [NL] # SYMBOL FOR NEWLINE 2460 (1) # CIRCLED DIGIT ONE 2461 (2) # CIRCLED DIGIT TWO 2462 (3) # CIRCLED DIGIT THREE 2463 (4) # CIRCLED DIGIT FOUR 2464 (5) # CIRCLED DIGIT FIVE 2465 (6) # CIRCLED DIGIT SIX 2466 (7) # CIRCLED DIGIT SEVEN 2467 (8) # CIRCLED DIGIT EIGHT 2468 (9) # CIRCLED DIGIT NINE 2469 (10) # CIRCLED NUMBER TEN 246A (11) # CIRCLED NUMBER ELEVEN 246B (12) # CIRCLED NUMBER TWELVE 246C (13) # CIRCLED NUMBER THIRTEEN 246D (14) # CIRCLED NUMBER FOURTEEN 246E (15) # CIRCLED NUMBER FIFTEEN 246F (16) # CIRCLED NUMBER SIXTEEN 2470 (17) # CIRCLED NUMBER SEVENTEEN 2471 (18) # CIRCLED NUMBER EIGHTEEN 2472 (19) # CIRCLED NUMBER NINETEEN 2473 (20) # CIRCLED NUMBER TWENTY 2474 (1) # PARENTHESIZED DIGIT ONE 2475 (2) # PARENTHESIZED DIGIT TWO 2476 (3) # PARENTHESIZED DIGIT THREE 2477 (4) # PARENTHESIZED DIGIT FOUR 2478 (5) # PARENTHESIZED DIGIT FIVE 2479 (6) # PARENTHESIZED DIGIT SIX 247A (7) # PARENTHESIZED DIGIT SEVEN 247B (8) # PARENTHESIZED DIGIT EIGHT 247C (9) # PARENTHESIZED DIGIT NINE 247D (10) # PARENTHESIZED NUMBER TEN 247E (11) # PARENTHESIZED NUMBER ELEVEN 247F (12) # PARENTHESIZED NUMBER TWELVE 2480 (13) # PARENTHESIZED NUMBER THIRTEEN 2481 (14) # PARENTHESIZED NUMBER FOURTEEN 2482 (15) # PARENTHESIZED NUMBER FIFTEEN 2483 (16) # PARENTHESIZED NUMBER SIXTEEN 2484 (17) # PARENTHESIZED NUMBER SEVENTEEN 2485 (18) # PARENTHESIZED NUMBER EIGHTEEN 2486 (19) # PARENTHESIZED NUMBER NINETEEN 2487 (20) # PARENTHESIZED NUMBER TWENTY 2488 1. # DIGIT ONE FULL STOP 2489 2. # DIGIT TWO FULL STOP 248A 3. # DIGIT THREE FULL STOP 248B 4. # DIGIT FOUR FULL STOP 248C 5. # DIGIT FIVE FULL STOP 248D 6. # DIGIT SIX FULL STOP 248E 7. # DIGIT SEVEN FULL STOP 248F 8. # DIGIT EIGHT FULL STOP 2490 9. # DIGIT NINE FULL STOP 2491 10. # NUMBER TEN FULL STOP 2492 11. # NUMBER ELEVEN FULL STOP 2493 12. # NUMBER TWELVE FULL STOP 2494 13. # NUMBER THIRTEEN FULL STOP 2495 14. # NUMBER FOURTEEN FULL STOP 2496 15. # NUMBER FIFTEEN FULL STOP 2497 16. # NUMBER SIXTEEN FULL STOP 2498 17. # NUMBER SEVENTEEN FULL STOP 2499 18. # NUMBER EIGHTEEN FULL STOP 249A 19. # NUMBER NINETEEN FULL STOP 249B 20. # NUMBER TWENTY FULL STOP 249C (a) # PARENTHESIZED LATIN SMALL LETTER A 249D (b) # PARENTHESIZED LATIN SMALL LETTER B 249E (c) # PARENTHESIZED LATIN SMALL LETTER C 249F (d) # PARENTHESIZED LATIN SMALL LETTER D 24A0 (e) # PARENTHESIZED LATIN SMALL LETTER E 24A1 (f) # PARENTHESIZED LATIN SMALL LETTER F 24A2 (g) # PARENTHESIZED LATIN SMALL LETTER G 24A3 (h) # PARENTHESIZED LATIN SMALL LETTER H 24A4 (i) # PARENTHESIZED LATIN SMALL LETTER I 24A5 (j) # PARENTHESIZED LATIN SMALL LETTER J 24A6 (k) # PARENTHESIZED LATIN SMALL LETTER K 24A7 (l) # PARENTHESIZED LATIN SMALL LETTER L 24A8 (m) # PARENTHESIZED LATIN SMALL LETTER M 24A9 (n) # PARENTHESIZED LATIN SMALL LETTER N 24AA (o) # PARENTHESIZED LATIN SMALL LETTER O 24AB (p) # PARENTHESIZED LATIN SMALL LETTER P 24AC (q) # PARENTHESIZED LATIN SMALL LETTER Q 24AD (r) # PARENTHESIZED LATIN SMALL LETTER R 24AE (s) # PARENTHESIZED LATIN SMALL LETTER S 24AF (t) # PARENTHESIZED LATIN SMALL LETTER T 24B0 (u) # PARENTHESIZED LATIN SMALL LETTER U 24B1 (v) # PARENTHESIZED LATIN SMALL LETTER V 24B2 (w) # PARENTHESIZED LATIN SMALL LETTER W 24B3 (x) # PARENTHESIZED LATIN SMALL LETTER X 24B4 (y) # PARENTHESIZED LATIN SMALL LETTER Y 24B5 (z) # PARENTHESIZED LATIN SMALL LETTER Z 24B6 (A) # CIRCLED LATIN CAPITAL LETTER A 24B7 (B) # CIRCLED LATIN CAPITAL LETTER B 24B8 (C) # CIRCLED LATIN CAPITAL LETTER C 24B9 (D) # CIRCLED LATIN CAPITAL LETTER D 24BA (E) # CIRCLED LATIN CAPITAL LETTER E 24BB (F) # CIRCLED LATIN CAPITAL LETTER F 24BC (G) # CIRCLED LATIN CAPITAL LETTER G 24BD (H) # CIRCLED LATIN CAPITAL LETTER H 24BE (I) # CIRCLED LATIN CAPITAL LETTER I 24BF (J) # CIRCLED LATIN CAPITAL LETTER J 24C0 (K) # CIRCLED LATIN CAPITAL LETTER K 24C1 (L) # CIRCLED LATIN CAPITAL LETTER L 24C2 (M) # CIRCLED LATIN CAPITAL LETTER M 24C3 (N) # CIRCLED LATIN CAPITAL LETTER N 24C4 (O) # CIRCLED LATIN CAPITAL LETTER O 24C5 (P) # CIRCLED LATIN CAPITAL LETTER P 24C6 (Q) # CIRCLED LATIN CAPITAL LETTER Q 24C7 (R) # CIRCLED LATIN CAPITAL LETTER R 24C8 (S) # CIRCLED LATIN CAPITAL LETTER S 24C9 (T) # CIRCLED LATIN CAPITAL LETTER T 24CA (U) # CIRCLED LATIN CAPITAL LETTER U 24CB (V) # CIRCLED LATIN CAPITAL LETTER V 24CC (W) # CIRCLED LATIN CAPITAL LETTER W 24CD (X) # CIRCLED LATIN CAPITAL LETTER X 24CE (Y) # CIRCLED LATIN CAPITAL LETTER Y 24CF (Z) # CIRCLED LATIN CAPITAL LETTER Z 24D0 (a) # CIRCLED LATIN SMALL LETTER A 24D1 (b) # CIRCLED LATIN SMALL LETTER B 24D2 (c) # CIRCLED LATIN SMALL LETTER C 24D3 (d) # CIRCLED LATIN SMALL LETTER D 24D4 (e) # CIRCLED LATIN SMALL LETTER E 24D5 (f) # CIRCLED LATIN SMALL LETTER F 24D6 (g) # CIRCLED LATIN SMALL LETTER G 24D7 (h) # CIRCLED LATIN SMALL LETTER H 24D8 (i) # CIRCLED LATIN SMALL LETTER I 24D9 (j) # CIRCLED LATIN SMALL LETTER J 24DA (k) # CIRCLED LATIN SMALL LETTER K 24DB (l) # CIRCLED LATIN SMALL LETTER L 24DC (m) # CIRCLED LATIN SMALL LETTER M 24DD (n) # CIRCLED LATIN SMALL LETTER N 24DE (o) # CIRCLED LATIN SMALL LETTER O 24DF (p) # CIRCLED LATIN SMALL LETTER P 24E0 (q) # CIRCLED LATIN SMALL LETTER Q 24E1 (r) # CIRCLED LATIN SMALL LETTER R 24E2 (s) # CIRCLED LATIN SMALL LETTER S 24E3 (t) # CIRCLED LATIN SMALL LETTER T 24E4 (u) # CIRCLED LATIN SMALL LETTER U 24E5 (v) # CIRCLED LATIN SMALL LETTER V 24E6 (w) # CIRCLED LATIN SMALL LETTER W 24E7 (x) # CIRCLED LATIN SMALL LETTER X 24E8 (y) # CIRCLED LATIN SMALL LETTER Y 24E9 (z) # CIRCLED LATIN SMALL LETTER Z 24EA (0) # CIRCLED DIGIT ZERO 2500 - # BOX DRAWINGS LIGHT HORIZONTAL 2502 | # BOX DRAWINGS LIGHT VERTICAL 250C + # BOX DRAWINGS LIGHT DOWN AND RIGHT 2510 + # BOX DRAWINGS LIGHT DOWN AND LEFT 2514 + # BOX DRAWINGS LIGHT UP AND RIGHT 2518 + # BOX DRAWINGS LIGHT UP AND LEFT 251C + # BOX DRAWINGS LIGHT VERTICAL AND RIGHT 2524 + # BOX DRAWINGS LIGHT VERTICAL AND LEFT 252C + # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL 2534 + # BOX DRAWINGS LIGHT UP AND HORIZONTAL 253C + # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL 2592 # MEDIUM SHADE 25AE # BLACK VERTICAL RECTANGLE 25C6 # BLACK DIAMOND 25E6 o # WHITE BULLET 266A # EIGHTH NOTE 2A0C ∫∫∫∫ # QUADRUPLE INTEGRAL OPERATOR 2A74 ::= # DOUBLE COLON EQUAL 2A75 == # TWO CONSECUTIVE EQUALS SIGNS 2A76 === # THREE CONSECUTIVE EQUALS SIGNS 2E9F 母 # CJK RADICAL MOTHER 2EF3 龟 # CJK RADICAL C-SIMPLIFIED TURTLE 2F00 一 # KANGXI RADICAL ONE 2F01 丨 # KANGXI RADICAL LINE 2F02 丶 # KANGXI RADICAL DOT 2F03 丿 # KANGXI RADICAL SLASH 2F04 乙 # KANGXI RADICAL SECOND 2F05 亅 # KANGXI RADICAL HOOK 2F06 二 # KANGXI RADICAL TWO 2F07 亠 # KANGXI RADICAL LID 2F08 人 # KANGXI RADICAL MAN 2F09 儿 # KANGXI RADICAL LEGS 2F0A 入 # KANGXI RADICAL ENTER 2F0B 八 # KANGXI RADICAL EIGHT 2F0C 冂 # KANGXI RADICAL DOWN BOX 2F0D 冖 # KANGXI RADICAL COVER 2F0E 冫 # KANGXI RADICAL ICE 2F0F 几 # KANGXI RADICAL TABLE 2F10 凵 # KANGXI RADICAL OPEN BOX 2F11 刀 # KANGXI RADICAL KNIFE 2F12 力 # KANGXI RADICAL POWER 2F13 勹 # KANGXI RADICAL WRAP 2F14 匕 # KANGXI RADICAL SPOON 2F15 匚 # KANGXI RADICAL RIGHT OPEN BOX 2F16 匸 # KANGXI RADICAL HIDING ENCLOSURE 2F17 十 # KANGXI RADICAL TEN 2F18 卜 # KANGXI RADICAL DIVINATION 2F19 卩 # KANGXI RADICAL SEAL 2F1A 厂 # KANGXI RADICAL CLIFF 2F1B 厶 # KANGXI RADICAL PRIVATE 2F1C 又 # KANGXI RADICAL AGAIN 2F1D 口 # KANGXI RADICAL MOUTH 2F1E 囗 # KANGXI RADICAL ENCLOSURE 2F1F 土 # KANGXI RADICAL EARTH 2F20 士 # KANGXI RADICAL SCHOLAR 2F21 夂 # KANGXI RADICAL GO 2F22 夊 # KANGXI RADICAL GO SLOWLY 2F23 夕 # KANGXI RADICAL EVENING 2F24 大 # KANGXI RADICAL BIG 2F25 女 # KANGXI RADICAL WOMAN 2F26 子 # KANGXI RADICAL CHILD 2F27 宀 # KANGXI RADICAL ROOF 2F28 寸 # KANGXI RADICAL INCH 2F29 小 # KANGXI RADICAL SMALL 2F2A 尢 # KANGXI RADICAL LAME 2F2B 尸 # KANGXI RADICAL CORPSE 2F2C 屮 # KANGXI RADICAL SPROUT 2F2D 山 # KANGXI RADICAL MOUNTAIN 2F2E 巛 # KANGXI RADICAL RIVER 2F2F 工 # KANGXI RADICAL WORK 2F30 己 # KANGXI RADICAL ONESELF 2F31 巾 # KANGXI RADICAL TURBAN 2F32 干 # KANGXI RADICAL DRY 2F33 幺 # KANGXI RADICAL SHORT THREAD 2F34 广 # KANGXI RADICAL DOTTED CLIFF 2F35 廴 # KANGXI RADICAL LONG STRIDE 2F36 廾 # KANGXI RADICAL TWO HANDS 2F37 弋 # KANGXI RADICAL SHOOT 2F38 弓 # KANGXI RADICAL BOW 2F39 彐 # KANGXI RADICAL SNOUT 2F3A 彡 # KANGXI RADICAL BRISTLE 2F3B 彳 # KANGXI RADICAL STEP 2F3C 心 # KANGXI RADICAL HEART 2F3D 戈 # KANGXI RADICAL HALBERD 2F3E 戶 # KANGXI RADICAL DOOR 2F3F 手 # KANGXI RADICAL HAND 2F40 支 # KANGXI RADICAL BRANCH 2F41 攴 # KANGXI RADICAL RAP 2F42 文 # KANGXI RADICAL SCRIPT 2F43 斗 # KANGXI RADICAL DIPPER 2F44 斤 # KANGXI RADICAL AXE 2F45 方 # KANGXI RADICAL SQUARE 2F46 无 # KANGXI RADICAL NOT 2F47 日 # KANGXI RADICAL SUN 2F48 曰 # KANGXI RADICAL SAY 2F49 月 # KANGXI RADICAL MOON 2F4A 木 # KANGXI RADICAL TREE 2F4B 欠 # KANGXI RADICAL LACK 2F4C 止 # KANGXI RADICAL STOP 2F4D 歹 # KANGXI RADICAL DEATH 2F4E 殳 # KANGXI RADICAL WEAPON 2F4F 毋 # KANGXI RADICAL DO NOT 2F50 比 # KANGXI RADICAL COMPARE 2F51 毛 # KANGXI RADICAL FUR 2F52 氏 # KANGXI RADICAL CLAN 2F53 气 # KANGXI RADICAL STEAM 2F54 水 # KANGXI RADICAL WATER 2F55 火 # KANGXI RADICAL FIRE 2F56 爪 # KANGXI RADICAL CLAW 2F57 父 # KANGXI RADICAL FATHER 2F58 爻 # KANGXI RADICAL DOUBLE X 2F59 爿 # KANGXI RADICAL HALF TREE TRUNK 2F5A 片 # KANGXI RADICAL SLICE 2F5B 牙 # KANGXI RADICAL FANG 2F5C 牛 # KANGXI RADICAL COW 2F5D 犬 # KANGXI RADICAL DOG 2F5E 玄 # KANGXI RADICAL PROFOUND 2F5F 玉 # KANGXI RADICAL JADE 2F60 瓜 # KANGXI RADICAL MELON 2F61 瓦 # KANGXI RADICAL TILE 2F62 甘 # KANGXI RADICAL SWEET 2F63 生 # KANGXI RADICAL LIFE 2F64 用 # KANGXI RADICAL USE 2F65 田 # KANGXI RADICAL FIELD 2F66 疋 # KANGXI RADICAL BOLT OF CLOTH 2F67 疒 # KANGXI RADICAL SICKNESS 2F68 癶 # KANGXI RADICAL DOTTED TENT 2F69 白 # KANGXI RADICAL WHITE 2F6A 皮 # KANGXI RADICAL SKIN 2F6B 皿 # KANGXI RADICAL DISH 2F6C 目 # KANGXI RADICAL EYE 2F6D 矛 # KANGXI RADICAL SPEAR 2F6E 矢 # KANGXI RADICAL ARROW 2F6F 石 # KANGXI RADICAL STONE 2F70 示 # KANGXI RADICAL SPIRIT 2F71 禸 # KANGXI RADICAL TRACK 2F72 禾 # KANGXI RADICAL GRAIN 2F73 穴 # KANGXI RADICAL CAVE 2F74 立 # KANGXI RADICAL STAND 2F75 竹 # KANGXI RADICAL BAMBOO 2F76 米 # KANGXI RADICAL RICE 2F77 糸 # KANGXI RADICAL SILK 2F78 缶 # KANGXI RADICAL JAR 2F79 网 # KANGXI RADICAL NET 2F7A 羊 # KANGXI RADICAL SHEEP 2F7B 羽 # KANGXI RADICAL FEATHER 2F7C 老 # KANGXI RADICAL OLD 2F7D 而 # KANGXI RADICAL AND 2F7E 耒 # KANGXI RADICAL PLOW 2F7F 耳 # KANGXI RADICAL EAR 2F80 聿 # KANGXI RADICAL BRUSH 2F81 肉 # KANGXI RADICAL MEAT 2F82 臣 # KANGXI RADICAL MINISTER 2F83 自 # KANGXI RADICAL SELF 2F84 至 # KANGXI RADICAL ARRIVE 2F85 臼 # KANGXI RADICAL MORTAR 2F86 舌 # KANGXI RADICAL TONGUE 2F87 舛 # KANGXI RADICAL OPPOSE 2F88 舟 # KANGXI RADICAL BOAT 2F89 艮 # KANGXI RADICAL STOPPING 2F8A 色 # KANGXI RADICAL COLOR 2F8B 艸 # KANGXI RADICAL GRASS 2F8C 虍 # KANGXI RADICAL TIGER 2F8D 虫 # KANGXI RADICAL INSECT 2F8E 血 # KANGXI RADICAL BLOOD 2F8F 行 # KANGXI RADICAL WALK ENCLOSURE 2F90 衣 # KANGXI RADICAL CLOTHES 2F91 襾 # KANGXI RADICAL WEST 2F92 見 # KANGXI RADICAL SEE 2F93 角 # KANGXI RADICAL HORN 2F94 言 # KANGXI RADICAL SPEECH 2F95 谷 # KANGXI RADICAL VALLEY 2F96 豆 # KANGXI RADICAL BEAN 2F97 豕 # KANGXI RADICAL PIG 2F98 豸 # KANGXI RADICAL BADGER 2F99 貝 # KANGXI RADICAL SHELL 2F9A 赤 # KANGXI RADICAL RED 2F9B 走 # KANGXI RADICAL RUN 2F9C 足 # KANGXI RADICAL FOOT 2F9D 身 # KANGXI RADICAL BODY 2F9E 車 # KANGXI RADICAL CART 2F9F 辛 # KANGXI RADICAL BITTER 2FA0 辰 # KANGXI RADICAL MORNING 2FA1 辵 # KANGXI RADICAL WALK 2FA2 邑 # KANGXI RADICAL CITY 2FA3 酉 # KANGXI RADICAL WINE 2FA4 釆 # KANGXI RADICAL DISTINGUISH 2FA5 里 # KANGXI RADICAL VILLAGE 2FA6 金 # KANGXI RADICAL GOLD 2FA7 長 # KANGXI RADICAL LONG 2FA8 門 # KANGXI RADICAL GATE 2FA9 阜 # KANGXI RADICAL MOUND 2FAA 隶 # KANGXI RADICAL SLAVE 2FAB 隹 # KANGXI RADICAL SHORT TAILED BIRD 2FAC 雨 # KANGXI RADICAL RAIN 2FAD 靑 # KANGXI RADICAL BLUE 2FAE 非 # KANGXI RADICAL WRONG 2FAF 面 # KANGXI RADICAL FACE 2FB0 革 # KANGXI RADICAL LEATHER 2FB1 韋 # KANGXI RADICAL TANNED LEATHER 2FB2 韭 # KANGXI RADICAL LEEK 2FB3 音 # KANGXI RADICAL SOUND 2FB4 頁 # KANGXI RADICAL LEAF 2FB5 風 # KANGXI RADICAL WIND 2FB6 飛 # KANGXI RADICAL FLY 2FB7 食 # KANGXI RADICAL EAT 2FB8 首 # KANGXI RADICAL HEAD 2FB9 香 # KANGXI RADICAL FRAGRANT 2FBA 馬 # KANGXI RADICAL HORSE 2FBB 骨 # KANGXI RADICAL BONE 2FBC 高 # KANGXI RADICAL TALL 2FBD 髟 # KANGXI RADICAL HAIR 2FBE 鬥 # KANGXI RADICAL FIGHT 2FBF 鬯 # KANGXI RADICAL SACRIFICIAL WINE 2FC0 鬲 # KANGXI RADICAL CAULDRON 2FC1 鬼 # KANGXI RADICAL GHOST 2FC2 魚 # KANGXI RADICAL FISH 2FC3 鳥 # KANGXI RADICAL BIRD 2FC4 鹵 # KANGXI RADICAL SALT 2FC5 鹿 # KANGXI RADICAL DEER 2FC6 麥 # KANGXI RADICAL WHEAT 2FC7 麻 # KANGXI RADICAL HEMP 2FC8 黃 # KANGXI RADICAL YELLOW 2FC9 黍 # KANGXI RADICAL MILLET 2FCA 黑 # KANGXI RADICAL BLACK 2FCB 黹 # KANGXI RADICAL EMBROIDERY 2FCC 黽 # KANGXI RADICAL FROG 2FCD 鼎 # KANGXI RADICAL TRIPOD 2FCE 鼓 # KANGXI RADICAL DRUM 2FCF 鼠 # KANGXI RADICAL RAT 2FD0 鼻 # KANGXI RADICAL NOSE 2FD1 齊 # KANGXI RADICAL EVEN 2FD2 齒 # KANGXI RADICAL TOOTH 2FD3 龍 # KANGXI RADICAL DRAGON 2FD4 龜 # KANGXI RADICAL TURTLE 2FD5 龠 # KANGXI RADICAL FLUTE 3000 # IDEOGRAPHIC SPACE 3036 〒 # CIRCLED POSTAL MARK 3038 十 # HANGZHOU NUMERAL TEN 3039 卄 # HANGZHOU NUMERAL TWENTY 303A 卅 # HANGZHOU NUMERAL THIRTY 3041 あ # HIRAGANA LETTER SMALL A 3043 い # HIRAGANA LETTER SMALL I 3045 う # HIRAGANA LETTER SMALL U 3047 え # HIRAGANA LETTER SMALL E 3049 お # HIRAGANA LETTER SMALL O 3063 つ # HIRAGANA LETTER SMALL TU 3083 や # HIRAGANA LETTER SMALL YA 3085 ゆ # HIRAGANA LETTER SMALL YU 3087 よ # HIRAGANA LETTER SMALL YO 308E わ # HIRAGANA LETTER SMALL WA 3095 か # HIRAGANA LETTER SMALL KA 3096 け # HIRAGANA LETTER SMALL KE 309B ゙ # KATAKANA-HIRAGANA VOICED SOUND MARK 309C ゚ # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK 30A0 = # KATAKANA-HIRAGANA DOUBLE HYPHEN 30A1 ア # KATAKANA LETTER SMALL A 30A3 イ # KATAKANA LETTER SMALL I 30A5 ウ # KATAKANA LETTER SMALL U 30A7 エ # KATAKANA LETTER SMALL E 30A9 オ # KATAKANA LETTER SMALL O 30C3 ツ # KATAKANA LETTER SMALL TU 30E3 ヤ # KATAKANA LETTER SMALL YA 30E5 ユ # KATAKANA LETTER SMALL YU 30E7 ヨ # KATAKANA LETTER SMALL YO 30EE ワ # KATAKANA LETTER SMALL WA 30F5 カ # KATAKANA LETTER SMALL KA 30F6 ケ # KATAKANA LETTER SMALL KE 3131 ᄀ # HANGUL LETTER KIYEOK 3132 ᄁ # HANGUL LETTER SSANGKIYEOK 3133 ᆪ # HANGUL LETTER KIYEOK-SIOS 3134 ᄂ # HANGUL LETTER NIEUN 3135 ᆬ # HANGUL LETTER NIEUN-CIEUC 3136 ᆭ # HANGUL LETTER NIEUN-HIEUH 3137 ᄃ # HANGUL LETTER TIKEUT 3138 ᄄ # HANGUL LETTER SSANGTIKEUT 3139 ᄅ # HANGUL LETTER RIEUL 313A ᆰ # HANGUL LETTER RIEUL-KIYEOK 313B ᆱ # HANGUL LETTER RIEUL-MIEUM 313C ᆲ # HANGUL LETTER RIEUL-PIEUP 313D ᆳ # HANGUL LETTER RIEUL-SIOS 313E ᆴ # HANGUL LETTER RIEUL-THIEUTH 313F ᆵ # HANGUL LETTER RIEUL-PHIEUPH 3140 ᄚ # HANGUL LETTER RIEUL-HIEUH 3141 ᄆ # HANGUL LETTER MIEUM 3142 ᄇ # HANGUL LETTER PIEUP 3143 ᄈ # HANGUL LETTER SSANGPIEUP 3144 ᄡ # HANGUL LETTER PIEUP-SIOS 3145 ᄉ # HANGUL LETTER SIOS 3146 ᄊ # HANGUL LETTER SSANGSIOS 3147 ᄋ # HANGUL LETTER IEUNG 3148 ᄌ # HANGUL LETTER CIEUC 3149 ᄍ # HANGUL LETTER SSANGCIEUC 314A ᄎ # HANGUL LETTER CHIEUCH 314B ᄏ # HANGUL LETTER KHIEUKH 314C ᄐ # HANGUL LETTER THIEUTH 314D ᄑ # HANGUL LETTER PHIEUPH 314E ᄒ # HANGUL LETTER HIEUH 314F ᅡ # HANGUL LETTER A 3150 ᅢ # HANGUL LETTER AE 3151 ᅣ # HANGUL LETTER YA 3152 ᅤ # HANGUL LETTER YAE 3153 ᅥ # HANGUL LETTER EO 3154 ᅦ # HANGUL LETTER E 3155 ᅧ # HANGUL LETTER YEO 3156 ᅨ # HANGUL LETTER YE 3157 ᅩ # HANGUL LETTER O 3158 ᅪ # HANGUL LETTER WA 3159 ᅫ # HANGUL LETTER WAE 315A ᅬ # HANGUL LETTER OE 315B ᅭ # HANGUL LETTER YO 315C ᅮ # HANGUL LETTER U 315D ᅯ # HANGUL LETTER WEO 315E ᅰ # HANGUL LETTER WE 315F ᅱ # HANGUL LETTER WI 3160 ᅲ # HANGUL LETTER YU 3161 ᅳ # HANGUL LETTER EU 3162 ᅴ # HANGUL LETTER YI 3163 ᅵ # HANGUL LETTER I 3164 ᅠ # HANGUL FILLER 3165 ᄔ # HANGUL LETTER SSANGNIEUN 3166 ᄕ # HANGUL LETTER NIEUN-TIKEUT 3167 ᇇ # HANGUL LETTER NIEUN-SIOS 3168 ᇈ # HANGUL LETTER NIEUN-PANSIOS 3169 ᇌ # HANGUL LETTER RIEUL-KIYEOK-SIOS 316A ᇎ # HANGUL LETTER RIEUL-TIKEUT 316B ᇓ # HANGUL LETTER RIEUL-PIEUP-SIOS 316C ᇗ # HANGUL LETTER RIEUL-PANSIOS 316D ᇙ # HANGUL LETTER RIEUL-YEORINHIEUH 316E ᄜ # HANGUL LETTER MIEUM-PIEUP 316F ᇝ # HANGUL LETTER MIEUM-SIOS 3170 ᇟ # HANGUL LETTER MIEUM-PANSIOS 3171 ᄝ # HANGUL LETTER KAPYEOUNMIEUM 3172 ᄞ # HANGUL LETTER PIEUP-KIYEOK 3173 ᄠ # HANGUL LETTER PIEUP-TIKEUT 3174 ᄢ # HANGUL LETTER PIEUP-SIOS-KIYEOK 3175 ᄣ # HANGUL LETTER PIEUP-SIOS-TIKEUT 3176 ᄧ # HANGUL LETTER PIEUP-CIEUC 3177 ᄩ # HANGUL LETTER PIEUP-THIEUTH 3178 ᄫ # HANGUL LETTER KAPYEOUNPIEUP 3179 ᄬ # HANGUL LETTER KAPYEOUNSSANGPIEUP 317A ᄭ # HANGUL LETTER SIOS-KIYEOK 317B ᄮ # HANGUL LETTER SIOS-NIEUN 317C ᄯ # HANGUL LETTER SIOS-TIKEUT 317D ᄲ # HANGUL LETTER SIOS-PIEUP 317E ᄶ # HANGUL LETTER SIOS-CIEUC 317F ᅀ # HANGUL LETTER PANSIOS 3180 ᅇ # HANGUL LETTER SSANGIEUNG 3181 ᅌ # HANGUL LETTER YESIEUNG 3182 ᇱ # HANGUL LETTER YESIEUNG-SIOS 3183 ᇲ # HANGUL LETTER YESIEUNG-PANSIOS 3184 ᅗ # HANGUL LETTER KAPYEOUNPHIEUPH 3185 ᅘ # HANGUL LETTER SSANGHIEUH 3186 ᅙ # HANGUL LETTER YEORINHIEUH 3187 ᆄ # HANGUL LETTER YO-YA 3188 ᆅ # HANGUL LETTER YO-YAE 3189 ᆈ # HANGUL LETTER YO-I 318A ᆑ # HANGUL LETTER YU-YEO 318B ᆒ # HANGUL LETTER YU-YE 318C ᆔ # HANGUL LETTER YU-I 318D ᆞ # HANGUL LETTER ARAEA 318E ᆡ # HANGUL LETTER ARAEAE 31F0 ク # KATAKANA LETTER SMALL KU 31F1 シ # KATAKANA LETTER SMALL SI 31F2 ス # KATAKANA LETTER SMALL SU 31F3 ト # KATAKANA LETTER SMALL TO 31F4 ヌ # KATAKANA LETTER SMALL NU 31F5 ハ # KATAKANA LETTER SMALL HA 31F6 ヒ # KATAKANA LETTER SMALL HI 31F7 フ # KATAKANA LETTER SMALL HU 31F8 ヘ # KATAKANA LETTER SMALL HE 31F9 ホ # KATAKANA LETTER SMALL HO 31FA ム # KATAKANA LETTER SMALL MU 31FB ラ # KATAKANA LETTER SMALL RA 31FC リ # KATAKANA LETTER SMALL RI 31FD ル # KATAKANA LETTER SMALL RU 31FE レ # KATAKANA LETTER SMALL RE 31FF ロ # KATAKANA LETTER SMALL RO 3200 (ᄀ) # PARENTHESIZED HANGUL KIYEOK 3201 (ᄂ) # PARENTHESIZED HANGUL NIEUN 3202 (ᄃ) # PARENTHESIZED HANGUL TIKEUT 3203 (ᄅ) # PARENTHESIZED HANGUL RIEUL 3204 (ᄆ) # PARENTHESIZED HANGUL MIEUM 3205 (ᄇ) # PARENTHESIZED HANGUL PIEUP 3206 (ᄉ) # PARENTHESIZED HANGUL SIOS 3207 (ᄋ) # PARENTHESIZED HANGUL IEUNG 3208 (ᄌ) # PARENTHESIZED HANGUL CIEUC 3209 (ᄎ) # PARENTHESIZED HANGUL CHIEUCH 320A (ᄏ) # PARENTHESIZED HANGUL KHIEUKH 320B (ᄐ) # PARENTHESIZED HANGUL THIEUTH 320C (ᄑ) # PARENTHESIZED HANGUL PHIEUPH 320D (ᄒ) # PARENTHESIZED HANGUL HIEUH 320E (가) # PARENTHESIZED HANGUL KIYEOK A 320F (나) # PARENTHESIZED HANGUL NIEUN A 3210 (다) # PARENTHESIZED HANGUL TIKEUT A 3211 (라) # PARENTHESIZED HANGUL RIEUL A 3212 (마) # PARENTHESIZED HANGUL MIEUM A 3213 (바) # PARENTHESIZED HANGUL PIEUP A 3214 (사) # PARENTHESIZED HANGUL SIOS A 3215 (아) # PARENTHESIZED HANGUL IEUNG A 3216 (자) # PARENTHESIZED HANGUL CIEUC A 3217 (차) # PARENTHESIZED HANGUL CHIEUCH A 3218 (카) # PARENTHESIZED HANGUL KHIEUKH A 3219 (타) # PARENTHESIZED HANGUL THIEUTH A 321A (파) # PARENTHESIZED HANGUL PHIEUPH A 321B (하) # PARENTHESIZED HANGUL HIEUH A 321C (주) # PARENTHESIZED HANGUL CIEUC U 321D (오전) # PARENTHESIZED KOREAN CHARACTER OJEON 321E (오후) # PARENTHESIZED KOREAN CHARACTER O HU 3220 (一) # PARENTHESIZED IDEOGRAPH ONE 3221 (二) # PARENTHESIZED IDEOGRAPH TWO 3222 (三) # PARENTHESIZED IDEOGRAPH THREE 3223 (四) # PARENTHESIZED IDEOGRAPH FOUR 3224 (五) # PARENTHESIZED IDEOGRAPH FIVE 3225 (六) # PARENTHESIZED IDEOGRAPH SIX 3226 (七) # PARENTHESIZED IDEOGRAPH SEVEN 3227 (八) # PARENTHESIZED IDEOGRAPH EIGHT 3228 (九) # PARENTHESIZED IDEOGRAPH NINE 3229 (十) # PARENTHESIZED IDEOGRAPH TEN 322A (月) # PARENTHESIZED IDEOGRAPH MOON 322B (火) # PARENTHESIZED IDEOGRAPH FIRE 322C (水) # PARENTHESIZED IDEOGRAPH WATER 322D (木) # PARENTHESIZED IDEOGRAPH WOOD 322E (金) # PARENTHESIZED IDEOGRAPH METAL 322F (土) # PARENTHESIZED IDEOGRAPH EARTH 3230 (日) # PARENTHESIZED IDEOGRAPH SUN 3231 (株) # PARENTHESIZED IDEOGRAPH STOCK 3232 (有) # PARENTHESIZED IDEOGRAPH HAVE 3233 (社) # PARENTHESIZED IDEOGRAPH SOCIETY 3234 (名) # PARENTHESIZED IDEOGRAPH NAME 3235 (特) # PARENTHESIZED IDEOGRAPH SPECIAL 3236 (財) # PARENTHESIZED IDEOGRAPH FINANCIAL 3237 (祝) # PARENTHESIZED IDEOGRAPH CONGRATULATION 3238 (労) # PARENTHESIZED IDEOGRAPH LABOR 3239 (代) # PARENTHESIZED IDEOGRAPH REPRESENT 323A (呼) # PARENTHESIZED IDEOGRAPH CALL 323B (学) # PARENTHESIZED IDEOGRAPH STUDY 323C (監) # PARENTHESIZED IDEOGRAPH SUPERVISE 323D (企) # PARENTHESIZED IDEOGRAPH ENTERPRISE 323E (資) # PARENTHESIZED IDEOGRAPH RESOURCE 323F (協) # PARENTHESIZED IDEOGRAPH ALLIANCE 3240 (祭) # PARENTHESIZED IDEOGRAPH FESTIVAL 3241 (休) # PARENTHESIZED IDEOGRAPH REST 3242 (自) # PARENTHESIZED IDEOGRAPH SELF 3243 (至) # PARENTHESIZED IDEOGRAPH REACH 3250 PTE # PARTNERSHIP SIGN 3251 (21) # CIRCLED NUMBER TWENTY ONE 3252 (22) # CIRCLED NUMBER TWENTY TWO 3253 (23) # CIRCLED NUMBER TWENTY THREE 3254 (24) # CIRCLED NUMBER TWENTY FOUR 3255 (25) # CIRCLED NUMBER TWENTY FIVE 3256 (26) # CIRCLED NUMBER TWENTY SIX 3257 (27) # CIRCLED NUMBER TWENTY SEVEN 3258 (28) # CIRCLED NUMBER TWENTY EIGHT 3259 (29) # CIRCLED NUMBER TWENTY NINE 325A (30) # CIRCLED NUMBER THIRTY 325B (31) # CIRCLED NUMBER THIRTY ONE 325C (32) # CIRCLED NUMBER THIRTY TWO 325D (33) # CIRCLED NUMBER THIRTY THREE 325E (34) # CIRCLED NUMBER THIRTY FOUR 325F (35) # CIRCLED NUMBER THIRTY FIVE 3260 (ᄀ) # CIRCLED HANGUL KIYEOK 3261 (ᄂ) # CIRCLED HANGUL NIEUN 3262 (ᄃ) # CIRCLED HANGUL TIKEUT 3263 (ᄅ) # CIRCLED HANGUL RIEUL 3264 (ᄆ) # CIRCLED HANGUL MIEUM 3265 (ᄇ) # CIRCLED HANGUL PIEUP 3266 (ᄉ) # CIRCLED HANGUL SIOS 3267 (ᄋ) # CIRCLED HANGUL IEUNG 3268 (ᄌ) # CIRCLED HANGUL CIEUC 3269 (ᄎ) # CIRCLED HANGUL CHIEUCH 326A (ᄏ) # CIRCLED HANGUL KHIEUKH 326B (ᄐ) # CIRCLED HANGUL THIEUTH 326C (ᄑ) # CIRCLED HANGUL PHIEUPH 326D (ᄒ) # CIRCLED HANGUL HIEUH 326E (가) # CIRCLED HANGUL KIYEOK A 326F (나) # CIRCLED HANGUL NIEUN A 3270 (다) # CIRCLED HANGUL TIKEUT A 3271 (라) # CIRCLED HANGUL RIEUL A 3272 (마) # CIRCLED HANGUL MIEUM A 3273 (바) # CIRCLED HANGUL PIEUP A 3274 (사) # CIRCLED HANGUL SIOS A 3275 (아) # CIRCLED HANGUL IEUNG A 3276 (자) # CIRCLED HANGUL CIEUC A 3277 (차) # CIRCLED HANGUL CHIEUCH A 3278 (카) # CIRCLED HANGUL KHIEUKH A 3279 (타) # CIRCLED HANGUL THIEUTH A 327A (파) # CIRCLED HANGUL PHIEUPH A 327B (하) # CIRCLED HANGUL HIEUH A 327C (참고) # CIRCLED KOREAN CHARACTER CHAMKO 327D (주의) # CIRCLED KOREAN CHARACTER JUEUI 3280 (一) # CIRCLED IDEOGRAPH ONE 3281 (二) # CIRCLED IDEOGRAPH TWO 3282 (三) # CIRCLED IDEOGRAPH THREE 3283 (四) # CIRCLED IDEOGRAPH FOUR 3284 (五) # CIRCLED IDEOGRAPH FIVE 3285 (六) # CIRCLED IDEOGRAPH SIX 3286 (七) # CIRCLED IDEOGRAPH SEVEN 3287 (八) # CIRCLED IDEOGRAPH EIGHT 3288 (九) # CIRCLED IDEOGRAPH NINE 3289 (十) # CIRCLED IDEOGRAPH TEN 328A (月) # CIRCLED IDEOGRAPH MOON 328B (火) # CIRCLED IDEOGRAPH FIRE 328C (水) # CIRCLED IDEOGRAPH WATER 328D (木) # CIRCLED IDEOGRAPH WOOD 328E (金) # CIRCLED IDEOGRAPH METAL 328F (土) # CIRCLED IDEOGRAPH EARTH 3290 (日) # CIRCLED IDEOGRAPH SUN 3291 (株) # CIRCLED IDEOGRAPH STOCK 3292 (有) # CIRCLED IDEOGRAPH HAVE 3293 (社) # CIRCLED IDEOGRAPH SOCIETY 3294 (名) # CIRCLED IDEOGRAPH NAME 3295 (特) # CIRCLED IDEOGRAPH SPECIAL 3296 (財) # CIRCLED IDEOGRAPH FINANCIAL 3297 (祝) # CIRCLED IDEOGRAPH CONGRATULATION 3298 (労) # CIRCLED IDEOGRAPH LABOR 3299 (秘) # CIRCLED IDEOGRAPH SECRET 329A (男) # CIRCLED IDEOGRAPH MALE 329B (女) # CIRCLED IDEOGRAPH FEMALE 329C (適) # CIRCLED IDEOGRAPH SUITABLE 329D (優) # CIRCLED IDEOGRAPH EXCELLENT 329E (印) # CIRCLED IDEOGRAPH PRINT 329F (注) # CIRCLED IDEOGRAPH ATTENTION 32A0 (項) # CIRCLED IDEOGRAPH ITEM 32A1 (休) # CIRCLED IDEOGRAPH REST 32A2 (写) # CIRCLED IDEOGRAPH COPY 32A3 (正) # CIRCLED IDEOGRAPH CORRECT 32A4 (上) # CIRCLED IDEOGRAPH HIGH 32A5 (中) # CIRCLED IDEOGRAPH CENTRE 32A6 (下) # CIRCLED IDEOGRAPH LOW 32A7 (左) # CIRCLED IDEOGRAPH LEFT 32A8 (右) # CIRCLED IDEOGRAPH RIGHT 32A9 (医) # CIRCLED IDEOGRAPH MEDICINE 32AA (宗) # CIRCLED IDEOGRAPH RELIGION 32AB (学) # CIRCLED IDEOGRAPH STUDY 32AC (監) # CIRCLED IDEOGRAPH SUPERVISE 32AD (企) # CIRCLED IDEOGRAPH ENTERPRISE 32AE (資) # CIRCLED IDEOGRAPH RESOURCE 32AF (協) # CIRCLED IDEOGRAPH ALLIANCE 32B0 (夜) # CIRCLED IDEOGRAPH NIGHT 32B1 (36) # CIRCLED NUMBER THIRTY SIX 32B2 (37) # CIRCLED NUMBER THIRTY SEVEN 32B3 (38) # CIRCLED NUMBER THIRTY EIGHT 32B4 (39) # CIRCLED NUMBER THIRTY NINE 32B5 (40) # CIRCLED NUMBER FORTY 32B6 (41) # CIRCLED NUMBER FORTY ONE 32B7 (42) # CIRCLED NUMBER FORTY TWO 32B8 (43) # CIRCLED NUMBER FORTY THREE 32B9 (44) # CIRCLED NUMBER FORTY FOUR 32BA (45) # CIRCLED NUMBER FORTY FIVE 32BB (46) # CIRCLED NUMBER FORTY SIX 32BC (47) # CIRCLED NUMBER FORTY SEVEN 32BD (48) # CIRCLED NUMBER FORTY EIGHT 32BE (49) # CIRCLED NUMBER FORTY NINE 32BF (50) # CIRCLED NUMBER FIFTY 32C0 1月 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY 32C1 2月 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY 32C2 3月 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH 32C3 4月 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL 32C4 5月 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY 32C5 6月 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE 32C6 7月 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY 32C7 8月 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST 32C8 9月 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER 32C9 10月 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER 32CA 11月 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER 32CB 12月 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER 32CC Hg # SQUARE HG 32CD erg # SQUARE ERG 32CE eV # SQUARE EV 32CF LTD # LIMITED LIABILITY SIGN 32D0 (ア) # CIRCLED KATAKANA A 32D1 (イ) # CIRCLED KATAKANA I 32D2 (ウ) # CIRCLED KATAKANA U 32D3 (エ) # CIRCLED KATAKANA E 32D4 (オ) # CIRCLED KATAKANA O 32D5 (カ) # CIRCLED KATAKANA KA 32D6 (キ) # CIRCLED KATAKANA KI 32D7 (ク) # CIRCLED KATAKANA KU 32D8 (ケ) # CIRCLED KATAKANA KE 32D9 (コ) # CIRCLED KATAKANA KO 32DA (サ) # CIRCLED KATAKANA SA 32DB (シ) # CIRCLED KATAKANA SI 32DC (ス) # CIRCLED KATAKANA SU 32DD (セ) # CIRCLED KATAKANA SE 32DE (ソ) # CIRCLED KATAKANA SO 32DF (タ) # CIRCLED KATAKANA TA 32E0 (チ) # CIRCLED KATAKANA TI 32E1 (ツ) # CIRCLED KATAKANA TU 32E2 (テ) # CIRCLED KATAKANA TE 32E3 (ト) # CIRCLED KATAKANA TO 32E4 (ナ) # CIRCLED KATAKANA NA 32E5 (ニ) # CIRCLED KATAKANA NI 32E6 (ヌ) # CIRCLED KATAKANA NU 32E7 (ネ) # CIRCLED KATAKANA NE 32E8 (ノ) # CIRCLED KATAKANA NO 32E9 (ハ) # CIRCLED KATAKANA HA 32EA (ヒ) # CIRCLED KATAKANA HI 32EB (フ) # CIRCLED KATAKANA HU 32EC (ヘ) # CIRCLED KATAKANA HE 32ED (ホ) # CIRCLED KATAKANA HO 32EE (マ) # CIRCLED KATAKANA MA 32EF (ミ) # CIRCLED KATAKANA MI 32F0 (ム) # CIRCLED KATAKANA MU 32F1 (メ) # CIRCLED KATAKANA ME 32F2 (モ) # CIRCLED KATAKANA MO 32F3 (ヤ) # CIRCLED KATAKANA YA 32F4 (ユ) # CIRCLED KATAKANA YU 32F5 (ヨ) # CIRCLED KATAKANA YO 32F6 (ラ) # CIRCLED KATAKANA RA 32F7 (リ) # CIRCLED KATAKANA RI 32F8 (ル) # CIRCLED KATAKANA RU 32F9 (レ) # CIRCLED KATAKANA RE 32FA (ロ) # CIRCLED KATAKANA RO 32FB (ワ) # CIRCLED KATAKANA WA 32FC (ヰ) # CIRCLED KATAKANA WI 32FD (ヱ) # CIRCLED KATAKANA WE 32FE (ヲ) # CIRCLED KATAKANA WO 3300 アパート # SQUARE APAATO 3301 アルファ # SQUARE ARUHUA 3302 アンペア # SQUARE ANPEA 3303 アール # SQUARE AARU 3304 イニング # SQUARE ININGU 3305 インチ # SQUARE INTI 3306 ウォン # SQUARE UON 3307 エスクード # SQUARE ESUKUUDO 3308 エーカー # SQUARE EEKAA 3309 オンス # SQUARE ONSU 330A オーム # SQUARE OOMU 330B カイリ # SQUARE KAIRI 330C カラット # SQUARE KARATTO 330D カロリー # SQUARE KARORII 330E ガロン # SQUARE GARON 330F ガンマ # SQUARE GANMA 3310 ギガ # SQUARE GIGA 3311 ギニー # SQUARE GINII 3312 キュリー # SQUARE KYURII 3313 ギルダー # SQUARE GIRUDAA 3314 キロ # SQUARE KIRO 3315 キログラム # SQUARE KIROGURAMU 3316 キロメートル # SQUARE KIROMEETORU 3317 キロワット # SQUARE KIROWATTO 3318 グラム # SQUARE GURAMU 3319 グラムトン # SQUARE GURAMUTON 331A クルゼイロ # SQUARE KURUZEIRO 331B クローネ # SQUARE KUROONE 331C ケース # SQUARE KEESU 331D コルナ # SQUARE KORUNA 331E コーポ # SQUARE KOOPO 331F サイクル # SQUARE SAIKURU 3320 サンチーム # SQUARE SANTIIMU 3321 シリング # SQUARE SIRINGU 3322 センチ # SQUARE SENTI 3323 セント # SQUARE SENTO 3324 ダース # SQUARE DAASU 3325 デシ # SQUARE DESI 3326 ドル # SQUARE DORU 3327 トン # SQUARE TON 3328 ナノ # SQUARE NANO 3329 ノット # SQUARE NOTTO 332A ハイツ # SQUARE HAITU 332B パーセント # SQUARE PAASENTO 332C パーツ # SQUARE PAATU 332D バーレル # SQUARE BAARERU 332E ピアストル # SQUARE PIASUTORU 332F ピクル # SQUARE PIKURU 3330 ピコ # SQUARE PIKO 3331 ビル # SQUARE BIRU 3332 ファラッド # SQUARE HUARADDO 3333 フィート # SQUARE HUIITO 3334 ブッシェル # SQUARE BUSSYERU 3335 フラン # SQUARE HURAN 3336 ヘクタール # SQUARE HEKUTAARU 3337 ペソ # SQUARE PESO 3338 ペニヒ # SQUARE PENIHI 3339 ヘルツ # SQUARE HERUTU 333A ペンス # SQUARE PENSU 333B ページ # SQUARE PEEZI 333C ベータ # SQUARE BEETA 333D ポイント # SQUARE POINTO 333E ボルト # SQUARE BORUTO 333F ホン # SQUARE HON 3340 ポンド # SQUARE PONDO 3341 ホール # SQUARE HOORU 3342 ホーン # SQUARE HOON 3343 マイクロ # SQUARE MAIKURO 3344 マイル # SQUARE MAIRU 3345 マッハ # SQUARE MAHHA 3346 マルク # SQUARE MARUKU 3347 マンション # SQUARE MANSYON 3348 ミクロン # SQUARE MIKURON 3349 ミリ # SQUARE MIRI 334A ミリバール # SQUARE MIRIBAARU 334B メガ # SQUARE MEGA 334C メガトン # SQUARE MEGATON 334D メートル # SQUARE MEETORU 334E ヤード # SQUARE YAADO 334F ヤール # SQUARE YAARU 3350 ユアン # SQUARE YUAN 3351 リットル # SQUARE RITTORU 3352 リラ # SQUARE RIRA 3353 ルピー # SQUARE RUPII 3354 ルーブル # SQUARE RUUBURU 3355 レム # SQUARE REMU 3356 レントゲン # SQUARE RENTOGEN 3357 ワット # SQUARE WATTO 3358 0点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO 3359 1点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE 335A 2点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO 335B 3点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE 335C 4点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR 335D 5点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE 335E 6点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX 335F 7点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN 3360 8点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT 3361 9点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE 3362 10点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN 3363 11点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN 3364 12点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE 3365 13点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN 3366 14点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN 3367 15点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN 3368 16点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN 3369 17点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN 336A 18点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN 336B 19点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN 336C 20点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY 336D 21点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE 336E 22点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO 336F 23点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE 3370 24点 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR 3371 hPa # SQUARE HPA 3372 da # SQUARE DA 3373 AU # SQUARE AU 3374 bar # SQUARE BAR 3375 oV # SQUARE OV 3376 pc # SQUARE PC 3377 dm # SQUARE DM 3378 dm^2 # SQUARE DM SQUARED 3379 dm^3 # SQUARE DM CUBED 337A IU # SQUARE IU 337B 平成 # SQUARE ERA NAME HEISEI 337C 昭和 # SQUARE ERA NAME SYOUWA 337D 大正 # SQUARE ERA NAME TAISYOU 337E 明治 # SQUARE ERA NAME MEIZI 337F 株式会社 # SQUARE CORPORATION 3380 pA # SQUARE PA AMPS 3381 nA # SQUARE NA 3382 μA # SQUARE MU A 3383 mA # SQUARE MA 3384 kA # SQUARE KA 3385 KB # SQUARE KB 3386 MB # SQUARE MB 3387 GB # SQUARE GB 3388 cal # SQUARE CAL 3389 kcal # SQUARE KCAL 338A pF # SQUARE PF 338B nF # SQUARE NF 338C μF # SQUARE MU F 338D μg # SQUARE MU G 338E mg # SQUARE MG 338F kg # SQUARE KG 3390 Hz # SQUARE HZ 3391 kHz # SQUARE KHZ 3392 MHz # SQUARE MHZ 3393 GHz # SQUARE GHZ 3394 THz # SQUARE THZ 3395 μl # SQUARE MU L 3396 ml # SQUARE ML 3397 dl # SQUARE DL 3398 kl # SQUARE KL 3399 fm # SQUARE FM 339A nm # SQUARE NM 339B μm # SQUARE MU M 339C mm # SQUARE MM 339D cm # SQUARE CM 339E km # SQUARE KM 339F mm^2 # SQUARE MM SQUARED 33A0 cm^2 # SQUARE CM SQUARED 33A1 m^2 # SQUARE M SQUARED 33A2 km^2 # SQUARE KM SQUARED 33A3 mm^3 # SQUARE MM CUBED 33A4 cm^3 # SQUARE CM CUBED 33A5 m^3 # SQUARE M CUBED 33A6 km^3 # SQUARE KM CUBED 33A7 m/s # SQUARE M OVER S 33A8 m/s^2 # SQUARE M OVER S SQUARED 33A9 Pa # SQUARE PA 33AA kPa # SQUARE KPA 33AB MPa # SQUARE MPA 33AC GPa # SQUARE GPA 33AD rad # SQUARE RAD 33AE rad/s # SQUARE RAD OVER S 33AF rad/s^2 # SQUARE RAD OVER S SQUARED 33B0 ps # SQUARE PS 33B1 ns # SQUARE NS 33B2 μs # SQUARE MU S 33B3 ms # SQUARE MS 33B4 pV # SQUARE PV 33B5 nV # SQUARE NV 33B6 μV # SQUARE MU V 33B7 mV # SQUARE MV 33B8 kV # SQUARE KV 33B9 MV # SQUARE MV MEGA 33BA pW # SQUARE PW 33BB nW # SQUARE NW 33BC μW # SQUARE MU W 33BD mW # SQUARE MW 33BE kW # SQUARE KW 33BF MW # SQUARE MW MEGA 33C0 kΩ # SQUARE K OHM 33C1 MΩ # SQUARE M OHM 33C2 a.m. # SQUARE AM 33C3 Bq # SQUARE BQ 33C4 cc # SQUARE CC 33C5 cd # SQUARE CD 33C6 C/kg # SQUARE C OVER KG 33C7 Co. # SQUARE CO 33C8 dB # SQUARE DB 33C9 Gy # SQUARE GY 33CA ha # SQUARE HA 33CB HP # SQUARE HP 33CC in # SQUARE IN 33CD KK # SQUARE KK 33CE KM # SQUARE KM CAPITAL 33CF kt # SQUARE KT 33D0 lm # SQUARE LM 33D1 ln # SQUARE LN 33D2 log # SQUARE LOG 33D3 lx # SQUARE LX 33D4 mb # SQUARE MB SMALL 33D5 mil # SQUARE MIL 33D6 mol # SQUARE MOL 33D7 PH # SQUARE PH 33D8 p.m. # SQUARE PM 33D9 PPM # SQUARE PPM 33DA PR # SQUARE PR 33DB sr # SQUARE SR 33DC Sv # SQUARE SV 33DD Wb # SQUARE WB 33DE V/m # SQUARE V OVER M 33DF A/m # SQUARE A OVER M 33FF gal # SQUARE GAL 33E0 1日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE 33E1 2日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO 33E2 3日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE 33E3 4日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR 33E4 5日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE 33E5 6日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX 33E6 7日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN 33E7 8日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT 33E8 9日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE 33E9 10日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN 33EA 11日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN 33EB 12日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE 33EC 13日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN 33ED 14日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN 33EE 15日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN 33EF 16日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN 33F0 17日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN 33F1 18日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN 33F2 19日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN 33F3 20日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY 33F4 21日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE 33F5 22日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO 33F6 23日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE 33F7 24日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR 33F8 25日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE 33F9 26日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX 33FA 27日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN 33FB 28日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT 33FC 29日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE 33FD 30日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY 33FE 31日 # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE F900 豈 # CJK COMPATIBILITY IDEOGRAPH-F900 F901 更 # CJK COMPATIBILITY IDEOGRAPH-F901 F902 車 # CJK COMPATIBILITY IDEOGRAPH-F902 F903 賈 # CJK COMPATIBILITY IDEOGRAPH-F903 F904 滑 # CJK COMPATIBILITY IDEOGRAPH-F904 F905 串 # CJK COMPATIBILITY IDEOGRAPH-F905 F906 句 # CJK COMPATIBILITY IDEOGRAPH-F906 F907 龜 # CJK COMPATIBILITY IDEOGRAPH-F907 F908 龜 # CJK COMPATIBILITY IDEOGRAPH-F908 F909 契 # CJK COMPATIBILITY IDEOGRAPH-F909 F90A 金 # CJK COMPATIBILITY IDEOGRAPH-F90A F90B 喇 # CJK COMPATIBILITY IDEOGRAPH-F90B F90C 奈 # CJK COMPATIBILITY IDEOGRAPH-F90C F90D 懶 # CJK COMPATIBILITY IDEOGRAPH-F90D F90E 癩 # CJK COMPATIBILITY IDEOGRAPH-F90E F90F 羅 # CJK COMPATIBILITY IDEOGRAPH-F90F F910 蘿 # CJK COMPATIBILITY IDEOGRAPH-F910 F911 螺 # CJK COMPATIBILITY IDEOGRAPH-F911 F912 裸 # CJK COMPATIBILITY IDEOGRAPH-F912 F913 邏 # CJK COMPATIBILITY IDEOGRAPH-F913 F914 樂 # CJK COMPATIBILITY IDEOGRAPH-F914 F915 洛 # CJK COMPATIBILITY IDEOGRAPH-F915 F916 烙 # CJK COMPATIBILITY IDEOGRAPH-F916 F917 珞 # CJK COMPATIBILITY IDEOGRAPH-F917 F918 落 # CJK COMPATIBILITY IDEOGRAPH-F918 F919 酪 # CJK COMPATIBILITY IDEOGRAPH-F919 F91A 駱 # CJK COMPATIBILITY IDEOGRAPH-F91A F91B 亂 # CJK COMPATIBILITY IDEOGRAPH-F91B F91C 卵 # CJK COMPATIBILITY IDEOGRAPH-F91C F91D 欄 # CJK COMPATIBILITY IDEOGRAPH-F91D F91E 爛 # CJK COMPATIBILITY IDEOGRAPH-F91E F91F 蘭 # CJK COMPATIBILITY IDEOGRAPH-F91F F920 鸞 # CJK COMPATIBILITY IDEOGRAPH-F920 F921 嵐 # CJK COMPATIBILITY IDEOGRAPH-F921 F922 濫 # CJK COMPATIBILITY IDEOGRAPH-F922 F923 藍 # CJK COMPATIBILITY IDEOGRAPH-F923 F924 襤 # CJK COMPATIBILITY IDEOGRAPH-F924 F925 拉 # CJK COMPATIBILITY IDEOGRAPH-F925 F926 臘 # CJK COMPATIBILITY IDEOGRAPH-F926 F927 蠟 # CJK COMPATIBILITY IDEOGRAPH-F927 F928 廊 # CJK COMPATIBILITY IDEOGRAPH-F928 F929 朗 # CJK COMPATIBILITY IDEOGRAPH-F929 F92A 浪 # CJK COMPATIBILITY IDEOGRAPH-F92A F92B 狼 # CJK COMPATIBILITY IDEOGRAPH-F92B F92C 郎 # CJK COMPATIBILITY IDEOGRAPH-F92C F92D 來 # CJK COMPATIBILITY IDEOGRAPH-F92D F92E 冷 # CJK COMPATIBILITY IDEOGRAPH-F92E F92F 勞 # CJK COMPATIBILITY IDEOGRAPH-F92F F930 擄 # CJK COMPATIBILITY IDEOGRAPH-F930 F931 櫓 # CJK COMPATIBILITY IDEOGRAPH-F931 F932 爐 # CJK COMPATIBILITY IDEOGRAPH-F932 F933 盧 # CJK COMPATIBILITY IDEOGRAPH-F933 F934 老 # CJK COMPATIBILITY IDEOGRAPH-F934 F935 蘆 # CJK COMPATIBILITY IDEOGRAPH-F935 F936 虜 # CJK COMPATIBILITY IDEOGRAPH-F936 F937 路 # CJK COMPATIBILITY IDEOGRAPH-F937 F938 露 # CJK COMPATIBILITY IDEOGRAPH-F938 F939 魯 # CJK COMPATIBILITY IDEOGRAPH-F939 F93A 鷺 # CJK COMPATIBILITY IDEOGRAPH-F93A F93B 碌 # CJK COMPATIBILITY IDEOGRAPH-F93B F93C 祿 # CJK COMPATIBILITY IDEOGRAPH-F93C F93D 綠 # CJK COMPATIBILITY IDEOGRAPH-F93D F93E 菉 # CJK COMPATIBILITY IDEOGRAPH-F93E F93F 錄 # CJK COMPATIBILITY IDEOGRAPH-F93F F940 鹿 # CJK COMPATIBILITY IDEOGRAPH-F940 F941 論 # CJK COMPATIBILITY IDEOGRAPH-F941 F942 壟 # CJK COMPATIBILITY IDEOGRAPH-F942 F943 弄 # CJK COMPATIBILITY IDEOGRAPH-F943 F944 籠 # CJK COMPATIBILITY IDEOGRAPH-F944 F945 聾 # CJK COMPATIBILITY IDEOGRAPH-F945 F946 牢 # CJK COMPATIBILITY IDEOGRAPH-F946 F947 磊 # CJK COMPATIBILITY IDEOGRAPH-F947 F948 賂 # CJK COMPATIBILITY IDEOGRAPH-F948 F949 雷 # CJK COMPATIBILITY IDEOGRAPH-F949 F94A 壘 # CJK COMPATIBILITY IDEOGRAPH-F94A F94B 屢 # CJK COMPATIBILITY IDEOGRAPH-F94B F94C 樓 # CJK COMPATIBILITY IDEOGRAPH-F94C F94D 淚 # CJK COMPATIBILITY IDEOGRAPH-F94D F94E 漏 # CJK COMPATIBILITY IDEOGRAPH-F94E F94F 累 # CJK COMPATIBILITY IDEOGRAPH-F94F F950 縷 # CJK COMPATIBILITY IDEOGRAPH-F950 F951 陋 # CJK COMPATIBILITY IDEOGRAPH-F951 F952 勒 # CJK COMPATIBILITY IDEOGRAPH-F952 F953 肋 # CJK COMPATIBILITY IDEOGRAPH-F953 F954 凜 # CJK COMPATIBILITY IDEOGRAPH-F954 F955 凌 # CJK COMPATIBILITY IDEOGRAPH-F955 F956 稜 # CJK COMPATIBILITY IDEOGRAPH-F956 F957 綾 # CJK COMPATIBILITY IDEOGRAPH-F957 F958 菱 # CJK COMPATIBILITY IDEOGRAPH-F958 F959 陵 # CJK COMPATIBILITY IDEOGRAPH-F959 F95A 讀 # CJK COMPATIBILITY IDEOGRAPH-F95A F95B 拏 # CJK COMPATIBILITY IDEOGRAPH-F95B F95C 樂 # CJK COMPATIBILITY IDEOGRAPH-F95C F95D 諾 # CJK COMPATIBILITY IDEOGRAPH-F95D F95E 丹 # CJK COMPATIBILITY IDEOGRAPH-F95E F95F 寧 # CJK COMPATIBILITY IDEOGRAPH-F95F F960 怒 # CJK COMPATIBILITY IDEOGRAPH-F960 F961 率 # CJK COMPATIBILITY IDEOGRAPH-F961 F962 異 # CJK COMPATIBILITY IDEOGRAPH-F962 F963 北 # CJK COMPATIBILITY IDEOGRAPH-F963 F964 磻 # CJK COMPATIBILITY IDEOGRAPH-F964 F965 便 # CJK COMPATIBILITY IDEOGRAPH-F965 F966 復 # CJK COMPATIBILITY IDEOGRAPH-F966 F967 不 # CJK COMPATIBILITY IDEOGRAPH-F967 F968 泌 # CJK COMPATIBILITY IDEOGRAPH-F968 F969 數 # CJK COMPATIBILITY IDEOGRAPH-F969 F96A 索 # CJK COMPATIBILITY IDEOGRAPH-F96A F96B 參 # CJK COMPATIBILITY IDEOGRAPH-F96B F96C 塞 # CJK COMPATIBILITY IDEOGRAPH-F96C F96D 省 # CJK COMPATIBILITY IDEOGRAPH-F96D F96E 葉 # CJK COMPATIBILITY IDEOGRAPH-F96E F96F 說 # CJK COMPATIBILITY IDEOGRAPH-F96F F970 殺 # CJK COMPATIBILITY IDEOGRAPH-F970 F971 辰 # CJK COMPATIBILITY IDEOGRAPH-F971 F972 沈 # CJK COMPATIBILITY IDEOGRAPH-F972 F973 拾 # CJK COMPATIBILITY IDEOGRAPH-F973 F974 若 # CJK COMPATIBILITY IDEOGRAPH-F974 F975 掠 # CJK COMPATIBILITY IDEOGRAPH-F975 F976 略 # CJK COMPATIBILITY IDEOGRAPH-F976 F977 亮 # CJK COMPATIBILITY IDEOGRAPH-F977 F978 兩 # CJK COMPATIBILITY IDEOGRAPH-F978 F979 凉 # CJK COMPATIBILITY IDEOGRAPH-F979 F97A 梁 # CJK COMPATIBILITY IDEOGRAPH-F97A F97B 糧 # CJK COMPATIBILITY IDEOGRAPH-F97B F97C 良 # CJK COMPATIBILITY IDEOGRAPH-F97C F97D 諒 # CJK COMPATIBILITY IDEOGRAPH-F97D F97E 量 # CJK COMPATIBILITY IDEOGRAPH-F97E F97F 勵 # CJK COMPATIBILITY IDEOGRAPH-F97F F980 呂 # CJK COMPATIBILITY IDEOGRAPH-F980 F981 女 # CJK COMPATIBILITY IDEOGRAPH-F981 F982 廬 # CJK COMPATIBILITY IDEOGRAPH-F982 F983 旅 # CJK COMPATIBILITY IDEOGRAPH-F983 F984 濾 # CJK COMPATIBILITY IDEOGRAPH-F984 F985 礪 # CJK COMPATIBILITY IDEOGRAPH-F985 F986 閭 # CJK COMPATIBILITY IDEOGRAPH-F986 F987 驪 # CJK COMPATIBILITY IDEOGRAPH-F987 F988 麗 # CJK COMPATIBILITY IDEOGRAPH-F988 F989 黎 # CJK COMPATIBILITY IDEOGRAPH-F989 F98A 力 # CJK COMPATIBILITY IDEOGRAPH-F98A F98B 曆 # CJK COMPATIBILITY IDEOGRAPH-F98B F98C 歷 # CJK COMPATIBILITY IDEOGRAPH-F98C F98D 轢 # CJK COMPATIBILITY IDEOGRAPH-F98D F98E 年 # CJK COMPATIBILITY IDEOGRAPH-F98E F98F 憐 # CJK COMPATIBILITY IDEOGRAPH-F98F F990 戀 # CJK COMPATIBILITY IDEOGRAPH-F990 F991 撚 # CJK COMPATIBILITY IDEOGRAPH-F991 F992 漣 # CJK COMPATIBILITY IDEOGRAPH-F992 F993 煉 # CJK COMPATIBILITY IDEOGRAPH-F993 F994 璉 # CJK COMPATIBILITY IDEOGRAPH-F994 F995 秊 # CJK COMPATIBILITY IDEOGRAPH-F995 F996 練 # CJK COMPATIBILITY IDEOGRAPH-F996 F997 聯 # CJK COMPATIBILITY IDEOGRAPH-F997 F998 輦 # CJK COMPATIBILITY IDEOGRAPH-F998 F999 蓮 # CJK COMPATIBILITY IDEOGRAPH-F999 F99A 連 # CJK COMPATIBILITY IDEOGRAPH-F99A F99B 鍊 # CJK COMPATIBILITY IDEOGRAPH-F99B F99C 列 # CJK COMPATIBILITY IDEOGRAPH-F99C F99D 劣 # CJK COMPATIBILITY IDEOGRAPH-F99D F99E 咽 # CJK COMPATIBILITY IDEOGRAPH-F99E F99F 烈 # CJK COMPATIBILITY IDEOGRAPH-F99F F9A0 裂 # CJK COMPATIBILITY IDEOGRAPH-F9A0 F9A1 說 # CJK COMPATIBILITY IDEOGRAPH-F9A1 F9A2 廉 # CJK COMPATIBILITY IDEOGRAPH-F9A2 F9A3 念 # CJK COMPATIBILITY IDEOGRAPH-F9A3 F9A4 捻 # CJK COMPATIBILITY IDEOGRAPH-F9A4 F9A5 殮 # CJK COMPATIBILITY IDEOGRAPH-F9A5 F9A6 簾 # CJK COMPATIBILITY IDEOGRAPH-F9A6 F9A7 獵 # CJK COMPATIBILITY IDEOGRAPH-F9A7 F9A8 令 # CJK COMPATIBILITY IDEOGRAPH-F9A8 F9A9 囹 # CJK COMPATIBILITY IDEOGRAPH-F9A9 F9AA 寧 # CJK COMPATIBILITY IDEOGRAPH-F9AA F9AB 嶺 # CJK COMPATIBILITY IDEOGRAPH-F9AB F9AC 怜 # CJK COMPATIBILITY IDEOGRAPH-F9AC F9AD 玲 # CJK COMPATIBILITY IDEOGRAPH-F9AD F9AE 瑩 # CJK COMPATIBILITY IDEOGRAPH-F9AE F9AF 羚 # CJK COMPATIBILITY IDEOGRAPH-F9AF F9B0 聆 # CJK COMPATIBILITY IDEOGRAPH-F9B0 F9B1 鈴 # CJK COMPATIBILITY IDEOGRAPH-F9B1 F9B2 零 # CJK COMPATIBILITY IDEOGRAPH-F9B2 F9B3 靈 # CJK COMPATIBILITY IDEOGRAPH-F9B3 F9B4 領 # CJK COMPATIBILITY IDEOGRAPH-F9B4 F9B5 例 # CJK COMPATIBILITY IDEOGRAPH-F9B5 F9B6 禮 # CJK COMPATIBILITY IDEOGRAPH-F9B6 F9B7 醴 # CJK COMPATIBILITY IDEOGRAPH-F9B7 F9B8 隸 # CJK COMPATIBILITY IDEOGRAPH-F9B8 F9B9 惡 # CJK COMPATIBILITY IDEOGRAPH-F9B9 F9BA 了 # CJK COMPATIBILITY IDEOGRAPH-F9BA F9BB 僚 # CJK COMPATIBILITY IDEOGRAPH-F9BB F9BC 寮 # CJK COMPATIBILITY IDEOGRAPH-F9BC F9BD 尿 # CJK COMPATIBILITY IDEOGRAPH-F9BD F9BE 料 # CJK COMPATIBILITY IDEOGRAPH-F9BE F9BF 樂 # CJK COMPATIBILITY IDEOGRAPH-F9BF F9C0 燎 # CJK COMPATIBILITY IDEOGRAPH-F9C0 F9C1 療 # CJK COMPATIBILITY IDEOGRAPH-F9C1 F9C2 蓼 # CJK COMPATIBILITY IDEOGRAPH-F9C2 F9C3 遼 # CJK COMPATIBILITY IDEOGRAPH-F9C3 F9C4 龍 # CJK COMPATIBILITY IDEOGRAPH-F9C4 F9C5 暈 # CJK COMPATIBILITY IDEOGRAPH-F9C5 F9C6 阮 # CJK COMPATIBILITY IDEOGRAPH-F9C6 F9C7 劉 # CJK COMPATIBILITY IDEOGRAPH-F9C7 F9C8 杻 # CJK COMPATIBILITY IDEOGRAPH-F9C8 F9C9 柳 # CJK COMPATIBILITY IDEOGRAPH-F9C9 F9CA 流 # CJK COMPATIBILITY IDEOGRAPH-F9CA F9CB 溜 # CJK COMPATIBILITY IDEOGRAPH-F9CB F9CC 琉 # CJK COMPATIBILITY IDEOGRAPH-F9CC F9CD 留 # CJK COMPATIBILITY IDEOGRAPH-F9CD F9CE 硫 # CJK COMPATIBILITY IDEOGRAPH-F9CE F9CF 紐 # CJK COMPATIBILITY IDEOGRAPH-F9CF F9D0 類 # CJK COMPATIBILITY IDEOGRAPH-F9D0 F9D1 六 # CJK COMPATIBILITY IDEOGRAPH-F9D1 F9D2 戮 # CJK COMPATIBILITY IDEOGRAPH-F9D2 F9D3 陸 # CJK COMPATIBILITY IDEOGRAPH-F9D3 F9D4 倫 # CJK COMPATIBILITY IDEOGRAPH-F9D4 F9D5 崙 # CJK COMPATIBILITY IDEOGRAPH-F9D5 F9D6 淪 # CJK COMPATIBILITY IDEOGRAPH-F9D6 F9D7 輪 # CJK COMPATIBILITY IDEOGRAPH-F9D7 F9D8 律 # CJK COMPATIBILITY IDEOGRAPH-F9D8 F9D9 慄 # CJK COMPATIBILITY IDEOGRAPH-F9D9 F9DA 栗 # CJK COMPATIBILITY IDEOGRAPH-F9DA F9DB 率 # CJK COMPATIBILITY IDEOGRAPH-F9DB F9DC 隆 # CJK COMPATIBILITY IDEOGRAPH-F9DC F9DD 利 # CJK COMPATIBILITY IDEOGRAPH-F9DD F9DE 吏 # CJK COMPATIBILITY IDEOGRAPH-F9DE F9DF 履 # CJK COMPATIBILITY IDEOGRAPH-F9DF F9E0 易 # CJK COMPATIBILITY IDEOGRAPH-F9E0 F9E1 李 # CJK COMPATIBILITY IDEOGRAPH-F9E1 F9E2 梨 # CJK COMPATIBILITY IDEOGRAPH-F9E2 F9E3 泥 # CJK COMPATIBILITY IDEOGRAPH-F9E3 F9E4 理 # CJK COMPATIBILITY IDEOGRAPH-F9E4 F9E5 痢 # CJK COMPATIBILITY IDEOGRAPH-F9E5 F9E6 罹 # CJK COMPATIBILITY IDEOGRAPH-F9E6 F9E7 裏 # CJK COMPATIBILITY IDEOGRAPH-F9E7 F9E8 裡 # CJK COMPATIBILITY IDEOGRAPH-F9E8 F9E9 里 # CJK COMPATIBILITY IDEOGRAPH-F9E9 F9EA 離 # CJK COMPATIBILITY IDEOGRAPH-F9EA F9EB 匿 # CJK COMPATIBILITY IDEOGRAPH-F9EB F9EC 溺 # CJK COMPATIBILITY IDEOGRAPH-F9EC F9ED 吝 # CJK COMPATIBILITY IDEOGRAPH-F9ED F9EE 燐 # CJK COMPATIBILITY IDEOGRAPH-F9EE F9EF 璘 # CJK COMPATIBILITY IDEOGRAPH-F9EF F9F0 藺 # CJK COMPATIBILITY IDEOGRAPH-F9F0 F9F1 隣 # CJK COMPATIBILITY IDEOGRAPH-F9F1 F9F2 鱗 # CJK COMPATIBILITY IDEOGRAPH-F9F2 F9F3 麟 # CJK COMPATIBILITY IDEOGRAPH-F9F3 F9F4 林 # CJK COMPATIBILITY IDEOGRAPH-F9F4 F9F5 淋 # CJK COMPATIBILITY IDEOGRAPH-F9F5 F9F6 臨 # CJK COMPATIBILITY IDEOGRAPH-F9F6 F9F7 立 # CJK COMPATIBILITY IDEOGRAPH-F9F7 F9F8 笠 # CJK COMPATIBILITY IDEOGRAPH-F9F8 F9F9 粒 # CJK COMPATIBILITY IDEOGRAPH-F9F9 F9FA 狀 # CJK COMPATIBILITY IDEOGRAPH-F9FA F9FB 炙 # CJK COMPATIBILITY IDEOGRAPH-F9FB F9FC 識 # CJK COMPATIBILITY IDEOGRAPH-F9FC F9FD 什 # CJK COMPATIBILITY IDEOGRAPH-F9FD F9FE 茶 # CJK COMPATIBILITY IDEOGRAPH-F9FE F9FF 刺 # CJK COMPATIBILITY IDEOGRAPH-F9FF FA00 切 # CJK COMPATIBILITY IDEOGRAPH-FA00 FA01 度 # CJK COMPATIBILITY IDEOGRAPH-FA01 FA02 拓 # CJK COMPATIBILITY IDEOGRAPH-FA02 FA03 糖 # CJK COMPATIBILITY IDEOGRAPH-FA03 FA04 宅 # CJK COMPATIBILITY IDEOGRAPH-FA04 FA05 洞 # CJK COMPATIBILITY IDEOGRAPH-FA05 FA06 暴 # CJK COMPATIBILITY IDEOGRAPH-FA06 FA07 輻 # CJK COMPATIBILITY IDEOGRAPH-FA07 FA08 行 # CJK COMPATIBILITY IDEOGRAPH-FA08 FA09 降 # CJK COMPATIBILITY IDEOGRAPH-FA09 FA0A 見 # CJK COMPATIBILITY IDEOGRAPH-FA0A FA0B 廓 # CJK COMPATIBILITY IDEOGRAPH-FA0B FA0C 兀 # CJK COMPATIBILITY IDEOGRAPH-FA0C FA0D 嗀 # CJK COMPATIBILITY IDEOGRAPH-FA0D FA10 塚 # CJK COMPATIBILITY IDEOGRAPH-FA10 FA12 晴 # CJK COMPATIBILITY IDEOGRAPH-FA12 FA15 凞 # CJK COMPATIBILITY IDEOGRAPH-FA15 FA16 猪 # CJK COMPATIBILITY IDEOGRAPH-FA16 FA17 益 # CJK COMPATIBILITY IDEOGRAPH-FA17 FA18 礼 # CJK COMPATIBILITY IDEOGRAPH-FA18 FA19 神 # CJK COMPATIBILITY IDEOGRAPH-FA19 FA1A 祥 # CJK COMPATIBILITY IDEOGRAPH-FA1A FA1B 福 # CJK COMPATIBILITY IDEOGRAPH-FA1B FA1C 靖 # CJK COMPATIBILITY IDEOGRAPH-FA1C FA1D 精 # CJK COMPATIBILITY IDEOGRAPH-FA1D FA1E 羽 # CJK COMPATIBILITY IDEOGRAPH-FA1E FA20 蘒 # CJK COMPATIBILITY IDEOGRAPH-FA20 FA22 諸 # CJK COMPATIBILITY IDEOGRAPH-FA22 FA25 逸 # CJK COMPATIBILITY IDEOGRAPH-FA25 FA26 都 # CJK COMPATIBILITY IDEOGRAPH-FA26 FA2A 飯 # CJK COMPATIBILITY IDEOGRAPH-FA2A FA2B 飼 # CJK COMPATIBILITY IDEOGRAPH-FA2B FA2C 館 # CJK COMPATIBILITY IDEOGRAPH-FA2C FA2D 鶴 # CJK COMPATIBILITY IDEOGRAPH-FA2D FA30 侮 # CJK COMPATIBILITY IDEOGRAPH-FA30 FA31 僧 # CJK COMPATIBILITY IDEOGRAPH-FA31 FA32 免 # CJK COMPATIBILITY IDEOGRAPH-FA32 FA33 勉 # CJK COMPATIBILITY IDEOGRAPH-FA33 FA34 勤 # CJK COMPATIBILITY IDEOGRAPH-FA34 FA35 卑 # CJK COMPATIBILITY IDEOGRAPH-FA35 FA36 喝 # CJK COMPATIBILITY IDEOGRAPH-FA36 FA37 嘆 # CJK COMPATIBILITY IDEOGRAPH-FA37 FA38 器 # CJK COMPATIBILITY IDEOGRAPH-FA38 FA39 塀 # CJK COMPATIBILITY IDEOGRAPH-FA39 FA3A 墨 # CJK COMPATIBILITY IDEOGRAPH-FA3A FA3B 層 # CJK COMPATIBILITY IDEOGRAPH-FA3B FA3C 屮 # CJK COMPATIBILITY IDEOGRAPH-FA3C FA3D 悔 # CJK COMPATIBILITY IDEOGRAPH-FA3D FA3E 慨 # CJK COMPATIBILITY IDEOGRAPH-FA3E FA3F 憎 # CJK COMPATIBILITY IDEOGRAPH-FA3F FA40 懲 # CJK COMPATIBILITY IDEOGRAPH-FA40 FA41 敏 # CJK COMPATIBILITY IDEOGRAPH-FA41 FA42 既 # CJK COMPATIBILITY IDEOGRAPH-FA42 FA43 暑 # CJK COMPATIBILITY IDEOGRAPH-FA43 FA44 梅 # CJK COMPATIBILITY IDEOGRAPH-FA44 FA45 海 # CJK COMPATIBILITY IDEOGRAPH-FA45 FA46 渚 # CJK COMPATIBILITY IDEOGRAPH-FA46 FA47 漢 # CJK COMPATIBILITY IDEOGRAPH-FA47 FA48 煮 # CJK COMPATIBILITY IDEOGRAPH-FA48 FA49 爫 # CJK COMPATIBILITY IDEOGRAPH-FA49 FA4A 琢 # CJK COMPATIBILITY IDEOGRAPH-FA4A FA4B 碑 # CJK COMPATIBILITY IDEOGRAPH-FA4B FA4C 社 # CJK COMPATIBILITY IDEOGRAPH-FA4C FA4D 祉 # CJK COMPATIBILITY IDEOGRAPH-FA4D FA4E 祈 # CJK COMPATIBILITY IDEOGRAPH-FA4E FA4F 祐 # CJK COMPATIBILITY IDEOGRAPH-FA4F FA50 祖 # CJK COMPATIBILITY IDEOGRAPH-FA50 FA51 祝 # CJK COMPATIBILITY IDEOGRAPH-FA51 FA52 禍 # CJK COMPATIBILITY IDEOGRAPH-FA52 FA53 禎 # CJK COMPATIBILITY IDEOGRAPH-FA53 FA54 穀 # CJK COMPATIBILITY IDEOGRAPH-FA54 FA55 突 # CJK COMPATIBILITY IDEOGRAPH-FA55 FA56 節 # CJK COMPATIBILITY IDEOGRAPH-FA56 FA57 練 # CJK COMPATIBILITY IDEOGRAPH-FA57 FA58 縉 # CJK COMPATIBILITY IDEOGRAPH-FA58 FA59 繁 # CJK COMPATIBILITY IDEOGRAPH-FA59 FA5A 署 # CJK COMPATIBILITY IDEOGRAPH-FA5A FA5B 者 # CJK COMPATIBILITY IDEOGRAPH-FA5B FA5C 臭 # CJK COMPATIBILITY IDEOGRAPH-FA5C FA5D 艹 # CJK COMPATIBILITY IDEOGRAPH-FA5D FA5E 艹 # CJK COMPATIBILITY IDEOGRAPH-FA5E FA5F 著 # CJK COMPATIBILITY IDEOGRAPH-FA5F FA60 褐 # CJK COMPATIBILITY IDEOGRAPH-FA60 FA61 視 # CJK COMPATIBILITY IDEOGRAPH-FA61 FA62 謁 # CJK COMPATIBILITY IDEOGRAPH-FA62 FA63 謹 # CJK COMPATIBILITY IDEOGRAPH-FA63 FA64 賓 # CJK COMPATIBILITY IDEOGRAPH-FA64 FA65 贈 # CJK COMPATIBILITY IDEOGRAPH-FA65 FA66 辶 # CJK COMPATIBILITY IDEOGRAPH-FA66 FA67 逸 # CJK COMPATIBILITY IDEOGRAPH-FA67 FA68 難 # CJK COMPATIBILITY IDEOGRAPH-FA68 FA69 響 # CJK COMPATIBILITY IDEOGRAPH-FA69 FA6A 頻 # CJK COMPATIBILITY IDEOGRAPH-FA6A FB00 ff # LATIN SMALL LIGATURE FF FB01 fi # LATIN SMALL LIGATURE FI FB02 fl # LATIN SMALL LIGATURE FL FB03 ffi # LATIN SMALL LIGATURE FFI FB04 ffl # LATIN SMALL LIGATURE FFL FB05 ſt # LATIN SMALL LIGATURE LONG S T FB06 st # LATIN SMALL LIGATURE ST FB13 մն # ARMENIAN SMALL LIGATURE MEN NOW FB14 մե # ARMENIAN SMALL LIGATURE MEN ECH FB15 մի # ARMENIAN SMALL LIGATURE MEN INI FB16 վն # ARMENIAN SMALL LIGATURE VEW NOW FB17 մխ # ARMENIAN SMALL LIGATURE MEN XEH FB20 ע # HEBREW LETTER ALTERNATIVE AYIN FB21 א # HEBREW LETTER WIDE ALEF FB22 ד # HEBREW LETTER WIDE DALET FB23 ה # HEBREW LETTER WIDE HE FB24 כ # HEBREW LETTER WIDE KAF FB25 ל # HEBREW LETTER WIDE LAMED FB26 ם # HEBREW LETTER WIDE FINAL MEM FB27 ר # HEBREW LETTER WIDE RESH FB28 ת # HEBREW LETTER WIDE TAV FB29 + # HEBREW LETTER ALTERNATIVE PLUS SIGN FB4F אל # HEBREW LIGATURE ALEF LAMED FE49 ‾ # DASHED OVERLINE FE4A ‾ # CENTRELINE OVERLINE FE4B ‾ # WAVY OVERLINE FE4C ‾ # DOUBLE WAVY OVERLINE FE4D _ # DASHED LOW LINE FE4E _ # CENTRELINE LOW LINE FE4F _ # WAVY LOW LINE FE50 , # SMALL COMMA FE51 、 # SMALL IDEOGRAPHIC COMMA FE52 . # SMALL FULL STOP FE54 ; # SMALL SEMICOLON FE55 : # SMALL COLON FE56 ? # SMALL QUESTION MARK FE57 ! # SMALL EXCLAMATION MARK FE58 — # SMALL EM DASH FE59 ( # SMALL LEFT PARENTHESIS FE5A ) # SMALL RIGHT PARENTHESIS FE5B { # SMALL LEFT CURLY BRACKET FE5C } # SMALL RIGHT CURLY BRACKET FE5D 〔 # SMALL LEFT TORTOISE SHELL BRACKET FE5E 〕 # SMALL RIGHT TORTOISE SHELL BRACKET FE5F # # SMALL NUMBER SIGN FE60 & # SMALL AMPERSAND FE61 * # SMALL ASTERISK FE62 + # SMALL PLUS SIGN FE63 - # SMALL HYPHEN-MINUS FE64 < # SMALL LESS-THAN SIGN FE65 > # SMALL GREATER-THAN SIGN FE66 = # SMALL EQUALS SIGN FE68 \ # SMALL REVERSE SOLIDUS FE69 $ # SMALL DOLLAR SIGN FE6A % # SMALL PERCENT SIGN FE6B @ # SMALL COMMERCIAL AT FF01 ! # FULLWIDTH EXCLAMATION MARK FF02 " # FULLWIDTH QUOTATION MARK FF03 # # FULLWIDTH NUMBER SIGN FF04 $ # FULLWIDTH DOLLAR SIGN FF05 % # FULLWIDTH PERCENT SIGN FF06 & # FULLWIDTH AMPERSAND FF07 ' # FULLWIDTH APOSTROPHE FF08 ( # FULLWIDTH LEFT PARENTHESIS FF09 ) # FULLWIDTH RIGHT PARENTHESIS FF0A * # FULLWIDTH ASTERISK FF0B + # FULLWIDTH PLUS SIGN FF0C , # FULLWIDTH COMMA FF0D - # FULLWIDTH HYPHEN-MINUS FF0E . # FULLWIDTH FULL STOP FF0F / # FULLWIDTH SOLIDUS FF10 0 # FULLWIDTH DIGIT ZERO FF11 1 # FULLWIDTH DIGIT ONE FF12 2 # FULLWIDTH DIGIT TWO FF13 3 # FULLWIDTH DIGIT THREE FF14 4 # FULLWIDTH DIGIT FOUR FF15 5 # FULLWIDTH DIGIT FIVE FF16 6 # FULLWIDTH DIGIT SIX FF17 7 # FULLWIDTH DIGIT SEVEN FF18 8 # FULLWIDTH DIGIT EIGHT FF19 9 # FULLWIDTH DIGIT NINE FF1A : # FULLWIDTH COLON FF1B ; # FULLWIDTH SEMICOLON FF1C < # FULLWIDTH LESS-THAN SIGN FF1D = # FULLWIDTH EQUALS SIGN FF1E > # FULLWIDTH GREATER-THAN SIGN FF1F ? # FULLWIDTH QUESTION MARK FF20 @ # FULLWIDTH COMMERCIAL AT FF21 A # FULLWIDTH LATIN CAPITAL LETTER A FF22 B # FULLWIDTH LATIN CAPITAL LETTER B FF23 C # FULLWIDTH LATIN CAPITAL LETTER C FF24 D # FULLWIDTH LATIN CAPITAL LETTER D FF25 E # FULLWIDTH LATIN CAPITAL LETTER E FF26 F # FULLWIDTH LATIN CAPITAL LETTER F FF27 G # FULLWIDTH LATIN CAPITAL LETTER G FF28 H # FULLWIDTH LATIN CAPITAL LETTER H FF29 I # FULLWIDTH LATIN CAPITAL LETTER I FF2A J # FULLWIDTH LATIN CAPITAL LETTER J FF2B K # FULLWIDTH LATIN CAPITAL LETTER K FF2C L # FULLWIDTH LATIN CAPITAL LETTER L FF2D M # FULLWIDTH LATIN CAPITAL LETTER M FF2E N # FULLWIDTH LATIN CAPITAL LETTER N FF2F O # FULLWIDTH LATIN CAPITAL LETTER O FF30 P # FULLWIDTH LATIN CAPITAL LETTER P FF31 Q # FULLWIDTH LATIN CAPITAL LETTER Q FF32 R # FULLWIDTH LATIN CAPITAL LETTER R FF33 S # FULLWIDTH LATIN CAPITAL LETTER S FF34 T # FULLWIDTH LATIN CAPITAL LETTER T FF35 U # FULLWIDTH LATIN CAPITAL LETTER U FF36 V # FULLWIDTH LATIN CAPITAL LETTER V FF37 W # FULLWIDTH LATIN CAPITAL LETTER W FF38 X # FULLWIDTH LATIN CAPITAL LETTER X FF39 Y # FULLWIDTH LATIN CAPITAL LETTER Y FF3A Z # FULLWIDTH LATIN CAPITAL LETTER Z FF3B [ # FULLWIDTH LEFT SQUARE BRACKET FF3C \ # FULLWIDTH REVERSE SOLIDUS FF3D ] # FULLWIDTH RIGHT SQUARE BRACKET FF3E ^ # FULLWIDTH CIRCUMFLEX ACCENT FF3F _ # FULLWIDTH LOW LINE FF40 ` # FULLWIDTH GRAVE ACCENT FF41 a # FULLWIDTH LATIN SMALL LETTER A FF42 b # FULLWIDTH LATIN SMALL LETTER B FF43 c # FULLWIDTH LATIN SMALL LETTER C FF44 d # FULLWIDTH LATIN SMALL LETTER D FF45 e # FULLWIDTH LATIN SMALL LETTER E FF46 f # FULLWIDTH LATIN SMALL LETTER F FF47 g # FULLWIDTH LATIN SMALL LETTER G FF48 h # FULLWIDTH LATIN SMALL LETTER H FF49 i # FULLWIDTH LATIN SMALL LETTER I FF4A j # FULLWIDTH LATIN SMALL LETTER J FF4B k # FULLWIDTH LATIN SMALL LETTER K FF4C l # FULLWIDTH LATIN SMALL LETTER L FF4D m # FULLWIDTH LATIN SMALL LETTER M FF4E n # FULLWIDTH LATIN SMALL LETTER N FF4F o # FULLWIDTH LATIN SMALL LETTER O FF50 p # FULLWIDTH LATIN SMALL LETTER P FF51 q # FULLWIDTH LATIN SMALL LETTER Q FF52 r # FULLWIDTH LATIN SMALL LETTER R FF53 s # FULLWIDTH LATIN SMALL LETTER S FF54 t # FULLWIDTH LATIN SMALL LETTER T FF55 u # FULLWIDTH LATIN SMALL LETTER U FF56 v # FULLWIDTH LATIN SMALL LETTER V FF57 w # FULLWIDTH LATIN SMALL LETTER W FF58 x # FULLWIDTH LATIN SMALL LETTER X FF59 y # FULLWIDTH LATIN SMALL LETTER Y FF5A z # FULLWIDTH LATIN SMALL LETTER Z FF5B { # FULLWIDTH LEFT CURLY BRACKET FF5C | # FULLWIDTH VERTICAL LINE FF5D } # FULLWIDTH RIGHT CURLY BRACKET FF5E ~ # FULLWIDTH TILDE FF5F ⦅ # FULLWIDTH LEFT WHITE PARENTHESIS FF60 ⦆ # FULLWIDTH RIGHT WHITE PARENTHESIS FF61 。 # HALFWIDTH IDEOGRAPHIC FULL STOP FF62 「 # HALFWIDTH LEFT CORNER BRACKET FF63 」 # HALFWIDTH RIGHT CORNER BRACKET FF64 、 # HALFWIDTH IDEOGRAPHIC COMMA FF65 ・ # HALFWIDTH KATAKANA MIDDLE DOT FF66 ヲ # HALFWIDTH KATAKANA LETTER WO FF67 ァ # HALFWIDTH KATAKANA LETTER SMALL A FF68 ィ # HALFWIDTH KATAKANA LETTER SMALL I FF69 ゥ # HALFWIDTH KATAKANA LETTER SMALL U FF6A ェ # HALFWIDTH KATAKANA LETTER SMALL E FF6B ォ # HALFWIDTH KATAKANA LETTER SMALL O FF6C ャ # HALFWIDTH KATAKANA LETTER SMALL YA FF6D ュ # HALFWIDTH KATAKANA LETTER SMALL YU FF6E ョ # HALFWIDTH KATAKANA LETTER SMALL YO FF6F ッ # HALFWIDTH KATAKANA LETTER SMALL TU FF70 ー # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK FF71 ア # HALFWIDTH KATAKANA LETTER A FF72 イ # HALFWIDTH KATAKANA LETTER I FF73 ウ # HALFWIDTH KATAKANA LETTER U FF74 エ # HALFWIDTH KATAKANA LETTER E FF75 オ # HALFWIDTH KATAKANA LETTER O FF76 カ # HALFWIDTH KATAKANA LETTER KA FF77 キ # HALFWIDTH KATAKANA LETTER KI FF78 ク # HALFWIDTH KATAKANA LETTER KU FF79 ケ # HALFWIDTH KATAKANA LETTER KE FF7A コ # HALFWIDTH KATAKANA LETTER KO FF7B サ # HALFWIDTH KATAKANA LETTER SA FF7C シ # HALFWIDTH KATAKANA LETTER SI FF7D ス # HALFWIDTH KATAKANA LETTER SU FF7E セ # HALFWIDTH KATAKANA LETTER SE FF7F ソ # HALFWIDTH KATAKANA LETTER SO FF80 タ # HALFWIDTH KATAKANA LETTER TA FF81 チ # HALFWIDTH KATAKANA LETTER TI FF82 ツ # HALFWIDTH KATAKANA LETTER TU FF83 テ # HALFWIDTH KATAKANA LETTER TE FF84 ト # HALFWIDTH KATAKANA LETTER TO FF85 ナ # HALFWIDTH KATAKANA LETTER NA FF86 ニ # HALFWIDTH KATAKANA LETTER NI FF87 ヌ # HALFWIDTH KATAKANA LETTER NU FF88 ネ # HALFWIDTH KATAKANA LETTER NE FF89 ノ # HALFWIDTH KATAKANA LETTER NO FF8A ハ # HALFWIDTH KATAKANA LETTER HA FF8B ヒ # HALFWIDTH KATAKANA LETTER HI FF8C フ # HALFWIDTH KATAKANA LETTER HU FF8D ヘ # HALFWIDTH KATAKANA LETTER HE FF8E ホ # HALFWIDTH KATAKANA LETTER HO FF8F マ # HALFWIDTH KATAKANA LETTER MA FF90 ミ # HALFWIDTH KATAKANA LETTER MI FF91 ム # HALFWIDTH KATAKANA LETTER MU FF92 メ # HALFWIDTH KATAKANA LETTER ME FF93 モ # HALFWIDTH KATAKANA LETTER MO FF94 ヤ # HALFWIDTH KATAKANA LETTER YA FF95 ユ # HALFWIDTH KATAKANA LETTER YU FF96 ヨ # HALFWIDTH KATAKANA LETTER YO FF97 ラ # HALFWIDTH KATAKANA LETTER RA FF98 リ # HALFWIDTH KATAKANA LETTER RI FF99 ル # HALFWIDTH KATAKANA LETTER RU FF9A レ # HALFWIDTH KATAKANA LETTER RE FF9B ロ # HALFWIDTH KATAKANA LETTER RO FF9C ワ # HALFWIDTH KATAKANA LETTER WA FF9D ン # HALFWIDTH KATAKANA LETTER N FF9E ゙ # HALFWIDTH KATAKANA VOICED SOUND MARK FF9F ゚ # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK FFA0 ㅤ # HALFWIDTH HANGUL FILLER FFA1 ㄱ # HALFWIDTH HANGUL LETTER KIYEOK FFA2 ㄲ # HALFWIDTH HANGUL LETTER SSANGKIYEOK FFA3 ㄳ # HALFWIDTH HANGUL LETTER KIYEOK-SIOS FFA4 ㄴ # HALFWIDTH HANGUL LETTER NIEUN FFA5 ㄵ # HALFWIDTH HANGUL LETTER NIEUN-CIEUC FFA6 ㄶ # HALFWIDTH HANGUL LETTER NIEUN-HIEUH FFA7 ㄷ # HALFWIDTH HANGUL LETTER TIKEUT FFA8 ㄸ # HALFWIDTH HANGUL LETTER SSANGTIKEUT FFA9 ㄹ # HALFWIDTH HANGUL LETTER RIEUL FFAA ㄺ # HALFWIDTH HANGUL LETTER RIEUL-KIYEOK FFAB ㄻ # HALFWIDTH HANGUL LETTER RIEUL-MIEUM FFAC ㄼ # HALFWIDTH HANGUL LETTER RIEUL-PIEUP FFAD ㄽ # HALFWIDTH HANGUL LETTER RIEUL-SIOS FFAE ㄾ # HALFWIDTH HANGUL LETTER RIEUL-THIEUTH FFAF ㄿ # HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH FFB0 ㅀ # HALFWIDTH HANGUL LETTER RIEUL-HIEUH FFB1 ㅁ # HALFWIDTH HANGUL LETTER MIEUM FFB2 ㅂ # HALFWIDTH HANGUL LETTER PIEUP FFB3 ㅃ # HALFWIDTH HANGUL LETTER SSANGPIEUP FFB4 ㅄ # HALFWIDTH HANGUL LETTER PIEUP-SIOS FFB5 ㅅ # HALFWIDTH HANGUL LETTER SIOS FFB6 ㅆ # HALFWIDTH HANGUL LETTER SSANGSIOS FFB7 ㅇ # HALFWIDTH HANGUL LETTER IEUNG FFB8 ㅈ # HALFWIDTH HANGUL LETTER CIEUC FFB9 ㅉ # HALFWIDTH HANGUL LETTER SSANGCIEUC FFBA ㅊ # HALFWIDTH HANGUL LETTER CHIEUCH FFBB ㅋ # HALFWIDTH HANGUL LETTER KHIEUKH FFBC ㅌ # HALFWIDTH HANGUL LETTER THIEUTH FFBD ㅍ # HALFWIDTH HANGUL LETTER PHIEUPH FFBE ㅎ # HALFWIDTH HANGUL LETTER HIEUH FFC2 ㅏ # HALFWIDTH HANGUL LETTER A FFC3 ㅐ # HALFWIDTH HANGUL LETTER AE FFC4 ㅑ # HALFWIDTH HANGUL LETTER YA FFC5 ㅒ # HALFWIDTH HANGUL LETTER YAE FFC6 ㅓ # HALFWIDTH HANGUL LETTER EO FFC7 ㅔ # HALFWIDTH HANGUL LETTER E FFCA ㅕ # HALFWIDTH HANGUL LETTER YEO FFCB ㅖ # HALFWIDTH HANGUL LETTER YE FFCC ㅗ # HALFWIDTH HANGUL LETTER O FFCD ㅘ # HALFWIDTH HANGUL LETTER WA FFCE ㅙ # HALFWIDTH HANGUL LETTER WAE FFCF ㅚ # HALFWIDTH HANGUL LETTER OE FFD2 ㅛ # HALFWIDTH HANGUL LETTER YO FFD3 ㅜ # HALFWIDTH HANGUL LETTER U FFD4 ㅝ # HALFWIDTH HANGUL LETTER WEO FFD5 ㅞ # HALFWIDTH HANGUL LETTER WE FFD6 ㅟ # HALFWIDTH HANGUL LETTER WI FFD7 ㅠ # HALFWIDTH HANGUL LETTER YU FFDA ㅡ # HALFWIDTH HANGUL LETTER EU FFDB ㅢ # HALFWIDTH HANGUL LETTER YI FFDC ㅣ # HALFWIDTH HANGUL LETTER I FFE0 ¢ # FULLWIDTH CENT SIGN FFE1 £ # FULLWIDTH POUND SIGN FFE2 ¬ # FULLWIDTH NOT SIGN FFE3 ¯ # FULLWIDTH MACRON FFE4 ¦ # FULLWIDTH BROKEN BAR FFE5 ¥ # FULLWIDTH YEN SIGN FFE6 ₩ # FULLWIDTH WON SIGN FFE8 │ # HALFWIDTH FORMS LIGHT VERTICAL FFE9 ← # HALFWIDTH LEFTWARDS ARROW FFEA ↑ # HALFWIDTH UPWARDS ARROW FFEB → # HALFWIDTH RIGHTWARDS ARROW FFEC ↓ # HALFWIDTH DOWNWARDS ARROW FFED ■ # HALFWIDTH BLACK SQUARE FFEE ○ # HALFWIDTH WHITE CIRCLE 1D400 A # MATHEMATICAL BOLD CAPITAL A 1D401 B # MATHEMATICAL BOLD CAPITAL B 1D402 C # MATHEMATICAL BOLD CAPITAL C 1D403 D # MATHEMATICAL BOLD CAPITAL D 1D404 E # MATHEMATICAL BOLD CAPITAL E 1D405 F # MATHEMATICAL BOLD CAPITAL F 1D406 G # MATHEMATICAL BOLD CAPITAL G 1D407 H # MATHEMATICAL BOLD CAPITAL H 1D408 I # MATHEMATICAL BOLD CAPITAL I 1D409 J # MATHEMATICAL BOLD CAPITAL J 1D40A K # MATHEMATICAL BOLD CAPITAL K 1D40B L # MATHEMATICAL BOLD CAPITAL L 1D40C M # MATHEMATICAL BOLD CAPITAL M 1D40D N # MATHEMATICAL BOLD CAPITAL N 1D40E O # MATHEMATICAL BOLD CAPITAL O 1D40F P # MATHEMATICAL BOLD CAPITAL P 1D410 Q # MATHEMATICAL BOLD CAPITAL Q 1D411 R # MATHEMATICAL BOLD CAPITAL R 1D412 S # MATHEMATICAL BOLD CAPITAL S 1D413 T # MATHEMATICAL BOLD CAPITAL T 1D414 U # MATHEMATICAL BOLD CAPITAL U 1D415 V # MATHEMATICAL BOLD CAPITAL V 1D416 W # MATHEMATICAL BOLD CAPITAL W 1D417 X # MATHEMATICAL BOLD CAPITAL X 1D418 Y # MATHEMATICAL BOLD CAPITAL Y 1D419 Z # MATHEMATICAL BOLD CAPITAL Z 1D41A a # MATHEMATICAL BOLD SMALL A 1D41B b # MATHEMATICAL BOLD SMALL B 1D41C c # MATHEMATICAL BOLD SMALL C 1D41D d # MATHEMATICAL BOLD SMALL D 1D41E e # MATHEMATICAL BOLD SMALL E 1D41F f # MATHEMATICAL BOLD SMALL F 1D420 g # MATHEMATICAL BOLD SMALL G 1D421 h # MATHEMATICAL BOLD SMALL H 1D422 i # MATHEMATICAL BOLD SMALL I 1D423 j # MATHEMATICAL BOLD SMALL J 1D424 k # MATHEMATICAL BOLD SMALL K 1D425 l # MATHEMATICAL BOLD SMALL L 1D426 m # MATHEMATICAL BOLD SMALL M 1D427 n # MATHEMATICAL BOLD SMALL N 1D428 o # MATHEMATICAL BOLD SMALL O 1D429 p # MATHEMATICAL BOLD SMALL P 1D42A q # MATHEMATICAL BOLD SMALL Q 1D42B r # MATHEMATICAL BOLD SMALL R 1D42C s # MATHEMATICAL BOLD SMALL S 1D42D t # MATHEMATICAL BOLD SMALL T 1D42E u # MATHEMATICAL BOLD SMALL U 1D42F v # MATHEMATICAL BOLD SMALL V 1D430 w # MATHEMATICAL BOLD SMALL W 1D431 x # MATHEMATICAL BOLD SMALL X 1D432 y # MATHEMATICAL BOLD SMALL Y 1D433 z # MATHEMATICAL BOLD SMALL Z 1D434 A # MATHEMATICAL ITALIC CAPITAL A 1D435 B # MATHEMATICAL ITALIC CAPITAL B 1D436 C # MATHEMATICAL ITALIC CAPITAL C 1D437 D # MATHEMATICAL ITALIC CAPITAL D 1D438 E # MATHEMATICAL ITALIC CAPITAL E 1D439 F # MATHEMATICAL ITALIC CAPITAL F 1D43A G # MATHEMATICAL ITALIC CAPITAL G 1D43B H # MATHEMATICAL ITALIC CAPITAL H 1D43C I # MATHEMATICAL ITALIC CAPITAL I 1D43D J # MATHEMATICAL ITALIC CAPITAL J 1D43E K # MATHEMATICAL ITALIC CAPITAL K 1D43F L # MATHEMATICAL ITALIC CAPITAL L 1D440 M # MATHEMATICAL ITALIC CAPITAL M 1D441 N # MATHEMATICAL ITALIC CAPITAL N 1D442 O # MATHEMATICAL ITALIC CAPITAL O 1D443 P # MATHEMATICAL ITALIC CAPITAL P 1D444 Q # MATHEMATICAL ITALIC CAPITAL Q 1D445 R # MATHEMATICAL ITALIC CAPITAL R 1D446 S # MATHEMATICAL ITALIC CAPITAL S 1D447 T # MATHEMATICAL ITALIC CAPITAL T 1D448 U # MATHEMATICAL ITALIC CAPITAL U 1D449 V # MATHEMATICAL ITALIC CAPITAL V 1D44A W # MATHEMATICAL ITALIC CAPITAL W 1D44B X # MATHEMATICAL ITALIC CAPITAL X 1D44C Y # MATHEMATICAL ITALIC CAPITAL Y 1D44D Z # MATHEMATICAL ITALIC CAPITAL Z 1D44E a # MATHEMATICAL ITALIC SMALL A 1D44F b # MATHEMATICAL ITALIC SMALL B 1D450 c # MATHEMATICAL ITALIC SMALL C 1D451 d # MATHEMATICAL ITALIC SMALL D 1D452 e # MATHEMATICAL ITALIC SMALL E 1D453 f # MATHEMATICAL ITALIC SMALL F 1D454 g # MATHEMATICAL ITALIC SMALL G 1D456 i # MATHEMATICAL ITALIC SMALL I 1D457 j # MATHEMATICAL ITALIC SMALL J 1D458 k # MATHEMATICAL ITALIC SMALL K 1D459 l # MATHEMATICAL ITALIC SMALL L 1D45A m # MATHEMATICAL ITALIC SMALL M 1D45B n # MATHEMATICAL ITALIC SMALL N 1D45C o # MATHEMATICAL ITALIC SMALL O 1D45D p # MATHEMATICAL ITALIC SMALL P 1D45E q # MATHEMATICAL ITALIC SMALL Q 1D45F r # MATHEMATICAL ITALIC SMALL R 1D460 s # MATHEMATICAL ITALIC SMALL S 1D461 t # MATHEMATICAL ITALIC SMALL T 1D462 u # MATHEMATICAL ITALIC SMALL U 1D463 v # MATHEMATICAL ITALIC SMALL V 1D464 w # MATHEMATICAL ITALIC SMALL W 1D465 x # MATHEMATICAL ITALIC SMALL X 1D466 y # MATHEMATICAL ITALIC SMALL Y 1D467 z # MATHEMATICAL ITALIC SMALL Z 1D468 A # MATHEMATICAL BOLD ITALIC CAPITAL A 1D469 B # MATHEMATICAL BOLD ITALIC CAPITAL B 1D46A C # MATHEMATICAL BOLD ITALIC CAPITAL C 1D46B D # MATHEMATICAL BOLD ITALIC CAPITAL D 1D46C E # MATHEMATICAL BOLD ITALIC CAPITAL E 1D46D F # MATHEMATICAL BOLD ITALIC CAPITAL F 1D46E G # MATHEMATICAL BOLD ITALIC CAPITAL G 1D46F H # MATHEMATICAL BOLD ITALIC CAPITAL H 1D470 I # MATHEMATICAL BOLD ITALIC CAPITAL I 1D471 J # MATHEMATICAL BOLD ITALIC CAPITAL J 1D472 K # MATHEMATICAL BOLD ITALIC CAPITAL K 1D473 L # MATHEMATICAL BOLD ITALIC CAPITAL L 1D474 M # MATHEMATICAL BOLD ITALIC CAPITAL M 1D475 N # MATHEMATICAL BOLD ITALIC CAPITAL N 1D476 O # MATHEMATICAL BOLD ITALIC CAPITAL O 1D477 P # MATHEMATICAL BOLD ITALIC CAPITAL P 1D478 Q # MATHEMATICAL BOLD ITALIC CAPITAL Q 1D479 R # MATHEMATICAL BOLD ITALIC CAPITAL R 1D47A S # MATHEMATICAL BOLD ITALIC CAPITAL S 1D47B T # MATHEMATICAL BOLD ITALIC CAPITAL T 1D47C U # MATHEMATICAL BOLD ITALIC CAPITAL U 1D47D V # MATHEMATICAL BOLD ITALIC CAPITAL V 1D47E W # MATHEMATICAL BOLD ITALIC CAPITAL W 1D47F X # MATHEMATICAL BOLD ITALIC CAPITAL X 1D480 Y # MATHEMATICAL BOLD ITALIC CAPITAL Y 1D481 Z # MATHEMATICAL BOLD ITALIC CAPITAL Z 1D482 a # MATHEMATICAL BOLD ITALIC SMALL A 1D483 b # MATHEMATICAL BOLD ITALIC SMALL B 1D484 c # MATHEMATICAL BOLD ITALIC SMALL C 1D485 d # MATHEMATICAL BOLD ITALIC SMALL D 1D486 e # MATHEMATICAL BOLD ITALIC SMALL E 1D487 f # MATHEMATICAL BOLD ITALIC SMALL F 1D488 g # MATHEMATICAL BOLD ITALIC SMALL G 1D489 h # MATHEMATICAL BOLD ITALIC SMALL H 1D48A i # MATHEMATICAL BOLD ITALIC SMALL I 1D48B j # MATHEMATICAL BOLD ITALIC SMALL J 1D48C k # MATHEMATICAL BOLD ITALIC SMALL K 1D48D l # MATHEMATICAL BOLD ITALIC SMALL L 1D48E m # MATHEMATICAL BOLD ITALIC SMALL M 1D48F n # MATHEMATICAL BOLD ITALIC SMALL N 1D490 o # MATHEMATICAL BOLD ITALIC SMALL O 1D491 p # MATHEMATICAL BOLD ITALIC SMALL P 1D492 q # MATHEMATICAL BOLD ITALIC SMALL Q 1D493 r # MATHEMATICAL BOLD ITALIC SMALL R 1D494 s # MATHEMATICAL BOLD ITALIC SMALL S 1D495 t # MATHEMATICAL BOLD ITALIC SMALL T 1D496 u # MATHEMATICAL BOLD ITALIC SMALL U 1D497 v # MATHEMATICAL BOLD ITALIC SMALL V 1D498 w # MATHEMATICAL BOLD ITALIC SMALL W 1D499 x # MATHEMATICAL BOLD ITALIC SMALL X 1D49A y # MATHEMATICAL BOLD ITALIC SMALL Y 1D49B z # MATHEMATICAL BOLD ITALIC SMALL Z 1D49C A # MATHEMATICAL SCRIPT CAPITAL A 1D49E C # MATHEMATICAL SCRIPT CAPITAL C 1D49F D # MATHEMATICAL SCRIPT CAPITAL D 1D4A2 G # MATHEMATICAL SCRIPT CAPITAL G 1D4A5 J # MATHEMATICAL SCRIPT CAPITAL J 1D4A6 K # MATHEMATICAL SCRIPT CAPITAL K 1D4A9 N # MATHEMATICAL SCRIPT CAPITAL N 1D4AA O # MATHEMATICAL SCRIPT CAPITAL O 1D4AB P # MATHEMATICAL SCRIPT CAPITAL P 1D4AC Q # MATHEMATICAL SCRIPT CAPITAL Q 1D4AE S # MATHEMATICAL SCRIPT CAPITAL S 1D4AF T # MATHEMATICAL SCRIPT CAPITAL T 1D4B0 U # MATHEMATICAL SCRIPT CAPITAL U 1D4B1 V # MATHEMATICAL SCRIPT CAPITAL V 1D4B2 W # MATHEMATICAL SCRIPT CAPITAL W 1D4B3 X # MATHEMATICAL SCRIPT CAPITAL X 1D4B4 Y # MATHEMATICAL SCRIPT CAPITAL Y 1D4B5 Z # MATHEMATICAL SCRIPT CAPITAL Z 1D4B6 a # MATHEMATICAL SCRIPT SMALL A 1D4B7 b # MATHEMATICAL SCRIPT SMALL B 1D4B8 c # MATHEMATICAL SCRIPT SMALL C 1D4B9 d # MATHEMATICAL SCRIPT SMALL D 1D4BB f # MATHEMATICAL SCRIPT SMALL F 1D4BD h # MATHEMATICAL SCRIPT SMALL H 1D4BE i # MATHEMATICAL SCRIPT SMALL I 1D4BF j # MATHEMATICAL SCRIPT SMALL J 1D4C0 k # MATHEMATICAL SCRIPT SMALL K 1D4C1 l # MATHEMATICAL SCRIPT SMALL L 1D4C2 m # MATHEMATICAL SCRIPT SMALL M 1D4C3 n # MATHEMATICAL SCRIPT SMALL N 1D4C5 p # MATHEMATICAL SCRIPT SMALL P 1D4C6 q # MATHEMATICAL SCRIPT SMALL Q 1D4C7 r # MATHEMATICAL SCRIPT SMALL R 1D4C8 s # MATHEMATICAL SCRIPT SMALL S 1D4C9 t # MATHEMATICAL SCRIPT SMALL T 1D4CA u # MATHEMATICAL SCRIPT SMALL U 1D4CB v # MATHEMATICAL SCRIPT SMALL V 1D4CC w # MATHEMATICAL SCRIPT SMALL W 1D4CD x # MATHEMATICAL SCRIPT SMALL X 1D4CE y # MATHEMATICAL SCRIPT SMALL Y 1D4CF z # MATHEMATICAL SCRIPT SMALL Z 1D4D0 A # MATHEMATICAL BOLD SCRIPT CAPITAL A 1D4D1 B # MATHEMATICAL BOLD SCRIPT CAPITAL B 1D4D2 C # MATHEMATICAL BOLD SCRIPT CAPITAL C 1D4D3 D # MATHEMATICAL BOLD SCRIPT CAPITAL D 1D4D4 E # MATHEMATICAL BOLD SCRIPT CAPITAL E 1D4D5 F # MATHEMATICAL BOLD SCRIPT CAPITAL F 1D4D6 G # MATHEMATICAL BOLD SCRIPT CAPITAL G 1D4D7 H # MATHEMATICAL BOLD SCRIPT CAPITAL H 1D4D8 I # MATHEMATICAL BOLD SCRIPT CAPITAL I 1D4D9 J # MATHEMATICAL BOLD SCRIPT CAPITAL J 1D4DA K # MATHEMATICAL BOLD SCRIPT CAPITAL K 1D4DB L # MATHEMATICAL BOLD SCRIPT CAPITAL L 1D4DC M # MATHEMATICAL BOLD SCRIPT CAPITAL M 1D4DD N # MATHEMATICAL BOLD SCRIPT CAPITAL N 1D4DE O # MATHEMATICAL BOLD SCRIPT CAPITAL O 1D4DF P # MATHEMATICAL BOLD SCRIPT CAPITAL P 1D4E0 Q # MATHEMATICAL BOLD SCRIPT CAPITAL Q 1D4E1 R # MATHEMATICAL BOLD SCRIPT CAPITAL R 1D4E2 S # MATHEMATICAL BOLD SCRIPT CAPITAL S 1D4E3 T # MATHEMATICAL BOLD SCRIPT CAPITAL T 1D4E4 U # MATHEMATICAL BOLD SCRIPT CAPITAL U 1D4E5 V # MATHEMATICAL BOLD SCRIPT CAPITAL V 1D4E6 W # MATHEMATICAL BOLD SCRIPT CAPITAL W 1D4E7 X # MATHEMATICAL BOLD SCRIPT CAPITAL X 1D4E8 Y # MATHEMATICAL BOLD SCRIPT CAPITAL Y 1D4E9 Z # MATHEMATICAL BOLD SCRIPT CAPITAL Z 1D4EA a # MATHEMATICAL BOLD SCRIPT SMALL A 1D4EB b # MATHEMATICAL BOLD SCRIPT SMALL B 1D4EC c # MATHEMATICAL BOLD SCRIPT SMALL C 1D4ED d # MATHEMATICAL BOLD SCRIPT SMALL D 1D4EE e # MATHEMATICAL BOLD SCRIPT SMALL E 1D4EF f # MATHEMATICAL BOLD SCRIPT SMALL F 1D4F0 g # MATHEMATICAL BOLD SCRIPT SMALL G 1D4F1 h # MATHEMATICAL BOLD SCRIPT SMALL H 1D4F2 i # MATHEMATICAL BOLD SCRIPT SMALL I 1D4F3 j # MATHEMATICAL BOLD SCRIPT SMALL J 1D4F4 k # MATHEMATICAL BOLD SCRIPT SMALL K 1D4F5 l # MATHEMATICAL BOLD SCRIPT SMALL L 1D4F6 m # MATHEMATICAL BOLD SCRIPT SMALL M 1D4F7 n # MATHEMATICAL BOLD SCRIPT SMALL N 1D4F8 o # MATHEMATICAL BOLD SCRIPT SMALL O 1D4F9 p # MATHEMATICAL BOLD SCRIPT SMALL P 1D4FA q # MATHEMATICAL BOLD SCRIPT SMALL Q 1D4FB r # MATHEMATICAL BOLD SCRIPT SMALL R 1D4FC s # MATHEMATICAL BOLD SCRIPT SMALL S 1D4FD t # MATHEMATICAL BOLD SCRIPT SMALL T 1D4FE u # MATHEMATICAL BOLD SCRIPT SMALL U 1D4FF v # MATHEMATICAL BOLD SCRIPT SMALL V 1D500 w # MATHEMATICAL BOLD SCRIPT SMALL W 1D501 x # MATHEMATICAL BOLD SCRIPT SMALL X 1D502 y # MATHEMATICAL BOLD SCRIPT SMALL Y 1D503 z # MATHEMATICAL BOLD SCRIPT SMALL Z 1D504 A # MATHEMATICAL FRAKTUR CAPITAL A 1D505 B # MATHEMATICAL FRAKTUR CAPITAL B 1D507 D # MATHEMATICAL FRAKTUR CAPITAL D 1D508 E # MATHEMATICAL FRAKTUR CAPITAL E 1D509 F # MATHEMATICAL FRAKTUR CAPITAL F 1D50A G # MATHEMATICAL FRAKTUR CAPITAL G 1D50D J # MATHEMATICAL FRAKTUR CAPITAL J 1D50E K # MATHEMATICAL FRAKTUR CAPITAL K 1D50F L # MATHEMATICAL FRAKTUR CAPITAL L 1D510 M # MATHEMATICAL FRAKTUR CAPITAL M 1D511 N # MATHEMATICAL FRAKTUR CAPITAL N 1D512 O # MATHEMATICAL FRAKTUR CAPITAL O 1D513 P # MATHEMATICAL FRAKTUR CAPITAL P 1D514 Q # MATHEMATICAL FRAKTUR CAPITAL Q 1D516 S # MATHEMATICAL FRAKTUR CAPITAL S 1D517 T # MATHEMATICAL FRAKTUR CAPITAL T 1D518 U # MATHEMATICAL FRAKTUR CAPITAL U 1D519 V # MATHEMATICAL FRAKTUR CAPITAL V 1D51A W # MATHEMATICAL FRAKTUR CAPITAL W 1D51B X # MATHEMATICAL FRAKTUR CAPITAL X 1D51C Y # MATHEMATICAL FRAKTUR CAPITAL Y 1D51E a # MATHEMATICAL FRAKTUR SMALL A 1D51F b # MATHEMATICAL FRAKTUR SMALL B 1D520 c # MATHEMATICAL FRAKTUR SMALL C 1D521 d # MATHEMATICAL FRAKTUR SMALL D 1D522 e # MATHEMATICAL FRAKTUR SMALL E 1D523 f # MATHEMATICAL FRAKTUR SMALL F 1D524 g # MATHEMATICAL FRAKTUR SMALL G 1D525 h # MATHEMATICAL FRAKTUR SMALL H 1D526 i # MATHEMATICAL FRAKTUR SMALL I 1D527 j # MATHEMATICAL FRAKTUR SMALL J 1D528 k # MATHEMATICAL FRAKTUR SMALL K 1D529 l # MATHEMATICAL FRAKTUR SMALL L 1D52A m # MATHEMATICAL FRAKTUR SMALL M 1D52B n # MATHEMATICAL FRAKTUR SMALL N 1D52C o # MATHEMATICAL FRAKTUR SMALL O 1D52D p # MATHEMATICAL FRAKTUR SMALL P 1D52E q # MATHEMATICAL FRAKTUR SMALL Q 1D52F r # MATHEMATICAL FRAKTUR SMALL R 1D530 s # MATHEMATICAL FRAKTUR SMALL S 1D531 t # MATHEMATICAL FRAKTUR SMALL T 1D532 u # MATHEMATICAL FRAKTUR SMALL U 1D533 v # MATHEMATICAL FRAKTUR SMALL V 1D534 w # MATHEMATICAL FRAKTUR SMALL W 1D535 x # MATHEMATICAL FRAKTUR SMALL X 1D536 y # MATHEMATICAL FRAKTUR SMALL Y 1D537 z # MATHEMATICAL FRAKTUR SMALL Z 1D538 A # MATHEMATICAL DOUBLE-STRUCK CAPITAL A 1D539 B # MATHEMATICAL DOUBLE-STRUCK CAPITAL B 1D53B D # MATHEMATICAL DOUBLE-STRUCK CAPITAL D 1D53C E # MATHEMATICAL DOUBLE-STRUCK CAPITAL E 1D53D F # MATHEMATICAL DOUBLE-STRUCK CAPITAL F 1D53E G # MATHEMATICAL DOUBLE-STRUCK CAPITAL G 1D540 I # MATHEMATICAL DOUBLE-STRUCK CAPITAL I 1D541 J # MATHEMATICAL DOUBLE-STRUCK CAPITAL J 1D542 K # MATHEMATICAL DOUBLE-STRUCK CAPITAL K 1D543 L # MATHEMATICAL DOUBLE-STRUCK CAPITAL L 1D544 M # MATHEMATICAL DOUBLE-STRUCK CAPITAL M 1D546 O # MATHEMATICAL DOUBLE-STRUCK CAPITAL O 1D54A S # MATHEMATICAL DOUBLE-STRUCK CAPITAL S 1D54B T # MATHEMATICAL DOUBLE-STRUCK CAPITAL T 1D54C U # MATHEMATICAL DOUBLE-STRUCK CAPITAL U 1D54D V # MATHEMATICAL DOUBLE-STRUCK CAPITAL V 1D54E W # MATHEMATICAL DOUBLE-STRUCK CAPITAL W 1D54F X # MATHEMATICAL DOUBLE-STRUCK CAPITAL X 1D550 Y # MATHEMATICAL DOUBLE-STRUCK CAPITAL Y 1D552 a # MATHEMATICAL DOUBLE-STRUCK SMALL A 1D553 b # MATHEMATICAL DOUBLE-STRUCK SMALL B 1D554 c # MATHEMATICAL DOUBLE-STRUCK SMALL C 1D555 d # MATHEMATICAL DOUBLE-STRUCK SMALL D 1D556 e # MATHEMATICAL DOUBLE-STRUCK SMALL E 1D557 f # MATHEMATICAL DOUBLE-STRUCK SMALL F 1D558 g # MATHEMATICAL DOUBLE-STRUCK SMALL G 1D559 h # MATHEMATICAL DOUBLE-STRUCK SMALL H 1D55A i # MATHEMATICAL DOUBLE-STRUCK SMALL I 1D55B j # MATHEMATICAL DOUBLE-STRUCK SMALL J 1D55C k # MATHEMATICAL DOUBLE-STRUCK SMALL K 1D55D l # MATHEMATICAL DOUBLE-STRUCK SMALL L 1D55E m # MATHEMATICAL DOUBLE-STRUCK SMALL M 1D55F n # MATHEMATICAL DOUBLE-STRUCK SMALL N 1D560 o # MATHEMATICAL DOUBLE-STRUCK SMALL O 1D561 p # MATHEMATICAL DOUBLE-STRUCK SMALL P 1D562 q # MATHEMATICAL DOUBLE-STRUCK SMALL Q 1D563 r # MATHEMATICAL DOUBLE-STRUCK SMALL R 1D564 s # MATHEMATICAL DOUBLE-STRUCK SMALL S 1D565 t # MATHEMATICAL DOUBLE-STRUCK SMALL T 1D566 u # MATHEMATICAL DOUBLE-STRUCK SMALL U 1D567 v # MATHEMATICAL DOUBLE-STRUCK SMALL V 1D568 w # MATHEMATICAL DOUBLE-STRUCK SMALL W 1D569 x # MATHEMATICAL DOUBLE-STRUCK SMALL X 1D56A y # MATHEMATICAL DOUBLE-STRUCK SMALL Y 1D56B z # MATHEMATICAL DOUBLE-STRUCK SMALL Z 1D56C A # MATHEMATICAL BOLD FRAKTUR CAPITAL A 1D56D B # MATHEMATICAL BOLD FRAKTUR CAPITAL B 1D56E C # MATHEMATICAL BOLD FRAKTUR CAPITAL C 1D56F D # MATHEMATICAL BOLD FRAKTUR CAPITAL D 1D570 E # MATHEMATICAL BOLD FRAKTUR CAPITAL E 1D571 F # MATHEMATICAL BOLD FRAKTUR CAPITAL F 1D572 G # MATHEMATICAL BOLD FRAKTUR CAPITAL G 1D573 H # MATHEMATICAL BOLD FRAKTUR CAPITAL H 1D574 I # MATHEMATICAL BOLD FRAKTUR CAPITAL I 1D575 J # MATHEMATICAL BOLD FRAKTUR CAPITAL J 1D576 K # MATHEMATICAL BOLD FRAKTUR CAPITAL K 1D577 L # MATHEMATICAL BOLD FRAKTUR CAPITAL L 1D578 M # MATHEMATICAL BOLD FRAKTUR CAPITAL M 1D579 N # MATHEMATICAL BOLD FRAKTUR CAPITAL N 1D57A O # MATHEMATICAL BOLD FRAKTUR CAPITAL O 1D57B P # MATHEMATICAL BOLD FRAKTUR CAPITAL P 1D57C Q # MATHEMATICAL BOLD FRAKTUR CAPITAL Q 1D57D R # MATHEMATICAL BOLD FRAKTUR CAPITAL R 1D57E S # MATHEMATICAL BOLD FRAKTUR CAPITAL S 1D57F T # MATHEMATICAL BOLD FRAKTUR CAPITAL T 1D580 U # MATHEMATICAL BOLD FRAKTUR CAPITAL U 1D581 V # MATHEMATICAL BOLD FRAKTUR CAPITAL V 1D582 W # MATHEMATICAL BOLD FRAKTUR CAPITAL W 1D583 X # MATHEMATICAL BOLD FRAKTUR CAPITAL X 1D584 Y # MATHEMATICAL BOLD FRAKTUR CAPITAL Y 1D585 Z # MATHEMATICAL BOLD FRAKTUR CAPITAL Z 1D586 a # MATHEMATICAL BOLD FRAKTUR SMALL A 1D587 b # MATHEMATICAL BOLD FRAKTUR SMALL B 1D588 c # MATHEMATICAL BOLD FRAKTUR SMALL C 1D589 d # MATHEMATICAL BOLD FRAKTUR SMALL D 1D58A e # MATHEMATICAL BOLD FRAKTUR SMALL E 1D58B f # MATHEMATICAL BOLD FRAKTUR SMALL F 1D58C g # MATHEMATICAL BOLD FRAKTUR SMALL G 1D58D h # MATHEMATICAL BOLD FRAKTUR SMALL H 1D58E i # MATHEMATICAL BOLD FRAKTUR SMALL I 1D58F j # MATHEMATICAL BOLD FRAKTUR SMALL J 1D590 k # MATHEMATICAL BOLD FRAKTUR SMALL K 1D591 l # MATHEMATICAL BOLD FRAKTUR SMALL L 1D592 m # MATHEMATICAL BOLD FRAKTUR SMALL M 1D593 n # MATHEMATICAL BOLD FRAKTUR SMALL N 1D594 o # MATHEMATICAL BOLD FRAKTUR SMALL O 1D595 p # MATHEMATICAL BOLD FRAKTUR SMALL P 1D596 q # MATHEMATICAL BOLD FRAKTUR SMALL Q 1D597 r # MATHEMATICAL BOLD FRAKTUR SMALL R 1D598 s # MATHEMATICAL BOLD FRAKTUR SMALL S 1D599 t # MATHEMATICAL BOLD FRAKTUR SMALL T 1D59A u # MATHEMATICAL BOLD FRAKTUR SMALL U 1D59B v # MATHEMATICAL BOLD FRAKTUR SMALL V 1D59C w # MATHEMATICAL BOLD FRAKTUR SMALL W 1D59D x # MATHEMATICAL BOLD FRAKTUR SMALL X 1D59E y # MATHEMATICAL BOLD FRAKTUR SMALL Y 1D59F z # MATHEMATICAL BOLD FRAKTUR SMALL Z 1D5A0 A # MATHEMATICAL SANS-SERIF CAPITAL A 1D5A1 B # MATHEMATICAL SANS-SERIF CAPITAL B 1D5A2 C # MATHEMATICAL SANS-SERIF CAPITAL C 1D5A3 D # MATHEMATICAL SANS-SERIF CAPITAL D 1D5A4 E # MATHEMATICAL SANS-SERIF CAPITAL E 1D5A5 F # MATHEMATICAL SANS-SERIF CAPITAL F 1D5A6 G # MATHEMATICAL SANS-SERIF CAPITAL G 1D5A7 H # MATHEMATICAL SANS-SERIF CAPITAL H 1D5A8 I # MATHEMATICAL SANS-SERIF CAPITAL I 1D5A9 J # MATHEMATICAL SANS-SERIF CAPITAL J 1D5AA K # MATHEMATICAL SANS-SERIF CAPITAL K 1D5AB L # MATHEMATICAL SANS-SERIF CAPITAL L 1D5AC M # MATHEMATICAL SANS-SERIF CAPITAL M 1D5AD N # MATHEMATICAL SANS-SERIF CAPITAL N 1D5AE O # MATHEMATICAL SANS-SERIF CAPITAL O 1D5AF P # MATHEMATICAL SANS-SERIF CAPITAL P 1D5B0 Q # MATHEMATICAL SANS-SERIF CAPITAL Q 1D5B1 R # MATHEMATICAL SANS-SERIF CAPITAL R 1D5B2 S # MATHEMATICAL SANS-SERIF CAPITAL S 1D5B3 T # MATHEMATICAL SANS-SERIF CAPITAL T 1D5B4 U # MATHEMATICAL SANS-SERIF CAPITAL U 1D5B5 V # MATHEMATICAL SANS-SERIF CAPITAL V 1D5B6 W # MATHEMATICAL SANS-SERIF CAPITAL W 1D5B7 X # MATHEMATICAL SANS-SERIF CAPITAL X 1D5B8 Y # MATHEMATICAL SANS-SERIF CAPITAL Y 1D5B9 Z # MATHEMATICAL SANS-SERIF CAPITAL Z 1D5BA a # MATHEMATICAL SANS-SERIF SMALL A 1D5BB b # MATHEMATICAL SANS-SERIF SMALL B 1D5BC c # MATHEMATICAL SANS-SERIF SMALL C 1D5BD d # MATHEMATICAL SANS-SERIF SMALL D 1D5BE e # MATHEMATICAL SANS-SERIF SMALL E 1D5BF f # MATHEMATICAL SANS-SERIF SMALL F 1D5C0 g # MATHEMATICAL SANS-SERIF SMALL G 1D5C1 h # MATHEMATICAL SANS-SERIF SMALL H 1D5C2 i # MATHEMATICAL SANS-SERIF SMALL I 1D5C3 j # MATHEMATICAL SANS-SERIF SMALL J 1D5C4 k # MATHEMATICAL SANS-SERIF SMALL K 1D5C5 l # MATHEMATICAL SANS-SERIF SMALL L 1D5C6 m # MATHEMATICAL SANS-SERIF SMALL M 1D5C7 n # MATHEMATICAL SANS-SERIF SMALL N 1D5C8 o # MATHEMATICAL SANS-SERIF SMALL O 1D5C9 p # MATHEMATICAL SANS-SERIF SMALL P 1D5CA q # MATHEMATICAL SANS-SERIF SMALL Q 1D5CB r # MATHEMATICAL SANS-SERIF SMALL R 1D5CC s # MATHEMATICAL SANS-SERIF SMALL S 1D5CD t # MATHEMATICAL SANS-SERIF SMALL T 1D5CE u # MATHEMATICAL SANS-SERIF SMALL U 1D5CF v # MATHEMATICAL SANS-SERIF SMALL V 1D5D0 w # MATHEMATICAL SANS-SERIF SMALL W 1D5D1 x # MATHEMATICAL SANS-SERIF SMALL X 1D5D2 y # MATHEMATICAL SANS-SERIF SMALL Y 1D5D3 z # MATHEMATICAL SANS-SERIF SMALL Z 1D5D4 A # MATHEMATICAL SANS-SERIF BOLD CAPITAL A 1D5D5 B # MATHEMATICAL SANS-SERIF BOLD CAPITAL B 1D5D6 C # MATHEMATICAL SANS-SERIF BOLD CAPITAL C 1D5D7 D # MATHEMATICAL SANS-SERIF BOLD CAPITAL D 1D5D8 E # MATHEMATICAL SANS-SERIF BOLD CAPITAL E 1D5D9 F # MATHEMATICAL SANS-SERIF BOLD CAPITAL F 1D5DA G # MATHEMATICAL SANS-SERIF BOLD CAPITAL G 1D5DB H # MATHEMATICAL SANS-SERIF BOLD CAPITAL H 1D5DC I # MATHEMATICAL SANS-SERIF BOLD CAPITAL I 1D5DD J # MATHEMATICAL SANS-SERIF BOLD CAPITAL J 1D5DE K # MATHEMATICAL SANS-SERIF BOLD CAPITAL K 1D5DF L # MATHEMATICAL SANS-SERIF BOLD CAPITAL L 1D5E0 M # MATHEMATICAL SANS-SERIF BOLD CAPITAL M 1D5E1 N # MATHEMATICAL SANS-SERIF BOLD CAPITAL N 1D5E2 O # MATHEMATICAL SANS-SERIF BOLD CAPITAL O 1D5E3 P # MATHEMATICAL SANS-SERIF BOLD CAPITAL P 1D5E4 Q # MATHEMATICAL SANS-SERIF BOLD CAPITAL Q 1D5E5 R # MATHEMATICAL SANS-SERIF BOLD CAPITAL R 1D5E6 S # MATHEMATICAL SANS-SERIF BOLD CAPITAL S 1D5E7 T # MATHEMATICAL SANS-SERIF BOLD CAPITAL T 1D5E8 U # MATHEMATICAL SANS-SERIF BOLD CAPITAL U 1D5E9 V # MATHEMATICAL SANS-SERIF BOLD CAPITAL V 1D5EA W # MATHEMATICAL SANS-SERIF BOLD CAPITAL W 1D5EB X # MATHEMATICAL SANS-SERIF BOLD CAPITAL X 1D5EC Y # MATHEMATICAL SANS-SERIF BOLD CAPITAL Y 1D5ED Z # MATHEMATICAL SANS-SERIF BOLD CAPITAL Z 1D5EE a # MATHEMATICAL SANS-SERIF BOLD SMALL A 1D5EF b # MATHEMATICAL SANS-SERIF BOLD SMALL B 1D5F0 c # MATHEMATICAL SANS-SERIF BOLD SMALL C 1D5F1 d # MATHEMATICAL SANS-SERIF BOLD SMALL D 1D5F2 e # MATHEMATICAL SANS-SERIF BOLD SMALL E 1D5F3 f # MATHEMATICAL SANS-SERIF BOLD SMALL F 1D5F4 g # MATHEMATICAL SANS-SERIF BOLD SMALL G 1D5F5 h # MATHEMATICAL SANS-SERIF BOLD SMALL H 1D5F6 i # MATHEMATICAL SANS-SERIF BOLD SMALL I 1D5F7 j # MATHEMATICAL SANS-SERIF BOLD SMALL J 1D5F8 k # MATHEMATICAL SANS-SERIF BOLD SMALL K 1D5F9 l # MATHEMATICAL SANS-SERIF BOLD SMALL L 1D5FA m # MATHEMATICAL SANS-SERIF BOLD SMALL M 1D5FB n # MATHEMATICAL SANS-SERIF BOLD SMALL N 1D5FC o # MATHEMATICAL SANS-SERIF BOLD SMALL O 1D5FD p # MATHEMATICAL SANS-SERIF BOLD SMALL P 1D5FE q # MATHEMATICAL SANS-SERIF BOLD SMALL Q 1D5FF r # MATHEMATICAL SANS-SERIF BOLD SMALL R 1D600 s # MATHEMATICAL SANS-SERIF BOLD SMALL S 1D601 t # MATHEMATICAL SANS-SERIF BOLD SMALL T 1D602 u # MATHEMATICAL SANS-SERIF BOLD SMALL U 1D603 v # MATHEMATICAL SANS-SERIF BOLD SMALL V 1D604 w # MATHEMATICAL SANS-SERIF BOLD SMALL W 1D605 x # MATHEMATICAL SANS-SERIF BOLD SMALL X 1D606 y # MATHEMATICAL SANS-SERIF BOLD SMALL Y 1D607 z # MATHEMATICAL SANS-SERIF BOLD SMALL Z 1D608 A # MATHEMATICAL SANS-SERIF ITALIC CAPITAL A 1D609 B # MATHEMATICAL SANS-SERIF ITALIC CAPITAL B 1D60A C # MATHEMATICAL SANS-SERIF ITALIC CAPITAL C 1D60B D # MATHEMATICAL SANS-SERIF ITALIC CAPITAL D 1D60C E # MATHEMATICAL SANS-SERIF ITALIC CAPITAL E 1D60D F # MATHEMATICAL SANS-SERIF ITALIC CAPITAL F 1D60E G # MATHEMATICAL SANS-SERIF ITALIC CAPITAL G 1D60F H # MATHEMATICAL SANS-SERIF ITALIC CAPITAL H 1D610 I # MATHEMATICAL SANS-SERIF ITALIC CAPITAL I 1D611 J # MATHEMATICAL SANS-SERIF ITALIC CAPITAL J 1D612 K # MATHEMATICAL SANS-SERIF ITALIC CAPITAL K 1D613 L # MATHEMATICAL SANS-SERIF ITALIC CAPITAL L 1D614 M # MATHEMATICAL SANS-SERIF ITALIC CAPITAL M 1D615 N # MATHEMATICAL SANS-SERIF ITALIC CAPITAL N 1D616 O # MATHEMATICAL SANS-SERIF ITALIC CAPITAL O 1D617 P # MATHEMATICAL SANS-SERIF ITALIC CAPITAL P 1D618 Q # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q 1D619 R # MATHEMATICAL SANS-SERIF ITALIC CAPITAL R 1D61A S # MATHEMATICAL SANS-SERIF ITALIC CAPITAL S 1D61B T # MATHEMATICAL SANS-SERIF ITALIC CAPITAL T 1D61C U # MATHEMATICAL SANS-SERIF ITALIC CAPITAL U 1D61D V # MATHEMATICAL SANS-SERIF ITALIC CAPITAL V 1D61E W # MATHEMATICAL SANS-SERIF ITALIC CAPITAL W 1D61F X # MATHEMATICAL SANS-SERIF ITALIC CAPITAL X 1D620 Y # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y 1D621 Z # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z 1D622 a # MATHEMATICAL SANS-SERIF ITALIC SMALL A 1D623 b # MATHEMATICAL SANS-SERIF ITALIC SMALL B 1D624 c # MATHEMATICAL SANS-SERIF ITALIC SMALL C 1D625 d # MATHEMATICAL SANS-SERIF ITALIC SMALL D 1D626 e # MATHEMATICAL SANS-SERIF ITALIC SMALL E 1D627 f # MATHEMATICAL SANS-SERIF ITALIC SMALL F 1D628 g # MATHEMATICAL SANS-SERIF ITALIC SMALL G 1D629 h # MATHEMATICAL SANS-SERIF ITALIC SMALL H 1D62A i # MATHEMATICAL SANS-SERIF ITALIC SMALL I 1D62B j # MATHEMATICAL SANS-SERIF ITALIC SMALL J 1D62C k # MATHEMATICAL SANS-SERIF ITALIC SMALL K 1D62D l # MATHEMATICAL SANS-SERIF ITALIC SMALL L 1D62E m # MATHEMATICAL SANS-SERIF ITALIC SMALL M 1D62F n # MATHEMATICAL SANS-SERIF ITALIC SMALL N 1D630 o # MATHEMATICAL SANS-SERIF ITALIC SMALL O 1D631 p # MATHEMATICAL SANS-SERIF ITALIC SMALL P 1D632 q # MATHEMATICAL SANS-SERIF ITALIC SMALL Q 1D633 r # MATHEMATICAL SANS-SERIF ITALIC SMALL R 1D634 s # MATHEMATICAL SANS-SERIF ITALIC SMALL S 1D635 t # MATHEMATICAL SANS-SERIF ITALIC SMALL T 1D636 u # MATHEMATICAL SANS-SERIF ITALIC SMALL U 1D637 v # MATHEMATICAL SANS-SERIF ITALIC SMALL V 1D638 w # MATHEMATICAL SANS-SERIF ITALIC SMALL W 1D639 x # MATHEMATICAL SANS-SERIF ITALIC SMALL X 1D63A y # MATHEMATICAL SANS-SERIF ITALIC SMALL Y 1D63B z # MATHEMATICAL SANS-SERIF ITALIC SMALL Z 1D63C A # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A 1D63D B # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B 1D63E C # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C 1D63F D # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D 1D640 E # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E 1D641 F # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F 1D642 G # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G 1D643 H # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H 1D644 I # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I 1D645 J # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J 1D646 K # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K 1D647 L # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L 1D648 M # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M 1D649 N # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N 1D64A O # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O 1D64B P # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P 1D64C Q # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q 1D64D R # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R 1D64E S # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S 1D64F T # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T 1D650 U # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U 1D651 V # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V 1D652 W # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W 1D653 X # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X 1D654 Y # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y 1D655 Z # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z 1D656 a # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A 1D657 b # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B 1D658 c # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C 1D659 d # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D 1D65A e # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E 1D65B f # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F 1D65C g # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G 1D65D h # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H 1D65E i # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I 1D65F j # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J 1D660 k # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K 1D661 l # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L 1D662 m # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M 1D663 n # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N 1D664 o # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O 1D665 p # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P 1D666 q # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q 1D667 r # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R 1D668 s # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S 1D669 t # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T 1D66A u # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U 1D66B v # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V 1D66C w # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W 1D66D x # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X 1D66E y # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y 1D66F z # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z 1D670 A # MATHEMATICAL MONOSPACE CAPITAL A 1D671 B # MATHEMATICAL MONOSPACE CAPITAL B 1D672 C # MATHEMATICAL MONOSPACE CAPITAL C 1D673 D # MATHEMATICAL MONOSPACE CAPITAL D 1D674 E # MATHEMATICAL MONOSPACE CAPITAL E 1D675 F # MATHEMATICAL MONOSPACE CAPITAL F 1D676 G # MATHEMATICAL MONOSPACE CAPITAL G 1D677 H # MATHEMATICAL MONOSPACE CAPITAL H 1D678 I # MATHEMATICAL MONOSPACE CAPITAL I 1D679 J # MATHEMATICAL MONOSPACE CAPITAL J 1D67A K # MATHEMATICAL MONOSPACE CAPITAL K 1D67B L # MATHEMATICAL MONOSPACE CAPITAL L 1D67C M # MATHEMATICAL MONOSPACE CAPITAL M 1D67D N # MATHEMATICAL MONOSPACE CAPITAL N 1D67E O # MATHEMATICAL MONOSPACE CAPITAL O 1D67F P # MATHEMATICAL MONOSPACE CAPITAL P 1D680 Q # MATHEMATICAL MONOSPACE CAPITAL Q 1D681 R # MATHEMATICAL MONOSPACE CAPITAL R 1D682 S # MATHEMATICAL MONOSPACE CAPITAL S 1D683 T # MATHEMATICAL MONOSPACE CAPITAL T 1D684 U # MATHEMATICAL MONOSPACE CAPITAL U 1D685 V # MATHEMATICAL MONOSPACE CAPITAL V 1D686 W # MATHEMATICAL MONOSPACE CAPITAL W 1D687 X # MATHEMATICAL MONOSPACE CAPITAL X 1D688 Y # MATHEMATICAL MONOSPACE CAPITAL Y 1D689 Z # MATHEMATICAL MONOSPACE CAPITAL Z 1D68A a # MATHEMATICAL MONOSPACE SMALL A 1D68B b # MATHEMATICAL MONOSPACE SMALL B 1D68C c # MATHEMATICAL MONOSPACE SMALL C 1D68D d # MATHEMATICAL MONOSPACE SMALL D 1D68E e # MATHEMATICAL MONOSPACE SMALL E 1D68F f # MATHEMATICAL MONOSPACE SMALL F 1D690 g # MATHEMATICAL MONOSPACE SMALL G 1D691 h # MATHEMATICAL MONOSPACE SMALL H 1D692 i # MATHEMATICAL MONOSPACE SMALL I 1D693 j # MATHEMATICAL MONOSPACE SMALL J 1D694 k # MATHEMATICAL MONOSPACE SMALL K 1D695 l # MATHEMATICAL MONOSPACE SMALL L 1D696 m # MATHEMATICAL MONOSPACE SMALL M 1D697 n # MATHEMATICAL MONOSPACE SMALL N 1D698 o # MATHEMATICAL MONOSPACE SMALL O 1D699 p # MATHEMATICAL MONOSPACE SMALL P 1D69A q # MATHEMATICAL MONOSPACE SMALL Q 1D69B r # MATHEMATICAL MONOSPACE SMALL R 1D69C s # MATHEMATICAL MONOSPACE SMALL S 1D69D t # MATHEMATICAL MONOSPACE SMALL T 1D69E u # MATHEMATICAL MONOSPACE SMALL U 1D69F v # MATHEMATICAL MONOSPACE SMALL V 1D6A0 w # MATHEMATICAL MONOSPACE SMALL W 1D6A1 x # MATHEMATICAL MONOSPACE SMALL X 1D6A2 y # MATHEMATICAL MONOSPACE SMALL Y 1D6A3 z # MATHEMATICAL MONOSPACE SMALL Z 1D6A8 Α # MATHEMATICAL BOLD CAPITAL ALPHA 1D6A9 Β # MATHEMATICAL BOLD CAPITAL BETA 1D6AA Γ # MATHEMATICAL BOLD CAPITAL GAMMA 1D6AB Δ # MATHEMATICAL BOLD CAPITAL DELTA 1D6AC Ε # MATHEMATICAL BOLD CAPITAL EPSILON 1D6AD Ζ # MATHEMATICAL BOLD CAPITAL ZETA 1D6AE Η # MATHEMATICAL BOLD CAPITAL ETA 1D6AF Θ # MATHEMATICAL BOLD CAPITAL THETA 1D6B0 Ι # MATHEMATICAL BOLD CAPITAL IOTA 1D6B1 Κ # MATHEMATICAL BOLD CAPITAL KAPPA 1D6B2 Λ # MATHEMATICAL BOLD CAPITAL LAMDA 1D6B3 Μ # MATHEMATICAL BOLD CAPITAL MU 1D6B4 Ν # MATHEMATICAL BOLD CAPITAL NU 1D6B5 Ξ # MATHEMATICAL BOLD CAPITAL XI 1D6B6 Ο # MATHEMATICAL BOLD CAPITAL OMICRON 1D6B7 Π # MATHEMATICAL BOLD CAPITAL PI 1D6B8 Ρ # MATHEMATICAL BOLD CAPITAL RHO 1D6B9 ϴ # MATHEMATICAL BOLD CAPITAL THETA SYMBOL 1D6BA Σ # MATHEMATICAL BOLD CAPITAL SIGMA 1D6BB Τ # MATHEMATICAL BOLD CAPITAL TAU 1D6BC Υ # MATHEMATICAL BOLD CAPITAL UPSILON 1D6BD Φ # MATHEMATICAL BOLD CAPITAL PHI 1D6BE Χ # MATHEMATICAL BOLD CAPITAL CHI 1D6BF Ψ # MATHEMATICAL BOLD CAPITAL PSI 1D6C0 Ω # MATHEMATICAL BOLD CAPITAL OMEGA 1D6C1 ∇ # MATHEMATICAL BOLD NABLA 1D6C2 α # MATHEMATICAL BOLD SMALL ALPHA 1D6C3 β # MATHEMATICAL BOLD SMALL BETA 1D6C4 γ # MATHEMATICAL BOLD SMALL GAMMA 1D6C5 δ # MATHEMATICAL BOLD SMALL DELTA 1D6C6 ε # MATHEMATICAL BOLD SMALL EPSILON 1D6C7 ζ # MATHEMATICAL BOLD SMALL ZETA 1D6C8 η # MATHEMATICAL BOLD SMALL ETA 1D6C9 θ # MATHEMATICAL BOLD SMALL THETA 1D6CA ι # MATHEMATICAL BOLD SMALL IOTA 1D6CB κ # MATHEMATICAL BOLD SMALL KAPPA 1D6CC λ # MATHEMATICAL BOLD SMALL LAMDA 1D6CD μ # MATHEMATICAL BOLD SMALL MU 1D6CE ν # MATHEMATICAL BOLD SMALL NU 1D6CF ξ # MATHEMATICAL BOLD SMALL XI 1D6D0 ο # MATHEMATICAL BOLD SMALL OMICRON 1D6D1 π # MATHEMATICAL BOLD SMALL PI 1D6D2 ρ # MATHEMATICAL BOLD SMALL RHO 1D6D3 ς # MATHEMATICAL BOLD SMALL FINAL SIGMA 1D6D4 σ # MATHEMATICAL BOLD SMALL SIGMA 1D6D5 τ # MATHEMATICAL BOLD SMALL TAU 1D6D6 υ # MATHEMATICAL BOLD SMALL UPSILON 1D6D7 φ # MATHEMATICAL BOLD SMALL PHI 1D6D8 χ # MATHEMATICAL BOLD SMALL CHI 1D6D9 ψ # MATHEMATICAL BOLD SMALL PSI 1D6DA ω # MATHEMATICAL BOLD SMALL OMEGA 1D6DB ∂ # MATHEMATICAL BOLD PARTIAL DIFFERENTIAL 1D6DC ϵ # MATHEMATICAL BOLD EPSILON SYMBOL 1D6DD ϑ # MATHEMATICAL BOLD THETA SYMBOL 1D6DE ϰ # MATHEMATICAL BOLD KAPPA SYMBOL 1D6DF ϕ # MATHEMATICAL BOLD PHI SYMBOL 1D6E0 ϱ # MATHEMATICAL BOLD RHO SYMBOL 1D6E1 ϖ # MATHEMATICAL BOLD PI SYMBOL 1D6E2 Α # MATHEMATICAL ITALIC CAPITAL ALPHA 1D6E3 Β # MATHEMATICAL ITALIC CAPITAL BETA 1D6E4 Γ # MATHEMATICAL ITALIC CAPITAL GAMMA 1D6E5 Δ # MATHEMATICAL ITALIC CAPITAL DELTA 1D6E6 Ε # MATHEMATICAL ITALIC CAPITAL EPSILON 1D6E7 Ζ # MATHEMATICAL ITALIC CAPITAL ZETA 1D6E8 Η # MATHEMATICAL ITALIC CAPITAL ETA 1D6E9 Θ # MATHEMATICAL ITALIC CAPITAL THETA 1D6EA Ι # MATHEMATICAL ITALIC CAPITAL IOTA 1D6EB Κ # MATHEMATICAL ITALIC CAPITAL KAPPA 1D6EC Λ # MATHEMATICAL ITALIC CAPITAL LAMDA 1D6ED Μ # MATHEMATICAL ITALIC CAPITAL MU 1D6EE Ν # MATHEMATICAL ITALIC CAPITAL NU 1D6EF Ξ # MATHEMATICAL ITALIC CAPITAL XI 1D6F0 Ο # MATHEMATICAL ITALIC CAPITAL OMICRON 1D6F1 Π # MATHEMATICAL ITALIC CAPITAL PI 1D6F2 Ρ # MATHEMATICAL ITALIC CAPITAL RHO 1D6F3 ϴ # MATHEMATICAL ITALIC CAPITAL THETA SYMBOL 1D6F4 Σ # MATHEMATICAL ITALIC CAPITAL SIGMA 1D6F5 Τ # MATHEMATICAL ITALIC CAPITAL TAU 1D6F6 Υ # MATHEMATICAL ITALIC CAPITAL UPSILON 1D6F7 Φ # MATHEMATICAL ITALIC CAPITAL PHI 1D6F8 Χ # MATHEMATICAL ITALIC CAPITAL CHI 1D6F9 Ψ # MATHEMATICAL ITALIC CAPITAL PSI 1D6FA Ω # MATHEMATICAL ITALIC CAPITAL OMEGA 1D6FB ∇ # MATHEMATICAL ITALIC NABLA 1D6FC α # MATHEMATICAL ITALIC SMALL ALPHA 1D6FD β # MATHEMATICAL ITALIC SMALL BETA 1D6FE γ # MATHEMATICAL ITALIC SMALL GAMMA 1D6FF δ # MATHEMATICAL ITALIC SMALL DELTA 1D700 ε # MATHEMATICAL ITALIC SMALL EPSILON 1D701 ζ # MATHEMATICAL ITALIC SMALL ZETA 1D702 η # MATHEMATICAL ITALIC SMALL ETA 1D703 θ # MATHEMATICAL ITALIC SMALL THETA 1D704 ι # MATHEMATICAL ITALIC SMALL IOTA 1D705 κ # MATHEMATICAL ITALIC SMALL KAPPA 1D706 λ # MATHEMATICAL ITALIC SMALL LAMDA 1D707 μ # MATHEMATICAL ITALIC SMALL MU 1D708 ν # MATHEMATICAL ITALIC SMALL NU 1D709 ξ # MATHEMATICAL ITALIC SMALL XI 1D70A ο # MATHEMATICAL ITALIC SMALL OMICRON 1D70B π # MATHEMATICAL ITALIC SMALL PI 1D70C ρ # MATHEMATICAL ITALIC SMALL RHO 1D70D ς # MATHEMATICAL ITALIC SMALL FINAL SIGMA 1D70E σ # MATHEMATICAL ITALIC SMALL SIGMA 1D70F τ # MATHEMATICAL ITALIC SMALL TAU 1D710 υ # MATHEMATICAL ITALIC SMALL UPSILON 1D711 φ # MATHEMATICAL ITALIC SMALL PHI 1D712 χ # MATHEMATICAL ITALIC SMALL CHI 1D713 ψ # MATHEMATICAL ITALIC SMALL PSI 1D714 ω # MATHEMATICAL ITALIC SMALL OMEGA 1D715 ∂ # MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL 1D716 ϵ # MATHEMATICAL ITALIC EPSILON SYMBOL 1D717 ϑ # MATHEMATICAL ITALIC THETA SYMBOL 1D718 ϰ # MATHEMATICAL ITALIC KAPPA SYMBOL 1D719 ϕ # MATHEMATICAL ITALIC PHI SYMBOL 1D71A ϱ # MATHEMATICAL ITALIC RHO SYMBOL 1D71B ϖ # MATHEMATICAL ITALIC PI SYMBOL 1D71C Α # MATHEMATICAL BOLD ITALIC CAPITAL ALPHA 1D71D Β # MATHEMATICAL BOLD ITALIC CAPITAL BETA 1D71E Γ # MATHEMATICAL BOLD ITALIC CAPITAL GAMMA 1D71F Δ # MATHEMATICAL BOLD ITALIC CAPITAL DELTA 1D720 Ε # MATHEMATICAL BOLD ITALIC CAPITAL EPSILON 1D721 Ζ # MATHEMATICAL BOLD ITALIC CAPITAL ZETA 1D722 Η # MATHEMATICAL BOLD ITALIC CAPITAL ETA 1D723 Θ # MATHEMATICAL BOLD ITALIC CAPITAL THETA 1D724 Ι # MATHEMATICAL BOLD ITALIC CAPITAL IOTA 1D725 Κ # MATHEMATICAL BOLD ITALIC CAPITAL KAPPA 1D726 Λ # MATHEMATICAL BOLD ITALIC CAPITAL LAMDA 1D727 Μ # MATHEMATICAL BOLD ITALIC CAPITAL MU 1D728 Ν # MATHEMATICAL BOLD ITALIC CAPITAL NU 1D729 Ξ # MATHEMATICAL BOLD ITALIC CAPITAL XI 1D72A Ο # MATHEMATICAL BOLD ITALIC CAPITAL OMICRON 1D72B Π # MATHEMATICAL BOLD ITALIC CAPITAL PI 1D72C Ρ # MATHEMATICAL BOLD ITALIC CAPITAL RHO 1D72D ϴ # MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL 1D72E Σ # MATHEMATICAL BOLD ITALIC CAPITAL SIGMA 1D72F Τ # MATHEMATICAL BOLD ITALIC CAPITAL TAU 1D730 Υ # MATHEMATICAL BOLD ITALIC CAPITAL UPSILON 1D731 Φ # MATHEMATICAL BOLD ITALIC CAPITAL PHI 1D732 Χ # MATHEMATICAL BOLD ITALIC CAPITAL CHI 1D733 Ψ # MATHEMATICAL BOLD ITALIC CAPITAL PSI 1D734 Ω # MATHEMATICAL BOLD ITALIC CAPITAL OMEGA 1D735 ∇ # MATHEMATICAL BOLD ITALIC NABLA 1D736 α # MATHEMATICAL BOLD ITALIC SMALL ALPHA 1D737 β # MATHEMATICAL BOLD ITALIC SMALL BETA 1D738 γ # MATHEMATICAL BOLD ITALIC SMALL GAMMA 1D739 δ # MATHEMATICAL BOLD ITALIC SMALL DELTA 1D73A ε # MATHEMATICAL BOLD ITALIC SMALL EPSILON 1D73B ζ # MATHEMATICAL BOLD ITALIC SMALL ZETA 1D73C η # MATHEMATICAL BOLD ITALIC SMALL ETA 1D73D θ # MATHEMATICAL BOLD ITALIC SMALL THETA 1D73E ι # MATHEMATICAL BOLD ITALIC SMALL IOTA 1D73F κ # MATHEMATICAL BOLD ITALIC SMALL KAPPA 1D740 λ # MATHEMATICAL BOLD ITALIC SMALL LAMDA 1D741 μ # MATHEMATICAL BOLD ITALIC SMALL MU 1D742 ν # MATHEMATICAL BOLD ITALIC SMALL NU 1D743 ξ # MATHEMATICAL BOLD ITALIC SMALL XI 1D744 ο # MATHEMATICAL BOLD ITALIC SMALL OMICRON 1D745 π # MATHEMATICAL BOLD ITALIC SMALL PI 1D746 ρ # MATHEMATICAL BOLD ITALIC SMALL RHO 1D747 ς # MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA 1D748 σ # MATHEMATICAL BOLD ITALIC SMALL SIGMA 1D749 τ # MATHEMATICAL BOLD ITALIC SMALL TAU 1D74A υ # MATHEMATICAL BOLD ITALIC SMALL UPSILON 1D74B φ # MATHEMATICAL BOLD ITALIC SMALL PHI 1D74C χ # MATHEMATICAL BOLD ITALIC SMALL CHI 1D74D ψ # MATHEMATICAL BOLD ITALIC SMALL PSI 1D74E ω # MATHEMATICAL BOLD ITALIC SMALL OMEGA 1D74F ∂ # MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL 1D750 ϵ # MATHEMATICAL BOLD ITALIC EPSILON SYMBOL 1D751 ϑ # MATHEMATICAL BOLD ITALIC THETA SYMBOL 1D752 ϰ # MATHEMATICAL BOLD ITALIC KAPPA SYMBOL 1D753 ϕ # MATHEMATICAL BOLD ITALIC PHI SYMBOL 1D754 ϱ # MATHEMATICAL BOLD ITALIC RHO SYMBOL 1D755 ϖ # MATHEMATICAL BOLD ITALIC PI SYMBOL 1D756 Α # MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA 1D757 Β # MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA 1D758 Γ # MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA 1D759 Δ # MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA 1D75A Ε # MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON 1D75B Ζ # MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA 1D75C Η # MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA 1D75D Θ # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA 1D75E Ι # MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA 1D75F Κ # MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA 1D760 Λ # MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA 1D761 Μ # MATHEMATICAL SANS-SERIF BOLD CAPITAL MU 1D762 Ν # MATHEMATICAL SANS-SERIF BOLD CAPITAL NU 1D763 Ξ # MATHEMATICAL SANS-SERIF BOLD CAPITAL XI 1D764 Ο # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON 1D765 Π # MATHEMATICAL SANS-SERIF BOLD CAPITAL PI 1D766 Ρ # MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO 1D767 ϴ # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL 1D768 Σ # MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA 1D769 Τ # MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU 1D76A Υ # MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON 1D76B Φ # MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI 1D76C Χ # MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI 1D76D Ψ # MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI 1D76E Ω # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA 1D76F ∇ # MATHEMATICAL SANS-SERIF BOLD NABLA 1D770 α # MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA 1D771 β # MATHEMATICAL SANS-SERIF BOLD SMALL BETA 1D772 γ # MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA 1D773 δ # MATHEMATICAL SANS-SERIF BOLD SMALL DELTA 1D774 ε # MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON 1D775 ζ # MATHEMATICAL SANS-SERIF BOLD SMALL ZETA 1D776 η # MATHEMATICAL SANS-SERIF BOLD SMALL ETA 1D777 θ # MATHEMATICAL SANS-SERIF BOLD SMALL THETA 1D778 ι # MATHEMATICAL SANS-SERIF BOLD SMALL IOTA 1D779 κ # MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA 1D77A λ # MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA 1D77B μ # MATHEMATICAL SANS-SERIF BOLD SMALL MU 1D77C ν # MATHEMATICAL SANS-SERIF BOLD SMALL NU 1D77D ξ # MATHEMATICAL SANS-SERIF BOLD SMALL XI 1D77E ο # MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON 1D77F π # MATHEMATICAL SANS-SERIF BOLD SMALL PI 1D780 ρ # MATHEMATICAL SANS-SERIF BOLD SMALL RHO 1D781 ς # MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA 1D782 σ # MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA 1D783 τ # MATHEMATICAL SANS-SERIF BOLD SMALL TAU 1D784 υ # MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON 1D785 φ # MATHEMATICAL SANS-SERIF BOLD SMALL PHI 1D786 χ # MATHEMATICAL SANS-SERIF BOLD SMALL CHI 1D787 ψ # MATHEMATICAL SANS-SERIF BOLD SMALL PSI 1D788 ω # MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA 1D789 ∂ # MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL 1D78A ϵ # MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL 1D78B ϑ # MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL 1D78C ϰ # MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL 1D78D ϕ # MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL 1D78E ϱ # MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL 1D78F ϖ # MATHEMATICAL SANS-SERIF BOLD PI SYMBOL 1D790 Α # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA 1D791 Β # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA 1D792 Γ # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA 1D793 Δ # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA 1D794 Ε # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON 1D795 Ζ # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA 1D796 Η # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA 1D797 Θ # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA 1D798 Ι # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA 1D799 Κ # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA 1D79A Λ # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA 1D79B Μ # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU 1D79C Ν # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU 1D79D Ξ # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI 1D79E Ο # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON 1D79F Π # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI 1D7A0 Ρ # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO 1D7A1 ϴ # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL 1D7A2 Σ # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA 1D7A3 Τ # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU 1D7A4 Υ # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON 1D7A5 Φ # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI 1D7A6 Χ # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI 1D7A7 Ψ # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI 1D7A8 Ω # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA 1D7A9 ∇ # MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA 1D7AA α # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA 1D7AB β # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA 1D7AC γ # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA 1D7AD δ # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA 1D7AE ε # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON 1D7AF ζ # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA 1D7B0 η # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA 1D7B1 θ # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA 1D7B2 ι # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA 1D7B3 κ # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA 1D7B4 λ # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA 1D7B5 μ # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU 1D7B6 ν # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU 1D7B7 ξ # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI 1D7B8 ο # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON 1D7B9 π # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI 1D7BA ρ # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO 1D7BB ς # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA 1D7BC σ # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA 1D7BD τ # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU 1D7BE υ # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON 1D7BF φ # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI 1D7C0 χ # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI 1D7C1 ψ # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI 1D7C2 ω # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA 1D7C3 ∂ # MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL 1D7C4 ϵ # MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL 1D7C5 ϑ # MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL 1D7C6 ϰ # MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL 1D7C7 ϕ # MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL 1D7C8 ϱ # MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL 1D7C9 ϖ # MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL 1D7CE 0 # MATHEMATICAL BOLD DIGIT ZERO 1D7CF 1 # MATHEMATICAL BOLD DIGIT ONE 1D7D0 2 # MATHEMATICAL BOLD DIGIT TWO 1D7D1 3 # MATHEMATICAL BOLD DIGIT THREE 1D7D2 4 # MATHEMATICAL BOLD DIGIT FOUR 1D7D3 5 # MATHEMATICAL BOLD DIGIT FIVE 1D7D4 6 # MATHEMATICAL BOLD DIGIT SIX 1D7D5 7 # MATHEMATICAL BOLD DIGIT SEVEN 1D7D6 8 # MATHEMATICAL BOLD DIGIT EIGHT 1D7D7 9 # MATHEMATICAL BOLD DIGIT NINE 1D7D8 0 # MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO 1D7D9 1 # MATHEMATICAL DOUBLE-STRUCK DIGIT ONE 1D7DA 2 # MATHEMATICAL DOUBLE-STRUCK DIGIT TWO 1D7DB 3 # MATHEMATICAL DOUBLE-STRUCK DIGIT THREE 1D7DC 4 # MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR 1D7DD 5 # MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE 1D7DE 6 # MATHEMATICAL DOUBLE-STRUCK DIGIT SIX 1D7DF 7 # MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN 1D7E0 8 # MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT 1D7E1 9 # MATHEMATICAL DOUBLE-STRUCK DIGIT NINE 1D7E2 0 # MATHEMATICAL SANS-SERIF DIGIT ZERO 1D7E3 1 # MATHEMATICAL SANS-SERIF DIGIT ONE 1D7E4 2 # MATHEMATICAL SANS-SERIF DIGIT TWO 1D7E5 3 # MATHEMATICAL SANS-SERIF DIGIT THREE 1D7E6 4 # MATHEMATICAL SANS-SERIF DIGIT FOUR 1D7E7 5 # MATHEMATICAL SANS-SERIF DIGIT FIVE 1D7E8 6 # MATHEMATICAL SANS-SERIF DIGIT SIX 1D7E9 7 # MATHEMATICAL SANS-SERIF DIGIT SEVEN 1D7EA 8 # MATHEMATICAL SANS-SERIF DIGIT EIGHT 1D7EB 9 # MATHEMATICAL SANS-SERIF DIGIT NINE 1D7EC 0 # MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO 1D7ED 1 # MATHEMATICAL SANS-SERIF BOLD DIGIT ONE 1D7EE 2 # MATHEMATICAL SANS-SERIF BOLD DIGIT TWO 1D7EF 3 # MATHEMATICAL SANS-SERIF BOLD DIGIT THREE 1D7F0 4 # MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR 1D7F1 5 # MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE 1D7F2 6 # MATHEMATICAL SANS-SERIF BOLD DIGIT SIX 1D7F3 7 # MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN 1D7F4 8 # MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT 1D7F5 9 # MATHEMATICAL SANS-SERIF BOLD DIGIT NINE 1D7F6 0 # MATHEMATICAL MONOSPACE DIGIT ZERO 1D7F7 1 # MATHEMATICAL MONOSPACE DIGIT ONE 1D7F8 2 # MATHEMATICAL MONOSPACE DIGIT TWO 1D7F9 3 # MATHEMATICAL MONOSPACE DIGIT THREE 1D7FA 4 # MATHEMATICAL MONOSPACE DIGIT FOUR 1D7FB 5 # MATHEMATICAL MONOSPACE DIGIT FIVE 1D7FC 6 # MATHEMATICAL MONOSPACE DIGIT SIX 1D7FD 7 # MATHEMATICAL MONOSPACE DIGIT SEVEN 1D7FE 8 # MATHEMATICAL MONOSPACE DIGIT EIGHT 1D7FF 9 # MATHEMATICAL MONOSPACE DIGIT NINE 2F800 丽 # CJK COMPATIBILITY IDEOGRAPH-2F800 2F801 丸 # CJK COMPATIBILITY IDEOGRAPH-2F801 2F802 乁 # CJK COMPATIBILITY IDEOGRAPH-2F802 2F803 𠄢 # CJK COMPATIBILITY IDEOGRAPH-2F803 2F804 你 # CJK COMPATIBILITY IDEOGRAPH-2F804 2F805 侮 # CJK COMPATIBILITY IDEOGRAPH-2F805 2F806 侻 # CJK COMPATIBILITY IDEOGRAPH-2F806 2F807 倂 # CJK COMPATIBILITY IDEOGRAPH-2F807 2F808 偺 # CJK COMPATIBILITY IDEOGRAPH-2F808 2F809 備 # CJK COMPATIBILITY IDEOGRAPH-2F809 2F80A 僧 # CJK COMPATIBILITY IDEOGRAPH-2F80A 2F80B 像 # CJK COMPATIBILITY IDEOGRAPH-2F80B 2F80C 㒞 # CJK COMPATIBILITY IDEOGRAPH-2F80C 2F80D 𠘺 # CJK COMPATIBILITY IDEOGRAPH-2F80D 2F80E 免 # CJK COMPATIBILITY IDEOGRAPH-2F80E 2F80F 兔 # CJK COMPATIBILITY IDEOGRAPH-2F80F 2F810 兤 # CJK COMPATIBILITY IDEOGRAPH-2F810 2F811 具 # CJK COMPATIBILITY IDEOGRAPH-2F811 2F812 𠔜 # CJK COMPATIBILITY IDEOGRAPH-2F812 2F813 㒹 # CJK COMPATIBILITY IDEOGRAPH-2F813 2F814 內 # CJK COMPATIBILITY IDEOGRAPH-2F814 2F815 再 # CJK COMPATIBILITY IDEOGRAPH-2F815 2F816 𠕋 # CJK COMPATIBILITY IDEOGRAPH-2F816 2F817 冗 # CJK COMPATIBILITY IDEOGRAPH-2F817 2F818 冤 # CJK COMPATIBILITY IDEOGRAPH-2F818 2F819 仌 # CJK COMPATIBILITY IDEOGRAPH-2F819 2F81A 冬 # CJK COMPATIBILITY IDEOGRAPH-2F81A 2F81B 况 # CJK COMPATIBILITY IDEOGRAPH-2F81B 2F81C 𩇟 # CJK COMPATIBILITY IDEOGRAPH-2F81C 2F81D 凵 # CJK COMPATIBILITY IDEOGRAPH-2F81D 2F81E 刃 # CJK COMPATIBILITY IDEOGRAPH-2F81E 2F81F 㓟 # CJK COMPATIBILITY IDEOGRAPH-2F81F 2F820 刻 # CJK COMPATIBILITY IDEOGRAPH-2F820 2F821 剆 # CJK COMPATIBILITY IDEOGRAPH-2F821 2F822 割 # CJK COMPATIBILITY IDEOGRAPH-2F822 2F823 剷 # CJK COMPATIBILITY IDEOGRAPH-2F823 2F824 㔕 # CJK COMPATIBILITY IDEOGRAPH-2F824 2F825 勇 # CJK COMPATIBILITY IDEOGRAPH-2F825 2F826 勉 # CJK COMPATIBILITY IDEOGRAPH-2F826 2F827 勤 # CJK COMPATIBILITY IDEOGRAPH-2F827 2F828 勺 # CJK COMPATIBILITY IDEOGRAPH-2F828 2F829 包 # CJK COMPATIBILITY IDEOGRAPH-2F829 2F82A 匆 # CJK COMPATIBILITY IDEOGRAPH-2F82A 2F82B 北 # CJK COMPATIBILITY IDEOGRAPH-2F82B 2F82C 卉 # CJK COMPATIBILITY IDEOGRAPH-2F82C 2F82D 卑 # CJK COMPATIBILITY IDEOGRAPH-2F82D 2F82E 博 # CJK COMPATIBILITY IDEOGRAPH-2F82E 2F82F 即 # CJK COMPATIBILITY IDEOGRAPH-2F82F 2F830 卽 # CJK COMPATIBILITY IDEOGRAPH-2F830 2F831 卿 # CJK COMPATIBILITY IDEOGRAPH-2F831 2F832 卿 # CJK COMPATIBILITY IDEOGRAPH-2F832 2F833 卿 # CJK COMPATIBILITY IDEOGRAPH-2F833 2F834 𠨬 # CJK COMPATIBILITY IDEOGRAPH-2F834 2F835 灰 # CJK COMPATIBILITY IDEOGRAPH-2F835 2F836 及 # CJK COMPATIBILITY IDEOGRAPH-2F836 2F837 叟 # CJK COMPATIBILITY IDEOGRAPH-2F837 2F838 𠭣 # CJK COMPATIBILITY IDEOGRAPH-2F838 2F839 叫 # CJK COMPATIBILITY IDEOGRAPH-2F839 2F83A 叱 # CJK COMPATIBILITY IDEOGRAPH-2F83A 2F83B 吆 # CJK COMPATIBILITY IDEOGRAPH-2F83B 2F83C 咞 # CJK COMPATIBILITY IDEOGRAPH-2F83C 2F83D 吸 # CJK COMPATIBILITY IDEOGRAPH-2F83D 2F83E 呈 # CJK COMPATIBILITY IDEOGRAPH-2F83E 2F83F 周 # CJK COMPATIBILITY IDEOGRAPH-2F83F 2F840 咢 # CJK COMPATIBILITY IDEOGRAPH-2F840 2F841 哶 # CJK COMPATIBILITY IDEOGRAPH-2F841 2F842 唐 # CJK COMPATIBILITY IDEOGRAPH-2F842 2F843 啓 # CJK COMPATIBILITY IDEOGRAPH-2F843 2F844 啣 # CJK COMPATIBILITY IDEOGRAPH-2F844 2F845 善 # CJK COMPATIBILITY IDEOGRAPH-2F845 2F846 善 # CJK COMPATIBILITY IDEOGRAPH-2F846 2F847 喙 # CJK COMPATIBILITY IDEOGRAPH-2F847 2F848 喫 # CJK COMPATIBILITY IDEOGRAPH-2F848 2F849 喳 # CJK COMPATIBILITY IDEOGRAPH-2F849 2F84A 嗂 # CJK COMPATIBILITY IDEOGRAPH-2F84A 2F84B 圖 # CJK COMPATIBILITY IDEOGRAPH-2F84B 2F84C 嘆 # CJK COMPATIBILITY IDEOGRAPH-2F84C 2F84D 圗 # CJK COMPATIBILITY IDEOGRAPH-2F84D 2F84E 噑 # CJK COMPATIBILITY IDEOGRAPH-2F84E 2F84F 噴 # CJK COMPATIBILITY IDEOGRAPH-2F84F 2F850 切 # CJK COMPATIBILITY IDEOGRAPH-2F850 2F851 壮 # CJK COMPATIBILITY IDEOGRAPH-2F851 2F852 城 # CJK COMPATIBILITY IDEOGRAPH-2F852 2F853 埴 # CJK COMPATIBILITY IDEOGRAPH-2F853 2F854 堍 # CJK COMPATIBILITY IDEOGRAPH-2F854 2F855 型 # CJK COMPATIBILITY IDEOGRAPH-2F855 2F856 堲 # CJK COMPATIBILITY IDEOGRAPH-2F856 2F857 報 # CJK COMPATIBILITY IDEOGRAPH-2F857 2F858 墬 # CJK COMPATIBILITY IDEOGRAPH-2F858 2F859 𡓤 # CJK COMPATIBILITY IDEOGRAPH-2F859 2F85A 売 # CJK COMPATIBILITY IDEOGRAPH-2F85A 2F85B 壷 # CJK COMPATIBILITY IDEOGRAPH-2F85B 2F85C 夆 # CJK COMPATIBILITY IDEOGRAPH-2F85C 2F85D 多 # CJK COMPATIBILITY IDEOGRAPH-2F85D 2F85E 夢 # CJK COMPATIBILITY IDEOGRAPH-2F85E 2F85F 奢 # CJK COMPATIBILITY IDEOGRAPH-2F85F 2F860 𡚨 # CJK COMPATIBILITY IDEOGRAPH-2F860 2F861 𡛪 # CJK COMPATIBILITY IDEOGRAPH-2F861 2F862 姬 # CJK COMPATIBILITY IDEOGRAPH-2F862 2F863 娛 # CJK COMPATIBILITY IDEOGRAPH-2F863 2F864 娧 # CJK COMPATIBILITY IDEOGRAPH-2F864 2F865 姘 # CJK COMPATIBILITY IDEOGRAPH-2F865 2F866 婦 # CJK COMPATIBILITY IDEOGRAPH-2F866 2F867 㛮 # CJK COMPATIBILITY IDEOGRAPH-2F867 2F868 㛼 # CJK COMPATIBILITY IDEOGRAPH-2F868 2F869 嬈 # CJK COMPATIBILITY IDEOGRAPH-2F869 2F86A 嬾 # CJK COMPATIBILITY IDEOGRAPH-2F86A 2F86B 嬾 # CJK COMPATIBILITY IDEOGRAPH-2F86B 2F86C 𡧈 # CJK COMPATIBILITY IDEOGRAPH-2F86C 2F86D 寃 # CJK COMPATIBILITY IDEOGRAPH-2F86D 2F86E 寘 # CJK COMPATIBILITY IDEOGRAPH-2F86E 2F86F 寧 # CJK COMPATIBILITY IDEOGRAPH-2F86F 2F870 寳 # CJK COMPATIBILITY IDEOGRAPH-2F870 2F871 𡬘 # CJK COMPATIBILITY IDEOGRAPH-2F871 2F872 寿 # CJK COMPATIBILITY IDEOGRAPH-2F872 2F873 将 # CJK COMPATIBILITY IDEOGRAPH-2F873 2F874 当 # CJK COMPATIBILITY IDEOGRAPH-2F874 2F875 尢 # CJK COMPATIBILITY IDEOGRAPH-2F875 2F876 㞁 # CJK COMPATIBILITY IDEOGRAPH-2F876 2F877 屠 # CJK COMPATIBILITY IDEOGRAPH-2F877 2F878 屮 # CJK COMPATIBILITY IDEOGRAPH-2F878 2F879 峀 # CJK COMPATIBILITY IDEOGRAPH-2F879 2F87A 岍 # CJK COMPATIBILITY IDEOGRAPH-2F87A 2F87B 𡷤 # CJK COMPATIBILITY IDEOGRAPH-2F87B 2F87C 嵃 # CJK COMPATIBILITY IDEOGRAPH-2F87C 2F87D 𡷦 # CJK COMPATIBILITY IDEOGRAPH-2F87D 2F87E 嵮 # CJK COMPATIBILITY IDEOGRAPH-2F87E 2F87F 嵫 # CJK COMPATIBILITY IDEOGRAPH-2F87F 2F880 嵼 # CJK COMPATIBILITY IDEOGRAPH-2F880 2F881 巡 # CJK COMPATIBILITY IDEOGRAPH-2F881 2F882 巢 # CJK COMPATIBILITY IDEOGRAPH-2F882 2F883 㠯 # CJK COMPATIBILITY IDEOGRAPH-2F883 2F884 巽 # CJK COMPATIBILITY IDEOGRAPH-2F884 2F885 帨 # CJK COMPATIBILITY IDEOGRAPH-2F885 2F886 帽 # CJK COMPATIBILITY IDEOGRAPH-2F886 2F887 幩 # CJK COMPATIBILITY IDEOGRAPH-2F887 2F888 㡢 # CJK COMPATIBILITY IDEOGRAPH-2F888 2F889 𢆃 # CJK COMPATIBILITY IDEOGRAPH-2F889 2F88A 㡼 # CJK COMPATIBILITY IDEOGRAPH-2F88A 2F88B 庰 # CJK COMPATIBILITY IDEOGRAPH-2F88B 2F88C 庳 # CJK COMPATIBILITY IDEOGRAPH-2F88C 2F88D 庶 # CJK COMPATIBILITY IDEOGRAPH-2F88D 2F88E 廊 # CJK COMPATIBILITY IDEOGRAPH-2F88E 2F88F 𪎒 # CJK COMPATIBILITY IDEOGRAPH-2F88F 2F890 廾 # CJK COMPATIBILITY IDEOGRAPH-2F890 2F891 𢌱 # CJK COMPATIBILITY IDEOGRAPH-2F891 2F892 𢌱 # CJK COMPATIBILITY IDEOGRAPH-2F892 2F893 舁 # CJK COMPATIBILITY IDEOGRAPH-2F893 2F894 弢 # CJK COMPATIBILITY IDEOGRAPH-2F894 2F895 弢 # CJK COMPATIBILITY IDEOGRAPH-2F895 2F896 㣇 # CJK COMPATIBILITY IDEOGRAPH-2F896 2F897 𣊸 # CJK COMPATIBILITY IDEOGRAPH-2F897 2F898 𦇚 # CJK COMPATIBILITY IDEOGRAPH-2F898 2F899 形 # CJK COMPATIBILITY IDEOGRAPH-2F899 2F89A 彫 # CJK COMPATIBILITY IDEOGRAPH-2F89A 2F89B 㣣 # CJK COMPATIBILITY IDEOGRAPH-2F89B 2F89C 徚 # CJK COMPATIBILITY IDEOGRAPH-2F89C 2F89D 忍 # CJK COMPATIBILITY IDEOGRAPH-2F89D 2F89E 志 # CJK COMPATIBILITY IDEOGRAPH-2F89E 2F89F 忹 # CJK COMPATIBILITY IDEOGRAPH-2F89F 2F8A0 悁 # CJK COMPATIBILITY IDEOGRAPH-2F8A0 2F8A1 㤺 # CJK COMPATIBILITY IDEOGRAPH-2F8A1 2F8A2 㤜 # CJK COMPATIBILITY IDEOGRAPH-2F8A2 2F8A3 悔 # CJK COMPATIBILITY IDEOGRAPH-2F8A3 2F8A4 𢛔 # CJK COMPATIBILITY IDEOGRAPH-2F8A4 2F8A5 惇 # CJK COMPATIBILITY IDEOGRAPH-2F8A5 2F8A6 慈 # CJK COMPATIBILITY IDEOGRAPH-2F8A6 2F8A7 慌 # CJK COMPATIBILITY IDEOGRAPH-2F8A7 2F8A8 慎 # CJK COMPATIBILITY IDEOGRAPH-2F8A8 2F8A9 慌 # CJK COMPATIBILITY IDEOGRAPH-2F8A9 2F8AA 慺 # CJK COMPATIBILITY IDEOGRAPH-2F8AA 2F8AB 憎 # CJK COMPATIBILITY IDEOGRAPH-2F8AB 2F8AC 憲 # CJK COMPATIBILITY IDEOGRAPH-2F8AC 2F8AD 憤 # CJK COMPATIBILITY IDEOGRAPH-2F8AD 2F8AE 憯 # CJK COMPATIBILITY IDEOGRAPH-2F8AE 2F8AF 懞 # CJK COMPATIBILITY IDEOGRAPH-2F8AF 2F8B0 懲 # CJK COMPATIBILITY IDEOGRAPH-2F8B0 2F8B1 懶 # CJK COMPATIBILITY IDEOGRAPH-2F8B1 2F8B2 成 # CJK COMPATIBILITY IDEOGRAPH-2F8B2 2F8B3 戛 # CJK COMPATIBILITY IDEOGRAPH-2F8B3 2F8B4 扝 # CJK COMPATIBILITY IDEOGRAPH-2F8B4 2F8B5 抱 # CJK COMPATIBILITY IDEOGRAPH-2F8B5 2F8B6 拔 # CJK COMPATIBILITY IDEOGRAPH-2F8B6 2F8B7 捐 # CJK COMPATIBILITY IDEOGRAPH-2F8B7 2F8B8 𢬌 # CJK COMPATIBILITY IDEOGRAPH-2F8B8 2F8B9 挽 # CJK COMPATIBILITY IDEOGRAPH-2F8B9 2F8BA 拼 # CJK COMPATIBILITY IDEOGRAPH-2F8BA 2F8BB 捨 # CJK COMPATIBILITY IDEOGRAPH-2F8BB 2F8BC 掃 # CJK COMPATIBILITY IDEOGRAPH-2F8BC 2F8BD 揤 # CJK COMPATIBILITY IDEOGRAPH-2F8BD 2F8BE 𢯱 # CJK COMPATIBILITY IDEOGRAPH-2F8BE 2F8BF 搢 # CJK COMPATIBILITY IDEOGRAPH-2F8BF 2F8C0 揅 # CJK COMPATIBILITY IDEOGRAPH-2F8C0 2F8C1 掩 # CJK COMPATIBILITY IDEOGRAPH-2F8C1 2F8C2 㨮 # CJK COMPATIBILITY IDEOGRAPH-2F8C2 2F8C3 摩 # CJK COMPATIBILITY IDEOGRAPH-2F8C3 2F8C4 摾 # CJK COMPATIBILITY IDEOGRAPH-2F8C4 2F8C5 撝 # CJK COMPATIBILITY IDEOGRAPH-2F8C5 2F8C6 摷 # CJK COMPATIBILITY IDEOGRAPH-2F8C6 2F8C7 㩬 # CJK COMPATIBILITY IDEOGRAPH-2F8C7 2F8C8 敏 # CJK COMPATIBILITY IDEOGRAPH-2F8C8 2F8C9 敬 # CJK COMPATIBILITY IDEOGRAPH-2F8C9 2F8CA 𣀊 # CJK COMPATIBILITY IDEOGRAPH-2F8CA 2F8CB 旣 # CJK COMPATIBILITY IDEOGRAPH-2F8CB 2F8CC 書 # CJK COMPATIBILITY IDEOGRAPH-2F8CC 2F8CD 晉 # CJK COMPATIBILITY IDEOGRAPH-2F8CD 2F8CE 㬙 # CJK COMPATIBILITY IDEOGRAPH-2F8CE 2F8CF 暑 # CJK COMPATIBILITY IDEOGRAPH-2F8CF 2F8D0 㬈 # CJK COMPATIBILITY IDEOGRAPH-2F8D0 2F8D1 㫤 # CJK COMPATIBILITY IDEOGRAPH-2F8D1 2F8D2 冒 # CJK COMPATIBILITY IDEOGRAPH-2F8D2 2F8D3 冕 # CJK COMPATIBILITY IDEOGRAPH-2F8D3 2F8D4 最 # CJK COMPATIBILITY IDEOGRAPH-2F8D4 2F8D5 暜 # CJK COMPATIBILITY IDEOGRAPH-2F8D5 2F8D6 肭 # CJK COMPATIBILITY IDEOGRAPH-2F8D6 2F8D7 䏙 # CJK COMPATIBILITY IDEOGRAPH-2F8D7 2F8D8 朗 # CJK COMPATIBILITY IDEOGRAPH-2F8D8 2F8D9 望 # CJK COMPATIBILITY IDEOGRAPH-2F8D9 2F8DA 朡 # CJK COMPATIBILITY IDEOGRAPH-2F8DA 2F8DB 杞 # CJK COMPATIBILITY IDEOGRAPH-2F8DB 2F8DC 杓 # CJK COMPATIBILITY IDEOGRAPH-2F8DC 2F8DD 𣏃 # CJK COMPATIBILITY IDEOGRAPH-2F8DD 2F8DE 㭉 # CJK COMPATIBILITY IDEOGRAPH-2F8DE 2F8DF 柺 # CJK COMPATIBILITY IDEOGRAPH-2F8DF 2F8E0 枅 # CJK COMPATIBILITY IDEOGRAPH-2F8E0 2F8E1 桒 # CJK COMPATIBILITY IDEOGRAPH-2F8E1 2F8E2 梅 # CJK COMPATIBILITY IDEOGRAPH-2F8E2 2F8E3 𣑭 # CJK COMPATIBILITY IDEOGRAPH-2F8E3 2F8E4 梎 # CJK COMPATIBILITY IDEOGRAPH-2F8E4 2F8E5 栟 # CJK COMPATIBILITY IDEOGRAPH-2F8E5 2F8E6 椔 # CJK COMPATIBILITY IDEOGRAPH-2F8E6 2F8E7 㮝 # CJK COMPATIBILITY IDEOGRAPH-2F8E7 2F8E8 楂 # CJK COMPATIBILITY IDEOGRAPH-2F8E8 2F8E9 榣 # CJK COMPATIBILITY IDEOGRAPH-2F8E9 2F8EA 槪 # CJK COMPATIBILITY IDEOGRAPH-2F8EA 2F8EB 檨 # CJK COMPATIBILITY IDEOGRAPH-2F8EB 2F8EC 𣚣 # CJK COMPATIBILITY IDEOGRAPH-2F8EC 2F8ED 櫛 # CJK COMPATIBILITY IDEOGRAPH-2F8ED 2F8EE 㰘 # CJK COMPATIBILITY IDEOGRAPH-2F8EE 2F8EF 次 # CJK COMPATIBILITY IDEOGRAPH-2F8EF 2F8F0 𣢧 # CJK COMPATIBILITY IDEOGRAPH-2F8F0 2F8F1 歔 # CJK COMPATIBILITY IDEOGRAPH-2F8F1 2F8F2 㱎 # CJK COMPATIBILITY IDEOGRAPH-2F8F2 2F8F3 歲 # CJK COMPATIBILITY IDEOGRAPH-2F8F3 2F8F4 殟 # CJK COMPATIBILITY IDEOGRAPH-2F8F4 2F8F5 殺 # CJK COMPATIBILITY IDEOGRAPH-2F8F5 2F8F6 殻 # CJK COMPATIBILITY IDEOGRAPH-2F8F6 2F8F7 𣪍 # CJK COMPATIBILITY IDEOGRAPH-2F8F7 2F8F8 𡴋 # CJK COMPATIBILITY IDEOGRAPH-2F8F8 2F8F9 𣫺 # CJK COMPATIBILITY IDEOGRAPH-2F8F9 2F8FA 汎 # CJK COMPATIBILITY IDEOGRAPH-2F8FA 2F8FB 𣲼 # CJK COMPATIBILITY IDEOGRAPH-2F8FB 2F8FC 沿 # CJK COMPATIBILITY IDEOGRAPH-2F8FC 2F8FD 泍 # CJK COMPATIBILITY IDEOGRAPH-2F8FD 2F8FE 汧 # CJK COMPATIBILITY IDEOGRAPH-2F8FE 2F8FF 洖 # CJK COMPATIBILITY IDEOGRAPH-2F8FF 2F900 派 # CJK COMPATIBILITY IDEOGRAPH-2F900 2F901 海 # CJK COMPATIBILITY IDEOGRAPH-2F901 2F902 流 # CJK COMPATIBILITY IDEOGRAPH-2F902 2F903 浩 # CJK COMPATIBILITY IDEOGRAPH-2F903 2F904 浸 # CJK COMPATIBILITY IDEOGRAPH-2F904 2F905 涅 # CJK COMPATIBILITY IDEOGRAPH-2F905 2F906 𣴞 # CJK COMPATIBILITY IDEOGRAPH-2F906 2F907 洴 # CJK COMPATIBILITY IDEOGRAPH-2F907 2F908 港 # CJK COMPATIBILITY IDEOGRAPH-2F908 2F909 湮 # CJK COMPATIBILITY IDEOGRAPH-2F909 2F90A 㴳 # CJK COMPATIBILITY IDEOGRAPH-2F90A 2F90B 滋 # CJK COMPATIBILITY IDEOGRAPH-2F90B 2F90C 滇 # CJK COMPATIBILITY IDEOGRAPH-2F90C 2F90D 𣻑 # CJK COMPATIBILITY IDEOGRAPH-2F90D 2F90E 淹 # CJK COMPATIBILITY IDEOGRAPH-2F90E 2F90F 潮 # CJK COMPATIBILITY IDEOGRAPH-2F90F 2F910 𣽞 # CJK COMPATIBILITY IDEOGRAPH-2F910 2F911 𣾎 # CJK COMPATIBILITY IDEOGRAPH-2F911 2F912 濆 # CJK COMPATIBILITY IDEOGRAPH-2F912 2F913 瀹 # CJK COMPATIBILITY IDEOGRAPH-2F913 2F914 瀞 # CJK COMPATIBILITY IDEOGRAPH-2F914 2F915 瀛 # CJK COMPATIBILITY IDEOGRAPH-2F915 2F916 㶖 # CJK COMPATIBILITY IDEOGRAPH-2F916 2F917 灊 # CJK COMPATIBILITY IDEOGRAPH-2F917 2F918 災 # CJK COMPATIBILITY IDEOGRAPH-2F918 2F919 灷 # CJK COMPATIBILITY IDEOGRAPH-2F919 2F91A 炭 # CJK COMPATIBILITY IDEOGRAPH-2F91A 2F91B 𠔥 # CJK COMPATIBILITY IDEOGRAPH-2F91B 2F91C 煅 # CJK COMPATIBILITY IDEOGRAPH-2F91C 2F91D 𤉣 # CJK COMPATIBILITY IDEOGRAPH-2F91D 2F91E 熜 # CJK COMPATIBILITY IDEOGRAPH-2F91E 2F91F 𤎫 # CJK COMPATIBILITY IDEOGRAPH-2F91F 2F920 爨 # CJK COMPATIBILITY IDEOGRAPH-2F920 2F921 爵 # CJK COMPATIBILITY IDEOGRAPH-2F921 2F922 牐 # CJK COMPATIBILITY IDEOGRAPH-2F922 2F923 𤘈 # CJK COMPATIBILITY IDEOGRAPH-2F923 2F924 犀 # CJK COMPATIBILITY IDEOGRAPH-2F924 2F925 犕 # CJK COMPATIBILITY IDEOGRAPH-2F925 2F926 𤜵 # CJK COMPATIBILITY IDEOGRAPH-2F926 2F927 𤠔 # CJK COMPATIBILITY IDEOGRAPH-2F927 2F928 獺 # CJK COMPATIBILITY IDEOGRAPH-2F928 2F929 王 # CJK COMPATIBILITY IDEOGRAPH-2F929 2F92A 㺬 # CJK COMPATIBILITY IDEOGRAPH-2F92A 2F92B 玥 # CJK COMPATIBILITY IDEOGRAPH-2F92B 2F92C 㺸 # CJK COMPATIBILITY IDEOGRAPH-2F92C 2F92D 㺸 # CJK COMPATIBILITY IDEOGRAPH-2F92D 2F92E 瑇 # CJK COMPATIBILITY IDEOGRAPH-2F92E 2F92F 瑜 # CJK COMPATIBILITY IDEOGRAPH-2F92F 2F930 瑱 # CJK COMPATIBILITY IDEOGRAPH-2F930 2F931 璅 # CJK COMPATIBILITY IDEOGRAPH-2F931 2F932 瓊 # CJK COMPATIBILITY IDEOGRAPH-2F932 2F933 㼛 # CJK COMPATIBILITY IDEOGRAPH-2F933 2F934 甤 # CJK COMPATIBILITY IDEOGRAPH-2F934 2F935 𤰶 # CJK COMPATIBILITY IDEOGRAPH-2F935 2F936 甾 # CJK COMPATIBILITY IDEOGRAPH-2F936 2F937 𤲒 # CJK COMPATIBILITY IDEOGRAPH-2F937 2F938 異 # CJK COMPATIBILITY IDEOGRAPH-2F938 2F939 𢆟 # CJK COMPATIBILITY IDEOGRAPH-2F939 2F93A 瘐 # CJK COMPATIBILITY IDEOGRAPH-2F93A 2F93B 𤾡 # CJK COMPATIBILITY IDEOGRAPH-2F93B 2F93C 𤾸 # CJK COMPATIBILITY IDEOGRAPH-2F93C 2F93D 𥁄 # CJK COMPATIBILITY IDEOGRAPH-2F93D 2F93E 㿼 # CJK COMPATIBILITY IDEOGRAPH-2F93E 2F93F 䀈 # CJK COMPATIBILITY IDEOGRAPH-2F93F 2F940 直 # CJK COMPATIBILITY IDEOGRAPH-2F940 2F941 𥃳 # CJK COMPATIBILITY IDEOGRAPH-2F941 2F942 𥃲 # CJK COMPATIBILITY IDEOGRAPH-2F942 2F943 𥄙 # CJK COMPATIBILITY IDEOGRAPH-2F943 2F944 𥄳 # CJK COMPATIBILITY IDEOGRAPH-2F944 2F945 眞 # CJK COMPATIBILITY IDEOGRAPH-2F945 2F946 真 # CJK COMPATIBILITY IDEOGRAPH-2F946 2F947 真 # CJK COMPATIBILITY IDEOGRAPH-2F947 2F948 睊 # CJK COMPATIBILITY IDEOGRAPH-2F948 2F949 䀹 # CJK COMPATIBILITY IDEOGRAPH-2F949 2F94A 瞋 # CJK COMPATIBILITY IDEOGRAPH-2F94A 2F94B 䁆 # CJK COMPATIBILITY IDEOGRAPH-2F94B 2F94C 䂖 # CJK COMPATIBILITY IDEOGRAPH-2F94C 2F94D 𥐝 # CJK COMPATIBILITY IDEOGRAPH-2F94D 2F94E 硎 # CJK COMPATIBILITY IDEOGRAPH-2F94E 2F94F 碌 # CJK COMPATIBILITY IDEOGRAPH-2F94F 2F950 磌 # CJK COMPATIBILITY IDEOGRAPH-2F950 2F951 䃣 # CJK COMPATIBILITY IDEOGRAPH-2F951 2F952 𥘦 # CJK COMPATIBILITY IDEOGRAPH-2F952 2F953 祖 # CJK COMPATIBILITY IDEOGRAPH-2F953 2F954 𥚚 # CJK COMPATIBILITY IDEOGRAPH-2F954 2F955 𥛅 # CJK COMPATIBILITY IDEOGRAPH-2F955 2F956 福 # CJK COMPATIBILITY IDEOGRAPH-2F956 2F957 秫 # CJK COMPATIBILITY IDEOGRAPH-2F957 2F958 䄯 # CJK COMPATIBILITY IDEOGRAPH-2F958 2F959 穀 # CJK COMPATIBILITY IDEOGRAPH-2F959 2F95A 穊 # CJK COMPATIBILITY IDEOGRAPH-2F95A 2F95B 穏 # CJK COMPATIBILITY IDEOGRAPH-2F95B 2F95C 𥥼 # CJK COMPATIBILITY IDEOGRAPH-2F95C 2F95D 𥪧 # CJK COMPATIBILITY IDEOGRAPH-2F95D 2F95E 𥪧 # CJK COMPATIBILITY IDEOGRAPH-2F95E 2F95F 竮 # CJK COMPATIBILITY IDEOGRAPH-2F95F 2F960 䈂 # CJK COMPATIBILITY IDEOGRAPH-2F960 2F961 𥮫 # CJK COMPATIBILITY IDEOGRAPH-2F961 2F962 篆 # CJK COMPATIBILITY IDEOGRAPH-2F962 2F963 築 # CJK COMPATIBILITY IDEOGRAPH-2F963 2F964 䈧 # CJK COMPATIBILITY IDEOGRAPH-2F964 2F965 𥲀 # CJK COMPATIBILITY IDEOGRAPH-2F965 2F966 糒 # CJK COMPATIBILITY IDEOGRAPH-2F966 2F967 䊠 # CJK COMPATIBILITY IDEOGRAPH-2F967 2F968 糨 # CJK COMPATIBILITY IDEOGRAPH-2F968 2F969 糣 # CJK COMPATIBILITY IDEOGRAPH-2F969 2F96A 紀 # CJK COMPATIBILITY IDEOGRAPH-2F96A 2F96B 𥾆 # CJK COMPATIBILITY IDEOGRAPH-2F96B 2F96C 絣 # CJK COMPATIBILITY IDEOGRAPH-2F96C 2F96D 䌁 # CJK COMPATIBILITY IDEOGRAPH-2F96D 2F96E 緇 # CJK COMPATIBILITY IDEOGRAPH-2F96E 2F96F 縂 # CJK COMPATIBILITY IDEOGRAPH-2F96F 2F970 繅 # CJK COMPATIBILITY IDEOGRAPH-2F970 2F971 䌴 # CJK COMPATIBILITY IDEOGRAPH-2F971 2F972 𦈨 # CJK COMPATIBILITY IDEOGRAPH-2F972 2F973 𦉇 # CJK COMPATIBILITY IDEOGRAPH-2F973 2F974 䍙 # CJK COMPATIBILITY IDEOGRAPH-2F974 2F975 𦋙 # CJK COMPATIBILITY IDEOGRAPH-2F975 2F976 罺 # CJK COMPATIBILITY IDEOGRAPH-2F976 2F977 𦌾 # CJK COMPATIBILITY IDEOGRAPH-2F977 2F978 羕 # CJK COMPATIBILITY IDEOGRAPH-2F978 2F979 翺 # CJK COMPATIBILITY IDEOGRAPH-2F979 2F97A 者 # CJK COMPATIBILITY IDEOGRAPH-2F97A 2F97B 𦓚 # CJK COMPATIBILITY IDEOGRAPH-2F97B 2F97C 𦔣 # CJK COMPATIBILITY IDEOGRAPH-2F97C 2F97D 聠 # CJK COMPATIBILITY IDEOGRAPH-2F97D 2F97E 𦖨 # CJK COMPATIBILITY IDEOGRAPH-2F97E 2F97F 聰 # CJK COMPATIBILITY IDEOGRAPH-2F97F 2F980 𣍟 # CJK COMPATIBILITY IDEOGRAPH-2F980 2F981 䏕 # CJK COMPATIBILITY IDEOGRAPH-2F981 2F982 育 # CJK COMPATIBILITY IDEOGRAPH-2F982 2F983 脃 # CJK COMPATIBILITY IDEOGRAPH-2F983 2F984 䐋 # CJK COMPATIBILITY IDEOGRAPH-2F984 2F985 脾 # CJK COMPATIBILITY IDEOGRAPH-2F985 2F986 媵 # CJK COMPATIBILITY IDEOGRAPH-2F986 2F987 𦞧 # CJK COMPATIBILITY IDEOGRAPH-2F987 2F988 𦞵 # CJK COMPATIBILITY IDEOGRAPH-2F988 2F989 𣎓 # CJK COMPATIBILITY IDEOGRAPH-2F989 2F98A 𣎜 # CJK COMPATIBILITY IDEOGRAPH-2F98A 2F98B 舁 # CJK COMPATIBILITY IDEOGRAPH-2F98B 2F98C 舄 # CJK COMPATIBILITY IDEOGRAPH-2F98C 2F98D 辞 # CJK COMPATIBILITY IDEOGRAPH-2F98D 2F98E 䑫 # CJK COMPATIBILITY IDEOGRAPH-2F98E 2F98F 芑 # CJK COMPATIBILITY IDEOGRAPH-2F98F 2F990 芋 # CJK COMPATIBILITY IDEOGRAPH-2F990 2F991 芝 # CJK COMPATIBILITY IDEOGRAPH-2F991 2F992 劳 # CJK COMPATIBILITY IDEOGRAPH-2F992 2F993 花 # CJK COMPATIBILITY IDEOGRAPH-2F993 2F994 芳 # CJK COMPATIBILITY IDEOGRAPH-2F994 2F995 芽 # CJK COMPATIBILITY IDEOGRAPH-2F995 2F996 苦 # CJK COMPATIBILITY IDEOGRAPH-2F996 2F997 𦬼 # CJK COMPATIBILITY IDEOGRAPH-2F997 2F998 若 # CJK COMPATIBILITY IDEOGRAPH-2F998 2F999 茝 # CJK COMPATIBILITY IDEOGRAPH-2F999 2F99A 荣 # CJK COMPATIBILITY IDEOGRAPH-2F99A 2F99B 莭 # CJK COMPATIBILITY IDEOGRAPH-2F99B 2F99C 茣 # CJK COMPATIBILITY IDEOGRAPH-2F99C 2F99D 莽 # CJK COMPATIBILITY IDEOGRAPH-2F99D 2F99E 菧 # CJK COMPATIBILITY IDEOGRAPH-2F99E 2F99F 著 # CJK COMPATIBILITY IDEOGRAPH-2F99F 2F9A0 荓 # CJK COMPATIBILITY IDEOGRAPH-2F9A0 2F9A1 菊 # CJK COMPATIBILITY IDEOGRAPH-2F9A1 2F9A2 菌 # CJK COMPATIBILITY IDEOGRAPH-2F9A2 2F9A3 菜 # CJK COMPATIBILITY IDEOGRAPH-2F9A3 2F9A4 𦰶 # CJK COMPATIBILITY IDEOGRAPH-2F9A4 2F9A5 𦵫 # CJK COMPATIBILITY IDEOGRAPH-2F9A5 2F9A6 𦳕 # CJK COMPATIBILITY IDEOGRAPH-2F9A6 2F9A7 䔫 # CJK COMPATIBILITY IDEOGRAPH-2F9A7 2F9A8 蓱 # CJK COMPATIBILITY IDEOGRAPH-2F9A8 2F9A9 蓳 # CJK COMPATIBILITY IDEOGRAPH-2F9A9 2F9AA 蔖 # CJK COMPATIBILITY IDEOGRAPH-2F9AA 2F9AB 𧏊 # CJK COMPATIBILITY IDEOGRAPH-2F9AB 2F9AC 蕤 # CJK COMPATIBILITY IDEOGRAPH-2F9AC 2F9AD 𦼬 # CJK COMPATIBILITY IDEOGRAPH-2F9AD 2F9AE 䕝 # CJK COMPATIBILITY IDEOGRAPH-2F9AE 2F9AF 䕡 # CJK COMPATIBILITY IDEOGRAPH-2F9AF 2F9B0 𦾱 # CJK COMPATIBILITY IDEOGRAPH-2F9B0 2F9B1 𧃒 # CJK COMPATIBILITY IDEOGRAPH-2F9B1 2F9B2 䕫 # CJK COMPATIBILITY IDEOGRAPH-2F9B2 2F9B3 虐 # CJK COMPATIBILITY IDEOGRAPH-2F9B3 2F9B4 虜 # CJK COMPATIBILITY IDEOGRAPH-2F9B4 2F9B5 虧 # CJK COMPATIBILITY IDEOGRAPH-2F9B5 2F9B6 虩 # CJK COMPATIBILITY IDEOGRAPH-2F9B6 2F9B7 蚩 # CJK COMPATIBILITY IDEOGRAPH-2F9B7 2F9B8 蚈 # CJK COMPATIBILITY IDEOGRAPH-2F9B8 2F9B9 蜎 # CJK COMPATIBILITY IDEOGRAPH-2F9B9 2F9BA 蛢 # CJK COMPATIBILITY IDEOGRAPH-2F9BA 2F9BB 蝹 # CJK COMPATIBILITY IDEOGRAPH-2F9BB 2F9BC 蜨 # CJK COMPATIBILITY IDEOGRAPH-2F9BC 2F9BD 蝫 # CJK COMPATIBILITY IDEOGRAPH-2F9BD 2F9BE 螆 # CJK COMPATIBILITY IDEOGRAPH-2F9BE 2F9BF 䗗 # CJK COMPATIBILITY IDEOGRAPH-2F9BF 2F9C0 蟡 # CJK COMPATIBILITY IDEOGRAPH-2F9C0 2F9C1 蠁 # CJK COMPATIBILITY IDEOGRAPH-2F9C1 2F9C2 䗹 # CJK COMPATIBILITY IDEOGRAPH-2F9C2 2F9C3 衠 # CJK COMPATIBILITY IDEOGRAPH-2F9C3 2F9C4 衣 # CJK COMPATIBILITY IDEOGRAPH-2F9C4 2F9C5 𧙧 # CJK COMPATIBILITY IDEOGRAPH-2F9C5 2F9C6 裗 # CJK COMPATIBILITY IDEOGRAPH-2F9C6 2F9C7 裞 # CJK COMPATIBILITY IDEOGRAPH-2F9C7 2F9C8 䘵 # CJK COMPATIBILITY IDEOGRAPH-2F9C8 2F9C9 裺 # CJK COMPATIBILITY IDEOGRAPH-2F9C9 2F9CA 㒻 # CJK COMPATIBILITY IDEOGRAPH-2F9CA 2F9CB 𧢮 # CJK COMPATIBILITY IDEOGRAPH-2F9CB 2F9CC 𧥦 # CJK COMPATIBILITY IDEOGRAPH-2F9CC 2F9CD 䚾 # CJK COMPATIBILITY IDEOGRAPH-2F9CD 2F9CE 䛇 # CJK COMPATIBILITY IDEOGRAPH-2F9CE 2F9CF 誠 # CJK COMPATIBILITY IDEOGRAPH-2F9CF 2F9D0 諭 # CJK COMPATIBILITY IDEOGRAPH-2F9D0 2F9D1 變 # CJK COMPATIBILITY IDEOGRAPH-2F9D1 2F9D2 豕 # CJK COMPATIBILITY IDEOGRAPH-2F9D2 2F9D3 𧲨 # CJK COMPATIBILITY IDEOGRAPH-2F9D3 2F9D4 貫 # CJK COMPATIBILITY IDEOGRAPH-2F9D4 2F9D5 賁 # CJK COMPATIBILITY IDEOGRAPH-2F9D5 2F9D6 贛 # CJK COMPATIBILITY IDEOGRAPH-2F9D6 2F9D7 起 # CJK COMPATIBILITY IDEOGRAPH-2F9D7 2F9D8 𧼯 # CJK COMPATIBILITY IDEOGRAPH-2F9D8 2F9D9 𠠄 # CJK COMPATIBILITY IDEOGRAPH-2F9D9 2F9DA 跋 # CJK COMPATIBILITY IDEOGRAPH-2F9DA 2F9DB 趼 # CJK COMPATIBILITY IDEOGRAPH-2F9DB 2F9DC 跰 # CJK COMPATIBILITY IDEOGRAPH-2F9DC 2F9DD 𠣞 # CJK COMPATIBILITY IDEOGRAPH-2F9DD 2F9DE 軔 # CJK COMPATIBILITY IDEOGRAPH-2F9DE 2F9DF 輸 # CJK COMPATIBILITY IDEOGRAPH-2F9DF 2F9E0 𨗒 # CJK COMPATIBILITY IDEOGRAPH-2F9E0 2F9E1 𨗭 # CJK COMPATIBILITY IDEOGRAPH-2F9E1 2F9E2 邔 # CJK COMPATIBILITY IDEOGRAPH-2F9E2 2F9E3 郱 # CJK COMPATIBILITY IDEOGRAPH-2F9E3 2F9E4 鄑 # CJK COMPATIBILITY IDEOGRAPH-2F9E4 2F9E5 𨜮 # CJK COMPATIBILITY IDEOGRAPH-2F9E5 2F9E6 鄛 # CJK COMPATIBILITY IDEOGRAPH-2F9E6 2F9E7 鈸 # CJK COMPATIBILITY IDEOGRAPH-2F9E7 2F9E8 鋗 # CJK COMPATIBILITY IDEOGRAPH-2F9E8 2F9E9 鋘 # CJK COMPATIBILITY IDEOGRAPH-2F9E9 2F9EA 鉼 # CJK COMPATIBILITY IDEOGRAPH-2F9EA 2F9EB 鏹 # CJK COMPATIBILITY IDEOGRAPH-2F9EB 2F9EC 鐕 # CJK COMPATIBILITY IDEOGRAPH-2F9EC 2F9ED 𨯺 # CJK COMPATIBILITY IDEOGRAPH-2F9ED 2F9EE 開 # CJK COMPATIBILITY IDEOGRAPH-2F9EE 2F9EF 䦕 # CJK COMPATIBILITY IDEOGRAPH-2F9EF 2F9F0 閷 # CJK COMPATIBILITY IDEOGRAPH-2F9F0 2F9F1 𨵷 # CJK COMPATIBILITY IDEOGRAPH-2F9F1 2F9F2 䧦 # CJK COMPATIBILITY IDEOGRAPH-2F9F2 2F9F3 雃 # CJK COMPATIBILITY IDEOGRAPH-2F9F3 2F9F4 嶲 # CJK COMPATIBILITY IDEOGRAPH-2F9F4 2F9F5 霣 # CJK COMPATIBILITY IDEOGRAPH-2F9F5 2F9F6 𩅅 # CJK COMPATIBILITY IDEOGRAPH-2F9F6 2F9F7 𩈚 # CJK COMPATIBILITY IDEOGRAPH-2F9F7 2F9F8 䩮 # CJK COMPATIBILITY IDEOGRAPH-2F9F8 2F9F9 䩶 # CJK COMPATIBILITY IDEOGRAPH-2F9F9 2F9FA 韠 # CJK COMPATIBILITY IDEOGRAPH-2F9FA 2F9FB 𩐊 # CJK COMPATIBILITY IDEOGRAPH-2F9FB 2F9FC 䪲 # CJK COMPATIBILITY IDEOGRAPH-2F9FC 2F9FD 𩒖 # CJK COMPATIBILITY IDEOGRAPH-2F9FD 2F9FE 頋 # CJK COMPATIBILITY IDEOGRAPH-2F9FE 2F9FF 頋 # CJK COMPATIBILITY IDEOGRAPH-2F9FF 2FA00 頩 # CJK COMPATIBILITY IDEOGRAPH-2FA00 2FA01 𩖶 # CJK COMPATIBILITY IDEOGRAPH-2FA01 2FA02 飢 # CJK COMPATIBILITY IDEOGRAPH-2FA02 2FA03 䬳 # CJK COMPATIBILITY IDEOGRAPH-2FA03 2FA04 餩 # CJK COMPATIBILITY IDEOGRAPH-2FA04 2FA05 馧 # CJK COMPATIBILITY IDEOGRAPH-2FA05 2FA06 駂 # CJK COMPATIBILITY IDEOGRAPH-2FA06 2FA07 駾 # CJK COMPATIBILITY IDEOGRAPH-2FA07 2FA08 䯎 # CJK COMPATIBILITY IDEOGRAPH-2FA08 2FA09 𩬰 # CJK COMPATIBILITY IDEOGRAPH-2FA09 2FA0A 鬒 # CJK COMPATIBILITY IDEOGRAPH-2FA0A 2FA0B 鱀 # CJK COMPATIBILITY IDEOGRAPH-2FA0B 2FA0C 鳽 # CJK COMPATIBILITY IDEOGRAPH-2FA0C 2FA0D 䳎 # CJK COMPATIBILITY IDEOGRAPH-2FA0D 2FA0E 䳭 # CJK COMPATIBILITY IDEOGRAPH-2FA0E 2FA0F 鵧 # CJK COMPATIBILITY IDEOGRAPH-2FA0F 2FA10 𪃎 # CJK COMPATIBILITY IDEOGRAPH-2FA10 2FA11 䳸 # CJK COMPATIBILITY IDEOGRAPH-2FA11 2FA12 𪄅 # CJK COMPATIBILITY IDEOGRAPH-2FA12 2FA13 𪈎 # CJK COMPATIBILITY IDEOGRAPH-2FA13 2FA14 𪊑 # CJK COMPATIBILITY IDEOGRAPH-2FA14 2FA15 麻 # CJK COMPATIBILITY IDEOGRAPH-2FA15 2FA16 䵖 # CJK COMPATIBILITY IDEOGRAPH-2FA16 2FA17 黹 # CJK COMPATIBILITY IDEOGRAPH-2FA17 2FA18 黾 # CJK COMPATIBILITY IDEOGRAPH-2FA18 2FA19 鼅 # CJK COMPATIBILITY IDEOGRAPH-2FA19 2FA1A 鼏 # CJK COMPATIBILITY IDEOGRAPH-2FA1A 2FA1B 鼖 # CJK COMPATIBILITY IDEOGRAPH-2FA1B 2FA1C 鼻 # CJK COMPATIBILITY IDEOGRAPH-2FA1C 2FA1D 𪘀 # CJK COMPATIBILITY IDEOGRAPH-2FA1D freelan-2.0/third-party/source/libiconv-msvc/include/translit.h000066400000000000000000003005401252300335000247400ustar00rootroot00000000000000/* * Copyright (C) 1999-2003 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * Transliteration table */ static const unsigned int translit_data[9116] = { 1, ' ', 1, '!', 1, 'c', 2, 'l', 'b', 3, 'y', 'e', 'n', 1, '|', 2, 'S', 'S', 1, '"', 3, '(', 'c', ')', 1, 'a', 2, '<', '<', 3, 'n', 'o', 't', 1, '-', 3, '(', 'R', ')', 2, '^', '0', 3, '+', '/', '-', 2, '^', '2', 2, '^', '3', 1,'\'', 1, 'u', 1, 'P', 1, '.', 1, ',', 2, '^', '1', 1, 'o', 2, '>', '>', 5, ' ', '1',0x2044, '4', ' ', 5, ' ', '1',0x2044, '2', ' ', 5, ' ', '3',0x2044, '4', ' ', 1, '?', 2, '`', 'A', 2,0xB4, 'A', 2, '^', 'A', 2, '~', 'A', 2, '"', 'A', 1, 'A', 2, 'A', 'E', 1, 'C', 2, '`', 'E', 2,0xB4, 'E', 2, '^', 'E', 2, '"', 'E', 2, '`', 'I', 2,0xB4, 'I', 2, '^', 'I', 2, '"', 'I', 1, 'D', 2, '~', 'N', 2, '`', 'O', 2,0xB4, 'O', 2, '^', 'O', 2, '~', 'O', 2, '"', 'O', 1, 'x', 1, 'O', 2, '`', 'U', 2,0xB4, 'U', 2, '^', 'U', 2, '"', 'U', 2,0xB4, 'Y', 2, 'T', 'h', 2, 's', 's', 2, '`', 'a', 2,0xB4, 'a', 2, '^', 'a', 2, '~', 'a', 2, '"', 'a', 1, 'a', 2, 'a', 'e', 1, 'c', 2, '`', 'e', 2,0xB4, 'e', 2, '^', 'e', 2, '"', 'e', 2, '`', 'i', 2,0xB4, 'i', 2, '^', 'i', 2, '"', 'i', 1, 'd', 2, '~', 'n', 2, '`', 'o', 2,0xB4, 'o', 2, '^', 'o', 2, '~', 'o', 2, '"', 'o', 1, ':', 1, 'o', 2, '`', 'u', 2,0xB4, 'u', 2, '^', 'u', 2, '"', 'u', 2,0xB4, 'y', 2, 't', 'h', 2, '"', 'y', 1, 'A', 1, 'a', 1, 'A', 1, 'a', 1, 'A', 1, 'a', 2,0xB4, 'C', 2,0xB4, 'c', 2, '^', 'C', 2, '^', 'c', 1, 'C', 1, 'c', 1, 'C', 1, 'c', 1, 'D', 1, 'd', 1, 'D', 1, 'd', 1, 'E', 1, 'e', 1, 'E', 1, 'e', 1, 'E', 1, 'e', 1, 'E', 1, 'e', 1, 'E', 1, 'e', 2, '^', 'G', 2, '^', 'g', 1, 'G', 1, 'g', 1, 'G', 1, 'g', 1, 'G', 1, 'g', 2, '^', 'H', 2, '^', 'h', 1, 'H', 1, 'h', 2, '~', 'I', 2, '~', 'i', 1, 'I', 1, 'i', 1, 'I', 1, 'i', 1, 'I', 1, 'i', 1, 'I', 1, 'i', 2, 'I', 'J', 2, 'i', 'j', 2, '^', 'J', 2, '^', 'j', 1, 'K', 1, 'k', 1, 'L', 1, 'l', 1, 'L', 1, 'l', 1, 'L', 1, 'l', 1, 'L', 1, 'l', 1, 'L', 1, 'l', 2,0xB4, 'N', 2,0xB4, 'n', 1, 'N', 1, 'n', 1, 'N', 1, 'n', 2,'\'', 'n', 1, 'O', 1, 'o', 1, 'O', 1, 'o', 2, '"', 'O', 2, '"', 'o', 2, 'O', 'E', 2, 'o', 'e', 2,0xB4, 'R', 2,0xB4, 'r', 1, 'R', 1, 'r', 1, 'R', 1, 'r', 2,0xB4, 'S', 2,0xB4, 's', 2, '^', 'S', 2, '^', 's', 1, 'S', 1, 's', 1, 'S', 1, 's', 1, 'T', 1, 't', 1, 'T', 1, 't', 1, 'T', 1, 't', 2, '~', 'U', 2, '~', 'u', 1, 'U', 1, 'u', 1, 'U', 1, 'u', 1, 'U', 1, 'u', 2, '"', 'U', 2, '"', 'u', 1, 'U', 1, 'u', 2, '^', 'W', 2, '^', 'w', 2, '^', 'Y', 2, '^', 'y', 2, '"', 'Y', 2,0xB4, 'Z', 2,0xB4, 'z', 1, 'Z', 1, 'z', 1, 'Z', 1, 'z', 1, 's', 1, 'f', 2, 'D',0x017D, 2, 'D',0x017E, 2, 'd',0x017E, 2, 'L', 'J', 2, 'L', 'j', 2, 'l', 'j', 2, 'N', 'J', 2, 'N', 'j', 2, 'n', 'j', 2, 'D', 'Z', 2, 'D', 'z', 2, 'd', 'z', 1, 'S', 1, 's', 1, 'T', 1, 't', 1,0x2032, 1,0x2033, 1,0x2018, 1,0x2019, 1,0x201B, 1, '^', 1,'\'', 1,0xAF, 1,0xB4, 1, '`', 1, '_', 1, '~', 1, '"', 1,0x03B2, 1,0x03B8, 1,0x03A5, 1,0x03C6, 1,0x03C0, 1,0x03BA, 1,0x03C1, 1,0x03C2, 1,0x0398, 1,0x03B5, 1,0x03A3, 2,0x0565,0x0582, 2,0x05D5,0x05D5, 2,0x05D5,0x05D9, 2,0x05D9,0x05D9, 2,0x0627,0x0674, 2,0x0648,0x0674, 2,0x06C7,0x0674, 2,0x064A,0x0674, 2,0x0E4D,0x0E32, 2,0x0ECD,0x0EB2, 2,0x0EAB,0x0E99, 2,0x0EAB,0x0EA1, 2,0x0FB2,0x0F81, 2,0x0FB3,0x0F81, 1, 'B', 1, 'b', 1, 'D', 1, 'd', 1, 'F', 1, 'f', 1, 'M', 1, 'm', 1, 'P', 1, 'p', 1, 'S', 1, 's', 1, 'T', 1, 't', 2, '`', 'W', 2, '`', 'w', 2,0xB4, 'W', 2,0xB4, 'w', 2, '"', 'W', 2, '"', 'w', 2, 'a',0x02BE, 2, '`', 'Y', 2, '`', 'y', 1, ' ', 1, ' ', 1, ' ', 1, ' ', 1, ' ', 1, ' ', 1, ' ', 1, ' ', 1, '-', 1, '-', 1, '-', 1, '-', 1, '-', 1, '-', 1,'\'', 1,'\'', 1, ',', 1,'\'', 1, '"', 1, '"', 1, '"', 1, '"', 1, '+', 1, 'o', 1, '.', 2, '.', '.', 3, '.', '.', '.', 4, 'o', '/', 'o', 'o', 1,0xB4, 2,0xB4,0xB4, 3,0xB4,0xB4,0xB4, 2,0x2035,0x2035, 3,0x2035,0x2035,0x2035, 1, '<', 1, '>', 2, '!', '!', 1, '/', 2, '?', '?', 2, '?', '!', 2, '!', '?', 4,0xB4,0xB4,0xB4,0xB4, 2, 'R', 's', 4,0x0110,0x1ED3, 'n', 'g', 3, 'E', 'U', 'R', 3, 'a', '/', 'c', 3, 'a', '/', 's', 1, 'C', 2,0xB0, 'C', 3, 'c', '/', 'o', 3, 'c', '/', 'u', 1,0x0190, 2,0xB0, 'F', 1, 'g', 1, 'H', 1, 'H', 1, 'H', 1, 'h', 1,0x0127, 1, 'I', 1, 'I', 1, 'L', 1, 'l', 1, 'N', 2, 'N', 'o', 1, 'P', 1, 'Q', 1, 'R', 1, 'R', 1, 'R', 3, 'T', 'E', 'L', 2, 'T', 'M', 1, 'Z', 3, 'O', 'h', 'm', 1, 'Z', 1, 'B', 1, 'C', 1, 'e', 1, 'e', 1, 'E', 1, 'F', 1, 'M', 1, 'o', 1,0x05D0, 1,0x05D1, 1,0x05D2, 1,0x05D3, 1, 'i', 3, 'F', 'A', 'X', 1,0x03B3, 1,0x0393, 1,0x03A0, 1,0x2211, 1, 'D', 1, 'd', 1, 'e', 1, 'i', 1, 'j', 5, ' ', '1',0x2044, '3', ' ', 5, ' ', '2',0x2044, '3', ' ', 5, ' ', '1',0x2044, '5', ' ', 5, ' ', '2',0x2044, '5', ' ', 5, ' ', '3',0x2044, '5', ' ', 5, ' ', '4',0x2044, '5', ' ', 5, ' ', '1',0x2044, '6', ' ', 5, ' ', '5',0x2044, '6', ' ', 5, ' ', '1',0x2044, '8', ' ', 5, ' ', '3',0x2044, '8', ' ', 5, ' ', '5',0x2044, '8', ' ', 5, ' ', '7',0x2044, '8', ' ', 3, ' ', '1',0x2044, 1, 'I', 2, 'I', 'I', 3, 'I', 'I', 'I', 2, 'I', 'V', 1, 'V', 2, 'V', 'I', 3, 'V', 'I', 'I', 4, 'V', 'I', 'I', 'I', 2, 'I', 'X', 1, 'X', 2, 'X', 'I', 3, 'X', 'I', 'I', 1, 'L', 1, 'C', 1, 'D', 1, 'M', 1, 'i', 2, 'i', 'i', 3, 'i', 'i', 'i', 2, 'i', 'v', 1, 'v', 2, 'v', 'i', 3, 'v', 'i', 'i', 4, 'v', 'i', 'i', 'i', 2, 'i', 'x', 1, 'x', 2, 'x', 'i', 3, 'x', 'i', 'i', 1, 'l', 1, 'c', 1, 'd', 1, 'm', 2, '<', '-', 1, '^', 2, '-', '>', 1, 'V', 3, '<', '-', '>', 2, '<', '=', 2, '=', '>', 3, '<', '=', '>', 1, '-', 1, '/', 1,'\\', 1, '*', 1,0x2022, 1, '|', 2,0x222B,0x222B, 3,0x222B,0x222B,0x222B, 2,0x222E,0x222E, 3,0x222E,0x222E,0x222E, 1, ':', 1, '~', 2, '/', '=', 2, '<', '=', 2, '>', '=', 2, '<', '<', 2, '>', '>', 1,0xB7, 3, '<', '<', '<', 3, '>', '>', '>', 3,0xB7,0xB7,0xB7, 5, '[', 'N', 'U', 'L', ']', 5, '[', 'S', 'O', 'H', ']', 5, '[', 'S', 'T', 'X', ']', 5, '[', 'E', 'T', 'X', ']', 5, '[', 'E', 'O', 'T', ']', 5, '[', 'E', 'N', 'Q', ']', 5, '[', 'A', 'C', 'K', ']', 5, '[', 'B', 'E', 'L', ']', 4, '[', 'B', 'S', ']', 4, '[', 'H', 'T', ']', 4, '[', 'L', 'F', ']', 4, '[', 'V', 'T', ']', 4, '[', 'F', 'F', ']', 4, '[', 'C', 'R', ']', 4, '[', 'S', 'O', ']', 4, '[', 'S', 'I', ']', 5, '[', 'D', 'L', 'E', ']', 5, '[', 'D', 'C', '1', ']', 5, '[', 'D', 'C', '2', ']', 5, '[', 'D', 'C', '3', ']', 5, '[', 'D', 'C', '4', ']', 5, '[', 'N', 'A', 'K', ']', 5, '[', 'S', 'Y', 'N', ']', 5, '[', 'E', 'T', 'B', ']', 5, '[', 'C', 'A', 'N', ']', 4, '[', 'E', 'M', ']', 5, '[', 'S', 'U', 'B', ']', 5, '[', 'E', 'S', 'C', ']', 4, '[', 'F', 'S', ']', 4, '[', 'G', 'S', ']', 4, '[', 'R', 'S', ']', 4, '[', 'U', 'S', ']', 4, '[', 'S', 'P', ']', 5, '[', 'D', 'E', 'L', ']', 4, '[', 'N', 'L', ']', 3, '(', '1', ')', 3, '(', '2', ')', 3, '(', '3', ')', 3, '(', '4', ')', 3, '(', '5', ')', 3, '(', '6', ')', 3, '(', '7', ')', 3, '(', '8', ')', 3, '(', '9', ')', 4, '(', '1', '0', ')', 4, '(', '1', '1', ')', 4, '(', '1', '2', ')', 4, '(', '1', '3', ')', 4, '(', '1', '4', ')', 4, '(', '1', '5', ')', 4, '(', '1', '6', ')', 4, '(', '1', '7', ')', 4, '(', '1', '8', ')', 4, '(', '1', '9', ')', 4, '(', '2', '0', ')', 3, '(', '1', ')', 3, '(', '2', ')', 3, '(', '3', ')', 3, '(', '4', ')', 3, '(', '5', ')', 3, '(', '6', ')', 3, '(', '7', ')', 3, '(', '8', ')', 3, '(', '9', ')', 4, '(', '1', '0', ')', 4, '(', '1', '1', ')', 4, '(', '1', '2', ')', 4, '(', '1', '3', ')', 4, '(', '1', '4', ')', 4, '(', '1', '5', ')', 4, '(', '1', '6', ')', 4, '(', '1', '7', ')', 4, '(', '1', '8', ')', 4, '(', '1', '9', ')', 4, '(', '2', '0', ')', 2, '1', '.', 2, '2', '.', 2, '3', '.', 2, '4', '.', 2, '5', '.', 2, '6', '.', 2, '7', '.', 2, '8', '.', 2, '9', '.', 3, '1', '0', '.', 3, '1', '1', '.', 3, '1', '2', '.', 3, '1', '3', '.', 3, '1', '4', '.', 3, '1', '5', '.', 3, '1', '6', '.', 3, '1', '7', '.', 3, '1', '8', '.', 3, '1', '9', '.', 3, '2', '0', '.', 3, '(', 'a', ')', 3, '(', 'b', ')', 3, '(', 'c', ')', 3, '(', 'd', ')', 3, '(', 'e', ')', 3, '(', 'f', ')', 3, '(', 'g', ')', 3, '(', 'h', ')', 3, '(', 'i', ')', 3, '(', 'j', ')', 3, '(', 'k', ')', 3, '(', 'l', ')', 3, '(', 'm', ')', 3, '(', 'n', ')', 3, '(', 'o', ')', 3, '(', 'p', ')', 3, '(', 'q', ')', 3, '(', 'r', ')', 3, '(', 's', ')', 3, '(', 't', ')', 3, '(', 'u', ')', 3, '(', 'v', ')', 3, '(', 'w', ')', 3, '(', 'x', ')', 3, '(', 'y', ')', 3, '(', 'z', ')', 3, '(', 'A', ')', 3, '(', 'B', ')', 3, '(', 'C', ')', 3, '(', 'D', ')', 3, '(', 'E', ')', 3, '(', 'F', ')', 3, '(', 'G', ')', 3, '(', 'H', ')', 3, '(', 'I', ')', 3, '(', 'J', ')', 3, '(', 'K', ')', 3, '(', 'L', ')', 3, '(', 'M', ')', 3, '(', 'N', ')', 3, '(', 'O', ')', 3, '(', 'P', ')', 3, '(', 'Q', ')', 3, '(', 'R', ')', 3, '(', 'S', ')', 3, '(', 'T', ')', 3, '(', 'U', ')', 3, '(', 'V', ')', 3, '(', 'W', ')', 3, '(', 'X', ')', 3, '(', 'Y', ')', 3, '(', 'Z', ')', 3, '(', 'a', ')', 3, '(', 'b', ')', 3, '(', 'c', ')', 3, '(', 'd', ')', 3, '(', 'e', ')', 3, '(', 'f', ')', 3, '(', 'g', ')', 3, '(', 'h', ')', 3, '(', 'i', ')', 3, '(', 'j', ')', 3, '(', 'k', ')', 3, '(', 'l', ')', 3, '(', 'm', ')', 3, '(', 'n', ')', 3, '(', 'o', ')', 3, '(', 'p', ')', 3, '(', 'q', ')', 3, '(', 'r', ')', 3, '(', 's', ')', 3, '(', 't', ')', 3, '(', 'u', ')', 3, '(', 'v', ')', 3, '(', 'w', ')', 3, '(', 'x', ')', 3, '(', 'y', ')', 3, '(', 'z', ')', 3, '(', '0', ')', 1, '-', 1, '|', 1, '+', 1, '+', 1, '+', 1, '+', 1, '+', 1, '+', 1, '+', 1, '+', 1, '+', 1, 'o', 4,0x222B,0x222B,0x222B,0x222B, 3, ':', ':', '=', 2, '=', '=', 3, '=', '=', '=', 1,0x6BCD, 1,0x9F9F, 1,0x4E00, 1,0x4E28, 1,0x4E36, 1,0x4E3F, 1,0x4E59, 1,0x4E85, 1,0x4E8C, 1,0x4EA0, 1,0x4EBA, 1,0x513F, 1,0x5165, 1,0x516B, 1,0x5182, 1,0x5196, 1,0x51AB, 1,0x51E0, 1,0x51F5, 1,0x5200, 1,0x529B, 1,0x52F9, 1,0x5315, 1,0x531A, 1,0x5338, 1,0x5341, 1,0x535C, 1,0x5369, 1,0x5382, 1,0x53B6, 1,0x53C8, 1,0x53E3, 1,0x56D7, 1,0x571F, 1,0x58EB, 1,0x5902, 1,0x590A, 1,0x5915, 1,0x5927, 1,0x5973, 1,0x5B50, 1,0x5B80, 1,0x5BF8, 1,0x5C0F, 1,0x5C22, 1,0x5C38, 1,0x5C6E, 1,0x5C71, 1,0x5DDB, 1,0x5DE5, 1,0x5DF1, 1,0x5DFE, 1,0x5E72, 1,0x5E7A, 1,0x5E7F, 1,0x5EF4, 1,0x5EFE, 1,0x5F0B, 1,0x5F13, 1,0x5F50, 1,0x5F61, 1,0x5F73, 1,0x5FC3, 1,0x6208, 1,0x6236, 1,0x624B, 1,0x652F, 1,0x6534, 1,0x6587, 1,0x6597, 1,0x65A4, 1,0x65B9, 1,0x65E0, 1,0x65E5, 1,0x66F0, 1,0x6708, 1,0x6728, 1,0x6B20, 1,0x6B62, 1,0x6B79, 1,0x6BB3, 1,0x6BCB, 1,0x6BD4, 1,0x6BDB, 1,0x6C0F, 1,0x6C14, 1,0x6C34, 1,0x706B, 1,0x722A, 1,0x7236, 1,0x723B, 1,0x723F, 1,0x7247, 1,0x7259, 1,0x725B, 1,0x72AC, 1,0x7384, 1,0x7389, 1,0x74DC, 1,0x74E6, 1,0x7518, 1,0x751F, 1,0x7528, 1,0x7530, 1,0x758B, 1,0x7592, 1,0x7676, 1,0x767D, 1,0x76AE, 1,0x76BF, 1,0x76EE, 1,0x77DB, 1,0x77E2, 1,0x77F3, 1,0x793A, 1,0x79B8, 1,0x79BE, 1,0x7A74, 1,0x7ACB, 1,0x7AF9, 1,0x7C73, 1,0x7CF8, 1,0x7F36, 1,0x7F51, 1,0x7F8A, 1,0x7FBD, 1,0x8001, 1,0x800C, 1,0x8012, 1,0x8033, 1,0x807F, 1,0x8089, 1,0x81E3, 1,0x81EA, 1,0x81F3, 1,0x81FC, 1,0x820C, 1,0x821B, 1,0x821F, 1,0x826E, 1,0x8272, 1,0x8278, 1,0x864D, 1,0x866B, 1,0x8840, 1,0x884C, 1,0x8863, 1,0x897E, 1,0x898B, 1,0x89D2, 1,0x8A00, 1,0x8C37, 1,0x8C46, 1,0x8C55, 1,0x8C78, 1,0x8C9D, 1,0x8D64, 1,0x8D70, 1,0x8DB3, 1,0x8EAB, 1,0x8ECA, 1,0x8F9B, 1,0x8FB0, 1,0x8FB5, 1,0x9091, 1,0x9149, 1,0x91C6, 1,0x91CC, 1,0x91D1, 1,0x9577, 1,0x9580, 1,0x961C, 1,0x96B6, 1,0x96B9, 1,0x96E8, 1,0x9751, 1,0x975E, 1,0x9762, 1,0x9769, 1,0x97CB, 1,0x97ED, 1,0x97F3, 1,0x9801, 1,0x98A8, 1,0x98DB, 1,0x98DF, 1,0x9996, 1,0x9999, 1,0x99AC, 1,0x9AA8, 1,0x9AD8, 1,0x9ADF, 1,0x9B25, 1,0x9B2F, 1,0x9B32, 1,0x9B3C, 1,0x9B5A, 1,0x9CE5, 1,0x9E75, 1,0x9E7F, 1,0x9EA5, 1,0x9EBB, 1,0x9EC3, 1,0x9ECD, 1,0x9ED1, 1,0x9EF9, 1,0x9EFD, 1,0x9F0E, 1,0x9F13, 1,0x9F20, 1,0x9F3B, 1,0x9F4A, 1,0x9F52, 1,0x9F8D, 1,0x9F9C, 1,0x9FA0, 1, ' ', 1,0x3012, 1,0x5341, 1,0x5344, 1,0x5345, 1,0x3042, 1,0x3044, 1,0x3046, 1,0x3048, 1,0x304A, 1,0x3064, 1,0x3084, 1,0x3086, 1,0x3088, 1,0x308F, 1,0x304B, 1,0x3051, 2, ' ',0x3099, 2, ' ',0x309A, 1, '=', 1,0x30A2, 1,0x30A4, 1,0x30A6, 1,0x30A8, 1,0x30AA, 1,0x30C4, 1,0x30E4, 1,0x30E6, 1,0x30E8, 1,0x30EF, 1,0x30AB, 1,0x30B1, 1,0x1100, 1,0x1101, 1,0x11AA, 1,0x1102, 1,0x11AC, 1,0x11AD, 1,0x1103, 1,0x1104, 1,0x1105, 1,0x11B0, 1,0x11B1, 1,0x11B2, 1,0x11B3, 1,0x11B4, 1,0x11B5, 1,0x111A, 1,0x1106, 1,0x1107, 1,0x1108, 1,0x1121, 1,0x1109, 1,0x110A, 1,0x110B, 1,0x110C, 1,0x110D, 1,0x110E, 1,0x110F, 1,0x1110, 1,0x1111, 1,0x1112, 1,0x1161, 1,0x1162, 1,0x1163, 1,0x1164, 1,0x1165, 1,0x1166, 1,0x1167, 1,0x1168, 1,0x1169, 1,0x116A, 1,0x116B, 1,0x116C, 1,0x116D, 1,0x116E, 1,0x116F, 1,0x1170, 1,0x1171, 1,0x1172, 1,0x1173, 1,0x1174, 1,0x1175, 1,0x1160, 1,0x1114, 1,0x1115, 1,0x11C7, 1,0x11C8, 1,0x11CC, 1,0x11CE, 1,0x11D3, 1,0x11D7, 1,0x11D9, 1,0x111C, 1,0x11DD, 1,0x11DF, 1,0x111D, 1,0x111E, 1,0x1120, 1,0x1122, 1,0x1123, 1,0x1127, 1,0x1129, 1,0x112B, 1,0x112C, 1,0x112D, 1,0x112E, 1,0x112F, 1,0x1132, 1,0x1136, 1,0x1140, 1,0x1147, 1,0x114C, 1,0x11F1, 1,0x11F2, 1,0x1157, 1,0x1158, 1,0x1159, 1,0x1184, 1,0x1185, 1,0x1188, 1,0x1191, 1,0x1192, 1,0x1194, 1,0x119E, 1,0x11A1, 1,0x30AF, 1,0x30B7, 1,0x30B9, 1,0x30C8, 1,0x30CC, 1,0x30CF, 1,0x30D2, 1,0x30D5, 1,0x30D8, 1,0x30DB, 1,0x30E0, 1,0x30E9, 1,0x30EA, 1,0x30EB, 1,0x30EC, 1,0x30ED, 3, '(',0x1100, ')', 3, '(',0x1102, ')', 3, '(',0x1103, ')', 3, '(',0x1105, ')', 3, '(',0x1106, ')', 3, '(',0x1107, ')', 3, '(',0x1109, ')', 3, '(',0x110B, ')', 3, '(',0x110C, ')', 3, '(',0x110E, ')', 3, '(',0x110F, ')', 3, '(',0x1110, ')', 3, '(',0x1111, ')', 3, '(',0x1112, ')', 4, '(',0x1100,0x1161, ')', 4, '(',0x1102,0x1161, ')', 4, '(',0x1103,0x1161, ')', 4, '(',0x1105,0x1161, ')', 4, '(',0x1106,0x1161, ')', 4, '(',0x1107,0x1161, ')', 4, '(',0x1109,0x1161, ')', 4, '(',0x110B,0x1161, ')', 4, '(',0x110C,0x1161, ')', 4, '(',0x110E,0x1161, ')', 4, '(',0x110F,0x1161, ')', 4, '(',0x1110,0x1161, ')', 4, '(',0x1111,0x1161, ')', 4, '(',0x1112,0x1161, ')', 4, '(',0x110C,0x116E, ')', 7, '(',0x110B,0x1169,0x110C,0x1165,0x11AB, ')', 6, '(',0x110B,0x1169,0x1112,0x116E, ')', 3, '(',0x4E00, ')', 3, '(',0x4E8C, ')', 3, '(',0x4E09, ')', 3, '(',0x56DB, ')', 3, '(',0x4E94, ')', 3, '(',0x516D, ')', 3, '(',0x4E03, ')', 3, '(',0x516B, ')', 3, '(',0x4E5D, ')', 3, '(',0x5341, ')', 3, '(',0x6708, ')', 3, '(',0x706B, ')', 3, '(',0x6C34, ')', 3, '(',0x6728, ')', 3, '(',0x91D1, ')', 3, '(',0x571F, ')', 3, '(',0x65E5, ')', 3, '(',0x682A, ')', 3, '(',0x6709, ')', 3, '(',0x793E, ')', 3, '(',0x540D, ')', 3, '(',0x7279, ')', 3, '(',0x8CA1, ')', 3, '(',0x795D, ')', 3, '(',0x52B4, ')', 3, '(',0x4EE3, ')', 3, '(',0x547C, ')', 3, '(',0x5B66, ')', 3, '(',0x76E3, ')', 3, '(',0x4F01, ')', 3, '(',0x8CC7, ')', 3, '(',0x5354, ')', 3, '(',0x796D, ')', 3, '(',0x4F11, ')', 3, '(',0x81EA, ')', 3, '(',0x81F3, ')', 3, 'P', 'T', 'E', 4, '(', '2', '1', ')', 4, '(', '2', '2', ')', 4, '(', '2', '3', ')', 4, '(', '2', '4', ')', 4, '(', '2', '5', ')', 4, '(', '2', '6', ')', 4, '(', '2', '7', ')', 4, '(', '2', '8', ')', 4, '(', '2', '9', ')', 4, '(', '3', '0', ')', 4, '(', '3', '1', ')', 4, '(', '3', '2', ')', 4, '(', '3', '3', ')', 4, '(', '3', '4', ')', 4, '(', '3', '5', ')', 3, '(',0x1100, ')', 3, '(',0x1102, ')', 3, '(',0x1103, ')', 3, '(',0x1105, ')', 3, '(',0x1106, ')', 3, '(',0x1107, ')', 3, '(',0x1109, ')', 3, '(',0x110B, ')', 3, '(',0x110C, ')', 3, '(',0x110E, ')', 3, '(',0x110F, ')', 3, '(',0x1110, ')', 3, '(',0x1111, ')', 3, '(',0x1112, ')', 4, '(',0x1100,0x1161, ')', 4, '(',0x1102,0x1161, ')', 4, '(',0x1103,0x1161, ')', 4, '(',0x1105,0x1161, ')', 4, '(',0x1106,0x1161, ')', 4, '(',0x1107,0x1161, ')', 4, '(',0x1109,0x1161, ')', 4, '(',0x110B,0x1161, ')', 4, '(',0x110C,0x1161, ')', 4, '(',0x110E,0x1161, ')', 4, '(',0x110F,0x1161, ')', 4, '(',0x1110,0x1161, ')', 4, '(',0x1111,0x1161, ')', 4, '(',0x1112,0x1161, ')', 7, '(',0x110E,0x1161,0x11B7,0x1100,0x1169, ')', 6, '(',0x110C,0x116E,0x110B,0x1174, ')', 3, '(',0x4E00, ')', 3, '(',0x4E8C, ')', 3, '(',0x4E09, ')', 3, '(',0x56DB, ')', 3, '(',0x4E94, ')', 3, '(',0x516D, ')', 3, '(',0x4E03, ')', 3, '(',0x516B, ')', 3, '(',0x4E5D, ')', 3, '(',0x5341, ')', 3, '(',0x6708, ')', 3, '(',0x706B, ')', 3, '(',0x6C34, ')', 3, '(',0x6728, ')', 3, '(',0x91D1, ')', 3, '(',0x571F, ')', 3, '(',0x65E5, ')', 3, '(',0x682A, ')', 3, '(',0x6709, ')', 3, '(',0x793E, ')', 3, '(',0x540D, ')', 3, '(',0x7279, ')', 3, '(',0x8CA1, ')', 3, '(',0x795D, ')', 3, '(',0x52B4, ')', 3, '(',0x79D8, ')', 3, '(',0x7537, ')', 3, '(',0x5973, ')', 3, '(',0x9069, ')', 3, '(',0x512A, ')', 3, '(',0x5370, ')', 3, '(',0x6CE8, ')', 3, '(',0x9805, ')', 3, '(',0x4F11, ')', 3, '(',0x5199, ')', 3, '(',0x6B63, ')', 3, '(',0x4E0A, ')', 3, '(',0x4E2D, ')', 3, '(',0x4E0B, ')', 3, '(',0x5DE6, ')', 3, '(',0x53F3, ')', 3, '(',0x533B, ')', 3, '(',0x5B97, ')', 3, '(',0x5B66, ')', 3, '(',0x76E3, ')', 3, '(',0x4F01, ')', 3, '(',0x8CC7, ')', 3, '(',0x5354, ')', 3, '(',0x591C, ')', 4, '(', '3', '6', ')', 4, '(', '3', '7', ')', 4, '(', '3', '8', ')', 4, '(', '3', '9', ')', 4, '(', '4', '0', ')', 4, '(', '4', '1', ')', 4, '(', '4', '2', ')', 4, '(', '4', '3', ')', 4, '(', '4', '4', ')', 4, '(', '4', '5', ')', 4, '(', '4', '6', ')', 4, '(', '4', '7', ')', 4, '(', '4', '8', ')', 4, '(', '4', '9', ')', 4, '(', '5', '0', ')', 2, '1',0x6708, 2, '2',0x6708, 2, '3',0x6708, 2, '4',0x6708, 2, '5',0x6708, 2, '6',0x6708, 2, '7',0x6708, 2, '8',0x6708, 2, '9',0x6708, 3, '1', '0',0x6708, 3, '1', '1',0x6708, 3, '1', '2',0x6708, 2, 'H', 'g', 3, 'e', 'r', 'g', 2, 'e', 'V', 3, 'L', 'T', 'D', 3, '(',0x30A2, ')', 3, '(',0x30A4, ')', 3, '(',0x30A6, ')', 3, '(',0x30A8, ')', 3, '(',0x30AA, ')', 3, '(',0x30AB, ')', 3, '(',0x30AD, ')', 3, '(',0x30AF, ')', 3, '(',0x30B1, ')', 3, '(',0x30B3, ')', 3, '(',0x30B5, ')', 3, '(',0x30B7, ')', 3, '(',0x30B9, ')', 3, '(',0x30BB, ')', 3, '(',0x30BD, ')', 3, '(',0x30BF, ')', 3, '(',0x30C1, ')', 3, '(',0x30C4, ')', 3, '(',0x30C6, ')', 3, '(',0x30C8, ')', 3, '(',0x30CA, ')', 3, '(',0x30CB, ')', 3, '(',0x30CC, ')', 3, '(',0x30CD, ')', 3, '(',0x30CE, ')', 3, '(',0x30CF, ')', 3, '(',0x30D2, ')', 3, '(',0x30D5, ')', 3, '(',0x30D8, ')', 3, '(',0x30DB, ')', 3, '(',0x30DE, ')', 3, '(',0x30DF, ')', 3, '(',0x30E0, ')', 3, '(',0x30E1, ')', 3, '(',0x30E2, ')', 3, '(',0x30E4, ')', 3, '(',0x30E6, ')', 3, '(',0x30E8, ')', 3, '(',0x30E9, ')', 3, '(',0x30EA, ')', 3, '(',0x30EB, ')', 3, '(',0x30EC, ')', 3, '(',0x30ED, ')', 3, '(',0x30EF, ')', 3, '(',0x30F0, ')', 3, '(',0x30F1, ')', 3, '(',0x30F2, ')', 4,0x30A2,0x30D1,0x30FC,0x30C8, 4,0x30A2,0x30EB,0x30D5,0x30A1, 4,0x30A2,0x30F3,0x30DA,0x30A2, 3,0x30A2,0x30FC,0x30EB, 4,0x30A4,0x30CB,0x30F3,0x30B0, 3,0x30A4,0x30F3,0x30C1, 3,0x30A6,0x30A9,0x30F3, 5,0x30A8,0x30B9,0x30AF,0x30FC,0x30C9, 4,0x30A8,0x30FC,0x30AB,0x30FC, 3,0x30AA,0x30F3,0x30B9, 3,0x30AA,0x30FC,0x30E0, 3,0x30AB,0x30A4,0x30EA, 4,0x30AB,0x30E9,0x30C3,0x30C8, 4,0x30AB,0x30ED,0x30EA,0x30FC, 3,0x30AC,0x30ED,0x30F3, 3,0x30AC,0x30F3,0x30DE, 2,0x30AE,0x30AC, 3,0x30AE,0x30CB,0x30FC, 4,0x30AD,0x30E5,0x30EA,0x30FC, 4,0x30AE,0x30EB,0x30C0,0x30FC, 2,0x30AD,0x30ED, 5,0x30AD,0x30ED,0x30B0,0x30E9,0x30E0, 6,0x30AD,0x30ED,0x30E1,0x30FC,0x30C8,0x30EB, 5,0x30AD,0x30ED,0x30EF,0x30C3,0x30C8, 3,0x30B0,0x30E9,0x30E0, 5,0x30B0,0x30E9,0x30E0,0x30C8,0x30F3, 5,0x30AF,0x30EB,0x30BC,0x30A4,0x30ED, 4,0x30AF,0x30ED,0x30FC,0x30CD, 3,0x30B1,0x30FC,0x30B9, 3,0x30B3,0x30EB,0x30CA, 3,0x30B3,0x30FC,0x30DD, 4,0x30B5,0x30A4,0x30AF,0x30EB, 5,0x30B5,0x30F3,0x30C1,0x30FC,0x30E0, 4,0x30B7,0x30EA,0x30F3,0x30B0, 3,0x30BB,0x30F3,0x30C1, 3,0x30BB,0x30F3,0x30C8, 3,0x30C0,0x30FC,0x30B9, 2,0x30C7,0x30B7, 2,0x30C9,0x30EB, 2,0x30C8,0x30F3, 2,0x30CA,0x30CE, 3,0x30CE,0x30C3,0x30C8, 3,0x30CF,0x30A4,0x30C4, 5,0x30D1,0x30FC,0x30BB,0x30F3,0x30C8, 3,0x30D1,0x30FC,0x30C4, 4,0x30D0,0x30FC,0x30EC,0x30EB, 5,0x30D4,0x30A2,0x30B9,0x30C8,0x30EB, 3,0x30D4,0x30AF,0x30EB, 2,0x30D4,0x30B3, 2,0x30D3,0x30EB, 5,0x30D5,0x30A1,0x30E9,0x30C3,0x30C9, 4,0x30D5,0x30A3,0x30FC,0x30C8, 5,0x30D6,0x30C3,0x30B7,0x30A7,0x30EB, 3,0x30D5,0x30E9,0x30F3, 5,0x30D8,0x30AF,0x30BF,0x30FC,0x30EB, 2,0x30DA,0x30BD, 3,0x30DA,0x30CB,0x30D2, 3,0x30D8,0x30EB,0x30C4, 3,0x30DA,0x30F3,0x30B9, 3,0x30DA,0x30FC,0x30B8, 3,0x30D9,0x30FC,0x30BF, 4,0x30DD,0x30A4,0x30F3,0x30C8, 3,0x30DC,0x30EB,0x30C8, 2,0x30DB,0x30F3, 3,0x30DD,0x30F3,0x30C9, 3,0x30DB,0x30FC,0x30EB, 3,0x30DB,0x30FC,0x30F3, 4,0x30DE,0x30A4,0x30AF,0x30ED, 3,0x30DE,0x30A4,0x30EB, 3,0x30DE,0x30C3,0x30CF, 3,0x30DE,0x30EB,0x30AF, 5,0x30DE,0x30F3,0x30B7,0x30E7,0x30F3, 4,0x30DF,0x30AF,0x30ED,0x30F3, 2,0x30DF,0x30EA, 5,0x30DF,0x30EA,0x30D0,0x30FC,0x30EB, 2,0x30E1,0x30AC, 4,0x30E1,0x30AC,0x30C8,0x30F3, 4,0x30E1,0x30FC,0x30C8,0x30EB, 3,0x30E4,0x30FC,0x30C9, 3,0x30E4,0x30FC,0x30EB, 3,0x30E6,0x30A2,0x30F3, 4,0x30EA,0x30C3,0x30C8,0x30EB, 2,0x30EA,0x30E9, 3,0x30EB,0x30D4,0x30FC, 4,0x30EB,0x30FC,0x30D6,0x30EB, 2,0x30EC,0x30E0, 5,0x30EC,0x30F3,0x30C8,0x30B2,0x30F3, 3,0x30EF,0x30C3,0x30C8, 2, '0',0x70B9, 2, '1',0x70B9, 2, '2',0x70B9, 2, '3',0x70B9, 2, '4',0x70B9, 2, '5',0x70B9, 2, '6',0x70B9, 2, '7',0x70B9, 2, '8',0x70B9, 2, '9',0x70B9, 3, '1', '0',0x70B9, 3, '1', '1',0x70B9, 3, '1', '2',0x70B9, 3, '1', '3',0x70B9, 3, '1', '4',0x70B9, 3, '1', '5',0x70B9, 3, '1', '6',0x70B9, 3, '1', '7',0x70B9, 3, '1', '8',0x70B9, 3, '1', '9',0x70B9, 3, '2', '0',0x70B9, 3, '2', '1',0x70B9, 3, '2', '2',0x70B9, 3, '2', '3',0x70B9, 3, '2', '4',0x70B9, 3, 'h', 'P', 'a', 2, 'd', 'a', 2, 'A', 'U', 3, 'b', 'a', 'r', 2, 'o', 'V', 2, 'p', 'c', 2, 'd', 'm', 4, 'd', 'm', '^', '2', 4, 'd', 'm', '^', '3', 2, 'I', 'U', 2,0x5E73,0x6210, 2,0x662D,0x548C, 2,0x5927,0x6B63, 2,0x660E,0x6CBB, 4,0x682A,0x5F0F,0x4F1A,0x793E, 2, 'p', 'A', 2, 'n', 'A', 2,0x03BC, 'A', 2, 'm', 'A', 2, 'k', 'A', 2, 'K', 'B', 2, 'M', 'B', 2, 'G', 'B', 3, 'c', 'a', 'l', 4, 'k', 'c', 'a', 'l', 2, 'p', 'F', 2, 'n', 'F', 2,0x03BC, 'F', 2,0x03BC, 'g', 2, 'm', 'g', 2, 'k', 'g', 2, 'H', 'z', 3, 'k', 'H', 'z', 3, 'M', 'H', 'z', 3, 'G', 'H', 'z', 3, 'T', 'H', 'z', 2,0x03BC, 'l', 2, 'm', 'l', 2, 'd', 'l', 2, 'k', 'l', 2, 'f', 'm', 2, 'n', 'm', 2,0x03BC, 'm', 2, 'm', 'm', 2, 'c', 'm', 2, 'k', 'm', 4, 'm', 'm', '^', '2', 4, 'c', 'm', '^', '2', 3, 'm', '^', '2', 4, 'k', 'm', '^', '2', 4, 'm', 'm', '^', '3', 4, 'c', 'm', '^', '3', 3, 'm', '^', '3', 4, 'k', 'm', '^', '3', 3, 'm', '/', 's', 5, 'm', '/', 's', '^', '2', 2, 'P', 'a', 3, 'k', 'P', 'a', 3, 'M', 'P', 'a', 3, 'G', 'P', 'a', 3, 'r', 'a', 'd', 5, 'r', 'a', 'd', '/', 's', 7, 'r', 'a', 'd', '/', 's', '^', '2', 2, 'p', 's', 2, 'n', 's', 2,0x03BC, 's', 2, 'm', 's', 2, 'p', 'V', 2, 'n', 'V', 2,0x03BC, 'V', 2, 'm', 'V', 2, 'k', 'V', 2, 'M', 'V', 2, 'p', 'W', 2, 'n', 'W', 2,0x03BC, 'W', 2, 'm', 'W', 2, 'k', 'W', 2, 'M', 'W', 2, 'k',0x03A9, 2, 'M',0x03A9, 4, 'a', '.', 'm', '.', 2, 'B', 'q', 2, 'c', 'c', 2, 'c', 'd', 4, 'C', '/', 'k', 'g', 3, 'C', 'o', '.', 2, 'd', 'B', 2, 'G', 'y', 2, 'h', 'a', 2, 'H', 'P', 2, 'i', 'n', 2, 'K', 'K', 2, 'K', 'M', 2, 'k', 't', 2, 'l', 'm', 2, 'l', 'n', 3, 'l', 'o', 'g', 2, 'l', 'x', 2, 'm', 'b', 3, 'm', 'i', 'l', 3, 'm', 'o', 'l', 2, 'P', 'H', 4, 'p', '.', 'm', '.', 3, 'P', 'P', 'M', 2, 'P', 'R', 2, 's', 'r', 2, 'S', 'v', 2, 'W', 'b', 3, 'V', '/', 'm', 3, 'A', '/', 'm', 3, 'g', 'a', 'l', 2, '1',0x65E5, 2, '2',0x65E5, 2, '3',0x65E5, 2, '4',0x65E5, 2, '5',0x65E5, 2, '6',0x65E5, 2, '7',0x65E5, 2, '8',0x65E5, 2, '9',0x65E5, 3, '1', '0',0x65E5, 3, '1', '1',0x65E5, 3, '1', '2',0x65E5, 3, '1', '3',0x65E5, 3, '1', '4',0x65E5, 3, '1', '5',0x65E5, 3, '1', '6',0x65E5, 3, '1', '7',0x65E5, 3, '1', '8',0x65E5, 3, '1', '9',0x65E5, 3, '2', '0',0x65E5, 3, '2', '1',0x65E5, 3, '2', '2',0x65E5, 3, '2', '3',0x65E5, 3, '2', '4',0x65E5, 3, '2', '5',0x65E5, 3, '2', '6',0x65E5, 3, '2', '7',0x65E5, 3, '2', '8',0x65E5, 3, '2', '9',0x65E5, 3, '3', '0',0x65E5, 3, '3', '1',0x65E5, 1,0x8C48, 1,0x66F4, 1,0x8ECA, 1,0x8CC8, 1,0x6ED1, 1,0x4E32, 1,0x53E5, 1,0x9F9C, 1,0x9F9C, 1,0x5951, 1,0x91D1, 1,0x5587, 1,0x5948, 1,0x61F6, 1,0x7669, 1,0x7F85, 1,0x863F, 1,0x87BA, 1,0x88F8, 1,0x908F, 1,0x6A02, 1,0x6D1B, 1,0x70D9, 1,0x73DE, 1,0x843D, 1,0x916A, 1,0x99F1, 1,0x4E82, 1,0x5375, 1,0x6B04, 1,0x721B, 1,0x862D, 1,0x9E1E, 1,0x5D50, 1,0x6FEB, 1,0x85CD, 1,0x8964, 1,0x62C9, 1,0x81D8, 1,0x881F, 1,0x5ECA, 1,0x6717, 1,0x6D6A, 1,0x72FC, 1,0x90CE, 1,0x4F86, 1,0x51B7, 1,0x52DE, 1,0x64C4, 1,0x6AD3, 1,0x7210, 1,0x76E7, 1,0x8001, 1,0x8606, 1,0x865C, 1,0x8DEF, 1,0x9732, 1,0x9B6F, 1,0x9DFA, 1,0x788C, 1,0x797F, 1,0x7DA0, 1,0x83C9, 1,0x9304, 1,0x9E7F, 1,0x8AD6, 1,0x58DF, 1,0x5F04, 1,0x7C60, 1,0x807E, 1,0x7262, 1,0x78CA, 1,0x8CC2, 1,0x96F7, 1,0x58D8, 1,0x5C62, 1,0x6A13, 1,0x6DDA, 1,0x6F0F, 1,0x7D2F, 1,0x7E37, 1,0x964B, 1,0x52D2, 1,0x808B, 1,0x51DC, 1,0x51CC, 1,0x7A1C, 1,0x7DBE, 1,0x83F1, 1,0x9675, 1,0x8B80, 1,0x62CF, 1,0x6A02, 1,0x8AFE, 1,0x4E39, 1,0x5BE7, 1,0x6012, 1,0x7387, 1,0x7570, 1,0x5317, 1,0x78FB, 1,0x4FBF, 1,0x5FA9, 1,0x4E0D, 1,0x6CCC, 1,0x6578, 1,0x7D22, 1,0x53C3, 1,0x585E, 1,0x7701, 1,0x8449, 1,0x8AAA, 1,0x6BBA, 1,0x8FB0, 1,0x6C88, 1,0x62FE, 1,0x82E5, 1,0x63A0, 1,0x7565, 1,0x4EAE, 1,0x5169, 1,0x51C9, 1,0x6881, 1,0x7CE7, 1,0x826F, 1,0x8AD2, 1,0x91CF, 1,0x52F5, 1,0x5442, 1,0x5973, 1,0x5EEC, 1,0x65C5, 1,0x6FFE, 1,0x792A, 1,0x95AD, 1,0x9A6A, 1,0x9E97, 1,0x9ECE, 1,0x529B, 1,0x66C6, 1,0x6B77, 1,0x8F62, 1,0x5E74, 1,0x6190, 1,0x6200, 1,0x649A, 1,0x6F23, 1,0x7149, 1,0x7489, 1,0x79CA, 1,0x7DF4, 1,0x806F, 1,0x8F26, 1,0x84EE, 1,0x9023, 1,0x934A, 1,0x5217, 1,0x52A3, 1,0x54BD, 1,0x70C8, 1,0x88C2, 1,0x8AAA, 1,0x5EC9, 1,0x5FF5, 1,0x637B, 1,0x6BAE, 1,0x7C3E, 1,0x7375, 1,0x4EE4, 1,0x56F9, 1,0x5BE7, 1,0x5DBA, 1,0x601C, 1,0x73B2, 1,0x7469, 1,0x7F9A, 1,0x8046, 1,0x9234, 1,0x96F6, 1,0x9748, 1,0x9818, 1,0x4F8B, 1,0x79AE, 1,0x91B4, 1,0x96B8, 1,0x60E1, 1,0x4E86, 1,0x50DA, 1,0x5BEE, 1,0x5C3F, 1,0x6599, 1,0x6A02, 1,0x71CE, 1,0x7642, 1,0x84FC, 1,0x907C, 1,0x9F8D, 1,0x6688, 1,0x962E, 1,0x5289, 1,0x677B, 1,0x67F3, 1,0x6D41, 1,0x6E9C, 1,0x7409, 1,0x7559, 1,0x786B, 1,0x7D10, 1,0x985E, 1,0x516D, 1,0x622E, 1,0x9678, 1,0x502B, 1,0x5D19, 1,0x6DEA, 1,0x8F2A, 1,0x5F8B, 1,0x6144, 1,0x6817, 1,0x7387, 1,0x9686, 1,0x5229, 1,0x540F, 1,0x5C65, 1,0x6613, 1,0x674E, 1,0x68A8, 1,0x6CE5, 1,0x7406, 1,0x75E2, 1,0x7F79, 1,0x88CF, 1,0x88E1, 1,0x91CC, 1,0x96E2, 1,0x533F, 1,0x6EBA, 1,0x541D, 1,0x71D0, 1,0x7498, 1,0x85FA, 1,0x96A3, 1,0x9C57, 1,0x9E9F, 1,0x6797, 1,0x6DCB, 1,0x81E8, 1,0x7ACB, 1,0x7B20, 1,0x7C92, 1,0x72C0, 1,0x7099, 1,0x8B58, 1,0x4EC0, 1,0x8336, 1,0x523A, 1,0x5207, 1,0x5EA6, 1,0x62D3, 1,0x7CD6, 1,0x5B85, 1,0x6D1E, 1,0x66B4, 1,0x8F3B, 1,0x884C, 1,0x964D, 1,0x898B, 1,0x5ED3, 1,0x5140, 1,0x55C0, 1,0x585A, 1,0x6674, 1,0x51DE, 1,0x732A, 1,0x76CA, 1,0x793C, 1,0x795E, 1,0x7965, 1,0x798F, 1,0x9756, 1,0x7CBE, 1,0x7FBD, 1,0x8612, 1,0x8AF8, 1,0x9038, 1,0x90FD, 1,0x98EF, 1,0x98FC, 1,0x9928, 1,0x9DB4, 1,0x4FAE, 1,0x50E7, 1,0x514D, 1,0x52C9, 1,0x52E4, 1,0x5351, 1,0x559D, 1,0x5606, 1,0x5668, 1,0x5840, 1,0x58A8, 1,0x5C64, 1,0x5C6E, 1,0x6094, 1,0x6168, 1,0x618E, 1,0x61F2, 1,0x654F, 1,0x65E2, 1,0x6691, 1,0x6885, 1,0x6D77, 1,0x6E1A, 1,0x6F22, 1,0x716E, 1,0x722B, 1,0x7422, 1,0x7891, 1,0x793E, 1,0x7949, 1,0x7948, 1,0x7950, 1,0x7956, 1,0x795D, 1,0x798D, 1,0x798E, 1,0x7A40, 1,0x7A81, 1,0x7BC0, 1,0x7DF4, 1,0x7E09, 1,0x7E41, 1,0x7F72, 1,0x8005, 1,0x81ED, 1,0x8279, 1,0x8279, 1,0x8457, 1,0x8910, 1,0x8996, 1,0x8B01, 1,0x8B39, 1,0x8CD3, 1,0x8D08, 1,0x8FB6, 1,0x9038, 1,0x96E3, 1,0x97FF, 1,0x983B, 2, 'f', 'f', 2, 'f', 'i', 2, 'f', 'l', 3, 'f', 'f', 'i', 3, 'f', 'f', 'l', 2,0x017F, 't', 2, 's', 't', 2,0x0574,0x0576, 2,0x0574,0x0565, 2,0x0574,0x056B, 2,0x057E,0x0576, 2,0x0574,0x056D, 1,0x05E2, 1,0x05D0, 1,0x05D3, 1,0x05D4, 1,0x05DB, 1,0x05DC, 1,0x05DD, 1,0x05E8, 1,0x05EA, 1, '+', 2,0x05D0,0x05DC, 1,0x203E, 1,0x203E, 1,0x203E, 1,0x203E, 1, '_', 1, '_', 1, '_', 1, ',', 1,0x3001, 1, '.', 1, ';', 1, ':', 1, '?', 1, '!', 1,0x2014, 1, '(', 1, ')', 1, '{', 1, '}', 1,0x3014, 1,0x3015, 1, '#', 1, '&', 1, '*', 1, '+', 1, '-', 1, '<', 1, '>', 1, '=', 1,'\\', 1, '$', 1, '%', 1, '@', 1, '!', 1, '"', 1, '#', 1, '$', 1, '%', 1, '&', 1,'\'', 1, '(', 1, ')', 1, '*', 1, '+', 1, ',', 1, '-', 1, '.', 1, '/', 1, '0', 1, '1', 1, '2', 1, '3', 1, '4', 1, '5', 1, '6', 1, '7', 1, '8', 1, '9', 1, ':', 1, ';', 1, '<', 1, '=', 1, '>', 1, '?', 1, '@', 1, 'A', 1, 'B', 1, 'C', 1, 'D', 1, 'E', 1, 'F', 1, 'G', 1, 'H', 1, 'I', 1, 'J', 1, 'K', 1, 'L', 1, 'M', 1, 'N', 1, 'O', 1, 'P', 1, 'Q', 1, 'R', 1, 'S', 1, 'T', 1, 'U', 1, 'V', 1, 'W', 1, 'X', 1, 'Y', 1, 'Z', 1, '[', 1,'\\', 1, ']', 1, '^', 1, '_', 1, '`', 1, 'a', 1, 'b', 1, 'c', 1, 'd', 1, 'e', 1, 'f', 1, 'g', 1, 'h', 1, 'i', 1, 'j', 1, 'k', 1, 'l', 1, 'm', 1, 'n', 1, 'o', 1, 'p', 1, 'q', 1, 'r', 1, 's', 1, 't', 1, 'u', 1, 'v', 1, 'w', 1, 'x', 1, 'y', 1, 'z', 1, '{', 1, '|', 1, '}', 1, '~', 1,0x2985, 1,0x2986, 1,0x3002, 1,0x300C, 1,0x300D, 1,0x3001, 1,0x30FB, 1,0x30F2, 1,0x30A1, 1,0x30A3, 1,0x30A5, 1,0x30A7, 1,0x30A9, 1,0x30E3, 1,0x30E5, 1,0x30E7, 1,0x30C3, 1,0x30FC, 1,0x30A2, 1,0x30A4, 1,0x30A6, 1,0x30A8, 1,0x30AA, 1,0x30AB, 1,0x30AD, 1,0x30AF, 1,0x30B1, 1,0x30B3, 1,0x30B5, 1,0x30B7, 1,0x30B9, 1,0x30BB, 1,0x30BD, 1,0x30BF, 1,0x30C1, 1,0x30C4, 1,0x30C6, 1,0x30C8, 1,0x30CA, 1,0x30CB, 1,0x30CC, 1,0x30CD, 1,0x30CE, 1,0x30CF, 1,0x30D2, 1,0x30D5, 1,0x30D8, 1,0x30DB, 1,0x30DE, 1,0x30DF, 1,0x30E0, 1,0x30E1, 1,0x30E2, 1,0x30E4, 1,0x30E6, 1,0x30E8, 1,0x30E9, 1,0x30EA, 1,0x30EB, 1,0x30EC, 1,0x30ED, 1,0x30EF, 1,0x30F3, 1,0x3099, 1,0x309A, 1,0x3164, 1,0x3131, 1,0x3132, 1,0x3133, 1,0x3134, 1,0x3135, 1,0x3136, 1,0x3137, 1,0x3138, 1,0x3139, 1,0x313A, 1,0x313B, 1,0x313C, 1,0x313D, 1,0x313E, 1,0x313F, 1,0x3140, 1,0x3141, 1,0x3142, 1,0x3143, 1,0x3144, 1,0x3145, 1,0x3146, 1,0x3147, 1,0x3148, 1,0x3149, 1,0x314A, 1,0x314B, 1,0x314C, 1,0x314D, 1,0x314E, 1,0x314F, 1,0x3150, 1,0x3151, 1,0x3152, 1,0x3153, 1,0x3154, 1,0x3155, 1,0x3156, 1,0x3157, 1,0x3158, 1,0x3159, 1,0x315A, 1,0x315B, 1,0x315C, 1,0x315D, 1,0x315E, 1,0x315F, 1,0x3160, 1,0x3161, 1,0x3162, 1,0x3163, 1,0xA2, 1,0xA3, 1,0xAC, 1,0xAF, 1,0xA6, 1,0xA5, 1,0x20A9, 1,0x2502, 1,0x2190, 1,0x2191, 1,0x2192, 1,0x2193, 1,0x25A0, 1,0x25CB, 1, 'A', 1, 'B', 1, 'C', 1, 'D', 1, 'E', 1, 'F', 1, 'G', 1, 'H', 1, 'I', 1, 'J', 1, 'K', 1, 'L', 1, 'M', 1, 'N', 1, 'O', 1, 'P', 1, 'Q', 1, 'R', 1, 'S', 1, 'T', 1, 'U', 1, 'V', 1, 'W', 1, 'X', 1, 'Y', 1, 'Z', 1, 'a', 1, 'b', 1, 'c', 1, 'd', 1, 'e', 1, 'f', 1, 'g', 1, 'h', 1, 'i', 1, 'j', 1, 'k', 1, 'l', 1, 'm', 1, 'n', 1, 'o', 1, 'p', 1, 'q', 1, 'r', 1, 's', 1, 't', 1, 'u', 1, 'v', 1, 'w', 1, 'x', 1, 'y', 1, 'z', 1, 'A', 1, 'B', 1, 'C', 1, 'D', 1, 'E', 1, 'F', 1, 'G', 1, 'H', 1, 'I', 1, 'J', 1, 'K', 1, 'L', 1, 'M', 1, 'N', 1, 'O', 1, 'P', 1, 'Q', 1, 'R', 1, 'S', 1, 'T', 1, 'U', 1, 'V', 1, 'W', 1, 'X', 1, 'Y', 1, 'Z', 1, 'a', 1, 'b', 1, 'c', 1, 'd', 1, 'e', 1, 'f', 1, 'g', 1, 'i', 1, 'j', 1, 'k', 1, 'l', 1, 'm', 1, 'n', 1, 'o', 1, 'p', 1, 'q', 1, 'r', 1, 's', 1, 't', 1, 'u', 1, 'v', 1, 'w', 1, 'x', 1, 'y', 1, 'z', 1, 'A', 1, 'B', 1, 'C', 1, 'D', 1, 'E', 1, 'F', 1, 'G', 1, 'H', 1, 'I', 1, 'J', 1, 'K', 1, 'L', 1, 'M', 1, 'N', 1, 'O', 1, 'P', 1, 'Q', 1, 'R', 1, 'S', 1, 'T', 1, 'U', 1, 'V', 1, 'W', 1, 'X', 1, 'Y', 1, 'Z', 1, 'a', 1, 'b', 1, 'c', 1, 'd', 1, 'e', 1, 'f', 1, 'g', 1, 'h', 1, 'i', 1, 'j', 1, 'k', 1, 'l', 1, 'm', 1, 'n', 1, 'o', 1, 'p', 1, 'q', 1, 'r', 1, 's', 1, 't', 1, 'u', 1, 'v', 1, 'w', 1, 'x', 1, 'y', 1, 'z', 1, 'A', 1, 'C', 1, 'D', 1, 'G', 1, 'J', 1, 'K', 1, 'N', 1, 'O', 1, 'P', 1, 'Q', 1, 'S', 1, 'T', 1, 'U', 1, 'V', 1, 'W', 1, 'X', 1, 'Y', 1, 'Z', 1, 'a', 1, 'b', 1, 'c', 1, 'd', 1, 'f', 1, 'h', 1, 'i', 1, 'j', 1, 'k', 1, 'l', 1, 'm', 1, 'n', 1, 'p', 1, 'q', 1, 'r', 1, 's', 1, 't', 1, 'u', 1, 'v', 1, 'w', 1, 'x', 1, 'y', 1, 'z', 1, 'A', 1, 'B', 1, 'C', 1, 'D', 1, 'E', 1, 'F', 1, 'G', 1, 'H', 1, 'I', 1, 'J', 1, 'K', 1, 'L', 1, 'M', 1, 'N', 1, 'O', 1, 'P', 1, 'Q', 1, 'R', 1, 'S', 1, 'T', 1, 'U', 1, 'V', 1, 'W', 1, 'X', 1, 'Y', 1, 'Z', 1, 'a', 1, 'b', 1, 'c', 1, 'd', 1, 'e', 1, 'f', 1, 'g', 1, 'h', 1, 'i', 1, 'j', 1, 'k', 1, 'l', 1, 'm', 1, 'n', 1, 'o', 1, 'p', 1, 'q', 1, 'r', 1, 's', 1, 't', 1, 'u', 1, 'v', 1, 'w', 1, 'x', 1, 'y', 1, 'z', 1, 'A', 1, 'B', 1, 'D', 1, 'E', 1, 'F', 1, 'G', 1, 'J', 1, 'K', 1, 'L', 1, 'M', 1, 'N', 1, 'O', 1, 'P', 1, 'Q', 1, 'S', 1, 'T', 1, 'U', 1, 'V', 1, 'W', 1, 'X', 1, 'Y', 1, 'a', 1, 'b', 1, 'c', 1, 'd', 1, 'e', 1, 'f', 1, 'g', 1, 'h', 1, 'i', 1, 'j', 1, 'k', 1, 'l', 1, 'm', 1, 'n', 1, 'o', 1, 'p', 1, 'q', 1, 'r', 1, 's', 1, 't', 1, 'u', 1, 'v', 1, 'w', 1, 'x', 1, 'y', 1, 'z', 1, 'A', 1, 'B', 1, 'D', 1, 'E', 1, 'F', 1, 'G', 1, 'I', 1, 'J', 1, 'K', 1, 'L', 1, 'M', 1, 'O', 1, 'S', 1, 'T', 1, 'U', 1, 'V', 1, 'W', 1, 'X', 1, 'Y', 1, 'a', 1, 'b', 1, 'c', 1, 'd', 1, 'e', 1, 'f', 1, 'g', 1, 'h', 1, 'i', 1, 'j', 1, 'k', 1, 'l', 1, 'm', 1, 'n', 1, 'o', 1, 'p', 1, 'q', 1, 'r', 1, 's', 1, 't', 1, 'u', 1, 'v', 1, 'w', 1, 'x', 1, 'y', 1, 'z', 1, 'A', 1, 'B', 1, 'C', 1, 'D', 1, 'E', 1, 'F', 1, 'G', 1, 'H', 1, 'I', 1, 'J', 1, 'K', 1, 'L', 1, 'M', 1, 'N', 1, 'O', 1, 'P', 1, 'Q', 1, 'R', 1, 'S', 1, 'T', 1, 'U', 1, 'V', 1, 'W', 1, 'X', 1, 'Y', 1, 'Z', 1, 'a', 1, 'b', 1, 'c', 1, 'd', 1, 'e', 1, 'f', 1, 'g', 1, 'h', 1, 'i', 1, 'j', 1, 'k', 1, 'l', 1, 'm', 1, 'n', 1, 'o', 1, 'p', 1, 'q', 1, 'r', 1, 's', 1, 't', 1, 'u', 1, 'v', 1, 'w', 1, 'x', 1, 'y', 1, 'z', 1, 'A', 1, 'B', 1, 'C', 1, 'D', 1, 'E', 1, 'F', 1, 'G', 1, 'H', 1, 'I', 1, 'J', 1, 'K', 1, 'L', 1, 'M', 1, 'N', 1, 'O', 1, 'P', 1, 'Q', 1, 'R', 1, 'S', 1, 'T', 1, 'U', 1, 'V', 1, 'W', 1, 'X', 1, 'Y', 1, 'Z', 1, 'a', 1, 'b', 1, 'c', 1, 'd', 1, 'e', 1, 'f', 1, 'g', 1, 'h', 1, 'i', 1, 'j', 1, 'k', 1, 'l', 1, 'm', 1, 'n', 1, 'o', 1, 'p', 1, 'q', 1, 'r', 1, 's', 1, 't', 1, 'u', 1, 'v', 1, 'w', 1, 'x', 1, 'y', 1, 'z', 1, 'A', 1, 'B', 1, 'C', 1, 'D', 1, 'E', 1, 'F', 1, 'G', 1, 'H', 1, 'I', 1, 'J', 1, 'K', 1, 'L', 1, 'M', 1, 'N', 1, 'O', 1, 'P', 1, 'Q', 1, 'R', 1, 'S', 1, 'T', 1, 'U', 1, 'V', 1, 'W', 1, 'X', 1, 'Y', 1, 'Z', 1, 'a', 1, 'b', 1, 'c', 1, 'd', 1, 'e', 1, 'f', 1, 'g', 1, 'h', 1, 'i', 1, 'j', 1, 'k', 1, 'l', 1, 'm', 1, 'n', 1, 'o', 1, 'p', 1, 'q', 1, 'r', 1, 's', 1, 't', 1, 'u', 1, 'v', 1, 'w', 1, 'x', 1, 'y', 1, 'z', 1, 'A', 1, 'B', 1, 'C', 1, 'D', 1, 'E', 1, 'F', 1, 'G', 1, 'H', 1, 'I', 1, 'J', 1, 'K', 1, 'L', 1, 'M', 1, 'N', 1, 'O', 1, 'P', 1, 'Q', 1, 'R', 1, 'S', 1, 'T', 1, 'U', 1, 'V', 1, 'W', 1, 'X', 1, 'Y', 1, 'Z', 1, 'a', 1, 'b', 1, 'c', 1, 'd', 1, 'e', 1, 'f', 1, 'g', 1, 'h', 1, 'i', 1, 'j', 1, 'k', 1, 'l', 1, 'm', 1, 'n', 1, 'o', 1, 'p', 1, 'q', 1, 'r', 1, 's', 1, 't', 1, 'u', 1, 'v', 1, 'w', 1, 'x', 1, 'y', 1, 'z', 1, 'A', 1, 'B', 1, 'C', 1, 'D', 1, 'E', 1, 'F', 1, 'G', 1, 'H', 1, 'I', 1, 'J', 1, 'K', 1, 'L', 1, 'M', 1, 'N', 1, 'O', 1, 'P', 1, 'Q', 1, 'R', 1, 'S', 1, 'T', 1, 'U', 1, 'V', 1, 'W', 1, 'X', 1, 'Y', 1, 'Z', 1, 'a', 1, 'b', 1, 'c', 1, 'd', 1, 'e', 1, 'f', 1, 'g', 1, 'h', 1, 'i', 1, 'j', 1, 'k', 1, 'l', 1, 'm', 1, 'n', 1, 'o', 1, 'p', 1, 'q', 1, 'r', 1, 's', 1, 't', 1, 'u', 1, 'v', 1, 'w', 1, 'x', 1, 'y', 1, 'z', 1, 'A', 1, 'B', 1, 'C', 1, 'D', 1, 'E', 1, 'F', 1, 'G', 1, 'H', 1, 'I', 1, 'J', 1, 'K', 1, 'L', 1, 'M', 1, 'N', 1, 'O', 1, 'P', 1, 'Q', 1, 'R', 1, 'S', 1, 'T', 1, 'U', 1, 'V', 1, 'W', 1, 'X', 1, 'Y', 1, 'Z', 1, 'a', 1, 'b', 1, 'c', 1, 'd', 1, 'e', 1, 'f', 1, 'g', 1, 'h', 1, 'i', 1, 'j', 1, 'k', 1, 'l', 1, 'm', 1, 'n', 1, 'o', 1, 'p', 1, 'q', 1, 'r', 1, 's', 1, 't', 1, 'u', 1, 'v', 1, 'w', 1, 'x', 1, 'y', 1, 'z', 1,0x0391, 1,0x0392, 1,0x0393, 1,0x0394, 1,0x0395, 1,0x0396, 1,0x0397, 1,0x0398, 1,0x0399, 1,0x039A, 1,0x039B, 1,0x039C, 1,0x039D, 1,0x039E, 1,0x039F, 1,0x03A0, 1,0x03A1, 1,0x03F4, 1,0x03A3, 1,0x03A4, 1,0x03A5, 1,0x03A6, 1,0x03A7, 1,0x03A8, 1,0x03A9, 1,0x2207, 1,0x03B1, 1,0x03B2, 1,0x03B3, 1,0x03B4, 1,0x03B5, 1,0x03B6, 1,0x03B7, 1,0x03B8, 1,0x03B9, 1,0x03BA, 1,0x03BB, 1,0x03BC, 1,0x03BD, 1,0x03BE, 1,0x03BF, 1,0x03C0, 1,0x03C1, 1,0x03C2, 1,0x03C3, 1,0x03C4, 1,0x03C5, 1,0x03C6, 1,0x03C7, 1,0x03C8, 1,0x03C9, 1,0x2202, 1,0x03F5, 1,0x03D1, 1,0x03F0, 1,0x03D5, 1,0x03F1, 1,0x03D6, 1,0x0391, 1,0x0392, 1,0x0393, 1,0x0394, 1,0x0395, 1,0x0396, 1,0x0397, 1,0x0398, 1,0x0399, 1,0x039A, 1,0x039B, 1,0x039C, 1,0x039D, 1,0x039E, 1,0x039F, 1,0x03A0, 1,0x03A1, 1,0x03F4, 1,0x03A3, 1,0x03A4, 1,0x03A5, 1,0x03A6, 1,0x03A7, 1,0x03A8, 1,0x03A9, 1,0x2207, 1,0x03B1, 1,0x03B2, 1,0x03B3, 1,0x03B4, 1,0x03B5, 1,0x03B6, 1,0x03B7, 1,0x03B8, 1,0x03B9, 1,0x03BA, 1,0x03BB, 1,0x03BC, 1,0x03BD, 1,0x03BE, 1,0x03BF, 1,0x03C0, 1,0x03C1, 1,0x03C2, 1,0x03C3, 1,0x03C4, 1,0x03C5, 1,0x03C6, 1,0x03C7, 1,0x03C8, 1,0x03C9, 1,0x2202, 1,0x03F5, 1,0x03D1, 1,0x03F0, 1,0x03D5, 1,0x03F1, 1,0x03D6, 1,0x0391, 1,0x0392, 1,0x0393, 1,0x0394, 1,0x0395, 1,0x0396, 1,0x0397, 1,0x0398, 1,0x0399, 1,0x039A, 1,0x039B, 1,0x039C, 1,0x039D, 1,0x039E, 1,0x039F, 1,0x03A0, 1,0x03A1, 1,0x03F4, 1,0x03A3, 1,0x03A4, 1,0x03A5, 1,0x03A6, 1,0x03A7, 1,0x03A8, 1,0x03A9, 1,0x2207, 1,0x03B1, 1,0x03B2, 1,0x03B3, 1,0x03B4, 1,0x03B5, 1,0x03B6, 1,0x03B7, 1,0x03B8, 1,0x03B9, 1,0x03BA, 1,0x03BB, 1,0x03BC, 1,0x03BD, 1,0x03BE, 1,0x03BF, 1,0x03C0, 1,0x03C1, 1,0x03C2, 1,0x03C3, 1,0x03C4, 1,0x03C5, 1,0x03C6, 1,0x03C7, 1,0x03C8, 1,0x03C9, 1,0x2202, 1,0x03F5, 1,0x03D1, 1,0x03F0, 1,0x03D5, 1,0x03F1, 1,0x03D6, 1,0x0391, 1,0x0392, 1,0x0393, 1,0x0394, 1,0x0395, 1,0x0396, 1,0x0397, 1,0x0398, 1,0x0399, 1,0x039A, 1,0x039B, 1,0x039C, 1,0x039D, 1,0x039E, 1,0x039F, 1,0x03A0, 1,0x03A1, 1,0x03F4, 1,0x03A3, 1,0x03A4, 1,0x03A5, 1,0x03A6, 1,0x03A7, 1,0x03A8, 1,0x03A9, 1,0x2207, 1,0x03B1, 1,0x03B2, 1,0x03B3, 1,0x03B4, 1,0x03B5, 1,0x03B6, 1,0x03B7, 1,0x03B8, 1,0x03B9, 1,0x03BA, 1,0x03BB, 1,0x03BC, 1,0x03BD, 1,0x03BE, 1,0x03BF, 1,0x03C0, 1,0x03C1, 1,0x03C2, 1,0x03C3, 1,0x03C4, 1,0x03C5, 1,0x03C6, 1,0x03C7, 1,0x03C8, 1,0x03C9, 1,0x2202, 1,0x03F5, 1,0x03D1, 1,0x03F0, 1,0x03D5, 1,0x03F1, 1,0x03D6, 1,0x0391, 1,0x0392, 1,0x0393, 1,0x0394, 1,0x0395, 1,0x0396, 1,0x0397, 1,0x0398, 1,0x0399, 1,0x039A, 1,0x039B, 1,0x039C, 1,0x039D, 1,0x039E, 1,0x039F, 1,0x03A0, 1,0x03A1, 1,0x03F4, 1,0x03A3, 1,0x03A4, 1,0x03A5, 1,0x03A6, 1,0x03A7, 1,0x03A8, 1,0x03A9, 1,0x2207, 1,0x03B1, 1,0x03B2, 1,0x03B3, 1,0x03B4, 1,0x03B5, 1,0x03B6, 1,0x03B7, 1,0x03B8, 1,0x03B9, 1,0x03BA, 1,0x03BB, 1,0x03BC, 1,0x03BD, 1,0x03BE, 1,0x03BF, 1,0x03C0, 1,0x03C1, 1,0x03C2, 1,0x03C3, 1,0x03C4, 1,0x03C5, 1,0x03C6, 1,0x03C7, 1,0x03C8, 1,0x03C9, 1,0x2202, 1,0x03F5, 1,0x03D1, 1,0x03F0, 1,0x03D5, 1,0x03F1, 1,0x03D6, 1, '0', 1, '1', 1, '2', 1, '3', 1, '4', 1, '5', 1, '6', 1, '7', 1, '8', 1, '9', 1, '0', 1, '1', 1, '2', 1, '3', 1, '4', 1, '5', 1, '6', 1, '7', 1, '8', 1, '9', 1, '0', 1, '1', 1, '2', 1, '3', 1, '4', 1, '5', 1, '6', 1, '7', 1, '8', 1, '9', 1, '0', 1, '1', 1, '2', 1, '3', 1, '4', 1, '5', 1, '6', 1, '7', 1, '8', 1, '9', 1, '0', 1, '1', 1, '2', 1, '3', 1, '4', 1, '5', 1, '6', 1, '7', 1, '8', 1, '9', 1,0x4E3D, 1,0x4E38, 1,0x4E41, 1,0x20122, 1,0x4F60, 1,0x4FAE, 1,0x4FBB, 1,0x5002, 1,0x507A, 1,0x5099, 1,0x50E7, 1,0x50CF, 1,0x349E, 1,0x2063A, 1,0x514D, 1,0x5154, 1,0x5164, 1,0x5177, 1,0x2051C, 1,0x34B9, 1,0x5167, 1,0x518D, 1,0x2054B, 1,0x5197, 1,0x51A4, 1,0x4ECC, 1,0x51AC, 1,0x51B5, 1,0x291DF, 1,0x51F5, 1,0x5203, 1,0x34DF, 1,0x523B, 1,0x5246, 1,0x5272, 1,0x5277, 1,0x3515, 1,0x52C7, 1,0x52C9, 1,0x52E4, 1,0x52FA, 1,0x5305, 1,0x5306, 1,0x5317, 1,0x5349, 1,0x5351, 1,0x535A, 1,0x5373, 1,0x537D, 1,0x537F, 1,0x537F, 1,0x537F, 1,0x20A2C, 1,0x7070, 1,0x53CA, 1,0x53DF, 1,0x20B63, 1,0x53EB, 1,0x53F1, 1,0x5406, 1,0x549E, 1,0x5438, 1,0x5448, 1,0x5468, 1,0x54A2, 1,0x54F6, 1,0x5510, 1,0x5553, 1,0x5563, 1,0x5584, 1,0x5584, 1,0x5599, 1,0x55AB, 1,0x55B3, 1,0x55C2, 1,0x5716, 1,0x5606, 1,0x5717, 1,0x5651, 1,0x5674, 1,0x5207, 1,0x58EE, 1,0x57CE, 1,0x57F4, 1,0x580D, 1,0x578B, 1,0x5832, 1,0x5831, 1,0x58AC, 1,0x214E4, 1,0x58F2, 1,0x58F7, 1,0x5906, 1,0x591A, 1,0x5922, 1,0x5962, 1,0x216A8, 1,0x216EA, 1,0x59EC, 1,0x5A1B, 1,0x5A27, 1,0x59D8, 1,0x5A66, 1,0x36EE, 1,0x36FC, 1,0x5B08, 1,0x5B3E, 1,0x5B3E, 1,0x219C8, 1,0x5BC3, 1,0x5BD8, 1,0x5BE7, 1,0x5BF3, 1,0x21B18, 1,0x5BFF, 1,0x5C06, 1,0x5F53, 1,0x5C22, 1,0x3781, 1,0x5C60, 1,0x5C6E, 1,0x5CC0, 1,0x5C8D, 1,0x21DE4, 1,0x5D43, 1,0x21DE6, 1,0x5D6E, 1,0x5D6B, 1,0x5D7C, 1,0x5DE1, 1,0x5DE2, 1,0x382F, 1,0x5DFD, 1,0x5E28, 1,0x5E3D, 1,0x5E69, 1,0x3862, 1,0x22183, 1,0x387C, 1,0x5EB0, 1,0x5EB3, 1,0x5EB6, 1,0x5ECA, 1,0x2A392, 1,0x5EFE, 1,0x22331, 1,0x22331, 1,0x8201, 1,0x5F22, 1,0x5F22, 1,0x38C7, 1,0x232B8, 1,0x261DA, 1,0x5F62, 1,0x5F6B, 1,0x38E3, 1,0x5F9A, 1,0x5FCD, 1,0x5FD7, 1,0x5FF9, 1,0x6081, 1,0x393A, 1,0x391C, 1,0x6094, 1,0x226D4, 1,0x60C7, 1,0x6148, 1,0x614C, 1,0x614E, 1,0x614C, 1,0x617A, 1,0x618E, 1,0x61B2, 1,0x61A4, 1,0x61AF, 1,0x61DE, 1,0x61F2, 1,0x61F6, 1,0x6210, 1,0x621B, 1,0x625D, 1,0x62B1, 1,0x62D4, 1,0x6350, 1,0x22B0C, 1,0x633D, 1,0x62FC, 1,0x6368, 1,0x6383, 1,0x63E4, 1,0x22BF1, 1,0x6422, 1,0x63C5, 1,0x63A9, 1,0x3A2E, 1,0x6469, 1,0x647E, 1,0x649D, 1,0x6477, 1,0x3A6C, 1,0x654F, 1,0x656C, 1,0x2300A, 1,0x65E3, 1,0x66F8, 1,0x6649, 1,0x3B19, 1,0x6691, 1,0x3B08, 1,0x3AE4, 1,0x5192, 1,0x5195, 1,0x6700, 1,0x669C, 1,0x80AD, 1,0x43D9, 1,0x6717, 1,0x671B, 1,0x6721, 1,0x675E, 1,0x6753, 1,0x233C3, 1,0x3B49, 1,0x67FA, 1,0x6785, 1,0x6852, 1,0x6885, 1,0x2346D, 1,0x688E, 1,0x681F, 1,0x6914, 1,0x3B9D, 1,0x6942, 1,0x69A3, 1,0x69EA, 1,0x6AA8, 1,0x236A3, 1,0x6ADB, 1,0x3C18, 1,0x6B21, 1,0x238A7, 1,0x6B54, 1,0x3C4E, 1,0x6B72, 1,0x6B9F, 1,0x6BBA, 1,0x6BBB, 1,0x23A8D, 1,0x21D0B, 1,0x23AFA, 1,0x6C4E, 1,0x23CBC, 1,0x6CBF, 1,0x6CCD, 1,0x6C67, 1,0x6D16, 1,0x6D3E, 1,0x6D77, 1,0x6D41, 1,0x6D69, 1,0x6D78, 1,0x6D85, 1,0x23D1E, 1,0x6D34, 1,0x6E2F, 1,0x6E6E, 1,0x3D33, 1,0x6ECB, 1,0x6EC7, 1,0x23ED1, 1,0x6DF9, 1,0x6F6E, 1,0x23F5E, 1,0x23F8E, 1,0x6FC6, 1,0x7039, 1,0x701E, 1,0x701B, 1,0x3D96, 1,0x704A, 1,0x707D, 1,0x7077, 1,0x70AD, 1,0x20525, 1,0x7145, 1,0x24263, 1,0x719C, 1,0x243AB, 1,0x7228, 1,0x7235, 1,0x7250, 1,0x24608, 1,0x7280, 1,0x7295, 1,0x24735, 1,0x24814, 1,0x737A, 1,0x738B, 1,0x3EAC, 1,0x73A5, 1,0x3EB8, 1,0x3EB8, 1,0x7447, 1,0x745C, 1,0x7471, 1,0x7485, 1,0x74CA, 1,0x3F1B, 1,0x7524, 1,0x24C36, 1,0x753E, 1,0x24C92, 1,0x7570, 1,0x2219F, 1,0x7610, 1,0x24FA1, 1,0x24FB8, 1,0x25044, 1,0x3FFC, 1,0x4008, 1,0x76F4, 1,0x250F3, 1,0x250F2, 1,0x25119, 1,0x25133, 1,0x771E, 1,0x771F, 1,0x771F, 1,0x774A, 1,0x4039, 1,0x778B, 1,0x4046, 1,0x4096, 1,0x2541D, 1,0x784E, 1,0x788C, 1,0x78CC, 1,0x40E3, 1,0x25626, 1,0x7956, 1,0x2569A, 1,0x256C5, 1,0x798F, 1,0x79EB, 1,0x412F, 1,0x7A40, 1,0x7A4A, 1,0x7A4F, 1,0x2597C, 1,0x25AA7, 1,0x25AA7, 1,0x7AEE, 1,0x4202, 1,0x25BAB, 1,0x7BC6, 1,0x7BC9, 1,0x4227, 1,0x25C80, 1,0x7CD2, 1,0x42A0, 1,0x7CE8, 1,0x7CE3, 1,0x7D00, 1,0x25F86, 1,0x7D63, 1,0x4301, 1,0x7DC7, 1,0x7E02, 1,0x7E45, 1,0x4334, 1,0x26228, 1,0x26247, 1,0x4359, 1,0x262D9, 1,0x7F7A, 1,0x2633E, 1,0x7F95, 1,0x7FFA, 1,0x8005, 1,0x264DA, 1,0x26523, 1,0x8060, 1,0x265A8, 1,0x8070, 1,0x2335F, 1,0x43D5, 1,0x80B2, 1,0x8103, 1,0x440B, 1,0x813E, 1,0x5AB5, 1,0x267A7, 1,0x267B5, 1,0x23393, 1,0x2339C, 1,0x8201, 1,0x8204, 1,0x8F9E, 1,0x446B, 1,0x8291, 1,0x828B, 1,0x829D, 1,0x52B3, 1,0x82B1, 1,0x82B3, 1,0x82BD, 1,0x82E6, 1,0x26B3C, 1,0x82E5, 1,0x831D, 1,0x8363, 1,0x83AD, 1,0x8323, 1,0x83BD, 1,0x83E7, 1,0x8457, 1,0x8353, 1,0x83CA, 1,0x83CC, 1,0x83DC, 1,0x26C36, 1,0x26D6B, 1,0x26CD5, 1,0x452B, 1,0x84F1, 1,0x84F3, 1,0x8516, 1,0x273CA, 1,0x8564, 1,0x26F2C, 1,0x455D, 1,0x4561, 1,0x26FB1, 1,0x270D2, 1,0x456B, 1,0x8650, 1,0x865C, 1,0x8667, 1,0x8669, 1,0x86A9, 1,0x8688, 1,0x870E, 1,0x86E2, 1,0x8779, 1,0x8728, 1,0x876B, 1,0x8786, 1,0x45D7, 1,0x87E1, 1,0x8801, 1,0x45F9, 1,0x8860, 1,0x8863, 1,0x27667, 1,0x88D7, 1,0x88DE, 1,0x4635, 1,0x88FA, 1,0x34BB, 1,0x278AE, 1,0x27966, 1,0x46BE, 1,0x46C7, 1,0x8AA0, 1,0x8AED, 1,0x8B8A, 1,0x8C55, 1,0x27CA8, 1,0x8CAB, 1,0x8CC1, 1,0x8D1B, 1,0x8D77, 1,0x27F2F, 1,0x20804, 1,0x8DCB, 1,0x8DBC, 1,0x8DF0, 1,0x208DE, 1,0x8ED4, 1,0x8F38, 1,0x285D2, 1,0x285ED, 1,0x9094, 1,0x90F1, 1,0x9111, 1,0x2872E, 1,0x911B, 1,0x9238, 1,0x92D7, 1,0x92D8, 1,0x927C, 1,0x93F9, 1,0x9415, 1,0x28BFA, 1,0x958B, 1,0x4995, 1,0x95B7, 1,0x28D77, 1,0x49E6, 1,0x96C3, 1,0x5DB2, 1,0x9723, 1,0x29145, 1,0x2921A, 1,0x4A6E, 1,0x4A76, 1,0x97E0, 1,0x2940A, 1,0x4AB2, 1,0x29496, 1,0x980B, 1,0x980B, 1,0x9829, 1,0x295B6, 1,0x98E2, 1,0x4B33, 1,0x9929, 1,0x99A7, 1,0x99C2, 1,0x99FE, 1,0x4BCE, 1,0x29B30, 1,0x9B12, 1,0x9C40, 1,0x9CFD, 1,0x4CCE, 1,0x4CED, 1,0x9D67, 1,0x2A0CE, 1,0x4CF8, 1,0x2A105, 1,0x2A20E, 1,0x2A291, 1,0x9EBB, 1,0x4D56, 1,0x9EF9, 1,0x9EFE, 1,0x9F05, 1,0x9F0F, 1,0x9F16, 1,0x9F3B, 1,0x2A600, }; static const short translit_page00[344] = { 0, 2, 4, 6, -1, 9, 13, 15, /* 0xa0-0xa7 */ 18, 20, 24, 26, 29, 33, 35, -1, /* 0xa8-0xaf */ 39, 42, 46, 49, 52, 54, 56, 58, /* 0xb0-0xb7 */ 60, 62, 65, 67, 70, 76, 82, 88, /* 0xb8-0xbf */ 90, 93, 96, 99, 102, 105, 107, 110, /* 0xc0-0xc7 */ 112, 115, 118, 121, 124, 127, 130, 133, /* 0xc8-0xcf */ 136, 138, 141, 144, 147, 150, 153, 156, /* 0xd0-0xd7 */ 158, 160, 163, 166, 169, 172, 175, 178, /* 0xd8-0xdf */ 181, 184, 187, 190, 193, 196, 198, 201, /* 0xe0-0xe7 */ 203, 206, 209, 212, 215, 218, 221, 224, /* 0xe8-0xef */ 227, 229, 232, 235, 238, 241, 244, 247, /* 0xf0-0xf7 */ 249, 251, 254, 257, 260, 263, 266, 269, /* 0xf8-0xff */ /* 0x0100 */ 272, 274, 276, 278, 280, 282, 284, 287, /* 0x00-0x07 */ 290, 293, 296, 298, 300, 302, 304, 306, /* 0x08-0x0f */ 308, 310, 312, 314, 316, 318, 320, 322, /* 0x10-0x17 */ 324, 326, 328, 330, 332, 335, 338, 340, /* 0x18-0x1f */ 342, 344, 346, 348, 350, 353, 356, 358, /* 0x20-0x27 */ 360, 363, 366, 368, 370, 372, 374, 376, /* 0x28-0x2f */ 378, 380, 382, 385, 388, 391, 394, 396, /* 0x30-0x37 */ -1, 398, 400, 402, 404, 406, 408, 410, /* 0x38-0x3f */ 412, 414, 416, 418, 421, 424, 426, 428, /* 0x40-0x47 */ 430, 432, -1, -1, 435, 437, 439, 441, /* 0x48-0x4f */ 443, 446, 449, 452, 455, 458, 461, 463, /* 0x50-0x57 */ 465, 467, 469, 472, 475, 478, 481, 483, /* 0x58-0x5f */ 485, 487, 489, 491, 493, 495, 497, 499, /* 0x60-0x67 */ 501, 504, 507, 509, 511, 513, 515, 517, /* 0x68-0x6f */ 519, 522, 525, 527, 529, 532, 535, 538, /* 0x70-0x77 */ 541, 544, 547, 550, 552, 554, 556, 558, /* 0x78-0x7f */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x80-0x87 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x88-0x8f */ -1, -1, 560, -1, -1, -1, -1, -1, /* 0x90-0x97 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x98-0x9f */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xa0-0xa7 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xa8-0xaf */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb0-0xb7 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb8-0xbf */ -1, -1, -1, -1, 562, 565, 568, 571, /* 0xc0-0xc7 */ 574, 577, 580, 583, 586, -1, -1, -1, /* 0xc8-0xcf */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd0-0xd7 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd8-0xdf */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe0-0xe7 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe8-0xef */ -1, 589, 592, 595, -1, -1, -1, -1, /* 0xf0-0xf7 */ }; static const short translit_page02[8] = { 598, 600, 602, 604, -1, -1, -1, -1, /* 0x18-0x1f */ }; static const short translit_page02_1[40] = { -1, 606, 608, 610, 612, 614, -1, -1, /* 0xb8-0xbf */ -1, -1, -1, -1, -1, -1, 616, -1, /* 0xc0-0xc7 */ 618, 620, 622, 624, -1, 626, -1, -1, /* 0xc8-0xcf */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd0-0xd7 */ -1, -1, -1, -1, 628, 630, -1, -1, /* 0xd8-0xdf */ }; static const short translit_page03[48] = { 632, 634, 636, -1, -1, 638, 640, -1, /* 0xd0-0xd7 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd8-0xdf */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe0-0xe7 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe8-0xef */ 642, 644, 646, -1, 648, 650, -1, -1, /* 0xf0-0xf7 */ -1, 652, -1, -1, -1, -1, -1, -1, /* 0xf8-0xff */ }; static const short translit_page05[8] = { 657, 660, 663, -1, -1, -1, -1, -1, /* 0xf0-0xf7 */ }; static const short translit_page06[16] = { -1, -1, -1, -1, -1, 666, 669, 672, /* 0x70-0x77 */ 675, -1, -1, -1, -1, -1, -1, -1, /* 0x78-0x7f */ }; static const short translit_page0e[48] = { -1, -1, -1, 681, -1, -1, -1, -1, /* 0xb0-0xb7 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb8-0xbf */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc0-0xc7 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc8-0xcf */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd0-0xd7 */ -1, -1, -1, -1, 684, 687, -1, -1, /* 0xd8-0xdf */ }; static const short translit_page0f[16] = { -1, -1, -1, -1, -1, -1, -1, 690, /* 0x70-0x77 */ -1, 693, -1, -1, -1, -1, -1, -1, /* 0x78-0x7f */ }; static const short translit_page1e[160] = { -1, -1, 696, 698, -1, -1, -1, -1, /* 0x00-0x07 */ -1, -1, 700, 702, -1, -1, -1, -1, /* 0x08-0x0f */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x10-0x17 */ -1, -1, -1, -1, -1, -1, 704, 706, /* 0x18-0x1f */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x20-0x27 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x28-0x2f */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x30-0x37 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x38-0x3f */ 708, 710, -1, -1, -1, -1, -1, -1, /* 0x40-0x47 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x48-0x4f */ -1, -1, -1, -1, -1, -1, 712, 714, /* 0x50-0x57 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x58-0x5f */ 716, 718, -1, -1, -1, -1, -1, -1, /* 0x60-0x67 */ -1, -1, 720, 722, -1, -1, -1, -1, /* 0x68-0x6f */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x70-0x77 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x78-0x7f */ 724, 727, 730, 733, 736, 739, -1, -1, /* 0x80-0x87 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x88-0x8f */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x90-0x97 */ -1, -1, 742, -1, -1, -1, -1, -1, /* 0x98-0x9f */ }; static const short translit_page1e_2[8] = { -1, -1, 745, 748, -1, -1, -1, -1, /* 0xf0-0xf7 */ }; static const short translit_page20[88] = { -1, -1, 751, 753, 755, 757, 759, -1, /* 0x00-0x07 */ 761, 763, 765, -1, -1, -1, -1, -1, /* 0x08-0x0f */ 767, 769, 771, 773, 775, 777, -1, -1, /* 0x10-0x17 */ 779, 781, 783, 785, 787, 789, 791, 793, /* 0x18-0x1f */ 795, -1, 797, -1, 799, 801, 804, -1, /* 0x20-0x27 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x28-0x2f */ 808, -1, 813, 815, 818, -1, 822, 825, /* 0x30-0x37 */ -1, 829, 831, -1, 833, -1, -1, -1, /* 0x38-0x3f */ -1, -1, -1, -1, 836, -1, -1, 838, /* 0x40-0x47 */ 841, 844, -1, -1, -1, -1, -1, -1, /* 0x48-0x4f */ -1, -1, -1, -1, -1, -1, -1, 847, /* 0x50-0x57 */ }; static const short translit_page20_3[8] = { 852, -1, -1, 855, 860, -1, -1, -1, /* 0xa8-0xaf */ }; static const short translit_page21[216] = { 864, 868, 872, 874, -1, 877, 881, 885, /* 0x00-0x07 */ -1, 887, 890, 892, 894, 896, 898, 900, /* 0x08-0x0f */ 902, 904, 906, 908, -1, 910, 912, -1, /* 0x10-0x17 */ -1, 915, 917, 919, 921, 923, -1, -1, /* 0x18-0x1f */ -1, 925, 929, -1, 932, -1, 934, -1, /* 0x20-0x27 */ 938, -1, -1, -1, 940, 942, 944, 946, /* 0x28-0x2f */ 948, 950, -1, 952, 954, 956, 958, 960, /* 0x30-0x37 */ 962, 964, -1, 966, -1, 970, 972, 974, /* 0x38-0x3f */ 976, -1, -1, -1, -1, 978, 980, 982, /* 0x40-0x47 */ 984, 986, -1, -1, -1, -1, -1, -1, /* 0x48-0x4f */ -1, -1, -1, 988, 994, 1000, 1006, 1012, /* 0x50-0x57 */ 1018, 1024, 1030, 1036, 1042, 1048, 1054, 1060, /* 0x58-0x5f */ 1064, 1066, 1069, 1073, 1076, 1078, 1081, 1085, /* 0x60-0x67 */ 1090, 1093, 1095, 1098, 1102, 1104, 1106, 1108, /* 0x68-0x6f */ 1110, 1112, 1115, 1119, 1122, 1124, 1127, 1131, /* 0x70-0x77 */ 1136, 1139, 1141, 1144, 1148, 1150, 1152, 1154, /* 0x78-0x7f */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x80-0x87 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x88-0x8f */ 1156, 1159, 1161, 1164, 1166, -1, -1, -1, /* 0x90-0x97 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x98-0x9f */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xa0-0xa7 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xa8-0xaf */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb0-0xb7 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb8-0xbf */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc0-0xc7 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc8-0xcf */ 1170, -1, 1173, -1, 1176, -1, -1, -1, /* 0xd0-0xd7 */ }; static const short translit_page22[96] = { -1, -1, 1180, -1, -1, 1182, 1184, 1186, /* 0x10-0x17 */ -1, 1188, -1, -1, -1, -1, -1, -1, /* 0x18-0x1f */ -1, -1, -1, 1190, -1, -1, -1, -1, /* 0x20-0x27 */ -1, -1, -1, -1, 1192, 1195, -1, 1199, /* 0x28-0x2f */ 1202, -1, -1, -1, -1, -1, 1206, -1, /* 0x30-0x37 */ -1, -1, -1, -1, 1208, -1, -1, -1, /* 0x38-0x3f */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x40-0x47 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x48-0x4f */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x50-0x57 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x58-0x5f */ 1210, -1, -1, -1, 1213, 1216, -1, -1, /* 0x60-0x67 */ -1, -1, 1219, 1222, -1, -1, -1, -1, /* 0x68-0x6f */ }; static const short translit_page22_4[48] = { -1, -1, -1, -1, -1, 1225, -1, -1, /* 0xc0-0xc7 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc8-0xcf */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd0-0xd7 */ 1227, 1231, -1, -1, -1, -1, -1, -1, /* 0xd8-0xdf */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe0-0xe7 */ -1, -1, -1, -1, -1, -1, -1, 1235, /* 0xe8-0xef */ }; static const short translit_page24[240] = { 1239, 1245, 1251, 1257, 1263, 1269, 1275, 1281, /* 0x00-0x07 */ 1287, 1292, 1297, 1302, 1307, 1312, 1317, 1322, /* 0x08-0x0f */ 1327, 1333, 1339, 1345, 1351, 1357, 1363, 1369, /* 0x10-0x17 */ 1375, 1381, 1386, 1392, 1398, 1403, 1408, 1413, /* 0x18-0x1f */ 1418, 1423, -1, -1, 1429, -1, -1, -1, /* 0x20-0x27 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x28-0x2f */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x30-0x37 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x38-0x3f */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x40-0x47 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x48-0x4f */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x50-0x57 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x58-0x5f */ 1434, 1438, 1442, 1446, 1450, 1454, 1458, 1462, /* 0x60-0x67 */ 1466, 1470, 1475, 1480, 1485, 1490, 1495, 1500, /* 0x68-0x6f */ 1505, 1510, 1515, 1520, 1525, 1529, 1533, 1537, /* 0x70-0x77 */ 1541, 1545, 1549, 1553, 1557, 1561, 1566, 1571, /* 0x78-0x7f */ 1576, 1581, 1586, 1591, 1596, 1601, 1606, 1611, /* 0x80-0x87 */ 1616, 1619, 1622, 1625, 1628, 1631, 1634, 1637, /* 0x88-0x8f */ 1640, 1643, 1647, 1651, 1655, 1659, 1663, 1667, /* 0x90-0x97 */ 1671, 1675, 1679, 1683, 1687, 1691, 1695, 1699, /* 0x98-0x9f */ 1703, 1707, 1711, 1715, 1719, 1723, 1727, 1731, /* 0xa0-0xa7 */ 1735, 1739, 1743, 1747, 1751, 1755, 1759, 1763, /* 0xa8-0xaf */ 1767, 1771, 1775, 1779, 1783, 1787, 1791, 1795, /* 0xb0-0xb7 */ 1799, 1803, 1807, 1811, 1815, 1819, 1823, 1827, /* 0xb8-0xbf */ 1831, 1835, 1839, 1843, 1847, 1851, 1855, 1859, /* 0xc0-0xc7 */ 1863, 1867, 1871, 1875, 1879, 1883, 1887, 1891, /* 0xc8-0xcf */ 1895, 1899, 1903, 1907, 1911, 1915, 1919, 1923, /* 0xd0-0xd7 */ 1927, 1931, 1935, 1939, 1943, 1947, 1951, 1955, /* 0xd8-0xdf */ 1959, 1963, 1967, 1971, 1975, 1979, 1983, 1987, /* 0xe0-0xe7 */ 1991, 1995, 1999, -1, -1, -1, -1, -1, /* 0xe8-0xef */ }; static const short translit_page25[64] = { 2003, -1, 2005, -1, -1, -1, -1, -1, /* 0x00-0x07 */ -1, -1, -1, -1, 2007, -1, -1, -1, /* 0x08-0x0f */ 2009, -1, -1, -1, 2011, -1, -1, -1, /* 0x10-0x17 */ 2013, -1, -1, -1, 2015, -1, -1, -1, /* 0x18-0x1f */ -1, -1, -1, -1, 2017, -1, -1, -1, /* 0x20-0x27 */ -1, -1, -1, -1, 2019, -1, -1, -1, /* 0x28-0x2f */ -1, -1, -1, -1, 2021, -1, -1, -1, /* 0x30-0x37 */ -1, -1, -1, -1, 2023, -1, -1, -1, /* 0x38-0x3f */ }; static const short translit_page2a[8] = { -1, -1, -1, -1, 2032, 2036, 2039, -1, /* 0x70-0x77 */ }; static const short translit_page2f[216] = { 2047, 2049, 2051, 2053, 2055, 2057, 2059, 2061, /* 0x00-0x07 */ 2063, 2065, 2067, 2069, 2071, 2073, 2075, 2077, /* 0x08-0x0f */ 2079, 2081, 2083, 2085, 2087, 2089, 2091, 2093, /* 0x10-0x17 */ 2095, 2097, 2099, 2101, 2103, 2105, 2107, 2109, /* 0x18-0x1f */ 2111, 2113, 2115, 2117, 2119, 2121, 2123, 2125, /* 0x20-0x27 */ 2127, 2129, 2131, 2133, 2135, 2137, 2139, 2141, /* 0x28-0x2f */ 2143, 2145, 2147, 2149, 2151, 2153, 2155, 2157, /* 0x30-0x37 */ 2159, 2161, 2163, 2165, 2167, 2169, 2171, 2173, /* 0x38-0x3f */ 2175, 2177, 2179, 2181, 2183, 2185, 2187, 2189, /* 0x40-0x47 */ 2191, 2193, 2195, 2197, 2199, 2201, 2203, 2205, /* 0x48-0x4f */ 2207, 2209, 2211, 2213, 2215, 2217, 2219, 2221, /* 0x50-0x57 */ 2223, 2225, 2227, 2229, 2231, 2233, 2235, 2237, /* 0x58-0x5f */ 2239, 2241, 2243, 2245, 2247, 2249, 2251, 2253, /* 0x60-0x67 */ 2255, 2257, 2259, 2261, 2263, 2265, 2267, 2269, /* 0x68-0x6f */ 2271, 2273, 2275, 2277, 2279, 2281, 2283, 2285, /* 0x70-0x77 */ 2287, 2289, 2291, 2293, 2295, 2297, 2299, 2301, /* 0x78-0x7f */ 2303, 2305, 2307, 2309, 2311, 2313, 2315, 2317, /* 0x80-0x87 */ 2319, 2321, 2323, 2325, 2327, 2329, 2331, 2333, /* 0x88-0x8f */ 2335, 2337, 2339, 2341, 2343, 2345, 2347, 2349, /* 0x90-0x97 */ 2351, 2353, 2355, 2357, 2359, 2361, 2363, 2365, /* 0x98-0x9f */ 2367, 2369, 2371, 2373, 2375, 2377, 2379, 2381, /* 0xa0-0xa7 */ 2383, 2385, 2387, 2389, 2391, 2393, 2395, 2397, /* 0xa8-0xaf */ 2399, 2401, 2403, 2405, 2407, 2409, 2411, 2413, /* 0xb0-0xb7 */ 2415, 2417, 2419, 2421, 2423, 2425, 2427, 2429, /* 0xb8-0xbf */ 2431, 2433, 2435, 2437, 2439, 2441, 2443, 2445, /* 0xc0-0xc7 */ 2447, 2449, 2451, 2453, 2455, 2457, 2459, 2461, /* 0xc8-0xcf */ 2463, 2465, 2467, 2469, 2471, 2473, -1, -1, /* 0xd0-0xd7 */ }; static const short translit_page30[248] = { 2475, -1, -1, -1, -1, -1, -1, -1, /* 0x00-0x07 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x08-0x0f */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x10-0x17 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x18-0x1f */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x20-0x27 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x28-0x2f */ -1, -1, -1, -1, -1, -1, 2477, -1, /* 0x30-0x37 */ 2479, 2481, 2483, -1, -1, -1, -1, -1, /* 0x38-0x3f */ -1, 2485, -1, 2487, -1, 2489, -1, 2491, /* 0x40-0x47 */ -1, 2493, -1, -1, -1, -1, -1, -1, /* 0x48-0x4f */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x50-0x57 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x58-0x5f */ -1, -1, -1, 2495, -1, -1, -1, -1, /* 0x60-0x67 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x68-0x6f */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x70-0x77 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x78-0x7f */ -1, -1, -1, 2497, -1, 2499, -1, 2501, /* 0x80-0x87 */ -1, -1, -1, -1, -1, -1, 2503, -1, /* 0x88-0x8f */ -1, -1, -1, -1, -1, 2505, 2507, -1, /* 0x90-0x97 */ -1, -1, -1, 2509, 2512, -1, -1, -1, /* 0x98-0x9f */ 2515, 2517, -1, 2519, -1, 2521, -1, 2523, /* 0xa0-0xa7 */ -1, 2525, -1, -1, -1, -1, -1, -1, /* 0xa8-0xaf */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb0-0xb7 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb8-0xbf */ -1, -1, -1, 2527, -1, -1, -1, -1, /* 0xc0-0xc7 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc8-0xcf */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd0-0xd7 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd8-0xdf */ -1, -1, -1, 2529, -1, 2531, -1, 2533, /* 0xe0-0xe7 */ -1, -1, -1, -1, -1, -1, 2535, -1, /* 0xe8-0xef */ -1, -1, -1, -1, -1, 2537, 2539, -1, /* 0xf0-0xf7 */ }; static const short translit_page31[96] = { -1, 2541, 2543, 2545, 2547, 2549, 2551, 2553, /* 0x30-0x37 */ 2555, 2557, 2559, 2561, 2563, 2565, 2567, 2569, /* 0x38-0x3f */ 2571, 2573, 2575, 2577, 2579, 2581, 2583, 2585, /* 0x40-0x47 */ 2587, 2589, 2591, 2593, 2595, 2597, 2599, 2601, /* 0x48-0x4f */ 2603, 2605, 2607, 2609, 2611, 2613, 2615, 2617, /* 0x50-0x57 */ 2619, 2621, 2623, 2625, 2627, 2629, 2631, 2633, /* 0x58-0x5f */ 2635, 2637, 2639, 2641, 2643, 2645, 2647, 2649, /* 0x60-0x67 */ 2651, 2653, 2655, 2657, 2659, 2661, 2663, 2665, /* 0x68-0x6f */ 2667, 2669, 2671, 2673, 2675, 2677, 2679, 2681, /* 0x70-0x77 */ 2683, 2685, 2687, 2689, 2691, 2693, 2695, 2697, /* 0x78-0x7f */ 2699, 2701, 2703, 2705, 2707, 2709, 2711, 2713, /* 0x80-0x87 */ 2715, 2717, 2719, 2721, 2723, 2725, 2727, -1, /* 0x88-0x8f */ }; static const short translit_page31_5[528] = { 2729, 2731, 2733, 2735, 2737, 2739, 2741, 2743, /* 0xf0-0xf7 */ 2745, 2747, 2749, 2751, 2753, 2755, 2757, 2759, /* 0xf8-0xff */ /* 0x3200 */ 2761, 2765, 2769, 2773, 2777, 2781, 2785, 2789, /* 0x00-0x07 */ 2793, 2797, 2801, 2805, 2809, 2813, 2817, 2822, /* 0x08-0x0f */ 2827, 2832, 2837, 2842, 2847, 2852, 2857, 2862, /* 0x10-0x17 */ 2867, 2872, 2877, 2882, 2887, 2892, 2900, -1, /* 0x18-0x1f */ 2907, 2911, 2915, 2919, 2923, 2927, 2931, 2935, /* 0x20-0x27 */ 2939, 2943, 2947, 2951, 2955, 2959, 2963, 2967, /* 0x28-0x2f */ 2971, 2975, 2979, 2983, 2987, 2991, 2995, 2999, /* 0x30-0x37 */ 3003, 3007, 3011, 3015, 3019, 3023, 3027, 3031, /* 0x38-0x3f */ 3035, 3039, 3043, 3047, -1, -1, -1, -1, /* 0x40-0x47 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x48-0x4f */ 3051, 3055, 3060, 3065, 3070, 3075, 3080, 3085, /* 0x50-0x57 */ 3090, 3095, 3100, 3105, 3110, 3115, 3120, 3125, /* 0x58-0x5f */ 3130, 3134, 3138, 3142, 3146, 3150, 3154, 3158, /* 0x60-0x67 */ 3162, 3166, 3170, 3174, 3178, 3182, 3186, 3191, /* 0x68-0x6f */ 3196, 3201, 3206, 3211, 3216, 3221, 3226, 3231, /* 0x70-0x77 */ 3236, 3241, 3246, 3251, 3256, 3264, -1, -1, /* 0x78-0x7f */ 3271, 3275, 3279, 3283, 3287, 3291, 3295, 3299, /* 0x80-0x87 */ 3303, 3307, 3311, 3315, 3319, 3323, 3327, 3331, /* 0x88-0x8f */ 3335, 3339, 3343, 3347, 3351, 3355, 3359, 3363, /* 0x90-0x97 */ 3367, 3371, 3375, 3379, 3383, 3387, 3391, 3395, /* 0x98-0x9f */ 3399, 3403, 3407, 3411, 3415, 3419, 3423, 3427, /* 0xa0-0xa7 */ 3431, 3435, 3439, 3443, 3447, 3451, 3455, 3459, /* 0xa8-0xaf */ 3463, 3467, 3472, 3477, 3482, 3487, 3492, 3497, /* 0xb0-0xb7 */ 3502, 3507, 3512, 3517, 3522, 3527, 3532, 3537, /* 0xb8-0xbf */ 3542, 3545, 3548, 3551, 3554, 3557, 3560, 3563, /* 0xc0-0xc7 */ 3566, 3569, 3573, 3577, 3581, 3584, 3588, 3591, /* 0xc8-0xcf */ 3595, 3599, 3603, 3607, 3611, 3615, 3619, 3623, /* 0xd0-0xd7 */ 3627, 3631, 3635, 3639, 3643, 3647, 3651, 3655, /* 0xd8-0xdf */ 3659, 3663, 3667, 3671, 3675, 3679, 3683, 3687, /* 0xe0-0xe7 */ 3691, 3695, 3699, 3703, 3707, 3711, 3715, 3719, /* 0xe8-0xef */ 3723, 3727, 3731, 3735, 3739, 3743, 3747, 3751, /* 0xf0-0xf7 */ 3755, 3759, 3763, 3767, 3771, 3775, 3779, -1, /* 0xf8-0xff */ /* 0x3300 */ 3783, 3788, 3793, 3798, 3802, 3807, 3811, 3815, /* 0x00-0x07 */ 3821, 3826, 3830, 3834, 3838, 3843, 3848, 3852, /* 0x08-0x0f */ 3856, 3859, 3863, 3868, 3873, 3876, 3882, 3889, /* 0x10-0x17 */ 3895, 3899, 3905, 3911, 3916, 3920, 3924, 3928, /* 0x18-0x1f */ 3933, 3939, 3944, 3948, 3952, 3956, 3959, 3962, /* 0x20-0x27 */ 3965, 3968, 3972, 3976, 3982, 3986, 3991, 3997, /* 0x28-0x2f */ 4001, 4004, 4007, 4013, 4018, 4024, 4028, 4034, /* 0x30-0x37 */ 4037, 4041, 4045, 4049, 4053, 4057, 4062, 4066, /* 0x38-0x3f */ 4069, 4073, 4077, 4081, 4086, 4090, 4094, 4098, /* 0x40-0x47 */ 4104, 4109, 4112, 4118, 4121, 4126, 4131, 4135, /* 0x48-0x4f */ 4139, 4143, 4148, 4151, 4155, 4160, 4163, 4169, /* 0x50-0x57 */ 4173, 4176, 4179, 4182, 4185, 4188, 4191, 4194, /* 0x58-0x5f */ 4197, 4200, 4203, 4207, 4211, 4215, 4219, 4223, /* 0x60-0x67 */ 4227, 4231, 4235, 4239, 4243, 4247, 4251, 4255, /* 0x68-0x6f */ 4259, 4263, 4267, 4270, 4273, 4277, 4280, 4283, /* 0x70-0x77 */ 4286, 4291, 4296, 4299, 4302, 4305, 4308, 4311, /* 0x78-0x7f */ 4316, 4319, 4322, 4325, 4328, 4331, 4334, 4337, /* 0x80-0x87 */ 4340, 4344, 4349, 4352, 4355, 4358, 4361, 4364, /* 0x88-0x8f */ 4367, 4370, 4374, 4378, 4382, 4386, 4389, 4392, /* 0x90-0x97 */ 4395, 4398, 4401, 4404, 4407, 4410, 4413, 4416, /* 0x98-0x9f */ 4421, 4426, 4430, 4435, 4440, 4445, 4449, 4454, /* 0xa0-0xa7 */ 4458, 4464, 4467, 4471, 4475, 4479, 4483, 4489, /* 0xa8-0xaf */ 4497, 4500, 4503, 4506, 4509, 4512, 4515, 4518, /* 0xb0-0xb7 */ 4521, 4524, 4527, 4530, 4533, 4536, 4539, 4542, /* 0xb8-0xbf */ 4545, 4548, 4551, 4556, 4559, 4562, 4565, 4570, /* 0xc0-0xc7 */ 4574, 4577, 4580, 4583, 4586, 4589, 4592, 4595, /* 0xc8-0xcf */ 4598, 4601, 4604, 4608, 4611, 4614, 4618, 4622, /* 0xd0-0xd7 */ 4625, 4630, 4634, 4637, 4640, 4643, 4646, 4650, /* 0xd8-0xdf */ 4658, 4661, 4664, 4667, 4670, 4673, 4676, 4679, /* 0xe0-0xe7 */ 4682, 4685, 4689, 4693, 4697, 4701, 4705, 4709, /* 0xe8-0xef */ 4713, 4717, 4721, 4725, 4729, 4733, 4737, 4741, /* 0xf0-0xf7 */ 4745, 4749, 4753, 4757, 4761, 4765, 4769, 4654, /* 0xf8-0xff */ }; static const short translit_pagef9[368] = { 4773, 4775, 4777, 4779, 4781, 4783, 4785, 4787, /* 0x00-0x07 */ 4789, 4791, 4793, 4795, 4797, 4799, 4801, 4803, /* 0x08-0x0f */ 4805, 4807, 4809, 4811, 4813, 4815, 4817, 4819, /* 0x10-0x17 */ 4821, 4823, 4825, 4827, 4829, 4831, 4833, 4835, /* 0x18-0x1f */ 4837, 4839, 4841, 4843, 4845, 4847, 4849, 4851, /* 0x20-0x27 */ 4853, 4855, 4857, 4859, 4861, 4863, 4865, 4867, /* 0x28-0x2f */ 4869, 4871, 4873, 4875, 4877, 4879, 4881, 4883, /* 0x30-0x37 */ 4885, 4887, 4889, 4891, 4893, 4895, 4897, 4899, /* 0x38-0x3f */ 4901, 4903, 4905, 4907, 4909, 4911, 4913, 4915, /* 0x40-0x47 */ 4917, 4919, 4921, 4923, 4925, 4927, 4929, 4931, /* 0x48-0x4f */ 4933, 4935, 4937, 4939, 4941, 4943, 4945, 4947, /* 0x50-0x57 */ 4949, 4951, 4953, 4955, 4957, 4959, 4961, 4963, /* 0x58-0x5f */ 4965, 4967, 4969, 4971, 4973, 4975, 4977, 4979, /* 0x60-0x67 */ 4981, 4983, 4985, 4987, 4989, 4991, 4993, 4995, /* 0x68-0x6f */ 4997, 4999, 5001, 5003, 5005, 5007, 5009, 5011, /* 0x70-0x77 */ 5013, 5015, 5017, 5019, 5021, 5023, 5025, 5027, /* 0x78-0x7f */ 5029, 5031, 5033, 5035, 5037, 5039, 5041, 5043, /* 0x80-0x87 */ 5045, 5047, 5049, 5051, 5053, 5055, 5057, 5059, /* 0x88-0x8f */ 5061, 5063, 5065, 5067, 5069, 5071, 5073, 5075, /* 0x90-0x97 */ 5077, 5079, 5081, 5083, 5085, 5087, 5089, 5091, /* 0x98-0x9f */ 5093, 5095, 5097, 5099, 5101, 5103, 5105, 5107, /* 0xa0-0xa7 */ 5109, 5111, 5113, 5115, 5117, 5119, 5121, 5123, /* 0xa8-0xaf */ 5125, 5127, 5129, 5131, 5133, 5135, 5137, 5139, /* 0xb0-0xb7 */ 5141, 5143, 5145, 5147, 5149, 5151, 5153, 5155, /* 0xb8-0xbf */ 5157, 5159, 5161, 5163, 5165, 5167, 5169, 5171, /* 0xc0-0xc7 */ 5173, 5175, 5177, 5179, 5181, 5183, 5185, 5187, /* 0xc8-0xcf */ 5189, 5191, 5193, 5195, 5197, 5199, 5201, 5203, /* 0xd0-0xd7 */ 5205, 5207, 5209, 5211, 5213, 5215, 5217, 5219, /* 0xd8-0xdf */ 5221, 5223, 5225, 5227, 5229, 5231, 5233, 5235, /* 0xe0-0xe7 */ 5237, 5239, 5241, 5243, 5245, 5247, 5249, 5251, /* 0xe8-0xef */ 5253, 5255, 5257, 5259, 5261, 5263, 5265, 5267, /* 0xf0-0xf7 */ 5269, 5271, 5273, 5275, 5277, 5279, 5281, 5283, /* 0xf8-0xff */ /* 0xfa00 */ 5285, 5287, 5289, 5291, 5293, 5295, 5297, 5299, /* 0x00-0x07 */ 5301, 5303, 5305, 5307, 5309, 5311, -1, -1, /* 0x08-0x0f */ 5313, -1, 5315, -1, -1, 5317, 5319, 5321, /* 0x10-0x17 */ 5323, 5325, 5327, 5329, 5331, 5333, 5335, -1, /* 0x18-0x1f */ 5337, -1, 5339, -1, -1, 5341, 5343, -1, /* 0x20-0x27 */ -1, -1, 5345, 5347, 5349, 5351, -1, -1, /* 0x28-0x2f */ 5353, 5355, 5357, 5359, 5361, 5363, 5365, 5367, /* 0x30-0x37 */ 5369, 5371, 5373, 5375, 5377, 5379, 5381, 5383, /* 0x38-0x3f */ 5385, 5387, 5389, 5391, 5393, 5395, 5397, 5399, /* 0x40-0x47 */ 5401, 5403, 5405, 5407, 5409, 5411, 5413, 5415, /* 0x48-0x4f */ 5417, 5419, 5421, 5423, 5425, 5427, 5429, 5431, /* 0x50-0x57 */ 5433, 5435, 5437, 5439, 5441, 5443, 5445, 5447, /* 0x58-0x5f */ 5449, 5451, 5453, 5455, 5457, 5459, 5461, 5463, /* 0x60-0x67 */ 5465, 5467, 5469, -1, -1, -1, -1, -1, /* 0x68-0x6f */ }; static const short translit_pagefb[80] = { 5471, 5474, 5477, 5480, 5484, 5488, 5491, -1, /* 0x00-0x07 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x08-0x0f */ -1, -1, -1, 5494, 5497, 5500, 5503, 5506, /* 0x10-0x17 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x18-0x1f */ 5509, 5511, 5513, 5515, 5517, 5519, 5521, 5523, /* 0x20-0x27 */ 5525, 5527, -1, -1, -1, -1, -1, -1, /* 0x28-0x2f */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x30-0x37 */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x38-0x3f */ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x40-0x47 */ -1, -1, -1, -1, -1, -1, -1, 5529, /* 0x48-0x4f */ }; static const short translit_pagefe[40] = { -1, 5532, 5534, 5536, 5538, 5540, 5542, 5544, /* 0x48-0x4f */ 5546, 5548, 5550, -1, 5552, 5554, 5556, 5558, /* 0x50-0x57 */ 5560, 5562, 5564, 5566, 5568, 5570, 5572, 5574, /* 0x58-0x5f */ 5576, 5578, 5580, 5582, 5584, 5586, 5588, -1, /* 0x60-0x67 */ 5590, 5592, 5594, 5596, -1, -1, -1, -1, /* 0x68-0x6f */ }; static const short translit_pageff[240] = { -1, 5598, 5600, 5602, 5604, 5606, 5608, 5610, /* 0x00-0x07 */ 5612, 5614, 5616, 5618, 5620, 5622, 5624, 5626, /* 0x08-0x0f */ 5628, 5630, 5632, 5634, 5636, 5638, 5640, 5642, /* 0x10-0x17 */ 5644, 5646, 5648, 5650, 5652, 5654, 5656, 5658, /* 0x18-0x1f */ 5660, 5662, 5664, 5666, 5668, 5670, 5672, 5674, /* 0x20-0x27 */ 5676, 5678, 5680, 5682, 5684, 5686, 5688, 5690, /* 0x28-0x2f */ 5692, 5694, 5696, 5698, 5700, 5702, 5704, 5706, /* 0x30-0x37 */ 5708, 5710, 5712, 5714, 5716, 5718, 5720, 5722, /* 0x38-0x3f */ 5724, 5726, 5728, 5730, 5732, 5734, 5736, 5738, /* 0x40-0x47 */ 5740, 5742, 5744, 5746, 5748, 5750, 5752, 5754, /* 0x48-0x4f */ 5756, 5758, 5760, 5762, 5764, 5766, 5768, 5770, /* 0x50-0x57 */ 5772, 5774, 5776, 5778, 5780, 5782, 5784, 5786, /* 0x58-0x5f */ 5788, 5790, 5792, 5794, 5796, 5798, 5800, 5802, /* 0x60-0x67 */ 5804, 5806, 5808, 5810, 5812, 5814, 5816, 5818, /* 0x68-0x6f */ 5820, 5822, 5824, 5826, 5828, 5830, 5832, 5834, /* 0x70-0x77 */ 5836, 5838, 5840, 5842, 5844, 5846, 5848, 5850, /* 0x78-0x7f */ 5852, 5854, 5856, 5858, 5860, 5862, 5864, 5866, /* 0x80-0x87 */ 5868, 5870, 5872, 5874, 5876, 5878, 5880, 5882, /* 0x88-0x8f */ 5884, 5886, 5888, 5890, 5892, 5894, 5896, 5898, /* 0x90-0x97 */ 5900, 5902, 5904, 5906, 5908, 5910, 5912, 5914, /* 0x98-0x9f */ 5916, 5918, 5920, 5922, 5924, 5926, 5928, 5930, /* 0xa0-0xa7 */ 5932, 5934, 5936, 5938, 5940, 5942, 5944, 5946, /* 0xa8-0xaf */ 5948, 5950, 5952, 5954, 5956, 5958, 5960, 5962, /* 0xb0-0xb7 */ 5964, 5966, 5968, 5970, 5972, 5974, 5976, -1, /* 0xb8-0xbf */ -1, -1, 5978, 5980, 5982, 5984, 5986, 5988, /* 0xc0-0xc7 */ -1, -1, 5990, 5992, 5994, 5996, 5998, 6000, /* 0xc8-0xcf */ -1, -1, 6002, 6004, 6006, 6008, 6010, 6012, /* 0xd0-0xd7 */ -1, -1, 6014, 6016, 6018, -1, -1, -1, /* 0xd8-0xdf */ 6020, 6022, 6024, 6026, 6028, 6030, 6032, -1, /* 0xe0-0xe7 */ 6034, 6036, 6038, 6040, 6042, 6044, 6046, -1, /* 0xe8-0xef */ }; static const short translit_page1d4[1024] = { 6048, 6050, 6052, 6054, 6056, 6058, 6060, 6062, /* 0x00-0x07 */ 6064, 6066, 6068, 6070, 6072, 6074, 6076, 6078, /* 0x08-0x0f */ 6080, 6082, 6084, 6086, 6088, 6090, 6092, 6094, /* 0x10-0x17 */ 6096, 6098, 6100, 6102, 6104, 6106, 6108, 6110, /* 0x18-0x1f */ 6112, 6114, 6116, 6118, 6120, 6122, 6124, 6126, /* 0x20-0x27 */ 6128, 6130, 6132, 6134, 6136, 6138, 6140, 6142, /* 0x28-0x2f */ 6144, 6146, 6148, 6150, 6152, 6154, 6156, 6158, /* 0x30-0x37 */ 6160, 6162, 6164, 6166, 6168, 6170, 6172, 6174, /* 0x38-0x3f */ 6176, 6178, 6180, 6182, 6184, 6186, 6188, 6190, /* 0x40-0x47 */ 6192, 6194, 6196, 6198, 6200, 6202, 6204, 6206, /* 0x48-0x4f */ 6208, 6210, 6212, 6214, 6216, -1, 6218, 6220, /* 0x50-0x57 */ 6222, 6224, 6226, 6228, 6230, 6232, 6234, 6236, /* 0x58-0x5f */ 6238, 6240, 6242, 6244, 6246, 6248, 6250, 6252, /* 0x60-0x67 */ 6254, 6256, 6258, 6260, 6262, 6264, 6266, 6268, /* 0x68-0x6f */ 6270, 6272, 6274, 6276, 6278, 6280, 6282, 6284, /* 0x70-0x77 */ 6286, 6288, 6290, 6292, 6294, 6296, 6298, 6300, /* 0x78-0x7f */ 6302, 6304, 6306, 6308, 6310, 6312, 6314, 6316, /* 0x80-0x87 */ 6318, 6320, 6322, 6324, 6326, 6328, 6330, 6332, /* 0x88-0x8f */ 6334, 6336, 6338, 6340, 6342, 6344, 6346, 6348, /* 0x90-0x97 */ 6350, 6352, 6354, 6356, 6358, -1, 6360, 6362, /* 0x98-0x9f */ -1, -1, 6364, -1, -1, 6366, 6368, -1, /* 0xa0-0xa7 */ -1, 6370, 6372, 6374, 6376, -1, 6378, 6380, /* 0xa8-0xaf */ 6382, 6384, 6386, 6388, 6390, 6392, 6394, 6396, /* 0xb0-0xb7 */ 6398, 6400, -1, 6402, -1, 6404, 6406, 6408, /* 0xb8-0xbf */ 6410, 6412, 6414, 6416, -1, 6418, 6420, 6422, /* 0xc0-0xc7 */ 6424, 6426, 6428, 6430, 6432, 6434, 6436, 6438, /* 0xc8-0xcf */ 6440, 6442, 6444, 6446, 6448, 6450, 6452, 6454, /* 0xd0-0xd7 */ 6456, 6458, 6460, 6462, 6464, 6466, 6468, 6470, /* 0xd8-0xdf */ 6472, 6474, 6476, 6478, 6480, 6482, 6484, 6486, /* 0xe0-0xe7 */ 6488, 6490, 6492, 6494, 6496, 6498, 6500, 6502, /* 0xe8-0xef */ 6504, 6506, 6508, 6510, 6512, 6514, 6516, 6518, /* 0xf0-0xf7 */ 6520, 6522, 6524, 6526, 6528, 6530, 6532, 6534, /* 0xf8-0xff */ /* 0x1d500 */ 6536, 6538, 6540, 6542, 6544, 6546, -1, 6548, /* 0x00-0x07 */ 6550, 6552, 6554, -1, -1, 6556, 6558, 6560, /* 0x08-0x0f */ 6562, 6564, 6566, 6568, 6570, -1, 6572, 6574, /* 0x10-0x17 */ 6576, 6578, 6580, 6582, 6584, -1, 6586, 6588, /* 0x18-0x1f */ 6590, 6592, 6594, 6596, 6598, 6600, 6602, 6604, /* 0x20-0x27 */ 6606, 6608, 6610, 6612, 6614, 6616, 6618, 6620, /* 0x28-0x2f */ 6622, 6624, 6626, 6628, 6630, 6632, 6634, 6636, /* 0x30-0x37 */ 6638, 6640, -1, 6642, 6644, 6646, 6648, -1, /* 0x38-0x3f */ 6650, 6652, 6654, 6656, 6658, -1, 6660, -1, /* 0x40-0x47 */ -1, -1, 6662, 6664, 6666, 6668, 6670, 6672, /* 0x48-0x4f */ 6674, -1, 6676, 6678, 6680, 6682, 6684, 6686, /* 0x50-0x57 */ 6688, 6690, 6692, 6694, 6696, 6698, 6700, 6702, /* 0x58-0x5f */ 6704, 6706, 6708, 6710, 6712, 6714, 6716, 6718, /* 0x60-0x67 */ 6720, 6722, 6724, 6726, 6728, 6730, 6732, 6734, /* 0x68-0x6f */ 6736, 6738, 6740, 6742, 6744, 6746, 6748, 6750, /* 0x70-0x77 */ 6752, 6754, 6756, 6758, 6760, 6762, 6764, 6766, /* 0x78-0x7f */ 6768, 6770, 6772, 6774, 6776, 6778, 6780, 6782, /* 0x80-0x87 */ 6784, 6786, 6788, 6790, 6792, 6794, 6796, 6798, /* 0x88-0x8f */ 6800, 6802, 6804, 6806, 6808, 6810, 6812, 6814, /* 0x90-0x97 */ 6816, 6818, 6820, 6822, 6824, 6826, 6828, 6830, /* 0x98-0x9f */ 6832, 6834, 6836, 6838, 6840, 6842, 6844, 6846, /* 0xa0-0xa7 */ 6848, 6850, 6852, 6854, 6856, 6858, 6860, 6862, /* 0xa8-0xaf */ 6864, 6866, 6868, 6870, 6872, 6874, 6876, 6878, /* 0xb0-0xb7 */ 6880, 6882, 6884, 6886, 6888, 6890, 6892, 6894, /* 0xb8-0xbf */ 6896, 6898, 6900, 6902, 6904, 6906, 6908, 6910, /* 0xc0-0xc7 */ 6912, 6914, 6916, 6918, 6920, 6922, 6924, 6926, /* 0xc8-0xcf */ 6928, 6930, 6932, 6934, 6936, 6938, 6940, 6942, /* 0xd0-0xd7 */ 6944, 6946, 6948, 6950, 6952, 6954, 6956, 6958, /* 0xd8-0xdf */ 6960, 6962, 6964, 6966, 6968, 6970, 6972, 6974, /* 0xe0-0xe7 */ 6976, 6978, 6980, 6982, 6984, 6986, 6988, 6990, /* 0xe8-0xef */ 6992, 6994, 6996, 6998, 7000, 7002, 7004, 7006, /* 0xf0-0xf7 */ 7008, 7010, 7012, 7014, 7016, 7018, 7020, 7022, /* 0xf8-0xff */ /* 0x1d600 */ 7024, 7026, 7028, 7030, 7032, 7034, 7036, 7038, /* 0x00-0x07 */ 7040, 7042, 7044, 7046, 7048, 7050, 7052, 7054, /* 0x08-0x0f */ 7056, 7058, 7060, 7062, 7064, 7066, 7068, 7070, /* 0x10-0x17 */ 7072, 7074, 7076, 7078, 7080, 7082, 7084, 7086, /* 0x18-0x1f */ 7088, 7090, 7092, 7094, 7096, 7098, 7100, 7102, /* 0x20-0x27 */ 7104, 7106, 7108, 7110, 7112, 7114, 7116, 7118, /* 0x28-0x2f */ 7120, 7122, 7124, 7126, 7128, 7130, 7132, 7134, /* 0x30-0x37 */ 7136, 7138, 7140, 7142, 7144, 7146, 7148, 7150, /* 0x38-0x3f */ 7152, 7154, 7156, 7158, 7160, 7162, 7164, 7166, /* 0x40-0x47 */ 7168, 7170, 7172, 7174, 7176, 7178, 7180, 7182, /* 0x48-0x4f */ 7184, 7186, 7188, 7190, 7192, 7194, 7196, 7198, /* 0x50-0x57 */ 7200, 7202, 7204, 7206, 7208, 7210, 7212, 7214, /* 0x58-0x5f */ 7216, 7218, 7220, 7222, 7224, 7226, 7228, 7230, /* 0x60-0x67 */ 7232, 7234, 7236, 7238, 7240, 7242, 7244, 7246, /* 0x68-0x6f */ 7248, 7250, 7252, 7254, 7256, 7258, 7260, 7262, /* 0x70-0x77 */ 7264, 7266, 7268, 7270, 7272, 7274, 7276, 7278, /* 0x78-0x7f */ 7280, 7282, 7284, 7286, 7288, 7290, 7292, 7294, /* 0x80-0x87 */ 7296, 7298, 7300, 7302, 7304, 7306, 7308, 7310, /* 0x88-0x8f */ 7312, 7314, 7316, 7318, 7320, 7322, 7324, 7326, /* 0x90-0x97 */ 7328, 7330, 7332, 7334, 7336, 7338, 7340, 7342, /* 0x98-0x9f */ 7344, 7346, 7348, 7350, -1, -1, -1, -1, /* 0xa0-0xa7 */ 7352, 7354, 7356, 7358, 7360, 7362, 7364, 7366, /* 0xa8-0xaf */ 7368, 7370, 7372, 7374, 7376, 7378, 7380, 7382, /* 0xb0-0xb7 */ 7384, 7386, 7388, 7390, 7392, 7394, 7396, 7398, /* 0xb8-0xbf */ 7400, 7402, 7404, 7406, 7408, 7410, 7412, 7414, /* 0xc0-0xc7 */ 7416, 7418, 7420, 7422, 7424, 7426, 7428, 7430, /* 0xc8-0xcf */ 7432, 7434, 7436, 7438, 7440, 7442, 7444, 7446, /* 0xd0-0xd7 */ 7448, 7450, 7452, 7454, 7456, 7458, 7460, 7462, /* 0xd8-0xdf */ 7464, 7466, 7468, 7470, 7472, 7474, 7476, 7478, /* 0xe0-0xe7 */ 7480, 7482, 7484, 7486, 7488, 7490, 7492, 7494, /* 0xe8-0xef */ 7496, 7498, 7500, 7502, 7504, 7506, 7508, 7510, /* 0xf0-0xf7 */ 7512, 7514, 7516, 7518, 7520, 7522, 7524, 7526, /* 0xf8-0xff */ /* 0x1d700 */ 7528, 7530, 7532, 7534, 7536, 7538, 7540, 7542, /* 0x00-0x07 */ 7544, 7546, 7548, 7550, 7552, 7554, 7556, 7558, /* 0x08-0x0f */ 7560, 7562, 7564, 7566, 7568, 7570, 7572, 7574, /* 0x10-0x17 */ 7576, 7578, 7580, 7582, 7584, 7586, 7588, 7590, /* 0x18-0x1f */ 7592, 7594, 7596, 7598, 7600, 7602, 7604, 7606, /* 0x20-0x27 */ 7608, 7610, 7612, 7614, 7616, 7618, 7620, 7622, /* 0x28-0x2f */ 7624, 7626, 7628, 7630, 7632, 7634, 7636, 7638, /* 0x30-0x37 */ 7640, 7642, 7644, 7646, 7648, 7650, 7652, 7654, /* 0x38-0x3f */ 7656, 7658, 7660, 7662, 7664, 7666, 7668, 7670, /* 0x40-0x47 */ 7672, 7674, 7676, 7678, 7680, 7682, 7684, 7686, /* 0x48-0x4f */ 7688, 7690, 7692, 7694, 7696, 7698, 7700, 7702, /* 0x50-0x57 */ 7704, 7706, 7708, 7710, 7712, 7714, 7716, 7718, /* 0x58-0x5f */ 7720, 7722, 7724, 7726, 7728, 7730, 7732, 7734, /* 0x60-0x67 */ 7736, 7738, 7740, 7742, 7744, 7746, 7748, 7750, /* 0x68-0x6f */ 7752, 7754, 7756, 7758, 7760, 7762, 7764, 7766, /* 0x70-0x77 */ 7768, 7770, 7772, 7774, 7776, 7778, 7780, 7782, /* 0x78-0x7f */ 7784, 7786, 7788, 7790, 7792, 7794, 7796, 7798, /* 0x80-0x87 */ 7800, 7802, 7804, 7806, 7808, 7810, 7812, 7814, /* 0x88-0x8f */ 7816, 7818, 7820, 7822, 7824, 7826, 7828, 7830, /* 0x90-0x97 */ 7832, 7834, 7836, 7838, 7840, 7842, 7844, 7846, /* 0x98-0x9f */ 7848, 7850, 7852, 7854, 7856, 7858, 7860, 7862, /* 0xa0-0xa7 */ 7864, 7866, 7868, 7870, 7872, 7874, 7876, 7878, /* 0xa8-0xaf */ 7880, 7882, 7884, 7886, 7888, 7890, 7892, 7894, /* 0xb0-0xb7 */ 7896, 7898, 7900, 7902, 7904, 7906, 7908, 7910, /* 0xb8-0xbf */ 7912, 7914, 7916, 7918, 7920, 7922, 7924, 7926, /* 0xc0-0xc7 */ 7928, 7930, -1, -1, -1, -1, 7932, 7934, /* 0xc8-0xcf */ 7936, 7938, 7940, 7942, 7944, 7946, 7948, 7950, /* 0xd0-0xd7 */ 7952, 7954, 7956, 7958, 7960, 7962, 7964, 7966, /* 0xd8-0xdf */ 7968, 7970, 7972, 7974, 7976, 7978, 7980, 7982, /* 0xe0-0xe7 */ 7984, 7986, 7988, 7990, 7992, 7994, 7996, 7998, /* 0xe8-0xef */ 8000, 8002, 8004, 8006, 8008, 8010, 8012, 8014, /* 0xf0-0xf7 */ 8016, 8018, 8020, 8022, 8024, 8026, 8028, 8030, /* 0xf8-0xff */ }; static const short translit_page2f8[544] = { 8032, 8034, 8036, 8038, 8040, 8042, 8044, 8046, /* 0x00-0x07 */ 8048, 8050, 8052, 8054, 8056, 8058, 8060, 8062, /* 0x08-0x0f */ 8064, 8066, 8068, 8070, 8072, 8074, 8076, 8078, /* 0x10-0x17 */ 8080, 8082, 8084, 8086, 8088, 8090, 8092, 8094, /* 0x18-0x1f */ 8096, 8098, 8100, 8102, 8104, 8106, 8108, 8110, /* 0x20-0x27 */ 8112, 8114, 8116, 8118, 8120, 8122, 8124, 8126, /* 0x28-0x2f */ 8128, 8130, 8132, 8134, 8136, 8138, 8140, 8142, /* 0x30-0x37 */ 8144, 8146, 8148, 8150, 8152, 8154, 8156, 8158, /* 0x38-0x3f */ 8160, 8162, 8164, 8166, 8168, 8170, 8172, 8174, /* 0x40-0x47 */ 8176, 8178, 8180, 8182, 8184, 8186, 8188, 8190, /* 0x48-0x4f */ 8192, 8194, 8196, 8198, 8200, 8202, 8204, 8206, /* 0x50-0x57 */ 8208, 8210, 8212, 8214, 8216, 8218, 8220, 8222, /* 0x58-0x5f */ 8224, 8226, 8228, 8230, 8232, 8234, 8236, 8238, /* 0x60-0x67 */ 8240, 8242, 8244, 8246, 8248, 8250, 8252, 8254, /* 0x68-0x6f */ 8256, 8258, 8260, 8262, 8264, 8266, 8268, 8270, /* 0x70-0x77 */ 8272, 8274, 8276, 8278, 8280, 8282, 8284, 8286, /* 0x78-0x7f */ 8288, 8290, 8292, 8294, 8296, 8298, 8300, 8302, /* 0x80-0x87 */ 8304, 8306, 8308, 8310, 8312, 8314, 8316, 8318, /* 0x88-0x8f */ 8320, 8322, 8324, 8326, 8328, 8330, 8332, 8334, /* 0x90-0x97 */ 8336, 8338, 8340, 8342, 8344, 8346, 8348, 8350, /* 0x98-0x9f */ 8352, 8354, 8356, 8358, 8360, 8362, 8364, 8366, /* 0xa0-0xa7 */ 8368, 8370, 8372, 8374, 8376, 8378, 8380, 8382, /* 0xa8-0xaf */ 8384, 8386, 8388, 8390, 8392, 8394, 8396, 8398, /* 0xb0-0xb7 */ 8400, 8402, 8404, 8406, 8408, 8410, 8412, 8414, /* 0xb8-0xbf */ 8416, 8418, 8420, 8422, 8424, 8426, 8428, 8430, /* 0xc0-0xc7 */ 8432, 8434, 8436, 8438, 8440, 8442, 8444, 8446, /* 0xc8-0xcf */ 8448, 8450, 8452, 8454, 8456, 8458, 8460, 8462, /* 0xd0-0xd7 */ 8464, 8466, 8468, 8470, 8472, 8474, 8476, 8478, /* 0xd8-0xdf */ 8480, 8482, 8484, 8486, 8488, 8490, 8492, 8494, /* 0xe0-0xe7 */ 8496, 8498, 8500, 8502, 8504, 8506, 8508, 8510, /* 0xe8-0xef */ 8512, 8514, 8516, 8518, 8520, 8522, 8524, 8526, /* 0xf0-0xf7 */ 8528, 8530, 8532, 8534, 8536, 8538, 8540, 8542, /* 0xf8-0xff */ /* 0x2f900 */ 8544, 8546, 8548, 8550, 8552, 8554, 8556, 8558, /* 0x00-0x07 */ 8560, 8562, 8564, 8566, 8568, 8570, 8572, 8574, /* 0x08-0x0f */ 8576, 8578, 8580, 8582, 8584, 8586, 8588, 8590, /* 0x10-0x17 */ 8592, 8594, 8596, 8598, 8600, 8602, 8604, 8606, /* 0x18-0x1f */ 8608, 8610, 8612, 8614, 8616, 8618, 8620, 8622, /* 0x20-0x27 */ 8624, 8626, 8628, 8630, 8632, 8634, 8636, 8638, /* 0x28-0x2f */ 8640, 8642, 8644, 8646, 8648, 8650, 8652, 8654, /* 0x30-0x37 */ 8656, 8658, 8660, 8662, 8664, 8666, 8668, 8670, /* 0x38-0x3f */ 8672, 8674, 8676, 8678, 8680, 8682, 8684, 8686, /* 0x40-0x47 */ 8688, 8690, 8692, 8694, 8696, 8698, 8700, 8702, /* 0x48-0x4f */ 8704, 8706, 8708, 8710, 8712, 8714, 8716, 8718, /* 0x50-0x57 */ 8720, 8722, 8724, 8726, 8728, 8730, 8732, 8734, /* 0x58-0x5f */ 8736, 8738, 8740, 8742, 8744, 8746, 8748, 8750, /* 0x60-0x67 */ 8752, 8754, 8756, 8758, 8760, 8762, 8764, 8766, /* 0x68-0x6f */ 8768, 8770, 8772, 8774, 8776, 8778, 8780, 8782, /* 0x70-0x77 */ 8784, 8786, 8788, 8790, 8792, 8794, 8796, 8798, /* 0x78-0x7f */ 8800, 8802, 8804, 8806, 8808, 8810, 8812, 8814, /* 0x80-0x87 */ 8816, 8818, 8820, 8822, 8824, 8826, 8828, 8830, /* 0x88-0x8f */ 8832, 8834, 8836, 8838, 8840, 8842, 8844, 8846, /* 0x90-0x97 */ 8848, 8850, 8852, 8854, 8856, 8858, 8860, 8862, /* 0x98-0x9f */ 8864, 8866, 8868, 8870, 8872, 8874, 8876, 8878, /* 0xa0-0xa7 */ 8880, 8882, 8884, 8886, 8888, 8890, 8892, 8894, /* 0xa8-0xaf */ 8896, 8898, 8900, 8902, 8904, 8906, 8908, 8910, /* 0xb0-0xb7 */ 8912, 8914, 8916, 8918, 8920, 8922, 8924, 8926, /* 0xb8-0xbf */ 8928, 8930, 8932, 8934, 8936, 8938, 8940, 8942, /* 0xc0-0xc7 */ 8944, 8946, 8948, 8950, 8952, 8954, 8956, 8958, /* 0xc8-0xcf */ 8960, 8962, 8964, 8966, 8968, 8970, 8972, 8974, /* 0xd0-0xd7 */ 8976, 8978, 8980, 8982, 8984, 8986, 8988, 8990, /* 0xd8-0xdf */ 8992, 8994, 8996, 8998, 9000, 9002, 9004, 9006, /* 0xe0-0xe7 */ 9008, 9010, 9012, 9014, 9016, 9018, 9020, 9022, /* 0xe8-0xef */ 9024, 9026, 9028, 9030, 9032, 9034, 9036, 9038, /* 0xf0-0xf7 */ 9040, 9042, 9044, 9046, 9048, 9050, 9052, 9054, /* 0xf8-0xff */ /* 0x2fa00 */ 9056, 9058, 9060, 9062, 9064, 9066, 9068, 9070, /* 0x00-0x07 */ 9072, 9074, 9076, 9078, 9080, 9082, 9084, 9086, /* 0x08-0x0f */ 9088, 9090, 9092, 9094, 9096, 9098, 9100, 9102, /* 0x10-0x17 */ 9104, 9106, 9108, 9110, 9112, 9114, -1, -1, /* 0x18-0x1f */ }; #define translit_index(wc) \ (wc >= 0x00a0 && wc < 0x01f8 ? translit_page00[wc-0x00a0] : \ wc >= 0x0218 && wc < 0x0220 ? translit_page02[wc-0x0218] : \ wc >= 0x02b8 && wc < 0x02e0 ? translit_page02_1[wc-0x02b8] : \ wc >= 0x03d0 && wc < 0x0400 ? translit_page03[wc-0x03d0] : \ wc == 0x0587 ? 654 : \ wc >= 0x05f0 && wc < 0x05f8 ? translit_page05[wc-0x05f0] : \ wc >= 0x0670 && wc < 0x0680 ? translit_page06[wc-0x0670] : \ wc == 0x0e33 ? 678 : \ wc >= 0x0eb0 && wc < 0x0ee0 ? translit_page0e[wc-0x0eb0] : \ wc >= 0x0f70 && wc < 0x0f80 ? translit_page0f[wc-0x0f70] : \ wc >= 0x1e00 && wc < 0x1ea0 ? translit_page1e[wc-0x1e00] : \ wc >= 0x1ef0 && wc < 0x1ef8 ? translit_page1e_2[wc-0x1ef0] : \ wc >= 0x2000 && wc < 0x2058 ? translit_page20[wc-0x2000] : \ wc >= 0x20a8 && wc < 0x20b0 ? translit_page20_3[wc-0x20a8] : \ wc >= 0x2100 && wc < 0x21d8 ? translit_page21[wc-0x2100] : \ wc >= 0x2210 && wc < 0x2270 ? translit_page22[wc-0x2210] : \ wc >= 0x22c0 && wc < 0x22f0 ? translit_page22_4[wc-0x22c0] : \ wc >= 0x2400 && wc < 0x24f0 ? translit_page24[wc-0x2400] : \ wc >= 0x2500 && wc < 0x2540 ? translit_page25[wc-0x2500] : \ wc == 0x25e6 ? 2025 : \ wc == 0x2a0c ? 2027 : \ wc >= 0x2a70 && wc < 0x2a78 ? translit_page2a[wc-0x2a70] : \ wc == 0x2e9f ? 2043 : \ wc == 0x2ef3 ? 2045 : \ wc >= 0x2f00 && wc < 0x2fd8 ? translit_page2f[wc-0x2f00] : \ wc >= 0x3000 && wc < 0x30f8 ? translit_page30[wc-0x3000] : \ wc >= 0x3130 && wc < 0x3190 ? translit_page31[wc-0x3130] : \ wc >= 0x31f0 && wc < 0x3400 ? translit_page31_5[wc-0x31f0] : \ wc >= 0xf900 && wc < 0xfa70 ? translit_pagef9[wc-0xf900] : \ wc >= 0xfb00 && wc < 0xfb50 ? translit_pagefb[wc-0xfb00] : \ wc >= 0xfe48 && wc < 0xfe70 ? translit_pagefe[wc-0xfe48] : \ wc >= 0xff00 && wc < 0xfff0 ? translit_pageff[wc-0xff00] : \ wc >= 0x1d400 && wc < 0x1d800 ? translit_page1d4[wc-0x1d400] : \ wc >= 0x2f800 && wc < 0x2fa20 ? translit_page2f8[wc-0x2f800] : \ -1) freelan-2.0/third-party/source/libiconv-msvc/include/ucs2.h000066400000000000000000000043711252300335000237570ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UCS-2 */ /* Here we accept FFFE/FEFF marks as endianness indicators everywhere in the stream, not just at the beginning. The default is big-endian. */ /* The state is 0 if big-endian, 1 if little-endian. */ static int ucs2_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { state_t state = conv->istate; int count = 0; for (; n >= 2;) { ucs4_t wc = (state ? s[0] + (s[1] << 8) : (s[0] << 8) + s[1]); s += 2; n -= 2; count += 2; if (wc == 0xfeff) { } else if (wc == 0xfffe) { state ^= 1; } else if (wc >= 0xd800 && wc < 0xe000) { conv->istate = state; return RET_SHIFT_ILSEQ(count); } else { *pwc = wc; conv->istate = state; return count; } } conv->istate = state; return RET_TOOFEW(count); } /* But we output UCS-2 in big-endian order, without byte-order mark. */ /* RFC 2152 says: "ISO/IEC 10646-1:1993(E) specifies that when characters the UCS-2 form are serialized as octets, that the most significant octet appear first." */ static int ucs2_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x10000 && wc != 0xfffe && !(wc >= 0xd800 && wc < 0xe000)) { if (n >= 2) { r[0] = (unsigned char) (wc >> 8); r[1] = (unsigned char) wc; return 2; } else return RET_TOOSMALL; } else return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/ucs2be.h000066400000000000000000000027731252300335000242720ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UCS-2BE = UCS-2 big endian */ static int ucs2be_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { if (n >= 2) { if (s[0] >= 0xd8 && s[0] < 0xe0) { return RET_ILSEQ; } else { *pwc = (s[0] << 8) + s[1]; return 2; } } return RET_TOOFEW(0); } static int ucs2be_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x10000 && !(wc >= 0xd800 && wc < 0xe000)) { if (n >= 2) { r[0] = (unsigned char) (wc >> 8); r[1] = (unsigned char) wc; return 2; } else return RET_TOOSMALL; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/ucs2internal.h000066400000000000000000000030621252300335000255100ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UCS-2-INTERNAL = UCS-2 with machine dependent endianness and alignment */ static int ucs2internal_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { if (n >= 2) { unsigned short x = *(const unsigned short *)s; if (x >= 0xd800 && x < 0xe000) { return RET_ILSEQ; } else { *pwc = x; return 2; } } return RET_TOOFEW(0); } static int ucs2internal_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x10000 && !(wc >= 0xd800 && wc < 0xe000)) { if (n >= 2) { *(unsigned short *)r = wc; return 2; } else return RET_TOOSMALL; } else return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/ucs2le.h000066400000000000000000000027761252300335000243070ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UCS-2LE = UCS-2 little endian */ static int ucs2le_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { if (n >= 2) { if (s[1] >= 0xd8 && s[1] < 0xe0) { return RET_ILSEQ; } else { *pwc = s[0] + (s[1] << 8); return 2; } } return RET_TOOFEW(0); } static int ucs2le_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x10000 && !(wc >= 0xd800 && wc < 0xe000)) { if (n >= 2) { r[0] = (unsigned char) wc; r[1] = (unsigned char) (wc >> 8); return 2; } else return RET_TOOSMALL; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/ucs2swapped.h000066400000000000000000000035451252300335000253450ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UCS-2-SWAPPED = UCS-2-INTERNAL with inverted endianness */ static int ucs2swapped_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { /* This function assumes that 'unsigned short' has exactly 16 bits. */ if (sizeof(unsigned short) != 2) abort(); if (n >= 2) { unsigned short x = *(const unsigned short *)s; x = (x >> 8) | (x << 8); if (x >= 0xd800 && x < 0xe000) { return RET_ILSEQ; } else { *pwc = x; return 2; } } return RET_TOOFEW(0); } static int ucs2swapped_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { /* This function assumes that 'unsigned short' has exactly 16 bits. */ if (sizeof(unsigned short) != 2) abort(); if (wc < 0x10000 && !(wc >= 0xd800 && wc < 0xe000)) { if (n >= 2) { unsigned short x = wc; x = (x >> 8) | (x << 8); *(unsigned short *)r = x; return 2; } else return RET_TOOSMALL; } else return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/ucs4.h000066400000000000000000000043271252300335000237620ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UCS-4 */ /* Here we accept FFFE0000/0000FEFF marks as endianness indicators everywhere in the stream, not just at the beginning. The default is big-endian. */ /* The state is 0 if big-endian, 1 if little-endian. */ static int ucs4_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { state_t state = conv->istate; int count = 0; for (; n >= 4;) { ucs4_t wc = (state ? s[0] + (s[1] << 8) + (s[2] << 16) + (s[3] << 24) : (s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3]); s += 4; n -= 4; count += 4; if (wc == 0x0000feff) { } else if (wc == 0xfffe0000u) { state ^= 1; } else if (wc <= 0x7fffffff) { *pwc = wc; conv->istate = state; return count; } else { conv->istate = state; return RET_SHIFT_ILSEQ(count); } } conv->istate = state; return RET_TOOFEW(count); } /* But we output UCS-4 in big-endian order, without byte-order mark. */ static int ucs4_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc <= 0x7fffffff) { if (n >= 4) { r[0] = (unsigned char) (wc >> 24); r[1] = (unsigned char) (wc >> 16); r[2] = (unsigned char) (wc >> 8); r[3] = (unsigned char) wc; return 4; } else return RET_TOOSMALL; } else return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/ucs4be.h000066400000000000000000000026651252300335000242740ustar00rootroot00000000000000/* * Copyright (C) 1999-2000 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UCS-4BE = UCS-4 big endian */ static int ucs4be_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { if (n >= 4) { *pwc = (s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3]; return 4; } return RET_TOOFEW(0); } static int ucs4be_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 4) { r[0] = (unsigned char) (wc >> 24); r[1] = (unsigned char) (wc >> 16); r[2] = (unsigned char) (wc >> 8); r[3] = (unsigned char) wc; return 4; } else return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/ucs4internal.h000066400000000000000000000025371252300335000255200ustar00rootroot00000000000000/* * Copyright (C) 1999-2000 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UCS-4-INTERNAL = UCS-4 with machine dependent endianness and alignment */ static int ucs4internal_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { if (n >= 4) { *pwc = *(const unsigned int *)s; return 4; } return RET_TOOFEW(0); } static int ucs4internal_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 4) { *(unsigned int *)r = wc; return 4; } else return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/ucs4le.h000066400000000000000000000026701252300335000243020ustar00rootroot00000000000000/* * Copyright (C) 1999-2000 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UCS-4LE = UCS-4 little endian */ static int ucs4le_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { if (n >= 4) { *pwc = s[0] + (s[1] << 8) + (s[2] << 16) + (s[3] << 24); return 4; } return RET_TOOFEW(0); } static int ucs4le_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 4) { r[0] = (unsigned char) wc; r[1] = (unsigned char) (wc >> 8); r[2] = (unsigned char) (wc >> 16); r[3] = (unsigned char) (wc >> 24); return 4; } else return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/ucs4swapped.h000066400000000000000000000033701252300335000253430ustar00rootroot00000000000000/* * Copyright (C) 1999-2000 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UCS-4-SWAPPED = UCS-4-INTERNAL with inverted endianness */ static int ucs4swapped_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { /* This function assumes that 'unsigned int' has exactly 32 bits. */ if (sizeof(unsigned int) != 4) abort(); if (n >= 4) { unsigned int x = *(const unsigned int *)s; x = (x >> 24) | ((x >> 8) & 0xff00) | ((x & 0xff00) << 8) | (x << 24); *pwc = x; return 4; } return RET_TOOFEW(0); } static int ucs4swapped_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { /* This function assumes that 'unsigned int' has exactly 32 bits. */ if (sizeof(unsigned int) != 4) abort(); if (n >= 4) { unsigned int x = wc; x = (x >> 24) | ((x >> 8) & 0xff00) | ((x & 0xff00) << 8) | (x << 24); *(unsigned int *)r = x; return 4; } else return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/uhc_1.h000066400000000000000000002446651252300335000241160ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * Unified Hangul Code part 1 */ static const unsigned short uhc_1_2uni_main_page81[64] = { 0xac02, 0xac8d, 0xad14, 0xad91, 0xadfa, 0xae7a, 0xaee6, 0xaf57, 0xafbf, 0xb030, 0xb0a5, 0xb122, 0xb19e, 0xb207, 0xb26f, 0xb2f0, 0xb366, 0xb3e1, 0xb445, 0xb4ad, 0xb51e, 0xb590, 0xb600, 0xb661, 0xb6c3, 0xb723, 0xb79f, 0xb811, 0xb885, 0xb8f1, 0xb95a, 0xb9d4, 0xba47, 0xbac2, 0xbb28, 0xbb9a, 0xbc03, 0xbc80, 0xbcfe, 0xbd67, 0xbdd2, 0xbe3d, 0xbeb8, 0xbf23, 0xbf83, 0xbfe6, 0xc040, 0xc0a7, 0xc132, 0xc1b1, 0xc224, 0xc297, 0xc310, 0xc37a, 0xc3db, 0xc446, 0xc4aa, 0xc50f, 0xc596, 0xc626, 0xc6a8, 0xc726, 0xc7b8, 0xc832, }; static const unsigned char uhc_1_2uni_page81[5696] = { /* 0x81 */ 0x00, 0x01, 0x03, 0x04, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x16, 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2c, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x53, 0x54, 0x55, 0x57, 0x58, 0x59, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x70, 0x71, 0x73, 0x74, 0x77, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x80, 0x85, 0x86, 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x11, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1e, 0x20, 0x21, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2d, 0x31, 0x32, 0x33, 0x35, 0x36, 0x38, 0x39, 0x3a, 0x3c, 0x3d, 0x3e, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x49, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x55, 0x56, 0x58, 0x59, 0x5c, 0x5e, 0x60, 0x61, 0x65, 0x67, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x71, 0x72, 0x74, 0x75, 0x76, 0x78, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x81, 0x83, 0x85, 0x86, /* 0x82 */ 0x00, 0x01, 0x02, 0x03, 0x05, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x16, 0x17, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x22, 0x23, 0x25, 0x26, 0x27, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x32, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3d, 0x3e, 0x3f, 0x41, 0x42, 0x43, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x5a, 0x5b, 0x5d, 0x5e, 0x63, 0x64, 0x65, 0x66, 0x6a, 0x6c, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x76, 0x77, 0x79, 0x7a, 0x7b, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x31, 0x32, 0x34, 0x35, 0x36, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x41, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4c, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, /* 0x83 */ 0x00, 0x01, 0x03, 0x04, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x12, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x38, 0x39, 0x3b, 0x3c, 0x3f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x48, 0x4a, 0x4d, 0x4e, 0x4f, 0x51, 0x55, 0x57, 0x58, 0x59, 0x5b, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x64, 0x68, 0x69, 0x6a, 0x6c, 0x6d, 0x70, 0x71, 0x73, 0x74, 0x75, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x00, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x45, 0x47, 0x48, 0x49, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x54, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x60, 0x61, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, /* 0x84 */ 0x00, 0x01, 0x03, 0x04, 0x06, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x15, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x23, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x48, 0x49, 0x4b, 0x4d, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x58, 0x5a, 0x5e, 0x5f, 0x60, 0x61, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x00, 0x01, 0x02, 0x03, 0x04, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x2a, 0x2b, 0x2c, 0x2e, 0x2f, 0x30, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x3b, 0x3c, 0x3d, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x63, 0x64, 0x66, 0x67, /* 0x85 */ 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x0b, 0x0d, 0x10, 0x11, 0x12, 0x13, 0x14, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x33, 0x34, 0x36, 0x37, 0x38, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x43, 0x44, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4e, 0x4f, 0x50, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x16, 0x17, 0x19, 0x1b, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x26, 0x28, 0x2a, 0x2b, 0x2c, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4e, 0x4f, 0x51, 0x52, 0x53, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5e, 0x60, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x6b, 0x6d, 0x6e, 0x73, 0x74, /* 0x86 */ 0x00, 0x01, 0x02, 0x05, 0x0b, 0x0d, 0x11, 0x12, 0x14, 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x21, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2d, 0x2e, 0x30, 0x31, 0x32, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3c, 0x3d, 0x3e, 0x3f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x65, 0x68, 0x69, 0x6a, 0x6c, 0x6f, 0x70, 0x71, 0x72, 0x75, 0x79, 0x7a, 0x7b, 0x7c, 0x00, 0x04, 0x05, 0x07, 0x08, 0x09, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x14, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x20, 0x21, 0x23, 0x24, 0x25, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x30, 0x31, 0x34, 0x35, 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x58, 0x59, 0x5b, 0x5c, 0x5d, 0x5f, 0x61, 0x62, 0x63, 0x64, 0x65, 0x68, 0x6a, 0x6c, 0x6d, 0x6e, 0x6f, 0x73, 0x74, 0x75, 0x77, 0x78, 0x79, 0x7b, /* 0x87 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2f, 0x30, 0x31, 0x33, 0x34, 0x35, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x40, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4c, 0x4d, 0x4f, 0x50, 0x51, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5c, 0x5e, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x68, 0x00, 0x02, 0x03, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0f, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0x88 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x23, 0x24, 0x26, 0x27, 0x28, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x33, 0x35, 0x38, 0x39, 0x3a, 0x3c, 0x3e, 0x3f, 0x40, 0x42, 0x43, 0x44, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x5b, 0x5c, 0x5e, 0x5f, 0x60, 0x62, 0x64, 0x65, 0x66, 0x67, 0x68, 0x6b, 0x6d, 0x6f, 0x70, 0x71, 0x72, 0x74, 0x78, 0x7a, 0x7b, 0x00, 0x01, 0x02, 0x06, 0x0c, 0x0d, 0x0e, 0x12, 0x13, 0x15, 0x16, 0x17, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x22, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x67, 0x69, 0x6a, 0x6d, 0x70, 0x71, 0x72, 0x73, /* 0x89 */ 0x00, 0x02, 0x04, 0x06, 0x07, 0x09, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1c, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x27, 0x28, 0x29, 0x2b, 0x2c, 0x2d, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x43, 0x44, 0x45, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x60, 0x61, 0x63, 0x64, 0x67, 0x69, 0x6b, 0x6c, 0x6d, 0x70, 0x72, 0x74, 0x76, 0x78, 0x79, 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x38, 0x39, 0x3a, 0x3c, 0x3d, 0x3e, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x49, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, /* 0x8a */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1d, 0x1f, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x60, 0x61, 0x62, 0x64, 0x65, 0x66, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x0b, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x27, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x31, 0x32, 0x34, 0x35, 0x38, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x41, 0x43, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x69, 0x6a, 0x6c, 0x6d, 0x70, /* 0x8b */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x14, 0x15, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x24, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x30, 0x31, 0x33, 0x34, 0x35, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x40, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x12, 0x13, 0x15, 0x16, 0x17, 0x19, 0x1c, 0x1d, 0x1e, 0x1f, 0x22, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2e, 0x2f, 0x31, 0x32, 0x33, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3e, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, /* 0x8c */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x12, 0x13, 0x15, 0x16, 0x17, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3e, 0x40, 0x41, 0x42, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4c, 0x4d, 0x4e, 0x4f, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, /* 0x8d */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2e, 0x2f, 0x30, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3f, 0x40, 0x41, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x07, 0x08, 0x0a, 0x0b, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x17, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x22, 0x23, 0x24, 0x26, 0x27, 0x28, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3e, 0x3f, 0x40, 0x42, 0x43, 0x44, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4f, 0x51, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x5b, 0x5c, 0x5e, 0x5f, 0x60, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x6b, 0x70, 0x71, 0x72, 0x77, 0x78, 0x7a, 0x7b, /* 0x8e */ 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0b, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x17, 0x18, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x29, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4f, 0x50, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5f, 0x63, 0x64, 0x65, 0x66, 0x67, 0x6b, 0x6c, 0x6e, 0x6f, 0x70, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x09, 0x0b, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x25, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x30, 0x31, 0x32, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x41, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5d, 0x5f, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x68, 0x69, 0x6a, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, /* 0x8f */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2c, 0x2d, 0x2e, 0x30, 0x31, 0x32, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3d, 0x3f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x48, 0x49, 0x4a, 0x4c, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x59, 0x5b, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x65, 0x66, 0x68, 0x69, 0x6a, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x09, 0x0b, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5c, 0x5d, 0x5f, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, /* 0x90 */ 0x00, 0x01, 0x03, 0x04, 0x05, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x12, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2c, 0x2e, 0x31, 0x32, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x54, 0x55, 0x57, 0x58, 0x59, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x64, 0x66, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x70, 0x71, 0x73, 0x79, 0x00, 0x01, 0x02, 0x03, 0x06, 0x08, 0x0b, 0x0c, 0x0e, 0x12, 0x13, 0x15, 0x16, 0x17, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x22, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x66, 0x67, 0x69, 0x6a, 0x6b, 0x6d, 0x6f, 0x70, 0x71, 0x72, /* 0x91 */ 0x00, 0x03, 0x05, 0x08, 0x09, 0x0a, 0x0b, 0x0f, 0x10, 0x12, 0x13, 0x14, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1f, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x2b, 0x2c, 0x2e, 0x2f, 0x30, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3f, 0x41, 0x42, 0x43, 0x44, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x63, 0x66, 0x67, 0x68, 0x6a, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x73, 0x75, 0x77, 0x78, 0x79, 0x7a, 0x00, 0x01, 0x03, 0x04, 0x05, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3f, 0x40, 0x41, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4c, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x57, 0x58, 0x59, 0x5b, 0x5c, 0x5d, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, /* 0x92 */ 0x00, 0x02, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0f, 0x11, 0x12, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1e, 0x20, 0x22, 0x23, 0x24, 0x26, 0x29, 0x2a, 0x2b, 0x2d, 0x2e, 0x2f, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x3a, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x61, 0x62, 0x63, 0x65, 0x66, 0x67, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x27, 0x28, 0x29, 0x2b, 0x2c, 0x2d, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x37, 0x38, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x60, 0x61, 0x63, 0x64, 0x67, /* 0x93 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x07, 0x0b, 0x0d, 0x0f, 0x10, 0x16, 0x17, 0x1d, 0x1e, 0x1f, 0x20, 0x23, 0x25, 0x27, 0x28, 0x29, 0x2b, 0x2c, 0x2f, 0x30, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3f, 0x43, 0x44, 0x45, 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x00, 0x01, 0x02, 0x03, 0x06, 0x07, 0x09, 0x0a, 0x0d, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x16, 0x18, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x22, 0x23, 0x25, 0x26, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x32, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3e, 0x3f, 0x41, 0x42, 0x43, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4e, 0x52, 0x53, 0x54, 0x56, 0x57, 0x59, 0x5a, 0x5b, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x77, 0x79, 0x7a, 0x7b, 0x7d, /* 0x94 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x0a, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x15, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4c, 0x4d, 0x4f, 0x50, 0x51, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x67, 0x68, 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x1b, 0x1c, 0x1e, 0x1f, 0x24, 0x25, 0x26, 0x27, 0x28, 0x2b, 0x2d, 0x2f, 0x30, 0x31, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, /* 0x95 */ 0x00, 0x01, 0x04, 0x05, 0x07, 0x08, 0x09, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x23, 0x24, 0x25, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2f, 0x30, 0x32, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3c, 0x3d, 0x3f, 0x40, 0x41, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4c, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x09, 0x0a, 0x0c, 0x0d, 0x0e, 0x10, 0x12, 0x13, 0x14, 0x15, 0x16, 0x19, 0x1b, 0x1f, 0x20, 0x21, 0x22, 0x25, 0x26, 0x28, 0x29, 0x2a, 0x2c, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x35, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x41, 0x42, 0x44, 0x45, 0x46, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x51, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, /* 0x96 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1a, 0x1b, 0x1d, 0x1e, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x29, 0x2a, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x62, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1f, 0x20, 0x22, 0x23, 0x24, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2f, 0x30, 0x31, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x97 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4b, 0x4c, 0x4e, 0x4f, 0x50, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x5a, 0x5b, 0x5d, 0x5f, 0x60, 0x61, 0x62, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x57, 0x58, 0x59, /* 0x98 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x19, 0x1a, 0x1b, 0x1d, 0x1e, 0x1f, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x52, 0x53, 0x55, 0x56, 0x57, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x62, 0x64, 0x66, 0x00, 0x01, 0x02, 0x03, 0x04, 0x07, 0x0a, 0x0b, 0x10, 0x11, 0x12, 0x13, 0x14, 0x17, 0x1b, 0x1c, 0x1d, 0x1f, 0x20, 0x23, 0x24, 0x26, 0x27, 0x28, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x33, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3f, 0x40, 0x42, 0x43, 0x44, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4f, 0x51, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x5a, 0x5b, 0x5c, 0x5e, 0x5f, 0x60, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x6a, 0x6b, 0x6c, 0x6d, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x7a, 0x7b, 0x7e, 0x81, 0x82, 0x83, 0x84, 0x87, /* 0x99 */ 0x00, 0x01, 0x02, 0x03, 0x05, 0x08, 0x09, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x18, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x24, 0x25, 0x27, 0x28, 0x29, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x34, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3f, 0x40, 0x41, 0x43, 0x44, 0x45, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5d, 0x5f, 0x60, 0x61, 0x63, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6c, 0x6e, 0x70, 0x71, 0x72, 0x74, 0x75, 0x78, 0x79, 0x7b, 0x7c, 0x7d, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x24, 0x25, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x30, 0x31, 0x32, 0x34, 0x35, 0x36, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x41, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5d, 0x5f, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x69, 0x6a, 0x6c, 0x6d, 0x70, 0x71, 0x72, /* 0x9a */ 0x00, 0x01, 0x02, 0x03, 0x06, 0x08, 0x0a, 0x0c, 0x0f, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2e, 0x2f, 0x31, 0x32, 0x33, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3d, 0x3e, 0x3f, 0x40, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x5a, 0x5c, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x00, 0x02, 0x03, 0x05, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0f, 0x10, 0x12, 0x13, 0x14, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1f, 0x21, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x47, 0x48, 0x4a, 0x4b, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x57, 0x59, 0x5b, 0x5c, 0x5d, 0x5e, 0x60, 0x63, 0x66, 0x67, 0x68, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x73, 0x74, 0x77, 0x78, /* 0x9b */ 0x00, 0x01, 0x02, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x16, 0x17, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x5a, 0x5b, 0x5d, 0x5e, 0x5f, 0x61, 0x63, 0x64, 0x65, 0x66, 0x67, 0x00, 0x01, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x60, /* 0x9c */ 0x00, 0x02, 0x03, 0x06, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x00, 0x01, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x20, 0x21, 0x23, 0x24, 0x25, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x30, 0x31, 0x32, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, /* 0x9d */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x48, 0x49, 0x4b, 0x4c, 0x4d, 0x4f, 0x51, 0x52, 0x53, 0x54, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x63, 0x64, 0x00, 0x02, 0x03, 0x04, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x2b, 0x2d, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x37, 0x38, 0x3c, 0x40, 0x41, 0x42, 0x43, 0x47, 0x4b, 0x4c, 0x4d, 0x50, 0x53, 0x54, 0x56, 0x57, 0x58, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x63, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6f, 0x70, 0x72, 0x73, 0x74, 0x76, 0x77, 0x79, 0x7a, 0x7b, 0x7c, 0x7f, 0x81, 0x83, 0x84, 0x85, /* 0x9e */ 0x00, 0x03, 0x04, 0x05, 0x07, 0x08, 0x09, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x20, 0x21, 0x24, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x35, 0x37, 0x39, 0x3c, 0x3d, 0x3f, 0x40, 0x41, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4c, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x59, 0x5b, 0x5c, 0x5d, 0x5f, 0x62, 0x63, 0x64, 0x65, 0x6c, 0x6d, 0x6e, 0x73, 0x74, 0x75, 0x77, 0x78, 0x79, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x84, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x00, 0x01, 0x03, 0x04, 0x05, 0x09, 0x0b, 0x0c, 0x10, 0x12, 0x14, 0x16, 0x17, 0x18, 0x19, 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2c, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x47, 0x48, 0x4a, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x54, 0x55, 0x57, 0x58, 0x59, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x64, 0x66, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x70, 0x71, 0x73, 0x74, 0x75, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x80, /* 0x9f */ 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x0a, 0x0b, 0x0d, 0x0e, 0x0f, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1a, 0x1c, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x26, 0x27, 0x29, 0x2a, 0x2b, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x36, 0x37, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x42, 0x43, 0x45, 0x46, 0x47, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5e, 0x5f, 0x61, 0x62, 0x63, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6e, 0x70, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x7a, 0x7b, 0x7d, 0x00, 0x01, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0c, 0x0e, 0x10, 0x12, 0x13, 0x14, 0x15, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x25, 0x28, 0x2a, 0x33, 0x34, 0x35, 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x43, 0x44, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x50, 0x51, 0x53, 0x54, 0x55, 0x59, 0x5a, 0x5b, 0x5c, 0x60, 0x65, 0x66, 0x67, 0x69, 0x6c, 0x6d, 0x6f, 0x73, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7c, 0x81, 0x82, 0x83, 0x84, 0x85, 0x88, 0x89, 0x8b, 0x8c, 0x8d, 0x8f, 0x90, 0x91, /* 0xa0 */ 0x00, 0x01, 0x02, 0x03, 0x06, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x12, 0x13, 0x15, 0x17, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x21, 0x22, 0x23, 0x24, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2d, 0x2e, 0x2f, 0x31, 0x32, 0x33, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x51, 0x53, 0x54, 0x55, 0x56, 0x57, 0x5a, 0x5c, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x66, 0x67, 0x69, 0x6a, 0x6b, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x76, 0x78, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08, 0x09, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x18, 0x19, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x40, 0x41, 0x43, 0x44, 0x45, 0x47, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x50, 0x52, 0x56, 0x57, 0x58, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6c, 0x6e, 0x70, 0x71, 0x72, }; static int uhc_1_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x81 && c1 <= 0xa0)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x41 && c2 < 0x5b) || (c2 >= 0x61 && c2 < 0x7b) || (c2 >= 0x81 && c2 < 0xff)) { unsigned int row = c1 - 0x81; unsigned int col = c2 - (c2 >= 0x81 ? 0x4d : c2 >= 0x61 ? 0x47 : 0x41); unsigned int i = 178 * row + col; if (i < 5696) { *pwc = (ucs4_t) (uhc_1_2uni_main_page81[2*row+(col>=89?1:0)] + uhc_1_2uni_page81[i]); return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short uhc_1_2charset_main[45] = { 0x8141, 0x81cd, 0x829b, 0x8363, 0x83e9, 0x84b7, 0x8585, 0x8647, 0x86d3, 0x87a1, 0x8869, 0x88ef, 0x89bd, 0x8a8b, 0x8b4d, 0x8bd9, 0x8ca7, 0x8d6f, 0x8df5, 0x8ec3, 0x8f91, 0x9053, 0x90df, 0x91ad, 0x9275, 0x92fb, 0x93c9, 0x9497, 0x9559, 0x95e5, 0x96b3, 0x9781, 0x9843, 0x98cf, 0x999d, 0x9a65, 0x9aeb, 0x9bb9, 0x9c87, 0x9d49, 0x9dd5, 0x9ea3, 0x9f6b, 0x9ff1, 0xa0bf, }; static const unsigned char uhc_1_2charset[5696] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc6, 0xc7, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xca, 0xcb, 0xcc, 0xcd, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x00, 0x01, 0x02, 0x03, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0x00, 0x01, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0xc0, 0xc1, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xc4, 0xc5, 0xc6, 0xc7, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, }; static const Summary16 uhc_1_uni2indx_pageac[459] = { /* 0xac00 */ { 0, 0xf86c }, { 9, 0xc100 }, { 12, 0x4fee }, { 23, 0xecfc }, { 34, 0xd7fe }, { 47, 0xeeef }, { 60, 0xffff }, { 76, 0xfa6c }, { 86, 0xe184 }, { 92, 0x4fee }, { 103, 0x68fc }, { 112, 0xc4fe }, { 122, 0xeeed }, { 134, 0xff5f }, { 148, 0x6a6c }, { 156, 0xcf94 }, /* 0xad00 */ { 165, 0x4fae }, { 175, 0xeefd }, { 188, 0xcdfe }, { 200, 0xeecf }, { 212, 0xfd4f }, { 224, 0xfeee }, { 237, 0xcff5 }, { 249, 0x4786 }, { 256, 0xecf9 }, { 267, 0xcffe }, { 280, 0xffef }, { 295, 0xff7f }, { 310, 0xfeec }, { 322, 0xeff4 }, { 334, 0xffee }, { 348, 0x6cff }, /* 0xae00 */ { 360, 0xd4fc }, { 370, 0xffef }, { 385, 0xffff }, { 401, 0xfa6c }, { 411, 0x8b94 }, { 418, 0x4fae }, { 428, 0xecdc }, { 438, 0xc4fe }, { 448, 0xefcf }, { 461, 0xffff }, { 477, 0xffff }, { 493, 0x8fff }, { 506, 0x4fee }, { 517, 0xecfc }, { 528, 0xd6ff }, { 541, 0xeeef }, /* 0xaf00 */ { 554, 0xde7f }, { 567, 0xfffe }, { 582, 0xcfff }, { 596, 0x4fea }, { 606, 0xfcf1 }, { 617, 0xcffe }, { 630, 0xffcf }, { 644, 0xfdff }, { 659, 0xfeee }, { 672, 0xefdc }, { 684, 0xffff }, { 700, 0xecff }, { 713, 0x947e }, { 722, 0xefef }, { 736, 0xfcff }, { 750, 0xfeec }, /* 0xb000 */ { 762, 0xefec }, { 774, 0xcfee }, { 786, 0xfeff }, { 801, 0xffff }, { 817, 0xaacf }, { 827, 0xdd47 }, { 837, 0xffff }, { 853, 0xcfff }, { 867, 0x4fee }, { 878, 0x68fd }, { 888, 0x04f8 }, { 894, 0xeec5 }, { 904, 0xfc4f }, { 915, 0xfeec }, { 927, 0xffde }, { 941, 0xffff }, /* 0xb100 */ { 957, 0xe4ff }, { 969, 0xc4f2 }, { 977, 0xeec7 }, { 988, 0xfc4f }, { 999, 0xfeec }, { 1011, 0xeecc }, { 1021, 0xfffe }, { 1036, 0xecff }, { 1049, 0xd4fa }, { 1059, 0xeee3 }, { 1070, 0xfeff }, { 1085, 0xffff }, { 1101, 0xefff }, { 1116, 0x4fee }, { 1127, 0xecff }, { 1140, 0xd5fe }, /* 0xb200 */ { 1152, 0xe6cf }, { 1163, 0xfd4f }, { 1175, 0xfffe }, { 1190, 0xefef }, { 1204, 0xffff }, { 1220, 0xeeff }, { 1234, 0xfcfe }, { 1247, 0xefcf }, { 1260, 0xfdcf }, { 1273, 0xf8ec }, { 1283, 0xeb94 }, { 1292, 0xffee }, { 1306, 0xecff }, { 1319, 0xd4fa }, { 1329, 0x068b }, { 1335, 0x7047 }, /* 0xb300 */ { 1342, 0xfeec }, { 1354, 0xefc4 }, { 1364, 0xffff }, { 1380, 0xffff }, { 1396, 0xffff }, { 1412, 0x268f }, { 1420, 0xb54f }, { 1430, 0xfeec }, { 1442, 0xefc4 }, { 1452, 0xffee }, { 1466, 0xeefc }, { 1478, 0xffff }, { 1494, 0xa6cf }, { 1504, 0xd54e }, { 1513, 0xfeee }, { 1526, 0xefff }, /* 0xb400 */ { 1541, 0xffff }, { 1557, 0xeefe }, { 1570, 0xf4fe }, { 1582, 0xffef }, { 1597, 0xffff }, { 1613, 0xfeec }, { 1625, 0xefd4 }, { 1636, 0xffff }, { 1652, 0xfefe }, { 1666, 0xdfff }, { 1681, 0xeeef }, { 1694, 0xfd5f }, { 1707, 0xfeee }, { 1720, 0xcfde }, { 1732, 0x4fa6 }, { 1741, 0xfefd }, /* 0xb500 */ { 1755, 0xffff }, { 1771, 0xe6cf }, { 1782, 0xf84f }, { 1792, 0xfeec }, { 1804, 0xc7c4 }, { 1812, 0x4fee }, { 1823, 0xfffc }, { 1837, 0xffff }, { 1853, 0xffff }, { 1869, 0xffff }, { 1885, 0xf2ec }, { 1895, 0xc7c4 }, { 1903, 0x4fee }, { 1914, 0xfefc }, { 1927, 0xefff }, { 1942, 0xffff }, /* 0xb600 */ { 1958, 0xffff }, { 1974, 0xfeec }, { 1986, 0xefdf }, { 2000, 0xffef }, { 2015, 0xfeff }, { 2030, 0xffff }, { 2046, 0xfeef }, { 2060, 0xffff }, { 2076, 0xffff }, { 2092, 0xcfff }, { 2106, 0xe7ee }, { 2118, 0xfffd }, { 2133, 0xffff }, { 2149, 0xffef }, { 2164, 0xffff }, { 2180, 0xfeee }, /* 0xb700 */ { 2193, 0xffdc }, { 2206, 0xffff }, { 2222, 0x6cff }, { 2234, 0xf4fe }, { 2246, 0xeeef }, { 2259, 0xffcf }, { 2273, 0xfeee }, { 2286, 0xcfd4 }, { 2296, 0x4fee }, { 2307, 0xec38 }, { 2315, 0xc4fe }, { 2325, 0xfecf }, { 2338, 0xfd7f }, { 2352, 0xffff }, { 2368, 0xcfff }, { 2382, 0x4fee }, /* 0xb800 */ { 2393, 0xec7c }, { 2403, 0xd4fe }, { 2414, 0xeecf }, { 2426, 0xfc4f }, { 2437, 0xffee }, { 2451, 0xcff5 }, { 2463, 0x4fee }, { 2474, 0xeefd }, { 2487, 0xdfff }, { 2502, 0xffff }, { 2518, 0xfeff }, { 2533, 0xfeee }, { 2546, 0xefd4 }, { 2557, 0x5fee }, { 2569, 0xecfd }, { 2581, 0xd4fe }, /* 0xb900 */ { 2592, 0xffef }, { 2607, 0xfeff }, { 2622, 0xfffe }, { 2637, 0xcfff }, { 2651, 0x6fee }, { 2663, 0xecfd }, { 2675, 0xd4fe }, { 2686, 0xeecf }, { 2698, 0x994f }, { 2707, 0xffff }, { 2723, 0xcfff }, { 2737, 0x4fee }, { 2748, 0x2cfd }, { 2758, 0x94f8 }, { 2766, 0xeec5 }, { 2776, 0xf84f }, /* 0xba00 */ { 2786, 0xfefc }, { 2799, 0xffdf }, { 2814, 0xffff }, { 2830, 0xecff }, { 2843, 0x94fa }, { 2852, 0xeec7 }, { 2863, 0xfc4f }, { 2874, 0xfeec }, { 2886, 0xef47 }, { 2897, 0xffff }, { 2913, 0xe4ff }, { 2925, 0xd4fa }, { 2935, 0xfeef }, { 2949, 0xfcff }, { 2963, 0xffff }, { 2979, 0xefff }, /* 0xbb00 */ { 2994, 0x5fee }, { 3006, 0xeefd }, { 3019, 0xf5fe }, { 3032, 0x868f }, { 3040, 0x5d4f }, { 3050, 0xfeee }, { 3063, 0xeff5 }, { 3076, 0xffff }, { 3092, 0xeeff }, { 3106, 0xfffe }, { 3121, 0xeeef }, { 3134, 0xff6f }, { 3148, 0xfeee }, { 3161, 0xfff6 }, { 3175, 0xffff }, { 3191, 0x6cff }, /* 0xbc00 */ { 3203, 0x44fa }, { 3211, 0x060d }, { 3216, 0xdd4f }, { 3227, 0xfeec }, { 3239, 0xcdc4 }, { 3247, 0xdffe }, { 3261, 0xffff }, { 3277, 0xffff }, { 3293, 0xa6cf }, { 3303, 0xf94f }, { 3314, 0xfe6c }, { 3325, 0xcfc4 }, { 3334, 0x5fee }, { 3346, 0xeedc }, { 3357, 0xffff }, { 3373, 0xee8f }, /* 0xbd00 */ { 3384, 0xfd4f }, { 3396, 0xffee }, { 3410, 0xefef }, { 3424, 0xffff }, { 3440, 0xecfe }, { 3452, 0xfcfe }, { 3465, 0xfeef }, { 3479, 0xffff }, { 3495, 0xf86c }, { 3504, 0xe9d4 }, { 3513, 0xffef }, { 3528, 0xfefe }, { 3542, 0xffff }, { 3558, 0xeecf }, { 3570, 0xfdff }, { 3585, 0xfeee }, /* 0xbe00 */ { 3598, 0xcfd6 }, { 3609, 0x4fee }, { 3620, 0xffff }, { 3636, 0xffff }, { 3652, 0xaecf }, { 3663, 0xf14f }, { 3673, 0xfaec }, { 3684, 0xc7c4 }, { 3692, 0x4fee }, { 3703, 0xfcfc }, { 3715, 0xfeff }, { 3730, 0xffff }, { 3746, 0xffff }, { 3762, 0xfe6c }, { 3773, 0xefc6 }, { 3784, 0xffff }, /* 0xbf00 */ { 3800, 0xfcfd }, { 3813, 0xc4ff }, { 3824, 0xffff }, { 3840, 0xffff }, { 3856, 0xfeec }, { 3868, 0xffdc }, { 3881, 0xffff }, { 3897, 0xffff }, { 3913, 0xffff }, { 3929, 0xffef }, { 3944, 0xffff }, { 3960, 0xfffe }, { 3975, 0xcfdf }, { 3988, 0x6fee }, { 4000, 0xfffd }, { 4015, 0xffff }, /* 0xc000 */ { 4031, 0xffff }, { 4047, 0xffff }, { 4063, 0xffff }, { 4079, 0xefff }, { 4094, 0xffff }, { 4110, 0xeefd }, { 4123, 0xfcfe }, { 4136, 0xffff }, { 4152, 0xffff }, { 4168, 0xfeec }, { 4180, 0x4fd4 }, { 4189, 0x4f86 }, { 4197, 0xecdc }, { 4207, 0xc4fe }, { 4217, 0xeecf }, { 4229, 0xfd4f }, /* 0xc100 */ { 4241, 0xfeee }, { 4254, 0x0fde }, { 4264, 0x4f26 }, { 4272, 0xecbc }, { 4282, 0xc4fe }, { 4292, 0xeecf }, { 4304, 0xfc4f }, { 4315, 0xfeee }, { 4328, 0x8fdf }, { 4340, 0x4fae }, { 4350, 0xecdd }, { 4361, 0xdffe }, { 4375, 0xeeef }, { 4388, 0xfe6f }, { 4401, 0xfeee }, { 4414, 0xcff4 }, /* 0xc200 */ { 4425, 0x4fee }, { 4436, 0x6cfd }, { 4447, 0x54fe }, { 4457, 0xffe9 }, { 4470, 0xfeff }, { 4485, 0xfeec }, { 4497, 0xcfde }, { 4509, 0x4fee }, { 4520, 0xfcfd }, { 4533, 0xd6fe }, { 4545, 0xcecf }, { 4556, 0xfd4f }, { 4568, 0xffff }, { 4584, 0xcfff }, { 4598, 0x47e6 }, { 4607, 0xe4bd }, /* 0xc300 */ { 4617, 0xccfe }, { 4628, 0xeec7 }, { 4639, 0xfccf }, { 4651, 0xffff }, { 4667, 0xffdf }, { 4682, 0xffff }, { 4698, 0xecff }, { 4711, 0xccfa }, { 4721, 0xeeef }, { 4734, 0xffff }, { 4750, 0xffff }, { 4766, 0xffff }, { 4782, 0xfffe }, { 4797, 0x6cff }, { 4809, 0xdcfa }, { 4820, 0xfecf }, /* 0xc400 */ { 4833, 0xfeff }, { 4848, 0xfffe }, { 4863, 0xefef }, { 4877, 0xcfee }, { 4889, 0xfeff }, { 4904, 0xffff }, { 4920, 0xeecf }, { 4932, 0xfdcf }, { 4945, 0xfffe }, { 4960, 0xefef }, { 4974, 0xffff }, { 4990, 0xeeff }, { 5004, 0xffff }, { 5020, 0xffff }, { 5036, 0xfdff }, { 5051, 0x7aec }, /* 0xc500 */ { 5061, 0xeffc }, { 5074, 0xefee }, { 5087, 0xecff }, { 5100, 0xd4fe }, { 5111, 0x88cf }, { 5119, 0x9c47 }, { 5127, 0xfeec }, { 5139, 0xcfc4 }, { 5148, 0x4f6e }, { 5158, 0xee5d }, { 5169, 0xfdfe }, { 5183, 0x84cf }, { 5191, 0xa80f }, { 5198, 0xfeec }, { 5210, 0x8fd4 }, { 5219, 0x0f2e }, /* 0xc600 */ { 5227, 0xee1c }, { 5236, 0xe4fe }, { 5247, 0x8ecf }, { 5257, 0xf546 }, { 5266, 0xfeec }, { 5278, 0xcfc4 }, { 5287, 0x6ffe }, { 5300, 0xecfd }, { 5312, 0xd4fe }, { 5323, 0xeecf }, { 5335, 0xfd4f }, { 5347, 0xf8ec }, { 5357, 0xcfd4 }, { 5367, 0xcfee }, { 5379, 0xecfc }, { 5390, 0xdcfe }, /* 0xc700 */ { 5402, 0xeecf }, { 5414, 0xfd4f }, { 5426, 0xfeec }, { 5438, 0xcf54 }, { 5447, 0x4bee }, { 5457, 0xee01 }, { 5464, 0xf6fe }, { 5477, 0x8ecf }, { 5487, 0xb847 }, { 5495, 0xfa2c }, { 5504, 0xcf84 }, { 5512, 0x4fee }, { 5523, 0xacfc }, { 5533, 0xdefe }, { 5546, 0xeeef }, { 5559, 0xffff }, /* 0xc800 */ { 5575, 0xfaec }, { 5586, 0xcf94 }, { 5595, 0x4fee }, { 5606, 0xeefd }, { 5619, 0xccfe }, { 5630, 0xffef }, { 5645, 0xffff }, { 5661, 0xfaec }, { 5672, 0xc714 }, { 5679, 0x5fef }, { 5692, 0x001d }, }; static int uhc_1_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { if (wc >= 0xac00 && wc < 0xc8b0) { const Summary16 *summary = &uhc_1_uni2indx_pageac[(wc>>4)-0xac0]; unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' 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); used += summary->indx; c = uhc_1_2charset_main[used>>7] + uhc_1_2charset[used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/uhc_2.h000066400000000000000000001364671252300335000241170ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * Unified Hangul Code part 2 */ static const unsigned short uhc_2_2uni_main_pagea1[76] = { 0xc8a5, 0xc8d8, 0xc910, 0xc93e, 0xc971, 0xc9a5, 0xc9de, 0xca1c, 0xca47, 0xca7b, 0xcaa8, 0xcadd, 0xcb0b, 0xcb3a, 0xcb6d, 0xcb99, 0xcbc5, 0xcbf3, 0xcc25, 0xcc67, 0xcc94, 0xcccf, 0xccfe, 0xcd34, 0xcd61, 0xcd92, 0xcdc6, 0xcdf5, 0xce2c, 0xce5d, 0xce9a, 0xcecc, 0xcf02, 0xcf3b, 0xcf6d, 0xcf9e, 0xcfcc, 0xcfff, 0xd02e, 0xd064, 0xd095, 0xd0cc, 0xd105, 0xd132, 0xd16e, 0xd19b, 0xd1d0, 0xd1fd, 0xd22a, 0xd25e, 0xd28d, 0xd2c5, 0xd2fb, 0xd33e, 0xd36a, 0xd3a1, 0xd3d7, 0xd40d, 0xd438, 0xd467, 0xd49e, 0xd4c9, 0xd4fe, 0xd52e, 0xd564, 0xd59d, 0xd5ca, 0xd606, 0xd63d, 0xd677, 0xd6ab, 0xd6e2, 0xd715, 0xd74e, 0xd78d, 0xfffd, }; static const unsigned char uhc_2_2uni_pagea1[3126] = { /* 0xa1 */ 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x31, 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x0a, 0x0b, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x26, 0x27, 0x29, 0x2a, 0x2b, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x36, /* 0xa2 */ 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x14, 0x15, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x24, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2f, 0x30, 0x31, /* 0xa3 */ 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x29, 0x2b, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1d, 0x1e, 0x20, 0x21, 0x24, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2d, 0x2f, 0x32, 0x33, 0x36, /* 0xa4 */ 0x00, 0x01, 0x03, 0x05, 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2c, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, /* 0xa5 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x17, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x00, 0x01, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, /* 0xa6 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x16, 0x17, 0x19, 0x1a, 0x1b, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x26, 0x28, 0x2a, 0x2c, 0x2d, 0x2e, 0x2f, 0x32, 0x33, 0x34, 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2c, 0x2d, /* 0xa7 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x06, 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x11, 0x13, 0x14, 0x15, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, /* 0xa8 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, /* 0xa9 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x23, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x2b, 0x2c, 0x2d, 0x30, 0x31, /* 0xaa */ 0x00, 0x01, 0x05, 0x06, 0x08, 0x0a, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x15, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x21, 0x22, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x31, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3c, 0x3d, 0x3e, 0x40, 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, /* 0xab */ 0x00, 0x01, 0x02, 0x03, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x16, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x22, 0x23, 0x25, 0x26, 0x27, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x32, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x00, 0x02, 0x03, 0x04, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, /* 0xac */ 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1c, 0x1e, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x27, 0x28, 0x29, 0x2b, 0x2c, 0x2d, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00, 0x01, 0x02, 0x03, 0x04, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x29, 0x2a, 0x2b, /* 0xad */ 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0d, 0x0f, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x00, 0x01, 0x04, 0x05, 0x07, 0x08, 0x09, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x14, 0x16, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x33, /* 0xae */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08, 0x09, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x23, 0x24, 0x25, 0x27, 0x28, 0x29, 0x2b, 0x2c, 0x2d, 0x2e, 0x00, 0x01, 0x02, 0x05, 0x07, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x23, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2d, 0x2e, 0x30, 0x31, 0x32, 0x34, 0x35, 0x36, /* 0xaf */ 0x00, 0x01, 0x02, 0x03, 0x06, 0x08, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2e, 0x2f, 0x00, 0x01, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0d, 0x0f, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x29, 0x2b, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x35, 0x36, 0x38, 0x39, 0x3a, 0x3c, /* 0xb0 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1a, 0x1b, 0x1d, 0x1e, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x2a, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, /* 0xb1 */ 0x00, 0x01, 0x03, 0x04, 0x05, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x12, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2c, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x37, 0x38, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x2b, 0x2d, 0x2f, 0x30, 0x31, /* 0xb2 */ 0x00, 0x01, 0x02, 0x05, 0x06, 0x08, 0x09, 0x0a, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 0x17, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* 0xb3 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x16, 0x17, 0x19, 0x1a, 0x1b, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x26, 0x28, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x31, 0x32, 0x00, 0x02, 0x03, 0x04, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, /* 0xb4 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x09, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x18, 0x1a, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x23, 0x24, 0x25, 0x27, 0x28, 0x29, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x33, 0x34, 0x35, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x0a, 0x0b, 0x0d, 0x0e, 0x0f, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1a, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, /* 0xb5 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x11, 0x12, 0x14, 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x21, 0x23, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2d, 0x2e, 0x30, 0x31, 0x32, 0x35, 0x36, 0x00, 0x01, 0x02, 0x03, 0x06, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x12, 0x13, 0x15, 0x16, 0x17, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x22, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 0xb6 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x00, 0x01, 0x03, 0x04, 0x05, 0x07, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2c, 0x2e, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x37, 0x38, 0x39, 0x3b, /* 0xb7 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x00, 0x01, 0x02, 0x03, 0x04, 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x17, 0x19, 0x1b, 0x1c, 0x1d, 0x1e, 0x20, 0x22, 0x23, 0x24, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, /* 0xb8 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x25, 0x26, 0x27, 0x29, 0x2a, 0x2b, 0x2c, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0b, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, /* 0xb9 */ 0x00, 0x01, 0x04, 0x05, 0x07, 0x08, 0x09, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x14, 0x16, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x33, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x24, 0x25, 0x27, 0x28, 0x29, 0x2b, 0x2c, 0x2d, 0x2e, /* 0xba */ 0x00, 0x01, 0x02, 0x05, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x23, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2d, 0x2e, 0x30, 0x31, 0x34, 0x36, 0x37, 0x00, 0x01, 0x02, 0x05, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2d, 0x2e, 0x30, 0x31, 0x32, 0x34, 0x35, /* 0xbb */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x07, 0x09, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x14, 0x16, 0x17, 0x18, 0x1a, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x23, 0x27, 0x28, 0x29, 0x2b, 0x2c, 0x2f, 0x30, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, /* 0xbc */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x14, 0x15, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x24, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x30, 0x31, 0x33, 0x34, 0x35, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x09, 0x0b, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x25, 0x26, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, /* 0xbd */ 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0b, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x17, 0x18, 0x1a, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x27, 0x29, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x32, 0x33, 0x34, 0x35, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, /* 0xbe */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x25, 0x26, 0x27, 0x29, 0x2a, 0x2b, 0x2d, 0x2e, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x13, 0x14, 0x16, 0x17, 0x1a, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x23, 0x25, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, /* 0xbf */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x08, 0x09, 0x0a, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x14, 0x15, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x30, 0x31, 0x33, /* 0xc0 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08, 0x09, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x18, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x11, 0x13, 0x14, 0x15, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x20, 0x22, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2c, 0x2d, 0x2f, 0x30, 0x31, 0x33, 0x34, 0x35, /* 0xc1 */ 0x00, 0x02, 0x03, 0x06, 0x08, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x12, 0x13, 0x15, 0x16, 0x17, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x22, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, /* 0xc2 */ 0x00, 0x01, 0x03, 0x04, 0x05, 0x07, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x12, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2c, 0x2e, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x38, 0x39, 0x3b, 0x00, 0x01, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0c, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x34, 0x35, /* 0xc3 */ 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x07, 0x09, 0x0a, 0x0d, 0x0f, 0x11, 0x12, 0x13, 0x15, 0x16, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2b, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x35, 0x36, 0x38, 0x39, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0d, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x17, 0x18, 0x1a, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x27, 0x29, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x32, 0x33, /* 0xc4 */ 0x00, 0x02, 0x03, 0x04, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0f, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, 0x22, 0x23, 0x24, 0x25, 0x27, 0x28, 0x2a, 0x2b, 0x2d, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x36, 0x00, 0x01, 0x03, 0x04, 0x05, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x30, 0x31, 0x32, /* 0xc5 */ 0x00, 0x01, 0x02, 0x05, 0x06, 0x08, 0x09, 0x0a, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x15, 0x17, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x21, 0x22, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x30, 0x31, 0x33, 0x35, 0x36, 0x37, 0x38, 0x00, 0x01, 0x04, 0x05, 0x07, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x14, 0x16, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x23, 0x24, 0x25, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x30, 0x31, 0x32, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3c, 0x3d, /* 0xc6 */ 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0d, 0x0f, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, }; static int uhc_2_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0xa1 && c1 <= 0xc6)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x41 && c2 < 0x5b) || (c2 >= 0x61 && c2 < 0x7b) || (c2 >= 0x81 && c2 < 0xa1)) { unsigned int row = c1 - 0xa1; unsigned int col = c2 - (c2 >= 0x81 ? 0x4d : c2 >= 0x61 ? 0x47 : 0x41); unsigned int i = 84 * row + col; if (i < 3126) { *pwc = (ucs4_t) (uhc_2_2uni_main_pagea1[2*row+(col>=42?1:0)] + uhc_2_2uni_pagea1[i]); return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short uhc_2_2charset_main[49] = { 0xa141, 0xa18d, 0xa273, 0xa359, 0xa445, 0xa491, 0xa577, 0xa663, 0xa749, 0xa795, 0xa881, 0xa967, 0xaa4d, 0xaa99, 0xab85, 0xac6b, 0xad51, 0xad9d, 0xae89, 0xaf6f, 0xb055, 0xb141, 0xb18d, 0xb273, 0xb359, 0xb445, 0xb491, 0xb577, 0xb663, 0xb749, 0xb795, 0xb881, 0xb967, 0xba4d, 0xba99, 0xbb85, 0xbc6b, 0xbd51, 0xbd9d, 0xbe89, 0xbf6f, 0xc055, 0xc141, 0xc18d, 0xc273, 0xc359, 0xc445, 0xc491, 0xc577, }; static const unsigned char uhc_2_2charset[3126] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0xe8, 0xe9, 0xea, 0xeb, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x02, 0x03, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xea, 0xeb, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe8, 0xe9, 0xea, 0xeb, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x00, 0x01, 0x02, 0x03, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0xe8, 0xe9, 0xea, 0xeb, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x02, 0x03, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xea, 0xeb, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe8, 0xe9, 0xea, 0xeb, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x00, 0x01, 0x02, 0x03, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0xe8, 0xe9, 0xea, 0xeb, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0x01, 0x02, 0x03, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, }; static const Summary16 uhc_2_uni2indx_pagec8[251] = { /* 0xc800 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0xfee0 }, { 10, 0xcfff }, { 24, 0xeeef }, { 37, 0xfd4f }, { 49, 0xffec }, { 62, 0xcfdf }, /* 0xc900 */ { 75, 0x4f8e }, { 84, 0xfefd }, { 98, 0xefff }, { 113, 0xffef }, { 128, 0xffff }, { 144, 0xfeec }, { 156, 0xeff4 }, { 168, 0xefee }, { 181, 0xecff }, { 194, 0xd4fe }, { 205, 0xffff }, { 221, 0xffff }, { 237, 0xfa6c }, { 247, 0xc994 }, { 254, 0x4f6a }, { 263, 0xecfc }, /* 0xca00 */ { 274, 0xc4fe }, { 284, 0xfeef }, { 298, 0xfdff }, { 313, 0xffff }, { 329, 0xcfff }, { 343, 0x4fee }, { 354, 0xfefc }, { 367, 0xdfff }, { 382, 0xffef }, { 397, 0xfeff }, { 412, 0xffff }, { 428, 0xcfff }, { 442, 0x4fee }, { 453, 0xfcf5 }, { 465, 0xeffe }, { 479, 0xffef }, /* 0xcb00 */ { 494, 0xfeff }, { 509, 0xfeee }, { 522, 0xfffc }, { 536, 0xffff }, { 552, 0xecfd }, { 564, 0xdcfe }, { 576, 0xffef }, { 591, 0xfcff }, { 605, 0xffff }, { 621, 0xefff }, { 636, 0xffff }, { 652, 0xfeff }, { 667, 0xffff }, { 683, 0xffef }, { 698, 0xfd6f }, { 711, 0xffff }, /* 0xcc00 */ { 727, 0xcfff }, { 741, 0xcfee }, { 753, 0xac79 }, { 762, 0x84fe }, { 771, 0xeecf }, { 783, 0xfc4f }, { 794, 0xfeae }, { 806, 0xffde }, { 820, 0xffff }, { 836, 0xecff }, { 849, 0xc4fe }, { 859, 0xeecf }, { 871, 0xfd4f }, { 883, 0xffee }, { 897, 0xefef }, { 911, 0xfffe }, /* 0xcd00 */ { 926, 0xecfd }, { 938, 0xd4fe }, { 949, 0xeeef }, { 962, 0xfdff }, { 977, 0xffff }, { 993, 0xefff }, { 1008, 0x4fee }, { 1019, 0xfefd }, { 1033, 0xfeff }, { 1048, 0xeecf }, { 1060, 0xfd4f }, { 1072, 0xfffe }, { 1087, 0xefef }, { 1101, 0xfffe }, { 1116, 0xeeff }, { 1130, 0xd4fe }, /* 0xce00 */ { 1141, 0xeeef }, { 1154, 0xfdef }, { 1168, 0xfeec }, { 1180, 0xffd4 }, { 1192, 0xffff }, { 1208, 0x6cff }, { 1220, 0xd4fc }, { 1230, 0xeecf }, { 1242, 0xfd4f }, { 1254, 0xfeec }, { 1266, 0xcfc4 }, { 1275, 0xffff }, { 1291, 0xfffd }, { 1306, 0xffff }, { 1322, 0xe6cf }, { 1333, 0xfc4f }, /* 0xcf00 */ { 1344, 0xfeec }, { 1356, 0xefd4 }, { 1367, 0x4fee }, { 1378, 0xfefc }, { 1391, 0xffff }, { 1407, 0xeecf }, { 1419, 0xfd4f }, { 1431, 0xfeec }, { 1443, 0xefde }, { 1456, 0xffff }, { 1472, 0xfefd }, { 1486, 0xfffe }, { 1501, 0xffef }, { 1516, 0xffff }, { 1532, 0xfeec }, { 1544, 0xefd4 }, /* 0xd000 */ { 1555, 0xffee }, { 1569, 0xfefd }, { 1583, 0xdfff }, { 1598, 0xeecf }, { 1610, 0xfd4f }, { 1622, 0xfeee }, { 1635, 0xcffe }, { 1648, 0xcfee }, { 1660, 0xfffd }, { 1675, 0xffff }, { 1691, 0xeecf }, { 1703, 0xfd4f }, { 1715, 0xfcec }, { 1726, 0xcfc4 }, { 1735, 0x4fee }, { 1746, 0xfefc }, /* 0xd100 */ { 1759, 0xdfff }, { 1774, 0xffff }, { 1790, 0xffff }, { 1806, 0xfaec }, { 1817, 0xcfc4 }, { 1826, 0x4fee }, { 1837, 0xeefd }, { 1850, 0xefff }, { 1865, 0xfeef }, { 1879, 0xffff }, { 1895, 0xfeec }, { 1907, 0xebd4 }, { 1917, 0xfffe }, { 1932, 0xfeff }, { 1947, 0xffff }, { 1963, 0xfeef }, /* 0xd200 */ { 1977, 0xfd7f }, { 1991, 0xfffe }, { 2006, 0xcfff }, { 2020, 0x4fee }, { 2031, 0xfefd }, { 2045, 0xefff }, { 2060, 0xffef }, { 2075, 0xffff }, { 2091, 0xfeec }, { 2103, 0xefdc }, { 2115, 0xefee }, { 2128, 0x6cfd }, { 2139, 0xf4fa }, { 2150, 0xeeef }, { 2163, 0xffcf }, { 2177, 0xfeec }, /* 0xd300 */ { 2189, 0x8fd4 }, { 2198, 0x4fae }, { 2208, 0xecdc }, { 2218, 0xc4fe }, { 2228, 0xffcf }, { 2242, 0xffff }, { 2258, 0xffff }, { 2274, 0xcfff }, { 2288, 0x4fee }, { 2299, 0xecfc }, { 2310, 0xd4fe }, { 2321, 0xeeef }, { 2334, 0xfccf }, { 2346, 0xfefe }, { 2360, 0xcff5 }, { 2372, 0x4fee }, /* 0xd400 */ { 2383, 0xfefd }, { 2397, 0xdfff }, { 2412, 0xffff }, { 2428, 0xffff }, { 2444, 0xffee }, { 2458, 0xefff }, { 2473, 0x5fee }, { 2485, 0x6cff }, { 2497, 0xd4fa }, { 2507, 0xffef }, { 2522, 0xfdff }, { 2537, 0xffff }, { 2553, 0xefff }, { 2568, 0x6fee }, { 2580, 0xeeff }, { 2594, 0xd6fe }, /* 0xd500 */ { 2606, 0xeeef }, { 2619, 0xff4f }, { 2632, 0xffff }, { 2648, 0xcfff }, { 2662, 0x4fee }, { 2673, 0xecfd }, { 2685, 0xd4de }, { 2695, 0xeecf }, { 2707, 0xfc4f }, { 2718, 0xfffe }, { 2733, 0xffdf }, { 2748, 0xffff }, { 2764, 0xecff }, { 2777, 0xd4fa }, { 2787, 0xeecf }, { 2799, 0xfd4f }, /* 0xd600 */ { 2811, 0xfeec }, { 2823, 0xefc4 }, { 2833, 0xdfee }, { 2846, 0xecff }, { 2859, 0xd4de }, { 2869, 0xeecd }, { 2880, 0xfd7f }, { 2894, 0xffec }, { 2907, 0xcfd7 }, { 2919, 0x5fee }, { 2931, 0xeefd }, { 2944, 0xf5fe }, { 2957, 0xeecf }, { 2969, 0xfd6d }, { 2981, 0xfeee }, { 2994, 0xcfde }, /* 0xd700 */ { 3006, 0xffee }, { 3020, 0xecfd }, { 3032, 0xd4fe }, { 3043, 0xeecf }, { 3055, 0xfd6f }, { 3068, 0xfc2c }, { 3077, 0xedd4 }, { 3087, 0xcfee }, { 3099, 0xecfd }, { 3111, 0xd4fe }, { 3122, 0x000f }, }; static int uhc_2_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { if (wc >= 0xc800 && wc < 0xd7b0) { const Summary16 *summary = &uhc_2_uni2indx_pagec8[(wc>>4)-0xc80]; unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' 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); used += summary->indx; c = uhc_2_2charset_main[used>>6] + uhc_2_2charset[used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } freelan-2.0/third-party/source/libiconv-msvc/include/utf16.h000066400000000000000000000071501252300335000240460ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UTF-16 */ /* Specification: RFC 2781 */ /* Here we accept FFFE/FEFF marks as endianness indicators everywhere in the stream, not just at the beginning. (This is contrary to what RFC 2781 section 3.2 specifies, but it allows concatenation of byte sequences to work flawlessly, while disagreeing with the RFC behaviour only for strings containing U+FEFF characters, which is quite rare.) The default is big-endian. */ /* The state is 0 if big-endian, 1 if little-endian. */ static int utf16_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { state_t state = conv->istate; int count = 0; for (; n >= 2;) { ucs4_t wc = (state ? s[0] + (s[1] << 8) : (s[0] << 8) + s[1]); if (wc == 0xfeff) { } else if (wc == 0xfffe) { state ^= 1; } else if (wc >= 0xd800 && wc < 0xdc00) { if (n >= 4) { ucs4_t wc2 = (state ? s[2] + (s[3] << 8) : (s[2] << 8) + s[3]); if (!(wc2 >= 0xdc00 && wc2 < 0xe000)) goto ilseq; *pwc = 0x10000 + ((wc - 0xd800) << 10) + (wc2 - 0xdc00); conv->istate = state; return count+4; } else break; } else if (wc >= 0xdc00 && wc < 0xe000) { goto ilseq; } else { *pwc = wc; conv->istate = state; return count+2; } s += 2; n -= 2; count += 2; } conv->istate = state; return RET_TOOFEW(count); ilseq: conv->istate = state; return RET_SHIFT_ILSEQ(count); } /* We output UTF-16 in big-endian order, with byte-order mark. See RFC 2781 section 3.3 for a rationale: Some document formats mandate a BOM; the file concatenation issue is not so severe as long as the above utf16_mbtowc function is used. */ /* The state is 0 at the beginning, 1 after the BOM has been written. */ static int utf16_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc != 0xfffe && !(wc >= 0xd800 && wc < 0xe000)) { int count = 0; if (!conv->ostate) { if (n >= 2) { r[0] = 0xFE; r[1] = 0xFF; r += 2; n -= 2; count += 2; } else return RET_TOOSMALL; } if (wc < 0x10000) { if (n >= 2) { r[0] = (unsigned char) (wc >> 8); r[1] = (unsigned char) wc; conv->ostate = 1; return count+2; } else return RET_TOOSMALL; } else if (wc < 0x110000) { if (n >= 4) { ucs4_t wc1 = 0xd800 + ((wc - 0x10000) >> 10); ucs4_t wc2 = 0xdc00 + ((wc - 0x10000) & 0x3ff); r[0] = (unsigned char) (wc1 >> 8); r[1] = (unsigned char) wc1; r[2] = (unsigned char) (wc2 >> 8); r[3] = (unsigned char) wc2; conv->ostate = 1; return count+4; } else return RET_TOOSMALL; } } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/utf16be.h000066400000000000000000000044141252300335000243550ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UTF-16BE */ /* Specification: RFC 2781 */ static int utf16be_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { int count = 0; if (n >= 2) { ucs4_t wc = (s[0] << 8) + s[1]; if (wc >= 0xd800 && wc < 0xdc00) { if (n >= 4) { ucs4_t wc2 = (s[2] << 8) + s[3]; if (!(wc2 >= 0xdc00 && wc2 < 0xe000)) goto ilseq; *pwc = 0x10000 + ((wc - 0xd800) << 10) + (wc2 - 0xdc00); return count+4; } } else if (wc >= 0xdc00 && wc < 0xe000) { goto ilseq; } else { *pwc = wc; return count+2; } } return RET_TOOFEW(count); ilseq: return RET_SHIFT_ILSEQ(count); } static int utf16be_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (!(wc >= 0xd800 && wc < 0xe000)) { if (wc < 0x10000) { if (n >= 2) { r[0] = (unsigned char) (wc >> 8); r[1] = (unsigned char) wc; return 2; } else return RET_TOOSMALL; } else if (wc < 0x110000) { if (n >= 4) { ucs4_t wc1 = 0xd800 + ((wc - 0x10000) >> 10); ucs4_t wc2 = 0xdc00 + ((wc - 0x10000) & 0x3ff); r[0] = (unsigned char) (wc1 >> 8); r[1] = (unsigned char) wc1; r[2] = (unsigned char) (wc2 >> 8); r[3] = (unsigned char) wc2; return 4; } else return RET_TOOSMALL; } } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/utf16le.h000066400000000000000000000044141252300335000243670ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UTF-16LE */ /* Specification: RFC 2781 */ static int utf16le_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { int count = 0; if (n >= 2) { ucs4_t wc = s[0] + (s[1] << 8); if (wc >= 0xd800 && wc < 0xdc00) { if (n >= 4) { ucs4_t wc2 = s[2] + (s[3] << 8); if (!(wc2 >= 0xdc00 && wc2 < 0xe000)) goto ilseq; *pwc = 0x10000 + ((wc - 0xd800) << 10) + (wc2 - 0xdc00); return count+4; } } else if (wc >= 0xdc00 && wc < 0xe000) { goto ilseq; } else { *pwc = wc; return count+2; } } return RET_TOOFEW(count); ilseq: return RET_SHIFT_ILSEQ(count); } static int utf16le_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (!(wc >= 0xd800 && wc < 0xe000)) { if (wc < 0x10000) { if (n >= 2) { r[0] = (unsigned char) wc; r[1] = (unsigned char) (wc >> 8); return 2; } else return RET_TOOSMALL; } else if (wc < 0x110000) { if (n >= 4) { ucs4_t wc1 = 0xd800 + ((wc - 0x10000) >> 10); ucs4_t wc2 = 0xdc00 + ((wc - 0x10000) & 0x3ff); r[0] = (unsigned char) wc1; r[1] = (unsigned char) (wc1 >> 8); r[2] = (unsigned char) wc2; r[3] = (unsigned char) (wc2 >> 8); return 4; } else return RET_TOOSMALL; } } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/utf32.h000066400000000000000000000056551252300335000240540ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UTF-32 */ /* Specification: Unicode 3.1 Standard Annex #19 */ /* Here we accept FFFE0000/0000FEFF marks as endianness indicators everywhere in the stream, not just at the beginning. (This is contrary to what #19 D36c specifies, but it allows concatenation of byte sequences to work flawlessly, while disagreeing with #19 behaviour only for strings containing U+FEFF characters, which is quite rare.) The default is big-endian. */ /* The state is 0 if big-endian, 1 if little-endian. */ static int utf32_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { state_t state = conv->istate; int count = 0; for (; n >= 4;) { ucs4_t wc = (state ? s[0] + (s[1] << 8) + (s[2] << 16) + (s[3] << 24) : (s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3]); count += 4; if (wc == 0x0000feff) { } else if (wc == 0xfffe0000u) { state ^= 1; } else { if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000)) { *pwc = wc; conv->istate = state; return count; } else { conv->istate = state; return RET_SHIFT_ILSEQ(count); } } s += 4; n -= 4; } conv->istate = state; return RET_TOOFEW(count); } /* We output UTF-32 in big-endian order, with byte-order mark. */ /* The state is 0 at the beginning, 1 after the BOM has been written. */ static int utf32_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000)) { int count = 0; if (!conv->ostate) { if (n >= 4) { r[0] = 0x00; r[1] = 0x00; r[2] = 0xFE; r[3] = 0xFF; r += 4; n -= 4; count += 4; } else return RET_TOOSMALL; } if (wc < 0x110000) { if (n >= 4) { r[0] = 0; r[1] = (unsigned char) (wc >> 16); r[2] = (unsigned char) (wc >> 8); r[3] = (unsigned char) wc; conv->ostate = 1; return count+4; } else return RET_TOOSMALL; } } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/utf32be.h000066400000000000000000000032301252300335000243460ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UTF-32BE */ /* Specification: Unicode 3.1 Standard Annex #19 */ static int utf32be_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { if (n >= 4) { ucs4_t wc = (s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3]; if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000)) { *pwc = wc; return 4; } else return RET_ILSEQ; } return RET_TOOFEW(0); } static int utf32be_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000)) { if (n >= 4) { r[0] = 0; r[1] = (unsigned char) (wc >> 16); r[2] = (unsigned char) (wc >> 8); r[3] = (unsigned char) wc; return 4; } else return RET_TOOSMALL; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/utf32le.h000066400000000000000000000032301252300335000243600ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UTF-32LE */ /* Specification: Unicode 3.1 Standard Annex #19 */ static int utf32le_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { if (n >= 4) { ucs4_t wc = s[0] + (s[1] << 8) + (s[2] << 16) + (s[3] << 24); if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000)) { *pwc = wc; return 4; } else return RET_ILSEQ; } return RET_TOOFEW(0); } static int utf32le_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000)) { if (n >= 4) { r[0] = (unsigned char) wc; r[1] = (unsigned char) (wc >> 8); r[2] = (unsigned char) (wc >> 16); r[3] = 0; return 4; } else return RET_TOOSMALL; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/include/utf7.h000066400000000000000000000240621252300335000237670ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UTF-7 */ /* Specification: RFC 2152 (and old RFC 1641, RFC 1642) */ /* The original Base64 encoding is defined in RFC 2045. */ /* Set of direct characters: * A-Z a-z 0-9 ' ( ) , - . / : ? space tab lf cr */ static const unsigned char direct_tab[128/8] = { 0x00, 0x26, 0x00, 0x00, 0x81, 0xf3, 0xff, 0x87, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0x07, }; #define isdirect(ch) ((ch) < 128 && ((direct_tab[(ch)>>3] >> (ch & 7)) & 1)) /* Set of direct and optional direct characters: * A-Z a-z 0-9 ' ( ) , - . / : ? space tab lf cr * ! " # $ % & * ; < = > @ [ ] ^ _ ` { | } */ static const unsigned char xdirect_tab[128/8] = { 0x00, 0x26, 0x00, 0x00, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x3f, }; #define isxdirect(ch) ((ch) < 128 && ((xdirect_tab[(ch)>>3] >> (ch & 7)) & 1)) /* Set of base64 characters, extended: * A-Z a-z 0-9 + / - */ static const unsigned char xbase64_tab[128/8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0xff, 0x03, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0x07, }; #define isxbase64(ch) ((ch) < 128 && ((xbase64_tab[(ch)>>3] >> (ch & 7)) & 1)) /* * The state is structured as follows: * bit 1..0: shift * bit 7..2: data * Precise meaning: * shift data * 0 0 not inside base64 encoding * 1 0 inside base64, no pending bits * 2 XXXX00 inside base64, 4 bits remain from 2nd byte * 3 XX0000 inside base64, 2 bits remain from 3rd byte */ static int utf7_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { state_t state = conv->istate; int count = 0; /* number of input bytes already read */ if (state & 3) goto active; else goto inactive; inactive: { /* Here (state & 3) == 0 */ if (n < count+1) goto none; { unsigned char c = *s; if (isxdirect(c)) { *pwc = (ucs4_t) c; conv->istate = state; return count+1; } if (c == '+') { if (n < count+2) goto none; if (s[1] == '-') { *pwc = (ucs4_t) '+'; conv->istate = state; return count+2; } s++; count++; state = 1; goto active; } goto ilseq; } } active: { /* base64 encoding active */ unsigned int wc = 0; state_t base64state = state; unsigned int kmax = 2; /* number of payload bytes to read */ unsigned int k = 0; /* number of payload bytes already read */ unsigned int base64count = 0; /* number of base64 bytes already read */ for (;;) { unsigned char c = *s; unsigned int i; if (c >= 'A' && c <= 'Z') i = c-'A'; else if (c >= 'a' && c <= 'z') i = c-'a'+26; else if (c >= '0' && c <= '9') i = c-'0'+52; else if (c == '+') i = 62; else if (c == '/') i = 63; else { /* c terminates base64 encoding */ if (base64state & -4) goto ilseq; /* data must be 0, otherwise illegal */ if (base64count) goto ilseq; /* partial UTF-16 characters are invalid */ if (c == '-') { s++; count++; } state = 0; goto inactive; } s++; base64count++; /* read 6 bits: 0 <= i < 64 */ switch (base64state & 3) { case 1: /* inside base64, no pending bits */ base64state = (i << 2) | 0; break; case 0: /* inside base64, 6 bits remain from 1st byte */ wc = (wc << 8) | (base64state & -4) | (i >> 4); k++; base64state = ((i & 15) << 4) | 2; break; case 2: /* inside base64, 4 bits remain from 2nd byte */ wc = (wc << 8) | (base64state & -4) | (i >> 2); k++; base64state = ((i & 3) << 6) | 3; break; case 3: /* inside base64, 2 bits remain from 3rd byte */ wc = (wc << 8) | (base64state & -4) | i; k++; base64state = 1; break; } if (k == kmax) { /* UTF-16: When we see a High Surrogate, we must also decode the following Low Surrogate. */ if (kmax == 2 && (wc >= 0xd800 && wc < 0xdc00)) kmax = 4; else break; } if (n < count+base64count+1) goto none; } /* Here k = kmax > 0, hence base64count > 0. */ if ((base64state & 3) == 0) abort(); if (kmax == 4) { ucs4_t wc1 = wc >> 16; ucs4_t wc2 = wc & 0xffff; if (!(wc1 >= 0xd800 && wc1 < 0xdc00)) abort(); if (!(wc2 >= 0xdc00 && wc2 < 0xe000)) goto ilseq; *pwc = 0x10000 + ((wc1 - 0xd800) << 10) + (wc2 - 0xdc00); } else { *pwc = wc; } conv->istate = base64state; return count+base64count; } none: conv->istate = state; return RET_TOOFEW(count); ilseq: conv->istate = state; return RET_SHIFT_ILSEQ(count); } /* * The state is structured as follows: * bit 1..0: shift * bit 7..2: data * Precise meaning: * shift data * 0 0 not inside base64 encoding * 1 0 inside base64, no pending bits * 2 XX00 inside base64, 2 bits known for 2nd byte * 3 XXXX inside base64, 4 bits known for 3rd byte */ /* Define this to 1 if you want the so-called "optional direct" characters ! " # $ % & * ; < = > @ [ ] ^ _ ` { | } to be encoded. Define to 0 if you want them to be passed straight through, like the so-called "direct" characters. We set this to 1 because it's safer. */ #define UTF7_ENCODE_OPTIONAL_CHARS 1 static int utf7_wctomb (conv_t conv, unsigned char *r, ucs4_t iwc, int n) { state_t state = conv->ostate; unsigned int wc = iwc; int count = 0; if (state & 3) goto active; /*inactive:*/ { if (UTF7_ENCODE_OPTIONAL_CHARS ? isdirect(wc) : isxdirect(wc)) { r[0] = (unsigned char) wc; /*conv->ostate = state;*/ return 1; } else { *r++ = '+'; if (wc == '+') { if (n < 2) return RET_TOOSMALL; *r = '-'; /*conv->ostate = state;*/ return 2; } count = 1; state = 1; goto active; } } active: { /* base64 encoding active */ if (UTF7_ENCODE_OPTIONAL_CHARS ? isdirect(wc) : isxdirect(wc)) { /* deactivate base64 encoding */ count += ((state & 3) >= 2 ? 1 : 0) + (isxbase64(wc) ? 1 : 0) + 1; if (n < count) return RET_TOOSMALL; if ((state & 3) >= 2) { unsigned int i = state & -4; unsigned char c; if (i < 26) c = i+'A'; else if (i < 52) c = i-26+'a'; else if (i < 62) c = i-52+'0'; else if (i == 62) c = '+'; else if (i == 63) c = '/'; else abort(); *r++ = c; } if (isxbase64(wc)) *r++ = '-'; state = 0; *r++ = (unsigned char) wc; conv->ostate = state; return count; } else { unsigned int k; /* number of payload bytes to write */ if (wc < 0x10000) { k = 2; count += ((state & 3) >= 2 ? 3 : 2); } else if (wc < 0x110000) { unsigned int wc1 = 0xd800 + ((wc - 0x10000) >> 10); unsigned int wc2 = 0xdc00 + ((wc - 0x10000) & 0x3ff); wc = (wc1 << 16) | wc2; k = 4; count += ((state & 3) >= 3 ? 6 : 5); } else return RET_ILUNI; if (n < count) return RET_TOOSMALL; for (;;) { unsigned int i; unsigned char c; switch (state & 3) { case 0: /* inside base64, 6 bits known for 4th byte */ c = (state & -4) >> 2; state = 1; break; case 1: /* inside base64, no pending bits */ i = (wc >> (8 * --k)) & 0xff; c = i >> 2; state = ((i & 3) << 4) | 2; break; case 2: /* inside base64, 2 bits known for 2nd byte */ i = (wc >> (8 * --k)) & 0xff; c = (state & -4) | (i >> 4); state = ((i & 15) << 2) | 3; break; case 3: /* inside base64, 4 bits known for 3rd byte */ i = (wc >> (8 * --k)) & 0xff; c = (state & -4) | (i >> 6); state = ((i & 63) << 2) | 0; break; default: abort(); /* stupid gcc */ } if (c < 26) c = c+'A'; else if (c < 52) c = c-26+'a'; else if (c < 62) c = c-52+'0'; else if (c == 62) c = '+'; else if (c == 63) c = '/'; else abort(); *r++ = c; if ((state & 3) && (k == 0)) break; } conv->ostate = state; return count; } } } static int utf7_reset (conv_t conv, unsigned char *r, int n) { state_t state = conv->ostate; if (state & 3) { /* deactivate base64 encoding */ unsigned int count = ((state & 3) >= 2 ? 1 : 0) + 1; if (n < count) return RET_TOOSMALL; if ((state & 3) >= 2) { unsigned int i = state & -4; unsigned char c; if (i < 26) c = i+'A'; else if (i < 52) c = i-26+'a'; else if (i < 62) c = i-52+'0'; else if (i == 62) c = '+'; else if (i == 63) c = '/'; else abort(); *r++ = c; } *r++ = '-'; /* conv->ostate = 0; will be done by the caller */ return count; } else return 0; } freelan-2.0/third-party/source/libiconv-msvc/include/utf8.h000066400000000000000000000100201252300335000237550ustar00rootroot00000000000000/* * Copyright (C) 1999-2001, 2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UTF-8 */ /* Specification: RFC 3629 */ static int utf8_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = s[0]; if (c < 0x80) { *pwc = c; return 1; } else if (c < 0xc2) { return RET_ILSEQ; } else if (c < 0xe0) { if (n < 2) return RET_TOOFEW(0); if (!((s[1] ^ 0x80) < 0x40)) return RET_ILSEQ; *pwc = ((ucs4_t) (c & 0x1f) << 6) | (ucs4_t) (s[1] ^ 0x80); return 2; } else if (c < 0xf0) { if (n < 3) return RET_TOOFEW(0); if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (c >= 0xe1 || s[1] >= 0xa0))) return RET_ILSEQ; *pwc = ((ucs4_t) (c & 0x0f) << 12) | ((ucs4_t) (s[1] ^ 0x80) << 6) | (ucs4_t) (s[2] ^ 0x80); return 3; } else if (c < 0xf8 && sizeof(ucs4_t)*8 >= 32) { if (n < 4) return RET_TOOFEW(0); if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (s[3] ^ 0x80) < 0x40 && (c >= 0xf1 || s[1] >= 0x90))) return RET_ILSEQ; *pwc = ((ucs4_t) (c & 0x07) << 18) | ((ucs4_t) (s[1] ^ 0x80) << 12) | ((ucs4_t) (s[2] ^ 0x80) << 6) | (ucs4_t) (s[3] ^ 0x80); return 4; } else if (c < 0xfc && sizeof(ucs4_t)*8 >= 32) { if (n < 5) return RET_TOOFEW(0); if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40 && (c >= 0xf9 || s[1] >= 0x88))) return RET_ILSEQ; *pwc = ((ucs4_t) (c & 0x03) << 24) | ((ucs4_t) (s[1] ^ 0x80) << 18) | ((ucs4_t) (s[2] ^ 0x80) << 12) | ((ucs4_t) (s[3] ^ 0x80) << 6) | (ucs4_t) (s[4] ^ 0x80); return 5; } else if (c < 0xfe && sizeof(ucs4_t)*8 >= 32) { if (n < 6) return RET_TOOFEW(0); if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40 && (s[5] ^ 0x80) < 0x40 && (c >= 0xfd || s[1] >= 0x84))) return RET_ILSEQ; *pwc = ((ucs4_t) (c & 0x01) << 30) | ((ucs4_t) (s[1] ^ 0x80) << 24) | ((ucs4_t) (s[2] ^ 0x80) << 18) | ((ucs4_t) (s[3] ^ 0x80) << 12) | ((ucs4_t) (s[4] ^ 0x80) << 6) | (ucs4_t) (s[5] ^ 0x80); return 6; } else return RET_ILSEQ; } static int utf8_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) /* n == 0 is acceptable */ { int count; if (wc < 0x80) count = 1; else if (wc < 0x800) count = 2; else if (wc < 0x10000) count = 3; else if (wc < 0x200000) count = 4; else if (wc < 0x4000000) count = 5; else if (wc <= 0x7fffffff) count = 6; else return RET_ILUNI; if (n < count) return RET_TOOSMALL; switch (count) { /* note: code falls through cases! */ case 6: r[5] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x4000000; case 5: r[4] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x200000; case 4: r[3] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x10000; case 3: r[2] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x800; case 2: r[1] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0xc0; case 1: r[0] = wc; } return count; } freelan-2.0/third-party/source/libiconv-msvc/include/vietcomb.h000066400000000000000000000303221252300335000247060ustar00rootroot00000000000000/* * Copyright (C) 2001, 2004, 2011 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* Combining characters used in Vietnamese encodings CP1258, TCVN. */ #ifndef _VIETCOMB_H #define _VIETCOMB_H /* Relevant combining characters: 0x0300, 0x0301, 0x0303, 0x0309, 0x0323. */ /* Composition tables for each of the relevant combining characters. */ static const struct { unsigned short base; unsigned short composed; } viet_comp_table_data[] = { #define viet_comp_table0300_idx 0 #define viet_comp_table0300_len 31 { 0x0041, 0x00C0 }, { 0x0045, 0x00C8 }, { 0x0049, 0x00CC }, { 0x004E, 0x01F8 }, { 0x004F, 0x00D2 }, { 0x0055, 0x00D9 }, { 0x0057, 0x1E80 }, { 0x0059, 0x1EF2 }, { 0x0061, 0x00E0 }, { 0x0065, 0x00E8 }, { 0x0069, 0x00EC }, { 0x006E, 0x01F9 }, { 0x006F, 0x00F2 }, { 0x0075, 0x00F9 }, { 0x0077, 0x1E81 }, { 0x0079, 0x1EF3 }, { 0x00A8, 0x1FED }, { 0x00C2, 0x1EA6 }, { 0x00CA, 0x1EC0 }, { 0x00D4, 0x1ED2 }, { 0x00DC, 0x01DB }, { 0x00E2, 0x1EA7 }, { 0x00EA, 0x1EC1 }, { 0x00F4, 0x1ED3 }, { 0x00FC, 0x01DC }, { 0x0102, 0x1EB0 }, { 0x0103, 0x1EB1 }, /*{ 0x0112, 0x1E14 },*/ /*{ 0x0113, 0x1E15 },*/ /*{ 0x014C, 0x1E50 },*/ /*{ 0x014D, 0x1E51 },*/ { 0x01A0, 0x1EDC }, { 0x01A1, 0x1EDD }, { 0x01AF, 0x1EEA }, { 0x01B0, 0x1EEB }, #define viet_comp_table0301_idx (viet_comp_table0300_idx+viet_comp_table0300_len) #define viet_comp_table0301_len 63 { 0x0041, 0x00C1 }, { 0x0043, 0x0106 }, { 0x0045, 0x00C9 }, { 0x0047, 0x01F4 }, { 0x0049, 0x00CD }, { 0x004B, 0x1E30 }, { 0x004C, 0x0139 }, { 0x004D, 0x1E3E }, { 0x004E, 0x0143 }, { 0x004F, 0x00D3 }, { 0x0050, 0x1E54 }, { 0x0052, 0x0154 }, { 0x0053, 0x015A }, { 0x0055, 0x00DA }, { 0x0057, 0x1E82 }, { 0x0059, 0x00DD }, { 0x005A, 0x0179 }, { 0x0061, 0x00E1 }, { 0x0063, 0x0107 }, { 0x0065, 0x00E9 }, { 0x0067, 0x01F5 }, { 0x0069, 0x00ED }, { 0x006B, 0x1E31 }, { 0x006C, 0x013A }, { 0x006D, 0x1E3F }, { 0x006E, 0x0144 }, { 0x006F, 0x00F3 }, { 0x0070, 0x1E55 }, { 0x0072, 0x0155 }, { 0x0073, 0x015B }, { 0x0075, 0x00FA }, { 0x0077, 0x1E83 }, { 0x0079, 0x00FD }, { 0x007A, 0x017A }, { 0x00A8, 0x0385 }, /* prefer U+0385 over U+1FEE */ { 0x00C2, 0x1EA4 }, { 0x00C5, 0x01FA }, { 0x00C6, 0x01FC }, { 0x00C7, 0x1E08 }, { 0x00CA, 0x1EBE }, { 0x00CF, 0x1E2E }, { 0x00D4, 0x1ED0 }, { 0x00D5, 0x1E4C }, { 0x00D8, 0x01FE }, { 0x00DC, 0x01D7 }, { 0x00E2, 0x1EA5 }, { 0x00E5, 0x01FB }, { 0x00E6, 0x01FD }, { 0x00E7, 0x1E09 }, { 0x00EA, 0x1EBF }, { 0x00EF, 0x1E2F }, { 0x00F4, 0x1ED1 }, { 0x00F5, 0x1E4D }, { 0x00F8, 0x01FF }, { 0x00FC, 0x01D8 }, { 0x0102, 0x1EAE }, { 0x0103, 0x1EAF }, /*{ 0x0112, 0x1E16 },*/ /*{ 0x0113, 0x1E17 },*/ /*{ 0x014C, 0x1E52 },*/ /*{ 0x014D, 0x1E53 },*/ { 0x0168, 0x1E78 }, { 0x0169, 0x1E79 }, { 0x01A0, 0x1EDA }, { 0x01A1, 0x1EDB }, { 0x01AF, 0x1EE8 }, { 0x01B0, 0x1EE9 }, #define viet_comp_table0303_idx (viet_comp_table0301_idx+viet_comp_table0301_len) #define viet_comp_table0303_len 34 { 0x0041, 0x00C3 }, { 0x0045, 0x1EBC }, { 0x0049, 0x0128 }, { 0x004E, 0x00D1 }, { 0x004F, 0x00D5 }, { 0x0055, 0x0168 }, { 0x0056, 0x1E7C }, { 0x0059, 0x1EF8 }, { 0x0061, 0x00E3 }, { 0x0065, 0x1EBD }, { 0x0069, 0x0129 }, { 0x006E, 0x00F1 }, { 0x006F, 0x00F5 }, { 0x0075, 0x0169 }, { 0x0076, 0x1E7D }, { 0x0079, 0x1EF9 }, { 0x00C2, 0x1EAA }, { 0x00CA, 0x1EC4 }, { 0x00D3, 0x1E4C }, { 0x00D4, 0x1ED6 }, { 0x00D6, 0x1E4E }, { 0x00DA, 0x1E78 }, { 0x00E2, 0x1EAB }, { 0x00EA, 0x1EC5 }, { 0x00F3, 0x1E4D }, { 0x00F4, 0x1ED7 }, { 0x00F6, 0x1E4F }, { 0x00FA, 0x1E79 }, { 0x0102, 0x1EB4 }, { 0x0103, 0x1EB5 }, { 0x01A0, 0x1EE0 }, { 0x01A1, 0x1EE1 }, { 0x01AF, 0x1EEE }, { 0x01B0, 0x1EEF }, #define viet_comp_table0309_idx (viet_comp_table0303_idx+viet_comp_table0303_len) #define viet_comp_table0309_len 24 { 0x0041, 0x1EA2 }, { 0x0045, 0x1EBA }, { 0x0049, 0x1EC8 }, { 0x004F, 0x1ECE }, { 0x0055, 0x1EE6 }, { 0x0059, 0x1EF6 }, { 0x0061, 0x1EA3 }, { 0x0065, 0x1EBB }, { 0x0069, 0x1EC9 }, { 0x006F, 0x1ECF }, { 0x0075, 0x1EE7 }, { 0x0079, 0x1EF7 }, { 0x00C2, 0x1EA8 }, { 0x00CA, 0x1EC2 }, { 0x00D4, 0x1ED4 }, { 0x00E2, 0x1EA9 }, { 0x00EA, 0x1EC3 }, { 0x00F4, 0x1ED5 }, { 0x0102, 0x1EB2 }, { 0x0103, 0x1EB3 }, { 0x01A0, 0x1EDE }, { 0x01A1, 0x1EDF }, { 0x01AF, 0x1EEC }, { 0x01B0, 0x1EED }, #define viet_comp_table0323_idx (viet_comp_table0309_idx+viet_comp_table0309_len) #define viet_comp_table0323_len 50 { 0x0041, 0x1EA0 }, { 0x0042, 0x1E04 }, { 0x0044, 0x1E0C }, { 0x0045, 0x1EB8 }, { 0x0048, 0x1E24 }, { 0x0049, 0x1ECA }, { 0x004B, 0x1E32 }, { 0x004C, 0x1E36 }, { 0x004D, 0x1E42 }, { 0x004E, 0x1E46 }, { 0x004F, 0x1ECC }, { 0x0052, 0x1E5A }, { 0x0053, 0x1E62 }, { 0x0054, 0x1E6C }, { 0x0055, 0x1EE4 }, { 0x0056, 0x1E7E }, { 0x0057, 0x1E88 }, { 0x0059, 0x1EF4 }, { 0x005A, 0x1E92 }, { 0x0061, 0x1EA1 }, { 0x0062, 0x1E05 }, { 0x0064, 0x1E0D }, { 0x0065, 0x1EB9 }, { 0x0068, 0x1E25 }, { 0x0069, 0x1ECB }, { 0x006B, 0x1E33 }, { 0x006C, 0x1E37 }, { 0x006D, 0x1E43 }, { 0x006E, 0x1E47 }, { 0x006F, 0x1ECD }, { 0x0072, 0x1E5B }, { 0x0073, 0x1E63 }, { 0x0074, 0x1E6D }, { 0x0075, 0x1EE5 }, { 0x0076, 0x1E7F }, { 0x0077, 0x1E89 }, { 0x0079, 0x1EF5 }, { 0x007A, 0x1E93 }, { 0x00C2, 0x1EAC }, { 0x00CA, 0x1EC6 }, { 0x00D4, 0x1ED8 }, { 0x00E2, 0x1EAD }, { 0x00EA, 0x1EC7 }, { 0x00F4, 0x1ED9 }, { 0x0102, 0x1EB6 }, { 0x0103, 0x1EB7 }, { 0x01A0, 0x1EE2 }, { 0x01A1, 0x1EE3 }, { 0x01AF, 0x1EF0 }, { 0x01B0, 0x1EF1 }, }; static const struct { unsigned int len; unsigned int idx; } viet_comp_table[] = { { viet_comp_table0300_len, viet_comp_table0300_idx }, { viet_comp_table0301_len, viet_comp_table0301_idx }, { viet_comp_table0303_len, viet_comp_table0303_idx }, { viet_comp_table0309_len, viet_comp_table0309_idx }, { viet_comp_table0323_len, viet_comp_table0323_idx }, }; /* Decomposition table for the relevant Unicode characters. */ struct viet_decomp { unsigned short composed; unsigned int base : 12; int comb1 : 4; }; static const struct viet_decomp viet_decomp_table[] = { { 0x00B4, 0x0020, 1 }, /* compatibility decomposition - for TCVN only */ { 0x00C0, 0x0041, 0 }, { 0x00C1, 0x0041, 1 }, { 0x00C3, 0x0041, 2 }, { 0x00C8, 0x0045, 0 }, { 0x00C9, 0x0045, 1 }, { 0x00CC, 0x0049, 0 }, { 0x00CD, 0x0049, 1 }, { 0x00D1, 0x004E, 2 }, { 0x00D2, 0x004F, 0 }, { 0x00D3, 0x004F, 1 }, { 0x00D5, 0x004F, 2 }, { 0x00D9, 0x0055, 0 }, { 0x00DA, 0x0055, 1 }, { 0x00DD, 0x0059, 1 }, { 0x00E0, 0x0061, 0 }, { 0x00E1, 0x0061, 1 }, { 0x00E3, 0x0061, 2 }, { 0x00E8, 0x0065, 0 }, { 0x00E9, 0x0065, 1 }, { 0x00EC, 0x0069, 0 }, { 0x00ED, 0x0069, 1 }, { 0x00F1, 0x006E, 2 }, { 0x00F2, 0x006F, 0 }, { 0x00F3, 0x006F, 1 }, { 0x00F5, 0x006F, 2 }, { 0x00F9, 0x0075, 0 }, { 0x00FA, 0x0075, 1 }, { 0x00FD, 0x0079, 1 }, { 0x0106, 0x0043, 1 }, { 0x0107, 0x0063, 1 }, { 0x0128, 0x0049, 2 }, { 0x0129, 0x0069, 2 }, { 0x0139, 0x004C, 1 }, { 0x013A, 0x006C, 1 }, { 0x0143, 0x004E, 1 }, { 0x0144, 0x006E, 1 }, { 0x0154, 0x0052, 1 }, { 0x0155, 0x0072, 1 }, { 0x015A, 0x0053, 1 }, { 0x015B, 0x0073, 1 }, { 0x0168, 0x0055, 2 }, { 0x0169, 0x0075, 2 }, { 0x0179, 0x005A, 1 }, { 0x017A, 0x007A, 1 }, { 0x01D7, 0x00DC, 1 }, { 0x01D8, 0x00FC, 1 }, { 0x01DB, 0x00DC, 0 }, { 0x01DC, 0x00FC, 0 }, { 0x01F4, 0x0047, 1 }, { 0x01F5, 0x0067, 1 }, { 0x01F8, 0x004E, 0 }, { 0x01F9, 0x006E, 0 }, { 0x01FA, 0x00C5, 1 }, { 0x01FB, 0x00E5, 1 }, { 0x01FC, 0x00C6, 1 }, { 0x01FD, 0x00E6, 1 }, { 0x01FE, 0x00D8, 1 }, { 0x01FF, 0x00F8, 1 }, { 0x02DC, 0x0020, 2 }, /* compatibility decomposition - for TCVN only */ { 0x0385, 0x00A8, 1 }, { 0x1E04, 0x0042, 4 }, { 0x1E05, 0x0062, 4 }, { 0x1E08, 0x00C7, 1 }, { 0x1E09, 0x00E7, 1 }, { 0x1E0C, 0x0044, 4 }, { 0x1E0D, 0x0064, 4 }, { 0x1E24, 0x0048, 4 }, { 0x1E25, 0x0068, 4 }, { 0x1E2E, 0x00CF, 1 }, { 0x1E2F, 0x00EF, 1 }, { 0x1E30, 0x004B, 1 }, { 0x1E31, 0x006B, 1 }, { 0x1E32, 0x004B, 4 }, { 0x1E33, 0x006B, 4 }, { 0x1E36, 0x004C, 4 }, { 0x1E37, 0x006C, 4 }, { 0x1E3E, 0x004D, 1 }, { 0x1E3F, 0x006D, 1 }, { 0x1E42, 0x004D, 4 }, { 0x1E43, 0x006D, 4 }, { 0x1E46, 0x004E, 4 }, { 0x1E47, 0x006E, 4 }, { 0x1E4C, 0x00D3, 2 }, /*{ 0x1E4C, 0x00D5, 1 },*/ /*{ 0x1E4C, 0x004F, 1, 2 },*/ { 0x1E4D, 0x00F3, 2 }, /*{ 0x1E4D, 0x00F5, 1 },*/ /*{ 0x1E4D, 0x006F, 1, 2 },*/ { 0x1E4E, 0x00D6, 2 }, { 0x1E4F, 0x00F6, 2 }, { 0x1E54, 0x0050, 1 }, { 0x1E55, 0x0070, 1 }, { 0x1E5A, 0x0052, 4 }, { 0x1E5B, 0x0072, 4 }, { 0x1E62, 0x0053, 4 }, { 0x1E63, 0x0073, 4 }, { 0x1E6C, 0x0054, 4 }, { 0x1E6D, 0x0074, 4 }, { 0x1E78, 0x00DA, 2 }, /*{ 0x1E78, 0x0168, 1 },*/ /*{ 0x1E78, 0x0055, 1, 2 },*/ { 0x1E79, 0x00FA, 2 }, /*{ 0x1E79, 0x0169, 1 },*/ /*{ 0x1E79, 0x0075, 1, 2 },*/ { 0x1E7C, 0x0056, 2 }, { 0x1E7D, 0x0076, 2 }, { 0x1E7E, 0x0056, 4 }, { 0x1E7F, 0x0076, 4 }, { 0x1E80, 0x0057, 0 }, { 0x1E81, 0x0077, 0 }, { 0x1E82, 0x0057, 1 }, { 0x1E83, 0x0077, 1 }, { 0x1E88, 0x0057, 4 }, { 0x1E89, 0x0077, 4 }, { 0x1E92, 0x005A, 4 }, { 0x1E93, 0x007A, 4 }, { 0x1EA0, 0x0041, 4 }, { 0x1EA1, 0x0061, 4 }, { 0x1EA2, 0x0041, 3 }, { 0x1EA3, 0x0061, 3 }, { 0x1EA4, 0x00C2, 1 }, { 0x1EA5, 0x00E2, 1 }, { 0x1EA6, 0x00C2, 0 }, { 0x1EA7, 0x00E2, 0 }, { 0x1EA8, 0x00C2, 3 }, { 0x1EA9, 0x00E2, 3 }, { 0x1EAA, 0x00C2, 2 }, { 0x1EAB, 0x00E2, 2 }, { 0x1EAC, 0x00C2, 4 }, { 0x1EAD, 0x00E2, 4 }, { 0x1EAE, 0x0102, 1 }, { 0x1EAF, 0x0103, 1 }, { 0x1EB0, 0x0102, 0 }, { 0x1EB1, 0x0103, 0 }, { 0x1EB2, 0x0102, 3 }, { 0x1EB3, 0x0103, 3 }, { 0x1EB4, 0x0102, 2 }, { 0x1EB5, 0x0103, 2 }, { 0x1EB6, 0x0102, 4 }, { 0x1EB7, 0x0103, 4 }, { 0x1EB8, 0x0045, 4 }, { 0x1EB9, 0x0065, 4 }, { 0x1EBA, 0x0045, 3 }, { 0x1EBB, 0x0065, 3 }, { 0x1EBC, 0x0045, 2 }, { 0x1EBD, 0x0065, 2 }, { 0x1EBE, 0x00CA, 1 }, { 0x1EBF, 0x00EA, 1 }, { 0x1EC0, 0x00CA, 0 }, { 0x1EC1, 0x00EA, 0 }, { 0x1EC2, 0x00CA, 3 }, { 0x1EC3, 0x00EA, 3 }, { 0x1EC4, 0x00CA, 2 }, { 0x1EC5, 0x00EA, 2 }, { 0x1EC6, 0x00CA, 4 }, { 0x1EC7, 0x00EA, 4 }, { 0x1EC8, 0x0049, 3 }, { 0x1EC9, 0x0069, 3 }, { 0x1ECA, 0x0049, 4 }, { 0x1ECB, 0x0069, 4 }, { 0x1ECC, 0x004F, 4 }, { 0x1ECD, 0x006F, 4 }, { 0x1ECE, 0x004F, 3 }, { 0x1ECF, 0x006F, 3 }, { 0x1ED0, 0x00D4, 1 }, { 0x1ED1, 0x00F4, 1 }, { 0x1ED2, 0x00D4, 0 }, { 0x1ED3, 0x00F4, 0 }, { 0x1ED4, 0x00D4, 3 }, { 0x1ED5, 0x00F4, 3 }, { 0x1ED6, 0x00D4, 2 }, { 0x1ED7, 0x00F4, 2 }, { 0x1ED8, 0x00D4, 4 }, { 0x1ED9, 0x00F4, 4 }, { 0x1EDA, 0x01A0, 1 }, { 0x1EDB, 0x01A1, 1 }, { 0x1EDC, 0x01A0, 0 }, { 0x1EDD, 0x01A1, 0 }, { 0x1EDE, 0x01A0, 3 }, { 0x1EDF, 0x01A1, 3 }, { 0x1EE0, 0x01A0, 2 }, { 0x1EE1, 0x01A1, 2 }, { 0x1EE2, 0x01A0, 4 }, { 0x1EE3, 0x01A1, 4 }, { 0x1EE4, 0x0055, 4 }, { 0x1EE5, 0x0075, 4 }, { 0x1EE6, 0x0055, 3 }, { 0x1EE7, 0x0075, 3 }, { 0x1EE8, 0x01AF, 1 }, { 0x1EE9, 0x01B0, 1 }, { 0x1EEA, 0x01AF, 0 }, { 0x1EEB, 0x01B0, 0 }, { 0x1EEC, 0x01AF, 3 }, { 0x1EED, 0x01B0, 3 }, { 0x1EEE, 0x01AF, 2 }, { 0x1EEF, 0x01B0, 2 }, { 0x1EF0, 0x01AF, 4 }, { 0x1EF1, 0x01B0, 4 }, { 0x1EF2, 0x0059, 0 }, { 0x1EF3, 0x0079, 0 }, { 0x1EF4, 0x0059, 4 }, { 0x1EF5, 0x0079, 4 }, { 0x1EF6, 0x0059, 3 }, { 0x1EF7, 0x0079, 3 }, { 0x1EF8, 0x0059, 2 }, { 0x1EF9, 0x0079, 2 }, { 0x1FED, 0x00A8, 0 }, { 0x1FEE, 0x00A8, 1 }, /* U+1FEE => U+0385 => U+00A8 U+0301 */ }; #endif /* _VIETCOMB_H */ freelan-2.0/third-party/source/libiconv-msvc/include/viscii.h000066400000000000000000000140571252300335000243730ustar00rootroot00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * VISCII1.1-1 */ /* Specification: RFC 1456 */ static const unsigned short viscii_2uni_1[32] = { /* 0x00 */ 0x0000, 0x0001, 0x1eb2, 0x0003, 0x0004, 0x1eb4, 0x1eaa, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, /* 0x10 */ 0x0010, 0x0011, 0x0012, 0x0013, 0x1ef6, 0x0015, 0x0016, 0x0017, 0x0018, 0x1ef8, 0x001a, 0x001b, 0x001c, 0x001d, 0x1ef4, 0x001f, }; static const unsigned short viscii_2uni_2[128] = { /* 0x80 */ 0x1ea0, 0x1eae, 0x1eb0, 0x1eb6, 0x1ea4, 0x1ea6, 0x1ea8, 0x1eac, 0x1ebc, 0x1eb8, 0x1ebe, 0x1ec0, 0x1ec2, 0x1ec4, 0x1ec6, 0x1ed0, /* 0x90 */ 0x1ed2, 0x1ed4, 0x1ed6, 0x1ed8, 0x1ee2, 0x1eda, 0x1edc, 0x1ede, 0x1eca, 0x1ece, 0x1ecc, 0x1ec8, 0x1ee6, 0x0168, 0x1ee4, 0x1ef2, /* 0xa0 */ 0x00d5, 0x1eaf, 0x1eb1, 0x1eb7, 0x1ea5, 0x1ea7, 0x1ea9, 0x1ead, 0x1ebd, 0x1eb9, 0x1ebf, 0x1ec1, 0x1ec3, 0x1ec5, 0x1ec7, 0x1ed1, /* 0xb0 */ 0x1ed3, 0x1ed5, 0x1ed7, 0x1ee0, 0x01a0, 0x1ed9, 0x1edd, 0x1edf, 0x1ecb, 0x1ef0, 0x1ee8, 0x1eea, 0x1eec, 0x01a1, 0x1edb, 0x01af, /* 0xc0 */ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x1ea2, 0x0102, 0x1eb3, 0x1eb5, 0x00c8, 0x00c9, 0x00ca, 0x1eba, 0x00cc, 0x00cd, 0x0128, 0x1ef3, /* 0xd0 */ 0x0110, 0x1ee9, 0x00d2, 0x00d3, 0x00d4, 0x1ea1, 0x1ef7, 0x1eeb, 0x1eed, 0x00d9, 0x00da, 0x1ef9, 0x1ef5, 0x00dd, 0x1ee1, 0x01b0, /* 0xe0 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x1ea3, 0x0103, 0x1eef, 0x1eab, 0x00e8, 0x00e9, 0x00ea, 0x1ebb, 0x00ec, 0x00ed, 0x0129, 0x1ec9, /* 0xf0 */ 0x0111, 0x1ef1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x1ecf, 0x1ecd, 0x1ee5, 0x00f9, 0x00fa, 0x0169, 0x1ee7, 0x00fd, 0x1ee3, 0x1eee, }; static int viscii_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x20) *pwc = (ucs4_t) viscii_2uni_1[c]; else if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) viscii_2uni_2[c-0x80]; return 1; } static const unsigned char viscii_page00[64+184] = { 0xc0, 0xc1, 0xc2, 0xc3, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0xc8, 0xc9, 0xca, 0x00, 0xcc, 0xcd, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0xd2, 0xd3, 0xd4, 0xa0, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0xd9, 0xda, 0x00, 0x00, 0xdd, 0x00, 0x00, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0xe3, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0x00, 0xec, 0xed, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0xf2, 0xf3, 0xf4, 0xf5, 0x00, 0x00, /* 0xf0-0xf7 */ 0x00, 0xf9, 0xfa, 0x00, 0x00, 0xfd, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0x00, 0x00, 0xc5, 0xe5, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0xce, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x9d, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xb4, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, /* 0xa8-0xaf */ 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ }; static const unsigned char viscii_page1e[96] = { 0x80, 0xd5, 0xc4, 0xe4, 0x84, 0xa4, 0x85, 0xa5, /* 0xa0-0xa7 */ 0x86, 0xa6, 0x06, 0xe7, 0x87, 0xa7, 0x81, 0xa1, /* 0xa8-0xaf */ 0x82, 0xa2, 0x02, 0xc6, 0x05, 0xc7, 0x83, 0xa3, /* 0xb0-0xb7 */ 0x89, 0xa9, 0xcb, 0xeb, 0x88, 0xa8, 0x8a, 0xaa, /* 0xb8-0xbf */ 0x8b, 0xab, 0x8c, 0xac, 0x8d, 0xad, 0x8e, 0xae, /* 0xc0-0xc7 */ 0x9b, 0xef, 0x98, 0xb8, 0x9a, 0xf7, 0x99, 0xf6, /* 0xc8-0xcf */ 0x8f, 0xaf, 0x90, 0xb0, 0x91, 0xb1, 0x92, 0xb2, /* 0xd0-0xd7 */ 0x93, 0xb5, 0x95, 0xbe, 0x96, 0xb6, 0x97, 0xb7, /* 0xd8-0xdf */ 0xb3, 0xde, 0x94, 0xfe, 0x9e, 0xf8, 0x9c, 0xfc, /* 0xe0-0xe7 */ 0xba, 0xd1, 0xbb, 0xd7, 0xbc, 0xd8, 0xff, 0xe6, /* 0xe8-0xef */ 0xb9, 0xf1, 0x9f, 0xcf, 0x1e, 0xdc, 0x14, 0xd6, /* 0xf0-0xf7 */ 0x19, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ }; static int viscii_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080 && (wc >= 0x0020 || (0x42100064 & (1 << wc)) == 0)) { *r = wc; return 1; } else if (wc >= 0x00c0 && wc < 0x01b8) c = viscii_page00[wc-0x00c0]; else if (wc >= 0x1ea0 && wc < 0x1f00) c = viscii_page1e[wc-0x1ea0]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } freelan-2.0/third-party/source/libiconv-msvc/libiconv.sln000066400000000000000000000041601252300335000236260ustar00rootroot00000000000000 Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 VisualStudioVersion = 12.0.20827.3 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libiconv", "libiconv\libiconv.vcxproj", "{1704EA01-6B21-4362-9F1F-44D25CF2E0D7}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 DebugStatic|Win32 = DebugStatic|Win32 DebugStatic|x64 = DebugStatic|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 ReleaseStatic|Win32 = ReleaseStatic|Win32 ReleaseStatic|x64 = ReleaseStatic|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {1704EA01-6B21-4362-9F1F-44D25CF2E0D7}.Debug|Win32.ActiveCfg = Debug|Win32 {1704EA01-6B21-4362-9F1F-44D25CF2E0D7}.Debug|Win32.Build.0 = Debug|Win32 {1704EA01-6B21-4362-9F1F-44D25CF2E0D7}.Debug|x64.ActiveCfg = Debug|x64 {1704EA01-6B21-4362-9F1F-44D25CF2E0D7}.Debug|x64.Build.0 = Debug|x64 {1704EA01-6B21-4362-9F1F-44D25CF2E0D7}.DebugStatic|Win32.ActiveCfg = DebugStatic|Win32 {1704EA01-6B21-4362-9F1F-44D25CF2E0D7}.DebugStatic|Win32.Build.0 = DebugStatic|Win32 {1704EA01-6B21-4362-9F1F-44D25CF2E0D7}.DebugStatic|x64.ActiveCfg = DebugStatic|x64 {1704EA01-6B21-4362-9F1F-44D25CF2E0D7}.DebugStatic|x64.Build.0 = DebugStatic|x64 {1704EA01-6B21-4362-9F1F-44D25CF2E0D7}.Release|Win32.ActiveCfg = Release|Win32 {1704EA01-6B21-4362-9F1F-44D25CF2E0D7}.Release|Win32.Build.0 = Release|Win32 {1704EA01-6B21-4362-9F1F-44D25CF2E0D7}.Release|x64.ActiveCfg = Release|x64 {1704EA01-6B21-4362-9F1F-44D25CF2E0D7}.Release|x64.Build.0 = Release|x64 {1704EA01-6B21-4362-9F1F-44D25CF2E0D7}.ReleaseStatic|Win32.ActiveCfg = ReleaseStatic|Win32 {1704EA01-6B21-4362-9F1F-44D25CF2E0D7}.ReleaseStatic|Win32.Build.0 = ReleaseStatic|Win32 {1704EA01-6B21-4362-9F1F-44D25CF2E0D7}.ReleaseStatic|x64.ActiveCfg = ReleaseStatic|x64 {1704EA01-6B21-4362-9F1F-44D25CF2E0D7}.ReleaseStatic|x64.Build.0 = ReleaseStatic|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal freelan-2.0/third-party/source/libiconv-msvc/libiconv/000077500000000000000000000000001252300335000231075ustar00rootroot00000000000000freelan-2.0/third-party/source/libiconv-msvc/libiconv/iconv.c000066400000000000000000000412011252300335000243670ustar00rootroot00000000000000/* * Copyright (C) 1999-2008, 2011 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include "config.h" #include "localcharset.h" #ifdef __CYGWIN__ #include #endif #if ENABLE_EXTRA /* * Consider all system dependent encodings, for any system, * and the extra encodings. */ #define USE_AIX #define USE_OSF1 #define USE_DOS #define USE_EXTRA #else /* * Consider those system dependent encodings that are needed for the * current system. */ #ifdef _AIX #define USE_AIX #endif #if defined(__osf__) || defined(VMS) #define USE_OSF1 #endif #if defined(__DJGPP__) || (defined(_WIN32) && (defined(_MSC_VER) || defined(__MINGW32__))) #define USE_DOS #endif #endif /* * Data type for general conversion loop. */ struct loop_funcs { size_t (*loop_convert) (iconv_t icd, const char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft); size_t (*loop_reset) (iconv_t icd, char* * outbuf, size_t *outbytesleft); }; /* * Converters. */ #include "converters.h" /* * Transliteration tables. */ #include "cjk_variants.h" #include "translit.h" /* * Table of all supported encodings. */ struct encoding { struct mbtowc_funcs ifuncs; /* conversion multibyte -> unicode */ struct wctomb_funcs ofuncs; /* conversion unicode -> multibyte */ int oflags; /* flags for unicode -> multibyte conversion */ }; #define DEFALIAS(xxx_alias,xxx) /* nothing */ enum { #define DEFENCODING(xxx_names,xxx,xxx_ifuncs1,xxx_ifuncs2,xxx_ofuncs1,xxx_ofuncs2) \ ei_##xxx , #include "encodings.def" #ifdef USE_AIX # include "encodings_aix.def" #endif #ifdef USE_OSF1 # include "encodings_osf1.def" #endif #ifdef USE_DOS # include "encodings_dos.def" #endif #ifdef USE_EXTRA # include "encodings_extra.def" #endif #include "encodings_local.def" #undef DEFENCODING ei_for_broken_compilers_that_dont_like_trailing_commas }; #include "flags.h" static struct encoding const all_encodings[] = { #define DEFENCODING(xxx_names,xxx,xxx_ifuncs1,xxx_ifuncs2,xxx_ofuncs1,xxx_ofuncs2) \ { xxx_ifuncs1,xxx_ifuncs2, xxx_ofuncs1,xxx_ofuncs2, ei_##xxx##_oflags }, #include "encodings.def" #ifdef USE_AIX # include "encodings_aix.def" #endif #ifdef USE_OSF1 # include "encodings_osf1.def" #endif #ifdef USE_DOS # include "encodings_dos.def" #endif #ifdef USE_EXTRA # include "encodings_extra.def" #endif #undef DEFENCODING #define DEFENCODING(xxx_names,xxx,xxx_ifuncs1,xxx_ifuncs2,xxx_ofuncs1,xxx_ofuncs2) \ { xxx_ifuncs1,xxx_ifuncs2, xxx_ofuncs1,xxx_ofuncs2, 0 }, #include "encodings_local.def" #undef DEFENCODING }; #undef DEFALIAS /* * Conversion loops. */ #include "loops.h" /* * Alias lookup function. * Defines * struct alias { int name; unsigned int encoding_index; }; * const struct alias * aliases_lookup (const char *str, unsigned int len); * #define MAX_WORD_LENGTH ... */ #if defined _AIX # include "aliases_sysaix.h" #elif defined hpux || defined __hpux # include "aliases_syshpux.h" #elif defined __osf__ # include "aliases_sysosf1.h" #elif defined __sun # include "aliases_syssolaris.h" #else # include "aliases.h" #endif /* * System dependent alias lookup function. * Defines * const struct alias * aliases2_lookup (const char *str); */ #if defined(USE_AIX) || defined(USE_OSF1) || defined(USE_DOS) || defined(USE_EXTRA) /* || ... */ struct stringpool2_t { #define S(tag,name,encoding_index) char stringpool_##tag[sizeof(name)]; #include "aliases2.h" #undef S }; static const struct stringpool2_t stringpool2_contents = { #define S(tag,name,encoding_index) name, #include "aliases2.h" #undef S }; #define stringpool2 ((const char *) &stringpool2_contents) static const struct alias sysdep_aliases[] = { #define S(tag,name,encoding_index) { (int)(long)&((struct stringpool2_t *)0)->stringpool_##tag, encoding_index }, #include "aliases2.h" #undef S }; #ifdef __GNUC__ __inline #endif const struct alias * aliases2_lookup (register const char *str) { const struct alias * ptr; unsigned int count; for (ptr = sysdep_aliases, count = sizeof(sysdep_aliases)/sizeof(sysdep_aliases[0]); count > 0; ptr++, count--) if (!strcmp(str, stringpool2 + ptr->name)) return ptr; return NULL; } #else #define aliases2_lookup(str) NULL #define stringpool2 NULL #endif #if 0 /* Like !strcasecmp, except that the both strings can be assumed to be ASCII and the first string can be assumed to be in uppercase. */ static int strequal (const char* str1, const char* str2) { unsigned char c1; unsigned char c2; for (;;) { c1 = * (unsigned char *) str1++; c2 = * (unsigned char *) str2++; if (c1 == 0) break; if (c2 >= 'a' && c2 <= 'z') c2 -= 'a'-'A'; if (c1 != c2) break; } return (c1 == c2); } #endif iconv_t iconv_open (const char* tocode, const char* fromcode) { struct conv_struct * cd; unsigned int from_index; int from_wchar; unsigned int to_index; int to_wchar; int transliterate; int discard_ilseq; #include "iconv_open1.h" cd = (struct conv_struct *) malloc(from_wchar != to_wchar ? sizeof(struct wchar_conv_struct) : sizeof(struct conv_struct)); if (cd == NULL) { errno = ENOMEM; return (iconv_t)(-1); } #include "iconv_open2.h" return (iconv_t)cd; invalid: errno = EINVAL; return (iconv_t)(-1); } ///////////////////////// 삭제 / DELETE / УДАЛИТЬ /////////////////////// //size_t iconv (iconv_t icd, // ICONV_CONST char* * inbuf, size_t *inbytesleft, // char* * outbuf, size_t *outbytesleft) ///////////////////////// 추가 / ADD / ДОВАВЛЯТЬ ////////////////////// size_t iconv (iconv_t icd, const char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft) //////////////////////////////////////////////////////////////////////////////// { conv_t cd = (conv_t) icd; if (inbuf == NULL || *inbuf == NULL) return cd->lfuncs.loop_reset(icd,outbuf,outbytesleft); else return cd->lfuncs.loop_convert(icd, (const char* *)inbuf,inbytesleft, outbuf,outbytesleft); } int iconv_close (iconv_t icd) { conv_t cd = (conv_t) icd; free(cd); return 0; } #ifndef LIBICONV_PLUG /* * Verify that a 'struct conv_struct' and a 'struct wchar_conv_struct' each * fit in an iconv_allocation_t. * If this verification fails, iconv_allocation_t must be made larger and * the major version in LIBICONV_VERSION_INFO must be bumped. * Currently 'struct conv_struct' has 21 integer/pointer fields, and * 'struct wchar_conv_struct' additionally has an 'mbstate_t' field. */ typedef int verify_size_1[2 * (sizeof (struct conv_struct) <= sizeof (iconv_allocation_t)) - 1]; typedef int verify_size_2[2 * (sizeof (struct wchar_conv_struct) <= sizeof (iconv_allocation_t)) - 1]; int iconv_open_into (const char* tocode, const char* fromcode, iconv_allocation_t* resultp) { struct conv_struct * cd; unsigned int from_index; int from_wchar; unsigned int to_index; int to_wchar; int transliterate; int discard_ilseq; #include "iconv_open1.h" cd = (struct conv_struct *) resultp; #include "iconv_open2.h" return 0; invalid: errno = EINVAL; return -1; } int iconvctl (iconv_t icd, int request, void* argument) { conv_t cd = (conv_t) icd; switch (request) { case ICONV_TRIVIALP: *(int *)argument = ((cd->lfuncs.loop_convert == unicode_loop_convert && cd->iindex == cd->oindex) || cd->lfuncs.loop_convert == wchar_id_loop_convert ? 1 : 0); return 0; case ICONV_GET_TRANSLITERATE: *(int *)argument = cd->transliterate; return 0; case ICONV_SET_TRANSLITERATE: cd->transliterate = (*(const int *)argument ? 1 : 0); return 0; case ICONV_GET_DISCARD_ILSEQ: *(int *)argument = cd->discard_ilseq; return 0; case ICONV_SET_DISCARD_ILSEQ: cd->discard_ilseq = (*(const int *)argument ? 1 : 0); return 0; case ICONV_SET_HOOKS: if (argument != NULL) { cd->hooks = *(const struct iconv_hooks *)argument; } else { cd->hooks.uc_hook = NULL; cd->hooks.wc_hook = NULL; cd->hooks.data = NULL; } return 0; case ICONV_SET_FALLBACKS: if (argument != NULL) { cd->fallbacks = *(const struct iconv_fallbacks *)argument; } else { cd->fallbacks.mb_to_uc_fallback = NULL; cd->fallbacks.uc_to_mb_fallback = NULL; cd->fallbacks.mb_to_wc_fallback = NULL; cd->fallbacks.wc_to_mb_fallback = NULL; cd->fallbacks.data = NULL; } return 0; default: errno = EINVAL; return -1; } } /* An alias after its name has been converted from 'int' to 'const char*'. */ struct nalias { const char* name; unsigned int encoding_index; }; static int compare_by_index (const void * arg1, const void * arg2) { const struct nalias * alias1 = (const struct nalias *) arg1; const struct nalias * alias2 = (const struct nalias *) arg2; return (int)alias1->encoding_index - (int)alias2->encoding_index; } static int compare_by_name (const void * arg1, const void * arg2) { const char * name1 = *(const char **)arg1; const char * name2 = *(const char **)arg2; /* Compare alphabetically, but put "CS" names at the end. */ int sign = strcmp(name1,name2); if (sign != 0) { sign = ((name1[0]=='C' && name1[1]=='S') - (name2[0]=='C' && name2[1]=='S')) * 4 + (sign >= 0 ? 1 : -1); } return sign; } void iconvlist (int (*do_one) (unsigned int namescount, const char * const * names, void* data), void* data) { #define aliascount1 sizeof(aliases)/sizeof(aliases[0]) #ifndef aliases2_lookup #define aliascount2 sizeof(sysdep_aliases)/sizeof(sysdep_aliases[0]) #else #define aliascount2 0 #endif #define aliascount (aliascount1+aliascount2) struct nalias aliasbuf[aliascount]; const char * namesbuf[aliascount]; size_t num_aliases; { /* Put all existing aliases into a buffer. */ size_t i; size_t j; j = 0; for (i = 0; i < aliascount1; i++) { const struct alias * p = &aliases[i]; if (p->name >= 0 && p->encoding_index != ei_local_char && p->encoding_index != ei_local_wchar_t) { aliasbuf[j].name = stringpool + p->name; aliasbuf[j].encoding_index = p->encoding_index; j++; } } #ifndef aliases2_lookup for (i = 0; i < aliascount2; i++) { aliasbuf[j].name = stringpool2 + sysdep_aliases[i].name; aliasbuf[j].encoding_index = sysdep_aliases[i].encoding_index; j++; } #endif num_aliases = j; } /* Sort by encoding_index. */ if (num_aliases > 1) qsort(aliasbuf, num_aliases, sizeof(struct nalias), compare_by_index); { /* Process all aliases with the same encoding_index together. */ size_t j; j = 0; while (j < num_aliases) { unsigned int ei = aliasbuf[j].encoding_index; size_t i = 0; do namesbuf[i++] = aliasbuf[j++].name; while (j < num_aliases && aliasbuf[j].encoding_index == ei); if (i > 1) qsort(namesbuf, i, sizeof(const char *), compare_by_name); /* Call the callback. */ if (do_one(i,namesbuf,data)) break; } } #undef aliascount #undef aliascount2 #undef aliascount1 } /* * Table of canonical names of encodings. * Instead of strings, it contains offsets into stringpool and stringpool2. */ static const unsigned short all_canonical[] = { #if defined _AIX # include "canonical_sysaix.h" #elif defined hpux || defined __hpux # include "canonical_syshpux.h" #elif defined __osf__ # include "canonical_sysosf1.h" #elif defined __sun # include "canonical_syssolaris.h" #else # include "canonical.h" #endif #ifdef USE_AIX # if defined _AIX # include "canonical_aix_sysaix.h" # else # include "canonical_aix.h" # endif #endif #ifdef USE_OSF1 # if defined __osf__ # include "canonical_osf1_sysosf1.h" # else # include "canonical_osf1.h" # endif #endif #ifdef USE_DOS # include "canonical_dos.h" #endif #ifdef USE_EXTRA # include "canonical_extra.h" #endif #if defined _AIX # include "canonical_local_sysaix.h" #elif defined hpux || defined __hpux # include "canonical_local_syshpux.h" #elif defined __osf__ # include "canonical_local_sysosf1.h" #elif defined __sun # include "canonical_local_syssolaris.h" #else # include "canonical_local.h" #endif }; const char * iconv_canonicalize (const char * name) { const char* code; char buf[MAX_WORD_LENGTH+10+1]; const char* cp; char* bp; const struct alias * ap; unsigned int count; unsigned int index; const char* pool; /* Before calling aliases_lookup, convert the input string to upper case, * and check whether it's entirely ASCII (we call gperf with option "-7" * to achieve a smaller table) and non-empty. If it's not entirely ASCII, * or if it's too long, it is not a valid encoding name. */ for (code = name;;) { /* Search code in the table. */ for (cp = code, bp = buf, count = MAX_WORD_LENGTH+10+1; ; cp++, bp++) { unsigned char c = * (unsigned char *) cp; if (c >= 0x80) goto invalid; if (c >= 'a' && c <= 'z') c -= 'a'-'A'; *bp = c; if (c == '\0') break; if (--count == 0) goto invalid; } for (;;) { if (bp-buf >= 10 && memcmp(bp-10,"//TRANSLIT",10)==0) { bp -= 10; *bp = '\0'; continue; } if (bp-buf >= 8 && memcmp(bp-8,"//IGNORE",8)==0) { bp -= 8; *bp = '\0'; continue; } break; } if (buf[0] == '\0') { code = locale_charset(); /* Avoid an endless loop that could occur when using an older version of localcharset.c. */ if (code[0] == '\0') goto invalid; continue; } pool = stringpool; ap = aliases_lookup(buf,bp-buf); if (ap == NULL) { pool = stringpool2; ap = aliases2_lookup(buf); if (ap == NULL) goto invalid; } if (ap->encoding_index == ei_local_char) { code = locale_charset(); /* Avoid an endless loop that could occur when using an older version of localcharset.c. */ if (code[0] == '\0') goto invalid; continue; } if (ap->encoding_index == ei_local_wchar_t) { /* On systems which define __STDC_ISO_10646__, wchar_t is Unicode. This is also the case on native Woe32 systems and Cygwin >= 1.7, where we know that it is UTF-16. */ #if ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || (defined __CYGWIN__ && CYGWIN_VERSION_DLL_MAJOR >= 1007) if (sizeof(wchar_t) == 4) { index = ei_ucs4internal; break; } if (sizeof(wchar_t) == 2) { # if WORDS_LITTLEENDIAN index = ei_utf16le; # else index = ei_utf16be; # endif break; } #elif __STDC_ISO_10646__ if (sizeof(wchar_t) == 4) { index = ei_ucs4internal; break; } if (sizeof(wchar_t) == 2) { index = ei_ucs2internal; break; } if (sizeof(wchar_t) == 1) { index = ei_iso8859_1; break; } #endif } index = ap->encoding_index; break; } return all_canonical[index] + pool; invalid: return name; } int _libiconv_version = _LIBICONV_VERSION; #if defined __FreeBSD__ && !defined __gnu_freebsd__ /* GNU libiconv is the native FreeBSD iconv implementation since 2002. It wants to define the symbols 'iconv_open', 'iconv', 'iconv_close'. */ #define strong_alias(name, aliasname) _strong_alias(name, aliasname) #define _strong_alias(name, aliasname) \ extern __typeof (name) aliasname __attribute__ ((alias (#name))); #undef iconv_open #undef iconv #undef iconv_close strong_alias (libiconv_open, iconv_open) strong_alias (libiconv, iconv) strong_alias (libiconv_close, iconv_close) #endif #endif freelan-2.0/third-party/source/libiconv-msvc/libiconv/libiconv.rc000066400000000000000000000100201252300335000252330ustar00rootroot00000000000000/* Resources for iconv.dll */ #include <winver.h> ///////////////////////// / ADD / /", ////////////////////// #define PACKAGE_VERSION_MAJOR 1 #define PACKAGE_VERSION_MINOR 14 #define PACKAGE_VERSION_SUBMINOR 0 #define PACKAGE_VERSION_STRING "1.14" //////////////////////////////////////////////////////////////////////////////// VS_VERSION_INFO VERSIONINFO FILEVERSION PACKAGE_VERSION_MAJOR,PACKAGE_VERSION_MINOR,PACKAGE_VERSION_SUBMINOR,0 PRODUCTVERSION PACKAGE_VERSION_MAJOR,PACKAGE_VERSION_MINOR,PACKAGE_VERSION_SUBMINOR,0 FILEFLAGSMASK 0x3fL /* VS_FFI_FILEFLAGSMASK */ #ifdef _DEBUG FILEFLAGS 0x1L /* VS_FF_DEBUG */ #else FILEFLAGS 0x0L #endif FILEOS 0x10004L /* VOS_DOS_WINDOWS32 */ FILETYPE 0x2L /* VFT_DLL */ FILESUBTYPE 0x0L /* VFT2_UNKNOWN */ BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "04090000" /* Lang = US English, Charset = ASCII */ BEGIN VALUE "Comments", "This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License. You should have received a copy of the GNU Library 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\0" VALUE "CompanyName", "Free Software Foundation\0" VALUE "FileDescription", "LGPLed libiconv for Windows NT/2000/XP/Vista/7 and Windows 95/98/ME\0" VALUE "FileVersion", PACKAGE_VERSION_STRING "\0" VALUE "InternalName", "iconv.dll\0" VALUE "LegalCopyright", "Copyright (C) 1999-2009\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "iconv.dll\0" VALUE "ProductName", "libiconv: character set conversion library\0" VALUE "ProductVersion", PACKAGE_VERSION_STRING "\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x0409, 0 /* US English, ASCII */ END END freelan-2.0/third-party/source/libiconv-msvc/libiconv/libiconv.vcxproj000066400000000000000000000355131252300335000263400ustar00rootroot00000000000000 DebugStatic Win32 DebugStatic x64 Debug Win32 Debug x64 ReleaseStatic Win32 ReleaseStatic x64 Release Win32 Release x64 {1704EA01-6B21-4362-9F1F-44D25CF2E0D7} Win32Proj libiconv DynamicLibrary true Unicode v120 StaticLibrary true Unicode v120 DynamicLibrary true Unicode v120 StaticLibrary true Unicode v120 DynamicLibrary false true Unicode v120 DynamicLibrary false true Unicode v120 StaticLibrary v120 StaticLibrary v120 true $(SolutionDir)$(Configuration)_$(Platform)\ $(SolutionDir)obj\$(ProjectName)\$(Configuration)_$(Platform)\ ..\include;$(IncludePath) .dll $(ProjectName)D true $(SolutionDir)$(Configuration)_$(Platform)\ $(SolutionDir)obj\$(ProjectName)\$(Configuration)_$(Platform)\ ..\include;$(IncludePath) .lib $(ProjectName)StaticD true $(SolutionDir)$(Configuration)_$(Platform)\ $(SolutionDir)obj\$(ProjectName)\$(Configuration)_$(Platform)\ ..\include;$(IncludePath) .dll $(ProjectName)D true $(SolutionDir)$(Configuration)_$(Platform)\ $(SolutionDir)obj\$(ProjectName)\$(Configuration)_$(Platform)\ ..\include;$(IncludePath) .lib $(ProjectName)StaticD false $(SolutionDir)$(Configuration)_$(Platform)\ $(SolutionDir)obj\$(ProjectName)\$(Configuration)_$(Platform)\ ..\include;$(IncludePath) false $(SolutionDir)$(Configuration)_$(Platform)\ $(SolutionDir)obj\$(ProjectName)\$(Configuration)_$(Platform)\ ..\include;$(IncludePath) $(SolutionDir)$(Configuration)_$(Platform)\ $(SolutionDir)obj\$(ProjectName)\$(Configuration)_$(Platform)\ .lib ..\include;$(IncludePath) $(ProjectName)Static $(SolutionDir)$(Configuration)_$(Platform)\ $(SolutionDir)obj\$(ProjectName)\$(Configuration)_$(Platform)\ .lib ..\include;$(IncludePath) $(ProjectName)Static NotUsing Level3 Disabled WIN32;_DEBUG;_WINDOWS;_USRDLL;BUILDING_LIBICONV;BUILDING_LIBCHARSET;LIBICONV_EXPORTS;%(PreprocessorDefinitions) true MultiThreadedDebug Windows true NotUsing Level3 Disabled WIN32;_DEBUG;_WINDOWS;_LIB;USING_STATIC_LIBICONV;%(PreprocessorDefinitions) true Windows true MachineX86 NotUsing Level3 Disabled _WIN64;_DEBUG;_WINDOWS;_USRDLL;BUILDING_LIBICONV;BUILDING_LIBCHARSET;LIBICONV_EXPORTS;%(PreprocessorDefinitions) true MultiThreadedDebug Windows true MachineX64 NotUsing Level3 Disabled _WIN64;_DEBUG;_WINDOWS;_LIB;USING_STATIC_LIBICONV;%(PreprocessorDefinitions) true Windows true MachineX64 Level3 NotUsing MaxSpeed true true WIN32;NDEBUG;_WINDOWS;_USRDLL;BUILDING_LIBICONV;BUILDING_LIBCHARSET;LIBICONV_EXPORTS;%(PreprocessorDefinitions) true MultiThreaded Windows true true true Level3 NotUsing MaxSpeed true true _WIN64;NDEBUG;_WINDOWS;_USRDLL;BUILDING_LIBICONV;BUILDING_LIBCHARSET;LIBICONV_EXPORTS;%(PreprocessorDefinitions) true MultiThreaded Windows true true true MachineX64 true WIN32;NDEBUG;_WINDOWS;_LIB;USING_STATIC_LIBICONV;%(PreprocessorDefinitions) MultiThreadedDLL MachineX86 true _WIN64;NDEBUG;_WINDOWS;_LIB;USING_STATIC_LIBICONV;%(PreprocessorDefinitions) MultiThreadedDLL MachineX64 freelan-2.0/third-party/source/libiconv-msvc/libiconv/libiconv.vcxproj.filters000066400000000000000000000026741252300335000300110ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Header Files Header Files Source Files Source Files Source Files Resource Files freelan-2.0/third-party/source/libiconv-msvc/libiconv/localcharset.c000066400000000000000000000433531252300335000257270ustar00rootroot00000000000000/* Determine a canonical name for the current locale's character encoding. Copyright (C) 2000-2006, 2008-2010 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Written by Bruno Haible . */ #include /* Specification. */ #include "localcharset.h" #include #include #include #include #include #if defined __APPLE__ && defined __MACH__ && HAVE_LANGINFO_CODESET # define DARWIN7 /* Darwin 7 or newer, i.e. MacOS X 10.3 or newer */ #endif #if defined _WIN32 || defined __WIN32__ # define WIN32_NATIVE #endif #if defined __EMX__ /* Assume EMX program runs on OS/2, even if compiled under DOS. */ # ifndef OS2 # define OS2 # endif #endif #if !defined WIN32_NATIVE # include # if HAVE_LANGINFO_CODESET # include # else # if 0 /* see comment below */ # include # endif # endif # ifdef __CYGWIN__ # define WIN32_LEAN_AND_MEAN # include # endif #elif defined WIN32_NATIVE # define WIN32_LEAN_AND_MEAN # include #endif #if defined OS2 # define INCL_DOS # include #endif #if ENABLE_RELOCATABLE # include "relocatable.h" #else # define relocate(pathname) (pathname) #endif ///////////////////////// 삭제 / DELETE / УДАЛИТЬ /////////////////////// ///* Get LIBDIR. */ //#ifndef LIBDIR //# include "configmake.h" //#endif //////////////////////////////////////////////////////////////////////////////// /* Define O_NOFOLLOW to 0 on platforms where it does not exist. */ #ifndef O_NOFOLLOW # define O_NOFOLLOW 0 #endif #if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ /* Win32, Cygwin, OS/2, DOS */ # define ISSLASH(C) ((C) == '/' || (C) == '\\') #endif #ifndef DIRECTORY_SEPARATOR # define DIRECTORY_SEPARATOR '/' #endif #ifndef ISSLASH # define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR) #endif #if HAVE_DECL_GETC_UNLOCKED # undef getc # define getc getc_unlocked #endif /* The following static variable is declared 'volatile' to avoid a possible multithread problem in the function get_charset_aliases. If we are running in a threaded environment, and if two threads initialize 'charset_aliases' simultaneously, both will produce the same value, and everything will be ok if the two assignments to 'charset_aliases' are atomic. But I don't know what will happen if the two assignments mix. */ #if __STDC__ != 1 # define volatile /* empty */ #endif /* Pointer to the contents of the charset.alias file, if it has already been read, else NULL. Its format is: ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */ static const char * volatile charset_aliases; /* Return a pointer to the contents of the charset.alias file. */ static const char * get_charset_aliases (void) { const char *cp; cp = charset_aliases; if (cp == NULL) { #if !(defined DARWIN7 || defined VMS || defined WIN32_NATIVE || defined __CYGWIN__) const char *dir; const char *base = "charset.alias"; char *file_name; /* Make it possible to override the charset.alias location. This is necessary for running the testsuite before "make install". */ dir = getenv ("CHARSETALIASDIR"); if (dir == NULL || dir[0] == '\0') dir = relocate (LIBDIR); /* Concatenate dir and base into freshly allocated file_name. */ { size_t dir_len = strlen (dir); size_t base_len = strlen (base); int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1])); file_name = (char *) malloc (dir_len + add_slash + base_len + 1); if (file_name != NULL) { memcpy (file_name, dir, dir_len); if (add_slash) file_name[dir_len] = DIRECTORY_SEPARATOR; memcpy (file_name + dir_len + add_slash, base, base_len + 1); } } if (file_name == NULL) /* Out of memory. Treat the file as empty. */ cp = ""; else { int fd; /* Open the file. Reject symbolic links on platforms that support O_NOFOLLOW. This is a security feature. Without it, an attacker could retrieve parts of the contents (namely, the tail of the first line that starts with "* ") of an arbitrary file by placing a symbolic link to that file under the name "charset.alias" in some writable directory and defining the environment variable CHARSETALIASDIR to point to that directory. */ fd = open (file_name, O_RDONLY | (HAVE_WORKING_O_NOFOLLOW ? O_NOFOLLOW : 0)); if (fd < 0) /* File not found. Treat it as empty. */ cp = ""; else { FILE *fp; fp = fdopen (fd, "r"); if (fp == NULL) { /* Out of memory. Treat the file as empty. */ close (fd); cp = ""; } else { /* Parse the file's contents. */ char *res_ptr = NULL; size_t res_size = 0; for (;;) { int c; char buf1[50+1]; char buf2[50+1]; size_t l1, l2; char *old_res_ptr; c = getc (fp); if (c == EOF) break; if (c == '\n' || c == ' ' || c == '\t') continue; if (c == '#') { /* Skip comment, to end of line. */ do c = getc (fp); while (!(c == EOF || c == '\n')); if (c == EOF) break; continue; } ungetc (c, fp); if (fscanf (fp, "%50s %50s", buf1, buf2) < 2) break; l1 = strlen (buf1); l2 = strlen (buf2); old_res_ptr = res_ptr; if (res_size == 0) { res_size = l1 + 1 + l2 + 1; res_ptr = (char *) malloc (res_size + 1); } else { res_size += l1 + 1 + l2 + 1; res_ptr = (char *) realloc (res_ptr, res_size + 1); } if (res_ptr == NULL) { /* Out of memory. */ res_size = 0; free (old_res_ptr); break; } strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1); strcpy (res_ptr + res_size - (l2 + 1), buf2); } fclose (fp); if (res_size == 0) cp = ""; else { *(res_ptr + res_size) = '\0'; cp = res_ptr; } } } free (file_name); } #else # if defined DARWIN7 /* To avoid the trouble of installing a file that is shared by many GNU packages -- many packaging systems have problems with this --, simply inline the aliases here. */ cp = "ISO8859-1" "\0" "ISO-8859-1" "\0" "ISO8859-2" "\0" "ISO-8859-2" "\0" "ISO8859-4" "\0" "ISO-8859-4" "\0" "ISO8859-5" "\0" "ISO-8859-5" "\0" "ISO8859-7" "\0" "ISO-8859-7" "\0" "ISO8859-9" "\0" "ISO-8859-9" "\0" "ISO8859-13" "\0" "ISO-8859-13" "\0" "ISO8859-15" "\0" "ISO-8859-15" "\0" "KOI8-R" "\0" "KOI8-R" "\0" "KOI8-U" "\0" "KOI8-U" "\0" "CP866" "\0" "CP866" "\0" "CP949" "\0" "CP949" "\0" "CP1131" "\0" "CP1131" "\0" "CP1251" "\0" "CP1251" "\0" "eucCN" "\0" "GB2312" "\0" "GB2312" "\0" "GB2312" "\0" "eucJP" "\0" "EUC-JP" "\0" "eucKR" "\0" "EUC-KR" "\0" "Big5" "\0" "BIG5" "\0" "Big5HKSCS" "\0" "BIG5-HKSCS" "\0" "GBK" "\0" "GBK" "\0" "GB18030" "\0" "GB18030" "\0" "SJIS" "\0" "SHIFT_JIS" "\0" "ARMSCII-8" "\0" "ARMSCII-8" "\0" "PT154" "\0" "PT154" "\0" /*"ISCII-DEV" "\0" "?" "\0"*/ "*" "\0" "UTF-8" "\0"; # endif # if defined VMS /* To avoid the troubles of an extra file charset.alias_vms in the sources of many GNU packages, simply inline the aliases here. */ /* The list of encodings is taken from the OpenVMS 7.3-1 documentation "Compaq C Run-Time Library Reference Manual for OpenVMS systems" section 10.7 "Handling Different Character Sets". */ cp = "ISO8859-1" "\0" "ISO-8859-1" "\0" "ISO8859-2" "\0" "ISO-8859-2" "\0" "ISO8859-5" "\0" "ISO-8859-5" "\0" "ISO8859-7" "\0" "ISO-8859-7" "\0" "ISO8859-8" "\0" "ISO-8859-8" "\0" "ISO8859-9" "\0" "ISO-8859-9" "\0" /* Japanese */ "eucJP" "\0" "EUC-JP" "\0" "SJIS" "\0" "SHIFT_JIS" "\0" "DECKANJI" "\0" "DEC-KANJI" "\0" "SDECKANJI" "\0" "EUC-JP" "\0" /* Chinese */ "eucTW" "\0" "EUC-TW" "\0" "DECHANYU" "\0" "DEC-HANYU" "\0" "DECHANZI" "\0" "GB2312" "\0" /* Korean */ "DECKOREAN" "\0" "EUC-KR" "\0"; # endif # if defined WIN32_NATIVE || defined __CYGWIN__ /* To avoid the troubles of installing a separate file in the same directory as the DLL and of retrieving the DLL's directory at runtime, simply inline the aliases here. */ cp = "CP936" "\0" "GBK" "\0" "CP1361" "\0" "JOHAB" "\0" "CP20127" "\0" "ASCII" "\0" "CP20866" "\0" "KOI8-R" "\0" "CP20936" "\0" "GB2312" "\0" "CP21866" "\0" "KOI8-RU" "\0" "CP28591" "\0" "ISO-8859-1" "\0" "CP28592" "\0" "ISO-8859-2" "\0" "CP28593" "\0" "ISO-8859-3" "\0" "CP28594" "\0" "ISO-8859-4" "\0" "CP28595" "\0" "ISO-8859-5" "\0" "CP28596" "\0" "ISO-8859-6" "\0" "CP28597" "\0" "ISO-8859-7" "\0" "CP28598" "\0" "ISO-8859-8" "\0" "CP28599" "\0" "ISO-8859-9" "\0" "CP28605" "\0" "ISO-8859-15" "\0" "CP38598" "\0" "ISO-8859-8" "\0" "CP51932" "\0" "EUC-JP" "\0" "CP51936" "\0" "GB2312" "\0" "CP51949" "\0" "EUC-KR" "\0" "CP51950" "\0" "EUC-TW" "\0" "CP54936" "\0" "GB18030" "\0" "CP65001" "\0" "UTF-8" "\0"; # endif #endif charset_aliases = cp; } return cp; } /* Determine the current locale's character encoding, and canonicalize it into one of the canonical names listed in config.charset. The result must not be freed; it is statically allocated. If the canonical name cannot be determined, the result is a non-canonical name. */ #ifdef STATIC STATIC #endif const char * locale_charset (void) { const char *codeset; const char *aliases; #if !(defined WIN32_NATIVE || defined OS2) # if HAVE_LANGINFO_CODESET /* Most systems support nl_langinfo (CODESET) nowadays. */ codeset = nl_langinfo (CODESET); # ifdef __CYGWIN__ /* Cygwin < 1.7 does not have locales. nl_langinfo (CODESET) always returns "US-ASCII". Return the suffix of the locale name from the environment variables (if present) or the codepage as a number. */ if (codeset != NULL && strcmp (codeset, "US-ASCII") == 0) { const char *locale; static char buf[2 + 10 + 1]; locale = getenv ("LC_ALL"); if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_CTYPE"); if (locale == NULL || locale[0] == '\0') locale = getenv ("LANG"); } if (locale != NULL && locale[0] != '\0') { /* If the locale name contains an encoding after the dot, return it. */ const char *dot = strchr (locale, '.'); if (dot != NULL) { const char *modifier; dot++; /* Look for the possible @... trailer and remove it, if any. */ modifier = strchr (dot, '@'); if (modifier == NULL) return dot; if (modifier - dot < sizeof (buf)) { memcpy (buf, dot, modifier - dot); buf [modifier - dot] = '\0'; return buf; } } } /* Woe32 has a function returning the locale's codepage as a number: GetACP(). This encoding is used by Cygwin, unless the user has set the environment variable CYGWIN=codepage:oem (which very few people do). Output directed to console windows needs to be converted (to GetOEMCP() if the console is using a raster font, or to GetConsoleOutputCP() if it is using a TrueType font). Cygwin does this conversion transparently (see winsup/cygwin/fhandler_console.cc), converting to GetConsoleOutputCP(). This leads to correct results, except when SetConsoleOutputCP has been called and a raster font is in use. */ sprintf (buf, "CP%u", GetACP ()); codeset = buf; } # endif # else /* On old systems which lack it, use setlocale or getenv. */ const char *locale = NULL; /* But most old systems don't have a complete set of locales. Some (like SunOS 4 or DJGPP) have only the C locale. Therefore we don't use setlocale here; it would return "C" when it doesn't support the locale name the user has set. */ # if 0 locale = setlocale (LC_CTYPE, NULL); # endif if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_ALL"); if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_CTYPE"); if (locale == NULL || locale[0] == '\0') locale = getenv ("LANG"); } } /* On some old systems, one used to set locale = "iso8859_1". On others, you set it to "language_COUNTRY.charset". In any case, we resolve it through the charset.alias file. */ codeset = locale; # endif #elif defined WIN32_NATIVE static char buf[2 + 10 + 1]; /* Woe32 has a function returning the locale's codepage as a number: GetACP(). When the output goes to a console window, it needs to be provided in GetOEMCP() encoding if the console is using a raster font, or in GetConsoleOutputCP() encoding if it is using a TrueType font. But in GUI programs and for output sent to files and pipes, GetACP() encoding is the best bet. */ sprintf (buf, "CP%u", GetACP ()); codeset = buf; #elif defined OS2 const char *locale; static char buf[2 + 10 + 1]; ULONG cp[3]; ULONG cplen; /* Allow user to override the codeset, as set in the operating system, with standard language environment variables. */ locale = getenv ("LC_ALL"); if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_CTYPE"); if (locale == NULL || locale[0] == '\0') locale = getenv ("LANG"); } if (locale != NULL && locale[0] != '\0') { /* If the locale name contains an encoding after the dot, return it. */ const char *dot = strchr (locale, '.'); if (dot != NULL) { const char *modifier; dot++; /* Look for the possible @... trailer and remove it, if any. */ modifier = strchr (dot, '@'); if (modifier == NULL) return dot; if (modifier - dot < sizeof (buf)) { memcpy (buf, dot, modifier - dot); buf [modifier - dot] = '\0'; return buf; } } /* Resolve through the charset.alias file. */ codeset = locale; } else { /* OS/2 has a function returning the locale's codepage as a number. */ if (DosQueryCp (sizeof (cp), cp, &cplen)) codeset = ""; else { sprintf (buf, "CP%u", cp[0]); codeset = buf; } } #endif if (codeset == NULL) /* The canonical name cannot be determined. */ codeset = ""; /* Resolve alias. */ for (aliases = get_charset_aliases (); *aliases != '\0'; aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) if (strcmp (codeset, aliases) == 0 || (aliases[0] == '*' && aliases[1] == '\0')) { codeset = aliases + strlen (aliases) + 1; break; } /* Don't return an empty string. GNU libc and GNU libiconv interpret the empty string as denoting "the locale's character encoding", thus GNU libiconv would call this function a second time. */ if (codeset[0] == '\0') codeset = "ASCII"; return codeset; } freelan-2.0/third-party/source/libiconv-msvc/libiconv/localcharset.h000066400000000000000000000040051252300335000257230ustar00rootroot00000000000000/* Determine a canonical name for the current locale's character encoding. Copyright (C) 2000-2003 Free Software Foundation, Inc. This file is part of the GNU CHARSET Library. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _LOCALCHARSET_H #define _LOCALCHARSET_H ///////////////////////// 삭제 / DELETE / УДАЛИТЬ /////////////////////// //#if @HAVE_VISIBILITY@ && BUILDING_LIBCHARSET //#define LIBCHARSET_DLL_EXPORTED __attribute__((__visibility__("default"))) //#else //#define LIBCHARSET_DLL_EXPORTED //#endif ///////////////////////// 추가 / ADD / ДОВАВЛЯТЬ ////////////////////// #ifdef BUILDING_LIBCHARSET #define LIBCHARSET_DLL_EXPORTED __declspec(dllexport) #elif USING_STATIC_LIBICONV #define LIBCHARSET_DLL_EXPORTED #else #define LIBCHARSET_DLL_EXPORTED __declspec(dllimport) #endif //////////////////////////////////////////////////////////////////////////////// #ifdef __cplusplus extern "C" { #endif /* Determine the current locale's character encoding, and canonicalize it into one of the canonical names listed in config.charset. The result must not be freed; it is statically allocated. If the canonical name cannot be determined, the result is a non-canonical name. */ extern LIBCHARSET_DLL_EXPORTED const char * locale_charset (void); #ifdef __cplusplus } #endif #endif /* _LOCALCHARSET_H */ freelan-2.0/third-party/source/libiconv-msvc/libiconv/relocatable.c000066400000000000000000000357741252300335000255500ustar00rootroot00000000000000/* Provide relocatable packages. Copyright (C) 2003-2006, 2008-2011 Free Software Foundation, Inc. Written by Bruno Haible , 2003. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Tell glibc's to provide a prototype for getline(). This must come before because may include , and once has been included, it's too late. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #define _GL_USE_STDLIB_ALLOC 1 #include /* Specification. */ #include "relocatable.h" #if ENABLE_RELOCATABLE #include #include #include #include #ifdef NO_XMALLOC # define xmalloc malloc #else # include "xalloc.h" #endif #if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__ # define WIN32_LEAN_AND_MEAN # include #endif #if DEPENDS_ON_LIBCHARSET # include #endif #if DEPENDS_ON_LIBICONV && HAVE_ICONV # include #endif #if DEPENDS_ON_LIBINTL && ENABLE_NLS # include #endif /* Faked cheap 'bool'. */ #undef bool #undef false #undef true #define bool int #define false 0 #define true 1 /* Pathname support. ISSLASH(C) tests whether C is a directory separator character. IS_PATH_WITH_DIR(P) tests whether P contains a directory specification. */ #if ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || defined __EMX__ || defined __DJGPP__ /* Win32, OS/2, DOS */ # define ISSLASH(C) ((C) == '/' || (C) == '\\') # define HAS_DEVICE(P) \ ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ && (P)[1] == ':') # define IS_PATH_WITH_DIR(P) \ (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P)) # define FILE_SYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0) #else /* Unix */ # define ISSLASH(C) ((C) == '/') # define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL) # define FILE_SYSTEM_PREFIX_LEN(P) 0 #endif /* Original installation prefix. */ static char *orig_prefix; static size_t orig_prefix_len; /* Current installation prefix. */ static char *curr_prefix; static size_t curr_prefix_len; /* These prefixes do not end in a slash. Anything that will be concatenated to them must start with a slash. */ /* Sets the original and the current installation prefix of this module. Relocation simply replaces a pathname starting with the original prefix by the corresponding pathname with the current prefix instead. Both prefixes should be directory names without trailing slash (i.e. use "" instead of "/"). */ static void set_this_relocation_prefix (const char *orig_prefix_arg, const char *curr_prefix_arg) { if (orig_prefix_arg != NULL && curr_prefix_arg != NULL /* Optimization: if orig_prefix and curr_prefix are equal, the relocation is a nop. */ && strcmp (orig_prefix_arg, curr_prefix_arg) != 0) { /* Duplicate the argument strings. */ char *memory; orig_prefix_len = strlen (orig_prefix_arg); curr_prefix_len = strlen (curr_prefix_arg); memory = (char *) xmalloc (orig_prefix_len + 1 + curr_prefix_len + 1); #ifdef NO_XMALLOC if (memory != NULL) #endif { memcpy (memory, orig_prefix_arg, orig_prefix_len + 1); orig_prefix = memory; memory += orig_prefix_len + 1; memcpy (memory, curr_prefix_arg, curr_prefix_len + 1); curr_prefix = memory; return; } } orig_prefix = NULL; curr_prefix = NULL; /* Don't worry about wasted memory here - this function is usually only called once. */ } /* Sets the original and the current installation prefix of the package. Relocation simply replaces a pathname starting with the original prefix by the corresponding pathname with the current prefix instead. Both prefixes should be directory names without trailing slash (i.e. use "" instead of "/"). */ void set_relocation_prefix (const char *orig_prefix_arg, const char *curr_prefix_arg) { set_this_relocation_prefix (orig_prefix_arg, curr_prefix_arg); /* Now notify all dependent libraries. */ #if DEPENDS_ON_LIBCHARSET libcharset_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); #endif #if DEPENDS_ON_LIBICONV && HAVE_ICONV && _LIBICONV_VERSION >= 0x0109 libiconv_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); #endif #if DEPENDS_ON_LIBINTL && ENABLE_NLS && defined libintl_set_relocation_prefix libintl_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); #endif } #if !defined IN_LIBRARY || (defined PIC && defined INSTALLDIR) /* Convenience function: Computes the current installation prefix, based on the original installation prefix, the original installation directory of a particular file, and the current pathname of this file. Returns it, freshly allocated. Returns NULL upon failure. */ #ifdef IN_LIBRARY #define compute_curr_prefix local_compute_curr_prefix static #endif char * compute_curr_prefix (const char *orig_installprefix, const char *orig_installdir, const char *curr_pathname) { char *curr_installdir; const char *rel_installdir; if (curr_pathname == NULL) return NULL; /* Determine the relative installation directory, relative to the prefix. This is simply the difference between orig_installprefix and orig_installdir. */ if (strncmp (orig_installprefix, orig_installdir, strlen (orig_installprefix)) != 0) /* Shouldn't happen - nothing should be installed outside $(prefix). */ return NULL; rel_installdir = orig_installdir + strlen (orig_installprefix); /* Determine the current installation directory. */ { const char *p_base = curr_pathname + FILE_SYSTEM_PREFIX_LEN (curr_pathname); const char *p = curr_pathname + strlen (curr_pathname); char *q; while (p > p_base) { p--; if (ISSLASH (*p)) break; } q = (char *) xmalloc (p - curr_pathname + 1); #ifdef NO_XMALLOC if (q == NULL) return NULL; #endif memcpy (q, curr_pathname, p - curr_pathname); q[p - curr_pathname] = '\0'; curr_installdir = q; } /* Compute the current installation prefix by removing the trailing rel_installdir from it. */ { const char *rp = rel_installdir + strlen (rel_installdir); const char *cp = curr_installdir + strlen (curr_installdir); const char *cp_base = curr_installdir + FILE_SYSTEM_PREFIX_LEN (curr_installdir); while (rp > rel_installdir && cp > cp_base) { bool same = false; const char *rpi = rp; const char *cpi = cp; while (rpi > rel_installdir && cpi > cp_base) { rpi--; cpi--; if (ISSLASH (*rpi) || ISSLASH (*cpi)) { if (ISSLASH (*rpi) && ISSLASH (*cpi)) same = true; break; } /* Do case-insensitive comparison if the file system is always or often case-insensitive. It's better to accept the comparison if the difference is only in case, rather than to fail. */ #if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ /* Win32, Cygwin, OS/2, DOS - case insignificant file system */ if ((*rpi >= 'a' && *rpi <= 'z' ? *rpi - 'a' + 'A' : *rpi) != (*cpi >= 'a' && *cpi <= 'z' ? *cpi - 'a' + 'A' : *cpi)) break; #else if (*rpi != *cpi) break; #endif } if (!same) break; /* The last pathname component was the same. opi and cpi now point to the slash before it. */ rp = rpi; cp = cpi; } if (rp > rel_installdir) { /* Unexpected: The curr_installdir does not end with rel_installdir. */ free (curr_installdir); return NULL; } { size_t curr_prefix_len = cp - curr_installdir; char *curr_prefix; curr_prefix = (char *) xmalloc (curr_prefix_len + 1); #ifdef NO_XMALLOC if (curr_prefix == NULL) { free (curr_installdir); return NULL; } #endif memcpy (curr_prefix, curr_installdir, curr_prefix_len); curr_prefix[curr_prefix_len] = '\0'; free (curr_installdir); return curr_prefix; } } } #endif /* !IN_LIBRARY || PIC */ #if defined PIC && defined INSTALLDIR /* Full pathname of shared library, or NULL. */ static char *shared_library_fullname; #if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__ /* Native Win32 only. On Cygwin, it is better to use the Cygwin provided /proc interface, than to use native Win32 API and cygwin_conv_to_posix_path, because it supports longer file names (see ). */ /* Determine the full pathname of the shared library when it is loaded. */ BOOL WINAPI DllMain (HINSTANCE module_handle, DWORD event, LPVOID reserved) { (void) reserved; if (event == DLL_PROCESS_ATTACH) { /* The DLL is being loaded into an application's address range. */ static char location[MAX_PATH]; if (!GetModuleFileName (module_handle, location, sizeof (location))) /* Shouldn't happen. */ return FALSE; if (!IS_PATH_WITH_DIR (location)) /* Shouldn't happen. */ return FALSE; shared_library_fullname = strdup (location); } return TRUE; } #else /* Unix */ static void find_shared_library_fullname () { #if (defined __linux__ && (__GLIBC__ >= 2 || defined __UCLIBC__)) || defined __CYGWIN__ /* Linux has /proc/self/maps. glibc 2 and uClibc have the getline() function. Cygwin >= 1.5 has /proc/self/maps and the getline() function too. */ FILE *fp; /* Open the current process' maps file. It describes one VMA per line. */ fp = fopen ("/proc/self/maps", "r"); if (fp) { unsigned long address = (unsigned long) &find_shared_library_fullname; for (;;) { unsigned long start, end; int c; if (fscanf (fp, "%lx-%lx", &start, &end) != 2) break; if (address >= start && address <= end - 1) { /* Found it. Now see if this line contains a filename. */ while (c = getc (fp), c != EOF && c != '\n' && c != '/') continue; if (c == '/') { size_t size; int len; ungetc (c, fp); shared_library_fullname = NULL; size = 0; len = getline (&shared_library_fullname, &size, fp); if (len >= 0) { /* Success: filled shared_library_fullname. */ if (len > 0 && shared_library_fullname[len - 1] == '\n') shared_library_fullname[len - 1] = '\0'; } } break; } while (c = getc (fp), c != EOF && c != '\n') continue; } fclose (fp); } #endif } #endif /* WIN32 / Unix */ /* Return the full pathname of the current shared library. Return NULL if unknown. Guaranteed to work only on Linux, Cygwin and Woe32. */ static char * get_shared_library_fullname () { #if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) static bool tried_find_shared_library_fullname; if (!tried_find_shared_library_fullname) { find_shared_library_fullname (); tried_find_shared_library_fullname = true; } #endif return shared_library_fullname; } #endif /* PIC */ /* Returns the pathname, relocated according to the current installation directory. The returned string is either PATHNAME unmodified or a freshly allocated string that you can free with free() after casting it to 'char *'. */ const char * relocate (const char *pathname) { #if defined PIC && defined INSTALLDIR static int initialized; /* Initialization code for a shared library. */ if (!initialized) { /* At this point, orig_prefix and curr_prefix likely have already been set through the main program's set_program_name_and_installdir function. This is sufficient in the case that the library has initially been installed in the same orig_prefix. But we can do better, to also cover the cases that 1. it has been installed in a different prefix before being moved to orig_prefix and (later) to curr_prefix, 2. unlike the program, it has not moved away from orig_prefix. */ const char *orig_installprefix = INSTALLPREFIX; const char *orig_installdir = INSTALLDIR; char *curr_prefix_better; curr_prefix_better = compute_curr_prefix (orig_installprefix, orig_installdir, get_shared_library_fullname ()); set_relocation_prefix (orig_installprefix, curr_prefix_better != NULL ? curr_prefix_better : curr_prefix); if (curr_prefix_better != NULL) free (curr_prefix_better); initialized = 1; } #endif /* Note: It is not necessary to perform case insensitive comparison here, even for DOS-like file systems, because the pathname argument was typically created from the same Makefile variable as orig_prefix came from. */ if (orig_prefix != NULL && curr_prefix != NULL && strncmp (pathname, orig_prefix, orig_prefix_len) == 0) { if (pathname[orig_prefix_len] == '\0') { /* pathname equals orig_prefix. */ char *result = (char *) xmalloc (strlen (curr_prefix) + 1); #ifdef NO_XMALLOC if (result != NULL) #endif { strcpy (result, curr_prefix); return result; } } else if (ISSLASH (pathname[orig_prefix_len])) { /* pathname starts with orig_prefix. */ const char *pathname_tail = &pathname[orig_prefix_len]; char *result = (char *) xmalloc (curr_prefix_len + strlen (pathname_tail) + 1); #ifdef NO_XMALLOC if (result != NULL) #endif { memcpy (result, curr_prefix, curr_prefix_len); strcpy (result + curr_prefix_len, pathname_tail); return result; } } } /* Nothing to relocate. */ return pathname; } #endif freelan-2.0/third-party/source/libiconv-msvc/libiconv/relocatable.h000066400000000000000000000061771252300335000255500ustar00rootroot00000000000000/* Provide relocatable packages. Copyright (C) 2003, 2005, 2008-2011 Free Software Foundation, Inc. Written by Bruno Haible , 2003. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _RELOCATABLE_H #define _RELOCATABLE_H #ifdef __cplusplus extern "C" { #endif /* This can be enabled through the configure --enable-relocatable option. */ #if ENABLE_RELOCATABLE /* When building a DLL, we must export some functions. Note that because this is a private .h file, we don't need to use __declspec(dllimport) in any case. */ #if HAVE_VISIBILITY && BUILDING_DLL # define RELOCATABLE_DLL_EXPORTED __attribute__((__visibility__("default"))) #elif defined _MSC_VER && BUILDING_DLL # define RELOCATABLE_DLL_EXPORTED __declspec(dllexport) #else # define RELOCATABLE_DLL_EXPORTED #endif /* Sets the original and the current installation prefix of the package. Relocation simply replaces a pathname starting with the original prefix by the corresponding pathname with the current prefix instead. Both prefixes should be directory names without trailing slash (i.e. use "" instead of "/"). */ extern RELOCATABLE_DLL_EXPORTED void set_relocation_prefix (const char *orig_prefix, const char *curr_prefix); /* Returns the pathname, relocated according to the current installation directory. The returned string is either PATHNAME unmodified or a freshly allocated string that you can free with free() after casting it to 'char *'. */ extern const char * relocate (const char *pathname); /* Memory management: relocate() potentially allocates memory, because it has to construct a fresh pathname. If this is a problem because your program calls relocate() frequently, think about caching the result. Or free the return value if it was different from the argument pathname. */ /* Convenience function: Computes the current installation prefix, based on the original installation prefix, the original installation directory of a particular file, and the current pathname of this file. Returns it, freshly allocated. Returns NULL upon failure. */ extern char * compute_curr_prefix (const char *orig_installprefix, const char *orig_installdir, const char *curr_pathname); #else /* By default, we use the hardwired pathnames. */ #define relocate(pathname) (pathname) #endif #ifdef __cplusplus } #endif #endif /* _RELOCATABLE_H */
NameModifiedSize

yߟAo%ö+:CKNe1,|l3bOBsrR7 4Qʼ949xQ `de˯qZ\_[ȋenq<6/IzKEm$}\6Nr @<Ү< ~iԑa_,a7dz1oEб9xuv5 مw>]ǺX~>ә 6<QSן 6?Yݠ_դ4UD"H$L" 0HnTȫș848!wmFKu $\3Qx5-Li>KXO͋?`$FN]T 6&>`^WWanro%Ē4XkNrmfK,ʹ(ZJRj)ؠ{li|N{?[u؍6w4t ZͻJ s s?9_+iPӁ72ЗQ~ ;::}6M'Ss7ũwyv~NexMxXZ菩츽k@718[>K(ѫ[%f/R*@~䯍ԩI+\<%%e,g:XFi!e,z (/ sYvx]xu:$ M!hCZRO&(wv.)5V| DS} Sf\xpʢIO6.'ֳY>ݯX~Dx,TRY%%S-9vo*Z 0T+HN}u3ݗBp?5 JpݯõJ)ezDgt숴po%x_׫w?_XߡcNj; ǠqkΤste1 Fޫ߷h<`~H$DH 3v%ÛLA2 x-'J@*f~/o}4.KV$Z|bKvS CƦ8Cd So+b)MC" 9[aqaqk5>»0 ^|AKyMt~s0P>$Jl{DDŽbke7fwe9GsĖv.0qr"`{ ﱕ4z~:^fk^gQcX^{$*Y,t%:eph$=JnT@rwc42Yfl>“pׅZrJH[`qzW؞a97_yBq`%9:.Yy|8>eU5!J'D"H0q"6} y5B p߈N2<7<8Eƙdٕ\H8 挐Bcx\ާ=_gC $z~@fC}hMI]#5@xPg:΃#(ysfiHS@32p65޳tǵ;ڨZtiKsjƴW '[U6r"M%q g2z*ג;?Uyua#,sJ38)N$N.8=iūZzBn? {y%aΞ:HxOBgL)#KyrsN>cml+3&r/H5(NN=Gy#umY|u})^W9@/ϐw5=p'z;W jݮx/w;]|VD"H0qB6| pJxМvkoYĝ@㧩BțT)Bj ¨Gaή&RXyy.P{o~yvJ?Y _4V8SqČ2~`lo^S$GB}[Jbpהڣւ$(c3o#'nQ|G/aߤlm-Z YOAU%uk箠_'ii"_+]z'H{Z1kxGاK :GepdFB)`~Y|J~X~Q=ߞu E\ n^*pwy:W=CߥkuEQJrhNcDxaql˩ׅwB8ñba A+:"u`wޔ~R_x1)R|#ɇ=:(Hֿ'zI$D"`D!}Z9@QP[Ȼ<ؕI5^U<,tvD/TY}^R_@ORPMgs*Oq>D!iD>y)~_R&zf΀JJe ]YʥnQW/lu-:Ѣwo<%2!Ɍ\Pv1ymCcG鎡]bةK[9%XZ"v"qR{G}9_uI7*`Qш<=+x^%Cv6X.!?t^Dё:ǗAB ss|F!i=ZCRZP~lE8y@Id!~NG<_q=1WCY%GGXcg/BZ#sl | ,Ǖ& H$D" a+oiSh`I72m@O!aa!ץ#H'+jʈm7LOMvMXG3AZ#IcN%HIi@uZE,Ix/4 ;rkuK&ʫ%~},򫴩(?Ot7iО-N(eo~Wq n^yX$m9*W SR#Cٲ]Z |'*߃ ‰IJwe!I>_T0s* ;J9ܠK<=X3Wu؅g!& }L躣8la=jOtJVE\aB{yCEl.RJpcTbJ=2U>>ܯ)b|(ycFr{iXweQ@MHrdʁ! Gy(!c*Js1n^3} CD}~Ҟg_5yϪNw 3Ő0coBcn?;zLέ뱾* ɹJڸ TNp.?IZGTW~2 q&xX닣R)17%0<8n_ #Mk):Vm pWʍ{8D"H$8!>Cif<~ :ջєV{OlelSQF6!^2$ 2A$_v%YQwZv5m)OO:Su:+YJK:Z& M@P/ 8f׸XwSu鈂ډisfmS.% 9z\lGY ;R&hw1(eGO17)ksbBb+ek[AȑM$N6 ,<9ADlk{/֤tPW)E6x1\vFI^.Ёoaq1kDީLC5`ɸO'dFcm=EeHZ7Ǘ< * .3}N~t.הP,bwNJZq}Y4菁Pն=-]?s]HY|v<D"H$8>aPx'pAd GPECk'{oe 7. Ӈ-8bW/Ҟ!ϢV򹵴>?K_6:rasOPt^߸Z>HA؝SnDJZ6'i1|i#;uw~U?;L9z.ܦS$.(S]ae?U; XTZFą@`.ܒ\n@%a;}awbOT1KG$عޤl7;8ESFܮ>~H}~D^oU`,ɶC˙$cU0 `Ԍ_^#EeE'ܧK(Kq)TAe\; oާBЫ895xD D2Բ_-VIA4p×pNq%@}a;ޚ%PK\8G8fGS |I]%X"H$$'L_pɿwv3lbo g\} YD ZI NM'e3_w2\*aiI\Hv?Ӟ\K  ijɭX3ҍ<7Z>D+ TcFn2;I/ҌDm]ԢrFdQy"|9MHg23~4wd 9⏇_#E5%wL=k((Cvŗ@XJ]6Ú۵WUX:UlgXT0}HK^K4箴woO"K& n[_d n 7I;qZ/AGRY_#/mɃ4j*0if77ɞS\1{:Izs%8\|Fמ/DD"H$;N$6p&hЏ=iF3  1G.*֩{*%[R@>XcFC !]N&-o_fV .bUtY:mS󣺶O-S}~E;u~,ݦXt rB<>"n~6cx9ẽV1A^#Z;J~dDd5? h!Q%5;J!8">/$LN ꥷE^ Oo%kMRi7"L"}\#=\sgٻJ=ao6 Ki g],~A15҈C.1UA>}#27rXUDi<.Z[XF)~mpT J~'ט'CDᝇ>nPsv~2[@PӒG M$D"`iUxF K4b Q-r]XD$@ھ?w'x\ѿ%'[B@I&p+j:Wv\ +9[:Poe']鐗OvLicp#E{1Cȇm/X&mkPE_AZWǭ8O*͎lĔ6RwL!cu[tHULr-ZSnϷO[eu}&ѲShWW\O;/Dݺe ]`X~G U{cWoB;/,EGe$# D"H$I&D"8ԘZ$7fUŠK|"?ׁ/3t7T: c WmQI5-, X0LQG I2ܥWդ<3"F{6RnBvün+3hS>/a[=d.5;{ )r;U첁[de-mwX|,E1YXXrBBT,b6|s&( ^[h9?Vf,MuLFְtN$D! D"H$+%駳ʲajGlc߭x"$r*-C@Rk Cy1zo,gU/ЋSk"":8M< 򜲐{uSi;L:˧Uy?xNr\~;3! jR4s)ev 'z !eoȇ XzB 3J\d'b/|k6ocKfeܕ-$یO'D"8:H0H$ġE%{N[K62x <ґk*ާ?PNts٪i:YJVqD Ak+/znac}:.;(\Rp~U?9~^ {&W1:@&l9+$]@E#3>N_ 䗭Wܾ&$ʾH~ߕ_u>v L6 J$K uv.췏]i?`pY1HW"0H$” H$a\O< @$\?Or<⒈N~?<*3.>rʦ>,NS%8(82GWl#F_ȱ^175O|ɲH,E9 y=?SLuvɴQXJM2Pp^Y#^ҟ;I'D"8H0H$ġE%U[exKהo] GS:gI^}WrGFm 2l[4X4>,dH0BS8u9j579 ߎ ulHڹbe.dxV[Չ X/4e$oKtme}j1gvZHvۊ'dUN,mv;6Z B?[dzsټHr$D"q`"H$CY5>cl&~n~ī*)% !8*?J L&X1nVU+bPG]@)9 :{ X$2RşQNƨkOOΙJ2ŲMYߦ .rMȹߢ{| #\~KʱB2=cB/Vn-W{-BQH \$/9ZļwXW,KIW ua{9tO hc 0Ã8~W?"yr{ WD"H% H$a/V% F`6)C, C>zm>o>S$lzJݢdbL:_eoy涆蟚b̞H6ؕ?ܼ $"W p'2e^ \ m2vBE$ȟP۶4ekq[D2:ݟjWAWv$QM`{X$*SH$đCD"H$-ea.TV3jڪ۫d  $~F6QLj5$sF(WJza#+ۘkkVRV#2P(\' u|ΔEp|j6t7s`&nK:s!CkJ3Rs'FQFyez`_]JMN?ao"y\.p +[u#[:SH$QCD"H$5*'Nm%+ 8ϕ -wb. w%@7_my!]Dd 0$b*L#v! F|!~` pk? J: cr忳P5U-**ŽV=Dj3 RkO,2ȍ.y~s^[$XGBeݙk)}D"8rH0H$ġF#ecӍ!+ȨGG 3SZ9\29bb+[&H*F,H\a. ,F5BTU,y]S&/_mEnGaj F$v:.xaHk`j)ℤH#x?s?*Y _,(neE$E7rS ֿ!D"H $H$Db!.&ƴY_@#EXķH8j&N|O{}wDw,ݓlM-CEްo ~݈1Ԁ? x@Lw3ti0\+)6̸f_/+v2z| yȄ!ڳ?c:F#@Wpm0n~$Xn[Mdf](IM5b"9V]@cʢ%Ai[C^UZKϙZ f ;c:zsGgP{7)Z# ح8j8WxD"H$L$D"qh!ZQؒ$V"eOrQzYS>a8JbЯf ïdht~,DS ~pqKc-$6RXV] l@$/uV\뱘 JtU% ȓBPL,Fm!|,:UGAQч I  ~gCFXD"H$GI&D"8Ԙjn |l2-^UƻLY#Yj`C鮁 TH M!sdKumwm:w,`VʝZbq{H Ra'-k{p4dvbSȧ;r!TqnIS!T0ZnVcJ&IwwC#2a:+4)$D"H$L$D"qQ=Ī~B~VczU.td`ptQWi:bJ#a 6#aBaXH٫_mFOSQ Cb( KRK 2!@#t^H&6C)F鐟;\U F Uu\I4$Kfꒁ= S,k6ޏ;r m'HM>f[ 5֑)u:HWYE͹C&GJQʹBzźm7w,~?]]p\~ r{ށm~b\߻'d p"H$GI&D"8hG#|bH OP;+XJ%5AWIàRD®IktŸ1?c^Nu}ve.sk\ I|*.T%f+;w% :8)XaO%,jlTjeJJͅ~*uHa=㶻<t;uOhFMԂ1wi`vJON `"H$GI&D"8(媨ĭu4%RKlG{U{#35ٚv ~Q]NaUGi5ᕣW]_*ޭKu!-'[mYj5u)^+:+as9vޭ}Pwu핗z+mw' ~7N<*0ӱa tǚD"H$G I&D"85YuB6>~۸5X f@=71]p$`D۳ȿeAeg (tpz!{]գm6B ֭Z:l| @6Cz&rKv CC`[K\>w;?<ڟr~-ގGK3ӣQ7g%'wke `,a.'1*y\%ՉD"H$L$D"qQHZj(C90~zYbt]ɫ8R'v?A0]˴Rߗ Hi梸V\~g#}917a*Z h,p3hRJŔZ{S!޳DrL0kuug\S\{m ? !YҀ?58pW: kTJ,1^idL$D! D"H$~ l` B{yҡlļbo .@z/&BMBc_ouo)ƒ\o$U!ˑ_-Gm>,Uyc 5~ױ빤ӭ~]FI!nf&$dr[]I%[?AFI_%Qn;߬c52E K5H$GD"H$5*1j'r\2ɒ]}|-t!A@8S[R\fvV7:) ~O)dܹڵ\.koUBH_^Kpy믨0Q9z@75 l6Eu߁'1C::CT3<$ԐdJUa! 1A ,.VˡdT\X&࿂sV&D"q`"H$CFp 1F,ZǮd4?7:X kSw4LIYM9(̷tV?o?^OP5R7 +YS!AXiAHE$xE?6Ի,c:<~96۽݂;::Gthmi%{%4Mݓ~AVv?߹KU-0z" &F6^L,dz'rwR|^'JDжHa.j7!N-Z iu[E<+A! R8H$#$D"HZ0sCdphˮB(^ s3u׀k0̧⊩̎ϨmYYr즞6w[uķtoigu覼ZPgіZ\G {.&Dz (E}'(k^/JNdXH$؂Y(m+=k|]{1W#:fR]q].;9m33y#*`SQ(I;i3K/H$$D"HZTo?i n$Z6MEMr'~i-WU]7*m-7J8Kӵ.M>SG[󃺯^,)g S낺Z,n?TNr9iF}*C_A ncO0>6PFݢI.w;K?\rߟ>92׃:JQ=Zj,;D"H$3L$D"qFZbnl\$eXlPpA#LTS\mefZ3+*@q v>j|@?/Z_ |.Km塒l/hҺdnK~G)ZƲtV>S?Ksɮn)͂plkUm З+jޯZteB\SN@eG(m U2:*=1D"H$GI&D"8Ԑ?BrH'">0vVjKr|(dA2k iw5%s(8i#JxDU>$U,ttZ@ >WRi|\WtW8:C/>%恉ek /?#/oOB| }N}2oD6e˹Q뀩w7ɲAM]JƘLm5U#yǰ2Fp)L$D! D"H$@Tl&_hO$| p#C2 E'K~=",^M8Qe$x,o8qN8D䯈0K~Ҳm2}e) $~?{h] ߧi33J ݹ3 ?t;'sf~Gw-gOe_}܈/~*۶hL_9 (BCy͹kIoMf}BuL^Si# Ժ.0$Kw}N}H0D"8H0H$ġ6"KeyA haMj0Zn9WZנsQ"\ 2QTUvpQj٦IRB֩A ]D\rK]C*r ,ϕLuwIr,|O-߭syt{] m1qkYO;p6/Uƈs@;u!œvwc݃cgbH_&0A KllL z"ӈ7L$D"qd"/H$D"H$D"8r$D"H$D"H$GI&D"H$D"H$GI&D"H$D"c2Fc @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c @0&`L1c@ʼcIENDB`freelan-2.0/artwork/icons/000077500000000000000000000000001252300335000155645ustar00rootroot00000000000000freelan-2.0/artwork/icons/freelan_logo.ico000066400000000000000000001146661252300335000207320ustar00rootroot00000000000000 hV   F00 % UD(    C C  8   8 S !!!!!!  R  9 !!!!"!!!! 9  .*2-! !&G8-ZA"7.!!!   C!:,1dE/gI(R>#@5+YB0gI 3,.U;"!!! C ,S8#7-2,7|S*U?#?4,U=1_@&?1!!!!"7+2^>2aA%@2 '&,O7"!!!!  )'+(!!!"#*G1!!!&"'" !!!!! .'2T3 ,%"" +#*<%*:##  C!!!!!*A,#2'2M,'8&"/$'6#(7# C  !!!!%5&+>'&6%!!!   9!!!!!""!!!! 9  R !!!!!!  R 8   8  C C (0  8 ^ s s ^ 8 ! w w !  c !!!!!!  c    !!!!!!!!!!    !!!!!!!!!!!!!!   c!!!!!!!   !!!!!! c  "" !!!!"%F80dF(I7"!!!!!  "  w-X?5vP-bG((   $B64vQ%D64jG'E4 !!!!! w.Y=7sL&G73sO2rO">3*V@0lL;\*U?(F40Y= !!!!!  8:tI"6--*>`9Y1lL'M;&H86sL-U<7lE$;/ !!!!!! 8 ^7iC-Q8!#(J79{P('   "8.:wK$;/!!!!!!!! ^ s"4+:pE;uH:xK$=1 !!! #2]=$%!!!!!!!! s s!$$!2+&&!!!!!"3[:(&!!!!!!!! s ^!! !!!!!!!3X6*&!!!!&4$0G&*;#! ^ 8!!!!!!!!!&:*;f81O0##"&#$1$1H&""/B# )" 8 !!!!!!!($3S1)%+B+8Y./G)+?'&5%.B$*9#0C#"  w!!!!!!!)$1L,"(:&0I) "!!!!#."%" w  " !!!!!!!)<'2L)1J(&#!!!!!  "  c!!!!!!!!""!!!!!!! c  !!!!!!!!!!!!!!     !!!!!!!!!!     c !!!!!!  c  ! w w ! 8 ^ s s ^ 8??( @   " 9 F F 9 "    ;      ;     G  !!!!  G      !!!!!!!!!!     .  !!!!!!!!!!!!!!   - . !!!!!!!!!!!!!!!!!!  .   !!!!!!!!!!!!!!!!!!!!     !!!!!!!!!!   !!!!!!!!!    G   !!!!!!!!!:1,YA(K9%%!!!!!!!!  G   &&$@4$C6*) !!!! &K:<]4rM:~Q6oI#$!!!!!!!!   ; 4,;S@_?b;`$C6   #.+9Z)Q= '&<{M'C3 !!!!!!!  ; :xL9xN 3-/+2rO<`#A5'M<0jK7Y<`Ae";1!8pG+K6 !!!!!!!!  .'BS#:/  .*@cBg>b7W-`E#@42jI8zP%>1.U;>~M /)!!!!!!!!!   " .(CP%=0  1,@^,X@*)"  %&0aBBV;vJ$;/!!!!!!!!!!  " 8"8lC=zJ%'>/ !!!!!!!!!!! F 8!!!  !!!!!!!!!5^:(A/ !!!!!!&5$):$$"!! 8 "  !!!!!!!!!!!!!5\7-I0 !!!!!-B&2K'/D%5M$!!  " !!!!!!!!!!!".K0>m;>j8-F,!!"")#'6%8U(!"!4K#"-"  !!!!!!!!!!!&9*8^5)% ,%;a25S-4O+4P*0G();%4L&)9#%2"7O$$"  ; !!!!!!!!!!.G,,D+  2N+7V,".$#"!!$".@#1E#","  ;  !!!!!!!!!!$4'7X.!,$#1$;],".$!!!!!!!!   G !!!!!!!!!!)<'8V+8V*(9&!!!!!!!!  G    !!!!!!!!!!!"!!!!!!!!!!     !!!!!!!!!!!!!!!!!!!!    . !!!!!!!!!!!!!!!!!!  .   -  !!!!!!!!!!!!!!   -     !!!!!!!!!!       G  !!!!  G     ;      ;    " 9 F F 9 " ??(0` $        3 ] ] 3     :   :   J !!!!!!!!  J   0  !!!!!!!!!!!!!!  0   f !!!!!!!!!!!!!!!!!!!! f    !!!!!!!!!!!!!!!!!!!!!!     !!!!!!!!!!!!!!!!!!!!!!!!!!     !!!!!!!!!!!!!!!!!!!!!!!!!!!!    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    f !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! f  1 !!!!!!!!!!!!!!!!!  !!!!!!!!!!!!!!! 1    !!!!!!!!!!!!!!! #% 5.!7/'&!!!!!!!!!!!!!!   J !    !!!!!!!!!!!$C6:ZCfDc>X*M9"!!!!!!!!!!!!! J   "!6/)P<*T?#?4#% !!!!!!! ";2@f>`-[B+T>;RE])J7 !!!!!!!!!!!!!  : ('3jHCbFkFnCm7Y 6/ !!!!   3uQ@f!7/  ('=P>O#$!!!!!!!!!!!!! :  !#7pIHd>X/aE-]C9YDp;`.+ !#%2-%G8.cGAg6{S!!! /Z>EV.) !!!!!!!!!!!!    (E4G]<P,)  #%2pNEp1mM#>4+YB3uQ:_@jDnDlEk9V #!! 3cBCS+(!!!!!!!!!!!!!!  3 5eBH\(F5 !! 2-AeDlDlEpDn@f8X.aF$@40eGDd,U="$ #&A2DU8lD"!!!!!!!!!!!!!! 3 ]  8nEGX"6- !!!&&>]Ei:X/eG%F7.*#  ''8zPE`=R<}NFX?N!1*!!!!!!!!!!!!!!!  ]   3_>IX+L6 !! "8/Db;V%&   !!!!&&-T,(!!!!!!!!!!!!!!!!!   !%;.GSAN#8-"!-)9yNGd-W> !!!!!!!! 7lE9rG!!!!!!!!!!!!!!!!!!!   !"2[;IUER9pF7lEATI_9vL&&!!!!!!!!!!5eA;tG"!!!!!!!!!!!!!!!!!!  !!!#-P7ALHUHWCS3bA('!!!!!!!!!! 3_==wG #!!!!!!!!!!!!!!!!!! !!!!',$9.+(!!!!!!!!!!!! 1X9?yG!#!!!!!!!!!!!!!!!!!!  !!!!!  !!!!!!!!!!!!! /Q6A{E#$!!!!!!!!!!!!!!!!!!   !!!!!!!!!!!!!!!!!!!! -K3C|D&%!!!!!!!!!! )#0F&4L&'6#!!!!  !!!!!!!!!!!!!!!!!!!! *D/D|B'%!!!!!!!!!"-$?b*9V(5N&Bc&0D#!!!  ] !!!!!!!!!!!!!!!!!!!%$4W5HB-G.##!!!!!!!!6Q(3L'!!%2"Bb$ )"!  ] 3 !!!!!!!!!!!!!!!!!!!/'?n;Dx>?m:Ex;=g5*%!!!"'#$2$,?&Bf*&4$!!!!@_$%1"! 3  !!!!!!!!!!!!!!!!! ";e7)J|5Cm1;]-1I)&6%'#!!'";X%:U$8Q$Aa$,<#!   : !!!!!!!!!!!!!!!!"0&Cq6*%!!!'8'Fr1#0%!!!!!!!#"*:#-?#"-"!! :  !!!!!!!!!!!!!!!!##@i2/H+!! "9X+>a-"!!!!!!!!!!!!!  J !!!!!!!!!!!!!!!!)<(Cm17U+/G(<^+Dm-&4%!!!!!!!!!!!!! J   !!!!!!!!!!!!!!!!%3%7U+=_,6R)#/$!!!!!!!!!!!!!    1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 1   f !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! f  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    !!!!!!!!!!!!!!!!!!!!!!!!!!!!     !!!!!!!!!!!!!!!!!!!!!!!!!!      !!!!!!!!!!!!!!!!!!!!!!    f !!!!!!!!!!!!!!!!!!!! f   0  !!!!!!!!!!!!!!  0   J !!!!!!!!  J   :   :     3 ] ] 3       ????PNG  IHDR\rfTIDATxyl}~~nzot7[hH&0aEP! 1E͌C#JP"4S IE hXޫr73+*3_U~իܼ!C 2dȐ!C 2dȐ!C 2d8Þ@;y+^9UJZaZ-$0e͉H^2HQU}QUD JUUƘHUPsunz*o[>1qɪU<UW!2%ĝ6PK,7k"\&¼nmay%9,ýZ>< <)Þkh+"2 ""jF G LMxq@ig'U20⇅X+_Ce#]u.E=ӎfO‡Q}%ҕ$!po ȗ1’N28 NMQ_P>%N@MD^^=׽NNw t8UppE$p;EM93AC32?d877#VU}NU?_PE#11&."c$ ^~ O5UZP$VjV]u?"DwNM[dG(ľת( U}y7818&uՎ[%ZĒ$6%#PD |Έ|qW֪CIb8'v CdD`E"|vZ8wfV{ZmeṎC.|d "cU~Jk*| @"k1^[>{8h8=̔q磉?MZYg,c(Je#.F v{%UەrF:5!Jy*V{^߈ tt<26C (-[j"GgkMU&PwQ.~;0F<sP{oCaIs9m+N=5QI_R{:\jTUF4Z"%b~uvrCO0Q.]S_Ό;VD}~1﹙@.[RտjUsaX={8>\sYk7T'GQu)s~?\O)U6vxOoWE='&+8Cw]r1O!g)F7uN}1Tտb ZDd.'D yWv;\?/TʥXkI'woCe*-Hmig 2{Tyo.c'<P)?nU~hqR);Þu Һ۫l<v}s-%c̏[; |s,o5!1閠z<gA? SWkaO}z)榧fZoDb>G)d;vPDEq/LJg8*& A? o#Er=il|g8b=lrKG)Dt72' L39tm?9*G&+N>:Ϭ*Dd#XhtC?9 EEf&(N14/g8ndlS&R :8ZuB.Uџ\*U?&m1TJYlc2Q" @?kэÚIDtZuU;l\D(YV_c 1Q*|V3ÉuF)B!lM~`쓏< M~FU?1l\ g8\2|\U?g|Q1HM岺N4\ڑZg0v9k2՗up!>QEX& ~{!sKU rH֫/éW|CKa=swϨHj؂B.N\Ǡj\.~{&*$* \r! 3 \*Bsv;ڷ9 I#R|]A?l&J)H"U4J[mcכ$;mƤ2VuHU4N>_sطo\XU R!_p/b<wwyl )9fR֔'H,4cJѭ5j+U2"5j"g1Zvk?o[wNU:C q(RއUu.MQx%w9_٢w!F p ێ3%E#S/ ,ar8i\z*C  9,N(2{#ypR~?I>3ysw$]oՌv#p.q; {Ngf0IUpx{YECBpeGĹTGM*t|@GA?< OTG#8xt))NVJT{N|ت CN?6G+Dt-|ꌋb{;o-U$ud$0f?db;uTg&(Ir 4Β2Rp{v/F ޮ_[%Frcn ]o#"$~d2[ʑܭaF;c E î{9UԨ˄\KHM]M]ܮDtJ҈IJ9&.D$CH%@X1W&ȵ/H7=r>a -( 9Oz{LOMq2a\@vx [ (T.ӿtM7i|h ƀ 4$6*:Fg"zd'T -wa:PJ6H 3\/Z_LrP:(g.=4}:`oU*뫨a}یH+Ɲ-"c;189:΢w{/B;ړkIf&(Io|@eA|/;B?}h;U:#s%3=AZ1zo0"(:-J{V뾵=)Ҏ*:N011Amޤ5dUnDH xz]8'J9YKU?юCqp̬Ӊ;xY}*TReE4yp*y⫫B=;1\0rQտ~}kԛ'Q11KL!ulBrA덥=b߹hhs));B{8:b~l>y׸oP¥ac903`d2o$h}"DKu["ew@;c 9\Z%5l?`(8w*=?Ќo_M,UOkpgdQA;G{#Q(.P5CqK>c>Z8!^nhУ!3Cv 1#RU}Ҫ:=Q)tZ{m&Pp>v2wl~@{pcS𐓐h11-^{"`|1xHT10\"s(AZUe5IejSYj(Ϋ8yu\HΖlX;r}<<;Ct t'!$6J(!IggЩ<ꚍڬw~WǠEU0&pD$ećH9 >'^JU'<,(h;A a\G;8'~tp ΅2΅2$یkmbx&'gjO~+64z;C7[" l2F|5WUNϻc8?7TO["FMs{[ŝ|Zk &b>]1@gWRpJ>΅2~h$+ z %Ms/3iT+Й!t*jA9\4N}䥫$]}h*sz~aqG;&zuՏ \'s2jLl,G N#8S$Zk/ 7S`@a6Н‚)PKmjJbd`A<.#3hǘ2`hFPCPk <)duҴޮ -a> |-?1x3aB *ޠ!3ʾl5N"As@ؘrzL~B8!VV$KMJ[B{Y95vo-]kÚ{`r3FU}q{[Fe %T9vH;2q(44P!CşȑX/V&pJpLkN+;5%|Dr+^}` L)UE ѴnA.uz u z7 bW0S6o;D vq瑙"B;m PNv ŽqT7K>KBxug/W?{aiZ.KgV^Q!z{WIh-i.)) z0`Лwc8&ƽ4;St!Z޷Aﻌz m\%rslLR(A8b`n'0 r6!ՃE(&~=ߎV\6{n&G"+Y E&/]O-5γNܫ%4H L)8ޗ)wNw VUL)Yh'h]n6BVrM LH^A|g}Ɩyܼl(h<4](EJ`LPW{mR.b7FG6Hr+AÄn{l#O4ʯFoV 竽<UEێҢ$7IW`= ' /]MBj6Iu 9.LBXibPmwJ'"J o-X=I hc_̖{ȅ wt u0Fv uxk6LNTfgqpLFG"4|s“ݚvuG(?}SpY{qp݇P'QzYwC2r0͘Ʒ`!$hHRo* #=LO5wL/>++  *I;"iRj `*D3 ^jU\-ns]L\<~&N1L HH*sCZksmvle}Dh-4X<3VTL_0K:[U66LRwHx)2Jw=Ah_]w&IFIjĬ6[|L)Hy p&9q/v.ɽlYm"ŀ(N/\%üMOyv#cF-p~o 1lo!?m6cf65*N> @h Ivh h %i4rF9oj f"BP!!h.n74ނP$!cpc xMO^Qtw=d0To#L~1 /Bg7d9PUҧb|/\}fR3808N(J3tEt+Tw 8&!\J;{g[`UU/}hbY<38z t-zl 6T~,\e7>~'$QBRk! U du<:\V{.Y+@i`K#8P~.JK]v#gsd`uIHo-PN#$_?0c#I}t*;[BGfCp֛̌ 3̰5Р wI iЩB҈i]]ԁcmН**. 3  xץںgvgΟ1wƞh?]';4cV7W(\a}6bQaBڦuJUwibvz I(BM# sEL'aK(Rd~kj wgo0"3c'Kzy3x@Gܥ^9ϞCaW۬cBhI-՗s\6Z1R:+B%4I=`.Nyo5Ut>cڇ]VSWx rK"YqG'q&RZ/fC1-X;4nu8߽Jo;p'WW5^|xvcn:fT dGvC4#O$-3 HS9hh_]AqsL&شroiyl l98"9SE>m %}od&pGGbЪUC_'3[<]hdAB k%wh\ 㾽B|m%- %Ѱ-˓ȃhiP^Gnv'-X(YTV,6NyF4Ⱥ,t M0%uw:NDi}k|<8* Eγ̢뭴+NywC'r[j".7_# z,NudQ W("8p jwW Hhx*WP'W3iEN4&ɋWIV_c6{ RÎ1fZe8Y'q=6'5Wnغ^ ]{_ҧ2me8N[$ ;)e7{ 2/Bi@z/c8-hͯ]_=uʧ#(vo,vOѩ'@Q|ykGԤ ËC/h2Il{KkK# I(o,ߩ]y` ʃUM$[5ⷖR$ j8;5- 0$Ρ:7l,1ۄc&m̛8S2OzN%1.Iꩡ.)sQ瀝*%Df#` rzz zk1v~h~=9W6%Ѥk5F8)IUJ.$c@K:44# /WK> Ī'溜F891 P>i' b6zogAS8#Ŏ,WYe z!! 8a.t:m];m](|Б5 " mM(4rz> _ۑO1l d‰qR ˆbwX:B3®67B';tBN7]U;ph*yG2GLP؎eX-Ǩn f5glT |4QzLk%7bldG Onǯx8~GMȠ޲9tx=9Û*۞ &Xe @U)_,sc0&ţ˖!i$TX:՛u6IhӍQ:W`2S &ݡ1.iqŅS#F@6nN{q\:rY;<# &bʎ[+xy;?mc]U/LΝY^% >d9W%RWW(sμwlё64၏ϱ~Nu~}o=HlVڑ sٍLl۹J8Ք"-|qO%V[sU:_&߫_>K:hTxasgx\;[ӭ- f8#,Ÿ@5 KvL}fn-hnƿ]7"3/}wW,}ڹ ]MB{WG*" Vӳ ҭY#Q29Na|EK5駦OU~1BN7oY1Bckҷ7M󊆋 \ԞBu v6d8)K"xX@{-a-]kT ZԤ|WW3yf  >K_!jZQadFRq92Hc+е[ 4R+}׫w&[/E<зs#Nso.Q{ ʫ0xn׶smyw~-Jnm]/+;*bp@In>J<ywsmJT.Wc$C"Bnp="7oR۪/x+ ـst|}SۼPHBlmk ־eCr0ayQm ~%ylwCV16V)=k׻"p5|suO=(|ʕ凊g2w7GH;2@h;~+?CuYUo!0o6iRX7pჳ]!tX%BkCo&.((ze'-mvHBO7 vɠ)!ӏI%q/D8v5d% i@_`JJb39 sy֮gۀ=Bţ*vϳm0Ƽ38&%V^_g]})2xsƗV}•O O#Xx7W0Z#CQ (RR8vNi2l@q>" {v)tn[֨nv%"NVv H]ϥ2t0ƘW{mRT2$! uVBЄOm*wYSn/6>HT-7z&ȽCn§|6`Bŀܤ7ӳmQ:WP{}{0!Ȳ:6koT)?PHc@0=ãдݹg*̼,|gkuZ6<*sy™w(̺fnU ő-z1 EDlbi[Zk!oI%ŒO\ʥsinN 㙴>/G0}__(B.ZJf胪Ҏwz@1Vm4- qb\rwx/#"+^μL\ i.mC~ڣ8瓟vqC_DMg_FD p5}eyO?aDrRcrAţ43x?6eK^m_xy7Q?8RlhD39ܼFD_ @T{[ CEs î2FK"갱vhc˵?ͭӂ}p hԟnWy5U foyZёh FLsAL0y~P}sZng}Z yՈ|i7Uk ddR:[H o-0 /s1[ aVl!$[_&MۖVVu{`<*k*&&-ы@?O4OxE#;Ʈ2FwHlA;Ɨ[߿Mo-`ôepaH l#$柬¿|@e4!hC{3TyC}@f07$x8cjK25+YvM,"/  lB/۟n-Blg*Cz6Bv7>}o~fV#Gaͥh Cg{TU)sC33"PդtN$#/ðknGAIx۳16,FR >^4mj^1PGز-Qr+os4$?"gsL=ߒܽ¬ {C ^#š!mr֯Վ|hB?Uk/1]nSن/]:[k^dž=aB[W!ߍI]g.\;ƫ:nwqQb`RlMr}"\|%hZEێ1N/ha5 < tv5dKh-Exih>U7f:!qKYڗWy֗iv޼xDzLi6`A-񄩇 h,ϷݱZVU \xv:t p .l#oꟽR)e9K0Y.4]lyg|rXyO:CJ*jLc1L l^oR"E)'0u23.Sm\^ʱ Pʛ~[4UEGUsz zUػkyQ=`HeZOq'֫o5c9f֩XUvx vztbspK4V%-q+! -6]yc H/AsCK_r[kn7;i4/zT.8If(}@Q*KhO4Zmj1rD˥Glsr -`$z>?pN:{E \ֲZm-c~Z?q(0R+ ?cq  }6,!^ sOvS㎾ûn0PɇׁPv:+n|N5|vVk^ڋk{h\௩*m!ao!a3az y 3ކ^}VS{Ȱ +oM>!9Hhj+Z{Z,nYkkX7` hU#lRNh#±eLv7qrKKǷ G?jƞ@Nr?P-n;. CڵְP:Fa6EM:N|иƗL8QY1=Za \,L}cکQ 4YhW[y nX7B$5ӡvz=.Ǎ=Za jwTGqX"A?jR&F*"C$ vNNnt274[8E#ݯkO(:_SտƦVb@zdZ@Ӌ05[Ƙ_\_9w}>q~GD>3lLU7c fpam*g\u`4Vr[&ipy!4l1o׮a4_f'u̐$G1Wky9MacVEbNk7[T?v1}Z P<-.{^fmp fkt/c~~ZAgg(F~ h!0s f8ٸs_xvvM>wW(rVw;&u YP(N6ƪ:/ݸ}yPs:0hV.WJX|/+d!jE221ZA@ ^!BZTS`o$F#{51XvP*_V6' "d8hBqjՎwp=@Վ vL$8ue2 Za4ߏ1Ng84ja5 aq3[DqBU6wkF˪W-uU5%j f8VKV5ׇǡוbkmQ%XUkSȌk5D}jj@ղ|kzxϰckg U "u8:a;^RCÎIՌ2]hGGezaz. <vL$(NFV{t8|7׫|82; x d8"m#gk|qFoສ%zƕ26#]ǘ_?w݌#Gggg^mQ]U? @6;SʧתÞIX֘(aZU#ژGqfp8ㅿf n]8o$4T,hUU}$ V/d8 t]} ~}oG (_VSo$idBixWyZs4@J| ~@XYpA~|:ڑ/qu BULGN u ΰj}lx/{~ @ T5PU%bR3 ZaDm|b1?uJBv\.b.uCTen hԛ)5FNQ6 ñ"HSWľ!FD DqU͌vmǘ/󟾻|$]}phj;^7H ul$ıu2@!:ixj+仧8E;/O0"Ba#"50ijct.DƘybwcM&2<ňf'n l%Ȱv]n"/Q-=@J\D"N8x -AQg}UqQ_HTU c֦^Ul 2m44lZՏW1__9| 'j \ZYǞƘ/#ufg8aZc;*1?>ܿ8N>.}ڿP&|9?p$l4!"ǘnZys-fðZ, 0a?8!DqL-8aPUa&D^;~s_=Kv;SOEal{l'0H Dq ^c}cG׮^;SMVSM~Fms:ވ>ϼqbiCp;m1DkhDˤH-HY@w_翷ȿ5\.>v{8h v؜x!NTGok0JPc2 V;h mebWOͪߏSON Ib?cc>e6CBXaD+ Im'Y1]]@ykӪv_[,hsˆ0Uc"?5jm( {\pnnVSڟU՟fZ\9U8F0`QD>mB. ;zIFRO1&`\!]|/dAE'0h {}XuWNO7Ȟ1q|Ī0׋x}SGJZ9bQ6j&"`D:/wzӂy&+$%wzc {.^Ѕ*$6M(N7"9#<:{;`zGI~U~JxI+ NKѪV0N{kw5W[|VD8/-G#LM8Q?VR'T F*DҜu\q0'*6D,qvsڅzE," -u_]ZY۱d=eKghj@42s4HLOC8.DUqb¬IMvtaUD᷌?*7,dV]x F G D)"_6ƼL?xdp035qrƪէ; Tˤ^= bRu!:wOZ㈌ '0'%T)IaU=OZ)n""+".,f~# 榧(KV*At W!2%ҶpCjup1]aވY\ 1@F|!n/xqT)jI)k,"6'"y EUk$"UjVTu""5jMOE~~ 2dȐ!C 2dȐ!C 2dȐ!C 2lgGwIENDB`freelan-2.0/artwork/icons/freelan_logo_backgroundless.ico000066400000000000000000000672241252300335000240150ustar00rootroot00000000000000 hV   F00 % )D(  ElElFiGeGfGeGbFi#Eo&CtDrCtEnLFhrH`4GeI[HaH_@GeEoDp]Dq?EokEmGb,I\pJWIYH]IYpIZ7Fj)FkEodEo=GeiH]IYFI]IXJVJU:IWH]GbDH`IZIZIXfIWIYJRKPJVIYI\I[JOJOKN^KLKDPYLy+Mx( Mt"Mv%KCKDKD)KCL='L}1Lz-)Ly+WMv&VMu%Mu%L=L<L>ZL=4L6}L~2IL{-2Mw'IMu$LMu%Mu%L:LRL5AL|0[L|0DL:Mw(Mu%Mu%Mu$Mu%L}1L}1L|/L{.L{.???1?(0 EpEoDpDtDtDqDsEnKFiGdTH^H`GcGbGfnElDpyDsDrCtEnDpBEoFiIHaH]QH^IYI[BzH_yGcFkMEoDpDp;DqdDpEnElgGdI\TI[yI\IXIXIW IZH]7GbFk"ElEnEoEoVFkOGeH_oIZIY?IYIXJVJTJWIXlIZ GbWGeFiSGe-Ha6I\IZ?ISIWJRJUJT1JVIYH]H`AH^GcIWIW JVJUJUKNI\JTJW-IYJ\IXJQJQJPKOKOLz,Lz-Ly*Lx)Lx)KKKKKIKH!KHL{-5Lz,BLy*uMv&WMt$Mu%KCKBKCFKCL?zL:L}2 L|0Lz-9Ly+zLy+Mu%lMu%&Mu%L?L?L@KBL:^L6L~2pL|0^Lz-DMw(jMu%TMu%qMu%Mu%L:L:!L8xL{/ L}1OL~2uL~2 L{/Mv&Mv%Mu%4Mu%Mu%Mu$L6L9L4SL}1L|/{L|/L|/L|0L|0L|/L{.L|/Ls" G( @ DqDsEn4FjnGfWGbGdHaGgFjGgFk@EnEDq@՛DtDrEoDpREnFjGeH`I\H]G_GcGa/GeFiEnDqDrDDqCuIQCtDq EoEn\FjGbH^I[NI\I\IZ H^GbFg*Em"EoEpDp@DqUDqDqEoElFj:FjH^I[IZ^IZIYIY*I[H]?~?????(0` $EpEhEnFk.Fh2GfGaGdDq@yEpDEnFkFhGeGb^I^H`GgGfFi0Fk]EncDp=Dr DqD{DrDqDq6EpEmFkrGghGdH`H^ZG`I]GcGbGdGgFjEmEpDrDs-DrDuDqBsDpEoEm0EnHaGbH_I]IZI[H^H] H`GcGfFi~EltEnDpDqDr DrDuDvDs Dr%DqJDp|EnEmFkEmG_I\I]{I[IY$IZI[I]I\PH^HaGdFbEnEnEnEoDpDpMu%Mu%$Mu%KCKCKC-KCKCKAL?L=L;#L<L4L5L}2 L|0L{.:Lz,_Ly+Ly*ELy*Mu$Mu$Mu%Mu%;Mu%KAKA KAKAKA#L@ L=0L:L8L5FL4mL~2L}1L|/L{.Lz,qLx)Mw(Mv$Mv#Mu$KMu%Mu%Mu%L>L>,L>L>7L>L7L6L7WL6L4L~3L}1wL|0DL{/Mz-Mw(Mw(!Mv&Mu%Mu$Mu%Mu$]Mu,Mu$L;L;2L;L:$L:L4L4IL~3L~35L}1L3Ly.Nu"Mu%Mu%Mu%UMu$eMu%1Mu$Mu$L9L9L7L6oLz.L}2L}1 L}1L}1L}0 L}1L6L~4L5QL4L}2L|0rL|0L|/L|/BL|/L|/L~3L4L}2=L}0L|/L{.L{.4My+Lz-L{-L{-Lz-My+Lz,???CPNG  IHDR\rf)IDATxwTg5 (bh]e 4)bT 5 ł.4D16TbAnAaa=?{3"egf=üy3޻ww9 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaH/tHD}پ#M08@{#;ʎ Mj` /[&ml90]TTh Q I%b2y|xlIMbl ]6(:3bG¾j`90U5| Oei&b qU} i0"#5;x-V)oFB$`V :d%_eƑ0;^CU}L{H|[ k  t莯~Wd/c@s5QmRu'(QX|Z)tFl"(xlnaL8]LvE`+3W[xŜJkB(5I-]>0j@k{)R*Cu?n1*3p*-eD/э9yL(%-\d_Jn\m v 6?z/SzHM$`? Hp ~חV*<\|s?hlwS9ﮋ6LKrK\[lK5X/!= >1Rc 7,B7I Tpkז.-tJ`0b<pZ+{ob_Jn  +:e?w"|OvԴvɘ1>L=5"<5ߥE-KH@!+:rN x.]}*T`!"M+>4}c$c awv }} /BGh~(`9m?#紞YFc`/ (̀lwP](*!QXh[Uғ)CP7KҴ@9P`@Fh lF7W p lkjA{D{oAaٸi hK\pƎ[DbS }T:(ngUڌ)لYSro0xv a} Lfи2h}䘨xe~>>Ѐׁ|Z)G+h;5:~0 aDeK6jE&1k+pUz"hgb8ok781*R%- ::"3UV-}qdCIjS-;(bݶ r q{+=a-O <%@®( DX`1)*+8zˋ(܌2G.J@94"  *u_uQ|%K2ٞ a JکOmP$@?IU]Q c#˕|Z\<&}}./n \'يs_FyWuB#qGs6MoC>_nƦm08.3|q]4_AuwSMNH&z UdDU\2nBQy\zK0J&}{ Y6$=Y){^\#o*}_Ғ>E$ ~5J5LY γdEQ,GYX|ȏK6s}// <b3RtqaDq[`zP-p5*7.婬;L H`*m!c~A3=hkI(k)!0CjBv*]Őrq :-E#`Œ~Y!tY Yzs /F7.W$DXeKުas0wS  #=-=D\s%޹RW)}F,_QQvRh:/)V.Rx TPᇷoH2t=g7Ӹt:៽aDqK*eY0S^ +JRXr ύٙyG+ nTe9ե*C(MUn We_®v۱y#VP(NAP#)8O=!r/߻y0/ /xK%Qgs~/ݕCu#(c=wȱ6pOߡեnN&nٲ]YQ:)tY;oR[!C-CЅ|*'[Jx#G7.T[6k4l,rny8E] %5*sGmQE kUKSGt*Zqw:x>rAsL$;%gMuY)%Ul*rn z7$ i_ 4"Z)EI&8\UtUissU/U)+@Ai"X%{7kz+<9<41X"P# k@puqA;UUagQeQke~7 \!Ǜ^i3nW;J>WO8xF_,;T8W/[ZsXT@;\AN0D֋4\ҷAPdS s+ Goť^J;7x)&zQ/^Q~\ǖ(nT!A~["m-P:t|fV` k"{PYxA`m]z,ৠ7L|\81Eb0Ѐ1bg!!B '0Ex1"w"LNnzJv77(y1 ]:.ےcytj6hT}E(pk5N,(*e";X] {U f-v'ut)#Ôx>`|ϙĚSDhgr7y1A|#hۀ .NnYaE5|nFc bJn{.0\ӷ{|l_o#|꫸O0⊷o,٢FŝQBi>x9M7Gh(cKƖT"2*Σm6\i+PYhEL1[V!jArOv57n8 ΣwcvY85_ӗ/ɪR5`|qEsLǖ~/蝈!%Hs@'v=/F}./>_\vܸP)*͛ -п&f%U5<- Dp~QUFF#*ꉠgȞHJg;?W!)#c}S|ǖ;qN ΖR'@..eFEus |7j0S& Q.]6lLa'-W9-+[[4_ۨtL`En-c',[ " v  +y) b !B`*xlɷhD?\p؋8^/hǕ,v1`D5 Y2t +N &\)c[kw[e^t\WnO*` Hq tjҸ`}fpe080Ti B$jХ,PuUb͛FA0` BjEܭm60`,S=\G?Qy6Hkwn*n4 F"4KRQr ଢ-^W!ۘ0bU W99 4{$Uka =%NM$fX&,.Y)n)1#0` n?=EP-iO` nqRl@g0.Q?"FS9)ʁ B[۫ܬ٪Sm"BKBS]R'UT>v:,.M\ xgW [~^X RP[O Ž(\ [tjV +PqCRfT-P"V3YK5+{BQ׵voD@=p@YNY\;@eh FPp60T`/-IZՕ$%ص @x»"=/M0h`ՀYHzO(:x#n/$V %sAj_IMc^יQzSa08^Pjq%e,8xDcW}5DE}dqZ#dMh6]*=/~;CM!R"Vewi)p-[}m@ {m P.{BQ kQR)M~ v\k| |8XYS N0`JݳF!"BsI#j@K@{ 4I9Ə:@!8l"Nc$yX{ڢKF'=XU. I|[܄o | |h$n{ m:F[˳5y TLWdYJF@^GW LDI'+ "!eԾzL]#%K/)`fogJL TyJA2zO(jSO=#$eZV)r9>>?S?;s@p@ `_oޢLOGh@ VaAs $5&!\ xdh * ,_?m`[@^h_&T6.pfl"/4Jʁ*Q'!nyL>{th٪-9ԁUS L\˿ogIu)X=%# @_p{N#,AвRw3&(|L,xAn0d-2GDS&T kE`vpꄢ'l~l_?:lA:eryF?iM8tQ4%+܋W $T ˙oއWUt`[a3{kk7'bs*S'勛ϟx(Sg Š